ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAxMDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZjQ1NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c2MtdWkuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTAyNjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwZmQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIEphbiAzMCAxMDozNjowMiBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1M2VkZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjQxOjIwIEVTVCAyMDA2Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MmE1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTA1LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5hbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuc2VsZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnNlcnZlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuZXhwbG9yZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQ7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb247YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMS4xLjApIiwKLSBvcmcud3NkbDRqO2J1bmRsZS12ZXJzaW9uPSJbMS40LjAsMS41LjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCwzLjUuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjhjYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfYXNzZW1ibGUuanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY2xpZW50X2Fzc2VtYmxlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3NjY3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfYXNzZW1ibGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY2xpZW50X2RlcGxveS5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfZGVwbG95LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmYzg2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfZGVwbG95LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2NsaWVudF9kZXZlbG9wLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2NsaWVudF9kZXZlbG9wLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1OWUyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfZGV2ZWxvcC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfaW5zdGFsbC5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfaW5zdGFsbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjI1MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY2xpZW50X2luc3RhbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY2xpZW50X25vbmUuanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY2xpZW50X25vbmUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWM4ZmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2NsaWVudF9ub25lLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2NsaWVudF9ydW4uanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY2xpZW50X3J1bi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2M2FjNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY2xpZW50X3J1bi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfdGVzdC5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jbGllbnRfdGVzdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Yjk0NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY2xpZW50X3Rlc3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2NvbmZpZ19oYW5kbGVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYTNhMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb25maWd1cmVfaGFuZGxlcnMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2NvbmZpZ3VyZV9oYW5kbGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTNjODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2NvbmZpZ3VyZV9oYW5kbGVycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVkX3NhbXBsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVkX3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmE1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2dlbmVyYXRlZF9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlMDVmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvZHRvb2wvY29uZmlndXJlX2hhbmRsZXJzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvZHRvb2wvY29uZmlndXJlX2hhbmRsZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2MGRkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2NvbmZpZ3VyZV9oYW5kbGVycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2dlbmVyYXRlZF9zYW1wbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9kdG9vbC9nZW5lcmF0ZWRfc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwZDM5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2dlbmVyYXRlZF9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YjdhMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2dlbl9zYW1wbGVfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2dlbl9zYW1wbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3YWQ1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9nZW5fc2FtcGxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvaW1wb3J0X3dzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxZmU4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvaW1wb3J0X3dzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwNjFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3JlZ2lzdHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3JlZ2lzdHJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0M2NhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9yZWdpc3RyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zY2FsZTBfYmdyb3VuZC5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zY2FsZTBfYmdyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTVjYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2NhbGUwX2Jncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2NhbGUxX2Jncm91bmQuanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2NhbGUxX2Jncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjEyMDdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NjYWxlMV9iZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NjYWxlMl9iZ3JvdW5kLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NjYWxlMl9iZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0MWZkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zY2FsZTJfYmdyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zY2FsZTNfYmdyb3VuZC5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zY2FsZTNfYmdyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDRlMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2NhbGUzX2Jncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2NhbGU0X2Jncm91bmQuanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2NhbGU0X2Jncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmJiZDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NjYWxlNF9iZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NjYWxlNV9iZ3JvdW5kLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NjYWxlNV9iZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4MDZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zY2FsZTVfYmdyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zY2FsZTZfYmdyb3VuZC5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zY2FsZTZfYmdyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOGJjZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2NhbGU2X2Jncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9leGlzdGluZ19zZXJ2ZXJfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NlcnZlcnMvZXhpc3Rpbmdfc2VydmVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjZjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9leGlzdGluZ19zZXJ2ZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NlcnZlcnMvc2VydmVyc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9zZXJ2ZXJzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjZjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9zZXJ2ZXJzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2h0bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9odG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlN2RiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2h0bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd2l6X2Jhbm5lcl93c2lsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaW1wb3J0X3dpel9iYW5uZXJfd3NpbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjM0YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd2l6X2Jhbm5lcl93c2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaW1wb3J0X3dzaWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd3NpbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGE5NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd3NpbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL3dzZGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2RsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2lsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvd3NpbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTkxNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZTAyYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDYwNTE1ICAgMTQxNTM2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIENvbnN1bXB0aW9uIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLUZFQVRVUkVfREVTQ1JJUFRJT049V2ViIHNlcnZpY2VzCi1XRUJTRVJWSUNFU19DQVRFR09SWT1XZWIgc2VydmljZXMKLQotWFBfd3NJbXBsPVdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucwotWFBfd3NDbGllbnRJbXBsPVdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMKLVhQX3J1bnRpbWVzPVdlYiBzZXJ2aWNlIHJ1bnRpbWVzCi1YUF9zZXJ2aWNlUnVudGltZXM9Q29tYmluYXRpb24gb2YgYSBXZWIgc2VydmljZSBydW5pbWUsIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZSwgYW5kIHJlcXVpcmVkIGZhY2V0cwotWFBfY2xpZW50UnVudGltZXM9Q29tYmluYXRpb24gb2YgYSBXZWIgc2VydmljZSBydW5pbWUsIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlLCBhbmQgcmVxdWlyZWQgZmFjZXRzCi1YUF90ZXN0ZXI9V2ViIHNlcnZpY2UgdGVzdCBmYWNpbGl0aWVzCi0KLVhQX1BVQkxJQ19VRERJX1JFR0lTVFJZX1RZUEVTPVB1YmxpYyBVRERJIFJlZ2lzdHJ5IFR5cGVzCi1YUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVM9UHJpdmF0ZSBVRERJIFJlZ2lzdHJ5IFR5cGVzCi1YUF9XRUJfU0VSVklDRV9DTElFTlRfVFlQRVM9V2ViIFNlcnZpY2UgQ2xpZW50IFR5cGVzCi1YUF9XRUJfU0VSVklDRV9URVNUPVdlYiBTZXJ2aWNlIFRlc3QKLVhQX1dFQl9TRVJWSUNFX1NFUlZFUl9SVU5USU1FX1RZUEVTPVdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIFR5cGVzCi1YUF9XRUJfU0VSVklDRV9DTElFTlRfUFJPSkVDVF9UWVBFPWNsaWVudFByb2plY3RUeXBlCi1YUF9PQkpFQ1RfU0VMRUNUSU9OX1dJREdFVD1vYmplY3RTZWxlY3Rpb25XaWRnZXQKLQotIwotIyBXaXphcmRzLgotIwotV0laQVJEX1RJVExFX1dTQz1XZWIgU2VydmljZSBDbGllbnQKLQotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19DTElFTlQ9V2ViIFNlcnZpY2UgQ2xpZW50Ci1QTFVHSU5fSU1QT1JUX1dJWkFSRF9OQU1FX1dTPVdlYiBTZXJ2aWNlCi1QTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX0NMSUVOVD1BY2Nlc3MgYW4gZXhpc3RpbmcgWE1MIHdlYiBzZXJ2aWNlCi1QTFVHSU5fSU1QT1JUX1dJWkFSRF9ERVNDX1dTPUEgd2l6YXJkIGZvciBpbXBvcnRpbmcgYSB3ZWIgc2VydmljZQotSU1QT1JUX1dJWkFSRF9ERVNDX1dTSUw9SW1wb3J0IFdTREwgcmVmZXJlbmNlcyB0byBhIFdTSUwgZG9jdW1lbnQKLQotIwotIyBXZWIgU2FtcGxlcyBJRHMKLSMKLVNBTVBMRV9UWVBFX1dFQlNFUlZJQ0VTX0lEPVdlYiBzZXJ2aWNlIHNhbXBsZSBKU1BzCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZPUdlbmVyYXRlIENsaWVudAotQUNUSU9OX0dFTl9TQU1QTEU9R2VuZXJhdGUgU2FtcGxlIEpTUHMKLQotIwotIyBEaWFsb2dzCi0jCi1DSEVDS0JPWF9TSE9XX0dFTkVSQVRFX0pBVkFfUFJPWFlfRElBTE9HPUhpZGUgJkdlbmVyYXRlIEphdmEgYmVhbiBQcm94eSBEaWFsb2cKLUNIRUNLQk9YX1NIT1dfUFJPWFkyU0FNUExFX0RJQUxPRz1IaWRlICZQcm94eSBUbyBTYW1wbGUgR2VuZXJhdGlvbiBEaWFsb2cKLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9XU0RMMlBST1hZPUhpZGUgdGhlIGRpYWxvZyBmb3IgZ2VuZXJhdGluZyB0aGUgSmF2YSBiZWFuIHByb3h5IGFjdGlvbi4KLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9QUk9YWTJTQU1QTEU9SGlkZSB0aGUgZGlhbG9nIGZvciBnZW5lcmF0aW5nIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gYWN0aW9uLgotCi0jCi0jICAgICAgIFdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIENhdGVnb3JpZXMKLQotUFJFRkVSRU5DRV9DQVRFR09SWV9TRVJWRVJfUlVOVElNRT1TZXJ2ZXIgYW5kIFJ1bnRpbWUKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUFJPSkVDVF9UT1BPTE9HWT1Qcm9qZWN0IFRvcG9sb2d5Ci1QUkVGRVJFTkNFX0NBVEVHT1JZX1RFU1RfRkFDSUxJVFk9VGVzdCBGYWNpbGl0eSBEZWZhdWx0cwotUFJFRkVSRU5DRV9DQVRFR09SWV9ESUFMT0dTPVBvcHVwIERpYWxvZyBTZWxlY3Rpb24KLQotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1NRU5VX1JVTj0mUnVuCi0KLSMKLSMgV2ViU2VydmljZVRlc3RQYWdlCi0jCi1XU0VYUExPUkVSX0lEPVdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotCi0jCi0jIFdlYlNlcnZpY2VQdWJsaXNoUGFnZQotIwotVE9PTFRJUF9MQVVOQ0hfV1NfRVhQTE9SRVI9TGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIKLUNPTU1BTkRfTEFVTkNIX1dTX0VYUExPUkVSPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyCi0KLSMKLSMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotIwotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUD1TQVAgVURESSBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUF9URVNUPVNBUCBVRERJIFRlc3QgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9YTUVUSE9EUz1YTWV0aG9kcyBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX05UVENPTU09TlRUIENvbW11bmljYXRpb25zIFJlZ2lzdHJ5Ci0KLSMKLSMgV1NJTCBwcm94eQotIwotSU1QT1JUX1dJWkFSRF9OQU1FX1dTSUw9V1NJTAotUE9QVVBfR0VORVJBVEVfV1NJTD1HZW5lcmF0ZSBXU0lMCi0KLSMKLSMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgVHlwZQotIwotV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMPVNrZWxldG9uIEphdmEgYmVhbiBXZWIgU2VydmljZQotV0VCU0VSVklDRVRZUEVfTkFNRV9KQVZBPUphdmEgYmVhbiBXZWIgU2VydmljZQotCi0jCi0jIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlCi0jCi1KQVZBX1BST1hZPUphdmEgUHJveHkKLSMKLSMgQ2xpZW50IHByb2plY3QgdHlwZQotIwotTEFCRUxfQ0xJRU5UX1RZUEVfV0VCPVdlYgotTEFCRUxfQ0xJRU5UX1RZUEVfRUpCPUVKQgotTEFCRUxfQ0xJRU5UX1RZUEVfQVBQX0NMSUVOVD1BcHBsaWNhdGlvbiBDbGllbnQKLUxBQkVMX0NMSUVOVF9UWVBFX0NPTlRBSU5FUkxFU1M9SmF2YQotCi0jCi0jIEhhbmRsZXJzIENvbmZpZ3VyYXRpb24gd2l6YXJkIHBhZ2UKLSMKLVBPUFVQX0FERF9IQU5ETEVSUz1Db25maWd1cmUgSGFuZGxlcnMKLVBPUFVQX0NPTkZJR19DTElFTlRfSEFORExFUlM9Q29uZmlndXJlIENsaWVudCBIYW5kbGVycwotTEFCRUxfSEFORExFUlNfQ09ORklHPUNvbmZpZ3VyZSBIYW5kbGVycwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Y2U2YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICA8IS0tIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBsaWtlbHkgdG8gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJwdWJsaWNVRERJUmVnaXN0cnlUeXBlIgotICAgICAgbmFtZT0iJVhQX1BVQkxJQ19VRERJX1JFR0lTVFJZX1RZUEVTIi8+Ci0KLSAgIDwhLS0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIGxpa2VseSB0byBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9InByaXZhdGVVRERJUmVnaXN0cnlUeXBlIgotICAgICAgbmFtZT0iJVhQX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUyIvPgotCi0gICA8IS0tIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBsaWtlbHkgdG8gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJ3ZWJTZXJ2aWNlVGVzdCIKLSAgICAgIG5hbWU9IiVYUF9XRUJfU0VSVklDRV9URVNUIgotICAgICAgc2NoZW1hPSJzY2hlbWEvd2ViU2VydmljZVRlc3QuZXhzZCIvPgotCi0gICA8IS0tIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsLCB0aG91Z2ggbGlrZWx5IHRvIGJlIG1hZGUgcHVibGljIHdpdGggY2hhbmdlcyBpbiBhIGZ1dHVyZSByZWxlYXNlLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiCi0gICAgICBuYW1lPSIlWFBfT0JKRUNUX1NFTEVDVElPTl9XSURHRVQiCi0gICAgICBzY2hlbWE9InNjaGVtYS9vYmplY3RTZWxlY3Rpb25XaWRnZXQuZXhzZCIvPgotCi0gICA8IS0tIFVEREkgUmVnaXN0cnkgVHlwZXMgLS0+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVBfVEVTVCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdCI+Ci0gICAgICA8L3B1YmxpY1VERElSZWdpc3RyeVR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wdWJsaWNVRERJUmVnaXN0cnlUeXBlIj4KLSAgICAgIDxwdWJsaWNVRERJUmVnaXN0cnlUeXBlCi0gICAgICAgICAgICBuYW1lPSIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5U0FQIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlTQVAiPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9YTUVUSE9EUyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5WE1ldGhvZHMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzIj4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTlRUQ09NTSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbSI+Ci0gICAgICA8L3B1YmxpY1VERElSZWdpc3RyeVR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBUZXN0IEZhY2lsaXRpZXMgLS0+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZVRlc3QiPgotCi0gICAgICA8d2ViU2VydmljZVRlc3QKLSAgICAgICAgICAgIG1ldGhvZHNuZWVkZWQ9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlU0FNUExFX1RZUEVfV0VCU0VSVklDRVNfSUQiCi0gICAgICAgICAgICBqYXZhPSJ0cnVlIgotICAgICAgICAgICAgY29kZWdlbj0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlLldlYlNlcnZpY2VXU1NhbXBsZUV4ZWN1dGFibGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XZWJTZXJ2aWNlU2FtcGxlVGVzdCI+Ci0gICAgICA8L3dlYlNlcnZpY2VUZXN0PgotCi0gICAgICA8d2ViU2VydmljZVRlc3QKLSAgICAgICAgICAgIG1ldGhvZHNuZWVkZWQ9ImZhbHNlIgotICAgICAgICAgICAgbmFtZT0iJVdTRVhQTE9SRVJfSUQiCi0gICAgICAgICAgICBqYXZhPSJmYWxzZSIKLSAgICAgICAgICAgIGNvZGVnZW49ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuZXhwbG9yZXIuV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyLldlYlNlcnZpY2VFeHBsb3JlckV4ZWN1dGFibGUiPgotICAgICAgPC93ZWJTZXJ2aWNlVGVzdD4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gRHluYW1pYyBXaXphcmRzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19DTElFTlQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVQTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX0NMSUVOVAotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5DbGllbnRXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9nZW5fc2FtcGxlX3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5HZW5TYW1wbGVXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbnNhbXBsZXdpemFyZCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBIYW5kbGVyIGV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2NvbmZpZ19oYW5kbGVyX3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5Db25maWdTZXJ2aWNlSGFuZGxlcnNXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVMQUJFTF9IQU5ETEVSU19DT05GSUciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5zZXJ2aWNlIj4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2NvbmZpZ19oYW5kbGVyX3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5Db25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmciCi0gICAgICAgICAgICB0aXRsZT0iJUxBQkVMX0hBTkRMRVJTX0NPTkZJRyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmNsaWVudCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9jb25maWdfaGFuZGxlcl93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuQ29uZmlndXJlSGFuZGxlcnNXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVMQUJFTF9IQU5ETEVSU19DT05GSUciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycyI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4gIAotICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c2ltcG9ydC5jYXRlZ29yeSIKLSAgICAgICAgICAgICBuYW1lPSIlV0VCU0VSVklDRVNfQ0FURUdPUlkiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX0lNUE9SVF9XSVpBUkRfTkFNRV9XUyIKLSAgICAgICAgICAgIGljb249Imljb25zL2ltcG9ydF93cy5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzaW1wb3J0LmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzaW1wb3J0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVQTFVHSU5fSU1QT1JUX1dJWkFSRF9ERVNDX1dTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9pbXBvcnRfd3Nfd2l6LmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fSU1QT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuSW1wb3J0V1NXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c2ltcG9ydCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJUlNUE9SVF9XSVpBUkRfTkFNRV9XU0lMIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvd3NpbC9pbXBvcnRfd3NpbC5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzaW1wb3J0LmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzaWxpbXBvcnQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJUlNUE9SVF9XSVpBUkRfREVTQ19XU0lMCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy93c2lsL2ltcG9ydF93aXpfYmFubmVyX3dzaWwuZ2lmIgotICAgICAgICAgICAgbmFtZT0iJUlNUE9SVF9XSVpBUkRfTkFNRV9XU0lMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuSW1wb3J0V1NJTFdpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzaWxpbXBvcnQiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gUHJlZmVyZW5jZSBQYWdlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9TRVJWRVJfUlVOVElNRSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UiPiAgICAgICAgICAgIAotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfRElBTE9HUyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucHJlZmVyZW5jZXMuQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiPgotICAgICAgPC9wYWdlPgotCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfVEVTVF9GQUNJTElUWSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuVGVzdEZhY2lsaXR5RGVmYXVsdHNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuVGVzdEZhY2lsaXR5RGVmYXVsdHNQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9QUk9KRUNUX1RPUE9MT0dZIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5Qcm9qZWN0VG9wb2xvZ3lQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBNYWluIE1lbnUgQWN0aW9ucyAtLT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlQ09NTUFORF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVNRU5VX1JVTiIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5ydW4iPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJleHBsb3JlciI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQ09NTUFORF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9yZWdpc3RyeS5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5MYXVuY2hXU0VBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkucnVuL2V4cGxvcmVyIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uLkxhdW5jaFdTRUFjdGlvbiI+Ci0gICAgICAgIDwvYWN0aW9uPgotICAgICA8L2FjdGlvblNldD4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gIkRvbid0IFNob3cgTWUiIEV4dGVuc2lvbnMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUiPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIHNob3djaGVja2JveD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX0dFTkVSQVRFX0pBVkFfUFJPWFlfRElBTE9HIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1dTREwyUFJPWFkiCi0gICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuUFBBRDAwMDQiCi0gICAgICAgICAgICBhbHdheXNoaWRlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19QUk9YWTJTQU1QTEVfRElBTE9HIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1BST1hZMlNBTVBMRSIKLSAgICAgICAgICAgIGluZm9wb3A9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5QUEFEMDAwNSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBzaG93Y2hlY2tib3g9ImZhbHNlIgotICAgICAgICAgICAgYWx3YXlzaGlkZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vud3NpbCI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICAgICA8IS0tIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBzaG93Y2hlY2tib3g9ImZhbHNlIgotICAgICAgICAgICAgYWx3YXlzaGlkZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSAtLT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gUG9wdXBzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW53c2lsIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfR0VORVJBVEVfV1NJTCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzaWxpbXBvcnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2lsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5qYXZhIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbnNhbXBsZXdpemFyZCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5fU0FNUExFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VOX1NBTVBMRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vuc2FtcGxld2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vud3NpbCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0dFTkVSQVRFX1dTSUwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NpbGltcG9ydCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSJ3ZWJzZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuc2VydmljZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLnNlcnZpY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLQkJCTxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgbmFtZT0idHlwZSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJIYW5kbGVycyI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLnNlcnZpY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgICAgICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0id2Vic2VydmljZXNjbGllbnQueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQ09ORklHX0NMSUVOVF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iZWpiLWphci54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9DT05GSUdfQ0xJRU5UX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmNsaWVudCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0id2ViLnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0NPTkZJR19DTElFTlRfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuY2xpZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iYXBwbGljYXRpb24tY2xpZW50LnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0NPTkZJR19DTElFTlRfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuY2xpZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IAotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0NPTkZJR19DTElFTlRfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmNsaWVudCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAgIAotICAgICAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW53c2lsIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfR0VORVJBVEVfV1NJTCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c2lsaW1wb3J0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiCi0gICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9HRU5FUkFURV9XU0lMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzaWxpbXBvcnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIE9iamVjdCBTZWxlY3Rpb24gV2lkZ2V0cyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgPG9iamVjdFNlbGVjdGlvbldpZGdldAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkphdmFCZWFuU2VsZWN0aW9uTGF1bmNoYWJsZSIKLSAgICAgICAgICAgIGV4dGVybmFsX21vZGlmeT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICB0cmFuc2Zvcm1lcj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkphdmFCZWFuU2VsZWN0aW9uVHJhbnNmb3JtZXIiPgotICAgICAgPC9vYmplY3RTZWxlY3Rpb25XaWRnZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgPG9iamVjdFNlbGVjdGlvbldpZGdldAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5FSkJTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICBleHRlcm5hbF9tb2RpZnk9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5FSkJTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICB0cmFuc2Zvcm1lcj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvblRyYW5zZm9ybWVyIj4KLSAgICAgIDwvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkub2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ij4KLSAgICAgIDxvYmplY3RTZWxlY3Rpb25XaWRnZXQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIGV4dGVybmFsX21vZGlmeT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvblRyYW5zZm9ybWVyIj4KLSAgICAgIDwvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwsIHRob3VnaCBsaWtlbHkgdG8gYmUgbWFkZSBwdWJsaWMgd2l0aCBjaGFuZ2VzIGluIGEgZnV0dXJlIHJlbGVhc2UuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id3NJbXBsIiBuYW1lPSIlWFBfd3NJbXBsIi8+Ci0KLSAgIDwhLS0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwsIHRob3VnaCBsaWtlbHkgdG8gYmUgbWFkZSBwdWJsaWMgd2l0aCBjaGFuZ2VzIGluIGEgZnV0dXJlIHJlbGVhc2UuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id3NDbGllbnRJbXBsIiBuYW1lPSIlWFBfd3NDbGllbnRJbXBsIi8+Ci0KLSAgIDwhLS0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwsIHRob3VnaCBsaWtlbHkgdG8gYmUgbWFkZSBwdWJsaWMgd2l0aCBjaGFuZ2VzIGluIGEgZnV0dXJlIHJlbGVhc2UuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZXMiIG5hbWU9IiVYUF9ydW50aW1lcyIgLz4KLQotICAgPCEtLSBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCwgdGhvdWdoIGxpa2VseSB0byBiZSBtYWRlIHB1YmxpYyB3aXRoIGNoYW5nZXMgaW4gYSBmdXR1cmUgcmVsZWFzZS4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2aWNlUnVudGltZXMiIG5hbWU9IiVYUF9zZXJ2aWNlUnVudGltZXMiIC8+Ci0KLSAgIDwhLS0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwsIHRob3VnaCBsaWtlbHkgdG8gYmUgbWFkZSBwdWJsaWMgd2l0aCBjaGFuZ2VzIGluIGEgZnV0dXJlIHJlbGVhc2UuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY2xpZW50UnVudGltZXMiIG5hbWU9IiVYUF9jbGllbnRSdW50aW1lcyIgLz4KLQotICAgPCEtLSBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCwgdGhvdWdoIGxpa2VseSB0byBiZSBtYWRlIHB1YmxpYyB3aXRoIGNoYW5nZXMgaW4gYSBmdXR1cmUgcmVsZWFzZS4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0ZXN0ZXIiIG5hbWU9IiVYUF90ZXN0ZXIiLz4KLQotPCEtLSBUZXN0IEV4dGVuc2lvbnMgYmVnaW5uaW5nICAtLT4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnRlc3RlciI+Ci0gIDx0ZXN0ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XZWJTZXJ2aWNlU2FtcGxlVGVzdCIKLSAgICBsYWJlbD0iJVNBTVBMRV9UWVBFX1dFQlNFUlZJQ0VTX0lEIgotICAgIHRlc3RXU0RMPSJubyIKLSAgICB3c0NsaWVudEltcGxJZHM9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgIG1vZHVsZXR5cGVzPSJ3ZWJtb2R1bGUiCi0gICAgbWV0aG9kc25lZWRlZD0idHJ1ZSIKLSAgICBjb2RlR2VuZXJhdGVkPSJ0cnVlIgotICAgIHNlcnZlclJlcXVpcmVkPSJ0cnVlIgotICAgIGFsbG93Q2xpZW50UnVudGltZXNSZXN0cmljdGlvbj0idHJ1ZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC53c3NhbXBsZS5HU1RDV2ViU2VydmljZVRlc3RlciI+Ci0gIDwvdGVzdGVyPgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkudGVzdGVyIj4KLSAgPHRlc3RlcgotICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyLldlYlNlcnZpY2VFeHBsb3JlciIKLSAgICBsYWJlbD0iJVdTRVhQTE9SRVJfSUQiCi0gICAgdGVzdFdTREw9InllcyIKLSAgICB3c0NsaWVudEltcGxJZHM9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgIG1vZHVsZXR5cGVzPSJ3ZWJtb2R1bGUiCi0gICAgbWV0aG9kc25lZWRlZD0iZmFsc2UiCi0gICAgY29kZUdlbmVyYXRlZD0iZmFsc2UiCi0gICAgc2VydmVyUmVxdWlyZWQ9ImZhbHNlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyLldTRVdlYlNlcnZpY2VUZXN0ZXIiPgotICA8L3Rlc3Rlcj4KLTwvZXh0ZW5zaW9uPgotCi08IS0tIFRlc3QgRXh0ZW5zaW9ucyBlbmQgIC0tPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NJbXBsIj4KLSAgPHdlYlNlcnZpY2VJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVXRUJTRVJWSUNFVFlQRV9OQU1FX0pBVkEiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UgQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkphdmFCZWFuU2VsZWN0aW9uV2lkZ2V0Ij4KLSAgPC93ZWJTZXJ2aWNlSW1wbD4KLTwvZXh0ZW5zaW9uPiAgIAotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzQ2xpZW50SW1wbCI+Ci0gIDx3ZWJTZXJ2aWNlQ2xpZW50SW1wbAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVKQVZBX1BST1hZIj4KLSAgPC93ZWJTZXJ2aWNlQ2xpZW50SW1wbD4KLTwvZXh0ZW5zaW9uPiAgIAotCi0gICAJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeSAgIAotICAgICAgICAgICAgIGlkPSJTdGFydENsaWVudFNlcnZlciIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb24uUHJlQ2xpZW50UnVuQ29tbWFuZCIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnNlcnZlci5TdGFydENsaWVudFdpZGdldEZhY3RvcnkiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYW50U2NlbmFyaW8iPgotICAgICAgICA8YW50U2NlbmFyaW8KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYW50LkFudENsaWVudFJvb3RDb21tYW5kRnJhZ21lbnQiCi0gICAgICAgICAgICBzY2VuYXJpb1R5cGU9ImNsaWVudCIvPgotICAgICA8L2V4dGVuc2lvbj4KLSAgICAgCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hbnREYXRhTWFwcGluZyI+Ci0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJJbml0aWFsU2VsZWN0aW9uIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iSW5pdGlhbEluaXRpYWxTZWxlY3Rpb24iCi0gICAgICAgICAgICAgIHJlcXVpcmVkPSJ0cnVlIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlNlbGVjdGlvblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJJbml0aWFsU2VsZWN0aW9uIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkluaXRpYWxTZWxlY3Rpb24iCi0gICAgICAgICAgICAgIHJlcXVpcmVkPSJ0cnVlIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlNlbGVjdGlvblRyYW5zZm9ybWVyIi8+Ci0KLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IkNsaWVudC5SdW50aW1lSWQiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkNsaWVudFR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4KLQotICAgICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iQ2xpZW50LlNlcnZlcklkIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJDbGllbnRUeXBlUnVudGltZVNlcnZlciIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZzJUeXBlUnVudGltZVNlcnZlck1vZGlmaWVyIi8+Ci0KLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IkNsaWVudC5UeXBlSWQiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkNsaWVudFR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4KLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IlRlc3RTZXJ2aWNlIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJUZXN0U2VydmljZSIvPgotCi0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJNb25pdG9yU2VydmljZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iTW9uaXRvclNlcnZpY2UiLz4gICAgICAgICAgICAgIAotCi0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJDbGllbnQuUnVudGltZUlkIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJDbGllbnRUeXBlUnVudGltZVNlcnZlciIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZzJUeXBlUnVudGltZVNlcnZlck1vZGlmaWVyIi8+Ci0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJDbGllbnQuU2VydmVySWQiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkNsaWVudFR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4gICAgIAotICAgICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iQ2xpZW50LlR5cGVJZCIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiCi0gICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmcyVHlwZVJ1bnRpbWVTZXJ2ZXJNb2RpZmllciIvPiAgICAgICAgCi0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJDbGllbnRQcm9qZWN0TmFtZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iQ2xpZW50UHJvamVjdE5hbWUiLz4gIAotICAgICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iQ2xpZW50UHJvamVjdE5hbWUiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJDbGllbnRQcm9qZWN0TmFtZSIvPiAgICAgICAgICAgICAgCi0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJDbGllbnRFYXJQcm9qZWN0TmFtZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iQ2xpZW50RWFyUHJvamVjdE5hbWUiLz4gICAgICAgICAKLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IkNsaWVudENvbXBvbmVudFR5cGUiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkNsaWVudENvbXBvbmVudFR5cGUiLz4KLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IkNsaWVudC5SdW50aW1lSWQiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25GcmFnbWVudCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkNsaWVudFR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4gICAgICAgICAgICAgICAgCi0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJDbGllbnQuU2VydmVySWQiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25GcmFnbWVudCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkNsaWVudFR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4gICAgICAgICAgICAgICAgCi0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJDbGllbnQuVHlwZUlkIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJDbGllbnRUeXBlUnVudGltZVNlcnZlciIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZzJUeXBlUnVudGltZVNlcnZlck1vZGlmaWVyIi8+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAKLSAgICAgICAgIDwhLS0gbWFwcGluZ3MgZm9yIGxpc3Rpbmcgb3B0aW9ucyAtLT4KLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9Ikxpc3RSdW50aW1lcyIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5MaXN0T3B0aW9uc0NvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJMaXN0UnVudGltZXMiCi0gICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIgotICAgICAgICAgICAgICAvPiAKLQotICAJCTxtYXAKLSAgICAgICAgICAgICAga2V5PSJMaXN0U2VydmVycyIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5MaXN0T3B0aW9uc0NvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJMaXN0U2VydmVycyIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiCi0gICAgICAgICAgICAgIC8+ICAJCi0gICAgICA8L2V4dGVuc2lvbj4gCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9jbGllbnRQcm9qZWN0VHlwZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL2NsaWVudFByb2plY3RUeXBlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDBkYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL2NsaWVudFByb2plY3RUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGlkPSJjbGllbnRQcm9qZWN0VHlwZSIgbmFtZT0iQ2xpZW50IFByb2plY3QgVHlwZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVzIGNsaWVudCBjb250YWluZXIgdHlwZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsaWVudFByb2plY3RUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2xpZW50UHJvamVjdFR5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgYmxhbmsgZGVsaW1pdGVkIGxpc3Qgb2YgUHJvamVjdCBOYXR1cmUgSWRzLiAgVGhlIGxpc3RlZCBJRHMgaW5kaWNhdGUgdGhhdCB0aGlzIHR5cGUgb25seSB3b3JrcyB3aXRoIHRoZXNlIHBhcnRpY3VsYXIgcHJvamVjdCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB0aGlzIHR5cGUgb25seSB3b3JrcyB3aXRoIHdlYiBwcm9qZWN0cyBhbiBJRCBvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIHdvdWxkIGJlIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgYmxhbmsgZGVsaW1pdGVkIGxpc3Qgb2YgUHJvamVjdCBOYXR1cmUgSWRzLiAgVGhlIGxpc3RlZCBJRHMgaW5kaWNhdGUgdGhhdCB0aGlzIHR5cGUgRE9FUyBOT1Qgd29yayB3aXRoIHRoZXNlIHBhcnRpY3VsYXIgcHJvamVjdCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB0aGlzIHR5cGUgZG9lcyBub3Qgd29yayB3aXRoIHdlYiBwcm9qZWN0cyBhbiBJRCBvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIHdvdWxkIGJlIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGxhYmVsIHJlcHJlc2VudHMgdGhpcyBjbGllbnQgcHJvamVjdCB0eXBlLiAgSXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHNvIGl0IG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNsaWVudCBwcm9qZWN0IHR5cGUuICBUaGlzIGlkZW50aWZpZXIgaXMgcmVmZXJlbmNlZCBpbiB0aGUgY2xpZW50UHJvamVjdFR5cGUgYXR0cmlidXRlIG9mIHRoZSB3ZWJTZXJ2aWNlQ2xpZW50VHlwZSBlbGVtZW50IG9mIGFuIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlQ2xpZW50VHlwZSBleHRlbnNpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9vYmplY3RTZWxlY3Rpb25XaWRnZXQuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9vYmplY3RTZWxlY3Rpb25XaWRnZXQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyZDQyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGlkPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiIG5hbWU9Ik9iamVjdCBTZWxlY3Rpb24gV2lkZ2V0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGVudHJ5IGFsbG93cyBhbiBleHRlbmRlciB0byBhZGQgbmV3IHdheXMgb2YgYnJvd3NpbmcvZmluZGluZyBhcnRpZmFjdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgV2ViIHNlcnZpY2VzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGNsYXNzIGRlZmluZXMgU2VsZWN0aW9uIFdpZGdldCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIE9iamVjdCBTZWxlY3Rpb24gcGFnZSBvZiB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZHMuICBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSU9iamVjdFNlbGVjdGlvbldpZGdldCBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpZCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGVsZW1lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lciBpbnRlcmZhY2UuICBUaGlzIGludGVyZmFjZSBjb250YWlucyBhIHRyYW5zZm9ybSBtZXRob2QuICBFdmVuIHRob3VnaCB0aGUgdHlwZSBvZiB0aGUgaW5wdXQgcGFyYW1ldGVyIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGFyZSBvZiB0eXBlIE9iamVjdCBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZXkgd2lsbCBiZSB1c2VkIHdpdGggdGhlIHR5cGUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbi4gIFRoaXMgdHJhbnNmb3JtYXRpb24gbWV0aG9kIGFsbG93cyB0aGUgZXh0ZW5kZXIgdG8gbW9kaWZ5IHRoZSBpbml0aWFsIHNlbGVjdGlvbiB0byBhbiBJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3QgdGhhdCBpcyBtb3JlIHJlYWRpbHkgdXNhYmxlIGJ5IHRoZSBydW50aW1lIHNlcnZlciB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsX21vZGlmeSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBvYmplY3Qgc2VsZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgb3V0c2lkZSB0aGUgb2JqZWN0IHNlbGVjdGlvbiB3aWRnZXQuICBBbiBleGFtcGxlLCBvZiB0aGlzIHdvdWxkIGJlIG9uIHBhZ2Ugb25lIG9mIHRoZSB3ZWIgc2VydmljZSB3aWRnZXQgYnkgdHlwaW5nIGluIGEgdGV4dCBmaWVsZC4gIElmIHNldCB0byB0cnVlLCB0aGUgZXh0ZW5kZXIgb2YgT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IG11c3QgcHJvdmlkZSBhIHZhbGlkYXRlKFN0cmluZykgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIGFueSBuZWNlc3NhcnkgdmFsaWRhdGlvbiBhbmQgc2V0cyB0aGUgb2JqZWN0IHNlbGVjdGlvbiBvbiB0aGUgd2lkZ2V0LiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgZmFsc2UuICBBbnkgdGV4dCBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gUkVBRF9PTkxZIHN0eWxlIHNvIHRoZSBvYmplY3Qgc2VsZWN0aW9uIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdpdGggb2JqZWN0IHNlbGVjdGlvbiB3aWRnZXQgaW1wbGVtZW50YXRpb24gZGlyZWN0bHkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlQ2xpZW50VHlwZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VDbGllbnRUeXBlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYmRkM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VDbGllbnRUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGlkPSJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIgbmFtZT0iV2ViIFNlcnZpY2UgQ2xpZW50IFR5cGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGRlZmluZXMgV2ViIFNlcnZpY2UgQ2xpZW50IHR5cGVzLiAgVGhpcyBpcyBkb25lIGJ5IGRlZmluaW5nIHdlYlNlcnZpY2VDbGllbnRUeXBlIGVsZW1lbnRzLiAgVGhlc2UgZWxlbWVudHMgcmVmZXIgdG8gYSBzZXJ2ZXIgYW5kIGEgV2ViIFNlcnZpY2UgcnVudGltZS4gIFRoZXNlIGFyZSByZXNwZWN0aXZlbHkgZGVmaW5lZCBpbiB0aGUgd2ViU2VydmljZVNlcnZlciBlbGVtZW50IGFuZCB0aGUgd2ViU2VydmljZVJ1bnRpbWUgZWxlbWVudC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVNlcnZlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlUnVudGltZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VTZXJ2ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHNlcnZlciB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5SWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZmFjdG9yeSBpZCBmb3IgYSBzZXJ2ZXIuICBUaGlzIGlkIGlzIGRlZmluZWQgYnkKLXRoZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoaXMgc2VydmVyIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHNlcnZlci4gIE5vdGU6ICB0aGlzIGRlZmF1bHQgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgYWJzZW5jZSBvZiBvdGhlciBpbmZvcm1hdGlvbi4gIElmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgcGFydGljdWxhciBzZXJ2ZXIgYXMgdGhlaXIgZGVmYXVsdCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuICBTaG91bGQgY29udGFpbiBhIHZhbHVlIG9mIGVpdGhlciAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBsb2NhbCBJRCBmb3IgdGhpcyBzZXJ2ZXIuICBUaGUgc2VydmVyIGF0dHJpYnV0ZSBvZiB0aGUgd2Vic2VydmljZUNsaWVudFR5cGUgZWxlbWVudCByZWZlcnMgdG8gdGhpcyBJRC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyBjdXJyZW50bHkgYSBwbGFjZSBob2xkZXIgZm9yIGZ1dHVyZSBkZXZlbG9wbWVudC4gIFBsZWFzZSwgZG8gbm90IHVzZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVJ1bnRpbWUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGxhYmVsIGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBydW50aW1lLiAgVGhlcmVmb3JlLCBpcyBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoaXMgcnVudGltZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBydW50aW1lLiAgTm90ZTogIHRoaXMgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLiAgSWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBwYXJ0aWN1bGFyIHJ1bnRpbWUgYXMgdGhlaXIgZGVmYXVsdCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuICBTaG91bGQgY29udGFpbiBhIHZhbHVlIG9mIGVpdGhlciAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImoyZWV2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgSjJFRSB2ZXJzaW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBydW50aW1lLiAgVGhlIGFsbG93YWJsZSB2YWx1ZXMgYXJlIDEyLCAxMywgYW5kIDE0LiAgSWYgbW9yZSB0aGFuIG9uZSBKMkVFIHZlcnNpb24gaXMgc3VwcG9ydGVkIGVhY2ggSjJFRSBsZXZlbCBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGggYSBibGFuayBkZWxpbWl0ZXIuKGVnLiBpZiBKMkVFIHZlcnNpb24gMS4yIGFuZCAxLjMgYXJlIHN1cHBvcnRlZCB0aGVuIHRoaXMgYXR0cmlidXRlIHN0cmluZyB3b3VsZCBiZSAmcXVvdDsxMiAxMyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZUNsaWVudFR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIFdlYiBTZXJ2aWNlcyBjbGllbnQgdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgSUQgZm9yIHRoaXMgV2ViIFNlcnZpY2UgQ2xpZW50IHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIGZvciB0aGlzIFdlYiBTZXJ2aWNlIENsaWVudCB0eXBlLiAgSXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHNvIGl0IG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnRUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGtpbmQgb2YgV2ViIFNlcnZpY2UgQ2xpZW50IHR5cGUgYmVpbmcgZGVmaW5lZC4gKGllLiB0aGUgdmFsdWUgb2YgdGhlIEphdmEgY2xpZW50IGlzIG9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcnVudGltZSBJRCBmb3IgdGhpcyBXZWIgU2VydmljZSBjbGllbnQgdHlwZS4gIFRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcgd2ViU2VydmljZVJ1bnRpbWUgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXIiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBzZXJ2ZXIgZm9yIHRoaXMgV2ViIFNlcnZpY2UgY2xpZW50IHR5cGUuICBUaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIHdlYlNlcnZpY2VTZXJ2ZXIgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnRQcm9qZWN0VHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIHNwYWNlIGRlbGltaXRlZCBsaXN0IG9mIGNsaWVudCBwcm9qZWN0IHR5cGUgaWRzIHN1cHBvcnRlZCBieSB0aGlzIGJ5IHRoaXMgd2ViU2VydmljZUNsaWVudFR5cGUgZWxlbWVudC4gIFRoZSBjbGllbnQgcHJvamVjdCB0eXBlIGlkcyBhcmUgZGVmaW5lZCBieSB0aGUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXZlbG9wQmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBkZXZlbG9wbWVudCBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgZmlyc3QgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhc3NlbWJseUJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgYXNzZW1ibHkgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBkZXZlbG9wbWVudCBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95QmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBkZXBsb3kgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBhc3NlbWJseSBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zdGFsbEJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgaW5zdGFsbCBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGRlcGxveSBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkZDcxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGlkPSJ3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiIG5hbWU9IldlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIFR5cGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGRlZmluZXMgV2ViIFNlcnZpY2UgU2VydmVyIHR5cGVzLiAgVGhpcyBpcyBkb25lIGJ5IGRlZmluaW5nIHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBlbGVtZW50cy4gIFRoZXNlIGVsZW1lbnRzIHJlZmVyIHRvIGEgc2VydmVyIGFuZCBhIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuICBUaGVzZSBhcmUgcmVzcGVjdGl2ZWx5IGRlZmluZWQgaW4gdGhlIHdlYlNlcnZpY2VTZXJ2ZXIgZWxlbWVudCBhbmQgdGhlIHdlYlNlcnZpY2VSdW50aW1lIGVsZW1lbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VTZXJ2ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVJ1bnRpbWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVNlcnZlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgc2VydmVyIHR5cGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBmYWN0b3J5IGlkIGZvciBhIHNlcnZlci4gIFRoaXMgaWQgaXMgZGVmaW5lZCBieQotdGhlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNEZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhpcyBzZXJ2ZXIgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgc2VydmVyLiAgTm90ZTogIHRoaXMgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLiAgSWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBwYXJ0aWN1bGFyIHNlcnZlciBhcyB0aGVpciBkZWZhdWx0IHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gIFNob3VsZCBjb250YWluIGEgdmFsdWUgb2YgZWl0aGVyICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGxvY2FsIElEIGZvciB0aGlzIHNlcnZlci4gIFRoZSBzZXJ2ZXIgYXR0cmlidXRlIG9mIHRoZSB3ZWJzZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgZWxlbWVudCByZWZlcnMgdG8gdGhpcyBJRC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyBjdXJyZW50bHkgYSBwbGFjZSBob2xkZXIgZm9yIGZ1dHVyZSBkZXZlbG9wbWVudC4gIFBsZWFzZSwgZG8gbm90IHVzZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVJ1bnRpbWUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGxhYmVsIGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBydW50aW1lLiAgVGhlcmVmb3JlLCBpcyBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoaXMgcnVudGltZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBydW50aW1lLiAgTm90ZTogIHRoaXMgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLiAgSWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBwYXJ0aWN1bGFyIHJ1bnRpbWUgYXMgdGhlaXIgZGVmYXVsdCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuICBTaG91bGQgY29udGFpbiBhIHZhbHVlIG9mIGVpdGhlciAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImoyZWV2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgSjJFRSB2ZXJzaW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBydW50aW1lLiAgVGhlIGFsbG93YWJsZSB2YWx1ZXMgYXJlIDEyLCAxMywgYW5kIDE0LiAgSWYgbW9yZSB0aGFuIG9uZSBKMkVFIHZlcnNpb24gaXMgc3VwcG9ydGVkIGVhY2ggSjJFRSBsZXZlbCBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGggYSBibGFuayBkZWxpbWl0ZXIuKGVnLiBpZiBKMkVFIHZlcnNpb24gMS4yIGFuZCAxLjMgYXJlIHN1cHBvcnRlZCB0aGVuIHRoaXMgYXR0cmlidXRlIHN0cmluZyB3b3VsZCBiZSAmcXVvdDsxMiAxMyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBXZWIgU2VydmljZXMgc2VydmVyIHJ1bnRpbWUgdHlwZS4gIEFuIGVudHJ5IGZvciB0aGlzIGVsZW1lbnQgZGVmaW5lcyBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIHNlcnZlciwgcnVudGltZSwgYW5kIHdlYnNlcnZpY2UgdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgSUQgZm9yIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgZm9yIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgdHlwZS4gIEl0IGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBzbyBpdCBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBydW50aW1lIElEIGZvciB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIHR5cGUuICBUaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIHdlYlNlcnZpY2VSdW50aW1lIGVsZW1lbnQgd2l0aCBhbiBhdHRyaWJ1dGUgY2FsbGVkIGlkIHRoYXQgaGFzIHRoaXMgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgc2VydmVyIGZvciB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIHR5cGUuICBUaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIHdlYlNlcnZpY2VTZXJ2ZXIgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGtpbmQgb2YgV2ViIFNlcnZpY2UgUnVudGltZSB0eXBlIGJlaW5nIGRlZmluZWQuIChlZy4gdGhlIHZhbHVlIG9mIGEgSmF2YSBCZWFuIFdlYnNlcnZpY2UgaXMgb3JnLmVjbGlwc2UuanN0LndzLnR5cGUuamF2YSkKLVRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcgd2ViU2VydmljZVR5cGUgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXZlbG9wQmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBkZXZlbG9wbWVudCBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgZmlyc3QgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhc3NlbWJseUJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgYXNzZW1ibHkgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBkZXZlbG9wbWVudCBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95QmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBkZXBsb3kgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBhc3NlbWJseSBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zdGFsbEJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgaW5zdGFsbCBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGRlcGxveSBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZUVKQk1vZHVsZSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWYgdGhlIFdlYnNlcnZpY2UgZm9yIHRoaXMgU2VydmVyIFJ1bnRpbWUgVHlwZSBpcyByZXF1aXJlZCB0byBiZSBpbiBhbiBFSkIgbW9kdWxlIHRoZW4gdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSB0cnVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcXVpcmVXZWJNb2R1bGUiIHR5cGU9ImJvb2xlYW4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoZSBXZWJzZXJ2aWNlIGZvciB0aGlzIFNlcnZlciBSdW50aW1lIFR5cGUgaXMgcmVxdWlyZWQgdG8gYmUgaW4gYW4gV2ViIG1vZHVsZSB0aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgdHJ1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIGEgcGFydGljdWxhciBXZWIgc2VydmljZSBraW5kLiAgU3VjaCBhcyBhIEphdmEgQmVhbiB3ZWIgc2VydmljZSwgYSBTa2VsZXRvbiBXZWIgc2VydmljZSwgYW4gRUpCICBXZWIgc2VydmljZSwgZXRjLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGEgdW5pcXVlIElEIGZvciB0aGlzIFdlYiBzZXJ2aWNlIHR5cGUuICBJdCBpcyByZWZlcmVuY2VkIGluIHRoZSB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgZWxlbWVudCB3aXRoIHRoZSB0eXBlIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgdHJhbnNsYXRhYmxlIGxhYmVsIGZvciB0aGlzIHdlYiBzZXJ2aWNlIHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2VUeXBlTWV0YWRhdGEiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBibGFuayBkZWxpbWl0ZWQgbGlzdCBjbGFzcyBOYW1lcy4gKGllLk5vIHBhY2thZ2UgcHJlZml4KSAgVGhlIGNsYXNzZXMgbGlzdGVkIGRlZmluZSB0aGUgYWxsb3dhYmxlIEVjbGlwc2UgcmVzb3VyY2VzIHRoYXQgdGhpcyB3ZWIgc2VydmljZSB0eXBlIHVuZGVyc3RhbmRzIGFuZCB0dXJuIGludG8gYSBXZWIgc2VydmljZS4gIEZvciBleGFtcGxlLCBpZiBhIHVzZXIgc2VsZWN0cyBhIEphdmEgc291cmNlIGZpbGUgaW4gdGhlIHBhY2thZ2UgZXhwbG9yZXIgdmlldyBhbmQgdGhlbiBzdGFydHMgdGhlIFdlYiBzZXJ2aWNlcyB3aXphcmQgYSBDb21waWxhdGlvblVuaXQgb2JqZWN0IHdpbGwgYmUgcGFzc2VkIGluIGFzIHBhcnQgb2YgYW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24uICBCeSBwdXR0aW5nICZxdW90O0NvbXBpbGF0aW9uVW5pdCZxdW90OyBhcyBvbmUgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBhdHRyaWJ1dGUgaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyB0eXBlIGNhbiBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIHRoZSBDb21waWxhdGlvblVuaXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uTWV0YWRhdGEiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgYWxsb3dzIHRoaXMgV2ViIHNlcnZpY2UgdHlwZSB0byByZXN0cmljdCBuYW1lcyBvZiB0aGUgaW5wdXQgZmlsZXMgdGhhdCBpdCB1bmRlcnN0YW5kcy4gIEZvciBleGFtcGxlLCBpZiB0aGUgdmFsdWUgaXMgc2V0IHRvICZxdW90Oy5qYXZhIC5jbGFzcyZxdW90OyBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIFdlYiBzZXJ2aWNlIHR5cGUgb25seSB1bmRlcnN0YW5kcyByZXNvdXJjZSBuYW1lcyB0aGF0IGVuZCB3aXRoIC5qYXZhIG9yIGVuZCB3aXRoIC5jbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT24gcGFnZSAyIG9mIHRoZSBXZWIgc2VydmljZSB3aXphcmQgdGhlcmUgaXMgYW4gT2JqZWN0IHNlbGVjdGlvbiBwYWdlLiAgVGhpcyBzZWxlY3Rpb24gcGFnZSBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGlzIGF0dHJpYnV0ZSwgc2luY2UgZGlmZmVyZW50IFdlYiBzZXJ2aWNlIHR5cGVzIG1heSBuZWVkIGRpZmZlcmVudCBtZXRob2RzIG9mIHNlbGVjdGluZyB0aGVtLiAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgaWQgb2YgYSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkub2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGV4dGVuc2lvbi4gIFRoZSBwcmVkZWZpbmVkIGlkIGZvciBhIEphdmEgc2VsZWN0aW9uIHdpZGdldCBpcyBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQuICBUaGUgcHJlZGVmaW5lZCBpZCBmb3IgYSBXU0RMIHNlbGVjdGlvbiB3aWRnZXQgaXMgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25XaWRnZXQuICBUaGUgcHJlZGVmaW5lZCBpZCBmb3IgYW4gRUpCIHNlbGVjdGlvbiB3aWRnZXQgaXMgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvbldpZGdldC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlTmF0dXJlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIGJsYW5rIGRlbGltaXRlZCBsaXN0IG9mIFByb2plY3QgTmF0dXJlIElkcy4gIFRoZSBsaXN0ZWQgSURzIGluZGljYXRlIHRoYXQgdGhpcyB0eXBlIG9ubHkgd29ya3Mgd2l0aCB0aGVzZSBwYXJ0aWN1bGFyIHByb2plY3QgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgdGhpcyB0eXBlIG9ubHkgd29ya3Mgd2l0aCB3ZWIgcHJvamVjdHMgYW4gSUQgb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSB3b3VsZCBiZSBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZU5hdHVyZXMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBibGFuayBkZWxpbWl0ZWQgbGlzdCBvZiBQcm9qZWN0IE5hdHVyZSBJZHMuICBUaGUgbGlzdGVkIElEcyBpbmRpY2F0ZSB0aGF0IHRoaXMgdHlwZSBET0VTIE5PVCB3b3JrIHdpdGggdGhlc2UgcGFydGljdWxhciBwcm9qZWN0IHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgdHlwZSBkb2VzIG5vdCB3b3JrIHdpdGggd2ViIHByb2plY3RzIGFuIElEIG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUgd291bGQgYmUgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZVRlc3QuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlVGVzdC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGJmNjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlVGVzdC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiBpZD0id2ViU2VydmljZVRlc3QiIG5hbWU9IldlYiBTZXJ2aWNlIFRlc3QiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBXZWIgc2VydmljZSB0ZXN0IGZhY2lsaXRpZXMgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBXZWIgc2VydmljZXMgd2l6YXJkcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVRlc3QiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlVGVzdCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1ldGhvZHNuZWVkZWQiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGluZGljYXRlcyBpZiB0aGlzIHRlc3QgZmFjaWxpdHkgbmVlZCB0byBtZXRob2RzIGZyb20gYSBwcm94eSBiZWFuLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyB0ZXN0IGZhY2lsaXR5LiAgSXQgbXVzdCBiZSB0cmFuc2xhdGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImphdmEiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGVzdCBmYWNpbGl0eSBpcyBpbnRlbmRlZCBmb3IgY2xpZW50cyB0aGF0IGdlbmVyYXRlIGEgSmF2YSBiZWFuIGFzIG91dHB1dC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2RlZ2VuIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgaWYgdGhpcyB0ZXN0IGZhY2lsaXR5IGdlbmVyYXRlcyBjb2RlIG9yIG5vdCwgc3VjaCBhcyBKU1AgZmlsZXMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBjbGFzcyBuYW1lLiAgVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLmpzdC53cy5leHQuV2ViU2VydmljZUV4ZWN1dGFibGUuICBUaGlzIGNsYXNzIGFsbG93cyB0aGUgZXh0ZW5kZXIgdG8gcHJvdmlkZSB0aGUgQ29tbWFuZHMgdGhhdCB3aWxsIGV4ZWN1dGUgZm9yIHRoaXMgdGVzdCBmYWNpbGl0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGVzdCBmYWNpbGl0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9Db25zdW1wdGlvblVJLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL0NvbnN1bXB0aW9uVUkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL0NvbnN1bXB0aW9uVUkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgIDIwMDYwMjA0IDEyNDE0MyAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotIyAgMjAwNjAyMDQgMTI0NDA4ICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAKLSMgMjAwNjAyMjEgICAxMTkxMTEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0jIDIwMDYwMzIxICAgMTI4ODI3IGpvYW4gLSBKb2FuIEhhZ2dhcnR5Ci0jIDIwMDYwMzI5ICAgMTI4MDY5IHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotIyAyMDA2MDQwNyAgIDEzNTQ0MyBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0jIDIwMDYwNDExICAgMTM2MTM0IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0jIDIwMDYwNDE3ICAgMTM2MzkwIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSMgMjAwNjA0MTMgICAxMzU1ODEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0jIDIwMDYwNDE4ICAgMTM2MzM1IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSMgMjAwNjA0MjAgICAxMzYxNTggcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0jIDIwMDYwNDIwICAgMTIwNzE0IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0jIDIwMDYwNDIwICAgMTM1OTEyIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSMgMjAwNjA1MTAgICAxNDExMTUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0jIDIwMDYwNTA5ICAgMTE5Mjk2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSMgMjAwNjA2MDIgICAxNDUwNTQga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotCi1QTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX0NMSUVOVD1XZWIgU2VydmljZSBDbGllbnQKLSMKLSMgV2ViIHNlcnZpY2VzICJJbnRlcm5ldCIgcHJlZmVyZW5jZXMgZXh0ZW5zaW9uLgotIwotCi0jCi0jIFdlYiBTYW1wbGVzIElEcwotIwotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1BQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWT1HZW5lcmF0ZSBDbGllbnQKLQotIwotIyBEaWFsb2dzCi0jCi1DSEVDS0JPWF9TSE9XX0dFTkVSQVRFX0pBVkFfUFJPWFlfRElBTE9HPVNob3cgR2VuZXJhdGUgSmF2YSBiZWFuIFByb3h5IERpYWxvZwotVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1dTREwyUFJPWFk9U2hvdyB0aGUgZGlhbG9nIGZvciBnZW5lcmF0aW5nIHRoZSBKYXZhIGJlYW4gcHJveHkgYWN0aW9uLgotCi0jCi0jICAgICAgIFdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIENhdGVnb3JpZXMKLSMKLQotIwotIyBQcmVmZXJlbmNlcyBUb29sdGlwcwotIwotCi0jCi0jU2VydmVyIFJ1bnRpbWUgUHJlZmVyZW5jZXMKLSMKLVRPT0xUSVBfU1JQRl9DT01CT19TRVJWRVI9VGhlIHByZWZlcnJlZCBzZXJ2ZXIgdHlwZQotVE9PTFRJUF9TUlBGX0NPTUJPX1JVTlRJTUU9VGhlIHByZWZlcnJlZCBXZWIgc2VydmljZSBydW50aW1lCi1UT09MVElQX1NSUEZfQ09NQk9fSjJFRT1UaGUgcHJlZmVycmVkIEoyRUUgdmVyc2lvbgotCi0jCi0jIEdlbmVyYWwgbWVzc2FnZXMuCi0jCi1NU0dfRVJST1JfVEFTS19FWENFUFRFRD1JV0FCMDIzNEUgQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIERldGFpbHM6IHswfQotTVNHX0VSUk9SX05PX1NFUlZFUl9SVU5USU1FPU5vIHN1aXRhYmxlIHNlcnZlciBjYW4gYmUgZm91bmQgZm9yIHRoZSB7MH0gV2ViIHNlcnZpY2UgcnVudGltZS4gR28gdG8gV2luZG93ID4gUHJlZmVyZW5jZXMuIFNlbGVjdCBTZXJ2ZXIgPiBJbnN0YWxsZWQgUnVudGltZXMgYW5kIGNvbmZpZ3VyZSBhIHNlcnZlciBydW50aW1lLgotCi0KLSMKLSMgV2l6YXJkIHBhZ2UgdGFzayBsYWJlbHMgYW5kIGRlc2NyaXB0aW9ucwotIyAodXNlZCBvbmx5IGZvciBwcm9ncmVzcyBpbmRpY2F0aW9uKS4KLSMKLQotIwotIyBDb21tb24gd2l6YXJkIHN0cmluZ3MuCi0jCi1MQUJFTF9GT0xERVJfTkFNRT1Gb2xkZXI6Ci1MQUJFTF9KU1BfRk9MREVSX05BTUU9SlNQIGZvbGRlcjoKLUxBQkVMX1dFQl9QUk9KRUNUX05BTUU9V2ViIHByb2plY3Q6Ci1MQUJFTF9XRUJTRVJWSUNFVFlQRT0mV2ViIHNlcnZpY2UgdHlwZToKLUxBQkVMX1dFQlNFUlZJQ0VJTVBMPVNlcnZpY2UgaW1wbGVtZW50YXRpb246Ci1MQUJFTF9XRUJTRVJWSUNFREVGPVNlcnZpY2UgZGVmaW5pdGlvbjoKLUxBQkVMX0oyRUVfVkVSU0lPTj1KMkVFIHZlcnNpb246Ci1MQUJFTF9OQT1OL0EKLQotQlVUVE9OX0JST1dTRT1CJnJvd3NlLi4uCi1CVVRUT05fQlJPV1NFX0ZJTEVTPUJyb3dzZSBmaWxlcy4uLgotCi1CT1RUT01VUF9MQUJFTD1Cb3R0b20gdXAKLVRPUERPV05fTEFCRUw9VG9wIGRvd24KLUNMSUVOVF9MQUJFTD1DbGllbnQKLUNPTUJJTkVEX1RZUEVfQU5EX1JVTlRJTUVfTEFCRUw9ezB9IHsxfQotCi0jCi0jIFdpemFyZHMuCi0jCi1XSVpBUkRfVElUTEVfV1NDPVdlYiBTZXJ2aWNlIENsaWVudAotCi0jCi0jIFdlYlNlcnZpY2VQcm9qZWN0UGFnZQotIwotUEFHRV9USVRMRV9XU19QUk9KRUNUPVdlYiBTZXJ2aWNlcwotUEFHRV9ERVNDX1dTX1BST0pFQ1Q9UmV2aWV3IHlvdXIgV2ViIHNlcnZpY2Ugb3B0aW9ucyBhbmQgbWFrZSBhbnkgbmVjZXNzYXJ5IGNoYW5nZXMgYmVmb3JlIHByb2NlZWRpbmcgdG8gdGhlIG5leHQgcGFnZS4KLUJVVFRPTl9TVEFSVF9XRUJfUFJPSkVDVD0mU3RhcnQgV2ViIHNlcnZpY2UgaW4gV2ViIHByb2plY3QKLSNCVVRUT05fREVQTE9ZX1dFQl9QUk9KRUNUPURlcGxveSBXZWIgc2VydmljZSB0byBhIHNlcnZlciB0eXBlCi1CVVRUT05fSU5TVEFMTF9TRVJWSUNFX1dFQl9QUk9KRUNUPSZJbnN0YWxsIFdlYiBzZXJ2aWNlIG9uIHNlcnZlcgotQlVUVE9OX0lOU1RBTExfQ0xJRU5UX1dFQl9QUk9KRUNUPUluc3RhbGwgV2ViIHNlcnZpY2UgJmNsaWVudCBvbiBzZXJ2ZXIgKG1hbmFnZWQgY2xpZW50cyBvbmx5KQotR1JPVVBfU0NFTkFSSU9fU0VSVklDRT1TZXJ2aWNlCi1HUk9VUF9TQ0VOQVJJT19DTElFTlQ9Q2xpZW50IHByb3h5Ci1MQUJFTF9XRUJTRVJWSUNFQ0xJRU5UVFlQRT0mQ2xpZW50IHR5cGU6Ci0KLVRPT0xUSVBfV1NXU0NFTl9TRVJWSUNFUFJPSkVDVF9MSU5LPUNsaWNrIG9uIHRoZSBsaW5rIHRvIGVkaXQgc2VydmljZSBwcm9qZWN0IGFuZCBFQVIgc2V0dGluZ3MuCi1UT09MVElQX1dTV1NDRU5fQ0xJRU5UUFJPSkVDVF9MSU5LPUNsaWNrIG9uIHRoZSBsaW5rIHRvIGVkaXQgY2xpZW50IHByb2plY3QgYW5kIEVBUiBzZXR0aW5ncy4KLQotRElBTE9HX1RJVElMRV9TRVJWSUNFX0lNUExfU0VMRUNUSU9OPVNlbGVjdCBTZXJ2aWNlIEltcGxlbWVudGF0aW9uCi1ESUFMT0dfVElUSUxFX1NFUlZJQ0VfREVGX1NFTEVDVElPTj1TZWxlY3QgU2VydmljZSBEZWZpbml0aW9uCi1ESUFMT0dfVElUSUxFX1NFUlZJQ0VfUFJPSkVDVF9TRVRUSU5HUz1TcGVjaWZ5IFNlcnZpY2UgUHJvamVjdCBTZXR0aW5ncwotRElBTE9HX1RJVElMRV9DTElFTlRfUFJPSkVDVF9TRVRUSU5HUz1TcGVjaWZ5IENsaWVudCBQcm9qZWN0IFNldHRpbmdzCi0KLSMgSXRlbXMgY29tbW9uIHRvIFdlYlNlcnZpY2VSdW50aW1lU2VsZWN0aW9uUGFnZSBhbmQgV2ViU2VydmljZUNsaWVudFJ1bnRpbWVTZWxlY3Rpb25QYWdlCi0jIFdlYlNlcnZpY2VSdW50aW1lU2VsZWN0aW9uUGFnZQotTEFCRUxfU1VNTUFSWT1Db25maWd1cmF0aW9uOgotTEFCRUxfU1VNTUFSWV9OT19DTElFTlQ9Q29uZmlndXJhdGlvbjogTm8gY2xpZW50IGdlbmVyYXRpb24uCi1QQUdFX1RJVExFX1dTX1JVTlRJTUVfU0VMRUNUSU9OPVNlcnZpY2UgRGVwbG95bWVudCBDb25maWd1cmF0aW9uCi1QQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT049Q2hvb3NlIGZyb20gdGhlIGxpc3Qgb2YgcnVudGltZXMgYW5kIGRlcGxveW1lbnQgc2VydmVycywgb3IgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzLgotTEFCRUxfUlVOVElNRVNfTElTVD1XZWIgc2VydmljZSBydW50aW1lOgotTEFCRUxfU0VSVkVSU19MSVNUPVNlcnZlcjoKLUxBQkVMX0VESVRfQlVUVE9OPUVkaXQuLi4KLUxBQkVMX1NFUlZJQ0VfRUFSX01PRFVMRT1TZXJ2aWNlIEVBUiBtb2R1bGU6Ci1MQUJFTF9DTElFTlRfRUFSX01PRFVMRT1DbGllbnQgRUFSIG1vZHVsZToKLUxBQkVMX0NMSUVOVF9NT0RVTEU9Q2xpZW50IG1vZHVsZToKLUxBQkVMX1NFUlZJQ0VfTU9EVUxFPVNlcnZpY2UgbW9kdWxlOgotTEFCRUxfQ0xJRU5UX1BST0pFQ1Q9Q2xpZW50IHByb2plY3Q6Ci1MQUJFTF9TRVJWSUNFX1BST0pFQ1Q9U2VydmljZSBwcm9qZWN0OgotTEFCRUxfQ0xJRU5UX0VBUl9QUk9KRUNUPUNsaWVudCBFQVIgcHJvamVjdDoKLUxBQkVMX1NFUlZJQ0VfRUFSX1BST0pFQ1Q9U2VydmljZSBFQVIgcHJvamVjdDoKLQotIwotIyBDbGllbnQgY29tcG9uZW50IHR5cGUgbGFiZWxzCi0jCi1MQUJFTF9DTElFTlRfQ09NUF9UWVBFX1dFQj1XZWIKLUxBQkVMX0NMSUVOVF9DT01QX1RZUEVfRUpCPUVKQgotTEFCRUxfQ0xJRU5UX0NPTVBfVFlQRV9BUFBfQ0xJRU5UPUFwcGxpY2F0aW9uIENsaWVudAotTEFCRUxfQ0xJRU5UX0NPTVBfVFlQRV9DT05UQUlORVJMRVNTPUphdmEKLQotCi1UT09MVElQX1BXUlNfVEVYVF9SVU5USU1FPUNsaWNrIG9uIHRoZSBsaW5rIHRvIHNwZWNpZnkgdGhlIHdlYiBzZXJ2aWNlIHJ1bnRpbWUuCi1UT09MVElQX1BXUlNfVEVYVF9TRVJWRVI9Q2xpY2sgb24gdGhlIGxpbmsgdG8gc3BlY2lmeSBhIHNlcnZlci4KLVRPT0xUSVBfUFdSU19KMkVFX1ZFUlNJT049SjJFRSB2ZXJzaW9uIHRvIGJlIHVzZWQuCi0KLUxBQkVMX1NFTEVDVElPTl9WSUVXX1RJVExFPVNlcnZlci1TaWRlIERlcGxveW1lbnQgU2VsZWN0aW9uOgotTEFCRUxfU0VMRUNUSU9OX1ZJRVdfUlVOVElNRT1DaG9vc2UgV2ViIHNlcnZpY2UgcnVudGltZSBmaXJzdAotTEFCRUxfU0VMRUNUSU9OX1ZJRVdfU0VSVkVSPUNob29zZSBzZXJ2ZXIgZmlyc3QKLUxBQkVMX1NFTEVDVElPTl9WSUVXX0VYUExPUkU9RXhwbG9yZSBvcHRpb25zCi0KLUxBQkVMX1RSRUVfRVhJU1RJTkdfU0VSVkVSUz1FeGlzdGluZyBTZXJ2ZXJzCi1MQUJFTF9UUkVFX1NFUlZFUl9UWVBFUz1TZXJ2ZXIgVHlwZXMKLQotTVNHX05PX09CSkVDVF9TRUxFQ1RJT049U2VsZWN0IGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLU1TR19OT19TRVJWSUNFX1NFTEVDVElPTj1TZWxlY3QgYSBzZXJ2aWNlIGRlZmluaXRpb24uCi1NU0dfSU5WQUxJRF9TRVJWSUNFX0lNUEw9VGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gc2VsZWN0ZWQgaXMgaW52YWxpZC4KLU1TR19JTlZBTElEX1NFUlZJQ0VfREVGPVRoZSBzZXJ2aWNlIGRlZmluaXRpb24gc2VsZWN0ZWQgaXMgaW52YWxpZC4KLU1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TPXswfSBkb2VzIG5vdCBzdXBwb3J0IHRoZSB7MX0gV2ViIHNlcnZpY2UgcnVudGltZS4gQ2hvb3NlIGEgZGlmZmVyZW50IHNlcnZlciBvciBydW50aW1lIHRvIHByb2NlZWQgdGhyb3VnaCB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZC4KLU1TR19OT19SVU5USU1FPU5vIHJ1bnRpbWUgc3BlY2lmaWVkIGZvciB0aGUgezB9IHNjZW5hcmlvLgotTVNHX05PX1NFUlZFUj1ObyBzZXJ2ZXIgc3BlY2lmaWVkIGZvciB0aGUgezB9IHNjZW5hcmlvLgotTVNHX0VSUk9SX1NUVUJfT05MWT17MH0gaGFzIG9ubHkgc3R1YiBydW50aW1lcyBhc3NvY2lhdGVkIHdpdGggaXQuIENob29zZSBhIGRpZmZlcmVudCBzZXJ2ZXIgb3IgY29uZmlndXJlIGEgbm9uLXN0dWIgcnVudGltZSBpbiB0aGUgc2VydmVyIHByZWZlcmVuY2VzLiAKLU1TR19XQVJOX1NUVUJfT05MWT17MH0gaGFzIG9ubHkgc3R1YiBydW50aW1lcyBhc3NvY2lhdGVkIHdpdGggaXQgc28gdGhlIHNlcnZlciB3aWxsIG5vdCBiZSBjcmVhdGVkIG9yIHN0YXJ0ZWQuCi1NU0dfV0FSTl9OT19TRVJWSUNFX1NFUlZFUj1ObyBzZXJ2ZXIgaGFzIGJlZW4gc2VsZWN0ZWQuIFRoZSBXZWIgc2VydmljZSB3aWxsIG5vdCBiZSBkZXBsb3llZCwgaW5zdGFsbGVkLCBvciBydW4uCi1NU0dfV0FSTl9OT19DTElFTlRfU0VSVkVSPU5vIHNlcnZlciBoYXMgYmVlbiBzZWxlY3RlZC4gVGhlIFdlYiBzZXJ2aWNlIGNsaWVudCB3aWxsIG5vdCBiZSBkZXBsb3llZCwgaW5zdGFsbGVkLCBvciBydW4uCi0KLU1TR19TRVJWRVJfVEFSR0VUX01JU01BVENIPVRoZSBwcm9qZWN0LCB7MH0sIGhhcyBhIHNlcnZlciB0YXJnZXQgd2hpY2ggaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VsZWN0ZWQgc2VydmVyIHR5cGUKLU1TR19KMkVFX01JU01BVENIPVRoZSBwcm9qZWN0LCB7MH0sIGhhcyBhIGRpZmZlcmVudCBKMkVFIGxldmVsIGZyb20gdGhlIHNlbGVjdGVkIEoyRUUgbGV2ZWwKLU1TR19TRVJWSUNFX1BST0pFQ1RfRU1QVFk9VGhlIHNlcnZpY2UgcHJvamVjdCB7MH0gY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBzZXJ2aWNlIHByb2plY3QgezB9LgotTVNHX1NFUlZJQ0VfUFJPSkVDVF9UWVBFX0VNUFRZPVNlbGVjdCBhIHNlcnZpY2UgcHJvamVjdCB0eXBlLgotTVNHX1NFUlZJQ0VfRUFSX0VNUFRZPVRoZSBzZXJ2aWNlIEVBUiB7MH0gY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBzZXJ2aWNlIEVBUiB7MH0uCi1NU0dfQ0xJRU5UX1BST0pFQ1RfRU1QVFk9VGhlIGNsaWVudCBwcm9qZWN0IHswfSBjYW5ub3QgYmUgZW1wdHkuIFNlbGVjdCBhIGNsaWVudCBwcm9qZWN0IHswfS4KLU1TR19DTElFTlRfUFJPSkVDVF9UWVBFX0VNUFRZPVNlbGVjdCBhIGNsaWVudCBwcm9qZWN0IHR5cGUuCi1NU0dfQ0xJRU5UX0VBUl9FTVBUWT1UaGUgY2xpZW50IEVBUiB7MH0gY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBjbGllbnQgRUFSIHswfS4KLQotTVNHX0lOVkFMSURfRUpCX1BST0pFQ1Q9ezB9IGlzIG5vdCBhbiBFSkIgcHJvamVjdC4gQ2hvb3NlIGFuIEVKQiBwcm9qZWN0LCBvciBlbnRlciBhIG5ldyBFSkIgcHJvamVjdCBuYW1lLgotTVNHX0lOVkFMSURfV0VCX1BST0pFQ1Q9ezB9IGlzIG5vdCBhIFdlYiBwcm9qZWN0LiBDaG9vc2UgYSBXZWIgcHJvamVjdCwgb3IgZW50ZXIgYSBuZXcgV2ViIHByb2plY3QgbmFtZS4KLU1TR19JTlZBTElEX1BST0pFQ1RfVFlQRT17MH0gaXMgbm90IGEgezF9IHByb2plY3QuIENob29zZSBhIHsxfSBwcm9qZWN0LCBvciBlbnRlciBhIG5ldyBwcm9qZWN0IG5hbWUuCi1NU0dfTU9EVUxFPW1vZHVsZQotTVNHX01PRFVMRV9OQU1FX0FORF9QUk9KRUNUX05BTUVfTk9UX1RIRV9TQU1FPVRoZSBmbGV4aWJsZSBwcm9qZWN0IHByZWZlcmVuY2UgaXMgb2ZmLiBUaGVyZWZvcmUsIHByb2plY3QgbmFtZXMgYW5kIG1vZHVsZSBuYW1lcyBtdXN0IGJlIHRoZSBzYW1lIGZvciBuZXcgbW9kdWxlcy4KLQotTVNHX1NFUlZJQ0VfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX1BST0pFQ1Q9VGhlIHswfSBXZWIgc2VydmljZSBydW50aW1lIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlcnZpY2UgcHJvamVjdCB7MX0uCi1NU0dfU0VSVklDRV9TRVJWRVJfRE9FU19OT1RfU1VQUE9SVF9QUk9KRUNUPVRoZSB7MH0gc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlcnZpY2UgcHJvamVjdCB7MX0uIAotTVNHX1NFUlZJQ0VfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX1RFTVBMQVRFPVRoZSB7MH0gV2ViIHNlcnZpY2UgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZXJ2aWNlIHByb2plY3QgdHlwZSB7MX0uCi1NU0dfU0VSVklDRV9TRVJWRVJfRE9FU19OT1RfU1VQUE9SVF9URU1QTEFURT1UaGUgezB9IHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZXJ2aWNlIHByb2plY3QgdHlwZSB7MX0uCi0KLU1TR19DTElFTlRfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX1BST0pFQ1Q9VGhlIHswfSBXZWIgc2VydmljZSBydW50aW1lIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNsaWVudCBwcm9qZWN0IHsxfS4KLU1TR19DTElFTlRfU0VSVkVSX0RPRVNfTk9UX1NVUFBPUlRfUFJPSkVDVD1UaGUgezB9IHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjbGllbnQgcHJvamVjdCB7MX0uCi1NU0dfQ0xJRU5UX1JVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9URU1QTEFURT1UaGUgezB9IFdlYiBzZXJ2aWNlIHJ1bnRpbWUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2xpZW50IHByb2plY3QgdHlwZSB7MX0uCi1NU0dfQ0xJRU5UX1NFUlZFUl9ET0VTX05PVF9TVVBQT1JUX1RFTVBMQVRFPVRoZSB7MH0gc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNsaWVudCBwcm9qZWN0IHR5cGUgezF9LgotCi1NU0dfU0FNRV9DTElFTlRfQU5EX1NFUlZJQ0VfRUFSUz1Zb3VyIHNlbGVjdGVkIHNlcnZpY2UgYW5kIGNsaWVudCB7MH0gbW9kdWxlcyBoYXZlIHRoZSBzYW1lIG5hbWUuICBQcm9jZWVkaW5nIHdpdGggdGhpcyBjb25maWd1cmF0aW9uIG1heSByZXN1bHQgaW4gcnVudGltZSBlcnJvcnMuCi1NU0dfU0FNRV9DTElFTlRfQU5EX1NFUlZJQ0VfQ09NUE9ORU5UUz1Zb3VyIHNlbGVjdGVkIHNlcnZpY2UgYW5kIGNsaWVudCB7MH0gbW9kdWxlcyBoYXZlIHRoZSBzYW1lIG5hbWUuICBQcm9jZWVkaW5nIHdpdGggdGhpcyBjb25maWd1cmF0aW9uIHdpbGwgcmVzdWx0IGluIHJ1bnRpbWUgZXJyb3JzLgotTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX1BST0pFQ1RTPVlvdXIgc2VsZWN0ZWQgc2VydmljZSBhbmQgY2xpZW50IHByb2plY3RzIGFyZSB0aGUgc2FtZS4gIFByb2NlZWRpbmcgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gZXJyb3JzLgotTVNHX1dST05HX0NMSUVOVF9QUk9KRUNUX1RZUEU9VGhlIHNlbGVjdGVkIGNsaWVudCBwcm9qZWN0LCB7MH0sIGlzIG5vdCBhIHsxfSBwcm9qZWN0LiBQbGVhc2Ugc2VsZWN0IGEgezF9IHByb2plY3Qgb3IgZW50ZXIgYSBuZXcgcHJvamVjdCBuYW1lLgotTVNHX0NMSUVOVF9TVUI9Y2xpZW50Ci1NU0dfU0VSVklDRV9TVUI9c2VydmljZQotTVNHX0dFTkVSQUxfUFJPSkVDVF9BTkRfRUFSPVNlbGVjdCB0aGUgezB9IHByb2plY3QgYW5kIHRoZSBFQVIgcHJvamVjdCB3aXRoIHdoaWNoIHlvdSB3YW50IGl0IHRvIGJlIGFzc29jaWF0ZWQuCi1NU0dfRUFSX1BST0pFQ1RfV0lMTF9CRV9DUkVBVEVEPUlmIGFuIEVBUiBvciBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIGN1cnJlbnRseSB1bmFzc29jaWF0ZWQsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgXG5hc3NvY2lhdGVkIGFzIHJlcXVpcmVkIHdoZW4geW91IGNsaWNrIE5leHQuCi0KLU1TR19FQVJfV0lMTF9CRV9BU1NPQ0lBVEVEPVRoZSBzZWxlY3RlZCB7MH0gcHJvamVjdCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgRUFSIHByb2plY3QuCi1NU0dfUFJPSkVDVF9XSUxMX0JFX0NSRUFURUQ9VGhlIHswfSBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBFQVIgcHJvamVjdC4KLU1TR19FQVJfV0lMTF9CRV9DUkVBVEVEPVRoZSB7MH0gRUFSIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi1NU0dfUFJPSkVDVF9BTkRfRUFSX0NSRUFURUQ9VGhlIHswfSBwcm9qZWN0IGFuZCBFQVIgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCBvbmUgYW5vdGhlci4KLQotTVNHX0NMSUVOVF9DQU5OT1RfQVNTT0NJQVRFPVRoZSBjbGllbnQgcHJvamVjdCwgezB9LCBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBFQVIsIHsxfS4gQ2hvb3NlIGFuIEVBUiB3aXRoIGEgSjJFRSBsZXZlbCBvZiB7Mn0gb3IgaGlnaGVyLgotTVNHX1NFUlZJQ0VfQ0FOTk9UX0FTU09DSUFURT1UaGUgc2VydmljZSBwcm9qZWN0LCB7MH0sIGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIEVBUiwgezF9LiBDaG9vc2UgYW4gRUFSIHdpdGggYSBKMkVFIGxldmVsIG9mIHsyfSBvciBoaWdoZXIuCi0KLU1TR19QUk9KRUNUX01VU1RfRVhJU1Q9Tm8gc2VydmVyIGNhbiBiZSBmb3VuZCBhbmQgezB9IGRvZXMgbm90IGV4aXN0LiBDaG9vc2UgYW4gZXhpc3RpbmcgcHJvamVjdCBvciB1c2UgdGhlIHByZWZlcmVuY2VzIHRvIGNvbmZpZ3VyZSBhIHNlcnZlciBydW50aW1lLiAgCi0KLQotIyBXZWJTZXJ2aWNlQ2xpZW50UnVudGltZVNlbGVjdGlvblBhZ2UKLVBBR0VfVElUTEVfV1NfQ0xJRU5UX1JVTlRJTUVfU0VMRUNUSU9OPUNsaWVudCBFbnZpcm9ubWVudCBDb25maWd1cmF0aW9uCi1QQUdFX0RFU0NfV1NfQ0xJRU5UX1JVTlRJTUVfU0VMRUNUSU9OPUNob29zZSBmcm9tIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBydW50aW1lcyBhbmQgc2VydmVycyBmb3IgdGhlIGNsaWVudCBlbnZpcm9ubWVudCwgb3IgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzLgotCi1MQUJFTF9DTElFTlRfU0VMRUNUSU9OX1ZJRVdfVElUTEU9Q2xpZW50LVNpZGUgRW52aXJvbm1lbnQgU2VsZWN0aW9uOgotTEFCRUxfQ0xJRU5UX1RZUEU9Q2xpZW50IFByb2plY3QgdHlwZToKLUxBQkVMX1NFUlZJQ0VfVFlQRT1TZXJ2aWNlIFByb2plY3QgdHlwZToKLUxBQkVMX1dFQj1XZWIKLUxBQkVMX0VKQj1FSkIKLUxBQkVMX05PX0xBQkVMPQotCi0jCi0jIEl0ZW1zIGNvbW1vbiB0byBXZWJTZXJ2aWNlTWFwcGluZ3NQYWdlLCBXZWJTZXJ2aWNlTWFwcGluZ3NQYWdlIChjbGllbnQpLCBhbmQgV2ViU2VydmljZVNPQVBCaW5kaW5nUGFnZQotIwotUEFHRV9NU0dfVkFMSURBVElPTl9JTlRFUk5BTF9FUlJPUj1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFnZSB2YWxpZGF0aW9uLiBTZWUgbG9ncyBmb3IgZGV0YWlscy4KLQotIwotIyBXZWJTZXJ2aWNlTWFwcGluZ3NQYWdlCi0jCi1QQUdFX1RJVExFX1dTX1hNTDJCRUFOPVdlYiBTZXJ2aWNlIFNrZWxldG9uIFhNTCB0byBKYXZhIE1hcHBpbmdzCi1QQUdFX0RFU0NfTjJQX01BUFBJTkdTPURlZmluZSBjdXN0b20gbWFwcGluZyBmb3IgbmFtZXNwYWNlIHRvIHBhY2thZ2UuCi1NU0dfTUFQUElOR19EVVBMSUNBVEVfRU5UUklFUz1EdXBsaWNhdGUgezB9IG1hcHBlZCB0byB0aGUgc2FtZSB7MX0uCi0KLQotIwotIyBUaGUgdHdvIElURU1fKiBzdHJpbmdzIGFyZSBlbnRyaWVzIGluIGEgbGlzdCBib3ggb2YgbWFwcGluZ3MuCi0jIFRoZXJlIGFyZSB0d28gZm9ybXMsIG9uZSB3aGVuIHRoZSBwYWdlIGlzIGluIEphdmEtdG8tWE1MIG1vZGU6Ci0jICAgPGphdmEtYmVhbi1uYW1lPiwgPGVuY29kaW5nLXN0eWxlPgotIyBhbmQgb25lIHdoZW4gdGhlIHBhZ2UgaXMgaW4gWE1MLXRvLUphdmEgbW9kZToKLSMgICA8eG1sLW5hbWVzcGFjZS11cmk+Ojx4bWwtc2hvcnQtbmFtZT4sIDxlbmNvZGluZy1zdHlsZT4KLSMgd2hlcmU6Ci0jICAgPGphdmEtYmVhbi1uYW1lPiBpcyBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLSMgICA8eG1sLW5hbWVzcGFjZS11cmk+IGlzIHRoZSBuYW1lc3BhY2Ugb2YgYW4gWE1MIHR5cGUKLSMgICA8eG1sLXNob3J0LW5hbWU+IGlzIHRoZSBYTUwgdHlwZSBuYW1lIHdpdGhpbiB0aGUgbmFtZXNwYWNlCi0jICAgPGVuY29kaW5nLXN0eWxlPiBpcyB0aGUgZW5jb2Rpbmcgc3R5bGUgKFNPQVAgb3IgTGl0ZXJhbCBYTUwpCi0jCi0KLSMKLSMgV2ViU2VydmljZVByb3h5UGFnZQotIwotQlVUVE9OX0dFTkVSQVRFX1BST1hZPSZHZW5lcmF0ZSBhIHByb3h5Ci0KLSMKLSMgV2ViU2VydmljZVNrZWxldG9uQ29uZmlnUGFnZQotIwotUEFHRV9ERVNDX1dTU0tFTF9DT05GSUc9RGVmaW5lIGEgc2tlbGV0b24gSmF2YSBiZWFuIGFzIGEgV2ViIHNlcnZpY2UuCi1QQUdFX1RJVExFX1dTU0tFTF9DT05GSUc9V2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24KLVRPT0xUSVBfUEJTQ19URVhUX1NLRUxFVE9OX0ZPTERFUj1Gb2xkZXIgZm9yIGdlbmVyYXRlZCBKYXZhIHNrZWxldG9uLgotVE9PTFRJUF9QQlNDX0JVVFRPTl9TS0VMRVRPTl9GT0xERVJfQlJPV1NFPUJyb3dzZSBmb2xkZXJzLgotTEFCRUxfU0tFTEVUT05fUk9PVF9OQU1FPVNrZWxldG9uIGZvbGRlcjoKLQotIwotIyBXZWJTZXJ2aWNlQmVhbkNsYXNzUGFnZQotIwotTEFCRUxfQkVBTl9DTEFTU19OQU1FPUJlYW46Ci1QQUdFX01TR19CRUFOX0NBTk5PVF9CRV9FTVBUWT1QbGVhc2Ugc2VsZWN0IGEgSmF2YSBiZWFuIGNsYXNzLgotQlVUVE9OX0JST1dTRV9DTEFTU0VTPUJyb3dzZSBjbGFzc2VzLi4uCi0KLQotIwotIyBXZWJTZXJ2aWNlVGVzdFBhZ2UKLSMKLVBBR0VfVElUTEVfV1NURVNUPVRlc3QgV2ViIFNlcnZpY2UKLVBBR0VfREVTQ19XU1RFU1Q9U2VsZWN0IGEgdGVzdCBmYWNpbGl0eQotQ0hFQ0tCT1hfVEVTVF9XRUJTRVJWSUNFPSZUZXN0IHRoZSBXZWIgc2VydmljZQotQ0hFQ0tCT1hfTU9OSVRPUl9XRUJTRVJWSUNFPSZNb25pdG9yIHRoZSBXZWIgc2VydmljZQotQ0hFQ0tCT1hfT1ZFUldSSVRFX0ZJTEVTPSZPdmVyd3JpdGUgZmlsZXMgd2l0aG91dCB3YXJuaW5nCi1NU0dfRVJST1JfVU5BQkxFX1RPX0xBVU5DSF9XU0RMX1RFU1Q9QW4gZXJyb3Igb2NjdXJyZWQuIFVuYWJsZSB0byBsYXVuY2ggV1NETCB0ZXN0IGZhY2lsaXR5LgotCi0jCi0jIFdlYlNlcnZpY2VFeHBsb3JlclBhZ2UKLSMKLUJVVFRPTl9MQVVOQ0hfU0VSVklDRV9URVNUPUxhdW5jaAotCi0jCi0jIFdlYlNlcnZpY2VDbGllbnRUZXN0UGFnZQotIwotUEFHRV9USVRMRV9XU19TQU1QTEU9V2ViIFNlcnZpY2UgQ2xpZW50IFRlc3QKLVBBR0VfREVTQ19XU19TQU1QTEU9RG8geW91IHdhbnQgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5PwotQlVUVE9OX1RFU1Q9VGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5Ci1MQUJFTF9URVNUX1RZUEVTPVRlc3QgZmFjaWxpdHkKLUJVVFRPTl9SVU5fVEVTVD1SdW4gdGVzdCBvbiBzZXJ2ZXIKLUxBQkVMX01FVEhPRFM9TWV0aG9kcwotTEFCRUxfSlNQX1BST0pFQ1RfTkFNRT1KU1AgcHJvamVjdDoKLU1TR19FUlJPUl9KVFNfUFJPWFlfTk9UX0NPTVBJTEVEPUlXQUIwMzU3RSBUaGUgR2VuZXJhdGVkIHByb3h5IHdhcyBub3QgZm91bmQuIFdlYlNlcnZpY2Ugc2FtcGxlIGpzcHMgY2Fubm90IGJlIGdlbmVyYXRlZC4KLU1TR19FUlJPUl9NQUxGT1JNRURfVVJMPUlXQUIwMzU4RSBUZXN0IGNsaWVudCBVUkwgaXMgbWFsZm9ybWVkLgotTVNHX0VSUk9SX01PRFVMRV9ERVBFTkRFTkNZPVVuYWJsZSB0byBlc3RhYmxpc2ggbW9kdWxlIGRlcGVuZGVuY3kgZnJvbSB7MH0gdG8gezF9LgotCi0jCi0jIFdlYlNlcnZpY2VCZWFuTWV0aG9kc1BhZ2UKLSMKLUJVVFRPTl9TRUxFQ1RfQUxMPVNlbGVjdCBBbGwKLUJVVFRPTl9ERVNFTEVDVF9BTEw9RGVzZWxlY3QgQWxsCi1UT09MVElQX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEw9U2VsZWN0IGFsbCBtZXRob2RzCi1UT09MVElQX1BCTUVfQlVUVE9OX0RFU0VMRUNUX0FMTD1EZXNlbGVjdCBhbGwgbWV0aG9kcwotCi0jCi0jIFdlYlNlcnZpY2VXU0RMU2VsZWN0aW9uUGFnZQotIwotUEFHRV9USVRMRV9XU0RMX1NFTEVDVElPTj1XZWIgU2VydmljZSBXU0RMIEZpbGUgU2VsZWN0aW9uCi1QQUdFX0RFU0NfV1NETF9TRUxFQ1RJT049U2VsZWN0IGEgV1NETCBmaWxlLgotCi0jCi0jIFdlYlNlcnZpY2VQdWJsaXNoUGFnZQotIwotUEFHRV9USVRMRV9XU19QVUJMSVNIPVdlYiBTZXJ2aWNlIFB1YmxpY2F0aW9uCi1QQUdFX0RFU0NfV1NfUFVCTElTSD1EbyB5b3Ugd2FudCB0byBwdWJsaXNoIHlvdXIgV2ViIHNlcnZpY2U/Ci1QQUdFX1RJVExFX1dTX0ZJTkQ9RmluZCBhIFdlYiBzZXJ2aWNlCi1QQUdFX0RFU0NfV1NfRklORD1EbyB5b3Ugd2FudCB0byBmaW5kIGEgV2ViIHNlcnZpY2U/Ci1CVVRUT05fV1NfUFVCTElTSD0mTGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIgdG8gcHVibGlzaCB0aGlzIFdlYiBzZXJ2aWNlIHRvIGEgVURESSBSZWdpc3RyeQotQlVUVE9OX1dTX1BVQkxJU0hfUFJJVkFURV9VRERJPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIHB1Ymxpc2ggdGhpcyBXZWIgc2VydmljZSB0byB0aGUgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLUJVVFRPTl9XU19GSU5EPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIGZpbmQgYSBXZWIgc2VydmljZSBmcm9tIGEgVURESSBSZWdpc3RyeQotQlVUVE9OX1dTX0ZJTkRfUFJJVkFURV9VRERJPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIGZpbmQgYSBXZWIgc2VydmljZSBmcm9tIHRoZSBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotTEFCRUxfUFVCTElDX1VERElfUkVHSVNUUklFUz1QdWJsaWMgVURESSBSZWdpc3RyeQotCi0jCi0jIEVKQiBVSSBzdHJpbmdzCi0jCi1MQUJFTF9FSkJfQkVBTl9OQU1FPUVKQiBiZWFuCi1UQUJMRV9USVRMRV9FSkJfQkVBTl9OQU1FUz1TdGF0ZWxlc3MgRUpCIGJlYW5zCi1UQUJMRV9USVRMRV9FSkJfUFJPSkVDVF9OQU1FPUVKQiBwcm9qZWN0Ci1MQUJFTF9FQVJfUFJPSkVDVFM9RUFSIHByb2plY3RzCi1UT09MVElQX0VBUl9QUk9KRUNUUz1FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzLgotVE9PTFRJUF9UQUJMRV9CRUFOX05BTUVTPVNlbGVjdCBhbiBFSkIuCi1MQUJFTF9TSE9XX0FMTF9TVEFURUxFU1NfU0VTU0lPTl9FSkJTPTw8U2hvdyBhbGwgc3RhdGVsZXNzIHNlc3Npb24gRUpCcz4+Ci0KLSMKLSMgVG9vbHRpcHMgZm9yIFdlYlNlcnZpY2VXU0RMU2VsZWN0aW9uUGFnZQotIwotVE9PTFRJUF9QV1dTX1BBR0U9Ci0KLSMKLSMgVG9vbHRpcHMgZm9yIFdlYiBTZXJ2aWNlIFdpemFyZCBTY2VuYXJpbyBQYWdlCi0jCi1CVVRUT05fV1NXU0NFTl9QVUJMSVNIPSZQdWJsaXNoIHRoZSBXZWIgc2VydmljZQotVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0RFVkVMT1A9RGV2ZWxvcAotVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0FTU0VNQkxFPUFzc2VtYmxlCi1UT09MVElQX1dTV1NDRU5fU0NBTEVfREVQTE9ZPURlcGxveQotVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0lOU1RBTEw9SW5zdGFsbAotVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1JVTj1TdGFydAotVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1RFU1Q9VGVzdAotVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1NFUlZJQ0U9TW92ZSB0aGUgc2xpZGVyIHRvIHNldCB0aGUgbGV2ZWwgb2Ygc2VydmljZSBnZW5lcmF0aW9uLgotVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0NMSUVOVD1Nb3ZlIHRoZSBzbGlkZXIgdG8gc2V0IHRoZSBsZXZlbCBvZiBjbGllbnQgZ2VuZXJhdGlvbi4gU2VydmljZSBtdXN0IGJlIHN0YXJ0ZWQgdG8gZW5hYmxlIGNsaWVudCBnZW5lcmF0aW9uLgotVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0NMSUVOVF9PTkxZPU1vdmUgdGhlIHNsaWRlciB0byBzZXQgdGhlIGxldmVsIG9mIGNsaWVudCBnZW5lcmF0aW9uLiAKLVRPT0xUSVBfV1NXU0NFTl9URVhUX0lNUEw9SW1wbGVtZW50YXRpb24gZm9yIHRoZSB3ZWIgc2VydmljZS4KLVRPT0xUSVBfV1NXU0NFTl9CVVRUT05fQlJPV1NFX0lNUEw9QnJvd3NlIGltcGxlbWVudGF0aW9uIGZpbGVzIGZvciBzcGVjaWZpZWQgc2VydmljZSB0eXBlLgotVE9PTFRJUF9XU1dTQ0VOX0JVVFRPTl9PVkVSV1JJVEVfRklMRVM9RXhpc3RpbmcgZmlsZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIG5vIHdhcm5pbmcgZHVyaW5nIGdlbmVyYXRpb24uCi0KLSMKLSMgVG9vbHRpcHMgZm9yIGJlYW5zLldlYlNlcnZpY2VCZWFuQ2xhc3NQYWdlCi0jCi1UT09MVElQX1BCQ0xfUEFHRT0KLVRPT0xUSVBfUEJDTF9URVhUX0JFQU5fQ0xBU1M9U2VsZWN0ZWQgSmF2YSBiZWFuLgotVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRT1Ccm93c2UgY2xhc3Nlcy4KLVRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9SRVNPVVJDRV9CUk9XU0U9QnJvd3NlIEphdmEgZmlsZXMuCi0KLSMKLSMgVG9vbHRpcHMgZm9yIGJlYW5zLldlYlNlcnZpY2VUZXN0UGFnZQotIwotVE9PTFRJUF9QU1RQX0NPTUJPQk9YX1RFU1Q9VGVzdCBmYWNpbGl0aWVzIGF2YWlsYWJsZSB0byB0ZXN0IHRoZSBzZXJ2aWNlLgotVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT049TGF1bmNoIHRoZSBzZWxlY3RlZCB0ZXN0IGZhY2lsaXR5LgotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlUnVudGltZVNlbGVjdGlvblBhZ2UKLSMKLVRPT0xUSVBfUFdSU19QQUdFPQotVE9PTFRJUF9QV1JTX0xJU1RfUlVOVElNRVM9U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBkZXBsb3ltZW50IHJ1bnRpbWUocykuCi1UT09MVElQX1BXUlNfTElTVF9TRVJWRVJTPVNlbGVjdCBmcm9tIGFwcGxpY2F0aW9uIHNlcnZlcihzKS4KLVRPT0xUSVBfUFdSU19SQURJT19TRVJWRVI9U2VydmVyIG9yaWVudGVkIHNlbGVjdGlvbi4KLVRPT0xUSVBfUFdSU19SQURJT19SVU5USU1FPVJ1bnRpbWUgb3JpZW50ZWQgc2VsZWN0aW9uLgotVE9PTFRJUF9QV1JTX1JBRElPX0VYUExPUkU9RXhwbG9yZSBjb21iaW5hdGlvbnMuCi0KLSMKLSMgVG9vbHRpcHMgZm9yIFdlYlNlcnZpY2VDbGllbnRSdW50aW1lU2VsZWN0aW9uUGFnZQotIwotVE9PTFRJUF9QV0NSX0NPTUJPX0NMSUVOVF9UWVBFPUNsaWVudCBwcm9qZWN0IHR5cGUuCi1UT09MVElQX1BXQ1JfQ09NQk9fU0VSVklDRV9UWVBFPVNlcnZpY2UgcHJvamVjdCB0eXBlLgotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlUHJvamVjdFBhZ2UKLSMKLVRPT0xUSVBfUFdQUl9DT01CT19UWVBFPVdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHR5cGUuCi1UT09MVElQX1BXUFJfR1JPVVBfU0NFTkFSSU9fU0VSVklDRT1TZXJ2aWNlIGRlZmF1bHRzIGZvciB0aGlzIHdpemFyZCBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DSEVDS0JPWF9HRU5FUkFURV9QUk9YWT1FbmFibGUvZGlzYWJsZSBwcm94eSBnZW5lcmF0aW9uIGZvciB0aGlzIHNjZW5hcmlvLgotVE9PTFRJUF9QV1BSX0NIRUNLQk9YX1NUQVJUX1dFQl9QUk9KRUNUPVN0YXJ0IFdlYiBzZXJ2aWNlIGluIFdlYiBwcm9qZWN0IGZvciB0aGlzIHNjZW5hcmlvLgotVE9PTFRJUF9QV1BSX0NIRUNLQk9YX0lOU1RBTExfU0VSVklDRV9XRUJfUFJPSkVDVD1JbnN0YWxsIHRoZSBXZWIgc2VydmljZSBvbiB0aGUgc2VydmVyIGZvciB0aGlzIHNjZW5hcmlvLgotVE9PTFRJUF9QV1BSX0NIRUNLQk9YX0lOU1RBTExfQ0xJRU5UX1dFQl9QUk9KRUNUPUluc3RhbGwgdGhlIFdlYiBzZXJ2aWNlIGNsaWVudCBvbiB0aGUgc2VydmVyIGZvciB0aGlzIHNjZW5hcmlvIChtYW5hZ2VkIGNsaWVudCBvbmx5KS4gCi1UT09MVElQX1BXUFJfQ0hFQ0tCT1hfTEFVTkNIX1dTPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIHB1Ymxpc2ggdGhlIFdlYiBzZXJ2aWNlIGluIHRoaXMgc2NlbmFyaW8gdG8gYSBVRERJIFJlZ2lzdHJ5LgotVE9PTFRJUF9QV1BSX0NIRUNLQk9YX1RFU1RfU0VSVklDRT1TZWxlY3QgdGhpcyB0byBleHBsb3JlIHRoZSBXZWIgc2VydmljZSBjcmVhdGVkLgotVE9PTFRJUF9QV1BSX0NIRUNLQk9YX01PTklUT1JfU0VSVklDRT1TZWxlY3QgdGhpcyB0byBtb25pdG9yIHRoZSBTT0FQIHRyYWZmaWMgb2YgdGhpcyBXZWIgc2VydmljZS4KLVRPT0xUSVBfUFdQUl9HUk9VUF9TQ0VOQVJJT19DTElFTlQ9Q2xpZW50IHByb3h5IGRlZmF1bHRzIGZvciB0aGlzIHdpemFyZCBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DT01CT19DTElFTlRUWVBFPUNsaWVudCBwcm94eSBzZWxlY3Rpb24gdHlwZS4KLQotIwotIyBUb29sdGlwcyBmb3IgV2ViU2VydmljZVB1Ymxpc2hQYWdlCi0jCi1UT09MVElQX1BXUEJfUEFHRT0KLVRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0g9UHVibGlzaCB0aGUgV2ViIHNlcnZpY2UuCi0KLSMKLSMgV1NJTCBwcm94eQotIwotUEFHRV9XU0lMX0lNUE9SVD1XU0lMIEltcG9ydCBQYWdlCi1USVRMRV9XU0lMX0lNUE9SVD1XU0lMIEltcG9ydAotREVTQ19XU0lMX0lNUE9SVD1JbXBvcnQgV1NETCByZWZlcmVuY2VzIHRvIGEgV1NJTCBkb2N1bWVudAotUEFHRV9USVRMRV9XU19TRUxFQ1RJT049V2ViIFNlcnZpY2UgU2VsZWN0aW9uIFBhZ2UKLVBBR0VfREVTQ19XU19TRUxFQ1RJT049RW50ZXIgYSB3ZWIgc2VydmljZSBVUkkuCi0KLVBBR0VfTVNHX0xPQURJTkdfV0VCX1NFUlZJQ0VfVVJJPUxvYWRpbmcgV2ViIHNlcnZpY2UgVVJJLi4uCi1QQUdFX01TR19JTlZBTElEX1dFQl9TRVJWSUNFX1VSST1JbnZhbGlkIFdlYiBzZXJ2aWNlIFVSSS4gIEVudGVyIGEgVVJJIHRvIGEgV1NETCwgV1NJTCBvciBIVE1MIGRvY3VtZW50LgotUEFHRV9NU0dfTk9fU1VDSF9GSUxFPUZpbGUgInswfSIgZG9lcyBub3QgZXhpc3QuCi1QQUdFX01TR19TRUxFQ1RJT05fTVVTVF9CRV9XU0RMPVNlbGVjdGlvbiBtdXN0IGJlIFdTREwuCi1QQUdFX01TR19JTlZBTElEX1dTSUxfRklMRV9OQU1FPUludmFsaWQgV1NJTCBmaWxlIG5hbWUuICBXU0lMIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIC53c2lsCi0KLU1TR19FUlJPUl9VUklfTk9UX1JFU09MVkFCTEU9SVdBQjA0NjlFICJ7MH0iIGlzIG5vdCByZXNvbHZhYmxlLgotTVNHX0VSUk9SX1dTRExfSEFTX05PX1NFUlZJQ0VfRUxFTUVOVD1JV0FCMDU1MUUgV1NETCBmaWxlIGF0IHswfSBoYXMgbm8gc2VydmljZSBlbGVtZW50LgotCi1MQUJFTF9XU0lMX1VSST1XU0lMIFVSSToKLUxBQkVMX0JST1dTRT1Ccm93c2UKLUxBQkVMX1dTREw9V1NETDoKLUxBQkVMX1dTRExfVVJJPVdTREwgVVJJCi1MQUJFTF9JTVBPUlQ9SW1wb3J0Li4uCi1MQUJFTF9BREQ9QWRkCi1MQUJFTF9SRU1PVkU9UmVtb3ZlCi1MQUJFTF9XU19TRUxFQ1RJT049RW50ZXIgYSBVUkkgdG8gYSBXU0RMLCBXU0lMIG9yIEhUTUwgZG9jdW1lbnQ6Ci1MQUJFTF9TRUxFQ1RfV1NETD1TZWxlY3QgYSBXU0RMCi1MQUJFTF9WQUxJREFURV9NRVNTQUdFUz1XU0RMIHZhbGlkYXRpb24gbWVzc2FnZXM6Ci0KLVRPT0xUSVBfV1NJTF9JTVBPUlRfUEFHRT1UaGlzIHBhZ2UgYWxsb3dzIHlvdSB0byBhZGQgV1NETCByZWZlcmVuY2VzIHRvIGEgV1NJTCBkb2N1bWVudC4KLVRPT0xUSVBfV1NJTF9URVhUX1dTSUw9RW50ZXIgdGhlIGxvY2F0aW9uIG9mIGEgbmV3IG9yIGV4aXN0aW5nIFdTSUwgZG9jdW1lbnQuCi1UT09MVElQX1dTSUxfQlVUVE9OX0JST1dTRV9XU0lMPUJyb3dzZSBmb3IgYSBXU0lMIGRvY3VtZW50LgotVE9PTFRJUF9XU0lMX1RBQkxFX1dTREw9RW50ZXIgdGhlIFVSSXMgb2YgdGhlIFdTRExzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGFkZGVkIGFzIHNlcnZpY2UgcmVmZXJlbmNlcy4KLVRPT0xUSVBfUENPTl9QQUdFPVNlbGVjdCBhIHdlYiBzZXJ2aWNlIGZvciBjb25zdW1wdGlvbi4KLVRPT0xUSVBfUENPTl9URVhUX1dTPUVudGVyIGEgVVJJIHRvIGEgV1NETCwgV1NJTCBvciBIVE1MIGRvY3VtZW50LgotVE9PTFRJUF9QQ09OX0JVVFRPTl9CUk9XU0VfV1M9QnJvd3NlIGZvciBhIHdlYiBzZXJ2aWNlIHJlc291cmNlLgotVE9PTFRJUF9WQUxJREFURV9URVhUX01FU1NBR0U9TWVzc2FnZXMgZnJvbSBXU0RMIHZhbGlkYXRpb24uCi1UT09MVElQX1RBQkxFX1ZBTElEQVRFX01FU1NBR0U9VXNlIHRoZSBXZWIgU2VydmljZSBQcm9maWxlIENvbXBsaWFuY2UgYW5kIFZhbGlkYXRpb24gcHJlZmVyZW5jZSB0byBlbmFibGUgb3IgZGlzYWJsZSBXU0RMIHZhbGlkYXRpb24uCi0KLSMKLSMgVGFibGUgY29sdW1uIGhlYWRpbmcgZm9yIFZhbGlkYXRpb25NZXNzYWdlVmlld2VyV2lkZ2V0Ci0jCi1UQUJMRV9DT0xVTU5fVkFMSURBVElPTl9TRVZFUklUWT1TZXZlcml0eQotVEFCTEVfQ09MVU1OX1ZBTElEQVRJT05fTElORT1MaW5lCi1UQUJMRV9DT0xVTU5fVkFMSURBVElPTl9DT0xVTU49Q29sdW1uCi1UQUJMRV9DT0xVTU5fVkFMSURBVElPTl9NRVNTQUdFPU1lc3NhZ2UKLSMKLSMgVG9vbHRpcHMgZm9yIGNsaWVudC5XZWJTZXJ2aWNlQ2xpZW5UZXN0UGFnZQotIwotVE9PTFRJUF9QV1NNX1BBR0U9Ci1UT09MVElQX1BXU01fQ0hFQ0tCT1hfVEVTVD1FbmFibGUvZGlzYWJsZSBUZXN0LgotVE9PTFRJUF9QV1NNX0NPTUJPQk9YX1RFU1Q9U2VsZWN0IHRoZSB0ZXN0IHR5cGUuCi1UT09MVElQX1BXU01fQ0hFQ0tCT1hfTEFVTkNIPVJ1biB0ZXN0IG9uIGEgc2VydmVyLgotVE9PTFRJUF9QV1NNX1RFWFRfSlNQX0ZPTERFUj1EZXN0aW5hdGlvbiBmb2xkZXIgb2YgZ2VuZXJhdGVkIHNhbXBsZSBmaWxlcy4KLVRPT0xUSVBfUFdTTV9CVVRUT05fSlNQX0ZPTERFUl9CUk9XU0U9QnJvd3NlIGZvbGRlcnMuCi1UT09MVElQX1BXU01fQlVUVE9OX1NFTEVDVF9BTEw9U2VsZWN0IGFsbCBtZXRob2RzLgotVE9PTFRJUF9QV1NNX0JVVFRPTl9ERVNFTEVDVF9BTEw9RGVzZWxlY3QgYWxsIG1ldGhvZHMuCi1UT09MVElQX1BXU01fQ09NQk9fUFJPSkVDVD1XZWIgcHJvamVjdCBmb3IgZ2VuZXJhdGVkIHNhbXBsZS4KLVRPT0xUSVBfUFdTTV9URVhUX1NBTVBMRV9GT0xERVI9RGVzdGluYXRpb24gZm9sZGVyIG9mIGdlbmVyYXRlZCBzYW1wbGUgZmlsZXMuCi1UT09MVElQX1BXU01fVFJFRV9NRVRIT0RTPU1ldGhvZHMgdG8gZ2VuZXJhdGUgaW50byB0aGUgc2FtcGxlLgotVE9PTFRJUF9QV1NNX0VBUl9QUk9KRUNUPUVBUiBwcm9qZWN0IGZvciB0aGUgZ2VuZXJhdGVkIHNhbXBsZS4KLQotIwotIyBIVFRQIEJhc2ljIEF1dGgKLSMKLURJQUxPR19USVRMRV9IVFRQX0JBU0lDX0FVVEg9SFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbgotTEFCRUxfVVJMPVVSTDoKLUxBQkVMX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRT1Vc2VyIG5hbWU6Ci1MQUJFTF9IVFRQX0JBU0lDX0FVVEhfUEFTU1dPUkQ9UGFzc3dvcmQ6Ci0KLVRPT0xUSVBfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FPUVudGVyIHlvdXIgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiB1c2VyIG5hbWUuCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRD1FbnRlciB5b3VyIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gcGFzc3dvcmQuCi0KLSMKLSMgR2VuZXJhdGUgSGFuZGxlciBTa2VsZXRvbgotIwotTVNHX0VSUk9SX0dFTkVSQVRFX0hBTkRMRVJfU0tFTEVUT049SVdBQjAzNTlFIEVycm9yIGluIGdlbmVyYXRpbmcgaGFuZGxlciBza2VsZXRvbi4KLU1TR19FUlJPUl9XUklURV9GSUxFPUlXQUIwMzYwRSBFcnJvciBpbiB3cml0aW5nIGZpbGUgezB9LgotCi0jCi0jIEhhbmRsZXJzIENvbmZpZ3VyYXRpb24gd2l6YXJkIHBhZ2UKLSMKLUxBQkVMX0hBTkRMRVJTX0NPTkZJRz1IYW5kbGVyIGNvbmZpZ3VyYXRpb24KLUxBQkVMX0JVVFRPTl9BREQ9QWRkCi1MQUJFTF9CVVRUT05fUkVNT1ZFPVJlbW92ZQotTEFCRUxfQlVUVE9OX01PVkVfVVA9TW92ZSB1cAotTEFCRUxfQlVUVE9OX01PVkVfRE9XTj1Nb3ZlIGRvd24KLUxBQkVMX0JVVFRPTl9HRU5fU0tFTEVUT049R2VuZXJhdGUgc2tlbGV0b24gY2xhc3NlcyBmb3IgbmV3IGhhbmRsZXJzCi1MQUJFTF9DT01CT19TT1VSQ0VfTE9DPU91dHB1dCBmb2xkZXI6Ci1MQUJFTF9DT01CT19XU19DTElFTlRfUkVGPUNsaWVudCBTZXJ2aWNlIFJlZmVyZW5jZXM6Ci1MQUJFTF9DT01CT19XU19TRVJWSUNFX0RFU0M9U2VydmljZSBEZXNjcmlwdGlvbnM6Ci1NU0dfVEVYVF9OVU1fT0ZfU0VSVklDRVM9WW91IGhhdmUgc2VsZWN0ZWQgezB9IHNlcnZpY2VzLgotTVNHX1RFWFRfTlVNX09GX0NMSUVOVFM9WW91IGhhdmUgc2VsZWN0ZWQgezB9IGNsaWVudCBzZXJ2aWNlcy4KLSAKLUxBQkVMX0hBTkRMRVJfTkFNRT1OYW1lCi1MQUJMRV9IQU5ETEVSX0NMQVNTPUNsYXNzIG5hbWUKLUxBQkVMX0hBTkRMRVJfUE9SVD1Qb3J0IG5hbWUKLSAKLURJQUxPR19USVRMRV9XU19BRERfSEFORExFUj1BZGQgTmV3IEhhbmRsZXIKLUxBQkVMX1RFWFRfSEFORExFUl9OQU1FPU5hbWU6Ci1MQUJFTF9URVhUX0hBTkRMRVJfQ0xBU1M9Q2xhc3MgbmFtZToKLUxBQkVMX1RFWFRfSEFORExFUl9QT1JUPVBvcnQgbmFtZToKLSAKLVBBR0VfVElUTEVfU0VSVklDRV9IRExSX0NPTkZJRz1TZXJ2aWNlIEhhbmRsZXJzIENvbmZpZ3VyYXRpb24KLVBBR0VfREVTQ19TRVJWSUNFX0hETFJfQ09ORklHPUNvbmZpZ3VyZSBzZXJ2aWNlLXNpZGUgaGFuZGxlcnMKLVBBR0VfVElUTEVfQ0xJRU5UX0hETFJfQ09ORklHPUNsaWVudCBIYW5kbGVycyBDb25maWd1cmF0aW9uCi1QQUdFX0RFU0NfQ0xJRU5UX0hETFJfQ09ORklHPUNvbmZpZ3VyZSBjbGllbnQtc2lkZSBoYW5kbGVycwotUEFHRV9ERVNDX01VTFRJUExFX1NFUlZJQ0VTX0NPTkZJRz1BZGQgaGFuZGxlcnMgdG8gbXVsdGlwbGUgV2ViIHNlcnZpY2VzLgotUEFHRV9ERVNDX01VTFRJUExFX0NMSUVOVFNfQ09ORklHPUFkZCBoYW5kbGVycyB0byBtdWx0aXBsZSBXZWIgc2VydmljZSBjbGllbnRzLgotIAotVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTPUNvbmZpZ3VyZSBXZWIgU2VydmljZSBIYW5kbGVycwotVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OPVNlbGVjdCB0byBnZW5lcmF0ZSBza2VsZXRvbiBjbGFzc2VzIGZvciBuZXcgaGFuZGxlcnMuCi1UT09MVElQX0NPTUJPX1NPVVJDRV9MT0M9U2VsZWN0IHRoZSBvdXRwdXQgbG9jYXRpb24gZm9yIGZpbGUgZ2VuZXJhdGlvbi4KLVRPT0xUSVBfVEVYVF9IQU5ETEVSX05BTUU9SGFuZGxlciBuYW1lCi1UT09MVElQX1RFWFRfSEFORExFUl9DTEFTUz1IYW5kbGVyIGNsYXNzIG5hbWUKLVRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQ9SGFuZGxlciBwb3J0IGNvbXBvbmVudCBuYW1lCi1UT09MVElQX1dTX0NMSUVOVF9SRUY9U2VsZWN0IGEgY2xpZW50IHNlcnZpY2UtcmVmZXJlbmNlIHRvIHNob3cgaXRzIGhhbmRsZXJzLgotVE9PTFRJUF9XU19TRVJWSUNFX0RFU0M9U2VsZWN0IGEgc2VydmljZSBkZXNjcmlwdGlvbiB0byBzaG93IGl0cyBoYW5kbGVycy4KLSAKLSMKLSMgQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotIwotTVNHX0VSUk9SX1dFQl9TRVJWSUNFX0NMSUVOVFNfTk9UX0ZPVU5EPU5vIFdlYiBzZXJ2aWNlIGNsaWVudHMgd2VyZSBmb3VuZC4gQ3JlYXRlIGEgV2ViIHNlcnZpY2UgY2xpZW50IGJlZm9yZSBjb25maWd1cmluZyBXZWIgc2VydmljZSBjbGllbnQgaGFuZGxlcnMuCi0gCi0jCi0jIFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kCi0jCi1NU0dfRVJST1JfV0VCX1NFUlZJQ0VTX05PVF9GT1VORD1ObyBXZWIgc2VydmljZXMgd2VyZSBmb3VuZC4gIENyZWF0ZSBhIFdlYiBzZXJ2aWNlIGJlZm9yZSBjb25maWd1cmluZyBXZWIgc2VydmljZSBoYW5kbGVycy4KLU1TR19FUlJPUl9XU0REX05PVF9GT1VORD1VbmFibGUgdG8gbGF1bmNoIGhhbmRsZXIgd2l6YXJkLiAgTm8gZGVwbG95bWVudCBkZXNjcmlwdG9yIHdhcyBmb3VuZCBmb3IgdGhpcyBXZWIgc2VydmljZS4KLU1TR19FUlJPUl9JTlZBTElEX01VTFRJUExFX1NFUlZJQ0VfU0VMRUNUPUludmFsaWQgbXVsdGlwbGUgc2VsZWN0aW9uIG9mIFNlcnZpY2VzLiAgRW5zdXJlIGFsbCBzZWxlY3Rpb25zIGFyZSBTZXJ2aWNlcy4jCi0KLSMgT3BlbkphdmFFZGl0b3JDb21tYW5kCi0jCi1NU0dfRVJST1JfVU5BQkxFX1RPX09QRU5fSkFWQV9FRElUT1I9SVdBQjAwMjlFIFVuYWJsZSB0byBvcGVuIGNsYXNzIHswfSBmcm9tIHByb2plY3QgezF9IGluIHRoZSBKYXZhIGVkaXRvci4KLQotIwotIyBDaGVja0lmU2VydmljZVByb2plY3QKLSMKLU1TR19XQVJOX0lTX1NFUlZJQ0VfUFJPSkVDVD1UaGUgc2VsZWN0ZWQgY2xpZW50IHByb2plY3QsIHswfSwgY29udGFpbnMgdGhlIFdlYiBzZXJ2aWNlLiBQcm9jZWVkaW5nIHdpdGggdGhpcyBjb25maWd1cmF0aW9uIG1heSByZXN1bHQgaW4gcnVudGltZSBlcnJvcnMgd2hlbiBpbnZva2luZyB0aGUgV2ViIHNlcnZpY2UuIFdvdWxkIHlvdSBsaWtlIHRvIHByb2NlZWQ/Ci1NU0dfVVNFUl9BQk9SVEVEPVVzZXIgcHJlc3NlZCBjYW5jZWwgaW4gd2FybmluZyBkaWFsb2cgd2hpY2ggd2FybmVkIGFib3V0IHRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCBiZWluZyB0aGUgc2VydmljZSBwcm9qZWN0LgotCi0jCi0jIE1pc3NpbmcgdGhpcmQgcGFydHkgZmlsZSBlcnJvciBtZXNzYWdlCi0jCi1NU0dfTUlTU0lOR19USElSRF9QQVJUWV9GSUxFUz1NaXNzaW5nIHRoaXJkIHBhcnR5IGZpbGVzLiAgUmVmZXIgdG8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy93cy9kb3dubG9hZF9pbnN0cnVjdGlvbnNfZm9yX2phcnMuaHRtbAotCi0jCi0jIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kCi0jCi1NU0dfV0FSTklOR19OT19TRVJWSUNFX0VMRU1FTlQ9VGhlIFdTREwgZmlsZSBkb2VzIG5vdCBjb250YWluIGEgU2VydmljZSBlbGVtZW50LiAgVGhlcmVmb3JlIGEgc2VydmljZSBpbnRlcmZhY2UgYW5kIEphdmEgcHJveHkgd2lsbCBub3QgYmUgZ2VuZXJhdGVkIGFuZCBhcyBhIHJlc3VsdCwgYSBKYXZhIHRlc3QgY2xpZW50IHdpbGwgbm90IGJlIGxhdW5jaGVkLiAgQ2xpY2sgT0sgdG8gcHJvY2VlZCwgb3IgY2xpY2sgQ2FuY2VsIHRvIHNlbGVjdCBhbm90aGVyIFdTREwgZmlsZS4gIEFsdGVybmF0ZWx5LCBleGl0IHRoZSB3aXphcmQgYW5kIHVzZSB0aGUgV1NETCBlZGl0b3IgdG8gY3JlYXRlIGEgU2VydmljZSBXU0RMIGRvY3VtZW50LgotCi0jCi0jIENoZWNrV1NETFZhbGlkYXRpb25Db21tYW5kCi0jCi1TVElMTF9WQUxJREFUSU5HX1dTREw9V2l6YXJkIFdTREwgdmFsaWRhdGlvbiBpbiBQcm9ncmVzcy4gIFxuLSBDbGljayBDYW5jZWwgdG8gY2FuY2VsIHRoZSBjdXJyZW50IFdTREwgdmFsaWRhdGlvbiBhbmQgY29udGludWUuIFxuLSBDbGljayBDYW5jZWwgYW5kIFVwZGF0ZSB0byB1cGRhdGUgdGhlIHByZWZlcmVuY2UgdG8gYWx3YXlzIGNhbmNlbCBpbmNvbXBsZXRlIFdTREwgdmFsaWRhdGlvbiB3aGlsZSB0cmF2ZXJzaW5nIHRoZSB3aXphcmQuICBcbi0gQ2xpY2sgV2FpdCB0byB3YWl0IGZvciBXU0RMIHZhbGlkYXRpb24gdG8gY29tcGxldGUuCi1DQU5DRUxfVkFMSURBVElPTl9MQUJFTD1DYW5jZWwKLUNBTkNFTF9WQUxJREFUSU9OX0RFU0NSSVBUSU9OPUNhbmNlbCB0aGUgY3VycmVudCBXU0RMIHZhbGlkYXRpb24gYW5kIGNvbnRpbnVlCi1DQU5DRUxfQUxMX1ZBTElEQVRJT05fTEFCRUw9Q2FuY2VsIGFuZCBVcGRhdGUKLUNBTkNFTF9BTExfVkFMSURBVElPTl9ERVNDUklQVElPTj1VcGRhdGUgdGhlIHByZWZlcmVuY2UgdG8gYWx3YXlzIGNhbmNlbCBpbmNvbXBsZXRlIFdTREwgdmFsaWRhdGlvbiB3aGlsZSB0cmF2ZXJzaW5nIHRoZSB3aXphcmQuCi1XQUlUX1ZBTElEQVRJT05fTEFCRUw9V2FpdAotV0FJVF9WQUxJREFUSU9OX0RFU0NSSVBUSU9OPVdhaXQgZm9yIFdTREwgdmFsaWRhdGlvbiB0byBjb21wbGV0ZQotVEFTS19MQUJFTF9DSEVDS19XU0RMX1ZBTElEQVRJT049Q2hlY2sgZm9yIFdTREwgdmFsaWRhdGlvbgotVEFTS19ERVNDX0NIRUNLX1dTRExfVkFMSURBVElPTj1DaGVjayBpZiBXU0RMIHZhbGlkYXRpb24gaGFzIGNvbXBsZXRlZAotCi0jCi0jIFdTRExWYWxpZGF0aW9uIG1lc3NhZ2VzCi0jCi1NRVNTQUdFX1ZBTElEQVRFX05PX1dTREw9V2l6YXJkIFdTREwgdmFsaWRhdGlvbiBpcyBkaXNhYmxlZC4KLU1FU1NBR0VfVkFMSURBVEVfUkVNT1RFX1dTREw9V2l6YXJkIFdTREwgdmFsaWRhdGlvbiBpcyBvbmx5IGVuYWJsZWQgZm9yIHJlbW90ZSBmaWxlcy4KLU1FU1NBR0VfVkFMSURBVEVfQUxMX1dTREw9V2l6YXJkIFdTREwgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgotTUVTU0FHRV9WQUxJREFURV9JTl9QUk9HUkVTUz1XU0RMIHZhbGlkYXRpb24gaW4gcHJvZ3Jlc3MgLi4uCi1FUlJPUl9NRVNTQUdFU19JTl9WQUxJREFUSU9OPVRoZSBXU0RMIGZpbGUgY29udGFpbnMgdmFsaWRhdGlvbiBlcnJvcihzKS4KLVdBUk5JTkdfTUVTU0FHRVNfSU5fVkFMSURBVElPTj1UaGUgV1NETCBmaWxlIGNvbnRhaW5zIHZhbGlkYXRpb24gd2FybmluZyhzKS4KLVdBUk5JTkdfSUZfQ09OVElOVUU9Q29udGludWluZyB3aXRoIHRoZSB3aXphcmQgbWF5IHJlc3VsdCBpbiBnZW5lcmF0aW9uIG9yIHJ1bnRpbWUgcHJvYmxlbS4KLVZBTElEQVRJT05fQ09NUExFVEVEPVdTREwgdmFsaWRhdGlvbiBjb21wbGV0ZXMgd2l0aCBubyB3YXJuaW5nIG9yIGVycm9yLgotVE9PTFRJUF9WQUxJREFURV9URVhUX01FU1NBR0VfU1VNTUFSWT1XU0RMIHZhbGlkYXRpb24gcHJlZmVyZW5jZSBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUgV2ViIFNlcnZpY2VzIFByb2ZpbGUgQ29tcGxpYW5jZSBhbmQgVmFsaWRhdGlvbiBwcmVmZXJlbmNlLgotCi1MQUJFTF9CVVRUT05fU1RPUF9XU0RMX1ZBTElEQVRJT049U3RvcCBWYWxpZGF0aW9uCi1UT09MVElQX1NUT1BfVkFMSURBVElPTl9CVVRUT049U3RvcHMgdGhlIGN1cnJlbnQgV1NETCB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQotCi0jCi0jIFN0YXJ0IHNlcnZlciBwYWdlCi0jCi1QQUdFX1RJVExFX1dTX1NUQVJUX1NFUlZFUj1TdGFydCBTZXJ2ZXIKLVBBR0VfREVTQ19XU19TVEFSVF9TRVJWRVI9U3RhcnQgdGhlIHNlcnZlciBmcm9tIHRoaXMgcGFnZS4KLUxBQkVMX1NUQVJUX1NFUlZFUl9URVhUMT1JbiBvcmRlciB0byBwcm9jZWVkIHRoZSBzZXJ2ZXIgInswfSIgbXVzdCBiZSBzdGFydGVkLgotTEFCRUxfU1RBUlRfU0VSVkVSX1RFWFQyPU9uY2UgdGhlIHNlcnZlciBpcyBzdGFydGVkIHRoZSAibmV4dCIgYnV0dG9uIHdpbGwgYmUgZW5hYmxlZC4KLUxBQkVMX1NUQVJUX1NFUlZFUl9URVhUMz1UaGUgImJhY2siIGJ1dHRvbiBjYW4gYmUgdXNlZCB3aGlsZSB0aGUgc2VydmVyIGlzIHN0YXJ0aW5nIHRvCi1MQUJFTF9TVEFSVF9TRVJWRVJfVEVYVDQ9Y2hhbmdlIGFueSBwcmV2aW91cyBzZXR0aW5ncyBpbiB0aGlzIHdpemFyZC4KLUxBQkVMX1NUQVJUX1NFUlZFUl9CVVRUT049U3RhcnQgc2VydmVyCi1UT09MVElQX1NUQVJUX1NFUlZFUl9CVVRUT049U3RhcnQgdGhlIHNlcnZlcgotVEVYVF9TRVJWRVJfU1RBVFVTPUN1cnJlbnRseSB0aGUgc2VydmVyIGlzIHswfS4KLVRFWFRfU0VSVkVSX01TRz1TZXJ2ZXIgezB9Ci1URVhUX1NFUlZFUl9TVEFSVEVEPXN0YXJ0ZWQKLVRFWFRfU0VSVkVSX1NUQVJUSU5HPXN0YXJ0aW5nCi1URVhUX1NFUlZFUl9TVE9QUEVEPXN0b3BwZWQKLQotIwotIyBBbnQgdGFzayBMaXN0IG9wdGlvbnMKLSMKLQotIyBOb3RlIHRvIHRyYW5zbGF0aW9uIGRvIG5vdCB0cmFuc2xhdGUga2V5d29yZCBSdW50aW1lSWQKLU1TR19JTkZPX0FOVF9SVU5USU1FX0hFQURJTkc9V2ViIFNlcnZpY2UgUnVudGltZSBJRHMgKFJ1bnRpbWVJZCkKLU1TR19JTkZPX0FOVF9TRVJWRVJfUlVOVElNRT1TZXJ2ZXIgcnVudGltZTogezB9Ci1NU0dfSU5GT19BTlRfQ0xJRU5UX1JVTlRJTUU9Q2xpZW50IHJ1bnRpbWU6IHswfSAKLQotIyBOb3RlIHRvIHRyYW5zbGF0aW9uIGRvIG5vdCB0cmFuc2xhdGUga2V5d29yZCBTZXJ2ZXJJZAotTVNHX0lORk9fQU5UX1NFUlZFUl9IRUFESU5HPVNlcnZlciBJRHMgKFNlcnZlcklkKQotTVNHX0lORk9fQU5UX1NFUlZFUj1TZXJ2ZXI6IHswfQotCi1NU0dfSU5GT19XU0RMX09QRVJBVElPTl9USU1FRF9PVVQ9Q291bGQgbm90IHJldHJpZXZlIHRoZSBXU0RMIGZpbGUgezB9LiAgRG8geW91IHdhbnQgdG8gY29udGludWUgdG8gd2FpdCBmb3IgdGhpcyBmaWxlPwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9Db25zdW1wdGlvblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDU2MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9Db25zdW1wdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMDQgMTI0MTQzICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgICAgIAotICogMjAwNjAyMDQgMTI0NDA4ICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAKLSAqIDIwMDYwMjIxIDExOTExMSAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjAzMjkgMTI4MDY5ICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQwNCAxMzQ5MTMgICBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUgCi0gKiAyMDA2MDQxMSAgIDEzNjEzNCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA0MTcgICAxMzYzOTAvMTM2MTU5IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNDEzICAgMTM1NTgxIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MTggICAxMzYzMzUgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA0MjAgICAxMzYxNTggcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQyMCAgIDEyMDcxNCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA0MjAgICAxMzU5MTIgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA0MjYgICAxMzg2NDcgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA1MTAgICAxNDExMTUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDUwOSAgIDExOTI5NiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDcxOSAgIDEzOTk3NyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdW1wdGlvblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENvbnN1bXB0aW9uVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19DTElFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9KQVZBX1BST1hZX0RJQUxPRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BQQURfQ0hFQ0tCT1hfV1NETDJQUk9YWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1NSUEZfQ09NQk9fU0VSVkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfU1JQRl9DT01CT19SVU5USU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfU1JQRl9DT01CT19KMkVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9OT19TRVJWRVJfUlVOVElNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9GT0xERVJfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9KU1BfRk9MREVSX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV0VCX1BST0pFQ1RfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9XRUJTRVJWSUNFVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9XRUJTRVJWSUNFSU1QTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9XRUJTRVJWSUNFREVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0oyRUVfVkVSU0lPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9OQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVRUT05fQlJPV1NFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9CUk9XU0VfRklMRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQk9UVE9NVVBfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9QRE9XTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDTElFTlRfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09NQklORURfVFlQRV9BTkRfUlVOVElNRV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXSVpBUkRfVElUTEVfV1NDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfVElUTEVfV1NfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX0RFU0NfV1NfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVRUT05fU1RBUlRfV0VCX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX0lOU1RBTExfU0VSVklDRV9XRUJfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVRUT05fSU5TVEFMTF9DTElFTlRfV0VCX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JPVVBfU0NFTkFSSU9fU0VSVklDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9TQ0VOQVJJT19DTElFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV0VCU0VSVklDRUNMSUVOVFRZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9USVRMRV9XU19SVU5USU1FX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU1VNTUFSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TVU1NQVJZX05PX0NMSUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9SVU5USU1FU19MSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NFUlZFUlNfTElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9FRElUX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TRVJWSUNFX0VBUl9NT0RVTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX0VBUl9NT0RVTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX01PRFVMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TRVJWSUNFX01PRFVMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9DTElFTlRfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TRVJWSUNFX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX0VBUl9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NFUlZJQ0VfRUFSX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX0NPTVBfVFlQRV9XRUI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX0NPTVBfVFlQRV9FSkI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX0NPTVBfVFlQRV9BUFBfQ0xJRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0NMSUVOVF9DT01QX1RZUEVfQ09OVEFJTkVSTEVTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXUlNfVEVYVF9SVU5USU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdSU19URVhUX1NFUlZFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXUlNfSjJFRV9WRVJTSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NFTEVDVElPTl9WSUVXX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NFTEVDVElPTl9WSUVXX1JVTlRJTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU0VMRUNUSU9OX1ZJRVdfU0VSVkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NFTEVDVElPTl9WSUVXX0VYUExPUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfVFJFRV9FWElTVElOR19TRVJWRVJTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1RSRUVfU0VSVkVSX1RZUEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19OT19PQkpFQ1RfU0VMRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19OT19TRVJWSUNFX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSU5WQUxJRF9TRVJWSUNFX0RFRjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSU5WQUxJRF9TRVJWSUNFX0lNUEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX05PX1JVTlRJTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX05PX1NFUlZFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfU1RVQl9PTkxZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19XQVJOX1NUVUJfT05MWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfV0FSTl9OT19TRVJWSUNFX1NFUlZFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfV0FSTl9OT19DTElFTlRfU0VSVkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19TRVJWRVJfVEFSR0VUX01JU01BVENIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19KMkVFX01JU01BVENIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19TRVJWSUNFX1BST0pFQ1RfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NFUlZJQ0VfUFJPSkVDVF9UWVBFX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19TRVJWSUNFX0VBUl9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfQ0xJRU5UX1BST0pFQ1RfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0NMSUVOVF9QUk9KRUNUX1RZUEVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0NMSUVOVF9FQVJfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lOVkFMSURfRUpCX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lOVkFMSURfV0VCX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lOVkFMSURfUFJPSkVDVF9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19NT0RVTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX01PRFVMRV9OQU1FX0FORF9QUk9KRUNUX05BTUVfTk9UX1RIRV9TQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19TRVJWSUNFX1JVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9QUk9KRUNUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19TRVJWSUNFX1NFUlZFUl9ET0VTX05PVF9TVVBQT1JUX1BST0pFQ1Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NFUlZJQ0VfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX1RFTVBMQVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19TRVJWSUNFX1NFUlZFUl9ET0VTX05PVF9TVVBQT1JUX1RFTVBMQVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19DTElFTlRfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX1BST0pFQ1Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0NMSUVOVF9TRVJWRVJfRE9FU19OT1RfU1VQUE9SVF9QUk9KRUNUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19DTElFTlRfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX1RFTVBMQVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19DTElFTlRfU0VSVkVSX0RPRVNfTk9UX1NVUFBPUlRfVEVNUExBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX0VBUlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX0NPTVBPTkVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX1BST0pFQ1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19XUk9OR19DTElFTlRfUFJPSkVDVF9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19DTElFTlRfU1VCOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19TRVJWSUNFX1NVQjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfR0VORVJBTF9QUk9KRUNUX0FORF9FQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VBUl9QUk9KRUNUX1dJTExfQkVfQ1JFQVRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRUFSX1dJTExfQkVfQVNTT0NJQVRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfUFJPSkVDVF9XSUxMX0JFX0NSRUFURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VBUl9XSUxMX0JFX0NSRUFURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1BST0pFQ1RfQU5EX0VBUl9DUkVBVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfVElUTEVfV1NfQ0xJRU5UX1JVTlRJTUVfU0VMRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfREVTQ19XU19DTElFTlRfUlVOVElNRV9TRUxFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX1NFTEVDVElPTl9WSUVXX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0NMSUVOVF9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NFUlZJQ0VfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9XRUI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfRUpCOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX05PX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfTVNHX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9USVRMRV9XU19YTUwyQkVBTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX0RFU0NfTjJQX01BUFBJTkdTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19NQVBQSU5HX0RVUExJQ0FURV9FTlRSSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9HRU5FUkFURV9QUk9YWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX0RFU0NfV1NTS0VMX0NPTkZJRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX1dTU0tFTF9DT05GSUc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUEJTQ19CVVRUT05fU0tFTEVUT05fRk9MREVSX0JST1dTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TS0VMRVRPTl9ST09UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQkVBTl9DTEFTU19OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfTVNHX0JFQU5fQ0FOTk9UX0JFX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9CUk9XU0VfQ0xBU1NFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX1dTVEVTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX0RFU0NfV1NURVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENIRUNLQk9YX1RFU1RfV0VCU0VSVklDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDSEVDS0JPWF9NT05JVE9SX1dFQlNFUlZJQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1VOQUJMRV9UT19MQVVOQ0hfV1NETF9URVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9MQVVOQ0hfU0VSVklDRV9URVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfVElUTEVfV1NfU0FNUExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfREVTQ19XU19TQU1QTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfVEVTVF9UWVBFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVRUT05fUlVOX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfTUVUSE9EUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9KU1BfUFJPSkVDVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9KVFNfUFJPWFlfTk9UX0NPTVBJTEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9NQUxGT1JNRURfVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9TRUxFQ1RfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9ERVNFTEVDVF9BTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUEJNRV9CVVRUT05fREVTRUxFQ1RfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfVElUTEVfV1NETF9TRUxFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9ERVNDX1dTRExfU0VMRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfVElUTEVfV1NfUFVCTElTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX0RFU0NfV1NfUFVCTElTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX1dTX0ZJTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9ERVNDX1dTX0ZJTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX1dTX1BVQkxJU0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX1dTV1NDRU5fUFVCTElTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVRUT05fV1NfUFVCTElTSF9QUklWQVRFX1VEREk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX1dTX0ZJTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX1dTX0ZJTkRfUFJJVkFURV9VRERJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1BVQkxJQ19VRERJX1JFR0lTVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfRUpCX0JFQU5fTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQUJMRV9USVRMRV9FSkJfQkVBTl9OQU1FUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQUJMRV9USVRMRV9FSkJfUFJPSkVDVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0VBUl9QUk9KRUNUUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TSE9XX0FMTF9TVEFURUxFU1NfU0VTU0lPTl9FSkJTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENIRUNLQk9YX09WRVJXUklURV9GSUxFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESUFMT0dfVElUSUxFX1NFUlZJQ0VfUFJPSkVDVF9TRVRUSU5HUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESUFMT0dfVElUSUxFX0NMSUVOVF9QUk9KRUNUX1NFVFRJTkdTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJQUxPR19USVRJTEVfU0VSVklDRV9JTVBMX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESUFMT0dfVElUSUxFX1NFUlZJQ0VfREVGX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1dTV1NDRU5fU0VSVklDRVBST0pFQ1RfTElOSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1dTV1NDRU5fQ0xJRU5UUFJPSkVDVF9MSU5LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9ERVZFTE9QOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9BU1NFTUJMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1dTV1NDRU5fU0NBTEVfREVQTE9ZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9JTlNUQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9SVU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1NFUlZJQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0NMSUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1dTV1NDRU5fU0NBTEVfQ0xJRU5UX09OTFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9XU1dTQ0VOX1RFWFRfSU1QTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1dTV1NDRU5fQlVUVE9OX09WRVJXUklURV9GSUxFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1dTV1NDRU5fQlVUVE9OX0JST1dTRV9JTVBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfRUFSX1BST0pFQ1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfVEFCTEVfQkVBTl9OQU1FUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXV1NfUEFHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BCQ0xfUEFHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BCQ0xfVEVYVF9CRUFOX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BTVFBfQ09NQk9CT1hfVEVTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BTVFBfTEFVTkNIX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXUlNfUEFHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXUlNfTElTVF9SVU5USU1FUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXUlNfTElTVF9TRVJWRVJTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdSU19SQURJT19TRVJWRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1JTX1JBRElPX1JVTlRJTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1JTX1JBRElPX0VYUExPUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV0NSX0NPTUJPX0NMSUVOVF9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdDUl9DT01CT19TRVJWSUNFX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1BSX0NPTUJPX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1BSX0dST1VQX1NDRU5BUklPX1NFUlZJQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1BSX0NIRUNLQk9YX0dFTkVSQVRFX1BST1hZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdQUl9DSEVDS0JPWF9TVEFSVF9XRUJfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXUFJfQ0hFQ0tCT1hfSU5TVEFMTF9TRVJWSUNFX1dFQl9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdQUl9DSEVDS0JPWF9JTlNUQUxMX0NMSUVOVF9XRUJfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXUFJfQ0hFQ0tCT1hfTEFVTkNIX1dTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdQUl9DSEVDS0JPWF9URVNUX1NFUlZJQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1BSX0NIRUNLQk9YX01PTklUT1JfU0VSVklDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXUFJfR1JPVVBfU0NFTkFSSU9fQ0xJRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdQUl9DT01CT19DTElFTlRUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdQQl9QQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9XU0lMX0lNUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUSVRMRV9XU0lMX0lNUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDX1dTSUxfSU1QT1JUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfVElUTEVfV1NfU0VMRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfREVTQ19XU19TRUxFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9NU0dfTE9BRElOR19XRUJfU0VSVklDRV9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9NU0dfSU5WQUxJRF9XRUJfU0VSVklDRV9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9NU0dfTk9fU1VDSF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfTVNHX1NFTEVDVElPTl9NVVNUX0JFX1dTREw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9NU0dfSU5WQUxJRF9XU0lMX0ZJTEVfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfVVJJX05PVF9SRVNPTFZBQkxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9XU0RMX0hBU19OT19TRVJWSUNFX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV1NJTF9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQlJPV1NFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1dTREw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV1NETF9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfSU1QT1JUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0FERDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9SRU1PVkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV1NfU0VMRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NFTEVDVF9XU0RMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1ZBTElEQVRFX01FU1NBR0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfV1NJTF9JTVBPUlRfUEFHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1dTSUxfVEVYVF9XU0lMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfV1NJTF9CVVRUT05fQlJPV1NFX1dTSUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9XU0lMX1RBQkxFX1dTREw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QQ09OX1BBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QQ09OX1RFWFRfV1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QQ09OX0JVVFRPTl9CUk9XU0VfV1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9WQUxJREFURV9URVhUX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9UQUJMRV9WQUxJREFURV9NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX0NPTFVNTl9WQUxJREFUSU9OX1NFVkVSSVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX0NPTFVNTl9WQUxJREFUSU9OX0xJTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFCTEVfQ09MVU1OX1ZBTElEQVRJT05fQ09MVU1OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX0NPTFVNTl9WQUxJREFUSU9OX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NNX1BBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NNX0NIRUNLQk9YX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NNX0NPTUJPQk9YX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NNX0NIRUNLQk9YX0xBVU5DSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXU01fVEVYVF9KU1BfRk9MREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTTV9CVVRUT05fSlNQX0ZPTERFUl9CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NNX0JVVFRPTl9TRUxFQ1RfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTTV9CVVRUT05fREVTRUxFQ1RfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTTV9DT01CT19QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTTV9URVhUX1NBTVBMRV9GT0xERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NNX1RSRUVfTUVUSE9EUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXU01fRUFSX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElBTE9HX1RJVExFX0hUVFBfQkFTSUNfQVVUSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9VUkw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfR0VORVJBVEVfSEFORExFUl9TS0VMRVRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfV1JJVEVfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9IQU5ETEVSU19DT05GSUc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQlVUVE9OX0FERDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9CVVRUT05fUkVNT1ZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0JVVFRPTl9NT1ZFX1VQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0JVVFRPTl9NT1ZFX0RPV047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQlVUVE9OX0dFTl9TS0VMRVRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9DT01CT19TT1VSQ0VfTE9DOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0NPTUJPX1dTX0NMSUVOVF9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ09NQk9fV1NfU0VSVklDRV9ERVNDOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19URVhUX05VTV9PRl9TRVJWSUNFUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfVEVYVF9OVU1fT0ZfQ0xJRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9IQU5ETEVSX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCTEVfSEFORExFUl9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9IQU5ETEVSX1BPUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElBTE9HX1RJVExFX1dTX0FERF9IQU5ETEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1RFWFRfSEFORExFUl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1RFWFRfSEFORExFUl9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9URVhUX0hBTkRMRVJfUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX1NFUlZJQ0VfSERMUl9DT05GSUc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9ERVNDX1NFUlZJQ0VfSERMUl9DT05GSUc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9USVRMRV9DTElFTlRfSERMUl9DT05GSUc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9ERVNDX0NMSUVOVF9IRExSX0NPTkZJRzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX0RFU0NfTVVMVElQTEVfU0VSVklDRVNfQ09ORklHOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfREVTQ19NVUxUSVBMRV9DTElFTlRTX0NPTkZJRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX0VESVRfV1NfSEFORExFUlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1RFWFRfSEFORExFUl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfVEVYVF9IQU5ETEVSX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9XU19DTElFTlRfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfV1NfU0VSVklDRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9VTkFCTEVfVE9fT1BFTl9KQVZBX0VESVRPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfV0FSTl9JU19TRVJWSUNFX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1VTRVJfQUJPUlRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfTUlTU0lOR19USElSRF9QQVJUWV9GSUxFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfV0FSTklOR19OT19TRVJWSUNFX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1RJTExfVkFMSURBVElOR19XU0RMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENBTkNFTF9WQUxJREFUSU9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENBTkNFTF9WQUxJREFUSU9OX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENBTkNFTF9BTExfVkFMSURBVElPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDQU5DRUxfQUxMX1ZBTElEQVRJT05fREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FJVF9WQUxJREFUSU9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBSVRfVkFMSURBVElPTl9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQVNLX0xBQkVMX0NIRUNLX1dTRExfVkFMSURBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQVNLX0RFU0NfQ0hFQ0tfV1NETF9WQUxJREFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfVkFMSURBVEVfTk9fV1NETDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1ZBTElEQVRFX1JFTU9URV9XU0RMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfVkFMSURBVEVfQUxMX1dTREw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9WQUxJREFURV9JTl9QUk9HUkVTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9NRVNTQUdFU19JTl9WQUxJREFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfTUVTU0FHRVNfSU5fVkFMSURBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXQVJOSU5HX0lGX0NPTlRJTlVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fQ09NUExFVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfVkFMSURBVEVfVEVYVF9NRVNTQUdFX1NVTU1BUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQlVUVE9OX1NUT1BfV1NETF9WQUxJREFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfU1RPUF9WQUxJREFUSU9OX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX1dTX1NUQVJUX1NFUlZFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX0RFU0NfV1NfU1RBUlRfU0VSVkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NUQVJUX1NFUlZFUl9URVhUMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TVEFSVF9TRVJWRVJfVEVYVDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU1RBUlRfU0VSVkVSX1RFWFQzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NUQVJUX1NFUlZFUl9URVhUNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TVEFSVF9TRVJWRVJfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfU1RBUlRfU0VSVkVSX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBURVhUX1NFUlZFUl9TVEFUVVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEVYVF9TRVJWRVJfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFWFRfU0VSVkVSX1NUQVJURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEVYVF9TRVJWRVJfU1RBUlRJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEVYVF9TRVJWRVJfU1RPUFBFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSU5GT19BTlRfUlVOVElNRV9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19JTkZPX0FOVF9TRVJWRVJfUlVOVElNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSU5GT19BTlRfQ0xJRU5UX1JVTlRJTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lORk9fQU5UX1NFUlZFUl9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19JTkZPX0FOVF9TRVJWRVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1dFQl9TRVJWSUNFX0NMSUVOVFNfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9XRUJfU0VSVklDRVNfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9XU0REX05PVF9GT1VORDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfQ0xJRU5UX0NBTk5PVF9BU1NPQ0lBVEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NFUlZJQ0VfQ0FOTk9UX0FTU09DSUFURTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfUFJPSkVDVF9NVVNUX0VYSVNUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9JTlZBTElEX01VTFRJUExFX1NFUlZJQ0VfU0VMRUNUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9NT0RVTEVfREVQRU5ERU5DWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSU5GT19XU0RMX09QRVJBVElPTl9USU1FRF9PVVQ7Ci0KLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9hY3Rpb24vTGF1bmNoV1NFQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2FjdGlvbi9MYXVuY2hXU0VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2NmZlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2FjdGlvbi9MYXVuY2hXU0VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBMYXVuY2hXU0VBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLXsKLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0gICAgRWNsaXBzZVN0YXR1c0hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlciAgICAgPSBuZXcgRWNsaXBzZVN0YXR1c0hhbmRsZXIoKTsKLSAgICBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQgICAgICAgICBjb250ZXh0ICAgICA9IG5ldyBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICBFY2xpcHNlRW52aXJvbm1lbnQgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA9IG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoIG51bGwsIGNvbnRleHQsIGhhbmRsZXIgKTsgCi0gICAgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCAgICAgICAgY21kICAgICAgICAgPSBuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpOwotICAgIAotICAgIFN0cmluZyBzdGF0ZUxvY2F0aW9uID0gRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCk7Ci0JU3RyaW5nIGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbiA9IEV4cGxvcmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKCk7Ci0JTGF1bmNoT3B0aW9uW10gbGF1bmNoT3B0aW9ucyA9IG5ldyBMYXVuY2hPcHRpb25bXSB7Ci0JCW5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5TVEFURV9MT0NBVElPTixzdGF0ZUxvY2F0aW9uKSwKLQkJbmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLkRFRkFVTFRfRkFWT1JJVEVTX0xPQ0FUSU9OLGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbikKLQl9OwotICAgIGNtZC5zZXRMYXVuY2hPcHRpb25zKGxhdW5jaE9wdGlvbnMpOwotICAgIGNtZC5zZXRFbnZpcm9ubWVudCggZW52aXJvbm1lbnQgKTsKLQkgIGNtZC5leGVjdXRlKCBudWxsLCBudWxsICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeyAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7ICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7ICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2FudC9BbnRDbGllbnRSb290Q29tbWFuZEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2FudC9BbnRDbGllbnRSb290Q29tbWFuZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzEzYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9hbnQvQW50Q2xpZW50Um9vdENvbW1hbmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMSAgIDExOTExMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDUzMCAgIDE0NDM1OCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA1MzAgICAxNDQzNTAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwODI1ICAgMTU1MTE0IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDYxMDExICAgMTU5MjgzIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBwcm9qZWN0IG5vdCBhc3NvY2lhdGVkIHRvIEVBUiB3aGVuIHVzaW5nIGFudCBvbiBjb21tYW5kLWxpbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQW50RGVmYXVsdGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5BbnRSZXN0b3JpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkNoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkxpc3RPcHRpb25zQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhLkVjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkZpbmlzaEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uU2NlbmFyaW9DbGVhbnVwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uLkNsaWVudFJvb3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uLlByZUNsaWVudERldmVsb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoRGVmYXVsdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuQXNzZW1ibGVDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5EZXBsb3lDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5EZXZlbG9wQ2xpZW50RnJhZ21lbnQ7Ci0KLS8qKgotICogCi0gKiBDb21tYW5kIGZyYWdtZW50IGZvciBnZW5lcmF0aW5nIGEgd2ViIHNlcnZpY2UgY2xpZW50IHVzaW5nIEFudCB0YXNrLgotICogUnVuIGhlYWRsZXNzIEVjbGlwc2Ugb3Igd2l0aGluIHdvcmtzcGFjZSB1c2luZyBSdW4gYXMgQW50IEJ1aWxkLiAgVGhpcyBmcmFnbWVudCBlbGltaW5hdGVzIGFueSBVSSBzcGVjaWZpYyAKLSAqIGNvbW1hbmRzIGFuZCBkYXRhIG1hcHBpbmdzIGJldHdlZW4gY29tbWFuZHMgYW5kIHdpZGdldHMuICBXaWRnZXQgdG8gY29tbWFuZCBtYXBwaW5ncyBhcmUKLSAqIHJlcGxhY2VkIGJ5IEFudCBwcm9wZXJ0eSBmaWxlIHRvIGNvbW1hbmQgbWFwcGluZ3Mgd2hpY2ggYXJlIGVuYWJsZWQgYnkgYSBhbnREYXRhTWFwcGluZyBleHRlbnNpb24gCi0gKiBwb2ludCBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52IHBsdWdpbi4KLSAqIAotICogQGF1dGhvciBqb2FuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBBbnRDbGllbnRSb290Q29tbWFuZEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudHsKLQkKLSAgcHVibGljIEFudENsaWVudFJvb3RDb21tYW5kRnJhZ21lbnQoKQotICB7CSAKLQkgICAgCi0gIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2NlbmFyaW9DbGVhbnVwQ29tbWFuZCgpLCAiIiApKTsKLSAgCi0gIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KG5ldyBMaXN0T3B0aW9uc0NvbW1hbmQoKSwgIiIpKTsKLSAgYWRkIChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEFudERlZmF1bHRpbmdPcGVyYXRpb24oKSwgIiIpKTsKLSAgCi0gIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQodHJ1ZSksICIiICkgKTsKLSAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kKCksICIiICkpOwotICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAKLSAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZCgpLCAiIikpOwotICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAKLSAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCggdHJ1ZSApLCAiIikpOwotICBhZGQoIG5ldyBDbGllbnRSb290RnJhZ21lbnQoKSApOwotICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQoKSwgIiIgKSApOwotIAotICBhZGQobmV3IEZpbmlzaEZyYWdtZW50KCkpOwotICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEFudFJlc3RvcmluZ0NvbW1hbmQoKSwgIiIgKSk7Ci0gIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2NlbmFyaW9DbGVhbnVwQ29tbWFuZCgpLCAiIiApKTsKLSAKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgeyAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRGV2ZWxvcENsaWVudCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJBc3NlbWJsZUNsaWVudCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXBsb3lDbGllbnQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU3RhcnRDbGllbnQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7ICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgICAgICAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiSW5zdGFsbENsaWVudCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJTdGFydENsaWVudCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJEZXZlbG9wQ2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkFzc2VtYmxlQ2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkRlcGxveUNsaWVudCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UnVudGltZUlkIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudENvbXBvbmVudFR5cGUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0vLyAgICBNYXAgQW50RGVmYXVsdGluZ09wZXJhdGlvbiAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQW50RGVmYXVsdGluZ09wZXJhdGlvbi5jbGFzcywgIkNsaWVudElkc0ZpeGVkIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEFudERlZmF1bHRpbmdPcGVyYXRpb24uY2xhc3MsICJTdGFydFNlcnZpY2UiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBbnREZWZhdWx0aW5nT3BlcmF0aW9uLmNsYXNzLCAiSW5zdGFsbENsaWVudCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsgICAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQW50RGVmYXVsdGluZ09wZXJhdGlvbi5jbGFzcywgIkRlcGxveUNsaWVudCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgICAgICAKLSAgICAgIC8vIE1hcCBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbldTSUwiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2lsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZVVSSSIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIG5ldyBFY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ29tcG9uZW50TmFtZSIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsUHJvamVjdCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiQ29tcG9uZW50TmFtZSIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEluaXRpYWxDb21wb25lbnROYW1lIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0JICAKLSAgICAgIC8vIFNldHVwIHRoZSBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC4gIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UnVudGltZUlkIiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlVHlwZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgbnVsbCApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MgKTsKLQkgIAotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRGV2ZWxvcENsaWVudCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkFzc2VtYmxlQ2xpZW50IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRGVwbG95Q2xpZW50IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlN0YXJ0Q2xpZW50IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBudWxsKTsgICAgICAKLQkgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlQ2xpZW50IiwgbnVsbCApOwotCQkJCi0gICAgICAvLyBNYXAgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25GcmFnbWVudC5jbGFzcyk7ICAgICAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kIGNvbW1hbmQuCi0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmVySW5zdGFuY2VJZCIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLQotICAgICAgLy8gTUFQIHBvc3Qgc2VydmVyIGNvbmZpZyBjYWxsICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOyAgICAgCi0gICAgICAgICAgICAKLSAgICAgIC8vTWFwcGluZ3MgdG8gZW5hYmxlIHBlZWstYWhlYWQgZm9yIFBhZ2UgMyBvZiB0aGUgY2xpZW50IHdpemFyZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcywgIlByb2plY3QiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50TmFtZSIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyIiwgbnVsbCApOwotICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzLCAiUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcywgIkVhclByb2plY3QiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyQ29tcG9uZW50TmFtZSIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcywgIlByb2plY3QiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50TmFtZSIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzLCAiTW9kdWxlIiwgbnVsbCApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcywgIkVhclByb2plY3QiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyQ29tcG9uZW50TmFtZSIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyIiwgbnVsbCApOyAgCi0gICAgICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBbnREZWZhdWx0aW5nT3BlcmF0aW9uLmNsYXNzLCAiUmVuZGVyZXJWYWxpZGF0aW9uIiwgQW50UmVzdG9yaW5nQ29tbWFuZC5jbGFzcyk7ICAgICAgICAgIAotICAgfSAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQW50RGVmYXVsdGluZ09wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0FudERlZmF1bHRpbmdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiZjU3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQW50RGVmYXVsdGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIxICAgMTE5MTExIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjEwMTEgICAxNTkyODMgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIHByb2plY3Qgbm90IGFzc29jaWF0ZWQgdG8gRUFSIHdoZW4gdXNpbmcgYW50IG9uIGNvbW1hbmQtbGluZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFudERlZmF1bHRpbmdPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbnsKLQotCXByaXZhdGUgYm9vbGVhbiByZW5kZXJlclZhbGlkYXRpb247Ci0JCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCQlyZW5kZXJlclZhbGlkYXRpb24gPSBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpLmlzVmFsaWRhdGluZygpOwkJCi0JCVJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpLnNldFZhbGlkYXRpbmcocmVuZGVyZXJWYWxpZGF0aW9uKTsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2aWNlSWRzRml4ZWQoKQotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50SWRzRml4ZWQoKQotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldFN0YXJ0U2VydmljZSgpCi0JewotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnN0YWxsU2VydmljZSgpCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldERlcGxveVNlcnZpY2UoKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3lDbGllbnQoKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJlclZhbGlkYXRpb24oKQotICAgIHsKLSAgICAJcmV0dXJuIHJlbmRlcmVyVmFsaWRhdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQW50UmVzdG9yaW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0FudFJlc3RvcmluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3MzkwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQW50UmVzdG9yaW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYxMDExICAgMTU5MjgzIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBwcm9qZWN0IG5vdCBhc3NvY2lhdGVkIHRvIEVBUiB3aGVuIHVzaW5nIGFudCBvbiBjb21tYW5kLWxpbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBbnRSZXN0b3JpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb257Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVuZGVyZXJWYWxpZGF0aW9uOwotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCVJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyhyZW5kZXJlclZhbGlkYXRpb24pOwotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclZhbGlkYXRpb24oYm9vbGVhbiByZW5kZXJlclZhbGlkYXRpb24pCi0gICAgewotICAgIAl0aGlzLnJlbmRlcmVyVmFsaWRhdGlvbiA9IHJlbmRlcmVyVmFsaWRhdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9DaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjRkMDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9DaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5WYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgY2hlY2tzIHRvIHNlZSBpZiB0aGUgc2VsZWN0ZWQgY2xpZW50IHByb2plY3QgaXMgdGhlCi0gKiBzZXJ2aWNlIHByb2plY3QuIElmIHNvLCB0aGUgdXNlciBpcyB3YXJuZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIC8vU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlczsKLSAgU3RyaW5nIGNsaWVudFByb2plY3ROYW1lOwotICBTdHJpbmcgd3NkbFVSSTsKLSAgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gICAgCi0gIHB1YmxpYyBDaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZCgpCi0gIHsKLSAgfQotICAKLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGNsaWVudFByb2plY3ROYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotICAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBpZiAoY2xpZW50UHJvamVjdE5hbWU9PW51bGwgfHwgd3NkbFVSST09bnVsbCB8fCB3c2RsVVJJLmxlbmd0aCgpPT0wIHx8IHdlYlNlcnZpY2VzUGFyc2VyPT1udWxsKQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgICBpZiAoY2xpZW50UHJvamVjdE5hbWU9PW51bGwgfHwgY2xpZW50UHJvamVjdE5hbWUubGVuZ3RoKCk9PTApCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIAotICAgIElQcm9qZWN0IGNsaWVudFByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoY2xpZW50UHJvamVjdE5hbWUpOwotICAgIFZhbGlkYXRpb25VdGlscyB2dSA9IG5ldyBWYWxpZGF0aW9uVXRpbHMoKTsKLSAgICBib29sZWFuIGlzU2VydmljZVByb2plY3QgPSB2dS5pc1Byb2plY3RTZXJ2aWNlUHJvamVjdChjbGllbnRQcm9qZWN0LCB3c2RsVVJJLCB3ZWJTZXJ2aWNlc1BhcnNlcik7Ci0gICAgaWYgKGlzU2VydmljZVByb2plY3QpCi0gICAgewotICAgICAgSVN0YXR1cyB3U3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19XQVJOX0lTX1NFUlZJQ0VfUFJPSkVDVCwgbmV3IFN0cmluZ1tde2NsaWVudFByb2plY3ROYW1lfSkgKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHdTdGF0dXMpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLSAgICAgIHsKLSAgICAgICAgLy9Vc2VyIGRlY2lkZWQgdG8gYWJvcnQuIFJldHVybiBhbiBlcnJvciBzdGF0dXMKLSAgICAgICAgSVN0YXR1cyBlU3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfVVNFUl9BQk9SVEVEICk7Ci0gICAgICAgIHJldHVybiBlU3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YWJkYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0dlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDA0ICAgMTM0OTEzIHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdSAgICAgIAotICogMjAwNjA1MTcgICAxNDIwMjcgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5IYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5IYW5kbGVyU2VydmljZVJlZkhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIElQYXRoIG91dHB1dExvY2F0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIGdlblNrZWxldG9uXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlck5hbWVGb3JFZGl0XyA9IG51bGw7Ci0gIAotICBwcml2YXRlIEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyW10gaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfOwotICBwcml2YXRlIEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcltdaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXzsKLSAgCi0gIHB1YmxpYyBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQoKQotICB7Ci0gIH0KLSAgCi0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgCi0gICAgSVN0YXR1cyAgICAgcmV0dXJuU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgCQotICAJaWYgKCFnZW5Ta2VsZXRvbl8pCXJldHVybiByZXR1cm5TdGF0dXM7IAotICAJCi0gICAgICAvLyBmb3JtIHRoZSBtYXAgb2YgY2xhc3NuYW1lIHRvIGxvY2F0aW9ucwotICAgICAgaWYgKGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl8hPW51bGwpewotICAgICAgICBmb3IgKGludCBpPTA7aTxoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfLmxlbmd0aDtpKyspewotICAgICAgICAgIEhhc2h0YWJsZSBoYW5kbGVyVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgSVBhdGggb3V0UGF0aCA9IGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl9baV0uZ2V0U291cmNlT3V0cHV0UGF0aCgpOwotICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSBoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfW2ldLmdldEhhbmRsZXJMaXN0KCk7Ci0gICAgICAgICAgZm9yIChpbnQgaj0wO2o8aGFuZGxlcnMuc2l6ZSgpO2orKyl7Ci0gICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKWhhbmRsZXJzLmdldChqKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpOwotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSE9bnVsbCAmJiBvdXRQYXRoIT1udWxsKQotICAgICAgICAgICAgICBoYW5kbGVyVGFibGUucHV0KGNsYXNzTmFtZSwgb3V0UGF0aCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVyblN0YXR1cyA9IGdlbkhhbmRsZXJzQ2xhc3NlcyhoYW5kbGVyVGFibGUsIG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyXy5sZW5ndGg7aSsrKXsKLSAgICAgICAgICBIYXNodGFibGUgaGFuZGxlclRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICAgIElQYXRoIG91dFBhdGggPSBoYW5kbGVyU2VydmljZVJlZkhvbGRlcl9baV0uZ2V0U291cmNlT3V0cHV0UGF0aCgpOwotICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSBoYW5kbGVyU2VydmljZVJlZkhvbGRlcl9baV0uZ2V0SGFuZGxlckxpc3QoKTsKLSAgICAgICAgICBmb3IgKGludCBqPTA7ajxoYW5kbGVycy5zaXplKCk7aisrKXsKLSAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0paGFuZGxlcnMuZ2V0KGopOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lIT1udWxsICYmIG91dFBhdGghPW51bGwpCi0gICAgICAgICAgICAgIGhhbmRsZXJUYWJsZS5wdXQoY2xhc3NOYW1lLCBvdXRQYXRoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuU3RhdHVzID0gZ2VuSGFuZGxlcnNDbGFzc2VzKGhhbmRsZXJUYWJsZSwgbW9uaXRvcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAKLSAKLSAgICByZXR1cm4gcmV0dXJuU3RhdHVzOwotCi0gIH0KLSAgCi0gIHByaXZhdGUgSVN0YXR1cyBnZW5IYW5kbGVyc0NsYXNzZXMoSGFzaHRhYmxlIGhhbmRsZXJzRm9yR2VuLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotICAgIElFbnZpcm9ubWVudCBlbnYgICAgICAgICAgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIE11bHRpU3RhdHVzIHN0YXR1cyAgICAgICA9IG51bGw7Ci0gICAgSVN0YXR1cyAgICAgcmV0dXJuU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0gICAgCi0gICAgSVN0YXR1cyB3cml0ZVN0YXR1czsgICAgCi0gICAgRW51bWVyYXRpb24ga2V5cyA9IGhhbmRsZXJzRm9yR2VuLmtleXMoKTsKLSAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIHdyaXRlU3RhdHVzID0gd3JpdGVGaWxlKGVudiwgY2xhc3NOYW1lLCAoSVBhdGgpaGFuZGxlcnNGb3JHZW4uZ2V0KGNsYXNzTmFtZSksIG1vbml0b3IgKTsKLSAgICAgICAgLy8gaGFuZGxlIHN0YXR1cyByZXR1cm4KLSAgICAgICAgaWYgKHdyaXRlU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSB7ICAvLyB3cml0ZSBzdGF0dXMgaXMgT0sgb3IgRVJST1IKLSAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLm11bHRpU3RhdHVzKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0VSUk9SX0dFTkVSQVRFX0hBTkRMRVJfU0tFTEVUT04sIG5ldyBJU3RhdHVzWzBdICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMuYWRkKHdyaXRlU3RhdHVzKTsKLSAgICAgICAgfSAKLSAgICB9Ci0gICAgCi0gICAgaWYgKGVycm9yKSAKLSAgICB7Ci0gICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgIHJldHVyblN0YXR1cyA9IHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJldHVyblN0YXR1czsKLSAgICAKLSAgfQotICAKLSAgCi0gIHByaXZhdGUgSVN0YXR1cyB3cml0ZUZpbGUgKElFbnZpcm9ubWVudCBlbnYsIFN0cmluZyBjbGFzc05hbWUsIElQYXRoIG91dHB1dExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgewotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAJaW50IGluZGV4OwotICAJCi0gIAlTdHJpbmcgc2ltcGxlQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAJU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLSAgCUlQYXRoIGZpbGVQYXRoID0gb3V0cHV0TG9jYXRpb247Ci0gIAlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLSAgCQlpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAJCWlmIChpbmRleCAhPSAtMSkgewotICAJCQlzaW1wbGVDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gIAkJCXBhY2thZ2VOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gIAkJCQotICAJCSAgCVN0cmluZyBwYWNrYWdlU2VnbWVudCA9IHBhY2thZ2VOYW1lOwotICAJCSAgCWludCBqID0gMDsKLSAgCQkgIAlqID0gcGFja2FnZVNlZ21lbnQuaW5kZXhPZignLicpOwotICAJCSAgCXdoaWxlIChqICE9IC0xKSB7Ci0gIAkJICAJCWZpbGVQYXRoID0gZmlsZVBhdGguYXBwZW5kKHBhY2thZ2VTZWdtZW50LnN1YnN0cmluZygwLCBqKSk7Ci0gIAkJICAJCXBhY2thZ2VTZWdtZW50ID0gcGFja2FnZVNlZ21lbnQuc3Vic3RyaW5nKGogKyAxKTsKLSAgCQkgIAkJaiA9IHBhY2thZ2VTZWdtZW50LmluZGV4T2YoJy4nKTsKLSAgCQkgIAl9Ci0gIAkJICAgIGZpbGVQYXRoID0gZmlsZVBhdGguYXBwZW5kKHBhY2thZ2VTZWdtZW50KTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJICBwYWNrYWdlTmFtZSA9ICIiOwotICAJCX0KLSAgCX0KLSAgCQotICAJZmlsZVBhdGggPSBmaWxlUGF0aC5hcHBlbmQoc2ltcGxlQ2xhc3NOYW1lKTsKLSAgCQotICAJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKCJqYXZhIik7Ci0KLSAgCS8vIGNoZWNrIGlmIEhhbmRsZXIgYWxyZWFkeSBleGlzdHM7IGRvIG5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgSGFuZGxlcnMKLSAgCUlSZXNvdXJjZSB3b3Jrc3BhY2VSZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShmaWxlUGF0aCk7Ci0gIAlpZiAod29ya3NwYWNlUmVzIT1udWxsICYmIHdvcmtzcGFjZVJlcy5leGlzdHMoKSkgewotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gIAkKLSAgCWlmIChoYW5kbGVyTmFtZUZvckVkaXRfID09IG51bGwpewotICAJCWhhbmRsZXJOYW1lRm9yRWRpdF8gPSBjbGFzc05hbWU7Ci0gICAgICAgIG91dHB1dExvY2F0aW9uXyA9IG91dHB1dExvY2F0aW9uOwotICAJfQotICAJCi0gIAlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gRmlsZVJlc291cmNlVXRpbHMubmV3RmlsZU91dHB1dFN0cmVhbSggRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgZmlsZVBhdGgsIG1vbml0b3IsIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkpOwotICAJLy8gY3JlYXRlIGJ1ZmZlcmVkIHdyaXRlciBmb3Igd3JpdGluZyBmaWxlCi0gIAlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSkpOwotICAJdHJ5IHsKLSAgCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgIT0gMCkgewotICAJCQlidy53cml0ZSgicGFja2FnZSAiICtwYWNrYWdlTmFtZSsiOyIpOwotICAJCQlidy5uZXdMaW5lKCk7Ci0gIAkJCWJ3Lm5ld0xpbmUoKTsKLSAgCQl9Ci0gIAkJYncud3JpdGUoImltcG9ydCBqYXZheC54bWwucnBjLmhhbmRsZXIuR2VuZXJpY0hhbmRsZXI7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCJpbXBvcnQgamF2YXgueG1sLnJwYy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQkKLSAgCQlidy53cml0ZSgicHVibGljIGNsYXNzICIrc2ltcGxlQ2xhc3NOYW1lKyIgZXh0ZW5kcyBHZW5lcmljSGFuZGxlciIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgieyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJCi0gIAkJYncud3JpdGUoIiAgIHB1YmxpYyBRTmFtZVtdIGdldEhlYWRlcnMgKCkiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIC8vIEZpbGwgaW4gbWV0aG9kIGJvZHkiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIHJldHVybiBudWxsOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgfSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVJlcXVlc3QoIE1lc3NhZ2VDb250ZXh0IGNvbnRleHQgKSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgeyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgICAgLy8gRmlsbCBpbiBtZXRob2QgYm9keSBvciBkZWxldGUgbWV0aG9kIHRvIHVzZSBHZW5lcmljSGFuZGxlciIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgICAgcmV0dXJuIHRydWU7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB9Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzcG9uc2UoIE1lc3NhZ2VDb250ZXh0IGNvbnRleHQgKSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgeyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgICAgLy8gRmlsbCBpbiBtZXRob2QgYm9keSBvciBkZWxldGUgbWV0aG9kIHRvIHVzZSBHZW5lcmljSGFuZGxlciAiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIHJldHVybiB0cnVlOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgfSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KCBNZXNzYWdlQ29udGV4dCBjb250ZXh0ICkiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIC8vIEZpbGwgaW4gbWV0aG9kIGJvZHkgb3IgZGVsZXRlIG1ldGhvZCB0byB1c2UgR2VuZXJpY0hhbmRsZXIiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIHJldHVybiB0cnVlOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgfSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQkKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIn0iKTsKLSAgCQlidy5jbG9zZSgpOwotICAJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CQotICAJfSAKLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgCi0gICAgewotICAJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0VSUk9SX1dSSVRFX0ZJTEUsIG5ldyBTdHJpbmdbXXsgY2xhc3NOYW1lIH0pLCBlICk7Ci0gIAkJaWYgKGJ3ICE9IG51bGwpIHsKLSAgCQkJdHJ5IHsKLSAgCQkJCWJ3LmNsb3NlKCk7Ci0gIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0gIAkJCX0KLSAgCQl9Ci0gIAl9Ci0gIAlyZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5Ta2VsZXRvbkVuYWJsZWQoYm9vbGVhbiBnZW5Ta2VsZXRvbikKLSAgewotICAJdGhpcy5nZW5Ta2VsZXRvbl8gPSBnZW5Ta2VsZXRvbjsKLSAgfQotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKXsKLSAgCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotICAJaWYgKG91dHB1dExvY2F0aW9uXyE9bnVsbCl7Ci0gIAkJcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKG91dHB1dExvY2F0aW9uXyk7Ci0gIAl9Ci0gIAlyZXR1cm4gcHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0Q2xhc3NOYW1lcygpewotICAJTGlzdCBjbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAJaWYgKGhhbmRsZXJOYW1lRm9yRWRpdF8hPW51bGwpewotICAJCWNsYXNzZXMuYWRkKGhhbmRsZXJOYW1lRm9yRWRpdF8pOwotICAJfQotICAJcmV0dXJuIGNsYXNzZXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBbiBhcnJheSBvZiBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJzCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyKEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyW10gaGFuZGxlckhvbGRlcnMpewotICAgIHRoaXMuaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfID0gaGFuZGxlckhvbGRlcnM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBbiBhcnJheSBvZiBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJzCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcnMoSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyW10gaGFuZGxlckhvbGRlcnMpewotICAgIHRoaXMuaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXyA9IGhhbmRsZXJIb2xkZXJzOwotICB9Ci0gIAotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0xpc3RPcHRpb25zQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0xpc3RPcHRpb25zQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFhN2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9MaXN0T3B0aW9uc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLS8qKgotICogQ29tbWFuZCBsaXN0cyB2YWxpZCBwcm9wZXJ0eSB2YWx1ZXMgd2hlcmUgcmVxdWVzdGVkLgotICogUmVxdWVzdHMgbWFkZSB2aWEgYSBBbnQgcHJvcGVydHkgdmFsdWUgc2V0dGluZyB3aGljaCBpcyBtYXBwZWQgdG8gdGhpcyBjb21tYW5kIGluIHRoZSBwbHVnaW4ueG1sIAotICovCi0KLXB1YmxpYyBjbGFzcyBMaXN0T3B0aW9uc0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcnVudGltZXNfID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHNlcnZlcnNfID0gZmFsc2U7Ci0JCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCSAgCQotCQlpZiAocnVudGltZXNfKQotCQl7CQkJCQotCQkJCVN0cmluZ1tdIHR5cGVJZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2aWNlVHlwZUxhYmVscygpLmdldElkc18oKTsKLQkJCSAgICBWZWN0b3IgcnVudGltZUlkcyA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCB0eXBlSWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkKLQkJCQkJCVN0cmluZyB0eXBlSWQgPSB0eXBlSWRzW2tdOwkJCQkJCQotCQkJCSAgICAJU3RyaW5nW10gcnVudGltZXMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lc0J5U2VydmljZVR5cGUodHlwZUlkKTsJCQkJICAgIAkKLQkJCQkJCQkJICAgIAotCQkJCSAgICAJZm9yIChpbnQgaiA9IDA7IGogPCBydW50aW1lcy5sZW5ndGg7IGorKykgewotCQkJCSAgICAJCVN0cmluZyBydW50aW1lID0gcnVudGltZXNbal07Ci0JCQkJICAgIAkJaWYgKCFydW50aW1lSWRzLmNvbnRhaW5zKHJ1bnRpbWUpKQotCQkJCSAgICAJCXsKLQkJCQkgICAgCQkJcnVudGltZUlkcy5hZGQocnVudGltZSk7CQotCQkJCSAgICAJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkKLQkJCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCAKLQkJCQkJCQlXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCwKLQkJCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfSU5GT19BTlRfUlVOVElNRV9IRUFESU5HLCAKLQkJCQkJCQludWxsKTsJCQkJCQotCQkJCQlnZXRFbnZpcm9ubWVudCgpLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRJbmZvKHN0YXR1c09iaik7Ci0JCQkJCQotCSAgICAgICAgCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZUlkcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewkJCQotCQkJCSAgZ2V0RW52aXJvbm1lbnQoKS5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0SW5mbyhuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgCi0JCQkJCQlXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIAotCQkJCQkJTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19JTkZPX0FOVF9TRVJWRVJfUlVOVElNRSwKLQkJCQkJCQkJaXRlcmF0b3IubmV4dCgpKSwgbnVsbCkpOwotCQkJfQotCQkJCQotCQkJCi0JCSAgICBTdHJpbmdbXSBjbGllbnRSdW50aW1lcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldEFsbFJ1bnRpbWVzRm9yQ2xpZW50U2lkZSgpOwotCQkgICAgCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsaWVudFJ1bnRpbWVzLmxlbmd0aDsgaSsrKSB7CQkJCQotCQkJCQotCQkJCWdldEVudmlyb25tZW50KCkuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEluZm8obmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIAotCQkJCQkJV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCAKLQkJCQkJCU5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfSU5GT19BTlRfQ0xJRU5UX1JVTlRJTUUsCi0JCQkJCQkJCWNsaWVudFJ1bnRpbWVzW2ldKSwgbnVsbCkpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2VydmVyc18pCi0JCXsJCQkKLQkJCWdldEVudmlyb25tZW50KCkuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEluZm8obmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIAotCQkJCQlXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCwKLQkJCQkJSVN0YXR1cy5PSywgCi0JCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfSU5GT19BTlRfU0VSVkVSX0hFQURJTkcsIG51bGwpKTsKLQkJCQotCQkJSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLQkJICAgICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlclR5cGVzLmxlbmd0aDsgaSsrKQotCQkgICAgICB7CQkgICAgICAgIAotCQkJCWdldEVudmlyb25tZW50KCkuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEluZm8obmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIAotCQkJCQkJV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCAKLQkJCQkJCU5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfSU5GT19BTlRfU0VSVkVSLAotCQkJCQkJCQlzZXJ2ZXJUeXBlc1tpXS5nZXRJZCgpKSwgbnVsbCkpOwotCi0JCSAgICAgIH0KLQkJfSAgCi0JCSAgCi0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExpc3RSdW50aW1lcyhib29sZWFuIHZhbHVlKQotCXsJCQotCQlydW50aW1lc189dmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExpc3RTZXJ2ZXJzKGJvb2xlYW4gdmFsdWUpCi0JewkJCi0JCXNlcnZlcnNfPXZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9PcGVuSmF2YUVkaXRvckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9PcGVuSmF2YUVkaXRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiZWRkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvT3BlbkphdmFFZGl0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQwNCAxMzQ5MTMgICBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBPcGVuSmF2YUVkaXRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIExpc3QgY2xhc3NOYW1lczsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICBwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkXyA9IHRydWU7ICAvLyBpcyB0cnVlIGJ5IGRlZmF1bHQKLQotICBwdWJsaWMgT3BlbkphdmFFZGl0b3JDb21tYW5kKCkKLSAgewotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICBpZiAoaXNFbmFibGVkXykgewotICAgICAgT3BlbkphdmFFZGl0b3JKb2Igam9iID0gbmV3IE9wZW5KYXZhRWRpdG9ySm9iKGNsYXNzTmFtZXMsIHByb2plY3QpOwotICAgICAgam9iLnNldFByaW9yaXR5KEpvYi5MT05HKTsKLSAgICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZXMoTGlzdCBjbGFzc05hbWVzKQotICB7Ci0gICAgdGhpcy5jbGFzc05hbWVzID0gY2xhc3NOYW1lczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCl7Ci0gICAgdGhpcy5pc0VuYWJsZWRfID0gaXNFbmFibGVkOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIE9wZW5KYXZhRWRpdG9ySm9iIGV4dGVuZHMgVUlKb2IKLSAgewotICAgIHByaXZhdGUgTGlzdCBjbGFzc05hbWVzOwotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyBPcGVuSmF2YUVkaXRvckpvYihMaXN0IGNsYXNzTmFtZXMsIElQcm9qZWN0IHByb2plY3QpCi0gICAgewotICAgICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLk9wZW5KYXZhRWRpdG9ySm9iIik7Ci0gICAgICB0aGlzLmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzOwotICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgewotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBjbGFzc05hbWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNsYXNzTmFtZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWl0Lm5leHQoKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIEphdmFVSS5vcGVuSW5FZGl0b3IodHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cy5FUlJPUiwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIDAsIE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVU5BQkxFX1RPX09QRU5fSkFWQV9FRElUT1IsIG5ldyBTdHJpbmdbXXtjbGFzc05hbWUsIHByb2plY3QuZ2V0TmFtZSgpfSksIHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb2plY3QhPW51bGwgfHwgY2xhc3NOYW1lcy5pc0VtcHR5KCkpewotICAgICAgICAvLyBkbyBub3RoaW5nIDsgbm90aGluZyB0byBvcGVuCi0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cy5FUlJPUiwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIDAsIE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVU5BQkxFX1RPX09QRU5fSkFWQV9FRElUT1IsIG5ldyBTdHJpbmdbXXtjbGFzc05hbWVzICE9IG51bGwgPyBjbGFzc05hbWVzLnRvU3RyaW5nKCkgOiAiIiwgcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXROYW1lKCkgOiAiIn0pLCBudWxsKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9QdWJsaXNoUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9QdWJsaXNoUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNjc4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvUHVibGlzaFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFByb2plY3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0KLQotcHJpdmF0ZSBTdHJpbmcgcHJvamVjdDsKLXByaXZhdGUgU3RyaW5nIHNlcnZlclR5cGVJRDsKLXByaXZhdGUgSVNlcnZlciBleGlzdGluZ1NlcnZlcjsKLQotCi0vKioKLSAqIERlZmF1bHQgQ1RPUjsKLSAqLwotcHVibGljIFB1Ymxpc2hQcm9qZWN0Q29tbWFuZCgpIHsKLX0KLQotLyoqCi0gKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gKi8KLXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotewotICBJRW52aXJvbm1lbnQgZW52ID0gZ2V0RW52aXJvbm1lbnQoKTsKLSAgCi0gIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgdHJ5Ci0gIHsKLSAgICBQcm9ncmVzc1V0aWxzLnJlcG9ydCggbW9uaXRvciwgQ29uc3VtcHRpb25NZXNzYWdlcy5QUk9HUkVTU19JTkZPX1BVQkxJU0hfV0VCX1BST0pFQ1QgKTsKLSAgICAKLSAgICBpZiAocHJvamVjdCA9PSBudWxsKXsKLSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORCApOyAKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCQotICAgIElQcm9qZWN0IGlQcm9qZWN0ID0gKElQcm9qZWN0KVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHByb2plY3QpOwotICAgIElTZXJ2ZXIgaW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUoU2VydmVyVXRpbHMuZ2V0TW9kdWxlKGlQcm9qZWN0KSwgc2VydmVyVHlwZUlELCBleGlzdGluZ1NlcnZlciwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfSU5TVEFOQ0VfTk9UX0ZPVU5EKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgaWYgKCgoU2VydmVyKWluc3RhbmNlKS5zaG91bGRQdWJsaXNoKCkpIHsKLSAgICAgIElTdGF0dXMgcmV0dXJuZWRTdGF0dXMgPSBwdWJsaXNoKGluc3RhbmNlLElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbW9uaXRvcik7Ci0gICAgICBzdGF0dXMgPSByZXR1cm5lZFN0YXR1czsKLSAgICAgIAotICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChpbnN0YW5jZS5wdWJsaXNoKGdldFByb2dyZXNzTW9uaXRvcigpKSk7Ci0gICAgICBlbnYuZ2V0TG9nKCkubG9nKElMb2cuT0ssIDUwMjYsIHRoaXMsICJleGVjdXRlIiwgbmV3IFN0cmluZygicHJvamVjdD0iK3Byb2plY3QrIiBzdWNjZXNzZnVsbHkgcHVibGlzaGVkIikpOwotICAgICAgLy9JTG9nLndyaXRlKFB1Ymxpc2hQcm9qZWN0Q29tbWFuZC5jbGFzcywiZXhlY3V0ZSIsSUxvZy5PSywicHJvamVjdD0iK3Byb2plY3QrIiBzdWNjZXNzZnVsbHkgcHVibGlzaGVkIik7Ci0gICAgfQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9QVUJMSVNILCBlKTsKLSAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci19Ci0KLXByaXZhdGUgSVN0YXR1cyBwdWJsaXNoKGZpbmFsIElTZXJ2ZXIgc2VydmVyLCBmaW5hbCBpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLXsKLQlmaW5hbCBJU3RhdHVzW10gaXN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotCWlzdGF0dXNbMF0gPSBTdGF0dXMuT0tfU1RBVFVTOwotCW1vbml0b3Iuc3ViVGFzayhDb25zdW1wdGlvbk1lc3NhZ2VzLlBST0dSRVNTX0lORk9fUFVCTElTSElOR19TRVJWRVIpOwotCi0JSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JewotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBzaGVsbE1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCQl7Ci0JCQlpc3RhdHVzWzBdID0gc2VydmVyLnB1Ymxpc2goa2luZCwgc2hlbGxNb25pdG9yKTsKLQkJfSAgCQkKLQl9OwotCi0JdHJ5Ci0JewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLGZhbHNlLHJ1bm5hYmxlKTsKLQl9Ci0JY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpCi0JewotCQlpc3RhdHVzWzBdID0gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGl0ZS5nZXRNZXNzYWdlKCksIGl0ZSApOwotCQlpdGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCWNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKQotCXsKLQkJaXN0YXR1c1swXSA9IG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBpZS5nZXRNZXNzYWdlKCksIGllICk7Ci0JCWllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLSAgCi0JcmV0dXJuIGlzdGF0dXNbMF07Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIHByb2plY3QpCi17Ci0gIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNlcnZlclR5cGVJRChTdHJpbmcgc2VydmVyVHlwZUlEKQotewotICB0aGlzLnNlcnZlclR5cGVJRCA9IHNlcnZlclR5cGVJRDsKLX0KLQotcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBleGlzdGluZ1NlcnZlcikKLXsKLSAgdGhpcy5leGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL1N0YXJ0U2VydmVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL1N0YXJ0U2VydmVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQyYjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9TdGFydFNlcnZlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLQotLyoqCi0gKiAoUmUpU3RhcnRzIGFuZCBwdWJsaXNoZXMgdGhlIHNlcnZlciBzcGVjaWZlZCBieSB0aGUgc2VydmVySW5zdGFuY2VJZCBhdHRyaWJ1dGUuCi0gKiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFydFNlcnZlckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIElMb2cgbG9nOwotICBwcml2YXRlIGJvb2xlYW4gZG9Bc3luY1B1Ymxpc2hfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLQkKLSAgCi0gIHB1YmxpYyBTdGFydFNlcnZlckNvbW1hbmQoKQotICB7Ci0gICAgbG9nICAgICAgICAgICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VMb2coKTsKLSAgICBkb0FzeW5jUHVibGlzaF8gPSB0cnVlOwotICB9Ci0JIAotICBwdWJsaWMgU3RhcnRTZXJ2ZXJDb21tYW5kKCBib29sZWFuIGRvQXN5bmNQdWJsaXNoICkKLSAgewotICAgIHRoaXMoKTsKLSAgICAKLSAgICBkb0FzeW5jUHVibGlzaF8gPSBkb0FzeW5jUHVibGlzaDsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySW5zdGFuY2VJZCk7Ci0gICAgaWYgKHNlcnZlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX0lOU1RBTkNFX05PVF9GT1VORCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIGludCBzZXJ2ZXJTdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCi0gICAgLy8gIFB1Ymxpc2ggaWYgcmVxdWlyZWQKLSAgICBpZiAoKChTZXJ2ZXIpc2VydmVyKS5zaG91bGRQdWJsaXNoKCkpIHsKLSAgICAJaWYgKHNlcnZlci5jYW5QdWJsaXNoKCkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gcHVibGlzaChzZXJ2ZXIsIElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbW9uaXRvciApOwotICAgICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgICAgewotICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gIHN0YXJ0L3Jlc3RhcnQgc2VydmVyIGlmIHJlcXVpcmVkCi0gICAgCQotICAgIHN3aXRjaCAoc2VydmVyU3RhdGUpCi0gICAgewotICAgICAgY2FzZSBJU2VydmVyLlNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgIGlmIChzZXJ2ZXIuY2FuU3RhcnQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpLmdldFNldmVyaXR5KCk9PUlTdGF0dXMuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXMgPSBzdGFydChzZXJ2ZXIsIG1vbml0b3IgKTsKLSAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgfSAgICAgICAKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVNlcnZlci5TVEFURV9TVEFSVEVEOiAgICAJCi0gICAgCWJvb2xlYW4gc2hvdWxkUmVzdGFydCA9ICgoU2VydmVyKXNlcnZlcikuc2hvdWxkUmVzdGFydCgpOyAgICAJCi0gICAgCQotICAgIAlpZiAoc2hvdWxkUmVzdGFydCAmJiBzZXJ2ZXIuY2FuUmVzdGFydChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSkuZ2V0U2V2ZXJpdHkoKT09SVN0YXR1cy5PSykKLSAgICAgICAgewotICAgICAgICAgIHN0YXR1cyA9IHJlc3RhcnQoc2VydmVyLCBtb25pdG9yICk7Ci0gICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgIH0gICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHByaXZhdGUgSVN0YXR1cyBwdWJsaXNoKGZpbmFsIElTZXJ2ZXIgc2VydmVyLCBmaW5hbCBpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgewotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBmaW5hbCBJU3RhdHVzW10gaXN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOyAKLSAgICBtb25pdG9yLnN1YlRhc2soQ29uc3VtcHRpb25NZXNzYWdlcy5QUk9HUkVTU19JTkZPX1BVQkxJU0hJTkdfU0VSVkVSKTsKLSAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLQl7Ci0gIAkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3Igc2hlbGxNb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJewotICAJCQlpc3RhdHVzWzBdID0gc2VydmVyLnB1Ymxpc2goa2luZCwgc2hlbGxNb25pdG9yKTsKLQkJfSAgCQkKLQl9OwotCQotCXRyeQotCXsKLQkJaWYoIGRvQXN5bmNQdWJsaXNoXyApCi0JCXsJCi0JCSAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSxmYWxzZSxydW5uYWJsZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgcnVubmFibGUucnVuKCBtb25pdG9yICk7Ci0JCX0KLQkJCi0JfQotCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKQotCXsKLQkgIGlzdGF0dXNbMF0gPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgaXRlLmdldE1lc3NhZ2UoKSwgaXRlICk7Ci0JICBpdGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCWNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKQotCXsKLQkgIGlzdGF0dXNbMF0gPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgaWUuZ2V0TWVzc2FnZSgpLCBpZSApOwotCSAgaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotICAgIAotICAgIAotCWlmIChpc3RhdHVzWzBdLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBpc3RhdHVzWzBdOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgbG9nLmxvZyhJTG9nLklORk8sIDUwNTEsIHRoaXMsICJwdWJsaXNoUHJvamVjdCIsICJJU2VydmVyPSIgKyBzZXJ2ZXIgKyAiLCBQdWJsaXNoIGNvbW1hbmQgY29tcGxldGVkIik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHByaXZhdGUgSVN0YXR1cyByZXN0YXJ0KElTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1vbml0b3Iuc3ViVGFzayhDb25zdW1wdGlvbk1lc3NhZ2VzLlBST0dSRVNTX0lORk9fU1RBUlRJTkdfU0VSVkVSKTsKLSAgICAgIHNlcnZlci5zeW5jaHJvbm91c1Jlc3RhcnQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG1vbml0b3IpOwotICAgICAgbG9nLmxvZyhJTG9nLklORk8sIDUwNTIsIHRoaXMsICJleGVjdXRlIiwgIklTZXJ2ZXI9IiArIHNlcnZlciArICIsIFJlc3RhcnQgY29tbWFuZCBjb21wbGV0ZWQiKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1NFUlZFUiwgZSk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBJU3RhdHVzIHN0YXJ0KElTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1vbml0b3Iuc3ViVGFzayhDb25zdW1wdGlvbk1lc3NhZ2VzLlBST0dSRVNTX0lORk9fU1RBUlRJTkdfU0VSVkVSKTsKLSAgICAgIHNlcnZlci5zeW5jaHJvbm91c1N0YXJ0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBtb25pdG9yKTsKLSAgICAgIGxvZy5sb2coSUxvZy5JTkZPLCA1MDUzLCB0aGlzLCAiZXhlY3V0ZSIsICJJU2VydmVyPSIgKyBzZXJ2ZXIgKyAiLCBTdGFydCBjb21tYW5kIGNvbXBsZXRlZCIpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0VSVkVSLCBlKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmVySW5zdGFuY2VJZChTdHJpbmcgc2VydmVySW5zdGFuY2VJZCkKLSAgewotICAgIHRoaXMuc2VydmVySW5zdGFuY2VJZCA9IHNlcnZlckluc3RhbmNlSWQ7Ci0gIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdjZGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDIwICAgMTIwNzE0IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5Xc3RXU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lBUENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJlZmVyZW5jZXMuV1NJQ29tcGxpYW5jZVV0aWxzOwotCi0KLQotcHVibGljIGNsYXNzIFdTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLQotICBwcml2YXRlIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0XzsKLQkKLSAgcHVibGljIFdTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kKCkKLSAgewotICB9IAotICAKLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgCi0gIAlQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgd3NpU1NCUENvbnRleHQgPSBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCk7IAotICAJUGVyc2lzdGVudFdTSUFQQ29udGV4dCB3c2lBUENvbnRleHQgPSBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpOyAKLSAgICBWZWN0b3Igc3RhdHVzU1NCUCA9IG5ldyBWZWN0b3IoKTsKLSAgICBzdGF0dXNTU0JQLmFkZCggbmV3IFN0YXR1cyggV1NJQ29tcGxpYW5jZVV0aWxzLmdldFdTSVNldmVyaXR5KHNlcnZpY2VQcm9qZWN0Xywgd3NpU1NCUENvbnRleHQpLCAiaWQiLCAwLAotICAgICAgICBXc3RXU1BsdWdpbk1lc3NhZ2VzLldTSV9TU0JQX0lOQ09NUExJQU5UX1JVTlRJTUUsIG51bGwgKSApOwotICAgIFN0YXR1c1tdIHN0YXR1c2VzU1NCUCA9IChTdGF0dXNbXSkgc3RhdHVzU1NCUC50b0FycmF5KG5ldyBTdGF0dXNbc3RhdHVzU1NCUC5zaXplKCldKTsKLSAgICAKLSAgICBWZWN0b3Igc3RhdHVzQVAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc3RhdHVzQVAuYWRkKCBuZXcgU3RhdHVzKCBXU0lDb21wbGlhbmNlVXRpbHMuZ2V0V1NJU2V2ZXJpdHkoc2VydmljZVByb2plY3RfLCB3c2lBUENvbnRleHQpLCAiaWQiLCAwLCAKLSAgICAJCVdzdFdTUGx1Z2luTWVzc2FnZXMuV1NJX0FQX0lOQ09NUExJQU5UX1JVTlRJTUUsIG51bGwgKSk7Ci0gICAgU3RhdHVzW10gc3RhdHVzZXNBUCA9IChTdGF0dXNbXSkgc3RhdHVzQVAudG9BcnJheShuZXcgU3RhdHVzW3N0YXR1c0FQLnNpemUoKV0pOwotCi0gICAgaWYgKFdTSUNvbXBsaWFuY2VVdGlscy5jaGVja1dTSUNvbXBsaWFuY2UgKGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKSwgc3RhdHVzZXNBUCwgc2VydmljZVByb2plY3RfLCB3c2lBUENvbnRleHQpKSAKLSAgICB7Ci0gICAgCWlmIChXU0lDb21wbGlhbmNlVXRpbHMuY2hlY2tXU0lDb21wbGlhbmNlIChlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCksIHN0YXR1c2VzU1NCUCwgc2VydmljZVByb2plY3RfLCB3c2lTU0JQQ29udGV4dCkpIAotICAgICAgewotICAgIAkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCX0gCi0gICAgICBlbHNlIAotICAgICAgewotICAgIAkgIC8vIFNldCBtZXNzYWdlIHRvIGVtcHR5IHN0cmluZyBzbyB0aGF0IGFuIGVycm9yIGRpYWxvZyBkb2VzCi0gICAgCSAgLy8gbm90IHBvcC11cCB0ZWxsaW5nIHRoZSB1c2VyIHRoYXQgdGhleSBjYW5ub3QgY29udGludWUKLSAgICAJICAvLyBiZWNhdXNlIHRoZXkgY2hvb3NlIG5vdCB0byBpZ25vcmUgdGhlIFdTLUkgbm9uLWNvbXBsaWFuY2Ugd2FybmluZy4KLSAgICAJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggIiIgKTsKLSAgICAJfQotICAgIH0gCi0gICAgZWxzZSAKLSAgICB7Ci0gICAgCS8vIFNldCBtZXNzYWdlIHRvIGVtcHR5IHN0cmluZyBzbyB0aGF0IGFuIGVycm9yIGRpYWxvZyBkb2VzCi0gIAkgIAkvLyBub3QgcG9wLXVwIHRlbGxpbmcgdGhlIHVzZXIgdGhhdCB0aGV5IGNhbm5vdCBjb250aW51ZQotICAJICAJLy8gYmVjYXVzZSB0aGV5IGNob29zZSBub3QgdG8gaWdub3JlIHRoZSBXUy1JIG5vbi1jb21wbGlhbmNlIHdhcm5pbmcuCi0JCSAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCAiIiApOwotCX0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpIHsKLQl0aGlzLnNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL0VjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzg3ZDJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL0VjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHMgPSB2YWx1ZS50b1N0cmluZygpOwotICAgIGlmIChzLmluZGV4T2YoIjoiKSA8IDApCi0gICAgewotICAgICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgIGlmIChyZXMuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcyA9IHJlcy5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1Byb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1Byb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2NWY0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9Qcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjEgICAxMjQzMDIgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdE5hbWUySVByb2plY3RUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9qZWN0ID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICBpbnQgc2xhc2hJbmRleCA9IHByb2plY3QuaW5kZXhPZignLycpOwotICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gcHJvamVjdDsKLQotICAgICAgaWYgKHNsYXNoSW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHByb2plY3ROYW1lID0gcHJvamVjdC5zdWJzdHJpbmcoMCwgc2xhc2hJbmRleCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhMGNkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyMCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKgotICogVHJhbnNmb3JtcyBhIHNlcnZlciBpbnN0YW5jZSBpZCB0byBhbiBJU2VydmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIjdHJhbnNmb3JtKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAKLSAgICBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJbnN0SWQgPSAoU3RyaW5nKXZhbHVlOwotICAgIElTZXJ2ZXIgc2VydmVySW5zdCA9IG51bGw7Ci0gICAgaWYgKGV4aXN0aW5nU2VydmVySW5zdElkICE9IG51bGwpIHsKLSAgICAJc2VydmVySW5zdCA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihleGlzdGluZ1NlcnZlckluc3RJZCk7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXJJbnN0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJOYW1lMklTZXJ2ZXJUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTE2MGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyTmFtZTJJU2VydmVyVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VydmVyTmFtZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAgICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCE9MCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgICAgIGlmICgoc2VydmVyLmdldE5hbWUoKSkuZXF1YWxzKHNlcnZlck5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vRGVmYXVsdGluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9EZWZhdWx0aW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzNzk1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9EZWZhdWx0aW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNyAgIDEzODA1OCBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIERlZmF1bHRpbmdVdGlscyB7Ci0JCi0JcHVibGljIERlZmF1bHRpbmdVdGlscygpCi0JewotCQkJCi0JfQotCQotCS8qKgotCSAqIAotCSAqIFVzZXMgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBkZXRlcm1pbmUgYSB2YWxpZCBkZWZhdWx0IEVBUiBwcm9qZWN0IG5hbWU6Ci0JICogIAotCSAqIDEuIElmIHByb2plY3QgZG9lcyBleGlzdDoKLQkgKiAJCWEgLSBsb29rIGZvciBhbiBleGlzdGluZywgcmVmZXJlbmNpbmcgRUFSIGNvbXBvbmVudCwgaWYgb25lIGV4aXN0cyByZXR1cm4gdGhhdCBFQVIgbmFtZQotCSAqIAkJYiAtIGxvb2sgZm9yIGFuIGV4aXN0aW5nIEVBUiBjb21wb25lbnQgd2l0aCB0aGUgc2FtZSBKMkVFIHZlcnNpb24gYXMgdGhlIHByb2plY3QKLQkgKiAyLiBJZiBjYW4ndCBmaW5kIGFuIGFwcHJvcHJpYXRlIGV4aXN0aW5nIEVBUiBjb21wb25lbnQgb3IgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgCi0JICogICAgIHdvcmtzcGFjZSwgcmV0dXJuIGEgbmV3IEVBUiBuYW1lIG9mIGZvcm0gcHJvamVjdE5hbWVFQVIKLQkgKiAzLiBJZiBwcm9qZWN0IG5hbWUgaXMgbnVsbCBvciBhbiBlbXB0eSBzdHJpbmcgcmV0dXJuIHRoZSBkZWZhdWx0IEVBUiBuYW1lCi0JICogCi0JICogQHBhcmFtIHByb2plY3ROYW1lIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBmb3IgdGhlIHNlcnZpY2UKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgRUFSIHByb2plY3QgbmFtZSBmb3IgdGhlIHByb2plY3QgbmFtZSBwcm92aWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFQVJQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpCi0JewotCi0JCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCi0JCQlJUHJvamVjdCBwcm9qID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQotCQkJaWYgKHByb2ouZXhpc3RzKCkpIHsKLQkJCQkKLQkJCQkvL1N0ZXAgMWEgLSByZXR1cm4gYSByZWZlcmVuY2luZyBFQVIgcHJvamVjdAotCQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gZWFycyA9IEoyRUVVdGlscy5nZXRSZWZlcmVuY2luZ0VBUkNvbXBvbmVudHMocHJvaik7Ci0JCQkJaWYgKGVhcnMgIT0gbnVsbCAmJiBlYXJzLmxlbmd0aCA+IDApIHsKLQkJCQkJcmV0dXJuIGVhcnNbMF0uZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQkKLQkJCQkvL1N0ZXAgMWIgLSByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXhpc3RpbmcgRUFSIHByb2plY3QKLQkJCSAgICBJVmlydHVhbENvbXBvbmVudFtdIGFsbEVhckNvbXBzID0gSjJFRVV0aWxzLmdldEFsbEVBUkNvbXBvbmVudHMoKTsJCQkgICAgICAKLQotCQkJICAgIGlmIChhbGxFYXJDb21wcy5sZW5ndGggPiAwKQotCQkJICAgIHsJCQkgICAgICAKLQkJCSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYWxsRWFyQ29tcHMubGVuZ3RoOyBpKyspCi0JCQkgICAgICAgIHsKLQkJCSAgICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gYWxsRWFyQ29tcHNbaV0uZ2V0UHJvamVjdCgpOwotCQkJICAgICAgICAgIElTdGF0dXMgYXNzb2NpYXRpb25TdGF0dXMgPSBKMkVFVXRpbHMuY2FuQXNzb2NpYXRlUHJvamVjdFRvRUFSKHByb2osIGVhclByb2plY3QpOwotCQkJICAgICAgICAgIGlmIChhc3NvY2lhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpPT1JU3RhdHVzLk9LKQotCQkJICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgIHJldHVybiBhbGxFYXJDb21wc1tpXS5nZXROYW1lKCk7IAotCQkJICAgICAgICAgIH0KLQkJCSAgICAgICAgfQkJCSAgICAgIAkJCSAgICAgIAotCQkJICAgIH0KLQkJCX0KLQkJCQotCQkJLy9TdGVwIDIgLSByZXR1cm4gcHJvamVjdCBuYW1lIHdpdGggRUFSIG9uIHRoZSBlbmQKLQkJCXJldHVybiBwcm9qZWN0TmFtZSArIFJlc291cmNlVXRpbHMuZ2V0RGVmYXVsdEVBUkV4dGVuc2lvbigpOwkJCQotCQl9Ci0JCQotCQkvL1N0ZXAgMyAtIHJldHVybiB0aGUgZGVmYXVsdCBFQVIgcHJvamVjdCBuYW1lCi0JCXJldHVybiBSZXNvdXJjZVV0aWxzLmdldERlZmF1bHRTZXJ2aWNlRUFSUHJvamVjdE5hbWUoKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0ZpbmlzaEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9GaW5pc2hGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjAzZWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0ZpbmlzaEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoVGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmluaXNoRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci0gIHB1YmxpYyBGaW5pc2hGcmFnbWVudCgpCi0gIHsJCi0JYWRkKG5ldyBGaW5pc2hUZXN0RnJhZ21lbnQoKSApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9IYW5kbGVyRGVzY3JpcHRpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0hhbmRsZXJEZXNjcmlwdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTYzYmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0hhbmRsZXJEZXNjcmlwdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogMjAwNjA0MDQgMTM0OTEzICBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLQotCi0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyRGVzY3JpcHRpb25IZWxwZXIgewotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBIYW5kbGVyRGVzY3JpcHRvckhvbGRlciBnaXZlbiB0aGUgbmFtZQotICAgKiBAcGFyYW0gaGRocwotICAgKiBAcGFyYW0gZGVzY05hbWUKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXIgZ2V0Rm9yRGVzY3JpcHRpb25OYW1lKEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcltdIGhkaHMsIFN0cmluZyBkZXNjTmFtZSl7Ci0gICAgZm9yIChpbnQgaT0wO2k8aGRocy5sZW5ndGg7aSsrKXsKLSAgICAgIFN0cmluZyBuYW1lID0gaGRoc1tpXS5nZXREZXNjcmlwdGlvbk5hbWUoKTsKLSAgICAgIGlmIChuYW1lIT1udWxsICYmIG5hbWUuZXF1YWxzKGRlc2NOYW1lKSl7Ci0gICAgICAgIHJldHVybiBoZGhzW2ldOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBnZXR0aW5nIGFsbCBkZXNjcmlwdGlvbiBuYW1lcwotICAgKiBAcGFyYW0gaGRocwotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbERlc2NyaXB0aW9uTmFtZXMoSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyW10gaGRocyl7Ci0gICAgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2hkaHMubGVuZ3RoXTsKLSAgICBmb3IoaW50IGk9MDtpPGhkaHMubGVuZ3RoO2krKyl7Ci0gICAgICBuYW1lc1tpXT1oZGhzW2ldLmdldERlc2NyaXB0aW9uTmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbEhhbmRsZXJDbGFzc05hbWVzKEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcltdIGhkaHMpewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDtpPGhkaHMubGVuZ3RoO2krKyl7Ci0gICAgICBMaXN0IGxpc3QgPSBoZGhzW2ldLmdldEhhbmRsZXJMaXN0KCk7Ci0gICAgICBpZiAobGlzdCE9bnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpewotICAgICAgICBmb3IgKGludCBqPTA7ajxsaXN0LnNpemUoKTtqKyspewotICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pbGlzdC5nZXQoaik7Ci0gICAgICAgICAgdi5hZGQoaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmdbXSl2LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0hhbmRsZXJEZXNjcmlwdGlvbkhvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwY2JhZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDA0IDEzNDkxMyAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA2MDUxOCAxNDI1NTQgc2VuZ3BsQGNhLmlibS5jb20gIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5IYW5kbGVyVGFibGVJdGVtOwotCi0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXIgewotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb25OYW1lOwotICBwcml2YXRlIExpc3QgaGFuZGxlckxpc3Q7Ci0gIHByaXZhdGUgV2ViU2VydmljZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uT2JqZWN0OwotICBwcml2YXRlIElQYXRoIHNvdXJjZU91dHB1dFBhdGg7Ci0gIAotICAgIAotICBwdWJsaWMgSVBhdGggZ2V0U291cmNlT3V0cHV0UGF0aCgpIHsKLSAgICByZXR1cm4gc291cmNlT3V0cHV0UGF0aDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U291cmNlT3V0cHV0UGF0aChJUGF0aCBzb3VyY2VPdXRwdXRQYXRoKSB7Ci0gICAgdGhpcy5zb3VyY2VPdXRwdXRQYXRoID0gc291cmNlT3V0cHV0UGF0aDsKLSAgfQotCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCl7Ci0gICAgaWYgKGRlc2NyaXB0aW9uT2JqZWN0IT1udWxsKQotICAgICAgcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChkZXNjcmlwdGlvbk9iamVjdCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIGdldCB0aGUgV2ViU2VydmljZURlc2NyaXB0aW9uIG9iamVjdCAKLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb25PYmplY3QoKSB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uT2JqZWN0OwotICB9Ci0gIAotICAvKioKLSAgICogc2V0IFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBvYmplY3QKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uT2JqZWN0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbk9iamVjdChXZWJTZXJ2aWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmplY3QpIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uT2JqZWN0ID0gZGVzY3JpcHRpb25PYmplY3Q7Ci0gIH0KLQotICAvKioKLSAgICogZ2V0IERlc2NyaXB0aW9uIG5hbWUKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbk5hbWUoKSB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uTmFtZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIHNldCBEZXNjcmlwdGlvbiBuYW1lCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbk5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uTmFtZShTdHJpbmcgZGVzY3JpcHRpb25OYW1lKSB7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbk5hbWUgPSBkZXNjcmlwdGlvbk5hbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBnZXQgTGlzdCBvZiBIYW5kbGVyVGFibGVJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgZGVzY3JpcHRpb24KLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SGFuZGxlckxpc3QoKSB7Ci0gICAgcmV0dXJuIGhhbmRsZXJMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIHNldCBMaXN0IG9mIEhhbmRsZXJUYWJsZUl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBkZXNjcmlwdGlvbgotICAgKiBAcGFyYW0gaGFuZGxlckxpc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJMaXN0KExpc3QgaGFuZGxlckxpc3QpIHsKLSAgICB0aGlzLmhhbmRsZXJMaXN0ID0gaGFuZGxlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEhhbmRsZXJUb0FsbFBvcnRzKCl7Ci0gICAgCi0gICAgaWYgKGhhbmRsZXJMaXN0IT1udWxsICYmICFoYW5kbGVyTGlzdC5pc0VtcHR5KCkpewotICAgICAgCi0gICAgICBmb3IgKGludCB6PTA7ejxoYW5kbGVyTGlzdC5zaXplKCk7eisrKXsKLSAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSloYW5kbGVyTGlzdC5nZXQoeik7ICAKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uT2JqZWN0IT1udWxsKSB7Ci0gICAgICAgICAgTGlzdCBwb3J0Q29tcG9uZW50cyA9IGRlc2NyaXB0aW9uT2JqZWN0LmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgeD0wO3g8cG9ydENvbXBvbmVudHMuc2l6ZSgpO3grKyl7Ci0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHdzUG9ydCA9IChQb3J0Q29tcG9uZW50KSBwb3J0Q29tcG9uZW50cy5nZXQoeCk7Ci0gICAgICAgICAgICBMaXN0IHdzSGFuZGxlcnMgPSB3c1BvcnQuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICAgIGlmICh3c0hhbmRsZXJzIT1udWxsKXsKLSAgICAgICAgICAgICAgYm9vbGVhbiBhbHJlYWR5RXhpc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGZvciAoaW50IHk9MDt5PHdzSGFuZGxlcnMuc2l6ZSgpO3krKyl7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpd3NIYW5kbGVycy5nZXQoeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIuZ2V0SGFuZGxlckNsYXNzKCkuZXF1YWxzKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgIGFscmVhZHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAvL2NyZWF0ZSBpdCBhbmQgYWRkIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgV3NkZEZhY3Rvcnkgd3NkZEZhY3RvcnkgPSBuZXcgV3NkZEZhY3RvcnlJbXBsKCk7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBuZXdIYW5kbGVyID0gd3NkZEZhY3RvcnkuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICAgICAgICAgIG5ld0hhbmRsZXIuc2V0SGFuZGxlck5hbWUoaHRpLmdldEhhbmRsZXJOYW1lKCkpOwotICAgICAgICAgICAgICAgIG5ld0hhbmRsZXIuc2V0SGFuZGxlckNsYXNzKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIHdzSGFuZGxlcnMuYWRkKG5ld0hhbmRsZXIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0hhbmRsZXJTZXJ2aWNlUmVmSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9IYW5kbGVyU2VydmljZVJlZkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFmZjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0hhbmRsZXJTZXJ2aWNlUmVmSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAyMDA2MDQwNCAxMzQ5MTMgIHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdSAKLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLQotCi1wdWJsaWMgY2xhc3MgSGFuZGxlclNlcnZpY2VSZWZIZWxwZXIgewotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBIYW5kbGVyU2VydmljZVJlZkhvbGRlciBnaXZlbiB0aGUgbmFtZQotICAgKiBAcGFyYW0gaHNyaAotICAgKiBAcGFyYW0gZGVzY05hbWUKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBIYW5kbGVyU2VydmljZVJlZkhvbGRlciBnZXRGb3JTZXJ2aWNlUmVmTmFtZShIYW5kbGVyU2VydmljZVJlZkhvbGRlcltdIGhzcmgsIFN0cmluZyBkZXNjTmFtZSl7Ci0gICAgZm9yIChpbnQgaT0wO2k8aHNyaC5sZW5ndGg7aSsrKXsKLSAgICAgIFN0cmluZyBuYW1lID0gaHNyaFtpXS5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotICAgICAgaWYgKG5hbWUhPW51bGwgJiYgbmFtZS5lcXVhbHMoZGVzY05hbWUpKXsKLSAgICAgICAgcmV0dXJuIGhzcmhbaV07Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAgbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgYWxsIHRoZSBoYW5kbGVyIENsYXNzIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHNlcnZpY2UgcmVmCi0gICAqIEBwYXJhbSBoc3JoCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsSGFuZGxlckNsYXNzTmFtZXMoSGFuZGxlclNlcnZpY2VSZWZIb2xkZXJbXSBoc3JoKXsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpPTA7aTxoc3JoLmxlbmd0aDtpKyspewotICAgICAgTGlzdCBsaXN0ID0gaHNyaFtpXS5nZXRIYW5kbGVyTGlzdCgpOwotICAgICAgaWYgKGxpc3QhPW51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKXsKLSAgICAgICAgZm9yIChpbnQgaj0wO2o8bGlzdC5zaXplKCk7aisrKXsKLSAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKWxpc3QuZ2V0KGopOwotICAgICAgICAgIHYuYWRkKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pdi50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGFsbCB0aGUgc2VydmljZSBSZWYgbmFtZXMKLSAgICogQHBhcmFtIGhzcmgKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxTZXJ2aWNlUmVmTmFtZXMoSGFuZGxlclNlcnZpY2VSZWZIb2xkZXJbXSBoc3JoKXsKLSAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbaHNyaC5sZW5ndGhdOwotICAgIGZvcihpbnQgaT0wO2k8aHNyaC5sZW5ndGg7aSsrKXsKLSAgICAgIG5hbWVzW2ldPWhzcmhbaV0uZ2V0U2VydmljZVJlZk5hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vSGFuZGxlclNlcnZpY2VSZWZIb2xkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0hhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjAwNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vSGFuZGxlclNlcnZpY2VSZWZIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDQgICAxMzQ5MTNzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDYwNTE3ICAgMTQyMzM5IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KYXZhTU9GVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci0KLQotcHVibGljIGNsYXNzIEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyIHsKLQotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUmVmTmFtZTsKLSAgcHJpdmF0ZSBMaXN0IGhhbmRsZXJMaXN0OwotICBwcml2YXRlIFNlcnZpY2VSZWYgc2VydmljZVJlZjsKLSAgcHJpdmF0ZSBJUGF0aCBzb3VyY2VPdXRwdXRQYXRoOwotICAKLSAgcHVibGljIElQYXRoIGdldFNvdXJjZU91dHB1dFBhdGgoKSB7Ci0gICAgcmV0dXJuIHNvdXJjZU91dHB1dFBhdGg7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZU91dHB1dFBhdGgoSVBhdGggc291cmNlT3V0cHV0UGF0aCkgewotICAgIHRoaXMuc291cmNlT3V0cHV0UGF0aCA9IHNvdXJjZU91dHB1dFBhdGg7Ci0gIH0gIAotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgaWYgKHNlcnZpY2VSZWYhPW51bGwpCi0gICAgICByZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2VSZWYpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0SGFuZGxlckxpc3QoKSB7Ci0gICAgcmV0dXJuIGhhbmRsZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTGlzdChMaXN0IGhhbmRsZXJMaXN0KSB7Ci0gICAgdGhpcy5oYW5kbGVyTGlzdCA9IGhhbmRsZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgU2VydmljZVJlZiBnZXRTZXJ2aWNlUmVmKCkgewotICAgIHJldHVybiBzZXJ2aWNlUmVmOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgc2VydmljZVJlZikgewotICAgIHRoaXMuc2VydmljZVJlZiA9IHNlcnZpY2VSZWY7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVJlZk5hbWUoKSB7Ci0gICAgcmV0dXJuIHNlcnZpY2VSZWZOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUmVmTmFtZShTdHJpbmcgc2VydmljZVJlZk5hbWUpIHsKLSAgICB0aGlzLnNlcnZpY2VSZWZOYW1lID0gc2VydmljZVJlZk5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEhhbmRsZXJUb1NlcnZpY2VSZWYoKXsKLSAgICBpZiAoaGFuZGxlckxpc3QhPW51bGwgJiYgIWhhbmRsZXJMaXN0LmlzRW1wdHkoKSl7Ci0gICAgICAKLSAgICAgIGZvciAoaW50IHg9MDt4PGhhbmRsZXJMaXN0LnNpemUoKTt4KyspewotICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKWhhbmRsZXJMaXN0LmdldCh4KTsKLSAgICAgICAgaWYgKHNlcnZpY2VSZWYhPW51bGwpewotICAgICAgICAgIExpc3QgZXhpc3RpbmdIYW5kbGVycyA9IHNlcnZpY2VSZWYuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICBib29sZWFuIGFscmVhZHlFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7aTxleGlzdGluZ0hhbmRsZXJzLnNpemUoKTtpKyspewotICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpZXhpc3RpbmdIYW5kbGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlci5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLmVxdWFscyhodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpKSl7Ci0gICAgICAgICAgICAgIGFscmVhZHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IHdzQ2xpZW50RmFjdG9yeSA9IG5ldyBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsKCk7Ci0gICAgICAgICAgICBIYW5kbGVyIG5ld0hhbmRsZXIgPSB3c0NsaWVudEZhY3RvcnkuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICAgICAgbmV3SGFuZGxlci5zZXRIYW5kbGVyTmFtZShodGkuZ2V0SGFuZGxlck5hbWUoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2VSZWYpOwotICAgICAgICAgICAgICBpZiAocHJvamVjdCE9bnVsbCkgewotICAgICAgICAgICAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBKYXZhTU9GVXRpbHMuZ2V0SmF2YUNsYXNzKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCksIHByb2plY3QpOwotICAgICAgICAgICAgICAgIGlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgbmV3SGFuZGxlci5zZXRIYW5kbGVyQ2xhc3MoamF2YUNsYXNzKTsKLSAgICAgICAgICAgICAgICB9ICAgIAotICAgICAgICAgICAgICAgIGV4aXN0aW5nSGFuZGxlcnMuYWRkKG5ld0hhbmRsZXIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9TY2VuYXJpb0NsZWFudXBDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9TY2VuYXJpb0NsZWFudXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjQ0ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vU2NlbmFyaW9DbGVhbnVwQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwODI1ICAgMTU1MTE0IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV1NETFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogIFRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCB0byBjbGVhbiB1cCBkYXRhIGFmdGVyIGVpdGhlciB0aGUKLSAqICBjbGllbnQgb3Igc2VydmljZSB3aXphcmRzLiAgQ3VycmVudGx5IGlzIGp1c3QgcmVzZXRzIHRoZQotICogIHBhcnNlciBmYWN0b3J5LiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2VuYXJpb0NsZWFudXBDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotCSAgV1NETFBhcnNlckZhY3Rvcnkua2lsbFBhcnNlcigpOwotICAgIE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuY2xlYW51cCgpOwotCQotCSAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLQotICAKLSAgcHVibGljIElTdGF0dXMgdW5kbyggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLQkgIC8vIEV2ZW4gaWYgdGhlIHVzZXIgY2FuY2VscyBvdXQgb2YgdGhlIHdpemFyZCB3ZSB3YW50IHRvCi0JICAvLyBraWxsIHRoZSBwYXJzZXIuCi0JICBXU0RMUGFyc2VyRmFjdG9yeS5raWxsUGFyc2VyKCk7Ci0gICAgT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5jbGVhbnVwKCk7Ci0gICAgCi0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL1NlcnZlclNlbGVjdGlvblV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9TZXJ2ZXJTZWxlY3Rpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjg4NmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL1NlcnZlclNlbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMzI0ICAgMTE2NzUwIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNzAxMTkgICAxNTk0NTggbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uSVNlcnZlckRlZmF1bHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLlNlcnZlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlclNlbGVjdGlvblV0aWxzCi17Ci0KLSAgcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRSdW50aW1lVGFyZ2V0KFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAJaWYoIHByb2plY3ROYW1lICE9IG51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICl7IC8vJE5PTi1OTFMtMSQKLSAgCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgCQlpZiggcHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgKXsKLSAgCQkJcmV0dXJuIFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOyAKLSAgCQl9Ci0gIAl9Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldEZpcnN0RXhpc3RpbmdTZXJ2ZXJGcm9tRmFjdG9yeUlkKFN0cmluZyBmYWN0b3J5SWQpCi0gIHsKLSAgCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gIAlpZiAoc2VydmVycz09bnVsbCB8fCBzZXJ2ZXJzLmxlbmd0aCE9MCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gIAllbHNlCi0gIAl7Ci0gIAkgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAJICB7Ci0gIAkgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAJICAgIGlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkuZXF1YWxzKGZhY3RvcnlJZCkpCi0gIAkgICAgewotICAJICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCX0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJU2VydmVyW10gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhJUnVudGltZSBydW50aW1lKQotICB7Ci0gICAgaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgaWYgKHNlcnZlcnM9PW51bGwgfHwgc2VydmVycy5sZW5ndGg9PTApCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBBcnJheUxpc3QgY29tcGF0aWJsZVNlcnZlcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLSAgICBpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgCVN0cmluZyBydW50aW1lSWQgPSBydW50aW1lVHlwZS5nZXRJZCgpOwotCQlmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLQkJewotCQkgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLQkJICBJUnVudGltZVR5cGUgcnVudGltZVR5cGUyID0gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpOwotCQkgIGlmIChydW50aW1lVHlwZTIgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIFN0cmluZyBzZXJ2ZXJSdW50aW1lSWQgPSBydW50aW1lVHlwZTIuZ2V0SWQoKTsKLQkJCSAgaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLQkJCSAgICBjb21wYXRpYmxlU2VydmVyc0xpc3QuYWRkKHNlcnZlcik7Ci0JCSAgfQotCQkgIAotCQl9Ci0gICAgfQotICAgIGlmIChjb21wYXRpYmxlU2VydmVyc0xpc3Quc2l6ZSgpPDEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAKLSAgICBPYmplY3RbXSBjb21wYXRpYmxlU2VydmVyc0FycmF5ID0gY29tcGF0aWJsZVNlcnZlcnNMaXN0LnRvQXJyYXkoKTsKLSAgICBJU2VydmVyW10gY29tcGF0aWJsZVNlcnZlcnMgPSBuZXcgSVNlcnZlcltjb21wYXRpYmxlU2VydmVyc0FycmF5Lmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaj0wOyBqPGNvbXBhdGlibGVTZXJ2ZXJzQXJyYXkubGVuZ3RoOyBqKyspCi0gICAgewotICAgICAgY29tcGF0aWJsZVNlcnZlcnNbal0gPSAoSVNlcnZlciljb21wYXRpYmxlU2VydmVyc0FycmF5W2pdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY29tcGF0aWJsZVNlcnZlcnM7Ci0gIH0KLSAgICAKLSAgcHVibGljIHN0YXRpYyBTZXJ2ZXJJbmZvIGdldEV4dGVuZGVyUmVjb21tZW5kYXRpb24oSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIsICJzZXJ2ZXJEZWZhdWx0ZXIiKTsKLSAgICBmb3IgKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IHNlcnZlckRlZmF1bHRlck9iamVjdCA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICBpZiAoc2VydmVyRGVmYXVsdGVyT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZlckRlZmF1bHRlcikKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlckRlZmF1bHRlciBzZXJ2ZXJEZWZhdWx0ZXIgPSAoSVNlcnZlckRlZmF1bHRlcilzZXJ2ZXJEZWZhdWx0ZXJPYmplY3Q7Ci0gICAgICAgIFNlcnZlckluZm8gc2VydmVySW5mbyA9IHNlcnZlckRlZmF1bHRlci5yZWNvbW1lbmREZWZhdWx0U2VydmVyKHByb2plY3QpOwotICAgICAgICBpZiAoc2VydmVySW5mbyAhPSBudWxsKQotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9WYWxpZGF0aW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEzOWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjIgICAxMTU4MzQgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQxMyAgIDEzNTU4MSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDIwICAgMTM2MTU4IHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjAgICAxMzY3MDUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQyMSAgIDEzNjc2MSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI1ICAgMTM3ODMxIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjcgICAxMjY3ODAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQyNyAgIDEzODA1OCBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDkwNSAgIDE1NjIzMCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbiwgSGFuZGxpbmcgcHJvamVjdHMgd2l0aCBubyB0YXJnZXQgcnVudGltZQotICogMjAwNzAxMTkgICAxNTk0NTggbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuRmFjZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlJ1bnRpbWVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlZlcnNpb25Gb3JtYXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25VdGlscwotewotCS8vQ29uc3RhbnRzIHRvIGhlbHAgZGVjaWRlIGhvdyBtdWNoIHZhbGlkYXRpb24gdG8gZG8uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURBVEVfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURBVEVfQUxMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJREFURV9TRVJWRVJfUlVOVElNRV9DSEFOR0VTID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJREFURV9QUk9KRUNUX0NIQU5HRVMgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElEQVRFX1NDQUxFX0NIQU5HRVMgPSA0OwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uVXRpbHMoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IHZhbGlkYXRpb24gc3RhdGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBzdGF0ZQotICAgKiBhbmQgdGhlIHJlcXVlc3RlZCB2YWxpZGF0aW9uIHN0YXRlLiBJZiB0aGUgcmVxdWVzdGVkIHZhbGlkYXRpb24gc3RhdGUKLSAgICogZG9lcyBub3QgY292ZXIgYWxsIHRoZSB2YWxpZGF0aW9uIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbgotICAgKiBzdGF0ZSwgVkFMSURBVEVfQUxMIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSByZXF1ZXN0ZWQgdmFsaWRhdGlvbgotICAgKiBzdGF0ZSBpcyByZXR1cm5lZC4KLSAgICogCi0gICAqIEBwYXJhbSBjdXJyZW50VmFsaWRhdGlvblN0YXRlIHRoZSB2YWxpZGF0b24gc3RhdGUgYXQgdGhlIHRpbWUgdGhlIGNhbGxlcidzIHJlcXVlc3RzIGEgY2hhbmdlCi0gICAqIEBwYXJhbSByZXF1ZXN0ZWRWYWxpZGF0aW9uU3RhdGUgdGhlIHZhbGlkYXRpb24gc3RhdGUgYmVpbmcgcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIuCi0gICAqIEByZXR1cm4gUmV0dXJucyBWQUxJREFURV9BTEwgaWYgdGhlIHJlcXVlc3RlZCB2YWxpZGF0aW9uIHN0YXRlCi0gICAqIGRvZXMgbm90IGNvdmVyIGFsbCB0aGUgdmFsaWRhdGlvbiBjb3ZlcmVkIGJ5IHRoZSBjdXJyZW50IHZhbGlkYXRpb24KLSAgICogc3RhdGUuIFJldHVybmVkIHJlcXVlc3RlZFZhbGlkYXRpb25TdGF0ZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgaW50IGdldE5ld1ZhbGlkYXRpb25TdGF0ZShpbnQgY3VycmVudFZhbGlkYXRpb25TdGF0ZSwgaW50IHJlcXVlc3RlZFZhbGlkYXRpb25TdGF0ZSkgewotCQlpbnQgbmV3VmFsaWRhdGlvblN0YXRlOwotCQlpZiAoY3VycmVudFZhbGlkYXRpb25TdGF0ZSA9PSBWQUxJREFURV9OT05FCi0JCQkJfHwgY3VycmVudFZhbGlkYXRpb25TdGF0ZSA9PSByZXF1ZXN0ZWRWYWxpZGF0aW9uU3RhdGUpIHsKLQkJCW5ld1ZhbGlkYXRpb25TdGF0ZSA9IHJlcXVlc3RlZFZhbGlkYXRpb25TdGF0ZTsKLQkJfSBlbHNlIHsKLQkJCW5ld1ZhbGlkYXRpb25TdGF0ZSA9IFZBTElEQVRFX0FMTDsKLQkJfQotCi0JCXJldHVybiBuZXdWYWxpZGF0aW9uU3RhdGU7Ci0KLQl9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBJU3RhdHVzIHJlc3VsdGluZyBmcm9tIGNoZWNraW5nIGZvciBlbXB0eSBmaWVsZHMuIFVzZWQgZm9yIHZhbGlkYXRpb24gb2YgcGFnZSAxIG9mIHRoZQotICAgKiBXZWIgc2VydmljZS9jbGllbnQgd2l6YXJkcy4KLSAgICogQHBhcmFtIHZhbGlkYXRpb25TdGF0ZSBvbmUgb2YgVkFMSURBVEVfTk9ORSwgVkFMSURBVEVfQUxMLCBWQUxJREFURV9TRVJWRVJfUlVOVElNRV9DSEFOR0VTLCBWQUxJREFURV9QUk9KRUNUX0NIQU5HRVMsIFZBTElEQVRFX1NDQUxFX0NIQU5HRVMKLSAgICogQHBhcmFtIHR5cGVJZCBXZWIgc2VydmljZSB0eXBlIGlkIChpc0NsaWVudD1mYWxzZSkgb3IgV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUgaWQgKGlzQ2xpZW50PXRydWUpIAotICAgKiBAcGFyYW0gc2VydmljZUltcGwgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3Qgc2VsZWN0aW9uIGZyb20gcGFnZSAxCi0gICAqIEBwYXJhbSBydW50aW1lSWQgV2ViIHNlcnZpY2UgcnVudGltZSBpZAotICAgKiBAcGFyYW0gc2VydmVySWQgc2VydmVyIHR5cGUgaWQKLSAgICogQHBhcmFtIHByb2plY3ROYW1lIG5hbWUgb2YgcHJvamVjdAotICAgKiBAcGFyYW0gbmVlZEVhciBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIEVBUiBpcyByZXF1aXJlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdC4KLSAgICogQHBhcmFtIGVhclByb2plY3ROYW1lIG5hbWUgb2YgRUFSIHByb2plY3QKLSAgICogQHBhcmFtIHByb2plY3RUeXBlSWQgdGVtcGxhdGUgaWQKLSAgICogQHBhcmFtIGlzQ2xpZW50IGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgZm9yIGNsaWVudCBzaWRlIHZhbGlkYXRpb24sIAotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIHNlcnZpY2Ugc2lkZSB2YWxpZGF0aW9uLgotICAgKiBAcmV0dXJuIElTdGF0dXMgd2l0aCBzZXZlcml0eSBJU3RhdHVzLk9LIGlmIGFsbCBtYW5kYXRvcnkgZmllbGRzIGFyZSBub24tbnVsbCBhbmQgbm9uLWVtcHR5LiAKLSAgICogSVN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuRVJST1Igb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgY2hlY2tNaXNzaW5nRmllbGRTdGF0dXMoaW50IHZhbGlkYXRpb25TdGF0ZSwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHNlcnZpY2VJbXBsLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgc2VydmVySWQsCi0JCQlTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gbmVlZEVhciwgU3RyaW5nIGVhclByb2plY3ROYW1lLCBTdHJpbmcgcHJvamVjdFR5cGVJZCwKLQkJCWJvb2xlYW4gaXNDbGllbnQpCi0gIHsKLQkJLy8gT2JqZWN0IHNlbGVjdGlvbgkgIAotCSAgaWYgKHZhbGlkYXRpb25TdGF0ZT09VkFMSURBVEVfQUxMICYmICFpc0NsaWVudCkKLQkgIHsKLQkJaWYgKHNlcnZpY2VJbXBsLmxlbmd0aCgpID09IDApIHsKLQkJCWludCBzY2VuYXJpbyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNjZW5hcmlvRnJvbVR5cGVJZCh0eXBlSWQpOwotCQkJaWYgKHNjZW5hcmlvID09IFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkKLQkJCXsKLQkJCSAgcmV0dXJuIFN0YXR1c1V0aWxzCi0JCQkJCS5lcnJvclN0YXR1cyhDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX05PX09CSkVDVF9TRUxFQ1RJT04pOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICByZXR1cm4gU3RhdHVzVXRpbHMKLQkJCQkJLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfTk9fU0VSVklDRV9TRUxFQ1RJT04pOwkJCQkKLQkJCX0KLQkJfQotCSAgfQotCi0JCS8vIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLQkgICAgaWYgKHZhbGlkYXRpb25TdGF0ZSA9PSBWQUxJREFURV9BTEwgfHwgdmFsaWRhdGlvblN0YXRlID09IFZBTElEQVRFX1NFUlZFUl9SVU5USU1FX0NIQU5HRVMpIHsKLQkJCWlmIChydW50aW1lSWQgPT0gbnVsbCB8fCBydW50aW1lSWQubGVuZ3RoKCkgPT0gMCkgewotCQkJCWlmIChpc0NsaWVudCkgewotCQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19OT19SVU5USU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfQ0xJRU5UX1NVQiB9KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfTk9fUlVOVElNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10geyBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1NFUlZJQ0VfU1VCIH0pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCSAgICBpZiAodmFsaWRhdGlvblN0YXRlID09IFZBTElEQVRFX0FMTCB8fCB2YWxpZGF0aW9uU3RhdGUgPT0gVkFMSURBVEVfUFJPSkVDVF9DSEFOR0VTKSB7Ci0JCQkvLyBQcm9qZWN0Ci0JCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaWYgKGlzQ2xpZW50KSB7Ci0JCQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0NMSUVOVF9QUk9KRUNUX0VNUFRZLCBuZXcgU3RyaW5nW10geyAiIiB9KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfU0VSVklDRV9QUk9KRUNUX0VNUFRZLCBuZXcgU3RyaW5nW10geyAiIiB9KSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBQcm9qZWN0IHR5cGUgKGlmIHByb2plY3QgZG9lcyBub3QgZXhpc3QpCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCWlmIChwcm9qZWN0VHlwZUlkID09IG51bGwgfHwgcHJvamVjdFR5cGVJZC5sZW5ndGgoKSA9PSAwKSB7Ci0KLQkJCQkJaWYgKGlzQ2xpZW50KSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMKLQkJCQkJCQkJLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfQ0xJRU5UX1BST0pFQ1RfVFlQRV9FTVBUWSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMKLQkJCQkJCQkJLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfU0VSVklDRV9QUk9KRUNUX1RZUEVfRU1QVFkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBFYXIgKGlmIG5lZWQgZWFyKQotCQkJaWYgKG5lZWRFYXIpIHsKLQkJCQlpZiAoZWFyUHJvamVjdE5hbWUgPT0gbnVsbCB8fCBlYXJQcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWlmIChpc0NsaWVudCkgewotCQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0NMSUVOVF9FQVJfRU1QVFksIG5ldyBTdHJpbmdbXSB7ICIiIH0pKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19TRVJWSUNFX0VBUl9FTVBUWSwgbmV3IFN0cmluZ1tdIHsgIiIgfSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JICAgIAotCQkvLyBTZXJ2ZXIgKGlmIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgcmVxdWlyZXMgYSBzZXJ2ZXIgb3IgcHJvamVjdCBkb2VzIG5vdAotCQkvLyBleGlzdCkKLQkgICAgaWYgKHZhbGlkYXRpb25TdGF0ZSA9PSBWQUxJREFURV9BTEwgfHwgdmFsaWRhdGlvblN0YXRlID09IFZBTElEQVRFX1NFUlZFUl9SVU5USU1FX0NIQU5HRVMKLQkJCQl8fCB2YWxpZGF0aW9uU3RhdGUgPT0gVkFMSURBVEVfUFJPSkVDVF9DSEFOR0VTKSB7Ci0JCQlpZiAoc2VydmVySWQgPT0gbnVsbCB8fCBzZXJ2ZXJJZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJUnVudGltZURlc2NyaXB0b3IgZGVzYyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCk7Ci0JCQkJaWYgKGRlc2MuZ2V0U2VydmVyUmVxdWlyZWQoKSkgewotCQkJCQlpZiAoaXNDbGllbnQpIHsKLQkJCQkJCVN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfTk9fU0VSVkVSLAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0NMSUVOVF9TVUIgfSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19OT19TRVJWRVIsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfU0VSVklDRV9TVUIgfSkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1BST0pFQ1RfTVVTVF9FWElTVCwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgcHJvamVjdE5hbWUgfSkpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBJU3RhdHVzIHJlc3VsdGluZyBmcm9tIGNoZWNraW5nIGZvciBlcnJvcnMuIFVzZWQgZm9yIHZhbGlkYXRpb24gb2YgcGFnZSAxIG9mIHRoZQotICAgKiBXZWIgc2VydmljZS9jbGllbnQgd2l6YXJkcy4KLSAgICogQHBhcmFtIHZhbGlkYXRpb25TdGF0ZSBvbmUgb2YgVkFMSURBVEVfTk9ORSwgVkFMSURBVEVfQUxMLCBWQUxJREFURV9TRVJWRVJfUlVOVElNRV9DSEFOR0VTLCBWQUxJREFURV9QUk9KRUNUX0NIQU5HRVMsIFZBTElEQVRFX1NDQUxFX0NIQU5HRVMKLSAgICogQHBhcmFtIHR5cGVJZCBXZWIgc2VydmljZSB0eXBlIGlkIChpc0NsaWVudD1mYWxzZSkgb3IgV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUgaWQgKGlzQ2xpZW50PXRydWUpCi0gICAqIEBwYXJhbSBydW50aW1lSWQgV2ViIHNlcnZpY2UgcnVudGltZSBpZAotICAgKiBAcGFyYW0gc2VydmVySWQgc2VydmVyIHR5cGUgaWQKLSAgICogQHBhcmFtIHByb2plY3ROYW1lIG5hbWUgb2YgcHJvamVjdAotICAgKiBAcGFyYW0gbmVlZEVhciBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIEVBUiBpcyByZXF1aXJlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdC4KLSAgICogQHBhcmFtIGVhclByb2plY3ROYW1lIG5hbWUgb2YgRUFSIHByb2plY3QKLSAgICogQHBhcmFtIHByb2plY3RUeXBlSWQgdGVtcGxhdGUgaWQKLSAgICogQHBhcmFtIGlzQ2xpZW50IGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgZm9yIGNsaWVudCBzaWRlIHZhbGlkYXRpb24sIAotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIHNlcnZpY2Ugc2lkZSB2YWxpZGF0aW9uLgotICAgKiBAcmV0dXJuIElTdGF0dXMgd2l0aCBzZXZlcml0eSBJU3RhdHVzLk9LIGlmIG5vIGVycm9ycyBhcmUgcHJlc2VudCwKLSAgICogSVN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuRVJST1Igb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgY2hlY2tFcnJvclN0YXR1cyhpbnQgdmFsaWRhdGlvblN0YXRlLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgc2VydmVySWQsCi0JCQlTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gbmVlZEVhciwgU3RyaW5nIGVhclByb2plY3ROYW1lLCBTdHJpbmcgcHJvamVjdFR5cGVJZCwKLQkJCWJvb2xlYW4gaXNDbGllbnQpIHsKLQkKLQkgIAkvLyBFbnN1cmUgc2VydmVyLCBXZWIgc2VydmljZSBydW50aW1lLCBhbmQgV2ViIHNlcnZpY2UgdHlwZSBhcmUKLQkJLy8gY29tcGF0aWJsZQotCi0JCS8vIExhYmVscwotCSAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSAiIjsKLQkgICAgaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQubGVuZ3RoKCk+MCkKLQkgICAgewotCSAgICAJc2VydmVyTGFiZWwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2ZXJMYWJlbEJ5SWQoc2VydmVySWQpOwotCSAgICB9Ci0JCVN0cmluZyBydW50aW1lTGFiZWwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lTGFiZWxCeUlkKHJ1bnRpbWVJZCk7Ci0JCQotCSAgICBpZiAodmFsaWRhdGlvblN0YXRlID09IFZBTElEQVRFX0FMTCB8fCB2YWxpZGF0aW9uU3RhdGUgPT0gVkFMSURBVEVfU0VSVkVSX1JVTlRJTUVfQ0hBTkdFUykgewotCSAgICAJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaWYgKGlzQ2xpZW50KSB7Ci0JCQkJCWlmICghV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIKLQkJCQkJCQkuaXNTZXJ2ZXJDbGllbnRSdW50aW1lVHlwZVN1cHBvcnRlZChzZXJ2ZXJJZCwKLQkJCQkJCQkJCXJ1bnRpbWVJZCwgdHlwZUlkKSkgewotCQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzCi0JCQkJCQkJCS5lcnJvclN0YXR1cyhOTFMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUywKLQkJCQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHNlcnZlckxhYmVsLAotCQkJCQkJCQkJCQkJCQlydW50aW1lTGFiZWwgfSkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMgotCQkJCQkJCS5pc1NlcnZlclJ1bnRpbWVUeXBlU3VwcG9ydGVkKHNlcnZlcklkLCBydW50aW1lSWQsCi0JCQkJCQkJCQl0eXBlSWQpKSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMKLQkJCQkJCQkJLmVycm9yU3RhdHVzKE5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TLAotCQkJCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgc2VydmVyTGFiZWwsCi0JCQkJCQkJCQkJCQkJCXJ1bnRpbWVMYWJlbCB9KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkgICAgCi0JCS8vIElmIHRoZSBwcm9qZWN0IGV4aXN0cywgZW5zdXJlIGl0IHN1cHBvcnRzIHRoZSBXZWIgc2VydmljZSB0eXBlLCBXZWIKLQkJLy8gc2VydmljZSBydW50aW1lLCBhbmQgc2VydmVyLiBJZiB0aGUgRWFyIGFsc28gZXhpc3RzIGFuZCB0aGUgcHJvamVjdAotCQkvLyBhbmQgRWFyIGFyZSBub3QgYWxyZWFkeSBhc3NvY2lhdGVkLCBlbnN1cmUgdGhleSBjYW4gYmUuCi0JCS8vIElmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LCBlbnN1cmUgdGhlIHByb2plY3QgdHlwZSBzdXBwb3J0cyB0aGUKLQkJLy8gV2ViIHNlcnZpY2UgdHlwZSwgV2ViIHNlcnZpY2UgcnVudGltZSwgYW5kIHNlcnZlcgotCQlpZiAodmFsaWRhdGlvblN0YXRlID09IFZBTElEQVRFX0FMTCB8fCB2YWxpZGF0aW9uU3RhdGUgPT0gVkFMSURBVEVfU0VSVkVSX1JVTlRJTUVfQ0hBTkdFUwotCQkJCXx8IHZhbGlkYXRpb25TdGF0ZSA9PSBWQUxJREFURV9QUk9KRUNUX0NIQU5HRVMpIHsKLQkJCVZhbGlkYXRpb25VdGlscyB2YWxVdGlscyA9IG5ldyBWYWxpZGF0aW9uVXRpbHMoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQotCQkJCWlmIChpc0NsaWVudCkgewotCQkJCQkvLyBDaGVjayBpZiB0aGUgcnVudGltZSBzdXBwb3J0cyBpdC4KLQkJCQkJaWYgKCFXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5kb2VzQ2xpZW50VHlwZUFuZFJ1bnRpbWVTdXBwb3J0UHJvamVjdCgKLQkJCQkJCQl0eXBlSWQsIHJ1bnRpbWVJZCwgcHJvamVjdE5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfQ0xJRU5UX1JVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9QUk9KRUNULAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBydW50aW1lTGFiZWwsIHByb2plY3ROYW1lIH0pKTsKLQkJCQkJfQotCi0JCQkJCS8vIENoZWNrIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQuCi0JCQkJCWlmIChzZXJ2ZXJJZCAhPSBudWxsICYmIHNlcnZlcklkLmxlbmd0aCgpID4gMCkgewotCQkJCQkJaWYgKCF2YWxVdGlscy5kb2VzU2VydmVyU3VwcG9ydFByb2plY3Qoc2VydmVySWQsIHByb2plY3ROYW1lKSkgewotCQkJCQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0NMSUVOVF9TRVJWRVJfRE9FU19OT1RfU1VQUE9SVF9QUk9KRUNULAotCQkJCQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHNlcnZlckxhYmVsLCBwcm9qZWN0TmFtZSB9KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDaGVjayBpZiB0aGUgcnVudGltZSBzdXBwb3J0cyBpdC4KLQkJCQkJaWYgKCFXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5kb2VzU2VydmljZVR5cGVBbmRSdW50aW1lU3VwcG9ydFByb2plY3QoCi0JCQkJCQkJdHlwZUlkLCBydW50aW1lSWQsIHByb2plY3ROYW1lKSkgewotCQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1NFUlZJQ0VfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX1BST0pFQ1QsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHJ1bnRpbWVMYWJlbCwgcHJvamVjdE5hbWUgfSkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gQ2hlY2sgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBpdC4KLQkJCQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQubGVuZ3RoKCkgPiAwKQotCQkJCQl7Ci0JCQkJCSAgaWYgKCF2YWxVdGlscy5kb2VzU2VydmVyU3VwcG9ydFByb2plY3Qoc2VydmVySWQsIHByb2plY3ROYW1lKSkgewotCQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1NFUlZJQ0VfU0VSVkVSX0RPRVNfTk9UX1NVUFBPUlRfUFJPSkVDVCwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgc2VydmVyTGFiZWwsIHByb2plY3ROYW1lIH0pKTsKLQkJCQkJICB9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIExvb2sgYXQgdGhlIHByb2plY3QgdHlwZSB0byBlbnN1cmUgdGhhdCBpdCBpcyBzdWl0YWJsZSBmb3IKLQkJCQkvLyB0aGUKLQkJCQkvLyBzZWxlY3RlZCBydW50aW1lIGFuZCBzZXJ2ZXIuCi0JCQkJU3RyaW5nIHRlbXBsYXRlSWQgPSBwcm9qZWN0VHlwZUlkOwotCQkJCVN0cmluZyB0ZW1wbGF0ZUxhYmVsID0gRmFjZXRVdGlscy5nZXRUZW1wbGF0ZUxhYmVsQnlJZCh0ZW1wbGF0ZUlkKTsKLQotCQkJCWlmIChpc0NsaWVudCkgewotCQkJCQkvLyBDaGVjayBpZiB0aGUgcnVudGltZSBzdXBwb3J0cyBpdC4KLQkJCQkJaWYgKCFXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5kb2VzQ2xpZW50VHlwZUFuZFJ1bnRpbWVTdXBwb3J0VGVtcGxhdGUoCi0JCQkJCQkJdHlwZUlkLCBydW50aW1lSWQsIHRlbXBsYXRlSWQpKSB7Ci0KLQkJCQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19DTElFTlRfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX1RFTVBMQVRFLAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBydW50aW1lTGFiZWwsIHRlbXBsYXRlTGFiZWwgfSkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gQ2hlY2sgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBpdC4KLQkJCQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQubGVuZ3RoKCk+MCkKLQkJCQkJewotCQkJCQkgIGlmICghdmFsVXRpbHMuZG9lc1NlcnZlclN1cHBvcnRUZW1wbGF0ZShzZXJ2ZXJJZCwgdGVtcGxhdGVJZCkpIHsKLQkJCQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19DTElFTlRfU0VSVkVSX0RPRVNfTk9UX1NVUFBPUlRfVEVNUExBVEUsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHNlcnZlckxhYmVsLCB0ZW1wbGF0ZUxhYmVsIH0pKTsKLQkJCQkJICB9Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRoZSBydW50aW1lIHN1cHBvcnRzIGl0LgotCQkJCQlpZiAoIVdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmRvZXNTZXJ2aWNlVHlwZUFuZFJ1bnRpbWVTdXBwb3J0VGVtcGxhdGUoCi0JCQkJCQkJdHlwZUlkLCBydW50aW1lSWQsIHRlbXBsYXRlSWQpKSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMKLQkJCQkJCQkJLmVycm9yU3RhdHVzKE5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19TRVJWSUNFX1JVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9URU1QTEFURSwKLQkJCQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHJ1bnRpbWVMYWJlbCwgdGVtcGxhdGVMYWJlbCB9KSk7Ci0JCQkJCX0KLQotCQkJCQkvLyBDaGVjayBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0LgotCQkJCQlpZiAoc2VydmVySWQgIT0gbnVsbCAmJiBzZXJ2ZXJJZC5sZW5ndGgoKT4wKQotCQkJCQl7Ci0JCQkJCSAgaWYgKCF2YWxVdGlscy5kb2VzU2VydmVyU3VwcG9ydFRlbXBsYXRlKHNlcnZlcklkLCB0ZW1wbGF0ZUlkKSkgewotCQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1NFUlZJQ0VfU0VSVkVSX0RPRVNfTk9UX1NVUFBPUlRfVEVNUExBVEUsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHNlcnZlckxhYmVsLCB0ZW1wbGF0ZUxhYmVsIH0pKTsKLQkJCQkJICB9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0JCQkJCQkKLQkJCQotCQl9Ci0JCQotCSAgICBpZiAodmFsaWRhdGlvblN0YXRlID09IFZBTElEQVRFX0FMTCB8fCB2YWxpZGF0aW9uU3RhdGUgPT0gVkFMSURBVEVfUFJPSkVDVF9DSEFOR0VTKSB7Ci0JCQkvLyBDaGVjayBpZiBwcm9qZWN0L0VBUiBhc3NvY2lhdGlvbiBpcyBnb29kLgotCQkJaWYgKG5lZWRFYXIpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCQlJUHJvamVjdCBlcCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0JCQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgZXAuZXhpc3RzKCkpIHsKLQkJCQkJaWYgKCFKMkVFVXRpbHMuaXNDb21wb25lbnRBc3NvY2lhdGVkKGVwLCBwcm9qZWN0KSkgewotCQkJCQkJSVN0YXR1cyBhc3NvY2lhdGVTdGF0dXMgPSBKMkVFVXRpbHMuY2FuQXNzb2NpYXRlUHJvamVjdFRvRUFSKHByb2plY3QsIGVwKTsKLQkJCQkJCWlmIChhc3NvY2lhdGVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCQkJaWYgKGlzQ2xpZW50KSB7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0NMSUVOVF9DQU5OT1RfQVNTT0NJQVRFLAotCQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHByb2plY3ROYW1lLCBlcC5nZXROYW1lKCksCi0JCQkJCQkJCQkJCQlhc3NvY2lhdGVTdGF0dXMuZ2V0TWVzc2FnZSgpIH0pKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19TRVJWSUNFX0NBTk5PVF9BU1NPQ0lBVEUsCi0JCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgcHJvamVjdE5hbWUsIGVwLmdldE5hbWUoKSwKLQkJCQkJCQkJCQkJCWFzc29jaWF0ZVN0YXR1cy5nZXRNZXNzYWdlKCkgfSkpOwotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCX0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIElTdGF0dXMgcmVzdWx0aW5nIGZyb20gY2hlY2tpbmcgZm9yIHdhcm5pbmdzLiBVc2VkIGZvciB2YWxpZGF0aW9uIG9mIHBhZ2UgMSBvZiB0aGUKLSAgICogV2ViIHNlcnZpY2UvY2xpZW50IHdpemFyZHMuIAotICAgKiBAcGFyYW0gdmFsaWRhdGlvblN0YXRlIG9uZSBvZiBWQUxJREFURV9OT05FLCBWQUxJREFURV9BTEwsIFZBTElEQVRFX1NFUlZFUl9SVU5USU1FX0NIQU5HRVMsIFZBTElEQVRFX1BST0pFQ1RfQ0hBTkdFUywgVkFMSURBVEVfU0NBTEVfQ0hBTkdFUwotICAgKiBAcGFyYW0gc2NhbGVTZXR0aW5nIG9uZSBvZiA8QlIvPgotICAgKiBTY2VuYXJpb0NvbnRleHQuV1NfVEVTVDxCUi8+Ci0gICAqIFNjZW5hcmlvQ29udGV4dC5XU19TVEFSVDxCUi8+Ci0gICAqIFNjZW5hcmlvQ29udGV4dC5XU19JTlNUQUxMPEJSLz4KLSAgICogU2NlbmFyaW9Db250ZXh0LldTX0RFUExPWTxCUi8+Ci0gICAqIFNjZW5hcmlvQ29udGV4dC5XU19BU1NFTUJMRTxCUi8+Ci0gICAqIFNjZW5hcmlvQ29udGV4dC5XU19ERVZFTE9QPEJSLz4KLSAgICogU2NlbmFyaW9Db250ZXh0LldTX05PTkUKLSAgICogQHBhcmFtIHNlcnZlcklkIHNlcnZlciB0eXBlIGlkCi0gICAqIEBwYXJhbSBpc0NsaWVudCBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGZvciBjbGllbnQgc2lkZSB2YWxpZGF0aW9uLCAKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBzZXJ2aWNlIHNpZGUgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybiBJU3RhdHVzIHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5PSyBpZiBubyBlcnJvcnMgYXJlIHByZXNlbnQsCi0gICAqIElTdGF0dXMgd2l0aCBzZXZlcml0eSBJU3RhdHVzLldBUk5JTkcgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgY2hlY2tXYXJuaW5nU3RhdHVzKGludCB2YWxpZGF0aW9uU3RhdGUsIGludCBzY2FsZVNldHRpbmcsIFN0cmluZyBzZXJ2ZXJJZCwKLQkJCWJvb2xlYW4gaXNDbGllbnQpIHsKLQkJLy8gUmV0dXJuIGEgd2FybmluZyBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIgc2VsZWN0aW9uIGFuZCBzY2FsZSBzZXR0aW5nIGlzCi0JCS8vIGFueXRoaW5nIGJleW9uZCBhc3NlbWJsZS4KLQkJaWYgKHZhbGlkYXRpb25TdGF0ZSA9PSBWQUxJREFURV9BTEwgfHwgdmFsaWRhdGlvblN0YXRlID09IFZBTElEQVRFX1NDQUxFX0NIQU5HRVMKLQkJCQl8fCB2YWxpZGF0aW9uU3RhdGUgPT0gVkFMSURBVEVfU0VSVkVSX1JVTlRJTUVfQ0hBTkdFUykgewotCQkJaWYgKHNlcnZlcklkID09IG51bGwgfHwgc2VydmVySWQubGVuZ3RoKCkgPT0gMCkgewotCQkJCWlmIChzY2FsZVNldHRpbmcgPCBTY2VuYXJpb0NvbnRleHQuV1NfQVNTRU1CTEUpIHsKLQkJCQkJaWYgKGlzQ2xpZW50KSB7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyhOTFMuYmluZCgKLQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19XQVJOX05PX0NMSUVOVF9TRVJWRVIsIG5ldyBTdHJpbmdbMF0pKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBTdGF0dXNVdGlscy53YXJuaW5nU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1dBUk5fTk9fU0VSVklDRV9TRVJWRVIsIG5ldyBTdHJpbmdbMF0pKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gUmV0dXJuIGEgd2FybmluZyBpZiB0aGUgc2VsZWN0ZWQgc2VydmVyIGhhcyBvbmx5IHN0dWIKLQkJCQkvLyBydW50aW1lcwotCQkJCS8vIGFuZCB0aGUgc2NhbGUgc2V0dGluZyBpcyBhbnl0aGluZyBiZXlvbmQgZGVwbG95LgotCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlcklkKTsKLQkJCQlpZiAoc2VydmVyVHlwZSAhPSBudWxsKSB7Ci0JCQkJCS8vIEZpbmQgYSBSdW50aW1lIHdoaWNoIGlzIG5vdCBhIHN0dWIKLQkJCQkJSVJ1bnRpbWUgbm9uU3R1YlJ1bnRpbWUgPSBTZXJ2ZXJVdGlscy5nZXROb25TdHViUnVudGltZShzZXJ2ZXJJZCk7Ci0JCQkJCWlmICgoc2NhbGVTZXR0aW5nIDwgU2NlbmFyaW9Db250ZXh0LldTX0RFUExPWSkgJiYgbm9uU3R1YlJ1bnRpbWUgPT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHNlcnZlcnR5cGVMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyCi0JCQkJCQkJCS5nZXRTZXJ2ZXJMYWJlbEJ5SWQoc2VydmVySWQpOwotCQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLndhcm5pbmdTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfV0FSTl9TVFVCX09OTFksCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHNlcnZlcnR5cGVMYWJlbCB9KSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIHNlcnZlciB0eXBlIHN1cHBvcnRzIHRoZSBmYWNldCB2ZXJzaW9ucyBvbiB0aGUgcHJvdmlkZWQgcHJvamVjdAotICAgKiBAcGFyYW0gc2VydmVyRmFjdG9yeUlkIHNlcnZlciB0eXBlIGlkCi0gICAqIEBwYXJhbSBwcm9qZWN0TmFtZSBuYW1lIG9mIGEgcHJvamVjdCB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0LgotICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICogPHVsPiAKLSAgICogPGxpPmlmIHRoZSBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZmFjZXQgdmVyc2lvbnMgb24gdGhlIHByb2plY3Qgb3I8L2xpPgotICAgKiA8bGk+aWYgdGhlIHByb2plY3QgaXMgbm90IGEgZmFjZXRlZCBwcm9qZWN0IG9yPC9saT4KLSAgICogPGxpPmlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LjwvbGk+Ci0gICAqIDwvdWw+Ci0gICAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGRvZXNTZXJ2ZXJTdXBwb3J0UHJvamVjdChTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICBJRmFjZXRlZFByb2plY3QgZlByb2plY3QgPSBudWxsOwotICAgIGlmIChwcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGZQcm9qZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFNldCBmYWNldHMgPSBmUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIHJldHVybiBkb2VzU2VydmVyU3VwcG9ydEZhY2V0cyhzZXJ2ZXJGYWN0b3J5SWQsIGZhY2V0cyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vSWYgaXQncyBub3QgYSBmYWNldGVkIHByb2plY3QsIHdlIGhhdmUgbm90aGluZyB0byBjb21wYXJlIHRvIC0gYXNzdW1lIGl0J3MgZ29vZC4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL0lmIHRoZSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QsIHdlIGhhdmUgbm90aGluZyB0byBjb21wYXJlIHRvIC0gYXNzdW1lIGl0J3MgZ29vZC4KLSAgICAgIHJldHVybiB0cnVlOyAgICAgIAotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZmFjZXQgdmVyc2lvbnMgaW4gdGhlIHByb3ZpZGVkIHNldC4KLSAgICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZCBzZXJ2ZXIgdHlwZSBpZAotICAgKiBAcGFyYW0gZmFjZXRzIHNldCBjb250YWluaW5nIGVsZW1lbnRzIG9mIHR5cGUge0BsaW5rIElQcm9qZWN0RmFjZXRWZXJzaW9ufQotICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcnZlciB0eXBlIHN1cHBvcnRzIHRoZSBmYWNldCB2ZXJzaW9ucyBpbiB0aGUgcHJvdmlkZWQgc2V0LAotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZG9lc1NlcnZlclN1cHBvcnRGYWNldHMoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU2V0IGZhY2V0cykKLSAgewotICAgIFNldCBydW50aW1lcyA9IEZhY2V0VXRpbHMuZ2V0UnVudGltZXMobmV3IFNldFtde2ZhY2V0c30pOwotICAgIEl0ZXJhdG9yIGl0ciA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0gICAgSVNlcnZlclR5cGUgc3QgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZCk7ICAgICAgICAKLSAgICBTdHJpbmcgcnVudGltZVR5cGVJZCA9IHN0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIGZSdW50aW1lID0gKG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUpaXRyLm5leHQoKTsKLSAgICAgIElSdW50aW1lIHNSdW50aW1lID0gRmFjZXRVdGlsLmdldFJ1bnRpbWUoZlJ1bnRpbWUpOwotICAgICAgaWYgKHNSdW50aW1lICE9IG51bGwpCi0gICAgICB7Ci0JICAgICAgSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc1J1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkgICAgICBpZiAocnVudGltZVR5cGUgIT0gbnVsbCAmJiBydW50aW1lVHlwZUlkLmVxdWFscyhydW50aW1lVHlwZS5nZXRJZCgpKSkKLQkgICAgICB7Ci0JICAgICAgICAvL2ZvdW5kIGEgbWF0Y2gKLQkgICAgICAgIHJldHVybiB0cnVlOwotCSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOyAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIHNlcnZlciB0eXBlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSB2ZXJzaW9uIG9mCi0gICAqIGVhY2ggb2YgdGhlIGZpeGVkIGZhY2V0cyBvbiB0aGUgcHJvdmlkZWQgdGVtcGxhdGUKLSAgICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZCBzZXJ2ZXIgdHlwZSBpZAotICAgKiBAcGFyYW0gdGVtcGxhdGVJZCBpZCBvZiBhIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0KLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyBhdCBsZWFzdCBvbmUgdmVyc2lvbiBvZgotICAgKiBlYWNoIG9mIHRoZSBmaXhlZCBmYWNldHMgb24gdGhlIHByb3ZpZGVkIHRlbXBsYXRlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZG9lc1NlcnZlclN1cHBvcnRUZW1wbGF0ZShTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgdGVtcGxhdGVJZCkKLSAgewotICAgIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIHRlbXBsYXRlID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUodGVtcGxhdGVJZCk7Ci0gICAgU2V0IHRlbXBsYXRlRmFjZXRzID0gdGVtcGxhdGUuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgSXRlcmF0b3IgdGVtcGxhdGVGYWNldHNJdHIgPSB0ZW1wbGF0ZUZhY2V0cy5pdGVyYXRvcigpOwotICAgIHdoaWxlICh0ZW1wbGF0ZUZhY2V0c0l0ci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgYm9vbGVhbiBzZXJ2ZXJTdXBwb3J0c1RoaXNPbmUgPSBmYWxzZTsKLSAgICAgIElQcm9qZWN0RmFjZXQgZml4ZWRGYWNldCA9IChJUHJvamVjdEZhY2V0KXRlbXBsYXRlRmFjZXRzSXRyLm5leHQoKTsgICAgICAKLSAgICAgIExpc3QgdmVyc2lvbnMgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHZlcnNpb25zID0gZml4ZWRGYWNldC5nZXRTb3J0ZWRWZXJzaW9ucyh0cnVlKTsKLSAgICAgIH0gY2F0Y2ggKFZlcnNpb25Gb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgU2V0IHZlcnNpb25TZXQgPSBmaXhlZEZhY2V0LmdldFZlcnNpb25zKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IHZlcnNpb25TZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJzaW9ucy5hZGQoaXRyLm5leHQoKSk7Ci0gICAgICAgIH0gICAgICAgICAgICAKLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgU2V0IHZlcnNpb25TZXQgPSBmaXhlZEZhY2V0LmdldFZlcnNpb25zKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IHZlcnNpb25TZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJzaW9ucy5hZGQoaXRyLm5leHQoKSk7Ci0gICAgICAgIH0gICAgICAgICAgICAKLSAgICAgIH0gCi0gICAgICBJdGVyYXRvciB2ZXJzaW9uc0l0ciA9IHZlcnNpb25zLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSh2ZXJzaW9uc0l0ci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbil2ZXJzaW9uc0l0ci5uZXh0KCk7Ci0gICAgICAgIFNldCBwZnZzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgcGZ2cy5hZGQocGZ2KTsKLSAgICAgICAgaWYgKGRvZXNTZXJ2ZXJTdXBwb3J0RmFjZXRzKHNlcnZlckZhY3RvcnlJZCwgcGZ2cykpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJTdXBwb3J0c1RoaXNPbmUgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKCFzZXJ2ZXJTdXBwb3J0c1RoaXNPbmUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBwcm9qZWN0IG9yIHByb2plY3QgdHlwZSAoaWYgdGhlIHByb2plY3QgaXMgbnVsbCBvciBkb2VzIG5vdCBleGlzdCkKLSAgICogcnVsZXMgb3V0IHRoZSBuZWVkIGZvciBhbiBFQVIuCi0gICAqIEBwYXJhbSBwcm9qZWN0TmFtZSBuYW1lIG9mIGEgcHJvamVjdAotICAgKiBAcGFyYW0gcHJvamVjdFR5cGVJZCBpZCBvZiBhIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0uIE11c3QgYmUgbm9uLWVtcHR5IGlmIHRoZSBwcm9qZWN0IGlzIG51bGwgb3IKLSAgICogZG9lcyBub3QgZXhpc3QuIAotICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5lZWQgZm9yIGFuIEVBUiBpcyBub3QgcnVsZWQgb3V0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9qZWN0T3JQcm9qZWN0VHlwZU5lZWRzRWFyKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHByb2plY3RUeXBlSWQpCi0JewotCQkvLyBJZiB0aGUgcHJvamVjdCBpcyBhIHNpbXBsZSBKYXZhIHByb2plY3Qgb3IgdGhlIHByb2plY3QgdHlwZSBpcwotCQkvLyBKYXZhIHV0aWxpdHkgcmV0dXJuIGZhbHNlLgotCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJaWYgKEZhY2V0VXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gUHJvamVjdCBkaWRuJ3QgcnVsZSBvdXQgdGhlIG5lZWQgZm9yIGFuIEVBUgotCQkvLyBzbyBjaGVjayB0aGUgcHJvZWN0IHR5cGUKLQkJU3RyaW5nIHRlbXBsYXRlSWQgPSBwcm9qZWN0VHlwZUlkOwotCQlpZiAodGVtcGxhdGVJZCAhPSBudWxsICYmIHRlbXBsYXRlSWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAoRmFjZXRVdGlscy5pc1V0aWxpdHlUZW1wbGF0ZSh0ZW1wbGF0ZUlkKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIEoyRUUgMS4zIEVBUiBwcm9qZWN0IGNhbiBiZSBpbnN0YWxsZWQgb24gYSBzZXJ2ZXIgb2YKLQkgKiB0aGUgcHJvdmlkZWQgc2VydmVyIHR5cGUuCi0JICogQHBhcmFtIHNlcnZlclR5cGVJZCBzZXJ2ZXIgdHlwZSBpZAotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIEoyRUUgMS4zIEVBUiBwcm9qZWN0IGNhbiBiZSBpbnN0YWxsZWQgb24gYSBzZXJ2ZXIgb2YKLQkgKiB0aGUgcHJvdmlkZWQgc2VydmVyIHR5cGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlcnZlck5lZWRzRUFSKFN0cmluZyBzZXJ2ZXJUeXBlSWQpCi0JewotCQlpZiAoc2VydmVyVHlwZUlkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCSAgICBpZiAoc2VydmVyVHlwZUlkLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIHRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJUeXBlSWQpOwotCQkJaWYgKHRhcmdldElkICE9IG51bGwgJiYgdGFyZ2V0SWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHRhcmdldElkLCAiMTMiKSkgLy8gcm0gajJlZQotCQkJCXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0VGFyZ2V0QW5kSjJFRShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBjb21wTmFtZSwgU3RyaW5nIGVhck5hbWUsIFN0cmluZyBlYXJDb21wTmFtZSwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIGoyZWVMZXZlbCkKLSAgewotICAgIElQcm9qZWN0IHAgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIElQcm9qZWN0IGVhclAgPSBudWxsOwotICAgIGlmIChlYXJOYW1lIT1udWxsICYmICFlYXJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIiIpKSB7Ci0gICAgCWVhclAgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZWFyTmFtZSk7Ci0gICAgfQotICAgIElTdGF0dXMgdGFyZ2V0U3RhdHVzID0gZG9lc1Byb2plY3RUYXJnZXRNYXRjaFNlcnZlclR5cGUocCwgc2VydmVyRmFjdG9yeUlkKTsKLSAgICBpZiAoZWFyUCE9bnVsbCAmJiB0YXJnZXRTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIC8vY2hlY2sgdGhlIEVBUiAgICAgIAotICAgICAgSVN0YXR1cyBlYXJUYXJnZXRTdGF0dXMgPSBkb2VzUHJvamVjdFRhcmdldE1hdGNoU2VydmVyVHlwZShlYXJQLCBzZXJ2ZXJGYWN0b3J5SWQpOwotICAgICAgaWYoZWFyVGFyZ2V0U3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVhclRhcmdldFN0YXR1czsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiB0YXJnZXRTdGF0dXM7Ci0gICAgfQotICAgIAotCi0gICAgLy9WYWxpZGF0ZSBzZXJ2aWNlIHNpZGUgSjJFRSBsZXZlbCAgICAKLSAgICBJU3RhdHVzIGoyZWVTdGF0dXMgPSBkb2VzUHJvamVjdE1hdGNoSjJFRUxldmVsKHAsIGNvbXBOYW1lLCBqMmVlTGV2ZWwpOwotICAgIGlmKGVhclAhPW51bGwgJiYgajJlZVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuT0spCi0gICAgewotICAgICAgSVN0YXR1cyBlYXJKMkVFU3RhdHVzID0gZG9lc1Byb2plY3RNYXRjaEoyRUVMZXZlbChlYXJQLCBlYXJDb21wTmFtZSwgajJlZUxldmVsKTsKLSAgICAgIGlmKGVhckoyRUVTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgewotICAgICAgICByZXR1cm4gZWFySjJFRVN0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBqMmVlU3RhdHVzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgLy9UT0RPOiBUaGlzIG1ldGhvZCBpcyBvYnNlbGV0ZSAtIHNob3VsZCBiZSByZW1vdmVkLgotICBwcml2YXRlIElTdGF0dXMgZG9lc1Byb2plY3RUYXJnZXRNYXRjaFNlcnZlclR5cGUoSVByb2plY3QgcCwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIGlmIChwIT1udWxsICYmIHAuZXhpc3RzKCkpCi0gICAgewotICAgICAgSVJ1bnRpbWUgcHJvamVjdFRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQocC5nZXROYW1lKCkpOwotICAgICAgaWYgKHByb2plY3RUYXJnZXQhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0VGFyZ2V0SWQgPSBwcm9qZWN0VGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgU3RyaW5nIHNlcnZlclRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQpOwotICAgICAgICBpZiAoc2VydmVyVGFyZ2V0SWQhPW51bGwgJiYgc2VydmVyVGFyZ2V0SWQubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGlmKCFwcm9qZWN0VGFyZ2V0SWQuZXF1YWxzKHNlcnZlclRhcmdldElkKSkKLSAgICAgICAgICB7IAotICAgICAgICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1NFUlZFUl9UQVJHRVRfTUlTTUFUQ0gsbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpfSkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7ICAgICAgICAKLSAgfQotCi0gIC8vVE9ETzogVGhpcyBtZXRob2QgaXMgb2JzZWxldGUgLSBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgcHJpdmF0ZSBJU3RhdHVzIGRvZXNQcm9qZWN0TWF0Y2hKMkVFTGV2ZWwoSVByb2plY3QgcCwgU3RyaW5nIGNvbXBOYW1lLCBTdHJpbmcgajJlZUxldmVsKQotICB7Ci0KLSAgICB0cnkgewotCQlpZiAocCE9bnVsbCAmJiBwLmV4aXN0cygpKQotCQl7Ci0gIAkgIGludCBwcm9qZWN0SjJFRUxldmVsID0gSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHApOwotCQkgIGlmIChwcm9qZWN0SjJFRUxldmVsIT0tMSkKLQkJICB7Ci0JCSAgICBTdHJpbmcgcHJvamVjdEoyRUVMZXZlbFN0cmluZyA9IFN0cmluZy52YWx1ZU9mKHByb2plY3RKMkVFTGV2ZWwpOwotCQkgICAgaWYgKGoyZWVMZXZlbCE9bnVsbCAmJiBqMmVlTGV2ZWwubGVuZ3RoKCk+MCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCFwcm9qZWN0SjJFRUxldmVsU3RyaW5nLmVxdWFscyhqMmVlTGV2ZWwpKQotCQkgICAgICB7Ci0JCSAgICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0oyRUVfTUlTTUFUQ0gsbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpfSkgKTsKLQkJICAgICAgfQotCQkgICAgfQotCQkgIH0KLQkJfQotCX0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgIAotICB9Ci0gICAgCi0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7ICAgICAgICAKLSAgfQotICAKLSAgLy9UT0RPOiBUaGlzIG1ldGhvZCBpcyBvYnNlbGV0ZSAtIHNob3VsZCBiZSByZW1vdmVkLgotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3RUeXBlKFN0cmluZyBwcm9qZWN0TmFtZSwgU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlcykKLSAgewotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBJUHJvamVjdCBwID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICBpZiAocD09bnVsbCB8fCAhcC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICAvL1Byb2plY3QgZG9lcyBub3QgZXhpc3Qgd2hpY2ggbWVhbnMgYSBuZXcgcHJvamVjdCBvZiB0aGUgY29ycmVjdCB0eXBlIHdpbGwgYmUgY3JlYXRlZAotICAgICAgLy9XZSdyZSBkb25lLiBBbGwgaXMgZ29vZC4KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgICAgCi0gICAgLy9JZiB0aGUgcHJvamVjdCBleGlzdHMsIHdlIHNob3VsZCBzZWUgaXQgaW4gdGhlIHByb2plY3QgbGlzdCBmb3IgdGhlIHNlbGVjdGVkIGNsaWVudAotICAgIC8vcHJvamVjdCB0eXBlLgotICAgIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXMuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChwcm9qZWN0TmFtZS5lcXVhbHMocHJvamVjdE5hbWVzW2ldKSkKLSAgICAgIHsKLSAgICAgICAgLy9Gb3VuZCB0aGUgcHJvamVjdC4gQWxsIGlzIGdvb2QuCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vRGlkbid0IGZpbmQgdGhlIHByb2plY3QuIFJldHVybiBhbiBlcnJvci4KLSAgICAvL0dldCB0aGUgbGFiZWwgZm9yIHRoZSBjbGllbnQgdHlwZSBpZAotICAgIFN0cmluZyBjbGllbnRUeXBlTGFiZWwgPSBnZXRDbGllbnRUeXBlTGFiZWwocnVudGltZTJDbGllbnRUeXBlcy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCkpOwotICAgIFN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19XUk9OR19DTElFTlRfUFJPSkVDVF9UWVBFLG5ldyBTdHJpbmdbXXtwcm9qZWN0TmFtZSwgY2xpZW50VHlwZUxhYmVsfSk7Ci0gICAgSVN0YXR1cyBlU3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIG1lc3NhZ2UgKTsKLSAgICByZXR1cm4gZVN0YXR1czsKLSAgICAKLSAgfQotICAKLSAgLy9UT0RPOiBUaGlzIG1ldGhvZCBpcyBvYnNlbGV0ZSAtIHNob3VsZCBiZSByZW1vdmVkLgotICBwcml2YXRlIFN0cmluZyBnZXRDbGllbnRUeXBlTGFiZWwoIFN0cmluZyB0eXBlICkKLSAgewkgIAotCSAgaWYgKHR5cGUuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpKQotCSAgewotCQkgIHJldHVybiBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQ0xJRU5UX0NPTVBfVFlQRV9XRUI7Ci0JICB9Ci0JICBlbHNlIGlmICh0eXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFKSkKLQkgIHsKLQkJICByZXR1cm4gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0NMSUVOVF9DT01QX1RZUEVfRUpCOwotCSAgfQotCSAgZWxzZSBpZiAodHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSkpCi0JICB7Ci0JCSAgcmV0dXJuIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9DTElFTlRfQ09NUF9UWVBFX0FQUF9DTElFTlQ7Ci0JICB9Ci0JICBlbHNlIGlmICh0eXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRSkpCi0JICB7Ci0JCSAgcmV0dXJuIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9DTElFTlRfQ09NUF9UWVBFX0NPTlRBSU5FUkxFU1M7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCSAgLy9ObyBrbm93biBsYWJlbCwgcmV0dXJuIHRoZSB0eXBlSWQgaXRzZWxmLiAKLQkJICByZXR1cm4gdHlwZTsKLQkgIH0JICAJICAKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIHByb2plY3QgaXMgbGlrZWx5IGhvc3RpbmcgYW55IG9mIHRoZSBzZXJ2aWNlcwotICAgKiBpbiB0aGUgcHJvdmlkZWQgV1NETCBhcyBhIEoyRUUgV2ViIHNlcnZpY2UuCi0gICAqIEBwYXJhbSBwIElQcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLSAgICogQHBhcmFtIHdzZGxVUkwgVVJMIG9mIGEgV1NETCBkb2N1bWVudAotICAgKiBAcGFyYW0gcGFyc2VyCi0gICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIHdlYnNlcnZpY2VzLnhtbCAKLSAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yIHRoYXQgcG9pbnRzIHRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgcG9ydHMgaW4gdGhlIHByb3ZpZGVkIFdTREwuIAotICAgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBwLCBTdHJpbmcgd3NkbFVSTCwgV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyKQotICB7Ci0gICAgaWYgKHA9PW51bGwgfHwgd3NkbFVSTD09bnVsbCB8fCB3c2RsVVJMLmxlbmd0aCgpPT0wIHx8IHBhcnNlcj09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBJUmVzb3VyY2Ugd3NYTUwgPSBnZXRXZWJTZXJ2Y2VzWE1MKHApOwotICAgIGlmICh3c1hNTD09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAKLSAgICAvL01ha2UgYSBsaXN0IG9mIGFsbCB0aGUgd3NkbC1wb3J0J3MgaW4gd2Vic2VydmljZXMueG1sCi0gICAgaWYgKCEod3NYTUwgaW5zdGFuY2VvZiBJRmlsZSkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAgCi0gICAgUmVzb3VyY2UgcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKChJRmlsZSl3c1hNTCwgdHJ1ZSk7Ci0gICAgV3NkZFJlc291cmNlIHdzZGRSZXMgPSAoV3NkZFJlc291cmNlKXJlczsgICAgCi0gICAgV2ViU2VydmljZXMgd2ViU2VydmljZXMgPSB3c2RkUmVzLmdldFdlYlNlcnZpY2VzKCk7Ci0gICAgSXRlcmF0b3Igd3NEZXNjcyA9IHdlYlNlcnZpY2VzLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIEFycmF5TGlzdCB3c2RsUG9ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgd2hpbGUod3NEZXNjcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzYyA9IChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pd3NEZXNjcy5uZXh0KCk7Ci0gICAgICBJdGVyYXRvciBwY3MgPSB3c0Rlc2MuZ2V0UG9ydENvbXBvbmVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUocGNzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUG9ydENvbXBvbmVudCBwYyA9IChQb3J0Q29tcG9uZW50KXBjcy5uZXh0KCk7Ci0gICAgICAgIFdTRExQb3J0IHdzZGxQb3J0ID0gcGMuZ2V0V3NkbFBvcnQoKTsKLSAgICAgICAgd3NkbFBvcnRMaXN0LmFkZChuZXcgUXVhbGlmaWVkTmFtZSh3c2RsUG9ydC5nZXROYW1lc3BhY2VVUkkoKSwgd3NkbFBvcnQuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQXJyYXlMaXN0IHBvcnRMaXN0ID0gZ2V0UG9ydE5hbWVzRnJvbVdzZGwod3NkbFVSTCwgcGFyc2VyKTsKLQotICAgIC8vSWYgYW55IG9mIHRoZSBRdWFsaWZpZWROYW1lcyBpbiBwb3J0TGlzdCBlcXVhbHMgYW55IG9mIHRoZSBRdWFsaWZpZWROYW1lcwotICAgIC8vaW4gd3NkbFBvcnRMaXN0LCB0aGlzIGlzIHRoZSBzZXJ2aWNlIHByb2plY3QuIFJldHVybiB0cnVlLgotICAgIE9iamVjdFtdIHBvcnRzID0gcG9ydExpc3QudG9BcnJheSgpOwotICAgIE9iamVjdFtdIHdzZGxQb3J0cyA9IHdzZGxQb3J0TGlzdC50b0FycmF5KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBRdWFsaWZpZWROYW1lIHBvcnROYW1lID0gKFF1YWxpZmllZE5hbWUpIHBvcnRzW2ldOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3c2RsUG9ydHMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFF1YWxpZmllZE5hbWUgd3NkbFBvcnROYW1lID0gKFF1YWxpZmllZE5hbWUpIHdzZGxQb3J0c1tqXTsKLSAgICAgICAgaWYgKHBvcnROYW1lLmVxdWFscyh3c2RsUG9ydE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBJUmVzb3VyY2UgY29ycmVzcG9uZGluZyB0byB0aGUgd2Vic2VydmljZXMueG1sIGluIHRoZSBwcm92aWRlZCBwcm9qZWN0LgotICAgKiBAcGFyYW0gcCBhbiBJUHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLgotICAgKiBAcmV0dXJuIElSZXNvdXJjZSBjb3JyZXNwb25kaW5nIHRvIHRoZSB3ZWJzZXJ2aWNlcy54bWwgaW4gdGhlIHByb3ZpZGVkIHByb2plY3QsCi0gICAqIG51bGwgaWYgdGhlcmUgaXMgbm8gd2Vic2VydmljZXMueG1sIGluIHRoZSBwcm9qZWN0LgotICAgKi8KLSAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0V2ViU2VydmNlc1hNTChJUHJvamVjdCBwKQotICB7Ci0gICAgLy9HZXQgdGhlIG1vZHVsZSByb290LiAgICAKLSAgICBJUmVzb3VyY2UgbW9kdWxlUm9vdCA9IGdldE1vZHVsZVJvb3QocCk7Ci0gICAgaWYgKCEobW9kdWxlUm9vdCBpbnN0YW5jZW9mIElDb250YWluZXIpKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBJUmVzb3VyY2Ugd2ViU2VydmljZXNYTUwgPSBudWxsOwotICAgIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHApKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciB3c1BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB3c1BhdGguYXBwZW5kKCJXRUItSU5GLyIpOwotICAgICAgd3NQYXRoLmFwcGVuZChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSk7Ci0gICAgICB3ZWJTZXJ2aWNlc1hNTCA9ICgoSUNvbnRhaW5lcikgbW9kdWxlUm9vdCkuZmluZE1lbWJlcih3c1BhdGgudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgd3NQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgd3NQYXRoLmFwcGVuZCgiTUVUQS1JTkYvIik7Ci0gICAgICB3c1BhdGguYXBwZW5kKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FKTsKLSAgICAgIHdlYlNlcnZpY2VzWE1MID0gKChJQ29udGFpbmVyKSBtb2R1bGVSb290KS5maW5kTWVtYmVyKHdzUGF0aC50b1N0cmluZygpKTsgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VzWE1MOwotICB9Ci0gIAotICBwcml2YXRlIElSZXNvdXJjZSBnZXRNb2R1bGVSb290KElQcm9qZWN0IHApCi0gIHsKLSAgICBJUGF0aCBtb2R1bGVQYXRoID0gbnVsbDsKLSAgICB0cnkgCi0gICAgewotICAgICAgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwKTsKLSAgICAgIGlmICh2YyAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgbW9kdWxlUGF0aCA9IHZjLmdldFJvb3RGb2xkZXIoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIAotICAgIH0gCi0gICAgCi0gICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKG1vZHVsZVBhdGgpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBXU0RMIHBvcnRzIGluIHRoZSBwcm92aWRlZCBXU0RMCi0gICAqIEBwYXJhbSB3c2RsVVJMIFVSTCBvZiBhIFdTREwgZG9jdW1lbnQKLSAgICogQHBhcmFtIHBhcnNlciAKLSAgICogQHJldHVybiBBcnJheUxpc3QgY29udGFpbmluZyBlbGVtZW50cyBvZiB0eXBlIHtAbGluayBRdWFsaWZpZWROYW1lfQotICAgKi8KLSAgcHJpdmF0ZSBBcnJheUxpc3QgZ2V0UG9ydE5hbWVzRnJvbVdzZGwoU3RyaW5nIHdzZGxVUkwsIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcikKLSAgewotICAJQXJyYXlMaXN0IHBvcnROYW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCURlZmluaXRpb24gZGVmID0gcGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgIE1hcCBzZXJ2aWNlcyA9IGRlZi5nZXRTZXJ2aWNlcygpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgc2VydmljZSA9IChTZXJ2aWNlKWl0Lm5leHQoKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgCVBvcnQgcG9ydCA9IChQb3J0KWl0Mi5uZXh0KCk7Ci0gICAgICAJcG9ydE5hbWVMaXN0LmFkZChuZXcgUXVhbGlmaWVkTmFtZShuYW1lc3BhY2UsIHBvcnQuZ2V0TmFtZSgpKSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgCi0gIAkKLSAgCXJldHVybiBwb3J0TmFtZUxpc3Q7Ci0gIAkKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBRdWFsaWZpZWROYW1lCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlVVJJOwotCi0gICAgU3RyaW5nIGxvY2FsUGFydDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICovCi0gICAgcHVibGljIFF1YWxpZmllZE5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICB0aGlzLmxvY2FsUGFydCA9IGxvY2FsUGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2FsUGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsUGFydCgpCi0gICAgewotICAgICAgcmV0dXJuIGxvY2FsUGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogICAgICAgICAgVGhlIGxvY2FsUGFydCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxQYXJ0KFN0cmluZyBsb2NhbFBhcnQpCi0gICAgewotICAgICAgdGhpcy5sb2NhbFBhcnQgPSBsb2NhbFBhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lc3BhY2VVUkkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICAgIHsKLSAgICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgICAqICAgICAgICAgIFRoZSBuYW1lc3BhY2VVUkkgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgIHsKLSAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhRdWFsaWZpZWROYW1lIHFuKQotICAgIHsKLSAgICAgIHJldHVybiAocW4uZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYgcW4uZ2V0TG9jYWxQYXJ0KCkKLSAgICAgICAgICAuZXF1YWxzKGxvY2FsUGFydCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vQ2xpZW50Um9vdEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9DbGllbnRSb290RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZmVhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9DbGllbnRSb290RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAxMzEgMTIxMDcxICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgICAgIAotICogMjAwNjAyMjEgICAxMTkxMTEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkRhdGFPYmplY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkFzc2VtYmxlQ2xpZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuRGVwbG95Q2xpZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuRGV2ZWxvcENsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkluc3RhbGxDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5SdW5DbGllbnRGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudFJvb3RGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBDbGllbnRSb290RnJhZ21lbnQoKQotICB7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVDbGllbnREZXZlbG9wQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgRGV2ZWxvcENsaWVudEZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZUNsaWVudEFzc2VtYmxlQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgQXNzZW1ibGVDbGllbnRGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVDbGllbnREZXBsb3lDb21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBEZXBsb3lDbGllbnRGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVDbGllbnRJbnN0YWxsQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgSW5zdGFsbENsaWVudEZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZUNsaWVudFJ1bkNvbW1hbmQoKSwgCi0gICAgCSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbi5QcmVDbGllbnRSdW5Db21tYW5kIiApICk7Ci0gICAgYWRkKCBuZXcgUnVuQ2xpZW50RnJhZ21lbnQoKSApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkgCi0gIHsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCQotCS8vIE1hcCB0aGUgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQgaW50byB0aGUgZGF0YU9iamVjdC4KLQlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkRhdGFPYmplY3QiLCBEYXRhT2JqZWN0Q29tbWFuZC5jbGFzcyApOwotCQkKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcyApOwotCQotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0IiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLQkKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLQkKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0IiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgICAKLSAgICAvL01hcHBpbmdzIGZyb20gZnJhbWV3b3JrIHRvIGZyYW1ld29yayBjb21tYW5kcwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgUHJlQ2xpZW50RGVwbG95Q29tbWFuZC5jbGFzcyApOwotICAgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFByZUNsaWVudEFzc2VtYmxlQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFByZUNsaWVudEFzc2VtYmxlQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0IiwgUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBQcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLSAgICAKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBQcmVDbGllbnRJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFByZUNsaWVudEluc3RhbGxDb21tYW5kLmNsYXNzICk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIFByZUNsaWVudEluc3RhbGxDb21tYW5kLmNsYXNzICk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0IiwgUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIFByZUNsaWVudEluc3RhbGxDb21tYW5kLmNsYXNzICk7ICAgCi0KLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBQcmVDbGllbnRSdW5Db21tYW5kLmNsYXNzICk7ICAgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIFByZUNsaWVudFJ1bkNvbW1hbmQuY2xhc3MgKTsKLQkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5NTFjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAxMzEgMTIxMDcxICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgICAgIAotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUZhY2V0ZWRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLlJlcXVpcmVkRmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCAgICAgICB3ZWJTZXJ2aWNlQ2xpZW50XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICBwcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICBtb2R1bGVfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgIGVhclByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgIGVhcl87Ci0gIHByaXZhdGUgSUNvbnRleHQgICAgICAgICAgCSAgY29udGV4dF87Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotCSAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JICBpZiAoY29udGV4dF8gIT0gbnVsbCAmJiBjb250ZXh0Xy5nZXRBc3NlbWJsZSgpKSB7Ci0JCSAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQotCQkgIC8vIENoZWNrIGlmIEVBUiBtb2R1bGUgaXMgcmVxJ2QsIGllLiAhPW51bGwKLQkJICBpZiAoZWFyUHJvamVjdF89PW51bGwpCi0JCQkgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCSAgLy8gIENyZWF0ZSB0aGUgY2xpZW50IEVBUiBtb2R1bGUKLQkJICBDcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQgY29tbWFuZCA9IG5ldyBDcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQoKTsKLQkJICBjb21tYW5kLnNldFByb2plY3ROYW1lKGVhclByb2plY3RfKTsKLQkJICBjb21tYW5kLnNldFRlbXBsYXRlSWQoSUoyRUVNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9URU1QTEFURSk7Ci0KLQkJICAvLyBSZXF1aXJlZEZhY2V0VmVyc2lvbnMgaXMgc2V0IHRvIGFuIGVtcHR5IGFycmF5IGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0byBpbXBvc2UgYW55IGFkZGl0aW9uYWwgY29uc3RyYWludHMuCi0JCSAgLy8gV2UganVzdCB3YW50IHRvIGNyZWF0ZSB0aGUgaGlnaGVzdCBsZXZlbCBvZiBFQVIgcHJvamVjdCB0aGF0IHRoZSBzZWxlY3RlZCBzZXJ2ZXIgc3VwcG9ydHMuCi0JCSAgY29tbWFuZC5zZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMobmV3IFJlcXVpcmVkRmFjZXRWZXJzaW9uWzBdKTsgCi0KLQkJICBjb21tYW5kLnNldFNlcnZlckZhY3RvcnlJZCh3ZWJTZXJ2aWNlQ2xpZW50Xy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFNlcnZlckZhY3RvcnlJZCgpKTsKLQkJICBjb21tYW5kLnNldFNlcnZlckluc3RhbmNlSWQod2ViU2VydmljZUNsaWVudF8uZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQkgIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgYWRhcHRhYmxlICk7Ci0JCSAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLQkJICB7Ci0JCQkgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvciggc3RhdHVzICk7Ci0JCQkgIHJldHVybiBzdGF0dXM7Ci0JCSAgfSAgICAgICAgCi0KLQotCQkgIC8vQXNzb2NpYXRlIHRoZSBjbGllbnQgbW9kdWxlIGFuZCBzZXJ2aWNlIEVBUgotCQkgIEFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kIGFzc29jaWF0ZUNvbW1hbmQgPSBuZXcgQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQoKTsKLQkJICBhc3NvY2lhdGVDb21tYW5kLnNldFByb2plY3QocHJvamVjdF8pOwotCQkgIGFzc29jaWF0ZUNvbW1hbmQuc2V0TW9kdWxlKG1vZHVsZV8pOwotCQkgIGFzc29jaWF0ZUNvbW1hbmQuc2V0RUFSUHJvamVjdChlYXJQcm9qZWN0Xyk7Ci0JCSAgYXNzb2NpYXRlQ29tbWFuZC5zZXRFYXIoZWFyXyk7Ci0JCSAgYXNzb2NpYXRlQ29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52aXJvbm1lbnQgKTsKLQkJICBzdGF0dXMgPSBhc3NvY2lhdGVDb21tYW5kLmV4ZWN1dGUoIG1vbml0b3IsIGFkYXB0YWJsZSApOwotCQkgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQkgIHsKLQkJCSAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCAgc3RhdHVzICk7ICAgICAKLQkJICB9ICAgICAKLQotCSAgfQotCSAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdCggU3RyaW5nIHByb2plY3QgKQotICB7Ci0gICAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0gIHsKLSAgICBtb2R1bGVfID0gbW9kdWxlOwotICB9IAotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotICB7Ci0gICAgZWFyUHJvamVjdF8gPSBlYXJQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0gICAgZWFyXyA9IGVhcjsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlKCBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50ICkKLSAgewotICAgIHdlYlNlcnZpY2VDbGllbnRfID0gd2ViU2VydmljZUNsaWVudDsgIAotICB9ICAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0IChJQ29udGV4dCBjb250ZXh0KSB7Ci0JICBjb250ZXh0XyA9IGNvbnRleHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudERlcGxveUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudERlcGxveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NzFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnREZXBsb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjEgICAxMTkxMTEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFByZUNsaWVudERlcGxveUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLSAgcHJpdmF0ZSBJQ29udGV4dCAgICBjb250ZXh0XzsKLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgaWYgKGNvbnRleHRfICE9IG51bGwgJiYgY29udGV4dF8uZ2V0RGVwbG95KCkpCi0gICAgewotICAgICAgLy9JZiBhbmQgd2hlbiB0aGVyZSBhcmUgZnJhbWV3b3JrIHNwZWNpZmljIGRlcGxveSB0aGluZ3MgdG8gYmUgZG9uZSwKLSAgICAgIC8vZG8gdGhlbSBoZXJlLgotICAgIH0KLSAgICAKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dChJQ29udGV4dCBjb250ZXh0KQotICB7Ci0gICAgICBjb250ZXh0Xz1jb250ZXh0OwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudERldmVsb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZmI1NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAxMzEgMTIxMDcxICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAKLSAqIDIwMDYwMjIxICAgMTE5MTExIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA1MTYgICAxMjY5NjUga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA3MDEyMyAgIDE2NzQ4NyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1hawotICogMjAwNzA0MDMgICAxNzM2NTQga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLlJlcXVpcmVkRmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmNvbW1vbi5IVFRQVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5TaW1wbGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU3RhdGU7Ci0KLXB1YmxpYyBjbGFzcyBQcmVDbGllbnREZXZlbG9wQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIAotewotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcl87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgY2xpZW50UnVudGltZUlkXzsKLSAgcHJpdmF0ZSBJQ29udGV4dCAgICAgICAgICBjb250ZXh0XzsKLSAgcHJpdmF0ZSBJU2VsZWN0aW9uICAgICAgICBzZWxlY3Rpb25fOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIG1vZHVsZV87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlVHlwZV87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgZWFyUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgZWFyXzsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBqMmVlTGV2ZWxfOwotICBwcml2YXRlIFJlc291cmNlQ29udGV4dCAgIHJlc291cmNlQ29udGV4dF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZGV2ZWxvcF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgYXNzZW1ibGVfOwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIGRlcGxveV87Ci0gIHByaXZhdGUgYm9vbGVhbgkJCXRlc3RfOwotICBwcml2YXRlIGJvb2xlYW4JCQlpbnN0YWxsXzsKLSAgcHJpdmF0ZSBib29sZWFuCQkJcnVuXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICB3c2RsVVJJXzsKLSAgcHJpdmF0ZSBPYmplY3QgICAgICAgICAgICBkYXRhT2JqZWN0XzsKLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotCSAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCSAgCi0JICBpZiAoZGV2ZWxvcF8pIHsKLQkJICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCi0JCSAgLy8gU3BsaXQgdXAgdGhlIHByb2plY3QgYW5kIG1vZHVsZQotCQkgIGludCBpbmRleCA9IG1vZHVsZV8uaW5kZXhPZigiLyIpOwotCQkgIGlmIChpbmRleCE9LTEpewotCQkJICBwcm9qZWN0XyA9IG1vZHVsZV8uc3Vic3RyaW5nKDAsaW5kZXgpOwotCQkJICBtb2R1bGVfID0gbW9kdWxlXy5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JCSAgfQotCi0JCSAgaWYgKGVhcl8hPW51bGwgJiYgZWFyXy5sZW5ndGgoKT4wKQotCQkgIHsKLQkJCSAgaW50IGVhckluZGV4ID0gZWFyXy5pbmRleE9mKCIvIik7Ci0JCQkgIGlmIChlYXJJbmRleCE9LTEpIHsKLQkJCQkgIGVhclByb2plY3RfID0gZWFyXy5zdWJzdHJpbmcoMCxlYXJJbmRleCk7Ci0JCQkJICBlYXJfID0gZWFyXy5zdWJzdHJpbmcoZWFySW5kZXgrMSk7Ci0JCQkgIH0KLQkJICB9ICAgIAotCi0JCSAgSVdlYlNlcnZpY2VSdW50aW1lIHdzcnQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMgotCQkgIC5nZXRDbGllbnRSdW50aW1lKGNsaWVudFJ1bnRpbWVJZF8pOwotCQkgIFdlYlNlcnZpY2VDbGllbnRJbmZvIHdzSW5mbyA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50SW5mbygpOwotCi0JCSAgd3NJbmZvLnNldFNlcnZlckZhY3RvcnlJZCh0eXBlUnVudGltZVNlcnZlcl8uZ2V0U2VydmVySWQoKSk7Ci0JCSAgd3NJbmZvLnNldFNlcnZlckluc3RhbmNlSWQodHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0JCSAgd3NJbmZvLnNldFN0YXRlKFdlYlNlcnZpY2VTdGF0ZS5VTktOT1dOX0xJVEVSQUwpOwotCQkgIHdzSW5mby5zZXRXZWJTZXJ2aWNlUnVudGltZUlkKHR5cGVSdW50aW1lU2VydmVyXy5nZXRSdW50aW1lSWQoKSk7Ci0JCSAgCi0JCSAgLy8gY2hlY2sgZm9yIHJlZGlyZWN0aW9uIGluIHRoZSB3c2RsCi0JCSAgSFRUUFV0aWxpdHkgaHR0cFV0aWwgPSBuZXcgSFRUUFV0aWxpdHkoKTsJCSAgCi0JCSAgd3NJbmZvLnNldFdzZGxVUkwoaHR0cFV0aWwuaGFuZGxlUmVkaXJlY3Qod3NkbFVSSV8pKTsKLQotCQkgIHdlYlNlcnZpY2VDbGllbnRfID0gd3NydC5nZXRXZWJTZXJ2aWNlQ2xpZW50KHdzSW5mbyk7Ci0JCSAgV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvID0gV2ViU2VydmljZVNjZW5hcmlvLkNMSUVOVF9MSVRFUkFMOwotCQkgIGNvbnRleHRfID0gbmV3IFNpbXBsZUNvbnRleHQoZGV2ZWxvcF8sIGFzc2VtYmxlXywgZGVwbG95XywgaW5zdGFsbF8sIHJ1bl8sIHRydWUsIHRlc3RfLAotCQkJCSAgZmFsc2UsIHNjZW5hcmlvLCByZXNvdXJjZUNvbnRleHRfLmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCksCi0JCQkJICByZXNvdXJjZUNvbnRleHRfLmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSwgcmVzb3VyY2VDb250ZXh0XwotCQkJCSAgLmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSk7Ci0KLQkJICAvLyBDcmVhdGUgdGhlIGNsaWVudCBtb2R1bGUgaWYgbmVlZGVkLgotCQkgIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdF8pOwotCQkgIFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmZ2ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZURlc2NyaXB0b3JCeUlkKGNsaWVudFJ1bnRpbWVJZF8pLmdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpOwotCQkgIGlmICghcHJvamVjdC5leGlzdHMoKSkKLQkJICB7Ci0JCQkgIGJvb2xlYW4gbWF0Y2hlcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmRvZXNDbGllbnRSdW50aW1lU3VwcG9ydFRlbXBsYXRlKGNsaWVudFJ1bnRpbWVJZF8sIG1vZHVsZVR5cGVfKTsKLQkJCSAgaWYgKG1hdGNoZXMpCi0JCQkgIHsgIAotCQkJCSAgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kKCk7Ci0JCQkJICBjb21tYW5kLnNldFByb2plY3ROYW1lKHByb2plY3RfKTsKLQkJCQkgIGNvbW1hbmQuc2V0VGVtcGxhdGVJZChtb2R1bGVUeXBlXyk7Ci0JCQkJICBjb21tYW5kLnNldFJlcXVpcmVkRmFjZXRWZXJzaW9ucyhyZnYpOwotCQkJCSAgY29tbWFuZC5zZXRTZXJ2ZXJGYWN0b3J5SWQodHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFNlcnZlcklkKCkpOwotCQkJCSAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQkJCSAgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKCBtb25pdG9yLCBhZGFwdGFibGUgKTsKLQkJCQkgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0JCQkJICB7Ci0JCQkJCSAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCBzdGF0dXMgKTsKLQkJCQkJICByZXR1cm4gc3RhdHVzOwotCQkJCSAgfSAgICAgICAgCi0JCQkgIH0gICAgICAgICAgICAKLQkJICB9IGVsc2UgewotCQkJCS8vIGFkZCBmYWNldHMgcmVxdWlyZWQgYnkgV2ViIHNlcnZpY2UgcnVudGltZQotCQkgICAgICAgIGlmIChyZnYubGVuZ3RoICE9IDApIHsKLQkJICAgICAgICAJc3RhdHVzID0gRmFjZXRVdGlscy5hZGRSZXF1aXJlZEZhY2V0c1RvUHJvamVjdChwcm9qZWN0LCByZnYsIG1vbml0b3IpOwotCQkgICAgICAgIAlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotCQkgICAgICAgIAl7Ci0JCSAgICAgICAgCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoIHN0YXR1cyApOwotCQkgICAgICAgIAkJcmV0dXJuIHN0YXR1czsKLQkJICAgICAgICAJfSAgICAgIAotCQkgICAgICAgIH0KLQkJICB9ICAgICAgICAKLQkgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXIgKQotICB7Ci0JdHlwZVJ1bnRpbWVTZXJ2ZXJfID0gdHlwZVJ1bnRpbWVTZXJ2ZXI7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UnVudGltZUlkKCBTdHJpbmcgaWQpCi0gIHsKLSAgICBjbGllbnRSdW50aW1lSWRfID0gaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEoyRUVWZXJzaW9uKCBTdHJpbmcgajJlZUxldmVsICkKLSAgewotCWoyZWVMZXZlbF8gPSBqMmVlTGV2ZWw7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKMmVlTGV2ZWwoKQotICB7Ci0gICAgcmV0dXJuIGoyZWVMZXZlbF87ICAKLSAgfQotICAKLSAgcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2UoKQotICB7Ci0JcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRfOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29udGV4dCBnZXRDb250ZXh0KCkKLSAgewotICAgIHJldHVybiBjb250ZXh0XzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VDb250ZXh0KCBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0ICkKLSAgewotICAgIHJlc291cmNlQ29udGV4dF8gPSByZXNvdXJjZUNvbnRleHQ7CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uXzsJICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKCBJU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLQlzZWxlY3Rpb25fID0gc2VsZWN0aW9uOyAgCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHByb2plY3RfOyAgICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRNb2R1bGUoKQotICB7Ci0gICAgcmV0dXJuIG1vZHVsZV87CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0gIHsKLQltb2R1bGVfID0gbW9kdWxlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVUeXBlKCBTdHJpbmcgbW9kdWxlVHlwZSkKLSAgewotICAgIG1vZHVsZVR5cGVfID0gbW9kdWxlVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWFyUHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gZWFyUHJvamVjdF87ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWFyKCkKLSAgewotCXJldHVybiBlYXJfOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVhciggU3RyaW5nIGVhciApCi0gIHsKLQllYXJfID0gZWFyOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldERldmVsb3BDbGllbnQoYm9vbGVhbiBkZXZlbG9wQ2xpZW50KSB7Ci0JICBkZXZlbG9wXyA9IGRldmVsb3BDbGllbnQ7Ci0gIH0JCi0KLSAgcHVibGljIHZvaWQgc2V0QXNzZW1ibGVDbGllbnQoYm9vbGVhbiBhc3NlbWJsZUNsaWVudCkgewotCSAgYXNzZW1ibGVfID0gYXNzZW1ibGVDbGllbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXBsb3lDbGllbnQoYm9vbGVhbiBkZXBsb3lDbGllbnQpCi0gIHsKLSAgICAgIGRlcGxveV8gPSBkZXBsb3lDbGllbnQ7Ci0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2V0SW5zdGFsbENsaWVudChib29sZWFuIGluc3RhbGxDbGllbnQpCi0gIHsKLQlpbnN0YWxsXyA9IGluc3RhbGxDbGllbnQ7Ci0gIH0JCi0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZShib29sZWFuIHRlc3RTZXJ2aWNlKQotICB7Ci0JdGVzdF8gPSB0ZXN0U2VydmljZTsKLSAgfQkJCi0gIAotICBwdWJsaWMgdm9pZCBzZXRTdGFydFNlcnZpY2UoYm9vbGVhbiBzdGFydFNlcnZpY2UpCi0gIHsKLQkgIHJ1bl8gPSBzdGFydFNlcnZpY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHdzZGxVUklfID0gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREYXRhT2JqZWN0KCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIGRhdGFPYmplY3RfID0gb2JqZWN0OwkgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldERhdGFPYmplY3QoKQotICB7Ci0JT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCi0gICAgaWYoIGRhdGFPYmplY3RfICE9IG51bGwgJiYgZGF0YU9iamVjdF8gaW5zdGFuY2VvZiBJV2ViU2VydmljZSApCi0JewotCSAgLy8gVGhlIGRhdGEgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdpdGggYW4gSVdlYlNlcnZpY2UKLQkgIC8vIHNvIHdlIHdpbGwga2VlcCB0aGlzIHZhbHVlLgotCSAgcmVzdWx0ID0gZGF0YU9iamVjdF87Ci0JfQotICAgIGVsc2UKLQl7Ci0JICByZXN1bHQgPSB3ZWJTZXJ2aWNlQ2xpZW50XzsJCi0JfQotCQotCXJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudEluc3RhbGxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRJbnN0YWxsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBjNGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudEluc3RhbGxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5BZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZVNlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotcHVibGljIGNsYXNzIFByZUNsaWVudEluc3RhbGxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIHByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZUNsaWVudF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJfOwotICBwcml2YXRlIElDb250ZXh0CQkJY29udGV4dF87Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewkgIAotCSAgaWYgKGNvbnRleHRfICE9IG51bGwgJiYgY29udGV4dF8uZ2V0SW5zdGFsbCgpKQotCSAgeyAgCi0JICAgICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQkgICAgICAKLQkgICAgICBpZiAod2ViU2VydmljZUNsaWVudF8uZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk9PW51bGwpCi0JICAgICAgewotCSAgICAgICAgQ3JlYXRlU2VydmVyQ29tbWFuZCBjcmVhdGVTZXJ2ZXJDb21tYW5kID0gbmV3IENyZWF0ZVNlcnZlckNvbW1hbmQoKTsKLQkgICAgICAgIGNyZWF0ZVNlcnZlckNvbW1hbmQuc2V0U2VydmVyRmFjdG9yeWlkKHdlYlNlcnZpY2VDbGllbnRfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCkpOwotCSAgICAgICAgY3JlYXRlU2VydmVyQ29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52aXJvbm1lbnQgKTsKLQkgICAgICAgIElTdGF0dXMgY3JlYXRlU2VydmVyU3RhdHVzID0gY3JlYXRlU2VydmVyQ29tbWFuZC5leGVjdXRlKG51bGwsIG51bGwpOwotCSAgICAgICAgaWYgKGNyZWF0ZVNlcnZlclN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuT0spCi0JICAgICAgICB7Ci0JICAgICAgICAgIHdlYlNlcnZpY2VDbGllbnRfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuc2V0U2VydmVySW5zdGFuY2VJZChjcmVhdGVTZXJ2ZXJDb21tYW5kLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JICAgICAgICAgIGlmIChjcmVhdGVTZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCBjcmVhdGVTZXJ2ZXJTdGF0dXMgKTsKLQkgICAgICAgICAgfSAgICAgICAgICAgICAgIAotCSAgICAgICAgICByZXR1cm4gY3JlYXRlU2VydmVyU3RhdHVzOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICAKLQkgICAgICBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQoKTsKLQkgICAgICBjb21tYW5kLnNldFNlcnZlckluc3RhbmNlSWQod2ViU2VydmljZUNsaWVudF8uZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCSAgICAgIGlmIChlYXJQcm9qZWN0XyAhPSBudWxsICYmIGVhclByb2plY3RfLmxlbmd0aCgpPjAgJiYgZWFyXyE9IG51bGwgJiYgZWFyXy5sZW5ndGgoKT4wKQotCSAgICAgIHsKLQkgICAgICAgIGNvbW1hbmQuc2V0UHJvamVjdChlYXJQcm9qZWN0Xyk7Ci0JICAgICAgICBjb21tYW5kLnNldE1vZHVsZShlYXJfKTsKLQkgICAgICB9Ci0JICAgICAgZWxzZQotCSAgICAgIHsKLQkgICAgICAgIGNvbW1hbmQuc2V0UHJvamVjdChwcm9qZWN0Xyk7Ci0JICAgICAgICBjb21tYW5kLnNldE1vZHVsZShtb2R1bGVfKTsgICAgICAgCi0JICAgICAgfQotCQotCSAgICAgIGNvbW1hbmQuc2V0RW52aXJvbm1lbnQoIGVudmlyb25tZW50ICk7Ci0JICAgICAgSVN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoIG51bGwsIG51bGwgKTsKLQkgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLQkgICAgICB7Ci0JICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoIHN0YXR1cyApOwotCSAgICAgIH0gICAgIAotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICAgfQotCSAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICBwcm9qZWN0XyA9IHByb2plY3Q7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlKCBTdHJpbmcgbW9kdWxlICkKLSAgICB7Ci0gICAgICBtb2R1bGVfID0gbW9kdWxlOwotICAgIH0gCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotICAgIHsKLSAgICAgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RWFyKCBTdHJpbmcgZWFyICkKLSAgICB7Ci0gICAgICBlYXJfID0gZWFyOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlQ2xpZW50IHdlYlNlcnZpY2VDbGllbnQgKQotICAgIHsKLSAgICAgIHdlYlNlcnZpY2VDbGllbnRfID0gd2ViU2VydmljZUNsaWVudDsgIAotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChJQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAJY29udGV4dF8gPSBjb250ZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudFJ1bkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudFJ1bkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMzhiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRSdW5Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5TdGFydFNlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotcHVibGljIGNsYXNzIFByZUNsaWVudFJ1bkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50XzsKLSAgcHJpdmF0ZSBJQ29udGV4dCBjb250ZXh0XzsKLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotCSAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCSAKLQkgIGlmIChjb250ZXh0XyAhPSBudWxsICYmIGNvbnRleHRfLmdldFJ1bigpKQotCSAgewotCSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOyAgIAotCSAgICAKLQkgICAgU3RhcnRTZXJ2ZXJDb21tYW5kIGNvbW1hbmQgPSBuZXcgU3RhcnRTZXJ2ZXJDb21tYW5kKCk7Ci0JICAgIGNvbW1hbmQuc2V0U2VydmVySW5zdGFuY2VJZCh3ZWJTZXJ2aWNlQ2xpZW50Xy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0JICAgIGNvbW1hbmQuc2V0RW52aXJvbm1lbnQoIGVudmlyb25tZW50ICk7Ci0JICAgIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotCSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLQkgICAgewotCSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvciggc3RhdHVzICk7ICAgICAgIAotCSAgICB9IAotCSAgfQotCSAgCi0gICAgcmV0dXJuIHN0YXR1czsJICAKLSAgfQotCSAgCi0KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZSggSVdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZUNsaWVudCApCi0gIHsKLSAgICB3ZWJTZXJ2aWNlQ2xpZW50XyA9IHdlYlNlcnZpY2VDbGllbnQ7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dChJQ29udGV4dCBjb250ZXh0KQotICB7Ci0JICBjb250ZXh0Xz1jb250ZXh0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5OTM2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNCAgIDExNTY5MCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDYwNTA0ICAgMTM2MTE4IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIGluc3RhbmNlXzsKLQotICBwcml2YXRlIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBzZXJ2ZXJSdW50aW1lQ29udGV4dF87Ci0gIHByaXZhdGUgUGVyc2lzdGVudFByb2plY3RUb3BvbG9neUNvbnRleHQgcHJvamVjdFRvcG9sb2d5Q29udGV4dF87Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luICgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC53cy51aSIpOwotICAqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgc3RhdGljIHB1YmxpYyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAgKiBhcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAgICovCi0gICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IgKCBTdHJpbmcgbmFtZSApCi0gICB7Ci0gCXRyeQotICAgICB7CQotICAgICAJVVJMIGltYWdlVVJMID0gRmlsZUxvY2F0b3IuZmluZChpbnN0YW5jZV8uZ2V0QnVuZGxlKCksIG5ldyBQYXRoKCIkbmwkLyIrbmFtZSksIG51bGwpOwotICAgICAJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLSAgICAgfQotICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgIHsKLSAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgfQotICAgfQotCi0gIHB1YmxpYyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKQotICB7Ci0gICAgaWYgKHByb2plY3RUb3BvbG9neUNvbnRleHRfID09IG51bGwpCi0gICAgewotICAgICAgcHJvamVjdFRvcG9sb2d5Q29udGV4dF8gPSBuZXcgUGVyc2lzdGVudFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICAgIHByb2plY3RUb3BvbG9neUNvbnRleHRfLmxvYWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHByb2plY3RUb3BvbG9neUNvbnRleHRfOwotICB9Ci0KLSAgcHVibGljIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBnZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpIAotCXsKLQkgIGlmIChzZXJ2ZXJSdW50aW1lQ29udGV4dF8gPT0gbnVsbCkKLQkgIAl7Ci0JICAJCXNlcnZlclJ1bnRpbWVDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkgIAkJc2VydmVyUnVudGltZUNvbnRleHRfLmxvYWQoKTsKLQkgIAl9Ci0JICByZXR1cm4gc2VydmVyUnVudGltZUNvbnRleHRfOwotCX0gIAotICB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjJlOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIwMiAgIDExOTc4MCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDIxNiAgIDEyNzEzOCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDIyNyAgIDEyNDM5MiByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0Ci17Ci0KLSAgcHVibGljIFBlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0ICgpIAotICB7Ci0JICBzdXBlciggV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGxvYWQoKSAKLSAgewotICAgIC8vTG9hZCB0aGUgc2VydmljZSBwcm9qZWN0IHR5cGVzCi0gICAgU3RyaW5nW10gc2VydmljZUlkcyA9IFByb2plY3RUb3BvbG9neURlZmF1bHRzLmdldFNlcnZpY2VUeXBlcygpOwotICAgIFN0cmluZ0J1ZmZlciBzZXJ2aWNlU2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlSWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpICE9IDApCi0gICAgICAgIHNlcnZpY2VTYi5hcHBlbmQoIiAiKTsKLSAgICAgIHNlcnZpY2VTYi5hcHBlbmQoc2VydmljZUlkc1tpXSk7Ci0gICAgfQotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX1NFUlZJQ0VfVFlQRVMsIHNlcnZpY2VTYi50b1N0cmluZygpKTsKLSAgICAKLSAgICAvL0xvYWQgdGhlIGNsaWVudCBwcm9qZWN0IHR5cGVzCi0gICAgU3RyaW5nW10gaWRzID0gUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgICB9Ci0gICAgc2V0RGVmYXVsdFN0cmluZ0lmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfQ0xJRU5UX1RZUEVTLCBzYi50b1N0cmluZygpKTsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVVNFX1RXT19FQVJTLCBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5pc1VzZVR3b0VBUnMoKSk7Ci0gfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlcyhTdHJpbmdbXSBpZHMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgICB9Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9TRVJWSUNFX1RZUEVTLCBzYi50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2aWNlVHlwZXMoKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfU0VSVklDRV9UWVBFUykpOwotICAgIFN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykKLSAgICAgIHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICByZXR1cm4gczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldERlZmF1bHRTZXJ2aWNlVHlwZXMoKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfU0VSVklDRV9UWVBFUykpOwotICAgIFN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykKLSAgICAgIHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICByZXR1cm4gczsgICAgICAgIAotICB9Ci0gICAgCi0gcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZXMoU3RyaW5nW10gaWRzKQotIHsKLSAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKQotICAgewotICAgICBpZiAoaSAhPSAwKQotICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgIH0KLSAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ0xJRU5UX1RZUEVTLCBzYi50b1N0cmluZygpKTsKLSB9Ci0KLSBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZXMoKQotIHsKLSAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9UWVBFUykpOwotICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspCi0gICAgIHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgIHJldHVybiBzOwotIH0KLSAKLSBwdWJsaWMgU3RyaW5nW10gZ2V0RGVmYXVsdENsaWVudFR5cGVzKCkKLSB7Ci0gICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9DTElFTlRfVFlQRVMpKTsKLSAgIFN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKQotICAgICBzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICByZXR1cm4gczsgICAgICAgIAotIH0gCi0KLSBwdWJsaWMgdm9pZCBzZXRVc2VUd29FQVJzKGJvb2xlYW4gdXNlKQotIHsKLSAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVVNFX1RXT19FQVJTLCB1c2UpOwotIH0KLSBwdWJsaWMgYm9vbGVhbiBpc1VzZVR3b0VBUnMoKQotIHsKLSAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1VTRV9UV09fRUFSUyk7Ci0gfQotCi0gcHVibGljIFByb2plY3RUb3BvbG9neUNvbnRleHQgY29weSgpIHsKLSAJVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICBjb250ZXh0LnNldFNlcnZpY2VUeXBlcyhnZXRTZXJ2aWNlVHlwZXMoKSk7Ci0gICAgY29udGV4dC5zZXREZWZhdWx0U2VydmljZVR5cGVzKGdldERlZmF1bHRTZXJ2aWNlVHlwZXMoKSk7Ci0JY29udGV4dC5zZXRDbGllbnRUeXBlcyhnZXRDbGllbnRUeXBlcygpKTsKLSAgICBjb250ZXh0LnNldERlZmF1bHRDbGllbnRUeXBlcyhnZXREZWZhdWx0Q2xpZW50VHlwZXMoKSk7Ci0JY29udGV4dC5zZXRVc2VUd29FQVJzKGlzVXNlVHdvRUFScygpKTsKLQlyZXR1cm4gY29udGV4dDsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGU2YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50Q29udGV4dDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgewotCQotCXByaXZhdGUgU3RyaW5nIFBSRUZFUkVOQ0VfU0VSVkVSID0gIlBSRUZFUkVOQ0VfU0VSVkVSIjsKLQlwcml2YXRlIFN0cmluZyBQUkVGRVJFTkNFX1JVTlRJTUUgPSAiUFJFRkVSRU5DRV9SVU5USU1FIjsKLQkvL3ByaXZhdGUgU3RyaW5nIFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OID0gIlBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OIjsKLQkKLQlwcml2YXRlIFN0cmluZyBTRVJWRVJfRkFDVE9SWV9JRF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIjsKLQlwcml2YXRlIFN0cmluZyBSVU5USU1FX0lEX0RFRkFVTFQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24uYXhpc1dlYlNlcnZpY2VSVCI7Ci0JCi0JcHVibGljIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpCi0JewotCQlzdXBlcihXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuQ29udGV4dCNsb2FkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKCkgewotCQkvL0RlZmF1bHRzIHdpbGwgYmUgc2V0IHZpYSB0aGUgLmluaSBjdXN0b21pemF0aW9uLiBUaGV5IGFyZSBoYXJkIGNvZGVkIHRvIGRlZmF1bHQgdmFsdWVzIGluIHRoZQotCQkvL2Fic2VuY2Ugb2YgYSAuaW5pIGZpbGUuCi0JCVN0cmluZyBzZXJ2ZXJEZWZhdWx0ID0gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXJEZWZhdWx0PT1udWxsIHx8IHNlcnZlckRlZmF1bHQubGVuZ3RoKCk9PTApCi0JCXsKLQkJICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVkVSLCBTRVJWRVJfRkFDVE9SWV9JRF9ERUZBVUxUKTsKLQkJfQotCi0JCVN0cmluZyBydW50aW1lRGVmYXVsdCA9IGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9SVU5USU1FKTsKLQkJaWYgKHJ1bnRpbWVEZWZhdWx0PT1udWxsIHx8IHJ1bnRpbWVEZWZhdWx0Lmxlbmd0aCgpPT0wKQotCQl7Ci0JCSAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1JVTlRJTUUsIFJVTlRJTUVfSURfREVGQVVMVCk7Ci0JCX0KLQkJCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2VydmVyRmFjdG9yeUlkKCkKLQl7Ci0JCXJldHVybiBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfU0VSVkVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lSWQoKQotCXsKLQkJcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9SVU5USU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZCgpCi0JewotCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfU0VSVkVSKTsgCi0JCS8qCi0JCWlmICh2YWx1ZT09bnVsbCB8fCB2YWx1ZS5sZW5ndGgoKT09MCkKLQkJewotCQkJdmFsdWUgPSBTRVJWRVJfRkFDVE9SWV9JRF9ERUZBVUxUOyAKLQkJCXNldFNlcnZlckZhY3RvcnlJZCh2YWx1ZSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVJZCgpCi0JewotCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfUlVOVElNRSk7Ci0JCS8qCi0JCWlmICh2YWx1ZT09bnVsbCB8fCB2YWx1ZS5sZW5ndGgoKT09MCkKLQkJewotCQkJdmFsdWUgPSBSVU5USU1FX0lEX0RFRkFVTFQ7IAotCQkJc2V0UnVudGltZUlkKHZhbHVlKTsKLQkJfQotCQkqLwotCQlyZXR1cm4gdmFsdWU7CQkKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBpZCkKLQl7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfU0VSVkVSLGlkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UnVudGltZUlkKFN0cmluZyBpZCkKLQl7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfUlVOVElNRSwgaWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMjFjNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjcgICAxMjQzOTIgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFRvcG9sb2d5Q29udGV4dCAKLXsKLSAgLyoqCi0gICAgKiBUaGlzIGNvbnN0YW50IFN0cmluZyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgcHJlZmVycmVkIG9yZGVyIG9mIHRoZSBkaWZmZXJlbnQgY2xpZW50IHR5cGVzCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NMSUVOVF9UWVBFUyA9ICJjbGllbnRUeXBlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfU0VSVklDRV9UWVBFUyA9ICJzZXJ2aWNlVHlwZXMiOwotICAKLSAgLyoqCi0gICAgKiBUaGlzIGNvbnN0YW50IFN0cmluZyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgdHdvIEVBUiBvcHRpb24KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVVNFX1RXT19FQVJTID0gInVzZVR3b0VBUnMiOwotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVzKFN0cmluZ1tdIGlkcyk7Ci0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2aWNlVHlwZXMoKTsKLSAgcHVibGljIFN0cmluZ1tdIGdldERlZmF1bHRTZXJ2aWNlVHlwZXMoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVzKFN0cmluZ1tdIGlkcyk7Ci0gIHB1YmxpYyBTdHJpbmdbXSBnZXRDbGllbnRUeXBlcygpOwotICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVmYXVsdENsaWVudFR5cGVzKCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0VXNlVHdvRUFScyhib29sZWFuIHVzZSk7Ci0gIHB1YmxpYyBib29sZWFuIGlzVXNlVHdvRUFScygpOwotCi0gIHB1YmxpYyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGNvcHkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5ZTFmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1Byb2plY3RUb3BvbG9neURlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjcgICAxMjQzOTIgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMjsKLQotcHVibGljIGNsYXNzIFByb2plY3RUb3BvbG9neURlZmF1bHRzCi17Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGdldFNlcnZpY2VUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0QWxsU2VydmljZVByb2plY3RUeXBlcygpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGdldENsaWVudFR5cGVzKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRBbGxDbGllbnRQcm9qZWN0VHlwZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1VzZVR3b0VBUnMoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjN2JjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1Byb2plY3RUb3BvbG9neVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjI3ICAgMTI0MzkyIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA1MTUgICAxNDEzOTggY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuV1NVSVBsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV2ViU2VydmljZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VG9wb2xvZ3lQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotICAvKkNPTlRFWFRfSUQgUFRQUDAwMDEgZm9yIHRoZSBQcm9qZWN0IFRvcG9sb2d5IFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFRQUF9QQUdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFRQMDAwMSI7Ci0KLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciBzZXJ2aWNlVHlwZVZpZXdlcl87Ci0gIHByaXZhdGUgQnV0dG9uIHNlcnZpY2VNb3ZlVXBfOwotICBwcml2YXRlIEJ1dHRvbiBzZXJ2aWNlTW92ZURvd25fOwotICBwcml2YXRlIFZlY3RvciBzZXJ2aWNlVHlwZXNfOwotICAKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciBjbGllbnRUeXBlVmlld2VyXzsKLSAgcHJpdmF0ZSBCdXR0b24gbW92ZVVwXzsKLSAgcHJpdmF0ZSBCdXR0b24gbW92ZURvd25fOwotICBwcml2YXRlIFZlY3RvciBjbGllbnRUeXBlc187Ci0KLSAgcHJpdmF0ZSBCdXR0b24gdHdvRUFSXzsKLQotIC8qKgotICAgKiBDcmVhdGVzIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyBvbiBkZW1hbmQuCi0gICAqICAgQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHN1cGVycGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BUUFBfUEFHRSk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCxJTkZPUE9QX1BUUFBfUEFHRSk7ICAKLQotICAgIEdyb3VwIHNlcnZpY2VUeXBlQ29tcG9zaXRlID0gbmV3IEdyb3VwKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgR3JpZExheW91dCBzZXJ2aWNlZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHNlcnZpY2VnbC5udW1Db2x1bW5zID0gMjsKLSAgICBzZXJ2aWNlZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBzZXJ2aWNlZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIHNlcnZpY2VUeXBlQ29tcG9zaXRlLnNldExheW91dChzZXJ2aWNlZ2wpOwotICAgIHNlcnZpY2VUeXBlQ29tcG9zaXRlLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkpOwotICAgIHNlcnZpY2VUeXBlQ29tcG9zaXRlLnNldFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX1NFUlZJQ0VfVFlQRV9OQU1FKTsKLSAgICAKLSAgICBUYWJsZSBzZXJ2aWNlVGFibGU9IG5ldyBUYWJsZShzZXJ2aWNlVHlwZUNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgIEdyaWREYXRhIHNlcnZpY2VnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLSAgICBzZXJ2aWNlZ2Qud2lkdGhIaW50ID0gMjU2OwotICAgIHNlcnZpY2VUYWJsZS5zZXRMYXlvdXREYXRhKHNlcnZpY2VnZCk7Ci0gICAgc2VydmljZVRhYmxlLnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1NFUlZJQ0VfVFlQRV9UQUJMRV9WSUVXRVIpOwotCi0gICAgc2VydmljZVR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBzZXJ2aWNlVHlwZVZpZXdlcl8gPSBuZXcgVGFibGVWaWV3ZXIoc2VydmljZVRhYmxlKTsKLSAgICBzZXJ2aWNlVHlwZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDbGllbnRUeXBlQ29udGVudFByb3ZpZGVyKCkpOwotICAgIHNlcnZpY2VUeXBlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDbGllbnRUeXBlTGFiZWxQcm92aWRlcigpKTsKLSAgICBzZXJ2aWNlVHlwZVZpZXdlcl8uc2V0SW5wdXQoc2VydmljZVR5cGVzXyk7Ci0KLSAgICBUYWJsZUxheW91dCBzZXJ2aWNlVGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICBUYWJsZUNvbHVtbiBzZXJ2aWNlVGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oc2VydmljZVRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgc2VydmljZVRhYmxlQ29sdW1uLnNldFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX1NFUlZJQ0VfVFlQRV9OQU1FKTsKLSAgICBDb2x1bW5XZWlnaHREYXRhIHNlcnZpY2VDb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjU2LCAyNTYsIGZhbHNlKTsKLSAgICBzZXJ2aWNlVGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShzZXJ2aWNlQ29sdW1uRGF0YSk7Ci0gICAgc2VydmljZVRhYmxlLnNldExheW91dChzZXJ2aWNlVGFibGVMYXlvdXQpOwotCi0gICAgQ29tcG9zaXRlIHNlcnZpY2VjID0gbmV3IENvbXBvc2l0ZShzZXJ2aWNlVHlwZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHNlcnZpY2VnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgc2VydmljZWdsLm51bUNvbHVtbnMgPSAxOwotICAgIHNlcnZpY2VnbC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICBzZXJ2aWNlZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIHNlcnZpY2VjLnNldExheW91dChzZXJ2aWNlZ2wpOwotCi0gICAgc2VydmljZU1vdmVVcF8gPSBuZXcgQnV0dG9uKHNlcnZpY2VjLCBTV1QuUFVTSCk7Ci0gICAgc2VydmljZU1vdmVVcF8uc2V0VGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuTEFCRUxfTU9WRV9VUCk7Ci0gICAgc2VydmljZU1vdmVVcF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgc2VydmljZU1vdmVVcF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgc2VydmljZU1vdmVVcF8uc2V0VG9vbFRpcFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfTU9WRV9VUCk7Ci0KLSAgICBzZXJ2aWNlTW92ZURvd25fID0gbmV3IEJ1dHRvbihzZXJ2aWNlYywgU1dULlBVU0gpOwotICAgIHNlcnZpY2VNb3ZlRG93bl8uc2V0VGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuTEFCRUxfTU9WRV9ET1dOKTsKLSAgICBzZXJ2aWNlTW92ZURvd25fLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgIHNlcnZpY2VNb3ZlRG93bl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgc2VydmljZU1vdmVEb3duXy5zZXRUb29sVGlwVGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9NT1ZFX0RPV04pOwotICAgIAotCi0gICAgR3JvdXAgY2xpZW50VHlwZUNvbXBvc2l0ZSA9IG5ldyBHcm91cCggcGFyZW50LCBTV1QuTk9ORSApOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIGNsaWVudFR5cGVDb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICBjbGllbnRUeXBlQ29tcG9zaXRlLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkpOwotICAgIGNsaWVudFR5cGVDb21wb3NpdGUuc2V0VGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRSk7Ci0KLSAgICBUYWJsZSB0YWJsZT0gbmV3IFRhYmxlKGNsaWVudFR5cGVDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLSAgICBnZC53aWR0aEhpbnQgPSAyNTY7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdGFibGUuc2V0VG9vbFRpcFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfQ0xJRU5UX1RZUEVfVEFCTEVfVklFV0VSKTsKLQotICAgIGNsaWVudFR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjbGllbnRUeXBlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgY2xpZW50VHlwZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDbGllbnRUeXBlQ29udGVudFByb3ZpZGVyKCkpOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IENsaWVudFR5cGVMYWJlbFByb3ZpZGVyKCkpOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnNldElucHV0KGNsaWVudFR5cGVzXyk7Ci0KLSAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgdGFibGVDb2x1bW4uc2V0VGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRSk7Ci0gICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjU2LCAyNTYsIGZhbHNlKTsKLSAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkRhdGEpOwotICAgIHRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoY2xpZW50VHlwZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYy5zZXRMYXlvdXQoZ2wpOwotCi0gICAgbW92ZVVwXyA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgIG1vdmVVcF8uc2V0VGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuTEFCRUxfTU9WRV9VUF8yKTsKLSAgICBtb3ZlVXBfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgIG1vdmVVcF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgbW92ZVVwXy5zZXRUb29sVGlwVGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9NT1ZFX1VQKTsKLQotICAgIG1vdmVEb3duXyA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgIG1vdmVEb3duXy5zZXRUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5MQUJFTF9NT1ZFX0RPV05fMik7Ci0gICAgbW92ZURvd25fLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgIG1vdmVEb3duXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBtb3ZlRG93bl8uc2V0VG9vbFRpcFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfTU9WRV9ET1dOKTsKLQotICAgIHR3b0VBUl8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULldSQVAgKTsKLSAgICB0d29FQVJfLnNldFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX0VOQUJMRV9UV09fRUFSUyk7Ci0gICAgdHdvRUFSXy5zZXRUb29sVGlwVGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9FTkFCTEVfVFdPX0VBUlMpOwotCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzdXBlcnBhcmVudCk7ICAgIAotCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLSAgewotICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotICB7Ci0gICAgcGVyZm9ybU9rKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICB7IH0KLQotICAKLSAgLyoqCi0gICAqIEFkZHMgdGhlIFN0cmluZyBlbGVtZW50cyBvZiBhcnJheSBhIGludG8gVmVjdG9yIHYuIElmIFN0cmluZyBhcnJheSBiIGNvbnRhaW5zIGFueSBlbGVtZW50cwotICAgKiB0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiBhcnJheSBhLCBhcHBlbmRzIHRoZXNlIGVsZW1lbnRzIGZyb20gYXJyYXkgYiB0byB0aGUgZW5kIG9mIFZlY3RvciB2LiAKLSAgICogQHBhcmFtIGEgYSBTdHJpbmcgYXJyYXkKLSAgICogQHBhcmFtIGIgYSBTdHJpbmcgYXJyYXkKLSAgICogQHBhcmFtIHYgYSBub24tbnVsbCBWZWN0b3IKLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRWZWN0b3JDb250ZW50c0Zyb21Ud29BcnJheXMoU3RyaW5nW10gYSwgU3RyaW5nW10gYiwgVmVjdG9yIHYpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdi5hZGQoYVtpXSk7Ci0gICAgfQotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAodi5pbmRleE9mKGJbaV0pID09IC0xKQotICAgICAgewotICAgICAgICB2LmFkZChiW2ldKTsKLSAgICAgIH0KLSAgICB9ICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHRvIHRoZWlyIGJ1cm5lZC1pbiBkZWZhdWx0cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0gICAgc2VydmljZVR5cGVzXy5jbGVhcigpOwotICAgIFN0cmluZ1tdIGRlZmF1bHRTZXJ2aWNlVHlwZXMgPSBjb250ZXh0LmdldERlZmF1bHRTZXJ2aWNlVHlwZXMoKTsKLSAgICBTdHJpbmdbXSBhbGxTZXJ2aWNlVHlwZXMgPSBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5nZXRTZXJ2aWNlVHlwZXMoKTsKLSAgICBzZXRWZWN0b3JDb250ZW50c0Zyb21Ud29BcnJheXMoZGVmYXVsdFNlcnZpY2VUeXBlcywgYWxsU2VydmljZVR5cGVzLCBzZXJ2aWNlVHlwZXNfKTsgICAgCi0gICAgc2VydmljZVR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAKLSAgICBjbGllbnRUeXBlc18uY2xlYXIoKTsKLSAgICBTdHJpbmdbXSBkZWZhdWx0Q2xpZW50VHlwZXMgPSBjb250ZXh0LmdldERlZmF1bHRDbGllbnRUeXBlcygpOwotICAgIFN0cmluZ1tdIGFsbENsaWVudFR5cGVzID0gUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICBzZXRWZWN0b3JDb250ZW50c0Zyb21Ud29BcnJheXMoZGVmYXVsdENsaWVudFR5cGVzLCBhbGxDbGllbnRUeXBlcywgY2xpZW50VHlwZXNfKTsgICAgICAgICAKLSAgICBjbGllbnRUeXBlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgCi0gICAgdHdvRUFSXy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgLy9Jbml0aWFsIHNlcnZpY2UgcHJvamVjdCB0eXBlcy4KLSAgICBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICBTdHJpbmdbXSBzZXJ2aWNlVHlwZXNGcm9tQ29udGV4dCA9IGNvbnRleHQuZ2V0U2VydmljZVR5cGVzKCk7Ci0gICAgU3RyaW5nW10gYWxsU2VydmljZVR5cGVzID0gUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuZ2V0U2VydmljZVR5cGVzKCk7Ci0gICAgc2V0VmVjdG9yQ29udGVudHNGcm9tVHdvQXJyYXlzKHNlcnZpY2VUeXBlc0Zyb21Db250ZXh0LCBhbGxTZXJ2aWNlVHlwZXMsIHNlcnZpY2VUeXBlc18pOwotICAgIGlmIChhbGxTZXJ2aWNlVHlwZXMubGVuZ3RoID4gc2VydmljZVR5cGVzRnJvbUNvbnRleHQubGVuZ3RoKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZpY2VUeXBlc0FycmF5ID0gbmV3IFN0cmluZ1tzZXJ2aWNlVHlwZXNfLnNpemUoKV07Ci0gICAgICBzZXJ2aWNlVHlwZXNfLmNvcHlJbnRvKHNlcnZpY2VUeXBlc0FycmF5KTsKLSAgICAgIGNvbnRleHQuc2V0U2VydmljZVR5cGVzKHNlcnZpY2VUeXBlc0FycmF5KTsKLSAgICB9Ci0gICAgLy8gcmVmcmVzaCB2aWV3ZXIKLSAgICBzZXJ2aWNlVHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotCi0gICAgCi0gICAgLy9Jbml0aWFsaXplIGNsaWVudCBwcm9qZWN0IHR5cGVzLgotICAgIFN0cmluZ1tdIGNsaWVudFR5cGVzRnJvbUNvbnRleHQgPSBjb250ZXh0LmdldENsaWVudFR5cGVzKCk7Ci0gICAgU3RyaW5nW10gYWxsQ2xpZW50VHlwZXMgPSBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5nZXRDbGllbnRUeXBlcygpOwotICAgIHNldFZlY3RvckNvbnRlbnRzRnJvbVR3b0FycmF5cyhjbGllbnRUeXBlc0Zyb21Db250ZXh0LCBhbGxDbGllbnRUeXBlcywgY2xpZW50VHlwZXNfKTsKLSAgICBpZiAoYWxsQ2xpZW50VHlwZXMubGVuZ3RoID4gY2xpZW50VHlwZXNGcm9tQ29udGV4dC5sZW5ndGgpCi0gICAgewotICAgICAgU3RyaW5nW10gY2xpZW50VHlwZXNBcnJheSA9IG5ldyBTdHJpbmdbY2xpZW50VHlwZXNfLnNpemUoKV07Ci0gICAgICBjbGllbnRUeXBlc18uY29weUludG8oY2xpZW50VHlwZXNBcnJheSk7Ci0gICAgICBjb250ZXh0LnNldENsaWVudFR5cGVzKGNsaWVudFR5cGVzQXJyYXkpOwotICAgIH0KLSAgICAKLSAgICAvLyByZWZyZXNoIHZpZXdlcgotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAKLSAgICB0d29FQVJfLnNldFNlbGVjdGlvbihjb250ZXh0LmlzVXNlVHdvRUFScygpKTsKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIFByb2plY3RUb3BvbG9neUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotICAgIFN0cmluZ1tdIHNlcnZpY2VUeXBlc0FycmF5ID0gbmV3IFN0cmluZ1tzZXJ2aWNlVHlwZXNfLnNpemUoKV07Ci0gICAgc2VydmljZVR5cGVzXy5jb3B5SW50byhzZXJ2aWNlVHlwZXNBcnJheSk7Ci0gICAgY29udGV4dC5zZXRTZXJ2aWNlVHlwZXMoc2VydmljZVR5cGVzQXJyYXkpOyAgICAKLSAgICBTdHJpbmdbXSB0eXBlcyA9IG5ldyBTdHJpbmdbY2xpZW50VHlwZXNfLnNpemUoKV07Ci0gICAgY2xpZW50VHlwZXNfLmNvcHlJbnRvKHR5cGVzKTsKLSAgICBjb250ZXh0LnNldENsaWVudFR5cGVzKHR5cGVzKTsKLSAgICBjb250ZXh0LnNldFVzZVR3b0VBUnModHdvRUFSXy5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBzZXJ2aWNlTW92ZVVwXyB8fCBlLndpZGdldCA9PSBzZXJ2aWNlTW92ZURvd25fKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHNlcnZpY2VUeXBlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLndpZGdldCA9PSBzZXJ2aWNlTW92ZVVwXyAmJiBpbmRleCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc2VydmljZVR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgIHNlcnZpY2VUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXgtMSk7Ci0gICAgICAgICAgc2VydmljZVR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBzZXJ2aWNlTW92ZURvd25fICYmIGluZGV4IDwgc2VydmljZVR5cGVzXy5zaXplKCktMSkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBzZXJ2aWNlVHlwZXNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgc2VydmljZVR5cGVzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleCsxKTsKLSAgICAgICAgICBzZXJ2aWNlVHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1vdmVVcF8gfHwgZS53aWRnZXQgPT0gbW92ZURvd25fKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IGNsaWVudFR5cGVWaWV3ZXJfLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGUud2lkZ2V0ID09IG1vdmVVcF8gJiYgaW5kZXggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGNsaWVudFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgIGNsaWVudFR5cGVzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleCAtIDEpOwotICAgICAgICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgICAgfSBlbHNlIGlmIChlLndpZGdldCA9PSBtb3ZlRG93bl8gJiYgaW5kZXggPCBjbGllbnRUeXBlc18uc2l6ZSgpIC0gMSkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBjbGllbnRUeXBlc18ucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICBjbGllbnRUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXggKyAxKTsKLSAgICAgICAgICBjbGllbnRUeXBlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIENsaWVudFR5cGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gKChWZWN0b3IpdmFsdWUpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIAotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgCi0gICAgewotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50VHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgQ2xpZW50VHlwZUxhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0gICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGFyZzApIAotICAgIHsgCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCB2YWx1ZSkgCi0gICAgewotICAgICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgdGVtcGxhdGUgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSggKFN0cmluZyl2YWx1ZSApOwotICAgICAgCi0gICAgICByZXR1cm4gdGVtcGxhdGUuZ2V0TGFiZWwoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1NlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTlmNTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNzI4CSAgMTUxNzIzIG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbgotICogMjAwNzAxMDkgICAxMzA5NjUga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgTGlzdGVuZXIgCi17Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQkKLQkvKiBDT05URVhUX0lEIFNSUEYwMDAxIGZvciBzZXJ2ZXIgcHJlZmVyZW5jZSBvbiB0aGUgc2VydmVyIHJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlICovCi0JcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9TUlBGX1NFUlZFUl9QUkVGID0gcGx1Z2luSWRfICsgIi5TUlBGMDAwMSI7Ci0JcHJpdmF0ZSBDb21ibyBzZXJ2ZXJfOwotCi0JLyogQ09OVEVYVF9JRCBTUlBGMDAwMiBmb3IgcnVudGltZSBwcmVmZXJlbmNlIG9uIHRoZSBzZXJ2ZXIgcnVudGltZSBwcmVmZXJlbmNlIHBhZ2UgKi8KLQlwcml2YXRlIFN0cmluZyBJTkZPUE9QX1NSUEZfUlVOVElNRV9QUkVGID0gcGx1Z2luSWRfICsgIi5TUlBGMDAwMiI7Ci0JcHJpdmF0ZSBDb21ibyBydW50aW1lXzsJCi0KLQkvKiBDT05URVhUX0lEIFNSUEYwMDAzIGZvciBKMkVFIHZlcnNpb24gcHJlZmVyZW5jZSBvbiB0aGUgc2VydmVyIHJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlICovCi0gICAgLyoKLQlwcml2YXRlIFN0cmluZyBJTkZPUE9QX1NSUEZfSjJFRV9QUkVGID0gcGx1Z2luSWRfICsgIi5TUlBGMDAwMyI7Ci0JcHJpdmF0ZSBDb21ibyBqMmVlVmVyc2lvbl87Ci0gICAgKi8KLQkKLQlTZWxlY3Rpb25MaXN0Q2hvaWNlcyBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfOwotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICAgeyB9CQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIAotCXsKLQkgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKHBsdWdpbklkXyk7Ci0JICAKLQkgIENvbXBvc2l0ZSBwYWdlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCSAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0JICBwYWdlLnNldExheW91dChnbCk7Ci0JICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkgIHBhZ2Uuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICAKLQkgIHNlcnZlcl8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhZ2UsQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1NFUlZFUlNfTElTVCwKLQkJCSAgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfU1JQRl9DT01CT19TRVJWRVIsCi0JCQkJCQkJCQlJTkZPUE9QX1NSUEZfU0VSVkVSX1BSRUYsCi0JCQkJCQkJCQlTV1QuU0lOR0xFfFNXVC5CT1JERVJ8U1dULlJFQURfT05MWSk7Ci0JICAKLQkgIHJ1bnRpbWVfID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYWdlLENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9SVU5USU1FU19MSVNULAotCQkJICBDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9TUlBGX0NPTUJPX1JVTlRJTUUsCi0JCQkJCQkJCQkgSU5GT1BPUF9TUlBGX1JVTlRJTUVfUFJFRiwKLQkJCQkJCQkJCSBTV1QuU0lOR0xFfFNXVC5CT1JERVJ8U1dULlJFQURfT05MWSk7Ci0KLS8qCi0JICBqMmVlVmVyc2lvbl8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhZ2UsQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0oyRUVfVkVSU0lPTiwKLQkJCSAgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfU1JQRl9DT01CT19KMkVFLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1NSUEZfSjJFRV9QUkVGLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFfFNXVC5CT1JERVJ8U1dULlJFQURfT05MWSk7CSAgCi0qLwotCi0JICBpbml0aWFsaXplVmFsdWVzKCk7Ci0JICBzdGFydExpc3RlbmluZygpOwotCSAgYXBwbHlEaWFsb2dGb250KHBhZ2UpOwotCSAgcmV0dXJuIHBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotCXsKLQkJUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICAgIHNlcnZlclRvUnVudGltZVRvSjJFRV8gPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2ZXJUb1J1bnRpbWVUb0oyRUUoKTsKLQotCi0JCXNldFNlcnZlckl0ZW1zKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0TGlzdCgpLmdldExpc3QoKSk7Ci0JCVN0cmluZyBkZWZhdWx0U2VydmVyVGV4dCA9IGNvbnRleHQuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRTZXJ2ZXJUZXh0KTsKLQkJc2V0U2VydmVyU2VsZWN0aW9uKGRlZmF1bHRTZXJ2ZXJUZXh0KTsKLQkJCi0JCXNldFJ1bnRpbWVJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlTdHJpbmcgZGVmYXVsdFJ1bnRpbWVUZXh0ID0gY29udGV4dC5nZXRSdW50aW1lSWQoKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdFJ1bnRpbWVUZXh0KTsKLQkJc2V0UnVudGltZVNlbGVjdGlvbihkZWZhdWx0UnVudGltZVRleHQpOwkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWlmIChzZXJ2ZXJfID09IGV2ZW50LndpZGdldCkKLQkJewotCQkJaGFuZGxlU2VydmVyU2VsZWN0ZWQoKTsKLQkJfQotCQllbHNlIGlmIChydW50aW1lXyA9PSBldmVudC53aWRnZXQpCi0JCXsKLQkJCWhhbmRsZVJ1bnRpbWVTZWxlY3RlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlcnZlclNlbGVjdGVkKCkKLQl7Ci0JCXN0b3BMaXN0ZW5pbmcoKTsKLQkJCi0JCVN0cmluZyBzZWxlY3RlZFRleHQgPSBnZXRTZXJ2ZXJTZWxlY3Rpb24oKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoc2VsZWN0ZWRUZXh0KTsKLQkJCi0JCS8vIFRPRE8gKHNlZSBidWcgMTE2MDI1KSAtIFNpbmNlIHRoZSBzZXJ2ZXIgYW5kIHJ1bnRpbWUgc2V0IGluIHNlcnZlclRvUnVudGltZVRvSjJFRSBpcyBqdXN0IHRoZSBsaXN0IG9mIAotCQkvLyBhbGwgc2VydmVycyBhbmQgYWxsIHJ1bnRpbWUgKGkuZS4gbm8gdmFsaWRhdGlvbiBjaGVja2luZyBpcyBiZWluZyBkb25lKSwgbm8gbmVlZCB0byB1cGRhdGUgdGhlIHJ1bnRpbWUsCi0JCS8vIGp1c3Qga2VlcCB0aGUgb3JpZ2luYWwgdmFsdWUuCi0JCS8vVXBkYXRlIHRoZSBydW50aW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCQlzZXRSdW50aW1lSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLS8vCQlpZiAoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpLmxlbmd0aCA+IDApCi0vLwkJICBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRJbmRleCgwKTsKLS8vCQkKLS8vCQlTdHJpbmcgbmV3UnVudGltZVRleHQgPSBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLS8vCQlpZiAobmV3UnVudGltZVRleHQhPW51bGwgJiYgbmV3UnVudGltZVRleHQubGVuZ3RoKCk+MCkKLS8vCQkJc2V0UnVudGltZVNlbGVjdGlvbihuZXdSdW50aW1lVGV4dCk7CQkKLQkJCi0JCXN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSdW50aW1lU2VsZWN0ZWQoKQotCXsKLQkJc3RvcExpc3RlbmluZygpOwotCQkKLQkJU3RyaW5nIHNlbGVjdGVkVGV4dCA9IGdldFJ1bnRpbWVTZWxlY3Rpb24oKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoc2VsZWN0ZWRUZXh0KTsJCQkJCQkKLQkJc3RhcnRMaXN0ZW5pbmcoKTsJCQotCX0KLQkKLQotICAgIC8qKgotCSAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotCXsKLQkgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCSAgc2V0VG9EZWZhdWx0cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VG9EZWZhdWx0cygpCi0JewotCQlQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQotCQlTdHJpbmcgZGVmYXVsdFNlcnZlclRleHQgPSBjb250ZXh0LmdldERlZmF1bHRTZXJ2ZXJGYWN0b3J5SWQoKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdFNlcnZlclRleHQpOwotCQlzZXRTZXJ2ZXJTZWxlY3Rpb24oZGVmYXVsdFNlcnZlclRleHQpOwotCQkKLQkJc2V0UnVudGltZUl0ZW1zKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKSk7Ci0JCVN0cmluZyBkZWZhdWx0UnVudGltZVRleHQgPSBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lSWQoKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdFJ1bnRpbWVUZXh0KTsKLQkJc2V0UnVudGltZVNlbGVjdGlvbihkZWZhdWx0UnVudGltZVRleHQpOwotCX0KLQotCS8qKgotCSAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCSAgc3RvcmVWYWx1ZXMoKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpCi0JewotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICBjb250ZXh0LnNldFNlcnZlckZhY3RvcnlJZChnZXRTZXJ2ZXJTZWxlY3Rpb24oKSk7Ci0gICAgICBjb250ZXh0LnNldFJ1bnRpbWVJZChnZXRSdW50aW1lU2VsZWN0aW9uKCkpOyAgICAgIAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotCXsKLQkgIHBlcmZvcm1PaygpOwotCX0KLQkKLSAgCQotCXByaXZhdGUgdm9pZCBzdGFydExpc3RlbmluZygpCi0JewotCSAgc2VydmVyXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLHRoaXMpOwotCSAgcnVudGltZV8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcExpc3RlbmluZygpCi0JewotCSAgc2VydmVyXy5yZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkgIHJ1bnRpbWVfLnJlbW92ZUxpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZXJ2ZXJJdGVtcyhTdHJpbmdbXSBmYWN0b3J5SWRzKQotCXsKLQkgIAotCSAgaWYgKGZhY3RvcnlJZHMgIT0gbnVsbCkKLQkgIHsKLQkgICAgQXJyYXlMaXN0IHNlcnZlckxhYmVsc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgZm9yIChpbnQgaT0wO2k8ZmFjdG9yeUlkcy5sZW5ndGg7aSsrKQotCQkgIHsKLQkJCSAgLy9TdHJpbmcgdGhpc1NlcnZlckxhYmVsID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJMYWJlbChmYWN0b3J5SWRzW2ldKTsKLSAgICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZlckxhYmVsQnlJZChmYWN0b3J5SWRzW2ldKTsKLQkJCSAgaWYgKHRoaXNTZXJ2ZXJMYWJlbCE9bnVsbCAmJiB0aGlzU2VydmVyTGFiZWwubGVuZ3RoKCk+MCkKLQkJCSAgewotCQkJICAgIHNlcnZlckxhYmVsc0xpc3QuYWRkKHRoaXNTZXJ2ZXJMYWJlbCk7Ci0JCQkgIH0KLQkJCQotCQkgIH0KLQkJICBTdHJpbmdbXSBzZXJ2ZXJMYWJlbHMgPSBjb252ZXJ0VG9TdHJpbmdBcnJheShzZXJ2ZXJMYWJlbHNMaXN0LnRvQXJyYXkoKSk7IAotCQkgIHNlcnZlcl8uc2V0SXRlbXMoc2VydmVyTGFiZWxzKTsKLQkgIH0KLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRSdW50aW1lSXRlbXMoU3RyaW5nW10gaWRzKQotCXsKLQkgIGlmIChpZHMgIT0gbnVsbCkKLQkgIHsKLQkJU3RyaW5nW10gcnVudGltZUxhYmVscyA9IG5ldyBTdHJpbmdbaWRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGk9MDtpPGlkcy5sZW5ndGg7aSsrKQotCQl7Ci0JCSAgLy9ydW50aW1lTGFiZWxzW2ldID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lTGFiZWwoaWRzW2ldKTsKLSAgICAgIHJ1bnRpbWVMYWJlbHNbaV0gPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lTGFiZWxCeUlkKGlkc1tpXSk7Ci0JCX0KLQotCQkvL3NvcnQgdGhlIGxhYmVscyAoYnVnIDE1MTcyMykKLQkJQXJyYXlzLnNvcnQocnVudGltZUxhYmVscyk7Ci0JCXJ1bnRpbWVfLnNldEl0ZW1zKHJ1bnRpbWVMYWJlbHMpOwotCSAgfQotCQkKLQl9Ci0JCi0gICAgLyoKLSAgICBwcml2YXRlIHZvaWQgc2V0SjJFRUl0ZW1zKFN0cmluZ1tdIHZlcnNpb25zKQotICAgIHsKLSAgICAgIGlmICh2ZXJzaW9ucyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBqMmVlTGFiZWxzID0gbmV3IFN0cmluZ1t2ZXJzaW9ucy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKHZlcnNpb25zW2ldKTsKLSAgICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCAmJiBsYWJlbC5sZW5ndGgoKT4wKQotICAgICAgICAgICAgajJlZUxhYmVsc1tpXSA9IGxhYmVsOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGoyZWVMYWJlbHNbaV0gPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfTkE7Ci0gICAgICAgIH0KLSAgICAgICAgajJlZVZlcnNpb25fLnNldEl0ZW1zKGoyZWVMYWJlbHMpOwotICAgICAgICAKLSAgICAgICAgLy9EaXNhYmxlIHRoZSBjb21ibyBpZiBpdCBoYXMgbm8gaXRlbXMuCi0gICAgICAgIGlmIChqMmVlTGFiZWxzLmxlbmd0aCA+IDApCi0gICAgICAgICAgajJlZVZlcnNpb25fLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBqMmVlVmVyc2lvbl8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAqLwotCQotCXByaXZhdGUgU3RyaW5nIGdldFNlcnZlclNlbGVjdGlvbigpCi0JewotCSAgU3RyaW5nIHNlcnZlckxhYmVsID0gc2VydmVyXy5nZXRUZXh0KCk7Ci0JICAvL3JldHVybiBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJMYWJlbCk7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJMYWJlbCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFJ1bnRpbWVTZWxlY3Rpb24oKQotCXsKLSAgICAgIFN0cmluZyBydW50aW1lTGFiZWwgPSBydW50aW1lXy5nZXRUZXh0KCk7Ci0JICAvL3JldHVybiBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWVJZChydW50aW1lTGFiZWwpOwotICAgICAgcmV0dXJuIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFJ1bnRpbWVJZChydW50aW1lTGFiZWwpOwotCX0KLQkKLSAgICAvKgotCXByaXZhdGUgU3RyaW5nIGdldEoyRUVTZWxlY3Rpb24oKQotCXsKLQkgIFN0cmluZyBqMmVlTGFiZWwgPSBqMmVlVmVyc2lvbl8uZ2V0VGV4dCgpOwotCSAgcmV0dXJuIEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbkZyb21MYWJlbChqMmVlTGFiZWwpOwkJCi0JfQotICAgICovCi0JCi0JcHJpdmF0ZSB2b2lkIHNldFNlcnZlclNlbGVjdGlvbihTdHJpbmcgZmFjdG9yeUlkKQotCXsKLQkJLy9TdHJpbmcgbGFiZWwgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFNlcnZlckxhYmVsKGZhY3RvcnlJZCk7Ci0gICAgU3RyaW5nIGxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmVyTGFiZWxCeUlkKGZhY3RvcnlJZCk7Ci0JCXNldFNlbGVjdGlvbihzZXJ2ZXJfLGxhYmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWVTZWxlY3Rpb24oU3RyaW5nIGlkKQotCXsKLQkJLy9TdHJpbmcgbGFiZWwgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWVMYWJlbChpZCk7Ci0gICAgU3RyaW5nIGxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZUxhYmVsQnlJZChpZCk7Ci0JCXNldFNlbGVjdGlvbihydW50aW1lXyxsYWJlbCk7CQkKLQl9Ci0JCi0gICAgLyoKLQlwcml2YXRlIHZvaWQgc2V0SjJFRVNlbGVjdGlvbihTdHJpbmcgdmVyc2lvbikKLQl7Ci0JICBTdHJpbmcgbGFiZWwgPSBKMkVFVXRpbHMuZ2V0TGFiZWxGcm9tSjJFRVZlcnNpb24odmVyc2lvbik7Ci0gICAgICBzZXRTZWxlY3Rpb24oajJlZVZlcnNpb25fLCBsYWJlbCk7Ci0JfQotICAgICovCi0JCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbihDb21ibyBjb21ibywgU3RyaW5nIHMpCi0JewotCQlTdHJpbmdbXSBpdGVtcyA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykKLQkJewotCQkJaWYgKGl0ZW1zW2ldLmVxdWFscyhzKSkKLQkJCXsKLQkJCQljb21iby5zZWxlY3QoaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gY29udmVydFRvU3RyaW5nQXJyYXkoT2JqZWN0W10gYSkKLQl7Ci0JICBpZiAoYT09bnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JICAJCi0JICBpbnQgbGVuZ3RoID0gYS5sZW5ndGg7Ci0JICBTdHJpbmdbXSBzYSA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLQkgIGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykKLQkgIHsKLQkgIAlPYmplY3Qgb2JqID0gYVtpXTsKLQkgIAlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQotCSAgCXsKLQkgICAgICBzYVtpXSA9IChTdHJpbmcpb2JqOwotCSAgCX0KLQkgIH0KLQkgIHJldHVybiBzYTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9UcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1RyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwMjczMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1RyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyNyAgIDEyNDM5MiByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlczsKLQotCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBpbXBsZW1lbnRzIFByb2plY3RUb3BvbG9neUNvbnRleHQKLXsKLSBwcml2YXRlIFN0cmluZ1tdIHNlcnZpY2VUeXBlczsKLSBwcml2YXRlIFN0cmluZ1tdIGRlZmF1bHRTZXJ2aWNlVHlwZXM7Ci0gCi0gcHJpdmF0ZSBTdHJpbmdbXSBjbGllbnRUeXBlczsKLSBwcml2YXRlIFN0cmluZ1tdIGRlZmF1bHRDbGllbnRUeXBlczsKLSAKLSBwcml2YXRlIGJvb2xlYW4gdHdvRUFSczsKLSAKLSBwdWJsaWMgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCAoKSB7fQotCi0gcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVzKFN0cmluZ1tdIHNlcnZpY2VUeXBlcykKLSB7Ci0gICB0aGlzLnNlcnZpY2VUeXBlcyA9IHNlcnZpY2VUeXBlczsKLSB9Ci0gcHVibGljIFN0cmluZ1tdIGdldFNlcnZpY2VUeXBlcygpCi0gewotICAgcmV0dXJuIHNlcnZpY2VUeXBlczsKLSB9Ci0gCi0gcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZXMoU3RyaW5nW10gY2xpZW50VHlwZXMpCi0gewotICAgdGhpcy5jbGllbnRUeXBlcyA9IGNsaWVudFR5cGVzOwotIH0KLSBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZXMoKQotIHsKLSAgIHJldHVybiBjbGllbnRUeXBlczsKLSB9Ci0KLSBwdWJsaWMgdm9pZCBzZXRVc2VUd29FQVJzKGJvb2xlYW4gdXNlKQotIHsKLSAgIHRoaXMudHdvRUFScyA9IHVzZTsKLSB9Ci0gcHVibGljIGJvb2xlYW4gaXNVc2VUd29FQVJzKCkKLSB7Ci0gICByZXR1cm4gdHdvRUFSczsKLSB9Ci0KLSBwdWJsaWMgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb3B5KCkgewotIAlUcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotICAgIGNvbnRleHQuc2V0U2VydmljZVR5cGVzKGdldFNlcnZpY2VUeXBlcygpKTsKLSAgICBjb250ZXh0LnNldERlZmF1bHRTZXJ2aWNlVHlwZXMoZ2V0RGVmYXVsdFNlcnZpY2VUeXBlcygpKTsKLQljb250ZXh0LnNldENsaWVudFR5cGVzKGdldENsaWVudFR5cGVzKCkpOwotICAgIGNvbnRleHQuc2V0RGVmYXVsdENsaWVudFR5cGVzKGdldERlZmF1bHRDbGllbnRUeXBlcygpKTsKLQljb250ZXh0LnNldFVzZVR3b0VBUnMoaXNVc2VUd29FQVJzKCkpOwotCXJldHVybiBjb250ZXh0OwotIH0KLQotIAotcHVibGljIHZvaWQgc2V0RGVmYXVsdFNlcnZpY2VUeXBlcyhTdHJpbmdbXSBkZWZhdWx0U2VydmljZVR5cGVzKQotewotICB0aGlzLmRlZmF1bHRTZXJ2aWNlVHlwZXMgPSBkZWZhdWx0U2VydmljZVR5cGVzOwotfQotCi1wdWJsaWMgU3RyaW5nW10gZ2V0RGVmYXVsdFNlcnZpY2VUeXBlcygpCi17Ci0gIHJldHVybiBkZWZhdWx0U2VydmljZVR5cGVzOwotCi19Ci0KLQotcHVibGljIHZvaWQgc2V0RGVmYXVsdENsaWVudFR5cGVzKFN0cmluZ1tdIGRlZmF1bHRDbGllbnRUeXBlcykKLXsKLSAgdGhpcy5kZWZhdWx0Q2xpZW50VHlwZXMgPSBkZWZhdWx0Q2xpZW50VHlwZXM7Ci19Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXREZWZhdWx0Q2xpZW50VHlwZXMoKQotewotICByZXR1cm4gZGVmYXVsdENsaWVudFR5cGVzOwotCi19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3NlbGVjdGlvbi9TZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9zZWxlY3Rpb24vU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhYWM4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3NlbGVjdGlvbi9TZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciAKLXsKLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSAKLSAgewotCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluU2VsZWN0aW9uICA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil2YWx1ZTsKLQlTZWxlY3Rpb24gICAgICAgICAgICBvdXRTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uKCk7Ci0JCi0JaWYgKGluU2VsZWN0aW9uICE9IG51bGwpCi0JewotCQlvdXRTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKCBpblNlbGVjdGlvbi50b0FycmF5KCkgKTsJCi0JfQotCQotCXJldHVybiBvdXRTZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvc2VydmVyL1N0YXJ0Q2xpZW50V2lkZ2V0Q29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvc2VydmVyL1N0YXJ0Q2xpZW50V2lkZ2V0Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1YTc2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3NlcnZlci9TdGFydENsaWVudFdpZGdldENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgU3RhcnRDbGllbnRXaWRnZXRDb250cmlidXRvciBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIAotewotICBwcml2YXRlIElTZXJ2ZXIgICAgICBzZXJ2ZXJfOwotCSAgCi0gIHB1YmxpYyBTdGFydENsaWVudFdpZGdldENvbnRyaWJ1dG9yKCBJU2VydmVyIHNlcnZlciApCi0gIHsKLQlzZXJ2ZXJfID0gc2VydmVyOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgCi0gIHsKLQlyZXR1cm4gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfREVTQ19XU19TVEFSVF9TRVJWRVI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSAKLSAgewotCXJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSAKLSAgewotCXJldHVybiBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9XU19TVEFSVF9TRVJWRVI7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGdldFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIAotICB7Ci0JcmV0dXJuIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotCSAgICAgICB7Ci0JCQkgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIAotCQkJIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXJ0U2VydmVyV2lkZ2V0KCBzZXJ2ZXJfICk7Ci0gCQkJIH0KLQkgICAgICAgfTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9zZXJ2ZXIvU3RhcnRDbGllbnRXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3NlcnZlci9TdGFydENsaWVudFdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlNTk3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3NlcnZlci9TdGFydENsaWVudFdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb24uUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotcHVibGljIGNsYXNzIFN0YXJ0Q2xpZW50V2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSAKLXsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3ZWJzZXJ2aWNlQ2xpZW50XzsKLSAgcHJpdmF0ZSBJQ29udGV4dCBjb250ZXh0XzsKLSAgCi0gIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgCi0gIHsKLSAgICBJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHdlYnNlcnZpY2VDbGllbnRfICE9IG51bGwgICYmIGNvbnRleHRfLmdldFJ1bigpKQotICAgIHsKLSAgICAgIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcih3ZWJzZXJ2aWNlQ2xpZW50Xy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKSApOwotICAgIH0KLSAgICAKLSAgICBpZiggc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVEFSVEVEICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXJ0Q2xpZW50V2lkZ2V0Q29udHJpYnV0b3IoIHNlcnZlciApOwotICAgIH0KLSAgICAKLQlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSAKLSAgewotCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotICB7Ci0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFN0YXJ0Q2xpZW50V2lkZ2V0RmFjdG9yeS5jbGFzcyApOwotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBTdGFydENsaWVudFdpZGdldEZhY3RvcnkuY2xhc3MgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZSggSVdlYlNlcnZpY2VDbGllbnQgd2Vic2VydmljZUNsaWVudCApCi0gIHsKLSAgICB3ZWJzZXJ2aWNlQ2xpZW50XyA9IHdlYnNlcnZpY2VDbGllbnQ7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dCAoIElDb250ZXh0IGNvbnRleHQgKQotICB7Ci0gICAgY29udGV4dF8gPSBjb250ZXh0OyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvc2VydmVyL1N0YXJ0U2VydmVyV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3NlcnZlci9TdGFydFNlcnZlcldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQ1OTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvc2VydmVyL1N0YXJ0U2VydmVyV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5TdGFydFNlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5OdWxsU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGNsYXNzIFN0YXJ0U2VydmVyV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIAotewotICBwcml2YXRlIElTZXJ2ZXIgICAgICAgICAgICAgc2VydmVyXzsKLSAgcHJpdmF0ZSBJU3RhdHVzICAgICAgICAgICAgICBzdGF0dXNfOwotICBwcml2YXRlIExpc3RlbmVyICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXJfOwotICBwcml2YXRlIEJ1dHRvbiAgICAgICAgICAgICAgYnV0dG9uXzsKLSAgcHJpdmF0ZSBKb2JDaGFuZ2VBZGFwdGVyICAgIGpvYkNoYW5nZUFkYXB0ZXJfOwotICBwcml2YXRlIFRleHQgICAgICAgICAgICAgICAgc2VydmVyU3RhdGVUZXh0XzsKLSAgcHJpdmF0ZSBQcm9ncmVzc01vbml0b3JQYXJ0IHByb2dyZXNzTW9uaXRvcl87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBwbHVnaW5JZF87Ci0gIHByaXZhdGUgQ29tcG9zaXRlICAgICAgICAgICBidXR0b25Hcm91cF87Ci0gICAgCi0gIC8qQ09OVEVYVF9JRCBTU1dQMDAwMSBTdGFydCB0aGUgc2VydmVyIGJ1dHRvbi4gKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9TU1dQX1NFUlZFUl9CVVRUT04gPSAiU1NXUDAwMDEiOwotICAKLSAgcHVibGljIFN0YXJ0U2VydmVyV2lkZ2V0KCBJU2VydmVyIHNlcnZlciApCi0gIHsKLQlwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQkJCi0gICAgc2VydmVyXyA9IHNlcnZlcjsKLSAgICAKLSAgICBqb2JDaGFuZ2VBZGFwdGVyXyA9IG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZG9uZShmaW5hbCBJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgCQkJICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSAKLQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhcHJvZ3Jlc3NNb25pdG9yXy5pc0Rpc3Bvc2VkKCkgKQotCSAgICAgICAgCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlcnZlclN0YXRlKCk7CQotCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NNb25pdG9yXy5kb25lKCk7Ci0JCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRFcnJvcklmUmVxdWlyZWQoIChTdGFydFNlcnZlckpvYilldmVudC5nZXRKb2IoKSApOwotCSAgICAgICAgCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCQkJICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gIH0KLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSAKLSAgewotCXN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOwotCQotCVVJVXRpbHMgICAgICB1aVV0aWxzICAgICA9IG5ldyBVSVV0aWxzKCBwbHVnaW5JZF8gKTsKLQlDb21wb3NpdGUgICAgZ3JvdXAgICAgICAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAxICk7Ci0JCi0JVGV4dCAgICAgICAgIHRleHQxICAgICAgICA9IHVpVXRpbHMuY3JlYXRlVGV4dCggZ3JvdXAsIG51bGwsIG51bGwsIG51bGwsIFNXVC5SRUFEX09OTFkgKTsKLQl0ZXh0MS5zZXRUZXh0KCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU1RBUlRfU0VSVkVSX1RFWFQxLCBuZXcgU3RyaW5nW117IHNlcnZlcl8uZ2V0TmFtZSgpIH0gKSk7Ci0JCi0JVGV4dCAgICAgICAgIHRleHQyICAgICAgICA9IHVpVXRpbHMuY3JlYXRlVGV4dCggZ3JvdXAsIG51bGwsIG51bGwsIG51bGwsIFNXVC5SRUFEX09OTFkgKTsKLQl0ZXh0Mi5zZXRUZXh0KCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU1RBUlRfU0VSVkVSX1RFWFQyLCBuZXcgU3RyaW5nW117IHNlcnZlcl8uZ2V0TmFtZSgpIH0gKSk7Ci0JCi0JVGV4dCAgICAgICAgIHRleHQzICAgICAgICA9IHVpVXRpbHMuY3JlYXRlVGV4dCggZ3JvdXAsIG51bGwsIG51bGwsIG51bGwsIFNXVC5SRUFEX09OTFkgKTsKLQl0ZXh0My5zZXRUZXh0KCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU1RBUlRfU0VSVkVSX1RFWFQzLCBuZXcgU3RyaW5nW117IHNlcnZlcl8uZ2V0TmFtZSgpIH0gKSk7Ci0JCi0JVGV4dCAgICAgICAgIHRleHQ0ICAgICAgICA9IHVpVXRpbHMuY3JlYXRlVGV4dCggZ3JvdXAsIG51bGwsIG51bGwsIG51bGwsIFNXVC5SRUFEX09OTFkgKTsKLQl0ZXh0NC5zZXRUZXh0KCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU1RBUlRfU0VSVkVSX1RFWFQ0LCBuZXcgU3RyaW5nW117IHNlcnZlcl8uZ2V0TmFtZSgpIH0gKSk7IAotCQotCWJ1dHRvbkdyb3VwXyA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBncm91cCwgMiwtMSwgMCApOwotCXNlcnZlclN0YXRlVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIGJ1dHRvbkdyb3VwXywgbnVsbCwgbnVsbCwgbnVsbCwgU1dULlJFQURfT05MWSApOwotCXNlcnZlclN0YXRlVGV4dF8uc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCkgKTsKLQkJCi0JYnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggYnV0dG9uR3JvdXBfLCAKLQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TVEFSVF9TRVJWRVJfQlVUVE9OLAotCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfU1RBUlRfU0VSVkVSX0JVVFRPTiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1NTV1BfU0VSVkVSX0JVVFRPTiApOwotCQotCWJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJCSAgICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJCQkJCQkgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgICAgICAgICAgICAJICAgc2VydmVyU3RhdGVUZXh0Xy5zZXRUZXh0KCBnZXRTdGF0ZU1lc3NhZ2UoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5URVhUX1NFUlZFUl9TVEFUVVMsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5URVhUX1NFUlZFUl9TVEFSVElORyApICk7Ci0JCQkgICAgICAgICAgICAgICAgICAgIAkgICBwcm9ncmVzc01vbml0b3JfLmJlZ2luVGFzayggZ2V0U3RhdGVNZXNzYWdlKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVEVYVF9TRVJWRVJfTVNHLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVEVYVF9TRVJWRVJfU1RBUlRJTkcgKSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOICk7Ci0JCQkgICAgICAgICAgICAgICAgICAgIAkgICBidXR0b25fLnNldEVuYWJsZWQoIGZhbHNlICk7Ci0JCQkgICAgICAgICAgICAgICAgICAgIAkgICBidXR0b25Hcm91cF8ucGFjaygpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXJKb2IoKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkgICAgICAgICAgICAgICAgICAgICAgfSApOwkKLQkKLQlwcm9ncmVzc01vbml0b3JfID0gbmV3IFByb2dyZXNzTW9uaXRvclBhcnQoIGdyb3VwLCBuZXcgR3JpZExheW91dCgpICk7Ci0JcHJvZ3Jlc3NNb25pdG9yXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApKTsKLQkKLQlzZXRTZXJ2ZXJTdGF0ZSgpOwotCXJldHVybiB0aGlzOwotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgCi0gIHsKLQlyZXR1cm4gc3RhdHVzXzsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldFNlcnZlclN0YXRlKCkKLSAgewotCWludCBzdGF0ZSA9IHNlcnZlcl8uZ2V0U2VydmVyU3RhdGUoKTsKLQkKLQlzd2l0Y2goIHN0YXRlICkKLQl7Ci0JICBjYXNlIElTZXJ2ZXIuU1RBVEVfU1RBUlRFRDoKLQkgIHsKLQkJc3RhdHVzXyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWJ1dHRvbl8uc2V0RW5hYmxlZCggZmFsc2UgKTsKLQkJc2VydmVyU3RhdGVUZXh0Xy5zZXRUZXh0KCBnZXRTdGF0ZU1lc3NhZ2UoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5URVhUX1NFUlZFUl9TVEFUVVMsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5URVhUX1NFUlZFUl9TVEFSVEVEICkgKTsKLQkJCi0JICAgIGJyZWFrOwkgIAotCSAgfQotCSAgCi0JICBjYXNlIElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkc6Ci0JICB7Ci0JCXN0YXR1c18gPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggIiIgKTsKLQkJYnV0dG9uXy5zZXRFbmFibGVkKCBmYWxzZSApOyAgCi0JCXNlcnZlclN0YXRlVGV4dF8uc2V0VGV4dCggZ2V0U3RhdGVNZXNzYWdlKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVEVYVF9TRVJWRVJfU1RBVFVTLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVEVYVF9TRVJWRVJfU1RBUlRJTkcgKSApOwotCQlwcm9ncmVzc01vbml0b3JfLmJlZ2luVGFzayggZ2V0U3RhdGVNZXNzYWdlKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVEVYVF9TRVJWRVJfTVNHLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVEVYVF9TRVJWRVJfU1RBUlRJTkcgKSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOICk7Ci0JCQotCQkvLyBUaGUgc2VydmVyIGlzIHN0aWxsIHN0YXJ0aW5nIHNvIHdlIG5lZWQgdG8gcmVjb25uZWN0IHRvIHRoZSBqb2IKLQkJLy8gdGhhdCBpcyBzdGFydGluZyBpdC4KLQkJc3RhcnRTZXJ2ZXJKb2IoKTsKLQkgICAgYnJlYWs7CSAgCi0JICB9Ci0JICAKLQkgIGRlZmF1bHQ6Ci0JICB7Ci0JCXN0YXR1c18gPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggIiIgKTsKLSAgICAgICAgYnV0dG9uXy5zZXRFbmFibGVkKCB0cnVlICk7Ci0JCXNlcnZlclN0YXRlVGV4dF8uc2V0VGV4dCggZ2V0U3RhdGVNZXNzYWdlKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVEVYVF9TRVJWRVJfU1RBVFVTLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVEVYVF9TRVJWRVJfU1RPUFBFRCApICk7Ci0JCWJyZWFrOyAgCi0JICB9Ci0JfTsKLQkKLQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLQlidXR0b25Hcm91cF8ucGFjaygpOwotICB9ICAKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFN0YXRlTWVzc2FnZSggU3RyaW5nIG1haW5LZXksIFN0cmluZyBzdWJLZXkgKQotICB7Ci0JcmV0dXJuIE5MUy5iaW5kKCBtYWluS2V5LCBuZXcgU3RyaW5nW117IHN1YktleSB9ICk7Ci0gIH0KLSAgCi0gIC8vIENvbm5lY3QgdG8gYW4gZXhpc3Rpbmcgc2VydmVyIHRocmVhZCBvdGhlcndpc2Ugc3RhcnQgYSBuZXcgb25lLgotICBwcml2YXRlIHZvaWQgc3RhcnRTZXJ2ZXJKb2IoKQotICB7Ci0JSUpvYk1hbmFnZXIgICAgam9iTWFuYWdlciAgICAgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCk7Ci0JSm9iW10gICAgICAgICAgam9icyAgICAgICAgICAgPSBqb2JNYW5hZ2VyLmZpbmQoIFN0YXJ0U2VydmVyRmFtaWx5ICk7Ci0JU3RhcnRTZXJ2ZXJKb2Igc3RhcnRTZXJ2ZXJKb2IgPSBudWxsOwotCQotCS8vIFRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGpvYiBzdGFydGluZyBmb3IgZGlmZmVyZW50IHNlcnZlcnMuCi0JLy8gVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIG9uZSBmb3Igb3VyIHNlcnZlciBpZiBpdCBpcyBhdmFpbGFibGUuCi0JZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGpvYnMubGVuZ3RoOyBpbmRleCsrICkKLQl7Ci0JICBTdGFydFNlcnZlckpvYiBqb2JGb3VuZCA9IChTdGFydFNlcnZlckpvYilqb2JzW2luZGV4XTsKLQkgIAotCSAgaWYoIGpvYkZvdW5kLmdldFNlcnZlcigpID09IHNlcnZlcl8gKQotCSAgewotCSAgICBzdGFydFNlcnZlckpvYiA9IGpvYkZvdW5kOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0JCi0JaWYoIHN0YXJ0U2VydmVySm9iICE9IG51bGwgKQotCXsKLQkgIHN5bmNocm9uaXplZCggU3RhcnRTZXJ2ZXJGYW1pbHkgKSAKLQkgIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBzdGFydFNlcnZlckpvYi5nZXRTdGF0dXMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdlIGFyZSB1c2luZyBzdGF0dXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBqb2IgaGFzIGNvbXBsZXRlZCBvciBub3QuCi0gICAgICAgIC8vIE5vcm1hbGx5LCB3ZSB3b3VsZCBub3QgZ2V0IGhlcmUgaWYgdGhlIGpvYiBoYWQgYWxyZWFkeSBjb21wbGV0ZWQsCi0gICAgICAgIC8vIGJ1dCB0aGVyZSBpcyBhIHNsaW0gd2luZG93IHdoZXJlIHRoZSBqb2IgbWFuYWdlciBnaXZlcyB1cyB0aGUgam9iCi0gICAgICAgIC8vIGFuZCB0aGVuIGl0IGltbWVkaWF0ZWx5IGNvbXBsZXRlcy4KLSAgICAgICAgaWYoIHN0YXR1cyA9PSBudWxsICkKLSAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgLy8gVGhlIGpvYiBoYWQgbm90IGNvbXBsZXRlZCB5ZXQgc28gd2Ugd2lsbCBhZGQgYSBqb2IgY2hhbmdlIGxpc3RlbmVyLgotICAgICAgICAgIC8vIFdlIGFyZSBhZGRpbmcgdGhlIGpvYiBsaXN0ZW5lciBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBhc3N1bWUKLSAgICAgICAgICAvLyB0aGF0IHRoaXMgaW5zdGFuY2Ugb2YgdGhpcyB3aWRnZXQgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGluc3RhbmNlLgotICAgICAgICAgIC8vIElmIHN0YXJ0U2VydmVySm9iIGFscmVhZHkgaGFzICJqb2JDaGFuZ2VBZGFwdGVyXyIgYWRkZWQgdG8gaXQgdGhpcwotICAgICAgICAgIC8vIG1ldGhvZCBjYWxsIHdpbGwgbm90IGhhdmUgYW4gZWZmZWN0LihXaGljaCBpcyB3aGF0IHdlIHdhbnQuKQotICAgICAgICAgIHN0YXJ0U2VydmVySm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKCBqb2JDaGFuZ2VBZGFwdGVyXyApOyAKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBOb3RlOiB0aGlzIGpvYiB3YXMgcmVwb3J0aW5nIHByb2dyZXNzIHRvIGRpZmZlcmVudCBwcm9ncmVzc01vbml0b3JfCi0gICAgICAgICAgLy8gICAgICAgY29udHJvbC4gIFdlIG5lZWQgdG8gdGVsbCB0aGUgam9iIHRoYXQgaXQgc2hvdWxkIHJlcG9ydCBwcm9ncmVzcwotICAgICAgICAgIC8vICAgICAgIHRvIG91ciBuZXcgcHJvZ3Jlc3NNb25pdG9yXyBjb250cm9sIG9uIHRoaXMgd2l6YXJkIHBhZ2UuCi0gICAgICAgICAgUHJvZ3Jlc3NNb25pdG9yV3JhcHBlciBtb25pdG9yID0gKFByb2dyZXNzTW9uaXRvcldyYXBwZXIpc3RhcnRTZXJ2ZXJKb2IuZ2V0TW9uaXRvcigpOwotICAgICAgICAgIG1vbml0b3Iuc2V0TW9uaXRvciggcHJvZ3Jlc3NNb25pdG9yXyApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFRoZSBqb2IgY29tcGxldGVkIGJlZm9yZSB3ZSBoYWQgYSBjaGFuY2UgdG8gYWRkIHRoZSBqb2IgY2hhbmdlIGxpc3RlbmVyCi0gICAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgY2FsbCBqb2JDaGFuZ2VBZGFwdGVyXyBkaXJlY3RseSB0byBub3RpZnkKLSAgICAgICAgICAvLyB0aGUgVUkgdGhhdCB0aGUgam9iIGhhcyBjb21wbGV0ZWQuCi0gICAgICAgICAgam9iQ2hhbmdlQWRhcHRlcl8uZG9uZSggbnVsbCApOwotICAgICAgICB9Ci0JICB9Ci0JfQotCWVsc2UKLQl7Ci0JICBzdGFydFNlcnZlckpvYiA9IG5ldyBTdGFydFNlcnZlckpvYigpOwkKLQkgIHN0YXJ0U2VydmVySm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKCBqb2JDaGFuZ2VBZGFwdGVyXyApOwotCSAgc3RhcnRTZXJ2ZXJKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0gIH0KLSAgICAgCi0gIHByaXZhdGUgdm9pZCByZXBvcnRFcnJvcklmUmVxdWlyZWQoIFN0YXJ0U2VydmVySm9iIHNlcnZlckpvYiApCi0gIHsKLQkgIElTdGF0dXMgc3RhdHVzID0gc2VydmVySm9iLmdldFN0YXR1cygpOwotCQotCSAgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0JICB7Ci0JICAgIFNoZWxsICAgICAgICAgICAgICAgIHNoZWxsICAgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gICAgICBFY2xpcHNlU3RhdHVzSGFuZGxlciBoYW5kbGVyID0gbmV3IEVjbGlwc2VTdGF0dXNIYW5kbGVyKCBzaGVsbCApOwotICAgICAgCi0gICAgICBoYW5kbGVyLnJlcG9ydEVycm9yKCBzdGF0dXMgKTsKLQkgIH0KLSAgfQotICAKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBTdGFydFNlcnZlckZhbWlseSA9ICJTdGFydFNlcnZlckZhbWlseSI7Ci0gIAotICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RhcnQgdXAgdGhlIHNlcnZlciBpbiBhbiBFY2xpcHNlIGpvYi4KLSAgcHJpdmF0ZSBjbGFzcyBTdGFydFNlcnZlckpvYiBleHRlbmRzIEpvYgotICB7Ci0JICBwcml2YXRlIElTdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzXyA9IG51bGw7Ci0JICBwcml2YXRlIFByb2dyZXNzTW9uaXRvcldyYXBwZXIgZW52TW9uaXRvcl87Ci0JCi0JICBwdWJsaWMgU3RhcnRTZXJ2ZXJKb2IoKQotCSAgewotCSAgICBzdXBlciggIlN0YXJ0U2VydmVySm9iIiApOwotCSAgCi0JICAgIGVudk1vbml0b3JfID0gbmV3IFByb2dyZXNzTW9uaXRvcldyYXBwZXIoIHByb2dyZXNzTW9uaXRvcl8gKTsKLQkgIH0KLQkKLQkgIHB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpCi0JICB7Ci0JICAgIHJldHVybiBzZXJ2ZXJfOwkKLQkgIH0KLQkKLQkgIHB1YmxpYyBQcm9ncmVzc01vbml0b3JXcmFwcGVyIGdldE1vbml0b3IoKQotCSAgewotCSAgICByZXR1cm4gZW52TW9uaXRvcl87CQotCSAgfQotCQotCSAgcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIAotCSAgewotCSAgICByZXR1cm4gZmFtaWx5ID09IFN0YXJ0U2VydmVyRmFtaWx5OwotCSAgfQotCi0JICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSAKLQkgIHsKLQkgICAgTnVsbFN0YXR1c0hhbmRsZXIgICAgICAgIGhhbmRsZXIgICAgICAgICA9IG5ldyBOdWxsU3RhdHVzSGFuZGxlcigpOwotCSAgICBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0ID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotCSAgICBFY2xpcHNlRW52aXJvbm1lbnQgICAgICAgZW52aXJvbm1lbnQgICAgID0gbmV3IEVjbGlwc2VFbnZpcm9ubWVudCggbnVsbCxyZXNvdXJjZUNvbnRleHQsIGhhbmRsZXIgKTsKLQkgICAgU3RhcnRTZXJ2ZXJDb21tYW5kICAgICAgIHNlcnZlckNvbW1hbmQgICA9IG5ldyBTdGFydFNlcnZlckNvbW1hbmQoIGZhbHNlICk7Ci0JICAgIAotCSAgICBzZXJ2ZXJDb21tYW5kLnNldFNlcnZlckluc3RhbmNlSWQoIHNlcnZlcl8uZ2V0SWQoKSApOwotICAgICAgc2VydmVyQ29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52aXJvbm1lbnQgKTsKLQkgICAgCi0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgc2V0U3RhdHVzKCBzZXJ2ZXJDb21tYW5kLmV4ZWN1dGUoIGVudk1vbml0b3JfLCBudWxsICkgKTsJCQotCSAgICB9Ci0JICAgIGNhdGNoKCBUaHJvd2FibGUgZXhjICkKLQkgICAgewotCQkgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICAgIHNldFN0YXR1cyggU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIGV4YyApICk7Ci0JICAgIH0KLQkgIAkKLQkgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JICB9Ci0JCi0JICAvLyBDYWxscyB0byB0aGlzIG1ldGhvZCBuZWVkIHRvIGZpcnN0IHN5bmNocm9uaXplIG9uIHRoZQotCSAgLy8gU3RhcnRTZXJ2ZXJGYW1pbHkgb2JqZWN0LgotCSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkKLQkgIHsKLQkgICAgcmV0dXJuIHN0YXR1c187Ci0JICB9Ci0JCi0JICBwcml2YXRlIHZvaWQgc2V0U3RhdHVzKCBJU3RhdHVzIHN0YXR1cyApCi0JICB7Ci0JICAgIHN5bmNocm9uaXplZCggU3RhcnRTZXJ2ZXJGYW1pbHkgKSAKLQkgICAgewotICAgICAgICBzdGF0dXNfID0gc3RhdHVzOwotCSAgICB9Ci0JICB9Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBjbGFzcyBQcm9ncmVzc01vbml0b3JXcmFwcGVyIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvcgotICB7Ci0gICAgcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3JfID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgCSAgCQotICAgIHB1YmxpYyBQcm9ncmVzc01vbml0b3JXcmFwcGVyKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIHsKLSAgICAgIG1vbml0b3JfID0gbW9uaXRvcjsgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIHsKLSAgICAgIG1vbml0b3JfID0gbW9uaXRvcjsJCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGJlZ2luVGFzayhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgaW50IHRvdGFsV29yaykgCi0gICAgewotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKQotICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhcHJvZ3Jlc3NNb25pdG9yXy5pc0Rpc3Bvc2VkKCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG1vbml0b3JfLmJlZ2luVGFzayggbmFtZSwgdG90YWxXb3JrICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb25lKCkgCi0gICAgewotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXByb2dyZXNzTW9uaXRvcl8uaXNEaXNwb3NlZCgpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yXy5kb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZmluYWwgZG91YmxlIHdvcmspIAotICAgIHsKLSAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFwcm9ncmVzc01vbml0b3JfLmlzRGlzcG9zZWQoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvcl8uaW50ZXJuYWxXb3JrZWQoIHdvcmsgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgCi0gICAgewotICAgICAgcmV0dXJuIHByb2dyZXNzTW9uaXRvcl8uaXNEaXNwb3NlZCgpID8gZmFsc2UgOiBtb25pdG9yXy5pc0NhbmNlbGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkgCi0gICAgewotICAgICAgaWYoICFwcm9ncmVzc01vbml0b3JfLmlzRGlzcG9zZWQoKSApCi0gICAgICB7Ci0gIAkgICAgbW9uaXRvcl8uc2V0Q2FuY2VsZWQoIHZhbHVlICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFza05hbWUoZmluYWwgU3RyaW5nIG5hbWUpIAotICAgIHsKLSAgCSAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXByb2dyZXNzTW9uaXRvcl8uaXNEaXNwb3NlZCgpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yXy5zZXRUYXNrTmFtZSggbmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN1YlRhc2soIGZpbmFsIFN0cmluZyBuYW1lKSAKLSAgICB7Ci0gIAkgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFwcm9ncmVzc01vbml0b3JfLmlzRGlzcG9zZWQoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvcl8uc3ViVGFzayggbmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdvcmtlZChmaW5hbCBpbnQgd29yaykgCi0gICAgewotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXByb2dyZXNzTW9uaXRvcl8uaXNEaXNwb3NlZCgpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yXy53b3JrZWQoIHdvcmsgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0Fic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNDkwYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0Fic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDQgMTM0OTEzICAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1ICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotLyoqCi0gKiBBYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZAotICoKLSAqIEluaXRpYWxpemUgYW5kIGxvYWQgdGhlIGhhbmRsZXJzIGRhdGEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIAotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb25fOyAKLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIAotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGluaXRpYWxTZWxlY3Rpb25fOwotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVEFTS19FWENFUFRFRCApOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgfQotICAKLQotICBwdWJsaWMgTGlzdCBnZXRDbGllbnRIYW5kbGVycygpewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0U2VsZWN0aW9uKXsKLSAgICB0aGlzLmluaXRpYWxTZWxlY3Rpb25fID0gaW5pdFNlbGVjdGlvbjsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEluaXRpYWxTZWxlY3Rpb24oKXsKLSAgICByZXR1cm4gdGhpcy5pbml0aWFsU2VsZWN0aW9uXzsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21Jbml0aWFsU2VsZWN0aW9uKCkKLSAgewotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uXyAhPSBudWxsICYmIGluaXRpYWxTZWxlY3Rpb25fLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpbml0aWFsU2VsZWN0aW9uXy5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gICAKLSAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKXsKLSAgICAKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZUZyb21Jbml0aWFsU2VsZWN0aW9uKCk7Ci0JaWYgKHJlc291cmNlICE9IG51bGwpCi0JewotCSAgcmV0dXJuIFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKCByZXNvdXJjZS5nZXRGdWxsUGF0aCgpICk7Ci0JfQotCSAKLQlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCl7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGcm9tSW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChyZXNvdXJjZSE9bnVsbCkgewotICAgICAgSVBhdGggYWJzb2x1dGVQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICAgIGlmIChhYnNvbHV0ZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0gICAgICAgIHJldHVybiBhYnNvbHV0ZVBhdGguc2VnbWVudCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0vLyAgcHVibGljIFdlYlNlcnZpY2VFZGl0TW9kZWwgZ2V0V2ViU2VydmljZUVkaXRNb2RlbCgpIHsKLS8vICAgIFdlYlNlcnZpY2VzTWFuYWdlciB3c20gPSBuZXcgV2ViU2VydmljZXNNYW5hZ2VyKCk7Ci0vLyAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotLy8gICAgcmV0dXJuIHdzbS5nZXRXU0VkaXRNb2RlbChwcm9qZWN0KTsgICAgCi0vLyAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BYnN0cmFjdE9iamVjdFNlbGVjdGlvbkxhdW5jaGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BYnN0cmFjdE9iamVjdFNlbGVjdGlvbkxhdW5jaGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwMGNjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjAgICAxMzU5MTIgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSBpbXBsZW1lbnRzIElPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlIHsKLQotCXB1YmxpYyBpbnQgbGF1bmNoKFNoZWxsIHNoZWxsKSB7CQkKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pIHsKLQkJIC8vICBzdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLQkJIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkgewotCQkgLy8gIHN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCSAvLyAgc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFNlbGVjdGlvbkRpc3BsYXlhYmxlU3RyaW5nKCkKLQl7Ci0JCSAvLyAgc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0JCXJldHVybiAiIjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoU3RyaW5nIHMpIHsKLQkJLy8gc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0JCXJldHVybiB0cnVlOwotCX0gIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWRkSGFuZGxlckRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0FkZEhhbmRsZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1YWEzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWRkSGFuZGxlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQwNCAxMzQ5MTMgICBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUgICAgICAgCi0gKiAyMDA2MDUyOSAgIDE0MzUxOCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLkRpYWxvZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQWRkSGFuZGxlckRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVPbl87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc011bHRpcGxlU2VydmljZXNfOwotICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIHNlbGVjdGVkUG9ydE5hbWU7Ci0gIAotICBwcml2YXRlIFRleHQgY2xhc3NOYW1lVGV4dDsKLSAgcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotICBwcml2YXRlIENvbWJvIHBvcnROYW1lQ29tYm87Ci0gIAotICAvLyAtLS0tVE9PTFRJUFMgU2VjdGlvbi0tLS0KLSAgLyogQ09OVEVYVF9JRCBBSERMMDAwMSBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9URVhUX0hBTkRMRVJfTkFNRSAgPSAiQUhETDAwMDEiOyAvLyROT04tTkxTLTEkCi0gIAotICAvKiBDT05URVhUX0lEIEFIREwwMDAyIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1RFWFRfSEFORExFUl9DTEFTUyAgPSAiQUhETDAwMDIiOyAvLyROT04tTkxTLTEkCi0gIAotICAvKiBDT05URVhUX0lEIEFIREwwMDAxIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1RFWFRfSEFORExFUl9QT1JUICA9ICJBSERMMDAwMyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgcHJpdmF0ZSBCdXR0b24gYmVhbkNsYXNzQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAzIGZvciB0aGUgQmVhbiBDbGFzcyBCcm93c2UgYnV0dG9uIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSA9ICJQQkNMMDAwMyI7Ci0gIAotICBwdWJsaWMgQWRkSGFuZGxlckRpYWxvZyggU2hlbGwgc2hlbGwsIGJvb2xlYW4gaXNDbGllbnRIYW5kbGVyKQotICB7Ci0gICAgc3VwZXIoc2hlbGwpOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgaXNDbGllbnRfID0gaXNDbGllbnRIYW5kbGVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIENvbXBvc2l0ZSBjb21wID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICBwYXJlbnQuZ2V0U2hlbGwoKS5wYWNrKCk7Ci0gICAgcmV0dXJuIGNvbXA7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICB2YWxpZGF0ZU9uXyA9IGZhbHNlOwotICAgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKHBsdWdpbklkXyk7Ci0gICAgCi0gICAgU2hlbGwgdGhpc1NoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgaWYgKHRoaXNTaGVsbCA9PSBudWxsKSB7Ci0gICAgICB0aGlzU2hlbGwgPSBjcmVhdGVTaGVsbCgpOwotICAgIH0KLSAgICB0aGlzU2hlbGwuc2V0VGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuRElBTE9HX1RJVExFX1dTX0FERF9IQU5ETEVSKTsKLSAgICAKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOyAgICAKLSAgICAKLSAgICBDb21wb3NpdGUgc291cmNlTG9jYXRpb25Db21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlLCAzKTsKLSAgICAKLSAgICBjbGFzc05hbWVUZXh0ID0gdWlVdGlscy5jcmVhdGVUZXh0KHNvdXJjZUxvY2F0aW9uQ29tcCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1RFWFRfSEFORExFUl9DTEFTUywgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfVEVYVF9IQU5ETEVSX0NMQVNTLCBJTkZPUE9QX1RFWFRfSEFORExFUl9DTEFTUywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIGNsYXNzTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSx0aGlzKTsKLSAgICAKLSAgICBiZWFuQ2xhc3NCcm93c2VCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBzb3VyY2VMb2NhdGlvbkNvbXAsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5CVVRUT05fQlJPV1NFX0NMQVNTRVMsCi0gICAgCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFICk7Ci0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlQnJvd3NlQ2xhc3NlcygpOyAgCi0gICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgCi0gICAgbmFtZVRleHQgPSB1aVV0aWxzLmNyZWF0ZVRleHQoc291cmNlTG9jYXRpb25Db21wLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfVEVYVF9IQU5ETEVSX05BTUUsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1RFWFRfSEFORExFUl9OQU1FLCBJTkZPUE9QX1RFWFRfSEFORExFUl9OQU1FLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotICAgIG5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIAotICAgIC8vIGR1bW15IGxhYmVsIGZvciBjb2x1bW4gMy4KLSAgICBuZXcgTGFiZWwoIHNvdXJjZUxvY2F0aW9uQ29tcCwgU1dULk5PTkUgKTsKLSAgICAKLSAgICBpZiAoIWlzQ2xpZW50XyAmJiAhaXNNdWx0aXBsZVNlcnZpY2VzXyl7Ci0gICAgICBwb3J0TmFtZUNvbWJvID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXAsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9URVhUX0hBTkRMRVJfUE9SVCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQsIElORk9QT1BfVEVYVF9IQU5ETEVSX1BPUlQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0gICAgICBwb3J0TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgICAgCi0gICAgICAvLyBkdW1teSBsYWJlbCBmb3IgY29sdW1uIDMuCi0gICAgICBuZXcgTGFiZWwoIHNvdXJjZUxvY2F0aW9uQ29tcCwgU1dULk5PTkUgKTsKLSAgICB9Ci0gICAgdmFsaWRhdGVPbl8gPSB0cnVlOwotICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZUNsYXNzZXMoKQotICB7Ci0gICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotICAgIElUeXBlIGl0eXBlID0gRGlhbG9nVXRpbHMuYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoc2hlbGwsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSwgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkpOwotICAgIAotICAgIGlmKCBpdHlwZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBjbGFzc05hbWVUZXh0LnNldFRleHQoaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICBpZiAoIXZhbGlkYXRlT25fKQotICAgICAgcmV0dXJuOwotICAgIGlmIChjbGFzc05hbWVUZXh0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlQ2xhc3NOYW1lVGV4dEV2ZW50KCk7Ci0gICAgICB2YWxpZGF0ZVRleHRGaWVsZEVudHJpZXMoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG5hbWVUZXh0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlTmFtZVRleHRFdmVudCgpOwotICAgICAgdmFsaWRhdGVUZXh0RmllbGRFbnRyaWVzKCk7ICAgICAgCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwb3J0TmFtZUNvbWJvID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlUG9ydE5hbWVUZXh0RXZlbnQoKTsKLSAgICAgIHZhbGlkYXRlVGV4dEZpZWxkRW50cmllcygpOyAgICAgIAotICAgICAgcmV0dXJuOwotICAgIH0gICAgCi0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQ2xhc3NOYW1lVGV4dEV2ZW50KCl7Ci0gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgaWYgKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLmphdmEiKSAhPSAtMSl7Ci0gICAgICBuYW1lVGV4dC5zZXRUZXh0KGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgbmFtZVRleHQuc2V0VGV4dChjbGFzc05hbWUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpewotICAgICAgbmFtZVRleHQuc2V0VGV4dChjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKzEsIGNsYXNzTmFtZS5sZW5ndGgoKSkpOwotICAgIH0KLSAgICBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlTmFtZVRleHRFdmVudCgpIHsKLSAgIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7IAotCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVQb3J0TmFtZVRleHRFdmVudCgpewotICAgIHNlbGVjdGVkUG9ydE5hbWUgPSBwb3J0TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGRpc2FibGVPS0J1dHRvbigpIHsKLSAgICBpZiAoZ2V0QnV0dG9uKDApICE9IG51bGwpCi0gICAgICBnZXRCdXR0b24oMCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlT0tCdXR0b24oKSB7Ci0gICAgaWYgKGdldEJ1dHRvbigwKSAhPSBudWxsKQotICAgICAgZ2V0QnV0dG9uKDApLnNldEVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRleHRGaWVsZEVudHJpZXMoKXsKLSAgCWlmIChjbGFzc05hbWVUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKXsKLSAgCQlkaXNhYmxlT0tCdXR0b24oKTsKLSAgCQlyZXR1cm47Ci0gIAl9Ci0gIAlpZiAobmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscygiIikpewotICAJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCXJldHVybjsKLSAgCX0KLSAgCWlmICghaXNDbGllbnRfICYmICFpc011bHRpcGxlU2VydmljZXNfKXsKLSAgCQlpZiAocG9ydE5hbWVDb21iby5nZXRUZXh0KCkhPW51bGwgJiYgcG9ydE5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKCIiKSl7Ci0gIAkJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCQlyZXR1cm47Ci0gIAkJfQotICAJCWVsc2UgaWYgKHBvcnROYW1lQ29tYm8uZ2V0VGV4dCgpPT1udWxsKSB7Ci0gIAkJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCQlyZXR1cm47Ci0gIAkJfQotICAJfQotICAJCi0gIAllbmFibGVPS0J1dHRvbigpOwotICAJCi0JCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXNzTmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgIGlmIChjbGFzc05hbWUubGFzdEluZGV4T2YoIi5qYXZhIikgIT0gLTEpewotICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLSAgfQotICAvKioKLSAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY2xhc3NOYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9ydE5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgIHJldHVybiBzZWxlY3RlZFBvcnROYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcG9ydE5hbWUgVGhlIHBvcnROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lcyhTdHJpbmdbXSBwb3J0TmFtZXMpIHsKLSAgICBwb3J0TmFtZUNvbWJvLnNldEl0ZW1zKHBvcnROYW1lcyk7Ci0gICAgcG9ydE5hbWVDb21iby5zZWxlY3QoMCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzTXVsdGlwbGVTZXJ2aWNlcyhib29sZWFuIGlzTXVsdGlwbGVTZXJ2aWNlcyl7Ci0gICAgdGhpcy5pc011bHRpcGxlU2VydmljZXNfID0gaXNNdWx0aXBsZVNlcnZpY2VzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2hlY2tXU0RMVmFsaWRhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DaGVja1dTRExWYWxpZGF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTYyZDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DaGVja1dTRExWYWxpZGF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyMCAgIDEyMDcxNCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LlZhbGlkYXRlV1NETEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBDaGVja1dTRExWYWxpZGF0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17CSAgCi0JCi0JcHVibGljIENoZWNrV1NETFZhbGlkYXRpb25Db21tYW5kICgpIHsKLQl9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIAotICAgIElKb2JNYW5hZ2VyICAgIGpvYk1hbmFnZXIgICAgID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpOwotCSAgSm9iW10gICAgICAgICAgam9icyAgICAgICAgICAgPSBqb2JNYW5hZ2VyLmZpbmQoIFZhbGlkYXRlV1NETEpvYi5WQUxJREFURV9XU0RMX0pPQl9GQU1JTFkgKTsKLQkgIFZhbGlkYXRlV1NETEpvYiBleGlzdGluZ1ZhbGlkYXRlV1NETEpvYiA9IG51bGw7Ci0JICAKLQkgIGlmKCBqb2JzLmxlbmd0aCA+IDAgKQotCSAgewotCQkgIGZvciAoaW50IGk9MDsgaTxqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkgIGV4aXN0aW5nVmFsaWRhdGVXU0RMSm9iID0gKFZhbGlkYXRlV1NETEpvYilqb2JzW2ldOwotCQkJICAKLQkJCSAgaWYgKGV4aXN0aW5nVmFsaWRhdGVXU0RMSm9iLmdldFN0YXRlKCkgIT0gSm9iLk5PTkUpIHsgCi0JCQkJICBpZiAoaWdub3JlV1NETFZhbGlkYXRpb24oZW52KSkgewotCQkJCQkgIC8vIGlmIGRvbid0IHdhbnQgdG8gd2FpdCBmb3IgdmFsaWRhdGlvbiwgY2FuY2VsIGV4aXN0aW5nIHZhbGlkYXRpb24gam9iCi0JCQkJCSAgZXhpc3RpbmdWYWxpZGF0ZVdTRExKb2IuY2FuY2VsKCk7Ci0JCQkJCSAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJICB9IGVsc2UgewotCQkJCQkgIC8vIFNldHRpbmcgdGhlIGVycm9yIHN0cmluZyB0byBhbiBlbXB0eSBzdHJpbmcgc28gdGhhdCB0aGUgY29tbWFuZCBlbmdpbmUgd291bGQgbm90Ci0JCQkJCSAgLy8gcG9wLXVwIGFub3RoZXIgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSB1c2VyIGRlY2lkZWQgdG8gd2FpdCBmb3IgV1NETCB2YWxpZGF0aW9uLgotCQkJCQkgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggIiIgKTsKLQkJCQkgIH0KLQkJCSAgfQotCQkgIH0KLQkgIH0KLQkgIAotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JICAKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZVdTRExWYWxpZGF0aW9uKElFbnZpcm9ubWVudCBlbnYpIHsKLQkgIGlmICghV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXYWl0Rm9yV1NETFZhbGlkYXRpb25Db250ZXh0KCkuZ2V0UGVyc2lzdGVudFdhaXRGb3JXU0RMVmFsaWRhdGlvbigpKSAKLQkJICByZXR1cm4gdHJ1ZTsgLy8gZG8gbm90IHdhbnQgdG8gd2FpdCBmb3IgV1NETCB2YWxpZGF0aW9uLCBpLmUuIElnbm9yZSBhbGwKLQkJICAKLQkJLy8gZ2l2ZSBhIHdhcm5pbmcgbWVzc2FnZSB3aXRoIHRoZSBvcHRpb25zIHRvIHN0b3AsIGlnbm9yZSB0aGlzIG9uZSwgb3IKLQkJLy8gaWdub3JlIGFsbCBjb21pbmcgbWVzc2FnZXMKLQkJSVN0YXR1cyBzdGF0dXNfID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlNUSUxMX1ZBTElEQVRJTkdfV1NETCApOwotCQkvLyBhZGRpbmcgYWxsIG1lc3NhZ2VzIGZyb20gV1NJIEluY29tcGxpYW5jZXMKLQotCQlDaG9pY2UgaWdub3JlQ2hvaWNlID0gbmV3IENob2ljZSgnQycsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5DQU5DRUxfVkFMSURBVElPTl9MQUJFTCwgCi0JCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkNBTkNFTF9WQUxJREFUSU9OX0RFU0NSSVBUSU9OKTsKLQkJQ2hvaWNlIGlnbm9yZUFsbENob2ljZSA9IG5ldyBDaG9pY2UoJ0EnLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuQ0FOQ0VMX0FMTF9WQUxJREFUSU9OX0xBQkVMLCAKLQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuQ0FOQ0VMX0FMTF9WQUxJREFUSU9OX0RFU0NSSVBUSU9OKTsKLQkJQ2hvaWNlIGNhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ1cnLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuV0FJVF9WQUxJREFUSU9OX0xBQkVMLCAKLQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuV0FJVF9WQUxJREFUSU9OX0RFU0NSSVBUSU9OKTsKLQotCQlDaG9pY2UgcmVzdWx0ID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzXywKLQkJCQluZXcgQ2hvaWNlW10geyBpZ25vcmVDaG9pY2UsIGlnbm9yZUFsbENob2ljZSwgY2FuY2VsQ2hvaWNlIH0pOwotCi0JCS8vIGlmIHRoZSB1c2VyIGNsb3NlcyB0aGUgbWVzc2FnZSBib3ggb3Igc2VsZWN0cyBpZ25vcmUgY29udGludWUKLQkJaWYgKHJlc3VsdCA9PSBudWxsCi0JCQkJfHwgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhpZ25vcmVDaG9pY2UuZ2V0TGFiZWwoKSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gaWYgdGhlIHVzZXIgc2VsZWN0cyBpZ25vcmUgYWxsLCBjaGFuZ2UgdGhlIHByZWZlcmVuY2UKLQkJfSBlbHNlIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoaWdub3JlQWxsQ2hvaWNlLmdldExhYmVsKCkpKSB7Ci0JCQkvLyB1cGRhdGUgaWdub3JlIFdTREwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlCi0JCQlXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdhaXRGb3JXU0RMVmFsaWRhdGlvbkNvbnRleHQoKS5zZXRXYWl0Rm9yV1NETFZhbGlkYXRpb24oZmFsc2UpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gaWYgdGhlIHVzZXIgc2VsZWN0cyB0byBjYW5jZWwgLCBkbyBub3QgY29udGludWUgd2l0aCB0aGUgY29tbWFuZAotCQllbHNlIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoY2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2EzNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQwNCAxMzQ5MTMgICBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmNvbXBvbmVudGNvcmUudXRpbC5BcHBDbGllbnRBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5IYW5kbGVyU2VydmljZVJlZkhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotLyoqCi0gKiBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kCi0gKgotICogSW5pdGlhbGl6ZSBhbmQgbG9hZCB0aGUgaGFuZGxlcnMgZGF0YQotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kIHsKLQotICBwcml2YXRlIFdlYlNlcnZpY2VzTWFuYWdlciB3ZWJTZXJ2aWNlc01hbmFnZXJfOwotCi0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0gIAotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUmVmTmFtZV8gPSBudWxsOwotICAKLSAgcHJpdmF0ZSBMaXN0IHdzU2VydmljZVJlZnNfOwotICAKLSAgcHJpdmF0ZSBIYW5kbGVyU2VydmljZVJlZkhvbGRlcltdIGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JTdGF0dXNNc2dfID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIGlzTXVsdGlwbGVTZWxlY3Rpb25fOwotICAKLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsgICAgCi0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgd2ViU2VydmljZXNNYW5hZ2VyXyA9IFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCi0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVEFTS19FWENFUFRFRCApOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKT4xKXsKLSAgICAgIHN0YXR1cyA9IHByb2Nlc3NNdWx0aXBsZUhhbmRsZXJzKCk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHN0YXR1cyA9IHByb2Nlc3NIYW5kbGVycygpOwotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBGb3IgcHJvY2Vzc2luZyBoYW5kbGVycwotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyBwcm9jZXNzSGFuZGxlcnMoKSB7Ci0gICAgdHJ5IHsKLQotICAgICAgQ29sbGVjdGlvbiBzZWxlY3RlZFNlcnZpY2VSZWZzID0gZ2V0V1NTZXJ2aWNlUmVmc0Zyb21TZWxlY3Rpb24oKTsgLy8gZ2V0IGluaXRpYWwgc2VsZWN0aW9uIHZhbHVlcwotICAgICAgaWYgKHNlbGVjdGVkU2VydmljZVJlZnM9PW51bGwgfHwgc2VsZWN0ZWRTZXJ2aWNlUmVmcy5pc0VtcHR5KCkpewotICAgICAgICAvL3JlcG9ydCBubyBXZWIgc2VydmljZSBjbGllbnQgaXMgYXZhaWxhYmxlCi0gICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9XRUJfU0VSVklDRV9DTElFTlRTX05PVF9GT1VORCk7Ci0gICAgICB9Ci0gICAgICB3c1NlcnZpY2VSZWZzXyA9IHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0QWxsV29ya3NwYWNlU2VydmljZVJlZnMoKTsgCi0KLSAgICAgIGlmICh3c1NlcnZpY2VSZWZzXyAhPSBudWxsKSB7Ci0gICAgICAgIGludCBudW1iZXJPZlNlcnZpY2VSZWZzID0gd3NTZXJ2aWNlUmVmc18uc2l6ZSgpOwotICAgICAgICBoYW5kbGVyU2VydmljZVJlZkhvbGRlcl8gPSBuZXcgSGFuZGxlclNlcnZpY2VSZWZIb2xkZXJbbnVtYmVyT2ZTZXJ2aWNlUmVmc107Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU2VydmljZVJlZnM7IGkrKykgewotICAgICAgICAgIFNlcnZpY2VSZWYgd3NTZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHdzU2VydmljZVJlZnNfLmdldChpKTsKLSAgICAgICAgICBWZWN0b3IgaGFuZGxlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgTGlzdCB3c0hhbmRsZXJzID0gd3NTZXJ2aWNlUmVmLmdldEhhbmRsZXJzKCk7Ci0gICAgICAKLSAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdzSGFuZGxlcnMuc2l6ZSgpOyBrKyspIHsKLQotICAgICAgICAgICAgSGFuZGxlciB3c0hhbmRsZXIgPSAoSGFuZGxlcikgd3NIYW5kbGVycy5nZXQoayk7Ci0KLSAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaGFuZGxlckl0ZW0gPSBuZXcgSGFuZGxlclRhYmxlSXRlbSgpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlcih3c0hhbmRsZXIpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlck5hbWUod3NIYW5kbGVyLmdldEhhbmRsZXJOYW1lKCkpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlckNsYXNzTmFtZSh3c0hhbmRsZXIuZ2V0SGFuZGxlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldFdzRGVzY1JlZih3c1NlcnZpY2VSZWYpOwotCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlckl0ZW0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBTdHJpbmcgd3NTZXJ2aWNlUmVmTmFtZSA9IHdzU2VydmljZVJlZi5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotICAgICAgICAgIGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyX1tpXSA9IG5ldyBIYW5kbGVyU2VydmljZVJlZkhvbGRlcigpOwotICAgICAgICAgIGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyX1tpXS5zZXRIYW5kbGVyTGlzdChoYW5kbGVycyk7Ci0gICAgICAgICAgaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfW2ldLnNldFNlcnZpY2VSZWYod3NTZXJ2aWNlUmVmKTsKLSAgICAgICAgICBoYW5kbGVyU2VydmljZVJlZkhvbGRlcl9baV0uc2V0U2VydmljZVJlZk5hbWUod3NTZXJ2aWNlUmVmTmFtZSk7Ci0gICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQsIGUpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIHByb2Nlc3NNdWx0aXBsZUhhbmRsZXJzKCl7Ci0gICAgICBTZXJ2aWNlUmVmW10gc2VydmljZVJlZnMgPSBnZXRTZXJ2aWNlUmVmcygpOwotICAgICAgaWYgKGVycm9yU3RhdHVzTXNnXyAhPSBudWxsKXsKLSAgICAgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoZXJyb3JTdGF0dXNNc2dfKTsKLSAgICAgIH0KLSAgICAgIGlzTXVsdGlwbGVTZWxlY3Rpb25fID0gdHJ1ZTsKLSAgICAgIAotICAgICAgaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfID0gbmV3IEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyW3NlcnZpY2VSZWZzLmxlbmd0aF07Ci0gICAgICBWZWN0b3IgaGFuZGxlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlUmVmcy5sZW5ndGg7aSsrKXsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZWZOYW1lID0gc2VydmljZVJlZnNbaV0uZ2V0U2VydmljZVJlZk5hbWUoKTsKLSAgICAgICAgaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfW2ldID0gbmV3IEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyKCk7Ci0gICAgICAgIGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyX1tpXS5zZXRIYW5kbGVyTGlzdChoYW5kbGVycyk7Ci0gICAgICAgIGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyX1tpXS5zZXRTZXJ2aWNlUmVmTmFtZShyZWZOYW1lKTsKLSAgICAgICAgaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfW2ldLnNldFNlcnZpY2VSZWYoc2VydmljZVJlZnNbaV0pOwotICAgICAgfQotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7ICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzR2VuU2tlbGV0b25FbmFibGVkXy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEdlblNrZWxldG9uRW5hYmxlZCgpIHsKLSAgICBpZiAoaXNNdWx0aXBsZVNlbGVjdGlvbl8pCi0gICAgICByZXR1cm4gZmFsc2U7ICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VSZWZOYW1lKCkgewotICAgIHJldHVybiB0aGlzLnNlcnZpY2VSZWZOYW1lXzsKLSAgfQotCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRDbGllbnRQcm9qZWN0KCkgewotICAgIHJldHVybiBwcm9qZWN0XzsKLSAgfQotICAKLSAgcHJpdmF0ZSBTZXJ2aWNlUmVmW10gZ2V0U2VydmljZVJlZnMoKXsKLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRTZWwgPSBnZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0gICAgICBTZXJ2aWNlUmVmW10gc2VydmljZVJlZnMgPSBuZXcgU2VydmljZVJlZltpbml0U2VsLnNpemUoKV07Ci0gICAgICBJdGVyYXRvciBpdGVyID0gaW5pdFNlbC5pdGVyYXRvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8aW5pdFNlbC5zaXplKCk7aSsrKSB7Ci0gICAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKXsKLSAgICAgICAgICAgICAgc2VydmljZVJlZnNbaV0gPSAoU2VydmljZVJlZilvYmo7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgIGVycm9yU3RhdHVzTXNnXyA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfSU5WQUxJRF9NVUxUSVBMRV9TRVJWSUNFX1NFTEVDVDsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHNlcnZpY2VSZWZzOwotfQotCi0gIHByaXZhdGUgQ29sbGVjdGlvbiBnZXRXU1NlcnZpY2VSZWZzRnJvbVNlbGVjdGlvbigpIHsKLQotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRTZWwgPSBnZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0gICAgaWYgKGluaXRTZWwgIT0gbnVsbCAmJiBpbml0U2VsLnNpemUoKSA9PSAxKSB7Ci0gICAgICBPYmplY3Qgb2JqID0gaW5pdFNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIFNlcnZpY2VSZWYgc2VydmljZVJlZiA9IG51bGw7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgU2VydmljZVJlZikgewotICAgICAgICAvLyBDbGllbnQgU2VydmljZVJlZgotICAgICAgICBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIG9iajsKLSAgICAgICAgc2VydmljZVJlZk5hbWVfID0gc2VydmljZVJlZi5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotICAgICAgICBwcm9qZWN0XyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzZXJ2aWNlUmVmKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHsKLSAgICAgICAgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSB3c25ndCA9IChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSBvYmo7Ci0gICAgICAgIHNlcnZpY2VSZWYgPSB3c25ndC5nZXRTZXJ2aWNlUmVmKCk7Ci0gICAgICAgIHNlcnZpY2VSZWZOYW1lXyA9IHNlcnZpY2VSZWYuZ2V0U2VydmljZVJlZk5hbWUoKTsKLSAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZVJlZik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJRmlsZSl7Ci0gICAgICAgICAgUmVzb3VyY2UgcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKChJRmlsZSlvYmosIHRydWUpOwotICAgICAgICAgIENvbGxlY3Rpb24gc2VydmljZVJlZnMgPSBudWxsOwotICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlc1Jlc291cmNlKSB7Ci0gICAgICAgICAgICAgIC8vIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBmb3IgSjJFRSAxLjMKLSAgICAgICAgICAgICAgV2ViU2VydmljZXNSZXNvdXJjZSB3c1JlcyA9IChXZWJTZXJ2aWNlc1Jlc291cmNlKXJlczsKLSAgICAgICAgICAgICAgc2VydmljZVJlZnMgPSB3c1Jlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpLmdldFNlcnZpY2VSZWZzKCk7Ci0gICAgICAgICAgICAgIGlmICghc2VydmljZVJlZnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZVJlZiByZWYgPSAoU2VydmljZVJlZikoKExpc3Qpc2VydmljZVJlZnMpLmdldCgwKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlUmVmTmFtZV8gPSByZWYuZ2V0U2VydmljZVJlZk5hbWUoKTsKLSAgICAgICAgICAgICAgICBwcm9qZWN0XyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChyZWYpOwotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVmczsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIGlmKHJlcyBpbnN0YW5jZW9mIFdlYkFwcFJlc291cmNlKXsKLSAgICAgICAgICAgICAgICAgIC8vIHdlYi54bWwgZm9yIEoyRUUgMS40Ci0gICAgICAgICAgICAgICAgICBXZWJBcHBSZXNvdXJjZSB3ZWJBcHBSZXMgPSAoV2ViQXBwUmVzb3VyY2UpcmVzOwotICAgICAgICAgICAgICAgICAgc2VydmljZVJlZnMgPSB3ZWJBcHBSZXMuZ2V0V2ViQXBwKCkuZ2V0U2VydmljZVJlZnMoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBFSkJSZXNvdXJjZSl7Ci0gICAgICAgICAgICAgICAgICBFSkJSZXNvdXJjZSBlamJSZXMgPSAoRUpCUmVzb3VyY2UpcmVzOwotICAgICAgICAgICAgICAgICAgc2VydmljZVJlZnMgPSB3ZWJTZXJ2aWNlc01hbmFnZXJfLmdldFNlcnZpY2VSZWZzKGVqYlJlcy5nZXRFSkJKYXIoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSl7Ci0gICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIGFwcENsaWVudFJlcyA9IChBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlKXJlczsKLSAgICAgICAgICAgICAgICAgIHNlcnZpY2VSZWZzID0gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRTZXJ2aWNlUmVmcyhhcHBDbGllbnRSZXMuZ2V0QXBwbGljYXRpb25DbGllbnQoKSk7Ly9hcHBDbGllbnRSZXMuZ2V0QXBwbGljYXRpb25DbGllbnQoKS5nZXRTZXJ2aWNlUmVmcygpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChzZXJ2aWNlUmVmcyE9bnVsbCAmJiBzZXJ2aWNlUmVmcy5zaXplKCk+MCkgewotICAgICAgICAgICAgICAgICAgU2VydmljZVJlZiByZWYgPSAoU2VydmljZVJlZikoKExpc3Qpc2VydmljZVJlZnMpLmdldCgwKTsKLSAgICAgICAgICAgICAgICAgIHNlcnZpY2VSZWZOYW1lXyA9IHJlZi5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotICAgICAgICAgICAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVmKTsgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZWZzOyAgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgZm9yIG9idGFpbmluZyBhbGwgdGhlIHNlcnZpY2VSZWZzIGZyb20gdGhlIHByb2plY3QsIGdpdmVuIHRoYXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0gICAgICAvLyB3YXMgZnJvbSB0aGUgSjJFRSB2aWV3IChTZXJ2aWNlUmVmIG9yIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpLCBpdCB3aWxsIHNlbGVjdCB0aGUgcmlnaHQgc2VydmljZVJlZgotICAgICAgaWYgKHByb2plY3RfPT1udWxsKXsKLSAgICAgICAgcHJvamVjdF8gPSBnZXRQcm9qZWN0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAocHJvamVjdF89PW51bGwpewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0gICAgIAotICAgICAgIAotICAgICAgaWYgKEoyRUVVdGlscy5pc1dlYkNvbXBvbmVudChwcm9qZWN0XykpIHsKLSAgICAgICAgV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdF8pOyAgICAgICAgICAKLSAgICAgICAgICB3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQodmMpOwotICAgICAgICAgIGlmICh3ZWJFZGl0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIHdlYkVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0gICAgICAgICAgICBpZiAod2ViQXBwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0U2VydmljZVJlZnMod2ViQXBwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseXsKLSAgICAgICAgICBpZih3ZWJFZGl0IT1udWxsKQotICAgICAgICAgICAgd2ViRWRpdC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEoyRUVVdGlscy5pc0VKQkNvbXBvbmVudChwcm9qZWN0XykpewotCi0gICAgCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdF8pOwotICAgIAlFSkJKYXIgZWpiSmFyID0gRUpCQXJ0aWZhY3RFZGl0VXRpbGl0aWVzLmdldEVKQkphcih2Yyk7Ci0gICAgICAgIGlmIChlamJKYXIhPW51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlc01hbmFnZXJfLmdldFNlcnZpY2VSZWZzKGVqYkphcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEoyRUVVdGlscy5pc0FwcENsaWVudENvbXBvbmVudChwcm9qZWN0XykpewotICAgIAkgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdF8pOwotICAgIAkgIEFwcENsaWVudEFydGlmYWN0RWRpdCBhcHBFZGl0ID0gbnVsbDsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBhcHBFZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQodmMpOwotICAgICAgICAgIGlmIChhcHBFZGl0IT1udWxsKXsKLSAgICAgICAgICAgICAgQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gYXBwRWRpdC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotICAgICAgICAgICAgICBpZiAoYXBwQ2xpZW50ICE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRTZXJ2aWNlUmVmcyhhcHBDbGllbnQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBmaW5hbGx5ewotICAgICAgICAgICAgICBpZihhcHBFZGl0IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGFwcEVkaXQuZGlzcG9zZSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0V3NTZXJ2aWNlUmVmcygpewotICAgIHJldHVybiB0aGlzLndzU2VydmljZVJlZnNfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNNdWx0aXBsZVNlbGVjdGlvbigpewotICAgICAgcmV0dXJuIHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBIYW5kbGVyU2VydmljZVJlZkhvbGRlcltdIGdldEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyKCl7Ci0gICAgcmV0dXJuIHRoaXMuaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2VlMThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDQgMTM0OTEzICAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1ICAKLSAqIDIwMDYwNTE3ICAgMTQyMzM5IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmNvbXBvbmVudGNvcmUudXRpbC5BcHBDbGllbnRBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmNvbXBvbmVudGNvcmUudXRpbC5FSkJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkphdmFNT0ZVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uSGFuZGxlclNlcnZpY2VSZWZIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLS8qCi0gKiBQcm92aWRlIGEgd2F5IHRvIGV4dGVybmFsaXplIHRoZSBlZGl0ZWQgZmllbGRzIGFuZCBjcmVhdGUgbmV3IGhhbmRsZXJzCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLQotICBwcml2YXRlIEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyW10gaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfOwotICBwcml2YXRlIEhhc2h0YWJsZSBvbGRXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV87Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc011bHRpcGxlU2VsZWN0aW9uXzsKLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIHRyeSB7Ci0gICAgICAKLSAgICAgIGlmIChpc011bHRpcGxlU2VsZWN0aW9uXykgewotICAgICAgICBpZiAoaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfICE9IG51bGwpIHsKLSAgICAgICAgICAvLyBhZGQgbmV3IGhhbmRsZXIgdG8gaW50ZXJuYWwgbW9kZWwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVyU2VydmljZVJlZkhvbGRlcl8ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyX1tpXS5hZGRIYW5kbGVyVG9TZXJ2aWNlUmVmKCk7Ci0gICAgICAgICAgICBzYXZlRWRpdE1vZGVsKGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyX1tpXS5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBvbGRXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfICE9IG51bGwpIHsKLSAgCi0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVyU2VydmljZVJlZkhvbGRlcl8ubGVuZ3RoOyBpKyspIHsKLSAgCi0gICAgICAgICAgICBTZXJ2aWNlUmVmIHdzU2VydmljZVJlZiA9aGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfW2ldLmdldFNlcnZpY2VSZWYoKTsgCi0gICAgICAgIAotICAgICAgICAgICAgTGlzdCB3c0hhbmRsZXJzID0gd3NTZXJ2aWNlUmVmLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgICBvbGRXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5wdXQod3NTZXJ2aWNlUmVmLCB3c0hhbmRsZXJzKTsKLSAgICAgICAgICAgIG5ld1dTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLnB1dCh3c1NlcnZpY2VSZWYsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgfQotICAKLSAgICAgICAgICAvL0VudW1lcmF0aW9uIGUgPSBoYW5kbGVyc1RhYmxlXy5rZXlzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaj0wO2o8aGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfLmxlbmd0aDtqKyspIHsKLQotICAgICAgICAgICAgTGlzdCBoYW5kbGVyVGFibGVJdGVtc18gPSAgaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfW2pdLmdldEhhbmRsZXJMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlclRhYmxlSXRlbXNfICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgLy8gZm9ybSBIYW5kbGVyIHRhYmxlcwotICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJUYWJsZUl0ZW1zXy5zaXplKCk7IGkrKykgewotICAKLSAgICAgICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKSBoYW5kbGVyVGFibGVJdGVtc18uZ2V0KGkpOwotICAgICAgICAgICAgICAgIE9iamVjdCB3c01vZGVsUmVmID0gaHRpLmdldFdzRGVzY1JlZigpOwotICAgICAgICAgICAgICAgIGlmICh3c01vZGVsUmVmICE9IG51bGwgJiYgd3NNb2RlbFJlZiBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpIHsKLSAgICAgICAgICAgICAgICAgIFNlcnZpY2VSZWYgd3NSZWYgPSAoU2VydmljZVJlZikgd3NNb2RlbFJlZjsKLSAgCi0gICAgICAgICAgICAgICAgICBPYmplY3QgaGFuZGxlciA9IGh0aS5nZXRIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsICYmIGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsb25lIGl0Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgY2xvbmVkSGFuZGxlciA9IChIYW5kbGVyKSBFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KChIYW5kbGVyKSBoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgKChMaXN0KSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5nZXQod3NSZWYpKS5hZGQoY2xvbmVkSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGl0Ci0gICAgICAgICAgICAgICAgICAgIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSB3c0NsaWVudEZhY3RvcnkgPSBuZXcgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbCgpOwotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIG5ld0hhbmRsZXIgPSB3c0NsaWVudEZhY3RvcnkuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgICBuZXdIYW5kbGVyLnNldEhhbmRsZXJOYW1lKGh0aS5nZXRIYW5kbGVyTmFtZSgpKTsKLSAgCi0gICAgICAgICAgICAgICAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBKYXZhTU9GVXRpbHMuZ2V0SmF2YUNsYXNzKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCksIHByb2plY3RfKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgbmV3SGFuZGxlci5zZXRIYW5kbGVyQ2xhc3MoamF2YUNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAKLSAgICAgICAgICAgICAgICAgICAgKChMaXN0KSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5nZXQod3NSZWYpKS5hZGQobmV3SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gIAotICAgICAgICAgICAgICAgIH0KLSAgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gCi0gICAgICAgICAgLy8gYWRkIGhhbmRsZXJzIHRvIHBvcnRzCi0gICAgICAgICAgYWRkSGFuZGxlcnNUb1NlcnZpY2VSZWZzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHNhdmUgdGhlIGFydGlmYWN0IGVkaXQgbW9kZWwKLSAgICAgICAgc2F2ZUVkaXRNb2RlbCgpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgCi0gICAgewotICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVEFTS19FWENFUFRFRCwgZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzYXZlRWRpdE1vZGVsKCkgewotICAgICAgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICAgIGlmIChKMkVFVXRpbHMuaXNXZWJDb21wb25lbnQocHJvamVjdF8pKSB7Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3RFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvcldyaXRlKHByb2plY3RfKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoSjJFRVV0aWxzLmlzRUpCQ29tcG9uZW50KHByb2plY3RfKSl7Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3RFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvcldyaXRlKHByb2plY3RfKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChKMkVFVXRpbHMuaXNBcHBDbGllbnRDb21wb25lbnQocHJvamVjdF8pKXsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdEVkaXQgPSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdF8pOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZpbmFsbHkgewotICAgICAgICAgIGlmIChhcnRpZmFjdEVkaXQhPW51bGwpIHsKLSAgICAgICAgICAgICAgYXJ0aWZhY3RFZGl0LnNhdmUobnVsbCk7Ci0gICAgICAgICAgICAgIGFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2F2ZUVkaXRNb2RlbChJUHJvamVjdCBwcm9qZWN0KXsKLQkgIHByb2plY3RfID0gcHJvamVjdDsKLQkgIHNhdmVFZGl0TW9kZWwoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFkZEhhbmRsZXJzVG9TZXJ2aWNlUmVmcygpIHsKLSAgICB0cnkgewotICAgICAgRW51bWVyYXRpb24gcmVmc1RvSGFuZGxlcnMgPSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5rZXlzKCk7Ci0gICAgICB3aGlsZSAocmVmc1RvSGFuZGxlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHJlZnNUb0hhbmRsZXJzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlUmVmICE9IG51bGwpIHsKLSAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gKExpc3QpIG5ld1dTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLmdldChzZXJ2aWNlUmVmKTsKLSAgICAgICAgICBMaXN0IG1vZGVsSGFuZGxlcnMgPSAoTGlzdCkgb2xkV1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8uZ2V0KHNlcnZpY2VSZWYpOwotICAgICAgICAgIG1vZGVsSGFuZGxlcnMuY2xlYXIoKTsKLSAgICAgICAgICBtb2RlbEhhbmRsZXJzLmFkZEFsbChoYW5kbGVycyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgdGhpcy5wcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBbiBhcnJheSBvZiBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJzCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyKEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyW10gaGFuZGxlckhvbGRlcnMpewotICAgIHRoaXMuaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfID0gaGFuZGxlckhvbGRlcnM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzTXVsdGlwbGVTZWxlY3Rpb24oYm9vbGVhbiBpc011bGl0cGxlU2VsZWN0aW9uKSB7Ci0gICAgdGhpcy5pc011bHRpcGxlU2VsZWN0aW9uXyA9IGlzTXVsaXRwbGVTZWxlY3Rpb247Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGRkMDM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDcgICAxMzU0MTUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQxNyAgIDEzNjM5MC8xMzYxNTkgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA0MTMgICAxMzU1ODEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQyMCAgIDEzNTkxMiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQyNCAgIDEzODA1MiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA0MjUgICAxMzc4MzEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDUwOSAgIDExOTI5NiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA2MTIgICAxNDUwODEgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNjA3MjUgICAxNDkzNTEgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIERlbGV0ZWQgc2VydmljZSBkZWZpbml0aW9uIGtlZXBzIHJlYXBwZWFyaW5nCi0gKiAyMDA2MDgwMyAgIDE1MjQ4NiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgVHlwaW5nIFdTREwgaW4gU2VydmljZSBkZWZpbml0aW9uIGZpZWxkIGlzIHZlcnkgc2xvdwotICogMjAwNjA4MTcgICAxNDAwMTcgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIGxvbmdlciBwcm9qZWN0IG9yIHNlcnZlci9ydW50aW1lIHN0cmluZ3MgZG8gbm90IHJlc2l6ZSB3aXphcmQKLSAqIDIwMDYwODI1ICAgMTM1NTcwIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIFVSTCBub3QgZGlzcGxheWVkIHByb3Blcmx5IG9uIGZpcnN0IHBhZ2UKLSAqIDIwMDYwODI5ICAgMTU1NDQxIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCB3ZWIgc2VydmljZSB3aXphcmQgaGFuZ3MgZHVyaW5nIHJlc2l6ZQotICogMjAwNjA5MDcgICAxNTYyMTEgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFNlbGVjdGluZyBzZXJ2aWNlIGRlZmluaXRpb24gaW52YWxpZGF0ZWQgcHJvamVjdCBjb25maWcgd2hlbiBjcmVhdGluZyB3ZWIgc2VydmljZSBqYXZhIGNsaWVudAotICogMjAwNjEyMTIgICAxNTk5MTEgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIGNoYW5naW5nIHNlcnZpY2UgZGVmaW5pdGlvbiByZXNldHMgc29tZSBjb25maWd1cmF0aW9uIGZpZWxkcwotICogMjAwNjAxMjUgICAxNTk5MTEga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4sIFJlbW92ZSB1bnVzZWQgbWV0aG9kIGFuZCBpbXBvcnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV1NETFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhLkVjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlZhbGlkYXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlBhZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFdpemFyZFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciBpbXBsZW1lbnRzIFJ1bm5hYmxlCi17ICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCBjbGllbnRXaWRnZXRfOwotICBwcml2YXRlIEJ1dHRvbiBvdmVyd3JpdGVCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiBtb25pdG9yU2VydmljZV87Ci0KLSAgcHJpdmF0ZSBUZXh0IHNlcnZpY2VJbXBsXzsKLSAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uXzsKLSAgcHJpdmF0ZSBXU0RMU2VsZWN0aW9uRGlhbG9nIHdzZGxEaWFsb2dfOwotICBwcml2YXRlIFN0cmluZyBjb21wb25lbnROYW1lXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSV87Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyXzsKLSAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0XzsKLSAgCi0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXJfOwotICBwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG9iamVjdE1vZGlmeUxpc3RlbmVyXyA7Ci0gIHByaXZhdGUgaW50IHZhbGlkYXRpb25TdGF0ZV87Ci0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZE9iamVjdFNlbGVjdGlvbl8gPSB0cnVlOwotICBwcml2YXRlIFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyIHdzZGxWYWxpZGF0b3JXaWRnZXRfOwotCi0gIHByaXZhdGUgVGltZXIgdGltZXJfID0gbnVsbDsKLSAgCi0gIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMjAgZm9yIHRoZSBTZXJ2aWNlIEltcGxlbWVuYXRpb24gdGV4dCBmaWVsZCBvZiB0aGUgU2NlbmFyaW8gUGFnZSAqLwotCSBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1dTV1NDRU5fVEVYVF9TRVJWSUNFX0lNUEwgPSAiV1NXU0NFTjAwMjAiOwotCi0gIAotICAvKiBDT05URVhUX0lEIFdTV1NDRU4wMDE0IGZvciB0aGUgbW9uaXRvciBzZXJ2aWNlIGNoZWNrYm94IG9mIHRoZSBTY2VuYXJpbyBwYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfV1NXU0NFTl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UgPSAiV1NXU0NFTjAwMTQiOwkKLSAgLyogQ09OVEVYVF9JRCBXU1dTQ0VOMDAzMCBmb3IgdGhlIE92ZXJ3cml0ZSBGaWxlcyBjaGVja2JveCBvZiB0aGUgU2NlbmFyaW8gUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1dTV1NDRU5fQ0hFQ0tCT1hfT1ZFUldSSVRFID0gIldTV1NDRU4wMDMwIjsJCi0gIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMDEgZm9yIHRoZSBTY2VuYXJpbyBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfV1NXU0NFTl9QQUdFID0gIldTV1NDRU4wMDAxIjsKLSAgCi0gIC8qKgotICAgKiBSdW4gdGhpcyBDbGllbnRXaXphcmRXaWRnZXQsIHdoaWNoIHZhbGlkYXRlcyB0aGUgZW50cnkgZmllbGQgdmFsdWVzLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgIHZhbGlkYXRpb25TdGF0ZV8gPSBWYWxpZGF0aW9uVXRpbHMuVkFMSURBVEVfQUxMOwotCSAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwotCSAgaWYgKHZhbGlkT2JqZWN0U2VsZWN0aW9uXykKLQkJICBjYWxsT2JqZWN0VHJhbnNmb3JtYXRpb24ocHJvamVjdF8sIAotCQkJCSAgd3NkbFZhbGlkYXRvcldpZGdldF8uZ2V0Q29tcG9uZW50TmFtZSgpLCAKLQkJCQkgIHdzZGxWYWxpZGF0b3JXaWRnZXRfLmdldFdzZGxVUkkoKSk7CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIFVJVXRpbHMgICAgICB1dGlscyAgICA9IG5ldyBVSVV0aWxzKCBwbHVnaW5JZCApOwotICAgIHV0aWxzLmNyZWF0ZUluZm9Qb3AocGFyZW50LCBJTkZPUE9QX1dTV1NDRU5fUEFHRSk7Ci0KLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsKLQl2YWxpZGF0aW9uU3RhdGVfID0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX0FMTDsKLSAgCS8vIENyZWF0ZSB0ZXh0IGZpZWxkIGFuZCBicm93c2UgZm9yIHNlcnZpY2Ugc2VsZWN0aW9uCi0gIAlDb21wb3NpdGUgdHlwZUNvbXBvc2l0ZSA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDMpOwotCXNlcnZpY2VJbXBsXyA9IHV0aWxzLmNyZWF0ZVRleHQodHlwZUNvbXBvc2l0ZSwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1dFQlNFUlZJQ0VERUYsIAotCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9URVhUX0lNUEwsCi0JCQlJTkZPUE9QX1dTV1NDRU5fVEVYVF9TRVJWSUNFX0lNUEwsIFNXVC5MRUZUIHwgU1dULkJPUkRFUiApOwotCQotCW9iamVjdE1vZGlmeUxpc3RlbmVyXyA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChzZXJ2aWNlSW1wbF8uZ2V0VGV4dCgpLmluZGV4T2YoJzonKSA+IDApIHsKLQkJICAgICAgICB0aW1lcl8gPSBUaW1lci5uZXdJbnN0YW5jZSh0aW1lcl8sIERpc3BsYXkuZ2V0Q3VycmVudCgpLCBDbGllbnRXaXphcmRXaWRnZXQudGhpcyk7Ci0JCSAgICAgICAgdGltZXJfLnN0YXJ0VGltZXIoKTsKLQkJCX0KLQkJICAgIGVsc2UKLQkJICAgICAgICBydW4oKTsKLQkJfQotCX07Ci0JCi0Jc2VydmljZUltcGxfLmFkZE1vZGlmeUxpc3RlbmVyKG9iamVjdE1vZGlmeUxpc3RlbmVyXyk7Ci0JCi0JYnJvd3NlQnV0dG9uXyA9IHV0aWxzLmNyZWF0ZVB1c2hCdXR0b24odHlwZUNvbXBvc2l0ZSwKLQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5CVVRUT05fQlJPV1NFLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX0JVVFRPTl9CUk9XU0VfSU1QTCwgbnVsbCk7Ci0JCi0JSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIHdzZGxEaWFsb2dfID0gbmV3IFdTRExTZWxlY3Rpb25EaWFsb2cod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIAotCQkgIAkJCQkJCW5ldyBQYWdlSW5mbyhDb25zdW1wdGlvblVJTWVzc2FnZXMuRElBTE9HX1RJVElMRV9TRVJWSUNFX0lNUExfU0VMRUNUSU9OLCAiIiwgCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotCQkgIAkJCQkJCXsJCi0JCSAgCQkJCQkJCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkgIAkJCQkJCQl7CSAgCQkJCQkJIAotCQkgIAkJCQkJCQkgICByZXR1cm4gbmV3IFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyKCk7Ci0JCSAgCQkJCQkJCX0KLQkJICAJCQkJCQl9KSk7CQkKLQlicm93c2VCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBXU0RMQnJvd3NlTGlzdGVuZXIoKSk7Ci0JCi0JdXRpbHMuY3JlYXRlSG9yaXpvbnRhbFNlcGFyYXRvcihwYXJlbnQsIDEpOwotCQotCUNvbXBvc2l0ZSBjbGllbnRDb21wb3NpdGUgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSwgMCwgMCApOwotCQotICAgIGNsaWVudFdpZGdldF8gPSBuZXcgV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQodHJ1ZSk7Ci0gICAgY2xpZW50V2lkZ2V0Xy5hZGRDb250cm9scyhjbGllbnRDb21wb3NpdGUgLCBzdGF0dXNMaXN0ZW5lciApOwotICAgCi0gICAgLy8gIENyZWF0ZSB0ZXN0IHNlcnZpY2UgY2hlY2sgYm94LgotICAgIENvbXBvc2l0ZSBidXR0b25Hcm91cCA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShjbGllbnRDb21wb3NpdGUsMSk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIG1vbml0b3Igc2VydmljZSBjaGVjayBib3guCi0gICAgbW9uaXRvclNlcnZpY2VfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goYnV0dG9uR3JvdXAgLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuQ0hFQ0tCT1hfTU9OSVRPUl9XRUJTRVJWSUNFLAotICAgIAkJCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFLAotICAgIAkJCQkJCQkJCUlORk9QT1BfV1NXU0NFTl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UpOwotCi0gICAgLy9zaG93IG92ZXJ3cml0ZSBpZiBpdCBpcyBlbmFibGVkIGluIHRoZSBwcmVmZXJlbmNlcwotICAgIGlmIChnZXRSZXNvdXJjZUNvbnRleHQoKS5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKSB7Ci0JCUxhYmVsIHByZWZTZXBhcmF0b3IgPSB1dGlscy5jcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKHBhcmVudCwgMSk7Ci0JCXByZWZTZXBhcmF0b3Iuc2V0VGV4dCgiRmlsZSBPcHRpb25zIik7Ci0JCUNvbXBvc2l0ZSBwcmVmQnV0dG9uUGFuZWwgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJb3ZlcndyaXRlQnV0dG9uXyA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KHByZWZCdXR0b25QYW5lbCwKLQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuQ0hFQ0tCT1hfT1ZFUldSSVRFX0ZJTEVTLCAKLQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX0JVVFRPTl9PVkVSV1JJVEVfRklMRVMsIAotCQkJCUlORk9QT1BfV1NXU0NFTl9DSEVDS0JPWF9PVkVSV1JJVEUpOwotCQlvdmVyd3JpdGVCdXR0b25fLnNldFNlbGVjdGlvbihnZXRSZXNvdXJjZUNvbnRleHQoKQotCQkJCS5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKTsKLQl9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dCggUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgKQotICB7ICAgIAotCSAgcmVzb3VyY2VDb250ZXh0XyA9IGNvbnRleHQ7Ci0gIH0KLSAgIAotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpCi0gIHsgICAKLSAgICBpZiAocmVzb3VyY2VDb250ZXh0XyA9PSBudWxsKSB7Ci0JCXJlc291cmNlQ29udGV4dF8gPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0JfQotCXJldHVybiByZXNvdXJjZUNvbnRleHRfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewkgIAotICAgIGNsaWVudFdpZGdldF8uc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoIGlkcyApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotCSAgY2xpZW50V2lkZ2V0Xy5zZXRDbGllbnRQcm9qZWN0TmFtZShuYW1lKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLQkgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50RWFyUHJvamVjdE5hbWUobmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudENvbXBvbmVudFR5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLQkgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50Q29tcG9uZW50VHlwZShuYW1lKTsJICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50TmVlZEVBUihib29sZWFuIGIpCi0gIHsKLQkgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50TmVlZEVBUihiKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRSdW50aW1lSWQoKQotICB7Ci0JICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnRSdW50aW1lSWQoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRFYXJQcm9qZWN0TmFtZSgpCi0gIHsKLQkgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldENsaWVudEVhclByb2plY3ROYW1lKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdE5hbWUoKQotICB7Ci0JICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnRQcm9qZWN0TmFtZSgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudENvbXBvbmVudFR5cGUoKQotICB7Ci0JICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnRDb21wb25lbnRUeXBlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldENsaWVudE5lZWRFQVIoKQotICB7Ci0JICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnROZWVkRUFSKCk7Ci0gIH0KLSAgCi0gcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVVSSShTdHJpbmcgdXJpKQotIHsKLSAgICAgd2ViU2VydmljZVVSSV8gPSB1cmk7ICAgIAotIH0KLSAKLXB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewkJCi0KLQlpZiAod2ViU2VydmljZVVSSV8gPT0gbnVsbCB8fCB3ZWJTZXJ2aWNlVVJJXy5sZW5ndGgoKSA9PSAwKQotCQlyZXR1cm47Ci0KLQlzZXJ2aWNlSW1wbF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIob2JqZWN0TW9kaWZ5TGlzdGVuZXJfKTsKLQlzZXJ2aWNlSW1wbF8uc2V0VGV4dCh3ZWJTZXJ2aWNlVVJJXyk7ICAgIAkgCi0Jc2VydmljZUltcGxfLmFkZE1vZGlmeUxpc3RlbmVyKG9iamVjdE1vZGlmeUxpc3RlbmVyXyk7Ci0JCQotCUVjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG5ldyBFY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIoKTsKLQl3ZWJTZXJ2aWNlVVJJXyA9IChTdHJpbmcpIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh3ZWJTZXJ2aWNlVVJJXyk7ICAgIAotfQotIAotIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSB7Ci0gICAgIHByb2plY3RfID0gcHJvamVjdDsKLSB9Ci0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgIGNvbXBvbmVudE5hbWVfID0gbmFtZTsgICAgICAKLSAgfSAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVVSSSgpCi0gIHsKLSAgICAgIHJldHVybiB3ZWJTZXJ2aWNlVVJJXyA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLQkgIHJldHVybiBnZXRXZWJTZXJ2aWNlVVJJKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgICAgcmV0dXJuIHByb2plY3RfOwotICB9Ci0gIAotICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkKLSAgIHsKLSAgICAgICByZXR1cm4gY29tcG9uZW50TmFtZV8gOwotICAgfQotICAKLSAgIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0JewotCQlyZXR1cm4gV1NETFBhcnNlckZhY3RvcnkuZ2V0V1NETFBhcnNlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIpCi0JewotCQlwYXJzZXJfID0gZ2V0V2ViU2VydmljZXNQYXJzZXIoKTsKLQkJY2xpZW50V2lkZ2V0Xy5zZXRXZWJTZXJ2aWNlc1BhcnNlcihwYXJzZXJfKTsKLQl9Ci0gICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5zdGFsbENsaWVudCggQm9vbGVhbiBpbnN0YWxsKQotICB7Ci0gICAgY2xpZW50V2lkZ2V0Xy5zZXRJbnN0YWxsQ2xpZW50KCBpbnN0YWxsICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldEluc3RhbGxDbGllbnQoKQotICB7Ci0JICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRJbnN0YWxsQ2xpZW50KCk7ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldFRlc3RTZXJ2aWNlKCkKLSAgewotCSAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0VGVzdENsaWVudCgpOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIEJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgICBjbGllbnRXaWRnZXRfLnNldFRlc3RDbGllbnQodmFsdWUpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0Q2xpZW50R2VuZXJhdGlvbigpCi0gIHsKLQkgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldENsaWVudEdlbmVyYXRpb24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50R2VuZXJhdGlvbihpbnQgdmFsdWUpCi0gIHsKLQkgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50R2VuZXJhdGlvbih2YWx1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldERldmVsb3BDbGllbnQoYm9vbGVhbiBkZXZlbG9wKSB7Ci0JCWNsaWVudFdpZGdldF8uc2V0RGV2ZWxvcENsaWVudCggZGV2ZWxvcCApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERldmVsb3BDbGllbnQoKSB7CQkKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0RGV2ZWxvcENsaWVudCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBc3NlbWJsZUNsaWVudChib29sZWFuIGFzc2VtYmxlKSB7Ci0JCWNsaWVudFdpZGdldF8uc2V0QXNzZW1ibGVDbGllbnQoIGFzc2VtYmxlICk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXNzZW1ibGVDbGllbnQoKSB7CQkKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0QXNzZW1ibGVDbGllbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVwbG95Q2xpZW50KGJvb2xlYW4gZGVwbG95KSB7Ci0JCWNsaWVudFdpZGdldF8uc2V0RGVwbG95Q2xpZW50KCBkZXBsb3kgKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3lDbGllbnQoKSB7CQkKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0RGVwbG95Q2xpZW50KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0Q2xpZW50KEJvb2xlYW4gc3RhcnQpIHsKLQkJY2xpZW50V2lkZ2V0Xy5zZXRTdGFydENsaWVudCggc3RhcnQgKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTdGFydENsaWVudCgpIHsJCi0JCXJldHVybiBjbGllbnRXaWRnZXRfLmdldFN0YXJ0Q2xpZW50KCk7Ci0JfQotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0TW9uaXRvclNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKG1vbml0b3JTZXJ2aWNlXy5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JTZXJ2aWNlKEJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBtb25pdG9yU2VydmljZV8uc2V0U2VsZWN0aW9uKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJCQkKLQkJdmFsaWRPYmplY3RTZWxlY3Rpb25fID0gZmFsc2U7CS8vIGFzc3VtZSBmYWxzZSBhdCBmaXJzdAotCi0JCUlTdGF0dXMgbWlzc2luZ0ZpZWxkU3RhdHVzID0gY2hlY2tNaXNzaW5nRmllbGRTdGF0dXMoKTsKLQkJaWYgKG1pc3NpbmdGaWVsZFN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXJldHVybiBtaXNzaW5nRmllbGRTdGF0dXM7Ci0JCX0KLQotCQlJU3RhdHVzIGludmFsaWRTZXJ2aWNlSW1wbFN0YXR1cyA9IGNoZWNrU2VydmljZUltcGxUZXh0U3RhdHVzKCk7Ci0JCWlmIChpbnZhbGlkU2VydmljZUltcGxTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlyZXR1cm4gaW52YWxpZFNlcnZpY2VJbXBsU3RhdHVzOwotCQl9Ci0KLQkJSVN0YXR1cyBwb3NzaWJsZUVycm9yU3RhdHVzID0gY2hlY2tFcnJvclN0YXR1cygpOwotCQlpZiAocG9zc2libGVFcnJvclN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXJldHVybiBwb3NzaWJsZUVycm9yU3RhdHVzOwotCQl9Ci0KLQkJSVN0YXR1cyBwb3NzaWJsZVdhcm5pbmdTdGF0dXMgPSBjaGVja1dhcm5pbmdTdGF0dXMoKTsKLQkJaWYgKHBvc3NpYmxlV2FybmluZ1N0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgewotCQkJcmV0dXJuIHBvc3NpYmxlV2FybmluZ1N0YXR1czsKLQkJfQotCi0JCS8vIGlmIG5vIGVycm9ycyBvciB3YXJuaW5ncyB3ZXJlIGZvdW5kLCBjbGVhciB0aGUgdmFsaWRhdGlvbiBzdGF0ZS4KLQkJdmFsaWRhdGlvblN0YXRlXyA9IFZhbGlkYXRpb25VdGlscy5WQUxJREFURV9OT05FOwotCQljbGllbnRXaWRnZXRfLnNldFZhbGlkYXRpb25TdGF0ZShWYWxpZGF0aW9uVXRpbHMuVkFMSURBVEVfTk9ORSk7Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyBjaGVja01pc3NpbmdGaWVsZFN0YXR1cygpIHsKLQotCQlpZiAodmFsaWRhdGlvblN0YXRlXyA9PSBWYWxpZGF0aW9uVXRpbHMuVkFMSURBVEVfQUxMKSB7Ci0JCQlpZiAoc2VydmljZUltcGxfLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX05PX1NFUlZJQ0VfU0VMRUNUSU9OLCBuZXcgU3RyaW5nW117Q29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1dFQlNFUlZJQ0VJTVBMfSkpOwotCQkJfQotCQl9Ci0JCQotCQlJU3RhdHVzIGNsaWVudE1pc3NpbmdGaWVsZHNTdGF0dXMgPSBjbGllbnRXaWRnZXRfLmNoZWNrTWlzc2luZ0ZpZWxkU3RhdHVzKCk7Ci0JCWlmIChjbGllbnRNaXNzaW5nRmllbGRzU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJcmV0dXJuIGNsaWVudE1pc3NpbmdGaWVsZHNTdGF0dXM7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGNoZWNrRXJyb3JTdGF0dXMoKSB7Ci0JCUlTdGF0dXMgY2xpZW50U2lkZUVycm9yU3RhdHVzID0gY2xpZW50V2lkZ2V0Xy5jaGVja0Vycm9yU3RhdHVzKCk7Ci0JCWlmIChjbGllbnRTaWRlRXJyb3JTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlyZXR1cm4gY2xpZW50U2lkZUVycm9yU3RhdHVzOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja1dhcm5pbmdTdGF0dXMoKSB7Ci0JCUlTdGF0dXMgY2xpZW50V2FybmluZ1N0YXR1cyA9IGNsaWVudFdpZGdldF8uY2hlY2tXYXJuaW5nU3RhdHVzKCk7Ci0JCWlmIChjbGllbnRXYXJuaW5nU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlyZXR1cm4gY2xpZW50V2FybmluZ1N0YXR1czsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9CQotCQotCS8qY2FsbCB2YWxpZGF0aW9uIGNvZGUgaW4gdGhlIG9iamVjdCBzZWxlY3Rpb24gd2lkZ2V0IHRvIGVuc3VyZQotCSBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgc2VydmljZUltcGxfIGZpZWxkIGFyZSB2YWxpZCovCi0JcHJpdmF0ZSBJU3RhdHVzIGNoZWNrU2VydmljZUltcGxUZXh0U3RhdHVzKCkgewotCQkKLQkJU3RyaW5nIGZpZWxkVGV4dCA9IHNlcnZpY2VJbXBsXy5nZXRUZXh0KCkudHJpbSgpOwotCi0JCWlmICh3c2RsVmFsaWRhdG9yV2lkZ2V0XyA9PSBudWxsKQotCQkJd3NkbFZhbGlkYXRvcldpZGdldF8gPSBuZXcgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIoKTsKLQkJCi0JCXZhbGlkT2JqZWN0U2VsZWN0aW9uXyA9IHdzZGxWYWxpZGF0b3JXaWRnZXRfLnZhbGlkYXRlKGZpZWxkVGV4dCk7Ci0JCQkJCi0JCWlmICghdmFsaWRPYmplY3RTZWxlY3Rpb25fKQotCQl7Ci0JCQlyZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19JTlZBTElEX1NFUlZJQ0VfREVGKTsJCQkKLQkJfQkJCi0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNhbGxPYmplY3RUcmFuc2Zvcm1hdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSwKLQkJCVN0cmluZyB3c2RsVVJJKQotCXsKLQkJICAgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQgd3NkbE91dHB1dENvbW1hbmQgPSBuZXcgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQoKTsKLQkJICAgd3NkbE91dHB1dENvbW1hbmQuc2V0Q29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKTsKLQkJICAgd3NkbE91dHB1dENvbW1hbmQuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJICAgd3NkbE91dHB1dENvbW1hbmQuc2V0V3NkbFVSSSh3c2RsVVJJKTsKLQkJICAgd3NkbE91dHB1dENvbW1hbmQuc2V0VGVzdFNlcnZpY2UoZ2V0VGVzdFNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCSAgIHdzZGxPdXRwdXRDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKGdldFdlYlNlcnZpY2VzUGFyc2VyKCkpOwotCQkKLSAgICAgICAgICAgd3NkbE91dHB1dENvbW1hbmQuZXhlY3V0ZShudWxsLCBudWxsKTsKLSAgICAgIAotICAgICAgICAgICBzZXRDb21wb25lbnROYW1lKHdzZGxPdXRwdXRDb21tYW5kLmdldENvbXBvbmVudE5hbWUoKSk7Ci0gICAgICAgICAgIHNldFByb2plY3Qod3NkbE91dHB1dENvbW1hbmQuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgc2V0V2ViU2VydmljZXNQYXJzZXIod3NkbE91dHB1dENvbW1hbmQuZ2V0V2ViU2VydmljZXNQYXJzZXIoKSk7Ci0gICAgICAgICAgIHNldFdlYlNlcnZpY2VVUkkod3NkbE91dHB1dENvbW1hbmQuZ2V0V3NkbFVSSSgpKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIC8vIGJ1ZyAxNTk5MTE6IG91ciBzdGFydGluZyBwb2ludCBpcyBhIHdzZGwsIHdlIHNob3VsZCBub3QgbmVlZCB0bwotICAgICAgICAgICAvLyByZWZyZXNoIHRoZSBydW50aW1lIGV2ZXJ5dGltZSB0aGUgdXNlciBzcGVjaWZ5IGEgbmV3IHdzZGwgcGF0aAotICAgICAgICAgICAvLyByZWZyZXNoQ2xpZW50UnVudGltZVNlbGVjdGlvbigpOwotICAgICB9Ci0JCi0gIHByaXZhdGUgY2xhc3MgV1NETEJyb3dzZUxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotCSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0JICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCSAgCi0JCSAgIHdzZGxEaWFsb2dfLnNldENvbXBvbmVudE5hbWUoZ2V0Q29tcG9uZW50TmFtZSgpKTsKLQkJICAgd3NkbERpYWxvZ18uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQkgICB3c2RsRGlhbG9nXy5zZXRXZWJTZXJ2aWNlVVJJKCBzZXJ2aWNlSW1wbF8uZ2V0VGV4dCgpICk7CQkKLQkJICAgCi0JCSAgIGludCByZXN1bHQgPSB3c2RsRGlhbG9nXy5vcGVuKCk7Ci0JCSAgIAotCQkgICBpZiAocmVzdWx0ID09IERpYWxvZy5PSykKLQkJICAgewotCQkJICAgc2VydmljZUltcGxfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG9iamVjdE1vZGlmeUxpc3RlbmVyXyk7Ci0JCQkgICBzZXJ2aWNlSW1wbF8uc2V0VGV4dCh3c2RsRGlhbG9nXy5nZXREaXNwbGF5YWJsZVNlbGVjdGlvblN0cmluZygpKTsKLQkJCSAgIHNlcnZpY2VJbXBsXy5hZGRNb2RpZnlMaXN0ZW5lcihvYmplY3RNb2RpZnlMaXN0ZW5lcl8pOwotCQkJICAgCi0JCQkgICAvLyBjYWxsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kIHRvIGNhcnJ5IG91dCBhbnkgdHJhbnNmb3JtYXRpb24gb24gdGhlIG9iamVjdFNlbGVjdGlvbgotCSAgICAgICAgICAgY2FsbE9iamVjdFRyYW5zZm9ybWF0aW9uKHByb2plY3RfLAotCSAgICAgICAgCQkJd3NkbERpYWxvZ18uZ2V0Q29tcG9uZW50TmFtZSgpLCB3c2RsRGlhbG9nXy5nZXRXZWJTZXJ2aWNlVVJJKCkpOwotCSAgICAgICAgICAgCi0JCSAgICAgICB2YWxpZGF0aW9uU3RhdGVfID0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX0FMTDsKLQkJICAgICAgIGNsaWVudFdpZGdldF8uc2V0VmFsaWRhdGlvblN0YXRlKFZhbGlkYXRpb25VdGlscy5WQUxJREFURV9BTEwpOwotCQkgICAgICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOyAvL3ZhbGlkYXRlIHRoZSBwYWdlCi0JCSAgIH0KLQkgIH0KLQl9Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGFlZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIxICAgMTE5MTExIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA1MjQgICAxNDI2MzUgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNzI4ICAgMTUwNTYwIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDcyOCAgIDE1MTA3OCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsgICAgCi0JcHJpdmF0ZSBpbnQgY2xpZW50R2VuZXJhdGlvbl87Ci0JcHJpdmF0ZSBib29sZWFuIGRldmVsb3BDbGllbnRfOwotCXByaXZhdGUgYm9vbGVhbiBhc3NlbWJsZUNsaWVudF87Ci0JcHJpdmF0ZSBib29sZWFuIGRlcGxveUNsaWVudF87Ci0JcHJpdmF0ZSBib29sZWFuIGluc3RhbGxDbGllbnRfOwotCXByaXZhdGUgYm9vbGVhbiBzdGFydENsaWVudF87Ci0JcHJpdmF0ZSBib29sZWFuIHRlc3RDbGllbnRfOwotCXByaXZhdGUgYm9vbGVhbiBjbGllbnRPbmx5XyA9IGZhbHNlOwotCSAgCi0JcHVibGljIENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kKCkgewotCX0KLQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xpZW50T25seSAgU2V0IHRvIHRydWUgZm9yIGlmIGNhbGxlZCBmcm9tIENsaWVudFdpZGdldFdpemFyZAotCSAqLwotCXB1YmxpYyBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZChib29sZWFuIGNsaWVudE9ubHkpIHsKLQkJY2xpZW50T25seV8gPSBjbGllbnRPbmx5OwotCX0KLQkKLSAgcHVibGljIEJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRUZXN0V2ViU2VydmljZSgpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldE1vbml0b3JTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0TW9uaXRvcldlYlNlcnZpY2UoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEluc3RhbGxDbGllbnQoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbGxDbGllbnRfOyAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UnVuVGVzdENsaWVudCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U2NlbmFyaW9Db250ZXh0KCkuaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkgOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0Q2xpZW50R2VuZXJhdGlvbigpCi0gIHsKLQkgIHJldHVybiBjbGllbnRHZW5lcmF0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkKLSAgeyAKLSAgICByZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpOwotICB9Ci0gIAotICAvLyBDdXJyZW50IFNjZW5hcmlvQ29udGV4dCBpcyB1c2VkIHRvIGRlZmF1bHQgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZC4gIFRoZSAKLSAgLy8gcHJvcGVydGllcyBpbiBTY2VuYXJpb0NvbnRleHQgYXJlIG1hcHBlZCBpbmRpdmlkdWFsLiAgVGhlcmVmb3JlLCBTY2VuYXJpb0NvbnRleHQKLSAgLy8gc2hvdWxkIG5vdCBhbHNvIGJlIG1hcHBlZC4KLSAgcHJvdGVjdGVkIFNjZW5hcmlvQ29udGV4dCBnZXRTY2VuYXJpb0NvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKTsKLSAgfQotICAKLSAgLy8gVE9ETyBTZXQgY2xpZW50IG5hbWUgZGVmYXVsdHMgaGVyZS4gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgLy8gcnNrcmVnCi0JCS8vV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgICAgID0gZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKTsKLSAgICAvL1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZSAgPSByZWdpc3RyeS5nZXRBbGxDbGllbnRSdW50aW1lcygpWzBdOwotCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0QWxsUnVudGltZXNGb3JDbGllbnRTaWRlKClbMF07Ci0gICAgLy9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciAgID0gcmVnaXN0cnkuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpWzBdOwotICAgICAgICBTdHJpbmdbXSBzZXJ2ZXJzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpOwotICAgICAgICBTdHJpbmcgc2VydmVyID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aD4wKQotICAgICAgICB7Ci0JCSAgc2VydmVyICAgPSBzZXJ2ZXJzWzBdOwotICAgICAgICB9Ci0gICAgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgICAgICAgICByZXN1bHQgICA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotCQkvLyByc2tyZWcKLSAgICAKLSAgICByZXN1bHQuc2V0VHlwZUlkKCB0eXBlICk7Ci0gICAgcmVzdWx0LnNldFJ1bnRpbWVJZCggcnVudGltZSApOwotICAgIHJlc3VsdC5zZXRTZXJ2ZXJJZCggc2VydmVyICk7IAotICAgIAotICAgIHJldHVybiByZXN1bHQ7ICAKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgewotCSAgZGVmYXVsdENsaWVudFNjYWxlKCk7Ci0JICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZGVmYXVsdENsaWVudFNjYWxlKCkgewotCSAgY2xpZW50R2VuZXJhdGlvbl8gPSBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRHZW5lcmF0ZUNsaWVudCgpOwotCSAgCi0JICBpZiAoY2xpZW50T25seV8gJiYgY2xpZW50R2VuZXJhdGlvbl8gPT0gU2NlbmFyaW9Db250ZXh0LldTX05PTkUpIHsKLQkJICBkZXZlbG9wQ2xpZW50XyA9IHRydWU7Ci0JCSAgYXNzZW1ibGVDbGllbnRfID0gdHJ1ZTsKLQkJICBkZXBsb3lDbGllbnRfID0gdHJ1ZTsKLQkJICBjbGllbnRHZW5lcmF0aW9uXyA9IFNjZW5hcmlvQ29udGV4dC5XU19ERVBMT1k7Ci0JICB9IGVsc2UgewotCQkgIGRldmVsb3BDbGllbnRfID0gY2xpZW50R2VuZXJhdGlvbl8gPD0gU2NlbmFyaW9Db250ZXh0LldTX0RFVkVMT1A7Ci0JCSAgYXNzZW1ibGVDbGllbnRfID0gY2xpZW50R2VuZXJhdGlvbl8gPD0gU2NlbmFyaW9Db250ZXh0LldTX0FTU0VNQkxFOwotCQkgIGRlcGxveUNsaWVudF8gPSBjbGllbnRHZW5lcmF0aW9uXyA8PSBTY2VuYXJpb0NvbnRleHQuV1NfREVQTE9ZOwotCSAgfQotCSAgaW5zdGFsbENsaWVudF8gPSBjbGllbnRHZW5lcmF0aW9uXyA8PSBTY2VuYXJpb0NvbnRleHQuV1NfSU5TVEFMTDsKLQkgIHN0YXJ0Q2xpZW50XyA9IGNsaWVudEdlbmVyYXRpb25fIDw9IFNjZW5hcmlvQ29udGV4dC5XU19TVEFSVDsKLQkgIHRlc3RDbGllbnRfID0gY2xpZW50R2VuZXJhdGlvbl8gPD0gU2NlbmFyaW9Db250ZXh0LldTX1RFU1Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldERldmVsb3BDbGllbnQoKSB7Ci0JICByZXR1cm4gZGV2ZWxvcENsaWVudF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEFzc2VtYmxlQ2xpZW50KCkgewotCSAgcmV0dXJuIGFzc2VtYmxlQ2xpZW50XzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0RGVwbG95Q2xpZW50KCkgewotCSAgcmV0dXJuIGRlcGxveUNsaWVudF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0Q2xpZW50KCkgewotCSAgcmV0dXJuIHN0YXJ0Q2xpZW50XzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdENsaWVudCgpIHsKLQkgIHJldHVybiB0ZXN0Q2xpZW50XzsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTUxMWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTI0ICAgMTQyNjM1IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgoteyAgICAKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuIG1vbml0b3JTZXJ2aWNlOwotICBwcml2YXRlIFJlc291cmNlQ29udGV4dCAgIHJlc291cmNlQ29udGV4dF87Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzXzsKLSAgcHJpdmF0ZSBib29sZWFuIGluc3RhbGxDbGllbnRfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSV87Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nIGNvbXBvbmVudE5hbWVfOwotICBwcml2YXRlIGJvb2xlYW4gcnVuVGVzdENsaWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiBkZXZlbG9wQ2xpZW50XzsKLSAgcHJpdmF0ZSBib29sZWFuIGFzc2VtYmxlQ2xpZW50XzsKLSAgcHJpdmF0ZSBib29sZWFuIGRlcGxveUNsaWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiBzdGFydENsaWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiB0ZXN0Q2xpZW50XzsgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFNlcnZpY2VfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIGJvb2xlYW4gdGVzdFNlcnZpY2UgKQotICB7Ci0gICAgdGVzdFNlcnZpY2VfID0gdGVzdFNlcnZpY2U7ICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UnVuVGVzdENsaWVudCgpCi0gIHsKLSAgICByZXR1cm4gcnVuVGVzdENsaWVudF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSdW5UZXN0Q2xpZW50KCBib29sZWFuIHJ1blRlc3RDbGllbnQgKQotICB7Ci0gICAgcnVuVGVzdENsaWVudF8gPSBydW5UZXN0Q2xpZW50OyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluc3RhbGxDbGllbnQoIGJvb2xlYW4gaW5zdGFsbENsaWVudCkKLSAgewotICAgIGluc3RhbGxDbGllbnRfID0gaW5zdGFsbENsaWVudDsgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRJbnN0YWxsQ2xpZW50KCkKLSAgewotCXJldHVybiBpbnN0YWxsQ2xpZW50XzsgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXREZXZlbG9wQ2xpZW50KCkgewotCQlyZXR1cm4gZGV2ZWxvcENsaWVudF87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGV2ZWxvcENsaWVudChib29sZWFuIGRldmVsb3BDbGllbnQpIHsKLQkJdGhpcy5kZXZlbG9wQ2xpZW50XyA9IGRldmVsb3BDbGllbnQ7Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRBc3NlbWJsZUNsaWVudCgpIHsKLQkJcmV0dXJuIGFzc2VtYmxlQ2xpZW50XzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBc3NlbWJsZUNsaWVudChib29sZWFuIGFzc2VtYmxlQ2xpZW50KSB7Ci0JCXRoaXMuYXNzZW1ibGVDbGllbnRfID0gYXNzZW1ibGVDbGllbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldERlcGxveUNsaWVudCgpIHsKLQkJcmV0dXJuIGRlcGxveUNsaWVudF87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95Q2xpZW50KGJvb2xlYW4gZGVwbG95Q2xpZW50KSB7Ci0JCXRoaXMuZGVwbG95Q2xpZW50XyA9IGRlcGxveUNsaWVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRDbGllbnQoKSB7Ci0JCXJldHVybiBzdGFydENsaWVudF87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnRDbGllbnQoYm9vbGVhbiBzdGFydENsaWVudCkgewotCQl0aGlzLnN0YXJ0Q2xpZW50XyA9IHN0YXJ0Q2xpZW50OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRUZXN0Q2xpZW50KCkgewotCQlyZXR1cm4gdGVzdENsaWVudF87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVzdENsaWVudChib29sZWFuIHRlc3RDbGllbnQpIHsKLQkJdGhpcy50ZXN0Q2xpZW50XyA9IHRlc3RDbGllbnQ7Ci0JfQotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbW9uaXRvclNlcnZpY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JTZXJ2aWNlKGJvb2xlYW4gbW9uaXRvclNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLm1vbml0b3JTZXJ2aWNlID0gbW9uaXRvclNlcnZpY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkKLSAgewotICAgIAotICAgIHJldHVybiByZXNvdXJjZUNvbnRleHRfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCBjb250ZXh0ICkKLSAgewotICAgIHJlc291cmNlQ29udGV4dF8gPSBjb250ZXh0OyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsgICAgCi0gICAgcmV0dXJuIGNsaWVudElkc187ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkcyApCi0gIHsKLSAgICBjbGllbnRJZHNfID0gY2xpZW50SWRzOwotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICAgIHJldHVybiB3ZWJTZXJ2aWNlVVJJXyA7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgICAgd2ViU2VydmljZVVSSV8gPSB1cmk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgICAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICAgIHJldHVybiBwcm9qZWN0XzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgICAgY29tcG9uZW50TmFtZV8gPSBuYW1lOwotICB9IAotICAKLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkKLSAgewotICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWVfIDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9Db25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTVjY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDQgMTM0OTEzICAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1ICAgICAgIAotICogMjAwNjA0MjYgICAxMzU2MTQgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5IYW5kbGVyU2VydmljZVJlZkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5IYW5kbGVyVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLS8qKgotICogQ29uZmlnQ2xpZW50SGFuZGxlcnNUcmVlV2lkZ2V0Ci0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLQotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQotICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRfOwotICBwcml2YXRlIFN0cmluZyBvdXRwdXRMb2NhdGlvbl87Ci0gIHByaXZhdGUgQ29tcG9zaXRlIHdlYlNlcnZpY2VSZWZDb21wXzsKLSAgcHJpdmF0ZSBDb21ibyB3ZWJTZXJ2aWNlUmVmQ29tYm9fOwotICBwcml2YXRlIFRleHQgd2ViU2VydmljZURlc2NUZXh0XyA9IG51bGw7Ci0gIHByaXZhdGUgVGFibGUgaGFuZGxlcnNUYWJsZV87Ci0gIHByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXJfOwotICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXzsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgc291cmNlTG9jYXRpb25Db21wXzsKLSAgcHJpdmF0ZSBDb21ibyBzb3VyY2VMb2NhdGlvbkNvbWJvXzsKLQotICBwcml2YXRlIEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyW10gaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfOwotICBwcml2YXRlIEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyIGN1cnJlbnRIU1JIXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcGF0aHNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc011bHRpcGxlU2VsZWN0aW9uXyA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUmVmTmFtZV87Ci0gIHByaXZhdGUgaW50IERFRkFVTFRfQ09MVU1OX1dJRFRIID0gMTUwOwotCi0gIC8vIC0tLS1UT09MVElQUyBTZWN0aW9uLS0tLQotICAvKiBDT05URVhUX0lEIEhETFIwMDAxIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX0hETFJfV1NfSEFORExFUlMgPSAiSERMUjAwMDEiOyAvLyROT04tTkxTLTEkCi0KLSAgLyogQ09OVEVYVF9JRCBIRExSMDAwMiBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9IRExSX0dFTl9TS0VMRVRPTiA9ICJIRExSMDAwMiI7IC8vJE5PTi1OTFMtMSQKLQotICAvKiBDT05URVhUX0lEIEhETFIwMDAzIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX0NPTUJPX1NPVVJDRV9MT0MgPSAiSERMUjAwMDMiOyAvLyROT04tTkxTLTEkCi0KLSAgLyogQ09OVEVYVF9JRCBIRExSMDAwNCBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9XU19DTElFTlRfUkVGID0gIkhETFIwMDA0IjsgLy8kTk9OLU5MUy0xJAotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0KCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotCi0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMocGx1Z2luSWRfKTsKLQotICAgIHBhcmVudF8gPSBwYXJlbnQ7Ci0KLSAgICAvLyBXZWIgc2VydmljZSByZWZlcmVuY2UgY29tYm8KLSAgICB3ZWJTZXJ2aWNlUmVmQ29tcF8gPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnRfLCAyKTsKLQotICAgIENvbXBvc2l0ZSBkaXNwbGF5Q29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50XywgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ3JpZGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBkaXNwbGF5Q29tcC5zZXRMYXlvdXQoZ3JpZGxheW91dCk7Ci0gICAgZGlzcGxheUNvbXAuc2V0TGF5b3V0RGF0YSh1aVV0aWxzLmNyZWF0ZUZpbGxBbGwoKSk7Ci0KLSAgICBmaW5hbCBDb21wb3NpdGUgaGFuZGxlcnNDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoZGlzcGxheUNvbXAsIDEpOwotICAgIEdyaWREYXRhIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8R3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIAotICAgICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotICAgIGhhbmRsZXJzQ29tcC5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLSAgICBoYW5kbGVyc0NvbXAuc2V0U2l6ZSgxMzAsIDYwMCk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbnNDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoZGlzcGxheUNvbXAsIDEpOwotICAgIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgYnV0dG9uc0NvbXAuc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0KLSAgICBUZXh0IGhhbmRsZXJzVGV4dCA9IG5ldyBUZXh0KGhhbmRsZXJzQ29tcCwgU1dULlJFQURfT05MWSk7Ci0gICAgaGFuZGxlcnNUZXh0LnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0hBTkRMRVJTX0NPTkZJRyk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgaGFuZGxlcnNUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgaGFuZGxlcnNUYWJsZV8gPSB1aVV0aWxzLmNyZWF0ZVRhYmxlKGhhbmRsZXJzQ29tcCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfRURJVF9XU19IQU5ETEVSUywgSU5GT1BPUF9IRExSX1dTX0hBTkRMRVJTLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLSAgICBoYW5kbGVyc1RhYmxlXy5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIGhhbmRsZXJzVGFibGVfLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgIC8vIGVtcHR5IHNwYWNlCi0gICAgTGFiZWwgd3NMYWJlbCA9IG5ldyBMYWJlbChidXR0b25zQ29tcCwgU1dULk5PTkUpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHdzTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBCdXR0b24gbW92ZVVwQnV0dG9uID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnNDb21wLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQlVUVE9OX01PVkVfVVAsIG51bGwsIG51bGwpOwotICAgIEdyaWREYXRhIG11R3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBQb2ludCBtdXNpemUgPSBtb3ZlVXBCdXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICBtb3ZlVXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVNb3ZlVXBCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgQnV0dG9uIG1vdmVEb3duQnV0dG9uID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnNDb21wLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQlVUVE9OX01PVkVfRE9XTiwgbnVsbCwgbnVsbCk7Ci0gICAgR3JpZERhdGEgbWRHcmlkZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIFBvaW50IG1kc2l6ZSA9IG1vdmVEb3duQnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgbW92ZURvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVNb3ZlRG93bkJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICAvLyBlbXB0eSBzcGFjZQotICAgIHdzTGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uc0NvbXAsIFNXVC5OT05FKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB3c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgYWRkQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0JVVFRPTl9BREQsIG51bGwsIG51bGwpOwotICAgIEdyaWREYXRhIGFkZEdyaWRkYXRhID0gbmV3IEdyaWREYXRhKCk7IAotICAgIFBvaW50IGFkZFNpemUgPSBhZGRCdXR0b25fLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgYWRkQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZW1vdmVCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnNDb21wLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQlVUVE9OX1JFTU9WRSwgbnVsbCwgbnVsbCk7Ci0gICAgR3JpZERhdGEgcmVtR3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBQb2ludCByZW1TaXplID0gcmVtb3ZlQnV0dG9uXy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgIHJlbW92ZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotICAgIGVuYWJsZVJlbW92ZShmYWxzZSk7Ci0KLSAgICAvLyBzZXQgdGhlIHdpZHRoIHRvIHRoZSBtYXggb2YgdGhlIGJ1dHRvbiBsYWJlbHMKLSAgICBpbnQgd2lkdGhIaW50ID0gMDsKLSAgICBpbnRbXSBzaXplcyA9IG5ldyBpbnRbXXttdXNpemUueCwgbWRzaXplLngsIGFkZFNpemUueCwgcmVtU2l6ZS54LCAxMDB9OwotICAgIGZvcihpbnQgaiA9IDA7IGogPCBzaXplcy5sZW5ndGg7IGorKykgewotICAgIAlpZiAoc2l6ZXNbal0gPiB3aWR0aEhpbnQpCi0gICAgCXdpZHRoSGludCA9IHNpemVzW2pdOwotICAgIH0KLSAgICBtdUdyaWRkYXRhLndpZHRoSGludCA9IHdpZHRoSGludDsKLSAgICBtZEdyaWRkYXRhLndpZHRoSGludCA9IHdpZHRoSGludDsKLSAgICBhZGRHcmlkZGF0YS53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0gICAgcmVtR3JpZGRhdGEud2lkdGhIaW50ID0gd2lkdGhIaW50OwotICAgIAotICAgIG1vdmVVcEJ1dHRvbi5zZXRMYXlvdXREYXRhKG11R3JpZGRhdGEpOwotICAgIG1vdmVEb3duQnV0dG9uLnNldExheW91dERhdGEobWRHcmlkZGF0YSk7Ci0gICAgYWRkQnV0dG9uXy5zZXRMYXlvdXREYXRhKGFkZEdyaWRkYXRhKTsKLSAgICByZW1vdmVCdXR0b25fLnNldExheW91dERhdGEocmVtR3JpZGRhdGEpOwotICAgIAotICAgIC8vIHRhYmxlIHN0dWZmCi0gICAgU3RyaW5nW10gY29sdW1uc18gPSBuZXcgU3RyaW5nW10geyBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfSEFORExFUl9OQU1FLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCTEVfSEFORExFUl9DTEFTU307Ci0KLSAgICBmaW5hbCBUYWJsZUNvbHVtbltdIHRhYmxlQ29scyA9IG5ldyBUYWJsZUNvbHVtbltjb2x1bW5zXy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspIHsKLSAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGhhbmRsZXJzVGFibGVfLCBpKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoY29sdW1uc19baV0pOwotICAgICAgdGFibGVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKERFRkFVTFRfQ09MVU1OX1dJRFRIKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAgIHRhYmxlQ29sc1tpXSA9IHRhYmxlQ29sdW1uOwotICAgIH0KLQotICAgIGhhbmRsZXJzQ29tcC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgIFJlY3RhbmdsZSBhcmVhID0gaGFuZGxlcnNDb21wLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICBQb2ludCBwcmVmZXJyZWRTaXplID0gaGFuZGxlcnNUYWJsZV8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICBpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMipoYW5kbGVyc1RhYmxlXy5nZXRCb3JkZXJXaWR0aCgpLTEwOwotICAgICAgICAgIGlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIGhhbmRsZXJzVGFibGVfLmdldEhlYWRlckhlaWdodCgpKSB7Ci0gICAgICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbiB3aWR0aAotICAgICAgICAgICAgLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotICAgICAgICAgICAgUG9pbnQgdkJhclNpemUgPSBoYW5kbGVyc1RhYmxlXy5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLSAgICAgICAgICAgIHdpZHRoIC09IHZCYXJTaXplLng7Ci0gICAgICAgICAgfQotICAgICAgICAgIFBvaW50IG9sZFNpemUgPSBoYW5kbGVyc1RhYmxlXy5nZXRTaXplKCk7Ci0gICAgICAgICAgaWYgKG9sZFNpemUueCA+IGFyZWEud2lkdGgpIHsKLSAgICAgICAgICAgIC8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zIAotICAgICAgICAgICAgLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0gICAgICAgICAgICAvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLSAgICAgICAgICAgIHRhYmxlQ29sc1swXS5zZXRXaWR0aCh3aWR0aC8yKTsKLSAgICAgICAgICAgIHRhYmxlQ29sc1sxXS5zZXRXaWR0aCh3aWR0aCAtIHRhYmxlQ29sc1swXS5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgIGhhbmRsZXJzVGFibGVfLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZSAKLSAgICAgICAgICAgIC8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0gICAgICAgICAgICAvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLSAgICAgICAgICAgICAgaGFuZGxlcnNUYWJsZV8uc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0gICAgICAgICAgICAgIHRhYmxlQ29sc1swXS5zZXRXaWR0aCh3aWR0aC8yKTsKLSAgICAgICAgICAgICAgdGFibGVDb2xzWzFdLnNldFdpZHRoKHdpZHRoIC0gdGFibGVDb2xzWzBdLmdldFdpZHRoKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7ICAgIAotICAgIAotICAgIHRhYmxlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcihoYW5kbGVyc1RhYmxlXyk7Ci0gICAgQ29udHJvbCBjb250cm9sID0gdGFibGVWaWV3ZXJfLmdldENvbnRyb2woKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgdGFibGVWaWV3ZXJfLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uc18pOwotICAgIHRhYmxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IExpc3RMYWJlbFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGVuYWJsZVJlbW92ZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgIAotICAgIC8vIGdlbiBza2VsZXRvbiBjaGVjayBib3gKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3gocGFyZW50XywgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0JVVFRPTl9HRU5fU0tFTEVUT04sIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04sIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04pOwotICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlR2VuU2tlbGV0b25SYWRpb0J1dHRvbigpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gc291cmNlIGxvY2F0aW9uIGNvbWJvCi0gICAgc291cmNlTG9jYXRpb25Db21wXyA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHBhcmVudF8sIDIpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXBfLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQ09NQk9fU09VUkNFX0xPQywgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQywgSU5GT1BPUF9DT01CT19TT1VSQ0VfTE9DLAotICAgICAgICBTV1QuUkVBRF9PTkxZKTsKLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZVNvdXJjZUxvY2F0aW9uQ29tYm8oZXZ0KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLy8gQ2FsbGVkIGF0IHN0YXJ0Ci0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKHBsdWdpbklkXyk7Ci0KLSAgICAgIC8vIHByb2Nlc3MgZm9yIG11bHRpcGxlIHNlcnZpY2Ugc2VsZWN0aW9uCi0gICAgICBpZiAoaXNNdWx0aXBsZVNlbGVjdGlvbl8pIHsKLSAgICAgICAgd2ViU2VydmljZURlc2NUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCh3ZWJTZXJ2aWNlUmVmQ29tcF8sIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9DT01CT19XU19DTElFTlRfUkVGLCAKLSAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTX0NMSUVOVF9SRUYsIElORk9QT1BfV1NfQ0xJRU5UX1JFRiwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGlmIChoYW5kbGVyU2VydmljZVJlZkhvbGRlcl8hPW51bGwpewotICAgICAgICAgIGN1cnJlbnRIU1JIXyA9IGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyX1swXTsKLSAgICAgICAgICBTdHJpbmcgdGV4dCA9IE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfVEVYVF9OVU1fT0ZfQ0xJRU5UUywgSW50ZWdlci50b1N0cmluZyhoYW5kbGVyU2VydmljZVJlZkhvbGRlcl8ubGVuZ3RoKSk7ICAgICAgICAgIAotICAgICAgICAgIHdlYlNlcnZpY2VEZXNjVGV4dF8uc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgc291cmNlTG9jYXRpb25Db21wXy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgc291cmNlTG9jYXRpb25Db21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgcmVmcmVzaCgpOwotCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgIHdlYlNlcnZpY2VSZWZDb21ib18gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHdlYlNlcnZpY2VSZWZDb21wXywgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0NPTUJPX1dTX0NMSUVOVF9SRUYsIAotICAgICAgICAgICAgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NfQ0xJRU5UX1JFRiwgSU5GT1BPUF9XU19DTElFTlRfUkVGLCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgd2ViU2VydmljZVJlZkNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgICAgIGhhbmRsZVdlYlNlcnZpY2VSZWZDb21ibyhldnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgU3RyaW5nW10gd3NSZWZOYW1lcyA9IEhhbmRsZXJTZXJ2aWNlUmVmSGVscGVyLmdldEFsbFNlcnZpY2VSZWZOYW1lcyhoYW5kbGVyU2VydmljZVJlZkhvbGRlcl8pOyAKLSAgICAgICAgd2ViU2VydmljZVJlZkNvbWJvXy5zZXRJdGVtcyh3c1JlZk5hbWVzKTsKLSAgCi0gICAgICAgIGlmIChoYW5kbGVyU2VydmljZVJlZkhvbGRlcl8ubGVuZ3RoIDwgMSkgewotICAgICAgICAgIHdlYlNlcnZpY2VSZWZDb21ib18uc2VsZWN0KDApOwotICAgICAgICAgIHdlYlNlcnZpY2VSZWZDb21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKHNlcnZpY2VSZWZOYW1lXyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSB3ZWJTZXJ2aWNlUmVmQ29tYm9fLmluZGV4T2Yoc2VydmljZVJlZk5hbWVfKTsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgd2ViU2VydmljZVJlZkNvbWJvXy5zZWxlY3QoaW5kZXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlUmVmQ29tYm9fLnNlbGVjdCgwKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc2V0IGhhbmRsZXIgdGFibGUKLSAgICAgICAgSGFuZGxlclNlcnZpY2VSZWZIb2xkZXIgaHNyaCA9IEhhbmRsZXJTZXJ2aWNlUmVmSGVscGVyLmdldEZvclNlcnZpY2VSZWZOYW1lKGhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyXywgd2ViU2VydmljZVJlZkNvbWJvXy5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoaHNyaCAhPSBudWxsKSB7Ci0gICAgICAgICAgY3VycmVudEhTUkhfID0gaHNyaDsKLSAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gaHNyaC5nZXRIYW5kbGVyTGlzdCgpOwotICAgICAgICAgIHRhYmxlVmlld2VyXy5zZXRJbnB1dChoYW5kbGVycyk7Ci0gICAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc2V0IG91dHB1dCBmb2xkZXIKLSAgICAgICAgc2V0U291cmNlT3V0cHV0TG9jYXRpb24oKTsKLSAgICAgIH0KLSAgICAgIHBhcmVudF8uZ2V0U2hlbGwoKS5zZXRTaXplKDUzMCwgNjUwKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjZ2V0U3RhdHVzKCkKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICBJU3RhdHVzIGZpbmFsU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBpZiAoaXNNdWx0aXBsZVNlbGVjdGlvbl8pCi0gICAgICByZXR1cm4gU3RhdHVzVXRpbHMuaW5mb1N0YXR1cyhDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX01VTFRJUExFX0NMSUVOVFNfQ09ORklHKTsKLSAgICByZXR1cm4gZmluYWxTdGF0dXM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCi0gICAgQWRkSGFuZGxlckRpYWxvZyBkaWFsb2cgPSBuZXcgQWRkSGFuZGxlckRpYWxvZyhwYXJlbnRfLmdldFNoZWxsKCksIHRydWUpOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKCA1MDAsIDIwMCApOwotICAgIAotICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLSAgICAgIFN0cmluZyBuYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBkaWFsb2cuZ2V0Q2xhc3NOYW1lKCk7Ci0KLSAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaGkgPSBuZXcgSGFuZGxlclRhYmxlSXRlbSgpOwotICAgICAgaGkuc2V0SGFuZGxlck5hbWUobmFtZSk7Ci0gICAgICBoaS5zZXRIYW5kbGVyQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAKLSAgICAgIFNlcnZpY2VSZWYgc2VydmljZVJlZiA9IGN1cnJlbnRIU1JIXy5nZXRTZXJ2aWNlUmVmKCk7Ci0gICAgICBoaS5zZXRXc0Rlc2NSZWYoc2VydmljZVJlZik7Ci0gICAgICBjdXJyZW50SFNSSF8uZ2V0SGFuZGxlckxpc3QoKS5hZGQoaGkpOwotICAgIH0KLQotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGludCBpbmRleCA9IHRhYmxlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgIGlmIChjdXJyZW50SFNSSF8hPW51bGwpIHsKLSAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gY3VycmVudEhTUkhfLmdldEhhbmRsZXJMaXN0KCk7Ci0gICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGhhbmRsZXJzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgaGFuZGxlcnMuYWRkKCBpbmRleCAtIDEsIG9iamVjdCk7Ci0gICAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW92ZURvd25CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCi0gICAgaW50IGluZGV4ID0gdGFibGVWaWV3ZXJfLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgIGlmIChjdXJyZW50SFNSSF8hPW51bGwpewotICAgICAgICBMaXN0IGhhbmRsZXJzID0gY3VycmVudEhTUkhfLmdldEhhbmRsZXJMaXN0KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IGhhbmRsZXJzLnNpemUoKSAtIDEpIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaGFuZGxlcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICBoYW5kbGVycy5hZGQoaW5kZXggKyAxLCBvYmplY3QpOwotICAgICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNvdXJjZUxvY2F0aW9uQ29tYm8oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICBvdXRwdXRMb2NhdGlvbl8gPSBzb3VyY2VMb2NhdGlvbkNvbWJvXy5nZXRUZXh0KCk7Ci0gICAgSVBhdGggb3V0cHV0UGF0aCA9IChJUGF0aCkgcGF0aHNUYWJsZV8uZ2V0KG91dHB1dExvY2F0aW9uXyk7Ci0gICAgY3VycmVudEhTUkhfLnNldFNvdXJjZU91dHB1dFBhdGgob3V0cHV0UGF0aCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVHZW5Ta2VsZXRvblJhZGlvQnV0dG9uKCkgewotICAgIGlmIChnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5pc0VuYWJsZWQoKSkgewotICAgICAgaWYgKGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gdHJ1ZTsKLSAgICAgICAgc291cmNlTG9jYXRpb25Db21ib18uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB0aGlzLmlzR2VuU2tlbGV0b25FbmFibGVkXyA9IGZhbHNlOwotICAgICAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVXZWJTZXJ2aWNlUmVmQ29tYm8oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGlmICh3ZWJTZXJ2aWNlUmVmQ29tYm9fIT1udWxsICYmIHdlYlNlcnZpY2VSZWZDb21ib18uaXNFbmFibGVkKCkpIHsKLSAgICAgIEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyIGhzcmggPSBIYW5kbGVyU2VydmljZVJlZkhlbHBlci5nZXRGb3JTZXJ2aWNlUmVmTmFtZShoYW5kbGVyU2VydmljZVJlZkhvbGRlcl8sIHdlYlNlcnZpY2VSZWZDb21ib18uZ2V0VGV4dCgpKTsKLSAgICAgIGN1cnJlbnRIU1JIXyA9IGhzcmg7ICAgICAgCi0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChpc0dlblNrZWxldG9uRW5hYmxlZF8pewotICAgICAgc2V0U291cmNlT3V0cHV0TG9jYXRpb24oKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0dlblNrZWxldG9uRW5hYmxlZF8uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0dlblNrZWxldG9uRW5hYmxlZF8oKSB7Ci0gICAgcmV0dXJuIGlzR2VuU2tlbGV0b25FbmFibGVkXzsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBIYW5kbGVyVGFibGVJdGVtKSB7Ci0gICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIG9iamVjdDsKLSAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQotICAgICAgICAgIHJldHVybiBodGkuZ2V0SGFuZGxlck5hbWUoKSAhPSBudWxsID8gaHRpLmdldEhhbmRsZXJOYW1lKCkgOiAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7IHJldHVybiBodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpICE9IG51bGwgPyBodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpIDogIiI7IH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZVJlbW92ZShib29sZWFuIGVuYWJsZWQpIHsKLSAgICByZW1vdmVCdXR0b25fLnNldEVuYWJsZWQoZW5hYmxlZCAmJiAhdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWZWN0b3IpIHsgcmV0dXJuICgoVmVjdG9yKSBlbGVtZW50KS50b0FycmF5KCk7IH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdvYmopIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKSB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLSAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IGhhbmRsZXJzVGFibGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoY3VycmVudEhTUkhfIT1udWxsKXsKLSAgICAgICAgY3VycmVudEhTUkhfLmdldEhhbmRsZXJMaXN0KCkucmVtb3ZlKHNlbGVjdGlvbkluZGV4KTsKLSAgICAgIH0KLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgIAotICAgIHRyeSB7Ci0gICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQobnVsbCk7Ci0gICAgICBpZiAoY3VycmVudEhTUkhfIT1udWxsKXsKLSAgICAgICAgTGlzdCBoYW5kbGVycyA9IGN1cnJlbnRIU1JIXy5nZXRIYW5kbGVyTGlzdCgpOwotICAgICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQoaGFuZGxlcnMpOwotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRHZW5Ta2VsZXRvbkVuYWJsZWQoYm9vbGVhbiBpc0dlblNrZWxldG9uRW5hYmxlZCkgewotICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gaXNHZW5Ta2VsZXRvbkVuYWJsZWQ7Ci0gICAgZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uc2V0U2VsZWN0aW9uKGlzR2VuU2tlbGV0b25FbmFibGVkKTsKLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuU2tlbGV0b25FbmFibGVkKCkgewotICAgIHJldHVybiB0aGlzLmlzR2VuU2tlbGV0b25FbmFibGVkXzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRTb3VyY2VPdXRwdXRMb2NhdGlvbigpewotICAgIGlmIChjdXJyZW50SFNSSF8hPW51bGwpeyAgICAKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBjdXJyZW50SFNSSF8uZ2V0UHJvamVjdCgpOwotICAgICAgaWYgKHByb2plY3QhPW51bGwpewotICAgICAgICBJUGF0aFtdbG9jYXRpb25zID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHByb2plY3QpOwotICAgICAgICBTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbbG9jYXRpb25zLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgcGF0aHNbaV0gPSBsb2NhdGlvbnNbaV0udG9TdHJpbmcoKTsKLSAgICAgICAgICBwYXRoc1RhYmxlXy5wdXQocGF0aHNbaV0sIGxvY2F0aW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc291cmNlTG9jYXRpb25Db21ib18uc2V0SXRlbXMocGF0aHMpOwotICAgICAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZWxlY3QoMCk7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gc2V0IGluIG1vZGVsCi0gICAgICBvdXRwdXRMb2NhdGlvbl8gPSBzb3VyY2VMb2NhdGlvbkNvbWJvXy5nZXRUZXh0KCk7Ci0gICAgICBJUGF0aCBvdXRwdXRQYXRoID0gKElQYXRoKSBwYXRoc1RhYmxlXy5nZXQob3V0cHV0TG9jYXRpb25fKTsKLSAgICAgIGN1cnJlbnRIU1JIXy5zZXRTb3VyY2VPdXRwdXRQYXRoKG91dHB1dFBhdGgpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIENhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIAotICAgKi8KLSAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKXsKLSAgICBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKTsKLSAgfSAKLSAgCi0gIC8qKgotICAgKiBJbml0aWFsIHNlbGVjdGlvbgotICAgKiBAcGFyYW0gd3NSZWZOYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUmVmTmFtZShTdHJpbmcgd3NSZWZOYW1lKSB7Ci0gICAgc2VydmljZVJlZk5hbWVfID0gd3NSZWZOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIHRydWUgaWYgbXVsdGlwbGUgY2xpZW50cyBhcmUgc2VsZWN0ZWQKLSAgICogQHBhcmFtIGlzTXVsaXRwbGVTZWxlY3Rpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElzTXVsdGlwbGVTZWxlY3Rpb24oYm9vbGVhbiBpc011bGl0cGxlU2VsZWN0aW9uKSB7Ci0gICAgdGhpcy5pc011bHRpcGxlU2VsZWN0aW9uXyA9IGlzTXVsaXRwbGVTZWxlY3Rpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBbiBhcnJheSBvZiBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJzCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyKEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyW10gaGFuZGxlckhvbGRlcnMpewotICAgIHRoaXMuaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfID0gaGFuZGxlckhvbGRlcnM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBIYW5kbGVyU2VydmljZVJlZkhvbGRlcltdIGdldEhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyKCl7Ci0gICAgcmV0dXJuIHRoaXMuaGFuZGxlclNlcnZpY2VSZWZIb2xkZXJfOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMTVlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDQgMTM0OTEzICAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1ICAgICAgIAotICogMjAwNjA0MjYgICAxMzU2MTQgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA2MDUyOSAgIDE0MzUxOCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5IYW5kbGVyRGVzY3JpcHRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5IYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotLyoqCi0gKiBDb25maWdTZXJ2aWNlSGFuZGxlcnNUcmVlV2lkZ2V0Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLQotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgCi0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudF87Ci0gIHByaXZhdGUgVGFibGUgaGFuZGxlcnNUYWJsZV87Ci0gIHByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXJfOwotICBwcml2YXRlIENvbXBvc2l0ZSB3ZWJTZXJ2aWNlRGVzY0NvbXBfOwotICBwcml2YXRlIENvbWJvIHdlYlNlcnZpY2VEZXNjQ29tYm9fID0gbnVsbDsKLSAgcHJpdmF0ZSBUZXh0IHdlYlNlcnZpY2VEZXNjVGV4dF8gPSBudWxsOwotICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXzsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgc291cmNlTG9jYXRpb25Db21wXzsKLSAgcHJpdmF0ZSBDb21ibyBzb3VyY2VMb2NhdGlvbkNvbWJvXzsKLSAgCi0gIHByaXZhdGUgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyW10gaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXzsKLSAgcHJpdmF0ZSBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXIgY3VycmVudEhESF87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHBhdGhzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOyAgLy8gYXZhaWxhYmxlIHBhdGhzIGZvciBjb21ibyAgCi0gIHByaXZhdGUgU3RyaW5nIG91dHB1dExvY2F0aW9uXzsgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQgcGF0aCBmcm9tIGNvbWJvCi0gIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uTmFtZV8gPSBudWxsOwotICBwcml2YXRlIGJvb2xlYW4gaXNNdWx0aXBsZVNlbGVjdGlvbl8gPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkXzsKLQotICBwcml2YXRlIGludCBERUZBVUxUX0NPTFVNTl9XSURUSCA9IDEwMDsKLQotICAvLyAtLS0tVE9PTFRJUFMgU2VjdGlvbi0tLS0KLSAgLyogQ09OVEVYVF9JRCBTSExEMDAwMSBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9IRExSX1dTX0hBTkRMRVJTID0gIlNIREwwMDAxIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qIENPTlRFWFRfSUQgU0hETDAwMDIgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04gPSAiU0hETDAwMDIiOyAvLyROT04tTkxTLTEkCi0KLSAgLyogQ09OVEVYVF9JRCBTSERMMDAwMyBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9DT01CT19TT1VSQ0VfTE9DID0gIlNIREwwMDAzIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qIENPTlRFWFRfSUQgU0hETDAwMDQgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfV1NfU0VSVklDRV9ERVNDID0gIlNIREwwMDA0IjsgLy8kTk9OLU5MUy0xJAotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCgpIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICBVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhwbHVnaW5JZF8pOwotCi0gICAgcGFyZW50XyA9IHBhcmVudDsKLQotICAgIC8vIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9uIGNvbXBvc2l0ZSAoY29tYm8vdGV4dCB0byBiZSBjcmVhdGVkIGxhdGVyKQotICAgIHdlYlNlcnZpY2VEZXNjQ29tcF8gPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnRfLCAyKTsKLSAgICAKLSAgICBDb21wb3NpdGUgZGlzcGxheUNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudF8sIFNXVC5OT05FKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBkaXNwbGF5Q29tcC5zZXRMYXlvdXQoZ3JpZGxheW91dCk7Ci0gICAgZGlzcGxheUNvbXAuc2V0TGF5b3V0RGF0YSh1aVV0aWxzLmNyZWF0ZUZpbGxBbGwoKSk7Ci0KLSAgICBmaW5hbCBDb21wb3NpdGUgaGFuZGxlcnNDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoZGlzcGxheUNvbXAsIDEpOwotICAgIEdyaWREYXRhIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORwotICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0gICAgaGFuZGxlcnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGhhbmRsZXJzQ29tcC5zZXRTaXplKDEzMCwgNjAwKTsKLSAgICAKLSAgICBDb21wb3NpdGUgYnV0dG9uc0NvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShkaXNwbGF5Q29tcCwgMSk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBidXR0b25zQ29tcC5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLQotICAgIFRleHQgaGFuZGxlcnNUZXh0ID0gbmV3IFRleHQoaGFuZGxlcnNDb21wLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBoYW5kbGVyc1RleHQuc2V0VGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfSEFORExFUlNfQ09ORklHKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBoYW5kbGVyc1RleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgCi0gICAgaGFuZGxlcnNUYWJsZV8gPSB1aVV0aWxzLmNyZWF0ZVRhYmxlKGhhbmRsZXJzQ29tcCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfRURJVF9XU19IQU5ETEVSUywgSU5GT1BPUF9IRExSX1dTX0hBTkRMRVJTLCBTV1QuTVVMVEkKLSAgICAgICAgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLSAgICBoYW5kbGVyc1RhYmxlXy5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIGhhbmRsZXJzVGFibGVfLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgIC8vIGVtcHR5IHNwYWNlCi0gICAgTGFiZWwgd3NMYWJlbCA9IG5ldyBMYWJlbChidXR0b25zQ29tcCwgU1dULk5PTkUpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHdzTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBCdXR0b24gbW92ZVVwQnV0dG9uID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnNDb21wLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQlVUVE9OX01PVkVfVVAsIG51bGwsIG51bGwpOwotICAgIEdyaWREYXRhIG11R3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBQb2ludCBtdXNpemUgPSBtb3ZlVXBCdXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICBtb3ZlVXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVNb3ZlVXBCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgQnV0dG9uIG1vdmVEb3duQnV0dG9uID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnNDb21wLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQlVUVE9OX01PVkVfRE9XTiwgbnVsbCwgbnVsbCk7Ci0gICAgR3JpZERhdGEgbWRHcmlkZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIFBvaW50IG1kc2l6ZSA9IG1vdmVEb3duQnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgbW92ZURvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVNb3ZlRG93bkJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICAvLyBlbXB0eSBzcGFjZQotICAgIHdzTGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uc0NvbXAsIFNXVC5OT05FKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB3c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgYWRkQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0JVVFRPTl9BREQsIG51bGwsIG51bGwpOwotICAgIEdyaWREYXRhIGFkZEdyaWRkYXRhID0gbmV3IEdyaWREYXRhKCk7IAotICAgIFBvaW50IGFkZFNpemUgPSBhZGRCdXR0b25fLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgYWRkQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZW1vdmVCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnNDb21wLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQlVUVE9OX1JFTU9WRSwgbnVsbCwgbnVsbCk7Ci0gICAgR3JpZERhdGEgcmVtR3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBQb2ludCByZW1TaXplID0gcmVtb3ZlQnV0dG9uXy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgIHJlbW92ZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotICAgIGVuYWJsZVJlbW92ZShmYWxzZSk7Ci0KLSAgICBpbnQgd2lkdGhIaW50ID0gMDsKLSAgICBpbnRbXSBzaXplcyA9IG5ldyBpbnRbXXttdXNpemUueCwgbWRzaXplLngsIGFkZFNpemUueCwgcmVtU2l6ZS54LCAxMDB9OwotICAgIGZvcihpbnQgaiA9IDA7IGogPCBzaXplcy5sZW5ndGg7IGorKykgewotICAgIAlpZiAoc2l6ZXNbal0gPiB3aWR0aEhpbnQpCi0gICAgCXdpZHRoSGludCA9IHNpemVzW2pdOwotICAgIH0KLSAgICBtdUdyaWRkYXRhLndpZHRoSGludCA9IHdpZHRoSGludDsKLSAgICBtZEdyaWRkYXRhLndpZHRoSGludCA9IHdpZHRoSGludDsKLSAgICBhZGRHcmlkZGF0YS53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0gICAgcmVtR3JpZGRhdGEud2lkdGhIaW50ID0gd2lkdGhIaW50OwotICAgIAotICAgIG1vdmVVcEJ1dHRvbi5zZXRMYXlvdXREYXRhKG11R3JpZGRhdGEpOwotICAgIG1vdmVEb3duQnV0dG9uLnNldExheW91dERhdGEobWRHcmlkZGF0YSk7Ci0gICAgYWRkQnV0dG9uXy5zZXRMYXlvdXREYXRhKGFkZEdyaWRkYXRhKTsKLSAgICByZW1vdmVCdXR0b25fLnNldExheW91dERhdGEocmVtR3JpZGRhdGEpOwotICAgIAotICAgIC8vIHRhYmxlIHN0dWZmIGhlcmUKLSAgICBTdHJpbmdbXSBjb2x1bW5zXyA9IG5ldyBTdHJpbmdbXSB7IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9IQU5ETEVSX05BTUUsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJMRV9IQU5ETEVSX0NMQVNTLAotICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfSEFORExFUl9QT1JUfTsKLQotICAgIGZpbmFsIFRhYmxlQ29sdW1uW10gdGFibGVDb2xzID0gbmV3IFRhYmxlQ29sdW1uW2NvbHVtbnNfLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zXy5sZW5ndGg7IGkrKykgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oaGFuZGxlcnNUYWJsZV8sIFNXVC5MRUZUKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoY29sdW1uc19baV0pOwotICAgICAgdGFibGVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKERFRkFVTFRfQ09MVU1OX1dJRFRIKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAgIHRhYmxlQ29sc1tpXSA9IHRhYmxlQ29sdW1uOwotICAgIH0KLSAgICBoYW5kbGVyc0NvbXAuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGFyZWEgPSBoYW5kbGVyc0NvbXAuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICBQb2ludCBwcmVmZXJyZWRTaXplID0gaGFuZGxlcnNUYWJsZV8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiBoYW5kbGVyc1RhYmxlXy5nZXRCb3JkZXJXaWR0aCgpIC0gMTA7Ci0gICAgICAgIGlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIGhhbmRsZXJzVGFibGVfLmdldEhlYWRlckhlaWdodCgpKSB7Ci0gICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4gd2lkdGgKLSAgICAgICAgICAvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0gICAgICAgICAgUG9pbnQgdkJhclNpemUgPSBoYW5kbGVyc1RhYmxlXy5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLSAgICAgICAgICB3aWR0aCAtPSB2QmFyU2l6ZS54OwotICAgICAgICB9Ci0gICAgICAgIFBvaW50IG9sZFNpemUgPSBoYW5kbGVyc1RhYmxlXy5nZXRTaXplKCk7Ci0gICAgICAgIGlmIChvbGRTaXplLnggPiBhcmVhLndpZHRoKSB7Ci0gICAgICAgICAgLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLSAgICAgICAgICAvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLSAgICAgICAgICAvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLSAgICAgICAgICB0YWJsZUNvbHNbMF0uc2V0V2lkdGgod2lkdGggLyAzKTsKLSAgICAgICAgICB0YWJsZUNvbHNbMV0uc2V0V2lkdGgod2lkdGggLyAzKTsKLSAgICAgICAgICB0YWJsZUNvbHNbMl0uc2V0V2lkdGgod2lkdGggLSAodGFibGVDb2xzWzBdLmdldFdpZHRoKCkgKyB0YWJsZUNvbHNbMV0uZ2V0V2lkdGgoKSkpOwotICAgICAgICAgIGhhbmRsZXJzVGFibGVfLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIC8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0gICAgICAgICAgLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLSAgICAgICAgICAvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLSAgICAgICAgICBoYW5kbGVyc1RhYmxlXy5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLSAgICAgICAgICB0YWJsZUNvbHNbMF0uc2V0V2lkdGgod2lkdGggLyAzKTsKLSAgICAgICAgICB0YWJsZUNvbHNbMV0uc2V0V2lkdGgod2lkdGggLyAzKTsKLSAgICAgICAgICB0YWJsZUNvbHNbMl0uc2V0V2lkdGgod2lkdGggLSAodGFibGVDb2xzWzBdLmdldFdpZHRoKCkgKyB0YWJsZUNvbHNbMV0uZ2V0V2lkdGgoKSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0YWJsZVZpZXdlcl8gPSBuZXcgVGFibGVWaWV3ZXIoaGFuZGxlcnNUYWJsZV8pOwotICAgIENvbnRyb2wgY29udHJvbCA9IHRhYmxlVmlld2VyXy5nZXRDb250cm9sKCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHRhYmxlVmlld2VyXy5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbnNfKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMaXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICB0YWJsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBlbmFibGVSZW1vdmUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3gocGFyZW50XywgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0JVVFRPTl9HRU5fU0tFTEVUT04sCi0gICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04sIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04pOwotICAgIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlR2VuU2tlbGV0b25SYWRpb0J1dHRvbigpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgc291cmNlTG9jYXRpb25Db21wXyA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHBhcmVudF8sIDIpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXBfLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQ09NQk9fU09VUkNFX0xPQywKLSAgICAgICAgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQywgSU5GT1BPUF9DT01CT19TT1VSQ0VfTE9DLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZVNvdXJjZUxvY2F0aW9uQ29tYm8oZXZ0KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8vIENhbGxlZCBhdCBzdGFydCBhbmQgb25seSBmb3Igc2luZ2xlIHNlcnZpY2Ugc2VsZWN0aW9uIAotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVIYW5kbGVyc1RhYmxlKCkgewotICAgIHRyeSB7Ci0gICAgICBVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhwbHVnaW5JZF8pOwotICAgICAKLSAgICAgIC8vIHByb2Nlc3MgZm9yIG11bHRpcGxlIHNlcnZpY2Ugc2VsZWN0aW9uCi0gICAgICBpZiAoaXNNdWx0aXBsZVNlbGVjdGlvbl8pIHsKLSAgICAgICAgcGFyZW50Xy5nZXRTaGVsbCgpLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfREVTQ19NVUxUSVBMRV9TRVJWSUNFU19DT05GSUcpOwotICAgICAgICAKLSAgICAgICAgd2ViU2VydmljZURlc2NUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCh3ZWJTZXJ2aWNlRGVzY0NvbXBfLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQ09NQk9fV1NfU0VSVklDRV9ERVNDLCAKLSAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTX1NFUlZJQ0VfREVTQywgSU5GT1BPUF9XU19TRVJWSUNFX0RFU0MsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBpZiAoaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXyE9bnVsbCl7Ci0gICAgICAgICAgY3VycmVudEhESF8gPSBoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfWzBdOwotICAgICAgICAgIFN0cmluZyB0ZXh0ID0gTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19URVhUX05VTV9PRl9TRVJWSUNFUywgSW50ZWdlci50b1N0cmluZyhoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfLmxlbmd0aCkpOwotICAgICAgICAgIHdlYlNlcnZpY2VEZXNjVGV4dF8uc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBzb3VyY2VMb2NhdGlvbkNvbXBfLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc291cmNlTG9jYXRpb25Db21ib18uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICByZWZyZXNoKCk7Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgdGFibGUgZm9yIGEgc2luZ2xlIHNlcnZpY2Ugc2VsZWN0aW9uCi0gICAgICAgIAotICAgICAgICB3ZWJTZXJ2aWNlRGVzY0NvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8od2ViU2VydmljZURlc2NDb21wXywgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0NPTUJPX1dTX1NFUlZJQ0VfREVTQywKLSAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTX1NFUlZJQ0VfREVTQywgSU5GT1BPUF9XU19TRVJWSUNFX0RFU0MsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAKLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgICAgIGhhbmRsZVdlYlNlcnZpY2VEZXNjQ29tYm8oZXZ0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gd3NEZXNjTmFtZXMgPSBIYW5kbGVyRGVzY3JpcHRpb25IZWxwZXIuZ2V0QWxsRGVzY3JpcHRpb25OYW1lcyhoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfKTsKLSAgICAgICAgd2ViU2VydmljZURlc2NDb21ib18uc2V0SXRlbXMod3NEZXNjTmFtZXMpOwotCi0gICAgICAgIGlmIChoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfLmxlbmd0aCA8IDEpIHsKLSAgICAgICAgICB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5zZWxlY3QoMCk7Ci0gICAgICAgICAgd2ViU2VydmljZURlc2NDb21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKGRlc2NyaXB0aW9uTmFtZV8gIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gd2ViU2VydmljZURlc2NDb21ib18uaW5kZXhPZihkZXNjcmlwdGlvbk5hbWVfKTsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgd2ViU2VydmljZURlc2NDb21ib18uc2VsZWN0KGluZGV4KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgd2ViU2VydmljZURlc2NDb21ib18uc2VsZWN0KDApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzZXQgRGVzY3JpcHRpb25zCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlciBoZGggPSBIYW5kbGVyRGVzY3JpcHRpb25IZWxwZXIuZ2V0Rm9yRGVzY3JpcHRpb25OYW1lKGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl8sIHdlYlNlcnZpY2VEZXNjQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICAgIGlmIChoZGghPW51bGwpewotICAgICAgICAgIGN1cnJlbnRIREhfID0gaGRoOwotICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSBoZGguZ2V0SGFuZGxlckxpc3QoKTsKLSAgICAgICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQoaGFuZGxlcnMpOwotICAgICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0IG91dHB1dCBmb2xkZXIKLSAgICAgICAgc2V0U291cmNlT3V0cHV0TG9jYXRpb24oKTsgIAotICAgICAgfQotICAgICAgcGFyZW50Xy5nZXRTaGVsbCgpLnNldFNpemUoNTMwLCA2NTApOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgSVN0YXR1cyBmaW5hbFN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgaWYgKGlzTXVsdGlwbGVTZWxlY3Rpb25fKQotICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmluZm9TdGF0dXMoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfREVTQ19NVUxUSVBMRV9TRVJWSUNFU19DT05GSUcpOwotICAgIHJldHVybiBmaW5hbFN0YXR1czsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgQWRkSGFuZGxlckRpYWxvZyBkaWFsb2cgPSBuZXcgQWRkSGFuZGxlckRpYWxvZyhwYXJlbnRfLmdldFNoZWxsKCksIGZhbHNlKTsKLSAgICBkaWFsb2cuc2V0SXNNdWx0aXBsZVNlcnZpY2VzKGlzTXVsdGlwbGVTZWxlY3Rpb25fKTsKLSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgCi0gICAgV2ViU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gbnVsbDsKLSAgICBpZiAoIWlzTXVsdGlwbGVTZWxlY3Rpb25fICl7Ci0gICAgICBpZiAoY3VycmVudEhESF8hPW51bGwpIHsKLSAgICAgICAgc2VydmljZURlc2MgPSAgY3VycmVudEhESF8uZ2V0RGVzY3JpcHRpb25PYmplY3QoKTsKLSAgICAgICAgU3RyaW5nW10gcG9ydE5hbWVzID0gZ2V0UG9ydENvbXBvbmVudE5hbWVzKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgZGlhbG9nLnNldFBvcnROYW1lcyhwb3J0TmFtZXMpOwotICAgICAgfQotICAgIH0KLQotICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNTAwLCAyMzApOwotICAgIAotICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLSAgICAgIFN0cmluZyBuYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBkaWFsb2cuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICBTdHJpbmcgcG9ydCA9IGRpYWxvZy5nZXRQb3J0TmFtZSgpOwotICAgICAgaWYgKHBvcnQgPT0gbnVsbCkKLSAgICAgICAgcG9ydCA9ICIqIjsKLQotICAgICAgSGFuZGxlclRhYmxlSXRlbSBoaSA9IG5ldyBIYW5kbGVyVGFibGVJdGVtKCk7Ci0gICAgICBoaS5zZXRIYW5kbGVyTmFtZShuYW1lKTsKLSAgICAgIGhpLnNldEhhbmRsZXJDbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgIGhpLnNldFBvcnROYW1lKHBvcnQpOwotCi0gICAgICBpZiAoc2VydmljZURlc2MhPW51bGwpewotICAgICAgICBoaS5zZXRXc0Rlc2NSZWYoc2VydmljZURlc2MpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoY3VycmVudEhESF8hPW51bGwpewotICAgICAgICBMaXN0IGhhbmRsZXJzID0gY3VycmVudEhESF8uZ2V0SGFuZGxlckxpc3QoKTsKLSAgICAgICAgaGFuZGxlcnMuYWRkKGhpKTsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0UG9ydENvbXBvbmVudE5hbWVzKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzYykgewotCi0gICAgTGlzdCBwb3J0cyA9IHdlYlNlcnZpY2VEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgaWYgKHBvcnRzICE9IG51bGwpIHsKLSAgICAgIFN0cmluZ1tdIHBvcnROYW1lcyA9IG5ldyBTdHJpbmdbcG9ydHMuc2l6ZSgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9ydHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgUG9ydENvbXBvbmVudCBwYyA9IChQb3J0Q29tcG9uZW50KSBwb3J0cy5nZXQoaSk7Ci0gICAgICAgIFN0cmluZyBwY05hbWUgPSBwYy5nZXRQb3J0Q29tcG9uZW50TmFtZSgpOwotICAgICAgICBwb3J0TmFtZXNbaV0gPSBwY05hbWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcG9ydE5hbWVzOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGludCBpbmRleCA9IHRhYmxlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgIGlmIChjdXJyZW50SERIXyE9bnVsbCl7Ci0gICAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gY3VycmVudEhESF8uZ2V0SGFuZGxlckxpc3QoKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBoYW5kbGVycy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGluZGV4IC0gMSwgb2JqZWN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNb3ZlRG93bkJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBpbnQgaW5kZXggPSB0YWJsZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgaWYgKGN1cnJlbnRIREhfIT1udWxsKXsKLSAgICAgICAgTGlzdCBoYW5kbGVycyA9IGN1cnJlbnRIREhfLmdldEhhbmRsZXJMaXN0KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IGhhbmRsZXJzLnNpemUoKSAtIDEpIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaGFuZGxlcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICBoYW5kbGVycy5hZGQoaW5kZXgrMSwgb2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU291cmNlTG9jYXRpb25Db21ibyhTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgIG91dHB1dExvY2F0aW9uXyA9IHNvdXJjZUxvY2F0aW9uQ29tYm9fLmdldFRleHQoKTsKLSAgICBJUGF0aCBvdXRwdXRQYXRoID0gKElQYXRoKSBwYXRoc1RhYmxlXy5nZXQob3V0cHV0TG9jYXRpb25fKTsKLSAgICBjdXJyZW50SERIXy5zZXRTb3VyY2VPdXRwdXRQYXRoKG91dHB1dFBhdGgpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUdlblNrZWxldG9uUmFkaW9CdXR0b24oKSB7Ci0gICAgaWYgKGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmlzRW5hYmxlZCgpKSB7Ci0gICAgICBpZiAoZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSB0cnVlOwotICAgICAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gZmFsc2U7Ci0gICAgICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVdlYlNlcnZpY2VEZXNjQ29tYm8oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGlmICh3ZWJTZXJ2aWNlRGVzY0NvbWJvXyE9bnVsbCAmJiB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5pc0VuYWJsZWQoKSkgewotICAgICAgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyIGhkaCA9IEhhbmRsZXJEZXNjcmlwdGlvbkhlbHBlci5nZXRGb3JEZXNjcmlwdGlvbk5hbWUoaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXywgd2ViU2VydmljZURlc2NDb21ib18uZ2V0VGV4dCgpKTsKLSAgICAgIGN1cnJlbnRIREhfID0gaGRoOyAgICAgIAotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoaXNHZW5Ta2VsZXRvbkVuYWJsZWRfKXsKLSAgICAgIHNldFNvdXJjZU91dHB1dExvY2F0aW9uKCk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNHZW5Ta2VsZXRvbkVuYWJsZWRfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfKCkgewotICAgIHJldHVybiBpc0dlblNrZWxldG9uRW5hYmxlZF87Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSGFuZGxlclRhYmxlSXRlbSkgewotICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKSBvYmplY3Q7Ci0gICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIGh0aS5nZXRIYW5kbGVyTmFtZSgpICE9IG51bGwgPyBodGkuZ2V0SGFuZGxlck5hbWUoKSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLSAgICAgICAgICByZXR1cm4gaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSAhPSBudWxsID8gaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHJldHVybiBodGkuZ2V0UG9ydE5hbWUoKSAhPSBudWxsID8gaHRpLmdldFBvcnROYW1lKCkgOiAiIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlUmVtb3ZlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgIHJlbW92ZUJ1dHRvbl8uc2V0RW5hYmxlZChlbmFibGVkICYmICF0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZlY3RvcikgeyByZXR1cm4gKChWZWN0b3IpIGVsZW1lbnQpLnRvQXJyYXkoKTsgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpIHsKLSAgICAvLyBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkgewotICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gaGFuZGxlcnNUYWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChjdXJyZW50SERIXyE9bnVsbCl7Ci0gICAgICAgIGN1cnJlbnRIREhfLmdldEhhbmRsZXJMaXN0KCkucmVtb3ZlKHNlbGVjdGlvbkluZGV4KTsKLSAgICAgIH0KLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgIHRyeSB7Ci0gICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQobnVsbCk7Ci0gICAgICBpZiAoY3VycmVudEhESF8hPW51bGwpewotICAgICAgICBMaXN0IGhhbmRsZXJzID0gY3VycmVudEhESF8uZ2V0SGFuZGxlckxpc3QoKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KGhhbmRsZXJzKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0R2VuU2tlbGV0b25FbmFibGVkKGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWQpIHsKLSAgICB0aGlzLmlzR2VuU2tlbGV0b25FbmFibGVkXyA9IGlzR2VuU2tlbGV0b25FbmFibGVkOwotICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLnNldFNlbGVjdGlvbihpc0dlblNrZWxldG9uRW5hYmxlZCk7Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEdlblNrZWxldG9uRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF87Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0U291cmNlT3V0cHV0TG9jYXRpb24oKXsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gY3VycmVudEhESF8uZ2V0UHJvamVjdCgpOwotICAgIGlmIChwcm9qZWN0IT1udWxsKXsKLSAgICAgIElQYXRoW10gbG9jYXRpb25zID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHByb2plY3QpOwotICAgICAgCi0gICAgICBTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbbG9jYXRpb25zLmxlbmd0aF07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICBwYXRoc1tpXSA9IGxvY2F0aW9uc1tpXS50b1N0cmluZygpOwotICAgICAgICBwYXRoc1RhYmxlXy5wdXQocGF0aHNbaV0sIGxvY2F0aW9uc1tpXSk7Ci0gICAgICB9Ci0gICAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZXRJdGVtcyhwYXRocyk7Ci0gICAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZWxlY3QoMCk7Ci0gICAgfQotICAgIAotICAgIC8vIHNldCBpbiBtb2RlbAotICAgIG91dHB1dExvY2F0aW9uXyA9IHNvdXJjZUxvY2F0aW9uQ29tYm9fLmdldFRleHQoKTsKLSAgICBJUGF0aCBvdXRwdXRQYXRoID0gKElQYXRoKSBwYXRoc1RhYmxlXy5nZXQob3V0cHV0TG9jYXRpb25fKTsKLSAgICBjdXJyZW50SERIXy5zZXRTb3VyY2VPdXRwdXRQYXRoKG91dHB1dFBhdGgpOyAgCi0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBBbiBhcnJheSBvZiBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJzCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcnMoSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyW10gaGFuZGxlckhvbGRlcnMpewotICAgIHRoaXMuaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXyA9IGhhbmRsZXJIb2xkZXJzOwotICB9Ci0gIAotICBwdWJsaWMgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyW10gZ2V0SGFuZGxlckRlc2NyaXB0aW9uSG9sZGVycygpewotICAgIHJldHVybiB0aGlzLmhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBGb3IgZ2V0dGluZyB0aGUgaGFuZGxlcnMgdG8gYXBwbHkgZm9yIG11bHRpcGxlIHNlcnZpY2VzCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEhhbmRsZXJzTGlzdCgpewotICAgIGlmIChoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfWzBdIT1udWxsKQotICAgICAgcmV0dXJuIGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl9bMF0uZ2V0SGFuZGxlckxpc3QoKTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25OYW1lKFN0cmluZyB3c0Rlc2NOYW1lKSB7Ci0gICAgZGVzY3JpcHRpb25OYW1lXyA9IHdzRGVzY05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc011bHRpcGxlU2VsZWN0aW9uKGJvb2xlYW4gaXNNdWxpdHBsZVNlbGVjdGlvbikgewotICAgIHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbl8gPSBpc011bGl0cGxlU2VsZWN0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKXsKLSAgICBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0hhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViNmUxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci0KLQotLyoqCi0gKiBIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kCi0gKiAKLSAqIERldGVybWluZSBpZiBIYW5kbGVycyBiZWxvbmdzIHRvIHNlcnZpY2Ugb3IgY2xpZW50IHNpZGUKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZCAKLXsKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50SGFuZGxlcl8gPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmljZUhhbmRsZXJfID0gZmFsc2U7Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsgICAgCi0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgewotICAgICAgICAgIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgd3NuZ3QgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgb2JqOwotICAgICAgICAgIGlmICh3c25ndC5nZXRXc2RsU2VydmljZSgpIT1udWxsKXsKLSAgICAgICAgICAJaXNTZXJ2aWNlSGFuZGxlcl8gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAod3NuZ3QuZ2V0U2VydmljZVJlZigpIT1udWxsKXsKLSAgICAgICAgICAJaXNDbGllbnRIYW5kbGVyXyA9IHRydWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQgKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci0KLSAgCi0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNDbGllbnRIYW5kbGVyXy4KLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0SXNDbGllbnRIYW5kbGVyKCkgewotCXJldHVybiBpc0NsaWVudEhhbmRsZXJfOwotfQotLyoqCi0gKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzU2VydmljZUhhbmRsZXJfLgotICovCi1wdWJsaWMgYm9vbGVhbiBnZXRJc1NlcnZpY2VIYW5kbGVyKCkgewotCXJldHVybiBpc1NlcnZpY2VIYW5kbGVyXzsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSU9iamVjdFNlbGVjdGlvbkxhdW5jaGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9JT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTlhZDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9JT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDIwICAgMTM1OTEyIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU9iamVjdFNlbGVjdGlvbkxhdW5jaGFibGUgewotCSAgLyoqCi0JICAgKiBUaGUgZnJhbWV3b3JrIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0JICAgKiB2YWx1ZSB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQuCi0JICAgKiAKLQkgICAqIEBwYXJhbSBpbml0aWFsU2VsZWN0aW9uIHRoZSBpbml0aWFsIHNlbGVjdGlvbiB0aGUgdXNlciBzcGVjaWZpZWQuCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbik7Ci0JICAKLQkgIC8qKgotCSAgICogVGhlIGludGVudCBvZiB0aGUgT2JqZWN0IFNlbGVjdGlvbiBXaWRnZXQgaXMgdGhhdCB0aGUgdXNlciBoYXMKLQkgICAqIHRoZSBvcHBvcnR1bml0eSBjaGFuZ2UvZmluZCB0aGUgb2JqZWN0IHRoYXQgdGhleSB3YW50IHRvIHR1cm4gaW50bwotCSAgICogYSBXZWIgc2VydmljZS4KLQkgICAqIAotCSAgICogQHJldHVybiByZXR1cm5zIHRoZSBhbiBJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3QgdGhhdCB0aGUgdXNlcgotCSAgICogd2FudCB0byB0dXJuIGludG8gYSBXZWIgc2VydmljZS4gIFRoaXMgb2JqZWN0IG1heSBiZSBkaWZmZXJlbnQgdGhhbgotCSAgICogdGhlIGluaXRpYWxTZWxlY3Rpb24gcGFzc2VkIGluIGJ5IHRoZSBzZXRJbml0aWFsU2VsZWN0aW9uIG1ldGhvZC4KLQkgICAqLwotCSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpOwotCSAgCi0JICAvKioKLQkgICAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBvYmplY3RTZWxlY3Rpb24gcGFyYW1ldGVyIGlzIHZhbGlkIGZvcgotCSAgICogdGhpcyBPYmplY3Qgc2VsZWN0aW9uIHdpZGdldC4gIEFuIGVycm9yIHN0YXR1cyBzaG91bGQgYmUgcmV0dXJuZWQKLQkgICAqIGlmIHRoaXMgb2JqZWN0IGlzIG5vdCB2YWx1ZS4gIE90aGVyd2lzZSwgYW5kIG9rIHN0YXR1cyBzaG91bGQgYmUKLQkgICAqIHJldHVybmVkCi0JICAgKiAKLQkgICAqIEBwYXJhbSBvYmplY3RTZWxlY3Rpb24gdGhlIG9iamVjdCB0byBiZSB2YWxpZGF0ZWQuCi0JICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHZhbGlkYXRpb24uCi0JICAgKi8KLQkgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbik7Ci0JIAotCSAgLyoqCi0JICAgKiAKLQkgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgSVByb2plY3QgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0aW9uCi0JICAgKiBvYmplY3QgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIHdpdGggdGhpcyB3aWRnZXQuICBUaGUgdmFsdWUgY2FuIGJlIAotCSAgICogbnVsbCBpZiB0aGVyZSBpcyBubyBJUHJvamVjdCBmb3IgdGhpcyBvYmplY3QuCi0JICAgKi8KLQkgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0JICAKLQkgIC8qKgotCSAgICogCi0JICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIElWaXJ0dWFsQ29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGlvbgotCSAgICogb2JqZWN0IHRoYXQgdGhlIHVzZXIgaGFzIGNob3NlbiB3aXRoIHRoaXMgd2lkZ2V0LiAgVGhlIHZhbHVlIGNhbiBiZSAKLQkgICAqIG51bGwgaWYgdGhlcmUgaXMgbm8gSVZpcnR1YWxDb21wb25lbnQgZm9yIHRoaXMgb2JqZWN0Ci0JICAgKi8KLQkgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpOwotCSAgCi0JICAvKioKLQkgICAqIENhbGxlZCB0byBsYXVuY2ggYSBkaWFsb2cgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIG1ha2UgYW4gb2JqZWN0IHNlbGVjdGlvbi4KLQkgICAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gaW1wbGVtZW50aW5nIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgd2hpY2ggY2FuIGJlIHVzZWQgYnkgdGhlIGRpYWxvZyBmcmFtZXdvcmsuCi0JICAgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIG5lY2Vzc2FyeSBnZXR0ZXJzIG9uIHRoZSBkaWFsb2cgdG8gdXBkYXRlIHRoZSAKLQkgICAqIG9iamVjdCBzZWxlY3Rpb24uIAotCSAgICogCi0JICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgY29tcGxldGluZyB0aGUgZGlhbG9nIGxhdW5jaAotCSAgICovCi0JICBwdWJsaWMgaW50IGxhdW5jaChTaGVsbCBzaGVsbCk7Ci0JICAKLQkgIC8qKgotCSAgICogCi0JICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHN0cmluZyB0byBkaXNwbGF5ZWQgaW4gdGhlIFVJIGZvciB0aGUgc2VsZWN0ZWQgb2JqZWN0Ci0JICAgKi8KLQkgIHB1YmxpYyAgU3RyaW5nIGdldE9iamVjdFNlbGVjdGlvbkRpc3BsYXlhYmxlU3RyaW5nKCk7Ci0JICAKLQkgIC8qKgotCSAgICogCi0JICAgKiBAcGFyYW0gcyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0IHNlbGVjdGlvbgotCSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgcmVwcmVzZW50cyBhIHZhbGlkIG9iamVjdCBzZWxlY3Rpb24uCi0gICAgICAgKiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBzZXQgdGhlIHdpZGdldCBvYmplY3Qgc2VsZWN0aW9uCi0JICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBzdHJpbmcgc28gdGhhdCBhIHN1YnNlcXVlbnQgY2FsbCB0byBnZXRPYmplY3RTZWxlY3Rpb24KLQkgICAqICB3aWxsIHJldHJpZXZlIHRoZSBjb3JyZWN0IG9iamVjdC4KLQkgICAqLyAgCi0JICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSVBhY2thYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSVBhY2thYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MDBiZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0lQYWNrYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwODI5ICAgMTU1NDQxIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCB3ZWIgc2VydmljZSB3aXphcmQgaGFuZ3MgZHVyaW5nIHJlc2l6ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IG1hcmtzIGFuIFVJIGVsZW1lbnQgYXMgaGF2aW5nIHNvbWUgY3VzdG9tIHBhY2tpbmcgY29kZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUGFja2FibGUgewotCQotCS8qKgotCSAqIENhbGxpbmcgdGhpcyBtZXRob2Qgc2hvdWxkIGNhdXNlIHRoZSBVSSBlbGVtZW50IHRvIHBhY2sgaXRzZWxmLiAgTm90ZSB0aGF0Ci0JICogdGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSBwYWNrKCkgbWV0aG9kIGluIFNXVC4KLQkgKi8KLQl2b2lkIHBhY2tJdCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0ltcG9ydFdTSUxXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9JbXBvcnRXU0lMV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTMwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0ltcG9ydFdTSUxXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLkFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5UYWJsZVZpZXdlckVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLkRpYWxvZ1Jlc291cmNlQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLkZpbGVFeHRlbnNpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzaWwuQWRkV1NETFRvV1NJTENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLS8qKgotKiBQYWdlIGZvciBpbXBvcnRpbmcgV1NETCByZWZlcmVuY2VzIGludG8gYSBXU0lMIGluIHRoZSB3b3JrYmVuY2guCi0qLwotcHVibGljIGNsYXNzIEltcG9ydFdTSUxXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgLypDT05URVhUX0lEIFdTSUwwMDAxIGZvciB0aGUgV1NJTCBJbXBvcnQgUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfV1NJTF9JTVBPUlRfUEFHRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5XU0lMMDAwMSI7Ci0KLSAgLypDT05URVhUX0lEIFdTSUwwMDAyIGZvciB0aGUgV1NJTCB0ZXh0IGZpZWxkKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9XU0lMX1RFWFRfV1NJTCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5XU0lMMDAwMiI7Ci0KLSAgLypDT05URVhUX0lEIFdTSUwwMDAzIGZvciB0aGUgV1NJTCBicm93c2UgYnV0dG9uKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9XU0lMX0JVVFRPTl9CUk9XU0VfV1NJTCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5XU0lMMDAwMyI7Ci0KLSAgLypDT05URVhUX0lEIFdTSUwwMDA0IGZvciB0aGUgV1NETCB0YWJsZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfV1NJTF9UQUJMRV9XU0RMID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLldTSUwwMDA0IjsKLQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTlNQRUNUSU9OX1dTSUwgPSAiaW5zcGVjdGlvbi53c2lsIjsKLQotICBwcml2YXRlIFRleHQgd3NpbF87Ci0gIHByaXZhdGUgQnV0dG9uIGJyb3dzZV87Ci0gIHByaXZhdGUgVGFibGVWaWV3ZXJFZGl0b3Igd3NkbHNfOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyBwYWdlLgotICAqLwotICBwdWJsaWMgSW1wb3J0V1NJTFdpZGdldCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gIAlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0gIAkKLSAgICBwYXJlbnQuc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NJTF9JTVBPUlRfUEFHRSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9XU0lMX0lNUE9SVF9QQUdFKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9XU0lMX1VSSSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICB3c2lsXyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBnZC53aWR0aEhpbnQgPSAyNTY7Ci0gICAgd3NpbF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgd3NpbF8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIpOwotICAgIHdzaWxfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTSUxfVEVYVF9XU0lMKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAod3NpbF8sIElORk9QT1BfV1NJTF9URVhUX1dTSUwpOwotCi0gICAgYnJvd3NlXyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYnJvd3NlXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9CUk9XU0UpOwotICAgIGJyb3dzZV8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgYnJvd3NlXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLAotICAgICAgbmV3IExpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVCcm93c2VFdmVudChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGJyb3dzZV8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NJTF9CVVRUT05fQlJPV1NFX1dTSUwpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChicm93c2VfLCBJTkZPUE9QX1dTSUxfQlVUVE9OX0JST1dTRV9XU0lMKTsKLQotICAgIENvbXBvc2l0ZSB3c2RsQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICB3c2RsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLSAgICB3c2RsQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIGxhYmVsID0gbmV3IExhYmVsKHdzZGxDb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9XU0RMKTsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBTdHJpbmdbXSBjb2x1bW5zID0ge0NvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9XU0RMX1VSSX07Ci0gICAgd3NkbHNfID0gbmV3IFRhYmxlVmlld2VyRWRpdG9yKHdzZGxDb21wb3NpdGUsIGNvbHVtbnMsIG5ldyBBcnJheUxpc3QoKSwgImh0dHA6Ly8iKTsKLSAgICB3c2Rsc18uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NJTF9UQUJMRV9XU0RMKTsKLSAgICB3c2Rsc18uc2V0SW5mb3BvcChJTkZPUE9QX1dTSUxfVEFCTEVfV1NETCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVCcm93c2VFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIERpYWxvZ1Jlc291cmNlQnJvd3NlciBkaWFsb2cgPSBuZXcgRGlhbG9nUmVzb3VyY2VCcm93c2VyKGJyb3dzZV8uZ2V0U2hlbGwoKSwgbnVsbCwgbmV3IEZpbGVFeHRlbnNpb25GaWx0ZXIobmV3IFN0cmluZ1tdIHsid3NpbCJ9KSk7Ci0gICAgZGlhbG9nLm9wZW4oKTsKLSAgICBJUmVzb3VyY2UgcmVzID0gZGlhbG9nLmdldEZpcnN0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHJlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICAgd3NpbF8uc2V0VGV4dChyZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgd3NpbF8uc2V0VGV4dChyZXMuZ2V0RnVsbFBhdGgoKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChJTlNQRUNUSU9OX1dTSUwpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICBpZiAoIXdzaWxfLmdldFRleHQoKS5lbmRzV2l0aCgiLndzaWwiKSkKLSAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfTVNHX0lOVkFMSURfV1NJTF9GSUxFX05BTUUgKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICBpZiAoKG9iamVjdCBpbnN0YW5jZW9mIElGaWxlKSAmJiAoKElGaWxlKW9iamVjdCkuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwgJiYgKChJRmlsZSlvYmplY3QpLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoIndzZGwiKSkKLSAgICAgICAgICBsaXN0LmFkZCgoKElGaWxlKW9iamVjdCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsKQotICAgICAgICAgIGxpc3QuYWRkKEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0lMUGF0aCgoKFNlcnZpY2VJbXBsKShvYmplY3QpKSkpOwkKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpCi0gICAgICAgICAgbGlzdC5hZGQoSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTSUxQYXRoKCgoU2VydmljZVJlZikob2JqZWN0KSkpKTsJCQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkKLSAgICAgICAgICBsaXN0LmFkZChKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NJTFBhdGgoKChXU0RMUmVzb3VyY2VJbXBsKShvYmplY3QpKSkpOwkKLSAgICAgIH0KLSAgICB9Ci0gICAgd3NkbHNfLnNldElucHV0KGxpc3QpOwotICAgIHdzZGxzXy5yZWZyZXNoKCk7Ci0gICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIobGlzdC5nZXQoMCkudG9TdHJpbmcoKSk7Ci0gICAgICAvLyBjaGFuZ2UgZXh0ZW5zaW9uIGZyb20gLndzZGwgdG8gLndzaWwKLSAgICAgIGludCBsZW5ndGggPSBwYXRoLmxlbmd0aCgpOwotICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShsZW5ndGgtNCwgbGVuZ3RoLCAid3NpbCIpOwotICAgICAgd3NpbF8uc2V0VGV4dChwYXRoLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIEFyZ3VtZW50cyBnZXRHZW5XU0lMQXJndW1lbnRzKCkKLSAgewotICAgIEFyZ3VtZW50cyBhcmdzID0gbmV3IEFyZ3VtZW50cygpOwotICAgIFN0cmluZyB3c2lsUGF0aCA9IHdzaWxfLmdldFRleHQoKTsKLSAgICBpZiAod3NpbFBhdGguaW5kZXhPZignOicpIDwgMCkKLSAgICAgIGFyZ3MuYWRkKEFkZFdTRExUb1dTSUxDb21tYW5kLkFSR19XU0lMLCBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSh3c2lsXy5nZXRUZXh0KCkpLnRvU3RyaW5nKCkpOwotICAgIGVsc2UKLSAgICAgIGFyZ3MuYWRkKEFkZFdTRExUb1dTSUxDb21tYW5kLkFSR19XU0lMLCB3c2lsUGF0aCk7Ci0gICAgVGFibGVJdGVtW10gaXRlbXMgPSB3c2Rsc18uZ2V0SXRlbXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyB1cmkgPSBpdGVtc1tpXS5nZXRUZXh0KDApOwotICAgICAgaWYgKHVyaS5pbmRleE9mKCc6JykgPCAwKQotICAgICAgewotICAgICAgICBJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UodXJpKTsKLSAgICAgICAgaWYgKHJlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgdXJpID0gcmVzLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkwoKS50b1N0cmluZygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgICAgIHsKLSAgICAgICAgICAJbXVybGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYXJncy5hZGQoQWRkV1NETFRvV1NJTENvbW1hbmQuQVJHX1dTREwsIHVyaSk7Ci0gICAgfQotICAgIGFyZ3MuYWRkKEFkZFdTRExUb1dTSUxDb21tYW5kLkFSR19SRVNPTFZFX1dTREwsIG51bGwpOwotICAgIHJldHVybiBhcmdzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0phdmFCZWFuU2VsZWN0aW9uTGF1bmNoYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0phdmFCZWFuU2VsZWN0aW9uTGF1bmNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE0YzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9KYXZhQmVhblNlbGVjdGlvbkxhdW5jaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjAgICAxMzU5MTIgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA3MTkgICAxNDkzNTIgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uCi0gKiAyMDA2MDgyNiAgIDEzNTU3MCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgU2VydmljZSBpbXBsZW1lbnRhdGlvbiBVUkwgbm90IGRpc3BsYXllZCBwcm9wZXJseSBvbiBmaXJzdCBwYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbEJlYW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2cuRGlhbG9nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQmVhblNlbGVjdGlvbkxhdW5jaGFibGUgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbkxhdW5jaGFibGUgewotCi0JICBwcml2YXRlIElQcm9qZWN0ICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IG51bGw7Ci0JICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lXyA9IG51bGw7CSAgCi0JICBwcml2YXRlIFN0cmluZyBiZWFuQ2xhc3NTdHJpbmdfPSIiOwotCQkgICAKLQkgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLQkgIHsKLQkgICAgaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCAmJiAhaW5pdGlhbFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JICAgIHsKLQkgICAgICBPYmplY3Qgb2JqZWN0ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0JICAgICAgewotCSAgICAgIAlJRmlsZSBpRmlsZSA9IChJRmlsZSlvYmplY3Q7Ci0JICAgICAgCVN0cmluZyBmaWxlRXh0ID0gaUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLnRvTG93ZXJDYXNlKCk7Ci0JICAgICAgCWlmIChmaWxlRXh0LmVxdWFscygiamF2YSIpIHx8IGZpbGVFeHQuZXF1YWxzKCJjbGFzcyIpKQotCSAgICAgICAgICBzZXRCZWFuQ2xhc3MoaUZpbGUpOwotCSAgICAgIH0KLQkgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotCSAgICAgIAlzZXRCZWFuQ2xhc3MoKChJQ29tcGlsYXRpb25Vbml0KW9iamVjdCkuZ2V0UmVzb3VyY2UoKSk7Ci0JICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VydmljZUltcGxCZWFuSW1wbCkKLQkgICAgICAJc2V0QmVhbkNsYXNzKChTZXJ2aWNlSW1wbEJlYW5JbXBsKW9iamVjdCk7Ci0JICAgICAgZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBCZWFuTGluaykKLQkgICAgICAJc2V0QmVhbkNsYXNzKChCZWFuTGluaylvYmplY3QpOwotCSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLQkgICAgCWJlYW5DbGFzc1N0cmluZ18gPSAoU3RyaW5nKSBvYmplY3Q7IC8vIHVzZSBmb3IgZGlzcGxheWFibGUgc3RyaW5nCi0JICAgIH0KLQkgIH0KLQotCSBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLQkgIHsJCSAKLQkgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJlYW5DbGFzc1N0cmluZ18pOwotCSAgfQotCSAgCi0JICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0JICB7Ci0JICAgIHJldHVybiBzZXJ2ZXJQcm9qZWN0XzsKLQkgIH0KLQotCSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkKLQkgIHsKLQkgICAgcmV0dXJuIHNlcnZlckNvbXBvbmVudE5hbWVfOwotCSAgfQotCi0JcHVibGljIGludCBsYXVuY2goU2hlbGwgc2hlbGwpIHsJCQotCQkgICAKLQkJICAgIElUeXBlIGl0eXBlID0gRGlhbG9nVXRpbHMuYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoc2hlbGwsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSwgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkpOwotCQkgICAgaWYgKGl0eXBlICE9IG51bGwpCi0JCSAgICB7Ci0JCSAgICAgICBiZWFuQ2xhc3NTdHJpbmdfID0gaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCSAgICAgIHRyeQotCQkgICAgICB7Ci0JCSAgICAgICAgSVJlc291cmNlIHJlcyA9IGl0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkgICAgICAgIGlmIChyZXMgIT0gbnVsbCkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IHJlcy5nZXRQcm9qZWN0KCk7Ci0JCSAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihyZXMpOwotCQkgICAgICAgICAgaWYgKGNvbXAhPW51bGwpCi0JCSAgICAgICAgICB7Ci0JCSAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWVfID0gY29tcC5nZXROYW1lKCk7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgfQotCQkgICAgICAgIGVsc2UKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IG51bGw7Ci0JCSAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lXyA9IG51bGw7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIHJldHVybiBTdGF0dXMuT0s7Ci0JCSAgICAgIH0KLQkJICAgICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JCSAgICAgIHsKLQkJICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IG51bGw7Ci0JCSAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZV8gPSBudWxsOwotCQkgICAgICAgIHJldHVybiBTdGF0dXMuRVJST1I7Ci0JCSAgICAgIH0KLQkJICAgIH0JCQkgICAgCi0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMOwotCX0JCi0gIAkKLQkgIHByaXZhdGUgdm9pZCBzZXRCZWFuQ2xhc3MoSVJlc291cmNlIHJlc291cmNlKQotCSAgewotCSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICkKLQkgICAgewotCSAgICAgIElQYXRoICBwYXRoICAgICA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JICAgICAgU3RyaW5nIGJhc2VuYW1lID0gcGF0aC5sYXN0U2VnbWVudCgpOwotCSAgICAgIAotCSAgICAgIGlmKCBiYXNlbmFtZSAhPSBudWxsICYmIGJhc2VuYW1lLmxlbmd0aCgpID4gMCApCi0JICAgICAgewotCSAgICAgICAgU3RyaW5nIGJlYW5QYWNrYWdlID0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKHBhdGgpOwotCSAgICAgICAgU3RyaW5nIGJlYW5DbGFzcyA9IChiZWFuUGFja2FnZSA9PSBudWxsIHx8IGJlYW5QYWNrYWdlLmxlbmd0aCgpID09IDAgPyBiYXNlbmFtZSA6IChiZWFuUGFja2FnZSArICIuIiArIGJhc2VuYW1lKSk7Ci0JICAgICAgICAKLQkgICAgICAgIGlmKCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIiApICkKLQkgICAgICAgIHsKLQkgICAgICAgICAgYmVhbkNsYXNzID0gYmVhbkNsYXNzLnN1YnN0cmluZyggMCwgYmVhbkNsYXNzLmxhc3RJbmRleE9mKCcuJykgKTsKLQkgICAgICAgIH0KLQkgICAgICAgIAotCSAgICAgICAgYmVhbkNsYXNzU3RyaW5nXyA9IGJlYW5DbGFzczsKLQkgICAgICAgIHNlcnZlclByb2plY3RfID0gIFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHBhdGgpOwotCSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YocmVzb3VyY2UpOwotCSAgICAgICAgCi0JICAgICAgICBpZiAoY29tcCE9bnVsbCkKLQkgICAgICAgIHsJCi0JICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWVfID0gY29tcC5nZXROYW1lKCk7Ci0JICAgICAgICB9ICAgICAgICAKLQkgICAgICAgIAotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCi0JICBwcml2YXRlIHZvaWQgc2V0QmVhbkNsYXNzKFNlcnZpY2VJbXBsQmVhbkltcGwgc2VydmljZUltcGwpCi0JICB7Ci0JICAgIGlmKCBzZXJ2aWNlSW1wbCAhPSBudWxsICkKLQkgICAgewotCSAgICAgIEVPYmplY3QgZU9iamVjdCA9IHNlcnZpY2VJbXBsLmVDb250YWluZXIoKTsKLQkgICAgICBpZihlT2JqZWN0IGluc3RhbmNlb2YgUG9ydENvbXBvbmVudEltcGwpewotCSAgICAgIAlQb3J0Q29tcG9uZW50SW1wbCBwY2kgPSAoUG9ydENvbXBvbmVudEltcGwpZU9iamVjdDsKLQkgICAgICAJYmVhbkNsYXNzU3RyaW5nXyA9IHBjaS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsJICAgICAgCQotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCSAgCi0JICBwcml2YXRlIHZvaWQgc2V0QmVhbkNsYXNzKEJlYW5MaW5rIHNlcnZpY2VJbXBsKQotCSAgewotCSAgICBpZiggc2VydmljZUltcGwgIT0gbnVsbCApCi0JICAgIHsKLQkgICAgICBFT2JqZWN0IGVPYmplY3QgPSBzZXJ2aWNlSW1wbC5lQ29udGFpbmVyKCk7Ci0JICAgICAgaWYoZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbkltcGwpewotCSAgICAgIAlzZXRCZWFuQ2xhc3MoKFNlcnZpY2VJbXBsQmVhbkltcGwpZU9iamVjdCk7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpCi0JICB7Ci0JCWlmIChiZWFuQ2xhc3NTdHJpbmdfLmxlbmd0aCgpIDw9IDApCi0JICAgIHsKLQkgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfTVNHX0JFQU5fQ0FOTk9UX0JFX0VNUFRZKTsKLQkgICAgfQotCSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkgIH0KLQkgIAotCSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotCSAgewotCSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkgIH0KLQkgIAotCSAgcHVibGljIFN0cmluZyBnZXRPYmplY3RTZWxlY3Rpb25EaXNwbGF5YWJsZVN0cmluZygpIHsJCSAgCi0JCQkgIHJldHVybiBiZWFuQ2xhc3NTdHJpbmdfOwotCSAgfQotCSAgCi0JICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgcykgewotCQkgIGJlYW5DbGFzc1N0cmluZ18gPSBzOwotCQkgIGlmIChzLmxlbmd0aCgpID4gMCkKLQkJICB7CQkKLQkJCSAgcmV0dXJuIHRydWU7Ci0JCSAgfQotICAJCSAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHJlZmVyZW5jZXNTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2ZjNzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5XU1VJUGx1Z2luTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17ICAgIAotICBwcml2YXRlIFJlc291cmNlQ29udGV4dCBjb250ZXh0XzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwMyBmb3IgdGhlIE92ZXJ3cml0ZSBGaWxlcyBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMgPSAiUFdQUjAwMDMiOwotICBwcml2YXRlIEJ1dHRvbiBvdmVyd3JpdGVGaWxlc0NoZWNrYm94XzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwNCBmb3IgdGhlIENyZWF0ZSBGb2xkZXJzIGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTID0gIlBXUFIwMDA0IjsKLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlRm9sZGVyc0NoZWNrYm94XzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxNSBmb3IgdGhlIENoZWNrIE91dCBGaWxlcyBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9DSEVDS09VVF9GSUxFUyA9ICJQV1BSMDAxNSI7ICAKLSAgcHJpdmF0ZSBCdXR0b24gY2hlY2tvdXRGaWxlc0NoZWNrYm94XzsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNhZGRDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgU3RyaW5nICAgICAgIGNvblBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIAlVSVV0aWxzICAgICAgdXRpbHMgICAgICAgPSBuZXcgVUlVdGlscyggY29uUGx1Z2luSWQgKTsKLSAgCQotICAgIENvbXBvc2l0ZSByZXNvdXJjZXNHcm91cCA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAxICk7Ci0gICAgCi0gICAgb3ZlcndyaXRlRmlsZXNDaGVja2JveF8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggcmVzb3VyY2VzR3JvdXAsIFdTVUlQbHVnaW5NZXNzYWdlcy5CVVRUT05fT1ZFUldSSVRFX0ZJTEVTLAotICAgIAkJV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFBSTV9DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjcmVhdGVGb2xkZXJzQ2hlY2tib3hfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIHJlc291cmNlc0dyb3VwLCBXU1VJUGx1Z2luTWVzc2FnZXMuQlVUVE9OX0NSRUFURV9GT0xERVJTLAotICAgIAkJV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DUkVBVEVfRk9MREVSUyAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjaGVja291dEZpbGVzQ2hlY2tib3hfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIHJlc291cmNlc0dyb3VwLCBXU1VJUGx1Z2luTWVzc2FnZXMuQlVUVE9OX0NIRUNLT1VUX0ZJTEVTLAotICAgIAkJV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0NIRUNLT1VUX0ZJTEVTICk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCBjb250ZXh0ICkKLSAgeyAKLSAgICBvdmVyd3JpdGVGaWxlc0NoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSApOwotICAgIGNyZWF0ZUZvbGRlcnNDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBjb250ZXh0LmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSApOwotICAgIGNoZWNrb3V0RmlsZXNDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBjb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSApOyAKLSAgICAKLSAgICBjb250ZXh0XyA9IGNvbnRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkgCi0gIHsgICAgCi0gICAgY29udGV4dF8uc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKCBvdmVyd3JpdGVGaWxlc0NoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKSApOwotICAgIGNvbnRleHRfLnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKCBjcmVhdGVGb2xkZXJzQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpICk7Ci0gICAgY29udGV4dF8uc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoIGNoZWNrb3V0RmlsZXNDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgICAKLSAgICByZXR1cm4gY29udGV4dF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9Qcm9qZWN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHJvamVjdFNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDkxNmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9Qcm9qZWN0U2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDEzICAgMTM1NTgxIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA4MDIgICAxNDg3MzEgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLlByb2plY3RTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuUGFnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIFNpbXBsZURpYWxvZyB7Ci0KLQlTdHJpbmcgdGl0bGVUZXh0Xz0iIjsKLQlTdHJpbmcgcHJvamVjdE5hbWVfPSIiOwotCVN0cmluZyBlYXJQcm9qZWN0TmFtZV89IiI7Ci0JU3RyaW5nIGNvbXBvbmVudFR5cGVfPSIiOwotCVR5cGVSdW50aW1lU2VydmVyIHRyc187Ci0JYm9vbGVhbiBuZWVkRUFSXzsKLQkKLQlwdWJsaWMgUHJvamVjdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgUGFnZUluZm8gcGFnZUluZm8pCi0JewotCQlzdXBlcihzaGVsbCwgcGFnZUluZm8pOwotCQl0aXRsZVRleHRfID0gcGFnZUluZm8uZ2V0UGFnZU5hbWUoKTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIGNhbGxTZXR0ZXJzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVByb2plY3RTZWxlY3Rpb25XaWRnZXQgcHJvaldpZGdldCA9IChQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KWdldFdpZGdldCgpOwkJCi0JCXByb2pXaWRnZXQuc2V0RWFyUHJvamVjdE5hbWUoZWFyUHJvamVjdE5hbWVfKTsKLQkJcHJvaldpZGdldC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZV8pOwotCQlwcm9qV2lkZ2V0LnNldENvbXBvbmVudFR5cGUoY29tcG9uZW50VHlwZV8pOwotCQlwcm9qV2lkZ2V0LnNldE5lZWRFQVIobmVlZEVBUl8pOwotCQlwcm9qV2lkZ2V0LnNldFR5cGVSdW50aW1lU2VydmVyKHRyc18pOwotCQkKLQkJcHJvaldpZGdldC5yZWZyZXNoUHJvamVjdEl0ZW1zKCk7Ci0JfQotCQotCSAgcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkKLQkgIHsKLQkgICAgcmV0dXJuIHRoaXMuZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZSgyNTAsIFNXVC5ERUZBVUxULCB0cnVlKTsgCi0JICB9Ci0KLQotCSAgcHJvdGVjdGVkIHZvaWQgc2V0U2hlbGxTdHlsZShpbnQgbmV3U2hlbGxTdHlsZSkKLQkgIHsKLQkgICAgc3VwZXIuc2V0U2hlbGxTdHlsZSggbmV3U2hlbGxTdHlsZSB8IFNXVC5SRVNJWkUgKTsgIAotCSAgfQotCi0JICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkKLQkgIHsKLQkgICAgbmV3U2hlbGwuc2V0VGV4dCh0aXRsZVRleHRfKTsgICAKLQkgICAgc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCSAgfQkKLQkJCi0JCXB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBuYW1lKQotCQkgIHsKLQkJCQlwcm9qZWN0TmFtZV8gPSBuYW1lOwotCQkgIH0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKQotCQkgIHsKLQkJCQlyZXR1cm4gcHJvamVjdE5hbWVfOwotCQkgIH0KLQkJCi0JCSBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkKLQkJICB7CQkJCi0JCQkJZWFyUHJvamVjdE5hbWVfID0gbmFtZTsKLQkJICB9IAotCQkgCi0JCSBwdWJsaWMgU3RyaW5nIGdldEVhclByb2plY3ROYW1lKCkKLQkJIHsKLQkJCSByZXR1cm4gZWFyUHJvamVjdE5hbWVfOwotCQkgfQotCQkgCi0JCSBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0Q29tcG9uZW50VHlwZSggU3RyaW5nIHR5cGUgKQotCQkgIHsKLQkJCSAgICBjb21wb25lbnRUeXBlXyA9IHR5cGU7Ci0JCSAgfQotCi0JCSBwdWJsaWMgU3RyaW5nIGdldFByb2plY3RDb21wb25lbnRUeXBlKCkKLQkJICB7Ci0JCQkgcmV0dXJuIGNvbXBvbmVudFR5cGVfOwotCQkgIH0KLQkJIAotCQkgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIGIpCi0JCSAgewotCQkJICAgIG5lZWRFQVJfID0gYjsJCQkgICAgCi0JCSAgfQotCQkgCi0JCSBwdWJsaWMgYm9vbGVhbiBnZXROZWVkRUFSKCkKLQkJICB7Ci0JCQkgICAgcmV0dXJuIG5lZWRFQVJfOwkJCQkKLQkJICB9Ci0JCSAKLQkJIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHRycykKLQkJIHsKLQkJCSAgICB0cnNfID0gdHJzOyAKLQkJIH0KLQkJIAotCQkgcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0KLQkJCXByb2plY3ROYW1lXyA9ICgoUHJvamVjdFNlbGVjdGlvbldpZGdldClnZXRXaWRnZXQoKSkuZ2V0UHJvamVjdE5hbWUoKTsKLQkJCWVhclByb2plY3ROYW1lXyA9ICgoUHJvamVjdFNlbGVjdGlvbldpZGdldClnZXRXaWRnZXQoKSkuZ2V0RWFyUHJvamVjdE5hbWUoKTsgCi0JCQluZWVkRUFSXyA9ICgoUHJvamVjdFNlbGVjdGlvbldpZGdldClnZXRXaWRnZXQoKSkuZ2V0TmVlZEVBUigpOwotCQkJY29tcG9uZW50VHlwZV8gPSAoKFByb2plY3RTZWxlY3Rpb25XaWRnZXQpZ2V0V2lkZ2V0KCkpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCXJldHVybiBzdXBlci5jbG9zZSgpOwotCQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTY0OTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkFic3RyYWN0Q29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudAotewotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeTsKLSAgcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hUb1ByaXZhdGVVRERJOwotICBwcml2YXRlIENvbW1hbmRXaWRnZXRCaW5kaW5nIHByaXZhdGVVRERJQmluZGluZzsKLSAgCi0gIHB1YmxpYyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpCi0gIHsKLSAgICBzdXBlcihudWxsLCAiIik7Ci0gICAgcHJpdmF0ZVVERElCaW5kaW5nID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkuZ2V0QmluZGluZygpOwotICB9Ci0KLSAgLyoqIAotICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICoKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgewotICAgIGlmIChwcml2YXRlVURESUJpbmRpbmcgIT0gbnVsbCAmJiBwdWJsaXNoVG9Qcml2YXRlVURESSAmJiAhUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkuaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCkpCi0gICAgewotICAgICAgcHJpdmF0ZVVERElCaW5kaW5nLnJlZ2lzdGVyQ2FuRmluaXNoKGNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgICAgIHByaXZhdGVVRERJQmluZGluZy5yZWdpc3RlckRhdGFNYXBwaW5ncyhkYXRhTWFwcGluZ1JlZ2lzdHJ5KTsKLSAgICAgIHByaXZhdGVVRERJQmluZGluZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgICAgIHJldHVybiBwcml2YXRlVURESUJpbmRpbmcuY3JlYXRlKCkuY3JlYXRlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50KQotICB7Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1hcHBpbmdzIGZvciB0aGlzIGNvbW1hbmQgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gIAlkYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuY2FuRmluaXNoUmVnaXN0cnkgPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLndpZGdldFJlZ2lzdHJ5ID0gd2lkZ2V0UmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICAqIEFsbCB3aXphcmQgZnJhZ21lbnRzIG5lZWQgdG8gYmUgY2xvbmVhYmxlLgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgCWZyYWdtZW50LnNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKHB1Ymxpc2hUb1ByaXZhdGVVRERJKTsKLSAgCXJldHVybiBmcmFnbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKGJvb2xlYW4gcHVibGlzaCkKLSAgewotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJID0gcHVibGlzaDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoV1NXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoV1NXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NGY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHVibGlzaFdTV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS51ZGRpLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uczsKLQotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFdTV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIC8qIENPTlRFWFRfSUQgUFdQQjAwMDEgZm9yIHRoZSBVRERJIFB1Ymxpc2ggUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUEJfUEFHRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1BCMDAwMSI7Ci0gIC8qIENPTlRFWFRfSUQgUFdQQjAwMDIgZm9yIHRoZSBVRERJIExhdW5jaCBjaGVjayBib3ggb2YgdGhlIFVEREkgUHVibGlzaCBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0ggPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdQQjAwMDIiOwotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hVRERJQ2hlY2tib3hfOwotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94XzsKLSAgcHJpdmF0ZSBMYWJlbCBwdWJpbGNVRERJUmVnQ29tYm9MYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gcHVibGljVURESVJlZ0NvbWJvXzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBCb29sZWFuIHB1Ymxpc2g7Ci0KLSAgcHVibGljIFB1Ymxpc2hXU1dpZGdldChib29sZWFuIHB1Ymxpc2gpCi0gIHsKLQkgIHRoaXMucHVibGlzaCA9IG5ldyBCb29sZWFuKHB1Ymxpc2gpOwotICB9Ci0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICB0aGlzLnN0YXR1c0xpc3RlbmVyID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgTGlzdGVuZXIgc2VsTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBoYW5kbGVTZWxlY3Rpb25FdmVudChldmVudCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBwYXJlbnQuc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdQQl9QQUdFKTsKLSAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9QV1BCX1BBR0UpOwotICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgaWYgKHB1Ymxpc2guYm9vbGVhblZhbHVlKCkpCi0gICAgICBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94Xy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5CVVRUT05fV1NfUFVCTElTSF9QUklWQVRFX1VEREkpOwotICAgIGVsc2UKLSAgICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkJVVFRPTl9XU19GSU5EX1BSSVZBVEVfVURESSk7Ci0gICAgbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0gpOwotICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNlbExpc3RlbmVyKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAobGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8sIElORk9QT1BfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0gpOwotICAgIGxhdW5jaFVERElDaGVja2JveF8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICBpZiAocHVibGlzaC5ib29sZWFuVmFsdWUoKSkKLSAgICAgIGxhdW5jaFVERElDaGVja2JveF8uc2V0VGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX1dTX1BVQkxJU0gpOwotICAgIGVsc2UKLSAgICAgIGxhdW5jaFVERElDaGVja2JveF8uc2V0VGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX1dTX0ZJTkQpOwotICAgIGxhdW5jaFVERElDaGVja2JveF8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0gpOwotICAgIGxhdW5jaFVERElDaGVja2JveF8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc2VsTGlzdGVuZXIpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChsYXVuY2hVRERJQ2hlY2tib3hfLCBJTkZPUE9QX1BXUEJfQ0hFQ0tCT1hfV1NfTEFVTkNIKTsKLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDM7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYy5zZXRMYXlvdXQoZ2wpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgYy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBuZXcgTGFiZWwoYywgU1dULldSQVApOwotICAgIHB1YmlsY1VERElSZWdDb21ib0xhYmVsXyA9IG5ldyBMYWJlbChjLCBTV1QuV1JBUCk7Ci0gICAgcHViaWxjVURESVJlZ0NvbWJvTGFiZWxfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1BVQkxJQ19VRERJX1JFR0lTVFJJRVMpOwotICAgIHB1YmxpY1VERElSZWdDb21ib18gPSBuZXcgQ29tYm8oYywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHB1YmxpY1VERElSZWdDb21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgaW5pdFB1YmxpY1VEREkoKTsKLSAgICBpbml0UHJpdmF0ZVVEREkoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0UHVibGljVURESSgpCi0gIHsKLSAgICBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgcmVnID0gUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gcmVnLmdldEFsbFB1YmxpY1VERElSZWdpc3RyeVR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocHVibGlzaC5ib29sZWFuVmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gSWdub3JlIHJlYWQtb25seSByZWdpc3RyaWVzLgotICAgICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHR5cGVzW2ldLmdldFB1Ymxpc2hVUkwoKTsKLSAgICAgICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCB8fCBwdWJsaXNoVVJMLmluZGV4T2YoIjovLyIpID09IC0xKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcHVibGljVURESVJlZ0NvbWJvXy5hZGQodHlwZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgaWYgKHR5cGVzLmxlbmd0aCA+IDApCi0gICAgICBwdWJsaWNVRERJUmVnQ29tYm9fLnNldFRleHQocHVibGljVURESVJlZ0NvbWJvXy5nZXRJdGVtKDApKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0UHJpdmF0ZVVEREkoKQotICB7Ci0gICAgaWYgKCFwdWJsaXNoLmJvb2xlYW5WYWx1ZSgpICYmICFQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkKLSAgICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldEVuYWJsZWQoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdGlvbkV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGxhdW5jaFVERElDaGVja2JveF8gPT0gZXZlbnQud2lkZ2V0KQotICAgICAgcHVibGljVURESVJlZ0NvbWJvXy5zZXRFbmFibGVkKGxhdW5jaFVERElDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkpOwotICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1B1YmxpY1VEREkoYm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgbGF1bmNoVURESUNoZWNrYm94Xy5zZXRTZWxlY3Rpb24ocHVibGlzaCk7Ci0gICAgcHVibGljVURESVJlZ0NvbWJvXy5zZXRFbmFibGVkKHB1Ymxpc2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHVibGljVURESShCb29sZWFuIHB1Ymxpc2gpCi0gIHsKLSAgICBzZXRQdWJsaXNoVG9QdWJsaWNVRERJKHB1Ymxpc2guYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoYm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8uc2V0U2VsZWN0aW9uKHB1Ymxpc2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoQm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkocHVibGlzaC5ib29sZWFuVmFsdWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoVG9QdWJsaWNVRERJKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoKQotICB7Ci0gICAgcmV0dXJuIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yY2VMYXVuY2hPdXRzaWRlSURFKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBMYXVuY2hPcHRpb25bXSBnZXRMYXVuY2hPcHRpb25zKCkKLSAgewotICAgIFZlY3RvciBsYXVuY2hPcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKGxhdW5jaFVERElDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkpCi0gICAgewotICAgICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IHJlZyA9IFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgaW50IFVERElSZWdTZWxlY3Rpb25JbmRleCA9IHB1YmxpY1VERElSZWdDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChVRERJUmVnU2VsZWN0aW9uSW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gcHVibGljVURESVJlZ0NvbWJvXy5nZXRJdGVtKFVERElSZWdTZWxlY3Rpb25JbmRleCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IHJlZy5nZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlSURCeU5hbWUobmFtZSk7Ci0gICAgICAgIFB1YmxpY1VERElSZWdpc3RyeVR5cGUgdHlwZSA9IHJlZy5nZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlQnlJRChpZCk7Ci0gICAgICAgIGxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLklOUVVJUllfVVJMLCB0eXBlLmdldElucXVpcnlVUkwoKSkpOwotICAgICAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5QVUJMSVNIX1VSTCwgdHlwZS5nZXRQdWJsaXNoVVJMKCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgcHJpdmF0ZVJlZyA9IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHByaXZhdGVUeXBlID0gcHJpdmF0ZVJlZy5nZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpOwotICAgICAgU3RyaW5nW10gcHJpdmF0ZUlucXVpcnlVUkwgPSBwcml2YXRlVHlwZS5nZXRQcml2YXRlVURESVJlZ2lzdHJ5SW5xdWlyeUFQSSgpOwotICAgICAgU3RyaW5nW10gcHJpdmF0ZVB1Ymxpc2hVUkwgPSBwcml2YXRlVHlwZS5nZXRQcml2YXRlVURESVJlZ2lzdHJ5UHVibGlzaEFQSSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcml2YXRlSW5xdWlyeVVSTC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuSU5RVUlSWV9VUkwsIHByaXZhdGVJbnF1aXJ5VVJMW2ldKSk7Ci0gICAgICAgIGxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlBVQkxJU0hfVVJMLCBwcml2YXRlUHVibGlzaFVSTFtpXSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKExhdW5jaE9wdGlvbltdKSBsYXVuY2hPcHRpb25WZWN0b3IudG9BcnJheShuZXcgTGF1bmNoT3B0aW9uWzBdKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1NlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZWFiMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1NlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDA0ICAgMTM0OTEzIHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdSAgIAotICogMjAwNjA1MTcgICAxNDIwMjcgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA2MDUxOCAgIDE0MjU1NCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotICogCi0gKiBJbml0aWFsaXplIGFuZCBsb2FkIHRoZSBoYW5kbGVycyBkYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kIHsKLQotICBwcml2YXRlIFdzZGRSZXNvdXJjZVtdIHdzZGRSZXNvdXJjZV8gPSBudWxsOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbk5hbWVfID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JTdGF0dXNNc2dfID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIGlzTXVsdGlwbGVTZWxlY3Rpb25fOwotICBwcml2YXRlIEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcltdIGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl87Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsgICAgCi0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIAotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldEluaXRpYWxTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQgKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCk+MSl7Ci0gICAgCXN0YXR1cyA9IHByb2Nlc3NNdWx0aXBsZUhhbmRsZXJzKGVudik7Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHJvY2Vzc0hhbmRsZXJzKGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgcHJvY2Vzc0hhbmRsZXJzKElFbnZpcm9ubWVudCBlbnYpIHsKLSAgICB0cnkgewotICAgICAgV2ViU2VydmljZXNNYW5hZ2VyIHdlYlNlcnZpY2VzTWFuYWdlciA9IG5ldyBXZWJTZXJ2aWNlc01hbmFnZXIoKTsKLSAgICAgIExpc3QgYWxsV1NETFNlcnZpY2VzID0gd2ViU2VydmljZXNNYW5hZ2VyLmdldEFsbFdTRExTZXJ2aWNlcygpOwotICAgICAgaW50IHNlcnZpY2VzU2l6ZSA9IGFsbFdTRExTZXJ2aWNlcy5zaXplKCk7Ci0KLSAgICAgIHdzZGRSZXNvdXJjZV89IG5ldyBXc2RkUmVzb3VyY2Vbc2VydmljZXNTaXplXTsKLSAgICAgIHdzZGRSZXNvdXJjZV9bMF0gPSBnZXRXc2RkUmVzb3VyY2VGcm9tU2VsZWN0aW9uKCk7Ci0gICAgICBpZiAod3NkZFJlc291cmNlX1swXSA9PSBudWxsKSB7Ci0gICAgICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfV1NERF9OT1RfRk9VTkQpOwotICAgICAgfQotICAgICAKLSAgICAgIC8vIGNoZWNrIGZvciBhbm90aGVyIHdzZGRSZXNvdXJjZSBvZiBhbm90aGVyIEoyRUUgbGV2ZWwKLSAgICAgIGludCB4ID0gMDsKLSAgICAgIHdoaWxlICh4PHNlcnZpY2VzU2l6ZSkgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSApYWxsV1NETFNlcnZpY2VzLmdldCh4KTsKLSAgICAgICAgV3NkZFJlc291cmNlIHdzZGRSZXMgPSB3ZWJTZXJ2aWNlc01hbmFnZXIuZ2V0V3NkZFJlc291cmNlKHNlcnZpY2UpOwotICAgICAgICBib29sZWFuIGlzVW5pcXVlV3NkZCA9IHRydWU7Ci0gICAgICAgIGZvciAoaW50IHc9MDt3PHdzZGRSZXNvdXJjZV8ubGVuZ3RoO3crKyl7Ci0gICAgICAgIAlpZiAod3NkZFJlcy5lcXVhbHMod3NkZFJlc291cmNlX1t3XSkpewotICAgICAgICAJCWlzVW5pcXVlV3NkZCA9IGZhbHNlOwotICAgICAgICAJCWJyZWFrOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaXNVbmlxdWVXc2RkKSB7Ci0gICAgICAgICAgd3NkZFJlc291cmNlX1t4XSA9IHdzZGRSZXM7Ci0gICAgICAgIH0KLSAgICAgICAgeCsrOwotICAgICAgfQotCi0gICAgICAvLyBkZXRlcm1pbmUgdG90YWwgIyBmb3IgZGVzY3JpcHRpb25zCi0gICAgICBoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcltnZXROdW1iZXJvZlNlcnZpY2VzKHdzZGRSZXNvdXJjZV8pXTsKLSAgICAgIAotICAgICAgaW50IGRlc2NDb3VudGVyID0gMDsKLSAgICAgIGZvciAoaW50IHk9MDt5PHdzZGRSZXNvdXJjZV8ubGVuZ3RoO3krKykgewotICAgICAgICBpZiAod3NkZFJlc291cmNlX1t5XSAhPW51bGwpIHsKLQkgICAgICAgIFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzID0gd3NkZFJlc291cmNlX1t5XS5nZXRXZWJTZXJ2aWNlcygpOwotCSAgICAgICAgaWYgKHdlYlNlcnZpY2VzICE9IG51bGwpIHsKLQkgICAgICAgICAgTGlzdCB3c0Rlc2NyaXB0aW9ucyA9IHdlYlNlcnZpY2VzLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKTsKLQkgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c0Rlc2NyaXB0aW9ucy5zaXplKCkgOyBpKyspIHsKLQkgCi0JICAgICAgICAgICAgV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzY3JpcHRpb24gPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSB3c0Rlc2NyaXB0aW9ucy5nZXQoaSk7Ci0JICAgICAgICAgICAgVmVjdG9yIGhhbmRsZXJzID0gbmV3IFZlY3RvcigpOyAgCi0JICAgICAgICAgICAgTGlzdCB3c1BvcnRDb21wb25lbnRzID0gd3NEZXNjcmlwdGlvbi5nZXRQb3J0Q29tcG9uZW50cygpOwotCSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd3NQb3J0Q29tcG9uZW50cy5zaXplKCk7IGorKykgewotCSAgICAgICAgICAgICAgUG9ydENvbXBvbmVudCB3c1BvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0Q29tcG9uZW50cy5nZXQoaik7Ci0JICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSB3c1BvcnQuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsKLQkgICAgICAgICAgICAgIExpc3Qgd3NIYW5kbGVycyA9IHdzUG9ydC5nZXRIYW5kbGVycygpOwotCSAgICAgCi0JICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdzSGFuZGxlcnMuc2l6ZSgpOyBrKyspIHsKLQkgIAotCSAgICAgICAgICAgICAgICBIYW5kbGVyIHdzSGFuZGxlciA9IChIYW5kbGVyKSB3c0hhbmRsZXJzLmdldChrKTsKLQkgIAotCSAgICAgICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGhhbmRsZXJJdGVtID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW0oKTsKLQkgICAgICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlcih3c0hhbmRsZXIpOwotCSAgICAgICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyTmFtZSh3c0hhbmRsZXIuZ2V0SGFuZGxlck5hbWUoKSk7Ci0JICAgICAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldEhhbmRsZXJDbGFzc05hbWUod3NIYW5kbGVyLmdldEhhbmRsZXJDbGFzcygpKTsKLQkgICAgICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0UG9ydCh3c1BvcnQpOwotCSAgICAgICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRQb3J0TmFtZShwb3J0TmFtZSk7Ci0JICAgICAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldFdzRGVzY1JlZih3c0Rlc2NyaXB0aW9uKTsKLQkgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVySXRlbSk7Ci0JICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIFN0cmluZyB3c0Rlc2NOYW1lID0gd3NEZXNjcmlwdGlvbi5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCk7Ci0JICAgICAgICAgICAgaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyX1tkZXNjQ291bnRlcl0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyKCk7Ci0JICAgICAgICAgICAgaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyX1tkZXNjQ291bnRlcl0uc2V0SGFuZGxlckxpc3QoaGFuZGxlcnMpOwotCSAgICAgICAgICAgIGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl9bZGVzY0NvdW50ZXJdLnNldERlc2NyaXB0aW9uT2JqZWN0KHdzRGVzY3JpcHRpb24pOwotCSAgICAgICAgICAgIGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl9bZGVzY0NvdW50ZXJdLnNldERlc2NyaXB0aW9uTmFtZSh3c0Rlc2NOYW1lKTsKLQkgICAgICAgICAgICBkZXNjQ291bnRlcisrOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXyA9PSBudWxsKXsKLSAgICAgICAgICAvL3JlcG9ydCBubyBXZWIgc2VydmljZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9XRUJfU0VSVklDRVNfTk9UX0ZPVU5EKTsgICAgICAgIAotICAgICAgfSAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVEFTS19FWENFUFRFRCwgZSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvciBwcm9jZXNzaW5nIG11bHRpcGxlIHNlcnZpY2Ugc2VsZWN0aW9uOyBvbmx5IHByZXBhcmUgdGFibGUgb2Ygc2VydmljZSBkZXNjcmlwdGlvbiBuYW1lcwotICAgKiBkZXNjcmlwdGlvbiBvYmplY3RzIHdpbGwgYmUgcHJvY2Vzc2VkIGxhdGVyIGJ5IHRoZSBvdXRwdXQgY29tbWFuZCAKLSAgICogQHBhcmFtIGVudgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIElTdGF0dXMgcHJvY2Vzc011bHRpcGxlSGFuZGxlcnMoSUVudmlyb25tZW50IGVudil7Ci0KLQkgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IGdldFNlbGVjdGVkU2VydmljZXMoKTsKLSAgICAgIGlmIChlcnJvclN0YXR1c01zZ18gIT0gbnVsbCl7Ci0gICAgCSAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKGVycm9yU3RhdHVzTXNnXyk7Ci0gICAgICB9Ci0gICAgICBpc011bHRpcGxlU2VsZWN0aW9uXyA9IHRydWU7Ci0KLSAgICAgIGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl8gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyW3NlcnZpY2VzLmxlbmd0aF07Ci0gICAgICBWZWN0b3IgaGFuZGxlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlcy5sZW5ndGg7aSsrKXsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBkZXNjTmFtZSA9IHNlcnZpY2VzW2ldLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c0Rlc2NyaXB0aW9uID0gZ2V0U2VydmljZURlc2NyaXB0aW9uKHNlcnZpY2VzW2ldLCBkZXNjTmFtZSk7Ci0gICAgICAgIGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl9baV0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyKCk7Ci0gICAgICAgIGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl9baV0uc2V0SGFuZGxlckxpc3QoaGFuZGxlcnMpOwotICAgICAgICBoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfW2ldLnNldERlc2NyaXB0aW9uTmFtZShkZXNjTmFtZSk7Ci0gICAgICAgIGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl9baV0uc2V0RGVzY3JpcHRpb25PYmplY3Qod3NEZXNjcmlwdGlvbik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgLyoqCi0gICAqIE1hdGNoZXMgdGhlIHNlcnZpY2VOYW1lIHdpdGggdGhlIFNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgdG8gZ2V0IHRoZSBXZWJTZXJ2aWNlRGVzY3JpcHRpb24KLSAgICogQHBhcmFtIHNlcnZpY2UKLSAgICogQHBhcmFtIHNlcnZpY2VOYW1lCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgV2ViU2VydmljZURlc2NyaXB0aW9uIGdldFNlcnZpY2VEZXNjcmlwdGlvbihTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBzZXJ2aWNlTmFtZSl7Ci0gICAgV2ViU2VydmljZXNNYW5hZ2VyIHdlYlNlcnZpY2VzTWFuYWdlciA9IG5ldyBXZWJTZXJ2aWNlc01hbmFnZXIoKTsKLSAgICBXc2RkUmVzb3VyY2Ugd3NkZFJlc291cmNlID0gd2ViU2VydmljZXNNYW5hZ2VyLmdldFdzZGRSZXNvdXJjZShzZXJ2aWNlKTsKLSAgICBpZiAod3NkZFJlc291cmNlIT1udWxsKSB7Ci0gICAgICBXZWJTZXJ2aWNlcyBzZXJ2aWNlcyA9IHdzZGRSZXNvdXJjZS5nZXRXZWJTZXJ2aWNlcygpOwotICAgICAgaWYgKHNlcnZpY2VzIT1udWxsKSB7Ci0gICAgICAgIExpc3QgZGVzY3JpcHRpb25zICA9IHNlcnZpY2VzLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25zLnNpemUoKTtpKyspewotICAgICAgICAgIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c2QgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKWRlc2NyaXB0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgaWYgKHdzZCE9bnVsbCAmJiB3c2QuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpLmVxdWFscyhzZXJ2aWNlTmFtZSkpewotICAgICAgICAgICAgcmV0dXJuIHdzZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldElzTXVsdGlwbGVTZWxlY3Rpb24oKXsKLQkgIHJldHVybiB0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb25fOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0dlblNrZWxldG9uRW5hYmxlZF8uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5Ta2VsZXRvbkVuYWJsZWQoKSB7Ci0gICAgaWYgKGlzTXVsdGlwbGVTZWxlY3Rpb25fKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc291cmNlT3V0cHV0TG9jYXRpb25fLgotICAgKi8KLSAgcHVibGljIElQYXRoW10gZ2V0U291cmNlT3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgSVBhdGhbXSBsb2NhdGlvbnMgPSBudWxsOwotICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0KLSAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICBsb2NhdGlvbnMgPSBSZXNvdXJjZVV0aWxzLmdldEFsbEphdmFTb3VyY2VMb2NhdGlvbnMocHJvamVjdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcHJvamVjdCA9IHByb2plY3RfOwotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICBsb2NhdGlvbnMgPSBSZXNvdXJjZVV0aWxzLmdldEFsbEphdmFTb3VyY2VMb2NhdGlvbnMocHJvamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsb2NhdGlvbnM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgV3NkZFJlc291cmNlCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBXc2RkUmVzb3VyY2VbXSBnZXRXc2RkUmVzb3VyY2UoKSB7Ci0gICAgcmV0dXJuIHdzZGRSZXNvdXJjZV87Ci0gIH0KLQotICBwcml2YXRlIFdzZGRSZXNvdXJjZSBnZXRXc2RkUmVzb3VyY2VGcm9tU2VsZWN0aW9uKCkgewotICAgIFdlYlNlcnZpY2VzTWFuYWdlciB3ZWJTZXJ2aWNlc01hbmFnZXIgPSBuZXcgV2ViU2VydmljZXNNYW5hZ2VyKCk7Ci0KLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0U2VsID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChpbml0U2VsICE9IG51bGwgJiYgaW5pdFNlbC5zaXplKCkgPT0gMSkgewotICAgICAgT2JqZWN0IG9iaiA9IGluaXRTZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgU2VydmljZUltcGwpIHsKLSAgICAgICAgLy8gU2VydmljZSBvYmplY3QKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIG9iajsKLSAgICAgICAgZGVzY3JpcHRpb25OYW1lXyA9IHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZSk7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlc01hbmFnZXIuZ2V0V3NkZFJlc291cmNlKHNlcnZpY2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkgewotICAgICAgICAvLyBXU0RMIHJlc291cmNlCi0gICAgICAgIFdTRExSZXNvdXJjZUltcGwgcmVzID0gKFdTRExSZXNvdXJjZUltcGwpIG9iajsKLSAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzKTsKLSAgICAgICAgTGlzdCB3c2RsUmVzb3VyY2VzID0gd2ViU2VydmljZXNNYW5hZ2VyLmdldFdTRExTZXJ2aWNlcyhyZXMpOwotICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyLmdldFdzZGRSZXNvdXJjZSgoU2VydmljZSkgd3NkbFJlc291cmNlcy5nZXQoMCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgewotICAgICAgICBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIHdzbmd0ID0gKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIG9iajsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2Upd3NuZ3QuZ2V0V3NkbFNlcnZpY2UoKTsKLSAgICAgICAgZGVzY3JpcHRpb25OYW1lXyA9IHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsgICAgICAgIAotICAgICAgICBwcm9qZWN0XyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzZXJ2aWNlKTsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlci5nZXRXc2RkUmVzb3VyY2Uoc2VydmljZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJRmlsZSl7Ci0gICAgCSAgLy8gd2Vic2VydmljZXMueG1sIGZpbGUKLSAgICAJICBSZXNvdXJjZSByZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoKElGaWxlKW9iaiwgdHJ1ZSk7Ci0gICAgCSAgV3NkZFJlc291cmNlIHdzZGRSZXMgPSAoV3NkZFJlc291cmNlKXJlczsKLSAgICAgICAgICBXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcyA9IHdzZGRSZXMuZ2V0V2ViU2VydmljZXMoKTsKLSAgICAgICAgICBpZiAod2ViU2VydmljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdCB3c0Rlc2NyaXB0aW9ucyA9IHdlYlNlcnZpY2VzLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIGlmICh3c0Rlc2NyaXB0aW9ucyE9bnVsbCkgewotICAgICAgICAgICAgICBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NkID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbil3c0Rlc2NyaXB0aW9ucy5nZXQoMCk7Ci0gICAgICAgICAgICAgIGRlc2NyaXB0aW9uTmFtZV8gPSB3c2QuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAJICBwcm9qZWN0XyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChyZXMpOwotICAgIAkgIHJldHVybiB3c2RkUmVzOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRvdGFsIG51bWJlciBvZiBTZXJ2aWNlRGVzY3JpcHRpb25zIGdpdmVuIDE0IGFuZCAxMyBzZXJ2aWNlcwotICAgKiBAcGFyYW0gd3NkZFJlcwotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIGludCBnZXROdW1iZXJvZlNlcnZpY2VzKFdzZGRSZXNvdXJjZVtdIHdzZGRSZXMpewotICAgIGludCBudW09IDA7Ci0gICAgZm9yIChpbnQgaT0wO2k8d3NkZFJlcy5sZW5ndGg7aSsrKXsKLSAgICAJaWYgKHdzZGRSZXNbaV0hPW51bGwpIHsKLSAgICAJCVdlYlNlcnZpY2VzIHdzID0gd3NkZFJlc1tpXS5nZXRXZWJTZXJ2aWNlcygpOwotICAgIAkJaWYgKHdzIT1udWxsKXsKLSAgICAJCQludW0gKz0gd3MuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpLnNpemUoKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICByZXR1cm4gbnVtOwotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEZvciBtdWx0aXBsZSBzZWxlY3Rpb24gb2YgU2VydmljZXMKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJpdmF0ZSBTZXJ2aWNlW10gZ2V0U2VsZWN0ZWRTZXJ2aWNlcygpewotCSAgV2ViU2VydmljZXNNYW5hZ2VyIHdzTWFuYWdlciA9IG5ldyBXZWJTZXJ2aWNlc01hbmFnZXIoKTsKLQkgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRTZWwgPSBnZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0gIAkgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IG5ldyBTZXJ2aWNlW2luaXRTZWwuc2l6ZSgpXTsKLSAgCSAgd3NkZFJlc291cmNlXyA9IG5ldyBXc2RkUmVzb3VyY2VbaW5pdFNlbC5zaXplKCldOwotICAJICBJdGVyYXRvciBpdGVyID0gaW5pdFNlbC5pdGVyYXRvcigpOwotICAJICBmb3IgKGludCBpPTA7aTxpbml0U2VsLnNpemUoKTtpKyspIHsKLSAgCQkgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgCQkgIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2aWNlKXsKLSAgCQkJICBzZXJ2aWNlc1tpXSA9IChTZXJ2aWNlKW9iajsKLSAgCQkJICB3c2RkUmVzb3VyY2VfW2ldID0gd3NNYW5hZ2VyLmdldFdzZGRSZXNvdXJjZShzZXJ2aWNlc1tpXSk7Ci0gIAkJICB9Ci0gIAkJICBlbHNlewotICAJCQkgIGVycm9yU3RhdHVzTXNnXyA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfSU5WQUxJRF9NVUxUSVBMRV9TRVJWSUNFX1NFTEVDVDsKLSAgCQkJICByZXR1cm4gbnVsbDsKLSAgCQkgIH0KLSAgCSAgfQotICAJICByZXR1cm4gc2VydmljZXM7Ci0gIH0KLSAgCi0KLSAgCi0gIC8qKgotICAgKiBHZXQgRGVzY3JpcHRpb24gTmFtZSBmb3Igc2luZ2xlIFdlYiBzZXJ2aWNlcyBzZWxlY3RlZAotICAgKiBudWxsIGlmIG11bGl0cGxlIHNlcnZpY2VzIGFyZSBzZWxlY3RlZAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uTmFtZSgpewotICAgIHJldHVybiBkZXNjcmlwdGlvbk5hbWVfOwotICB9Ci0gIAotICAvKioKLSAgICogQW4gYXJyYXkgb2YgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVycwotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyW10gZ2V0SGFuZGxlckRlc2NyaXB0aW9uSG9sZGVycygpewotICAgIHJldHVybiBoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfOwotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY4YzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQwNCAgIDEzNDkxMyBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUgICAKLSAqIDIwMDYwNTE3ICAgMTQyMDI3IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdSAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uSGFuZGxlckRlc2NyaXB0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5IYW5kbGVyVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0vKgotICogUHJvdmlkZSBhIHdheSB0byBleHRlcm5hbGl6ZSB0aGUgZWRpdGVkIGZpZWxkcyBhbmQgY3JlYXRlIG5ldyBoYW5kbGVycwotICogIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0KLSAgcHJpdmF0ZSBXc2RkUmVzb3VyY2VbXSB3c2RkUmVzb3VyY2VfOwotICBwcml2YXRlIGJvb2xlYW4gaXNNdWx0aXBsZVNlbGVjdGlvbl87Ci0gIHByaXZhdGUgSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyW10gaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXzsKLQotICAvKioKLSAgICogRm9yIGVhY2ggSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyLCB0aGUgdXNlciBzZWxlY3RlZCBIYW5kbGVycyBhcmUKLSAgICogc3luYydkIHVwIHdpdGggdGhlIGludGVybmFsIG1vZGVsCi0gICAqIEZvciBtdWx0aXBsZSBzZXJ2aWNlcywgaGFuZGxlcnMgYXJlIGFkZGVkIChub3QgcmVtb3ZlZCkgdG8gZWFjaCBwb3J0LgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHRyeSB7Ci0gICAgICBpZiAoaXNNdWx0aXBsZVNlbGVjdGlvbl8pewotICAgICAgICBmb3IgKGludCBpPTA7IGk8aGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXy5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgCi0gICAgICAgICAgaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyX1tpXS5hZGRIYW5kbGVyVG9BbGxQb3J0cygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLy8gYWRkIGhhbmRsZXIocykgZm9yIHNpbmdsZSBzZXJ2aWNlIHNlbGVjdGVkCi0gICAgICAgIGZvciAoaW50IGg9MDtoPGhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcl8ubGVuZ3RoO2grKyl7Ci0gIAotICAgICAgICAgIEhhc2h0YWJsZSB3c1BvcnRzVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgSGFzaHRhYmxlIHdzUG9ydFRvSGFuZGxlclRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgICAgICAgICBTdHJpbmcgc2VydmljZURlc2NOYW1lID0gaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyX1toXS5nZXREZXNjcmlwdGlvbk5hbWUoKTsKLSAgICAgICAgICAvLyBsb2FkIFBvcnROYW1lIC0+IFBvcnRDb21wb25lbnQgdGFibGUKLSAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXIgaGRoID0gSGFuZGxlckRlc2NyaXB0aW9uSGVscGVyLmdldEZvckRlc2NyaXB0aW9uTmFtZShoYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJfLCBzZXJ2aWNlRGVzY05hbWUpOwotICAgICAgICAgIGlmIChoZGghPW51bGwpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzY3JpcHRpb25fID0gIGhkaC5nZXREZXNjcmlwdGlvbk9iamVjdCgpOyAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh3c0Rlc2NyaXB0aW9uXyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIExpc3Qgd3NQb3J0cyA9IHdzRGVzY3JpcHRpb25fLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd3NQb3J0cy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgIFBvcnRDb21wb25lbnQgcG9ydCA9IChQb3J0Q29tcG9uZW50KSB3c1BvcnRzLmdldChrKTsKLSAgICAgICAgICAgICAgICB3c1BvcnRzVGFibGUucHV0KHBvcnQuZ2V0UG9ydENvbXBvbmVudE5hbWUoKSwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgd3NQb3J0VG9IYW5kbGVyVGFibGUucHV0KHBvcnQuZ2V0UG9ydENvbXBvbmVudE5hbWUoKSwgbmV3IEFycmF5TGlzdCgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0IGhhbmRsZXJUYWJsZUl0ZW1zID0gaGRoLmdldEhhbmRsZXJMaXN0KCk7ICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGhhbmRsZXJUYWJsZUl0ZW1zICE9IG51bGwpIHsKLSAgCi0gICAgICAgICAgICAgIFdzZGRGYWN0b3J5IHdzZGRGYWN0b3J5ID0gbmV3IFdzZGRGYWN0b3J5SW1wbCgpOwotICAKLSAgICAgICAgICAgICAgLy9mb3JtIHBvcnQgY29tcG9uZW50cyB0YWJsZXMgZmlyc3QKLSAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVyVGFibGVJdGVtcy5zaXplKCk7IGkrKykgewotICAKLSAgICAgICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKSBoYW5kbGVyVGFibGVJdGVtcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgUG9ydENvbXBvbmVudCB3c1BvcnQgPSAoUG9ydENvbXBvbmVudCkgaHRpLmdldFBvcnQoKTsKLSAgICAgICAgICAgICAgICBpZiAod3NQb3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL2ZpbmQgaXQKLSAgICAgICAgICAgICAgICAgIGlmICh3c1BvcnRzVGFibGUuZ2V0KGh0aS5nZXRQb3J0TmFtZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB3c1BvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0c1RhYmxlLmdldChodGkuZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGl0OyBzaG91bGQgbm90IGdldCBpbnRvIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgd3NQb3J0ID0gd3NkZEZhY3RvcnkuY3JlYXRlUG9ydENvbXBvbmVudCgpOwotICAgICAgICAgICAgICAgICAgICB3c1BvcnQuc2V0UG9ydENvbXBvbmVudE5hbWUoaHRpLmdldFBvcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB3c1BvcnRzVGFibGUucHV0KHdzUG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpLCB3c1BvcnQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3c1BvcnRUb0hhbmRsZXJUYWJsZS5wdXQod3NQb3J0LmdldFBvcnRDb21wb25lbnROYW1lKCksIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgCi0gICAgICAgICAgICAgIC8vIGZvcm0gSGFuZGxlciBhbmQgcG9ydHMgdGFibGUKLSAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVyVGFibGVJdGVtcy5zaXplKCk7IGkrKykgewotICAgIAotICAgICAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIGhhbmRsZXJUYWJsZUl0ZW1zLmdldChpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBodGkuZ2V0UG9ydE5hbWUoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBQb3J0Q29tcG9uZW50IHBvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0c1RhYmxlLmdldChwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCkgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgICAgICAgICAgICAgICBMaXN0IGV4aXN0aW5nSGFuZGxlcnMgPSBwb3J0LmdldEhhbmRsZXJzKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgT2JqZWN0IGhhbmRsZXIgPSBodGkuZ2V0SGFuZGxlcigpOwotICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdIYW5kbGVycy5jb250YWlucyhoYW5kbGVyKSkgewotICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGl0Ci0gICAgICAgICAgICAgICAgICBIYW5kbGVyIG5ld0hhbmRsZXIgPSB3c2RkRmFjdG9yeS5jcmVhdGVIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgICBuZXdIYW5kbGVyLnNldEhhbmRsZXJOYW1lKGh0aS5nZXRIYW5kbGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgIG5ld0hhbmRsZXIuc2V0SGFuZGxlckNsYXNzKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgKChMaXN0KSB3c1BvcnRUb0hhbmRsZXJUYWJsZS5nZXQocG9ydE5hbWUpKS5hZGQobmV3SGFuZGxlcik7Ci0gICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAvLyBjbG9uZSBpdAotICAgICAgICAgICAgICAgICAgRXRvb2xzQ29weVV0aWxpdHkgY29weVV0aWwgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLSAgICAgICAgICAgICAgICAgIGNvcHlVdGlsLnNldENvcHlBZGFwdGVycyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgIEhhbmRsZXIgY2xvbmVkSGFuZGxlciA9IChIYW5kbGVyKSBjb3B5VXRpbC5jb3B5KChIYW5kbGVyKSBoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICgoTGlzdCkgd3NQb3J0VG9IYW5kbGVyVGFibGUuZ2V0KHBvcnROYW1lKSkuYWRkKGNsb25lZEhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotIAotICAgICAgICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIGhhbmRsZXJzIGZyb20gcG9ydHMKLSAgICAgICAgICAgIHJlbW92ZUV4aXN0aW5nSGFuZGxlcnMod3NQb3J0c1RhYmxlLCB3c1BvcnRUb0hhbmRsZXJUYWJsZSk7Ci0gICAgCi0gICAgICAgICAgICAvLyBhZGQgcG9ydHMgdG8gd3NEZXNjcmlwdGlvbgotICAgICAgICAgICAgYWRkUG9ydHNUb0Rlc2NyaXB0aW9ucyh3c1BvcnRzVGFibGUsIHdzRGVzY3JpcHRpb25fKTsKLSAgICAKLSAgICAgICAgICAgIC8vIGFkZCBoYW5kbGVycyB0byBwb3J0cwotICAgICAgICAgICAgYWRkSGFuZGxlcnNUb1BvcnRzKHdzUG9ydHNUYWJsZSwgd3NQb3J0VG9IYW5kbGVyVGFibGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICAvLyBzYXZlCi0gICAgICBpZiAod3NkZFJlc291cmNlXyAhPSBudWxsKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHdzZGRSZXNvdXJjZV8ubGVuZ3RoO2krKykgewotICAgICAgICAJaWYgKHdzZGRSZXNvdXJjZV9baV0hPW51bGwpCi0gICAgICAgIAkJd3NkZFJlc291cmNlX1tpXS5zYXZlKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gIAotICAgICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZW1vdmVFeGlzdGluZ0hhbmRsZXJzKEhhc2h0YWJsZSBwb3J0c1RhYmxlLCBIYXNodGFibGUgcG9ydHNUb0hhbmRsZXJzVGFibGUpIHsKLSAgICB0cnkgewotICAgICAgRW51bWVyYXRpb24gcG9ydHMgPSBwb3J0c1RvSGFuZGxlcnNUYWJsZS5rZXlzKCk7Ci0gICAgICB3aGlsZSAocG9ydHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gKFN0cmluZykgcG9ydHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IHBvcnQgPSBwb3J0c1RhYmxlLmdldChwb3J0TmFtZSk7Ci0gICAgICAgIGlmIChwb3J0ICE9IG51bGwgJiYgcG9ydCBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnQpIHsKLSAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gKChQb3J0Q29tcG9uZW50KSBwb3J0KS5nZXRIYW5kbGVycygpOwotICAgICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRQb3J0c1RvRGVzY3JpcHRpb25zKEhhc2h0YWJsZSBwb3J0c1RhYmxlLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjcmlwdGlvbl8pIHsKLSAgICB0cnkgewotICAgICAgRW51bWVyYXRpb24gcG9ydHMgPSBwb3J0c1RhYmxlLmtleXMoKTsKLSAgICAgIHdoaWxlIChwb3J0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAoU3RyaW5nKSBwb3J0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAvLyBuZXdseSBlZGl0ZWQgcG9ydAotICAgICAgICBPYmplY3QgcG9ydCA9IHBvcnRzVGFibGUuZ2V0KHBvcnROYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGV4aXN0aW5nIHBvcnQKLSAgICAgICAgTGlzdCBlbWZQb3J0cyA9IHdzRGVzY3JpcHRpb25fLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgIGlmICghZW1mUG9ydHMuY29udGFpbnMocG9ydCkgJiYgcG9ydCAhPSBudWxsICYmIHBvcnQgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50KSB7Ci0gICAgICAgICAgZW1mUG9ydHMuYWRkKChQb3J0Q29tcG9uZW50KSBwb3J0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkSGFuZGxlcnNUb1BvcnRzKEhhc2h0YWJsZSBwb3J0c1RhYmxlLCBIYXNodGFibGUgcG9ydHNUb0hhbmRsZXJzVGFibGUpIHsKLSAgICB0cnkgewotICAgICAgRW51bWVyYXRpb24gcG9ydHMgPSBwb3J0c1RvSGFuZGxlcnNUYWJsZS5rZXlzKCk7Ci0gICAgICB3aGlsZSAocG9ydHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gKFN0cmluZykgcG9ydHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IHBvcnQgPSBwb3J0c1RhYmxlLmdldChwb3J0TmFtZSk7Ci0gICAgICAgIGlmIChwb3J0ICE9IG51bGwgJiYgcG9ydCBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnQpIHsKLSAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gKExpc3QpIHBvcnRzVG9IYW5kbGVyc1RhYmxlLmdldChwb3J0TmFtZSk7Ci0KLSAgICAgICAgICBMaXN0IG1vZGVsSGFuZGxlcnMgPSAoKFBvcnRDb21wb25lbnQpIHBvcnQpLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgbW9kZWxIYW5kbGVycy5hZGRBbGwoaGFuZGxlcnMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyCi0gICAqIEBwYXJhbSBoZGhzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJzKEhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcltdIGhkaHMpewotICAgIHRoaXMuaGFuZGxlckRlc2NyaXB0aW9uSG9sZGVyXyA9IGhkaHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzTXVsdGlwbGVTZWxlY3Rpb24oYm9vbGVhbiBpc011bGl0cGxlU2VsZWN0aW9uKSB7Ci0gICAgdGhpcy5pc011bHRpcGxlU2VsZWN0aW9uXyA9IGlzTXVsaXRwbGVTZWxlY3Rpb247Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGRSZXNvdXJjZShXc2RkUmVzb3VyY2VbXSB3c2RkUmVzKSB7Ci0gICAgdGhpcy53c2RkUmVzb3VyY2VfID0gd3NkZFJlczsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1RhYmxlVmlld2VyV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvVGFibGVWaWV3ZXJXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjMjUyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvVGFibGVWaWV3ZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MDUgICAxMzk5MTggcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5Qcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLkRpYWxvZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi1wdWJsaWMgY2xhc3MgVGFibGVWaWV3ZXJXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBpbnQgREVGQVVMVF9UQUJMRV9IRUlHSFRfSElOVCA9IDEwMDsKLSAgcHJpdmF0ZSBpbnQgREVGQVVMVF9DT0xVTU5fV0lEVEggPSA4MDsKLQotICBwdWJsaWMgc3RhdGljIGJ5dGUgTUFQX09ORV9UT19PTkUgPSAzOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgTUFQX01BTllfVE9fT05FID0gMTsKLSAgcHVibGljIHN0YXRpYyBieXRlIE1BUF9NQU5ZX1RPX01BTlkgPSAwOwotCi0gIHByaXZhdGUgU3RyaW5nW10gY29sdW1uc187Ci0gIHByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXJfOwotICBwcml2YXRlIFRhYmxlIHRhYmxlXzsKLSAgcHJpdmF0ZSBUYWJsZUVkaXRvciBlZGl0b3JfOwotICBwcml2YXRlIFRhYmxlRWRpdG9yTGlzdGVuZXIgdGFibGVFZGl0b3JMaXN0ZW5lcl87Ci0gIHByaXZhdGUgVGV4dCB0ZXh0XzsKLSAgcHJpdmF0ZSBCdXR0b24gaW1wb3J0XzsKLSAgcHJpdmF0ZSBCdXR0b24gYWRkXzsKLSAgcHJpdmF0ZSBCdXR0b24gcmVtb3ZlXzsKLSAgCi0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudF87Ci0gIHByaXZhdGUgTGlzdGVuZXIgIHN0YXR1c0xpc3RlbmVyXzsKLQotICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKLSAgcHJpdmF0ZSBieXRlIHJlc2NyaWN0aW9uID0gTUFQX01BTllfVE9fTUFOWTsKLQotICBwcml2YXRlIExpc3QgdmFsdWVzXzsKLSAgcHJpdmF0ZSBPYmplY3QgZGVmYXVsdFZhbHVlXzsKLQotICBwcml2YXRlIFByb3BlcnRpZXNSZXNvdXJjZUZpbHRlciBmaWx0ZXJfID0gbmV3IFByb3BlcnRpZXNSZXNvdXJjZUZpbHRlcigpOwotCi0gIHB1YmxpYyBUYWJsZVZpZXdlcldpZGdldChTdHJpbmdbXSBjb2x1bW5zLCBMaXN0IGluaXRWYWx1ZXMsIE9iamVjdCBkZWZhdWx0VmFsdWUsIGJ5dGUgcmVzY3JpY3Rpb24pCi0gIHsKLQljb2x1bW5zXyA9IGNvbHVtbnM7Ci0JdmFsdWVzXyA9IG5ldyBBcnJheUxpc3QoKTsKLQlpZiAoaW5pdFZhbHVlcyAhPSBudWxsICYmIGluaXRWYWx1ZXMuc2l6ZSgpID4gMCkKLQkgIHZhbHVlc18uYWRkQWxsKGluaXRWYWx1ZXMpOwotCWRlZmF1bHRWYWx1ZV8gPSAoZGVmYXVsdFZhbHVlICE9IG51bGwpID8gZGVmYXVsdFZhbHVlIDogbmV3IFN0cmluZygiIik7Ci0JdGhpcy5yZXNjcmljdGlvbiA9IHJlc2NyaWN0aW9uOwotICB9Ci0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgeyAKLSAgICBwYXJlbnRfICAgICAgICAgPSBwYXJlbnQ7Ci0gICAgc3RhdHVzTGlzdGVuZXJfID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgCi0JQ29tcG9zaXRlICBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgZ2wgICAgICAgID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkKLQlnbC5tYXJnaW5IZWlnaHQgPSAwOwotCWdsLm1hcmdpbldpZHRoID0gMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQl0YWJsZV8gPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlnZC5oZWlnaHRIaW50ID0gREVGQVVMVF9UQUJMRV9IRUlHSFRfSElOVDsKLQl0YWJsZV8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JdGFibGVfLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGVfLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCWludCBtYXhXaWR0aCA9IERFRkFVTFRfQ09MVU1OX1dJRFRIOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspCi0JewotCSAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGVfLCBTV1QuTk9ORSk7Ci0JICB0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtbnNfW2ldKTsKLQkgIHRhYmxlQ29sdW1uLnBhY2soKTsKLQkgIGludCB0YWJsZUNvbHVtbldpZHRoID0gTWF0aC5tYXgoREVGQVVMVF9DT0xVTU5fV0lEVEgsIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkpOwotCSAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgdGFibGVDb2x1bW5XaWR0aCk7Ci0JICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbkRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSh0YWJsZUNvbHVtbldpZHRoLCB0YWJsZUNvbHVtbldpZHRoLCB0cnVlKTsKLQkgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uRGF0YSk7Ci0JfQotCXRhYmxlXy5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCS8vIGluaXRpYWxpemUgdGhlIHRhYmxlIGVkaXRvcgotCWVkaXRvcl8gPSBuZXcgVGFibGVFZGl0b3IodGFibGVfKTsKLQkvLyBUaGUgZWRpdG9yIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBjZWxsIGFuZCBtdXN0Ci0JLy8gbm90IGJlIGFueSBzbWFsbGVyIHRoYW4gNTAgcGl4ZWxzLgotCWVkaXRvcl8uaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCWVkaXRvcl8uZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCWVkaXRvcl8ubWluaW11bVdpZHRoID0gbWF4V2lkdGg7Ci0JdGFibGVFZGl0b3JMaXN0ZW5lcl8gPSBuZXcgVGFibGVFZGl0b3JMaXN0ZW5lcigpOwotCXRhYmxlXy5hZGRNb3VzZUxpc3RlbmVyKHRhYmxlRWRpdG9yTGlzdGVuZXJfKTsKLQl0YWJsZVZpZXdlcl8gPSBuZXcgVGFibGVWaWV3ZXIodGFibGVfKTsKLQl0YWJsZVZpZXdlcl8uZ2V0Q29udHJvbCgpLmFkZEtleUxpc3RlbmVyKAotCSAgbmV3IEtleUxpc3RlbmVyKCkKLQkgIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotCQl7Ci0JCSAgaW50IGFzY2lpRGVsID0gKGludCllLmNoYXJhY3RlcjsKLQkJICAvLyBEZWwKLQkJICBpZiAoYXNjaWlEZWwgPT0gMTI3KSAKLQkJCWhhbmRsZURlbGV0ZUtleVByZXNzZWQoKTsKLSAgICAgICAgICAgICAgICAvLyBFbnRlciBvciBzcGFjZQotICAgICAgICAgICAgICAgIGlmICgoKGludCllLmNoYXJhY3RlcikgPT0gMTMgfHwgKChpbnQpZS5jaGFyYWN0ZXIpID09IDMyKQotICAgICAgICAgICAgICAgICAgdGFibGVFZGl0b3JMaXN0ZW5lcl8uZWRpdFNlbGVjdGlvbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0JCXsKLQkJfQotCSAgfQotCSk7Ci0JdGFibGVWaWV3ZXJfLnNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQl0YWJsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcihuZXcgTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0JdGFibGVWaWV3ZXJfLnNldElucHV0KHZhbHVlc18pOwotCXRhYmxlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JICB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQl7Ci0JCSAgZW5hYmxlUmVtb3ZlKHRydWUpOwotCQl9Ci0JICB9Ci0JKTsKLQotCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlnbC5udW1Db2x1bW5zID0gMzsKLQlnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JaW1wb3J0XyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JaW1wb3J0Xy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9JTVBPUlQpOwotCWltcG9ydF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JaW1wb3J0Xy5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkgIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JICB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotCQl7Ci0JCSAgaGFuZGxlSW1wb3J0QnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLQkJewotCQl9Ci0JICB9Ci0JKTsKLQkKLQlhZGRfID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQlhZGRfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0FERCk7Ci0JYWRkXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQlhZGRfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCSAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLQkgIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotCQl7Ci0JCX0KLQkgIH0KLQkpOwotCi0JCi0JcmVtb3ZlXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JcmVtb3ZlXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9SRU1PVkUpOwotCXJlbW92ZV8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JcmVtb3ZlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkgIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JICB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotCQl7Ci0JCSAgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLQkJewotCQl9Ci0JICB9Ci0JKTsKLQllbmFibGVSZW1vdmUoZmFsc2UpOwotCQotCXJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZVJlbW92ZShib29sZWFuIGVuYWJsZWQpCi0gIHsKLQlyZW1vdmVfLnNldEVuYWJsZWQoZW5hYmxlZCAmJiAhdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlSW1wb3J0QnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBEaWFsb2dVdGlscy5icm93c2VSZXNvdXJjZXMoCi0JICBwYXJlbnRfLmdldFNoZWxsKCksCi0JICBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKSwKLQkgIG51bGwsCi0JICBmaWx0ZXJfCi0JKTsKLQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCXsKLQkgIHRyeQotCSAgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcHJvcHMubG9hZCgoKElGaWxlKXJlc291cmNlKS5nZXRDb250ZW50cygpKTsKLQkJU2V0IHNldCA9IHByb3BzLmVudHJ5U2V0KCk7Ci0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJdGVyYXRvciBpID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkKLQkJewotCQkgIE1hcC5FbnRyeSBtZSA9IChNYXAuRW50cnkpaS5uZXh0KCk7Ci0JCSAgU3RyaW5nIGtleSA9IChTdHJpbmcpbWUuZ2V0S2V5KCk7Ci0JCSAgU3RyaW5nIHZhbCA9IChTdHJpbmcpbWUuZ2V0VmFsdWUoKTsKLQkJICBsaXN0LmFkZChuZXcgU3RyaW5nW10ge2tleSx2YWx9KTsKLQkJfQotCQl2YWx1ZXNfLmFkZEFsbChsaXN0KTsKLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsKLQkgICAgLy8gVE9ETyBSZXBvcnQgc29tZSBlcnJvciBoZXJlLgotCSAgfQotCX0KLQlyZWZyZXNoKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQl2YWx1ZXNfLmFkZChkZWZhdWx0VmFsdWVfKTsKLQlyZWZyZXNoKCk7Ci0Jc2V0U2VsZWN0aW9uQXNPYmplY3QodmFsdWVzXy5nZXQodGFibGVfLmdldEl0ZW1Db3VudCgpLTEpKTsKLQl0YWJsZUVkaXRvckxpc3RlbmVyXy5lZGl0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQloYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpCi0gIHsKLQlpbnRlcm5hbERpc3Bvc2UoKTsKLQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQl7Ci0JICBpbnQgc2VsZWN0aW9uSW5kZXggPSB0YWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkgIGludCBzZWxlY3Rpb25Db3VudCA9IHRhYmxlXy5nZXRJdGVtQ291bnQoKTsKLQkgIHZhbHVlc18ucmVtb3ZlKHNlbGVjdGlvbkluZGV4KTsKLQkgIGlmIChzZWxlY3Rpb25JbmRleCA8IHNlbGVjdGlvbkNvdW50LTEpCi0JCXNldFNlbGVjdGlvbkFzT2JqZWN0KHZhbHVlc18uZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JICBlbHNlIGlmIChzZWxlY3Rpb25Db3VudCAtMiA+PSAwKQotCQlzZXRTZWxlY3Rpb25Bc09iamVjdCh2YWx1ZXNfLmdldChzZWxlY3Rpb25Db3VudC0yKSk7Ci0JICByZWZyZXNoKCk7Ci0JfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGludGVybmFsUmVmcmVzaCgpCi0gIHsKLQkvLyBzeW5jaHJvbml6ZSB0ZXh0IGZpZWxkLCBwcmV2aW91c2x5IHNlbGVjdGVkIHRhYmxlIGNlbGwgYW5kIG1vZGVsIChpbnB1dE9iamVjdCkKLQlpZiAodGV4dF8gIT0gbnVsbCkKLQl7Ci0JICBUYWJsZUl0ZW0gb2xkVGFibGVJdGVtID0gZWRpdG9yXy5nZXRJdGVtKCk7Ci0JICBpbnQgb2xkQ29sdW1uSW5kZXggPSBlZGl0b3JfLmdldENvbHVtbigpOwotCSAgaWYgKG9sZFRhYmxlSXRlbSAhPSBudWxsICYmIG9sZENvbHVtbkluZGV4ID49IDAgJiYgb2xkQ29sdW1uSW5kZXggPCBjb2x1bW5zXy5sZW5ndGgpCi0JICB7Ci0JCVN0cmluZyBvbGRUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQlvbGRUYWJsZUl0ZW0uc2V0VGV4dChvbGRDb2x1bW5JbmRleCwgb2xkVGV4dCk7Ci0JCWludCBvbGRSb3dJbmRleCA9IHRhYmxlXy5pbmRleE9mKG9sZFRhYmxlSXRlbSk7Ci0JCXZhbHVlc18uc2V0KG9sZFJvd0luZGV4LCBuZXcgU3RyaW5nW10ge29sZFRhYmxlSXRlbS5nZXRUZXh0KDApLCBvbGRUYWJsZUl0ZW0uZ2V0VGV4dCgxKX0pOwotCSAgfQotCX0KLQljaGVja01hcHBpbmdDb25zdHJhaW50cygpOwotCXN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudCggbnVsbCApOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrTWFwcGluZ0NvbnN0cmFpbnRzKCkgewotCi0JSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgCi0JZm9yKGludCBjbnQ9MDsgY250PHZhbHVlc18uc2l6ZSgpOyBjbnQrKyl7Ci0JCVN0cmluZ1tdIHZhbHVlID0gKFN0cmluZ1tdKXZhbHVlc18uZ2V0KGNudCk7Ci0JCWlmKG1hcC5jb250YWluc0tleSh2YWx1ZVswXSkgJiYgKChyZXNjcmljdGlvbiAmIDEpIT0wKSl7Ci0JCQltZXNzYWdlID1OTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX01BUFBJTkdfRFVQTElDQVRFX0VOVFJJRVMsIG5ldyBTdHJpbmdbXXtjb2x1bW5zX1swXSxjb2x1bW5zX1sxXX0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKG1hcC5jb250YWluc1ZhbHVlKHZhbHVlWzFdKSAmJiAoKHJlc2NyaWN0aW9uICYgMikhPTApKXsKLQkJCW1lc3NhZ2UgPU5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfTUFQUElOR19EVVBMSUNBVEVfRU5UUklFUywgbmV3IFN0cmluZ1tde2NvbHVtbnNfWzFdLGNvbHVtbnNfWzBdfSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbWFwLnB1dCh2YWx1ZVswXSx2YWx1ZVsxXSk7Ci0KLQl9Ci0JbWVzc2FnZSA9IG51bGw7Ci0KLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZSA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggbWVzc2FnZSApOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbkFzT2JqZWN0KE9iamVjdCBvYmplY3QpCi0gIHsKLQl0YWJsZVZpZXdlcl8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCksIHRydWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLQlpbnRlcm5hbFJlZnJlc2goKTsKLQl0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIFRhYmxlSXRlbVtdIGdldEl0ZW1zKCkKLSAgewotCS8vaW50ZXJuYWxSZWZyZXNoKCk7Ci0JcmV0dXJuIHRhYmxlXy5nZXRJdGVtcygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gIHsKLQlhZGRfLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JZW5hYmxlUmVtb3ZlKGVuYWJsZWQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLQlpbnRlcm5hbERpc3Bvc2UoKTsKLQlpZiAoZWRpdG9yXyAhPSBudWxsKQotCSAgZWRpdG9yXy5kaXNwb3NlKCk7Ci0JaWYgKHRhYmxlXyAhPSBudWxsKQotCSAgdGFibGVfLmRpc3Bvc2UoKTsKLQlpZiAoYWRkXyAhPSBudWxsKQotCSAgYWRkXy5kaXNwb3NlKCk7Ci0JaWYgKHJlbW92ZV8gIT0gbnVsbCkKLQkgIHJlbW92ZV8uZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGludGVybmFsRGlzcG9zZSgpCi0gIHsKLQlpZiAodGV4dF8gIT0gbnVsbCkKLQkgIHRleHRfLmRpc3Bvc2UoKTsKLQl0ZXh0XyA9IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgVGFibGVFZGl0b3JMaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIKLSAgewotCXByaXZhdGUgaW50IGN1cnJTZWxlY3Rpb25JbmRleF87Ci0gICAgcHJpdmF0ZSBpbnQgZWRpdFJvd187Ci0gICAgcHJpdmF0ZSBpbnQgZWRpdENvbHVtbl87Ci0KLQlwdWJsaWMgVGFibGVFZGl0b3JMaXN0ZW5lcigpCi0JewotCSAgc3VwZXIoKTsKLQkgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSAtMTsKLSAgICAgICAgIGVkaXRSb3dfID0gLTE7Ci0gICAgICAgICBlZGl0Q29sdW1uXyA9IC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKQotCXsKLQkgIG1vdXNlRG93bihlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotCXsKLQkgIC8vIHJlZnJlc2ggdGFibGUKLQkgIGludGVybmFsUmVmcmVzaCgpOwotCSAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgdGV4dCBlZGl0b3IgY29udHJvbAotCSAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0JICAvLyB1cGRhdGUgdGFibGUKLQkgIGlmICh0YWJsZV8uaXNGb2N1c0NvbnRyb2woKSkKLQkgIHsKLQkJaW50IHNlbGVjdGVkUm93SW5kZXggPSBnZXRTZWxlY3RlZFJvdyh0YWJsZV8sIGUueSk7Ci0JCWlmIChjdXJyU2VsZWN0aW9uSW5kZXhfICE9IC0xICYmIHNlbGVjdGVkUm93SW5kZXggIT0gLTEgJiYgY3VyclNlbGVjdGlvbkluZGV4XyA9PSBzZWxlY3RlZFJvd0luZGV4KQotCQl7Ci0JCSAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlXy5nZXRJdGVtKHNlbGVjdGVkUm93SW5kZXgpOwotCQkgIGludCBzZWxlY3RlZENvbHVtbkluZGV4ID0gZ2V0U2VsZWN0ZWRDb2x1bW4odGFibGVJdGVtLCBlLngsIGUueSk7Ci0JCSAgaWYgKHNlbGVjdGVkQ29sdW1uSW5kZXggIT0gLTEgJiYgKHRleHRfID09IG51bGwgfHwgdGV4dF8uaXNEaXNwb3NlZCgpIHx8IHNlbGVjdGVkQ29sdW1uSW5kZXggIT0gZWRpdG9yXy5nZXRDb2x1bW4oKSkpCi0JCQllZGl0U2VsZWN0aW9uKHNlbGVjdGVkUm93SW5kZXgsIHNlbGVjdGVkQ29sdW1uSW5kZXgpOwotCQl9Ci0JCWN1cnJTZWxlY3Rpb25JbmRleF8gPSBzZWxlY3RlZFJvd0luZGV4OwotCSAgfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKQotCXsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTZWxlY3RlZFJvdyhUYWJsZSB0YWJsZSwgaW50IHkpCi0JewotCSAgVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspCi0JICB7Ci0JCVJlY3RhbmdsZSByZWN0YW5nbGUgPSB0YWJsZUl0ZW1zW2ldLmdldEJvdW5kcygwKTsKLQkJaWYgKHJlY3RhbmdsZSAhPSBudWxsICYmIHkgPj0gcmVjdGFuZ2xlLnkgJiYgeSA8IChyZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQpKQotCQkgIHJldHVybiBpOwotCSAgfQotCSAgcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgaW50IGdldFNlbGVjdGVkQ29sdW1uKFRhYmxlSXRlbSB0YWJsZUl0ZW0sIGludCB4LCBpbnQgeSkKLQl7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNfLmxlbmd0aDsgaSsrKQotCSAgewotCQlpZiAodGFibGVJdGVtLmdldEJvdW5kcyhpKS5jb250YWlucyh4LCB5KSkKLQkJICByZXR1cm4gaTsKLQkgIH0KLQkgIHJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdFNlbGVjdGlvbihpbnQgcm93LCBpbnQgY29sdW1uKQotCXsKLSAgICAgICAgIGVkaXRSb3dfID0gcm93OwotICAgICAgICAgZWRpdENvbHVtbl8gPSBjb2x1bW47Ci0JICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVfLmdldEl0ZW0ocm93KTsKLQkgIC8vIFNldHVwIGFkYXB0ZXIgZm9yIHRoZSBuZXcgc2VsZWN0aW9uCi0JICB0ZXh0XyA9IG5ldyBUZXh0KHRhYmxlXywgU1dULk5PTkUpOwotCSAgU3RyaW5nIHRleHQgPSB0YWJsZUl0ZW0uZ2V0VGV4dChjb2x1bW4pOwotCSAgdGV4dF8uc2V0VGV4dCgodGV4dCAhPSBudWxsKSA/IHRleHQgOiAiIik7Ci0gICAgICAgICB0ZXh0Xy5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8vIEVzYwotICAgICAgICAgICAgICAgaWYgKCgoaW50KWUuY2hhcmFjdGVyKSA9PSAyNykKLSAgICAgICAgICAgICAgICAgY2FuY2VsU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgKTsKLSAgICAgICAgIHRleHRfLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKQotICAgICAgICAgICAgICAgICB0cmF2ZXJzZVRhYk5leHQoKTsKLSAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpCi0gICAgICAgICAgICAgICAgIHRyYXZlcnNlVGFiUHJldmlvdXMoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICk7Ci0gICAgICAgICAKLSAgICB0ZXh0Xy5hZGRGb2N1c0xpc3RlbmVyKCBuZXcgRm9jdXNBZGFwdGVyKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIAotCSAgZWRpdG9yXy5zZXRFZGl0b3IodGV4dF8sIHRhYmxlSXRlbSwgY29sdW1uKTsKLQkgIHRleHRfLnNldEZvY3VzKCk7Ci0JICB0ZXh0Xy5zZWxlY3RBbGwoKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZVRhYk5leHQoKQotICAgIHsKLSAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICBpZiAoIShlZGl0Um93XyA9PSB0YWJsZV8uZ2V0SXRlbXMoKS5sZW5ndGgtMSAmJiBlZGl0Q29sdW1uXyA9PSBjb2x1bW5zXy5sZW5ndGgtMSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0Q29sdW1uXyA8IGNvbHVtbnNfLmxlbmd0aC0xKQotICAgICAgICAgIGVkaXRDb2x1bW5fKys7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVkaXRDb2x1bW5fID0gMDsKLSAgICAgICAgICBlZGl0Um93XysrOwotICAgICAgICAgIHRhYmxlXy5zZWxlY3QoZWRpdFJvd18pOwotICAgICAgICB9Ci0gICAgICAgIGVkaXRTZWxlY3Rpb24oZWRpdFJvd18sIGVkaXRDb2x1bW5fKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZVRhYlByZXZpb3VzKCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaWYgKCEoZWRpdFJvd18gPT0gMCAmJiBlZGl0Q29sdW1uXyA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVkaXRDb2x1bW5fID4gMCkKLSAgICAgICAgICBlZGl0Q29sdW1uXy0tOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0Q29sdW1uXyA9IGNvbHVtbnNfLmxlbmd0aC0xOwotICAgICAgICAgIGVkaXRSb3dfLS07Ci0gICAgICAgICAgdGFibGVfLnNlbGVjdChlZGl0Um93Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWRpdFNlbGVjdGlvbihlZGl0Um93XywgZWRpdENvbHVtbl8pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbFNlbGVjdGlvbigpCi0gICAgewotICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBlZGl0U2VsZWN0aW9uKCkKLQl7Ci0JICBpbnQgc2VsZWN0ZWRSb3dJbmRleCA9IHRhYmxlXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCSAgaWYgKHNlbGVjdGVkUm93SW5kZXggIT0gLTEgJiYgY29sdW1uc18ubGVuZ3RoID4gMCkKLQkgIHsKLQkJLy8gcmVmcmVzaCB0YWJsZQotCQlpbnRlcm5hbFJlZnJlc2goKTsKLQkJLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIGVkaXRvciBjb250cm9sCi0JCWludGVybmFsRGlzcG9zZSgpOwotCQllZGl0U2VsZWN0aW9uKHNlbGVjdGVkUm93SW5kZXgsIDApOwotCSAgfQotCSAgY3VyclNlbGVjdGlvbkluZGV4XyA9IHNlbGVjdGVkUm93SW5kZXg7Ci0JfQotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIExpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQl7Ci0JICB0YWJsZVZpZXdlcl8uYWRkKGdldEVsZW1lbnRzKG5ld0lucHV0KSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JewotCSAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIExpc3QpCi0JICB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KWlucHV0RWxlbWVudDsKLQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspCi0JCSAgb2JqZWN0c1tpXSA9IGxpc3QuZ2V0KGkpOwotCQlyZXR1cm4gb2JqZWN0czsKLQkgIH0KLQkgIGVsc2UKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIExpc3RMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JewotCQlyZXR1cm4gKChTdHJpbmdbXSllbGVtZW50KVtjb2x1bW5JbmRleF07CSAgCQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCXsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0gIH0KLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvVGltZWRXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1RpbWVkV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2YjZlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvVGltZWRXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTA0ICAgMTE5Mjk2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuY29tbW9uLlRpbWVkT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBUaW1lZFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24KLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgICAgICAgICAgICAgICAgICBUSU1FT1VUX1BSRUZFUkVOQ0UgPSAid3NkbFRpbWVPdXQiOwotICBwcml2YXRlIFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kIHNlbGVjdGlvbkNvbW1hbmQ7Ci0gIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dFZhbHVlOwotICAKLSAgcHVibGljIFRpbWVkV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQoKQotICB7Ci0gICAgc2VsZWN0aW9uQ29tbWFuZCA9IG5ldyBXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZCgpOwotICAgIAotICAgIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAKLSAgICB0aW1lT3V0VmFsdWUgPSBwcmVmU3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhUSU1FT1VUX1BSRUZFUkVOQ0UpLmVxdWFscygiIikgPyAxMDAwMCA6IHByZWZTdG9yZS5nZXRJbnQoIFRJTUVPVVRfUFJFRkVSRU5DRSApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICBzZWxlY3Rpb25Db21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKCB3ZWJTZXJ2aWNlc1BhcnNlciApOwotICB9Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25Db21tYW5kLmdldFdlYlNlcnZpY2VzUGFyc2VyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgU3RyaW5nICAgICAgICAgdGltZU91dE1lc3NhZ2UgPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuYmluZCggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19JTkZPX1dTRExfT1BFUkFUSU9OX1RJTUVEX09VVCwgZ2V0V2ViU2VydmljZVVSSSgpICk7Ci0gICAgCi0gICAgVGltZWRPcGVyYXRpb24gdGltZWRPcGVyYXRpb24gPSBuZXcgVGltZWRPcGVyYXRpb24oIHNlbGVjdGlvbkNvbW1hbmQsIHRpbWVPdXRWYWx1ZSwgdGltZU91dE1lc3NhZ2UgKTsKLSAgICAKLSAgICByZXR1cm4gdGltZWRPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBhZGFwdGFibGUpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uQ29tbWFuZC5ldmFsdWF0ZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVVJJKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25Db21tYW5kLmdldFdlYlNlcnZpY2VVUkkoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VVUkkoU3RyaW5nIHdlYlNlcnZpY2VVUkkpCi0gIHsKLSAgICBzZWxlY3Rpb25Db21tYW5kLnNldFdlYlNlcnZpY2VVUkkod2ViU2VydmljZVVSSSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0V2ViU2VydmljZVVSSSgpOwotICB9Ci0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaHR0cEJhc2ljQXV0aFBhc3N3b3JkLgotICovCi1wdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhQYXNzd29yZCgpIHsKLQlyZXR1cm4gc2VsZWN0aW9uQ29tbWFuZC5nZXRIdHRwQmFzaWNBdXRoUGFzc3dvcmQoKTsKLX0KLS8qKgotICogQHJldHVybiBSZXR1cm5zIHRoZSBodHRwQmFzaWNBdXRoVXNlcm5hbWUuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKCkgewotCXJldHVybiBzZWxlY3Rpb25Db21tYW5kLmdldEh0dHBCYXNpY0F1dGhVc2VybmFtZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwNDFjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLkRpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24KLXsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSTsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotICBwcml2YXRlIFN0cmluZyBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBuZWVkV1NETFNlbGVjdGlvblRyZWVXaWRnZXQ7Ci0gIAotICBwdWJsaWMgV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgCWlmICh3ZWJTZXJ2aWNlc1BhcnNlciA9PSBudWxsKQotICAJICB3ZWJTZXJ2aWNlc1BhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAJcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAJbmVlZFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0ID0gZmFsc2U7Ci0gIAlXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIgPSBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpOwotICAJcGFyc2VyLnNldFVSSSh3ZWJTZXJ2aWNlVVJJKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfV1NJTCB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX0RJU0NPIHwgV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfTElOS1MpOwotICAgIH0KLSAgICBjYXRjaCAoV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24gd3d3YWUpCi0gICAgewotICAgICAgRGlhbG9nV1dXQXV0aGVudGljYXRpb24gZGlhbG9nID0gbmV3IERpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0gICAgICBkaWFsb2cuaGFuZGxlV1dXQXV0aGVudGljYXRpb24od3d3YWUpOwotICAgICAgU3RyaW5nIHVzZXJuYW1lID0gZGlhbG9nLmdldFVzZXJuYW1lKCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSBkaWFsb2cuZ2V0UGFzc3dvcmQoKTsKLSAgICAgIGh0dHBCYXNpY0F1dGhVc2VybmFtZSA9IHVzZXJuYW1lOwotICAgICAgaHR0cEJhc2ljQXV0aFBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFVzZXJuYW1lKHVzZXJuYW1lKTsKLSAgICAgICAgcGFyc2VyLnNldEhUVFBCYXNpY0F1dGhQYXNzd29yZChwYXNzd29yZCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX1dTSUwgfCBXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9ESVNDTyB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX0xJTktTKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVVJJX05PVF9SRVNPTFZBQkxFLCBuZXcgT2JqZWN0W10ge3dlYlNlcnZpY2VVUkl9KSwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgcGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShudWxsKTsKLSAgICAgICAgICBwYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVVJJX05PVF9SRVNPTFZBQkxFLCBuZXcgT2JqZWN0W10ge3dlYlNlcnZpY2VVUkl9KSwgdCk7Ci0gICAgfQotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NFbnRpdHkgPSBwYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdlYlNlcnZpY2VVUkkpOwotICAgIGlmICh3c0VudGl0eSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCB0eXBlID0gd3NFbnRpdHkuZ2V0VHlwZSgpOwotICAgICAgaWYgKHR5cGUgIT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpCi0gICAgICAJbmVlZFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLSAgewotICAgIHJldHVybiBuZWVkV1NETFNlbGVjdGlvblRyZWVXaWRnZXQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVVJJKFN0cmluZyB3ZWJTZXJ2aWNlVVJJKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlVVJJID0gd2ViU2VydmljZVVSSTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAgIHJldHVybiBnZXRXZWJTZXJ2aWNlVVJJKCk7Ci0gIH0KLS8qKgotICogQHJldHVybiBSZXR1cm5zIHRoZSBodHRwQmFzaWNBdXRoUGFzc3dvcmQuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFBhc3N3b3JkKCkgewotCXJldHVybiBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci19Ci0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaHR0cEJhc2ljQXV0aFVzZXJuYW1lLgotICovCi1wdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhVc2VybmFtZSgpIHsKLQlyZXR1cm4gaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDI3NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyNSAgIDE0MjI4MSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQWJzdHJhY3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuUGFnZUluZm87Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3Rpb25EaWFsb2cgewotCQotCXByaXZhdGUgU3RyaW5nIHRpdGxlVGV4dF87Ci0JcHJpdmF0ZSBTdHJpbmcgd3NVcmlfOwotCXByaXZhdGUgU3RyaW5nIGNvbXBvbmVudE5hbWVfOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0JCi0JcHVibGljIFdTRExTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBQYWdlSW5mbyBwYWdlSW5mbykgewotCQlzdXBlcihwYXJlbnQsIHBhZ2VJbmZvKTsKLQkJdGl0bGVUZXh0XyA9IHBhZ2VJbmZvLmdldFBhZ2VOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2FsbFNldHRlcnMoKQotCXsJCQotCQkoKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyKWdldFdpZGdldCgpKS5zZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE5hbWVfKTsKLQkJKChXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcilnZXRXaWRnZXQoKSkuc2V0UHJvamVjdChwcm9qZWN0Xyk7Ci0JCSgoV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIpZ2V0V2lkZ2V0KCkpLnNldFdlYlNlcnZpY2VVUkkod3NVcmlfKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50TmFtZShTdHJpbmcgY29tcG9uZW50TmFtZSkKLQl7Ci0gICAgICAgICBjb21wb25lbnROYW1lXyA9IGNvbXBvbmVudE5hbWU7ICAgICAgCSAgIAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotCXsKLSAgICAgICAgIHJldHVybiBjb21wb25lbnROYW1lXyA7ICAgICAgCSAgIAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0JewotCQlwcm9qZWN0XyA9IHByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VVUkkoU3RyaW5nIHdzVXJpKQotCXsKLQkJd3NVcmlfID0gd3NVcmk7Ci0JfQkKLQkgCi0JICBwcm90ZWN0ZWQgdm9pZCBzZXRTaGVsbFN0eWxlKGludCBuZXdTaGVsbFN0eWxlKQotCSAgewotCSAgICBzdXBlci5zZXRTaGVsbFN0eWxlKCBuZXdTaGVsbFN0eWxlIHwgU1dULlJFU0laRSApOyAgCi0JICB9Ci0KLQkgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKQotCSAgewotCSAgICBuZXdTaGVsbC5zZXRUZXh0KHRpdGxlVGV4dF8pOyAgIAotCSAgICBzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JICB9Ci0KLQkgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheWFibGVTZWxlY3Rpb25TdHJpbmcoKSB7Ci0JCSAgCi0JCSByZXR1cm4gKChXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcilnZXRXaWRnZXQoKSkuZ2V0T2JqZWN0U2VsZWN0aW9uRGlzcGxheWFibGVTdHJpbmcoKTsKLQl9Ci0JICAKLQkgIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKSB7Ci0JCSAgcmV0dXJuICgoV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIpZ2V0V2lkZ2V0KCkpLmdldE9iamVjdFNlbGVjdGlvbigpOwotCX0KLQkgCi0JICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VVUkkoKQotCSAgewotCQkgIHJldHVybiB3c1VyaV87Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCl7Ci0JCSAgcmV0dXJuIHByb2plY3RfOwotCSAgfQotCi0gICAgICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLSAgICAgICAgc2V0Q29tcG9uZW50TmFtZSgoKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyKWdldFdpZGdldCgpKS5nZXRDb21wb25lbnROYW1lKCkpOwotICAgICAgICBzZXRQcm9qZWN0KCgoV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIpZ2V0V2lkZ2V0KCkpLmdldFByb2plY3QoKSk7Ci0gICAgICAgIHNldFdlYlNlcnZpY2VVUkkoKChXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcilnZXRXaWRnZXQoKSkuZ2V0V2ViU2VydmljZVVSSSgpKTsKLSAgICAJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxMzExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MTMgICAxMzU1ODEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNvbXBvbmVudE5hbWU7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gdGVzdFNlcnZpY2U7Ci0gIAotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKSB7Ci0gICAgcmV0dXJuIHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKGJvb2xlYW4gdGVzdFNlcnZpY2UpIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9qZWN0LgotICAgKi8KLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHByb2plY3Q7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QKLSAgICogICAgICAgICAgVGhlIHByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotICAKLSAgCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBvbmVudE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnROYW1lKFN0cmluZyBjb21wb25lbnROYW1lKQotICB7Ci0gICAgdGhpcy5jb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VzUGFyc2VyICE9IG51bGwpCi0gICAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgICAgCi0gICAgaWYgKHdzZGxVUkkgIT0gbnVsbCAmJiBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpICE9IG51bGwpIHsKLSAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgICAgIAotICAgICAgTWFwIHNlcnZpY2VzID0gZ2V0V2ViU2VydmljZXNQYXJzZXIoKS5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKS5nZXRTZXJ2aWNlcygpOwotICAgICAgaWYgKHNlcnZpY2VzLmlzRW1wdHkoKSl7Ci0gICAgICAgIGlmICh0ZXN0U2VydmljZT09dHJ1ZSl7Ci0gICAgICAgICAgICB0ZXN0U2VydmljZSA9IGZhbHNlOwotICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19XQVJOSU5HX05PX1NFUlZJQ0VfRUxFTUVOVCApOwotICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfV0FSTklOR19OT19TRVJWSUNFX0VMRU1FTlQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX01TR19TRUxFQ1RJT05fTVVTVF9CRV9XU0RMICk7Ci0gICAgICBpZiAoZW52ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvblRyZWVXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uVHJlZVdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNjMTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uVHJlZVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxOCAgIDEzNjcxMiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA3MDEzMSAgIDE2ODc4NiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgd3NkbCB1cmwgb24gd2ViIHNlcnZpY2Ugd2l6YXJkIHBhZ2UgMSBpcyBub3QgcmVmbGVjdGVkIGluIGJyb3dzZSBkaWFsb2cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotLyoqCi0qIFRoaXMgd2l6YXJkIHBhZ2UgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgV1NETCBVUkkgZm9yIGNvbnN1bXB0aW9uCi0qLwotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCi0gIC8qQ09OVEVYVF9JRCBQV1dTMDAwMSBmb3IgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BXV1NfUEFHRSA9ICIuUFdXUzAwMDEiOwotCi0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHdlYlNlcnZpY2VVUkk7Ci0gIAotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICBwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcl87Ci0gIHByaXZhdGUgVHJlZUNvbnRlbnRQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyOwotICBwcml2YXRlIFRyZWUgdHJlZV87Ci0gIHByaXZhdGUgaW50IHBhZ2VXaWR0aF87Ci0gIHByaXZhdGUgV2ViU2VydmljZUVudGl0eSBlbnRpdHlfOwotCi0gIC8qKgotICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICovCi0gIHB1YmxpYyBXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgCXRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICBwYXJlbnQuc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdXU19QQUdFKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgcGx1Z2luSWRfICsgSU5GT1BPUF9QV1dTX1BBR0UpOwotCi0gICAgTGFiZWwgd3NkbExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotICAgIHdzZGxMYWJlbC5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TRUxFQ1RfV1NETCk7Ci0gICAgd3NkbExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgdHJlZV8gPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLmhlaWdodEhpbnQgPSAyMDA7Ci0gICAgdHJlZV8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcGFnZVdpZHRoXyA9IHRyZWVfLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLng7Ci0gICAgdHJlZVZpZXdlcl8gPSBuZXcgVHJlZVZpZXdlcih0cmVlXyk7Ci0gICAgdHJlZUNvbnRlbnRQcm92aWRlciA9IG5ldyBUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0gICAgdHJlZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKHRyZWVDb250ZW50UHJvdmlkZXIpOwotICAgIHRyZWVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IFRyZWVMYWJlbFByb3ZpZGVyKCkpOwotICAgIHRyZWVWaWV3ZXJfLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLSAgICAgIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgCWhhbmRsZVRyZWVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRyZWVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gIAlzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChuZXcgRXZlbnQoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VzUGFyc2VyLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAJcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gIAl0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIAl0cmVlVmlld2VyXy5zZXRJbnB1dCh0aGlzLndlYlNlcnZpY2VzUGFyc2VyKTsKLSAgCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVVJJKFN0cmluZyB3c1VSSSkKLSAgewotICAJd2ViU2VydmljZVVSSSA9IHdzVVJJOwotICAJaWYgKCF0cmVlXy5pc0Rpc3Bvc2VkKCkpIHsKLSAgCQl0cmVlQ29udGVudFByb3ZpZGVyLnNldFdlYlNlcnZpY2VVUkkod2ViU2VydmljZVVSSSk7Ci0gIAkJcmVmcmVzaFRyZWVWaWV3ZXIoKTsKLSAgCX0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKCkKLSAgewotICAJaWYgKHdlYlNlcnZpY2VzUGFyc2VyICE9IG51bGwgJiYgd2ViU2VydmljZVVSSSAhPSBudWxsKQotICAJewotICAJICB0cmVlVmlld2VyXy5yZWZyZXNoKCk7Ci0gIAkgIENvbnRyb2wgc2hlbGwgPSB0cmVlXy5nZXRTaGVsbCgpOwotICAJICBpZiAodHJlZV8uZ2V0U2l6ZSgpLnggPiBwYWdlV2lkdGhfIHx8IHNoZWxsLmdldFNpemUoKS54ID4gcGFnZVdpZHRoXykKLSAgCSAgewotICAJICAgIHRyZWVfLnNldFNpemUocGFnZVdpZHRoXywgdHJlZV8uZ2V0U2l6ZSgpLnkpOwotICAJICAgIHNoZWxsLnNldFNpemUocGFnZVdpZHRoXywgc2hlbGwuZ2V0U2l6ZSgpLnkpOwotICAJICAgIHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gIAkgICAgc2hlbGwucmVkcmF3KCk7Ci0gIAkgIH0KLSAgCX0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gIHsKLSAgICB0cmVlXy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIHRyZWVfLmlzRW5hYmxlZCgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKQotICB7CSAgCi0JICAJaWYgKGVudGl0eV8gIT0gbnVsbCkKLQkgIAkgIHJldHVybiBlbnRpdHlfLmdldFVSSSgpOwotCSAgCWVsc2UKLQkgIAkgIHJldHVybiB3ZWJTZXJ2aWNlVVJJOwotICB9Ci0gIAotICBwcml2YXRlIFdlYlNlcnZpY2VFbnRpdHkgZ2V0U2VsZWN0aW9uQXNXZWJTZXJ2aWNlRW50aXR5KCkKLSAgewotICAJaWYgKHRyZWVWaWV3ZXJfICE9IG51bGwpCi0gIAl7Ci0gICAgICBJU2VsZWN0aW9uIHNlbCA9IHRyZWVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKCFzZWwuaXNFbXB0eSgpICYmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0gICAgICB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFbnRpdHkpCi0gICAgICAgICAgcmV0dXJuIChXZWJTZXJ2aWNlRW50aXR5KW9iamVjdDsKLSAgICAgIH0KLSAgCX0KLSAgICByZXR1cm4gbnVsbDsgIAkKLSAgfQotICAgIAotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKQotICB7ICAgIAotCWVudGl0eV8gPSBnZXRTZWxlY3Rpb25Bc1dlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICBpZiAoZW50aXR5XyA9PSBudWxsIHx8IGVudGl0eV8uZ2V0VHlwZSgpICE9IFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMKQotICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9NU0dfU0VMRUNUSU9OX01VU1RfQkVfV1NETCApOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLSAgewotICAJcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSTsKLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlc1BhcnNlcikKLSAgICAgIHsKLSAgICAgIAlXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIgPSAoV2ViU2VydmljZXNQYXJzZXIpaW5wdXRFbGVtZW50OwotICAgICAgICBPYmplY3Qgd3NFbnRpdHkgPSBwYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdlYlNlcnZpY2VVUkkpOwotICAgICAgICBpZiAod3NFbnRpdHkgIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt3c0VudGl0eX07Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRW50aXR5KQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSAoKFdlYlNlcnZpY2VFbnRpdHkpcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbGlzdC5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgb2JqZWN0c1tpXSA9IGxpc3QuZ2V0KGkpOwotICAgICAgICByZXR1cm4gb2JqZWN0czsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZUVudGl0eSkKLSAgICAgICAgcmV0dXJuICgoV2ViU2VydmljZUVudGl0eSllbGVtZW50KS5nZXRQYXJlbnQoKTsKLSAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VVUkkoU3RyaW5nIHdzVVJJKQotICAgIHsKLSAgICAgIHdlYlNlcnZpY2VVUkkgPSB3c1VSSTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCgoV2ViU2VydmljZUVudGl0eSllbGVtZW50KS5nZXRUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV2ViU2VydmljZUVudGl0eS5UWVBFX0hUTUw6Ci0gICAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd3NpbC9odG1sLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGNhc2UgV2ViU2VydmljZUVudGl0eS5UWVBFX1dTSUw6Ci0gICAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd3NpbC93c2lsLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGNhc2UgV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREw6Ci0gICAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd3NpbC93c2RsLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoKFdlYlNlcnZpY2VFbnRpdHkpZWxlbWVudCkuZ2V0VVJJKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTgyMmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTYgICAxNTk2MTggbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFByb2plY3QgYW5kIEVBUiBub3QgZGVmYXVsdGVkIHByb3Blcmx5IHdoZW4gd2l6YXJkIGxhdW5jaGVkIGZyb20gSlNSLTEwOSBXZWIgc2VydmljZXMgYnJhbmNoIGluIEoyRUUgUHJvamVjdCBFeHBsb3JlcgotICogMjAwNzAzMjcgICAxNzIzMzkga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDcwNDEwICAgMTgxODI3IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5Vbml2ZXJzYWxQYXRoVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS51dGlscy5BZGFwdGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0gIHByaXZhdGUgVW5pdmVyc2FsUGF0aFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyXyA9IG5ldyBVbml2ZXJzYWxQYXRoVHJhbnNmb3JtZXIoKTsgCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VVUkkoKQotICB7Ci0gICAgU3RyaW5nIHVyaSA9ICIiOwotICAgIAotICAJaWYgKHNlbGVjdGlvbl8gIT0gbnVsbCAmJiAhc2VsZWN0aW9uXy5pc0VtcHR5KCkpCi0gIAl7Ci0gIAkgIE9iamVjdCBmaXJzdFNlbCA9IHNlbGVjdGlvbl8uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gIAkgIGlmIChmaXJzdFNlbCBpbnN0YW5jZW9mIElGaWxlKQotICAJICB7Ci0gIAkgICAgSUZpbGUgaWZpbGUgPSAoSUZpbGUpZmlyc3RTZWw7Ci0gIAkgICAgU3RyaW5nIGV4dCA9IGlmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgCSAgICBpZiAoZXh0ICE9IG51bGwgJiYgKGV4dC5lcXVhbHMoIndzZGwiKSB8fCBleHQuZXF1YWxzKCJ3c2lsIikgfHwgZXh0LmVxdWFscygiaHRtbCIpKSkKLSAgCSAgICB7Ci0gIAkgICAgICB1cmkgPSBpZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gIAkgICAgfQotICAJICB9IGVsc2UgaWYgKGZpcnN0U2VsIGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICB7Ci0gICAgICAgIFNlcnZpY2VJbXBsIHNlcnZpY2VJbXBsID0gKFNlcnZpY2VJbXBsKWZpcnN0U2VsOwotICAgICAgICB1cmkgPSBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSShzZXJ2aWNlSW1wbCk7Ci0gICAgICB9IGVsc2UgaWYgKGZpcnN0U2VsIGluc3RhbmNlb2YgU2VydmljZVJlZikKLSAgICAgIHsKLSAgCSAgICBTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSAoU2VydmljZVJlZilmaXJzdFNlbDsKLSAgICAgICAgdXJpID0gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoc2VydmljZVJlZik7Ci0gICAgICB9IGVsc2UgaWYgKGZpcnN0U2VsIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkKLSAgCSAgewotICAJICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbFJJID0gKFdTRExSZXNvdXJjZUltcGwpZmlyc3RTZWw7Ci0gIAkgICAgdXJpID0gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkod3NkbFJJKTsKLSAgCSAgfSBlbHNlIGlmIChmaXJzdFNlbCBpbnN0YW5jZW9mIFN0cmluZykKLSAgCSAgewotICAJICAgIHVyaSA9IChTdHJpbmcpZmlyc3RTZWw7Ci0gIAkgIH0gZWxzZSB7Ci0gIAkJU3RyaW5nIGFkYXB0ZWRVcmkgPSBBZGFwdGVyVXRpbHMuZ2V0QWRhcHRlZFdTREwoZmlyc3RTZWwpOwotICAJCWlmIChhZGFwdGVkVXJpICE9IG51bGwpIHsKLSAgCQkJdXJpID0gYWRhcHRlZFVyaTsKLSAgCQl9Ci0gIAkgIH0KLSAgCSAgCi0gIAkgIHVyaSA9IHRyYW5zZm9ybWVyXy50b1BhdGgodXJpKTsKLSAgCX0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLSAgICBzZWxlY3Rpb25fID0gc2VsZWN0aW9uOyAgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5XU0lMKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVVJJKCkKLSAgewotICAJU3RyaW5nIHdzVVJJID0gZ2V0V2ViU2VydmljZVVSSSgpOwotICAJaWYgKHdzVVJJICE9IG51bGwgJiYgd3NVUkkubGVuZ3RoKCkgPiAwICYmIHdzVVJJLmVuZHNXaXRoKCJ3c2RsIikpCi0gIAl7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHdzVVJJLnN1YnN0cmluZygwLCB3c1VSSS5sZW5ndGgoKS00KSk7Ci0gICAgICBzYi5hcHBlbmQoIndzaWwiKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAJfQotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gIAlJUHJvamVjdCBwID0gZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKHNlbGVjdGlvbl8pOwotICAJcmV0dXJuIHA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgY25hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUluaXRpYWxTZWxlY3Rpb24oc2VsZWN0aW9uXyk7Ci0gICAgcmV0dXJuIGNuYW1lOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaGFzUHJvdG9jb2woU3RyaW5nIHVybCkgewkgIAotICAgIHJldHVybiB1cmwuaW5kZXhPZigiOiIpICE9IC0xOwkgIAotICB9Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIGlmIChyZXNvdXJjZT09bnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldFdlYlNlcnZpY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChoYXNQcm90b2NvbCh1cmkpKSByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihuZXcgUGF0aCh1cmkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENvbXBvbmVudE5hbWVGcm9tSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXA7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gZ2V0V2ViU2VydmljZVVSSSgpOwotICAgICAgICAgICAgaWYgKGhhc1Byb3RvY29sKHVyaSkpIHJldHVybiBudWxsOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihuZXcgUGF0aCh1cmkpKSA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihyZXNvdXJjZSk7Ci0gICAgICAgICAgaWYgKGNvbXAhPW51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0JICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfSAgICAKLSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE5YTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyMCAgIDEzNTkxMiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyIGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgV1NETFNlbGVjdGlvbldpZGdldCB3c2RsU2VsZWN0aW9uV2lkZ2V0OwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNvbXBvbmVudE5hbWU7Ci0gIAotICBwdWJsaWMgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIoKQotICB7Ci0JICB3c2RsU2VsZWN0aW9uV2lkZ2V0ID0gbmV3IFdTRExTZWxlY3Rpb25XaWRnZXQoKTsKLSAgfQotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsgICAgCi0gICAgd3NkbFNlbGVjdGlvbldpZGdldC5hZGRDb250cm9scyhwYXJlbnQsIHN0YXR1c0xpc3RlbmVyKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiB3c2RsU2VsZWN0aW9uV2lkZ2V0LmdldFN0YXR1cygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVVJJKFN0cmluZyB3c1VyaSkKLSAgewotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbDsKLSAgICBpZiAod3NVcmkgIT0gbnVsbCkKLSAgICAgIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzVXJpKTsKLSAgICBlbHNlCi0gICAgICBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgIHdzZGxTZWxlY3Rpb25XaWRnZXQuc2V0SW5pdGlhbFNlbGVjdGlvbihzZWwpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VVUkkoKQotICB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsICAgID0gd3NkbFNlbGVjdGlvbldpZGdldC5nZXRPYmplY3RTZWxlY3Rpb24oKTsKLSAgICBPYmplY3QgICAgICAgICAgICAgICBvYmplY3QgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiAob2JqZWN0ICE9IG51bGwgKQotICAgIHsKLSAgICAgIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBXU0RMU2VsZWN0aW9uV3JhcHBlciApCi0gICAgICB7ICAgIAotICAgICAgICAvLyBHZXQgYXQgdGhlIGlubmVyIHN0cnVjdHVyZWQgc2VsZWN0aW9uIG9iamVjdC4KLSAgICAgICAgV1NETFNlbGVjdGlvbldyYXBwZXIgd3JhcHBlciAgICAgICAgPSAoV1NETFNlbGVjdGlvbldyYXBwZXIpb2JqZWN0OwotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbm5lclNlbGVjdGlvbiA9IHdyYXBwZXIud3NkbFNlbGVjdGlvbjsKLSAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgaW5uZXJPYmplY3QgICAgPSBpbm5lclNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGlubmVyT2JqZWN0ID09IG51bGwgPyBudWxsIDogaW5uZXJPYmplY3QudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgCXJldHVybiBnZXRXZWJTZXJ2aWNlVVJJKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICByZXR1cm4gd3NkbFNlbGVjdGlvbldpZGdldC5nZXRXZWJTZXJ2aWNlc1BhcnNlcigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAJSVByb2plY3QgcCA9IHdzZGxTZWxlY3Rpb25XaWRnZXQuZ2V0UHJvamVjdCgpOwotICAJaWYgKHA9PW51bGwpCi0gIAl7Ci0gIAkgIHJldHVybiBwcm9qZWN0OwotICAJfQotICAJZWxzZQotICAJICByZXR1cm4gcDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgY25hbWUgPSB3c2RsU2VsZWN0aW9uV2lkZ2V0LmdldENvbXBvbmVudE5hbWUoKTsKLSAgICBpZiAoY25hbWU9PW51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBjbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudE5hbWUoU3RyaW5nIGNvbXBvbmVudE5hbWUpCi0gIHsKLSAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdFNlbGVjdGlvbkRpc3BsYXlhYmxlU3RyaW5nKCkgewotCSAgaWYgKHdzZGxTZWxlY3Rpb25XaWRnZXQgIT0gbnVsbCkKLQkgIHsKLQkJICByZXR1cm4gd3NkbFNlbGVjdGlvbldpZGdldC5nZXRPYmplY3RTZWxlY3Rpb25EaXNwbGF5YWJsZVN0cmluZygpOyAgCi0JICB9Ci0JICBlbHNlIHJldHVybiAiIjsgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKSB7Ci0JICByZXR1cm4gd3NkbFNlbGVjdGlvbldpZGdldC5nZXRPYmplY3RTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoU3RyaW5nIHMpCi0gIHsKLQkgIHJldHVybiB3c2RsU2VsZWN0aW9uV2lkZ2V0LnZhbGlkYXRlKHMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU2MWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDcgICAxMzU0NDMgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA0MTAgICAxMzU0NDEgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA0MTAgICAxMzYwMzAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNDExICAgMTM2MTY3IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDQxNyAgIDEzNjM5MCBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQxMyAgIDEzNTU4MSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDIwICAgMTM2MTU4IHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjAgICAxMzY3MDUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQyMSAgIDEzNjc2MSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI0ICAgMTM4MDUyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDQyNSAgIDEzNzgzMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI2ICAgMTM3NjIyIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNDI3ICAgMTM4MDU4IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNTA0ICAgMTM4MDM1IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDYwNyAgIDE0NDgyNiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDYwNyAgIDE0NDA0OSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDYxNCAgIDE0NjI3MCBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDcxNyAgIDE1MDU3NyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1hawotICogMjAwNjA3MjYgICAxNTA4NjUgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA2MDgxNyAgIDE0MDAxNyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgbG9uZ2VyIHByb2plY3Qgb3Igc2VydmVyL3J1bnRpbWUgc3RyaW5ncyBkbyBub3QgcmVzaXplIHdpemFyZAotICogMjAwNjA4MjkgICAxNTU0NDEgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIHdlYiBzZXJ2aWNlIHdpemFyZCBoYW5ncyBkdXJpbmcgcmVzaXplCi0gKiAyMDA3MDEyNiAgIDEzODQ4NCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uRGVmYXVsdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uVmFsaWRhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5Qcm9qZWN0U2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuTGFiZWxzQW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjYWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5IeXBlcmxpbmtHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5IeXBlcmxpbmtTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5QYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciBpbXBsZW1lbnRzIElQYWNrYWJsZQoteyAgICAKLQkgLy8gSU5GT1BPUFMJIAotCSAvKiBDT05URVhUX0lEIFdTV1NDRU4wMDIyIGZvciB0aGUgU2VydmVyIGh5cGVybGluayBvZiB0aGUgU2NlbmFyaW8gUGFnZSAqLwotCSBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1dTV1NDRU5fSFlQRVJMSU5LX1NFUlZFUiA9ICJXU1dTQ0VOMDAyMiI7Ci0JIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMjMgZm9yIHRoZSBSdW50aW1lIGh5cGVybGluayBvZiB0aGUgU2NlbmFyaW8gUGFnZSAqLwotCSBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1dTV1NDRU5fSFlQRVJMSU5LX1JVTlRJTUUgPSAiV1NXU0NFTjAwMjMiOwotCSAvKiBDT05URVhUX0lEIFdTV1NDRU4wMDI0IGZvciB0aGVQcm9qZWN0cyBoeXBlcmxpbmsgb2YgdGhlIFNjZW5hcmlvIFBhZ2UgKi8KLSAgICAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9XU1dTQ0VOX0hZUEVSTElOS19QUk9KRUNUUyAgPSAiV1NXU0NFTjAwMjQiOwotCSAvKiBDT05URVhUX0lEIFdTV1NDRU4wMDI1IGZvciB0aGVDbGllbnQgVHlwZSBjb21ibyBib3ggb2YgdGhlIFNjZW5hcmlvIFBhZ2UgKi8KLQkgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9XU1dTQ0VOX0NPTUJPX0NMSUVOVFRZUEUgPSAiV1NXU0NFTjAwMjUiOwotCSAvKiBDT05URVhUX0lEIFdTV1NDRU4wMDI2IGZvciB0aGVDbGllbnQgU2xpZGVyIG9mIHRoZSBTY2VuYXJpbyBQYWdlICovCi0JIHByaXZhdGUgU3RyaW5nIElORk9QT1BfV1NXU0NFTl9TQ0FMRV9DTElFTlQgPSAiV1NXU0NFTjAwMjYiOwotCQotICBwcml2YXRlIFN0cmluZyBHUkFQSElDX0NMSUVOVF8wPSJpY29ucy9jbGllbnRfdGVzdC5qcGciOyAgLy8kTk9OLU5MUy1OJAotICBwcml2YXRlIFN0cmluZyBHUkFQSElDX0NMSUVOVF8xPSJpY29ucy9jbGllbnRfcnVuLmpwZyI7ICAgLy8kTk9OLU5MUy1OJAotICBwcml2YXRlIFN0cmluZyBHUkFQSElDX0NMSUVOVF8yPSJpY29ucy9jbGllbnRfaW5zdGFsbC5qcGciOyAvLyROT04tTkxTLU4kCi0gIHByaXZhdGUgU3RyaW5nIEdSQVBISUNfQ0xJRU5UXzM9Imljb25zL2NsaWVudF9kZXBsb3kuanBnIjsgLy8kTk9OLU5MUy1OJAotICBwcml2YXRlIFN0cmluZyBHUkFQSElDX0NMSUVOVF80PSJpY29ucy9jbGllbnRfYXNzZW1ibGUuanBnIjsgLy8kTk9OLU5MUy1OJAotICBwcml2YXRlIFN0cmluZyBHUkFQSElDX0NMSUVOVF81PSJpY29ucy9jbGllbnRfZGV2ZWxvcC5qcGciOyAgLy8kTk9OLU5MUy1OJAotICBwcml2YXRlIFN0cmluZyBHUkFQSElDX0NMSUVOVF82PSJpY29ucy9jbGllbnRfbm9uZS5qcGciOyAgLy8kTk9OLU5MUy1OJAotICAKLSAgcHJpdmF0ZSBTdHJpbmcgSUNPTl9TQ0FMRV9CR18wPSJpY29ucy9zY2FsZTBfYmdyb3VuZC5qcGciOyAgLy8kTk9OLU5MUy1OJAotICBwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzE9Imljb25zL3NjYWxlMV9iZ3JvdW5kLmpwZyI7ICAvLyROT04tTkxTLU4kCi0gIHByaXZhdGUgU3RyaW5nIElDT05fU0NBTEVfQkdfMj0iaWNvbnMvc2NhbGUyX2Jncm91bmQuanBnIjsgIC8vJE5PTi1OTFMtTiQKLSAgcHJpdmF0ZSBTdHJpbmcgSUNPTl9TQ0FMRV9CR18zPSJpY29ucy9zY2FsZTNfYmdyb3VuZC5qcGciOyAgLy8kTk9OLU5MUy1OJAotICBwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzQ9Imljb25zL3NjYWxlNF9iZ3JvdW5kLmpwZyI7ICAvLyROT04tTkxTLU4kCi0gIHByaXZhdGUgU3RyaW5nIElDT05fU0NBTEVfQkdfNT0iaWNvbnMvc2NhbGU1X2Jncm91bmQuanBnIjsgIC8vJE5PTi1OTFMtTiQKLSAgcHJpdmF0ZSBTdHJpbmcgSUNPTl9TQ0FMRV9CR182PSJpY29ucy9zY2FsZTZfYmdyb3VuZC5qcGciOyAgLy8kTk9OLU5MUy1OJAotICAKLSAgcHJpdmF0ZSBDb21wb3NpdGUgY2xpZW50Q29tcG9zaXRlXzsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgaENvbXBDbGllbnRfOwotICBwcml2YXRlIFNoZWxsIHNoZWxsXzsKLSAgcHJpdmF0ZSBDb21ibyAgY2xpZW50VHlwZUNvbWJvXzsgIAotICBwcml2YXRlIFNjYWxlIGNsaWVudFNjYWxlXzsgIAotICBwcml2YXRlIExhYmVsIHRvcG9sb2d5U3BvdF87Ci0gIHByaXZhdGUgTGFiZWwgY2xpZW50RGV0YWlsc0xhYmVsXzsgIAotICBwcml2YXRlIEh5cGVybGluayBoTGlua0NsaWVudFJ1bnRpbWVfOwotICBwcml2YXRlIEh5cGVybGluayBoTGlua0NsaWVudFNlcnZlcl87Ci0gIHByaXZhdGUgSHlwZXJsaW5rIGhMaW5rQ2xpZW50UHJvamVjdF87Ci0gIHByaXZhdGUgSHlwZXJsaW5rIGhMaW5rQ2xpZW50RUFSXzsKLSAgcHJpdmF0ZSBQcm9qZWN0U2VsZWN0aW9uRGlhbG9nIHByb2plY3REaWFsb2dfOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIGRldmVsb3BDbGllbnRfOwotICBwcml2YXRlIGJvb2xlYW4gYXNzZW1ibGVDbGllbnRfOwotICBwcml2YXRlIGJvb2xlYW4gZGVwbG95Q2xpZW50XzsKLQkKLSAgcHJpdmF0ZSBCb29sZWFuIHRlc3RDbGllbnRfOwotICBwcml2YXRlIEJvb2xlYW4gaW5zdGFsbENsaWVudF87Ci0gIHByaXZhdGUgQm9vbGVhbiBzdGFydENsaWVudF87ICAgIAotICAgIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIGlkc187Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZVByb3h5XzsgIC8vc2VydmljZSBzY2FsZSBpcyBzZXQgdG8gYSBsZXZlbCB0aGF0IHRoZSBjbGllbnQgc2NhbGUgY2FuIGJlIGVuYWJsZWQKLSAgcHJpdmF0ZSBib29sZWFuIGNsaWVudE9ubHlfPWZhbHNlOwotICBwcml2YXRlIGludCBjbGllbnRTY2FsZVNldHRpbmdfOwotICBwcml2YXRlIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdfOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcl87Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWVfOwotICBwcml2YXRlIGJvb2xlYW4gbmVlZEVhcl87Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudENvbXBvbmVudFR5cGVfOwotICAKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcl87Ci0gIHByaXZhdGUgaW50IHZhbGlkYXRpb25TdGF0ZV87Ci0gIAotICBwcml2YXRlIFNjYWxlU2VsZWN0aW9uTGlzdGVuZXIgc2NhbGVTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTY2FsZVNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0gIAotICBwcml2YXRlIFN0cmluZyBDTElFTlRfUlVOVElNRV9QUkVGSVggPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfUlVOVElNRVNfTElTVCA7IAotICBwcml2YXRlIFN0cmluZyBDTElFTlRfU0VSVkVSX1BSRUZJWCA9ICBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU0VSVkVSU19MSVNUOwotICBwcml2YXRlIFN0cmluZyBDTElFTlRfUFJPSkVDVF9QUkVGSVggPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQ0xJRU5UX1BST0pFQ1Q7Ci0gIHByaXZhdGUgU3RyaW5nIENMSUVOVF9FQVJfUFJFRklYID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0NMSUVOVF9FQVJfUFJPSkVDVDsKLSAgCi0gIHByaXZhdGUgQ29tcG9zaXRlIGNsaWVudEdyb3VwQ29tcG9zaXRlXyA7Ci0JCi0gIHByaXZhdGUgVUlVdGlscyB1dGlsc18gPSBuZXcgVUlVdGlscygib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIik7Ci0gIHByaXZhdGUgSVBhY2thYmxlIHBhY2thYmxlXyA9IG51bGw7ICAKLSAgcHJpdmF0ZSBMYWJlbHNBbmRJZHMgbGFiZWxJZHNfOwotICAKLSAgcHVibGljIFdlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0KGJvb2xlYW4gY2xpZW50T25seSkgewotCSAgICBjbGllbnRPbmx5XyA9IGNsaWVudE9ubHk7Ci0JCWluaXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCXZhbGlkYXRpb25TdGF0ZV8gPSBWYWxpZGF0aW9uVXRpbHMuVkFMSURBVEVfQUxMOwotCX0KLSAgIAotICAgIC8qKgotICAgICAqIEdpdmUgdGhpcyB3aWRnZXQgYSBoYW5kbGUgdG8gYW4gSVBhY2thYmxlIGluc3RhbmNlLCB3aGljaCB3aWxsIGFsc28gYmUKLSAgICAgKiBwYWNrZWQgd2hlbiB0aGlzIHdpZGdldCdzIHBhY2tJdCgpIGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2FibGUgVGhlIElQYWNrYWJsZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWJsZShJUGFja2FibGUgcGFja2FibGUpIHsKLSAgICAJcGFja2FibGVfID0gcGFja2FibGU7Ci0gICAgfQotICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5JUGFja2FibGUjcGFja0l0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWNrSXQoKSB7Ci0JCWNsaWVudEdyb3VwQ29tcG9zaXRlXy5wYWNrKHRydWUpOwkJCi0JCXV0aWxzXy5ob3Jpem9udGFsUmVzaXplKGNsaWVudEdyb3VwQ29tcG9zaXRlXy5nZXRTaGVsbCgpLCBjbGllbnRHcm91cENvbXBvc2l0ZV8sIFVJVXRpbHMuREVGQVVMVF9QQURESU5HKTsKLQkJaWYgKCFjbGllbnRPbmx5XyAmJiBwYWNrYWJsZV8gIT0gbnVsbCkKLQkJCXBhY2thYmxlXy5wYWNrSXQoKTsKLQl9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjYWRkQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIHN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOwotICAgIENvbXBvc2l0ZSBjbGllbnRUeXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGNjbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQljY2xheW91dC5udW1Db2x1bW5zID0gMjsKLQljY2xheW91dC5tYXJnaW5Ub3A9MzsKLQljbGllbnRUeXBlQ29tcG9zaXRlLnNldExheW91dCggY2NsYXlvdXQgKTsKLSAgICBHcmlkRGF0YSBjY0dyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7IAotICAgIGNsaWVudFR5cGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShjY0dyaWREYXRhKTsKLSAgICAKLSAgICBpbnQgY29tYm9TdHlsZSA9IFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWTsKLSAgICBjbGllbnRUeXBlQ29tYm9fID0gdXRpbHNfLmNyZWF0ZUNvbWJvKCBjbGllbnRUeXBlQ29tcG9zaXRlLCAKLSAgICAJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9XRUJTRVJWSUNFQ0xJRU5UVFlQRSwKLSAgICAJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXUFJfQ09NQk9fQ0xJRU5UVFlQRSwgCi0gICAgCQlJTkZPUE9QX1dTV1NDRU5fQ09NQk9fQ0xJRU5UVFlQRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21ib1N0eWxlICk7Ci0gICAgR3JpZERhdGEgY29tYm9HcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgIGNsaWVudFR5cGVDb21ib18uc2V0TGF5b3V0RGF0YShjb21ib0dyaWREYXRhKTsKLQljbGllbnRUeXBlQ29tYm9fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkVHlwZUlkID0gaWRzXy5nZXRUeXBlSWQoKTsKLQkJCQlpbnQgY3VycmVudFNlbGVjdGlvbklkeCA9IGNsaWVudFR5cGVDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlTdHJpbmcgY3VycmVudFR5cGVJZCA9IGxhYmVsSWRzXy5nZXRJZHNfKClbY3VycmVudFNlbGVjdGlvbklkeF07Ci0JCQkJaWYgKCFvbGRUeXBlSWQuZXF1YWxzKGN1cnJlbnRUeXBlSWQpKSB7CQkKLQkJCQkJLy8gaGFuZGxlIGNoYW5naW5nIGNsaWVudCB0eXBlCi0JCQkJCWlkc18uc2V0VHlwZUlkKGN1cnJlbnRUeXBlSWQpOwotCQkJCQlyZWZyZXNoU2VydmVyUnVudGltZVNlbGVjdGlvbigpOwotCQkJCX0KLQkJCQl2YWxpZGF0aW9uU3RhdGVfID0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX0FMTDsKLQkJCQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0JCQl9Ci0KLQkJfSk7ICAgIAotICAgIAotICAgIGNsaWVudEdyb3VwQ29tcG9zaXRlXyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7ICAgIAotCUdyaWRMYXlvdXQgZ2NsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWdjbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCWdjbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nPTA7CQkKLQlnY2xheW91dC5tYXJnaW5IZWlnaHQ9MDsJCQotCWdjbGF5b3V0Lm1hcmdpbkJvdHRvbT01OwotCWNsaWVudEdyb3VwQ29tcG9zaXRlXy5zZXRMYXlvdXQoIGdjbGF5b3V0ICk7Ci0gICAgR3JpZERhdGEgZ2NHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCB0cnVlKTsgCi0gICAgY2xpZW50R3JvdXBDb21wb3NpdGVfLnNldExheW91dERhdGEoZ2NHcmlkRGF0YSk7Ci0gICAgCi0gICAgY2xpZW50R3JvdXBDb21wb3NpdGVfLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkKLQl7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCi0JCX0KLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCWNsaWVudEdyb3VwQ29tcG9zaXRlXy5wYWNrKHRydWUpOwotCQl9Ci0JfSk7Ci0gICAgCi0gICAgICAgCi0JY2xpZW50Q29tcG9zaXRlXyA9ICBuZXcgQ29tcG9zaXRlKGNsaWVudEdyb3VwQ29tcG9zaXRlXywgU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgZ3JpZGxheW91dCAgID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkbGF5b3V0Lm51bUNvbHVtbnMgICA9IDI7Ci0gICAgZ3JpZGxheW91dC5ob3Jpem9udGFsU3BhY2luZz0wOwotICAgIGdyaWRsYXlvdXQubWFyZ2luSGVpZ2h0PTA7Ci0gICAgY2xpZW50Q29tcG9zaXRlXy5zZXRMYXlvdXQoIGdyaWRsYXlvdXQgKTsKLSAgICBHcmlkRGF0YSBzY0dyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgY2xpZW50Q29tcG9zaXRlXy5zZXRMYXlvdXREYXRhKHNjR3JpZERhdGEpOwotICAgIAotICAgIGNsaWVudFNjYWxlXyA9IG5ldyBTY2FsZShjbGllbnRDb21wb3NpdGVfICwgU1dULlZFUlRJQ0FMIHwgU1dULkJPUkRFUik7CQkKLQl1dGlsc18uY3JlYXRlSW5mb1BvcChjbGllbnRTY2FsZV8sIElORk9QT1BfV1NXU0NFTl9TQ0FMRV9DTElFTlQpOwkKLQljbGllbnRTY2FsZV8uc2V0TWluaW11bSgwKTsKLQljbGllbnRTY2FsZV8uc2V0TWF4aW11bSg2KTsKLQljbGllbnRTY2FsZV8uc2V0SW5jcmVtZW50KDEpOwotCWNsaWVudFNjYWxlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzY2FsZVNlbGVjdGlvbkxpc3RlbmVyKTsJCQotCXNldENsaWVudFNjYWxlKGdldENsaWVudEdlbmVyYXRpb24oKSk7Ci0JY2xpZW50U2NhbGVfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfQ0xJRU5UKTsKLQkKLQlBY2Nlc3NpYmxlIGFjY2Vzc2libGVTY2FsZSA9IGNsaWVudFNjYWxlXy5nZXRBY2Nlc3NpYmxlKCk7Ci0JYWNjZXNzaWJsZVNjYWxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKXsKLQkJLy8gcmV0dXJuIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgc2xpZGVyCi0JCS8vICB0aGlzIGlzIHJlYWQgYnkgdGhlIHNjcmVlbiByZWFkZXIgd2hlbiB0aGUgc2xpZGVyIGZpcnN0IGdldHMgZm9jdXMKLQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJZS5yZXN1bHQgPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0NMSUVOVDsJCQkKLQkJfQkJCQotCX0pOwotCWFjY2Vzc2libGVTY2FsZS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKXsKLQkJLy8gcmV0dXJuIGEgbWVhbmluZ2Z1bCBzdHJpbmcgd2hlbiB0aGUgc2NyZWVuIHJlYWRlcgotCQkvLyBhdHRlbXB0cyB0byBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHNlcnZpY2Ugc2NhbGUKLQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlpbnQgc2VsZWN0aW9uID0gY2xpZW50U2NhbGVfLmdldFNlbGVjdGlvbigpOwotCQkJc3dpdGNoIChzZWxlY3Rpb24pIHsKLQkJCWNhc2UgMDoKLQkJCQllLnJlc3VsdCA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfVEVTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQllLnJlc3VsdCA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfUlVOOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWUucmVzdWx0ID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9JTlNUQUxMOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCWUucmVzdWx0ID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9ERVBMT1k7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJZS5yZXN1bHQgPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0FTU0VNQkxFOwotCQkJCWJyZWFrOwotCQkJY2FzZSA1OgotCQkJCWUucmVzdWx0ID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9ERVZFTE9QOwotCQkJCWJyZWFrOwotCQkJY2FzZSA2OgkJCQkKLQkJCQlpZiAoY2xpZW50T25seV8pCi0JCQkJCWUucmVzdWx0ID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9DTElFTlRfT05MWTsKLQkJCQllbHNlCi0JCQkJCWUucmVzdWx0ID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9DTElFTlQ7CQkJCQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0JCQkJCQkJCQotCQl9Ci0JfSk7Ci0JCi0JR3JpZERhdGEgbGF5b3V0RGF0YTEgPSBuZXcgR3JpZERhdGEoKTsKLQlsYXlvdXREYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50PVNXVC5DRU5URVI7Ci0JbGF5b3V0RGF0YTEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCVJlY3RhbmdsZSBzY2FsZVIgPSAoaW1hZ2VSZWdfLmdldChJQ09OX1NDQUxFX0JHXzApKS5nZXRCb3VuZHMoKTsJCi0JbGF5b3V0RGF0YTEuaGVpZ2h0SGludD1zY2FsZVIuaGVpZ2h0OwotCWxheW91dERhdGExLndpZHRoSGludD1zY2FsZVIud2lkdGgrMTsKLQljbGllbnRTY2FsZV8uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhMSk7Ci0JCQotCXRvcG9sb2d5U3BvdF8gPSBuZXcgTGFiZWwoY2xpZW50Q29tcG9zaXRlXyAsIFNXVC5DRU5URVIgfCBTV1QuQk9SREVSICk7Ci0JdG9wb2xvZ3lTcG90Xy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCWlmIChjbGllbnRPbmx5XykKLQkJdG9wb2xvZ3lTcG90Xy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0NMSUVOVF9PTkxZKTsKLQllbHNlCi0JdG9wb2xvZ3lTcG90Xy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0NMSUVOVCk7Ci0JCi0JR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWxheW91dERhdGEudmVydGljYWxBbGlnbm1lbnQ9U1dULkJFR0lOTklORzsKLQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQ9U1dULkJFR0lOTklORzsKLQlSZWN0YW5nbGUgdG9wUiA9IChpbWFnZVJlZ18uZ2V0KEdSQVBISUNfQ0xJRU5UXzYpKS5nZXRCb3VuZHMoKTsKLQlsYXlvdXREYXRhLndpZHRoSGludD10b3BSLndpZHRoOwotCWxheW91dERhdGEuaGVpZ2h0SGludD10b3BSLmhlaWdodDsKLQl0b3BvbG9neVNwb3RfLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7CQkKLQkKLQlzZXRHcmFwaGljcyhnZXRDbGllbnRHZW5lcmF0aW9uKCkpOwotCQkKLQloQ29tcENsaWVudF8gPSB1dGlsc18uY3JlYXRlQ29tcG9zaXRlKGNsaWVudEdyb3VwQ29tcG9zaXRlXywgMSk7Ci0JCi0JY2xpZW50RGV0YWlsc0xhYmVsXyA9IG5ldyBMYWJlbChoQ29tcENsaWVudF8sIFNXVC5OT05FKTsKLQljbGllbnREZXRhaWxzTGFiZWxfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1NVTU1BUlkpOwotCQotCWhMaW5rQ2xpZW50U2VydmVyXz0gbmV3IEh5cGVybGluayhoQ29tcENsaWVudF8sIFNXVC5OVUxMKTsKLQl1dGlsc18uY3JlYXRlSW5mb1BvcChoTGlua0NsaWVudFNlcnZlcl8sIElORk9QT1BfV1NXU0NFTl9IWVBFUkxJTktfU0VSVkVSKTsKLQloTGlua0NsaWVudFNlcnZlcl8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdSU19URVhUX1NFUlZFUik7Ci0JaExpbmtDbGllbnRTZXJ2ZXJfLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKXsJCQkKLQkJCWxhdW5jaFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2codHJ1ZSwgdHJ1ZSk7CQkJCQotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGUpe30KLQkJcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKXt9CQkJCi0JfSk7Ci0JCi0JaExpbmtDbGllbnRSdW50aW1lXyA9IG5ldyBIeXBlcmxpbmsoaENvbXBDbGllbnRfLCBTV1QuTlVMTCk7Ci0JdXRpbHNfLmNyZWF0ZUluZm9Qb3AoaExpbmtDbGllbnRSdW50aW1lXywgSU5GT1BPUF9XU1dTQ0VOX0hZUEVSTElOS19SVU5USU1FKTsKLQloTGlua0NsaWVudFJ1bnRpbWVfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXUlNfVEVYVF9SVU5USU1FKTsKLQloTGlua0NsaWVudFJ1bnRpbWVfLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKXsJCQkKLQkJCWxhdW5jaFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2codHJ1ZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSl7fQotCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpe30JCQkKLQl9KTsKLQkKLQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JcHJvamVjdERpYWxvZ18gPSBuZXcgUHJvamVjdFNlbGVjdGlvbkRpYWxvZyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgCi0JCQluZXcgUGFnZUluZm8oQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkRJQUxPR19USVRJTEVfQ0xJRU5UX1BST0pFQ1RfU0VUVElOR1MsICIiLCAKLSAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JCQkJCQl7CQotCQkJCQkJCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkJCQkJCXsJICAJCQkJCQkgCi0JCQkJCQkJICAgcmV0dXJuIG5ldyBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQkKLQloTGlua0NsaWVudFByb2plY3RfID0gbmV3IEh5cGVybGluayhoQ29tcENsaWVudF8sIFNXVC5OVUxMKTsKLQl1dGlsc18uY3JlYXRlSW5mb1BvcChoTGlua0NsaWVudFJ1bnRpbWVfLCBJTkZPUE9QX1dTV1NDRU5fSFlQRVJMSU5LX1BST0pFQ1RTKTsKLQloTGlua0NsaWVudFByb2plY3RfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fQ0xJRU5UUFJPSkVDVF9MSU5LKTsKLQloTGlua0NsaWVudFByb2plY3RfLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKXsJCQkKLQkJCWxhdW5jaFByb2plY3REaWFsb2coKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChIeXBlcmxpbmtFdmVudCBlKXt9Ci0JCXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoSHlwZXJsaW5rRXZlbnQgZSl7fQkJCQotCX0pOwotCQotCWhMaW5rQ2xpZW50RUFSXyA9IG5ldyBIeXBlcmxpbmsoaENvbXBDbGllbnRfLCBTV1QuTlVMTCk7CQotCXV0aWxzXy5jcmVhdGVJbmZvUG9wKGhMaW5rQ2xpZW50UnVudGltZV8sIElORk9QT1BfV1NXU0NFTl9IWVBFUkxJTktfUFJPSkVDVFMpOwotCWhMaW5rQ2xpZW50RUFSXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX0NMSUVOVFBST0pFQ1RfTElOSyk7Ci0JaExpbmtDbGllbnRFQVJfLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKXsJCQkKLQkJCWxhdW5jaFByb2plY3REaWFsb2coKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChIeXBlcmxpbmtFdmVudCBlKXt9Ci0JCXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoSHlwZXJsaW5rRXZlbnQgZSl7fQkJCQotCX0pOwotCQotCWhMaW5rQ2xpZW50U2VydmVyXy5zZXRUZXh0KENMSUVOVF9TRVJWRVJfUFJFRklYKTsgCi0JaExpbmtDbGllbnRSdW50aW1lXy5zZXRUZXh0KENMSUVOVF9SVU5USU1FX1BSRUZJWCk7Ci0JaExpbmtDbGllbnRQcm9qZWN0Xy5zZXRUZXh0KENMSUVOVF9QUk9KRUNUX1BSRUZJWCk7Ci0JaExpbmtDbGllbnRFQVJfLnNldFRleHQoQ0xJRU5UX0VBUl9QUkVGSVgpOwkKLQkKLQlIeXBlcmxpbmtHcm91cCBzZXJ2ZXJSdW50aW1lR3JvdXAgPSBuZXcgSHlwZXJsaW5rR3JvdXAoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCXNlcnZlclJ1bnRpbWVHcm91cC5hZGQoaExpbmtDbGllbnRTZXJ2ZXJfKTsKLQlzZXJ2ZXJSdW50aW1lR3JvdXAuYWRkKGhMaW5rQ2xpZW50UnVudGltZV8pOwotCXNlcnZlclJ1bnRpbWVHcm91cC5hZGQoaExpbmtDbGllbnRQcm9qZWN0Xyk7Ci0Jc2VydmVyUnVudGltZUdyb3VwLmFkZChoTGlua0NsaWVudEVBUl8pOwotCXNlcnZlclJ1bnRpbWVHcm91cC5zZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKEh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9BTFdBWVMpOwotICAgIAotCWVuYWJsZUNsaWVudFNsaWRlcihnZXRHZW5lcmF0ZVByb3h5KCkpOwotCQotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlbmFibGVDbGllbnRTbGlkZXIoIGJvb2xlYW4gZW5hYmxlICkKLSAgewotCWVuYWJsZVByb3h5XyA9IGVuYWJsZTsKLQljbGllbnRTY2FsZV8uc2V0RW5hYmxlZChlbmFibGUpOwotCWludCBzZWxlY3Rpb24gPSBnZXRDbGllbnRHZW5lcmF0aW9uKCk7Ci0JaWYgKGVuYWJsZSkKLQl7CQkJCQotCQlzZXRHcmFwaGljcyhzZWxlY3Rpb24pOwotCX0KLQllbHNlCi0JewotCQlzZXRDbGllbnRTY2FsZShTY2VuYXJpb0NvbnRleHQuV1NfTk9ORSk7Ci0JCXNldEdyYXBoaWNzKFNjZW5hcmlvQ29udGV4dC5XU19OT05FKTsKLQkJY2xpZW50U2NhbGVfLnNldEJhY2tncm91bmRJbWFnZShudWxsKTsgIC8vb3ZlcnJpZGUgYmFja2dyb3VuZCBmb3IgZGlzYWJsZSB0byBncmV5CQkKLQl9CQotCXNob3dTdW1tYXJ5KGVuYWJsZSAmJiAoc2VsZWN0aW9uIDw9IFNjZW5hcmlvQ29udGV4dC5XU19ERVZFTE9QKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzaG93U3VtbWFyeShib29sZWFuIHNob3cpCi0gIHsKLQkgIGlmIChjbGllbnRPbmx5XykKLQkJICBzaG93ID0gdHJ1ZTsgIC8vc2hvcnQgY2lyY3VpdCB0byBlbGltaW5hdGUgZmxpY2tlci4uLgkgIAotCSAgCi0JICBoTGlua0NsaWVudEVBUl8uc2V0VmlzaWJsZShzaG93ICYmIG5lZWRFYXJfKTsKLQkgIGhMaW5rQ2xpZW50UHJvamVjdF8uc2V0VmlzaWJsZShzaG93KTsKLQkgIGhMaW5rQ2xpZW50UnVudGltZV8uc2V0VmlzaWJsZShzaG93KTsKLQkgIGhMaW5rQ2xpZW50U2VydmVyXy5zZXRWaXNpYmxlKHNob3cpOwotCSAgCi0JICBpZiAoc2hvdykKLQkgIHsKLQkJICBjbGllbnREZXRhaWxzTGFiZWxfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1NVTU1BUlkpOwotCSAgfQotCSAgZWxzZQotCSAgewotCQkgIGlmIChjbGllbnRPbmx5XykKLQkJCSAgaENvbXBDbGllbnRfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfQ0xJRU5UX09OTFkpOwotCQkJZWxzZQotCQkgIGhDb21wQ2xpZW50Xy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0NMSUVOVCk7Ci0JCSAgY2xpZW50RGV0YWlsc0xhYmVsXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TVU1NQVJZX05PX0NMSUVOVCk7CQkgIAotCSAgfQkgIAotCSAgY2xpZW50RGV0YWlsc0xhYmVsXy5wYWNrKHRydWUpOwotCSAgaExpbmtDbGllbnRQcm9qZWN0Xy5wYWNrKHRydWUpOwotCSAgaExpbmtDbGllbnRFQVJfLnBhY2sodHJ1ZSk7Ci0JICBwYWNrSXQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0JTGFiZWxzQW5kSWRzICAgICAgICAgICAgICAgICBsYWJlbElkcyAgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50VHlwZUxhYmVscygpOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICA9IDA7Ci0gICAgU3RyaW5nW10gICAgICAgICAgICAgICAgICAgICBjbGllbnRJZHMgID0gbGFiZWxJZHMuZ2V0SWRzXygpOwotICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJZCA9IGlkcy5nZXRUeXBlSWQoKTsKLSAgICAKLSAgICBsYWJlbElkc18gPSBsYWJlbElkczsKLQkvLyByc2tyZWcKLSAgICBjbGllbnRUeXBlQ29tYm9fLnNldEl0ZW1zKCBsYWJlbElkcy5nZXRMYWJlbHNfKCkgKTsKLSAgICAKLSAgICAvLyBOb3cgZmluZCB0aGUgc2VsZWN0ZWQgb25lLgotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjbGllbnRJZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBpZiggc2VsZWN0ZWRJZC5lcXVhbHMoIGNsaWVudElkc1tpbmRleCBdKSApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9IGluZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY2xpZW50VHlwZUNvbWJvXy5zZWxlY3QoIHNlbGVjdGlvbiApOyAgICAKLQlpZHNfID0gaWRzOwotCQotCWlmIChpZHNfICE9IG51bGwpCi0JewotCQlTdHJpbmcgY2xpZW50U2VydmVyVGV4dCA9ICIiOwotCQlTdHJpbmcgc2VydmVySWQgPSBpZHNfLmdldFNlcnZlcklkKCk7Ci0JCWlmIChzZXJ2ZXJJZCAhPSBudWxsICYmIHNlcnZlcklkLmxlbmd0aCgpPjApCi0JCXsKLQkJCWNsaWVudFNlcnZlclRleHQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2ZXJMYWJlbEJ5SWQoc2VydmVySWQpOwotCQl9IAotCQlTdHJpbmcgY2xpZW50UnVudGltZVRleHQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lTGFiZWxCeUlkKGlkc18uZ2V0UnVudGltZUlkKCkpOwotCQkKLQkJU3RyaW5nIGN1cnJlbnRTZXJ2ZXJUZXh0ID0gaExpbmtDbGllbnRTZXJ2ZXJfLmdldFRleHQoKTsKLQkJU3RyaW5nIGN1cnJlbnRSdW50aW1lVGV4dCA9IGhMaW5rQ2xpZW50UnVudGltZV8uZ2V0VGV4dCgpOwotCQlTdHJpbmcgbmV3U2VydmVyVGV4dCA9IENMSUVOVF9TRVJWRVJfUFJFRklYICsgIiAiICsgY2xpZW50U2VydmVyVGV4dDsKLQkJU3RyaW5nIG5ld1J1bnRpbWVUZXh0ID0gQ0xJRU5UX1JVTlRJTUVfUFJFRklYICsgIiAiICsgY2xpZW50UnVudGltZVRleHQ7Ci0JCWhMaW5rQ2xpZW50U2VydmVyXy5zZXRUZXh0KG5ld1NlcnZlclRleHQpOwotCQloTGlua0NsaWVudFJ1bnRpbWVfLnNldFRleHQobmV3UnVudGltZVRleHQpOwotCQkKLQkJLypjaGVjayB0byBzZWUgaWYgdGV4dCBoYXMgY2hhbmdlZCBmb3Igc2VydmVyIG9yIHJ1bnRpbWUKLQkJaWYgc28sIHJlcGFpbnQgbGlua3MgKi8KLQkJaWYgKCFuZXdTZXJ2ZXJUZXh0LmVxdWFscyhjdXJyZW50U2VydmVyVGV4dCkpCi0JCXsKLQkJCWhMaW5rQ2xpZW50U2VydmVyXy5wYWNrKHRydWUpOwotCQkJcGFja0l0KCk7Ci0JCX0JCQkKLQkJCi0JCWlmICghbmV3UnVudGltZVRleHQuZXF1YWxzKGN1cnJlbnRSdW50aW1lVGV4dCkpCi0JCXsKLQkJCWhMaW5rQ2xpZW50UnVudGltZV8ucGFjayh0cnVlKTsKLQkJCXBhY2tJdCgpOwotCQl9IAkKLQl9Ci0JCi0gICAgaWYgKHByb2plY3REaWFsb2dfICE9IG51bGwpCi0gICAgCXByb2plY3REaWFsb2dfLnNldFR5cGVSdW50aW1lU2VydmVyKGlkc18pOwotICAgIAotCS8vV2hlbiB0aGUgc2VydmVyIGNoYW5nZXMsIHRoZSBzdGF0ZSBvZiBuZWVkRWFyIGNvdWxkIGNoYW5nZS4KLQkvL0lmIHRoZSB0aGUgc2VydmVyIGNoYW5nZSByZXN1bHRzIGluIGEgY2hhbmdlIGluIHRoZSBzdGF0ZSBvZiBuZWVkRWFyLAotCS8vdXBkYXRlIG5lZWRFYXIgYW5kIGNsaWVudEVhclByb2plY3ROYW1lLiAgICAKLSAgICAKLQlWYWxpZGF0aW9uVXRpbHMgdnUgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0JYm9vbGVhbiBvbGROZWVkRWFyID0gZ2V0Q2xpZW50TmVlZEVBUigpOwotCWJvb2xlYW4gY2xpZW50UHJvamVjdE9yUHJvamVjdFR5cGVOZWVkc0VhcjsKLQotCWlmICghb2xkTmVlZEVhcikgewotCQkJLy8gSWYgYW4gRUFSIHdhcyBub3QgbmVlZGVkIHByZXZpb3VzbHkgaXQgY291bGQgaGF2ZSBiZWVuIGJlY2F1c2Ugb2YKLQkJCS8vIHRoZSBwcm9qZWN0L3Byb2plY3QgdHlwZSBvciB0aGUgc2VydmVyLgotCQkJLy8gSWYgaXQgd2FzIGJlY2F1c2Ugb2YgdGhlIHByb2plY3QvcHJvamVjdCB0eXBlLCBjaGFuZ2luZyB0aGUKLQkJCS8vIHNlcnZlciBzaG91bGQgaGF2ZSBubyBpbXBhY3QKLQkJCS8vIG9uIHRoZSBzdGF0ZSBvZiBuZWVkRWFyLgotCQkJY2xpZW50UHJvamVjdE9yUHJvamVjdFR5cGVOZWVkc0VhciA9IHZ1LnByb2plY3RPclByb2plY3RUeXBlTmVlZHNFYXIoZ2V0Q2xpZW50UHJvamVjdE5hbWUoKSwKLQkJCQkJZ2V0Q2xpZW50Q29tcG9uZW50VHlwZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWNsaWVudFByb2plY3RPclByb2plY3RUeXBlTmVlZHNFYXIgPSB0cnVlOwotCQl9Ci0KLQkJLy8gYm9vbGVhbiBjbGllbnRQcm9qZWN0T3JQcm9qZWN0VHlwZU5lZWRzRWFyID0KLQkJLy8gdnUucHJvamVjdE9yUHJvamVjdFR5cGVOZWVkc0VhcihnZXRDbGllbnRQcm9qZWN0TmFtZSgpLAotCQkvLyBnZXRDbGllbnRDb21wb25lbnRUeXBlKCkpOwotCQlpZiAoY2xpZW50UHJvamVjdE9yUHJvamVjdFR5cGVOZWVkc0VhcikgewotCQkJLy8gQ291bGQgbm90IHJ1bGUgb3V0IG5lZWQgZm9yIGFuIEVhciBmcm9tIHRoZSBwcm9qZWN0L3Byb2plY3QgdHlwZQotCQkJLy8gc28gY2hhbmdpbmcgdGhlIHNlcnZlcgotCQkJLy8gbWF5IGltcGFjdCB0aGUgbmVlZCBmb3IgYW4gRWFyLgotCQkJYm9vbGVhbiBjdXJyZW50U2VydmVyTmVlZHNFYXIgPSB2dS5zZXJ2ZXJOZWVkc0VBUihnZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFNlcnZlcklkKCkpOwotCQkJaWYgKG9sZE5lZWRFYXIgIT0gY3VycmVudFNlcnZlck5lZWRzRWFyKSB7Ci0JCQkJLy8gVXBkYXRlIG5lZWRFYXIgYW5kIHNlcnZpY2VFYXJQcm9qZWN0TmFtZS4KLQkJCQlpZiAoY3VycmVudFNlcnZlck5lZWRzRWFyKSB7Ci0JCQkJCS8vIENhbGN1bGF0ZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBmb3IgdGhlIEVhciBwcm9qZWN0IG5hbWUKLQkJCQkJU3RyaW5nIGVhclByb2plY3ROYW1lID0gRGVmYXVsdGluZ1V0aWxzLmdldERlZmF1bHRFQVJQcm9qZWN0TmFtZShnZXRDbGllbnRQcm9qZWN0TmFtZSgpKTsKLQkJCQkJc2V0Q2xpZW50TmVlZEVBUihjdXJyZW50U2VydmVyTmVlZHNFYXIpOwotCQkJCQlzZXRDbGllbnRFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0Q2xpZW50TmVlZEVBUihjdXJyZW50U2VydmVyTmVlZHNFYXIpOwotCQkJCQlzZXRDbGllbnRFYXJQcm9qZWN0TmFtZSgiIik7Ci0JCQkJfQotCi0JCQl9Ci0JCX0JCSAgICAKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBpZHNfOyAgCi0gIH0KLSAgICAgIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotCSAgcmV0dXJuIGdldENsaWVudEdlbmVyYXRpb24oKSA8PSBTY2VuYXJpb0NvbnRleHQuV1NfREVWRUxPUDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcENsaWVudCgpIHsKLQkgIHJldHVybiBkZXZlbG9wQ2xpZW50XzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERldmVsb3BDbGllbnQoYm9vbGVhbiBkZXZlbG9wQ2xpZW50KSB7Ci0JICB0aGlzLmRldmVsb3BDbGllbnRfID0gZGV2ZWxvcENsaWVudDsKLSAgfQkKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRBc3NlbWJsZUNsaWVudCgpIHsKLQkgIHJldHVybiBhc3NlbWJsZUNsaWVudF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBc3NlbWJsZUNsaWVudChib29sZWFuIGFzc2VtYmxlQ2xpZW50KSB7Ci0JICB0aGlzLmFzc2VtYmxlQ2xpZW50XyA9IGFzc2VtYmxlQ2xpZW50OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0RGVwbG95Q2xpZW50KCkgewotCSAgcmV0dXJuIGRlcGxveUNsaWVudF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXBsb3lDbGllbnQoYm9vbGVhbiBkZXBsb3lDbGllbnQpIHsKLQkgIHRoaXMuZGVwbG95Q2xpZW50XyA9IGRlcGxveUNsaWVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdENsaWVudChCb29sZWFuIHZhbHVlKQotICB7Ci0JICB0ZXN0Q2xpZW50XyA9IHZhbHVlOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0Q2xpZW50KCkKLSAgewotCSAgcmV0dXJuIHRlc3RDbGllbnRfOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRJbnN0YWxsQ2xpZW50KCkKLSAgewotCSAgcmV0dXJuIGluc3RhbGxDbGllbnRfOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRTdGFydENsaWVudCgpCi0gIHsKLQkgIHJldHVybiBzdGFydENsaWVudF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluc3RhbGxDbGllbnQoIEJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgICBpbnN0YWxsQ2xpZW50XyA9IHZhbHVlOyAgICAKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTdGFydENsaWVudCggQm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICAgIHN0YXJ0Q2xpZW50XyA9IHZhbHVlOyAgICAKLSAgfQotCi0gIAotCXByaXZhdGUgdm9pZCBsYXVuY2hQcm9qZWN0RGlhbG9nKCkKLQl7Ci0JCVN0cmluZyBjdXJyZW50UHJvamVjdE5hbWUgPSBnZXRDbGllbnRQcm9qZWN0TmFtZSgpOwotCQlTdHJpbmcgY3VycmVudEVhclByb2plY3ROYW1lID0gZ2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoKTsKLQkJU3RyaW5nIGN1cnJlbnRQcm9qZWN0VHlwZSA9IGdldENsaWVudENvbXBvbmVudFR5cGUoKTsKLQkJYm9vbGVhbiBjdXJyZW50TmVlZEVhciA9IGdldENsaWVudE5lZWRFQVIoKTsKLQkJCi0JCXByb2plY3REaWFsb2dfLnNldFByb2plY3ROYW1lKGN1cnJlbnRQcm9qZWN0TmFtZSk7Ci0JCXByb2plY3REaWFsb2dfLnNldEVhclByb2plY3ROYW1lKGN1cnJlbnRFYXJQcm9qZWN0TmFtZSk7Ci0JCXByb2plY3REaWFsb2dfLnNldE5lZWRFQVIoY3VycmVudE5lZWRFYXIpOwkKLQkJcHJvamVjdERpYWxvZ18uc2V0UHJvamVjdENvbXBvbmVudFR5cGUoY3VycmVudFByb2plY3RUeXBlKTsKLQkJCi0JCWludCBzdGF0dXMgPSBwcm9qZWN0RGlhbG9nXy5vcGVuKCk7Ci0JCQotCQlpZiAoc3RhdHVzID09IFdpbmRvdy5PSykKLQkJewotCQkJU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gcHJvamVjdERpYWxvZ18uZ2V0UHJvamVjdE5hbWUoKTsKLQkJCVN0cmluZyBuZXdFYXJQcm9qZWN0TmFtZSA9IHByb2plY3REaWFsb2dfLmdldEVhclByb2plY3ROYW1lKCk7Ci0JCQlTdHJpbmcgbmV3UHJvamVjdFR5cGUgPSBwcm9qZWN0RGlhbG9nXy5nZXRQcm9qZWN0Q29tcG9uZW50VHlwZSgpOwotCQkJYm9vbGVhbiBuZXdOZWVkRWFyID0gcHJvamVjdERpYWxvZ18uZ2V0TmVlZEVBUigpOwkKLQkJCQotCQkJLy9VcGRhdGUgcHJvamVjdCBzZXR0aW5ncyBhbmQgdmFsaWRhdGUgcGFnZSBpZiBzZWxlY3Rpb25zIGNoYW5nZWQuCi0JCQlpZiAoIW5ld1Byb2plY3ROYW1lLmVxdWFscyhjdXJyZW50UHJvamVjdE5hbWUpCi0JCQkJCXx8ICFuZXdFYXJQcm9qZWN0TmFtZS5lcXVhbHMoY3VycmVudEVhclByb2plY3ROYW1lKQotCQkJCQl8fCAhbmV3UHJvamVjdFR5cGUuZXF1YWxzKGN1cnJlbnRQcm9qZWN0VHlwZSkKLQkJCQkJfHwgbmV3TmVlZEVhciAhPSBjdXJyZW50TmVlZEVhcikgewotCQkJCXNldENsaWVudFByb2plY3ROYW1lKG5ld1Byb2plY3ROYW1lKTsKLQkJCQlzZXRDbGllbnRFYXJQcm9qZWN0TmFtZShuZXdFYXJQcm9qZWN0TmFtZSk7Ci0JCQkJc2V0Q2xpZW50TmVlZEVBUihuZXdOZWVkRWFyKTsKLQkJCQlzZXRDbGllbnRDb21wb25lbnRUeXBlKG5ld1Byb2plY3RUeXBlKTsJCQkJCi0JCQkJdmFsaWRhdGlvblN0YXRlXyA9IChuZXcgVmFsaWRhdGlvblV0aWxzKCkpLmdldE5ld1ZhbGlkYXRpb25TdGF0ZSh2YWxpZGF0aW9uU3RhdGVfLCBWYWxpZGF0aW9uVXRpbHMuVkFMSURBVEVfUFJPSkVDVF9DSEFOR0VTKTsKLQkJCQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCS8qY2hlY2sgdG8gc2VlIGlmIHRleHQgaGFzIGNoYW5nZWQgZm9yIHByb2plY3Qgb3IgRUFSCi0JCQlpZiBzbywgcmVwYWludCBsaW5rcyAqLwotCQkJaWYgKCFuZXdQcm9qZWN0TmFtZS5lcXVhbHMoY3VycmVudFByb2plY3ROYW1lKSkKLQkJCXsKLQkJCQloTGlua0NsaWVudFByb2plY3RfLnBhY2sodHJ1ZSk7Ci0JCQkJcGFja0l0KCk7Ci0JCQl9Ci0JCQlpZiAoIW5ld0VhclByb2plY3ROYW1lLmVxdWFscyhjdXJyZW50RWFyUHJvamVjdE5hbWUpKQotCQkJewotCQkJCWhMaW5rQ2xpZW50RUFSXy5wYWNrKHRydWUpOwotCQkJCXBhY2tJdCgpOwotCQkJfQotCQl9CQkKLQl9Ci0gIAotICBwcml2YXRlIHZvaWQgbGF1bmNoUnVudGltZVNlbGVjdGlvbkRpYWxvZyhib29sZWFuIGNsaWVudENvbnRleHQpIHsKLQkgIGxhdW5jaFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2coY2xpZW50Q29udGV4dCwgZmFsc2UpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgbGF1bmNoUnVudGltZVNlbGVjdGlvbkRpYWxvZyhib29sZWFuIGNsaWVudENvbnRleHQsIGJvb2xlYW4gc2VsZWN0U2VydmVyRmlyc3QpCi0JewotCSAgICBUeXBlUnVudGltZVNlcnZlciBjdXJyZW50Q2xpZW50VFJTID0gZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQkgICAgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZyByc3NkID0gbmV3IFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2coc2hlbGxfLCAoYnl0ZSkxLCBnZXRUeXBlUnVudGltZVNlcnZlcigpLCAiMTQiKTsKLQkgICAgcnNzZC5zZXRTZWxlY3RTZXJ2ZXJGaXJzdChzZWxlY3RTZXJ2ZXJGaXJzdCk7Ci0JICAgIGludCBzdGF0dXMgPSByc3NkLm9wZW4oKTsKLQkJaWYgKHN0YXR1cyA9PSBXaW5kb3cuT0spCi0JCXsKLQkJCVR5cGVSdW50aW1lU2VydmVyIG5ld0NsaWVudFRSUyA9IHJzc2QuZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsJCQkKLQkJCWlmICghY3VycmVudENsaWVudFRSUy5lcXVhbHMobmV3Q2xpZW50VFJTKSkKLQkJCXsKLQkJCQlzZXRUeXBlUnVudGltZVNlcnZlcihyc3NkLmdldFR5cGVSdW50aW1lU2VydmVyKCkpOwotCQkJCXZhbGlkYXRpb25TdGF0ZV8gPSAobmV3IFZhbGlkYXRpb25VdGlscygpKS5nZXROZXdWYWxpZGF0aW9uU3RhdGUodmFsaWRhdGlvblN0YXRlXywgVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1NFUlZFUl9SVU5USU1FX0NIQU5HRVMpOwotCQkJCXN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsgLy92YWxpZGF0ZSB0aGUgcGFnZQotCQkJfQotCQl9CQkKLQl9Ci0gIAotICAvL1ByaXZhdGUgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIGNsaWVudFNjYWxlXyBzZXR0aW5nIGlzIGNoYW5nZWQKLSAgLy9pbnN0ZWFkIG9mIGNhbGxpbmcgY2xpZW50U2NhbGVfLnNldFNlbGVjdGlvbiBkaXJlY3RseS4KLSAgcHJpdmF0ZSB2b2lkIHNldENsaWVudFNjYWxlKGludCBzZXR0aW5nKQotICB7Ci0JICBjbGllbnRTY2FsZV8uc2V0U2VsZWN0aW9uKHNldHRpbmcpOwotCSAgY2xpZW50U2NhbGVTZXR0aW5nXyA9IHNldHRpbmc7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRJbWFnZVJlZ2lzdHJ5KCkKLQl7Ci0JCWltYWdlUmVnXyA9IG5ldyBJbWFnZVJlZ2lzdHJ5KERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJCi0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR18wLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR18wKSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR18xLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR18xKSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR18yLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR18yKSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR18zLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR18zKSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR180LCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR180KSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR181LCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR181KSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR182LCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR182KSk7Ci0JCQotCQlpbWFnZVJlZ18ucHV0KEdSQVBISUNfQ0xJRU5UXzAsIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihHUkFQSElDX0NMSUVOVF8wKSk7Ci0JCWltYWdlUmVnXy5wdXQoR1JBUEhJQ19DTElFTlRfMSwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4KLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEdSQVBISUNfQ0xJRU5UXzEpKTsKLQkJaW1hZ2VSZWdfLnB1dChHUkFQSElDX0NMSUVOVF8yLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoR1JBUEhJQ19DTElFTlRfMikpOwotCQlpbWFnZVJlZ18ucHV0KEdSQVBISUNfQ0xJRU5UXzMsIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihHUkFQSElDX0NMSUVOVF8zKSk7Ci0JCWltYWdlUmVnXy5wdXQoR1JBUEhJQ19DTElFTlRfNCwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4KLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEdSQVBISUNfQ0xJRU5UXzQpKTsKLQkJaW1hZ2VSZWdfLnB1dChHUkFQSElDX0NMSUVOVF81LCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoR1JBUEhJQ19DTElFTlRfNSkpOwkJCi0JCWltYWdlUmVnXy5wdXQoR1JBUEhJQ19DTElFTlRfNiwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4KLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEdSQVBISUNfQ0xJRU5UXzYpKTsKLQl9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0R3JhcGhpY3MoaW50IHNlbGVjdGlvbikKLSAgewotICAgICBTdHJpbmcgaWNvbkltYWdlID0gIiI7Ci0gICAgIFN0cmluZyB0b3BvbG9neUltYWdlID0gIiI7Ci0gICAgIAotCSAgLy9UT0RPOiBjaGFuZ2UgdGhlIGhhcmQgY29kZWQgaW50ZWdlcnMgaGVyZSB0byB0aGUgdGhlIFNjZW5hcmlvQ29udGV4dC5XU194eHggd2hlbiBpbiBsZXNzIGNyaXRpY2FsIHBoYXNlCi0JICBzd2l0Y2ggKHNlbGVjdGlvbikgewotCQljYXNlIDA6Ci0JCQlpY29uSW1hZ2U9SUNPTl9TQ0FMRV9CR18wOwotCQkJdG9wb2xvZ3lJbWFnZT1HUkFQSElDX0NMSUVOVF8wOwotCQkJY2xpZW50U2NhbGVfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfVEVTVCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJaWNvbkltYWdlPUlDT05fU0NBTEVfQkdfMTsKLQkJCXRvcG9sb2d5SW1hZ2U9R1JBUEhJQ19DTElFTlRfMTsKLQkJCWNsaWVudFNjYWxlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1JVTik7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJaWNvbkltYWdlPUlDT05fU0NBTEVfQkdfMjsKLQkJCXRvcG9sb2d5SW1hZ2U9R1JBUEhJQ19DTElFTlRfMjsKLQkJCWNsaWVudFNjYWxlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0lOU1RBTEwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWljb25JbWFnZT1JQ09OX1NDQUxFX0JHXzM7Ci0JCQl0b3BvbG9neUltYWdlPUdSQVBISUNfQ0xJRU5UXzM7Ci0JCQljbGllbnRTY2FsZV8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9ERVBMT1kpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWljb25JbWFnZT1JQ09OX1NDQUxFX0JHXzQ7Ci0JCQl0b3BvbG9neUltYWdlPUdSQVBISUNfQ0xJRU5UXzQ7Ci0JCQljbGllbnRTY2FsZV8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9BU1NFTUJMRSk7Ci0JCQlicmVhazsKLQkJY2FzZSA1OgotCQkJaWNvbkltYWdlPUlDT05fU0NBTEVfQkdfNTsKLQkJCXRvcG9sb2d5SW1hZ2U9R1JBUEhJQ19DTElFTlRfNTsKLQkJCWNsaWVudFNjYWxlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0RFVkVMT1ApOwotCQkJYnJlYWs7Ci0JCWNhc2UgNjoJCQkKLQkJCWlmICghY2xpZW50T25seV8pCi0JCQl7Ci0JCQkJaWYgKGVuYWJsZVByb3h5XykgIC8vaWYgc2VydmljZSBpcyBpbnN0YWxsIHJ1biBvciB0ZXN0Li4uCi0JCQkJCWljb25JbWFnZT1JQ09OX1NDQUxFX0JHXzY7ICAKLQkJCQllbHNlCi0JCQkJCWljb25JbWFnZT1udWxsOwotCQkJCXRvcG9sb2d5SW1hZ2U9R1JBUEhJQ19DTElFTlRfNjsKLQkJCQljbGllbnRTY2FsZV8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9DTElFTlQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXNldENsaWVudFNjYWxlKFNjZW5hcmlvQ29udGV4dC5XU19ERVZFTE9QKTsgLy8ibm8gc2VsZWN0aW9uIiBpcyBub3QgYWxsb3dlZC4uLm11c3QgZGV2ZWxvcCBjbGllbnQgQCBtaW5pbXVtCi0JCQkJaWNvbkltYWdlPUlDT05fU0NBTEVfQkdfNTsKLQkJCQl0b3BvbG9neUltYWdlPUdSQVBISUNfQ0xJRU5UXzU7CQkJCQotCQkJCWNsaWVudFNjYWxlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0RFVkVMT1ApOwkJCQotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQljbGllbnRTY2FsZV8uc2V0QmFja2dyb3VuZEltYWdlKGltYWdlUmVnXy5nZXQoaWNvbkltYWdlKSk7Ci0JCXRvcG9sb2d5U3BvdF8uc2V0SW1hZ2UoaW1hZ2VSZWdfLmdldCh0b3BvbG9neUltYWdlKSk7CQotICB9Ci0gIAotCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotCXsKLQkJcmV0dXJuIG9iamVjdFNlbGVjdGlvbl87CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0gICAgICAgIG9iamVjdFNlbGVjdGlvbl8gPSBzZWxlY3Rpb247Ci0JfQotCQotICBwdWJsaWMgaW50IGdldENsaWVudEdlbmVyYXRpb24oKQotICB7Ci0JICByZXR1cm4gY2xpZW50U2NhbGVTZXR0aW5nXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50R2VuZXJhdGlvbihpbnQgdmFsdWUpCi0gIHsKLQkgIGlmIChjbGllbnRPbmx5XyAmJiB2YWx1ZSA9PSBTY2VuYXJpb0NvbnRleHQuV1NfTk9ORSkgewotCQkgIHZhbHVlID0gU2NlbmFyaW9Db250ZXh0LldTX0RFVkVMT1A7Ci0JCSAgc2V0RGV2ZWxvcENsaWVudCh0cnVlKTsKLQkgIH0KLQkKLQkgIGNsaWVudFNjYWxlU2V0dGluZ18gPSB2YWx1ZTsKLQkgIHNldENsaWVudFNjYWxlKHZhbHVlKTsKLQkgIAkgIAotCSAgc2V0R3JhcGhpY3ModmFsdWUpOwotCSAgc2hvd1N1bW1hcnkodmFsdWUgPCBTY2VuYXJpb0NvbnRleHQuV1NfTk9ORSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotCSAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLQkgIHJldHVybiBwcm9qZWN0XzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRSdW50aW1lSWQoKQotICB7Ci0JICAvLyBjYWxjdWxhdGUgdGhlIG1vc3QgYXBwcm9wcmlhdGUgY2xpZW50UnVudGltZUlkIGJhc2VkIG9uIGN1cnJlbnQgc2V0dGluZ3MuCi0JICByZXR1cm4gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZUlkKGdldFR5cGVSdW50aW1lU2VydmVyKCksIGdldENsaWVudFByb2plY3ROYW1lKCksIGdldENsaWVudENvbXBvbmVudFR5cGUoKSk7ICAgCi0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50Q29tcG9uZW50VHlwZShTdHJpbmcgdHlwZSkKLSAgewotCSAgY2xpZW50Q29tcG9uZW50VHlwZV89IHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudENvbXBvbmVudFR5cGUoKQotICB7Ci0JICByZXR1cm4gY2xpZW50Q29tcG9uZW50VHlwZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHByb2plY3ROYW1lXyA9IG5hbWU7ICAgICAgCi0JaExpbmtDbGllbnRQcm9qZWN0Xy5zZXRUZXh0KENMSUVOVF9QUk9KRUNUX1BSRUZJWCArICIgIiArIHByb2plY3ROYW1lXyk7CQotCWhMaW5rQ2xpZW50UHJvamVjdF8ucGFjayh0cnVlKTsgICAKLQlwYWNrSXQoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0TmFtZSgpCi0gIHsgIAotCSAgaWYgKHByb2plY3ROYW1lXyA9PSBudWxsKQotCQkgIHJldHVybiAiIjsKLQkgIHJldHVybiBwcm9qZWN0TmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEVhclByb2plY3ROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZWFyUHJvamVjdE5hbWVfID0gbmFtZTsgIAotICAgIHJlZnJlc2hFQVJMaW5rKCk7Ci0gICAJCSAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoRUFSTGluaygpCi0gIHsKLQkgIGhMaW5rQ2xpZW50RUFSXy5zZXRWaXNpYmxlKG5lZWRFYXJfICYmIGdldEdlbmVyYXRlUHJveHkoKSk7Ci0JICBpZiAobmVlZEVhcl8pCi0JICB7ICAgIAkKLQkJICBoTGlua0NsaWVudEVBUl8uc2V0VGV4dChDTElFTlRfRUFSX1BSRUZJWCArICIgIiArIGVhclByb2plY3ROYW1lXyk7Ci0JCSAgaExpbmtDbGllbnRFQVJfLnBhY2sodHJ1ZSk7IAotCQkgIHBhY2tJdCgpOwotCSAgfSAgCi0gIH0KLQkgICAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoKQotICB7Ci0JICBpZiAoZWFyUHJvamVjdE5hbWVfID09IG51bGwpCi0JCSAgcmV0dXJuICIiOwotICAgICByZXR1cm4gZWFyUHJvamVjdE5hbWVfOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudE5lZWRFQVIoYm9vbGVhbiBiKQotICB7Ci0gICAgIG5lZWRFYXJfID0gYjsKLSAgICAgcmVmcmVzaEVBUkxpbmsoKTsKLSAgfSAKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldENsaWVudE5lZWRFQVIoKQotICB7Ci0gICAgIHJldHVybiBuZWVkRWFyXzsKLSAgfSAKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0JewotCQlyZXR1cm4gcGFyc2VyXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyKQotCXsKLQkJcGFyc2VyXyA9IHBhcnNlcjsJCQotCX0KLSAgCi0gICAgLy9mb3IgdGhlIHB1cnBvc2VzIG9mIGRpc2FibGluZyB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlcyBkaWFsb2cKLQlwdWJsaWMgdm9pZCBkaXNhYmxlTm9uUHJlZmVyZW5jZVdpZGdldHMoKQotCXsKLQkJaWYgKGhDb21wQ2xpZW50XyAhPSBudWxsKQotCQl7Ci0JCQloQ29tcENsaWVudF8uc2V0VmlzaWJsZShmYWxzZSk7CQkJCi0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBnZXRWYWxpZGF0aW9uU3RhdGUoKQotCXsKLQkJcmV0dXJuIHZhbGlkYXRpb25TdGF0ZV87Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdGF0ZShpbnQgc3RhdGUpCi0JewotCQl2YWxpZGF0aW9uU3RhdGVfID0gc3RhdGU7Ci0JfQotCQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja01pc3NpbmdGaWVsZFN0YXR1cygpIHsKLQotCQlWYWxpZGF0aW9uVXRpbHMgdmFsVXRpbHMgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0JCVN0cmluZyBydW50aW1lSWQgPSBnZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFJ1bnRpbWVJZCgpOwotCQlTdHJpbmcgc2VydmVySWQgPSBnZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFNlcnZlcklkKCk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldENsaWVudFByb2plY3ROYW1lKCk7Ci0JCWJvb2xlYW4gbmVlZEVhciA9IGdldENsaWVudE5lZWRFQVIoKTsKLQkJU3RyaW5nIGVhclByb2plY3ROYW1lID0gZ2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoKTsKLQkJU3RyaW5nIHByb2plY3RUeXBlSWQgPSBnZXRDbGllbnRDb21wb25lbnRUeXBlKCk7Ci0JCUlTdGF0dXMgbWlzc2luZ0ZpZWxkU3RhdHVzID0gdmFsVXRpbHMuY2hlY2tNaXNzaW5nRmllbGRTdGF0dXModmFsaWRhdGlvblN0YXRlXywgbnVsbCwgbnVsbCwgcnVudGltZUlkLCBzZXJ2ZXJJZCwKLQkJCQlwcm9qZWN0TmFtZSwgbmVlZEVhciwgZWFyUHJvamVjdE5hbWUsIHByb2plY3RUeXBlSWQsIHRydWUpOwotCQlyZXR1cm4gbWlzc2luZ0ZpZWxkU3RhdHVzOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrRXJyb3JTdGF0dXMoKSB7Ci0KLQkJVmFsaWRhdGlvblV0aWxzIHZhbFV0aWxzID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotCQlTdHJpbmcgcnVudGltZUlkID0gZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRSdW50aW1lSWQoKTsKLQkJU3RyaW5nIHNlcnZlcklkID0gZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRTZXJ2ZXJJZCgpOwotCQlTdHJpbmcgdHlwZUlkID0gZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRUeXBlSWQoKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0Q2xpZW50UHJvamVjdE5hbWUoKTsKLQkJYm9vbGVhbiBuZWVkRWFyID0gZ2V0Q2xpZW50TmVlZEVBUigpOwotCQlTdHJpbmcgZWFyUHJvamVjdE5hbWUgPSBnZXRDbGllbnRFYXJQcm9qZWN0TmFtZSgpOwotCQlTdHJpbmcgcHJvamVjdFR5cGVJZCA9IGdldENsaWVudENvbXBvbmVudFR5cGUoKTsKLQkJSVN0YXR1cyBwb3NzaWJsZUVycm9yU3RhdHVzID0gdmFsVXRpbHMuY2hlY2tFcnJvclN0YXR1cyh2YWxpZGF0aW9uU3RhdGVfLCB0eXBlSWQsIHJ1bnRpbWVJZCwgc2VydmVySWQsCi0JCQkJcHJvamVjdE5hbWUsIG5lZWRFYXIsIGVhclByb2plY3ROYW1lLCBwcm9qZWN0VHlwZUlkLCB0cnVlKTsKLQkJcmV0dXJuIHBvc3NpYmxlRXJyb3JTdGF0dXM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgY2hlY2tXYXJuaW5nU3RhdHVzKCkgewotCQlWYWxpZGF0aW9uVXRpbHMgdmFsVXRpbHMgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0KLQkJaW50IHNjYWxlU2V0dGluZyA9IGdldENsaWVudEdlbmVyYXRpb24oKTsKLQkJU3RyaW5nIHNlcnZlcklkID0gZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRTZXJ2ZXJJZCgpOwotCQlJU3RhdHVzIHdhcm5pbmdTdGF0dXMgPSB2YWxVdGlscy5jaGVja1dhcm5pbmdTdGF0dXModmFsaWRhdGlvblN0YXRlXywgc2NhbGVTZXR0aW5nLCBzZXJ2ZXJJZCwgdHJ1ZSk7Ci0JCXJldHVybiB3YXJuaW5nU3RhdHVzOwotCX0JCi0JCi0JCi0gIHByaXZhdGUgY2xhc3MgU2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkgICAgaW50IG9sZENsaWVudFNjYWxlU2V0dGluZyA9IGNsaWVudFNjYWxlU2V0dGluZ187Ci0JCQkgICAgCi0JCQkJc2V0R3JhcGhpY3MoKChTY2FsZSllLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQotCQkJCWludCBzZWxlY3Rpb24gPSBjbGllbnRTY2FsZV8uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJc2V0Q2xpZW50R2VuZXJhdGlvbihzZWxlY3Rpb24pOwotCQkJICAgIAotCQkJICAgIHNldERldmVsb3BDbGllbnQoc2VsZWN0aW9uIDw9IFNjZW5hcmlvQ29udGV4dC5XU19ERVZFTE9QKTsKLQkJCQlzZXRBc3NlbWJsZUNsaWVudChzZWxlY3Rpb24gPD0gU2NlbmFyaW9Db250ZXh0LldTX0FTU0VNQkxFKTsKLQkJCQlzZXREZXBsb3lDbGllbnQoc2VsZWN0aW9uIDw9IFNjZW5hcmlvQ29udGV4dC5XU19ERVBMT1kpOwotCQkJICAgIHNldFRlc3RDbGllbnQobmV3IEJvb2xlYW4oc2VsZWN0aW9uIDw9IFNjZW5hcmlvQ29udGV4dC5XU19URVNUKSk7Ci0JCQkJc2V0SW5zdGFsbENsaWVudChuZXcgQm9vbGVhbihzZWxlY3Rpb24gPD0gU2NlbmFyaW9Db250ZXh0LldTX0lOU1RBTEwpKTsKLQkJCQlzZXRTdGFydENsaWVudChuZXcgQm9vbGVhbihzZWxlY3Rpb24gPD0gU2NlbmFyaW9Db250ZXh0LldTX1NUQVJUKSk7Ci0JCQkJCi0JCQkJLy9kaXNhYmxlIHRoZSBjbGllbnQgc2V0dGluZ3MgaWYgdGhlIGNsaWVudCBzY2VuYXJpbyBzZXR0aW5nIGlzbid0IGF0IGxlYXN0ICJERVZFTE9QIgotCQkJCWJvb2xlYW4gZ2VuZXJhdGUgPSBzZWxlY3Rpb248PVNjZW5hcmlvQ29udGV4dC5XU19ERVZFTE9QOwotCQkJCXNob3dTdW1tYXJ5KGdlbmVyYXRlKTsKLQkJCQkKLQkJCQkKLQkJCQkvL1doZW4gY2xpZW50IHNsaWRlciBtb3ZlcyBvdXQgb2YgdGhlICJXU19OT05FIiBzdGF0ZSwgVkFMSURBVEVfQUxMIHNob3VsZCBiZSBkb25lLiAKLQkJCQkvL090aGVyd2lzZSwgVkFMSURBVEVfU0NBTEVfQ0hBTkdFUyBpcyBzdWZmaWNpZW50LgotCQkJCWlmIChvbGRDbGllbnRTY2FsZVNldHRpbmc9PVNjZW5hcmlvQ29udGV4dC5XU19OT05FICYmIGNsaWVudFNjYWxlU2V0dGluZ18hPVNjZW5hcmlvQ29udGV4dC5XU19OT05FKQotCQkJCXsKLQkJCQkJdmFsaWRhdGlvblN0YXRlXyA9IFZhbGlkYXRpb25VdGlscy5WQUxJREFURV9BTEw7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXZhbGlkYXRpb25TdGF0ZV8gPSAobmV3IFZhbGlkYXRpb25VdGlscygpKS5nZXROZXdWYWxpZGF0aW9uU3RhdGUodmFsaWRhdGlvblN0YXRlXywgVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1NDQUxFX0NIQU5HRVMpOwkKLQkJCQl9CQkJCQotCQkJCXN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsgLy92YWxpZGF0ZSB0aGUgcGFnZQotCQkJfQotCQkKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCX0KLQl9IAotICAKLSAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uKCkKLQl7CQkKLQkJLy9uZXcgdXAgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kCi0JCUNsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjbGllbnRSVERlZmF1bHRDbWQgPSBuZXcgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCk7Ci0JCQotCQkgIC8vY2FsbCBzZXR0ZXJzIG9mIG5ldyBkZWZhdWx0aW5nIGNvbW1hbmQ6Ci0JCSAgY2xpZW50UlREZWZhdWx0Q21kLnNldENsaWVudEluaXRpYWxTZWxlY3Rpb24oZ2V0T2JqZWN0U2VsZWN0aW9uKCkpOwotCQkgIGNsaWVudFJURGVmYXVsdENtZC5zZXRDbGllbnRJbml0aWFsUHJvamVjdChnZXRQcm9qZWN0KCkpOwkgICAgICAKLQkgICAgICBjbGllbnRSVERlZmF1bHRDbWQuc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKSk7Ci0JCSAgY2xpZW50UlREZWZhdWx0Q21kLnNldFdlYlNlcnZpY2VzUGFyc2VyKGdldFdlYlNlcnZpY2VzUGFyc2VyKCkpOyAgICAgCi0JICAgICAgY2xpZW50UlREZWZhdWx0Q21kLnNldENsaWVudEVhclByb2plY3ROYW1lKGdldENsaWVudEVhclByb2plY3ROYW1lKCkpOwotCQkgIAkJICAKLQkJICBjbGllbnRSVERlZmF1bHRDbWQuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJICAKLQkJICAvL3BlcmZvcm0gbWFwcGluZ3MgZnJvbSB0aGUgZGVmYXVsdGluZyBjb21tYW5kIHRvIHRoZSBwcm9qZWN0IHNldHRpbmdzLi4uCQotCQkgIHNldENsaWVudFByb2plY3ROYW1lKGNsaWVudFJURGVmYXVsdENtZC5nZXRDbGllbnRQcm9qZWN0TmFtZSgpKTsKLQkJICBzZXRDbGllbnRFYXJQcm9qZWN0TmFtZShjbGllbnRSVERlZmF1bHRDbWQuZ2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoKSk7Ci0JCSAgc2V0Q2xpZW50Q29tcG9uZW50VHlwZShjbGllbnRSVERlZmF1bHRDbWQuZ2V0Q2xpZW50Q29tcG9uZW50VHlwZSgpKTsKLQkJICBzZXRUeXBlUnVudGltZVNlcnZlcihjbGllbnRSVERlZmF1bHRDbWQuZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKSk7Ci0gICAgICAgICAgc2V0Q2xpZW50TmVlZEVBUihjbGllbnRSVERlZmF1bHRDbWQuZ2V0Q2xpZW50TmVlZEVBUigpKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NsaWVudFdpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NsaWVudFdpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDliNTRhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9DbGllbnRXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjA0IDEyNDQwOCAgICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIgICAgICAgICAgCi0gKiAyMDA2MDIwNCAxMjE2MDUgICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDIyMSAxMTkxMTEgICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDIyMyAxMjkwMjAgICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQwNiAxMzUzNTAgICAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNDA3IDEzNTQxNSAgICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI1IDEzODA1MiAgICBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA1MTcgMTQxODgwICAgIHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDYwNTI0ICAgMTQyNjM1IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDUzMCAgIDE0NDM1OCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA1MzAgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNzE3ICAgMTQ2MzMyIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrCi0gKiAyMDA2MDcyOCAgIDE0NTQyNiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA4MjEgICAxNTM4MzMgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIEFsbG93IHRoZSBXZWIgU2VydmljZSBUZXN0IGV4dGVuc2lvbiBwb2ludCB0byBzcGVjaWZ5IHRoZSBzdXBwb3J0ZWQgY2xpZW50IHJ1bnRpbWUKLSAqIDIwMDYwODI1ICAgMTU1MTE0IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkdldE1vbml0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5GaW5pc2hGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlNjZW5hcmlvQ2xlYW51cENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbi5DbGllbnRSb290RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbi5QcmVDbGllbnREZXZlbG9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLkNsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoRGVmYXVsdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5UZXN0RGVmYXVsdGluZ0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5Bc3NlbWJsZUNsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkRlcGxveUNsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkRldmVsb3BDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JbnN0YWxsQ2xpZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuUnVuQ2xpZW50RnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFdpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwoteyAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRSb290Q29tbWFuZEZyYWdtZW50KCk7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7IAotCSAgLy9qdmggbWFwcGluZyBmb3IgaW5pdGlhbHNlbGVjdGlvbj8/Pz8KLQkgIAotICAgIC8vIEJlZm9yZSBDbGllbnRXaXphcmRXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluc3RhbGxDbGllbnQiLCBDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MgKTsgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50R2VuZXJhdGlvbiIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXZlbG9wQ2xpZW50IiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkFzc2VtYmxlQ2xpZW50IiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRlcGxveUNsaWVudCIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTdGFydENsaWVudCIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQWZ0ZXIgQ2xpZW50V2l6YXJkV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MsICJJbnN0YWxsQ2xpZW50IiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIkRldmVsb3BDbGllbnQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MsICJBc3NlbWJsZUNsaWVudCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIkRlcGxveUNsaWVudCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIlN0YXJ0Q2xpZW50IiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0KLSAgICAvL2p2aCBhZGRlZC4uCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiUHJvamVjdCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiV3NkbFVSSSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgICAgICAgCi0gICAgLy9qdmggLSByZXJvdXRlZCB0aGUgZGVmYXVsdGluZyBjb21tYW5kIHRvIHRoZSBDbGllbnRXaXphcmRXaWRnZXQgCi0gICAgLy8gQmVmb3JlIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MpOyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50VHlwZSIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyk7ICAgIAotICAgIAotICAgIC8vanZoIC0gcmVyb3V0ZWQgZnJvbSBDbGllbnRXaXphcmRXaWRnZXQgaW5zdGVhZCBvZiBydW50aW1lc2VydmVyd2lkZ2V0LSBhZGQgZ2V0dGVycyB0byBDbGllbnRXaXphcmRXaWRnZXQgZm9yIHRoZW0KLSAgICAvLyBBZnRlciBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiQ2xpZW50UnVudGltZUlkIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MsICJDbGllbnRDb21wb25lbnRUeXBlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAgIAotICAgIC8vIEJlZm9yZSBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcgotICAgIC8vIGp2aCAtIHJlcm91dGVkIHRoZXNlIHRvIENsaWVudFdpemFyZFdpZGdldCAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZVVSSSIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDb21wb25lbnROYW1lIiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzICk7Ci0gICAgCi0vKiAgICAvLyBBZnRlciBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcgotICAgIC8vanZoIC0gcmVyb3V0ZSB0aGVzZSBmcm9tIHRoZSBkaWFsb2cgdG8gQ2xpZW50V2l6YXJkV2lkZ2V0IC0gY2FsbCBzZXR0ZXJzIG9uIHRoZSBvdGhlciBkaWFsb2dzLi4uCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MsICJXc2RsVVJJIiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MsICJQcm9qZWN0IiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmNsYXNzLCAiQ29tcG9uZW50TmFtZSIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSovICAgIAotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcyk7Ci0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRSdW50aW1lSWQiLFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MpOwotCQotICAgIC8vIEJlZm9yZSBDbGllbnQgVGVzdCB3aWRnZXQuCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsIEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotCi0gICAgLy8gQWZ0ZXIgdGhlIGNsaWVudCB0ZXN0IHdpZGdldCAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlNhbXBsZVByb2plY3QiLEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiUnVuVGVzdENsaWVudCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSXNUZXN0V2lkZ2V0IixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQ2xpZW50V2l6YXJkV2lkZ2V0IiwgCi0gICAgCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9XU19QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfREVTQ19XU19QUk9KRUNULAotCQkJCSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkJCSAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRXaXphcmRXaWRnZXQoKTsKLQkJCQkgICAgICAgICAgfQotCQkJCSAgICAgICAgfSApOwotICAgIAotICAgIC8vanZoCi0gICAgLyp3aWRnZXRSZWdpc3RyeS5hZGQoICJDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9XU19DTElFTlRfUlVOVElNRV9TRUxFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTiwKLQkJCQkJCW5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJCQkJCSAgewotCQkJCQkJICAgIHJldHVybiBuZXcgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldCgpOwotCQkJCQkJICB9Ci0JCQkJCQl9ICk7Ki8KLSAgICAKLSAgICAvL2p2aAotICAgIC8qd2lkZ2V0UmVnaXN0cnkuYWRkKCAiV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX1dTX1NFTEVDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX0RFU0NfV1NfU0VMRUNUSU9OLAotCQkgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkgICAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcigpOwotCQkgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICB9ICk7Ki8KLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJDbGllbnRUZXN0V2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9XU19TQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1dTX1NBTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50VGVzdFdpZGdldCgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50Um9vdENvbW1hbmRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLSAgewotICAgIHB1YmxpYyBDbGllbnRSb290Q29tbWFuZEZyYWdtZW50KCkKLSAgICB7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNjZW5hcmlvQ2xlYW51cENvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICAKLSAgICAgIC8vYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDaGVja0Zvck1pc3NpbmdGaWxlcygpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kKHRydWUpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOyAvL2p2aCBtb3ZlZCB0aGlzIHVwCi0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOyAgLy9qdmggbW92ZWQgdGhpcyB1cCAgICAgIAotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJDbGllbnRXaXphcmRXaWRnZXQiICkgKTsKLQkgIC8vYWRkKCBuZXcgVGVzdENvbW1hbmRGYWN0b3J5RnJhZ21lbnQoKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kKCksICIiICkpOwotICAgICAgCi0gICAgICAvL2FkZCggbmV3IFRlc3RDb21tYW5kRmFjdG9yeUZyYWdtZW50MigpICk7Ci0gICAgICAvL2FkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoIHRydWUgKSwgIiIpKTsKLSAgICAgIC8vYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQoZmFsc2UpLCAiIikpOyAvL05vdGU6IGFkZGVkIGhlcmUgZm9yIGNsaWVudCAgICAgIAotICAgICAgLy9hZGQoIG5ldyBDbGllbnRFeHRlbnNpb25GcmFnbWVudCgpICk7Ci0JICBhZGQoIG5ldyBDbGllbnRSb290RnJhZ21lbnQoKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kKCksICIiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KG5ldyBHZXRNb25pdG9yQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFRlc3REZWZhdWx0aW5nRnJhZ21lbnQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50VGVzdEZyYWdtZW50KCAiQ2xpZW50VGVzdFdpZGdldCIpICk7IAotICAgICAgYWRkKG5ldyBGaW5pc2hGcmFnbWVudCgpKTsKLSAgICAgIAotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTY2VuYXJpb0NsZWFudXBDb21tYW5kKCksICIiICkpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIC8vTWFwIFNlbGVjdGlvbkNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbEluaXRpYWxTZWxlY3Rpb24iLCBudWxsKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluc3RhbGxDbGllbnQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRGV2ZWxvcENsaWVudCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJBc3NlbWJsZUNsaWVudCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXBsb3lDbGllbnQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU3RhcnRDbGllbnQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLQotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiSW5zdGFsbENsaWVudCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSdW5UZXN0Q2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJTdGFydENsaWVudCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJEZXZlbG9wQ2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkFzc2VtYmxlQ2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkRlcGxveUNsaWVudCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBHZXRNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZCAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7IAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UnVudGltZUlkIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyQ29tcG9uZW50TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudENvbXBvbmVudFR5cGUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEluaXRpYWxQcm9qZWN0IiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlVVJJIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIG5ldyBFY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbldTSUwiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2lsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgLy9qdmggLSByZXJvdXRlZCB0aGVzZSB0byB0aGUgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VVUkkiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIG5ldyBFY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDb21wb25lbnROYW1lIiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kCi0gICAgICAvL2p2aCAtIHJlcm91dGVkIHRoZXNlIGZyb20gQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBHZXRNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBHZXRNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzKTsKLQotICAgICAgCi0gICAgICAvL2p2aCAtIGFkZCBjb2RlIHRvIHdpZGdldCBzbyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBzZXRzIGhhcHBlbiBhbmQgZGVmYXVsdGluZyBvY2N1cnMgYWdhaW4gYWZ0ZXIgb2JqZWN0IHNlbGVjdGlvbgotICAgICAgLypkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsUHJvamVjdCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyovCi0gICAgICAKLQkgIC8vIFNldHVwIHRoZSBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRlcGxveUNsaWVudCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluc3RhbGxDbGllbnQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRGV2ZWxvcENsaWVudCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkFzc2VtYmxlQ2xpZW50IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU3RhcnRDbGllbnQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIG51bGwpOyAgICAgIAotCi0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7CQkJCQkJCi0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RUeXBlIiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGVUeXBlIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFJ1bnRpbWVJZCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICAKLQkJCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZUNsaWVudCIsIG51bGwgKTsKLQkJCQotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuY2xhc3MpOwotICAgICAgICAgICAKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzICk7ICAgICAKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcywiQ2xpZW50RWFyQ29tcG9uZW50TmFtZSIsIG51bGwpOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7IAotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOyAgICAgIAotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOyAKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm94eUVuZHBvaW50IiwgR2V0TW9uaXRvckNvbW1hbmQuY2xhc3MpOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlNldEVuZHBvaW50TWV0aG9kIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmVySW5zdGFuY2VJZCIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLQotCSAgCi0gICAgICAvLyBHZXRNb25pdG9yQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoR2V0TW9uaXRvckNvbW1hbmQuY2xhc3MsICJFbmRwb2ludHMiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQotICAgICAgLy8gTUFQIHBvc3Qgc2VydmVyIGNvbmZpZyBjYWxsICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgCi0gICAgICAvLyBNYXAgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgICAgICAgIAotICAgICAgLy9NYXBwaW5ncyB0byBlbmFibGUgcGVlay1haGVhZCBmb3IgUGFnZSAzIG9mIHRoZSBjbGllbnQgd2l6YXJkCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzLCAiUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcywgIkVhciIsIG51bGwgKTsKLSAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcywgIlByb2plY3QiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzLCAiTW9kdWxlIiwgbnVsbCApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcywgIlByb2plY3QiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXJQcm9qZWN0IiwgbnVsbCApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzLCAiUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcywgIkVhciIsIG51bGwgKTsKLSAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJQcm9qZWN0IiwgbnVsbCApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyIiwgbnVsbCApOyAgICAgIAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlnQ2xpZW50SGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiM2ZhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDQgICAxMzQ5MTMgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1ICAgICAgIAotICogMjAwNjA1MTcgICAxNDIzMzkgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLk9wZW5KYXZhRWRpdG9yQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5Db25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLS8qKgotICogCi0gKiBIYW5kbGVyIENvbmZpZ3VyYXRpb24gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZyAKLXsKLSAgCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIHsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCIsIAotICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9DTElFTlRfSERMUl9DT05GSUcsIAotICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX0NMSUVOVF9IRExSX0NPTkZJRywgCi0gICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0KLSAgICAgIAlwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgCSAgcmV0dXJuIG5ldyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0KCk7Ci0gICAgICAJfQotICAgIH0pOwotCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgCi0gICAgLy8gd2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiSGFuZGxlclNlcnZpY2VSZWZIb2xkZXIiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJJc011bHRpcGxlU2VsZWN0aW9uIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiR2VuU2tlbGV0b25FbmFibGVkIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiU2VydmljZVJlZk5hbWUiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICAKLSAgICAvLyBvdXRwdXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJJc011bHRpcGxlU2VsZWN0aW9uIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJDbGllbnRQcm9qZWN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJIYW5kbGVyU2VydmljZVJlZkhvbGRlciIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gZ2VuIHNrZWxldG9uCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiSGFuZGxlclNlcnZpY2VSZWZIb2xkZXIiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAvLyBvcGVuIGluIGVkaXRvcgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiUHJvamVjdCIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJDbGFzc05hbWVzIiwgT3BlbkphdmFFZGl0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MsIklzRW5hYmxlZCIsIG51bGwpOwotICAgIAotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSB7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKSB7Ci0KLSAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkgewotCi0gICAgICAgIHJldHVybiBuZXcgQ2xpZW50SGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBDbGllbnRIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnR7Ci0gICAKLSAgICBwdWJsaWMgQ2xpZW50SGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBPcGVuSmF2YUVkaXRvckNvbW1hbmQoKSwgIiIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgICB7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJXc1NlcnZpY2VSZWZzIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIkNsaWVudFByb2plY3QiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIH0KLSAKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ1NlcnZpY2VIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ1NlcnZpY2VIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyNzQ3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdTZXJ2aWNlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MDQgMTM0OTEzICAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1ICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5PcGVuSmF2YUVkaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi0vKioKLSAqIAotICogSGFuZGxlciBDb25maWd1cmF0aW9uIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUKLSAqIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnU2VydmljZUhhbmRsZXJzV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nIHsKLSAgCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIHsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQiLCAKLSAgIAkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfVElUTEVfU0VSVklDRV9IRExSX0NPTkZJRywgCi0gICAJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX0RFU0NfU0VSVklDRV9IRExSX0NPTkZJRywgCi0gICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0KLSAgICAgIAlwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgCSAgcmV0dXJuIG5ldyBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCgpOwotICAgICAgCX0KLSAgICB9KTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgIAotCS8vIHdpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJzIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSXNNdWx0aXBsZVNlbGVjdGlvbiIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiR2VuU2tlbGV0b25FbmFibGVkIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJEZXNjcmlwdGlvbk5hbWUiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gb3V0cHV0IGNvbW1hbmQgKGFkZHMvcmVtb3ZlcyBmcm9tIG1vZGVsKQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJIYW5kbGVyRGVzY3JpcHRpb25Ib2xkZXJzIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc011bHRpcGxlU2VsZWN0aW9uIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzZGRSZXNvdXJjZSIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOyAgICAKLQotICAgIC8vIGdlbiBza2VsZXRvbiBjb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkhhbmRsZXJEZXNjcmlwdGlvbkhvbGRlcnMiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MpOyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiR2VuU2tlbGV0b25FbmFibGVkIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzKTsKLSAKLSAgICAvLyBvcGVuIEphdmEgZWRpdG9yICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIlByb2plY3QiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiQ2xhc3NOYW1lcyIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcywiSXNFbmFibGVkIiwgbnVsbCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIHsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKSB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlSGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlSGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50ewotICAgCi0gICAgcHVibGljIFNlcnZpY2VIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCgpCi0gICAgewotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpLCAiIikpOwotCi0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkZFJlc291cmNlIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIAotICAgIH0KLSAKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlndXJlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOTY5YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlndXJlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQwNCAxMzQ5MTMgICBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLk9wZW5KYXZhRWRpdG9yQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5Db25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJlSGFuZGxlcnNXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcgewotCi0KLSAgcHVibGljIENvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZygpIHsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFuZGxlcnNDb21tYW5kRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSB7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpLAotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotCi0gICAgLy8gTWFwIGNsaWVudC1zaWRlIHdpZGdldHMgdG8gY29tbWFuZHMKLSAgICAvLyB3aWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJIYW5kbGVyU2VydmljZVJlZkhvbGRlciIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIklzTXVsdGlwbGVTZWxlY3Rpb24iLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTZXJ2aWNlUmVmTmFtZSIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vIG91dHB1dAotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiSGFuZGxlclNlcnZpY2VSZWZIb2xkZXIiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIGdlbiBza2VsZXRvbgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkhhbmRsZXJTZXJ2aWNlUmVmSG9sZGVyIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MpOwotCi0gICAgLy8gb3BlbiBpbiBlZGl0b3IKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MsIklzRW5hYmxlZCIsIG51bGwpOwotICAKLSAKLSAgICAvLyBNYXAgc2VydmljZS1zaWRlIHdpZGdldHMgdG8gY29tbWFuZHMKLSAgICAvLyB3aWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVycyIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIklzTXVsdGlwbGVTZWxlY3Rpb24iLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiRGVzY3JpcHRpb25OYW1lIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vIG91dHB1dCBjb21tYW5kIChhZGRzL3JlbW92ZXMgZnJvbSBtb2RlbCkKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVycyIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIAotCi0gICAgLy8gZ2VuIHNrZWxldG9uIGNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiSGFuZGxlckRlc2NyaXB0aW9uSG9sZGVycyIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7ICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MpOwotIAotICAgIC8vIG9wZW4gSmF2YSBlZGl0b3IgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MsIklzRW5hYmxlZCIsIG51bGwpOwotCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KSB7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0IiwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfVElUTEVfU0VSVklDRV9IRExSX0NPTkZJRywgCi0gICAgCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1NFUlZJQ0VfSERMUl9DT05GSUcsIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0KLSAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCIsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX0NMSUVOVF9IRExSX0NPTkZJRywgCi0gICAgCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX0NMSUVOVF9IRExSX0NPTkZJRywgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgSGFuZGxlcnNDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IHsKLQotICAgIHB1YmxpYyBIYW5kbGVyc0NvbW1hbmRGcmFnbWVudCgpIHsKLQotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotCi0gICAgICBhZGQobmV3IFNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50KCkpOwotICAgICAgYWRkKG5ldyBDbGllbnRIYW5kbGVyc0ZyYWdtZW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc0NsaWVudEhhbmRsZXIiLCBDbGllbnRIYW5kbGVyc0ZyYWdtZW50LmNsYXNzLCAiQ2xpZW50SGFuZGxlcnNFbmFibGVkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSXNTZXJ2aWNlSGFuZGxlciIsIFNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50LmNsYXNzLCAiU2VydmljZUhhbmRsZXJzRW5hYmxlZCIsIG51bGwpOwotCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJJc011bHRpcGxlU2VsZWN0aW9uIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiUHJvamVjdCIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIkNsYXNzTmFtZXMiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOwotICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIklzTXVsdGlwbGVTZWxlY3Rpb24iLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJXc2RkUmVzb3VyY2UiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiUHJvamVjdCIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIkNsYXNzTmFtZXMiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOyAgICAgIAotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIHsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIENsaWVudEhhbmRsZXJzRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQgewotCi0gICAgYm9vbGVhbiBpc0NsaWVudF8gPSBmYWxzZTsKLQotICAgIHB1YmxpYyBDbGllbnRIYW5kbGVyc0ZyYWdtZW50KCkgewotICAgICAgc2V0Q29uZGl0aW9uKG5ldyBDb25kaXRpb24oKSB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7Ci0gICAgICAgICAgcmV0dXJuIGlzQ2xpZW50XzsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIFNlcXVlbmNlRnJhZ21lbnQgY2xpZW50SGFuZGxlcnNSb290RnJhZ21lbnQgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotCi0gICAgICBjbGllbnRIYW5kbGVyc1Jvb3RGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0KLSAgICAgIGNsaWVudEhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIkNvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQiKSk7Ci0gICAgICBjbGllbnRIYW5kbGVyc1Jvb3RGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGNsaWVudEhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZCgpLCAiIikpOwotCi0gICAgICBzZXRUcnVlRnJhZ21lbnQoY2xpZW50SGFuZGxlcnNSb290RnJhZ21lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudEhhbmRsZXJzRW5hYmxlZChib29sZWFuIGlzQ2xpZW50KSB7Ci0gICAgICBpc0NsaWVudF8gPSBpc0NsaWVudDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLQotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlSGFuZGxlcnNGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudCB7Ci0KLSAgICBib29sZWFuIGlzU2VydmljZV8gPSBmYWxzZTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlSGFuZGxlcnNGcmFnbWVudCgpIHsKLSAgICAgIHNldENvbmRpdGlvbihuZXcgQ29uZGl0aW9uKCkgewotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkgewotICAgICAgICAgIHJldHVybiBpc1NlcnZpY2VfOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgU2VxdWVuY2VGcmFnbWVudCBzZXJ2aWNlSGFuZGxlcnNSb290RnJhZ21lbnQgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgc2VydmljZUhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0KLSAgICAgIFNlcXVlbmNlRnJhZ21lbnQgc2VydmljZUhhbmRsZXJzRnJhZ21lbnQgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgc2VydmljZUhhbmRsZXJzRnJhZ21lbnQuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQiKSk7Ci0gICAgICBzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kKCksICIiKSk7Ci0gICAgICBzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQoKSwgIiIpKTsKLQotICAgICAgc2VydmljZUhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudCk7Ci0KLSAgICAgIHNldFRydWVGcmFnbWVudChzZXJ2aWNlSGFuZGxlcnNSb290RnJhZ21lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VIYW5kbGVyc0VuYWJsZWQoYm9vbGVhbiBpc1NlcnZpY2UpIHsKLSAgICAgIGlzU2VydmljZV8gPSBpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RkUmVzb3VyY2UiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLQotICAgIH0KLQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvR2VuU2FtcGxlV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvR2VuU2FtcGxlV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGM5MmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0dlblNhbXBsZVdpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MjQgICAxNDI2MzUgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNjA4ICAgMTQ1NTI5IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDcxNyAgIDE0NjMzMiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1hawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVTZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5GaW5pc2hGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hEZWZhdWx0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LlRlc3REZWZhdWx0aW5nRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5UZXN0V2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LldlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTdGF0ZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuU2FtcGxlV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17ICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IEdlblNhbXBsZVJvb3RDb21tYW5kRnJhZ21lbnQoKTsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEJlZm9yZSBDbGllbnQgVGVzdCB3aWRnZXQuCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotCi0gICAgLy8gQWZ0ZXIgdGhlIGNsaWVudCB0ZXN0IHdpZGdldCAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlJ1blRlc3RDbGllbnQiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RTZXJ2aWNlIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0SUQiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIklzVGVzdFdpZGdldCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICAgICAgICAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJDbGllbnRUZXN0V2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9XU19TQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1dTX1NBTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50VGVzdFdpZGdldCgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi0gIHsKLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0JcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcl87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBwcm9qZWN0XzsKLQlwcml2YXRlIFN0cmluZyAgICAgICAgICAgIG1vZHVsZV87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJQcm9qZWN0XzsKLQlwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGVhcl87Ci0JcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50XzsKLQlwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHdzZGxVUklfOwotICAgIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgeyAgICAKLSAgICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotCSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CQotCSAgCi0gICAgICAvLyBTcGxpdCB1cCB0aGUgcHJvamVjdCBhbmQgbW9kdWxlCi0gICAgICBpbnQgaW5kZXggPSBtb2R1bGVfLmluZGV4T2YoIi8iKTsKLSAgICAgIGlmIChpbmRleCE9LTEpewotICAgICAgICBwcm9qZWN0XyA9IG1vZHVsZV8uc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgICAgICBtb2R1bGVfID0gbW9kdWxlXy5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlYXJfIT1udWxsICYmIGVhcl8ubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgaW50IGVhckluZGV4ID0gZWFyXy5pbmRleE9mKCIvIik7Ci0gICAgICAgIGlmIChlYXJJbmRleCE9LTEpIHsKLSAgICAgICAgICBlYXJQcm9qZWN0XyA9IGVhcl8uc3Vic3RyaW5nKDAsZWFySW5kZXgpOwotICAgICAgICAgIGVhcl8gPSBlYXJfLnN1YnN0cmluZyhlYXJJbmRleCsxKTsKLSAgICAgICAgfQotICAgICAgfSAgICAKLQkgIAotCSAgV2ViU2VydmljZUNsaWVudEluZm8gY2xpZW50SW5mbyA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50SW5mbygpOwotCSAgY2xpZW50SW5mby5zZXRJbXBsVVJMKGdldFByb3h5QmVhbigpKTsKLQkgIC8vY2xpZW50SW5mby5zZXRKMmVlTGV2ZWwoajJlZUxldmVsXyk7Ci0JICBjbGllbnRJbmZvLnNldFNlcnZlckZhY3RvcnlJZCh0eXBlUnVudGltZVNlcnZlcl8uZ2V0U2VydmVySWQoKSk7Ci0JICBjbGllbnRJbmZvLnNldFNlcnZlckluc3RhbmNlSWQodHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0JICBjbGllbnRJbmZvLnNldFN0YXRlKFdlYlNlcnZpY2VTdGF0ZS5VTktOT1dOX0xJVEVSQUwpOwotCSAgY2xpZW50SW5mby5zZXRXZWJTZXJ2aWNlUnVudGltZUlkKHR5cGVSdW50aW1lU2VydmVyXy5nZXRSdW50aW1lSWQoKSk7Ci0JICBjbGllbnRJbmZvLnNldFdzZGxVUkwod3NkbFVSSV8pOwotCSAgaWYgKGNsaWVudEluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpPT1udWxsKQotCSAgewotCSAgICBDcmVhdGVTZXJ2ZXJDb21tYW5kIGNyZWF0ZVNlcnZlckNvbW1hbmQgPSBuZXcgQ3JlYXRlU2VydmVyQ29tbWFuZCgpOwotCSAgICBjcmVhdGVTZXJ2ZXJDb21tYW5kLnNldFNlcnZlckZhY3RvcnlpZChjbGllbnRJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpKTsKLSAgICAgIGNyZWF0ZVNlcnZlckNvbW1hbmQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotCSAgICBJU3RhdHVzIGNyZWF0ZVNlcnZlclN0YXR1cyA9IGNyZWF0ZVNlcnZlckNvbW1hbmQuZXhlY3V0ZSggbnVsbCwgbnVsbCApOwotCSAgICBpZiAoY3JlYXRlU2VydmVyU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5PSyl7Ci0JICAgICAgY2xpZW50SW5mby5zZXRTZXJ2ZXJJbnN0YW5jZUlkKGNyZWF0ZVNlcnZlckNvbW1hbmQuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLQkgICAgfQotCSAgICBlbHNlIGlmIChjcmVhdGVTZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKXsKLQkgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCAgY3JlYXRlU2VydmVyU3RhdHVzICk7Ci0JICAgIH0gICAgICAgICAgICAgICAKLQkgICAgCi0JICB9Ci0JICAKLQkgIEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCgpOwotICAgICAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKGNsaWVudEluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0XyAhPSBudWxsICYmIGVhclByb2plY3RfLmxlbmd0aCgpPjAgJiYgZWFyXyE9IG51bGwgJiYgZWFyXy5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBjb21tYW5kLnNldFByb2plY3QoZWFyUHJvamVjdF8pOwotICAgICAgICBjb21tYW5kLnNldE1vZHVsZShlYXJfKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZC5zZXRQcm9qZWN0KHByb2plY3RfKTsKLSAgICAgICAgY29tbWFuZC5zZXRNb2R1bGUobW9kdWxlXyk7ICAgICAgIAotICAgICAgfQotCi0gICAgICBjb21tYW5kLnNldEVudmlyb25tZW50KCBlbnYgKTsKLSAgICAgIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICB7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIH0gICAgIAotCi0JICB3ZWJTZXJ2aWNlQ2xpZW50XyA9IG5ldyBUZXN0V2ViU2VydmljZUNsaWVudChjbGllbnRJbmZvKTsKLQkgIHJldHVybiBzdGF0dXM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHlCZWFuKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJveHlCZWFuID0gIiI7Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgICAgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbiggc2VsZWN0aW9uXy5nZXRGaXJzdEVsZW1lbnQoKSApOwotICAgICAgICBTdHJpbmcgICAgYmVhblBhY2thZ2UgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKCByZXNvdXJjZS5nZXRGdWxsUGF0aCgpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggYmVhblBhY2thZ2U9PW51bGwgKQotICAgICAgICAgIGJlYW5QYWNrYWdlID0gIiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBiZWFuUGFja2FnZSA9IGJlYW5QYWNrYWdlICsgIi4iOwotCi0gICAgICAgIHByb3h5QmVhbiA9IGJlYW5QYWNrYWdlICsgcmVzb3VyY2UuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmKCBwcm94eUJlYW4udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBwcm94eUJlYW4udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIikpIAotICAgICAgICB7Ci0gICAgICAgICAgcHJveHlCZWFuID0gcHJveHlCZWFuLnN1YnN0cmluZygwLHByb3h5QmVhbi5sYXN0SW5kZXhPZignLicpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsgICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gcHJveHlCZWFuOwotICAgIH0KLSAgICAKLQlwdWJsaWMgSVdlYlNlcnZpY2VDbGllbnQgZ2V0V2ViU2VydmljZUNsaWVudCgpCi0JewotCSAgcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRfOwotCX0KLQkKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyICkKLQl7Ci0gICAgICB0eXBlUnVudGltZVNlcnZlcl8gPSB0eXBlUnVudGltZVNlcnZlcjsgIAotCX0KLQkgIAotCXB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0JewotCSAgbW9kdWxlXyA9IG1vZHVsZTsKLQl9Ci0JICAKLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVUeXBlKCBTdHJpbmcgbW9kdWxlVHlwZSkKLQl7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dCggUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCApCi0JewotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgR2VuU2FtcGxlUm9vdENvbW1hbmRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLSAgewotICAgIHB1YmxpYyBHZW5TYW1wbGVSb290Q29tbWFuZEZyYWdtZW50KCkKLSAgICB7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kKHRydWUpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoIHRydWUgKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFRlc3REZWZhdWx0aW5nRnJhZ21lbnQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50VGVzdEZyYWdtZW50KCAiQ2xpZW50VGVzdFdpZGdldCIpICk7IAotICAgICAgYWRkKCBuZXcgRmluaXNoRnJhZ21lbnQoKSApOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIC8vTWFwIFNlbGVjdGlvbkNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzICk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIG5ldyBGb3JjZVRydWUoKSApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSdW5UZXN0Q2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgCi0gICAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50VHlwZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5XU0lMIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NpbFVSSSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VVUkkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBuZXcgRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyKCkpOwotICAgICAgICAgICAgIAotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuY2xhc3MpOwotICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MgKTsgICAgIAotCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzLCJDbGllbnRFYXJDb21wb25lbnROYW1lIixudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkIiwgRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW5UZXN0Q2xpZW50IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgbnVsbCApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdFR5cGUiLCBJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzLCAiTW9kdWxlVHlwZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MpOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MgKTsKLQkgIAotCSAgCi0JICAKLQkgIAotICAgICAgLy8gTWFwIEluaXRpYWxpemVQcm94eUNvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlQ2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOyAgICAgIAotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOyAgICAgIAotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlckluc3RhbmNlSWQiLCBGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0JICAKLSAgICAgIC8vIE1BUCBwb3N0IHNlcnZlciBjb25maWcgY2FsbCAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkVBUlByb2plY3ROYW1lIiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1hcCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIEZvcmNlVHJ1ZSBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi0gIHsKLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0ltcG9ydFdTSUxXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU0lMV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFjMzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0ltcG9ydFdTSUxXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkltcG9ydFdTSUxXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWwuQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBJbXBvcnRXU0lMV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHB1YmxpYyBJbXBvcnRXU0lMV2lkZ2V0QmluZGluZygpCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFNlcXVlbmNlRnJhZ21lbnQgcm9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICAgICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIkltcG9ydFdTSUxXaWRnZXQiKSk7Ci0gICAgICAgICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZCgpLCAiIikpOwotICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7ICAgIAotICAgIC8vIEltcG9ydFdTSUxXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIEltcG9ydFdTSUxXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vIEFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEltcG9ydFdTSUxXaWRnZXQuY2xhc3MsICJHZW5XU0lMQXJndW1lbnRzIiwgQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kLmNsYXNzLCAiQXJncyIsIG51bGwpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIkltcG9ydFdTSUxXaWRnZXQiLCAKLSAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5USVRMRV9XU0lMX0lNUE9SVCwKLSAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5ERVNDX1dTSUxfSU1QT1JULAotICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbXBvcnRXU0lMV2lkZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvSW1wb3J0V1NXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU1dpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0MWEwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU1dpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlB1Ymxpc2hXU1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIEltcG9ydFdTV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5OwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLSAgcHJpdmF0ZSBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWc7Ci0KLSAgcHVibGljIEltcG9ydFdTV2lkZ2V0QmluZGluZygpCi0gIHsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcgPSBuZXcgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQoKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFNlcXVlbmNlRnJhZ21lbnQgcm9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICAgICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIldTSW1wb3J0IikpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQocHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpLCAiIikpOwotICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuY2FuRmluaXNoUmVnaXN0cnkgPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJDYW5GaW5pc2godGhpcy5jYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmRhdGFNYXBwaW5nUmVnaXN0cnkgPSBkYXRhUmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKHRoaXMuZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gICAgCi0gICAgLy8gUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiUHVibGlzaFRvUHJpdmF0ZVVEREkiLCBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gTGF1bmNoV2ViU2VydmljZXNFeHBsb3JlckNvbW1hbmQKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiRm9yY2VMYXVuY2hPdXRzaWRlSURFIiwgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkxhdW5jaE9wdGlvbnMiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyh0aGlzLndpZGdldFJlZ2lzdHJ5KTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiV1NJbXBvcnQiLCAKLSAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9XU19GSU5ELAotICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX0RFU0NfV1NfRklORCwKLSAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgewotICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgUHVibGlzaFdTV2lkZ2V0KGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MDI5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIwNCAxMjQ0MDggICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIgICAgICAgICAgCi0gKiAyMDA2MDIyMSAgIDExOTExMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNTI0ICAgMTQyNjM1IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDgxOCAgIDE1NDQwMiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDgzMCAgIDE1MTA5MSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbiwgQ2xpZW50IHNpZGUgc3RpbGwgZW5hYmxlZCB3aGVuIHRoZXJlJ3Mgb25seSBzdHViIHNlcnZlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuUnVudGltZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIC8vIENsaWVudFdpemFyZFdpZGdldAotCQotCXByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZGV2ZWxvcENsaWVudF87Ci0JcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBhc3NlbWJsZUNsaWVudF87Ci0JcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBkZXBsb3lDbGllbnRfOwotCQotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyICAgIGNsaWVudElkc187Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgY2xpZW50UnVudGltZUlkXzsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICB0ZXN0U2VydmljZTsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICBpbnN0YWxsQ2xpZW50OwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgIHN0YXJ0Q2xpZW50OwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgIHJ1blRlc3RDbGllbnQ7Ci0gIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICAgICAgcmVzb3VyY2VDb250ZXh0OwotICAKLSAgLy8gQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldAotICAvL3ByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xpZW50Q2hvaWNlc187Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50RWFyUHJvamVjdE5hbWVfOwotICAvL3ByaXZhdGUgU3RyaW5nIGNsaWVudENvbXBvbmVudE5hbWVfOwotICAvL3ByaXZhdGUgU3RyaW5nIGNsaWVudEVhckNvbXBvbmVudE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRDb21wb25lbnRUeXBlXzsKLSAgLy9wcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbjsKLSAgcHJpdmF0ZSBib29sZWFuIGNsaWVudE5lZWRFQVJfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkXzsKLSAgCi0gIC8vIFdTRExTZWxlY3Rpb25XaWRnZXQKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBnZW5XU0lMOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHdzaWxVUkk7Ci0gIAotICAvLyBXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZAotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICAKLSAgLy8gV1NETFNlbGVjdGlvblRyZWVXaWRnZXQKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICB3c2RsVVJJOwotICAKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBpc0NsaWVudFNjZW5hcmlvXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBnZW5Qcm94eV8gPSB0cnVlOwotICBwcml2YXRlIFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgCi0gIC8vU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kCi0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckluc3RJZF87Ci0gIAotICBwdWJsaWMgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoIGJvb2xlYW4gaXNDbGllbnRTY2VuYXJpbyApCi0gIHsKLSAgICBpc0NsaWVudFNjZW5hcmlvXyA9IGlzQ2xpZW50U2NlbmFyaW87Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoaXMgY29tbWFuZCBpcyBydW5uaW5nIGluIHRoZSBjbGllbnQgd2l6YXJkIGFuZAotICAgKiBmYWxzZSBpZiB0aGlzIGNvbW1hbmQgaXMgcnVubmluZyBpbiB0aGUgY3JlYXRlIHdlYiBzZXJ2aWNlIHdpemFyZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldElzQ2xpZW50U2NlbmFyaW8oKQotICB7Ci0gICAgcmV0dXJuIGlzQ2xpZW50U2NlbmFyaW9fOyAKLSAgfQotICAKLSAgLyoKLSAgcHVibGljIHZvaWQgc2V0UnVudGltZTJDbGllbnRUeXBlcyggU2VsZWN0aW9uTGlzdENob2ljZXMgY2hvaWNlcyApCi0gIHsKLSAgICBjbGllbnRDaG9pY2VzXyA9IGNob2ljZXM7ICAKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkKLSAgewotICAgIHJldHVybiBjbGllbnRDaG9pY2VzXzsgIAotICB9Ci0gICovCi0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpCi0gIHsKLSAgICBjbGllbnRJZHNfID0gaWRzOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0JaWYgKGNsaWVudElkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpPT1udWxsIHx8IGNsaWVudElkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpLmxlbmd0aCgpPT0wKQotCXsKLQkJLy9TZXQgdGhlIGluc3RhbmNlIGlkIGZyb20gdGhlIHNlcnZpY2Ugc2lkZSBpZiB0aGUgZmFjdG9yeSBpZHMgbWF0Y2gKLQkJaWYgKHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkXyE9bnVsbCAmJiBzZXJ2aWNlU2VydmVySW5zdGFuY2VJZF8ubGVuZ3RoKCk+MCkKLQkJewotCQkJaWYgKHNlcnZpY2VTZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZpY2VTZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0JCQl7Ci0JCQkJaWYgKHNlcnZpY2VTZXJ2ZXJGYWN0b3J5SWRfLmVxdWFscyhjbGllbnRJZHNfLmdldFNlcnZlcklkKCkpKQotCQkJCXsKLQkJCQkJY2xpZW50SWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkXyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotICAgIHJldHVybiBjbGllbnRJZHNfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRSdW50aW1lSWQoU3RyaW5nIGlkKQotICB7Ci0gICAgY2xpZW50UnVudGltZUlkXyA9IGlkOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFJ1bnRpbWVJZCgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50UnVudGltZUlkXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkKFN0cmluZyBzZXJ2ZXJJbnN0SWQpIHsKLSAgCXRoaXMuc2VydmVySW5zdElkXyA9IHNlcnZlckluc3RJZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQoKXsKLSAgCXJldHVybiB0aGlzLnNlcnZlckluc3RJZF87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudElzRXhpc3RpbmdTZXJ2ZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NsaWVudElzRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRQcm9qZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0KCkKLSAgewotCSAgLy9yZXR1cm4gY2xpZW50UHJvamVjdE5hbWVfICsgIi8iICsgY2xpZW50Q29tcG9uZW50TmFtZV87Ci0gICAgICByZXR1cm4gY2xpZW50UHJvamVjdE5hbWVfICsgIi8iICsgY2xpZW50UHJvamVjdE5hbWVfOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdEVBUi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdEVBUigpCi0gIHsKLSAgICBpZiAoY2xpZW50RWFyUHJvamVjdE5hbWVfIT1udWxsICYmIGNsaWVudEVhclByb2plY3ROYW1lXy5sZW5ndGgoKT4wKQotICAgIHsKLQkgICAgLy9yZXR1cm4gY2xpZW50RWFyUHJvamVjdE5hbWVfICsgIi8iICsgY2xpZW50RWFyQ29tcG9uZW50TmFtZV87Ci0gICAgICByZXR1cm4gY2xpZW50RWFyUHJvamVjdE5hbWVfICsgIi8iICsgY2xpZW50RWFyUHJvamVjdE5hbWVfOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfQotICAKLSAgLyoKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TW9kdWxlUHJvamVjdE5hbWUoIFN0cmluZyBwcm9qZWN0TmFtZSApCi0gIHsKLQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCi0JaWYoIHByb2plY3ROYW1lICE9IG51bGwgJiYgIXByb2plY3ROYW1lLmVxdWFscygiIikgKQotCXsKLQkgIElQYXRoICAgIHByb2plY3RQYXRoID0gbmV3IFBhdGgoIHByb2plY3ROYW1lICk7Ci0JICBJUHJvamVjdCBwcm9qZWN0ICAgICA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSggcHJvamVjdFBhdGggKTsKLQkgIFN0cmluZyAgIG1vZHVsZU5hbWUgID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViTW9kdWxlTmFtZSggcHJvamVjdCApOwotCSAgCi0JICByZXN1bHQgPSBwcm9qZWN0TmFtZSArICIvIiArIG1vZHVsZU5hbWU7Ci0JfQotCQotCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgKi8KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdFR5cGUuCi0gICAqLwotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0VHlwZSgpCi0gIHsKLSAgICAvL3JldHVybiBjbGllbnRDaG9pY2VzXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgcmV0dXJuIGNsaWVudENvbXBvbmVudFR5cGVfOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRSdW50aW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRSdW50aW1lKCkKLSAgewotICAgIHJldHVybiBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50U2VydmVyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc18uZ2V0U2VydmVySWQoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTZXJ2ZXJJbnN0YW5jZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50SWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2ZXJJbnN0SWQpewotICAgIAotICAgIGlmIChjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKT09bnVsbCkKLSAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbnN0SWQpOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBnZW5XU0lMLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHZW5XU0lMKCkKLSAgewotICAgIHJldHVybiBnZW5XU0lMOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBnZW5XU0lMCi0gICAqICAgICAgICAgICAgVGhlIGdlbldTSUwgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuV1NJTChib29sZWFuIGdlbldTSUwpCi0gIHsKLSAgICB0aGlzLmdlbldTSUwgPSBnZW5XU0lMOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VDb250ZXh0LgotICAgKi8KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlQ29udGV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcmVzb3VyY2VDb250ZXh0Ci0gICAqICAgICAgICAgICAgVGhlIHJlc291cmNlQ29udGV4dCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCkKLSAgewotICAgIHRoaXMucmVzb3VyY2VDb250ZXh0ID0gcmVzb3VyY2VDb250ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGVzdFByb3h5U2VsZWN0ZWQuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRlc3RQcm94eVNlbGVjdGVkCi0gICAqICAgICAgICAgICAgVGhlIHRlc3RQcm94eVNlbGVjdGVkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKEJvb2xlYW4gdGVzdFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXN0UHJveHlTZWxlY3RlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFJ1blRlc3RDbGllbnQoKQotICB7Ci0gICAgcmV0dXJuIHJ1blRlc3RDbGllbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRlc3RQcm94eVNlbGVjdGVkCi0gICAqICAgICAgICAgICAgVGhlIHRlc3RQcm94eVNlbGVjdGVkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1blRlc3RDbGllbnQoYm9vbGVhbiBydW5UZXN0Q2xpZW50KQotICB7Ci0gICAgdGhpcy5ydW5UZXN0Q2xpZW50ID0gcnVuVGVzdENsaWVudDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcENsaWVudCgpIHsKLQkgIHJldHVybiBkZXZlbG9wQ2xpZW50XzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERldmVsb3BDbGllbnQoYm9vbGVhbiBkZXZlbG9wQ2xpZW50KSB7Ci0JICB0aGlzLmRldmVsb3BDbGllbnRfID0gZGV2ZWxvcENsaWVudDsKLSAgfQkKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRBc3NlbWJsZUNsaWVudCgpIHsKLQkgIHJldHVybiBhc3NlbWJsZUNsaWVudF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBc3NlbWJsZUNsaWVudChib29sZWFuIGFzc2VtYmxlQ2xpZW50KSB7Ci0JICB0aGlzLmFzc2VtYmxlQ2xpZW50XyA9IGFzc2VtYmxlQ2xpZW50OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0RGVwbG95Q2xpZW50KCkgewotCSAgcmV0dXJuIGRlcGxveUNsaWVudF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXBsb3lDbGllbnQoYm9vbGVhbiBkZXBsb3lDbGllbnQpIHsKLQkgIHRoaXMuZGVwbG95Q2xpZW50XyA9IGRlcGxveUNsaWVudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5zdGFsbENsaWVudC4KLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldEluc3RhbGxDbGllbnQoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbGxDbGllbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGluc3RhbGxDbGllbnQKLSAgICogICAgICAgICAgICBUaGUgaW5zdGFsbENsaWVudCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnN0YWxsQ2xpZW50KEJvb2xlYW4gaW5zdGFsbENsaWVudCkKLSAgewotICAgIHRoaXMuaW5zdGFsbENsaWVudCA9IGluc3RhbGxDbGllbnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0Q2xpZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRDbGllbnQoKQotICB7Ci0gICAgcmV0dXJuIHN0YXJ0Q2xpZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzdGFydENsaWVudAotICAgKiAgICAgICAgICAgIFRoZSBzdGFydENsaWVudCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGFydENsaWVudChib29sZWFuIHN0YXJ0Q2xpZW50KQotICB7Ci0gICAgdGhpcy5zdGFydENsaWVudCA9IHN0YXJ0Q2xpZW50OwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAgIHJldHVybiB3c2RsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsVVJJCi0gICAqICAgICAgICAgICAgVGhlIHdzZGxVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2lsVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVVJJKCkKLSAgewotICAgIHJldHVybiB3c2lsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2lsVVJJCi0gICAqICAgICAgICAgICAgVGhlIHdzaWxVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NpbFVSSShTdHJpbmcgd3NpbFVSSSkKLSAgewotICAgIHRoaXMud3NpbFVSSSA9IHdzaWxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZXNQYXJzZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyCi0gICAqICAgICAgICAgICAgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZVZlcnNpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEoyRUVWZXJzaW9uKCkKLSAgewotCSAgcmV0dXJuICIxNCI7IC8vcm0gajJlZQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBqMmVlVmVyc2lvbiB0byBzZXQuCi0gICAqLwotICAvKgotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRKMkVFVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotCSAgajJlZVZlcnNpb24gPSB2ZXJzaW9uOwotICB9Ci0gICovCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBwcm94eSBzaG91bGQgYmUgZ2VuZXJhdGVkIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBnZW5Qcm94eV87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICB7Ci0gICAgZ2VuUHJveHlfID0gZ2VuUHJveHk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZShTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpCi0gIHsKLSAgCXRoaXMubGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZhY2lsaXR5IHRvIGxhdW5jaC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoKQotICB7Ci0gIAlyZXR1cm4gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBwcm9qZWN0IG5lZWRzIGFuIEVBUiBwcm9qZWN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50TmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50TmVlZEVBUl87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudE5lZWRFQVIoYm9vbGVhbiBjbGllbnROZWVkRUFSKQotICB7Ci0gICAgY2xpZW50TmVlZEVBUl8gPSBjbGllbnROZWVkRUFSOwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudENvbXBvbmVudFR5cGUoU3RyaW5nIGNsaWVudENvbXBvbmVudFR5cGUpCi0gIHsKLSAgICB0aGlzLmNsaWVudENvbXBvbmVudFR5cGVfID0gY2xpZW50Q29tcG9uZW50VHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3ROYW1lKFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdE5hbWVfID0gY2xpZW50UHJvamVjdE5hbWU7Ci0gIH0KLQotICAvKgotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRDb21wb25lbnROYW1lKFN0cmluZyBjbGllbnRDb21wb25lbnROYW1lKQotICB7Ci0gICAgdGhpcy5jbGllbnRDb21wb25lbnROYW1lXyA9IGNsaWVudENvbXBvbmVudE5hbWU7Ci0gIH0KLSAgKi8KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEVhclByb2plY3ROYW1lKFN0cmluZyBjbGllbnRFYXJQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuY2xpZW50RWFyUHJvamVjdE5hbWVfID0gY2xpZW50RWFyUHJvamVjdE5hbWU7Ci0gIH0KLSAgCi0gIC8qCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEVhckNvbXBvbmVudE5hbWUoU3RyaW5nIGNsaWVudEVhckNvbXBvbmVudE5hbWUpCi0gIHsKLSAgICB0aGlzLmNsaWVudEVhckNvbXBvbmVudE5hbWVfID0gY2xpZW50RWFyQ29tcG9uZW50TmFtZTsKLSAgfQotICAqLwotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRFYXJQcm9qZWN0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50RWFyUHJvamVjdE5hbWVfOwotICB9Ci0gIAotICAvKgotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEVhckNvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudEVhckNvbXBvbmVudE5hbWVfOwotICB9Ci0gICovCi0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyRmFjdG9yeUlkKFN0cmluZyBpZCkKLSAgewotICAJc2VydmljZVNlcnZlckZhY3RvcnlJZF8gPSBpZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBpZCkKLSAgewotICAJc2VydmljZVNlcnZlckluc3RhbmNlSWRfID0gaWQ7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52ID0gZ2V0RW52aXJvbm1lbnQoKTsKLSAgICAvL0RvIHNvbWUgYmFzaWMgdmFsaWRhdGlvbiB0byBlbnN1cmUgdGhlIHNlcnZlci9ydW50aW1lL3R5cGUgY29tYmluYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIC8vVGhpcyBpcyBuZWVkZWQgdG8gY2F0Y2ggcHJvYmxlbXMgaW4gdGhlIGRlZmF1bHRpbmcKLSAgICAvL3doZW4gdGhlIHVzZXIgY2xpY2tzIEZpbmlzaCBwcmlvciB0byBwYWdlIDMgb2YgdGhlIHdpemFyZC4KLSAgICAKLSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIAotICAgIFN0cmluZyBzY2VuYXJpbyA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfQ0xJRU5UX1NVQjsKLQotICAgIC8vRW5zdXJlIHNlcnZlciBhbmQgcnVudGltZSBhcmUgbm9uLW51bGwKLSAgICBTdHJpbmcgcnVudGltZUlkID0gY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKTsKLSAgICBTdHJpbmcgc2VydmVySWQgPSBjbGllbnRJZHNfLmdldFNlcnZlcklkKCk7Ci0gICAgU3RyaW5nIHR5cGVJZCA9IGNsaWVudElkc18uZ2V0VHlwZUlkKCk7Ci0gICAgCi0gICAgaWYoIHJ1bnRpbWVJZCA9PSBudWxsIHx8IHJ1bnRpbWVJZC5sZW5ndGgoKT09MCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX05PX1JVTlRJTUUsIG5ldyBTdHJpbmdbXXsgc2NlbmFyaW8gfSApICk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgfQotICAgIAotICAgIGlmKCBzZXJ2ZXJJZCA9PSBudWxsIHx8IHNlcnZlcklkLmxlbmd0aCgpPT0wKQotICAgIHsKLSAgICAgIC8vUG9wdXAgYW5kIGVycm9yIGlmIHRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgIElQcm9qZWN0IGNsaWVudFByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoY2xpZW50UHJvamVjdE5hbWVfKTsKLSAgICAgIGlmICghY2xpZW50UHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFJ1bnRpbWVMYWJlbEJ5SWQocnVudGltZUlkKTsKLSAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9OT19TRVJWRVJfUlVOVElNRSwgbmV3IFN0cmluZ1tde3J1bnRpbWVMYWJlbCB9ICkgKTsKLSAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZUJ5SWQocnVudGltZUlkKTsKLQotICAgICAgICBpZiAoZGVzYy5nZXRTZXJ2ZXJSZXF1aXJlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19OT19TRVJWRVIsIG5ldyBTdHJpbmdbXSB7IHNjZW5hcmlvIH0pKTsKLSAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIE5vIHNlcnZlciBoYXMgYmVlbiBzZWxlY3RlZCBhbmQgdGhlIHNlbGVjdGVkIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICAgICAgICAvLyBkb2VzIG5vdAotICAgICAgICAgIC8vIHJlcXVpcmUgYSBzZXJ2ZXIuIFNldCBkZXBsb3ksIGluc3RhbGwsIHJ1biwgYW5kIHRlc3QgdG8gZmFsc2UuCi0gICAgICAgICAgZGVwbG95Q2xpZW50XyA9IGZhbHNlOwotICAgICAgICAgIGluc3RhbGxDbGllbnQgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICAgIHRlc3RTZXJ2aWNlID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL0lmIHRoZSBzZXJ2ZXIgaXMgbm9uLW51bGwsIGVuc3VyZSB0aGUgc2VydmVyLCBydW50aW1lLCBhbmQgdHlwZSBhcmUgY29tcGF0aWJsZQotICAgIGlmIChzZXJ2ZXJJZCAhPSBudWxsICYmIHNlcnZlcklkLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBpZiAoIVdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmlzU2VydmVyQ2xpZW50UnVudGltZVR5cGVTdXBwb3J0ZWQoc2VydmVySWQsIHJ1bnRpbWVJZCwgdHlwZUlkKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHNlcnZlckxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmVyTGFiZWxCeUlkKHNlcnZlcklkKTsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFJ1bnRpbWVMYWJlbEJ5SWQocnVudGltZUlkKTsKLSAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TLCBuZXcgU3RyaW5nW10geyBzZXJ2ZXJMYWJlbCwKLSAgICAgICAgICAgIHJ1bnRpbWVMYWJlbCB9KSk7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIH0KLQotICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWxlY3RlZCBzZXJ2ZXIgdHlwZSBoYXMgb25seSBzdHViIHJ1bnRpbWVzIGFzc29jaWF0ZWQKLSAgICAgIC8vIHdpdGggaXQuCi0gICAgICAvLyBJZiBzbywgc2V0IGluc3RhbGwgYW5kIHRlc3QgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQuCi0gICAgICBJUnVudGltZSBub25TdHViUnVudGltZSA9IFNlcnZlclV0aWxzLmdldE5vblN0dWJSdW50aW1lKHNlcnZlcklkKTsKLSAgICAgIGlmIChub25TdHViUnVudGltZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBpbnN0YWxsQ2xpZW50ID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgc3RhcnRDbGllbnQgPSBmYWxzZTsKLSAgICAgICAgdGVzdFNlcnZpY2UgPSBCb29sZWFuLkZBTFNFOwotICAgICAgfQotICAgIH0KLQotCSAgLy8gY2FsY3VsYXRlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGNsaWVudFJ1bnRpbWVJZCBiYXNlZCBvbiBjdXJyZW50IHNldHRpbmdzLgotCSAgY2xpZW50UnVudGltZUlkXyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldENsaWVudFJ1bnRpbWVJZChjbGllbnRJZHNfLCBjbGllbnRQcm9qZWN0TmFtZV8sIGNsaWVudENvbXBvbmVudFR5cGVfKTsgICAKLQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjZDhiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25GcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuRXh0ZW5zaW9uRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudEV4dGVuc2lvbkZyYWdtZW50IGV4dGVuZHMgRXh0ZW5zaW9uRnJhZ21lbnQKLXsgIAotICBwdWJsaWMgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDbGllbnRFeHRlbnNpb25GcmFnbWVudCggQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgc3VwZXIoIGZyYWdtZW50ICk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBzZXRFeHRlbnNpb25JZHMoIG5ldyBTdHJpbmdbXXsgaWRzLmdldFR5cGVJZCgpLCBpZHMuZ2V0UnVudGltZUlkKCksIGlkcy5nZXRTZXJ2ZXJJZCgpIH0gKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjY2xvbmUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBDbGllbnRFeHRlbnNpb25GcmFnbWVudCggdGhpcyApOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmZGExOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA3MjggICAxNDU0MjYga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIElXZWJTZXJ2aWNlQ2xpZW50IHdlYlNlcnZpY2VDbGllbnRfOwotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJveHlCZWFuLgotICAgKi8KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlCZWFuKCkKLSAgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlQ2xpZW50Xy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldEltcGxVUkwoKTsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXRFbmRwb2ludE1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0RW5kcG9pbnRNZXRob2QoKQotICB7Ci0JcmV0dXJuICJzZXRFbmRwb2ludCI7Ci0gIH0KLSAgCQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlQ2xpZW50KElXZWJTZXJ2aWNlQ2xpZW50IHdzYykKLSAgewotCXdlYlNlcnZpY2VDbGllbnRfID0gd3NjOwotICB9Ci0JCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VJZCgpCi0gIHsKLQlyZXR1cm4gd2ViU2VydmljZUNsaWVudF8uZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gIH0KLQkKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJGYWN0b3J5SWQoKQotICB7Ci0JcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm94eUVuZHBvaW50LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm94eUVuZHBvaW50KCkgewotICAJcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0UHJveHlFbmRwb2ludCgpOwotICB9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjliMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMDQgMTI0NDA4ICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgICAgIAotICogMjAwNjAyMjEgICAxMTkxMTEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA4MjMgICAxNTQ5MzggcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuUnVudGltZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0JcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBkZXZlbG9wU2VydmljZV87Ci0JcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBhc3NlbWJsZVNlcnZpY2VfOwotCXByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZGVwbG95U2VydmljZV87Ci0KLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICBpbnN0YWxsU2VydmljZTsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICBzdGFydFNlcnZpY2U7Ci0gIHByaXZhdGUgQm9vbGVhbiAgICAgICAgICAgICAgdGVzdFNlcnZpY2U7Ci0gIHByaXZhdGUgQm9vbGVhbiAgICAgICAgICAgICAgcHVibGlzaFNlcnZpY2U7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgc2VydmljZUlkc187Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgc2VydmljZVJ1bnRpbWVJZF87Ci0gIC8vcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBzZXJ2aWNlQ2hvaWNlc187Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgc2VydmljZVByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIHNlcnZpY2VDb21wb25lbnRUeXBlXzsKLSAgLy9wcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIHNlcnZpY2VDb21wb25lbnROYW1lXzsKLSAgLy9wcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIHNlcnZpY2VFYXJDb21wb25lbnROYW1lXzsKLSAgLy9wcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbjsKLSAgcHJpdmF0ZSBib29sZWFuIHNlcnZpY2VOZWVkRUFSXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3c2RsUGFyc2VyXzsKLSAgCi0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpCi0gIHsKLSAgICBzZXJ2aWNlSWRzXyA9IGlkczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RJZCl7Ci0gICAgCi0gICAgaWYgKHNlcnZpY2VJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKT09bnVsbCkKLSAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVySW5zdElkKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIFR5cGVSdW50aW1lU2VydmljZSBvYmplY3QgdGhhdCB0aGUgdXNlciBoYXMgc2VsZWN0ZWQgb24KLSAgICogcGFnZSAzIG9mIHRoZSB3aXphcmQuCi0gICAqLwotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVJ1bnRpbWVJZChTdHJpbmcgaWQpCi0gIHsKLSAgICBzZXJ2aWNlUnVudGltZUlkXyA9IGlkOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VSdW50aW1lSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VSdW50aW1lSWRfOwotICB9Ci0KLSAgLyoKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdChTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjaG9pY2VzKQotICB7Ci0gICAgc2VydmljZUNob2ljZXNfID0gY2hvaWNlczsKLSAgfQotICAqLwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHB1Ymxpc2hTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0UHVibGlzaFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHB1Ymxpc2hTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwdWJsaXNoU2VydmljZQotICAgKiAgICAgICAgICAgIFRoZSBwdWJsaXNoU2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoU2VydmljZShCb29sZWFuIHB1Ymxpc2hTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5wdWJsaXNoU2VydmljZSA9IHB1Ymxpc2hTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVySXNFeGlzdGluZ1NlcnZlci4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNlcnZlcklzRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0KLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJJbnN0YW5jZUlkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclByb2plY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VQcm9qZWN0TmFtZV8gKyAiLyIgKyBzZXJ2aWNlUHJvamVjdE5hbWVfOyAKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVyUHJvamVjdEVBUi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUHJvamVjdEVBUigpCi0gIHsKLSAgICBpZiAoc2VydmljZUVhclByb2plY3ROYW1lXyE9bnVsbCAmJiBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgcmV0dXJuIHNlcnZpY2VFYXJQcm9qZWN0TmFtZV8gKyAiLyIgKyBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclJ1bnRpbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclJ1bnRpbWUoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVyU2VydmVyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFNlcnZlcklkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2aWNlU2NlbmFyaW9JZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVNjZW5hcmlvSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcFNlcnZpY2UoKSB7Ci0JICByZXR1cm4gZGV2ZWxvcFNlcnZpY2VfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGV2ZWxvcFNlcnZpY2UoYm9vbGVhbiBkZXZlbG9wU2VydmljZSkgewotCSAgdGhpcy5kZXZlbG9wU2VydmljZV8gPSBkZXZlbG9wU2VydmljZTsKLSAgfQkKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRBc3NlbWJsZVNlcnZpY2UoKSB7Ci0JICByZXR1cm4gYXNzZW1ibGVTZXJ2aWNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFzc2VtYmxlU2VydmljZShib29sZWFuIGFzc2VtYmxlU2VydmljZSkgewotCSAgdGhpcy5hc3NlbWJsZVNlcnZpY2VfID0gYXNzZW1ibGVTZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0RGVwbG95U2VydmljZSgpIHsKLQkgIHJldHVybiBkZXBsb3lTZXJ2aWNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlcGxveVNlcnZpY2UoYm9vbGVhbiBkZXBsb3lTZXJ2aWNlKSB7Ci0JICB0aGlzLmRlcGxveVNlcnZpY2VfID0gZGVwbG95U2VydmljZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5zdGFsbFNlcnZpY2UuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRJbnN0YWxsU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFsbFNlcnZpY2U7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBpbnN0YWxsU2VydmljZQotICAgKiAgICAgICAgICAgIFNwZWNpZmllcyBpZiBzZXJ2aWNlIHNob3VsZCBiZSBpbnN0YWxsZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnN0YWxsU2VydmljZShCb29sZWFuIGluc3RhbGxTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5pbnN0YWxsU2VydmljZSA9IGluc3RhbGxTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhcnRTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0U3RhcnRTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBzdGFydFNlcnZpY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gc3RhcnRTZXJ2aWNlCi0gICAqICAgICAgICAgICAgVGhlIHN0YXJ0U2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGFydFNlcnZpY2UoQm9vbGVhbiBzdGFydFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnN0YXJ0U2VydmljZSA9IHN0YXJ0U2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRlc3RTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0ZXN0U2VydmljZQotICAgKiAgICAgICAgICAgIFRoZSB0ZXN0U2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZShCb29sZWFuIHRlc3RTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy50ZXN0U2VydmljZSA9IHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIEJvb2xlYW4gZ2V0UHVibGlzaCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqMmVlVmVyc2lvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUoyRUVWZXJzaW9uKCkKLSAgewotICAJcmV0dXJuICIxNCI7IC8vcm0gajJlZQotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSB3ZWIgc2VydmljZSBwcm9qZWN0IG5lZWRzIHRvIGJlIGluIGFuIEVBUiBwcm9qZWN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2VydmljZU5lZWRFQVIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VOZWVkRUFSXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZU5lZWRFQVIoYm9vbGVhbiBzZXJ2aWNlTmVlZEVBUikKLSAgewotICAgIHNlcnZpY2VOZWVkRUFSXyA9IHNlcnZpY2VOZWVkRUFSOwotICB9ICAgIAotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbFBhcnNlcl8uCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgaWYoIHdzZGxQYXJzZXJfID09IG51bGwgKQotICAgIHsKLSAgICAgIHdzZGxQYXJzZXJfID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7ICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHdzZGxQYXJzZXJfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFBhcnNlcl8gVGhlIHdzZGxQYXJzZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdzZGxQYXJzZXIgKQotICB7Ci0gICAgd3NkbFBhcnNlcl8gPSB3c2RsUGFyc2VyOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3ROYW1lKFN0cmluZyBzZXJ2aWNlUHJvamVjdE5hbWUpCi0gIHsKLSAgICB0aGlzLnNlcnZpY2VQcm9qZWN0TmFtZV8gPSBzZXJ2aWNlUHJvamVjdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRWFyUHJvamVjdE5hbWUoU3RyaW5nIHNlcnZpY2VFYXJQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuc2VydmljZUVhclByb2plY3ROYW1lXyA9IHNlcnZpY2VFYXJQcm9qZWN0TmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUNvbXBvbmVudFR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICB0aGlzLnNlcnZpY2VDb21wb25lbnRUeXBlXyA9IHR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNvbXBvbmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VDb21wb25lbnRUeXBlXzsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIC8vRG8gc29tZSBiYXNpYyB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGUgc2VydmVyL3J1bnRpbWUvdHlwZSBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgLy9UaGlzIGlzIG5lZWRlZCB0byBjYXRjaCBwcm9ibGVtcyBpbiB0aGUgZGVmYXVsdGluZwotICAgIC8vd2hlbiB0aGUgdXNlciBjbGlja3MgRmluaXNoIHByaW9yIHRvIHBhZ2UgMyBvZiB0aGUgd2l6YXJkLgotICAgIAotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAKLSAgICBTdHJpbmcgc2NlbmFyaW8gPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1NFUlZJQ0VfU1VCOwotCi0gICAgLy9FbnN1cmUgc2VydmVyIGFuZCBydW50aW1lIGFyZSBub24tbnVsbAotICAgIFN0cmluZyBydW50aW1lSWQgPSBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKTsKLSAgICBTdHJpbmcgc2VydmVySWQgPSBzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJZCgpOwotICAgIFN0cmluZyB0eXBlSWQgPSBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKTsKLSAgICAKLSAgICBpZiggcnVudGltZUlkID09IG51bGwgfHwgcnVudGltZUlkLmxlbmd0aCgpPT0wKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfTk9fUlVOVElNRSwgbmV3IFN0cmluZ1tdeyBzY2VuYXJpbyB9ICkgKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICB9Ci0gICAgCi0gICAgaWYoIHNlcnZlcklkID09IG51bGwgfHwgc2VydmVySWQubGVuZ3RoKCk9PTApCi0gICAgewotICAgICAgLy9Qb3B1cCBhbmQgZXJyb3IgaWYgdGhlIHNlbGVjdGVkIHNlcnZpY2UgcHJvamVjdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2VQcm9qZWN0TmFtZV8pOwotICAgICAgaWYgKCFzZXJ2aWNlUHJvamVjdC5leGlzdHMoKSkgICAgICAgIAotICAgICAgewotICAgICAgICBTdHJpbmcgcnVudGltZUxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZUxhYmVsQnlJZChydW50aW1lSWQpOwotICAgICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0VSUk9SX05PX1NFUlZFUl9SVU5USU1FLCBuZXcgU3RyaW5nW117IHJ1bnRpbWVMYWJlbCB9ICkgKTsKLSAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCi0gICAgICAgIFJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lQnlJZChydW50aW1lSWQpOwotICAgICAgICBpZiAoZGVzYy5nZXRTZXJ2ZXJSZXF1aXJlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19OT19TRVJWRVIsIG5ldyBTdHJpbmdbXSB7IHNjZW5hcmlvIH0pKTsKLSAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIE5vIHNlcnZlciBoYXMgYmVlbiBzZWxlY3RlZCBhbmQgdGhlIHNlbGVjdGVkIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICAgICAgICAvLyBkb2VzIG5vdCByZXF1aXJlIGEgc2VydmVyLiBTZXQgZGVwbG95LCBpbnN0YWxsLCBydW4sIGFuZCB0ZXN0IHRvIGZhbHNlLgotICAgICAgICAgIGRlcGxveVNlcnZpY2VfID0gZmFsc2U7Ci0gICAgICAgICAgaW5zdGFsbFNlcnZpY2UgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICAgIHN0YXJ0U2VydmljZSA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgdGVzdFNlcnZpY2UgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vSWYgdGhlIHNlcnZlciBpcyBub24tbnVsbCwgZW5zdXJlIHRoZSBzZXJ2ZXIsIHJ1bnRpbWUsIGFuZCB0eXBlIGFyZSBjb21wYXRpYmxlCi0gICAgaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGlmICghV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuaXNTZXJ2ZXJSdW50aW1lVHlwZVN1cHBvcnRlZChzZXJ2ZXJJZCwgcnVudGltZUlkLCB0eXBlSWQpKQotICAgICAgewotICAgICAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2ZXJMYWJlbEJ5SWQoc2VydmVySWQpOwotICAgICAgICBTdHJpbmcgcnVudGltZUxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZUxhYmVsQnlJZChydW50aW1lSWQpOwotICAgICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlMsIG5ldyBTdHJpbmdbXSB7IHNlcnZlckxhYmVsLAotICAgICAgICAgICAgcnVudGltZUxhYmVsIH0pKTsKLSAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgfQotCi0gICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIHNlbGVjdGVkIHNlcnZlciB0eXBlIGhhcyBvbmx5IHN0dWIgcnVudGltZXMgYXNzb2NpYXRlZAotICAgICAgLy8gd2l0aCBpdC4KLSAgICAgIC8vIElmIHNvLCBzZXQgaW5zdGFsbCwgcnVuLCBhbmQgdGVzdCB0byBmYWxzZSBpbiB0aGUgY29udGV4dC4KLSAgICAgIElSdW50aW1lIG5vblN0dWJSdW50aW1lID0gU2VydmVyVXRpbHMuZ2V0Tm9uU3R1YlJ1bnRpbWUoc2VydmVySWQpOwotICAgICAgaWYgKG5vblN0dWJSdW50aW1lID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGluc3RhbGxTZXJ2aWNlID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgc3RhcnRTZXJ2aWNlID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgdGVzdFNlcnZpY2UgPSBCb29sZWFuLkZBTFNFOwotICAgICAgfQotICAgIH0KLQotCS8vIGNhbGN1bGF0ZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSBjbGllbnRSdW50aW1lSWQgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncy4KLQlzZXJ2aWNlUnVudGltZUlkXyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZpY2VSdW50aW1lSWQoIHNlcnZpY2VJZHNfLCBzZXJ2aWNlUHJvamVjdE5hbWVfLCBzZXJ2aWNlQ29tcG9uZW50VHlwZV8pOyAgIAotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDFjZGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5FeHRlbnNpb25GcmFnbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQgZXh0ZW5kcyBFeHRlbnNpb25GcmFnbWVudAoteyAgCi0gIHB1YmxpYyBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCgpCi0gIHsKLQotICB9Ci0gIAotICBwcm90ZWN0ZWQgU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQoIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIHNldEV4dGVuc2lvbklkcyggbmV3IFN0cmluZ1tdeyBpZHMuZ2V0VHlwZUlkKCksIGlkcy5nZXRSdW50aW1lSWQoKSwgaWRzLmdldFNlcnZlcklkKCkgfSApOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IFNlcnZlckV4dGVuc2lvbkZyYWdtZW50KCB0aGlzICk7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDg0ZjAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLQotcHVibGljIGNsYXNzIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICAvL3ByaXZhdGUgU3RyaW5nICAgICAgICAgICAgd3NkbFVSSV87Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd3NkbFBhcnNlcl87Ci0JcHJpdmF0ZSBJV2ViU2VydmljZSAJCQl3ZWJTZXJ2aWNlXzsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyA9IGZhbHNlOwotICAgIAotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbFVSSS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gd2ViU2VydmljZV8uZ2V0V2ViU2VydmljZUluZm8oKS5nZXRXc2RsVVJMKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzZGxVUkkKLSAgICogICAgICAgICAgICBUaGUgd3NkbFVSSSB0byBzZXQuCi0gICAqLwotCS8qCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB3c2RsVVJJXyA9IHdzZGxVUkk7Ci0gIH0KLSAgKi8KLQkKLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlIHdzKQotCXsKLQkJd2ViU2VydmljZV8gPSB3czsKLQl9Ci0JCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxQYXJzZXJfLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIGlmKCB3c2RsUGFyc2VyXyA9PSBudWxsICkKLSAgICB7Ci0gICAgICB3c2RsUGFyc2VyXyA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOyAgCi0gICAgfQotICAgIAotICAgIHJldHVybiB3c2RsUGFyc2VyXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdzZGxQYXJzZXJfIFRoZSB3c2RsUGFyc2VyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3c2RsUGFyc2VyXykKLSAgewotICAgIHRoaXMud3NkbFBhcnNlcl8gPSB3c2RsUGFyc2VyXzsKLSAgfQotLyoqCi0gKiBAcGFyYW0gZWFyUHJvamVjdE5hbWUgVGhlIGVhclByb2plY3ROYW1lIHRvIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdE5hbWUoU3RyaW5nIGVhclByb2plY3ROYW1lKSB7Ci19Ci0vKioKLSAqIEBwYXJhbSBleGlzdGluZ1NlcnZlcklkIFRoZSBleGlzdGluZ1NlcnZlcklkIHRvIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXJJZChTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZCkgewotfQotCi0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNSZXN0YXJ0UHJvamVjdE5lZWRlZC4KLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCgpIHsKLQlyZXR1cm4gaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF87Ci19Ci0vKioKLSAqIEBwYXJhbSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkIFRoZSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkIHRvIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZChib29sZWFuIGlzUmVzdGFydFByb2plY3ROZWVkZWQpIHsKLQl0aGlzLmlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfID0gaXNSZXN0YXJ0UHJvamVjdE5lZWRlZDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlU2VydmVyRmFjdG9yeUlkKCkKLXsKLQlyZXR1cm4gd2ViU2VydmljZV8uZ2V0V2ViU2VydmljZUluZm8oKS5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlU2VydmVySW5zdGFuY2VJZCgpCi17Ci0JcmV0dXJuIHdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpOwotfQotCi1wdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi17Ci0gIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9BYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9BYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDVjOTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxMCAgIDEzNTQ0MSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQyMCAgIDEzNTkxMiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciBpbXBsZW1lbnRzIElPYmplY3RTZWxlY3Rpb25XaWRnZXQKLXsKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgLy8gc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gIH0KLQotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIC8vIHN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgLy8gIHN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0KLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gICAgLy8gIHN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAgcHVibGljICBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uRGlzcGxheWFibGVTdHJpbmcoKQotICAgewotCSAgICAvLyAgc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0JICByZXR1cm4gIiI7Ci0gICB9Ci0gICAKLSAgIHB1YmxpYyBQb2ludCBnZXRXaWRnZXRTaXplKCkKLSAgIHsKLSAgICAgIC8vIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHdpdGggYW4gYXBwcm9wcmlhdGUgZGVmYXVsdCBkaWFsb2cgc2l6ZSBmb3IgdGhpcyB3aWRnZXQJICAKLSAJICByZXR1cm4gbnVsbDsgIAotICAgfQotICAgCi0gICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgcykgewotICAgIC8vIHN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotCXJldHVybiB0cnVlOwotICAgIH0gIAotICB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDZmYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExNiAgIDE1OTYxOCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgUHJvamVjdCBhbmQgRUFSIG5vdCBkZWZhdWx0ZWQgcHJvcGVybHkgd2hlbiB3aXphcmQgbGF1bmNoZWQgZnJvbSBKU1ItMTA5IFdlYiBzZXJ2aWNlcyBicmFuY2ggaW4gSjJFRSBQcm9qZWN0IEV4cGxvcmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgRUpCU2VsZWN0aW9uVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotCi0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWwgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZhbHVlKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCgoRW50ZXJwcmlzZUJlYW4pc2VsKS5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgU2VydmljZUltcGxCZWFuKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0QmVhbk5hbWUoKFNlcnZpY2VJbXBsQmVhbikgc2VsKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBFSkJMaW5rKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0QmVhbk5hbWUoKEVKQkxpbmspIHNlbCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEJlYW5OYW1lKFNlcnZpY2VJbXBsQmVhbiBiZWFuKSB7Ci0JICBFT2JqZWN0IGVPYmplY3QgPSBiZWFuLmVDb250YWluZXIoKTsKLQkgIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgUG9ydENvbXBvbmVudCkgewotCQkgIFBvcnRDb21wb25lbnQgcGMgPSAoUG9ydENvbXBvbmVudCkgZU9iamVjdDsKLQkJICByZXR1cm4gcGMuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsJICAgICAgCQotCSAgfQotCSAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRCZWFuTmFtZShFSkJMaW5rIGxpbmspIHsKLQkgIEVPYmplY3QgZU9iamVjdCA9IGxpbmsuZUNvbnRhaW5lcigpOwotCSAgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbEJlYW4pCi0JCSAgcmV0dXJuIGdldEJlYW5OYW1lKChTZXJ2aWNlSW1wbEJlYW4pIGVPYmplY3QpOwotCSAgcmV0dXJuICIiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3YjJkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDMyOSAgIDEyODA2OSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDE4ICAgMTM2MTgwIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDUyNCAgIDE0MTE5NCBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDgyNSAgIDEzNTU3MCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgU2VydmljZSBpbXBsZW1lbnRhdGlvbiBVUkwgbm90IGRpc3BsYXllZCBwcm9wZXJseSBvbiBmaXJzdCBwYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuY29tcG9uZW50Y29yZS51dGlsLkVKQkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgRUpCU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQgaW1wbGVtZW50cyBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci17Ci0KLSAgcHJpdmF0ZSBDb21ibyBlYXJMaXN0OwotICBwcml2YXRlIEVKQlRhYmxlVmlld2VyIGJlYW5MaXN0OwotICBwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50W10gZWFyQ29tcG9uZW50czsKLSAgcHJpdmF0ZSBJbnRlZ2VyIHNlbGVjdGVkQmVhbkluZGV4ID0gbnVsbDsKLSAgcHJpdmF0ZSBWZWN0b3IgZWpiQmVhbk5hbWVzOwotICBwcml2YXRlIFZlY3RvciBlamJDb21wb25lbnROYW1lczsKLSAgcHJpdmF0ZSBWZWN0b3IgZWpiQ29tcG9uZW50UHJvamVjdE5hbWVzOwotICBwcml2YXRlIEhhc2h0YWJsZSBlamJWYWx1ZXNCeUVBUlNlbGVjdGlvbkNhY2hlOwotICBwcml2YXRlIExpc3RlbmVyICBzdGF0dXNMaXN0ZW5lcl87Ci0gIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlTdHJpbmdfID0gIiI7Ci0gIC8qIENPTlRFWFRfSUQgUEVCRDAwMDEgZm9yIHRoZSBFQVIgUHJvamVjdHMgZHJvcC1kb3duIGJveCAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BFQkRfRUFSX1BST0pFQ1RTID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5QRUJEMDAwMSI7Ci0gIC8qIENPTlRFWFRfSUQgUEVCRDAwMDIgZm9yIHRoZSB0YWJsZSBjb250YWluaW5nIGFsbCBvZiB0aGUgYmVhbiBuYW1lcyAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BFQkRfVEFCTEVfQkVBTl9OQU1FUyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuUEVCRDAwMDIiOwotCi0gIHB1YmxpYyBFSkJTZWxlY3Rpb25XaWRnZXQoKQotICB7Ci0JZWFyQ29tcG9uZW50cyA9IEoyRUVVdGlscy5nZXRBbGxFQVJDb21wb25lbnRzKCk7Ci0gICAgZWpiVmFsdWVzQnlFQVJTZWxlY3Rpb25DYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRCZWFuKCkKLSAgewotICAgIGlmIChzZWxlY3RlZEJlYW5JbmRleCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKSAoZWpiQmVhbk5hbWVzLmVsZW1lbnRBdChzZWxlY3RlZEJlYW5JbmRleC5pbnRWYWx1ZSgpKSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFByb2plY3QoKQotICB7Ci0gICAgaWYgKHNlbGVjdGVkQmVhbkluZGV4ICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChTdHJpbmcpIChlamJDb21wb25lbnRQcm9qZWN0TmFtZXMuZWxlbWVudEF0KHNlbGVjdGVkQmVhbkluZGV4LmludFZhbHVlKCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIHN0YXR1c0xpc3RlbmVyXyAgPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICBVSVV0aWxzIHV0aWxzID0gbmV3IFVJVXRpbHMoSU5GT1BPUF9QRUJEX0VBUl9QUk9KRUNUUyk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEsIDAsIDApOwotICAgIAotICAgIENvbXBvc2l0ZSBwcm9qZWN0Q29tcG9zaXRlID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSwgMik7Ci0gICAgbmV3IExhYmVsKHByb2plY3RDb21wb3NpdGUsIFNXVC5OVUxMKS5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9FQVJfUFJPSkVDVFMpOwotICAgIGVhckxpc3QgPSBuZXcgQ29tYm8ocHJvamVjdENvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIGVhckxpc3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgZWFyTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KQotICAgICAgewotICAgICAgICBDb21ibyB3aWRnZXQgPSAoQ29tYm8pIChldnQud2lkZ2V0KTsKLSAgICAgICAgaW50IGVhckxpc3RTZWxlY3Rpb25JbmRleCA9IHdpZGdldC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpZiAoZWFyTGlzdFNlbGVjdGlvbkluZGV4ID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHNldEJlYW5MaXN0KGVhckNvbXBvbmVudHNbZWFyTGlzdFNlbGVjdGlvbkluZGV4LTFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRCZWFuTGlzdChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBzZWxlY3RlZEJlYW5JbmRleCA9IG51bGw7Ci0gICAgICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBhZGRFQVJOYW1lc1RvTGlzdCgpOwotICAgIGVhckxpc3Quc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfRUFSX1BST0pFQ1RTKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVhckxpc3QsIElORk9QT1BfUEVCRF9FQVJfUFJPSkVDVFMpOwotICAgIAotICAgIEdyb3VwIGJlYW5Db21wb3NpdGUgPSB1dGlscy5jcmVhdGVHcm91cChjb21wb3NpdGUsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9FSkJfQkVBTl9OQU1FLCAiIiwgIiIpOwotICAgIGJlYW5MaXN0ID0gbmV3IEVKQlRhYmxlVmlld2VyKGJlYW5Db21wb3NpdGUpOyAgICAKLSAgICBUYWJsZSBiZWFuVGFibGUgPSBiZWFuTGlzdC5nZXRUYWJsZSgpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotICAgIGdkLmhlaWdodEhpbnQgPSAxMDA7Ci0gICAgYmVhblRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIGJlYW5UYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KQotICAgICAgewotICAgICAgICBUYWJsZSB0YWJsZSA9IChUYWJsZSkgKGV2dC53aWRnZXQpOwotICAgICAgICBzZWxlY3RlZEJlYW5JbmRleCA9IG5ldyBJbnRlZ2VyKHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgICAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYmVhblRhYmxlLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1RBQkxFX0JFQU5fTkFNRVMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYmVhblRhYmxlLCBJTkZPUE9QX1BFQkRfVEFCTEVfQkVBTl9OQU1FUyk7Ci0gICAgCi0gICAgaWYgKGVhckNvbXBvbmVudHMgIT0gbnVsbCAmJiBlYXJDb21wb25lbnRzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgc2V0QmVhbkxpc3QoZWFyQ29tcG9uZW50c1swXSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRCZWFuTGlzdChudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gVGhpcyBpcyBhIGR1bW15IGxhYmVsIHRoYXQgZm9yY2VzIHRoZSBzdGF0dXMgbGFiZWwgaW50byB0aGUgc2Vjb25kCi0gICAgLy8gY29sdW1uLgotICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OVUxMKS5zZXRUZXh0KCIiKTsKLSAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgCi0gIAotICBwcml2YXRlIHZvaWQgYWRkRUFSTmFtZXNUb0xpc3QoKQotICB7Ci0gICAgZWFyTGlzdC5hZGQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1NIT1dfQUxMX1NUQVRFTEVTU19TRVNTSU9OX0VKQlMpOwotICAgIGlmIChlYXJDb21wb25lbnRzICE9IG51bGwgJiYgZWFyQ29tcG9uZW50cy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlYXJDb21wb25lbnRzLmxlbmd0aDsgaW5kZXgrKykKLSAgICAgIHsKLSAgICAgICAgZWFyTGlzdC5hZGQoZWFyQ29tcG9uZW50c1tpbmRleF0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGVhckxpc3Quc2V0VGV4dChlYXJMaXN0LmdldEl0ZW0oMSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRCZWFuTGlzdChJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpCi0gIHsgICAgCi0gICAgU3RyaW5nIGNhY2hlS2V5ID0gKGVhckNvbXBvbmVudCA9PSBudWxsKT8gZWFyTGlzdC5nZXRJdGVtKDApOiBlYXJDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgIAotICAgIC8vQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSBjYWNoZWQgcmVzdWx0cyBmb3IgdGhpcyBjYXNlLiBJZiBzbywgdXNlIHRoZQotICAgIC8vY2FjaGVkIHZhbHVlcyBhbmQgcmV0dXJuLiBJZiBub3QsIGNvbnRpbnVlLgotICAgIEVKQlRhYmxlVmFsdWVzIGNhY2hlZFZhbHVlcyA9IChFSkJUYWJsZVZhbHVlcyllamJWYWx1ZXNCeUVBUlNlbGVjdGlvbkNhY2hlLmdldChjYWNoZUtleSk7Ci0gICAgaWYgKGNhY2hlZFZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGVqYkJlYW5OYW1lcyA9IGNhY2hlZFZhbHVlcy5jYWNoZWRFamJCZWFuTmFtZXM7Ci0gICAgICBlamJDb21wb25lbnROYW1lcyA9IGNhY2hlZFZhbHVlcy5jYWNoZWRFamJDb21wb25lbnROYW1lczsKLSAgICAgIGVqYkNvbXBvbmVudFByb2plY3ROYW1lcyA9IGNhY2hlZFZhbHVlcy5jYWNoZGVkRWpiQ29tcG9uZW50UHJvamVjdE5hbWVzOwotICAgICAgYmVhbkxpc3Quc2V0RGF0YShlamJCZWFuTmFtZXMsIGVqYkNvbXBvbmVudE5hbWVzKTsKLSAgICAgIGJlYW5MaXN0LnNldElucHV0KGVqYkJlYW5OYW1lcyk7ICAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBJVmlydHVhbENvbXBvbmVudFtdIGVqYkNvbXBvbmVudHNBcnJheSA9IG51bGw7Ci0gICAgaWYgKGVhckNvbXBvbmVudCA9PSBudWxsKQotICAgIHsgIAotICAgICAgZWpiQ29tcG9uZW50c0FycmF5ID0gSjJFRVV0aWxzLmdldEFsbEVKQkNvbXBvbmVudHMoKTsgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVqYkNvbXBvbmVudHNBcnJheSA9IEoyRUVVdGlscy5nZXRSZWZlcmVuY2luZ0VKQkNvbXBvbmVudHNGcm9tRUFSKGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotICAgIH0KLSAgICAKLSAgICBUYWJsZSBiZWFuVGFibGUgPSBiZWFuTGlzdC5nZXRUYWJsZSgpOwotICAgIGJlYW5UYWJsZS5yZW1vdmVBbGwoKTsKLSAgICBlamJCZWFuTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZWpiQ29tcG9uZW50TmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZWpiQ29tcG9uZW50UHJvamVjdE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlamJDb21wb25lbnRzQXJyYXkubGVuZ3RoOyBpbmRleCsrKQotICAgIHsKLSAgICAgIEVKQkFydGlmYWN0RWRpdCAgZWpiRWRpdCA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBlamJFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiQ29tcG9uZW50c0FycmF5W2luZGV4XSk7Ci0gICAgICAgIEVKQlJlc291cmNlIGVqYlJlcyA9IGVqYkVkaXQuZ2V0RUpCSmFyWG1pUmVzb3VyY2UoKTsKLSAgICAgICAgRUpCSmFyIGphciA9IGVqYlJlcy5nZXRFSkJKYXIoKTsKLSAgICAgICAgVmVjdG9yIGJlYW5zID0gSjJFRVV0aWxzLmdldEJlYW5OYW1lcyhqYXIpOwotICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGVqYkNvbXBvbmVudHNBcnJheVtpbmRleF0uZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBlamJDb21wb25lbnRzQXJyYXlbaW5kZXhdLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0gICAgICAgIGVqYkJlYW5OYW1lcy5hZGRBbGwoYmVhbnMpOwotICAgICAgICBlamJDb21wb25lbnROYW1lcy5hZGRBbGwoQ29sbGVjdGlvbnMubkNvcGllcyhiZWFucy5zaXplKCksIGNvbXBvbmVudE5hbWUpKTsKLSAgICAgICAgZWpiQ29tcG9uZW50UHJvamVjdE5hbWVzLmFkZEFsbChDb2xsZWN0aW9ucy5uQ29waWVzKGJlYW5zLnNpemUoKSwgcHJvamVjdE5hbWUpKTsgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBmaW5hbGx5IHsKLSAgICAgICAgaWYgKGVqYkVkaXQhPW51bGwpCi0gICAgICAgICAgZWpiRWRpdC5kaXNwb3NlKCk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIGJlYW5MaXN0LnNldERhdGEoZWpiQmVhbk5hbWVzLCBlamJDb21wb25lbnROYW1lcyk7Ci0gICAgYmVhbkxpc3Quc2V0SW5wdXQoZWpiQmVhbk5hbWVzKTsKLSAgICAKLSAgICAvL0NhY2hlIHRoZSByZXN1bHRzIGZvciBuZXh0IHRpbWUKLSAgICBFSkJUYWJsZVZhbHVlcyBlamJUYWJsZVZhbHVlcyA9IG5ldyBFSkJUYWJsZVZhbHVlcygpOwotICAgIGVqYlRhYmxlVmFsdWVzLmNhY2hlZEVqYkJlYW5OYW1lcyA9IGVqYkJlYW5OYW1lczsKLSAgICBlamJUYWJsZVZhbHVlcy5jYWNoZWRFamJDb21wb25lbnROYW1lcyA9IGVqYkNvbXBvbmVudE5hbWVzOwotICAgIGVqYlRhYmxlVmFsdWVzLmNhY2hkZWRFamJDb21wb25lbnRQcm9qZWN0TmFtZXMgPSBlamJDb21wb25lbnRQcm9qZWN0TmFtZXM7Ci0gICAgZWpiVmFsdWVzQnlFQVJTZWxlY3Rpb25DYWNoZS5wdXQoY2FjaGVLZXksIGVqYlRhYmxlVmFsdWVzKTsgICAgICAgIAotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgIWluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlc3Npb24pCi0gICAgICB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKSBvYmplY3Q7Ci0gICAgICAgIEVKQkphciBqYXIgPSBzZXNzaW9uLmdldEVqYkphcigpOwotICAgICAgICBpZiAoamFyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVhckNvbXBvbmVudHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotCQkJICAgICAgSVZpcnR1YWxDb21wb25lbnRbXSBlamJDb21wb25lbnRzID0gSjJFRVV0aWxzLmdldFJlZmVyZW5jaW5nRUpCQ29tcG9uZW50c0Zyb21FQVIoZWFyQ29tcG9uZW50c1tpXS5nZXRQcm9qZWN0KCkpOwotCQkJICAgICAgZm9yIChpbnQgaj0wOyBqIDxlamJDb21wb25lbnRzLmxlbmd0aDsgaisrKQotCQkJICAgICAgewotICAgICAgICAgICAgICBFSkJBcnRpZmFjdEVkaXQgIGVqYkVkaXQgPSBudWxsOwotICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVqYkVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChlamJDb21wb25lbnRzW2pdKTsKLSAgICAgICAgICAgICAgICBFSkJSZXNvdXJjZSBlamJSZXMgPSBlamJFZGl0LmdldEVKQkphclhtaVJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVqYlJlcy5nZXRFSkJKYXIoKSA9PSBqYXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZWFyTGlzdC5zZXRUZXh0KGVhckNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgIHNldEJlYW5MaXN0KGVhckNvbXBvbmVudHNbaV0pOwotICAgICAgICAgICAgICAgICAgYmVhbkxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoZWpiQmVhbk5hbWVzLmluZGV4T2Yoc2Vzc2lvbi5nZXROYW1lKCkpKX0pKTsKLSAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQmVhbkluZGV4ID0gbmV3IEludGVnZXIoZWpiQmVhbk5hbWVzLmluZGV4T2Yoc2Vzc2lvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVqYkVkaXQhPW51bGwpCi0gICAgICAgICAgICAgICAgICBlamJFZGl0LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgfQotCQkJCQotCQkJICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvL0hhdmVuJ3QgcmV0dXJuZWQgeWV0IHNvIHdlIGRpZCBub3QgZmluZCBhbiBFQVIgdGhhdCBjb250YWlucyB0aGlzIEVKQi4gSW5pdGlhbGl6ZSB0aGUgcGFnZSBhY2NvcmRpbmdseS4KLSAgICAgICAgICBlYXJMaXN0LnNldFRleHQoZWFyTGlzdC5nZXRJdGVtKDApKTsKLSAgICAgICAgICBzZXRCZWFuTGlzdChudWxsKTsKLSAgICAgICAgICBiZWFuTGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IEludGVnZXJbXXtuZXcgSW50ZWdlcihlamJCZWFuTmFtZXMuaW5kZXhPZihzZXNzaW9uLmdldE5hbWUoKSkpfSkpOwotICAgICAgICAgIHNlbGVjdGVkQmVhbkluZGV4ID0gbmV3IEludGVnZXIoZWpiQmVhbk5hbWVzLmluZGV4T2Yoc2Vzc2lvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgIAkgIGRpc3BsYXlTdHJpbmdfID0gKFN0cmluZykgb2JqZWN0OyAvLyBzYXZlIGZvciBkaXNwbGF5IHVzZQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0JICBTdHJpbmcgc2VsRUpCTmFtZSA9IChTdHJpbmcpIGVqYkJlYW5OYW1lcy5nZXQoc2VsZWN0ZWRCZWFuSW5kZXguaW50VmFsdWUoKSk7Ci0JICBpZiAoc2VsRUpCTmFtZSAhPSBudWxsKQotCSAgewotCQkgIC8vR2V0IHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIGJlYW4gdG8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIFNlc3Npb24gb2JqZWN0LgotCQkgIC8vVGhlbiByZXR1cm4gdGhlIFNlc3Npb24gb2JqZWN0IGluIGFuIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLgotCQkgIFN0cmluZyBlamJDb21wb25lbnROYW1lID0gKFN0cmluZykgZWpiQ29tcG9uZW50TmFtZXMuZ2V0KHNlbGVjdGVkQmVhbkluZGV4LmludFZhbHVlKCkpOwotCQkgIElWaXJ0dWFsQ29tcG9uZW50IGVqYkNvbXBvbmVudCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRDb21wb25lbnQoZWpiQ29tcG9uZW50TmFtZSk7Ci0JCSAgRUpCQXJ0aWZhY3RFZGl0ICBlamJFZGl0ID0gbnVsbDsKLQkJICB0cnkgCi0JCSAgewotCQkJICBlamJFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiQ29tcG9uZW50KTsKLQkJCSAgRUpCUmVzb3VyY2UgZWpiUmVzID0gZWpiRWRpdC5nZXRFSkJKYXJYbWlSZXNvdXJjZSgpOwotCQkJICBFSkJKYXIgamFyID0gZWpiUmVzLmdldEVKQkphcigpOwotCQkJICBqYXZhLnV0aWwuTGlzdCBzZXNzaW9ucyA9IGphci5nZXRTZXNzaW9uQmVhbnMoKTsKLQkJCSAgZm9yIChJdGVyYXRvciBpdDIgPSBzZXNzaW9ucy5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLQkJCSAgewotCQkJCSAgU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pIGl0Mi5uZXh0KCk7Ci0JCQkJICBpZiAoc2VsRUpCTmFtZS5lcXVhbHMoc2Vzc2lvbi5nZXROYW1lKCkpKQotCQkJCSAgewotCQkJCQkgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgU2Vzc2lvbltde3Nlc3Npb259KTsKLQkJCQkgIH0KLQkJCSAgfQotCQkgIH0KLQkJICBmaW5hbGx5IHsKLQkJCSAgaWYgKGVqYkVkaXQhPW51bGwpCi0JCQkJICBlamJFZGl0LmRpc3Bvc2UoKTsKLQkJICB9Ci0JICB9Ci0JICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFswXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFNlbGVjdGVkUHJvamVjdCgpOwotICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgaWYgKHNlbGVjdGVkQmVhbkluZGV4ICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChTdHJpbmcpIChlamJDb21wb25lbnROYW1lcy5lbGVtZW50QXQoc2VsZWN0ZWRCZWFuSW5kZXguaW50VmFsdWUoKSkpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgICAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uRGlzcGxheWFibGVTdHJpbmcoKSB7Ci0JICAKLQkgIGlmIChlamJCZWFuTmFtZXMgPT0gbnVsbCkKLQkJICByZXR1cm4gZGlzcGxheVN0cmluZ187Ci0JICAKLQkgIGludCBpbmRleCA9IHNlbGVjdGVkQmVhbkluZGV4ID09IG51bGwgPyAwIDogc2VsZWN0ZWRCZWFuSW5kZXguaW50VmFsdWUoKTsKLQkgIFN0cmluZyBiZWFuID0gKFN0cmluZykgZWpiQmVhbk5hbWVzLmdldChpbmRleCk7Ci0JICByZXR1cm4gYmVhbiA9PSBudWxsID8gZGlzcGxheVN0cmluZ18gOiBiZWFuOwotICB9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgeyAgCQotICAgIGlmIChzZWxlY3RlZEJlYW5JbmRleCA9PSBudWxsKQotICAgIHsKLSAgICAJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCAiIiApOwotICAgIH0KLSAgICAKLSAgCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0V2lkZ2V0U2l6ZSgpIHsKLQlyZXR1cm4gbmV3IFBvaW50KDQ1MCwgMzUwKTsKLSAgfSAKLSAgICAKLSAgcHJpdmF0ZSBjbGFzcyBFSkJUYWJsZVZhbHVlcwotICB7Ci0gICAgVmVjdG9yIGNhY2hlZEVqYkJlYW5OYW1lczsKLSAgICBWZWN0b3IgY2FjaGVkRWpiQ29tcG9uZW50TmFtZXM7Ci0gICAgVmVjdG9yIGNhY2hkZWRFamJDb21wb25lbnRQcm9qZWN0TmFtZXM7IAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJUYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTViNGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvRUpCVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MjQgICAxNDExOTQgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLQotcHVibGljIGNsYXNzIEVKQlRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIKLXsKLSAgcHJpdmF0ZSBWZWN0b3IgYmVhbk5hbWVzOwotICBwcml2YXRlIFZlY3RvciBwcm9qZWN0TmFtZXM7Ci0KLSAgcHVibGljIEVKQlRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAKLSAgICBTdHJpbmcgY29sdW1uUHJvcGVydGllc1tdID0ge0NvbnN1bXB0aW9uVUlNZXNzYWdlcy5UQUJMRV9USVRMRV9FSkJfQkVBTl9OQU1FUywgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRBQkxFX1RJVExFX0VKQl9QUk9KRUNUX05BTUV9OwotICAgIGludCBjb2x1bW5zV2lkdGhbXSA9IHs2MCwgMjB9OwotICAgIGludCBjb2x1bW5NaW5zW10gPSB7MTc1LCAxMjV9OwotICAgIAotICAgIFRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgaSk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLSAgICAgIGNvbHVtbi5wYWNrKCk7Ci0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YShjb2x1bW5zV2lkdGhbaV0sIGNvbHVtbk1pbnNbaV0sIHRydWUpKTsgICAgICAKLSAgICB9Ci0gICAgdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLSAgICBzZXRDb250ZW50UHJvdmlkZXIobmV3IEVKQkNvbnRlbnRQcm92aWRlcigpKTsKLSAgICBzZXRMYWJlbFByb3ZpZGVyKG5ldyBFSkJMYWJlbFByb3ZpZGVyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREYXRhKFZlY3RvciBiZWFuTmFtZXMsIFZlY3RvciBwcm9qZWN0TmFtZXMpCi0gIHsKLSAgICB0aGlzLmJlYW5OYW1lcyA9IGJlYW5OYW1lczsKLSAgICB0aGlzLnByb2plY3ROYW1lcyA9IHByb2plY3ROYW1lczsKLSAgfQotICBwcml2YXRlIGNsYXNzIEVKQkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgewotICAgICAgICBpbnQgaW5kZXggPSAoKEludGVnZXIpIG9iamVjdCkuaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKFN0cmluZykgKGJlYW5OYW1lcy5lbGVtZW50QXQoaW5kZXgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChTdHJpbmcpIChwcm9qZWN0TmFtZXMuZWxlbWVudEF0KGluZGV4KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLSAgcHVibGljIGNsYXNzIEVKQkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGJlYW5OYW1lcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgc2l6ZSA9IGJlYW5OYW1lcy5zaXplKCk7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0W2luZGV4XSA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkLCBPYmplY3QgbmV3b2JqKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0hhbmRsZXJUYWJsZUl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSGFuZGxlclRhYmxlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2JlNmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSGFuZGxlclRhYmxlSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLQotCi0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyVGFibGVJdGVtIHsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGhhbmRsZXJDbGFzc05hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGhhbmRsZXJOYW1lOwotICBwcml2YXRlIFN0cmluZyBwb3J0TmFtZTsKLSAgcHJpdmF0ZSBpbnQgaW5kZXg7Ci0gIAotICBwcml2YXRlIFBvcnRDb21wb25lbnQgcG9ydDsKLSAgcHJpdmF0ZSBPYmplY3QgaGFuZGxlcjsKLSAgcHJpdmF0ZSBPYmplY3Qgd3NEZXNjUmVmOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJDbGFzc05hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJDbGFzc05hbWUoKSB7Ci0gICAgcmV0dXJuIGhhbmRsZXJDbGFzc05hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3NOYW1lIFRoZSBoYW5kbGVyQ2xhc3NOYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDbGFzc05hbWUoU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUpIHsKLSAgICB0aGlzLmhhbmRsZXJDbGFzc05hbWUgPSBoYW5kbGVyQ2xhc3NOYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJOYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIYW5kbGVyTmFtZSgpIHsKLSAgICByZXR1cm4gaGFuZGxlck5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBoYW5kbGVyTmFtZSBUaGUgaGFuZGxlck5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIGhhbmRsZXJOYW1lKSB7Ci0gICAgdGhpcy5oYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBvcnQuCi0gICAqLwotICBwdWJsaWMgUG9ydENvbXBvbmVudCBnZXRQb3J0KCkgewotICAgIHJldHVybiBwb3J0OwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0KFBvcnRDb21wb25lbnQgcG9ydCkgewotICAgIHRoaXMucG9ydCA9IHBvcnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0SGFuZGxlcigpIHsKLSAgICByZXR1cm4gaGFuZGxlcjsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihPYmplY3QgaGFuZGxlcikgewotICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9ydE5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgIHJldHVybiBwb3J0TmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHBvcnROYW1lIFRoZSBwb3J0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpbmRleC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgewotICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c0Rlc2NSZWYuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFdzRGVzY1JlZigpIHsKLSAgICByZXR1cm4gd3NEZXNjUmVmOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd3NEZXNjUmVmIFRoZSB3c0Rlc2NSZWYgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NEZXNjUmVmKE9iamVjdCB3c0Rlc2NSZWYpIHsKLSAgICB0aGlzLndzRGVzY1JlZiA9IHdzRGVzY1JlZjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9JT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0lPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4MGMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0lPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxMCAgIDEzNTQ0MSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQyMCAgIDEzNTkxMiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgZXh0cmEgbWV0aG9kcyB0aGF0IE9iamVjdCBTZWxlY3Rpb24gV2lkZ2V0cwotICogbmVlZCB0byBpbXBsZW1lbnQuICBPYmplY3QgU2VsZWN0aW9uIFdpZGdldHMgYXJlIGRpc3BsYXllZCBvbiBwYWdlIDIKLSAqIG9mIHRoZSBXZWIgc2VydmljZXMgd2l6YXJkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgLyoqCi0gICAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICogdmFsdWUgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gdGhlIGluaXRpYWwgc2VsZWN0aW9uIHRoZSB1c2VyIHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbik7Ci0gIAotICAvKioKLSAgICogVGhlIGludGVudCBvZiB0aGUgT2JqZWN0IFNlbGVjdGlvbiBXaWRnZXQgaXMgdGhhdCB0aGUgdXNlciBoYXMKLSAgICogdGhlIG9wcG9ydHVuaXR5IGNoYW5nZS9maW5kIHRoZSBvYmplY3QgdGhhdCB0aGV5IHdhbnQgdG8gdHVybiBpbnRvCi0gICAqIGEgV2ViIHNlcnZpY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGFuIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdCB0aGF0IHRoZSB1c2VyCi0gICAqIHdhbnQgdG8gdHVybiBpbnRvIGEgV2ViIHNlcnZpY2UuICBUaGlzIG9iamVjdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4KLSAgICogdGhlIGluaXRpYWxTZWxlY3Rpb24gcGFzc2VkIGluIGJ5IHRoZSBzZXRJbml0aWFsU2VsZWN0aW9uIG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKTsKLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgb2JqZWN0U2VsZWN0aW9uIHBhcmFtZXRlciBpcyB2YWxpZCBmb3IKLSAgICogdGhpcyBPYmplY3Qgc2VsZWN0aW9uIHdpZGdldC4gIEFuIGVycm9yIHN0YXR1cyBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICogaWYgdGhpcyBvYmplY3QgaXMgbm90IHZhbHVlLiAgT3RoZXJ3aXNlLCBhbmQgb2sgc3RhdHVzIHNob3VsZCBiZQotICAgKiByZXR1cm5lZAotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdFNlbGVjdGlvbiB0aGUgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZC4KLSAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBJUHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3Rpb24KLSAgICogb2JqZWN0IHRoYXQgdGhlIHVzZXIgaGFzIGNob3NlbiB3aXRoIHRoaXMgd2lkZ2V0LiAgVGhlIHZhbHVlIGNhbiBiZSAKLSAgICogbnVsbCBpZiB0aGVyZSBpcyBubyBJUHJvamVjdCBmb3IgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIElWaXJ0dWFsQ29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGlvbgotICAgKiBvYmplY3QgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIHdpdGggdGhpcyB3aWRnZXQuICBUaGUgdmFsdWUgY2FuIGJlIAotICAgKiBudWxsIGlmIHRoZXJlIGlzIG5vIElWaXJ0dWFsQ29tcG9uZW50IGZvciB0aGlzIG9iamVjdAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgc3RyaW5nIHRvIGRpc3BsYXllZCBpbiB0aGUgVUkgZm9yIHRoZSBzZWxlY3RlZCBvYmplY3QKLSAgICovCi0gIHB1YmxpYyAgU3RyaW5nIGdldE9iamVjdFNlbGVjdGlvbkRpc3BsYXlhYmxlU3RyaW5nKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZGVmYXVsdCBpbml0aWFsIHNpemUgZm9yIHRoZSB3aWRnZXQgdG8gYmUgY2FsbGVkIGZyb20gZ2V0SW5pdGlhbFNpemUgZnJvbSBhbnkgcGFyZW50IGRpYWxvZwotICAgKi8KLSAgcHVibGljIFBvaW50IGdldFdpZGdldFNpemUoKTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHMgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdCBzZWxlY3Rpb24KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgcmVwcmVzZW50cyBhIHZhbGlkIG9iamVjdCBzZWxlY3Rpb24KLSAgICovICAKLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoU3RyaW5nIHMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0phdmFCZWFuU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3NmI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0phdmFCZWFuU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTYgICAxNTk2MTggbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFByb2plY3QgYW5kIEVBUiBub3QgZGVmYXVsdGVkIHByb3Blcmx5IHdoZW4gd2l6YXJkIGxhdW5jaGVkIGZyb20gSlNSLTEwOSBXZWIgc2VydmljZXMgYnJhbmNoIGluIEoyRUUgUHJvamVjdCBFeHBsb3JlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUJlYW5TZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWwgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZhbHVlKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXB1dGVGdWxseVF1YWxpZmllZEphdmFOYW1lKChJRmlsZSlzZWwpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpCi0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZSByZXMgPSAoKElDb21waWxhdGlvblVuaXQpc2VsKS5nZXRSZXNvdXJjZSgpOwotICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXB1dGVGdWxseVF1YWxpZmllZEphdmFOYW1lKChJRmlsZSlyZXMpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldEJlYW5OYW1lKChTZXJ2aWNlSW1wbEJlYW4pIHNlbCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZihzZWwgaW5zdGFuY2VvZiBTZXJ2bGV0TGluaykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldEJlYW5OYW1lKChTZXJ2bGV0TGluaykgc2VsKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVGdWxseVF1YWxpZmllZEphdmFOYW1lKElGaWxlIHJlc291cmNlKQotICB7Ci0gICAgSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgU3RyaW5nIGJhc2VuYW1lID0gcGF0aC5sYXN0U2VnbWVudCgpOwotICAgIFN0cmluZyBiZWFuQ2xhc3MgPSAiIjsKLSAgICBpZiAoYmFzZW5hbWUgIT0gbnVsbCAmJiBiYXNlbmFtZS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nIGJlYW5QYWNrYWdlID0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKHBhdGgpOwotICAgICAgYmVhbkNsYXNzID0gKGJlYW5QYWNrYWdlID09IG51bGwgfHwgYmVhblBhY2thZ2UubGVuZ3RoKCkgPT0gMCA/IGJhc2VuYW1lIDogKGJlYW5QYWNrYWdlICsgIi4iICsgYmFzZW5hbWUpKTsKLSAgICAgIGlmIChiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIikpCi0gICAgICAgIGJlYW5DbGFzcyA9IGJlYW5DbGFzcy5zdWJzdHJpbmcoMCwgYmVhbkNsYXNzLmxhc3RJbmRleE9mKCcuJykpOwotICAgIH0KLSAgICByZXR1cm4gYmVhbkNsYXNzOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRCZWFuTmFtZShTZXJ2aWNlSW1wbEJlYW4gYmVhbikgewotICAgIEVPYmplY3QgZU9iamVjdCA9IGJlYW4uZUNvbnRhaW5lcigpOwotICAgIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgUG9ydENvbXBvbmVudEltcGwpIHsKLSAgICAgIFBvcnRDb21wb25lbnRJbXBsIHBjaSA9IChQb3J0Q29tcG9uZW50SW1wbCkgZU9iamVjdDsKLSAgICAgIHJldHVybiBwY2kuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7CSAgICAgIAkKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRCZWFuTmFtZShTZXJ2bGV0TGluayBsaW5rKSB7ICAgIAotICAgIEVPYmplY3QgZU9iamVjdCA9IGxpbmsuZUNvbnRhaW5lcigpOwotICAgIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgU2VydmljZUltcGxCZWFuKQotICAgICAgcmV0dXJuIGdldEJlYW5OYW1lKChTZXJ2aWNlSW1wbEJlYW4pIGVPYmplY3QpOwotICAgIHJldHVybiAiIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc3YzhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uSmF2YVJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2cuRGlhbG9nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEphdmFCZWFuU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQgaW1wbGVtZW50cyBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci17Ci0gIHByaXZhdGUgSVByb2plY3QgICAgICAgICAgIHNlcnZlclByb2plY3RfID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZV8gPSBudWxsOwotICBwcml2YXRlIENvbXBvc2l0ZSAgICAgICAgICBwYXJlbnRfID0gbnVsbDsKLSAgcHJpdmF0ZSBKYXZhUmVzb3VyY2VGaWx0ZXIgZmlsdGVyXyA9IG5ldyBKYXZhUmVzb3VyY2VGaWx0ZXIoKTsKLSAgcHJpdmF0ZSBJUmVzb3VyY2UgICAgICAgICAgaW5pdGlhbFJlc291cmNlXyA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0gIAotICAvKkNPTlRFWFRfSUQgUEJDTDAwMDEgZm9yIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX1BBR0UgPSAiUEJDTDAwMDEiOwotICAKLSAgcHJpdmF0ZSBUZXh0IGJlYW5DbGFzc1RleHRfOwotICAvKkNPTlRFWFRfSUQgUEJDTDAwMDIgZm9yIHRoZSBCZWFuIFNlbGVjdGlvbiBmaWVsZCBvZiB0aGUgQmVhbiBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEJDTF9URVhUX0JFQU5fQ0xBU1MgPSAiUEJDTDAwMDIiOwotCi0gIHByaXZhdGUgQnV0dG9uIGJlYW5DbGFzc0Jyb3dzZUJ1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMyBmb3IgdGhlIEJlYW4gQ2xhc3MgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgQmVhbiBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0UgPSAiUEJDTDAwMDMiOwotCi0gIHByaXZhdGUgQnV0dG9uIGJlYW5SZXNvdXJjZUJyb3dzZUJ1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwNCBmb3IgdGhlIEJlYW4gUmVzb3VyY2UgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgQmVhbiBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEJDTF9CVVRUT05fQkVBTl9SRVNPVVJDRV9CUk9XU0UgPSAiUEJDTDAwMDQiOwotICAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLQlTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7CSAgCi0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKCBwbHVnaW5JZF8gKTsgCi0gICAgCi0gICAgcGFyZW50XyA9IHBhcmVudDsKLSAgICAKLSAgICBDb21wb3NpdGUgZ3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCA0ICk7Ci0gICAgCi0gICAgZ3JvdXAuc2V0VG9vbFRpcFRleHQoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BCQ0xfUEFHRSApOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGdyb3VwLCBwbHVnaW5JZF8gKyAiLiIgKyBJTkZPUE9QX1BCQ0xfUEFHRSApOwotICAgIAotICAgIGJlYW5DbGFzc1RleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCBncm91cCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0JFQU5fQ0xBU1NfTkFNRSwKLSAgICAJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BCQ0xfVEVYVF9CRUFOX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfVEVYVF9CRUFOX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgYmVhbkNsYXNzVGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIoCi0gICAgICBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVNb2RpZnlCZWFuQ2xhc3NUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIAotICAgIGJlYW5DbGFzc0Jyb3dzZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIGdyb3VwLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX0JST1dTRV9DTEFTU0VTLAotICAgIAkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSApOwotICAgIGJlYW5DbGFzc0Jyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnJvd3NlQ2xhc3NlcygpOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIAotICAgIGJlYW5SZXNvdXJjZUJyb3dzZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIGdyb3VwLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX0JST1dTRV9GSUxFUywKLSAgICAJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fUkVTT1VSQ0VfQlJPV1NFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDTF9CVVRUT05fQkVBTl9SRVNPVVJDRV9CUk9XU0UgKTsKLSAgICBiZWFuUmVzb3VyY2VCcm93c2VCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUJyb3dzZUZpbGVzKCk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZnlCZWFuQ2xhc3NUZXh0KCkKLSAgewotICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgIHNlcnZlclByb2plY3RfID0gbnVsbDsKLSAgICBzZXJ2ZXJDb21wb25lbnROYW1lXyA9IG51bGw7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlQ2xhc3NlcygpCi0gIHsKLSAgICBTaGVsbCBzaGVsbCA9IHBhcmVudF8uZ2V0U2hlbGwoKTsKLSAgICBJVHlwZSBpdHlwZSA9IERpYWxvZ1V0aWxzLmJyb3dzZUNsYXNzZXNBc0lUeXBlKHNoZWxsLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCksIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpKTsKLSAgICBpZiAoaXR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiZWFuQ2xhc3NUZXh0Xy5zZXRUZXh0KGl0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJUmVzb3VyY2UgcmVzID0gaXR5cGUuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0gICAgICAgIGlmIChyZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlclByb2plY3RfID0gcmVzLmdldFByb2plY3QoKTsKLSAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihyZXMpOwotICAgICAgICAgIGlmIChjb21wIT1udWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWVfID0gY29tcC5nZXROYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlclByb2plY3RfID0gbnVsbDsKLSAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lXyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKQotICAgICAgewotICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IG51bGw7Ci0gICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWVfID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2VGaWxlcygpCi0gIHsKLSAgICBJUmVzb3VyY2UgdG9wUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKTsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBEaWFsb2dVdGlscy5icm93c2VSZXNvdXJjZXMoIHBhcmVudF8uZ2V0U2hlbGwoKSwgdG9wUmVzb3VyY2UsIGluaXRpYWxSZXNvdXJjZV8sIGZpbHRlcl8gKTsKLSAgICBzZXRCZWFuQ2xhc3MocmVzb3VyY2UpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0QmVhbkNsYXNzKElSZXNvdXJjZSByZXNvdXJjZSkKLSAgewotICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgKQotICAgIHsKLSAgICAgIElQYXRoICBwYXRoICAgICA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICBTdHJpbmcgYmFzZW5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgICAKLSAgICAgIGlmKCBiYXNlbmFtZSAhPSBudWxsICYmIGJhc2VuYW1lLmxlbmd0aCgpID4gMCApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBiZWFuUGFja2FnZSA9IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlscy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZShwYXRoKTsKLSAgICAgICAgU3RyaW5nIGJlYW5DbGFzcyA9IChiZWFuUGFja2FnZSA9PSBudWxsIHx8IGJlYW5QYWNrYWdlLmxlbmd0aCgpID09IDAgPyBiYXNlbmFtZSA6IChiZWFuUGFja2FnZSArICIuIiArIGJhc2VuYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBpZiggYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikgfHwgYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuQ2xhc3Muc3Vic3RyaW5nKCAwLCBiZWFuQ2xhc3MubGFzdEluZGV4T2YoJy4nKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBiZWFuQ2xhc3NUZXh0Xy5zZXRUZXh0KGJlYW5DbGFzcyk7Ci0gICAgICAgIHNlcnZlclByb2plY3RfID0gIFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHBhdGgpOwotICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihyZXNvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY29tcCE9bnVsbCkKLSAgICAgICAgewkKLSAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lXyA9IGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEJlYW5DbGFzcyhTZXJ2aWNlSW1wbEJlYW5JbXBsIHNlcnZpY2VJbXBsKQotICB7Ci0gICAgaWYoIHNlcnZpY2VJbXBsICE9IG51bGwgKQotICAgIHsKLSAgICAgIEVPYmplY3QgZU9iamVjdCA9IHNlcnZpY2VJbXBsLmVDb250YWluZXIoKTsKLSAgICAgIGlmKGVPYmplY3QgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50SW1wbCl7Ci0gICAgICAJUG9ydENvbXBvbmVudEltcGwgcGNpID0gKFBvcnRDb21wb25lbnRJbXBsKWVPYmplY3Q7Ci0gICAgICAJU3RyaW5nIGJlYW5DbGFzcyA9IHBjaS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLSAgICAgIAliZWFuQ2xhc3NUZXh0Xy5zZXRUZXh0KGJlYW5DbGFzcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0QmVhbkNsYXNzKEJlYW5MaW5rIHNlcnZpY2VJbXBsKQotICB7Ci0gICAgaWYoIHNlcnZpY2VJbXBsICE9IG51bGwgKQotICAgIHsKLSAgICAgIEVPYmplY3QgZU9iamVjdCA9IHNlcnZpY2VJbXBsLmVDb250YWluZXIoKTsKLSAgICAgIGlmKGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbEJlYW5JbXBsKXsKLSAgICAgIAlzZXRCZWFuQ2xhc3MoKFNlcnZpY2VJbXBsQmVhbkltcGwpZU9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgIAlJRmlsZSBpRmlsZSA9IChJRmlsZSlvYmplY3Q7Ci0gICAgICAJU3RyaW5nIGZpbGVFeHQgPSBpRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgIAlpZiAoZmlsZUV4dC5lcXVhbHMoImphdmEiKSB8fCBmaWxlRXh0LmVxdWFscygiY2xhc3MiKSkKLSAgICAgICAgICBzZXRCZWFuQ2xhc3MoaUZpbGUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkKLSAgICAgIAlzZXRCZWFuQ2xhc3MoKChJQ29tcGlsYXRpb25Vbml0KW9iamVjdCkuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbEJlYW5JbXBsKQotICAgICAgCXNldEJlYW5DbGFzcygoU2VydmljZUltcGxCZWFuSW1wbClvYmplY3QpOwotICAgICAgZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBCZWFuTGluaykKLSAgICAgIAlzZXRCZWFuQ2xhc3MoKEJlYW5MaW5rKW9iamVjdCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihiZWFuQ2xhc3NUZXh0Xy5nZXRUZXh0KCkpOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmVyUHJvamVjdF87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZlckNvbXBvbmVudE5hbWVfOwotICB9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgU3RyaW5nIGJlYW5DbGFzc05hbWUgPSBiZWFuQ2xhc3NUZXh0Xy5nZXRUZXh0KCkudHJpbSgpOwotICAgIGlmIChiZWFuQ2xhc3NOYW1lID09IG51bGwgfHwgYmVhbkNsYXNzTmFtZS5sZW5ndGgoKSA8PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9NU0dfQkVBTl9DQU5OT1RfQkVfRU1QVFkpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uRGlzcGxheWFibGVTdHJpbmcoKSB7Ci0JLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiAiSmF2YSBiZWFuIHN0cmluZyAiOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg5ZDk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLQotcHVibGljIGNsYXNzIE9iamVjdFNlbGVjdGlvbkZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudCBpbXBsZW1lbnRzIENvbmRpdGlvbgotewotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyOwotICBwcml2YXRlIGJvb2xlYW4gaGFzT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotCi0gIHB1YmxpYyBPYmplY3RTZWxlY3Rpb25GcmFnbWVudCgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIEJvb2xlYW5GcmFnbWVudCBib29sRnJhZ21lbnQgPSBuZXcgQm9vbGVhbkZyYWdtZW50KG5ldyBTaW1wbGVGcmFnbWVudCgiT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IiksIG5ldyBTaW1wbGVGcmFnbWVudCgiIiksIHRoaXMpOwotICAgIGFkZChib29sRnJhZ21lbnQpOwotICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQoKSwgIiIpKTsKLSAgICBoYXNPYmplY3RTZWxlY3Rpb25XaWRnZXQgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHJldHJpZXZlIHRoZSBkYXRhIG1hcHBpbmdzIGZvciB0aGlzIGNvbW1hbmQgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuY2xhc3MsICJUeXBlUnVudGltZVNlcnZlciIsIE9iamVjdFNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuY2xhc3MsICJUeXBlUnVudGltZVNlcnZlciIsIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbldpZGdldC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbldpZGdldC5jbGFzcywgIlByb2plY3QiLCBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDb21wb25lbnROYW1lIiwgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gaGFzT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotICB9Ci0KLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiB0eXBlUnVudGltZVNlcnZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdHlwZVJ1bnRpbWVTZXJ2ZXIgVGhlIHR5cGVSdW50aW1lU2VydmVyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyKQotICB7Ci0gICAgdGhpcy50eXBlUnVudGltZVNlcnZlciA9IHR5cGVSdW50aW1lU2VydmVyOwotICAgIGlmICh0eXBlUnVudGltZVNlcnZlciAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB3c3QgPSB0eXBlUnVudGltZVNlcnZlci5nZXRUeXBlSWQoKTsKLQotICAgICAgaW50IHNjZW5hcmlvID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2NlbmFyaW9Gcm9tVHlwZUlkKHdzdCk7Ci0gICAgICBTdHJpbmcgaW1wbElkID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0V2ViU2VydmljZUltcGxJZEZyb21UeXBlSWQod3N0KTsKLSAgICAgIGlmIChzY2VuYXJpbyA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikKLSAgICAgIHsKLSAgICAgICAgLy9NdXN0IGhhdmUgV1NETCBvYmplY3Qgc2VsZWN0aW9uLiBObyBjaG9pY2UuCi0gICAgICAgIGhhc09iamVjdFNlbGVjdGlvbldpZGdldD10cnVlOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFdlYlNlcnZpY2VJbXBsIHdzaW1wbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFdlYlNlcnZpY2VJbXBsQnlJZChpbXBsSWQpOwotICAgICAgICBpZiAod3NpbXBsIT1udWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBTdHJpbmcgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSB3c2ltcGwuZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7IAotICAgICAgICAgIGhhc09iamVjdFNlbGVjdGlvbldpZGdldCA9IG9iamVjdFNlbGVjdGlvbldpZGdldElkICE9IG51bGwgJiYgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQubGVuZ3RoKCkgPiAwOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkNWVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA4MzAgICAxNTUxMTQgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29naywgVXBkYXRlZCBwYXRjaCBmb3IgdGhpcyBkZWZlY3QuCi0gKiAyMDA3MDExNiAgIDE1OTYxOCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgUHJvamVjdCBhbmQgRUFSIG5vdCBkZWZhdWx0ZWQgcHJvcGVybHkgd2hlbiB3aXphcmQgbGF1bmNoZWQgZnJvbSBKU1ItMTA5IFdlYiBzZXJ2aWNlcyBicmFuY2ggaW4gSjJFRSBQcm9qZWN0IEV4cGxvcmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uVW5pdmVyc2FsUGF0aFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLQotcHVibGljIGNsYXNzIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICAgb2JqZWN0U2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IG9iamVjdFNlbGVjdGlvbldpZGdldF87Ci0gIHByaXZhdGUgSVByb2plY3QgICAgICAgICAgICAgICBwcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyICAgICAgcGFyc2VyXzsKLSAgCi0gIHByaXZhdGUgVW5pdmVyc2FsUGF0aFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyXyA9IG5ldyBVbml2ZXJzYWxQYXRoVHJhbnNmb3JtZXIoKTsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICB0b3BEb3duXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgCi0gICAgLy8gVHJhbnNmb3JtYXRpb24KLSAgICBpZiAob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfICE9IG51bGwgJiYgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciAgICAgICAgICA9IE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHJhbnNmb3JtZXIob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfKTsKLSAgICAgIE9iamVjdCAgICAgIHRyYW5zZm9ybWVkU2VsZWN0aW9uID0gdHJhbnNmb3JtZXIgPT0gbnVsbCA/IG51bGwgOiB0cmFuc2Zvcm1lci50cmFuc2Zvcm0ob2JqZWN0U2VsZWN0aW9uXyk7Ci0gICAgICAKLSAgICAgIGlmICh0cmFuc2Zvcm1lZFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBvYmplY3RTZWxlY3Rpb25fID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXRyYW5zZm9ybWVkU2VsZWN0aW9uOwotICAgICAgfQotICAgIH0KLQkKLSAgICAvLyBWYWxpZGF0aW9uCi0gICAgSVN0YXR1cyBzdGF0dXMgPSAob2JqZWN0U2VsZWN0aW9uV2lkZ2V0XyAhPSBudWxsKSA/IG9iamVjdFNlbGVjdGlvbldpZGdldF8udmFsaWRhdGVTZWxlY3Rpb24oZ2V0T2JqZWN0U2VsZWN0aW9uKCkpIDogU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gU3RhdHVzLk9LICYmIGVudiAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0JCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdHlwZVJ1bnRpbWVTZXJ2ZXIgVGhlIHR5cGVSdW50aW1lU2VydmVyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyKQotICB7Ci0gICAgaWYgKHR5cGVSdW50aW1lU2VydmVyICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHdzdCA9IHR5cGVSdW50aW1lU2VydmVyLmdldFR5cGVJZCgpOwotCi0gICAgICBpbnQgc2NlbmFyaW8gPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTY2VuYXJpb0Zyb21UeXBlSWQod3N0KTsKLSAgICAgIFN0cmluZyBpbXBsSWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRXZWJTZXJ2aWNlSW1wbElkRnJvbVR5cGVJZCh3c3QpOwotCi0gICAgICBXZWJTZXJ2aWNlSW1wbCB3c2ltcGwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRXZWJTZXJ2aWNlSW1wbEJ5SWQoaW1wbElkKTsKLQkgICAgLy9JV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVSdW50aW1lU2VydmVyLmdldFR5cGVJZCgpKTsKLQotICAgICAgaWYgKHdzaW1wbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSBudWxsOwotICAgICAgICBpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pCi0gICAgICAgIHsKLSAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCI7Ci0gICAgICAgICAgdG9wRG93bl8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldElkID0gd3NpbXBsLmdldE9iamVjdFNlbGVjdGlvbldpZGdldCgpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0JCSAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZF8gPSBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZDsKLSAgICAgICAgCi0JCSAgICBPYmplY3Qgb2JqZWN0ID0gT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRTZWxlY3Rpb25XaWRnZXQob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0ICkKLSAgICAgICAgewotICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldF8gPSAoSU9iamVjdFNlbGVjdGlvbldpZGdldClvYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBvYmplY3RTZWxlY3Rpb25fOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gc2VsZWN0aW9uIFRoZSBzZWxlY3Rpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T2JqZWN0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIG9iamVjdFNlbGVjdGlvbl8gPSBvYmplY3RTZWxlY3Rpb247Ci0gICAgCi0gICAgLy9TZXQgdGhlIHByb2plY3QgaWYgeW91IGNhbgotICAgIGlmIChwcm9qZWN0Xz09bnVsbCkKLSAgICB7Ci0gICAgICBwcm9qZWN0XyA9IGdldFByb2plY3RGcm9tT2JqZWN0U2VsZWN0aW9uKG9iamVjdFNlbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8vU2V0IHRoZSBjb21wb25lbnROYW1lIGlmIHlvdSBjYW4KLSAgICBpZiAoY29tcG9uZW50TmFtZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21wb25lbnROYW1lXyA9IGdldENvbXBvbmVudE5hbWVGcm9tT2JqZWN0U2VsZWN0aW9uKG9iamVjdFNlbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBXU0RMIHNlbGVjdGlvbiBvYmplY3QuICBJZiBpdCBpcyB3ZSBuZWVkCi0gICAgLy8gdG8gdW53cmFwIGl0LgotICAgIGlmKCBvYmplY3RTZWxlY3Rpb24gIT0gbnVsbCAmJiAhb2JqZWN0U2VsZWN0aW9uLmlzRW1wdHkoKSApCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IG9iamVjdFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIAotICAgICAgaWYoIG9iamVjdCBpbnN0YW5jZW9mIFdTRExTZWxlY3Rpb25XcmFwcGVyICkKLSAgICAgIHsKLSAgICAgICAgV1NETFNlbGVjdGlvbldyYXBwZXIgd3NkbFdyYXBwZXIgPSAoV1NETFNlbGVjdGlvbldyYXBwZXIpb2JqZWN0OwotICAgICAgICAKLSAgICAgICAgb2JqZWN0U2VsZWN0aW9uXyA9IHdzZGxXcmFwcGVyLndzZGxTZWxlY3Rpb247Ci0gICAgICAgIHBhcnNlcl8gICAgICAgICAgPSB3c2RsV3JhcHBlci5wYXJzZXI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICBpZiAocHJvamVjdF8gPT0gbnVsbCAmJiB0b3BEb3duXykKLSAgICAgIHByb2plY3RfID0gZ2V0UHJvamVjdEZyb21UcmFuc2Zvcm1lZFNlbGVjdGlvbigpOwotICAgIHJldHVybiBwcm9qZWN0XzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0gIAotICAKLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkKLSAgewotICAgIGlmIChjb21wb25lbnROYW1lXyA9PSBudWxsICYmIHRvcERvd25fKQotICAgICAgY29tcG9uZW50TmFtZV8gPSBnZXRDb21wb25lbnROYW1lRnJvbVRyYW5zZm9ybWVkU2VsZWN0aW9uKCk7Ci0gICAgcmV0dXJuIGNvbXBvbmVudE5hbWVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50TmFtZShTdHJpbmcgY29tcG9uZW50TmFtZSkKLSAgewotICAgIHRoaXMuY29tcG9uZW50TmFtZV8gPSBjb21wb25lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyc2VyXy4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICByZXR1cm4gcGFyc2VyXzsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmwpIHsgCi0gICAgcmV0dXJuIHVybC5pbmRleE9mKCI6IikgIT0gLTE7ICAKLSAgfQotICAKLSAgcHJpdmF0ZSBJUmVzb3VyY2UgZmluZFJlc291cmNlRnJvbVNlbGVjdGlvbihPYmplY3Qgc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7IAotCSAgCi0gICAgICAvLyB0cnkgZmluZGluZyBhdCBsZWFzdCB0aGUgcHJvamVjdCB1c2luZyB0aGUgRU1GIHdheQotICAgICAgaWYgKHJlc291cmNlID09IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICAgICAgICByZXNvdXJjZSA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzZWxlY3Rpb24pOwotCSAgCi0gICAgICByZXR1cm4gcmVzb3VyY2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21UcmFuc2Zvcm1lZFNlbGVjdGlvbigpIHsKLSAgICBpZiAob2JqZWN0U2VsZWN0aW9uXyAhPSBudWxsICYmIG9iamVjdFNlbGVjdGlvbl8uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IG9iamVjdFNlbGVjdGlvbl8uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSB0cmFuc2Zvcm1lcl8udG9QYXRoKChTdHJpbmcpIG9iaik7Ci0gICAgICAgIGlmIChoYXNQcm90b2NvbChzdHIpKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKG5ldyBQYXRoKHN0cikpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsJICAKLSAgfQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbU9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaW5kUmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KQotICAgICAgICAJcmV0dXJuIChJUHJvamVjdCkgcmVzb3VyY2U7Ci0gICAgICAgICAgSVByb2plY3QgcCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb21wb25lbnROYW1lRnJvbVRyYW5zZm9ybWVkU2VsZWN0aW9uKCkgewotICAgIGlmIChvYmplY3RTZWxlY3Rpb25fICE9IG51bGwgJiYgb2JqZWN0U2VsZWN0aW9uXy5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gb2JqZWN0U2VsZWN0aW9uXy5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsgCi0gICAgICAgIFN0cmluZyBzdHIgPSB0cmFuc2Zvcm1lcl8udG9QYXRoKChTdHJpbmcpIG9iaik7Ci0gICAgICAgIGlmIChoYXNQcm90b2NvbChzdHIpKSByZXR1cm4gbnVsbDsKLSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YobmV3IFBhdGgoc3RyKSk7Ci0gICAgICAgIHJldHVybiBjb21wID09IG51bGwgPyBudWxsIDogY29tcC5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwkgIAotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb21wb25lbnROYW1lRnJvbU9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaW5kUmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAKLSAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihyZXNvdXJjZSk7Ci0gICAgIAotICAgICAgICAgIGlmIChjb21wIT1udWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wLmdldE5hbWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmIyOTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA4MjUgICAxNTUxMTQgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNjA4MzAgICAxNTUxMTQgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29naywgVXBkYXRlZCBwYXRjaCBmb3IgdGhpcyBkZWZlY3QuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5JT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkgaW5zdGFuY2U7Ci0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gICAgICAgIGVsZW1lbnRzOwotICBwcml2YXRlIEhhc2h0YWJsZSAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRTZWxlY3Rpb25XaWRnZXRzOwotICAKLSAgcHJpdmF0ZSBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeSgpCi0gIHsKLSAgICBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAib2JqZWN0U2VsZWN0aW9uV2lkZ2V0Iik7Ci0gICAgY2FjaGVkU2VsZWN0aW9uV2lkZ2V0cyA9IG5ldyBIYXNodGFibGUoKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBpZCBpZiB0aGUgc2VsZWN0aW9uIHdpZGdldCBvYmplY3QuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgdHJhbnNmb3JtZXIgY2xhc3MgaWYgaGFzIGJlZW4gc3BlY2lmaWVkLiAgT3RoZXJ3aXNlCi0gICAqIG51bGwgaXMgcmV0dXJuZWQuCi0gICAqLwotICBwdWJsaWMgVHJhbnNmb3JtZXIgZ2V0VHJhbnNmb3JtZXIoIFN0cmluZyBpZCApCi0gIHsKLSAgICBUYWJsZUVudHJ5ICBlbnRyeSAgPSBnZXRUYWJsZUVudHJ5KCBpZCApOwotICAgIFRyYW5zZm9ybWVyIHJlc3VsdCA9IG51bGw7Ci0gICAgCi0gICAgaWYoIGVudHJ5ICE9IG51bGwgKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZW50cnkuZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJ0cmFuc2Zvcm1lciIpOwotICAgICAgICAKLSAgICAgICAgaWYoIG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zZm9ybWVyICkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChUcmFuc2Zvcm1lcilvYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApe30gICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBpZCBpZiB0aGUgc2VsZWN0aW9uIHdpZGdldCBvYmplY3QuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGV4dGVybmFsIG1vZGlmeSBhdHRyaWJ1dGUgaWYKLSAgICogaXQgaGFzIGJlZW4gc3BlY2lmaWVkLiAgT3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RXh0ZXJuYWxNb2RpZnkoIFN0cmluZyBpZCApCi0gIHsKLSAgICBUYWJsZUVudHJ5IGVudHJ5ICA9IGdldFRhYmxlRW50cnkoIGlkICk7Ci0gICAgYm9vbGVhbiAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiggZW50cnkgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nIG1vZGlmeVN0cmluZyA9IGVudHJ5LmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJleHRlcm5hbF9tb2RpZnkiKTsgCi0gICAgICAKLSAgICAgIHJlc3VsdCA9IG5ldyBCb29sZWFuKCBtb2RpZnlTdHJpbmcgKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgYmFzZWQgb24gdGhlIHNlbGVjdGlvbklkLiAgSWYgb25lIGlzCi0gICAqIG5vdCBmb3VuZCBudWxsIGlzIHJldHVybmVkLgotICAgKiAKLSAgICogQHBhcmFtIHNlbGVjdGlvbklkIHRoZSBJRCBvZiB0aGUgc2VsZWN0aW9uIHdpZGdldC4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSByZWdpc3RlcmVkIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRTZWxlY3Rpb25XaWRnZXQoIFN0cmluZyBzZWxlY3Rpb25JZCApCi0gIHsKLSAgICBUYWJsZUVudHJ5IGVudHJ5ID0gZ2V0VGFibGVFbnRyeSggc2VsZWN0aW9uSWQgKTsKLSAgICAKLSAgICByZXR1cm4gZW50cnkgPT0gbnVsbCA/IG51bGwgOiBlbnRyeS5vYmplY3RTZWxlY3Rpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNsZWFudXAoKQotICB7Ci0gICAgaW5zdGFuY2UgPSBudWxsOwotICAgIGVsZW1lbnRzID0gbnVsbDsKLSAgICBjYWNoZWRTZWxlY3Rpb25XaWRnZXRzID0gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBUYWJsZUVudHJ5IGdldFRhYmxlRW50cnkoIFN0cmluZyBpZCApCi0gIHsKLSAgICBpZiggaWQgPT0gbnVsbCApIHJldHVybiBudWxsOwotICAgIAotICAgIFRhYmxlRW50cnkgZW50cnkgPSAoVGFibGVFbnRyeSljYWNoZWRTZWxlY3Rpb25XaWRnZXRzLmdldCggaWQgKTsKLSAgICAKLSAgICBpZiggZW50cnkgPT0gbnVsbCApCi0gICAgewotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVsZW1lbnRzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdOwotICAgICAgICBTdHJpbmcgICAgICAgICAgICAgICAgZWxlbUlkICA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAiaWQiICk7Ci0gICAgICAKLSAgICAgICAgaWYoIGlkLmVxdWFscyggZWxlbUlkICkgKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG9iamVjdCBpbnN0YW5jZW9mIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgfHwgb2JqZWN0IGluc3RhbmNlb2YgSU9iamVjdFNlbGVjdGlvbkxhdW5jaGFibGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBUYWJsZUVudHJ5KCk7Ci0gICAgICAgICAgICAgIGVudHJ5LmVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgICBlbnRyeS5vYmplY3RTZWxlY3Rpb24gPSBvYmplY3Q7Ci0gICAgICAgICAgICAgIGNhY2hlZFNlbGVjdGlvbldpZGdldHMucHV0KCBpZCwgZW50cnkgKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApe30KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZW50cnk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgVGFibGVFbnRyeQotICB7Ci0gICAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCAgZWxlbWVudDsKLSAgICBwdWJsaWMgT2JqZWN0ICAgICAgICAgICAgICAgICBvYmplY3RTZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjg1OTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjI0ICAgMTI5Mzg3IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDYwNDEwICAgMTM1NDQxIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwODI1ICAgMTU1MTE0IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDYxMjIwICAgMTYxMjMyIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldC5zZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIGNhbGxlZCB0d2ljZSBlYWNoIHRpbWUgQnJvd3NlIHByZXNzZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldCBpbXBsZW1lbnRzIElPYmplY3RTZWxlY3Rpb25XaWRnZXQKLXsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICBwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50TmFtZTsKLSAgcHJpdmF0ZSBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGNoaWxkOwotICBwcml2YXRlIFBvaW50IHdpZGdldFNpemVfOwotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSwgTGlzdGVuZXIgc3RhdExpc3RlbmVyKQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRDb21wb3NpdGU7Ci0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXRMaXN0ZW5lcjsKLSAgICBjb21wb3NpdGUgPSBudWxsOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCl7Ci0JICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIHR5cGVSdW50aW1lU2VydmVyIFRoZSB0eXBlUnVudGltZVNlcnZlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcikKLSAgewotICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuZGlzcG9zZSgpOwotICAgICAgY2hpbGQgPSBudWxsOwotICAgIH0KLSAgICBpZiAodHlwZVJ1bnRpbWVTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgd3N0ID0gdHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0VHlwZUlkKCk7Ci0gICAgICBpbnQgc2NlbmFyaW8gPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTY2VuYXJpb0Zyb21UeXBlSWQod3N0KTsKLSAgICAgIFN0cmluZyBpbXBsSWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRXZWJTZXJ2aWNlSW1wbElkRnJvbVR5cGVJZCh3c3QpOwotICAgICAgV2ViU2VydmljZUltcGwgd3NpbXBsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0V2ViU2VydmljZUltcGxCeUlkKGltcGxJZCk7Ci0gICAgICAKLQkgICAgLy9JV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0VHlwZUlkKCkpOwotICAgICAgaWYgKHdzaW1wbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSBudWxsOwotICAgICAgICBpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pCi0gICAgICAgIHsKLSAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSB3c2ltcGwuZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRTZWxlY3Rpb25XaWRnZXQoIG9iamVjdFNlbGVjdGlvbldpZGdldElkICk7Ci0gICAgICAgIAotICAgICAgICBpZiggb2JqZWN0IGluc3RhbmNlb2YgSU9iamVjdFNlbGVjdGlvbldpZGdldCApCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZCA9IChJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KW9iamVjdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGNoaWxkICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgQ29udHJvbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgICAgY2hpbGQuYWRkQ29udHJvbHMoY29tcG9zaXRlLCBzdGF0dXNMaXN0ZW5lcik7Ci0KLSAgICAgICAgICBQb2ludCBvcmlnU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICBQb2ludCBjb21wU2l6ZSA9IGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICAgIGludCAgIG5ld1ggICAgID0gb3JpZ1NpemUueDsKLSAgICAgICAgICBpbnQgICBuZXdZICAgICA9IG9yaWdTaXplLnk7Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAvLyBOb3RlOiB3ZSBhcmUgdHJ5aW5nIHRvIGRldGVybWluZSBoZXJlIGlmIHRoZSB3aXphcmQgcGFnZSBzaG91bGQKLSAgICAgICAgICAvLyAgICAgICBiZSByZXNpemVkIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBjb250cm9sIHRoYXQgaXMKLSAgICAgICAgICAvLyAgICAgICBnaXZlbiB0byB1cyBieSB0aGUgZXh0ZW5zaW9uLiAgVGhlIGhhcmQgY29kZWQgY29uc3RhbnRzCi0gICAgICAgICAgLy8gICAgICAgYmVsb3cgcmVwcmVzZW50IHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwaXhlbHMgdGhhdCBuZWVkCi0gICAgICAgICAgLy8gICAgICAgdG8gZ28gYXJvdW5kIG9iamVjdCBzZWxlY3Rpb24gY29udHJvbC4gIEhvcGVmdWxseSwgYSBtb3JlCi0gICAgICAgICAgLy8gICAgICAgcHJvZ3JhbWF0aWMgbWV0aG9kIG9mIGRvaW5nIHRoaXMgY2FuIGJlIGZvdW5kIGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAgaWYoIGNvbXBTaXplLnggKyAyMCA+IG9yaWdTaXplLnggKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5ld1ggPSBjb21wU2l6ZS54ICsgMjA7Ci0gICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYoIGNvbXBTaXplLnkgKyAyMDUgPiBvcmlnU2l6ZS55ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdZID0gY29tcFNpemUueSArIDIwNTsKLSAgICAgICAgICB9Ci0gICAKLSAgICAgICAgICB3aWRnZXRTaXplXyA9IG5ldyBQb2ludChuZXdYLCBuZXdZKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRTdGF0dXMoKSA6IFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotICAgIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUluaXRpYWxTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbik7Ci0gICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgICBjaGlsZC5zZXRJbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotICB9Ci0gICAgCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldE9iamVjdFNlbGVjdGlvbigpIDogbnVsbDsKLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLnZhbGlkYXRlU2VsZWN0aW9uKG9iamVjdFNlbGVjdGlvbikgOiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICBpZiAoY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJUHJvamVjdCBwID0gY2hpbGQuZ2V0UHJvamVjdCgpOwotICAgICAgaWYgKHAgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGNuYW1lID0gY2hpbGQuZ2V0Q29tcG9uZW50TmFtZSgpOwotICAgICAgaWYgKGNuYW1lICE9IG51bGwgJiYgY25hbWUubGVuZ3RoKCk+MCkKLSAgICAgICAgcmV0dXJuIGNuYW1lOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gY29tcG9uZW50TmFtZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAgCi0JIAotICB9Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIGlmIChyZXNvdXJjZT09bnVsbCkgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICBJUHJvamVjdCBwID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZUZyb21Jbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIAotICAgICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBSZXNvdXJjZVV0aWxzLmdldENvbXBvbmVudE9mKHJlc291cmNlKTsKLSAgICAgICAgICBpZiAoY29tcCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wLmdldE5hbWUoKTsgIAotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uRGlzcGxheWFibGVTdHJpbmcoKSB7Ci0JcmV0dXJuIGNoaWxkLmdldE9iamVjdFNlbGVjdGlvbkRpc3BsYXlhYmxlU3RyaW5nKCk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0V2lkZ2V0U2l6ZSgpCi0gIHsKLQkgIFBvaW50IGNoaWxkV2lkZ2V0U2l6ZSA9IGNoaWxkLmdldFdpZGdldFNpemUoKTsKLQkgIGlmIChjaGlsZFdpZGdldFNpemUgPT0gbnVsbCkKLQkJICAJICByZXR1cm4gd2lkZ2V0U2l6ZV87Ci0JICByZXR1cm4gY2hpbGRXaWRnZXRTaXplOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1RpbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1RpbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzYyMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9UaW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDgwMyAgIDE1MjQ4NiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgVHlwaW5nIFdTREwgaW4gU2VydmljZSBkZWZpbml0aW9uIGZpZWxkIGlzIHZlcnkgc2xvdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgVGltZXIgZXh0ZW5kcyBUaHJlYWQKLXsKLSAgcHJpdmF0ZSBmaW5hbCBsb25nIE9ORV9TRUNPTkQgPSAxMDAwOwotICBwcml2YXRlIGxvbmcgcmVmcmVzaFRpbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1J1bm5pbmcgPSB0cnVlOwotICBwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKLSAgcHJpdmF0ZSBSdW5uYWJsZSBydW5uYWJsZTsKLQotICBwcml2YXRlIFRpbWVyKERpc3BsYXkgZGlzcGxheSwgUnVubmFibGUgcnVubmFibGUpCi0gIHsKLSAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5OwotICAgIHRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKLSAgfQotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFRpbWVyIG5ld0luc3RhbmNlKFRpbWVyIHRpbWVyLCBEaXNwbGF5IGRpc3BsYXksIFJ1bm5hYmxlIHJ1bm5hYmxlKQotICB7Ci0gICAgaWYgKCFUaW1lci5pc1J1bm5pbmcodGltZXIpKQotICAgICAgcmV0dXJuIG5ldyBUaW1lcihkaXNwbGF5LCBydW5uYWJsZSk7Ci0gICAgCi0gICAgcmV0dXJuIHRpbWVyOwotICB9Ci0gIAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBib29sZWFuIGlzUnVubmluZyhUaW1lciB0aW1lcikKLSAgewotICAgIHJldHVybiB0aW1lciAhPSBudWxsICYmIHRpbWVyLmlzUnVubmluZzsKLSAgfQotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydFRpbWVyKCkKLSAgewotICAgIHJlZnJlc2hUaW1lID0gZ2V0Q3VycmVudFRpbWUoKSArIE9ORV9TRUNPTkQ7Ci0gICAgaWYgKCFpc0FsaXZlKCkpCi0gICAgICB0aGlzLnN0YXJ0KCk7Ci0gIH0KLQotICBwcml2YXRlIGxvbmcgZ2V0Q3VycmVudFRpbWUoKQotICB7Ci0gICAgcmV0dXJuIENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpLmdldFRpbWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBsb25nIGN1cnJUaW1lID0gZ2V0Q3VycmVudFRpbWUoKTsKLSAgICB3aGlsZSAoY3VyclRpbWUgPCByZWZyZXNoVGltZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2xlZXAocmVmcmVzaFRpbWUgLSBjdXJyVGltZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBjdXJyVGltZSA9IGdldEN1cnJlbnRUaW1lKCk7Ci0gICAgfQotICAgIGlzUnVubmluZyA9IGZhbHNlOwotICAgIGRpc3BsYXkuc3luY0V4ZWMocnVubmFibGUpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9WYWxpZGF0ZVdTRExKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvVmFsaWRhdGVXU0RMSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2VlMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9WYWxpZGF0ZVdTRExKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZS5XU0RMVmFsaWRhdG9yOwotCi0KLQotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETEpvYiBleHRlbmRzIEpvYiB7Ci0JCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfV1NETF9KT0JfRkFNSUxZID0gIlZhbGlkYXRlV1NETEpvYkphbWlseSI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSV8gPSBudWxsOwotCXByaXZhdGUgSVZhbGlkYXRpb25NZXNzYWdlW10gdmFsaWRhdGlvbk1lc3NhZ2VzXyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdmFsaWRhdGlvbk1lc3NhZ2VTZXZlcml0eV8gPSAtMTsgLy8gZGVmYXVsdCB2YWx1ZQotCi0JcHVibGljIFZhbGlkYXRlV1NETEpvYihTdHJpbmcgd3NkbFVSSSkgewotCQlzdXBlcigiVmFsaWRhdGVXU0RMSm9iIik7Ci0JCXdzZGxVUklfID0gd3NkbFVSSTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVdTRExWYWxpZGF0b3Igd3NkbFZhbGlkYXRvciA9IFdTRExWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkgICAgSVZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gd3NkbFZhbGlkYXRvci52YWxpZGF0ZSh3c2RsVVJJXyk7Ci0JICAgIHZhbGlkYXRpb25NZXNzYWdlc18gPSB2YWxSZXBvcnQuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0JICAgIHJlcG9ydFN1bW1hcnkoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCS8vIGNhbGN1bGF0ZSB0aGUgaGlnaGVyIHNldmVyaXR5IGZvciBhbGwgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMKLQlwcml2YXRlIHZvaWQgcmVwb3J0U3VtbWFyeSgpIHsKLQkJaW50IGk7Ci0JCWludCBzZXZlcml0eTsKLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlpbnQgd2FybmluZ0NvdW50ID0gMDsKLQkJZm9yIChpPTA7IGk8dmFsaWRhdGlvbk1lc3NhZ2VzXy5sZW5ndGggJiYgZXJyb3JDb3VudCA9PSAwOyBpKyspIHsKLQkJCXNldmVyaXR5ID0gdmFsaWRhdGlvbk1lc3NhZ2VzX1tpXS5nZXRTZXZlcml0eSgpOwotCQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJY2FzZSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0VSUk9SOgotCQkJCWVycm9yQ291bnQrKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HOgotCQkJCXdhcm5pbmdDb3VudCsrOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZXJyb3JDb3VudCA+IDApIHsKLQkJCXZhbGlkYXRpb25NZXNzYWdlU2V2ZXJpdHlfID0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUjsKLQkJfSBlbHNlIGlmICh3YXJuaW5nQ291bnQgPiAwKSB7Ci0JCQl2YWxpZGF0aW9uTWVzc2FnZVNldmVyaXR5XyA9IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORzsKLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkKLQl7Ci0JCXJldHVybiBmYW1pbHkgPT0gVkFMSURBVEVfV1NETF9KT0JfRkFNSUxZOwotCX0KLQkKLQlwdWJsaWMgSVZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCQlyZXR1cm4gdmFsaWRhdGlvbk1lc3NhZ2VzXzsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRWYWxpZGF0aW9uTWVzc2FnZVNldmVyaXR5KCkgewotCQlyZXR1cm4gdmFsaWRhdGlvbk1lc3NhZ2VTZXZlcml0eV87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkgewotCQlyZXR1cm4gd3NkbFVSSV87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9WYWxpZGF0aW9uTWVzc2FnZVZpZXdlcldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9WYWxpZGF0aW9uTWVzc2FnZVZpZXdlcldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzdmNWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvVmFsaWRhdGlvbk1lc3NhZ2VWaWV3ZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTAgICAxMzEzNTIgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNjA0MTEgICAxMzYxMzQga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNDIwICAgMTM2MjIxIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2VWaWV3ZXJXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBpbnQgREVGQVVMVF9UQUJMRV9IRUlHSFRfSElOVCA9IDEwMDsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcl87Ci0gIHByaXZhdGUgVGFibGUgdGFibGVfOwotICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKLSAgc3RhdGljIGZpbmFsIFN0cmluZyBjb2x1bW5zX1tdID0ge0NvbnN1bXB0aW9uVUlNZXNzYWdlcy5UQUJMRV9DT0xVTU5fVkFMSURBVElPTl9TRVZFUklUWSwKLQkgIAkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRBQkxFX0NPTFVNTl9WQUxJREFUSU9OX0xJTkUsCi0JICAJCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UQUJMRV9DT0xVTU5fVkFMSURBVElPTl9DT0xVTU4sCi0JICAJCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UQUJMRV9DT0xVTU5fVkFMSURBVElPTl9NRVNTQUdFfTsKLSAgc3RhdGljIGZpbmFsIGludCBjb2x1bW5zV2lkdGhfW10gPSB7MTIsIDEwLCAxMCwgNjB9OwotICBzdGF0aWMgZmluYWwgaW50IGNvbHVtbk1pbnNfW10gPSB7NjAsIDUwLCA1MCwgMzAwfTsKLQotICAKLQotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VWaWV3ZXJXaWRnZXQoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7IAotICAgCi0JQ29tcG9zaXRlICBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgZ2wgICAgICAgID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkKLQlnbC5tYXJnaW5IZWlnaHQgPSAwOwotCWdsLm1hcmdpbldpZHRoID0gMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCi0gICAgVGV4dCBtZXNzYWdlTGFiZWwgPSBuZXcgVGV4dCggY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBtZXNzYWdlTGFiZWwuc2V0VGV4dCggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1ZBTElEQVRFX01FU1NBR0VTKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIG1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBtZXNzYWdlTGFiZWwuc2V0VG9vbFRpcFRleHQoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1ZBTElEQVRFX1RFWFRfTUVTU0FHRSApOwotCi0JdGFibGVfID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZ2QuaGVpZ2h0SGludCA9IERFRkFVTFRfVEFCTEVfSEVJR0hUX0hJTlQ7Ci0JdGFibGVfLnNldExheW91dERhdGEoZ2QpOwotCXRhYmxlXy5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JdGFibGVfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1RBQkxFX1ZBTElEQVRFX01FU1NBR0UgKTsKLQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspCi0JewotCSAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGVfLCBTV1QuTk9ORSk7Ci0JICB0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtbnNfW2ldKTsKLQkgIHRhYmxlQ29sdW1uLnBhY2soKTsKLQkgIENvbHVtbldlaWdodERhdGEgY29sdW1uRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKGNvbHVtbnNXaWR0aF9baV0sIGNvbHVtbk1pbnNfW2ldLCB0cnVlKTsKLQkgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uRGF0YSk7Ci0JfQotCXRhYmxlXy5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JdGFibGVWaWV3ZXJfID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlXyk7Ci0KLQl0YWJsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotCXRhYmxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMaXN0TGFiZWxQcm92aWRlcigpKTsKLQotCXJldHVybiB0aGlzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMpCi0gIHsKLSAgCXRhYmxlVmlld2VyXy5zZXRJbnB1dChtZXNzYWdlcyk7Ci0gIAl0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjbGVhcklucHV0KCkKLSAgewotCSAgSVZhbGlkYXRpb25NZXNzYWdlIGVtcHR5TWVzc2FnZXNbXSA9IHt9OwotCSAgdGhpcy5zZXRJbnB1dChlbXB0eU1lc3NhZ2VzKTsKLSAgfQotICAKLSAgcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkKLSAgewotCSAgcmV0dXJuIHRhYmxlVmlld2VyXy5nZXRDb250ZW50UHJvdmlkZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZSA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhtZXNzYWdlICk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotCXRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgVGFibGVJdGVtW10gZ2V0SXRlbXMoKQotICB7Ci0JLy9pbnRlcm5hbFJlZnJlc2goKTsKLQlyZXR1cm4gdGFibGVfLmdldEl0ZW1zKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsJCi0JaWYgKHRhYmxlXyAhPSBudWxsKQotCSAgdGFibGVfLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JewotCSAgdGFibGVWaWV3ZXJfLmFkZChnZXRFbGVtZW50cyhuZXdJbnB1dCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCXsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElWYWxpZGF0aW9uTWVzc2FnZVtdKQotCSAgewotCQkJSVZhbGlkYXRpb25NZXNzYWdlW10gdmFsTWVzc2FnZXMgPSAoSVZhbGlkYXRpb25NZXNzYWdlW10pIGlucHV0RWxlbWVudDsKLQkJICByZXR1cm4gdmFsTWVzc2FnZXM7Ci0JICB9Ci0JICBlbHNlCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCXsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmFsaWRhdGlvbk1lc3NhZ2UpCi0JCXsKLQkJCUlWYWxpZGF0aW9uTWVzc2FnZSBtc2cgPSAoSVZhbGlkYXRpb25NZXNzYWdlKSBlbGVtZW50OwotCQkJCi0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCXsJCi0JCQkJaW50IHNldmVyaXR5ID0gbXNnLmdldFNldmVyaXR5KCk7Ci0JCQkJaWYgKHNldmVyaXR5ID09IDApIHsKLQkJCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spOwotCQkJCX0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gMSkgewotCQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IDIpIHsKLQkJCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSyk7Ci0JCQkJfQotCQkJfQotCQl9CQotCSAgcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JewotCQlTdHJpbmcgdGV4dCA9ICIiOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWYWxpZGF0aW9uTWVzc2FnZSkKLQkJewotCQkJSVZhbGlkYXRpb25NZXNzYWdlIG1zZyA9IChJVmFsaWRhdGlvbk1lc3NhZ2UpIGVsZW1lbnQ7Ci0JCQkKLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMDoJCQotCQkJCS8vIG5vIHRleHQgdG8gZGlzcGxheSwgb25seSBkaXNwbGF5IHNldmVyaXR5IGFzIGltYWdlCi0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJdGV4dCA9IChuZXcgSW50ZWdlcihtc2cuZ2V0TGluZSgpKSkudG9TdHJpbmcoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQl0ZXh0ID0gKG5ldyBJbnRlZ2VyKG1zZy5nZXRDb2x1bW4oKSkpLnRvU3RyaW5nKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJdGV4dCA9IG1zZy5nZXRNZXNzYWdlKCk7Ci0JCQkJYnJlYWs7CQkKLQkJCQkKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9IAotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCXsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0gIH0KLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyZDFlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExNiAgIDE1OTYxOCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgUHJvamVjdCBhbmQgRUFSIG5vdCBkZWZhdWx0ZWQgcHJvcGVybHkgd2hlbiB3aXphcmQgbGF1bmNoZWQgZnJvbSBKU1ItMTA5IFdlYiBzZXJ2aWNlcyBicmFuY2ggaW4gSjJFRSBQcm9qZWN0IEV4cGxvcmVyCi0gKiAyMDA3MDMyNyAgIDE3MjMzOSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnV0aWxzLkFkYXB0ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWwgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZhbHVlKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCgoSVJlc291cmNlKXNlbCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoU2VydmljZUltcGwpc2VsKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmSW1wbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0RMVVJJKChTZXJ2aWNlUmVmSW1wbClzZWwpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoV1NETFJlc291cmNlSW1wbClzZWwpKTsKLSAgICAgIH0KLSAgICAgIC8qCi0gICAgICAgKiBUT0RPIC0gUmVtb3ZlIHRoZSBjYXNlcyBiZWxvdyBhZnRlciBidWcgMTcwODM0IGlzIGZpeGVkCi0gICAgICAgKiAKLSAgICAgICAqIFdTRExTZWxlY3Rpb25UcmFuc2Zvcm1lciBzaG91bGQgbm90IG5lZWQgdG8gaGFuZGxlIFNlcnZpY2VJbXBsQmVhbiBhbmQgQmVhbkxpbmsgd2hpY2gKLSAgICAgICAqIHJlcHJlc2VudCBzZXJ2aWNlIGNsYXNzZXMuICBUaGVzZSBjYXRjaGVzIGFyZSBoZXJlIGZvciBub3cgc2luY2Ugd2UgaW5jb3JyZWN0bHkgYWxsb3cKLSAgICAgICAqIHRoZSB3aXphcmQgdG8gZGVmYXVsdCB0byB0b3AtZG93biBzY2VhbnJpbyB3aGVuIGxhdW5jaCBmcm9tIHRoZXNlIG9iamVjdHMgaW4gdGhlIEpTUi0xMDkKLSAgICAgICAqIGJyYW5jaC4gCi0gICAgICAgKi8KLSAgICAgIGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldFdTRExVUkkoKFNlcnZpY2VJbXBsQmVhbikgc2VsKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBCZWFuTGluaykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldFdTRExVUkkoKEJlYW5MaW5rKSBzZWwpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgCSAgU3RyaW5nIHdzZGxVUkkgPSBBZGFwdGVyVXRpbHMuZ2V0QWRhcHRlZFdTREwoc2VsKTsKLSAgICAJICBpZiAod3NkbFVSSSAhPSBudWxsKSB7Ci0gICAgCQkgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih3c2RsVVJJKTsKLSAgICAJICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0V1NETFVSSShTZXJ2aWNlSW1wbEJlYW4gYmVhbikgewotCSAgRU9iamVjdCBlT2JqZWN0ID0gYmVhbi5lQ29udGFpbmVyKCk7Ci0JICBpZiAoZU9iamVjdCA9PSBudWxsKQotCQkgIHJldHVybiAiIjsKLSAgICAgICAgICAKLQkgIGVPYmplY3QgPSBlT2JqZWN0LmVDb250YWluZXIoKTsKLSAgICAgIAotCSAgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIHsKLQkJICBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NkID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgZU9iamVjdDsKLQkJICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdzZCk7ICAgIAkgIAotICAgIAkgIAotCQkgIC8vIGdldFdlYkNvbnRlbnRQYXRoIHJldHVybnMgdGhlICJXZWJDb250ZW50IiBmb2xkZXIgcGF0aCBmb3IgV2ViIHByb2plY3RzCi0JCSAgLy8gZm9yIEVKQiBwcm9qZWN0cywgaXQgcmV0dXJucyB0aGUgImViak1vZHVsZSIgZm9sZGVyIHBhdGgKLQkJICBJUGF0aCBwYXRoID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOyAgICAJIAotCQkgIHBhdGggPSBwYXRoLmFwcGVuZCh3c2QuZ2V0V3NkbEZpbGUoKSk7IAotICAgIAkgIAotCQkgIHJldHVybiBwYXRoLnRvU3RyaW5nKCk7ICAgIAkgICAgCi0JICB9Ci0JICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFdTRExVUkkoQmVhbkxpbmsgbGluaykgewotCSAgRU9iamVjdCBlT2JqZWN0ID0gbGluay5lQ29udGFpbmVyKCk7Ci0JICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbikKLQkJICByZXR1cm4gZ2V0V1NETFVSSSgoU2VydmljZUltcGxCZWFuKSBlT2JqZWN0KTsKLQkgIHJldHVybiAiIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiM2EzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MTAgICAxMzU0NDEgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA0MTAgICAxMzYwMTEga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNDIwICAgMTM1OTEyIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNTA0ICAgMTE5Mjk2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDYwNTI1ICAgMTQyMjgxIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNjA3ICAgMTQ0OTMyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDYxMiAgIDE0NTA4MSBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDcxOSAgIDEzOTk3NyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA4MDMgICAxNTI3MDEgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqIDIwMDYwODAzICAgMTUyNDg2IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBUeXBpbmcgV1NETCBpbiBTZXJ2aWNlIGRlZmluaXRpb24gZmllbGQgaXMgdmVyeSBzbG93Ci0gKiAyMDA2MDgyNSAgIDEzNTU3MCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgU2VydmljZSBpbXBsZW1lbnRhdGlvbiBVUkwgbm90IGRpc3BsYXllZCBwcm9wZXJseSBvbiBmaXJzdCBwYWdlCi0gKiAyMDA2MDgzMSAgIDE1NTg4MyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgc2VydmljZSBpbXBsIGZpZWxkIGRvZXNuJ3Qgd29yayBhZnRlciBzd2l0Y2hpbmcgZnJvbSBCVSB0byBURAotICogMjAwNjEyMTEgICAxNjE1ODkgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIE5QRSBpbiBzZXJ2aWNlIGdlbmVyYXRpb24gYWZ0ZXIgb3BlbmluZyBhbmQgY2FuY2VsbGluZyBmcm9tIGJyb3dzZSBkaWFsb2cKLSAqIDIwMDcwMTMxICAgMTY4Nzg2IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCB3c2RsIHVybCBvbiB3ZWIgc2VydmljZSB3aXphcmQgcGFnZSAxIGlzIG5vdCByZWZsZWN0ZWQgaW4gYnJvd3NlIGRpYWxvZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlVuaXZlcnNhbFBhdGhUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLldTRExQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuVGltZWRXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMU2VsZWN0aW9uVHJlZVdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLkRpYWxvZ1Jlc291cmNlQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLkZpbGVFeHRlbnNpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTRExWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldCBpbXBsZW1lbnRzIElPYmplY3RTZWxlY3Rpb25XaWRnZXQsIFJ1bm5hYmxlCi17Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBwbHVnaW5JZF87Ci0gIHByaXZhdGUgRmlsZUV4dGVuc2lvbkZpbHRlciB3c0ZpbHRlcl87Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUklfOwotICAKLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50XzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciAgc3RhdHVzTGlzdGVuZXJfOwotICBwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyXzsKLSAgcHJpdmF0ZSBXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCB0cmVlOwotICAKLSAgcHJpdmF0ZSBUaW1lciB0aW1lcl8gPSBudWxsOwotICAKLSAgcHJpdmF0ZSBVbml2ZXJzYWxQYXRoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXJfID0gbmV3IFVuaXZlcnNhbFBhdGhUcmFuc2Zvcm1lcigpOwotICAKLSAgLypDT05URVhUX0lEIFBDT04wMDAxIGZvciB0aGUgV1NETCBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUENPTl9QQUdFID0gIlBDT04wMDAxIjsKLQotICAvKkNPTlRFWFRfSUQgUENPTjAwMDIgZm9yIHRoZSBXU0RMIERvY3VtZW50IHRleHQgZmllbGQgb2YgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BDT05fVEVYVF9XU0RMID0gIlBDT04wMDAyIjsKLSAgcHJpdmF0ZSBUZXh0IHdlYlNlcnZpY2VVUkk7Ci0KLSAgLypDT05URVhUX0lEIFBDT04wMDAzIGZvciB0aGUgV1NETCBSZXNvdXJjZSBCcm93c2UgYnV0dG9uIG9mIHRoZSBXU0RMIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQ09OX0JVVFRPTl9CUk9XU0VfV1NETCA9ICJQQ09OMDAwMyI7Ci0gIHByaXZhdGUgQnV0dG9uIHdzQnJvd3NlQnV0dG9uXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQQ09OMDAwNCBmb3IgdGhlIFdpemFyZCBXU0RMIFZhbGlkYXRpb24gdGFibGUgb2YgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFZhbGlkYXRpb25NZXNzYWdlVmlld2VyV2lkZ2V0IG1zZ1ZpZXdlcl87Ci0gIHByaXZhdGUgVmFsaWRhdGVXU0RMSm9iIHZhbGlkYXRlV1NETEpvYl87Ci0gIHByaXZhdGUgSm9iQ2hhbmdlQWRhcHRlciAgICBqb2JDaGFuZ2VBZGFwdGVyXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQQ09OMDAwNSBmb3IgdGhlIFdpemFyZCBXU0RMIFZhbGlkYXRpb24gc3VtbWFyeSBtZXNzYWdlIG9mIHRoZSBXU0RMIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBUZXh0IHZhbGlkYXRpb25TdW1tYXJ5VGV4dF87Ci0gIHByaXZhdGUgVGV4dCB2YWxpZGF0aW9uU3VtbWFyeVRleHQyXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQQ09OMDAwNiBmb3IgdGhlIFN0b3AgV2l6YXJkIFdTREwgVmFsaWRhdGlvbiBidXR0b24gb2YgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIEJ1dHRvbiBzdG9wVmFsaWRhdGlvbkJ1dHRvbl87Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUENPTl9CVVRUT05fU1RPUF9WQUxJREFUSU9OID0gIlBDT04wMDA2IjsKLSAgCi0gIHB1YmxpYyBXU0RMU2VsZWN0aW9uV2lkZ2V0KCkKLSAgewotICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIHdzRmlsdGVyXyA9IG5ldyBGaWxlRXh0ZW5zaW9uRmlsdGVyKG5ldyBTdHJpbmdbXSB7IndzZGwiLCAid3NpbCIsICJodG1sIn0pOwotICAgIHdlYlNlcnZpY2VzUGFyc2VyID0gV1NETFBhcnNlckZhY3RvcnkuZ2V0V1NETFBhcnNlcigpOwotICAgIAotICAgIGZpbmFsIFJ1bm5hYmxlIGhhbmRsZVZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotCSAgcHVibGljIHZvaWQgcnVuKCkgCi0gICAgICB7Ci0JCSAgbXNnVmlld2VyXy5zZXRJbnB1dCh2YWxpZGF0ZVdTRExKb2JfLmdldFZhbGlkYXRpb25NZXNzYWdlcygpKTsKLQkJICB1cGRhdGVWYWxpZGF0aW9uU3VtbWFyeSh2YWxpZGF0ZVdTRExKb2JfLmdldFZhbGlkYXRpb25NZXNzYWdlU2V2ZXJpdHkoKSk7Ci0JCSAgc2V0VmFsaWRhdGlvbkluUHJvZ3Jlc3MoZmFsc2UpOwotICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgam9iQ2hhbmdlQWRhcHRlcl8gPSBuZXcgSm9iQ2hhbmdlQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIAotICAgICAgeyAgIAkKLSAgICAJICBpZiAobXNnVmlld2VyXyE9IG51bGwgJiYgbXNnVmlld2VyXy5nZXRDb250ZW50UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0gICAgCQkgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyggaGFuZGxlVmFsaWRhdGlvbk1lc3NhZ2VzICk7Ci0JCSAgfQotICAgICAgfQotICAgIH07Ci0gIH0KLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBVSVV0aWxzIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMoIHBsdWdpbklkXyApOwotICAgIHBhcmVudF8gICAgICAgICAgPSBwYXJlbnQ7Ci0gICAgc3RhdHVzTGlzdGVuZXJfICA9IHN0YXR1c0xpc3RlbmVyOwotCi0JICBwYXJlbnQuc2V0VG9vbFRpcFRleHQoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BDT05fUEFHRSApOwotCSAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZF8gKyAiLiIgKyBJTkZPUE9QX1BDT05fUEFHRSApOwotICAgIAotICAgIENvbXBvc2l0ZSB3c2RsR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAyLCA1LCAwICk7Ci0gICAgCi0gICAgTGFiZWwgd3NMYWJlbCA9IG5ldyBMYWJlbCggd3NkbEdyb3VwLCBTV1QuV1JBUCk7Ci0gICAgd3NMYWJlbC5zZXRUZXh0KCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfV1NfU0VMRUNUSU9OKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB3c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgIHdzTGFiZWwuc2V0VG9vbFRpcFRleHQoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BDT05fVEVYVF9XUyApOwotICAgIAotICAgIHdlYlNlcnZpY2VVUkkgPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHdzZGxHcm91cCwgbnVsbCwgCi0gICAgCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUENPTl9URVhUX1dTLCAKLSAgICAJCQkJCQlJTkZPUE9QX1BDT05fVEVYVF9XU0RMLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotICAgIG1vZGlmeUxpc3RlbmVyXyA9Ci0gICAgICBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlV2ViU2VydmljZVVSSU1vZGlmeUV2ZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgCi0gICAgd2ViU2VydmljZVVSSS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcl8pOwotICAgIAotLy8gICAgd2ViU2VydmljZVVSSS5hZGRMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIgKTsKLQotICAgIHdzQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggd3NkbEdyb3VwLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX0JST1dTRSwgCi0gICAgCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QQ09OX0JVVFRPTl9CUk9XU0VfV1MsIAotICAgIAkJCQkJCQkJSU5GT1BPUF9QQ09OX0JVVFRPTl9CUk9XU0VfV1NETCApOwotICAgIHdzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLSAgICAgIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZVdTRExCdXR0b24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVXU0RMQnV0dG9uKCk7Ci0gICAgICAgIH0gCi0gICAgICB9KTsKLQotICAgIHRyZWUgPSBuZXcgV1NETFNlbGVjdGlvblRyZWVXaWRnZXQoKTsKLSAgICB0cmVlLmFkZENvbnRyb2xzKHBhcmVudCwgc3RhdHVzTGlzdGVuZXIpOwotICAgIHRyZWUuc2V0V2ViU2VydmljZXNQYXJzZXIod2ViU2VydmljZXNQYXJzZXIpOyAgICAKLSAgICAKLSAgICBtc2dWaWV3ZXJfID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlVmlld2VyV2lkZ2V0KCk7Ci0gICAgbXNnVmlld2VyXy5hZGRDb250cm9scyhwYXJlbnQsIHN0YXR1c0xpc3RlbmVyKTsKLSAgICAKLSAgICB2YWxpZGF0aW9uU3VtbWFyeVRleHRfID0gbmV3IFRleHQoIHBhcmVudCwgU1dULldSQVApOwotICAgIHZhbGlkYXRpb25TdW1tYXJ5VGV4dF8uc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIEdyaWREYXRhIGdkMSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgdmFsaWRhdGlvblN1bW1hcnlUZXh0Xy5zZXRMYXlvdXREYXRhKGdkMSk7Ci0gICAgdmFsaWRhdGlvblN1bW1hcnlUZXh0Xy5zZXRUb29sVGlwVGV4dCggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfVkFMSURBVEVfVEVYVF9NRVNTQUdFX1NVTU1BUlkgKTsKLSAgICAKLSAgICB2YWxpZGF0aW9uU3VtbWFyeVRleHQyXyA9IG5ldyBUZXh0KCBwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICB2YWxpZGF0aW9uU3VtbWFyeVRleHQyXy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgdmFsaWRhdGlvblN1bW1hcnlUZXh0Ml8uc2V0TGF5b3V0RGF0YShnZDEpOwotICAgIAotICAgIHN0b3BWYWxpZGF0aW9uQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIAotICAgIAkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9CVVRUT05fU1RPUF9XU0RMX1ZBTElEQVRJT04sIAotICAgIAkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1NUT1BfVkFMSURBVElPTl9CVVRUT04sIAotICAgIAkJCUlORk9QT1BfUENPTl9CVVRUT05fU1RPUF9WQUxJREFUSU9OKTsKLSAgICBzZXRWYWxpZGF0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7Ci0gICAgCi0gICAgc3RvcFZhbGlkYXRpb25CdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotICAgIAkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAJCXsKLSAgICAJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgCQkJewotICAgIAkJCQloYW5kbGVTdG9wVmFsaWRhdGlvbkJ1dHRvbigpOwotICAgIAkJCX0KLQotICAgIAkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgIAkJCXsKLSAgICAJCQkJaGFuZGxlU3RvcFZhbGlkYXRpb25CdXR0b24oKTsKLSAgICAJCQl9IAotICAgIAkJfSk7Ci0gICAgCi0gICAgc2V0TWVzc2FnZVN1bW1hcnkoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldE1lc3NhZ2VTdW1tYXJ5KCkgewotCSAgU3RyaW5nIHZhbGlkYXRpb25NZXNzYWdlU3VtbWFyeSA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NRVNTQUdFX1ZBTElEQVRFX05PX1dTREw7Ci0JICBQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0IHdzZGxWYWxpZGF0aW9uQ29udGV4dCA9IFdTUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETFZhbGlkYXRpb25Db250ZXh0KCk7Ci0JICBTdHJpbmcgdmFsaWRhdGlvblNlbGVjdGlvbiA9IHdzZGxWYWxpZGF0aW9uQ29udGV4dC5nZXRQZXJzaXN0ZW50V1NETFZhbGlkYXRpb24oKTsKLQkgIGlmIChQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0LlZBTElEQVRFX1JFTU9URV9XU0RMLmVxdWFscyh2YWxpZGF0aW9uU2VsZWN0aW9uKSkgewotCQkgIHZhbGlkYXRpb25NZXNzYWdlU3VtbWFyeSA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NRVNTQUdFX1ZBTElEQVRFX1JFTU9URV9XU0RMOwotCSAgfSBlbHNlIGlmIChQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0LlZBTElEQVRFX0FMTF9XU0RMLmVxdWFscyh2YWxpZGF0aW9uU2VsZWN0aW9uKSkgewotCQkgIHZhbGlkYXRpb25NZXNzYWdlU3VtbWFyeSA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NRVNTQUdFX1ZBTElEQVRFX0FMTF9XU0RMOwotCSAgfQotCSAgdmFsaWRhdGlvblN1bW1hcnlUZXh0Xy5zZXRUZXh0KCB2YWxpZGF0aW9uTWVzc2FnZVN1bW1hcnkgKTsKLQkgIHZhbGlkYXRpb25TdW1tYXJ5VGV4dDJfLnNldFRleHQoIiAiKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdlYlNlcnZpY2VVUklNb2RpZnlFdmVudCgpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZVVSSS5nZXRUZXh0KCkuaW5kZXhPZignOicpID4gMCkgewotICAgICAgdGltZXJfID0gVGltZXIubmV3SW5zdGFuY2UodGltZXJfLCBEaXNwbGF5LmdldEN1cnJlbnQoKSwgdGhpcyk7Ci0gICAgICB0aW1lcl8uc3RhcnRUaW1lcigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBoYW5kbGVXZWJTZXJ2aWNlVVJJKCk7Ci0gICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlV2ViU2VydmljZVVSSSgpIHsKLQkgIGhhbmRsZVdlYlNlcnZpY2VVUkkod2ViU2VydmljZVVSSS5nZXRUZXh0KCkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlV2ViU2VydmljZVVSSShTdHJpbmcgd3NVUkkpCi0gIHsgICAgCi0gICAgaWYgKHdzVVJJLmluZGV4T2YoJzonKSA8IDApCi0gICAgewotICAgICAgSUZpbGUgZmlsZSA9IHVyaTJJRmlsZSh3c1VSSSk7Ci0gICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgICB3c1VSSSA9IGlGaWxlMlVSSShmaWxlKTsKLSAgICB9Ci0gICAgaWYgKHdzVVJJICE9IG51bGwgJiYgd3NVUkkuaW5kZXhPZignOicpID49IDAgJiYgd2ViU2VydmljZXNQYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzVVJJKSA9PSBudWxsKQotICAgIHsKLSAgICAgIFRpbWVkV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQgY21kID0gbmV3IFRpbWVkV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQoKTsKLSAgICAgIGNtZC5zZXRXZWJTZXJ2aWNlc1BhcnNlcih3ZWJTZXJ2aWNlc1BhcnNlcik7Ci0gICAgICBjbWQuc2V0V2ViU2VydmljZVVSSSh3c1VSSSk7Ci0gICAgICBjbWQuZXhlY3V0ZShudWxsLCBudWxsKTsKLSAgICB9Ci0gICAgV2ViU2VydmljZUVudGl0eSBlbnRpdHkgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod3NVUkkpOwotICAgIGlmIChlbnRpdHkgIT0gbnVsbCAmJiBlbnRpdHkuZ2V0VHlwZSgpID09IFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMKQotICAgICAgdHJlZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBlbHNlCi0gICAgICB0cmVlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgdHJlZS5zZXRXZWJTZXJ2aWNlVVJJKHdzVVJJKTsKLSAgICB0cmVlLnJlZnJlc2hUcmVlVmlld2VyKCk7ICAKLSAgICB3c2RsVVJJXyA9IHdzVVJJOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaGFuZGxlV2ViU2VydmljZVVSSSgpOwotICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVXU0RMQnV0dG9uKCkKLSAgewotICAgIERpYWxvZ1Jlc291cmNlQnJvd3NlciBkaWFsb2cgPSBuZXcgRGlhbG9nUmVzb3VyY2VCcm93c2VyKCBwYXJlbnRfLmdldFNoZWxsKCksIG51bGwsIHdzRmlsdGVyXyk7Ci0gICAgZGlhbG9nLm9wZW4oKTsKLSAgICBJUmVzb3VyY2UgcmVzID0gZGlhbG9nLmdldEZpcnN0U2VsZWN0aW9uKCk7Ci0gICAgaWYoIHJlcyAhPSBudWxsICkKLSAgICB7Ci0gICAgCXdzZGxVUklfID0gcmVzLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAJd2ViU2VydmljZVVSSS5zZXRUZXh0KCB3c2RsVVJJXyApOyAgICAJCi0gICAgfQotICAgIAkKLSAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRWYWxpZGF0aW9uSW5Qcm9ncmVzcyhib29sZWFuIHZhbGlkYXRpbmcpIHsKLQkgIHN0b3BWYWxpZGF0aW9uQnV0dG9uXy5zZXRFbmFibGVkKHZhbGlkYXRpbmcpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlU3RvcFZhbGlkYXRpb25CdXR0b24oKQotICB7Ci0JICBJSm9iTWFuYWdlciAgICBqb2JNYW5hZ2VyICAgICA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkgIEpvYltdICAgICAgICAgIGpvYnMgICAgICAgICAgID0gam9iTWFuYWdlci5maW5kKCBWYWxpZGF0ZVdTRExKb2IuVkFMSURBVEVfV1NETF9KT0JfRkFNSUxZICk7Ci0JICBWYWxpZGF0ZVdTRExKb2IgZXhpc3RpbmdWYWxpZGF0ZVdTRExKb2IgPSBudWxsOwotCSAgCi0JICBpZiggam9icy5sZW5ndGggPiAwICkKLQkgIHsKLQkJICBmb3IgKGludCBpPTA7IGk8am9icy5sZW5ndGg7IGkrKykgewotCQkJICBleGlzdGluZ1ZhbGlkYXRlV1NETEpvYiA9IChWYWxpZGF0ZVdTRExKb2Ipam9ic1tpXTsKLQotCQkJICBpZiAoZXhpc3RpbmdWYWxpZGF0ZVdTRExKb2IuZ2V0U3RhdGUoKSAhPSBKb2IuTk9ORSkgeyAKLQkJCQkgIGV4aXN0aW5nVmFsaWRhdGVXU0RMSm9iLmNhbmNlbCgpOwotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgY2xlYXJWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLQkgIHNldFZhbGlkYXRpb25JblByb2dyZXNzKGZhbHNlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNsZWFyVmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCSAgbXNnVmlld2VyXy5jbGVhcklucHV0KCk7Ci0JICB2YWxpZGF0aW9uU3VtbWFyeVRleHRfLnNldFRleHQoIiAiICk7Ci0JICB2YWxpZGF0aW9uU3VtbWFyeVRleHQyXy5zZXRUZXh0KCIgIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICAvLyBUaW1lciB2YWxpZGF0aW9uCi0gICAgLyoKLSAgICAgKiBDb21tZW50aW5nIG91dCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgZmFzdCB0eXBlcnMgZnJvbSBoaXR0aW5nIE5leHQvRmluaXNoIAotICAgIGlmIChUaW1lci5pc1J1bm5pbmcoKSkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9NU0dfTE9BRElOR19XRUJfU0VSVklDRV9VUkksIFN0YXR1cy5FUlJPUik7Ci0gICAgKi8KLQkKLSAgICAvLyBWYWxpZGF0ZSB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBXZWIgc2VydmljZSBVUkkKLSAgICAvLyBGb3IgZXhhbXBsZSwgaXMgaXQgcG9pbnRpbmcgdG8gYW4gZXhpc3RpbmcgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZT8KLSAgICBTdHJpbmcgd3NQYXRoICA9IHdlYlNlcnZpY2VVUkkuZ2V0VGV4dCgpOwotICAgIGlmKCB3c1BhdGggPT0gbnVsbCB8fCB3c1BhdGgubGVuZ3RoKCkgPD0gMCApIHsKLSAgICAJY2xlYXJWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLSAgICAJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9NU0dfSU5WQUxJRF9XRUJfU0VSVklDRV9VUkkgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiggd3NQYXRoLmluZGV4T2YoJzonKSA8IDAgKQotICAgIHsKLSAgICAJSVJlc291cmNlIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdzUGF0aCk7Ci0gICAgCWlmKCByZXMgPT0gbnVsbCApIHsKLSAgICAJCWNsZWFyVmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gICAgCQlyZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX01TR19OT19TVUNIX0ZJTEUsIG5ldyBPYmplY3RbXSB7d3NQYXRofSkgKTsKLSAgICAJfQotICAgIAllbHNlIGlmKCByZXMuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFICkgewotICAgIAkJY2xlYXJWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLSAgICAJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfTVNHX0lOVkFMSURfV0VCX1NFUlZJQ0VfVVJJICk7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAKLSAgICAvLyBWYWxpZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgV2ViIHNlcnZpY2UgVVJJCi0gICAgLy8gRm9yIGV4YW1wbGUsIGlzIHNlbGVjdGlvbiBhIFdTREwgVVJJPwotICAgIGlmICghVGltZXIuaXNSdW5uaW5nKHRpbWVyXykgJiYgdHJlZS5pc0VuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IHRyZWUuZ2V0U3RhdHVzKCk7Ci0gICAgICBpZiAoc3RhdHVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gU3RhdHVzLkVSUk9SIHx8IHNldmVyaXR5ID09IFN0YXR1cy5XQVJOSU5HKSB7Ci0gICAgICAgIAljbGVhclZhbGlkYXRpb25NZXNzYWdlcygpOwotICAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlpZiggd3NQYXRoLmluZGV4T2YoJzonKSA8IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHdzZGxVUkkgPSBpRmlsZTJVUkkoKElGaWxlKVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdzUGF0aCkpOwotICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKSA9PSBudWxsKSB7Ci0gICAgICAgIAkgIGNsZWFyVmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gICAgICAgIAkgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9NU0dfU0VMRUNUSU9OX01VU1RfQkVfV1NETCApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBpZiAoIVRpbWVyLmlzUnVubmluZyh0aW1lcl8pKSB7Ci0gICAgCVN0cmluZyB3c2RsVVJJMSA9IHdzUGF0aDsKLSAgICAJIGJvb2xlYW4gaXNSZW1vdGUgPSB0cnVlOwotICAgIAlpZiAodHJlZS5pc0VuYWJsZWQoKSkgeyAvLyBpcyB3c2lsCi0gICAgCQl3c2RsVVJJMSA9IHRyZWUuZ2V0V3NkbFVSSSgpOwotICAgIAkJaWYgKHdzZGxVUkkxLnN0YXJ0c1dpdGgoImZpbGU6IikgfHwgd3NkbFVSSTEuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpCi0gICAgCQl7Ci0gICAgCQkJaXNSZW1vdGUgPSBmYWxzZTsKLSAgICAJCX0KLSAgICAJfSBlbHNlIHsKLSAgICAJCWlmICh3c1BhdGguaW5kZXhPZignOicpIDwgMCkKLSAgICAJCXsKLSAgICAJCQlpc1JlbW90ZSA9IGZhbHNlOwotICAgIAkJCXdzZGxVUkkxID0gaUZpbGUyVVJJKChJRmlsZSlSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3c1BhdGgpKTsKLSAgICAJCX0KLSAgICAJCWVsc2UgaWYgKHdzUGF0aC5zdGFydHNXaXRoKCJmaWxlOiIpIHx8IHdzUGF0aC5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSkKLSAgICAJCXsKLSAgICAJCQlpc1JlbW90ZSA9IGZhbHNlOwotICAgIAkJfQotICAgIAl9Ci0gIAkgIAotICAgICAgc2V0TWVzc2FnZVN1bW1hcnkoKTsKLQkgIG1zZ1ZpZXdlcl8uY2xlYXJJbnB1dCgpOwotICAJICB2YWxpZGF0ZVdTREwod3NkbFVSSTEsIGlzUmVtb3RlKTsKLSAgICB9Ci0gICAgCi0KLSAgICAvLyBPSyBzdGF0dXMKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlV1NETCAoU3RyaW5nIHdzZGxVUkksIGJvb2xlYW4gaXNSZW1vdGUpIHsKLQotCSAgU3RyaW5nIHZhbGlkYXRpb25TZWxlY3Rpb24gPSBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTRExWYWxpZGF0aW9uQ29udGV4dCgpLmdldFBlcnNpc3RlbnRXU0RMVmFsaWRhdGlvbigpOzsKLQkgIGlmICgoUGVyc2lzdGVudFdTRExWYWxpZGF0aW9uQ29udGV4dC5WQUxJREFURV9BTExfV1NETC5lcXVhbHModmFsaWRhdGlvblNlbGVjdGlvbikpIHx8Ci0JCQkgIChQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0LlZBTElEQVRFX1JFTU9URV9XU0RMLmVxdWFscyh2YWxpZGF0aW9uU2VsZWN0aW9uKSAmJiBpc1JlbW90ZSkpIHsKLQotCQkgIElKb2JNYW5hZ2VyICAgIGpvYk1hbmFnZXIgICAgID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpOwotCQkgIEpvYltdICAgICAgICAgIGpvYnMgICAgICAgICAgID0gam9iTWFuYWdlci5maW5kKCBWYWxpZGF0ZVdTRExKb2IuVkFMSURBVEVfV1NETF9KT0JfRkFNSUxZICk7Ci0JCSAgVmFsaWRhdGVXU0RMSm9iIGV4aXN0aW5nVmFsaWRhdGVXU0RMSm9iID0gbnVsbDsKLQkJICAKLQkJICBib29sZWFuIHN0YXJ0V1NETFZhbGlkYXRpb24gPSB0cnVlOwotCQkgIHZhbGlkYXRpb25TdW1tYXJ5VGV4dF8uc2V0VGV4dCggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1FU1NBR0VfVkFMSURBVEVfSU5fUFJPR1JFU1MgKTsKLQkJICB2YWxpZGF0aW9uU3VtbWFyeVRleHQyXy5zZXRUZXh0KCIgIik7Ci0JCSAgaWYoIGpvYnMubGVuZ3RoID4gMCApCi0JCSAgewotCQkJICBmb3IgKGludCBpPTA7IGk8am9icy5sZW5ndGg7IGkrKykgewotCQkJCSAgZXhpc3RpbmdWYWxpZGF0ZVdTRExKb2IgPSAoVmFsaWRhdGVXU0RMSm9iKWpvYnNbaV07Ci0JCQkJICAKLQkJCQkgIGlmIChleGlzdGluZ1ZhbGlkYXRlV1NETEpvYi5nZXRTdGF0ZSgpICE9IEpvYi5OT05FKSB7IAotCQkJCQkgIC8vIEpvYiBydW5uaW5nIG9yIHRvIGJlIHJ1bgotCQkJCQkgIC8vIElmIHRoZSBqb2IgaXMgdmFsaWRhdGluZyB0aGUgc2FtZSB3c2RsVVJJLCBsZXQgaXQgZmluaXNoIHJ1bm5pbmcgYW5kIGlnbm9yZSB0aGlzIG9uZS4KLQkJCQkJICAvLyBJdCBpcyBub3QgZm9yIHRoZSBzYW1lIHdzZGxVUkksIGNhbmNlbCB0aGUgam9iIGFuZCBzY2hlZHVsZSB0aGlzIG9uZS4KLQotCQkJCQkgIGlmICghd3NkbFVSSS5lcXVhbHMoZXhpc3RpbmdWYWxpZGF0ZVdTRExKb2IuZ2V0V3NkbFVSSSgpKSkgewotCQkJCQkJICBleGlzdGluZ1ZhbGlkYXRlV1NETEpvYi5jYW5jZWwoKTsKLQkJCQkJCSAgc2V0VmFsaWRhdGlvbkluUHJvZ3Jlc3MoZmFsc2UpOwotCQkJCQkgIH0gZWxzZSB7CQkJCQkJICAKLQkJCQkJCSAgc3RhcnRXU0RMVmFsaWRhdGlvbiA9IGZhbHNlOwotCQkJCQkgIH0KLQkJCQkgIH0gCi0JCQkgIH0KLQkJICB9IAotCQkgIAotCQkgIGlmIChzdGFydFdTRExWYWxpZGF0aW9uKSB7Ci0JCQkgIHN0YXJ0V1NETFZhbGlkYXRpb25Kb2Iod3NkbFVSSSk7Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc3RhcnRXU0RMVmFsaWRhdGlvbkpvYiAoU3RyaW5nIHdzZGxVUkkpIHsKLQkgIHZhbGlkYXRlV1NETEpvYl8gPSBuZXcgVmFsaWRhdGVXU0RMSm9iKHdzZGxVUkkpOwotCSAgdmFsaWRhdGVXU0RMSm9iXy5hZGRKb2JDaGFuZ2VMaXN0ZW5lciggam9iQ2hhbmdlQWRhcHRlcl8gKTsKLQkgIHZhbGlkYXRlV1NETEpvYl8uc2NoZWR1bGUoKTsKLQkgIHNldFZhbGlkYXRpb25JblByb2dyZXNzKHRydWUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB1cGRhdGVWYWxpZGF0aW9uU3VtbWFyeShpbnQgbWVzc2FnZVNldmVyaXR5KQotICB7Ci0gIAkKLSAgCXN3aXRjaCAobWVzc2FnZVNldmVyaXR5KSB7Ci0gIAljYXNlIElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfRVJST1I6Ci0JCXZhbGlkYXRpb25TdW1tYXJ5VGV4dF8uc2V0VGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuRVJST1JfTUVTU0FHRVNfSU5fVkFMSURBVElPTik7Ci0JCXZhbGlkYXRpb25TdW1tYXJ5VGV4dDJfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLldBUk5JTkdfSUZfQ09OVElOVUUpOwotCQlicmVhazsKLQljYXNlIElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORzoKLQkJdmFsaWRhdGlvblN1bW1hcnlUZXh0Xy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5XQVJOSU5HX01FU1NBR0VTX0lOX1ZBTElEQVRJT04pOwotCQl2YWxpZGF0aW9uU3VtbWFyeVRleHQyXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5XQVJOSU5HX0lGX0NPTlRJTlVFKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdmFsaWRhdGlvblN1bW1hcnlUZXh0Xy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5WQUxJREFUSU9OX0NPTVBMRVRFRCk7Ci0JCXZhbGlkYXRpb25TdW1tYXJ5VGV4dDJfLnNldFRleHQoIiAiKTsKLQkJYnJlYWs7Ci0JfQotICB9Ci0gIAotICBwcml2YXRlIElGaWxlIHVyaTJJRmlsZShTdHJpbmcgdXJpKQotICB7Ci0gICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih1cmkpOwotICAgIAotICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHJldHVybiAoSUZpbGUpcmVzOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBpRmlsZTJVUkkoSUZpbGUgZmlsZSkKLSAgewotICAJRmlsZSBmID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBmLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIFN0cmluZyB3c2RsVVJJID0gdG9Xc2RsVVJJKG9iamVjdCk7ICAKLSAgICAgIHdzZGxVUklfID0gd3NkbFVSSTsKLSAgICAgIAotICAgICAgaWYgKHdzZGxVUkkgIT0gbnVsbCAmJiB3ZWJTZXJ2aWNlVVJJICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGhhbmRsZVdlYlNlcnZpY2VVUkkod3NkbFVSSSk7Ci0gICAgCQotICAgICAgICB3ZWJTZXJ2aWNlVVJJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyXyk7Ci0gICAgICAgIHdlYlNlcnZpY2VVUkkuc2V0VGV4dChnZXRPYmplY3RTZWxlY3Rpb25EaXNwbGF5YWJsZVN0cmluZygpKTsgICAgICAgCi0gICAgICAgIHdlYlNlcnZpY2VVUkkuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXJfKTsKLSAgICAgIH0KLSAgICB9ICAKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgdG9Xc2RsVVJJKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoKFNlcnZpY2VJbXBsKW9iamVjdCk7Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkKLSAgICAgIHJldHVybiBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoV1NETFJlc291cmNlSW1wbClvYmplY3QpOwotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpCi0gICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoKFNlcnZpY2VSZWYpb2JqZWN0KTsKLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHJldHVybiAoKElGaWxlKW9iamVjdCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHJldHVybiAoU3RyaW5nKW9iamVjdDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpCi0gIHsKLQkgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3M7IAotCSAgaWYgKHRyZWUgIT0gbnVsbCAmJiB0cmVlLmdldFdzZGxVUkkoKSAhPSBudWxsKQotCQkgIHNzID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odHJlZS5nZXRXc2RsVVJJKCkpOwotCSAgZWxzZQotCQkgIHNzID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24od3NkbFVSSV8pOwotCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbiggCi0gICAgICAgICAgICAgICBuZXcgV1NETFNlbGVjdGlvbldyYXBwZXIoIHdlYlNlcnZpY2VzUGFyc2VyLCBzcykpOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0JU3RyaW5nIHdzZGxVUkk7Ci0KLQlpZiAodHJlZSAhPSBudWxsKQotICAgICAgIHdzZGxVUkkgPSB0cmVlLmdldFdzZGxVUkkoKTsKLQllbHNlCi0JCXdzZGxVUkkgPSB3c2RsVVJJXzsKLQkKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIElQcm9qZWN0IHAgPSBnZXRQcm9qZWN0RnJvbVVSSSh3c2RsVVJJKTsKLSAgICAgIGlmIChwIT1udWxsICYmIHAuZXhpc3RzKCkpCi0gICAgICAgIHJldHVybiBwOwotICAgICAgCi0gICAgICBTdHJpbmcgd3NSZWxQYXRoID0gd3NkbFVSSV87Ci0gICAgICBJUmVzb3VyY2Ugd3NSZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3c1JlbFBhdGgpOwotICAgICAgaWYgKHdzUmVzIT1udWxsICYmIHdzUmVzIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICB7Ci0gICAgICAgIElQcm9qZWN0IHAyID0gKChJRmlsZSl3c1JlcykuZ2V0UHJvamVjdCgpOwotICAgICAgICByZXR1cm4gcDI7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpCi0gIHsKLQkgCi0gICAgU3RyaW5nIHdzZGxVUkk7Ci0gICAgaWYgKHRyZWUgIT0gbnVsbCkKLSAgICAJd3NkbFVSSSA9IHRyZWUuZ2V0V3NkbFVSSSgpOwotICAgIGVsc2UgCi0gICAgCXdzZGxVUkkgPSB3c2RsVVJJXzsKLSAgICAKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBjbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVVJJKHdzZGxVUkkpOwotICAgICAgaWYgKGNuYW1lIT1udWxsICYmIGNuYW1lLmxlbmd0aCgpPjApCi0gICAgICAgIHJldHVybiBjbmFtZTsKLSAgICAgIAotICAgICAgU3RyaW5nIHdzUmVsUGF0aCA9IHdzZGxVUklfOwotICAgICAgSVJlc291cmNlIHdzUmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uod3NSZWxQYXRoKTsKLSAgICAgIGlmICh3c1JlcyE9bnVsbCAmJiB3c1JlcyBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZih3c1Jlcyk7Ci0gICAgICAgIGlmIChjb21wIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIFN0cmluZyB3a3NwY1Jvb3RMb2MgPSByb290LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICBpbnQgaWR4ID0gdXJpLmluZGV4T2Yod2tzcGNSb290TG9jKTsKLSAgICBpZiAoaWR4ICE9IC0xKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVsUGF0aCA9IHVyaS5zdWJzdHJpbmcod2tzcGNSb290TG9jLmxlbmd0aCgpK2lkeCk7Ci0gICAgICBJUmVzb3VyY2UgcmVzID0gcm9vdC5maW5kTWVtYmVyKG5ldyBQYXRoKHJlbFBhdGgpKTsKLSAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgICAgSVByb2plY3QgcCA9ICgoSUZpbGUpcmVzKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHJldHVybiBwOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZUZyb21VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIFN0cmluZyB3a3NwY1Jvb3RMb2MgPSByb290LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICBpbnQgaWR4ID0gdXJpLmluZGV4T2Yod2tzcGNSb290TG9jKTsKLSAgICBpZiAoaWR4ICE9IC0xKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVsUGF0aCA9IHVyaS5zdWJzdHJpbmcod2tzcGNSb290TG9jLmxlbmd0aCgpK2lkeCk7Ci0gICAgICBJUmVzb3VyY2UgcmVzID0gcm9vdC5maW5kTWVtYmVyKG5ldyBQYXRoKHJlbFBhdGgpKTsKLSAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YocmVzKTsKLSAgICAgICAgaWYgKGNvbXAhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY29tcC5nZXROYW1lKCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uRGlzcGxheWFibGVTdHJpbmcoKSAKLSAgewkKLSAgICBpZiAodHJlZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0cmFuc2Zvcm1lcl8udG9QYXRoKHRyZWUuZ2V0V3NkbFVSSSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkgICAgcmV0dXJuIHRyYW5zZm9ybWVyXy50b1BhdGgod3NkbFVSSV8pOwotICAgIH0KLQl9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0V2lkZ2V0U2l6ZSgpIHsJCi0JICByZXR1cm4gbmV3IFBvaW50KCA1ODAsIDU4MCk7ICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoU3RyaW5nIHMpIHsKLQkgIFN0cmluZyB3c1VSSSA9IHM7Ci0JICAgIAotCSAgICBpZiAod3NVUkkuaW5kZXhPZignOicpIDwgMCkKLQkgICAgewotCSAgICAgIElGaWxlIGZpbGUgPSB1cmkySUZpbGUod3NVUkkpOwotCSAgICAgIGlmIChmaWxlICE9IG51bGwpCi0JICAgICAgICB3c1VSSSA9IGlGaWxlMlVSSShmaWxlKTsKLQkgICAgfQotCSAgICBpZiAod3NVUkkgIT0gbnVsbCAmJiB3c1VSSS5pbmRleE9mKCc6JykgPj0gMCAmJiB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod3NVUkkpID09IG51bGwpCi0JICAgIHsKLQkgICAgICBUaW1lZFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kIGNtZCA9IG5ldyBUaW1lZFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kKCk7Ci0JICAgICAgY21kLnNldFdlYlNlcnZpY2VzUGFyc2VyKHdlYlNlcnZpY2VzUGFyc2VyKTsKLQkgICAgICBjbWQuc2V0V2ViU2VydmljZVVSSSh3c1VSSSk7Ci0JICAgICAgY21kLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JICAgIH0KLQkJCi0JICAgIC8vIHByaW1lIHdpZGdldCBiYXNlZCBvbiB0aGUgc3RyaW5nCi0JICAgIHdzZGxVUklfID0gd3NVUkk7Ci0JICAgIGlmICh0cmVlICE9IG51bGwpCi0JICAgICAgdHJlZS5zZXRXZWJTZXJ2aWNlVVJJKHdzVVJJKTsKLQkgICAgCi0JICAgIFdlYlNlcnZpY2VFbnRpdHkgZW50aXR5ID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzVVJJKTsKLQkgICAgaWYgKGVudGl0eSAhPSBudWxsICYmIGVudGl0eS5nZXRUeXBlKCkgPT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpCi0gICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIGVsc2UKLQkgICAgCXJldHVybiBmYWxzZTsKLQkgICAgCi0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTZjMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSB2ZXJ5IHNpbXBsZSB3cmFwcGVyIHRoYXQgYmluZHMgYSBXU0RMIHBhcnNlciB3aXRoCi0gKiBhIHdzZGxTZWxlY3Rpb24gb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbldyYXBwZXIgCi17Ci0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciAgICBwYXJzZXI7Ci0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiB3c2RsU2VsZWN0aW9uOwotICAKLSAgcHVibGljIFdTRExTZWxlY3Rpb25XcmFwcGVyKCBXZWJTZXJ2aWNlc1BhcnNlciAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotICAgIHRoaXMucGFyc2VyICAgICAgICA9IHBhcnNlcjsKLSAgICB0aGlzLndzZGxTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL0NsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWVkMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDEzMSAxMjEwNzEgICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwMjA2IDEyNjQwOCAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjAyMjEgICAxMTkxMTEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDIyMiAgIDExNTgzNCByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwMjI3ICAgMTI0MzkyIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjAzMTUgICAxMzE5NjMgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQxOCAgIDEyOTY4OCByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI3ICAgMTI2NzgwIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjcgICAxMjY3ODAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNDI3ICAgMTM4MDU4IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNTIzICAgMTMzNzE0IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNTI1ICAgMTQzODQzIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwOTA1ICAgMTU2MjMwIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuLCBIYW5kbGluZyBwcm9qZWN0cyB3aXRoIG5vIHRhcmdldCBydW50aW1lCi0gKiAyMDA3MDMyNiAgIDE1OTQ1OCBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5GYWNldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5GYWNldE1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5GYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uUmVxdWlyZWRGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkRlZmF1bHRpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlZhbGlkYXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlByb2plY3RUb3BvbG9neUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuQ2xpZW50UnVudGltZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuRmFjZXRNYXRjaENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlJ1bnRpbWVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlNlcnZpY2VSdW50aW1lRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5TaW1wbGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU3RhdGU7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgoteyAgIAotICBwcml2YXRlIFN0cmluZyBERUZBVUxUX0NMSUVOVF9FQVJfUFJPSkVDVF9FWFQgPSAiRUFSIjsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciAgICBjbGllbnRJZHNfOwotICBwcml2YXRlIGJvb2xlYW4gY2xpZW50SWRzRml4ZWRfID0gZmFsc2U7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFJ1bnRpbWVJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50RWFyUHJvamVjdE5hbWVfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjbGllbnROZWVkRUFSXyA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudENvbXBvbmVudFR5cGVfOwotICBwcml2YXRlIEZhY2V0TWF0Y2hlciBjbGllbnRGYWNldE1hdGNoZXJfOwotICAKLSAgcHJpdmF0ZSBJQ29udGV4dCAgICAgICAgICBjb250ZXh0XzsKLSAgcHJpdmF0ZSBJU2VsZWN0aW9uICAgICAgICBzZWxlY3Rpb25fOwotICBwcml2YXRlIElXZWJTZXJ2aWNlQ2xpZW50IHdlYlNlcnZpY2VDbGllbnRfOwotICBwcml2YXRlIFJlc291cmNlQ29udGV4dCAgIHJlc291cmNlQ29udGV4dF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgdGVzdF87Ci0gIAotICAvL0Egbm90ZSBvbiBpbml0aWFsIHByb2plY3RzIC4uLgotICAvL1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gY2xpZW50SW5pdGlhbFByb2plY3RfIGFuZCBpbml0aWFsUHJvamVjdF8gaXMgdGhhdAotICAvL2NsaWVudEluaXRpYWxQcm9qZWN0XyBjb21lcyBmcm9tIHRoZSBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kIHdoaWxlIGluaXRpYWxQcm9qZWN0XwotICAvL2NvbWVzIGZyb20gU2VsZWN0aW9uQ29tbWFuZCAoaS5lLiBpdCBpcyB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSB0aGluZyB0aGF0IHdhcyBzZWxlY3RlZCBiZWZvcmUgCi0gIC8vdGhlIHdpemFyZCB3YXMgbGF1bmNoZWQpLiBJbiB0aGUgZGVmYXVsdGluZyBhbGdvcml0aG0sIGNsaWVudEluaXRpYWxQcm9qZWN0XyB3aWxsIAotICAvL2JlIGdpdmVuIGZpcnN0IHByaW9yaXR5LiBJZiwgaG93ZXZlciwgaXQgaXMgZGVlbWVkIHRoYXQgY2xpZW50SW5pdGlhbFByb2plY3RfIGlzIG5vdCBhIHZhbGlkIHByb2plY3QgCi0gIC8vYmVjYXVzZSBpdCBjb250YWlucyB0aGUgSjJFRSBXZWIgc2VydmljZSBmb3Igd2hpY2ggd2UgYXJlIHRyeWluZyB0byBjcmVhdGUgYSBjbGllbnQsIGluaXRpYWxQcm9qZWN0XwotICAvL3dpbGwgYmUgZ2l2ZW4gc2Vjb25kIHByaW9yaXR5LgotICBwcml2YXRlIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0XzsgLy9UaGlzIGlzIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGlvbiBwcmlvciB0byB0aGUgd2l6YXJkIGJlaW5nIGxhdW5jaGVkLgotICBwcml2YXRlIElQcm9qZWN0IGNsaWVudEluaXRpYWxQcm9qZWN0XzsgLy9UaGlzIGlzIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIG9iamVjdCBzZWxlY3Rpb24gZnJvbSBwYWdlIDIuCi0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUklfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcl87ICAKLQotICBwdWJsaWMgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgY2xpZW50SWRzXyA9IGlkczsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBjbGllbnRJZHNfOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWRzRml4ZWQoYm9vbGVhbiBiKQotICB7Ci0gICAgY2xpZW50SWRzRml4ZWRfID0gYjsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFJ1bnRpbWVJZCgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50UnVudGltZUlkXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50UHJvamVjdE5hbWVfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEVhclByb2plY3ROYW1lKCkKLSAgewotICAgIHJldHVybiBjbGllbnRFYXJQcm9qZWN0TmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEVhclByb2plY3ROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgY2xpZW50RWFyUHJvamVjdE5hbWVfID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRDb21wb25lbnRUeXBlKCkKLSAgewotICAgIHJldHVybiAgY2xpZW50Q29tcG9uZW50VHlwZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlQ2xpZW50XzsgIAotICB9Ci0gICAgCi0gIHB1YmxpYyBJQ29udGV4dCBnZXRDb250ZXh0KCkKLSAgewotICAgIHJldHVybiBjb250ZXh0XzsKLSAgfSAgCi0gIAotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGlvbl87ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogRGVmYXVsdHMgdGhlIGZvbGxvd2luZyBiaXRzIG9mIGluZm9ybWF0aW9uIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gICAqIGNsaWVudFJ1bnRpbWVJZF8gOiB0aGUgY2xpZW50UnVudGltZUlkLiBNdXN0IGJlIGRlZmF1bHRlZCB0byBub24tZW1wdHkgU3RyaW5nLgotICAgKiBjbGllbnRJZHNfLnJ1bnRpbWVJZF86IHRoZSBXZWIgc2VydmljZSBydW50aW1lIGlkLiBNdXN0IGJlIGRlZmF1bHRlZCB0byBub24tZW1wdHkgU3RyaW5nLgotICAgKiBjbGllbnRQcm9qZWN0TmFtZV8gOiB0aGUgbmFtZSBvZiB0aGUgY2xpZW50IHByb2plY3QuIE11c3QgYmUgbm9uLWVtcHR5LiBNYXkgb3IgbWF5IG5vdCBleGlzdC4KLSAgICogY2xpZW50Q29tcG9uZW50VHlwZV86IHRoZSBpZCBvZiB0aGUgY2xpZW50IHByb2plY3QgdGVtcGxhdGUuIE11c3QgYmUgZW1wdHkgaWYgdGhlIGNsaWVudAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QgZXhpc3RzLiBNdXN0IGJlIG5vbi1lbXB0eSBvZiB0aGUgY2xpZW50IHByb2plY3QgZG9lcyBub3QgZXhpc3QuCi0gICAqIGNsaWVudElkc18uc2VydmVySWRfOiB0aGUgc2VydmVyIHR5cGUgaWQuIE1heSBiZSBhbiBlbXB0eSBTdHJpbmcgaWYgdGhlIGRlZmF1bHRlZCBXZWIgc2VydmljZSBydW50aW1lCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgcmVxdWlyZSBhIHNlcnZlci4KLSAgICogY2xpZW50SWRzXy5zZXJ2ZXJJbnN0YW5jZUlkXzogdGhlIHNlcnZlciBpZC4gTWF5IGJlIG51bGwgb3IgYW4gZW1wdHkgU3RyaW5nLgotICAgKiBjbGllbnROZWVkRUFSXzogdHJ1ZSBpZiBhbiBFQVIgaXMgbmVlZGVkLiBGYWxzZSBvdGhlcndpc2UuCi0gICAqIGNsaWVudEVhclByb2plY3ROYW1lXzogdGhlIGNsaWVudCBFQVIgcHJvamVjdC4gTXVzdCBiZSBlbXB0eSBpZiB0aGUgY2xpZW50TmVlZEVBUl8gaXMgZmFsc2UuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgbm9uLWVtcHR5IGlmIHRoZSBjbGllbnROZWVkRUFSXyBpcyB0cnVlLgotICAgKiB3ZWJTZXJ2aWNlQ2xpZW50XyA6IHRoZSBJV2ViU2VydmljZUNsaWVudCBiYXNlZCBvbiB0aGUgY2FsY3VsYXRlZCBkZWZhdWx0cy4gTXVzdCBiZSBub24tbnVsbCBmb3IgIk5leHQiCi0gICAqICAgICAgICAgICAgICAgICAgICAgYnV0dG9uIHRvIGJlIGVuYWJsZWQgb24gdGhlIHBhZ2UgZm9sbG93aW5nIHRoaXMgY29tbWFuZC4KLSAgICogY29udGV4dF8gOiBhbiBJQ29udGV4dC4gTXVzdCBiZSBub24tbnVsbCBmb3IgIk5leHQiIGJ1dHRvbiB0byBiZSBlbmFibGVkIG9uIHRoZSBwYWdlIGZvbGxvd2luZyB0aGlzIGNvbW1hbmQuICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgKi8gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUpCi0gIHsKLQotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgCi0gICAgICAvLyoqU3RlcCAxKiogRGVmYXVsdCB0aGUgV2ViIHNlcnZpY2UgcnVudGltZS4KLSAgICAJCi0gICAgICAvL2NsaWVudElkc0ZpeGVkXyBpcyBzZXQgdG8gdHJ1ZSBmb3IgdGhlIEFudCBzY2VuYXJpby4gSXQncyBhbHdheXMgZmFsc2UgZm9yIHRoZSB3aXphcmQKLSAgICAgIC8vc2NlbmFyaW9zLgotICAgICAgaWYgKGNsaWVudElkc0ZpeGVkXyAmJiAoY2xpZW50UHJvamVjdE5hbWVfID09IG51bGwpKQotICAgICAgewotICAgICAgICAvLyBTZXQgdGhlIGNsaWVudFJ1bnRpbWUgYmFzZWQgb24gdGhlIHJ1bnRpbWUsIHNlcnZlciwgYW5kIGluaXRpYWwKLSAgICAgICAgLy8gc2VsZWN0aW9uLgotICAgICAgICBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gZ2V0RGVmYXVsdENsaWVudFJ1bnRpbWVGb3JGaXhlZFJ1bnRpbWVBbmRTZXJ2ZXIoY2xpZW50SW5pdGlhbFByb2plY3RfKTsKLSAgICAgICAgY2xpZW50RmFjZXRNYXRjaGVyXyA9IGRydC5nZXRGYWNldE1hdGNoZXIoKTsKLSAgICAgICAgY2xpZW50UHJvamVjdE5hbWVfID0gZHJ0LmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIGNsaWVudFJ1bnRpbWVJZF8gPSBkcnQuZ2V0UnVudGltZUlkKCk7ICAgICAgICAKLSAgICAgIH0gCi0gICAgICBlbHNlICAgICAgCi0gICAgICB7CQotICAgICAgICBWYWxpZGF0aW9uVXRpbHMgdnUgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZXQgdGhlIHJ1bnRpbWUgYmFzZWQgb24gdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgb2JqZWN0IHNlbGVjdGlvbi9pbml0aWFsIHNlbGVjdGlvbi4KLSAgICAgICAgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0IGRydCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXZ1LmlzUHJvamVjdFNlcnZpY2VQcm9qZWN0KGNsaWVudEluaXRpYWxQcm9qZWN0Xywgd3NkbFVSSV8sIHBhcnNlcl8pICYmICFjbGllbnRJZHNGaXhlZF8pCi0gICAgICAgIHsKLSAgICAgICAgICAvL0lmIGNsaWVudEludGlhbFByb2plY3RfIGRvZXMgbm90IGNvbnRhaW4gdGhlIEoyRUUgV2ViIHNlcnZpY2UsIGNob29zZSBhIGNsaWVudFJ1bnRpbWUgYmFzZWQgb24gaXQuCi0gICAgICAgICAgZHJ0ID0gZ2V0RGVmYXVsdFJ1bnRpbWUoY2xpZW50SW5pdGlhbFByb2plY3RfLCBjbGllbnRJZHNfLmdldFR5cGVJZCgpLCB0cnVlKTsKLSAgICAgICAgICBjbGllbnRGYWNldE1hdGNoZXJfID0gZHJ0LmdldEZhY2V0TWF0Y2hlcigpOwotICAgICAgICAgIGNsaWVudFByb2plY3ROYW1lXyA9IGRydC5nZXRQcm9qZWN0TmFtZSgpOyAKLSAgICAgICAgICBjbGllbnRSdW50aW1lSWRfID0gZHJ0LmdldFJ1bnRpbWVJZCgpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvL2NsaWVudEluaXRpYWxQcm9qZWN0XyBjb250YWlucyB0aGUgSjJFRSBXZWIgc2VydmljZSBzbyBkb24ndCB1c2UgaXQuCi0gICAgICAgICAgLy9UcnkgdXNpbmcgdGhlIGluaXRhbFByb2plY3RfIGluc3RlYWQuCi0gICAgICAgICAgaWYgKCF2dS5pc1Byb2plY3RTZXJ2aWNlUHJvamVjdChpbml0aWFsUHJvamVjdF8sIHdzZGxVUklfLCBwYXJzZXJfKSAmJiAhY2xpZW50SWRzRml4ZWRfKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vSWYgaW50aWFsUHJvamVjdF8gZG9lcyBub3QgY29udGFpbiB0aGUgSjJFRSBXZWIgc2VydmljZSwgY2hvb3NlIGEgY2xpZW50UnVudGltZSBiYXNlZCBvbiBpdC4KLSAgICAgICAgICAgIGRydCA9IGdldERlZmF1bHRSdW50aW1lKGluaXRpYWxQcm9qZWN0XywgY2xpZW50SWRzXy5nZXRUeXBlSWQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBjbGllbnRGYWNldE1hdGNoZXJfID0gZHJ0LmdldEZhY2V0TWF0Y2hlcigpOwotICAgICAgICAgICAgY2xpZW50UHJvamVjdE5hbWVfID0gZHJ0LmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgICAgICBjbGllbnRSdW50aW1lSWRfID0gZHJ0LmdldFJ1bnRpbWVJZCgpOyAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy9Cb3RoIGNsaWVudEludGlhbFByb2plY3RfIGFuZCBpbml0aWFsUHJvamVjdF8gY29udGFpbiB0aGUgSjJFRSBXZWIgc2VydmljZQotICAgICAgICAgICAgLy9hbmQgY2Fubm90IGJlIHVzZWQgdG8gaW5mbHVlbmNlIGNsaWVudFJ1bnRpbWUgZGVmYXVsdGluZy4KLSAgICAgICAgICAgIC8vQ2hvb3NlIGEgY2xpZW50UnVudGltZSBidXQgZG9uJ3QgY2hvb3NlIGNsaWVudEluaXRpYWxQcm9qZWN0XwotICAgICAgICAgICAgLy9hcyB0aGUgY2xpZW50UHJvamVjdC4KLSAgICAgICAgICAgIGRydCA9IGdldERlZmF1bHRSdW50aW1lKG51bGwsIGNsaWVudElkc18uZ2V0VHlwZUlkKCksIHRydWUpOwotICAgICAgICAgICAgY2xpZW50UnVudGltZUlkXyA9IGRydC5nZXRSdW50aW1lSWQoKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9TZXQgdGhlIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgaWQgZnJvbSB0aGUgY2xpZW50UnVudGltZQotICAgICAgICBjbGllbnRJZHNfLnNldFJ1bnRpbWVJZChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRDbGllbnRSdW50aW1lRGVzY3JpcHRvckJ5SWQoY2xpZW50UnVudGltZUlkXykuZ2V0UnVudGltZSgpCi0gICAgICAgICAgICAuZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vKipTdGVwIDIqKiBEZWZhdWx0IHRoZSBjbGllbnQgcHJvamVjdCBpZiBpdCB3YXMgbm90IGFscmVhZHkgZGVmYXVsdGVkIAotICAgICAgLy9hcyBwYXJ0IG9mIGRlZmF1bHRpbmcgdGhlIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAgICBpZiAoY2xpZW50UHJvamVjdE5hbWVfID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFByb2plY3QgbmFtZSBkaWQgbm90IGdldCBzZXQgd2hlbiB0aGUgcnVudGltZSB3YXMgc2V0LCBzbyBzZXQgaXQgbm93Ci0gICAgICAgIGNsaWVudFByb2plY3ROYW1lXyA9IGdldERlZmF1bHRDbGllbnRQcm9qZWN0TmFtZSgpOwotICAgICAgfQotCi0gICAgICAvLyoqU3RlcCAzKiogRGVmYXVsdCB0aGUgY2xpZW50IHByb2plY3QgdHlwZS4gICAgICAKLSAgICAgIElQcm9qZWN0IGNsaWVudFByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoY2xpZW50UHJvamVjdE5hbWVfKTsKLSAgICAgIGlmICghY2xpZW50UHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2V0IHRoZSBwcm9qZWN0IHRlbXBsYXRlCi0gICAgICAgIGNsaWVudENvbXBvbmVudFR5cGVfID0gZ2V0RGVmYXVsdENsaWVudFByb2plY3RUZW1wbGF0ZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL1NldCBpdCB0byBhbiBlbXB0eSBTdHJpbmcKLSAgICAgICAgY2xpZW50Q29tcG9uZW50VHlwZV8gPSAiIjsKLSAgICAgIH0KLQotCi0gICAgICAvLyoqU3RlcCA0KiogRGVmYXVsdCB0aGUgY2xpZW50IHNlcnZlciBpZiB0aGlzIGlzIG5vdCBhbiBBbnQgc2NlbmFyaW8uCi0gICAgICBpZiAoIWNsaWVudElkc0ZpeGVkXykKLSAgICAgIHsKLSAgICAgICAgSVN0YXR1cyBzZXJ2ZXJTdGF0dXMgPSBzZXRDbGllbnREZWZhdWx0U2VydmVyKCk7Ci0gICAgICAgIGlmIChzZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHNlcnZlclN0YXR1cyk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlclN0YXR1czsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICAvLyoqU3RlcCA1KiogRGVmYXVsdCBjbGllbnROZWVkRUFSIGFuZCBjbGllbnQgRUFSIGlmIGFuIEVBUiBpcyBuZWVkZWQKLSAgICAgIHNldERlZmF1bHRDbGllbnRFYXJQcm9qZWN0KCk7ICAgICAgCi0gICAgICAKLSAgICAgIAotICAgICAgLy8qKlN0ZXAgNioqIENhbGN1bGF0ZSBkZWZhdWx0IElXZWJTZXJ2aWNlQ2xpZW50LiBUaGlzIGlzIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQKLSAgICAgIC8vIE5leHQgaXMgZW5hYmxlZCBvbiB0aGUgcGFnZSBmb2xsb3dpbmcgdGhpcyBjb21tYW5kLgotICAgICAgc2V0RGVmYXVsdHNGb3JFeHRlbnNpb24oZW52KTsKLQotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBDYXRjaCBhbGwgRXhjZXB0aW9ucyBpbiBvcmRlciB0byBnaXZlIHNvbWUgZmVlZGJhY2sgdG8gdGhlIHVzZXIKLSAgICAgIElTdGF0dXMgZXJyb3JTdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQsCi0gICAgICAgICAgbmV3IFN0cmluZ1tdIHsgZS5nZXRNZXNzYWdlKCkgfSksIGUpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdENsaWVudEVhclByb2plY3QoKQotICB7ICAgIAotICAgIC8vRG9uJ3QgbmVlZCBhbiBlYXIgaWYgdGhpcyBpcyBhIEphdmEgcHJvamVjdCwgb3IgaWYgdGhlIHNlbGVjdGVkIHRlbXBsYXRlIGlzIGpzdC51dGlsaXR5Ci0gICAgSVByb2plY3QgY2xpZW50UHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChjbGllbnRQcm9qZWN0TmFtZV8pOwotICAgIGlmIChjbGllbnRQcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIGNsaWVudE5lZWRFQVJfID0gIShGYWNldFV0aWxzLmlzSmF2YVByb2plY3QoY2xpZW50UHJvamVjdCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY2xpZW50TmVlZEVBUl8gPSAhKEZhY2V0VXRpbHMuaXNVdGlsaXR5VGVtcGxhdGUoY2xpZW50Q29tcG9uZW50VHlwZV8pKTsgIAotICAgIH0KLSAgICAKLSAgICAvL0lmIGNsaWVudE5lZWRFQVJfIGlzIHN0aWxsIHRydWUsIGl0IG1lYW5zIHRoYXQgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIEphdmEgcHJvamVjdAotICAgIC8vb3IgSmF2YSBwcm9qZWN0IHR5cGUuIENoZWNrIHRoZSBzZXJ2ZXIuCi0gICAgaWYgKGNsaWVudE5lZWRFQVJfKQotICAgIHsKLSAgICAgIC8vIERldGVybWluZSBpZiBhbiBlYXIgc2VsZWN0aW9uIGlzIG5lZWRlZCBiYXNlZCBvbiB0aGUgc2VydmVyIHR5cGUuCi0KLSAgICAgIFN0cmluZyBzZXJ2ZXJJZCA9IGNsaWVudElkc18uZ2V0U2VydmVySWQoKTsKLSAgICAgIGlmIChzZXJ2ZXJJZCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBVc2UgdGhlIHNlcnZlciB0eXBlCi0gICAgICAgIFN0cmluZyBzZXJ2ZXJUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVySWQpOwotICAgICAgICBpZiAoc2VydmVyVGFyZ2V0SWQgIT0gbnVsbCAmJiBzZXJ2ZXJUYXJnZXRJZC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIVNlcnZlclV0aWxzLmlzVGFyZ2V0VmFsaWRGb3JFQVIoc2VydmVyVGFyZ2V0SWQsICIxMyIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIERlZmF1bHQgdGhlIEVBUiBzZWxlY3Rpb24gdG8gYmUgZW1wdHkKLSAgICAgICAgICAgIGNsaWVudE5lZWRFQVJfID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgeyAgLy8gc2VydmVySWQgPT0gbnVsbCwgYXNzdW1lIHRoYXQgaXQgZG9lcyBub3QgbmVlZCBFQVIKLSAgICAJICBjbGllbnROZWVkRUFSXyA9IGZhbHNlOwotICAgIAkgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoY2xpZW50TmVlZEVBUl8pCi0gICAgewotICAgIAljbGllbnRFYXJQcm9qZWN0TmFtZV8gPSBEZWZhdWx0aW5nVXRpbHMuZ2V0RGVmYXVsdEVBUlByb2plY3ROYW1lKGNsaWVudFByb2plY3ROYW1lXyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjbGllbnRFYXJQcm9qZWN0TmFtZV8gPSAiIjsKLSAgICB9ICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgSVN0YXR1cyBzZXRDbGllbnREZWZhdWx0U2VydmVyKCkKLSAgewotICAgIC8vQ2hvb3NlIGFuIGV4aXN0aW5nIHNlcnZlciB0aGUgbW9kdWxlIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGlmIHBvc3NpYmxlCi0gICAgSVByb2plY3QgY2xpZW50UHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChjbGllbnRQcm9qZWN0TmFtZV8pOwotICAgIElTZXJ2ZXJbXSBjb25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFNlcnZlclV0aWxzLmdldE1vZHVsZShjbGllbnRQcm9qZWN0KSwgbnVsbCk7Ci0gICAgCi0gICAgaWYgKGNvbmZpZ3VyZWRTZXJ2ZXJzIT1udWxsICYmIGNvbmZpZ3VyZWRTZXJ2ZXJzLmxlbmd0aD4wICYmIGNvbmZpZ3VyZWRTZXJ2ZXJzWzBdLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNsaWVudElkc18uc2V0U2VydmVySWQoY29uZmlndXJlZFNlcnZlcnNbMF0uZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKGNvbmZpZ3VyZWRTZXJ2ZXJzWzBdLmdldElkKCkpOwotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7ICAgICAgICAgICAgCQotICAgIH0KLSAgICAKLSAgICAvL0lmIHRoZSBwcm9qZWN0IGV4aXN0cywgY2hvb3NlIGEgc3VpdGFibGUgc2VydmVyIG9yIHNlcnZlciB0eXBlIGJhc2VkIG9uIHRoZSBleGlzdGluZyBwcm9qZWN0J3MgcnVudGltZSBvciBmYWNldHMKLSAgICBpZiAoY2xpZW50UHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IGdldFNlcnZlckZyb21Qcm9qZWN0KGNsaWVudFByb2plY3ROYW1lXywgY2xpZW50RmFjZXRNYXRjaGVyXyk7Ci0gICAgICBpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlcklkKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXIuZ2V0SWQoKSk7Ci0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gZ2V0U2VydmVyVHlwZUZyb21Qcm9qZWN0KGNsaWVudFByb2plY3ROYW1lXywgY2xpZW50RmFjZXRNYXRjaGVyXyk7Ci0gICAgICAgIGlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlcklkKHNlcnZlclR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvL0hhdmVuJ3QgcGlja2VkIGEgc2VydmVyL3NlcnZlciB0eXBlIG9uIHRoZSBiYXNpcyBvZiB0aGUgcHJvamVjdC4gUGljayBhIHNlcnZlci9zZXJ2ZXIgdHlwZQotICAgIC8vdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGNsaWVudFJ1bnRpbWVJZC4KLSAgICBJU2VydmVyIHNlcnZlciA9IGdldFNlcnZlckZyb21DbGllbnRSdW50aW1lSWQoKTsKLSAgICBpZiAoc2VydmVyIT1udWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjbGllbnRJZHNfLnNldFNlcnZlcklkKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICBjbGllbnRJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVyLmdldElkKCkpOwotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotICAgIAotICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBnZXRTZXJ2ZXJUeXBlRnJvbUNsaWVudFJ1bnRpbWVJZCgpOwotICAgIGlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJUeXBlLmdldElkKCkpOwotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvLyBObyBzdWl0YWJsZSBzZXJ2ZXIgd2FzIGZvdW5kLiBQb3B1cCBhbiBlcnJvciBpZiB0aGUgZGVmYXVsdCBXZWIgc2VydmljZQotICAgIC8vIHJ1bnRpbWUgcmVxdWlyZXMgYSBzZXJ2ZXIuCi0gICAgUnVudGltZURlc2NyaXB0b3IgcnVudGltZURlc2NyaXB0b3IgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lQnlJZChjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICBpZiAocnVudGltZURlc2NyaXB0b3IuZ2V0U2VydmVyUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcnVudGltZUxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZUxhYmVsQnlJZChjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9OT19TRVJWRVJfUlVOVElNRSwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICBydW50aW1lTGFiZWx9KSk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHJpdmF0ZSBJU2VydmVyIGdldFNlcnZlckZyb21DbGllbnRSdW50aW1lSWQoKQotICB7Ci0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICBpZiAoc2VydmVycyAhPSBudWxsICYmIHNlcnZlcnMubGVuZ3RoID4gMCkgewotICAgIAkKLSAgICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyBwcmVmZXJyZWRTZXJ2ZXJGYWN0b3J5SWQgPSBjb250ZXh0LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgICAKLSAgICAgICAgLy9JZiBhIHNlcnZlciBvZiB0aGUgcHJlZmVycmVkIHNlcnZlciB0eXBlIGlzIHByZXNlbnQsIGNoZWNrIHRoYXQgb25lIGZpcnN0Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2VydmVycy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChzZXJ2ZXJzW2pdICE9IG51bGwgJiYgc2VydmVyc1tqXS5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0JICAgICAgICAgIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJzW2pdLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCSAgICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkID09IHByZWZlcnJlZFNlcnZlckZhY3RvcnlJZCkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIGlmIChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5kb2VzQ2xpZW50UnVudGltZVN1cHBvcnRTZXJ2ZXIoY2xpZW50UnVudGltZUlkXywgc2VydmVyRmFjdG9yeUlkKSkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICByZXR1cm4gc2VydmVyc1tqXTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vQSBzZXJ2ZXIgb2YgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgdHlwZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgZGlkIG5vdCBtYXRjaC4gQ2hlY2sgYWxsIHRoZSBleGlzdGluZyBzZXJ2ZXJzLiAgICAKLSAgICAJCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgCWlmIChzZXJ2ZXJzW2ldICE9IG51bGwgJiYgc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkKLSAgICAJewotCSAgICAgICAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9IHNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JICAgICAgICBpZiAoV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZG9lc0NsaWVudFJ1bnRpbWVTdXBwb3J0U2VydmVyKGNsaWVudFJ1bnRpbWVJZF8sIHNlcnZlckZhY3RvcnlJZCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIHJldHVybiBzZXJ2ZXJzW2ldOwotCSAgICAgICAgfQotCSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIElTZXJ2ZXJUeXBlIGdldFNlcnZlclR5cGVGcm9tQ2xpZW50UnVudGltZUlkKCkKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlclR5cGVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmVyRmFjdG9yeUlkc0J5Q2xpZW50UnVudGltZShjbGllbnRSdW50aW1lSWRfKTsKLSAgICBpZiAoc2VydmVyVHlwZXMhPW51bGwgJiYgc2VydmVyVHlwZXMubGVuZ3RoPjApCi0gICAgewotICAgICAgLy9SZXR1cm4gdGhlIHByZWZlcnJlZCBvbmUgaWYgaXQgaXMgaW4gdGhlIGxpc3QKLSAgICAgIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgICAgU3RyaW5nIHByZWZlcnJlZFNlcnZlckZhY3RvcnlJZCA9IGNvbnRleHQuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8c2VydmVyVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXJ2ZXJUeXBlc1tpXS5lcXVhbHMocHJlZmVycmVkU2VydmVyRmFjdG9yeUlkKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlclR5cGVzW2ldKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJUeXBlc1swXSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElTZXJ2ZXIgZ2V0U2VydmVyRnJvbVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBGYWNldE1hdGNoZXIgZmFjZXRNYXRjaGVyKQotICB7Ci0gICAgSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotICAgIAotICAgIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgCi0gICAgaWYgKHNlcnZlcnMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICAgIFN0cmluZyBwcmVmZXJyZWRTZXJ2ZXJGYWN0b3J5SWQgPSBjb250ZXh0LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgICAKLSAgICAgIC8vIEdldCB0aGUgcnVudGltZS4KLSAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgZlJ1bnRpbWUgPSBudWxsOwotICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gbnVsbDsKLQotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgIGlmIChmUHJvamVjdCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZSdW50aW1lID0gZlByb2plY3QuZ2V0UnVudGltZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGZSdW50aW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCBhbiBleGlzdGluZyBzZXJ2ZXIgdGhhdCBoYXMgdGhlIHNhbWUgcnVudGltZS4KLSAgICAgICAgSVNlcnZlciBmaXJzdE1hdGNoaW5nU2VydmVyID0gbnVsbDsgICAgCSAgCi0gICAgICAgIElSdW50aW1lIHNSdW50aW1lID0gRmFjZXRVdGlsLmdldFJ1bnRpbWUoZlJ1bnRpbWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VydmVyIHRoaXNTZXJ2ZXIgPSBzZXJ2ZXJzW2ldOwotICAgICAgICAgIElSdW50aW1lIHRoaXNTZXJ2ZXJSdW50aW1lID0gdGhpc1NlcnZlci5nZXRSdW50aW1lKCk7Ci0gICAgICAgICAgaWYgKCB0aGlzU2VydmVyUnVudGltZSAhPSBudWxsICYmIHNSdW50aW1lICE9IG51bGwgJiYgdGhpc1NlcnZlclJ1bnRpbWUuZ2V0SWQoKS5lcXVhbHMoc1J1bnRpbWUuZ2V0SWQoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGZpcnN0TWF0Y2hpbmdTZXJ2ZXI9PW51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZpcnN0TWF0Y2hpbmdTZXJ2ZXIgPSB0aGlzU2VydmVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0aGlzU2VydmVyICE9IG51bGwgJiYgdGhpc1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiB0aGlzU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFscyhwcmVmZXJyZWRTZXJ2ZXJGYWN0b3J5SWQpKQotICAgICAgICAgICAgewotICAgICAgICAJICAKLSAgICAgICAgICAgICAgc2VydmVyID0gdGhpc1NlcnZlcjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vSWYgYSBzZXJ2ZXIgb2YgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgdHlwZSB3YXMgbm90IGZvdW5kIGJ1dAotICAgICAgICAvL3RoZXJlIHdhcyBhIHNlcnZlciB0aGF0IG1hdGNoZWQsIHJldHVybiB0aGF0IG9uZS4KLSAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsICYmIGZpcnN0TWF0Y2hpbmdTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlciA9IGZpcnN0TWF0Y2hpbmdTZXJ2ZXI7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotCi0gICAgICAvLyBJZiBhbiBleGlzdGluZyBzZXJ2ZXIgY291bGQgbm90IGJlIGNob3NlbiBvbiB0aGUgYmFzaXMgb2YgdGhlIHByb2plY3QncwotICAgICAgLy8gcnVudGltZSwKLSAgICAgIC8vIHRyeSB0byBmaW5kIGFuIGV4aXN0aW5nIHNlcnZlciB1c2luZyB0aGUgcHJvamVjdCdzIGZhY2V0cyBhbmQgdGhlCi0gICAgICAvLyBmYWNldHNUb0FkZC4KLSAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2plY3QhPW51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIFNldCBmYWNldHMgPSBGYWNldFV0aWxzLmdldEZhY2V0c0ZvclByb2plY3QocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgIGlmIChmYWNldHMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTZXQgZmFjZXRzQ2xvbmUgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgZmFjZXRzQ2xvbmUuYWRkQWxsKGZhY2V0cyk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZmFjZXRNYXRjaGVyLmdldEZhY2V0c1RvQWRkKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gZmFjZXRNYXRjaGVyLmdldEZhY2V0c1RvQWRkKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWNldHNDbG9uZS5hZGQoaXRyLm5leHQoKSk7ICAKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VydmVyID0gZ2V0U2VydmVyRnJvbUZhY2V0cyhmYWNldHNDbG9uZSk7ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXI7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJU2VydmVyIGdldFNlcnZlckZyb21GYWNldHMoU2V0IGZhY2V0cykKLSAgewotCSAgICBJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JICAgIFNldCBydW50aW1lcyA9IEZhY2V0VXRpbHMuZ2V0UnVudGltZXMobmV3IFNldFtde2ZhY2V0c30pOwotCSAgICBJdGVyYXRvciBpdHIgPSBydW50aW1lcy5pdGVyYXRvcigpOwotCSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCSAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkgICAgU3RyaW5nIHByZWZlcnJlZFNlcnZlckZhY3RvcnlJZCA9IGNvbnRleHQuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0JICAgIAotCSAgICAvL0lmIG9uZSBvZiB0aGUgc2VydmVycyBpcyBvZiB0aGUgcHJlZmVycmVkIHR5cGUsIGFuZCBpdHMgcnVudGltZQotCSAgICAvL2lzIGluIHRoZSBzZXQgb2YgbWF0Y2hpbmcgcnVudGltZXMsIHJldHVybiB0aGF0IHNlcnZlci4KLQkgICAgZm9yIChpbnQgaj0wOyBqPHNlcnZlcnMubGVuZ3RoOyBqKyspICAgICAgCi0JICAgIHsKLQkgICAgICBJU2VydmVyIHRoaXNTZXJ2ZXIgPSBzZXJ2ZXJzW2pdOwotCSAgICAgIGlmICh0aGlzU2VydmVyICE9IG51bGwgJiYgdGhpc1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiB0aGlzU2VydmVyLmdldFJ1bnRpbWUoKSAhPSBudWxsICYmIHRoaXNTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkuZXF1YWxzKHByZWZlcnJlZFNlcnZlckZhY3RvcnlJZCkpCi0JICAgICAgewotCSAgICAJSVJ1bnRpbWUgdGhpc1NlcnZlclJ1bnRpbWUgPSB0aGlzU2VydmVyLmdldFJ1bnRpbWUoKTsKLQkgICAgICAgIC8vQ2hlY2sgdG8gc2VlIGlmIGl0IG1hdGNoZXMgYW55IG9mIHRoZSBydW50aW1lcy4KLQkgICAgICAgIEl0ZXJhdG9yIHJ1bnRpbWVzSXRyID0gcnVudGltZXMuaXRlcmF0b3IoKTsKLQkgICAgICAgIHdoaWxlKHJ1bnRpbWVzSXRyLmhhc05leHQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBmUnVudGltZSA9IChvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lKXJ1bnRpbWVzSXRyLm5leHQoKTsKLQkgICAgICAgICAgSVJ1bnRpbWUgc1J1bnRpbWUgPSBGYWNldFV0aWwuZ2V0UnVudGltZShmUnVudGltZSk7Ci0JICAgICAgICAgIGlmIChzUnVudGltZSAhPSBudWxsICYmIHRoaXNTZXJ2ZXJSdW50aW1lLmdldElkKCkuZXF1YWxzKHNSdW50aW1lLmdldElkKCkpKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgc2VydmVyID0gdGhpc1NlcnZlcjsKLQkgICAgICAgICAgfSAgICAgICAgICAKLQkgICAgICAgIH0KLQkgICAgICB9ICAgICAgICAgICAgCi0JICAgIH0KLQkgICAgCi0JICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIG91dGVyOiB3aGlsZSAoaXRyLmhhc05leHQoKSkKLQkgICAgICB7Ci0JICAgICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIGZSdW50aW1lID0gKG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUpIGl0cgotCSAgICAgICAgICAgIC5uZXh0KCk7Ci0JICAgICAgICBJUnVudGltZSBzUnVudGltZSA9IEZhY2V0VXRpbC5nZXRSdW50aW1lKGZSdW50aW1lKTsKLQkgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykKLQkgICAgICAgIHsKLQkgICAgICAgICAgSVNlcnZlciB0aGlzU2VydmVyID0gc2VydmVyc1tpXTsKLQkgICAgICAgICAgSVJ1bnRpbWUgdGhpc1NlcnZlclJ1bnRpbWUgPSB0aGlzU2VydmVyLmdldFJ1bnRpbWUoKTsKLQkgICAgICAgICAgaWYgKHRoaXNTZXJ2ZXJSdW50aW1lICE9IG51bGwgJiYgc1J1bnRpbWUgIT0gbnVsbCAmJiB0aGlzU2VydmVyUnVudGltZS5nZXRJZCgpLmVxdWFscyhzUnVudGltZS5nZXRJZCgpKSkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIHNlcnZlciA9IHRoaXNTZXJ2ZXI7Ci0JICAgICAgICAgICAgYnJlYWsgb3V0ZXI7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQotCSAgICByZXR1cm4gc2VydmVyOwotCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBJU2VydmVyVHlwZSBnZXRTZXJ2ZXJUeXBlRnJvbVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBGYWNldE1hdGNoZXIgZmFjZXRNYXRjaGVyKQotICB7Ci0JICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBudWxsOwotCSAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkgICAgU3RyaW5nIHByZWZlcnJlZFNlcnZlckZhY3RvcnlJZCA9IGNvbnRleHQuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0JICAgIAotCSAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkgICAgSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLQkgICAgCi0JICAgIC8vR2V0IHRoZSBydW50aW1lLgotCSAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIGZSdW50aW1lID0gbnVsbDsKLQkgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gbnVsbDsKLQkgICAgCi0JICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLQkgICAgewotCSAgICAgIHRyeQotCSAgICAgIHsKLQkgICAgICAgIGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCSAgICAgICAgaWYgKGZQcm9qZWN0ICE9IG51bGwpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGZSdW50aW1lID0gZlByb2plY3QuZ2V0UnVudGltZSgpOwotCSAgICAgICAgfQotCSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0JICAgICAgewotCSAgICAgICAgCi0JICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICBpZiAoZlJ1bnRpbWUgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIC8vR2V0IGEgc2VydmVyIHR5cGUgdGhhdCBoYXMgdGhlIHNhbWUgcnVudGltZSB0eXBlLgotCSAgICAgIElSdW50aW1lIHNSdW50aW1lID0gRmFjZXRVdGlsLmdldFJ1bnRpbWUoZlJ1bnRpbWUpOyAKLQkgICAgICBpZiAoc1J1bnRpbWUgIT0gbnVsbCkKLQkgICAgICB7Ci0JCSAgICAgIElSdW50aW1lVHlwZSBzUnVudGltZVR5cGUgPSBzUnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkgICAgICBJU2VydmVyVHlwZSBmaXJzdE1hdGNoaW5nU2VydmVyVHlwZSA9IG51bGw7Ci0JCSAgICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJUeXBlcy5sZW5ndGg7IGkrKykKLQkJICAgICAgewotCQkgICAgICAgIElTZXJ2ZXJUeXBlIHRoaXNTZXJ2ZXJUeXBlID0gc2VydmVyVHlwZXNbaV07Ci0JCSAgICAgICAgSVJ1bnRpbWVUeXBlIHRoaXNTZXJ2ZXJSdW50aW1lVHlwZSA9IHRoaXNTZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCSAgICAgICAgaWYgKHNSdW50aW1lVHlwZSAhPSBudWxsICYmIHRoaXNTZXJ2ZXJSdW50aW1lVHlwZSAhPSBudWxsICYmIHRoaXNTZXJ2ZXJSdW50aW1lVHlwZS5nZXRJZCgpLmVxdWFscyhzUnVudGltZVR5cGUuZ2V0SWQoKSkpCi0JCSAgICAgICAgewotCQkgICAgICAgICAgaWYgKGZpcnN0TWF0Y2hpbmdTZXJ2ZXJUeXBlID09IG51bGwpCi0JCSAgICAgICAgICB7Ci0JCSAgICAgICAgICAgIGZpcnN0TWF0Y2hpbmdTZXJ2ZXJUeXBlID0gdGhpc1NlcnZlclR5cGU7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgICBpZiAodGhpc1NlcnZlclR5cGUuZ2V0SWQoKS5lcXVhbHMocHJlZmVycmVkU2VydmVyRmFjdG9yeUlkKSkKLQkJICAgICAgICAgIHsKLQkJICAgICAgICAgICAgc2VydmVyVHlwZSA9IHRoaXNTZXJ2ZXJUeXBlOwotCQkgICAgICAgICAgICBicmVhazsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICB9ICAgICAKLQkJICAgICAgfQotCQkgICAgICAKLQkJICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIHNlcnZlciB0eXBlIHdhcyBub3QgZm91bmQgYnV0Ci0JCSAgICAgIC8vdGhlcmUgd2FzIGEgc2VydmVyIHR5cGUgdGhhdCBtYXRjaGVkLCByZXR1cm4gdGhhdCBvbmUuICAgICAgICAKLQkJICAgICAgaWYgKHNlcnZlclR5cGUgPT0gbnVsbCAmJiBmaXJzdE1hdGNoaW5nU2VydmVyVHlwZSAhPSBudWxsKQotCQkgICAgICB7ICAgICAgICAKLQkJICAgICAgICBzZXJ2ZXJUeXBlID0gZmlyc3RNYXRjaGluZ1NlcnZlclR5cGU7Ci0JCSAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQotCSAgICAvL0lmIGEgc2VydmVyIHR5cGUgY291bGQgbm90IGJlIGNob3NlbiBvbiB0aGUgYmFzaXMgb2YgdGhlIHByb2plY3QncyBydW50aW1lLAotCSAgICAvL3RyeSB0byBmaW5kIGEgc2VydmVyIHR5cGUgdXNpbmcgdGhlIHByb2plY3QncyBmYWNldHMgYW5kIHRoZSBmYWNldHNUb0FkZC4KLQkgICAgaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLQkgICAgICB7Ci0JICAgICAgICBTZXQgZmFjZXRzID0gRmFjZXRVdGlscy5nZXRGYWNldHNGb3JQcm9qZWN0KHByb2plY3QuZ2V0TmFtZSgpKTsKLQkgICAgICAgIGlmIChmYWNldHMgIT0gbnVsbCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgU2V0IGZhY2V0c0Nsb25lID0gbmV3IEhhc2hTZXQoKTsKLQkgICAgICAgICAgZmFjZXRzQ2xvbmUuYWRkQWxsKGZhY2V0cyk7ICAgICAgICAgIAotCSAgICAgICAgICBpZiAoZmFjZXRNYXRjaGVyICE9IG51bGwgJiYgZmFjZXRNYXRjaGVyLmdldEZhY2V0c1RvQWRkKCkgIT0gbnVsbCkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGZhY2V0TWF0Y2hlci5nZXRGYWNldHNUb0FkZCgpLml0ZXJhdG9yKCk7Ci0JICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgZmFjZXRzQ2xvbmUuYWRkKGl0ci5uZXh0KCkpOyAgCi0JICAgICAgICAgICAgfSAgICAgICAgICAgIAotCSAgICAgICAgICB9Ci0JICAgICAgICAgIHNlcnZlclR5cGUgPSBnZXRTZXJ2ZXJUeXBlRnJvbUZhY2V0cyhmYWNldHNDbG9uZSk7ICAgICAgICAgIAotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIHNlcnZlclR5cGU7Ci0KLSAgfQotICAKLSAgcHJvdGVjdGVkIElTZXJ2ZXJUeXBlIGdldFNlcnZlclR5cGVGcm9tRmFjZXRzKFNldCBmYWNldHMpCi0gIHsKLQkgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IG51bGw7Ci0JICAgIFNldCBydW50aW1lcyA9IEZhY2V0VXRpbHMuZ2V0UnVudGltZXMobmV3IFNldFtde2ZhY2V0c30pOwotCSAgICBJdGVyYXRvciBpdHIgPSBydW50aW1lcy5pdGVyYXRvcigpOwotCSAgICBJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCSAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkgICAgU3RyaW5nIHByZWZlcnJlZFNlcnZlckZhY3RvcnlJZCA9IGNvbnRleHQuZ2V0U2VydmVyRmFjdG9yeUlkKCk7ICAgIAotCi0JICAgIC8vSWYgb25lIG9mIHRoZSBzZXJ2ZXIgdHlwZXMgaXMgb2YgdGhlIHByZWZlcnJlZCB0eXBlLCBhbmQgaXRzIHJ1bnRpbWUKLQkgICAgLy9pcyBpbiB0aGUgc2V0IG9mIG1hdGNoaW5nIHJ1bnRpbWVzLCByZXR1cm4gdGhhdCBzZXJ2ZXIgdHlwZS4KLQkgICAgZm9yIChpbnQgaj0wOyBqPHNlcnZlclR5cGVzLmxlbmd0aDsgaisrKSAgICAgIAotCSAgICB7Ci0JICAgICAgSVNlcnZlclR5cGUgdGhpc1NlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlc1tqXTsKLQkgICAgICBJUnVudGltZVR5cGUgdGhpc1NlcnZlclR5cGVSdW50aW1lVHlwZSA9IHRoaXNTZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JICAgICAgaWYgKHRoaXNTZXJ2ZXJUeXBlUnVudGltZVR5cGUgIT0gbnVsbCAmJiB0aGlzU2VydmVyVHlwZS5nZXRJZCgpLmVxdWFscyhwcmVmZXJyZWRTZXJ2ZXJGYWN0b3J5SWQpKQotCSAgICAgIHsKLQkgICAgICAgIC8vQ2hlY2sgdG8gc2VlIGlmIGl0IG1hdGNoZXMgYW55IG9mIHRoZSBydW50aW1lcy4KLQkgICAgICAgIEl0ZXJhdG9yIHJ1bnRpbWVzSXRyID0gcnVudGltZXMuaXRlcmF0b3IoKTsKLQkgICAgICAgIHdoaWxlKHJ1bnRpbWVzSXRyLmhhc05leHQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBmUnVudGltZSA9IChvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lKXJ1bnRpbWVzSXRyLm5leHQoKTsKLQkgICAgICAgICAgSVJ1bnRpbWUgc1J1bnRpbWUgPSBGYWNldFV0aWwuZ2V0UnVudGltZShmUnVudGltZSk7Ci0JICAgICAgICAgIGlmIChzUnVudGltZSAhPSBudWxsKQotCSAgICAgICAgICB7Ci0JICAgICAgICAJICBJUnVudGltZVR5cGUgc1J1bnRpbWVUeXBlID0gc1J1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkJICAgICAgICAgIGlmIChzUnVudGltZVR5cGUgIT0gbnVsbCAmJiB0aGlzU2VydmVyVHlwZVJ1bnRpbWVUeXBlLmdldElkKCkuZXF1YWxzKHNSdW50aW1lVHlwZS5nZXRJZCgpKSkKLQkJICAgICAgICAgIHsKLQkJICAgICAgICAgICAgc2VydmVyVHlwZSA9IHRoaXNTZXJ2ZXJUeXBlOwotCQkgICAgICAgICAgfSAgICAgICAgICAKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgIH0gICAgICAgICAgICAKLQkgICAgfQotCSAgICAKLQkgICAgCi0JICAgIGlmIChzZXJ2ZXJUeXBlID09IG51bGwpCi0JICAgIHsKLQkgICAgICBvdXRlcjogd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0JICAgICAgewotCSAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBmUnVudGltZSA9IChvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lKSBpdHIKLQkgICAgICAgICAgICAubmV4dCgpOwotCSAgICAgICAgSVJ1bnRpbWUgc1J1bnRpbWUgPSBGYWNldFV0aWwuZ2V0UnVudGltZShmUnVudGltZSk7Ci0JICAgICAgICBpZiAoc1J1bnRpbWUgIT0gbnVsbCkKLQkgICAgICAgIHsKLQkJICAgICAgICBJUnVudGltZVR5cGUgc1J1bnRpbWVUeXBlID0gc1J1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlclR5cGVzLmxlbmd0aDsgaSsrKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgIElTZXJ2ZXJUeXBlIHRoaXNTZXJ2ZXJUeXBlID0gc2VydmVyVHlwZXNbaV07Ci0JCSAgICAgICAgICBpZiAodGhpc1NlcnZlclR5cGUgIT0gbnVsbCkKLQkJICAgICAgICAgIHsKLQkJCSAgICAgICAgICBJUnVudGltZVR5cGUgdGhpc1NlcnZlclR5cGVSdW50aW1lVHlwZSA9IHRoaXNTZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQkgICAgICAgICAgaWYgKHNSdW50aW1lVHlwZSAhPSBudWxsICYmIHRoaXNTZXJ2ZXJUeXBlUnVudGltZVR5cGUgIT0gbnVsbCAmJiB0aGlzU2VydmVyVHlwZVJ1bnRpbWVUeXBlLmdldElkKCkuZXF1YWxzKHNSdW50aW1lVHlwZS5nZXRJZCgpKSkKLQkJCSAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gdGhpc1NlcnZlclR5cGU7Ci0JCQkgICAgICAgICAgICBicmVhayBvdXRlcjsKLQkJCSAgICAgICAgICB9Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCi0JICAgIHJldHVybiBzZXJ2ZXJUeXBlOwotCi0gIH0gIAotICAKLSAgcHJvdGVjdGVkIElTZXJ2ZXIgZ2V0U2VydmVyRnJvbVByb2plY3RUeXBlKFN0cmluZyB0ZW1wbGF0ZUlkLCBGYWNldE1hdGNoZXIgZmFjZXRNYXRjaGVyKQotICB7Ci0gICAgSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotICAgIFNldCBmYWNldHMgPSBGYWNldFV0aWxzLmdldEluaXRpYWxGYWNldFZlcnNpb25zRnJvbVRlbXBsYXRlKHRlbXBsYXRlSWQpOwotICAgIGlmIChmYWNldE1hdGNoZXIuZ2V0RmFjZXRzVG9BZGQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ciA9IGZhY2V0TWF0Y2hlci5nZXRGYWNldHNUb0FkZCgpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgZmFjZXRzLmFkZChpdHIubmV4dCgpKTsgIAotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICBzZXJ2ZXIgPSBnZXRTZXJ2ZXJGcm9tRmFjZXRzKGZhY2V0cyk7Ci0gICAgcmV0dXJuIHNlcnZlcjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElTZXJ2ZXJUeXBlIGdldFNlcnZlclR5cGVGcm9tUHJvamVjdFR5cGUoU3RyaW5nIHRlbXBsYXRlSWQsIEZhY2V0TWF0Y2hlciBmYWNldE1hdGNoZXIpCi0gIHsKLSAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gbnVsbDsKLSAgICBTZXQgZmFjZXRzID0gRmFjZXRVdGlscy5nZXRJbml0aWFsRmFjZXRWZXJzaW9uc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZUlkKTsKLSAgICBpZiAoZmFjZXRNYXRjaGVyLmdldEZhY2V0c1RvQWRkKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdHIgPSBmYWNldE1hdGNoZXIuZ2V0RmFjZXRzVG9BZGQoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGZhY2V0cy5hZGQoaXRyLm5leHQoKSk7ICAKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgLy9UT0RPIEluc3RlYWQgb2YgcGFzc2luZyBpbiBhIHNpbmdsZSBzZXQgb2YgZmFjZXRzLCBwYXNzIGluIG11bHRpcGxlIHNldHMsIGlmIHRoZQotICAgIC8vanN0LmphdmEgZmFjZXQgaXMgb25lIG9mIHRoZW0gYW5kIHRoZSBjbGllbnRSdW50aW1lSWQgYWxsb3dzIG5ld2VyLgotICAgIHNlcnZlclR5cGUgPSBnZXRTZXJ2ZXJUeXBlRnJvbUZhY2V0cyhmYWNldHMpOwotICAgIHJldHVybiBzZXJ2ZXJUeXBlOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdENsaWVudFByb2plY3RUZW1wbGF0ZSgpCi0gIHsKLSAgICBTdHJpbmdbXSB0ZW1wbGF0ZXMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRDbGllbnRQcm9qZWN0VGVtcGxhdGVzKGNsaWVudElkc18uZ2V0VHlwZUlkKCksIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCkpOwotICAgIAotICAgIC8vV2FsayB0aGUgbGlzdCBvZiBjbGllbnQgcHJvamVjdCB0eXBlcyBpbiB0aGUgcHJvamVjdCB0b3BvbG9neSBwcmVmZXJlbmNlCi0gICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBwdGM9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotICAgIFN0cmluZ1tdIHByZWZlcnJlZFRlbXBsYXRlSWRzID0gcHRjLmdldENsaWVudFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaj0wOyBqPHByZWZlcnJlZFRlbXBsYXRlSWRzLmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaTx0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZUlkID0gdGVtcGxhdGVzW2ldOwotICAgICAgICBpZiAodGVtcGxhdGVJZC5lcXVhbHMocHJlZmVycmVkVGVtcGxhdGVJZHNbal0pKQotICAgICAgICB7Ci0gICAgICAgICAgCi0gICAgICAgICAgYm9vbGVhbiBtYXRjaGVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZG9lc0NsaWVudFJ1bnRpbWVTdXBwb3J0VGVtcGxhdGUoY2xpZW50UnVudGltZUlkXywgdGVtcGxhdGVJZCk7Ci0gICAgICAgICAgaWYgKG1hdGNoZXMpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlc1tpXTsgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9Ci0KLSAgICAvL1NpbmNlIHRoZSBwcmVmZXJyZWRUZW1wbGF0ZUlkcyBjb250YWlucyB0aGUgdW5pb24gb2YgYWxsIHByb2plY3QgdHlwZXMgZm9yIGFsbCBjbGllbnQgcnVudGltZXMsIHdlIGFyZQotICAgIC8vZ3VhcmFudGVlZCB0byBoYXZlIHJldHVybmVkIGJ5IG5vdywgc28gdGhlIGNvZGUgYmVsb3cgd2lsbCBuZXZlciBiZSBleGVjdXRlZCB1bmRlciBub3JtYWwKLSAgICAvL2NpcmN1bXN0YW5jZXMuIEp1c3QgcmV0dXJuIHNvbWV0aGluZyB0byBzYXRpc2Z5IHRoZSBjb21waWxlci4gICAgCi0gICAgaWYgKHRlbXBsYXRlcy5sZW5ndGggPiAwKQotICAgICAgcmV0dXJuIHRlbXBsYXRlc1swXTsKLSAgICAKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRDbGllbnRQcm9qZWN0TmFtZSgpCi0gIHsKLSAgICBWYWxpZGF0aW9uVXRpbHMgdnUgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IEZhY2V0VXRpbHMuZ2V0QWxsUHJvamVjdHMoKTsKLSAgICBDbGllbnRSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZURlc2NyaXB0b3JCeUlkKGNsaWVudFJ1bnRpbWVJZF8pOwotICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmZ2cyA9IGRlc2MuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCk7Ci0gICAgCi0gICAgLy9DaGVjayBlYWNoIHByb2plY3QgYW5kIGl0cyBmYWNldFJ1bnRpbWUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgY2xpZW50UnVudGltZQotICAgIGZvciAoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXZ1LmlzUHJvamVjdFNlcnZpY2VQcm9qZWN0KHByb2plY3RzW2ldLCB3c2RsVVJJXywgcGFyc2VyXykpCi0gICAgICB7Ci0gICAgICAgIFNldCBmYWNldFZlcnNpb25zID0gRmFjZXRVdGlscy5nZXRGYWNldHNGb3JQcm9qZWN0KHByb2plY3RzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgZlJ1bnRpbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgZlJ1bnRpbWVOYW1lID0gbnVsbDsKLSAgICAgICAgZlJ1bnRpbWUgPSBGYWNldFV0aWxzLmdldEZhY2V0UnVudGltZUZvclByb2plY3QocHJvamVjdHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKGZSdW50aW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmUnVudGltZU5hbWUgPSBmUnVudGltZS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmFjZXRWZXJzaW9ucyAhPSBudWxsKQotICAgICAgICB7Ci0KLSAgICAgICAgICAvLyBGYWNldE1hdGNoZXIgZm0gPSBGYWNldFV0aWxzLm1hdGNoKHJmdnMsIGZhY2V0VmVyc2lvbnMpOwotICAgICAgICAgIEZhY2V0TWF0Y2hlciBmbSA9IEZhY2V0TWF0Y2hDYWNoZS5nZXRJbnN0YW5jZSgpLmdldE1hdGNoRm9yUHJvamVjdCh0cnVlLCBjbGllbnRSdW50aW1lSWRfLCBwcm9qZWN0c1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgIGJvb2xlYW4gZmFjZXRSdW50aW1lTWF0Y2hlcyA9IHRydWU7Ci0gICAgICAgICAgaWYgKGZSdW50aW1lTmFtZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0UnVudGltZU1hdGNoZXMgPSBGYWNldFV0aWxzLmlzRmFjZXRSdW50aW1lU3VwcG9ydGVkKHJmdnMsIGZSdW50aW1lTmFtZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGZtLmlzTWF0Y2goKSAmJiBmYWNldFJ1bnRpbWVNYXRjaGVzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudEZhY2V0TWF0Y2hlcl8gPSBmbTsKLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vTm8gcHJvamVjdCB3YXMgc3VpdGFibGUsIHJldHVybiBhIG5ldyBwcm9qZWN0IG5hbWUKLSAgICByZXR1cm4gUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0V2ViUHJvamVjdE5hbWUoKTsKLSAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBEZWZhdWx0UnVudGltZVRyaXBsZXQgZ2V0RGVmYXVsdENsaWVudFJ1bnRpbWVGb3JGaXhlZFJ1bnRpbWVBbmRTZXJ2ZXIoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIFN0cmluZ1tdIGNsaWVudFJ1bnRpbWVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZXNCeVR5cGUoY2xpZW50SWRzXy5nZXRUeXBlSWQoKSk7Ci0gICAgQXJyYXlMaXN0IHZhbGlkQ2xpZW50UnVudGltZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGNsaWVudFJ1bnRpbWVzLmxlbmd0aDsgaSsrICkKLSAgICB7Ci0gICAgICBDbGllbnRSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZURlc2NyaXB0b3JCeUlkKGNsaWVudFJ1bnRpbWVzW2ldKTsKLSAgICAgIGlmIChkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpLmVxdWFscyhjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKSkKLSAgICAgIHsKLSAgICAgICAgLy9DaGVjayBpZiB0aGlzIGNsaWVudCBydW50aW1lIHN1cHBvcnRzIHRoZSBzZXJ2ZXIKLSAgICAgICAgaWYgKFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmRvZXNDbGllbnRSdW50aW1lU3VwcG9ydFNlcnZlcihkZXNjLmdldElkKCksIGNsaWVudElkc18uZ2V0U2VydmVySWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpZENsaWVudFJ1bnRpbWVzLmFkZChkZXNjLmdldElkKCkpOwotICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL1JlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmZ2ID0gZGVzYy5nZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMoKTsKLSAgICAgICAgICAgIFNldCBmYWNldFZlcnNpb25zID0gRmFjZXRVdGlscy5nZXRGYWNldHNGb3JQcm9qZWN0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChmYWNldFZlcnNpb25zICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vRmFjZXRNYXRjaGVyIGZtID0gRmFjZXRVdGlscy5tYXRjaChyZnYsIGZhY2V0VmVyc2lvbnMpOwotICAgICAgICAgICAgICBGYWNldE1hdGNoZXIgZm0gPSBGYWNldE1hdGNoQ2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRNYXRjaEZvclByb2plY3QodHJ1ZSwgY2xpZW50UnVudGltZXNbaV0sIHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgaWYgKGZtLmlzTWF0Y2goKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERlZmF1bHRSdW50aW1lVHJpcGxldCBkcnQgPSBuZXcgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0KCk7Ci0gICAgICAgICAgICAgICAgZHJ0LnNldEZhY2V0TWF0Y2hlcihmbSk7Ci0gICAgICAgICAgICAgICAgZHJ0LnNldFByb2plY3ROYW1lKHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBkcnQuc2V0UnVudGltZUlkKGRlc2MuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRydDsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgaWYgKHZhbGlkQ2xpZW50UnVudGltZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICAvL1dlIGNvdWxkbid0IG1hdGNoIHRvIHRoZSBpbml0aWFsbHkgc2VsZWN0ZWQgcHJvamVjdCBzbyByZXR1cm4gdGhlIGZpcnN0IHZhbGlkIHJ1bnRpbWUuCi0gICAgICBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gbmV3IERlZmF1bHRSdW50aW1lVHJpcGxldCgpOwotICAgICAgZHJ0LnNldEZhY2V0TWF0Y2hlcihudWxsKTsKLSAgICAgIGRydC5zZXRQcm9qZWN0TmFtZShudWxsKTsKLSAgICAgIGRydC5zZXRSdW50aW1lSWQoKChTdHJpbmdbXSl2YWxpZENsaWVudFJ1bnRpbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpWzBdKTsKLSAgICAgIHJldHVybiBkcnQ7ICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1RoZXJlIGFyZSBubyBjbGllbnQgcnVudGltZXMgdGhhdCBtYXRjaCB0aGUgZml4ZWQgcnVudGltZSBhbmQgc2VydmVyLiBGYWxsIGJhY2sgdG8gb3JpZ2luYWwgYWxnb3JpdGhtCi0gICAgICBjbGllbnRJZHNGaXhlZF8gPSBmYWxzZTsKLSAgICAgIHJldHVybiBnZXREZWZhdWx0UnVudGltZShwcm9qZWN0LCBjbGllbnRJZHNfLmdldFR5cGVJZCgpLCB0cnVlKTsKLSAgICB9Ci0gIH0gIAotICAgIAotICBwcm90ZWN0ZWQgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0IGdldERlZmF1bHRSdW50aW1lKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSWQsIGJvb2xlYW4gaXNDbGllbnQpCi0gIHsKLSAgICBTdHJpbmdbXSBydW50aW1lcyA9IG51bGw7Ci0gICAgaWYgKGlzQ2xpZW50KQotICAgIHsKLSAgICAgIHJ1bnRpbWVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZXNCeVR5cGUodHlwZUlkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJ1bnRpbWVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmljZVJ1bnRpbWVzQnlTZXJ2aWNlVHlwZSh0eXBlSWQpOwotICAgIH0KLSAgICAgICAgCi0gICAgLy9TcGxpdCB0aGUgYXJyYXkgb2Ygc2VydmljZS9jbGllbnQgcnVudGltZXMgaW50byBvbmUgY29udGFpbmluZyB0aGUgcHJlZmVycmVkIHNldCBhbmQgb25lIGNvbnRhaW5pbmcgdGhlIHJlc3QuCi0gICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgU3RyaW5nIHByZWZlcnJlZFJ1bnRpbWVJZCA9IGNvbnRleHQuZ2V0UnVudGltZUlkKCk7Ci0gICAgQXJyYXlMaXN0IHByZWZlcnJlZFJ1bnRpbWVJZHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEFycmF5TGlzdCBvdGhlclJ1bnRpbWVJZHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGs9MDsgazxydW50aW1lcy5sZW5ndGg7IGsrKyApCi0gICAgewotICAgICAgU3RyaW5nIGRlc2NSdW50aW1lSWQgPSBudWxsOwotICAgICAgaWYgKGlzQ2xpZW50KQotICAgICAgewotICAgICAgICBDbGllbnRSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZURlc2NyaXB0b3JCeUlkKHJ1bnRpbWVzW2tdKTsKLSAgICAgICAgZGVzY1J1bnRpbWVJZCA9IGRlc2MuZ2V0UnVudGltZSgpLmdldElkKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChydW50aW1lc1trXSk7Ci0gICAgICAgIGRlc2NSdW50aW1lSWQgPSBkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZGVzY1J1bnRpbWVJZC5lcXVhbHMocHJlZmVycmVkUnVudGltZUlkKSkKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkUnVudGltZUlkc0xpc3QuYWRkKHJ1bnRpbWVzW2tdKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3RoZXJSdW50aW1lSWRzTGlzdC5hZGQocnVudGltZXNba10pOwotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmdbXSBwcmVmZXJyZWRSdW50aW1lSWRzID0gKFN0cmluZ1tdKXByZWZlcnJlZFJ1bnRpbWVJZHNMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgU3RyaW5nW10gb3RoZXJSdW50aW1lSWRzID0gKFN0cmluZ1tdKW90aGVyUnVudGltZUlkc0xpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAKLSAgICBTZXQgZmFjZXRWZXJzaW9ucyA9IG51bGw7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBmUnVudGltZSA9IG51bGw7Ci0gICAgU3RyaW5nIGZSdW50aW1lTmFtZSA9IG51bGw7Ci0gICAgCi0gICAgLy9JZiB0aGUgaW5pdGlhbGx5IHNlbGVjdGVkIHByb2plY3QgZXhpc3RzIGFuZCBmYWNldHMgY2FuIGJlIGluZmVycmVkIGZyb20gaXQsIGxvb2sgZm9yCi0gICAgLy9hIHNlcnZpY2UvY2xpZW50IHJ1bnRpbWUgdGhhdCBtYXRjaGVzIHRoZSBwcm9qZWN0J3MgZmFjZXRzIGFuZCBhbHNvLCBpZiBwb3NzaWJsZSwgaXRzIGZhY2V0IHJ1bnRpbWUuCi0gICAgLy9QcmVmZXJlbmNlIHNob3VsZCBiZSBnaXZlbiB0byB0aGUgcHJlZmVycmVkIHNlcnZpY2UvY2xpZW50IHJ1bnRpbWVzLiAKLSAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0gICAgewotICAgICAgZmFjZXRWZXJzaW9ucyA9IEZhY2V0VXRpbHMuZ2V0RmFjZXRzRm9yUHJvamVjdChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICBmUnVudGltZSA9IEZhY2V0VXRpbHMuZ2V0RmFjZXRSdW50aW1lRm9yUHJvamVjdChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICBmUnVudGltZU5hbWUgPSBudWxsOwotICAgICAgaWYgKGZSdW50aW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZSdW50aW1lTmFtZSA9IGZSdW50aW1lLmdldE5hbWUoKTsgICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZmFjZXRWZXJzaW9ucyAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLzEuIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBvbmUgb2YgdGhlIHByZWZlcnJlZCBzZXJ2aWNlL2NsaWVudCBydW50aW1lcyBtYXRjaGVzIHRoZSBleGlzdGluZwotICAgICAgICAvL3Byb2plY3QncyBmYWNldHMgYW5kIHJ1bnRpbWUuCi0gICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgcHJlZmVycmVkUnVudGltZUlkcy5sZW5ndGg7IHArKykKLSAgICAgICAgewotICAgICAgICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcHJmdiA9IG51bGw7Ci0gICAgICAgICAgaWYgKGlzQ2xpZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZnYgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRDbGllbnRSdW50aW1lRGVzY3JpcHRvckJ5SWQocHJlZmVycmVkUnVudGltZUlkc1twXSkuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmZ2ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChwcmVmZXJyZWRSdW50aW1lSWRzW3BdKS5nZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy9GYWNldE1hdGNoZXIgZm0gPSBGYWNldFV0aWxzLm1hdGNoKHByZnYsIGZhY2V0VmVyc2lvbnMpOwotICAgICAgICAgIEZhY2V0TWF0Y2hlciBmbSA9IEZhY2V0TWF0Y2hDYWNoZS5nZXRJbnN0YW5jZSgpLmdldE1hdGNoRm9yUHJvamVjdChpc0NsaWVudCwgcHJlZmVycmVkUnVudGltZUlkc1twXSwgcHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgIGJvb2xlYW4gZmFjZXRSdW50aW1lTWF0Y2hlcyA9IHRydWU7Ci0gICAgICAgICAgaWYgKGZSdW50aW1lTmFtZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0UnVudGltZU1hdGNoZXMgPSBGYWNldFV0aWxzLmlzRmFjZXRSdW50aW1lU3VwcG9ydGVkKHByZnYsIGZSdW50aW1lTmFtZSk7ICAKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICAgIAotICAgICAgICAgIGlmIChmbS5pc01hdGNoKCkgJiYgZmFjZXRSdW50aW1lTWF0Y2hlcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gbmV3IERlZmF1bHRSdW50aW1lVHJpcGxldCgpOwotICAgICAgICAgICAgZHJ0LnNldEZhY2V0TWF0Y2hlcihmbSk7Ci0gICAgICAgICAgICBkcnQuc2V0UHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgZHJ0LnNldFJ1bnRpbWVJZChwcmVmZXJyZWRSdW50aW1lSWRzW3BdKTsKLSAgICAgICAgICAgIHJldHVybiBkcnQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLzIuIFNlY29uZCwgY2hlY2sgdG8gc2VlIGlmIG9uZSBvZiB0aGUgb3RoZXIgY2xpZW50UnVudGltZXMgbWF0Y2hlcyB0aGUgZXhpc3RpbmcKLSAgICAgICAgLy9wcm9qZWN0J3MgZmFjZXRzIGFuZCBydW50aW1lLiAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxvdGhlclJ1bnRpbWVJZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsgICAgICAgIAotICAgICAgICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmZ2ID0gbnVsbDsKLSAgICAgICAgICBpZiAoaXNDbGllbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmZ2ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZURlc2NyaXB0b3JCeUlkKG90aGVyUnVudGltZUlkc1tpXSkuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCk7ICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJmdiA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvckJ5SWQob3RoZXJSdW50aW1lSWRzW2ldKS5nZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgRmFjZXRNYXRjaGVyIGZtID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0TWF0Y2hGb3JQcm9qZWN0KGlzQ2xpZW50LCBvdGhlclJ1bnRpbWVJZHNbaV0sIHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBib29sZWFuIGZhY2V0UnVudGltZU1hdGNoZXMgPSB0cnVlOwotICAgICAgICAgIGlmIChmUnVudGltZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNldFJ1bnRpbWVNYXRjaGVzID0gRmFjZXRVdGlscy5pc0ZhY2V0UnVudGltZVN1cHBvcnRlZChyZnYsIGZSdW50aW1lTmFtZSk7ICAKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChmbS5pc01hdGNoKCkgJiYgZmFjZXRSdW50aW1lTWF0Y2hlcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gbmV3IERlZmF1bHRSdW50aW1lVHJpcGxldCgpOwotICAgICAgICAgICAgZHJ0LnNldEZhY2V0TWF0Y2hlcihmbSk7Ci0gICAgICAgICAgICBkcnQuc2V0UHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgZHJ0LnNldFJ1bnRpbWVJZChvdGhlclJ1bnRpbWVJZHNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIGRydDsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vMy4gVGhpcmQsIGNoZWNrIHRvIHNlZSBpZiBvbmUgb2YgdGhlIHByZWZlcnJlZCBjbGllbnRSdW50aW1lcyBtYXRjaGVzIHRoZSBleGlzdGluZwotICAgICAgICAvL3Byb2plY3QncyBmYWNldHMuCi0gICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgcHJlZmVycmVkUnVudGltZUlkcy5sZW5ndGg7IHArKykKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRNYXRjaGVyIGZtID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0TWF0Y2hGb3JQcm9qZWN0KGlzQ2xpZW50LCBwcmVmZXJyZWRSdW50aW1lSWRzW3BdLCBwcm9qZWN0LmdldE5hbWUoKSk7IAotICAgICAgICAgICAgaWYgKGZtLmlzTWF0Y2goKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0IGRydCA9IG5ldyBEZWZhdWx0UnVudGltZVRyaXBsZXQoKTsKLSAgICAgICAgICAgICAgZHJ0LnNldEZhY2V0TWF0Y2hlcihmbSk7Ci0gICAgICAgICAgICAgIGRydC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgIGRydC5zZXRSdW50aW1lSWQocHJlZmVycmVkUnVudGltZUlkc1twXSk7Ci0gICAgICAgICAgICAgIHJldHVybiBkcnQ7Ci0gICAgICAgICAgICB9ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vNC4gRm91cnRoLCBjaGVjayB0byBzZWUgaWYgdGhlIG9uZSB0aGUgb3RoZXIgY2xpZW50UnVudGltZXMgbWF0Y2hlcyB0aGUgZXhpc3RpbmcKLSAgICAgICAgLy9wcm9qZWN0J3MgZmFjZXRzLiAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxvdGhlclJ1bnRpbWVJZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0TWF0Y2hlciBmbSA9IEZhY2V0TWF0Y2hDYWNoZS5nZXRJbnN0YW5jZSgpLmdldE1hdGNoRm9yUHJvamVjdChpc0NsaWVudCwgb3RoZXJSdW50aW1lSWRzW2ldLCBwcm9qZWN0LmdldE5hbWUoKSk7IAotICAgICAgICAgICAgaWYgKGZtLmlzTWF0Y2goKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0IGRydCA9IG5ldyBEZWZhdWx0UnVudGltZVRyaXBsZXQoKTsKLSAgICAgICAgICAgICAgZHJ0LnNldEZhY2V0TWF0Y2hlcihmbSk7Ci0gICAgICAgICAgICAgIGRydC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgIGRydC5zZXRSdW50aW1lSWQob3RoZXJSdW50aW1lSWRzW2ldKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGRydDsKLSAgICAgICAgICAgIH0gICAgICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9IYXZlbid0IHJldHVybmVkIHlldCBzbyB0aGlzIG1lYW5zIHRoYXQgdGhlIGludGl0aWFsbHkgc2VsZWN0ZWQgcHJvamVjdCBjYW5ub3QgYmUgdXNlZAotICAgIC8vdG8gaW5mbHVlbmNlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHNlcnZpY2UvY2xpZW50IHJ1bnRpbWUuIAotICAgIAotICAgICAgLy9Vc2UgdGhlIHByZWZlcnJlZCBwcm9qZWN0IHR5cGVzIHRvIGluZmx1ZW5jZSB0aGUgc2VsZWN0aW9uIG9mIGEgcnVudGltZS4KLSAgICAgIFByb2plY3RUb3BvbG9neUNvbnRleHQgcHRjID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0gICAgICBTdHJpbmdbXSBwcmVmZXJyZWRUZW1wbGF0ZUlkcyA9IG51bGw7Ci0gICAgICBpZiAoaXNDbGllbnQpCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZFRlbXBsYXRlSWRzID0gcHRjLmdldENsaWVudFR5cGVzKCk7ICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkVGVtcGxhdGVJZHMgPSBwdGMuZ2V0U2VydmljZVR5cGVzKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAKLSAgICAgIGZvciAoaW50IG49MDsgbjxwcmVmZXJyZWRUZW1wbGF0ZUlkcy5sZW5ndGg7IG4rKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZlcnJlZFRlbXBsYXRlSWQgPSBwcmVmZXJyZWRUZW1wbGF0ZUlkc1tuXTsKLQotICAgICAgICBmb3IgKGludCBtPTA7IG08cHJlZmVycmVkUnVudGltZUlkcy5sZW5ndGg7IG0rKykKLSAgICAgICAgewotICAgICAgICAgIC8vSWYgdGhpcyBjbGllbnQgb3Igc2VydmljZSBydW50aW1lIHN1cHBvcnRzIHRoaXMgdGVtcGxhdGUsIGNob29zZSBpdCBhbmQgZXhpdC4gICAgICAgIAotICAgICAgICAgIGJvb2xlYW4gbWF0Y2hlcyA9IGZhbHNlOwotICAgICAgICAgIGlmIChpc0NsaWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaGVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZG9lc0NsaWVudFJ1bnRpbWVTdXBwb3J0VGVtcGxhdGUocHJlZmVycmVkUnVudGltZUlkc1ttXSwgcHJlZmVycmVkVGVtcGxhdGVJZCk7ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaGVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZG9lc1NlcnZpY2VSdW50aW1lU3VwcG9ydFRlbXBsYXRlKHByZWZlcnJlZFJ1bnRpbWVJZHNbbV0sIHByZWZlcnJlZFRlbXBsYXRlSWQpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAobWF0Y2hlcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gbmV3IERlZmF1bHRSdW50aW1lVHJpcGxldCgpOwotICAgICAgICAgICAgZHJ0LnNldEZhY2V0TWF0Y2hlcihudWxsKTsKLSAgICAgICAgICAgIC8vSWYgdGhlIHByb2plY3QgZG9lc24ndCBleGlzdCwgdXNlIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgd2FzIHBhc3NlZCBpbi4KLSAgICAgICAgICAgIC8vSWYgdGhlIHByb2plY3QgZXhpc3RzLCBpdCBtZWFucyB0aGF0IHByZXZpb3VzIGNvZGUgaW4gdGhpcyBtZXRob2QKLSAgICAgICAgICAgIC8vZGV0ZXJtaW5lZCBpdCB0byBub3QgYmUgYSBzdWl0YWJsZSBwcm9qZWN0LiBDbGVhciB0aGUgcHJvamVjdCBuYW1lLgotICAgICAgICAgICAgaWYgKHByb2plY3Q9PW51bGwgfHwgcHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZHJ0LnNldFByb2plY3ROYW1lKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkcnQuc2V0UHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHJ0LnNldFJ1bnRpbWVJZChwcmVmZXJyZWRSdW50aW1lSWRzW21dKTsKLSAgICAgICAgICAgIHJldHVybiBkcnQ7ICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAKLSAgICAKLSAgICAvL1N0aWxsIGhhdmVuJ3QgcmV0dXJuZWQuIFJldHVybiB0aGUgZmlyc3QgcHJlZmVycmVkIHNlcnZpY2UvY2xpZW50IHJ1bnRpbWUgaWQuCi0gICAgaWYgKHByZWZlcnJlZFJ1bnRpbWVJZHMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gbmV3IERlZmF1bHRSdW50aW1lVHJpcGxldCgpOwotICAgICAgZHJ0LnNldEZhY2V0TWF0Y2hlcihudWxsKTsKLSAgICAgIC8vSWYgdGhlIHByb2plY3QgZG9lc24ndCBleGlzdCwgdXNlIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgd2FzIHBhc3NlZCBpbi4KLSAgICAgIC8vSWYgdGhlIHByb2plY3QgZXhpc3RzLCBpdCBtZWFucyB0aGF0IHByZXZpb3VzIGNvZGUgaW4gdGhpcyBtZXRob2QKLSAgICAgIC8vZGV0ZXJtaW5lZCBpdCB0byBub3QgYmUgYSBzdWl0YWJsZSBwcm9qZWN0LiBDbGVhciB0aGUgcHJvamVjdCBuYW1lLiAgICAgIAotICAgICAgaWYgKHByb2plY3Q9PW51bGwgfHwgcHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgZHJ0LnNldFByb2plY3ROYW1lKG51bGwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkcnQuc2V0UHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgZHJ0LnNldFJ1bnRpbWVJZChwcmVmZXJyZWRSdW50aW1lSWRzWzBdKTsKLSAgICAgIHJldHVybiBkcnQ7ICAgICAgCi0gICAgfQotICAgICAgCi0gICAgaWYgKHJ1bnRpbWVzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0IGRydCA9IG5ldyBEZWZhdWx0UnVudGltZVRyaXBsZXQoKTsKLSAgICAgIGRydC5zZXRGYWNldE1hdGNoZXIobnVsbCk7Ci0gICAgICAvL0lmIHRoZSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QsIHVzZSB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHdhcyBwYXNzZWQgaW4uCi0gICAgICAvL0lmIHRoZSBwcm9qZWN0IGV4aXN0cywgaXQgbWVhbnMgdGhhdCBwcmV2aW91cyBjb2RlIGluIHRoaXMgbWV0aG9kCi0gICAgICAvL2RldGVybWluZWQgaXQgdG8gbm90IGJlIGEgc3VpdGFibGUgcHJvamVjdC4gQ2xlYXIgdGhlIHByb2plY3QgbmFtZS4KLSAgICAgIGlmIChwcm9qZWN0PT1udWxsIHx8IHByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIGRydC5zZXRQcm9qZWN0TmFtZShudWxsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZHJ0LnNldFByb2plY3ROYW1lKHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGRydC5zZXRSdW50aW1lSWQocnVudGltZXNbMF0pOwotICAgICAgcmV0dXJuIGRydDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIERlZmF1bHRSdW50aW1lVHJpcGxldCBkcnQgPSBuZXcgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0KCk7Ci0gICAgICBkcnQuc2V0RmFjZXRNYXRjaGVyKG51bGwpOwotICAgICAgLy9JZiB0aGUgcHJvamVjdCBkb2Vzbid0IGV4aXN0LCB1c2UgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB3YXMgcGFzc2VkIGluLgotICAgICAgLy9JZiB0aGUgcHJvamVjdCBleGlzdHMsIGl0IG1lYW5zIHRoYXQgcHJldmlvdXMgY29kZSBpbiB0aGlzIG1ldGhvZAotICAgICAgLy9kZXRlcm1pbmVkIGl0IHRvIG5vdCBiZSBhIHN1aXRhYmxlIHByb2plY3QuIENsZWFyIHRoZSBwcm9qZWN0IG5hbWUuCi0gICAgICBpZiAocHJvamVjdD09bnVsbCB8fCBwcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBkcnQuc2V0UHJvamVjdE5hbWUobnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRydC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBkcnQuc2V0UnVudGltZUlkKG51bGwpOwotICAgICAgcmV0dXJuIGRydDsKLSAgICB9ICAgIAotICB9Ci0gIC8qKgotICogCi0gKiBAcGFyYW0gcHJvamVjdAotICogQHJldHVybgotICovCi0gIHByb3RlY3RlZCBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRQcm9qZWN0RUFSQ2hvaWNlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBTdHJpbmdbXSBmbGV4UHJvamVjdHMgPSBnZXRBbGxGbGV4aWJsZVByb2plY3RzKCk7Ci0gICAgU2VsZWN0aW9uTGlzdCBsaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3QoZmxleFByb2plY3RzLCAwKTsKLSAgICByZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGxpc3QsIG51bGwpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdCBnZXRFQVJQcm9qZWN0cygpCi0gIHsKLSAgICBTdHJpbmdbXSBmbGV4UHJvamVjdHMgPSBnZXRBbGxGbGV4aWJsZVByb2plY3RzKCk7Ci0gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0KGZsZXhQcm9qZWN0cywgMCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAKLSAgICAgIAotICAvKgotICAgKiBTZXQgZGVmYXVsdHMgZm9yIHRoZSBjbGllbnQtc2lkZSBmcm9tIHRoZSBzZXJ2aWNlLXNpZGUgaWYgcG9zc2libGUuCi0gICAqIFNldHMgY2xpZW50UHJvamVjdE5hbWVfIHRvIGEgdmFsdWUgYmFzZWQgb24gdGhlIHNlcnZpY2UgcHJvamVjdCBuYW1lLgotICAgKiAKLSAgICogUmV0dXJucyBhbiBJU3RhdHVzLk9LIGlmIHRoZSBzZXJ2aWNlIHNpZGUgdmFsdWVzIGZvciBzZXJ2ZXIgYW5kIFdlYiAKLSAgICogc2VydmljZSBydW50aW1lIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgdmFsdWVzIGZvciBjbGllbnRSdW50aW1lSWRfLAotICAgKiBjbGllbnRDb21wb25lbnRUeXBlXywgYWxsIHRoZSB2YWx1ZXMgaW4gY2xpZW50SWRzXywgYW5kIGNsaWVudEVhclByb2plY3ROYW1lXy4KLSAgICogCi0gICAqIFJldHVybnMgYW4gSVN0YXR1cy5FUlJPUiBvdGhlcndpc2UsIGxlYXZpbmcgb25seSB0aGUgY2xpZW50UHJvamVjdE5hbWVfIHNldC4gCi0gICAqLwotICBwcm90ZWN0ZWQgSVN0YXR1cyBkZWZhdWx0Q2xpZW50U2lkZUZyb21TZXJ2aWNlU2lkZShTdHJpbmcgc2VydmljZVByb2plY3ROYW1lLCBUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlSWRzLCBib29sZWFuIHNlcnZpY2VOZWVkRUFSLCBTdHJpbmcgc2VydmljZUVhclByb2plY3ROYW1lKQotICB7Ci0gICAgLy8xLiBTdGFydCB3aXRoIHNldHRpbmcgdGhlIGRlZmF1bHQgY2xpZW50IHByb2plY3QgbmFtZSBiYXNlZCBvbiB0aGUgc2VydmljZSBwcm9qZWN0IG5hbWUuCi0gICAgYm9vbGVhbiBpc0VKQiA9IGZhbHNlOwotICAgIFN0cmluZyBpbXBsSWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRXZWJTZXJ2aWNlSW1wbElkRnJvbVR5cGVJZChzZXJ2aWNlSWRzLmdldFR5cGVJZCgpKTsKLSAgICBpc0VKQiA9IChpbXBsSWQuZXF1YWxzKCJvcmcuZWNsaXBzZS5qc3Qud3Mud3NJbXBsLmVqYiIpKTsKLSAgICBTdHJpbmdbXSB1cGRhdGVkTmFtZXMgPSBSZXNvdXJjZVV0aWxzLmdldENsaWVudFByb2plY3RDb21wb25lbnROYW1lKHNlcnZpY2VQcm9qZWN0TmFtZSwgc2VydmljZVByb2plY3ROYW1lLCBpc0VKQik7Ci0gICAgY2xpZW50UHJvamVjdE5hbWVfID0gdXBkYXRlZE5hbWVzWzBdOwotICAgIAotICAgIC8vMi4gSWRlYWxseSwgdGhlIHNlcnZlciBhbmQgcnVudGltZSBvbiB0aGUgY2xpZW50LXNpZGUgd2lsbCBiZSBkZWZhdWx0ZWQKLSAgICAvLyAgIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgc2VydmljZSBzaWRlLiBJZiBhIGNsaWVudCBydW50aW1lIGlkIHRoYXQgCi0gICAgLy8gICBzdXBwb3J0cyBjbGllbnRQcm9qZWN0TmFtZV8gYW5kIHRoZSBzZXJ2aWNlLXNpZGUgc2VydmVyIGFuZCBydW50aW1lIGRlZmF1bHRzCi0gICAgLy8gICBjYW4gYmUgZm91bmQsIGNob29zZSBpdC4KLSAgICBJUHJvamVjdCBjbGllbnRQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGNsaWVudFByb2plY3ROYW1lXyk7Ci0gICAgVHlwZVJ1bnRpbWVTZXJ2ZXIgdGVzdElkcyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotICAgIHRlc3RJZHMuc2V0VHlwZUlkKGNsaWVudElkc18uZ2V0VHlwZUlkKCkpOwotICAgIHRlc3RJZHMuc2V0UnVudGltZUlkKHNlcnZpY2VJZHMuZ2V0UnVudGltZUlkKCkpOwotICAgIHRlc3RJZHMuc2V0U2VydmVySWQoc2VydmljZUlkcy5nZXRTZXJ2ZXJJZCgpKTsKLSAgICB0ZXN0SWRzLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmljZUlkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgIAotICAgIGlmIChjbGllbnRQcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIGNsaWVudENvbXBvbmVudFR5cGVfID0gIiI7Ci0gICAgICBjbGllbnRSdW50aW1lSWRfID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZUlkKHRlc3RJZHMsIHNlcnZpY2VQcm9qZWN0TmFtZSwgY2xpZW50Q29tcG9uZW50VHlwZV8pOwotICAgICAgaWYgKGNsaWVudFJ1bnRpbWVJZF8gIT0gbnVsbCAmJiBjbGllbnRSdW50aW1lSWRfLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIGNsaWVudElkc18uc2V0UnVudGltZUlkKHNlcnZpY2VJZHMuZ2V0UnVudGltZUlkKCkpOwotICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlcklkKHNlcnZpY2VJZHMuZ2V0U2VydmVySWQoKSk7Ci0gICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2aWNlSWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1NlZSBpZiB0aGVyZSBpcyBhIGNsaWVudCBwcm9qZWN0IHR5cGUgdGhhdCBzdXBwb3J0cyB0aGUgc2VydmljZS1zaWRlCi0gICAgICAvL3NlcnZlciBhbmQgcnVudGltZSBkZWZhdWx0cy4gUGljayBhIGNsaWVudCBwcm9qZWN0IHR5cGUgYmFzZWQgb24gcHJvamVjdCB0b3BvbG9neSBwcmVmZXJlbmNlcy4KLSAgICAgIC8vQ2hvb3NlIHRoZSBjbGllbnRSdW50aW1lSWRfIGFjY29yZGluZ2x5LgotICAgICAgU3RyaW5nW10gdGVtcGxhdGVJZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRDbGllbnRQcm9qZWN0VGVtcGxhdGVzKGNsaWVudElkc18uZ2V0VHlwZUlkKCksIHRlc3RJZHMuZ2V0UnVudGltZUlkKCkpOwotICAgICAgaWYgKHRlbXBsYXRlSWRzICE9IG51bGwgJiYgdGVtcGxhdGVJZHMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBwdGMgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nW10gcHJlZmVycmVkVGVtcGxhdGVJZHMgPSBwdGMuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICAgICAgb3V0ZXI6IGZvciAoaW50IGogPSAwOyBqIDwgcHJlZmVycmVkVGVtcGxhdGVJZHMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlSWRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZUlkID0gdGVtcGxhdGVJZHNbaV07Ci0gICAgICAgICAgICBpZiAodGVtcGxhdGVJZC5lcXVhbHMocHJlZmVycmVkVGVtcGxhdGVJZHNbal0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBHZXQgYSBjbGllbnRSdW50aW1lSWQgZm9yIHRoaXMgdGVtcGxhdGUKLSAgICAgICAgICAgICAgU3RyaW5nIG5ld0NsaWVudFJ1bnRpbWVJZCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldENsaWVudFJ1bnRpbWVJZCh0ZXN0SWRzLCBjbGllbnRQcm9qZWN0TmFtZV8sCi0gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkKTsKLSAgICAgICAgICAgICAgaWYgKG5ld0NsaWVudFJ1bnRpbWVJZC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbGllbnRSdW50aW1lSWRfID0gbmV3Q2xpZW50UnVudGltZUlkOwotICAgICAgICAgICAgICAgIGNsaWVudENvbXBvbmVudFR5cGVfID0gdGVtcGxhdGVJZDsKLSAgICAgICAgICAgICAgICBjbGllbnRJZHNfLnNldFJ1bnRpbWVJZChzZXJ2aWNlSWRzLmdldFJ1bnRpbWVJZCgpKTsKLSAgICAgICAgICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlcklkKHNlcnZpY2VJZHMuZ2V0U2VydmVySWQoKSk7Ci0gICAgICAgICAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZpY2VJZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IAotICAgIAotICAgIC8vMy4gSWYgc3RlcCAyIHdhcyBzdWNjZXNzZnVsLCBjbGllbnRSdW50aW1lSWRfIHNob3VsZCBub3cgYmUgc2V0LCBhbG9uZyB3aXRoIGNsaWVudFByb2plY3ROYW1lXywKLSAgICAvLyAgIGNsaWVudENvbXBvbmVudFR5cGVfLCBhbmQgYWxsIHRoZSB2YWx1ZXMgaW4gY2xpZW50SWRzXy4gQWxsIHRoYXQgcmVtYWlucyBpcyBzZXR0aW5nIHRoZSBFQVIuCi0gICAgaWYgKGNsaWVudFJ1bnRpbWVJZF8gIT0gbnVsbCAmJiBjbGllbnRSdW50aW1lSWRfLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgc2V0RGVmYXVsdENsaWVudEVhclByb2plY3QoKTsKLSAgICAgIC8vVXBkYXRlIHRoZSBjbGllbnQgc2lkZSBFQVIgZnJvbSB0aGUgc2VydmljZSBzaWRlIEVBUiBpZiBuZWNlc3NhcnkuCi0gICAgICBpZiAoc2VydmljZU5lZWRFQVIpCi0gICAgICB7Ci0gICAgICAgIGRlZmF1bHRDbGllbnRFYXJGcm9tU2VydmljZUVhcihzZXJ2aWNlUHJvamVjdE5hbWUsIHNlcnZpY2VFYXJQcm9qZWN0TmFtZSk7IAotICAgICAgfQotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1N0ZXAgMiB3YXMgbm90IHN1Y2Nlc3NmdWwuIENsaWVudCBzaWRlIGRlZmF1bHRpbmcgY2Fubm90IGJlIGRvbmUgdXNpbmcgdGhlIHNlcnZpY2Ugc2lkZSBzZXJ2ZXIKLSAgICAgIC8vYW5kIHdlYiBzZXJ2aWNlIHJ1bnRpbWUgZGVmYXVsdHMuIFJldHVybiBhbiBlcnJvciBzdGF0dXMuCi0gICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIiIpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZGVmYXVsdENsaWVudEVhckZyb21TZXJ2aWNlRWFyKFN0cmluZyBzZXJ2aWNlUHJvamVjdE5hbWUsIFN0cmluZyBzZXJ2aWNlRWFyUHJvamVjdE5hbWUpCi0gIHsKLSAgICAvL0NsaWVudCBzaWRlCi0gICAgaWYgKGNsaWVudE5lZWRFQVJfKQotICAgIHsKLSAgICAgIElQcm9qZWN0IGNsaWVudFByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoY2xpZW50UHJvamVjdE5hbWVfKTsKLSAgICAgIGlmKGNsaWVudFByb2plY3Q9PW51bGwgfHwgIWNsaWVudFByb2plY3QuZXhpc3RzKCkgCi0gICAgICAgIHx8ICEoY2xpZW50RWFyUHJvamVjdE5hbWVfLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmljZUVhclByb2plY3ROYW1lKSkpCi0gICAgICB7Ci0gICAgICAgIFByb2plY3RUb3BvbG9neUNvbnRleHQgcHRjPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsgICAgICAgICAKLSAgICAgICAgaWYgKCFwdGMuaXNVc2VUd29FQVJzKCkpIAotICAgICAgICB7Ci0gICAgICAgICAgY2xpZW50RWFyUHJvamVjdE5hbWVfID0gc2VydmljZUVhclByb2plY3ROYW1lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICBJUHJvamVjdCBwcm94eUVBUlByb2plY3QgPSBnZXRVbmlxdWVDbGllbnRFQVIoY2xpZW50RWFyUHJvamVjdE5hbWVfLCBzZXJ2aWNlRWFyUHJvamVjdE5hbWUsIGNsaWVudFByb2plY3ROYW1lXywgc2VydmljZVByb2plY3ROYW1lKTsKLSAgICAgICAgICBjbGllbnRFYXJQcm9qZWN0TmFtZV8gPSBwcm94eUVBUlByb2plY3QuZ2V0TmFtZSgpOwotICAgICAgICB9ICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0VW5pcXVlQ2xpZW50RUFSKFN0cmluZyBlYXJQcm9qZWN0TmFtZSwgU3RyaW5nIHNlcnZpY2VFQVJQcm9qZWN0LCBTdHJpbmcgY2xpZW50UHJvamVjdE5hbWUsIFN0cmluZyBzZXJ2aWNlUHJvamVjdE5hbWUpIHsKLQotICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG5ldyBTdHJpbmcoKTsKLSAgICAvL0lmIHRoZSBjbGllbnQgcHJvamVjdCBkb2Vzbid0IGV4aXN0IGFuZCB0aGUgc2VydmljZSBwcm9qZWN0IGRvZXMsIGVuc3VyZSB0aGUKLSAgICAvL3RoZSBjbGllbnQgc2lkZSBFQVIncyBKMkVFIGxldmVsIGlzIHN1Y2ggdGhhdCB0aGUgc2VydmljZSBwcm9qZWN0IGNvdWxkIGJlIGFkZGVkIHRvIGl0LgotICAgIC8vVGhpcyB3aWxsIGVuc3VyZSB3ZSBkb24ndCBkZWZhdWx0IHRoZSBwYWdlIHdpdGggYSBjbGllbnQgcHJvamVjdCBFQVIgYXQgYSBsb3dlcgotICAgIC8vSjJFRSBsZXZlbCB0aGFuIHRoZSBzZXJ2aWNlIHNpZGUuCi0gICAgYm9vbGVhbiBnb29kSjJFRUxldmVsID0gdHJ1ZTsKLSAgICBpZiAoIWVhclByb2plY3ROYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmljZUVBUlByb2plY3QpKQotICAgIHsKLSAgICAgIElQcm9qZWN0IGNsaWVudFByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoY2xpZW50UHJvamVjdE5hbWUpOwotICAgICAgSVByb2plY3Qgc2VydmljZVByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZVByb2plY3ROYW1lKTsKLSAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZWFyUHJvamVjdE5hbWUpOwotICAgICAgaWYgKCFjbGllbnRQcm9qZWN0LmV4aXN0cygpICYmIHNlcnZpY2VQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBJU3RhdHVzIGFzc29jaWF0aW9uU3RhdHVzID0gSjJFRVV0aWxzLmNhbkFzc29jaWF0ZVByb2plY3RUb0VBUihzZXJ2aWNlUHJvamVjdCwgZWFyUHJvamVjdCk7Ci0gICAgICAgIGdvb2RKMkVFTGV2ZWwgPSAoYXNzb2NpYXRpb25TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKCFlYXJQcm9qZWN0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2VFQVJQcm9qZWN0KSAmJiBnb29kSjJFRUxldmVsKSB7Ci0gICAgICBwcm9qZWN0TmFtZSA9IGVhclByb2plY3ROYW1lOwotICAgIH0gICAgCi0gICAgZWxzZSB7Ci0gICAgICBwcm9qZWN0TmFtZSA9IGNsaWVudFByb2plY3ROYW1lK0RFRkFVTFRfQ0xJRU5UX0VBUl9QUk9KRUNUX0VYVDsKLSAgICAgIGludCBpPTE7ICAgICAgCi0gICAgICB3aGlsZSAocHJvamVjdE5hbWUuZXF1YWxzSWdub3JlQ2FzZShzZXJ2aWNlRUFSUHJvamVjdCkpIHsKLSAgICAgICAgcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZStpOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm9qZWN0TmFtZS5lcXVhbHMoIiIpID8gbnVsbCA6IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdHNGb3JFeHRlbnNpb24oSUVudmlyb25tZW50IGVudikKLSAgewotICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3J0ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZShjbGllbnRSdW50aW1lSWRfKTsKLSAgICBpZiAod3NydCAhPSBudWxsKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VDbGllbnRJbmZvIHdzSW5mbyA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50SW5mbygpOyAgICAgIAotICAgICAgd3NJbmZvLnNldFNlcnZlckZhY3RvcnlJZChjbGllbnRJZHNfLmdldFNlcnZlcklkKCkpOwotICAgICAgd3NJbmZvLnNldFNlcnZlckluc3RhbmNlSWQoY2xpZW50SWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgICAgd3NJbmZvLnNldFN0YXRlKFdlYlNlcnZpY2VTdGF0ZS5VTktOT1dOX0xJVEVSQUwpOwotICAgICAgd3NJbmZvLnNldFdlYlNlcnZpY2VSdW50aW1lSWQoY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0gICAgICB3c0luZm8uc2V0V3NkbFVSTCh3c2RsVVJJXyk7Ci0KLSAgICAgIHdlYlNlcnZpY2VDbGllbnRfID0gd3NydC5nZXRXZWJTZXJ2aWNlQ2xpZW50KHdzSW5mbyk7Ci0gICAgICBXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW8gPSBXZWJTZXJ2aWNlU2NlbmFyaW8uQ0xJRU5UX0xJVEVSQUw7Ci0gICAgICBpZiAocmVzb3VyY2VDb250ZXh0XyAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb250ZXh0XyA9IG5ldyBTaW1wbGVDb250ZXh0KHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRlc3RfLCBmYWxzZSwgc2NlbmFyaW8sIHJlc291cmNlQ29udGV4dF8uaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSwgcmVzb3VyY2VDb250ZXh0XwotICAgICAgICAgICAgLmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSwgcmVzb3VyY2VDb250ZXh0Xy5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpOwotICAgICAgfQotICAgIH0KLSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKGNsaWVudEluaXRpYWxQcm9qZWN0XyA9PSBudWxsKQotICAgIHsKLSAgICAgIGNsaWVudEluaXRpYWxQcm9qZWN0XyA9IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIH0KLSAgfQotICAKLSAgLy8gVGhpcyBpcyBmb3IgdGhlIEFudCBzY2VuYXJpbyB3aGVyZSB0aGUgY2xpZW50IHByb2plY3QgbmFtZSBjYW4gYmUgc2V0IGluIHRoZSBwcm9wZXJ0eSBmaWxlLgotICAvLyBJZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBDbGllbnRQcm9qZWN0TmFtZSB1c2UgaXQgZm9yIGRlZmF1bHRpbmcgcHVycG9zZXMKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLQkgIGNsaWVudFByb2plY3ROYW1lXyA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJbml0aWFsUHJvamVjdChJUHJvamVjdCBjbGllbnRJbml0aWFsUHJvamVjdCkKLSAgewotICAgIGNsaWVudEluaXRpYWxQcm9qZWN0XyA9IGNsaWVudEluaXRpYWxQcm9qZWN0OwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uXyBUaGUgaW5pdGlhbEluaXRpYWxTZWxlY3Rpb25fIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgaW5pdGlhbFByb2plY3RfID0gZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKGluaXRpYWxJbml0aWFsU2VsZWN0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50TmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50TmVlZEVBUl87Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHBhcnNlcl8gVGhlIHBhcnNlcl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyKSB7Ci0gICAgcGFyc2VyXyA9IHBhcnNlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHdzZGxVUklfID0gd3NkbFVSSTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoYm9vbGVhbiB0ZXN0U2VydmljZSkKLSAgewotICAgIHRlc3RfID0gdGVzdFNlcnZpY2U7Ci0gIH0gICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dCggUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCApCi0gIHsKLSAgICByZXNvdXJjZUNvbnRleHRfID0gcmVzb3VyY2VDb250ZXh0OyAgIAotICB9ICAKLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QWxsRmxleGlibGVQcm9qZWN0cygpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKCFwcm9qZWN0c1tpXS5nZXROYW1lKCkuZXF1YWxzKCJTZXJ2ZXJzIikgJiYgIXByb2plY3RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCIuIikpCi0gICAgICB7Ci0gICAgICAgIHYuYWRkKHByb2plY3RzW2ldLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKXYudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIGNsYXNzIEZhY2V0UnVudGltZU1hdGNoZXIKLSAgewotICAgIEZhY2V0TWF0Y2hlciBmYWNldE1hdGNoZXI7Ci0gICAgYm9vbGVhbiBydW50aW1lTWF0Y2hlczsKLSAgICAKLSAgICBwdWJsaWMgRmFjZXRNYXRjaGVyIGdldEZhY2V0TWF0Y2hlcigpCi0gICAgewotICAgICAgcmV0dXJuIGZhY2V0TWF0Y2hlcjsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0RmFjZXRNYXRjaGVyKEZhY2V0TWF0Y2hlciBmYWNldE1hdGNoZXIpCi0gICAgewotICAgICAgdGhpcy5mYWNldE1hdGNoZXIgPSBmYWNldE1hdGNoZXI7Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGlzUnVudGltZU1hdGNoZXMoKQotICAgIHsKLSAgICAgIHJldHVybiBydW50aW1lTWF0Y2hlczsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UnVudGltZU1hdGNoZXMoYm9vbGVhbiBydW50aW1lTWF0Y2hlcykKLSAgICB7Ci0gICAgICB0aGlzLnJ1bnRpbWVNYXRjaGVzID0gcnVudGltZU1hdGNoZXM7Ci0gICAgfSAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0Ci0gIHsKLSAgICBGYWNldE1hdGNoZXIgZmFjZXRNYXRjaGVyXzsKLSAgICBTdHJpbmcgcHJvamVjdE5hbWVfOwotICAgIFN0cmluZyBydW50aW1lSWRfOwotICAgIAotICAgIAotICAgIHB1YmxpYyBEZWZhdWx0UnVudGltZVRyaXBsZXQoKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZhY2V0TWF0Y2hlciBnZXRGYWNldE1hdGNoZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBmYWNldE1hdGNoZXJfOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWNldE1hdGNoZXIoRmFjZXRNYXRjaGVyIGZhY2V0TWF0Y2hlcl8pCi0gICAgewotICAgICAgdGhpcy5mYWNldE1hdGNoZXJfID0gZmFjZXRNYXRjaGVyXzsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIHByb2plY3ROYW1lXzsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lXykKLSAgICB7Ci0gICAgICB0aGlzLnByb2plY3ROYW1lXyA9IHByb2plY3ROYW1lXzsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lSWQoKQotICAgIHsKLSAgICAgIHJldHVybiBydW50aW1lSWRfOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lSWQoU3RyaW5nIHJ1bnRpbWVJZF8pCi0gICAgewotICAgICAgdGhpcy5ydW50aW1lSWRfID0gcnVudGltZUlkXzsKLSAgICB9ICAgICAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvUHJvamVjdFNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvUHJvamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWM0NTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1Byb2plY3RTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMDQgMTI0MTQzICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgICAgIAotICogMjAwNjAyMjEgICAxMjI2NjEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDIyMyAgIDEyOTAyMCByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwMjI3ICAgMTI0MzkyIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MTMgICAxMzU1ODEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQyNyAgIDEzODA1OCBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDUxMCAgIDE0MDg2OCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDYwNTI0ICAgMTQxMDI0IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwODI5ICAgMTQ1NDQ5IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBXZWIgc2VydmljZSBjbGllbnQgcHJvamVjdCB0eXBlIGRyb3Bkb3duIGRpc2FibGVkIGFmdGVyIHNlbGVjdGluZyBjbGllbnQgcHJvamVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkRlZmF1bHRpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFNlbGVjdGlvbldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0KLQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIAotICAvL3ByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgcHJvamVjdHNfOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRFQVJfOwotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0cnNJZHNfOwotCi0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXJfOwotCi0gIHByaXZhdGUgVGV4dCBtZXNzYWdlVGV4dF87Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50XyA9IGZhbHNlOwotCi0gIHByaXZhdGUgYnl0ZSBDUkVBVEVfUFJPSkVDVCA9IChieXRlKSAxOwotCi0gIHByaXZhdGUgYnl0ZSBDUkVBVEVfRUFSID0gKGJ5dGUpIDI7Ci0KLSAgcHJpdmF0ZSBieXRlIEFERF9FQVJfQVNTT0NJQVRJT04gPSAoYnl0ZSkgNDsKLSAgCi0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudF87Ci0gIHByaXZhdGUgQ29tYm8gbW9kdWxlUHJvamVjdF87Ci0gIHByaXZhdGUgQ29tYm8gZWFyUHJvamVjdF87Ci0gIHByaXZhdGUgQ29tYm8gcHJvamVjdFR5cGVfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSB0ZW1wbGF0ZXNfOwotCi0gIC8vcHJpdmF0ZSBTdHJpbmcgICBjb21wb25lbnRUeXBlXzsKLSAgCi0gIHByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFR5cGVMaXN0ZW5lcl87Ci0gIHByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kdWxlUHJvamVjdExpc3RlbmVyXzsKLSAgcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBlYXJQcm9qZWN0TGlzdGVuZXJfOwotCi0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDYgZm9yIHRoZSBzZXJ2aWNlLXNpZGUgV2ViIHByb2plY3QgY29tYm8gYm94IG9mIHRoZQotICAgKiBydW50aW1lIHNlbGVjdGlvbiBQYWdlCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCA9IHBsdWdpbklkXyArICIuUFdSUzAwMDYiOwotCi0gIC8vcHJpdmF0ZSBDb21ibyBtb2R1bGVfOwotCi0gIC8qIENPTlRFWFRfSUQgUFdSUzAwMTggZm9yIHRoZSBjbGllbnQgcHJvamVjdCB0eXBlIGNvbWJvIGJveCBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfQ09NQk9fQ0xJRU5UX1BST0pFQ1RfVFlQRSA9IHBsdWdpbklkXyArICIuUFdSUzAwMTgiOwotICAKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAyNCBmb3IgdGhlIHNlcnZpY2UgcHJvamVjdCB0eXBlIGNvbWJvIGJveCBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfQ09NQk9fU0VSVklDRV9QUk9KRUNUX1RZUEUgPSBwbHVnaW5JZF8gKyAiLlBXUlMwMDE4IjsgICAgCi0KLSAgLy9wcml2YXRlIENvbWJvIGVhck1vZHVsZV87Ci0KLSAgLyoKLSAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFByb2plY3RTZWxlY3Rpb25XaWRnZXQoKSB7Ci0gIH0KLQotICAvKgotICAgKiBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0IEBwYXJhbSBpc0NsaWVudAotICAgKi8KLSAgcHVibGljIFByb2plY3RTZWxlY3Rpb25XaWRnZXQoYm9vbGVhbiBpc0NsaWVudCkgewotICAgIHRoaXMuaXNDbGllbnRfID0gaXNDbGllbnQ7Ci0gIH0KLSAgICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLQkgIAotICAgIHBhcmVudF8gPSBwYXJlbnQ7Ci0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMocGx1Z2luSWRfKTsKLQotICAgIHN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOwotCQkKLSAgICBpZiAoaXNDbGllbnRfKQotCXsKLQkgIG1vZHVsZVByb2plY3RfID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYXJlbnQsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9DTElFTlRfUFJPSkVDVCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0NMSUVOVF9QUk9KRUNULCBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLSAgICAgIHByb2plY3RUeXBlXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQ0xJRU5UX1RZUEUsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXQ1JfQ09NQk9fQ0xJRU5UX1RZUEUsIElORk9QT1BfUFdSU19DT01CT19DTElFTlRfUFJPSkVDVF9UWVBFLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8U1dULlJFQURfT05MWSk7ICAgICAgCi0JICBlYXJQcm9qZWN0XyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQ0xJRU5UX0VBUl9QUk9KRUNULCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfQ0xJRU5UX0VBUl9QUk9KRUNULCBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLSAgICB9Ci0gICAgZWxzZSAKLQl7ICAgICAgCi0JICBtb2R1bGVQcm9qZWN0XyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU0VSVklDRV9QUk9KRUNULCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU0VSVklDRV9QUk9KRUNULCBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLSAgICAgIHByb2plY3RUeXBlXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU0VSVklDRV9UWVBFLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QV0NSX0NPTUJPX1NFUlZJQ0VfVFlQRSwgSU5GT1BPUF9QV1JTX0NPTUJPX1NFUlZJQ0VfUFJPSkVDVF9UWVBFLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOyAgICAgIAotCSAgZWFyUHJvamVjdF8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhcmVudCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1NFUlZJQ0VfRUFSX1BST0pFQ1QsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TRVJWSUNFX0VBUl9QUk9KRUNULCBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLSAgICB9Ci0gICAgCi0gICAgLy9UZW1wb3JhcmlseSByZW1vdmUgdGhlIGxpc3RlbmVycwotICAgIAotICAgIHByb2plY3RUeXBlTGlzdGVuZXJfID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2dCkgCi0gICAgICB7Ci0gICAgICAgIGhhbmRsZVByb2plY3RUeXBlQ2hhbmdlZCgpOwotICAgICAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgICAgIH0KLSAgICB9OyAgICAKLSAgICAKLQltb2R1bGVQcm9qZWN0TGlzdGVuZXJfID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZ0KSAKLQkJCQkJICAgICAgICAgICB7Ci0JCQkJCSAgICAgICAgICAgICBoYW5kbGVQcm9qZWN0Q2hhbmdlZCgpOwotCQkJCQkgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KCBudWxsICk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgIAotCWVhclByb2plY3RMaXN0ZW5lcl8gPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIAotCQkJCSAgICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudCggbnVsbCApOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgCQkJCQkgIAotICAgIC8vIG1lc3NhZ2UgYXJlYQotICAgIG1lc3NhZ2VUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dChwYXJlbnQsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9OT19MQUJFTCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX05PX0xBQkVMLCBudWxsLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkpOwotICAgIHNldEVhclByb2plY3RJdGVtcygpOwotICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGxpc3RlbmVyc09uKCkKLSAgewotCXByb2plY3RUeXBlXy5hZGRNb2RpZnlMaXN0ZW5lcihwcm9qZWN0VHlwZUxpc3RlbmVyXyk7Ci0JbW9kdWxlUHJvamVjdF8uYWRkTW9kaWZ5TGlzdGVuZXIoIG1vZHVsZVByb2plY3RMaXN0ZW5lcl8gKTsKLQllYXJQcm9qZWN0Xy5hZGRNb2RpZnlMaXN0ZW5lciggZWFyUHJvamVjdExpc3RlbmVyXyApOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgbGlzdGVuZXJzT2ZmKCkKLSAgewotICAgIHByb2plY3RUeXBlXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihwcm9qZWN0VHlwZUxpc3RlbmVyXyk7Ci0gICAgbW9kdWxlUHJvamVjdF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoIG1vZHVsZVByb2plY3RMaXN0ZW5lcl8gKTsKLSAgICBlYXJQcm9qZWN0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lciggZWFyUHJvamVjdExpc3RlbmVyXyApOyAgCi0gIH0KLSAgICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpCi0gIHsKLQlyZXR1cm4gbW9kdWxlUHJvamVjdF8uZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZSggU3RyaW5nIG5hbWUgKQotICB7Ci0JbGlzdGVuZXJzT2ZmKCk7Ci0gICAgbW9kdWxlUHJvamVjdF8uc2V0VGV4dCggbmFtZSApOwotICAgIGhhbmRsZVByb2plY3RDaGFuZ2VkKCk7Ci0gICAgdXBkYXRlRUFSU3RhdGUoKTsKLQlsaXN0ZW5lcnNPbigpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVhclByb2plY3ROYW1lKCkKLSAgewotICAgIHJldHVybiBlYXJQcm9qZWN0Xy5nZXRUZXh0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKCBTdHJpbmcgbmFtZSApCi0gIHsgCi0JbGlzdGVuZXJzT2ZmKCk7Ci0JZWFyUHJvamVjdF8uc2V0VGV4dCggbmFtZSApOwotCWxpc3RlbmVyc09uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoIFN0cmluZyB0eXBlICkKLSAgewotICAgIGxpc3RlbmVyc09mZigpOwotICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5sZW5ndGgoKT4wKQotICAgIHsKLSAgICAgIFN0cmluZyBsYWJlbCA9IEZhY2V0VXRpbHMuZ2V0VGVtcGxhdGVMYWJlbEJ5SWQodHlwZSk7Ci0JICBwcm9qZWN0VHlwZV8uc2V0VGV4dChsYWJlbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHByb2plY3RUeXBlXy5zZXRUZXh0KCIiKTsKLSAgICAKLSAgICBoYW5kbGVQcm9qZWN0VHlwZUNoYW5nZWQoKTsKLSAgICBsaXN0ZW5lcnNPbigpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKQotICB7Ci0gICAgaW50IGlkeCA9IHByb2plY3RUeXBlXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIGlmICh0ZW1wbGF0ZXNfICE9IG51bGwgJiYgaWR4ID4gLTEpCi0gICAgewotICAgICAgcmV0dXJuIHRlbXBsYXRlc19baWR4XTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyB0ZW1wbGF0ZUxhYmVsID0gcHJvamVjdFR5cGVfLmdldFRleHQoKTsKLSAgICAgIFN0cmluZyB0ZW1wbGF0ZUlkID0gRmFjZXRVdGlscy5nZXRUZW1wbGF0ZUlkQnlMYWJlbCh0ZW1wbGF0ZUxhYmVsKTsKLSAgICAgIHJldHVybiB0ZW1wbGF0ZUlkOwotICAgIH0KLQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXROZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBuZWVkRUFSXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIGIpCi0gIHsKLSAgICBsaXN0ZW5lcnNPZmYoKTsKLSAgICBuZWVkRUFSXyA9IGI7Ci0gICAgaWYgKG5lZWRFQVJfKQotICAgIHsKLSAgICAgZWFyUHJvamVjdF8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgcG9wdWxhdGVFQVJDb21ib3MoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVhclByb2plY3RfLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgZWFyUHJvamVjdF8uc2V0VGV4dCgiIik7Ci0gICAgfQotICAgIGxpc3RlbmVyc09uKCk7Ci0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHJzKQotICB7Ci0gICAgdHJzSWRzXyA9IHRyczsKLSAgICBpZiAoZWFyUHJvamVjdF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgCWxpc3RlbmVyc09mZigpOwotICAgICAgICB1cGRhdGVFQVJTdGF0ZSgpOwotICAgICAgICBsaXN0ZW5lcnNPbigpOwkKLSAgICB9CQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoUHJvamVjdEl0ZW1zKCkKLSAgewotICAgIGxpc3RlbmVyc09mZigpOwotICAgIFN0cmluZyBzZWxlY3RlZE1vZHVsZVByb2plY3QgPSBtb2R1bGVQcm9qZWN0Xy5nZXRUZXh0KCk7ICAgIAotICAgIFN0cmluZyBydW50aW1lSWQgPSB0cnNJZHNfLmdldFJ1bnRpbWVJZCgpOwotICAgIFN0cmluZyB0eXBlSWQgPSB0cnNJZHNfLmdldFR5cGVJZCgpOwotICAgIAotICAgIC8vR2V0IGFsbCB0aGUgcHJvamVjdHMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIGFuZCBydW50aW1lCi0gICAgU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbnVsbDsKLSAgICBpZiAoaXNDbGllbnRfKQotICAgIHsKLSAgICAgIHByb2plY3ROYW1lcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFByb2plY3RzRm9yQ2xpZW50VHlwZUFuZFJ1bnRpbWUodHlwZUlkLCBydW50aW1lSWQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJvamVjdE5hbWVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UHJvamVjdHNGb3JTZXJ2aWNlVHlwZUFuZFJ1bnRpbWUodHlwZUlkLCBydW50aW1lSWQpOwotICAgIH0KLSAgICAKLSAgICBtb2R1bGVQcm9qZWN0Xy5zZXRJdGVtcyhwcm9qZWN0TmFtZXMpOwotICAgIG1vZHVsZVByb2plY3RfLnNldFRleHQoc2VsZWN0ZWRNb2R1bGVQcm9qZWN0KTsKLSAgICBoYW5kbGVQcm9qZWN0Q2hhbmdlZCgpOwotICAgIHVwZGF0ZUVBUlN0YXRlKCk7Ci0gICAgbGlzdGVuZXJzT24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdEl0ZW1zKCkKLSAgewotICAgIElWaXJ0dWFsQ29tcG9uZW50W10gZWFycyA9IEoyRUVVdGlscy5nZXRBbGxFQVJDb21wb25lbnRzKCk7Ci0gICAgU3RyaW5nW10gZWFyUHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1tlYXJzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpPGVhclByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBlYXJQcm9qZWN0TmFtZXNbaV09ZWFyc1tpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICBlYXJQcm9qZWN0Xy5zZXRJdGVtcyhlYXJQcm9qZWN0TmFtZXMpOwotICAgIAotICAgIGlmIChlYXJQcm9qZWN0TmFtZXMubGVuZ3RoID4gMCkKLSAgICAgIGVhclByb2plY3RfLnNlbGVjdCgwKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RUeXBlQ2hhbmdlZCgpCi0gIHsKLSAgICB1cGRhdGVFQVJTdGF0ZSgpOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RDaGFuZ2VkKCkKLSAgeyAKLSAgICB1cGRhdGVUZW1wbGF0ZXMoKTsgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVUZW1wbGF0ZXMoKQotICB7Ci0gICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kdWxlUHJvamVjdF8uZ2V0VGV4dCgpOwotICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICBpZiAocHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgcHJvamVjdFR5cGVfLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBwcm9qZWN0VHlwZV8uZGVzZWxlY3RBbGwoKTsgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwb3B1bGF0ZVByb2plY3RUeXBlQ29tYm8oKTsKLSAgICAgICAgcHJvamVjdFR5cGVfLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVQcm9qZWN0VHlwZUNvbWJvKCkKLSAgewotICAgIC8vR2V0IHRoZSBvbGQgdmFsdWUgaWYgdGhlcmUgd2FzIG9uZS4KLSAgICBTdHJpbmcgb2xkVGVtcGxhdGVJZCA9IGdldENvbXBvbmVudFR5cGUoKTsKLSAgICAKLSAgICBTdHJpbmdbXSB0ZW1wbGF0ZXMgPSBudWxsOwotICAgIGlmICh0cnNJZHNfICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlzQ2xpZW50XykKLSAgICAgIHsKLSAgICAgICAgdGVtcGxhdGVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UHJvamVjdFRlbXBsYXRlcyh0cnNJZHNfLmdldFR5cGVJZCgpLCB0cnNJZHNfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGVtcGxhdGVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmljZVByb2plY3RUZW1wbGF0ZXModHJzSWRzXy5nZXRUeXBlSWQoKSwgdHJzSWRzXy5nZXRSdW50aW1lSWQoKSk7ICAgICAgCi0gICAgICB9Ci0gICAgCi0gICAgICBTdHJpbmdbXSB0ZW1wbGF0ZUxhYmVscyA9IEZhY2V0VXRpbHMuZ2V0VGVtcGxhdGVMYWJlbHModGVtcGxhdGVzKTsKLSAgICAgIHByb2plY3RUeXBlXy5zZXRJdGVtcyh0ZW1wbGF0ZUxhYmVscyk7Ci0gICAgICB0ZW1wbGF0ZXNfID0gdGVtcGxhdGVzOwotICAgICAgCi0gICAgICBpZiAodGVtcGxhdGVzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAKLSAgICAgICAgLy9TZWxlY3QgdGhlIHByZXZpb3VzIHRlbXBsYXRlIHNlbGVjdGlvbiBpZiB0aGF0IG9uZSBpcyBpbiB0aGUgbGlzdC4KLSAgICAgICAgaW50IGlkeCA9IGdldEluZGV4T2ZUZW1wbGF0ZUlkKHRlbXBsYXRlcywgb2xkVGVtcGxhdGVJZCk7Ci0gICAgICAgIGlmIChpZHggPiAtMSkgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgcHJvamVjdFR5cGVfLnNlbGVjdChpZHgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFNlbGVjdCB0aGUgcHJlZmVycmVkIGNsaWVudCBwcm9qZWN0IHR5cGUuCi0gICAgICAgICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBwdGMgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICAgICAgICBTdHJpbmdbXSBwcmVmZXJyZWRUZW1wbGF0ZUlkcyA9IG51bGw7Ci0gICAgICAgICAgaWYgKGlzQ2xpZW50XykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmZXJyZWRUZW1wbGF0ZUlkcyA9IHB0Yy5nZXRDbGllbnRUeXBlcygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJlZmVycmVkVGVtcGxhdGVJZHMgPSBwdGMuZ2V0U2VydmljZVR5cGVzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICBvdXRlcjogZm9yIChpbnQgaiA9IDA7IGogPCBwcmVmZXJyZWRUZW1wbGF0ZUlkcy5sZW5ndGg7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHRlbXBsYXRlSWQgPSB0ZW1wbGF0ZXNbaV07Ci0gICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkLmVxdWFscyhwcmVmZXJyZWRUZW1wbGF0ZUlkc1tqXSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0VHlwZV8uc2VsZWN0KGkpOwotICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICghc2VsZWN0ZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdFR5cGVfLnNlbGVjdCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0KLSAgcHJpdmF0ZSBpbnQgZ2V0SW5kZXhPZlRlbXBsYXRlSWQoU3RyaW5nW10gdGVtcGxhdGVJZHMsIFN0cmluZyB0ZW1wbGF0ZUlkKQotICB7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHRlbXBsYXRlSWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0ZW1wbGF0ZUlkc1tpXS5lcXVhbHModGVtcGxhdGVJZCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gLTE7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlRUFSU3RhdGUoKQotICB7Ci0gICAgICBpZighcHJvamVjdE5lZWRzRUFSKG1vZHVsZVByb2plY3RfLmdldFRleHQoKSkpCi0gICAgICB7Ci0JICAgIGVhclByb2plY3RfLnNldEVuYWJsZWQoZmFsc2UpOyAgIAotICAgICAgICBlYXJQcm9qZWN0Xy5zZXRUZXh0KCIiKTsKLSAgICAgICAgbmVlZEVBUl8gPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbmVlZEVBUl8gPSB0cnVlOwotICAgICAgICBlYXJQcm9qZWN0Xy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBwb3B1bGF0ZUVBUkNvbWJvcygpOwotICAgICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRUFSQ29tYm9zKCkKLSAgewotICAgIGVhclByb2plY3RfLnJlbW92ZUFsbCgpOyAgICAKLSAgICBzZXRFYXJQcm9qZWN0SXRlbXMoKTsgCi0gICAgCi0gICAgU3RyaW5nIGVhck5hbWUgPSBEZWZhdWx0aW5nVXRpbHMuZ2V0RGVmYXVsdEVBUlByb2plY3ROYW1lKG1vZHVsZVByb2plY3RfLmdldFRleHQoKSk7Ci0gICAgZWFyUHJvamVjdF8uc2V0VGV4dChlYXJOYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBwcm9qZWN0TmVlZHNFQVIoU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gICAgLy9JZiB0aGUgcHJvamVjdCBpcyBhIHNpbXBsZSBKYXZhIHByb2plY3Qgb3IgdGhlIHByb2plY3QgdHlwZSBpcyAKLSAgICAvL0phdmEgdXRpbGl0eSByZXR1cm4gZmFsc2UuCi0gICAgaWYgKHByb2plY3ROYW1lICE9IG51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgIGlmIChwcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBpZiAoRmFjZXRVdGlscy5pc0phdmFQcm9qZWN0KHByb2plY3QpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy9Qcm9qZWN0IGRpZG4ndCBydWxlIG91dCB0aGUgbmVlZCBmb3IgYW4gRUFSCi0gICAgLy9zbyBjaGVjayB0aGUgcHJvZWN0IHR5cGUKLSAgICBTdHJpbmcgdGVtcGxhdGVJZCA9IGdldENvbXBvbmVudFR5cGUoKTsKLSAgICBpZiAodGVtcGxhdGVJZCAhPSBudWxsICYmIHRlbXBsYXRlSWQubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBpZiAoRmFjZXRVdGlscy5pc1V0aWxpdHlUZW1wbGF0ZSh0ZW1wbGF0ZUlkKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAgICAgCi0JLy9Qcm9qZWN0IG9yIHByb2plY3QgdHlwZSBkaWRuJ3QgcnVsZSBvdXQgdGhlIG5lZWQgZm9yIGFuIEVBUgotICAgIC8vc28gY2hlY2sgdGhlIHNlcnZlciB0eXBlLgotICAgIGlmICh0cnNJZHNfICE9IG51bGwgJiYgdHJzSWRzXy5nZXRTZXJ2ZXJJZCgpICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZCh0cnNJZHNfLmdldFNlcnZlcklkKCkpOwotICAJICBpZiAodGFyZ2V0SWQhPW51bGwgJiYgdGFyZ2V0SWQubGVuZ3RoKCk+MCkKLSAgCSAgewotICAJICAgIGlmICghU2VydmVyVXRpbHMuaXNUYXJnZXRWYWxpZEZvckVBUih0YXJnZXRJZCwiMTMiKSkgLy9ybSBqMmVlCi0gIAkgICAgewotICAJICAgICAgcmV0dXJuIGZhbHNlOwotICAJICAgIH0KLSAgCSAgfQotICAgIH0KLSAgCSAKLSAgCXJldHVybiB0cnVlOyAgICAKLSAgfQotICAKLSAgCi0gIHByaXZhdGUgSVN0YXR1cyBoYW5kbGVTZXRNZXNzYWdlVGV4dCgpIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGUgcmVzdWx0ID0gKGJ5dGUpIDA7Ci0gICAgICBpZiAobW9kdWxlUHJvamVjdF8uZ2V0VGV4dCgpLmxlbmd0aCgpICE9IDAgJiYgZWFyUHJvamVjdF8uZ2V0VGV4dCgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3RUZXh0ID0gbW9kdWxlUHJvamVjdF8uZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgZWFyVGV4dCA9IGVhclByb2plY3RfLmdldFRleHQoKTsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdFRleHQpOwotICAgICAgICBJUHJvamVjdCBlYXIgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGVhclRleHQpOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoYnl0ZSkgKHJlc3VsdCB8IENSRUFURV9QUk9KRUNUKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFlYXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChieXRlKSAocmVzdWx0IHwgQ1JFQVRFX0VBUik7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgSjJFRVV0aWxzLmV4aXN0cyhwcm9qZWN0KSAmJiBlYXIuZXhpc3RzKCkgJiYgSjJFRVV0aWxzLmV4aXN0cyhlYXIpKSB7Ci0gICAgICAgICAgICBpZiAoIUoyRUVVdGlscy5pc0NvbXBvbmVudEFzc29jaWF0ZWQoZWFyLCBwcm9qZWN0KSkgcmVzdWx0ID0gKGJ5dGUpIChyZXN1bHQgfCBBRERfRUFSX0FTU09DSUFUSU9OKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc0NsaWVudF8pIHsKLSAgICAgICAgbWVzc2FnZVRleHRfLnNldFRleHQoZ2V0VmFsaWRhdGlvbk1lc3NhZ2UocmVzdWx0LCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0NMSUVOVF9TVUIpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBtZXNzYWdlVGV4dF8uc2V0VGV4dChnZXRWYWxpZGF0aW9uTWVzc2FnZShyZXN1bHQsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfU0VSVklDRV9TVUIpKTsKLSAgICAgIH0KLSAgICAgIHBhcmVudF8ubGF5b3V0KCk7ICAvL2ZvcmNlIG1lc3NhZ2UgYXJlYSByZXNpemUvd3JhcAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfTVNHX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1IsIGUgKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoYnl0ZSByZXN1bHQsIFN0cmluZyBzZXJ2aWNlT3JDbGllbnQpIHsKLSAgICBTdHJpbmcgbXNnID0gbnVsbDsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAiIjsKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSA1OgotICAgICAgbXNnID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19QUk9KRUNUX1dJTExfQkVfQ1JFQVRFRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICBjYXNlIDY6Ci0gICAgICBtc2cgPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0VBUl9XSUxMX0JFX0NSRUFURUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA3OgotICAgICAgbXNnID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19QUk9KRUNUX0FORF9FQVJfQ1JFQVRFRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG1zZyA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRUFSX1dJTExfQkVfQVNTT0NJQVRFRDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbXNnICE9IG51bGwgPyBOTFMuYmluZChtc2csIG5ldyBPYmplY3RbXSB7IHNlcnZpY2VPckNsaWVudH0pIDogIiI7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSAKLSAgewotICAgIElTdGF0dXMgZmluYWxTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIGhhbmRsZVNldE1lc3NhZ2VUZXh0KCk7Ci0gICAgU3RyaW5nIHByb2plY3RUZXh0ID0gbW9kdWxlUHJvamVjdF8uZ2V0VGV4dCgpOwotICAgIFN0cmluZyBlYXJUZXh0ID0gZWFyUHJvamVjdF8uZ2V0VGV4dCgpOwotICAgIAotICAgIGlmIChwcm9qZWN0VGV4dD09bnVsbCB8fCBwcm9qZWN0VGV4dC5sZW5ndGgoKT09MCkKLSAgICB7Ci0gICAgICBpZiAoaXNDbGllbnRfKQotICAgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfQ0xJRU5UX1BST0pFQ1RfRU1QVFksIG5ldyBTdHJpbmdbXXsiIn0gKSApOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfU0VSVklDRV9QUk9KRUNUX0VNUFRZLCBuZXcgU3RyaW5nW117IiJ9ICkgKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG5lZWRFQVJfICYmIChlYXJUZXh0PT1udWxsIHx8IGVhclRleHQubGVuZ3RoKCk9PTApKQotICAgIHsKLSAgICAgIGlmIChpc0NsaWVudF8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19DTElFTlRfRUFSX0VNUFRZLCBuZXcgU3RyaW5nW117IiJ9ICkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1NFUlZJQ0VfRUFSX0VNUFRZLCBuZXcgU3RyaW5nW117IiJ9ICkgKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9JZiB0aGUgcHJvamVjdCBhbmQgRUFSIGJvdGggZXhpc3QgYW5kIHRoZSBwcm9qZWN0IGlzIG5vdCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgRUFSLCBlbnN1cmUKLSAgICAvL3RoZXkgY2FuIGJlIGFzc29jaWF0ZWQuCi0gICAgaWYgKG5lZWRFQVJfKQotICAgIHsKLSAgICAgIElQcm9qZWN0IHAgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdFRleHQudHJpbSgpKTsKLSAgICAgIElQcm9qZWN0IGVwID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVhclRleHQudHJpbSgpKTsKLSAgICAgIGlmIChwLmV4aXN0cygpICYmIGVwLmV4aXN0cygpKQotICAgICAgewotICAgICAgICBpZiAoIUoyRUVVdGlscy5pc0NvbXBvbmVudEFzc29jaWF0ZWQoZXAscCkpCi0gICAgICAgIHsKLSAgICAgICAgICBJU3RhdHVzIGFzc29jaWF0ZVN0YXR1cyA9IEoyRUVVdGlscy5jYW5Bc3NvY2lhdGVQcm9qZWN0VG9FQVIocCwgZXApOwotICAgICAgICAgIGlmIChhc3NvY2lhdGVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0NsaWVudF8pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19DTElFTlRfQ0FOTk9UX0FTU09DSUFURSwgbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpLCBlcC5nZXROYW1lKCksIGFzc29jaWF0ZVN0YXR1cy5nZXRNZXNzYWdlKCl9ICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX1NFUlZJQ0VfQ0FOTk9UX0FTU09DSUFURSwgbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpLCBlcC5nZXROYW1lKCksIGFzc29jaWF0ZVN0YXR1cy5nZXRNZXNzYWdlKCl9ICkgKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZpbmFsU3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MTk4MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyNCAgIDE0MjYzNSBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKiAyMDA2MDYwOCAgIDE0NTUyOSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlVGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LlRlc3RJbmZvOwotCi0KLS8qCi0qIFRoZSBKU1BHZW5lcmF0aW9uIHRhc2sgcnVucyB0aGUganNwIGdlbmVyYXRpb24gZW5naW5lIGZvdW5kIGluIHRoZSAKLSogSkJXaXphcmQgUGx1Z2luCi0qCi0qCi0qLwotcHVibGljIGNsYXNzIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgdGVzdFJlZ2lzdHJ5OwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3QgdGVzdEZhY2lsaXRpZXM7Ci0gIHByaXZhdGUgU3RyaW5nIGpzcEZvbGRlcjsKLSAgcHJpdmF0ZSBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kczsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBib29sZWFuIHJ1blRlc3RDbGllbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVA7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFA7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudEM7Ci0gIHByaXZhdGUgYm9vbGVhbiBjbGllbnROZWVkRUFSOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRFYXJQcm9qZWN0TmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50RWFyQ29tcG9uZW50TmFtZTsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBzZXJ2ZXJJZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUDsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFNlcnZpY2VVUkw7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RXaWRnZXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0KLSAgcHVibGljIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQgKCkKLSAgewotICAgIHRlc3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7ICAgIAotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAJU3RyaW5nIGNsaWVudFRlc3RJRCA9IHRlc3RGYWNpbGl0aWVzLmdldFNlbGVjdGlvbigpOwotICAJCi0JLy9HZXQgdGhlIHdlYnNlcnZpY2UgZXh0ZW5zaW9uCi0JCi0JV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NjdGUgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pdGVzdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKGNsaWVudFRlc3RJRCk7Ci0gICAgSVdlYlNlcnZpY2VUZXN0ZXIgaXdzdCA9IChJV2ViU2VydmljZVRlc3Rlcil3c2N0ZS5nZXRXZWJTZXJ2aWNlRXhlY3V0YWJsZUV4dGVuc2lvbigpOwotCVRlc3RJbmZvIHRlc3RJbmZvID0gZ2V0VGVzdEluZm8oKTsKLQkKLQlzdGF0dXMgPSBjb21tYW5kRmFjdG9yeUV4ZWN1dGlvbihpd3N0LmdlbmVyYXRlKHRlc3RJbmZvKSxlbnYsIG1vbml0b3IgKTsKLQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpewotCSAgcmV0dXJuIHN0YXR1czsJCi0JfQotCQotCXRlc3RJbmZvLnNldFJ1blRlc3RDbGllbnQocnVuVGVzdENsaWVudCk7Ci0JCi0Jc3RhdHVzID0gY29tbWFuZEZhY3RvcnlFeGVjdXRpb24oaXdzdC5sYXVuY2godGVzdEluZm8pLGVudiwgbW9uaXRvciApOwotCWlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUil7Ci0JCXJldHVybiBzdGF0dXM7CQotCX0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwcml2YXRlIElTdGF0dXMgY29tbWFuZEZhY3RvcnlFeGVjdXRpb24oSUNvbW1hbmRGYWN0b3J5IGNvbW1hbmRGYWN0b3J5LElFbnZpcm9ubWVudCBlbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7ICAJCi0JCi0Jd2hpbGUoY29tbWFuZEZhY3RvcnkuaGFzTmV4dCgpKQotICB7Ci0gICAgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uID0gY29tbWFuZEZhY3RvcnkuZ2V0TmV4dENvbW1hbmQoKTsKLSAgICBvcGVyYXRpb24uc2V0RW52aXJvbm1lbnQoIGVudiApOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHN0YXR1cyA9IG9wZXJhdGlvbi5leGVjdXRlKCBtb25pdG9yLCBudWxsICk7Ci0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggZXhjICk7ICAKLSAgICB9Ci0gICAgCi0JICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpewotCSAgICBJU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0JCXNIYW5kbGVyLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIAotICAvL0hlbHBlciBtZXRob2Qgd2hpY2ggc2V0cyB1cCB0aGUgVGVzdEluZm8gZGF0YSBzdHJ1Y3R1cmUKLSAgcHJpdmF0ZSBUZXN0SW5mbyBnZXRUZXN0SW5mbygpCi0gIHsKLQlJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IG51bGw7Ci0JU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQgPSBudWxsOwotCQkKLQkvL3NlcnZpY2Ugc2VydmVyIGluZm8KLQlpZihzZXJ2ZXJJZHMgIT0gbnVsbCl7Ci0JICBpZiAoc2VydmVySWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsKSAKLQkgICAgc2VydmljZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCX0JCi0JaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgICAgc2VydmljZVNlcnZlclR5cGVJRCA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAKLQkKLQlpZihjbGllbnRQcm9qZWN0ICE9IG51bGwpewotICAJICBpbnQgaW5kZXggPSBjbGllbnRQcm9qZWN0LmluZGV4T2YoIi8iKTsKLSAgICAgIGlmIChpbmRleCE9LTEpewotICAgICAgICBjbGllbnRQID0gY2xpZW50UHJvamVjdC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgIGNsaWVudEMgPSBjbGllbnRQcm9qZWN0LnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgfQotICAJfQotCi0gIAotCWlmKHNhbXBsZVByb2plY3QgIT0gbnVsbCl7Ci0JICBpbnQgaW5kZXggPSBzYW1wbGVQcm9qZWN0LmluZGV4T2YoIi8iKTsKLSAgICAgIGlmIChpbmRleCE9LTEpewotICAgICAgICBzYW1wbGVQID0gc2FtcGxlUHJvamVjdC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICB9Ci0JfQotCQotCVRlc3RJbmZvIHRlc3RJbmZvID0gbmV3IFRlc3RJbmZvKCk7ICAKLQl0ZXN0SW5mby5zZXRDbGllbnRFeGlzdGluZ1NlcnZlcihzYW1wbGVFeGlzdGluZ1NlcnZlcik7Ci0JdGVzdEluZm8uc2V0Q2xpZW50U2VydmVyVHlwZUlEKHNhbXBsZVNlcnZlclR5cGVJRCk7Ci0JdGVzdEluZm8uc2V0SnNwRm9sZGVyKGpzcEZvbGRlcik7Ci0JdGVzdEluZm8uc2V0RXh0ZXJuYWxCcm93c2VyKGZhbHNlKTsKLQl0ZXN0SW5mby5zZXRFbmRwb2ludChlbmRwb2ludHMpOwotCXRlc3RJbmZvLnNldEdlbmVyYXRpb25Qcm9qZWN0KHNhbXBsZVApOwotCXRlc3RJbmZvLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotCXRlc3RJbmZvLnNldFNldEVuZHBvaW50TWV0aG9kKHNldEVuZHBvaW50TWV0aG9kKTsKLQl0ZXN0SW5mby5zZXRDbGllbnRQcm9qZWN0KGNsaWVudFApOwotCXRlc3RJbmZvLnNldENsaWVudE1vZHVsZShjbGllbnRDKTsKLQl0ZXN0SW5mby5zZXRDbGllbnROZWVkRUFSKGNsaWVudE5lZWRFQVIpOwotCXRlc3RJbmZvLnNldENsaWVudEVBUlByb2plY3QoY2xpZW50RWFyUHJvamVjdE5hbWUpOwotCXRlc3RJbmZvLnNldENsaWVudEVBUk1vZHVsZShjbGllbnRFYXJDb21wb25lbnROYW1lKTsKLQl0ZXN0SW5mby5zZXRNZXRob2RzKG1ldGhvZHMpOwotCQotCS8vaWYgdGhpcyBpcyBhIGNsaWVudCBzY2VuYXJpbyB0aGUgc2VydmljZSBzdHVmZiBpcyBlbXB0eQotCWlmKHNlcnZpY2VTZXJ2ZXJUeXBlSUQgPT0gbnVsbCl7Ci0JICBzZXJ2aWNlU2VydmVyVHlwZUlEID0gc2FtcGxlU2VydmVyVHlwZUlEOwotCSAgc2VydmljZUV4aXN0aW5nU2VydmVyID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0JfQotCQotCQotCXRlc3RJbmZvLnNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoc2VydmljZVNlcnZlclR5cGVJRCk7Ci0JdGVzdEluZm8uc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHNlcnZpY2VFeGlzdGluZ1NlcnZlcik7Ci0JLy93c2RsIHN0dWZmCi0JdGVzdEluZm8uc2V0U2VydmljZVByb2plY3QoZ2V0V1NETFByb2plY3QoKSk7Ci0JdGVzdEluZm8uc2V0V3NkbFNlcnZpY2VVUkwod3NkbFNlcnZpY2VVUkwpOwotCXJldHVybiB0ZXN0SW5mbzsKLSAgfQotICAgCi0KLSAgCi0gIC8vVGhlIHRlc3QgZmFjaWxpdGllcyByZXRyaWV2ZWQgZnJvbSB0aGUgZXh0ZW5zaW9uCi0gIC8vcGx1cyB0aGUgZGVmYXVsdAotICBwdWJsaWMgdm9pZCBzZXRUZXN0RmFjaWxpdHkoU2VsZWN0aW9uTGlzdCBzZWxlY3Rpb24pCi0gIHsKLSAgICB0ZXN0RmFjaWxpdGllcyA9IHNlbGVjdGlvbjsKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZvbGRlcihTdHJpbmcgZm9sZGVyKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKQotICB7Ci0gIAl0aGlzLmpzcEZvbGRlciA9IGpzcEZvbGRlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcykKLSAgewotICAgIHRoaXMubWV0aG9kcyA9IG1ldGhvZHM7ICAKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRSdW5UZXN0Q2xpZW50KGJvb2xlYW4gcnVuVGVzdENsaWVudCkKLSAgewotICAgIHRoaXMucnVuVGVzdENsaWVudCA9IHJ1blRlc3RDbGllbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChTdHJpbmcgc2FtcGxlUHJvamVjdCkKLSAgewotICAJdGhpcy5zYW1wbGVQcm9qZWN0ID0gc2FtcGxlUHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2NlbmFyaW9Db250ZXh0KFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VGVzdFJlZ2lzdHJ5KFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgdGVzdFJlZ2lzdHJ5KQotICB7Ci0gIAl0aGlzLnRlc3RSZWdpc3RyeSA9IHRlc3RSZWdpc3RyeTsKLSAgfQotICAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVNlcnZlclR5cGVJRChTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEKQotICB7Ci0gIAl0aGlzLnNhbXBsZVNlcnZlclR5cGVJRCA9IHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcikKLSAgewotICAJdGhpcy5zYW1wbGVFeGlzdGluZ1NlcnZlciA9IHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpCi0gIHsKLSAgICBzZXJ2ZXJJZHMgPSBpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlU2VydmVyVHlwZUlEKCkKLSAgewotICAJcmV0dXJuIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotICAKLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gIAlyZXR1cm4gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRTZXJ2ZXIoU3RyaW5nIGNsaWVudFNlcnZlcikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KFN0cmluZyBzZXJ2aWNlUHJvamVjdCkKLSAgewotICAJdGhpcy5zZXJ2aWNlUHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdTRExQcm9qZWN0KCkKLSAgewotICAJIGlmKHNlcnZpY2VQcm9qZWN0ICE9IG51bGwpewotCSAgICAgaW50IGluZGV4ID0gc2VydmljZVByb2plY3QuaW5kZXhPZigiLyIpOwotICAgICAgIGlmIChpbmRleCE9LTEpIHsKLQkJICAgICBzZXJ2aWNlUCA9IHNlcnZpY2VQcm9qZWN0LnN1YnN0cmluZygwLGluZGV4KTsKLQkgICAgICAgcmV0dXJuIHNlcnZpY2VQOwotICAgICAgIH0KLSAgCX0JCi0JCi0gIAlyZXR1cm4gY2xpZW50UDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFNlcnZpY2VVUkwpCi0gIHsKLSAgICB0aGlzLndzZGxTZXJ2aWNlVVJMID0gd3NkbFNlcnZpY2VVUkw7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNUZXN0V2lkZ2V0KCkKLSAgewotICAJcmV0dXJuIGlzVGVzdFdpZGdldDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEVhclByb2plY3ROYW1lKFN0cmluZyBjbGllbnRFYXJQcm9qZWN0TmFtZSkKLSAgewotICAgICB0aGlzLmNsaWVudEVhclByb2plY3ROYW1lID0gY2xpZW50RWFyUHJvamVjdE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEVhckNvbXBvbmVudE5hbWUoU3RyaW5nIGNsaWVudEVhckNvbXBvbmVudE5hbWUpCi0gIHsKLQl0aGlzLmNsaWVudEVhckNvbXBvbmVudE5hbWUgPSBjbGllbnRFYXJDb21wb25lbnROYW1lOwotICB9Ci0gIAotICAKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gc2V0RW5kcG9pbnRNZXRob2QgVGhlIHNldEVuZHBvaW50TWV0aG9kIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldEVuZHBvaW50TWV0aG9kKFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZCkKLSAgewotICAgIHRoaXMuc2V0RW5kcG9pbnRNZXRob2QgPSBzZXRFbmRwb2ludE1ldGhvZDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGVuZHBvaW50IFRoZSBlbmRwb2ludCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnQpCi0gIHsKLSAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbCAmJiBlbmRwb2ludC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICB2LmFkZChlbmRwb2ludCk7Ci0gICAgICBzZXRFbmRwb2ludHModik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludHMoTGlzdCBlbmRwb2ludHMpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50TmVlZEVBUigpIHsKLQkJcmV0dXJuIGNsaWVudE5lZWRFQVI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50TmVlZEVBUihib29sZWFuIGNsaWVudE5lZWRFQVIpIHsKLQkJdGhpcy5jbGllbnROZWVkRUFSID0gY2xpZW50TmVlZEVBUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NsaWVudFRlc3RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZmYjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NsaWVudFRlc3RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNzI3ICAgMTQ0MzU0IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRUZXN0RnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RTZXJ2aWNlOwotICBwcml2YXRlIGJvb2xlYW4gZ2VuUHJveHk7ICAvLyBUaGlzIGFjdHVhbGx5IHJlcHJlc2VudCB3aGV0aGVyIGNsaWVudCB0ZXN0IGlzIHJlcXVlc3RlZAotICBwcml2YXRlIGJvb2xlYW4gbGF1bmNoZWRUZXN0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgQ2xpZW50VGVzdEZyYWdtZW50KCBTdHJpbmcgaWQgKQotICB7Ci0gICAgU2VxdWVuY2VGcmFnbWVudCBjbGllbnRUZXN0Um9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgQ29uZGl0aW9uICAgICAgICBjb25kaXRpb24gICAgICA9IG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0U2VydmljZSAmJiBnZW5Qcm94eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgc2V0Q29uZGl0aW9uKCBjb25kaXRpb24gKTsKLSAgICAKLSAgICBjbGllbnRUZXN0Um9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQoKSwgIiIgKSApOwotICAgIGNsaWVudFRlc3RSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBpZCApICk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCBjbGllbnRUZXN0Um9vdCApOwotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBib29sZWFuIGdlblByb3h5ICkKLSAgewotICAgIHRoaXMuZ2VuUHJveHkgPSBnZW5Qcm94eTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZSggQm9vbGVhbiB0ZXN0U2VydmljZSApCi0gIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2UuYm9vbGVhblZhbHVlKCk7ICAKLSAgfSAKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hlZFRlc3QoKQotICB7Ci0gIAlyZXR1cm4gbGF1bmNoZWRUZXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0V2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTc5ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdFdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyNCAgIDE0MjYzNSBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKiAyMDA2MDgxNSAgIDEwNDg3MCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgZW5hYmxlL2Rpc2FibGUgdGVzdCBwYWdlIGNvbnRyb2xzIGJhc2Ugb24gc2V0dGluZ3MgaW4gdGVzdCBmYWNpbGl0eSBleHRlbnNpb24KLSAqIDIwMDYwODE1ICAgMTUzOTAzIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBCcm93c2UgZG9lcyBub3Qgd29yayBpbiBnZW5lcmF0ZSBjbGllbnQgdGVzdCBwYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5Gb2xkZXJSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmRpYWxvZy5EaWFsb2dVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uQm9vbGVhblNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50VGVzdFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDEgZm9yIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9QQUdFID0gICJQV1NNMDAwMSI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIHRlc3RDaGVja2JveF87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwMiBmb3IgdGhlIFRlc3QgY2hlY2sgYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9DSEVDS0JPWF9URVNUID0gIlBXU00wMDAyIjsKLQotICBwcml2YXRlIENvbWJvIHRlc3RUeXBlQ29tYm9fOwotICAgLypDT05URVhUX0lEIFBXU00wMDAzIGZvciB0aGUgVGVzdCBUeXBlIENvbWJvIGJveCBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fQ09NQk9CT1hfVEVTVCA9ICJQV1NNMDAwMyI7Ci0KLSAgcHJpdmF0ZSBUZXh0ICBqc3BGb2xkZXJUZXh0XzsKLSAgLypDT05URVhUX0lEIFBXU00wMDA4IGZvciB0aGUgSlNQIEZvbGRlciBmaWVsZCBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fVEVYVF9KU1BfRk9MREVSID0gIlBXU00wMDA4IjsKLQotICBwcml2YXRlIEJ1dHRvbiBzYW1wbGVGb2xkZXJCcm93c2VCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDkgZm9yIHRoZSBKU1AgRm9sZGVyIEJyb3dzZSBidXR0b24gb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0JVVFRPTl9KU1BfRk9MREVSX0JST1dTRSA9ICJQV1NNMDAwOSI7Ci0KLSAgcHJpdmF0ZSBDb21ibyBwcm9qZWN0Q29tYm9fOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMTAgZm9yIHRoZSBQcm9qZWN0IGNvbWJvIGJveCBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fQ09NQk9fUFJPSkVDVCA9ICJQV1NNMDAxMCI7Ci0KLSAgcHJpdmF0ZSBUcmVlIG1ldGhvZHNUcmVlXzsKLQotICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBXU00wMDA2IGZvciB0aGUgU2VsZWN0IEFsbCBidXR0b24gb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0JVVFRPTl9TRUxFQ1RfQUxMID0gIlBXU00wMDA2IjsKLQotICBwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDcgZm9yIHRoZSBEZXNlbGVjdCBBbGwgYnV0dG9uIG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9CVVRUT05fREVTRUxFQ1RfQUxMID0gIlBXU00wMDA3IjsKLQotICBwcml2YXRlIFRleHQgc2FtcGxlRm9sZGVyVGV4dF87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAxNCBmb3IgdGhlIEZvbGRlciBmaWVsZCBvZiB0aGUgU2FtcGxlIFBhZ2UqLyAgIAotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fVEVYVF9TQU1QTEVfRk9MREVSID0gIlBXU00wMDE0IjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gcnVuVGVzdENoZWNrYm94XzsgIAotICAvKkNPTlRFWFRfSUQgUFdTTTAwMTUgZm9yIHRoZSBydW4gdGVzdCBjaGVjayBib3ggb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0NIRUNLQk9YX0xBVU5DSCA9ICJQV1NNMDAxNSI7Ci0gIC8vCi0gIHByaXZhdGUgQ29tYm8gZWFyQ29tYm9fOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMTYgZm9yIHRoZSBFQVIgY29tYm8gYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9FQVJfQ09NQk8gPSAiUFdTTTAwMTYiOwotICAKLSAgcHJpdmF0ZSBDb21wb3NpdGUgICAgICAgICAgICBjb21ib0dyb3VwXzsgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCAgICAgICAgdGVzdEZhY2lsaXRpZXNfOwotICBwcml2YXRlIEZvbGRlclJlc291cmNlRmlsdGVyIGZvbGRlckZpbHRlcl8gPSBuZXcgRm9sZGVyUmVzb3VyY2VGaWx0ZXIoKTsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzVGVzdFdpZGdldCA9IGZhbHNlOwotICAKLSAgcHJpdmF0ZSBJUGF0aCB3ZWJDb250ZW50UGF0aF87Ci0gIHByaXZhdGUgSVJlc291cmNlIHdlYkNvbnRlbnRfOwotICAgIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgaXNUZXN0V2lkZ2V0ID0gdHJ1ZTsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgPSBuZXcgVUlVdGlscyggcGx1Z2luSWRfICk7Ci0gICAgICAgIAotCXBhcmVudC5zZXRUb29sVGlwVGV4dCggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdTTV9QQUdFICk7Ci0JUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZF8gKyAiLiIgKyBJTkZPUE9QX1BXU01fUEFHRSApOwotICAgIAotICAgIHRlc3RDaGVja2JveF8gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KCBwYXJlbnQsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5CVVRUT05fVEVTVCwKLSAgICAJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXU01fQ0hFQ0tCT1hfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0NIRUNLQk9YX1RFU1QgKTsKLSAgICB0ZXN0Q2hlY2tib3hfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRlc3RCdXR0b24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBjb21ib0dyb3VwXyA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDMsIDUsIDAgKTsKLSAgICAKLSAgICB0ZXN0VHlwZUNvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oIGNvbWJvR3JvdXBfLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfVEVTVF9UWVBFUywKLSAgICAJCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QV1NNX0NPTUJPQk9YX1RFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQ09NQk9CT1hfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgIHRlc3RUeXBlQ29tYm9fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotICAgIAkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgIAkJCQloYW5kbGVUZXN0RmFjaWxpdHlTZWxlY3Rpb24oKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgKTsgICAgCi0gICAgCi0gICAgbmV3IExhYmVsKCBjb21ib0dyb3VwXywgU1dULk5PTkUgKTsKLSAgICAKLSAgICBwcm9qZWN0Q29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyggY29tYm9Hcm91cF8sIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9KU1BfUFJPSkVDVF9OQU1FLAotICAgIAkJCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXU01fQ09NQk9fUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9DT01CT19QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgcHJvamVjdENvbWJvXy5zZXRFbmFibGVkKCBmYWxzZSApOwotICAgIG5ldyBMYWJlbCggY29tYm9Hcm91cF8sIFNXVC5OT05FICk7Ci0gICAgCi0gICAgCi0gICAgZWFyQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyggY29tYm9Hcm91cF8sIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9FQVJfUFJPSkVDVFMsCi0gICAgCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QV1NNX0VBUl9QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9FQVJfQ09NQk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgZWFyQ29tYm9fLnNldEVuYWJsZWQoIGZhbHNlICk7Ci0gICAgbmV3IExhYmVsKCBjb21ib0dyb3VwXywgU1dULk5PTkUgKTsKLSAgICAKLSAgICAKLSAgICAKLSAgICBzYW1wbGVGb2xkZXJUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggY29tYm9Hcm91cF8sIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9GT0xERVJfTkFNRSwKLSAgICAJCQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdTTV9URVhUX1NBTVBMRV9GT0xERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9URVhUX1NBTVBMRV9GT0xERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0gICAgCi0gICAgc2FtcGxlRm9sZGVyVGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIoIG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dCggTW9kaWZ5RXZlbnQgZXZ0ICkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZUZvbGRlclRleHQoKTsgCi0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIAotICAgICAgIAotICAgIHNhbXBsZUZvbGRlckJyb3dzZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIGNvbWJvR3JvdXBfLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX0JST1dTRSwgCi0gICAgCQkJCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QV1NNX0JVVFRPTl9KU1BfRk9MREVSX0JST1dTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQlVUVE9OX0pTUF9GT0xERVJfQlJPV1NFICk7Ci0gICAgc2FtcGxlRm9sZGVyQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTYW1wbGVCcm93c2UoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAganNwRm9sZGVyVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIGNvbWJvR3JvdXBfLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfSlNQX0ZPTERFUl9OQU1FLAotICAgIAkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdTTV9URVhUX0pTUF9GT0xERVIsCi0gICAgICAgICAgICBJTkZPUE9QX1BXU01fVEVYVF9KU1BfRk9MREVSLAotICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAganNwRm9sZGVyVGV4dF8uc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICAKLSAgICBHcm91cCBtZXRob2RzR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUdyb3VwKCBwYXJlbnQsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9NRVRIT0RTLCAgCi0gICAgCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXU01fVFJFRV9NRVRIT0RTLCBudWxsICk7Ci0gICAgCi0JbWV0aG9kc0dyb3VwLnNldExheW91dERhdGEoIHVpVXRpbHMuY3JlYXRlRmlsbEFsbCgpICk7Ci0JCi0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JbWV0aG9kc0dyb3VwLnNldExheW91dCggbGF5b3V0ICk7Ci0JCi0JLy8gVE9ETyBObyBpbmZvcG9wIGZvciB0aGlzIHRyZWUuCi0JbWV0aG9kc1RyZWVfID0gdWlVdGlscy5jcmVhdGVUcmVlKCBtZXRob2RzR3JvdXAsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXU01fVFJFRV9NRVRIT0RTLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0JICAgICAgICAgICAgICAgICAgIAkJCQkgICBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMCXwgU1dULkNIRUNLICk7Ci0KLSAgICBDb21wb3NpdGUgc2VsZWN0QnV0dG9ucyA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBtZXRob2RzR3JvdXAsIDIgKTsKLSAgICAKLSAgICBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXyAKLSAgICAgID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBzZWxlY3RCdXR0b25zLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX1NFTEVDVF9BTEwsIAotICAgIAkJICBDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QV1NNX0JVVFRPTl9TRUxFQ1RfQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9CVVRUT05fU0VMRUNUX0FMTCApOwotICAgIHNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0QWxsKCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fIAotICAgICAgPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHNlbGVjdEJ1dHRvbnMsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5CVVRUT05fREVTRUxFQ1RfQUxMLCAKLSAgICAJCSAgCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QV1NNX0JVVFRPTl9ERVNFTEVDVF9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0JVVFRPTl9ERVNFTEVDVF9BTEwgKTsKLSAgICBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgcnVuVGVzdENoZWNrYm94XyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goIHBhcmVudCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkJVVFRPTl9SVU5fVEVTVCwKLSAgICAJCQkJCQkJCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdTTV9DSEVDS0JPWF9MQVVOQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9DSEVDS0JPWF9MQVVOQ0ggKTsKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUZvbGRlclRleHQoKQotICB7Ci0JLy8gd2ViQ29udGVudFBhdGhfIGlzIHNldCB3aGVuIGpzcEZvbGRlclRleHRfIGlzIHNldCBmb3IgdGhlIGZpcnN0IHRpbWUuICBUaGVyZWZvcmUsCi0JLy8gaWYgd2ViQ29udGVudFBhdGhfIGlzIHN0aWxsIG51bGwsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdG91Y2gganNwRm9sZGVyVGV4dF8geWV0LgotCSAgCi0JaWYgKHdlYkNvbnRlbnRQYXRoXyA9PSBudWxsKQotCQlyZXR1cm47Ci0JICAKLSAgCVN0cmluZyBmb2xkZXIgPSBzYW1wbGVGb2xkZXJUZXh0Xy5nZXRUZXh0KCk7CQotICAgIGpzcEZvbGRlclRleHRfLnNldFRleHQod2ViQ29udGVudFBhdGhfLnRvU3RyaW5nKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBmb2xkZXIpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlU2FtcGxlQnJvd3NlKCkKLSAgewotICAgIElQYXRoICAgICAgc2VsZWN0ZWRQYXRoICAgICAgID0gbnVsbDsKLSAgICBJUmVzb3VyY2UgIGluaXRpYWxSZXNvdXJjZSAgICA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW5pdGlhbFJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24oIGluaXRpYWxTZWxlY3Rpb25fICk7Ci0gICAgfQotICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgeyAgCi0gICAgfQotICAgIAotICAgIGlmKCBpbml0aWFsUmVzb3VyY2UgPT0gbnVsbCApaW5pdGlhbFJlc291cmNlID0gd2ViQ29udGVudF87Ci0gICAgCi0gICAgSVJlc291cmNlIHJlc291cmNlID0gRGlhbG9nVXRpbHMuYnJvd3NlUmVzb3VyY2VzKCBjb21ib0dyb3VwXy5nZXRTaGVsbCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYkNvbnRlbnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFJlc291cmNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlckZpbHRlcl8gKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgewotICAgICAgc2VsZWN0ZWRQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsgICAKLSAgICAKLSAgICAgIGludCB3ZWJNb2R1bGVTZWdtZW50cyA9IHNlbGVjdGVkUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod2ViQ29udGVudFBhdGhfKTsKLSAgICAgIAotICAgICAgaWYgKCB3ZWJNb2R1bGVTZWdtZW50cyA8IHdlYkNvbnRlbnRQYXRoXy5zZWdtZW50Q291bnQoKSApCi0gICAgICB7Ci0gICAgICAgIHNhbXBsZUZvbGRlclRleHRfLnNldFRleHQoIiIpOwotICAgICAgICBoYW5kbGVGb2xkZXJUZXh0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNhbXBsZUZvbGRlclRleHRfLnNldFRleHQoc2VsZWN0ZWRQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMod2ViTW9kdWxlU2VnbWVudHMpLnRvU3RyaW5nKCkpOwotICAgICAgICBoYW5kbGVGb2xkZXJUZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlVGVzdEJ1dHRvbigpCi0gIHsKLSAgICBib29sZWFuIGVuYWJsZWQgPSB0ZXN0Q2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICAgIAotICAgIHRlc3RUeXBlQ29tYm9fLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICAKLSAgICBpZiAoZW5hYmxlZCAmJiB0ZXN0RmFjaWxpdGllc18gIT0gbnVsbCkgewotICAgIAloYW5kbGVUZXN0RmFjaWxpdHlTZWxlY3Rpb24oKTsKLSAgICAJcmV0dXJuOwotICAgIH0gICAgCi0KLSAgICBzYW1wbGVGb2xkZXJUZXh0Xy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgbWV0aG9kc1RyZWVfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBydW5UZXN0Q2hlY2tib3hfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgc2FtcGxlRm9sZGVyQnJvd3NlQnV0dG9uXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVUZXN0RmFjaWxpdHlTZWxlY3Rpb24oKSB7Ci0JICAKLQkgIFN0cmluZyBjbGllbnRUZXN0SUQgPSBnZXRUZXN0RmFjaWxpdHkoKS5nZXRTZWxlY3Rpb24oKTsKLQkgIAkKLQkgIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIHRlc3RFeHRlbnNpb24gPSAKLQkJICAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkgIC5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZShjbGllbnRUZXN0SUQpOwotCSAgICAKLSAgICAgIGJvb2xlYW4gaGFzQ29kZUdlbiA9IHRlc3RFeHRlbnNpb24uaXNDb2RlR2VuTmVlZGVkKCk7Ci0gICAgICAKLSAgICAgIC8vIGZvbGRlciBzZWxlY3Rpb24gaXMgb25seSBhcHBsaWNhYmxlIGZvciB0ZXN0IGZhY2lsaXRpZXMgd2l0aCBjb2RlZ2VuCi0gICAgICBzYW1wbGVGb2xkZXJUZXh0Xy5zZXRFbmFibGVkKCBoYXNDb2RlR2VuICk7Ci0gICAgICBzYW1wbGVGb2xkZXJCcm93c2VCdXR0b25fLnNldEVuYWJsZWQoIGhhc0NvZGVHZW4gJiYgd2ViQ29udGVudF8gIT0gbnVsbCApOwotICAgICAgCi0gICAgICBib29sZWFuIGhhc01ldGhvZHMgPSB0ZXN0RXh0ZW5zaW9uLmFyZU1ldGhvZHNOZWVkZWQoKTsKLSAgICAgIAotICAgICAgLy8gbWV0aG9kIHNlbGVjdGlvbiBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHRlc3QgZmFjaWxpdGllcyB3aXRoIG1ldGhvZHMKLSAgICAgIG1ldGhvZHNUcmVlXy5zZXRFbmFibGVkKCBoYXNNZXRob2RzICk7ICAgICAgCi0gICAgICBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXy5zZXRFbmFibGVkKCBoYXNNZXRob2RzICk7Ci0gICAgICBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLnNldEVuYWJsZWQoIGhhc01ldGhvZHMgKTsKLSAgICAgIAotICAgICAgLy8gcnVuIG9uIHNlcnZlciBvbmx5IGFwcGxpY2FibGUgZm9yIHRlc3QgZmFjaWxpdGllcyB0aGF0IG5lZWRzIGxhdW5jaGluZwotICAgICAgcnVuVGVzdENoZWNrYm94Xy5zZXRFbmFibGVkKCB0ZXN0RXh0ZW5zaW9uLmlzU2VydmVyTmVlZGVkKCkgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbCggYm9vbGVhbiB2YWx1ZSApCi0gIHsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbWV0aG9kc1RyZWVfLmdldEl0ZW1zKCk7Ci0JCi0JZm9yKCBpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKyApIAotCXsKLQkgIGl0ZW1zW2ldLnNldENoZWNrZWQodmFsdWUpOwotCX0KLSAgfSAKLSAgCi0gIC8vIEhlcmUgYXJlIHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGZvciB0aGlzIHdpZGdldC4KLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIEJvb2xlYW4gdGVzdFNlcnZpY2UgKQotICB7Ci0gICAgdGVzdENoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIHRlc3RTZXJ2aWNlLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgaGFuZGxlVGVzdEJ1dHRvbigpOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIHRlc3RDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdEZhY2lsaXR5KCBTZWxlY3Rpb25MaXN0IHRlc3RGYWNpbGl0aWVzICkKLSAgewotICAgIHRlc3RGYWNpbGl0aWVzXyA9IHRlc3RGYWNpbGl0aWVzOwotICAgIHRlc3RUeXBlQ29tYm9fLnNldEl0ZW1zKCB0ZXN0RmFjaWxpdGllcy5nZXRMaXN0KCkgKTsKLSAgICB0ZXN0VHlwZUNvbWJvXy5zZWxlY3QoIHRlc3RGYWNpbGl0aWVzLmdldEluZGV4KCkgKTsKLSAgICBoYW5kbGVUZXN0RmFjaWxpdHlTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIFNlbGVjdGlvbkxpc3QgZ2V0VGVzdEZhY2lsaXR5KCkKLSAgewotICAgIHRlc3RGYWNpbGl0aWVzXy5zZXRJbmRleCggdGVzdFR5cGVDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgIHJldHVybiB0ZXN0RmFjaWxpdGllc187Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdElEKCkKLSAgewotICAgIHJldHVybiB0ZXN0VHlwZUNvbWJvXy5nZXRUZXh0KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIHByb2plY3QgbmFtZSB3aGljaCBtYXkgYmUgb2YgdGhlIChvYnNvbGV0ZSkgZm9ybWF0ICJwcm9qZWN0L21vZHVsZSIsCi0gICAqIHJldHVybiBvbmx5IHRoZSBwcm9qZWN0IHBhcnQgb2YgdGhlIG5hbWUKLSAgICogCi0gICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IG5hbWUuCi0gICAqIEByZXR1cm4gSWYgdGhlIG5hbWUgaGFzIHRoZSBmb3JtYXQgInByb2plY3QvbW9kdWxlIiwgcmV0dXJucyBvbmx5ICJwcm9qZWN0IiwgCi0gICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBuYW1lIGFzIGlzLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0KSB7Ci0JICAKLQkgIGludCBpbmRleCA9IHByb2plY3QuaW5kZXhPZigiLyIpOwotCSAgCi0JICBpZiAoaW5kZXggIT0gLTEpCi0JCSAgcHJvamVjdCA9IHByb2plY3Quc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkgIAotCSAgcmV0dXJuIHByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpIAotICB7Ci0JcHJvamVjdENvbWJvXy5zZXRJdGVtcyggbmV3IFN0cmluZ1tdeyBleHRyYWN0UHJvamVjdE5hbWUoY2xpZW50UHJvamVjdCkgfSApOwotCXByb2plY3RDb21ib18uc2VsZWN0KDApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0RUFSKFN0cmluZyBjbGllbnRQcm9qZWN0RUFSKSAKLSAgewotICAgIGVhckNvbWJvXy5zZXRJdGVtcyggbmV3IFN0cmluZ1tdeyBleHRyYWN0UHJvamVjdE5hbWUoY2xpZW50UHJvamVjdEVBUikgfSApOwotICAgIGVhckNvbWJvXy5zZWxlY3QoMCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyKCkKLSAgewotICAgIHJldHVybiBzYW1wbGVGb2xkZXJUZXh0Xy5nZXRUZXh0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZvbGRlciggU3RyaW5nIGZvbGRlciApCi0gIHsKLSAgICBzYW1wbGVGb2xkZXJUZXh0Xy5zZXRUZXh0KCBmb2xkZXIgKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNUZXN0V2lkZ2V0KCkKLSAgewotICAJcmV0dXJuIGlzVGVzdFdpZGdldDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SnNwRm9sZGVyKCBTdHJpbmcgZm9sZGVyICkKLSAgewotCXdlYkNvbnRlbnRQYXRoXyA9IChuZXcgUGF0aChmb2xkZXIpKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0Jd2ViQ29udGVudF8gPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3ZWJDb250ZW50UGF0aF8pOwkKLQlzYW1wbGVGb2xkZXJCcm93c2VCdXR0b25fLnNldEVuYWJsZWQod2ViQ29udGVudF8gIT0gbnVsbCk7Ci0JICAKLSAgICBqc3BGb2xkZXJUZXh0Xy5zZXRUZXh0KCBmb2xkZXIgKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKc3BGb2xkZXIoKQotICB7Ci0gICAgcmV0dXJuIGpzcEZvbGRlclRleHRfLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgKFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRSdW5UZXN0Q2xpZW50KCkKLSAgewotICAgIHJldHVybiBydW5UZXN0Q2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSdW5UZXN0Q2xpZW50KCBib29sZWFuIHZhbHVlICkKLSAgewotICAgIHJ1blRlc3RDaGVja2JveF8uc2V0U2VsZWN0aW9uKCB2YWx1ZSApOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhblNlbGVjdGlvbltdIGdldE1ldGhvZHMoKQotICB7Ci0gICAgVHJlZUl0ZW1bXSAgICAgICAgIGl0ZW1zICAgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLSAgICBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcyA9IG5ldyBCb29sZWFuU2VsZWN0aW9uW2l0ZW1zLmxlbmd0aF07Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgbWV0aG9kc1tpbmRleF0gPSBuZXcgQm9vbGVhblNlbGVjdGlvbiggaXRlbXNbaW5kZXhdLmdldFRleHQoKSwgaXRlbXNbaW5kZXhdLmdldENoZWNrZWQoKSApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbWV0aG9kczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyggQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHMgKQotICB7Ci0gICAgbWV0aG9kc1RyZWVfLnJlbW92ZUFsbCgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBtZXRob2RzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgaWYobWV0aG9kc1tpbmRleF0gPT0gbnVsbCljb250aW51ZTsKLSAgICAgIFRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0oIG1ldGhvZHNUcmVlXywgU1dULk5VTEwgKTsKLSAgICAgIGl0ZW0uc2V0VGV4dCggbWV0aG9kc1tpbmRleF0uZ2V0VmFsdWUoKSApOwotICAgICAgaXRlbS5zZXRDaGVja2VkKCBtZXRob2RzW2luZGV4XS5pc1NlbGVjdGVkKCkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLSAgICBpbml0aWFsU2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4N2QyNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwOTEyICAgMTU3MDM5IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBuZXcgd2Vic2VydmljZXV0aWxzLmphciBub3QgY29waWVkIGluIGNsaWVudCBnZW5lcmF0aW9uCi0gKiAyMDA2MTAyNSAgIDE2MTI1MCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgSW5zdGFsbGF0aW9ucyBvciB3b3Jrc3BhY2UgcGF0aHMgd2l0aCBzcGFjZXMgYnJlYWsgU2FtcGxlIEdlbiBhbmQgSmF2YSBFZGl0b3IgTGF1bmNoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5jb21tb24uQnVuZGxlVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIENvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0JCi0vKioKLSAqIERlZmF1bHQgQ1RPUjsKLSAqLwotCi0KLXB1YmxpYyBDb3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZCgpCi17Ci0KLX0KLQotLyoqCi0gKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gKi8KLXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotewotICBJRW52aXJvbm1lbnQgZW52ID0gZ2V0RW52aXJvbm1lbnQoKTsKLSAgCi0gIHRyeQotICB7Ci0gICAgUHJvZ3Jlc3NVdGlscy5yZXBvcnQoIG1vbml0b3IsIENvbnN1bXB0aW9uTWVzc2FnZXMuUFJPR1JFU1NfSU5GT19DT1BZX1dFQlNFUlZJQ0VfVVRJTFMgKTsKLSAgICBJUHJvamVjdCBzYW1wbGVJUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzYW1wbGVQcm9qZWN0KTsgICAgCi0gICAgSVBhdGggd2ViTW9kdWxlUGF0aCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aChzYW1wbGVJUHJvamVjdCk7CQotICAgIGlmICh3ZWJNb2R1bGVQYXRoID09IG51bGwpCi0gICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1BST0pFQ1RfTk9UX0ZPVU5EICk7Ci0gICAgICAKLSAgICBJU3RhdHVzIHN0YXR1cyA9IGNvcHlJRmlsZSgid2Vic2VydmljZXV0aWxzLmphciIsd2ViTW9kdWxlUGF0aCwiV0VCLUlORi9saWIvd2Vic2VydmljZXV0aWxzLmphciIsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRJbnN0YW5jZSgpLGVudiwgbW9uaXRvcik7Ci0gICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKXsKLSAgICAgIElTdGF0dXNIYW5kbGVyIHNIYW5kbGVyID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAgIElTdGF0dXMgZXJyb3JTdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfRklMRUNPUFlfV0VCU0VSVklDRV9VVElMUyApOwotICAgICAgc0hhbmRsZXIucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwkKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgIH0KLSAgICAgIAotICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgSVN0YXR1c0hhbmRsZXIgc0hhbmRsZXIgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgSVN0YXR1cyBlcnJvclN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTICk7Ci0gICAgICBzSGFuZGxlci5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7CQotICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTLCBlKTsKLSAgICB9Ci0gIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotfQotCi0vKioKLSAqCi0gKi8KLXByaXZhdGUgSVN0YXR1cyBjb3B5SUZpbGUoU3RyaW5nIHNvdXJjZSwgSVBhdGggdGFyZ2V0UGF0aCwgU3RyaW5nIHRhcmdldEZpbGUsIFBsdWdpbiBwbHVnaW4sSUVudmlyb25tZW50IGVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLXsKLSAgICAKLSAgaWYgKHBsdWdpbiAhPSBudWxsKQotICB7Ci0gICAgSVBhdGggdGFyZ2V0ID0gdGFyZ2V0UGF0aC5hcHBlbmQobmV3IFBhdGgodGFyZ2V0RmlsZSkpOwotICAgIAotICAgIFByb2dyZXNzVXRpbHMucmVwb3J0KCBtb25pdG9yLCBDb25zdW1wdGlvbk1lc3NhZ2VzLlBST0dSRVNTX0lORk9fQ09QWUlOR19GSUxFICk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgIFJlc291cmNlQ29udGV4dCBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgICAgIGNvbnRleHQuc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKHRydWUpOwotICAgICAgIGNvbnRleHQuc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgY29udGV4dC5zZXRDaGVja291dEZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBGaWxlUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UodGFyZ2V0KTsKLSAgICAgICBVUkwgc291cmNlVVJMID0gQnVuZGxlVXRpbHMuZ2V0VVJMRnJvbUJ1bmRsZSggV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBzb3VyY2UgKTsgICAgICAgCi0gICAgICAgaWYocmVzb3VyY2UgIT0gbnVsbCkgeyAgICAJICAgICAgCSAgIAotICAgIAkgICBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoc291cmNlVVJMKS5nZXRQYXRoKCkpOyAgIAotICAgIAkgICBpZiAocmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sZW5ndGgoKSA9PSBzb3VyY2VGaWxlLmxlbmd0aCgpKQotICAgIAkJICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgfQotICAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoY29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCXRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVVSTC5vcGVuU3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTICxlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpCi17Ci0gIHRoaXMuc2FtcGxlUHJvamVjdCA9IHNhbXBsZVByb2plY3Q7ICAKLX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4Mjg0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5BZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3RFYXI7Ci0gIHByaXZhdGUgSVNlcnZlciBleGlzdGluZ1NlcnZlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotICBwcml2YXRlIGJvb2xlYW4gbmVlZEVBUjsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb247Ci0gIAotICAKLSAgcHVibGljIENyZWF0ZVNhbXBsZVByb2plY3RDb21tYW5kKCkKLSAgewotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52ID0gZ2V0RW52aXJvbm1lbnQoKTsKLSAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBpZiAoIXJvb3QuZ2V0UHJvamVjdChzYW1wbGVQcm9qZWN0KS5leGlzdHMoKSB8fCAhcm9vdC5nZXRQcm9qZWN0KHNhbXBsZVByb2plY3RFYXIpLmV4aXN0cygpKQotICAgIHsKLSAgICAgIC8vRG8gdGhlIGZvbGxvd2luZwotICAgICAgLy8xLiBDcmVhdGUgdGhlIFdlYiBwcm9qZWN0L2NvbXBvbmVudCB0byBob3VzZSB0aGUgc2FtcGxlIEpTUHMuCi0gICAgICAvLzIuIElmIG5lZWRFQVIgaXMgdHJ1ZSB0aGVuCi0gICAgICAvLyAgIC0gY3JlYXRlIGEgRUFSIHByb2plY3QgYW5kIGNvbXBvbmVudCBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gICAgICAvLyAgIC0gYWRkIHRoZSBXZWIgY29tcG9uZW50IHRvIHRoZSBFQVIgY29tcG9uZW50Ci0gICAgICAvLzMuIEFkZCB0aGUgcmlnaHQgY29tcG9uZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICBDcmVhdGVNb2R1bGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlTW9kdWxlQ29tbWFuZCgpOwotCSAgY29tbWFuZC5zZXRQcm9qZWN0TmFtZShzYW1wbGVQcm9qZWN0KTsKLQkgIGNvbW1hbmQuc2V0TW9kdWxlTmFtZShzYW1wbGVQcm9qZWN0KTsJCQkKLQkgIGNvbW1hbmQuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLldFQik7Ci0JICBjb21tYW5kLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQpOwotCSAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKGV4aXN0aW5nU2VydmVyLmdldElkKCkpOwotCSAgY29tbWFuZC5zZXRKMmVlTGV2ZWwoajJlZVZlcnNpb24pOwotICAgIGNvbW1hbmQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotCSAgSVN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKSA7Ci0JICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLQkgIHsKLQkJICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgcmV0dXJuIHN0YXR1czsKLQkgIH0KLQkJICAKLQkgIGlmIChuZWVkRUFSKQotCSAgewotCQkJQ3JlYXRlTW9kdWxlQ29tbWFuZCBjb21tYW5kRUFSID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLQkJCWNvbW1hbmRFQVIuc2V0UHJvamVjdE5hbWUoc2FtcGxlUHJvamVjdEVhcik7Ci0JCQkvL1RPRE8gVGhlIEVBUiBjb21wb25lbnQgbmFtZSBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIHByb2plY3QgbmFtZQotCQkJLy9zbyB0aGUgY29tcG9uZW50IG5hbWUgbmVlZHMgdG8gc29tZWhvdyBiZSBwaXBlZCBpbnRvIHRoaXMgY29tbWFuZAotCQkJY29tbWFuZEVBUi5zZXRNb2R1bGVOYW1lKHNhbXBsZVByb2plY3RFYXIpOwotCQkJY29tbWFuZEVBUi5zZXRNb2R1bGVUeXBlKENyZWF0ZU1vZHVsZUNvbW1hbmQuRUFSKTsKLQkJCWNvbW1hbmRFQVIuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0JCQljb21tYW5kRUFSLnNldFNlcnZlckluc3RhbmNlSWQoZXhpc3RpbmdTZXJ2ZXIuZ2V0SWQoKSk7Ci0JCQljb21tYW5kRUFSLnNldEoyZWVMZXZlbChqMmVlVmVyc2lvbik7Ci0gICAgICBjb21tYW5kRUFSLnNldEVudmlyb25tZW50KCBlbnYgKTsKLQkJCXN0YXR1cyA9IGNvbW1hbmRFQVIuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JCQl7Ci0JCQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCSAgcmV0dXJuIHN0YXR1czsKLQkJCX0JCQkKLQkJCQkKLQkJCQkKLQkJCS8vQXNzb2NpYXRlIHRoZSBzZXJ2aWNlIG1vZHVsZSBhbmQgc2VydmljZSBFQVIKLQkJCUFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kIGFzc29jaWF0ZUNvbW1hbmQgPSBuZXcgQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQoKTsKLQkJCWFzc29jaWF0ZUNvbW1hbmQuc2V0UHJvamVjdChzYW1wbGVQcm9qZWN0KTsKLQkJCWFzc29jaWF0ZUNvbW1hbmQuc2V0TW9kdWxlKHNhbXBsZVByb2plY3QpOwotCQkJYXNzb2NpYXRlQ29tbWFuZC5zZXRFQVJQcm9qZWN0KHNhbXBsZVByb2plY3RFYXIpOwotCQkJLy9UT0RPIFRoZSBFQVIgY29tcG9uZW50IG5hbWUgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBwcm9qZWN0IG5hbWUKLQkJCS8vc28gdGhlIGNvbXBvbmVudCBuYW1lIG5lZWRzIHRvIHNvbWVob3cgYmUgcGlwZWQgaW50byB0aGlzIGNvbW1hbmQKLQkJCWFzc29jaWF0ZUNvbW1hbmQuc2V0RWFyKHNhbXBsZVByb2plY3RFYXIpOwotICAgICAgYXNzb2NpYXRlQ29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0JCQlzdGF0dXMgPSBhc3NvY2lhdGVDb21tYW5kLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQkJewotCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQkJCQotCQkJCQotCQkJLy9BZGQgdGhlIEVBUiB0byB0aGUgc2VydmVyCi0JCQlBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQgY29tbWFuZEluc3RhbGwgPSBuZXcgQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kKCk7Ci0JCQljb21tYW5kSW5zdGFsbC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKGV4aXN0aW5nU2VydmVyLmdldElkKCkpOwotCQkJY29tbWFuZEluc3RhbGwuc2V0UHJvamVjdChzYW1wbGVQcm9qZWN0RWFyKTsKLQkJCS8vVE9ETyBUaGUgRUFSIGNvbXBvbmVudCBuYW1lIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgcHJvamVjdCBuYW1lCi0JCQkvL3NvIHRoZSBjb21wb25lbnQgbmFtZSBuZWVkcyB0byBzb21laG93IGJlIHBpcGVkIGludG8gdGhpcyBjb21tYW5kCi0JCQljb21tYW5kSW5zdGFsbC5zZXRNb2R1bGUoc2FtcGxlUHJvamVjdEVhcik7Ci0JCQljb21tYW5kSW5zdGFsbC5zZXRFbnZpcm9ubWVudCggZW52ICk7CQotCQkJc3RhdHVzID0gY29tbWFuZEluc3RhbGwuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApIDsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQkJewotCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQkJCQkJCQkKLQkJfQotCSAgICBlbHNlCi0JCXsKLQkJICAgIC8vQWRkIHRoZSBXZWIgY29tcG9uZW50IHRvIHRoZSBzZXJ2ZXIKLQkJCUFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCBjb21tYW5kSW5zdGFsbCA9IG5ldyBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQoKTsKLQkJCWNvbW1hbmRJbnN0YWxsLnNldFNlcnZlckluc3RhbmNlSWQoZXhpc3RpbmdTZXJ2ZXIuZ2V0SWQoKSk7Ci0JCQljb21tYW5kSW5zdGFsbC5zZXRQcm9qZWN0KHNhbXBsZVByb2plY3QpOwotCQkJY29tbWFuZEluc3RhbGwuc2V0TW9kdWxlKHNhbXBsZVByb2plY3QpOwotICAgICAgY29tbWFuZEluc3RhbGwuc2V0RW52aXJvbm1lbnQoIGVudiApOwotCQkJCi0JCQlzdGF0dXMgPSBjb21tYW5kSW5zdGFsbC5leGVjdXRlKCBtb25pdG9yLCBudWxsICkgOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JCQl7Ci0JCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9CQkJICAKLQkJfQotCQkgIAotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpCi0gIHsKLSAgICB0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OyAJCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0RUFSKFN0cmluZyBzYW1wbGVQcm9qZWN0RWFyKQotICB7Ci0gIAl0aGlzLnNhbXBsZVByb2plY3RFYXIgPSBzYW1wbGVQcm9qZWN0RWFyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBleGlzdGluZ1NlcnZlcikgewotCi0gICAgdGhpcy5leGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJdGhpcy5zZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG5lZWRFQVIgVGhlIG5lZWRFQVIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIG5lZWRFQVIpCi0gIHsKLSAgICB0aGlzLm5lZWRFQVIgPSBuZWVkRUFSOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgajJlZVZlcnNpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SjJlZVZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgICBqMmVlVmVyc2lvbiA9IHZlcnNpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaERlZmF1bHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hEZWZhdWx0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZkZjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaERlZmF1bHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotCi0vKgotKiBUaGUgSlNQR2VuZXJhdGlvbiB0YXNrIHJ1bnMgdGhlIGpzcCBnZW5lcmF0aW9uIGVuZ2luZSBmb3VuZCBpbiB0aGUgCi0qIEpCV2l6YXJkIFBsdWdpbgotKgotKgotKi8KLXB1YmxpYyBjbGFzcyBGaW5pc2hEZWZhdWx0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJJbnN0YW5jZUlkOwotCi0gIAotICBwdWJsaWMgRmluaXNoRGVmYXVsdENvbW1hbmQgKCkKLSAgewotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgCWlmKHNhbXBsZVNlcnZlckluc3RhbmNlSWQgIT0gbnVsbCl7Ci0gIAkgIHNhbXBsZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNhbXBsZVNlcnZlckluc3RhbmNlSWQpOwotICAJaWYgKHNhbXBsZUV4aXN0aW5nU2VydmVyICE9IG51bGwpCi0gICAgICBzYW1wbGVTZXJ2ZXJUeXBlSUQgPSBzYW1wbGVFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIAotICAJfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkKQotICB7Ci0JdGhpcy5zYW1wbGVTZXJ2ZXJJbnN0YW5jZUlkID0gc2VydmVySW5zdGFuY2VJZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoKQotICB7Ci0gIAlyZXR1cm4gc2FtcGxlU2VydmVyVHlwZUlEOwotCQotICB9Ci0gIAotICBwdWJsaWMgSVNlcnZlciBnZXRTYW1wbGVFeGlzdGluZ1NlcnZlcigpCi0gIHsKLSAgCXJldHVybiBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVySWQoU3RyaW5nIGV4aXN0aW5nU2VydmVySWQpCi0gIHsKLSAgfSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaEphdmFUZXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaEphdmFUZXN0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwYzFiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hKYXZhVGVzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmluaXNoSmF2YVRlc3RGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudCAKLXsKLSAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUHJveHk7Ci0JCi0gIHB1YmxpYyBGaW5pc2hKYXZhVGVzdEZyYWdtZW50KCkKLSAgewotICAJU2VxdWVuY2VGcmFnbWVudCBqYXZhVGVzdFJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oKQotCXsKLQkgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLQkgIHsKLQkgICAgcmV0dXJuIGdlbmVyYXRlUHJveHk7IAotCSAgfQotCX07Ci0gICAgc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7Ci0gICAgamF2YVRlc3RSb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFRlc3RDbGllbnREZXBhcnR1cmVJbml0Q29tbWFuZCgpLCAiIikpOwotICAgIGphdmFUZXN0Um9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KGphdmFUZXN0Um9vdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuZXJhdGVQcm94eSkKLSAgewotICAJdGhpcy5nZW5lcmF0ZVByb3h5ID0gZ2VuZXJhdGVQcm94eTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SXNKU1BHZW4oYm9vbGVhbiBqc3BHZW4pCi0gIHsKLSAgCQotICB9Ci0gIAotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hUZXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaFRlc3RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGZkMGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaFRlc3RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDcyNyAgIDE0NDM1NCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEZpbmlzaFRlc3RGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudHsKLQotICBwcml2YXRlIGJvb2xlYW4gaXNUZXN0V2lkZ2V0OwkKLSAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUHJveHk7ICAvLyBUaGlzIGFjdHVhbGx5IHJlcHJlc2VudCB3aGV0aGVyIGNsaWVudCB0ZXN0IGlzIHJlcXVlc3RlZAotICBwcml2YXRlIFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RTZXJ2aWNlOwotICBwcml2YXRlIFN0cmluZyB0ZXN0SUQ7Ci0gIHB1YmxpYyBGaW5pc2hUZXN0RnJhZ21lbnQoKQotICB7Ci0gICAgQ29uZGl0aW9uIGNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oKQotCXsKLQkgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLQkgIHsKLQkgICAgaWYoIXRlc3RTZXJ2aWNlKSByZXR1cm4gZmFsc2U7Ci0JICAJaWYobGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0JICAgIGlmKGxhdW5jaGVkU2VydmljZVRlc3ROYW1lICE9IG51bGwpCi0JICAgICAgaWYoKCFsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZS5lcXVhbHMoIiIpICYmICAoIWlzUHJlZmVyZWRBV1NETFRlc3QoKSB8fCAoaXNUZXN0V2lkZ2V0ICYmIGlzQ2xpZW50VGVzdEphdmEoKSkpICYmIGdlbmVyYXRlUHJveHkpIHx8IGxhdW5jaGVkU2VydmljZVRlc3ROYW1lLmVxdWFscygiIikpIHJldHVybiB0cnVlOwkKLQkgICAgCi0JICAJcmV0dXJuIGZhbHNlOyAKLQkgIH0KLQl9OwotCSAgIAotCXNldFRydWVGcmFnbWVudChuZXcgV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudCgpKTsKLSAgICBzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKLSAgfQotCSAgICAKLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lKQotICB7Ci0JdGhpcy5sYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSA9IGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICB9Ci0JICAKLSAgcHVibGljIGJvb2xlYW4gaXNQcmVmZXJlZEFXU0RMVGVzdCgpCi0gIHsKLSAgICBTY2VuYXJpb0NvbnRleHQgc2NlbmFyaW9Db250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpLmNvcHkoKTsKLQlTdHJpbmdbXSB0ZXN0VHlwZXMgPSBzY2VuYXJpb0NvbnRleHQuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotCVdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgd3N0dFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCVdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIHdzY3RlID0gKFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKXdzdHRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSh0ZXN0VHlwZXNbMF0pOyAgCQotCWlmKHdzY3RlLnRlc3RXU0RMKCkpCQotCSAgcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDbGllbnRUZXN0SmF2YSgpCi0gIHsKLSAgCWlmKHRlc3RJRCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gIAlXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHdzdHRSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2N0ZSA9IChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbil3c3R0UmVnaXN0cnkuZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUodGVzdElEKTsgIAkKLQlpZighd3NjdGUudGVzdFdTREwoKSkJCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7ICAgCQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoYm9vbGVhbiB0ZXN0U2VydmljZSkKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2UgPSB0ZXN0U2VydmljZTsJIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRlUHJveHkgPSBnZW5lcmF0ZVByb3h5OwkgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUZXN0SUQoU3RyaW5nIHRlc3RJRCkKLSAgewotICAgIHRoaXMudGVzdElEID0gdGVzdElEOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNUZXN0V2lkZ2V0KGJvb2xlYW4gaXNUZXN0V2lkZ2V0KQotICB7Ci0gIAl0aGlzLmlzVGVzdFdpZGdldCA9IGlzVGVzdFdpZGdldDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2MWViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZm9yY2VCdWlsZDsJCi0JCi0gIHB1YmxpYyBUZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQoKQotICB7Ci0gIAlmb3JjZUJ1aWxkID0gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEZvcmNlQnVpbGQoKQotICB7Ci0gIAlyZXR1cm4gZm9yY2VCdWlsZDsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvVGVzdERlZmF1bHRpbmdGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvVGVzdERlZmF1bHRpbmdGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjQ2ZTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3REZWZhdWx0aW5nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA3MjcgICAxNDQzNTQga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwODIxICAgMTUzODMzIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBBbGxvdyB0aGUgV2ViIFNlcnZpY2UgVGVzdCBleHRlbnNpb24gcG9pbnQgdG8gc3BlY2lmeSB0aGUgc3VwcG9ydGVkIGNsaWVudCBydW50aW1lCi0gKiAyMDA2MDkwNyAgIDE1NjYwNiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgbm8gc2FtcGxlIEpTUCBpbiB0aGUgcG9wLXVwIGFjdGlvbiBvZiBHZW5lcmF0ZSBTYW1wbGUgSlNQcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdERlZmF1bHRpbmdGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIAotICBwcml2YXRlIFNlbGVjdGlvbkxpc3QgdGVzdEZhY2lsaXRpZXM7Ci0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQ7CQotICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVQcm94eTsgIC8vIFRoaXMgYWN0dWFsbHkgcmVwcmVzZW50IHdoZXRoZXIgY2xpZW50IHRlc3QgaXMgcmVxdWVzdGVkCi0gIAotICBwcml2YXRlIFN0cmluZyBjbGllbnRSdW50aW1lSWRfOwotICAKLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgCQotICAJc2NlbmFyaW9Db250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpLmNvcHkoKTsKLSAgCS8vICB0ZXN0IGZhY2lsaXRpZXMKLSAgICBzZWxlY3RUZXN0RmFjaWxpdHkoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0JCi0gIC8vIFRoZSB0ZXN0IGZhY2lsaXRpZXMgcmV0cmlldmVkIGZyb20gdGhlIGV4dGVuc2lvbgotICAvLyBwbHVzIHRoZSBkZWZhdWx0Ci0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFRlc3RGYWNpbGl0eSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdEZhY2lsaXRpZXM7Ci0gIH0gCi0JICAKLSAgCi0gIAotICAvLwkqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgLy8gVGhpcyBtZXRob2QgdXNlcyB0aGUgcHJlZmVyZW5jZSB0byAKLSAgLy8gc2VsZWN0IHRoZSBjb3JyZWN0IHRlc3QgZmFjaWxpdHkgCi0gIC8vIAotICAvLyoqKioqKioqKioqKioqKioqKioqKioqCi0gIHByaXZhdGUgdm9pZCBzZWxlY3RUZXN0RmFjaWxpdHkoKQotICB7Ci0gICAgLy9pZiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSBsYXVuY2hlZCBlYXJsaWVyIAotICAgIC8vcHV0IGl0IG9uIHRoZSBib3R0b20KLSAgICBTdHJpbmdbXSB0ZXN0VHlwZXMgPSBzY2VuYXJpb0NvbnRleHQuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwkgIAotICAgIExpc3QgbmV3VGVzdFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCVN0cmluZ1tdIHdzZGxDYXNlcyA9IHNjZW5hcmlvQ29udGV4dC5nZXROb25KYXZhVGVzdFNlcnZpY2UoKTsKLQlib29sZWFuIGxhdW5jaGVkID0gZmFsc2U7Ci0JCi0gICAgZm9yKGludCBpID0gMDtpPHRlc3RUeXBlcy5sZW5ndGg7aSsrKXsKLSAgICAJCi0gICAgICBXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiBleHRlbnNpb24gPQotICAgIAkgIChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbikgV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0gICAgCSAgLmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHRlc3RUeXBlc1tpXSk7Ci0JCSAgCi0gICAgICBpZiAoY2xpZW50UnVudGltZUlkXyAhPSBudWxsICYmICFleHRlbnNpb24uc3VwcG9ydHNSdW50aW1lKGNsaWVudFJ1bnRpbWVJZF8pKQotICAgIAkgIGNvbnRpbnVlOwotICAgIAkKLQkgIGlmKHRlc3RUeXBlc1tpXS5lcXVhbHMobGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpKQotCSAgICBsYXVuY2hlZCA9IHRydWU7Ci0JICBlbHNlewotCSAgICAgbmV3VGVzdFR5cGVzLmFkZCh0ZXN0VHlwZXNbaV0pOyAKLQkgIH0KLQl9Ci0JICAgCQotICAgIGlmKGxhdW5jaGVkKQotCSAgbmV3VGVzdFR5cGVzLmFkZChsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSk7Ci0gICAgCi0JCi0JaWYoIWdlbmVyYXRlUHJveHkpCi0gICAgICB0ZXN0RmFjaWxpdGllcyA9IG5ldyBTZWxlY3Rpb25MaXN0KHdzZGxDYXNlcywwKTsJCi0JZWxzZSB7Ci0JICBTdHJpbmdbXSB0ZW1wQXJyYXkgPSBuZXcgU3RyaW5nW25ld1Rlc3RUeXBlcy5zaXplKCldOwotCSAgdGVzdEZhY2lsaXRpZXMgPSBuZXcgU2VsZWN0aW9uTGlzdCgoU3RyaW5nW10pIG5ld1Rlc3RUeXBlcy50b0FycmF5KHRlbXBBcnJheSksIDApOwotCX0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaGVkU2VydmljZVRlc3ROYW1lKFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSkKLSAgewotICAJdGhpcy5sYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSA9IGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuZXJhdGVQcm94eSkKLSAgewotICAJdGhpcy5nZW5lcmF0ZVByb3h5ID0gZ2VuZXJhdGVQcm94eTsKLSAgfQotICAgIAotICAvKioKLSAgICogU2V0cyB0aGUgY2xpZW50IHJ1bnRpbWUgSUQuCi0gICAqIAotICAgKiBAcGFyYW0gY2xpZW50UnVudGltZUlkIFRoZSBjbGllbnQgcnVudGltZSBJRC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFJ1bnRpbWVJZChTdHJpbmcgY2xpZW50UnVudGltZUlkKSB7Ci0JICBjbGllbnRSdW50aW1lSWRfID0gY2xpZW50UnVudGltZUlkOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3RXZWJTZXJ2aWNlQ2xpZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0V2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGVmYWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3RXZWJTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLQotcHVibGljIGNsYXNzIFRlc3RXZWJTZXJ2aWNlQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50IHsKLSAgCi0gIHB1YmxpYyBUZXN0V2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBjbGllbnRJbmZvKXsKLQlzdXBlcihjbGllbnRJbmZvKTsgIAotICB9Ci0gIAotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpewotICAgIHJldHVybiBudWxsOwkgIAotICB9Ci0JCQkKLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLSAgICAgIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCl7Ci0gICAgcmV0dXJuIG51bGw7CSAgCi0gIH0KLQkJCQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkgICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpewotICAgIHJldHVybiBudWxsOwkgIAotICB9Ci0JCQkJCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkgICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpewotICAgIHJldHVybiBudWxsOwotICB9Ci0JCQkKLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkgICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpewotICAgIHJldHVybiBudWxsOwkgIAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV1NETEZpbmlzaEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMRmluaXNoRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmNDM2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMRmluaXNoRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRmluaXNoRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnR7Ci0gIAotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV1NETFRlc3RMYXVuY2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMVGVzdExhdW5jaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkODM5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMVGVzdExhdW5jaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2VUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuVGVzdEluZm87Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV1NETFRlc3RMYXVuY2hDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdGVzdElEOyAKLSAgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZWlkczsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyTW9kdWxlOwotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIGJvb2xlYW4gZXh0ZXJuYWxCcm93c2VyOwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRCA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkID0gbnVsbDsKLQkKLSAgcHVibGljIFdTRExUZXN0TGF1bmNoQ29tbWFuZCgpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsgICAgCi0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gIAkKLSAgCVdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgdGVzdFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAJV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NjdGUgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pdGVzdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHRlc3RJRCk7Ci0JSVdlYlNlcnZpY2VUZXN0ZXIgaXdzdCA9IChJV2ViU2VydmljZVRlc3Rlcil3c2N0ZS5nZXRXZWJTZXJ2aWNlRXhlY3V0YWJsZUV4dGVuc2lvbigpOwotCVRlc3RJbmZvIHRlc3RJbmZvID0gZ2V0VGVzdEluZm8oKTsKLQkKLQkKLQlzdGF0dXMgPSBjb21tYW5kRmFjdG9yeUV4ZWN1dGlvbihpd3N0LmxhdW5jaCh0ZXN0SW5mbyksZW52LCBtb25pdG9yKTsKLQkKLSAgICAvL0RvbnQgbmVlZCB0byBzaHV0IGV2ZXJ5dGhpbmcgZG93biBiZWNhdXNlIHRoZSB3c2RsIHRlc3QgZG9lc250IHdvcmsKLSAgICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spewotICAgICAgSVN0YXR1c0hhbmRsZXIgc0hhbmRsZXIgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgSVN0YXR1cyBpbmZvU3RhdHVzID0gU3RhdHVzVXRpbHMuaW5mb1N0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9VTkFCTEVfVE9fTEFVTkNIX1dTRExfVEVTVCApOwotICAgICAgc0hhbmRsZXIucmVwb3J0SW5mbyhpbmZvU3RhdHVzKTsKLSAgICAgIHJldHVybiBpbmZvU3RhdHVzOwkKLSAgICB9Ci0gICByZXR1cm4gc3RhdHVzOwotICAJCi0gIH0KLQotICBwcml2YXRlIElTdGF0dXMgY29tbWFuZEZhY3RvcnlFeGVjdXRpb24oSUNvbW1hbmRGYWN0b3J5IGNvbW1hbmRGYWN0b3J5LElFbnZpcm9ubWVudCBlbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgIAkKLQl3aGlsZShjb21tYW5kRmFjdG9yeS5oYXNOZXh0KCkpCi0gIHsgCi0JICBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb21tYW5kRmFjdG9yeS5nZXROZXh0Q29tbWFuZCgpOwotICAgIAotCSAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBvcGVyYXRpb24uc2V0RW52aXJvbm1lbnQoIGVudiApOwotCSAgICAgIHN0YXR1cyA9IG9wZXJhdGlvbi5leGVjdXRlKCBtb25pdG9yLCBudWxsICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBleGMgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0JICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpewotCSAgICBJU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0JCXNIYW5kbGVyLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIAotICBwcml2YXRlIFRlc3RJbmZvIGdldFRlc3RJbmZvKCkKLSAgewotICAgIC8vCWdldCB0aGUgc2VydmVyIHN0dWZmCi0gICAgaWYgKHNlcnZpY2VpZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGwpIAotCSAgc2VydmljZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZpY2VpZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICBlbHNlIGlmIChzZXJ2aWNlU2VydmVySW5zdGFuY2VJZCE9bnVsbCkKLQkJc2VydmljZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKTsKLQkKLQlpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyICE9IG51bGwpCi0JICBzZXJ2aWNlU2VydmVyVHlwZUlEID0gc2VydmljZUV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCWVsc2UKLQkgIHNlcnZpY2VTZXJ2ZXJUeXBlSUQgPSBzZXJ2aWNlaWRzLmdldFNlcnZlcklkKCk7Ci0JLy8gc2VydmVyIHdpbGwgYmUgY3JlYXRlZCBpbiBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQKLSAgCi0gICAgVGVzdEluZm8gdGVzdEluZm8gPSBuZXcgVGVzdEluZm8oKTsKLQlpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyIT1udWxsKQotCQl0ZXN0SW5mby5zZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoc2VydmljZUV4aXN0aW5nU2VydmVyKTsKLSAgICB0ZXN0SW5mby5zZXRTZXJ2aWNlU2VydmVyVHlwZUlEKHNlcnZpY2VTZXJ2ZXJUeXBlSUQpOwotCXRlc3RJbmZvLnNldFNlcnZpY2VQcm9qZWN0KHNlcnZlclByb2plY3QpOwotCXRlc3RJbmZvLnNldFdzZGxTZXJ2aWNlVVJMKHdzZGxVUkkpOwotCXRlc3RJbmZvLnNldEV4dGVybmFsQnJvd3NlcihleHRlcm5hbEJyb3dzZXIpOwotCXRlc3RJbmZvLnNldEVuZHBvaW50KGVuZHBvaW50cyk7Ci0JcmV0dXJuIHRlc3RJbmZvOwotCQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdElEKFN0cmluZyB0ZXN0SUQpCi0gIHsKLSAgCXRoaXMudGVzdElEID0gdGVzdElEOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7CQotICB9Ci0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgCXRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChTdHJpbmcgc2VydmVyUHJvamVjdCkKLSAgewotICAgIHRoaXMuc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHNlcnZpY2VpZHMpCi0gIHsKLSAgICB0aGlzLnNlcnZpY2VpZHMgPSBzZXJ2aWNlaWRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxCcm93c2VyKGJvb2xlYW4gZXh0ZXJuYWxCcm93c2VyKQotICB7Ci0JICB0aGlzLmV4dGVybmFsQnJvd3NlciA9IGV4dGVybmFsQnJvd3NlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoTGlzdCBlbmRwb2ludHMpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsKLSAgfQotCi1wdWJsaWMgU3RyaW5nIGdldFNlcnZlck1vZHVsZSgpIHsKLQlyZXR1cm4gc2VydmVyTW9kdWxlOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2ZXJNb2R1bGUoU3RyaW5nIHNlcnZlck1vZHVsZSkgewotCXRoaXMuc2VydmVyTW9kdWxlID0gc2VydmVyTW9kdWxlOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVySW5zdGFuY2VJZChTdHJpbmcgc3NJbnN0YW5jZUlkKXsKLQl0aGlzLnNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkID0gc3NJbnN0YW5jZUlkOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDY1NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDYwOCAgIDE0NDUwMCBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24KLSAqIDIwMDYwODE4ICAgMTUzOTAzIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBCcm93c2UgZG9lcyBub3Qgd29yayBpbiBnZW5lcmF0ZSBjbGllbnQgdGVzdCBwYWdlCi0gKiAyMDA2MDkwNiAgIDE1NDU0OCBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzLCBUaGlzIGZpeGVzIG5hbWUgY29sbGlzaW9ucyB3aGVuIGNyZWF0aW5nIGEgc2FtcGxlIHByb2plY3QKLSAqIDIwMDYwOTIyICAgMTU4MTc3IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBOUEUgd2hlbiBjcmVhdGluZyB3ZWIgc2VydmljZSBjbGllbnQgaW50byBleGlzdGluZyBKYXZhIHByb2plY3Qgd2l0aCB0ZXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLS8qKgotKiBUaGlzIHRhc2sgc2V0cyB1cCBhbGwgdGhlIGRlZmF1bHRzIGZvciB0aGUgd2Vic2VydmljZSB0ZXN0Ci0qIGNsaWVudCBwYWdlCi0qCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dFQl9NT0RVTEVfUk9PVCA9ICJXZWJDb250ZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQU1QTEVfV0VCX1BST0pFQ1RfRVhUID0gIlNhbXBsZSI7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0FNUExFX0RJUiA9ICJzYW1wbGUiOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdEVBUjsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UDsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50QzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBjbGllbnRJUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgZm9sZGVyOwotICBwcml2YXRlIFN0cmluZyBqc3BGb2xkZXI7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlQzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdEVBUjsKLQotICAKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsVGFzayBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgYW5kIGRlc2NyaXB0aW9uLgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZCAoKQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gIAkKLQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gIAkKLQlzYW1wbGVQcm9qZWN0QW5kRWFyU2V0dXAoZW52KTsKLQlJUGF0aCB3ZWJjb250ZW50UGF0aCA9IG51bGw7Ci0KLQkvLyAqbmVlZCogdG8gZG91YmxlLWNoZWNrIHRoYXQgY2xpZW50SVByb2plY3QgaXMgYSB3ZWIgcHJvamVjdAotCWlmIChKMkVFVXRpbHMuaXNXZWJDb21wb25lbnQoY2xpZW50SVByb2plY3QpKQotCQl3ZWJjb250ZW50UGF0aCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aChjbGllbnRJUHJvamVjdCk7Ci0JCi0gICAgLy9HZXQgdGhlIHNhbXBsZSBGb2xkZXIgcmVhZHkKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgCi0gICAgaWYgKHdlYmNvbnRlbnRQYXRoICE9IG51bGwpCi0gICAgewkKLSAgICAJU3RyaW5nIHBhdGggPSB3ZWJjb250ZW50UGF0aC50b1N0cmluZygpOwotICAgIAlzYi5hcHBlbmQocGF0aCkuYXBwZW5kKCIvIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CS8vdGhlbiBqdXN0IHVzZSB0aGUgZGVmYXVsdAotICAgIAlzYi5hcHBlbmQoIi8iKS5hcHBlbmQoc2FtcGxlQykuYXBwZW5kKCIvIikuYXBwZW5kKERFRkFVTFRfV0VCX01PRFVMRV9ST09UKS5hcHBlbmQoIi8iKTsKLSAgICB9Ci0gICAgZm9sZGVyID0gU0FNUExFX0RJUiArIGdldEJlYW4oKTsgCi0gICAgICAgIAotICAgIHNiLmFwcGVuZChmb2xkZXIpOwotICAgIGpzcEZvbGRlciA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgCi0gICAgLy9nZXQgdGhlIG1ldGhvZCBuYW1lcyByZWFkeQotICAgIC8vZmluZCB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaWxlIGluIHRoZSBwcm9qZWN0Ci0gICAgLyoKLSAgICAqIEdldHRpbmcgdGhlIG1ldGhvZCBuYW1lcyB1c2luZyBqYXZhbW9mIGludHJvc3BlY3Rpb24KLSAgICAqLwotICAgIGlmKHByb3h5QmVhbiA9PSBudWxsKXsKLSAgICAgIElTdGF0dXNIYW5kbGVyIHNIYW5kbGVyID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAgIElTdGF0dXMgZXJyb3JTdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9KVFNfUFJPWFlfTk9UX0NPTVBJTEVEICk7Ci0gICAgICBzSGFuZGxlci5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7Ci0gICAgICAKLSAgICB9IAkKLSAgICAKLSAgICAKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YW1vZmNvbW1hbmQgPSBuZXcgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kKCk7IAotICAgIGphdmFtb2Zjb21tYW5kLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotICAgIGphdmFtb2Zjb21tYW5kLnNldENsaWVudFByb2plY3QoY2xpZW50UCk7Ci0gICAgamF2YW1vZmNvbW1hbmQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotICAgIAotICAgIAotICAgIAotICAgIHRyeXsgCi0gICAgICBJU3RhdHVzIG1vZlN0YXR1cyA9IGphdmFtb2Zjb21tYW5kLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwpOwotICAgICAgaWYobW9mU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgCXJldHVybiBtb2ZTdGF0dXM7Ci0gICAgfWNhdGNoKEV4Y2VwdGlvbiBleGMpewotICAgIAlJU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0gICAgICAgIElTdGF0dXMgZXJyb3JTdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9KVFNfUFJPWFlfTk9UX0NPTVBJTEVEICk7Ci0gICAgICAgIHNIYW5kbGVyLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIGVycm9yU3RhdHVzOwotICAgIH0gIAotICAgIEphdmFIZWxwZXJzIGphdmFIZWxwZXJzID0gamF2YW1vZmNvbW1hbmQuZ2V0SmF2YUNsYXNzKCk7Ci0gICAgaWYgKGphdmFIZWxwZXJzID09IG51bGwpIHJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsgCi0gICAgaWYoamF2YUhlbHBlcnMgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpIAotICAgICBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFIZWxwZXJzOyAKLSAgICBlbHNlIHJldHVybiBzdGF0dXM7IAotICAgIExpc3QgbWV0aG9kTGlzdCA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzKCk7Ci0gCUJvb2xlYW5TZWxlY3Rpb25bXSB0ZW1wTWV0aG9kcyA9IG5ldyBCb29sZWFuU2VsZWN0aW9uW21ldGhvZExpc3Quc2l6ZSgpXTsKLSAgICBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yID0gbWV0aG9kTGlzdC5saXN0SXRlcmF0b3IoKTsKLSAgICAKLSAgICBpbnQgaiA9IDA7Ci0gCXdoaWxlIChsaXN0SXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKWxpc3RJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZihtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZTsKLSAgICAgIAotICAgICAgdGVtcE1ldGhvZHNbal0gPSBuZXcgQm9vbGVhblNlbGVjdGlvbiggbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSwgdHJ1ZSk7ICAgICAgCi0gICAgICBqKys7Ci0gICAgfSAKLSAgICBtZXRob2RzID0gdGVtcE1ldGhvZHM7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NBTVBMRV9FQVJfUFJPSkVDVF9FWFQgPSAiRUFSIjsKLSAgCi0gIHByaXZhdGUgdm9pZCBzYW1wbGVQcm9qZWN0QW5kRWFyU2V0dXAoSUVudmlyb25tZW50IGVudikKLSAgewotCWlmKGNsaWVudFByb2plY3QgPT0gbnVsbCkgcmV0dXJuOwotICAJZWxzZXsKLQkgIGludCBpbmRleCA9IGNsaWVudFByb2plY3QuaW5kZXhPZigiLyIpOwotCSAgY2xpZW50UCA9IGNsaWVudFByb2plY3Quc3Vic3RyaW5nKDAsaW5kZXgpOwotCSAgY2xpZW50QyA9IGNsaWVudFByb2plY3Quc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gIAl9Ci0JICAKLQljbGllbnRJUHJvamVjdCA9IChJUHJvamVjdClQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoY2xpZW50UCk7Ci0gIAkKLSAgCWlmKEoyRUVVdGlscy5pc1dlYkNvbXBvbmVudChjbGllbnRJUHJvamVjdCkpewotICAgICAgc2FtcGxlUHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0JICBzYW1wbGVQID0gY2xpZW50UDsKLQkgIHNhbXBsZUMgPSBjbGllbnRDOwotIAl9ICAJCi0gIAllbHNleyAKLSAgCSAgc2FtcGxlUCA9IGNsaWVudFAgKyBERUZBVUxUX1NBTVBMRV9XRUJfUFJPSkVDVF9FWFQ7Ci0JICBzYW1wbGVDID0gY2xpZW50QyArIERFRkFVTFRfU0FNUExFX1dFQl9QUk9KRUNUX0VYVDsKLQkgIHNhbXBsZVByb2plY3QgPSBzYW1wbGVQICsgIi8iICsgc2FtcGxlQzsKLQkgIAotCSAgU3RyaW5nIHNhbXBsZVRlbXAgPSBzYW1wbGVQOwotCSAgCi0JICBib29sZWFuIG5hbWVGb3VuZCA9IGZhbHNlOwotCSAgaW50IGkgPSAxOwotCSAgd2hpbGUoIW5hbWVGb3VuZCl7Ci0JCSAgSVByb2plY3Qgc2FtcGxlSVByb2plY3QgPSAoSVByb2plY3QpUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNhbXBsZVRlbXApOwotCQkgIGlmKHNhbXBsZUlQcm9qZWN0LmV4aXN0cygpICYmICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHNhbXBsZUlQcm9qZWN0KSl7Ci0JCQkgIHNhbXBsZVRlbXAgPSBzYW1wbGVQICsgSW50ZWdlci50b1N0cmluZyhpKTsKLQkJCSAgc2FtcGxlUHJvamVjdCA9IHNhbXBsZVRlbXAgKyAiLyIgKyBzYW1wbGVDOwotCQkgICAgICAKLQkJICB9Ci0JCSAgZWxzZQotCQkJICBuYW1lRm91bmQgPSB0cnVlOyAKLQkJICAKLQkJICBpKys7Ci0JICB9Ci0JICBzYW1wbGVQID0gc2FtcGxlVGVtcDsKLSAgICAKLSAgCX0gIAotCQotICAJCi0gIAkKLSAgCQotICAJc2FtcGxlUHJvamVjdEVBUiA9IGNsaWVudFByb2plY3RFQVI7Ci0JaWYgKHNhbXBsZVByb2plY3RFQVIgPT0gbnVsbCB8fCBzYW1wbGVQcm9qZWN0RUFSLmxlbmd0aCgpPT0wKXsKLQkgIHNhbXBsZVByb2plY3RFQVIgPSBzYW1wbGVQICsgREVGQVVMVF9TQU1QTEVfRUFSX1BST0pFQ1RfRVhUICsgIi8iICsgc2FtcGxlQyArIERFRkFVTFRfU0FNUExFX0VBUl9QUk9KRUNUX0VYVDsJCi0JfQotCQotICB9Ci0gICAgCi0gIC8vZ2V0dGVycyBhbmQgc2V0dGVycwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmVhbigpCi0gIHsKLSAgCWludCBpbmRleCA9IHByb3h5QmVhbi5sYXN0SW5kZXhPZigiLiIpOwotICAJU3RyaW5nIGVuZCA9ICIiOwotICAJaWYoaW5kZXggIT0gLTEpewotICAJICBlbmQgPSBwcm94eUJlYW4uc3Vic3RyaW5nKGluZGV4ICsgMSk7ICAJCi0gIAl9Ci0gIAlTdHJpbmcgYmVhbiA9IGVuZC5zdWJzdHJpbmcoMCxlbmQubGVuZ3RoKCkpOwotICAgIAotICAJcmV0dXJuIGJlYW47Ci0gIH0KLSAgCi0gIAotIAotICAKLSAgcHVibGljIFN0cmluZyBnZXRGb2xkZXIoKQotICB7Ci0gIAlyZXR1cm4gZm9sZGVyOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEpzcEZvbGRlcigpCi0gIHsKLSAgCXJldHVybiBqc3BGb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuU2VsZWN0aW9uW10gZ2V0TWV0aG9kcygpCi0gIHsKLSAgICByZXR1cm4gbWV0aG9kczsgIAotICB9Ci0gICAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlUHJvamVjdCgpCi0gIHsKLSAgCXJldHVybiBzYW1wbGVQcm9qZWN0OwotICB9Ci0gICAgICAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0gIAotICAgIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0RUFSKFN0cmluZyBjbGllbnRQcm9qZWN0RUFSKQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0RUFSID0gY2xpZW50UHJvamVjdEVBUjsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVQcm9qZWN0RUFSKCkKLSAgewotICAgIHJldHVybiBzYW1wbGVQcm9qZWN0RUFSOwotICB9Ci0gIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdENsaWVudERlcGFydHVyZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdENsaWVudERlcGFydHVyZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmRmZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkJ1aWxkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC53c3NhbXBsZS5BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0Q2xpZW50RGVwYXJ0dXJlRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IAotewotICBwdWJsaWMgV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudCgpCi0gIHsKLSAgCWFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEZpbmlzaERlZmF1bHRDb21tYW5kKCksIiIpKTsKLSAgIAlhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kKCksIiIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQuY2xhc3MsICJGb3JjZUJ1aWxkIixCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzLCAiU2FtcGxlU2VydmVyVHlwZUlEIixBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzLCAiU2FtcGxlRXhpc3RpbmdTZXJ2ZXIiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MsICJTYW1wbGVTZXJ2ZXJUeXBlSUQiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gIAkgICAgCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L2V4cGxvcmVyL0V4cGxvcmVyU2VydmljZVRlc3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmY2YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XU0RMVGVzdEZpbmlzaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbHVnaW4uRXhwbG9yZXJQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIGltcGxlbWVudHMgV1NETFRlc3RGaW5pc2hDb21tYW5kCi17Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGV4dGVybmFsQnJvd3NlciA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxTZXJ2aWNlVVJMOwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyBXZWJTZXJ2aWNlRXhwbG9yZXJMYXVuY2ggb2JqZWN0IHdpdGggdGhlIGdpdmVuIGxhYmVsIGFuZCBkZXNjcmlwdGlvbi4KLSAgKi8KLSAgcHVibGljIEV4cGxvcmVyU2VydmljZVRlc3RDb21tYW5kICgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgCi0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCi0gICAgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCBsYXVuY2hDb21tYW5kID0gbmV3IFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQoKTsKLSAgICBsYXVuY2hDb21tYW5kLnNldEZvcmNlTGF1bmNoT3V0c2lkZUlERShleHRlcm5hbEJyb3dzZXIpOwotICAgIFZlY3RvciBsYXVuY2hPcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JU3RyaW5nIHN0YXRlTG9jYXRpb24gPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblN0YXRlTG9jYXRpb24oKTsKLQlTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uID0gRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24oKTsKLQlsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5TVEFURV9MT0NBVElPTixzdGF0ZUxvY2F0aW9uKSk7Ci0JbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuREVGQVVMVF9GQVZPUklURVNfTE9DQVRJT04sZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKSk7Ci0gICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV1NETF9VUkwsd3NkbFNlcnZpY2VVUkwpKTsKLSAgICBpZiAoZW5kcG9pbnRzICE9IG51bGwpCi0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZW5kcG9pbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIGxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLldFQl9TRVJWSUNFX0VORFBPSU5ULCBpdC5uZXh0KCkudG9TdHJpbmcoKSkpOwotICAgIGxhdW5jaENvbW1hbmQuc2V0TGF1bmNoT3B0aW9ucygoTGF1bmNoT3B0aW9uW10pbGF1bmNoT3B0aW9uVmVjdG9yLnRvQXJyYXkobmV3IExhdW5jaE9wdGlvblswXSkpOwotICAgIGxhdW5jaENvbW1hbmQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotICAgIHN0YXR1cyA9IGxhdW5jaENvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEJyb3dzZXIoYm9vbGVhbiBleHRlcm5hbEJyb3dzZXIpCi0gIHsKLSAgCXRoaXMuZXh0ZXJuYWxCcm93c2VyID0gZXh0ZXJuYWxCcm93c2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXc2RsU2VydmljZVVSTChTdHJpbmcgd3NkbFNlcnZpY2VVUkwpCi0gIHsKLSAgCXRoaXMud3NkbFNlcnZpY2VVUkwgPSB3c2RsU2VydmljZVVSTDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKQotICB7Ci0gICAgLy9UT0RPOiBUeXBlIG1hcHBpbmdzIHRvIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHJlbW92ZWQuCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gICAgLy9UT0RPOiBUeXBlIG1hcHBpbmdzIHRvIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHJlbW92ZWQuCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KFN0cmluZyBzZXJ2aWNlUHJvamVjdCkKLSAgewotICAgIC8vVE9ETzogVHlwZSBtYXBwaW5ncyB0byB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSByZW1vdmVkLgotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChMaXN0IGVuZHBvaW50cykKLSAgewotICAgIHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV1NFR2VuZXJhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XU0VHZW5lcmF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkNmVlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XU0VHZW5lcmF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LlRlc3RJbmZvOwotCi1wdWJsaWMgY2xhc3MgV1NFR2VuZXJhdGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0KLSAgcHJpdmF0ZSBUZXN0SW5mbyB0ZXN0SW5mbzsKLQkgIAotICBwdWJsaWMgV1NFR2VuZXJhdGVDb21tYW5kKFRlc3RJbmZvIHRlc3RJbmZvKXsKLSAgICB0aGlzLnRlc3RJbmZvID0gdGVzdEluZm87Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIAotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIAotICAgIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQgbGF1bmNoQ29tbWFuZCA9IG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCk7Ci0gICAgbGF1bmNoQ29tbWFuZC5zZXRGb3JjZUxhdW5jaE91dHNpZGVJREUodGVzdEluZm8uZ2V0RXh0ZXJuYWxCcm93c2VyKCkpOwotICAgIFZlY3RvciBsYXVuY2hPcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JU3RyaW5nIHN0YXRlTG9jYXRpb24gPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblN0YXRlTG9jYXRpb24oKTsKLQlTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uID0gRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24oKTsKLQlsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5TVEFURV9MT0NBVElPTixzdGF0ZUxvY2F0aW9uKSk7Ci0JbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuREVGQVVMVF9GQVZPUklURVNfTE9DQVRJT04sZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKSk7Ci0gICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV1NETF9VUkwsdGVzdEluZm8uZ2V0V3NkbFNlcnZpY2VVUkwoKSkpOwotICAgIGlmICh0ZXN0SW5mby5nZXRFbmRwb2ludCgpICE9IG51bGwpCi0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdEluZm8uZ2V0RW5kcG9pbnQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5XRUJfU0VSVklDRV9FTkRQT0lOVCwgaXQubmV4dCgpLnRvU3RyaW5nKCkpKTsKLSAgICBsYXVuY2hDb21tYW5kLnNldExhdW5jaE9wdGlvbnMoKExhdW5jaE9wdGlvbltdKWxhdW5jaE9wdGlvblZlY3Rvci50b0FycmF5KG5ldyBMYXVuY2hPcHRpb25bMF0pKTsKLSAgICBsYXVuY2hDb21tYW5kLnNldEVudmlyb25tZW50KCBlbnYgKTsKLSAgICBzdGF0dXMgPSBsYXVuY2hDb21tYW5kLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XU0VXZWJTZXJ2aWNlVGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XU0VXZWJTZXJ2aWNlVGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTExNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV1NFV2ViU2VydmljZVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuZXhwbG9yZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlVGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LlRlc3RJbmZvOwotCi1wdWJsaWMgY2xhc3MgV1NFV2ViU2VydmljZVRlc3RlciBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlVGVzdGVyICB7Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZW5lcmF0ZShUZXN0SW5mbyB0ZXN0SW5mbyl7Ci0gICAgVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotICB9Ci0JICAKLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBsYXVuY2goVGVzdEluZm8gdGVzdEluZm8pewotICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQljb21tYW5kcy5hZGQobmV3IFdTRUdlbmVyYXRlQ29tbWFuZCh0ZXN0SW5mbykpOwotCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwkKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XZWJTZXJ2aWNlRXhwbG9yZXJFeGVjdXRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XZWJTZXJ2aWNlRXhwbG9yZXJFeGVjdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjMyMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuZXhwbG9yZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeGVjdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYSBraW5kIG9mCi0qIFdlYiBTZXJ2aWNlLVNlcnZlci1SdW50aW1lIGFydGlmYWN0LiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGEgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0qIG9iamVjdCBpcyB0byBtYW51ZmFjdHVyZSB0aGUgd2l6YXJkIHBhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgdHlwZSwgc2VydmVyLCBhbmQgcnVudGltZSBjb25maWd1cmF0aW9uLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRXhwbG9yZXJFeGVjdXRhYmxlIGltcGxlbWVudHMgV2ViU2VydmljZUV4ZWN1dGFibGUKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gICAKLSAgCi0gIHB1YmxpYyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBnZXRGaW5pc2hDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBuZXcgRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQoKTsKLSAgfQotICAKLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjYzOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDMyNCAgIDEyMjc5OSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNTAzICAgMTM4NDc4IHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA1MTAgICAxNDExMTUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC53c3NhbXBsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5BZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5SZXF1aXJlZEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLlN0YXJ0U2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlZhbGlkYXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5UZXN0SW5mbzsKLQotcHVibGljIGNsYXNzIEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICAKLSAgcHJpdmF0ZSBUZXN0SW5mbyB0ZXN0SW5mbzsJCi0JCi0gIHByaXZhdGUgSVByb2plY3Qgc2FtcGxlSVByb2plY3Q7Ci0gIHByaXZhdGUgSVByb2plY3QgY2xpZW50SVByb2plY3Q7Ci0gIHByaXZhdGUgSVByb2plY3Qgc2FtcGxlRUFSSVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZUVBUlByb2plY3Q7Ci0gIAotICBwdWJsaWMgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZChUZXN0SW5mbyB0ZXN0SW5mbykKLSAgewotICAgIHRoaXMudGVzdEluZm8gPSB0ZXN0SW5mbzsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIFdlYlNlcnZlckRlZmF1bHRpbmdUYXNrIFNldCB0aGUgZGVmYXVsdCBzZXJ2ZXIgbmFtZSBhbmQgaWQgZ2l2ZW4gYQotICAgKiBkZXBsb3lhYmxlLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLQkgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotCSAgLy8xLiBDcmVhdGUgYSBXZWIgcHJvamVjdCBmb3IgdGhlIHNhbXBsZSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLQkgIHNhbXBsZUlQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHRlc3RJbmZvLmdldEdlbmVyYXRpb25Qcm9qZWN0KCkpOwotCSAgYm9vbGVhbiBjcmVhdGVkU2FtcGxlUHJvamVjdCA9IGZhbHNlOwotICAgICAgaWYgKCFzYW1wbGVJUHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsgICAgCQotICAgICAgICAgIENyZWF0ZUZhY2V0ZWRQcm9qZWN0Q29tbWFuZCBjb21tYW5kID0gbmV3IENyZWF0ZUZhY2V0ZWRQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgICAgIGNvbW1hbmQuc2V0UHJvamVjdE5hbWUodGVzdEluZm8uZ2V0R2VuZXJhdGlvblByb2plY3QoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXRUZW1wbGF0ZUlkKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfVEVNUExBVEUpOyAgICAgICAgICAKLSAgICAgICAgICAvLyBSZXF1aXJlZEZhY2V0VmVyc2lvbnMgaXMgc2V0IHRvIGFuIGVtcHR5IGFycmF5IGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0byBpbXBvc2UgYW55IGFkZGl0aW9uYWwgY29uc3RyYWludHMuCi0gICAgICAgICAgLy8gV2UganVzdCB3YW50IHRvIGNyZWF0ZSB0aGUgaGlnaGVzdCBsZXZlbCBvZiBXZWIgcHJvamVjdCB0aGF0IHRoZSBzZWxlY3RlZCBzZXJ2ZXIgc3VwcG9ydHMuCi0gICAgICAgICAgY29tbWFuZC5zZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMobmV3IFJlcXVpcmVkRmFjZXRWZXJzaW9uWzBdKTsgICAgICAgICAgIAotICAgICAgICAgIGNvbW1hbmQuc2V0U2VydmVyRmFjdG9yeUlkKHRlc3RJbmZvLmdldENsaWVudFNlcnZlclR5cGVJRCgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldFNlcnZlckluc3RhbmNlSWQodGVzdEluZm8uZ2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXIoKS5nZXRJZCgpKTsKLSAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgYWRhcHRhYmxlICk7Ci0gICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCBzdGF0dXMgKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCSAgCi0gICAgICAgICAgY3JlYXRlZFNhbXBsZVByb2plY3QgPSB0cnVlOwotICAgICAgfQotCSAgCi0JICAvLzIuIElmIHRoZSBzZWxlY3RlZCBzZXJ2ZXIgcmVxdWlyZXMgYW4gRUFSIGFuZCBubyBFQVIgbmFtZQotCSAgLy9oYXMgYmVlbiBwcm92aWRlZCwgY2hvb3NlIGFuIEVBUiBuYW1lIGFuZCBjcmVhdGUgaXQgaWYgaXQgZG9lc24ndCBleGlzdC4KLSAgICAgIFZhbGlkYXRpb25VdGlscyB2dSA9IG5ldyBWYWxpZGF0aW9uVXRpbHMoKTsKLSAgICAgIGJvb2xlYW4gc2VydmVyTmVlZHNFQVIgPSB2dS5zZXJ2ZXJOZWVkc0VBUih0ZXN0SW5mby5nZXRDbGllbnRTZXJ2ZXJUeXBlSUQoKSk7Ci0gICAgICBpZiAoc2VydmVyTmVlZHNFQVIpIHsKLQkJCWlmICh0ZXN0SW5mby5nZXRDbGllbnRFQVJQcm9qZWN0KCkgPT0gbnVsbAotCQkJCQl8fCB0ZXN0SW5mby5nZXRDbGllbnRFQVJQcm9qZWN0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCXNhbXBsZUVBUlByb2plY3QgPSB0ZXN0SW5mby5nZXRHZW5lcmF0aW9uUHJvamVjdCgpICsgREVGQVVMVF9TQU1QTEVfRUFSX1BST0pFQ1RfRVhUOwotCQkJfSBlbHNlIHsKLQkJCQlzYW1wbGVFQVJQcm9qZWN0ID0gdGVzdEluZm8uZ2V0Q2xpZW50RUFSUHJvamVjdCgpOwotCQkJfQotCQkJc2FtcGxlRUFSSVByb2plY3QgID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNhbXBsZUVBUlByb2plY3QpOwotCQkJaWYgKHNhbXBsZUVBUklQcm9qZWN0ID09IG51bGwgfHwgIXNhbXBsZUVBUklQcm9qZWN0LmV4aXN0cygpKQotCQkJewotCQkgICAgICAgICAgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kKCk7Ci0JCSAgICAgICAgICBjb21tYW5kLnNldFByb2plY3ROYW1lKHNhbXBsZUVBUlByb2plY3QpOwotCQkgICAgICAgICAgY29tbWFuZC5zZXRUZW1wbGF0ZUlkKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfVEVNUExBVEUpOyAgICAgICAgICAKLQkJICAgICAgICAgIC8vIFJlcXVpcmVkRmFjZXRWZXJzaW9ucyBpcyBzZXQgdG8gYW4gZW1wdHkgYXJyYXkgYmVjYXVzZSB3ZSBkb24ndCBuZWVkIHRvIGltcG9zZSBhbnkgYWRkaXRpb25hbCBjb25zdHJhaW50cy4KLQkJICAgICAgICAgIC8vIFdlIGp1c3Qgd2FudCB0byBjcmVhdGUgdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgV2ViIHByb2plY3QgdGhhdCB0aGUgc2VsZWN0ZWQgc2VydmVyIHN1cHBvcnRzLgotCQkgICAgICAgICAgY29tbWFuZC5zZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMobmV3IFJlcXVpcmVkRmFjZXRWZXJzaW9uWzBdKTsgICAgICAgICAgIAotCQkgICAgICAgICAgY29tbWFuZC5zZXRTZXJ2ZXJGYWN0b3J5SWQodGVzdEluZm8uZ2V0Q2xpZW50U2VydmVyVHlwZUlEKCkpOwotCQkgICAgICAgICAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHRlc3RJbmZvLmdldENsaWVudEV4aXN0aW5nU2VydmVyKCkuZ2V0SWQoKSk7Ci0JCSAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgYWRhcHRhYmxlICk7Ci0JCSAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotCQkgICAgICAgICAgewotCQkgICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCBzdGF0dXMgKTsKLQkJICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLQkJICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAkgIAkJCQkKLQkJCX0KLQkJCQotCSAgfQotIAotCSAgLy8gMy4gSWYgdGhlIHNlbGVjdGVkIHNlcnZlciByZXF1aXJlcyBhbiBFQVIsIGFuZCB0aGUgc2FtcGxlIHByb2plY3QgaGFzCi0JCS8vIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIEVBUiwgYWRkIGl0LgotICAgICAgaWYgKHNlcnZlck5lZWRzRUFSKQotICAgICAgewotICAJICAgIEFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kIGFzc29jaWF0ZUNvbW1hbmQgPSBuZXcgQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQoKTsKLQkgICAgYXNzb2NpYXRlQ29tbWFuZC5zZXRQcm9qZWN0KHRlc3RJbmZvLmdldEdlbmVyYXRpb25Qcm9qZWN0KCkpOwotCSAgICBhc3NvY2lhdGVDb21tYW5kLnNldEVBUlByb2plY3Qoc2FtcGxlRUFSUHJvamVjdCk7Ci0JICAgIGFzc29jaWF0ZUNvbW1hbmQuc2V0RWFyKHNhbXBsZUVBUlByb2plY3QpOwotCQlhc3NvY2lhdGVDb21tYW5kLnNldEVudmlyb25tZW50KCBlbnYgKTsKLQkgICAgSVN0YXR1cyBzdGF0dXMgPSBhc3NvY2lhdGVDb21tYW5kLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKTsKLQkgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JICAgIHsKLQkgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7ICAgICAKLQkgICAgfSAgICAgIAkgIAotICAgICAgfQotCSAgCi0KLSAgICAgIAotCSAgCi0JICAvLyA0LiBJZiBzZXJ2ZXIgcmVxdWlyZXMgYW4gRUFSLCBhbmQgdGhlIHNhbXBsZSBFQVIgaGFzIG5vdCBhbHJlYWR5IGJlZW4KLQkJLy8gYWRkZWQgdG8gdGhlIHNlcnZlciwgYWRkIGl0LgotCSAgLy8gICBJZiBubyBFQVIgaXMgcmVxdWlyZWQsIGFuZCBzYW1wbGUgcHJvamVjdCBoYXMgbm90IGJlZW4gYWRkZWQgdG8gdGhlIHNlcnZlciBhZGQgaXQuCi0gICAgICBpZiAoc2VydmVyTmVlZHNFQVIpCi0gICAgICB7Ci0gICAgCS8vQWRkIHNhbXBsZUVBUklQcm9qZWN0IHRvIHRoZSBzZXJ2ZXIgaWYgbmVlZGVkLgotICAJCUFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCBtb2RUb1NlcnZlciA9IG5ldyBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQoKTsKLQkJbW9kVG9TZXJ2ZXIuc2V0TW9kdWxlKHNhbXBsZUVBUlByb2plY3QpOwotCQltb2RUb1NlcnZlci5zZXRQcm9qZWN0KHNhbXBsZUVBUlByb2plY3QpOwotCQltb2RUb1NlcnZlci5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHRlc3RJbmZvLmdldENsaWVudEV4aXN0aW5nU2VydmVyKCkuZ2V0SWQoKSk7Ci0JCW1vZFRvU2VydmVyLnNldEVudmlyb25tZW50KCBlbnYgKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBtb2RUb1NlcnZlci5leGVjdXRlKCBtb25pdG9yLCBudWxsICk7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCSAgICB7Ci0JICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOyAgICAgCi0JICAgIH0gICAgICAgICAJICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAJICAvL2FkZCBzYW1wbGVJUHJvamVjdCBkaXJlY3RseSB0byB0aGUgc2VydmVyIGlmIG5lZWRlZC4KLSAgICAgICAgICBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQgYWRkVG9TZXJ2ZXIgPSBuZXcgQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kKCk7Ci0gICAgICAgICAgYWRkVG9TZXJ2ZXIuc2V0TW9kdWxlKHRlc3RJbmZvLmdldEdlbmVyYXRpb25Qcm9qZWN0KCkpOwotICAgICAgICAgIGFkZFRvU2VydmVyLnNldFByb2plY3QodGVzdEluZm8uZ2V0R2VuZXJhdGlvblByb2plY3QoKSk7Ci0gICAgICAgICAgYWRkVG9TZXJ2ZXIuc2V0U2VydmVySW5zdGFuY2VJZCh0ZXN0SW5mby5nZXRDbGllbnRFeGlzdGluZ1NlcnZlcigpLmdldElkKCkpOwotICAgICAgICAgIGFkZFRvU2VydmVyLnNldEVudmlyb25tZW50KCBlbnYgKTsKLSAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGFkZFRvU2VydmVyLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKTsKLSAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7ICAgICAKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgCSAgICAgIAkgIAotICAgICAgfQotCSAgCi0JICAvLzUuIENhbGwgU3RhcnRTZXJ2ZXJDb21tYW5kIGlmIHRoaXMgY29tbWFuZCBoYWQgdG8gY3JlYXRlIHRoZSBzYW1wbGUgcHJvamVjdC4KLSAgICAgIGlmIChjcmVhdGVkU2FtcGxlUHJvamVjdCkKLSAgICAgIHsKLQkJU3RhcnRTZXJ2ZXJDb21tYW5kIHN0YXJ0U2VydmVyID0gbmV3IFN0YXJ0U2VydmVyQ29tbWFuZCh0cnVlKTsKLQkJc3RhcnRTZXJ2ZXIuc2V0U2VydmVySW5zdGFuY2VJZCh0ZXN0SW5mby5nZXRDbGllbnRFeGlzdGluZ1NlcnZlcigpLmdldElkKCkpOwotCQlzdGFydFNlcnZlci5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3RhcnRTZXJ2ZXIuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotCSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLQkgICAgewotCSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgICAgIAotCSAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIAotCSAgLy82LiBFc3RhYmxpc2ggYWxsIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBjbGllbnQgcHJvamVjdCwgc2FtcGxlIHByb2plY3QsIGFuZCBFQVIKLSAgICAgIAotCSAgY2xpZW50SVByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QodGVzdEluZm8uZ2V0Q2xpZW50UHJvamVjdCgpKTsKLQotCQlpZiAoY2xpZW50SVByb2plY3QgIT0gbnVsbCAmJiAhSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KGNsaWVudElQcm9qZWN0KSkgewotCQkJaWYgKEoyRUVVdGlscy5pc0phdmFDb21wb25lbnQoY2xpZW50SVByb2plY3QpKSB7CQkJCQotCQkJCWFkZEphdmFQcm9qZWN0QXNVdGlsaXR5SmFyKGNsaWVudElQcm9qZWN0LCBzYW1wbGVFQVJJUHJvamVjdCwgbW9uaXRvcik7Ci0JCQkJYWRkSmF2YVByb2plY3RBc1V0aWxpdHlKYXIoY2xpZW50SVByb2plY3QsIHNhbXBsZUlQcm9qZWN0LG1vbml0b3IpOwotCQkJfQotCi0JCQkJdHJ5Ci0JCQkJewotCQkJCSAgU3RyaW5nIHVyaSA9IGNsaWVudElQcm9qZWN0LmdldE5hbWUoKSArICIuamFyIjsKLQkJCQkgIGFkZEpBUk9yTW9kdWxlRGVwZW5kZW5jeShzYW1wbGVJUHJvamVjdCwgdXJpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotCQkJCXsKLQkJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfTU9EVUxFX0RFUEVOREVOQ1ksIG5ldyBTdHJpbmdbXXtzYW1wbGVJUHJvamVjdC5nZXROYW1lKCksIGNsaWVudElQcm9qZWN0LmdldE5hbWUoKX0pOwotCQkJCQlJU3RhdHVzIGVycm9yU3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotCQkJCXsKLQkJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfTU9EVUxFX0RFUEVOREVOQ1ksIG5ldyBTdHJpbmdbXXtzYW1wbGVJUHJvamVjdC5nZXROYW1lKCksIGNsaWVudElQcm9qZWN0LmdldE5hbWUoKX0pOwotCQkJCQlJU3RhdHVzIGVycm9yU3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7CQkJCQkKLQkJCQl9CQkJCQkJCQotCQkJCi0JCQl0cnkgewkJCi0JCQkJYWRkQnVpbGRQYXRoKHNhbXBsZUlQcm9qZWN0LCBjbGllbnRJUHJvamVjdCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJLy8gRG8gbm90aGluZyBpbiB0aGlzIGNhdGNoIGJsb2NrLiBUaGUgd29yc3QgdGhhdAotCQkJCS8vIHdpbGwgaGFwcGVuIGlzIHRoYXQgdGhlIHNhbXBsZSBXZWIgcHJvamVjdAotCQkJCS8vIHdpbGwgc2hvdyBzb21lIGNvbXBpbGUgZXJyb3JzLiBUaGUgc2FtcGxlIHdpbGwKLQkJCQkvLyBsaWtlbHkgc3RpbGwgbGF1bmNoIHN1Y2Nlc3NmdWxseSBvbiB0aGUgc2VydmVyCi0JCQkJLy8gYW5kIHRoZSB1c2VyIHdpbGwgYmUgYWJsZSB0byB1c2UgaXQuCi0JCQl9Ci0JCX0gICAgICAJICAKLSAgICAKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFkZEpBUk9yTW9kdWxlRGVwZW5kZW5jeShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLSAgewotICAgIGlmIChKMkVFVXRpbHMuaXNXZWJDb21wb25lbnQocHJvamVjdCkpCi0gICAgewotICAgICAgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0ID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KHByb2plY3QpOwotICAgICAgbWFuaWZlc3QubWVyZ2VDbGFzc1BhdGgobmV3IFN0cmluZ1tde3VyaX0pOwotICAgICAgSjJFRVByb2plY3RVdGlsaXRpZXMud3JpdGVNYW5pZmVzdChwcm9qZWN0LCBtYW5pZmVzdCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYWRkSmF2YVByb2plY3RBc1V0aWxpdHlKYXIoSVByb2plY3QgamF2YVByb2plY3QsIElQcm9qZWN0IGVhclByb2plY3QsSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0JICB0cnkgewotCQkgIElEYXRhTW9kZWwgbWlncmF0aW9uZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJICBtaWdyYXRpb25kbS5zZXRQcm9wZXJ0eShJSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgamF2YVByb2plY3QuZ2V0TmFtZSgpKTsKLQkJICBtaWdyYXRpb25kbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLSAKLSAKLQkJICBJRGF0YU1vZGVsIHJlZmRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJICBMaXN0IHRhcmdldENvbXBMaXN0ID0gKExpc3QpIHJlZmRtLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotIAotCQkgIElWaXJ0dWFsQ29tcG9uZW50IHRhcmdldGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGphdmFQcm9qZWN0KTsKLQkJICBJVmlydHVhbENvbXBvbmVudCBzb3VyY2Vjb21wb25lbnQgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0Q29tcG9uZW50KGVhclByb2plY3QuZ2V0TmFtZSgpKTsKLQkJICB0YXJnZXRDb21wTGlzdC5hZGQodGFyZ2V0Y29tcG9uZW50KTsKLSAKLQkJICByZWZkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCxzb3VyY2Vjb21wb25lbnQgKTsKLQkJICByZWZkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCB0YXJnZXRDb21wTGlzdCk7Ci0JCSAgcmVmZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCAgIi9XRUItSU5GL2xpYiIpOwotCQkgIHJlZmRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCSAgfWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgIAotCSAgfQotICB9Ci0KLSAgCi0gIHByaXZhdGUgdm9pZCBhZGRCdWlsZFBhdGgoSVByb2plY3QgcmVmZXJlbmNpbmdQcm9qZWN0LCBJUHJvamVjdCByZWZlcmVuY2VkUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotICB7Ci0gICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHJlZmVyZW5jaW5nUHJvamVjdCk7Ci0gICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgSUNsYXNzcGF0aEVudHJ5W10gb2xkQ3AgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkgIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NwID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDcC5sZW5ndGggKyAxXTsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ3AubGVuZ3RoOyBpKyspCi0gICAgICAgIG5ld0NwW2ldID0gb2xkQ3BbaV07Ci0JICBuZXdDcFtuZXdDcC5sZW5ndGggLSAxXSA9IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShyZWZlcmVuY2VkUHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQkgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDcCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgfQotICB9Ci0gCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQU1QTEVfRUFSX1BST0pFQ1RfRVhUID0gIkVBUiI7Ci0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9HU1RDR2VuZXJhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9HU1RDR2VuZXJhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDkxZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvR1NUQ0dlbmVyYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW4uSW5wdXRGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5NZXRob2RGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5SZXN1bHRGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5UZXN0Q2xpZW50RmlsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1hbmQuR2VuZXJhdGVQYWdlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1hbmQuSmF2YVRvTW9kZWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuVGVzdEluZm87Ci0KLXB1YmxpYyBjbGFzcyBHU1RDR2VuZXJhdGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5QVVQgICAgICAgPSAiSW5wdXQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEVTVF9DTElFTlQgPSAiVGVzdENsaWVudC5qc3AiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNVTFQgICAgICA9ICJSZXN1bHQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUVUSE9EICAgICAgPSAiTWV0aG9kLmpzcCI7Ci0JCi0gIHByaXZhdGUgVGVzdEluZm8gdGVzdEluZm87Ci0gIHByaXZhdGUgTW9kZWwgcHJveHlNb2RlbDsKLSAgcHJpdmF0ZSBTdHJpbmcganNwZm9sZGVyOwotICAKLSAgcHVibGljIEdTVENHZW5lcmF0ZUNvbW1hbmQoVGVzdEluZm8gdGVzdEluZm8pewotICAJdGhpcy50ZXN0SW5mbyA9IHRlc3RJbmZvOwotICB9Ci0JCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCUNvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kIGNvcHkgPSBuZXcgQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQoKTsgICAgCi0JY29weS5zZXRTYW1wbGVQcm9qZWN0KHRlc3RJbmZvLmdldEdlbmVyYXRpb25Qcm9qZWN0KCkpOwotICAgIGNvcHkuc2V0RW52aXJvbm1lbnQoIGVudiApOwotCXN0YXR1cyA9IGNvcHkuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCk7Ci0JaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLQlzZXRKU1BGb2xkZXIoKTsKLQlzdGF0dXMgPSBjcmVhdGVNb2RlbChlbnYsIG1vbml0b3IpOwotCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0Jc3RhdHVzID0gZ2VuZXJhdGVQYWdlcyhlbnYpOwotCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0JcmV0dXJuIHN0YXR1czsgICAKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRKU1BGb2xkZXIoKXsKLSAgICAvL2lmIHRoZSBjbGllbnQgaXMgbm90IGEgd2ViY29tcG9uZW50IHRoZW4gdGhlIAotCS8vc2FtcGxlIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIHdlIG11c3Qgbm93IGZhY3RvciBpbiAKLQkvL2ZsZXhpYmxlIHByb2plY3RzICAKLQkgIAotCUlQcm9qZWN0IGNsaWVudElQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHRlc3RJbmZvLmdldENsaWVudFByb2plY3QoKSk7Ci0gICAgaWYgKGNsaWVudElQcm9qZWN0ICE9IG51bGwgJiYgIUoyRUVVdGlscy5pc1dlYkNvbXBvbmVudChjbGllbnRJUHJvamVjdCkpeyAgIAotCSAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0ZXN0SW5mby5nZXRHZW5lcmF0aW9uUHJvamVjdCgpKTsKLQkgIElQYXRoIHBhdGggPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JICBpbnQgaW5kZXggPSB0ZXN0SW5mby5nZXRKc3BGb2xkZXIoKS5sYXN0SW5kZXhPZigiLyIpOwotCSAgU3RyaW5nIGpzcCA9IHRlc3RJbmZvLmdldEpzcEZvbGRlcigpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCSAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwkKLQkgIHNiLmFwcGVuZCgiLyIpLmFwcGVuZChwYXRoLnRvU3RyaW5nKCkpLmFwcGVuZCgiLyIpLmFwcGVuZChqc3ApOwkgIAotCSAganNwZm9sZGVyID0gc2IudG9TdHJpbmcoKTsKLQl9IAotICAgIGVsc2UKLQkgIGpzcGZvbGRlciA9IHRlc3RJbmZvLmdldEpzcEZvbGRlcigpOwkKLSAgCi0gIAotICB9Ci0gIAotICAvL2NyZWF0ZSB0aGUgbW9kZWwgZnJvbSB0aGUgcmVzb3VyY2UKLSAgcHJpdmF0ZSBJU3RhdHVzIGNyZWF0ZU1vZGVsKElFbnZpcm9ubWVudCBlbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIHsKLSAgICBKYXZhVG9Nb2RlbENvbW1hbmQganRtYyA9IG5ldyBKYXZhVG9Nb2RlbENvbW1hbmQoKTsKLQlqdG1jLnNldE1ldGhvZHModGVzdEluZm8uZ2V0TWV0aG9kcygpKTsKLQlqdG1jLnNldENsaWVudFByb2plY3QodGVzdEluZm8uZ2V0Q2xpZW50UHJvamVjdCgpKTsKLQlqdG1jLnNldFByb3h5QmVhbih0ZXN0SW5mby5nZXRQcm94eUJlYW4oKSk7Ci0JanRtYy5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0JSVN0YXR1cyBzdGF0dXMgPSBqdG1jLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwpOwotCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgcHJveHlNb2RlbCA9IGp0bWMuZ2V0SmF2YURhdGFNb2RlbCgpOwotCXJldHVybiBzdGF0dXM7Ci0gIH0gCi0gIAotICAgLyoqCi0gICAqIEdlbmVyYXRlIHRoZSBmb3VyIGpzcHMgdGhhdCBtYWtlIHVwIHRoaXMKLSAgICogc2FtcGxlIGFwcC4KLSAgICovCi0gICBwcml2YXRlIElTdGF0dXMgZ2VuZXJhdGVQYWdlcyhJRW52aXJvbm1lbnQgZW52KQotICAgewotICAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQlJUGF0aCBmRGVzdGluYXRpb25Gb2xkZXJQYXRoID0gbmV3IFBhdGgoanNwZm9sZGVyKTsKLSAgICBmRGVzdGluYXRpb25Gb2xkZXJQYXRoID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5tYWtlQWJzb2x1dGUoKTsgICAgCi0gICAgSVdvcmtzcGFjZVJvb3QgZldvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLSAgICAgSVBhdGggcGF0aFRlc3QgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChURVNUX0NMSUVOVCk7Ci0gICAgIElGaWxlIGZpbGVUZXN0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhUZXN0KTsKLSAgICAgR2VuZXJhdGVQYWdlQ29tbWFuZCBncGNUZXN0ID0gbmV3IEdlbmVyYXRlUGFnZUNvbW1hbmQoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgcHJveHlNb2RlbCwKLSAgICAgICBuZXcgVGVzdENsaWVudEZpbGVHZW5lcmF0b3IoSU5QVVQsTUVUSE9ELFJFU1VMVCksZmlsZVRlc3QpOwotICAgICAvL2dwY1Rlc3Quc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgICBncGNUZXN0LnNldEVudmlyb25tZW50KCBlbnYgKTsKLSAgICAgc3RhdHVzID0gZ3BjVGVzdC5leGVjdXRlKCBudWxsLCBudWxsICk7Ci0gICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgCi0KLSAgICAgLy9pbnB1dCBjb2RlZ2VuCi0gICAgIElQYXRoIHBhdGhJbnB1dCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGguYXBwZW5kKElOUFVUKTsKLSAgICAgSUZpbGUgZmlsZUlucHV0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhJbnB1dCk7Ci0gICAgIElucHV0RmlsZUdlbmVyYXRvciBpbnB1dEdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVHZW5lcmF0b3IoUkVTVUxUKTsKLSAgICAgR2VuZXJhdGVQYWdlQ29tbWFuZCBncGNJbnB1dCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICAgaW5wdXRHZW5lcmF0b3IsZmlsZUlucHV0KTsKLSAgICAgLy9ncGNJbnB1dC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgIGdwY0lucHV0LnNldEVudmlyb25tZW50KCBlbnYgKTsKLSAgICAgc3RhdHVzID0gZ3BjSW5wdXQuZXhlY3V0ZSggbnVsbCwgbnVsbCApOwotICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICAgCXJldHVybiBzdGF0dXM7Ci0KLSAgICAgLy9tZXRob2QgY29kZWdlbgotICAgICBJUGF0aCBwYXRoTWV0aG9kID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5hcHBlbmQoTUVUSE9EKTsKLSAgICAgSUZpbGUgZmlsZU1ldGhvZCA9IGZXb3Jrc3BhY2UuZ2V0RmlsZShwYXRoTWV0aG9kKTsKLSAgICAgTWV0aG9kRmlsZUdlbmVyYXRvciBtZXRob2RHZW5lcmF0b3IgPSBuZXcgTWV0aG9kRmlsZUdlbmVyYXRvcihJTlBVVCk7Ci0gICAgIG1ldGhvZEdlbmVyYXRvci5zZXRDbGllbnRGb2xkZXJQYXRoKGpzcGZvbGRlcik7Ci0gICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjTWV0aG9kID0gbmV3IEdlbmVyYXRlUGFnZUNvbW1hbmQoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgcHJveHlNb2RlbCwKLSAgICAgICBtZXRob2RHZW5lcmF0b3IsZmlsZU1ldGhvZCk7Ci0gICAgIC8vZ3BjTWV0aG9kLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgZ3BjTWV0aG9kLnNldEVudmlyb25tZW50KCBlbnYgKTsKLSAgICAgc3RhdHVzID0gZ3BjTWV0aG9kLmV4ZWN1dGUoIG51bGwsIG51bGwgKTsKLSAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgIAlyZXR1cm4gc3RhdHVzOyAgICAKLQotCi0gICAgIC8vcmVzdWx0IGNvZGVnZW4KLSAgICAgSVBhdGggcGF0aFJlc3VsdCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGguYXBwZW5kKFJFU1VMVCk7Ci0gICAgIElGaWxlIGZpbGVSZXN1bHQgPSBmV29ya3NwYWNlLmdldEZpbGUocGF0aFJlc3VsdCk7Ci0gICAgIFJlc3VsdEZpbGVHZW5lcmF0b3IgcmZnID0gbmV3IFJlc3VsdEZpbGVHZW5lcmF0b3IoKTsKLSAgICAgcmZnLnNldENsaWVudEZvbGRlclBhdGgoanNwZm9sZGVyKTsKLSAgICAgcmZnLnNldFNldEVuZHBvaW50TWV0aG9kKHRlc3RJbmZvLmdldFNldEVuZHBvaW50TWV0aG9kKCkpOwotICAgICBHZW5lcmF0ZVBhZ2VDb21tYW5kIGdwY1Jlc3VsdCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICAgcmZnLGZpbGVSZXN1bHQpOwotICAgICBncGNSZXN1bHQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotICAgICBzdGF0dXMgPSBncGNSZXN1bHQuZXhlY3V0ZSggbnVsbCwgbnVsbCApOwotICAgICAKLSAgICAgcmV0dXJuIHN0YXR1czsKLSAgIH0KLQotICAgCi0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9HU1RDTGF1bmNoQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvR1NUQ0xhdW5jaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViZmM4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9HU1RDTGF1bmNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxOCAgIDEzNDMyMiByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI0ICAgMTI0MzY4IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuU3RhcnRTZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV2ViQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuVGVzdEluZm87Ci0KLXB1YmxpYyBjbGFzcyBHU1RDTGF1bmNoQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5QVVQgICAgICAgPSAiSW5wdXQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEVTVF9DTElFTlQgPSAiVGVzdENsaWVudC5qc3AiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNVTFQgICAgICA9ICJSZXN1bHQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUVUSE9EICAgICAgPSAiTWV0aG9kLmpzcCI7Ci0JCQotICBwcml2YXRlIFRlc3RJbmZvIHRlc3RJbmZvOwotICBwcml2YXRlIFN0cmluZyBqc3Bmb2xkZXI7Ci0gIAotICBwdWJsaWMgR1NUQ0xhdW5jaENvbW1hbmQoVGVzdEluZm8gdGVzdEluZm8pewotICAgIHRoaXMudGVzdEluZm8gPSB0ZXN0SW5mbzsKLSAgfQotCQkKLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsgICAgCi0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgCi0gICAgc2V0SlNQRm9sZGVyKCk7Ci0gICAgCi0JICByZXR1cm4gbGF1bmNoU2FtcGxlKGVudiwgbW9uaXRvcik7Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIHNldEpTUEZvbGRlcigpewotCSAgICAvL2lmIHRoZSBjbGllbnQgaXMgbm90IGEgd2ViY29tcG9uZW50IHRoZW4gdGhlIAotCQkvL3NhbXBsZSBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCB3ZSBtdXN0IG5vdyBmYWN0b3IgaW4gCi0JCS8vZmxleGlibGUgcHJvamVjdHMgIAotCQkgIAotCQlJUHJvamVjdCBjbGllbnRJUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0ZXN0SW5mby5nZXRDbGllbnRQcm9qZWN0KCkpOwotCSAgICBpZiAoY2xpZW50SVByb2plY3QgIT0gbnVsbCAmJiAhSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KGNsaWVudElQcm9qZWN0KSl7ICAgCi0JCSAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0ZXN0SW5mby5nZXRHZW5lcmF0aW9uUHJvamVjdCgpKTsKLQkJICBJUGF0aCBwYXRoID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQkgIGludCBpbmRleCA9IHRlc3RJbmZvLmdldEpzcEZvbGRlcigpLmxhc3RJbmRleE9mKCIvIik7Ci0JCSAgU3RyaW5nIGpzcCA9IHRlc3RJbmZvLmdldEpzcEZvbGRlcigpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsJCi0JCSAgc2IuYXBwZW5kKCIvIikuYXBwZW5kKHBhdGgudG9TdHJpbmcoKSkuYXBwZW5kKCIvIikuYXBwZW5kKGpzcCk7CSAgCi0JCSAganNwZm9sZGVyID0gc2IudG9TdHJpbmcoKTsKLQkJfSAKLQkgICAgZWxzZQotCQkgIGpzcGZvbGRlciA9IHRlc3RJbmZvLmdldEpzcEZvbGRlcigpOwkKLQkgIAotCSAgCi0JICB9Ci0gIAotICBwcml2YXRlIElTdGF0dXMgbGF1bmNoU2FtcGxlIChJRW52aXJvbm1lbnQgZW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCUlQYXRoIGZEZXN0aW5hdGlvbkZvbGRlclBhdGggPSBuZXcgUGF0aChqc3Bmb2xkZXIpOwotCWZEZXN0aW5hdGlvbkZvbGRlclBhdGggPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLm1ha2VBYnNvbHV0ZSgpOyAgICAKLQkgdHJ5IAotCSB7Ci0JICAgUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQkgfSAKLQkgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGV4YyApIAotCSB7Ci0JICAgLy8gVUlTeW5jaHJvbml6ZXIuc3luY0V4ZWMgc2VlbXMgdG8gaW50ZXJydXB0IHRoZSBVSSB0cmVhZCB3aGVuIHRoZSBhdXRvYnVpbGRlciBpcyBkb25lLiAgTm90IHN1cmUsIHdoeS4KLQkgICAvLyBJJ20gYXNzdW1pbmcgaGVyZSB0aGF0IHRoZSBhdXRvYnVpbGRlciBoYXMgYWN0dWFsbHkgY29tcGxldGVkIGl0cyBzdHVmZi4gCi0JIH0KLQotCVN0YXJ0U2VydmVyQ29tbWFuZCBzZXJ2ZXJDb21tYW5kID0gbmV3IFN0YXJ0U2VydmVyQ29tbWFuZCggdHJ1ZSApOwotCXNlcnZlckNvbW1hbmQuc2V0U2VydmVySW5zdGFuY2VJZCggdGVzdEluZm8uZ2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXIoKS5nZXRJZCgpICk7Ci0Jc2VydmVyQ29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0JCi0Jc3RhdHVzID0gc2VydmVyQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0JCi0JSVByb2plY3Qgc2FtcGxlUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0ZXN0SW5mby5nZXRHZW5lcmF0aW9uUHJvamVjdCgpKTsKLQlTdHJpbmcgICBuZXdQYXRoID0gU2VydmVyVXRpbHMuZ2V0V2ViQ29tcG9uZW50VVJMKHNhbXBsZVByb2plY3QsIHRlc3RJbmZvLmdldENsaWVudFNlcnZlclR5cGVJRCgpLHRlc3RJbmZvLmdldENsaWVudEV4aXN0aW5nU2VydmVyKCkpOwotCWludCBjb3VudCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aChzYW1wbGVQcm9qZWN0KS5zZWdtZW50Q291bnQoKTsKLQkKLQluZXdQYXRoID0gbmV3UGF0aCArICIvIiArIGZEZXN0aW5hdGlvbkZvbGRlclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7Ci0JU3RyaW5nQnVmZmVyIHVybFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIG5ld1BhdGggKyAiLyIgKyBURVNUX0NMSUVOVCApOwotCWlmICh0ZXN0SW5mby5nZXRFbmRwb2ludCgpICE9IG51bGwgJiYgIXRlc3RJbmZvLmdldEVuZHBvaW50KCkuaXNFbXB0eSgpKQotCXsKLQkgIHVybFN0cmluZy5hcHBlbmQoIj9lbmRwb2ludD0iKTsKLQkgIHVybFN0cmluZy5hcHBlbmQodGVzdEluZm8uZ2V0RW5kcG9pbnQoKS5nZXQoMCkudG9TdHJpbmcoKSk7Ci0JfQotCSAgICAKLQl0cnl7Ci0JICAgICAgVVJMIHVybDsKLQkgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZy50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgICAgIElucHV0U3RyZWFtIHJlc3VsdFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIG1ldGhvZFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtICA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGNsaWVudFN0cmVhbSA9IG51bGw7Ci0KLQkgICAgICBmb3IoIGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwOyByZXRyaWVzKysgKQotCSAgICAgIHsKLQkgICAgICAgIHRyeQotCSAgICAgICAgewotCSAgICAgICAgICAvLyBUZXN0IHRoZSBVUkxzCi0gICAgICAgICAgICAKLQkgICAgICAgICAgcmVzdWx0U3RyZWFtID0gbmV3IFVSTChuZXdQYXRoICsgIi8iICsgUkVTVUxUKS5vcGVuU3RyZWFtKCk7Ci0JICAgICAgICAgIG1ldGhvZFN0cmVhbSA9IG5ldyBVUkwobmV3UGF0aCArICIvIiArIE1FVEhPRCkub3BlblN0cmVhbSgpOwotCSAgICAgICAgICBpbnB1dFN0cmVhbSAgPSBuZXcgVVJMKG5ld1BhdGggKyAiLyIgKyBJTlBVVCkub3BlblN0cmVhbSgpOwotCSAgICAgICAgICBjbGllbnRTdHJlYW0gPSBuZXcgVVJMKG5ld1BhdGggKyAiLyIgKyBURVNUX0NMSUVOVCkub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgCi0JICAgICAgICAgIC8vIExvb2tzIGdvb2QsIGV4aXQgbG9vcAotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLQkgICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBpb2UgKQotCSAgICAgICAgewotCSAgICAgICAgICB0cnkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHt9IAkgIAkgICAgICAgICAgCi0JICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiggcmVzdWx0U3RyZWFtICE9IG51bGwgKSByZXN1bHRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgaWYoIG1ldGhvZFN0cmVhbSAhPSBudWxsICkgbWV0aG9kU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgIGlmKCBpbnB1dFN0cmVhbSAhPSBudWxsICkgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgaWYoIGNsaWVudFN0cmVhbSAhPSBudWxsICkgY2xpZW50U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0JICAgICAgfQotCi0JCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCQlJV2ViQnJvd3NlciBicm93c2VyID0gYnJvd3NlclN1cHBvcnQuY3JlYXRlQnJvd3NlcihJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTE9DQVRJT05fQkFSLCBudWxsLCBudWxsLCBudWxsKTsKLQkJCWJyb3dzZXIub3BlblVSTCh1cmwpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JCSB9Y2F0Y2goUGFydEluaXRFeGNlcHRpb24gZXhjKXsKLQkJCWVudi5nZXRMb2coKS5sb2coSUxvZy5FUlJPUiwgNTA0OCwgdGhpcywgImxhdW5jaFNhbXBsZSIsIGV4Yyk7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhleGMuZ2V0TWVzc2FnZSgpLCBleGMpOwotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCSAgICAJcmV0dXJuIHN0YXR1czsKLQkgICAgfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMpewotCSAgICAJZW52LmdldExvZygpLmxvZyhJTG9nLldBUk5JTkcsIDUwNDgsIHRoaXMsICJsYXVuY2hTYW1wbGUiLCBleGMpOwotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyggQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9NQUxGT1JNRURfVVJMLCBleGMgKTsKLQkJCXRyeSB7Ci0JCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLQkJCX0gY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBlKSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfTUFMRk9STUVEX1VSTCwgZSApOwotCQkJfQotCSAgICAJcmV0dXJuIHN0YXR1czsKLQkgICAgfQotICAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9HU1RDV2ViU2VydmljZVRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvR1NUQ1dlYlNlcnZpY2VUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwNjg1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9HU1RDV2ViU2VydmljZVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNjA4ICAgMTQ1NTI5IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5UZXN0SW5mbzsKLQotcHVibGljIGNsYXNzIEdTVENXZWJTZXJ2aWNlVGVzdGVyIGltcGxlbWVudHMgSVdlYlNlcnZpY2VUZXN0ZXIgIHsKLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdlbmVyYXRlKFRlc3RJbmZvIHRlc3RJbmZvKXsKLSAgICBWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JY29tbWFuZHMuYWRkKG5ldyBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kKHRlc3RJbmZvKSk7Ci0JY29tbWFuZHMuYWRkKG5ldyBHU1RDR2VuZXJhdGVDb21tYW5kKHRlc3RJbmZvKSk7Ci0JcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgbGF1bmNoKFRlc3RJbmZvIHRlc3RJbmZvKXsKLQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JaWYgKHRlc3RJbmZvLmdldFJ1blRlc3RDbGllbnQoKSkgewotCQljb21tYW5kcy5hZGQobmV3IEdTVENMYXVuY2hDb21tYW5kKHRlc3RJbmZvKSk7Ci0JfQotICAgIHJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwkKLSAgfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV1NTYW1wbGVGaW5pc2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9XU1NhbXBsZUZpbmlzaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3YmM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9XU1NhbXBsZUZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjQgICAxMjQzNjgga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Qud3NzYW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5JbnB1dEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLk1ldGhvZEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLlJlc3VsdEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLlRlc3RDbGllbnRGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZC5HZW5lcmF0ZVBhZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZC5KYXZhVG9Nb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LkphdmFQcm94eVRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotcHVibGljIGNsYXNzIFdTU2FtcGxlRmluaXNoQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIGltcGxlbWVudHMgSmF2YVByb3h5VGVzdENvbW1hbmQKLXsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlBVVCAgICAgICA9ICJJbnB1dC5qc3AiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBURVNUX0NMSUVOVCA9ICJUZXN0Q2xpZW50LmpzcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU1VMVCAgICAgID0gIlJlc3VsdC5qc3AiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNRVRIT0QgICAgICA9ICJNZXRob2QuanNwIjsKLSAgCi0gIHByaXZhdGUgTW9kZWwgcHJveHlNb2RlbDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIAotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcganNwRm9sZGVyOwotICBwcml2YXRlIGJvb2xlYW4gcnVuQ2xpZW50VGVzdDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdDsKLSAgcHJpdmF0ZSBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kczsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJveHlCZWFuOwotICBwcml2YXRlIFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZDsKLSAgcHJpdmF0ZSBMaXN0IGVuZHBvaW50czsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgSmF2YUJlYW5Ub1NhbXBsZUFjdGl2ZVRhc2sgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGxhYmVsIGFuZCBkZXNjcmlwdGlvbi4KLSAgKi8KLSAgcHVibGljIFdTU2FtcGxlRmluaXNoQ29tbWFuZCAoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIAotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIC8vc2V0dGVycyBhbmQgZ2V0dGVycyB0byBiZSByZW1vdmVkCi0gIAlDb3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZCBjb3B5ID0gbmV3IENvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kKCk7ICAgIAotICAJY29weS5zZXRTYW1wbGVQcm9qZWN0KHNhbXBsZVByb2plY3QpOwotICAgIGNvcHkuc2V0RW52aXJvbm1lbnQoIGVudiApOwotICAJc3RhdHVzID0gY29weS5leGVjdXRlKCBtb25pdG9yLCBudWxsICk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBzdGF0dXMgPSBjcmVhdGVNb2RlbChlbnYsIG1vbml0b3IgKTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHN0YXR1cyA9IGdlbmVyYXRlUGFnZXMoZW52LCBtb25pdG9yICk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICAvL2lmICghaXNTdWNjZXNzZnVsKCkpIHJldHVybjsKLSAgICBzdGF0dXMgPSBsYXVuY2hTYW1wbGUoZW52LCBtb25pdG9yKTsKLSAgICByZXR1cm4gc3RhdHVzOyAgIAotICB9Ci0KLSAgIAotICAvKioKLSAgKiBHZW5lcmF0ZSB0aGUgZm91ciBqc3BzIHRoYXQgbWFrZSB1cCB0aGlzCi0gICogc2FtcGxlIGFwcC4KLSAgKi8KLSAgcHJvdGVjdGVkIElTdGF0dXMgZ2VuZXJhdGVQYWdlcyhJRW52aXJvbm1lbnQgZW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICB7Ci0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgSVBhdGggZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IG5ldyBQYXRoKGpzcEZvbGRlcik7Ci0gICAgZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGgubWFrZUFic29sdXRlKCk7ICAgIAotICAgIElXb3Jrc3BhY2VSb290IGZXb3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgSVBhdGggcGF0aFRlc3QgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChURVNUX0NMSUVOVCk7Ci0gICAgSUZpbGUgZmlsZVRlc3QgPSBmV29ya3NwYWNlLmdldEZpbGUocGF0aFRlc3QpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjVGVzdCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICBuZXcgVGVzdENsaWVudEZpbGVHZW5lcmF0b3IoSU5QVVQsTUVUSE9ELFJFU1VMVCksZmlsZVRlc3QpOwotICAgIC8vZ3BjVGVzdC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgZ3BjVGVzdC5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0gICAgc3RhdHVzID0gZ3BjVGVzdC5leGVjdXRlKCBtb25pdG9yLCBudWxsICk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgCi0KLSAgICAvL2lucHV0IGNvZGVnZW4KLSAgICBJUGF0aCBwYXRoSW5wdXQgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChJTlBVVCk7Ci0gICAgSUZpbGUgZmlsZUlucHV0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhJbnB1dCk7Ci0gICAgSW5wdXRGaWxlR2VuZXJhdG9yIGlucHV0R2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUdlbmVyYXRvcihSRVNVTFQpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjSW5wdXQgPSBuZXcgR2VuZXJhdGVQYWdlQ29tbWFuZChFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBwcm94eU1vZGVsLAotICAgICAgaW5wdXRHZW5lcmF0b3IsZmlsZUlucHV0KTsKLSAgICAvL2dwY0lucHV0LnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICBncGNJbnB1dC5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0gICAgc3RhdHVzID0gZ3BjSW5wdXQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgIAlyZXR1cm4gc3RhdHVzOwotCi0gICAgLy9tZXRob2QgY29kZWdlbgotICAgIElQYXRoIHBhdGhNZXRob2QgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChNRVRIT0QpOwotICAgIElGaWxlIGZpbGVNZXRob2QgPSBmV29ya3NwYWNlLmdldEZpbGUocGF0aE1ldGhvZCk7Ci0gICAgTWV0aG9kRmlsZUdlbmVyYXRvciBtZXRob2RHZW5lcmF0b3IgPSBuZXcgTWV0aG9kRmlsZUdlbmVyYXRvcihJTlBVVCk7Ci0gICAgbWV0aG9kR2VuZXJhdG9yLnNldENsaWVudEZvbGRlclBhdGgoanNwRm9sZGVyKTsKLSAgICBHZW5lcmF0ZVBhZ2VDb21tYW5kIGdwY01ldGhvZCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICBtZXRob2RHZW5lcmF0b3IsZmlsZU1ldGhvZCk7Ci0gICAgLy9ncGNNZXRob2Quc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgIGdwY01ldGhvZC5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0gICAgc3RhdHVzID0gZ3BjTWV0aG9kLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICAJcmV0dXJuIHN0YXR1czsgICAgCi0KLQotICAgIC8vcmVzdWx0IGNvZGVnZW4KLSAgICBJUGF0aCBwYXRoUmVzdWx0ID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5hcHBlbmQoUkVTVUxUKTsKLSAgICBJRmlsZSBmaWxlUmVzdWx0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhSZXN1bHQpOwotICAgIFJlc3VsdEZpbGVHZW5lcmF0b3IgcmZnID0gbmV3IFJlc3VsdEZpbGVHZW5lcmF0b3IoKTsKLSAgICByZmcuc2V0Q2xpZW50Rm9sZGVyUGF0aChqc3BGb2xkZXIpOwotICAgIHJmZy5zZXRTZXRFbmRwb2ludE1ldGhvZChzZXRFbmRwb2ludE1ldGhvZCk7Ci0gICAgR2VuZXJhdGVQYWdlQ29tbWFuZCBncGNSZXN1bHQgPSBuZXcgR2VuZXJhdGVQYWdlQ29tbWFuZChFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBwcm94eU1vZGVsLAotICAgICAgcmZnLGZpbGVSZXN1bHQpOwotICAgIC8vZ3BjUmVzdWx0LnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICBncGNSZXN1bHQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotICAgIHN0YXR1cyA9IGdwY1Jlc3VsdC5leGVjdXRlKCBtb25pdG9yLCBudWxsICk7Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIElTdGF0dXMgbGF1bmNoU2FtcGxlIChJRW52aXJvbm1lbnQgZW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB7Ci0KLSAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBpZiAoIXJ1bkNsaWVudFRlc3QpIHJldHVybiBzdGF0dXM7Ci0gICAgCi0KLSAgICBJUGF0aCBmRGVzdGluYXRpb25Gb2xkZXJQYXRoID0gbmV3IFBhdGgoanNwRm9sZGVyKTsKLSAgICBmRGVzdGluYXRpb25Gb2xkZXJQYXRoID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5tYWtlQWJzb2x1dGUoKTsgICAgCi0KLSAgICBTdGFydFByb2plY3RDb21tYW5kIHNwYyA9IG5ldyBTdGFydFByb2plY3RDb21tYW5kKGZhbHNlICk7Ci0gICAgc3BjLnNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoc2FtcGxlU2VydmVyVHlwZUlEKTsKLSAgICBzcGMuc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpOwotICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHNhbXBsZVByb2plY3QpOwotICAgIHNwYy5zZXRTYW1wbGVQcm9qZWN0KHByb2plY3QpOwotICAgIHNwYy5zZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKHRydWUpOwotICAgIHNwYy5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0gICAgCi0gICAgc3RhdHVzID0gc3BjLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIAotICAgIElQYXRoIG5ld1BhdGggPSBuZXcgUGF0aChSZXNvdXJjZVV0aWxzLmdldFdlYlByb2plY3RVUkwoUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YoZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCksc2FtcGxlU2VydmVyVHlwZUlELHNhbXBsZUV4aXN0aW5nU2VydmVyKSk7Ci0gICAgbmV3UGF0aCA9IG5ld1BhdGguYXBwZW5kKGZEZXN0aW5hdGlvbkZvbGRlclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygyKS5tYWtlQWJzb2x1dGUoKSk7Ci0gICAgU3RyaW5nQnVmZmVyIHVybFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIobmV3UGF0aC5hcHBlbmQoVEVTVF9DTElFTlQpLnRvU3RyaW5nKCkpOwotICAgIGlmIChlbmRwb2ludHMgIT0gbnVsbCAmJiAhZW5kcG9pbnRzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICB1cmxTdHJpbmcuYXBwZW5kKCI/ZW5kcG9pbnQ9Iik7Ci0gICAgICB1cmxTdHJpbmcuYXBwZW5kKGVuZHBvaW50cy5nZXQoMCkudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHRyeXsKLSAgICAgIFVSTCB1cmw7Ci0gICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZy50b1N0cmluZygpKTsKLQotICAgICAgZm9yKCBpbnQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDsgcmV0cmllcysrICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBUZXN0IHRoZSBVUkxzCi0gICAgICAgICAgKG5ldyBVUkwobmV3UGF0aC5hcHBlbmQoUkVTVUxUKS50b1N0cmluZygpKSkub3BlblN0cmVhbSgpOwotICAgICAgICAgIChuZXcgVVJMKG5ld1BhdGguYXBwZW5kKE1FVEhPRCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChJTlBVVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChURVNUX0NMSUVOVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAvLyBMb29rcyBnb29kLCBleGl0IGxvb3AKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gaW9lICkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fSAJICAJICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0KLQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQlJV2ViQnJvd3NlciBicm93c2VyID0gYnJvd3NlclN1cHBvcnQuY3JlYXRlQnJvd3NlcihJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTE9DQVRJT05fQkFSIHwgSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0Lk5BVklHQVRJT05fQkFSLCBudWxsLCBudWxsLCBudWxsKTsKLQkJYnJvd3Nlci5vcGVuVVJMKHVybCk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotCSB9Y2F0Y2goUGFydEluaXRFeGNlcHRpb24gZXhjKXsKLQkJLy9UT0RPOiBjaGFuZ2UgZXJyb3IgbWVzc2FnZQotCQllbnYuZ2V0TG9nKCkubG9nKElMb2cuV0FSTklORywgNTA0OCwgdGhpcywgImxhdW5jaFNhbXBsZSIsIGV4Yyk7Ci0JCXN0YXR1cyA9IFN0YXR1c1V0aWxzLndhcm5pbmdTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfTUFMRk9STUVEX1VSTCwgZXhjICk7Ci0JCXRyeSB7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfTUFMRk9STUVEX1VSTCwgZSApOwotCQl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMpewotICAgIAllbnYuZ2V0TG9nKCkubG9nKElMb2cuV0FSTklORywgNTA0OCwgdGhpcywgImxhdW5jaFNhbXBsZSIsIGV4Yyk7Ci0JCXN0YXR1cyA9IFN0YXR1c1V0aWxzLndhcm5pbmdTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfTUFMRk9STUVEX1VSTCwgZXhjICk7Ci0JCXRyeSB7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfTUFMRk9STUVEX1VSTCwgZSApOwotCQl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgCi0KLSAgcHJvdGVjdGVkIElTdGF0dXMgY3JlYXRlTW9kZWwoSUVudmlyb25tZW50IGVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgewotCi0gIAkvL2NyZWF0ZSB0aGUgbW9kZWwgZnJvbSB0aGUgcmVzb3VyY2UKLSAgICBKYXZhVG9Nb2RlbENvbW1hbmQganRtYyA9IG5ldyBKYXZhVG9Nb2RlbENvbW1hbmQoKTsKLSAgICBqdG1jLnNldE1ldGhvZHMobWV0aG9kcyk7Ci0gICAganRtYy5zZXRDbGllbnRQcm9qZWN0KGNsaWVudFByb2plY3QpOwotICAgIGp0bWMuc2V0UHJveHlCZWFuKHByb3h5QmVhbik7Ci0gICAganRtYy5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0gICAgLy9qdG1jLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IGp0bWMuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLQotICAgIHByb3h5TW9kZWwgPSBqdG1jLmdldEphdmFEYXRhTW9kZWwoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgCXRoaXMuc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gIAl0aGlzLnNhbXBsZUV4aXN0aW5nU2VydmVyID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKQotICB7Ci0gICAgdGhpcy5qc3BGb2xkZXIgPSBqc3BGb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoYm9vbGVhbiBydW5DbGllbnRUZXN0KQotICB7Ci0gIAl0aGlzLnJ1bkNsaWVudFRlc3QgPSBydW5DbGllbnRUZXN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KFN0cmluZyBzYW1wbGVQcm9qZWN0KQotICB7Ci0gIAl0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcykKLSAgewotICAJdGhpcy5tZXRob2RzID0gbWV0aG9kczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2V0RW5kcG9pbnRNZXRob2QgVGhlIHNldEVuZHBvaW50TWV0aG9kIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldEVuZHBvaW50TWV0aG9kKFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZCkKLSAgewotICAgIHRoaXMuc2V0RW5kcG9pbnRNZXRob2QgPSBzZXRFbmRwb2ludE1ldGhvZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoTGlzdCBlbmRwb2ludHMpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWY2OGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL1dlYlNlcnZpY2VXU1NhbXBsZUV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gICAKLSAgCi0gIHB1YmxpYyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBnZXRGaW5pc2hDb21tYW5kKCkKLSAgewotICAJcmV0dXJuIG5ldyBXU1NhbXBsZUZpbmlzaENvbW1hbmQoKTsKLSAgfQotICAgIAotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5Yjc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnVkZGkuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgc3RhdGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpIHsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKSB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXZhdGVVRERJUmVnaXN0cnlUeXBlIik7Ci0KLSAgICB0cnkgewotICAgICAgT2JqZWN0IGNvbmZpZ0VsZW1lbnQgPSAoKGNvbmZpZy5sZW5ndGggPiAwKSA/IGNvbmZpZ1swXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpIDogbnVsbCk7Ci0gICAgICBpZihjb25maWdFbGVtZW50ICE9IG51bGwgJiYgY29uZmlnRWxlbWVudCBpbnN0YW5jZW9mIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKSAKLSAgICAgICAgcmV0dXJuIChQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSljb25maWdFbGVtZW50OyAKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9QdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3MDM4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9QdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICBwcml2YXRlIHN0YXRpYyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotICBwcml2YXRlIFZlY3RvciB0eXBlc187Ci0gIHByaXZhdGUgVmVjdG9yIGNvbmZpZ0VsZW1lbnRzXzsKLQotICBwcml2YXRlIFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpIHsKLSAgICB0eXBlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgY29uZmlnRWxlbWVudHNfID0gbmV3IFZlY3RvcigpOwotCi0gICAgaW5pdCgpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdWJsaWNVRERJUmVnaXN0cnlUeXBlIik7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKykgewotICAgICAgdHJ5IHsKLSAgICAgICAgT2JqZWN0IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQotICAgICAgICBpZiggY29uZmlnRWxlbWVudCBpbnN0YW5jZW9mIFB1YmxpY1VERElSZWdpc3RyeVR5cGUpICB7Ci0gICAgICAgICAgdHlwZXNfLmFkZChjb25maWdFbGVtZW50KTsKLSAgICAgICAgICBjb25maWdFbGVtZW50c18uYWRkKGNvbmZpZ1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHt9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeVR5cGVbXSBnZXRBbGxQdWJsaWNVRERJUmVnaXN0cnlUeXBlcygpIHsKLSAgICBQdWJsaWNVRERJUmVnaXN0cnlUeXBlW10gdHlwZXMgPSBuZXcgUHVibGljVURESVJlZ2lzdHJ5VHlwZVt0eXBlc18uc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzXy5zaXplKCk7IGkrKykgewotICAgICAgdHlwZXNbaV0gPSAoUHVibGljVURESVJlZ2lzdHJ5VHlwZSl0eXBlc18uZWxlbWVudEF0KGkpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLQotICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5VHlwZSBnZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlQnlJRChTdHJpbmcgaWQpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5zaXplKCk7IGkrKykgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGMgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KWNvbmZpZ0VsZW1lbnRzXy5lbGVtZW50QXQoaSk7Ci0gICAgICBpZiAoYy5nZXRBdHRyaWJ1dGUoImlkIikuZXF1YWxzKGlkKSkKLSAgICAgICAgcmV0dXJuIChQdWJsaWNVRERJUmVnaXN0cnlUeXBlKXR5cGVzXy5lbGVtZW50QXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlSURCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzXy5zaXplKCk7IGkrKykgewotICAgICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZSB0eXBlID0gKFB1YmxpY1VERElSZWdpc3RyeVR5cGUpdHlwZXNfLmVsZW1lbnRBdChpKTsKLSAgICAgIGlmICh0eXBlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgIHJldHVybiAoKElDb25maWd1cmF0aW9uRWxlbWVudCljb25maWdFbGVtZW50c18uZWxlbWVudEF0KGkpKS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1J1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1J1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2ZjU5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9SdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIxICAgMTE5MTExIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjAzMjcgICAxMzE2MDUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDcxNyAgIDE1MDU3NyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1hawotICogMjAwNjA3MjYgICAxNTA4NjUgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA2MDcyNiAgIDE1MDg2NyBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDYwNzI4CSAgMTUxNzIzIG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbgotICogMjAwNjA4MDIgICAxNDg3MzEgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuUnVudGltZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLSAgcHJpdmF0ZSBTaGVsbCB0aGlzU2hlbGw7Ci0gIHByaXZhdGUgR3JvdXAgdmlld1NlbGVjdGlvbkdyb3VwXzsKLSAgcHJpdmF0ZSBUZXh0IG1lc3NhZ2VCYW5uZXJfOwotICBwcml2YXRlIENvbXBvc2l0ZSBwcmltYXJ5R3JvdXBfOwotICBwcml2YXRlIEdyb3VwIHJ1bnRpbWVzR3JvdXBfOwotICBwcml2YXRlIEdyb3VwIHNlcnZlcnNHcm91cF87Ci0gIHByaXZhdGUgVHJlZSBydW50aW1lc0xpc3RfOwotICBwcml2YXRlIFRyZWUgc2VydmVyTGlzdF87Ci0gIHByaXZhdGUgQnV0dG9uIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiB2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiB2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXzsKLSAgcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyXzsKLSAgcHJpdmF0ZSBJbWFnZSBzZXJ2ZXJUeXBlc0ljb247Ci0gIHByaXZhdGUgSW1hZ2UgZXhpc3RpbmdTZXJ2ZXJzSWNvbjsKLQotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDAxIGZvciB0aGUgc2VsZWN0aW9uIG9mIHJ1bnRpbWUsIHNlcnZlciBhbmQgcHJvamVjdCBjb21iaW5hdGlvbgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0RJQUxPRyA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwMSI7Ci0gIC8qIENPTlRFWFRfSUQgUFdSUzAwMDIgZm9yIHRoZSBydW50aW1lIHNlbGVjdGlvbiBvbiBpbiB0aGUgZGFpbG9nICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19MSVNUX1JVTlRJTUVTID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDAyIjsKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwMyBmb3IgdGhlIHNlcnZlciBzZWxlY3Rpb24gaW4gdGhlIGRpYWxvZyAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfTElTVF9TRVJWRVJTID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDAzIjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwNCBmb3IgdGhlIEVKQiBQcm9qZWN0IGNvbWJvIGJveCBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICAvLyAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0VKQl9QUk9KRUNUID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQKLSAgLy8gKyAiLlBXUlMwMDA0IjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwNSBmb3IgdGhlIHJ1bnRpbWUgdmlldyByYWRpbyBidXR0b24gb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGRpYWxvZwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX1JBRElPX1JVTlRJTUUgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDUiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA2IGZvciB0aGUgc2VydmVyIHZpZXcgcmFkaW8gYnV0dG9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBkaWFsb2cKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19SQURJT19TRVJWRVIgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDYiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA3IGZvciB0aGUgZXhwbG9yZSB2aWV3IHJhZGlvIGJ1dHRvbiBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfUkFESU9fRVhQTE9SRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwNyI7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZlckxhYmVsc187Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGV4aXN0aW5nU2VydmVyc1RhYmxlXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFNlcnZlcl87Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRSdW50aW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZUlkXzsKLQotICBwcml2YXRlIFJ1bnRpbWVEZXNjcmlwdG9yIHNlbGVjdGVkUnVudGltZV87Ci0KLSAgcHJpdmF0ZSBJU2VydmVyIHNlbGVjdGVkU2VydmVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRTZXJ2ZXJMYWJlbF87Ci0gIHByaXZhdGUgU3RyaW5nIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzRXhpc3RpbmdTZXJ2ZXJfOwotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVPbl8gPSBmYWxzZTsKLSAgcHJpdmF0ZSBieXRlIHNlbGVjdGlvbk1vZGVfOwotICBwcml2YXRlIGZpbmFsIGJ5dGUgTU9ERV9TRVJWSUNFID0gKGJ5dGUpIDA7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFNFUlZFUl9UWVBFU19JQ09OID0gImljb25zL3NlcnZlcnMvc2VydmVyc19vYmouZ2lmIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRVhJU1RJTkdfU0VSVkVSU19JQ09OID0gImljb25zL3NlcnZlcnMvZXhpc3Rpbmdfc2VydmVyX29iai5naWYiOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlEXzsKLQotICBwcml2YXRlIGJvb2xlYW4gc2VsZWN0U2VydmVyRmlyc3RfID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgYnl0ZSBtb2RlLCBUeXBlUnVudGltZVNlcnZlciBpZHMsIFN0cmluZyBqMmVlVmVyc2lvbikgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgICBzZWxlY3Rpb25Nb2RlXyA9IG1vZGU7Ci0gICAgdHlwZUlkXyA9IGlkcy5nZXRUeXBlSWQoKTsKLSAgICBkZWZhdWx0UnVudGltZV8gPSBpZHMuZ2V0UnVudGltZUlkKCk7Ci0gICAgZGVmYXVsdFNlcnZlcl8gPSBpZHMuZ2V0U2VydmVySWQoKTsKLSAgICBzZXJ2ZXJJbnN0YW5jZUlEXyA9IGlkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gICAgc2V0SXNFeGlzdGluZ1NlcnZlcihpZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGwpOwotICAgIHNlcnZlckxhYmVsc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGxhYmVsUHJvdmlkZXJfID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0U2VydmVyRmlyc3QoYm9vbGVhbiBzZWxlY3RTZXJ2ZXJGaXJzdCkgewotCSAgc2VsZWN0U2VydmVyRmlyc3RfID0gc2VsZWN0U2VydmVyRmlyc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpCi0gIHsKLQkgIHJldHVybiB0aGlzLmdldFNoZWxsKCkuY29tcHV0ZVNpemUoNTUwLCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKSB7Ci0gICAgVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0KLSAgICBpZHMuc2V0VHlwZUlkKHR5cGVJZF8pOwotICAgIGlmIChzZWxlY3RlZFJ1bnRpbWVfICE9IG51bGwpCi0gICAgICBpZHMuc2V0UnVudGltZUlkKHNlbGVjdGVkUnVudGltZV8uZ2V0SWQoKSk7Ci0gICAgCi0gICAgaWYoIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyA9PSBudWxsICkKLSAgICB7Ci0gICAgICBpZHMuc2V0U2VydmVySWQoIGRlZmF1bHRTZXJ2ZXJfICk7Ci0gICAgICBpZHMuc2V0U2VydmVySW5zdGFuY2VJZCggc2VydmVySW5zdGFuY2VJRF8gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlkcy5zZXRTZXJ2ZXJJZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8pOwotCi0gICAgICBpZiAoaXNFeGlzdGluZ1NlcnZlcl8gJiYgc2VsZWN0ZWRTZXJ2ZXJfICE9IG51bGwpIAotICAgICAgewotICAgICAgICBpZHMuc2V0U2VydmVySW5zdGFuY2VJZChzZWxlY3RlZFNlcnZlcl8uZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBpZHM7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZ2V0SXNFeGlzdGluZ1NlcnZlcigpIHsKLSAgICByZXR1cm4gaXNFeGlzdGluZ1NlcnZlcl87Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0SXNFeGlzdGluZ1NlcnZlcihib29sZWFuIGlzRXhpc3RpbmcpIHsKLSAgICBpc0V4aXN0aW5nU2VydmVyXyA9IGlzRXhpc3Rpbmc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOyAgCi0gICAgY29tcC5wYWNrKCk7IAotICAgIAotICAgIGlmIChzZWxlY3RTZXJ2ZXJGaXJzdF8pIHsKLSAgICAJdmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXy5zZXRTZWxlY3Rpb24odHJ1ZSk7ICAKLSAgICAJaGFuZGxlU2VydmVyVmlld1NlbGVjdGlvbkV2ZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAJdmlld1NlbGVjdGlvbkJ5UnVudGltZUJ1dHRvbl8uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAKLSAgICByZXR1cm4gY29tcDsKLSAgfSAKLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRTaGVsbFN0eWxlKGludCBuZXdTaGVsbFN0eWxlKQotICB7Ci0gICAgc3VwZXIuc2V0U2hlbGxTdHlsZSggbmV3U2hlbGxTdHlsZSB8IFNXVC5SRVNJWkUgKTsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgdmFsaWRhdGVPbl8gPSBmYWxzZTsKLSAgICB0aGlzU2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICBpZiAodGhpc1NoZWxsID09IG51bGwpIHsKLSAgICAgIHRoaXNTaGVsbCA9IGNyZWF0ZVNoZWxsKCk7Ci0gICAgfQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZExheW91dCBnbDsKLSAgICBHcmlkRGF0YSBnZDsKLSAgICAvLyBXaW5kb3cgdGl0bGUKLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKQotICAgICAgdGhpc1NoZWxsLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfVElUTEVfV1NfUlVOVElNRV9TRUxFQ1RJT04pOwotICAgIGVsc2UKLSAgICAgIHRoaXNTaGVsbC5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTik7Ci0gICAgCi0gICAgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAgIAotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzU2hlbGwsIElORk9QT1BfUFdSU19ESUFMT0cpOwotICAgIC8vIERpYWxvZyBkZXNjcmlwdGlvbiBiYW5uZXIKLSAgICBtZXNzYWdlQmFubmVyXyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSB8IFNXVC5XUkFQKTsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT04gKyAiXG4iICsgIiAgICAgICIpOyAvLyByZXNlcnZlcyBhIHNlY29uZCBsaW5lIGZvciBtZXNzYWdlIGRpc3BsYXkKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1dTX1JVTlRJTUVfU0VMRUNUSU9OKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIG1lc3NhZ2VCYW5uZXJfLnNldExheW91dERhdGEoZ2QpOwotICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gICAgLy8gU2VsZWN0aW9uCi0gICAgdGhpc1NoZWxsLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXUlNfUEFHRSk7Ci0gICAgdmlld1NlbGVjdGlvbkdyb3VwXyA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgdmlld1NlbGVjdGlvbkdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgdmlld1NlbGVjdGlvbkdyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKQotICAgICAgdmlld1NlbGVjdGlvbkdyb3VwXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TRUxFQ1RJT05fVklFV19USVRMRSk7Ci0gICAgZWxzZQotICAgICAgdmlld1NlbGVjdGlvbkdyb3VwXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9DTElFTlRfU0VMRUNUSU9OX1ZJRVdfVElUTEUpOwotICAgIHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8gPSBuZXcgQnV0dG9uKHZpZXdTZWxlY3Rpb25Hcm91cF8sIFNXVC5SQURJTyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TRUxFQ1RJT05fVklFV19TRVJWRVIpOwotICAgIHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QV1JTX1JBRElPX1NFUlZFUik7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8sIElORk9QT1BfUFdSU19SQURJT19TRVJWRVIpOwotICAgIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fID0gbmV3IEJ1dHRvbih2aWV3U2VsZWN0aW9uR3JvdXBfLCBTV1QuUkFESU8pOwotICAgIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1NFTEVDVElPTl9WSUVXX1JVTlRJTUUpOwotICAgIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXUlNfUkFESU9fUlVOVElNRSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fLCBJTkZPUE9QX1BXUlNfUkFESU9fUlVOVElNRSk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8gPSBuZXcgQnV0dG9uKHZpZXdTZWxlY3Rpb25Hcm91cF8sIFNXVC5SQURJTyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8uc2V0VGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU0VMRUNUSU9OX1ZJRVdfRVhQTE9SRSk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdSU19SQURJT19FWFBMT1JFKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8sIElORk9QT1BfUFdSU19SQURJT19FWFBMT1JFKTsKLSAgICBwcmltYXJ5R3JvdXBfID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIHJ1bnRpbWVzR3JvdXBfID0gbmV3IEdyb3VwKHByaW1hcnlHcm91cF8sIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgcnVudGltZXNHcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHJ1bnRpbWVzR3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIHJ1bnRpbWVzR3JvdXBfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1JVTlRJTUVTX0xJU1QpOwotICAgIHJ1bnRpbWVzTGlzdF8gPSBuZXcgVHJlZShydW50aW1lc0dyb3VwXywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcnVudGltZXNMaXN0Xy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBydW50aW1lc0xpc3RfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHJ1bnRpbWVzTGlzdF8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdSU19MSVNUX1JVTlRJTUVTKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocnVudGltZXNMaXN0XywgSU5GT1BPUF9QV1JTX0xJU1RfUlVOVElNRVMpOwotICAgIC8vICBTZXJ2ZXIgbGFiZWxzIGNvbnRyb2wKLSAgICBzZXJ2ZXJzR3JvdXBfID0gbmV3IEdyb3VwKHByaW1hcnlHcm91cF8sIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgc2VydmVyc0dyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgc2VydmVyc0dyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBzZXJ2ZXJzR3JvdXBfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1NFUlZFUlNfTElTVCk7Ci0gICAgc2VydmVyTGlzdF8gPSBuZXcgVHJlZShzZXJ2ZXJzR3JvdXBfLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgc2VydmVyTGlzdF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotICAgIHNlcnZlckxpc3RfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHNlcnZlckxpc3RfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXUlNfTElTVF9TRVJWRVJTKTsKLSAgICBTZXJ2ZXJzTGlzdCBzZXJ2ZXJMaXN0ID0gbmV3IFNlcnZlcnNMaXN0KCk7Ci0gICAgc2VydmVyTGlzdC5zZXRTZXJ2ZXJUcmVlSXRlbXMoc2VydmVyTGlzdF8pOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChzZXJ2ZXJMaXN0XywgSU5GT1BPUF9QV1JTX0xJU1RfU0VSVkVSUyk7Ci0gICAgc2V0UnVudGltZXNHcm91cCgpOwotICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotICAgIHZhbGlkYXRlT25fID0gdHJ1ZTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uKCkgewotCi0gICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkgewotICAgICAgaWYgKHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyAhPSBudWxsICYmIHNlbGVjdGVkUnVudGltZV8gIT0gbnVsbCkgCi0gICAgICB7Ci0KLSAgICAgICAgaWYgKFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmlzU2VydmVyUnVudGltZVR5cGVTdXBwb3J0ZWQoc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfLCBzZWxlY3RlZFJ1bnRpbWVfLmdldElkKCksCi0gICAgICAgICAgICB0eXBlSWRfKSkKLSAgICAgICAgewotICAgICAgICAgIHNldE9LU3RhdHVzTWVzc2FnZSgpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzZXJ2ZXJMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZlckxhYmVsQnlJZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8pOwotICAgICAgICAgIFN0cmluZyBydW50aW1lTGFiZWwgPSBzZWxlY3RlZFJ1bnRpbWVfLmdldExhYmVsKCk7Ci0gICAgICAgICAgc2V0RVJST1JTdGF0dXNNZXNzYWdlKE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUywgbmV3IFN0cmluZ1tdIHsgc2VydmVyTGFiZWwsCi0gICAgICAgICAgICAgIHJ1bnRpbWVMYWJlbCB9KSk7Ci0gICAgICAgICAgLy8gRm91bmQgYW4gZXJyb3IgLSBzbyByZXR1cm4uCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICBpZiAoc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfICE9IG51bGwgJiYgc2VsZWN0ZWRSdW50aW1lXyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSB0eXBlSWRfOwotICAgICAgICBpZiAoV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuaXNTZXJ2ZXJDbGllbnRSdW50aW1lVHlwZVN1cHBvcnRlZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8sIHNlbGVjdGVkUnVudGltZV8KLSAgICAgICAgICAgIC5nZXRJZCgpLCBjbGllbnRJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRPS1N0YXR1c01lc3NhZ2UoKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2ZXJMYWJlbEJ5SWQoc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfKTsKLSAgICAgICAgICBTdHJpbmcgcnVudGltZUxhYmVsID0gc2VsZWN0ZWRSdW50aW1lXy5nZXRMYWJlbCgpOwotICAgICAgICAgIHNldEVSUk9SU3RhdHVzTWVzc2FnZShOTFMuYmluZChDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlMsIG5ldyBTdHJpbmdbXSB7IHNlcnZlckxhYmVsLAotICAgICAgICAgICAgICBydW50aW1lTGFiZWwgfSkpOwotICAgICAgICAgIAotICAgICAgICAgIC8vIEZvdW5kIGFuIGVycm9yIC0gc28gcmV0dXJuLgotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBEaXNhYmxlIE9LIGJ1dHRvbiBpZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gaXMgaW52YWxpZAotICAgIFRyZWVJdGVtW10gcnVudGltZVNlbCA9IHJ1bnRpbWVzTGlzdF8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHJ1bnRpbWVTZWwgPT0gbnVsbCB8fCBydW50aW1lU2VsLmxlbmd0aCA8PSAwIHx8IHJ1bnRpbWVTZWxbMF0uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgIGRpc2FibGVPS0J1dHRvbigpOwotICAgIH0KLSAgICAvLyBEaXNhYmxlIE9LIGJ1dHRvbiBpZiBzZXJ2ZXIgc2VsZWN0aW9uIGlzIGludmFsaWQKLSAgICBUcmVlSXRlbVtdIHNlcnZlclNlbCA9IHNlcnZlckxpc3RfLmdldFNlbGVjdGlvbigpOwotICAgIFN0cmluZyBjdXJyZW50U2VsZWN0aW9uID0gKHNlcnZlclNlbCAhPSBudWxsICYmIHNlcnZlclNlbC5sZW5ndGggPiAwKSA/IHNlcnZlclNlbFswXS5nZXRUZXh0KCkgOiAiIjsKLSAgICBpZiAoc2VydmVyU2VsID09IG51bGwgfHwgY3VycmVudFNlbGVjdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICBkaXNhYmxlT0tCdXR0b24oKTsKLSAgICB9Ci0gICAgaWYgKCFzZXJ2ZXJMYWJlbHNfLmNvbnRhaW5zS2V5KGN1cnJlbnRTZWxlY3Rpb24pIHx8ICFleGlzdGluZ1NlcnZlcnNUYWJsZV8uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikpIHsKLSAgICAgIGRpc2FibGVPS0J1dHRvbigpOwotICAgICAgc2V0T0tTdGF0dXNNZXNzYWdlKCk7Ci0gICAgfQotICAgIC8vIERpc2FibGUgT0sgYnV0dG9uIGlmIGNhdGVnb3J5IGlzIHNlbGVjdGVkIHJhdGhlciB0aGFuIGEgc2VydmVyCi0gICAgaWYgKHNlcnZlclNlbC5sZW5ndGggPiAwICYmIHNlcnZlclNlbFswXS5nZXRJdGVtQ291bnQoKSE9MCkgewotICAgIAlkaXNhYmxlT0tCdXR0b24oKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCWVuYWJsZU9LQnV0dG9uKCk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldE9LU3RhdHVzTWVzc2FnZSgpIHsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT04pOwotICAgIG1lc3NhZ2VCYW5uZXJfLnNldEZvcmVncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0gICAgZW5hYmxlT0tCdXR0b24oKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRFUlJPUlN0YXR1c01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRUZXh0KG1lc3NhZ2UpOwotICAgIG1lc3NhZ2VCYW5uZXJfLnNldEZvcmVncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotICAgIGRpc2FibGVPS0J1dHRvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRpc2FibGVPS0J1dHRvbigpIHsKLSAgICBpZiAoZ2V0QnV0dG9uKDApICE9IG51bGwpCi0gICAgICBnZXRCdXR0b24oMCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlT0tCdXR0b24oKSB7Ci0gICAgaWYgKGdldEJ1dHRvbigwKSAhPSBudWxsKQotICAgICAgZ2V0QnV0dG9uKDApLnNldEVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JaWYgKGxhYmVsUHJvdmlkZXJfIT1udWxsKQotCSAgICBsYWJlbFByb3ZpZGVyXy5kaXNwb3NlKCk7Ci0JaWYgKGV4aXN0aW5nU2VydmVyc0ljb24hPW51bGwpCi0JCWV4aXN0aW5nU2VydmVyc0ljb24uZGlzcG9zZSgpOwotCWlmIChzZXJ2ZXJUeXBlc0ljb24hPW51bGwpCi0JCXNlcnZlclR5cGVzSWNvbi5kaXNwb3NlKCk7Ci0Jc2V0UmV0dXJuQ29kZShPSyk7Ci0gICAgY2xvc2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JaWYgKGxhYmVsUHJvdmlkZXJfIT1udWxsKQotCQlsYWJlbFByb3ZpZGVyXy5kaXNwb3NlKCk7Ci0JaWYgKGV4aXN0aW5nU2VydmVyc0ljb24hPW51bGwpCi0JCWV4aXN0aW5nU2VydmVyc0ljb24uZGlzcG9zZSgpOwotCWlmIChzZXJ2ZXJUeXBlc0ljb24hPW51bGwpCi0JCXNlcnZlclR5cGVzSWNvbi5kaXNwb3NlKCk7CQotCXNldFJldHVybkNvZGUoQ0FOQ0VMKTsKLQljbG9zZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYW4gZXZlbnQgb2NjdXJzIG9uIHRoZSBwYWdlLiBIYW5kbGVzIHRoZSBldmVudCBhbmQgcmV2YWxpZGF0ZXMgdGhlIHBhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gZXZlbnQKLSAgICogICAgICAgICAgVGhlIGV2ZW50IHRoYXQgb2NjdXJlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgaWYgKCF2YWxpZGF0ZU9uXykKLSAgICAgIHJldHVybjsKLSAgICBlbmFibGVPS0J1dHRvbigpOwotICAgIGlmICh2aWV3U2VsZWN0aW9uQnlSdW50aW1lQnV0dG9uXyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIGhhbmRsZVJ1bnRpbWVWaWV3U2VsZWN0aW9uRXZlbnQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAodmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIGhhbmRsZVNlcnZlclZpZXdTZWxlY3Rpb25FdmVudCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmICh2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIGhhbmRsZUV4cGxvcmVWaWV3U2VsZWN0aW9uRXZlbnQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocnVudGltZXNMaXN0XyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIFRyZWVJdGVtW10gcnVudGltZVNlbCA9IHJ1bnRpbWVzTGlzdF8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBwcm9jZXNzUnVudGltZUxpc3RTZWxlY3Rpb24ocnVudGltZVNlbFswXS5nZXRUZXh0KCkpOwotICAgICAgdmFsaWRhdGVTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlcnZlckxpc3RfID09IGV2ZW50LndpZGdldCkgewotICAgICAgcHJvY2Vzc1NlcnZlckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgIHZhbGlkYXRlU2VydmVyUnVudGltZVNlbGVjdGlvbigpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVSdW50aW1lVmlld1NlbGVjdGlvbkV2ZW50KCkgewotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAxOwotICAgIGdsLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dChnbCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBydW50aW1lc0dyb3VwXy5tb3ZlQWJvdmUoc2VydmVyc0dyb3VwXyk7Ci0gICAgcHJpbWFyeUdyb3VwXy5sYXlvdXQoKTsKLQotICAgIC8vIFRPRE86IFNob3cgYWxsIHJ1bnRpbWVzLCBhbmQgb25seSBzZXJ2ZXJzIHN1cHBvcnRlZCBieSBjdXJyZW50IHR5cGUgaWQKLSAgfQotCi0gIC8vIAotICAvLyBDYWxsZWQgYnkgaGFuZGxlRXZlbnQoKSB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIGxheW91dCB0byB2aWV3Ci0gIC8vCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVNlcnZlclZpZXdTZWxlY3Rpb25FdmVudCgpIHsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgc2VydmVyc0dyb3VwXy5tb3ZlQWJvdmUocnVudGltZXNHcm91cF8pOwotICAgIHByaW1hcnlHcm91cF8ubGF5b3V0KCk7Ci0gICAgCi0gICAgLy8gVE9ETzogU2hvdyBhbGwgc2VydmVycywgYW5kIG9ubHkgcnVudGltZXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHR5cGUgaWQKLSAgfQotCi0gIC8vIAotICAvLyBDYWxsZWQgYnkgaGFuZGxlRXZlbnQoKSB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIGxheW91dCB0byB2aWV3Ci0gIC8vCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVFeHBsb3JlVmlld1NlbGVjdGlvbkV2ZW50KCkgewotICAgIEdyaWRMYXlvdXQgZ2w7Ci0gICAgZ2wgPSAoR3JpZExheW91dCkgcHJpbWFyeUdyb3VwXy5nZXRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcnVudGltZXNHcm91cF8ubW92ZUFib3ZlKHNlcnZlcnNHcm91cF8pOwotICAgIHByaW1hcnlHcm91cF8ubGF5b3V0KCk7Ci0KLSAgICAvLyBUT0RPOiBTaG93IGFsbCBzZXJ2ZXJzIGFuZCBydW50aW1lcyBmcm9tIHRoZSB0eXBlIGlkCi0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzUnVudGltZUxpc3RTZWxlY3Rpb24oU3RyaW5nIHJ1bnRpbWVOYW1lKSB7Ci0KLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKSB7Ci0JCXNlbGVjdGVkUnVudGltZV8gPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lQnlMYWJlbChydW50aW1lTmFtZSk7Ci0gICAgfQotICAgIGVsc2UgewotCQlzZWxlY3RlZFJ1bnRpbWVfID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZUJ5TGFiZWwocnVudGltZU5hbWUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzU2VydmVyTGlzdFNlbGVjdGlvbigpIHsKLSAgICBTdHJpbmcgY3VycmVudFNlbGVjdGlvbjsKLSAgICBUcmVlSXRlbVtdIHNlcnZlclNlbCA9IHNlcnZlckxpc3RfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZXJ2ZXJTZWwgIT0gbnVsbCAmJiBzZXJ2ZXJTZWwubGVuZ3RoID4gMCkgewotICAgICAgY3VycmVudFNlbGVjdGlvbiA9IHNlcnZlclNlbFswXS5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2VydmVyTGFiZWxzXy5jb250YWluc0tleShjdXJyZW50U2VsZWN0aW9uKSB8fCBleGlzdGluZ1NlcnZlcnNUYWJsZV8uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikpIHsKLSAgICAgICAgaWYgKGV4aXN0aW5nU2VydmVyc1RhYmxlXy5jb250YWluc0tleShjdXJyZW50U2VsZWN0aW9uKSkgewotICAgICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IChJU2VydmVyKSBleGlzdGluZ1NlcnZlcnNUYWJsZV8uZ2V0KGN1cnJlbnRTZWxlY3Rpb24pOwotICAgICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gY3VycmVudFNlbGVjdGlvbjsKLSAgICAgICAgICBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPSBzZWxlY3RlZFNlcnZlcl8uZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VydmVyTGFiZWxzXy5jb250YWluc0tleShjdXJyZW50U2VsZWN0aW9uKSkgewotICAgICAgICAgIFRyZWVJdGVtIHBhcmVudEl0ZW0gPSBzZXJ2ZXJTZWxbMF0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgIGlmIChwYXJlbnRJdGVtICE9IG51bGwgJiYgIXBhcmVudEl0ZW0uZ2V0VGV4dCgpLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1RSRUVfRVhJU1RJTkdfU0VSVkVSUykpIHsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gY3VycmVudFNlbGVjdGlvbjsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IG51bGw7Ci0gICAgICAgICAgICBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPSAoU3RyaW5nKSBzZXJ2ZXJMYWJlbHNfLmdldChjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiBpc0V4aXN0aW5nU2VydmVyIG9yIG5ldyBTZXJ2ZXJUeXBlCi0gICAgICAgIFRyZWVJdGVtIHBhcmVudEl0ZW0gPSBzZXJ2ZXJTZWxbMF0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICBpZiAocGFyZW50SXRlbSAhPSBudWxsICYmIHBhcmVudEl0ZW0uZ2V0VGV4dCgpLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1RSRUVfRVhJU1RJTkdfU0VSVkVSUykpIHsKLSAgICAgICAgICBzZXRJc0V4aXN0aW5nU2VydmVyKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHNldElzRXhpc3RpbmdTZXJ2ZXIoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJfID0gbnVsbDsKLSAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJMYWJlbF8gPSBudWxsOwotICAgICAgICBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPSBudWxsOwotICAgICAgICBzZXRJc0V4aXN0aW5nU2VydmVyKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgfQotCi0vLyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewotLy8gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2Uoa2V5KTsKLS8vICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWVzR3JvdXAoKSB7Ci0gICAgcnVudGltZXNMaXN0Xy5yZW1vdmVBbGwoKTsKLSAgICBTdHJpbmdbXSBydW50aW1lcyA9IG51bGw7Ci0KLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKSB7Ci0JCXJ1bnRpbWVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZXNCeVNlcnZpY2VUeXBlKHR5cGVJZF8pOwotICAgIH0KLSAgICBlbHNlIHsKLQkgIHJ1bnRpbWVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZXNCeUNsaWVudFR5cGUodHlwZUlkXyk7Ci0gICAgfQotCi0gICAgLy9zb3J0IHRoZSBydW50aW1lcyBiYXNlZCBvbiB0aGUgcnVudGltZSBuYW1lIChidWcgMTUxNzIzKQotICAgIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBSdW50aW1lTmFtZUNvbXBhcmF0b3IoKTsKLSAgICBBcnJheXMuc29ydChydW50aW1lcywgY29tcGFyYXRvcik7Ci0gICAgCi0gICAgVHJlZUl0ZW1bXSBydW50aW1lTmFtZSA9IG5ldyBUcmVlSXRlbVtydW50aW1lcy5sZW5ndGhdOwotCi0gICAgaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVMYWJlbCA9IGdldFJ1bnRpbWVMYWJlbChydW50aW1lc1tpXSk7Ci0gICAgICAgIHJ1bnRpbWVOYW1lW2ldID0gbmV3IFRyZWVJdGVtKHJ1bnRpbWVzTGlzdF8sIFNXVC5OT05FKTsKLSAgICAgICAgcnVudGltZU5hbWVbaV0uc2V0VGV4dChydW50aW1lTGFiZWwpOwotCi0gICAgICAgIGlmIChydW50aW1lc1tpXS5lcXVhbHNJZ25vcmVDYXNlKGRlZmF1bHRSdW50aW1lXykpIHsKLSAgICAgICAgICBydW50aW1lc0xpc3RfLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7IHJ1bnRpbWVOYW1lW2ldfSk7Ci0gICAgICAgICAgc2VsZWN0ZWRSdW50aW1lXyA9IGdldFJ1bnRpbWUocnVudGltZXNbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAKLQotICBwcml2YXRlIGNsYXNzIFJ1bnRpbWVOYW1lQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IKLSAgewotCXB1YmxpYyBSdW50aW1lTmFtZUNvbXBhcmF0b3IoKQotCXsJCQotCX0KLQkvL0NvbXBhcmUgdG8gcnVudGltZSBJRCBzdHJpbmdzIGJ5IHRoZWlyIGxhYmVscy4gIFVzZWQgZm9yIHNvcnRpbmcuCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBpdGVtMSwgT2JqZWN0IGl0ZW0yKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcnVudGltZTEgPSAoU3RyaW5nKWl0ZW0xOwotCQkJU3RyaW5nIHJ1bnRpbWUyID0gKFN0cmluZylpdGVtMjsJCQotCQkJCi0JCQlyZXR1cm4gZ2V0UnVudGltZUxhYmVsKHJ1bnRpbWUxKS5jb21wYXJlVG9JZ25vcmVDYXNlKGdldFJ1bnRpbWVMYWJlbChydW50aW1lMikpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJeyAvL0p1c3QgaW4gY2FzZSBvZiBjbGFzcyBjYXN0IGV4Y2VwdGlvbiBvciBOUEUuICBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCX0JCQotCQlyZXR1cm4gMDsKLQl9Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbChTdHJpbmcgdHlwZSkgewotICAgIHJldHVybiBnZXRSdW50aW1lKHR5cGUpLmdldExhYmVsKCk7Ci0gIH0KLQotICBwcml2YXRlIFJ1bnRpbWVEZXNjcmlwdG9yIGdldFJ1bnRpbWUoU3RyaW5nIHR5cGUpIHsKLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKSB7Ci0JICByZXR1cm4gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UnVudGltZUJ5SWQodHlwZSk7Ci0gICAgfQotICAgIGVsc2UgewotCSAgcmV0dXJuIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFJ1bnRpbWVCeUlkKHR5cGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiAKLSAgICogU2VydmVyc0xpc3QgY2xhc3MKLSAgICogCi0gICAqIENsYXNzIHdoaWNoIGVhc2lseSBjcmVhdGVzIHRoZSBUcmVlIHN0cnVjdHVyZSBhbmQgZW50cmllcyBmb3IgZXhpc3Rpbmcgc2VydmVycyBhbmQgc2VydmVyIHR5cGVzCi0gICAqLwotICBwdWJsaWMgY2xhc3MgU2VydmVyc0xpc3QgewotCi0gICAgcHJpdmF0ZSBUcmVlSXRlbVtdIGV4aXN0aW5nU2VydmVyc1RyZWU7Ci0gICAgYm9vbGVhbiBleGlzdGluZ1NlcnZlciA9IGZhbHNlOwotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyVHJlZUl0ZW1zKFRyZWUgc2VydmVyc0xpc3QpIHsKLSAgICAgIHRoaXMuc2V0RXhpc3RpbmdTZXJ2ZXJzVHJlZShzZXJ2ZXJzTGlzdCk7Ci0gICAgICB0aGlzLnNldFNlcnZlclR5cGVzVHJlZShzZXJ2ZXJzTGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXJzVHJlZShUcmVlIHNlcnZlckxpc3QpIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZlcklkcyA9IHRoaXMuZ2V0QWxsRXhpc3RpbmdTZXJ2ZXJzKCk7Ci0gICAgICBleGlzdGluZ1NlcnZlcnNUcmVlID0gbmV3IFRyZWVJdGVtWzFdOwotICAgICAgVHJlZUl0ZW1bXSBleGlzdGluZ1NlcnZlckl0ZW1zID0gbmV3IFRyZWVJdGVtW3NlcnZlcklkcy5sZW5ndGhdOwotICAgICAgZXhpc3RpbmdTZXJ2ZXJzVHJlZVswXSA9IG5ldyBUcmVlSXRlbShzZXJ2ZXJMaXN0LCBTV1QuTk9ORSk7Ci0gICAgICBleGlzdGluZ1NlcnZlcnNUcmVlWzBdLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1RSRUVfRVhJU1RJTkdfU0VSVkVSUyk7Ci0gICAgICBJbWFnZURlc2NyaXB0b3IgaWQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoRVhJU1RJTkdfU0VSVkVSU19JQ09OKTsKLSAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgCWV4aXN0aW5nU2VydmVyc0ljb24gPSBpZC5jcmVhdGVJbWFnZSgpOwotICAgICAgICBleGlzdGluZ1NlcnZlcnNUcmVlWzBdLnNldEltYWdlKGV4aXN0aW5nU2VydmVyc0ljb24pOwotICAgICAgfQotICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzZXJ2ZXJJZHMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoKChJU2VydmVyKSBleGlzdGluZ1NlcnZlcnNUYWJsZV8uZ2V0KHNlcnZlcklkc1trXSkpLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkgewotICAgICAgICAgIGV4aXN0aW5nU2VydmVySXRlbXNba10gPSBuZXcgVHJlZUl0ZW0oZXhpc3RpbmdTZXJ2ZXJzVHJlZVswXSwgU1dULk5PTkUpOwotICAgICAgICAgIGV4aXN0aW5nU2VydmVySXRlbXNba10uc2V0VGV4dChzZXJ2ZXJJZHNba10pOwotICAgICAgICAgIGlmIChzZXJ2ZXJJZHNba10uZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0U2VydmVyXykgJiYgZ2V0SXNFeGlzdGluZ1NlcnZlcigpKSB7Ci0gICAgICAgICAgICBleGlzdGluZ1NlcnZlcnNUcmVlWzBdLnNldEV4cGFuZGVkKHRydWUpOwotICAgICAgICAgICAgc2VydmVyTGlzdC5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBleGlzdGluZ1NlcnZlckl0ZW1zW2tdfSk7Ci0gICAgICAgICAgICBleGlzdGluZ1NlcnZlciA9IHRydWU7Ci0gICAgICAgICAgICBSdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLnRoaXMuc2V0SXNFeGlzdGluZ1NlcnZlcih0cnVlKTsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IChJU2VydmVyKSBleGlzdGluZ1NlcnZlcnNUYWJsZV8uZ2V0KGRlZmF1bHRTZXJ2ZXJfKTsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gc2VydmVySWRzW2tdOwotICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfID0gc2VsZWN0ZWRTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBleGlzdGluZ1NlcnZlckl0ZW1zW2tdLnNldEltYWdlKGxhYmVsUHJvdmlkZXJfLmdldEltYWdlKHNlcnZlclR5cGUpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclR5cGVzVHJlZShUcmVlIHNlcnZlckxpc3QpIHsKLQotICAgICAgVHJlZUl0ZW1bXSBzZXJ2ZXJUeXBlc1RyZWUgPSBuZXcgVHJlZUl0ZW1bMV07Ci0gICAgICBzZXJ2ZXJUeXBlc1RyZWVbMF0gPSBuZXcgVHJlZUl0ZW0oc2VydmVyTGlzdCwgU1dULk5PTkUpOwotICAgICAgc2VydmVyVHlwZXNUcmVlWzBdLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1RSRUVfU0VSVkVSX1RZUEVTKTsKLSAgICAgIEltYWdlRGVzY3JpcHRvciBpZCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihTRVJWRVJfVFlQRVNfSUNPTik7Ci0gICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgIAlzZXJ2ZXJUeXBlc0ljb24gPSBpZC5jcmVhdGVJbWFnZSgpOwotICAgICAgICBzZXJ2ZXJUeXBlc1RyZWVbMF0uc2V0SW1hZ2Uoc2VydmVyVHlwZXNJY29uKTsKLSAgICAgIH0KLSAgICAgIEhhc2h0YWJsZSBjYXRlZ29yaWVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIEhhc2h0YWJsZSBjYXRlZ29yeVRyZWVJdGVtID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgU3RyaW5nW10gc2VydmVySWRzID0gbnVsbDsKLSAgICAgIC8vIHJtIFN0cmluZyB3c3QgPSB3c2UuZ2V0V2ViU2VydmljZVR5cGUoKTsKLSAgICAgIGlmIChzZWxlY3Rpb25Nb2RlXyA9PSBNT0RFX1NFUlZJQ0UpIHsKLQkJc2VydmVySWRzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmVyRmFjdG9yeUlkc0J5U2VydmljZVR5cGUodHlwZUlkXyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQkJc2VydmVySWRzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpOwotICAgICAgfQotICAgICAgLy8gcm0gc2VydmVySWQgPQotICAgICAgLy8gd3NzcnRSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHdzZS5nZXRXZWJTZXJ2aWNlVHlwZSgpKTsKLSAgICAgIGlmIChzZXJ2ZXJJZHMgPT0gbnVsbCkgewotICAgICAgICBzZXJ2ZXJJZHMgPSBnZXRBbGxTZXJ2ZXJUeXBlcygpOwotICAgICAgfQotICAgICAgVHJlZUl0ZW1bXSBwYXJlbnQgPSBuZXcgVHJlZUl0ZW1bc2VydmVySWRzLmxlbmd0aF07Ci0gICAgICBUcmVlSXRlbVtdIGl0ZW0gPSBuZXcgVHJlZUl0ZW1bc2VydmVySWRzLmxlbmd0aF07Ci0gICAgICBpZiAoc2VydmVySWRzICE9IG51bGwpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBTdHJpbmcgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJMYWJlbEZvcklkKHNlcnZlcklkc1tpXSk7Ci0gICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLnRoaXMuc2VydmVyTGFiZWxzXy5wdXQoc2VydmVyLCBzZXJ2ZXJJZHNbaV0pOwotICAgICAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVySWRzW2ldKTsKLSAgICAgICAgICAgIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLSAgICAgICAgICAgIGlmICghY2F0ZWdvcmllc18uY29udGFpbnNLZXkoc2VydmVyVHlwZSkgJiYgcnVudGltZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICBjYXRlZ29yaWVzXy5wdXQoc2VydmVyVHlwZSwgcnVudGltZVR5cGUpOwotICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlUcmVlSXRlbS5nZXQocnVudGltZVR5cGUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnlUZXh0ID0gcnVudGltZVR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIEltYWdlIGNhdGVnb3J5SW1hZ2UgPSBsYWJlbFByb3ZpZGVyXy5nZXRJbWFnZShydW50aW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgcGFyZW50W2ldID0gbmV3IFRyZWVJdGVtKHNlcnZlclR5cGVzVHJlZVswXSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIHBhcmVudFtpXS5zZXRUZXh0KGNhdGVnb3J5VGV4dCk7Ci0gICAgICAgICAgICAgICAgcGFyZW50W2ldLnNldEltYWdlKGNhdGVnb3J5SW1hZ2UpOwotICAgICAgICAgICAgICAgIGNhdGVnb3J5VHJlZUl0ZW0ucHV0KHJ1bnRpbWVUeXBlLCBwYXJlbnRbaV0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBhcmVudFtpXSA9IChUcmVlSXRlbSkgY2F0ZWdvcnlUcmVlSXRlbS5nZXQocnVudGltZVR5cGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5VGV4dCA9IHNlcnZlclR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBJbWFnZSBmYWN0b3J5SW1hZ2UgPSBsYWJlbFByb3ZpZGVyXy5nZXRJbWFnZShzZXJ2ZXJUeXBlKTsKLSAgICAgICAgICAgICAgaXRlbVtpXSA9IG5ldyBUcmVlSXRlbShwYXJlbnRbaV0sIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgaXRlbVtpXS5zZXRUZXh0KGZhY3RvcnlUZXh0KTsKLSAgICAgICAgICAgICAgaXRlbVtpXS5zZXRJbWFnZShmYWN0b3J5SW1hZ2UpOwotICAgICAgICAgICAgICBpdGVtW2ldLnNldERhdGEoc2VydmVyVHlwZSk7Ci0gICAgICAgICAgICAgIGlmIChmYWN0b3J5VGV4dC5lcXVhbHNJZ25vcmVDYXNlKGRlZmF1bHRTZXJ2ZXJfKSAmJiAhZXhpc3RpbmdTZXJ2ZXIpIHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJMaXN0LnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7IGl0ZW1baV19KTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFNlcnZlcl8gPSBudWxsOwotICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gZmFjdG9yeVRleHQ7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfID0gKFN0cmluZykgc2VydmVyTGFiZWxzXy5nZXQoc2VsZWN0ZWRTZXJ2ZXJMYWJlbF8pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHNlcnZlcnMgaW4gdGhlIHdvcmtzcGFjZQotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nW10gb2YgZXhpc3Rpbmcgc2VydmVyIG5hbWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRBbGxFeGlzdGluZ1NlcnZlcnMoKSB7Ci0gICAgICBWZWN0b3Igc2VydmVySWRzID0gbmV3IFZlY3RvcigpOwotICAgICAgewotICAgICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAgICAgICBpZiAoc2VydmVycyAhPSBudWxsICYmIHNlcnZlcnMubGVuZ3RoIT0wKSB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBzZXJ2ZXJzW2ldOwotICAgICAgICAgICAgc2VydmVySWRzLmFkZChzZXJ2ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGV4aXN0aW5nU2VydmVyc1RhYmxlXy5wdXQoc2VydmVyLmdldE5hbWUoKSwgc2VydmVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAoU3RyaW5nW10pIHNlcnZlcklkcy50b0FycmF5KG5ldyBTdHJpbmdbc2VydmVySWRzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgc2VydmVyIHR5cGVzIGF2YWlsYWJsZSBmb3IgY3JlYXRpb24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIG9mIHNlcnZlciBuYW1lcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0QWxsU2VydmVyVHlwZXMoKSB7Ci0gICAgICBWZWN0b3Igc2VydmVyVHlwZXNfID0gbmV3IFZlY3RvcigpOwotICAgICAgSVNlcnZlclR5cGVbXSBkZWZhdWx0U2VydmVyc0xpc3QgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclR5cGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRTZXJ2ZXJzTGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBkZWZhdWx0U2VydmVyc0xpc3RbaV07Ci0gICAgICAgIHNlcnZlclR5cGVzXy5hZGQoc2VydmVyVHlwZS5nZXRJZCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoU3RyaW5nW10pIHNlcnZlclR5cGVzXy50b0FycmF5KG5ldyBTdHJpbmdbc2VydmVyVHlwZXNfLnNpemUoKV0pOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvVHlwZVNlbGVjdGlvbkZpbHRlcjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25GaWx0ZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMTBjZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvVHlwZVNlbGVjdGlvbkZpbHRlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA2MDYgICAxMDUwNDUgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uICAgICAgICAgIAotICogMjAwNzAzMjggICAxNzIzMzkga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLQotcHVibGljIGNsYXNzIFR5cGVTZWxlY3Rpb25GaWx0ZXIyCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uLCBBcnJheUxpc3Qgd2ViU2VydmljZVR5cGVMaXN0KQotICB7Ci0gICAgICAgIAotICAgIEFycmF5TGlzdCBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmIGluaXRpYWxTZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgCi0gICAgICAvLyBDaGVjayBmb3IgbnVsbCBpbml0aWFsIHNlbGVjdGlvbgotICAgICAgT2JqZWN0IGluaXRpYWxPYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGluaXRpYWxPYmplY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICAvLyBNYXRjaCB1cCByZXNvdXJjZSB0eXBlIG1ldGFkYXRhIHdpdGggaW5pdGlhbCBzZWxlY3Rpb24KLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlVHlwZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHdzdCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBzY2VuYXJpbyA9IHdzdC5zdWJzdHJpbmcoMCx3c3QuaW5kZXhPZigiLyIpKTsKLSAgICAgICAgU3RyaW5nIGltcGxJZCA9IHdzdC5zdWJzdHJpbmcod3N0LmluZGV4T2YoIi8iKSsxKTsgICAgICAgIAotICAgICAgICAvL0lXZWJTZXJ2aWNlVHlwZSB3c3QgPSAoSVdlYlNlcnZpY2VUeXBlKWl0ZXIubmV4dCgpOwotICAgICAgICAvL1N0cmluZyB0eXBlSWQgPSAoU3RyaW5nKXdzdC5nZXRJZCgpOwotICAgICAgICBpZiAoc2NlbmFyaW8uZXF1YWxzKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkpICYmICFzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh3c3QpKQotICAgICAgICB7Ci0KLSAgICAgICAgICAKLSAgICAgICAgICBXZWJTZXJ2aWNlSW1wbCB3c2ltcGwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRXZWJTZXJ2aWNlSW1wbEJ5SWQoaW1wbElkKTsKLSAgICAgICAgICBTdHJpbmdbXSByZXNvdXJjZVR5cGVzID0gd3NpbXBsLmdldFJlc291cmNlVHlwZU1ldGFkYXRhKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZXNbaV0hPW51bGwpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKChpbml0aWFsT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKS5lbmRzV2l0aChyZXNvdXJjZVR5cGVzW2ldKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihpbml0aWFsT2JqZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBuYW1lID0gaW5pdGlhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbml0aWFsT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRlbnNpb25zID0gd3NpbXBsLmdldEV4dGVuc2lvbk1ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VwdHNOYW1lKG5hbWUsIGV4dGVuc2lvbnMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzLmFkZCh3c3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy9UT0RPOiBCdWcgMTc5NzUxIC0gTmVlZCB0byBtYWtlIGNoZWNraW5nIGZvciB0eXBlcyByZWNvZ25pemVkIGFzIGJvdHRvbS11cCB0byBiZSBtb3JlIGV4dGVuc2libGUgICAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoc3VwcG9ydGVkVHlwZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIAkgIGlmIChpbml0aWFsT2JqZWN0IGluc3RhbmNlb2YgQmVhbkxpbmsgfHwgaW5pdGlhbE9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbikgewotICAgICAgICAJCSAgc3VwcG9ydGVkVHlwZXMuYWRkKHdzdCk7Ci0gICAgICAgIAkgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZW5kIG9mIFRPRE8gZm9yIGJ1ZyAxNzk3NTEKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICAvL0lmIG5vIHdzSW1wbHMgaGF2ZSBhY2NlcHRlZCB0aGlzIHNlbGVjdGlvbiwgY2hlY2sgaWYgdGhpcyBpcyBXU0RMLiBJZiBpdCBpcywKLSAgICAgIC8vYWRkIHRoZSB0b3AtZG93biBKYXZhIHNlcnZpY2UgdHlwZSB0byB0aGUgbGlzdC4KLSAgICAgIGlmIChzdXBwb3J0ZWRUeXBlcy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHJlc291cmNlVHlwZXMgPSB7IkZpbGUiLCAiSVJlc291cmNlIiwgIlN0cmluZyIsICJTZXJ2aWNlSW1wbCIsICJTZXJ2aWNlUmVmSW1wbCIsICJXU0RMUmVzb3VyY2VJbXBsIn07Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJlc291cmNlVHlwZXNbaV0hPW51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoKGluaXRpYWxPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLmVuZHNXaXRoKHJlc291cmNlVHlwZXNbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKGluaXRpYWxPYmplY3QpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGluaXRpYWxPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKGluaXRpYWxPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICAgIHsgLy90aGUgaW5pdGlhbE9iamVjdCBjb3VsZCBiZSBhIHBhdGggbmFtZSB0aGF0IGlzIGEgc3RyaW5nCi0gICAgICAgICAgICAgICAgLy9idWcgMTA1MDQ1Ci0gICAgICAgICAgICAJbmFtZSA9IChTdHJpbmcpaW5pdGlhbE9iamVjdDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gaW5pdGlhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgfSAgICAKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIFN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7Ii53c2RsIiwgIi53c2lsIiwgIi5odG1sIiwgIi5TZXJ2aWNlSW1wbCIsICIuU2VydmljZVJlZkltcGwiLCAiLldTRExSZXNvdXJjZUltcGwifTsKLSAgICAgICAgICAgICAgaWYgKGFjY2VwdHNOYW1lKG5hbWUsIGV4dGVuc2lvbnMpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVudHJ5YnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSk7Ci0gICAgICAgICAgICAgICAgZW50cnlidWZmLmFwcGVuZCgiLyIpOwotICAgICAgICAgICAgICAgIGVudHJ5YnVmZi5hcHBlbmQoIm9yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuamF2YSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeSA9IGVudHJ5YnVmZi50b1N0cmluZygpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcy5hZGQoZW50cnkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgIH0gICAgCi0gIAotCi0gICAgCi0gICAgaWYgKHN1cHBvcnRlZFR5cGVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICAvL0l0J3Mgbm90IGEgcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbiBhbmQgaXRzIG5vdCBXU0RMIHNvIHJldHVybiBudWxsOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gKFN0cmluZ1tdKXN1cHBvcnRlZFR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotICB9Ci0gIC8vCi0gIC8vIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhY2NlcHRhYmxlIGJhc2VkIHVwb24gaXRzIGV4dGVuc2lvbgotICAvLwotICBwcml2YXRlIGJvb2xlYW4gYWNjZXB0c05hbWUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gZXh0ZW5zaW9ucykKLSAgewotICAgIC8vUmV0dXJuIHRydWUgaWYgImFsbCIgZXh0ZW5zaW9ucyBhcmUgc3VwcG9ydGVkLgotCi0gICAgaWYgKGV4dGVuc2lvbnNbMF0hPW51bGwpCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbMF0uZXF1YWxzKCJhbGwiKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0hPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKGV4dGVuc2lvbnNbaV0pKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9UeXBlU2VsZWN0aW9uTWV0YWRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mjc1YWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25NZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjE2ICAgMTI3MTM4IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0gIC8vCi0gIC8vIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHNldCBvZiBkaXN0aW5ndWlzaGluZyBmYWN0b3JzIGluIGRldGVybWluaW5nIAotICAvLyB0aGUgZGVmYXVsdCBXZWIgc2VydmljZSB0eXBlLiAgVGhlIGRlZmF1bHQgV2ViIFNlcnZpY2UgdHlwZSB3aWxsIGJlIGRldGVybWluZWQKLSAgLy8gYnkgcGF0dGVybiBtYXRjaGluZyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gd2l0aCB0aGUgc3VwcG9ydGVkIGV4dGVuc2lvbiAKLSAgLy8gYW5kIHRoZSByZXNvdXJjZSB0eXBlIG1ldGFkYXRhIHNwZWNpZmllZCBpbiB0aGUgbWFuaWZlc3QgZmlsZS4KLSAgLy8KLSAgcHVibGljIGNsYXNzIFR5cGVTZWxlY3Rpb25NZXRhZGF0YQotICB7Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAgcHVibGljIFN0cmluZ1tdIGV4dGVuc2lvbk1ldGE7Ci0gICAgcHVibGljIFN0cmluZ1tdIHJlc291cmNlVHlwZU1ldGE7Ci0KLSAgICBwdWJsaWMgVHlwZVNlbGVjdGlvbk1ldGFkYXRhKFN0cmluZyBleHRlbnNpb25NRCwgU3RyaW5nIHJlc291cmNlVHlwZU1EKQotICAgIHsKLSAgICAgIHNldEV4dGVuc2lvbk1ldGFkYXRhKGV4dGVuc2lvbk1EKTsKLSAgICAgIHNldFJlc291cmNlVHlwZU1ldGFkYXRhKHJlc291cmNlVHlwZU1EKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uTWV0YWRhdGEoU3RyaW5nIGV4dGVuc2lvbk1ldGFkYXRhKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZXh0ZW5zaW9uTWV0YWRhdGEpOwotICAgICAgZXh0ZW5zaW9uTWV0YSA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICAgICBpbnQgaT0wOwotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZXh0ZW4gPSAoU3RyaW5nKXN0Lm5leHRUb2tlbigpOwotICAgICAgICBpZiAoZXh0ZW4hPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBleHRlbnNpb25NZXRhW2ldPWV4dGVuOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25NZXRhZGF0YSgpCi0gICAgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbk1ldGE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZU1ldGFkYXRhKFN0cmluZyByZXNvdXJjZVR5cGVNZXRhZGF0YSkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc291cmNlVHlwZU1ldGFkYXRhKTsKLSAgICAgIHJlc291cmNlVHlwZU1ldGEgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgICAgaW50IGk9MDsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc291cmNlVHlwZSA9IChTdHJpbmcpc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZVR5cGUhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhW2ldPXJlc291cmNlVHlwZTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVzb3VyY2VUeXBlTWV0YTsKLSAgICB9Ci0KLSAgfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiYzU1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLQotLyoqCi0qIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGhvbGQgdXNlciBvciBjYWxjdWxhdGVkIAotKiBkYXRhIHRvIGJlIHVzZSBieSBmaW5zaWggdGFza3MKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VJbmZvCi17Ci0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlOVFRDb21tLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU5UVENvbW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlMTRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU5UVENvbW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLlBsdWdpbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbSBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBQbHVnaW5NZXNzYWdlcy5QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTlRUQ09NTTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3d3dy51ZGRpLm5lLmpwL3Vici9pbnF1aXJ5YXBpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly93d3cudWRkaS5uZS5qcC91YnIvcHVibGlzaGFwaSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3d3dy5udHQuY29tL3VkZGkvIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5U0FQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQ2OGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5U0FQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5QbHVnaW5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeVNBUCBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5U0FQKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFBsdWdpbk1lc3NhZ2VzLlBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLnNhcC5jb20vVURESS9hcGkvaW5xdWlyeS8iOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwczovL3VkZGkuc2FwLmNvbS9VRERJL2FwaS9wdWJsaXNoLyI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGkuc2FwLmNvbS8iOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlTQVBUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhZDE0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLlBsdWdpbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdCBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBQbHVnaW5NZXNzYWdlcy5QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpdGVzdC5zYXAuY29tL1VEREkvYXBpL2lucXVpcnkvIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpdGVzdC5zYXAuY29tL1VEREkvYXBpL3B1Ymxpc2gvIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaXRlc3Quc2FwLmNvbS8iOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkOWU2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5WE1ldGhvZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5WE1ldGhvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3YmRlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5QbHVnaW5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzIGltcGxlbWVudHMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBQbHVnaW5NZXNzYWdlcy5QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfWE1FVEhPRFM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICAvL3JldHVybiAiaHR0cDovL3VkZGkueG1ldGhvZHMubmV0L2lucXVpcmUiOwotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlMiI7Ci0gICAgfQotCi0gICAgLy8gUmVhZC1vbmx5IHJlZ2lzdHJ5LiBUaGUgcHVibGlzaCBhbmQgcmVnaXN0cmF0aW9uIFVSTHMgZG9uJ3QgZXhpc3QuCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS54bWV0aG9kcy5uZXQvcHVibGlzaDIiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3ZlMi9SZWdpc3Rlci5wbz9ldmVudD1yZWdpc3Rlck9yZyI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMTkzYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzaWwuQWRkV1NETFRvV1NJTENvbW1hbmQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLSAgcHJpdmF0ZSBBZGRXU0RMVG9XU0lMQ29tbWFuZCBjb21tYW5kOwotICBwcml2YXRlIEFyZ3VtZW50cyBhcmdzOwotCi0gIHB1YmxpYyBBZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIAotICAgIGlmIChjb21tYW5kID09IG51bGwpCi0gICAgICBjb21tYW5kID0gbmV3IEFkZFdTRExUb1dTSUxDb21tYW5kKCk7Ci0gICAgaWYgKCFhcmdzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBjb21tYW5kLnNldEFyZ3VtZW50cyhhcmdzLmdldFN0cmluZ0FyZ3VtZW50cygpKTsKLSAgICAgIGNvbW1hbmQuc2V0V1dXQXV0aGVudGljYXRpb25IYW5kbGVyKG5ldyBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpKTsKLSAgICAgIGNvbW1hbmQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotICAgICAgcmV0dXJuIGNvbW1hbmQuZXhlY3V0ZSggbnVsbCwgbnVsbCk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gYXJncyBUaGUgYXJncyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBcmdzKEFyZ3VtZW50cyBhcmdzKQotICB7Ci0gICAgdGhpcy5hcmdzID0gYXJnczsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgY29tbWFuZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kKEFkZFdTRExUb1dTSUxDb21tYW5kIGNvbW1hbmQpCi0gIHsKLSAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9Bcmd1bWVudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9Bcmd1bWVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNzdjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvQXJndW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQXJndW1lbnRzCi17Ci0gIHByaXZhdGUgVmVjdG9yIGFyZ3NfOwotCi0gIHB1YmxpYyBBcmd1bWVudHMoKQotICB7Ci0gICAgYXJnc18gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgYXJnc18uYWRkKGtleSk7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICBhcmdzXy5hZGQodmFsdWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBrZXkpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBhcmdzXy5pbmRleE9mKGtleSk7Ci0gICAgaWYgKGluZGV4ID49IDApCi0gICAgewotICAgICAgYXJnc18ucmVtb3ZlKGluZGV4KTsKLSAgICAgIGFyZ3NfLnJlbW92ZShpbmRleCsxKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KQotICB7Ci0gICAgaW50IGluZGV4ID0gYXJnc18uaW5kZXhPZihrZXkpOwotICAgIGlmIChpbmRleCA+PSAwKQotICAgICAgcmV0dXJuIGFyZ3NfLmdldChpbmRleCsxKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkKLSAgewotICAgIGFyZ3NfLmNsZWFyKCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0W10gZ2V0QXJndW1lbnRzKCkKLSAgewotICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W2FyZ3NfLnNpemUoKV07Ci0gICAgYXJnc18uY29weUludG8oYXJncyk7Ci0gICAgcmV0dXJuIGFyZ3M7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5nQXJndW1lbnRzKCkKLSAgewotICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW2FyZ3NfLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQotICAgICAgYXJnc1tpXSA9IGFyZ3NfLmdldChpKS50b1N0cmluZygpOwotICAgIHJldHVybiBhcmdzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0gIHsKLSAgICByZXR1cm4gYXJnc18uaXNFbXB0eSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvRGlhbG9nV1dXQXV0aGVudGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9EaWFsb2dXV1dBdXRoZW50aWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjVjOTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9EaWFsb2dXV1dBdXRoZW50aWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcjsKLQotCi1wdWJsaWMgY2xhc3MgRGlhbG9nV1dXQXV0aGVudGljYXRpb24gZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBXV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIKLXsKLQotICAvKkNPTlRFWFRfSUQgREJBUzAwMDEgZm9yIHRoZSBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHVzZXIgbmFtZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfREJBU19VU0VSTkFNRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5EQkFTMDAwMSI7Ci0KLSAgLypDT05URVhUX0lEIERCQVMwMDAyIGZvciB0aGUgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiBwYXNzd29yZCovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfREJBU19QQVNTV09SRCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5EQkFTMDAwMiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWVTdHJpbmdfOwotICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFN0cmluZ187Ci0KLSAgcHJpdmF0ZSBUZXh0IHVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBUZXh0IHBhc3N3b3JkXzsKLQotICBwcml2YXRlIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlXzsKLQotICBwdWJsaWMgRGlhbG9nV1dXQXV0aGVudGljYXRpb24oU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlcihzaGVsbCk7Ci0gICAgdXNlcm5hbWVTdHJpbmdfID0gbnVsbDsKLSAgICBwYXNzd29yZFN0cmluZ18gPSBudWxsOwotICAgIHd3d2FlXyA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiB0aGUgQ2FuY2VsIGJ1dHRvbiBpcyBwcmVzc2VkLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkKLSAgewotICAgIHVzZXJuYW1lU3RyaW5nXyA9IG51bGw7Ci0gICAgcGFzc3dvcmRTdHJpbmdfID0gbnVsbDsKLSAgICBzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHByZXNzZWQuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpCi0gIHsKLSAgICBTdHJpbmcgdXNlcm5hbWVTdHJpbmcgPSB1c2VybmFtZV8uZ2V0VGV4dCgpOwotICAgIHVzZXJuYW1lU3RyaW5nXyA9ICh1c2VybmFtZVN0cmluZy5sZW5ndGgoKSA+IDApID8gdXNlcm5hbWVTdHJpbmcgOiBudWxsOwotICAgIFN0cmluZyBwYXNzd29yZFN0cmluZyA9IHBhc3N3b3JkXy5nZXRUZXh0KCk7Ci0gICAgcGFzc3dvcmRTdHJpbmdfID0gKHBhc3N3b3JkU3RyaW5nLmxlbmd0aCgpID4gMCkgPyBwYXNzd29yZFN0cmluZyA6IG51bGw7Ci0gICAgc2V0UmV0dXJuQ29kZShEaWFsb2cuT0spOwotICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogU2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsfS4KLSAgKiBAcGFyYW0gc2hlbGwgVGhlIHNoZWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5ESUFMT0dfVElUTEVfSFRUUF9CQVNJQ19BVVRIKTsKLSAgfQotCi0gIC8qKiAKLSAgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYXJlYS4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAqIEByZXR1cm4gVGhlIGNvbnRyb2wgYXJlYS4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBnZC53aWR0aEhpbnQgPSA0MDA7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgIGxhYmVsLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1VSTCk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KHd3d2FlXy5nZXRVUkwoKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgdXNlcm5hbWVfID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICB1c2VybmFtZV8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgdXNlcm5hbWVfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1c2VybmFtZV8sIElORk9QT1BfREJBU19VU0VSTkFNRSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9IVFRQX0JBU0lDX0FVVEhfUEFTU1dPUkQpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgcGFzc3dvcmRfID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICBwYXNzd29yZF8uc2V0RWNob0NoYXIoJyonKTsKLSAgICBwYXNzd29yZF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgcGFzc3dvcmRfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1c2VybmFtZV8sIElORk9QT1BfREJBU19QQVNTV09SRCk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlV1dXQXV0aGVudGljYXRpb24oV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24gd3d3YWUpCi0gIHsKLSAgICB1c2VybmFtZVN0cmluZ18gPSBudWxsOwotICAgIHBhc3N3b3JkU3RyaW5nXyA9IG51bGw7Ci0gICAgd3d3YWVfID0gd3d3YWU7Ci0gICAgb3BlbigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdXNlcm5hbWVTdHJpbmdfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpCi0gIHsKLSAgICByZXR1cm4gcGFzc3dvcmRTdHJpbmdfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVGFibGVWaWV3ZXJFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9UYWJsZVZpZXdlckVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQ3YzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9UYWJsZVZpZXdlckVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgVGFibGVWaWV3ZXJFZGl0b3IgZXh0ZW5kcyBDb21wb3NpdGUKLXsKLSAgcHJpdmF0ZSBpbnQgREVGQVVMVF9UQUJMRV9IRUlHSFRfSElOVCA9IDEwMDsKLSAgcHJpdmF0ZSBpbnQgREVGQVVMVF9DT0xVTU5fV0lEVEggPSA4MDsKLQotICBwcml2YXRlIFN0cmluZ1tdIGNvbHVtbnNfOwotICBwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyXzsKLSAgcHJpdmF0ZSBUYWJsZSB0YWJsZV87Ci0gIHByaXZhdGUgVGFibGVFZGl0b3IgZWRpdG9yXzsKLSAgcHJpdmF0ZSBUYWJsZUVkaXRvckxpc3RlbmVyIHRhYmxlRWRpdG9yTGlzdGVuZXJfOwotICBwcml2YXRlIFRleHQgdGV4dF87Ci0gIHByaXZhdGUgQnV0dG9uIGFkZF87Ci0gIHByaXZhdGUgQnV0dG9uIHJlbW92ZV87Ci0KLSAgcHJpdmF0ZSBMaXN0IHZhbHVlc187Ci0gIHByaXZhdGUgT2JqZWN0IGRlZmF1bHRWYWx1ZV87Ci0KLSAgcHVibGljIFRhYmxlVmlld2VyRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGNvbHVtbnMsIExpc3QgaW5pdFZhbHVlcywgT2JqZWN0IGRlZmF1bHRWYWx1ZSkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGNvbHVtbnNfID0gY29sdW1uczsKLSAgICB2YWx1ZXNfID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChpbml0VmFsdWVzICE9IG51bGwgJiYgaW5pdFZhbHVlcy5zaXplKCkgPiAwKQotICAgICAgdmFsdWVzXy5hZGRBbGwoaW5pdFZhbHVlcyk7Ci0gICAgZGVmYXVsdFZhbHVlXyA9IChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBuZXcgU3RyaW5nKCIiKTsKLSAgICBjcmVhdGVQYXJ0Q29udHJvbCh0aGlzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgc2V0TGF5b3V0KGdsKTsKLSAgICBzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICB0YWJsZV8gPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBnZC5oZWlnaHRIaW50ID0gREVGQVVMVF9UQUJMRV9IRUlHSFRfSElOVDsKLSAgICB0YWJsZV8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdGFibGVfLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgdGFibGVfLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIGludCBtYXhXaWR0aCA9IERFRkFVTFRfQ09MVU1OX1dJRFRIOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGVfLCBTV1QuTk9ORSk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtbnNfW2ldKTsKLSAgICAgIHRhYmxlQ29sdW1uLnBhY2soKTsKLSAgICAgIGludCB0YWJsZUNvbHVtbldpZHRoID0gTWF0aC5tYXgoREVGQVVMVF9DT0xVTU5fV0lEVEgsIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkpOwotICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgdGFibGVDb2x1bW5XaWR0aCk7Ci0gICAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbkRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSh0YWJsZUNvbHVtbldpZHRoLCB0YWJsZUNvbHVtbldpZHRoLCB0cnVlKTsKLSAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uRGF0YSk7Ci0gICAgfQotICAgIHRhYmxlXy5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotICAgIC8vIGluaXRpYWxpemUgdGhlIHRhYmxlIGVkaXRvcgotICAgIGVkaXRvcl8gPSBuZXcgVGFibGVFZGl0b3IodGFibGVfKTsKLSAgICAvLyBUaGUgZWRpdG9yIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBjZWxsIGFuZCBtdXN0Ci0gICAgLy8gbm90IGJlIGFueSBzbWFsbGVyIHRoYW4gNTAgcGl4ZWxzLgotICAgIGVkaXRvcl8uaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotICAgIGVkaXRvcl8uZ3JhYkhvcml6b250YWwgPSB0cnVlOwotICAgIGVkaXRvcl8ubWluaW11bVdpZHRoID0gbWF4V2lkdGg7Ci0gICAgdGFibGVFZGl0b3JMaXN0ZW5lcl8gPSBuZXcgVGFibGVFZGl0b3JMaXN0ZW5lcigpOwotICAgIHRhYmxlXy5hZGRNb3VzZUxpc3RlbmVyKHRhYmxlRWRpdG9yTGlzdGVuZXJfKTsKLSAgICB0YWJsZVZpZXdlcl8gPSBuZXcgVGFibGVWaWV3ZXIodGFibGVfKTsKLSAgICB0YWJsZVZpZXdlcl8uZ2V0Q29udHJvbCgpLmFkZEtleUxpc3RlbmVyKAotICAgICAgbmV3IEtleUxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRGVsCi0gICAgICAgICAgaWYgKCgoaW50KWUuY2hhcmFjdGVyKSA9PSAxMjcpIAotICAgICAgICAgICAgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpOwotICAgICAgICAgIC8vIEVudGVyIG9yIHNwYWNlCi0gICAgICAgICAgaWYgKCgoaW50KWUuY2hhcmFjdGVyKSA9PSAxMyB8fCAoKGludCllLmNoYXJhY3RlcikgPT0gMzIpCi0gICAgICAgICAgICB0YWJsZUVkaXRvckxpc3RlbmVyXy5lZGl0U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMaXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQodmFsdWVzXyk7Ci0gICAgdGFibGVWaWV3ZXJfLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLSAgICAgIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBlbmFibGVSZW1vdmUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLSAgICBhZGRfID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICBhZGRfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0FERCk7Ci0gICAgYWRkXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBhZGRfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotICAgICAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotCi0gICAgcmVtb3ZlXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlXy5zZXRUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9SRU1PVkUpOwotICAgIHJlbW92ZV8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgcmVtb3ZlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLSAgICAgIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgICBlbmFibGVSZW1vdmUoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZVJlbW92ZShib29sZWFuIGVuYWJsZWQpCi0gIHsKLSAgICByZW1vdmVfLnNldEVuYWJsZWQoZW5hYmxlZCAmJiAhdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICB2YWx1ZXNfLmFkZChkZWZhdWx0VmFsdWVfKTsKLSAgICByZWZyZXNoKCk7Ci0gICAgc2V0U2VsZWN0aW9uQXNPYmplY3QodmFsdWVzXy5nZXQodGFibGVfLmdldEl0ZW1Db3VudCgpLTEpKTsKLSAgICB0YWJsZUVkaXRvckxpc3RlbmVyXy5lZGl0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpCi0gIHsKLSAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSB0YWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGludCBzZWxlY3Rpb25Db3VudCA9IHRhYmxlXy5nZXRJdGVtQ291bnQoKTsKLSAgICAgIHZhbHVlc18ucmVtb3ZlKHNlbGVjdGlvbkluZGV4KTsKLSAgICAgIGlmIChzZWxlY3Rpb25JbmRleCA8IHNlbGVjdGlvbkNvdW50LTEpCi0gICAgICAgIHNldFNlbGVjdGlvbkFzT2JqZWN0KHZhbHVlc18uZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0gICAgICBlbHNlIGlmIChzZWxlY3Rpb25Db3VudCAtMiA+PSAwKQotICAgICAgICBzZXRTZWxlY3Rpb25Bc09iamVjdCh2YWx1ZXNfLmdldChzZWxlY3Rpb25Db3VudC0yKSk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGludGVybmFsUmVmcmVzaCgpCi0gIHsKLSAgICAvLyBzeW5jaHJvbml6ZSB0ZXh0IGZpZWxkLCBwcmV2aW91c2x5IHNlbGVjdGVkIHRhYmxlIGNlbGwgYW5kIG1vZGVsIChpbnB1dE9iamVjdCkKLSAgICBpZiAodGV4dF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW0gb2xkVGFibGVJdGVtID0gZWRpdG9yXy5nZXRJdGVtKCk7Ci0gICAgICBpbnQgb2xkQ29sdW1uSW5kZXggPSBlZGl0b3JfLmdldENvbHVtbigpOwotICAgICAgaWYgKG9sZFRhYmxlSXRlbSAhPSBudWxsICYmIG9sZENvbHVtbkluZGV4ID49IDAgJiYgb2xkQ29sdW1uSW5kZXggPCBjb2x1bW5zXy5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBvbGRUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotICAgICAgICBvbGRUYWJsZUl0ZW0uc2V0VGV4dChvbGRDb2x1bW5JbmRleCwgb2xkVGV4dCk7Ci0gICAgICAgIGludCBvbGRSb3dJbmRleCA9IHRhYmxlXy5pbmRleE9mKG9sZFRhYmxlSXRlbSk7Ci0gICAgICAgIHZhbHVlc18uc2V0KG9sZFJvd0luZGV4LCBvbGRUZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uQXNPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHRhYmxlVmlld2VyXy5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgdGFibGVfLnNldFRvb2xUaXBUZXh0KHN0cmluZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbmZvcG9wKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGFibGVfLCBzdHJpbmcpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChMaXN0IGxpc3QpCi0gIHsKLSAgICB2YWx1ZXNfLmNsZWFyKCk7Ci0gICAgdmFsdWVzXy5hZGRBbGwobGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgVGFibGVJdGVtW10gZ2V0SXRlbXMoKQotICB7Ci0gICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgcmV0dXJuIHRhYmxlXy5nZXRJdGVtcygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gIHsKLSAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIGFkZF8uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICBlbmFibGVSZW1vdmUoZW5hYmxlZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICBpZiAoZWRpdG9yXyAhPSBudWxsKQotICAgICAgZWRpdG9yXy5kaXNwb3NlKCk7Ci0gICAgaWYgKHRhYmxlXyAhPSBudWxsKQotICAgICAgdGFibGVfLmRpc3Bvc2UoKTsKLSAgICBpZiAoYWRkXyAhPSBudWxsKQotICAgICAgYWRkXy5kaXNwb3NlKCk7Ci0gICAgaWYgKHJlbW92ZV8gIT0gbnVsbCkKLSAgICAgIHJlbW92ZV8uZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGludGVybmFsRGlzcG9zZSgpCi0gIHsKLSAgICBpZiAodGV4dF8gIT0gbnVsbCkKLSAgICAgIHRleHRfLmRpc3Bvc2UoKTsKLSAgICB0ZXh0XyA9IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgVGFibGVFZGl0b3JMaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIKLSAgewotICAgIHByaXZhdGUgaW50IGN1cnJTZWxlY3Rpb25JbmRleF87Ci0gICAgcHJpdmF0ZSBpbnQgZWRpdFJvd187Ci0gICAgcHJpdmF0ZSBpbnQgZWRpdENvbHVtbl87Ci0KLSAgICBwdWJsaWMgVGFibGVFZGl0b3JMaXN0ZW5lcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSAtMTsKLSAgICAgIGVkaXRSb3dfID0gLTE7Ci0gICAgICBlZGl0Q29sdW1uXyA9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKQotICAgIHsKLSAgICAgIG1vdXNlRG93bihlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotICAgIHsKLSAgICAgIC8vIHJlZnJlc2ggdGFibGUKLSAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgICAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgdGV4dCBlZGl0b3IgY29udHJvbAotICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICAvLyB1cGRhdGUgdGFibGUKLSAgICAgIGlmICh0YWJsZV8uaXNGb2N1c0NvbnRyb2woKSkKLSAgICAgIHsKLSAgICAgICAgaW50IHNlbGVjdGVkUm93SW5kZXggPSBnZXRTZWxlY3RlZFJvdyh0YWJsZV8sIGUueSk7Ci0gICAgICAgIGlmIChjdXJyU2VsZWN0aW9uSW5kZXhfICE9IC0xICYmIHNlbGVjdGVkUm93SW5kZXggIT0gLTEgJiYgY3VyclNlbGVjdGlvbkluZGV4XyA9PSBzZWxlY3RlZFJvd0luZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlXy5nZXRJdGVtKHNlbGVjdGVkUm93SW5kZXgpOwotICAgICAgICAgIGludCBzZWxlY3RlZENvbHVtbkluZGV4ID0gZ2V0U2VsZWN0ZWRDb2x1bW4odGFibGVJdGVtLCBlLngsIGUueSk7Ci0gICAgICAgICAgaWYgKHNlbGVjdGVkQ29sdW1uSW5kZXggIT0gLTEgJiYgKHRleHRfID09IG51bGwgfHwgdGV4dF8uaXNEaXNwb3NlZCgpIHx8IHNlbGVjdGVkQ29sdW1uSW5kZXggIT0gZWRpdG9yXy5nZXRDb2x1bW4oKSkpCi0gICAgICAgICAgICBlZGl0U2VsZWN0aW9uKHNlbGVjdGVkUm93SW5kZXgsIHNlbGVjdGVkQ29sdW1uSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSBzZWxlY3RlZFJvd0luZGV4OwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRTZWxlY3RlZFJvdyhUYWJsZSB0YWJsZSwgaW50IHkpCi0gICAgewotICAgICAgVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSB0YWJsZUl0ZW1zW2ldLmdldEJvdW5kcygwKTsKLSAgICAgICAgaWYgKHJlY3RhbmdsZSAhPSBudWxsICYmIHkgPj0gcmVjdGFuZ2xlLnkgJiYgeSA8IChyZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQpKQotICAgICAgICAgIHJldHVybiBpOwotICAgICAgfQotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFNlbGVjdGVkQ29sdW1uKFRhYmxlSXRlbSB0YWJsZUl0ZW0sIGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNfLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAodGFibGVJdGVtLmdldEJvdW5kcyhpKS5jb250YWlucyh4LCB5KSkKLSAgICAgICAgICByZXR1cm4gaTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZWRpdFNlbGVjdGlvbihpbnQgcm93LCBpbnQgY29sdW1uKQotICAgIHsKLSAgICAgIGVkaXRSb3dfID0gcm93OwotICAgICAgZWRpdENvbHVtbl8gPSBjb2x1bW47Ci0gICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVfLmdldEl0ZW0ocm93KTsKLSAgICAgIC8vIFNldHVwIGFkYXB0ZXIgZm9yIHRoZSBuZXcgc2VsZWN0aW9uCi0gICAgICB0ZXh0XyA9IG5ldyBUZXh0KHRhYmxlXywgU1dULk5PTkUpOwotICAgICAgU3RyaW5nIHRleHQgPSB0YWJsZUl0ZW0uZ2V0VGV4dChjb2x1bW4pOwotICAgICAgdGV4dF8uc2V0VGV4dCgodGV4dCAhPSBudWxsKSA/IHRleHQgOiAiIik7Ci0gICAgICB0ZXh0Xy5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEVzYwotICAgICAgICAgICAgaWYgKCgoaW50KWUuY2hhcmFjdGVyKSA9PSAyNykKLSAgICAgICAgICAgICAgY2FuY2VsU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgKTsKLSAgICAgIHRleHRfLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKQotICAgICAgICAgICAgICB0cmF2ZXJzZVRhYk5leHQoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpCi0gICAgICAgICAgICAgIHRyYXZlcnNlVGFiUHJldmlvdXMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICk7Ci0gICAgICBlZGl0b3JfLnNldEVkaXRvcih0ZXh0XywgdGFibGVJdGVtLCBjb2x1bW4pOwotICAgICAgdGV4dF8uc2V0Rm9jdXMoKTsKLSAgICAgIHRleHRfLnNlbGVjdEFsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRyYXZlcnNlVGFiTmV4dCgpCi0gICAgewotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIGlmICghKGVkaXRSb3dfID09IHRhYmxlXy5nZXRJdGVtcygpLmxlbmd0aC0xICYmIGVkaXRDb2x1bW5fID09IGNvbHVtbnNfLmxlbmd0aC0xKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVkaXRDb2x1bW5fIDwgY29sdW1uc18ubGVuZ3RoLTEpCi0gICAgICAgICAgZWRpdENvbHVtbl8rKzsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdENvbHVtbl8gPSAwOwotICAgICAgICAgIGVkaXRSb3dfKys7Ci0gICAgICAgICAgdGFibGVfLnNlbGVjdChlZGl0Um93Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWRpdFNlbGVjdGlvbihlZGl0Um93XywgZWRpdENvbHVtbl8pOwotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRyYXZlcnNlVGFiUHJldmlvdXMoKQotICAgIHsKLSAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICBpZiAoIShlZGl0Um93XyA9PSAwICYmIGVkaXRDb2x1bW5fID09IDApKQotICAgICAgewotICAgICAgICBpZiAoZWRpdENvbHVtbl8gPiAwKQotICAgICAgICAgIGVkaXRDb2x1bW5fLS07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVkaXRDb2x1bW5fID0gY29sdW1uc18ubGVuZ3RoLTE7Ci0gICAgICAgICAgZWRpdFJvd18tLTsKLSAgICAgICAgICB0YWJsZV8uc2VsZWN0KGVkaXRSb3dfKTsKLSAgICAgICAgfQotICAgICAgICBlZGl0U2VsZWN0aW9uKGVkaXRSb3dfLCBlZGl0Q29sdW1uXyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsU2VsZWN0aW9uKCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVkaXRTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIGludCBzZWxlY3RlZFJvd0luZGV4ID0gdGFibGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoc2VsZWN0ZWRSb3dJbmRleCAhPSAtMSAmJiBjb2x1bW5zXy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICAvLyByZWZyZXNoIHRhYmxlCi0gICAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgICAgICAvLyBDbGVhbiB1cCBhbnkgcHJldmlvdXMgZWRpdG9yIGNvbnRyb2wKLSAgICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICAgIGVkaXRTZWxlY3Rpb24oc2VsZWN0ZWRSb3dJbmRleCwgMCk7Ci0gICAgICB9Ci0gICAgICBjdXJyU2VsZWN0aW9uSW5kZXhfID0gc2VsZWN0ZWRSb3dJbmRleDsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIHRhYmxlVmlld2VyXy5hZGQoZ2V0RWxlbWVudHMobmV3SW5wdXQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTGlzdCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpaW5wdXRFbGVtZW50OwotICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFtsaXN0LnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICBvYmplY3RzW2ldID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYWU1MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFV0aWxzCi17Ci0gIHB1YmxpYyBVdGlscygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9GaWxlU3lzdGVtVVJJKFN0cmluZyByZWxhdGl2ZVBsYXRmb3JtVVJJKQotICB7Ci0gICAgaWYgKHJlbGF0aXZlUGxhdGZvcm1VUkkgIT0gbnVsbCkKLSAgICAgIHJldHVybiB0b0ZpbGVTeXN0ZW1VUkkoUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UocmVsYXRpdmVQbGF0Zm9ybVVSSSkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b0ZpbGVTeXN0ZW1VUkkoSVJlc291cmNlIHJlcykKLSAgewotICAgIGlmIChyZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJUGF0aCBwYXRoID0gcmVzLmdldExvY2F0aW9uKCk7Ci0gICAgICBpZiAocGF0aCAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBwYXRoLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9DbGllbnRSdW50aW1lRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L0NsaWVudFJ1bnRpbWVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YmVkZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L0NsaWVudFJ1bnRpbWVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uUmVxdWlyZWRGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRSdW50aW1lRGVzY3JpcHRvcgotewotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtOwotICBwcml2YXRlIEhhc2h0YWJsZSBhbGxXZWJTZXJ2aWNlQ2xpZW50SW1wbHM7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGFsbFJ1bnRpbWVzOwotICBwcml2YXRlIFN0cmluZyBpZDsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50SW1wbCBjbGllbnRJbXBsZW1lbnRhdGlvblR5cGU7Ci0gIHByaXZhdGUgUnVudGltZURlc2NyaXB0b3IgcnVudGltZTsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UnVudGltZUNsYXNzTmFtZTsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZVJ1bnRpbWUgd2ViU2VydmljZVJ1bnRpbWU7Ci0gIHByaXZhdGUgUmVxdWlyZWRGYWNldFZlcnNpb25bXSByZXF1aXJlZEZhY2V0VmVyc2lvbnM7Ci0gIHByaXZhdGUgU2V0IHByb2plY3RGYWNldFZlcnNpb25zOwotICAKLSAgcHVibGljIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtLCBIYXNodGFibGUgYWxsV2ViU2VydmljZUNsaWVudEltcGxzLCBIYXNodGFibGUgYWxsUnVudGltZXMpCi0gIHsKLSAgICB0aGlzLmVsZW0gPSBlbGVtOwotICAgIHRoaXMuYWxsV2ViU2VydmljZUNsaWVudEltcGxzID0gYWxsV2ViU2VydmljZUNsaWVudEltcGxzOwotICAgIHRoaXMuYWxsUnVudGltZXMgPSBhbGxSdW50aW1lczsKLSAgfQotICAKLSAgcHVibGljIFdlYlNlcnZpY2VDbGllbnRJbXBsIGdldENsaWVudEltcGxlbWVudGF0aW9uVHlwZSgpCi0gIHsKLSAgICBpZiAoY2xpZW50SW1wbGVtZW50YXRpb25UeXBlID09IG51bGwpCi0gICAgewotICAgICBTdHJpbmcgY2xpZW50SW1wbGVtZW50YXRpb25UeXBlSWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgiY2xpZW50SW1wbGVtZW50YXRpb25UeXBlSWQiKTsKLSAgICAgY2xpZW50SW1wbGVtZW50YXRpb25UeXBlID0gKFdlYlNlcnZpY2VDbGllbnRJbXBsKWFsbFdlYlNlcnZpY2VDbGllbnRJbXBscy5nZXQoY2xpZW50SW1wbGVtZW50YXRpb25UeXBlSWQpOwotICAgIH0KLSAgICByZXR1cm4gY2xpZW50SW1wbGVtZW50YXRpb25UeXBlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFJ1bnRpbWVDbGFzc05hbWUoKQotICB7Ci0gICAgaWYgKGNsaWVudFJ1bnRpbWVDbGFzc05hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjbGllbnRSdW50aW1lQ2xhc3NOYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0gICAgfQotICAgIHJldHVybiBjbGllbnRSdW50aW1lQ2xhc3NOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZCA9PSBudWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZXF1aXJlZEZhY2V0VmVyc2lvbltdIGdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpCi0gIHsKLSAgICBpZiAocmVxdWlyZWRGYWNldFZlcnNpb25zID09IG51bGwpCi0gICAgewotICAgICAgQXJyYXlMaXN0IHJlcXVpcmVkRmFjZXRWZXJzaW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY2V0RWxlbXMgPSBlbGVtLmdldENoaWxkcmVuKCJyZXF1aXJlZC1mYWNldC12ZXJzaW9uIik7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0RWxlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uIHJmdiA9IG5ldyBSZXF1aXJlZEZhY2V0VmVyc2lvbigpOwotICAgICAgICBJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldEVsZW1zW2ldLmdldEF0dHJpYnV0ZSgiZmFjZXQiKSk7ICAgICAgICAKLSAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gcHJvamVjdEZhY2V0VmVyc2lvbiA9IHByb2plY3RGYWNldC5nZXRWZXJzaW9uKGZhY2V0RWxlbXNbaV0uZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIikpOwotICAgICAgICByZnYuc2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0RmFjZXRWZXJzaW9uKTsKLSAgICAgICAgU3RyaW5nIGFsbG93TmV3ZXJWYWx1ZSA9IGZhY2V0RWxlbXNbaV0uZ2V0QXR0cmlidXRlKCJhbGxvdy1uZXdlciIpOwotICAgICAgICBpZiAoYWxsb3dOZXdlclZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZnYuc2V0QWxsb3dOZXdlcihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmZ2LnNldEFsbG93TmV3ZXIoQm9vbGVhbi52YWx1ZU9mKGFsbG93TmV3ZXJWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXF1aXJlZEZhY2V0VmVyc2lvbkxpc3QuYWRkKHJmdik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJlcXVpcmVkRmFjZXRWZXJzaW9ucyA9IChSZXF1aXJlZEZhY2V0VmVyc2lvbltdKXJlcXVpcmVkRmFjZXRWZXJzaW9uTGlzdC50b0FycmF5KG5ldyBSZXF1aXJlZEZhY2V0VmVyc2lvbltde30pOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVxdWlyZWRGYWNldFZlcnNpb25zOwotICB9Ci0gIAotICBwdWJsaWMgU2V0IGdldFByb2plY3RGYWNldFZlcnNpb25zKCkKLSAgewotICAgIGlmIChwcm9qZWN0RmFjZXRWZXJzaW9ucyA9PSBudWxsKQotICAgIHsKLSAgICAgcHJvamVjdEZhY2V0VmVyc2lvbnMgPSBuZXcgSGFzaFNldCgpOwotICAgICBSZXF1aXJlZEZhY2V0VmVyc2lvbltdIHJmdiA9IGdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpOwotICAgICBmb3IgKGludCBpPTA7IGk8cmZ2Lmxlbmd0aDsgaSsrKQotICAgICB7Ci0gICAgICAgcHJvamVjdEZhY2V0VmVyc2lvbnMuYWRkKHJmdltpXS5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkpOwotICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBwcm9qZWN0RmFjZXRWZXJzaW9uczsgICAgCi0gIH0gIAotICAKLSAgcHVibGljIFJ1bnRpbWVEZXNjcmlwdG9yIGdldFJ1bnRpbWUoKQotICB7Ci0gICAgaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgIFN0cmluZyBydW50aW1lSWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZUlkIik7Ci0gICAgIHJ1bnRpbWUgPSAoUnVudGltZURlc2NyaXB0b3IpYWxsUnVudGltZXMuZ2V0KHJ1bnRpbWVJZCk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcnVudGltZTsKLSAgfQotICAKLSAgcHVibGljIElXZWJTZXJ2aWNlUnVudGltZSBnZXRXZWJTZXJ2aWNlUnVudGltZSgpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZVJ1bnRpbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlUnVudGltZSA9IChJV2ViU2VydmljZVJ1bnRpbWUpZWxlbS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB3ZWJTZXJ2aWNlUnVudGltZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L0NsaWVudFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9DbGllbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzRiNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L0NsaWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMTYgICAxMjcxMzggcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50VHlwZSB7Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdlYlNlcnZpY2VDbGllbnRJbXBsc187Ci0gICAgCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50SW1wbCB3ZWJTZXJ2aWNlQ2xpZW50SW1wbDsKLQlwcml2YXRlIFN0cmluZ1tdIG1vZHVsZVR5cGVzSW5jbHVkZTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBtb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0JCi0gIAotICAKLQlwdWJsaWMgQ2xpZW50VHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV8sIEhhc2h0YWJsZSB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1fID0gZWxlbV87Ci0gICAgdGhpcy53ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfID0gd2ViU2VydmljZUNsaWVudEltcGxzXzsKLSAgfQotCi0KLQotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZD09bnVsbCkKLSAgICB7Ci0gICAgICBpZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGlkOwotICB9Ci0gIAotCi0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlVHlwZXNFeGNsdWRlKCkKLSAgewotICAgIGlmIChtb2R1bGVUeXBlc0V4Y2x1ZGU9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoIm1vZHVsZVR5cGVzRXhjbHVkZSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBtb2R1bGVUeXBlc0V4Y2x1ZGUgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZVR5cGVzRXhjbHVkZS5sZW5ndGg7IGkrKykKLSAgICAgICAgICBtb2R1bGVUeXBlc0V4Y2x1ZGVbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgfQotICAKLQotCi0KLSAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZVR5cGVzSW5jbHVkZSgpCi0gIHsKLSAgICBpZiAobW9kdWxlVHlwZXNJbmNsdWRlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJtb2R1bGVUeXBlc0luY2x1ZGUiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgbW9kdWxlVHlwZXNJbmNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVUeXBlc0luY2x1ZGUubGVuZ3RoOyBpKyspCi0gICAgICAgICAgbW9kdWxlVHlwZXNJbmNsdWRlW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0KLQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50SW1wbCBnZXRXZWJTZXJ2aWNlQ2xpZW50SW1wbCgpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZUNsaWVudEltcGw9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHdzY2ltcGxJZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaW1wbElkIik7Ci0gICAgICB3ZWJTZXJ2aWNlQ2xpZW50SW1wbCA9IChXZWJTZXJ2aWNlQ2xpZW50SW1wbCl3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfLmdldCh3c2NpbXBsSWQpOwotICAgIH0KLSAgICByZXR1cm4gd2ViU2VydmljZUNsaWVudEltcGw7Ci0gIH0KLSAgCi0KLQotICAvKgotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VDbGllbnRUeXBlSWQoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VDbGllbnRUeXBlSWQ9PW51bGwpCi0gICAgewotICAgICAgd2ViU2VydmljZUNsaWVudFR5cGVJZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgid2ViU2VydmljZUNsaWVudFR5cGVJZCIpOwotICAgIH0KLSAgICByZXR1cm4gd2ViU2VydmljZUNsaWVudFR5cGVJZDsKLSAgfQotICAqLwotCi0KLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzRhNmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotLyoqCi0gKiBAYXV0aG9yIHJzaW5oYQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHQgaW1wbGVtZW50cyBJQ29udGV4dCB7CQotCXByaXZhdGUgV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvOwotCXByaXZhdGUgYm9vbGVhbiBkZXZlbG9wOwotCXByaXZhdGUgYm9vbGVhbiBhc3NlbWJsZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVwbG95OwotCXByaXZhdGUgYm9vbGVhbiBpbnN0YWxsOwotCXByaXZhdGUgYm9vbGVhbiBydW47Ci0JcHJpdmF0ZSBib29sZWFuIGNsaWVudDsKLQlwcml2YXRlIGJvb2xlYW4gdGVzdDsKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaDsKLQlwcml2YXRlIGJvb2xlYW4gb3ZlcldyaXRlRmlsZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUZvbGRlcnM7Ci0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT3V0RmlsZXM7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0QXNzZW1ibGUoKSB7Ci0JCXJldHVybiBhc3NlbWJsZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2hlY2tPdXRGaWxlcygpIHsKLQkJcmV0dXJuIGNoZWNrT3V0RmlsZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldENsaWVudCgpIHsKLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Q3JlYXRlRm9sZGVycygpIHsKLQkJcmV0dXJuIGNyZWF0ZUZvbGRlcnM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldERlcGxveSgpIHsKLQkJcmV0dXJuIGRlcGxveTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcCgpIHsKLQkJcmV0dXJuIGRldmVsb3A7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEluc3RhbGwoKSB7Ci0JCXJldHVybiBpbnN0YWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRPdmVyV3JpdGVGaWxlcygpIHsKLQkJcmV0dXJuIG92ZXJXcml0ZUZpbGVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoKCkgewotCQlyZXR1cm4gcHVibGlzaDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0UnVuKCkgewotCQlyZXR1cm4gcnVuOwotCX0KLQkKLQlwdWJsaWMgV2ViU2VydmljZVNjZW5hcmlvIGdldFNjZW5hcmlvKCkgewotCQlyZXR1cm4gc2NlbmFyaW87Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldFRlc3QoKSB7Ci0JCXJldHVybiB0ZXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFzc2VtYmxlKGJvb2xlYW4gYXNzZW1ibGUpIHsKLQkJdGhpcy5hc3NlbWJsZSA9IGFzc2VtYmxlOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldENoZWNrT3V0RmlsZXMoYm9vbGVhbiBjaGVja091dEZpbGVzKSB7Ci0JCXRoaXMuY2hlY2tPdXRGaWxlcyA9IGNoZWNrT3V0RmlsZXM7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50KGJvb2xlYW4gY2xpZW50KSB7Ci0JCXRoaXMuY2xpZW50ID0gY2xpZW50OwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldENyZWF0ZUZvbGRlcnMoYm9vbGVhbiBjcmVhdGVGb2xkZXJzKSB7Ci0JCXRoaXMuY3JlYXRlRm9sZGVycyA9IGNyZWF0ZUZvbGRlcnM7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95KGJvb2xlYW4gZGVwbG95KSB7Ci0JCXRoaXMuZGVwbG95ID0gZGVwbG95OwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldERldmVsb3AoYm9vbGVhbiBkZXZlbG9wKSB7Ci0JCXRoaXMuZGV2ZWxvcCA9IGRldmVsb3A7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbChib29sZWFuIGluc3RhbGwpIHsKLQkJdGhpcy5pbnN0YWxsID0gaW5zdGFsbDsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRPdmVyV3JpdGVGaWxlcyhib29sZWFuIG92ZXJXcml0ZUZpbGVzKSB7Ci0JCXRoaXMub3ZlcldyaXRlRmlsZXMgPSBvdmVyV3JpdGVGaWxlczsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoKGJvb2xlYW4gcHVibGlzaCkgewotCQl0aGlzLnB1Ymxpc2ggPSBwdWJsaXNoOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldFJ1bihib29sZWFuIHJ1bikgewotCQl0aGlzLnJ1biA9IHJ1bjsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRTY2VuYXJpbyhXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW8pIHsKLQkJdGhpcy5zY2VuYXJpbyA9IHNjZW5hcmlvOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldFRlc3QoYm9vbGVhbiB0ZXN0KSB7Ci0JCXRoaXMudGVzdCA9IHRlc3Q7Ci0JfQkJCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvRmFjZXRNYXRjaENhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvRmFjZXRNYXRjaENhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5M2Q5ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L0ZhY2V0TWF0Y2hDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDEzMSAxMjEwNzEgICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIgKGluaXRpYWwgY3JlYXRpb24pCi0gKiAyMDA2MDQyNiAgIDEzODA1MSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA0MjcgICAxMjY3ODAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkZhY2V0TWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkZhY2V0U2V0c0J5VGVtcGxhdGVDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5SZXF1aXJlZEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIEZhY2V0TWF0Y2hDYWNoZSBjYWNoZXMgcmVzdWx0cyBvZiBjYWxjdWxhdGlvbnMgbWFkZSByZXNwZWN0aW5nCi0gKiB0aGUgc3VpdGFiaWxpdHkgb2YgcHJvamVjdHMgYW5kIHByb2plY3QgdHlwZXMgZm9yIHNlcnZpY2VSdW50aW1lcwotICogYW5kIGNsaWVudFJ1bnRpbWVzLgotICogCi0gKiA8YnIvPjxici8+Ci0gKiBUZW1pbm9sb2d5IHVzZWQgaW4gdGhlIGphdmFkb2MgaW4gdGhpcyBjbGFzczoKLSAqIDx1bD4KLSAqIDxsaT48Yj5zZXJ2aWNlUnVudGltZTwvYj46IGV4dGVuc2lvbiB0byBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuc2VydmljZVJ1bnRpbWVzLgotICogVGhlIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpcyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5TZXJ2aWNlUnVudGltZURlc2NyaXB0b3I8L2xpPgotICogPGxpPjxiPmNsaWVudFJ1bnRpbWU8L2I+OiBleHRlbnNpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFJ1bnRpbWVzLgotICogVGhlIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpcyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5DbGllbnRSdW50aW1lRGVzY3JpcHRvcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqLwotcHVibGljIGNsYXNzIEZhY2V0TWF0Y2hDYWNoZSBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyCi17Ci0gIC8vc2luZ2xlIGluc3RhbmNlIHBlciB3b3JrYmVuY2gKLSAgcHJpdmF0ZSBzdGF0aWMgRmFjZXRNYXRjaENhY2hlIGluc3RhbmNlXzsKLSAgCi0gIAotICAvL1RhYmxlcyByZWxhdGVkIHRvIGV4aXN0aW5nIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKLSAgCi0gIC8vc2VydmljZUZhY2V0TWF0Y2hUYWJsZV86IAotICAvL2tleTogT2JqZWN0IG9mIHR5cGUgU3RyaW5nLgotICAvLyAgICAgRm9yd2FyZCBzbGFzaCBzZXBhcmF0ZWQgY29uY2F0ZW5hdGlvbiBvZiBhIHNlcnZpY2VSdW50aW1lSWQgYW5kIGEgcHJvamVjdE5hbWUgCi0gIC8vICAgICAoZS5nLiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi5qYXZhL3dwKS4KLSAgLy92YWx1ZTogT2JqZWN0IG9mIHR5cGUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5GYWNldE1hdGNoZXIuCi0gIC8vICAgICAgIFRoZSBGYWNldE1hdGNoZXIgY29udGFpbnMgdGhlIG1hdGNoaW5nIGNoYXJhY3RlcmlzdGljcyBjYWxjdWxhdGVkIGZvciB0aGUgCi0gIC8vICAgICAgIHNlcnZpY2VSdW50aW1lIGFuZCBwcm9qZWN0IGluIHRoZSBrZXkuCi0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZpY2VGYWNldE1hdGNoVGFibGVfOwotICAKLSAgLy9zZXJ2aWNlVGFibGVLZXlzQnlQcm9qZWN0TmFtZV86IAotICAvL2tleTogT2JqZWN0IG9mIHR5cGUgU3RyaW5nLgotICAvLyAgICAgcHJvamVjdCBuYW1lIChlLmcuIHdwKQotICAvL3ZhbHVlOiBTZXQgb2YgZWxlbWVudHMgb2YgdHlwZSBTdHJpbmcuIFRoZSBTdHJpbmdzIGluIHRoZSBTZXQgYXJlIGtleXMgZnJvbSB0aGUgc2VydmljZUZhY2V0TWF0Y2hUYWJsZV8gCi0gIC8vICAgICAgIHRoYXQgY29udGFpbiB0aGUgcHJvamVjdCBuYW1lIChlLmcuIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLmphdmEvd3ApLiBVc2VkIHRvIHJhcGlkbHkKLSAgLy8gICAgICAgZGVsZXRlIGVudHJpZXMgZnJvbSBzZXJ2aWNlRmFjZXRNYXRjaFRhYmxlXyBhZnRlciBhIHByb2plY3QgaXMgZGVsZXRlZCBmcm9tIHRoZSB3b3Jrc3BhY2UuCi0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZpY2VUYWJsZUtleXNCeVByb2plY3ROYW1lXzsKLSAgCi0gIC8vY2xpZW50RmFjZXRNYXRjaFRhYmxlXzsKLSAgLy9rZXk6IE9iamVjdCBvZiB0eXBlIFN0cmluZy4KLSAgLy8gICAgIGZvcndhcmQgc2xhc2ggc2VwYXJhdGVkIGNvbmNhdGVuYXRpb24gb2YgYSBjbGllbnRSdW50aW1lSWQgYW5kIGEgcHJvamVjdE5hbWUgCi0gIC8vICAgICAoZS5nLiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5qYXZhL3dwKQotICAvL3ZhbHVlOiBPYmplY3Qgb2YgdHlwZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkZhY2V0TWF0Y2hlcgotICAvLyAgICAgICBUaGUgRmFjZXRNYXRjaGVyIGNvbnRhaW5zIHRoZSBtYXRjaGluZyBjaGFyYWN0ZXJpc3RpY3MgY2FsY3VsYXRlZCBmb3IgdGhlIAotICAvLyAgICAgICBjbGllbnRSdW50aW1lIGFuZCBwcm9qZWN0IGluIHRoZSBrZXkuCi0gIHByaXZhdGUgSGFzaHRhYmxlIGNsaWVudEZhY2V0TWF0Y2hUYWJsZV87Ci0gIAotICAvL2NsaWVudFRhYmxlS2V5c0J5UHJvamVjdE5hbWVfCi0gIC8va2V5OiBPYmplY3Qgb2YgdHlwZSBTdHJpbmcuCi0gIC8vICAgICBwcm9qZWN0IG5hbWUgKGUuZy4gd3ApCi0gIC8vdmFsdWU6IFNldCBvZiBlbGVtZW50cyBvZiB0eXBlIFN0cmluZy4gVGhlIFN0cmluZ3MgaW4gdGhlIFNldCBhcmUga2V5cyBmcm9tIHRoZSBjbGllbnRGYWNldE1hdGNoVGFibGVfIAotICAvLyAgICAgICB0aGF0IGNvbnRhaW4gdGhlIHByb2plY3QgbmFtZSAoZS5nLiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5qYXZhL3dwKS4gVXNlZCB0byByYXBpZGx5Ci0gIC8vICAgICAgIGRlbGV0ZSBlbnRyaWVzIGZyb20gY2xpZW50RmFjZXRNYXRjaFRhYmxlXyBhZnRlciBhIHByb2plY3QgaXMgZGVsZXRlZCBmcm9tIHRoZSB3b3Jrc3BhY2UuCi0gIHByaXZhdGUgSGFzaHRhYmxlIGNsaWVudFRhYmxlS2V5c0J5UHJvamVjdE5hbWVfOwotICAKLSAgLy9wcm9qZWN0RW50cmllc1RvRGVsZXRlXzogZWxlbWVudHMgb2YgdHlwZSBTdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgcHJvamVjdHMgdGhhdCBoYXZlCi0gIC8vYmVlbiBkZWxldGVkIGZyb20gdGhlIHdvcmtzcGFjZSBidXQgdGhlaXIgY29ycmVzcG9uZGluZyBlbnRyaWVzIGZyb20gc2VydmljZUZhY2V0TWF0Y2hUYWJsZV8gCi0gIC8vYW5kIGNsaWVudEZhY2V0TWF0Y2hUYWJsZV8gaGF2ZSB5ZXQgdG8gYmUgZGVsZXRlZC4KLSAgcHJpdmF0ZSBMaXN0IHByb2plY3RFbnRyaWVzVG9EZWxldGVfOwotICAgIAotICAKLSAgCi0gIC8vVGFibGVzIHJlbGF0ZWQgdG8gdGVtcGxhdGVzICAKLSAgCi0gIC8vdGVtcGxhdGVzQnlTZXJ2aWNlUnVudGltZUlkXzoKLSAgLy9rZXk6IE9iamVjdCBvZiB0eXBlIFN0cmluZy4KLSAgLy8gICAgIHNlcnZpY2VSdW50aW1lIGlkCi0gIC8vdmFsdWU6IFNldCBvZiBlbGVtZW50cyBvZiB0eXBlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlICAgCi0gIC8vICAgICAgIFRoaXMgdGhlIHNldCBvZiB0ZW1wbGF0ZXMgdGhhdCBzdXBwb3J0IHRoZSBzZXJ2aWNlUnVudGltZSBpZGVudGlmaWVkIGJ5IHRoZSBrZXkuCi0gIHByaXZhdGUgSGFzaHRhYmxlIHRlbXBsYXRlc0J5U2VydmljZVJ1bnRpbWVJZF87Ci0gIAotICAvL3RlbXBsYXRlc0J5Q2xpZW50UnVudGltZUlkXwotICAvL2tleTogT2JqZWN0IG9mIHR5cGUgU3RyaW5nLgotICAvLyAgICAgY2xpZW50UnVudGltZSBpZAotICAvL3ZhbHVlOiBTZXQgb2YgZWxlbWVudHMgb2YgdHlwZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZQotICAvLyAgICAgICBUaGlzIHRoZSBzZXQgb2YgdGVtcGxhdGVzIHRoYXQgc3VwcG9ydCB0aGUgY2xpZW50UnVudGltZSBpZGVudGlmaWVkIGJ5IHRoZSBrZXkuCi0gIHByaXZhdGUgSGFzaHRhYmxlIHRlbXBsYXRlc0J5Q2xpZW50UnVudGltZUlkXzsKLSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgKiAKLSAgICogQHJldHVybiBBIHNpbmdsZXRvbiBGYWNldE1hdGNoQ2FjaGUgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRmFjZXRNYXRjaENhY2hlIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgRmFjZXRNYXRjaENhY2hlKCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9ICAKLSAgCi0gIHByaXZhdGUgdm9pZCBsb2FkKCkKLSAgewotICAgIHNlcnZpY2VGYWNldE1hdGNoVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHNlcnZpY2VUYWJsZUtleXNCeVByb2plY3ROYW1lXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBjbGllbnRGYWNldE1hdGNoVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOyAgICAKLSAgICBjbGllbnRUYWJsZUtleXNCeVByb2plY3ROYW1lXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwcm9qZWN0RW50cmllc1RvRGVsZXRlXyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB0ZW1wbGF0ZXNCeUNsaWVudFJ1bnRpbWVJZF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGVtcGxhdGVzQnlTZXJ2aWNlUnVudGltZUlkXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICAvL0xpc3RlbiBmb3IgZGVsZXRpb25zIG9mIHByb2plY3RzIGluIG9yZGVyIHRvIGRlbGV0ZSBhbGwgZW50cmllcyBpbgotICAgIC8vSGFzaHRhYmxlcyBmb3IgdGhlIGRlbGV0ZWQgcHJvamVjdC4KLSAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKTsKLSAgfQotICAKLQotICAvKgotICAgKiBSZXR1cm5zIHRoZSBGYWNldE1hdGNoZXIgcmVzdWx0aW5nIGZyb20gbWF0Y2hpbmcgYSBzZXJ2aWNlUnVudGltZSBvciBjbGllbnRSdW50aW1lIHdpdGggYW4gZXhpc3RpbmcgcHJvamVjdC4KLSAgICogQHBhcmFtIGlzQ2xpZW50IHRydWUgaWYgcnVudGltZUlkIGlzIGEgY2xpZW50UnVudGltZUlkLiBmYWxzZSBpZiBydW50aW1lSWQgaXMgYSBzZXJ2aWNlUnVudGltZUlkLgotICAgKiBAcGFyYW0gcnVudGltZUlkIHRoZSBpZCBvZiBhIGNsaWVudFJ1bnRpbWUgaWYgaXNDbGllbnQgaXMgdHJ1ZSBvciB0aGUgaWQgb2YgYSBzZXJ2aWNlUnVudGltZSBpZgotICAgKiBpc0NsaWVudCBpcyBmYWxzZS4KLSAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIHByb2plY3QuCi0gICAqIAotICAgKiBAcmV0dXJucyBGYWNldE1hdGNoZXIgcmVzdWx0aW5nIGZyb20gY2FsbGluZyBGYWNldFV0aWxzLm1hdGNoKC4uKSB1c2luZyB0aGUgc2VydmljZVJ1bnRpbWUgb3IgY2xpZW50UnVudGltZSBpZAotICAgKiBhbmQgdGhlIHByb2plY3QgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QuIE5vbi1mYWNldGVkIGV4aXN0aW5nIHByb2plY3RzIHdpbGwgYWx3YXlzIHJlc3VsdAotICAgKiBpbiBhIEZhY2V0TWF0Y2hlciB3aXRoIGlzTWF0Y2goKSBlcXVhbCB0byBmYWxzZSAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIEphdmEgcHJvamVjdHMgd2hpY2ggYXJlIGEgc3BlY2lhbCBjYXNlIAotICAgKiAtIHNlZSBGYWNldFV0aWxzLmdldEZhY2V0c0ZvclByb2plY3QoKSkuCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIEZhY2V0TWF0Y2hlciBnZXRNYXRjaEZvclByb2plY3QoYm9vbGVhbiBpc0NsaWVudCwgU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIHByb2plY3ROYW1lKQotICB7ICAgIAotICAgIC8vRGVsZXRlIGVudHJpZXMgZnJvbSB0YWJsZXMgaWYgdGhlcmUgYXJlIGRlbGV0aW9ucyBwZW5kaW5nLgotICAgIGlmIChwcm9qZWN0RW50cmllc1RvRGVsZXRlXy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHByb2plY3RJdHIgPSBwcm9qZWN0RW50cmllc1RvRGVsZXRlXy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUocHJvamVjdEl0ci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZVRvRGVsZXRlID0gKFN0cmluZylwcm9qZWN0SXRyLm5leHQoKTsKLSAgICAgICAKLSAgICAgICAgLy9EZWxldGUgZW50cmllcyBmcm9tIGNsaWVudCB0YWJsZQotICAgICAgICByZW1vdmVUYWJsZUVudHJpZXNGb3JQcm9qZWN0KHRydWUsIHByb2plY3ROYW1lVG9EZWxldGUpOwotICAgICAgICAKLSAgICAgICAgLy9EZWxldGUgZW50cmllcyBmcm9tIHNlcnZpY2UgdGFibGUKLSAgICAgICAgcmVtb3ZlVGFibGVFbnRyaWVzRm9yUHJvamVjdChmYWxzZSwgcHJvamVjdE5hbWVUb0RlbGV0ZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vQ2xlYXIgdGhlIHByb2plY3RFbnRyaWVzVG9EZWxldGUgbGlzdAotICAgICAgcHJvamVjdEVudHJpZXNUb0RlbGV0ZV8uY2xlYXIoKTsKLSAgICB9Ci0gICAgCi0gICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgRmFjZXRNYXRjaGVyIGZtID0gbnVsbDsKLSAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0gICAgewotICAgICAgU3RyaW5nIGtleSA9IGdldEtleShydW50aW1lSWQsIHByb2plY3ROYW1lKTsKLSAgICAgIGlmIChpc0NsaWVudCkKLSAgICAgIHsKLSAgICAgICAgZm0gPSAoRmFjZXRNYXRjaGVyKSBjbGllbnRGYWNldE1hdGNoVGFibGVfLmdldChrZXkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmbSA9IChGYWNldE1hdGNoZXIpIHNlcnZpY2VGYWNldE1hdGNoVGFibGVfLmdldChrZXkpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZm0gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhpcyBjb21iaW5hdGlvbiBoYXMgbm90IHlldCBiZWVuIGNhbGN1bGF0ZWQgYW5kIGNhY2hlZCBzbyBjYWxjdWxhdGUgaXQgYW5kIGNhY2hlIGl0LiAgICAgICAgCi0gICAgICAgIGZtID0gY2FsY3VsYXRlRmFjZXRNYXRjaGVyKGlzQ2xpZW50LCBydW50aW1lSWQsIHByb2plY3ROYW1lKTsgICAgICAgICAKLSAgICAgICAgaWYgKGlzQ2xpZW50KQotICAgICAgICB7Ci0gICAgICAgICAgY2xpZW50RmFjZXRNYXRjaFRhYmxlXy5wdXQoa2V5LGZtKTsgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNlcnZpY2VGYWNldE1hdGNoVGFibGVfLnB1dChrZXksIGZtKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVUYWJsZU9mS2V5cyhpc0NsaWVudCwga2V5LCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgIAotICAgICAgfSBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZSBwcm9qZWN0J3MgZmFjZXRzIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZQotICAgICAgICAvLyBmYWNldHMgd2VyZSBjYWxjdWxhdGVkLCByZWZyZXNoIHRoZSBmYWNldE1hdGNoZXIuICAgICAgICAKLSAgICAgICAgU2V0IGN1cnJlbnRGYWNldFZlcnNpb25zID0gRmFjZXRVdGlscy5nZXRGYWNldHNGb3JQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgU2V0IHByZXZpb3VzRmFjZXRWZXJzaW9ucyA9IGZtLmdldEZhY2V0c1Rlc3RlZCgpOwotICAgICAgICBpZiAoIWN1cnJlbnRGYWNldFZlcnNpb25zLmVxdWFscyhwcmV2aW91c0ZhY2V0VmVyc2lvbnMpKQotICAgICAgICB7Ci0gICAgICAgICAgLy9yZWNhbGN1bGF0ZSBhbmQgY2FjaGUgdGhlIEZhY2V0TWF0Y2hlcgotICAgICAgICAgIGZtID0gY2FsY3VsYXRlRmFjZXRNYXRjaGVyKGlzQ2xpZW50LCBydW50aW1lSWQsIHByb2plY3ROYW1lKTsKLSAgICAgICAgICBpZiAoaXNDbGllbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2xpZW50RmFjZXRNYXRjaFRhYmxlXy5wdXQoa2V5LGZtKTsgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZpY2VGYWNldE1hdGNoVGFibGVfLnB1dChrZXksIGZtKTsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZm07ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogVXBkYXRlcyBzZXJ2aWNlVGFibGVLZXlzQnlQcm9qZWN0TmFtZV8gb3IgY2xpZW50VGFibGVLZXlzQnlQcm9qZWN0TmFtZV8gd2l0aAotICAgKiB0aGUgcHJvdmlkZWQgcHJvamVjdCBuYW1lIGFuZCBrZXkuIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IGVudHJ5IGlzIAotICAgKiBhZGRlZCB0byBzZXJ2aWNlRmFjZXRNYXRjaFRhYmxlXyBvciBjbGllbnRGYWNldE1hdGNoVGFibGVfLgotICAgKiBAcGFyYW0gaXNDbGllbnQgdHJ1ZSBpZiBydW50aW1lSWQgaXMgYSBjbGllbnRSdW50aW1lSWQuIGZhbHNlIGlmIHJ1bnRpbWVJZCBpcyBhIHNlcnZpY2VSdW50aW1lSWQuCi0gICAqIEBwYXJhbSBrZXkgCi0gICAqIEBwYXJhbSBwcm9qZWN0TmFtZQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmxlT2ZLZXlzKGJvb2xlYW4gaXNDbGllbnQsIFN0cmluZyBrZXksIFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAgIFNldCBzZXRPZktleXNGb3JQcm9qZWN0TmFtZSA9IG51bGw7Ci0gICAgaWYgKGlzQ2xpZW50KQotICAgIHsKLSAgICAgIHNldE9mS2V5c0ZvclByb2plY3ROYW1lID0gKFNldCljbGllbnRUYWJsZUtleXNCeVByb2plY3ROYW1lXy5nZXQocHJvamVjdE5hbWUpOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0T2ZLZXlzRm9yUHJvamVjdE5hbWUgPSAoU2V0KXNlcnZpY2VUYWJsZUtleXNCeVByb2plY3ROYW1lXy5nZXQocHJvamVjdE5hbWUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoc2V0T2ZLZXlzRm9yUHJvamVjdE5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL0FkZCBhbiBlbnRyeSBpbiB0aGUgdGFibGUgZm9yIHRoaXMgcHJvamVjdC4KLSAgICAgIFNldCBrZXlzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgIGtleXMuYWRkKGtleSk7Ci0gICAgICBpZiAoaXNDbGllbnQpCi0gICAgICB7Ci0gICAgICAgIGNsaWVudFRhYmxlS2V5c0J5UHJvamVjdE5hbWVfLnB1dChwcm9qZWN0TmFtZSwga2V5cyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2VUYWJsZUtleXNCeVByb2plY3ROYW1lXy5wdXQocHJvamVjdE5hbWUsIGtleXMpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9VcGRhdGUgdGhlIGVudHJ5IGluIHRoZSB0YWJsZSBmb3IgdGhpcyBwcm9qZWN0LgotICAgICAgc2V0T2ZLZXlzRm9yUHJvamVjdE5hbWUuYWRkKGtleSk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUge0BsaW5rIEZhY2V0TWF0Y2hlcn0gY2FsY3VsYXRlZCBmb3IgdGhlIGdpdmVuIHNlcnZpY2VSdW50aW1lIG9yIGNsaWVudFJ1bnRpbWUgYW5kIHByb2plY3QKLSAgICogQHBhcmFtIGlzQ2xpZW50IHRydWUgaWYgcnVudGltZUlkIGlzIGEgY2xpZW50UnVudGltZUlkLiBmYWxzZSBpZiBydW50aW1lSWQgaXMgYSBzZXJ2aWNlUnVudGltZUlkLgotICAgKiBAcGFyYW0gcnVudGltZUlkIHRoZSBpZCBvZiBhIGNsaWVudFJ1bnRpbWUgaWYgaXNDbGllbnQgaXMgdHJ1ZSBvciB0aGUgaWQgb2YgYSBzZXJ2aWNlUnVudGltZSBpZgotICAgKiBpc0NsaWVudCBpcyBmYWxzZS4KLSAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIHByb2plY3QuCi0gICAqIEByZXR1cm4gRmFjZXRNYXRjaGVyIHJlc3VsdGluZyBmcm9tIGNhbGxpbmcgRmFjZXRVdGlscy5tYXRjaCguLikgdXNpbmcgdGhlIHNlcnZpY2VSdW50aW1lIG9yIGNsaWVudFJ1bnRpbWUgaWQKLSAgICogYW5kIHRoZSBwcm9qZWN0IG5hbWUuIFJldHVybnMgbnVsbCBpZiB0aGUgcHJvamVjdCBkb2Vzbid0IGV4aXN0LiBOb24tZmFjZXRlZCBleGlzdGluZyBwcm9qZWN0cyB3aWxsIGFsd2F5cyByZXN1bHQKLSAgICogaW4gYSBGYWNldE1hdGNoZXIgd2l0aCBpc01hdGNoKCkgZXF1YWwgdG8gZmFsc2UgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBKYXZhIHByb2plY3RzIHdoaWNoIGFyZSBhIHNwZWNpYWwgY2FzZSAKLSAgICogLSBzZWUgRmFjZXRVdGlscy5nZXRGYWNldHNGb3JQcm9qZWN0KCkpLgotICAgKi8KLSAgcHJpdmF0ZSBGYWNldE1hdGNoZXIgY2FsY3VsYXRlRmFjZXRNYXRjaGVyKGJvb2xlYW4gaXNDbGllbnQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAgIEZhY2V0TWF0Y2hlciBmbSA9IG51bGw7Ci0gICAgUmVxdWlyZWRGYWNldFZlcnNpb25bXSByZnZzID0gbnVsbDsKLSAgICBpZiAoaXNDbGllbnQpCi0gICAgewotICAgICAgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzYyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yQnlJZChydW50aW1lSWQpOwotICAgICAgcmZ2cyA9IGRlc2MuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IgZGVzYyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvckJ5SWQocnVudGltZUlkKTsKLSAgICAgIHJmdnMgPSBkZXNjLmdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpOwotICAgIH0KLSAgICAKLSAgICBTZXQgZmFjZXRWZXJzaW9ucyA9IEZhY2V0VXRpbHMuZ2V0RmFjZXRzRm9yUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgaWYgKGZhY2V0VmVyc2lvbnMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmbSA9IG5ldyBGYWNldE1hdGNoZXIoKTsKLSAgICAgIGZtLnNldE1hdGNoKGZhbHNlKTsKLSAgICAgIHJldHVybiBmbTsKLSAgICB9ICAgIAotICAgIAotICAgIGZtID0gRmFjZXRVdGlscy5tYXRjaChyZnZzLCBmYWNldFZlcnNpb25zKTsKLSAgICAKLSAgICAvLyBDaGVjayBpZiB0aGUgZmFjZXQgcnVudGltZSByZXF1aXJlZCBieSB0aGUgcmVxdWlyZWQgZmFjZXQgaXMgc3VwcG9ydGVkCi0gICAgLy8gYnkgdGhlIHByb2plY3Qgd2l0aG91dCBjaGFuaW5nIGl0J3MgY3VycmVudCBmYWNldCBydW50aW1lCi0gICAgCi0gICAgSVJ1bnRpbWUgZlByb2plY3RSdW50aW1lID0gRmFjZXRVdGlscy5nZXRGYWNldFJ1bnRpbWVGb3JQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICBpZiAoZlByb2plY3RSdW50aW1lICE9IG51bGwpIHsKLSAgICAJU3RyaW5nIGZQcm9qZWN0UnVudGltZU5hbWUgPSBmUHJvamVjdFJ1bnRpbWUuZ2V0TmFtZSgpOwotICAgIAlib29sZWFuIHByb2plY3RTdXBwb3J0UmVxdWlyZWRGYWNldFJ1bnRpbWUgPSBmYWxzZTsKLSAgICAJU2V0IHJ0cyA9IEZhY2V0VXRpbHMuZ2V0UnVudGltZXMocmZ2cyk7Ci0gICAgCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBydHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpICYmICFwcm9qZWN0U3VwcG9ydFJlcXVpcmVkRmFjZXRSdW50aW1lOykgewotICAgIAkJSVJ1bnRpbWUgZlJlcXVpcmVkUnVudGltZSA9IChJUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotICAgIAkJaWYgKGZSZXF1aXJlZFJ1bnRpbWUgIT0gbnVsbCkgewotICAgIAkJCWlmIChmUmVxdWlyZWRSdW50aW1lLmdldE5hbWUoKS5lcXVhbHMoZlByb2plY3RSdW50aW1lTmFtZSkpIHsKLSAgICAJCQkJcHJvamVjdFN1cHBvcnRSZXF1aXJlZEZhY2V0UnVudGltZSA9IHRydWU7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0KLSAgICAJLy8gaWYgcHJvamVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1aXJlZCBmYWNldCBydW50aW1lLCBzZXQgRmFjZXRNYXRjaCBtYXRjaCB0byBmYWxzZQotICAgIAlpZiAoIXByb2plY3RTdXBwb3J0UmVxdWlyZWRGYWNldFJ1bnRpbWUpIHsKLSAgICAJCWZtLnNldE1hdGNoKGZhbHNlKTsKLSAgICAJfQotICAgIH0KLSAgICByZXR1cm4gZm07Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRLZXkoU3RyaW5nIGEsIFN0cmluZyBiKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGtleXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGtleXNiLmFwcGVuZChhKTsKLSAgICBrZXlzYi5hcHBlbmQoIi8iKTsKLSAgICBrZXlzYi5hcHBlbmQoYik7ICAgIAotICAgIHJldHVybiBrZXlzYi50b1N0cmluZygpOyAgICAKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmVtb3ZlcyBhbGwgdGFibGUgZW50cmllcyBpbiB0aGlzIGNhY2hlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotICAgKiBAcGFyYW0gaXNDbGllbnQgdHJ1ZSB0byByZW1vdmUgZW50cmllcyBmcm9tIGNsaWVudCBzaWRlIHRhYmxlcy4gZmFsc2UgdG8gcmVtb3ZlIGVudHJpZXMgZnJvbSBzZXJ2aWNlIHNpZGUgdGFibGVzCi0gICAqIEBwYXJhbSBwcm9qZWN0TmFtZQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRhYmxlRW50cmllc0ZvclByb2plY3QoYm9vbGVhbiBpc0NsaWVudCwgU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gICAgLy9GaXJzdCByZW1vdmUgdGhlIGVudHJpZXMgZnJvbSBjbGllbnRGYWNldE1hdGNoVGFibGVfIG9yIHNlcnZpY2VGYWNldE1hdGNoVGFibGVfCi0gICAgLy90aGF0IGhhdmUga2V5cyBjb250YWluaW5nIHRoaXMgcHJvamVjdCBuYW1lLgotICAgIFNldCBzZXRPZktleXNGb3JQcm9qZWN0TmFtZSA9IG51bGw7Ci0gICAgaWYgKGlzQ2xpZW50KQotICAgIHsKLSAgICAgIHNldE9mS2V5c0ZvclByb2plY3ROYW1lID0gKFNldCljbGllbnRUYWJsZUtleXNCeVByb2plY3ROYW1lXy5nZXQocHJvamVjdE5hbWUpOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0T2ZLZXlzRm9yUHJvamVjdE5hbWUgPSAoU2V0KXNlcnZpY2VUYWJsZUtleXNCeVByb2plY3ROYW1lXy5nZXQocHJvamVjdE5hbWUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoc2V0T2ZLZXlzRm9yUHJvamVjdE5hbWUgIT0gbnVsbCkKLSAgICB7IAotICAgICAgSXRlcmF0b3Iga2V5c0l0ciA9IHNldE9mS2V5c0ZvclByb2plY3ROYW1lLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoa2V5c0l0ci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXNJdHIubmV4dCgpOwotICAgICAgICBpZiAoaXNDbGllbnQpCi0gICAgICAgIHsgCi0gICAgICAgICAgY2xpZW50RmFjZXRNYXRjaFRhYmxlXy5yZW1vdmUoa2V5KTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmljZUZhY2V0TWF0Y2hUYWJsZV8ucmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9TZWNvbmQsIHJlbW92ZSB0aGUgZW50cnkgaW4gY2xpZW50VGFibGVLZXlzQnlQcm9qZWN0TmFtZV8gb3Igc2VydmljZVRhYmxlS2V5c0J5UHJvamVjdE5hbWVfCi0gICAgICAvL3dpdGggdGhpcyBwcm9qZWN0TmFtZSBhcyB0aGUga2V5LgotICAgICAgaWYgKGlzQ2xpZW50KQotICAgICAgewotICAgICAgICBjbGllbnRUYWJsZUtleXNCeVByb2plY3ROYW1lXy5yZW1vdmUocHJvamVjdE5hbWUpOyAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2VUYWJsZUtleXNCeVByb2plY3ROYW1lXy5yZW1vdmUocHJvamVjdE5hbWUpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBzZXQgb2YgdGVtcGxhdGVzIHN1cHBvcnRlZCBieSB0aGUgZ2l2ZW4gY2xpZW50UnVudGltZQotICAgKiBAcGFyYW0gY2xpZW50UnVudGltZUlkIGlkIG9mIGEgY2xpZW50UnVudGltZQotICAgKiBAcmV0dXJucyBTZXQgKGVsZW1lbnR0eXBlOiBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSkKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2V0IGdldFRlbXBsYXRlc0ZvckNsaWVudFJ1bnRpbWUoU3RyaW5nIGNsaWVudFJ1bnRpbWVJZCkKLSAgewotICAgIFNldCB0ZW1wbGF0ZXMgPSAoU2V0KXRlbXBsYXRlc0J5Q2xpZW50UnVudGltZUlkXy5nZXQoY2xpZW50UnVudGltZUlkKTsKLSAgICBpZiAodGVtcGxhdGVzICE9IG51bGwpCi0gICAgewotICAgICAgLy9SZXR1cm4gdGhlIGNhY2hlZCBzZXQgb2YgdGVtcGxhdGVzLgotICAgICAgcmV0dXJuIHRlbXBsYXRlczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vQ2FsY3VsYXRlIHRoZSB0ZW1wbGF0ZXMsIGNhY2hlIHRoZW0gZm9yIGxhdGVyIHVzZSwgYW5kIHJldHVybiB0aGVtLgotICAgICAgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzYyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yQnlJZChjbGllbnRSdW50aW1lSWQpOwotICAgICAgU2V0IHZhbGlkVGVtcGxhdGVzID0gZ2V0VGVtcGxhdGVzKGRlc2MuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCkpOwotICAgICAgdGVtcGxhdGVzQnlDbGllbnRSdW50aW1lSWRfLnB1dChjbGllbnRSdW50aW1lSWQsIHZhbGlkVGVtcGxhdGVzKTsKLSAgICAgIHJldHVybiB2YWxpZFRlbXBsYXRlczsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2V0IG9mIHRlbXBsYXRlcyBzdXBwb3J0ZWQgYnkgdGhlIGdpdmVuIHNlcnZpY2VSdW50aW1lCi0gICAqIEBwYXJhbSBzZXJ2aWNlUnVudGltZUlkIGlkIG9mIGEgc2VydmljZVJ1bnRpbWUKLSAgICogQHJldHVybnMgU2V0IChlbGVtZW50dHlwZTogSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUpCi0gICAqLyAgCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2V0IGdldFRlbXBsYXRlc0ZvclNlcnZpY2VSdW50aW1lKFN0cmluZyBzZXJ2aWNlUnVudGltZUlkKQotICB7Ci0gICAgU2V0IHRlbXBsYXRlcyA9IChTZXQpdGVtcGxhdGVzQnlTZXJ2aWNlUnVudGltZUlkXy5nZXQoc2VydmljZVJ1bnRpbWVJZCk7Ci0gICAgaWYgKHRlbXBsYXRlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vUmV0dXJuIHRoZSBjYWNoZWQgc2V0IG9mIHRlbXBsYXRlcy4KLSAgICAgIHJldHVybiB0ZW1wbGF0ZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL0NhbGN1bGF0ZSB0aGUgdGVtcGxhdGVzLCBjYWNoZSB0aGVtIGZvciBsYXRlciB1c2UsIGFuZCByZXR1cm4gdGhlbS4KLSAgICAgIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChzZXJ2aWNlUnVudGltZUlkKTsKLSAgICAgIFNldCB2YWxpZFRlbXBsYXRlcyA9IGdldFRlbXBsYXRlcyhkZXNjLmdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpKTsKLSAgICAgIHRlbXBsYXRlc0J5U2VydmljZVJ1bnRpbWVJZF8ucHV0KHNlcnZpY2VSdW50aW1lSWQsIHZhbGlkVGVtcGxhdGVzKTsKLSAgICAgIHJldHVybiB2YWxpZFRlbXBsYXRlczsKLSAgICB9Ci0gIH0KLSAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgdGVtcGxhdGVzIHRoYXQgc3VwcG9ydGVkIHRoZSBnaXZlbiByZXF1aXJlZCBmYWNldCB2ZXJzaW9ucy4KLSAgICogQHBhcmFtIHJlcXVpcmVkRmFjZXRWZXJzaW9ucwotICAgKiBAcmV0dXJuIFNldCBjb250YWluaW5nIGVsZW1ldHMgb2YgdHlwZSB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9LgotICAgKi8KLSAgcHJpdmF0ZSBTZXQgZ2V0VGVtcGxhdGVzKFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmVxdWlyZWRGYWNldFZlcnNpb25zKQotICB7Ci0gICAgU2V0IHRlbXBsYXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgCi0gICAgZm9yKCBJdGVyYXRvciBpdHIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZXMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSkgaXRyLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlSWQgPSB0ZW1wbGF0ZS5nZXRJZCgpOwotICAgICAgICBpZiAodGVtcGxhdGVJZC5pbmRleE9mKCJlYXIiKSA9PSAtMSAmJiB0ZW1wbGF0ZUlkLmluZGV4T2YoIndzdC53ZWIiKSA9PSAtMSkgLy9Eb24ndCBpbmNsdWRlIHRoZSBFQVJzISEKLSAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgU2V0W10gY29tYmluYXRpb25zID0gRmFjZXRTZXRzQnlUZW1wbGF0ZUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0RmFjZXRWZXJzaW9uQ29tYmluYXRpb25zRnJvbVRlbXBsYXRlKHRlbXBsYXRlSWQpOwotICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjb21iaW5hdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgRmFjZXRNYXRjaGVyIGZtID0gRmFjZXRVdGlscy5tYXRjaChyZXF1aXJlZEZhY2V0VmVyc2lvbnMsIGNvbWJpbmF0aW9uc1tpXSk7Ci0gICAgICAgICAgICBpZiAoZm0uaXNNYXRjaCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL0ZvdW5kIGEgY29tYmluYXRpb24gdGhhdCB3b3JrZWQuIEFkZCB0aGUgdGVtcGxhdGUgdG8gdGhlIGxpc3QgYW5kIG1vdmUgb24uCi0gICAgICAgICAgICAgIHRlbXBsYXRlcy5hZGQodGVtcGxhdGUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIHJldHVybiB0ZW1wbGF0ZXM7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpCi0gICAgewotICAgICAgSVJlc291cmNlIHByb2plY3RSZXNvdXJjZSA9IGV2ZW50LmdldFJlc291cmNlKCk7Ci0gICAgICBpZiAocHJvamVjdFJlc291cmNlIT1udWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0UmVzb3VyY2UuZ2V0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgLy9BZGQgdGhpcyBwcm9qZWN0IG5hbWUgdG8gdGhlIGxpc3Qgb2YgcHJvamVjdCBlbnRyaWVzCi0gICAgICAgIC8vdG8gZGVsZXRlLiBOZXh0IHRpbWUgZ2V0TWF0Y2hGb3JQcm9qZWN0IGlzIGNhbGxlZCBhbGwKLSAgICAgICAgLy9lbnRyaWVzIGZvciB0aGlzIHByb2plY3QgZnJvbSBhbGwgdGFibGVzIGluIHRoaXMgY2FjaGUgCi0gICAgICAgIC8vd2lsbCBiZSBkZWxldGVkLgotICAgICAgICBwcm9qZWN0RW50cmllc1RvRGVsZXRlXy5hZGQocHJvamVjdE5hbWUpOwotICAgICAgfQotICAgIH0gICAgCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1J1bnRpbWVEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvUnVudGltZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyYmIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvUnVudGltZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMSAgIDExOTExMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVEZXNjcmlwdG9yCi17Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbTsKLSAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gIHByaXZhdGUgU3RyaW5nIGxhYmVsOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJSZXF1aXJlZFN0cmluZzsKLSAgcHJpdmF0ZSBib29sZWFuIHNlcnZlclJlcXVpcmVkOwotICAKLQotICBwdWJsaWMgUnVudGltZURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0pCi0gIHsKLSAgICB0aGlzLmVsZW0gPSBlbGVtOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZCA9PSBudWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgfQotICAgIHJldHVybiBpZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gIHsKLSAgICBpZiAobGFiZWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotICAgIH0KLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRKMmVlTGV2ZWxzKCkKLSAgewotICAgIHJldHVybiBuZXcgU3RyaW5nW117IjEzIiwgIjE0In07Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFNlcnZlclJlcXVpcmVkKCkKLSAgewotICAgIGlmIChzZXJ2ZXJSZXF1aXJlZFN0cmluZyA9PSBudWxsKQotICAgIHsgICAgIAotICAgICAgLy9EZWZhdWx0cyB0byB0cnVlIGlmIHRoZSBleHRlbnNpb24gb21pdHMgdGhpcyBhdHRyaWJ1dGUKLSAgICAgIHNlcnZlclJlcXVpcmVkID0gdHJ1ZTsKLQotICAgICAgc2VydmVyUmVxdWlyZWRTdHJpbmcgPSBlbGVtLmdldEF0dHJpYnV0ZSgic2VydmVyUmVxdWlyZWQiKTsKLSAgICAgIGlmIChzZXJ2ZXJSZXF1aXJlZFN0cmluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXJ2ZXJSZXF1aXJlZCA9IEJvb2xlYW4udmFsdWVPZihzZXJ2ZXJSZXF1aXJlZFN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0gICAgICB9ICAgICAgICAgICAgIAotICAgICAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gc2VydmVyUmVxdWlyZWQ7ICAgIAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1NlbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1NlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzE0NTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9TZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklTZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb24gaW1wbGVtZW50cyBJU2VsZWN0aW9uIHsKLQotCXByaXZhdGUgT2JqZWN0W10gc2VsZWN0aW9uOwotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRTZWxlY3Rpb24oKSAKLQl7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3RbXSBzZWxlY3Rpb24pCi0JewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9TZXJ2aWNlUnVudGltZURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9TZXJ2aWNlUnVudGltZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjNThlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDgwMiAgIDE1MjE1MCBtYWh1dGNoQGNhLmlibS5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uUmVxdWlyZWRGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvcgotewotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtOwotICBwcml2YXRlIEhhc2h0YWJsZSBhbGxXZWJTZXJ2aWNlSW1wbHM7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGFsbFJ1bnRpbWVzOwotICBwcml2YXRlIFN0cmluZyBpZDsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlSW1wbCBzZXJ2aWNlSW1wbGVtZW50YXRpb25UeXBlOwotICBwcml2YXRlIFJ1bnRpbWVEZXNjcmlwdG9yIHJ1bnRpbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBib3R0b21VcCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdG9wRG93biA9IGZhbHNlOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUnVudGltZUNsYXNzTmFtZTsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZVJ1bnRpbWUgd2ViU2VydmljZVJ1bnRpbWU7Ci0gIHByaXZhdGUgUmVxdWlyZWRGYWNldFZlcnNpb25bXSByZXF1aXJlZEZhY2V0VmVyc2lvbnM7Ci0gIHByaXZhdGUgU2V0IHByb2plY3RGYWNldFZlcnNpb25zOwotICAKLSAgcHVibGljIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSwgSGFzaHRhYmxlIGFsbFdlYlNlcnZpY2VJbXBscywgSGFzaHRhYmxlIGFsbFJ1bnRpbWVzKQotICB7Ci0gICAgdGhpcy5lbGVtID0gZWxlbTsKLSAgICB0aGlzLmFsbFdlYlNlcnZpY2VJbXBscyA9IGFsbFdlYlNlcnZpY2VJbXBsczsKLSAgICB0aGlzLmFsbFJ1bnRpbWVzID0gYWxsUnVudGltZXM7Ci0KLSAgICBib3R0b21VcCA9IChCb29sZWFuLnZhbHVlT2YoZWxlbS5nZXRBdHRyaWJ1dGUoImJvdHRvbVVwIikpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB0b3BEb3duID0gKEJvb2xlYW4udmFsdWVPZihlbGVtLmdldEF0dHJpYnV0ZSgidG9wRG93biIpKSkuYm9vbGVhblZhbHVlKCk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRCb3R0b21VcCgpCi0gIHsgICAgCi0gICAgcmV0dXJuIGJvdHRvbVVwOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZCA9PSBudWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgfQotICAgIHJldHVybiBpZDsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBSZXF1aXJlZEZhY2V0VmVyc2lvbltdIGdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpCi0gIHsKLSAgICBpZiAocmVxdWlyZWRGYWNldFZlcnNpb25zID09IG51bGwpCi0gICAgewotICAgICAgQXJyYXlMaXN0IHJlcXVpcmVkRmFjZXRWZXJzaW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY2V0RWxlbXMgPSBlbGVtLmdldENoaWxkcmVuKCJyZXF1aXJlZC1mYWNldC12ZXJzaW9uIik7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0RWxlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgCVN0cmluZyBmYWNldElEID0gZmFjZXRFbGVtc1tpXS5nZXRBdHRyaWJ1dGUoImZhY2V0Iik7Ci0gICAgCWlmIChQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoZmFjZXRJRCkpCi0gICAgCXsKLQkgICAgICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uIHJmdiA9IG5ldyBSZXF1aXJlZEZhY2V0VmVyc2lvbigpOwotCSAgICAgICAgSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoZmFjZXRJRCk7ICAgICAgICAKLQkgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHByb2plY3RGYWNldFZlcnNpb24gPSBwcm9qZWN0RmFjZXQuZ2V0VmVyc2lvbihmYWNldEVsZW1zW2ldLmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsKLQkgICAgICAgIHJmdi5zZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3RGYWNldFZlcnNpb24pOwotCSAgICAgICAgU3RyaW5nIGFsbG93TmV3ZXJWYWx1ZSA9IGZhY2V0RWxlbXNbaV0uZ2V0QXR0cmlidXRlKCJhbGxvdy1uZXdlciIpOwotCSAgICAgICAgaWYgKGFsbG93TmV3ZXJWYWx1ZSA9PSBudWxsKQotCSAgICAgICAgewotCSAgICAgICAgICByZnYuc2V0QWxsb3dOZXdlcihmYWxzZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JICAgICAgICAgIHJmdi5zZXRBbGxvd05ld2VyKEJvb2xlYW4udmFsdWVPZihhbGxvd05ld2VyVmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkgICAgICAgIH0KLQkgICAgICAgIAotCSAgICAgICAgcmVxdWlyZWRGYWNldFZlcnNpb25MaXN0LmFkZChyZnYpOwotICAgIAl9ICAgIAkKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmVxdWlyZWRGYWNldFZlcnNpb25zID0gKFJlcXVpcmVkRmFjZXRWZXJzaW9uW10pcmVxdWlyZWRGYWNldFZlcnNpb25MaXN0LnRvQXJyYXkobmV3IFJlcXVpcmVkRmFjZXRWZXJzaW9uW117fSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXF1aXJlZEZhY2V0VmVyc2lvbnM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXQgZ2V0UHJvamVjdEZhY2V0VmVyc2lvbnMoKQotICB7Ci0gICAgaWYgKHByb2plY3RGYWNldFZlcnNpb25zID09IG51bGwpCi0gICAgewotICAgICBwcm9qZWN0RmFjZXRWZXJzaW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmZ2ID0gZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCk7Ci0gICAgIGZvciAoaW50IGk9MDsgaTxyZnYubGVuZ3RoOyBpKyspCi0gICAgIHsKLSAgICAgICBwcm9qZWN0RmFjZXRWZXJzaW9ucy5hZGQocmZ2W2ldLmdldFByb2plY3RGYWNldFZlcnNpb24oKSk7Ci0gICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHByb2plY3RGYWNldFZlcnNpb25zOyAgICAKLSAgfQotICAKLSAgcHVibGljIFJ1bnRpbWVEZXNjcmlwdG9yIGdldFJ1bnRpbWUoKQotICB7Ci0gICAgaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgIFN0cmluZyBydW50aW1lSWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZUlkIik7Ci0gICAgIHJ1bnRpbWUgPSAoUnVudGltZURlc2NyaXB0b3IpYWxsUnVudGltZXMuZ2V0KHJ1bnRpbWVJZCk7ICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJ1bnRpbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlSW1wbCBnZXRTZXJ2aWNlSW1wbGVtZW50YXRpb25UeXBlKCkKLSAgewotICAgIGlmIChzZXJ2aWNlSW1wbGVtZW50YXRpb25UeXBlID09IG51bGwpCi0gICAgeyAgICAgIAotICAgICAgU3RyaW5nIHNlcnZpY2VJbXBsZW1lbnRhdGlvblR5cGVJZCA9IGVsZW0uZ2V0QXR0cmlidXRlKCJzZXJ2aWNlSW1wbGVtZW50YXRpb25UeXBlSWQiKTsKLSAgICAgIHNlcnZpY2VJbXBsZW1lbnRhdGlvblR5cGUgPSAoV2ViU2VydmljZUltcGwpYWxsV2ViU2VydmljZUltcGxzLmdldChzZXJ2aWNlSW1wbGVtZW50YXRpb25UeXBlSWQpOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZUltcGxlbWVudGF0aW9uVHlwZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUnVudGltZUNsYXNzTmFtZSgpCi0gIHsKLSAgICBpZiAoc2VydmljZVJ1bnRpbWVDbGFzc05hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2aWNlUnVudGltZUNsYXNzTmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVJ1bnRpbWVDbGFzc05hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFRvcERvd24oKQotICB7Ci0gICAgcmV0dXJuIHRvcERvd247Ci0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZVJ1bnRpbWUgZ2V0V2ViU2VydmljZVJ1bnRpbWUoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VSdW50aW1lID09IG51bGwpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgd2ViU2VydmljZVJ1bnRpbWUgPSAoSVdlYlNlcnZpY2VSdW50aW1lKWVsZW0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd2ViU2VydmljZVJ1bnRpbWU7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1NlcnZpY2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvU2VydmljZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3Y2MyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvU2VydmljZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMTYgICAxMjcxMzggcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VUeXBlIHsKLQotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgd2ViU2VydmljZUltcGxzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gIHByaXZhdGUgV2ViU2VydmljZUltcGwgd2ViU2VydmljZUltcGw7Ci0gIHByaXZhdGUgU3RyaW5nW10gYm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIHByaXZhdGUgU3RyaW5nW10gdG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBib3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSB0b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlOwotCi0gIAotCi0gIAotICBwdWJsaWMgU2VydmljZVR5cGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fLCBIYXNodGFibGUgd2ViU2VydmljZUltcGxzXykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtXyA9IGVsZW1fOwotICAgIHRoaXMud2ViU2VydmljZUltcGxzXyA9IHdlYlNlcnZpY2VJbXBsc187Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0Qm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUoKQotICB7Ci0gICAgaWYgKGJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJidU1vZHVsZVR5cGVzRXhjbHVkZSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBib3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZSA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUubGVuZ3RoOyBpKyspCi0gICAgICAgICAgYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGVbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRCb3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZShTdHJpbmdbXSBib3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZSkKLSAgewotICAgIHRoaXMuYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUgPSBib3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlKCkKLSAgewotICAgIGlmIChib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZT09bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiYnVNb2R1bGVUeXBlc0luY2x1ZGUiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgYm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGUgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlLmxlbmd0aDsgaSsrKQotICAgICAgICAgIGJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Qm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGUoU3RyaW5nW10gYm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGUpCi0gIHsKLSAgICB0aGlzLmJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlID0gYm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgaWYgKGlkPT1udWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIH0KLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLSAgewotICAgIHRoaXMuaWQgPSBpZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldFRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGUoKQotICB7Ci0gICAgaWYgKHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGU9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoInRkTW9kdWxlVHlwZXNFeGNsdWRlIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGUgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGUubGVuZ3RoOyBpKyspCi0gICAgICAgICAgdG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZVtpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZShTdHJpbmdbXSB0b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlKQotICB7Ci0gICAgdGhpcy50b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlID0gdG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldFRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGUoKQotICB7Ci0gICAgaWYgKHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGU9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoInRkTW9kdWxlVHlwZXNJbmNsdWRlIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGUgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGUubGVuZ3RoOyBpKyspCi0gICAgICAgICAgdG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZVtpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZShTdHJpbmdbXSB0b3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlKQotICB7Ci0gICAgdGhpcy50b3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlID0gdG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZTsKLSAgfQotICAKLSAgcHVibGljIFdlYlNlcnZpY2VJbXBsIGdldFdlYlNlcnZpY2VJbXBsKCkKLSAgewotICAgIGlmICh3ZWJTZXJ2aWNlSW1wbCA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB3c2ltcGxJZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaW1wbElkIik7Ci0gICAgICB3ZWJTZXJ2aWNlSW1wbCA9IChXZWJTZXJ2aWNlSW1wbCl3ZWJTZXJ2aWNlSW1wbHNfLmdldCh3c2ltcGxJZCk7Ci0gICAgfQotICAgIHJldHVybiB3ZWJTZXJ2aWNlSW1wbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZUltcGwxKFdlYlNlcnZpY2VJbXBsIHdlYlNlcnZpY2VJbXBsKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlSW1wbCA9IHdlYlNlcnZpY2VJbXBsOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NjZW5hcmlvKGludCBzY2VuYXJpbykKLSAgewotICAgIHN3aXRjaChzY2VuYXJpbykKLSAgICB7Ci0gICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVA6Ci0gICAgICBTdHJpbmdbXSBidXMgPSBnZXRCb3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZSgpOwotICAgICAgaWYgKGJ1cyE9bnVsbCAmJiBidXMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTjoKLSAgICAgIFN0cmluZ1tdIHRkcyA9IGdldFRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGUoKTsKLSAgICAgIGlmICh0ZHMhPW51bGwgJiYgdGRzLmxlbmd0aD4wKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0JcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZVR5cGVzSW5jbHVkZShpbnQgc2NlbmFyaW8pCi0gIHsKLSAgICBzd2l0Y2goc2NlbmFyaW8pCi0gICAgewotICAgIGNhc2UgV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTVVQOgotICAgICAgcmV0dXJuIGdldEJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlKCk7Ci0gICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTjoKLSAgICAgIHJldHVybiBnZXRUb3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlKCk7Ci0gICAgZGVmYXVsdDogICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZUNsaWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg3YjNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50SW1wbCB7Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87IAotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotICAKLSAgcHVibGljIFdlYlNlcnZpY2VDbGllbnRJbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtXykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtXyA9IGVsZW1fOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICBpZiAoaWQ9PW51bGwpCi0gICAgewotICAgICAgaWQgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgfQotICAgIHJldHVybiBpZDsKLSAgfQotICAKLQotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgewotICAgIGlmIChsYWJlbD09bnVsbCkKLSAgICB7Ci0gICAgICBsYWJlbCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM3NTQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMTYgICAxMjcxMzggcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VJbXBsIHsKLQkKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSByZXNvdXJjZVR5cGVNZXRhZGF0YTsKLQlwcml2YXRlIFN0cmluZ1tdIGV4dGVuc2lvbk1ldGFkYXRhOwotICBwcml2YXRlIFN0cmluZyBvYmplY3RTZWxlY3Rpb25XaWRnZXQ7Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZUltcGwoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1fID0gZWxlbV87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uTWV0YWRhdGEoKQotICB7Ci0gICAgaWYgKGV4dGVuc2lvbk1ldGFkYXRhPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJleHRlbnNpb25NZXRhZGF0YSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBleHRlbnNpb25NZXRhZGF0YSA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uTWV0YWRhdGEubGVuZ3RoOyBpKyspCi0gICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGFbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVuc2lvbk1ldGFkYXRhOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgaWYgKGlkPT1udWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIH0KLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gIHsKLSAgICBpZiAobGFiZWw9PW51bGwpCi0gICAgewotICAgICAgbGFiZWwgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgfQotICAgIHJldHVybiBsYWJlbDsKLSAgfSAKLSAgCi0KLSAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhKCkKLSAgewotICAgIGlmIChyZXNvdXJjZVR5cGVNZXRhZGF0YT09bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgicmVzb3VyY2VUeXBlTWV0YWRhdGEiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGEgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlVHlwZU1ldGFkYXRhLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiByZXNvdXJjZVR5cGVNZXRhZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCkKLSAgewotICAgIGlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXQ9PW51bGwpCi0gICAgewotICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0ID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJvYmplY3RTZWxlY3Rpb25XaWRnZXQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG9iamVjdFNlbGVjdGlvbldpZGdldDsKLSAgfQotICAKLQkKLSAgCi0gIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2IwYWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeQotewotCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIEhhc2hNYXAgd2ViU2VydmljZVR5cGVzXzsKLSAgCi0gIEFycmF5TGlzdCB3ZWJTZXJ2aWNlVHlwZXNMaXN0XzsKLSAgCi0gIEFycmF5TGlzdCB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXNMaXN0XzsKLQotICBIYXNodGFibGUgd2ViU2VydmljZUltcGxzXzsKLQotICBIYXNodGFibGUgd2ViU2VydmljZUNsaWVudEltcGxzXzsKLQotICBIYXNodGFibGUgc2VydmljZVR5cGVzXzsKLQotICBIYXNodGFibGUgY2xpZW50VHlwZXNfOwotCi0gIEhhc2h0YWJsZSB3ZWJTZXJ2aWNlUnVudGltZXNfOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgaW5zdGFuY2VfLmxvYWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBsb2FkKCkKLSAgewotICAgIC8vIENhbid0IGdldCByaWQgb2Ygd2ViU2VydmljZVR5cGVzIGluIE00Ci0gICAgd2ViU2VydmljZVR5cGVzXyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgd2ViU2VydmljZVR5cGVzTGlzdF8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgd2ViU2VydmljZUNsaWVudFR5cGVzTGlzdF8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgd2ViU2VydmljZUltcGxzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHNlcnZpY2VUeXBlc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgY2xpZW50VHlwZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHdlYlNlcnZpY2VSdW50aW1lc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAKLSAgICAvL0xvYWQgV2ViU2VydmljZUltcGxzCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gd3NJbXBsRXh0cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAid3NJbXBsIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PHdzSW1wbEV4dHMubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSB3c0ltcGxFeHRzW2lkeF07Ci0KLSAgICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZUltcGwiKSkKLSAgICAgICAgewotICAgICAgICAgIFdlYlNlcnZpY2VJbXBsIHdzaW1wbCA9IG5ldyBXZWJTZXJ2aWNlSW1wbChlbGVtKTsKLSAgICAgICAgICB3ZWJTZXJ2aWNlSW1wbHNfLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3NpbXBsKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8vTG9hZCBXZWJTZXJ2aWNlQ2xpZW50SW1wbHMKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB3c0NsaWVudEltcGxFeHRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJ3c0NsaWVudEltcGwiKTsKLSAgICAKLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8d3NDbGllbnRJbXBsRXh0cy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IHdzQ2xpZW50SW1wbEV4dHNbaWR4XTsKLQotICAgICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlQ2xpZW50SW1wbCIpKQotICAgICAgICB7Ci0gICAgICAgICAgV2ViU2VydmljZUNsaWVudEltcGwgd3NDbGllbnRJbXBsID0gbmV3IFdlYlNlcnZpY2VDbGllbnRJbXBsKGVsZW0pOwotICAgICAgICAgIHdlYlNlcnZpY2VDbGllbnRJbXBsc18ucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c0NsaWVudEltcGwpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9Mb2FkIFNlcnZpY2VUeXBlcwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHNlcnZpY2VUeXBlRXh0cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAic2VydmljZVR5cGUiKTsKLSAgICAKLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8c2VydmljZVR5cGVFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gc2VydmljZVR5cGVFeHRzW2lkeF07Ci0KLSAgICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygic2VydmljZVR5cGUiKSkKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2VUeXBlIHN0ID0gbmV3IFNlcnZpY2VUeXBlKGVsZW0sd2ViU2VydmljZUltcGxzXyk7Ci0gICAgICAgICAgc2VydmljZVR5cGVzXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHN0KTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8vTG9hZCBDbGllbnRUeXBlcwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNsaWVudFR5cGVFeHRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJjbGllbnRUeXBlIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNsaWVudFR5cGVFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gY2xpZW50VHlwZUV4dHNbaWR4XTsKLQotICAgICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJjbGllbnRUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBDbGllbnRUeXBlIGN0ID0gbmV3IENsaWVudFR5cGUoZWxlbSx3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfKTsKLSAgICAgICAgICBjbGllbnRUeXBlc18ucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCBjdCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0xvYWQgV2ViU2VyaXZjZVJ1bnRpbWVzCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gd3NydEV4dHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgIndlYlNlcnZpY2VSdW50aW1lIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PHdzcnRFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3NydEV4dHNbaWR4XTsKLQotICAgICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlUnVudGltZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgV2ViU2VydmljZVJ1bnRpbWVJbmZvIHdzcnRJbmZvID0gbmV3IFdlYlNlcnZpY2VSdW50aW1lSW5mbyhlbGVtLCBzZXJ2aWNlVHlwZXNfLCBjbGllbnRUeXBlc18pOwotICAgICAgICAgIHdlYlNlcnZpY2VSdW50aW1lc18ucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c3J0SW5mbyk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy9VcGRhdGUgdGhlIHR5cGUgbGlzdHMKLSAgICAgICAgICB1cGRhdGVXZWJTZXJ2aWNlVHlwZUxpc3Qod3NydEluZm8pOwotICAgICAgICAgIHVwZGF0ZVdlYlNlcnZpY2VDbGllbnRUeXBlTGlzdCh3c3J0SW5mbyk7Ci0gICAgICAgICAgCi0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgfSAgCi0gICAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVXZWJTZXJ2aWNlVHlwZUxpc3QoV2ViU2VydmljZVJ1bnRpbWVJbmZvIHdzcnRJbmZvKQotICB7Ci0gICAgU2VydmljZVR5cGVbXSBzdHMgPSB3c3J0SW5mby5nZXRTZXJ2aWNlVHlwZXMoKTsKLSAgICBpZiAoc3RzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdHMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpbXBsSWQgPSBzdHNbal0uZ2V0V2ViU2VydmljZUltcGwoKS5nZXRJZCgpOwotICAgICAgICBTdHJpbmdbXSBidXMgPSBzdHNbal0uZ2V0Qm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGUoKTsKLSAgICAgICAgU3RyaW5nW10gdGRzID0gc3RzW2pdLmdldFRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGUoKTsKLSAgICAgICAgaWYgKGJ1cyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIGVudHJ5YnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkpOwotICAgICAgICAgIGVudHJ5YnVmZi5hcHBlbmQoIi8iKTsKLSAgICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKGltcGxJZCk7Ci0gICAgICAgICAgU3RyaW5nIGVudHJ5ID0gZW50cnlidWZmLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgaWYgKCF3ZWJTZXJ2aWNlVHlwZXNMaXN0Xy5jb250YWlucyhlbnRyeSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgd2ViU2VydmljZVR5cGVzTGlzdF8uYWRkKGVudHJ5KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRkcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIGVudHJ5YnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSk7Ci0gICAgICAgICAgZW50cnlidWZmLmFwcGVuZCgiLyIpOwotICAgICAgICAgIGVudHJ5YnVmZi5hcHBlbmQoaW1wbElkKTsKLSAgICAgICAgICBTdHJpbmcgZW50cnkgPSBlbnRyeWJ1ZmYudG9TdHJpbmcoKTsKLSAgICAgICAgICBpZiAoIXdlYlNlcnZpY2VUeXBlc0xpc3RfLmNvbnRhaW5zKGVudHJ5KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlVHlwZXNMaXN0Xy5hZGQoZW50cnkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdlYlNlcnZpY2VDbGllbnRUeXBlTGlzdChXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NydEluZm8pCi0gIHsKLSAgICBDbGllbnRUeXBlW10gY3RzID0gd3NydEluZm8uZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICBpZiAoY3RzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjdHMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpbXBsSWQgPSBjdHNbal0uZ2V0V2ViU2VydmljZUNsaWVudEltcGwoKS5nZXRJZCgpOwotICAgICAgICBTdHJpbmdbXSBtb2RzID0gY3RzW2pdLmdldE1vZHVsZVR5cGVzSW5jbHVkZSgpOwotICAgICAgICBpZiAobW9kcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIGVudHJ5YnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5DTElFTlQpKTsKLSAgICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKCIvIik7Ci0gICAgICAgICAgZW50cnlidWZmLmFwcGVuZChpbXBsSWQpOwotICAgICAgICAgIFN0cmluZyBlbnRyeSA9IGVudHJ5YnVmZi50b1N0cmluZygpOwotICAgICAgICAgIGlmICghd2ViU2VydmljZUNsaWVudFR5cGVzTGlzdF8uY29udGFpbnMoZW50cnkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VDbGllbnRUeXBlc0xpc3RfLmFkZChlbnRyeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyZGYzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjcgICAxMjY3ODAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeTIKLXsKLQotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5MiBpbnN0YW5jZV87Ci0KLSAgLy93ZWJTZXJ2aWNlSW1wbHNfOiAKLSAgLy9rZXk6IGlkIGF0dHJpYnV0ZSBvZiBleHRlbnNpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzSW1wbAotICAvL3ZhbHVlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlSW1wbCAKLSAgSGFzaHRhYmxlIHdlYlNlcnZpY2VJbXBsc187Ci0KLSAgLy93ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfOiAKLSAgLy9rZXk6IGlkIGF0dHJpYnV0ZSBvZiBleHRlbnNpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzQ2xpZW50SW1wbAotICAvL3ZhbHVlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW1wbCAgCi0gIEhhc2h0YWJsZSB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfOwotCi0gIC8vcnVudGltZXNfOiAKLSAgLy9rZXk6IGlkIGF0dHJpYnV0ZSBvZiBleHRlbnNpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnJ1bnRpbWVzCi0gIC8vdmFsdWU6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlJ1bnRpbWVEZXNjcmlwdG9yCi0gIEhhc2h0YWJsZSBydW50aW1lc187Ci0gIAotICAvL3NlcnZpY2VSdW50aW1lc186IAotICAvL2tleTogaWQgYXR0cmlidXRlIG9mIGV4dGVuc2lvbiB0byBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuc2VydmljZVJ1bnRpbWVzCi0gIC8vdmFsdWU6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlNlcnZpY2VSdW50aW1lRGVzY3JpcHRvcgotICBIYXNodGFibGUgc2VydmljZVJ1bnRpbWVzXzsKLSAgCi0gIC8vY2xpZW50UnVudGltZXNfOiAKLSAgLy9rZXk6IGlkIGF0dHJpYnV0ZSBvZiBleHRlbnNpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFJ1bnRpbWVzCi0gIC8vdmFsdWU6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LkNsaWVudFJ1bnRpbWVEZXNjcmlwdG9yICAKLSAgSGFzaHRhYmxlIGNsaWVudFJ1bnRpbWVzXzsKLSAgCi0gIC8vd2ViU2VydmljZVR5cGVzTGlzdF8gY29udGFpbnMgYSBsaXN0IG9mIFN0cmluZyB2YWx1ZXMgaW4gdGhpcyBmb3JtOiAic2NlbmFyaW8vd2ViU2VydmljZUltcGxJZCIsCi0gIC8vd2hlcmUgc2NlYW5yaW8gdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvbmUgb2YgCi0gIC8vb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTV9VUCBvciAKLSAgLy9vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW8uVE9QX0RPV04KLSAgLy9hbmQgd2ViU2VydmljZUltcGxJZCBpcyB0aGUgaWQgYXR0cmlidXRlIG9mIGFuIGV4dGVuc2lvbiB0byBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NJbXBsCi0gIC8vVGhpcyBsaXN0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBpdGVtcyBkaXNwbGF5ZWQgaW4gdGhlIFdlYlNlcnZpY2VUeXBlIGNvbWJvLWJveCBvZiBwYWdlIDEgb2YgdGhlIAotICAvL1dlYiBzZXJpdmNlIHdpemFyZC4KLSAgQXJyYXlMaXN0IHdlYlNlcnZpY2VUeXBlc0xpc3RfOwotICAKLSAgLy9UT0RPOiBOb3QgdXNlZC4gUmVtb3ZlIHRoaXMgYW5kIGFsbCByZWZlcmVuY2VzIHRvIGl0IGluIHRoaXMgY2xhc3MuCi0gIEFycmF5TGlzdCB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXNMaXN0XzsgIAotICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkyIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeTIgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5MigpOwotICAgICAgaW5zdGFuY2VfLmxvYWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBsb2FkKCkKLSAgewotICAgIHdlYlNlcnZpY2VJbXBsc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgd2ViU2VydmljZUNsaWVudEltcGxzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBydW50aW1lc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgc2VydmljZVJ1bnRpbWVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBjbGllbnRSdW50aW1lc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgd2ViU2VydmljZVR5cGVzTGlzdF8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgd2ViU2VydmljZUNsaWVudFR5cGVzTGlzdF8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgCi0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgCi0vLyAgTG9hZCBXZWJTZXJ2aWNlSW1wbHMgYnkgcmVhZGluZyBhbGwgZXh0ZW5zaW9ucyB0byBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NJbXBsCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gd3NJbXBsRXh0cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAid3NJbXBsIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PHdzSW1wbEV4dHMubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSB3c0ltcGxFeHRzW2lkeF07ICAgICAgICAKLSAgICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZUltcGwiKSkKLSAgICAgICAgewotICAgICAgICAgIFdlYlNlcnZpY2VJbXBsIHdzaW1wbCA9IG5ldyBXZWJTZXJ2aWNlSW1wbChlbGVtKTsgICAgICAgICAgCi0gICAgICAgICAgd2ViU2VydmljZUltcGxzXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHdzaW1wbCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0xvYWQgV2ViU2VydmljZUNsaWVudEltcGxzIGJ5IHJlYWRpbmcgYWxsIGV4dGVuc2lvbnMgdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzQ2xpZW50SW1wbAotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHdzQ2xpZW50SW1wbEV4dHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgIndzQ2xpZW50SW1wbCIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDx3c0NsaWVudEltcGxFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3NDbGllbnRJbXBsRXh0c1tpZHhdOwotCi0gICAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VDbGllbnRJbXBsIikpCi0gICAgICAgIHsKLSAgICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50SW1wbCB3c0NsaWVudEltcGwgPSBuZXcgV2ViU2VydmljZUNsaWVudEltcGwoZWxlbSk7Ci0gICAgICAgICAgd2ViU2VydmljZUNsaWVudEltcGxzXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHdzQ2xpZW50SW1wbCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0xvYWQgcnVudGltZXMgYnkgcmVhZGluZyBhbGwgZXh0ZW5zaW9ucyB0byBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucnVudGltZXMKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW50aW1lRXh0cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAicnVudGltZXMiKTsKLSAgICAKLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8cnVudGltZUV4dHMubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBydW50aW1lRXh0c1tpZHhdOwotCi0gICAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoInJ1bnRpbWUiKSkKLSAgICAgICAgewotICAgICAgICAgIFJ1bnRpbWVEZXNjcmlwdG9yIHJkID0gbmV3IFJ1bnRpbWVEZXNjcmlwdG9yKGVsZW0pOwotICAgICAgICAgIHJ1bnRpbWVzXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHJkKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8vTG9hZCBzZXJ2aWNlUnVudGltZXMgYnkgcmVhZGluZyBhbGwgZXh0ZW5zaW9ucyB0byBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuc2VydmljZVJ1bnRpbWVzCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gc2VydmljZVJ1bnRpbWVFeHRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJzZXJ2aWNlUnVudGltZXMiKTsKLSAgICAKLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8c2VydmljZVJ1bnRpbWVFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gc2VydmljZVJ1bnRpbWVFeHRzW2lkeF07Ci0KLSAgICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygic2VydmljZVJ1bnRpbWUiKSkKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvciByZCA9IG5ldyBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IoZWxlbSwgd2ViU2VydmljZUltcGxzXywgcnVudGltZXNfKTsKLSAgICAgICAgICBzZXJ2aWNlUnVudGltZXNfLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgcmQpOyAgICAgICAgICAKLSAgICAgICAgICB1cGRhdGVXZWJTZXJ2aWNlVHlwZUxpc3QocmQpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9Mb2FkIGNsaWVudFJ1bnRpbWVzIGJ5IHJlYWRpbmcgYWxsIGV4dGVuc2lvbnMgdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFJ1bnRpbWVzCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2xpZW50UnVudGltZUV4dHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgImNsaWVudFJ1bnRpbWVzIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNsaWVudFJ1bnRpbWVFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gY2xpZW50UnVudGltZUV4dHNbaWR4XTsKLQotICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygiY2xpZW50UnVudGltZSIpKQotICAgICAgewotICAgICAgICBDbGllbnRSdW50aW1lRGVzY3JpcHRvciByZCA9IG5ldyBDbGllbnRSdW50aW1lRGVzY3JpcHRvcihlbGVtLCB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfLCBydW50aW1lc18pOwotICAgICAgICBjbGllbnRSdW50aW1lc18ucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCByZCk7Ci0gICAgICAgIHVwZGF0ZVdlYlNlcnZpY2VDbGllbnRUeXBlTGlzdChyZCk7Ci0gICAgICAgICAgCi0gICAgICB9ICAgICAgICAKLSAgICB9Ci0gIH0gIAotICAgIAotICAvKioKLSAgICogVXBkYXRlcyB0aGUgbGlzdCBvZiBXZWIgc2VydmljZSB0eXBlcyB3aXRoIHRoZSBwcm92aWRlZCBzZXJ2aWNlIHJ1bnRpbWUncyBjb250cmlidXRpb24gb2YKLSAgICogc2NlbmFyaW8vd2ViU2VydmljZUltcGwgY29tYmluYXRpb24uCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAqLwotICBwcml2YXRlIHZvaWQgdXBkYXRlV2ViU2VydmljZVR5cGVMaXN0KFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICB7Ci0gICAgU3RyaW5nIHNlcnZpY2VJbXBsSWQgPSBkZXNjcmlwdG9yLmdldFNlcnZpY2VJbXBsZW1lbnRhdGlvblR5cGUoKS5nZXRJZCgpOwotICAgIGJvb2xlYW4gYm90dG9tVXAgPSBkZXNjcmlwdG9yLmdldEJvdHRvbVVwKCk7Ci0gICAgYm9vbGVhbiB0b3BEb3duID0gZGVzY3JpcHRvci5nZXRUb3BEb3duKCk7Ci0gICAgaWYgKGJvdHRvbVVwKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBlbnRyeWJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkpOwotICAgICAgZW50cnlidWZmLmFwcGVuZCgiLyIpOwotICAgICAgZW50cnlidWZmLmFwcGVuZChzZXJ2aWNlSW1wbElkKTsKLSAgICAgIFN0cmluZyBlbnRyeSA9IGVudHJ5YnVmZi50b1N0cmluZygpOwotICAgICAgaWYgKCF3ZWJTZXJ2aWNlVHlwZXNMaXN0Xy5jb250YWlucyhlbnRyeSkpCi0gICAgICB7Ci0gICAgICAgIHdlYlNlcnZpY2VUeXBlc0xpc3RfLmFkZChlbnRyeSk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIGlmICh0b3BEb3duKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBlbnRyeWJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSk7Ci0gICAgICBlbnRyeWJ1ZmYuYXBwZW5kKCIvIik7Ci0gICAgICBlbnRyeWJ1ZmYuYXBwZW5kKHNlcnZpY2VJbXBsSWQpOwotICAgICAgU3RyaW5nIGVudHJ5ID0gZW50cnlidWZmLnRvU3RyaW5nKCk7Ci0gICAgICBpZiAoIXdlYlNlcnZpY2VUeXBlc0xpc3RfLmNvbnRhaW5zKGVudHJ5KSkKLSAgICAgIHsKLSAgICAgICAgd2ViU2VydmljZVR5cGVzTGlzdF8uYWRkKGVudHJ5KTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVXZWJTZXJ2aWNlQ2xpZW50VHlwZUxpc3QoQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgewotICAgIFN0cmluZyBjbGllbnRJbXBsSWQgPSBkZXNjcmlwdG9yLmdldENsaWVudEltcGxlbWVudGF0aW9uVHlwZSgpLmdldElkKCk7Ci0gICAgU3RyaW5nQnVmZmVyIGVudHJ5YnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5DTElFTlQpKTsKLSAgICBlbnRyeWJ1ZmYuYXBwZW5kKCIvIik7Ci0gICAgZW50cnlidWZmLmFwcGVuZChjbGllbnRJbXBsSWQpOwotICAgIFN0cmluZyBlbnRyeSA9IGVudHJ5YnVmZi50b1N0cmluZygpOwotICAgIGlmICghd2ViU2VydmljZUNsaWVudFR5cGVzTGlzdF8uY29udGFpbnMoZW50cnkpKQotICAgIHsKLSAgICAgIHdlYlNlcnZpY2VDbGllbnRUeXBlc0xpc3RfLmFkZChlbnRyeSk7Ci0gICAgfSAgICAKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDQ3YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDEzMSAxMjEwNzEgICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIgICAgIAotICogMjAwNjAyMjEgICAxMTkxMTEgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDIyNyAgIDEyNDM5MiByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwMzI0ICAgMTE2NzUwIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjcgICAxMjY3ODAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA3MDExOSAgIDE1OTQ1OCBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuRmFjZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uRmFjZXRNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLlJlcXVpcmVkRmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5UeXBlU2VsZWN0aW9uRmlsdGVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgbnVtZXJvdXMgdXRpbGl0eSBtZXRob2RzIHRoYXQKLSAqIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIHRocm91Z2ggZXh0ZW5zaW9uIHBvaW50cwotICogd2hpY2ggYXJlIHJlYWQgaW4gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeTI6Ci0gKiA8dWw+Ci0gKiA8bGk+IG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c0ltcGwgPC9saT4KLSAqIDxsaT4gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzQ2xpZW50SW1wbCA8L2xpPgotICogPGxpPiBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucnVudGltZXMgPC9saT4KLSAqIDxsaT4gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnNlcnZpY2VSdW50aW1lcyA8L2xpPgotICogPGxpPiBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UnVudGltZXMgPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIHRvIHByb3ZpZGUgYW5zd2VycyB0byBjb21tb24gcXVlc3Rpb25zIHJlZ2FyZGluZyB3aGljaCBzZXJ2ZXJzLAotICogcHJvamVjdHMsIGFuZCBwcm9qZWN0IHR5cGVzIGEgcGFydGljdWxhciBXZWIgc2VydmljZSBydW50aW1lCi0gKiBzdXBwb3J0cy4KLSAqIDxici8+PGJyLz4KLSAqIFRlbWlub2xvZ3kgdXNlZCBpbiB0aGUgamF2YWRvYyBpbiB0aGlzIGNsYXNzOgotICogPHVsPgotICogPGxpPjxiPldlYiBzZXJ2aWNlIHNjZW5hcmlvPC9iPjogT25lIG9mIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVAgb3IgV2ViU2VydmljZVNjZW5hcmlvLlRPUF9ET1dOLjwvbGk+IAotICogPGxpPjxiPldlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHR5cGU8L2I+OiBleHRlbnNpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzSW1wbC4KLSAqIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaXMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZUltcGwuPC9saT4KLSAqIDxsaT48Yj5XZWIgc2VydmljZSB0eXBlPC9iPjogRm9yd2FyZCBzbGFzaCBzZXBhcmF0ZWQgY29uY2F0ZW5hdGlvbiBvZiB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uCi0gKiBvZiBhIFdlYiBzZXJ2aWNlIHNjZW5hcmlvIGFuZCBhIFdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHR5cGUgaWQuCi0gKiBGb3IgZXhhbXBsZSwgIjAvb3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5qYXZhIiwgcmVwcmVzZW50cyB0aGUgYm90dG9tIHVwIEphdmEgYmVhbiBXZWIgc2VydmljZSB0eXBlLjwvbGk+Ci0gKiA8bGk+PGI+V2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGU8L2I+OiBleHRlbnNpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzQ2xpZW50SW1wbC4KLSAqIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaXMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZUNsaWVudEltcGwuPC9saT4KLSAqIDxsaT48Yj5XZWIgc2VydmljZSBydW50aW1lPC9iPjogZXh0ZW5zaW9uIHRvIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5ydW50aW1lcy4gCi0gKiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGlzIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlJ1bnRpbWVEZXNjcmlwdG9yPC9saT4gCi0gKiA8bGk+PGI+c2VydmljZVJ1bnRpbWU8L2I+OiBleHRlbnNpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnNlcnZpY2VSdW50aW1lcy4KLSAqIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaXMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yPC9saT4KLSAqIDxsaT48Yj5jbGllbnRSdW50aW1lPC9iPjogZXh0ZW5zaW9uIHRvIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRSdW50aW1lcy4KLSAqIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaXMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuQ2xpZW50UnVudGltZURlc2NyaXB0b3I8L2xpPgotICogPGxpPjxiPnNlcnZlciB0eXBlPC9iPjogVGhpcyBpcyBhIHNlcnZlciB0b29scyBhcnRpZmFjdC4gWW91IHNlZSBhIGxpc3Qgb2YgdGhlc2Ugd2hlbiBjcmVhdGluZyBhIG5ldyBzZXJ2ZXIKLSAqIGluIHRoZSB0b29sLjwvbGk+Ci0gKiA8bGk+PGI+c2VydmVyIHJ1bnRpbWU8L2I+OiBUaGlzIGlzIGEgc2VydmVyIHRvb2xzIGFydGlmYWN0LiBZb3Ugc2VlIGEgbGlzdCBvZiB0aGVzZSBpZiB5b3UgZ28gdG8gUHJlZmVyZW5jZXMsIAotICogU2VydmVyID4gSW5zdGFsbGVkIFJ1bnRpbWVzIGluIHRoZSB0b29sLiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGlzIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTwvbGk+Ci0gKiA8bGk+PGI+ZmFjZXQgcnVudGltZTwvYj46IFRoZSBmYWNldCBlcXVpdmFsZW50IG9mIGEgc2VydmVyIHJ1bnRpbWUuIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaXMgCi0gKiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lLiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuRmFjZXRVdGlsCi0gKiBwcm92aWRlcyBtZXRob2RzIHRvIHRyYW5zbGF0ZSBmcm9tIGEgc2VydmVyIHJ1bnRpbWUgdG8gYSBmYWNldCBydW50aW1lIGFuZCB2aWNlLXZlcnNhLjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeTIgcmVnaXN0cnkgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5Mi5nZXRJbnN0YW5jZSgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFJ1bnRpbWVEZXNjcmlwdG9yIHJlcHJlc2VudGluZyB0aGUgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiB3aXRoIGFuIGlkIGF0dHJpYnV0ZSBlcXVhbCB0byB0aGUgcHJvdmlkZWQgaWQKLSAgICogQHBhcmFtIGlkCi0gICAqIEByZXR1cm4gUnVudGltZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoZSBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIHdpdGggYW4gaWQgYXR0cmlidXRlIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBpZC4gUmV0dXJucyBudWxsCi0gICAqIGlmIHN1Y2ggYSBSdW50aW1lRGVzY3JpcHRvciBjYW5ub3QgYmUgZm91bmQuCi0gICAqLyAgCi0gIHB1YmxpYyBzdGF0aWMgUnVudGltZURlc2NyaXB0b3IgZ2V0UnVudGltZUJ5SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHJlZ2lzdHJ5LnJ1bnRpbWVzXy5nZXQoaWQpOwotICAgIGlmIChyZXN1bHQhPW51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChSdW50aW1lRGVzY3JpcHRvcilyZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBhbGwgcHJvamVjdCB0eXBlcyBzdXBwb3J0ZWQgYnkgYWxsIHNlcnZpY2VSdW50aW1lcy4gVXNlZCBieSB0aGUKLSAgICogUHJvamVjdFRvcG9sb2d5IHByZWZlcmVuY2UgcGFnZS4gCi0gICAqIEByZXR1cm4gU3RyaW5nW10gYXJyYXkgb2YgdGVtcGxhdGUgaWRzLiBUaGUgYXJyYXkgbWF5IGhhdmUgMCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsU2VydmljZVByb2plY3RUeXBlcygpCi0gIHsKLSAgICBBcnJheUxpc3QgZmluYWxUZW1wbGF0ZUlkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gcmVnaXN0cnkuc2VydmljZVJ1bnRpbWVzXy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgLy9Mb29wIHRocm91Z2ggYWxsIHRoZSBzZXJ2aWNlUnVudGltZXMKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpICAgCi0gICAgewotICAgICAgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSAoU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yKWl0ZXIubmV4dCgpOwotICAgICAgCi0gICAgICAvL0dldCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNlcnZpY2VSdW50aW1lCi0gICAgICBTZXQgdGVtcGxhdGVzID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0VGVtcGxhdGVzRm9yU2VydmljZVJ1bnRpbWUoZGVzYy5nZXRJZCgpKTsKLSAgICAgIAotICAgICAgLy9BZGQgdGhlIHRlbXBsYXRlIGlkcyB0byB0aGUgbGlzdCBpZiB0aGV5IGhhdmUgbm90IGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgSXRlcmF0b3IgaXRyID0gdGVtcGxhdGVzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgdGVtcGxhdGUgPSAoSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUpaXRyLm5leHQoKTsKLSAgICAgICAgaWYgKCFmaW5hbFRlbXBsYXRlSWRMaXN0LmNvbnRhaW5zKHRlbXBsYXRlLmdldElkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxUZW1wbGF0ZUlkTGlzdC5hZGQodGVtcGxhdGUuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlmaW5hbFRlbXBsYXRlSWRMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tde30pOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgdW5pb24gb2YgYWxsIHByb2plY3QgdHlwZXMgc3VwcG9ydGVkIGJ5IGFsbCBjbGllbnRSdW50aW1lcy4gVXNlZCBieSB0aGUKLSAgICogUHJvamVjdFRvcG9sb2d5IHByZWZlcmVuY2UgcGFnZS4gCi0gICAqIEByZXR1cm4gU3RyaW5nW10gYXJyYXkgb2YgdGVtcGxhdGUgaWRzLiBUaGUgYXJyYXkgbWF5IGhhdmUgMCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsQ2xpZW50UHJvamVjdFR5cGVzKCkKLSAgewotICAgIEFycmF5TGlzdCBmaW5hbFRlbXBsYXRlSWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RyeS5jbGllbnRSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgIC8vTG9vcCB0aHJvdWdoIGFsbCB0aGUgY2xpZW50UnVudGltZXMKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpICAgCi0gICAgewotICAgICAgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzYyA9IChDbGllbnRSdW50aW1lRGVzY3JpcHRvcilpdGVyLm5leHQoKTsKLSAgICAgIAotICAgICAgLy9HZXQgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBjbGllbnRSdW50aW1lCi0gICAgICBTZXQgdGVtcGxhdGVzID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0VGVtcGxhdGVzRm9yQ2xpZW50UnVudGltZShkZXNjLmdldElkKCkpOwotICAgICAgCi0gICAgICAvL0FkZCB0aGUgdGVtcGxhdGUgaWRzIHRvIHRoZSBsaXN0IGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGFkZGVkCi0gICAgICBJdGVyYXRvciBpdHIgPSB0ZW1wbGF0ZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSlpdHIubmV4dCgpOwotICAgICAgICBpZiAoIWZpbmFsVGVtcGxhdGVJZExpc3QuY29udGFpbnModGVtcGxhdGUuZ2V0SWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbFRlbXBsYXRlSWRMaXN0LmFkZCh0ZW1wbGF0ZS5nZXRJZCgpKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKWZpbmFsVGVtcGxhdGVJZExpc3QudG9BcnJheShuZXcgU3RyaW5nW117fSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsYWJlbCBvZiBhIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgZ2l2ZW4gaXRzIGlkCi0gICAqIEBwYXJhbSBydW50aW1lSWQgaWQgb2YgYSBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIEByZXR1cm4gU3RyaW5nIHRoZSBsYWJlbCBvZiB0aGUgV2ViIHNlcnZpY2UgcnVudGltZSB3aXRoIGFuIGlkIGVxdWFsIHRvIHJ1bnRpbWVJZC4KLSAgICogUmV0dXJucyBudWxsIGlmIHN1Y2ggYSBXZWIgc2VydmljZSBydW50aW1lIGNhbm5vdCBiZSBmb3VuZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbEJ5SWQoU3RyaW5nIHJ1bnRpbWVJZCkgCi0gIHsKLSAgICBSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gZ2V0UnVudGltZUJ5SWQocnVudGltZUlkKTsKLSAgICBpZiAoZGVzYyA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgcmV0dXJuIGRlc2MuZ2V0TGFiZWwoKTsKLSAgfSAgICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBSdW50aW1lRGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBXZWIgc2VydmljZSBydW50aW1lIHdpdGggdGhlIHByb3ZpZGVkIGxhYmVsCi0gICAqIEBwYXJhbSBsYWJlbCBsYWJlbCBvZiBhIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogQHJldHVybiBSdW50aW1lRGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBXZWIgc2VydmljZSBydW50aW1lIHdpdGggdGhlIHByb3ZpZGVkIGxhYmVsCi0gICAqIFJldHVybnMgbnVsbCBpZiBzdWNoIGEgV2ViIHNlcnZpY2UgcnVudGltZSBjYW5ub3QgYmUgZm91bmQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFJ1bnRpbWVEZXNjcmlwdG9yIGdldFJ1bnRpbWVCeUxhYmVsKFN0cmluZyBsYWJlbCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RyeS5ydW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUnVudGltZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChSdW50aW1lRGVzY3JpcHRvcilpdGVyLm5leHQoKTsKLSAgICAgIGlmIChkZXNjcmlwdG9yIT1udWxsKSB7Ci0gICAgICAgIGlmIChsYWJlbC5lcXVhbHMoZGVzY3JpcHRvci5nZXRMYWJlbCgpKSkKLSAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgICAgCi0gIH0gICAgICAKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGFiZWwgb2YgYW4gc2VydmVyIHR5cGUgZ2l2ZW4gaXRzIGlkCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgaWQgb2YgYSBzZXJ2ZXIgdHlwZQotICAgKiBAcmV0dXJuIFN0cmluZyBsYWJlbCBvZiB0aGUgc2VydmVyIHR5cGUgd2l0aCBhbiBpZCBlcXVhbCB0byBzZXJ2ZXJGYWN0b3J5SWQuCi0gICAqIFJldHVybnMgbnVsbCBpZiBzdWNoIGEgc2VydmVyIHR5cGUgY2Fubm90IGJlIGZvdW5kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyTGFiZWxCeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWQpOwotICAgIGlmIChzZXJ2ZXJUeXBlID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldFRleHQoc2VydmVyVHlwZSk7ICAgCi0gICAgcmV0dXJuIHNlcnZlckxhYmVsOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGFiZWwgb2YgYW4gSVNlcnZlciBnaXZlbiBpdHMgaWQKLSAgICogQHBhcmFtIGluc3RhbmNlSWQgaWQgb2YgYW4gSVNlcnZlcgotICAgKiBAcmV0dXJuIFN0cmluZyBsYWJlbCBvZiB0aGUgSVNlcnZlciB3aXRoIGFuIGlkIGVxdWFsIHRvIGluc3RhbmNlSWQuCi0gICAqLyAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlckluc3RhbmNlTGFiZWxGcm9tSW5zdGFuY2VJZCggU3RyaW5nIGluc3RhbmNlSWQgKQotICB7Ci0gICAgSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoIGluc3RhbmNlSWQgKTsgICAgCi0gICAgcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBhbGwgc2VydmVyIHR5cGUgaWRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZhY2V0IHJ1bnRpbWVzCi0gICAqIGluIHRoZSBwcm92aWRlZCBzZXQuCi0gICAqIEBwYXJhbSBmYWNldFJ1bnRpbWVzIGEgc2V0IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgSVJ1bnRpbWV9LgotICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIElTZXJ2ZXJUeXBlIGlkcy4gVGhlIGFycmF5IG1heSBoYXZlIDAgZWxlbWVudHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlGYWNldFJ1bnRpbWVzKFNldCBmYWNldFJ1bnRpbWVzKQotICB7Ci0gICAgCi0gICAgQXJyYXlMaXN0IHN1cHBvcnRlZFNlcnZlckZhY3RvcnlJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nW10gc2VydmVyVHlwZUlkcyA9IGdldEFsbFNlcnZlckZhY3RvcnlJZHNXaXRoUnVudGltZXMoKTsKLSAgICBJdGVyYXRvciBpdHIgPSBmYWNldFJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUoaXRyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJUnVudGltZSBmUnVudGltZSA9IChJUnVudGltZSlpdHIubmV4dCgpOwotICAgICAgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lIHNSdW50aW1lID0gRmFjZXRVdGlsLmdldFJ1bnRpbWUoZlJ1bnRpbWUpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlclR5cGVJZHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlclR5cGVJZHNbaV0pOwotICAgICAgICBJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0gICAgICAgIGlmIChydW50aW1lVHlwZSAhPSBudWxsKQotICAgICAgICB7Ci0JICAgICAgICBTdHJpbmcgcnVudGltZVR5cGVJZCA9IHJ1bnRpbWVUeXBlLmdldElkKCk7Ci0JICAgICAgICBpZiAoc1J1bnRpbWUgIT0gbnVsbCAmJiBzUnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYgcnVudGltZVR5cGVJZC5lcXVhbHMoc1J1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgc3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkcy5hZGQoc2VydmVyVHlwZUlkc1tpXSk7ICAgICAgICAgIAotCSAgICAgICAgfSAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAoU3RyaW5nW10pc3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgIAotICAgIC8vVGVtcG9yYXJpbHkgcmV0dXJuIGFsbCBmYWN0b3J5IGlkcyB3aXRoIHJ1bnRpbWVzCi0gICAgLy9yZXR1cm4gZ2V0QWxsU2VydmVyRmFjdG9yeUlkc1dpdGhSdW50aW1lcygpOyAgICAKLSAgfQotICAKLSAgLy9TZXJ2aWNlLXNpZGUgdXRpbGl0aWVzCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgV2ViU2VydmljZUltcGwgZ2l2ZW4gdGhlIGlkIG9mIGEgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZS4KLSAgICogQHBhcmFtIGlkIAotICAgKiBAcmV0dXJuIFdlYlNlcnZpY2VJbXBsIHdpdGggdGhlIGdpdmVuIGlkCi0gICAqIFJldHVybnMgbnVsbCBpZiBzdWNoIGEgV2ViU2VydmljZUltcGwgY2Fubm90IGJlIGZvdW5kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlSW1wbCBnZXRXZWJTZXJ2aWNlSW1wbEJ5SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VJbXBsc18uZ2V0KGlkKTsKLSAgICBpZiAocmVzdWx0IT1udWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoV2ViU2VydmljZUltcGwpcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvcn0gZ2l2ZW4gdGhlIGlkIG9mIGEgc2VydmljUnVudGltZS4KLSAgICogQHBhcmFtIGlkIG9mIGEgc2VydmljZVJ1bnRpbWUKLSAgICogQHJldHVybiBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQKLSAgICogUmV0dXJucyBudWxsIGlmIHN1Y2ggYSBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IgY2Fubm90IGJlIGZvdW5kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IgZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChTdHJpbmcgaWQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gcmVnaXN0cnkuc2VydmljZVJ1bnRpbWVzXy5nZXQoaWQpOwotICAgIGlmIChyZXN1bHQhPW51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IpcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgICAgIAotICB9ICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSVdlYlNlcnZpY2VSdW50aW1lfSBvZiB0aGUgZ2l2ZW4gc2VydmljZVJ1bnRpbWUuIEV4dGVuZGVycyBwcm92aWRlIHRoZSBmdWxseSAKLSAgICogcXVhbGlmaWVkIG5hbWUgb2YgYSBjb25jcmV0ZSBJV2ViU2VydmljZVJ1bnRpbWUgaW4gdGhlIGNsYXNzIGF0dHJpYnV0ZSBvZiBhIHNlcnZpY2VSdW50aW1lcyBleHRlbnNpb24uCi0gICAqIEBwYXJhbSBzZXJ2aWNlUnVudGltZUlkIGlkIG9mIGEgc2VydmljZVJ1bnRpbWUKLSAgICogQHJldHVybiBJV2ViU2VydmljZVJ1bnRpbWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVdlYlNlcnZpY2VSdW50aW1lIGdldFNlcnZpY2VSdW50aW1lKCBTdHJpbmcgc2VydmljZVJ1bnRpbWVJZCApCi0gIHsKLSAgICBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvckJ5SWQoc2VydmljZVJ1bnRpbWVJZCk7Ci0gICAgSVdlYlNlcnZpY2VSdW50aW1lICAgIHdlYnNlcnZpY2VSdW50aW1lICAgICA9IG51bGw7Ci0gICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIHdlYnNlcnZpY2VSdW50aW1lID0gZGVzY3JpcHRvci5nZXRXZWJTZXJ2aWNlUnVudGltZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd2Vic2VydmljZVJ1bnRpbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpZCBvZiBhIHNlcnZpY2VSdW50aW1lIHRoYXQgc3VwcG9ydHMgdGhlIHByb3ZpZGVkIFdlYiBzZXJ2aWNlIHR5cGUsIFdlYiBzZXJ2aWNlIHJ1bnRpbWUsCi0gICAqIHNlcnZlciB0eXBlL3NlcnZlciBpbnN0YW5jZSAoaWYgcHJlc2VudCksIHByb2plY3Qgb3IgcHJvamVjdCB0eXBlLgotICAgKiBAcGFyYW0gdHJzIGFuIGluc3RhbmNlIG9mIHtAbGluayBUeXBlUnVudGltZVNlcnZlcn0gY29udGFpbmluZyBhIFdlYiBzZXJ2aWNlIHR5cGUgaWQsIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgaWQsCi0gICAqIHNlcnZlciB0eXBlIGlkIGFuZCBzZXJ2ZXIgaW5zdGFuY2UgaWQuIFRoZSBXZWIgc2VydmljZSB0eXBlIGlkIGFuZCBXZWIgc2VydmljZSBydW50aW1lIGlkIG11c3QgYmUgbm9uLW51bGwgCi0gICAqIGFuZCBub24tZW1wdHkuIFRoZSBzZXJ2ZXIgdHlwZSBpZCBhbmQgc2VydmVyIGluc3RhbmNlIGlkIG1heSBiZSBudWxsIG9yIGVtcHR5LgotICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgdGhlIG5hbWUgb2YgYW4gSVByb2plY3QgdGhheSBtYXkgb3IgbWF0IG5vdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlLiBNdXN0IGJlIG5vbi1udWxsIGFuZCAKLSAgICogbm9uLWVtcHR5LgotICAgKiBAcGFyYW0gdGVtcGxhdGVJZCB0aGUgaWQgb2YgYW4ge0BsaW5rIElGYWNldGVkUHJvamVjdFRlbXBsYXRlfS4gTXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLWVtcHR5IGlmCi0gICAqIGFuIElQcm9qZWN0IHdpdGggdGhlIG5hbWUgcHJvamVjdE5hbWUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4gCi0gICAqIEByZXR1cm4gU3RyaW5nIGlkIG9mIGEgc2VydmljZVJ1bnRpbWUgdGhhdCBzdXBwb3J0cyB0aGUgcHJvdmlkZWQgV2ViIHNlcnZpY2UgdHlwZSwgV2ViIHNlcnZpY2UgcnVudGltZSwKLSAgICogc2VydmVyIHR5cGUvc2VydmVyIGluc3RhbmNlIChpZiBwcmVzZW50KSwgcHJvamVjdCBvciBwcm9qZWN0IHR5cGUuIFJldHVybnMgYW4gZW1wdHkgU3RyaW5nIGlmIG5vIAotICAgKiBzdWNoIHNlcnZpY2VSdW50aW1lIGNvdWxkIGJlIGZvdW5kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmljZVJ1bnRpbWVJZChUeXBlUnVudGltZVNlcnZlciB0cnMsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHRlbXBsYXRlSWQpCi0gIHsKLSAgICBib29sZWFuIHNlcnZlclNlbGVjdGVkID0gKHRycy5nZXRTZXJ2ZXJJZCgpICE9IG51bGwpICYmICh0cnMuZ2V0U2VydmVySWQoKS5sZW5ndGgoKSA+IDApOyAKLSAgICAvL0ZpbmQgdGhlIGZpcnN0IHNlcnZpY2VSdW50aW1lIHRoYXQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uIHR5cGUsIHJ1bnRpbWUsIHNlcnZlciwgYW5kIHByb2plY3QKLSAgICBTdHJpbmdbXSBkZXNjcyA9IGdldFNlcnZpY2VSdW50aW1lc0J5U2VydmljZVR5cGUodHJzLmdldFR5cGVJZCgpKTsKLSAgICBmb3IgKGludCBpPTA7IGk8ZGVzY3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSBnZXRTZXJ2aWNlUnVudGltZURlc2NyaXB0b3JCeUlkKGRlc2NzW2ldKTsgICAgICAKLSAgICAgIGlmIChkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpLmVxdWFscyh0cnMuZ2V0UnVudGltZUlkKCkpKQotICAgICAgewotICAgICAgICBpZiAoc2VydmVyU2VsZWN0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU2VydmVyID0gZG9lc1NlcnZpY2VSdW50aW1lU3VwcG9ydFNlcnZlcihkZXNjLmdldElkKCksIHRycy5nZXRTZXJ2ZXJJZCgpKTsKLSAgICAgICAgICBpZiAoIXN1cHBvcnRzU2VydmVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChwcm9qZWN0LmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRvZXNTZXJ2aWNlUnVudGltZVN1cHBvcnRQcm9qZWN0KGRlc2MuZ2V0SWQoKSwgcHJvamVjdE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNjLmdldElkKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vQ2hlY2sgaWYgdGVtcGxhdGUgaXMgc3VwcG9ydGVkCi0gICAgICAgICAgaWYgKGRvZXNTZXJ2aWNlUnVudGltZVN1cHBvcnRUZW1wbGF0ZShkZXNjLmdldElkKCksIHRlbXBsYXRlSWQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNjLmdldElkKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLSAgICAKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgV2ViIHNlcnZpY2Ugc2NlbmFyaW8gZnJvbSB0aGUgV2ViIHNlcnZpY2UgdHlwZS4KLSAgICogQHBhcmFtIHR5cGVJZCBtdXN0IGJlIGEgU3RyaW5nIG9mIHRoZSBmb3JtYXQgIjAvaW1wbElkIgotICAgKiB3aGVyZSB0aGUgZGlnaXQgYmVmb3JlIHRoZSAiLyIgcmVwcmVzZW50cyB0aGUgc2NlbmFyaW8KLSAgICogKGUuZy4gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTV9VUCkgYW5kIHRoZSBpbXBsSWQgaXMgdGhlIFdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHR5cGUgaWQuCi0gICAqIEByZXR1cm4gaW50IHNjZW5hcmlvIChlLmcuIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVAgb3IgV2ViU2VydmljZVNjZW5hcmlvLlRPUF9ET1dOKQotICAgKi8gICAgICAgIAotICBwdWJsaWMgc3RhdGljIGludCBnZXRTY2VuYXJpb0Zyb21UeXBlSWQoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHR5cGVJZC5zdWJzdHJpbmcoMCx0eXBlSWQuaW5kZXhPZigiLyIpKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbmF0aW9uIHR5cGUgaWQgZnJvbiB0aGUgV2ViIHNlcnZpY2UgdHlwZSBpZC4KLSAgICogQHBhcmFtIHR5cGVJZCBtdXN0IGJlIGEgU3RyaW5nIG9mIHRoZSBmb3JtYXQgIjAvaW1wbElkIgotICAgKiB3aGVyZSB0aGUgZGlnaXQgYmVmb3JlIHRoZSAiLyIgcmVwcmVzZW50cyB0aGUgc2NlbmFyaW8KLSAgICogKGUuZy4gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTV9VUCkgYW5kIHRoZSBpbXBsSWQgaXMgdGhlIFdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHR5cGUgaWQuCi0gICAqIEByZXR1cm4gU3RyaW5nIHRoZSBXZWJTZXJ2aWNlSW1wbCBpZC4KLSAgICovICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViU2VydmljZUltcGxJZEZyb21UeXBlSWQoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIHJldHVybiB0eXBlSWQuc3Vic3RyaW5nKHR5cGVJZC5pbmRleE9mKCIvIikrMSk7Ci0gIH0gICAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWRzIG9mIGFsbCBXZWIgc2VydmljZSBydW50aW1lcyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuCi0gICAqIFdlYiBzZXJ2aWNlIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZUlkIG11c3QgYmUgYSBTdHJpbmcgb2YgdGhlIGZvcm1hdCAiMC9pbXBsSWQiCi0gICAqIHdoZXJlIHRoZSBkaWdpdCBiZWZvcmUgdGhlICIvIiByZXByZXNlbnRzIHRoZSBzY2VuYXJpbwotICAgKiAoZS5nLiBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NX1VQKSBhbmQgdGhlIGltcGxJZCBpcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZSBpZC4KLSAgICogCi0gICAqIEByZXR1cm4gU3RyaW5nW10gYXJyYXkgY29udGFpbmluZyB0aGUgaWRzIG9mIGFsbCBXZWIgc2VydmljZSBydW50aW1lcyB0aGF0Ci0gICAqIHN1cHBvcnQgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUuIFRoZSBhcnJheSBtYXkgaGF2ZSAwIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRSdW50aW1lc0J5U2VydmljZVR5cGUoU3RyaW5nIHR5cGVJZCkgCi0gIHsKLSAgICBpbnQgc2NlbmFyaW8gPSBnZXRTY2VuYXJpb0Zyb21UeXBlSWQodHlwZUlkKTsKLSAgICBTdHJpbmcgaW1wbElkID0gZ2V0V2ViU2VydmljZUltcGxJZEZyb21UeXBlSWQodHlwZUlkKTsgICAgCi0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gcmVnaXN0cnkuc2VydmljZVJ1bnRpbWVzXy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgICAKLSAgICB7Ci0gICAgICBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IgZGVzYyA9IChTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IpaXRlci5uZXh0KCk7Ci0gICAgICAvL0NoZWNrIGlmIHRoaXMgc2VydmljZVJ1bnRpbWUgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uIHR5cGUKLSAgICAgIGlmIChkZXNjLmdldFNlcnZpY2VJbXBsZW1lbnRhdGlvblR5cGUoKS5nZXRJZCgpLmVxdWFscyhpbXBsSWQpKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKHNjZW5hcmlvKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVA6Ci0gICAgICAgICAgICBpZiAoZGVzYy5nZXRCb3R0b21VcCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgcnVudGltZUlkID0gZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKTsgCi0gICAgICAgICAgICAgIGlmICghaWRzLmNvbnRhaW5zKHJ1bnRpbWVJZCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZHMuYWRkKHJ1bnRpbWVJZCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV046Ci0gICAgICAgICAgICBpZiAoZGVzYy5nZXRUb3BEb3duKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBydW50aW1lSWQgPSBkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpOyAKLSAgICAgICAgICAgICAgaWYgKCFpZHMuY29udGFpbnMocnVudGltZUlkKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlkcy5hZGQocnVudGltZUlkKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDogICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlpZHMudG9BcnJheShuZXcgU3RyaW5nW117fSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpZHMgb2YgYWxsIHNlcnZpY2VSdW50aW1lcyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuCi0gICAqIFdlYiBzZXJ2aWNlIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZUlkIG11c3QgYmUgYSBTdHJpbmcgb2YgdGhlIGZvcm1hdCAiMC9pbXBsSWQiCi0gICAqIHdoZXJlIHRoZSBkaWdpdCBiZWZvcmUgdGhlICIvIiByZXByZXNlbnRzIHRoZSBzY2VuYXJpbwotICAgKiAoZS5nLiBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NX1VQKSBhbmQgdGhlIGltcGxJZCBpcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZSBpZC4KLSAgICogCi0gICAqIEByZXR1cm5zIFN0cmluZ1tdIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlkcyBvZiBhbGwgc2VydmljZVJ1bnRpbWVzIHRoYXQKLSAgICogc3VwcG9ydCB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgdHlwZS4gVGhlIGFycmF5IG1heSBoYXZlIDAgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZpY2VSdW50aW1lc0J5U2VydmljZVR5cGUoU3RyaW5nIHR5cGVJZCkgCi0gIHsKLSAgICBpbnQgc2NlbmFyaW8gPSBnZXRTY2VuYXJpb0Zyb21UeXBlSWQodHlwZUlkKTsKLSAgICBTdHJpbmcgaW1wbElkID0gZ2V0V2ViU2VydmljZUltcGxJZEZyb21UeXBlSWQodHlwZUlkKTsgICAgCi0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gcmVnaXN0cnkuc2VydmljZVJ1bnRpbWVzXy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgICAKLSAgICB7Ci0gICAgICBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IgZGVzYyA9IChTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IpaXRlci5uZXh0KCk7Ci0gICAgICAvL0NoZWNrIGlmIHRoaXMgc2VydmljZVJ1bnRpbWUgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uIHR5cGUKLSAgICAgIGlmIChkZXNjLmdldFNlcnZpY2VJbXBsZW1lbnRhdGlvblR5cGUoKS5nZXRJZCgpLmVxdWFscyhpbXBsSWQpKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKHNjZW5hcmlvKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVA6Ci0gICAgICAgICAgICBpZiAoZGVzYy5nZXRCb3R0b21VcCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZVJ1bnRpbWVJZCA9IGRlc2MuZ2V0SWQoKTsgCi0gICAgICAgICAgICAgIGlkcy5hZGQoc2VydmljZVJ1bnRpbWVJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOOgotICAgICAgICAgICAgaWYgKGRlc2MuZ2V0VG9wRG93bigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZVJ1bnRpbWVJZCA9IGRlc2MuZ2V0SWQoKTsgCi0gICAgICAgICAgICAgIGlkcy5hZGQoc2VydmljZVJ1bnRpbWVJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKWlkcy50b0FycmF5KG5ldyBTdHJpbmdbXXt9KTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgcnVudGltZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIFdlYiBzZXJ2aWNlIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZUlkIG11c3QgYmUgYSBTdHJpbmcgb2YgdGhlIGZvcm1hdCAiMC9pbXBsSWQiCi0gICAqIHdoZXJlIHRoZSBkaWdpdCBiZWZvcmUgdGhlICIvIiByZXByZXNlbnRzIHRoZSBzY2VuYXJpbwotICAgKiAoZS5nLiBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NX1VQKSBhbmQgdGhlIGltcGxJZCBpcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZSBpZC4KLSAgICogCi0gICAqIEBwYXJhbSBydW50aW1lSWQgaWQgb2YgYSBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIAotICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgc3VwcG9ydHMgdGhlIGdpdmVuIAotICAgKiBXZWIgc2VydmljZSB0eXBlLiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8gCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1J1bnRpbWVTdXBwb3J0ZWRGb3JTZXJ2aWNlVHlwZShTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmljZVJ1bnRpbWVJZHMgPSBnZXRTZXJ2aWNlUnVudGltZXNCeVNlcnZpY2VUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKHNlcnZpY2VSdW50aW1lSWRzIT1udWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IHNlcnZpY2VSdW50aW1lSWRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IgZGVzYyA9IGdldFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvckJ5SWQoc2VydmljZVJ1bnRpbWVJZHNbaV0pOwotICAgICAgICBpZiAoZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKS5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWRzIG9mIGFsbCBzZXJ2ZXIgdHlwZXMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbgotICAgKiBXZWIgc2VydmljZSB0eXBlLgotICAgKiAKLSAgICogQHBhcmFtIHR5cGVJZCBtdXN0IGJlIGEgU3RyaW5nIG9mIHRoZSBmb3JtYXQgIjAvaW1wbElkIgotICAgKiB3aGVyZSB0aGUgZGlnaXQgYmVmb3JlIHRoZSAiLyIgcmVwcmVzZW50cyB0aGUgc2NlbmFyaW8KLSAgICogKGUuZy4gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTV9VUCkgYW5kIHRoZSBpbXBsSWQgaXMgdGhlIFdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHR5cGUgaWQuCi0gICAqIAotICAgKiBAcmV0dXJucyBTdHJpbmdbXSBhcnJheSBjb250YWluaW5nIHRoZSBpZHMgb2YgYWxsIHNlcnZlciB0eXBlcyB0aGF0Ci0gICAqIHN1cHBvcnQgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUuIFRoZSBhcnJheSBtYXkgaGF2ZSAwIGVsZW1lbnRzLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlkc0J5U2VydmljZVR5cGUoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIEFycmF5TGlzdCBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZ1tdIHNydHMgPSBnZXRTZXJ2aWNlUnVudGltZXNCeVNlcnZpY2VUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKHNydHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNydHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIC8vR2V0IHRoZSBydW50aW1lcyB0aGF0IHdvcmsgZm9yIHRoZSBmYWNldHMgcmVxdWlyZWQgZm9yIHRoaXMgc2VydmljZVJ1bnRpbWUgICAgICAgIAotICAgICAgICBTdHJpbmdbXSBmSWRzID0gZ2V0U2VydmVyRmFjdG9yeUlkc0J5U2VydmljZVJ1bnRpbWUoc3J0c1tpXSk7Ci0gICAgICAgIGZvciAoaW50IGo9MDsgajxmSWRzLmxlbmd0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFzZXJ2ZXJGYWN0b3J5SWRzLmNvbnRhaW5zKGZJZHNbal0pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZlckZhY3RvcnlJZHMuYWRkKGZJZHNbal0pOyAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKXNlcnZlckZhY3RvcnlJZHMudG9BcnJheShuZXcgU3RyaW5nW117fSk7Ci0gICAgCi0gICAgLy9UZW1wb3JhcmlseSByZXR1cm4gYWxsIHNlcnZlciB0eXBlIGlkcy4KLSAgICAvL3JldHVybiBnZXRBbGxTZXJ2ZXJGYWN0b3J5SWRzV2l0aFJ1bnRpbWVzKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIFdlYiBzZXJ2aWNlIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZUlkIG11c3QgYmUgYSBTdHJpbmcgb2YgdGhlIGZvcm1hdCAiMC9pbXBsSWQiCi0gICAqIHdoZXJlIHRoZSBkaWdpdCBiZWZvcmUgdGhlICIvIiByZXByZXNlbnRzIHRoZSBzY2VuYXJpbwotICAgKiAoZS5nLiBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NX1VQKSBhbmQgdGhlIGltcGxJZCBpcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZSBpZC4KLSAgICogCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgaWQgb2YgYSBzZXJ2ZXIgdHlwZQotICAgKiAKLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIFdlYiBzZXJ2aWNlIHR5cGUuIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXJ2ZXJTdXBwb3J0ZWRGb3JDaG9zZW5TZXJ2aWNlVHlwZShTdHJpbmcgdHlwZUlkLCBTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgU3RyaW5nW10gZklkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeVNlcnZpY2VUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKGZJZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaT0wO2k8Zklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWQuZXF1YWxzKGZJZHNbaV0pKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWRzIG9mIGFsbCBzZXJ2ZXIgdHlwZXMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbgotICAgKiBzZXJ2aWNlUnVudGltZS4KLSAgICogCi0gICAqIEBwYXJhbSBzZXJ2aWNlUnVudGltZUlkIGlkIG9mIGEgc2VydmljZVJ1bnRpbWUKLSAgICogCi0gICAqIEByZXR1cm5zIFN0cmluZ1tdIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlkcyBvZiBhbGwgc2VydmVyIHR5cGVzIHRoYXQKLSAgICogc3VwcG9ydCB0aGUgZ2l2ZW4gc2VydmljZVJ1bnRpbWUuIFRoZSBhcnJheSBtYXkgaGF2ZSAwIGVsZW1lbnRzLiAKLSAgICovICAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlkc0J5U2VydmljZVJ1bnRpbWUoU3RyaW5nIHNlcnZpY2VSdW50aW1lSWQpCi0gIHsgICAgICAgCi0gICAgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSBnZXRTZXJ2aWNlUnVudGltZURlc2NyaXB0b3JCeUlkKHNlcnZpY2VSdW50aW1lSWQpOwotICAgIFNldCBmYWNldFJ1bnRpbWVzID0gZ2V0UnVudGltZXMoZGVzYy5nZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMoKSk7Ci0gICAgICAgICAgICAKLSAgICAvL1RlbXBvcmFyaWx5IHJldHVybiBhbGwgc2VydmVyIHR5cGVzCi0gICAgLy9yZXR1cm4gZ2V0QWxsU2VydmVyRmFjdG9yeUlkc1dpdGhSdW50aW1lcygpOwotICAgIHJldHVybiBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlGYWNldFJ1bnRpbWVzKGZhY2V0UnVudGltZXMpOwotICB9IAotICAKLQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHNlcnZlciB0eXBlIHN1cHBvcnRzIHRoZSBnaXZlbiAKLSAgICogc2VydmljZVJ1bnRpbWUuCi0gICAqIAotICAgKiBAcGFyYW0gc2VydmljZVJ1bnRpbWVJZCBpZCBvZiBhIHNlcnZpY2VSdW50aW1lCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgaWQgb2YgYSBzZXJ2ZXIgdHlwZQotICAgKiAKLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIHNlcnZpY2VSdW50aW1lLiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZG9lc1NlcnZpY2VSdW50aW1lU3VwcG9ydFNlcnZlcihTdHJpbmcgc2VydmljZVJ1bnRpbWVJZCwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlcklkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeVNlcnZpY2VSdW50aW1lKHNlcnZpY2VSdW50aW1lSWQpOwotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJJZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHNlcnZlcklkc1tpXS5lcXVhbHMoc2VydmVyRmFjdG9yeUlkKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAgIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGFiZWxzIGFuZCBpZHMgb2YgYWxsIFdlYiBzZXJ2aWNlIHR5cGVzLiBVc2VkIHRvIHBvcHVsYXRlIHRoZSBXZWIgc2VydmljZSB0eXBlIGNvbWJvIGJveCBvbgotICAgKiBwYWdlIDEgb2YgdGhlIFdlYiBzZXJ2aWNlIHdpemFyZC4KLSAgICogQHJldHVybiB7QGxpbmsgTGFiZWxzQW5kSWRzfQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMYWJlbHNBbmRJZHMgZ2V0U2VydmljZVR5cGVMYWJlbHMoKQotICB7ICAgCi0gICAgTGFiZWxzQW5kSWRzIGxhYmVsSWRzID0gbmV3IExhYmVsc0FuZElkcygpOwotICAgIEl0ZXJhdG9yICAgICBpdGVyYXRvciA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VUeXBlc0xpc3RfLml0ZXJhdG9yKCk7Ci0gICAgaW50ICAgICAgICAgIHNpemUgICAgID0gcmVnaXN0cnkud2ViU2VydmljZVR5cGVzTGlzdF8uc2l6ZSgpOwotICAgIFN0cmluZ1tdICAgICBsYWJlbHMgICA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgU3RyaW5nW10gICAgIGlkcyAgICAgID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICBpbnQgICAgICAgICAgaW5kZXggICAgPSAwOwotICAgIAotICAgIGxhYmVsSWRzLnNldExhYmVsc18oIGxhYmVscyApOwotICAgIGxhYmVsSWRzLnNldElkc18oIGlkcyApOwotICAgIAotICAgIHdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgd3N0ID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpbnQgc2NlbmFyaW8gPSBnZXRTY2VuYXJpb0Zyb21UeXBlSWQod3N0KTsKLSAgICAgIFN0cmluZyBpbXBsSWQgPSBnZXRXZWJTZXJ2aWNlSW1wbElkRnJvbVR5cGVJZCh3c3QpOwotICAgICAgV2ViU2VydmljZUltcGwgd3NpbXBsID0gZ2V0V2ViU2VydmljZUltcGxCeUlkKGltcGxJZCk7Ci0gICAgICBTdHJpbmcgaW1wbGxhYmVsID0gd3NpbXBsLmdldExhYmVsKCk7Ci0gICAgICBpZHNbaW5kZXhdICAgID0gd3N0OwotICAgICAgU3RyaW5nIHNjZW5MYWJlbCA9ICIiOwotICAgICAgc3dpdGNoKHNjZW5hcmlvKQotICAgICAgewotICAgICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVA6Ci0gICAgICAgIHNjZW5MYWJlbCA9IE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5CT1RUT01VUF9MQUJFTCwgbmV3IFN0cmluZ1swXSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTjoKLSAgICAgICAgc2NlbkxhYmVsID0gTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPUERPV05fTEFCRUwsIG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBicmVhazsgCi0gICAgICBkZWZhdWx0OgotICAgICAgfQotICAgICAgbGFiZWxzW2luZGV4XSA9IE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5DT01CSU5FRF9UWVBFX0FORF9SVU5USU1FX0xBQkVMLCBuZXcgU3RyaW5nW117IHNjZW5MYWJlbCwgaW1wbGxhYmVsIH0pOwotICAgICAgaW5kZXgrKzsKLSAgICB9ICAgIAotICAgIAotICAgIHJldHVybiBsYWJlbElkczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGlkIG9mIGEgV2ViIHNlcnZpY2UgcnVudGltZSB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBXZWIgc2VydmljZSB0eXBlLgotICAgKiAgCi0gICAqIEBwYXJhbSB0eXBlSWQgd2lsbCBiZSBhIFN0cmluZyBvZiB0aGUgZm9ybWF0ICIwL2ltcGxJZCIKLSAgICogd2hlcmUgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgIi8iIHJlcHJlc2VudHMgdGhlIHNjZW5hcmlvCi0gICAqIChlLmcuIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVApIGFuZCB0aGUgaW1wbElkIGlzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0eXBlIGlkLgotICAgKiAKLSAgICogQHJldHVybiBTdHJpbmcgaWQgb2YgYSBXZWIgc2VydmljZSBydW50aW1lIHRoYXQgc3VwcG9ydHMgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUuIAotICAgKiBSZXR1cm5zIG51bGwgaWYgc3VjaCBhIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgY2Fubm90IGJlIGZvdW5kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVWYWx1ZUZvcihTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgU3RyaW5nW10gc3JJZHMgPSBnZXRTZXJ2aWNlUnVudGltZXNCeVNlcnZpY2VUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKHNySWRzID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChzcklkc1swXSk7Ci0gICAgcmV0dXJuIGRlc2MuZ2V0UnVudGltZSgpLmdldElkKCk7Ci0gIH0gICAgICAKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWQgb2YgYSBzZXJ2ZXIgdHlwZSB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBXZWIgc2VydmljZSB0eXBlLgotICAgKiAgCi0gICAqIEBwYXJhbSB0eXBlSWQgd2lsbCBiZSBhIFN0cmluZyBvZiB0aGUgZm9ybWF0ICIwL2ltcGxJZCIKLSAgICogd2hlcmUgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgIi8iIHJlcHJlc2VudHMgdGhlIHNjZW5hcmlvCi0gICAqIChlLmcuIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVApIGFuZCB0aGUgaW1wbElkIGlzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0eXBlIGlkLgotICAgKiAKLSAgICogQHJldHVybiBTdHJpbmcgaWQgb2YgYSBpZCBvZiBhIHNlcnZlciB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUuIAotICAgKiBSZXR1cm5zIG51bGwgaWYgc3VjaCBhIHNlcnZlciB0eXBlIGNhbm5vdCBiZSBmb3VuZC4KLSAgICovICAgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2VydmVyVmFsdWVGb3IoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZ1tdIGZJZHMgPSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlTZXJ2aWNlVHlwZSh0eXBlSWQpOwotICAgIGlmIChmSWRzPT1udWxsIHx8IGZJZHMubGVuZ3RoPT0wKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgcmV0dXJuIGZJZHNbMF07Ci0gIH0gICAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gY29tYmluYXRpb24gb2Ygc2VydmVyIHR5cGUsIFdlYiBzZXJ2aWNlIHJ1bnRpbWUsIGFuZCBXZWIgc2VydmljZSB0eXBlIGlzCi0gICAqIHN1cHBvcnRlZC4gVXNlZCBmb3IgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgaWQgb2YgYSBzZXJ2ZXIgdHlwZQotICAgKiBAcGFyYW0gcnVudGltZUlkIGlkIG9mIGEgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBAcGFyYW0gdHlwZUlkIHdpbGwgYmUgYSBTdHJpbmcgb2YgdGhlIGZvcm1hdCAiMC9pbXBsSWQiCi0gICAqIHdoZXJlIHRoZSBkaWdpdCBiZWZvcmUgdGhlICIvIiByZXByZXNlbnRzIHRoZSBzY2VuYXJpbwotICAgKiAoZS5nLiBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NX1VQKSBhbmQgdGhlIGltcGxJZCBpcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZSBpZC4KLSAgICogCi0gICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gY29tYmluYXRpb24gb2Ygc2VydmVyIHR5cGUsIFdlYiBzZXJ2aWNlIHJ1bnRpbWUsIGFuZCBXZWIgc2VydmljZSB0eXBlIGlzCi0gICAqIHN1cHBvcnRlZC4gPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZlclJ1bnRpbWVUeXBlU3VwcG9ydGVkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpICAKLSAgewotICAgIC8vRW5zdXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBzZXJ2aWNlUnVudGltZSB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiB0eXBlCi0gICAgU3RyaW5nW10gc2VydmljZVJ1bnRpbWVzID0gZ2V0U2VydmljZVJ1bnRpbWVzQnlTZXJ2aWNlVHlwZSh0eXBlSWQpOwotICAgIGlmIChzZXJ2aWNlUnVudGltZXMhPW51bGwgJiYgc2VydmljZVJ1bnRpbWVzLmxlbmd0aD4wKQotICAgIHsKLSAgICAgIC8vRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIHNlcnZlciBydW50aW1lcyBzdXBwb3J0cyB0aGUgZ2l2ZW4gc2VydmVyCi0gICAgICBmb3IgKGludCBpPTA7IGk8c2VydmljZVJ1bnRpbWVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTZXJ2aWNlUnVudGltZURlc2NyaXB0b3IgZGVzYyA9IGdldFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvckJ5SWQoc2VydmljZVJ1bnRpbWVzW2ldKTsKLSAgICAgICAgaWYgKGRlc2MuZ2V0UnVudGltZSgpLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvL01hdGNoZXMgdGhlIHR5cGUgYW5kIHRoZSBydW50aW1lLiBDaGVjayBpZiBpdCBtYXRjaGVzIHRoZSBzZXJ2ZXIKLSAgICAgICAgICBTZXQgcnVudGltZXMgPSBnZXRSdW50aW1lcyhkZXNjLmdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpKTsKLSAgICAgICAgICBTdHJpbmdbXSBmSWRzID0gZ2V0U2VydmVyRmFjdG9yeUlkc0J5RmFjZXRSdW50aW1lcyhydW50aW1lcyk7Ci0gICAgICAgICAgZm9yIChpbnQgaj0wOyBqPGZJZHMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGZJZHNbal0uZXF1YWxzKHNlcnZlckZhY3RvcnlJZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL2RpZG4ndCBmaW5kIGEgbWF0Y2guIHJldHVybiBmYWxzZS4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgV2ViIHNlcnZpY2UgdHlwZSBpZHMgdGhhdCBhcmUgc3VpdGFibGUgZm9yIHRoZSBwcm92aWRlZCBzZWxlY3Rpb24uCi0gICAqIFVzZWQgdG8gZGVmYXVsdCB0aGUgV2ViIHNlcnZpY2UgdHlwZSBjb21ibyBib3ggb24gcGFnZSAxIG9mIHRoZSBXZWIgc2VydmljZSB3aXphcmQKLSAgICogYmFzZWQgb24gdGhlIHVzZXIncyBpbml0aWFsIHNlbGVjdGlvbi4KLSAgICogQHBhcmFtIHNlbGVjdGlvbgotICAgKiBAcmV0dXJuIFN0cmluZ1tdIGFuIGFycmF5IG9mIFdlYiBzZXJ2aWNlIHR5cGUgaWRzIHRoYXQgYXJlIHN1aXRhYmxlIGZvciB0aGUgcHJvdmlkZWQgc2VsZWN0aW9uLgotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBvciBubyBzdWl0YWJsZSBXZWIgc2VydmljZSB0eXBlcyBhcmUgZm91bmQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUeXBlQnlTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgVHlwZVNlbGVjdGlvbkZpbHRlcjIgdHNmID0gbmV3IFR5cGVTZWxlY3Rpb25GaWx0ZXIyKCk7Ci0gICAgU3RyaW5nW10gd3N0ID0gdHNmLmdldFdlYlNlcnZpY2VUeXBlQnlJbml0aWFsU2VsZWN0aW9uKHNlbGVjdGlvbiwgcmVnaXN0cnkud2ViU2VydmljZVR5cGVzTGlzdF8pOwotICAgIHJldHVybiB3c3QgPT0gbnVsbCA/IG51bGwgOiB3c3Q7Ci0gIH0gICAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gc2VydmVyIHR5cGUgc3VwcG9ydHMgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogCi0gICAqIEBwYXJhbSBydW50aW1lSWQgOiBpZCBvZiBhIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogQHBhcmFtIGZhY3RvcnlJZCA6IGlkIG9mIGEgc2VydmVyIHR5cGUKLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgZm9yIHRoZSBzZXJ2aWNlIHNpZGUuIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyRm9yU2VydmljZVNpZGUoU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIGZhY3RvcnlJZCkKLSAgewotICAgIC8vR2V0IGFsbCB0aGUgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9ycyB0aGF0IHBvaW50IHRvIHRoaXMgcnVudGltZUlkCi0gICAgSXRlcmF0b3IgaXRlciA9IHJlZ2lzdHJ5LnNlcnZpY2VSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpICAgCi0gICAgewotICAgICAgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSAoU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yKWl0ZXIubmV4dCgpOwotICAgICAgLy9jaGVjayBpZiB0aGlzIHNlcnZpY2VSdW50aW1lIHBvaW50cyB0byBydW50aW1lSWQKLSAgICAgIFN0cmluZyB0aGlzUnVudGltZUlkID0gZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKTsKLSAgICAgIGlmICh0aGlzUnVudGltZUlkLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgewotICAgICAgICBTZXQgZmFjZXRSdW50aW1lcyA9IGdldFJ1bnRpbWVzKGRlc2MuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCkpOwotICAgICAgICBTdHJpbmdbXSBmSWRzID0gZ2V0U2VydmVyRmFjdG9yeUlkc0J5RmFjZXRSdW50aW1lcyhmYWNldFJ1bnRpbWVzKTsKLSAgICAgICAgZm9yIChpbnQgaj0wOyBqPGZJZHMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZklkc1tqXS5lcXVhbHMoZmFjdG9yeUlkKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL05vIHNlcnZpY2VSdW50aW1lIG1hdGNoZWQuIFJldHVybiBmYWxzZS4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpZCBvZiBhIHNlcnZlciB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogb24gdGhlIHNlcnZpY2Ugc2lkZS4KLSAgICogCi0gICAqIEBwYXJhbSBydW50aW1lSWQgaWQgb2YgYSBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIEByZXR1cm4gU3RyaW5nIHRoZSBpZCBvZiBhIHNlcnZlciB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAqIFJldHVybnMgbnVsbCBpZiBzdWNoIGEgc2VydmVyIHR5cGUgY2Fubm90IGJlIGZvdW5kLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpcnN0U3VwcG9ydGVkU2VydmVyRm9yU2VydmljZVNpZGUoU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIC8vR2V0IGFsbCB0aGUgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9ycyB0aGF0IHBvaW50IHRvIHRoaXMgcnVudGltZUlkCi0gICAgSXRlcmF0b3IgaXRlciA9IHJlZ2lzdHJ5LnNlcnZpY2VSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpICAgCi0gICAgewotICAgICAgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSAoU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yKWl0ZXIubmV4dCgpOwotICAgICAgLy9jaGVjayBpZiB0aGlzIHNlcnZpY2VSdW50aW1lIHBvaW50cyB0byBydW50aW1lSWQKLSAgICAgIFN0cmluZyB0aGlzUnVudGltZUlkID0gZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKTsKLSAgICAgIGlmICh0aGlzUnVudGltZUlkLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgewotICAgICAgICBTZXQgZmFjZXRSdW50aW1lcyA9IGdldFJ1bnRpbWVzKGRlc2MuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCkpOwotICAgICAgICBTdHJpbmdbXSBmYWN0b3J5SWRzID0gZ2V0U2VydmVyRmFjdG9yeUlkc0J5RmFjZXRSdW50aW1lcyhmYWNldFJ1bnRpbWVzKTsKLSAgICAgICAgaWYgKGZhY3RvcnlJZHMhPW51bGwgJiYgZmFjdG9yeUlkcy5sZW5ndGggPjApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFjdG9yeUlkc1swXTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL2RpZG4ndCBnZXQgYSBzaW5nbGUgc3VpdGFibGUgc2VydmVyIHR5cGUgaWQsIHJldHVybiBudWxsLgotICAgIHJldHVybiBudWxsOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSB3aGljaCBzdXBwb3J0IHRoZSBnaXZlbiBXZWIgc2VydmljZSB0eXBlCi0gICAqIGFuZCBXZWIgc2VydmljZSBydW50aW1lLgotICAgKiBAcGFyYW0gdHlwZUlkIG11c3QgYmUgYSBTdHJpbmcgb2YgdGhlIGZvcm1hdCAiMC9pbXBsSWQiCi0gICAqIHdoZXJlIHRoZSBkaWdpdCBiZWZvcmUgdGhlICIvIiByZXByZXNlbnRzIHRoZSBzY2VuYXJpbwotICAgKiAoZS5nLiBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NX1VQKSBhbmQgdGhlIGltcGxJZCBpcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZSBpZC4KLSAgICogQHBhcmFtIHJ1bnRpbWVJZCBpZCBvZiBhIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogQHJldHVybiBTdHJpbmdbXSBhcnJheSBvZiBwcm9qZWN0IG5hbWVzLiBUaGUgYXJyYXkgbWF5IGhhdmUgMCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UHJvamVjdHNGb3JTZXJ2aWNlVHlwZUFuZFJ1bnRpbWUoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBGYWNldFV0aWxzLmdldEFsbFByb2plY3RzKCk7Ci0gICAgQXJyYXlMaXN0IHZhbGlkUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKGRvZXNTZXJ2aWNlVHlwZUFuZFJ1bnRpbWVTdXBwb3J0UHJvamVjdCh0eXBlSWQsIHJ1bnRpbWVJZCwgcHJvamVjdHNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgdmFsaWRQcm9qZWN0cy5hZGQocHJvamVjdHNbaV0uZ2V0TmFtZSgpKTsgICAgICAgIAotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKXZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHByb2plY3Qgc3VwcG9ydHMgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUgYW5kIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAqIEBwYXJhbSB0eXBlSWQgbXVzdCBiZSBhIFN0cmluZyBvZiB0aGUgZm9ybWF0ICIwL2ltcGxJZCIKLSAgICogd2hlcmUgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgIi8iIHJlcHJlc2VudHMgdGhlIHNjZW5hcmlvCi0gICAqIChlLmcuIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVApIGFuZCB0aGUgaW1wbElkIGlzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0eXBlIGlkLgotICAgKiBAcGFyYW0gcnVudGltZUlkIGlkIG9mIGEgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgbmFtZSBvZiBhbiBJUHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0gICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgdHlwZSBhbmQgCi0gICAqIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIDx1bD4gCi0gICAqIDxsaT5pZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBnaXZlbiBXZWIgc2VydmljZSB0eXBlIGFuZCBXZWIgc2VydmljZSBydW50aW1lIG9yPC9saT4KLSAgICogPGxpPmlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yPC9saT4KLSAgICogPGxpPmlmIHByb2plY3ROYW1lIGlzIG51bGwgb3IgZW1wdHk8L2xpPgotICAgKiA8L3VsPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRvZXNTZXJ2aWNlVHlwZUFuZFJ1bnRpbWVTdXBwb3J0UHJvamVjdChTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgICBTdHJpbmdbXSBkZXNjcyA9IGdldFNlcnZpY2VSdW50aW1lc0J5U2VydmljZVR5cGUodHlwZUlkKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NzLmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChkZXNjc1tqXSk7Ci0gICAgICBpZiAoZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKS5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRvZXNTZXJ2aWNlUnVudGltZVN1cHBvcnRQcm9qZWN0KGRlc2NzW2pdLCBwcm9qZWN0TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7ICAgIAotICAgIAotICB9ICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwcm9qZWN0IHN1cHBvcnRzIHRoZSBnaXZlbiBzZXJ2aWNlUnVudGltZS4KLSAgICogQHBhcmFtIHNlcnZpY2VSdW50aW1lSWQgaWQgb2YgYSBzZXJ2aWNlUnVudGltZQotICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgbmFtZSBvZiBhbiBJUHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0gICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4KLSAgICogc2VydmljZVJ1bnRpbWUuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIDx1bD4gCi0gICAqIDxsaT5pZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBnaXZlbiBzZXJ2aWNlUnVudGltZSBvcjwvbGk+Ci0gICAqIDxsaT5pZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvcjwvbGk+Ci0gICAqIDxsaT5pZiBwcm9qZWN0TmFtZSBpcyBudWxsIG9yIGVtcHR5PC9saT4KLSAgICogPC91bD4KLSAgICovICAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRvZXNTZXJ2aWNlUnVudGltZVN1cHBvcnRQcm9qZWN0KFN0cmluZyBzZXJ2aWNlUnVudGltZUlkLCBTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgICBGYWNldE1hdGNoZXIgZm0gPSBGYWNldE1hdGNoQ2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRNYXRjaEZvclByb2plY3QoZmFsc2UsIHNlcnZpY2VSdW50aW1lSWQsIHByb2plY3ROYW1lKTsKLSAgICBpZiAoZm0gIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZm0uaXNNYXRjaCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gICAgCi0gIH0gIAotICAKLQotICAvKioKLSAgICogUmV0dXJucyBhbiBhcnJheSBvZiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9IGlkcyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUKLSAgICogYW5kIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAqIEBwYXJhbSB0eXBlSWQgbXVzdCBiZSBhIFN0cmluZyBvZiB0aGUgZm9ybWF0ICIwL2ltcGxJZCIKLSAgICogd2hlcmUgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgIi8iIHJlcHJlc2VudHMgdGhlIHNjZW5hcmlvCi0gICAqIChlLmcuIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVApIGFuZCB0aGUgaW1wbElkIGlzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0eXBlIGlkLgotICAgKiBAcGFyYW0gcnVudGltZUlkIGlkIG9mIGEgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBAcmV0dXJuIFN0cmluZ1tdIGFycmF5IG9mIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0gaWRzIHRoYXQgc3VwcG9ydCB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgdHlwZQotICAgKiBhbmQgV2ViIHNlcnZpY2UgcnVudGltZS4gVGhlIGFycmF5IG1heSBoYXZlIDAgZWxlbWVudHMuIFJldHVybnMgbnVsbCBpZiBubyBzZXJ2aWNlUnVudGltZXMgc3VwcG9ydGluZwotICAgKiB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgdHlwZSBjb3VsZCBiZSBmb3VuZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmljZVByb2plY3RUZW1wbGF0ZXMoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIFN0cmluZ1tdIHNySWRzID0gZ2V0U2VydmljZVJ1bnRpbWVzQnlTZXJ2aWNlVHlwZSh0eXBlSWQpOwotICAgIGlmIChzcklkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEFycmF5TGlzdCB0ZW1wbGF0ZUlkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNySWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChzcklkc1tpXSk7Ci0gICAgICBTdHJpbmcgdGhpc1J1bnRpbWVJZCA9IGRlc2MuZ2V0UnVudGltZSgpLmdldElkKCk7Ci0gICAgICBpZiAodGhpc1J1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIHsKLSAgICAgICAgLy9HZXQgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzZXJ2aWNlUnVudGltZQotICAgICAgICBTZXQgdGVtcGxhdGVzID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0VGVtcGxhdGVzRm9yU2VydmljZVJ1bnRpbWUoZGVzYy5nZXRJZCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vQWRkIHRoZSB0ZW1wbGF0ZSBpZHMgdG8gdGhlIGxpc3QgaWYgdGhleSBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQKLSAgICAgICAgSXRlcmF0b3IgaXRyID0gdGVtcGxhdGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgdGVtcGxhdGUgPSAoSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUpaXRyLm5leHQoKTsKLSAgICAgICAgICBpZiAoIXRlbXBsYXRlSWRMaXN0LmNvbnRhaW5zKHRlbXBsYXRlLmdldElkKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBsYXRlSWRMaXN0LmFkZCh0ZW1wbGF0ZS5nZXRJZCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0gIAotICAgIAotICAgIHJldHVybiAoU3RyaW5nW10pdGVtcGxhdGVJZExpc3QudG9BcnJheShuZXcgU3RyaW5nW117fSk7ICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0gc3VwcG9ydHMgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUKLSAgICogYW5kIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAqIEBwYXJhbSB0eXBlSWQgbXVzdCBiZSBhIFN0cmluZyBvZiB0aGUgZm9ybWF0ICIwL2ltcGxJZCIKLSAgICogd2hlcmUgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgIi8iIHJlcHJlc2VudHMgdGhlIHNjZW5hcmlvCi0gICAqIChlLmcuIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVApIGFuZCB0aGUgaW1wbElkIGlzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0eXBlIGlkLgotICAgKiBAcGFyYW0gcnVudGltZUlkIGlkIG9mIGEgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBAcGFyYW0gdGVtcGxhdGVJZCBpZCBvZiBhIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0KLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9IHN1cHBvcnRzIHRoZSBnaXZlbiAKLSAgICogV2ViIHNlcnZpY2UgdHlwZSBhbmQgV2ViIHNlcnZpY2UgcnVudGltZS4gUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzU2VydmljZVR5cGVBbmRSdW50aW1lU3VwcG9ydFRlbXBsYXRlKFN0cmluZyB0eXBlSWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0ZW1wbGF0ZUlkKQotICB7Ci0gICAgU3RyaW5nW10gc3JJZHMgPSBnZXRTZXJ2aWNlUnVudGltZXNCeVNlcnZpY2VUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKHNySWRzID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JJZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSBnZXRTZXJ2aWNlUnVudGltZURlc2NyaXB0b3JCeUlkKHNySWRzW2ldKTsKLSAgICAgIFN0cmluZyB0aGlzUnVudGltZUlkID0gZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKTsKLSAgICAgIGlmICh0aGlzUnVudGltZUlkLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgewotICAgICAgICAvL0dldCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNlcnZpY2VSdW50aW1lCi0gICAgICAgIFNldCB0ZW1wbGF0ZXMgPSBGYWNldE1hdGNoQ2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRUZW1wbGF0ZXNGb3JTZXJ2aWNlUnVudGltZShzcklkc1tpXSk7Ci0gICAgICAgIAotICAgICAgICAvL0NoZWNrIGlmIGFueSBvZiB0aGUgdGVtcGxhdGUgaWRzIG1hdGNoIHRoZSBnaXZlbiBvbmUuCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IHRlbXBsYXRlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIHRlbXBsYXRlID0gKElGYWNldGVkUHJvamVjdFRlbXBsYXRlKWl0ci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHRlbXBsYXRlLmdldElkKCkuZXF1YWxzKHRlbXBsYXRlSWQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9ICAKLSAgICAKLSAgICByZXR1cm4gZmFsc2U7ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4ge0BsaW5rIElGYWNldGVkUHJvamVjdFRlbXBsYXRlfSBzdXBwb3J0cyB0aGUgZ2l2ZW4gc2VydmljZVJ1bnRpbWUuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUnVudGltZUlkIGlkIG9mIGEgc2VydmljZVJ1bnRpbWUKLSAgICogQHBhcmFtIHRlbXBsYXRlSWQgaWQgb2YgYSB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9Ci0gICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4ge0BsaW5rIElGYWNldGVkUHJvamVjdFRlbXBsYXRlfSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIHNlcnZpY2VSdW50aW1lLiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZG9lc1NlcnZpY2VSdW50aW1lU3VwcG9ydFRlbXBsYXRlKFN0cmluZyBzZXJ2aWNlUnVudGltZUlkLCBTdHJpbmcgdGVtcGxhdGVJZCkKLSAgewotICAgIC8vR2V0IHRoZSB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2VydmljZVJ1bnRpbWUKLSAgICBTZXQgdGVtcGxhdGVzID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0VGVtcGxhdGVzRm9yU2VydmljZVJ1bnRpbWUoc2VydmljZVJ1bnRpbWVJZCk7Ci0gICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgY2hlY2tpbmdUZW1wbGF0ZSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFRlbXBsYXRlKHRlbXBsYXRlSWQpOwotICAgIHJldHVybiB0ZW1wbGF0ZXMuY29udGFpbnMoY2hlY2tpbmdUZW1wbGF0ZSk7Ci0gIH0gIAotICAKLSAgLy9DbGllbnQtc2lkZSB1dGlsaXRpZXMKLSAgLyoqCi0gICAqIFJldHVybnMgYSBXZWJTZXJ2aWNlQ2xpZW50SW1wbCBnaXZlbiB0aGUgaWQgb2YgYSBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZS4KLSAgICogQHBhcmFtIGlkIAotICAgKiBAcmV0dXJuIHtAbGluayBXZWJTZXJ2aWNlQ2xpZW50SW1wbH0gd2l0aCB0aGUgZ2l2ZW4gaWQKLSAgICogUmV0dXJucyBudWxsIGlmIHN1Y2ggYSBXZWJTZXJ2aWNlQ2xpZW50SW1wbCBjYW5ub3QgYmUgZm91bmQuCi0gICAqLyAgCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUNsaWVudEltcGwgZ2V0V2ViU2VydmljZUNsaWVudEltcGxCeUlkKFN0cmluZyBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSByZWdpc3RyeS53ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfLmdldChpZCk7Ci0gICAgaWYgKHJlc3VsdCE9bnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFdlYlNlcnZpY2VDbGllbnRJbXBsKXJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIHtAbGluayBDbGllbnRSdW50aW1lRGVzY3JpcHRvcn0gZ2l2ZW4gdGhlIGlkIG9mIGEgY2xpZW50UnVudGltZS4KLSAgICogQHBhcmFtIGlkIG9mIGEgY2xpZW50UnVudGltZQotICAgKiBAcmV0dXJuIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGlkCi0gICAqIFJldHVybnMgbnVsbCBpZiBzdWNoIGEgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgY2Fubm90IGJlIGZvdW5kLgotICAgKi8gIAotICBwdWJsaWMgc3RhdGljIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIGdldENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yQnlJZChTdHJpbmcgaWQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gcmVnaXN0cnkuY2xpZW50UnVudGltZXNfLmdldChpZCk7Ci0gICAgaWYgKHJlc3VsdCE9bnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yKXJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgICAgICAKLSAgfSAgICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSVdlYlNlcnZpY2VSdW50aW1lfSBvZiB0aGUgZ2l2ZW4gY2xpZW50UnVudGltZS4gRXh0ZW5kZXJzIHByb3ZpZGUgdGhlIGZ1bGx5IAotICAgKiBxdWFsaWZpZWQgbmFtZSBvZiBhIGNvbmNyZXRlIElXZWJTZXJ2aWNlUnVudGltZSBpbiB0aGUgY2xhc3MgYXR0cmlidXRlIG9mIGEgY2xpZW50UnVudGltZXMgZXh0ZW5zaW9uLgotICAgKiBAcGFyYW0gY2xpZW50UnVudGltZUlkIGlkIG9mIGEgY2xpZW50UnVudGltZQotICAgKiBAcmV0dXJuIElXZWJTZXJ2aWNlUnVudGltZQotICAgKi8gIAotICBwdWJsaWMgc3RhdGljIElXZWJTZXJ2aWNlUnVudGltZSBnZXRDbGllbnRSdW50aW1lKCBTdHJpbmcgY2xpZW50UnVudGltZUlkICkKLSAgewotICAgIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRDbGllbnRSdW50aW1lRGVzY3JpcHRvckJ5SWQoY2xpZW50UnVudGltZUlkKTsKLSAgICBJV2ViU2VydmljZVJ1bnRpbWUgICAgd2Vic2VydmljZVJ1bnRpbWUgICAgID0gbnVsbDsKLSAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotICAgIHsKLSAgICAgICAgd2Vic2VydmljZVJ1bnRpbWUgPSBkZXNjcmlwdG9yLmdldFdlYlNlcnZpY2VSdW50aW1lKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB3ZWJzZXJ2aWNlUnVudGltZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGlkIG9mIGEgY2xpZW50UnVudGltZSB0aGF0IHN1cHBvcnRzIHRoZSBwcm92aWRlZCBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZSwgV2ViIHNlcnZpY2UgcnVudGltZSwKLSAgICogc2VydmVyIHR5cGUvc2VydmVyIGluc3RhbmNlIChpZiBwcmVzZW50KSwgcHJvamVjdCBvciBwcm9qZWN0IHR5cGUuCi0gICAqIEBwYXJhbSB0cnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFR5cGVSdW50aW1lU2VydmVyfSBjb250YWluaW5nIGEgV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUgaWQsIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgaWQsCi0gICAqIHNlcnZlciB0eXBlIGlkIGFuZCBzZXJ2ZXIgaW5zdGFuY2UgaWQuIFRoZSBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZSBpZCBhbmQgV2ViIHNlcnZpY2UgcnVudGltZSBpZCBtdXN0IGJlIG5vbi1udWxsIAotICAgKiBhbmQgbm9uLWVtcHR5LiBUaGUgc2VydmVyIHR5cGUgaWQgYW5kIHNlcnZlciBpbnN0YW5jZSBpZCBtYXkgYmUgbnVsbCBvciBlbXB0eS4KLSAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIGFuIElQcm9qZWN0IHRoYXkgbWF5IG9yIG1hdCBub3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4gTXVzdCBiZSBub24tbnVsbCBhbmQgCi0gICAqIG5vbi1lbXB0eS4KLSAgICogQHBhcmFtIHRlbXBsYXRlSWQgdGhlIGlkIG9mIGFuIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0uIE11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1lbXB0eSBpZgotICAgKiBhbiBJUHJvamVjdCB3aXRoIHRoZSBuYW1lIHByb2plY3ROYW1lIGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuIAotICAgKiBAcmV0dXJuIFN0cmluZyBpZCBvZiBhIGNsaWVudFJ1bnRpbWUgdGhhdCBzdXBwb3J0cyB0aGUgcHJvdmlkZWQgV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUsIFdlYiBzZXJ2aWNlIHJ1bnRpbWUsCi0gICAqIHNlcnZlciB0eXBlL3NlcnZlciBpbnN0YW5jZSAoaWYgcHJlc2VudCksIHByb2plY3Qgb3IgcHJvamVjdCB0eXBlLiBSZXR1cm5zIGFuIGVtcHR5IFN0cmluZyBpZiBubyAKLSAgICogc3VjaCBjbGllbnRSdW50aW1lIGNvdWxkIGJlIGZvdW5kLgotICAgKi8gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGllbnRSdW50aW1lSWQoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHJzLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyB0ZW1wbGF0ZUlkKQotICB7Ci0gICAgYm9vbGVhbiBzZXJ2ZXJTZWxlY3RlZCA9ICh0cnMuZ2V0U2VydmVySWQoKSE9bnVsbCkgJiYgKHRycy5nZXRTZXJ2ZXJJZCgpLmxlbmd0aCgpPjApOwotICAgIC8vRmluZCB0aGUgZmlyc3QgY2xpZW50UnVudGltZSB0aGF0IHN1cHBvcnRzIHRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlLCBydW50aW1lLCBzZXJ2ZXIsIGFuZCBwcm9qZWN0Ci0gICAgU3RyaW5nW10gZGVzY3MgPSBnZXRDbGllbnRSdW50aW1lc0J5VHlwZSh0cnMuZ2V0VHlwZUlkKCkpOwotICAgIGZvciAoaW50IGk9MDsgaTxkZXNjcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBDbGllbnRSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gZ2V0Q2xpZW50UnVudGltZURlc2NyaXB0b3JCeUlkKGRlc2NzW2ldKTsgICAgICAKLSAgICAgIGlmIChkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpLmVxdWFscyh0cnMuZ2V0UnVudGltZUlkKCkpKQotICAgICAgewotICAgICAgICBpZiAoc2VydmVyU2VsZWN0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU2VydmVyID0gZG9lc0NsaWVudFJ1bnRpbWVTdXBwb3J0U2VydmVyKGRlc2MuZ2V0SWQoKSwgdHJzLmdldFNlcnZlcklkKCkpOwotICAgICAgICAgIGlmICghc3VwcG9ydHNTZXJ2ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZG9lc0NsaWVudFJ1bnRpbWVTdXBwb3J0UHJvamVjdChkZXNjLmdldElkKCksIHByb2plY3ROYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGVzYy5nZXRJZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvL0NoZWNrIGlmIHRlbXBsYXRlIGlzIHN1cHBvcnRlZAotICAgICAgICAgIGlmIChkb2VzQ2xpZW50UnVudGltZVN1cHBvcnRUZW1wbGF0ZShkZXNjLmdldElkKCksIHRlbXBsYXRlSWQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNjLmdldElkKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYWxsIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgaWRzIGZvciB0aGUgY2xpZW50IHNpZGUuCi0gICAqIEByZXR1cm4gU3RyaW5nW10gYXJyYXkgb2YgV2ViIHNlcnZpY2UgcnVudGltZSBpZHMgZm9yIHRoZSBjbGllbnQgc2lkZS4KLSAgICogVGhlIGFycmF5IG1heSBoYXZlIDAgZWxlbWVudHMuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxSdW50aW1lc0ZvckNsaWVudFNpZGUoKSAKLSAgewotICAgIEFycmF5TGlzdCBydW50aW1lSWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RyeS5jbGllbnRSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpICAgCi0gICAgewotICAgICAgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzYyA9IChDbGllbnRSdW50aW1lRGVzY3JpcHRvcilpdGVyLm5leHQoKTsKLSAgICAgIFN0cmluZyB0aGlzUnVudGltZUlkID0gZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKTsgCi0gICAgICBpZiAoIXJ1bnRpbWVJZHMuY29udGFpbnModGhpc1J1bnRpbWVJZCkpCi0gICAgICBydW50aW1lSWRzLmFkZCh0aGlzUnVudGltZUlkKTsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlydW50aW1lSWRzLnRvQXJyYXkobmV3IFN0cmluZ1tde30pOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWRzIG9mIGFsbCBjbGllbnRSdW50aW1lcyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuCi0gICAqIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlLgotICAgKiBAcGFyYW0gY2xpZW50SW1wbElkIGlkIG9mIGEgV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUKLSAgICogQHJldHVybnMgU3RyaW5nW10gYXJyYXkgY29udGFpbmluZyB0aGUgaWRzIG9mIGFsbCBjbGllbnRSdW50aW1lcyB0aGF0Ci0gICAqIHN1cHBvcnQgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlLiBUaGUgYXJyYXkgbWF5IGhhdmUgMCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xpZW50UnVudGltZXNCeVR5cGUoU3RyaW5nIGNsaWVudEltcGxJZCkgCi0gIHsKLSAgICBBcnJheUxpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RyeS5jbGllbnRSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpICAgCi0gICAgewotICAgICAgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzYyA9IChDbGllbnRSdW50aW1lRGVzY3JpcHRvcilpdGVyLm5leHQoKTsKLSAgICAgIC8vQ2hlY2sgaWYgdGhpcyBzZXJ2aWNlUnVudGltZSBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb24gdHlwZQotICAgICAgaWYgKGRlc2MuZ2V0Q2xpZW50SW1wbGVtZW50YXRpb25UeXBlKCkuZ2V0SWQoKS5lcXVhbHMoY2xpZW50SW1wbElkKSkKLSAgICAgIHsKLSAgICAgICAgaWRzLmFkZChkZXNjLmdldElkKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKWlkcy50b0FycmF5KG5ldyBTdHJpbmdbXXt9KTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWRzIG9mIGFsbCBXZWIgc2VydmljZSBydW50aW1lcyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuCi0gICAqIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlLgotICAgKiBAcGFyYW0gY2xpZW50SW1wbElkIGlkIG9mIGEgV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUKLSAgICogQHJldHVybiBTdHJpbmdbXSBhcnJheSBjb250YWluaW5nIHRoZSBpZHMgb2YgYWxsIFdlYiBzZXJ2aWNlIHJ1bnRpbWVzIHRoYXQKLSAgICogc3VwcG9ydCB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUuIFRoZSBhcnJheSBtYXkgaGF2ZSAwIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRSdW50aW1lc0J5Q2xpZW50VHlwZShTdHJpbmcgY2xpZW50SW1wbElkKSAKLSAgewotICAgIEFycmF5TGlzdCBydW50aW1lSWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RyeS5jbGllbnRSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpICAgCi0gICAgewotICAgICAgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzYyA9IChDbGllbnRSdW50aW1lRGVzY3JpcHRvcilpdGVyLm5leHQoKTsKLSAgICAgIC8vQ2hlY2sgaWYgdGhpcyBzZXJ2aWNlUnVudGltZSBzdXBwb3J0cyB0aGUgaW1wbGVtZW50YXRpb24gdHlwZQotICAgICAgaWYgKGRlc2MuZ2V0Q2xpZW50SW1wbGVtZW50YXRpb25UeXBlKCkuZ2V0SWQoKS5lcXVhbHMoY2xpZW50SW1wbElkKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFydW50aW1lSWRzLmNvbnRhaW5zKGRlc2MuZ2V0UnVudGltZSgpLmdldElkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcnVudGltZUlkcy5hZGQoZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlydW50aW1lSWRzLnRvQXJyYXkobmV3IFN0cmluZ1tde30pOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgcnVudGltZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlLgotICAgKiBAcGFyYW0gY2xpZW50SW1wbElkIGlkIG9mIGEgV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUKLSAgICogQHBhcmFtIHJ1bnRpbWVJZCBpZCBvZiBhIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBXZWIgc2VydmljZSBydW50aW1lIHN1cHBvcnRzIHRoZSBnaXZlbiAKLSAgICogV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUuIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lU3VwcG9ydGVkRm9yQ2xpZW50VHlwZShTdHJpbmcgY2xpZW50SW1wbElkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgU3RyaW5nW10gY2xpZW50UnVudGltZUlkcyA9IGdldENsaWVudFJ1bnRpbWVzQnlUeXBlKGNsaWVudEltcGxJZCk7Ci0gICAgaWYgKGNsaWVudFJ1bnRpbWVJZHMhPW51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2xpZW50UnVudGltZUlkcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzYyA9IGdldENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yQnlJZChjbGllbnRSdW50aW1lSWRzW2ldKTsKLSAgICAgICAgaWYgKGRlc2MuZ2V0UnVudGltZSgpLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGFsbCBzZXJ2ZXIgdHlwZSBpZHMgd2l0aCBjb25maWd1cmVkIHNlcnZlciBydW50aW1lcy4KLSAgICogQHJldHVybiBTdHJpbmdbXSBhcnJheSBvZiBzZXJ2ZXIgdHlwZSBpZHMuIFRoZSBhcnJheSBtYXkgaGF2ZSAwIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxDbGllbnRTZXJ2ZXJGYWN0b3J5SWRzKCkgCi0gIHsgICAgCi0gICAgLy9JdGVyYXRvciBpdGVyID0gcmVnaXN0cnkuY2xpZW50UnVudGltZXNfLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgLy93aGlsZSAoaXRlci5oYXNOZXh0KCkpICAgCi0gICAgLy97Ci0gICAgICAvL1RPRE8gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgc2VydmVyIHR5cGVzIGFuZCBzZWUgaWYgdGhlaXIgcnVudGltZSB0eXBlcyBoYXZlIGFuCi0gICAgICAvL2lkIHRoYXQgbWF0Y2hlcyB0aGUgcnVudGltZSB0eXBlIG9mIGFueSBvZiB0aGUgcnVudGltZXMuICAgICAgICAgICAgCi0gICAgICAvLyBDbGllbnRSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gKENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yKWl0ZXIubmV4dCgpOwotICAgICAgLy8gU2V0IHJ1bnRpbWVzID0gZ2V0UnVudGltZXMoZGVzYy5nZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMoKSk7Ci0gICAgICAvLyBJU2VydmVyVHlwZVtdIGFsbFNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotICAgIC8vfQotICAgIC8vcmV0dXJuIChTdHJpbmdbXSlzZXJ2ZXJGYWN0b3J5SWRzLnRvQXJyYXkobmV3IFN0cmluZ1tde30pOwotICAgIC8vVGVtcG9yYXJpbHkgcmV0dXJuIGFsbCBzZXJ2ZXIgdHlwZXMKLSAgICByZXR1cm4gZ2V0QWxsU2VydmVyRmFjdG9yeUlkc1dpdGhSdW50aW1lcygpOyAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGlkcyBvZiBhbGwgc2VydmVyIHR5cGVzIHRoYXQgc3VwcG9ydCB0aGUgZ2l2ZW4KLSAgICogV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUuCi0gICAqICAKLSAgICogQHBhcmFtIGNsaWVudEltcGxJZCBpZCBvZiBhIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlCi0gICAqIEByZXR1cm4gU3RyaW5nW10gYXJyYXkgY29udGFpbmluZyB0aGUgaWRzIG9mIGFsbCBzZXJ2ZXIgdHlwZXMgdGhhdAotICAgKiBzdXBwb3J0IHRoZSBnaXZlbiBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZS4gVGhlIGFycmF5IG1heSBoYXZlIDAgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHNCeUNsaWVudFR5cGUoU3RyaW5nIGNsaWVudEltcGxJZCkKLSAgewotICAgIEFycmF5TGlzdCBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZ1tdIGNydHMgPSBnZXRDbGllbnRSdW50aW1lc0J5VHlwZShjbGllbnRJbXBsSWQpOwotICAgIGlmIChjcnRzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICAvL0dldCB0aGUgcnVudGltZXMgdGhhdCB3b3JrIGZvciB0aGUgZmFjZXRzIHJlcXVpcmVkIGZvciB0aGlzIHNlcnZpY2VSdW50aW1lICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gZklkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeUNsaWVudFJ1bnRpbWUoY3J0c1tpXSk7Ci0gICAgICAgIGZvciAoaW50IGo9MDsgajxmSWRzLmxlbmd0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFzZXJ2ZXJGYWN0b3J5SWRzLmNvbnRhaW5zKGZJZHNbal0pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZlckZhY3RvcnlJZHMuYWRkKGZJZHNbal0pOyAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiAoU3RyaW5nW10pc2VydmVyRmFjdG9yeUlkcy50b0FycmF5KG5ldyBTdHJpbmdbXXt9KTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gc2VydmVyIHR5cGUgc3VwcG9ydHMgdGhlIGdpdmVuIAotICAgKiBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZS4KLSAgICogQHBhcmFtIGNsaWVudEltcGxJZCBpZCBvZiBhIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgaWQgb2YgYSBzZXJ2ZXIgdHlwZQotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlLiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VydmVyU3VwcG9ydGVkRm9yQ2hvc2VuQ2xpZW50VHlwZShTdHJpbmcgY2xpZW50SW1wbElkLCBTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgU3RyaW5nW10gZklkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeUNsaWVudFR5cGUoY2xpZW50SW1wbElkKTsKLSAgICBpZiAoZklkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpPTA7aTxmSWRzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKHNlcnZlckZhY3RvcnlJZC5lcXVhbHMoZklkc1tpXSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGlkcyBvZiBhbGwgc2VydmVyIHR5cGVzIHRoYXQgc3VwcG9ydCB0aGUgZ2l2ZW4KLSAgICogY2xpZW50UnVudGltZS4KLSAgICogCi0gICAqIEBwYXJhbSBjbGllbnRSdW50aW1lSWQgaWQgb2YgYSBjbGllbnRSdW50aW1lCi0gICAqIEByZXR1cm4gU3RyaW5nW10gYXJyYXkgY29udGFpbmluZyB0aGUgaWRzIG9mIGFsbCBzZXJ2ZXIgdHlwZXMgdGhhdAotICAgKiBzdXBwb3J0IHRoZSBnaXZlbiBjbGllbnRSdW50aW1lLiBUaGUgYXJyYXkgbWF5IGhhdmUgMCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlkc0J5Q2xpZW50UnVudGltZShTdHJpbmcgY2xpZW50UnVudGltZUlkKQotICB7ICAgICAgIAotICAgIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSBnZXRDbGllbnRSdW50aW1lRGVzY3JpcHRvckJ5SWQoY2xpZW50UnVudGltZUlkKTsKLSAgICBTZXQgZmFjZXRSdW50aW1lcyA9IGdldFJ1bnRpbWVzKGRlc2MuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCkpOwotCi0gICAgU3RyaW5nW10gZklkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeUZhY2V0UnVudGltZXMoZmFjZXRSdW50aW1lcyk7Ci0gICAgcmV0dXJuIGZJZHM7ICAgIAotICB9ICAgIAotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIGNsaWVudFJ1bnRpbWUuCi0gICAqIAotICAgKiBAcGFyYW0gY2xpZW50UnVudGltZUlkIGlkIG9mIGEgY2xpZW50UnVudGltZQotICAgKiBAcGFyYW0gc2VydmVyRmFjdG9yeUlkIGlkIG9mIGEgc2VydmVyIHR5cGUKLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gCi0gICAqIGNsaWVudFJ1bnRpbWUuIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZG9lc0NsaWVudFJ1bnRpbWVTdXBwb3J0U2VydmVyKFN0cmluZyBjbGllbnRSdW50aW1lSWQsIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJJZHMgPSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlDbGllbnRSdW50aW1lKGNsaWVudFJ1bnRpbWVJZCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcklkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2VydmVySWRzW2ldLmVxdWFscyhzZXJ2ZXJGYWN0b3J5SWQpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gc2VydmVyIHR5cGUgc3VwcG9ydHMgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogCi0gICAqIEBwYXJhbSBydW50aW1lSWQgaWQgb2YgYSBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIEBwYXJhbSBmYWN0b3J5SWQgaWQgb2YgYSBzZXJ2ZXIgdHlwZQotICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHNlcnZlciB0eXBlIHN1cHBvcnRzIHRoZSBnaXZlbiAKLSAgICogV2ViIHNlcnZpY2UgcnVudGltZSBmb3IgdGhlIGNsaWVudCBzaWRlLiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydFNlcnZlckZvckNsaWVudFNpZGUoU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIGZhY3RvcnlJZCkKLSAgewotICAgIC8vR2V0IGFsbCB0aGUgQ2xpZW50UnVudGltZURlc2NyaXB0b3JzIHRoYXQgcG9pbnQgdG8gdGhpcyBydW50aW1lSWQKLSAgICBJdGVyYXRvciBpdGVyID0gcmVnaXN0cnkuY2xpZW50UnVudGltZXNfLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSAgIAotICAgIHsKLSAgICAgIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSAoQ2xpZW50UnVudGltZURlc2NyaXB0b3IpaXRlci5uZXh0KCk7Ci0gICAgICAvL2NoZWNrIGlmIHRoaXMgY2xpZW50UnVudGltZSBwb2ludHMgdG8gcnVudGltZUlkCi0gICAgICBTdHJpbmcgdGhpc1J1bnRpbWVJZCA9IGRlc2MuZ2V0UnVudGltZSgpLmdldElkKCk7Ci0gICAgICBpZiAodGhpc1J1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIHsKLSAgICAgICAgU2V0IGZhY2V0UnVudGltZXMgPSBnZXRSdW50aW1lcyhkZXNjLmdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpKTsKLSAgICAgICAgU3RyaW5nW10gZklkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeUZhY2V0UnVudGltZXMoZmFjZXRSdW50aW1lcyk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxmSWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGZJZHNbaV0uZXF1YWxzKGZhY3RvcnlJZCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8vTm8gbWF0Y2guCi0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAgIAotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGlkIG9mIGEgc2VydmVyIHR5cGUgdGhhdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBvbiB0aGUgY2xpZW50IHNpZGUuCi0gICAqIAotICAgKiBAcGFyYW0gcnVudGltZUlkIGlkIG9mIGEgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgaWQgb2YgYSBzZXJ2ZXIgdHlwZSB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIG9uIHRoZSBjbGllbnQgc2lkZS4gUmV0dXJucyBudWxsIGlmIHN1Y2ggYSBzZXJ2ZXIgdHlwZSBjYW5ub3QgYmUgZm91bmQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlckZvckNsaWVudFNpZGUoU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIC8vR2V0IGFsbCB0aGUgQ2xpZW50UnVudGltZURlc2NyaXB0b3JzIHRoYXQgcG9pbnQgdG8gdGhpcyBydW50aW1lSWQKLSAgICBJdGVyYXRvciBpdGVyID0gcmVnaXN0cnkuY2xpZW50UnVudGltZXNfLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSAgIAotICAgIHsKLSAgICAgIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSAoQ2xpZW50UnVudGltZURlc2NyaXB0b3IpaXRlci5uZXh0KCk7Ci0gICAgICAvL2NoZWNrIGlmIHRoaXMgY2xpZW50UnVudGltZSBwb2ludHMgdG8gcnVudGltZUlkCi0gICAgICBTdHJpbmcgdGhpc1J1bnRpbWVJZCA9IGRlc2MuZ2V0UnVudGltZSgpLmdldElkKCk7Ci0gICAgICBpZiAodGhpc1J1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIHsKLSAgICAgICAgU2V0IGZhY2V0UnVudGltZXMgPSBnZXRSdW50aW1lcyhkZXNjLmdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpKTsKLSAgICAgICAgU3RyaW5nW10gZmFjdG9yeUlkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeUZhY2V0UnVudGltZXMoZmFjZXRSdW50aW1lcyk7Ci0gICAgICAgIGlmIChmYWN0b3J5SWRzIT1udWxsICYmIGZhY3RvcnlJZHMubGVuZ3RoID4wKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhY3RvcnlJZHNbMF07Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9ObyBzdWl0YWJsZSBzZXJ2ZXJzIGZvdW5kLiBSZXR1cm4gbnVsbC4KLSAgICByZXR1cm4gbnVsbDsKLQotICB9Ci0gIAotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBjb21iaW5hdGlvbiBvZiBzZXJ2ZXIgdHlwZSwgV2ViIHNlcnZpY2UgcnVudGltZSwgYW5kIAotICAgKiBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZSBpcyBzdXBwb3J0ZWQuIFVzZWQgZm9yIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gc2VydmVyRmFjdG9yeUlkIGlkIG9mIGEgc2VydmVyIHR5cGUKLSAgICogQHBhcmFtIHJ1bnRpbWVJZCBpZCBvZiBhIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogQHBhcmFtIGNsaWVudEltcGxJZCBpZCBvZiBhIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlCi0gICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gY29tYmluYXRpb24gb2Ygc2VydmVyIHR5cGUsIFdlYiBzZXJ2aWNlIHJ1bnRpbWUsIAotICAgKiBhbmQgV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUgaXMgc3VwcG9ydGVkLiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VydmVyQ2xpZW50UnVudGltZVR5cGVTdXBwb3J0ZWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIGNsaWVudEltcGxJZCkgIAotICB7Ci0gICAgLy9FbnN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNsaWVudFJ1bnRpbWUgdGhhdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gdHlwZQotICAgIFN0cmluZ1tdIGNsaWVudFJ1bnRpbWVzID0gZ2V0Q2xpZW50UnVudGltZXNCeVR5cGUoY2xpZW50SW1wbElkKTsKLSAgICBpZiAoY2xpZW50UnVudGltZXMhPW51bGwgJiYgY2xpZW50UnVudGltZXMubGVuZ3RoPjApCi0gICAgewotICAgICAgLy9FbnN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgb2YgdGhlc2Ugc2VydmVyIHJ1bnRpbWVzIHN1cHBvcnRzIHRoZSBnaXZlbiBzZXJ2ZXIKLSAgICAgIGZvciAoaW50IGk9MDsgaTxjbGllbnRSdW50aW1lcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ2xpZW50UnVudGltZURlc2NyaXB0b3IgZGVzYyA9IGdldENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yQnlJZChjbGllbnRSdW50aW1lc1tpXSk7Ci0gICAgICAgIGlmIChkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy9NYXRjaGVkIHR5cGUgYW5kIHJ1bnRpbWUuIENoZWNrIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAgU3RyaW5nW10gZmFjdG9yeUlkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeUNsaWVudFJ1bnRpbWUoZGVzYy5nZXRJZCgpKTsKLSAgICAgICAgICBmb3IgKGludCBqPTA7IGo8ZmFjdG9yeUlkcy5sZW5ndGg7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmFjdG9yeUlkc1tqXS5lcXVhbHMoc2VydmVyRmFjdG9yeUlkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vTm8gbWF0Y2ggZm91bmQuIHJldHVybiBmYWxzZS4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gICAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyBhbiBhcnJheSBvZiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9IGlkcyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlCi0gICAqIGFuZCBXZWIgc2VydmljZSBydW50aW1lLgotICAgKiAKLSAgICogQHBhcmFtIGNsaWVudEltcGxJZCBpZCBvZiBhIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlCi0gICAqIEBwYXJhbSBydW50aW1lSWQgaWQgb2YgYSBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIEByZXR1cm4gU3RyaW5nW10gYXJyYXkgb2Yge0BsaW5rIElGYWNldGVkUHJvamVjdFRlbXBsYXRlfSBpZHMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbiBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZQotICAgKiBhbmQgV2ViIHNlcnZpY2UgcnVudGltZS4gVGhlIGFycmF5IG1heSBoYXZlIDAgZWxlbWVudHMuIFJldHVybnMgbnVsbCBpZiBubyBjbGllbnRSdW50aW1lcyBzdXBwb3J0aW5nCi0gICAqIHRoZSBnaXZlbiBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZSBjb3VsZCBiZSBmb3VuZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xpZW50UHJvamVjdFRlbXBsYXRlcyhTdHJpbmcgY2xpZW50SW1wbElkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgU3RyaW5nW10gY3JJZHMgPSBnZXRDbGllbnRSdW50aW1lc0J5VHlwZShjbGllbnRJbXBsSWQpOwotICAgIGlmIChjcklkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEFycmF5TGlzdCB0ZW1wbGF0ZUlkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNySWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSBnZXRDbGllbnRSdW50aW1lRGVzY3JpcHRvckJ5SWQoY3JJZHNbaV0pOwotICAgICAgU3RyaW5nIHRoaXNSdW50aW1lSWQgPSBkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpOwotICAgICAgaWYgKHRoaXNSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICB7Ci0gICAgICAgIC8vR2V0IHRoZSB0ZW1wbGF0ZXMgZm9yIHRoaXMgY2xpZW50UnVudGltZQotICAgICAgICBTZXQgdGVtcGxhdGVzID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0VGVtcGxhdGVzRm9yQ2xpZW50UnVudGltZShkZXNjLmdldElkKCkpOwotICAgICAgICAKLSAgICAgICAgLy9BZGQgdGhlIHRlbXBsYXRlIGlkcyB0byB0aGUgbGlzdCBpZiB0aGV5IGhhdmUgbm90IGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgICBJdGVyYXRvciBpdHIgPSB0ZW1wbGF0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSlpdHIubmV4dCgpOwotICAgICAgICAgIGlmICghdGVtcGxhdGVJZExpc3QuY29udGFpbnModGVtcGxhdGUuZ2V0SWQoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGVtcGxhdGVJZExpc3QuYWRkKHRlbXBsYXRlLmdldElkKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfSAgCi0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSl0ZW1wbGF0ZUlkTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbXXt9KTsgICAgCi0gIH0gIAotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0gc3VwcG9ydHMgdGhlIGdpdmVuIAotICAgKiBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZSBhbmQgV2ViIHNlcnZpY2UgcnVudGltZS4KLSAgICogCi0gICAqIEBwYXJhbSBjbGllbnRJbXBsSWQgaWQgb2YgYSBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZQotICAgKiBAcGFyYW0gcnVudGltZUlkIGlkIG9mIGEgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBAcGFyYW0gdGVtcGxhdGVJZCBpZCBvZiBhIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0KLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9IHN1cHBvcnRzIHRoZSBnaXZlbiAKLSAgICogV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUgYW5kIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZG9lc0NsaWVudFR5cGVBbmRSdW50aW1lU3VwcG9ydFRlbXBsYXRlKFN0cmluZyBjbGllbnRJbXBsSWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0ZW1wbGF0ZUlkKQotICB7Ci0gICAgU3RyaW5nW10gY3JJZHMgPSBnZXRDbGllbnRSdW50aW1lc0J5VHlwZShjbGllbnRJbXBsSWQpOwotICAgIGlmIChjcklkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNySWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSBnZXRDbGllbnRSdW50aW1lRGVzY3JpcHRvckJ5SWQoY3JJZHNbaV0pOwotICAgICAgU3RyaW5nIHRoaXNSdW50aW1lSWQgPSBkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpOwotICAgICAgaWYgKHRoaXNSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICB7Ci0gICAgICAgIC8vR2V0IHRoZSB0ZW1wbGF0ZXMgZm9yIHRoaXMgY2xpZW50UnVudGltZQotICAgICAgICBTZXQgdGVtcGxhdGVzID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0VGVtcGxhdGVzRm9yQ2xpZW50UnVudGltZShjcklkc1tpXSk7Ci0gICAgICAgIAotICAgICAgICAvL0NoZWNrIGlmIHRoZSB0ZW1wbGF0ZSBpZHMgY29udGFpbnMgdGhlIHRlbXBsYXRlIHdlJ3JlIGNoZWNraW5nIGZvcgotICAgICAgICBJdGVyYXRvciBpdHIgPSB0ZW1wbGF0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSlpdHIubmV4dCgpOwotICAgICAgICAgIGlmICh0ZW1wbGF0ZS5nZXRJZCgpLmVxdWFscyh0ZW1wbGF0ZUlkKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0gIAotICAgIAotICAgIHJldHVybiBmYWxzZTsgICAgCi0gIH0gIAotICAKLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4ge0BsaW5rIElGYWNldGVkUHJvamVjdFRlbXBsYXRlfSAKLSAgICogc3VwcG9ydHMgdGhlIGdpdmVuIGNsaWVudFJ1bnRpbWUKLSAgICogIAotICAgKiBAcGFyYW0gY2xpZW50UnVudGltZUlkIGlkIG9mIGEgY2xpZW50UnVudGltZQotICAgKiBAcGFyYW0gdGVtcGxhdGVJZCBpZCBvZiBhIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0KLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9IHN1cHBvcnRzIHRoZSBnaXZlbiAKLSAgICogY2xpZW50UnVudGltZS4gUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRvZXNDbGllbnRSdW50aW1lU3VwcG9ydFRlbXBsYXRlKFN0cmluZyBjbGllbnRSdW50aW1lSWQsIFN0cmluZyB0ZW1wbGF0ZUlkKQotICB7Ci0gICAgLy9HZXQgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBjbGllbnRSdW50aW1lCi0gICAgU2V0IHRlbXBsYXRlcyA9IEZhY2V0TWF0Y2hDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFRlbXBsYXRlc0ZvckNsaWVudFJ1bnRpbWUoY2xpZW50UnVudGltZUlkKTsKLSAgICBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBjaGVja2luZ1RlbXBsYXRlID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUodGVtcGxhdGVJZCk7Ci0gICAgcmV0dXJuIHRlbXBsYXRlcy5jb250YWlucyhjaGVja2luZ1RlbXBsYXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxhYmVscyBhbmQgaWRzIG9mIGFsbCBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZXMuIAotICAgKiBVc2VkIHRvIHBvcHVsYXRlIHRoZSBXZWIgc2VydmljZSBjbGllbnQgdHlwZSBjb21ibyBib3ggb24KLSAgICogcGFnZSAxIG9mIHRoZSBXZWIgc2VydmljZSB3aXphcmQgYW5kIFdlYiBzZXJ2aWNlIGNsaWVudCB3aXphcmQuCi0gICAqIEByZXR1cm4ge0BsaW5rIExhYmVsc0FuZElkc30KLSAgICovICAKLSAgcHVibGljIHN0YXRpYyBMYWJlbHNBbmRJZHMgZ2V0Q2xpZW50VHlwZUxhYmVscygpCi0gIHsKLSAgICAKLSAgICBMYWJlbHNBbmRJZHMgbGFiZWxJZHMgPSBuZXcgTGFiZWxzQW5kSWRzKCk7Ci0gICAgU3RyaW5nW10gaWRzQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotICAgIFN0cmluZ1tdIGxhYmVsc0FycmF5ID0gbmV3IFN0cmluZ1swXTsKLSAgICBsYWJlbElkcy5zZXRJZHNfKGlkc0FycmF5KTsKLSAgICBsYWJlbElkcy5zZXRMYWJlbHNfKGxhYmVsc0FycmF5KTsKLSAgCi0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBBcnJheUxpc3QgbGFiZWxzID0gbmV3IEFycmF5TGlzdCgpOwotICAKLSAgICBJdGVyYXRvciBpdHIgPSByZWdpc3RyeS5jbGllbnRSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZShpdHIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIENsaWVudFJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSAoQ2xpZW50UnVudGltZURlc2NyaXB0b3IpaXRyLm5leHQoKTsKLSAgICAgIFdlYlNlcnZpY2VDbGllbnRJbXBsIHRoaXNDbGllbnRJbXBsID0gZGVzYy5nZXRDbGllbnRJbXBsZW1lbnRhdGlvblR5cGUoKTsKLSAgICAgIGlmICghaWRzLmNvbnRhaW5zKHRoaXNDbGllbnRJbXBsLmdldElkKCkpKQotICAgICAgewotICAgICAgICBpZHMuYWRkKHRoaXNDbGllbnRJbXBsLmdldElkKCkpOwotICAgICAgICBsYWJlbHMuYWRkKHRoaXNDbGllbnRJbXBsLmdldExhYmVsKCkpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpZHMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBpZHNBcnJheSA9IChTdHJpbmdbXSkgaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICBsYWJlbHNBcnJheSA9IChTdHJpbmdbXSkgbGFiZWxzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICBsYWJlbElkcy5zZXRJZHNfKGlkc0FycmF5KTsKLSAgICAgIGxhYmVsSWRzLnNldExhYmVsc18obGFiZWxzQXJyYXkpOwotICAgIH0KLQotICAgIHJldHVybiBsYWJlbElkczsKLQotICB9ICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGFsbCBzZXJ2ZXIgdHlwZSBpZHMgZm9yIHdoaWNoIHRoZXJlIGFyZSBjb25maWd1cmVkIHNlcnZlciBydW50aW1lcwotICAgKiBwcmVzZW50IGluIHRoZSB3b3Jrc3BhY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFN0cmluZ1tdIGFycmF5IG9mIHNlcnZlciB0eXBlIGlkcyBmb3Igd2hpY2ggdGhlcmUgYXJlIGNvbmZpZ3VyZWQgc2VydmVyIHJ1bnRpbWVzCi0gICAqIHByZXNlbnQgaW4gdGhlIHdvcmtzcGFjZS4gVGhlIGFycmF5IG1heSBoYXZlIDAgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbFNlcnZlckZhY3RvcnlJZHNXaXRoUnVudGltZXMoKQotICB7Ci0gICAgQXJyYXlMaXN0IGZpZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgSVNlcnZlclR5cGVbXSBzdHMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclR5cGVzKCk7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lW10gcnRzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotICAgIAotICAgIGZvciAoaW50IGk9MDsgaTxzdHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlclR5cGUgc3QgPSBzdHNbaV07Ci0gICAgICBmb3IgKGludCBqPTA7IGo8cnRzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgIAlpZiAoc3QgPT0gbnVsbCB8fCBzdC5nZXRSdW50aW1lVHlwZSgpID09IG51bGwpIGJyZWFrOyAgICAJICAKLSAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lIHJ0ID0gcnRzW2pdOwotICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHR5cGUgaGFzIHRoZSBzYW1lIHJ1bnRpbWUgdHlwZSBhcyB0aGlzIHJ1bnRpbWUsIGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICBTdHJpbmcgc2VydmVyVHlwZVJ1bnRpbWVUeXBlSWQgPSBzdC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAJSVJ1bnRpbWVUeXBlIHJ0VHlwZSA9IHJ0LmdldFJ1bnRpbWVUeXBlKCk7Ci0gICAgICAgIAlpZiAocnRUeXBlICE9IG51bGwpCi0gICAgICAgIAl7Ci0JCSAgICAgICAgU3RyaW5nIHJ1bnRpbWVSdW50aW1lVHlwZUlkID0gcnRUeXBlLmdldElkKCk7Ci0JCSAgICAgICAgaWYgKHNlcnZlclR5cGVSdW50aW1lVHlwZUlkLmVxdWFscyhydW50aW1lUnVudGltZVR5cGVJZCkpCi0JCSAgICAgICAgewotCQkgICAgICAgICAgaWYgKCFmaWRzLmNvbnRhaW5zKHN0LmdldElkKCkpKQotCQkgICAgICAgICAgewotCQkgICAgICAgICAgICBmaWRzLmFkZChzdC5nZXRJZCgpKTsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICB9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKWZpZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlIHdoaWNoIHN1cHBvcnQgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIGNsaWVudCAKLSAgICogaW1wbGVtZW50YXRpb24gdHlwZSBhbmQgV2ViIHNlcnZpY2UgcnVudGltZS4KLSAgICogCi0gICAqIEBwYXJhbSB0eXBlSWQgaWQgb2YgYSBXZWIgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gdHlwZQotICAgKiBAcGFyYW0gcnVudGltZUlkIGlkIG9mIGEgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBAcmV0dXJuIFN0cmluZ1tdIGFycmF5IG9mIHByb2plY3QgbmFtZXMuIFRoZSBhcnJheSBtYXkgaGF2ZSAwIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9qZWN0c0ZvckNsaWVudFR5cGVBbmRSdW50aW1lKFN0cmluZyB0eXBlSWQsIFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gRmFjZXRVdGlscy5nZXRBbGxQcm9qZWN0cygpOwotICAgIEFycmF5TGlzdCB2YWxpZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIGZvciAoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChkb2VzQ2xpZW50VHlwZUFuZFJ1bnRpbWVTdXBwb3J0UHJvamVjdCh0eXBlSWQsIHJ1bnRpbWVJZCwgcHJvamVjdHNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgdmFsaWRQcm9qZWN0cy5hZGQocHJvamVjdHNbaV0uZ2V0TmFtZSgpKTsgICAgICAgIAotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKXZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcHJvamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIHR5cGUgCi0gICAqIGFuZCBXZWIgc2VydmljZSBydW50aW1lLgotICAgKiAKLSAgICogQHBhcmFtIHR5cGVJZCBpZCBvZiBhIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlCi0gICAqIEBwYXJhbSBydW50aW1lSWQgaWQgb2YgYSBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIEBwYXJhbSBwcm9qZWN0TmFtZSBuYW1lIG9mIGFuIElQcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IHN1cHBvcnRzIHRoZSBnaXZlbiBXZWIgc2VydmljZSB0eXBlIGFuZCAKLSAgICogV2ViIHNlcnZpY2UgcnVudGltZS4gUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogPHVsPiAKLSAgICogPGxpPmlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB0eXBlIGFuZCAKLSAgICogV2ViIHNlcnZpY2UgcnVudGltZSBvcjwvbGk+Ci0gICAqIDxsaT5pZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvcjwvbGk+Ci0gICAqIDxsaT5pZiBwcm9qZWN0TmFtZSBpcyBudWxsIG9yIGVtcHR5PC9saT4KLSAgICogPC91bD4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzQ2xpZW50VHlwZUFuZFJ1bnRpbWVTdXBwb3J0UHJvamVjdChTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgICBTdHJpbmdbXSBkZXNjcyA9IGdldENsaWVudFJ1bnRpbWVzQnlUeXBlKHR5cGVJZCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcy5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBDbGllbnRSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gZ2V0Q2xpZW50UnVudGltZURlc2NyaXB0b3JCeUlkKGRlc2NzW2pdKTsKLSAgICAgIGlmIChkZXNjLmdldFJ1bnRpbWUoKS5nZXRJZCgpLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgewotICAgICAgICBpZiAoZG9lc0NsaWVudFJ1bnRpbWVTdXBwb3J0UHJvamVjdChkZXNjc1tqXSwgcHJvamVjdE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIAotICB9ICAKLSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcHJvamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gY2xpZW50UnVudGltZS4KLSAgICogQHBhcmFtIGNsaWVudFJ1bnRpbWVJZCBpZCBvZiBhIGNsaWVudFJ1bnRpbWUKLSAgICogQHBhcmFtIHByb2plY3ROYW1lIG5hbWUgb2YgYW4gSVByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2plY3Qgc3VwcG9ydHMgdGhlIGdpdmVuCi0gICAqIGNsaWVudFJ1bnRpbWUuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIDx1bD4gCi0gICAqIDxsaT5pZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBnaXZlbiBjbGllbnRSdW50aW1lIG9yPC9saT4KLSAgICogPGxpPmlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yPC9saT4KLSAgICogPGxpPmlmIHByb2plY3ROYW1lIGlzIG51bGwgb3IgZW1wdHk8L2xpPgotICAgKiA8L3VsPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRvZXNDbGllbnRSdW50aW1lU3VwcG9ydFByb2plY3QoU3RyaW5nIGNsaWVudFJ1bnRpbWVJZCwgU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gICAgRmFjZXRNYXRjaGVyIGZtID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0TWF0Y2hGb3JQcm9qZWN0KHRydWUsIGNsaWVudFJ1bnRpbWVJZCwgcHJvamVjdE5hbWUpOwotICAgIGlmIChmbSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmbS5pc01hdGNoKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIAotICAvL1V0aWxpdGllcyB1c2VkIGJ5IHRoZSBTZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UKLSAgCi0gIHByaXZhdGUgc3RhdGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0gIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBzZXJ2ZXJGYWN0b3J5SWRCeUxhYmVsXzsKLSAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHJ1bnRpbWVJZEJ5TGFiZWxfOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHtAbGluayBTZWxlY3Rpb25MaXN0Q2hvaWNlc30gZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSAKLSAgICogc2VydmVyIHR5cGUgPiBXZWIgc2VydmljZSBydW50aW1lID4gSjJFRSBjYXNjYWRpbmcgbGlzdHMgLgotICAgKiB7QGxpbmsgU2VsZWN0aW9uTGlzdENob2ljZXN9IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgIHdoaWNoIGlzIGxpa2UgYSBjYXNjYWRpbmcKLSAgICogc2V0IG9mIGxpc3RzIHVzZWZ1bCBmb3IgcG9wdWxhdGluZyBhIGdyb3VwIG9mIGNvbWJvIGJveGVzIGluIHdoaWNoIHRoZSAKLSAgICogc2VsZWN0aW9uIGluIGEgZ2l2ZW4gY29tYm8gYm94IGRldGVybWluZXMgdGhlIGxpc3Qgb2YgaXRlbXMgdXNlZCB0byBwb3B1bGF0ZQotICAgKiB0aGUgY29tYm8gYm94IGJlbG93IGl0LiBUaGUgU2VydmVyIFJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlIGNvbnRhaW5zIHR3byBjb21ibwotICAgKiBib3hlczogb25lIGZvciBzZXJ2ZXIgdHlwZXMgYW5kLCBiZWxvdyBpdCwgb25lIGZvciBXZWIgc2VydmljZSBydW50aW1lcy4KLSAgICogVGhlIHNlcnZlciB0eXBlIGNvbWJvIGJveCBpcyBtZWFudCB0byBjb250YWluIHRoZSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgc2VydmVyIHR5cGVzCi0gICAqIHRoYXQgc3VwcG9ydCBhdCBsZWFzdCBvbmUgV2ViIHNlcnZpY2UgcnVudGltZSBvbiBlaXRoZXIgdGhlIGNsaWVudCBvciBzZXJ2aWNlIHNpZGUuIAotICAgKiBUaGUgV2ViIHNlcnZpY2UgcnVudGltZSBjb21ibyBib3ggaXMgbWVhbnQgdG8gY29udGFpbiB0aGUgc3Vic2V0IG9mIFdlYiBzZXJ2aWNlIHJ1bnRpbWVzCi0gICAqIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIHR5cGUgc2VsZWN0ZWQgaW4gdGhlIHNlcnZlciB0eXBlIGNvbWJvIGJveC4KLSAgICogVGhlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGhhcyB0aHJlZSBsaXN0czogc2VydmVyIHR5cGVzLCBXZWIgc2VydmljZSBydW50aW1lcywKLSAgICogYW5kIEoyRUUgbGV2ZWxzLiBUaGUgZmlyc3QgdHdvIGxpc3RzIGNvcnJlc3BvbmQgdG8gdGhlIGNvbWJvIGJveGVzIG9uIHRoZSBwcmVmZXJlbmNlCi0gICAqIHBhZ2UgYW5kIGFyZSB1c2VkIHRvIHBvcHVsYXRlIHRoZW0uIFRoZSBKMkVFIGxldmVscyBsaXN0IGlzIGEgaGlzdG9yaWNhbCByZW1uYW50IGZyb20KLSAgICogd2hlbiBKMkVFIGxldmVscyB1c2VkIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBJdCByZW1haW5zIGluIHRoaXMgCi0gICAqIGRhdGEgc3RydWN0dXJlIHdpdGggc29tZSBoYXJkLWNvZGVkIHZhbHVlcyBidXQgaXMgbm90IHJlbmRlcmVkIHRvIHRoZSB1c2VyLiAKLSAgICogCi0gICAqIEByZXR1cm4gU2VsZWN0aW9uTGlzdENob2ljZXMgcmVwcmVzZW50aW5nIHRoZSBzZXJ2ZXIgdHlwZSA+IFdlYiBzZXJ2aWNlIHJ1bnRpbWUgPiBKMkVFIGNhc2NhZGluZyBsaXN0cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRTZXJ2ZXJUb1J1bnRpbWVUb0oyRUUoKQotICB7Ci0gICAgaWYgKHNlcnZlclRvUnVudGltZVRvSjJFRV8hPW51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0gICAgfQotICAgIAotICAgIC8vVE9ETyAoc2VlIGJ1ZyAxMTYwMjUpOiBJbnN0ZWFkIG9mIGFsbCBzZXJ2ZXIgdHlwZSBpZHMsIHdlIHNob3VsZCBiZSBjYWxjdWxhdGluZyB0aGUgc2V0IG9mIHNlcnZlcgotICAgIC8vdHlwZXMgdGhhdCBzdXBwb3J0IGF0IGxlYXN0IG9uZSBXZWIgc2VydmljZSBydW50aW1lIG9uIGVpdGhlciB0aGUgY2xpZW50IG9yIHNlcnZpY2Ugc2lkZS4KLSAgICAvL0dldHRpbmcgYWxsIHNlcnZlciB0eXBlcyBmb3Igbm93LgotICAgIFN0cmluZ1tdIHNlcnZlcnMgPSBnZXRBbGxTZXJ2ZXJGYWN0b3J5SWRzKCk7Ci0gICAgCi0gICAgU2VsZWN0aW9uTGlzdCBzZXJ2ZXJzTGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KHNlcnZlcnMsIDApOwotICAgIFZlY3RvciBjaG9pY2VzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGNob2ljZXMuYWRkKGdldFJ1bnRpbWVDaG9pY2VzKHNlcnZlcnNbaV0pKTsKLSAgICB9Ci0gICAgc2VydmVyVG9SdW50aW1lVG9KMkVFXyA9IG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyhzZXJ2ZXJzTGlzdCwgY2hvaWNlcyk7Ci0gICAgcmV0dXJuIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRSdW50aW1lQ2hvaWNlcyhTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0JLy9UT0RPIChzZWUgYnVnIDExNjAyNSk6IEluc3RlYWQgb2YgYWxsIFdlYiBzZXJ2aWNlIHJ1bnRpbWVzLCB3ZSBzaG91bGQgYmUgCi0JLy9jYWxjdWxhdGluZyB0aGUgc3Vic2V0IG9mIFdlYiBzZXJ2aWNlIHJ1bnRpbWVzIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIHR5cGUKLQkvL3dpdGggaWQgZXF1YWwgdG8gc2VydmVyRmFjdG9yeUlkLiBHZXR0aW5nIGFsbCB0aGUgV2ViIHNlcnZpY2UgcnVudGltZXMgZm9yIG5vdy4KLSAgICBTZXQgcnVudGltZXMgPSByZWdpc3RyeS5ydW50aW1lc18ua2V5U2V0KCk7Ci0gICAgSXRlcmF0b3IgaXRyID0gcmVnaXN0cnkucnVudGltZXNfLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgU3RyaW5nW10gcnVudGltZUlkcyA9IG5ldyBTdHJpbmdbcnVudGltZXMuc2l6ZSgpXTsgICAgCi0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBydW50aW1lSWQgPSAoU3RyaW5nKWl0ci5uZXh0KCk7Ci0gICAgICBydW50aW1lSWRzW2ldID0gcnVudGltZUlkOwotICAgICAgaSsrOyAgICAgCi0gICAgfQotCi0gICAgU2VsZWN0aW9uTGlzdCBydW50aW1lc0xpc3QgPSBuZXcgU2VsZWN0aW9uTGlzdChydW50aW1lSWRzLCAwKTsKLSAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBqPTA7IGo8cnVudGltZUlkcy5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBjaG9pY2VzLmFkZChnZXRKMkVFQ2hvaWNlcyhydW50aW1lSWRzW2pdKSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMocnVudGltZXNMaXN0LCBjaG9pY2VzKTsgICAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0SjJFRUNob2ljZXMoU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIC8vSjJFRSBsZXZlbHMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgU2VydmVyIFJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlLgotICAgIC8vUmV0dXJuIHNvbWUgaGFyZCBjb2RlZCB2YWx1ZXMuIFRoZXNlIHdpbGwgbm90IGJlIHJlbmRlcmVkIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuCi0gICAgU3RyaW5nW10gajJlZVZlcnNpb25zID0gbmV3IFN0cmluZ1tdeyIxMyIsICIxNCJ9OwotICAgIFNlbGVjdGlvbkxpc3QgajJlZVZlcnNpb25zTGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KGoyZWVWZXJzaW9ucywgMCk7Ci0gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyhqMmVlVmVyc2lvbnNMaXN0LCBudWxsKTsgICAgICAgIAotICB9ICAKLSAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldEFsbFNlcnZlckZhY3RvcnlJZHMoKQotICB7Ci0gICAgLy9UT0RPIChzZWUgYnVnIDExNjAyNSk6IEluc3RlYWQgb2YgYWxsIHNlcnZlciB0eXBlIGlkcywgd2Ugc2hvdWxkIGJlIGNhbGN1bGF0aW5nIHRoZSBzZXQgb2Ygc2VydmVyCi0JLy90eXBlcyB0aGF0IHN1cHBvcnQgYXQgbGVhc3Qgb25lIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgb24gZWl0aGVyIHRoZSBjbGllbnQgb3Igc2VydmljZSBzaWRlLgotCS8vUmV0dXJuIGFsbCBzZXJ2ZXIgdHlwZSBpZHMgZm9yIG5vdy4KLSAgICBBcnJheUxpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRCeUxhYmVsXyA9PSBudWxsKQotICAgIHsKLSAgICAgIHNlcnZlckZhY3RvcnlJZEJ5TGFiZWxfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGlkID0gc2VydmVyVHlwZXNbaV0uZ2V0SWQoKTsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0U2VydmVyTGFiZWxCeUlkKGlkKTsKLSAgICAgICAgc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8ucHV0KGxhYmVsLCBpZCk7Ci0gICAgICAgIGlkcy5hZGQoaWQpOwotICAgICAgfSAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGZpZHMgPSAgc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChmaWRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGZpZCA9IChTdHJpbmcpZmlkcy5uZXh0KCk7Ci0gICAgICAgIGlkcy5hZGQoZmlkKTsKLSAgICAgIH0gICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBpZiAoaWRzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nW10gc2VydmVyRmFjdG9yeUlkcyA9IChTdHJpbmdbXSlpZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0gICAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2VydmVyIHR5cGUgaWQgZ2l2ZW4gdGhlIHNlcnZlciB0eXBlJ3MgbGFiZWwKLSAgICogQHBhcmFtIGxhYmVsIHNlcnZlciB0eXBlIGxhYmVsCi0gICAqIEByZXR1cm4gc2VydmVyIHR5cGUgaWQgb3IgbnVsbCBpZiBubyBzZXJ2ZXIgdHlwZSB3aXRoIHRoZSBnaXZlbiAKLSAgICogbGFiZWwgaXMgZm91bmQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgaWYgKGxhYmVsPT1udWxsIHx8IGxhYmVsLmxlbmd0aCgpPT0wKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgaWYgKHNlcnZlckZhY3RvcnlJZEJ5TGFiZWxfID09IG51bGwpCi0gICAgewotICAgICAgZ2V0QWxsU2VydmVyRmFjdG9yeUlkcygpOwotICAgIH0KLSAgICAKLSAgICBpZiAoc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8uY29udGFpbnNLZXkobGFiZWwpKQotICAgIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKXNlcnZlckZhY3RvcnlJZEJ5TGFiZWxfLmdldChsYWJlbCk7ICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAgICAgCi0gIH0gIAotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBXZWIgc2VydmljZSBydW50aW1lJ3MgaWQgZ2l2ZW4gaXRzIGxhYmVsIAotICAgKiBAcGFyYW0gbGFiZWwgV2ViIHNlcnZpY2UgcnVudGltZSBsYWJlbAotICAgKiBAcmV0dXJuIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgaWQgb3IgbnVsbCBpZiBubwotICAgKiBXZWIgc2VydmljZSBydW50aW1lIHdpdGggdGhlIGdpdmVuIGxhYmVsIGlzIGZvdW5kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UnVudGltZUlkKFN0cmluZyBsYWJlbCkKLSAgewotICAgIAotICAgIGlmIChsYWJlbD09bnVsbCB8fCBsYWJlbC5sZW5ndGgoKT09MCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIGlmIChydW50aW1lSWRCeUxhYmVsXyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJ1bnRpbWVJZEJ5TGFiZWxfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgSXRlcmF0b3IgaXRlciA9IHJlZ2lzdHJ5LnJ1bnRpbWVzXy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gKFJ1bnRpbWVEZXNjcmlwdG9yKWl0ZXIubmV4dCgpOwotICAgICAgICBydW50aW1lSWRCeUxhYmVsXy5wdXQoZGVzYy5nZXRMYWJlbCgpLCBkZXNjLmdldElkKCkpOyAgICAgICAgCi0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiAoU3RyaW5nKXJ1bnRpbWVJZEJ5TGFiZWxfLmdldChsYWJlbCk7ICAgIAotICB9ICAgIAotICAKLSAgICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBzZXQgb2YgZmFjZXQgcnVudGltZXMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbgotICAgKiByZXF1aXJlZCBmYWNldCB2ZXJzaW9ucy4KLSAgICogQHBhcmFtIHJlcXVpcmVkRmFjZXRWZXJzaW9ucyBhbiBhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIG9mIHR5cGUge0BsaW5rIFJlcXVpcmVkRmFjZXRWZXJzaW9ufQotICAgKiBAcmV0dXJuIFNldCBzZXQgb2YgZmFjZXQgcnVudGltZXMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbiByZXF1aXJlZCBmYWNldCB2ZXJzaW9ucy4KLSAgICogKGVsZW1lbnQgdHlwZToge0BsaW5rIElSdW50aW1lfSkgCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBTZXQgZ2V0UnVudGltZXMoUmVxdWlyZWRGYWNldFZlcnNpb25bXSByZXF1aXJlZEZhY2V0VmVyc2lvbnMpCi0gIHsKLSAgICByZXR1cm4gRmFjZXRVdGlscy5nZXRSdW50aW1lcyhyZXF1aXJlZEZhY2V0VmVyc2lvbnMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTI1NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VSdW50aW1lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIxNiAgIDEyNzEzOCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUnVudGltZUluZm8gewotCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fOwotICBwcml2YXRlIEhhc2h0YWJsZSBhbGxTZXJ2aWNlVHlwZXNfOwotICBwcml2YXRlIEhhc2h0YWJsZSBhbGxDbGllbnRUeXBlc187Ci0gIAotICBwcml2YXRlIFN0cmluZyBpZDsKLSAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTZXJ2aWNlVHlwZVtdIHNlcnZpY2VUeXBlczsKLQlwcml2YXRlIENsaWVudFR5cGVbXSBjbGllbnRUeXBlczsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBzZXJ2bGV0TGV2ZWxzOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIGoyZWVMZXZlbHM7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gcnVudGltZUlkczsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBzZXJ2ZXJGYWN0b3J5SWRzOwotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcml2YXRlIElXZWJTZXJ2aWNlUnVudGltZSB3ZWJTZXJ2aWNlUnVudGltZV87Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZVJ1bnRpbWVJbmZvKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtXywgSGFzaHRhYmxlIGFsbFNlcnZpY2VUeXBlc18sIEhhc2h0YWJsZSBhbGxDbGllbnRUeXBlc18pCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWxlbV8gPSBlbGVtXzsKLSAgICB0aGlzLmFsbFNlcnZpY2VUeXBlc18gPSBhbGxTZXJ2aWNlVHlwZXNfOwotICAgIHRoaXMuYWxsQ2xpZW50VHlwZXNfID0gYWxsQ2xpZW50VHlwZXNfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotICB7Ci0gICAgaWYgKGNsYXNzTmFtZT09bnVsbCkKLSAgICB7Ci0gICAgICBjbGFzc05hbWU9ZWxlbV8uZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwotICAgIH0KLSAgICByZXR1cm4gY2xhc3NOYW1lOwotICB9Ci0gIAotCi0gIHB1YmxpYyBDbGllbnRUeXBlW10gZ2V0Q2xpZW50VHlwZXMoKQotICB7Ci0gICAgaWYgKGNsaWVudFR5cGVzPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJjbGllbnRUeXBlcyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBjbGllbnRUeXBlcyA9IG5ldyBDbGllbnRUeXBlW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaWVudFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGN0aWQgPSBzdC5uZXh0VG9rZW4oKTsgICAgICAgICAgCi0gICAgICAgICAgY2xpZW50VHlwZXNbaV0gPSAoQ2xpZW50VHlwZSlhbGxDbGllbnRUeXBlc18uZ2V0KGN0aWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjbGllbnRUeXBlczsKLSAgfQotICAKLQotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZD09bnVsbCkKLSAgICB7Ci0gICAgICBpZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGlkOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQotICB7Ci0gICAgaWYgKGxhYmVsPT1udWxsKQotICAgIHsKLSAgICAgIGxhYmVsID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotICAgIH0KLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0gICAKLQotICAKLSAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRKMmVlTGV2ZWxzKCkKLSAgewotICAgIGlmIChqMmVlTGV2ZWxzID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImoyZWVMZXZlbHMiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgajJlZUxldmVscyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgajJlZUxldmVscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICBqMmVlTGV2ZWxzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfSAgICAgIAotICAgIAotICAgIHJldHVybiBqMmVlTGV2ZWxzOwotICB9Ci0gIAotCi0gIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0UnVudGltZUlkcygpCi0gIHsKLSAgICBpZiAocnVudGltZUlkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJydW50aW1lcyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBydW50aW1lSWRzID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lSWRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHJ1bnRpbWVJZHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gICAgCi0gICAgcmV0dXJuIHJ1bnRpbWVJZHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTZXJ2ZXJGYWN0b3J5SWRzKCkKLSAgewotICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRzID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoInNlcnZlcnMiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgc2VydmVyRmFjdG9yeUlkcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVyRmFjdG9yeUlkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICBzZXJ2ZXJGYWN0b3J5SWRzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTZXJ2aWNlVHlwZVtdIGdldFNlcnZpY2VUeXBlcygpCi0gIHsKLSAgICBpZiAoc2VydmljZVR5cGVzPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJzZXJ2aWNlVHlwZXMiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgc2VydmljZVR5cGVzID0gbmV3IFNlcnZpY2VUeXBlW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjdGlkID0gc3QubmV4dFRva2VuKCk7ICAgICAgICAgIAotICAgICAgICAgIHNlcnZpY2VUeXBlc1tpXSA9IChTZXJ2aWNlVHlwZSlhbGxTZXJ2aWNlVHlwZXNfLmdldChjdGlkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVR5cGVzOwotICB9Ci0gIAotCi0gIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U2VydmxldExldmVscygpCi0gIHsKLSAgICBpZiAoc2VydmxldExldmVscz09bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgic2VydmxldExldmVscyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBzZXJ2bGV0TGV2ZWxzID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2bGV0TGV2ZWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHNlcnZsZXRMZXZlbHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZsZXRMZXZlbHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZVJ1bnRpbWUgZ2V0V2ViU2VydmljZVJ1bnRpbWUoKQotICB7Ci0JaWYgKHdlYlNlcnZpY2VSdW50aW1lXyA9PSBudWxsKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCXdlYlNlcnZpY2VSdW50aW1lXyA9IChJV2ViU2VydmljZVJ1bnRpbWUpZWxlbV8uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGNlKQotCQl7Ci0JCQljZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gd2ViU2VydmljZVJ1bnRpbWVfOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjliNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2Vic2VydmljZXV0aWxzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDA5ZDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd2Vic2VydmljZXV0aWxzLmphcgotd3NjLmphcgotd2Vic2VydmljZXV0aWxzc3JjLnppcAotd3Njc3JjLnppcAotamF2YUNvbXBpbGVyLndlYnNlcnZpY2V1dGlscy5qYXIuYXJncwotamF2YUNvbXBpbGVyLndzYy5qYXIuYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1ODk0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjZiZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6MzU6NTEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTM1NTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIEphbiAzMCAxMDo0MToyNSBFU1QgMjAwNgotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYWY5OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwNC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IHdzYy5qYXIsCi0gd2Vic2VydmljZXV0aWxzLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tYW5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLndzZGw0ajtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDEuNS4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMS4xLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDMuNS4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI2MjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2Uud3NjLmphciA9IHNyYy8KLXNvdXJjZS53ZWJzZXJ2aWNldXRpbHMuamFyID0gd2Vic2VydmljZXV0aWxzLwotamFycy5jb21waWxlLm9yZGVyID0gd3NjLmphcixcCi0gICAgICAgICAgICAgICAgICAgICB3ZWJzZXJ2aWNldXRpbHMuamFyCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHdzYy5qYXIsXAotICAgICAgICAgICAgICAgd2Vic2VydmljZXV0aWxzLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotamFycy5leHRyYS5jbGFzc3BhdGggPSAuLi9vcmcuYXBhY2hlLmF4aXMvbGliL3NhYWouamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDg0ZTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIENvbnN1bXB0aW9uCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLVhQX1dTRklOREVSPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlcgotWFBfV0VCX1NFUlZJQ0VfU1RBUlRfU0VSVkVSX1RZUEU9V2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZQotWFBfU0VSVkVSX0RFRkFVTFRFUj1TZXJ2ZXIgRGVmYXVsdGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2NDBhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgPCEtLSBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgbGlrZWx5IHRvIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0id3NmaW5kZXIiCi0gICAgICBuYW1lPSIlWFBfV1NGSU5ERVIiLz4KLQotICAgPCEtLSBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgbGlrZWx5IHRvIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0id2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZSIKLSAgICAgIG5hbWU9IiVYUF9XRUJfU0VSVklDRV9TVEFSVF9TRVJWRVJfVFlQRSIvPgotCi0gICA8IS0tIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBsaWtlbHkgdG8gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJzZXJ2ZXJEZWZhdWx0ZXIiCi0gICAgICBuYW1lPSIlWFBfU0VSVkVSX0RFRkFVTFRFUiIvPgotCi0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ud2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZSI+Ci0gICAgICA8d2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZQotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRUb21jYXRTZXJ2ZXIiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDMyX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZT4KLSAgICAgIDx3ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFRvbWNhdFNlcnZlciIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUNDBfTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlPgotICAgICAgPHdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0VG9tY2F0U2VydmVyIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTdGFydFNlcnZlclR5cGU+Ci0gICAgICA8d2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZQotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRUb21jYXRTZXJ2ZXIiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDUwX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZT4KLSAgICAgIDx3ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2Vyb25pbW8uMTAiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0VG9tY2F0U2VydmVyIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9HRVJPTklNTzEwX0xPQ0FMIj4KLSAgICAgICA8L3dlYlNlcnZpY2VTdGFydFNlcnZlclR5cGU+IAotICAgPC9leHRlbnNpb24+Ci0gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL0NvbnN1bXB0aW9uLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL0NvbnN1bXB0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzU0NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9Db25zdW1wdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA2MDIxNyAgIDEyNjc1NyByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSMgMjAwNjA0MDEgICAxMjg4Mjcga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBTYW1wbGUgbWVzc2FnZXMKLSMKLU1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX01FVEhPRFM9SVdBQjAxNzlFIFVuYWJsZSB0byBjcmVhdGUgYSBzYW1wbGUgdG8gdGhlIHByb3h5IGJlY2F1c2UgdGhlIHByb3h5IGRvZXMgbm90IGNvbnRhaW4gbWV0aG9kcy4KLU1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX0RFRkFVTFQ9SVdBQjAxODBFIFVuYWJsZSB0byBjcmVhdGUgYSBzYW1wbGUgdG8gdGhlIHByb3h5IGJlY2F1c2UgdGhlIHByb3h5IGlzIG5vdCBhIGJlYW4gKGkuZS4uIHRoZSBzYW1wbGUgZG9lcyBub3QgaGF2ZSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvcikuCi1NU0dfRVJST1JfSlRTX05PX1BST1hZX01FVEhPRFNfUFJPQ0VTU0VEPUlXQUIwMTgxRSBVbmFibGUgdG8gY3JlYXRlIGEgc2FtcGxlIHRvIHRoZSBwcm94eSBiZWNhdXNlIG5vbmUgb2YgdGhlIG1ldGhvZHMgaW4gdGhlIHByb3h5IHdlcmUgcHJvY2Vzc2VkLgotTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEU9SVdBQjAxODJXIFRoZSBTYW1wbGUgSlNQIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgdHlwZToKLU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9JTkRFWEVEX1BST1BFUlRJRVM9SVdBQjAxODdXIFRoZSBTYW1wbGUgSlNQIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IEluZGV4ZWQgcHJvcGVydGllcy4KLU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0FSUkFZUz1JV0FCMDIzN1cgVGhlIFNhbXBsZSBKU1AgY2xpZW50IGRvZXMgbm90IHN1cHBvcnQgYXJyYXlzOgotTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfSU5QVVRTPUlXQUIwMTI0VyBUaGUgU2FtcGxlIEpTUCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCBpbnB1dCBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBiZWFuczoKLU1TR19FUlJPUl9KVFNfQ1lDTElDX0JFQU49SVdBQjAxODhFIFRoZSBTYW1wbGUgSlNQIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IGJlYW5zIGNvbnRhaW5pbmcgYXR0cmlidXRlcyB0aGF0IHJlZmVyZW5jZSB0aGUgYmVhbnMuCi1NU0dfV0FSTl9KVFNfUFJPWFlfTUVUSE9EU19PTUlUVEVEPUlXQUIwMTg5VyBUaGUgU2FtcGxlIEpTUCBjbGllbnQgb21pdHRlZCBzb21lIG1ldGhvZHMgYmVjYXVzZSB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB0eXBlcy4KLU1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQ9SVdBQjAwMjFFIFNhbXBsZSBjcmVhdGlvbiB3YXMgY2FuY2VsZWQKLU1TR19XQVJOX1VOQUJMRV9UT19GSU5EX1BST1hZPUlXQUIwMDIyVyBUaGUgUHJveHkgUmVzb3VyY2UgY291bmQgbm90IG5vdCBiZSBmb3VuZC4KLU1TR19FUlJPUl9KVFNfSlNQX0dFTj1FcnJvciBpbiBnZW5lcmF0aW5nIHNhbXBsZSBKU1AKLQotIyBOb3QgdXNlZAotI01TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0NPTVBPTkVOVD1UaGUgV2ViIHNlcnZpY2Ugd2l6YXJkIGNhbm5vdCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBjb21wb25lbnQgInswfSIuIENhbmNlbCB0aGUgd2l6YXJkIGFuZCBjcmVhdGUgdGhlIGNvbXBvbmVudCBtYW51YWxseS4KLQotCi0jCi0jIEZpbHRlcnMKLSMKLUZJTFRFUl9NU0dfRVJST1JfTlVMTF9PQkpFQ1Q9SVdBQjAwOTdFIE5vIG9iamVjdCBoYXMgYmVlbiBwcm92aWRlZC4KLUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEU9SVdBQjAwOThFIFRoZSBvYmplY3QgInswfSIgaXMgbm90IGEgZmlsZS4KLUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZPTERFUj1JV0FCMDEzN0UgVGhlIG9iamVjdCAiezB9IiBpcyBub3QgYSBmb2xkZXIuCi0KLUpBVkFfRklMVEVSX05BTUU9SmF2YSBmaWxlcwotSkFWQV9GSUxURVJfREVTQz1GaWxlcyB3aXRoIG5hbWVzIGVuZGluZyBpbiAiLmphdmEiIG9yICIuY2xhc3MiLgotSkFWQV9GSUxURVJfTVNHX0VSUk9SX1dST05HX0VYVEVOU0lPTj1JV0FCMDEwMkUgVGhlIGZpbGUgInswfSIgZG9lcyBub3QgZW5kIGluICIuamF2YSIgb3IgIi5jbGFzcyIuCi0KLVdTRExfRklMVEVSX05BTUU9V1NETCBmaWxlcwotV1NETF9GSUxURVJfREVTQz1GaWxlcyB3aXRoIG5hbWVzIGVuZGluZyBpbiAiLndzZGwiLgotV1NETF9GSUxURVJfTVNHX0VSUk9SX1dST05HX0VYVEVOU0lPTj1JV0FCMDEwM0UgVGhlIGZpbGUgInswfSIgZG9lcyBub3QgZW5kIGluICIud3NkbCIuCi0KLUlTRF9GSUxURVJfTkFNRT1JU0QgZmlsZXMKLUlTRF9GSUxURVJfREVTQz1GaWxlcyB3aXRoIG5hbWVzIGVuZGluZyBpbiAiLmlzZCIuCi1JU0RfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT049SVdBQjAwOTVFIFRoZSBmaWxlICJ7MH0iIGRvZXMgbm90IGVuZCBpbiAiLmlzZCIuCi0KLVBST1BFUlRJRVNfRklMVEVSX05BTUU9UHJvcGVydGllcyBmaWxlcwotUFJPUEVSVElFU19GSUxURVJfREVTQz1GaWxlcyB3aXRoIG5hbWVzIGVuZGluZyBpbiAiLnByb3BlcnRpZXMiCi1QUk9QRVJUSUVTX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OPSBUaGUgZmlsZSAiezB9IiBkb2VzIG5vdCBlbmQgaW4gIi5wcm9wZXJ0aWVzIi4KLQotRk9MREVSX0ZJTFRFUl9OQU1FPUZvbGRlcnMKLUZPTERFUl9GSUxURVJfREVTQz1Gb2xkZXJzLgotCi0jCi0jIERlcGxveW1lbnQgc3RhdHVzCi0jCi1QUk9HUkVTU19JTkZPX0NPUFlfV0VCU0VSVklDRV9VVElMUz1JV0FCMDAyM0kgQ29weWluZyB0aGUgd2Vic2VydmljZSB1dGlsaXRpZXMuCi1QUk9HUkVTU19JTkZPX0NPUFlJTkdfRklMRT1JV0FCMDE5N0kgQ29weWluZyBTT0FQIHJ1bi10aW1lIGZpbGUuCi1QUk9HUkVTU19JTkZPX1NUQVJUX1dFQl9QUk9KRUNUPUlXQUIwMTk4SSBTdGFydGluZyBXZWIgcHJvamVjdC4KLVBST0dSRVNTX0lORk9fUFVCTElTSElOR19TRVJWRVI9SVdBQjAxOTlJIFB1Ymxpc2hpbmcgc2VydmVyLgotUFJPR1JFU1NfSU5GT19TVEFSVElOR19TRVJWRVI9SVdBQjAyMDBJIFN0YXJ0aW5nIHNlcnZlci4KLVBST0dSRVNTX0lORk9fUFVCTElTSF9XRUJfUFJPSkVDVD1JV0FCMDIwNUkgUHVibGlzaGluZyBXZWIgcHJvamVjdC4KLQotCi0jCi0jIERlcGxveW1lbnQgbWVzc2FnZXMKLSMKLU1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORD1JV0FCMDIwN0UgV2ViIHByb2plY3Qgd2FzIG5vdCBmb3VuZC4KLU1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTPUlXQUIwMDI0RSBFcnJvciBpbiBjb3B5aW5nIFdlYnNlcnZpY2UgVXRpbGl0eSBmaWxlLgotTVNHX0VSUk9SX0lOU1RBTkNFX05PVF9GT1VORD1JV0FCMDIxMkUgU2VydmVyIHdhcyBub3QgZm91bmQuCi1NU0dfRVJST1JfU0VSVkVSPUlXQUIwMjEzRSBFcnJvciBpbiBzdGFydGluZyBzZXJ2ZXIuCi1NU0dfRVJST1JfUFVCTElTSD1JV0FCMDIxN0UgRXJyb3IgaW4gcHVibGlzaGluZyBXZWIgcHJvamVjdC4KLU1TR19FUlJPUl9BRERfTU9EVUxFPUVycm9yIG9jY3VyZWQgd2hlbiBhZGRpbmcgdGhlIG1vZHVsZSwgezB9LCB0byB0aGUgc2VydmVyCi0KLU1TR19FUlJPUl9DUkVBVEVfU0VSVkVSPUlXQUIwMDI1RSBVbmFibGUgdG8gY3JlYXRlIHNlcnZlci4KLU1TR19FUlJPUl9TVFVCX09OTFk9VW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgYmVjYXVzZSBvbmx5IHN0dWIgcnVudGltZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIHswfSBzZXJ2ZXIgdHlwZS4gR28gdG8gV2luZG93ID4gUHJlZmVyZW5jZXMuIFNlbGVjdCBTZXJ2ZXIgPiBJbnN0YWxsZWQgUnVudGltZXMgdG8gaW5zdGFsbCBhIG5vbi1zdHViIHJ1bnRpbWUuCi0KLSMKLSMgRUpCIG1lc3NhZ2VzCi0jIDQgdW51c2VkIG1lc3NhZ2VzIGluIGpzdC53cyBhbmQgd3N0LndzCi1UQVNLX0xBQkVMX0NSRUFURV9FSkJfUFJPSkVDVD1DcmVhdGVFSkJQcm9qZWN0VGFzawotVEFTS19ERVNDX0NSRUFURV9FSkJfUFJPSkVDVD1DcmVhdGUgYW4gRUpCIFByb2plY3QuCi1NU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FSkJfUFJPSkVDVD1JV0FCMDQzMkUgVW5hYmxlIHRvIGNyZWF0ZSBFSkIgcHJvamVjdC4KLU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0FQUF9DTElFTlRfUFJPSkVDVD1JV0FCMDAyNkUgVW5hYmxlIHRvIGNyZWF0ZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCB7MH0uCi0KLU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0pBVkFfUFJPSkVDVD1JV0FCMDAyN0UgVW5hYmxlIHRvIGNyZWF0ZSBKYXZhIHByb2plY3QgezB9LgotTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUFSX1BST0pFQ1Q9SVdBQjAwNjJFIFVuYWJsZSB0byBjcmVhdGUgRUFSIHByb2plY3QgezB9LgotCi0jCi0jIFZhbGlkYXRvciB0YXNrIGRlc2NyaXB0aW9ucwotIwotVEFTS19MQUJFTF9XRUJTRVJWSUNFX0RJU0FCTEVfVkFMSURBVElPTj1EaXNhYmxlIHZhbGlkYXRvcnMuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT049VGVtcG9yYXJpbHkgZGlzYWJsaW5nIHZhbGlkYXRvcnMuCi1UQVNLX0xBQkVMX1dFQlNFUlZJQ0VfUkVTVE9SRV9WQUxJREFUSU9OPVJlc3RvcmUgdmFsaWRhdG9ycy4KLVRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfVkFMSURBVElPTj1SZXN0b3Jpbmcgc3RhdGVzIG9mIHZhbGlkYXRvcnMuCi1UQVNLX0xBQkVMX1dFQlNFUlZJQ0VfRElTQUJMRV9CVUlMRD1EaXNhYmxlIGF1dG8gYnVpbGQuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX0JVSUxEPVRlbXBvcmFyaWx5IGRpc2FibGluZyBhdXRvIGJ1aWxkLgotVEFTS19MQUJFTF9XRUJTRVJWSUNFX1JFU1RPUkVfQlVJTEQ9UmVzdG9yZSBhdXRvIGJ1aWxkLgotVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9CVUlMRD1SZXN0b3Jpbmcgc3RhdGUgb2YgYXV0byBidWlsZC4KLQotIwotIyBNSVNDCi0jCi1NU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFPUlXQUIwMzEwRSBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgY3JlYXRpb24gb2YgdGhlIFdlYiBQcm9qZWN0LgotCi0jCi0jIENoZWNrUHJvamVjdE9LQ29tbWFuZAotIwotTVNHX0VSUk9SX1NFUlZFUl9WSUVXX09QRU49SVdBQjAxMjZFIFRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBlZGl0b3IgaXMgb3BlbiBmb3IgezB9LiAgQ2xvc2UgaXQgYW5kIHJlc3RhcnQgdGhlIHdpemFyZC4KLQotCi0jCi0jCURldGVjdE5vbkphdmFDaGFyc0NvbW1hbmQKLSMKLU1TR19XQVJOX0pBVkFfTUVUSE9EX1NUQVJUX1dJVEhfVVBQRVJfQ0FTRT1JV0FCMDEyOVcgSmF2YSBtZXRob2QgezB9IGluIGNsYXNzIHsxfSBzdGFydHMgd2l0aCBhbiB1cHBlciBjYXNlIGxldHRlci4gTWV0aG9kIG5hbWVzIHNob3VsZCBiZWdpbiB3aXRoIGxvd2VyIGNhc2UgbGV0dGVycy4KLU1TR19XQVJOX01FVEhPRF9OQU1FX0lOVkFMSUQ9SVdBQjAxMzFXIEphdmEgbWV0aG9kIHswfSBuYW1lIGNvbnRhaW5zIHVuZGVyc2NvcmUgb3IgbnVtZXJpYyBkaWdpdHMgZm9sbG93ZWQgYnkgYSBsb3dlciBjYXNlIGxldHRlci5cCi1NZXRob2QgbmFtZXMgc2hvdWxkIG5vdCBjb250YWluIGxvd2VyIGNhc2UgbGV0dGVycyBhZnRlciBhIG51bWVyaWMgb3IgdW5kZXJzY29yZS4KLU1TR19XQVJOX0JPT0xFQU5fUFJPUEVSVFlfQUNDRVNTT1JTPUlXQUIwMTMyVyBCb29sZWFuIHByb3BlcnR5IGFjY2Vzc29yIHswfSBpbiBiZWFuIHsxfSBiZWdpbnMgd2l0aCAiZ2V0Ii4gQm9vbGVhbiBnZXR0ZXIgbWV0aG9kcyBzaG91bGQgYmVnaW4gd3RoICJpcyIuCi1NU0dfV0FSTl9QQUNLQUdFX05BTUVfSEFTX1VQUEVSX0NBU0U9SVdBQjAxMzNXIFRoZSBwYWNrYWdlIG5hbWUgezB9IG9mIGNsYXNzIHsxfSBpbmNsdWRlcyB1cHBlciBjYXNlIGxldHRlcnMuIFBhY2thZ2UgbmFtZXMgc2hvdWxkIGNvbnNpc3Qgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIG9ubHkuCi0KLVdBUk5fQkVBTl9OQU1FX1NUQVJUU19XSVRIX0xPV0VSX0NBU0UKLQotIwotIyBKYXZhVG9Nb2RlbENvbW1hbmQKLSMKLUxBQkVMX09LPU9LCi1ERVNDUklQVElPTl9PSz1TZWxlY3QgT0sgdG8gY29udGludWUKLQotTEFCRUxfQ0FOQ0VMPUNhbmNlbAotREVTQ1JJUFRJT05fQ0FOQ0VMPVNlbGVjdCBDYW5jZWwgdG8gY2FuY2VsCi0KLSMKLSMgQ3JlYXRlTW9uaXRvckNvbW1hbmQKLSMKLU1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUj1JV0FCMDAwMUUgVW5hYmxlIHRvIG1vbml0b3IgcG9ydCB7MH0gb2YgezF9LgotTVNHX0lORk9fTU9OSVRPUklOR19OT1RfU1VQUE9SVEVEPUlXQUIwMDAySSB7MH0gZG9lcyBub3Qgc3VwcG9ydCBwb3J0IG1vbml0b3JpbmcuCi0KLSMKLSMgQ29weVdTRExDb21tYW5kCi0jCi1DT01NQU5EX0xBQkVMX0NPUFlfV1NETD1Db3B5aW5nIFdTREwKLUNPTU1BTkRfREVTQ19DT1BZX1dTREw9Q29weWluZyBXU0RMIGludG8gdGhlIHdvcmtzcGFjZSBmb3IgV2ViIHNlcnZpY2UgZGVwbG95bWVudAotTVNHX0VSUk9SX0NPUFlfV1NETD1JV0FCMDAyOEUgRmFpbGVkIHRvIGNvcHkgV1NETCB7MH0gdG8gezF9Ci0KLSMKLSMgQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQKLSMKLU1TR19FUlJPUl9VTkFCTEVfVE9fQVNTT0NJQVRFPVVuYWJsZSB0byBhc3NvY2lhdGUgY29tcG9uZW50IHswfSB0byBlYXIgY29tcG9uZW50IHsxfS4KLQotIwotIyBDcmVhdGVNb2R1bGVDb21tYW5kCi0jCi1NU0dfRVJST1JfQ1JFQVRFX0ZMRVhfUFJPSkVUPUFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGNyZWF0aW9uIG9mIGZsZXhpYmxlIHByb2plY3QgezB9LgotTVNHX0VSUk9SX0NSRUFURV9FSkJfQ09NUE9ORU5UPUFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGNyZWF0aW9uIG9mIEVKQiBjb21wb25lbnQgezB9LgotTVNHX0VSUk9SX0NSRUFURV9BUFBDTElFTlRfQ09NUE9ORU5UPUFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGNyZWF0aW9uIG9mIEFwcGxpY2F0aW9uIENsaWVudCBjb21wb25lbnQgezB9LgotTVNHX0VSUk9SX0NPTVBPTkVOVF9DUkVBVElPTj1VbmFibGUgdG8gY3JlYXRlIHByb2plY3QgezB9IGFuZC9vciBjb21wb25lbnQgezF9LgotCi0KLSMKLSMgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kCi0jCi1NU0dfRVJST1JfUFJPSkVDVF9DUkVBVElPTj1VbmFibGUgdG8gY3JlYXRlIHByb2plY3QgezB9LgotCi0KLSMKLSMgUHJlU2VydmljZURldmVsb3BDb21tYW5kCi0jCi1NU0dfRVJST1JfUFJPSkVDVF9ET0VTX05PVF9FWElTVD1UaGUgcHJvamVjdCB7MH0gZG9lcyBub3QgZXhpc3QuCi1NU0dfRVJST1JfUFJPSkVDVF9JU19OT1RfT1BFTj1UaGUgcHJvamVjdCB7MH0gaXMgbm90IG9wZW4uCi0KLSMKLSMgU1BFQ0lBTCBOT1RFIFRPIFRSQU5TTEFUT1JTOiBTdWJzdGl0dXRpb24gezF9IGluIE1TR19FUlJPUl9BRERJTkdfRkFDRVRTX1RPX1BST0pFQ1QgYW5kCi0jIE1TR19FUlJPUl9GSVhFRF9GQUNFVFMgd2lsbCBiZSBhIGRlbGltaXRlZCBsaXN0IG9mIHRyYW5zbGF0ZWQgbGFiZWxzLiBUaGUgbGlzdCBpcyBmb3JtZWQgCi0jIHRocm91Z2ggcmVwZWF0ZWQgdXNlIG9mIE1TR19GQUNFVFMuCi0jCi1NU0dfRVJST1JfQURESU5HX0ZBQ0VUU19UT19QUk9KRUNUPVVuYWJsZSB0byBhZGQgdGhlIGZvbGx3aW5nIGZhY2V0cyB0byBwcm9qZWN0IHswfTogezF9LgotTVNHX0VSUk9SX0ZJWEVEX0ZBQ0VUUz1VbmFibGUgdG8gc2V0IHRoZSBmb2xsb3dpbmcgZmFjZXRzIGFzIGZpeGVkIG9uIHByb2plY3QgezB9OiB7MX0uCi1NU0dfRkFDRVRTPXswfSwgezF9Ci0KLU1TR19FUlJPUl9TRVRUSU5HX1JVTlRJTUU9VW5hYmxlIHRvIGJpbmQgcHJvamVjdCB7MH0gdG8gdGhlIHsxfSBydW50aW1lLgotCi0jCi0jIFNrZWxldG9uTWVyZ2VDb21tYW5kIE1lc3NhZ2VzCi0jCi1NU0dfRVJST1JfRklMRV9NRVJHRT1FcnJvciBpbiBtZXJnaW5nIGZpbGUgezB9LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9Db25zdW1wdGlvbk1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL0NvbnN1bXB0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkNDNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL0NvbnN1bXB0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMTcgICAxMjY3NTcgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQwMSAgIDEyODgyNyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdW1wdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29uc3VtcHRpb25NZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0pUU19QUk9YWV9IQVNfTk9fTUVUSE9EUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19ERUZBVUxUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9KVFNfTk9fUFJPWFlfTUVUSE9EU19QUk9DRVNTRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX0lOREVYRURfUFJPUEVSVElFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfUEFSQU1FVEVSU19BUlJBWVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfSU5QVVRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9KVFNfQ1lDTElDX0JFQU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1dBUk5fSlRTX1BST1hZX01FVEhPRFNfT01JVFRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19XQVJOX1VOQUJMRV9UT19GSU5EX1BST1hZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9KVFNfSlNQX0dFTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRklMVEVSX01TR19FUlJPUl9OT1RfRk9MREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfRklMVEVSX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9GSUxURVJfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfRklMVEVSX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9GSUxURVJfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElTRF9GSUxURVJfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJU0RfRklMVEVSX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSVNEX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfRklMVEVSX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19GSUxURVJfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZPTERFUl9GSUxURVJfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGT0xERVJfRklMVEVSX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPR1JFU1NfSU5GT19DT1BZX1dFQlNFUlZJQ0VfVVRJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPR1JFU1NfSU5GT19DT1BZSU5HX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPR1JFU1NfSU5GT19TVEFSVF9XRUJfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9HUkVTU19JTkZPX1BVQkxJU0hJTkdfU0VSVkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0dSRVNTX0lORk9fU1RBUlRJTkdfU0VSVkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0dSRVNTX0lORk9fUFVCTElTSF9XRUJfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfUFJPSkVDVF9OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0ZJTEVDT1BZX1dFQlNFUlZJQ0VfVVRJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0lOU1RBTkNFX05PVF9GT1VORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfU0VSVkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9QVUJMSVNIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9BRERfTU9EVUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9DUkVBVEVfU0VSVkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9TVFVCX09OTFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFTS19MQUJFTF9DUkVBVEVfRUpCX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFTS19ERVNDX0NSRUFURV9FSkJfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FSkJfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9BUFBfQ0xJRU5UX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfSkFWQV9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VBUl9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBU0tfTEFCRUxfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFTS19ERVNDX1dFQlNFUlZJQ0VfRElTQUJMRV9WQUxJREFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBU0tfTEFCRUxfV0VCU0VSVklDRV9SRVNUT1JFX1ZBTElEQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9WQUxJREFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBU0tfTEFCRUxfV0VCU0VSVklDRV9ESVNBQkxFX0JVSUxEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBU0tfREVTQ19XRUJTRVJWSUNFX0RJU0FCTEVfQlVJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFTS19MQUJFTF9XRUJTRVJWSUNFX1JFU1RPUkVfQlVJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9CVUlMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9TRVJWRVJfVklFV19PUEVOOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19XQVJOX0pBVkFfTUVUSE9EX1NUQVJUX1dJVEhfVVBQRVJfQ0FTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfV0FSTl9NRVRIT0RfTkFNRV9JTlZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19XQVJOX0JPT0xFQU5fUFJPUEVSVFlfQUNDRVNTT1JTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19XQVJOX1BBQ0tBR0VfTkFNRV9IQVNfVVBQRVJfQ0FTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXQVJOX0JFQU5fTkFNRV9TVEFSVFNfV0lUSF9MT1dFUl9DQVNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX09LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OX09LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0NBTkNFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDUklQVElPTl9DQU5DRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19JTkZPX01PTklUT1JJTkdfTk9UX1NVUFBPUlRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT01NQU5EX0xBQkVMX0NPUFlfV1NETDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT01NQU5EX0RFU0NfQ09QWV9XU0RMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9DT1BZX1dTREw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1VOQUJMRV9UT19BU1NPQ0lBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0NSRUFURV9GTEVYX1BST0pFVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfQ1JFQVRFX0VKQl9DT01QT05FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0NSRUFURV9BUFBDTElFTlRfQ09NUE9ORU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9DT01QT05FTlRfQ1JFQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1BST0pFQ1RfQ1JFQVRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1BST0pFQ1RfRE9FU19OT1RfRVhJU1Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1BST0pFQ1RfSVNfTk9UX09QRU47Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0FERElOR19GQUNFVFNfVE9fUFJPSkVDVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfRklYRURfRkFDRVRTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19GQUNFVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1NFVFRJTkdfUlVOVElNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfRklMRV9NRVJHRTsKLSAgICAKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENvbnN1bXB0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9HZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyNzc0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDgxMSAgIDE1MzQ4MiBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9yIGltcGxlbWVudHMgVmlzaXRvckFjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgLyoqCi0gICogVGhlIFN0cmluZ0J1ZmZlciB0aGF0IGhvbGRzIHRoZSBjb2RlZ2VuIAotICAqICovCi0gIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgZmJ1ZmZlcjsgCi0KLSAgLyoqCi0gICogVGhlIFZpc2l0b3IgdGhhdCBjYWxscyB0aGUgdmlzaXQgbWV0aG9kIAotICAqICovCi0gIHByb3RlY3RlZCBWaXNpdG9yIGZWaXNpdG9yOyAKLQotICAvKioKLSAgKiBWZWN0b3IgdGhhdCBob2xkcyBzdGF0ZSBkYXRhIGZvciB0aGlzICBnZW5lcmF0b3IgCi0gICogKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBmUmVzaWRlbnRWZWN0b3I7Ci0gCi0gIC8qCi0gICogVGhpcyBpbnQgaG9sZHMgdGhlIGN1cnJlbnQgbnVtYmVyIAotICAqLwotICBwcm90ZWN0ZWQgaW50IGZVbmlxdWVOdW1iZXIgPTA7Ci0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBmQ2xpZW50Rm9sZGVyUGF0aDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZID0gIkZhY3RvcnkiOyAKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAiICAgICI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9UQUIgPSAiICAgICAgICAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgR2VuZXJhdG9yICgpCi0gIHsKLSAgICAgIGZidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBmUmVzaWRlbnRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7IAotICAgIAotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIFN0cmluZ0J1ZmZlciBUYWtlcyB0aGUgYnVmZmVyIGl0IHdpbGwgd3JpdGUgY29kZSB0bwotICAqLwotICBwdWJsaWMgR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBmYnVmZmVyID0gYnVmZmVyOwotICAgICAgZlJlc2lkZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgcmVzaWRlbnQpCi0gIHsKLSAgICAvL25vdGhpbmcgdG8gYmUgZG9uZSBidXQgbXVzdCBiZSBpbXBsZW1lbnRlZAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEZvbGRlclBhdGgoKQotICB7Ci0gICAgcmV0dXJuIGZDbGllbnRGb2xkZXJQYXRoOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50Rm9sZGVyUGF0aChTdHJpbmcgZkNsaWVudEZvbGRlclBhdGhfKQotICB7Ci0gICAgZkNsaWVudEZvbGRlclBhdGggPSBmQ2xpZW50Rm9sZGVyUGF0aF87Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lID0gIiI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWUgPSAiIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlTmFtZSA9ICIiOwotICBwcm90ZWN0ZWQgU3RyaW5nIHByb3h5QmFzZU5hbWUgPSAiIjsKLQotICBwdWJsaWMgdm9pZCBzZXRJbmZvKFN0cmluZyBzZXJ2aWNlLCBTdHJpbmcgcG9ydCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcHJveHlCYXNlKQotICB7Ci0gICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlOwotICAgIHBvcnROYW1lID0gcG9ydDsKLSAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7IAotICAgIHByb3h5QmFzZU5hbWUgPSBwcm94eUJhc2U7ICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLSAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uQmVhbklkKCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xpZW50Rm9sZGVyUGF0aCgpOwotICAgIGludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi8iKTsKLSAgICBpbmRleCsrOwotICAgIFN0cmluZ0J1ZmZlciBuZXdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLnN1YnN0cmluZyhpbmRleCkpOwotICAgIAotICAgIC8vV2UgbmVlZCB0byBtYWtlIHRoaXMgYSB2YWxpZCBqYXZhIGlkZW50aWZpZXIKLSAgICAvL1RvIGRvIHRoaXMgd2Ugd2lsbCByZXBsYWNlIGFueSBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgdmFsaWQgd2l0aCBhbiB1bmRlcnNjb3JlCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdOYW1lLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgIAljaGFyIGMgPSBuZXdOYW1lLmNoYXJBdChpKTsKLSAgICAJaWYgKGkgPT0gMCAmJiAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKSB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotICAgIAl7Ci0gICAgCQluZXdOYW1lLnNldENoYXJBdChpLFVOREVSU0NPUkUpOwotICAgIAl9Ci0gICAgfQotICAgIHJldHVybiBuZXdOYW1lICsgImlkIjsKLSAgfQotCi0gIC8qCi0gICogVGhlIE51bWJlciBGYWN0b3J5IGlzIGhlcmUgZm9yIG5hbWluZyBwdXJwb3Nlcy4gSW4gCi0gICogdGhpcyB3YXkgd2UgaW5zdXJlIG5vIG5hbWVzIHdlIGNyZWF0ZSBpbiBhIHBpZWNlIG9mCi0gICogY29kZSBnZW4gYXJlIHRoZSBzYW1lLiBXZSBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXJzCi0gICogdXNlZCBhbmQgd2UgaGFuZCBiYWNrIHRoZSBuZXh0IG9uZS4gTGlrZSB0YWtlIGEgbnVtYmVyIAotICAqIGJ1ZGR5Ci0gICogQHBhcmFtIGludCBudW1iZXIgd2UgYXJlIGF0IGFzIHRoZSBzdGF0ZSBkYXRhIGhhcyB0byBiZSBzZXR0YWJsZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXROdW1iZXJGYWN0b3J5KGludCBudW1iZXIpCi0gIHsKLSAgICAgZlVuaXF1ZU51bWJlciA9IG51bWJlcjsKLSAgfQotCi0KLSAgLyoKLSAgKiBUaGlzIGlzIGEgdW5pcXVlIG51bWJlciBmb3Igc3RhdGUgcHVycG9zZXMKLSAgKiBAcmV0dXJuIGludCAKLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJGYWN0b3J5KCkKLSAgewotICAgICByZXR1cm4gZlVuaXF1ZU51bWJlcjsgCi0gIH0KLSAgLyoKLSAgKiBUaGlzIGlzIGEgdW5pcXVlIG51bWJlciBmb3IgbmFtaW5nIHB1cnBvc2VzCi0gICogQHJldHVybiBpbnQgCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0VW5pcXVlTnVtYmVyKCkKLSAgewotICAgICByZXR1cm4gZlVuaXF1ZU51bWJlcisrOwotICB9Ci0KLQotICAvKioKLSAgKiByZXR1cm5zIHRoZSBjdXJyZW50IFN0cmluZ0J1ZmZlcgotICAqIEByZXR1cm4gU3RyaW5nQnVmZmVyIFRha2VzIHRoZSBidWZmZXIgaXQgd2lsbCB3cml0ZSBjb2RlIHRvbwotICAqLwotICBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFN0cmluZ0J1ZmZlciAoKQotICB7Ci0gICAgICByZXR1cm4gZmJ1ZmZlcjsKLSAgfQotCi0gIAotICAvKioKLSAgKiByZXR1cm5zIHRoZSBWaXNpdG9yIHRoYXQgY2FsbGVkIHRoaXMgZ2VuZXJhdG9yCi0gICogQHJldHVybiBWaXNpdG9yIAotICAqLwotICBwdWJsaWMgVmlzaXRvciBnZXRWaXNpdG9yICgpCi0gIHsKLSAgICAgIHJldHVybiBmVmlzaXRvcjsKLSAgfQotICAKLQotCi0KLSAgLyoqCi0gICogdmVjdG9yIHVzZWQgdG8gaG9sZCBzdGF0ZSBkYXRhIAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvciAKLSAgKi8KLSAgcHVibGljIHZvaWQgcHV0UmVzaWRlbnRWZWN0b3IgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIGZSZXNpZGVudFZlY3Rvci5hZGRFbGVtZW50KG9iamVjdCk7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICogdmVjdG9yIHVzZWQgdG8gaG9sZCBzdGF0ZSBkYXRhIAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvciAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IgKFZlY3RvciB2ZWN0b3IpCi0gIHsKLSAgICAgIGZSZXNpZGVudFZlY3RvciA9IHZlY3RvcjsKLSAgfQotICAKLQotICAvKioKLSAgKiByZXR1cm5zIHRoZSByZXNpZGVudCB2ZWN0b3IKLSAgKiBAcmV0dXJuIFZpc2l0b3IgCi0gICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0UmVzaWRlbnRWZWN0b3IgKCkKLSAgewotICAgICAgcmV0dXJuIGZSZXNpZGVudFZlY3RvcjsKLSAgfQotICAKLQotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbnkgc3RhdGUgYSBnZW5lcmF0b3IgbWF5IGhhdmUKLSAgKgotICAqKi8KLQotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLSAgewotICAgICAvL3RvIGJlIGltcGxlbWVudGVkIGluIHN1Ymxhc3NlcwotICB9Ci0KLQotICAgLyoqCi0gICogc2V0cyB0aGUgdmlzaXRvciB0aGF0IGNhbGxzIHRoZSB2aXNpdAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvciAKLSAgKi8KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpdG9yKFZpc2l0b3IgdmlzaXRvcikKLSAgewotICAgICAgZlZpc2l0b3IgPSB2aXNpdG9yOwotICB9Ci0KLQotICBwdWJsaWMgSVN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgLy9pbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0gIAlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1JlbFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9SZWxWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzAwYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1JlbFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbjsKLSAgICAgIAotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogVGhpcyB2aXN0b3Igd2lsbCB2aXNpdCBlbGVtZW50cyBpbiBhIG1vZGVsIGdpdmVuIGEgCi0qIHBhcnRpY3VsYXIgcmVsCi0qICovCi1wdWJsaWMgY2xhc3MgUmVsVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJpdmF0ZSBpbnQgZkVsZW1lbnRDb3VudGVyOwotICBwcml2YXRlIGludCBmVG90YWxFbGVtZW50czsKLSAgcHJpdmF0ZSBTdHJpbmcgZnJlbE5hbWU7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIFJlbFZpc2l0b3IgKFN0cmluZyByZWxOYW1lKQotICB7Ci0gICAgIGZyZWxOYW1lID0gcmVsTmFtZTsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRUb3RhbEVsZW1lbnRzVG9WaXNpdCgpCi0gIHsKLSAgICAgcmV0dXJuIGZUb3RhbEVsZW1lbnRzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudCgpCi0gIHsKLSAgICAgaWYoZ2V0VG90YWxFbGVtZW50c1RvVmlzaXQoKSAtIHByZXNlbnRFbGVtZW50KCkgPT0gMCkgcmV0dXJuIHRydWU7Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcHJlc2VudEVsZW1lbnQoKQotICB7Ci0gICAgIHJldHVybiBmRWxlbWVudENvdW50ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoVmlzaXRvckFjdGlvbiB2YSkKLSAgewotICAgIC8vaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcwotICB9ICAKLSAgcHVibGljIElTdGF0dXMgcnVuIChPYmplY3Qgc291cmNlRWxlbWVudCxWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgCSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIGluaXRpYWxpemUodkFjdGlvbik7Ci0gIAotICAgICAgICB2QWN0aW9uLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgICAgIFJlbCByZWwgPSAoKEJhc2ljRWxlbWVudClzb3VyY2VFbGVtZW50KS5nZXRSZWwoZnJlbE5hbWUpOwotICAgICAgICAvL3NldCBzb21lIHN0YXRlIGRhdGEKLSAgICAgICAgZlRvdGFsRWxlbWVudHMgPSByZWwuZ2V0TnVtYmVyT2ZUYXJnZXRFbGVtZW50cygpOwotICAgICAgICBmRWxlbWVudENvdW50ZXIgPSAwOyAgCi0gICAgICAgIAotICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVsLmdldFRhcmdldEVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICAgQmFzaWNFbGVtZW50IHRhcmdldEVsZW1lbnQgPSAoQmFzaWNFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsgCi0gICAgICAgICAgIGZFbGVtZW50Q291bnRlcisrOwotICAgICAgICAgICBpbml0aWFsaXplKHZBY3Rpb24pOwotICAgICAgICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KHRhcmdldEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9WaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjhjZGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIHJ1biAoT2JqZWN0IG9iamVjdCwgVmlzaXRvckFjdGlvbiB2QWN0aW9uKTsKLSAgICAgICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9WaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTNkNjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9WaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFZpc2l0b3JBY3Rpb24uCi0qIFRoZSB2aXNpdG9yIHdhbGtzIHRoZSBtb2RlbCBhbmQgdGhlIFZpc2l0b3JBY3Rpb24gCi0qIGRvZXMgdGhlIGFjdGlvbgotKiAqLwotcHVibGljIGludGVyZmFjZSBWaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KTsKLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpOwotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyByZXNpZGVudFN0cmluZyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9BdHRyaWJ1dGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9BdHRyaWJ1dGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWE2NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vQXR0cmlidXRlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW4uSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVWaXNpdG9yIGV4dGVuZHMgUmVsVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcml2YXRlIFZlY3RvciBmUmVzaWRlbnRWZWN0b3IxOwotICBwcml2YXRlIFZlY3RvciBmUmVzaWRlbnRWZWN0b3IyOwotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgQXR0cmlidXRlVmlzaXRvciAoKQotICB7Ci0gICAgc3VwZXIoVHlwZUVsZW1lbnQuUkVMX0FUVFJJQlVURVMpOwotICB9Ci0KLSAgcHVibGljIEF0dHJpYnV0ZVZpc2l0b3IgKFN0cmluZyByZWwpCi0gIHsKLSAgICBzdXBlcihyZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNpZGVudFN0cmluZyhTdHJpbmcgcmVzaWRlbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50VmVjdG9yMShWZWN0b3IgcmVzaWRlbnQpCi0gIHsKLSAgICBmUmVzaWRlbnRWZWN0b3IxID0gcmVzaWRlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNpZGVudFZlY3RvcjIoVmVjdG9yIHJlc2lkZW50KQotICB7Ci0gICAgZlJlc2lkZW50VmVjdG9yMiA9IHJlc2lkZW50OwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gICAgIC8vaGFjayBmb3IgMTk3NzI2Ci0KLSAgICAgaWYodkFjdGlvbiBpbnN0YW5jZW9mIElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcil7Ci0gICAgICAgaWYoZlJlc2lkZW50VmVjdG9yMSA9PSBudWxsKSBmUmVzaWRlbnRWZWN0b3IxPW5ldyBWZWN0b3IoKTsKLSAgICAgICBpZihmUmVzaWRlbnRWZWN0b3IyID09IG51bGwpIGZSZXNpZGVudFZlY3RvcjI9bmV3IFZlY3RvcigpOwotICAgICAgICgoSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKXZBY3Rpb24pLnNldFBhcmVudEdldHRlcnMoZlJlc2lkZW50VmVjdG9yMSxmUmVzaWRlbnRWZWN0b3IyKTsKLSAgICAgfQotICB9Ci0gCi0gIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9GaWVsZFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL0ZpZWxkVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTlhZDY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL0ZpZWxkVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLklucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgRmllbGRWaXNpdG9yIGV4dGVuZHMgQXR0cmlidXRlVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcml2YXRlIFZlY3RvciBmUmVzaWRlbnRWZWN0b3IxOwotICBwcml2YXRlIFZlY3RvciBmUmVzaWRlbnRWZWN0b3IyOwotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgRmllbGRWaXNpdG9yICgpCi0gIHsKLSAgICBzdXBlcihUeXBlRWxlbWVudC5SRUxfRklFTERTKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRTdHJpbmcoU3RyaW5nIHJlc2lkZW50KQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNpZGVudFZlY3RvcjEoVmVjdG9yIHJlc2lkZW50KQotICB7Ci0gICAgZlJlc2lkZW50VmVjdG9yMSA9IHJlc2lkZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IyKFZlY3RvciByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFZlY3RvcjIgPSByZXNpZGVudDsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAgICAvL2hhY2sgZm9yIDE5NzcyNgotCi0gICAgIGlmKHZBY3Rpb24gaW5zdGFuY2VvZiBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IpewotICAgICAgIGlmKGZSZXNpZGVudFZlY3RvcjEgPT0gbnVsbCkgZlJlc2lkZW50VmVjdG9yMT1uZXcgVmVjdG9yKCk7Ci0gICAgICAgaWYoZlJlc2lkZW50VmVjdG9yMiA9PSBudWxsKSBmUmVzaWRlbnRWZWN0b3IyPW5ldyBWZWN0b3IoKTsKLSAgICAgICAoKElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcil2QWN0aW9uKS5zZXRQYXJlbnRHZXR0ZXJzKGZSZXNpZGVudFZlY3RvcjEsZlJlc2lkZW50VmVjdG9yMik7Ci0gICAgIH0KLSAgfQotIAotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vTWV0aG9kVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vTWV0aG9kVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDY2NDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL01ldGhvZFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uUmVsVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVmlzaXRvciBleHRlbmRzIFJlbFZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIE1ldGhvZFZpc2l0b3IgKCkKLSAgewotICAgICBzdXBlcihCZWFuRWxlbWVudC5SRUxfTUVUSE9EUyk7Ci0gIH0KLSAgCi0gICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vUGFyYW1ldGVyVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vUGFyYW1ldGVyVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ5MzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1BhcmFtZXRlclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uUmVsVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJWaXNpdG9yIGV4dGVuZHMgUmVsVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgUGFyYW1ldGVyVmlzaXRvciAoKQotICB7Ci0gICAgIHN1cGVyKE1ldGhvZEVsZW1lbnQuUkVMX1BBUkFNRVRFUlMpOwotICB9Ci0gIAotICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1JldHVyblBhcmFtZXRlclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1JldHVyblBhcmFtZXRlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2MjA3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9SZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmV0dXJuUGFyYW1ldGVyVmlzaXRvciBleHRlbmRzIFJlbFZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIFJldHVyblBhcmFtZXRlclZpc2l0b3IgKCkKLSAgewotICAgICBzdXBlcihNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyk7Ci0gIH0KLSAgCi0gICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vVHlwZVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1R5cGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTQ2MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vVHlwZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uUmVsVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgVHlwZVZpc2l0b3IgZXh0ZW5kcyBSZWxWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBUeXBlVmlzaXRvciAoKQotICB7Ci0gICAgc3VwZXIoVHlwZUVsZW1lbnQuUkVMX1RZUEUpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzAwNzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZNZXRob2RWaXNpdG9yOwotCi0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBjbGFzcyBEZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbiBleHRlbmRzIFZpc2l0b3JBY3Rpb25JbXBsCi17Ci0gIHByaXZhdGUgc3RhdGljIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLQotICBwdWJsaWMgRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24gKCBWZWN0b3IgbWVzc2FnZXMsIFZlY3RvciBiZWFucykKLSAgCXsKLSAgCQlzdXBlciAobWVzc2FnZXMsIGJlYW5zKTsKLSAgCX0KLQotICAvKioKLSAgKiBUaGUgdmlzaXQgd2lsbCBjcmVhdGUgdGhlIGJlYW4KLSAgKiBXYWxrIHRoZSBtZXRob2RzCi0gICogQHBhcmFtIEphdmFDbGFzcyB0aGUgY2xhc3MgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGJlYW4gbW9kZWwKLSAgKiovCi0gIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3QgamF2YWNsYXNzKQotICB7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YWNsYXNzOwotICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGphdmFDbGFzcy5nZXRKYXZhUGFja2FnZSgpLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgU3RyaW5nIGJlYW5OYW1lID0gamF2YUNsYXNzLmdldE5hbWUoKTsKLQotICAgIGlmICghaXNCZWFuVmlzaXRlZChqYXZhQ2xhc3MpKSB7Ci0gICAgICAJYWRkVmlzaXRlZEJlYW4oamF2YUNsYXNzKTsKLQkJLy8gY2hlY2sgdGhlIGJlYW4gbmFtZQotCQljaGVja0JlYW5OYW1lKGJlYW5OYW1lKTsKLQkJY2hlY2tQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgYmVhbk5hbWUpOwotCSAgCURldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24gbWV0aG9kVmlzaXRvckFjdGlvbiA9IG5ldyBEZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uKGdldE1lc3NhZ2VzKCksIGdldEJlYW5zVmlzaXRlZCgpKTsKLSAgICAgIAlKYXZhTW9mTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IEphdmFNb2ZNZXRob2RWaXNpdG9yKCk7Ci0gICAgCW1ldGhvZFZpc2l0b3IucnVuKGphdmFDbGFzcyxtZXRob2RWaXNpdG9yQWN0aW9uKTsKLSAgICAgfQotICAgIAotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgfQotCi0gICBwcml2YXRlIHZvaWQgY2hlY2tCZWFuTmFtZShTdHJpbmcgYmVhbk5hbWUpCi0gICAJewotCSAKLQkgLy8gY2hlY2sgaWYgdGhlIGJlYW4gc3RhcnRzIHdpdGggYSBsb3dlciBjYXNlCi0JIGlmICggQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGJlYW5OYW1lLmNoYXJBdCgwKSkpCi0gICAgCWFkZE1lc3NhZ2UoQ29uc3VtcHRpb25NZXNzYWdlcy5XQVJOX0JFQU5fTkFNRV9TVEFSVFNfV0lUSF9MT1dFUl9DQVNFLCBuZXcgU3RyaW5nW117YmVhbk5hbWV9KTsgIAotCi0JCi0gICAgIC8vY2hlY2sgaWYgdGhlIG5hbWUgaGFzIGFuIHVuZGVyc2NvcmUsIHRoZW4gbmV4dCBsZXR0ZXIgc2hvdWxkIGJlIHVwcGVyIGNhc2UKLSAgICAgaW50IHVuZGVyU2NvcmVJbmRleCA9IGJlYW5OYW1lLmluZGV4T2YoVU5ERVJTQ09SRSk7Ci0JIFN0cmluZyB0ZW1wTmFtZSA9IGJlYW5OYW1lOwotCSB3aGlsZSh1bmRlclNjb3JlSW5kZXggIT0tMSkgewotCQl0ZW1wTmFtZSA9IHRlbXBOYW1lLnN1YnN0cmluZyh1bmRlclNjb3JlSW5kZXgrMSk7Ci0JCWlmICggQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHRlbXBOYW1lLmNoYXJBdCgwKSkpIHsKLSAgICAgIAkJYWRkTWVzc2FnZShDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19XQVJOX01FVEhPRF9OQU1FX0lOVkFMSUQsIG5ldyBTdHJpbmdbXSB7IGJlYW5OYW1lIH0pOyAgCi0gICAgICAJCWJyZWFrOwotCQkJfQotCQllbHNlCi0JCQl1bmRlclNjb3JlSW5kZXggPSB0ZW1wTmFtZS5pbmRleE9mKFVOREVSU0NPUkUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgYmVhbk5hbWUpCi0JCXsKLQkJCWlmICghcGFja2FnZU5hbWUuZXF1YWxzKHBhY2thZ2VOYW1lLnRvTG93ZXJDYXNlKCkpKQotCQkJCWFkZE1lc3NhZ2UoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfV0FSTl9QQUNLQUdFX05BTUVfSEFTX1VQUEVSX0NBU0UsIG5ldyBTdHJpbmdbXSB7IHBhY2thZ2VOYW1lLCBiZWFuTmFtZSB9KTsKLQkJfQotIH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmNhMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLgotKiBUaGlzIFZpc2l0b3JBY3Rpb24gd2lsbCBjcmVhdGUgYSBCZWFuRWxlbWVudCB1c2luZyB0aGUgCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBjbGFzcyBEZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uIGV4dGVuZHMgVmlzaXRvckFjdGlvbkltcGwgCi17Ci0gIHByaXZhdGUgc3RhdGljIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLSAgcHJpdmF0ZSBib29sZWFuIHNlcnZpY2VCZWFuID0gZmFsc2U7Ci0KLSAgIHB1YmxpYyBEZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uICggVmVjdG9yIG1lc3NhZ2VzLCBWZWN0b3IgYmVhbnMpCi0gIAl7Ci0gIAkJc3VwZXIgKG1lc3NhZ2VzLCBiZWFucyk7Ci0gIAkJaWYgKCBiZWFucy5zaXplKCkgPT0gMSkKLSAgCQkJc2VydmljZUJlYW4gPSB0cnVlOwotICAJfQotCi0gIC8qKgotICAqIENyZWF0ZSBhIG1ldGhvZCBlbGVtZW50IGZyb20gdGhlIG1ldGhvZCAKLSAgKiBAcGFyYW0gTWV0aG9kIHRoZSBjbGFzcyB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWV0aG9kCi0gICoqLwotICBwdWJsaWMgSVN0YXR1cyB2aXNpdCAoT2JqZWN0IGltZXRob2QpCi0gIHsKLSAgICAKLSAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClpbWV0aG9kOwotICAgIFN0cmluZyAgY2xhc3NOYW1lID0gbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCi0JaWYgKCBzZXJ2aWNlQmVhbiAmJiAhbWV0aG9kLmlzQ29uc3RydWN0b3IoKSApCi0JCWNoZWNrVXBwZXJDYXNlKG5hbWUsIGNsYXNzTmFtZSk7Ci0JCi0JLy8gZm9yIHNlcnZpY2UgYmVhbiBvciBhbnkgcmVmZXJlbmNlZCBiZWFuIHByb3BlcnR5IGFjY2Vzc29ycwotCSBpZiAoIHNlcnZpY2VCZWFuIHx8IG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJzZXQiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImlzIikpIAotCSB7Ci0JICAgIGNoZWNrVW5kZXJTY29yZShuYW1lLCBjbGFzc05hbWUpOwotCSAgICBjaGVja051bWVyaWNEaWdpdHMobmFtZSwgY2xhc3NOYW1lKTsKLQkgICAgY2hlY2tCb29sZWFuUHJvcGVydGllcyhtZXRob2QsIGNsYXNzTmFtZSk7Ci0JCSAgCQotCSAJRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uID0gbmV3IERldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24oZ2V0TWVzc2FnZXMoKSwgZ2V0QmVhbnNWaXNpdGVkKCkpOwotCSAJLy8gcnNrIFBhc3NpbmcgaW4gbnVsbCBmb3IgdGhlIGVudmlyb25tZW50LiBEZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIE9LIHN0YXR1cy4KLSAgICAJSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IgcGFyYW1ldGVyVmlzaXRvciA9IG5ldyBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvcihudWxsKTsKLSAgICAJcGFyYW1ldGVyVmlzaXRvci5ydW4obWV0aG9kLCBwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKTsgICAKLQkgIH0KLQkgCi0JIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotICBwcml2YXRlIHZvaWQgY2hlY2tVcHBlckNhc2UoU3RyaW5nIG5hbWUsIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgCSAvLyBpbiBhIHNlcnZpY2UgYmVhbiBjaGVjayBpZiBhbnkgbWV0aG9kIHN0YXJ0cyB3aXRoIHVwcGVyIGNhc2UgbGV0dGVyCi0JIGlmICggQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKG5hbWUuY2hhckF0KDApKSkKLSAgICAJCWFkZE1lc3NhZ2UoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfV0FSTl9KQVZBX01FVEhPRF9TVEFSVF9XSVRIX1VQUEVSX0NBU0UsIG5ldyBTdHJpbmdbXXtuYW1lLCBjbGFzc05hbWV9KTsgIAotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgY2hlY2tVbmRlclNjb3JlKFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgIC8vY2hlY2sgaWYgdGhlIG5hbWUgaGFzIGFuIHVuZGVyc2NvcmUsIHRoZW4gbmV4dCBsZXR0ZXIgc2hvdWxkIGJlIHVwcGVyIGNhc2UKLSAgICAgaW50IHVuZGVyU2NvcmVJbmRleCA9IG5hbWUuaW5kZXhPZihVTkRFUlNDT1JFKTsKLQkgU3RyaW5nIHRlbXBOYW1lID0gbmFtZTsKLQkgd2hpbGUodW5kZXJTY29yZUluZGV4ICE9LTEpIHsKLQkJdGVtcE5hbWUgPSB0ZW1wTmFtZS5zdWJzdHJpbmcodW5kZXJTY29yZUluZGV4KzEpOwotCQlpZiAoIENoYXJhY3Rlci5pc0xvd2VyQ2FzZSh0ZW1wTmFtZS5jaGFyQXQoMCkpKSB7Ci0gICAgCQlhZGRNZXNzYWdlKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fTUVUSE9EX05BTUVfSU5WQUxJRCwgbmV3IFN0cmluZ1tde25hbWUsIGNsYXNzTmFtZX0pOyAgCi0gICAgIAkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJdW5kZXJTY29yZUluZGV4ID0gdGVtcE5hbWUuaW5kZXhPZihVTkRFUlNDT1JFKTsKLQkgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY2hlY2tOdW1lcmljRGlnaXRzKFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgIC8vY2hlY2sgaWYgdGhlIG5hbWUgaGFzIGEgbnVtZXJpYywgdGhlbiBuZXh0IGxldHRlciBzaG91bGQgYmUgdXBwZXIgY2FzZQotICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspCi0gICAgIAl7Ci0gICAgIAkJaWYgKCBDaGFyYWN0ZXIuaXNEaWdpdChuYW1lLmNoYXJBdChpKSkpCi0gICAgIAkJCXsKLSAgICAgCQkJCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UobmFtZS5jaGFyQXQoaSsxKSkpIHsKLQkJCSAgICAJCWFkZE1lc3NhZ2UoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfV0FSTl9NRVRIT0RfTkFNRV9JTlZBTElELCBuZXcgU3RyaW5nW117bmFtZSwgY2xhc3NOYW1lfSk7ICAKLQkJCSAgICAgCQlicmVhazsKLSAJCQkJCX0KLQkJfQotICAgICB9Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrQm9vbGVhblByb3BlcnRpZXMoTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgCXsKLSAgCQlpZiAoIXNlcnZpY2VCZWFuICYmIG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiZ2V0IikgJiYgCi0gIAkJCShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoImJvb2xlYW4iKSB8fAotICAJCQkgbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuQm9vbGVhbiIpKSkKLSAgCQkJYWRkTWVzc2FnZShDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19XQVJOX0JPT0xFQU5fUFJPUEVSVFlfQUNDRVNTT1JTLCBuZXcgU3RyaW5nW117bWV0aG9kLmdldE5hbWUoKSwgY2xhc3NOYW1lfSk7ICAKLSAgCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0RldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYzA3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0RldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQmVhblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlIAotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayB0aGUgbWV0aG9kcyBpbiB0aGUgSmF2YUNsYXNzCi0qICovCi1wdWJsaWMgY2xhc3MgRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBleHRlbmRzIFZpc2l0b3JBY3Rpb25JbXBsIAotewotCi0gIHB1YmxpYyBEZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uICggVmVjdG9yIG1lc3NhZ2VzLCBWZWN0b3IgYmVhbnMpCi0gIAl7Ci0gIAkJc3VwZXIgKG1lc3NhZ2VzLCBiZWFucyk7Ci0gIAl9Ci0KLSAgLyoqCi0gICogQ3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWV0aG9kIAotICAqIEBwYXJhbSBNZXRob2QgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3QgaWphdmFQYXJhbWV0ZXIpCi0gIHsKLSAgICAKLSAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSAoSmF2YVBhcmFtZXRlcikgaWphdmFQYXJhbWV0ZXI7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IG51bGw7Ci0gICAgaWYgKCBqYXZhUGFyYW1ldGVyLmdldEphdmFUeXBlKCkgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpIAotICAgIAl7Ci0gICAgCWphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIGphdmFQYXJhbWV0ZXIuZ2V0SmF2YVR5cGUoKTsKLSAgICAJaWYgKGphdmFDbGFzcy5pc0FycmF5KCkpCi0gICAgCSAgewotICAgIAkgICAgSmF2YUhlbHBlcnMgY29tcG9uZW50VHlwZSA9ICgoQXJyYXlUeXBlKWphdmFDbGFzcykuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCk7Ci0gICAgCSAgICBpZiAoY29tcG9uZW50VHlwZSBpbnN0YW5jZW9mIEphdmFDbGFzcykKLSAgICAJICAgICAgewotICAgIAkgICAgICAgIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpY29tcG9uZW50VHlwZTsKLSAgICAJICAgICAgfQotICAgIAkgICAgZWxzZQotICAgIAkgICAgICB7Ci0gICAgCSAgICAgICAgamF2YUNsYXNzID0gbnVsbDsgLy9UaGUgYXJyYXkgY29udGFpbnMgcHJpbWl0aXZlIHR5cGVzLCB0aGVyZSBpcyBubyBuZWVkIGZvciBmdXJ0aGVyIGNoZWNraW5nLgotICAgIAkgICAgICB9Ci0gICAgCSAgfQotICAgIAl9Ci0gICAJaWYgKHRvQmVWaXNpdGVkKGphdmFDbGFzcykpICAgIHsKLQkJCURldGVjdE5vbkphdmFDaGFyc0JlYW5WaXNpdG9yQWN0aW9uIGJlYW5WaXNpdG9yQWN0aW9uID0gbmV3IERldGVjdE5vbkphdmFDaGFyc0JlYW5WaXNpdG9yQWN0aW9uKGdldE1lc3NhZ2VzKCksIGdldEJlYW5zVmlzaXRlZCgpKTsKLQkJCUphdmFNb2ZCZWFuVmlzaXRvciBiZWFuVmlzaXRvciA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3IoKTsKLQkJCWJlYW5WaXNpdG9yLnJ1bihqYXZhQ2xhc3MsYmVhblZpc2l0b3JBY3Rpb24pOwotICAJICAJfQotICAgCQotICAgCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotCi0gIHByaXZhdGUgYm9vbGVhbiB0b0JlVmlzaXRlZCAoSmF2YUNsYXNzIGphdmFDbGFzcykKLSAgewotCS8vY2hlY2sgZm9yIHJlY29nbml6ZWQgdHlwZXMgCi0JaWYoIGphdmFDbGFzcyA9PSBudWxsCXx8Ci0JICAgamF2YUNsYXNzLmlzUHJpbWl0aXZlKCkgfHwKLQkgICBqYXZhQ2xhc3MuZ2V0SmF2YU5hbWUoKS5zdGFydHNXaXRoKCJqYXZheCIpIHx8Ci0gICAgICAgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YUNsYXNzLmdldEphdmFOYW1lKCkpKQotCSAgICAJcmV0dXJuIGZhbHNlOwotCWVsc2UKLQkJICAJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTlhYzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkF0dHJpYnV0ZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbW9uLlNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQXR0cmlidXRlRWxlbWVudCB1c2luZyB0aGUKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgYSBjb21wbGV4IHR5cGUKLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbiBleHRlbmRzIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbgotewotCi0gIC8qCi0gICpDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIHByb2plY3QsIElFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyB2aXNpdCAoT2JqZWN0IHByb3BlcnR5RGVjb3JhdG9yKQotICB7Ci0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gIAkgIAkKLSAgICAvL1Byb3BlcnR5RGVjb3JhdG9yIHBkID0gKFByb3BlcnR5RGVjb3JhdG9yKXByb3BlcnR5RGVjb3JhdG9yOwotICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IChTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpcHJvcGVydHlEZWNvcmF0b3I7ICAKLSAgICAKLSAgICAKLSAgICB0cnl7Ci0gICAgICAgLy9pZiB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyB1bnN1cHBvcnRlZCBkb250IG1ha2UgYW4gQXR0cmlidXRlCi0gICAgICBpZighKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZSgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpKSAKLSAgICAgIAkmJiAoVHlwZUZhY3RvcnkuaXNVblN1cHBvcnRlZFR5cGUoKEphdmFIZWxwZXJzKXBkLmdldFByb3BlcnR5VHlwZSgpKSkpewotICAgICAgCSAgc3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSArICgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpLmdldEphdmFOYW1lKCkgKTsKLQkgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotCSAgICAgIC8vQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSArICgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpLmdldEphdmFOYW1lKCksbnVsbCkpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICB9CQotCi0gICAgICBNZXRob2Qgc2V0TWV0aG9kID0gcGQuZ2V0V3JpdGVNZXRob2QoKTsKLSAgICAgIE1ldGhvZCBnZXRNZXRob2QgPSBwZC5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICBpZihzZXRNZXRob2QgIT0gbnVsbCl7Ci0gICAgICAJaWYoc2V0TWV0aG9kLmlzU3RhdGljKCkpewotICAgICAgICAgIHNldE1ldGhvZD1udWxsOyAKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgICBpZihnZXRNZXRob2QgIT0gbnVsbCl7Ci0gICAgICAJaWYoZ2V0TWV0aG9kLmlzU3RhdGljKCkpewotICAgICAgICAgIGdldE1ldGhvZD1udWxsOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKHBkLmlzZlN0YXRpYygpKXsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIAotICAgICAgQXR0cmlidXRlRWxlbWVudCBhdHRyaWJ1dGVFbGVtZW50ID0gKEF0dHJpYnV0ZUVsZW1lbnQpQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQocHJvcGVydHlEZWNvcmF0b3IsZlBhcmVudEVsZW1lbnQpOwotCi0gICAgICBpZihhdHRyaWJ1dGVFbGVtZW50ICE9IG51bGwpewotICAgICAgICAKLSAgICAgICAgLy9sZXRzIGNoZWNrIGFuZCBzZWUgaWYgdGhlIGdldHRlciB0YWtlcyBpbnB1dCBwYXJhbXMKLSAgICAgICAgLy9pZiBzbyB0aHJvdyBhbiBlcnJvcgotICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgIGlmKGdldE1ldGhvZCAhPSBudWxsKXsKLQkgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IGdldE1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkgICAgICAgIGlmKGphdmFQYXJhbWV0ZXIubGVuZ3RoID4gMCl7Ci0JICAgICAgICAgIGlmKGdldFJldHVyblBhcmFtKCkpIHJldHVybiBzdGF0dXM7Ci0JICAgICAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLndhcm5pbmdTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX0lOREVYRURfUFJPUEVSVElFUyArIGdldE1ldGhvZC5nZXROYW1lKCkgKTsKLQkgICAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLQkgICAgICAgICAgLy8JCUNvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX0lOREVYRURfUFJPUEVSVElFUyArIGdldE1ldGhvZC5nZXROYW1lKCksbnVsbCkpOwotCSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHNldE1ldGhvZCAhPSBudWxsKSBhdHRyaWJ1dGVFbGVtZW50LnNldFNldHRlck1ldGhvZChzZXRNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLSAgICAgICAgaWYoZ2V0TWV0aG9kICE9IG51bGwpIGF0dHJpYnV0ZUVsZW1lbnQuc2V0R2V0dGVyTWV0aG9kKGdldE1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotCi0gICAgICAgIEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbiB0eXBlVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24oYXR0cmlidXRlRWxlbWVudCxjbGllbnRQcm9qZWN0LCBlbnZfKTsKLSAgICAgICAgdHlwZVZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgICAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRCZWFuc0NyZWF0ZWQoZ2V0QmVhbnNDcmVhdGVkKCkpOwotICAgICAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsgCi0gICAgICAgIEphdmFNb2ZUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3IoZW52Xyk7Ci0gICAgICAgIHR5cGVWaXNpdG9yLnNldENsaWVudFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgc3RhdHVzID0gdHlwZVZpc2l0b3IucnVuKHBkLHR5cGVWaXNpdG9yQWN0aW9uKTsKLSAgICAgICAKLSAgICAgIH0KLSAgICAKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfWNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJZW52Xy5nZXRMb2coKS5sb2coSUxvZy5XQVJOSU5HLCA1MDU0LCB0aGlzLCAidmlzaXQiLCBlKTsKLSAgICAJc3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cygJQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfSlRTX0pTUF9HRU4sIGUpOwotICAgIAl0cnkgewotCQkJZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBlMSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfSlRTX0pTUF9HRU4pOwotCQl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vZW52LkxvZy53cml0ZSh0aGlzLCJ2aXNpdCIsSUxvZy5PSyxlKTt9Ci0KLSAgfQotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjExNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1hbmQuTnVsbFN0YXR1c01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1hbmQuU3RhdHVzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mRmllbGRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mTWV0aG9kVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuTW9kZWxFbGVtZW50c0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uCi17Ci0KLSAgcHJvdGVjdGVkIElFbnZpcm9ubWVudCBlbnZfOwotICBwcm90ZWN0ZWQgVmlzaXRvciBmVmlzaXRvcjsKLQotICAvKgotICAqIFRoZSBwcm9qZWN0IHRoYXQgZGVmaW5lcyB0aGUgY29udGV4dAotICAqKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjbGllbnRQcm9qZWN0OwotCi0gIC8qCi0gICogVGhlIFN0YXR1cyBtb25pdG9yCi0gICoqLwotICBwcm90ZWN0ZWQgU3RhdHVzTW9uaXRvciBtb25pdG9yXzsKLQotICAvKgotICAqIFRoZSBtb2RlbCB0aGF0IHdpbGwgYmUgY3JlYXRlZAotICAqKi8KLSAgcHJvdGVjdGVkIE1vZGVsIGZNb2RlbDsKLQotICAvKgotICAqIFRoaXMgaXMgdGhlIHBhcmVudCBlbGVtZW50IHVzZWQgd2hlbiBjcmVhdGluZyBhCi0gICogbmV3IGVsZW1lbnQKLSAgKi8KLSAgcHJvdGVjdGVkIEVsZW1lbnQgZlBhcmVudEVsZW1lbnQ7Ci0KLSAgLyoKLSAgKiBNZXRob2RzIHByb2Nlc3NlZCBmcm9tIHByb3h5Ci0gICovCi0gIHByb3RlY3RlZCBWZWN0b3IgZkJlYW5zQ3JlYXRlZDsKLQotICBwcml2YXRlIEJvb2xlYW5TZWxlY3Rpb25bXSBmTWV0aG9kc1NlbGVjdGVkOwotCi0gIC8qCi0gICogdGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB0aGUgYmVhbiBpcyBhIHJldHVybiBwYXJhbWV0ZXIgb3IgYW4gaW5wdXQgcGFyYW1ldGVyCi0gICogdXN1YWxseSB0aGlzIHNob3VsZCBiZSBzZXQgYXJvdW5kIHRoZSBwYXJhbWV0ZXJ2aXNpdG9yYWN0aW9uLCBhbmQgcGFzc2VkIG9uIGZyb20gdGhlcmUKLSAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZlJldHVyblBhcmFtPWZhbHNlOwotCi0gIHB1YmxpYyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24oU3RyaW5nIGNsaWVudFByb2plY3QsQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHMsIElFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICAgIGZNZXRob2RzU2VsZWN0ZWQgPSBtZXRob2RzOwotCWVudl8gPSBlbnY7Ci0gIH0KLQotCi0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICogQHBhcmFtIE1vZGVsIG1vZGVsIGlzIHRoZSBNb2RlbCB0aGF0IHRoaXMgYmVhbiB3aWxsIGJlIHBsYWNlZCBpbgotICAqIEBwYXJhbSBJUHJvamVjdCB1c2VkIGluIG5hdHVyZQotICAqKi8KLSAgcHVibGljIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihNb2RlbCBtb2RlbCwgU3RyaW5nIGNsaWVudFByb2plY3QsIElFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICAgIGZNb2RlbCA9IG1vZGVsOwotCWVudl8gPSBlbnY7Ci0gIH0KLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiBAcGFyYW0gRWxlbWVudCB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCB0aGlzIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0b28KLSAgKiBAcGFyYW0gSVByb2plY3QgdXNlZCBpbiBuYXR1cmUKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24oRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgY2xpZW50UHJvamVjdCwgSUVudmlyb25tZW50IGVudiApCi0gIHsKLSAgICBmUGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLQllbnZfID0gZW52OwotICB9Ci0KLSAgLyoqCi0gICogVGhlIHZpc2l0IHdpbGwgY3JlYXRlIHRoZSBiZWFuCi0gICogV2FsayB0aGUgbWV0aG9kcwotICAqIEBwYXJhbSBKYXZhQ2xhc3MgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBiZWFuIG1vZGVsCi0gICoqLwotICBwdWJsaWMgSVN0YXR1cyB2aXNpdCAoT2JqZWN0IGphdmFjbGFzcykKLSAgewotICAJQ2hvaWNlIE9LQ2hvaWNlID0gbmV3IENob2ljZSgnTycsIENvbnN1bXB0aW9uTWVzc2FnZXMuTEFCRUxfT0ssIENvbnN1bXB0aW9uTWVzc2FnZXMuREVTQ1JJUFRJT05fT0spOwotICAJQ2hvaWNlIENhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ0MnLCBDb25zdW1wdGlvbk1lc3NhZ2VzLkxBQkVMX0NBTkNFTCwgQ29uc3VtcHRpb25NZXNzYWdlcy5ERVNDUklQVElPTl9DQU5DRUwpOwotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFjbGFzczsKLSAgICAKLSAgICAKLSAgICBCZWFuRWxlbWVudCBiZWFuRWxlbWVudCA9IChCZWFuRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChqYXZhQ2xhc3MsZlBhcmVudEVsZW1lbnQsZk1vZGVsKTsKLSAgICBpZihiZWFuRWxlbWVudC5pc093bmVyUGFyYW1ldGVyKCkpIHsKLSAgICAgICAgcmVzZXRCZWFuc0NyZWF0ZWQoKTsKLSAgICB9Ci0gICAgZk1vZGVsID0gYmVhbkVsZW1lbnQuZ2V0TW9kZWwoKTsKLQotICAgIC8vdGhpcyBmb3IgdGhlIHN1YnNlcXVlbnQgYmVhbnMgdGhhdCByZXByZXNlbnQgdHlwZXMKLSAgICAvL2ZpcnN0IGRvIHRoZSBhdHRyaWJ1dGVzCi0gICAgLy9pZiB3ZSBhcmUgbm90IG9uIHRoZSByb290Ci0gICAgaWYgKCEoYmVhbkVsZW1lbnQgPT0gZk1vZGVsLmdldFJvb3RFbGVtZW50KCkpKXsKLSAgICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QmVhbnNDcmVhdGVkKCkuZWxlbWVudHMoKTsKLSAgICAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIGlmKG5hbWUuZXF1YWxzKGphdmFDbGFzcy5nZXROYW1lKCkpKXsKLSAgICAgICAgICAJc3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfSlRTX0NZQ0xJQ19CRUFOICk7Ci0gICAgICAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0gICAgICAgICAgICAJCQkvL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19FUlJPUl9KVFNfQ1lDTElDX0JFQU4iICksbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIAotICAgICAgIEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uIGF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24oYmVhbkVsZW1lbnQsY2xpZW50UHJvamVjdCwgZW52Xyk7Ci0gICAgICAgLy9hdHRyaWJ1dGVWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgICBWZWN0b3IgY2hpbGRWZWN0b3IgPSAoKFZlY3RvcilnZXRCZWFuc0NyZWF0ZWQoKS5jbG9uZSgpKTsKLSAgICAgICBjaGlsZFZlY3Rvci5hZGRFbGVtZW50KGphdmFDbGFzcy5nZXROYW1lKCkpOyAgCi0gICAgICAgYXR0cmlidXRlVmlzaXRvckFjdGlvbi5zZXRCZWFuc0NyZWF0ZWQoY2hpbGRWZWN0b3IpOwotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24uc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7Ci0gICAgICAgSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3IgYXR0cmlidXRlVmlzaXRvciA9IG5ldyBKYXZhTW9mQXR0cmlidXRlVmlzaXRvcigpOwotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3Iuc2V0UmV0dXJuUGFyYW1ldGVyKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3Iuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3Iuc2V0RW52aXJvbm1lbnQoZW52Xyk7Ci0gICAgICAgc3RhdHVzID0gYXR0cmlidXRlVmlzaXRvci5ydW4oamF2YUNsYXNzLGF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24pOwotICAgICAgIC8vCi0gICAgICAgaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgIAotICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICAgewotICAgICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudl8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgIHsKLSAgICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgICAJICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEICk7Ci0gICAgICAgICB9Ci0gICAgICAgICAJCi0gICAgICAgfQotICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICBKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uIGZpZWxkVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uKGJlYW5FbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgIC8vZmllbGRWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgICBWZWN0b3IgY2hpbGRWZWN0b3IyID0gKChWZWN0b3IpZ2V0QmVhbnNDcmVhdGVkKCkuY2xvbmUoKSk7Ci0gICAgICAgY2hpbGRWZWN0b3IyLmFkZEVsZW1lbnQoamF2YUNsYXNzLmdldE5hbWUoKSk7ICAKLSAgICAgICBmaWVsZFZpc2l0b3JBY3Rpb24uc2V0QmVhbnNDcmVhdGVkKGNoaWxkVmVjdG9yMik7Ci0gICAgICAgZmllbGRWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgIEphdmFNb2ZGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEphdmFNb2ZGaWVsZFZpc2l0b3IoKTsKLSAgICAgICBmaWVsZFZpc2l0b3Iuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgIHN0YXR1cyA9IGZpZWxkVmlzaXRvci5ydW4oamF2YUNsYXNzLGZpZWxkVmlzaXRvckFjdGlvbik7Ci0gICAgICAgLy8KLSAgICAgICBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgICB7Ci0gICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgCSAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQgKTsKLSAgICAgICAgIH0KLSAgICAgICAgIAkKLSAgICAgICB9Ci0gICAgICAgLy8gICAgICAgCi0gICAgICAgCi0gICB9Ci0KLSAgICAvL3RoaXMgaXMgdG8gaW5zdXJlIHdlIGFyZSBvbiB0aGUgcHJveHkKLSAgICAvL25vdyBkbyB0aGUgbWV0aG9kcwotICAgIGlmIChiZWFuRWxlbWVudCA9PSBmTW9kZWwuZ2V0Um9vdEVsZW1lbnQoKSl7Ci0gICAgICAvL2ZpcnN0IGxldHMgbWFrZSBzdXJlIHRoZSBwcm94eSBpcyBpbiBnb29kIGZvcm0KLSAgICAgIC8vLWl0IGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgIC8vLWl0IGhhcyBhdCBsZWFzdCBvbmUgbWV0aG9kCi0gICAgICAvL290aGVyd2lzZSByZXR1cm4gdGhlIHByb2JsZW0gaW4gdGhlIGZvcm0gb2YgYSBzdGF0dXMKLQotICAgICAgaWYgKCFwcm94eUNoZWNrKGphdmFDbGFzcywgc3RhdHVzKSkgcmV0dXJuIHN0YXR1czsKLSAgICAgIEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uIG1ldGhvZFZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZk1ldGhvZFZpc2l0b3JBY3Rpb24oYmVhbkVsZW1lbnQsY2xpZW50UHJvamVjdCwgZW52Xyk7Ci0gICAgICAKLSAgICAgIC8vbWV0aG9kVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgICBKYXZhTW9mTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IEphdmFNb2ZNZXRob2RWaXNpdG9yKCk7Ci0gICAgICBtZXRob2RWaXNpdG9yLnNldE1ldGhvZFNlbGVjdGlvbihmTWV0aG9kc1NlbGVjdGVkKTsKLSAgICAgIHN0YXR1cyA9IG1ldGhvZFZpc2l0b3IucnVuKGphdmFDbGFzcyxtZXRob2RWaXNpdG9yQWN0aW9uKTsKLQotICAgICAgLy8KLSAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICB7Ci0gICAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgewotICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAJICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCApOwotICAgICAgICB9Ci0gICAgICAgIAkKLSAgICAgIH0KLSAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy9UaGlzIGlzIHdoZXJlIHdlIGNoZWNrIGZvciBzZXZlcmFsIHRoaW5nczoKLSAgICAgIC8vLWlmIG5vIG1ldGhvZHMgd2VyZSBwcm9jZXNzZWQgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCB0eXBlcyB0aGVuIHdlIHNlbmQgYmFjayB0aGF0IHJlc3VsdAotICAgICAgLy8taWYgdGhlcmUgd2VyZSBhbnkgbWV0aG9kcyBvbWl0dGVkIHdlIHNob3VsZCB3YXJuIHRoZW0KLQotICAgICAgLy9maXJzdCBubyBtZXRob2RzCi0gICAgICBpZiAoIW1ldGhvZFZpc2l0b3JBY3Rpb24ud2VyZU1ldGhvZHNQcm9jZXNzZWQoKSl7Ci0gICAgICAgIC8vdGhpcyBoYXMgdG8gYmUgZG9uZSB0byBpbnN1cmUgdGhlIGRpYWxvZyBpcyBhbiBlcnJvcgotICAgICAgCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9KVFNfTk9fUFJPWFlfTUVUSE9EU19QUk9DRVNTRUQgKTsKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAgLy8JCVdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19FUlJPUl9KVFNfTk9fUFJPWFlfTUVUSE9EU19QUk9DRVNTRUQiICksbnVsbCkpOwotICAgICAgfSAgICAgICAgCQotICAgICAgLy9ub3cgbWV0aG9kcyBvbWl0dGVkCi0gICAgICBlbHNlIGlmKG1ldGhvZFZpc2l0b3JBY3Rpb24ud2VyZU1ldGhvZHNPbWl0dGVkKCkpewotICAgICAgICAvL1RoZSBkaWFsb2cgaXMgYWxyZWFkeSBhIHdhcm5pbmcgc28gd2UganVzdCBuZWVkIHRvIHNldCB0aGUgb3ZlcmFsbCBtZXNzYWdlCi0gICAgICAJc3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfV0FSTl9KVFNfUFJPWFlfTUVUSE9EU19PTUlUVEVEICk7Ci0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAgLy8JCUNvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fSlRTX1BST1hZX01FVEhPRFNfT01JVFRFRCxudWxsKSk7Ci0gICAgICB9CQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgcmVzaWRlbnQpCi0gIHsKLSAgICAvL25vdGhpbmcgdG8gYmUgZG9uZSBidXQgbXVzdCBiZSBpbXBsZW1lbnRlZAotICB9Ci0KLQotICAvKgotICAqIFJldHVybiB0aGUgbW9kZWwgdGhhdCB3YXMgY3JlYXRlZAotICAqIEByZXR1cm4gTW9kZWwgdGhlIGJlYW4gbW9kZWwgdGhhdCB3YXMgY3JlYXRlZAotICAqLwotICBwdWJsaWMgTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIGZNb2RlbDsKLSAgfQotCi0gIC8qCi0gICogVGhlIHByb3h5IGNoZWNrIGluc3VyZXMgdGhlcmUgaXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZAotICAqIGF0IExlYXN0IG9uZSBtZXRob2QKLSAgKiBAcGFyYW0gSmF2YUNsYXNzIGphdmFDbGFzcyBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSBtZXRob2RzIG9uIHRoZSBwcm94eQotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm94eUNoZWNrKEphdmFDbGFzcyBqYXZhQ2xhc3MsIElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgIC8vIGZpcnN0IGNoZWNrIGZvciBhIG1ldGhvZAotICAgICBJdGVyYXRvciBtPWphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzKCkuaXRlcmF0b3IoKTsKLSAgICAgaWYgKCFtLmhhc05leHQoKSl7Ci0gICAgIAlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19NRVRIT0RTICk7Ci0gICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0gICAgICAgLy8JCQlDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX01FVEhPRFMsbnVsbCkpOwotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQkKLSAgICAgLy9ub3cgY2hlY2sgZm9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICB3aGlsZSAobS5oYXNOZXh0KCkpIHsKLSAgICAgICBNZXRob2QgbWV0aG9kPShNZXRob2QpbS5uZXh0KCk7Ci0gICAgICAgaWYgKGphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKXsKLSAgICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICAgICAgaWYgKGphdmFQYXJhbWV0ZXIubGVuZ3RoID4gMCl7Ci0gICAgICAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAgIAkgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX0pUU19QUk9YWV9IQVNfTk9fREVGQVVMVCApOwotICAgICAgICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAgICAgIAkJLy9Db25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX0RFRkFVTFQsbnVsbCkpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLQotICB9Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBzdGF0dXMgbW9uaXRvciB0aGF0IHRoaXMgYWN0aW9uIHdpbGwgdXNlIHRvIHJlcG9ydCBzdGF0dXMgdGhhdCBvY2NyZXMgd2hpbGUgZXhlY3V0aW5nIHRoZSBBY3Rpb24uCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1c01vbml0b3IgKCBTdGF0dXNNb25pdG9yIG1vbml0b3IgKQotICB7Ci0JbW9uaXRvcl8gPSBtb25pdG9yOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc3RhdHVzIG1vbml0b3IgdGhhdCB0aGlzIHRhc2sgaXMgdXNpbmcgdG8gcmVwb3J0IHN0YXR1cy4KLSAgKi8KLSAgcHVibGljIFN0YXR1c01vbml0b3IgZ2V0U3RhdHVzTW9uaXRvciAoKQotICB7Ci0gICAgaWYgKG1vbml0b3JfID09IG51bGwpCi0gICAgewotICAgICAgbW9uaXRvcl8gPSBuZXcgTnVsbFN0YXR1c01vbml0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1vbml0b3JfOwotICB9Ci0KLQotICAgLyoqCi0gICogY2hlY2sgaWYgdGhlIGFjdGlvbiBoYXMgZmluaXNoZWQgc3Vjc2Vzc2Z1bGx5IAotICAqLwotICAvKgotICBwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwgKCkKLSAgewotICAgCXJldHVybiBnZXRTdGF0dXNNb25pdG9yKCkuY2FuQ29udGludWUoKTsKLSAgfQotICAqLyAKLSAgcHVibGljIHZvaWQgcmVzZXRCZWFuc0NyZWF0ZWQoKQotICB7Ci0gICAgZkJlYW5zQ3JlYXRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KElFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCWVudl8gPSBlbnY7Ci0gIH0KLSAgCi0gIC8qCi0gICogVGhlIGNvbW1hbmQgdGhhdCBjYWxsZWQgdGhpcyB3aWxsIGdldCB0aGUgcmVzdWx0cyBvZiB0aGUgb3BlcmF0aW9uIGluIHRoZSBmb3JtCi0gICogb2YgYSBzdGF0dXMuCi0gICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0QmVhbnNDcmVhdGVkICgpCi0gIHsKLSAgICBpZihmQmVhbnNDcmVhdGVkID09IG51bGwpIGZCZWFuc0NyZWF0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIGZCZWFuc0NyZWF0ZWQ7Ci0gIH0KLQotICAvKgotICAqIFRoZSBjb21tYW5kIHRoYXQgY2FsbGVkIHRoaXMgd2lsbCBnZXQgdGhlIHJlc3VsdHMgb2YgdGhlIG9wZXJhdGlvbiBpbiB0aGUgZm9ybQotICAqIG9mIGEgc3RhdHVzLgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRCZWFuc0NyZWF0ZWQgKFZlY3RvciBiZWFuc0NyZWF0ZWQpCi0gIHsKLSAgICBmQmVhbnNDcmVhdGVkID0gYmVhbnNDcmVhdGVkOwotICB9Ci0KLSAgIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRSZXR1cm5QYXJhbSAoKQotICB7Ci0gICAgcmV0dXJuIGZSZXR1cm5QYXJhbTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXR1cm5QYXJhbSAoYm9vbGVhbiByZXR1cm5wYXJhbSkKLSAgewotICAgIGZSZXR1cm5QYXJhbSA9IHJldHVybnBhcmFtOwotICB9Ci0KLSAgIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3QgKCkKLSAgewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIGJvb2xlYW4gdGVsbHMgd2V0aGVyIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZXR1cm4gcGFyYW0gCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QgKFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotCi0KLSAgLyoqCi0gICogc2V0cyB0aGUgdmlzaXRvciB0aGF0IGNhbGxzIHRoZSB2aXNpdAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvcgotICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoVmlzaXRvciB2aXNpdG9yKQotICB7Ci0gICAgICBmVmlzaXRvciA9IHZpc2l0b3I7Ci0gIH0KLQotICAvKgotICAqIFNldHMgdGhlIHBhcmVudCBlbGVtZW50IHRoZSBjaGlsZCB0aGVuIGtub3dzIHdoZXJlIHRvCi0gICogYWRkIGl0c2VsZiB0byB0aGUgbW9kZWwKLSAgKiBAcGFyYW0gRWxlbWVudCBwYXJlbnQgZWxlbWVudAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGZQYXJlbnRFbGVtZW50ID0gZWxlbWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQzNzc0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkZpZWxkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQXR0cmlidXRlRWxlbWVudCB1c2luZyB0aGUKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgYSBjb21wbGV4IHR5cGUKLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uIGV4dGVuZHMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uCi17Ci0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkZpZWxkVmlzaXRvckFjdGlvbihFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcm9qZWN0LCBJRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgc3VwZXIocGFyZW50RWxlbWVudCxwcm9qZWN0LCBlbnYpOwotICB9Ci0KLQotICBwdWJsaWMgSVN0YXR1cyB2aXNpdCAoT2JqZWN0IGZpZWxkXykKLSAgewotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKWZpZWxkXzsKLSAgICAgCi0gICAgdHJ5ewotICAgICAgIC8vaWYgdGhlIHR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgdW5zdXBwb3J0ZWQgZG9udCBtYWtlIGFuIEF0dHJpYnV0ZQotICAgICAgaWYoIShnZXRSZXR1cm5QYXJhbSgpICYmIFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoKEphdmFIZWxwZXJzKWZpZWxkLmdldEphdmFDbGFzcygpKSkgCi0gICAgICAJJiYgKFR5cGVGYWN0b3J5LmlzVW5TdXBwb3J0ZWRUeXBlKChKYXZhSGVscGVycylmaWVsZC5nZXRKYXZhQ2xhc3MoKSkpKXsKLSAgICAgIAkgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLndhcm5pbmdTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUgKyAoKEphdmFIZWxwZXJzKWZpZWxkLmdldEphdmFDbGFzcygpKS5nZXRKYXZhTmFtZSgpICk7Ci0JICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLQkgICAgICAvL0NvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUgKyAoKEphdmFIZWxwZXJzKWZpZWxkLmdldEphdmFDbGFzcygpKS5nZXRKYXZhTmFtZSgpLG51bGwpKTsKLQkgICAgICByZXR1cm4gc3RhdHVzOwotCSAgfQkKLQotCi0gICAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gKEZpZWxkRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChmaWVsZCxmUGFyZW50RWxlbWVudCk7Ci0KLSAgICAgIGlmKGZpZWxkRWxlbWVudCAhPSBudWxsKXsKLSAgICAgICAgLy9sZXRzIGNoZWNrIGFuZCBzZWUgaWYgdGhlIGdldHRlciB0YWtlcyBpbnB1dCBwYXJhbXMKLSAgICAgICAgLy9pZiBzbyB0aHJvdyBhbiBlcnJvcgotICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgIAotICAgICAgICBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24gdHlwZVZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uKGZpZWxkRWxlbWVudCxjbGllbnRQcm9qZWN0LCBlbnZfKTsKLSAgICAgICAgdHlwZVZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgICAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRCZWFuc0NyZWF0ZWQoZ2V0QmVhbnNDcmVhdGVkKCkpOwotICAgICAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsgCi0gICAgICAgIEphdmFNb2ZUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3IoZW52Xyk7Ci0gICAgICAgIHR5cGVWaXNpdG9yLnNldENsaWVudFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgc3RhdHVzID0gdHlwZVZpc2l0b3IucnVuKGZpZWxkLHR5cGVWaXNpdG9yQWN0aW9uKTsKLSAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgfWNhdGNoKEV4Y2VwdGlvbiBlKQotCXsKLSAgICAJZW52Xy5nZXRMb2coKS5sb2coSUxvZy5XQVJOSU5HLCA1MDU1LCB0aGlzLCAidmlzaXQiLCBlKTsKLSAgICAJc3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cygJQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfSlRTX0pTUF9HRU4sIGUpOwotICAgIAl0cnkgewotICAgIAkJZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0gICAgCX0gCi0gICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIGUxKSAKLSAgICAgIHsKLSAgICAJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX0pUU19KU1BfR0VOLCBlMSApOwotICAgIAl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0JfQotCi0gIH0KLSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZk1ldGhvZFZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZk1ldGhvZFZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlNzI3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIEJlYW5FbGVtZW50IHVzaW5nIHRoZSAKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgdGhlIG1ldGhvZHMgaW4gdGhlIEphdmFDbGFzcwotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uIGV4dGVuZHMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIAotewotCi0gIHB1YmxpYyBTdHJpbmcgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZTsKLQotIC8qCi0gICogTWV0aG9kcyBvbWl0dGVkIGZyb20gdGhlIHByb3h5Ci0gICovCi0gIHByb3RlY3RlZCBWZWN0b3IgZk1ldGhvZHNPbWl0dGVkOwotCi0gIC8qCi0gICogTWV0aG9kcyBwcm9jZXNzZWQgZnJvbSBwcm94eQotICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGZNZXRob2RzUHJvY2Vzc2VkOwotCi0gICAgIAotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mTWV0aG9kVmlzaXRvckFjdGlvbihFbGVtZW50IHBhcmVudEVsZW1lbnQsU3RyaW5nIHByb2plY3QsIElFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0gICAgZk1ldGhvZHNPbWl0dGVkID0gbmV3IFZlY3RvcigpOwotICAgIGZNZXRob2RzUHJvY2Vzc2VkID0gbmV3IFZlY3RvcigpOwotCi0gIH0KLSAgIAotICAvKioKLSAgKiBDcmVhdGUgYSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBtZXRob2QgCi0gICogQHBhcmFtIE1ldGhvZCB0aGUgY2xhc3MgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1ldGhvZAotICAqKi8KLSAgcHVibGljIElTdGF0dXMgdmlzaXQgKE9iamVjdCBpbWV0aG9kKQotICB7Ci0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpaW1ldGhvZDsKLSAgICAgICAgICAgCi0gICAgaWYgKG1ldGhvZENoZWNrKG1ldGhvZCkpewotICAgICAgLy90aGlzIGlzIHRvIGNoZWNrIGltbWVkaWF0ZSBpbnB1dCBhbmQgcmV0dXJuIHBhcmFtZXRlcnMKLSAgICAgIC8vaWYgdGhlcmUgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSBpbiB0aGVzZSB3ZSBjYW4gcmVhY3QgaW1tZWRpYXRlbHkKLSAgICAgIC8vd2UgYWRkIGl0IHRvIHRoZSBvbWl0dGVkIG1ldGhvZHMgYW4gZ28gdG8gdGhlIG5leHQgb25lCi0gICAgICBpZighcGFyYW1ldGVyQ2hlY2sobWV0aG9kKSl7Ci0gICAgICAJc3RhdHVzID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyhDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0FSUkFZUyArIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWUgKTsKLSAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAgLy8JCUNvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfQVJSQVlTICsgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZSxudWxsKSk7Ci0gICAgICAgIGZNZXRob2RzT21pdHRlZC5hZGRFbGVtZW50KG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgICAgaWYoIW51bGxDb25zdHJ1Y3RvcihtZXRob2QpKXsKLSAgICAgIAlzdGF0dXMgPSBTdGF0dXNVdGlscy53YXJuaW5nU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0lOUFVUUyArIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWUgKTsKLSAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAJLy8JQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfUEFSQU1FVEVSU19JTlBVVFMgKyBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lLG51bGwpKTsKLSAgICAgICAgZk1ldGhvZHNPbWl0dGVkLmFkZEVsZW1lbnQobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICAgIH0KLQotICAgICAgLy9jYXJyeSBvbiBhbGwgcGFyYW1ldGVycyBzdXBwb3J0ZWQKLSAgICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KUJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KG1ldGhvZCxmUGFyZW50RWxlbWVudCk7Ci0gICAgICBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKG1ldGhvZEVsZW1lbnQsY2xpZW50UHJvamVjdCxlbnZfKTsKLSAgICAgIHBhcmFtZXRlclZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgICAgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IgcGFyYW1ldGVyVmlzaXRvciA9IG5ldyBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvcihlbnZfKTsKLSAgICAgIHN0YXR1cyA9IHBhcmFtZXRlclZpc2l0b3IucnVuKG1ldGhvZCxwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKTsgICAKLSAgICAgIC8vc29tZXRoaW5nIG1heSBoYXZlIGdvbmUgd3Jvbmcgd2l0aCBhbiBpbnRlcm5hbCB0eXBlCi0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSyl7Ci0gICAgICAgIC8vVGhpcyBtZXRob2QgaGFzIHRvIGJlIG9taXR0ZWQKLSAgICAgICAgZk1ldGhvZHNPbWl0dGVkLmFkZEVsZW1lbnQobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgICAgIG1ldGhvZEVsZW1lbnQuc2V0TWV0aG9kT21taXNzaW9uKHRydWUpOyAgCi0gICAgICB9CQotICAgICAgZWxzZSB7Ci0gICAgICAgIGZNZXRob2RzUHJvY2Vzc2VkLmFkZEVsZW1lbnQobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgICB9CQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gCi0gIC8qCi0gICogVGVsbHMgd2V0aGVyIGFueSBtZXRob2RzIHdlcmUgcHJvY2Vzc2VkIAotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGFueSBtZXRob2RzIHdlcmUgcHJvY2Vzc2VkIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiB3ZXJlTWV0aG9kc1Byb2Nlc3NlZCgpCi0gIHsKLSAgICBpZihmTWV0aG9kc1Byb2Nlc3NlZC5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICogVGVsbHMgd2V0aGVyIHRoZXJlIHdlcmUgbWV0aG9kcyBvbWl0dGVkIGJlY2F1c2Ugb2YgdW5zdXBwb3J0ZWQgdHlwZXMKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBtZXRob2RzIHdlcmUgb21pdHRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiB3ZXJlTWV0aG9kc09taXR0ZWQoKQotICB7Ci0gICAgaWYoZk1ldGhvZHNPbWl0dGVkLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgKiBUaGVyZSBtYXkgYmUgbWV0aG9kcyB0aGF0IHdlIGRvbnQgc3VwcG9ydAotICAqIGFuZCBkb250IHdhbnQgaW4gdGhlIG1vZGVsCi0gICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgZmluZQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gbWV0aG9kQ2hlY2soTWV0aG9kIG1ldGhvZCkKLSAgewotICAgIGJvb2xlYW4gb2sgPSB0cnVlOwotICAgIC8vIGlmIHdlIGhhdmUgYSBjb25zdHJ1Y3RvciB3ZSByZXR1cm4gZmFsc2UKLSAgICBpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgCi0gICAgcmV0dXJuIG9rOwotICB9Ci0KLSAgLyoqCi0gICogVGhlcmUgbWF5IGJlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QgdGhhdCBoYXZlIHR5cGVzCi0gICogbm90IHlldCBzdXBwb3J0ZWQgcmV0dXJuIGZhbHNlIGlmIHdlIGZpbmQgYW55Ci0gICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgZmluZQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gcGFyYW1ldGVyQ2hlY2soTWV0aG9kIG1ldGhvZCkKLSAgewotCi0gICAgYm9vbGVhbiBvayA9IHRydWU7Ci0gICAgCi0gICAgLy9ub3cgdGhlIGlucHV0cwotICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOyAKLSAgICBmb3IgKGludCBpID0gMDtpPGphdmFQYXJhbWV0ZXIubGVuZ3RoO2krKykgewotICAgICAgSmF2YVBhcmFtZXRlciBwYXJhbT1qYXZhUGFyYW1ldGVyW2ldOwotICAgICAgSmF2YUhlbHBlcnMgamF2YUhlbHBlcjEgPSBwYXJhbS5nZXRKYXZhVHlwZSgpOwotICAgICAgaWYoVHlwZUZhY3RvcnkuaXNVblN1cHBvcnRlZFR5cGUoamF2YUhlbHBlcjEpKSB7Ci0gICAgICAgIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWUgPSBwYXJhbS5nZXROYW1lKCk7IAotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgcmV0dXJuIG9rOwotICB9Ci0KLSAKLSAgLyoqCi0gICogVGhlcmUgbWF5IGJlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QgdGhhdCBoYXZlIHR5cGVzCi0gICogbm90IHlldCBzdXBwb3J0ZWQgcmV0dXJuIGZhbHNlIGlmIHdlIGZpbmQgYW55Ci0gICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgZmluZQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gbnVsbENvbnN0cnVjdG9yKE1ldGhvZCBtZXRob2QpCi0gIHsKLSAgICAKLSAgICBib29sZWFuIG9rID0gdHJ1ZTsKLSAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7IAotICAgIGZvciAoaW50IGkgPSAwO2k8amF2YVBhcmFtZXRlci5sZW5ndGg7aSsrKSB7Ci0gICAgICBKYXZhUGFyYW1ldGVyIHBhcmFtPWphdmFQYXJhbWV0ZXJbaV07Ci0gICAgICBKYXZhSGVscGVycyBqYXZhSGVscGVyMSA9IHBhcmFtLmdldEphdmFUeXBlKCk7Ci0gICAgICBpZihqYXZhSGVscGVyMSBpbnN0YW5jZW9mIEphdmFDbGFzcyl7Ci0gICAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFIZWxwZXIxOwotICAgICAgICBpZihUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihqYXZhQ2xhc3MuZ2V0SmF2YU5hbWUoKSkpcmV0dXJuIHRydWU7Ci0gICAgICAgICAgSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKG0uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kMj0oTWV0aG9kKW0ubmV4dCgpOwotICAgICAgICAgICAgaWYgKGphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZDIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1bXSA9IG1ldGhvZDIubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICAgICAgICAgIGlmIChqYXZhUGFyYW0ubGVuZ3RoID4gMCl7Ci0gICAgICAgICAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWUgPSBwYXJhbS5nZXROYW1lKCk7IAotICAgIAkgICAgICAgIG9rID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gb2s7Ci0gIH0KLQotIAotCi0KLQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExZmI0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5QYXJhbWV0ZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgcGFyYW1ldGVyRWxlbWVudCB1c2luZyB0aGUgCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRvIGl0cyB0eXBlCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gCi17Ci0KLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvckFjdGlvbihFbGVtZW50IHBhcmVudEVsZW1lbnQsU3RyaW5nIHByb2plY3QsIElFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0gIH0KLSAgIAotICAvKioKLSAgKiBDcmVhdGUgYSBwYXJhbWV0ZXIgZWxlbWVudCBmcm9tIHRoZSBtZXRob2QgCi0gICogQHBhcmFtIEphdmFQYXJhbWV0ZXIgdGhlIG1vZiBlbGVtZW50IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBQYXJhbWV0ZXIKLSAgKiovCi0gIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3QgaWphdmFQYXJhbWV0ZXIpCi0gIHsKLSAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgCUNob2ljZSBPS0Nob2ljZSA9IG5ldyBDaG9pY2UoJ08nLENvbnN1bXB0aW9uTWVzc2FnZXMuTEFCRUxfT0ssIENvbnN1bXB0aW9uTWVzc2FnZXMuREVTQ1JJUFRJT05fT0spOwotICAJQ2hvaWNlIENhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ0MnLCBDb25zdW1wdGlvbk1lc3NhZ2VzLkxBQkVMX0NBTkNFTCwgQ29uc3VtcHRpb25NZXNzYWdlcy5ERVNDUklQVElPTl9DQU5DRUwpOwotICAJCi0gICAgUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gKFBhcmFtZXRlckVsZW1lbnQpQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQoaWphdmFQYXJhbWV0ZXIsZlBhcmVudEVsZW1lbnQpOwotICAgIEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbiB0eXBlVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24ocGFyYW1ldGVyRWxlbWVudCxjbGllbnRQcm9qZWN0LCBlbnZfKTsKLSAgICAvL3R5cGVWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRSZXR1cm5QYXJhbShwYXJhbWV0ZXJFbGVtZW50LmlzUmV0dXJuKCkpOwotICAgIEphdmFNb2ZUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3IoZW52Xyk7Ci0gICAgdHlwZVZpc2l0b3Iuc2V0Q2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgIHN0YXR1cyA9IHR5cGVWaXNpdG9yLnJ1bihpamF2YVBhcmFtZXRlcix0eXBlVmlzaXRvckFjdGlvbik7Ci0gICAgLy8KLSAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICB7Ci0gICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgewotICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgIAkgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEICk7Ci0gICAgICB9Ci0gICAgICAJCi0gICAgfQotICAgIC8vICAgICAgICAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZUeXBlVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5OGZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZUeXBlVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzA0MTAgICAxODA5NTIgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFNhbXBsZSBKU1AgZ2VuZXJhdG9yIGNob2tlcyBvbiBpbnRlcmZhY2VzIGFuZCBhYnN0cmFjdCBjbGFzc2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQmVhblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLgotKiBUaGlzIFZpc2l0b3JBY3Rpb24gd2lsbCBjcmVhdGUgYSBUeXBlRWxlbWVudCB1c2luZyB0aGUKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgYSBjb21wbGV4IHR5cGUKLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24KLXsKLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24oRWxlbWVudCBwYXJlbnRFbGVtZW50LFN0cmluZyBwcm9qZWN0LCBJRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgc3VwZXIocGFyZW50RWxlbWVudCxwcm9qZWN0LCBlbnYpOwotICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlIGEgdHlwZSBlbGVtZW50IGZyb20gdGhlIEphdmFIZWxwZXIKLSAgKiBAcGFyYW0gSmF2YUhlbHBlciB0aGUgbW9mIGVsZW1lbnQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGUKLSAgKiovCi0gIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3QgdHlwZU5hdmlnYXRvcikKLSAgewotICAJIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgIAkgQ2hvaWNlIE9LQ2hvaWNlID0gbmV3IENob2ljZSgnTycsIENvbnN1bXB0aW9uTWVzc2FnZXMuTEFCRUxfT0ssIENvbnN1bXB0aW9uTWVzc2FnZXMuREVTQ1JJUFRJT05fT0spOwotICAJIENob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgQ29uc3VtcHRpb25NZXNzYWdlcy5MQUJFTF9DQU5DRUwsIENvbnN1bXB0aW9uTWVzc2FnZXMuREVTQ1JJUFRJT05fQ0FOQ0VMKTsgIAkgCi0KLSAgICAgLy9pZiBiZWFuCi0JIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBudWxsOwotCSBpZih0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgSmF2YUNsYXNzKXsKLQkgICAgamF2YUNsYXNzID0gKEphdmFDbGFzcyl0eXBlTmF2aWdhdG9yOwotCSB9Ci0KLQotICAgICAvKiBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtZXRlciB0aGVuIHdlIG5lZWQgdG8gdHJlYXQgdGhpcyBkaWZmZXJlbnRseSB0aGVuIGlmIGl0IGlzIGFuIGlucHV0IAotICAgICAqICBwYXJhbWV0ZXIuCi0gICAgICogIFdlIG5lZWQgdG8gZmlyc3Qgc2VlIGlmIGl0IGlzIGEgc3BlY2lhbCBjYXNlIGZvciByZXR1cm4gdHlwZXMgaWYgbm90IHdlIHRyZWF0IGl0IHRoZSBzYW1lIGFzIGV2ZXJ5dGhpbmcKLSAgICAgKiAgZWxzZS4KLSAgICAgKi8KLSAgICAgaWYoZ2V0UmV0dXJuUGFyYW0oKSAmJiBUeXBlRmFjdG9yeS5pc1JlY29nbml6ZWRSZXR1cm5UeXBlKChKYXZhSGVscGVycyl0eXBlTmF2aWdhdG9yKSkKLSAgICAgewotICAgICAgIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KHR5cGVOYXZpZ2F0b3IsZlBhcmVudEVsZW1lbnQpOwotICAgICB9CQotICAgICBlbHNlewotCSAgICBpZihUeXBlRmFjdG9yeS5pc1VuU3VwcG9ydGVkVHlwZSgoSmF2YUhlbHBlcnMpdHlwZU5hdmlnYXRvcikpewotCSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLndhcm5pbmdTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUgKyAoKEphdmFIZWxwZXJzKXR5cGVOYXZpZ2F0b3IpLmdldEphdmFOYW1lKCkgKTsJICAgIAkKLQkgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAgICAgICAvL0NvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUgKyAoKEphdmFIZWxwZXJzKXR5cGVOYXZpZ2F0b3IpLmdldEphdmFOYW1lKCksbnVsbCkpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICAgIH0JCi0JICAgIAotCSAgICAvL2lmIGphdmFjbGFzcyBpcyBudWxsIHRoZW4gd2UgaGF2ZSBhIHNpbXBsZSB0eXBlIAotCSAgICBpZigoamF2YUNsYXNzID09IG51bGwpIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGphdmFDbGFzcy5nZXRKYXZhTmFtZSgpKSkKLSAgICAgIHsKLQkgICAgICBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudCh0eXBlTmF2aWdhdG9yLGZQYXJlbnRFbGVtZW50KTsKLQkgICAgfQotCSAgICBlbHNlIGlmIChqYXZhQ2xhc3MgIT0gbnVsbCAmJiAhZ2V0UmV0dXJuUGFyYW0oKSAmJgotCQkJCS8vIHRoZSBmb2xsb3dpbmcgY2FzZXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBmb3IgaW5wdXQKLQkJCQkoamF2YUNsYXNzLmlzSW50ZXJmYWNlKCkgfHwgamF2YUNsYXNzLmlzQWJzdHJhY3QoKSB8fCAhaGFzRGVmYXVsdENvbnN0cnVjdG9yKGphdmFDbGFzcykpKSB7Ci0JICAgIAkKLQkgICAgCUVsZW1lbnQgZWxlbWVudCA9IEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KHR5cGVOYXZpZ2F0b3IsZlBhcmVudEVsZW1lbnQpOwotCSAgICAJZWxlbWVudC5zZXRQcm9wZXJ0eUFzT2JqZWN0KFR5cGVFbGVtZW50Lk5PTl9JTlNUQU5USUFCTEUsIEJvb2xlYW4uVFJVRSk7Ci0JICAgIH0KLQkgICAgZWxzZXsKLQkgICAgICBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gYmVhblZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uKGZQYXJlbnRFbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotCSAgICAgIGJlYW5WaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLQkgICAgICBiZWFuVmlzaXRvckFjdGlvbi5zZXRCZWFuc0NyZWF0ZWQoZ2V0QmVhbnNDcmVhdGVkKCkpOwotICAgICAgICAgIGJlYW5WaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotCQkgIEphdmFNb2ZCZWFuVmlzaXRvciBiZWFuVmlzaXRvciA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3IoKTsKLQkgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLQkgICAgfQotICAgICB9Ci0gICAgIAotICAgICAvLwotICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgCi0gICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgIHsKLSAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICB7Ci0gICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgICAJICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCApOwotICAgICAgIH0KLSAgICAgICAJCi0gICAgIH0KLSAgICAgLy8KLSAgICAgcmV0dXJuIHN0YXR1czsKLSAgIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBqYXZhQ2xhc3MgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIGphdmFDbGFzcyBUaGUgamF2YSBjbGFzcwotICAgKiBAcmV0dXJuIHRydWUgaWYgamF2YUNsYXNzIGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvcihKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JICAgCi0JICBMaXN0IG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0TWV0aG9kcygpOwotCSAgSXRlcmF0b3IgaXRlciA9IG1ldGhvZHMuaXRlcmF0b3IoKTsKLQkgICAKLQkgIGJvb2xlYW4gZm91bmRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCSAgIAotCSAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCSAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIGl0ZXIubmV4dCgpOwotCQkgICAKLQkJICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoamF2YUNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCSAgaWYgKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkKLQkJCQkgIHJldHVybiBtZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUM7Ci0JCQkgIGZvdW5kQ29uc3RydWN0b3IgPSB0cnVlOwotCQkgIH0KLQkgIH0KLQkgICAKLQkgIC8vIGlmIG5vIGNvbnN0cnVjdG9yIGlzIGZvdW5kIGF0IHRoaXMgcG9pbnQsIGEgZGVmYXVsdCBvbmUgaXMgaW1wbGljaXRseSBwcm92aWRlZAotCSAgcmV0dXJuICFmb3VuZENvbnN0cnVjdG9yOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL1Zpc2l0b3JBY3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL1Zpc2l0b3JBY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODMzZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9WaXNpdG9yQWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBWaXNpdG9yQWN0aW9uLgotKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgd2FsayB0aGUgbWV0aG9kcyBpbiB0aGUgSmF2YUNsYXNzCi0qICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlzaXRvckFjdGlvbkltcGwgaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uIAotewotCi0gIHByaXZhdGUgVmVjdG9yIGJlYW5zVmlzaXRlZCA9IG51bGw7Ci0gIHByaXZhdGUgVmVjdG9yIG1lc3NhZ2VzID0gbnVsbDsKLQotICBwdWJsaWMgVmlzaXRvckFjdGlvbkltcGwoIFZlY3RvciBtZXNzYWdlcywgVmVjdG9yIGJlYW5zVmlzaXRlZCkKLSAgCXsKLSAgCSB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7Ci0gIAkgdGhpcy5iZWFuc1Zpc2l0ZWQgPSBiZWFuc1Zpc2l0ZWQ7Ci0gIAl9Ci0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIC8vbm90aGluZyB0byBiZSBkb25lIGJ1dCBtdXN0IGJlIGltcGxlbWVudGVkCi0gIH0KLQotIC8qKgotICAqIFJldHVybnMgdGhlIHZlY3RvciBvZiBhbGwgbWVzc2FnZXMgZm91bmQKLSAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRNZXNzYWdlcyAoKQotICB7Ci0gIAlpZiAobWVzc2FnZXMgPT0gbnVsbCkgCi0gIAkJbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIG1lc3NhZ2VzOwotICB9Ci0KLSAgcHVibGljIFZlY3RvciBnZXRCZWFuc1Zpc2l0ZWQoKQotICAJewotCQlpZiAoIGJlYW5zVmlzaXRlZCA9PSBudWxsKQotICAJCQliZWFuc1Zpc2l0ZWQgPSBuZXcgVmVjdG9yKCk7IAotICAgICAgICByZXR1cm4gYmVhbnNWaXNpdGVkOwotICAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFZpc2l0ZWRCZWFuKCBKYXZhQ2xhc3MgYmVhbikKLSAgCXsKLSAgCQlpZiAoIGJlYW5zVmlzaXRlZCA9PSBudWxsKQotICAJCQliZWFuc1Zpc2l0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0gIAkJYmVhbnNWaXNpdGVkLmFkZChiZWFuKTsKLSAgCX0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0JlYW5WaXNpdGVkIChKYXZhQ2xhc3MgYmVhbikKLSAgCXsKLSAgCQlyZXR1cm4gKGJlYW5zVmlzaXRlZCAhPSBudWxsICYmIGJlYW5zVmlzaXRlZC5jb250YWlucyhiZWFuKSk7Ci0gIAl9Ci0KLSAgLyoqCi0gICogc2V0cyB0aGUgdmlzaXRvciB0aGF0IGNhbGxzIHRoZSB2aXNpdAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvcgotICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoVmlzaXRvciB2aXNpdG9yKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICBnZXRNZXNzYWdlcygpLmFkZChrZXkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgZ2V0TWVzc2FnZXMoKS5hZGQoTkxTLmJpbmQoa2V5LGFyZ3MpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMmQ2YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1vbi5TYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgYm9vbGVhbiByZXR1cm5QYXJhbWV0ZXI7Ci0gIHByaXZhdGUgSUVudmlyb25tZW50IGVudjsKLSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAl0aGlzLmVudiA9IGVudjsKLSAgfQotICAKLSAgLyoKLSAgKiBVc2UgdGhpcyB0byByZWZsZWN0IAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotCi0gICAvKgotICAqIFVzZSB0aGlzIHRvIHJlZmxlY3QgCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50UHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJldHVyblBhcmFtZXRlcihib29sZWFuIHJldHVyblBhcmFtZXRlcikKLSAgewotICAgIHRoaXMucmV0dXJuUGFyYW1ldGVyID0gcmV0dXJuUGFyYW1ldGVyOwotICB9Ci0gCi0gIAotICAvKgotICAqIEdldCB0aGUgYXR0cmlidXRlIGJlbG9uZ2luZyB0byB0aGlzIGNvbXBsZXggdHlwZSAKLSAgKiBAcGFyYW0gSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyIHRoYXQgb3ducyB0aGUgdHlwZQotICAqIEBwYXJhbSBWaXNpdG9yQWN0aW9uIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZWFjaCBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBJU3RhdHVzIHJ1biAoIE9iamVjdCBqYXZhY2xhc3MsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFjbGFzczsgICAgIAotCi0gICAgSGFzaHRhYmxlIHNwZE1hcCA9IG5ldyBIYXNodGFibGUoKTsgIAotICAgIGZvciAoSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7IG0uaGFzTmV4dCgpOyApIHsKLSAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgIGlmICgoKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgiZ2V0IikgCi0gICAgICAJfHwgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJpcyIpKSAKLSAgICAgICAgJiYgbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwICkKLSAgICAgICAgfHwgKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgic2V0IikgCi0gICAgICAgICYmIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPiAwKSkgewotICAgICAgICBpbnQgc3ViID0gMzsKLSAgICAgICAgaWYobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJpcyIpKQotICAgICAgICAgIHN1YiA9IDI7CQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdWJzdHJpbmcoc3ViKTsgICAgCi0gICAgICAgIFN0cmluZyBsb3dlciA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgcmVtYWluZGVyID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsgCi0gICAgICAgIHByb3BlcnR5TmFtZSA9IGxvd2VyICsgcmVtYWluZGVyOwotICAgICAgICBpbnQgaW5kZXggPSBwcm9wZXJ0eU5hbWUubGFzdEluZGV4T2YoIigiKTsKLSAgICAgICAgU3RyaW5nIHRlbXAgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9IHRlbXAuc3Vic3RyaW5nKDAsaW5kZXgpOyAKLSAgICAgICAgCi0gICAgICAgIC8vZmluZCB0aGUgcHJvcGVydHlkZXNjcmlwdG9yCi0gICAgICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBzcGQgPSAoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXNwZE1hcC5nZXQocHJvcGVydHlOYW1lKTsgCi0gICAgICAgIGlmKHNwZCA9PSBudWxsKXsKLSAgICAgICAgICBzcGQgPSBuZXcgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgc3BkTWFwLnB1dChwcm9wZXJ0eU5hbWUsc3BkKTsgCi0gICAgICAgIH0KLSAgICAgICAgaWYobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJzZXQiKSkKLSAgICAgICAgICBzcGQuc2V0V3JpdGVNZXRob2QobWV0aG9kKTsKLSAgICAgICAgZWxzZSAKLSAgICAgICAgICBzcGQuc2V0UmVhZE1ldGhvZChtZXRob2QpOwotCi0gICAgICAgIEZpZWxkIGZpZWxkID0gamF2YUNsYXNzLmdldEZpZWxkTmFtZWQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgcHJvcGVydHlUeXBlID0gbnVsbDsgCi0gICAgICAgIGlmKGZpZWxkICE9IG51bGwpewotICAgICAgICAgIHByb3BlcnR5VHlwZSA9IChKYXZhSGVscGVycylmaWVsZC5nZXRFVHlwZSgpOwotICAgICAgICAgIHNwZC5zZXRmU3RhdGljKGZpZWxkLmlzU3RhdGljKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgaWYobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJnZXQiKSB8fCBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLnN0YXJ0c1dpdGgoImlzIikpCi0gICAgICAgICAgCXByb3BlcnR5VHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICBKYXZhUGFyYW1ldGVyIHBhcmFtc1tdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOyAKLSAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBwYXJhbXNbMF0uZ2V0SmF2YVR5cGUoKTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfQotICAgICAgICAgIAkKLSAgICAgICAgc3BkLnNldFByb3BlcnR5VHlwZShwcm9wZXJ0eVR5cGUpOyAKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIEVudW1lcmF0aW9uIHNwZEVudW0gPSBzcGRNYXAuZWxlbWVudHMoKTsKLSAgICB3aGlsZShzcGRFbnVtLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBzcGQgPSAoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXNwZEVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmKHNwZENoZWNrKHNwZCkpCi0gICAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoc3BkKTsgICAKLSAgICB9IAotICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gc3BkQ2hlY2soU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHNwZCkKLSAgeyAgCi0gICAgLy9jaGVjayBmb3IgaW5kZXhlZCBwcm9wZXJ0aWVzCi0gIAlNZXRob2Qgd3JpdGVNZXRob2QgPSBzcGQuZ2V0V3JpdGVNZXRob2QoKTsKLSAgCWlmKHdyaXRlTWV0aG9kICE9IG51bGwpCi0gIAkgIGlmKHdyaXRlTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTsKLSAgCQotICAJaWYoc3BkLmdldFByb3BlcnR5VHlwZSgpID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBpZihzcGQuZ2V0UHJvcGVydHlUeXBlKCkuaXNQcmltaXRpdmUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYocmV0dXJuUGFyYW1ldGVyICYmIFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoc3BkLmdldFByb3BlcnR5VHlwZSgpKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYoIXJldHVyblBhcmFtZXRlciAmJiBUeXBlRmFjdG9yeS5pc1VuU3VwcG9ydGVkVHlwZShzcGQuZ2V0UHJvcGVydHlUeXBlKCkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZighY2hlY2tQb2xhcml0eShzcGQpKSByZXR1cm4gZmFsc2U7ICAgCi0gICAgICAgCi0gICAgLy8gc28gaXRzIGEgYmVhbiBtYWtlIHN1cmUgaXQgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciAgICAgICAKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICBqYXZhTW9mUmVmLnNldENsaWVudFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICBqYXZhTW9mUmVmLnNldFByb3h5QmVhbigoKEphdmFIZWxwZXJzKXNwZC5nZXRQcm9wZXJ0eVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICBqYXZhTW9mUmVmLnNldEVudmlyb25tZW50KCBlbnYgKTsKLSAgICBqYXZhTW9mUmVmLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0gICAgaWYoamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSBpbnN0YW5jZW9mIEphdmFDbGFzcyl7Ci0gICAgICAgaWYoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgcmV0dXJuIGRlZmF1bHRDaGVjaygoSmF2YUNsYXNzKWphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkpOwotICAgICAgICAgICAgICAgCi0gICAgfQotICAgIHJldHVybiB0cnVlOwotICAKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUG9sYXJpdHkoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHNwZCl7Ci0gICAgCi0gIAlNZXRob2QgcmVhZE1ldGhvZCA9IHNwZC5nZXRSZWFkTWV0aG9kKCk7Ci0gIAlNZXRob2Qgd3JpdGVNZXRob2QgPSBzcGQuZ2V0V3JpdGVNZXRob2QoKTsKLSAgCWlmKChyZWFkTWV0aG9kID09IG51bGwgJiYgd3JpdGVNZXRob2QgIT0gbnVsbCkgfHwgKHJlYWRNZXRob2QgIT0gbnVsbCAmJiB3cml0ZU1ldGhvZCA9PSBudWxsKSkKLSAgCSAgcmV0dXJuIHRydWU7CQotICAJaWYocmVhZE1ldGhvZCA9PSBudWxsICYmIHdyaXRlTWV0aG9kID09IG51bGwpCi0gIAkgIHJldHVybiBmYWxzZTsJCi0gIAkgIAkKLSAgCUphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gd3JpdGVNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgZm9yKGludCBpID0gMDtpPCBqYXZhUGFyYW1ldGVyLmxlbmd0aDtpKyspewotICAgICAgSmF2YVBhcmFtZXRlciBqcCA9IGphdmFQYXJhbWV0ZXJbaV07IAkKLSAgICAgIGpwLmdldEphdmFUeXBlKCkuZ2V0SmF2YU5hbWUoKTsKLSAgICAgIHJlYWRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCk7Ci0gICAgICBpZihqcC5nZXRKYXZhVHlwZSgpLmdldEphdmFOYW1lKCkuZXF1YWxzKHJlYWRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsgCi0gICAgfQotICAJcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdENoZWNrKEphdmFDbGFzcyBqYXZhQ2xhc3MpewotICAgIAotICAgICAgIEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpOwotICAgICAgICAvL25vdyBjaGVjayBmb3IgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgIGJvb2xlYW4gZGVmYXVsdENvbnN0ID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKG0uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgTWV0aG9kIG1ldGhvZD0oTWV0aG9kKW0ubmV4dCgpOwotICAgICAgICAgIGlmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgLy9ub3cgdGhlIGlucHV0cwotICAgICAgICAgICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotICAgICAgICAgICAgICAgIGlmIChqYXZhUGFyYW1ldGVyLmxlbmd0aCA+IDApewotICAgICAgICAgICAgICAgICAgICAgIC8vdGhlbiB3ZSBoYXZlIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29uc3QgPSBmYWxzZTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoamF2YVBhcmFtZXRlci5sZW5ndGggPT0gMCl7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAKLSAgICAgICByZXR1cm4gZGVmYXVsdENvbnN0OwotICB9Ci0gICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZCZWFuVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQmVhblZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1NzFmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZCZWFuVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci0KLQotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQmVhblZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkJlYW5WaXNpdG9yKCkKLSAgewotICB9Ci0gCi0gIHB1YmxpYyBJU3RhdHVzIHJ1biAoIE9iamVjdCBqYXZhQ2xhc3MsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAgIHJldHVybiB2QWN0aW9uLnZpc2l0KChKYXZhQ2xhc3MpamF2YUNsYXNzKTsgICAKLSAgfQotICAgICAgICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZGaWVsZFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZkZpZWxkVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjkzZGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZkZpZWxkVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZGaWVsZFZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLQotICAvKgotICAqIENvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkZpZWxkVmlzaXRvcigpCi0gIHsKLSAgfQotCi0gIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICAgLyoKLSAgKiBVc2UgdGhpcyB0byByZWZsZWN0IAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICAvKgotICAqIEdldCB0aGUgYXR0cmlidXRlIGJlbG9uZ2luZyB0byB0aGlzIGNvbXBsZXggdHlwZSAKLSAgKiBAcGFyYW0gSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyIHRoYXQgb3ducyB0aGUgdHlwZQotICAqIEBwYXJhbSBWaXNpdG9yQWN0aW9uIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZWFjaCBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBJU3RhdHVzIHJ1biAoIE9iamVjdCBqYXZhY2xhc3MsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFjbGFzczsgICAgIAotCi0gICAgYm9vbGVhbiBob2xkZXJDbGFzcyA9IGZhbHNlOwotICAgIEVMaXN0IGltcGxlbWVudGVkID0gamF2YUNsYXNzLmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnRlZC5zaXplKCk7IGkrKykgewotCSAgSmF2YUNsYXNzIGFuSW50ZXJmYWNlID0gKEphdmFDbGFzcykgaW1wbGVtZW50ZWQuZ2V0KGkpOwotCSAgaWYgKGFuSW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImphdmF4LnhtbC5ycGMuaG9sZGVycy5Ib2xkZXIiKSkKLQkgICAgaG9sZGVyQ2xhc3MgPSB0cnVlOwotCX0gICAgICAKLQotICAgICAvL2JlYW5pbmZvIGNvZGUKLSAgICBpZihob2xkZXJDbGFzcyl7ICAgICAKLSAgICAgIEVMaXN0IGUgID0gamF2YUNsYXNzLmdldEZpZWxkcygpOwotICAgICAgTGlzdEl0ZXJhdG9yIGxpc3QgPSBlLmxpc3RJdGVyYXRvcigpOwotICAgICAgd2hpbGUobGlzdC5oYXNOZXh0KCkpewotICAgICAgICBGaWVsZCBmaWVsZCA9IChGaWVsZClsaXN0Lm5leHQoKTsgICAgIAotICAgICAgICBpZihmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQyAmJiAhZmllbGQuaXNGaW5hbCgpICYmICFmaWVsZC5pc1N0YXRpYygpKXsKLSAgICAgICAgICBpZihmaWVsZENoZWNrKGZpZWxkKSkKLSAgICAgICAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoZmllbGQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gICAgICAgCi0gIHByaXZhdGUgYm9vbGVhbiBmaWVsZENoZWNrKEZpZWxkIGZpZWxkKQotICB7Ci0gICAgLy8gc28gaXRzIGEgYmVhbiBtYWtlIHN1cmUgaXQgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciAKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICBqYXZhTW9mUmVmLnNldFByb3h5QmVhbigoKEphdmFIZWxwZXJzKWZpZWxkLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgamF2YU1vZlJlZi5zZXRDbGllbnRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgamF2YU1vZlJlZi5leGVjdXRlKG51bGwsIG51bGwpOwotICAgIGlmKGphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpewotICAgICAgaWYoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpKSkgcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gZGVmYXVsdENoZWNrKChKYXZhQ2xhc3MpamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICAgICAgIAotIHByaXZhdGUgYm9vbGVhbiBkZWZhdWx0Q2hlY2soSmF2YUNsYXNzIGphdmFDbGFzcyl7Ci0gICAgCi0gICBJdGVyYXRvciBtPWphdmFDbGFzcy5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKTsKLSAgIC8vbm93IGNoZWNrIGZvciBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgIGJvb2xlYW4gZGVmYXVsdENvbnN0ID0gdHJ1ZTsKLSAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICBpZiAoamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpewotICAgICAgLy9ub3cgdGhlIGlucHV0cwotICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICBpZiAoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLSAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICBkZWZhdWx0Q29uc3QgPSBmYWxzZTsgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmKGphdmFQYXJhbWV0ZXIubGVuZ3RoID09IDApewotICAgICAgICBpZiAobWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSAwKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gMSkgCi0gICAgICAgICAgZGVmYXVsdENvbnN0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0gIHJldHVybiBkZWZhdWx0Q29uc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZk1ldGhvZFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZk1ldGhvZFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzN2M3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZNZXRob2RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZNZXRob2RWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHVibGljIFN0cmluZyBTRVRfRU5EUE9JTlQgPSAic2V0RW5kUG9pbnQiOwotICBwdWJsaWMgU3RyaW5nIEdFVF9FTkRQT0lOVCA9ICJnZXRFbmRQb2ludCI7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIGZNZXRob2RzU2VsZWN0ZWQ7Ci0KLQotICAvKgotICAqIENvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZk1ldGhvZFZpc2l0b3IoKQotICB7Ci0gIH0KLSAKLSAgcHVibGljIFN0cmluZyBVTkRFUl9TQ09SRSA9ICJfIjsKLQotICAvKgotICAqIFJ1biB0aHJvdWdoIGFsbCB0aGUgbWV0aG9kcyBpbiB0aGlzIGJlYW4KLSAgKiBAcGFyYW0gSmF2YUNsYXNzIGphdmFjbGFzcyB0aGF0IGhvbGRzIHRoZSBtZXRob2RzCi0gICogQHBhcmFtIFZpc2l0b3JBY3Rpb24gQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBlYWNoIG1ldGhvZAotICAqKi8KLSAgcHVibGljIElTdGF0dXMgcnVuICggT2JqZWN0IGphdmFjbGFzcywgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YWNsYXNzOwotICAgIGZvciAoSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7IG0uaGFzTmV4dCgpOyApIHsKLSAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgIGlmKGZNZXRob2RzU2VsZWN0ZWQgIT0gbnVsbCkgIHsKLSAgICAgICAgYm9vbGVhbiBtZXRob2RTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgCWZvcihpbnQgaSA9MDtpIDwgZk1ldGhvZHNTZWxlY3RlZC5sZW5ndGg7aSsrKXsKLSAgICAgICAgICBpZihmTWV0aG9kc1NlbGVjdGVkW2ldID09IG51bGwpIGNvbnRpbnVlOwotICAgICAgICAgIGlmICggZk1ldGhvZHNTZWxlY3RlZFtpXS5nZXRWYWx1ZSgpLmVxdWFscyhtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKSkKLSAgICAgICAgICAgIG1ldGhvZFNlbGVjdGVkID0gKGJvb2xlYW4pIGZNZXRob2RzU2VsZWN0ZWRbaV0uaXNTZWxlY3RlZCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgaWYobWV0aG9kU2VsZWN0ZWQpCi0gICAgICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChtZXRob2QpOyAgCi0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQobWV0aG9kKTsgICAKLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kU2VsZWN0aW9uKEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RTZWxlY3RlZCkKLSAgewotICAgIGZNZXRob2RzU2VsZWN0ZWQgPSBtZXRob2RTZWxlY3RlZDsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5N2MzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IgCi17Ci0gIHByaXZhdGUgSUVudmlyb25tZW50IGVudl87Ci0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yKElFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCWVudl8gPSBlbnY7Ci0gIH0KLSAgCi0gIC8qCi0gICogUnVuIHRocm91Z2ggYWxsIHRoZSBwYXJhbWV0ZXJzIGluIHRoaXMgbWV0aG9kCi0gICogQHBhcmFtIEphdmFDbGFzcyBqYXZhY2xhc3MgdGhhdCBob2xkcyB0aGUgcGFyYW1ldGVycwotICAqIEBwYXJhbSBWaXNpdG9yQWN0aW9uIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZWFjaCBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBJU3RhdHVzIHJ1biAoIE9iamVjdCBpbWV0aG9kLCBWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgCUNob2ljZSBPS0Nob2ljZSA9IG5ldyBDaG9pY2UoJ08nLCBDb25zdW1wdGlvbk1lc3NhZ2VzLkxBQkVMX09LLCBDb25zdW1wdGlvbk1lc3NhZ2VzLkRFU0NSSVBUSU9OX09LKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgQ29uc3VtcHRpb25NZXNzYWdlcy5MQUJFTF9DQU5DRUwsIENvbnN1bXB0aW9uTWVzc2FnZXMuREVTQ1JJUFRJT05fQ0FOQ0VMKTsgIAkKLSAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClpbWV0aG9kOwotICAgCi0gICAgSmF2YUhlbHBlcnMgamF2YVJldHVyblBhcmFtZXRlciA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgLy9wZ20gVGhpcyB2aXNpdG9yIHVzZWQgdG8gdGFrZSBhIEphdmFQYXJhbWV0ZXIgdHlwZSBhbmQgbm93IGl0IGlzIGJlaW5nIGNhbGxlZAotICAgIC8vICAgIHdpdGggYSBKYXZhSGVscGVycyB0eXBlLiAgR2lsLCBwbGVhc2UgZW5zdXJlIHRoYXQgdGhpcyBpcyBPay4KLSAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KGphdmFSZXR1cm5QYXJhbWV0ZXIpOwotICAgIC8vCi0gICAgaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgIAlyZXR1cm4gc3RhdHVzOwotICAgIAotICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgewotICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudl8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgIHsKLSAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAJICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCApOwotICAgICAgfQotICAgICAgCQotICAgIH0KLSAgICAvLyAgICAgICAgICAgCi0KLSAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgTGlzdCBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsgCi0gICAgCi0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpbmRleCsrKSAKLSAgICB7Ci0gICAgICBKYXZhUGFyYW1ldGVyIHBhcmFtPShKYXZhUGFyYW1ldGVyKXBhcmFtZXRlcnMuZ2V0KGluZGV4KTsKLSAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQocGFyYW0pOwotICAgICAgLy8KLSAgICAgIHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgIAotICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICAgIHsKLSAgICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudl8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgICB7Ci0gICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgIAkgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEICk7Ci0gICAgICAgIH0KLSAgICAgICAgCQotICAgICAgfQotICAgICAgLy8gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgfQotICAKLSAgICAgICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mVHlwZVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlR5cGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMWYyNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mVHlwZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1vbi5TYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZlR5cGVWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIElFbnZpcm9ubWVudCBlbnZfOwotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZUeXBlVmlzaXRvcihJRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAllbnZfID0gZW52OwotICB9Ci0KLSAgIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICAgLyoKLSAgKiBVc2UgdGhpcyB0byByZWZsZWN0IAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFByb2plY3Q7Ci0gIH0KLSAgCi0gIC8qCi0gICogR2V0IHRoZSB0eXBlIGJlbG9uZ2luZyB0byB0aGUgcGFyYW1ldGVyCi0gICogQHBhcmFtIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciB0aGF0IG93bnMgdGhlIHR5cGUKLSAgKiBAcGFyYW0gVmlzaXRvckFjdGlvbiBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGVhY2ggbWV0aG9kCi0gICoqLwotICBwdWJsaWMgSVN0YXR1cyBydW4gKCBPYmplY3QgdHlwZU5hdmlnYXRvciwgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgaWYgKHR5cGVOYXZpZ2F0b3IgaW5zdGFuY2VvZiBKYXZhUGFyYW1ldGVyKXsKLQotICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyID0gKEphdmFQYXJhbWV0ZXIpdHlwZU5hdmlnYXRvcjsKLSAgICAgIEphdmFIZWxwZXJzIGphdmFIZWxwZXJzID0gamF2YVBhcmFtZXRlci5nZXRKYXZhVHlwZSgpOwotICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChqYXZhSGVscGVycyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGVOYXZpZ2F0b3IgaW5zdGFuY2VvZiBKYXZhSGVscGVycyl7Ci0gICAgCXN0YXR1cyA9IHZBY3Rpb24udmlzaXQodHlwZU5hdmlnYXRvcik7CQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXsKLSAgICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IChTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpdHlwZU5hdmlnYXRvcjsKLSAgICAgIEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCBqYXZhTW9mUmVmID0gbmV3IEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCgpOwotICAgICAgamF2YU1vZlJlZi5zZXRDbGllbnRQcm9qZWN0KGNsaWVudFByb2plY3QpOwotICAgICAgamF2YU1vZlJlZi5zZXRQcm94eUJlYW4oKChKYXZhSGVscGVycylwZC5nZXRQcm9wZXJ0eVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0RW52aXJvbm1lbnQoIGVudl8gKTsKLSAgICAgIHN0YXR1cyA9IGphdmFNb2ZSZWYuZXhlY3V0ZSggbnVsbCwgbnVsbCApOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgIAotICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZU5hdmlnYXRvciBpbnN0YW5jZW9mIEZpZWxkKXsKLSAgICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKXR5cGVOYXZpZ2F0b3I7Ci0gICAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0UHJveHlCZWFuKCgoSmF2YUhlbHBlcnMpZmllbGQuZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0RW52aXJvbm1lbnQoIGVudl8gKTsKLSAgICAgCi0gICAgICBzdGF0dXMgPSBqYXZhTW9mUmVmLmV4ZWN1dGUoIG51bGwsIG51bGwgKTsKLSAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gICAgICAgIAotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9BYnN0cmFjdFN0YXJ0U2VydmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Fic3RyYWN0U3RhcnRTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkN2ZmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Fic3RyYWN0U3RhcnRTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnRTZXJ2ZXIgewotIAotcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLXByaXZhdGUgSUxvZyBsb2dfOwotCi1wdWJsaWMgQWJzdHJhY3RTdGFydFNlcnZlcigpCi17Ci0JbG9nXyA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlTG9nKCk7Ci19Ci0KLS8qKgotICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICovCi1wdWJsaWMgdm9pZCBTdGFydFNlcnZlciAoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlciBzZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiByZXN0YXJ0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotewotCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0KLSAgIHRyeQotICB7Ci0gICAJCi0vLyAgICBJSmF2YVNlcnZlciBqYXZhU2VydmVyID0gKElKYXZhU2VydmVyKSBzZXJ2ZXIuZ2V0RGVsZWdhdGUoKTsKLS8vICAgIGFkZEphcnNUb0NsYXNzUGF0aChqYXZhU2VydmVyKTsKLSAgICB2YWxpZGF0ZVJlbW90ZVNlcnZlclBhdGgoc2VydmVyKTsKLQotICAgIGlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpICAvLyBUaGUgU2VydmVyIGlzIHJ1bm5pbmcKLSAgICB7IAotICAgICAgaWYgKHNlcnZlci5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkKLSAgICAgIHsgICAgCi0gICAgICAJCi0gICAgICAgIHNlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOwotICAgICAgICBsb2dfLmxvZyhJTG9nLklORk8sIDUwNTAsIHRoaXMsICJTdGFydFNlcnZlciIsICJwcm9qZWN0PSIrcHJvamVjdCsiLCBTdG9wIGNvbW1hbmQgY29tcGxldGVkLCByZXN0YXJ0IG5lZWRlZCIpOwotICAgICAgICBwdWJsaXNoUHJvamVjdChzZXJ2ZXIpOwotICAgIAlzdGFydFByb2plY3Qoc2VydmVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgIAkKLSAgICAgICAgaWYgKHJlc3RhcnQpIC8vIFdFQi1JTkZcbGliIG5lZWQgdG8gYmUgcmVsb2FkZWQKLSAgICAgICAgewotICAgICAgICAgIHB1Ymxpc2hQcm9qZWN0KHNlcnZlcik7ICAgICAgCi0gICAgICAgICAgcmVzdGFydFByb2plY3QocHJvamVjdCwgc2VydmVyKTsKLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgIAkKLSAgICAJCXB1Ymxpc2hQcm9qZWN0KHNlcnZlcik7Ci0gICAgCQlzdGFydFByb2plY3Qoc2VydmVyKTsKLSAgICAJfQotfQotCi0gIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gIAl0aHJvdyBjZTsKLSAgCX0KLSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1NFUlZFUixlKSk7Ci0gIH0KLX0KLQotcHJvdGVjdGVkIHZvaWQgcHVibGlzaFByb2plY3QoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi17Ci0gICAgICBtb25pdG9yLnN1YlRhc2soIENvbnN1bXB0aW9uTWVzc2FnZXMuUFJPR1JFU1NfSU5GT19QVUJMSVNISU5HX1NFUlZFUiApOwotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG1vbml0b3IpOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spCi0gICAgICAJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLSAgICAgIGxvZ18ubG9nKElMb2cuSU5GTywgNTA1MSwgdGhpcywgInB1Ymxpc2hQcm9qZWN0IiwgIklTZXJ2ZXI9IitzZXJ2ZXIrIiwgUHVibGlzaCBjb21tYW5kIGNvbXBsZXRlZCIpOwotIH0KLQotcHJvdGVjdGVkIHZvaWQgc3RhcnRQcm9qZWN0KElTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotewotICB0cnkKLSAgewotICAgIG1vbml0b3Iuc3ViVGFzayggQ29uc3VtcHRpb25NZXNzYWdlcy5QUk9HUkVTU19JTkZPX1NUQVJUSU5HX1NFUlZFUiApOyAgICAKLSAgICBzZXJ2ZXIuc3luY2hyb25vdXNTdGFydChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbW9uaXRvcik7Ci0gICAgbG9nXy5sb2coSUxvZy5JTkZPLCA1MDUyLCB0aGlzLCAic3RhcnRQcm9qZWN0IiwgIklTZXJ2ZXI9IitzZXJ2ZXIrIiwgU3RhcnQgY29tbWFuZCBjb21wbGV0ZWQiKTsKLSAgICAKLSAgfQotICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0VSVkVSLGUpKTsKLSAgfSAgCi19Ci0KLXByb3RlY3RlZCB2b2lkIHJlc3RhcnRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotewotICAvL0RvIG5vdGhpbmcKLX0KLQotcHVibGljIHZvaWQgcnVuUHJlU2VydmVyQ29uZmlnKElTZXJ2ZXIgc2VydmVyLCBJUHJvamVjdCBFQVJQcm9qZWN0KXsKLQotCXJldHVybjsKLQkKLX0KLQotcHVibGljIHZvaWQgcnVuUG9zdFNlcnZlckNvbmZpZyhJU2VydmVyIHNlcnZlciwgSVByb2plY3QgRUFSUHJvamVjdCl7Ci0KLQlyZXR1cm47Ci19Ci0KLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkSmFyc1RvQ2xhc3NQYXRoKElTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlUmVtb3RlU2VydmVyUGF0aChJU2VydmVyIHNlcnZlcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCi0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCXNlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOwotCQl9Ci0JfQkKLQkKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9BZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjU3ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9BZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA5MjEgWzE1ODIxMF0ga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4sIENhbGxpbmcgaW5jcmVtZW50YWwgYnVpbGQgb24gdGhlIHByb2plY3QgYmVmb3JlIGFkZGluZyB0byBzZXJ2ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotcHVibGljIGNsYXNzIEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIAotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkOwotICBwcml2YXRlIFN0cmluZyBwcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBtb2R1bGU7Ci0JCi0JcHVibGljIEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCgpCi0JewotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLQl7Ci0gICAgICBJRW52aXJvbm1lbnQgZW52ID0gZ2V0RW52aXJvbm1lbnQoKTsKLSAgICAgIAotCSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CSAgICAKLQkgICAgCi0JICAgIElTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlckluc3RhbmNlSWQpOwotCSAgICBpZiAoc2VydmVyID09IG51bGwpCi0JICAgIHsKLQkgICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfSU5TVEFOQ0VfTk9UX0ZPVU5EICk7Ci0JICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICAgIH0KLQkgICAKLQkgICAgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcndjID0gbnVsbDsKLQkgICAgCi0JICAgIHRyeQotCSAgICB7Ci0JICAgIC8vRW5zdXJlIHRoZSBtb2R1bGUgaXMgbm90IGEgSmF2YSB1dGlsaXR5Ci0JICAgIElQcm9qZWN0IGlwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3QpOwotCSAgICBpZiAoIUoyRUVVdGlscy5pc0phdmFDb21wb25lbnQoaXByb2plY3QpKQotCSAgICB7ICAgICAgCi0JICAgIAlJTW9kdWxlIGltb2R1bGUgPSBTZXJ2ZXJVdGlscy5nZXRNb2R1bGUoaXByb2plY3QpOwotCSAgICAJLy8gVE9ETzogIFRoaXMgd29ya2Fyb3VuZCBmb3IgMTU2NzY4IHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlIGRlZmVjdCBpcyBmaXhlZAotCSAgICAJaWYgKGltb2R1bGUgPT0gbnVsbCkgewotCSAgICAJICAgIC8vIGNhbGxpbmcgaW5jcmVtZW50YWwgYnVpbGQgb24gdGhlIHByb2plY3QgYmVmb3JlIHRyeWluZyBhZ2FpbgotCSAgICAJCWlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsbnVsbCk7Ci0JICAgIAkJLy8gd2FpdCBmb3IgdGhlIGluY3JlbWVudGFsIGJ1aWxkIHRvIGNvbXBsZXRlIGJlZm9yZSB0cnlpbmcgYWdhaW4KLQkgICAgCQl0cnkgCi0JICAgIAkJewotCSAgICAJCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCSAgICAJCX0gCi0JICAgIAkJY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGV4YyApIAotCSAgICAJCXsKLQkgICAgCQkJLy8gQXNzdW1pbmcgdGhhdCB0aGUgYXV0b2J1aWxkZXIgaGFzIGFjdHVhbGx5IGNvbXBsZXRlZC4JCi0JICAgIAkJfQotCSAgICAJCWltb2R1bGUgPSBTZXJ2ZXJVdGlscy5nZXRNb2R1bGUoaXByb2plY3QpOwotCSAgICAJCWlmIChpbW9kdWxlID09IG51bGwpIHsgIAotCSAgICAJCQkvLyByZXR1cm4gZXJyb3IgaWYgbW9kdWxlIGlzIHN0aWxsIG51bGwgYWZ0ZXIgMSByZXRyeQotCSAgICAJCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfQUREX01PRFVMRSwgbmV3IFN0cmluZ1tde21vZHVsZX0pICk7Ci0JICAgIAkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkgICAgCQkJcmV0dXJuIHN0YXR1czsKLQkgICAgCQl9Ci0JICAgIAl9Ci0JICAgIAkvLyBlbmQgb2Ygd29ya2Fyb3VuZCBmb3IgMTU2NzY4Ci0JICAgIAkKLQkgICAgICBpZiAoIVNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLCBpbW9kdWxlLCBudWxsKSkKLQkgICAgICB7Ci0JICAgICAgICBJTW9kdWxlW10gaW1vZHVsZXMgPSBuZXcgSU1vZHVsZVtde2ltb2R1bGV9OwotCSAgICAgICAgc2VydmVyd2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkgICAgICAgIFNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyhzZXJ2ZXJ3YywgaW1vZHVsZXMsIG51bGwsIG51bGwpOwotCSAgICAgIH0KLQotCSAgICB9Ci0JICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkgICAgewotCSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9BRERfTU9EVUxFLCBuZXcgU3RyaW5nW117bW9kdWxlfSksIGUpOwotCSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkgICAgICByZXR1cm4gc3RhdHVzOyAgICAgIAotCSAgICB9IGZpbmFsbHkKLQkgICAgewotCSAgICAgIHRyeQotCSAgICAgIHsKLQkgICAgICAgIGlmIChzZXJ2ZXJ3YyAhPSBudWxsKQotCSAgICAgICAgewotCSAgICAgICAgICBzZXJ2ZXJ3Yy5zYXZlKHRydWUsIG51bGwpOwotCSAgICAgICAgfQotCSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0JICAgICAgewotCSAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX0FERF9NT0RVTEUsIG5ldyBTdHJpbmdbXSB7IG1vZHVsZSB9KSwgY2UpOwotCSAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQkgICAgICB9ICAgICAgCi0JICAgIH0KLQkgICAgCi0JCXJldHVybiBzdGF0dXM7Ci0JICAgIAotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGUoU3RyaW5nIG1vZHVsZSkKLQl7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIHByb2plY3QpCi0JewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0JewotCQl0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0JCi0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhYjhhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Fzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0XzsKLQlwcml2YXRlIFN0cmluZyBtb2R1bGVfOwotCXByaXZhdGUgU3RyaW5nIGVhclByb2plY3RfOwotCXByaXZhdGUgU3RyaW5nIGVhcl87Ci0JCi0KLSAgcHVibGljIEFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kKCl7Ci0KLSAgfQotICAKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLQl7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJSVByb2plY3QgbW9kdWxlUHJvamVjdCA9IG51bGw7Ci0JCUlQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotCi0JCS8vIGdldCBwcm9qZWN0cwotCQlpZiAocHJvamVjdF8hPW51bGwpCi0JCQltb2R1bGVQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3RfKTsKLQkJaWYgKGVhclByb2plY3RfIT1udWxsKQotCQkJZWFyUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlYXJQcm9qZWN0Xyk7Ci0JCQotCQkvLyBhc3NvY2lhdGUgbW9kdWxlcyBpZiBub3QgYWxyZWFkeSBhc3NvY2lhdGVkCi0JCWlmIChtb2R1bGVQcm9qZWN0IT1udWxsICYmIGVhclByb2plY3QhPW51bGwpIHsKLQkJCWlmICghSjJFRVV0aWxzLmlzQ29tcG9uZW50QXNzb2NpYXRlZChlYXJQcm9qZWN0LCBtb2R1bGVQcm9qZWN0KSkKLQkJCQlKMkVFVXRpbHMuYXNzb2NpYXRlQ29tcG9uZW50VG9FQVIobW9kdWxlUHJvamVjdCwgZWFyUHJvamVjdCk7Ci0JCX0KLQkJCi0JCS8vIGVuc3VyZSBtb2R1bGVzIGFyZSBhc3NvY2lhdGVkIG90aGVyd2lzZSByZXBvcnQgZXJyb3IKLQkJaWYgKCFKMkVFVXRpbHMuaXNDb21wb25lbnRBc3NvY2lhdGVkKGVhclByb2plY3QsIG1vZHVsZVByb2plY3QpKXsKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9VTkFCTEVfVE9fQVNTT0NJQVRFLCBuZXcgU3RyaW5nW117bW9kdWxlXywgZWFyX30pICk7Ci0JCQlpZiAoZW52IT1udWxsKQotCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICAgIHJldHVybiBzdGF0dXM7IAotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdCggU3RyaW5nIHByb2plY3QgKQotICB7Ci0JICBwcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0KLQkgIAotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotICB7Ci0JICBtb2R1bGVfID0gbW9kdWxlOwotICB9CQotCQotICBwdWJsaWMgdm9pZCBzZXRFQVJQcm9qZWN0KCBTdHJpbmcgZWFyUHJvamVjdCApCi0gIHsKLQkgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyKCBTdHJpbmcgZWFyICkKLSAgewotCSAgZWFyXyA9IGVhcjsgIAotICB9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9CdWlsZFByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0J1aWxkUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjNmZmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0J1aWxkUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBCdWlsZFByb2plY3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIHByaXZhdGUgVmFsaWRhdGlvbk1hbmFnZXIgdmFsaWRhdGlvbk1hbmFnZXI7Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZUJ1aWxkXzsKLSAgLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SOwotICAgKi8KLSAgcHVibGljIEJ1aWxkUHJvamVjdENvbW1hbmQoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoZm9yY2VCdWlsZF8pCi0gICAgICAgIHByb2plY3RfLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgZWxzZSBpZiAodmFsaWRhdGlvbk1hbmFnZXIgPT0gbnVsbCkKLSAgICAgICAgcHJvamVjdF8uYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBlbHNlIGlmICh2YWxpZGF0aW9uTWFuYWdlci5nZXRXb3Jrc3BhY2VBdXRvQnVpbGRQcmVmZXJlbmNlKCkpCi0gICAgICAgIHByb2plY3RfLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAgIAotICAgIH0KLSAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgewotICAgICAgLy8gY29udGludWUgZXhlY3V0aW9uCi0gICAgfQotICAgIGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpCi0gICAgewotICAgICAgLy8gY29udGludWUgZXhlY3V0aW9uCi0gICAgfQotICAgIAotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gZm9yY2VCdWlsZCBUaGUgZm9yY2VCdWlsZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGb3JjZUJ1aWxkKGJvb2xlYW4gZm9yY2VCdWlsZCkgewotICAgIHRoaXMuZm9yY2VCdWlsZF8gPSBmb3JjZUJ1aWxkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgIHRoaXMucHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB2YWxpZGF0aW9uTWFuYWdlciBUaGUgdmFsaWRhdGlvbk1hbmFnZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk1hbmFnZXIoVmFsaWRhdGlvbk1hbmFnZXIgdmFsaWRhdGlvbk1hbmFnZXIpIHsKLSAgICB0aGlzLnZhbGlkYXRpb25NYW5hZ2VyID0gdmFsaWRhdGlvbk1hbmFnZXI7Ci0gIH0KLQotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DaGVja1Byb2plY3RPS0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ2hlY2tQcm9qZWN0T0tDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Mjc0YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DaGVja1Byb2plY3RPS0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBDaGVja1Byb2plY3RPS0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLQotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlkXzsKLQotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDaGVja1Byb2plY3RPS0NvbW1hbmQoKSB7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgeyAKLSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCi0gICAgU3RyaW5nIHR5cGVpZCA9IHNlcnZpY2VTZXJ2ZXJUeXBlSWRfOwotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0vLyAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcnMuaXRlcmF0b3IoKTsKLSAgICBib29sZWFuIHZpZXdPcGVuID0gZmFsc2U7Ci0gICAgU3RyaW5nIHNlcnZlck5hbWUgPSBudWxsOwotCi0gICAgZm9yIChpbnQgaT0wO2k8c2VydmVycy5sZW5ndGg7aSsrKSB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBzZXJ2ZXJzW2ldOwotCi0gICAgICAvLyBJZiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgaXMgb3BlbiBmb3IgdGhlIHNlcnZlciB0aGF0IHdlIGFyZQotICAgICAgLy8gZGVwbG95aW5nCi0gICAgICAvLyB0byB3ZSB3aWxsIHByb21wdCB0aGUgdXNlciB0byBjbG9zZSBpdC4KLSAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkuZXF1YWxzKHR5cGVpZCkpIHsKLSAgICAgICAgdmlld09wZW4gPSB0cnVlOwotICAgICAgICBzZXJ2ZXJOYW1lID0gc2VydmVyLmdldE5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZpZXdPcGVuKSB7Ci0gICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0VSVkVSX1ZJRVdfT1BFTiwgbmV3IFN0cmluZ1tdIHsgc2VydmVyTmFtZX0pOwotICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBlcnJvck1lc3NhZ2UgKTsKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2aWNlU2VydmVySWQKLSAgICogICAgICAgICAgICBUaGUgc2VydmljZVNlcnZlciBmYWN0b3J5IElkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJZCkgewotICAgIHRoaXMuc2VydmljZVNlcnZlclR5cGVJZF8gPSBzZXJ2aWNlU2VydmVySWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db21wdXRlRW5kcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOWEzZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db21wdXRlRW5kcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIENvbXB1dGVFbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIEJvb2xlYW4gbW9uaXRvclNlcnZpY2U7Ci0gIHByaXZhdGUgSW50ZWdlciBtb25pdG9yZWRQb3J0OwotCi0gIHB1YmxpYyBDb21wdXRlRW5kcG9pbnRDb21tYW5kKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtb25pdG9yZWRQb3J0IFRoZSBtb25pdG9yZWRQb3J0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JlZFBvcnQoSW50ZWdlciBtb25pdG9yZWRQb3J0KQotICB7Ci0gICAgdGhpcy5tb25pdG9yZWRQb3J0ID0gbW9uaXRvcmVkUG9ydDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIG1vbml0b3JTZXJ2aWNlIFRoZSBtb25pdG9yU2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShCb29sZWFuIG1vbml0b3JTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5tb25pdG9yU2VydmljZSA9IG1vbml0b3JTZXJ2aWNlOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFVSSSBUaGUgd3NkbFVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludCgpCi0gIHsKLSAgICBpZiAobW9uaXRvclNlcnZpY2UgIT0gbnVsbCAmJiBtb25pdG9yU2VydmljZS5ib29sZWFuVmFsdWUoKSAmJiBtb25pdG9yZWRQb3J0ICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKTsKLSAgICAgIGlmIChkZWYgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGRlZi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlpdC5uZXh0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpaXQyLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdDMuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0My5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9ICgoU09BUEFkZHJlc3MpZXh0KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIG1vbml0b3JlZFBvcnQuaW50VmFsdWUoKSwgdXJsLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW50IHByb3RvY29sSW5kZXggPSBsb2NhdGlvbi5pbmRleE9mKCI6Ly8iKTsKLSAgICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbEluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSBsb2NhdGlvbi5zdWJzdHJpbmcoMCwgcHJvdG9jb2xJbmRleCszKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhvc3RQb3J0SW5kZXggPSBsb2NhdGlvbi5pbmRleE9mKCcvJywgcHJvdG9jb2xJbmRleCszKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChob3N0UG9ydEluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaG9zdFBvcnRJbmRleCA9IGxvY2F0aW9uLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGxvY2F0aW9uLnN1YnN0cmluZyhob3N0UG9ydEluZGV4LCBsb2NhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0UG9ydCA9IGxvY2F0aW9uLnN1YnN0cmluZyhwcm90b2NvbEluZGV4KzMsIGhvc3RQb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaG9zdEluZGV4ID0gaG9zdFBvcnQuaW5kZXhPZignOicpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RJbmRleCAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICBob3N0ID0gaG9zdFBvcnQuc3Vic3RyaW5nKDAsIGhvc3RJbmRleCsxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBob3N0UG9ydCArICc6JzsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1BvcnQgPSBTdHJpbmcudmFsdWVPZihtb25pdG9yZWRQb3J0LmludFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZW5kcG9pbnQgPSBuZXcgU3RyaW5nQnVmZmVyKHByb3RvY29sKTsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuYXBwZW5kKGhvc3QpOwotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludC5hcHBlbmQobmV3UG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LmFwcGVuZChmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvbXB1dGVQcm94eUVuZHBvaW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db21wdXRlUHJveHlFbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwMTRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvbXB1dGVQcm94eUVuZHBvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDcyOCAgIDE0NTQyNiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb21wdXRlUHJveHlFbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIEJvb2xlYW4gbW9uaXRvclNlcnZpY2U7Ci0gIHByaXZhdGUgSW50ZWdlciBtb25pdG9yZWRQb3J0OwotICBwcml2YXRlIFN0cmluZyBwcm94eUVuZHBvaW50OwotICBwcml2YXRlIFN0cmluZyBlbmRwb2ludDsKLQotICBwdWJsaWMgQ29tcHV0ZVByb3h5RW5kcG9pbnRDb21tYW5kKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtb25pdG9yZWRQb3J0IFRoZSBtb25pdG9yZWRQb3J0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JlZFBvcnQoSW50ZWdlciBtb25pdG9yZWRQb3J0KQotICB7Ci0gICAgdGhpcy5tb25pdG9yZWRQb3J0ID0gbW9uaXRvcmVkUG9ydDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIG1vbml0b3JTZXJ2aWNlIFRoZSBtb25pdG9yU2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShCb29sZWFuIG1vbml0b3JTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5tb25pdG9yU2VydmljZSA9IG1vbml0b3JTZXJ2aWNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50KCkKLSAgewotICAJaWYgKG1vbml0b3JTZXJ2aWNlICE9IG51bGwgJiYgbW9uaXRvclNlcnZpY2UuYm9vbGVhblZhbHVlKCkgJiYgbW9uaXRvcmVkUG9ydCAhPSBudWxsKQotICAJewotICAJCS8vIFVzZSB0aGUgZW5kcG9pbnQgdGhhdCBtYXRjaGVzIHdpdGggdGhlIHByb3h5IHRoZSBleHRlbnNpb24gcGFzc2VzIHRvIHVzIGlmIGl0IGlzIHNldAotICAJCWlmIChwcm94eUVuZHBvaW50ICE9IG51bGwpIHsKLSAgCQkJU3RyaW5nIGxvY2F0aW9uID0gcHJveHlFbmRwb2ludDsKLSAgCQkJdHJ5Ci0JCQl7Ci0gIAkJCQlVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gIAkJCQl1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCBtb25pdG9yZWRQb3J0LmludFZhbHVlKCksIHVybC5nZXRGaWxlKCkpOwotICAJCQkJcmV0dXJuIHVybC50b1N0cmluZygpOwotCQkJfQotICAJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotCQkJewotICAJCQkJaW50IHByb3RvY29sSW5kZXggPSBsb2NhdGlvbi5pbmRleE9mKCI6Ly8iKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xJbmRleCAhPSAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSBsb2NhdGlvbi5zdWJzdHJpbmcoMCwgcHJvdG9jb2xJbmRleCszKTsKLSAgICAgICAgICAgICAgICAgIGludCBob3N0UG9ydEluZGV4ID0gbG9jYXRpb24uaW5kZXhPZignLycsIHByb3RvY29sSW5kZXgrMyk7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZTsKLSAgICAgICAgICAgICAgICAgIGlmIChob3N0UG9ydEluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBob3N0UG9ydEluZGV4ID0gbG9jYXRpb24ubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGUgPSAiIjsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGxvY2F0aW9uLnN1YnN0cmluZyhob3N0UG9ydEluZGV4LCBsb2NhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdFBvcnQgPSBsb2NhdGlvbi5zdWJzdHJpbmcocHJvdG9jb2xJbmRleCszLCBob3N0UG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgIGludCBob3N0SW5kZXggPSBob3N0UG9ydC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdDsKLSAgICAgICAgICAgICAgICAgIGlmIChob3N0SW5kZXggIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIGhvc3QgPSBob3N0UG9ydC5zdWJzdHJpbmcoMCwgaG9zdEluZGV4KzEpOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBob3N0ID0gaG9zdFBvcnQgKyAnOic7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UG9ydCA9IFN0cmluZy52YWx1ZU9mKG1vbml0b3JlZFBvcnQuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZW5kcG9pbnQgPSBuZXcgU3RyaW5nQnVmZmVyKHByb3RvY29sKTsKLSAgICAgICAgICAgICAgICAgIGVuZHBvaW50LmFwcGVuZChob3N0KTsKLSAgICAgICAgICAgICAgICAgIGVuZHBvaW50LmFwcGVuZChuZXdQb3J0KTsKLSAgICAgICAgICAgICAgICAgIGVuZHBvaW50LmFwcGVuZChmaWxlKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRwb2ludC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLQkJCX0KLSAgCQl9IGVsc2UgewotICAJCQlyZXR1cm4gZW5kcG9pbnQ7Ci0gIAkJfQotICAJfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBwcm94eUVuZHBvaW50IFRoZSBwcm94eUVuZHBvaW50IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5RW5kcG9pbnQoU3RyaW5nIHByb3h5RW5kcG9pbnQpIHsKLSAgCXRoaXMucHJveHlFbmRwb2ludCA9IHByb3h5RW5kcG9pbnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgZW5kcG9pbnQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50KSB7Ci0gIAl0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29weVdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvcHlXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM0OTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29weVdTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYxMjEzICAgMTY1NzIzIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MTIxMyAgIDE2NTcyNSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuTmV0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ai5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb3B5V1NETENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvblVSSTsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZjsKLSAgcHJpdmF0ZSBWZWN0b3IgaWdub3JlTGlzdDsKLQotICBwdWJsaWMgQ29weVdTRExDb21tYW5kKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgQ29weVdTRExSdW5uYWJsZSBjb3B5V1NETFJ1bm5hYmxlID0gbmV3IENvcHlXU0RMUnVubmFibGUoZW52KTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZSgpLnJ1bihjb3B5V1NETFJ1bm5hYmxlLCBudWxsKTsKLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgIAotICBwcml2YXRlIGNsYXNzIENvcHlXU0RMUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUgewotICAJCi0gIAlwcml2YXRlIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IG51bGw7Ci0gIAkKLSAgCXByb3RlY3RlZCBDb3B5V1NETFJ1bm5hYmxlKElFbnZpcm9ubWVudCBlbnYpewotICAJCWVudmlyb25tZW50ID0gZW52OwotICAJfQotICAJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgCQlpZ25vcmVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAJCWlmIChkZWYgPT0gbnVsbCkKLSAgCQkJZGVmID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0gIAkJdHJ5IHsKLSAgCQkJY29weVdTREwoZW52aXJvbm1lbnQsIHdzZGxVUkksIGdldEJhc2VVUkkoZGVzdGluYXRpb25VUkkpLCBnZXRMb2NhbG5hbWUoZGVzdGluYXRpb25VUkkpLCBkZWYpOwotICAJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gIAkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9DT1BZX1dTREwsIG5ldyBTdHJpbmdbXXt3c2RsVVJJLCBkZXN0aW5hdGlvblVSSX0pLCBlKSk7Ci0gIAkJfQotICAJfQotICB9Ci0gIHByaXZhdGUgdm9pZCBjb3B5V1NETChJRW52aXJvbm1lbnQgZW52LCBTdHJpbmcgdXJpLCBTdHJpbmcgZGVzdFVSSSwgU3RyaW5nIGRlc3RMb2NhbG5hbWUpIHRocm93cyBXU0RMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFVSSUV4Y2VwdGlvbgotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb247Ci0JCi0JdHJ5IHsKLQkJZGVmaW5pdGlvbiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uVmVyYm9zZSh1cmkpOwotCQljb3B5V1NETChlbnYsIHVyaSwgZGVzdFVSSSwgZGVzdExvY2FsbmFtZSwgZGVmaW5pdGlvbik7CQotCX0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotCQljb3B5WE1MU2NoZW1hKGVudiwgdXJpLCBkZXN0VVJJKTsKLQl9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weVdTREwoSUVudmlyb25tZW50IGVudiwgU3RyaW5nIHVyaSwgU3RyaW5nIGRlc3RVUkksIFN0cmluZyBkZXN0TG9jYWxuYW1lLCBEZWZpbml0aW9uIGRlZmluaXRpb24pIHRocm93cyBXU0RMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFVSSUV4Y2VwdGlvbgotICB7Ci0JdXJpID0gbm9ybWFsaXplKHVyaSk7Ci0JaWYgKCFuZWVkVG9Db3B5KHVyaSkpIHsKLQkgICAJcmV0dXJuOwotCX0KLQlkZXN0VVJJID0gbm9ybWFsaXplKGRlc3RVUkkpOwotICAgIFN0cmluZyBiYXNlVVJJID0gZ2V0QmFzZVVSSSh1cmkpOwotICAgIGlmIChkZXN0TG9jYWxuYW1lID09IG51bGwgfHwgZGVzdExvY2FsbmFtZS5sZW5ndGgoKSA8PSAwKQotICAgICAgZGVzdExvY2FsbmFtZSA9IGdldExvY2FsbmFtZSh1cmkpOwotICAgIAotICAgIC8vIGNvcHkgV1NETAotICAgIFN0cmluZ0J1ZmZlciBkZXN0aW5hdGlvbkZpbGVVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKGFkZFRyYWlsaW5nU2VwYXJhdG9yKGRlc3RVUkkpKTsKLSAgICBkZXN0aW5hdGlvbkZpbGVVUkkuYXBwZW5kKGRlc3RMb2NhbG5hbWUpOwotICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gbmV3IFdTRExGYWN0b3J5SW1wbCgpOwotICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExXcml0ZXIoKTsKLSAgICBPdXRwdXRTdHJlYW0gb3MgPSBlbnYuZ2V0VVJJRmFjdG9yeSgpLm5ld1VSSShkZXN0aW5hdGlvbkZpbGVVUkkudG9TdHJpbmcoKSkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgd3NkbFdyaXRlci53cml0ZVdTREwoZGVmaW5pdGlvbiwgb3MpOwotICAgIG9zLmNsb3NlKCk7Ci0gICAgLy8gY29weSA8d3NkbDppbXBvcnQ+cwotICAgIE1hcCBpbXBvcnRzID0gZGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGltcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSAoTGlzdClpdC5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGxpc3RJdCA9IGxpc3QuaXRlcmF0b3IoKTsgbGlzdEl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEltcG9ydCB3c2RsSW1wb3J0ID0gKEltcG9ydClsaXN0SXQubmV4dCgpOwotICAgICAgICBTdHJpbmcgd3NkbEltcG9ydFVSSSA9IHdzZGxJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgaWYgKGlzUmVsYXRpdmUod3NkbEltcG9ydFVSSSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgaW1wb3J0QmFzZVVSSSA9IChuZXcgU3RyaW5nQnVmZmVyKGJhc2VVUkkpKS5hcHBlbmQod3NkbEltcG9ydFVSSSkudG9TdHJpbmcoKTsKLSAgICAgICAgICBTdHJpbmcgd3NkbEltcG9ydEJhc2VVUkkgPSBnZXRCYXNlVVJJKHdzZGxJbXBvcnRVUkkpOwotICAgICAgICAgIFN0cmluZ0J1ZmZlciBpbXBvcnREZXN0VVJJID0gbmV3IFN0cmluZ0J1ZmZlcihkZXN0VVJJKTsKLSAgICAgICAgICBpZiAod3NkbEltcG9ydEJhc2VVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgIGltcG9ydERlc3RVUkkuYXBwZW5kKHdzZGxJbXBvcnRCYXNlVVJJKTsKLSAgICAgICAgICBjb3B5V1NETChlbnYsIGltcG9ydEJhc2VVUkksIGltcG9ydERlc3RVUkkudG9TdHJpbmcoKSwgZ2V0TG9jYWxuYW1lKHdzZGxJbXBvcnRVUkkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHNjaGVtYXMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzY2hlbWFzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXQubmV4dCgpOwotICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBzY2hlbWFFbGVtZW50ID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtZW50OwotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuY3JlYXRlU2NoZW1hKHNjaGVtYUVsZW1lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgaW50byBhCi0gICAgICAgICAgICAvLyBYU0RTY2hlbWEgaW5zdGFuY2UKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29weVhNTFNjaGVtYShlbnYsIHhzZFNjaGVtYSwgYmFzZVVSSSwgZGVzdFVSSSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBzY2hlbWFFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbClleHRFbGVtZW50OwotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuY3JlYXRlU2NoZW1hKHNjaGVtYUVsZW1lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgaW50byBhCi0gICAgICAgICAgICAvLyBYU0RTY2hlbWEgaW5zdGFuY2UKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29weVhNTFNjaGVtYShlbnYsIHhzZFNjaGVtYSwgYmFzZVVSSSwgZGVzdFVSSSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRCYXNlVVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignXFwnKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICByZXR1cm4gdXJpLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYWxuYW1lKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignXFwnKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICByZXR1cm4gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiB1cmk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBhZGRUcmFpbGluZ1NlcGFyYXRvcihTdHJpbmcgcykKLSAgewotICAgIGlmICghKHMuZW5kc1dpdGgoIi8iKSB8fCBzLmVuZHNXaXRoKCJcXCIpKSkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHMpOwotICAgICAgc2IuYXBwZW5kKCcvJyk7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHM7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNSZWxhdGl2ZShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuICh1cmkuaW5kZXhPZignOicpID09IC0xKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5WE1MU2NoZW1hKElFbnZpcm9ubWVudCBlbnYsIFN0cmluZyB1cmksIFN0cmluZyBkZXN0VVJJKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFVSSUV4Y2VwdGlvbgotICB7Ci0JICB1cmkgPSBub3JtYWxpemUodXJpKTsKLQkgIGlmICghbmVlZFRvQ29weSh1cmkpKSB7Ci0JICAgIAlyZXR1cm47Ci0JICAgIH0KLQkgIGRlc3RVUkkgPSBub3JtYWxpemUoZGVzdFVSSSk7Ci0gICAgLy8gbG9hZCBhcyBhIGNhY2hlZCBzY2hlbWEKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEodXJpKTsKLSAgICAvLyBpZiBzY2hlbWEgaXMgbm90IGNhY2hlZCwgcGFyc2UgaXQKLSAgICBpZiAoeHNkU2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgWFNEUGFyc2VyIHAgPSBuZXcgWFNEUGFyc2VyKCk7Ci0gICAgICBJbnB1dFN0cmVhbSBpcyA9IE5ldFV0aWxzLmdldFVSTElucHV0U3RyZWFtKHVyaSk7Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcC5wYXJzZShpcyk7Ci0gICAgICAgIHhzZFNjaGVtYSA9IHAuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBjb3B5IHNjaGVtYQotICAgICAgRWxlbWVudCBlID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIERPTVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGUpOwotICAgICAgVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOwotICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiMiIpOwotICAgICAgT3V0cHV0U3RyZWFtIG9zID0gZW52LmdldFVSSUZhY3RvcnkoKS5uZXdVUkkoKG5ldyBTdHJpbmdCdWZmZXIoZGVzdFVSSSkpLmFwcGVuZChnZXRMb2NhbG5hbWUodXJpKSkudG9TdHJpbmcoKSkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3MpKTsKLSAgICAgIG9zLmNsb3NlKCk7Ci0gICAgICAvLyBjb3B5IDx4c2Q6aW1wb3J0PnMgYW5kIDx4c2Q6aW5jbHVkZT5zCi0gICAgICBjb3B5WE1MU2NoZW1hKGVudiwgeHNkU2NoZW1hLCBnZXRCYXNlVVJJKHVyaSksIGRlc3RVUkkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5WE1MU2NoZW1hKElFbnZpcm9ubWVudCBlbnYsIFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBiYXNlVVJJLCBTdHJpbmcgZGVzdFVSSSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBVUklFeGNlcHRpb24KLSAgewotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBjb3B5IDx4c2Q6aW1wb3J0PnMgYW5kIDx4c2Q6aW5jbHVkZT5zCi0gICAgICBFTGlzdCB4c2RTY2hlbWFDb250ZW50cyA9IHhzZFNjaGVtYS5nZXRDb250ZW50cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHhzZFNjaGVtYUNvbnRlbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBjb250ZW50ID0gaXQubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSB4c2RTY2hlbWFEaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKWNvbnRlbnQ7Ci0gICAgICAgICAgU3RyaW5nIHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uID0geHNkU2NoZW1hRGlyZWN0aXZlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgICAgICAgaWYgKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uICE9IG51bGwgJiYgaXNSZWxhdGl2ZSh4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbikpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdGl2ZVVSSSA9IChuZXcgU3RyaW5nQnVmZmVyKGJhc2VVUkkpKS5hcHBlbmQoeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24pLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZGlyZWN0aXZlQmFzZVVSSSA9IGdldEJhc2VVUkkoeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24pOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGRpcmVjdGl2ZURlc3RVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKGRlc3RVUkkpOwotICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZUJhc2VVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgZGlyZWN0aXZlRGVzdFVSSS5hcHBlbmQoZGlyZWN0aXZlQmFzZVVSSSk7Ci0gICAgICAgICAgICBjb3B5WE1MU2NoZW1hKGVudiwgZGlyZWN0aXZlVVJJLCBkaXJlY3RpdmVEZXN0VVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9Db3B5IChTdHJpbmcgbm9ybWFsaXplZFVSSSkgewkKLQkgIGlmIChpZ25vcmVMaXN0LmNvbnRhaW5zKG5vcm1hbGl6ZWRVUkkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgIGlnbm9yZUxpc3QuYWRkKG5vcm1hbGl6ZWRVUkkpOwotCSAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0vL25vcm1hbGl6ZSB0aGUgdXJpIHRvIHJlbW92ZSByZWxhdGl2ZSBhZGRyZXNzaW5nICIvLi4iCi0gIHByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgdXJpICkKLSAgewotICAJYm9vbGVhbiBub3JtYWxpemVkID0gZmFsc2U7Ci0gIAl3aGlsZSghbm9ybWFsaXplZCl7Ci0gIAkgIGludCBkaXIgPSB1cmkuaW5kZXhPZigiLy4uIik7Ci0gIAkgIGlmKGRpciA9PSAtMSkKLSAgCSAgCW5vcm1hbGl6ZWQgPSB0cnVlOwotICAJICBlbHNlewotICAJICAJU3RyaW5nIGZpcnN0ID0gdXJpLnN1YnN0cmluZygwLGRpcik7Ci0gIAkgICAgU3RyaW5nIHNlY29uZCA9IHVyaS5zdWJzdHJpbmcoZGlyICsgMyk7Ci0gIAkgICAgaW50IG5ld0luZGV4ID0gZmlyc3QubGFzdEluZGV4T2YoIi8iKTsKLSAgCSAgICBpZihuZXdJbmRleCA9PSAtMSl7Ci0gIAkgICAgCW5vcm1hbGl6ZWQgPSB0cnVlOwotICAJICAgIH0gZWxzZSB7Ci0gIAkgICAgCWZpcnN0ID0gZmlyc3Quc3Vic3RyaW5nKDAsbmV3SW5kZXgpOwotICAJICAgIAl1cmkgPSBmaXJzdCArIHNlY29uZDsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCX0KLSAgCXJldHVybiB1cmk7Ci0gIAotICB9Ci0JICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uVVJJKFN0cmluZyBkZXN0aW5hdGlvblVSSSkKLSAgewotICAgIHRoaXMuZGVzdGluYXRpb25VUkkgPSBkZXN0aW5hdGlvblVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICB0aGlzLmRlZiA9IGRlZjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db3B5V1NETFRyZWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvcHlXU0RMVHJlZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1ZTQ0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvcHlXU0RMVHJlZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTIgICAxNjU3MjEgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFdTREwgaW1wb3J0IGNhbm5vdCB1c2UgcmVsYXRpdmUgaW1wb3J0IHdpdGggdG8gcGFyZW50IGRpcmVjdG9yaWVzCi0gKiAyMDA3MDMwOCAgIDE3NjY0OSBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgQ29weVdTRExUcmVlQ29tbWFuZCBkb2VzIG5vdCBoYW5kbGUgIlwiIGNvcnJlY3RseSBpbiBhbiBhYnNvbHV0ZSB3c2RsIFVSTAotICogMjAwNzAzMjYgICAxNzkzMzcgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFJlZ2VuIHdlYiBzZXJ2aWNlIHNrZWxldG9uIHJlLWNvcGllcyB3c2RsIGFuZCB4c2Qgb250byB0aGVtc2VsdmVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuTmV0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ai5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb3B5V1NETFRyZWVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb25VUkk7Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWY7Ci0gIHByaXZhdGUgVmVjdG9yIGlnbm9yZUxpc3Q7Ci0KLSAgcHJpdmF0ZSBJUGF0aCBwYXRoUHJlZml4OyAgCi0gIHByaXZhdGUgU3RyaW5nIHdzZGxSZWxQYXRoOwotICBwcml2YXRlIFZlY3RvciB4bWxPYmplY3RJbmZvczsKLSAgCi0gIHB1YmxpYyBDb3B5V1NETFRyZWVDb21tYW5kKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgQ29weVdTRExSdW5uYWJsZSBjb3B5V1NETFJ1bm5hYmxlID0gbmV3IENvcHlXU0RMUnVubmFibGUoZW52KTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZSgpLnJ1bihjb3B5V1NETFJ1bm5hYmxlLCBudWxsKTsKLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgIAotICBwcml2YXRlIGNsYXNzIENvcHlXU0RMUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUgewotICAJCi0gIAlwcml2YXRlIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IG51bGw7Ci0gIAkKLSAgCXByb3RlY3RlZCBDb3B5V1NETFJ1bm5hYmxlKElFbnZpcm9ubWVudCBlbnYpewotICAJCWVudmlyb25tZW50ID0gZW52OwotICAJfQotICAJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgCQlpZ25vcmVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAJCXhtbE9iamVjdEluZm9zID0gbmV3IFZlY3RvcigpOwotICAJCWlmIChkZWYgPT0gbnVsbCkKLSAgCQkJZGVmID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0gIAkJdHJ5IHsKLSAgCQkJU3RyaW5nIGJhc2VEZXN0aW5hdGlvblVSSSA9IGdldEJhc2VVUkkoZGVzdGluYXRpb25VUkkpOwotICAJCQkKLSAgCQkJLy8gY29weSB3aWxsIHJlY29yZCB3aGF0IGZpbGVzIG5lZWRzIHRvIGJlIGNvcHksIGJ1dCBkb2VzIG5vdCB3cml0ZSB0aGUgZmlsZXMgeWV0Ci0gIAkJCWNvcHlXU0RMKGVudmlyb25tZW50LCB3c2RsVVJJLCBiYXNlRGVzdGluYXRpb25VUkksIGdldExvY2FsbmFtZShkZXN0aW5hdGlvblVSSSksIGRlZik7Ci0gIAkJCQotICAJCQkvLyBiZWdpbiB3cml0ZQotICAJCQkKLSAgCQkJSXRlcmF0b3IgaXRlciA9IHhtbE9iamVjdEluZm9zLml0ZXJhdG9yKCk7ICAJCQkgIAkJCQotICAJCQkKLSAgCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gIAkJCQlYTUxPYmplY3RJbmZvIGluZm8gPSAoWE1MT2JqZWN0SW5mbykgaXRlci5uZXh0KCk7ICAJCQkJCi0gIAkJCQlJUGF0aCByZWxQYXRoID0gaW5mby5wYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocGF0aFByZWZpeC5zZWdtZW50Q291bnQoKSk7Ci0gIAkJCQkgIAkJCQkgIAkJCQkKLSAgCQkJCWlmIChpbmZvLmNvbnRlbnQgaW5zdGFuY2VvZiBEZWZpbml0aW9uKSB7Ci0gIAkJCQkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGluZm8uY29udGVudDsKLSAgCQkJCQkKLSAgCQkJCQkvLyBpZiB0aGlzIGlzIHRoZSBzdGFydGluZyB3c2RsLCBjaGVjayBpZiBpdCdzIGF0IHRoZSByb290IGRpcmVjdG9yeQotICAJCQkJCWlmIChkZWZpbml0aW9uID09IGRlZikKLSAgCQkJCQkJd3NkbFJlbFBhdGggPSByZWxQYXRoLnRvU3RyaW5nKCk7Ci0KLSAgCQkJCQlTdHJpbmcgZGVzdFVSSSA9IHdyaXRlWE1MT2JqKGVudmlyb25tZW50LCBiYXNlRGVzdGluYXRpb25VUkksIHJlbFBhdGgudG9TdHJpbmcoKSwgZGVmaW5pdGlvbik7Ci0gIAkJCQkJCi0gIAkJCQkJLy8gZm9yIHRoZSBzdGFydGluZyB3c2RsLCBpZiB0aGUgdGhlIHNvdXJjZSBwYXRoIGFuZCBkZXN0aW5hdGlvbiBwYXRoIGFyZSB0aGUgc2FtZSwKLSAgCQkJCQkvLyB3ZSBkbyBub3QgbmVlZCB0byBjb3B5IHRoZSByZXN0IG9mIHRoZSBmaWxlcyBvbnRvIHRoZW1zZWx2ZXMgKGJ1ZyAxNzkzMzcpCi0gIAkJCQkJaWYgKGRlZmluaXRpb24gPT0gZGVmICYmIHdzZGxVUkkgIT0gbnVsbCAmJgotICAJCQkJCQlub3JtYWxpemUod3NkbFVSSSkuZXF1YWxzKG5vcm1hbGl6ZShkZXN0VVJJKSkpCi0gIAkJCQkJCXJldHVybjsKLSAgCQkJCX0KLSAgCQkJCWVsc2UKLSAgCQkJCQl3cml0ZVhNTE9iaihlbnZpcm9ubWVudCwgYmFzZURlc3RpbmF0aW9uVVJJLCByZWxQYXRoLnRvU3RyaW5nKCksIChYU0RTY2hlbWEpIGluZm8uY29udGVudCk7Ci0gIAkJCX0KLSAgCQkJCi0gIAkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX0NPUFlfV1NETCwgbmV3IFN0cmluZ1tde3dzZGxVUkksIGRlc3RpbmF0aW9uVVJJfSksIGUpKTsKLSAgCQl9Ci0gIAl9Ci0gIH0KLSAgLyoqCi0gICAqIEhlbHBlciBjbGFzcyBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlcyB3ZSBuZWVkIHRvIHdyaXRlCi0gICAqLwotICBwcml2YXRlIGNsYXNzIFhNTE9iamVjdEluZm8gewotICAJCi0gIAlwdWJsaWMgSVBhdGggIHBhdGg7ICAJCi0gIAlwdWJsaWMgT2JqZWN0IGNvbnRlbnQ7Ci0gIAkgIAkKLSAgCS8qKgotICAJICogQ29uc3RydWN0b3IuCi0gIAkgKiAKLSAgCSAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgc291cmNlIGZpbGUKLSAgCSAqIEBwYXJhbSBjb250ZW50IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNvdXJjZSBmaWxlCi0gIAkgKi8KLSAgCXB1YmxpYyBYTUxPYmplY3RJbmZvKFN0cmluZyB1cmksIE9iamVjdCBjb250ZW50KSB7Ci0gIAkJCi0gIAkJaW50IGNvbG9uID0gdXJpLmxhc3RJbmRleE9mKCI6Iik7IAotICAJCQotICAJCS8vIGRvbid0IG5lZWQgcHJvdG9jb2wgb3IgZGV2aWNlIGluZm8KLSAgCQlpZiAoY29sb24gIT0gLTEpCi0gIAkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoY29sb24gKyAxLCB1cmkubGVuZ3RoKCkpOwotICAJCQotICAJCXRoaXMucGF0aCAgICA9IG5ldyBQYXRoKHVyaSk7ICAJCQotICAJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0gIAl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIHBhdGggcHJlZml4LCB3aGljaCBpcyB0aGUgc2hvcnRlc3QgcGFyZW50IHBhdGgKLSAgICogY29tbW9uIHRvIGFsbCBmaWxlcyB3ZSBuZWVkIHRvIHdyaXRlLgotICAgKiAKLSAgICogQHBhcmFtIGluZm8gQ29udGFpbnMgaW5mbyBvbiBmaWxlIHRvIHdyaXRlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhdGhQcmVmaXgoWE1MT2JqZWN0SW5mbyBpbmZvKSB7Ci0gIAlpZiAocGF0aFByZWZpeCA9PSBudWxsKQotICAgICAgICBwYXRoUHJlZml4ID0gaW5mby5wYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICBlbHNlIHsKLSAgICAJaW50IG1hdGNoaW5nID0gcGF0aFByZWZpeC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoaW5mby5wYXRoKTsKLSAgICAJCi0gICAgCWlmIChtYXRjaGluZyA8IHBhdGhQcmVmaXguc2VnbWVudENvdW50KCkpCi0gICAgCQlwYXRoUHJlZml4ID0gcGF0aFByZWZpeC51cHRvU2VnbWVudChtYXRjaGluZyk7Ci0gICAgfQotICB9ICAgIAotICAKLSAgLy8gd3JpdGUgYSB3c2RsIGZpbGUsIHJldHVybnMgdGhlIHVyaSBvZiB0aGUgZmlsZSB3cml0dGVuLgotICBwcml2YXRlIFN0cmluZyB3cml0ZVhNTE9iaihJRW52aXJvbm1lbnQgZW52LCBTdHJpbmcgZGVzdFVSSSwgU3RyaW5nIGRlc3RMb2NhbG5hbWUsIERlZmluaXRpb24gZGVmaW5pdGlvbikgCi0JdGhyb3dzIFdTRExFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBVUklFeGNlcHRpb24gewotCQotCVN0cmluZ0J1ZmZlciBkZXN0aW5hdGlvbkZpbGVVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKGFkZFRyYWlsaW5nU2VwYXJhdG9yKGRlc3RVUkkpKTsKLSAgICBkZXN0aW5hdGlvbkZpbGVVUkkuYXBwZW5kKGRlc3RMb2NhbG5hbWUpOyAgIAotICAKLSAgICBXU0RMRmFjdG9yeSB3c2RsRmFjdG9yeSA9IG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgICBXU0RMV3JpdGVyIHdzZGxXcml0ZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgT3V0cHV0U3RyZWFtIG9zID0gZW52LmdldFVSSUZhY3RvcnkoKS5uZXdVUkkoZGVzdGluYXRpb25GaWxlVVJJLnRvU3RyaW5nKCkpLmdldE91dHB1dFN0cmVhbSgpOwotICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIG9zKTsKLSAgICBvcy5jbG9zZSgpOwotICAgIAotICAgIHJldHVybiBkZXN0aW5hdGlvbkZpbGVVUkkudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgLy8gd3JpdGUgYW4geHNkIGZpbGUsIHJldHVybnMgdGhlIHVyaSBvZiB0aGUgZmlsZSB3cml0dGVuLgotICBwcml2YXRlIFN0cmluZyB3cml0ZVhNTE9iaihJRW52aXJvbm1lbnQgZW52LCBTdHJpbmcgZGVzdFVSSSwgU3RyaW5nIGRlc3RMb2NhbG5hbWUsIFhTRFNjaGVtYSB4c2RTY2hlbWEpIAotCXRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFVSSUV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJCi0JU3RyaW5nQnVmZmVyIGRlc3RpbmF0aW9uRmlsZVVSSSA9IG5ldyBTdHJpbmdCdWZmZXIoYWRkVHJhaWxpbmdTZXBhcmF0b3IoZGVzdFVSSSkpOwotCWRlc3RpbmF0aW9uRmlsZVVSSS5hcHBlbmQoZGVzdExvY2FsbmFtZSk7Ci0JCQotCUVsZW1lbnQgZSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0JRE9NU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZSk7Ci0JVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0Jc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7Ci0Jc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiMiIpOwotCU91dHB1dFN0cmVhbSBvcyA9IGVudi5nZXRVUklGYWN0b3J5KCkubmV3VVJJKGRlc3RpbmF0aW9uRmlsZVVSSS50b1N0cmluZygpKS5nZXRPdXRwdXRTdHJlYW0oKTsKLQlzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3MpKTsKLQlvcy5jbG9zZSgpOwotCQotCXJldHVybiBkZXN0aW5hdGlvbkZpbGVVUkkudG9TdHJpbmcoKTsKLSAgfSAgCi0gIAotICBwcml2YXRlIHZvaWQgY29weVdTREwoSUVudmlyb25tZW50IGVudiwgU3RyaW5nIHVyaSwgU3RyaW5nIGRlc3RVUkksIFN0cmluZyBkZXN0TG9jYWxuYW1lKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBVUklFeGNlcHRpb24KLSAgewotICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCQotCXRyeSB7Ci0JCWRlZmluaXRpb24gPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvblZlcmJvc2UodXJpKTsKLQkJY29weVdTREwoZW52LCB1cmksIGRlc3RVUkksIGRlc3RMb2NhbG5hbWUsIGRlZmluaXRpb24pOwkKLQl9IGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpIHsKLQkJY29weVhNTFNjaGVtYShlbnYsIHVyaSwgZGVzdFVSSSk7Ci0JfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlXU0RMKElFbnZpcm9ubWVudCBlbnYsIFN0cmluZyB1cmksIFN0cmluZyBkZXN0VVJJLCBTdHJpbmcgZGVzdExvY2FsbmFtZSwgRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBVUklFeGNlcHRpb24KLSAgewotCXVyaSA9IG5vcm1hbGl6ZSh1cmkpOwotCWlmICghbmVlZFRvQ29weSh1cmkpKSB7Ci0JICAgCXJldHVybjsKLQl9Ci0JZGVzdFVSSSA9IG5vcm1hbGl6ZShkZXN0VVJJKTsKLSAgICBTdHJpbmcgYmFzZVVSSSA9IGdldEJhc2VVUkkodXJpKTsKLSAgICBpZiAoZGVzdExvY2FsbmFtZSA9PSBudWxsIHx8IGRlc3RMb2NhbG5hbWUubGVuZ3RoKCkgPD0gMCkKLSAgICAgIGRlc3RMb2NhbG5hbWUgPSBnZXRMb2NhbG5hbWUodXJpKTsKLSAgICAKLSAgICAvLyBjb3B5IFdTREwKLSAgICAKLSAgICBYTUxPYmplY3RJbmZvIGluZm8gPSBuZXcgWE1MT2JqZWN0SW5mbyhiYXNlVVJJICsgZGVzdExvY2FsbmFtZSwgZGVmaW5pdGlvbik7Ci0gICAgdXBkYXRlUGF0aFByZWZpeChpbmZvKTsKLSAgICB4bWxPYmplY3RJbmZvcy5hZGQoaW5mbyk7Ci0KLSAgICAvLyBjb3B5IDx3c2RsOmltcG9ydD5zCi0gICAgTWFwIGltcG9ydHMgPSBkZWZpbml0aW9uLmdldEltcG9ydHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaW1wb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IChMaXN0KWl0Lm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgbGlzdEl0ID0gbGlzdC5pdGVyYXRvcigpOyBsaXN0SXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgSW1wb3J0IHdzZGxJbXBvcnQgPSAoSW1wb3J0KWxpc3RJdC5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB3c2RsSW1wb3J0VVJJID0gd3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICBpZiAoaXNSZWxhdGl2ZSh3c2RsSW1wb3J0VVJJKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbXBvcnRCYXNlVVJJID0gKG5ldyBTdHJpbmdCdWZmZXIoYmFzZVVSSSkpLmFwcGVuZCh3c2RsSW1wb3J0VVJJKS50b1N0cmluZygpOwotICAgICAgICAgIFN0cmluZyB3c2RsSW1wb3J0QmFzZVVSSSA9IGdldEJhc2VVUkkod3NkbEltcG9ydFVSSSk7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIGltcG9ydERlc3RVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKGRlc3RVUkkpOwotICAgICAgICAgIGlmICh3c2RsSW1wb3J0QmFzZVVSSSAhPSBudWxsKQotICAgICAgICAgICAgaW1wb3J0RGVzdFVSSS5hcHBlbmQod3NkbEltcG9ydEJhc2VVUkkpOwotICAgICAgICAgIGNvcHlXU0RMKGVudiwgaW1wb3J0QmFzZVVSSSwgaW1wb3J0RGVzdFVSSS50b1N0cmluZygpLCBnZXRMb2NhbG5hbWUod3NkbEltcG9ydFVSSSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3Qgc2NoZW1hcyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNjaGVtYXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1lbnQ7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoc2NoZW1hRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaWdub3JlIGFueSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBpbnRvIGEKLSAgICAgICAgICAgIC8vIFhTRFNjaGVtYSBpbnN0YW5jZQotICAgICAgICAgIH0KLSAgICAgICAgICBjb3B5WE1MU2NoZW1hKGVudiwgeHNkU2NoZW1hLCBiYXNlVVJJLCBkZXN0VVJJKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIHNjaGVtYUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKWV4dEVsZW1lbnQ7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoc2NoZW1hRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaWdub3JlIGFueSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBpbnRvIGEKLSAgICAgICAgICAgIC8vIFhTRFNjaGVtYSBpbnN0YW5jZQotICAgICAgICAgIH0KLSAgICAgICAgICBjb3B5WE1MU2NoZW1hKGVudiwgeHNkU2NoZW1hLCBiYXNlVVJJLCBkZXN0VVJJKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEJhc2VVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIGludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCdcXCcpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRMb2NhbG5hbWUoU3RyaW5nIHVyaSkKLSAgewotICAgIGludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCdcXCcpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHVyaTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFkZFRyYWlsaW5nU2VwYXJhdG9yKFN0cmluZyBzKQotICB7Ci0gICAgaWYgKCEocy5lbmRzV2l0aCgiLyIpIHx8IHMuZW5kc1dpdGgoIlxcIikpKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocyk7Ci0gICAgICBzYi5hcHBlbmQoJy8nKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gczsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc1JlbGF0aXZlKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gKHVyaS5pbmRleE9mKCc6JykgPT0gLTEpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlYTUxTY2hlbWEoSUVudmlyb25tZW50IGVudiwgU3RyaW5nIHVyaSwgU3RyaW5nIGRlc3RVUkkpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVVJJRXhjZXB0aW9uCi0gIHsKLQkgIHVyaSA9IG5vcm1hbGl6ZSh1cmkpOwotCSAgaWYgKCFuZWVkVG9Db3B5KHVyaSkpIHsKLQkgICAgCXJldHVybjsKLQkgICAgfQotCSAgZGVzdFVSSSA9IG5vcm1hbGl6ZShkZXN0VVJJKTsKLSAgICAvLyBsb2FkIGFzIGEgY2FjaGVkIHNjaGVtYQotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYSh1cmkpOwotICAgIC8vIGlmIHNjaGVtYSBpcyBub3QgY2FjaGVkLCBwYXJzZSBpdAotICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RQYXJzZXIgcCA9IG5ldyBYU0RQYXJzZXIoKTsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gTmV0VXRpbHMuZ2V0VVJMSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBwLnBhcnNlKGlzKTsKLSAgICAgICAgeHNkU2NoZW1hID0gcC5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGNvcHkgc2NoZW1hCi0gICAgICAgIAotICAgICAgWE1MT2JqZWN0SW5mbyBpbmZvID0gbmV3IFhNTE9iamVjdEluZm8odXJpLCB4c2RTY2hlbWEpOwotICAgICAgdXBkYXRlUGF0aFByZWZpeChpbmZvKTsKLSAgICAgIHhtbE9iamVjdEluZm9zLmFkZChpbmZvKTsKLSAgICAgIAotICAgICAgLy8gY29weSA8eHNkOmltcG9ydD5zIGFuZCA8eHNkOmluY2x1ZGU+cwotICAgICAgY29weVhNTFNjaGVtYShlbnYsIHhzZFNjaGVtYSwgZ2V0QmFzZVVSSSh1cmkpLCBkZXN0VVJJKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weVhNTFNjaGVtYShJRW52aXJvbm1lbnQgZW52LCBYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgYmFzZVVSSSwgU3RyaW5nIGRlc3RVUkkpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgLy8gY29weSA8eHNkOmltcG9ydD5zIGFuZCA8eHNkOmluY2x1ZGU+cwotICAgICAgRUxpc3QgeHNkU2NoZW1hQ29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB4c2RTY2hlbWFDb250ZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgY29udGVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgeHNkU2NoZW1hRGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSljb250ZW50OwotICAgICAgICAgIFN0cmluZyB4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbiA9IHhzZFNjaGVtYURpcmVjdGl2ZS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICAgIGlmICh4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbiAhPSBudWxsICYmIGlzUmVsYXRpdmUoeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkaXJlY3RpdmVVUkkgPSAobmV3IFN0cmluZ0J1ZmZlcihiYXNlVVJJKSkuYXBwZW5kKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uKS50b1N0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdGl2ZUJhc2VVUkkgPSBnZXRCYXNlVVJJKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBkaXJlY3RpdmVEZXN0VVJJID0gbmV3IFN0cmluZ0J1ZmZlcihkZXN0VVJJKTsKLSAgICAgICAgICAgIGlmIChkaXJlY3RpdmVCYXNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICAgIGRpcmVjdGl2ZURlc3RVUkkuYXBwZW5kKGRpcmVjdGl2ZUJhc2VVUkkpOwotICAgICAgICAgICAgY29weVhNTFNjaGVtYShlbnYsIGRpcmVjdGl2ZVVSSSwgZGlyZWN0aXZlRGVzdFVSSS50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gbmVlZFRvQ29weSAoU3RyaW5nIG5vcm1hbGl6ZWRVUkkpIHsJCi0JICBpZiAoaWdub3JlTGlzdC5jb250YWlucyhub3JtYWxpemVkVVJJKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICBpZ25vcmVMaXN0LmFkZChub3JtYWxpemVkVVJJKTsKLQkgIHJldHVybiB0cnVlOwotICB9Ci0gIAotLy9ub3JtYWxpemUgdGhlIHVyaSB0byByZW1vdmUgcmVsYXRpdmUgYWRkcmVzc2luZyAiLy4uIgotICBwcml2YXRlIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHVyaSApCi0gIHsKLSAgCWJvb2xlYW4gbm9ybWFsaXplZCA9IGZhbHNlOwotICAJd2hpbGUoIW5vcm1hbGl6ZWQpewotICAJICBpbnQgZGlyID0gdXJpLmluZGV4T2YoIi8uLiIpOwotICAJICBpZihkaXIgPT0gLTEpCi0gIAkgIAlub3JtYWxpemVkID0gdHJ1ZTsKLSAgCSAgZWxzZXsKLSAgCSAgCVN0cmluZyBmaXJzdCA9IHVyaS5zdWJzdHJpbmcoMCxkaXIpOwotICAJICAgIFN0cmluZyBzZWNvbmQgPSB1cmkuc3Vic3RyaW5nKGRpciArIDMpOwotICAJICAgIGludCBuZXdJbmRleCA9IGZpcnN0Lmxhc3RJbmRleE9mKCIvIik7Ci0gIAkgICAgaWYobmV3SW5kZXggPT0gLTEpewotICAJICAgIAlub3JtYWxpemVkID0gdHJ1ZTsKLSAgCSAgICB9IGVsc2UgewotICAJICAgIAlmaXJzdCA9IGZpcnN0LnN1YnN0cmluZygwLG5ld0luZGV4KTsKLSAgCSAgICAJdXJpID0gZmlyc3QgKyBzZWNvbmQ7Ci0gIAkgICAgfQotICAJICB9Ci0gIAl9Ci0gIAlyZXR1cm4gdXJpOwotICAKLSAgfQotCSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsKQotICAgICAgICB3c2RsVVJJID0gd3NkbFVSSS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb25VUkkoU3RyaW5nIGRlc3RpbmF0aW9uVVJJKQotICB7Ci0gICAgdGhpcy5kZXN0aW5hdGlvblVSSSA9IGRlc3RpbmF0aW9uVVJJOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIHRoaXMuZGVmID0gZGVmOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdTRExSZWxQYXRoKCkgewotICAgIHJldHVybiB3c2RsUmVsUGF0aDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFQVJQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFQVJQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDEwZWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZUVBUlByb2plY3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZWFyUHJvamVjdE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWRfOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbl87ICAKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50ICBlbnYgICAgICAgPSBnZXRFbnZpcm9ubWVudCgpOwotCQotICAgIHRyeQotICAgIHsKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIElEYXRhTW9kZWwgaW5mbyA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KElFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgSjJFRSB2ZXJzaW9uCi0gICAgICAgIGlmIChqMmVlVmVyc2lvbl8gIT0gbnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoSUVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgbmV3IEludGVnZXIoajJlZVZlcnNpb25fKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShJRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgc2VydmVyIHRhcmdldAotICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLS8vCQkJVE9ETyAtIEFkZCB0aGlzIGxvZ2ljIHRvIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLCBhbmQgb3AuLi4uCi0vLyAgICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8sIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuRUFSX1RZUEUsIGZpbmFsSjJFRVZlcnNpb24pOyAKLS8vICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuU0VSVkVSX1RBUkdFVF9JRCwgcnVudGltZVRhcmdldElkICk7Ci0vLyAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9TRVJWRVJfVEFSR0VULCBCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9DcmVhdGUgdGhlIEVBUgotICAgICAgICBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGluZm8uZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotICAgICAgICBvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBpdGUpCi0gICAgewotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FQVJfUFJPSkVDVCwgbmV3IFN0cmluZ1tdIHtlYXJQcm9qZWN0TmFtZV99KSwgaXRlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gZWFyUHJvamVjdE5hbWVfIFRoZSBlYXJQcm9qZWN0TmFtZV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdE5hbWUoU3RyaW5nIGVhclByb2plY3ROYW1lKQotICB7Ci0gICAgdGhpcy5lYXJQcm9qZWN0TmFtZV8gPSBlYXJQcm9qZWN0TmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAlzZXJ2ZXJGYWN0b3J5SWRfID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgCWoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwkKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUZhY2V0ZWRQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiNWRhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUZhY2V0ZWRQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDEzMSAxMjEwNzEgICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIgICAgIAotICogMjAwNjAyMDQgMTI0NDA4ICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgCi0gKiAyMDA2MDIxNyAxMjY3NTcgICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwMjIxIDExOTExMSAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjcgMTI2NzgwICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDUxNyAxMjY5NjUgICBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA5MDUgICAxNTYyMzAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4sIEhhbmRsaW5nIHByb2plY3RzIHdpdGggbm8gdGFyZ2V0IHJ1bnRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkZhY2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uRmFjZXRNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uRmFjZXRTZXRzQnlUZW1wbGF0ZUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLlJlcXVpcmVkRmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotCi0gIC8vbmFtZSBvZiB0aGUgcHJvamVjdCB0byBiZSBjcmVhdGVkCi0gIHByaXZhdGUgU3RyaW5nICAgcHJvamVjdE5hbWU7IAotCi0gIC8vaWQgb2YgdGhlIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoaXMgcHJvamVjdC4KLSAgcHJpdmF0ZSBTdHJpbmcgICB0ZW1wbGF0ZUlkOwotICAKLSAgLy9yZXF1aXJlZCBmYWNldCB2ZXJzaW9ucyB0aGF0IG11c3QgYmUgc2F0aXNmaWVkIHdoZW4gY3JlYXRpbmcgdGhlIHByb2plY3QgKHRoaXMgY29tZXMgZnJvbQotICAvL3RoZSBzZWxlY3RlZCBzZXJ2ZXJSdW50aW1lIG9yIGNsaWVudFJ1bnRpbWUgaW4gdGhlIGNhbGxpbmcgc2NlbmFyaW8pCi0gIHByaXZhdGUgUmVxdWlyZWRGYWNldFZlcnNpb25bXSAgIHJlcXVpcmVkRmFjZXRWZXJzaW9uczsKLQotICAvL3NlcnZlciB0eXBlIGlkIC0gdXNlZCB0byBkZXRlcm1pbmUgdGhlIGZhY2V0IHJ1bnRpbWUgdGhlIGNyZWF0ZWQgcHJvamVjdCB3aWxsIGJlIGJvdW5kIHRvCi0gIC8vaWYgc2VydmVySW5zdGFuY2VJZCBpcyBudWxsIG9yIGVtcHR5Ci0gIHByaXZhdGUgU3RyaW5nICAgc2VydmVyRmFjdG9yeUlkOwotCi0gIC8vc2VydmVyIGlkIC0gdXNlZCB0byBkZXRlcm1pbmUgdGhlIGZhY2V0IHJ1bnRpbWUgdGhlIGNyZWF0ZWQgcHJvamVjdCB3aWxsIGJlIGJvdW5kIHRvLiBNYXkKLSAgLy9iZSBudWxsIG9yIGVtcHR5LgotICBwcml2YXRlIFN0cmluZyAgIHNlcnZlckluc3RhbmNlSWQ7Ci0gIAotICAvL2ZhY2V0IHJ1bnRpbWUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzZXJ2ZXJJbnN0YW5jZUlkIG9yIHNlcnZlckZhY3RvcnlJZAotICBwcml2YXRlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgZmFjZXRSdW50aW1lOwotICAKLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0gIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCi0gICAgLy8gY2hlY2sgaWYgZGF0YSByZWFkeQotICAgIHN0YXR1cyA9IGNoZWNrRGF0YVJlYWR5KCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgewotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICBpZiAoIXByb2plY3QuZXhpc3RzKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHN0YXR1cyA9IEZhY2V0VXRpbHMuY3JlYXRlTmV3RmFjZXRlZFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElQcm9qZWN0IGNyZWF0ZWRQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGNyZWF0ZWRQcm9qZWN0KTsKLSAgICAgICAgCi0gICAgICAgIC8vR2V0IHRoZSBmYWNldCB2ZXJzaW9ucyB0byBpbnN0YWxsLiAKLSAgICAgICAgU2V0IGZhY2V0c1RvQWRkID0gZ2V0RmFjZXRzVG9BZGQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vSW5zdGFsbCB0aGUgZmFjZXQgdmVyc2lvbnMKLSAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlscy5hZGRGYWNldHNUb1Byb2plY3QoZnByb2plY3QsIGZhY2V0c1RvQWRkKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBpbnN0YWxsZWQgZmFjZXQgdmVyc2lvbnMgYXMgZml4ZWQuCi0gICAgICAgIFNldCBuZXdGYWNldFZlcnNpb25zID0gZnByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpOwotICAgICAgICBTZXQgZml4ZWRGYWNldHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdGYWNldFZlcnNpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZpeGVkRmFjZXRzLmFkZChmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IEZhY2V0VXRpbHMuc2V0Rml4ZWRGYWNldHNPblByb2plY3QoZnByb2plY3QsIGZpeGVkRmFjZXRzKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBydW50aW1lICAgICAgICAKLSAgICAgICAgaWYgKGZhY2V0UnVudGltZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlscy5zZXRGYWNldFJ1bnRpbWVPblByb2plY3QoZnByb2plY3QsIGZhY2V0UnVudGltZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgZmFjZXRzIHJlcXVpcmVkIGJ5IFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICAgICAgaWYgKHJlcXVpcmVkRmFjZXRWZXJzaW9ucy5sZW5ndGggIT0gMCkgewotICAgICAgICAJc3RhdHVzID0gRmFjZXRVdGlscy5hZGRSZXF1aXJlZEZhY2V0c1RvUHJvamVjdChwcm9qZWN0LCByZXF1aXJlZEZhY2V0VmVyc2lvbnMsIG1vbml0b3IpOwotICAgICAgICAJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgCXsKLSAgICAgICAgCQlyZXR1cm4gc3RhdHVzOwotICAgICAgICAJfSAgICAgIAotICAgICAgICB9Ci0gICAgICAgICAgICAgCi0gICAgICAgIGlmIChmYWNldFJ1bnRpbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAJLy8gYWRkIHRoZSBkZWZhdWx0IGZhY2V0cyB0aGF0J3Mgbm90IGluIGNvbmZsaWN0IHdpdGggdGhlIGV4aXN0aW5nIGZhY2V0cwotICAgICAgICAJU2V0IHByb2plY3RGYWNldFZlcnNpb25TZXQgPSBmcHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIAlTZXQgcHJvamVjdEZhY2V0U2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgCS8vIGdldCB0aGUgcHJvamVjdCBmYWNldCBmcm9tIHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24gd2UgY2FsY3VsYXRlZAotICAgICAgICAJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvamVjdEZhY2V0VmVyc2lvblNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBwZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAJCXByb2plY3RGYWNldFNldC5hZGQocGZ2LmdldFByb2plY3RGYWNldCgpKTsKLSAgICAgICAgCX0KLSAgICAgICAgCXRyeSB7Ci0gICAgICAgIAkJU2V0IGRlZmF1bHRQcm9qZWN0RmFjZXRWZXJzaW9uU2V0ID0gZmFjZXRSdW50aW1lLmdldERlZmF1bHRGYWNldHMocHJvamVjdEZhY2V0U2V0KTsKLSAgICAgICAgCQkvLyBUaGUgcmV0dXJuZWQgZGVmYXVsdEZhY2V0U2V0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBwcm9qZWN0RmFjZXRTZXQgcGFzc2VkIGludG8gZ2V0RGVmYXVsdEZhY2V0cwotICAgICAgICAJCS8vIHBsdXMgYW55IGRlZmF1bHQgZmFjZXRzIHRoYXQgYXJlIG5vdCBpbiBjb25mbGljdCB3aXRoIHRoZSBvcmlnaW5hbCBwcm9qZWN0RmFjZXRTZXQuCi0gICAgICAgIAkJLy8gQWRkIHRvIGZhY2V0c1RvQWRkIGlmIHRoZSB0aGUgZGVmYXVsdCBmYWNldCBpcyBub3QgaW4gdGhlIG9yaWdpbmFsIHNldC4KLSAgICAgICAgCQlTZXQgZGVmYXVsdEZhY2V0c1RvQWRkID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWZhdWx0UHJvamVjdEZhY2V0VmVyc2lvblNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgCQkJSVByb2plY3RGYWNldFZlcnNpb24gZGVmYXVsdFByb2pGYWNldFZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAJCQlpZiggISBwcm9qZWN0RmFjZXRTZXQuY29udGFpbnMoIGRlZmF1bHRQcm9qRmFjZXRWZXJzaW9uLmdldFByb2plY3RGYWNldCgpICkgKQotICAgICAgICAJCQl7Ci0gICAgICAgIAkJCQlkZWZhdWx0RmFjZXRzVG9BZGQuYWRkKGRlZmF1bHRQcm9qRmFjZXRWZXJzaW9uKTsKLSAgICAgICAgCQkJfQotICAgICAgICAJCX0KLSAgICAgICAgCQlpZiAoIWRlZmF1bHRGYWNldHNUb0FkZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgCQkJc3RhdHVzID0gRmFjZXRVdGlscy5hZGRGYWNldHNUb1Byb2plY3QoZnByb2plY3QsIGRlZmF1bHRGYWNldHNUb0FkZCk7Ci0gICAgICAgIAkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotICAgICAgICAJCQl7Ci0gICAgICAgIAkJCQlyZXR1cm4gc3RhdHVzOwotICAgICAgICAJCQl9ICAgIAotICAgICAgICAJCX0KLSAgICAgICAgCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAJCS8vIElmIHRoZXJlJ3MgYW55IGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBnZXQgdGhlIGRlZmF1bHQgZmFjZXQsIGp1c3QgaWdub3JlIHRoZSBkZWZhdWx0IGZhY2V0Ci0gICAgICAgIAkJLy8gYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgZmFjZXRzVG9BZGQuCi0gICAgICAgIAl9Ci0gICAgICAgIAkvLyBlbmQgb2YgYWRkaW5nIGRlZmF1bHQgZmFjZXRzCi0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9QUk9KRUNUX0NSRUFUSU9OLCBuZXcgU3RyaW5nW10geyBwcm9qZWN0TmFtZSB9KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBJU3RhdHVzIGNoZWNrRGF0YVJlYWR5KCkKLSAgewotCi0JaWYgKHByb2plY3ROYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1BST0pFQ1RfQ1JFQVRJT04sIG5ldyBTdHJpbmdbXSB7cHJvamVjdE5hbWV9KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZmFjZXRzIHRvIGluc3RhbGwgb24gdGhlIG5ldyBwcm9qZWN0LiBUaGUgc2V0IHdpbGwgY29uc2lzdAotICAgKiBvZiB0aGUgaGlnaGVzdCB2ZXJzaW9uIG9mIGVhY2ggb2YgdGhlIHRlbXBsYXRlJ3MgZml4ZWQgZmFjZXRzIHRoYXQgc2F0aWZpZXMKLSAgICogYm90aCB0aGUgcmVxdWlyZWQgZmFjZXQgdmVyc2lvbnMgYW5kIHRoZSBmYWNldCBydW50aW1lLgotICAgKiBAcmV0dXJuIFNldCBhIFNldCBjb250YWluaW5nIGVsZW1lbnRzIG9mIHR5cGUgSVByb2plY3RGYWNldFZlcnNpb24uCi0gICAqLwotICBwcml2YXRlIFNldCBnZXRGYWNldHNUb0FkZCgpCi0gIHsKLSAgICBTZXQgZmFjZXRzID0gbnVsbDsKLSAgICAKLSAgICAvL1NldCB0aGUgZmFjZXQgcnVudGltZS4KLSAgICBzZXRGYWNldFJ1bnRpbWUoKTsKLSAgICAvL0dldCBhbGwgZmFjZXQgdmVyc2lvbiBjb21iaW5hdGlvbnMgZm9yIHRoZSB0ZW1wbGF0ZSBpbiBvcmRlciBvZiBhc2NlbmRpbmcgdmVyc2lvbiBudW1iZXJzLgotICAgIFNldFtdIGFsbENvbWJpbmF0aW9ucyA9IEZhY2V0U2V0c0J5VGVtcGxhdGVDYWNoZS5nZXRJbnN0YW5jZSgpLmdldEZhY2V0VmVyc2lvbkNvbWJpbmF0aW9uc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZUlkKTsKLSAgICBpbnQgbiA9IGFsbENvbWJpbmF0aW9ucy5sZW5ndGg7Ci0gICAgaWYgKGZhY2V0UnVudGltZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vV2FsayB0aGUgZmFjZXQgdmVyc2lvbiBjb21iaW5hdGlvbnMgaW4gb3JkZXIgb2YgZGVzY2VuZGluZyB2ZXJzaW9uIG51bWJlcnMuCi0gICAgICBmb3IgKGludCBpPW4tMTsgaT49MDsgaS0tKQotICAgICAgewotICAgICAgICAvL0NoZWNrIHRoaXMgdGVtcGxhdGUgY29tYmluYXRpb24gdG8gc2VlIGlmIGl0IGlzIGNvbXBhdGlibGUgd2l0aCBib3RoIHRoZSAKLSAgICAgICAgLy9yZXF1aXJlZCBmYWNldCB2ZXJzaW9ucyBhbmQgdGhlIHNlcnZlciBydW50aW1lLiBJZiBpdCBpcywgY2hvb3NlIGl0LgotICAgICAgICBTZXQgY29tYmluYXRpb24gPSBhbGxDb21iaW5hdGlvbnNbaV07Ci0gICAgICAgIEZhY2V0TWF0Y2hlciBmbSA9IEZhY2V0VXRpbHMubWF0Y2gocmVxdWlyZWRGYWNldFZlcnNpb25zLCBjb21iaW5hdGlvbik7Ci0gICAgICAgIGlmIChmbS5pc01hdGNoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvL0NoZWNrIGFnYWluc3QgUnVudGltZQotICAgICAgICAgIGlmIChGYWNldFV0aWxzLmRvZXNSdW50aW1lU3VwcG9ydEZhY2V0cyhmYWNldFJ1bnRpbWUsIGNvbWJpbmF0aW9uKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL1dlIGhhdmUgYSBtYXRjaC4gVXNlIHRoaXMgY29tYmluYXRpb24gb2YgZmFjZXQgdmVyc2lvbnMgZm9yIHByb2plY3QgY3JlYXRpb24uCi0gICAgICAgICAgICBmYWNldHMgPSBjb21iaW5hdGlvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChpbnQgaT1uLTE7IGk+PTA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgLy9DaGVjayB0aGlzIHRlbXBsYXRlIGNvbWJpbmF0aW9uIHRvIHNlZSBpZiBpdCBpcyBjb21wYXRpYmxlIHdpdGggYm90aCB0aGUgCi0gICAgICAgIC8vc2VydmljZS9jbGllbnQgcnVudGltZSBhbmQgdGhlIHNlcnZlciBydW50aW1lLiBJZiBpdCBpcywgY2hvb3NlIGl0LgotICAgICAgICBTZXQgY29tYmluYXRpb24gPSBhbGxDb21iaW5hdGlvbnNbaV07Ci0gICAgICAgIEZhY2V0TWF0Y2hlciBmbSA9IEZhY2V0VXRpbHMubWF0Y2gocmVxdWlyZWRGYWNldFZlcnNpb25zLCBjb21iaW5hdGlvbik7Ci0gICAgICAgIGlmIChmbS5pc01hdGNoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vV2UgaGF2ZSBhIG1hdGNoLiBVc2UgdGhpcyBjb21iaW5hdGlvbiBvZiBmYWNldCB2ZXJzaW9ucyBmb3IgcHJvamVjdCBjcmVhdGlvbi4KLSAgICAgICAgICAgIGZhY2V0cyA9IGNvbWJpbmF0aW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgCi0gICAgfQotICAgCi0gICAgLy9Vbmxpa2VseSB0byBnZXQgdG8gdGhpcyBwb2ludCBpbiB0aGUgY29kZSwgYnV0IGlmIHdlIGRvLCBjaG9vc2UgdGhlIGhpZ2hlc3QgdmVyc2lvbgotICAgIC8vb2YgZWFjaCBmaXhlZCBmYWNldCBpbiB0aGUgdGVtcGxhdGUuCi0gICAgaWYgKGZhY2V0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGZhY2V0cyA9IEZhY2V0VXRpbHMuZ2V0SW5pdGlhbEZhY2V0VmVyc2lvbnNGcm9tVGVtcGxhdGUodGVtcGxhdGVJZCk7Ci0gICAgfQotICAgICAKLSAgICByZXR1cm4gZmFjZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGZhY2V0UnVudGltZSBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHNlcnZlckluc3RhbmNlSWQgb3Igc2VydmVyRmFjdG9yeUlkCi0gICAqIFByZWZlcmVuY2UgaXMgZ2l2ZW4gdG8gbm9uLXN0dWIgZmFjZXQgcnVudGltZXMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0RmFjZXRSdW50aW1lKCkKLSAgewotICAgIAotCSAgaWYgKHNlcnZlckluc3RhbmNlSWQgIT0gbnVsbCAmJiBzZXJ2ZXJJbnN0YW5jZUlkLmxlbmd0aCgpPjApCi0JICB7Ci0JCSAgSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySW5zdGFuY2VJZCk7Ci0JCSAgSVJ1bnRpbWUgc1J1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQkgIGZhY2V0UnVudGltZSA9IEZhY2V0VXRpbC5nZXRSdW50aW1lKHNSdW50aW1lKTsgICAgICAKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkJICBpZiAoc2VydmVyRmFjdG9yeUlkICE9IG51bGwgJiYgc2VydmVyRmFjdG9yeUlkLmxlbmd0aCgpID4gMCkKLQkJICB7Ci0JCQkgIC8vRmluZCBhIG5vbiBTdHViIHJ1bnRpbWUgdGhhdCBtYXRjaGVzIHRoaXMgc2VydmVyIHR5cGUKLQkJCSAgSVJ1bnRpbWUgc2VydmVyUnVudGltZSA9IFNlcnZlclV0aWxzLmdldE5vblN0dWJSdW50aW1lKHNlcnZlckZhY3RvcnlJZCk7Ci0JCQkgIGlmIChzZXJ2ZXJSdW50aW1lICE9IG51bGwpCi0JCQkgIHsKLQkJCQkgIGZhY2V0UnVudGltZSA9IEZhY2V0VXRpbC5nZXRSdW50aW1lKHNlcnZlclJ1bnRpbWUpOwotCQkJICB9Ci0JCQkgIGVsc2UKLQkJCSAgewotCQkJCSAgLy9BY2NlcHQgc3R1YiBydW50aW1lLgotCQkJCSAgSVNlcnZlclR5cGUgc3QgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZCk7Ci0JCQkJICBTdHJpbmcgcnVudGltZVR5cGVJZCA9IHN0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsgICAKLQkJCQkgIC8vRmluZCB0aGUgZmFjZXQgcnVudGltZQotCQkJCSAgSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJCQkgIGZvciAoaW50IGk9MDsgaTxydW50aW1lcy5sZW5ndGg7IGkrKykKLQkJCQkgIHsKLQkJCQkJICBJUnVudGltZSBzUnVudGltZSA9IHJ1bnRpbWVzW2ldOwotCQkJCQkgIGlmIChzUnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVUeXBlSWQpKQotCQkJCQkgIHsKLQkJCQkJCSAgZmFjZXRSdW50aW1lID0gRmFjZXRVdGlsLmdldFJ1bnRpbWUoc1J1bnRpbWUpOwotCQkJCQkgIH0KLQkJCQkgIH0gICAgICAgICAgICAgICAgCi0JCQkgIH0KLQkJICB9Ci0JICB9Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRlbXBsYXRlSWQoU3RyaW5nIHRlbXBsYXRlSWQpCi0gIHsKLSAgICB0aGlzLnRlbXBsYXRlSWQgPSB0ZW1wbGF0ZUlkOwotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkRmFjZXRWZXJzaW9ucyhSZXF1aXJlZEZhY2V0VmVyc2lvbltdIHJlcXVpcmVkRmFjZXRWZXJzaW9ucykKLSAgewotICAgIHRoaXMucmVxdWlyZWRGYWNldFZlcnNpb25zID0gcmVxdWlyZWRGYWNldFZlcnNpb25zOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgICB0aGlzLnNlcnZlckZhY3RvcnlJZCA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0gIHsKLSAgICB0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotICB9Ci0KLSAgCi0gIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVKYXZhUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3MzA4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIENyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lXzsKLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kKCkKLSAgewotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52ID0gZ2V0RW52aXJvbm1lbnQoKTsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lXyk7Ci0gICAgCi0gICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcHJvamVjdC5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0LmdldE5hbWUoKSksIG1vbml0b3IpOwotICAgICAgICBwcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0gICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgZGVzYy5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHtKYXZhQ29yZS5OQVRVUkVfSUR9KTsKLSAgICAgICAgSUNvbW1hbmQgY21kID0gZGVzYy5uZXdDb21tYW5kKCk7Ci0gICAgICAgIGNtZC5zZXRCdWlsZGVyTmFtZShKYXZhQ29yZS5CVUlMREVSX0lEKTsKLSAgICAgICAgZGVzYy5zZXRCdWlsZFNwZWMobmV3IElDb21tYW5kW10ge2NtZH0pOwotICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG1vbml0b3IpOwotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgIFBhdGggcHJvamVjdFJvb3QgPSBuZXcgUGF0aChQYXRoLlJPT1QuYXBwZW5kKG5ldyBQYXRoKHByb2plY3QuZ2V0TmFtZSgpKSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5W10ge0phdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHByb2plY3RSb290KSwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUikpfSwgbW9uaXRvcik7Ci0gICAgICAgIGphdmFQcm9qZWN0LnNldE91dHB1dExvY2F0aW9uKHByb2plY3RSb290LCBtb25pdG9yKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0pBVkFfUFJPSkVDVCwgbmV3IFN0cmluZ1tdIHtwcm9qZWN0TmFtZV99KSwgY2UpOwotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgICBwcm9qZWN0TmFtZV8gPSBwcm9qZWN0TmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVNb2R1bGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vZHVsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjY2U5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vZHVsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMDQgMTI0NDA4ICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgKiAgICAgCi0gKiAyMDA2MDIxNyAgIDEyNjc1NyByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkZhY2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTW9kdWxlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0VCID0gSjJFRVV0aWxzLldFQjsgICAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRUpCID0gSjJFRVV0aWxzLkVKQjsgICAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVBQQ0xJRU5UID0gSjJFRVV0aWxzLkFQUENMSUVOVDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFQVIgPSBKMkVFVXRpbHMuRUFSOwotICAgIAotICAgIC8vVGVtcGxhdGVzCi0gICAgLy9UT0RPICBSZW1vdmUgdGhlc2UgdGVtcGxhdGUgY29uc3RhbnRzIG9uY2UgSjJFRSB0b29scyBkZWZpbmVzIGNvbnN0YW50cyAoYnVnIDExNzUzMSkKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXRUJfVEVNUExBVEUgPSAidGVtcGxhdGUuanN0LndlYiI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX1RFTVBMQVRFID0gInRlbXBsYXRlLmpzdC5lamIiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFQUENMSUVOVF9URU1QTEFURSA9ICJ0ZW1wbGF0ZS5qc3QuYXBwY2xpZW50IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFQVJfVEVNUExBVEUgPSAidGVtcGxhdGUuanN0LmVhciI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgICBwcm9qZWN0TmFtZTsKLQlwcml2YXRlIFN0cmluZyAgIG1vZHVsZU5hbWU7ICAvLyBtYXkgYmUgbnVsbCBmb3Igbm9uLWZsZXhpYmxlIHByb2plY3QKLQlwcml2YXRlIGludCAgICAgIG1vZHVsZVR5cGU7OwotCXByaXZhdGUgU3RyaW5nICAgajJlZUxldmVsOwotCXByaXZhdGUgU3RyaW5nICAgc2VydmVyRmFjdG9yeUlkOwotCXByaXZhdGUgU3RyaW5nICAgc2VydmVySW5zdGFuY2VJZF87Ci0JcHJpdmF0ZSBJRW52aXJvbm1lbnQgZW52OwotICAgIHByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yXzsKLQkKLSAgICBwcml2YXRlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgZmFjZXRSdW50aW1lOwotICAgIAotCXB1YmxpYyBDcmVhdGVNb2R1bGVDb21tYW5kKCl7Ci0JfQotCQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIG1vbml0b3JfID0gbW9uaXRvcjsKLQkJdGhpcy5lbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQkvLyBjaGVjayBpZiBkYXRhIHJlYWR5Ci0JCXN0YXR1cyA9IGNoZWNrRGF0YVJlYWR5KCk7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKXsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0JCi0KLSAgICAgICAgLy9lbnN1cmUgdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3QKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmICghcHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgY29tcG9uZW50IGFjY29yZGluZyB0byB0aGUgY29tcG9uZW50IHR5cGUgc3BlY2lmaWVkCi0gICAgICAgICAgaW50IHR5cGUgPSBnZXRNb2R1bGVUeXBlKCk7Ci0gICAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgY2FzZSBXRUI6Ci0gICAgICAgICAgICBzdGF0dXMgPSBjcmVhdGVXZWJDb21wb25lbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRUpCOgotICAgICAgICAgICAgIHN0YXR1cyA9IGNyZWF0ZUVKQkNvbXBvbmVudCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBBUFBDTElFTlQ6Ci0gICAgICAgICAgICBzdGF0dXMgPSBjcmVhdGVBcHBDbGllbnRDb21wb25lbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRUFSOgotICAgICAgICAgICAgc3RhdHVzID0gY3JlYXRlRUFSQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX0NPTVBPTkVOVF9DUkVBVElPTiwgbmV3IFN0cmluZ1tde21vZHVsZU5hbWV9KSApOyAgICAgICAgIAotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0KLQkJCi0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBpZiBmbGV4aWJsZSBwcm9qZWN0IGV4aXN0cwotICAgICAgICAvKgotCQlpZiAocHJvamVjdD09bnVsbCB8fCAhcHJvamVjdC5leGlzdHMoKSl7Ci0JCQlzdGF0dXMgPSBjcmVhdGVGbGV4aWJsZUphdmFQcm9qZWN0KCk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUil7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0JCQkKLQkJfQotICAgICAgICAqLwotICAgICAgICAvKgotCQkvLyBjaGVjayBpZiBwcm9qZWN0IGFuZC9vciBjb21wb25lbnQgZXhpc3RzCi0gICAgICAgIGlmIChwcm9qZWN0TmFtZSE9bnVsbCkgewotICAgICAgICAgIGlmIChtb2R1bGVOYW1lPT1udWxsKXsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0LmV4aXN0cygpKQotICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLQkJCWlmIChKMkVFVXRpbHMuZXhpc3RzKHByb2plY3ROYW1lLCBtb2R1bGVOYW1lKSkKLQkJCQlyZXR1cm4gc3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCQllbHNlIHsKLQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9DT01QT05FTlRfQ1JFQVRJT04sIG5ldyBTdHJpbmdbXXtwcm9qZWN0TmFtZSwgbW9kdWxlTmFtZX0pICk7Ci0JCX0gCi0gICAgICAgICovICAgICAgIAotICAgICAgICAKLQotCQkKLQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgY2hlY2tEYXRhUmVhZHkoKXsKLQkJCi0JCWlmIChwcm9qZWN0TmFtZT09bnVsbCB8fCBzZXJ2ZXJGYWN0b3J5SWQ9PW51bGwpewotCQkJcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9DT01QT05FTlRfQ1JFQVRJT04sIG5ldyBTdHJpbmdbXXtwcm9qZWN0TmFtZSwgbW9kdWxlTmFtZX0pICk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBXZWIgY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNyZWF0ZVdlYkNvbXBvbmVudCgpeyAgIAotICAgIAotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOyAgICAgIAotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBzdGF0dXMgPSBGYWNldFV0aWxzLmNyZWF0ZU5ld0ZhY2V0ZWRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgSVByb2plY3QgY3JlYXRlZFByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJRmFjZXRlZFByb2plY3QgZnByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoY3JlYXRlZFByb2plY3QpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL0RlY2lkZSB3aGljaCBmYWNldHMgdG8gaW5zdGFsbCBiYXNlZCBvbiB0aGUgdGVtcGxhdGVJZCBhbmQgdGhlIHNlbGVjdGVkIHNlcnZlci4gCi0gICAgICAgIFNldCBmYWNldHNUb0FkZCA9IGdldEZhY2V0c1RvQWRkKFdFQl9URU1QTEFURSk7IAotICAgICAgICBTZXQgZmFjZXRzVG9BZGRNb2RpZmllZCA9IGZhY2V0c1RvQWRkOwotICAgICAgICAvL0lmIHRoZSBKMkVFIGxldmVsIGhhcyBiZWVuIHNldCwgbW9kaWZ5IHRoZSBXZWIgZmFjZXQgdmVyc2lvbiB0byBiZSBjb25zaXN0ZW50LgotICAgICAgICBpZiAoajJlZUxldmVsIT1udWxsICYmIGoyZWVMZXZlbC5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHdlYlZlcnNpb24gPSBnZXRXZWJWZXJzaW9uRnJvbUoyRUVMZXZlbChqMmVlTGV2ZWwpOwotICAgICAgICAgIGZhY2V0c1RvQWRkTW9kaWZpZWQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGZhY2V0c1RvQWRkLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy9JZiB0aGlzIGlzIHRoZSB3ZWIgZmFjZXQsIGdldCB0aGUgcmlnaHQgdmVyc2lvbi4KLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbilpdHIubmV4dCgpOwotICAgICAgICAgICAgSVByb2plY3RGYWNldCBwZiA9IHBmdi5nZXRQcm9qZWN0RmFjZXQoKTsgCi0gICAgICAgICAgICBpZiAocGYuZ2V0SWQoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHdlYmZ2ID0gcGYuZ2V0VmVyc2lvbih3ZWJWZXJzaW9uKTsKLSAgICAgICAgICAgICAgZmFjZXRzVG9BZGRNb2RpZmllZC5hZGQod2ViZnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmYWNldHNUb0FkZE1vZGlmaWVkLmFkZChwZnYpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN0YXR1cyA9IEZhY2V0VXRpbHMuYWRkRmFjZXRzVG9Qcm9qZWN0KGZwcm9qZWN0LCBmYWNldHNUb0FkZE1vZGlmaWVkKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU2V0IG5ld0ZhY2V0VmVyc2lvbnMgPSBmcHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIFNldCBmaXhlZEZhY2V0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0ZhY2V0VmVyc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZml4ZWRGYWNldHMuYWRkKGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN0YXR1cyA9IEZhY2V0VXRpbHMuc2V0Rml4ZWRGYWNldHNPblByb2plY3QoZnByb2plY3QsIGZpeGVkRmFjZXRzKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgcnVudGltZSAgICAgICAgCi0gICAgICAgIGlmIChmYWNldFJ1bnRpbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHN0YXR1cyA9IEZhY2V0VXRpbHMuc2V0RmFjZXRSdW50aW1lT25Qcm9qZWN0KGZwcm9qZWN0LCBmYWNldFJ1bnRpbWUpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfUFJPSkVDVF9DUkVBVElPTiwgbmV3IFN0cmluZ1tdIHsgcHJvamVjdE5hbWUgfSksIGNlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIAkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBFQVIgY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNyZWF0ZUVBUkNvbXBvbmVudCgpewotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOyAgICAgIAotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlscy5jcmVhdGVOZXdGYWNldGVkUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIElQcm9qZWN0IGNyZWF0ZWRQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGNyZWF0ZWRQcm9qZWN0KTsgICAgICAgIAotCi0gICAgICAgIC8vRGVjaWRlIHdoaWNoIGZhY2V0cyB0byBpbnN0YWxsIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZUlkIGFuZCB0aGUgc2VsZWN0ZWQgc2VydmVyLiAKLSAgICAgICAgU2V0IGZhY2V0c1RvQWRkID0gZ2V0RmFjZXRzVG9BZGQoRUFSX1RFTVBMQVRFKTsgCi0gICAgICAgIFNldCBmYWNldHNUb0FkZE1vZGlmaWVkID0gZmFjZXRzVG9BZGQ7Ci0gICAgICAgIC8vSWYgdGhlIEoyRUUgbGV2ZWwgaGFzIGJlZW4gc2V0LCBtb2RpZnkgdGhlIFdlYiBmYWNldCB2ZXJzaW9uIHRvIGJlIGNvbnNpc3RlbnQuCi0gICAgICAgIGlmIChqMmVlTGV2ZWwhPW51bGwgJiYgajJlZUxldmVsLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgd2ViVmVyc2lvbiA9IGdldEVBUlZlcnNpb25Gcm9tSjJFRUxldmVsKGoyZWVMZXZlbCk7Ci0gICAgICAgICAgZmFjZXRzVG9BZGRNb2RpZmllZCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgSXRlcmF0b3IgaXRyID0gZmFjZXRzVG9BZGQuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL0lmIHRoaXMgaXMgdGhlIGVhciBmYWNldCwgZ2V0IHRoZSByaWdodCB2ZXJzaW9uLgotICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gcGZ2ID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKWl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBJUHJvamVjdEZhY2V0IHBmID0gcGZ2LmdldFByb2plY3RGYWNldCgpOyAKLSAgICAgICAgICAgIGlmIChwZi5nZXRJZCgpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gd2ViZnYgPSBwZi5nZXRWZXJzaW9uKHdlYlZlcnNpb24pOwotICAgICAgICAgICAgICBmYWNldHNUb0FkZE1vZGlmaWVkLmFkZCh3ZWJmdik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZhY2V0c1RvQWRkTW9kaWZpZWQuYWRkKHBmdik7IAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlscy5hZGRGYWNldHNUb1Byb2plY3QoZnByb2plY3QsIGZhY2V0c1RvQWRkTW9kaWZpZWQpOwotICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTZXQgbmV3RmFjZXRWZXJzaW9ucyA9IGZwcm9qZWN0LmdldFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgU2V0IGZpeGVkRmFjZXRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbmV3RmFjZXRWZXJzaW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmaXhlZEZhY2V0cy5hZGQoZmFjZXRWZXJzaW9uLmdldFByb2plY3RGYWNldCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlscy5zZXRGaXhlZEZhY2V0c09uUHJvamVjdChmcHJvamVjdCwgZml4ZWRGYWNldHMpOwotICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBydW50aW1lICAgICAgICAKLSAgICAgICAgaWYgKGZhY2V0UnVudGltZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlscy5zZXRGYWNldFJ1bnRpbWVPblByb2plY3QoZnByb2plY3QsIGZhY2V0UnVudGltZSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAKLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1BST0pFQ1RfQ1JFQVRJT04sIG5ldyBTdHJpbmdbXSB7IHByb2plY3ROYW1lIH0pLCBjZSk7Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIEVKQiBDb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElTdGF0dXMgY3JlYXRlRUpCQ29tcG9uZW50KCl7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7ICAgICAgCi0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBzdGF0dXMgPSBGYWNldFV0aWxzLmNyZWF0ZU5ld0ZhY2V0ZWRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgSVByb2plY3QgY3JlYXRlZFByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJRmFjZXRlZFByb2plY3QgZnByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoY3JlYXRlZFByb2plY3QpOyAgICAgICAgCi0KLSAgICAgICAgLy9EZWNpZGUgd2hpY2ggZmFjZXRzIHRvIGluc3RhbGwgYmFzZWQgb24gdGhlIHRlbXBsYXRlSWQgYW5kIHRoZSBzZWxlY3RlZCBzZXJ2ZXIuIAotICAgICAgICBTZXQgZmFjZXRzVG9BZGQgPSBnZXRGYWNldHNUb0FkZChFSkJfVEVNUExBVEUpOyAKLSAgICAgICAgU2V0IGZhY2V0c1RvQWRkTW9kaWZpZWQgPSBmYWNldHNUb0FkZDsKLSAgICAgICAgLy9JZiB0aGUgSjJFRSBsZXZlbCBoYXMgYmVlbiBzZXQsIG1vZGlmeSB0aGUgV2ViIGZhY2V0IHZlcnNpb24gdG8gYmUgY29uc2lzdGVudC4KLSAgICAgICAgaWYgKGoyZWVMZXZlbCE9bnVsbCAmJiBqMmVlTGV2ZWwubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB3ZWJWZXJzaW9uID0gZ2V0RUpCVmVyc2lvbkZyb21KMkVFTGV2ZWwoajJlZUxldmVsKTsKLSAgICAgICAgICBmYWNldHNUb0FkZE1vZGlmaWVkID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICBJdGVyYXRvciBpdHIgPSBmYWNldHNUb0FkZC5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vSWYgdGhpcyBpcyB0aGUgd2ViIGZhY2V0LCBnZXQgdGhlIHJpZ2h0IHZlcnNpb24uCi0gICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBwZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24paXRyLm5leHQoKTsKLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXQgcGYgPSBwZnYuZ2V0UHJvamVjdEZhY2V0KCk7IAotICAgICAgICAgICAgaWYgKHBmLmdldElkKCkuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiB3ZWJmdiA9IHBmLmdldFZlcnNpb24od2ViVmVyc2lvbik7Ci0gICAgICAgICAgICAgIGZhY2V0c1RvQWRkTW9kaWZpZWQuYWRkKHdlYmZ2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZmFjZXRzVG9BZGRNb2RpZmllZC5hZGQocGZ2KTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdGF0dXMgPSBGYWNldFV0aWxzLmFkZEZhY2V0c1RvUHJvamVjdChmcHJvamVjdCwgZmFjZXRzVG9BZGRNb2RpZmllZCk7Ci0gICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNldCBuZXdGYWNldFZlcnNpb25zID0gZnByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpOwotICAgICAgICBTZXQgZml4ZWRGYWNldHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdGYWNldFZlcnNpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZpeGVkRmFjZXRzLmFkZChmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlscy5zZXRGaXhlZEZhY2V0c09uUHJvamVjdChmcHJvamVjdCwgZml4ZWRGYWNldHMpOwotICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBydW50aW1lICAgICAgICAKLSAgICAgICAgaWYgKGZhY2V0UnVudGltZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlscy5zZXRGYWNldFJ1bnRpbWVPblByb2plY3QoZnByb2plY3QsIGZhY2V0UnVudGltZSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAKLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9DUkVBVEVfRUpCX0NPTVBPTkVOVCwgbmV3IFN0cmluZ1tdIHsgcHJvamVjdE5hbWUgfSksIGNlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAKLQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gQXBwbGljYXRpb24gQ2xpZW50IGNvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjcmVhdGVBcHBDbGllbnRDb21wb25lbnQoKQotICAgIHsKLSAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgICAgICAKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHN0YXR1cyA9IEZhY2V0VXRpbHMuY3JlYXRlTmV3RmFjZXRlZFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBJUHJvamVjdCBjcmVhdGVkUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIElGYWNldGVkUHJvamVjdCBmcHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShjcmVhdGVkUHJvamVjdCk7ICAgICAgICAKLQotICAgICAgICAvL0RlY2lkZSB3aGljaCBmYWNldHMgdG8gaW5zdGFsbCBiYXNlZCBvbiB0aGUgdGVtcGxhdGVJZCBhbmQgdGhlIHNlbGVjdGVkIHNlcnZlci4gCi0gICAgICAgIFNldCBmYWNldHNUb0FkZCA9IGdldEZhY2V0c1RvQWRkKEFQUENMSUVOVF9URU1QTEFURSk7IAotICAgICAgICBTZXQgZmFjZXRzVG9BZGRNb2RpZmllZCA9IGZhY2V0c1RvQWRkOwotICAgICAgICAvL0lmIHRoZSBKMkVFIGxldmVsIGhhcyBiZWVuIHNldCwgbW9kaWZ5IHRoZSBXZWIgZmFjZXQgdmVyc2lvbiB0byBiZSBjb25zaXN0ZW50LgotICAgICAgICBpZiAoajJlZUxldmVsIT1udWxsICYmIGoyZWVMZXZlbC5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHdlYlZlcnNpb24gPSBnZXRBcHBDbGllbnRWZXJzaW9uRnJvbUoyRUVMZXZlbChqMmVlTGV2ZWwpOwotICAgICAgICAgIGZhY2V0c1RvQWRkTW9kaWZpZWQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGZhY2V0c1RvQWRkLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy9JZiB0aGlzIGlzIHRoZSB3ZWIgZmFjZXQsIGdldCB0aGUgcmlnaHQgdmVyc2lvbi4KLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbilpdHIubmV4dCgpOwotICAgICAgICAgICAgSVByb2plY3RGYWNldCBwZiA9IHBmdi5nZXRQcm9qZWN0RmFjZXQoKTsgCi0gICAgICAgICAgICBpZiAocGYuZ2V0SWQoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHdlYmZ2ID0gcGYuZ2V0VmVyc2lvbih3ZWJWZXJzaW9uKTsKLSAgICAgICAgICAgICAgZmFjZXRzVG9BZGRNb2RpZmllZC5hZGQod2ViZnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmYWNldHNUb0FkZE1vZGlmaWVkLmFkZChwZnYpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN0YXR1cyA9IEZhY2V0VXRpbHMuYWRkRmFjZXRzVG9Qcm9qZWN0KGZwcm9qZWN0LCBmYWNldHNUb0FkZE1vZGlmaWVkKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU2V0IG5ld0ZhY2V0VmVyc2lvbnMgPSBmcHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIFNldCBmaXhlZEZhY2V0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0ZhY2V0VmVyc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZml4ZWRGYWNldHMuYWRkKGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBGYWNldFV0aWxzLnNldEZpeGVkRmFjZXRzT25Qcm9qZWN0KGZwcm9qZWN0LCBmaXhlZEZhY2V0cyk7Ci0gICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy9TZXQgdGhlIHJ1bnRpbWUgICAgICAgIAotICAgICAgICBpZiAoZmFjZXRSdW50aW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXMgPSBGYWNldFV0aWxzLnNldEZhY2V0UnVudGltZU9uUHJvamVjdChmcHJvamVjdCwgZmFjZXRSdW50aW1lKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIAotICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX0NSRUFURV9BUFBDTElFTlRfQ09NUE9ORU5ULCBuZXcgU3RyaW5nW10geyBwcm9qZWN0TmFtZSB9KSwgY2UpOwotICAgICAgfQotICAgICAgICAKLSAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgRmxleGlibGUgSmF2YSBQcm9qZWN0IHN0cnVjdHVyZQotCSAqIFRoaXMgcHJvamVjdCBpcyByZXF1aXJlZCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgCi0JICogQHJldHVybgotCSAqIAotCSAqIE5vdGU6IFRoaXMgY2FsbCBtYXkgbm90IGJlIG5lY2Vzc2FyeSBvbmNlIEoyRUUgaW1wbGVtZW50cyBjcmVhdGluZyBhIGZsZXggcHJvamVjdCBhdXRvbWF0aWNhbGx5Ci0JICogCQl3aXRoIHRoZSBjcmVhdGlvbiBvZiBjb21wb25lbnRzLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNyZWF0ZUZsZXhpYmxlSmF2YVByb2plY3QoKXsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl0cnkKLQkJewotCQkgIElEYXRhTW9kZWwgcHJvamVjdEluZm8gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCSAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLHByb2plY3ROYW1lKTsKLSAgCi0JCSAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IG51bGw7Ci0JCSAgaWYoIHNlcnZlckluc3RhbmNlSWRfID09IG51bGwgKQotCQkgIHsKLQkJCS8vIFdlIGRvbid0IGhhdmUgYSBzZXJ2ZXIgaW5zdGFuY2Ugc28gd2Ugd2lsbCBnZXQgdGhlIGZpcnN0IHJ1bnRpbWVUYXJnZXQgZnJvbSB0aGUgZmFjdG9yeSBJRC4KLQkJCXJ1bnRpbWVUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQsIFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldE1vZHVsZVR5cGUobW9kdWxlVHlwZSksIGoyZWVMZXZlbCk7CQkKLQkJICB9Ci0JCSAgZWxzZQotCQkgIHsKLQkJCS8vIFdlIGhhdmUgYSBzZXJ2ZXIgaW5zdGFuY2Ugc28gd2Ugd2lsbCBqdXN0IGdldCBpdCdzIHJ1bnRpbWVUYXJnZXRJZC4KLQkJCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKCBzZXJ2ZXJJbnN0YW5jZUlkXyApOwotCQkJcnVudGltZVRhcmdldElkID0gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRJZCgpOyAgCi0JCSAgfQotCQkgIAotCQkgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElGbGV4aWJsZUphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lELHJ1bnRpbWVUYXJnZXRJZCk7Ci0JCSAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1NFUlZFUl9UQVJHRVQsQm9vbGVhbi5UUlVFKTsKLQkJICBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wID0gcHJvamVjdEluZm8uZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQkgIGlmIChlbnYhPW51bGwpCi0JCQkgIG9wLmV4ZWN1dGUoIG1vbml0b3JfLCBudWxsKTsKLQkJICBlbHNlIAotCQkJICBvcC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfQ1JFQVRFX0ZMRVhfUFJPSkVULCBuZXcgU3RyaW5nW117cHJvamVjdE5hbWV9KSwgZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsJCQotCX0KLSAgICAKLSAgICAgIC8qCi0gICAgICAgKiBAcmV0dXJuIFNldCBSZXR1cm5zIHRoZSBTZXQgb2YgZmFjZXRzIHRvIGFkZCB0byB0aGUgbmV3IHByb2plY3QsIAotICAgICAgICogY2hvb3NpbmcgdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgZWFjaCBmYWNldCB0aGF0IHdvcmtzIG9uIHRoZSBzZWxlY3RlZCBzZXJ2ZXIuCi0gICAgICAgKi8KLSAgICAgIHByaXZhdGUgU2V0IGdldEZhY2V0c1RvQWRkKFN0cmluZyB0ZW1wbGF0ZUlkKQotICAgICAgewotICAgICAgICBTZXQgZmFjZXRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBmYWNldCBydW50aW1lLgotICAgICAgICBzZXRGYWNldFJ1bnRpbWUoKTsKLSAgICAgICAgaWYgKGZhY2V0UnVudGltZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgdGVtcGxhdGUgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSh0ZW1wbGF0ZUlkKTsKLSAgICAgICAgICBTZXQgdGVtcGxhdGVGYWNldHMgPSB0ZW1wbGF0ZS5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgICBJdGVyYXRvciB0ZW1wbGF0ZUZhY2V0c0l0ciA9IHRlbXBsYXRlRmFjZXRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKHRlbXBsYXRlRmFjZXRzSXRyLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJUHJvamVjdEZhY2V0IGZpeGVkRmFjZXQgPSAoSVByb2plY3RGYWNldCl0ZW1wbGF0ZUZhY2V0c0l0ci5uZXh0KCk7Ci0gICAgICAgICAgICBMaXN0IHZlcnNpb25zID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbnMgPSBmaXhlZEZhY2V0LmdldFNvcnRlZFZlcnNpb25zKGZhbHNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFZlcnNpb25Gb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNldCB2ZXJzaW9uU2V0ID0gZml4ZWRGYWNldC5nZXRWZXJzaW9ucygpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHZlcnNpb25TZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25zLmFkZChpdHIubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IGZpeGVkRmFjZXQuZ2V0VmVyc2lvbnMoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSB2ZXJzaW9uU2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucy5hZGQoaXRyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIEl0ZXJhdG9yIHZlcnNpb25zSXRyID0gdmVyc2lvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlKHZlcnNpb25zSXRyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gcGZ2ID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKXZlcnNpb25zSXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgU2V0IHBmdnMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgICBwZnZzLmFkZChwZnYpOyAgICAgICAgICAgCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvL0NoZWNrIGFnYWluc3QgUnVudGltZQotICAgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5kb2VzUnVudGltZVN1cHBvcnRGYWNldHMoZmFjZXRSdW50aW1lLCBwZnZzKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy9XZSBoYXZlIGEgbWF0Y2guIEFkZCB0aGlzIG9uZSB0byB0aGUgbWFzdGVyIHNldC4KLSAgICAgICAgICAgICAgICAgIGZhY2V0cy5hZGQocGZ2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZhY2V0cyA9IEZhY2V0VXRpbHMuZ2V0SW5pdGlhbEZhY2V0VmVyc2lvbnNGcm9tVGVtcGxhdGUodGVtcGxhdGVJZCk7Ci0gICAgICAgIH0KLSAgICAgCi0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFjZXRzOwotICAgICAgfQotICAgICAgCi0gICAgICBwcml2YXRlIHZvaWQgc2V0RmFjZXRSdW50aW1lKCkKLSAgICAgIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChzZXJ2ZXJJbnN0YW5jZUlkXyAhPSBudWxsICYmIHNlcnZlckluc3RhbmNlSWRfLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJbnN0YW5jZUlkXyk7Ci0gICAgICAgICAgSVJ1bnRpbWUgc1J1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotICAgICAgICAgIGZhY2V0UnVudGltZSA9IEZhY2V0VXRpbC5nZXRSdW50aW1lKHNSdW50aW1lKTsgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvL0ZpbmQgYSBub24gU3R1YiBydW50aW1lIHRoYXQgbWF0Y2hlcyB0aGlzIHNlcnZlciB0eXBlCi0gICAgICAgICAgSVJ1bnRpbWUgc2VydmVyUnVudGltZSA9IFNlcnZlclV0aWxzLmdldE5vblN0dWJSdW50aW1lKHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgICAgICAgaWYgKHNlcnZlclJ1bnRpbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNldFJ1bnRpbWUgPSBGYWNldFV0aWwuZ2V0UnVudGltZShzZXJ2ZXJSdW50aW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vQWNjZXB0IHN0dWIgcnVudGltZS4KLSAgICAgICAgICAgIElTZXJ2ZXJUeXBlIHN0ID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWQpOwotICAgICAgICAgICAgU3RyaW5nIHJ1bnRpbWVUeXBlSWQgPSBzdC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7ICAgCi0gICAgICAgICAgICAvL0ZpbmQgdGhlIGZhY2V0IHJ1bnRpbWUKLSAgICAgICAgICAgIElSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElSdW50aW1lIHNSdW50aW1lID0gcnVudGltZXNbaV07Ci0gICAgICAgICAgICAgIGlmIChzUnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVUeXBlSWQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXRSdW50aW1lID0gRmFjZXRVdGlsLmdldFJ1bnRpbWUoc1J1bnRpbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgICAgIAotICAgIAotICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2ViVmVyc2lvbkZyb21KMkVFTGV2ZWwoU3RyaW5nIGoyZWVWZXJzaW9uKQotICAgewotICAgICAgICBpbnQgYVZlcnNpb24gPSBJbnRlZ2VyLnZhbHVlT2YoajJlZUxldmVsKS5pbnRWYWx1ZSgpOwotICAgICAgICBzd2l0Y2ggKGFWZXJzaW9uKSB7Ci0gICAgICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ6Ci0gICAgICAgICAgICByZXR1cm4gIjIuMiI7Ci0KLSAgICAgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLSAgICAgICAgICAgIHJldHVybiAiMi4zIjsKLQotICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOgotICAgICAgICAgICAgcmV0dXJuICIyLjQiOwotICAgICAgICAgICAgCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gIjIuNCI7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICB9Ci0JCi0gICBwcml2YXRlIFN0cmluZyBnZXRFSkJWZXJzaW9uRnJvbUoyRUVMZXZlbChTdHJpbmcgajJlZVZlcnNpb24pCi0gICB7Ci0gICAgICAgIGludCBhVmVyc2lvbiA9IEludGVnZXIudmFsdWVPZihqMmVlTGV2ZWwpLmludFZhbHVlKCk7Ci0gICAgICAgIHN3aXRjaCAoYVZlcnNpb24pIHsKLSAgICAgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDoKLSAgICAgICAgICAgIHJldHVybiAiMS4xIjsKLQotICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOgotICAgICAgICAgICAgcmV0dXJuICIyLjAiOwotCi0gICAgICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ6Ci0gICAgICAgICAgICByZXR1cm4gIjIuMSI7Ci0gICAgICAgICAgICAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAiMi4xIjsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgIH0KLSAgIAotICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwQ2xpZW50VmVyc2lvbkZyb21KMkVFTGV2ZWwoU3RyaW5nIGoyZWVWZXJzaW9uKQotICAgewotICAgICAgICBpbnQgYVZlcnNpb24gPSBJbnRlZ2VyLnZhbHVlT2YoajJlZUxldmVsKS5pbnRWYWx1ZSgpOwotICAgICAgICBzd2l0Y2ggKGFWZXJzaW9uKSB7Ci0gICAgICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ6Ci0gICAgICAgICAgICByZXR1cm4gIjEuMiI7Ci0KLSAgICAgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLSAgICAgICAgICAgIHJldHVybiAiMS4zIjsKLQotICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOgotICAgICAgICAgICAgcmV0dXJuICIxLjQiOwotICAgICAgICAgICAgCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gIjEuNCI7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICB9Ci0gICAKLSAgIHByaXZhdGUgU3RyaW5nIGdldEVBUlZlcnNpb25Gcm9tSjJFRUxldmVsKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgIHsKLSAgICAgICAgaW50IGFWZXJzaW9uID0gSW50ZWdlci52YWx1ZU9mKGoyZWVMZXZlbCkuaW50VmFsdWUoKTsKLSAgICAgICAgc3dpdGNoIChhVmVyc2lvbikgewotICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOgotICAgICAgICAgICAgcmV0dXJuICIxLjIiOwotCi0gICAgICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ6Ci0gICAgICAgICAgICByZXR1cm4gIjEuMyI7Ci0KLSAgICAgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDoKLSAgICAgICAgICAgIHJldHVybiAiMS40IjsKLSAgICAgICAgICAgIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuICIxLjQiOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgfQotICAgCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlTmFtZShTdHJpbmcgbW9kdWxlTmFtZSkKLQl7Ci0JCXRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7Ci0JfQkKLQotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlVHlwZSgpCi0JewotCQlyZXR1cm4gbW9kdWxlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVUeXBlKGludCBtb2R1bGVUeXBlKQotCXsKLQkJdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpCi0JewotCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogRXhwZWN0aW5nIDEyLDEzLDE0IGV0Yy4KLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKMmVlTGV2ZWwoU3RyaW5nIGxldmVsKQotCXsKLQkJaWYgKGxldmVsICE9bnVsbCAmJiBsZXZlbC5pbmRleE9mKCIuIikhPS0xKQotCQkJajJlZUxldmVsID0gSjJFRVV0aWxzLmdldEoyRUVJbnRWZXJzaW9uQXNTdHJpbmcobGV2ZWwpOwotCQllbHNlCi0JCQlqMmVlTGV2ZWwgPSBsZXZlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLQl7Ci0JCXRoaXMuc2VydmVyRmFjdG9yeUlkID0gc2VydmVyRmFjdG9yeUlkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJbnN0YW5jZUlkKCBTdHJpbmcgc2VydmVySW5zdGFuY2VJZCApCi0JewotCSAgc2VydmVySW5zdGFuY2VJZF8gPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVNb25pdG9yQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVNb25pdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTA1YmZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlTW9uaXRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vbml0b3JlZFNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklTZXJ2ZXJNb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyTW9uaXRvck1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVNb25pdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9TRVJWSUNFUyA9ICJXZWIgc2VydmljZXMiOwotCi0gIHByaXZhdGUgQm9vbGVhbiBtb25pdG9yU2VydmljZTsKLQotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVySW5zdGFuY2VJZDsKLQotICBwcml2YXRlIEludGVnZXIgbW9uaXRvcmVkUG9ydDsKLQotICBwdWJsaWMgQ3JlYXRlTW9uaXRvckNvbW1hbmQoKSB7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIAotICAgIGlmIChtb25pdG9yU2VydmljZSAhPSBudWxsICYmIG1vbml0b3JTZXJ2aWNlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2aWNlU2VydmVySW5zdGFuY2VJZCk7Ci0gICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKLQotICAgICAgICAvLyBJTW9uaXRvcmFibGVTZXJ2ZXIgbW9uaXRvcmFibGVTZXJ2ZXIgPSAoSU1vbml0b3JhYmxlU2VydmVyKQotICAgICAgICAvLyBzZXJ2ZXJEZWxlZ2F0ZTsKLSAgICAgICAgU2VydmVyUG9ydFtdIHBvcnRzID0gc2VydmVyLmdldFNlcnZlclBvcnRzKG51bGwpOwotICAgICAgICBTZXJ2ZXJQb3J0IHBvcnQgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpdCA9IDA7IGl0IDwgcG9ydHMubGVuZ3RoOyBpdCsrKSB7Ci0gICAgICAgICAgU2VydmVyUG9ydCBwID0gcG9ydHNbaXRdOwotICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHAuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiBwcm90b2NvbC50cmltKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoImh0dHAiKSkgewotICAgICAgICAgICAgcG9ydCA9IHA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgewotICAgICAgICAgIElTZXJ2ZXJNb25pdG9yTWFuYWdlciBzZXJ2ZXJNb25pdG9yTWFuYWdlciA9IFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgSU1vbml0b3JlZFNlcnZlclBvcnRbXSBtb25pdG9yZWRQb3J0cyA9IHNlcnZlck1vbml0b3JNYW5hZ2VyLmdldE1vbml0b3JlZFBvcnRzKHNlcnZlcik7Ci0gICAgICAgICAgZm9yIChpbnQgaXQyID0gMDsgaXQyIDwgbW9uaXRvcmVkUG9ydHMubGVuZ3RoOyBpdDIrKykgewotICAgICAgICAgICAgSU1vbml0b3JlZFNlcnZlclBvcnQgaW1zUG9ydCA9IG1vbml0b3JlZFBvcnRzW2l0Ml07Ci0gICAgICAgICAgICBpZiAocG9ydC5nZXRQb3J0KCkgPT0gaW1zUG9ydC5nZXRTZXJ2ZXJQb3J0KCkuZ2V0UG9ydCgpICYmIGhhc0NvbnRlbnRXZWJTZXJ2aWNlcyhpbXNQb3J0KSkgLy8gcG9ydAotICAgICAgICAgICAgLy8gYWxyZWFkeQotICAgICAgICAgICAgLy8gYmVpbmcKLSAgICAgICAgICAgIC8vIG1vbml0b3JlZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIWltc1BvcnQuaXNTdGFydGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgc2VydmVyTW9uaXRvck1hbmFnZXIuc3RhcnRNb25pdG9yKGltc1BvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgSVN0YXR1cyBlcnJvciA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgU3RyaW5nLnZhbHVlT2YocG9ydC5nZXRQb3J0KCkpLCBzZXJ2ZXIuZ2V0TmFtZSgpfSksIGNlKTsKLSAgICAgICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoZXJyb3IpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtb25pdG9yZWRQb3J0ID0gbmV3IEludGVnZXIoaW1zUG9ydC5nZXRNb25pdG9yUG9ydCgpKTsKLSAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJTW9uaXRvcmVkU2VydmVyUG9ydCBpbXNQb3J0ID0gc2VydmVyTW9uaXRvck1hbmFnZXIuY3JlYXRlTW9uaXRvcihzZXJ2ZXIsIHBvcnQsIC0xLCBuZXcgU3RyaW5nW10geyBXRUJfU0VSVklDRVN9KTsKLSAgICAgICAgICAgIHNlcnZlck1vbml0b3JNYW5hZ2VyLnN0YXJ0TW9uaXRvcihpbXNQb3J0KTsKLSAgICAgICAgICAgIG1vbml0b3JlZFBvcnQgPSBuZXcgSW50ZWdlcihpbXNQb3J0LmdldE1vbml0b3JQb3J0KCkpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBJU3RhdHVzIGVycm9yID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SLCBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihwb3J0LmdldFBvcnQoKSksIHNlcnZlci5nZXROYW1lKCl9KSwgY2UpOwotICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvcik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgSVN0YXR1cyBpbmZvID0gU3RhdHVzVXRpbHMuaW5mb1N0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfSU5GT19NT05JVE9SSU5HX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgc2VydmVyLmdldE5hbWUoKX0pICk7Ci0gICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRJbmZvKGluZm8pOwotICAgICAgICAgIHJldHVybiBpbmZvOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGhhc0NvbnRlbnRXZWJTZXJ2aWNlcyhJTW9uaXRvcmVkU2VydmVyUG9ydCBpbXNQb3J0KSB7Ci0gICAgU3RyaW5nW10gY29udGVudHMgPSBpbXNQb3J0LmdldENvbnRlbnRUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKyspCi0gICAgICBpZiAoV0VCX1NFUlZJQ0VTLmVxdWFscyhjb250ZW50c1tpXSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcikgewotICAgIHRoaXMuc2VydmljZVNlcnZlckluc3RhbmNlSWQgPSB0eXBlUnVudGltZVNlcnZlci5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVySW5zdGFuY2VJZChTdHJpbmcgc2VydmljZVNlcnZlckluc3RhbmNlSWQpIHsKLSAgICB0aGlzLnNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkID0gc2VydmljZVNlcnZlckluc3RhbmNlSWQ7Ci0gIH0KLQotICBwdWJsaWMgSW50ZWdlciBnZXRNb25pdG9yZWRQb3J0KCkgewotICAgIHJldHVybiBtb25pdG9yZWRQb3J0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoQm9vbGVhbiB2YWx1ZSkgewotICAgIG1vbml0b3JTZXJ2aWNlID0gdmFsdWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVNlcnZlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlU2VydmVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTMxZTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlU2VydmVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotCXByaXZhdGUgU3RyaW5nIHNlcnZlckluc3RhbmNlSWQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNlcnZlciBvZiB0aGUgZmFjdG9yeSBpZAotCSAqIE5vdGUxOiBDaGVja2luZyBmb3Igc2VydmVyIGluc3RhbmNlID09IG51bGwgaXMgZG9uZSBpbiB0aGUgUHJlU2VydmljZS9DbGllbnRJbnN0YWxsQ29tbWFuZHMKLQkgKiBOb3RlMjogUmVwb3J0aW5nIG9mIGVycm9ycyBpcyBkb25lIGluIFByZVNlcnZpY2UvQ2xpZW50SW5zdGFsbENvbW1hbmRzOyBzaW1wbHkgcmV0dXJuIHRoZSBzdGF0dXMuCi0JICovCi0JcHVibGljIENyZWF0ZVNlcnZlckNvbW1hbmQoKXsKLQl9Ci0JCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCWlmIChzZXJ2ZXJGYWN0b3J5SWQ9PW51bGwpewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfQ1JFQVRFX1NFUlZFUiApOwotCQkJcmV0dXJuIHN0YXR1czsJCQkKLQkJfQotCQkKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDID0gbnVsbDsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQl0cnkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLQkJCWlmIChzZXJ2ZXJUeXBlIT1udWxsKSB7Ci0JCQkJCi0JCQkJLy9DaG9vc2UgYSBSdW50aW1lIHdoaWNoIGlzIG5vdCBhIHN0dWIKLQkJCQlJUnVudGltZSBub25TdHViUnVudGltZSA9IG51bGw7Ci0JCQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlclV0aWwuZ2V0UnVudGltZXMobnVsbCwgbnVsbCk7Ci0JCQkJU3RyaW5nIHNlcnZlclJ1bnRpbWVUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lc1tpXTsKLQkJCQkJU3RyaW5nIHRoaXNSdW50aW1lVHlwZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCQkJCWlmICh0aGlzUnVudGltZVR5cGVJZC5lcXVhbHMoc2VydmVyUnVudGltZVR5cGVJZCkgJiYgIXJ1bnRpbWUuaXNTdHViKCkpIHsKLQkJCQkgICAgICAgIC8vRm91bmQgYW4gYXBwcm9wcmlhdGUgSVJ1bnRpbWUgdGhhdCBpcyBub3QgYSBzdHViCi0JCQkJCQlub25TdHViUnVudGltZSA9IHJ1bnRpbWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJCi0JCQkJaWYgKG5vblN0dWJSdW50aW1lPT1udWxsKQotCQkJCXsJCQkJCQotCQkJCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU1RVQl9PTkxZLG5ldyBTdHJpbmdbXXtzZXJ2ZXJGYWN0b3J5SWR9KSApOwotCQkJCQlyZXR1cm4gc3RhdHVzOwkJCQkJCi0JCQkJfQotCQkJCQotCQkJCWlmIChlbnYhPW51bGwpCi0JCQkJewotCQkJCQlzZXJ2ZXJXQyA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKG51bGwsIG51bGwsIG5vblN0dWJSdW50aW1lLCBtb25pdG9yICk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CQkJCQkKLQkJCQkJc2VydmVyV0MgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihudWxsLCBudWxsLCBub25TdHViUnVudGltZSwgbnVsbCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChzZXJ2ZXJXQyAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbnYhPW51bGwpCi0JCQkJCQlzZXJ2ZXIgPSBzZXJ2ZXJXQy5zYXZlQWxsKHRydWUsIG1vbml0b3IgKTsKLQkJCQkJZWxzZQotCQkJCQkJc2VydmVyID0gc2VydmVyV0Muc2F2ZUFsbCh0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9DUkVBVEVfU0VSVkVSLCBjZSk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQkvLyBzZXQgc2VydmVySW5zdGFuY2VJZAotCQlpZiAoc2VydmVyIT1udWxsKQotCQkJc2VydmVySW5zdGFuY2VJZCA9IHNlcnZlci5nZXRJZCgpOwotCQllbHNlIHsKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9DUkVBVEVfU0VSVkVSICk7CQkJCi0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeWlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0JewotCQl0aGlzLnNlcnZlckZhY3RvcnlJZCA9IHNlcnZlckZhY3RvcnlJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluc3RhbmNlSWQoKQotCXsKLQkJcmV0dXJuIHNlcnZlckluc3RhbmNlSWQ7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9EaXNhYmxlQnVpbGRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVCdWlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwZDJjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVCdWlsZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGUuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBEaXNhYmxlQnVpbGRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0KLSAgcHJpdmF0ZSBWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyXzsKLSAgLyoqCi0gICAqIENUT1I7Ci0gICAqLwotICBwdWJsaWMgRGlzYWJsZUJ1aWxkQ29tbWFuZCgpCi0gIHsKLQotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7ICAgIAotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIFByb2dyZXNzVXRpbHMucmVwb3J0KCBtb25pdG9yLCBDb25zdW1wdGlvbk1lc3NhZ2VzLlRBU0tfREVTQ19XRUJTRVJWSUNFX0RJU0FCTEVfQlVJTEQpOwotCi0gICAgaWYgKG1hbmFnZXJfIT1udWxsKSB7Ci0gICAgICBtYW5hZ2VyXy5kaXNhYmxlQXV0b0J1aWxkKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtb2RlbAotICAgKiAKLSAgICogQHBhcmFtIG1vZGVsCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbCBtb2RlbCkgewotICB9ICAKLSAgCi0gIAotICAvKioKLSAgICogQHBhcmFtIG1hbmFnZXJfIFRoZSBtYW5hZ2VyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uTWFuYWdlcihWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgdGhpcy5tYW5hZ2VyXyA9IG1hbmFnZXI7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9EaXNhYmxlVmFsaWRhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vRGlzYWJsZVZhbGlkYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTNkYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9EaXNhYmxlVmFsaWRhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGUuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRGlzYWJsZVZhbGlkYXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0KLSAgcHJpdmF0ZSBWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0KLSAgLyoqCi0gICAqIENUT1I7Ci0gICAqLwotICBwdWJsaWMgRGlzYWJsZVZhbGlkYXRpb25Db21tYW5kKCkgewotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgUHJvZ3Jlc3NVdGlscy5yZXBvcnQobW9uaXRvciwgQ29uc3VtcHRpb25NZXNzYWdlcy5UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT04pOwotCi0gICAgSVByb2plY3QgcHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0XzsKLSAgICBpZiAocHJvamVjdCAhPSBudWxsKSBtYW5hZ2VyXy5kaXNhYmxlVmFsaWRhdGlvbkZvclByb2plY3QocHJvamVjdCk7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtYW5hZ2VyXwotICAgKiAgICAgICAgICAgIFRoZSBtYW5hZ2VyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uTWFuYWdlcihWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgdGhpcy5tYW5hZ2VyXyA9IG1hbmFnZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KXsKLSAgICB0aGlzLnNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0dldE1vbml0b3JDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0dldE1vbml0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGNkNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9HZXRNb25pdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDYxMiAgIDE0NjU2NCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA3MjggICAxNDU0MjYga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLS8vIFRPRE86IEdldCByaWQgb2YgdGhpcy4gQSByZXBsYWNlbWVudCBpcyBpbiBvcmcuZWNsaXBzZS53c3Qud3MuCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV1NETFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3JXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk1vbml0b3JDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgR2V0TW9uaXRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIGJvb2xlYW4gbW9uaXRvclNlcnZpY2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGU7Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5RW5kcG9pbnQ7Ci0KLSAgcHVibGljIEdldE1vbml0b3JDb21tYW5kKCkKLSAgewotICAgIG1vbml0b3JTZXJ2aWNlID0gdHJ1ZTsKLSAgICBjcmVhdGUgPSB0cnVlOwotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52ID0gZ2V0RW52aXJvbm1lbnQoKTsKLSAgICAKLSAgICBlbmRwb2ludHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKG1vbml0b3JTZXJ2aWNlICYmIHdzZGxVUkkgIT0gbnVsbCAmJiB3c2RsVVJJLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgCXdlYlNlcnZpY2VzUGFyc2VyID0gV1NETFBhcnNlckZhY3RvcnkuZ2V0V1NETFBhcnNlcigpOwotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBNYXAgc2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3Igc2VydmljZXNJdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHNlcnZpY2VzSXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXNlcnZpY2VzSXQubmV4dCgpOwotICAgICAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHBvcnRzSXQgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBwb3J0c0l0Lmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgUG9ydCB3c2RsUG9ydCA9IChQb3J0KXBvcnRzSXQubmV4dCgpOwotICAgICAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IHdzZGxQb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBleHRFbGVtZW50c0l0ID0gZXh0RWxlbWVudHMuaXRlcmF0b3IoKTsgZXh0RWxlbWVudHNJdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1lbnRzSXQubmV4dCgpOwotICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnQgPSBudWxsOwotICAgICAgICAgICAgICBVUkwgZW5kcG9pbnRVUkwgPSBudWxsOwotICAgICAgICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKQotICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gKChTT0FQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICAgICAgICBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpCi0gICAgICAgICAgICAgICAgZW5kcG9pbnQgPSAoKEhUVFBBZGRyZXNzKWV4dEVsZW1lbnQpLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgICAgIGlmIChlbmRwb2ludCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVUkwgPSBuZXcgVVJMKGVuZHBvaW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChlbmRwb2ludFVSTCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gZW5kcG9pbnRVUkwuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGVuZHBvaW50VVJMLmdldEhvc3QoKTsKLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IGVuZHBvaW50VVJMLmdldFBvcnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocG9ydCA9PSAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoImh0dHAiLmVxdWFsc0lnbm9yZUNhc2UocHJvdG9jb2wpKQotICAgICAgICAgICAgICAgICAgICBwb3J0ID0gODA7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgiaHR0cHMiLmVxdWFsc0lnbm9yZUNhc2UocHJvdG9jb2wpKQotICAgICAgICAgICAgICAgICAgICBwb3J0ID0gNDQzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiBwcm90b2NvbC5zdGFydHNXaXRoKCJodHRwIikgJiYgaG9zdCAhPSBudWxsICYmIGhvc3QubGVuZ3RoKCkgPiAwICYmIHBvcnQgIT0gLTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgSU1vbml0b3IgbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICBJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLSAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtb25pdG9ycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3QuZXF1YWxzSWdub3JlQ2FzZShtb25pdG9yc1tpXS5nZXRSZW1vdGVIb3N0KCkpICYmIHBvcnQgPT0gbW9uaXRvcnNbaV0uZ2V0UmVtb3RlUG9ydCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgbSA9IG1vbml0b3JzW2ldOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAobSA9PSBudWxsICYmIGNyZWF0ZSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1vbml0b3JlZFBvcnQgPSBTb2NrZXRVdGlsLmZpbmRVbnVzZWRQb3J0KDUwMDAsIDE1MDAwKTsKLSAgICAgICAgICAgICAgICAgICAgSU1vbml0b3JXb3JraW5nQ29weSBtb25pdG9yV29ya2luZ0NvcHkgPSBNb25pdG9yQ29yZS5jcmVhdGVNb25pdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3JXb3JraW5nQ29weS5zZXRMb2NhbFBvcnQobW9uaXRvcmVkUG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3JXb3JraW5nQ29weS5zZXRSZW1vdGVIb3N0KGhvc3QpOwotICAgICAgICAgICAgICAgICAgICBtb25pdG9yV29ya2luZ0NvcHkuc2V0UmVtb3RlUG9ydChwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvcldvcmtpbmdDb3B5LnNldFByb3RvY29sKCJIVFRQIik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgbSA9IG1vbml0b3JXb3JraW5nQ29weS5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgSVN0YXR1cyB3YXJuaW5nID0gU3RhdHVzVXRpbHMud2FybmluZ1N0YXR1cyggTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IsIG5ldyBPYmplY3RbXXtTdHJpbmcudmFsdWVPZihwb3J0KSwgZW5kcG9pbnR9KSwgdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudiAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydCh3YXJuaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAobSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIAkJaWYgKCFtLmlzUnVubmluZygpKQotICAgICAgICAgICAgICAgICAgICAgIAkJCW0uc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCS8vIFVzZSB0aGUgZW5kcG9pbnQgdGhhdCBtYXRjaGVzIHdpdGggdGhlIHByb3h5IHRoZSBleHRlbnNpb24gcGFzc2VzIHRvIHVzIGlmIGl0IGlzIHNldAotICAgICAgICAgICAgICAgICAgICAgIAkJaWYgKHByb3h5RW5kcG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgIAkJCXRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCWVuZHBvaW50VVJMID0gbmV3IFVSTChwcm94eUVuZHBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgCQkJICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICAgICAgCQkJCS8vIGlnbm9yZSBwcm94eSBlbmRwb2ludCAKLSAgICAJCQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgICAgICAgIAkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihlbmRwb2ludFVSTC5nZXRQcm90b2NvbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCXNiLmFwcGVuZCgiOi8vbG9jYWxob3N0OiIpOwotICAgICAgICAgICAgICAgICAgICAgIAkJc2IuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG0uZ2V0TG9jYWxQb3J0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCXNiLmFwcGVuZChlbmRwb2ludFVSTC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgIAkJZW5kcG9pbnRzLmFkZChzYi50b1N0cmluZygpKTsKLSAgICAJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzIHdhcm5pbmcgPSBTdGF0dXNVdGlscy53YXJuaW5nU3RhdHVzKCBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUiwgbmV3IE9iamVjdFtde1N0cmluZy52YWx1ZU9mKHBvcnQpLCBlbmRwb2ludH0pLCB0KTsKLSAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHdhcm5pbmcpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShib29sZWFuIG1vbml0b3JTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5tb25pdG9yU2VydmljZSA9IG1vbml0b3JTZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENyZWF0ZShib29sZWFuIGNyZWF0ZSkKLSAgewotICAgIHRoaXMuY3JlYXRlID0gY3JlYXRlOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RW5kcG9pbnRzKCkKLSAgewotICAgIHJldHVybiBlbmRwb2ludHM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gcHJveHlFbmRwb2ludCBUaGUgcHJveHlFbmRwb2ludCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eUVuZHBvaW50KFN0cmluZyBwcm94eUVuZHBvaW50KSB7Ci0gIAl0aGlzLnByb3h5RW5kcG9pbnQgPSBwcm94eUVuZHBvaW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0phdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhZDlkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0phdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLQotLy9jb3JlIHN0dWZmCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGlzIHRvIGJlIHVzZWQgdG8gQnVpbGQgdGhlIGRhdGEgbW9kZWwKLSogZmlyc3Qgd2UgZ2V0IHRoZSBqYXZhIGNsYXNzIGFuZCB0aGVuIGJ1aWxkIHRoZSBtb2RlbAotKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gIkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJyZWZsZWN0aW9uIGZvciBhIGdpdmVuIGNsYXNzIjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9LX01FU1NBR0UgPSAgIlRoZSBtb2RlbCBoYXMgYmVlbiBidWlsdCAiOyAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gIi5qYXZhIjsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENMQVNTX0VYVEVOU0lPTiA9ICIuY2xhc3MiOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLSAgcHJpdmF0ZSBKYXZhSGVscGVycyBqYXZhQ2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nIHFuYW1lOwotICBwcml2YXRlIFN0cmluZyBwcm94eUJlYW47Ci0gCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIHdpdGggdGhlIGdpdmVuIGxhYmVsIGFuZCBkZXNjcmlwdGlvbgotICAqIAotICAqLwotICBwdWJsaWMgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kKCkKLSAgewotICB9Ci0gIAotICAvLyBzZXR0ZXJzIGZvciB0aGlzIGNvbW1hbmQKLSAgCi0gICAgCi0gIC8qKgotICAqIFRoZSBlbmQgcmVzdWx0IG9mIHRoaXMgd2hvbGUgcHJvY2VzcyBpcyB0byBnZXQgdGhlIEphdmEgQ2xhc3MKLSAgKi8KLSAgcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gamF2YUNsYXNzOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzUU5hbWUoKQotICB7Ci0gICAgICBxbmFtZSA9IHByb3h5QmVhbjsKLQkgIGlmIChxbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEpBVkFfRVhURU5TSU9OKSkgewotCQkgIHFuYW1lID0gcW5hbWUuc3Vic3RyaW5nKDAsKHFuYW1lLmxlbmd0aCgpIC01KSk7Ci0JICB9Ci0JICBpZiAocW5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChDTEFTU19FWFRFTlNJT04pKSB7Ci0JCSAgcW5hbWUgPSBxbmFtZS5zdWJzdHJpbmcoMCwocW5hbWUubGVuZ3RoKCkgLTYpKTsKLQkgIH0KLSAgIH0KLSAgICAgIAotICAvKioKLSAgKiBHZXQgdGhlIGphdmEgbW9kZWwgZnJvbSB0aGUgcmVzb3VyY2UgdGhlbiAKLSAgKiBidWlsZCB0aGUgbW9kZWwgZnJvbSB0aGUgbW9mCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7ICAgIAotIAkgIC8vanVzdCBtYWtlIHN1cmUgdGhlIHByb2plY3QgYW5kIHFuYW1lIGFyZSB0aGVyZQotICAJLy90aGV5IGFyZSBlc3NlbnRpYWwgZm9yIHRoaXMgb3BlcmF0aW9uCi0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gIAlJUHJvamVjdCBjbGllbnRJUHJvamVjdCA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShjbGllbnRQcm9qZWN0KTsKLSAgCXByb2Nlc3NRTmFtZSgpOwotICAJaWYoY2xpZW50UHJvamVjdCA9PSBudWxsIHx8IHFuYW1lID09IG51bGwpCi0gIAkgIHJldHVybiBTdGF0dXNVdGlscy53YXJuaW5nU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19XQVJOX1VOQUJMRV9UT19GSU5EX1BST1hZICk7Ci0gIAkKLSAgICB0cnkgewotCQlFTUZOYXR1cmUgbmF0dXJlID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKRU1fRU1GX05hdHVyZShjbGllbnRJUHJvamVjdCwgdHJ1ZSk7Ci0JCWphdmFDbGFzcyA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShxbmFtZSwgbmF0dXJlLmdldFJlc291cmNlU2V0KCkpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCX0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm94eUJlYW4oU3RyaW5nIHByb3h5QmVhbikKLSAgewotICAJdGhpcy5wcm94eUJlYW4gPSBwcm94eUJlYW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gIAl0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0gIAotIH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMWMzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL01hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGNsYXNzIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLQotCXByaXZhdGUgQm9vbGVhbiBpc1N0YXJ0U2VydmljZUVuYWJsZWRfOwotCXByaXZhdGUgQm9vbGVhbiBpc1Rlc3RTZXJ2aWNlRW5hYmxlZF87Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJZF87Ci0JcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBzYW1wbGVQcm9qZWN0XzsKLQlwcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSWRfOwotCXByaXZhdGUgSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcl87Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfOwotCi0JLyoqCi0JICogRGVmYXVsdCBDVE9SOwotCSAqLwotCXB1YmxpYyBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZCggKSB7Ci0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZAotCSAqLwotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0JICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkgICAgUHJvZ3Jlc3NVdGlscy5yZXBvcnQobW9uaXRvciwgQ29uc3VtcHRpb25NZXNzYWdlcy5QUk9HUkVTU19JTkZPX1NUQVJUX1dFQl9QUk9KRUNUKTsKLQkgCi0JICAgIGlmIChpc1N0YXJ0U2VydmljZUVuYWJsZWRfLmJvb2xlYW5WYWx1ZSgpICYmIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8hPW51bGwpewotCSAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgc2VydmljZSBzZXJ2ZXIgc3RhcnQ6ICIrc2VydmljZVByb2plY3RfKyIgICIrc2VydmljZVNlcnZlclR5cGVJZF8pOwotCSAgICAJU3RhcnRQcm9qZWN0Q29tbWFuZCBzcGMgPSBuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZCggKTsKLQkgICAgCXNwYy5zZXRTZXJ2aWNlUHJvamVjdChzZXJ2aWNlUHJvamVjdF8pOwotCSAgICAJc3BjLnNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoc2VydmljZVNlcnZlclR5cGVJZF8pOwotCSAgICAJc3BjLnNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfKTsKLQkgICAgCXNwYy5zZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfKTsKLQkgICAgCXNwYy5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0JICAgIAlzcGMuZXhlY3V0ZSggbnVsbCwgbnVsbCApOwotCSAgICB9Ci0JICAgIAotCSAgICBpZihpc1Rlc3RTZXJ2aWNlRW5hYmxlZF8uYm9vbGVhblZhbHVlKCkmJiBzYW1wbGVFeGlzdGluZ1NlcnZlcl8hPW51bGwgJiYgc2VydmljZUV4aXN0aW5nU2VydmVyXyE9bnVsbCAmJiAhc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfLmVxdWFscyhzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfKSl7Ci0JICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBjbGllbnQgc2VydmVyIHN0YXJ0OiAiK3NhbXBsZVByb2plY3RfKyIgICIrc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfXyk7Ci0JICAgIAlTdGFydFByb2plY3RDb21tYW5kIHNwYyA9IG5ldyBTdGFydFByb2plY3RDb21tYW5kKCApOwotCSAgICAJc3BjLnNldFNhbXBsZVByb2plY3Qoc2FtcGxlUHJvamVjdF8pOwotCSAgICAJc3BjLnNldFNhbXBsZVNlcnZlclR5cGVJRChzYW1wbGVTZXJ2ZXJUeXBlSWRfKTsKLQkgICAgCXNwYy5zZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihzYW1wbGVFeGlzdGluZ1NlcnZlcl8pOwotCSAgICAJc3BjLnNldENyZWF0aW9uU2NlbmFyaW8obmV3IEJvb2xlYW4oImZhbHNlIikpOwotCSAgICAJc3BjLnNldEVudmlyb25tZW50KCBlbnYgKTsKLQkgICAgCXNwYy5leGVjdXRlKCBudWxsLCBudWxsICk7CSAgICAJCi0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBzdGF0dXM7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBpc1N0YXJ0U2VydmljZUVuYWJsZWQgVGhlIGlzU3RhcnRTZXJ2aWNlRW5hYmxlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKEJvb2xlYW4gaXNTdGFydFNlcnZpY2VFbmFibGVkKSB7Ci0JCXRoaXMuaXNTdGFydFNlcnZpY2VFbmFibGVkXyA9IGlzU3RhcnRTZXJ2aWNlRW5hYmxlZDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGlzVGVzdFNlcnZpY2VFbmFibGVkIFRoZSBpc1Rlc3RTZXJ2aWNlRW5hYmxlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoQm9vbGVhbiBpc1Rlc3RTZXJ2aWNlRW5hYmxlZCkgewotCQl0aGlzLmlzVGVzdFNlcnZpY2VFbmFibGVkXyA9IGlzVGVzdFNlcnZpY2VFbmFibGVkOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2VydmljZUV4aXN0aW5nU2VydmVyIFRoZSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcikgewotCQl0aGlzLnNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlcnZpY2VTZXJ2ZXJUeXBlSWQgVGhlIHNlcnZpY2VTZXJ2ZXJUeXBlSWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJUeXBlSWQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSWQpIHsKLQkJdGhpcy5zZXJ2aWNlU2VydmVyVHlwZUlkXyA9IHNlcnZpY2VTZXJ2ZXJUeXBlSWQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBzZXJ2aWNlUHJvamVjdCBUaGUgc2VydmljZVByb2plY3QgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KSB7Ci0JCXRoaXMuc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzYW1wbGVFeGlzdGluZ1NlcnZlciBUaGUgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhbXBsZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpIHsKLQkJdGhpcy5zYW1wbGVFeGlzdGluZ1NlcnZlcl8gPSBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNhbXBsZVByb2plY3QgVGhlIHNhbXBsZVByb2plY3QgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoSVByb2plY3Qgc2FtcGxlUHJvamVjdCkgewotCQl0aGlzLnNhbXBsZVByb2plY3RfID0gc2FtcGxlUHJvamVjdDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNhbXBsZVNlcnZlclR5cGVJZCBUaGUgc2FtcGxlU2VydmVyVHlwZUlkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYW1wbGVTZXJ2ZXJUeXBlSWQoU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJZCkgewotCQl0aGlzLnNhbXBsZVNlcnZlclR5cGVJZF8gPSBzYW1wbGVTZXJ2ZXJUeXBlSWQ7Ci0JfQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gaXNSZXN0YXJ0UHJvamVjdE5lZWRlZCBUaGUgaXNSZXN0YXJ0UHJvamVjdE5lZWRlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZChib29sZWFuIGlzUmVzdGFydFByb2plY3ROZWVkZWQpIHsKLQkJdGhpcy5pc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyA9IGlzUmVzdGFydFByb2plY3ROZWVkZWQ7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUmVzdG9yZUJ1aWxkU3RhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVCdWlsZFN0YXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjYzYjQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUmVzdG9yZUJ1aWxkU3RhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGUuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVzdG9yZUJ1aWxkU3RhdGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLQotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXJfOwotICAKLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUjsKLSAgICovCi0gIHB1YmxpYyBSZXN0b3JlQnVpbGRTdGF0ZUNvbW1hbmQoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICBQcm9ncmVzc1V0aWxzLnJlcG9ydCggbW9uaXRvciwgQ29uc3VtcHRpb25NZXNzYWdlcy5UQVNLX0RFU0NfV0VCU0VSVklDRV9SRVNUT1JFX0JVSUxEKTsKLQotICAgIG1hbmFnZXJfLnJlc3RvcmVBdXRvQnVpbGQoKTsKLQotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcGFyYW0gbWFuYWdlcl8gVGhlIG1hbmFnZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICB0aGlzLm1hbmFnZXJfID0gbWFuYWdlcjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVWYWxpZGF0aW9uU3RhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVWYWxpZGF0aW9uU3RhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTYzMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9SZXN0b3JlVmFsaWRhdGlvblN0YXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIFJlc3RvcmVWYWxpZGF0aW9uU3RhdGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIHByaXZhdGUgVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlcl87Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gcnVuVmFsaWRhdGlvbl87Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUjsKLSAgICovCi0gIHB1YmxpYyBSZXN0b3JlVmFsaWRhdGlvblN0YXRlQ29tbWFuZCggYm9vbGVhbiBydW5WYWxpZGF0aW9uICkKLSAgewotICAgIHJ1blZhbGlkYXRpb25fID0gcnVuVmFsaWRhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgewotICAgIFByb2dyZXNzVXRpbHMucmVwb3J0KCBtb25pdG9yLCBDb25zdW1wdGlvbk1lc3NhZ2VzLlRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfVkFMSURBVElPTik7Ci0KLSAgICBtYW5hZ2VyXy5yZXN0b3JlVmFsaWRhdGlvbkZvclByb2plY3RzKCBydW5WYWxpZGF0aW9uXyApOyAgICAKLQotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgdmFsaWRhdGlvbiBtYW5hZ2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICB0aGlzLm1hbmFnZXJfID0gbWFuYWdlcjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1NrZWxldG9uTWVyZ2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1NrZWxldG9uTWVyZ2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjFkYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Ta2VsZXRvbk1lcmdlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDMzMCAxMjg4MjcgICBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA0MDMgMTI4ODI3ICAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNTI0ICAgMTQxOTI1IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmNvbW1vbi5NZXJnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRNZXJnZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBTa2VsZXRvbk1lcmdlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nW10gdXJsc187Ci0gIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lXzsKLQotICBwdWJsaWMgU2tlbGV0b25NZXJnZUNvbW1hbmQoU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0JICBwcm9qZWN0TmFtZV8gPSBwcm9qZWN0TmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVybHMoU3RyaW5nW10gdXJscykKLSAgewotICAgIHRoaXMudXJsc18gPSB1cmxzOwotICB9Ci0KLSAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgb2YgdGhlIHNrZWxldG9uIGZpbGVzIChyZXByZXNlbnRlZCBieSB1cmxzXyB3aXRoIHRoZSBwcmV2aW91cyB2ZXJzaW9uIHN0b3JlZC4JICAKLSAgLy8gVGhlIFdlYiBzZXJ2aWNlIGV4dGVuc2lvbnMgdHJpZ2dlcnMgdGhlIHN0b3Jpbmcgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIG9sZCBza2VsZXRvbiBmaWxlIGJ5IAotICAvLyBjYWxsaW5nIFdlYlNlcnZpY2VJbmZvLnNldEltcGxVUkxzKCkgYmVmb3JlIHRoZSBuZXcgc2tlbGV0b24gaXMgZ2VuZXJhdGVkIGluIHRoZSBleHRlbnNpb24ncyAKLSAgLy8gZGV2ZWxvcCgpIG1ldGhvZC4KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0gIHsKLQotCSAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCSAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQkgIFJlc291cmNlQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpOwotCSAgUGVyc2lzdGVudE1lcmdlQ29udGV4dCBtZXJnZUNvbnRleHQgPSBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lcmdlQ29udGV4dCgpOwotCSAgaWYgKG1lcmdlQ29udGV4dC5pc1NrZWxldG9uTWVyZ2VFbmFibGVkKCkpIHsKLQkJICAvLyBtZXJnZSB0aGUgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gZmlsZSB3aXRoIHRoZSBtb2RlbCBzdG9yZWQgZWFybGllcgotCi0JCSAgU3RyaW5nIG1lcmdlZENvbnRlbnQ7Ci0JCSAgU3RyaW5nIGZpbGVuYW1lOwotCQkgIElucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJICBpZiAodXJsc18gIT0gbnVsbCkgewotCQkJICBmb3IgKGludCBpID0gMDsgaSA8IHVybHNfLmxlbmd0aDsgaSsrKSB7Ci0JCQkJICBmaWxlbmFtZSA9IE1lcmdlVXRpbHMuZ2V0RmlsZUZyb21VUkwodXJsc19baV0pOwotCQkJCSAgaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKLQkJCQkJICBtZXJnZWRDb250ZW50ID0gTWVyZ2VVdGlscy5tZXJnZUZpbGUoZmlsZW5hbWUpOwotCQkJCQkgIGlmIChtZXJnZWRDb250ZW50ICE9IG51bGwpIHsKLQkJCQkJCSAgLy8gd3JpdGUgdGhlIG1lcmdlZCBjb250ZW50IGJhY2sgaW50byB0aGUgZmlsZSwgcmVzcGVjdGluZyBmaWxlIG92ZXJ3cml0ZSBwcmVmZXJlbmNlCi0JCQkJCQkgIElQYXRoIHRhcmdldFBhdGggPSBuZXcgUGF0aChmaWxlbmFtZSk7Ci0JCQkJCQkgIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWVfKTsKLQkJCQkJCSAgYnl0ZVtdIGJ1ZiA9IG51bGw7Ci0JCQkJCQkgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkgIHRyeSB7Ci0JCQkJCQkJICBidWYgPSBtZXJnZWRDb250ZW50LmdldEJ5dGVzKHByb2plY3QuZ2V0RGVmYXVsdENoYXJzZXQoKSk7Ci0JCQkJCQkJICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCQkgIGJ1ZiA9IG1lcmdlZENvbnRlbnQuZ2V0Qnl0ZXMoKTsKLQkJCQkJCQkgIH0KLQkJCQkJCSAgfSBlbHNlIHsKLQkJCQkJCQkgIGJ1ZiA9IG1lcmdlZENvbnRlbnQuZ2V0Qnl0ZXMoKTsKLQkJCQkJCSAgfQotCQkJCQkJICBpblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWYpOwotCi0JCQkJCQkgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCQkJICB0cnkgewotCQkJCQkJCQkgIEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGVBdExvY2F0aW9uKGNvbnRleHQsIHRhcmdldFBhdGgubWFrZUFic29sdXRlKCksIGluU3RyZWFtLAotCQkJCQkJCQkJCSAgbW9uaXRvciwgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLQkJCQkJCQkgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX0ZJTEVfTUVSR0UsIHVybHNfKSwgZSk7Ci0JCQkJCQkJCSAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCBzdGF0dXMgKTsKLQkJCQkJCQkgIH0KLQkJCQkJCSAgfQotCQkJCQkgIH0KLQkJCQkgIH0KLQkJCSAgfQkJCi0JCSAgfQkJCSAgCi0JICB9Ci0KLQkgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDFlMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLldlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgU3RhcnRQcm9qZWN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIAotewotCi1wcml2YXRlIEJvb2xlYW4gY3JlYXRpb25TY2VuYXJpb18gPSBCb29sZWFuLlRSVUU7Ci0KLXByaXZhdGUgYm9vbGVhbiBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXzsKLXByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3RfOwotcHJpdmF0ZSBJUHJvamVjdCBzYW1wbGVQcm9qZWN0XzsKLXByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEXzsKLXByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyXzsKLQotCi0vKioKLSAqIERlZmF1bHQgQ1RPUjsKLSAqLwotcHVibGljIFN0YXJ0UHJvamVjdENvbW1hbmQoICkgewotCi19Ci0KLS8qKgotICogRGVmYXVsdCBDVE9SOwotICovCi1wdWJsaWMgU3RhcnRQcm9qZWN0Q29tbWFuZChib29sZWFuIGNyZWF0aW9uU2NlbmFyaW8gKSB7Ci0JY3JlYXRpb25TY2VuYXJpb18gPSBuZXcgQm9vbGVhbihjcmVhdGlvblNjZW5hcmlvKTsKLX0KLQotLyoqCi0gKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gKi8KLXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotewotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOyAgICAKLSAgCi0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIFByb2dyZXNzVXRpbHMucmVwb3J0KCBtb25pdG9yLCBDb25zdW1wdGlvbk1lc3NhZ2VzLlBST0dSRVNTX0lORk9fU1RBUlRfV0VCX1BST0pFQ1QpOwotICAgIAotICAgIAotICAgIElQcm9qZWN0IHByb2plY3QgPSAoKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSA/IHNlcnZpY2VQcm9qZWN0XyA6IHNhbXBsZVByb2plY3RfKTsKLSAgICBTdHJpbmcgc2VydmVyVHlwZUlEID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlU2VydmVyVHlwZUlEXyA6IHNhbXBsZVNlcnZlclR5cGVJRF8pOwotICAgIElTZXJ2ZXIgc2VydmVyID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfIDogc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfKTsgICAKLSAgICBpZiAoc2VydmVyVHlwZUlEID09IG51bGwgJiYgc2VydmVyIT1udWxsKSB7Ci0gICAgCXNlcnZlclR5cGVJRCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICB9Ci0gICAgaWYgKHByb2plY3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfUFJPSkVDVF9OT1RfRk9VTkQgKTsgIAotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9CQotICAgIElTZXJ2ZXIgaW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUoU2VydmVyVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBzZXJ2ZXJUeXBlSUQsIHNlcnZlciwgdHJ1ZSwgbW9uaXRvciApOwotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9JTlNUQU5DRV9OT1RfRk9VTkQgKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICB0cnkKLSAgIAl7Ci0gICAJCUFic3RyYWN0U3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXJDb21tYW5kID0gbnVsbDsKLSAgIAkJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgCXN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGluc3RhbmNlLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kLlN0YXJ0U2VydmVyKHByb2plY3QsIGluc3RhbmNlLCBtb25pdG9yLCBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyk7Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAJfQotICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApCi0gIAl7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gZW1iZWRkZWRTdGF0dXM7Ci0gICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgCQlyZXR1cm4gc3RhdHVzOwotICAJfQotICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgCXsKLSAgICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0VSVkVSLCBlKTsKLSAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAJICAgcmV0dXJuIHN0YXR1czsKLSAgIAl9Ci0gICAKLX0KLQotcHVibGljIHZvaWQgc2V0Q3JlYXRpb25TY2VuYXJpbyhCb29sZWFuIGNyZWF0aW9uU2NlbmFyaW8pCi17Ci0JY3JlYXRpb25TY2VuYXJpb18gPSBjcmVhdGlvblNjZW5hcmlvOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKLXsKLSAgc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoSVByb2plY3Qgc2FtcGxlUHJvamVjdCkKLXsKLSAgc2FtcGxlUHJvamVjdF8gPSBzYW1wbGVQcm9qZWN0OwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKQotewotICBzZXJ2aWNlU2VydmVyVHlwZUlEXyA9IHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNhbXBsZVNlcnZlclR5cGVJRChTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEKQotewotICBzYW1wbGVTZXJ2ZXJUeXBlSURfID0gc2FtcGxlU2VydmVyVHlwZUlEOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIpCi17Ci0gIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0gIGlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfICE9IG51bGwpCi0gICAgc2V0U2VydmljZVNlcnZlclR5cGVJRChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcikKLXsKLSAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIGlmIChzYW1wbGVFeGlzdGluZ1NlcnZlcl8gIT0gbnVsbCkKLSAgICBzZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZChib29sZWFuIHdlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKQotewotICBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyA9IHdlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9GYWNldE1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZhY2V0TWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmFjMzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZhY2V0TWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgRmFjZXRNYXRjaGVyCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBtYXRjaDsKLSAgcHJpdmF0ZSBTZXQgZmFjZXRzVGVzdGVkOwotICBwcml2YXRlIFNldCBmYWNldHNUaGF0TWF0Y2hlZDsKLSAgcHJpdmF0ZSBTZXQgZmFjZXRzVG9BZGQ7Ci0gIAotICBwdWJsaWMgU2V0IGdldEZhY2V0c1RoYXRNYXRjaGVkKCkKLSAgewotICAgIHJldHVybiBmYWNldHNUaGF0TWF0Y2hlZDsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRGYWNldHNUaGF0TWF0Y2hlZChTZXQgZmFjZXRzVGhhdE1hdGNoZWQpCi0gIHsKLSAgICB0aGlzLmZhY2V0c1RoYXRNYXRjaGVkID0gZmFjZXRzVGhhdE1hdGNoZWQ7Ci0gIH0KLSAgcHVibGljIFNldCBnZXRGYWNldHNUb0FkZCgpCi0gIHsKLSAgICByZXR1cm4gZmFjZXRzVG9BZGQ7Ci0gIH0KLSAgcHVibGljIHZvaWQgc2V0RmFjZXRzVG9BZGQoU2V0IGZhY2V0c1RvQWRkKQotICB7Ci0gICAgdGhpcy5mYWNldHNUb0FkZCA9IGZhY2V0c1RvQWRkOwotICB9Ci0gIHB1YmxpYyBib29sZWFuIGlzTWF0Y2goKQotICB7Ci0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldE1hdGNoKGJvb2xlYW4gbWF0Y2gpCi0gIHsKLSAgICB0aGlzLm1hdGNoID0gbWF0Y2g7Ci0gIH0KLSAgcHVibGljIFNldCBnZXRGYWNldHNUZXN0ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhY2V0c1Rlc3RlZDsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRGYWNldHNUZXN0ZWQoU2V0IGZhY2V0c1Rlc3RlZCkKLSAgewotICAgIHRoaXMuZmFjZXRzVGVzdGVkID0gZmFjZXRzVGVzdGVkOwotICB9Ci0gIAotICAKLQotICAKLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZhY2V0U2V0c0J5VGVtcGxhdGVDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vRmFjZXRTZXRzQnlUZW1wbGF0ZUNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vRmFjZXRTZXRzQnlUZW1wbGF0ZUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMTMxIDEyMTA3MSAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lciAoY3JlYXRpb24pCi0gKiAyMDA2MDQyNyAgIDEyNjc4MCByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5WZXJzaW9uRm9ybWF0RXhjZXB0aW9uOwotCi0KLS8qKgotICogRmFjZXRTZXRzQnlUZW1wbGF0ZUNhY2hlIGNhY2hlcyB0aGUgc2V0cyBvZiBmYWNldCB2ZXJzaW9uIGNvbWJpbmF0aW9ucyBmb3IgdGVtcGxhdGVzLgotICovCi1wdWJsaWMgY2xhc3MgRmFjZXRTZXRzQnlUZW1wbGF0ZUNhY2hlCi17Ci0gIC8vIHNpbmdsZSBpbnN0YW5jZSBwZXIgd29ya2JlbmNoCi0gIHByaXZhdGUgc3RhdGljIEZhY2V0U2V0c0J5VGVtcGxhdGVDYWNoZSBpbnN0YW5jZV87Ci0gIAotICAvL2ZhY2V0U2V0c0J5VGVtcGxhdGVJZF86IAotICAvL2tleTogT2JqZWN0IG9mIHR5cGUgU3RyaW5nLiBTdHJpbmcgaWQgb2YgYW4gSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUuCi0gIC8vdmFsdWU6IE9iamVjdCBvZiBTZXRbXS4gQW4gYXJyYXkgb2YgU2V0cyB3aGVyZSBlYWNoIHNldCBjb250YWlucyBlbGVtZW50cyBvZiB0eXBlIElQcm9qZWN0RmFjZXRWZXJzaW9uLgotICBwcml2YXRlIEhhc2h0YWJsZSBmYWNldFNldHNCeVRlbXBsYXRlSWRfOwotICAvKioKLSAgICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgKiAKLSAgICogQHJldHVybiBBIHNpbmdsZXRvbiBGYWNldFNldHNCeVRlbXBsYXRlQ2FjaGUgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRmFjZXRTZXRzQnlUZW1wbGF0ZUNhY2hlIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgRmFjZXRTZXRzQnlUZW1wbGF0ZUNhY2hlKCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgbG9hZCgpCi0gIHsKLSAgICBmYWNldFNldHNCeVRlbXBsYXRlSWRfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGFsbCB0aGUgdmFsaWQgZmFjZXQgdmVyc2lvbiBjb21iaW5hdGlvbnMgdGhhdCBjYW4gYmUgZGVyaXZlZCBmcm9tIHRoZSBmaXhlZCBmYWNldHMKLSAgICogb2YgdGhlIGdpdmVuIHRlbXBsYXRlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRlbXBsYXRlIGhhcyB0d28gZml4ZWQgZmFjZXRzLCBBIGFuZCBCLAotICAgKiBhbmQgQSBoYXMgdmVyc2lvbnMgMS4wIGFuZCAyLjAsIEIgaGFzIHZlcnNpb25zIDEuMSwgMi4xLAotICAgKiB0aGUgZm9sbG93aW5nIGFycmF5IG9mIFNldHMgd2lsbCBiZSByZXR1cm5lZCAoYXNzdW1pbmcgZm9yIHRoZSBzYWtlIG9mIHRoZSBleGFtcGxlCi0gICAqIHRoYXQgYWxsIHRoZSBjb21iaW5hdGlvbnMgYXJlIHZhbGlkKTo8YnIvPgotICAgKiB7U2V0MSwgU2V0MiwgU2V0MywgU2V0NH0sIHdoZXJlPGJyLz4KLSAgICogU2V0MSA9IFtBMS4wLCBCMS4xXTxici8+Ci0gICAqIFNldDIgPSBbQTIuMCwgQjEuMV08YnIvPgotICAgKiBTZXQzID0gW0ExLjAsIEIyLjFdPGJyLz4KLSAgICogU2V0NCA9IFtBMi4wLCBCMi4xXTxici8+Ci0gICAqIDxici8+Ci0gICAqIEBwYXJhbSB0ZW1wbGF0ZUlkIGlkIG9mIGFuIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0KLSAgICogQHJldHVybiBTZXRbXSBBbiBhcnJheSBvZiBTZXRzIHdoZXJlIGVhY2ggc2V0IGNvbnRhaW5zIGVsZW1lbnRzIG9mIHR5cGUge0BsaW5rIElQcm9qZWN0RmFjZXRWZXJzaW9ufS4KLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2V0W10gZ2V0RmFjZXRWZXJzaW9uQ29tYmluYXRpb25zRnJvbVRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZUlkKQotICB7Ci0JLy9SZXR1cm4gdGhlIGNhY2hlZCBjb21iaW5hdGlvbnMgaWYgcHJlc2VudC4KLSAgICBTZXRbXSBjYWNoZWRDb21iaW5hdGlvbnMgPSAoU2V0W10pZmFjZXRTZXRzQnlUZW1wbGF0ZUlkXy5nZXQodGVtcGxhdGVJZCk7Ci0gICAgaWYgKGNhY2hlZENvbWJpbmF0aW9ucyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBjYWNoZWRDb21iaW5hdGlvbnM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL0NvbWJpbmF0aW9ucyBoYXZlIG5vdCB5ZXQgYmVlbiBjYWNoZWQgZm9yIHRoZSBnaXZlbiB0ZW1wbGF0ZS4gCi0gICAgICAvL0RldGVybWluZSB0aGUgY29tYmluYXRpb25zIGFuZCBjYWNoZSB0aGVtLgotICAgICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgdGVtcGxhdGUgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSh0ZW1wbGF0ZUlkKTsKLSAgICAgIFNldCBmaXhlZEZhY2V0cyA9IHRlbXBsYXRlLmdldEZpeGVkUHJvamVjdEZhY2V0cygpOwotICAgICAgCi0gICAgICAvL0NyZWF0ZSBhbiBhcnJheSBvZiBhcnJheXMuIEVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgd2lsbCBjb250YWluIHRoZSBhcnJheQotICAgICAgLy9vZiBJUHJvamVjdEZhY2V0VmVyc2lvbnMgZm9yIGVhY2ggSVByb2plY3RGYWNldCBpbiB0aGUgc2V0IG9mIGZpeGVkIGZhY2V0cy4KLSAgICAgIEl0ZXJhdG9yIGl0ciA9IGZpeGVkRmFjZXRzLml0ZXJhdG9yKCk7Ci0gICAgICBBcnJheUxpc3QgcHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cyA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAKLQotICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIElQcm9qZWN0RmFjZXQgZmFjZXQgPSAoSVByb2plY3RGYWNldCkgaXRyLm5leHQoKTsKLSAgICAgICAgTGlzdCB2ZXJzaW9ucyA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0IHRoZSBmYWNldCB2ZXJzaW9ucyBpbiBhc2NlbmRpbmcgb3JkZXIuCi0gICAgICAgICAgdmVyc2lvbnMgPSBmYWNldC5nZXRTb3J0ZWRWZXJzaW9ucyh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IGZhY2V0LmdldFZlcnNpb25zKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciB2ZXJzaW9uU2V0SXRyID0gdmVyc2lvblNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB3aGlsZSAodmVyc2lvblNldEl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbnMuYWRkKGl0ci5uZXh0KCkpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IGZhY2V0LmdldFZlcnNpb25zKCk7Ci0gICAgICAgICAgSXRlcmF0b3IgdmVyc2lvblNldEl0ciA9IHZlcnNpb25TZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICB3aGlsZSAodmVyc2lvblNldEl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgICB2ZXJzaW9ucy5hZGQoaXRyLm5leHQoKSk7Ci0gICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgCi0gICAgICAgIGlmICh2ZXJzaW9ucy5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgLy9DcmVhdGUgYW4gYXJyYXkgb2YgSVByb2plY3RGYWNldFZlcnNpb25zIGZyb20gdmVyc2lvbnMuCi0gICAgICAgICAgSXRlcmF0b3IgdmVyc2lvbkl0ciA9IHZlcnNpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgQXJyYXlMaXN0IGFycmF5T2ZWZXJzaW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgd2hpbGUgKHZlcnNpb25JdHIuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbil2ZXJzaW9uSXRyLm5leHQoKTsKLSAgICAgICAgICAgIGFycmF5T2ZWZXJzaW9uc0xpc3QuYWRkKHBmdik7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICAvL0FkZCB0aGUgYXJyYXkgb2YgdmVyc2lvbnMgdG8gdGhlIGxpc3Qgb2YgYXJyYXlzLgotICAgICAgICAgIHByb2plY3RGYWNldFZlcnNpb25BcnJheXMuYWRkKChJUHJvamVjdEZhY2V0VmVyc2lvbltdKWFycmF5T2ZWZXJzaW9uc0xpc3QudG9BcnJheShuZXcgSVByb2plY3RGYWNldFZlcnNpb25bMF0pKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbltdW10gYXJyYXlPZlByb2plY3RGYWNldFZlcnNpb25BcnJheXMgPSAoSVByb2plY3RGYWNldFZlcnNpb25bXVtdKXByb2plY3RGYWNldFZlcnNpb25BcnJheXMudG9BcnJheShuZXcgSVByb2plY3RGYWNldFZlcnNpb25bMF1bMF0pOwotICAgICAgU2V0W10gYWxsVmFsaWRDb21iaW5hdGlvbnNBcnJheSA9IEZhY2V0VXRpbHMuZ2V0RmFjZXRDb21iaW5hdGlvbnMoYXJyYXlPZlByb2plY3RGYWNldFZlcnNpb25BcnJheXMsIHRydWUpOwotICAgICAgZmFjZXRTZXRzQnlUZW1wbGF0ZUlkXy5wdXQodGVtcGxhdGVJZCwgYWxsVmFsaWRDb21iaW5hdGlvbnNBcnJheSk7Ci0gICAgICByZXR1cm4gYWxsVmFsaWRDb21iaW5hdGlvbnNBcnJheTsKLSAgICB9ICAgIAotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZhY2V0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZhY2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxNDY1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9GYWNldFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDEzMSAxMjEwNzEgICByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIgICAgIAotICogMjAwNjAyMTcgICAxMjY3NTcgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQxOSAgIDEzNzU0OCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA0MjcgICAxMjY3ODAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDUwMyAgIDEyNjgxOSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNTIzICAgMTMzNzE0IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwOTIwICAgMTU4MDYxIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuLCBEbyBub3QgYWRkIG1vZHVsZSB0byBFQVIgd2hlbiBhZGRpbmcgSjJFRSBmYWNldHMgdG8gcHJvamVjdAotICogMjAwNzAxMjQgICAxNjIzMjYga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3Qub3BlcmF0aW9ucy5FamJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5vcGVyYXRpb25zLklFamJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklVdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5JV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5WZXJzaW9uRm9ybWF0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEZhY2V0VXRpbHMgY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gZmFjZXRzIGFuZCB0ZW1wbGF0ZXMuCi0gKiA8YnIvPjxici8+Ci0gKiBUZXJtaW5vbG9neSB1c2VkIGluIHRoZSBKYXZhZG9jIGluIHRoaXMgY2xhc3MKLSAqIDx1bD4KLSAqIDxsaT48Yj5mYWNldDwvYj46IEFuIHtAbGluayBJUHJvamVjdEZhY2V0fTwvbGk+Ci0gKiA8bGk+PGI+ZmFjZXQgdmVyc2lvbjwvYj46IEFuIHtAbGluayBJUHJvamVjdEZhY2V0VmVyc2lvbn0gPC9saT4KLSAqIDxsaT48Yj5mYWNldCBydW50aW1lPC9iPjogQW4ge0BsaW5rIElSdW50aW1lfTwvbGk+Ci0gKiA8bGk+PGI+ZmFjZXRlZCBwcm9qZWN0PC9iPjogQW4ge0BsaW5rIElGYWNldGVkUHJvamVjdH0uIEEgZmFjZXRlZCBwcm9qZWN0IG1heSBiZSBvYnRhaW5lZAotICogZnJvbSBhbiBJUHJvamVjdCAoQHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlciNjcmVhdGUpPC9saT4KLSAqIDxsaT48Yj50ZW1wbGF0ZTwvYj46IEFuIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0uIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gYSBwcm9qZWN0IHR5cGUuPC9saT4KLSAqIDxsaT48Yj5yZXF1aXJlZCBmYWNldCB2ZXJzaW9uPC9iPjogQSB7QGxpbmsgUmVxdWlyZWRGYWNldFZlcnNpb259LiBVc2VkIGJ5IHNlcnZpY2VSdW50aW1lcyBhbmQgY2xpZW50UnVudGltZXMKLSAqIHRvIGlkZW50aWZ5IHdoYXQgdGhleSByZXF1aXJlIGluIHRlcm1zIG9mIGZhY2V0IHZlcnNpb25zLjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgRmFjZXRVdGlscwotewotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbGlkIHByb2plY3RzLiBWYWxpZCBwcm9qZWN0cyBpbmNsdWRlIHByb2plY3RzIHdpdGggdGhlIGZhY2V0cyBuYXR1cmUgb3IKLSAgICogcHJvamVjdHMgd2l0aCB0aGUgSmF2YSBuYXR1cmUuCi0gICAqIEByZXR1cm4gSVByb2plY3RbXSBhbiBhcnJheSBvZiB2YWxpZCBwcm9qZWN0cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFByb2plY3RzKCkKLSAgewotICAgIC8vUmV0dXJuIGFsbCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlIHRoYXQgaGF2ZSB0aGUgcHJvamVjdCBmYWNldCBuYXR1cmUgb3IgdGhhdCBkbyBub3QgaGF2ZSB0aGUgcHJvamVjdAotICAgIC8vZmFjZXQgbmF0dXJlIGJ1dCBoYXZlIHRoZSBKYXZhIG5hdHVyZS4KLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgIEFycmF5TGlzdCB2YWxpZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElGYWNldGVkUHJvamVjdCBmYWNQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3RzW2ldKTsKLSAgICAgICAgaWYgKGZhY1Byb2plY3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vQWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgICAgICAgdmFsaWRQcm9qZWN0cy5hZGQocHJvamVjdHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJaWYgKFJlc291cmNlVXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0c1tpXSkpCi0gICAgICAgIAl7Ci0gICAgICAgICAgICAgIHZhbGlkUHJvamVjdHMuYWRkKHByb2plY3RzW2ldKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7ICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIChJUHJvamVjdFtdKXZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbXXt9KTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZhY2V0IHZlcnNpb25zIG9uIHRoZSBnaXZlbiBwcm9qZWN0LgotICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgbmFtZSBvZiBhbiBleGlzdGluZyBwcm9qZWN0LgotICAgKiBAcmV0dXJucyBTZXQgY29udGFpbmluZyBlbGVtZW50cyBvZiB0eXBlIHtAbGluayBJUHJvamVjdEZhY2V0VmVyc2lvbn0uIAotICAgKiBUaGVzZSBhcmUgdGhlIGZhY2V0IHZlcnNpb25zIGN1cnJlbnRseSBpbnN0YWxsZWQgb24gdGhpcyBwcm9qZWN0LiBJZiB0aGUgcHJvamVjdAotICAgKiBpcyBhIEphdmEgcHJvamVjdCwgZmFjZXRzIGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBKYXZhIHByb2plY3QuIFJldHVybnMgbnVsbCAKLSAgICogPHVsPgotICAgKiA8bGk+aWYgdGhlIHByb2plY3QgaXMgbm90IGEgZmFjZXRlZCBwcm9qZWN0IG9yIGEgSmF2YSBwcm9qZWN0IG9yPC9saT4KLSAgICogPGxpPmlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yPC9saT4KLSAgICogPGxpPmlmIHRoZSBwcm9qZWN0IGlzIG51bGw8L2xpPgotICAgKiA8L3VsPiAgCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFNldCBnZXRGYWNldHNGb3JQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAgIFNldCBmYWNldFZlcnNpb25zID0gbnVsbDsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICBpZiAocHJvamVjdCE9bnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRmFjZXRlZFByb2plY3QgZnByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgIGlmIChmcHJvamVjdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZmFjZXRWZXJzaW9ucyA9IGZwcm9qZWN0LmdldFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvL0lmIHRoaXMgaXMgbm90IGEgZmFjZXRlZCBwcm9qZWN0LCBpdCBtYXkgc3RpbGwgYmUgb2theSBpZiBpdCBpcyBhIEphdmEgcHJvamVjdAotICAgICAgICAgIC8vYW5kIHRoZSBjbGllbnQgcnVudGltZSBzdXBwb3J0cyBhIEphdmEgcHJvamVjdC4KLSAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOyAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0KSkKLSAgICAgICAgICB7Ci0gICAgICAgIAlqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgICAgIGZhY2V0VmVyc2lvbnMgPSBGYWNldFV0aWxzLmdldEZhY2V0c0ZvckphdmFQcm9qZWN0KGphdmFQcm9qZWN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgCSAgLy9MZWF2aW5nIHRoZSBjYXRjaCBibG9jayBlbXB0eS4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGVyZQotICAgIAkgIC8vd2VyZSBhbnkgYmxvdy11cHMgaW4gdGhlIGZhY2V0IEFQSSBiZWluZyBjYWxsZWQuCi0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBmYWNldFZlcnNpb25zOwotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZhY2V0IHJ1bnRpbWUgdGhlIGdpdmVuIHByb2plY3QgaXMgYm91bmQgdG8uCi0gICAqIEBwYXJhbSBwcm9qZWN0TmFtZSBuYW1lIG9mIGFuIGV4aXN0aW5nIHByb2plY3QKLSAgICogQHJldHVybiB7QGxpbmsgSVJ1bnRpbWV9IHRoZSBwcm9qZWN0IGlzIGJvdW5kIHRvLiBSZXR1cm5zIG51bGwKLSAgICogPHVsPgotICAgKiA8bGk+aWYgdGhlIHByb2plY3QgaXMgbm90IGJvdW5kIHRvIGEgZmFjZXQgcnVudGltZTwvbGk+IAotICAgKiA8bGk+aWYgdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3Q8L2xpPgotICAgKiA8bGk+aWYgdGhlIHByb2plY3QgaXMgbnVsbDwvbGk+Ci0gICAqIDwvdWw+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGdldEZhY2V0UnVudGltZUZvclByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgaWYgKHByb2plY3QhPW51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICBpZiAoZnByb2plY3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmcHJvamVjdC5nZXRSdW50aW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgCSAgLy9MZWF2aW5nIHRoZSBjYXRjaCBibG9jayBlbXB0eS4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGVyZQotICAgIAkgIC8vd2VyZSBhbnkgYmxvdy11cHMgaW4gdGhlIGZhY2V0IEFQSSBiZWluZyBjYWxsZWQuCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2V0IG9mIGNvbWJpbmF0aW9ucyBvZiBmYWNldCB2ZXJzaW9ucyBkZXJpdmVkIGZyb20gdGhlIGZhY2V0IHZlcnNpb25zCi0gICAqIGluIHRoZSBwcm92aWRlZCBhcnJheU9mUHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cy4gRm9yIGV4YW1wbGUsIGlmIAotICAgKiBhcnJheU9mUHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cyBpcyBhIHR3byBkaW1lbnN0aW9uYWwgYXJyYXkgb2YgZmFjZXQgdmVyc2lvbnMgdGhhdCBoYXMKLSAgICogYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOjxici8+Ci0gICAqIHt7RmFjZXRBX3ZlcnNpb24xLCBGYWNldEFfdmVyc2lvbjJ9LDxici8+Ci0gICAqICB7RmFjZXRCX3ZlcnNpb24xfSw8YnIvPgotICAgKiAge0ZhY2V0Q192ZXJzaW9uMSwgRmFjZXRDX3ZlcnNpb24yfX08YnIvPgotICAgKiB0aGUgZm9sbG93aW5nIGFycmF5IG9mIFNldHMgd2lsbCBiZSByZXR1cm5lZDo8YnIvPgotICAgKiB7U2V0MSwgU2V0MiwgU2V0MywgU2V0NH0sIHdoZXJlPGJyLz4KLSAgICogU2V0MSA9IFtGYWNldEFfdmVyc2lvbjEsIEZhY2V0Ql92ZXJzaW9uMSwgRmFjZXRDX3ZlcnNpb24xXTxici8+Ci0gICAqIFNldDIgPSBbRmFjZXRBX3ZlcnNpb24yLCBGYWNldEJfdmVyc2lvbjEsIEZhY2V0Q192ZXJzaW9uMV08YnIvPgotICAgKiBTZXQzID0gW0ZhY2V0QV92ZXJzaW9uMSwgRmFjZXRCX3ZlcnNpb24xLCBGYWNldENfdmVyc2lvbjJdPGJyLz4KLSAgICogU2V0NCA9IFtGYWNldEFfdmVyc2lvbjIsIEZhY2V0Ql92ZXJzaW9uMSwgRmFjZXRDX3ZlcnNpb24yXTxici8+Ci0gICAqIDxici8+Ci0gICAqIEBwYXJhbSBhcnJheU9mUHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cyBhIHR3byBkaW1lbnNpb25hbCBhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIAotICAgKiBvZiB0eXBlIHtAbGluayBJUHJvamVjdEZhY2V0VmVyc2lvbn0KLSAgICogQHBhcmFtIHJldHVyblZhbGlkT25seSBmYWxzZSBpZiBhbGwgY29tYmluYXRpb25zIG9mIGZhY2V0IHZlcnNpb25zIGFyZSB0byBiZSByZXR1cm5lZC4gCi0gICAqIHRydWUgaWYgb25seSB2YWxpZCBjb21iaW5hdGlvbnMgb2YgZmFjZXQgdmVyc2lvbnMgYXJlIHRvIGJlIHJldHVybmVkLiAgCi0gICAqIEByZXR1cm4gU2V0W10gYW4gYXJyYXkgb2YgU2V0cywgd2hlcmUgZWFjaCBTZXQgY29udGFpbnMgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgSVByb2plY3RGYWNldFZlcnNpb259LiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU2V0W10gZ2V0RmFjZXRDb21iaW5hdGlvbnMoSVByb2plY3RGYWNldFZlcnNpb25bXVtdIGFycmF5T2ZQcm9qZWN0RmFjZXRWZXJzaW9uQXJyYXlzLCBib29sZWFuIHJldHVyblZhbGlkT25seSkgIAotICB7Ci0gICAgQXJyYXlMaXN0IGFsbENvbWJpbmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvL21heENvdW50IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdmVyc2lvbnMgaW4gZWFjaCBhcnJheSBvZiBJUHJvamVjdEZhY2V0VmVyc2lvbnMuCi0gICAgLy9pbml0aWFsaXplIGNvdW50ZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBuYXZpZ2F0ZSBhcnJheU9mUHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cy4KLSAgICBpbnQgbiA9IGFycmF5T2ZQcm9qZWN0RmFjZXRWZXJzaW9uQXJyYXlzLmxlbmd0aDsKLSAgICBpbnRbXSBtYXhDb3VudCA9IG5ldyBpbnRbbl07Ci0gICAgaW50W10gY291bnRlciA9IG5ldyBpbnRbbl07Ci0gICAgZm9yIChpbnQgaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICBtYXhDb3VudFtpXSA9IGFycmF5T2ZQcm9qZWN0RmFjZXRWZXJzaW9uQXJyYXlzW2ldLmxlbmd0aCAtIDE7Ci0gICAgICBjb3VudGVyW2ldID0gMDsKLSAgICB9ICAgICAgCi0gICAgCi0gICAgLy9OYXZpZ2F0ZSBhcnJheU9mUHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cyB0byBjcmVhdGUgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4KLSAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICB3aGlsZSAoIWRvbmUpCi0gICAgewotICAgICAgLy9DcmVhdGUgYSBjb21iaW5hdGlvbiBvZiBzaXplIG4gdXNpbmcgY3VycmVudCB2YWx1ZXMgaW4gY291bnRlci4KLSAgICAgIC8vQWRkIGl0IHRvIHRoZSBsaXN0IG9mIGFsbCBjb21iaW5hdGlvbnMsIGNoZWNraW5nIGZpcnN0IGZvciB2YWxpZGl0eSBpZiByZXR1cm5WYWxpZE9ubHkgaXMgdHJ1ZS4KLSAgICAgIFNldCBjb21iaW5hdGlvbiA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICBmb3IgKGludCBqPTA7IGo8bjsgaisrKQotICAgICAgewotICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBwZnYgPSBhcnJheU9mUHJvamVjdEZhY2V0VmVyc2lvbkFycmF5c1tqXVtjb3VudGVyW2pdXTsKLSAgICAgICAgY29tYmluYXRpb24uYWRkKHBmdik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vQ2hlY2sgaWYgdmFsaWQuCi0gICAgICBpZiAocmV0dXJuVmFsaWRPbmx5KQotICAgICAgewotICAgICAgICBTZXQgYWN0aW9ucyA9IGdldEluc3RhbGxBY3Rpb25zKGNvbWJpbmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWlmKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5jaGVjayggbmV3IEhhc2hTZXQoKSwgYWN0aW9ucyApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApICAgICAgICAKLQkgICAgICAgIHsKLQkgICAgICAgICAgYWxsQ29tYmluYXRpb25zLmFkZCgoY29tYmluYXRpb24pKTsKLQkgICAgICAgIH0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcgaWYgUHJvamVjdEZhY2V0c01hbmFnZXIuY2hlY2soKSB0aHJvd3MgZXhjZXB0aW9uLgotCQkJLy8gVE9ETyBUaGlzIHRyeS9jYXRjaCB3aWxsIGJlIHVubmVjY2VzYXJ5IG9uY2UgV1RQIGJ1ZyAxMzc1NTEgaXMgZml4ZWQgc28gdGhhdCBhbiBPSyBTdGF0dXMgCi0JCQkvLyAJCXdvdWxkIG5vdCBiZSByZXR1cm5lZCB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JCX0gICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhbGxDb21iaW5hdGlvbnMuYWRkKChjb21iaW5hdGlvbikpOwotICAgICAgfQotICAgICAgCi0gICAgICAvL1VwZGF0ZSB0aGUgY291bnRlcnMuCi0gICAgICBmb3IgKGludCBwPTA7IHA8bjsgcCsrKQotICAgICAgewotICAgICAgICBpZiAoIChjb3VudGVyW3BdICsgMSkgPD0gbWF4Q291bnRbcF0pCi0gICAgICAgIHsKLSAgICAgICAgICAoY291bnRlcltwXSkrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjb3VudGVyW3BdID0gMDsKLSAgICAgICAgICBpZiAocCA9PSBuLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIFNldFtdIGFsbENvbWJpbmF0aW9uc0FycmF5ID0gKFNldFtdKWFsbENvbWJpbmF0aW9ucy50b0FycmF5KG5ldyBTZXRbMF0pOyAgICAKLSAgICByZXR1cm4gYWxsQ29tYmluYXRpb25zQXJyYXk7ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIHNldCBvZiBmYWNldCB2ZXJzaW9ucyBnaXZlbiBhIHRlbXBsYXRlLiBUaGUgaGlnaGVzdCBmYWNldCB2ZXJzaW9uIG9mIGV2ZXJ5IGZpeGVkIAotICAgKiBmYWNldCBpbiB0aGUgdGVtcGxhdGUgaXMgcmV0dXJuZWQsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUganN0LmphdmEgZmFjZXQsIHdoZXJlIHRoZSAxLjQgCi0gICAqIGZhY2V0IHZlcnNpb24gaXMgcmV0dXJuZWQuCi0gICAqIAotICAgKiBAcGFyYW0gdGVtcGxhdGVJZCBpZCBvZiBhIHtAbGluayBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZX0KLSAgICogQHJldHVybiBTZXQgY29udGFpbmluZyBlbGVtZW50cyBvZiB0eXBlIHtAbGluayBJUHJvamVjdEZhY2V0VmVyc2lvbn0KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU2V0IGdldEluaXRpYWxGYWNldFZlcnNpb25zRnJvbVRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZUlkKQotICB7Ci0gICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgdGVtcGxhdGUgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSh0ZW1wbGF0ZUlkKTsKLSAgICBTZXQgZml4ZWRGYWNldHMgPSB0ZW1wbGF0ZS5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsgCi0gICAgSGFzaFNldCBpbml0aWFsID0gbmV3IEhhc2hTZXQoKTsgCi0gICAgZm9yIChJdGVyYXRvciBpdHIyID0gZml4ZWRGYWNldHMuaXRlcmF0b3IoKTsgaXRyMi5oYXNOZXh0KCk7ICkgCi0gICAgeyAKLSAgICAgIElQcm9qZWN0RmFjZXQgZmFjZXQgPSAoSVByb2plY3RGYWNldCkgaXRyMi5uZXh0KCk7IAotICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gaGlnaGVzdEZhY2V0VmVyc2lvbiA9IG51bGw7Ci0gICAgICB0cnkgewotICAgIAkgIGlmIChpc0phdmFGYWNldChmYWNldCkpIC8vc3BlY2lhbCBjYXNlIHRoZSBqYXZhIGZhY2V0IGJlY2F1c2UgMS40IGlzIGEgYmV0dGVyIGRlZmF1bHQgdGhhbiA1LjAgZm9yIG5vdy4KLSAgICAJICB7Ci0gICAgCQkgIGhpZ2hlc3RGYWNldFZlcnNpb24gPSBmYWNldC5nZXRWZXJzaW9uKCIxLjQiKTsKLSAgICAJICB9IGVsc2UgewotICAgIAkJICBoaWdoZXN0RmFjZXRWZXJzaW9uID0gZmFjZXQuZ2V0TGF0ZXN0VmVyc2lvbigpOwotICAgIAkgIH0KLSAgICAgIH0gY2F0Y2ggKFZlcnNpb25Gb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICB9Ci0gICAgICBpbml0aWFsLmFkZChoaWdoZXN0RmFjZXRWZXJzaW9uKTsgCi0gICAgfSAgICAgICAgICAgICAKLSAgICAKLSAgICByZXR1cm4gaW5pdGlhbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGxhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZUlkcy4KLSAgICogQHBhcmFtIHRlbXBsYXRlSWRzIGFycmF5IG9mIHZhbGlkIHRlbXBsYXRlIGlkcy4gRWFjaCBpZCBtdXN0IGNvcnJlc3BvbmQgdG8gYSB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9LgotICAgKiBAcmV0dXJuIFN0cmluZ1tdIGFycmF5IG9mIHRlbXBsYXRlIGxhYmVscy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VGVtcGxhdGVMYWJlbHMoU3RyaW5nW10gdGVtcGxhdGVJZHMpCi0gIHsKLSAgICBTdHJpbmdbXSBsYWJlbHMgPSBuZXcgU3RyaW5nW3RlbXBsYXRlSWRzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpPHRlbXBsYXRlSWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIHRlbXBsYXRlID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUodGVtcGxhdGVJZHNbaV0pOyAgICAgIAotICAgICAgbGFiZWxzW2ldID0gdGVtcGxhdGUuZ2V0TGFiZWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxhYmVsczsKLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGlkIG9mIGEgdGVtcGxhdGUgZ2l2ZW4gaXRzIGxhYmVsLiAKLSAgICogCi0gICAqIEBwYXJhbSB0ZW1wbGF0ZUxhYmVsIGxhYmVsIG9mIGEgdGVtcGxhdGUKLSAgICogQHJldHVybiB0ZW1wbGF0ZSBpZCBvciBlbXB0eSBTdHJpbmcgaWYgbm8ge0BsaW5rIElGYWNldGVkUHJvamVjdFRlbXBsYXRlfSB3aXRoIHRoZQotICAgKiBnaXZlbiB0ZW1wbGF0ZUxhYmVsIGNvdWxkIGJlIGZvdW5kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVJZEJ5TGFiZWwoU3RyaW5nIHRlbXBsYXRlTGFiZWwpCi0gIHsKLSAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFRlbXBsYXRlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIHRlbXBsYXRlID0gKElGYWNldGVkUHJvamVjdFRlbXBsYXRlKSBpdHIubmV4dCgpOwotICAgICAgICBpZiAodGVtcGxhdGUuZ2V0TGFiZWwoKS5lcXVhbHModGVtcGxhdGVMYWJlbCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdGVtcGxhdGUuZ2V0SWQoKTsKLQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxhYmVsIG9mIGEgdGVtcGxhdGUgZ2l2ZW4gaXRzIGlkIAotICAgKiAKLSAgICogQHBhcmFtIHRlbXBsYXRlSWQgaWQgb2YgYSB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGV9Ci0gICAqIEByZXR1cm4gdGVtcGxhdGUgbGFiZWwKLSAgICovICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVMYWJlbEJ5SWQoU3RyaW5nIHRlbXBsYXRlSWQpCi0gIHsKLSAgICBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSB0ZW1wbGF0ZSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFRlbXBsYXRlKHRlbXBsYXRlSWQpOwotICAgIHJldHVybiB0ZW1wbGF0ZS5nZXRMYWJlbCgpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIHNldCBvZiBpbnN0YWxsIGFjdGlvbnMgZm9yIHRoZSBwcm92aWRlZCBmYWNldCB2ZXJzaW9uCi0gICAqIAotICAgKiBAcGFyYW0gcHJvamVjdEZhY2V0VmVyc2lvbnMgU2V0IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgSVByb2plY3RGYWNldFZlcnNpb259Ci0gICAqIEByZXR1cm4gU2V0IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgQWN0aW9ufSB3aXRoIHRoZSB0eXBlIGF0dHJpYnV0ZSBzZXQgdG8gVHlwZS5JTlNUQUxMCi0gICAqIFRoZSBzZXQgY29udGFpbnMgb25lIEFjdGlvbiBmb3IgZWFjaCB7QGxpbmsgSVByb2plY3RGYWNldFZlcnNpb259IGluIHByb2plY3RGYWNldFZlcnNpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTZXQgZ2V0SW5zdGFsbEFjdGlvbnMoU2V0IHByb2plY3RGYWNldFZlcnNpb25zKQotICB7Ci0gICAgSGFzaFNldCBhY3Rpb25zID0gbmV3IEhhc2hTZXQoKTsKLSAgICAKLSAgICBJdGVyYXRvciBmYWNldHMgPSBwcm9qZWN0RmFjZXRWZXJzaW9ucy5pdGVyYXRvcigpOwotICAgIAotICAgIHdoaWxlKGZhY2V0cy5oYXNOZXh0KCkpCi0gICAgewotICAgIAlJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbilmYWNldHMubmV4dCgpOwotICAgIAlpZiAoZnYgIT0gbnVsbCkgewotICAgIAkJSVByb2plY3RGYWNldCBwZiA9IGZ2LmdldFByb2plY3RGYWNldCgpOwotICAgIAkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oVHlwZS5JTlNUQUxMLCBmdiwgZ2V0Q29uZmlnT2JqZWN0KHBmKSk7Ci0gICAgCQlhY3Rpb25zLmFkZChhY3Rpb24pOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBhY3Rpb25zOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGF0YSBtb2RlbCBjb25maWcgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gcHJvamVjdCBmYWNldAotICAgKiBGb3IgSjJFRSBmYWNldHMsIHNldCBBZGRfVE9fRUFSIHByb3BlcnRpZXMgb2YgdGhlIGRhdGEgbW9kZWwgdG8gZmFsc2UsIAotICAgKiBmb3Igb3RoZXIgZmFjZXRzLCBqdXN0IHJldHVybiBudWxsCi0gICAqIEBwYXJhbSBmYWNldElECi0gICAqIEByZXR1cm4gZGF0YSBtb2RlbCBjb25maWcgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDb25maWdPYmplY3QoSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQpCi0gIHsKLQkgIAotCSAgSURhdGFNb2RlbCBkbSA9IG51bGw7Ci0JICBpZiAocHJvamVjdEZhY2V0ICE9IG51bGwpIHsKLQkJICBTdHJpbmcgZmFjZXRJZCA9IHByb2plY3RGYWNldC5nZXRJZCgpOwotCQkgIGlmIChmYWNldElkICE9IG51bGwpIHsKLQkJCSAgLy8gc2V0IEFkZCB0byBFQVIgdG8gZmFsc2UKLQkJCSAgaWYgKGZhY2V0SWQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpKSB7IAotCQkJCSAgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJICBkbS5zZXRCb29sZWFuUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwotCQkJICB9IGVsc2UgaWYgKGZhY2V0SWQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpKSB7Ci0JCQkJICBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFamJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQkgIGRtLnNldEJvb2xlYW5Qcm9wZXJ0eShJRWpiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7Ci0JCQkgIH0gZWxzZSBpZiAoZmFjZXRJZC5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSkpIHsKLQkJCQkgIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCSAgZG0uc2V0Qm9vbGVhblByb3BlcnR5KElBcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKLQkJCSAgfSBlbHNlIGlmIChmYWNldElkLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRSkpIHsKLQkJCQkgIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQkgIGRtLnNldEJvb2xlYW5Qcm9wZXJ0eShJVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuIGRtOwotICB9Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRmFjZXRNYXRjaGVyfSBjYWxjdWxhdGVkIHdoZW4gY2hlY2tpbmcgdGhlIHJlcXVpcmVkIGZhY2V0IHZlcnNpb25zIAotICAgKiBhZ2FpbnN0IHRoZSBmYWNldCB2ZXJzaW9ucy4KLSAgICogCi0gICAqIEBwYXJhbSByZXF1aXJlZEZhY2V0VmVyc2lvbnMgYXJyYXkgb2YgcmVxdWlyZWQgZmFjZXQgdmVyc2lvbnMKLSAgICogQHBhcmFtIHByb2plY3RGYWNldFZlcnNpb25zIGZhY2V0IHZlcnNpb25zIHRvIGNoZWNrIGFnYWluc3QuIFNldCBjb250YWluaW5nIGVsZW1lbnRzIG9mIHR5cGUgCi0gICAqIHtAbGluayBJUHJvamVjdEZhY2V0VmVyc2lvbn0KLSAgICogQHJldHVybiBGYWNldE1hdGNoZXIgd2l0aCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczoKLSAgICogPHVsPgotICAgKiA8bGk+PGI+aXNNYXRjaDwvYj46IHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVxdWlyZWQgZmFjZXQgdmVyc2lvbnMgYWxyZWFkeSBleGlzdCBpbiB0aGUgZmFjZXQgdmVyc2lvbnMKLSAgICogb3IgY2FuIGJlIGFkZGVkIHRvIHRoZSBmYWNldCB2ZXJzaW9ucy4gaXNNYXRjaCB3aWxsIHJldHVybiBmYWxzZSBvdGhlcndpc2UuPC9saT4KLSAgICogPGxpPjxiPmdldEZhY2V0c1Rlc3RlZDwvYj46IHJldHVybnMgdGhlIHNhbWUgc2V0IG9mIGZhY2V0IHZlcnNpb25zIGFzIHRoZSBpbnB1dCBwYXJhbWV0ZXIsIHByb2plY3RGYWNldFZlcnNpb25zPC9saT4KLSAgICogPGxpPjxiPmdldEZhY2V0c1RoYXRNYXRjaGVkPC9iPjogaWYgaXNNYXRjaCByZXR1cm5zIGZhbHNlLCBnZXRGYWNldHNUaGF0TWF0Y2hlZCByZXR1cm5zIG51bGwuIElmIGlzTWF0Y2ggcmV0dXJucyB0cnVlLCAKLSAgICogZ2V0RmFjZXRzVGhhdE1hdGNoZWQgcmV0dXJucyB0aGUgc3Vic2V0IG9mIGZhY2V0IHZlcnNpb25zIGluIHRoZSBpbnB1dCBwYXJhbWV0ZXIsIHByb2plY3RGYWNldFZlcnNpb25zLCAKLSAgICogdGhhdCBtYXRjaGVkIG9uZSBvZiB0aGUgcmVxdWlyZWQgZmFjZXQgdmVyc2lvbnMuIFRoaXMgbWF5IGJlIGFuIGVtcHR5IHNldC48L2xpPgotICAgKiA8bGk+PGI+Z2V0RmFjZXRzVG9BZGQ8L2I+OiBpZiBpc01hdGNoIHJldHVybnMgZmFsc2UsIGdldEZhY2V0c1RvQWRkIHJldHVybnMgbnVsbC4gSWYgaXNNYXRjaCByZXR1cm5zIHRydWUsIAotICAgKiBnZXRGYWNldHNUb0FkZCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgZmFjZXQgdmVyc2lvbnMgdGhhdCB3b3VsZCBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSBmYWNldCB2ZXJzaW9ucyBpbgotICAgKiBwcm9qZWN0RmFjZXRWZXJzaW9ucyBpbiBvcmRlciB0byBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHJlcXVpcmVkIGZhY2V0IHZlcnNpb25zLiBUaGlzIG1heSBiZQotICAgKiBhbiBlbXB0eSBzZXQuPC9saT4KLSAgICogPC91bD4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRmFjZXRNYXRjaGVyIG1hdGNoKFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmVxdWlyZWRGYWNldFZlcnNpb25zLCBTZXQgcHJvamVjdEZhY2V0VmVyc2lvbnMpCi0gIHsKLSAgICBGYWNldE1hdGNoZXIgZm0gPSBuZXcgRmFjZXRNYXRjaGVyKCk7Ci0gICAgZm0uc2V0RmFjZXRzVGVzdGVkKHByb2plY3RGYWNldFZlcnNpb25zKTsKLSAgICBIYXNoU2V0IGZhY2V0c1RvQWRkID0gbmV3IEhhc2hTZXQoKTsKLSAgICBIYXNoU2V0IHJlcXVpcmVkRmFjZXRWZXJzaW9uc1RvQWRkID0gbmV3IEhhc2hTZXQoKTsKLSAgICBIYXNoU2V0IGZhY2V0c1RoYXRNYXRjaGVkID0gbmV3IEhhc2hTZXQoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cmVxdWlyZWRGYWNldFZlcnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uIHJmdiA9IHJlcXVpcmVkRmFjZXRWZXJzaW9uc1tpXTsKLSAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHJwZnYgPSByZnYuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgU3RyaW5nIHJpZCA9IHJwZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKTsKLSAgICAgIFN0cmluZyBydiA9IHJwZnYuZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgYm9vbGVhbiBmYWNldFByZXNlbnQgPSBmYWxzZTsKLQotICAgICAgLy9JcyB0aGUgcHJvamVjdCBmYWNldCBwcmVzZW50PyBvciBhIGxhdGVyIHZlcnNpb24gb2YgYXBwbGljYWJsZS4KLSAgICAgIEl0ZXJhdG9yIGl0ciA9IHByb2plY3RGYWNldFZlcnNpb25zLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShpdHIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBwZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24paXRyLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGlkID0gcGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCk7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gcGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgaWYgKHJpZC5lcXVhbHMoaWQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJ2LmVxdWFscyh2ZXJzaW9uKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL2ZvdW5kIGFuIGV4YWN0IG1hdGNoCi0gICAgICAgICAgICBmYWNldFByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgZmFjZXRzVGhhdE1hdGNoZWQuYWRkKHBmdik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmZ2LmdldEFsbG93TmV3ZXIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGdyZWF0ZXJUaGFuKHZlcnNpb24sIHJ2KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vZm91bmQgYSBtYXRjaAotICAgICAgICAgICAgICAgIGZhY2V0UHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZmFjZXRzVGhhdE1hdGNoZWQuYWRkKHBmdik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy9ObyBuZWVkIHRvIGtlZXAgaXRlcmF0aW5nIHNpbmNlIHdlIGhpdCBhIGZhY2V0IHdpdGggdGhlIHNhbWUgaWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9pZiBub3QgcHJlc2VudCwgcHV0IGl0IGluIHRoZSBsaXN0IHRvIGNoZWNrIGlmIGl0IGNhbiBiZSBhZGRlZC4KLSAgICAgIGlmICghZmFjZXRQcmVzZW50KQotICAgICAgewotICAgICAgICBmYWNldHNUb0FkZC5hZGQocnBmdik7Ci0gICAgICAgIHJlcXVpcmVkRmFjZXRWZXJzaW9uc1RvQWRkLmFkZChyZnYpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIAotICAgIC8vQ2hlY2sgaWYgdGhlIGZhY2V0c1RvQWRkIGNhbiBiZSBhZGRlZAotICAgIGlmIChyZXF1aXJlZEZhY2V0VmVyc2lvbnNUb0FkZC5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIC8vVGVzdCBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIHRoZSBmYWNldHMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkCi0gICAgICAvL0NyZWF0ZSBhbiBhcnJheSBvZiBhcnJheXMuIEVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgd2lsbCBjb250YWluIHRoZSBhcnJheQotICAgICAgLy9vZiB0aGUgcGVybWl0dGVkIElQcm9qZWN0RmFjZXRWZXJzaW9ucyBmb3IgZWFjaCByZXF1aXJlZCBmYWNldC4KLSAgICAgIGJvb2xlYW4gZmFjZXRzQ2FuQmVBZGRlZCA9IGZhbHNlOwotICAgICAgSXRlcmF0b3IgaXRyID0gcmVxdWlyZWRGYWNldFZlcnNpb25zVG9BZGQuaXRlcmF0b3IoKTsKLSAgICAgIEFycmF5TGlzdCBwcm9qZWN0RmFjZXRWZXJzaW9uQXJyYXlzID0gbmV3IEFycmF5TGlzdCgpOyAgICAgIAotCi0gICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUmVxdWlyZWRGYWNldFZlcnNpb24gcmVxRmFjZXRWZXJzaW9uID0gKFJlcXVpcmVkRmFjZXRWZXJzaW9uKSBpdHIubmV4dCgpOwotICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbltdIHZlcnNpb25zID0gcmVxRmFjZXRWZXJzaW9uLmdldEFsbG93ZWRQcm9qZWN0RmFjZXRWZXJzaW9ucygpOwotICAgICAgICBpZiAodmVyc2lvbnMgIT0gbnVsbCAmJiB2ZXJzaW9ucy5sZW5ndGggPiAwKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIC8vQWRkIHRoZSBhcnJheSBvZiB2ZXJzaW9ucyB0byB0aGUgbGlzdCBvZiBhcnJheXMuCi0gICAgICAgICAgcHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cy5hZGQodmVyc2lvbnMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uW11bXSBhcnJheU9mUHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cyA9IChJUHJvamVjdEZhY2V0VmVyc2lvbltdW10pcHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cy50b0FycmF5KG5ldyBJUHJvamVjdEZhY2V0VmVyc2lvblswXVswXSk7Ci0gICAgICBTZXRbXSBjb21iaW5hdGlvbnMgPSBnZXRGYWNldENvbWJpbmF0aW9ucyhhcnJheU9mUHJvamVjdEZhY2V0VmVyc2lvbkFycmF5cywgZmFsc2UpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPGNvbWJpbmF0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgLy9DaGVjayBpZiB0aGUgc2V0IGNhbiBiZSBhZGRlZC4gSWYgc28sIHRoaXMgaXMgYSBtYXRjaC4gVXBkYXRlIHRoZSBmYWNldCBtYXRjaGVyIGFuZCBicmVhay4KLSAgICAgICAgU2V0IGFjdGlvbnMgPSBnZXRJbnN0YWxsQWN0aW9ucyhjb21iaW5hdGlvbnNbaV0pOwotICAgICAgICB0cnkgewotCQkJaWYoIFByb2plY3RGYWNldHNNYW5hZ2VyLmNoZWNrKCBwcm9qZWN0RmFjZXRWZXJzaW9ucywgYWN0aW9ucyApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApCi0JCQl7Ci0JCQkgIC8vRmFjZXRzIGNhbiBiZSBhZGRlZCBzbyB0aGVyZSBpcyBhIG1hdGNoCi0JCQkgIGZhY2V0c0NhbkJlQWRkZWQ9dHJ1ZTsKLQkJCSAgZm0uc2V0TWF0Y2godHJ1ZSk7Ci0JCQkgIGZtLnNldEZhY2V0c1RoYXRNYXRjaGVkKGZhY2V0c1RoYXRNYXRjaGVkKTsKLQkJCSAgZm0uc2V0RmFjZXRzVG9BZGQoY29tYmluYXRpb25zW2ldKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkvLyBEbyBub3RoaW5nIGlmIFByb2plY3RGYWNldHNNYW5hZ2VyLmNoZWNrKCkgdGhyb3dzIGV4Y2VwdGlvbi4KLQkJCS8vIFRPRE8gVGhpcyB0cnkvY2F0Y2ggd2lsbCBiZSB1bm5lY2Nlc2FyeSBvbmNlIFdUUCBidWcgMTM3NTUxIGlzIGZpeGVkIHNvIHRoYXQgYW4gT0sgU3RhdHVzIAotCQkJLy8gCQl3b3VsZCBub3QgYmUgcmV0dXJuZWQgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotCQl9ICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICAKLSAgICAgIGlmICghZmFjZXRzQ2FuQmVBZGRlZCkKLSAgICAgIHsKLSAgICAgICAgZm0uc2V0TWF0Y2goZmFsc2UpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9UaGVyZSBhcmUgbm8gZmFjZXRzIHRvIGFkZC4KLSAgICAgIGZtLnNldE1hdGNoKHRydWUpOwotICAgICAgZm0uc2V0RmFjZXRzVGhhdE1hdGNoZWQoZmFjZXRzVGhhdE1hdGNoZWQpOwotICAgICAgZm0uc2V0RmFjZXRzVG9BZGQoZmFjZXRzVG9BZGQpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZm07Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIEFkZHMgZmFjZXQgdmVyc2lvbnMgdG8gdGhlIHByb3ZpZGVkIHByb2plY3QgaWYgcmVxdWlyZWQgYmFzZWQgb24gY2hlY2tpbmcgcHJvdmlkZWQgCi0gICAqIHJlcXVpcmVkIGZhY2V0IHZlcnNpb25zIGFnYWluc3QgdGhlIGZhY2V0IHZlcnNpb25zIGFscmVhZHkgaW5zdGFsbGVkIG9uIHByb2plY3QuCi0gICAqIAotICAgKiBAcGFyYW0gcHJvamVjdCBJUHJvamVjdCB3aGljaCBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotICAgKiBAcGFyYW0gcmZ2cyBhcnJheSBvZiByZXF1aXJlZCBmYWNldCB2ZXJzaW9ucy4KLSAgICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcgotICAgKiBAcmV0dXJuIElTdGF0dXMgd2l0aCBzZXZlcml0eSBJU3RhdHVzLkVSUk9SCi0gICAqIDx1bD4KLSAgICogPGxpPmlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yPC9saT4KLSAgICogPGxpPmlmIHRoZSBwcm9qZWN0IGlzIG5vdCBvcGVuIG9yPC9saT4KLSAgICogPGxpPmFuIGF0dGVtcHQgdG8gYWRkIGZhY2V0IHZlcnNpb25zIHRvIHRoZSBwcm9qZWN0IHJlc3VsdGVkIGluIGFuIGVycm9yLjwvbGk+Ci0gICAqIDwvdWw+IAotICAgKiBPdGhlcndpc2UsIHJldHVybnMgYW4gSVN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuT0sgICAgCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElTdGF0dXMgYWRkUmVxdWlyZWRGYWNldHNUb1Byb2plY3QoSVByb2plY3QgcHJvamVjdCwgUmVxdWlyZWRGYWNldFZlcnNpb25bXSByZnZzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCi0gICAgU2V0IG1pc3NpbmdGYWNldHMgPSBudWxsOwotICAgIFNldCBmYWNldHNUb0FkZCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgaWYgKGZQcm9qZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFNldCBwcm9qZWN0RmFjZXRWZXJzaW9ucyA9IGZQcm9qZWN0LmdldFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgRmFjZXRNYXRjaGVyIHByb2plY3RGYWNldE1hdGNoZXIgPSBGYWNldFV0aWxzLm1hdGNoKHJmdnMsIHByb2plY3RGYWNldFZlcnNpb25zKTsKLSAgICAgICAgaWYgKHByb2plY3RGYWNldE1hdGNoZXIuaXNNYXRjaCgpKQotICAgICAgICB7Ci0gICAgICAgICAgbWlzc2luZ0ZhY2V0cyA9IHByb2plY3RGYWNldE1hdGNoZXIuZ2V0RmFjZXRzVG9BZGQoKTsKLSAgICAgICAgICBpZiAobWlzc2luZ0ZhY2V0cy5zaXplKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElSdW50aW1lIGZSdW50aW1lID0gbnVsbDsKLSAgICAgICAgICAgIGZSdW50aW1lID0gRmFjZXRVdGlscy5nZXRGYWNldFJ1bnRpbWVGb3JQcm9qZWN0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChmUnVudGltZSAhPSBudWxsKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIC8vQWRkIHRoZSBoaWdoZXN0IHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lIHRoZSBwcm9qZWN0IGlzIGJvdW5kIHRvLgotICAgICAgICAgICAgICBJdGVyYXRvciBtaXNzaW5nRmFjZXRzSXRyID0gbWlzc2luZ0ZhY2V0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICB3aGlsZSAobWlzc2luZ0ZhY2V0c0l0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0IGZhY2V0ID0gKChJUHJvamVjdEZhY2V0VmVyc2lvbiltaXNzaW5nRmFjZXRzSXRyLm5leHQoKSkuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgLy9HZXQgdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgdGhpcyBmYWNldCBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWUuCi0gICAgICAgICAgICAgICAgTGlzdCB2ZXJzaW9ucyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMgPSBmYWNldC5nZXRTb3J0ZWRWZXJzaW9ucyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNldCB2ZXJzaW9uU2V0ID0gZmFjZXQuZ2V0VmVyc2lvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gdmVyc2lvblNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zLmFkZChpdHIubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IGZhY2V0LmdldFZlcnNpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHZlcnNpb25TZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucy5hZGQoaXRyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9JdGVyYXRlIG92ZXIgdGhlIHZlcnNpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgYW5kIHBpY2sgdGhlIAotICAgICAgICAgICAgICAgIC8vZmlyc3Qgb25lIHRoYXQgZlJ1bnRpbWUgc3VwcG9ydHMuCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgdmVyc2lvbnNJdHIgPSB2ZXJzaW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlKHZlcnNpb25zSXRyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBwZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24pdmVyc2lvbnNJdHIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgU2V0IHBmdnMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgICAgICAgcGZ2cy5hZGQocGZ2KTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgcmVxdWlyZWQgZmFjZXRzIHRvIHNlZSBpZiB0aGlzIHZlcnNpb24gb2YgdGhpcyBmYWNldCBpcyBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8cmZ2cy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRGYWNldFZlcnNpb24gcmZ2ID0gcmZ2c1tqXTsKLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gcnBmdiA9IHJmdi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChycGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCkuZXF1YWxzKHBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChycGZ2LmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHMocGZ2LmdldFZlcnNpb25TdHJpbmcoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJmdi5nZXRBbGxvd05ld2VyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncmVhdGVyVGhhbihwZnYuZ2V0VmVyc2lvblN0cmluZygpLCBycGZ2LmdldFZlcnNpb25TdHJpbmcoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGFnYWluc3QgUnVudGltZQotICAgICAgICAgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5kb2VzUnVudGltZVN1cHBvcnRGYWNldHMoZlJ1bnRpbWUsIHBmdnMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy9XZSBoYXZlIGEgbWF0Y2guIEFkZCB0aGlzIG9uZSB0byB0aGUgbWFzdGVyIHNldC4KLSAgICAgICAgICAgICAgICAgICAgICBmYWNldHNUb0FkZC5hZGQocGZ2KTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmYWNldHNUb0FkZCA9IG1pc3NpbmdGYWNldHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IGFkZEZhY2V0c1RvUHJvamVjdChmUHJvamVjdCwgZmFjZXRzVG9BZGQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgfQotICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgICAgLy9EaXNwbGF5IGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuCi0gICAgICAvL0EgQ29yZUV4Y2VwdGlvbiBjb3VsZCBoYXZlIGJlZW4gdGhyb3duIGZvciBhbnkgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSByZWFzb25zCi0gICAgICAvLzEuIFRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0Ci0gICAgICAvLzIuIFRoZSBwcm9qZWN0IGlzIG5vdCBvcGVuCi0gICAgICAvLzMuIFRoZXJlIHdhcyBhIHByb2JsZW0gYWRkaW5nIHRoZSBmYWNldHMgdG8gdGhlIHByb2plY3QuCi0gICAgICAKLSAgICAgIGlmICghcHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfUFJPSkVDVF9ET0VTX05PVF9FWElTVCwgbmV3IFN0cmluZ1tdIHsgcHJvamVjdC5nZXROYW1lKCl9KSk7ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICghcHJvamVjdC5pc09wZW4oKSkKLSAgICAgIHsKLSAgICAgICAgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfUFJPSkVDVF9JU19OT1RfT1BFTiwgbmV3IFN0cmluZ1tdIHsgcHJvamVjdC5nZXROYW1lKCl9KSk7ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7IAotICAgICAgICBzdGF0dXMgPSBnZXRFcnJvclN0YXR1c0ZvckFkZGluZ0ZhY2V0cyhwcm9qZWN0LmdldE5hbWUoKSwgZmFjZXRzVG9BZGQsIGNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLQotICAvKioKLSAgICogQWRkcyB0aGUgcHJvdmlkZWQgc2V0IG9mIGZhY2V0IHZlcnNpb25zIHRvIHRoZSBwcm92aWRlZCBmYWNldGVkIHByb2plY3QKLSAgICogCi0gICAqIEBwYXJhbSBmcHJvamVjdCBBIGZhY2V0ZWQgcHJvamVjdCB3aGljaCBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotICAgKiBAcGFyYW0gcHJvamVjdEZhY2V0VmVyc2lvbnMgQSBzZXQgY29udGFpbmluZyBlbGVtZW50cyBvZiB0eXBlIHtAbGluayBJUHJvamVjdEZhY2V0VmVyc2lvbn0KLSAgICogQHJldHVybiBBbiBJU3RhdHVzIHdpdGggYSBzZXZlcml0eSBvZiBJU3RhdHVzLk9LIGlmIHRoZSBmYWNldCAKLSAgICogdmVyc2lvbnMgd2VyZSBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSwgYW4gSVN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YKLSAgICogSVN0YXR1cy5FUlJPUi4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElTdGF0dXMgYWRkRmFjZXRzVG9Qcm9qZWN0KGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvamVjdCwgZmluYWwgU2V0IHByb2plY3RGYWNldFZlcnNpb25zKQotICB7Ci0gICAgZmluYWwgSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotICAgIHN0YXR1c1swXSA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgZmluYWwgU2V0IGFjdGlvbnMgPSBnZXRJbnN0YWxsQWN0aW9ucyhwcm9qZWN0RmFjZXRWZXJzaW9ucyk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgcnVubmFibGUgdGhhdCBhcHBsaWVzIHRoZSBpbnN0YWxsIGFjdGlvbnMgdG8gdGhlIGZhY2V0ZWQgcHJvamVjdAotICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHNoZWxsTW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZnByb2plY3QubW9kaWZ5KGFjdGlvbnMsIHNoZWxsTW9uaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHN0YXR1c1swXSA9IGdldEVycm9yU3RhdHVzRm9yQWRkaW5nRmFjZXRzKGZwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCksIHByb2plY3RGYWNldFZlcnNpb25zLCBlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07ICAgIAotICAgICAgICAKLSAgICAvLyBSdW4gdGhlIHJ1bm5hYmxlIGluIGFub3RoZXIgdGhyZWFkIHVubGVzcyB0aGVyZSBpcyBubyBVSSB0aHJlYWQgKEFudCBzY2VuYXJpb3MpCi0gICAgaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpCi0gICAgeyAgICAJCi0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgZmFsc2UsIHJ1bm5hYmxlKTsKLQkgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpCi0JICAgIHsKLQkgICAgICBzdGF0dXNbMF0gPSBnZXRFcnJvclN0YXR1c0ZvckFkZGluZ0ZhY2V0cyhmcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBwcm9qZWN0RmFjZXRWZXJzaW9ucywgaXRlKTsKLQkgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0JICAgIHsKLQkgICAgICBzdGF0dXNbMF0gPSBnZXRFcnJvclN0YXR1c0ZvckFkZGluZ0ZhY2V0cyhmcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBwcm9qZWN0RmFjZXRWZXJzaW9ucywgaWUpOwotCSAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCXRyeQotICAgICAgICB7Ci0gICAgICAgICAgZnByb2plY3QubW9kaWZ5KGFjdGlvbnMsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXNbMF0gPSBnZXRFcnJvclN0YXR1c0ZvckFkZGluZ0ZhY2V0cyhmcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBwcm9qZWN0RmFjZXRWZXJzaW9ucywgZSk7Ci0gICAgICAgIH0KLQl9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1c1swXTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXJyb3Igc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZmFjZXQgdmVyc2lvbnMgY291bGQgbm90IGJlCi0gICAqIGFkZGVkIHRvIHRoZSBmYWNldGVkIHByb2plY3QKLSAgICogCi0gICAqIEBwYXJhbSBwcm9qZWN0TmFtZSBhIHByb2plY3QgbmFtZSB0byBpbnNlcnQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIElTdGF0dXMKLSAgICogQHBhcmFtIHByb2plY3RGYWNldFZlcnNpb25zIGEgc2V0IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgSVByb2plY3RGYWNldFZlcnNpb259LgotICAgKiBUaGUgZmFjZXRzIGluIHRoaXMgc2V0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBJU3RhdHVzLgotICAgKiBAcGFyYW0gdCBhIFRocm93YWJsZSB3aGljaCB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBJU3RhdHVzCi0gICAqIEByZXR1cm4gYW4gSVN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuRVJST1IKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIElTdGF0dXMgZ2V0RXJyb3JTdGF0dXNGb3JBZGRpbmdGYWNldHMoU3RyaW5nIHByb2plY3ROYW1lLCBTZXQgcHJvamVjdEZhY2V0VmVyc2lvbnMsIFRocm93YWJsZSB0KQotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIGludCBzaXplID0gcHJvamVjdEZhY2V0VmVyc2lvbnMuc2l6ZSgpOwotICAgIGlmIChzaXplID4gMCkKLSAgICB7ICAgICAgICAgIAotICAgICAgU2V0IGZhY2V0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAvL0l0ZXJhdGUgb3ZlciBwcm9qZWN0RmFjZXRWZXJzaW9ucyB0byBmb3JtIGEgc2V0IG9mIElQcm9qZWN0RmFjZXRzCi0gICAgICBJdGVyYXRvciBpdHIgPSBwcm9qZWN0RmFjZXRWZXJzaW9ucy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHByb2plY3RGYWNldCA9IChJUHJvamVjdEZhY2V0VmVyc2lvbilpdHIubmV4dCgpOwotICAgICAgICBJUHJvamVjdEZhY2V0IGZhY2V0ID0gcHJvamVjdEZhY2V0LmdldFByb2plY3RGYWNldCgpOwotICAgICAgICBmYWNldHMuYWRkKGZhY2V0KTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBmYWNldExpc3QgPSBnZXRGYWNldExpc3RNZXNzYWdlU3RyaW5nKGZhY2V0cyk7Ci0gICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9BRERJTkdfRkFDRVRTX1RPX1BST0pFQ1QsIG5ldyBTdHJpbmdbXSB7IHByb2plY3ROYW1lLCBmYWNldExpc3R9KSwgdCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGZhY2V0ZWQgcHJvamVjdCB3aXRoIHRoZSBwcm92aWRlZCBuYW1lCi0gICAqIAotICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgQSBTdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byBiZSBjcmVhdGVkCi0gICAqIEByZXR1cm4gQW4gSVN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgSVN0YXR1cy5PSyBpZiB0aGUgZmFjZXRlZCBwcm9qZWN0Ci0gICAqIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSBvciBpZiBhIHByb2plY3Qgb2YgdGhlIHByb3ZpZGVkIG5hbWUgYWxyZWFkeQotICAgKiBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZS4gT3RoZXJ3aXNlLCBhbiBJU3RhdHVzIHdpdGggc2V2ZXJpdHkgb2YKLSAgICogSVN0YXR1cy5FUlJPUi4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlTmV3RmFjZXRlZFByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gICAgZmluYWwgSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotICAgIHN0YXR1c1swXSA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgaWYgKCFwcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSBhIHJ1bm5hYmxlIHRoYXQgY3JlYXRlcyBhIG5ldyBmYWNldGVkIHByb2plY3QuCi0gICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3Igc2hlbGxNb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGYWNldGVkUHJvamVjdCBmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0TmFtZSwgbnVsbCwgc2hlbGxNb25pdG9yKTsKLSAgICAgICAgICAgIGlmIChmUHJvamVjdCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdGF0dXNbMF0gPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9QUk9KRUNUX0NSRUFUSU9OLCBuZXcgU3RyaW5nW10geyBwcm9qZWN0TmFtZSB9KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1c1swXSA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1BST0pFQ1RfQ1JFQVRJT04sIG5ldyBTdHJpbmdbXSB7IHByb2plY3ROYW1lIH0pLCBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAvLyBSdW4gdGhlIHJ1bm5hYmxlIGluIGFub3RoZXIgdGhyZWFkIHVubGVzcyB0aGVyZSBpcyBubyBVSSB0aHJlYWQgKEFudCBzY2VuYXJpb3MpICAgIAkgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgCSAgaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpCi0gICAgCSAgewotICAgIAkJICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLCBmYWxzZSwgcnVubmFibGUpOyAgICAJCSAgCi0gICAgCSAgfQotICAgIAkgIGVsc2UKLSAgICAJICB7Ci0gICAgCQkgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3ROYW1lLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoZlByb2plY3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzdGF0dXNbMF0gPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9QUk9KRUNUX0NSRUFUSU9OLCBuZXcgU3RyaW5nW10geyBwcm9qZWN0TmFtZSB9KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNbMF0gPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9QUk9KRUNUX0NSRUFUSU9OLCBuZXcgU3RyaW5nW10geyBwcm9qZWN0TmFtZSB9KSwgZSk7Ci0gICAgICAgICAgICAgIH0gIAotICAgIAkgIH0gICAgICAgIAotICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpCi0gICAgICB7Ci0gICAgICAgIHN0YXR1c1swXSA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1BST0pFQ1RfQ1JFQVRJT04sIG5ldyBTdHJpbmdbXSB7IHByb2plY3ROYW1lIH0pLCBpdGUpOwotICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgICB7Ci0gICAgICAgIHN0YXR1c1swXSA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1BST0pFQ1RfQ1JFQVRJT04sIG5ldyBTdHJpbmdbXSB7IHByb2plY3ROYW1lIH0pLCBpZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1c1swXTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIHByb3ZpZGVkIHNldCBvZiBmYWNldHMgYXMgZml4ZWQgb24gdGhlIGZhY2V0ZWQgcHJvamVjdAotICAgKiAKLSAgICogQHBhcmFtIGZQcm9qZWN0IEEgZmFjZXRlZCBwcm9qZWN0IHdoaWNoIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0gICAqIEBwYXJhbSBmaXhlZEZhY2V0cyBBIHNldCBjb250YWluaW5nIGVsZW1lbnRzIG9mIHR5cGUge0BsaW5rIElQcm9qZWN0RmFjZXR9Ci0gICAqIEByZXR1cm4gQW4gSVN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgSVN0YXR1cy5PSyBpZiB0aGUgZmFjZXRzIAotICAgKiB3ZXJlIHN1Y2Nlc3NmdWxseSBzZXQgYXMgZml4ZWQgZmFjZXRzIG9uIHRoZSBmYWNldGVkIHByb2plY3QuIAotICAgKiBPdGhlcndpc2UsIGFuIElTdGF0dXMgd2l0aCBhIHNldmVyaXR5IG9mIElTdGF0dXMuRVJST1IuCi0gICAqIAotICAgKiBAc2VlIElGYWNldGVkUHJvamVjdCNzZXRGaXhlZFByb2plY3RGYWNldHMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzZXRGaXhlZEZhY2V0c09uUHJvamVjdChmaW5hbCBJRmFjZXRlZFByb2plY3QgZlByb2plY3QsIGZpbmFsIFNldCBmaXhlZEZhY2V0cykKLSAgewotICAgIGZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLSAgICBzdGF0dXNbMF0gPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgLy9DcmVhdGUgYSBydW5uYWJsZSB0aGF0IHNldHMgdGhlIGZpeGVkIGZhY2V0cyBvbiB0aGUgZmFjZXRlZCBwcm9qZWN0Ci0gICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3Igc2hlbGxNb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBmUHJvamVjdC5zZXRGaXhlZFByb2plY3RGYWNldHMoZml4ZWRGYWNldHMpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXNbMF0gPSBnZXRFcnJvclN0YXR1c0ZvclNldHRpbmdGaXhlZEZhY2V0cyhmUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBmaXhlZEZhY2V0cywgZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotCi0gICAgLy8gUnVuIHRoZSBydW5uYWJsZSBpbiBhbm90aGVyIHRocmVhZCB1bmxlc3MgdGhlcmUgaXMgbm8gVUkgdGhyZWFkIChBbnQgc2NlbmFyaW9zKQotICAgIGlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKQotICAgIHsKLSAgICAJdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLCBmYWxzZSwgcnVubmFibGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkKLSAgICAgICAgewotICAgICAgICAgIHN0YXR1c1swXSA9IGdldEVycm9yU3RhdHVzRm9yU2V0dGluZ0ZpeGVkRmFjZXRzKGZQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCksIGZpeGVkRmFjZXRzLCBpdGUpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkKLSAgICAgICAgewotICAgICAgICAgIHN0YXR1c1swXSA9IGdldEVycm9yU3RhdHVzRm9yU2V0dGluZ0ZpeGVkRmFjZXRzKGZQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCksIGZpeGVkRmFjZXRzLCBpZSk7Ci0gICAgICAgIH0JCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCXRyeQotICAgICAgICB7Ci0gICAgICAgICAgZlByb2plY3Quc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKGZpeGVkRmFjZXRzKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzWzBdID0gZ2V0RXJyb3JTdGF0dXNGb3JTZXR0aW5nRml4ZWRGYWNldHMoZlByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgZml4ZWRGYWNldHMsIGUpOwotICAgICAgICB9Ci0gICAgfSAgICAgICAKLSAgICAKLSAgICByZXR1cm4gc3RhdHVzWzBdOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhbiBlcnJvciBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBmYWNldHMgY291bGQgbm90IGJlCi0gICAqIHNldCBhcyBmaXhlZCBmYWNldHMgb24gdGhlIGZhY2V0ZWQgcHJvamVjdAotICAgKiAKLSAgICogQHBhcmFtIHByb2plY3ROYW1lIGEgcHJvamVjdCBuYW1lIHRvIGluc2VydCBpbiB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgSVN0YXR1cwotICAgKiBAcGFyYW0gZmFjZXRzIGEgc2V0IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgSVByb2plY3RGYWNldH0uCi0gICAqIFRoZSBmYWNldHMgaW4gdGhpcyBzZXQgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIElTdGF0dXMuCi0gICAqIEBwYXJhbSB0IGEgVGhyb3dhYmxlIHdoaWNoIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIElTdGF0dXMKLSAgICogQHJldHVybiBhbiBJU3RhdHVzIHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5FUlJPUgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBnZXRFcnJvclN0YXR1c0ZvclNldHRpbmdGaXhlZEZhY2V0cyhTdHJpbmcgcHJvamVjdE5hbWUsIFNldCBmYWNldHMsIFRocm93YWJsZSB0KQotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIGludCBzaXplID0gZmFjZXRzLnNpemUoKTsKLSAgICBpZiAoc2l6ZSA+IDApCi0gICAgeyAgICAgICAgICAKLSAgICAgIFN0cmluZyBmYWNldExpc3QgPSBnZXRGYWNldExpc3RNZXNzYWdlU3RyaW5nKGZhY2V0cyk7ICAgICAgCi0gICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9GSVhFRF9GQUNFVFMsIG5ldyBTdHJpbmdbXSB7IHByb2plY3ROYW1lLCBmYWNldExpc3R9KSwgdCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gIAotICAKLSAgCi0gIC8qKgotICAgKiBCaW5kcyB0aGUgZmFjZXRlZCBwcm9qZWN0IHRvIHRoZSBmYWNldCBydW50aW1lCi0gICAqIAotICAgKiBAcGFyYW0gZlByb2plY3QgQSBmYWNldGVkIHByb2plY3Qgd2hpY2ggZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLSAgICogQHBhcmFtIGZSdW50aW1lIEEgZmFjZXQgcnVudGltZQotICAgKiBAcmV0dXJuIEFuIElTdGF0dXMgd2l0aCBhIHNldmVyaXR5IG9mIElTdGF0dXMuT0sgaWYgdGhlIGZhY2V0ZWQgcHJvamVjdAotICAgKiB3YXMgYm91bmQgdG8gdGhlIGZhY2V0IHJ1bnRpbWUgc3VjY2Vzc2Z1bGx5LiBPdGhlcndpc2UsIGFuIElTdGF0dXMgd2l0aCBzZXZlcml0eSBvZgotICAgKiBJU3RhdHVzLkVSUk9SLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzZXRGYWNldFJ1bnRpbWVPblByb2plY3QoZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0LCBmaW5hbCBJUnVudGltZSBmUnVudGltZSkKLSAgewotICAgIGZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLSAgICBzdGF0dXNbMF0gPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgLy9DcmVhdGUgYSBydW5uYWJsZSB0aGF0IHNldHMgdGhlIGZhY2V0IHJ1bnRpbWUgb24gdGhlIGZhY2V0ZWQgcHJvamVjdAotICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHNoZWxsTW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZlByb2plY3Quc2V0UnVudGltZShmUnVudGltZSwgc2hlbGxNb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzWzBdID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0VUVElOR19SVU5USU1FLCBuZXcgU3RyaW5nW10geyBmUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBmUnVudGltZS5nZXROYW1lKCkgfSksIGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIC8vIFJ1biB0aGUgcnVubmFibGUgaW4gYW5vdGhlciB0aHJlYWQgdW5sZXNzIHRoZXJlIGlzIG5vIFVJIHRocmVhZCAoQW50IHNjZW5hcmlvcykKLSAgICBpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgCXRyeQotICAgICAgICB7Ci0gICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgZmFsc2UsIHJ1bm5hYmxlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXNbMF0gPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9TRVRUSU5HX1JVTlRJTUUsIG5ldyBTdHJpbmdbXSB7IGZQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCksIGZSdW50aW1lLmdldE5hbWUoKSB9KSwgaXRlKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXNbMF0gPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19FUlJPUl9TRVRUSU5HX1JVTlRJTUUsIG5ldyBTdHJpbmdbXSB7IGZQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCksIGZSdW50aW1lLmdldE5hbWUoKSB9KSwgaWUpOwotICAgICAgICB9CQotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAJdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBmUHJvamVjdC5zZXRSdW50aW1lKGZSdW50aW1lLCBudWxsKTsgLy9qdmggLSBoYXBwZW5zIGhlcmUuLi4KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzWzBdID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0VUVElOR19SVU5USU1FLCBuZXcgU3RyaW5nW10geyBmUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBmUnVudGltZS5nZXROYW1lKCkgfSksIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAKLSAgICByZXR1cm4gc3RhdHVzWzBdOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIHRyYW5zbGF0YWJsZSBkZWxpbWl0ZWQgbGlzdCBvZiBmYWNldCBsYWJlbHMgZGVyaXZlZCBmcm9tIHRoZSBwcm92aWRlZAotICAgKiBzZXQgb2YgZmFjZXRzCi0gICAqIAotICAgKiBAcGFyYW0gZmFjZXRzIGEgc2V0IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgSVByb2plY3RGYWNldH0KLSAgICogQHJldHVybiBTdHJpbmcgYSBkZWxpbWl0ZWQgbGlzdCBvZiBmYWNldCBsYWJlbHMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGYWNldExpc3RNZXNzYWdlU3RyaW5nKFNldCBmYWNldHMpCi0gIHsKLSAgICBTdHJpbmcgZmFjZXRMaXN0TWVzc2FnZSA9ICIiOwotICAgIGludCBzaXplID0gZmFjZXRzLnNpemUoKTsKLSAgICBpZiAoc2l6ZSA+IDApCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRyID0gZmFjZXRzLml0ZXJhdG9yKCk7Ci0gICAgICBJUHJvamVjdEZhY2V0IGZpcnN0UHJvamVjdEZhY2V0ID0gKElQcm9qZWN0RmFjZXQpaXRyLm5leHQoKTsKLSAgICAgIGZhY2V0TGlzdE1lc3NhZ2UgPSBmaXJzdFByb2plY3RGYWNldC5nZXRMYWJlbCgpOwotICAgICAgCi0gICAgICAvL0NvbnRpbnVlIGFwcGVuZGluZyB0byBmYWNldExpc3RNZXNzYWdlIHVudGlsIGFsbCB0aGUgZmFjZXQgbGFiZWxzCi0gICAgICAvL2FyZSBpbiB0aGUgbGlzdC4KLSAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IChJUHJvamVjdEZhY2V0KWl0ci5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBwZkxhYmVsID0gcHJvamVjdEZhY2V0LmdldExhYmVsKCk7Ci0gICAgICAgIGZhY2V0TGlzdE1lc3NhZ2UgPSBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLk1TR19GQUNFVFMsIG5ldyBTdHJpbmdbXSB7ZmFjZXRMaXN0TWVzc2FnZSwgcGZMYWJlbH0pOwotICAgICAgfSAgICAgICAgICAgIAotICAgIH0gICAgCi0gICAgCi0gICAgcmV0dXJuIGZhY2V0TGlzdE1lc3NhZ2U7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2V0IG9mIGZhY2V0IHZlcnNpb25zIHdoaWNoIGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSBwcm92aWRlZCBKYXZhIHByb2plY3QKLSAgICogCi0gICAqIEBwYXJhbSBqYXZhUHJvamVjdCBhIEphdmEgcHJvamVjdCB0aGF0IGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIFNldCBjb250YWluaW5nIGVsZW1lbnRzIG9mIHR5cGUge0BsaW5rIElQcm9qZWN0RmFjZXRWZXJzaW9ufQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTZXQgZ2V0RmFjZXRzRm9ySmF2YVByb2plY3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KQotICB7Ci0gICAgU2V0IGZhY2V0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgU3RyaW5nIGpka0NvbXBsaWFuY2VMZXZlbCA9IG51bGw7Ci0gICAgaWYgKGphdmFQcm9qZWN0IT1udWxsKQotICAgIHsKLSAgICAgIGpka0NvbXBsaWFuY2VMZXZlbCA9IGphdmFQcm9qZWN0LmdldE9wdGlvbigib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZSIsIGZhbHNlKTsKLSAgICAgIGlmIChqZGtDb21wbGlhbmNlTGV2ZWwgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgamRrQ29tcGxpYW5jZUxldmVsID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpOwotICAgICAgICBpZiAoamRrQ29tcGxpYW5jZUxldmVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBqZGtDb21wbGlhbmNlTGV2ZWwgPSAiMS40IjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBJUHJvamVjdEZhY2V0IGphdmFGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9KQVZBKTsKLSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXZhRmFjZXRWZXJzaW9uID0gbnVsbDsKLSAgICBpZiAoamRrQ29tcGxpYW5jZUxldmVsLmVxdWFscygiMS4zIikpCi0gICAgewotICAgICAgamF2YUZhY2V0VmVyc2lvbiA9IGphdmFGYWNldC5nZXRWZXJzaW9uKCIxLjMiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoamRrQ29tcGxpYW5jZUxldmVsLmVxdWFscygiMS40IikpCi0gICAgewotICAgICAgamF2YUZhY2V0VmVyc2lvbiA9IGphdmFGYWNldC5nZXRWZXJzaW9uKCIxLjQiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoamRrQ29tcGxpYW5jZUxldmVsLmVxdWFscygiMS41IikpCi0gICAgewotICAgICAgamF2YUZhY2V0VmVyc2lvbiA9IGphdmFGYWNldC5nZXRWZXJzaW9uKCI1LjAiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGphdmFGYWNldFZlcnNpb24gPSBqYXZhRmFjZXQuZ2V0VmVyc2lvbigiMS40Iik7Ci0gICAgfQotIAotICAgIGZhY2V0cy5hZGQoamF2YUZhY2V0VmVyc2lvbik7Ci0gICAgSVByb2plY3RGYWNldCB1dGlsaXR5RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9NT0RVTEUpOwotICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHV0aWxpdHlGYWNldFZlcnNpb24gPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIHV0aWxpdHlGYWNldFZlcnNpb24gPSB1dGlsaXR5RmFjZXQuZ2V0TGF0ZXN0VmVyc2lvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gICAgaWYgKHV0aWxpdHlGYWNldFZlcnNpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmYWNldHMuYWRkKHV0aWxpdHlGYWNldFZlcnNpb24pOwotICAgIH0KLSAgICByZXR1cm4gZmFjZXRzOwotICB9Ci0gIAotICAKLSAgLy9NZXRob2RzIHJlbGF0ZWQgdG8gZmFjZXQgcnVudGltZXMuCi0gIAotICAvKioKLSAgICogUmV0dXJucyBhIHNldCBvZiBmYWNldCBydW50aW1lcyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuCi0gICAqIHJlcXVpcmVkIGZhY2V0IHZlcnNpb25zLgotICAgKiBAcGFyYW0gcmVxdWlyZWRGYWNldFZlcnNpb25zIGFuIGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgUmVxdWlyZWRGYWNldFZlcnNpb259Ci0gICAqIEByZXR1cm4gU2V0IHNldCBvZiBmYWNldCBydW50aW1lcyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuIHJlcXVpcmVkIGZhY2V0IHZlcnNpb25zLgotICAgKiAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSVJ1bnRpbWV9KSAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU2V0IGdldFJ1bnRpbWVzKFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmVxdWlyZWRGYWNldFZlcnNpb25zKQotICB7Ci0gICAgLy9Gb3JtIHRoZSBzZXRzIG9mIElQcm9qZWN0RmFjZXRWZXJzaW9ucyB0aGVzZSBSZXF1aXJlZEZhY2V0VmVyc2lvbnMgcmVwcmVzZW50LgotICAgIEFycmF5TGlzdCBsaXN0T2ZGYWNldFNldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgSGFzaFNldCBmYWNldHMgPSBuZXcgSGFzaFNldCgpOwotICAgIGludCBqYXZhRmFjZXRJbmRleCA9IC0xOwotICAgIGZvciAoaW50IGk9MDsgaTxyZXF1aXJlZEZhY2V0VmVyc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gcGZ2ID0gcmVxdWlyZWRGYWNldFZlcnNpb25zW2ldLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgIGlmIChGYWNldFV0aWxzLmlzSmF2YUZhY2V0KHBmdi5nZXRQcm9qZWN0RmFjZXQoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vUmVtZW1iZXIgdGhlIGluZGV4Ci0gICAgICAgIGphdmFGYWNldEluZGV4ID0gaTsKLSAgICAgIH0KLSAgICAgIGZhY2V0cy5hZGQocmVxdWlyZWRGYWNldFZlcnNpb25zW2ldLmdldFByb2plY3RGYWNldFZlcnNpb24oKSk7Ci0gICAgfQotICAgIAotICAgIGxpc3RPZkZhY2V0U2V0cy5hZGQoZmFjZXRzKTsKLSAgICAKLSAgICAvL0lmIHRoZSBqYXZhIGZhY2V0IHdhcyBvbmUgb2YgdGhlIGZhY2V0cyBpbiB0aGUgc2V0LCBhbmQgbmV3IHZlcnNpb25zIG9mIGphdmEgYXJlIGFsbG93ZWQsCi0gICAgLy9jcmVhdGUgc2V0cyB0aGF0IGNvbnRhaW4gdGhlIG5ld2VyIHBlcm1pdHRlZCB2ZXJzaW9ucyBvZiB0aGUgamF2YSBmYWNldHMuCi0gICAgaWYgKGphdmFGYWNldEluZGV4ID4gLTEpCi0gICAgewotICAgICAgQXJyYXlMaXN0IHBlcm1pdHRlZEphdmFWZXJzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uIHJmdiA9IHJlcXVpcmVkRmFjZXRWZXJzaW9uc1tqYXZhRmFjZXRJbmRleF07Ci0gICAgICBpZiAocmZ2LmdldEFsbG93TmV3ZXIoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSByZnYuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFZlcnNpb25TdHJpbmcoKTsgICAgICAKLSAgICAgICAgU2V0IGFsbFZlcnNpb25zID0gcmZ2LmdldFByb2plY3RGYWNldFZlcnNpb24oKS5nZXRQcm9qZWN0RmFjZXQoKS5nZXRWZXJzaW9ucygpOwotICAgICAgICBJdGVyYXRvciBpdHIgPSBhbGxWZXJzaW9ucy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHRoaXNQZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24paXRyLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgdGhpc1ZlcnNpb24gPSB0aGlzUGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICBpZiAoZ3JlYXRlclRoYW4odGhpc1ZlcnNpb24sIHZlcnNpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBlcm1pdHRlZEphdmFWZXJzaW9ucy5hZGQodGhpc1ZlcnNpb24pOwotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIGphdmFWZXJzaW9ucyA9IChTdHJpbmdbXSlwZXJtaXR0ZWRKYXZhVmVyc2lvbnMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGo9MDsgajxqYXZhVmVyc2lvbnMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBIYXNoU2V0IHRoaXNGYWNldFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgZm9yIChpbnQgaz0wOyBrPHJlcXVpcmVkRmFjZXRWZXJzaW9ucy5sZW5ndGg7IGsrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKGs9PWphdmFGYWNldEluZGV4KQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHBmdiA9IHJlcXVpcmVkRmFjZXRWZXJzaW9uc1trXS5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0VmVyc2lvbihqYXZhVmVyc2lvbnNbal0pOwotICAgICAgICAgICAgICAgdGhpc0ZhY2V0U2V0LmFkZChwZnYpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gcGZ2ID0gcmVxdWlyZWRGYWNldFZlcnNpb25zW2tdLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgIHRoaXNGYWNldFNldC5hZGQocGZ2KTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGxpc3RPZkZhY2V0U2V0cy5hZGQodGhpc0ZhY2V0U2V0KTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9SZXR1cm4gdGhlIHVuaW9uIG9mIHJ1bnRpbWVzIGZvciBhbGwgdGhlIGZhY2V0U2V0cy4KLSAgICByZXR1cm4gZ2V0UnVudGltZXMoKFNldFtdKWxpc3RPZkZhY2V0U2V0cy50b0FycmF5KG5ldyBTZXRbMF0pKTsKLSAgICAKLSAgfSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgZmFjZXQgcnVudGltZSBzdXBwb3J0cyB0aGUgcHJvdmlkZWQKLSAgICogcmVxdWlyZWQgZmFjZXQgdmVyc2lvbnMuCi0gICAqIAotICAgKiBAcGFyYW0gcmVxdWlyZWRGYWNldFZlcnNpb25zIGFuIGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZSB7QGxpbmsgUmVxdWlyZWRGYWNldFZlcnNpb259Ci0gICAqIEBwYXJhbSBmUnVudGltZU5hbWUgbmFtZSBvZiBhIHtAbGluayBJUnVudGltZX0KLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmYWNldCBydW50aW1lIHN1cHBvcnRzIHRoZSByZXF1aXJlZCBmYWNldCB2ZXJzaW9ucy4KLSAgICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFjZXRSdW50aW1lU3VwcG9ydGVkKFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmVxdWlyZWRGYWNldFZlcnNpb25zLCBTdHJpbmcgZlJ1bnRpbWVOYW1lKQotICB7Ci0gICAgU2V0IGZSdW50aW1lcyA9IGdldFJ1bnRpbWVzKHJlcXVpcmVkRmFjZXRWZXJzaW9ucyk7Ci0gICAgSXRlcmF0b3IgaXRyID0gZlJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSlpdHIubmV4dCgpOwotICAgICAgaWYgKHJ1bnRpbWUuZ2V0TmFtZSgpLmVxdWFscyhmUnVudGltZU5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBmYWNldCBydW50aW1lcyB0aGF0IHN1cHBvcnQgdGhlIHByb3ZpZGVkIHNldHMgb2YgZmFjZXQgdmVyc2lvbnMuCi0gICAqIAotICAgKiBAcGFyYW0gZmFjZXRTZXRzIGFycmF5IG9mIFNldHMsIHdoZXJlIGVhY2ggU2V0IGNvbnRhaW5zIGVsZW1lbnRzIG9mIHR5cGUge0BsaW5rIElQcm9qZWN0RmFjZXRWZXJzaW9ufS4KLSAgICogQHJldHVybiBTZXQgY29udGFpbmluZyBlbGVtZW50cyBvZiB0eXBlIHtAbGluayBJUnVudGltZX0KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU2V0IGdldFJ1bnRpbWVzKFNldFtdIGZhY2V0U2V0cykgIAotICB7Ci0gICAgSGFzaFNldCB1bmlvblNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGZhY2V0U2V0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTZXQgZmFjZXRzID0gZmFjZXRTZXRzW2ldOwotICAgICAgU2V0IHJ1bnRpbWVzID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZXMoZmFjZXRzKTsKLSAgICAgIEl0ZXJhdG9yIGl0ciA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSlpdHIubmV4dCgpOwotICAgICAgICBpZiAoIXVuaW9uU2V0LmNvbnRhaW5zKHJ1bnRpbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgdW5pb25TZXQuYWRkKHJ1bnRpbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB1bmlvblNldDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGZhY2V0IHJ1bnRpbWUgc3VwcG9ydHMgdGhlIHByb3ZpZGVkIHNldCBvZiBmYWNldCB2ZXJzaW9ucy4KLSAgICogCi0gICAqIEBwYXJhbSBmYWNldFJ1bnRpbWUgYSBmYWNldCBydW50aW1lCi0gICAqIEBwYXJhbSBwcm9qZWN0RmFjZXRWZXJzaW9ucyBzZXQgY29udGFpbmluZyBlbGVtZW50cyBvZiB0eXBlIHtAbGluayBJUHJvamVjdEZhY2V0VmVyc2lvbn0KLSAgICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmYWNldCBydW50aW1lIHN1cHBvcnRzIHRoZSBwcm92aWRlZCBzZXQgb2YgZmFjZXQgdmVyc2lvbnMuCi0gICAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzUnVudGltZVN1cHBvcnRGYWNldHMoSVJ1bnRpbWUgZmFjZXRSdW50aW1lLCBTZXQgcHJvamVjdEZhY2V0VmVyc2lvbnMpCi0gIHsKLSAgICBTZXQgcnVudGltZXMgPSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcyhwcm9qZWN0RmFjZXRWZXJzaW9ucyk7Ci0gICAgSXRlcmF0b3IgaXRyID0gcnVudGltZXMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKWl0ci5uZXh0KCk7Ci0gICAgICBpZiAocnVudGltZS5nZXROYW1lKCkuZXF1YWxzKGZhY2V0UnVudGltZS5nZXROYW1lKCkpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHZlcnNpb25BIGlzIGdyZWF0ZXIgdGhhbiB2ZXJzaW9uQgotICAgKiAKLSAgICogQHBhcmFtIHZlcnNpb25BIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBmb3JtIDEuMi4zCi0gICAqIEBwYXJhbSB2ZXJzaW9uQSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZm9ybSAxLjIuMwotICAgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdmVyc2lvbkEgaXMgZ3JlYXRlciB0aGFuIHZlcnNpb25CLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdyZWF0ZXJUaGFuKFN0cmluZyB2ZXJzaW9uQSwgU3RyaW5nIHZlcnNpb25CKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0QSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyc2lvbkEsICIuIik7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0QiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyc2lvbkIsICIuIik7Ci0gICAgCi0gICAgaW50IHNpemVBID0gc3RBLmNvdW50VG9rZW5zKCk7Ci0gICAgaW50IHNpemVCID0gc3RCLmNvdW50VG9rZW5zKCk7Ci0gICAgCi0gICAgaW50IHNpemU7Ci0gICAgaWYgKHNpemVBIDwgc2l6ZUIpCi0gICAgewotICAgICAgc2l6ZSA9IHNpemVBOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBzaXplID0gc2l6ZUI7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQoc3RBLm5leHRUb2tlbigpKTsKLSAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChzdEIubmV4dFRva2VuKCkpOwotICAgICAgaWYgKGEhPWIpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBhID4gYjsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNpemVBID4gc2l6ZUI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGZhY2V0IGhhcyBhbiBpZCBvZiAianN0LmphdmEiCi0gICAqIEBwYXJhbSBwZiBmYWNldAotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZhY2V0IGhhcyBhbiBpZCBvZiAianN0LmphdmEiLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUZhY2V0KElQcm9qZWN0RmFjZXQgcGYpCi0gIHsKLSAgICBpZiAocGYuZ2V0SWQoKS5lcXVhbHMoImpzdC5qYXZhIikpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBwcm9qZWN0IGlzIGEgZmFjZXRlZCBKYXZhIHV0aWxpdHkgcHJvamVjdCBvciBhIG5vbi1mYWNldGVkIEphdmEgcHJvamVjdC4KLSAgICogCi0gICAqIEBwYXJhbSBwcm9qZWN0IGFuIElQcm9qZWN0Ci0gICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvdmlkZWQgcHJvamVjdCBpcyBhIGZhY2V0ZWQgSmF2YSB1dGlsaXR5IHByb2plY3QgCi0gICAqIG9yIGEgbm9uLWZhY2V0ZWQgSmF2YSBwcm9qZWN0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIC8vQ2hlY2sgaWYgaXQncyBhIGZhY2V0ZWQgcHJvamVjdAotICAgIHRyeQotICAgIHsKLSAgICAgIElGYWNldGVkUHJvamVjdCBmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgIGlmIChmUHJvamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvL1JldHVybiB0cnVlIGlmIGl0J3MgYSB1dGlsaXR5IHByb2plY3QKLSAgICAgICAgaWYgKEoyRUVVdGlscy5pc0phdmFDb21wb25lbnQocHJvamVjdCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvL1NlZSBpZiB0aGUgamF2YSBmYWNldCBpcyB0aGUgb25seSBvbmUgaXQgaGFzLgotICAgICAgICAgIFNldCBmYWNldHMgPSBmUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgICAgaWYgKGZhY2V0cy5zaXplKCk9PTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gcGZ2ID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKWZhY2V0cy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpc0phdmFGYWNldChwZnYuZ2V0UHJvamVjdEZhY2V0KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0KSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICAgIAotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIGlkIGlzIGVxdWFsIHRvICJ0ZW1wbGF0ZS5qc3QudXRpbGl0eSIKLSAgICogCi0gICAqIEBwYXJhbSB0ZW1wbGF0ZUlkIHRlbXBsYXRlIGlkCi0gICAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgaWQgaXMgZXF1YWwgdG8gInRlbXBsYXRlLmpzdC51dGlsaXR5IiwgCi0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVdGlsaXR5VGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlSWQpCi0gIHsKLSAgICBpZiAoUHJvamVjdEZhY2V0c01hbmFnZXIuaXNUZW1wbGF0ZURlZmluZWQodGVtcGxhdGVJZCkpCi0gICAgewotICAgICAgaWYgKHRlbXBsYXRlSWQuZXF1YWxzKCJ0ZW1wbGF0ZS5qc3QudXRpbGl0eSIpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZvbGRlclJlc291cmNlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9Gb2xkZXJSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhmY2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZvbGRlclJlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uQW55RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5Db25zdW1wdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBraW5kIG9mIEZpbHRlciB0aGF0IGFjY2VwdHMgb25seSBvYmplY3RzCi0qIHdoaWNoIGluZGljYXRlIGEgSmF2YSByZXNvdXJjZS4gSW4gcGFydGljdWxhciwgYW55Ci0qIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9IHdob3NlCi0qIHBhdGhuYW1lLCBvciBhbnkgb2JqZWN0IHdob3NlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcwotKiByZXR1cm5lZCBieSA8Y29kZT50b1N0cmluZygpPC9jb2RlPiwgZW5kcyBpbgotKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBvciAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgd2lsbCBiZSBhY2NlcHRlZC4KLSogQWxsIG90aGVyIG9iamVjdHMgd2lsbCBiZSByZWplY3RlZC4KLSovCi1wdWJsaWMgY2xhc3MgRm9sZGVyUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBBbnlGaWx0ZXIKLXsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gdGhhdCBmaWx0ZXJzCi0gICogIjxjb2RlPi5qYXZhPC9jb2RlPiIgYW5kICI8Y29kZT4uY2xhc3M8L2NvZGU+IiBvYmplY3RzLgotICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyKEFMTF9GSUxFUyk8L2NvZGU+LgotICAqLwotICBwdWJsaWMgRm9sZGVyUmVzb3VyY2VGaWx0ZXIgKCkgeyB9Ci0KLSAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gQ29uc3VtcHRpb25NZXNzYWdlcy5GT0xERVJfRklMVEVSX05BTUU7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gQ29uc3VtcHRpb25NZXNzYWdlcy5GT0xERVJfRklMVEVSX0RFU0M7Ci0gIH0KLQotIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgQ29uc3VtcHRpb25NZXNzYWdlcy5GSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNULAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRk9MREVSKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgICAwLAotICAgICAgICAgIE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuRklMVEVSX01TR19FUlJPUl9OT1RfRk9MREVSLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vSVNlcnZlckRlZmF1bHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vSVNlcnZlckRlZmF1bHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFmMWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0lTZXJ2ZXJEZWZhdWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gcHJvdmlkZSBsb2dpYyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8KLSAqIHRoZSBzZXJ2ZXIgZGVmYXVsdGluZyBhbGdvcml0aG0uIAotICogKFNlZSB0aGUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnNlcnZlckRlZmF1bHRlciBleHRlbnNpb24gcG9pbnQpICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyRGVmYXVsdGVyCi17Ci0gIAotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QKLSAgICogQHJldHVybiBTZXJ2ZXJJbmZvLiAKLSAgICogSWYgbm8gZXhpc3Rpbmcgc2VydmVyIG9yIHNlcnZlciB0eXBlIGlzIHJlY29tbWVuZGVkLCByZXR1cm4gbnVsbC4KLSAgICogSWYgYSBzZXJ2ZXIgdHlwZSBpcyByZWNvbW1lbmRlZCwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIFNlcnZlckluZm8gd2l0aCBhIG5vbi1udWxsCi0gICAqIG5vbi1lbXB0eSBTdHJpbmcgZm9yIHRoZSBzZXJ2ZXJGYWN0b3J5SWQgYW5kIG51bGwgZm9yIHRoZSBzZXJ2ZXJJbnN0YW5jZUlkLgotICAgKiBJZiBhIHNlcnZlciBpbnN0YW5jZSBpcyByZWNvbW1lbmRlZCwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIFNlcnZlckluZm8gd2l0aCBhIG5vbi1udWxsCi0gICAqIG5vbi1lbXB0eSBTdHJpbmcgZm9yIHRoZSBzZXJ2ZXJGYWN0b3J5SWQgYW5kIHRoZSBzZXJ2ZXJJbnN0YW5jZUlkLgotICAgKi8KLSAgcHVibGljIFNlcnZlckluZm8gcmVjb21tZW5kRGVmYXVsdFNlcnZlcihJUHJvamVjdCBwcm9qZWN0KTsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9KYXZhUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0phdmFSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTVlYjU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0phdmFSZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5BbnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSogVGhpcyBpcyBhIGtpbmQgb2YgRmlsdGVyIHRoYXQgYWNjZXB0cyBvbmx5IG9iamVjdHMKLSogd2hpY2ggaW5kaWNhdGUgYSBKYXZhIHJlc291cmNlLiBJbiBwYXJ0aWN1bGFyLCBhbnkKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZX0gd2hvc2UKLSogcGF0aG5hbWUsIG9yIGFueSBvYmplY3Qgd2hvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzCi0qIHJldHVybmVkIGJ5IDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LCBlbmRzIGluCi0qICI8Y29kZT4uamF2YTwvY29kZT4iIG9yICI8Y29kZT4uY2xhc3M8L2NvZGU+IiB3aWxsIGJlIGFjY2VwdGVkLgotKiBBbGwgb3RoZXIgb2JqZWN0cyB3aWxsIGJlIHJlamVjdGVkLgotKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBBbnlGaWx0ZXIKLXsKLQotICAvKioKLSAgKiBBIDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gY29uc3RydWN0ZWQgd2l0aCB0aGlzIHZhbHVlIHdpbGwKLSAgKiBhY2NlcHQgIjxjb2RlPi5qYXZhPC9jb2RlPiIsIGJ1dCBub3QgIjxjb2RlPi5jbGFzczwvY29kZT4iLCBvYmplY3RzLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgSkFWQV9GSUxFUyA9IChieXRlKTE7Ci0KLSAgLyoqCi0gICogQSA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXI8L2NvZGU+IGNvbnN0cnVjdGVkIHdpdGggdGhpcyB2YWx1ZSB3aWxsCi0gICogYWNjZXB0ICI8Y29kZT4uY2xhc3M8L2NvZGU+IiwgYnV0IG5vdCAiPGNvZGU+LmphdmE8L2NvZGU+Iiwgb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENMQVNTX0ZJTEVTID0gKGJ5dGUpMjsKLQotICAvKioKLSAgKiBBIDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gY29uc3RydWN0ZWQgd2l0aCB0aGlzIHZhbHVlIHdpbGwKLSAgKiBhY2NlcHQgYm90aCAiPGNvZGU+LmphdmE8L2NvZGU+IiBhbmQgIjxjb2RlPi5jbGFzczwvY29kZT4iIG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBBTExfRklMRVMgPSAoYnl0ZSkyNTU7Ci0KLSAgcHJpdmF0ZSBieXRlIGV4dGVuc2lvbnNfOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMKLSAgKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBhbmQgIjxjb2RlPi5jbGFzczwvY29kZT4iIG9iamVjdHMuCi0gICogRXF1aXZhbGVudCB0byA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXIoQUxMX0ZJTEVTKTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBKYXZhUmVzb3VyY2VGaWx0ZXIgKCkKLSAgewotICAgIHRoaXMoQUxMX0ZJTEVTKTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMKLSAgKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBvYmplY3RzLCAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgb2JqZWN0cywKLSAgKiBvciBib3RoIGlmIHRoZSB2YWx1ZSBvZiA8Y29kZT5leHRlbnNpb25zPC9jb2RlPiBpcwotICAqIHtAbGluayAjSkFWQV9GSUxFU30sIHtAbGluayAjQ0xBU1NfRklMRVN9IG9yIHtAbGluayAjQUxMX0ZJTEVTfQotICAqIHJlc3BlY3RpdmVseS4KLSAgKiBAcGFyYW0gZXh0ZW5zaW9ucyBPbmUgb2YKLSAgKiB7QGxpbmsgI0pBVkFfRklMRVN9LCB7QGxpbmsgI0NMQVNTX0ZJTEVTfSBvciB7QGxpbmsgI0FMTF9GSUxFU30uCi0gICovCi0gIHB1YmxpYyBKYXZhUmVzb3VyY2VGaWx0ZXIgKCBieXRlIGV4dGVuc2lvbnMgKQotICB7Ci0gICAgZXh0ZW5zaW9uc18gPSBleHRlbnNpb25zOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIENvbnN1bXB0aW9uTWVzc2FnZXMuSkFWQV9GSUxURVJfTkFNRTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBDb25zdW1wdGlvbk1lc3NhZ2VzLkpBVkFfRklMVEVSX0RFU0M7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30KLSAgKiBkZXNjcmliaW5nIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+J3MgYXNzZXNzbWVudCBvZgotICAqIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBmaWx0ZXIuCi0gICogQHJldHVybiBBbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBpZiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPgotICAqIHJlcHJlc2VudHMgYSBKYXZhIHJlc291cmNlLgotICAqLwotICBwdWJsaWMgSVN0YXR1cyBzdGF0dXNPZiAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIENvbnN1bXB0aW9uTWVzc2FnZXMuRklMVEVSX01TR19FUlJPUl9OVUxMX09CSkVDVCwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgbmFtZSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAgIDAsCi0gICAgICAgICAgTkxTLmJpbmQoQ29uc3VtcHRpb25NZXNzYWdlcy5GSUxURVJfTVNHX0VSUk9SX05PVF9GSUxFLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBvYmplY3QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFjY2VwdHNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIE5MUy5iaW5kKENvbnN1bXB0aW9uTWVzc2FnZXMuSkFWQV9GSUxURVJfTVNHX0VSUk9SX1dST05HX0VYVEVOU0lPTixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLCIiLG51bGwpOwotICB9Ci0KLSAgLy8KLSAgLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lIGlzIGFjY2VwdGFibGUgYmFzZWQgdXBvbiBpdHMgZXh0ZW5zaW9uCi0gIC8vIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGV4dGVuc2lvbnNfIGJpdG1hc2suCi0gIC8vCi0gIHByaXZhdGUgYm9vbGVhbiBhY2NlcHRzTmFtZSAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIHJldHVybiAoIAotICAgICAgKG5hbWUuZW5kc1dpdGgoIi5qYXZhIikgJiYgKChleHRlbnNpb25zXyAmIEpBVkFfRklMRVMpICE9IDApKSB8fAotICAgICAgKG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpICYmICgoZXh0ZW5zaW9uc18gJiBDTEFTU19GSUxFUykgIT0gMCkpCi0gICAgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vTWFwcGluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9NYXBwaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkYTQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9NYXBwaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHVzZWZ1bCBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggU2VydmVyIHBsdWdpbiBmdW5jdGlvbnMKLSovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFwcGluZ1V0aWxzCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRV9FWFQgPSAiU2VydmljZS53c2RsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQklORElOR19FWFQgPSAiQmluZGluZy53c2RsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVjRfU0VSVklDRV9FWFQgPSAiLXNlcnZpY2Uud3NkbCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1Y0X0JJTkRJTkdfRVhUID0gIi1iaW5kaW5nLndzZGwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFRFTlNJT04gPSAiLndzZGwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GT0xERVIgPSAid3NkbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0tFTEVUT05fUEFDS0FHRU5BTUUgPSAic2VydmljZSI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgV1NETCBmb2xkZXIgcGF0aAotICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V1NETEZvbGRlclBhdGggKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wb25lbnROYW1lKQotICB7Ci0gICAgSVBhdGggd3NkbEZvbGRlcj1udWxsOwotLy8gIAlJUGF0aCB3ZWJNb2R1bGVTZXJ2ZXJSb290ID0gUmVzb3VyY2VVdGlscy5nZXRXZWJNb2R1bGVTZXJ2ZXJSb290KCBwcm9qZWN0ICkuZ2V0RnVsbFBhdGgoKTsKLSAgCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0gIAlpZiAod2ViTW9kdWxlU2VydmVyUm9vdCAhPSBudWxsICkKLSAgCQl3c2RsRm9sZGVyID0gd2ViTW9kdWxlU2VydmVyUm9vdC5hcHBlbmQoV1NETF9GT0xERVIpOwotICAgIHJldHVybiB3c2RsRm9sZGVyOwotICB9Ci0gICAgCi0KLSAgIC8qKgotICAqIFJldHVybnMgdGhlIGJhc2UgbmFtZSBiYXNlZCBvbiBXU0RMIGZpbGUgbmFtZQotICAqIEBwYXJhbSB3c2RsTmFtZSBXU0RMIGZpbGUgbmFtZQotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZSAoU3RyaW5nIHdzZGxMb2NhdGlvbiApCi0gIHsKLSAgCVN0cmluZyB3c2RsTmFtZT13c2RsTG9jYXRpb247Ci0gIAkKLSAgCWludCBpbmRleCA9IHdzZGxMb2NhdGlvbi5sYXN0SW5kZXhPZignLycpOwotICAgIGlmIChpbmRleCE9IC0xKSB7Ci0gICAgICB3c2RsTmFtZSA9IHdzZGxMb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgrMSx3c2RsTmFtZS5sZW5ndGgoKSk7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBiYXNlTmFtZT13c2RsTmFtZTsKLSAgICBpZiAoIHdzZGxOYW1lLmVuZHNXaXRoKERFRkFVTFRfU0VSVklDRV9FWFQpICkgewotICAgICAgYmFzZU5hbWUgPSB3c2RsTmFtZS5zdWJzdHJpbmcoMCwod3NkbE5hbWUubGVuZ3RoKCkgLSBERUZBVUxUX1NFUlZJQ0VfRVhULmxlbmd0aCgpKSk7Ci0gICAgfSBlbHNlIGlmICggd3NkbE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChERUZBVUxUX1Y0X1NFUlZJQ0VfRVhUKSApIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpIC0gREVGQVVMVF9WNF9TRVJWSUNFX0VYVC5sZW5ndGgoKSkpOwotICAgIH0gZWxzZSBpZiAod3NkbE5hbWUuZW5kc1dpdGgoREVGQVVMVF9CSU5ESU5HX0VYVCkpIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpLURFRkFVTFRfQklORElOR19FWFQubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgaWYgKHdzZGxOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoREVGQVVMVF9WNF9CSU5ESU5HX0VYVCkpIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpLURFRkFVTFRfVjRfQklORElOR19FWFQubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgaWYgKHdzZGxOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoV1NETF9FWFRFTlNJT04pKSB7Ci0gICAgCWJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpIC0gV1NETF9FWFRFTlNJT04ubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gbm8gcmVjb2duaXphYmxlIHN1ZmZpeCwganVzdCByZW1vdmUgZXh0ZW5zaW9uLCBpZiBhbnkKLSAgICAgIGludCBpbmRleDQgPSBiYXNlTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgaWYgKGluZGV4NCE9LTEpCi0gICAgICAgIGJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4NCk7Ci0gICAgfQotICAgIHJldHVybiBiYXNlTmFtZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9Qcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1Byb3BlcnRpZXNSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjdmNGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1Byb3BlcnRpZXNSZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5BbnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLkNvbnN1bXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSogVGhpcyBpcyBhIGtpbmQgb2YgRmlsdGVyIHRoYXQgYWNjZXB0cyBvbmx5IG9iamVjdHMKLSogd2hpY2ggaW5kaWNhdGUgYSBKYXZhIHJlc291cmNlLiBJbiBwYXJ0aWN1bGFyLCBhbnkKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZX0gd2hvc2UKLSogcGF0aG5hbWUsIG9yIGFueSBvYmplY3Qgd2hvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzCi0qIHJldHVybmVkIGJ5IDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LCBlbmRzIGluCi0qICI8Y29kZT4uamF2YTwvY29kZT4iIG9yICI8Y29kZT4uY2xhc3M8L2NvZGU+IiB3aWxsIGJlIGFjY2VwdGVkLgotKiBBbGwgb3RoZXIgb2JqZWN0cyB3aWxsIGJlIHJlamVjdGVkLgotKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBBbnlGaWx0ZXIKLXsKLSAKLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXI8L2NvZGU+IHRoYXQgZmlsdGVycwotICAqICI8Y29kZT4uamF2YTwvY29kZT4iIGFuZCAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgb2JqZWN0cy4KLSAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcihBTExfRklMRVMpPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIFByb3BlcnRpZXNSZXNvdXJjZUZpbHRlciAoKQotICB7Ci0gICAgCi0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gQ29uc3VtcHRpb25NZXNzYWdlcy5QUk9QRVJUSUVTX0ZJTFRFUl9OQU1FOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIENvbnN1bXB0aW9uTWVzc2FnZXMuUFJPUEVSVElFU19GSUxURVJfREVTQzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIEFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30KLSAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGlmIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogcmVwcmVzZW50cyBhIEphdmEgcmVzb3VyY2UuCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgQ29uc3VtcHRpb25NZXNzYWdlcy5GSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNULAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgICAgMCwKLSAgICAgICAgICBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLkZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEUsbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgICAgbnVsbAotICAgICAgICApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgbmFtZSA9IG9iamVjdC50b1N0cmluZygpOwotICAgIH0KLQotCWlmICghbmFtZS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAwLAotICAgICAgICBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLlBST1BFUlRJRVNfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT04sbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgIG51bGwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9SZXF1aXJlZEZhY2V0VmVyc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vUmVxdWlyZWRGYWNldFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1MDFkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9SZXF1aXJlZEZhY2V0VmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAxMzEgMTIxMDcxICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFJlcXVpcmVkRmFjZXRWZXJzaW9uCi17Ci0gIHByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gcHJvamVjdEZhY2V0VmVyc2lvbjsKLSAgcHJpdmF0ZSBib29sZWFuIGFsbG93TmV3ZXI7Ci0gIHByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb25bXSBhbGxvd2VkUHJvamVjdEZhY2V0VmVyc2lvbnM7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd05ld2VyKCkKLSAgewotICAgIHJldHVybiBhbGxvd05ld2VyOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldEFsbG93TmV3ZXIoYm9vbGVhbiBhbGxvd05ld2VyKQotICB7Ci0gICAgdGhpcy5hbGxvd05ld2VyID0gYWxsb3dOZXdlcjsKLSAgfQotICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gcHJvamVjdEZhY2V0VmVyc2lvbjsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0RmFjZXRWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIHByb2plY3RGYWNldFZlcnNpb24pCi0gIHsKLSAgICB0aGlzLnByb2plY3RGYWNldFZlcnNpb24gPSBwcm9qZWN0RmFjZXRWZXJzaW9uOwotICB9ICAKLSAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uW10gZ2V0QWxsb3dlZFByb2plY3RGYWNldFZlcnNpb25zKCkgIAotICB7Ci0gICAgaWYgKGFsbG93ZWRQcm9qZWN0RmFjZXRWZXJzaW9ucyA9PSBudWxsKQotICAgIHsKLSAgICAgIEFycmF5TGlzdCB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIG1pbnBmdiA9IGdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgIHZlcnNpb25zLmFkZChtaW5wZnYpOwotICAgICAgLy9JZiBhbGxvdy1uZXdlciBpcyB0cnVlLCBhZGQgYWxsIHRoZSB2ZXJzaW9ucyBncmVhdGVyIHRoYW4gdGhlIG1pbiB2ZXJzaW9uLgotICAgICAgaWYgKGdldEFsbG93TmV3ZXIoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1pblZlcnNpb24gPSBtaW5wZnYuZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICBJdGVyYXRvciBhbGxWZXJzaW9uc0l0ciA9IG1pbnBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRWZXJzaW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChhbGxWZXJzaW9uc0l0ci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiB0ZXN0cGZ2ID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKWFsbFZlcnNpb25zSXRyLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgdGVzdFZlcnNpb24gPSB0ZXN0cGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICBpZiAoRmFjZXRVdGlscy5ncmVhdGVyVGhhbih0ZXN0VmVyc2lvbiwgbWluVmVyc2lvbikpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmVyc2lvbnMuYWRkKHRlc3RwZnYpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGFsbG93ZWRQcm9qZWN0RmFjZXRWZXJzaW9ucyA9IChJUHJvamVjdEZhY2V0VmVyc2lvbltdKXZlcnNpb25zLnRvQXJyYXkobmV3IElQcm9qZWN0RmFjZXRWZXJzaW9uWzBdKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGFsbG93ZWRQcm9qZWN0RmFjZXRWZXJzaW9uczsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1NlcnZlckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1NlcnZlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyNWNiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9TZXJ2ZXJJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckluZm8KLXsKLSAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZDsKLSAgU3RyaW5nIHNlcnZlckluc3RhbmNlSWQ7Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckZhY3RvcnlJZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkKCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgVGhlIHNlcnZlckZhY3RvcnlJZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIHRoaXMuc2VydmVyRmFjdG9yeUlkID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckluc3RhbmNlSWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluc3RhbmNlSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZlckluc3RhbmNlSWQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2ZXJJbnN0YW5jZUlkIFRoZSBzZXJ2ZXJJbnN0YW5jZUlkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0gIHsKLSAgICB0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XU0RMUGFyc2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV1NETFBhcnNlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkZDE4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XU0RMUGFyc2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogCi0gKiBUaGUgZmFjdG9yeSBjbGFzcyBjYW4gYmUgdXNlZCB0byBnZXQgYXQgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlCi0gKiBXU0RMIHBhcnNlci4gIE5vdGU6ICBUaGlzIGNsYXNzIGlzIHRlbXBvcmFyeS4gIFdlIHdpbGwgcHJvYmFibHkgY29tZQotICogdXAgd2l0aCBhIGJldHRlciBtZXRob2Qgb2YgaGFuZGxpbmcgcGFzc2luZyBhcm91bmQgdGhlIHBhcnNlci4KLSAqCi0gKi8KLS8vVE9ETyBXZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5IHRvIHBhc3MgYXJvdW5kIHRoZSBwYXJzZXIgdGhhbgotLy8gICAgIHVzaW5nIHRoaXMgc2luZ2xldG9uIGZhY3RvcnkuICBIb3BlZnVsbHksIHdlIGNhbiB0aGVuIGRlbGV0ZQotLy8gICAgIHRoaXMgY2xhc3MuCi1wdWJsaWMgY2xhc3MgV1NETFBhcnNlckZhY3RvcnkgCi17Ci0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VzUGFyc2VyRXh0IHBhcnNlcl87Ci0gIAotICBwcml2YXRlIFdTRExQYXJzZXJGYWN0b3J5KCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdTRExQYXJzZXIoKQotICB7Ci0gICAgaWYoIHBhcnNlcl8gPT0gbnVsbCApCi0JewotCSAgcGFyc2VyXyA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotCX0KLQkKLQlyZXR1cm4gcGFyc2VyXzsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIGtpbGxQYXJzZXIoKQotICB7Ci0gICAgcGFyc2VyXyA9IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dTRExSZXNvdXJjZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV1NETFJlc291cmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MDgxOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV1NETFJlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotKiBUaGlzIGlzIGEga2luZCBvZiBGaWx0ZXIgdGhhdCBhY2NlcHRzIG9ubHkgb2JqZWN0cwotKiB3aGljaCBpbmRpY2F0ZSBhIFdTREwgcmVzb3VyY2UuIEluIHBhcnRpY3VsYXIsIGFueQotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSB3aG9zZQotKiBwYXRobmFtZSwgb3IgYW55IG9iamVjdCB3aG9zZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXMKLSogcmV0dXJuZWQgYnkgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4sIGVuZHMgaW4KLSogIjxjb2RlPi53c2RsPC9jb2RlPiIgd2lsbCBiZSBhY2NlcHRlZC4KLSogQWxsIG90aGVyIG9iamVjdHMgd2lsbCBiZSByZWplY3RlZC4KLSovCi1wdWJsaWMgY2xhc3MgV1NETFJlc291cmNlRmlsdGVyIGV4dGVuZHMgQW55RmlsdGVyCi17Ci0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+V1NETFJlc291cmNlRmlsdGVyPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIFdTRExSZXNvdXJjZUZpbHRlciAoKQotICB7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gQ29uc3VtcHRpb25NZXNzYWdlcy5XU0RMX0ZJTFRFUl9OQU1FOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIENvbnN1bXB0aW9uTWVzc2FnZXMuV1NETF9GSUxURVJfREVTQzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIEFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30KLSAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGlmIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogcmVwcmVzZW50cyBhIFdTREwgcmVzb3VyY2UuCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgQ29uc3VtcHRpb25NZXNzYWdlcy5GSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNULAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgICAgMCwKLSAgICAgICAgICBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLkZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEUsbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgICAgbnVsbAotICAgICAgICApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgbmFtZSA9IG9iamVjdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIGlmICghbmFtZS5lbmRzV2l0aCgiLndzZGwiKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAwLAotICAgICAgICBOTFMuYmluZChDb25zdW1wdGlvbk1lc3NhZ2VzLldTRExfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT04sbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgIG51bGwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YjM4MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci0KLQotCi0vKioKLSogVGhpcyBpcyB0aGUgcmVnaXN0cnkgb2YgV2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZSBvYmplY3RzLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeQotewotCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IGluc3RhbmNlXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgU3RhcnRTZXJ2ZXJUeXBlczsKLQotICAvLwotICAvLyBMb2FkcyBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGdldEluc3RhbmNlKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkICgpCi0gIHsKLSAgICBTdGFydFNlcnZlclR5cGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUiKTsKLQotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgZmFjdG9yeUlkXyA9IGVsZW0uZ2V0QXR0cmlidXRlKCJmYWN0b3J5SWQiKTsKLQkJICBTdGFydFNlcnZlclR5cGVzLnB1dChmYWN0b3J5SWRfLCBlbGVtKTsKLQkgIAotICAgICAgfSAKLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgSUxvZyBsb2cgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUxvZygpOwotICAgICAgICBsb2cubG9nKElMb2cuRVJST1IsIDUwNDcsIHRoaXMsICJsb2FkIiwgZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkoKTsKLSAgICAgIGluc3RhbmNlXy5sb2FkKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAgcHVibGljIE9iamVjdCBnZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkIChTdHJpbmcgdHlwZUlEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgewotICAgIGlmICh0eXBlSUQ9PW51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpU3RhcnRTZXJ2ZXJUeXBlcy5nZXQodHlwZUlEKSkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgfQotICAKLSAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3ZlRUFSUmVxdWlyZWQoU3RyaW5nIHR5cGVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgCWlmICh0eXBlSWQhPW51bGwpIHsKLSAgIAkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KVN0YXJ0U2VydmVyVHlwZXMuZ2V0KHR5cGVJZCk7Ci0gICAJCWlmIChlbGVtIT1udWxsKXsKLSAgIAkJCVN0cmluZyB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKCJyZW1vdmVFQVIiKTsKLSAgIAkJCWlmICh2YWx1ZSE9bnVsbCl7Ci0gICAJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAJCQl9Ci0gICAJCX0KLSAgIAl9Ci0JcmV0dXJuIHRydWU7ICAgCQkgCi0gICB9ICAgCi19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3YWE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXJyYXlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4uCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEubGFuZy5DbGFzcywgamF2YS5iZWFucy5CZWFuRGVzY3JpcHRvci4KLSovCi1wdWJsaWMgY2xhc3MgQXJyYXlFbGVtZW50IGV4dGVuZHMgVHlwZUVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQVJSQVlfTkFNRSA9ICIxMDEwMTAxMGFycmF5MTAxMDEwMTAiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfTUVUSE9EUyA9ICJyZWxtZXRob2RzIjsKLSAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIHByb2plY3RFbGVtZW50IFRoZSBwcm9qZWN0IHRoaXMgQmVhbiBiZWxvbmdzIHRvLgotICAqLwotICBwdWJsaWMgQXJyYXlFbGVtZW50IChTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMobmFtZSxuZXcgQmFzaWNNb2RlbCgiUHJvamVjdCIpLHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIHBhcmFtZXRlckVsZW1lbnQgVGhlIHBhcmFtZXRlciB0aGlzIEJlYW4gYmVsb25ncyB0by4KLSAgKi8KLSAgcHVibGljIEFycmF5RWxlbWVudCAoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLGJvb2xlYW4gaXNSb290KQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCxUeXBlRWxlbWVudC5BUlJBWSk7Ci0gICAgaWYoaXNSb290KSBtb2RlbC5zZXRSb290RWxlbWVudCh0aGlzKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuUk9PVDsKLSAgfQotICAKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2FzZSB3aGVuIHRoaXMgaXMgbm90IHRoZSByb290IG9iamVjdAotICAqIGhlcmUgaXQgcmVwcmVzZW50cyBjb21wbGV4IHR5cGVzCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBiZWFuIGVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBBcnJheUVsZW1lbnQgKCBQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxwYXJhbWV0ZXJFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5BUlJBWSk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LlBBUkFNRVRFUl9PV05FUjsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2FzZSB3aGVuIHRoaXMgaXMgbm90IHRoZSByb290IG9iamVjdAotICAqIGhlcmUgaXQgcmVwcmVzZW50cyBjb21wbGV4IHR5cGVzCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBQYXJhbWV0ZXJFbGVtZW50LgotICAqLwotICBwdWJsaWMgQXJyYXlFbGVtZW50ICggQXR0cmlidXRlRWxlbWVudCBhdHRyaWJ1dGVFbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYXR0cmlidXRlRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQVJSQVkpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5BVFRSSUJVVEVfT1dORVI7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBGaWVsZEVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBQYXJhbWV0ZXJFbGVtZW50LgotICAqLwotICBwdWJsaWMgQXJyYXlFbGVtZW50ICggRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGZpZWxkRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQVJSQVkpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5GSUVMRF9PV05FUjsKLSAgfQotCi0KLSAgLyoKLSAgKiBkZXRlcm1pbmUgd2V0aGVyIHRoaXMgaXMgYW4gb2JqZWN0IGFycmF5IG9yCi0gICogcHJpbWl0aXZlIGFycmF5Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIEFSUkFZX05BTUUgKyBnZXROYW1lKCk7Ci0gIH0KLQotIAotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0FycmF5VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0FycmF5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdjZTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgQXJyYXlUeXBlIGV4dGVuZHMgUmVjb2duaXplZFJldHVyblR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgdGhpcyhUeXBlRmFjdG9yeS5BUlJBWV9OQU1FLHR5cGVOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBBcnJheVR5cGUoU3RyaW5nIG5hbWUsU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0gCi0KLSAKLSAgIC8qKgotICAqIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRpY3RhdGVzIGhvdyB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyB0eXBlIAotICAqIHVwb24gcmVjZWl2aW5nIGl0IGFzIGEgcmV0dXJuIGZyb20gYSBwcm94eSBtZXRob2QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGRpc3BsYXkgc3RyaW5nCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgCi0gICAgU3RyaW5nIG5vbkJlYW4gPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnV0aWwuTGlzdCBsaXN0IiArIGdldFVuaXF1ZU5hbWUoKSArICI9IGphdmEudXRpbC5BcnJheXMuYXNMaXN0KCIgKyBuYW1lICsgIik7IiArU3RyaW5nVXRpbHMuTkVXTElORQotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJTdHJpbmcgdGVtcCIrIGdldFVuaXF1ZU5hbWUoKSArIiA9IGxpc3QiICsgZ2V0VW5pcXVlTmFtZSgpICsgIi50b1N0cmluZygpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAKLSAgICAJICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9dGVtcCIrIGdldFVuaXF1ZU5hbWUoKSArIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIG5vbkJlYW47Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BdHRyaWJ1dGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzY2M1MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmEgYmVhbiBtZXRob2QgcGFyYW1ldGVyLgotKiBOZWFyZXN0IG1vcmFsIGVxdWl2YWxlbnRzOiBqYXZhLmJlYW5zLlBhcmFtZXRlckRlc2NyaXB0b3IuCi0qLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQgaW1wbGVtZW50cyBBdHRyaWJ1dGVFbGVtZW50VHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfT1dOSU5HX0JFQU4gPSAib3duaW5nYmVhbiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZlNldHRlck1ldGhvZDsKLSAgcHJpdmF0ZSBTdHJpbmcgZkdldHRlck1ldGhvZDsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciB0aGlzIHRha2VzIHRoZSBvd25pbmcgYmVhbi4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAqIEBwYXJhbSBiZWFuRWxlbWVudCB0aGUgYmVhbiB0aGF0IG93bnMgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBBdHRyaWJ1dGVFbGVtZW50ICggQmVhbkVsZW1lbnQgYmVhbkVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiZWFuRWxlbWVudCxSRUxfT1dOSU5HX0JFQU4sQmVhbkVsZW1lbnQuUkVMX0FUVFJJQlVURVMpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXJNZXRob2QoU3RyaW5nIHNldHRlck1ldGhvZCkKLSAgewotICAgIGZTZXR0ZXJNZXRob2QgPSBzZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNldHRlck1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZlNldHRlck1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0R2V0dGVyTWV0aG9kKCkKLSAgewotICAgIHJldHVybiBmR2V0dGVyTWV0aG9kOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldEdldHRlck1ldGhvZChTdHJpbmcgZ2V0dGVyTWV0aG9kKQotICB7Ci0gICAgZkdldHRlck1ldGhvZCA9IGdldHRlck1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyU2lnbmF0dXJlKFN0cmluZyBhdHRyaWJ1dGUpCi0gIHsKLSAgICBpbnQgYnJhY2tldCA9IGZTZXR0ZXJNZXRob2QuaW5kZXhPZigiKCIpOwotICAgIGJyYWNrZXQrKzsKLSAgICBTdHJpbmcgc2V0dGVyID0gZlNldHRlck1ldGhvZC5zdWJzdHJpbmcoMCxicmFja2V0KTsKLSAgICBTdHJpbmcgZnVsbFNldHRlciA9IHNldHRlciArIGF0dHJpYnV0ZSArICIpOyI7Ci0gICAKLSAgICByZXR1cm4gZnVsbFNldHRlcjsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgQXR0cmlidXRlLgotICAqIEByZXR1cm4gQmVhbkVsZW1lbnQgVGhlIGJlYW4gdGhhdCBvd25zIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgZ2V0T3duaW5nQmVhbkVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfT1dOSU5HX0JFQU4pOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKEJlYW5FbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSB0eXBlIHRoYXQgaXMgb3duZWQgYnkgdGhpcyBhdHRyaWJ1dHRlLgotICAqIEByZXR1cm4gVHlwZUVsZW1lbnQgVGhlIFR5cGUgdGhhdCBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIFR5cGVFbGVtZW50IGdldFR5cGVFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX1RZUEUpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKFR5cGVFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwYjZmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmEgYmVhbiBtZXRob2QgcGFyYW1ldGVyLgotKiBOZWFyZXN0IG1vcmFsIGVxdWl2YWxlbnRzOiBqYXZhLmJlYW5zLlBhcmFtZXRlckRlc2NyaXB0b3IuCi0qLwotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVFbGVtZW50VHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHB1YmxpYyB2b2lkIHNldFNldHRlck1ldGhvZChTdHJpbmcgc2V0dGVyTWV0aG9kKTsKLSAgcHVibGljIFN0cmluZyBnZXRTZXR0ZXJNZXRob2QoKTsKLSAgcHVibGljIFN0cmluZyBnZXRHZXR0ZXJNZXRob2QoKTsKLSAgcHVibGljIHZvaWQgc2V0R2V0dGVyTWV0aG9kKFN0cmluZyBnZXR0ZXJNZXRob2QpOwotICBwdWJsaWMgQmVhbkVsZW1lbnQgZ2V0T3duaW5nQmVhbkVsZW1lbnQgKCk7Ci0gIHB1YmxpYyBUeXBlRWxlbWVudCBnZXRUeXBlRWxlbWVudCAoKTsKLSAgLyoqCi0gICogUmV0dXJuIHRoZSBzaWduYXR1cmUgd2l0aCB0aGlzIHZhbHVlIGFzIHRoZSBwYXJtZXRlcgotICAqCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyU2lnbmF0dXJlKFN0cmluZyBhdHRyaWJ1dGUpOwotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmVhbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I4NDJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmVhbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNjEyICAgMTQ1NDMzIGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuLgotKiBOZWFyZXN0IG1vcmFsIGVxdWl2YWxlbnRzOiBqYXZhLmxhbmcuQ2xhc3MsIGphdmEuYmVhbnMuQmVhbkRlc2NyaXB0b3IuCi0qLwotcHVibGljIGNsYXNzIEJlYW5FbGVtZW50IGV4dGVuZHMgVHlwZUVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1RBVEVMRVNTX0JFQU4gPSAiMTAxMDEwMTBzdGF0ZWxlc3NiZWFuMTAxMDEwMTAiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfTUVUSE9EUyA9ICJyZWxtZXRob2RzIjsKLSAgcHVibGljIHN0YXRpYyBpbnQgUkVBRE9OTFkgPSAwOwotICBwdWJsaWMgc3RhdGljIGludCBXUklURU9OTFkgPSAxOwotICBwdWJsaWMgc3RhdGljIGludCBSRUFEV1JJVEUgPSAyOwotICBwcml2YXRlIGludCBhdHRyaWIgPSAyOwotICAKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIAotICAqIEBwYXJhbSBwcm9qZWN0RWxlbWVudCBUaGUgcHJvamVjdCB0aGlzIEJlYW4gYmVsb25ncyB0by4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50IChTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMobmFtZSxuZXcgQmFzaWNNb2RlbCgiUHJvamVjdCIpLHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIHBhcmFtZXRlckVsZW1lbnQgVGhlIHBhcmFtZXRlciB0aGlzIEJlYW4gYmVsb25ncyB0by4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50IChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsYm9vbGVhbiBpc1Jvb3QpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1vZGVsLFR5cGVFbGVtZW50LkJFQU4pOwotICAgIGlmKGlzUm9vdCkgbW9kZWwuc2V0Um9vdEVsZW1lbnQodGhpcyk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LlJPT1Q7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgYmVhbiBlbGVtZW50LgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgKCBQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxwYXJhbWV0ZXJFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5CRUFOKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuUEFSQU1FVEVSX09XTkVSOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgZm9yIHRoZSBjYXNlIHdoZW4gdGhpcyBpcyBub3QgdGhlIHJvb3Qgb2JqZWN0Ci0gICogaGVyZSBpdCByZXByZXNlbnRzIGNvbXBsZXggdHlwZXMKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgUGFyYW1ldGVyIHRoYXQgb3ducyB0aGlzIGJlYW4gdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIFBhcmFtZXRlckVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCAoIEF0dHJpYnV0ZUVsZW1lbnQgYXR0cmlidXRlRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGF0dHJpYnV0ZUVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LkJFQU4pOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5BVFRSSUJVVEVfT1dORVI7Ci0gICAgYXR0cmliRnVuY3Rpb24oYXR0cmlidXRlRWxlbWVudCk7Ci0gIH0KLSAKLSAgcHJpdmF0ZSB2b2lkIGF0dHJpYkZ1bmN0aW9uKEF0dHJpYnV0ZUVsZW1lbnQgYXR0cmlidXRlRWxlbWVudCl7Ci0JaWYoYXR0cmlidXRlRWxlbWVudC5nZXRHZXR0ZXJNZXRob2QoKSAhPSBudWxsICYmIGF0dHJpYnV0ZUVsZW1lbnQuZ2V0U2V0dGVyTWV0aG9kKCkgIT0gbnVsbCkgYXR0cmliID0gUkVBRFdSSVRFOwotCWVsc2UgaWYoYXR0cmlidXRlRWxlbWVudC5nZXRHZXR0ZXJNZXRob2QoKSA9PSBudWxsICYmIGF0dHJpYnV0ZUVsZW1lbnQuZ2V0U2V0dGVyTWV0aG9kKCkgIT0gbnVsbCkgYXR0cmliID0gV1JJVEVPTkxZOwotCWVsc2UgaWYoYXR0cmlidXRlRWxlbWVudC5nZXRHZXR0ZXJNZXRob2QoKSAhPSBudWxsICYmIGF0dHJpYnV0ZUVsZW1lbnQuZ2V0U2V0dGVyTWV0aG9kKCkgPT0gbnVsbCkgYXR0cmliID0gUkVBRE9OTFk7Ci0gIH0KLSAgCi0gICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgUGFyYW1ldGVyRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50ICggRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGZpZWxkRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQkVBTik7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LkZJRUxEX09XTkVSOwotICAKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIEFsbCBNZXRob2Qgb2JqZWN0cyBvZiB0aGlzIEJlYW4uCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRNZXRob2RzICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX01FVEhPRFMpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZk1ldGhvZEVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfTUVUSE9EUyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIGlmKGlzU3RhdGVMZXNzKCkpIHJldHVybiBTVEFURUxFU1NfQkVBTiArIGdldE5hbWUoKTsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRBdHRyaWIoKQotICB7Ci0gICAgcmV0dXJuIGF0dHJpYjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QXR0cmliKGludCBhdHRyaWIpCi0gIHsKLSAgICB0aGlzLmF0dHJpYiA9IGF0dHJpYjsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZUxlc3MoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZWEgPSBnZXRFbGVtZW50cyhUeXBlRWxlbWVudC5SRUxfQVRUUklCVVRFUyk7Ci0gICAgRW51bWVyYXRpb24gZWYgPSBnZXRFbGVtZW50cyhUeXBlRWxlbWVudC5SRUxfRklFTERTKTsKLSAgICBpZihlYS5oYXNNb3JlRWxlbWVudHMoKSB8fCBlZi5oYXNNb3JlRWxlbWVudHMoKSkgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQ3OTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tb24uU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFR5cGVGYWN0b3J5Ci0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDEyOjQxOjQ4IFBNKQotICogQGF1dGhvcjogR2lsYmVydCBBbmRyZXdzCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTl9QQVJBTV9OQU1FPSJyZXR1cm5wIjsKLQotICBwcml2YXRlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeSgpe30KLQotICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0QmVhbk1vZGVsRWxlbWVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KG9iamVjdCxudWxsLG51bGwpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEJlYW5Nb2RlbEVsZW1lbnQoT2JqZWN0IG9iamVjdCxFbGVtZW50IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQob2JqZWN0LHBhcmVudEVsZW1lbnQsbnVsbCk7Ci0gIH0KLSAgCi0gLyoKLSAgKiBUYWtlIGluIGFuIG9iamVjdCBhbmQgcmV0dXJuIGFuIGVsZW1lbnQgZGVwZW5kaW5nIG9uIHdoYXQgCi0gICogdHlwZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGZyb20gdGhlIGphdmFtb2YKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRCZWFuTW9kZWxFbGVtZW50KE9iamVjdCBvYmplY3QsRWxlbWVudCBwYXJlbnRFbGVtZW50LCBNb2RlbCBtb2RlbCkKLSAgewotICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSmF2YUNsYXNzKXsKLSAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKW9iamVjdDsKLSAgICAgIFN0cmluZyBqYXZhTmFtZSA9IGphdmFDbGFzcy5nZXRKYXZhTmFtZSgpOwotICAgICAgaWYgKCFqYXZhQ2xhc3MuaXNBcnJheSgpKXsgCi0JICAgICAgaWYocGFyZW50RWxlbWVudCA9PSBudWxsICYmIG1vZGVsID09bnVsbCkgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudChqYXZhTmFtZSk7Ci0JICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgIT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEJlYW5FbGVtZW50KGphdmFOYW1lLG1vZGVsLGZhbHNlKTsKLQkgICAgICBlbHNlewotCSAgICAgICAgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtZXRlckVsZW1lbnQpeyAKLQkgICAgICAgICAgIFBhcmFtZXRlckVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoUGFyYW1ldGVyRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVFbGVtZW50KXsKLQkgICAgICAgICAgIEF0dHJpYnV0ZUVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoQXR0cmlidXRlRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGaWVsZEVsZW1lbnQpewotICAgICAgICAgICAgICAgRmllbGRFbGVtZW50IHRlbXBFbGVtZW50ID0gKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLSAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgUGFyYW1ldGVyRWxlbWVudCgoTWV0aG9kRWxlbWVudClwYXJlbnRFbGVtZW50LFJFVFVSTl9QQVJBTV9OQU1FLE1ldGhvZEVsZW1lbnQuUkVMX1JFVFVSTl9QQVJBTUVURVJTLHRydWUpOwotICAgICAgICAgICAgfQkgICAgICAgICAKLQkgICAgICB9Ci0gICAgICB9IAotICAgICAgZWxzZXsKLSAgICAgICAgICBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgPT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudChqYXZhTmFtZSk7Ci0JICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgIT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudChqYXZhTmFtZSxtb2RlbCxmYWxzZSk7Ci0JICAgICAgZWxzZXsKLQkgICAgICAgIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbGVtZW50KXsgCi0JICAgICAgICAgICBQYXJhbWV0ZXJFbGVtZW50IHRlbXBFbGVtZW50ID0gKFBhcmFtZXRlckVsZW1lbnQpcGFyZW50RWxlbWVudDsKLQkgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgQXJyYXlFbGVtZW50KHRlbXBFbGVtZW50LGphdmFOYW1lKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUVsZW1lbnQpewotCSAgICAgICAgICAgQXR0cmlidXRlRWxlbWVudCB0ZW1wRWxlbWVudCA9IChBdHRyaWJ1dGVFbGVtZW50KXBhcmVudEVsZW1lbnQ7Ci0JICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGaWVsZEVsZW1lbnQpewotICAgICAgICAgICAgICAgRmllbGRFbGVtZW50IHRlbXBFbGVtZW50ID0gKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBBcnJheUVsZW1lbnQodGVtcEVsZW1lbnQsamF2YU5hbWUpOwotCSAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCl7Ci0gICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsKLSAgICAgICAgICAgIH0KLQotCSAgICAgIH0KLSAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpewotICAgICAgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gKFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcilvYmplY3Q7Ci0gICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEF0dHJpYnV0ZUVsZW1lbnQoKEJlYW5FbGVtZW50KXBhcmVudEVsZW1lbnQscGQuZ2V0TmFtZSgpKTsgIAotICAgIH0KLSAgICBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEZpZWxkKXsKLSAgICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKW9iamVjdDsKLSAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRmllbGRFbGVtZW50KChCZWFuRWxlbWVudClwYXJlbnRFbGVtZW50LGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZCl7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClvYmplY3Q7Ci0gICAgICByZXR1cm5FbGVtZW50ID0gbmV3IE1ldGhvZEVsZW1lbnQoKEJlYW5FbGVtZW50KXBhcmVudEVsZW1lbnQsbWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgfQotICAgIC8vbm9uIGJlYW5pbmZvCi0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKXsKLSAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylvYmplY3Q7ICAKLSAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgQXR0cmlidXRlRWxlbWVudCgoQmVhbkVsZW1lbnQpcGFyZW50RWxlbWVudCxuYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSmF2YVBhcmFtZXRlcil7Ci0gICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSAoSmF2YVBhcmFtZXRlcilvYmplY3Q7Ci0KLSAgICAgIAotICAgICAgaWYgKGphdmFQYXJhbWV0ZXIuaXNSZXR1cm4oKSkgCi0gICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsgCi0gICAgICBlbHNleyAKLSAgICAgICAgIC8vYSBqYXZhIHBhcmFtZXRlciBnaXZlcyB1cyB0aGUgcXVhbGlmaWVkIG5hbWUgd2UgZG9udCB3YW50IHRoaXMKLSAgICAgICAgIFN0cmluZyBuYW1lID0gamF2YVBhcmFtZXRlci5nZXRRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICBTdHJpbmcgc2hvcnROYW1lOwotICAgICAgICAgaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgaWYgKGluZGV4ICE9IC0xKXsKLSAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgc2hvcnROYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgICAgICAgfQotICAgICAgZWxzZSBzaG9ydE5hbWUgPSBuYW1lOwotCi0gICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxzaG9ydE5hbWUsTWV0aG9kRWxlbWVudC5SRUxfUEFSQU1FVEVSUyxmYWxzZSk7IAotCi0gICAgICB9Ci0gICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBKYXZhSGVscGVycyl7Ci0gICAgICBKYXZhSGVscGVycyBqYXZhSGVscGVyID0gKEphdmFIZWxwZXJzKW9iamVjdDsKLSAgICAgIFN0cmluZyBqYXZhTmFtZTsgCi0gICAgICBpZiAoamF2YUhlbHBlci5pc0FycmF5KCkpIGphdmFOYW1lID0gVHlwZUZhY3RvcnkuQVJSQVlfTkFNRTsKLSAgICAgIGVsc2UgamF2YU5hbWUgPSBqYXZhSGVscGVyLmdldEphdmFOYW1lKCk7Ci0gICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtZXRlckVsZW1lbnQpewotICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgU2ltcGxlRWxlbWVudCgoUGFyYW1ldGVyRWxlbWVudClwYXJlbnRFbGVtZW50LGphdmFOYW1lLGphdmFIZWxwZXIuaXNQcmltaXRpdmUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVFbGVtZW50KXsKLSAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFNpbXBsZUVsZW1lbnQoKEF0dHJpYnV0ZUVsZW1lbnQpcGFyZW50RWxlbWVudCxqYXZhTmFtZSxqYXZhSGVscGVyLmlzUHJpbWl0aXZlKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRmllbGRFbGVtZW50KXsKLSAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFNpbXBsZUVsZW1lbnQoKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50LGphdmFOYW1lLGphdmFIZWxwZXIuaXNQcmltaXRpdmUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLSAgICAgIAlyZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybkVsZW1lbnQ7Ci0gIH0KLSAgCi0gIAotICAKLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CaWdEZWNpbWFsVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0RlY2ltYWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZGEwYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0RlY2ltYWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgQmlnRGVjaW1hbFR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEJpZ0RlY2ltYWxUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkJJR19ERUNJTUFMX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAibmV3IGphdmEubWF0aC5CaWdEZWNpbWFsKCIgKyBuYW1lICsgIik7IjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmFtZSArICIudG9TdHJpbmcoKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CaWdJbnRlZ2VyVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0ludGVnZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjYwMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0ludGVnZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgQmlnSW50ZWdlclR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEJpZ0ludGVnZXJUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkJJR19JTlRFR0VSX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAibmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIgKyBuYW1lICsgIik7IjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmFtZSArICIudG9TdHJpbmcoKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9EYXRhVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjFhNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzaW1wbGlmeSB0aGUgY29kZWdlbiBwcm9jZXNzCi0qIEJlY2F1c2UgY29kZWdlbiBtYXkgYmUgcHJvY2Vzc2VkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgdHlwZQotKiB3ZSBjYW4gaGFuZGxlIGhvdyBlYWNoIHR5cGUgd2FudHMgdGhlIGNvZGUgdG8gbG9vayBmb3IgYSBzcGVjaWZpYyB0YXNrIAotKiBieSBjcmVhdGluZyBhIGRhdGF0eXBlIGFuZCBjYWxsaW5nIGdlbmVyaWMgbWV0aG9kcyB0aGF0IGFyZSAKLSogdG8gYmUgc3BlY2lhbGl6ZWQgaW4gc3ViY2xhc3NlcwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaGFuZHMgYmFjayB0aGUgY29kZSByZXF1aXJlZCB0byBnbyBmcm9tIHRoZSAKLSAgKiBzdHJpbmcgdGhlIHVzZXIgZW50ZXJlZCB0byB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotICAvKioKLSAgKiBPZnRlbiB0aW1lcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgdHlwZSB0byBzdHJpbmcsIHN0cmluZyB0byB0eXBlIG9yIGp1c3QgcGxhaW4gcHJvdmlkZSBhbiBpbnB1dCBmb3JtCi0gICogQSB0ZW1wb3JhcnkgdmFyaWFibGUgaXMgdXNlZC4gSWYgd2UgcnVuIGludG8gYSBzaXR1dGlvbiB3aGVyZSB0d28gb2YgdGhlIHNhbWUgdHlwZXMgYXJlIHVzZWQgaW4gdGhlICAKLSAgKiBzYW1lIG1ldGhvZCB0aGVzZSB0ZW1wb3JhcnkgdmFyaWFibGVzIHNoYXJlIHRoZSBzYW1lIG5hbWUgc3BhY2UuIEl0IGlzbnQgZW5vdWdoIHRvIHVzZSBhIG5hbWUgCi0gICogYmVjYXVzZSBvZiB3ZSBtYXkgaGF2ZSBhIG5lc3RlZCBzY2VuYXJpby4gVGhlcmVmb3JlIGFueSB0ZW1wb3JhcnkgdmFyaWFibGUgdGhhdCBpcyB1c2VkIGluIGEgZGF0YVR5cGUKLSAgKiBtdXN0IHVzZSBhIHVuaXF1ZSBuYW1lIGFwZWVuZGVkIHRvIHRoZSBlbmQuIFRoaXMgbmFtZSBtdXN0IGJlIHBhc3NlZCBpbiBhbmQgaXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YKLSAgKiBEYXRhVHlwZSB0byBpbnN1cmUgaXQgaXMgdW5pcXVlLgotICAqIEByZXR1cm4gVW5pcXVlIE5hbWUgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIG5hbWUgZWFjaCB0ZW1wIHZhcmlhYmxlIHdpbGwgdXNlCi0gICogCi0gICoKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCk7Ci0gIAotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGRpY3RhdGVzIGhvdyB5b3Ugd2FudCB0byBwcm9jZXNzIHRoZSAKLSAgKiBpbmNvbWluZyBzdHJpbmcgZnJvbSB0aGUgaW5wdXQganNwLiBZb3UgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBtYXJrdXAgCi0gICogZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiBUaGUgc2ltcGxlIHR5cGVzIHVzZSBpdC4gRG9tRWxlbWVudCBkb2VzIG5vdAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpOwotCi0KLSAgLyoqCi0gICogSW5wdXQgZm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpOwotICAKLSAgLyoqCi0gICogY29udmVydHMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJveHkgCi0gICogYmFjayB0byBhIHN0cmluZyAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSB0eXBlIHRvIHN0cmluZy4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIHR5cGUoaW5jbHVkaW5nIHBhY2thZ2UpLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Mzk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIERhdGVUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBEYXRlVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5CSUdfREVDSU1BTF9OQU1FKTsKLSAgfQotIAotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgc2ltcGxlIGZvcm0gaXMganVzdCBhIHRleHQgaW5wdXQgYm94Ci0gICogVGhpcyBoYXMgYmVlbiBzcGVjaWFsaXplZCB0byBzaG93IGFuIGV4YW1wbGUKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGlucHV0Rm9ybSA9ICI8VEQgQUxJR049XCJsZWZ0XCI+PElOUFVUIFRZUEU9XCJURVhUXCIgTkFNRT1cIiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIlwiIFNJWkU9MjA+PC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgImphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciBnY0V4YW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIiAgPSBuZXcgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS51dGlsLkRhdGUgZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBnY0V4YW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIi5nZXRUaW1lKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLmZvcm1hdChkYXRlIiArIGdldFVuaXF1ZU5hbWUoKSsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQgQUxJR049XCJsZWZ0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VFI+IiAgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREPiA8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREIEFMSUdOPVwibGVmdFwiPiBlZy4gPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IDwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8L1RSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICByZXR1cm4gaW5wdXRGb3JtOwotICB9Ci0KLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgc3BlY2lhbGl6ZWQKLSAgKiBXZSBtdXN0IHVzZSB0aGUgZGF0ZSBmdW5jdGlvbiB0byBoZWxwCi0gICogdXMgY29udmVydCBiYWNrIGFuZCBmb3J0aAotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAgImphdmEudXRpbC5EYXRlICIgKyBub2RlTmFtZSAgKyAgIj0gZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIucGFyc2UoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAqIHRoaXMgaXMgbmVlZGVkIGZvciBtb3N0IGNhc2UgCi0gICogYnV0IGl0IGlzIHBlcmlwaGVyYWwgYXMgdGhlIHN0cmluZ2NvbnZlcnNpb24gbmVlZGVkIAotICAqIHRvIGJlIG92ZXJyaWRkZW4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICogY29udmVydHMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJveHkgCi0gICogYmFjayB0byBhIHN0cmluZyAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSB0eXBlIHRvIHN0cmluZy4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotCi0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnRleHQuRGF0ZUZvcm1hdCBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgIAkgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkpzcFV0aWxzLm1hcmt1cChkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5mb3JtYXQoIiArIG5hbWUgKyIpKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotCi0KLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RvbUVsZW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRG9tRWxlbWVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0MDZhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRG9tRWxlbWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIERvbUVsZW1lbnRUeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIERvbUVsZW1lbnRUeXBlKCkKLSAgewotICAgIGZUeXBlID0gIm9yZy53M2MuZG9tLkVsZW1lbnQiOwotICAgIGZVbmlxdWVOYW1lID0gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIERvbUVsZW1lbnQgZm9ybSBpcyBhIHRleHQgYm94Ci0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxURVhUQVJFQSBSb3dzPTcgQ29scz00NSBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCI+PC9URVhUQVJFQT48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLQotICAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBkaWN0YXRlcyBob3cgeW91IHdhbnQgdG8gcHJvY2VzcyB0aGUgCi0gICogaW5jb21pbmcgc3RyaW5nIGZyb20gdGhlIGlucHV0IGpzcC4gWW91IG1heSBvciBtYXkgbm90IHVzZSB0aGUgbWFya3VwIAotICAqIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4gVGhlIHNpbXBsZSB0eXBlcyB1c2UgaXQuIERvbUVsZW1lbnQgZG9lcyBub3QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0Q29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKQotICB7Ci0gICAgIFN0cmluZyByZXF1ZXN0Q29kZSA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyIgKyBHZW5lcmF0b3IuU1BBQ0UgCi0gICAgIAkgICAgICAgICAgICAgICAgICAgKyBpZCArICI9ICByZXF1ZXN0LmdldFBhcmFtZXRlcihcIiIKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIG5hbWUgKyJcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiByZXF1ZXN0Q29kZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaGFuZHMgYmFjayB0aGUgY29kZSByZXF1aXJlZCB0byBnbyBmcm9tIHRoZSAKLSAgKiBzdHJpbmcgdGhlIHVzZXIgZW50ZXJlZCB0byB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCIAotICAgICAgICAgICAgICAgICAgICAgICArICJvcmcudzNjLmRvbS5FbGVtZW50ICIgKyBub2RlTmFtZSArICI9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkRvbUVsZW1lbnRIZWxwZXIuY3JlYXRlRG9tRWxlbWVudEZyb21YTUxTdHJpbmcoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiIAotCSAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBjb252ZXJzaW9uOyAKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRpY3RhdGVzIGhvdyB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyB0eXBlIAotICAqIHVwb24gcmVjZWl2aW5nIGl0IGFzIGEgcmV0dXJuIGZyb20gYSBwcm94eSBtZXRob2QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGRpc3BsYXkgc3RyaW5nCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgdHlwZVRvU3RyaW5nID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwuRG9tRWxlbWVudEhlbHBlci5kb21Xcml0ZXIoIiArIG5hbWUgKyAiLCBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpIiArICIpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT0gdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gdHlwZVRvU3RyaW5nOwotICB9Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBuYW1lKGluY2x1ZGluZyBwYWNrYWdlKS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBmVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZlVuaXF1ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlVuaXF1ZU5hbWUgPSBuYW1lOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0ZpZWxkRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0ZpZWxkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2ViMmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9GaWVsZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmEgYmVhbiBtZXRob2QgcGFyYW1ldGVyLgotKiBOZWFyZXN0IG1vcmFsIGVxdWl2YWxlbnRzOiBqYXZhLmJlYW5zLlBhcmFtZXRlckRlc2NyaXB0b3IuCi0qLwotcHVibGljIGNsYXNzIEZpZWxkRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudCBpbXBsZW1lbnRzIEF0dHJpYnV0ZUVsZW1lbnRUeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZlNldHRlck1ldGhvZDsKLSAgcHJpdmF0ZSBTdHJpbmcgZkdldHRlck1ldGhvZDsKLQotIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfVFlQRSA9ICJ0eXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX09XTklOR19CRUFOID0gIm93bmluZ2JlYW4iOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IgdGhpcyB0YWtlcyB0aGUgb3duaW5nIGJlYW4uCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgKiBAcGFyYW0gYmVhbkVsZW1lbnQgdGhlIGJlYW4gdGhhdCBvd25zIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgRmllbGRFbGVtZW50ICggQmVhbkVsZW1lbnQgYmVhbkVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiZWFuRWxlbWVudCxSRUxfT1dOSU5HX0JFQU4sQmVhbkVsZW1lbnQuUkVMX0ZJRUxEUyk7Ci0gICAgZlNldHRlck1ldGhvZCA9IG5hbWU7Ci0gICAgZkdldHRlck1ldGhvZCA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXJNZXRob2QoU3RyaW5nIHNldHRlck1ldGhvZCkKLSAgewotICAgIGZTZXR0ZXJNZXRob2QgPSBzZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNldHRlck1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZlNldHRlck1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0R2V0dGVyTWV0aG9kKCkKLSAgewotICAgIHJldHVybiBmR2V0dGVyTWV0aG9kOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldEdldHRlck1ldGhvZChTdHJpbmcgZ2V0dGVyTWV0aG9kKQotICB7Ci0gICAgZkdldHRlck1ldGhvZCA9IGdldHRlck1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyU2lnbmF0dXJlKFN0cmluZyBhdHRyaWJ1dGUpCi0gIHsKLSAgICByZXR1cm4gZlNldHRlck1ldGhvZCArICIgPSAiICsgYXR0cmlidXRlICsgIjsiOwotICB9Ci0gICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgQmVhbiB0aGF0IG93bnMgdGhpcyBBdHRyaWJ1dGUuCi0gICogQHJldHVybiBCZWFuRWxlbWVudCBUaGUgYmVhbiB0aGF0IG93bnMgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCBnZXRPd25pbmdCZWFuRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9PV05JTkdfQkVBTik7Ci0gICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoQmVhbkVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHR5cGUgdGhhdCBpcyBvd25lZCBieSB0aGlzIGF0dHJpYnV0dGUuCi0gICogQHJldHVybiBUeXBlRWxlbWVudCBUaGUgVHlwZSB0aGF0IG9mIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgVHlwZUVsZW1lbnQgZ2V0VHlwZUVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfVFlQRSk7Ci0gICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoVHlwZUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvR3JlZ29yaWFuQ2FsZW5kYXJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvR3JlZ29yaWFuQ2FsZW5kYXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Y2ZiZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0dyZWdvcmlhbkNhbGVuZGFyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIEdyZWdvcmlhbkNhbGVuZGFyVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgR3JlZ29yaWFuQ2FsZW5kYXJUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkdSRUdPUklBTl9DQUxFTkRBUl9OQU1FKTsKLSAgfQotCi0KLSAgLyoqCi0gICogaW5wdXRGb3JtIHJldHVybnMgdGhlIHVzZXIgaW5wdXQgaHRtbAotICAqIFRoZSBzaW1wbGUgZm9ybSBpcyBqdXN0IGEgdGV4dCBpbnB1dCBib3gKLSAgKiBUaGlzIGhhcyBiZWVuIHNwZWNpYWxpemVkIHRvIHNob3cgYW4gZXhhbXBsZQotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5wdXQgZWxlbWVudAotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBmb3JtIHVzZWQgdG8gY29sbGVjdCB0aGUgZGF0YQotICAqLwotICBwdWJsaWMgU3RyaW5nIGlucHV0Rm9ybShTdHJpbmcgbmFtZSkKLSAgewotICAgICBTdHJpbmcgaW5wdXRGb3JtID0gIjxURCBBTElHTj1cImxlZnRcIj48SU5QVVQgVFlQRT1cIlRFWFRcIiBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCIgU0laRT0yMD48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJqYXZhLnRleHQuRGF0ZUZvcm1hdCBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIGdjRXhhbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICA9IG5ldyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJqYXZhLnV0aWwuRGF0ZSBkYXRlIiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGdjRXhhbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLmdldFRpbWUoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIuZm9ybWF0KGRhdGUiICsgZ2V0VW5pcXVlTmFtZSgpKyAiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQgQUxJR049XCJsZWZ0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VFI+IiAgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREPiA8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREIEFMSUdOPVwibGVmdFwiPiBlZy4gPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IDwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8L1RSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICByZXR1cm4gaW5wdXRGb3JtOwotICB9Ci0gCi0gCi0gIC8qCi0gICogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBzcGVjaWFsaXplZAotICAqIFdlIG11c3QgdXNlIHRoZSBkYXRlIGZ1bmN0aW9uIHRvIGhlbHAKLSAgKiB1cyBjb252ZXJ0IGJhY2sgYW5kIGZvcnRoCi0gICovCi0gICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAgImphdmEudXRpbC5EYXRlIGRhdGVUZW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIiAgPSBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5wYXJzZSgiICsgYXR0cmlidXRlTmFtZSArICIpOyIgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIiArIEdlbmVyYXRvci5TUEFDRSArIG5vZGVOYW1lICsgIiA9ICIgKyAibmV3IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcigpOyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBub2RlTmFtZSArICIuc2V0VGltZShkYXRlVGVtcCIgKyBnZXRVbmlxdWVOYW1lKCkrICIpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgKiB0aGlzIGlzIG5lZWRlZCBmb3IgbW9zdCBjYXNlIAotICAqIGJ1dCBpdCBpcyBwZXJpcGhlcmFsIGFzIHRoZSBzdHJpbmdjb252ZXJzaW9uIG5lZWRlZCAKLSAgKiB0byBiZSBvdmVycmlkZGVuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgLyoqCi0gICogY29udmVydHMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJveHkgCi0gICogYmFjayB0byBhIHN0cmluZyAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSB0eXBlIHRvIHN0cmluZy4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotCi0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnRleHQuRGF0ZUZvcm1hdCBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgIAkgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudXRpbC5EYXRlIGRhdGUiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gIiArIG5hbWUgKyAiLmdldFRpbWUoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAJICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJTdHJpbmcgdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbC5Kc3BVdGlscy5tYXJrdXAoZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIuZm9ybWF0KGRhdGUiICsgZ2V0VW5pcXVlTmFtZSgpICsgIikpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT0gdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvSGFzaHRhYmxlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0hhc2h0YWJsZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmZjJjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvSGFzaHRhYmxlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgSGFzaHRhYmxlVHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgSGFzaHRhYmxlVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5IQVNIVEFCTEVfTkFNRSk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01hcFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9NYXBUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzViZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01hcFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIE1hcFR5cGUgZXh0ZW5kcyBSZWNvZ25pemVkUmV0dXJuVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIE1hcFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuTUFQX05BTUUpOwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9NZXRob2RFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvTWV0aG9kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmU4ZDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9NZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuIG1ldGhvZC4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLCBqYXZhLmJlYW5zLk1ldGhvZERlc2NyaXB0b3IuCi0qLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX0JFQU4gPSAiYmVhbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9QQVJBTUVURVJTID0gInBhcmFtZXRlcnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUkVUVVJOX1BBUkFNRVRFUlMgPSAicmV0dXJucGFyYW1ldGVycyI7Ci0gIHByaXZhdGUgU3RyaW5nIGZEaXNwbGF5TmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBmTWV0aG9kT21pdHRlZDsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYmVhbiBUaGUgQmVhbiB0aGF0IG93bnMgdGhpcyBtZXRob2QuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KLSAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbWV0aG9kLgotICAqLwotICBwdWJsaWMgTWV0aG9kRWxlbWVudCAoIEJlYW5FbGVtZW50IGJlYW5FbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRpc3BsYXlOYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiZWFuRWxlbWVudCxSRUxfQkVBTixCZWFuRWxlbWVudC5SRUxfTUVUSE9EUyk7Ci0gICAgZkRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgZk5hbWUgPSBuYW1lOwotICAgIGZNZXRob2RPbWl0dGVkID0gZmFsc2U7Ci0gICAgCi0gIH0KLQotICAvKgotICAqIEluIHRoZSBldmVudCB0aGF0IHRoZXJlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUKLSAgKiB3ZSB3aWxsIHNldCB0aGUgb21taXNzaW9uIGJvb2xlYW4gdmFyaWFibGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyB0byBiZSBvbW1pdGVkCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGdldE1ldGhvZE9tbWlzc2lvbigpCi0gIHsKLSAgICByZXR1cm4gZk1ldGhvZE9taXR0ZWQ7Ci0gIH0KLQotICAvKgotICAqIEluIHRoZSBldmVudCB0aGF0IHRoZXJlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUKLSAgKiB3ZSB3aWxsIGdldCB0aGUgb21taXNzaW9uIGJvb2xlYW4gdmFyaWFibGUKLSAgKiBAcGFyYW0gYm9vbGVhbiB0cnVlIGlmIHRoaXMgbWV0aG9kIGlzIHRvIGJlIG9tbWl0ZWQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kT21taXNzaW9uKGJvb2xlYW4gYm9vbCkKLSAgewotICAgIGZNZXRob2RPbWl0dGVkID0gYm9vbDsKLSAgfQotCi0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZEaXNwbGF5TmFtZTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgbWV0aG9kLgotICAqIEByZXR1cm4gQmVhbiBUaGUgQmVhbiB0aGF0IG93bnMgdGhpcyBtZXRob2QuCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCBnZXRCZWFuRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9CRUFOKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCZWFuRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgcmV0dXJuIHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZC4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIGhvbGRzIHRoZSByZXR1cm4gcGFyYW1ldGVyIG9mIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UmV0dXJuUGFyYW1ldGVyRW51bSAoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9SRVRVUk5fUEFSQU1FVEVSUyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIHRoZSByZXR1cm4gcGFyYW1ldGVyIG9mIHRoaXMgbWV0aG9kLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gaG9sZHMgdGhlIHJldHVybiBwYXJhbWV0ZXIgb2YgdGhpcyBtZXRob2QuCi0gICovCi0gIHB1YmxpYyBQYXJhbWV0ZXJFbGVtZW50IGdldFJldHVyblBhcmFtZXRlckVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRSZXR1cm5QYXJhbWV0ZXJFbnVtKCk7Ci0gICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoUGFyYW1ldGVyRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgUGFyYW1ldGVyIG9iamVjdHMgb2YgdGhpcyBtZXRob2QuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBBbGwgUGFyYW1ldGVyIG9iamVjdHMgb2YgdGhpcyBtZXRob2QuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9QQVJBTUVURVJTKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBQYXJhbWV0ZXIgb2JqZWN0cyBvZiB0aGlzIG1ldGhvZC4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIFBhcmFtZXRlciBvYmplY3RzIG9mIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgaW50IGdldE51bWJlck9mUGFyYW1ldGVyRWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9QQVJBTUVURVJTKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvT2JqZWN0VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL09iamVjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlOGJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvT2JqZWN0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDgyMwkgIDE0NTY0MyBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24gKGNyZWF0ZWQgY2xhc3MpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIE9iamVjdFR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIE9iamVjdFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuT0JKRUNUX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgeyAKLQkvL1dlIGNhbid0IGRlc2VyaWFsaXplIGEgU3RyaW5nIHRvIGFuIE9iamVjdAotCS8vdGhpcyBzaG91bGQgbmV2ZXIgYWN0dWFsbHkgYmUgY2FsbGVkIHNpbmNlCi0JLy9tZXRob2RzIHdpdGggT2JqZWN0cyBhcyBpbnB1dCBhcmUgb21pdHRlZC4KLSAgICByZXR1cm4gIm5ldyBqYXZhLmxhbmcuT2JqZWN0KCk7IjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmFtZSArICIudG9TdHJpbmcoKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QYXJhbWV0ZXJFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUGFyYW1ldGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmYwOGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QYXJhbWV0ZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4gbWV0aG9kIHBhcmFtZXRlci4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5iZWFucy5QYXJhbWV0ZXJEZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX01FVEhPRCA9ICJtZXRob2QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfVFlQRSA9ICJ0eXBlIjsKLQotICBwdWJsaWMgYm9vbGVhbiBmUmV0dXJuUGFyYW1ldGVyPWZhbHNlOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIG1ldGhvZCBUaGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLgotICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gICovCi0gIHB1YmxpYyBQYXJhbWV0ZXJFbGVtZW50ICggTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHJlbFR5cGUsYm9vbGVhbiByZXR1cm5QYXJhbWV0ZXIgKQotICB7Ci0gICAgdGhpcyhuYW1lLG1ldGhvZEVsZW1lbnQsUkVMX01FVEhPRCxyZWxUeXBlKTsKLSAgICBmUmV0dXJuUGFyYW1ldGVyID0gcmV0dXJuUGFyYW1ldGVyOwotICB9Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gbWV0aG9kIFRoZSBNZXRob2QgdGhhdCBvd25zIHRoaXMgcGFyYW1ldGVyLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCi0gICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlci4KLSAgKi8KLSAgcHVibGljIFBhcmFtZXRlckVsZW1lbnQgKFN0cmluZyBuYW1lLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIFN0cmluZyBvdXRSZWwsU3RyaW5nIGluUmVsKQotICB7Ci0gICAgc3VwZXIobmFtZSxtZXRob2RFbGVtZW50LG91dFJlbCxpblJlbCk7Ci0gIH0KLSAgIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBNZXRob2QgdGhhdCBvd25zIHRoaXMgcGFyYW1ldGVyLgotICAqIEByZXR1cm4gTWV0aG9kIFRoZSBNZXRob2QgdGhhdCBvd25zIHRoaXMgcGFyYW1ldGVyLgotICAqLwotICBwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX01FVEhPRCk7Ci0gICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoTWV0aG9kRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKiBAcmV0dXJuIE1ldGhvZCBUaGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKi8KLSAgcHVibGljIFR5cGVFbGVtZW50IGdldFR5cGVFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX1RZUEUpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKFR5cGVFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JldHVybigpCi0gIHsKLSAgICByZXR1cm4gZlJldHVyblBhcmFtZXRlcjsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVBcnJheVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVBcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3MzA2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUFycmF5VHlwZSBleHRlbmRzIEFycmF5VHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNSVRJVkVfQVJSQVlfTkFNRSwgdHlwZU5hbWUpOwotICB9Ci0KLSAgIC8qKgotICAqIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRpY3RhdGVzIGhvdyB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyB0eXBlIAotICAqIHVwb24gcmVjZWl2aW5nIGl0IGFzIGEgcmV0dXJuIGZyb20gYSBwcm94eSBtZXRob2QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGRpc3BsYXkgc3RyaW5nCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgdHJpcHBsZVRhYiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgR2VuZXJhdG9yLlRBQjsKLQotICAgIFN0cmluZyBub25CZWFuID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpICsgIiA9IFwiW1wiOyIgCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImZvcihpbnQgaSIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiPTA7aSIgK2dldFVuaXF1ZU5hbWUoKSArICI8ICIgKyBuYW1lIAotICAgIAkgICAgICAgICAgICAgICAgICAgKyAiLmxlbmd0aDtpIiArIGdldFVuaXF1ZU5hbWUoKSArICIrKyl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgIAkgICAgICAgICAgICAgKyB0cmlwcGxlVGFiICsgInRlbXAiKyBnZXRVbmlxdWVOYW1lKCkgKyIgPSB0ZW1wIitnZXRVbmlxdWVOYW1lKCkgKyAiICsgIiArIG5hbWUgKyAiW2kiICsgZ2V0VW5pcXVlTmFtZSgpIAotICAgIAkgICAgICAgICAgICAgICAgICAgKyAiXSArIFwiLFwiOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJ9IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiaW50IGxlbmd0aCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiID0gdGVtcCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiLmxlbmd0aCgpOyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAidGVtcCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiID0gdGVtcCIrZ2V0VW5pcXVlTmFtZSgpKyIuc3Vic3RyaW5nKDAsKGxlbmd0aCIrZ2V0VW5pcXVlTmFtZSgpKyIgLSAxKSkgKyBcIl1cIjsiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT10ZW1wIisgZ2V0VW5pcXVlTmFtZSgpICsiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIrIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gbm9uQmVhbjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQm9vbGVhblR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVCb29sZWFuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThhZDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVCb29sZWFuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlQm9vbGVhblR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUJvb2xlYW5UeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fQk9PTEVBTl9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIkJvb2xlYW4udmFsdWVPZigiICsgbmFtZSArICIpLmJvb2xlYW5WYWx1ZSgpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUJ5dGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQnl0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0NWQyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQnl0ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUJ5dGVUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVCeXRlVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0JZVEVfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJCeXRlLnBhcnNlQnl0ZSgiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUNoYXJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQ2hhclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyZjkwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQ2hhclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUNoYXJUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVDaGFyVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0NIQVJfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICIiICsgbmFtZSArICIuY2hhckF0KDApOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZURvdWJsZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVEb3VibGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzYyZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZURvdWJsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZURvdWJsZVR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZURvdWJsZVR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9ET1VCTEVfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJEb3VibGUucGFyc2VEb3VibGUoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVGbG9hdFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVGbG9hdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwZjlkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlRmxvYXRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVGbG9hdFR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUZsb2F0VHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0ZMT0FUX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiRmxvYXQucGFyc2VGbG9hdCgiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUludFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVJbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMzNkZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUludFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUludFR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUludFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9JTlRFR0VSX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiSW50ZWdlci5wYXJzZUludCgiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUphdmFUeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUphdmFUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzE1MjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVKYXZhVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVKYXZhVHlwZXMgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUphdmFUeXBlcyhTdHJpbmcgdHlwZSkKLSAgewotICAgIHN1cGVyKHR5cGUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gZlR5cGUgKyAiLnZhbHVlT2YoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOyAgICAKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIlN0cmluZy52YWx1ZU9mKCIgKyBuYW1lICsgIikiOwotICB9Ci0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlTG9uZ1R5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVMb25nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBjODI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVMb25nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlTG9uZ1R5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUxvbmdUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fTE9OR19OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIkxvbmcucGFyc2VMb25nKCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotICAKLSAgCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlU2hvcnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlU2hvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTFjZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZVNob3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlU2hvcnRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVTaG9ydFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9TSE9SVF9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIlNob3J0LnBhcnNlU2hvcnQoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUxNzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpbWl0aXZlVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIHN1cGVyKHR5cGUpOwotICB9Ci0gCi0gLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiU3RyaW5nLnZhbHVlT2YoIiArIG5hbWUgKyAiKSI7Ci0gIH0KLSAgCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUmVjb2duaXplZFJldHVyblR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9SZWNvZ25pemVkUmV0dXJuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzcyMWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9SZWNvZ25pemVkUmV0dXJuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUmVjb2duaXplZFJldHVyblR5cGUgaW1wbGVtZW50cyBEYXRhVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGZUeXBlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZVbmlxdWVOYW1lOwotCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUmVjb2duaXplZFJldHVyblR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBmVHlwZSA9IHR5cGU7Ci0gICAgZlVuaXF1ZU5hbWUgPSAiIjsKLSAgfQotCi0gIC8qKgotICAqIG5vdCByZWxldmFudCBhdCB0aGlzIHBvaW50IAotICAqLwotICBwdWJsaWMgU3RyaW5nIGlucHV0Rm9ybShTdHJpbmcgbmFtZSkKLSAgewotICAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAgLyoqCi0gICogYWdhaW4gbm90IHJlbGV2YW50Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdENvZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCkKLSAgewotICAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRzIGJhY2sgdGhlIGNvZGUgcmVxdWlyZWQgdG8gZ28gZnJvbSB0aGUgCi0gICogc3RyaW5nIHRoZSB1c2VyIGVudGVyZWQgdG8gdGhlIGFjdHVhbCB0eXBlIG9mIHRoZSBlbGVtZW50Ci0gICogQHBhcmFtIFN0cmluZyB0eXBlTmFtZSB0aGlzIGlzIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgdHlwZSBpZSBpbnQsYm9vbGVhbgotICAqIEBwYXJhbSBTdHJpbmcgbm9kZU5hbWUgVGhlIG5vZGVOYW1lIGlzIGp1c3QgdGhlIGF0dHJpYnV0ZW5hbWUgKyBUZW1wLiAKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBhdHRyaWJ1dGVOYW1lIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlIC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBzdHJpbmdDb252ZXJzaW9uKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRpY3RhdGVzIGhvdyB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyB0eXBlIAotICAqIHVwb24gcmVjZWl2aW5nIGl0IGFzIGEgcmV0dXJuIGZyb20gYSBwcm94eSBtZXRob2QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGRpc3BsYXkgc3RyaW5nCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgbm9uQmVhbiA9ICAgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiaWYoIiArIG5hbWUgKyAiIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgICAKLSAgICAJICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyIgPSAiICsgbmFtZSArICIudG9TdHJpbmcoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAgCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgICI8JT10ZW1wIiArIGdldFVuaXF1ZU5hbWUoKSArIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAifSI7Ci0gICAgcmV0dXJuIG5vbkJlYW47Ci0gIH0KLQotICAvKioKLSAgKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIG5hbWUoaW5jbHVkaW5nIHBhY2thZ2UpLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZUeXBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCkKLSAgewotICAgIHJldHVybiBmVW5pcXVlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVW5pcXVlTmFtZSA9IG5hbWU7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU09BUEVsZW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU09BUEVsZW1lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OWUwMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NPQVBFbGVtZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgU09BUEVsZW1lbnRUeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFNPQVBFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBmVHlwZSA9ICJqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCI7Ci0gICAgZlVuaXF1ZU5hbWUgPSAiIjsKLSAgfQotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgRG9tRWxlbWVudCBmb3JtIGlzIGEgdGV4dCBib3gKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGlucHV0Rm9ybSA9ICI8VEQgQUxJR049XCJsZWZ0XCI+PFRFWFRBUkVBIFJvd3M9NyBDb2xzPTQ1IE5BTUU9XCIiIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICJcIj48L1RFWFRBUkVBPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGlucHV0Rm9ybTsKLSAgfQotCi0gICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGRpY3RhdGVzIGhvdyB5b3Ugd2FudCB0byBwcm9jZXNzIHRoZSAKLSAgKiBpbmNvbWluZyBzdHJpbmcgZnJvbSB0aGUgaW5wdXQganNwLiBZb3UgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBtYXJrdXAgCi0gICogZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiBUaGUgc2ltcGxlIHR5cGVzIHVzZSBpdC4gRG9tRWxlbWVudCBkb2VzIG5vdAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpCi0gIHsKLSAgICAgU3RyaW5nIHJlcXVlc3RDb2RlID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIiArIEdlbmVyYXRvci5TUEFDRSAKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIGlkICsgIj0gIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiIgotICAgICAJICAgICAgICAgICAgICAgICAgICsgbmFtZSArIlwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIHJlcXVlc3RDb2RlOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBoYW5kcyBiYWNrIHRoZSBjb2RlIHJlcXVpcmVkIHRvIGdvIGZyb20gdGhlIAotICAqIHN0cmluZyB0aGUgdXNlciBlbnRlcmVkIHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZWxlbWVudAotICAqIEBwYXJhbSBTdHJpbmcgdHlwZU5hbWUgdGhpcyBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHR5cGUgaWUgaW50LGJvb2xlYW4KLSAgKiBAcGFyYW0gU3RyaW5nIG5vZGVOYW1lIFRoZSBub2RlTmFtZSBpcyBqdXN0IHRoZSBhdHRyaWJ1dGVuYW1lICsgVGVtcC4gCi0gICogQHBhcmFtIFN0cmluZyB0aGUgYXR0cmlidXRlTmFtZSAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGNvbnZlcnNpb24gPSAgR2VuZXJhdG9yLkRPVUJMRV9UQUIgCi0gICAgICAgICAgICAgICAgICAgICAgICsgImphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50ICIgKyBub2RlTmFtZSArICI9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLlNvYXBFbGVtZW50SGVscGVyLmNyZWF0ZVNPQVBFbGVtZW50RnJvbVhNTFN0cmluZygiICsgYXR0cmlidXRlTmFtZSArICIpOyIgCi0JICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgZnVuY3Rpb24gdGhhdCBkaWN0YXRlcyBob3cgd2Ugd2FudCB0byBkaXNwbGF5IHRoaXMgdHlwZSAKLSAgKiB1cG9uIHJlY2VpdmluZyBpdCBhcyBhIHJldHVybiBmcm9tIGEgcHJveHkgbWV0aG9kCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBkaXNwbGF5IHN0cmluZwotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIHR5cGVUb1N0cmluZyA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLlNvYXBFbGVtZW50SGVscGVyLnNvYXBFbGVtZW50V3JpdGVyKCIgKyBuYW1lICsgIiwgbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKSIgKyAiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIHR5cGVUb1N0cmluZzsKLSAgfQotCi0gIC8qKgotICAqIHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbmFtZShpbmNsdWRpbmcgcGFja2FnZSkuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZlR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZVbmlxdWVOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VW5pcXVlTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGZVbmlxdWVOYW1lID0gbmFtZTsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU2ltcGxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDc4MzQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIDEgb2YgdGhyZWUgdHlwZSBlbGVtZW50cyByZXByZXNlbnRzIHByaW1pdGl2ZXMgCi0qLwotcHVibGljIGNsYXNzIFNpbXBsZUVsZW1lbnQgZXh0ZW5kcyBUeXBlRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciAKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgUGFyYW1ldGVyIHRoYXQgb3ducyB0aGlzIHNpbXBsZSB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgc2ltcGxlIGVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBTaW1wbGVFbGVtZW50ICggUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBwcmltKQotICB7Ci0gICAgc3VwZXIobmFtZSxwYXJhbWV0ZXJFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5TSU1QTEUpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5QQVJBTUVURVJfT1dORVI7Ci0gICAgc2V0UHJpbWl0aXZlKHByaW0pOwotICB9Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciAKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgQXR0cmlidXRlIHRoYXQgb3ducyB0aGlzIHNpbXBsZSB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgQXR0cmlidXRlRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIFNpbXBsZUVsZW1lbnQgKCBBdHRyaWJ1dGVFbGVtZW50IGF0dHJpYnV0ZUVsZW1lbnQsIFN0cmluZyBuYW1lLCBib29sZWFuIHByaW0pCi0gIHsKLSAgICBzdXBlcihuYW1lLGF0dHJpYnV0ZUVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LlNJTVBMRSk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LkFUVFJJQlVURV9PV05FUjsKLSAgICBzZXRQcmltaXRpdmUocHJpbSk7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciAKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgQXR0cmlidXRlIHRoYXQgb3ducyB0aGlzIHNpbXBsZSB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgQXR0cmlidXRlRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIFNpbXBsZUVsZW1lbnQgKCBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBwcmltKQotICB7Ci0gICAgc3VwZXIobmFtZSxmaWVsZEVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LlNJTVBMRSk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LkZJRUxEX09XTkVSOwotICAgIHNldFByaW1pdGl2ZShwcmltKTsKLSAgfQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NpbXBsZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTk0ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NpbXBsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZVR5cGUgaW1wbGVtZW50cyBEYXRhVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGZUeXBlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZVbmlxdWVOYW1lOwotCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgU2ltcGxlVHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIGZUeXBlID0gdHlwZTsKLSAgfQotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgc2ltcGxlIGZvcm0gaXMganVzdCBhIHRleHQgaW5wdXQgYm94Ci0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxJTlBVVCBUWVBFPVwiVEVYVFwiIE5BTUU9XCIiIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICJcIiBTSVpFPTIwPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGlucHV0Rm9ybTsKLSAgfQotCi0gICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGRpY3RhdGVzIGhvdyB5b3Ugd2FudCB0byBwcm9jZXNzIHRoZSAKLSAgKiBpbmNvbWluZyBzdHJpbmcgZnJvbSB0aGUgaW5wdXQganNwLiBZb3UgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBtYXJrdXAgCi0gICogZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiBUaGUgc2ltcGxlIHR5cGVzIHVzZSBpdC4gRG9tRWxlbWVudCBkb2VzIG5vdAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpCi0gIHsKLSAgICAgU3RyaW5nIHJlcXVlc3RDb2RlID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIiArIEdlbmVyYXRvci5TUEFDRSAKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIGlkICsgIj0gIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiIgotICAgICAJICAgICAgICAgICAgICAgICAgICsgbmFtZSArIlwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIHJlcXVlc3RDb2RlOwotICAgfQotIAotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRzIGJhY2sgdGhlIGNvZGUgcmVxdWlyZWQgdG8gZ28gZnJvbSB0aGUgCi0gICogc3RyaW5nIHRoZSB1c2VyIGVudGVyZWQgdG8gdGhlIGFjdHVhbCB0eXBlIG9mIHRoZSBlbGVtZW50Ci0gICogaXQgdXNlcyBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgU2ltcGxlVHlwZSBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50Ci0gICogVGhlIFN0cmluZ1RvVHlwZSBmdW5jdGlvbgotICAqIEBwYXJhbSBTdHJpbmcgdHlwZU5hbWUgdGhpcyBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHR5cGUgaWUgaW50LGJvb2xlYW4KLSAgKiBAcGFyYW0gU3RyaW5nIG5vZGVOYW1lIFRoZSBub2RlTmFtZSBpcyBqdXN0IHRoZSBhdHRyaWJ1dGVuYW1lICsgVGVtcC4gCi0gICogQHBhcmFtIFN0cmluZyB0aGUgYXR0cmlidXRlTmFtZSAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGNvbnZlcnNpb24gPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIHR5cGVOYW1lICsgR2VuZXJhdG9yLlNQQUNFICsgbm9kZU5hbWUgCi0gICAgIAkgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLlNQQUNFICsgIiA9ICIgKyBTdHJpbmdUb1R5cGUoYXR0cmlidXRlTmFtZSkgCi0gICAgIAkgICAgICAgICAgICAgICAgICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIGNvbnZlcnRzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb3h5IAotICAqIGJhY2sgdG8gYSBzdHJpbmcgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgdHlwZSB0byBzdHJpbmcuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLQotICAgIFN0cmluZyBjb252ZXJzaW9uID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwuSnNwVXRpbHMubWFya3VwKCIgKyBUeXBlVG9TdHJpbmcobmFtZSkgKyAiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotICAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBuYW1lKGluY2x1ZGluZyBwYWNrYWdlKS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBmVHlwZTsKLSAgfQotCi0gICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZVbmlxdWVOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VW5pcXVlTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGZVbmlxdWVOYW1lID0gbmFtZTsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdGF0ZUxlc3NCZWFuVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1N0YXRlTGVzc0JlYW5UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwY2I0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1N0YXRlTGVzc0JlYW5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSByZWNvZ25pemVkIHJldHVybiB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZUxlc3NCZWFuVHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgCi0gIHB1YmxpYyBTdGF0ZUxlc3NCZWFuVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlNUQVRFTEVTU19CRUFOKTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU3RyaW5nVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1N0cmluZ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5OWM3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU3RyaW5nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFN0cmluZ1R5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFN0cmluZ1R5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuU1RSSU5HX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gbmFtZSArICI7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsgICAgCi0gIH0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICJTdHJpbmcudmFsdWVPZigiICsgbmFtZSArICIpIjsKLSAgfQotIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1R5cGVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVHlwZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4MGQ3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVHlwZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwNDEwICAgMTgwOTUyIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBTYW1wbGUgSlNQIGdlbmVyYXRvciBjaG9rZXMgb24gaW50ZXJmYWNlcyBhbmQgYWJzdHJhY3QgY2xhc3NlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotKiBUeXBlRWxlbWVudCBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgSmF2YSBiZWFuIGZlYXR1cmVzIHRoYXQgaGF2ZSB0eXBlcy4KLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZUVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0lOU1RBTlRJQUJMRSA9ICJub25JbnN0YW50aWFibGUiOwotCi0gIHB1YmxpYyBzdGF0aWMgaW50IEJFQU4gPSAwOwotICBwdWJsaWMgc3RhdGljIGludCBTSU1QTEUgPSAxOwotICBwdWJsaWMgc3RhdGljIGludCBBUlJBWSA9IDI7Ci0KLSAgcHJpdmF0ZSBpbnQgZlR5cGU7Ci0gIHByb3RlY3RlZCBpbnQgZk93bmVyVHlwZTsKLSAgcHJpdmF0ZSBib29sZWFuIGZQcmltaXRpdmUgPSBmYWxzZTsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4gQXV0b21hdGljYWxseSBhZGRzIHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbiBtb2RlbC4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudAotICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdG8gb3duIHRoaXMgb2JqZWN0LgotICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LCBvbmUgb2YKLSAgKiA8Y29kZT5CRUFOPC9jb2RlPiwgPGNvZGU+U0lNUExFPC9jb2RlPiBvciA8Y29kZT5BUlJBWTwvY29kZT4uCi0gICovCi0gIHByb3RlY3RlZCBUeXBlRWxlbWVudCAoIFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgaW50IHR5cGUgKQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCk7Ci0gICAgZlR5cGUgPSB0eXBlOwotICB9Ci0KLSAgLyoqCi0gICovCi0gIHByb3RlY3RlZCBUeXBlRWxlbWVudCAoIFN0cmluZyBuYW1lLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUsIFN0cmluZyBpbmJvdW5kUmVsTmFtZSwgaW50IHR5cGUgKQotICB7Ci0gICAgc3VwZXIobmFtZSxlbGVtZW50LG91dGJvdW5kUmVsTmFtZSxpbmJvdW5kUmVsTmFtZSk7Ci0gICAgZlR5cGUgPSB0eXBlOwotICB9Ci0KLSAgLyoKLSAgKlRoaXMgd2lsbCB0ZWxsIHlvdSB3ZXRoZXIgdGhlIHR5cGUgaXMgYSBiZWFuCi0gICpAcGFyYW0gQm9vbGVhbiByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBiZWFuCi0gICoqLwotICBwdWJsaWMgYm9vbGVhbiBpc0JlYW4oKQotICB7Ci0gICAgaWYgKGZUeXBlID09IEJFQU4pIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICpUaGlzIHdpbGwgdGVsbCB5b3Ugd2V0aGVyIHRoZSB0eXBlIGlzIGEgYmVhbgotICAqQHBhcmFtIEJvb2xlYW4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYmVhbgotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKQotICB7Ci0gICAgcmV0dXJuIGZQcmltaXRpdmU7Ci0gIH0KLQotICAvKgotICAqVGhpcyB3aWxsIHRlbGwgeW91IHdldGhlciB0aGUgdHlwZSBpcyBhIGJlYW4KLSAgKkBwYXJhbSBCb29sZWFuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGJlYW4KLSAgKiovCi0gIHByb3RlY3RlZCB2b2lkIHNldFByaW1pdGl2ZShib29sZWFuIHByaW0pCi0gIHsKLSAgICBmUHJpbWl0aXZlID0gcHJpbTsgCi0gIH0KLQotCi0gIC8qCi0gICogVGhpcyBpcyBtYWlubHkgbmVlZGVkIGZvciBhcnJheXMgYXMgd2l0aCBhbGwgdHlwZXMgdGhlCi0gICogbmFtZXMgY29tZSBvdXQgYXMgamF2YS51dGlsLnR5cGUsIGJ1dCB3aXRoIGFuIGFycmF5IGl0IAotICAqIGlzbnQgZXhwbGljaXQgaW4gdGVsbGluZyB1cyBpdHMgYW4gYXJyYXkKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0gIAotICAvKgotICAqVGhpcyB3aWxsIHRlbGwgeW91IHdldGhlciB0aGUgdHlwZSBpcyBhIHNpbXBsZQotICAqQHBhcmFtIEJvb2xlYW4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgc2ltcGxlCi0gICoqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZSgpCi0gIHsKLSAgICBpZiAoZlR5cGUgPT0gU0lNUExFKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAqVGhpcyB3aWxsIHRlbGwgeW91IHdldGhlciB0aGUgdHlwZSBpcyBhIGFycmF5Ci0gICpAcGFyYW0gQm9vbGVhbiByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhcnJheQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpCi0gIHsKLSAgICBpZiAoZlR5cGUgPT0gQVJSQVkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9BVFRSSUJVVEVTID0gImF0dHJpYnV0ZXMiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfRklFTERTID0gImZpZWxkcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfT1dORVIgPSAib3duZXIiOwotCi0gIHB1YmxpYyBzdGF0aWMgaW50IFBBUkFNRVRFUl9PV05FUiA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IEFUVFJJQlVURV9PV05FUiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IEZJRUxEX09XTkVSID0gMjsKLSAgcHVibGljIHN0YXRpYyBpbnQgUk9PVCA9IDM7Ci0KLSAgLyoKLSAgKiBUaGlzIGNvdWxkIGJlIFRoZSByb290IHRlc3QgYmVhbgotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoaXMgaXMgcm9vdCBiZWFuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzUm9vdCgpCi0gIHsKLSAgICBpZihmT3duZXJUeXBlID09IFJPT1QpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBUeXBlIGNvdWxkIGJlIG93bmVkIGJ5IGEgUGFyYW1ldGVyIG9yIGFuIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoaXMgaXMgb3duZWQgYnkgYSBwYXJhbWV0ZXIKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPd25lclBhcmFtZXRlcigpCi0gIHsKLSAgICBpZihmT3duZXJUeXBlID09IFBBUkFNRVRFUl9PV05FUikgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIFR5cGUgY291bGQgYmUgb3duZWQgYnkgYSBQYXJhbWV0ZXIgb3IgYW4gYXR0cmlidXRlCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhpcyBpcyBvd25lZCBieSBhbiBhdHRyaWJ1dGUgCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzT3duZXJBdHRyaWJ1dGUoKQotICB7Ci0gICAgaWYoZk93bmVyVHlwZSA9PSBBVFRSSUJVVEVfT1dORVIpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBUeXBlIGNvdWxkIGJlIG93bmVkIGJ5IGEgUGFyYW1ldGVyIG9yIGFuIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoaXMgaXMgb3duZWQgYnkgYW4gYXR0cmlidXRlIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc093bmVyRmllbGQoKQotICB7Ci0gICAgaWYoZk93bmVyVHlwZSA9PSBGSUVMRF9PV05FUikgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBUeXBlIG1heSBiZSBvd25lZCBieSBhIHBhcmFtZXRlciBvciBhbiBhdHRyaWJ1dGUgCi0gICogVXNlIHRoaXMgbWV0aG9kIGluIGNvbmp1bmN0aW9uIHdpdGggaXNPd25lclBhcmFtdGVyLCBpc093bmVyCi0gICogQHJldHVybiBCYXNpY0VsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgQmFzaWNFbGVtZW50IGdldE93bmluZ0VsZW1lbnQgKCkKLSAgewotICAgIGlmIChpc093bmVyUGFyYW1ldGVyKCkpewotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9PV05FUik7Ci0gICAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCYXNpY0VsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgICB9Ci0gICAgZWxzZSBpZihpc093bmVyQXR0cmlidXRlKCkpewotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9PV05FUik7Ci0gICAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCYXNpY0VsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgICB9Ci0gICAgZWxzZSBpZihpc093bmVyRmllbGQoKSl7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX09XTkVSKTsKLSAgICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKEJhc2ljRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1R5cGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZWQ2MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1R5cGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNzI2ICAgMTQ1Njc2IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqIDIwMDYwODIzCSAgMTQ1NjQzIG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotLyoqCi0gKiBUeXBlRmFjdG9yeQotICogQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSAxMjo0MTo0OCBQTSkKLSAqIEBhdXRob3I6IEdpbGJlcnQgQW5kcmV3cwotICovCi1wdWJsaWMgY2xhc3MgVHlwZUZhY3RvcnkgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfTkFNRSAgICAgICAgICAgICAgICAgICA9ICJqYXZhLm5ldC5VUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfTkFNRSAgICAgICAgICAgICAgID0gImphdmEubGFuZy5TdHJpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSUdfREVDSU1BTF9OQU1FICAgICAgICAgID0gImphdmEubWF0aC5CaWdEZWNpbWFsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklHX0lOVEVHRVJfTkFNRSAgICAgICAgICA9ICJqYXZhLm1hdGguQmlnSW50ZWdlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTkFNRSAgICAgICAgICAgICAgICAgPSAiamF2YS51dGlsLkRhdGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVHT1JJQU5fQ0FMRU5EQVJfTkFNRSA9ICJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxFTkRBUl9OQU1FICAgICAgICAgICAgID0gImphdmEudXRpbC5DYWxlbmRhciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU5fTkFNRSAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLkJvb2xlYW4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFX05BTUUgICAgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuQnl0ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9OQU1FICAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLkRvdWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUX05BTUUgICAgICAgICAgICAgICAgID0gImphdmEubGFuZy5GbG9hdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVHRVJfTkFNRSAgICAgICAgICAgICAgID0gImphdmEubGFuZy5JbnRlZ2VyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19OQU1FICAgICAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLkxvbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVF9OQU1FICAgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuU2hvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfTkFNRSAgICAgICAgICAgID0gImphdmEubGFuZy5DaGFyYWN0ZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfTkFNRQkJCSAgID0gImphdmEubGFuZy5PYmplY3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0JPT0xFQU5fTkFNRSAgICAgICAgID0gImJvb2xlYW4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0JZVEVfTkFNRSAgICAgICAgICAgID0gImJ5dGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0RPVUJMRV9OQU1FICAgICAgICAgID0gImRvdWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fRkxPQVRfTkFNRSAgICAgICAgICAgPSAiZmxvYXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0lOVEVHRVJfTkFNRSAgICAgICAgID0gImludCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fTE9OR19OQU1FICAgICAgICAgICAgPSAibG9uZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fU0hPUlRfTkFNRSAgICAgICAgICAgPSAic2hvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0NIQVJfTkFNRSAgICAgICAgICAgID0gImNoYXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX05BTUUgICAgICAgICAgICAgICAgICA9ICJ2b2lkIjsKLQotICAvL3NvbWUgc3BlY2lhbCBjb21wbGV4Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPTV9FTEVNRU5UX05BTUUgICA9ICJvcmcudzNjLmRvbS5FbGVtZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTEVNRU5UX05BTUUgPSAiamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURUxFU1NfQkVBTiA9IEJlYW5FbGVtZW50LlNUQVRFTEVTU19CRUFOOwotCi0KLQotICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBqYXZhVHlwZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICBwdWJsaWMgVHlwZUZhY3RvcnkoKXt9Ci0KLSAgc3RhdGljewotICAgIGphdmFUeXBlcy5wdXQoQk9PTEVBTl9OQU1FLG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoQk9PTEVBTl9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChCWVRFX05BTUUsICAgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhCWVRFX05BTUUpKTsKLSAgICBqYXZhVHlwZXMucHV0KERPVUJMRV9OQU1FLCBuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKERPVUJMRV9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChGTE9BVF9OQU1FLCAgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhGTE9BVF9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChJTlRFR0VSX05BTUUsbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhJTlRFR0VSX05BTUUpKTsKLSAgICBqYXZhVHlwZXMucHV0KExPTkdfTkFNRSwgICBuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKExPTkdfTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoU0hPUlRfTkFNRSwgIG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoU0hPUlRfTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoQ0hBUkFDVEVSX05BTUUsICBuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKENIQVJBQ1RFUl9OQU1FKSk7Ci0gIH0KLQotCi0gIC8qCi0gICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gaGFuZGxlIHJlY29nbml6ZWQgYmVhbnMgCi0gICogaW4gZGlzcGxheWluZyBhbmQgZ2VuZXJhdGluZyBjb2RlIGZvciB0aGVtIGluc3RlYWQgb2YgCi0gICogdHJlYXRpbmcgdGhlbSBhcyBjb21wbGV4IHR5cGVzCi0gICovIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVjb2duaXplZEJlYW4oU3RyaW5nIHR5cGUpCi0gIHsKLQotICAgIC8vICAgICAKLSAgICAvL2N1cnJlbnQgcmVjb2duaXplZCBiZWFucyAobW9zdGx5IGphdmEubGFuZykKLSAgICBpZiAodHlwZS5lcXVhbHMoQk9PTEVBTl9OQU1FKSAgICAgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhCWVRFX05BTUUpICAgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoRE9VQkxFX05BTUUpICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKEZMT0FUX05BTUUpICAgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoSU5URUdFUl9OQU1FKSAgICAgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhMT05HX05BTUUpICAgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoU0hPUlRfTkFNRSkgICAgICAgICAgICAgIHx8ICAgICAgCi0gICAgICAgIHR5cGUuZXF1YWxzKENIQVJBQ1RFUl9OQU1FKSAgICAgICAgICB8fCAgICAgIAotICAgICAgICB0eXBlLmVxdWFscyhET01fRUxFTUVOVF9OQU1FKSAgICAgICAgfHwgICAgICAKLQkgICAgdHlwZS5lcXVhbHMoU09BUF9FTEVNRU5UX05BTUUpICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhCSUdfREVDSU1BTF9OQU1FKSAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKEJJR19JTlRFR0VSX05BTUUpICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoREFURV9OQU1FKSAgICAgICAgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhHUkVHT1JJQU5fQ0FMRU5EQVJfTkFNRSkgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoQ0FMRU5EQVJfTkFNRSkgICAgICAgICAgIHx8IAotICAgICAgICB0eXBlLmVxdWFscyhVUkxfTkFNRSkgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKE9CSkVDVF9OQU1FKQkJCSB8fAotICAgICAgICB0eXBlLmVxdWFscyhTVFJJTkdfTkFNRSkpICByZXR1cm4gdHJ1ZTsgICAgICAKLSAgICAgcmV0dXJuIGZhbHNlOyAKLSAgCi0gIH0KLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGhhbmRsZSB1bnN1cHBvcnRlZCB0eXBlcyAKLSAgKiBpZiB3ZSBkb250IHdhbnQgdG8gc3VwcG9ydCBhIHR5cGUgYW5kIHdlIHdhbnQgdG8gb21pdHQgdGhpcyAgCi0gICogbWV0aG9kIGZyb20gdGhlIHNhbXBsZXMKLSAgKiBAcGFyYW0gamF2YUhlbHBlcnMgdGhpcyBpcyB0aGUgdHlwZSB0byBiZSBldmFsdWF0ZWQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkCi0gICovIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVblN1cHBvcnRlZFR5cGUoSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMpCi0gIHsKLSAgICAvL3dlIGFsc28gZG9udCBzdXBwb3J0IGFycmF5cwotCS8vamF2YS5sYW5nLk9iamVjdHMgYXJlIG9rIGZvciByZXR1cm4gdHlwZXMgYnV0IG5vdCBmb3IgaW5wdXQgdHlwZQotICAgIGlmIChqYXZhSGVscGVycy5pc0FycmF5KCl8fAotICAgIAkJamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoTUFQX05BTUUpfHwKLSAgICAJCWphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKFZFQ1RPUl9OQU1FKXx8Ci0gICAgCQlqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpLmVxdWFscyhEQVRBX0hBTkRMRVIpfHwKLSAgICAJCWphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKE9CSkVDVF9OQU1FKSB8fAotICAgIAkJamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5jbGFzcyIpCSkgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFTSFRBQkxFX05BTUUgPSAiamF2YS51dGlsLkhhc2h0YWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUF9OQU1FID0gImphdmEudXRpbC5NYXAiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBWRUNUT1JfTkFNRSA9ICJqYXZhLnV0aWwuVmVjdG9yIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQVJSQVlfTkFNRSA9IEFycmF5RWxlbWVudC5BUlJBWV9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUklNSVRJVkVfQVJSQVlfTkFNRSA9ICJwcmltaXRpdmVhcnJheSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERBVEFfSEFORExFUiA9ICJqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIjsKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWNvZ25pemVkUmV0dXJuVHlwZShKYXZhSGVscGVycyBqYXZhSGVscGVycykKLSAgewotICAgIC8vYXJyYXlzIAotICAgIC8vSGFzaHRhYmxlCi0gICAgLy9WZWN0b3JzCi0JLy9qYXZhLmxhbmcuT2JqZWN0cyBhcmUgb2sgZm9yIHJldHVybiB0eXBlcwotICAgIGlmIChqYXZhSGVscGVycy5pc0FycmF5KCkpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKGphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKEhBU0hUQUJMRV9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmIChqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpLmVxdWFscyhWRUNUT1JfTkFNRSkpcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAoamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoTUFQX05BTUUpKXJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKGphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKE9CSkVDVF9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlY29nbml6ZWRSZXR1cm5UeXBlKFN0cmluZyB0eXBlKQotICB7Ci0gICAgLy9hcnJheXMgCi0gICAgLy9IYXNodGFibGUKLSAgICAvL1ZlY3RvcnMKLQkvL2phdmEubGFuZy5PYmplY3RzIGFyZSBvayBmb3IgcmV0dXJuIHR5cGVzCi0gICAgaWYgKHR5cGUuc3RhcnRzV2l0aChBUlJBWV9OQU1FKSkgcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoSEFTSFRBQkxFX05BTUUpKXJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFZFQ1RPUl9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhNQVBfTkFNRSkpcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoT0JKRUNUX05BTUUpKSByZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0YXRlTGVzc0JlYW4oU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBpZih0eXBlLnN0YXJ0c1dpdGgoU1RBVEVMRVNTX0JFQU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0gIC8qKgotICAqIENyZWF0ZXMgYSB0eXBlIGJhc2VkIG9uIHRoZSBKYXZhSGVscGVyIHRoZW4gc2V0cyB0aGlzIHR5cGUgaW4gdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW1zIEphdmFIZWxwZXJzIHRoaXMgaG9sZHMgdGhlIHR5cGUKLSAgKiBAcGFyYW0gVHlwZUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBob2xkIHRoZSB0eXBlIGNyZWF0ZWQKLSAgKiBAcGFyYW0gU3RyaW5nIFVuaXF1ZW5hbWUgdG8gYmUgdXNlZCB3aGVuIG5hbWluZyB0ZW1wIHZhcmlhYmxlcwotICAqLwotIAotICBwdWJsaWMgc3RhdGljIERhdGFUeXBlIGNyZWF0ZVR5cGUoU3RyaW5nIHR5cGUsIFN0cmluZyBVbmlxdWVOYW1lKQotICB7Ci0gICAgLy90aGlzIGd1eSBtaWdodCBiZSBib3RoIHN0YXRlbGVzcyBhbmQgb25lIG9mIHRoZSBiZWxvdyBlbGVtZW50cwotICAgIC8vd2Ugd291bGQgbGlrZSB0byBiZSBhcyBzcGVjaWZpYyBhcyB3ZSBjYW4sIHN0YXRlbGVzcyBpcyB0aGUgd29yc3QgY2FzZSAKLSAgICBib29sZWFuIHN0YXRlbGVzcyA9IGZhbHNlOyAgCi0gICAgaWYodHlwZS5zdGFydHNXaXRoKFNUQVRFTEVTU19CRUFOKSkgewotICAgICAgc3RhdGVsZXNzID0gdHJ1ZTsKLSAgICAgIHR5cGUgPSB0eXBlLnN1YnN0cmluZygyOSk7IAotICAgIH0KLSAgIAotICAgIERhdGFUeXBlIGRhdGF0eXBlID0gbnVsbDsKLSAgICBpZiAgICAgICh0eXBlLmVxdWFscyhQUklNX0JPT0xFQU5fTkFNRSkpIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZUJvb2xlYW5UeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoUFJJTV9CWVRFX05BTUUpKSAgICAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlQnl0ZVR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX0RPVUJMRV9OQU1FKSkgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZURvdWJsZVR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX0ZMT0FUX05BTUUpKSAgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZUZsb2F0VHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fTE9OR19OQU1FKSkgICAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlTG9uZ1R5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX0lOVEVHRVJfTkFNRSkpIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZUludFR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX0NIQVJfTkFNRSkpICAgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZUNoYXJUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoUFJJTV9TSE9SVF9OQU1FKSkgICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVTaG9ydFR5cGUoKTsKLSAgICAKLQotICAgIC8vc2VlIGlmIHRoaXMgY3JpdHRlciBpcyBhIGphdmF0eXBlCi0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoQk9PTEVBTl9OQU1FKSAgICAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKEJZVEVfTkFNRSkgICAgICAgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhET1VCTEVfTkFNRSkgICAgICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoRkxPQVRfTkFNRSkgICAgICAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKElOVEVHRVJfTkFNRSkgICAgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhMT05HX05BTUUpICAgICAgICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoQ0hBUkFDVEVSX05BTUUpICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoU0hPUlRfTkFNRSkpICAgICAgICBkYXRhdHlwZSA9IChEYXRhVHlwZSlqYXZhVHlwZXMuZ2V0KHR5cGUpOyAgIAotCi0gICAgLy9zZWUgaWYgaXRzIGEgY2FzZSB3ZSBoYW5kbGUKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhTVFJJTkdfTkFNRSkpICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgU3RyaW5nVHlwZSgpOyAKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhWT0lEX05BTUUpKSAgICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgVm9pZFR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhET01fRUxFTUVOVF9OQU1FKSkgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgRG9tRWxlbWVudFR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhTT0FQX0VMRU1FTlRfTkFNRSkpICAgICAgICAgZGF0YXR5cGUgPSBuZXcgU09BUEVsZW1lbnRUeXBlKCk7ICAKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhCSUdfREVDSU1BTF9OQU1FKSkgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgQmlnRGVjaW1hbFR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhCSUdfSU5URUdFUl9OQU1FKSkgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgQmlnSW50ZWdlclR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhEQVRFX05BTUUpKSAgICAgICAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IERhdGVUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoVVJMX05BTUUpKSAgICAgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBVUkxUeXBlKCk7IAotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEdSRUdPUklBTl9DQUxFTkRBUl9OQU1FKSkgIGRhdGF0eXBlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKENBTEVOREFSX05BTUUpKSAgZGF0YXR5cGUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXJUeXBlKCk7Ci0KLSAgICAvL2l0IGNvdWxkIGJlIGEgcmV0dXJuIHR5cGUgd2Ugc3VwcG9ydAotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEhBU0hUQUJMRV9OQU1FKSkgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBIYXNodGFibGVUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoVkVDVE9SX05BTUUpKSAgICAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IFZlY3RvclR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhNQVBfTkFNRSkpICAgICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgTWFwVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKE9CSkVDVF9OQU1FKSkJCQkJZGF0YXR5cGUgPSBuZXcgT2JqZWN0VHlwZSgpOwotCi0gICAgLy8gbmVlZCB0byBzZWUgaWYgaXQgaXMgYW4gb2JqZWN0IGFycmF5Ci0gICAgLy9vciBhIHByaW1pdGl2ZQotICAgIGVsc2UgaWYgKHR5cGUuc3RhcnRzV2l0aChBUlJBWV9OQU1FKSl7ICAgICAgICAgICAgICAKLSAgICAJU3RyaW5nIG5hbWUgPSB0eXBlLnN1YnN0cmluZygyMSk7IAotICAgICAgICBpZihuYW1lLnN0YXJ0c1dpdGgoUFJJTV9CT09MRUFOX05BTUUpIHx8Ci0gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFBSSU1fQllURV9OQU1FKSAgICAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9ET1VCTEVfTkFNRSkgIHx8Ci0gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFBSSU1fRkxPQVRfTkFNRSkgICAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9MT05HX05BTUUpICAgIHx8Ci0gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFBSSU1fSU5URUdFUl9OQU1FKSAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9DSEFSX05BTUUpICAgIHx8Ci0gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFBSSU1fU0hPUlRfTkFNRSkpCi0gICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVBcnJheVR5cGUobmFtZSk7ICAKLSAgICAgICAgZWxzZQotICAgICAgICAJZGF0YXR5cGUgPSBuZXcgQXJyYXlUeXBlKG5hbWUpOwotCi0gICAgfQotICAgIGVsc2UgaWYgKHN0YXRlbGVzcyl7Ci0gICAgICAgIGRhdGF0eXBlID0gbmV3IFN0YXRlTGVzc0JlYW5UeXBlKHR5cGUpOwotCi0gICAgfQotCi0KLSAgICBkYXRhdHlwZS5zZXRVbmlxdWVOYW1lKFVuaXF1ZU5hbWUpOwotICAgIHJldHVybiBkYXRhdHlwZTsKLSAgICAgCi0gIH0KLSAgCi0gIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9VUkxUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVVJMVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzBmYjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9VUkxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgVVJMVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgVVJMVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5VUkxfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAibmV3IGphdmEubmV0LlVSTCgiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247ICAgIAotICB9Ci0KLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBuYW1lICsgIi50b1N0cmluZygpIjsKLSAgfQotIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ZlY3RvclR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9WZWN0b3JUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDcxOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ZlY3RvclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFZlY3RvclR5cGUgZXh0ZW5kcyBSZWNvZ25pemVkUmV0dXJuVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFZlY3RvclR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuVkVDVE9SX05BTUUpOwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9Wb2lkVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ZvaWRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZGU5MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ZvaWRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBWb2lkVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBWb2lkVHlwZSgpCi0gIHsKLSAgICBzdXBlcigidm9pZCIpOwotICB9Ci0KLSAgIC8qKgotICAqIGZvciBhIHZvaWQgdGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiU3RyaW5nLnZhbHVlT2YoIiArIG5hbWUgKyAiKSI7Ci0gIH0KLSAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3ZhbGlkYXRlL1ZhbGlkYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODY0N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotCi0vKioKLSAgKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIHZhbGlkYXRpb24gc3RhdGUgb2YgcHJvamVjdHMgdGhhdCBzb21lIHRhc2tzIG1heSB3YW50Ci0gICogdG8gZGlzYWJsZS4gIFRoZSBtYW5hZ2VyIGNhbiB0aGVuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgdmFsaWRhdGlvbiBzdGF0ZS4KLSoqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NYW5hZ2VyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICAgKiBUaGlzIHNldCBjb250YWlucyBhIHNldCBvZiBJUHJvamVjdHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkYXRlZC4KLSAgKiovCi0gIHByaXZhdGUgSGFzaFNldCBwcm9qZWN0cyA9IG51bGw7ICAgICAgICAgICAgICAKLQotICAvKioKLSAgICAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBqMmVlIHZhbGlkYXRvci4KLSAgKiovCi0gIC8vcGdtIHByaXZhdGUgVmFsaWRhdG9yTWFuYWdlciBqMmVlTWFuYWdlciA9IG51bGw7Ci0KLSAgLyoqCi0gICAgKiBUaGlzIGJvb2xlYW4gY29udGFpbnMgdGhlIGF1dG8gYnVpbGQgc2V0dGluZyB1bmRlciBwcmVmZXJyZW5jZQotICAqKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzQXV0b0J1aWxkXzsKLSAgcHJpdmF0ZSBib29sZWFuIGF1dG9CdWlsZERpc2FibGVkXzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgVmFsaWRhdGlvbk1hbmFnZXIoKQotICB7Ci0gICAgcHJvamVjdHMgICAgPSBuZXcgSGFzaFNldCgpOwotICAgIC8vcGdtIGoyZWVNYW5hZ2VyID0gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCk7Ci0gICAgc2V0QXV0b0J1aWxkUHJlZmVyZW5jZSgpOwotICAgIGF1dG9CdWlsZERpc2FibGVkXyA9IGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICAqIERpc2FibGVzIHRoZSB2YWxpZGF0aW9uIGZvciBhIHByb2plY3QgaWYgcmVxdWlyZWQuCi0gICoqLwotICBwdWJsaWMgdm9pZCBkaXNhYmxlVmFsaWRhdGlvbkZvclByb2plY3QoIElQcm9qZWN0IHByb2plY3QgKQotICB7ICAgIAotICAgIC8vIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIHByb2plY3QgbmVlZHMgaGF2ZSB2YWxpZGF0aW9uIHR1cm5lZCBiYWNrIG9uLgotICAgIHByb2plY3RzLmFkZCggcHJvamVjdCApOwotICAgIAotICAgIC8vcGdtIGoyZWVNYW5hZ2VyLnN1c3BlbmRBbGxWYWxpZGF0aW9uKCB0cnVlICk7Ci0gIH0KLQotICAvKioKLSAgICAqIFJlc3RvcmVzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIGZvciBhbGwgbmVlZGVkIHByb2plY3RzLgotICAqKi8KLSAgcHVibGljIHZvaWQgcmVzdG9yZVZhbGlkYXRpb25Gb3JQcm9qZWN0cyggYm9vbGVhbiBydW5WYWxpZGF0aW9uICkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5QXV0b0J1aWxkKGJvb2xlYW4gaXNBdXRvQnVpbGQpIHsKLSAgICB0cnkgewotICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICBJV29ya3NwYWNlRGVzY3JpcHRpb24gd29ya3NwYWNlRGVzYyA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgd29ya3NwYWNlRGVzYy5zZXRBdXRvQnVpbGRpbmcoaXNBdXRvQnVpbGQpOwotICAgICAgd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKHdvcmtzcGFjZURlc2MpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNhYmxlQXV0b0J1aWxkKCkgewotICAgIGlmICghYXV0b0J1aWxkRGlzYWJsZWRfKSB7Ci0gICAgICBzZXRBdXRvQnVpbGRQcmVmZXJlbmNlKCk7Ci0gICAgICBtb2RpZnlBdXRvQnVpbGQoZmFsc2UpOwotICAgICAgYXV0b0J1aWxkRGlzYWJsZWRfID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXN0b3JlQXV0b0J1aWxkKCkgewotICAgIGlmIChhdXRvQnVpbGREaXNhYmxlZF8pIHsKLSAgICAgIG1vZGlmeUF1dG9CdWlsZChnZXRBdXRvQnVpbGRQcmVmZXJlbmNlKCkpOwotICAgICAgYXV0b0J1aWxkRGlzYWJsZWRfID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0QXV0b0J1aWxkUHJlZmVyZW5jZSgpIHsKLSAgICBpc0F1dG9CdWlsZF8gPSBnZXRXb3Jrc3BhY2VBdXRvQnVpbGRQcmVmZXJlbmNlKCk7Ci0gICAgcmV0dXJuIGlzQXV0b0J1aWxkXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEF1dG9CdWlsZFByZWZlcmVuY2UoKSB7Ci0gICAgcmV0dXJuIGlzQXV0b0J1aWxkXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFdvcmtzcGFjZUF1dG9CdWlsZFByZWZlcmVuY2UoKSB7Ci0gICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdvcmtzcGFjZURlc2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICByZXR1cm4gd29ya3NwYWNlRGVzYy5pc0F1dG9CdWlsZGluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9CaW5kaW5nRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL0JpbmRpbmdFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3Y2ExODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL0JpbmRpbmdFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEJpbmRpbmdFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfUE9SVCA9ICJwb3J0IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX09QRVJBVElPTlMgPSAib3BlcmF0aW9ucyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9QT1JUX1RZUEUgPSAicG9ydHR5cGUiOwotICAKLSAgcHVibGljIEJpbmRpbmdFbGVtZW50IChQb3J0RWxlbWVudCBwb3J0RWxlbWVudCxTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUscG9ydEVsZW1lbnQsUkVMX1BPUlQsUG9ydEVsZW1lbnQuUkVMX0JJTkRJTkcpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFBvcnQoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9QT1JUKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQb3J0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1BPUlRfVFlQRSk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0T3BlcmF0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX09QRVJBVElPTlMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZk9wZXJhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE51bWJlck9mRWxlbWVudHMoUkVMX09QRVJBVElPTlMpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9EZWZpbml0aW9uRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL0RlZmluaXRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzk3NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL0RlZmluaXRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIERlZmluaXRpb25FbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfU0VSVklDRVMgPSAic2VydmljZXMiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfV1NETCA9ICJ3c2RsIjsKLSAgCi0gIHB1YmxpYyBEZWZpbml0aW9uRWxlbWVudCAoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLHdzZGxFbGVtZW50LFJFTF9XU0RMLFdTRExFbGVtZW50LlJFTF9ERUZJTklUSU9OUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0V1NETCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1dTREwpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfU0VSVklDRVMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9TRVJWSUNFUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL01lc3NhZ2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvTWVzc2FnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkMDEwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvTWVzc2FnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9PUEVSQVRJT04gPSAib3BlcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX1BBUlRTID0gInBhcnRzIjsKLSAgCi0gIHB1YmxpYyBNZXNzYWdlRWxlbWVudCAoT3BlcmF0aW9uRWxlbWVudCBvcGVyYXRpb25FbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxvcGVyYXRpb25FbGVtZW50LFJFTF9PUEVSQVRJT04sT3BlcmF0aW9uRWxlbWVudC5SRUxfTUVTU0FHRVMpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldE9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX09QRVJBVElPTik7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFydHMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9QQVJUUyk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mUGFydHMoKQotICB7Ci0gICAgcmV0dXJuIGdldE51bWJlck9mRWxlbWVudHMoUkVMX1BBUlRTKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvT3BlcmF0aW9uRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL09wZXJhdGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1MDFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvT3BlcmF0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25FbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfQklORElORyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX01FU1NBR0VTID0gIm1lc3NhZ2VzIjsKLQotICBwdWJsaWMgT3BlcmF0aW9uRWxlbWVudCAoQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGJpbmRpbmdFbGVtZW50LFJFTF9CSU5ESU5HLEJpbmRpbmdFbGVtZW50LlJFTF9PUEVSQVRJT05TKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfQklORElORyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9NRVNTQUdFUyk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIGdldE51bWJlck9mRWxlbWVudHMoUkVMX01FU1NBR0VTKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUGFydEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9QYXJ0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBmZmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9QYXJ0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBQYXJ0RWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX01FU1NBR0UgPSAibWVzc2FnZSI7Ci0gICAgCi0gIHB1YmxpYyBQYXJ0RWxlbWVudCAoTWVzc2FnZUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1lc3NhZ2VFbGVtZW50LFJFTF9NRVNTQUdFLE1lc3NhZ2VFbGVtZW50LlJFTF9QQVJUUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX01FU1NBR0UpOwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9Qb3J0RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTJhYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFBvcnRFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfQklORElORyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX1NFUlZJQ0UgPSAic2VydmljZSI7Ci0gIAotICBwdWJsaWMgUG9ydEVsZW1lbnQgKFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxzZXJ2aWNlRWxlbWVudCxSRUxfU0VSVklDRSxTZXJ2aWNlRWxlbWVudC5SRUxfUE9SVFMpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9TRVJWSUNFKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfQklORElORyk7Ci0gIH0KLSAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRUeXBlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRUeXBlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGY2ODgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9Qb3J0VHlwZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfQklORElORyA9ICJiaW5kaW5nIjsKLSAgCi0gIHB1YmxpYyBQb3J0VHlwZUVsZW1lbnQgKEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiaW5kaW5nRWxlbWVudCxSRUxfQklORElORyxCaW5kaW5nRWxlbWVudC5SRUxfUE9SVF9UWVBFKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfQklORElORyk7Ci0gIH0KLQotIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU2VydmljZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TZXJ2aWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAyZDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX1BPUlRTID0gInBvcnRzIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0RFRklOSVRJT04gPSAiZGVmaW5pdGlvbiI7Ci0gIAotICBwdWJsaWMgU2VydmljZUVsZW1lbnQgKERlZmluaXRpb25FbGVtZW50IGRlZmluaXRpb25FbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxkZWZpbml0aW9uRWxlbWVudCxSRUxfREVGSU5JVElPTixEZWZpbml0aW9uRWxlbWVudC5SRUxfU0VSVklDRVMpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9ERUZJTklUSU9OKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQb3J0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1BPUlRTKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQb3J0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfUE9SVFMpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TdHViYmVkV1NETE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU3R1YmJlZFdTRExNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDYxMWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TdHViYmVkV1NETE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi1wdWJsaWMgY2xhc3MgU3R1YmJlZFdTRExNb2RlbAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJvdGVjdGVkIE1vZGVsIGZNb2RlbDsKLSAgcHVibGljIFN0dWJiZWRXU0RMTW9kZWwoKQotICB7Ci0gICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSBuZXcgV1NETEVsZW1lbnQoIldTRExGaWxlcyIpOwotICAgIGZNb2RlbCA9IHdzZGxFbGVtZW50LmdldE1vZGVsKCk7ICAgCi0gIH0KLQotICBwdWJsaWMgTW9kZWwgZ2V0V1NETE1vZGVsKCkKLSAgewotICAgIHJldHVybiBmTW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBidWlsZE1vZGVsKCkKLSAgewotICAgIERlZmluaXRpb25FbGVtZW50IGRlZjEgPSBuZXcgRGVmaW5pdGlvbkVsZW1lbnQoKFdTRExFbGVtZW50KWZNb2RlbC5nZXRSb290RWxlbWVudCgpLCJTdG9ja1F1b3RlIik7IAotICAgIFNlcnZpY2VFbGVtZW50IHNlcjEgPSBuZXcgU2VydmljZUVsZW1lbnQoZGVmMSwiZ2V0UXVvdGUiKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBzZXIyID0gbmV3IFNlcnZpY2VFbGVtZW50KGRlZjEsInNldFF1b3RlIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDEgPSBuZXcgUG9ydEVsZW1lbnQoc2VyMSwicG9ydDEiKTsKLSAgICBQb3J0RWxlbWVudCBwb3J0MiA9IG5ldyBQb3J0RWxlbWVudChzZXIxLCJwb3J0MiIpOwotICAgIFBvcnRFbGVtZW50IHBvcnQzID0gbmV3IFBvcnRFbGVtZW50KHNlcjIsInBvcnQxIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDQgPSBuZXcgUG9ydEVsZW1lbnQoc2VyMiwicG9ydDIiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMSA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MSwiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMiA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MiwiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMyA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MywiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kNCA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0NCwiYmluZDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wMSA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQxLCJvcDEiKTsKLSAgICBuZXcgT3BlcmF0aW9uRWxlbWVudChiaW5kMiwib3AxIik7Ci0gICAgbmV3IE9wZXJhdGlvbkVsZW1lbnQoYmluZDMsIm9wMSIpOwotICAgIG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQ0LCJvcDEiKTsKLSAgICBNZXNzYWdlRWxlbWVudCBtZTEgPSBuZXcgTWVzc2FnZUVsZW1lbnQob3AxLCJtZTEiKTsKLSAgICBNZXNzYWdlRWxlbWVudCBtZTIgPSBuZXcgTWVzc2FnZUVsZW1lbnQob3AxLCJtZTIiKTsKLSAgICBuZXcgUGFydEVsZW1lbnQobWUxLCJwZTEiKTsKLSAgICBuZXcgUGFydEVsZW1lbnQobWUyLCJwZTIiKTsKLQotICAgIERlZmluaXRpb25FbGVtZW50IGRlZjIgPSBuZXcgRGVmaW5pdGlvbkVsZW1lbnQoKFdTRExFbGVtZW50KWZNb2RlbC5nZXRSb290RWxlbWVudCgpLCJUZW1wQ29udmVyc2lvbiIpOyAKLSAgICBTZXJ2aWNlRWxlbWVudCBzZXIzID0gbmV3IFNlcnZpY2VFbGVtZW50KGRlZjIsImdldFRlbXAiKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBzZXI0ID0gbmV3IFNlcnZpY2VFbGVtZW50KGRlZjIsInNldFRlbXAiKTsKLSAgICBQb3J0RWxlbWVudCBwb3J0NSA9IG5ldyBQb3J0RWxlbWVudChzZXIzLCJwb3J0MSIpOwotICAgIFBvcnRFbGVtZW50IHBvcnQ2ID0gbmV3IFBvcnRFbGVtZW50KHNlcjQsInBvcnQxIik7Ci0gICAgQmluZGluZ0VsZW1lbnQgYmluZDUgPSBuZXcgQmluZGluZ0VsZW1lbnQocG9ydDUsImJpbmQxIik7Ci0gICAgQmluZGluZ0VsZW1lbnQgYmluZDYgPSBuZXcgQmluZGluZ0VsZW1lbnQocG9ydDYsImJpbmQxIik7Ci0gICAgbmV3IE9wZXJhdGlvbkVsZW1lbnQoYmluZDUsIm9wMSIpOwotICAgIG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQ2LCJvcDEiKTsKLQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9XU0RMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1dTRExFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTg5ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1dTRExFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIFdTRExFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfREVGSU5JVElPTlMgPSAiZGVmaW5pdGlvbnMiOwotICAKLSAgLyoKLSAgKgotICAqKi8KLSAgcHVibGljIFdTRExFbGVtZW50IChTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMobmFtZSxuZXcgQmFzaWNNb2RlbCgiV1NETE1vZGVsIikpOwotICB9Ci0KLSAgcHVibGljIFdTRExFbGVtZW50IChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1vZGVsKTsKLSAgICBtb2RlbC5zZXRSb290RWxlbWVudCh0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXREZWZpbml0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX0RFRklOSVRJT05TKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZEZWZpbml0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfREVGSU5JVElPTlMpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZUFzc2VtYmx5RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZUFzc2VtYmx5RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjYWI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVBc3NlbWJseUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZURlcGxveUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVEZXBsb3lGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA5Y2YyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZURlcGxveUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UHJlRGVwbG95RnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVEZXZlbG9wRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZURldmVsb3BGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTNmNWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZURldmVsb3BGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudFByZURldmVsb3BGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZUluc3RhbGxGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZGEzZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZUFzc2VtYmx5RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVBc3NlbWJseUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDFiNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZUFzc2VtYmx5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVEZXBsb3lGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZURlcGxveUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMWRiNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZURlcGxveUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVByZURlcGxveUZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZURldmVsb3BGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZURldmVsb3BGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGU5YzIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVEZXZlbG9wRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUHJlRGV2ZWxvcEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZUluc3RhbGxGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZUluc3RhbGxGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjgyNjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVJbnN0YWxsRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUHJlSW5zdGFsbEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9wbHVnaW4vV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0MDYyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNCAgIDExNTY5MCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBidWxrIG9mIHRoZSBXZWIgU2VydmljZXMgcnVudGltZS4KLSogT25seSB0aGUgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHBvcnRpb24gb2YgdGhlIHJ1bnRpbWUgaXMKLSogZm91bmQgZWxzZXdoZXJlIC0gaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aSBwbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbiBleHRlbmRzIFBsdWdpbgotewotICAvKioKLSAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbiBpbiBwbHVnaW4ueG1sLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCi0gIC8qKgotICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIGluc3RhbmNlXzsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbiAoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbnN0YW5jZV8gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgKiAoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzIik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4gZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MWZhNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA2MTIgICAxNDU0MzMgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5UeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5BdHRyaWJ1dGVFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIElucHV0RmlsZVR5cGVHZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIGV4dGVuZHMgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHByaXZhdGUgYm9vbGVhbiBmU3RhdGVMZXNzOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY3VycmVudExldmVsLCBpbnQgbGV2ZWxzRGVlcCkKLSAgewotICAgICBzdXBlcihidWZmZXIsY3VycmVudExldmVsLGxldmVsc0RlZXApOwotICB9Ci0KLSAKLSAgLyoKLSAgKiBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbiBieSB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICogQHBhcmFtIE9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24KLSAgKi8KLSAgcHVibGljIElTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgCi0gICAgIEF0dHJpYnV0ZUVsZW1lbnRUeXBlIGF0dHJpYnV0ZUVsZW1lbnRUeXBlID0gKEF0dHJpYnV0ZUVsZW1lbnRUeXBlKW9iamVjdDsKLSAgICAgLy9pZiBpdCBpcyBhIGJlYW4gaXMgaXQgc3RhdGVsZXNzCi0gICAgIGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCk7IAotICAgICBpZihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRTZXR0ZXJNZXRob2QoKSA9PSBudWxsKSByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgaWYoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5pc0JlYW4oKSl7Ci0gICAgICAgQmVhbkVsZW1lbnQgYmVhbiA9IChCZWFuRWxlbWVudClhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpOwotICAgICAgIGZTdGF0ZUxlc3MgPSBiZWFuLmlzU3RhdGVMZXNzKCk7Ci0gICAgIH0JIAotCi0gICAgIFR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IFR5cGVWaXNpdG9yKCk7Ci0gICAgIElucHV0RmlsZVR5cGVHZW5lcmF0b3IgaW5wdXRGaWxlVHlwZUdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yKGZidWZmZXIsZkN1cnJlbnRMZXZlbCxmTGV2ZWxzRGVlcCk7Ci0gICAgIGlmKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuaXNCZWFuKCkgJiYgIVR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpKSAKLSAgICAgCSYmICEoZ2V0UmV0dXJuUGFyYW0oKSAmJiAoVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZShhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmdldFR5cGVOYW1lKCkpIHx8IGZTdGF0ZUxlc3MpKSkKLSAgICAgICAgICAgICAgICAKLSAgICAgYWRkUGFyZW50R2V0dGVyKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldEdldHRlck1ldGhvZCgpLGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpKTsKLSAgICAgaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5hZGRQYXJlbnRHZXR0ZXIocmV0dXJuUGFyZW50R2V0dGVyKCkscmV0dXJuUGFyZW50R2V0dGVyVHlwZSgpKTsKLSAgICAgaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgIGlucHV0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7Ci0gICAgIHR5cGVWaXNpdG9yLnJ1bihhdHRyaWJ1dGVFbGVtZW50VHlwZSxpbnB1dEZpbGVUeXBlR2VuZXJhdG9yKTsgICAKLSAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZVR5cGVHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgIAotICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzE5ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uTWV0aG9kVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBNZXRob2RGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIElucHV0RmlsZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHB1YmxpYyBTdHJpbmcgZlJlc3VsdE5hbWU7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogdXNlZCBkaXJlY3RseSAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUdlbmVyYXRvciAoU3RyaW5nIHJlc3VsdCkKLSAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIGZSZXN1bHROYW1lID0gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogY2FsbGVkIGZyb20gc3ViY2xhc3NlcwotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgcmVzdWx0KQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgZlJlc3VsdE5hbWUgPSByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lcyhTdHJpbmcgcmVzdWx0cykKLSAgewotICAgIGZSZXN1bHROYW1lID0gcmVzdWx0czsKLSAgfQotCi0gIC8vdGFrZXMgaW4gYSBiZWFuIG5vZGUKLSAgIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICAgewotICAgICAgRWxlbWVudCBiZWFuRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JUBwYWdlIGNvbnRlbnRUeXBlPVwidGV4dC9odG1sO2NoYXJzZXQ9VVRGLThcIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxIVE1MPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFRJVExFPklucHV0czwvVElUTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvSEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEJPRFk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxIMT5JbnB1dHM8L0gxPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIlN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihcIm1ldGhvZFwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaW50IG1ldGhvZElEID0gMDsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKG1ldGhvZCA9PSBudWxsKSBtZXRob2RJRCA9IC0xOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJib29sZWFuIHZhbGlkID0gdHJ1ZTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYobWV0aG9kSUQgIT0gLTEpIG1ldGhvZElEID0gSW50ZWdlci5wYXJzZUludChtZXRob2QpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgCi0gICAgICBmYnVmZmVyLmFwcGVuZCgic3dpdGNoIChtZXRob2RJRCl7ICIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIAkKLSAgICAgIC8vIGdvIHRvIHRoZSBuZXh0IGdlbmVyYXRvcgotICAgICAgTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IE1ldGhvZFZpc2l0b3IoKTsKLSAgICAgIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIGlucHV0RmlsZUhlbHAxR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUhlbHAxR2VuZXJhdG9yKGZidWZmZXIsZlJlc3VsdE5hbWUpOyAKLSAgICAgIG1ldGhvZFZpc2l0b3IucnVuKGJlYW5FbGVtZW50LGlucHV0RmlsZUhlbHAxR2VuZXJhdG9yKTsKLSAgICAgIGZidWZmZXIgPSBpbnB1dEZpbGVIZWxwMUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoImNhc2UgMTExMTExMTExMToiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgidmFsaWQgPSBmYWxzZTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZPUk0gTUVUSE9EPVwiUE9TVFwiIEFDVElPTj1cIiIgKyBmUmVzdWx0TmFtZSArICJcIiBUQVJHRVQ9XCJyZXN1bHRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJISURERU5cIiBOQU1FPVwibWV0aG9kXCIgVkFMVUU9XCI8JT1tZXRob2QlPlwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEFCTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFREIENPTFNQQU49XCIxXCIgQUxJR049XCJMRUZUXCI+VVJMU3RyaW5nOjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxURCBBTElHTj1cImxlZnRcIj48SU5QVVQgVFlQRT1cIlRFWFRcIiBOQU1FPVwidXJsMTExMTExMTExMVwiIFNJWkU9MjA+PC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9UQUJMRT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEJSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIlNVQk1JVFwiIFZBTFVFPVwiSW52b2tlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiUkVTRVRcIiBWQUxVRT1cIkNsZWFyXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvRk9STT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiYnJlYWs7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImNhc2UgMTExMTExMTExMjoiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgidmFsaWQgPSBmYWxzZTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZPUk0gTUVUSE9EPVwiUE9TVFwiIEFDVElPTj1cIiIgKyBmUmVzdWx0TmFtZSArICJcIiBUQVJHRVQ9XCJyZXN1bHRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJISURERU5cIiBOQU1FPVwibWV0aG9kXCIgVkFMVUU9XCI8JT1tZXRob2QlPlwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8QlI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiU1VCTUlUXCIgVkFMVUU9XCJJbnZva2VcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJSRVNFVFwiIFZBTFVFPVwiQ2xlYXJcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9GT1JNPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJicmVhazsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAKLSAgICAgIAotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgICAgCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKHZhbGlkKSB7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiU2VsZWN0IGEgbWV0aG9kIHRvIHRlc3QuIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuVEFCICsgInJldHVybjsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hUTUw+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgCi0gICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjYTY1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUhlbHAxR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5QYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IgZXh0ZW5kcyBJbnB1dEZpbGVHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1NUQVRFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfU1RBVEUgPSAyOwotCi0gIHB1YmxpYyBpbnQgZnN0YXRlOwotICAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgICBmc3RhdGUgPSBJTklUSUFMX1NUQVRFOwotICB9Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLFN0cmluZyByZXN1bHROYW1lKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIscmVzdWx0TmFtZSk7Ci0gICAgICBmc3RhdGUgPSBJTklUSUFMX1NUQVRFOwotICB9Ci0gIAotICAvKgotICAqIFRha2VzIGluIGFuIGVsZW1lbnQKLSAgKiBAcGFyYW0gT2JqZWN0IFRha2VzIGluIGFuIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgTWV0aG9kRWxlbWVudCBtZXRob2QgPSAoTWV0aG9kRWxlbWVudCltZXRob2RFbGVtZW50OwotICAgICBpZiAobWV0aG9kLmdldE1ldGhvZE9tbWlzc2lvbigpKSByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgCi0gICAgIFBhcmFtZXRlclZpc2l0b3IgcGFyYW1ldGVyVmlzaXRvciA9IG5ldyBQYXJhbWV0ZXJWaXNpdG9yKCk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCJjYXNlICIgKyBtZXRob2QuZ2V0TnVtYmVySUQoKSsgIjoiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCJ2YWxpZCA9IGZhbHNlOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPEZPUk0gTUVUSE9EPVwiUE9TVFwiIEFDVElPTj1cIiIgKyBmUmVzdWx0TmFtZSArICJcIiBUQVJHRVQ9XCJyZXN1bHRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIkhJRERFTlwiIE5BTUU9XCJtZXRob2RcIiBWQUxVRT1cIjwlPW1ldGhvZCU+XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgIAotICAgICAvLyBnbyB0byB0aGUgbmV4dCBnZW5lcmF0b3IKLSAgICAgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgaW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgPSBuZXcgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IoZmJ1ZmZlcik7IAotICAgICBwYXJhbWV0ZXJWaXNpdG9yLnJ1bihtZXRob2RFbGVtZW50LGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yKTsKLSAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICAKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIlNVQk1JVFwiIFZBTFVFPVwiSW52b2tlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJSRVNFVFwiIFZBTFVFPVwiQ2xlYXJcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCI8L0ZPUk0+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCJicmVhazsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAKLQotICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgCi0gIAotICB9ICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMkdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkyMzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIElucHV0RmlsZUhlbHAyR2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIElucHV0RmlsZUhlbHAyR2VuZXJhdG9yIGV4dGVuZHMgSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICAvKgotICAqIFRoaXMgaXMgYWN0dWFsbHkgdXNlZCBieSB0aGUgcmVzdWx0IGdlbmVyYXRvciB0byBzaG93IHRoZSAKLSAgKiByZXN1bHRhbnQgQmVhbgotICAqIFRoZSBuYW1lIGlzIHRoZSBuYW1lIHRoZSByZXN1bHRhbnQgYmVhbiBpcyB1c2luZyBhcyBpdHMgaW5zdGFuY2UgbmFtZQotICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGZJbnN0YW5jZU5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBmUmV0dXJuUGFyYW09ZmFsc2U7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgIGZJbnN0YW5jZU5hbWU9IiI7Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGlzIHN0YXRlIGRhdGEgdG8gYmUgdXNlZCBieSB0aGUgZ2VuZXJhdG9ycwotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgaW5zdGFuY2UgbmFtZSBvZiB0aGUgcGFyYW1ldGVycyB0eXBlIGJlYW4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZkluc3RhbmNlTmFtZSA9IG5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGlzIHN0YXRlIGRhdGEgdG8gYmUgdXNlZCBieSB0aGUgZ2VuZXJhdG9ycwotICAqIEByZXR1cm4gU3RyaW5nIG5hbWUgVGhlIGluc3RhbmNlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcnMgdHlwZSBiZWFuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFuY2VOYW1lKCkKLSAgewotICAgIHJldHVybiBmSW5zdGFuY2VOYW1lOwotICB9Ci0KLQotICAvKgotICAqIFRha2VzIGluIGFuIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uIGJ5IHRoaXMgdmlzaXRvciBhY3Rpb24KLSAgKiBAcGFyYW0gT2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbgotICAqLwotICBwdWJsaWMgSVN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICAgRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICAgZ2V0VmlzaXRvcigpOwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFRBQkxFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgIElucHV0RmlsZVR5cGVHZW5lcmF0b3IgaW5wdXRGaWxlVHlwZUdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yKGZidWZmZXIsMCk7Ci0gICAgICBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgICB0eXBlVmlzaXRvci5ydW4ocGFyYW1ldGVyRWxlbWVudCxpbnB1dEZpbGVUeXBlR2VuZXJhdG9yKTsKLSAgICAgIGZidWZmZXIgPSBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9UQUJMRT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAKLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFJldHVyblBhcmFtKCkKLSAgewotICAgIHJldHVybiBmUmV0dXJuUGFyYW07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXR1cm5QYXJhbShib29sZWFuIHJldHVyblBhcmFtKQotICB7Ci0gICAgZlJldHVyblBhcmFtID0gcmV0dXJuUGFyYW07Ci0gIH0gCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVUeXBlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZVR5cGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzNTIxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZVR5cGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNjEyICAgMTQ1NDMzIGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqIDIwMDcwNDEwICAgMTgwOTUyIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBTYW1wbGUgSlNQIGdlbmVyYXRvciBjaG9rZXMgb24gaW50ZXJmYWNlcyBhbmQgYWJzdHJhY3QgY2xhc3NlcyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLkF0dHJpYnV0ZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5GaWVsZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQXR0cmlidXRlRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuU2ltcGxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIElucHV0RmlsZVR5cGVHZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciBleHRlbmRzIElucHV0RmlsZUhlbHAyR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmUGFyZW50R2V0dGVyczsKLSAgcHJvdGVjdGVkIGludCBmTGV2ZWxzRGVlcDsKLSAgcHJvdGVjdGVkIGludCBmQ29sc3BhbjsKLSAgcHJvdGVjdGVkIGludCBmQ3VycmVudExldmVsOwotICBwcml2YXRlIGJvb2xlYW4gZklzU2ltcGxlOwotICBwcml2YXRlIGJvb2xlYW4gZlN0YXRlTGVzc0JlYW47Ci0gIHByaXZhdGUgVmVjdG9yIGZHZXR0ZXJzOwotICBwcml2YXRlIFZlY3RvciBmVHlwZXM7Ci0gIHByaXZhdGUgYm9vbGVhbiBmV3JpdGUgPSB0cnVlOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGN1cnJlbnRMZXZlbCkKLSAgewotICAgICBzdXBlcihidWZmZXIpOwotICAgICBmQ3VycmVudExldmVsID0gY3VycmVudExldmVsOwotICAgICBmTGV2ZWxzRGVlcCA9IC0xOwotICAgICBmUGFyZW50R2V0dGVycyA9ICIiOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY3VycmVudExldmVsLGludCBsZXZlbHNEZWVwKQotICB7Ci0gICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgIGZDdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7Ci0gICAgIGZMZXZlbHNEZWVwID0gbGV2ZWxzRGVlcDsKLSAgICAgZlBhcmVudEdldHRlcnMgPSAiIjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBhcmVudEdldHRlcnMoVmVjdG9yIGdldHRlcixWZWN0b3IgdHlwZSkKLSAgewotICAgICBpZihmR2V0dGVycyAhPSBudWxsKXsKLSAgICAgICBmR2V0dGVycy5jbGVhcigpOwotICAgICAgIGZUeXBlcy5jbGVhcigpOwotICAgICB9Ci0gICAgIGFkZFBhcmVudEdldHRlcihnZXR0ZXIsdHlwZSk7Ci0gIH0KLQotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaG9sZHMgc29tZSBzdGF0ZSBkYXRhIHRoYXQgaXMgaW1wb3J0YW50IGluIGdldHRpbmcgdGhlIAotICAqIFN0cmluZ3MgZm9yIGRpc3BsYXkgb2YgcmVzdWx0YW50IGJlYW5zCi0gICogQHBhcmFtIFN0cmluZyBnZXR0ZXIgdGhpcyBpcyB0aGUgZ2V0dGVyIG9mIGFuIGF0dHJpYnV0ZQotICAqIFRoZSBpZGVhIGlzIHRoYXQgYnkgdGhlIHRpbWUgd2UgZ2V0IHRvIHRoZSBzaW1wbGUgdHlwZQotICAqIHdlIGhhdmUgZ2V0QWRkcmVzcygpLmdldFN0cmVldCgpLi4uLgotICAqLwotICBwdWJsaWMgdm9pZCBhZGRQYXJlbnRHZXR0ZXIoU3RyaW5nIGdldHRlciwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBpZihmR2V0dGVycyA9PSBudWxsKSBmR2V0dGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZihmVHlwZXMgPT0gbnVsbCkgZlR5cGVzID0gbmV3IFZlY3RvcigpOwotICAgIGZHZXR0ZXJzLmFkZEVsZW1lbnQoZ2V0dGVyKTsKLSAgICBmVHlwZXMuYWRkRWxlbWVudCh0eXBlKTsKLSAgfQotCi0gIC8qCi0gICogdGhpcyB3aWxsIGJlIHVzZWQgd2hlbiBwYXNzaW5nIGJldHdlZW4gdHdvIHZpc2l0b3JzCi0gICoKLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFyZW50R2V0dGVyKFZlY3RvciBnZXR0ZXJzLCBWZWN0b3IgdHlwZXMpCi0gIHsKLSAgICBpZihmR2V0dGVycyA9PSBudWxsKSBmR2V0dGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZihmVHlwZXMgPT0gbnVsbCkgZlR5cGVzID0gbmV3IFZlY3RvcigpOwotICAgIGludCBzaXplID0gZ2V0dGVycy5zaXplKCk7ICAgIAotICAgIGZvcihpbnQgaSA9IDA7IGk8c2l6ZTsgaSsrKXsKLSAgICAgIGZHZXR0ZXJzLmFkZEVsZW1lbnQoZ2V0dGVycy5nZXQoaSkpOwotICAgICAgZlR5cGVzLmFkZEVsZW1lbnQodHlwZXMuZ2V0KGkpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJldHVyblBhcmVudEdldHRlcihpbnQgY291bnQpCi0gIHsKLSAgICBpZiAoZkdldHRlcnMgPT0gbnVsbCB8fCBjb3VudCA+IGZHZXR0ZXJzLnNpemUoKSkgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuIChTdHJpbmcpZkdldHRlcnMuZ2V0KGNvdW50KTsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyByZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKGludCBjb3VudCkKLSAgewotICAgIGlmIChmVHlwZXMgPT0gbnVsbCB8fCBjb3VudCA+IGZUeXBlcy5zaXplKCkpIHJldHVybiBudWxsOwotICAgIHJldHVybiAoU3RyaW5nKWZUeXBlcy5nZXQoY291bnQpOyAgCi0gIH0KLQotICBwcm90ZWN0ZWQgVmVjdG9yIHJldHVyblBhcmVudEdldHRlcigpCi0gIHsKLSAgICBpZiAoZkdldHRlcnMgPT0gbnVsbCApIHJldHVybiBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIGZHZXR0ZXJzOyAgCi0gIH0KLQotICBwcm90ZWN0ZWQgVmVjdG9yIHJldHVyblBhcmVudEdldHRlclR5cGUoKQotICB7Ci0gICAgaWYgKGZUeXBlcyA9PSBudWxsICkgcmV0dXJuIG5ldyBWZWN0b3IoKTsKLSAgICByZXR1cm4gZlR5cGVzOyAgCi0gIH0KLQotICBwcm90ZWN0ZWQgaW50IGdldHRlckNvdW50KCkKLSAgewotICAgIGlmKGZHZXR0ZXJzID09IG51bGwpIHJldHVybiAwOwotICAgIHJldHVybiBmR2V0dGVycy5zaXplKCk7IAotICB9Ci0KLQotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgc29tZSBzdGF0ZSBkYXRhIHRoYXQgaXMgaW1wb3J0YW50IGluIGdldHRpbmcgdGhlIAotICAqIFN0cmluZ3MgZm9yIGRpc3BsYXkgb2YgcmVzdWx0YW50IGJlYW5zCi0gICogQHJldHVybiBTdHJpbmcgdGhlIHN0cmluZyBvZiBnZXR0ZXJzIHRvIHRoaXMgcG9pbnQKLSAgKiBUaGUgaWRlYSBpcyB0aGF0IGJ5IHRoZSB0aW1lIHdlIGdldCB0byB0aGUgc2ltcGxlIHR5cGUKLSAgKiB3ZSBoYXZlIGdldEFkZHJlc3MoKS5nZXRTdHJlZXQoKS4uLi4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRHZXR0ZXJzKCkKLSAgewotICAgIHJldHVybiBmUGFyZW50R2V0dGVyczsKLSAgfQotICAKLSAgLyoKLSAgKiBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbiBieSB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICogQHBhcmFtIE9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24KLSAgKi8KLSAgcHVibGljIElTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgVHlwZUVsZW1lbnQgZWxlbWVudCA9IChUeXBlRWxlbWVudClvYmplY3Q7Ci0gICAgICAgICAgCi0gICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGVsZW1lbnQuZ2V0UHJvcGVydHlBc09iamVjdChUeXBlRWxlbWVudC5OT05fSU5TVEFOVElBQkxFKSkpCi0JICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAKLSAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaW1wbGVFbGVtZW50KSBmSXNTaW1wbGUgPSB0cnVlOwotICAgICBlbHNlIGZJc1NpbXBsZSA9IGZhbHNlOwotCi0gICAgIC8vdGhpcyBjb3VsZCBiZSBhIHN0YXRlbGVzc2JlYW4gbmVlZCB0byBrbm93Ci0gICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQmVhbkVsZW1lbnQgKXsKLSAgICAgICAgQmVhbkVsZW1lbnQgYmVhbiA9IChCZWFuRWxlbWVudCllbGVtZW50OwotICAgICAgICBpZiAoYmVhbi5pc1N0YXRlTGVzcygpKSBmU3RhdGVMZXNzQmVhbiA9IHRydWU7Ci0gICAgICAgIGlmIChiZWFuLmdldEF0dHJpYigpID09IEJlYW5FbGVtZW50LlJFQURPTkxZKSBmV3JpdGUgPSBmYWxzZTsKLSAgICAgfQotCi0KLQotICAgICAvL0NvbXBsZXggdHlwZSBzdXBwb3J0Ci0gICAgIC8vZmlyc3QgSSBuZWVkIHRvIGZpbmQgb3V0IGhvdyBtYW55IGxldmVscyBkZWVwCi0gICAgIGlmKGZMZXZlbHNEZWVwID09IC0xKXsKLSAgICAgICAgQXR0cmlidXRlVmlzaXRvciBhdHRyaWJ1dGVWaXNpdG9yID0gbmV3IEF0dHJpYnV0ZVZpc2l0b3IoKTsKLSAgICAgICAgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gbGR2YSA9IG5ldyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbigpOwotICAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnJ1bihlbGVtZW50LGxkdmEpOwotICAgICAgICBmTGV2ZWxzRGVlcCA9IGxkdmEuZ2V0TGV2ZWxzRGVlcCgpOwotICAgICAgICAvL2NoZWNrIG91dCB0aGUgZmllbGRzIAotICAgICAgICBGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcigpOwotICAgICAgICBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbiBsZHZhMiA9IG5ldyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbigpOwotICAgICAgICBmaWVsZFZpc2l0b3IucnVuKGVsZW1lbnQsbGR2YTIpOwotCi0gICAgICAgIGlmKGZMZXZlbHNEZWVwIDwgbGR2YTIuZ2V0TGV2ZWxzRGVlcCgpKWZMZXZlbHNEZWVwID0gbGR2YTIuZ2V0TGV2ZWxzRGVlcCgpOyAKLSAgICAgICAgZkxldmVsc0RlZXArKzsKLSAgICAgfSAKLSAgICAgZkNvbHNwYW4gPSBmTGV2ZWxzRGVlcCAtIGZDdXJyZW50TGV2ZWw7Ci0KLSAgICAgLy9pZiB3ZSBoYXZlIGEgcmV0dXJuIHBhcmFtIHdpdGggbm8gZ2V0dGVyIG1ha2Ugc3VyZSB3ZSBhcmUgb24gdGhlIAotICAgICAvL2F0dHJpYnV0ZSBhbmQgbm90IHRoZSBwYXJhbWV0ZXIgdGhlbiByZXR1cm4KLSAgICAgaWYoZ2V0UmV0dXJuUGFyYW0oKSAmJiAgZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkgaW5zdGFuY2VvZiBBdHRyaWJ1dGVFbGVtZW50VHlwZSAmJigoKEF0dHJpYnV0ZUVsZW1lbnRUeXBlKWVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpKS5nZXRHZXR0ZXJNZXRob2QoKSA9PSBudWxsKSApIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgIC8vQ29kZSBnZW4gZm9yIGFsbCBlbGVtZW50cwotICAgICBpZihmV3JpdGUpewotICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZkN1cnJlbnRMZXZlbDtpKyspewotICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQgV0lEVEg9XCI1JVwiPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgIH0KLSAgICAgICBmYnVmZmVyLmFwcGVuZCgiPFREIENPTFNQQU49XCIiICsgZkNvbHNwYW4gKyAiXCIgQUxJR049XCJMRUZUXCI+IiArIGVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpLmdldE5hbWUoKSArICI6PC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7ICAgCi0gICAgIH0KLSAgICAgaWYoZklzU2ltcGxlIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGVsZW1lbnQuZ2V0TmFtZSgpKSAKLSAgICAgICAgICAgICAgICB8fCAoZ2V0UmV0dXJuUGFyYW0oKSAmJiBmU3RhdGVMZXNzQmVhbikgCi0gICAgICAgICAgICAgICAgfHwgKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZShlbGVtZW50LmdldFR5cGVOYW1lKCkpKSl7Ci0gICAgICAgIGlmKGdldEluc3RhbmNlTmFtZSgpLmVxdWFscygiIikpewotICAgICAgICAgICBpZihmV3JpdGUpewotICAgICAgICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZShlbGVtZW50LmdldE5hbWUoKSxlbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKS5nZXRNVUlEKCkpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKGRhdGFUeXBlLmlucHV0Rm9ybShlbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKS5nZXRNVUlEKCkpKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgIGlmKGdldFJldHVyblBhcmFtKCkgJiYgKFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoZWxlbWVudC5nZXRUeXBlTmFtZSgpKSB8fCBmU3RhdGVMZXNzQmVhbikpewotICAgICAgICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZShlbGVtZW50LmdldFR5cGVOYW1lKCksZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TVVJRCgpKTsgIAotICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVOYW1lID0gInR5cGUiICsgZGF0YVR5cGUuZ2V0VW5pcXVlTmFtZSgpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArICBnZXRJbnN0YW5jZU5hbWUoKSArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIFN0cmluZyBhZnRlclN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOyAKLSAgICAgICAgICAgICBTdHJpbmcgdG1wU3RyaW5nID0gInRlYmVjZSI7Ci0gICAgICAgICAgICAgU3RyaW5nIHByZXZTdHJpbmcgPSBnZXRJbnN0YW5jZU5hbWUoKTsKLSAgICAgICAgICAgICBTdHJpbmcgbmV3VG1wU3RyaW5nID0gIiI7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBuZXdUbXBTdHJpbmcgPSB0bXBTdHJpbmcgKyBpOwotICAgICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQocmV0dXJuUGFyZW50R2V0dGVyVHlwZShpKSArICIgIiArIG5ld1RtcFN0cmluZyArICI9IiArIHByZXZTdHJpbmcgKyAiLiIgKyByZXR1cm5QYXJlbnRHZXR0ZXIoaSkgKyAiOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICAgIHByZXZTdHJpbmcgPSBuZXdUbXBTdHJpbmc7IAotICAgICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmKCIgKyBuZXdUbXBTdHJpbmcgKyAiICE9IG51bGwpeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICAgIGFmdGVyU3RyaW5nID0gbmV3VG1wU3RyaW5nOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChlbGVtZW50LmdldE5hbWUoKSArICIgIiArIHVuaXF1ZU5hbWUgKyAiID0gIiArIGFmdGVyU3RyaW5nICsgIi4iICsgKChBdHRyaWJ1dGVFbGVtZW50VHlwZSllbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKSkuZ2V0R2V0dGVyTWV0aG9kKCkrICI7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5UeXBlQ29udmVyc2lvbih1bmlxdWVOYW1lKSk7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIGVsc2V7IAotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArICBnZXRJbnN0YW5jZU5hbWUoKSArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIFN0cmluZyBhZnRlclN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOwotICAgICAgICAgICAgIFN0cmluZyB0bXBTdHJpbmcgPSAidGViZWNlIjsKLSAgICAgICAgICAgICBTdHJpbmcgcHJldlN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOwotICAgICAgICAgICAgIFN0cmluZyBuZXdUbXBTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPGdldHRlckNvdW50KCk7aSsrKXsKLSAgICAgICAgICAgICAgIG5ld1RtcFN0cmluZyA9IHRtcFN0cmluZyArIGk7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKGkpICsgIiAiICsgbmV3VG1wU3RyaW5nICsgIj0iICsgcHJldlN0cmluZyArICIuIiArIHJldHVyblBhcmVudEdldHRlcihpKSArICI7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgICAgcHJldlN0cmluZyA9IG5ld1RtcFN0cmluZzsgCi0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArIG5ld1RtcFN0cmluZyArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgICAgYWZ0ZXJTdHJpbmcgPSBuZXdUbXBTdHJpbmc7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCU9Iik7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoYWZ0ZXJTdHJpbmcgKyAiLiIgKyAoKEF0dHJpYnV0ZUVsZW1lbnRUeXBlKWVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpKS5nZXRHZXR0ZXJNZXRob2QoKSsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+Iik7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIik7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgCi0gICAgIH0KLSAgICAgICAgIAotICAgICAgLy9Ob3cgY2Fycnkgb24gZG93biB0aGUgcmVzdCBvZiB0aGUgYmVhbgotICAgICBlbHNlIHsKLSAgICAgICAgQXR0cmlidXRlVmlzaXRvciBhdHRyaWJ1dGVWaXNpdG9yID0gbmV3IEF0dHJpYnV0ZVZpc2l0b3IoKTsKLSAgICAgICAgYXR0cmlidXRlVmlzaXRvci5zZXRSZXNpZGVudFZlY3RvcjEocmV0dXJuUGFyZW50R2V0dGVyKCkpOwotICAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldFJlc2lkZW50VmVjdG9yMihyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkpOwotICAgICAgICBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcihmYnVmZmVyLChmQ3VycmVudExldmVsICsgMSksZkxldmVsc0RlZXApOwotICAgICAgICBpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3Iuc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7Ci0gICAgICAgIGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgICAgIGF0dHJpYnV0ZVZpc2l0b3IucnVuKGVsZW1lbnQsaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKTsKLSAgICAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAKLSAgICAgICAgLy9ub3cgZG8gZmllbGRzIHZlcnkgc2ltaWxhcgotICAgICAgICBGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcigpOwotICAgICAgICBmaWVsZFZpc2l0b3Iuc2V0UmVzaWRlbnRWZWN0b3IxKHJldHVyblBhcmVudEdldHRlcigpKTsKLSAgICAgICAgZmllbGRWaXNpdG9yLnNldFJlc2lkZW50VmVjdG9yMihyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkpOwotICAgICAgICBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMiA9IG5ldyBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IoZmJ1ZmZlciwoZkN1cnJlbnRMZXZlbCArIDEpLGZMZXZlbHNEZWVwKTsKLSAgICAgICAgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgICAgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgICAgIGZpZWxkVmlzaXRvci5ydW4oZWxlbWVudCxpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyKTsKLSAgICAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjIuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgCi0gICAgICAgIAotCi0gICAgIH0KLQotCi0gICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9MZXZlbHNEZWVwVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9MZXZlbHNEZWVwVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGY0Y2IxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uQXR0cmlidXRlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLkZpZWxkVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkF0dHJpYnV0ZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uCi0qICovCi1wdWJsaWMgY2xhc3MgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJpdmF0ZSBpbnQgZkxldmVsc0RlZXA7Ci0gIHByaXZhdGUgaW50IGZEZWVwZXN0TGV2ZWw7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBUaGlzIGlzIHRoZSBzdGFydGluZyBwb2ludAotICAqIAotICAqLwotICBwdWJsaWMgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gKCkKLSAgewotICAgIGZMZXZlbHNEZWVwID0gMDsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIFRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICogCi0gICovCi0gIHB1YmxpYyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbiAoaW50IGN1cnJlbnQsYm9vbGVhbiBpbmNyZW1lbnQpCi0gIHsKLSAgICBmTGV2ZWxzRGVlcCA9IGN1cnJlbnQ7Ci0gICAgaWYoaW5jcmVtZW50KSBmTGV2ZWxzRGVlcCsrOwotICAgIGZEZWVwZXN0TGV2ZWwgPSBmTGV2ZWxzRGVlcDsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHJlc2lkZW50KQotICB7Ci0gICAgLy9ub3RoaW5nIHRvIGJlIGRvbmUgYnV0IG11c3QgYmUgaW1wbGVtZW50ZWQKLSAgfQotCi0KLQotICAvKioKLSAgKiBUaGUgdmlzaXRvciB0aGF0IGNhbGxlZCB0aGlzIFZpc2l0b3JBY3Rpb24KLSAgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciB0aGF0IGNhbGxlZCB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoVmlzaXRvciB2aXNpdG9yKQotICB7Ci0gIH0KLQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxldmVsIG9mIG5lc3Rpbmcgd2l0aGluIHRoaXMgYmVhbgotICAqIEByZXR1cm4gaW50IHJldHVybnMgdGhlIGludCBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgbmVzdHMgb2YgdGhpcyBiZWFuCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0TGV2ZWxzRGVlcCgpCi0gIHsKLSAgICAgcmV0dXJuIGZEZWVwZXN0TGV2ZWw7Ci0gIH0KLSAKLQotICAvKioKLSAgKiBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbiBieSB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICogQHBhcmFtIE9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24KLSAgKi8KLSAgcHVibGljIElTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXR0cmlidXRlRWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgVHlwZUVsZW1lbnQpewotICAgICAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGx2ZGEgPSBuZXcgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24oZkxldmVsc0RlZXAsdHJ1ZSk7Ci0gICAgICAgICB0eXBlVmlzaXRvci5ydW4oZWxlbWVudCxsdmRhKTsKLQotICAgICAgICAgaWYgKGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpOyAKLSAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5FbGVtZW50ICYmICEoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oZWxlbWVudC5nZXROYW1lKCkpKSl7Ci0gICAgICAgICBBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgQXR0cmlidXRlVmlzaXRvcigpOwotICAgICAgICAgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gbHZkYSA9IG5ldyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbihmTGV2ZWxzRGVlcCxmYWxzZSk7Ci0gICAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnJ1bihlbGVtZW50LGx2ZGEpOwotICAgICAgICAgaWYgKGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpOyAKLSAgIAotICAgICAgICAgRmllbGRWaXNpdG9yIGZpZWxkVmlzaXRvciA9IG5ldyBGaWVsZFZpc2l0b3IoKTsKLSAgICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGx2ZGEyID0gbmV3IExldmVsc0RlZXBWaXNpdG9yQWN0aW9uKGZMZXZlbHNEZWVwLGZhbHNlKTsKLSAgICAgICAgIGZpZWxkVmlzaXRvci5ydW4oZWxlbWVudCxsdmRhMik7Ci0gICAgICAgICBpZiAobHZkYTIuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEyLmdldExldmVsc0RlZXAoKTsgCi0gICAKLSAgICAgIH0KLSAgICAgICAgIAotICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsgICAKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTWV0aG9kRmlsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTg5NzM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTWV0aG9kRmlsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uTWV0aG9kVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBNZXRob2RGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIE1ldGhvZEZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgU3RyaW5nIGZJbnB1dE5hbWU7Ci0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgTWV0aG9kRmlsZUdlbmVyYXRvciAoU3RyaW5nIGlucHV0cykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgZklucHV0TmFtZSA9IGlucHV0czsKLSAgfQotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gU3RyaW5nQnVmZmVyIGJ1ZmZlciB0byBhcHBlbmQgY29kZWdlbiAKLSAgKi8KLSAgcHVibGljIE1ldGhvZEZpbGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIsU3RyaW5nIGlucHV0cykKLSAgewotICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgZklucHV0TmFtZSA9IGlucHV0czsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWVzKFN0cmluZyBpbnB1dHMpCi0gIHsKLSAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICB9Ci0KLSAgLy9wdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBVE9SID0gIkxvY2F0b3IiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBCRUFOID0gIlByb3h5IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgR0VUID0gImdldCI7Ci0KLSAgCi0gIC8vdGFrZXMgaW4gYSBiZWFuIG5vZGUKLSAgcHVibGljIElTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gICB7Ci0gICAgICBFbGVtZW50IGJlYW5FbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlQHBhZ2UgY29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiJT4iKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8SEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8VElUTEU+TWV0aG9kczwvVElUTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPC9IRUFEPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxIMT5NZXRob2RzPC9IMT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8VUw+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IE1ldGhvZFZpc2l0b3IoKTsKLSAgICAgIE1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yIG1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yID0gbmV3IE1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yKGZidWZmZXIsZklucHV0TmFtZSk7IAotICAgICAgbWV0aG9kVmlzaXRvci5ydW4oYmVhbkVsZW1lbnQsbWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IpOwotICAgICAgZmJ1ZmZlciA9IG1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVUw+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjwvSFRNTD4iKTsKLSAgICAgIAotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmZjVmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTWV0aG9kRmlsZWdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RGaWxlSGVscEdlbmVyYXRvciBleHRlbmRzIE1ldGhvZEZpbGVHZW5lcmF0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqCi0gICovCi0gIHB1YmxpYyBNZXRob2RGaWxlSGVscEdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcixTdHJpbmcgaW5wdXROYW1lKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIsaW5wdXROYW1lKTsKLSAgfQotCi0KLSAgLy90YWtlcyBpbiBhIE1ldGhvZCBub2RlCi0gIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgICBNZXRob2RFbGVtZW50IG1ldGhvZCA9IChNZXRob2RFbGVtZW50KW1ldGhvZEVsZW1lbnQ7Ci0gICAgICBpZiAobWV0aG9kLmdldE1ldGhvZE9tbWlzc2lvbigpKSByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxMST48QSBIUkVGPVwiIiArIGZJbnB1dE5hbWUgKyAiP21ldGhvZD0iICsgbWV0aG9kLmdldE51bWJlcklEKCkpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIlwiIFRBUkdFVD1cImlucHV0c1wiPiAiICsgbWV0aG9kLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvQT48L0xJPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhlNTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDYxMiAgIDE0NTQzMyBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5UeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5BdHRyaWJ1dGVFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgZXh0ZW5kcyBSZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwcml2YXRlIFZlY3RvciBmU2V0dGVyVmVjdG9yOyAKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYnVmZmVyIFN0cmluZ0J1ZmZlciBvYmplY3QgdGhhdCB0aGlzIGNvZGUgZ2VuZXJhdG9yIHdyaXRlcyB0byAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgICAKLSAgfQotICAKLSAgLyoqCi0gICogU2V0dGVyIHZlY3RvcgotICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFNldHRlclZlY3RvcigpCi0gIHsKLSAgICAgIHJldHVybiBmU2V0dGVyVmVjdG9yOwotICB9Ci0gIAotCi0gIC8qKgotICAqIFZpc2l0IE1ldGhvZCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhpcyBWaXNpdG9yCi0gICogQHBhcmFtIFBhcmFtZXRlciBwYXJhbWV0ZXIgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCAKLSAgKi8KLSAgcHVibGljIElTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgQXR0cmlidXRlRWxlbWVudFR5cGUgYXR0cmlidXRlRWxlbWVudFR5cGUgPSAoQXR0cmlidXRlRWxlbWVudFR5cGUpb2JqZWN0OwotICAgICBpZihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRTZXR0ZXJNZXRob2QoKSA9PSBudWxsKSByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgQmFzaWNFbGVtZW50IGVsZW1lbnQgPSAoQmFzaWNFbGVtZW50KW9iamVjdDsKLSAgICAgaWYoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5pc1NpbXBsZSgpIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpKSl7ICAgICAgCi0gICAgICAgIC8vc3RhcnQgdGhlIGNvZGVnZW4KLSAgICAgICAgLy9hc2sgdGhlIGRhdGF0eXBlIGZvciBpdHMgcmVxdWVzdCBsaW5lLCBpdCBtYXkgbmVlZCBtYXJrIHVwIG9yIG5vdC4KLSAgICAgICAgLy9pZSBGb3IgdGhlIHNpbXBsZSB0eXBlcyB3ZSBuZWVkIHRoZSBtYXJrIHVwCi0gICAgICAgIC8vZm9yIHRoZSBkb20gZWxlbWVudCB3ZSBjYW50IHVzZSBpdC4KLSAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGVUeXBlKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLGVsZW1lbnQuZ2V0TVVJRCgpKTsKLSAgICAgICAgc2V0VHlwZU93bmVySWQoaWROYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKSk7IAotICAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5nZXRSZXF1ZXN0Q29kZShlbGVtZW50LmdldE1VSUQoKSxnZXRUeXBlT3duZXJJZCgpKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgIH0KLSAgICAgCi0gICAgIFR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IFR5cGVWaXNpdG9yKCk7Ci0gICAgIFJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yIHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yID0gbmV3IFJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yKGZidWZmZXIpOwotICAgICByZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5zZXROdW1iZXJGYWN0b3J5KGdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgIHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLnNldFR5cGVPd25lcklkKGdldFR5cGVPd25lcklkKCkpOwotICAgICAKLSAgICAgdHlwZVZpc2l0b3IucnVuKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yKTsKLSAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5nZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICBWZWN0b3Igc2V0dGVySW5wdXRzID0gcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuZ2V0UmVzaWRlbnRWZWN0b3IoKTsgCi0gICAgIHB1dFJlc2lkZW50VmVjdG9yKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFNldHRlclNpZ25hdHVyZSgoU3RyaW5nKXNldHRlcklucHV0cy5maXJzdEVsZW1lbnQoKSkpOwotICAgICAKLSAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0gICAKLQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDI3NzIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyMyAgIDE0MjI5NiBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTWV0aG9kRmlsZWdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRGaWxlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIAotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBUUklQTEVfVEFCID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBHZW5lcmF0b3IuVEFCOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUVVBRF9UQUIgPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIEdlbmVyYXRvci5ET1VCTEVfVEFCOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBSZXN1bHRGaWxlR2VuZXJhdG9yICgpCi0gIHsKLSAgICAgIHN1cGVyKCk7Ci0gIH0KLQotICAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBSZXN1bHRGaWxlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICB9Ci0KLSAgLy90YWtlcyBpbiBhIGJlYW4gbm9kZQotICBwdWJsaWMgSVN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICAgRWxlbWVudCBiZWFuRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIEJlYW5FbGVtZW50IGJlYW4gPSAoQmVhbkVsZW1lbnQpYmVhbkVsZW1lbnQ7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCVAcGFnZSBjb250ZW50VHlwZT1cInRleHQvaHRtbDtjaGFyc2V0PVVURi04XCIlPiIrIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIHJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoXCJVVEYtOFwiKTsgJT4iKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEhFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUSVRMRT5SZXN1bHQ8L1RJVExFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SDE+UmVzdWx0PC9IMT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPGpzcDp1c2VCZWFuIGlkPVwiIisgZ2V0U2Vzc2lvbkJlYW5JZCgpICsgIlwiIHNjb3BlPVwic2Vzc2lvblwiIGNsYXNzPVwiIik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZChiZWFuLmdldE5hbWUoKSArICJcIiAvPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGlmIChzZXRFbmRwb2ludE1ldGhvZCAhPSBudWxsICYmIHNldEVuZHBvaW50TWV0aG9kLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIik7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiZW5kcG9pbnRcIikgIT0gbnVsbCAmJiByZXF1ZXN0LmdldFBhcmFtZXRlcihcImVuZHBvaW50XCIpLmxlbmd0aCgpID4gMCkiKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKGdldFNlc3Npb25CZWFuSWQoKSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIuIik7Ci0gICAgICAgIGludCBpbmRleCA9IHNldEVuZHBvaW50TWV0aG9kLmluZGV4T2YoJz8nKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2Quc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIihuZXcgIik7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2Quc3Vic3RyaW5nKGluZGV4KzEsIHNldEVuZHBvaW50TWV0aG9kLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIihyZXF1ZXN0LmdldFBhcmFtZXRlcihcImVuZHBvaW50XCIpKSk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2QpOwotICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCIocmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJlbmRwb2ludFwiKSk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIH0KLSAgICAgIGZidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAKLSAgICAgICAgICAgIAotICAgICAgLy9jYXJyeSBvbiB3aXRoIHJlZ3VsYXIgZ29ycAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIlN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihcIm1ldGhvZFwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaW50IG1ldGhvZElEID0gMDsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKG1ldGhvZCA9PSBudWxsKSBtZXRob2RJRCA9IC0xOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJpZihtZXRob2RJRCAhPSAtMSkgbWV0aG9kSUQgPSBJbnRlZ2VyLnBhcnNlSW50KG1ldGhvZCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJib29sZWFuIGdvdE1ldGhvZCA9IGZhbHNlOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ0cnkgeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJzd2l0Y2ggKG1ldGhvZElEKXsgIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgIAotICAgICAgLy8gZ28gdG8gdGhlIG5leHQgZ2VuZXJhdG9yCi0gICAgICBNZXRob2RWaXNpdG9yIG1ldGhvZFZpc2l0b3IgPSBuZXcgTWV0aG9kVmlzaXRvcigpOwotICAgICAgUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yIHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvciA9IG5ldyBSZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IoZmJ1ZmZlcik7IAotICAgICAgcmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgIHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5zZXRDbGllbnRGb2xkZXJQYXRoKGdldENsaWVudEZvbGRlclBhdGgoKSk7Ci0gICAgICBtZXRob2RWaXNpdG9yLnJ1bihiZWFuRWxlbWVudCxyZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IpOwotICAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IuZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLQotICAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgICAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiZXhjZXB0aW9uOiA8JT0gZSAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJyZXR1cm47IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIWdvdE1ldGhvZCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInJlc3VsdDogTi9BIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hUTUw+Iik7Ci0KLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNldEVuZHBvaW50TWV0aG9kIFRoZSBzZXRFbmRwb2ludE1ldGhvZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXRFbmRwb2ludE1ldGhvZChTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2QpCi0gIHsKLSAgICB0aGlzLnNldEVuZHBvaW50TWV0aG9kID0gc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmQzOGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uUGFyYW1ldGVyVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlJldHVyblBhcmFtZXRlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvciBleHRlbmRzIFJlc3VsdEZpbGVHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1NUQVRFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfU1RBVEUgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVEVNUCA9ICJtdGVtcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJFQU4gPSAiUHJveHkiOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIGJ1ZmZlciBTdHJpbmdCdWZmZXIgb2JqZWN0IHRoYXQgdGhpcyBjb2RlIGdlbmVyYXRvciB3cml0ZXMgdG8gCi0gICovCi0gIHB1YmxpYyBSZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7ICAgIAotICB9Ci0gIAotICAvKioKLSAgKiBWaXNpdCBNZXRob2QgZ2VuZXJhdGVzIGNvZGUgZm9yIHRoaXMgVmlzaXRvcgotICAqIEBwYXJhbSBtZXRob2QgbWV0aG9kIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIAotICAqLwotICBwdWJsaWMgSVN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gIAotCi0gICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kID0gKE1ldGhvZEVsZW1lbnQpbWV0aG9kRWxlbWVudDsKLSAgICAgaWYgKG1ldGhvZC5nZXRNZXRob2RPbW1pc3Npb24oKSkgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgZmJ1ZmZlci5hcHBlbmQoImNhc2UgIiArIG1ldGhvZC5nZXROdW1iZXJJRCgpKyAiOiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgdmlzaXRIZWxwZXIobWV0aG9kKTsKLSAgICAgCi0gICAgIGZidWZmZXIuYXBwZW5kKCJicmVhazsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7IAotICAKLSAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0gICAKLSAgLyoqCi0gICogSGVscHMgb3V0IHRoZSB2aXNpdG9yCi0gICogQHBhcmFtIG1ldGhvZCBtZXRob2QgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0SGVscGVyIChFbGVtZW50IG1ldGhvZEVsZW1lbnQpCi0gIHsKLQotICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJnb3RNZXRob2QgPSB0cnVlOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgCi0gICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kID0gKE1ldGhvZEVsZW1lbnQpbWV0aG9kRWxlbWVudDsKLSAgICAgLy8gZ28gdG8gdGhlIG5leHQgZ2VuZXJhdG9yCi0gICAgIFJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvciByZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgPSBuZXcgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yKGZidWZmZXIpOyAKLSAgICAgcmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgUGFyYW1ldGVyVmlzaXRvciBwYXJhbWV0ZXJWaXNpdG9yID0gbmV3IFBhcmFtZXRlclZpc2l0b3IoKTsKLSAgICAgcGFyYW1ldGVyVmlzaXRvci5ydW4obWV0aG9kRWxlbWVudCxyZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IpOwotICAgICBmYnVmZmVyID0gcmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvci5nZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICAvLyB3ZSBtdXN0IG5vdyBncmFiIHRoZSBzdGF0ZSBkYXRhIGZyb20gdGhlIHJlc2lkZW50IHZlY3RvcgotICAgICBzZXRSZXNpZGVudFZlY3RvcihyZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IuZ2V0UmVzaWRlbnRWZWN0b3IoKSk7Ci0KLSAgICAgCi0gICAgIC8vdGhlcmUgaXMgbm8gcmV0dXJuIHR5cGUgaWYgdm9pZCBvY2N1cnMgICAgCi0gICAgCi0gICAgIAotICAgICBpZiAobWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBnZXRTZXNzaW9uQmVhbklkKCkgKyAiLiIgK21ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotCi0gICAgIGVsc2V7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSArIEdlbmVyYXRvci5TUEFDRSArIG1ldGhvZC5nZXRNVUlEKCkgKyBNVEVNUCArIEdlbmVyYXRvci5TUEFDRSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCI9IiArIEdlbmVyYXRvci5TUEFDRSArIGdldFNlc3Npb25CZWFuSWQoKSArICIuIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotICAgICB9Ci0KLSAgICAgRW51bWVyYXRpb24gZSA9IGZSZXNpZGVudFZlY3Rvci5lbGVtZW50cygpOwotICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgIGlmIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiLCIpOyAgICAKLSAgICAgfQotICAgICBmYnVmZmVyLmFwcGVuZCgiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGlmICghbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSAmJiAhbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmlzUHJpbWl0aXZlKCkpewotICAgICAgICAvL2luIGNhc2Ugb3VyIHJlc3VsdCBpcyBudWxsCi0gICAgICAgIGZidWZmZXIuYXBwZW5kKCJpZigiICsgbWV0aG9kLmdldE1VSUQoKSArICJtdGVtcCA9PSBudWxsKXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlPSIgKyBtZXRob2QuZ2V0TVVJRCgpICsgIm10ZW1wICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCJ9ZWxzZXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIH0KLSAgICAgCi0gICAgIC8vbm93IGxldHMgZGlzcGxheSB0aGUgcmV0dXJuIGJlYW4KLSAgICAgLy8gaWYgaXQgaXMgc2ltcGxlIHdlIGRvbnQgbmVlZCB0byB1c2UgdGhlIGdlbmVyYXRvcgotICAgICAKLSAgICAgaWYgKCFtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKXsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5pc1NpbXBsZSgpIAotICAgICAgICAgICB8fCBUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpKQotICAgICAgICAgICB8fCBUeXBlRmFjdG9yeS5pc1N0YXRlTGVzc0JlYW4obWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldFR5cGVOYW1lKCkpCi0gICAgICAgICAgIHx8IFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUobWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldFR5cGVOYW1lKCkpKXsKLSAgICAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGVUeXBlKG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5nZXRUeXBlTmFtZSgpLG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0TVVJRCgpKTsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoZGF0YVR5cGUuVHlwZUNvbnZlcnNpb24obWV0aG9kLmdldE1VSUQoKSArIE1URU1QKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvciBpbnB1dEZpbGVIZWxwMkdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvcihmYnVmZmVyKTsKLSAgICAgICAgICAgaW5wdXRGaWxlSGVscDJHZW5lcmF0b3Iuc2V0SW5zdGFuY2VOYW1lKG1ldGhvZC5nZXRNVUlEKCkgKyBNVEVNUCk7Ci0gICAgICAgICAgIGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yLnNldFJldHVyblBhcmFtKHRydWUpOwotICAgICAgICAgICBSZXR1cm5QYXJhbWV0ZXJWaXNpdG9yIHJldHVyblBhcmFtZXRlclZpc2l0b3IgPSBuZXcgUmV0dXJuUGFyYW1ldGVyVmlzaXRvcigpOwotICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLnJ1bihtZXRob2QsaW5wdXRGaWxlSGVscDJHZW5lcmF0b3IpOwotICAgICAgICAgICBmYnVmZmVyID0gaW5wdXRGaWxlSGVscDJHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgICB9Ci0gICAgIH0KLQotICAgIGlmICghbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSAgJiYgIW1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5pc1ByaW1pdGl2ZSgpKSBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgICAgCi0gICAgCi0gIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQyODVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuUGFyYW1ldGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlSGVscDJnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHJpdmF0ZSBTdHJpbmcgZlR5cGVPd25lcklkOyAgCi0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYnVmZmVyIFN0cmluZ0J1ZmZlciBvYmplY3QgdGhhdCB0aGlzIGNvZGUgZ2VuZXJhdG9yIHdyaXRlcyB0byAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgIAotICB9Ci0gIAotICAvKioKLSAgKiBWaXNpdCBNZXRob2QgZ2VuZXJhdGVzIGNvZGUgZm9yIHRoaXMgVmlzaXRvcgotICAqIEBwYXJhbSBQYXJhbWV0ZXIgcGFyYW1ldGVyIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgCi0KLSAgICAgUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gKFBhcmFtZXRlckVsZW1lbnQpb2JqZWN0OwotICAgICBwYXJhbWV0ZXJFbGVtZW50LmdldFR5cGVFbGVtZW50KCk7IAotICAgICBpZihwYXJhbWV0ZXJFbGVtZW50LmdldFR5cGVFbGVtZW50KCkuaXNTaW1wbGUoKSB8fCBUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihwYXJhbWV0ZXJFbGVtZW50LmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpKSl7ICAgICAgCi0gICAgICAgIC8vc3RhcnQgdGhlIGNvZGVnZW4KLSAgICAgICAgIC8vYXNrIHRoZSBkYXRhdHlwZSBmb3IgaXRzIHJlcXVlc3QgbGluZSwgaXQgbWF5IG5lZWQgbWFyayB1cCBvciBub3QuCi0gICAgICAgIC8vaWUgRm9yIHRoZSBzaW1wbGUgdHlwZXMgd2UgbmVlZCB0aGUgbWFyayB1cAotICAgICAgICAvL2ZvciB0aGUgZG9tIGVsZW1lbnQgd2UgY2FudCB1c2UgaXQuCi0gICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZShwYXJhbWV0ZXJFbGVtZW50LmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLHBhcmFtZXRlckVsZW1lbnQuZ2V0TVVJRCgpKTsKLSAgICAgICAgc2V0VHlwZU93bmVySWQoaWROYW1lKHBhcmFtZXRlckVsZW1lbnQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKGRhdGFUeXBlLmdldFJlcXVlc3RDb2RlKHBhcmFtZXRlckVsZW1lbnQuZ2V0TVVJRCgpLGdldFR5cGVPd25lcklkKCkpKTsKLSAgICAgfQotICAgICAgICAgCi0gICAgIC8vdmlzaXQgdGhlIHR5cGUgZ2VuZXJhdG9yCi0gICAgIFJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yIHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yID0gbmV3IFJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yKGZidWZmZXIpOyAKLSAgICAgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0TnVtYmVyRmFjdG9yeShnZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICByZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5zZXRUeXBlT3duZXJJZChnZXRUeXBlT3duZXJJZCgpKTsKLSAgICAgVHlwZVZpc2l0b3IgVHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgVHlwZVZpc2l0b3IucnVuKHBhcmFtZXRlckVsZW1lbnQscmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IpOwotICAgICBmYnVmZmVyID0gcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgIHNldE51bWJlckZhY3RvcnkocmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldFJlc2lkZW50VmVjdG9yKCkuZmlyc3RFbGVtZW50KCk7Ci0gICAgIHB1dFJlc2lkZW50VmVjdG9yKG5hbWUpOyAKLSAgICAgCi0gICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVPd25lcklkKCkKLSAgewotICAgICBpZiAoZlR5cGVPd25lcklkID09IG51bGwpIGZUeXBlT3duZXJJZCA9ICIiOyAKLSAgICAgcmV0dXJuIGZUeXBlT3duZXJJZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVPd25lcklkKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlR5cGVPd25lcklkID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgaWROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gIAkKLSAgICBTdHJpbmcgdW5pcXVlTnVtID0gU3RyaW5nLnZhbHVlT2YoZ2V0VW5pcXVlTnVtYmVyKCkpOwotICAgIFN0cmluZyBuZXdOYW1lID0gbmFtZS5yZXBsYWNlKCcuJywnMScpICsgIl8iICt1bmlxdWVOdW0gKyAiaWQiOwotICAgIHJldHVybiBuZXdOYW1lOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWE2ODg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwNDEwICAgMTgwOTUyIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBTYW1wbGUgSlNQIGdlbmVyYXRvciBjaG9rZXMgb24gaW50ZXJmYWNlcyBhbmQgYWJzdHJhY3QgY2xhc3NlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5BdHRyaWJ1dGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uRmllbGRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlSGVscDJnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgZXh0ZW5kcyBSZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZlR5cGVJZE5hbWU7Ci0gCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBidWZmZXIgU3RyaW5nQnVmZmVyIG9iamVjdCB0aGF0IHRoaXMgY29kZSBnZW5lcmF0b3Igd3JpdGVzIHRvIAotICAqLwotICBwdWJsaWMgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFZpc2l0IE1ldGhvZCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhpcyBWaXNpdG9yCi0gICogQHBhcmFtIFBhcmFtZXRlciBwYXJhbWV0ZXIgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCAKLSAgKi8KLSAgcHVibGljIElTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgRWxlbWVudCB0eXBlRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgVHlwZUVsZW1lbnQgdHlwZSA9IChUeXBlRWxlbWVudCl0eXBlRWxlbWVudDsgICAgICAKLSAgICAgLy8gcmlnaHQgbm93IHdlIG9ubHkgaGF2ZSBzaW1wbGUgdG8gd29ycnkgYWJvdXQKLSAgICAgaWYodHlwZS5pc1NpbXBsZSgpIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKHR5cGUuZ2V0TmFtZSgpKSl7Ci0gICAgICAgLy8gY3JlYXRlIHRoZSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgc2ltcGxlIHR5cGUgbmFtZQotICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZSh0eXBlLmdldE5hbWUoKSx0eXBlLmdldE93bmluZ0VsZW1lbnQoKS5nZXRNVUlEKCkpOwotICAKLSAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBnZXRUeXBlT3duZXJJZCgpKyAiVGVtcCI7Ci0gICAgICAgZmJ1ZmZlci5hcHBlbmQoZGF0YVR5cGUuc3RyaW5nQ29udmVyc2lvbih0eXBlLmdldE5hbWUoKSxub2RlTmFtZSxnZXRUeXBlT3duZXJJZCgpKSk7Ci0KLSAgICAgICBwdXRSZXNpZGVudFZlY3Rvcihub2RlTmFtZSk7Ci0gICAgIH0KLQotICAgICBlbHNlIHsKLSAgICAgICAvL211c3QgYmUgY29tcGxleAotICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IHR5cGVFbGVtZW50LmdldE5hbWUoKTsgCi0gICAgICAgZlR5cGVJZE5hbWUgPSBpZE5hbWUodHlwZU5hbWUpOwotICAgICAgICAgICAgICAKLSAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHModHlwZUVsZW1lbnQuZ2V0UHJvcGVydHlBc09iamVjdChUeXBlRWxlbWVudC5OT05fSU5TVEFOVElBQkxFKSkpIHsKLSAgICAgICAKLQkgICAgICAgQXR0cmlidXRlVmlzaXRvciBhdHRyaWJ1dGVWaXNpdG9yID0gbmV3IEF0dHJpYnV0ZVZpc2l0b3IoKTsKLQkgICAgICAgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvciByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yID0gbmV3IFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IoZmJ1ZmZlcik7Ci0JICAgICAgIHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3Iuc2V0TnVtYmVyRmFjdG9yeShnZXROdW1iZXJGYWN0b3J5KCkpOwotCSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnJ1bih0eXBlRWxlbWVudCxyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKTsKLQkgICAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmdldE51bWJlckZhY3RvcnkoKSk7Ci0JICAgICAgIGZidWZmZXIgPSByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotCQotCSAgICAgICBGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcigpOwotCSAgICAgICBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyID0gbmV3IFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IoZmJ1ZmZlcik7Ci0JICAgICAgIHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLQkgICAgICAgZmllbGRWaXNpdG9yLnJ1bih0eXBlRWxlbWVudCxyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMik7Ci0JICAgICAgIHNldE51bWJlckZhY3RvcnkocmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjIuZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLQkgICAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLmdldFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAKLQkgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0JICAgICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjxqc3A6dXNlQmVhbiBpZD1cIiIgKyBmVHlwZUlkTmFtZSArICJcIiBzY29wZT1cInNlc3Npb25cIiBjbGFzcz1cIiIgKyB0eXBlTmFtZSArICJcIiAvPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQkgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0JICAgICAgIAotCSAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5nZXRSZXNpZGVudFZlY3RvcigpLmVsZW1lbnRzKCk7Ci0JICAgICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpewotCSAgICAgICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArIGZUeXBlSWROYW1lICsgIi4iICsgZS5uZXh0RWxlbWVudCgpICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0JICAgICAgIH0KLQkKLQkgICAgICAgRW51bWVyYXRpb24gZTIgPSByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5nZXRSZXNpZGVudFZlY3RvcigpLmVsZW1lbnRzKCk7Ci0JICAgICAgIHdoaWxlKGUyLmhhc01vcmVFbGVtZW50cygpKXsKLQkgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBmVHlwZUlkTmFtZSArICIuIiArIGUyLm5leHRFbGVtZW50KCkgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQkgICAgICAgfSAKLQkgICB9Ci0gICAgICAgZWxzZQotICAgIAkgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArIHR5cGVOYW1lICsgIiAiICsgZlR5cGVJZE5hbWUgKyAiID0gbnVsbDsiKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgICAgIAotICAgICAgIAotICAgICAgIHB1dFJlc2lkZW50VmVjdG9yKGZUeXBlSWROYW1lKTsKLSAgICAgICAvL2VuZCBvZiBjaGFuZ2VzCi0gICAgIAotICAgIH0KLSAgICAgCi0gICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9ICAgCi0gIAotCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9UZXN0Q2xpZW50RmlsZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9UZXN0Q2xpZW50RmlsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZlNDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vVGVzdENsaWVudEZpbGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgVGVzdENsaWVudEZpbGVnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudEZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBTdHJpbmcgZk1ldGhvZE5hbWU7Ci0gIHB1YmxpYyBTdHJpbmcgZklucHV0TmFtZTsKLSAgcHVibGljIFN0cmluZyBmUmVzdWx0TmFtZTsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqCi0gICovCi0gIHB1YmxpYyBUZXN0Q2xpZW50RmlsZUdlbmVyYXRvciAoU3RyaW5nIGlucHV0cywgU3RyaW5nIG1ldGhvZHMsIFN0cmluZyByZXN1bHRzKQotICB7Ci0gICAgIHN1cGVyKCk7Ci0gICAgIGZJbnB1dE5hbWUgPSBpbnB1dHM7Ci0gICAgIGZNZXRob2ROYW1lID0gbWV0aG9kczsKLSAgICAgZlJlc3VsdE5hbWUgPSByZXN1bHRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWVzKFN0cmluZyBpbnB1dHMsIFN0cmluZyBtZXRob2RzLCBTdHJpbmcgcmVzdWx0cykKLSAgewotICAgIGZJbnB1dE5hbWUgPSBpbnB1dHM7Ci0gICAgZk1ldGhvZE5hbWUgPSBtZXRob2RzOwotICAgIGZSZXN1bHROYW1lID0gcmVzdWx0czsKLSAgfQotCi0gIC8vdGFrZXMgaW4gYSBiZWFuIG5vZGUKLSAgIHB1YmxpYyBJU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICAgewotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlQHBhZ2UgY29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiJT4iKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEhFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUSVRMRT5XZWIgU2VydmljZXMgVGVzdCBDbGllbnQ8L1RJVExFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiIik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZSQU1FU0VUICBDT0xTPVwiMjIwLCpcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZSQU1FIFNSQz1cIiIrIGZNZXRob2ROYW1lICsgIlwiIE5BTUU9XCJtZXRob2RzXCIgTUFSR0lOV0lEVEg9XCIxXCIgTUFSR0lOSEVJR0hUPVwiMVwiIFNDUk9MTElORz1cInllc1wiIEZSQU1FQk9SREVSPVwiMVwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8RlJBTUVTRVQgIFJPV1M9XCI4MCUsMjAlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGUkFNRSBTUkM9XCIiKyBmSW5wdXROYW1lICArICJcIiBOQU1FPVwiaW5wdXRzXCIgIE1BUkdJTldJRFRIPVwiMVwiIE1BUkdJTkhFSUdIVD1cIjFcIiBTQ1JPTExJTkc9XCJ5ZXNcIiBGUkFNRUJPUkRFUj1cIjFcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiU3RyaW5nQnVmZmVyIHJlc3VsdEpTUCA9IG5ldyBTdHJpbmdCdWZmZXIoXCIiKS5hcHBlbmQoZlJlc3VsdE5hbWUpLmFwcGVuZCgiXCIpOyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJyZXN1bHRKU1AuYXBwZW5kKFwiP1wiKTsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiamF2YS51dGlsLkVudW1lcmF0aW9uIHJlc3VsdEVudW0gPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Iik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgid2hpbGUgKHJlc3VsdEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiT2JqZWN0IHJlc3VsdE9iaiA9IHJlc3VsdEVudW0ubmV4dEVsZW1lbnQoKTsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgicmVzdWx0SlNQLmFwcGVuZChyZXN1bHRPYmoudG9TdHJpbmcoKSkuYXBwZW5kKFwiPVwiKS5hcHBlbmQocmVxdWVzdC5nZXRQYXJhbWV0ZXIocmVzdWx0T2JqLnRvU3RyaW5nKCkpKS5hcHBlbmQoXCImXCIpOyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IikuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IikuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGUkFNRSBTUkM9XCI8JT1yZXN1bHRKU1AudG9TdHJpbmcoKSU+XCIgTkFNRT1cInJlc3VsdFwiICBNQVJHSU5XSURUSD1cIjFcIiBNQVJHSU5IRUlHSFQ9XCIxXCIgU0NST0xMSU5HPVwieWVzXCIgRlJBTUVCT1JERVI9XCIxXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvRlJBTUVTRVQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8Tk9GUkFNRVM+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJUaGUgV2ViIFNlcnZpY2VzIFRlc3QgQ2xpZW50IHJlcXVpcmVzIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIGZyYW1lcy4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L05PRlJBTUVTPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0ZSQU1FU0VUPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hUTUw+Iik7Ci0KLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0dlbmVyYXRlUGFnZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvR2VuZXJhdGVQYWdlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU2Zjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvR2VuZXJhdGVQYWdlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLQotLyoqCi0gKiBNb2ZUb0JlYW5Nb2RlbENvbW1hbmQKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgMTI6NDE6NDggUE0pCi0gKiBAYXV0aG9yOiBHaWxiZXJ0IEFuZHJld3MKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlUGFnZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLQkJCi1wcml2YXRlIE1vZGVsIG1vZGVsXzsKLXByaXZhdGUgR2VuZXJhdG9yIGZHZW5lcmF0b3I7Ci1wcml2YXRlIElGaWxlIGZJRmlsZTsKLXByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dF87Ci1wcml2YXRlIFN0cmluZ0J1ZmZlciBmU3RyaW5nQnVmZmVyOwotCi0vKioKLSAqIEJ1aWxkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBHZW5lcmF0ZVBhZ2VDb21tYW5kKCkKLXsKLX0KLQotLyoqCi0qIENvbnN0cnVjdG9yCi0qIFRoaXMgY29tbWFuZCB3aWxsIGdlbmVyYXRlIGNvZGUgZnJvbSBhIE1vZGVsCi0qIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdG8gYmUgdHJhdmVyc2VkCi0qIEBwYXJhbSBnZW5lcmF0b3IgVGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGJlIHVzZWQKLSogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0byBwbGFjZSB0aGUgZmluaXNoZWQgcHJvZHVjdAotKi8KLXB1YmxpYyBHZW5lcmF0ZVBhZ2VDb21tYW5kKFJlc291cmNlQ29udGV4dCBjb250ZXh0LCBNb2RlbCBtb2RlbCwgR2VuZXJhdG9yIGdlbmVyYXRvciwgSUZpbGUgZmlsZSkKLXsKLSAgbW9kZWxfID0gbW9kZWw7Ci0gIGZHZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0gIGZJRmlsZSA9IGZpbGU7Ci0gIHJlc291cmNlQ29udGV4dF8gPSBjb250ZXh0OwotfQotCi1wdWJsaWMgTW9kZWwgZ2V0SmF2YURhdGFNb2RlbCgpCi17Ci0gIHJldHVybiBtb2RlbF87Ci19Ci0KLS8qKgotICoKLSAqLwotcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi17Ci0gIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAKLSAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICB0cnkgewotICAgIGZHZW5lcmF0b3IudmlzaXQobW9kZWxfLmdldFJvb3RFbGVtZW50KCkpOwotICAgIGZTdHJpbmdCdWZmZXIgPSBmR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZyB0ZW1wU3RyaW5nID0gZlN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICAgIE91dHB1dFN0cmVhbSBmaWxlUmVzb3VyY2UgPSBGaWxlUmVzb3VyY2VVdGlscy5uZXdGaWxlT3V0cHV0U3RyZWFtKHJlc291cmNlQ29udGV4dF8sIGZJRmlsZS5nZXRGdWxsUGF0aCgpLCBtb25pdG9yLCBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLSAgICAvL1ByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGZpbGVSZXNvdXJjZSk7Ci0gICAgLy9wcy5wcmludCh0ZW1wU3RyaW5nKTsKLSAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmaWxlUmVzb3VyY2UsIlVURi04Iik7Ci0gICAgb3N3LndyaXRlKHRlbXBTdHJpbmcsMCxmU3RyaW5nQnVmZmVyLmxlbmd0aCgpKTsgIAotICAgIG9zdy5jbG9zZSgpOwotICAgIGZpbGVSZXNvdXJjZS5jbG9zZSgpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXhjKSB7Ci0gIAlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggaW9leGMgKTsKLSAgCXJldHVybiBzdGF0dXM7Ci0gIH0KLX0KLQotcHVibGljIHZvaWQgc2V0Um9vdEVsZW1lbnQoRWxlbWVudCByb290RWxlbWVudCkKLXsKLX0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0phdmFUb01vZGVsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbWFuZC9KYXZhVG9Nb2RlbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwODEwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0phdmFUb01vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnMuSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQmVhblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGNvbW1hbmRzIHRoYXQgbmVlZCB0byByZXBvcnQgcHJvZ3Jlc3MKLSogYW5kIHN0YXR1cyBkdXJpbmcgYW5kIGFmdGVyIHRoZWlyIGV4ZWN1dGlvbi4gVGhpcyBjbGFzcyBleHRlbmRzCi0qIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kIEFic3RyYWN0Q29tbWFuZH0KLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotKiB3aXRoIG1ldGhvZHMgdG8ge0BsaW5rICNzZXRQcm9ncmVzc01vbml0b3Igc2V0fQotKiBhbmQge0BsaW5rICNnZXRQcm9ncmVzc01vbml0b3IgZ2V0fSBhIHByb2dyZXNzIG1vbml0b3IsCi0qIGFuZCB0byBnZXQgYSBzdGF0dXMgb2JqZWN0IHtAbGluayAjZ2V0UmVhZHlTdGF0dXMgYmVmb3JlfQotKiBvciB7QGxpbmsgI2dldFJlc3VsdFN0YXR1cyBhZnRlcn0gZXhlY3V0aW9uLgotKiA8cD4KLSogTm90ZSB0aGF0IHRoZSByZXNwb25zaWJpbGl0eSBvZiBwcm92aWRpbmcgYW4KLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIElQcm9ncmVzc01vbml0b3J9Ci0qIHJlc3RzIHdpdGggZnJhbWV3b3JrcyB0aGF0IGNvbnN0cnVjdCBvciBydW4gUHJvZ3Jlc3NDb21tYW5kIG9iamVjdHMsCi0qIHdoZXJlYXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHByb3ZpZGluZyBhbgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSogb2JqZWN0IGxpZXMgd2l0aCB0aGUgc3ViY2xhc3NlcyBvZiBQcm9ncmVzc0NvbW1hbmQuCi0qIFN1YmNsYXNzZXMgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGRlc2NyaWJlZCBmb3IKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQgQWJzdHJhY3RDb21tYW5kfS4KLSovCi1wdWJsaWMgY2xhc3MgSmF2YVRvTW9kZWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLQotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzOwotICBwcml2YXRlIFN0cmluZyBwcm94eUJlYW47Ci0gIHByaXZhdGUgSmF2YUNsYXNzIGphdmFDbGFzczsKLSAgcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLSAgcHJpdmF0ZSBFbGVtZW50IHBhcmVudEVsZW1lbnQ7Ci0gIAotICBwdWJsaWMgSmF2YVRvTW9kZWxDb21tYW5kICgpCi0gIHsKLSAgfQotCi0gIAotICBwcml2YXRlIElTdGF0dXMgY3JlYXRlSmF2YVJlZmxlY3Rpb24oSUVudmlyb25tZW50IGVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgewotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCBqYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgPSBuZXcgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kKCk7Ci0gICAgamF2YU1vZlJlZmxlY3Rpb25Db21tYW5kLnNldENsaWVudFByb2plY3QoY2xpZW50UHJvamVjdCk7Ci0gICAgamF2YU1vZlJlZmxlY3Rpb25Db21tYW5kLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotICAgIGphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0gICAgLy9qYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgIHN0YXR1cyA9IGphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5leGVjdXRlKCBtb25pdG9yLCBudWxsKTsKLSAgICBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5nZXRKYXZhQ2xhc3MoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICogVGhlIE1vZGVsIHRoYXQgd2FzIGNyZWF0ZWQgZnJvbSB0aGlzIGphdmFtb2YKLSAgKiBAcmV0dXJuIE1vZGVsIFRoZSBkYXRhIG1vZGVsIHRoYXQgd2FzIGNyZWF0ZWQKLSAgKiovCi0gIHB1YmxpYyBNb2RlbCBnZXRKYXZhRGF0YU1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIC8qKgotICAqIEJ1aWxkIHRoZSBkYXRhbW9kZWwgZnJvbSB0aGUgbW9mCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIGJ1aWxkTW9kZWxGcm9tTW9mIChJRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gIAkKLSAgCUNob2ljZSBPS0Nob2ljZSA9IG5ldyBDaG9pY2UoJ08nLCBDb25zdW1wdGlvbk1lc3NhZ2VzLkxBQkVMX09LLCBDb25zdW1wdGlvbk1lc3NhZ2VzLkRFU0NSSVBUSU9OX09LKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgQ29uc3VtcHRpb25NZXNzYWdlcy5MQUJFTF9DQU5DRUwsIENvbnN1bXB0aW9uTWVzc2FnZXMuREVTQ1JJUFRJT05fQ0FOQ0VMKTsKLSAgCQotICAgIC8vIHdlIGNvdWxkIGhhdmUgb25lIG9mIHRocmVlIGNhc2VzOgotICAgIC8vMS4gVGhlIG1vZGVsIGlzIG51bGwgbWVhbmluZyB3ZSB3YW50IGFuZCB0aGUgcGFyZW50IGVsZW1lbnQgaXMgbnVsbCwgbWVhbmluZyB3ZSB3YW50IHRvCi0gICAgLy8gICBjcmVhdGUgYSBicmFuZCBuZXcgbW9kZWwgYW5kIG1ha2UgdGhpcyBiZWFuIGl0cyByb290Ci0gICAgLy8yLiBUaGUgbW9kZWwgaXMgbnVsbCBidXQgdGhlIHBhcmVudEVsZW1lbnQgaXMgbm90LCBtZWFuaW5nIHdlIHdhbnQgdG8gYWRkIHRoZSBCZWFuIHRvIHRoZQotICAgIC8vICAgZ2l2ZW4gcGFyZW50IGVsZW1lbnQKLSAgICAvLzMuIFRoZSBtb2RlbCBpcyBub3QgbnVsbCBob3dldmVyIHRoZSBwYXJlbnRFbGVtZW50IGlzLCBtZWFuaW5nIHdlIHdhbnQgdG8gYWRkIHRoaXMgQmVhbiB0bwotICAgIC8vICAgVGhpcyBtb2RlbCBidXQgZG9udCBhdHRhY2ggaXQgdG8gYW55dGhpbmcKLSAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgaWYobW9kZWwgPT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50ID09IG51bGwpewotICAgICAgICAgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIGJlYW5WaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihjbGllbnRQcm9qZWN0LG1ldGhvZHMsIGVudik7Ci0gICAgICAgICAvL2JlYW5WaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLQkgICAgIEphdmFNb2ZCZWFuVmlzaXRvciBiZWFuVmlzaXRvciA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3IoKTsKLSAgICAgICAgIHN0YXR1cyA9IGJlYW5WaXNpdG9yLnJ1bihqYXZhQ2xhc3MsYmVhblZpc2l0b3JBY3Rpb24pOwotICAgICAgICAgLy8KLSAgICAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAgICAKLSAgICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICAgICB7Ci0gICAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgICAgIAkgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEICk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgCQotICAgICAgICAgfQotICAgICAgICAgLy8KLSAgICAgICAgIG1vZGVsID0gYmVhblZpc2l0b3JBY3Rpb24uZ2V0TW9kZWwoKTsKLQotICAgICAgfQotICAgICAgZWxzZSBpZiAobW9kZWwgPT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50ICE9IG51bGwpewotICAgICAgICAgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIGJlYW5WaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihwYXJlbnRFbGVtZW50LGNsaWVudFByb2plY3QsIGVudik7Ci0gICAgICAgICAvL2JlYW5WaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLQkgICAgIEphdmFNb2ZCZWFuVmlzaXRvciBiZWFuVmlzaXRvciA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3IoKTsKLSAgICAgICAgIHN0YXR1cyA9IGJlYW5WaXNpdG9yLnJ1bihqYXZhQ2xhc3MsYmVhblZpc2l0b3JBY3Rpb24pOwotICAgICAgICAgLy8KLSAgICAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAgICAKLSAgICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICAgICB7Ci0gICAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgICAgIAkgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggQ29uc3VtcHRpb25NZXNzYWdlcy5NU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEICk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgCQotICAgICAgICAgfQotICAgICAgICAgLy8gICAgICAgICAKLSAgICAgICAgIG1vZGVsID0gYmVhblZpc2l0b3JBY3Rpb24uZ2V0TW9kZWwoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIGJlYW5WaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihtb2RlbCxjbGllbnRQcm9qZWN0LCBlbnYpOwotICAgICAgICAgLy9iZWFuVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0JICAgICBKYXZhTW9mQmVhblZpc2l0b3IgYmVhblZpc2l0b3IgPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yKCk7Ci0gICAgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLSAgICAgICAgIC8vCi0gICAgICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgICAgewotICAgICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgICAJICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIENvbnN1bXB0aW9uTWVzc2FnZXMuTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCApOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIAkKLSAgICAgICAgIH0KLSAgICAgICAgIC8vICAgICAgICAgCi0gICAgICAgICBtb2RlbCA9IGJlYW5WaXNpdG9yQWN0aW9uLmdldE1vZGVsKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgKiBHZXQgdGhlIGphdmEgbW9kZWwgZnJvbSB0aGUgcmVzb3VyY2UgdGhlbgotICAqIGJ1aWxkIHRoZSBtb2RlbCBmcm9tIHRoZSBtb2YKLSAgKi8KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsgICAgCi0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgaWYoY2xpZW50UHJvamVjdCA9PSBudWxsKSByZXR1cm4gc3RhdHVzOwotICAgIAotICAJc3RhdHVzID0gY3JlYXRlSmF2YVJlZmxlY3Rpb24oZW52LCBtb25pdG9yKTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICB0cnl7Ci0gICAgICBzdGF0dXMgPSBidWlsZE1vZGVsRnJvbU1vZihlbnYpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Y2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpewotICAgICAgSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGV4Yy5nZXRTdGF0dXMoKTsKLSAgICAgIHN0YXR1cyA9IGVtYmVkZGVkU3RhdHVzOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RzKEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzKQotICB7Ci0gIAl0aGlzLm1ldGhvZHMgPSAgbWV0aG9kczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgCXRoaXMucGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7Ci0gIH0KLSAgICAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tb24vU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tb24vU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjRiMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbW9uL1NhbXBsZVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFByb3BlcnR5RGVzY3JpcHRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwcml2YXRlIE1ldGhvZCBmUmVhZE1ldGhvZDsKLSAgcHJpdmF0ZSBNZXRob2QgZldyaXRlTWV0aG9kOwotICBwcml2YXRlIFN0cmluZyBmUHJvcGVydHlOYW1lOwotICBwcml2YXRlIEphdmFIZWxwZXJzIGZQcm9wZXJ0eVR5cGU7IAotICBwcml2YXRlIGJvb2xlYW4gZlN0YXRpYzsKLSAgCi0gIC8qCi0gICogQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmUHJvcGVydHlOYW1lID0gbmFtZTsgCi0gIH0KLQotICAvKgotICAqIHNldCB0aGUgUmVhZE1ldGhvZAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWFkTWV0aG9kKE1ldGhvZCByZWFkTWV0aG9kKQotICB7Ci0gICAgZlJlYWRNZXRob2QgPSByZWFkTWV0aG9kOwotICB9Ci0KLSAgIC8qCi0gICogZ2V0IHRoZSBSZWFkTWV0aG9kIAotICAqLwotICBwdWJsaWMgTWV0aG9kIGdldFJlYWRNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIGZSZWFkTWV0aG9kOwotICB9Ci0KLSAgLyoKLSAgKiBzZXQgdGhlIHdyaXRlTWV0aG9kCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFdyaXRlTWV0aG9kKE1ldGhvZCB3cml0ZU1ldGhvZCkKLSAgewotICAgIGZXcml0ZU1ldGhvZCA9IHdyaXRlTWV0aG9kOwotICB9Ci0KLSAgIC8qCi0gICogZ2V0IHRoZSB3cml0ZU1ldGhvZCAKLSAgKi8KLSAgcHVibGljIE1ldGhvZCBnZXRXcml0ZU1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZldyaXRlTWV0aG9kOwotICB9Ci0KLSAgLyoKLSAgKiBzZXQgdGhlIHByb3BlcnR5TmFtZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlByb3BlcnR5TmFtZT0gbmFtZTsKLSAgfQotCi0gICAvKgotICAqIGdldCB0aGUgcHJvcGVydHlOYW1lCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnR5TmFtZTsKLSAgfQotCi0gIC8qCi0gICogc2V0IHRoZSBQcm9wZXJ0eVR5cGUKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlUeXBlKEphdmFIZWxwZXJzIHByb3BlcnR5VHlwZSkKLSAgewotICAgIGZQcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eVR5cGU7Ci0gIH0KLQotICAgLyoKLSAgKiBnZXQgdGhlIFByb3BlcnR5VHlwZSAKLSAgKi8KLSAgcHVibGljIEphdmFIZWxwZXJzIGdldFByb3BlcnR5VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnR5VHlwZTsKLSAgfQotICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGlzZlN0YXRpYygpCi0gIHsKLSAgCXJldHVybiBmU3RhdGljOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0ZlN0YXRpYyhib29sZWFuIGZTdGF0aWMpCi0gIHsKLSAgICB0aGlzLmZTdGF0aWMgPSBmU3RhdGljOwkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9JV1NGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvSVdTRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTdmZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9JV1NGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBJV1NGaW5kZXIKLXsKLSAgcHVibGljIFN0cmluZyBnZXRJRCgpOwotICBwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKTsKLQotICBwdWJsaWMgTGlzdCBmaW5kKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL0xpdmVXU0RMRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL0xpdmVXU0RMRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YjIwN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9MaXZlV1NETEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTGl2ZVdTRExGaWx0ZXIgZXh0ZW5kcyBUaHJlYWQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTF87Ci0gIHByaXZhdGUgYm9vbGVhbiBmaW5pc2hfOwotICBwcml2YXRlIGJvb2xlYW4gbGl2ZV87Ci0KLSAgcHVibGljIExpdmVXU0RMRmlsdGVyKFN0cmluZyB3c2RsVVJMKQotICB7Ci0gICAgd3NkbFVSTF8gPSB3c2RsVVJMOwotICAgIGZpbmlzaF8gPSBmYWxzZTsKLSAgICBsaXZlXyA9IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMVVJMKCkKLSAgewotICAgIHJldHVybiB3c2RsVVJMXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRmluaXNoKCkKLSAgewotICAgIHJldHVybiBmaW5pc2hfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNXU0RMTGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gbGl2ZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbGl2ZV8gPSB2YWxpZGF0ZVdTREwoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIGxpdmVfID0gZmFsc2U7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBmaW5pc2hfID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVXU0RMKCkgdGhyb3dzIFdTRExFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgCVdlYlNlcnZpY2VzUGFyc2VyRXh0IHBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcGFyc2VyLmdldFdTRExEZWZpbml0aW9uVmVyYm9zZSh3c2RsVVJMXyk7Ci0gICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgIEl0ZXJhdG9yIHNlcnZpY2VJdGVyYXRvciA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2Upc2VydmljZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgIEl0ZXJhdG9yIHBvcnRJdGVyYXRvciA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAocG9ydEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpcG9ydEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBJdGVyYXRvciBleHRlbnNpYmlsaXR5RWxlbWVudHNJdGVyYXRvciA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0ZW5zaWJpbGl0eUVsZW1lbnRzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgIGlmICgoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgfHwgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL1dTRmluZGVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvV1NGaW5kZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM1NjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvV1NGaW5kZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBXU0ZpbmRlclJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIFdTRmluZGVyUmVnaXN0cnkgaW5zdGFuY2VfOwotICBwcml2YXRlIFZlY3RvciB3c2ZpbmRlcnNfOwotCi0gIHByaXZhdGUgV1NGaW5kZXJSZWdpc3RyeSgpCi0gIHsKLSAgICB3c2ZpbmRlcnNfID0gbmV3IFZlY3RvcigpOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXU0ZpbmRlclJlZ2lzdHJ5IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXU0ZpbmRlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV1NGaW5kZXJSZWdpc3RyeSgpOwotICAgICAgaW5zdGFuY2VfLmluaXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBwbHVnaW5SZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLCAid3NmaW5kZXIiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gY29uZmlnRWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElXU0ZpbmRlcikKLSAgICAgICAgewotICAgICAgICAgIElXU0ZpbmRlciB3c2ZpbmRlciA9IChJV1NGaW5kZXIpb2JqZWN0OwotICAgICAgICAgIHdzZmluZGVyLnNldElEKGNvbmZpZ0VsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0gICAgICAgICAgd3NmaW5kZXIuc2V0TmFtZShjb25maWdFbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgICAgICAgd3NmaW5kZXIuc2V0RGVzY3JpcHRpb24oY29uZmlnRWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpKTsKLSAgICAgICAgICB3c2ZpbmRlcnNfLmFkZCh3c2ZpbmRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFdTRmluZGVycygpCi0gIHsKLSAgICByZXR1cm4gd3NmaW5kZXJzXzsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZXMoKQotICB7Ci0gICAgTGlzdCB3cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBMaXN0IHdzRmluZGVycyA9IGdldFdTRmluZGVycygpOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSB3c0ZpbmRlcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJV1NGaW5kZXIgd3NGaW5kZXIgPSAoSVdTRmluZGVyKWl0Lm5leHQoKTsKLSAgICAgIHdzLmFkZEFsbCh3c0ZpbmRlci5maW5kKCkpOwotICAgIH0KLSAgICByZXR1cm4gd3M7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Eb21FbGVtZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvRG9tRWxlbWVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIzZTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Eb21FbGVtZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy51dGlsOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21FbGVtZW50SGVscGVyIHsKLQotCi0gIHB1YmxpYyBzdGF0aWMgb3JnLnczYy5kb20uRWxlbWVudCBjcmVhdGVEb21FbGVtZW50RnJvbVhNTFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHhtbFN0cmluZyApCi0gIHsKLSAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciBzdHJpbmdSZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoeG1sU3RyaW5nKTsgCi0gICAgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2Uoc3RyaW5nUmVhZGVyKTsgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2NCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZG9jQnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY0J1aWxkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotICAgICAgcmV0dXJuIGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGRvbVdyaXRlcihvcmcudzNjLmRvbS5Ob2RlIG5vZGUsamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICBpZiAoIG5vZGUgPT0gbnVsbCApIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0JaW50IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0Jc3dpdGNoICggdHlwZSApIHsKLQkgIGNhc2Ugb3JnLnczYy5kb20uTm9kZS5ET0NVTUVOVF9OT0RFOiB7Ci0JICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IikgKyAiPGJyPiIpOwotCSAgZG9tV3JpdGVyKCgob3JnLnczYy5kb20uRG9jdW1lbnQpbm9kZSkuZ2V0RG9jdW1lbnRFbGVtZW50KCksYnVmZmVyKTsKLQkgIGJyZWFrOwotCX0KLQkgIGNhc2Ugb3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREU6IHsKLQkgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI8IiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSkpOwotCSAgb3JnLnczYy5kb20uQXR0ciBhdHRyc1tdID0gc29ydEF0dHJpYnV0ZXMobm9kZS5nZXRBdHRyaWJ1dGVzKCkpOwotCSAgZm9yICggaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKysgKSB7Ci0JICAgIG9yZy53M2MuZG9tLkF0dHIgYXR0ciA9IGF0dHJzW2ldOwotCSAgICBidWZmZXIuYXBwZW5kKCIgIiArIGF0dHIuZ2V0Tm9kZU5hbWUoKSArICI9XCIiICsgSnNwVXRpbHMubWFya3VwKGF0dHIuZ2V0Tm9kZVZhbHVlKCkpICsgIlwiIik7Ci0JICB9Ci0JICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI+IikpOwotCSAgICBvcmcudzNjLmRvbS5Ob2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCSAgICBpZiAoIGNoaWxkcmVuICE9IG51bGwgKSB7Ci0JICAgICAgaW50IGxlbiA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotCQkgIGZvciAoIGludCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQkgICAgaWYoKChvcmcudzNjLmRvbS5Ob2RlKWNoaWxkcmVuLml0ZW0oaSkpLmdldE5vZGVUeXBlKCkgPT0gb3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREUpCi0JCQkgIGJ1ZmZlci5hcHBlbmQoIjxicj4iKTsKLQkJCWRvbVdyaXRlcihjaGlsZHJlbi5pdGVtKGkpLGJ1ZmZlcik7Ci0JCSAgfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI8LyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiIpKTsKLQkJYnJlYWs7Ci0gICAgICB9Ci0JICBjYXNlIG9yZy53M2MuZG9tLk5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOiB7Ci0JICAgIG9yZy53M2MuZG9tLk5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JICAgIGlmICggY2hpbGRyZW4gIT0gbnVsbCApIHsKLQkJICBpbnQgbGVuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCSAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKQotCSAgICAgIHsKLQkJICAgIGJ1ZmZlci5hcHBlbmQoY2hpbGRyZW4uaXRlbShpKSk7Ci0JCSAgfQotCQl9Ci0JCWJyZWFrOwotCSAgfQotCSAgY2FzZSBvcmcudzNjLmRvbS5Ob2RlLkNEQVRBX1NFQ1RJT05fTk9ERTogewotCSAgICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cChub2RlLmdldE5vZGVWYWx1ZSgpKSk7Ci0JICAgIGJyZWFrOwotICAgICAgfQotCSAgY2FzZSBvcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERTp7Ci0JICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JICBjYXNlIG9yZy53M2MuZG9tLk5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOnsKLQkJYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIjw/IikpOwotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCVN0cmluZyBkYXRhID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJaWYgKCBkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDAgKXsKLQkgICAgICBidWZmZXIuYXBwZW5kKCIgIik7Ci0JCSAgYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPz4iKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgIH0KLQkgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gCi0JcHVibGljIHN0YXRpYyBvcmcudzNjLmRvbS5BdHRyW10gc29ydEF0dHJpYnV0ZXMob3JnLnczYy5kb20uTmFtZWROb2RlTWFwIGF0dHJzKQotCXsKLQkgIGludCBsZW4gPSAoYXR0cnMgIT0gbnVsbCkgPyBhdHRycy5nZXRMZW5ndGgoKSA6IDA7Ci0JICBvcmcudzNjLmRvbS5BdHRyIGFycmF5W10gPSBuZXcgb3JnLnczYy5kb20uQXR0cltsZW5dOwotCSAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKXsKLQkgICBhcnJheVtpXSA9IChvcmcudzNjLmRvbS5BdHRyKWF0dHJzLml0ZW0oaSk7Ci0JICB9Ci0JICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW4gLSAxOyBpKysgKSB7Ci0JICAgIFN0cmluZyBuYW1lICA9IGFycmF5W2ldLmdldE5vZGVOYW1lKCk7Ci0JICAgIGludCBpbmRleCA9IGk7Ci0JICAgIGZvciAoIGludCBqID0gaSArIDE7IGogPCBsZW47IGorKyApIHsKLQkgICAgICBTdHJpbmcgY3VyTmFtZSA9IGFycmF5W2pdLmdldE5vZGVOYW1lKCk7Ci0JCSAgaWYgKCBjdXJOYW1lLmNvbXBhcmVUbyhuYW1lKSA8IDAgKSB7Ci0JCSAgICBuYW1lICA9IGN1ck5hbWU7Ci0JCQlpbmRleCA9IGo7Ci0JCSAgfQotCQl9Ci0JCWlmICggaW5kZXggIT0gaSApIHsKLQkJICBvcmcudzNjLmRvbS5BdHRyIHRlbXAgPSBhcnJheVtpXTsKLQkJICBhcnJheVtpXSA9IGFycmF5W2luZGV4XTsKLQkJICBhcnJheVtpbmRleF0gPSB0ZW1wOwotCQl9Ci0JICB9Ci0JICByZXR1cm4gKGFycmF5KTsKLSAgICB9Ci0gCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Kc3BVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL0pzcFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjkwMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL0pzcFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BVdGlscyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFya3VwKFN0cmluZyB0ZXh0KSB7Ci0JCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJCXN3aXRjaCAoYykgewotCQkJCQljYXNlICc8JzoKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiZsdDsiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICcmJzoKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiZhbXA7Iik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnPic6Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCImZ3Q7Iik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnIic6Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCImcXVvdDsiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODAzMDA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMTMxICAgMTIzOTYzIGFuZHl6aGFpQGNhLmlibS5jb20gLSBBbmR5IFpoYWkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqLwotcHVibGljIGNsYXNzIFNvYXBFbGVtZW50SGVscGVyCi17Ci0JcHVibGljIHN0YXRpYyBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCBjcmVhdGVTT0FQRWxlbWVudEZyb21YTUxTdHJpbmcoU3RyaW5nIHhtbFN0cmluZykgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KLQl7Ci0JCWphdmEuaW8uU3RyaW5nUmVhZGVyIHN0cmluZ1JlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcih4bWxTdHJpbmcpOyAKLQkJb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2Uoc3RyaW5nUmVhZGVyKTsgCi0JCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCVNvYXBFbGVtZW50U2F4SGFuZGxlciBoYW5kbGVyID0gbmV3IFNvYXBFbGVtZW50U2F4SGFuZGxlcigpOwotCQlwYXJzZXIucGFyc2UoaW5wdXRTb3VyY2UsaGFuZGxlcik7Ci0JCXJldHVybiBoYW5kbGVyLmdldFNPQVBFbGVtZW50KCk7ICAgIAotCX0KLQotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzb2FwRWxlbWVudFdyaXRlcihqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCBub2RlLGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYnVmZmVyKQotCXsKLQkJaWYgKG5vZGUgPT0gbnVsbCApIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQkKLQkJYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIjwiICsgbm9kZS5nZXRFbGVtZW50TmFtZSgpLmdldExvY2FsTmFtZSgpKSk7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBhdHRycyA9IG5vZGUuZ2V0QWxsQXR0cmlidXRlcygpOwotCQl3aGlsZShhdHRycy5oYXNOZXh0KCkpIHsKLQkJCWphdmF4LnhtbC5zb2FwLk5hbWUgYXR0ciA9IChqYXZheC54bWwuc29hcC5OYW1lKWF0dHJzLm5leHQoKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiAiICsgYXR0ci5nZXRRdWFsaWZpZWROYW1lKCkgKyAiPVwiIiArIEpzcFV0aWxzLm1hcmt1cChub2RlLmdldEF0dHJpYnV0ZVZhbHVlKGF0dHIpKSArICJcIiIpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI+IikpOwotCQlqYXZhLnV0aWwuSXRlcmF0b3IgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkRWxlbWVudHMoKTsKLQkJaWYgKCBjaGlsZHJlbiAhPSBudWxsICkgewotCQkJd2hpbGUoY2hpbGRyZW4uaGFzTmV4dCgpKXsKLQkJCQlqYXZheC54bWwuc29hcC5Ob2RlIGNoaWxkTm9kZSA9IChqYXZheC54bWwuc29hcC5Ob2RlKWNoaWxkcmVuLm5leHQoKTsKLQkJCQlpZihjaGlsZE5vZGUgaW5zdGFuY2VvZiBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCl7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIjxicj4iKTsKLQkJCQkJc29hcEVsZW1lbnRXcml0ZXIoKGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50KWNoaWxkTm9kZSxidWZmZXIpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCgoamF2YXgueG1sLnNvYXAuVGV4dCljaGlsZE5vZGUpLmdldFZhbHVlKCkpKTsgCi0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPC8iICsgbm9kZS5nZXRFbGVtZW50TmFtZSgpLmdldExvY2FsTmFtZSgpICsgIj4iKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzNWVmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gIHsKLQotICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM3NjE2OTMzNzI2NzQ3NDg0NzFMOwotCi1wdWJsaWMgU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKXsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgfQotICAKLSAgCi0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudFNheEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudFNheEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiYmY2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRTYXhIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDEzMSAgIDEyMzk2MyBhbmR5emhhaUBjYS5pYm0uY29tIC0gQW5keSBaaGFpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgeGluemhhaQotICovCi1wdWJsaWMgY2xhc3MgU29hcEVsZW1lbnRTYXhIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLQkvL1N0b3JlcyBhbGwgdmFsdWVzIG9mIHBhaXJzIG9mIHByZWZpeCBhbmQgVVJJIGluIHRoZSBkb2N1bWVudAotCXByaXZhdGUgSGFzaE1hcCBwcmVmaXhVUklNYXBwaW5nID0gbmV3IEhhc2hNYXAoKTsKLQkvL1N0b3JlcyBhIGxpc3Qgb2YgVVJJcyBmb3IgYSBwYXJ0aWN1bGFyIFNPQVAgZWxlbWVudAotCXByaXZhdGUgQXJyYXlMaXN0IHVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy9SZXByZXNlbnRzIHRoZSB3aG9sZShyb290KSBTT0FQIGRvY3VtZW50Ci0JcHJpdmF0ZSBTT0FQRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0JLy9SZXByZXNlbnRzIHRoZSBjdXJyZW50IFNPQVAgZWxlbWVudCB3aGVyZSBTQVggcGFyc2VyIGlzIHJlYWRpbmcKLQlwcml2YXRlIFNPQVBFbGVtZW50IGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5OwotCQotCXB1YmxpYyBTT0FQRWxlbWVudCBnZXRTT0FQRWxlbWVudCgpCi0JewotCQlyZXR1cm4gcm9vdEVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQl0cnkgCi0JCXsKLQkJCXNvYXBGYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJfQotCQljYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSAKLQkJewotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIGEgU09BUEZhY3RvcnkgaW5zdGFuY2UiLCBlKTsKLQkJfQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLQl7Ci0JCXByZWZpeFVSSU1hcHBpbmcucHV0KHVyaSxwcmVmaXgpOwotCQl1cmlzLmFkZCh1cmkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgc3RyID0gU3RyaW5nLnZhbHVlT2YoY2gpOwotCQkvL0FkZCBub24tdHJpdmlhbCB0ZXh0IGFzIGEgdGV4dCBub2RlCi0JCWlmIChsZW5ndGggPiAxKQotCQl7Ci0JCQl0cnkgCi0JCQl7Ci0JCQkJY3VycmVudEVsZW1lbnQuYWRkVGV4dE5vZGUoc3RyLnN1YnN0cmluZyhzdGFydCxzdGFydCtsZW5ndGgpKTsKLQkJCX0gCi0JCQljYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSAKLQkJCXsKLQkJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJDYW4ndCBhZGQgYSB0ZXh0IG5vZGUgaW50byBTT0FQRWxlbWVudCBmcm9tIHRleHQiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50IChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0JewotCQlpZiAoY3VycmVudEVsZW1lbnQgIT0gcm9vdEVsZW1lbnQgKQotCQl7Ci0JCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpIHRocm93cyBTQVhFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBwcmVmaXggPSAoU3RyaW5nKXByZWZpeFVSSU1hcHBpbmcuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0JCXRyeQotCQl7Ci0JCQkvLyBDcmVhdGUgYW5kL29yIGFkZCBjaGlsZCBlbGVtZW50Ci0JCQlpZiAocm9vdEVsZW1lbnQgPT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudCA9PSBudWxsKQotCQkJewotCQkJCXJvb3RFbGVtZW50ID0gc29hcEZhY3RvcnkuY3JlYXRlRWxlbWVudChsb2NhbE5hbWUscHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0JCQkJY3VycmVudEVsZW1lbnQgPSByb290RWxlbWVudDsKLQkJCX0gCi0JCQllbHNlCi0JCQl7Ci0JCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGRDaGlsZEVsZW1lbnQobG9jYWxOYW1lLHByZWZpeCxuYW1lc3BhY2VVUkkpOwotCQkJfQotCQkJCi0JCQkvLyBBZGQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0JCQlpZiAodXJpcy5zaXplKCkgPiAwKQotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5zaXplKCk7IGkrKykKLQkJCQl7Ci0JCQkJCVN0cmluZyB1cmkgPSAoU3RyaW5nKXVyaXMuZ2V0KGkpOwotCQkJCQlTdHJpbmcgcHJlID0gKFN0cmluZylwcmVmaXhVUklNYXBwaW5nLmdldCh1cmkpOwotCQkJCQljdXJyZW50RWxlbWVudC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihwcmUsdXJpKTsKLQkJCQl9Ci0JCQkJLy8gTmVlZCB0byByZXNldCB1cmlzIGFzIHdlIHdpbGwgdXNlIGl0IGZvciBuZXh0IGVsZW1lbnQuCi0JCQkJdXJpcy5jbGVhcigpOyAKLQkJCX0KLQkJCQotCQkJLy8gQWRkIGF0dGlidXRlcwotCQkJZm9yIChpbnQgaSA9MDsgaTxhdHRzLmdldExlbmd0aCgpOyBpKyspCi0JCQl7Ci0JCQkJTmFtZSBhdHRyaU5hbWU7Ci0JCQkJaWYgKGF0dHMuZ2V0VVJJKGkpICE9IG51bGwpCi0JCQkJewotCQkJCQlTdHJpbmcgYXR0cmlQcmUgPSAoU3RyaW5nKXByZWZpeFVSSU1hcHBpbmcuZ2V0KGF0dHMuZ2V0VVJJKGkpKTsKLQkJCQkJYXR0cmlOYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZShhdHRzLmdldExvY2FsTmFtZShpKSxhdHRyaVByZSxhdHRzLmdldFVSSShpKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWF0dHJpTmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoYXR0cy5nZXRMb2NhbE5hbWUoaSkpOwotCQkJCX0KLQkJCQljdXJyZW50RWxlbWVudC5hZGRBdHRyaWJ1dGUoYXR0cmlOYW1lLCBhdHRzLmdldFZhbHVlKGkpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSAKLQkJewotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDIzNDYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA5YjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6NDE6MTUgRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYmZhYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjk0MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmZTY1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgQ3JlYXRpb24gRUpCIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLSMKLSMgV2ViIHNlcnZpY2UgdHlwZXMKLSMKLVdFQlNFUlZJQ0VUWVBFX05BTUVfRUpCX1RQPUVKQiBXZWIgU2VydmljZQotV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMX0VKQl9UUD1Ta2VsZXRvbiBFSkIgV2ViIFNlcnZpY2UKLQotIwotIyBQb3AtdXAgYWN0aW9ucwotIwotQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFPUNyZWF0ZSBXZWIgc2VydmljZQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ExOGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgIDwhLS0gRUpCIFdlYiBTZXJ2aWNlIFR5cGVzIC0tPgotPCEtLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiPgotCi0gICAgICA8d2ViU2VydmljZVR5cGUKLSAgICAgICAgICAgIGxhYmVsPSIlV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMX0VKQl9UUCIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJGaWxlIElSZXNvdXJjZSIKLSAgICAgICAgICAgIGV4dGVuc2lvbk1ldGFkYXRhPSIud3NkbCIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICBpbmNsdWRlTmF0dXJlcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSIKLSAgICAgICAgICAgIGV4Y2x1ZGVOYXR1cmVzPSIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUud3NkbC5lamIiPgotICAgICAgPC93ZWJTZXJ2aWNlVHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VUeXBlCi0JCSAgICBsYWJlbD0iJVdFQlNFUlZJQ0VUWVBFX05BTUVfRUpCX1RQIgotCQkgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGE9IkVKQk9iamVjdCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4gU2Vzc2lvbkltcGwiCi0JCSAgICBleHRlbnNpb25NZXRhZGF0YT0iLmphdmEgLmNsYXNzIC5TZXNzaW9uSW1wbCIKLQkJICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvbldpZGdldCIKLQkJICAgIGluY2x1ZGVOYXR1cmVzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIgotCQkgICAgZXhjbHVkZU5hdHVyZXM9IiIKLQkJICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS5lamIiPgotICAJIDwvd2ViU2VydmljZVR5cGU+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQotICAgPCEtLSBQb3B1cHMgLS0+Ci0gICAgICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LmVqYi5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotCi08IS0tIEVKQiBzdHVmZiAtLT4KLSAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzSW1wbCI+Ci0gICAgIDx3ZWJTZXJ2aWNlSW1wbAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuZWpiIgotICAgICAgICAgICAgbGFiZWw9IiVXRUJTRVJWSUNFVFlQRV9OQU1FX0VKQl9UUCIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJFSkJPYmplY3Qgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIFNlc3Npb25JbXBsIgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyAuU2Vzc2lvbkltcGwiCi0gICAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5FSkJTZWxlY3Rpb25XaWRnZXQiPgotICAgICA8L3dlYlNlcnZpY2VJbXBsPgotICAgIDwvZXh0ZW5zaW9uPiAgICAKLSAgICAKLQotICAgICAgICAgICAgCi0gICAKLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAxMDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNmVkZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c3MtdWkuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWM4YmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5YjQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIEphbiAzMCAxMDozNjozMCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzFhYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjQxOjA0IEVTVCAyMDA2Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxYTY4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTA1LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmFudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnNlcnZlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnJ1bnRpbWU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0O3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcud3NkbDRqO2J1bmRsZS12ZXJzaW9uPSJbMS40LjAsMS41LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAzLDEuMS4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZGVjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZXhwb3J0X3dzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0NGVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZXhwb3J0X3dzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmY2Q3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfd2Vic2Vydl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld193ZWJzZXJ2X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzM3ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld193ZWJzZXJ2X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc193aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmODc2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc193aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2NhbGUwX2Jncm91bmQuanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2NhbGUwX2Jncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWIxODgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NjYWxlMF9iZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NjYWxlMV9iZ3JvdW5kLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NjYWxlMV9iZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMTczMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zY2FsZTFfYmdyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zY2FsZTJfYmdyb3VuZC5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zY2FsZTJfYmdyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2FmNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2NhbGUyX2Jncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2NhbGUzX2Jncm91bmQuanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2NhbGUzX2Jncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmQ0OGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NjYWxlM19iZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NjYWxlNF9iZ3JvdW5kLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NjYWxlNF9iZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5YTQzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zY2FsZTRfYmdyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zY2FsZTVfYmdyb3VuZC5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zY2FsZTVfYmdyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlN2Q0NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2NhbGU1X2Jncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2NhbGU2X2Jncm91bmQuanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2NhbGU2X2Jncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGMwOTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NjYWxlNl9iZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NlcnZpY2VfYXNzZW1ibGUuanBnIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2VydmljZV9hc3NlbWJsZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzc5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2VydmljZV9hc3NlbWJsZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zZXJ2aWNlX2RlcGxveS5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zZXJ2aWNlX2RlcGxveS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNThiYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2VydmljZV9kZXBsb3kuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2VydmljZV9kZXZlbG9wLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NlcnZpY2VfZGV2ZWxvcC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZmY2YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2VydmljZV9kZXZlbG9wLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NlcnZpY2VfaW5zdGFsbC5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zZXJ2aWNlX2luc3RhbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGZjZGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NlcnZpY2VfaW5zdGFsbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zZXJ2aWNlX3J1bi5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9zZXJ2aWNlX3J1bi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTEyZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2VydmljZV9ydW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2VydmljZV90ZXN0LmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL3NlcnZpY2VfdGVzdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTY5NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvc2VydmljZV90ZXN0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMThkNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgQ3JlYXRpb24gR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19TRVJWSUNFPVdlYiBTZXJ2aWNlCi1QTFVHSU5fRVhQT1JUX1dJWkFSRF9OQU1FX1dTPVdlYiBTZXJ2aWNlCi1QTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX1NFUlZJQ0U9Q3JlYXRlIGEgbmV3IFhNTCB3ZWIgc2VydmljZS4KLVBMVUdJTl9FWFBPUlRfV0laQVJEX0RFU0NfV1M9QSB3aXphcmQgZm9yIGV4cG9ydGluZyBhIHdlYiBzZXJ2aWNlLgotCi0jCi0jCVdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIERpYWxvZ3MKLUNIRUNLQk9YX1NIT1dfREVQTE9ZX1dFQl9TRVJWSUNFX0RJQUxPRz1IaWRlICZDcmVhdGUgV2ViIHNlcnZpY2UgRGlhbG9nCi1DSEVDS0JPWF9TSE9XX0dFTkVSQVRFX1NLRUxFVE9OX0RJQUxPRz1IaWRlIEdlbmVyYXRlIEphdmEgQmVhbiBTJmtlbGV0b24gRGlhbG9nCi1DSEVDS0JPWF9TSE9XX0dFTkVSQVRFX1dTRExfRklMRVNfRElBTE9HPUhpZGUgR2VuZXJhdGUgV1NETCBGaWxlcyBEaWFsb2cKLUNIRUNLQk9YX1NIT1dfUFVCTElTSF9XU0RMX0RJQUxPRz1IaWRlIFB1Ymxpc2ggJldTREwgRGlhbG9nCi0KLVBSRUZFUkVOQ0VfQ0FURUdPUllfU0NFTkFSSU9fREVGQVVMVFM9U2NlbmFyaW8gRGVmYXVsdHMKLQotCi0jCi0jIFByZWZlcmVuY2VzIFRvb2x0aXBzCi0jCi0jQWN0aW9uIERpYWxvZ3MKLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9ERVBMT1k9SGlkZXMgdGhlIGRpYWxvZyBmb3IgZGVwbG95aW5nIGEgV2ViIHNlcnZpY2UgYWN0aW9uCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfU0tFTEVUT049SGlkZXMgdGhlIGRpYWxvZyBmb3IgZ2VuZXJhdGluZyBKYXZhIGJlYW4gU2tlbGV0b24gYWN0aW9uCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfV1NETD1IaWRlcyB0aGUgZGlhbG9nIGZvciBnZW5lcmF0aW5nIFdTREwgZmlsZXMgYWN0aW9uCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfUFVCTElTSD1IaWRlcyB0aGUgZGlhbG9nIGZvciBwdWJsaXNoaW5nIHRoZSBXU0RMIGFjdGlvbgotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1BQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0U9Q3JlYXRlIFdlYiBzZXJ2aWNlCi1BQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTj1HZW5lcmF0ZSBKYXZhIGJlYW4gc2tlbGV0b24KLUFDVElPTl9QVUJMSVNIX1dTREw9UHVibGlzaCBXU0RMIGZpbGUKLQotIwotIyBXaXphcmRzLgotIwotV0laQVJEX1RJVExFX1dTUz1XZWIgU2VydmljZQotCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRT1DcmVhdGUgV2ViIHNlcnZpY2UKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMzA0ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICAgIDwhLS0gV2l6YXJkcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51aS5uZXciPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX1NFUlZJQ0UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3X3dlYnNlcnZfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVBMVUdJTl9ORVdfV0laQVJEX0RFU0NfV1NfU0VSVklDRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNfd2l6LnBuZyIKLSAgICAgICAgICAgIHRpdGxlPSIlV0laQVJEX1RJVExFX1dTUyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5iaW5kaW5nLlNlcnZlcldpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud3NleHBvcnQuY2F0ZWdvcnkiCi0gICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fRVhQT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXhwb3J0X3dzLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud3NleHBvcnQuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NleHBvcnQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVBMVUdJTl9FWFBPUlRfV0laQVJEX0RFU0NfV1MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2V4cG9ydF93c193aXouZ2lmIgotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9FWFBPUlRfV0laQVJEX05BTUVfV1MiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZy5FeHBvcnRXU1dpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzZXhwb3J0Ij4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2V4cG9ydF93c193aXouZ2lmIgotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9FWFBPUlRfV0laQVJEX05BTUVfV1MiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZy5FeHBvcnRXU1dpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tICJEb24ndCBTaG93IE1lIiBQcmVmZXJlbmNlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSI+Ci0KLSAgICAgIDxhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZQotICAgICAgICAgICAgbmFtZT0iJUNIRUNLQk9YX1NIT1dfREVQTE9ZX1dFQl9TRVJWSUNFX0RJQUxPRyIKLSAgICAgICAgICAgIHRvb2x0aXA9IiVUT09MVElQX1BQQURfQ0hFQ0tCT1hfREVQTE9ZIgotICAgICAgICAgICAgaW5mb3BvcD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLlBQQUQwMDA2IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX0dFTkVSQVRFX1NLRUxFVE9OX0RJQUxPRyIKLSAgICAgICAgICAgIHRvb2x0aXA9IiVUT09MVElQX1BQQURfQ0hFQ0tCT1hfU0tFTEVUT04iCi0gICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkuUFBBRDAwMDgiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX1BVQkxJU0hfV1NETF9ESUFMT0ciCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1BVQkxJU0giCi0gICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkuUFBBRDAwMDkiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnB1Ymxpc2giPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gUG9wdXBzIC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5qYXZhIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLmphdmEiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGwiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLnNrZWxldG9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfU0tFTEVUT04iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4iCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLmphdmEiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgCi0gICAgICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NpbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX1BVQkxJU0hfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX1BVQkxJU0hfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgCi0gICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX1BVQkxJU0hfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgCi0gICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX1BVQkxJU0hfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBQcmVmZXJlbmNlIFBhZ2VzIC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX1NDRU5BUklPX0RFRkFVTFRTIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5wcmVmZXJlbmNlcy5TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnByZWZlcmVuY2VzLlNjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgICAgICBpZD0iU3RhcnRTZXJ2aWNlU2VydmVyIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbi5QcmVTZXJ2aWNlUnVuQ29tbWFuZCIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnNlcnZlci5TdGFydFNlcnZlcldpZGdldEZhY3RvcnkiLz4KLSAgICA8L2V4dGVuc2lvbj4gCi0gICAgCi0gICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hbnRTY2VuYXJpbyI+Ci0gICAgICAgIDxhbnRTY2VuYXJpbwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5hbnQuQW50U2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQiCi0gICAgICAgICAgICBzY2VuYXJpb1R5cGU9InNlcnZpY2UiLz4KLSAgICAgPC9leHRlbnNpb24+ICAgIAotICAgIAotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYW50RGF0YU1hcHBpbmciPgotICAgICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iSW5pdGlhbFNlbGVjdGlvbiIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkluaXRpYWxTZWxlY3Rpb24iCi0gICAgICAgICAgICAgIHJlcXVpcmVkPSJ0cnVlIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlNlbGVjdGlvblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJJbml0aWFsU2VsZWN0aW9uIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iT2JqZWN0U2VsZWN0aW9uIgotICAgICAgICAgICAgICByZXF1aXJlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZzJTZWxlY3Rpb25UcmFuc2Zvcm1lciIvPiAgICAgICAgICAgICAgCi0JCTxtYXAKLSAgICAgICAgICAgICAga2V5PSJQcm9qZWN0IgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iUHJvamVjdCIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lciIvPgotICAgICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iQ29tcG9uZW50TmFtZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkNvbXBvbmVudE5hbWUiLz4KLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IlNlcnZpY2UuUnVudGltZUlkIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiCi0gICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmcyVHlwZVJ1bnRpbWVTZXJ2ZXJNb2RpZmllciIvPgotICAgICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iU2VydmljZS5TZXJ2ZXJJZCIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iU2VydmljZVR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4KLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IlNlcnZpY2UuVHlwZUlkIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiCi0gICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmcyVHlwZVJ1bnRpbWVTZXJ2ZXJNb2RpZmllciIvPiAgICAgICAgICAgICAKLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IkdlbmVyYXRlUHJveHkiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlUHJveHkiLz4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJTZXJ2aWNlLlJ1bnRpbWVJZCIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iU2VydmljZVR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4KLSAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IlNlcnZpY2UuU2VydmVySWQiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZzJUeXBlUnVudGltZVNlcnZlck1vZGlmaWVyIi8+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iU2VydmljZS5UeXBlSWQiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZzJUeXBlUnVudGltZVNlcnZlck1vZGlmaWVyIi8+Ci0gICAgICAgICAgICAgIAotICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IlNlcnZpY2VQcm9qZWN0TmFtZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5ydW50aW1lLlNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IlNlcnZpY2VQcm9qZWN0TmFtZSIvPgotICAgICAgICAgICAgICAKLSAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJTZXJ2aWNlUHJvamVjdE5hbWUiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IlNlcnZpY2VQcm9qZWN0TmFtZSIvPgotICAgICAgICAgICAgICAKLSAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJTZXJ2aWNlQ29tcG9uZW50TmFtZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iU2VydmljZUNvbXBvbmVudE5hbWUiLz4KLQotICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IlNlcnZpY2VFYXJQcm9qZWN0TmFtZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iU2VydmljZUVhclByb2plY3ROYW1lIi8+Ci0gICAgICAgICAgICAgIAotICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IlNlcnZpY2VFYXJDb21wb25lbnROYW1lIgotICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJTZXJ2aWNlRWFyQ29tcG9uZW50TmFtZSIvPiAgICAgICAgICAgICAgCi0gICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iU2VydmljZS5SdW50aW1lSWQiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIKLSAgICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZzJUeXBlUnVudGltZVNlcnZlck1vZGlmaWVyIi8+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICAgIGtleT0iU2VydmljZS5TZXJ2ZXJJZCIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkZyYWdtZW50IgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iU2VydmljZVR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJTZXJ2aWNlLlR5cGVJZCIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkZyYWdtZW50IgotICAgICAgICAgICAgICBwcm9wZXJ0eT0iU2VydmljZVR5cGVSdW50aW1lU2VydmVyIgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIiLz4KLSAgICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvQ3JlYXRpb25VSS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9DcmVhdGlvblVJLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yzc0YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9DcmVhdGlvblVJLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgV2l6YXJkIHBhZ2VzCi0jCi1QQUdFX1RJVExFX09CSkVDVF9TRUxFQ1RJT049T2JqZWN0IFNlbGVjdGlvbiBQYWdlCi1QQUdFX0RFU0NfT0JKRUNUX1NFTEVDVElPTj1PYmplY3QgU2VsZWN0aW9uIFBhZ2UKLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvQ3JlYXRpb25VSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL0NyZWF0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE5ZThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvQ3JlYXRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIENyZWF0aW9uVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLkNyZWF0aW9uVUkiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3JlYXRpb25VSU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX09CSkVDVF9TRUxFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9ERVNDX09CSkVDVF9TRUxFQ1RJT047Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDcmVhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2FudC9BbnRTZXJ2aWNlUm9vdENvbW1hbmRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9hbnQvQW50U2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1YTUwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2FudC9BbnRTZXJ2aWNlUm9vdENvbW1hbmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMSAgIDExOTExMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNTMwICAgMTQ0MzU4IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDUzMCAgIDE0NDM1MCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA4MjMgICAxNTQ5MzggcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNjA4MjUgICAxNTUxMTQgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNjEwMTEgICAxNTkyODMgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIHByb2plY3Qgbm90IGFzc29jaWF0ZWQgdG8gRUFSIHdoZW4gdXNpbmcgYW50IG9uIGNvbW1hbmQtbGluZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5hbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5BbnREZWZhdWx0aW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkFudFJlc3RvcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuTGlzdE9wdGlvbnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uRmluaXNoRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5TY2VuYXJpb0NsZWFudXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5zZWxlY3Rpb24uU2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbi5QcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbi5TZXJ2aWNlUm9vdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMucnVudGltZS5TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0gCi0vKioKLSAqIAotICogQ29tbWFuZCBmcmFnbWVudCBmb3IgZ2VuZXJhdGluZyB3ZWIgc2VydmljZSB0b3AgZG93biBvciBib3R0b20gdXAgdXNpbmcgQW50IHRhc2suCi0gKiBSdW4gaGVhZGxlc3MgRWNsaXBzZSBvciB3aXRoaW4gd29ya3NwYWNlIHVzaW5nIFJ1biBhcyBBbnQgQnVpbGQuICBUaGlzIGZyYWdtZW50IGVsaW1pbmF0ZXMgYW55IFVJIHNwZWNpZmljIAotICogY29tbWFuZHMgYW5kIGRhdGEgbWFwcGluZ3MgYmV0d2VlbiBjb21tYW5kcyBhbmQgd2lkZ2V0cy4gIFdpZGdldCB0byBjb21tYW5kIG1hcHBpbmdzIGFyZQotICogcmVwbGFjZWQgYnkgQW50IHByb3BlcnR5IGZpbGUgdG8gY29tbWFuZCBtYXBwaW5ncyB3aGljaCBhcmUgZW5hYmxlZCBieSBhIGFudERhdGFNYXBwaW5nIGV4dGVuc2lvbiAKLSAqIHBvaW50IGluIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYgcGx1Z2luLgotICogCi0gKiBAYXV0aG9yIGpvYW4KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIEFudFNlcnZpY2VSb290Q29tbWFuZEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotCQotICBwdWJsaWMgQW50U2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQoKQotICB7IAotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2NlbmFyaW9DbGVhbnVwQ29tbWFuZCgpLCAiIiApKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudChuZXcgTGlzdE9wdGlvbnNDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkIChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEFudERlZmF1bHRpbmdPcGVyYXRpb24oKSwgIiIpKTsgICAgCi0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsgICAgCi0gICAgYWRkKCBuZXcgT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOyAgIAotICAgIGFkZCggbmV3IFNlcnZpY2VSb290RnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICBhZGQobmV3IEZpbmlzaEZyYWdtZW50KCkpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQW50UmVzdG9yaW5nQ29tbWFuZCgpLCAiIiApKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNjZW5hcmlvQ2xlYW51cENvbW1hbmQoKSwgIiIgKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7IAkKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsU2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsUHJvamVjdCIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbFByb2plY3QiLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiQ29tcG9uZW50TmFtZSIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluaXRpYWxDb21wb25lbnROYW1lIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkNvbXBvbmVudE5hbWUiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsQ29tcG9uZW50TmFtZSIsIG51bGwpOyAgICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7ICAgIAotCQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXZlbG9wU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQXNzZW1ibGVTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXBsb3lTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAgIAkKLSAgICAvLyBNYXAgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC4KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuY2xhc3MsICJUeXBlUnVudGltZVNlcnZlciIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkRldmVsb3BTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJBc3NlbWJsZVNlcnZpY2UiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkRlcGxveVNlcnZpY2UiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAgIAotICAgIC8vTWFwIEFudERlZmF1bHRpbmdGcmFnbWVudAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEFudERlZmF1bHRpbmdPcGVyYXRpb24uY2xhc3MsICJTZXJ2aWNlSWRzRml4ZWQiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEFudERlZmF1bHRpbmdPcGVyYXRpb24uY2xhc3MsICJDbGllbnRJZHNGaXhlZCIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQW50RGVmYXVsdGluZ09wZXJhdGlvbi5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQW50RGVmYXVsdGluZ09wZXJhdGlvbi5jbGFzcywgIkluc3RhbGxTZXJ2aWNlIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBbnREZWZhdWx0aW5nT3BlcmF0aW9uLmNsYXNzLCAiRGVwbG95U2VydmljZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gTWFwIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3ROYW1lIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFYXJQcm9qZWN0TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlQ29tcG9uZW50TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRWFyQ29tcG9uZW50TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlSjJFRVZlcnNpb24iLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZU5lZWRFQVIiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgCi0gICAgLy8gTWFwIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudC5jbGFzcyk7Ci0gICAgCSAgCi0JLy8gU2V0dXAgdGhlIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC4JCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwkJCQotCQotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlQ29tcG9uZW50VHlwZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZVR5cGUiLCBudWxsKTsKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZUNvbXBvbmVudFR5cGUiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VSdW50aW1lSWQiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVJ1bnRpbWVJZCIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VKMkVFVmVyc2lvbiIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0RUFSIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgbnVsbCApOwotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRldmVsb3BTZXJ2aWNlIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJBc3NlbWJsZVNlcnZpY2UiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIAotICAgIAotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgbmV3IFNlbGVjdGlvblRyYW5zZm9ybWVyKCkgKTsKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MgKTsKLQotICAgIC8vIE1hcCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kIGZvciBTZXJ2ZXJTdGFydCgpCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0RUFSIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkVhclByb2plY3ROYW1lIiwgbnVsbCk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQW50RGVmYXVsdGluZ09wZXJhdGlvbi5jbGFzcywgIlJlbmRlcmVyVmFsaWRhdGlvbiIsIEFudFJlc3RvcmluZ0NvbW1hbmQuY2xhc3MpOwotICAgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmMDE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMTMxIDEyMTA3MSAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lciAgICAgCi0gKiAyMDA2MDMzMCAxMjg4MjcgICBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA1MjQgICAxNDE5MjUga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlNrZWxldG9uTWVyZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uUmVxdWlyZWRGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLXB1YmxpYyBjbGFzcyBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0JcHJpdmF0ZSBJV2ViU2VydmljZQkJCQl3ZWJTZXJ2aWNlXzsKLQlwcml2YXRlIFN0cmluZwkJCQkJCXByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIG1vZHVsZV87Ci0JcHJpdmF0ZSBTdHJpbmcJCQkJCQllYXJQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJfOwotICBwcml2YXRlIElDb250ZXh0ICAgICAgICAgIGNvbnRleHRfOwotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0JICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCSAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCSAgCi0JICAvLyBGb3IgdG9wIGRvd24gc2NlbmFyaW9zLCBtZXJnZSB0aGUgY29udGVudCBvZiB0aGUgc2tlbGV0b24gZmlsZXMgd2l0aCB0aGUgcHJldmlvdXMgdmVyc2lvbiBzdG9yZWQuCSAgCi0JICAvLyBUaGUgV2ViIHNlcnZpY2UgZXh0ZW5zaW9ucyB0cmlnZ2VycyB0aGUgc3RvcmluZyBvZiB0aGUgY29udGVudCBvZiB0aGUgb2xkIHNrZWxldG9uIGZpbGUgYnkgCi0JICAvLyBjYWxsaW5nIFdlYlNlcnZpY2VJbmZvLnNldEltcGxVUkxzKCkgYmVmb3JlIHRoZSBuZXcgc2tlbGV0b24gaXMgZ2VuZXJhdGVkIGluIHRoZSBleHRlbnNpb24ncyAKLQkgIC8vIGRldmVsb3AoKSBtZXRob2QuCi0JICAKLQkgIGlmIChjb250ZXh0Xy5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pIHsKLQkJICBTa2VsZXRvbk1lcmdlQ29tbWFuZCBza2VsZXRvbk1lcmdlQ29tbWFuZCA9IG5ldyBTa2VsZXRvbk1lcmdlQ29tbWFuZChwcm9qZWN0Xyk7Ci0JCSAgc2tlbGV0b25NZXJnZUNvbW1hbmQuc2V0VXJscyh3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldEltcGxVUkxzKCkpOwotCQkgIHNrZWxldG9uTWVyZ2VDb21tYW5kLnNldEVudmlyb25tZW50KGVudmlyb25tZW50KTsKLQkJICBzdGF0dXMgPSBza2VsZXRvbk1lcmdlQ29tbWFuZC5leGVjdXRlKCBtb25pdG9yLCBhZGFwdGFibGUgKTsKLQkJICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSB7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0JCQkgIAotCSAgfQotCSAgCi0JICBpZiAoY29udGV4dF8uZ2V0QXNzZW1ibGUoKSkgewotCi0JCSAgLy8gQ2hlY2sgaWYgRUFSIG1vZHVsZSBpcyByZXEnZCwgaWUuICE9bnVsbAotCQkgIGlmIChlYXJQcm9qZWN0Xz09bnVsbCkKLQkJCSAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQotCi0JCSAgLy9DcmVhdGUgdGhlIHNlcnZpY2UgRUFSIG1vZHVsZQotCi0JCSAgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kKCk7Ci0JCSAgY29tbWFuZC5zZXRQcm9qZWN0TmFtZShlYXJQcm9qZWN0Xyk7Ci0JCSAgY29tbWFuZC5zZXRUZW1wbGF0ZUlkKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfVEVNUExBVEUpOwotCi0JCSAgLy8gUmVxdWlyZWRGYWNldFZlcnNpb25zIGlzIHNldCB0byBhbiBlbXB0eSBhcnJheSBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdG8gaW1wb3NlIGFueSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzLgotCQkgIC8vIFdlIGp1c3Qgd2FudCB0byBjcmVhdGUgdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgRUFSIHByb2plY3QgdGhhdCB0aGUgc2VsZWN0ZWQgc2VydmVyIHN1cHBvcnRzLgotCQkgIGNvbW1hbmQuc2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKG5ldyBSZXF1aXJlZEZhY2V0VmVyc2lvblswXSk7IAotCi0JCSAgY29tbWFuZC5zZXRTZXJ2ZXJGYWN0b3J5SWQod2ViU2VydmljZV8uZ2V0V2ViU2VydmljZUluZm8oKS5nZXRTZXJ2ZXJGYWN0b3J5SWQoKSk7Ci0JCSAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLQkJICBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoIG1vbml0b3IsIGFkYXB0YWJsZSApOwotCQkgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0JCSAgewotCQkJICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoIHN0YXR1cyApOwotCQkJICByZXR1cm4gc3RhdHVzOwotCQkgIH0gICAgICAgICAgICAgICAgCi0KLQkJICAvL0Fzc29jaWF0ZSB0aGUgc2VydmljZSBtb2R1bGUgYW5kIHNlcnZpY2UgRUFSCi0JCSAgQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQgYXNzb2NpYXRlQ29tbWFuZCA9IG5ldyBBc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZCgpOwotCQkgIGFzc29jaWF0ZUNvbW1hbmQuc2V0UHJvamVjdChwcm9qZWN0Xyk7Ci0JCSAgYXNzb2NpYXRlQ29tbWFuZC5zZXRNb2R1bGUobW9kdWxlXyk7Ci0JCSAgYXNzb2NpYXRlQ29tbWFuZC5zZXRFQVJQcm9qZWN0KGVhclByb2plY3RfKTsKLQkJICBhc3NvY2lhdGVDb21tYW5kLnNldEVhcihlYXJfKTsKLQkJICBhc3NvY2lhdGVDb21tYW5kLnNldEVudmlyb25tZW50KCBlbnZpcm9ubWVudCApOwotCQkgIHN0YXR1cyA9IGFzc29jaWF0ZUNvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotCQkgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQkgIHsKLQkJCSAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7CQkgIAotCQkgIH0JCQkKLQotCSAgfQotCSAgcmV0dXJuIHN0YXR1czsJICAKLSAgfQotCQotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KCBTdHJpbmcgcHJvamVjdCApCi0gIHsKLQkgIHByb2plY3RfID0gcHJvamVjdDsKLSAgfQotCSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0gIHsKLQkgIG1vZHVsZV8gPSBtb2R1bGU7Ci0gIH0JCi0JCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3QoIFN0cmluZyBlYXJQcm9qZWN0ICkKLSAgewotCSAgZWFyUHJvamVjdF8gPSBlYXJQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JICBlYXJfID0gZWFyOyAgCi0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZSggSVdlYlNlcnZpY2Ugd2ViU2VydmljZSApCi0gIHsKLQkgIHdlYlNlcnZpY2VfID0gd2ViU2VydmljZTsgIAotICB9CQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dCAoSUNvbnRleHQgY29udGV4dCkgewotCSAgY29udGV4dF8gPSBjb250ZXh0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlRGVwbG95Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZURlcGxveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1NTc1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlRGVwbG95Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIxICAgMTE5MTExIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFByZVNlcnZpY2VEZXBsb3lDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLXsKLSAgcHJpdmF0ZSBJQ29udGV4dCAgICBjb250ZXh0XzsKLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICAgIGlmIChjb250ZXh0Xy5nZXREZXBsb3koKSkKLSAgICAgIHsKLSAgICAgICAgLy9JZiBhbmQgd2hlbiB0aGVyZSBhcmUgZnJhbWV3b3JrIHNwZWNpZmljIGRlcGxveSB0aGluZ3MgdG8gYmUgZG9uZSwKLSAgICAgICAgLy9kbyB0aGVtIGhlcmUuCi0gICAgICB9Ci0gICAgICAKLQkgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KElDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICAgIGNvbnRleHRfPWNvbnRleHQ7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZURldmVsb3BDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0M2EzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAxMzEgMTIxMDcxICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDIyMSAgIDExOTExMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNTE2ICAgMTI2OTY1IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNzAxMjMgICAxNjc0ODcgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWsKLSAqIDIwMDcwNDAzICAgMTczNjU0IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUZhY2V0ZWRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5SZXF1aXJlZEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5jb21tb24uSFRUUFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuU2ltcGxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVN0YXRlOwotCi1wdWJsaWMgY2xhc3MgUHJlU2VydmljZURldmVsb3BDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXJfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHNlcnZpY2VSdW50aW1lSWRfOwotICBwcml2YXRlIElDb250ZXh0ICAgICAgICAgIGNvbnRleHRfOwotICBwcml2YXRlIElTZWxlY3Rpb24gICAgICAgIHNlbGVjdGlvbl87Ci0gIHByaXZhdGUgU3RyaW5nCQkJcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlXzsKLSAgcHJpdmF0ZSBTdHJpbmcJCQltb2R1bGVUeXBlXzsKLSAgcHJpdmF0ZSBTdHJpbmcJCQllYXJQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJfOwotCQotICBwcml2YXRlIElXZWJTZXJ2aWNlICAgICAgIHdlYlNlcnZpY2VfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGoyZWVMZXZlbF87Ci0gIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICAgcmVzb3VyY2VDb250ZXh0XzsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBkZXZlbG9wXzsKLSAgcHJpdmF0ZSBib29sZWFuIGFzc2VtYmxlXzsKLSAgcHJpdmF0ZSBib29sZWFuIGRlcGxveV87Ci0gIHByaXZhdGUgYm9vbGVhbiBpbnN0YWxsXzsKLSAgcHJpdmF0ZSBib29sZWFuIHJ1bl87Ci0gIHByaXZhdGUgYm9vbGVhbiBjbGllbnRfOwotICBwcml2YXRlIGJvb2xlYW4gdGVzdF87Ci0gIHByaXZhdGUgYm9vbGVhbiBwdWJsaXNoXzsKLSAgCi0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLQkgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkgIGlmIChkZXZlbG9wXykgewotCQkgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVudmlyb25tZW50KCk7Ci0KLQkJICAvLyBTcGxpdCB1cCB0aGUgcHJvamVjdCBhbmQgbW9kdWxlCi0JCSAgaW50IGluZGV4ID0gbW9kdWxlXy5pbmRleE9mKCIvIik7Ci0JCSAgaWYgKGluZGV4IT0tMSl7Ci0JCQkgIHByb2plY3RfID0gbW9kdWxlXy5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JCQkgIG1vZHVsZV8gPSBtb2R1bGVfLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJICB9Ci0KLQkJICBpZiAoZWFyXyE9bnVsbCAmJiBlYXJfLmxlbmd0aCgpPjApCi0JCSAgewotCQkJICBpbnQgZWFySW5kZXggPSBlYXJfLmluZGV4T2YoIi8iKTsKLQkJCSAgaWYgKGVhckluZGV4IT0tMSkgewotCQkJCSAgZWFyUHJvamVjdF8gPSBlYXJfLnN1YnN0cmluZygwLGVhckluZGV4KTsKLQkJCQkgIGVhcl8gPSBlYXJfLnN1YnN0cmluZyhlYXJJbmRleCsxKTsKLQkJCSAgfQotCQkgIH0KLQotCi0JCSAgSVdlYlNlcnZpY2VSdW50aW1lIHdzcnQgICA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZpY2VSdW50aW1lKCBzZXJ2aWNlUnVudGltZUlkXyApOwotCQkgIFdlYlNlcnZpY2VJbmZvICAgICB3c0luZm8gPSBuZXcgV2ViU2VydmljZUluZm8oKTsKLQotCQkgIHdzSW5mby5zZXRTZXJ2ZXJGYWN0b3J5SWQoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJZCgpICk7Ci0JCSAgd3NJbmZvLnNldFNlcnZlckluc3RhbmNlSWQoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQkgIHdzSW5mby5zZXRTdGF0ZSggV2ViU2VydmljZVN0YXRlLlVOS05PV05fTElURVJBTCApOwotCQkgIHdzSW5mby5zZXRXZWJTZXJ2aWNlUnVudGltZUlkKCB0eXBlUnVudGltZVNlcnZlcl8uZ2V0UnVudGltZUlkKCkgKTsKLQotCQkgIHdlYlNlcnZpY2VfICA9IHdzcnQuZ2V0V2ViU2VydmljZSggd3NJbmZvICk7Ci0KLQkJICAvL1NldCB1cCB0aGUgSUNvbnRleHQKLQkJICBXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW8gPSBudWxsOwotCQkgIGludCBzY2VuYXJpb0ludCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNjZW5hcmlvRnJvbVR5cGVJZCh0eXBlUnVudGltZVNlcnZlcl8uZ2V0VHlwZUlkKCkpOwotCQkgIGlmIChzY2VuYXJpb0ludCA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApCi0JCSAgewotCQkJICBzY2VuYXJpbyA9IFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUF9MSVRFUkFMOwotCQkJICBTdHJpbmcgaW1wbCA9IChTdHJpbmcpKHNlbGVjdGlvbl8uZ2V0U2VsZWN0aW9uKCkpWzBdOwotCQkJICB3c0luZm8uc2V0SW1wbFVSTChpbXBsKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoc2NlbmFyaW9JbnQgPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pCi0JCSAgewotCQkJICBzY2VuYXJpbyA9IFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOX0xJVEVSQUw7Ci0JCQkgIFN0cmluZyB3c2RsVVJMID0gKFN0cmluZykoc2VsZWN0aW9uXy5nZXRTZWxlY3Rpb24oKSlbMF07Ci0JCQkgIAotCQkJICAvLyBjaGVjayBmb3IgcmVkaXJlY3Rpb24gaW4gdGhlIHdzZGwKLQkJCSAgSFRUUFV0aWxpdHkgaHR0cFV0aWwgPSBuZXcgSFRUUFV0aWxpdHkoKTsKLQkJCSAgd3NJbmZvLnNldFdzZGxVUkwoaHR0cFV0aWwuaGFuZGxlUmVkaXJlY3Qod3NkbFVSTCkpOyAgICAgIAotCQkgIH0KLQotCQkgIGNvbnRleHRfICAgICA9IG5ldyBTaW1wbGVDb250ZXh0KGRldmVsb3BfLCBhc3NlbWJsZV8sIGRlcGxveV8sIGluc3RhbGxfLCBydW5fLCBjbGllbnRfLCB0ZXN0XywgcHVibGlzaF8sIAotCQkJCSAgc2NlbmFyaW8sIAotCQkJCSAgcmVzb3VyY2VDb250ZXh0Xy5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpLAotCQkJCSAgcmVzb3VyY2VDb250ZXh0Xy5pc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCksCi0JCQkJICByZXNvdXJjZUNvbnRleHRfLmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSk7Ci0KLQkJICAvLyBDcmVhdGUgdGhlIHNlcnZpY2UgbW9kdWxlIGlmIG5lZWRlZC4KLQkJICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3RfKTsKLQkJICBSZXF1aXJlZEZhY2V0VmVyc2lvbltdIHJmdiA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvckJ5SWQoc2VydmljZVJ1bnRpbWVJZF8pLmdldFJlcXVpcmVkRmFjZXRWZXJzaW9ucygpOwotCQkgIGlmICghcHJvamVjdC5leGlzdHMoKSkKLQkJICB7Ci0JCQkgIGJvb2xlYW4gbWF0Y2hlcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmRvZXNTZXJ2aWNlUnVudGltZVN1cHBvcnRUZW1wbGF0ZShzZXJ2aWNlUnVudGltZUlkXywgbW9kdWxlVHlwZV8pOwotCQkJICBpZiAobWF0Y2hlcykKLQkJCSAgewkJCQkgIAotCQkJCSAgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlRmFjZXRlZFByb2plY3RDb21tYW5kKCk7Ci0JCQkJICBjb21tYW5kLnNldFByb2plY3ROYW1lKHByb2plY3RfKTsKLQkJCQkgIGNvbW1hbmQuc2V0VGVtcGxhdGVJZChtb2R1bGVUeXBlXyk7Ci0JCQkJICBjb21tYW5kLnNldFJlcXVpcmVkRmFjZXRWZXJzaW9ucyhyZnYpOwotCQkJCSAgY29tbWFuZC5zZXRTZXJ2ZXJGYWN0b3J5SWQodHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFNlcnZlcklkKCkpOwotCQkJCSAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQkJCSAgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKCBtb25pdG9yLCBhZGFwdGFibGUgKTsKLQkJCQkgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0JCQkJICB7Ci0JCQkJCSAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCBzdGF0dXMgKTsKLQkJCQkJICByZXR1cm4gc3RhdHVzOwotCQkJCSAgfSAgICAgICAgCi0JCQkgIH0gICAgICAgICAgICAKLQkJICB9IGVsc2UgewotCQkJLy8gYWRkIGZhY2V0cyByZXF1aXJlZCBieSBXZWIgc2VydmljZSBydW50aW1lCi0JCSAgICAgICAgaWYgKHJmdi5sZW5ndGggIT0gMCkgewotCQkgICAgICAgIAlzdGF0dXMgPSBGYWNldFV0aWxzLmFkZFJlcXVpcmVkRmFjZXRzVG9Qcm9qZWN0KHByb2plY3QsIHJmdiwgbW9uaXRvcik7Ci0JCSAgICAgICAgCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0JCSAgICAgICAgCXsKLQkJICAgICAgICAJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvciggc3RhdHVzICk7Ci0JCSAgICAgICAgCQlyZXR1cm4gc3RhdHVzOwotCQkgICAgICAgIAl9ICAgICAgCi0JCSAgICAgICAgfQotCQkgIH0KLQkgIH0KLQkgIHJldHVybiBzdGF0dXM7Ci0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlciApCi0gIHsKLQkgIHR5cGVSdW50aW1lU2VydmVyXyA9IHR5cGVSdW50aW1lU2VydmVyOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VSdW50aW1lSWQoU3RyaW5nIGlkKQotICB7Ci0gICAgc2VydmljZVJ1bnRpbWVJZF8gPSBpZDsKLSAgfQotCSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VKMkVFVmVyc2lvbiggU3RyaW5nIGoyZWVMZXZlbCApCi0gIHsKLQlqMmVlTGV2ZWxfID0gajJlZUxldmVsOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SjJlZUxldmVsKCkKLSAgewotCSAgcmV0dXJuIGoyZWVMZXZlbF87ICAKLSAgfQotCQotICBwdWJsaWMgSVdlYlNlcnZpY2UgZ2V0V2ViU2VydmljZSgpCi0gIHsKLQlyZXR1cm4gd2ViU2VydmljZV87ICAKLSAgfQotICAKLSAgcHVibGljIElDb250ZXh0IGdldENvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRleHRfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQgKQotICB7Ci0gICAgcmVzb3VyY2VDb250ZXh0XyA9IHJlc291cmNlQ29udGV4dDsJICAKLSAgfQotICAKLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOwkgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oIElTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotCXNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0XzsJICAKLSAgfQotCSAKLSAgcHVibGljIFN0cmluZyBnZXRNb2R1bGUoKQotICB7Ci0gICAgcmV0dXJuIG1vZHVsZV87CSAgCi0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2V0TW9kdWxlKCBTdHJpbmcgbW9kdWxlICkKLSAgewotCSAgbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kdWxlVHlwZShTdHJpbmcgdHlwZSkKLSAgewotCSAgbW9kdWxlVHlwZV8gPSB0eXBlOwotICB9Ci0JCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWFyUHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gZWFyUHJvamVjdF87CSAgCi0gIH0KLQkKLSAgcHVibGljIFN0cmluZyBnZXRFYXIoKQotICB7Ci0JICByZXR1cm4gZWFyXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JICBlYXJfID0gZWFyOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluc3RhbGxTZXJ2aWNlKGJvb2xlYW4gaW5zdGFsbFNlcnZpY2UpCi0JewotCQlpbnN0YWxsXyA9IGluc3RhbGxTZXJ2aWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERldmVsb3BTZXJ2aWNlKGJvb2xlYW4gZGV2ZWxvcFNlcnZpY2UpIHsKLQkJZGV2ZWxvcF8gPSBkZXZlbG9wU2VydmljZTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHNldEFzc2VtYmxlU2VydmljZShib29sZWFuIGFzc2VtYmxlU2VydmljZSkgewotCQlhc3NlbWJsZV8gPSBhc3NlbWJsZVNlcnZpY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95U2VydmljZShib29sZWFuIGRlcGxveVNlcnZpY2UpIHsKLQkJZGVwbG95XyA9IGRlcGxveVNlcnZpY2U7Ci0JfQotICAKLQlwdWJsaWMgdm9pZCBzZXRTdGFydFNlcnZpY2UoYm9vbGVhbiBzdGFydFNlcnZpY2UpCi0JewotCQlydW5fID0gc3RhcnRTZXJ2aWNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZShib29sZWFuIHRlc3RTZXJ2aWNlKQotCXsKLQkJdGVzdF8gPSB0ZXN0U2VydmljZTsKLQl9CQotCQotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoU2VydmljZShib29sZWFuIHB1Ymxpc2hTZXJ2aWNlKQotICB7Ci0gICAgcHVibGlzaF8gPSBwdWJsaXNoU2VydmljZTsKLSAgfQotCQotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuUHJveHkpCi0gIHsKLSAgICBjbGllbnRfID0gZ2VuUHJveHk7ICAKLSAgfQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlYTQ2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlU2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgUHJlU2VydmljZUluc3RhbGxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0JcHJpdmF0ZSBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlXzsKLQlwcml2YXRlIFN0cmluZwkJcHJvamVjdF87Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICBtb2R1bGVfOwotCXByaXZhdGUgU3RyaW5nCQllYXJQcm9qZWN0XzsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgIGVhcl87Ci0gICAgcHJpdmF0ZSBJQ29udGV4dCAgICBjb250ZXh0XzsKLQkJCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0JICBpZiAoY29udGV4dF8uZ2V0SW5zdGFsbCgpKQotCSAgewotCSAgICAgICAgICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVudmlyb25tZW50KCk7ICAgICAgCi0JCQkgIAkJCQotCQkJCWlmICh3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKT09bnVsbCkKLQkJCQl7Ci0JCQkJCUNyZWF0ZVNlcnZlckNvbW1hbmQgY3JlYXRlU2VydmVyQ29tbWFuZCA9IG5ldyBDcmVhdGVTZXJ2ZXJDb21tYW5kKCk7Ci0JCQkJCWNyZWF0ZVNlcnZlckNvbW1hbmQuc2V0U2VydmVyRmFjdG9yeWlkKHdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCkpOwotCSAgICAgICAgICAgICAgICBjcmVhdGVTZXJ2ZXJDb21tYW5kLnNldEVudmlyb25tZW50KCBlbnZpcm9ubWVudCApOwotCQkJCQlJU3RhdHVzIGNyZWF0ZVNlcnZlclN0YXR1cyA9IGNyZWF0ZVNlcnZlckNvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCk7Ci0JCQkJCWlmIChjcmVhdGVTZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLk9LKQotCQkJCQl7Ci0JCQkJCQl3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldFNlcnZlckluc3RhbmNlSWQoY3JlYXRlU2VydmVyQ29tbWFuZC5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJaWYgKGNyZWF0ZVNlcnZlclN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JCQkJCQl7Ci0JCQkJCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGNyZWF0ZVNlcnZlclN0YXR1cyk7Ci0JCQkJCQl9CQkJCQkJCQkKLQkJCQkJCXJldHVybiBjcmVhdGVTZXJ2ZXJTdGF0dXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJICAKLQkJCQkKLQkJCQkKLQkJCQlBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQoKTsKLQkJCQljb21tYW5kLnNldFNlcnZlckluc3RhbmNlSWQod2ViU2VydmljZV8uZ2V0V2ViU2VydmljZUluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQkJCWlmIChlYXJQcm9qZWN0XyAhPSBudWxsICYmIGVhclByb2plY3RfLmxlbmd0aCgpPjAgJiYgZWFyXyE9IG51bGwgJiYgZWFyXy5sZW5ndGgoKT4wKQotCQkJCXsKLQkJCQkJY29tbWFuZC5zZXRQcm9qZWN0KGVhclByb2plY3RfKTsKLQkJCQkJY29tbWFuZC5zZXRNb2R1bGUoZWFyXyk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWNvbW1hbmQuc2V0UHJvamVjdChwcm9qZWN0Xyk7Ci0JCQkJCWNvbW1hbmQuc2V0TW9kdWxlKG1vZHVsZV8pOwkJCQkKLQkJCQl9Ci0JCi0JICAgICAgICAgICAgY29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52aXJvbm1lbnQgKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQkJCXsKLQkJCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJfQkJCQotCQkJICByZXR1cm4gc3RhdHVzOwotCQkgIH0KLQkJICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkgIH0KLQotCSAgcHVibGljIHZvaWQgc2V0UHJvamVjdCggU3RyaW5nIHByb2plY3QgKQotCSAgewotCQkgIHByb2plY3RfID0gcHJvamVjdDsKLQkgIH0KLQkJICAKLQkgIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0JICB7Ci0JCSAgbW9kdWxlXyA9IG1vZHVsZTsKLQkgIH0JCi0JCQotCSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotCSAgewotCQkgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgc2V0RWFyKCBTdHJpbmcgZWFyICkKLQkgIHsKLQkJICBlYXJfID0gZWFyOyAgCi0JICB9Ci0JCQotCSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZSggSVdlYlNlcnZpY2Ugd2ViU2VydmljZSApCi0JICB7Ci0JCSAgd2ViU2VydmljZV8gPSB3ZWJTZXJ2aWNlOyAgCi0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoSUNvbnRleHQgY29udGV4dCkKLQkgIHsKLQkJICBjb250ZXh0Xz1jb250ZXh0OwotCSAgfQotCQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VSdW5Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlUnVuQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzU4YmNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VSdW5Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuU3RhcnRTZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBQcmVTZXJ2aWNlUnVuQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIAotewotCXByaXZhdGUgSVdlYlNlcnZpY2UJCQkJd2ViU2VydmljZV87Ci0JcHJpdmF0ZSBJQ29udGV4dAkJCQljb250ZXh0XzsKLQkKLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLQkJICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JICAgICAgaWYgKGNvbnRleHRfLmdldFJ1bigpKQotCQkgIHsKLQkgICAgICAgICAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCQkJCQotCQkJCVN0YXJ0U2VydmVyQ29tbWFuZCBjb21tYW5kID0gbmV3IFN0YXJ0U2VydmVyQ29tbWFuZCgpOwotCQkJCWNvbW1hbmQuc2V0U2VydmVySW5zdGFuY2VJZCh3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0JICAgICAgICAgICAgY29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52aXJvbm1lbnQgKTsKLQkJCQlzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKTsKLQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLQkJCQl7Ci0JCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwkJCSAgCi0JCQkJfQotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gc3RhdHVzOwkJCQotCSAgfQotCQkKLQkgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgKQotCSAgewotCQkgIHdlYlNlcnZpY2VfID0gd2ViU2VydmljZTsgIAotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0IChJQ29udGV4dCBjb250ZXh0KQotCSAgewotCQkgIGNvbnRleHRfID0gY29udGV4dDsKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vU2VydmljZVJvb3RGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vU2VydmljZVJvb3RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWI0MzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1NlcnZpY2VSb290RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAxMzEgMTIxMDcxICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAKLSAqIDIwMDYwMjIxICAgMTE5MTExIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjAzMzEgICAxMjg4Mjcga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uLlByZUNsaWVudERldmVsb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkRhdGFPYmplY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkFzc2VtYmxlU2VydmljZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkRlcGxveVNlcnZpY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5EZXZlbG9wU2VydmljZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkluc3RhbGxTZXJ2aWNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuUnVuU2VydmljZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVJvb3RGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBTZXJ2aWNlUm9vdEZyYWdtZW50KCkKLSAgewotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlU2VydmljZURldmVsb3BDb21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBEZXZlbG9wU2VydmljZUZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IEFzc2VtYmxlU2VydmljZUZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZVNlcnZpY2VEZXBsb3lDb21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlU2VydmljZUluc3RhbGxDb21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBJbnN0YWxsU2VydmljZUZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZVNlcnZpY2VSdW5Db21tYW5kKCksIAotICAgIAkgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb24uUHJlU2VydmljZVJ1bkNvbW1hbmQiICkgKTsKLSAgICBhZGQoIG5ldyBSdW5TZXJ2aWNlRnJhZ21lbnQoKSApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkgCi0gIHsKLQkJLy9NYXBwaW5ncyBmcm9tIGZyYW1ld29yayB0byBleHRlbnNpb24gZnJhZ21lbnRzCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCi0JLy8gTWFwIHRoZSBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQgaW50byB0aGUgZGF0YU9iamVjdCBhbmQgdGhlIFByZUNsaWVudERldmVsb3BDb21tYW5kLgotCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBEYXRhT2JqZWN0Q29tbWFuZC5jbGFzcywgIkRhdGFPYmplY3QiLCBudWxsICk7Ci0JcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRGF0YU9iamVjdCIsIG51bGwgKTsKLQkJCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIEFzc2VtYmxlU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIERlcGxveVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIERlcGxveVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgRGVwbG95U2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIERlcGxveVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgRGVwbG95U2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBJbnN0YWxsU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBJbnN0YWxsU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBSdW5TZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCQotCQkvL01hcHBpbmdzIGZyb20gZnJhbWV3b3JrIHRvIGZyYW1ld29yayBjb21tYW5kcwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0JCQotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBQcmVTZXJ2aWNlRGVwbG95Q29tbWFuZC5jbGFzcyApOwotICAgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBQcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIFByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmNsYXNzICk7Ci0KLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBQcmVTZXJ2aWNlUnVuQ29tbWFuZC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIFByZVNlcnZpY2VSdW5Db21tYW5kLmNsYXNzICk7Ci0JCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2I4YTBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjQgICAxMTU2OTAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA2MDUwNCAgIDEzODExOCBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIENyZWF0aW9uIFVJIHBsdWdpbi4KLSogPHA+Ci0qIFRoZSBXZWIgU2VydmljZXMgQ3JlYXRpb24gVUkgcGx1Z2luJ3Mgc29sZSBmdW5jdGlvbiBpcyB0byBhZGQgCi0qIHVzZXIgaW50ZXJmYWNlIG9mIHRoZSBXZWIgU2VydmljZXMgQ3JlYXRpb24gV2l6YXJkLCBjb250YWluZWQgaW4gIAotKiB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpIHBsdWdpbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLQotICAvKioKLSAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbiBpbiBwbHVnaW4ueG1sLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiOwotCi0gIC8qKgotICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4gaW5zdGFuY2VfOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAqIFRoZSAicGx1Z2luIiBlbGVtZW50IGluIHBsdWdpbi54bWwgc2hvdWxkIGluY2x1ZGUgdGhlIGF0dHJpYnV0ZQotICAqIGNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4iLgotICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luLgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4gKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgaW5zdGFuY2VfID0gdGhpczsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0gICogKFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpIik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luIGdldEluc3RhbmNlICgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlCi0gICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgICogQHJldHVybiBBbiBpbWFnZSBkZXNjcmlwdG9yLCBwb3NzaWJseSBudWxsLgotICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvciAoIFN0cmluZyBuYW1lICkKLSAgIHsKLSAJdHJ5Ci0gICAgIHsJCi0gICAgIAlVUkwgaW1hZ2VVUkwgPSBGaWxlTG9jYXRvci5maW5kKGluc3RhbmNlXy5nZXRCdW5kbGUoKSwgbmV3IFBhdGgoIiRubCQvIituYW1lKSwgbnVsbCk7Ci0gICAgIAlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotICAgICB9Ci0gICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgewotICAgICAgIHJldHVybiBudWxsOwotICAgICB9Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3ByZWZlcmVuY2VzL1NjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlMDlmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3ByZWZlcmVuY2VzL1NjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxNyAgIDEzNjM5MSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgCi17Ci0JcHJpdmF0ZSBTZXJ2ZXJXaXphcmRXaWRnZXQgc2VydmVyV2lkZ2V0XyA9IG51bGw7Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgICB7IH0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgCi0JewotCSAgVUlVdGlscyB1dGlscyA9IG5ldyBVSVV0aWxzKG51bGwpOwotCSAgCi0JICBDb21wb3NpdGUgcGFnZSA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAxICk7Ci0JICAKLSAgICAgIHNlcnZlcldpZGdldF8gPSBuZXcgU2VydmVyV2l6YXJkV2lkZ2V0KCBmYWxzZSwgdHJ1ZSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5hZGRDb250cm9scyggcGFnZSwgbmV3IExpc3RlbmVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIEV2ZW50IGV2dCApe30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsgICAgICAKLQkgIGluaXRpYWxpemVWYWx1ZXMoKTsKLQkgIHNlcnZlcldpZGdldF8uZGlzYWJsZU5vblByZWZlcmVuY2VXaWRnZXRzKCk7Ci0JICBhcHBseURpYWxvZ0ZvbnQocGFnZSk7Ci0JICByZXR1cm4gcGFnZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0JewotCSAgU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0KLSAgICAgIC8vIFNldCB2YWx1ZXMgZnJvbSBjb250ZXh0LgotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmVySWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JICBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHMgPSBuZXcgVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQkJCi0JICBzZXJ2ZXJJZHMuc2V0VHlwZUlkKCBjb250ZXh0LmdldFdlYlNlcnZpY2VUeXBlKCkgKTsKLQkgIGNsaWVudElkcy5zZXRUeXBlSWQoIGNvbnRleHQuZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKSApOwotCQkKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBzZXJ2ZXJJZHMgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIGNsaWVudElkcyApOwotICAgICAgLy9qdmggc2VydmVyV2lkZ2V0Xy5zZXRHZW5lcmF0ZVByb3h5KCBuZXcgQm9vbGVhbihjb250ZXh0LmdldEdlbmVyYXRlUHJveHkoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0UHVibGlzaFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldEluc3RhbGxTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldEluc3RhbGxXZWJTZXJ2aWNlKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldEluc3RhbGxDbGllbnQoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0SW5zdGFsbENsaWVudCgpKSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRTdGFydFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0U3RhcnRXZWJTZXJ2aWNlKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFRlc3RTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldFRlc3RXZWJTZXJ2aWNlKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFRlc3RDbGllbnQoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0VGVzdFdlYlNlcnZpY2UoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0TW9uaXRvclNlcnZpY2UobmV3IEJvb2xlYW4oY29udGV4dC5nZXRNb25pdG9yV2ViU2VydmljZSgpKSk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFNlcnZpY2VHZW5lcmF0aW9uKGNvbnRleHQuZ2V0R2VuZXJhdGVXZWJTZXJ2aWNlKCkpOyAgLy9qdmggICAgICAKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0Q2xpZW50R2VuZXJhdGlvbihjb250ZXh0LmdldEdlbmVyYXRlQ2xpZW50KCkpOyAgLy9qdmgKLSAgICAgIHNlcnZlcldpZGdldF8uaW50ZXJuYWxpemUoKTsKLQl9Ci0JCi0gICAgLyoqCi0JICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0JewotCSAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JICBzZXRUb0RlZmF1bHRzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRUb0RlZmF1bHRzKCkKLQl7Ci0JICBTY2VuYXJpb0NvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKTsKLQotICAgICAgLy8gU2V0IHZhbHVlcyBmcm9tIGNvbnRleHQuCi0JICBUeXBlUnVudGltZVNlcnZlciBzZXJ2ZXJJZHMgPSBuZXcgVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQkgIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkcyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotCQkKLQkgIHNlcnZlcklkcy5zZXRUeXBlSWQoIGNvbnRleHQuZ2V0V2ViU2VydmljZVR5cGVEZWZhdWx0KCkgKTsKLQkgIGNsaWVudElkcy5zZXRUeXBlSWQoIGNvbnRleHQuZ2V0Q2xpZW50V2ViU2VydmljZVR5cGVEZWZhdWx0KCkgKTsKLQkJCi0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlciggc2VydmVySWRzICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBjbGllbnRJZHMgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0UHVibGlzaFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyRGVmYXVsdCgpKSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRJbnN0YWxsU2VydmljZSggbmV3IEJvb2xlYW4oY29udGV4dC5nZXRJbnN0YWxsV2ViU2VydmljZURlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0SW5zdGFsbENsaWVudCggbmV3IEJvb2xlYW4oY29udGV4dC5nZXRJbnN0YWxsQ2xpZW50RGVmYXVsdCgpKSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRTdGFydFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpKSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRUZXN0U2VydmljZSggbmV3IEJvb2xlYW4oY29udGV4dC5nZXRUZXN0V2ViU2VydmljZURlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0VGVzdENsaWVudCggbmV3IEJvb2xlYW4oY29udGV4dC5nZXRUZXN0V2ViU2VydmljZURlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0TW9uaXRvclNlcnZpY2UobmV3IEJvb2xlYW4oY29udGV4dC5nZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKSkpOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRTZXJ2aWNlR2VuZXJhdGlvbihjb250ZXh0LmdldEdlbmVyYXRlV2ViU2VydmljZURlZmF1bHQoKSk7IC8vanZoCi0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldENsaWVudEdlbmVyYXRpb24oY29udGV4dC5nZXRHZW5lcmF0ZUNsaWVudERlZmF1bHQoKSk7IC8vanZoCi0gICAgICBzZXJ2ZXJXaWRnZXRfLmludGVybmFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLQl7Ci0JICBzdG9yZVZhbHVlcygpOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLQl7Ci0JICBTY2VuYXJpb0NvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKTsKLQkgIAotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmVySWRzID0gc2VydmVyV2lkZ2V0Xy5nZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQkgIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkcyA9IHNlcnZlcldpZGdldF8uZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQkgIAotICAgICAgY29udGV4dC5zZXRXZWJTZXJ2aWNlVHlwZSggc2VydmVySWRzLmdldFR5cGVJZCgpICk7Ci0gICAgICBjb250ZXh0LnNldENsaWVudFdlYlNlcnZpY2VUeXBlKCBjbGllbnRJZHMuZ2V0VHlwZUlkKCkgKTsKLSAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVQcm94eSggc2VydmVyV2lkZ2V0Xy5nZXRHZW5lcmF0ZVByb3h5KCkuYm9vbGVhblZhbHVlKCkgKTsKLSAgICAgIGNvbnRleHQuc2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCBzZXJ2ZXJXaWRnZXRfLmdldFB1Ymxpc2hTZXJ2aWNlKCkuYm9vbGVhblZhbHVlKCkgKTsKLSAgICAgIGNvbnRleHQuc2V0SW5zdGFsbFdlYlNlcnZpY2UoIHNlcnZlcldpZGdldF8uZ2V0SW5zdGFsbFNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRJbnN0YWxsQ2xpZW50KCBzZXJ2ZXJXaWRnZXRfLmdldEluc3RhbGxDbGllbnQoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRTdGFydFdlYlNlcnZpY2UoIHNlcnZlcldpZGdldF8uZ2V0U3RhcnRTZXJ2aWNlKCkuYm9vbGVhblZhbHVlKCkgKTsKLSAgICAgIGNvbnRleHQuc2V0VGVzdFdlYlNlcnZpY2UoIHNlcnZlcldpZGdldF8uZ2V0VGVzdFNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRNb25pdG9yV2ViU2VydmljZShzZXJ2ZXJXaWRnZXRfLmdldE1vbml0b3JTZXJ2aWNlKCkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdlYlNlcnZpY2Uoc2VydmVyV2lkZ2V0Xy5nZXRTZXJ2aWNlR2VuZXJhdGlvbigpKTsgICAgICAKLSAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVDbGllbnQoc2VydmVyV2lkZ2V0Xy5nZXRDbGllbnRHZW5lcmF0aW9uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotCXsKLQkgIHBlcmZvcm1PaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvc2VydmVyL1N0YXJ0U2VydmVyV2lkZ2V0Q29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvc2VydmVyL1N0YXJ0U2VydmVyV2lkZ2V0Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5NmMxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3NlcnZlci9TdGFydFNlcnZlcldpZGdldENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnNlcnZlci5TdGFydFNlcnZlcldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdGFydFNlcnZlcldpZGdldENvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgCi17Ci0gIHByaXZhdGUgSVNlcnZlciAgICAgIHNlcnZlcl87Ci0JICAKLSAgcHVibGljIFN0YXJ0U2VydmVyV2lkZ2V0Q29udHJpYnV0b3IoIElTZXJ2ZXIgc2VydmVyICkKLSAgewotCXNlcnZlcl8gPSBzZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSAKLSAgewotCXJldHVybiBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1dTX1NUQVJUX1NFUlZFUjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIAotICB7Ci0JcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIAotICB7Ci0JcmV0dXJuIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX1dTX1NUQVJUX1NFUlZFUjsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZ2V0V2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgCi0gIHsKLQlyZXR1cm4gbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JICAgICAgIHsKLQkJCSBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgCi0JCQkgewotCQkJCXJldHVybiBuZXcgU3RhcnRTZXJ2ZXJXaWRnZXQoIHNlcnZlcl8gKTsKLSAJCQkgfQotCSAgICAgICB9OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3NlcnZlci9TdGFydFNlcnZlcldpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvc2VydmVyL1N0YXJ0U2VydmVyV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2YyZjgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvc2VydmVyL1N0YXJ0U2VydmVyV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuc2VydmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbi5QcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLQotcHVibGljIGNsYXNzIFN0YXJ0U2VydmVyV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSAKLXsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZSB3ZWJzZXJ2aWNlXzsKLSAgcHJpdmF0ZSBJQ29udGV4dCBjb250ZXh0XzsKLSAgCi0gIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgCi0gIHsKLSAgICBJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHdlYnNlcnZpY2VfICE9IG51bGwgJiYgY29udGV4dF8uZ2V0UnVuKCkpCi0gICAgewotICAgICAgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHdlYnNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpICk7Ci0gICAgfQotICAgIAotICAgIGlmKCBzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhcnRTZXJ2ZXJXaWRnZXRDb250cmlidXRvciggc2VydmVyICk7Ci0gICAgfQotICAgIAotCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldCggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIAotICB7Ci0JcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgCi0gIHsKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFN0YXJ0U2VydmVyV2lkZ2V0RmFjdG9yeS5jbGFzcyApOwotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgU3RhcnRTZXJ2ZXJXaWRnZXRGYWN0b3J5LmNsYXNzICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlIHdlYnNlcnZpY2UgKQotICB7Ci0gICAgd2Vic2VydmljZV8gPSB3ZWJzZXJ2aWNlOyAgCi0gIH0KLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dCAoIElDb250ZXh0IGNvbnRleHQgKQotICB7Ci0gICAgY29udGV4dF8gPSBjb250ZXh0OyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkZjY2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQwNyAgIDEzNTQxNSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDA3ICAgMTM1NDQzIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNDEwICAgMTM1NDQyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDQxMCAgIDEzNTQ0MSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQxMCAgIDEzNTU2MiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQxMSAgIDEzNjE2NyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA0MTcgICAxMzYzOTAvMTM2MzkxLzEzNjE1OSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQxMyAgIDEzNTU4MSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDIwICAgMTM2MTU4IHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjAgICAxMzY3MDUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQyMCAgIDEzNjE4MiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA0MjAgICAxMzc4MjAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQyMCAgIDEzNTkxMiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQyMSAgIDEzNjc2MSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI0ICAgMTM4MDUyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDQyNSAgIDEzNzgzMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI2ICAgMTM4NTE5IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNDI3ICAgMTM4MDU4IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNTA0ICAgMTM4MDM1IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNTI0ICAgMTQyMjc2IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDYwNSAgIDE0NTA4MSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDYwNyAgIDE0NDgyNiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDYwNyAgIDE0NDA0OSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDYxNCAgIDE0NjI3MCBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDYxNiAgIDE0NzMxNyBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDcxNyAgIDE1MDU3NyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1hawotICogMjAwNjA3MjYgICAxNTA4NjUgc2VuZ3BsQGNhLmlibS5jb20gLSAgU2VuZyBQaHVuZy1MdQotICogMjAwNjA4MDMgICAxNTI0ODYgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFR5cGluZyBXU0RMIGluIFNlcnZpY2UgZGVmaW5pdGlvbiBmaWVsZCBpcyB2ZXJ5IHNsb3cKLSAqIDIwMDYwODE3ICAgMTQwMDE3IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBsb25nZXIgcHJvamVjdCBvciBzZXJ2ZXIvcnVudGltZSBzdHJpbmdzIGRvIG5vdCByZXNpemUgd2l6YXJkCi0gKiAyMDA2MDgyNSAgIDEzNTU3MCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgU2VydmljZSBpbXBsZW1lbnRhdGlvbiBVUkwgbm90IGRpc3BsYXllZCBwcm9wZXJseSBvbiBmaXJzdCBwYWdlCi0gKiAyMDA2MDgyOSAgIDE1NTQ0MSBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgd2ViIHNlcnZpY2Ugd2l6YXJkIGhhbmdzIGR1cmluZyByZXNpemUKLSAqIDIwMDYwODMwICAgMTU1MTE0IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2ssIFVwZGF0ZWQgcGF0Y2ggZm9yIHRoaXMgZGVmZWN0LgotICogMjAwNjA4MzEgICAxNTU0NDEgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFNtYWxsIHR3ZWFrIGZvciB0aGlzIGJ1ZwotICogMjAwNjEwMDMgICAxNTkxNDIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYxMjEyICAgMTY0MTc3IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBJbmNvcnJlY3QgdmFsaWRhdGlvbiBlcnJvciBjb21wbGFpbmluZyBhYm91dCBydW50aW1lIG5vdCBzdXBwb3J0aW5nIGEgcHJvamVjdCB0eXBlCi0gKiAyMDA2MTIxMiAgIDE1OTkxMSBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgY2hhbmdpbmcgc2VydmljZSBkZWZpbml0aW9uIHJlc2V0cyBzb21lIGNvbmZpZ3VyYXRpb24gZmllbGRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkRlZmF1bHRpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlZhbGlkYXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLklPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLklQYWNrYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5Qcm9qZWN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5JT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5UaW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLlByb2plY3RTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5SdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLkxhYmVsc0FuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjYWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5QYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotcHVibGljIGNsYXNzIFNlcnZlcldpemFyZFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBJUGFja2FibGUgewotCQotCS8vSU5GT1BPUFMKLSAgICAvKiBDT05URVhUX0lEIFdTV1NDRU4wMDAxIGZvciB0aGUgU2NlbmFyaW8gUGFnZSAqLwotCXByaXZhdGUgU3RyaW5nIElORk9QT1BfV1NXU0NFTl9QQUdFID0gIldTV1NDRU4wMDAxIjsKLQkgLyogQ09OVEVYVF9JRCBXU1dTQ0VOMDAxMCBmb3IgdGhlIFdlYiBTZXJ2aWNlIFR5cGUgY29tYm8gYm94IG9mIHRoZSBTY2VuYXJpbyBQYWdlICovCi0JIHByaXZhdGUgU3RyaW5nIElORk9QT1BfV1NXU0NFTl9DT01CT19TRVJWSUNFVFlQRSA9ICJXU1dTQ0VOMDAxMCI7Ci0JIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMTQgZm9yIHRoZSBtb25pdG9yIHNlcnZpY2UgY2hlY2tib3ggb2YgdGhlIFNjZW5hcmlvIHBhZ2UgKi8KLQkgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9XU1dTQ0VOX0NIRUNLQk9YX01PTklUT1JfU0VSVklDRSA9ICJXU1dTQ0VOMDAxNCI7Ci0JIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMTIgZm9yIHRoZSBMYXVuY2ggVURESSBjaGVjayBib3ggb2YgdGhlIFNjZW5hcmlvIFBhZ2UgKi8KLQkgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9XU1dTQ0VOX0NIRUNLQk9YX0xBVU5DSF9XUyA9ICJXU1dTQ0VOMDAxMiI7Ci0JIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMjAgZm9yIHRoZSBTZXJ2aWNlIEltcGxlbWVuYXRpb24gdGV4dCBmaWVsZCBvZiB0aGUgU2NlbmFyaW8gUGFnZSAqLwotCSBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1dTV1NDRU5fVEVYVF9TRVJWSUNFX0lNUEwgPSAiV1NXU0NFTjAwMjAiOwotCSAvKiBDT05URVhUX0lEIFdTV1NDRU4wMDIxIGZvciB0aGVTZXJ2aWNlIFNsaWRlciBvZiB0aGUgU2NlbmFyaW8gUGFnZSAqLwotCSBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1dTV1NDRU5fU0NBTEVfU0VSVklDRSA9ICJXU1dTQ0VOMDAyMSI7Ci0JIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMjIgZm9yIHRoZSBTZXJ2ZXIgaHlwZXJsaW5rIG9mIHRoZSBTY2VuYXJpbyBQYWdlICovCi0JIHByaXZhdGUgU3RyaW5nIElORk9QT1BfV1NXU0NFTl9IWVBFUkxJTktfU0VSVkVSID0gIldTV1NDRU4wMDIyIjsKLQkgLyogQ09OVEVYVF9JRCBXU1dTQ0VOMDAyMyBmb3IgdGhlIFJ1bnRpbWUgaHlwZXJsaW5rIG9mIHRoZSBTY2VuYXJpbyBQYWdlICovCi0JIHByaXZhdGUgU3RyaW5nIElORk9QT1BfV1NXU0NFTl9IWVBFUkxJTktfUlVOVElNRSA9ICJXU1dTQ0VOMDAyMyI7Ci0JIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMjQgZm9yIHRoZVByb2plY3RzIGh5cGVybGluayBvZiB0aGUgU2NlbmFyaW8gUGFnZSAqLwotCSBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1dTV1NDRU5fSFlQRVJMSU5LX1BST0pFQ1RTICA9ICJXU1dTQ0VOMDAyNCI7Ci0JIC8qIENPTlRFWFRfSUQgV1NXU0NFTjAwMzAgZm9yIHRoZSBPdmVyd3JpdGUgRmlsZXMgY2hlY2tib3ggb2YgdGhlIFNjZW5hcmlvIFBhZ2UgKi8KLQkgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9XU1dTQ0VOX0NIRUNLQk9YX09WRVJXUklURSA9ICJXU1dTQ0VOMDAzMCI7Ci0JIAotCXByaXZhdGUgU2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBzY2FsZVNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNjYWxlU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQlwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyXzsKLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG9iamVjdE1vZGlmeUxpc3RlbmVyXyA7Ci0JcHJpdmF0ZSBpbnQgdmFsaWRhdGlvblN0YXRlXzsKLQlib29sZWFuIHZhbGlkT2JqZWN0U2VsZWN0aW9uXyA9IHRydWU7Ci0KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdfOwotCQotCXByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzXzsKLQlwcml2YXRlIExhYmVsc0FuZElkcyBsYWJlbElkc187Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmljZVByb2plY3ROYW1lXzsKLQlwcml2YXRlIFN0cmluZyBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfOwotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VDb21wb25lbnRUeXBlXzsKLQlwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcl87Ci0JcHJpdmF0ZSBib29sZWFuIG5lZWRFYXJfOwotCQkgCi0JcHJpdmF0ZSBib29sZWFuIGRldmVsb3BTZXJ2aWNlXzsKLQlwcml2YXRlIGJvb2xlYW4gYXNzZW1ibGVTZXJ2aWNlXzsKLQlwcml2YXRlIGJvb2xlYW4gZGVwbG95U2VydmljZV87Ci0JCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb25fOwotCXByaXZhdGUgQm9vbGVhbiB0ZXN0U2VydmljZV87Ci0JcHJpdmF0ZSBCb29sZWFuIHN0YXJ0U2VydmljZV87Ci0JcHJpdmF0ZSBCb29sZWFuIGluc3RhbGxTZXJ2aWNlXzsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5UHJlZmVyZW5jZXNfOwotCXByaXZhdGUgYm9vbGVhbiBwcmVmZXJlbmNlc1BhZ2VfOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZ3JvdXBDb21wb3NpdGVfOwotCXByaXZhdGUgQ29tcG9zaXRlIGhDb21wU2VydmljZV87CQotCXByaXZhdGUgV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQgY2xpZW50V2lkZ2V0XzsKLSAgICBwcml2YXRlIExhYmVsIHNlcnZpY2VMYWJlbF87Ci0JcHJpdmF0ZSBDb21ibyB3ZWJzZXJ2aWNlVHlwZV87Ci0JcHJpdmF0ZSBUZXh0IHNlcnZpY2VJbXBsXzsKLQlwcml2YXRlIFNjYWxlIHNlcnZpY2VTY2FsZV87Ci0JcHJpdmF0ZSBMYWJlbCB0b3BvbG9neVNwb3RfOwotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbl87Ci0JcHJpdmF0ZSBCdXR0b24gcHVibGlzaEJ1dHRvbl87Ci0JcHJpdmF0ZSBCdXR0b24gbW9uaXRvckJ1dHRvbl87Ci0JcHJpdmF0ZSBCdXR0b24gb3ZlcndyaXRlQnV0dG9uXzsJCi0JcHJpdmF0ZSBTZXJ2aWNlSW1wbFNlbGVjdGlvbkRpYWxvZyBicm93c2VEaWFsb2dfOwotCXByaXZhdGUgUHJvamVjdFNlbGVjdGlvbkRpYWxvZyBwcm9qZWN0RGlhbG9nXzsKLQlwcml2YXRlIEh5cGVybGluayBoTGlua1NlcnZpY2VSdW50aW1lXzsKLQlwcml2YXRlIEh5cGVybGluayBoTGlua1NlcnZpY2VTZXJ2ZXJfOwotCXByaXZhdGUgSHlwZXJsaW5rIGhMaW5rU2VydmljZVByb2plY3RfOwotCXByaXZhdGUgSHlwZXJsaW5rIGhMaW5rU2VydmljZUVBUl87Ci0JCQotCXByaXZhdGUgT2JqZWN0IG9iamVjdFNlbGVjdGlvbldpZGdldF87IC8vbWF5IGJlIElPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlIG9yIElPYmplY3RTZWxlY3Rpb25XaWRnZXQKLQkKLQlwcml2YXRlIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHRfOwotCQotCXByaXZhdGUgVGltZXIgdGltZXJfID0gbnVsbDsKLQkJCi0JcHJpdmF0ZSBVSVV0aWxzIHV0aWxzXyA9IG5ldyBVSVV0aWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VSZWZyZXNoUnVudGltZSA9IGZhbHNlOwotCQotCXByaXZhdGUgU3RyaW5nIEdSQVBISUNfU0VSVklDRV8wPSJpY29ucy9zZXJ2aWNlX3Rlc3QuanBnIjsgLy8kTk9OLU5MUy1OJAotCXByaXZhdGUgU3RyaW5nIEdSQVBISUNfU0VSVklDRV8xPSJpY29ucy9zZXJ2aWNlX3J1bi5qcGciOyAgLy8kTk9OLU5MUy1OJAotCXByaXZhdGUgU3RyaW5nIEdSQVBISUNfU0VSVklDRV8yPSJpY29ucy9zZXJ2aWNlX2luc3RhbGwuanBnIjsgLy8kTk9OLU5MUy1OJAotCXByaXZhdGUgU3RyaW5nIEdSQVBISUNfU0VSVklDRV8zPSJpY29ucy9zZXJ2aWNlX2RlcGxveS5qcGciOyAvLyROT04tTkxTLU4kCi0JcHJpdmF0ZSBTdHJpbmcgR1JBUEhJQ19TRVJWSUNFXzQ9Imljb25zL3NlcnZpY2VfYXNzZW1ibGUuanBnIjsgLy8kTk9OLU5MUy1OJAotCXByaXZhdGUgU3RyaW5nIEdSQVBISUNfU0VSVklDRV81PSJpY29ucy9zZXJ2aWNlX2RldmVsb3AuanBnIjsgLy8kTk9OLU5MUy1OJAotCQkKLQlwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzA9Imljb25zL3NjYWxlMF9iZ3JvdW5kLmpwZyI7IC8vJE5PTi1OTFMtTiQKLQlwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzE9Imljb25zL3NjYWxlMV9iZ3JvdW5kLmpwZyI7IC8vJE5PTi1OTFMtTiQKLQlwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzI9Imljb25zL3NjYWxlMl9iZ3JvdW5kLmpwZyI7IC8vJE5PTi1OTFMtTiQKLQlwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzM9Imljb25zL3NjYWxlM19iZ3JvdW5kLmpwZyI7IC8vJE5PTi1OTFMtTiQKLQlwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzQ9Imljb25zL3NjYWxlNF9iZ3JvdW5kLmpwZyI7IC8vJE5PTi1OTFMtTiQKLQlwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzU9Imljb25zL3NjYWxlNV9iZ3JvdW5kLmpwZyI7IC8vJE5PTi1OTFMtTiQKLQlwcml2YXRlIFN0cmluZyBJQ09OX1NDQUxFX0JHXzY9Imljb25zL3NjYWxlNl9iZ3JvdW5kLmpwZyI7IC8vJE5PTi1OTFMtTiQKLQotCXByaXZhdGUgU3RyaW5nIFNFUlZJQ0VfUlVOVElNRV9QUkVGSVggPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfUlVOVElNRVNfTElTVCA7IAotICAgIHByaXZhdGUgU3RyaW5nIFNFUlZJQ0VfU0VSVkVSX1BSRUZJWCA9ICBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU0VSVkVSU19MSVNUOwotICAgIHByaXZhdGUgU3RyaW5nIFNFUlZJQ0VfUFJPSkVDVF9QUkVGSVggPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU0VSVklDRV9QUk9KRUNUOwotICAgIHByaXZhdGUgU3RyaW5nIFNFUlZJQ0VfRUFSX1BSRUZJWCA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TRVJWSUNFX0VBUl9QUk9KRUNUOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBkaXNwbGF5UHJlZmVyZW5jZXMgU2V0IHRvIHRydWUgaWYgcHJlZmVyZW5jZXMgc3VjaCBhcyBvdmVyd3JpdGUgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGUgd2l6YXJkIHBhZ2UKLSAgICAgKiBAcGFyYW0gcHJlZlBhZ2UgIFNldCB0byB0cnVlIGlmIHRoZSB3aWRnZXQgaXMgYmVpbmcgdXNlZCBvbiB0aGUgcHJlZmVyZW5jZXMgcGFnZS4gIEFsdGVycyB3aWRnZXQgbGF5b3V0LgotICAgICAqLwotCXB1YmxpYyBTZXJ2ZXJXaXphcmRXaWRnZXQoYm9vbGVhbiBkaXNwbGF5UHJlZmVyZW5jZXMsIGJvb2xlYW4gcHJlZlBhZ2UpIHsKLQkJZGlzcGxheVByZWZlcmVuY2VzXyA9IGRpc3BsYXlQcmVmZXJlbmNlczsKLQkJcHJlZmVyZW5jZXNQYWdlXyA9IHByZWZQYWdlOwotCQlpbml0SW1hZ2VSZWdpc3RyeSgpOwotCQl2YWxpZGF0aW9uU3RhdGVfID0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX0FMTDsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgc2VydmljZUNvbXBvc2l0ZV87Ci0JCi0JLyoqCi0JICogUnVuIHRoaXMgU2VydmVyV2l6YXJkV2lkZ2V0LCB3aGljaCB2YWxpZGF0ZXMgdGhlIGVudHJ5IGZpZWxkIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQotCQkvLyBkbyBtaW5pbWFsIGNoZWNrIGhlcmUsIHRoaXMgY2FsbCB3aWxsIGRldGVybWluZSBpZiB3ZSBhdCBsZWFzdAotCQkvLyBoYXZlIGEgInZhbGlkT2JqZWN0U2VsZWN0aW9uXyIKLQkJY2hlY2tTZXJ2aWNlSW1wbFRleHRTdGF0dXMoKTsKLQkJCi0JCWlmICh2YWxpZE9iamVjdFNlbGVjdGlvbl8pCi0JCXsKLQkJCWJvb2xlYW4gcmVmcmVzaFJ1bnRpbWUgPSAoZ2V0V2ViU2VydmljZVNjZW5hcmlvKCkgIT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pOyAKLQkJCQotCQkJaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldF8gaW5zdGFuY2VvZiBJT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSkKLQkJICAgICAgIHsKLQkJCQlJT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSBsYXVuY2hhYmxlID0gKElPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlKW9iamVjdFNlbGVjdGlvbldpZGdldF87Ci0JCQkJY2FsbE9iamVjdFRyYW5zZm9ybWF0aW9uKGxhdW5jaGFibGUuZ2V0T2JqZWN0U2VsZWN0aW9uKCksIGxhdW5jaGFibGUuZ2V0UHJvamVjdCgpLCBsYXVuY2hhYmxlLmdldENvbXBvbmVudE5hbWUoKSwgcmVmcmVzaFJ1bnRpbWUpOwkJCQkJCQkJCi0JCSAgICAgICB9Ci0JCQllbHNlIAotCQkJewotCQkJCUlPYmplY3RTZWxlY3Rpb25XaWRnZXQgd2lkZ2V0ID0gKElPYmplY3RTZWxlY3Rpb25XaWRnZXQpb2JqZWN0U2VsZWN0aW9uV2lkZ2V0XzsKLQkJCQljYWxsT2JqZWN0VHJhbnNmb3JtYXRpb24od2lkZ2V0LmdldE9iamVjdFNlbGVjdGlvbigpLCB3aWRnZXQuZ2V0UHJvamVjdCgpLCB3aWRnZXQuZ2V0Q29tcG9uZW50TmFtZSgpLCByZWZyZXNoUnVudGltZSk7Ci0JCSAgICB9CQotCQl9Ci0JCWVsc2UKLQkJCXNldE9iamVjdFNlbGVjdGlvbihudWxsKTsKLQkJCi0JCS8vIGRvIGZ1bGwgdmFsaWRhdGlvbiBhZnRlciBhbGwgdHJhbnNmb3JtYXRpb25zIGFuZCBjYWxjdWxhdGlvbnMgaGF2ZSBvY2N1cnJlZAotCQl2YWxpZGF0aW9uU3RhdGVfID0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX0FMTDsKLQkJc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwkJCi0JfQotCQotCS8qKgotCSAqIFBhY2sgdGhpcyB3aWRnZXQgYW5kIHRoZSBjbGllbnQtc2lkZSB3aWRnZXQgYXMgd2VsbC4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhY2tTZWxmKCkgewotCQkvLyBkb24ndCBuZWVkIHRvIGNhbGwgcGFja0l0KCksIHNpbmNlIGNsaWVudFdpZGdldF8gaGFzIGEgY2FsbGJhY2sgdG8gcGFja0l0KCkgYWxyZWFkeS4KLQkJY2xpZW50V2lkZ2V0Xy5wYWNrSXQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuSVBhY2thYmxlI3BhY2tJdCgpCi0JICovCi0JcHVibGljIHZvaWQgcGFja0l0KCkgewkJCi0JCWdyb3VwQ29tcG9zaXRlXy5wYWNrKHRydWUpOwotCQl1dGlsc18uaG9yaXpvbnRhbFJlc2l6ZShncm91cENvbXBvc2l0ZV8uZ2V0U2hlbGwoKSwgZ3JvdXBDb21wb3NpdGVfLCBVSVV0aWxzLkRFRkFVTFRfUEFERElORyk7Ci0JfQotCQotCXB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotCQkJCQotCQlzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsKLQkJdXRpbHNfLmNyZWF0ZUluZm9Qb3AocGFyZW50LCBJTkZPUE9QX1dTV1NDRU5fUEFHRSk7Ci0JCQotCQlDb21wb3NpdGUgdHlwZUNvbXBvc2l0ZSA9IHV0aWxzXy5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAzKTsKLQotCQl3ZWJzZXJ2aWNlVHlwZV8gPSB1dGlsc18uY3JlYXRlQ29tYm8odHlwZUNvbXBvc2l0ZSwKLQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfV0VCU0VSVklDRVRZUEUsCi0JCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdQUl9DT01CT19UWVBFLAotCQkJCUlORk9QT1BfV1NXU0NFTl9DT01CT19TRVJWSUNFVFlQRSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIKLQkJCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkYXRhMSA9IChHcmlkRGF0YSkgd2Vic2VydmljZVR5cGVfLmdldExheW91dERhdGEoKTsKLQkJZ2RhdGExLmhvcml6b250YWxTcGFuID0gMjsKLQkJd2Vic2VydmljZVR5cGVfLnNldExheW91dERhdGEoZ2RhdGExKTsKLQkJCi0JCXdlYnNlcnZpY2VUeXBlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZFR5cGVJZCA9IGlkc18uZ2V0VHlwZUlkKCk7Ci0JCQkJaW50IGN1cnJlbnRTZWxlY3Rpb25JZHggPSB3ZWJzZXJ2aWNlVHlwZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlTdHJpbmcgY3VycmVudFR5cGVJZCA9IGxhYmVsSWRzXy5nZXRJZHNfKClbY3VycmVudFNlbGVjdGlvbklkeF07Ci0JCQkJaW50IG9sZFNjZW5hcmlvID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2NlbmFyaW9Gcm9tVHlwZUlkKG9sZFR5cGVJZCk7Ci0JCQkJaW50IGN1cnJlbnRTY2VuYXJpbyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNjZW5hcmlvRnJvbVR5cGVJZChjdXJyZW50VHlwZUlkKTsKLQkJCQlpZiAoIW9sZFR5cGVJZC5lcXVhbHMoY3VycmVudFR5cGVJZCkpIHsJCQkJCQotCQkJCQlpZHNfLnNldFR5cGVJZChjdXJyZW50VHlwZUlkKTsKLQotCQkJICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0XyA9IGdldFNlbGVjdGlvbldpZGdldCgpOwotCQkJCQkvLyBjaGFuZ2UgdGhlIGxhYmVsIGZvciB0aGUgc2VydmljZQotCQkJCQkvLyBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIGJhc2VkIG9uIHRoZSB3ZWIgc2VydmljZSB0eXBlCi0JCQkJCWhhbmRsZVR5cGVDaGFuZ2UoKTsJCQkJCQotCi0JCQkJCS8vIEFmdGVyIGJ1ZyAxNTk5MTEsIHdlIHdpbGwgbm90IHJlZnJlc2ggdGhlIHJ1bnRpbWUgaW4gVE9QRE9XTiBzY2VuYXJpbyB1bmxlc3Mgd2UgYWJzb2x1dGVseQotCQkJCQkvLyBoYXZlIHRvLiAgVGhlcmVmb3JlLCBpZiB3ZSBhcmUgc3dpdGNoaW5nIGZyb20gYW5vdGhlciBzY2VuYXJpbyB0eXBlLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIAotCQkJCQkvLyBjdXJyZW50IHNlbGVjdGlvbnMgYXJlIHZhbGlkIGZvciB0aGlzIFRPUERPV04gc2NlbmFyaW8sIGlmIG5vdCwgdHJ5IHRvIHBpY2sgYSBtb3JlIHN1aXRhYmxlIAotCQkJCQkvLyBydW50aW1lLgotCQkJCQlpZiAoY3VycmVudFNjZW5hcmlvID09IFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSB7Ci0JCQkJCQl2YWxpZGF0aW9uU3RhdGVfID0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1NFUlZFUl9SVU5USU1FX0NIQU5HRVM7Ci0JCQkJCQkKLQkJCQkJCS8vIHRoaXMgd2lsbCBmb3JjZSBhIHJlZnJlc2ggdGhlIG5leHQgdGltZSB0aGUgd3NkbCBpcyBjaGFuZ2VkCi0JCQkJCQlmb3JjZVJlZnJlc2hSdW50aW1lID0gIWNoZWNrRXJyb3JTdGF0dXMoKS5pc09LKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vaWYgdGhlIHdlYiBzZXJ2aWNlIHR5cGUgY2hhbmdlIGlzIGZyb20gb25lIHRvcC1kb3duIHR5cGUgdG8gYW5vdGhlcgotCQkJCQkvL3RvcC1kb3duIHR5cGUgbGVhdmUgdGhlIG9iamVjdCBzZWxlY3Rpb24gZmllbGQgaW4gdGFjdCBhbmQgcmVmcmVzaAotCQkJCQkvL3RoZSBzZXJ2ZXIvcnVudGltZSBwcm9qZWN0IGRlZmF1bHRpbmcuCi0JCQkJCS8vT3RoZXJ3aXNlIGNsZWFyIHRoZSBvYmplY3Qgc2VsZWN0aW9uIGZpZWxkIHNpbmNlIGl0J3MgdmFsdWUgaXMgbm90IHZhbGlkIGFueW1vcmUKLQkJCQkJaWYgKG9sZFNjZW5hcmlvPT1XZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTiAmJiBjdXJyZW50U2NlbmFyaW89PVdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKQkJCQkJCQotCQkJCQl7Ci0JCQkJCQkvLyBpZiBzd2l0Y2hpbmcgZnJvbSBvbmUgVE9QRE9XTiBzY2VuYXJpbyB0byBhbm90aGVyIFRPUERPV04gc2NlbmFyaW8gYW5kCi0JCQkJCQkvLyB3ZSd2ZSBkZXRlcm1pbmVkIHRoYXQgdGhlIGN1cnJlbnQgcnVudGltZSBzZWxlY3Rpb24gaXMgbm90IHN1aXRhYmxlLCB3ZSAKLQkJCQkJCS8vIGNhbiByZWZyZXNoIHRoZSBydW50aW1lIG5vdyAoZG9uJ3QgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dCB0aW1lIHRoZQotCQkJCQkJLy8gd3NkbCBpcyBjaGFuZ2VkKS4KLQkJCQkJCWlmIChmb3JjZVJlZnJlc2hSdW50aW1lKSB7Ci0JCQkJCQkJcmVmcmVzaFNlcnZlclJ1bnRpbWVTZWxlY3Rpb24oKTsKLQkJCQkJCQlmb3JjZVJlZnJlc2hSdW50aW1lID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkvL2NsZWFyIHRoZSBvYmplY3Qgc2VsZWN0aW9uIGZpZWxkCi0JCQkJCQkvLyBzZXJ2aWNlSW1wbCBtYXkgYmUgbnVsbCBpZiBvbiB0aGUgcHJlZmVyZW5jZXMgcGFnZQotCQkJCQkJaWYgKHNlcnZpY2VJbXBsXyAhPSBudWxsKQotCQkJCQkJewotCQkJCQkJCXNlcnZpY2VJbXBsXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihvYmplY3RNb2RpZnlMaXN0ZW5lcl8pOwotCQkJCQkJCXNlcnZpY2VJbXBsXy5zZXRUZXh0KCIiKTsKLQkJCQkJCQlzZXRPYmplY3RTZWxlY3Rpb24obnVsbCk7Ci0JCQkJCQkJc2VydmljZUltcGxfLmFkZE1vZGlmeUxpc3RlbmVyKG9iamVjdE1vZGlmeUxpc3RlbmVyXyk7Ci0JCQkJCQl9CQkJCQkJICAgCi0JCQkJCX0JCQkJCQotCQkJICAgdmFsaWRhdGlvblN0YXRlXyA9IFZhbGlkYXRpb25VdGlscy5WQUxJREFURV9BTEw7Ci0JCQkgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7CQkJICAgCi0JCQkJCQotCQkJfQotCQkgIH0KLQkJCQotCQl9KTsKLQkJCi0JCS8vIENyZWF0ZSB0ZXh0IGZpZWxkIGFuZCBicm93c2UgZm9yIG9iamVjdCBzZWxlY3Rpb24gaWYgbm90IG9uIHByZWZlcmVuY2VzIHBhZ2UKLQkJaWYgKCFwcmVmZXJlbmNlc1BhZ2VfKQotCQl7Ci0JCQkvL3RleHQgb2YgdGhpcyBsYWJlbCBpcyBiYXNlZCBvbiB0aGUgd2ViIHNlcnZpY2UgdHlwZSBzZWxlY3RlZCBpbiB3ZWJzZXJ2aWNlVHlwZV8gY29tYm8KLQkJCXNlcnZpY2VMYWJlbF8gPSBuZXcgTGFiZWwoIHR5cGVDb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCXNlcnZpY2VMYWJlbF8uc2V0VGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfV0VCU0VSVklDRUlNUEwpOwotCQkJc2VydmljZUxhYmVsXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1RFWFRfSU1QTCk7Ci0KLQkJCXNlcnZpY2VJbXBsXyA9IG5ldyBUZXh0KHR5cGVDb21wb3NpdGUsIFNXVC5MRUZUIHwgU1dULkJPUkRFUiApOwotCQkJR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsJCSAgICAKLQkJCXNlcnZpY2VJbXBsXy5zZXRMYXlvdXREYXRhKCBncmlkZGF0YSApOwotCQkJc2VydmljZUltcGxfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fVEVYVF9JTVBMKTsKLQkJCXV0aWxzXy5jcmVhdGVJbmZvUG9wKHNlcnZpY2VJbXBsXywgSU5GT1BPUF9XU1dTQ0VOX1RFWFRfU0VSVklDRV9JTVBMKTsKLQkJCQotCQkJb2JqZWN0TW9kaWZ5TGlzdGVuZXJfID0gbmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJICAgIGlmIChzZXJ2aWNlSW1wbF8uZ2V0VGV4dCgpLmluZGV4T2YoJzonKSA+IDApIHsKLQkJCQkgICAgICAgIHRpbWVyXyA9IFRpbWVyLm5ld0luc3RhbmNlKHRpbWVyXywgRGlzcGxheS5nZXRDdXJyZW50KCksIFNlcnZlcldpemFyZFdpZGdldC50aGlzKTsKLQkJCQkgICAgICAgIHRpbWVyXy5zdGFydFRpbWVyKCk7Ci0JCQkJICAgIH0KLQkJCQkgICAgZWxzZQotCQkJCSAgICAgICAgcnVuKCk7Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJc2VydmljZUltcGxfLmFkZE1vZGlmeUxpc3RlbmVyKG9iamVjdE1vZGlmeUxpc3RlbmVyXyk7Ci0KLQkJCWJyb3dzZUJ1dHRvbl8gPSB1dGlsc18uY3JlYXRlUHVzaEJ1dHRvbih0eXBlQ29tcG9zaXRlLAotCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX0JST1dTRSwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9CVVRUT05fQlJPV1NFX0lNUEwsIG51bGwpOwotCi0JCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQlicm93c2VEaWFsb2dfID0gbmV3IFNlcnZpY2VJbXBsU2VsZWN0aW9uRGlhbG9nKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCAKLQkJCQkJbmV3IFBhZ2VJbmZvKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5ESUFMT0dfVElUSUxFX1NFUlZJQ0VfSU1QTF9TRUxFQ1RJT04sICIiLCAKLQkJCQkJCQluZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLQkJCQkJewkKLQkJCQkJCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkJCQkJewkgIAkJCQkJCSAKLQkJCQkJCQlyZXR1cm4gbmV3IE9iamVjdFNlbGVjdGlvbldpZGdldCgpOwotCQkJCQkJfQotCQkJCQl9KSk7CQkKLQkJCWJyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlcnZpY2VJbXBsQnJvd3NlTGlzdGVuZXIoKSk7Ci0JCX0KLQkJLy8gU2VydmljZSBMaWZlY3ljbGUgc2VjdGlvbiAtIHNjYWxlcyBmb3Igc2VydmljZSAmIGNsaWVudCwgZ3JhcGhpYwotCQkKLQkJZ3JvdXBDb21wb3NpdGVfID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBnY2xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdjbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlnY2xheW91dC5ob3Jpem9udGFsU3BhY2luZz0wOwkJCi0JCWdjbGF5b3V0Lm1hcmdpbkhlaWdodD0wOwkJCi0JCWdjbGF5b3V0Lm1hcmdpbkJvdHRvbT01OwotCQlncm91cENvbXBvc2l0ZV8uc2V0TGF5b3V0KCBnY2xheW91dCApOwotCSAgICBHcmlkRGF0YSBnY0dyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5CRUdJTk5JTkcsIHRydWUsIHRydWUpOwotCSAgICBncm91cENvbXBvc2l0ZV8uc2V0TGF5b3V0RGF0YShnY0dyaWREYXRhKTsJCQotCSAgICAKLQkgICAgZ3JvdXBDb21wb3NpdGVfLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCQotCQkJfQotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlncm91cENvbXBvc2l0ZV8ucGFjayh0cnVlKTsJCQkJCi0JCQl9Ci0JCX0pOwotCSAgICAKLQkJc2VydmljZUNvbXBvc2l0ZV8gPSAgbmV3IENvbXBvc2l0ZShncm91cENvbXBvc2l0ZV8sIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkbGF5b3V0ICAgPSBuZXcgR3JpZExheW91dCgpOwotCSAgICBncmlkbGF5b3V0Lm51bUNvbHVtbnMgICA9IDI7Ci0JICAgIGdyaWRsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmc9MDsKLQkgICAgZ3JpZGxheW91dC5tYXJnaW5IZWlnaHQ9MDsKLQkgICAgc2VydmljZUNvbXBvc2l0ZV8uc2V0TGF5b3V0KCBncmlkbGF5b3V0ICk7Ci0JICAgIEdyaWREYXRhIHNjR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkgICAgc2VydmljZUNvbXBvc2l0ZV8uc2V0TGF5b3V0RGF0YShzY0dyaWREYXRhKTsgICAgCi0JICAgIAotCQlzZXJ2aWNlQ29tcG9zaXRlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1NFUlZJQ0UpOwotCQotCQkKLQkJc2VydmljZVNjYWxlXyA9IG5ldyBTY2FsZShzZXJ2aWNlQ29tcG9zaXRlXywgU1dULlZFUlRJQ0FMIHwgU1dULkJPUkRFUik7Ci0JICAgIHV0aWxzXy5jcmVhdGVJbmZvUG9wKHNlcnZpY2VTY2FsZV8sIElORk9QT1BfV1NXU0NFTl9TQ0FMRV9TRVJWSUNFKTsKLQkJc2VydmljZVNjYWxlXy5zZXRNaW5pbXVtKDApOwotCQlzZXJ2aWNlU2NhbGVfLnNldE1heGltdW0oNik7Ci0JCXNlcnZpY2VTY2FsZV8uc2V0SW5jcmVtZW50KDEpOwotCQlzZXJ2aWNlU2NhbGVfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNjYWxlU2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzZXJ2aWNlU2NhbGVfLnNldFNlbGVjdGlvbihnZXRTZXJ2aWNlR2VuZXJhdGlvbigpKTsKLQkJc2VydmljZVNjYWxlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1NFUlZJQ0UpOwotCQkKLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlU2NhbGUgPSBzZXJ2aWNlU2NhbGVfLmdldEFjY2Vzc2libGUoKTsKLQkJYWNjZXNzaWJsZVNjYWxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKXsKLQkJCS8vCXJldHVybiBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB3aGF0IHRvIGRvIHdpdGggdGhlIHNsaWRlcgotCQkJLy8gIHRoaXMgaXMgcmVhZCBieSB0aGUgc2NyZWVuIHJlYWRlciB3aGVuIHRoZSBzbGlkZXIgZmlyc3QgZ2V0cyBmb2N1cwotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWUucmVzdWx0ID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9TRVJWSUNFOwkJCQotCQkJfQkJCQotCQl9KTsKLQkJYWNjZXNzaWJsZVNjYWxlLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpewotCQkJLy8gcmV0dXJuIGEgbWVhbmluZ2Z1bCBzdHJpbmcgd2hlbiB0aGUgc2NyZWVuIHJlYWRlcgotCQkJLy8gYXR0ZW1wdHMgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzZXJ2aWNlIHNjYWxlCi0JCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpbnQgc2VsZWN0aW9uID0gc2VydmljZVNjYWxlXy5nZXRTZWxlY3Rpb24oKTsKLQkJCQlzd2l0Y2ggKHNlbGVjdGlvbikgewotCQkJCWNhc2UgMDoKLQkJCQkJZS5yZXN1bHQgPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1RFU1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJZS5yZXN1bHQgPSBDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX1JVTjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQllLnJlc3VsdCA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfSU5TVEFMTDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQllLnJlc3VsdCA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfREVQTE9ZOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6Ci0JCQkJCWUucmVzdWx0ID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9BU1NFTUJMRTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1OgkJCQkJCi0JCQkJY2FzZSA2OgotCQkJCQllLnJlc3VsdCA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfREVWRUxPUDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQkJCQkJCQkJCi0JCQl9Ci0JCX0pOwkKLQkJCi0JCUdyaWREYXRhIGxheW91dERhdGExID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGExLmhvcml6b250YWxBbGlnbm1lbnQ9U1dULkNFTlRFUjsKLQkJbGF5b3V0RGF0YTEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlSZWN0YW5nbGUgc2NhbGVSID0gKGltYWdlUmVnXy5nZXQoSUNPTl9TQ0FMRV9CR18wKSkuZ2V0Qm91bmRzKCk7Ci0JCWxheW91dERhdGExLmhlaWdodEhpbnQ9c2NhbGVSLmhlaWdodDsKLQkJbGF5b3V0RGF0YTEud2lkdGhIaW50PXNjYWxlUi53aWR0aCsxOwotCQlzZXJ2aWNlU2NhbGVfLnNldExheW91dERhdGEobGF5b3V0RGF0YTEpOwkJCi0JCQotCQl0b3BvbG9neVNwb3RfID0gbmV3IExhYmVsKHNlcnZpY2VDb21wb3NpdGVfLCBTV1QuQk9SREVSIHwgU1dULlRPUCApOwotCQl0b3BvbG9neVNwb3RfLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCXRvcG9sb2d5U3BvdF8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9TRVJWSUNFKTsKLQkJCi0JCUdyaWREYXRhIGxheW91dERhdGEyID0gbmV3IEdyaWREYXRhKCk7CQkKLQkJbGF5b3V0RGF0YTIuaG9yaXpvbnRhbEFsaWdubWVudD1TV1QuQkVHSU5OSU5HOwkJCQkKLQkJbGF5b3V0RGF0YTIudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlSZWN0YW5nbGUgdG9wUiA9IChpbWFnZVJlZ18uZ2V0KEdSQVBISUNfU0VSVklDRV8wKSkuZ2V0Qm91bmRzKCk7Ci0JCWxheW91dERhdGEyLmhlaWdodEhpbnQ9dG9wUi5oZWlnaHQ7Ci0JCWxheW91dERhdGEyLndpZHRoSGludD10b3BSLndpZHRoOwotCQl0b3BvbG9neVNwb3RfLnNldExheW91dERhdGEobGF5b3V0RGF0YTIpOwkJCi0JCQkJCi0JCXNldEdyYXBoaWNzKGdldFNlcnZpY2VHZW5lcmF0aW9uKCkpOwotCQkKLQkJaENvbXBTZXJ2aWNlXyA9IHV0aWxzXy5jcmVhdGVDb21wb3NpdGUoZ3JvdXBDb21wb3NpdGVfLCAxKTsKLQkJCi0JCUxhYmVsIHNlcnZpY2VEZXRhaWxzTGFiZWwgPSBuZXcgTGFiZWwoaENvbXBTZXJ2aWNlXywgU1dULk5PTkUpOwotCQlzZXJ2aWNlRGV0YWlsc0xhYmVsLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1NVTU1BUlkpOwotCQkKLQkJaExpbmtTZXJ2aWNlU2VydmVyXz0gbmV3IEh5cGVybGluayhoQ29tcFNlcnZpY2VfLCBTV1QuTlVMTCk7Ci0JCXV0aWxzXy5jcmVhdGVJbmZvUG9wKGhMaW5rU2VydmljZVNlcnZlcl8sIElORk9QT1BfV1NXU0NFTl9IWVBFUkxJTktfU0VSVkVSKTsKLQkJaExpbmtTZXJ2aWNlU2VydmVyXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QV1JTX1RFWFRfU0VSVkVSKTsKLQkJaExpbmtTZXJ2aWNlU2VydmVyXy5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSUh5cGVybGlua0xpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpewkJCQkKLQkJCQlsYXVuY2hSdW50aW1lU2VsZWN0aW9uRGlhbG9nKGZhbHNlLCB0cnVlKTsJCQkJCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChIeXBlcmxpbmtFdmVudCBlKXt9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpe30JCQkKLQkJfSk7Ci0KLQkJaExpbmtTZXJ2aWNlUnVudGltZV8gPSBuZXcgSHlwZXJsaW5rKGhDb21wU2VydmljZV8sIFNXVC5OVUxMKTsKLQkJdXRpbHNfLmNyZWF0ZUluZm9Qb3AoaExpbmtTZXJ2aWNlUnVudGltZV8sIElORk9QT1BfV1NXU0NFTl9IWVBFUkxJTktfUlVOVElNRSk7Ci0JCWhMaW5rU2VydmljZVJ1bnRpbWVfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BXUlNfVEVYVF9SVU5USU1FKTsKLQkJaExpbmtTZXJ2aWNlUnVudGltZV8uYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IElIeXBlcmxpbmtMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKXsKLQkJCQkJCQkJbGF1bmNoUnVudGltZVNlbGVjdGlvbkRpYWxvZyhmYWxzZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChIeXBlcmxpbmtFdmVudCBlKXt9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpe30JCQkKLQkJfSk7Ci0JCQotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCXByb2plY3REaWFsb2dfID0gbmV3IFByb2plY3RTZWxlY3Rpb25EaWFsb2cod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIAotCQkJCW5ldyBQYWdlSW5mbyhDb25zdW1wdGlvblVJTWVzc2FnZXMuRElBTE9HX1RJVElMRV9TRVJWSUNFX1BST0pFQ1RfU0VUVElOR1MsICIiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAJCQkJCQl7CQotICAJCQkJCQkJcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gIAkJCQkJCQl7CSAgCQkJCQkJIAotICAJCQkJCQkJICAgcmV0dXJuIG5ldyBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gIAkJCQkJCQl9Ci0gIAkJCQkJCX0pKTsKLQkJCi0JCWhMaW5rU2VydmljZVByb2plY3RfPSBuZXcgSHlwZXJsaW5rKGhDb21wU2VydmljZV8sIFNXVC5OVUxMKTsKLQkJdXRpbHNfLmNyZWF0ZUluZm9Qb3AoaExpbmtTZXJ2aWNlUnVudGltZV8sIElORk9QT1BfV1NXU0NFTl9IWVBFUkxJTktfUFJPSkVDVFMpOwotCQloTGlua1NlcnZpY2VQcm9qZWN0Xy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NFUlZJQ0VQUk9KRUNUX0xJTkspOwotCQloTGlua1NlcnZpY2VQcm9qZWN0Xy5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSUh5cGVybGlua0xpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpewotCQkJCWxhdW5jaFByb2plY3REaWFsb2coKTsJCQkJCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChIeXBlcmxpbmtFdmVudCBlKXt9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpe30JCQkKLQkJfSk7Ci0JCQotCQloTGlua1NlcnZpY2VFQVJfPSBuZXcgSHlwZXJsaW5rKGhDb21wU2VydmljZV8sIFNXVC5OVUxMKTsKLQkJdXRpbHNfLmNyZWF0ZUluZm9Qb3AoaExpbmtTZXJ2aWNlUnVudGltZV8sIElORk9QT1BfV1NXU0NFTl9IWVBFUkxJTktfUFJPSkVDVFMpOwotCQloTGlua1NlcnZpY2VFQVJfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0VSVklDRVBST0pFQ1RfTElOSyk7Ci0JCWhMaW5rU2VydmljZUVBUl8uYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IElIeXBlcmxpbmtMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKXsKLQkJCQlsYXVuY2hQcm9qZWN0RGlhbG9nKCk7CQkJCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChIeXBlcmxpbmtFdmVudCBlKXt9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpe30JCQkKLQkJfSk7CQkKLQotCQloTGlua1NlcnZpY2VTZXJ2ZXJfLnNldFRleHQoU0VSVklDRV9TRVJWRVJfUFJFRklYKTsgCi0JCWhMaW5rU2VydmljZVJ1bnRpbWVfLnNldFRleHQoU0VSVklDRV9SVU5USU1FX1BSRUZJWCk7Ci0JCWhMaW5rU2VydmljZVByb2plY3RfLnNldFRleHQoU0VSVklDRV9QUk9KRUNUX1BSRUZJWCk7Ci0JCWhMaW5rU2VydmljZUVBUl8uc2V0VGV4dChTRVJWSUNFX0VBUl9QUkVGSVgpOwotCQkKLQkJSHlwZXJsaW5rR3JvdXAgc2VydmVyUnVudGltZUdyb3VwID0gbmV3IEh5cGVybGlua0dyb3VwKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJCi0JCXNlcnZlclJ1bnRpbWVHcm91cC5hZGQoaExpbmtTZXJ2aWNlU2VydmVyXyk7Ci0JCXNlcnZlclJ1bnRpbWVHcm91cC5hZGQoaExpbmtTZXJ2aWNlUnVudGltZV8pOwotCQlzZXJ2ZXJSdW50aW1lR3JvdXAuYWRkKGhMaW5rU2VydmljZVByb2plY3RfKTsKLQkJc2VydmVyUnVudGltZUdyb3VwLmFkZChoTGlua1NlcnZpY2VFQVJfKTsKLQkJc2VydmVyUnVudGltZUdyb3VwLnNldEh5cGVybGlua1VuZGVybGluZU1vZGUoSHlwZXJsaW5rU2V0dGluZ3MuVU5ERVJMSU5FX0FMV0FZUyk7Ci0gICAgCi0JCXV0aWxzXy5jcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKHBhcmVudCwgMSk7CQkKLQkJCi0JCS8vIEFkZCBjbGllbnQgd2lkZ2V0cy4uLgotCQljbGllbnRXaWRnZXRfID0gbmV3IFdlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0KGZhbHNlKTsKLQkgICAgY2xpZW50V2lkZ2V0Xy5hZGRDb250cm9scyhwYXJlbnQsIHN0YXR1c0xpc3RlbmVyICk7Ci0JICAgIGNsaWVudFdpZGdldF8uc2V0UGFja2FibGUodGhpcyk7Ci0JICAgIGNsaWVudFdpZGdldF8uZW5hYmxlQ2xpZW50U2xpZGVyKHNlcnZpY2VTY2FsZV8uZ2V0U2VsZWN0aW9uKCk8PVNjZW5hcmlvQ29udGV4dC5XU19TVEFSVCk7Ci0JCQotCQkvLyBBZHZhbmNlZCBidXR0b25zIHNlY3Rpb24KLQkJdXRpbHNfLmNyZWF0ZUhvcml6b250YWxTZXBhcmF0b3IocGFyZW50LCAzKTsKLQkJCi0JCUNvbXBvc2l0ZSBhZHZhbmNlZEJ1dHRvblBhbmVsID0gdXRpbHNfLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkKLQkJcHVibGlzaEJ1dHRvbl8gPSB1dGlsc18uY3JlYXRlQ2hlY2tib3goYWR2YW5jZWRCdXR0b25QYW5lbCwKLQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVUVE9OX1dTV1NDRU5fUFVCTElTSCwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdQUl9DSEVDS0JPWF9MQVVOQ0hfV1MsIElORk9QT1BfV1NXU0NFTl9DSEVDS0JPWF9MQVVOQ0hfV1MpOwkJCi0JCW1vbml0b3JCdXR0b25fID0gdXRpbHNfLmNyZWF0ZUNoZWNrYm94KGFkdmFuY2VkQnV0dG9uUGFuZWwsCi0JCQkJQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkNIRUNLQk9YX01PTklUT1JfV0VCU0VSVklDRSwgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UsIElORk9QT1BfV1NXU0NFTl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UpOwotCi0JCWlmIChkaXNwbGF5UHJlZmVyZW5jZXNfICYmIGdldFJlc291cmNlQ29udGV4dCgpLmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkpIHsKLQkJCXV0aWxzXy5jcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKHBhcmVudCwgMSk7CQkJCi0JCQlDb21wb3NpdGUgcHJlZkJ1dHRvblBhbmVsID0gdXRpbHNfLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkJb3ZlcndyaXRlQnV0dG9uXyA9IHV0aWxzXy5jcmVhdGVDaGVja2JveChwcmVmQnV0dG9uUGFuZWwsCi0JCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fQlVUVE9OX09WRVJXUklURV9GSUxFUywgSU5GT1BPUF9XU1dTQ0VOX0NIRUNLQk9YX09WRVJXUklURSk7Ci0JCQlvdmVyd3JpdGVCdXR0b25fLnNldFNlbGVjdGlvbihnZXRSZXNvdXJjZUNvbnRleHQoKQotCQkJCQkuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpczsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBsYXVuY2hQcm9qZWN0RGlhbG9nKCkKLQl7Ci0JCVN0cmluZyBjdXJyZW50UHJvamVjdE5hbWUgPSBnZXRTZXJ2aWNlUHJvamVjdE5hbWUoKTsKLQkJU3RyaW5nIGN1cnJlbnRFYXJQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VFYXJQcm9qZWN0TmFtZSgpOwotCQlTdHJpbmcgY3VycmVudFByb2plY3RUeXBlID0gZ2V0U2VydmljZUNvbXBvbmVudFR5cGUoKTsKLQkJYm9vbGVhbiBjdXJyZW50TmVlZEVhciA9IGdldFNlcnZpY2VOZWVkRUFSKCk7Ci0JCQotCQlwcm9qZWN0RGlhbG9nXy5zZXRQcm9qZWN0TmFtZShjdXJyZW50UHJvamVjdE5hbWUpOwotCQlwcm9qZWN0RGlhbG9nXy5zZXRFYXJQcm9qZWN0TmFtZShjdXJyZW50RWFyUHJvamVjdE5hbWUpOwotCQlwcm9qZWN0RGlhbG9nXy5zZXRQcm9qZWN0Q29tcG9uZW50VHlwZShjdXJyZW50UHJvamVjdFR5cGUpOwotCQlwcm9qZWN0RGlhbG9nXy5zZXROZWVkRUFSKGN1cnJlbnROZWVkRWFyKTsKLQkJCi0JCWludCBzdGF0dXMgPSBwcm9qZWN0RGlhbG9nXy5vcGVuKCk7Ci0JCWlmIChzdGF0dXMgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQlTdHJpbmcgbmV3UHJvamVjdE5hbWUgPSBwcm9qZWN0RGlhbG9nXy5nZXRQcm9qZWN0TmFtZSgpOwotCQkJU3RyaW5nIG5ld0VhclByb2plY3ROYW1lID0gcHJvamVjdERpYWxvZ18uZ2V0RWFyUHJvamVjdE5hbWUoKTsKLQkJCVN0cmluZyBuZXdQcm9qZWN0VHlwZSA9IHByb2plY3REaWFsb2dfLmdldFByb2plY3RDb21wb25lbnRUeXBlKCk7Ci0JCQlib29sZWFuIG5ld05lZWRFYXIgPSBwcm9qZWN0RGlhbG9nXy5nZXROZWVkRUFSKCk7CQotCQkJCi0JCQkvL1VwZGF0ZSBwcm9qZWN0IHNldHRpbmdzIGFuZCB2YWxpZGF0ZSBwYWdlIGlmIHNlbGVjdGlvbnMgY2hhbmdlZC4KLQkJCWlmICghbmV3UHJvamVjdE5hbWUuZXF1YWxzKGN1cnJlbnRQcm9qZWN0TmFtZSkKLQkJCQkJfHwgIW5ld0VhclByb2plY3ROYW1lLmVxdWFscyhjdXJyZW50RWFyUHJvamVjdE5hbWUpCi0JCQkJCXx8ICFuZXdQcm9qZWN0VHlwZS5lcXVhbHMoY3VycmVudFByb2plY3RUeXBlKQotCQkJCQl8fCBuZXdOZWVkRWFyICE9IGN1cnJlbnROZWVkRWFyKSB7Ci0JCQkJc2V0U2VydmljZVByb2plY3ROYW1lKG5ld1Byb2plY3ROYW1lKTsKLQkJCQlzZXRTZXJ2aWNlRWFyUHJvamVjdE5hbWUobmV3RWFyUHJvamVjdE5hbWUpOwotCQkJCXNldFNlcnZpY2VDb21wb25lbnRUeXBlKG5ld1Byb2plY3RUeXBlKTsKLQkJCQlzZXRTZXJ2aWNlTmVlZEVBUihuZXdOZWVkRWFyKTsJCQkJCi0JCQkJdmFsaWRhdGlvblN0YXRlXyA9IChuZXcgVmFsaWRhdGlvblV0aWxzKCkpLmdldE5ld1ZhbGlkYXRpb25TdGF0ZSh2YWxpZGF0aW9uU3RhdGVfLCBWYWxpZGF0aW9uVXRpbHMuVkFMSURBVEVfUFJPSkVDVF9DSEFOR0VTKTsKLQkJCQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCS8qY2hlY2sgdG8gc2VlIGlmIHRleHQgaGFzIGNoYW5nZWQgZm9yIHByb2plY3QgYW5kIEVBUgotCQkJaWYgc28sIHJlcGFpbnQgbGlua3MgKi8KLQkJCWlmICghbmV3UHJvamVjdE5hbWUuZXF1YWxzKGN1cnJlbnRQcm9qZWN0TmFtZSkpCi0JCQl7Ci0JCQkJaExpbmtTZXJ2aWNlUHJvamVjdF8ucGFjayh0cnVlKTsKLQkJCQlwYWNrU2VsZigpOwkgCi0JCQl9Ci0JCQlpZiAoIW5ld0VhclByb2plY3ROYW1lLmVxdWFscyhjdXJyZW50RWFyUHJvamVjdE5hbWUpKQotCQkJewotCQkJCWhMaW5rU2VydmljZUVBUl8ucGFjayh0cnVlKTsKLQkJCQlwYWNrU2VsZigpOwkgIAkJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBsYXVuY2hSdW50aW1lU2VsZWN0aW9uRGlhbG9nKGJvb2xlYW4gY2xpZW50Q29udGV4dCkKLQl7Ci0JCWxhdW5jaFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2coY2xpZW50Q29udGV4dCwgZmFsc2UpOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2coYm9vbGVhbiBjbGllbnRDb250ZXh0LCBib29sZWFuIHNlbGVjdFNlcnZlckZpcnN0KSAJCi0JewkKLQkJYnl0ZSBtb2RlID0gY2xpZW50Q29udGV4dCA/IChieXRlKTEgOiAoYnl0ZSkwOwotCQkKLQkJLy9UT0RPOiBqdmggLSBpbnZlc3RpZ2F0ZSAtIGRvbid0IHRoaW5rIGoyZWUgdmVyc2lvbiBzaG91bGRuJ3QgYmUgaGFyZCBjb2RlZCAobGFzdCBwYXJtKSAKLQkJLy8gIHF1ZXN0aW9uIC0gd2hlcmUgdG8gcGljayBpdCB1cCBmcm9tPwotCQkvL1JlbWVtYmVyIHRoZSBjdXJyZW50IHZhbHVlcwotCQlUeXBlUnVudGltZVNlcnZlciBjdXJyZW50U2VydmljZVRSUyA9IGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpOwotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCVJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cgcnNzZCA9IG5ldyBSdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nKAotCQkJCXdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBtb2RlLCBjdXJyZW50U2VydmljZVRSUywgIjE0Iik7CQotCQlyc3NkLnNldFNlbGVjdFNlcnZlckZpcnN0KHNlbGVjdFNlcnZlckZpcnN0KTsJCQotCQlpbnQgcmVzdWx0ID0gcnNzZC5vcGVuKCk7CQkKLQkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0JCXsKLQkJCVR5cGVSdW50aW1lU2VydmVyIG5ld1NlcnZpY2VUUlMgPSByc3NkLmdldFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JCQlpZiAoIWN1cnJlbnRTZXJ2aWNlVFJTLmVxdWFscyhuZXdTZXJ2aWNlVFJTKSkKLQkJCXsKLQkJCQlzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIobmV3U2VydmljZVRSUyk7CQotCQkJCXJlZnJlc2hDbGllbnRTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uKCk7CQotCQkJCXZhbGlkYXRpb25TdGF0ZV8gPSAobmV3IFZhbGlkYXRpb25VdGlscygpKS5nZXROZXdWYWxpZGF0aW9uU3RhdGUodmFsaWRhdGlvblN0YXRlXywgVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1NFUlZFUl9SVU5USU1FX0NIQU5HRVMpOwotCQkJCWNsaWVudFdpZGdldF8uc2V0VmFsaWRhdGlvblN0YXRlKFZhbGlkYXRpb25VdGlscy5WQUxJREFURV9TRVJWRVJfUlVOVElNRV9DSEFOR0VTKTsKLQkJCQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7IC8vUmV2YWxpZGF0ZSB0aGUgcGFnZSBzaW5jZSBzZXJ2ZXIvcnVudGltZSBzZWxlY3Rpb25zIGNoYW5nZWQuCi0JCQl9Ci0JCQkKLQkJfQkJCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpIHsKLQkJY2xpZW50V2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlciggaWRzICk7Ci0JfQotCi0JcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkgewotCQlyZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxDbGllbnQoQm9vbGVhbiBpbnN0YWxsKSB7Ci0JCWNsaWVudFdpZGdldF8uc2V0SW5zdGFsbENsaWVudCggaW5zdGFsbCApOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldEluc3RhbGxDbGllbnQoKSB7CQkKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0SW5zdGFsbENsaWVudCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdGFydENsaWVudChCb29sZWFuIHN0YXJ0Q2xpZW50KSB7Ci0JCWNsaWVudFdpZGdldF8uc2V0U3RhcnRDbGllbnQoIHN0YXJ0Q2xpZW50ICk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3RhcnRDbGllbnQoKSB7CQkKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0U3RhcnRDbGllbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGVzdENsaWVudChCb29sZWFuIHRlc3RDbGllbnQpIHsKLQkJY2xpZW50V2lkZ2V0Xy5zZXRUZXN0Q2xpZW50KCB0ZXN0Q2xpZW50ICk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VGVzdENsaWVudCgpIHsJCQotCQlyZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRUZXN0Q2xpZW50KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERldmVsb3BDbGllbnQoYm9vbGVhbiBkZXZlbG9wKSB7Ci0JCWNsaWVudFdpZGdldF8uc2V0RGV2ZWxvcENsaWVudCggZGV2ZWxvcCApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERldmVsb3BDbGllbnQoKSB7CQkKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0RGV2ZWxvcENsaWVudCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBc3NlbWJsZUNsaWVudChib29sZWFuIGFzc2VtYmxlKSB7Ci0JCWNsaWVudFdpZGdldF8uc2V0QXNzZW1ibGVDbGllbnQoIGFzc2VtYmxlICk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXNzZW1ibGVDbGllbnQoKSB7CQkKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0QXNzZW1ibGVDbGllbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVwbG95Q2xpZW50KGJvb2xlYW4gZGVwbG95KSB7Ci0JCWNsaWVudFdpZGdldF8uc2V0RGVwbG95Q2xpZW50KCBkZXBsb3kgKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3lDbGllbnQoKSB7CQkKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0RGVwbG95Q2xpZW50KCk7Ci0JfQotCi1wcml2YXRlIHZvaWQgaGFuZGxlVHlwZUNoYW5nZSgpCi0JewotCQlpZiAoIXByZWZlcmVuY2VzUGFnZV8pIHsKLQkJICAgaW50IHNjZW5hcmlvID0gZ2V0V2ViU2VydmljZVNjZW5hcmlvKCk7Ci0JCSAgIAotCQkgICBpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTVVQKQotCQkgICB7Ci0JCQkgIHNlcnZpY2VMYWJlbF8uc2V0VGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfV0VCU0VSVklDRUlNUEwpOwotCQkgICB9Ci0JCSAgIGVsc2UgaWYgKHNjZW5hcmlvID09IFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKQotCQkgICB7Ci0JCQkgICBzZXJ2aWNlTGFiZWxfLnNldFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1dFQlNFUlZJQ0VERUYpOwotCQkgICB9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzKSB7Ci0JCUxhYmVsc0FuZElkcyBsYWJlbElkcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyCi0JCQkJLmdldFNlcnZpY2VUeXBlTGFiZWxzKCk7Ci0JCS8vIHJza3JlZwotCQlpbnQgc2VsZWN0aW9uID0gMDsKLQkJU3RyaW5nW10gc2VydmljZUlkcyA9IGxhYmVsSWRzLmdldElkc18oKTsKLQkJU3RyaW5nIHNlbGVjdGVkSWQgPSBpZHMuZ2V0VHlwZUlkKCk7Ci0KLQkJd2Vic2VydmljZVR5cGVfLnNldEl0ZW1zKGxhYmVsSWRzLmdldExhYmVsc18oKSk7Ci0KLQkJLy8gTm93IGZpbmQgdGhlIHNlbGVjdGVkIG9uZS4KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNlcnZpY2VJZHMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAoc2VsZWN0ZWRJZC5lcXVhbHMoc2VydmljZUlkc1tpbmRleF0pKSB7Ci0JCQkJc2VsZWN0aW9uID0gaW5kZXg7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJd2Vic2VydmljZVR5cGVfLnNlbGVjdChzZWxlY3Rpb24pOwotCQkKLQkJaWRzXyA9IGlkczsKLQkJCi0JCWlmIChpZHNfICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZyBzZXJ2aWNlU2VydmVyVGV4dCA9ICIiOwotCQkJU3RyaW5nIHNlcnZlcklkID0gaWRzXy5nZXRTZXJ2ZXJJZCgpOwotCQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQubGVuZ3RoKCk+MCkKLQkJCXsKLQkJCSAgc2VydmljZVNlcnZlclRleHQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2ZXJMYWJlbEJ5SWQoc2VydmVySWQpOwotCQkJfQotCQkJU3RyaW5nIHNlcnZpY2VSdW50aW1lVGV4dCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFJ1bnRpbWVMYWJlbEJ5SWQoaWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0JCQkKLQkJCVN0cmluZyBjdXJyZW50U2VydmVyVGV4dCA9IGhMaW5rU2VydmljZVNlcnZlcl8uZ2V0VGV4dCgpOwotCQkJU3RyaW5nIGN1cnJlbnRSdW50aW1lVGV4dCA9IGhMaW5rU2VydmljZVJ1bnRpbWVfLmdldFRleHQoKTsKLQkJCVN0cmluZyBuZXdTZXJ2ZXJUZXh0ID0gU0VSVklDRV9TRVJWRVJfUFJFRklYICsgIiAiICsgc2VydmljZVNlcnZlclRleHQ7Ci0JCQlTdHJpbmcgbmV3UnVudGltZVRleHQgPSBTRVJWSUNFX1JVTlRJTUVfUFJFRklYICsgIiAiICsgc2VydmljZVJ1bnRpbWVUZXh0OwotCQkJaExpbmtTZXJ2aWNlU2VydmVyXy5zZXRUZXh0KG5ld1NlcnZlclRleHQpOwotCQkJaExpbmtTZXJ2aWNlUnVudGltZV8uc2V0VGV4dChuZXdSdW50aW1lVGV4dCk7CQkKLQkJCQotCQkJLypjaGVjayB0byBzZWUgaWYgdGV4dCBoYXMgY2hhbmdlZCBmb3Igc2VydmVyIG9yIHJ1bnRpbWUKLQkJCWlmIHNvLCByZXBhaW50IGxpbmtzICovCi0JCQlpZiAoIW5ld1NlcnZlclRleHQuZXF1YWxzKGN1cnJlbnRTZXJ2ZXJUZXh0KSkKLQkJCXsKLQkJCQloTGlua1NlcnZpY2VTZXJ2ZXJfLnBhY2sodHJ1ZSk7Ci0JCQkJcGFja1NlbGYoKTsKLQkJCX0JCQkKLQkJCQotCQkJaWYgKCFuZXdSdW50aW1lVGV4dC5lcXVhbHMoY3VycmVudFJ1bnRpbWVUZXh0KSkKLQkJCXsKLQkJCQloTGlua1NlcnZpY2VSdW50aW1lXy5wYWNrKHRydWUpOwotCQkJCXBhY2tTZWxmKCk7Ci0JCQl9IAotCQl9CQkJCQotCQlsYWJlbElkc18gPSBsYWJlbElkczsKLQkJaGFuZGxlVHlwZUNoYW5nZSgpOwotCQkKLQkJaWYgKHByb2plY3REaWFsb2dfICE9IG51bGwpCi0JCQlwcm9qZWN0RGlhbG9nXy5zZXRUeXBlUnVudGltZVNlcnZlcihpZHNfKTsKLQkJCi0JCQotCQkvL1doZW4gdGhlIHNlcnZlciBjaGFuZ2VzLCB0aGUgc3RhdGUgb2YgbmVlZEVhciBjb3VsZCBjaGFuZ2UuCi0JCS8vSWYgdGhlIHRoZSBzZXJ2ZXIgY2hhbmdlIHJlc3VsdHMgaW4gYSBjaGFuZ2UgaW4gdGhlIHN0YXRlIG9mIG5lZWRFYXIsCi0JCS8vdXBkYXRlIG5lZWRFYXIgYW5kIHNlcnZpY2VFYXJQcm9qZWN0TmFtZS4KLQkJVmFsaWRhdGlvblV0aWxzIHZ1ID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotCQlib29sZWFuIG9sZE5lZWRFYXIgPSBnZXRTZXJ2aWNlTmVlZEVBUigpOwotCQlib29sZWFuIHNlcnZpY2VQcm9qZWN0T3JQcm9qZWN0VHlwZU5lZWRzRWFyOwotCi0JCWlmICghb2xkTmVlZEVhcikKLQkJewotCQkJLy9JZiBhbiBFQVIgd2FzIG5vdCBuZWVkZWQgcHJldmlvdXNseSBpdCBjb3VsZCBoYXZlIGJlZW4gYmVjYXVzZSBvZiB0aGUgcHJvamVjdC9wcm9qZWN0IHR5cGUgb3IgdGhlIHNlcnZlci4KLQkJCS8vSWYgaXQgd2FzIGJlY2F1c2Ugb2YgdGhlIHByb2plY3QvcHJvamVjdCB0eXBlLCBjaGFuZ2luZyB0aGUgc2VydmVyIHNob3VsZCBoYXZlIG5vIGltcGFjdAotCQkJLy9vbiB0aGUgc3RhdGUgb2YgbmVlZEVhci4KLQkJCXNlcnZpY2VQcm9qZWN0T3JQcm9qZWN0VHlwZU5lZWRzRWFyID0gdnUucHJvamVjdE9yUHJvamVjdFR5cGVOZWVkc0VhcihnZXRTZXJ2aWNlUHJvamVjdE5hbWUoKSwgZ2V0U2VydmljZUNvbXBvbmVudFR5cGUoKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzZXJ2aWNlUHJvamVjdE9yUHJvamVjdFR5cGVOZWVkc0VhciA9IHRydWU7Ci0JCX0KLQkJCi0JCS8vYm9vbGVhbiBzZXJ2aWNlUHJvamVjdE9yUHJvamVjdFR5cGVOZWVkc0VhciA9IHZ1LnByb2plY3RPclByb2plY3RUeXBlTmVlZHNFYXIoZ2V0U2VydmljZVByb2plY3ROYW1lKCksIGdldFNlcnZpY2VDb21wb25lbnRUeXBlKCkpOwotCQlpZiAoc2VydmljZVByb2plY3RPclByb2plY3RUeXBlTmVlZHNFYXIpCi0JCXsKLQkJCS8vQ291bGQgbm90IHJ1bGUgb3V0IG5lZWQgZm9yIGFuIEVhciBmcm9tIHRoZSBwcm9qZWN0L3Byb2plY3QgdHlwZSBzbyBjaGFuZ2luZyB0aGUgc2VydmVyCi0JCQkvL21heSBpbXBhY3QgdGhlIG5lZWQgZm9yIGFuIEVhci4KLQotCQkJYm9vbGVhbiBjdXJyZW50U2VydmljZVNlcnZlck5lZWRzRWFyID0gdnUuc2VydmVyTmVlZHNFQVIoZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkuZ2V0U2VydmVySWQoKSk7Ci0JCQlpZiAob2xkTmVlZEVhciAhPSBjdXJyZW50U2VydmljZVNlcnZlck5lZWRzRWFyKQotCQkJewotCQkJCS8vVXBkYXRlIG5lZWRFYXIgYW5kIHNlcnZpY2VFYXJQcm9qZWN0TmFtZS4KLQkJCQlpZiAoY3VycmVudFNlcnZpY2VTZXJ2ZXJOZWVkc0VhcikKLQkJCQl7Ci0JCQkJCS8vQ2FsY3VsYXRlIGEgcmVhc29uYWJsZSBkZWZhdWx0IGZvciB0aGUgRWFyIHByb2plY3QgbmFtZQotCQkJCQlTdHJpbmcgZWFyUHJvamVjdE5hbWUgPSBEZWZhdWx0aW5nVXRpbHMuZ2V0RGVmYXVsdEVBUlByb2plY3ROYW1lKGdldFNlcnZpY2VQcm9qZWN0TmFtZSgpKTsKLQkJCQkJc2V0U2VydmljZU5lZWRFQVIoY3VycmVudFNlcnZpY2VTZXJ2ZXJOZWVkc0Vhcik7Ci0JCQkJCXNldFNlcnZpY2VFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXNldFNlcnZpY2VOZWVkRUFSKGN1cnJlbnRTZXJ2aWNlU2VydmVyTmVlZHNFYXIpOwotCQkJCQlzZXRTZXJ2aWNlRWFyUHJvamVjdE5hbWUoIiIpOwkJCQkJCi0JCQkJfQotCQkJCQotCQkJfQotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkgewotCQlyZXR1cm4gaWRzXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR2VuZXJhdGlvbihpbnQgdmFsdWUpCi0JewotCQlzZXJ2aWNlU2NhbGVfLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0JCXNldEdyYXBoaWNzKHZhbHVlKTsKLQkJCi0JCS8vZW5hYmxlIGNsaWVudCB3aWRnZXQgYmFzZWQgb24gc2VydmljZSBzY2FsZSBzZXR0aW5nCi0JCWNsaWVudFdpZGdldF8uZW5hYmxlQ2xpZW50U2xpZGVyKHZhbHVlPD1TY2VuYXJpb0NvbnRleHQuV1NfU1RBUlQpOwotCQkKLQkJLypmb3IgcG9wdXAgY2FzZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBVSSBpcyByZWZyZXNoZWQgYmFzZWQgb24gCi0JCWNoYW5nZXMgdG8gZGF0YSovCi0JCXBhY2tTZWxmKCk7Ci0JfQkKLQotCXB1YmxpYyBpbnQgZ2V0U2VydmljZUdlbmVyYXRpb24oKQotCXsKLQkJcmV0dXJuIHNlcnZpY2VTY2FsZV8uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldERldmVsb3BTZXJ2aWNlKCkgewotCQlyZXR1cm4gZGV2ZWxvcFNlcnZpY2VfOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERldmVsb3BTZXJ2aWNlKGJvb2xlYW4gZGV2ZWxvcFNlcnZpY2UpIHsKLQkJdGhpcy5kZXZlbG9wU2VydmljZV8gPSBkZXZlbG9wU2VydmljZTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIGdldEFzc2VtYmxlU2VydmljZSgpIHsKLQkJcmV0dXJuIGFzc2VtYmxlU2VydmljZV87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXNzZW1ibGVTZXJ2aWNlKGJvb2xlYW4gYXNzZW1ibGVTZXJ2aWNlKSB7Ci0JCXRoaXMuYXNzZW1ibGVTZXJ2aWNlXyA9IGFzc2VtYmxlU2VydmljZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3lTZXJ2aWNlKCkgewotCQlyZXR1cm4gZGVwbG95U2VydmljZV87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95U2VydmljZShib29sZWFuIGRlcGxveVNlcnZpY2UpIHsKLQkJdGhpcy5kZXBsb3lTZXJ2aWNlXyA9IGRlcGxveVNlcnZpY2U7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFN0YXJ0U2VydmljZSgpewotCQlyZXR1cm4gc3RhcnRTZXJ2aWNlXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgc3RhcnRTZXJ2aWNlXz12YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnN0YWxsU2VydmljZSgpIHsKLQkJcmV0dXJuIGluc3RhbGxTZXJ2aWNlXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsU2VydmljZShCb29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGluc3RhbGxTZXJ2aWNlXz12YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIAotCSAgICAgICAgICBuZXcgQm9vbGVhbih0ZXN0U2VydmljZV8uYm9vbGVhblZhbHVlKCkgfHwgY2xpZW50V2lkZ2V0Xy5nZXRUZXN0Q2xpZW50KCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgdGVzdFNlcnZpY2VfPSB2YWx1ZTsKLQl9Ci0JcHVibGljIEJvb2xlYW4gZ2V0TW9uaXRvclNlcnZpY2UoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhbihtb25pdG9yQnV0dG9uXy5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoQm9vbGVhbiB2YWx1ZSkgewotCQltb25pdG9yQnV0dG9uXy5zZXRTZWxlY3Rpb24odmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFB1Ymxpc2hTZXJ2aWNlKCkgewkJCi0JCXJldHVybiBuZXcgQm9vbGVhbihwdWJsaXNoQnV0dG9uXy5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaFNlcnZpY2UoQm9vbGVhbiB2YWx1ZSkgewotCQlwdWJsaXNoQnV0dG9uXy5zZXRTZWxlY3Rpb24oIHZhbHVlLmJvb2xlYW5WYWx1ZSgpICk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuKGNsaWVudFdpZGdldF8uZ2V0R2VuZXJhdGVQcm94eSgpKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsaWVudEdlbmVyYXRpb24oaW50IHZhbHVlKQotCXsKLQkJY2xpZW50V2lkZ2V0Xy5zZXRDbGllbnRHZW5lcmF0aW9uKHZhbHVlKTsKLQkJLypmb3IgcG9wdXAgY2FzZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBVSSBpcyByZWZyZXNoZWQgYmFzZWQgb24gCi0JCQljaGFuZ2VzIHRvIGRhdGEqLwotCQlwYWNrU2VsZigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsaWVudEVhclByb2plY3ROYW1lKCkKLQl7Ci0JCXJldHVybiBjbGllbnRXaWRnZXRfLmdldENsaWVudEVhclByb2plY3ROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdE5hbWUoKQotCXsKLQkJcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50UHJvamVjdE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRDbGllbnRHZW5lcmF0aW9uKCkKLQl7Ci0JCXJldHVybiBjbGllbnRXaWRnZXRfLmdldENsaWVudEdlbmVyYXRpb24oKTsKLQl9CQotCi0JcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKSB7Ci0JCWlmIChyZXNvdXJjZUNvbnRleHRfID09IG51bGwpIHsKLQkJCXJlc291cmNlQ29udGV4dF8gPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFJlc291cmNlQ29udGV4dCgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUNvbnRleHRfOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dChSZXNvdXJjZUNvbnRleHQgY29udGV4dCkgewotCQlyZXNvdXJjZUNvbnRleHRfID0gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLQl7Ci0JCXJldHVybiBvYmplY3RTZWxlY3Rpb25fOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotCXsKLQkJb2JqZWN0U2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLQl7Ci0JCXJldHVybiBwYXJzZXJfOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIpCi0JewotCQlwYXJzZXJfID0gcGFyc2VyOwotCQljbGllbnRXaWRnZXRfLnNldFdlYlNlcnZpY2VzUGFyc2VyKHBhcnNlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewkJCi0JCQotCQlpZiAocHJlZmVyZW5jZXNQYWdlXykKLQkJCXJldHVybjsKLQkJCi0JCWlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXRfID09IG51bGwpCi0JCQlvYmplY3RTZWxlY3Rpb25XaWRnZXRfID0gZ2V0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0JCQotCQlTdHJpbmcgZGlzcGxheWFibGUgPSBudWxsOwotCQkKLQkJaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldF8gaW5zdGFuY2VvZiBJT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSkgewkJCi0JCQlJT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSBsYXVuY2hhYmxlID0gKElPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlKSBvYmplY3RTZWxlY3Rpb25XaWRnZXRfOwotCQkJbGF1bmNoYWJsZS5zZXRJbml0aWFsU2VsZWN0aW9uKG9iamVjdFNlbGVjdGlvbl8pOwotCQkJb2JqZWN0U2VsZWN0aW9uXyA9IGxhdW5jaGFibGUuZ2V0T2JqZWN0U2VsZWN0aW9uKCk7Ci0JCQlkaXNwbGF5YWJsZSA9IGxhdW5jaGFibGUuZ2V0T2JqZWN0U2VsZWN0aW9uRGlzcGxheWFibGVTdHJpbmcoKTsKLQkJfQotCQllbHNlIHsKLQkJCUlPYmplY3RTZWxlY3Rpb25XaWRnZXQgc2VsZWN0aW9uV2lkZ2V0ID0gKElPYmplY3RTZWxlY3Rpb25XaWRnZXQpIG9iamVjdFNlbGVjdGlvbldpZGdldF87Ci0JCQlzZWxlY3Rpb25XaWRnZXQuc2V0SW5pdGlhbFNlbGVjdGlvbihvYmplY3RTZWxlY3Rpb25fKTsKLQkJICAgIGRpc3BsYXlhYmxlID0gc2VsZWN0aW9uV2lkZ2V0LmdldE9iamVjdFNlbGVjdGlvbkRpc3BsYXlhYmxlU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCWlmIChkaXNwbGF5YWJsZSA9PSBudWxsIHx8IGRpc3BsYXlhYmxlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCQkKLQkJc2VydmljZUltcGxfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG9iamVjdE1vZGlmeUxpc3RlbmVyXyk7Ci0JCXNlcnZpY2VJbXBsXy5zZXRUZXh0KGRpc3BsYXlhYmxlKTsKLQkJc2VydmljZUltcGxfLmFkZE1vZGlmeUxpc3RlbmVyKG9iamVjdE1vZGlmeUxpc3RlbmVyXyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJSVN0YXR1cyBtaXNzaW5nRmllbGRTdGF0dXMgPSBjaGVja01pc3NpbmdGaWVsZFN0YXR1cygpOwotCQlpZiAobWlzc2luZ0ZpZWxkU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJcmV0dXJuIG1pc3NpbmdGaWVsZFN0YXR1czsKLQkJfQotCi0JCUlTdGF0dXMgaW52YWxpZFNlcnZpY2VJbXBsU3RhdHVzID0gY2hlY2tTZXJ2aWNlSW1wbFRleHRTdGF0dXMoKTsKLQkJaWYgKGludmFsaWRTZXJ2aWNlSW1wbFN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXJldHVybiBpbnZhbGlkU2VydmljZUltcGxTdGF0dXM7Ci0JCX0KLQotCQlJU3RhdHVzIHBvc3NpYmxlRXJyb3JTdGF0dXMgPSBjaGVja0Vycm9yU3RhdHVzKCk7Ci0JCWlmIChwb3NzaWJsZUVycm9yU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJcmV0dXJuIHBvc3NpYmxlRXJyb3JTdGF0dXM7Ci0JCX0KLQotCQlJU3RhdHVzIHBvc3NpYmxlV2FybmluZ1N0YXR1cyA9IGNoZWNrV2FybmluZ1N0YXR1cygpOwotCQlpZiAocG9zc2libGVXYXJuaW5nU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlyZXR1cm4gcG9zc2libGVXYXJuaW5nU3RhdHVzOwotCQl9Ci0KLQkJLy8gSWYgbm8gd2FybmluZ3MvZXJyb3JzIHdlcmUgcmVwb3J0ZWQsIGNsZWFyIHZhbGlkYXRpb24gc3RhdGUgb24KLQkJLy8gc2VydmljZSBzaWRlIGFuZCBjbGllbnQgc2lkZSAoaWYgZW5hYmxlZCkKLQkJdmFsaWRhdGlvblN0YXRlXyA9IFZhbGlkYXRpb25VdGlscy5WQUxJREFURV9OT05FOwotCQlpZiAoY2xpZW50V2lkZ2V0Xy5nZXRHZW5lcmF0ZVByb3h5KCkpIHsKLQkJCWNsaWVudFdpZGdldF8uc2V0VmFsaWRhdGlvblN0YXRlKFZhbGlkYXRpb25VdGlscy5WQUxJREFURV9OT05FKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCS8qCi0JICogY2FsbCB2YWxpZGF0aW9uIGNvZGUgaW4gdGhlIG9iamVjdCBzZWxlY3Rpb24gd2lkZ2V0IHRvIGVuc3VyZSBhbnkKLQkgKiBtb2RpZmljYXRpb25zIHRvIHRoZSBzZXJ2aWNlSW1wbF8gZmllbGQgYXJlIHZhbGlkCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGNoZWNrU2VydmljZUltcGxUZXh0U3RhdHVzKCkgewotCQkKLQkJU3RyaW5nIGZpZWxkVGV4dCA9IHNlcnZpY2VJbXBsXy5nZXRUZXh0KCkudHJpbSgpOwotCi0JCWlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXRfID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFNlbGVjdGlvbldpZGdldF8gPSBnZXRTZWxlY3Rpb25XaWRnZXQoKTsKLQkJfQotCQkKLQkJaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldF8gaW5zdGFuY2VvZiBJT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSkKLQkJICAgIHsgICAgICAJCi0JCQkJSU9iamVjdFNlbGVjdGlvbkxhdW5jaGFibGUgbGF1bmNoYWJsZSA9IChJT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSlvYmplY3RTZWxlY3Rpb25XaWRnZXRfOwotCQkJCXZhbGlkT2JqZWN0U2VsZWN0aW9uXyA9IGxhdW5jaGFibGUudmFsaWRhdGUoZmllbGRUZXh0KTsKLQkJCX0KLQkJCWVsc2UgCi0JCQl7Ci0JCQkJSU9iamVjdFNlbGVjdGlvbldpZGdldCB3aWRnZXQgPSAoSU9iamVjdFNlbGVjdGlvbldpZGdldClvYmplY3RTZWxlY3Rpb25XaWRnZXRfOwotCQkJCXZhbGlkT2JqZWN0U2VsZWN0aW9uXyA9IHdpZGdldC52YWxpZGF0ZShmaWVsZFRleHQpOwotCQkJfQotCQkKLQkJaWYgKCF2YWxpZE9iamVjdFNlbGVjdGlvbl8pCi0JCXsKLQkJCWludCBzY2VuYXJpbyA9IGdldFdlYlNlcnZpY2VTY2VuYXJpbygpOwotCQkJCi0JCQlpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTVVQKQotCQkJCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhDb25zdW1wdGlvblVJTWVzc2FnZXMuTVNHX0lOVkFMSURfU0VSVklDRV9JTVBMKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19JTlZBTElEX1NFUlZJQ0VfREVGKTsJCQkKLQkJfQkJCi0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRXZWJTZXJ2aWNlU2NlbmFyaW8oKQotCXsKLQkJICAgaW50IGluZGV4ID0gd2Vic2VydmljZVR5cGVfLmdldFNlbGVjdGlvbkluZGV4KCk7CQotCQkgICBTdHJpbmcgdHlwZUlkID0gbGFiZWxJZHNfLmdldElkc18oKVtpbmRleF07Ci0JCSAgIHJldHVybiBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTY2VuYXJpb0Zyb21UeXBlSWQodHlwZUlkKTsJCQotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgY2hlY2tNaXNzaW5nRmllbGRTdGF0dXMoKSB7Ci0KLQkJLy8gMS4gQ2hlY2sgZm9yIG1pc3NpbmcgZmllbGRzIG9uIHNlcnZpY2Ugc2lkZQotCQlWYWxpZGF0aW9uVXRpbHMgdmFsVXRpbHMgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0JCVN0cmluZyBzZXJ2aWNlSW1wbCA9IHNlcnZpY2VJbXBsXy5nZXRUZXh0KCkudHJpbSgpOwotCQlTdHJpbmcgdHlwZUlkID0gZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkuZ2V0VHlwZUlkKCk7Ci0JCVN0cmluZyBydW50aW1lSWQgPSBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRSdW50aW1lSWQoKTsKLQkJU3RyaW5nIHNlcnZlcklkID0gZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkuZ2V0U2VydmVySWQoKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0U2VydmljZVByb2plY3ROYW1lKCk7Ci0JCWJvb2xlYW4gbmVlZEVhciA9IGdldFNlcnZpY2VOZWVkRUFSKCk7Ci0JCVN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VFYXJQcm9qZWN0TmFtZSgpOwotCQlTdHJpbmcgcHJvamVjdFR5cGVJZCA9IGdldFNlcnZpY2VDb21wb25lbnRUeXBlKCk7Ci0JCQotCQlJU3RhdHVzIHNlcnZpY2VNaXNzaW5nRmllbGRTdGF0dXMgPSB2YWxVdGlscy5jaGVja01pc3NpbmdGaWVsZFN0YXR1cyh2YWxpZGF0aW9uU3RhdGVfLCB0eXBlSWQsIHNlcnZpY2VJbXBsLAotCQkJCXJ1bnRpbWVJZCwgc2VydmVySWQsIHByb2plY3ROYW1lLCBuZWVkRWFyLCBlYXJQcm9qZWN0TmFtZSwgcHJvamVjdFR5cGVJZCwgZmFsc2UpOwotCQlpZiAoc2VydmljZU1pc3NpbmdGaWVsZFN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXJldHVybiBzZXJ2aWNlTWlzc2luZ0ZpZWxkU3RhdHVzOwotCQl9Ci0KLQkJLy8gMi4gQ2hlY2sgZm9yIG1pc3NpbmcgZmllbGRzIG9uIHRoZSBjbGllbnQgc2lkZSBpZiBpdCdzIHZpc2libGUuCi0JCWlmIChjbGllbnRXaWRnZXRfLmdldEdlbmVyYXRlUHJveHkoKSkgewotCQkJSVN0YXR1cyBjbGllbnRNaXNzaW5nRmllbGRzU3RhdHVzID0gY2xpZW50V2lkZ2V0Xy5jaGVja01pc3NpbmdGaWVsZFN0YXR1cygpOwotCQkJaWYgKGNsaWVudE1pc3NpbmdGaWVsZHNTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJcmV0dXJuIGNsaWVudE1pc3NpbmdGaWVsZHNTdGF0dXM7Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja0Vycm9yU3RhdHVzKCkgewotCi0JCVZhbGlkYXRpb25VdGlscyB2YWxVdGlscyA9IG5ldyBWYWxpZGF0aW9uVXRpbHMoKTsKLQotCQkvLyAxLiBDaGVjayBmb3IgZXJyb3JzIG9uIHNlcnZpY2Ugc2lkZQotCQlTdHJpbmcgcnVudGltZUlkID0gZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkuZ2V0UnVudGltZUlkKCk7Ci0JCVN0cmluZyBzZXJ2ZXJJZCA9IGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpLmdldFNlcnZlcklkKCk7Ci0JCVN0cmluZyB0eXBlSWQgPSBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRUeXBlSWQoKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0U2VydmljZVByb2plY3ROYW1lKCk7Ci0JCWJvb2xlYW4gbmVlZEVhciA9IGdldFNlcnZpY2VOZWVkRUFSKCk7Ci0JCVN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VFYXJQcm9qZWN0TmFtZSgpOwotCQlTdHJpbmcgcHJvamVjdFR5cGVJZCA9IGdldFNlcnZpY2VDb21wb25lbnRUeXBlKCk7Ci0JCUlTdGF0dXMgc2VydmljZVNpZGVFcnJvclN0YXR1cyA9IHZhbFV0aWxzLmNoZWNrRXJyb3JTdGF0dXModmFsaWRhdGlvblN0YXRlXywgdHlwZUlkLCBydW50aW1lSWQsIHNlcnZlcklkLAotCQkJCXByb2plY3ROYW1lLCBuZWVkRWFyLCBlYXJQcm9qZWN0TmFtZSwgcHJvamVjdFR5cGVJZCwgZmFsc2UpOwotCQlpZiAoc2VydmljZVNpZGVFcnJvclN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXJldHVybiBzZXJ2aWNlU2lkZUVycm9yU3RhdHVzOwotCQl9Ci0KLQkJLy8gMi4gQ2hlY2sgZm9yIGVycm9ycyBvbiBjbGllbnQgc2lkZSBpZiBpdCBpcyB2aXNpYmxlCi0JCWlmIChjbGllbnRXaWRnZXRfLmdldEdlbmVyYXRlUHJveHkoKSkgewotCQkJSVN0YXR1cyBjbGllbnRTaWRlRXJyb3JTdGF0dXMgPSBjbGllbnRXaWRnZXRfLmNoZWNrRXJyb3JTdGF0dXMoKTsKLQkJCWlmIChjbGllbnRTaWRlRXJyb3JTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJcmV0dXJuIGNsaWVudFNpZGVFcnJvclN0YXR1czsKLQkJCX0KLQotCQkJLy8gMy4gQ2hlY2sgZm9yIGVycm9ycyB0aGF0IHNwYW4gc2VydmljZSBhbmQgY2xpZW50IGlmIGNsaWVudCBzaWRlCi0JCQkvLyBpcyB2aXNpYmxlLgotCQkJaW50IGNsaWVudFZhbGlkYXRpb25TdGF0ZSA9IGNsaWVudFdpZGdldF8uZ2V0VmFsaWRhdGlvblN0YXRlKCk7Ci0JCQlpZiAodmFsaWRhdGlvblN0YXRlXyA9PSBWYWxpZGF0aW9uVXRpbHMuVkFMSURBVEVfQUxMCi0JCQkJCXx8IHZhbGlkYXRpb25TdGF0ZV8gPT0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1BST0pFQ1RfQ0hBTkdFUwotCQkJCQl8fCBjbGllbnRWYWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX0FMTAotCQkJCQl8fCBjbGllbnRWYWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1BST0pFQ1RfQ0hBTkdFUykgewotCQkJCVN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSA9IGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50UHJvamVjdE5hbWUoKTsKLQkJCQlpZiAoY2xpZW50UHJvamVjdE5hbWUuZXF1YWxzSWdub3JlQ2FzZShwcm9qZWN0TmFtZSkpIHsKLQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzCi0JCQkJCQkJLmVycm9yU3RhdHVzKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfU0FNRV9DTElFTlRfQU5EX1NFUlZJQ0VfUFJPSkVDVFMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja1dhcm5pbmdTdGF0dXMoKSB7Ci0JCVZhbGlkYXRpb25VdGlscyB2YWxVdGlscyA9IG5ldyBWYWxpZGF0aW9uVXRpbHMoKTsKLQkJLy8gMS4gQ2hlY2sgZm9yIHdhcm5pbmdzIG9uIHRoZSBzZXJ2aWNlIHNpZGUKLQkJaW50IHNjYWxlU2V0dGluZyA9IGdldFNlcnZpY2VHZW5lcmF0aW9uKCk7Ci0JCVN0cmluZyBzZXJ2ZXJJZCA9IGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpLmdldFNlcnZlcklkKCk7Ci0JCUlTdGF0dXMgc2VydmljZVdhcm5pbmdTdGF0dXMgPSB2YWxVdGlscy5jaGVja1dhcm5pbmdTdGF0dXModmFsaWRhdGlvblN0YXRlXywgc2NhbGVTZXR0aW5nLCBzZXJ2ZXJJZCwgZmFsc2UpOwotCQlpZiAoc2VydmljZVdhcm5pbmdTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCXJldHVybiBzZXJ2aWNlV2FybmluZ1N0YXR1czsKLQkJfQotCi0JCS8vIDIuIENoZWNrIGZvciB3YXJuaW5ncyBvbiB0aGUgY2xpZW50IHNpZGUgaWYgaXQncyBlbmFibGVkCi0JCWlmIChjbGllbnRXaWRnZXRfLmdldEdlbmVyYXRlUHJveHkoKSkgewotCQkJSVN0YXR1cyBjbGllbnRXYXJuaW5nU3RhdHVzID0gY2xpZW50V2lkZ2V0Xy5jaGVja1dhcm5pbmdTdGF0dXMoKTsKLQkJCWlmIChjbGllbnRXYXJuaW5nU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQkJcmV0dXJuIGNsaWVudFdhcm5pbmdTdGF0dXM7Ci0JCQl9Ci0KLQkJCS8vIDMuIENoZWNrIGZvciB3YXJuaW5ncyB0aGF0IHNwYW4gc2VydmljZSBhbmQgY2xpZW50IGlmIGNsaWVudCBzaWRlCi0JCQkvLyBpcyBlbmFibGVkLgotCQkJaW50IGNsaWVudFZhbGlkYXRpb25TdGF0ZSA9IGNsaWVudFdpZGdldF8uZ2V0VmFsaWRhdGlvblN0YXRlKCk7Ci0JCQlpZiAodmFsaWRhdGlvblN0YXRlXyA9PSBWYWxpZGF0aW9uVXRpbHMuVkFMSURBVEVfQUxMCi0JCQkJCXx8IHZhbGlkYXRpb25TdGF0ZV8gPT0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1BST0pFQ1RfQ0hBTkdFUwotCQkJCQl8fCBjbGllbnRWYWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX0FMTAotCQkJCQl8fCBjbGllbnRWYWxpZGF0aW9uU3RhdGUgPT0gVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1BST0pFQ1RfQ0hBTkdFUykgewotCQkJCWlmIChnZXRTZXJ2aWNlTmVlZEVBUigpICYmIGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50TmVlZEVBUigpKSB7Ci0JCQkJCWlmIChnZXRTZXJ2aWNlRWFyUHJvamVjdE5hbWUoKS5lcXVhbHMoY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnRFYXJQcm9qZWN0TmFtZSgpKSkgewotCQkJCQkJcmV0dXJuIFN0YXR1c1V0aWxzLndhcm5pbmdTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQkJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfU0FNRV9DTElFTlRfQU5EX1NFUlZJQ0VfRUFSUywKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgIkVBUiIgfSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGluaXRJbWFnZVJlZ2lzdHJ5KCkKLQl7Ci0JCWltYWdlUmVnXyA9IG5ldyBJbWFnZVJlZ2lzdHJ5KERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJCi0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR18wLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR18wKSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR18xLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR18xKSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR18yLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR18yKSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR18zLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR18zKSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR180LCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR180KSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR181LCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR181KSk7Ci0JCWltYWdlUmVnXy5wdXQoSUNPTl9TQ0FMRV9CR182LCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTl9TQ0FMRV9CR182KSk7Ci0JCQotCQlpbWFnZVJlZ18ucHV0KEdSQVBISUNfU0VSVklDRV8wLCBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoR1JBUEhJQ19TRVJWSUNFXzApKTsKLQkJaW1hZ2VSZWdfLnB1dChHUkFQSElDX1NFUlZJQ0VfMSwgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4KLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEdSQVBISUNfU0VSVklDRV8xKSk7Ci0JCWltYWdlUmVnXy5wdXQoR1JBUEhJQ19TRVJWSUNFXzIsIFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihHUkFQSElDX1NFUlZJQ0VfMikpOwotCQlpbWFnZVJlZ18ucHV0KEdSQVBISUNfU0VSVklDRV8zLCBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbgotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoR1JBUEhJQ19TRVJWSUNFXzMpKTsKLQkJaW1hZ2VSZWdfLnB1dChHUkFQSElDX1NFUlZJQ0VfNCwgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4KLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEdSQVBISUNfU0VSVklDRV80KSk7Ci0JCWltYWdlUmVnXy5wdXQoR1JBUEhJQ19TRVJWSUNFXzUsIFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihHUkFQSElDX1NFUlZJQ0VfNSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0QWR2YW5jZWRPcHRpb25zKGJvb2xlYW4gZW5hYmxlZCkKLQl7Ci0JCW1vbml0b3JCdXR0b25fLnNldEVuYWJsZWQoZW5hYmxlZCk7IAotCQlwdWJsaXNoQnV0dG9uXy5zZXRFbmFibGVkKGVuYWJsZWQpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkKLQkgIHsKLQkJc2VydmljZVByb2plY3ROYW1lXz0gbmFtZTsKLQkJaExpbmtTZXJ2aWNlUHJvamVjdF8uc2V0VGV4dChTRVJWSUNFX1BST0pFQ1RfUFJFRklYICsgIiAiICsgc2VydmljZVByb2plY3ROYW1lXyk7Ci0JCWhMaW5rU2VydmljZVByb2plY3RfLnBhY2sodHJ1ZSk7Ci0JCXBhY2tTZWxmKCk7CQotCSAgfQotCQotCSBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRWFyUHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpCi0JICB7CSAgCi0JCSBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfID0gbmFtZTsKLQkJIHJlZnJlc2hFQVJMaW5rKCk7Ci0JICB9Ci0JIAotCSAgcHVibGljIHZvaWQgcmVmcmVzaEVBUkxpbmsoKQotCSAgewotCQkgIGhMaW5rU2VydmljZUVBUl8uc2V0VmlzaWJsZShuZWVkRWFyXyk7IAotCQkgIGlmIChuZWVkRWFyXykKLQkJICB7CQkJIAotCQkJICBoTGlua1NlcnZpY2VFQVJfLnNldFRleHQoU0VSVklDRV9FQVJfUFJFRklYICsgIiAiICsgc2VydmljZUVhclByb2plY3ROYW1lXyk7Ci0JCQkgIGhMaW5rU2VydmljZUVBUl8ucGFjayh0cnVlKTsKLQkJCSAgcGFja1NlbGYoKTsKLQkJICB9Ci0JICB9Ci0JIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VDb21wb25lbnRUeXBlKCBTdHJpbmcgdHlwZSApCi0JICB7Ci0JCSBzZXJ2aWNlQ29tcG9uZW50VHlwZV8gPSB0eXBlOwotCSAgfQotCSAKLQkgIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3ROYW1lKFN0cmluZyBuYW1lKQotCSAgewotCSAgICBjbGllbnRXaWRnZXRfLnNldENsaWVudFByb2plY3ROYW1lKG5hbWUpOyAgCi0JICB9ICAKLQkgIAotCSAgcHVibGljIHZvaWQgc2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpCi0JICB7Ci0JICAgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50RWFyUHJvamVjdE5hbWUobmFtZSk7ICAKLQkgIH0KLQkgIAotCSAgSVByb2plY3QgcHJvamVjdF87Ci0JICAKLQkgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNvbXBvbmVudFR5cGUoKQotCSAgewotCQkgIHJldHVybiBzZXJ2aWNlQ29tcG9uZW50VHlwZV87Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHNldENsaWVudENvbXBvbmVudFR5cGUoU3RyaW5nIHR5cGUpCi0JICB7Ci0JCSAgY2xpZW50V2lkZ2V0Xy5zZXRDbGllbnRDb21wb25lbnRUeXBlKHR5cGUpOwotCSAgfQotCSAgCi0JICBwdWJsaWMgU3RyaW5nIGdldENsaWVudENvbXBvbmVudFR5cGUoKQotCSAgewotCQkgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldENsaWVudENvbXBvbmVudFR5cGUoKTsKLQkgIH0KLQkgCi0JICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VQcm9qZWN0TmFtZSgpCi0JICB7Ci0JCSAgcmV0dXJuIHNlcnZpY2VQcm9qZWN0TmFtZV87Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVhclByb2plY3ROYW1lKCkKLQkgIHsKLQkJICByZXR1cm4gc2VydmljZUVhclByb2plY3ROYW1lXzsKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotCSAgewotCQkgIGNsaWVudFdpZGdldF8uc2V0UHJvamVjdChwcm9qZWN0KTsKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRDbGllbnRQcm9qZWN0KCkKLQkgIHsKLQkJICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRQcm9qZWN0KCk7IAotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0JICB7Ci0JCSAgcHJvamVjdF8gPSBwcm9qZWN0OwotCSAgfQkgIAotCSAgCSAgCi0JICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0JICB7Ci0JCSAgcmV0dXJuIHByb2plY3RfOwotCSAgfQotCSAgCi0JICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VSdW50aW1lSWQoKQotCSAgewotCQkgIC8vIGNhbGN1bGF0ZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSBzZXJ2aWNlUnVudGltZUlkIGJhc2VkIG9uIGN1cnJlbnQgc2V0dGluZ3MuCi0JCSAgcmV0dXJuIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZpY2VSdW50aW1lSWQoZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCksIGdldFNlcnZpY2VQcm9qZWN0TmFtZSgpLCBnZXRTZXJ2aWNlQ29tcG9uZW50VHlwZSgpKTsgICAgCi0JICB9Ci0JICAKLQkgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UnVudGltZUlkKCkKLQkgIHsKLQkJICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnRSdW50aW1lSWQoKTsKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgc2V0U2VydmljZU5lZWRFQVIoYm9vbGVhbiBiKQotCSAgewotCQkgIG5lZWRFYXJfID0gYjsKLQkJICByZWZyZXNoRUFSTGluaygpOwotCSAgfQotCSAgCi0JICBwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2aWNlTmVlZEVBUigpCi0JICB7Ci0JCSAgcmV0dXJuIG5lZWRFYXJfOwotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCBzZXRDbGllbnROZWVkRUFSKGJvb2xlYW4gYikKLQkgIHsKLQkgICAgY2xpZW50V2lkZ2V0Xy5zZXRDbGllbnROZWVkRUFSKGIpOwotCSAgfQkgIAotCSAgCi0JICBwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnROZWVkRUFSKCkKLQkgIHsKLQkJICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnROZWVkRUFSKCk7Ci0JICB9Ci0JICAKLQkgIC8vIGxvb2tzIHRocm91Z2ggZXh0ZW5zaW9ucyBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgc2VsZWN0aW9uIHdpZGdldAotCSAgcHJpdmF0ZSBPYmplY3QgZ2V0U2VsZWN0aW9uV2lkZ2V0KCkKLQkgIHsKLQkJCVN0cmluZyAgICAgICAgIHdzdCAgICAgID0gZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkuZ2V0VHlwZUlkKCk7Ci0JCQlpbnQgICAgICAgICAgICBzY2VuYXJpbyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNjZW5hcmlvRnJvbVR5cGVJZCh3c3QpOwotCQkJU3RyaW5nICAgICAgICAgaW1wbElkICAgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRXZWJTZXJ2aWNlSW1wbElkRnJvbVR5cGVJZCh3c3QpOwotCQkgIFdlYlNlcnZpY2VJbXBsIHdzaW1wbCAgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0V2ViU2VydmljZUltcGxCeUlkKGltcGxJZCk7Ci0gICAgICBPYmplY3QgICAgICAgICByZXN1bHQgICA9IG51bGw7Ci0gICAgICAgIAotCQkgICAgCi0JCSAgaWYgKHdzaW1wbCAhPSBudWxsKQotCQkgIHsKLQkJICAgIFN0cmluZyBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZCA9IG51bGw7Ci0JCSAgICBpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pCi0JCSAgICB7Ci0JCSAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldElkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5XU0RMU2VsZWN0aW9uV2lkZ2V0IjsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSB3c2ltcGwuZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0JCSAgICB9Ci0gICAgICAgIAotICAgICAgICBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gZWRpdGFibGUgPSByZWdpc3RyeS5nZXRFeHRlcm5hbE1vZGlmeSggb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgc2VydmljZUltcGxfLnNldEVkaXRhYmxlKCBlZGl0YWJsZSApOwotICAgICAgICByZXN1bHQgPSByZWdpc3RyeS5nZXRTZWxlY3Rpb25XaWRnZXQoIG9iamVjdFNlbGVjdGlvbldpZGdldElkICk7Ci0gICAgICB9Ci0gICAgICAKLQkJICByZXR1cm4gcmVzdWx0OwotCSAgfQotCSAKLQkvLyBmb3IgdGhlIHB1cnBvc2VzIG9mIGRpc2FibGluZyB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlcyBkaWFsb2cKLQlwdWJsaWMgdm9pZCBkaXNhYmxlTm9uUHJlZmVyZW5jZVdpZGdldHMoKQotCXsKLQkJaWYgKHNlcnZpY2VJbXBsXyAhPSBudWxsKQotCQkJc2VydmljZUltcGxfLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoYnJvd3NlQnV0dG9uXyAhPSBudWxsKQotCQkJYnJvd3NlQnV0dG9uXy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKGhDb21wU2VydmljZV8gIT0gbnVsbCkKLQkJewotCQkJaENvbXBTZXJ2aWNlXy5zZXRWaXNpYmxlKGZhbHNlKTsJCQkKLQkJfQotCQljbGllbnRXaWRnZXRfLmRpc2FibGVOb25QcmVmZXJlbmNlV2lkZ2V0cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0R3JhcGhpY3MoaW50IHZhbHVlKQotCXsKLQkJU3RyaW5nIGljb25JbWFnZSA9ICIiOwotCQlTdHJpbmcgdG9wbG9neUltYWdlID0gIiI7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJY2FzZSAwOgotCQkJaWNvbkltYWdlPUlDT05fU0NBTEVfQkdfMDsKLQkJCXRvcGxvZ3lJbWFnZT1HUkFQSElDX1NFUlZJQ0VfMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlpY29uSW1hZ2U9SUNPTl9TQ0FMRV9CR18xOwotCQkJdG9wbG9neUltYWdlPUdSQVBISUNfU0VSVklDRV8xOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWljb25JbWFnZT1JQ09OX1NDQUxFX0JHXzI7Ci0JCQl0b3Bsb2d5SW1hZ2U9R1JBUEhJQ19TRVJWSUNFXzI7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJaWNvbkltYWdlPUlDT05fU0NBTEVfQkdfMzsKLQkJCXRvcGxvZ3lJbWFnZT1HUkFQSElDX1NFUlZJQ0VfMzsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlpY29uSW1hZ2U9SUNPTl9TQ0FMRV9CR180OwotCQkJdG9wbG9neUltYWdlPUdSQVBISUNfU0VSVklDRV80OwotCQkJYnJlYWs7Ci0JCWNhc2UgNToJCQkJCQotCQljYXNlIDY6Ci0JCQlpY29uSW1hZ2U9SUNPTl9TQ0FMRV9CR181OwotCQkJdG9wbG9neUltYWdlPUdSQVBISUNfU0VSVklDRV81OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlzZXJ2aWNlU2NhbGVfLnNldEJhY2tncm91bmRJbWFnZShpbWFnZVJlZ18uZ2V0KGljb25JbWFnZSkpOwotCQl0b3BvbG9neVNwb3RfLnNldEltYWdlKGltYWdlUmVnXy5nZXQodG9wbG9neUltYWdlKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWZyZXNoU2VydmVyUnVudGltZVNlbGVjdGlvbigpCi0JewkJCi0JCS8vbmV3IHVwIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotCQlTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgc2VydmVyUlREZWZhdWx0Q21kID0gbmV3IFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpOwotCQkKLQkJICAvL2NhbGwgc2V0dGVycyBvZiBuZXcgZGVmYXVsdGluZyBjb21tYW5kOgotCSAgICAgIHNlcnZlclJURGVmYXVsdENtZC5zZXRJbml0aWFsU2VsZWN0aW9uKGdldE9iamVjdFNlbGVjdGlvbigpKTsKLQkgICAgICBzZXJ2ZXJSVERlZmF1bHRDbWQuc2V0SW5pdGlhbFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkgICAgICBzZXJ2ZXJSVERlZmF1bHRDbWQuc2V0R2VuZXJhdGVQcm94eShjbGllbnRXaWRnZXRfLmdldEdlbmVyYXRlUHJveHkoKSk7Ci0JICAgICAgc2VydmVyUlREZWZhdWx0Q21kLnNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKSk7Ci0JCSAgc2VydmVyUlREZWZhdWx0Q21kLnNldFdlYlNlcnZpY2VzUGFyc2VyKGdldFdlYlNlcnZpY2VzUGFyc2VyKCkpOyAgICAgCi0JCSAgc2VydmVyUlREZWZhdWx0Q21kLnNldENsaWVudEluaXRpYWxTZWxlY3Rpb24oZ2V0T2JqZWN0U2VsZWN0aW9uKCkpOwotCSAgICAgIHNlcnZlclJURGVmYXVsdENtZC5zZXRDbGllbnRJbml0aWFsUHJvamVjdChnZXRDbGllbnRQcm9qZWN0KCkpOwotCSAgICAgIHNlcnZlclJURGVmYXVsdENtZC5zZXRDbGllbnRFYXJQcm9qZWN0TmFtZShjbGllbnRXaWRnZXRfLmdldENsaWVudEVhclByb2plY3ROYW1lKCkpOwotCQkgIHNlcnZlclJURGVmYXVsdENtZC5zZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpKTsKLQkJICAJCSAgCi0JCSAgc2VydmVyUlREZWZhdWx0Q21kLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCSAgCi0JCSAgLy9wZXJmb3JtIG1hcHBpbmdzIGZyb20gdGhlIGRlZmF1bHRpbmcgY29tbWFuZCB0byB0aGUgcHJvamVjdCBzZXR0aW5ncy4uLgkKLQkJICBzZXRTZXJ2aWNlUHJvamVjdE5hbWUoc2VydmVyUlREZWZhdWx0Q21kLmdldFNlcnZpY2VQcm9qZWN0TmFtZSgpKTsKLQkJICBzZXRTZXJ2aWNlRWFyUHJvamVjdE5hbWUoc2VydmVyUlREZWZhdWx0Q21kLmdldFNlcnZpY2VFYXJQcm9qZWN0TmFtZSgpKTsKLQkJICBzZXRTZXJ2aWNlQ29tcG9uZW50VHlwZShzZXJ2ZXJSVERlZmF1bHRDbWQuZ2V0U2VydmljZUNvbXBvbmVudFR5cGUoKSk7Ci0JCSAgc2V0Q2xpZW50UHJvamVjdE5hbWUoc2VydmVyUlREZWZhdWx0Q21kLmdldENsaWVudFByb2plY3ROYW1lKCkpOwotCQkgIHNldENsaWVudEVhclByb2plY3ROYW1lKHNlcnZlclJURGVmYXVsdENtZC5nZXRDbGllbnRFYXJQcm9qZWN0TmFtZSgpKTsKLQkJICBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoc2VydmVyUlREZWZhdWx0Q21kLmdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpKTsKLSAgICAgICAgICBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihzZXJ2ZXJSVERlZmF1bHRDbWQuZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKSk7Ci0gICAgICAgICAgc2V0U2VydmljZU5lZWRFQVIoc2VydmVyUlREZWZhdWx0Q21kLmdldFNlcnZpY2VOZWVkRUFSKCkpOwotICAgICAgICAgIHNldENsaWVudE5lZWRFQVIoc2VydmVyUlREZWZhdWx0Q21kLmdldENsaWVudE5lZWRFQVIoKSk7Ci0gICAgICAgICAgc2V0Q2xpZW50Q29tcG9uZW50VHlwZShzZXJ2ZXJSVERlZmF1bHRDbWQuZ2V0Q2xpZW50Q29tcG9uZW50VHlwZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogIFVwZGF0ZSBjbGllbnQgc2VydmVyIGFuZCBydW50aW1lIGJhc2VkIG9uIHNlcnZpY2Ugc2lkZQotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoQ2xpZW50U2VydmVyUnVudGltZVNlbGVjdGlvbigpCi0JewkKLQkJVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50VHlwZVJ1bnRpbWVzZXJ2ZXIgPSBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpOwotCQljbGllbnRUeXBlUnVudGltZXNlcnZlci5zZXRSdW50aW1lSWQoZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkuZ2V0UnVudGltZUlkKCkpOwotCQljbGllbnRUeXBlUnVudGltZXNlcnZlci5zZXRTZXJ2ZXJJZChnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRTZXJ2ZXJJZCgpKTsKLQkJY2xpZW50VHlwZVJ1bnRpbWVzZXJ2ZXIuc2V0U2VydmVySW5zdGFuY2VJZChnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQlzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihjbGllbnRUeXBlUnVudGltZXNlcnZlcik7Ci0JfQkKLQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGNhbGxPYmplY3RUcmFuc2Zvcm1hdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24sCi0JCQlJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSwgYm9vbGVhbiByZWZyZXNoUnVudGltZSkKLQl7Ci0JCU9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQgb2JqT3V0cHV0Q29tbWFuZCA9IG5ldyBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kKCk7Ci0JCSAgIG9iak91dHB1dENvbW1hbmQuc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkpOwotCQkgICBvYmpPdXRwdXRDb21tYW5kLnNldE9iamVjdFNlbGVjdGlvbihvYmplY3RTZWxlY3Rpb24pOwotCSAgICAgICBvYmpPdXRwdXRDb21tYW5kLnNldFByb2plY3QocHJvamVjdCk7Ci0JICAgICAgIG9iak91dHB1dENvbW1hbmQuc2V0Q29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKTsJCQkgICAKLQkgICAgICAgCi0JICAgICAgIG9iak91dHB1dENvbW1hbmQuZXhlY3V0ZShudWxsLCBudWxsKTsKLSAgICAgICAgCi0JICAgICAgIHNldFdlYlNlcnZpY2VzUGFyc2VyKG9iak91dHB1dENvbW1hbmQuZ2V0V2ViU2VydmljZXNQYXJzZXIoKSk7Ci0JICAgICAgIHNldE9iamVjdFNlbGVjdGlvbihvYmpPdXRwdXRDb21tYW5kLmdldE9iamVjdFNlbGVjdGlvbigpKTsKLQkgICAgICAgc2V0UHJvamVjdChvYmpPdXRwdXRDb21tYW5kLmdldFByb2plY3QoKSk7ICAgICAgCQkgICAgICAgCi0JICAgICAgIAotCSAgICAgICBpZiAocmVmcmVzaFJ1bnRpbWUgfHwgZm9yY2VSZWZyZXNoUnVudGltZSkKLQkgICAgCSAgIHJlZnJlc2hTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uKCk7ICAKLQkgICAgICAgCi0JICAgICAgIGZvcmNlUmVmcmVzaFJ1bnRpbWUgPSBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBTY2FsZVNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkKLQkJCSAgICAKLQkJCSAgICBTY2FsZSBzY2FsZSA9IChTY2FsZSllLndpZGdldDsKLQkJCQlpbnQgc2VsZWN0aW9uID0gc2NhbGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCi0JCQkJLy9UT0RPOiBjaGFuZ2UgdGhlIGhhcmQgY29kZWQgaW50ZWdlcnMgaGVyZSB0byB0aGUgdGhlIFNjZW5hcmlvQ29udGV4dC5XU194eHggd2hlbiBpbiBsZXNzIGNyaXRpY2FsIHBoYXNlCi0JCQkJc3dpdGNoIChzZWxlY3Rpb24pIHsKLQkJCQljYXNlIDA6Ci0JCQkJCXNlcnZpY2VTY2FsZV8uc2V0VG9vbFRpcFRleHQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfV1NXU0NFTl9TQ0FMRV9URVNUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQlzZXJ2aWNlU2NhbGVfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfUlVOKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlzZXJ2aWNlU2NhbGVfLnNldFRvb2xUaXBUZXh0KENvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1dTV1NDRU5fU0NBTEVfSU5TVEFMTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJc2VydmljZVNjYWxlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0RFUExPWSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDoKLQkJCQkJc2VydmljZVNjYWxlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0FTU0VNQkxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1OgkJCQkJCi0JCQkJY2FzZSA2OgotCQkJCQlzZXJ2aWNlU2NhbGVfLnNldFNlbGVjdGlvbihTY2VuYXJpb0NvbnRleHQuV1NfREVWRUxPUCk7IC8vIm5vIHNlbGVjdGlvbiIgaXMgbm90IGFsbG93ZWQuLi5tdXN0IGRldmVsb3Agc2VydmljZSBAIG1pbmltdW0KLQkJCQkJc2VydmljZVNjYWxlXy5zZXRUb29sVGlwVGV4dChDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9XU1dTQ0VOX1NDQUxFX0RFVkVMT1ApOwotCQkJCQkvL3Jlc2V0IGxvY2FsIHNlbGVjdGlvbiBzbyB0aGF0IHNldHRlcnMgZ2V0IGNvcnJlY3QgdmFsdWUgYmVsb3cKLQkJCQkJc2VsZWN0aW9uID0gU2NlbmFyaW9Db250ZXh0LldTX0RFVkVMT1A7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQlzZXREZXZlbG9wU2VydmljZShzZWxlY3Rpb24gPD0gU2NlbmFyaW9Db250ZXh0LldTX0RFVkVMT1ApOwotCQkJCXNldEFzc2VtYmxlU2VydmljZShzZWxlY3Rpb24gPD0gU2NlbmFyaW9Db250ZXh0LldTX0FTU0VNQkxFKTsKLQkJCQlzZXREZXBsb3lTZXJ2aWNlKHNlbGVjdGlvbiA8PSBTY2VuYXJpb0NvbnRleHQuV1NfREVQTE9ZKTsKLQkJCQkKLQkJCQlzZXRUZXN0U2VydmljZShuZXcgQm9vbGVhbihzZWxlY3Rpb24gPD0gU2NlbmFyaW9Db250ZXh0LldTX1RFU1QpKTsKLQkJCQlzZXRJbnN0YWxsU2VydmljZShuZXcgQm9vbGVhbihzZWxlY3Rpb24gPD0gU2NlbmFyaW9Db250ZXh0LldTX0lOU1RBTEwpKTsKLQkJCQlzZXRTdGFydFNlcnZpY2UobmV3IEJvb2xlYW4oc2VsZWN0aW9uIDw9IFNjZW5hcmlvQ29udGV4dC5XU19TVEFSVCkpOwotCQkJCXNldEFkdmFuY2VkT3B0aW9ucyhzZWxlY3Rpb24gPD0gU2NlbmFyaW9Db250ZXh0LldTX0lOU1RBTEwpOwotCQkJCWNsaWVudFdpZGdldF8uZW5hYmxlQ2xpZW50U2xpZGVyKHNlbGVjdGlvbiA8PSBTY2VuYXJpb0NvbnRleHQuV1NfU1RBUlQpOwotCQkJCQotCQkJCXNldEdyYXBoaWNzKHNlbGVjdGlvbik7Ci0JCQkJCi0JCQkJLy9WYWxpZGF0ZSB0aGUgcGFnZQotCQkJCXZhbGlkYXRpb25TdGF0ZV8gPSAobmV3IFZhbGlkYXRpb25VdGlscygpKS5nZXROZXdWYWxpZGF0aW9uU3RhdGUodmFsaWRhdGlvblN0YXRlXywgVmFsaWRhdGlvblV0aWxzLlZBTElEQVRFX1NDQUxFX0NIQU5HRVMpOwotCQkJCXN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLQkJCQkKLQkJCX0JCQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFNlcnZpY2VJbXBsQnJvd3NlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIJCQkKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeyAgICAgCi0JCQkgICAKLQkJCSAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldF8gPT0gbnVsbCkKLQkJCQkgICBvYmplY3RTZWxlY3Rpb25XaWRnZXRfID0gZ2V0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0JCQkgIAotCQkJICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uID0gbnVsbDsKLQkJCSAgIElQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJICAgU3RyaW5nIGNvbXBvbmVudE5hbWU9IiI7Ci0JCQkgICBpbnQgcmVzdWx0PURpYWxvZy5DQU5DRUw7Ci0JCQkgICAKLQkJCSAgIGlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXRfIGluc3RhbmNlb2YgSU9iamVjdFNlbGVjdGlvbkxhdW5jaGFibGUpCi0JCSAgICAgICB7ICAgICAgCQotCQkJCSBJT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSBsYXVuY2hhYmxlID0gKChJT2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSlvYmplY3RTZWxlY3Rpb25XaWRnZXRfKTsKLQkJCQkgbGF1bmNoYWJsZS5zZXRJbml0aWFsU2VsZWN0aW9uKGdldE9iamVjdFNlbGVjdGlvbigpKTsKLQkJCQkgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQkgICAgICAgICByZXN1bHQgPSBsYXVuY2hhYmxlLmxhdW5jaCh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCSAgICAgICAgIGlmIChyZXN1bHQgPT0gRGlhbG9nLk9LKQotCQkgICAgICAgICB7Ci0JCSAgICAgICAgCSBzZXJ2aWNlSW1wbF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIob2JqZWN0TW9kaWZ5TGlzdGVuZXJfKTsKLQkJCSAgICAgICAgIHNlcnZpY2VJbXBsXy5zZXRUZXh0KGxhdW5jaGFibGUuZ2V0T2JqZWN0U2VsZWN0aW9uRGlzcGxheWFibGVTdHJpbmcoKSk7Ci0JCQkgICAgICAgICBzZXJ2aWNlSW1wbF8uYWRkTW9kaWZ5TGlzdGVuZXIob2JqZWN0TW9kaWZ5TGlzdGVuZXJfKTsKLQkJCSAgICAgICAgIG9iamVjdFNlbGVjdGlvbiA9IGxhdW5jaGFibGUuZ2V0T2JqZWN0U2VsZWN0aW9uKCk7Ci0JCQkgICAgICAgICBwcm9qZWN0ID0gbGF1bmNoYWJsZS5nZXRQcm9qZWN0KCk7Ci0JCQkgICAgICAgICBjb21wb25lbnROYW1lPSBsYXVuY2hhYmxlLmdldENvbXBvbmVudE5hbWUoKTsKLQkJICAgICAgICAgfQotCQkgICAgICAgfQotCQkJICAgZWxzZQotCQkJICAgewotCQkJCSAgIGJyb3dzZURpYWxvZ18uc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkpOwotCQkJCSAgIGJyb3dzZURpYWxvZ18uc2V0SW5pdGlhbFNlbGVjdGlvbihnZXRPYmplY3RTZWxlY3Rpb24oKSk7Ci0JCQkgICAgICAgcmVzdWx0ID0gYnJvd3NlRGlhbG9nXy5vcGVuKCk7Ci0JCQkgICAgICAgaWYgKHJlc3VsdCA9PSBEaWFsb2cuT0spCi0JCQkgICAgICAgewotCQkJICAgIAkgICBzZXJ2aWNlSW1wbF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIob2JqZWN0TW9kaWZ5TGlzdGVuZXJfKTsKLQkJCQkgICAgICAgc2VydmljZUltcGxfLnNldFRleHQoYnJvd3NlRGlhbG9nXy5nZXREaXNwbGF5YWJsZVNlbGVjdGlvblN0cmluZygpKTsgCi0JCQkJICAgICAgIHNlcnZpY2VJbXBsXy5hZGRNb2RpZnlMaXN0ZW5lcihvYmplY3RNb2RpZnlMaXN0ZW5lcl8pOwotCQkJCSAgICAgICBvYmplY3RTZWxlY3Rpb24gPSBicm93c2VEaWFsb2dfLmdldE9iamVjdFNlbGVjdGlvbigpOwotCQkJCSAgICAgICBwcm9qZWN0ID0gYnJvd3NlRGlhbG9nXy5nZXRQcm9qZWN0KCk7Ci0JCQkJICAgICAgIGNvbXBvbmVudE5hbWU9IGJyb3dzZURpYWxvZ18uZ2V0Q29tcG9uZW50TmFtZSgpOwkJCSAgICAgICAKLQkJCSAgICAgICB9Ci0JCQkgICB9Ci0JCQkgICAKLQkJCSAgIC8vIGNhbGwgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZCB0byBjYXJyeSBvdXQgYW55IHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBvYmplY3RTZWxlY3Rpb24KLQkJCSAgIGlmIChyZXN1bHQgPT0gRGlhbG9nLk9LKQotCQkJICAgewotCQkJCSAgIGNhbGxPYmplY3RUcmFuc2Zvcm1hdGlvbihvYmplY3RTZWxlY3Rpb24sIHByb2plY3QsIGNvbXBvbmVudE5hbWUsIGdldFdlYlNlcnZpY2VTY2VuYXJpbygpICE9IFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKTsJCQkJICAgCi0JCQkgICAgICAgdmFsaWRhdGlvblN0YXRlXyA9IFZhbGlkYXRpb25VdGlscy5WQUxJREFURV9BTEw7Ci0JCQkgICAgICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOyAvLyB2YWxpZGF0ZSB0aGUgcGFnZQotCQkJICAgfQkJCSAgIAotCSAgICB9Ci0JfQotCi0JCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ODYxZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTI0ICAgMTQyNjM1IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA3MDMyNyAgIDE3MjMzOSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS51dGlscy5BZGFwdGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAoteyAgICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcl87Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbl87Ci0gIHByaXZhdGUgaW50IHNlcnZpY2VHZW5lcmF0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIGRldmVsb3BTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuIGFzc2VtYmxlU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiBkZXBsb3lTZXJ2aWNlXzsKLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7ICAgIAotICAKLSAgICBTdHJpbmcgdHlwZSAgICAgID0gZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0V2ViU2VydmljZVR5cGUoKTsKLSAgICBTdHJpbmcgcnVudGltZSAgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0RGVmYXVsdFJ1bnRpbWVWYWx1ZUZvciggdHlwZSApOwotCQotICAgIFN0cmluZyBmYWN0b3J5SUQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXREZWZhdWx0U2VydmVyVmFsdWVGb3IodHlwZSk7ICAgIAotICAgIHR5cGVSdW50aW1lU2VydmVyXyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotICAgIAotICAgIHR5cGVSdW50aW1lU2VydmVyXy5zZXRUeXBlSWQoIHR5cGUgKTsKLSAgICB0eXBlUnVudGltZVNlcnZlcl8uc2V0UnVudGltZUlkKCBydW50aW1lICk7Ci0gICAgdHlwZVJ1bnRpbWVTZXJ2ZXJfLnNldFNlcnZlcklkKCBmYWN0b3J5SUQgKTsKLSAgICAKLSAgICAvL0RlZmF1bHQgdGhlIHR5cGVJZCBmcm9tIHRoZSBpbml0aWFsIHNlbGVjdGlvbgotICAgIFN0cmluZ1tdIHR5cGVJZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRXZWJTZXJ2aWNlVHlwZUJ5U2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb25fKTsKLQotICAgIGlmICh0eXBlSWRzIT1udWxsICYmIHR5cGVJZHMubGVuZ3RoPjApCi0gICAgewotICAgICAgdHlwZVJ1bnRpbWVTZXJ2ZXJfLnNldFR5cGVJZCh0eXBlSWRzWzBdKTsKLSAgfSBlbHNlIHsKLQkgIGlmIChpbml0aWFsU2VsZWN0aW9uXyAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uXy5pc0VtcHR5KCkpCi0JICB7IAotCQkgIE9iamVjdCBpbml0aWFsT2JqZWN0ID0gaW5pdGlhbFNlbGVjdGlvbl8uZ2V0Rmlyc3RFbGVtZW50KCk7IAotCQkgIC8vIGluaXRpYWxPYmplY3Qgd291bGQgbm90IGJlIG51bGwgc2luY2UgIWluaXRpYWxTZWxlY3Rpb25fLmlzRW1wdHkoKQotCQkgIE9iamVjdCBhZGFwdGVkT2JqZWN0ID0gQWRhcHRlclV0aWxzLmdldEFkYXB0ZWRPYmplY3QoaW5pdGlhbE9iamVjdCk7Ci0JCSAgaWYgKGFkYXB0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJICBTdHJpbmdCdWZmZXIgZW50cnlidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSk7Ci0JCQkgIGVudHJ5YnVmZi5hcHBlbmQoIi8iKTsKLQkJCSAgZW50cnlidWZmLmFwcGVuZCgib3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5qYXZhIik7Ci0JCQkgIFN0cmluZyBlbnRyeSA9IGVudHJ5YnVmZi50b1N0cmluZygpOyAgICAgCi0JCQkgIHR5cGVSdW50aW1lU2VydmVyXy5zZXRUeXBlSWQoZW50cnkpOwotCQkgIH0KLQkgIH0KLSAgfQotICAgIAotICAgIHNlcnZpY2VHZW5lcmF0aW9uXyA9IGdldFNjZW5hcmlvQ29udGV4dCgpLmdldEdlbmVyYXRlV2ViU2VydmljZSgpOwotICAgIAkKLQlkZXZlbG9wU2VydmljZV8gPSBzZXJ2aWNlR2VuZXJhdGlvbl8gPD0gU2NlbmFyaW9Db250ZXh0LldTX0RFVkVMT1A7Ci0JYXNzZW1ibGVTZXJ2aWNlXyA9IHNlcnZpY2VHZW5lcmF0aW9uXyA8PSBTY2VuYXJpb0NvbnRleHQuV1NfQVNTRU1CTEU7Ci0JZGVwbG95U2VydmljZV8gPSBzZXJ2aWNlR2VuZXJhdGlvbl8gPD0gU2NlbmFyaW9Db250ZXh0LldTX0RFUExPWTsKLSAgICAKLQlkZWZhdWx0Q2xpZW50U2NhbGUoKTsKLQkKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpbml0aWFsU2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEluaXRpYWxTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGluaXRpYWxTZWxlY3Rpb25fIDsKLSAgfQotICAKLSAgSVByb2plY3QgcHJvamVjdF87ICAKLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRJbml0aWFsUHJvamVjdCgpCi0gIHsKLQkgIGlmIChwcm9qZWN0Xz09bnVsbCkKLQkgIHsKLQkgICAgcHJvamVjdF8gPSBnZXRQcm9qZWN0RnJvbU9iamVjdFNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uXyk7Ci0JICB9ICAKLQkgIAotCSAgcmV0dXJuIHByb2plY3RfOwotICB9Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tT2JqZWN0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkKLSAgeyAKLSAgICByZXR1cm4gdHlwZVJ1bnRpbWVTZXJ2ZXJfOwotICB9Ci0KLSAgcHVibGljIEJvb2xlYW4gZ2V0SW5zdGFsbFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRJbnN0YWxsV2ViU2VydmljZSgpICk7ICAKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0U3RhcnRTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0U3RhcnRXZWJTZXJ2aWNlKCkgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGdldFNjZW5hcmlvQ29udGV4dCgpLmdldFRlc3RXZWJTZXJ2aWNlKCkgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRQdWJsaXNoU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGdldFNjZW5hcmlvQ29udGV4dCgpLmdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpICk7Ci0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0R2VuZXJhdGVQcm94eSgpICk7ICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UnVuVGVzdENsaWVudCgpCi0gIHsKLSAgICByZXR1cm4gIGdldFNjZW5hcmlvQ29udGV4dCgpLmlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldE1vbml0b3JTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbihnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRNb25pdG9yV2ViU2VydmljZSgpKTsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRTZXJ2aWNlR2VuZXJhdGlvbigpCi0gIHsKLQkgIHJldHVybiBzZXJ2aWNlR2VuZXJhdGlvbl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0Q2xpZW50R2VuZXJhdGlvbigpCi0gIHsKLQkgIHJldHVybiBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRHZW5lcmF0ZUNsaWVudCgpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXREZXZlbG9wU2VydmljZSgpIHsKLQkgIHJldHVybiBkZXZlbG9wU2VydmljZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEFzc2VtYmxlU2VydmljZSgpIHsKLQkgIHJldHVybiBhc3NlbWJsZVNlcnZpY2VfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3lTZXJ2aWNlKCkgewotCSAgcmV0dXJuIGRlcGxveVNlcnZpY2VfOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTJjYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MjQgICAxNDI2MzUgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNzI3ICAgMTQ0MzU0IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kCi17ICAgIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBpbnN0YWxsU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgc3RhcnRTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICB0ZXN0U2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgdGVzdENsaWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgcnVuVGVzdENsaWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgcHVibGlzaFNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIGdlbmVyYXRlUHJveHlfOwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIGRldmVsb3BTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBhc3NlbWJsZVNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIGRlcGxveVNlcnZpY2VfOyAKLSAgCi0JcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgICByZXNvdXJjZUNvbnRleHRfOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uXzsgCi0gICAgCi0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkKLSAgeyAKLSAgICByZXR1cm4gdHlwZVJ1bnRpbWVTZXJ2ZXJfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbGxTZXJ2aWNlXzsgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBzdGFydFNlcnZpY2VfOyAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFNlcnZpY2VfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRSdW5UZXN0Q2xpZW50KCkKLSAgewotICAgIHJldHVybiBydW5UZXN0Q2xpZW50XzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHB1Ymxpc2hTZXJ2aWNlXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlUHJveHlfOyAgCi0gIH0KLQkKLQlwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpCi0JewotCQlyZXR1cm4gcmVzb3VyY2VDb250ZXh0XzsKLQl9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGdlbmVyYXRlUHJveHlfIFRoZSBnZW5lcmF0ZVByb3h5XyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuZXJhdGVQcm94eV8pCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRlUHJveHlfID0gZ2VuZXJhdGVQcm94eV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBwdWJsaXNoU2VydmljZV8gVGhlIHB1Ymxpc2hTZXJ2aWNlXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoU2VydmljZShib29sZWFuIHB1Ymxpc2hTZXJ2aWNlXykKLSAgewotICAgIHRoaXMucHVibGlzaFNlcnZpY2VfID0gcHVibGlzaFNlcnZpY2VfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gaW5zdGFsbFNlcnZpY2VfIFRoZSBpbnN0YWxsU2VydmljZV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5zdGFsbFNlcnZpY2UoYm9vbGVhbiBpbnN0YWxsU2VydmljZV8pCi0gIHsKLSAgICB0aGlzLmluc3RhbGxTZXJ2aWNlXyA9IGluc3RhbGxTZXJ2aWNlXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHN0YXJ0U2VydmljZV8gVGhlIHN0YXJ0U2VydmljZV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKGJvb2xlYW4gc3RhcnRTZXJ2aWNlXykKLSAgewotICAgIHRoaXMuc3RhcnRTZXJ2aWNlXyA9IHN0YXJ0U2VydmljZV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB0ZXN0U2VydmljZV8gVGhlIHRlc3RTZXJ2aWNlXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZShib29sZWFuIHRlc3RTZXJ2aWNlXykKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2VfID0gdGVzdFNlcnZpY2VfOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIHRlc3RTZXJ2aWNlXyBUaGUgdGVzdFNlcnZpY2VfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1blRlc3RDbGllbnQoYm9vbGVhbiBydW5UZXN0Q2xpZW50XykKLSAgewotICAgIHRoaXMucnVuVGVzdENsaWVudF8gPSBydW5UZXN0Q2xpZW50XzsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlUnVudGltZVNlcnZlcl8gVGhlIHR5cGVSdW50aW1lU2VydmVyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXJfKQotICB7Ci0gICAgdGhpcy50eXBlUnVudGltZVNlcnZlcl8gPSB0eXBlUnVudGltZVNlcnZlcl87Ci0gIH0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoUmVzb3VyY2VDb250ZXh0IHJjKQotCXsKLQkJcmVzb3VyY2VDb250ZXh0XyA9IHJjOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkgICBzZWxlY3Rpb25fID0gc2VsZWN0aW9uOwkKLQl9CQotCQotCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotCXsKLQkgICByZXR1cm4gc2VsZWN0aW9uXzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcFNlcnZpY2UoKSB7Ci0JCXJldHVybiBkZXZlbG9wU2VydmljZV87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGV2ZWxvcFNlcnZpY2UoYm9vbGVhbiBkZXZlbG9wU2VydmljZSkgewotCQl0aGlzLmRldmVsb3BTZXJ2aWNlXyA9IGRldmVsb3BTZXJ2aWNlOwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gZ2V0QXNzZW1ibGVTZXJ2aWNlKCkgewotCQlyZXR1cm4gYXNzZW1ibGVTZXJ2aWNlXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBc3NlbWJsZVNlcnZpY2UoYm9vbGVhbiBhc3NlbWJsZVNlcnZpY2UpIHsKLQkJdGhpcy5hc3NlbWJsZVNlcnZpY2VfID0gYXNzZW1ibGVTZXJ2aWNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERlcGxveVNlcnZpY2UoKSB7Ci0JCXJldHVybiBkZXBsb3lTZXJ2aWNlXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3lTZXJ2aWNlKGJvb2xlYW4gZGVwbG95U2VydmljZSkgewotCQl0aGlzLmRlcGxveVNlcnZpY2VfID0gZGVwbG95U2VydmljZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRUZXN0Q2xpZW50KCkgewotCQlyZXR1cm4gdGVzdENsaWVudF87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVzdENsaWVudChib29sZWFuIHRlc3RDbGllbnRfKSB7Ci0JCXRoaXMudGVzdENsaWVudF8gPSB0ZXN0Q2xpZW50XzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSW1wbFNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZpY2VJbXBsU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjEwYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZpY2VJbXBsU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDEwICAgMTM1NDQxIGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqIDIwMDYwNDE4ICAgMTM2MzM1IGpvYW5AY2EuaWJtLmNvbSAtIEpvYW4gSGFnZ2FydHkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkFic3RyYWN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlBhZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VJbXBsU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3Rpb25EaWFsb2cgewotCi0JVHlwZVJ1bnRpbWVTZXJ2ZXIgdHJzXzsKLQlTdHJpbmcgdGl0bGVUZXh0XzsKLQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25fOwotCQotCXB1YmxpYyBTZXJ2aWNlSW1wbFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIFBhZ2VJbmZvIHBhZ2VJbmZvKSB7Ci0JCXN1cGVyKHBhcmVudCwgcGFnZUluZm8pOwotCQl0aXRsZVRleHRfID0gcGFnZUluZm8uZ2V0UGFnZU5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2FsbFNldHRlcnMoKQotCXsJCQotCQkoKE9iamVjdFNlbGVjdGlvbldpZGdldClnZXRXaWRnZXQoKSkuc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIodHJzXyk7Ci0JCSgoT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KWdldFdpZGdldCgpKS5zZXRJbml0aWFsU2VsZWN0aW9uKHNlbGVjdGlvbl8pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0cnMpCi0JewotCQl0cnNfID0gdHJzOyAKLQkJCi0JCS8vIHNldCBkaWFsb2cgdGl0bGUgdGV4dCBiYXNlZCBvbiB0aGUgd2ViIHNlcnZpY2Ugc2NlbmFyaW8KLQkJaWYgKHRycyAhPSBudWxsKQotCQl7Ci0JCSAgIFN0cmluZyB0eXBlSWQgPSB0cnMuZ2V0VHlwZUlkKCk7Ci0JCSAgIGludCBzY2VuYXJpbyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNjZW5hcmlvRnJvbVR5cGVJZCh0eXBlSWQpOwotCQkgICAKLQkJICAgaWYgKHNjZW5hcmlvID09IFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkKLQkJICAgewotCQkJICB0aXRsZVRleHRfID0gQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkRJQUxPR19USVRJTEVfU0VSVklDRV9JTVBMX1NFTEVDVElPTjsKLQkJICAgfQotCQkgICBlbHNlIGlmIChzY2VuYXJpbyA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikKLQkJICAgewotCQkJICAgdGl0bGVUZXh0XyA9IENvbnN1bXB0aW9uVUlNZXNzYWdlcy5ESUFMT0dfVElUSUxFX1NFUlZJQ0VfREVGX1NFTEVDVElPTjsKLQkJICAgfQotCQl9ICAgICAgICAgICAgIAkgICAKLQl9Ci0JIAotCSAgcHJvdGVjdGVkIHZvaWQgc2V0U2hlbGxTdHlsZShpbnQgbmV3U2hlbGxTdHlsZSkKLQkgIHsKLQkgICAgc3VwZXIuc2V0U2hlbGxTdHlsZSggbmV3U2hlbGxTdHlsZSB8IFNXVC5SRVNJWkUgKTsgIAotCSAgfQotCi0JICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkKLQkgIHsKLQkgICAgbmV3U2hlbGwuc2V0VGV4dCh0aXRsZVRleHRfKTsgICAKLQkgICAgc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCSAgfQotCi0JICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlhYmxlU2VsZWN0aW9uU3RyaW5nKCkgewotCQkgIAotCQkgcmV0dXJuICgoT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KWdldFdpZGdldCgpKS5nZXRPYmplY3RTZWxlY3Rpb25EaXNwbGF5YWJsZVN0cmluZygpOwotCX0KLQkgIAotCSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpIHsKLQkJICByZXR1cm4gKChPYmplY3RTZWxlY3Rpb25XaWRnZXQpZ2V0V2lkZ2V0KCkpLmdldE9iamVjdFNlbGVjdGlvbigpOwotCX0KLQkgIAotCSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKXsKLQkJICByZXR1cm4gKChPYmplY3RTZWxlY3Rpb25XaWRnZXQpZ2V0V2lkZ2V0KCkpLmdldFByb2plY3QoKTsKLQkgIH0KLQkgIAotCSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCl7Ci0JCSAgcmV0dXJuICgoT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KWdldFdpZGdldCgpKS5nZXRDb21wb25lbnROYW1lKCk7ICAKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JICB7Ci0JCSAgc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsgCi0JICB9Ci0JICAKLQkgIHByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpCi0JICB7CQotCQkgIHJldHVybiAoKE9iamVjdFNlbGVjdGlvbldpZGdldClnZXRXaWRnZXQoKSkuZ2V0V2lkZ2V0U2l6ZSgpOwkgICAgCi0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9FeHBvcnRXU1dpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0V4cG9ydFdTV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDRjYjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0V4cG9ydFdTV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFdTV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwb3J0V1NXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5OwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnk7Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5OwotICBwcml2YXRlIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50IHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZzsKLQotICBwdWJsaWMgRXhwb3J0V1NXaWRnZXRCaW5kaW5nKCkKLSAgewotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZyA9IG5ldyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2VxdWVuY2VGcmFnbWVudCByb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiV1NFeHBvcnQiKSk7Ci0gICAgICAgICAgICAgICByb290LmFkZChwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCksICIiKSk7Ci0gICAgICAgICAgICAgICByZXR1cm4gcm9vdDsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5jYW5GaW5pc2hSZWdpc3RyeSA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlckNhbkZpbmlzaCh0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuZGF0YU1hcHBpbmdSZWdpc3RyeSA9IGRhdGFSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJEYXRhTWFwcGluZ3ModGhpcy5kYXRhTWFwcGluZ1JlZ2lzdHJ5KTsKLSAgICAKLSAgICAvLyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudAotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9Qcml2YXRlVURESSIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBMYXVuY2hXZWJTZXJ2aWNlc0V4cGxvcmVyQ29tbWFuZAotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJGb3JjZUxhdW5jaE91dHNpZGVJREUiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiTGF1bmNoT3B0aW9ucyIsIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuY2xhc3MpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy53aWRnZXRSZWdpc3RyeSA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHRoaXMud2lkZ2V0UmVnaXN0cnkpOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJXU0V4cG9ydCIsIAotICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX1dTX1BVQkxJU0gsCi0gICAgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfREVTQ19XU19QVUJMSVNILAotICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBQdWJsaXNoV1NXaWRnZXQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvUHVibGlzaFdTRExXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9QdWJsaXNoV1NETFdpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkNzU3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9QdWJsaXNoV1NETFdpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFdTRExXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHVibGljIFB1Ymxpc2hXU0RMV2lkZ2V0QmluZGluZygpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVGcmFnbWVudCgpOyAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYyksIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL1NlcnZlcldpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL1NlcnZlcldpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4Mjg4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9TZXJ2ZXJXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjA0IDEyNDQwOCAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjAyMDQgMTIxNjA1ICAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyICAgICAgICAgICAKLSAqIDIwMDYwMjIxICAgMTE5MTExIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MDcgICAxMzU0MTUgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQxMCAgIDEzNTU2MiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQxNyAgIDEzNjM5MSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQyNSAgIDEzODA1MiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA1MjQgICAxNDI2MzUgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNTMwICAgMTQ0MzU4IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDYwOCAgIDE0NTUyOSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA2MDkgICAgODY0MjEga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNzI3ICAgMTQ0MzU0IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDcyOCAgIDE0NTQyNiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjA4MTAgICAxMzUzOTUgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIEVuYWJsZSBXVFAgV2ViIHNlcnZpY2UgZnJhbWV3b3JrIG9wZW5pbmcgSmF2YSBlZGl0b3IKLSAqIDIwMDYwODIxICAgMTUzODMzIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBBbGxvdyB0aGUgV2ViIFNlcnZpY2UgVGVzdCBleHRlbnNpb24gcG9pbnQgdG8gc3BlY2lmeSB0aGUgc3VwcG9ydGVkIGNsaWVudCBydW50aW1lCi0gKiAyMDA2MDgyNSAgIDE1NTExNCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5Db21wdXRlRW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5Db21wdXRlUHJveHlFbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZU1vbml0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5NYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uRmluaXNoRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5TY2VuYXJpb0NsZWFudXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb24uQ2xpZW50Um9vdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb24uUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnNlbGVjdGlvbi5TZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5QdWJsaXNoV1NXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hEZWZhdWx0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LlRlc3REZWZhdWx0aW5nRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb24uUHJlU2VydmljZURldmVsb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb24uU2VydmljZVJvb3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5ydW50aW1lLlNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0LkxhdW5jaEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3QuU2VydmljZVRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0LlNlcnZpY2VUZXN0V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkuY29tbWFuZC5PcGVuRWRpdG9yQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIFNlcnZlcldpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0gIHByaXZhdGUgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnOwotCi0gIHB1YmxpYyBTZXJ2ZXJXaWRnZXRCaW5kaW5nKCkKLSAgewotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZyA9IG5ldyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VSb290Q29tbWFuZEZyYWdtZW50KCk7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeV8pOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKSwgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyA9IGRhdGFSZWdpc3RyeTsKLQotICAgIC8vIEJlZm9yZSBTZXJ2ZXJXaXphcmRXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlR2VuZXJhdGlvbiIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7IAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENvbXB1dGVFbmRwb2ludENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDb21wdXRlUHJveHlFbmRwb2ludENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEdlbmVyYXRpb24iLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5zdGFsbENsaWVudCIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7ICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRldmVsb3BTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkFzc2VtYmxlU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXBsb3lTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluc3RhbGxTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXZlbG9wQ2xpZW50IiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkFzc2VtYmxlQ2xpZW50IiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRlcGxveUNsaWVudCIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTdGFydENsaWVudCIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0Q2xpZW50IiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLQotICAgIAotICAgIC8vIEFmdGVyIFNlcnZlcldpemFyZFdpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJJbnN0YWxsU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIkluc3RhbGxDbGllbnQiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJUZXN0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgQ3JlYXRlTW9uaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDb21wdXRlUHJveHlFbmRwb2ludENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiRGV2ZWxvcFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJBc3NlbWJsZVNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJEZXBsb3lTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiRGV2ZWxvcENsaWVudCIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIkFzc2VtYmxlQ2xpZW50IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiRGVwbG95Q2xpZW50IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiU3RhcnRDbGllbnQiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJUZXN0Q2xpZW50IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAgIAotICAgIC8vIEJlZm9yZSBPYmplY3RTZWxlY3Rpb25XaWRnZXQgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIAotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0TmFtZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZUVhclByb2plY3ROYW1lIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlQ29tcG9uZW50VHlwZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZU5lZWRFQVIiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudENvbXBvbmVudFR5cGUiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOyAvL2p2aAotICAgICAgICAgICAgICAgIAotICAgIC8vIEFmdGVyIFNlcnZlcldpemFyZFdpZGdldCAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlNlcnZpY2VSdW50aW1lSWQiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7ICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudFJ1bnRpbWVJZCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdE5hbWUiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiU2VydmljZUVhclByb2plY3ROYW1lIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlNlcnZpY2VDb21wb25lbnRUeXBlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgICAgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50VHlwZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJTZXJ2aWNlTmVlZEVBUiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLQotICAgIC8vIE1hcCBmcmFnbWVudHMgdGhhdCBkZXBlbmQgb24gZGF0YS4gICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlTW9uaXRvckNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcywgIk1vbml0b3JlZFBvcnQiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcywgIk1vbml0b3JlZFBvcnQiLCBDb21wdXRlUHJveHlFbmRwb2ludENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIENvbXB1dGVFbmRwb2ludENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzLCAiRW5kcG9pbnQiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcywgIkVuZHBvaW50IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcywgIkVuZHBvaW50IiwgQ29tcHV0ZVByb3h5RW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyAgQ29tcHV0ZVByb3h5RW5kcG9pbnRDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29tcHV0ZVByb3h5RW5kcG9pbnRDb21tYW5kLmNsYXNzLCAiRW5kcG9pbnQiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyAxNDU0MjYKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlFbmRwb2ludCIsIENvbXB1dGVQcm94eUVuZHBvaW50Q29tbWFuZC5jbGFzcyk7Ci0KLSAgICAvL1NlcnZpY2VUZXN0V2lkZ2V0IG1hcHBpbmdzICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFNlcnZpY2VUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIENyZWF0ZU1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFNlcnZpY2VUZXN0V2lkZ2V0LmNsYXNzKTsKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckluc3RhbmNlSWQiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVRlc3RGYWNpbGl0aWVzIiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZVRlc3RXaWRnZXQuY2xhc3MsICJMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIkxhdW5jaGVkU2VydmljZVRlc3ROYW1lIiwgRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIkxhdW5jaGVkU2VydmljZVRlc3ROYW1lIiwgVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcyk7Ci0gICAgICAgIAotICAgIC8vIEJlZm9yZSBDbGllbnQgVGVzdCB3aWRnZXQuCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgCi0gICAgLy8gQmVmb3JlIENsaWVudFRlc3RXaWRnZXQKLSAgICAgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQWZ0ZXIgQ2xpZW50VGVzdFdpZGdldCAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlJ1blRlc3RDbGllbnQiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSXNUZXN0V2lkZ2V0IixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIC8vIFB1Ymxpc2hXU1dpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9QdWJsaWNVRERJIiwgbnVsbCk7Ci0gICAgCi0gICAgLy8gUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9Qcml2YXRlVURESSIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBMYXVuY2hXZWJTZXJ2aWNlc0V4cGxvcmVyQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIlB1Ymxpc2hUb1ByaXZhdGVVRERJIiwgTGF1bmNoRnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIlB1Ymxpc2hUb1B1YmxpY1VEREkiLCBMYXVuY2hGcmFnbWVudC5jbGFzcyk7Ci0gICAgLy8gVE9ETyBOZWVkIGRlZmF1bHRzIGZvciB0aGVzZSBwcm9wZXJ0aWVzLgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkZvcmNlTGF1bmNoT3V0c2lkZUlERSIsIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkxhdW5jaE9wdGlvbnMiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgIAotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5Xyk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJTZXJ2ZXJXaXphcmRXaWRnZXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX1dTX1BST0pFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1dTX1BST0pFQ1QsCi0JCQkJICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLQkJCQkgICAgICAgIHsKLQkJCQkgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JCQkJICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlcldpemFyZFdpZGdldCggdHJ1ZSwgZmFsc2UgKTsKLQkJCQkgICAgICAgICAgfQotCQkJCSAgICAgICAgfSApOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiVGVzdFNlcnZpY2UiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX1dTVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX0RFU0NfV1NURVNULAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlVGVzdFdpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQ2xpZW50VGVzdFdpZGdldCIsIAotICAgICAgICAgICAgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfVElUTEVfV1NfU0FNUExFLAotICAgICAgICAgICAgQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfREVTQ19XU19TQU1QTEUsCi0gICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudFRlc3RXaWRnZXQoKTsgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIlB1Ymxpc2giLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5QQUdFX1RJVExFX1dTX1BVQkxJU0gsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9ERVNDX1dTX1BVQkxJU0gsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFB1Ymxpc2hXU1dpZGdldCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICB9Ci0gICAgICAKLSAgcHJpdmF0ZSBjbGFzcyBDbGllbnRGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudAotICB7Ci0gICAgYm9vbGVhbiBnZW5Qcm94eV8gPSBmYWxzZTsKLSAgICAKLSAgICBwdWJsaWMgQ2xpZW50RnJhZ21lbnQoKQotICAgIHsgICAgICAKLSAgICAgIHNldENvbmRpdGlvbiggbmV3IENvbmRpdGlvbigpIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5Qcm94eV87Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgIAotICAgICAgU2VxdWVuY2VGcmFnbWVudCBjbGllbnRSb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgIAotICAgICAgY2xpZW50Um9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kKCBmYWxzZSApLCAiIikpOwotICAgICAgLy9jbGllbnRSb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kKCksICIiKSk7IC8vTm90ZTogYWRkZWQgaGVyZSBmb3IgY2xpZW50ICAgICAKLSAgICAgIC8vY2xpZW50Um9vdC5hZGQoIG5ldyBDbGllbnRFeHRlbnNpb25GcmFnbWVudCgpICk7Ci0gICAgICBjbGllbnRSb290LmFkZCggbmV3IENsaWVudFJvb3RGcmFnbWVudCgpICk7Ci0gICAgICBjbGllbnRSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIAotICAgICAgc2V0VHJ1ZUZyYWdtZW50KCBjbGllbnRSb290ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICAgIHsKLSAgICAgIGdlblByb3h5XyA9IGdlblByb3h5OwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIC8vIE1hcCB0aGUgb3V0cHV0IG9mIHRoZSBzZXJ2aWNlIHNjZW5hcmlvIHRvIHRoZSBjbGllbnQgc2NlbmFyaW8uCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckZhY3RvcnlJZCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLQkgIAotICAgICAgCi0gICAgICAvLyBTZXR1cCB0aGUgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXZlbG9wQ2xpZW50IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQXNzZW1ibGVDbGllbnQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXBsb3lDbGllbnQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5zdGFsbENsaWVudCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTdGFydENsaWVudCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgbnVsbCk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRSdW50aW1lSWQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyApOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlVHlwZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgbnVsbCApOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZUNsaWVudCIsIG51bGwgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgU2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgU2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2NlbmFyaW9DbGVhbnVwQ29tbWFuZCgpLCAiIiApKTsKLSAgICAgIAotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkIChuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOyAgCi0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIlNlcnZlcldpemFyZFdpZGdldCIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2VydmljZVJvb3RGcmFnbWVudCgpICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDcmVhdGVNb25pdG9yQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2VydmljZVRlc3RGcmFnbWVudCggIlRlc3RTZXJ2aWNlIikgKTsKLSAgICAgIGFkZCggbmV3IENsaWVudEZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KG5ldyBUZXN0RGVmYXVsdGluZ0ZyYWdtZW50KCksIiIpKTsgCi0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQ29tcHV0ZVByb3h5RW5kcG9pbnRDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBDbGllbnRUZXN0RnJhZ21lbnQoICJDbGllbnRUZXN0V2lkZ2V0IikgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiUHVibGlzaCIpICk7Ci0gICAgICBhZGQocHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgT3BlbkVkaXRvckNvbW1hbmQoKSwgIiIpICk7Ci0gICAgICBhZGQobmV3IExhdW5jaEZyYWdtZW50KCkpOwotICAgICAgYWRkKG5ldyBGaW5pc2hGcmFnbWVudCgpKTsKLSAgICAgIAotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTY2VuYXJpb0NsZWFudXBDb21tYW5kKCksICIiICkpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlckRhdGFNYXBwaW5ncyhkYXRhTWFwcGluZ1JlZ2lzdHJ5Xyk7ICAgCi0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsgICAgICAgICAgICAKLQotICAgICAgLy8gTWFwIFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kIHRvIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlR5cGVSdW50aW1lU2VydmVyIiwgbnVsbCk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCB0byBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRldmVsb3BTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkFzc2VtYmxlU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXBsb3lTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRldmVsb3BDbGllbnQiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQXNzZW1ibGVDbGllbnQiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRGVwbG95Q2xpZW50IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluc3RhbGxDbGllbnQiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU3RhcnRDbGllbnQiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdENsaWVudCIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbnN0YWxsU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVuVGVzdENsaWVudCIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgCi0gICAgICAvLyBNYXAgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC4gICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsUHJvamVjdCIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7IAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluc3RhbGxTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9QdWJsaWNVRERJIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbnN0YWxsQ2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJ1blRlc3RDbGllbnQiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7IAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7IC8vIEtTQwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJEZXZlbG9wU2VydmljZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJBc3NlbWJsZVNlcnZpY2UiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiRGVwbG95U2VydmljZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkluc3RhbGxDbGllbnQiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiU3RhcnRDbGllbnQiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiRGV2ZWxvcENsaWVudCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJBc3NlbWJsZUNsaWVudCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJEZXBsb3lDbGllbnQiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAgIAotICAgICAgLy9NYXAgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZCB0byBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsUHJvamVjdCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsUHJvamVjdCIsIG51bGwpOyAgICAgIAotCi0gICAgICAvL01hcCBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kIHRvIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIAotICAgICAgLy90byB0aGUgdGVzdCB3aXphcmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmljZVRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBXU0RMVGVzdExhdW5jaENvbW1hbmQuY2xhc3MpOyAgICAgCi0gICAgICAKLSAgICAgIC8vIE1hcCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VSdW50aW1lSWQiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFJ1bnRpbWVJZCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QyRUFSUHJvamVjdCIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFYXJQcm9qZWN0TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VDb21wb25lbnRUeXBlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlQ29tcG9uZW50TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZUVhckNvbXBvbmVudE5hbWUiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50VHlwZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZUoyRUVWZXJzaW9uIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZU5lZWRFQVIiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkluc3RhbGxTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgIAotICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1hcCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgU2VydmljZVRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlB1Ymxpc2giLCBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsV1NETFRlc3RMYXVuY2hDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICAKLQkgICAgLy8gU2V0dXAgdGhlIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRldmVsb3BTZXJ2aWNlIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkFzc2VtYmxlU2VydmljZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJEZXBsb3lTZXJ2aWNlIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluc3RhbGxTZXJ2aWNlIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBuZXcgU2VsZWN0aW9uVHJhbnNmb3JtZXIoKSApOwotCQkKLQkgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VDb21wb25lbnRUeXBlIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlVHlwZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUnVudGltZUlkIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlSjJFRVZlcnNpb24iLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3RFQVIiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlQ29tcG9uZW50VHlwZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZVR5cGUiLCBudWxsICk7ICAgICAgCi0JCQkKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyApOwotIAotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1blRlc3RDbGllbnQiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhckNvbXBvbmVudE5hbWUiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkxhdW5jaGVkU2VydmljZVRlc3ROYW1lIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW5UZXN0Q2xpZW50IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsgCi0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSdW5UZXN0Q2xpZW50IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0Q2xpZW50IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIG51bGwpOwotICAgCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RDbGllbnQiLCBUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIG51bGwpOwotICAgCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgbnVsbCk7Ci0gICAJICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFJ1bnRpbWVJZCIsIFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgbnVsbCk7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckluc3RhbmNlSWQiLCBDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAgIC8vIE1hcCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kIGZvciBTZXJ2ZXJTdGFydCgpCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3RFQVIiLCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdE5hbWUiLCBudWxsKTsKLQotICAgICAgLy8gTUFQIHBvc3Qgc2VydmVyIGNvbmZpZyBjYWxsCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlNldEVuZHBvaW50TWV0aG9kIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmVySW5zdGFuY2VJZCIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLQkgIAotICAgICAgLy8gTWFwIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiSXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJTZXJ2ZXIiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcywiU2VydmljZVNlcnZlclR5cGVJZCIsIG51bGwpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzLCJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7ICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1hcCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7ICAgIAotICAgIAotICAgICAgLy8gTWFwIE9wZW5FZGl0b3JDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIE9wZW5FZGl0b3JDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsICAgIE9wZW5FZGl0b3JDb21tYW5kLmNsYXNzICk7ICAgICAgCi0gICAgICAKLSAgICAgIC8vTWFwIEZpbmlzaCBDb21tYW5kIAotICAgICAgCi0gICAgICAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1NlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYThmNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMTMxIDEyMTA3MSAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lciAgICAgCi0gKiAyMDA2MDIyMSAgIDExOTExMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwMjI3ICAgMTI0MzkyIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjAzMTUgICAxMzE5NjMgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDQxOCAgIDEyOTY4OCByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNDI3ICAgMTI2NzgwIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjcgICAxMzgwNTggam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA1MjMgICAxMzM3MTQgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA1MjUgICAxNDM4NDMgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNjA5MDUgICAxNTYyMzAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4sIEhhbmRsaW5nIHByb2plY3RzIHdpdGggbm8gdGFyZ2V0IHJ1bnRpbWUKLSAqIDIwMDcwMzE5CSAgMTU5NDU4IG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbiBhZGRlZCBpbiBzb21lIG51bGwgY2hlY2tzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMucnVudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5GYWNldE1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5GYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uUmVxdWlyZWRGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkRlZmF1bHRpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlByb2plY3RUb3BvbG9neUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuRmFjZXRNYXRjaENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlJ1bnRpbWVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlNlcnZpY2VSdW50aW1lRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLXsJCi0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZ2VuZXJhdGVQcm94eV89dHJ1ZTsgLy9qdmgKLSAgCi0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZUlkc187Ci0gIHByaXZhdGUgYm9vbGVhbiBzZXJ2aWNlSWRzRml4ZWRfID0gZmFsc2U7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VSdW50aW1lSWRfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlQ29tcG9uZW50VHlwZV87Ci0gIHByaXZhdGUgSVByb2plY3QgaW5pdGlhbFByb2plY3RfOwotICBwcml2YXRlIGJvb2xlYW4gc2VydmljZU5lZWRFQVJfID0gdHJ1ZTsKLSAgcHJpdmF0ZSBGYWNldE1hdGNoZXIgc2VydmljZUZhY2V0TWF0Y2hlcl87Ci0KLSAgcHVibGljIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIERlZmF1bHRzIHRoZSBmb2xsb3dpbmcgYml0cyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotICAgKiBzZXJ2aWNlUnVudGltZUlkXyA6IHRoZSBzZXJ2aWNlUnVudGltZUlkLiBNdXN0IGJlIGRlZmF1bHRlZCB0byBub24tZW1wdHkgU3RyaW5nLgotICAgKiBzZXJ2aWNlSWRzXy5ydW50aW1lSWRfOiB0aGUgV2ViIHNlcnZpY2UgcnVudGltZSBpZC4gTXVzdCBiZSBkZWZhdWx0ZWQgdG8gbm9uLWVtcHR5IFN0cmluZy4KLSAgICogc2VydmljZVByb2plY3ROYW1lXyA6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHByb2plY3QuIE11c3QgYmUgbm9uLWVtcHR5LiBNYXkgb3IgbWF5IG5vdCBleGlzdC4KLSAgICogc2VydmljZUNvbXBvbmVudFR5cGVfOiB0aGUgaWQgb2YgdGhlIHNlcnZpY2UgcHJvamVjdCB0ZW1wbGF0ZS4gTXVzdCBiZSBlbXB0eSBpZiB0aGUgc2VydmljZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QgZXhpc3RzLiBNdXN0IGJlIG5vbi1lbXB0eSBvZiB0aGUgc2VydmljZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotICAgKiBzZXJ2aWNlSWRzXy5zZXJ2ZXJJZF86IHRoZSBzZXJ2ZXIgdHlwZSBpZC4gTWF5IGJlIGFuIGVtcHR5IFN0cmluZyBpZiB0aGUgZGVmYXVsdGVkIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCByZXF1aXJlIGEgc2VydmVyLgotICAgKiBzZXJ2aWNlSWRzXy5zZXJ2ZXJJbnN0YW5jZUlkXzogdGhlIHNlcnZlciBpZC4gTWF5IGJlIG51bGwgb3IgYW4gZW1wdHkgU3RyaW5nLgotICAgKiBzZXJ2aWNlTmVlZEVBUl86IHRydWUgaWYgYW4gRUFSIGlzIG5lZWRlZC4gRmFsc2Ugb3RoZXJ3aXNlLgotICAgKiBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfOiB0aGUgc2VydmljZSBFQVIgcHJvamVjdC4gTXVzdCBiZSBlbXB0eSBpZiB0aGUgc2VydmljZU5lZWRFQVJfIGlzIGZhbHNlLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIG5vbi1lbXB0eSBpZiB0aGUgc2VydmljZU5lZWRFQVJfIGlzIHRydWUuCi0gICAqIERlZmF1bHRzIHRoZSBwYXJhbGxlbCBpbmZvcm1hdGlvbiBvbiB0aGUgY2xpZW50LXNpZGUgaWYgbmVlZGVkIAotICAgKiAoQHNlZSBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQjZXhlY3V0ZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsgICAgCi0gICAgSUVudmlyb25tZW50IGVudiA9IGdldEVudmlyb25tZW50KCk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgeyAgICAJCi0gICAgIAotICAgICAvLyoqU3RlcCAxKiogRGVmYXVsdCB0aGUgc2VydmljZVJ1bnRpbWUgYW5kIHRoZSBXZWIgc2VydmljZSBydW50aW1lLgotICAgICAvL3NlcnZpY2VJZHNGaXhlZF8gaXMgc2V0IHRvIHRydWUgZm9yIHRoZSBBbnQgc2NlbmFyaW8uIEl0J3MgYWx3YXlzIGZhbHNlIGZvciB0aGUgd2l6YXJkCi0gICAgIC8vc2NlbmFyaW9zLiAgICAJCi0gICAgIGlmIChzZXJ2aWNlSWRzRml4ZWRfKQotICAgICB7Ci0gICAgICAgLy9TZXQgdGhlIHNlcnZpY2VSdW50aW1lIGJhc2VkIG9uIHRoZSBydW50aW1lIGFuZCBzZXJ2ZXIuCi0gICAgICAgLy9JZiB1c2VyIHNldCBhIHNlcnZpY2UgcHJvamVjdCB1c2UgdGhhdCBhcyBpbml0aWFsIHByb2plY3Qgb3RoZXJ3aXNlIGRlZmF1bHQgZnJvbSBpbml0aWFsIHNlbGVjdGlvbi4KLSAgICAJIGlmIChzZXJ2aWNlUHJvamVjdE5hbWVfICE9IG51bGwpIAotICAgIAkgewotICAgIAkJIGluaXRpYWxQcm9qZWN0XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChzZXJ2aWNlUHJvamVjdE5hbWVfKTsKLSAgICAJCSAKLSAgICAJCSBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gZ2V0RGVmYXVsdFJ1bnRpbWUoaW5pdGlhbFByb2plY3RfLCBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSwgZmFsc2UpOwotICAgICAgICAgICAgIHNlcnZpY2VGYWNldE1hdGNoZXJfID0gZHJ0LmdldEZhY2V0TWF0Y2hlcigpOwotICAgIAkgICAgIHNlcnZpY2VQcm9qZWN0TmFtZV8gPSBkcnQuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAJICAgICBzZXJ2aWNlUnVudGltZUlkXyA9IGRydC5nZXRSdW50aW1lSWQoKTsgICAgICAgCi0KLSAgICAJICAgICAgIGlmIChzZXJ2aWNlUnVudGltZUlkXyAhPSBudWxsKQotICAgIAkgICAgICAgewotICAgIAkgICAgCSAgIHNlcnZpY2VJZHNfLnNldFJ1bnRpbWVJZChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2aWNlUnVudGltZURlc2NyaXB0b3JCeUlkKHNlcnZpY2VSdW50aW1lSWRfKS5nZXRSdW50aW1lKCkKLSAgICAJICAgICAgCSAgICAgICAgIC5nZXRJZCgpKTsKLSAgICAJICAgICAgIH0KLSAgICAJIH0KLSAgICAJIGVsc2UKLSAgICAJIHsKLSAgICAJCSBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gZ2V0RGVmYXVsdFNlcnZpY2VSdW50aW1lRm9yRml4ZWRSdW50aW1lQW5kU2VydmVyKGluaXRpYWxQcm9qZWN0Xyk7ICAKLSAgICAJICAgICBzZXJ2aWNlRmFjZXRNYXRjaGVyXyA9IGRydC5nZXRGYWNldE1hdGNoZXIoKTsKLSAgICAJICAgICBzZXJ2aWNlUHJvamVjdE5hbWVfID0gZHJ0LmdldFByb2plY3ROYW1lKCk7Ci0gICAgCSAgICAgc2VydmljZVJ1bnRpbWVJZF8gPSBkcnQuZ2V0UnVudGltZUlkKCk7CSAKLSAgICAJIH0gICAKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAvLyBTZXQgdGhlIHJ1bnRpbWUgYmFzZWQgb24gdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0gICAgICAgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0IGRydCA9IGdldERlZmF1bHRSdW50aW1lKGluaXRpYWxQcm9qZWN0Xywgc2VydmljZUlkc18uZ2V0VHlwZUlkKCksIGZhbHNlKTsKLSAgICAgICBzZXJ2aWNlRmFjZXRNYXRjaGVyXyA9IGRydC5nZXRGYWNldE1hdGNoZXIoKTsKLSAgICAgICBzZXJ2aWNlUHJvamVjdE5hbWVfID0gZHJ0LmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgc2VydmljZVJ1bnRpbWVJZF8gPSBkcnQuZ2V0UnVudGltZUlkKCk7ICAgICAgIAotCi0gICAgICAgaWYgKHNlcnZpY2VSdW50aW1lSWRfICE9IG51bGwpCi0gICAgICAgewotICAgIAkgICBzZXJ2aWNlSWRzXy5zZXRSdW50aW1lSWQoV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChzZXJ2aWNlUnVudGltZUlkXykuZ2V0UnVudGltZSgpCi0gICAgCQkgICAgICAgICAuZ2V0SWQoKSk7IAotICAgICAgIH0gCi0gICAgIH0KLSAgICAgCi0gICAgIC8vKipTdGVwIDIqKiBEZWZhdWx0IHRoZSBzZXJ2aWNlIHByb2plY3QgaWYgaXQgd2FzIG5vdCBhbHJlYWR5IGRlZmF1bHRlZCAKLSAgICAgLy9hcyBwYXJ0IG9mIGRlZmF1bHRpbmcgdGhlIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAgIGlmIChzZXJ2aWNlUHJvamVjdE5hbWVfID09IG51bGwpCi0gICAgIHsKLSAgICAgICAvLyBQcm9qZWN0IG5hbWUgZGlkIG5vdCBnZXQgc2V0IHdoZW4gdGhlIHJ1bnRpbWUgd2FzIHNldCwgc28gc2V0IGl0IG5vdwotICAgICAgIHNlcnZpY2VQcm9qZWN0TmFtZV8gPSBnZXREZWZhdWx0U2VydmljZVByb2plY3ROYW1lKCk7Ci0gICAgIH0KLQotICAgICAvLyoqU3RlcCAzKiogRGVmYXVsdCB0aGUgc2VydmljZSBwcm9qZWN0IHR5cGUuCi0gICAgIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHNlcnZpY2VQcm9qZWN0TmFtZV8pOyAKLSAgICAgaWYgKCFzZXJ2aWNlUHJvamVjdC5leGlzdHMoKSkKLSAgICAgewotICAgICAgIC8vIFNldCB0aGUgcHJvamVjdCB0ZW1wbGF0ZQotICAgICAgIHNlcnZpY2VDb21wb25lbnRUeXBlXyA9IGdldERlZmF1bHRTZXJ2aWNlUHJvamVjdFRlbXBsYXRlKCk7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgLy9TZXQgaXQgdG8gYW4gZW1wdHkgU3RyaW5nCi0gICAgICAgc2VydmljZUNvbXBvbmVudFR5cGVfID0gIiI7Ci0gICAgIH0KLSAgICAgLy8qKlN0ZXAgNCoqIERlZmF1bHQgdGhlIHNlcnZlciBpZiB0aGlzIGlzIG5vdCBhbiBBbnQgc2NlbmFyaW8uCi0gICAgIGlmICghc2VydmljZUlkc0ZpeGVkXykKLSAgICAgewotICAgICAgIC8vIFNldCB0aGUgc2VydmVyCi0gICAgICAgSVN0YXR1cyBzZXJ2ZXJTdGF0dXMgPSBzZXRTZXJ2aWNlRGVmYXVsdFNlcnZlcigpOwotICAgICAgIGlmIChzZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgewotICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzZXJ2ZXJTdGF0dXMpOwotICAgICAgICAgcmV0dXJuIHNlcnZlclN0YXR1czsKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgCi0gICAgIC8vKipTdGVwIDUqKiBEZWZhdWx0IGNsaWVudE5lZWRFQVIgYW5kIGNsaWVudCBFQVIgaWYgYW4gRUFSIGlzIG5lZWRlZAotICAgICBzZXREZWZhdWx0U2VydmljZUVhclByb2plY3QoKTsKLSAgICAgCi0gICAgIC8vIGp2aCAtIGZvciBub3cgY29tbWVudCBvdXQgZ2VuZXJhdGUgcHJveHkKLSAgICAgLy8gICBuZWVkIHRvIGxvb2sgYXQgZGVmYXVsdGluZyBiYXNlZCBvbiBhbiBldmVudAotICAgICAvLyAgICBvbiBwYWdlIDEgLSB3aGVuIGNsaWVudCBnZW5lcmF0aW9uIGdvZXMgZnJvbSBub25lCi0gICAgIC8vICAgIHRvIGRldmVsb3AuLi4KLSAgICAgLyppZiAoZ2VuZXJhdGVQcm94eV8pCi0gICAgIHsqLwotICAgIAkgLy9EZWZhdWx0IHRoZSBjbGllbnQtc2lkZS4KLSAgICAJIElTdGF0dXMgY2xpZW50U2lkZVN0YXR1cyA9IGRlZmF1bHRDbGllbnRTaWRlKG1vbml0b3IpOwotICAgICAgICAgaWYgKGNsaWVudFNpZGVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBjbGllbnRTaWRlU3RhdHVzOwotICAgICAgICAgfSAgICAgICAgICAgICAgICAgIAotICAgIC8vIH0KLSAgICAgICAgICAKLSAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgIAotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIENhdGNoIGFsbCBFeGNlcHRpb25zIGluIG9yZGVyIHRvIGdpdmUgc29tZSBmZWVkYmFjayB0byB0aGUgdXNlcgotICAgICAgSVN0YXR1cyBlcnJvclN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfVEFTS19FWENFUFRFRCwKLSAgICAgICAgICBuZXcgU3RyaW5nW10geyBlLmdldE1lc3NhZ2UoKSB9KSwgZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgIHJldHVybiBlcnJvclN0YXR1czsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIElTdGF0dXMgZGVmYXVsdENsaWVudFNpZGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0gICAgSVN0YXR1cyBjbGllbnREZWZhdWx0RnJvbVNlcnZpY2VTdGF0dXMgPSBkZWZhdWx0Q2xpZW50U2lkZUZyb21TZXJ2aWNlU2lkZShzZXJ2aWNlUHJvamVjdE5hbWVfLCBzZXJ2aWNlSWRzXywgc2VydmljZU5lZWRFQVJfLCBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfKTsKLQotICAgIC8vIElmIGFuIGVycm9yIHN0YXR1cyBpcyByZXR1cm5lZCwgdGhlIG9ubHkgcHJvcGVydHkgdGhhdCB3YXMgc2V0IG9uIAotICAgIC8vIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBpcyBjbGllbnRQcm9qZWN0TmFtZV8uIAotICAgIC8vIFRoZSByZXN0IG9mIHRoZSBwcm9wZXJ0aWVzIGluY2x1ZGluZyBjbGllbnRSdW50aW1lSWRfLCBjbGllbnRDb21wb25lbnRUeXBlXywgCi0gICAgLy8gYWxsIHRoZSB2YWx1ZXMgaW4gY2xpZW50SWRzXywgY2xpZW50TmVlZEVBUl8sIGFuZCBjbGllbnRFYXJQcm9qZWN0TmFtZV8gCi0gICAgLy8gaGF2ZSBub3QgYmVlbiBzZXQgYmVjYXVzZSB0aGUgc2VydmljZSBzaWRlIHNlcnZlciBhbmQKLSAgICAvLyB3ZWIgc2VydmljZSBydW50aW1lIGNvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZS4gUnVuIHRoZSBlbnRpcmUKLSAgICAvLyBjbGllbnQtc2lkZSBkZWZhdWx0aW5nIGFsZ29yaXRobSB1c2luZyBjbGllbnRQcm9qZWN0TmFtZV8gYXMgdGhlIAotICAgIC8vIGNsaWVudEluaXRpYWxQcm9qZWN0Xy4gVGhlbiB1cGRhdGUgdGhlIGNsaWVudEVhclByb2plY3ROYW1lXyBiYXNlZCBvbiB0aGUKLSAgICAvLyBzZXJ2aWNlIHNpZGUgRUFSLgotICAgIGlmIChjbGllbnREZWZhdWx0RnJvbVNlcnZpY2VTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotICAgIHsKLSAgICAgIC8vIDEuIFJ1biBjbGllbnQgc2lkZSBkZWZhdWx0aW5nIGZyb20gc2NyYXRjaCB3aXRoIGNsaWVudEluaXRpYWxQcm9qZWN0XwotICAgICAgLy8gc2V0IHRvIHRoZSBuZXcgY2xpZW50UHJvamVjdE5hbWVfLgotICAgICAgSVByb2plY3QgY2xpZW50UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXRDbGllbnRQcm9qZWN0TmFtZSgpKTsKLSAgICAgIHNldENsaWVudEluaXRpYWxQcm9qZWN0KGNsaWVudFByb2plY3QpOwotICAgICAgSVN0YXR1cyBjbGllbnRFeGVjdXRlU3RhdHVzID0gc3VwZXIuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLSAgICAgIGlmIChjbGllbnRFeGVjdXRlU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgewotICAgICAgICByZXR1cm4gY2xpZW50RXhlY3V0ZVN0YXR1czsKLSAgICAgIH0KLQotICAgICAgLy8gMi4gVXBkYXRlIHRoZSBjbGllbnQtc2lkZSBFQVIgaWYgc2VydmljZU5lZWRFQVJfIGlzIHRydWU7Ci0gICAgICBpZiAoc2VydmljZU5lZWRFQVJfKQotICAgICAgewotICAgICAgICBkZWZhdWx0Q2xpZW50RWFyRnJvbVNlcnZpY2VFYXIoc2VydmljZVByb2plY3ROYW1lXywgc2VydmljZUVhclByb2plY3ROYW1lXyk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCSAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0U2VydmljZUVhclByb2plY3QoKQotICB7Ci0gICAgLy9Eb24ndCBuZWVkIGFuIGVhciBpZiB0aGlzIGlzIGEgSmF2YSBwcm9qZWN0LCBvciBpZiB0aGUgc2VsZWN0ZWQgdGVtcGxhdGUgaXMganN0LnV0aWxpdHkKLSAgICBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChzZXJ2aWNlUHJvamVjdE5hbWVfKTsKLSAgICBpZiAoc2VydmljZVByb2plY3QuZXhpc3RzKCkpCi0gICAgewotICAgICAgc2VydmljZU5lZWRFQVJfID0gIShGYWNldFV0aWxzLmlzSmF2YVByb2plY3Qoc2VydmljZVByb2plY3QpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNlcnZpY2VOZWVkRUFSXyA9ICEoRmFjZXRVdGlscy5pc1V0aWxpdHlUZW1wbGF0ZShzZXJ2aWNlQ29tcG9uZW50VHlwZV8pKTsgIAotICAgIH0gICAgCi0gICAgCi0gICAgLy9JZiBzZXJ2aWNlTmVlZEVBUl8gaXMgc3RpbGwgdHJ1ZSwgaXQgbWVhbnMgdGhhdCB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgSmF2YSBwcm9qZWN0Ci0gICAgLy9vciBKYXZhIHByb2plY3QgdHlwZS4gQ2hlY2sgdGhlIHNlcnZlci4KLSAgICAKLSAgICAKLSAgICBpZiAoc2VydmljZU5lZWRFQVJfKQotICAgIHsKLSAgICAgIAotICAgICAgLy8gRGV0ZXJtaW5lIGlmIGFuIGVhciBzZWxlY3Rpb24gaXMgbmVlZGVkIGJhc2VkIG9uIHRoZSBzZXJ2ZXIgdHlwZS4gICAgICAKLSAgICAgIFN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZpY2VJZHNfLmdldFNlcnZlcklkKCk7Ci0gICAgICBpZiAoc2VydmVySWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVXNlIHRoZSBzZXJ2ZXIgdHlwZQotICAgICAgICBTdHJpbmcgc2VydmVyVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlcklkKTsKLSAgICAgICAgaWYgKHNlcnZlclRhcmdldElkICE9IG51bGwgJiYgc2VydmVyVGFyZ2V0SWQubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHNlcnZlclRhcmdldElkLCAiMTMiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBEZWZhdWx0IHRoZSBFQVIgc2VsZWN0aW9uIHRvIGJlIGVtcHR5Ci0gICAgICAgICAgICBzZXJ2aWNlTmVlZEVBUl8gPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7IC8vIHNlcnZlcklkID09IG51bGwsIGFzc3VtZSB0aGF0IGl0IGRvZXMgbm90IG5lZWQgRUFSCi0gICAgCSAgc2VydmljZU5lZWRFQVJfID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChzZXJ2aWNlTmVlZEVBUl8pCi0gICAgewotICAgICAgc2VydmljZUVhclByb2plY3ROYW1lXyA9IERlZmF1bHRpbmdVdGlscy5nZXREZWZhdWx0RUFSUHJvamVjdE5hbWUoc2VydmljZVByb2plY3ROYW1lXyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfID0gIiI7Ci0gICAgfSAgIAotICB9Ci0gIAotICBwcml2YXRlIElTdGF0dXMgc2V0U2VydmljZURlZmF1bHRTZXJ2ZXIoKQotICB7Ci0gICAgLy9DaG9vc2UgYW4gZXhpc3Rpbmcgc2VydmVyIHRoZSBtb2R1bGUgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggaWYgcG9zc2libGUKLSAgICBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChzZXJ2aWNlUHJvamVjdE5hbWVfKTsKLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShTZXJ2ZXJVdGlscy5nZXRNb2R1bGUoc2VydmljZVByb2plY3QpLCBudWxsKTsKLSAgICBpZiAoY29uZmlndXJlZFNlcnZlcnMhPW51bGwgJiYgY29uZmlndXJlZFNlcnZlcnMubGVuZ3RoPjApCi0gICAgewotICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySWQoY29uZmlndXJlZFNlcnZlcnNbMF0uZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySW5zdGFuY2VJZChjb25maWd1cmVkU2VydmVyc1swXS5nZXRJZCgpKTsKLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOyAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8vSWYgdGhlIHByb2plY3QgZXhpc3RzLCBjaG9vc2UgYSBzdWl0YWJsZSBzZXJ2ZXIgb3Igc2VydmVyIHR5cGUgYmFzZWQgb24gdGhlIGV4aXN0aW5nIHByb2plY3QncyBydW50aW1lIG9yIGZhY2V0cwotICAgIGlmIChzZXJ2aWNlUHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IGdldFNlcnZlckZyb21Qcm9qZWN0KHNlcnZpY2VQcm9qZWN0TmFtZV8sIHNlcnZpY2VGYWNldE1hdGNoZXJfKTsKLSAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySWQoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXIuZ2V0SWQoKSk7Ci0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gZ2V0U2VydmVyVHlwZUZyb21Qcm9qZWN0KHNlcnZpY2VQcm9qZWN0TmFtZV8sIHNlcnZpY2VGYWNldE1hdGNoZXJfKTsKLSAgICAgICAgaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlcklkKHNlcnZlclR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9IYXZlbid0IHBpY2tlZCBhIHNlcnZlci9zZXJ2ZXIgdHlwZSBvbiB0aGUgYmFzaXMgb2YgdGhlIHByb2plY3QuIFBpY2sgYSBzZXJ2ZXIvc2VydmVyIHR5cGUKLSAgICAvL3RoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJ2aWNlUnVudGltZUlkLgotICAgIElTZXJ2ZXIgc2VydmVyID0gZ2V0U2VydmVyRnJvbVNlcnZpY2VSdW50aW1lSWQoKTsKLSAgICBpZiAoc2VydmVyIT1udWxsKQotICAgIHsKLSAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlcklkKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZlci5nZXRJZCgpKTsKLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLSAgICAKLSAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gZ2V0U2VydmVyVHlwZUZyb21TZXJ2aWNlUnVudGltZUlkKCk7Ci0gICAgaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJUeXBlLmdldElkKCkpOwotICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfSAgICAKLQotICAgIC8vTm8gc3VpdGFibGUgc2VydmVyIHdhcyBmb3VuZC4gUG9wdXAgYW4gZXJyb3IuCi0gICAgUnVudGltZURlc2NyaXB0b3IgcnVudGltZURlc2NyaXB0b3IgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lQnlJZChzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0gICAgaWYgKHJ1bnRpbWVEZXNjcmlwdG9yLmdldFNlcnZlclJlcXVpcmVkKCkpCi0gICAgeyAgICAKLSAgICAgIFN0cmluZyBydW50aW1lTGFiZWwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRSdW50aW1lTGFiZWxCeUlkKHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKTsgICAgCi0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKENvbnN1bXB0aW9uVUlNZXNzYWdlcy5NU0dfRVJST1JfTk9fU0VSVkVSX1JVTlRJTUUsIG5ldyBTdHJpbmdbXXtydW50aW1lTGFiZWx9KSApOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0gIAotICAKLSAgcHJpdmF0ZSBJU2VydmVyIGdldFNlcnZlckZyb21TZXJ2aWNlUnVudGltZUlkKCkKLSAgewotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApIAotICAgIHsKLSAgICAgIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgICAgU3RyaW5nIHByZWZlcnJlZFNlcnZlckZhY3RvcnlJZCA9IGNvbnRleHQuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0KLSAgICAgIC8vSWYgYSBzZXJ2ZXIgb2YgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgdHlwZSBpcyBwcmVzZW50LCBjaGVjayB0aGF0IG9uZSBmaXJzdAotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzZXJ2ZXJzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgIAlpZiAoc2VydmVyc1tqXSAhPSBudWxsICYmIHNlcnZlcnNbal0uZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpCi0gICAgCXsKLQkgICAgICAgIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJzW2pdLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCSAgICAgICAgaWYgKHNlcnZlckZhY3RvcnlJZCA9PSBwcmVmZXJyZWRTZXJ2ZXJGYWN0b3J5SWQpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGlmIChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5kb2VzU2VydmljZVJ1bnRpbWVTdXBwb3J0U2VydmVyKHNlcnZpY2VSdW50aW1lSWRfLCBzZXJ2ZXJGYWN0b3J5SWQpKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgcmV0dXJuIHNlcnZlcnNbal07Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0gIAotICAgIAl9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vQSBzZXJ2ZXIgb2YgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgdHlwZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgZGlkIG5vdCBtYXRjaC4gQ2hlY2sgYWxsIHRoZSBleGlzdGluZyBzZXJ2ZXJzLiAgICAKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAJaWYgKHNlcnZlcnNbaV0gIT0gbnVsbCAmJiBzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKQotICAgIAl7Ci0JICAgICAgICBTdHJpbmcgc2VydmVyRmFjdG9yeUlkID0gc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkgICAgICAgIGlmIChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5kb2VzU2VydmljZVJ1bnRpbWVTdXBwb3J0U2VydmVyKHNlcnZpY2VSdW50aW1lSWRfLCBzZXJ2ZXJGYWN0b3J5SWQpKQotCSAgICAgICAgewotCSAgICAgICAgICByZXR1cm4gc2VydmVyc1tpXTsKLQkgICAgICAgIH0KLSAgICAJfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgSVNlcnZlclR5cGUgZ2V0U2VydmVyVHlwZUZyb21TZXJ2aWNlUnVudGltZUlkKCkKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlclR5cGVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmVyRmFjdG9yeUlkc0J5U2VydmljZVJ1bnRpbWUoc2VydmljZVJ1bnRpbWVJZF8pOwotICAgIGlmIChzZXJ2ZXJUeXBlcyE9bnVsbCAmJiBzZXJ2ZXJUeXBlcy5sZW5ndGg+MCkKLSAgICB7Ci0gICAgICAvL1JldHVybiB0aGUgcHJlZmVycmVkIG9uZSBpZiBpdCBpcyBpbiB0aGUgbGlzdAotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICBTdHJpbmcgcHJlZmVycmVkU2VydmVyRmFjdG9yeUlkID0gY29udGV4dC5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlcnZlclR5cGVzW2ldLmVxdWFscyhwcmVmZXJyZWRTZXJ2ZXJGYWN0b3J5SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZXNbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlclR5cGVzWzBdKTsKLSAgICB9ICAgIAotICAgIAotICAgIHJldHVybiBudWxsOwotICB9ICAKLSAgCi0gIAotICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0U2VydmljZVByb2plY3RUZW1wbGF0ZSgpCi0gIHsKLSAgICBTdHJpbmdbXSB0ZW1wbGF0ZXMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2aWNlUHJvamVjdFRlbXBsYXRlcyhzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSwgc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCkpOyAgICAKLSAgICAKLSAgICAvL1dhbGsgdGhlIGxpc3Qgb2Ygc2VydmljZSBwcm9qZWN0IHR5cGVzIGluIHRoZSBwcm9qZWN0IHRvcG9sb2d5IHByZWZlcmVuY2UKLSAgICBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IHB0Yz0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0gICAgU3RyaW5nW10gcHJlZmVycmVkVGVtcGxhdGVJZHMgPSBwdGMuZ2V0U2VydmljZVR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcmVmZXJyZWRUZW1wbGF0ZUlkcy5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlSWQgPSB0ZW1wbGF0ZXNbaV07Ci0gICAgICAgIGlmICh0ZW1wbGF0ZUlkLmVxdWFscyhwcmVmZXJyZWRUZW1wbGF0ZUlkc1tqXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIG1hdGNoZXMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5kb2VzU2VydmljZVJ1bnRpbWVTdXBwb3J0VGVtcGxhdGUoc2VydmljZVJ1bnRpbWVJZF8sIHRlbXBsYXRlSWQpOwotICAgICAgICAgIGlmIChtYXRjaGVzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZXNbaV07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vU2luY2UgdGhlIHByZWZlcnJlZFRlbXBsYXRlSWRzIGNvbnRhaW5zIHRoZSB1bmlvbiBvZiBhbGwgcHJvamVjdCB0eXBlcyBmb3IgYWxsIHNlcnZpY2UgcnVudGltZXMsIHdlIGFyZQotICAgIC8vZ3VhcmFudGVlZCB0byBoYXZlIHJldHVybmVkIGJ5IG5vdywgc28gdGhlIGNvZGUgYmVsb3cgd2lsbCBuZXZlciBiZSBleGVjdXRlZCB1bmRlciBub3JtYWwKLSAgICAvL2NpcmN1bXN0YW5jZXMuIEp1c3QgcmV0dXJuIHNvbWV0aGluZyB0byBzYXRpc2Z5IHRoZSBjb21waWxlci4KLSAgICBpZiAodGVtcGxhdGVzLmxlbmd0aCA+IDApCi0gICAgICByZXR1cm4gdGVtcGxhdGVzWzBdOwotICAgIAotICAgIHJldHVybiAiIjsgICAgCi0gICAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFNlcnZpY2VQcm9qZWN0TmFtZSgpCi0gIHsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gRmFjZXRVdGlscy5nZXRBbGxQcm9qZWN0cygpOwotICAgIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRvciBkZXNjID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChzZXJ2aWNlUnVudGltZUlkXyk7Ci0gICAgUmVxdWlyZWRGYWNldFZlcnNpb25bXSByZnZzID0gZGVzYy5nZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMoKTsKLSAgICAKLSAgICAvL0NoZWNrIGVhY2ggcHJvamVjdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBzZXJ2aWNlUnVudGltZQotICAgIGZvciAoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTZXQgZmFjZXRWZXJzaW9ucyA9IEZhY2V0VXRpbHMuZ2V0RmFjZXRzRm9yUHJvamVjdChwcm9qZWN0c1tpXS5nZXROYW1lKCkpOwotICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBmUnVudGltZSA9IG51bGw7Ci0gICAgICBTdHJpbmcgZlJ1bnRpbWVOYW1lID0gbnVsbDsKLSAgICAgIGZSdW50aW1lID0gRmFjZXRVdGlscy5nZXRGYWNldFJ1bnRpbWVGb3JQcm9qZWN0KHByb2plY3RzW2ldLmdldE5hbWUoKSk7Ci0gICAgICBpZiAoZlJ1bnRpbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZlJ1bnRpbWVOYW1lID0gZlJ1bnRpbWUuZ2V0TmFtZSgpOyAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgICAKLSAgICAgIAotICAgICAgaWYgKGZhY2V0VmVyc2lvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRmFjZXRNYXRjaGVyIGZtID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0TWF0Y2hGb3JQcm9qZWN0KGZhbHNlLCBzZXJ2aWNlUnVudGltZUlkXywgcHJvamVjdHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgYm9vbGVhbiBmYWNldFJ1bnRpbWVNYXRjaGVzID0gdHJ1ZTsKLSAgICAgICAgaWYgKGZSdW50aW1lTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZmFjZXRSdW50aW1lTWF0Y2hlcyA9IEZhY2V0VXRpbHMuaXNGYWNldFJ1bnRpbWVTdXBwb3J0ZWQocmZ2cywgZlJ1bnRpbWVOYW1lKTsgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZm0uaXNNYXRjaCgpICYmIGZhY2V0UnVudGltZU1hdGNoZXMpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlRmFjZXRNYXRjaGVyXyA9IGZtOwotICAgICAgICAgIHJldHVybiBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL05vIHByb2plY3Qgd2FzIHN1aXRhYmxlLCByZXR1cm4gYSBuZXcgcHJvamVjdCBuYW1lCi0gICAgcmV0dXJuIFJlc291cmNlVXRpbHMuZ2V0RGVmYXVsdFdlYlByb2plY3ROYW1lKCk7Ci0gICAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBEZWZhdWx0UnVudGltZVRyaXBsZXQgZ2V0RGVmYXVsdFNlcnZpY2VSdW50aW1lRm9yRml4ZWRSdW50aW1lQW5kU2VydmVyKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2aWNlUnVudGltZXMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2aWNlUnVudGltZXNCeVNlcnZpY2VUeXBlKHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpKTsKLSAgICBBcnJheUxpc3QgdmFsaWRTZXJ2aWNlUnVudGltZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZpY2VSdW50aW1lcy5sZW5ndGg7IGkrKyApCi0gICAgewotICAgICAgU2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yIGRlc2MgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRTZXJ2aWNlUnVudGltZURlc2NyaXB0b3JCeUlkKHNlcnZpY2VSdW50aW1lc1tpXSk7Ci0gICAgICBpZiAoZGVzYy5nZXRSdW50aW1lKCkuZ2V0SWQoKS5lcXVhbHMoc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCkpKQotICAgICAgewotICAgICAgICAvL0NoZWNrIGlmIHRoaXMgc2VydmljZSBydW50aW1lIHN1cHBvcnRzIHRoZSBzZXJ2ZXIKLSAgICAgICAgaWYgKFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmRvZXNTZXJ2aWNlUnVudGltZVN1cHBvcnRTZXJ2ZXIoZGVzYy5nZXRJZCgpLCBzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIHZhbGlkU2VydmljZVJ1bnRpbWVzLmFkZChkZXNjLmdldElkKCkpOwotICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIFNldCBmYWNldFZlcnNpb25zID0gRmFjZXRVdGlscy5nZXRGYWNldHNGb3JQcm9qZWN0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChmYWNldFZlcnNpb25zICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZhY2V0TWF0Y2hlciBmbSA9IEZhY2V0TWF0Y2hDYWNoZS5nZXRJbnN0YW5jZSgpLmdldE1hdGNoRm9yUHJvamVjdChmYWxzZSwgc2VydmljZVJ1bnRpbWVzW2ldLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgIGlmIChmbS5pc01hdGNoKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZWZhdWx0UnVudGltZVRyaXBsZXQgZHJ0ID0gbmV3IERlZmF1bHRSdW50aW1lVHJpcGxldCgpOwotICAgICAgICAgICAgICAgIGRydC5zZXRGYWNldE1hdGNoZXIoZm0pOwotICAgICAgICAgICAgICAgIGRydC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZHJ0LnNldFJ1bnRpbWVJZChkZXNjLmdldElkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBkcnQ7Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgaWYgKHZhbGlkU2VydmljZVJ1bnRpbWVzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgLy9XZSBjb3VsZG4ndCBtYXRjaCB0byB0aGUgaW5pdGlhbGx5IHNlbGVjdGVkIHByb2plY3Qgc28gcmV0dXJuIHRoZSBmaXJzdCB2YWxpZCBydW50aW1lLgotICAgICAgRGVmYXVsdFJ1bnRpbWVUcmlwbGV0IGRydCA9IG5ldyBEZWZhdWx0UnVudGltZVRyaXBsZXQoKTsKLSAgICAgIGRydC5zZXRGYWNldE1hdGNoZXIobnVsbCk7Ci0gICAgICBkcnQuc2V0UHJvamVjdE5hbWUobnVsbCk7Ci0gICAgICBkcnQuc2V0UnVudGltZUlkKCgoU3RyaW5nW10pdmFsaWRTZXJ2aWNlUnVudGltZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSlbMF0pOwotICAgICAgcmV0dXJuIGRydDsgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vVGhlcmUgYXJlIG5vIHNlcnZpY2UgcnVudGltZXMgdGhhdCBtYXRjaCB0aGUgZml4ZWQgcnVudGltZSBhbmQgc2VydmVyLiBGYWxsIGJhY2sgdG8gb3JpZ2luYWwgYWxnb3JpdGhtLgotICAgICAgc2VydmljZUlkc0ZpeGVkXyA9IGZhbHNlOwotICAgICAgcmV0dXJuIGdldERlZmF1bHRSdW50aW1lKHByb2plY3QsIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0gIAotCi0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsUHJvamVjdChJUHJvamVjdCBpbml0aWFsUHJvamVjdCkKLSAgewotICAgIGluaXRpYWxQcm9qZWN0XyA9IGluaXRpYWxQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ29tcG9uZW50TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIC8vVE9ETyBUaGlzIG1ldGhvZCBhbmQgYW55IG1hcHBpbmdzIHRvIGl0Ci0JLy8gc2hvdWxkIGJlIHJlbW92ZWQgaWYgbm8gbG9uZ2VyIG5lZWRlZC4KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgc2VydmljZUlkc18gPSBpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VJZHNGaXhlZChib29sZWFuIGIpCi0gIHsKLSAgICBzZXJ2aWNlSWRzRml4ZWRfID0gYjsgIAotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXzsgCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VSdW50aW1lSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VSdW50aW1lSWRfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdlbmVyYXRlUHJveHlfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVQcm94eV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBnZW5lcmF0ZVByb3h5XyBUaGUgZ2VuZXJhdGVQcm94eV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHlfKQotICB7Ci0gICAgdGhpcy5nZW5lcmF0ZVByb3h5XyA9IGdlbmVyYXRlUHJveHlfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VQcm9qZWN0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZVByb2plY3ROYW1lXzsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFYXJQcm9qZWN0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUVhclByb2plY3ROYW1lXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlQ29tcG9uZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUNvbXBvbmVudFR5cGVfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2aWNlTmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZU5lZWRFQVJfOwotICB9Ci0gIAotICAvLyBUaGlzIGlzIGZvciB0aGUgQW50IHNjZW5hcmlvIHdoZXJlIHRoZSBzZXJ2aWNlIHByb2plY3QgbmFtZSBjYW4gYmUgc2V0IGluIHRoZSBwcm9wZXJ0eSBmaWxlLgotICAvLyBJZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBTZXJ2aWNlUHJvamVjdE5hbWUgdXNlIGl0IGZvciBkZWZhdWx0aW5nIHB1cnBvc2VzCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotCSAgc2VydmljZVByb2plY3ROYW1lXyA9IG5hbWU7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9MYXVuY2hGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvTGF1bmNoRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwNjQ1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9MYXVuY2hGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBMYXVuY2hGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudAotewotICBwcml2YXRlIGJvb2xlYW4gcHVibGlzaFRvUHVibGljVURESV87ICAKLSAgcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hUb1ByaXZhdGVVRERJXzsKLSAgCi0gIHB1YmxpYyBMYXVuY2hGcmFnbWVudCgpCi0gIHsKLSAgICBDb25kaXRpb24gY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbigpCi0gICAgewotICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gKHB1Ymxpc2hUb1B1YmxpY1VERElfIHx8IHB1Ymxpc2hUb1ByaXZhdGVVRERJXyk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBzZXRDb25kaXRpb24oIGNvbmRpdGlvbiApOwotICAgIHNldFRydWVGcmFnbWVudCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpLCAiIiApICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1B1YmxpY1VEREkoYm9vbGVhbiBwdWJsaXNoVG9QdWJsaWNVRERJKQotICB7Ci0gICAgcHVibGlzaFRvUHVibGljVURESV8gPSBwdWJsaXNoVG9QdWJsaWNVRERJOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoVG9Qcml2YXRlVURESShib29sZWFuIHB1Ymxpc2hUb1ByaXZhdGVVRERJKQotICB7Ci0gIAlwdWJsaXNoVG9Qcml2YXRlVURESV8gPSBwdWJsaXNoVG9Qcml2YXRlVURESTsKLSAgfQotICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9TZXJ2aWNlVGVzdEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9TZXJ2aWNlVGVzdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NmVkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvU2VydmljZVRlc3RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV1NETFRlc3RMYXVuY2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlVGVzdEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiB0ZXN0U2VydmljZTsKLSAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUHJveHk7Ci0gIAotICAKLSAgcHVibGljIFNlcnZpY2VUZXN0RnJhZ21lbnQoIFN0cmluZyBpZCApCi0gIHsKLSAgCVNlcXVlbmNlRnJhZ21lbnQgdGVzdFJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0U2VydmljZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgc2V0Q29uZGl0aW9uKCBjb25kaXRpb24gKTsKLSAgICAKLSAgICB0ZXN0Um9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIgKSApOwotICAgIHRlc3RSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBpZCApICk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCB0ZXN0Um9vdCApOwotICAgICAgCi0gIH0KLSAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gIAkKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0SUQiLFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gIAkKLSAgCS8vZnJvbSB0aGUgd2l6YXJkIAotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZVRlc3RXaWRnZXQuY2xhc3MsICJUZXN0SUQiLFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRXh0ZXJuYWxCcm93c2VyIixXU0RMVGVzdExhdW5jaENvbW1hbmQuY2xhc3MpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuZXJhdGVQcm94eSkKLSAgewotICAJdGhpcy5nZW5lcmF0ZVByb3h5ID0gZ2VuZXJhdGVQcm94eTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgCXJldHVybiBnZW5lcmF0ZVByb3h5OwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXN0U2VydmljZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKCBib29sZWFuIHRlc3RTZXJ2aWNlICkKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2UgPSB0ZXN0U2VydmljZTsKLSAgfQotCi0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0V2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9TZXJ2aWNlVGVzdFdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk2YzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0V2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZVRlc3RXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0KLSAgcHJpdmF0ZSBDb21ibyB0ZXN0VHlwZUNvbWJvXzsKLSAgLypDT05URVhUX0lEIFBTVFAwMDAxIGZvciB0aGUgVGVzdCBUeXBlIENvbWJvIGJveCBvZiB0aGUgU2VydmljZSBUZXN0IFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BTVFBfQ09NQk9CT1hfVEVTVCA9ICJQU1RQMDAwMSI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gbGF1bmNoQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBTVFAwMDAyIGZvciB0aGUgbGF1bmNoIGJ1dHRvbiBvZiB0aGUgU2VydmljZSBUZXN0IFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BTVFBfTEFVTkNIX0JVVFRPTiA9ICJQU1RQMDAwMiI7Ci0KLSAgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCBmYWNpbGl0aWVzXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgPSBuZXcgVUlVdGlscyhjcmVhdGVQbHVnaW5JZF8gKTsKLSAgICAgICAgCi0gICAgQ29tcG9zaXRlIHRlc3RDb21wb3NpdGUgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAzLCAwLCAwICk7Ci0gICAgCi0gICAgdGVzdFR5cGVDb21ib18gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCB0ZXN0Q29tcG9zaXRlLCBDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfVEVTVF9UWVBFUywKLSAgICAJCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QU1RQX0NPTUJPQk9YX1RFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BTVFBfQ09NQk9CT1hfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgIAotICAgIGxhdW5jaEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHRlc3RDb21wb3NpdGUsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5CVVRUT05fTEFVTkNIX1NFUlZJQ0VfVEVTVCwKLSAgICAJCQkJCQkJCQlDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BTVFBfTEFVTkNIX0JVVFRPTiApOwotICAgIGxhdW5jaEJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVMYXVuY2hCdXR0b24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZWlkczsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlOwotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSA9ICIiOwotICBwcml2YXRlIElFbnZpcm9ubWVudCBlbnY7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlTGF1bmNoQnV0dG9uKCkKLSAgewotCS8vIFNwbGl0IHVwIHRoZSBwcm9qZWN0IGFuZCBtb2R1bGUKLQlpbnQgcCA9IHNlcnZlclByb2plY3QuaW5kZXhPZigiLyIpOwotCWlmIChwICE9IC0xKXsKLQkJbW9kdWxlID0gc2VydmVyUHJvamVjdC5zdWJzdHJpbmcocCsxKTsKLQkJc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Quc3Vic3RyaW5nKDAscCk7Ci0JfQotICAJCi0gIAlTdHJpbmcgdGVzdElEID0gdGVzdFR5cGVDb21ib18uZ2V0VGV4dCgpOwotICAJbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSB0ZXN0SUQ7Ci0gIAlXU0RMVGVzdExhdW5jaENvbW1hbmQgd3RsYyA9IG5ldyBXU0RMVGVzdExhdW5jaENvbW1hbmQoKTsKLSAgCXd0bGMuc2V0VGVzdElEKHRlc3RJRCk7Ci0gIAl3dGxjLnNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihzZXJ2aWNlaWRzKTsKLQkgIHd0bGMuc2V0U2VydmljZVNlcnZlckluc3RhbmNlSWQoc2VydmljZVNlcnZlckluc3RhbmNlSWQpOwotICAJd3RsYy5zZXRTZXJ2ZXJQcm9qZWN0KHNlcnZlclByb2plY3QpOwotCSAgd3RsYy5zZXRTZXJ2ZXJNb2R1bGUobW9kdWxlKTsKLSAgCXd0bGMuc2V0V3NkbFVSSSh3c2RsVVJJKTsKLSAgCXd0bGMuc2V0RXh0ZXJuYWxCcm93c2VyKHRydWUpOwotICAJd3RsYy5zZXRFbmRwb2ludChlbmRwb2ludHMpOwotICAJd3RsYy5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0gIAl3dGxjLmV4ZWN1dGUoIG51bGwsIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVRlc3RGYWNpbGl0aWVzKCBTZWxlY3Rpb25MaXN0IGZhY2lsaXRpZXMgKQotICB7Ci0gICAgZmFjaWxpdGllc18gPSBmYWNpbGl0aWVzOwotICAgIHRlc3RUeXBlQ29tYm9fLnNldEl0ZW1zKCBmYWNpbGl0aWVzLmdldExpc3QoKSApOwotICAgIHRlc3RUeXBlQ29tYm9fLnNlbGVjdCggZmFjaWxpdGllcy5nZXRJbmRleCgpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFNlcnZpY2VUZXN0RmFjaWxpdGllcygpCi0gIHsKLSAgICBmYWNpbGl0aWVzXy5zZXRJbmRleCggdGVzdFR5cGVDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgIHJldHVybiBmYWNpbGl0aWVzXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdElEKCkKLSAgewotICAJcmV0dXJuIHRlc3RUeXBlQ29tYm9fLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAJdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlaWRzKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlaWRzID0gc2VydmljZWlkczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAl0aGlzLmVudiA9IGVudjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KFN0cmluZyBlbmRwb2ludCkKLSAgewotICAgIGlmIChlbmRwb2ludCAhPSBudWxsICYmIGVuZHBvaW50Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHYuYWRkKGVuZHBvaW50KTsKLSAgICAgIHNldEVuZHBvaW50cyh2KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50cyhMaXN0IGVuZHBvaW50cykKLSAgewotICAgIHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVySW5zdGFuY2VJZChTdHJpbmcgc3NJbnN0YW5jZUlkKXsKLQkgIHRoaXMuc2VydmljZVNlcnZlckluc3RhbmNlSWQgPSBzc0luc3RhbmNlSWQ7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTcxMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE1LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIAotICBwcml2YXRlIFNlbGVjdGlvbkxpc3Qgc2VydmljZVRlc3RGYWNpbGl0aWVzOwkKLSAgcHJpdmF0ZSBTdHJpbmdbXSB0ZXN0SUQ7Ci0gIAotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkKLSAgeyAgICAKLSAgCVNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCkuY29weSgpOwotICAJdGVzdElEID0gc2NlbmFyaW9Db250ZXh0LmdldE5vbkphdmFUZXN0U2VydmljZSgpOwotICAJU3RyaW5nW10gdGVzdFR5cGVzID0gc2NlbmFyaW9Db250ZXh0LmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgCSAgCQotICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAJV2ViU2VydmljZVRlc3RSZWdpc3RyeSB3c3R0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gIAkKLSAgICAKLSAgCVZlY3RvciB3c2RsTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIAlmb3IoaW50IGkgPTAgO2k8dGVzdFR5cGVzLmxlbmd0aDtpKyspewotICAJICBXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2N0ZSA9IChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbil3c3R0UmVnaXN0cnkuZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUodGVzdFR5cGVzW2ldKTsgIAkKLSAgCSAgaWYod3NjdGUudGVzdFdTREwoKSl7Ci0gIAkgICAgd3NkbE5hbWVzLmFkZEVsZW1lbnQodGVzdFR5cGVzW2ldKTsKLSAgCSAgfQotICAJfQotICAgIAotICAJU3RyaW5nIGphdmFOYW1lc0FycmF5W10gPSBuZXcgU3RyaW5nW3dzZGxOYW1lcy5zaXplKCldOwotICAJRW51bWVyYXRpb24gZSA9IHdzZGxOYW1lcy5lbGVtZW50cygpOwotICAJaW50IGkgPSAwOwotICAJd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICBqYXZhTmFtZXNBcnJheVtpXSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAJICBpKys7Ci0gIAl9Ci0gIAkKLSAgCQotICAJc2VydmljZVRlc3RGYWNpbGl0aWVzID0gbmV3IFNlbGVjdGlvbkxpc3QoamF2YU5hbWVzQXJyYXksMCk7ICAJCi0gIAkKLSAJcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFNlcnZpY2VUZXN0RmFjaWxpdGllcygpCi0gIHsKLSAgCXJldHVybiBzZXJ2aWNlVGVzdEZhY2lsaXRpZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0VGVzdElEKCkKLSAgewotICAJcmV0dXJuIHRlc3RJRDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0RXh0ZXJuYWxCcm93c2VyKCkKLSAgewotICAJcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwMTA1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzg1M2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXVkZGlyZWdpc3RyeS5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyNTYyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmIwMjlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIEphbiAzMCAxMDozNjo1OCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2OWI0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjQwOjQ5IEVTVCAyMDA2Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODkzNTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkucGx1Z2luLldlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCwzLjUuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZGVjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3JlZ2lzdHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9pY29ucy9yZWdpc3RyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDNjYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3JlZ2lzdHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9pY29ucy91ZGRpcHJpdmF0ZWNvbmZpZ193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjExZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2ZiZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIFVuaXZlcnNhbCBEZXNjcmlwdGlvbiBEaXNjb3ZlcnkgYW5kIEludGVncmF0aW9uIFJlZ2lzdHJ5Ci1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19VTklUX1RFU1RfVUREST1Vbml0IFRlc3QgVURESQotCi1YUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVM9UHJpdmF0ZSBVRERJIFJlZ2lzdHJ5IFR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzgzNGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgPCEtLSBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgbGlrZWx5IHRvIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwcml2YXRlVURESVJlZ2lzdHJ5VHlwZSIgbmFtZT0iJVhQX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUyIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnByaXZhdGVVRERJUmVnaXN0cnlUeXBlIj4KLSAgICAgIDxwcml2YXRlVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFX0lNUEwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVJbXBsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbCI+Ci0gICAgICA8L3ByaXZhdGVVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19VTklUX1RFU1RfVURESSIKLSAgICAgICAgICAgIGljb249Imljb25zL3JlZ2lzdHJ5LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLmJpbmRpbmcuUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nIj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX1VOSVRfVEVTVF9VRERJIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nLlByaXZhdGVVRERJV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLmJpbmRpbmcuUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nIj4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfVU5JVF9URVNUX1VEREkiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9yZWdpc3RyeS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVdpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlUExVR0lOX05FV19XSVpBUkRfREVTQ19XU19VTklUX1RFU1RfVURESQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9VRERJUmVnaXN0cnkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9VRERJUmVnaXN0cnkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxNWE2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvVURESVJlZ2lzdHJ5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgUHJpdmF0ZVVERElDb25maWdQYWdlCi0jCi1QQUdFX1RJVExFX1BSSVZBVEVfVURESV9DT05GSUc9VW5pdCBUZXN0IFVEREkgUmVnaXN0cnkgQ29uZmlndXJhdGlvbgotUEFHRV9ERVNDX1BSSVZBVEVfVURESV9DT05GSUc9Q29uZmlndXJlIHRoZSB1bml0IHRlc3QgVURESSByZWdpc3RyeS4KLQotIwotIyBUb29sdGlwIGZvciBQcml2YXRlVURESUNvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfUEFHRT1EZXBsb3kgb3IgcmVtb3ZlIGEgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLVRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfVFlQRT1DaG9vc2UgdGhlIHR5cGUgb2YgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkgeW91IHdhbnQgdG8gZGVwbG95Ci1UT09MVElQX1BVUFJfREVQTE9ZX1BSSVZBVEVfVUREST1EZXBsb3kgYSBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotVE9PTFRJUF9QVVBSX1VQREFURV9QUklWQVRFX1VEREk9VXBkYXRlIHRoZSBleGlzdGluZyBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotVE9PTFRJUF9QVVBSX1JFTU9WRV9QUklWQVRFX1VEREk9UmVtb3ZlIHRoZSBleGlzdGluZyBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotCi0jCi0jIENvbW1vbiB3aXphcmQgc3RyaW5ncy4KLSMKLUxBQkVMX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUz1Qcml2YXRlIFVEREkgUmVnaXN0cnkgdHlwZToKLUJVVFRPTl9ERVBMT1lfVURESV9SRUdJU1RSWT1EZXBsb3kgdGhlIFVuaXQgVGVzdCBVRERJIFJlZ2lzdHJ5Ci1CVVRUT05fVVBEQVRFX1VERElfUkVHSVNUUlk9VXBkYXRlIHRoZSBwcmV2aW91c2x5IGRlcGxveWVkIFVEREkgcmVnaXN0cnkKLUJVVFRPTl9SRU1PVkVfVURESV9SRUdJU1RSWT1SZW1vdmUgdGhlIHByZXZpb3VzbHkgZGVwbG95ZWQgVURESSByZWdpc3RyeQotCi0jCi0jIFdpemFyZCBwYWdlIHRhc2sgbGFiZWxzIGFuZCBkZXNjcmlwdGlvbnMKLSMgKHVzZWQgb25seSBmb3IgcHJvZ3Jlc3MgaW5kaWNhdGlvbikuCi0jCi0KLSMKLSMgRGlhbG9nIG1lc3NhZ2VzCi0jCi0KLSMKLSMgUHJvZ3Jlc3MgbWVzc2FnZXMKLSMKLQotIwotIyBXYXJuaW5nIG1lc3NhZ2VzCi0jCi0KLSMKLSMgRXJyb3IgbWVzc2FnZXMKLSMKLU1TR19FUlJPUl9OT19VRERJX1JFR0lTVFJZX0FWQUlMQUJMRT1JV0FCMDM2M0UgTm8gVURESSByZWdpc3RyeSBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvVURESVJlZ2lzdHJ5TWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9VRERJUmVnaXN0cnlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTI5ZTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9VRERJUmVnaXN0cnlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVURESVJlZ2lzdHJ5TWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5IjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFVERElSZWdpc3RyeU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX1BSSVZBVEVfVURESV9DT05GSUc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFHRV9ERVNDX1BSSVZBVEVfVURESV9DT05GSUc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QVVBSX1BSSVZBVEVfVURESV9QQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BVUFJfREVQTE9ZX1BSSVZBVEVfVURESTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BVUFJfVVBEQVRFX1BSSVZBVEVfVURESTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BVUFJfUkVNT1ZFX1BSSVZBVEVfVURESTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX0RFUExPWV9VRERJX1JFR0lTVFJZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9VUERBVEVfVURESV9SRUdJU1RSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVRUT05fUkVNT1ZFX1VERElfUkVHSVNUUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX05PX1VERElfUkVHSVNUUllfQVZBSUxBQkxFOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVURESVJlZ2lzdHJ5TWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvcGx1Z2luL1dlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9wbHVnaW4vV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRmNDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9wbHVnaW4vV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBVRERJIFJlZ2lzdHJ5IHBsdWdpbi4KLSogPHA+Ci0qIFRoZSBXZWIgU2VydmljZXMgVURESSBSZWdpc3RyeSBwbHVnaW4ncyBpcyB0byBhZGQgdGhlCi0qIG9wdGlvbiB0byBjcmVhdGUgYSB1bml0IHRlc3QgVURESSByZWdpc3RyeSAKLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiBleHRlbmRzIFBsdWdpbgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeSI7Ci0KLSAgLyoqCi0gICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luIGluc3RhbmNlXzsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiAoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbnN0YW5jZV8gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgKiAoV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luIGdldEluc3RhbmNlICgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgcmVzb3VyY2UKLSAgKiBhcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24uCi0gICogQHJldHVybiBBbiBpbWFnZSBkZXNjcmlwdG9yLCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotICAgICAgVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLG5hbWUpOwotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogcGx1Z2luLnByb3BlcnRpZXMuCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIHJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhpbnN0YW5jZV8uZ2V0QnVuZGxlKCksa2V5KTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogcGx1Z2luLnByb3BlcnRpZXMuIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICogYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2gKLSAgKiBhcmUgbW9zdCBmcmVxdWVudGx5IHN0cmluZ3MpLiBTZWUgdGhlIEpESydzCi0gICoge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0fQotICAqIGNsYXNzIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gc3Vic3RpdHV0aW9uLgotICAqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncyApCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLGFyZ3MpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmI0MDJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0vKgotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LnBsdWdpbi5XZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luOwotKi8KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIHByaXZhdGUgYnl0ZSBvcGVyYXRpb25UeXBlOwotICBwcml2YXRlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHJlZ2lzdHJ5VHlwZTsKLSAgCi0gIC8qCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAJaWYgKHJlZ2lzdHJ5VHlwZSAhPSBudWxsKQotICAJewotICAJICBzd2l0Y2ggKG9wZXJhdGlvblR5cGUpCi0gIAkgIHsKLSAgCSAgCWNhc2UgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuT1BfREVQTE9ZOgotICAJICAgICAgcmV0dXJuIHJlZ2lzdHJ5VHlwZS5kZXBsb3koZW52KTsKLSAgCSAgCWNhc2UgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuT1BfVVBEQVRFOgotICAJICAJICByZXR1cm4gcmVnaXN0cnlUeXBlLnVwZGF0ZShlbnYpOwotICAJICAJY2FzZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9SRU1PVkU6Ci0gIAkgIAkgIHJldHVybiByZWdpc3RyeVR5cGUucmVtb3ZlKGVudik7Ci0gIAkgIAlkZWZhdWx0OgotICAJICB9Ci0gIAl9Ci0gIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgKi8KLQotICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZ2V0UmVnaXN0cnlUeXBlKCkKLSAgewotICAgIHJldHVybiBnZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpOwotICB9Ci0gIAotICBwdWJsaWMgYnl0ZSBnZXRPcGVyYXRpb25UeXBlKCkKLSAgewotICAgIHJldHVybiBvcGVyYXRpb25UeXBlOwotICB9Ci0gIAotICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKQotICB7Ci0gIAlyZXR1cm4gcmVnaXN0cnlUeXBlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVnaXN0cnlUeXBlKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHJlZ1R5cGUpCi0gIHsKLSAgCXNldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKHJlZ1R5cGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25UeXBlKGJ5dGUgdHlwZSkKLSAgewotICAgIG9wZXJhdGlvblR5cGUgPSB0eXBlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZShQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSByZWdUeXBlKQotICB7Ci0gIAlyZWdpc3RyeVR5cGUgPSByZWdUeXBlOwotICB9Ci0KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOGI2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50Ci17Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgcmVnaXN0cnlUeXBlOwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeTsKLSAgCi0gIHB1YmxpYyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCgpCi0gIHsKLSAgCXN1cGVyKG51bGwsICIiKTsKLSAgfQotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKQotICB7Ci0gIAlpZiAocmVnaXN0cnlUeXBlICE9IG51bGwpCi0gIAl7Ci0gICAgICByZWdpc3RyeVR5cGUucmVnaXN0ZXJDYW5GaW5pc2goY2FuRmluaXNoUmVnaXN0cnkpOwotICAgICAgcmVnaXN0cnlUeXBlLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKGRhdGFNYXBwaW5nUmVnaXN0cnkpOwotICAgICAgcmVnaXN0cnlUeXBlLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mod2lkZ2V0UmVnaXN0cnkpOwotICAgICAgcmV0dXJuIHJlZ2lzdHJ5VHlwZS5jcmVhdGUoKS5jcmVhdGUoKTsKLSAgCX0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCkKLSAgewotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgZGF0YSBtYXBwaW5ncyBmb3IgdGhpcyBjb21tYW5kIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAJZGF0YU1hcHBpbmdSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy53aWRnZXRSZWdpc3RyeSA9IHdpZGdldFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAgKiBBbGwgd2l6YXJkIGZyYWdtZW50cyBuZWVkIHRvIGJlIGNsb25lYWJsZS4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gIAlQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCgpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgCWZyYWdtZW50LnNldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKHJlZ2lzdHJ5VHlwZSk7Ci0gIAlyZXR1cm4gZnJhZ21lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHJlZ2lzdHJ5VHlwZSkKLSAgewotICAJdGhpcy5yZWdpc3RyeVR5cGUgPSByZWdpc3RyeVR5cGU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlYTIyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LnBsdWdpbi5XZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotLyoqCi0qIFRoaXMgVURESSBjb25maWd1cmF0aW9uIHBhZ2UgcHJvbXB0cyB0aGUgdXNlcgotKiBmb3IgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUKLSogdW5pdCB0ZXN0IFVEREkgcmVnaXN0cnkuCi0qLwotcHVibGljIGNsYXNzIFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gZGVwbG95UmFkaW9fOwotICBwcml2YXRlIExhYmVsIHR5cGVzTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHR5cGVzQ29tYm9fOwotICBwcml2YXRlIEJ1dHRvbiB1cGRhdGVSYWRpb187Ci0gIHByaXZhdGUgQnV0dG9uIHJlbW92ZVJhZGlvXzsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzXzsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBpbnN0YWxsZWRUeXBlXzsKLQotICAvLyBJbmZvcG9wCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfUEFHRSA9IFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnB1cHIwMDAxIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QVVBSX1BSSVZBVEVfVURESV9UWVBFID0gV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5JRCArICIucHVwcjAwMDIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BVUFJfREVQTE9ZX1BSSVZBVEVfVURESSA9IFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnB1cHIwMDAzIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QVVBSX1VQREFURV9QUklWQVRFX1VEREkgPSBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wdXByMDAwNSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFVQUl9SRU1PVkVfUFJJVkFURV9VRERJID0gV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5JRCArICIucHVwcjAwMDQiOwotCi0gIHB1YmxpYyBQcml2YXRlVURESVNlbGVjdGlvbldpZGdldCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gIAl0aGlzLnN0YXR1c0xpc3RlbmVyID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KFVERElSZWdpc3RyeU1lc3NhZ2VzLlRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfUEFHRSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfUEFHRSk7Ci0KLSAgICBHcmlkTGF5b3V0IGdsOwotICAgIEdyaWREYXRhIGdkOwotICAgIAotICAgIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgIAloYW5kbGVXaWRnZXRFdmVudChldmVudCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgICAKLSAgICBkZXBsb3lSYWRpb18gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICBkZXBsb3lSYWRpb18uc2V0VGV4dChVRERJUmVnaXN0cnlNZXNzYWdlcy5CVVRUT05fREVQTE9ZX1VERElfUkVHSVNUUlkpOwotICAgIGRlcGxveVJhZGlvXy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgZGVwbG95UmFkaW9fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLSAgICBkZXBsb3lSYWRpb18uc2V0VG9vbFRpcFRleHQoVURESVJlZ2lzdHJ5TWVzc2FnZXMuVE9PTFRJUF9QVVBSX0RFUExPWV9QUklWQVRFX1VEREkpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChkZXBsb3lSYWRpb18sIElORk9QT1BfUFVQUl9ERVBMT1lfUFJJVkFURV9VRERJKTsKLQotICAgIENvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSA1OwotICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDE1OwotICAgIGdsLm1hcmdpbldpZHRoID0gMjA7Ci0gICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIHR5cGVzTGFiZWxfID0gbmV3IExhYmVsKHR5cGVDb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICB0eXBlc0xhYmVsXy5zZXRUZXh0KFVERElSZWdpc3RyeU1lc3NhZ2VzLkxBQkVMX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUyk7Ci0gICAgdHlwZXNMYWJlbF8uc2V0VG9vbFRpcFRleHQoVURESVJlZ2lzdHJ5TWVzc2FnZXMuVE9PTFRJUF9QVVBSX1BSSVZBVEVfVURESV9UWVBFKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodHlwZXNMYWJlbF8sIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfVFlQRSk7Ci0KLSAgICB0eXBlc0NvbWJvXyA9IG5ldyBDb21ibyh0eXBlQ29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICB0eXBlc0NvbWJvXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB0eXBlc0NvbWJvXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gICAgdHlwZXNDb21ib18uc2V0VG9vbFRpcFRleHQoVURESVJlZ2lzdHJ5TWVzc2FnZXMuVE9PTFRJUF9QVVBSX1BSSVZBVEVfVURESV9UWVBFKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodHlwZXNDb21ib18sIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfVFlQRSk7Ci0KLSAgICB1cGRhdGVSYWRpb18gPSBuZXcgQnV0dG9uKHBhcmVudCxTV1QuUkFESU8pOwotICAgIHVwZGF0ZVJhZGlvXy5zZXRUZXh0KFVERElSZWdpc3RyeU1lc3NhZ2VzLkJVVFRPTl9VUERBVEVfVURESV9SRUdJU1RSWSk7Ci0gICAgdXBkYXRlUmFkaW9fLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgdXBkYXRlUmFkaW9fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sbGlzdGVuZXIpOwotICAgIHVwZGF0ZVJhZGlvXy5zZXRUb29sVGlwVGV4dChVRERJUmVnaXN0cnlNZXNzYWdlcy5UT09MVElQX1BVUFJfVVBEQVRFX1BSSVZBVEVfVURESSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHVwZGF0ZVJhZGlvXywgSU5GT1BPUF9QVVBSX1VQREFURV9QUklWQVRFX1VEREkpOwotCi0gICAgcmVtb3ZlUmFkaW9fID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0gICAgcmVtb3ZlUmFkaW9fLnNldFRleHQoVURESVJlZ2lzdHJ5TWVzc2FnZXMuQlVUVE9OX1JFTU9WRV9VRERJX1JFR0lTVFJZKTsKLSAgICByZW1vdmVSYWRpb18uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICByZW1vdmVSYWRpb18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotICAgIHJlbW92ZVJhZGlvXy5zZXRUb29sVGlwVGV4dChVRERJUmVnaXN0cnlNZXNzYWdlcy5UT09MVElQX1BVUFJfUkVNT1ZFX1BSSVZBVEVfVURESSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHJlbW92ZVJhZGlvXywgSU5GT1BPUF9QVVBSX1JFTU9WRV9QUklWQVRFX1VEREkpOyAgICAgICAgICAgICAgICAKLQotICAgIGxvYWRUeXBlcygpOwotICAgIGluaXQoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBsb2FkVHlwZXMoKQotICB7Ci0gICAgdHlwZXNfID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGVzKCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzXy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAodHlwZXNfW2ldICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHR5cGVzQ29tYm9fLmFkZCh0eXBlc19baV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHR5cGVzX1tpXS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkKLSAgICAgICAgICBpbnN0YWxsZWRUeXBlXyA9IHR5cGVzX1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHR5cGVzQ29tYm9fLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICAgIHR5cGVzQ29tYm9fLnNldFRleHQodHlwZXNDb21ib18uZ2V0SXRlbSgwKSk7Ci0gICAgaWYgKGluc3RhbGxlZFR5cGVfICE9IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlUmFkaW9fLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICByZW1vdmVSYWRpb18uc2V0RW5hYmxlZCh0cnVlKTsgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB1cGRhdGVSYWRpb18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICByZW1vdmVSYWRpb18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZGdldEV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSByZW1vdmVSYWRpb18gfHwgZXZlbnQud2lkZ2V0ID09IHVwZGF0ZVJhZGlvXykKLSAgICB7Ci0gICAgICBib29sZWFuIGlzVXBkYXRlT3JSZW1vdmVTZWxlY3RlZCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICB0eXBlc0xhYmVsXy5zZXRFbmFibGVkKCFpc1VwZGF0ZU9yUmVtb3ZlU2VsZWN0ZWQpOwotICAgICAgdHlwZXNDb21ib18uc2V0RW5hYmxlZCghaXNVcGRhdGVPclJlbW92ZVNlbGVjdGVkKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRlcGxveVJhZGlvXykKLSAgICB7Ci0gICAgICBib29sZWFuIGlzRGVwbG95U2VsZWN0ZWQgPSAoKEJ1dHRvbilldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgdHlwZXNMYWJlbF8uc2V0RW5hYmxlZChpc0RlcGxveVNlbGVjdGVkKTsKLSAgICAgIHR5cGVzQ29tYm9fLnNldEVuYWJsZWQoaXNEZXBsb3lTZWxlY3RlZCk7Ci0gICAgfQotICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLSAgfQotICAKLSAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkKLSAgewotICAJaWYgKGRlcGxveVJhZGlvXy5nZXRTZWxlY3Rpb24oKSkKLSAgCXsKLSAgCSAgU3RyaW5nIHNlbGVjdGVkUmVnaXN0cnlOYW1lID0gdHlwZXNDb21ib18uZ2V0VGV4dCgpOwotICAJICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzXy5sZW5ndGg7IGkrKykKLSAgICAgICAgaWYgKHNlbGVjdGVkUmVnaXN0cnlOYW1lLmVxdWFscyh0eXBlc19baV0uZ2V0TmFtZSgpKSkKLSAgCSAgCSAgcmV0dXJuIHR5cGVzX1tpXTsKLSAgICAgIHJldHVybiBudWxsOwotICAJfQotICAJZWxzZQotICAJICByZXR1cm4gaW5zdGFsbGVkVHlwZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBieXRlIGdldE9wZXJhdGlvblR5cGUoKQotICB7Ci0gIAlpZiAoZGVwbG95UmFkaW9fLmdldFNlbGVjdGlvbigpKQotICAJICByZXR1cm4gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuT1BfREVQTE9ZOwotICAJZWxzZSBpZiAodXBkYXRlUmFkaW9fLmdldFNlbGVjdGlvbigpKQotICAgICAgcmV0dXJuIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX1VQREFURTsKLSAgCWVsc2UgaWYgKHJlbW92ZVJhZGlvXy5nZXRTZWxlY3Rpb24oKSkKLSAgICAgIHJldHVybiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9SRU1PVkU7Ci0gIAllbHNlCi0gIAkgIHJldHVybiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9ERVBMT1k7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgcHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgPSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpOwotICAgIGlmIChwcml2YXRlVURESVJlZ2lzdHJ5VHlwZSAhPSBudWxsKQotICAgICAgcmV0dXJuIHByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmdldE9wZXJhdGlvblN0YXR1cyhnZXRPcGVyYXRpb25UeXBlKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggVURESVJlZ2lzdHJ5TWVzc2FnZXMuTVNHX0VSUk9SX05PX1VERElfUkVHSVNUUllfQVZBSUxBQkxFICk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQxYjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24KLXsKLSAgcHJpdmF0ZSBib29sZWFuIGNvbmRpdGlvbjsKLQotICBwdWJsaWMgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kKCkKLSAgewotICAgIGNvbmRpdGlvbiA9IHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKQotICB7Ci0gICAgY29uZGl0aW9uID0gIWNvbmRpdGlvbjsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgdW5kbyggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICBjb25kaXRpb24gPSAhY29uZGl0aW9uOwotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gY29uZGl0aW9uOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvYmluZGluZy9Qcml2YXRlVURESVdpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL2JpbmRpbmcvUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDVhY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvYmluZGluZy9Qcml2YXRlVURESVdpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLlByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5OwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCBwcml2YXRlVURESVNlbEZyYWdtZW50OwotICBwcml2YXRlIFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZCBjb25kaXRpb25Db21tYW5kOwotICAKLSAgcHVibGljIFByaXZhdGVVRERJV2lkZ2V0QmluZGluZygpCi0gIHsKLSAgICBwcml2YXRlVURESVNlbEZyYWdtZW50ID0gbmV3IFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50KCk7Ci0gICAgY29uZGl0aW9uQ29tbWFuZCA9IG5ldyBQcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQoKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICB7Ci0gICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICB7Ci0gICAgICAgIFNlcXVlbmNlRnJhZ21lbnQgcm9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChjb25kaXRpb25Db21tYW5kLCAiIikpOwotICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIlByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0IikpOwotICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoY29uZGl0aW9uQ29tbWFuZCwgIiIpKTsKLSAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQoKSwgIiIpKTsKLSAgICAgICAgcm9vdC5hZGQocHJpdmF0ZVVERElTZWxGcmFnbWVudCk7Ci0gICAgICAgIHJldHVybiByb290OwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuY2FuRmluaXNoUmVnaXN0cnkgPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgICBwcml2YXRlVURESVNlbEZyYWdtZW50LnJlZ2lzdGVyQ2FuRmluaXNoKHRoaXMuY2FuRmluaXNoUmVnaXN0cnkpOwotICAgIAotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5LmFkZENvbmRpdGlvbihjb25kaXRpb25Db21tYW5kKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkgPSBkYXRhUmVnaXN0cnk7Ci0gICAgcHJpdmF0ZVVERElTZWxGcmFnbWVudC5yZWdpc3RlckRhdGFNYXBwaW5ncyhkYXRhTWFwcGluZ1JlZ2lzdHJ5KTsKLSAgICAKLSAgICAvLyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSIsIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiT3BlcmF0aW9uVHlwZSIsIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSIsIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLSAgICBwcml2YXRlVURESVNlbEZyYWdtZW50LnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3ModGhpcy53aWRnZXRSZWdpc3RyeSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIlByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICBVRERJUmVnaXN0cnlNZXNzYWdlcy5QQUdFX1RJVExFX1BSSVZBVEVfVURESV9DT05GSUcsCi0gICAgICBVRERJUmVnaXN0cnlNZXNzYWdlcy5QQUdFX0RFU0NfUFJJVkFURV9VRERJX0NPTkZJRywKLQkgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgewotCSAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkgICAgewotCSAgICAgIHJldHVybiBuZXcgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQoKTsKLQkgICAgfQotCSAgfQotICAgICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0OGNmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci0KLQotcHVibGljIGludGVyZmFjZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBleHRlbmRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIC8vIG9wZXJhdGlvbiB0eXBlcwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfREVQTE9ZID0gMHgwOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfVVBEQVRFID0gMHgxOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfUkVNT1ZFID0gMHgyOwotCi0gIC8vIGdlbmVyYWwgaW5mb3JtYXRpb24KLSAgcHVibGljIFN0cmluZyBnZXRJRCgpOwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCk7Ci0gIHB1YmxpYyBJU3RhdHVzIGdldE9wZXJhdGlvblN0YXR1cyhieXRlIG9wZXJhdGlvbik7Ci0KLSAgLy8gcmVnaXN0cnkgVVJMcwotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlBUEkoKTsKLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoQVBJKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDA5MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nLlByaXZhdGVVRERJV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLQotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnVkZGkuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUKLXsKLSAgICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpIHsKLSAgICAgICAgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbXSB0eXBlcyA9IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodHlwZXNbaV0uaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5SW5xdWlyeUFQSSgpIHsKLSAgICAgICAgVmVjdG9yIGlucXVpcnlBUElWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gdHlwZXMgPSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlucXVpcnlBUEkgPSB0eXBlc1tpXS5nZXRJbnF1aXJ5QVBJKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlucXVpcnlBUEkgIT0gbnVsbCAmJiBpbnF1aXJ5QVBJLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICAgICAgICAgICAgICAgICAgaW5xdWlyeUFQSVZlY3Rvci5hZGQoaW5xdWlyeUFQSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBpbnF1aXJ5QVBJQXJyYXkgPSBuZXcgU3RyaW5nW2lucXVpcnlBUElWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGlucXVpcnlBUElWZWN0b3IuZWxlbWVudHMoKTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBpbnF1aXJ5QVBJQXJyYXlbal0gPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5xdWlyeUFQSUFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5UHVibGlzaEFQSSgpIHsKLSAgICAgICAgVmVjdG9yIHB1Ymxpc2hBUElWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gdHlwZXMgPSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHB1Ymxpc2hBUEkgPSB0eXBlc1tpXS5nZXRQdWJsaXNoQVBJKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHB1Ymxpc2hBUEkgIT0gbnVsbCAmJiBwdWJsaXNoQVBJLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaEFQSVZlY3Rvci5hZGQocHVibGlzaEFQSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwdWJsaXNoQVBJQXJyYXkgPSBuZXcgU3RyaW5nW3B1Ymxpc2hBUElWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IHB1Ymxpc2hBUElWZWN0b3IuZWxlbWVudHMoKTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBwdWJsaXNoQVBJQXJyYXlbal0gPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHVibGlzaEFQSUFycmF5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ29tbWFuZFdpZGdldEJpbmRpbmcgZ2V0QmluZGluZygpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBQcml2YXRlVURESVdpZGdldEJpbmRpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU1MTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIxNiAgIDEyNzEzOCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBpbnN0YW5jZV87Ci0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c187Ci0KLSAgICBwcml2YXRlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKSB7Ci0gICAgfQotICAKLSAgICAvKioKLSAgICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFuY2VfID0gbmV3IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIGluc3RhbmNlXy5nZXRDb25maWdFbGVtZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZV87Ci0gICAgfQotICAKLSAgICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29uZmlnRWxlbWVudHMoKSB7Ci0gICAgICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICBjb25maWdFbGVtZW50c18gPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiKTsKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRWxlbWVudHNfLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IHdlaWdodCA9IGdldFdlaWdodChjb25maWdFbGVtZW50c19baV0pOwotICAgICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICAgIGZvciAoaW50IGogPSB2LnNpemUoKS0xOyBqID49IDA7IGotLSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod2VpZ2h0ID4gZ2V0V2VpZ2h0KChJQ29uZmlndXJhdGlvbkVsZW1lbnQpdi5nZXQoaikpKQotICAgICAgICAgICAgICBpbmRleCA9IGo7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgICB2LmFkZChpbmRleCwgY29uZmlnRWxlbWVudHNfW2ldKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB2LmFkZChjb25maWdFbGVtZW50c19baV0pOwotICAgICAgICB9Ci0gICAgICAgIHYuY29weUludG8oY29uZmlnRWxlbWVudHNfKTsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRzXzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRXZWlnaHQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJ3ZWlnaHQiKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ0VsZW1lbnRCeUlEKFN0cmluZyBpZCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8Y29uZmlnRWxlbWVudHNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlnRWxlbWVudHNfW2ldLmdldEF0dHJpYnV0ZSgiaWQiKS5lcXVhbHMoaWQpKQotICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdFbGVtZW50c19baV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gZ2V0VHlwZXMoKSB7Ci0gICAgICAgIFZlY3RvciB0eXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50c18ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHR5cGVPYmogPSBjb25maWdFbGVtZW50c19baV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZU9iaiBpbnN0YW5jZW9mIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKQotICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGQodHlwZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIH0KLQotICAgICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzQXJyYXkgPSBuZXcgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbdHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgdHlwZXNBcnJheVtqXSA9IChQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSl0eXBlcy5lbGVtZW50QXQoaik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVzQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFR5cGVCeUlEKFN0cmluZyBpZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHR5cGVPYmogPSBnZXRDb25maWdFbGVtZW50QnlJRChpZCkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgICAgIGlmICh0eXBlT2JqIGluc3RhbmNlb2YgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSl0eXBlT2JqOyAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRTZXJ2ZXJGYWN0b3J5SURCeUlEKFN0cmluZyBpZCkgewotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGdldENvbmZpZ0VsZW1lbnRCeUlEKGlkKTsKLSAgICAgICAgaWYgKGNvbmZpZ0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgICAgICBWZWN0b3IgaWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlckZhY3RvcnlJRCIpLCAiLCIpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBpZFZlY3Rvci5hZGQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbaWRWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWRzW2ldID0gKFN0cmluZylpZFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAxMDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZWZmZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13cy11aS5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDE2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjJhNWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjM3OjA3IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2ZmVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6NDA6NDUgRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM4NGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDIucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmFjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS51ZGRpO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDUsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWRlYzMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvaWNvbnMvamFyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9pY29ucy9qYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyZjRmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9pY29ucy9qYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNWQ2Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotCi0jCi0jCVdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIENhdGVnb3JpZXMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUkVTT1VSQ0VfTUFOQUdFTUVOVD1SZXNvdXJjZSBNYW5hZ2VtZW50Ci0KLSMKLSMgIFdTLUkgUHJlZmVyZW5jZSBwYWdlcwotIwotIyBXUy1JIENvbXBsaWFuY2UgUGFnZQotIwotUFJFRkVSRU5DRV9DQVRFR09SWV9XU0k9V1MtSSBDb21wbGlhbmNlCi0KLSMKLSMgUG9wdXAgYWN0aW9uIENhdGVnb3J5Ci0jCi1MQUJFTF9QT1BVUF9DQVRFR09SWV9XRUJfU0VSVklDRVM9V2ViIFNlcnZpY2VzCi0KLSMKLSMgTWVzc2FnZXMgZm9yIHBvcHVwIGFjdGlvbiAoVGVzdCB3aXRoIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcikKLSMKLVBPUFVQX1RFU1RfV1NETD1UZXN0IHdpdGggV2ViIFNlcnZpY2VzIEV4cGxvcmVyCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzVmZDFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQotICAgICAgCi0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudSI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9QT1BVUF9DQVRFR09SWV9XRUJfU0VSVklDRVMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwb3B1cEFjdGlvbnMiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5lamIucG9wdXBNZW51Ij4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iJUxBQkVMX1BPUFVQX0NBVEVHT1JZX1dFQl9TRVJWSUNFUyIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkuZWpiLnBvcHVwTWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwb3B1cEFjdGlvbnMiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIAotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uLldTRExGaWxlTWVudSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX1RFU1RfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucG9wdXAuUG9wdXBUZXN0U2VydmljZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBvcHVwLlBvcHVwVGVzdFNlcnZpY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvV1NVSVBsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9XU1VJUGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjZmMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9XU1VJUGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDYwMjI3ICAgMTI0MzkyIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotIyAyMDA2MDMyOSAgIDEyODgyNyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotIyAyMDA2MDMyOSAgIDEyNDY2NyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotIyAyMDA2MDMzMSAgIDEyODgyNyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlCi1QTFVHSU5fVkVORE9SPUVjbGlwc2Uub3JnCi1QTFVHSU5fREVTQz1cCi1UaGUgV2ViIHNlcnZpY2VzIEdVSSBwbHVnaW4gZGVsaXZlcnMgdGhlIGdyYXBoaWNhbCBcCi11c2VyIGludGVyZmFjZSB0byB0aGUgV2ViIHNlcnZpY2VzIGZ1bmN0aW9uIG9mIHRoZSBcCi1XZWIgc2VydmljZXMgcGx1Z2luLgotCi1QTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi0KLSMKLSMJV2ViIFNlcnZpY2VzIFByZWZlcmFuY2UgUGFnZXMKLSMKLSMgQ2F0ZWdvcmllcwotUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UPVJlc291cmNlIE1hbmFnZW1lbnQKLVBSRUZFUkVOQ0VfQ0FURUdPUllfQ09ERV9HRU5FUkFUSU9OPUNvZGUgR2VuZXJhdGlvbgotUFJFRkVSRU5DRV9DQVRFR09SWV9TQ0VOQVJJT19ERUZBVUxUUz1TY2VuYXJpbyBEZWZhdWx0cwotUFJFRkVSRU5DRV9DQVRFR09SWV9QUk9KRUNUX1RPUE9MT0dZPVByb2plY3QgVG9wb2xvZ3kKLVBSRUZFUkVOQ0VfQ0FURUdPUllfRFJJVkVSX0pBUlM9SkRCQyBkcml2ZXJzCi0KLSMKLSNTY2VuYXJpbyBEZWZhdWx0cwotQlVUVE9OX0xBVU5DSF9TQU1QTEU9JkxhdW5jaCB0aGUgc2FtcGxlIHdoZW4gZ2VuZXJhdGVkCi1MQUJFTF9NT1ZFX1VQPU1vdmUgJnVwCi1MQUJFTF9NT1ZFX0RPV049TW92ZSAmZG93bgotTEFCRUxfTU9WRV9VUF8yPU1vdmUgdSZwCi1MQUJFTF9NT1ZFX0RPV05fMj1Nb3ZlIGRvdyZuCi0KLSMKLSMgUHJlZmVyZW5jZXMgVG9vbHRpcHMKLSMKLQotI1NjZW5hcmlvIERlZmF1bHRzCi1UT09MVElQX1BQU0RfUEFHRT1TZXQgdGhlIGRlZmF1bHRzIGZvciB0aGUgV2ViIHNlcnZpY2Ugc2NlbmFyaW9zLgotVE9PTFRJUF9QUFNEX0NIRUNLQk9YX0xBVU5DSF9TQU1QTEU9TGF1bmNoIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gYWZ0ZXIgZ2VuZXJhdGlvbi4KLVRPT0xUSVBfU0VSVklDRV9UWVBFX1RBQkxFX1ZJRVdFUj1QcmVmZXJyZWQgb3JkZXIgb2YgdGhlIGxpc3Qgb2Ygc2VydmljZSBwcm9qZWN0IHR5cGVzCi1UT09MVElQX0NMSUVOVF9UWVBFX1RBQkxFX1ZJRVdFUj1QcmVmZXJyZWQgb3JkZXIgb2YgdGhlIGxpc3Qgb2YgY2xpZW50IHByb2plY3QgdHlwZXMKLVRPT0xUSVBfTU9WRV9VUD1Nb3ZlIHRoZSBzZWxlY3RlZCBwcm9qZWN0IHR5cGUgdXAgdGhlIGxpc3QKLVRPT0xUSVBfTU9WRV9ET1dOPU1vdmUgdGhlIHNlbGVjdGVkIHByb2plY3QgdHlwZSBkb3duIHRoZSBsaXN0Ci0KLSMKLSMgUmVzb3VyY2UgTWFuYWdtZW50Ci1UT09MVElQX1BQUk1fUEFHRT1TZXQgcHJlZmVyZW5jZXMgdGhhdCBjb250cm9sIHJlc291cmNlcyB1c2VkL2dlbmVyYXRlZCBieSB0aGUgV2ViIHNlcnZpY2UuCi1UT09MVElQX1BQUk1fQ0hFQ0tCT1hfT1ZFUldSSVRFX0ZJTEVTPU92ZXJ3cml0ZSBmaWxlcyB3aXRob3V0IHdhcm5pbmcuCi1UT09MVElQX1BQUk1fQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlM9Q3JlYXRlIGZvbGRlcnMgd2hlbiBuZWNlc3NhcnkuCi1UT09MVElQX1BQUk1fQ0hFQ0tCT1hfQ0hFQ0tfT1VUPUNoZWNrIG91dCBmaWxlcyB3aXRob3V0IHdhcm5pbmcuCi1UT09MVElQX1BQUk1fQ0hFQ0tCT1hfU0tFTEVUT05fTUVSR0U9RW5hYmxlIG1lcmdpbmcgb2YgZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUuCi1CVVRUT05fQ1JFQVRFX0ZPTERFUlM9JkNyZWF0ZSBmb2xkZXJzIHdoZW4gbmVjZXNzYXJ5Ci1CVVRUT05fT1ZFUldSSVRFX0ZJTEVTPSZPdmVyd3JpdGUgZmlsZXMgd2l0aG91dCB3YXJuaW5nCi1CVVRUT05fQ0hFQ0tPVVRfRklMRVM9QyZoZWNrIG91dCBmaWxlcyB3aXRob3V0IHdhcm5pbmcKLUJVVFRPTl9TS0VMRVRPTl9NRVJHRT0mTWVyZ2UgZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUuCi0KLSMKLSMgR2VuZXJhbCBtZXNzYWdlcy4KLSMKLUlTVEFUVVNfV0lUSE9VVF9FWENFUFRJT049ezB9Ci1JU1RBVFVTX1dJVEhfRVhDRVBUSU9OPXswfVxuRXhjZXB0aW9uOiB7MX0KLU1TR19JTkZPX1NBVkVEX1NUQVRVUz1JV0FCMDI5N0kgUHJlc3MgdGhlIERldGFpbHMgYnV0dG9uIHRvIHNlZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotCi0jCi0jIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSMKLURJQUxPR19USVRMRV9DTEFTU19CUk9XU0U9QnJvd3NlIENsYXNzZXMKLURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFPUJyb3dzZSBJbnRlcmZhY2VzCi0KLSMKLSMgQ29tbW9uIHdpemFyZCBzdHJpbmdzLgotIwotTEFCRUxfU0FNUExFX1RZUEVTPUphdmEgcHJveHkgc2FtcGxlCi0KLSMKLSMgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cKLSMKLURJQUxPR19USVRMRV9SRVNPVVJDRV9CUk9XU0U9QnJvd3NlIEZpbGVzCi1MQUJFTF9SRVNPVVJDRV9GSUxURVI9RmlsdGVyOgotCi0jCi0jIFRvb2x0aXBzIGZvciBkaWFsb2cuUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cKLSMgRFJFUz1EaWFsb2cvUkVTb3VyY2VzCi0jCi1UT09MVElQX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRT1UeXBlIG9mIHJlc291cmNlcyB0byBicm93c2UuCi1UT09MVElQX0RSRVNfVFJFRV9SRVNPVVJDRT1SZXNvdXJjZXMgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24uCi0KLSMKLSMgTWVzc2FnZXMgZm9yIHByb2plY3QgdG9wb2xvZ3kgcHJlZmVyZW5jZSBwYWdlCi0jCi1UT09MVElQX1BUUFBfUEFHRT1QcmVmZXJlbmNlIHRoYXQgY29udHJvbCB0aGUgcHJvamVjdCB0b3BvbG9neSBvZiB5b3VyIFdlYiBzZXJ2aWNlIGFuZCBjbGllbnQgc2NlbmFyaW9zLgotVE9PTFRJUF9FTkFCTEVfVFdPX0VBUlM9RW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGdlbmVyYXRlIHlvdXIgV2ViIHNlcnZpY2UgYW5kIFdlYiBzZXJ2aWNlIGNsaWVudCBpbiBkaWZmZXJlbnQgRUFSIHByb2plY3RzLgotCi1MQUJFTF9FTkFCTEVfVFdPX0VBUlM9JkdlbmVyYXRlIFdlYiBzZXJ2aWNlIGFuZCBXZWIgc2VydmljZSBjbGllbnQgaW4gZGlmZmVyZW50IEVBUiBwcm9qZWN0cwotTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRT1DbGllbnQgcHJvamVjdCB0eXBlcwotTEFCRUxfU0VSVklDRV9UWVBFX05BTUU9U2VydmljZSBwcm9qZWN0IHR5cGVzCi0jCi0jIFJlc291cmNlIEJyb3dzZXIKLSMKLURJQUxPR19USVRMRV9SRVNPVVJDRV9CUk9XU0VSPVJlc291cmNlIGJyb3dzZXIKLVRPT0xUSVBfUkVTT1VSQ0VfVFJFRT1DaG9vc2UgYSByZXNvdXJjZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvV1NVSVBsdWdpbk1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL1dTVUlQbHVnaW5NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZiOGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvV1NVSVBsdWdpbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjcgICAxMjQzOTIgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKiAyMDA2MDMyOSAgIDEyODgyNyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwNjAzMjkgICAxMjQ2Njcga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwMzMxICAgMTI4ODI3IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDUxNSAgIDE0MTM5OCBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU1VJUGx1Z2luTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5XU1VJUGx1Z2luIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdTVUlQbHVnaW5NZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX1ZFTkRPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZFUkVOQ0VfQ0FURUdPUllfQ09ERV9HRU5FUkFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZFUkVOQ0VfQ0FURUdPUllfU0NFTkFSSU9fREVGQVVMVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRkVSRU5DRV9DQVRFR09SWV9QUk9KRUNUX1RPUE9MT0dZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZFUkVOQ0VfQ0FURUdPUllfRFJJVkVSX0pBUlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX0xBVU5DSF9TQU1QTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfTU9WRV9VUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9NT1ZFX0RPV047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfTU9WRV9VUF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX01PVkVfRE9XTl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFBTRF9QQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFBTRF9DSEVDS0JPWF9MQVVOQ0hfU0FNUExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfQ0xJRU5UX1RZUEVfVEFCTEVfVklFV0VSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfU0VSVklDRV9UWVBFX1RBQkxFX1ZJRVdFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX01PVkVfVVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9NT1ZFX0RPV047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QUFJNX1BBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BQUk1fQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NIRUNLX09VVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BQUk1fQ0hFQ0tCT1hfU0tFTEVUT05fTUVSR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX0NSRUFURV9GT0xERVJTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9PVkVSV1JJVEVfRklMRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVUVE9OX0NIRUNLT1VUX0ZJTEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9TS0VMRVRPTl9NRVJHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJU1RBVFVTX1dJVEhPVVRfRVhDRVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElTVEFUVVNfV0lUSF9FWENFUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lORk9fU0FWRURfU1RBVFVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJQUxPR19USVRMRV9DTEFTU19CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElBTE9HX1RJVExFX0lOVEVSRkFDRV9CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU0FNUExFX1RZUEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJQUxPR19USVRMRV9SRVNPVVJDRV9CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfUkVTT1VSQ0VfRklMVEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfRFJFU19DT01CT19SRVNPVVJDRV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfRFJFU19UUkVFX1JFU09VUkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFRQUF9QQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfRU5BQkxFX1RXT19FQVJTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0VOQUJMRV9UV09fRUFSUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9DTElFTlRfVFlQRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJQUxPR19USVRMRV9SRVNPVVJDRV9CUk9XU0VSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUkVTT1VSQ0VfVFJFRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TRVJWSUNFX1RZUEVfTkFNRTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdTVUlQbHVnaW5NZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vTGF1bmNoSW1wb3J0V2l6YXJkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9MYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1ZGIxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9MYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgbGF1bmNoZXMgdGhlIGltcG9ydCB3aXphcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIAotICAgIHsKLSAgICAgIER5bmFtaWNXaXphcmQgd2l6YXJkID0gbmV3IER5bmFtaWNXaXphcmQoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHdpemFyZC5zZXRJbml0aWFsRGF0YSggIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c2ltcG9ydCIgKTsKLSAgICAgICAgd2l6YXJkLmluaXQoIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvbl8gKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIAotICAJICBXaXphcmREaWFsb2cgZGlhbG9nPSBuZXcgV2l6YXJkRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkgIGRpYWxvZy5zZXRQYWdlU2l6ZSggNTAwLCA0MDAgKTsKLQkgIGRpYWxvZy5jcmVhdGUoKTsKLQkgIGRpYWxvZy5vcGVuKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIAotICAgIHsKLSAgICAgIGlmKCBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbl8gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvYWN0aW9uL1dlYlNlcnZpY2VEZXBsb3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvYWN0aW9uL1dlYlNlcnZpY2VEZXBsb3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkNDhiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XZWJTZXJ2aWNlRGVwbG95LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLQotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlRGVwbG95IHsKLQlwdWJsaWMgdm9pZCBydW4oSVJlc291cmNlIHNlbGVjdGlvbik7IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWRiOWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvYWN0aW9uL1dlYlNlcnZpY2VEZXBsb3lBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuYWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlcGxveUFjdGlvbiBleHRlbmRzIFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLXB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24pIHsKLQotICAgSVByb2plY3QgcHJvamVjdCA9IGdldFNlbGVjdGVkUmVzb3VyY2VQcm9qZWN0KCk7Ci0KLSAgIFN0cmluZyBbXSB0eXBlSWRzID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVHlwZUlkc0J5TW9kdWxlKHByb2plY3QpOwotICAgT2JqZWN0IHRoZUFjdGlvbiA9IG51bGw7Ci0KLSAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MudWkiLCAid2Vic2VydmljZWRlcGxveSIpOwotICAgdHJ5IHsKLSAgIAkKLSAgIAlpZiAodHlwZUlkcyA9PSBudWxsIHx8IHR5cGVJZHMubGVuZ3RoIDw9IDApCi0gICAJewotICAgCSAJLy8gdGhhdCBtZWFucyB0aGUgbW9kdWxlIGlzIG5vdCBhdHRhY2hlZCB0byBhIHNlcnZlciB0aGVuIHBpY2sgdGhlIGZpcnN0IGV4dGVuc2lvbiBmb3VuZAotICAgCSAgICB0aGVBY3Rpb24gPSBlbGVtZW50c1swXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgCX0KLSAgIAllbHNlIGlmICggdHlwZUlkcy5sZW5ndGggPT0gMSkKLSAgIAl7Ci0gICAJCS8vIHRoYXQgbWVhbnMgdGhlIG1vZHVsZSBpcyBhdHRhY2hlZCB0byBvbmUgc2VydmVyIHRoZW4gZmluZHMgaXQgaWQgYW5kIGEgbWF0Y2hpbiBleHRlbnNpb24gb3IgZ2l2ZSBhIG1lc3NhZ2UKLSAgIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIAl7Ci0JCSAgIAlTdHJpbmcgaWQgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImZhY3RvcnlJZCIpOwotICAgIAkgICAJaWYgKCB0eXBlSWRzWzBdLmVxdWFscyhpZCkpCi0JCSAgIAl7Ci0JCSAgIAkJdGhlQWN0aW9uID0gZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJICAgCQlicmVhazsKLQkJICAgCX0KLSAgIAkJfQotICAgCQlpZiAodGhlQWN0aW9uID09IG51bGwgKQotICAgCQkJewotICAgCQkJCS8vIGdpdmUgYSBtZXNzYWdlCi0gICAJCQl9Ci0gICAJfQotICAgCWVsc2UKLSAgIAl7Ci0JCS8vIFRoZSBtb2R1bGUgaXMgYXR0YWNoZWQgdG8gbW9yZSB0aGFuIG9uZSBzZXJ2ZXIgZmluZCB0aGUgZmlyc3Qgc2VydmVyLWV4dGVuc2lvbiBjb3VwbGUKLQkJLy8gVEJEOiBhZGQgYSBkaWFsb2cgdG8gY2hvb3NlIHRoZSBzZXJ2ZXIgZm9yIGRlcGxveW1lbnQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIAl7Ci0JCSAgIAlTdHJpbmcgaWQgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImZhY3RvcnlJZCIpOwotCQkgICAJZm9yICggaW50IGs9MDsgazwgdHlwZUlkcy5sZW5ndGg7IGsrKykKLQkJICAgCXsKLSAgICAJICAgCQlpZiAoIHR5cGVJZHNba10uZXF1YWxzKGlkKSkKLQkJICAgCQl7Ci0JCSAgIAkJCXRoZUFjdGlvbiA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCSAgIAkJCWJyZWFrOwotCQkgICAJCX0KLQkJICAgCX0KLQkJICAgaWYgKHRoZUFjdGlvbiAhPSBudWxsKSBicmVhazsKLSAgIAkJIH0KLQkJaWYgKHRoZUFjdGlvbiA9PSBudWxsKSAKLQkJCXsKLQkJCQkvLyBnaXZlIGEgTWVzc2FnZQotCQkJfQotICAgCX0KLQotICAgIGlmICh0aGVBY3Rpb24gaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRGVwbG95KQotICAgICAgICAgICgoV2ViU2VydmljZURlcGxveSl0aGVBY3Rpb24pLnJ1bihwcm9qZWN0KTsgICAKLSAgfQotCi0gIGNhdGNoIChFeGNlcHRpb24gZSkge30KLX0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2luZG93QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZTI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpbmRvd0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi1wdWJsaWMgV2luZG93QWN0aW9uRGVsZWdhdGUoKSB7Ci0gICAgc3VwZXIoKTsKLSB9Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSAKLSB7Ci0gfQotCi1wdWJsaWMgdm9pZCBpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7IH0KLQotcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICBmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gfQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLX0KLXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JcmV0dXJuIGZTZWxlY3Rpb247Ci19Ci0KLXB1YmxpYyBJUHJvamVjdCBnZXRTZWxlY3RlZFJlc291cmNlUHJvamVjdCgpIHsKLSBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSBJUmVzb3VyY2UgcmVzb3VyY2VfID0gbnVsbDsKLSAgIHRyeSB7Ci0gICAJCWlmIChmU2VsZWN0aW9uICE9IG51bGwgJiYgZlNlbGVjdGlvbi5zaXplKCkgPT0gMSkgICAgewotICAgICAgCQlPYmplY3Qgb2JqID0gZlNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgCQlpZiAob2JqICE9IG51bGwpICAgIHsKLSAgICAgIAkJCWlmICggb2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSAKLSAgICAgIAkJCQl7Ci0gICAgICAJCQkJCXJlc291cmNlXyA9IChJUmVzb3VyY2UpIG9iajsKLSAgICAgIAkJCQl9Ci0gICAgICAJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotICAgICAgCQkJewotICAgICAgICAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBVbml0ID0gKElDb21waWxhdGlvblVuaXQpb2JqOwotICAgICAgICAJCQlyZXNvdXJjZV89IGNvbXBVbml0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotICAgICAgCQkJfQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQlwcm9qZWN0ID0gKChJSmF2YVByb2plY3QpIG9iaikuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCQl9Ci0KLSAgICAgIAkJCWlmICggcmVzb3VyY2VfICE9IG51bGwgKQotICAgCQkJCQlwcm9qZWN0ID0gcmVzb3VyY2VfLmdldFByb2plY3QoKTsKLSAgICAgICAgIAkJCi0gICAgCQl9Ci0gICAJCX0KLSAgIAl9CQotICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgcmV0dXJuIHByb2plY3Q7Ci0gfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9EaWFsb2dSZXNvdXJjZUJyb3dzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0RpYWxvZ1Jlc291cmNlQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI1Y2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0RpYWxvZ1Jlc291cmNlQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuV1NVSVBsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV2ViU2VydmljZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGlhbG9nIGZvciBicm93c2luZyB3b3Jrc3BhY2UgcmVzb3VyY2VzLgotKi8KLXB1YmxpYyBjbGFzcyBEaWFsb2dSZXNvdXJjZUJyb3dzZXIgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9SRVNPVVJDRV9UUkVFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5EUkVTMDAwMSI7Ci0KLSAgcHJpdmF0ZSBJUmVzb3VyY2Ugcm9vdF87Ci0gIHByaXZhdGUgSUZpbHRlcltdIGZpbHRlcnNfOwotICBwcml2YXRlIGJvb2xlYW4gbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXzsKLSAgcHJpdmF0ZSBJUmVzb3VyY2VbXSBzZWxlY3Rpb25fOwotICBwcml2YXRlIFRyZWUgcmVzb3VyY2VUcmVlXzsKLSAgcHJpdmF0ZSBUcmVlVmlld2VyIGZpbGVWaWV3ZXJfOwotCi0gIHB1YmxpYyBEaWFsb2dSZXNvdXJjZUJyb3dzZXIoU2hlbGwgc2hlbGwsIElSZXNvdXJjZSByb290LCBJRmlsdGVyIGZpbHRlcikKLSAgewotICAgIHRoaXMoc2hlbGwsIHJvb3QsIG5ldyBJRmlsdGVyW117ZmlsdGVyfSk7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkRpYWxvZ1Jlc291cmNlQnJvd3NlcjwvY29kZT4KLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cGFyZW50IFNoZWxsPC9jb2RlPi4KLSAgKiBUaGUgZGlhbG9nIHJlbmRlcnMgYWxsIHJlc291cmNlcyBpbmNsdWRpbmcgYW5kCi0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnJvb3QgSVJlc291cmNlPC9jb2RlPgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LgotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGZpbHRlcnMgQW4gYXJyYXkgb2YgamF2YS5sYW5nLlN0cmluZwotICAqLwotICBwdWJsaWMgRGlhbG9nUmVzb3VyY2VCcm93c2VyKFNoZWxsIHNoZWxsLCBJUmVzb3VyY2Ugcm9vdCwgSUZpbHRlcltdIGZpbHRlcnMpCi0gIHsKLSAgICBzdXBlcihzaGVsbCk7Ci0KLSAgICBJUmVzb3VyY2UgbW9kdWxlUm9vdCA9IHJvb3Q7Ci0gICAgaWYgKHJvb3QgaW5zdGFuY2VvZiBJUHJvamVjdCkKLSAgICB7Ci0gICAgICBJUHJvamVjdCBwID0gKElQcm9qZWN0KW1vZHVsZVJvb3Q7Ci0gICAgIAotICAgICAgICBtb2R1bGVSb290ID0gcDsKLSAgICAKLSAgICB9Ci0KLSAgICByb290XyA9IChtb2R1bGVSb290ID09IG51bGwpID8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSA6IG1vZHVsZVJvb3Q7Ci0gICAgZmlsdGVyc18gPSAoZmlsdGVycyA9PSBudWxsKSA/IG5ldyBJRmlsdGVyWzBdIDogZmlsdGVyczsKLSAgICBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWRfID0gZmFsc2U7Ci0gICAgc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLSAgfQotCi0gIC8qKgotICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbXVsdGlwbGUgc2VsZWN0aW9uIGluIHRoZSB0cmVlIHZpZXcuCi0gICogTXVsdGlwbGUgc2VsZWN0aW9uIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0gICogQHBhcmFtIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZCBUcnVlIHRvIGVuYWJsZWQgb3IgZmFsc2UgdG8gZGlzYWJsZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkKGJvb2xlYW4gbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkKQotICB7Ci0gICAgbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXyA9IG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNlbGVjdGlvbnMgbWFkZSBpbiB0aGUgZGlhbG9nIGlmIE9LIHdhcyBwcmVzc2VkLAotICAqIG9yIG51bGwgaWYgQ2FuY2VsIHdhcyBwcmVzc2VkLiBSZXR1cm5zIG51bGwgaWYgdGhlIGRpYWxvZwotICAqIGhhcyBuZXZlciBiZWVuIG9wZW5lZC4KLSAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHNlbGVjdGVkIHJlc291cmNlcywgcG9zc2libHkgZW1wdHksIHBvc3NpYmx5IG51bGwuCi0gICovCi0gIHB1YmxpYyBJUmVzb3VyY2VbXSBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGlvbl87Ci0gIH0KLQotICBwdWJsaWMgSVJlc291cmNlIGdldEZpcnN0U2VsZWN0aW9uKCkKLSAgewotICAgIGlmIChzZWxlY3Rpb25fICE9IG51bGwgJiYgc2VsZWN0aW9uXy5sZW5ndGggPiAwKQotICAgICAgcmV0dXJuIHNlbGVjdGlvbl9bMF07Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAgLyoqCi0gICogQ2FsbGVkIHdoZW4gdGhlIENhbmNlbCBidXR0b24gaXMgcHJlc3NlZC4KLSAgKiBJbnN1cmVzIHRoYXQge0BsaW5rICNnZXRSZXN1bHR9IHdpbGwgcmV0dXJuIG51bGwuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKQotICB7Ci0gICAgc2VsZWN0aW9uXyA9IG51bGw7Ci0gICAgc2V0UmV0dXJuQ29kZShEaWFsb2cuQ0FOQ0VMKTsKLSAgICBzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHByZXNzZWQuCi0gICogU3F1aXJyZWxzIGF3YXkgdGhlIGxpc3Qgb2YgemVybyBvciBtb3JlIHNlbGVjdGVkCi0gICogPGNvZGU+SVJlc291cmNlPC9jb2RlPnMgdG8gYmUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRSZXN1bHR9LgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKQotICB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmaWxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBzZWxlY3Rpb25fID0gbmV3IElSZXNvdXJjZVtzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKV07Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICBJdGVyYXRvciBpdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgICAgc2VsZWN0aW9uX1tpKytdID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICB9Ci0gICAgfQotICAgIHNldFJldHVybkNvZGUoRGlhbG9nLk9LKTsKLSAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgfQotCi0gIC8qKgotICAqIFNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbH0uCi0gICogQHBhcmFtIHNoZWxsIFRoZSBzaGVsbC4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgc2hlbGwuc2V0VGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuRElBTE9HX1RJVExFX1JFU09VUkNFX0JST1dTRVIpOwotICB9Ci0KLSAgLyoqIAotICAqIENyZWF0ZXMgdGhlIGRpYWxvZyBhcmVhLgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICogQHJldHVybiBUaGUgY29udHJvbCBhcmVhLgotICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGdkLndpZHRoSGludCA9IDQwMDsKLSAgICBnZC5oZWlnaHRIaW50ID0gMzAwOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBpZiAobXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXykKLSAgICB7Ci0gICAgICByZXNvdXJjZVRyZWVfID0gbmV3IFRyZWUoY29tcG9zaXRlLFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzb3VyY2VUcmVlXyA9IG5ldyBUcmVlKGNvbXBvc2l0ZSxTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgfQotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgcmVzb3VyY2VUcmVlXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICByZXNvdXJjZVRyZWVfLnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1JFU09VUkNFX1RSRUUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVzb3VyY2VUcmVlXywgSU5GT1BPUF9SRVNPVVJDRV9UUkVFKTsKLQotICAgIGZpbGVWaWV3ZXJfID0gbmV3IFRyZWVWaWV3ZXIocmVzb3VyY2VUcmVlXyk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgV2ViU2VydmljZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLSAgICBmaWxlVmlld2VyXy5hZGRGaWx0ZXIoCi0gICAgICBuZXcgVmlld2VyRmlsdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRPYmplY3QsIE9iamVjdCBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgJiYgKChJUmVzb3VyY2Upb2JqZWN0KS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzXy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGZpbHRlcnNfW2ldLmFjY2VwdHMob2JqZWN0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGZpbGVWaWV3ZXJfLnNldElucHV0KHJvb3RfKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0ZpbGVFeHRlbnNpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0ZpbGVFeHRlbnNpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzNTVjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9GaWxlRXh0ZW5zaW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIGNsYXNzIG9mIG9iamVjdHMgdGhhdCBmaWx0ZXIKLSogb3RoZXIgb2JqZWN0cyBmb3IgaW5jbHVzaW9uIG9yIGV4Y2x1c2lvbiBieSBzb21lIGNvbnN1bWVyLgotKi8KLXB1YmxpYyBjbGFzcyBGaWxlRXh0ZW5zaW9uRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlcgotewotICBwcml2YXRlIFN0cmluZ1tdIGV4dGVuc2lvbnNfOwotCi0gIHB1YmxpYyBGaWxlRXh0ZW5zaW9uRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMpCi0gIHsKLSAgICBleHRlbnNpb25zXyA9IChleHRlbnNpb25zICE9IG51bGwpID8gZXh0ZW5zaW9ucyA6IG5ldyBTdHJpbmdbMF07Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS5lZGl0b3IuY29tbW9uLkZpbGVFeHRlbnNpb25GaWx0ZXIiOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkuZWRpdG9yLmNvbW1vbi5GaWxlRXh0ZW5zaW9uRmlsdGVyIjsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LiBUaGlzIG1ldGhvZAotICAqIG11c3QgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0KLSAgKiByZXR1cm5zIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggYSBzZXZlcml0eSBvZgotICAqIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgewotICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSlvYmplY3Q7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnNfLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZXh0ZW5zaW9uc19baV0pKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0lGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1ZGI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSBjbGFzcyBvZiBvYmplY3RzIHRoYXQgZmlsdGVyCi0qIG90aGVyIG9iamVjdHMgZm9yIGluY2x1c2lvbiBvciBleGNsdXNpb24gYnkgc29tZSBjb25zdW1lci4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIKLXsKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gICogYWNjZXB0cyB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4gVGhpcyBtZXRob2QKLSAgKiBtdXN0IHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjc3RhdHVzT2Z9Ci0gICogcmV0dXJucyBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aXRoIGEgc2V2ZXJpdHkgb2YKLSAgKiBsZXNzIHRoYW4gPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4uCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gICogYWNjZXB0cyB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyhPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL1VJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL1VJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3OTNjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9VSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDgxNyAgIDE0MDAxNyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgbG9uZ2VyIHByb2plY3Qgb3Igc2VydmVyL3J1bnRpbWUgc3RyaW5ncyBkbyBub3QgcmVzaXplIHdpemFyZAotICogMjAwNjA4MjkgICAxNTU0NDEgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIHdlYiBzZXJ2aWNlIHdpemFyZCBoYW5ncyBkdXJpbmcgcmVzaXplCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgVUlVdGlscyAKLXsKLQkvKioKLQkgKiBBIGRlZmF1bHQgcGFkZGluZyB2YWx1ZSBmb3IgaG9yaXpvbnRhbFJlc2l6ZSgpLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfUEFERElORyA9IDM1OwotCQotICBTdHJpbmcgICAgICAgaW5mb1BvcGlkXzsKLSAgCi0gIHB1YmxpYyBVSVV0aWxzKCBTdHJpbmcgaW5mb1BvcGlkICkKLSAgewotICAgIGluZm9Qb3BpZF8gPSBpbmZvUG9waWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbE5hbWUsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCApCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlQnV0dG9uKCBTV1QuUkFESU8sIHBhcmVudCwgbGFiZWxOYW1lLCB0b29sdGlwLCBpbmZvcG9wICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbE5hbWUsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCApCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlQnV0dG9uKCBTV1QuQ0hFQ0ssIHBhcmVudCwgbGFiZWxOYW1lLCB0b29sdGlwLCBpbmZvcG9wICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbiggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIHJldHVybiBjcmVhdGVCdXR0b24oIFNXVC5OT05FLCBwYXJlbnQsIGxhYmVsTmFtZSwgdG9vbHRpcCwgaW5mb3BvcCApOwotICB9Ci0gIAotICBwdWJsaWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbiggaW50IGtpbmQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbE5hbWUsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCApCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBraW5kICk7Ci0gICAgCi0gICAgdG9vbHRpcCA9IHRvb2x0aXAgPT0gbnVsbCA/IGxhYmVsTmFtZSA6IHRvb2x0aXA7Ci0gICAgYnV0dG9uLnNldFRleHQoIGxhYmVsTmFtZSApOwotICAgIGJ1dHRvbi5zZXRUb29sVGlwVGV4dCggdG9vbHRpcCApOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBidXR0b24sIGluZm9Qb3BpZF8gKyAiLiIgKyBpbmZvcG9wICk7Ci0gICAgCi0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotICAKLSAgcHVibGljIENvbWJvIGNyZWF0ZUNvbWJvKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxOYW1lLCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIGluZm9wb3AsIGludCBzdHlsZSApCi0gIHsgICAgCi0gICAgdG9vbHRpcCA9IHRvb2x0aXAgPT0gbnVsbCA/IGxhYmVsTmFtZSA6IHRvb2x0aXA7Ci0gICAgCi0gICAgaWYoIGxhYmVsTmFtZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuV1JBUCk7Ci0gICAgICBsYWJlbC5zZXRUZXh0KCBsYWJlbE5hbWUgKTsKLSAgICAgIGxhYmVsLnNldFRvb2xUaXBUZXh0KCB0b29sdGlwICk7Ci0gICAgfQotICAgIAotICAgIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKCBwYXJlbnQsIHN0eWxlICk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgCi0gICAgY29tYm8uc2V0TGF5b3V0RGF0YSggZ3JpZGRhdGEgKTsKLSAgICBjb21iby5zZXRUb29sVGlwVGV4dCggdG9vbHRpcCApOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBjb21ibywgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gY29tYm87ICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbE5hbWUsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCwgaW50IHN0eWxlICkKLSAgeyAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gbGFiZWxOYW1lIDogdG9vbHRpcDsKLSAgICAKLSAgICBpZiggbGFiZWxOYW1lICE9IG51bGwgKQotICAgIHsKLSAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICAgIGxhYmVsLnNldFRleHQoICBsYWJlbE5hbWUgICk7Ci0gICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCggIHRvb2x0aXAgKTsKLSAgICB9Ci0gICAgCi0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQoIHBhcmVudCwgc3R5bGUgKTsKLSAgICBHcmlkRGF0YSBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgIAotICAgIHRleHQuc2V0TGF5b3V0RGF0YSggZ3JpZGRhdGEgKTsKLSAgICB0ZXh0LnNldFRvb2xUaXBUZXh0KCB0b29sdGlwKTsKLSAgICAKLSAgICBpZiggaW5mb3BvcCAhPSBudWxsICkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggdGV4dCwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gdGV4dDsgICAgICAKLSAgfQotICAKLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoIENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zICkKLSAgewotICAgIHJldHVybiBjcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgY29sdW1ucywgLTEsIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKCBDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucywgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoICkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgCi0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICAgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRsYXlvdXQubnVtQ29sdW1ucyAgID0gY29sdW1uczsKLSAgCi0gICAgaWYoIG1hcmdpbkhlaWdodCA+PSAwICkgZ3JpZGxheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7Ci0gICAgaWYoIG1hcmdpbldpZHRoID49IDAgKSAgZ3JpZGxheW91dC5tYXJnaW5XaWR0aCAgPSBtYXJnaW5XaWR0aDsKLSAgICAKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBncmlkbGF5b3V0ICk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ3JpZGRhdGEgKTsKLSAgICAKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIAotICB9Ci0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAJcmV0dXJuIGNyZWF0ZUdyb3VwKCBwYXJlbnQsIGdyb3VwTmFtZSwgdG9vbHRpcCwgaW5mb3BvcCwgMSwgLTEsIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wLCBpbnQgY29sdW1ucywgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoICkKLSAgewotICAgIEdyb3VwICAgICAgbmV3R3JvdXAgICAgPSBuZXcgR3JvdXAoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICBHcmlkRGF0YSAgIGdyaWRkYXRhICAgID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgCi0gICAgZ3JpZGxheW91dC5udW1Db2x1bW5zICA9IGNvbHVtbnM7Ci0gIAotICAgIGlmKCBtYXJnaW5IZWlnaHQgPj0gMCApIGdyaWRsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotICAgIGlmKCBtYXJnaW5XaWR0aCA+PSAwICkgIGdyaWRsYXlvdXQubWFyZ2luV2lkdGggID0gbWFyZ2luV2lkdGg7Ci0gICAgICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyBncm91cE5hbWUgOiB0b29sdGlwOwotICAgIG5ld0dyb3VwLnNldExheW91dCggZ3JpZGxheW91dCApOwotICAgIG5ld0dyb3VwLnNldFRleHQoICBncm91cE5hbWUgICk7Ci0gICAgbmV3R3JvdXAuc2V0TGF5b3V0RGF0YSggZ3JpZGRhdGEgKTsKLSAgICBuZXdHcm91cC5zZXRUb29sVGlwVGV4dCggIHRvb2x0aXAgKTsKLSAgICAKLSAgICBpZiggaW5mb3BvcCAhPSBudWxsICkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuZXdHcm91cCwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3ApOwotICAgIAotICAgIHJldHVybiBuZXdHcm91cDsKLSAgfQotICAKLSAgcHVibGljIFRyZWUgY3JlYXRlVHJlZSggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wLCBpbnQgc3R5bGUgKQotICB7Ci0gICAgCi0gICAgdG9vbHRpcCA9IHRvb2x0aXAgPT0gbnVsbCA/ICIiIDogdG9vbHRpcDsKLSAgICAKLSAgICBUcmVlIHRyZWUgPSBuZXcgVHJlZSggcGFyZW50LCBzdHlsZSApOwotICAgICAKLSAgICB0cmVlLnNldExheW91dERhdGEoIGNyZWF0ZUZpbGxBbGwoKSApOwotICAgIHRyZWUuc2V0VG9vbFRpcFRleHQoIHRvb2x0aXApOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCB0cmVlLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCApOwotICAgIAotICAgIHJldHVybiB0cmVlOyAgICAgIAotICAgIAotICB9Ci0gIAotICBwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCwgaW50IHN0eWxlICkKLSAgewotICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyAiIiA6IHRvb2x0aXA7Ci0gICAgCi0gICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoIHBhcmVudCwgc3R5bGUgKTsKLSAgICAgCi0gICAgLy90YWJsZS5zZXRMYXlvdXREYXRhKCBjcmVhdGVGaWxsQWxsKCkgKTsKLSAgICB0YWJsZS5zZXRUb29sVGlwVGV4dCggdG9vbHRpcCk7Ci0gICAgCi0gICAgaWYoIGluZm9wb3AgIT0gbnVsbCApIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIHRhYmxlLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCApOwotICAgIAotICAgIHJldHVybiB0YWJsZTsgICAgICAKLSAgICAKLSAgfSAgCi0gIAotICBwdWJsaWMgTGFiZWwgY3JlYXRlSG9yaXpvbnRhbFNlcGFyYXRvciggQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYWNpbmcgKQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAxLCBzcGFjaW5nLCAtMSApOwotICAgICAKLQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMICk7Ci0JCi0JR3JpZERhdGEgZ3JpZGRhdGEgID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgKTsKLQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YSggZ3JpZGRhdGEgKTsKLSAgIAotCXJldHVybiBzZXBhcmF0b3I7Ci0gIH0KLSAgCi0gIHB1YmxpYyBHcmlkRGF0YSBjcmVhdGVGaWxsQWxsKCkKLSAgewotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMICk7Ci0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUluZm9Qb3AoQ29udHJvbCBjdHJsLCBTdHJpbmcgaW5mb3BvcCkKLSAgewotCSAgaWYoIGluZm9wb3AgIT0gbnVsbCApIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGN0cmwsIGluZm9Qb3BpZF8gKyAiLiIgKyBpbmZvcG9wICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXNpemVzIHRoZSB3aWR0aCBvZiB0aGUgdGFyZ2V0IGNvbXBvc2l0ZSBzbyB0aGF0IGl0IGlzIGFzIHdpZGUgYXMgdGhlCi0gICAqIHJlZmVyZW5jZSBjb21wb3NpdGUgcGx1cyBhIHBhZGRpbmcgdmFsdWUuICAKLSAgICogCi0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIGNvbXBvc2l0ZSB0byByZXNpemUuCi0gICAqIEBwYXJhbSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBjb21wb3NpdGUKLSAgICogQHBhcmFtIHBhZGRpbmcgVGhlIHBhZGRpbmcgdmFsdWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGhvcml6b250YWxSZXNpemUoQ29tcG9zaXRlIHRhcmdldCwgQ29tcG9zaXRlIHJlZmVyZW5jZSwgaW50IHBhZGRpbmcpIHsKLQkJCi0JCVBvaW50IG9yaWdpbmFsU2l6ZSAgPSB0YXJnZXQuZ2V0U2l6ZSgpOwotCQlQb2ludCByZWZlcmVuY2VTaXplID0gcmVmZXJlbmNlLmdldFNpemUoKTsKLQkJCi0JCXBhZGRpbmcgPSBwYWRkaW5nID49IDAgPyBwYWRkaW5nIDogREVGQVVMVF9QQURESU5HOwotCQkKLQkJaWYgKHJlZmVyZW5jZVNpemUueCArIHBhZGRpbmcgPiBvcmlnaW5hbFNpemUueCkKLQkJCXRhcmdldC5zZXRTaXplKHJlZmVyZW5jZVNpemUueCArIHBhZGRpbmcsIG9yaWdpbmFsU2l6ZS55KTsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9EaWFsb2dVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9kaWFsb2cvRGlhbG9nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3MmE1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9EaWFsb2dVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuV1NVSVBsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotCi0KLS8qKgotKiBDb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGxhdW5jaGluZyB2YXJpb3VzIGNvbW1vbiBkaWFsb2dzLgotKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFsb2dVdGlscwotewotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgY29udGFpbmVycy4KLSAgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCwgb3B0aW9uYWxseSBudWxsLgotICAqIEBwYXJhbSBpbml0aWFsUGF0aG5hbWUgVGhlIGluaXRpYWwgc2VsZWN0aW9uLgotICAqIEByZXR1cm4gVGhlIHNlbGVjdGVkIGNvbnRhaW5lciBvciBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBpcyBjYW5jZWxsZWQsIG9yIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiwgb3IgdGhlIHNlbGVjdGlvbgotICAqIGlzIG5vdCBhIHByb2plY3Qgb3IgYSBmb2xkZXIuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUNvbnRhaW5lcnMgKCBTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGluaXRpYWxQYXRobmFtZSApCi0gIHsKLSAgICBTdHJpbmcgc2VsZWN0ZWRQYXRobmFtZSA9IG51bGw7Ci0gICAgSVBhdGggaW5pdGlhbFBhdGggPSBuZXcgUGF0aChpbml0aWFsUGF0aG5hbWUpOwotICAgIElSZXNvdXJjZSBpbml0aWFsUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGluaXRpYWxQYXRoKTsKLSAgICBpZiAoaW5pdGlhbFJlc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGluaXRpYWxQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoaW5pdGlhbFBhdGguc2VnbWVudCgwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbml0aWFsUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0gICAgICB7Ci0gICAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZvbGRlcihpbml0aWFsUGF0aCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5pdGlhbFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgaW5pdGlhbFJlc291cmNlID0gaW5pdGlhbFJlc291cmNlLmdldFBhcmVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhwYXJlbnRTaGVsbCwoSUNvbnRhaW5lcilpbml0aWFsUmVzb3VyY2UsdHJ1ZSxudWxsKTsKLSAgICBkaWFsb2cub3BlbigpOwotICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCA+IDApCi0gICAgewotICAgICAgaWYgKHJlc3VsdFswXSBpbnN0YW5jZW9mIElQYXRoKQotICAgICAgewotICAgICAgICBJUGF0aCBwYXRoID0gKElQYXRoKXJlc3VsdFswXTsKLSAgICAgICAgc2VsZWN0ZWRQYXRobmFtZSA9IHBhdGgudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNlbGVjdGVkUGF0aG5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBSYWlzZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHJlc291cmNlcy4KLSAgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCwgb3B0aW9uYWxseSBudWxsLgotICAqIEBwYXJhbSB0b3BSZXNvdXJjZSBUaGUgcmVzb3VyY2UgdW5kZXIgd2hpY2ggdG8gYnJvd3NlLgotICAqIElmIG51bGwsIGFsbCByZXNvdXJjZXMgaW4gdGhlIHdvcmtzcGFjZSBhcmUgYnJvd3NlZC4KLSAgKiBAcGFyYW0gaW5pdGlhbFNlbGVjdGlvbiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24sIG9yIG51bGwgZm9yIG5vbmUuCi0gICogSWYgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGlzIG5vdCBudWxsIGFuZCBleGlzdHMgaW4gdGhlIHNldCBvZgotICAqIHJlc291cmNlcyBmb3VuZCBieSB0aGUgYnJvd3NlciwgdGhhdCByZXNvdXJjZSBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHJlc291cmNlIGZpbHRlciBvYmplY3QuCi0gICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcmVzb3VyY2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGJyb3dzZVJlc291cmNlcyAoIFNoZWxsIHBhcmVudFNoZWxsLCBJUmVzb3VyY2UgdG9wUmVzb3VyY2UsIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uLCBGaWx0ZXIgZmlsdGVyKQotICB7Ci0gICAgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgcmRzID0gbmV3IFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKHBhcmVudFNoZWxsLHRvcFJlc291cmNlLGluaXRpYWxTZWxlY3Rpb24sZmlsdGVyKTsKLSAgICByZHMuc2V0TXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkKGZhbHNlKTsKLSAgICBpZiAocmRzLm9wZW4oKSA9PSBEaWFsb2cuT0spCi0gICAgewotICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gcmRzLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VzWzBdOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIDxiPkltcGxlbWVudGF0aW9uIHJlbWFpbnMgVEJELjwvYj48YnI+Ci0gICogUmFpc2VzIGEgZGlhbG9nIGZvciBicm93c2luZyBjbGFzc2VzIG9uIGEgcHJvamVjdCdzIGNsYXNzIHBhdGguCi0gICogQHBhcmFtIHBhcmVudFNoZWxsIFRoZSBwYXJlbnQgc2hlbGwsIG9wdGlvbmFsbHkgbnVsbC4KLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdC4KLSAgKiBAcmV0dXJuIFRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgamF2YSBjbGFzcy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQ2xhc3NlcyAoIFNoZWxsIHBhcmVudFNoZWxsLCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgewotICAgIHJldHVybiBicm93c2VDbGFzc2VzKHBhcmVudFNoZWxsLCBwcm9qZWN0LCAoSVJ1bm5hYmxlQ29udGV4dCludWxsKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUNsYXNzZXMgKCBTaGVsbCBwYXJlbnRTaGVsbCwgSVByb2plY3QgcHJvamVjdCwgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIpCi0gIHsKLSAgICByZXR1cm4gYnJvd3NlQ2xhc3NlcyhwYXJlbnRTaGVsbCwgcHJvamVjdCwgKElSdW5uYWJsZUNvbnRleHQpY29udGFpbmVyKTsKLSAgfQotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgY2xhc3NlcyBvbiBhIHByb2plY3QncyBjbGFzcyBwYXRoLgotICAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsLCBvcHRpb25hbGx5IG51bGwuCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBsYXVuY2hpbmcgd2l6YXJkLgotICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWxlY3RlZCBqYXZhIGNsYXNzLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VDbGFzc2VzICggU2hlbGwgcGFyZW50U2hlbGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUnVubmFibGVDb250ZXh0IGN0eHQpIAotICB7Ci0gICAgcmV0dXJuIGJyb3dzZUNsYXNzZXMocGFyZW50U2hlbGwsIG5ldyBJUmVzb3VyY2VbXSB7cHJvamVjdH0sIGN0eHQpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VDbGFzc2VzKFNoZWxsIHBhcmVudFNoZWxsLCBJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElSdW5uYWJsZUNvbnRleHQgY3R4dCkKLSAgewotICAgIElUeXBlIGl0eXBlID0gYnJvd3NlQ2xhc3Nlc0FzSVR5cGUocGFyZW50U2hlbGwsIHJlc291cmNlcywgY3R4dCk7Ci0gICAgaWYgKGl0eXBlICE9IG51bGwpCi0gICAgICByZXR1cm4gaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVR5cGUgYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoU2hlbGwgcGFyZW50U2hlbGwsIElSZXNvdXJjZVtdIHJlc291cmNlcywgSVJ1bm5hYmxlQ29udGV4dCBjdHh0KQotICB7Ci0JVmVjdG9yIGphdmFFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2VzW2ldKTsKLQkgIGlmIChqYXZhRWxlbWVudCAhPSBudWxsKQotCSAgICBqYXZhRWxlbWVudHMuYWRkKGphdmFFbGVtZW50KTsKLQl9Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSAoSUphdmFFbGVtZW50W10pamF2YUVsZW1lbnRzLnRvQXJyYXkobmV3IElKYXZhRWxlbWVudFswXSk7Ci0JCi0gICAgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotICAgIHNjb3BlLnNldEluY2x1ZGVzQ2xhc3NwYXRocyh0cnVlKTsKLSAgICBzY29wZS5zZXRJbmNsdWRlc0JpbmFyaWVzKHRydWUpOwotCi0gICAgLy9DcmVhdGluZyBhbmQgb3BlbmluZyBhIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSAgICB0cnkKLQl7Ci0gICAgICBTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2cocGFyZW50U2hlbGwsIGN0eHQsIHNjb3BlLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgZmFsc2UpOwotICAgICAgZGlhbG9nLnNldFRpdGxlKFdTVUlQbHVnaW5NZXNzYWdlcy5ESUFMT0dfVElUTEVfQ0xBU1NfQlJPV1NFKTsKLSAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFdTVUlQbHVnaW5NZXNzYWdlcy5ESUFMT0dfVElUTEVfQ0xBU1NfQlJPV1NFKTsgICAgCi0gICAgICBkaWFsb2cub3BlbigpOwotCi0gICAgICAvL0dldHRpbmcgdGhlIHJlc3VsdCBhbmQgcmV0dXJuaW5nIGl0Ci0gICAgICBPYmplY3RbXSByZXN1bHRzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHJlc3VsdHMgIT0gbnVsbCAmJiByZXN1bHRzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHRzWzBdIGluc3RhbmNlb2YgSVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKElUeXBlKXJlc3VsdHNbMF07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgaW50ZXJmYWNlcyBvbiBhIHByb2plY3QncyBjbGFzcyBwYXRoLgotICAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsLCBvcHRpb25hbGx5IG51bGwuCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBsYXVuY2hpbmcgd2l6YXJkLgotICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWxlY3RlZCBqYXZhIGludGVyZmFjZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlSW50ZXJmYWNlcyggU2hlbGwgcGFyZW50U2hlbGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIpIAotICAJCQkJCQkJCQkgICAgCi0gIHsKLSAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0KLSAgICAvL0xpbWl0aW5nIHNlYXJjaCBzY29wZSB0byB0aGUgcHJvamVjdAotICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbMV07Ci0gICAgcmVzb3VyY2VzWzBdPXByb2plY3Q7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50WzFdOwotCWVsZW1lbnRzWzBdID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlc1swXSk7Ci0gICAgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotICAgIHNjb3BlLnNldEluY2x1ZGVzQ2xhc3NwYXRocyh0cnVlKTsKLSAgICBzY29wZS5zZXRJbmNsdWRlc0JpbmFyaWVzKHRydWUpOwotCi0gICAgLy9DcmVhdGluZyBhbmQgb3BlbmluZyBhIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSAgICB0cnkKLQl7Ci0gICAgCVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyhwYXJlbnRTaGVsbCwgY29udGFpbmVyLCBzY29wZSwgSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX1RZUEVTLCBmYWxzZSk7Ci0gICAgCWRpYWxvZy5zZXRUaXRsZShXU1VJUGx1Z2luTWVzc2FnZXMuRElBTE9HX1RJVExFX0lOVEVSRkFDRV9CUk9XU0UpOwotICAgIAlkaWFsb2cuc2V0TWVzc2FnZShXU1VJUGx1Z2luTWVzc2FnZXMuRElBTE9HX1RJVExFX0lOVEVSRkFDRV9CUk9XU0UpOyAgICAKLSAgICAJZGlhbG9nLm9wZW4oKTsKLQotICAgIAkvL0dldHRpbmcgdGhlIHJlc3VsdCBhbmQgcmV0dXJuaW5nIGl0Ci0gICAgCU9iamVjdFtdIHJlc3VsdHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgCWlmIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5sZW5ndGggPiAwKQotICAgIAl7Ci0gICAgCQlpZiAocmVzdWx0c1swXSBpbnN0YW5jZW9mIElUeXBlKQotICAgIAkJewotICAgIAkJCUlUeXBlIHJlc3VsdEludGVyZmFjZSA9IChJVHlwZSlyZXN1bHRzWzBdOwotICAgIAkJCWludGVyZmFjZU5hbWUgPSByZXN1bHRJbnRlcmZhY2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JewotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW50ZXJmYWNlTmFtZTsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvZGlhbG9nL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDg4ZDM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvZGlhbG9nL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLldTVUlQbHVnaW5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotCi0vKioKLSogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGRpYWxvZyBmb3IgYnJvd3Npbmcgd29ya3NwYWNlIHJlc291cmNlcy4KLSogU2VlIGFsc28ge0BsaW5rIERpYWxvZ1V0aWxzI2Jyb3dzZVJlc291cmNlc30uCi0qLwotcHVibGljIGNsYXNzIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTGlzdGVuZXIKLXsKLQotICAvLyBEaWFsb2cgY29udHJvbHMuCi0gIC8vCi0gIHByaXZhdGUgTGFiZWwgZmlsdGVyTGFiZWxfOwotICBwcml2YXRlIENvbWJvIGZpbHRlckNvbWJvXzsKLSAgLypDT05URVhUX0lEIERSRVMwMDAxIGZvciB0aGUgUmVzb3VyY2UgVHlwZSBjb21ibyBib3ggb2YgdGhlIFJlc291cmNlIFNlbGVjdGlvbiBEaWFsb2cqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1BPUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEUgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLkRSRVMwMDAxIjsKLQotICBwcml2YXRlIFRyZWUgcmVzb3VyY2VUcmVlXzsKLSAgcHJpdmF0ZSBUcmVlVmlld2VyIGZpbGVWaWV3ZXJfOwotICAvKkNPTlRFWFRfSUQgRFJFUzAwMDIgZm9yIHRoZSBSZXNvdXJjZSB0cmVlIG9mIHRoZSBSZXNvdXJjZSBTZWxlY3Rpb24gRGlhbG9nKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9QT1BfRFJFU19UUkVFX1JFU09VUkNFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5EUkVTMDAwMiI7Ci0KLSAgLy8KLSAgLy8gRXNzZW50aWFsIGdvb2RpZXMuCi0gIC8vCi0gIHByaXZhdGUgSVJlc291cmNlIHJvb3RfOwotICBwcml2YXRlIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBGaWx0ZXJbXSBmaWx0ZXJzXzsKLSAgcHJpdmF0ZSBGaWx0ZXIgY3VycmVudEZpbHRlcl87Ci0gIHByaXZhdGUgSVJlc291cmNlW10gc2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF87Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4KLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cGFyZW50IFNoZWxsPC9jb2RlPi4KLSAgKiBUaGUgZGlhbG9nIHJlbmRlcnMgYWxsIHJlc291cmNlcyBpbmNsdWRpbmcgYW5kCi0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnJvb3QgSVJlc291cmNlPC9jb2RlPi4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsfSwKLSAgKiBvciBudWxsIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbC4KLSAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSwKLSAgKiBvciBudWxsIHRvIGJlZ2luIHdpdGggdGhlIHdvcmtzcGFjZSByb290LgotICAqIEBwYXJhbSBpbml0aWFsU2VsZWN0aW9uIFRoZSBpbml0aWFsbHkgc2VsZWN0ZWQgb2JqZWN0IG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nICggU2hlbGwgcGFyZW50LCBJUmVzb3VyY2Ugcm9vdCwgSVJlc291cmNlIGluaXRpYWxTZWxlY3Rpb24gKQotICB7Ci0gICAgdGhpcyhwYXJlbnQscm9vdCxpbml0aWFsU2VsZWN0aW9uLG5ldyBGaWx0ZXJbXSB7bmV3IEFueUZpbHRlcigpfSk7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPgotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5wYXJlbnQgU2hlbGw8L2NvZGU+LgotICAqIFRoZSBkaWFsb2cgcmVuZGVycyBhbGwgcmVzb3VyY2VzIGluY2x1ZGluZyBhbmQKLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cm9vdCBJUmVzb3VyY2U8L2NvZGU+IHRoYXQKLSAgKiBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlci4KLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyI2FjY2VwdHN9LgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LAotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gVGhlIGluaXRpYWxseSBzZWxlY3RlZCBvYmplY3Qgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcn0sCi0gICogb3IgbnVsbCB0byBkZWZhdWx0IHRvIGFsbCByZXNvdXJjZXMgdW5kZXIgdGhlIDxjb2RlPnJvb3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgKCBTaGVsbCBwYXJlbnQsIElSZXNvdXJjZSByb290LCBJUmVzb3VyY2UgaW5pdGlhbFNlbGVjdGlvbiwgRmlsdGVyIGZpbHRlciApCi0gIHsKLSAgICB0aGlzKHBhcmVudCxyb290LGluaXRpYWxTZWxlY3Rpb24sbmV3IEZpbHRlcltdIHtmaWx0ZXJ9KTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UmVzb3VyY2VTZWxlY3Rpb25EaWFsb2c8L2NvZGU+Ci0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnBhcmVudCBTaGVsbDwvY29kZT4uCi0gICogVGhlIGRpYWxvZyByZW5kZXJzIGFsbCByZXNvdXJjZXMgaW5jbHVkaW5nIGFuZAotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5yb290IElSZXNvdXJjZTwvY29kZT4gdGhhdAotICAqIGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVycy4KLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyI2FjY2VwdHN9LgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LgotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gVGhlIGluaXRpYWxseSBzZWxlY3RlZCBvYmplY3Qgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBmaWx0ZXJzIEFuIGFycmF5IG9mIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcn0KLSAgKiBvYmplY3RzLgotICAqIElmIHRoZSBhcnJheSBpcyBudWxsIG9yIG9mIGxlbmd0aCB6ZXJvLCB0aGVuIGFsbCByZXNvdXJjZXMgYXJlIGFjY2VwdGVkCi0gICogKGllLiBlcXVpdmFsZW50IHRvIDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nKHBhcmVudCxyb290KTwvY29kZT4uCi0gICogSWYgdGhlIGFycmF5IGlzIG9mIGxlbmd0aCBvbmUsIHRoZW4gdGhlIGRpYWxvZyB3aWxsIGNvbnNpc3Qgb2YgYSBzaW5nbGUKLSAgKiBjb250cm9sIHNob3dpbmcgYSBsaXN0IG9mIGFsbCBmaWx0ZXJlZCByZXNvdXJjZXMuCi0gICogSWYgdGhlIGFycmF5IGlzIG9mIGxlbmd0aCBncmVhdGVyIHRoYW4gb25lLCB0aGVuIHRoZSBkaWFsb2cgd2lsbAotICAqIGNvbnNpc3Qgb2YgYSBjb21ibyBib3ggY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGZpbHRlcnMgYW5kIHdpdGggdGhlCi0gICogZmlyc3QgZmlsdGVyIChpZS4gPGNvZGU+ZmlsdGVyc1swXTwvY29kZT4pIHNlbGVjdGVkIGJ5IGRlZmF1bHQsIGZvbGxvd2VkCi0gICogYnkgYSBjb250cm9sIHNob3dpbmcgYSBsaXN0IG9mIGFsbCByZXNvdXJjZXMgZmlsdGVyZWQgYnkgdGhlIHNlbGVjdGVkIGZpbHRlci4gCi0gICovCi0gIHB1YmxpYyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyAoIFNoZWxsIHBhcmVudCwgSVJlc291cmNlIHJvb3QsIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uLCBGaWx0ZXJbXSBmaWx0ZXJzICkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgcm9vdF8gPSByb290ID09IG51bGwgPyBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKSA6IHJvb3Q7Ci0gICAgaW5pdGlhbFNlbGVjdGlvbl8gPSBpbml0aWFsU2VsZWN0aW9uOwotICAgIGZpbHRlcnNfID0gKGZpbHRlcnMgPT0gbnVsbCB8fCBmaWx0ZXJzLmxlbmd0aCA9PSAwKSA/IG5ldyBGaWx0ZXJbXSB7bmV3IEFueUZpbHRlcigpfSA6IGZpbHRlcnM7Ci0gICAgY3VycmVudEZpbHRlcl8gPSBmaWx0ZXJzX1swXTsKLSAgICBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWRfID0gZmFsc2U7Ci0gICAgc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLSAgfQotCi0gIC8qKgotICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbXVsdGlwbGUgc2VsZWN0aW9uIGluIHRoZSB0cmVlIHZpZXcuCi0gICogTXVsdGlwbGUgc2VsZWN0aW9uIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0gICogQHBhcmFtIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZCBUcnVlIHRvIGVuYWJsZWQgb3IgZmFsc2UgdG8gZGlzYWJsZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkICggYm9vbGVhbiBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQgKQotICB7Ci0gICAgbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXyA9IG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNlbGVjdGlvbnMgbWFkZSBpbiB0aGUgZGlhbG9nIGlmIE9LIHdhcyBwcmVzc2VkLAotICAqIG9yIG51bGwgaWYgQ2FuY2VsIHdhcyBwcmVzc2VkLiBSZXR1cm5zIG51bGwgaWYgdGhlIGRpYWxvZwotICAqIGhhcyBuZXZlciBiZWVuIG9wZW5lZC4KLSAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHNlbGVjdGVkIHJlc291cmNlcywgcG9zc2libHkgZW1wdHksIHBvc3NpYmx5IG51bGwuCi0gICovCi0gIHB1YmxpYyBJUmVzb3VyY2VbXSBnZXRSZXN1bHQgKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gdGhlIENhbmNlbCBidXR0b24gaXMgcHJlc3NlZC4KLSAgKiBJbnN1cmVzIHRoYXQge0BsaW5rICNnZXRSZXN1bHR9IHdpbGwgcmV0dXJuIG51bGwuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQgKCkKLSAgewotICAgIHNlbGVjdGlvbl8gPSBudWxsOwotICAgIHNldFJldHVybkNvZGUoRGlhbG9nLkNBTkNFTCk7Ci0gICAgc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBwcmVzc2VkLgotICAqIFNxdWlycmVscyBhd2F5IHRoZSBsaXN0IG9mIHplcm8gb3IgbW9yZSBzZWxlY3RlZAotICAqIDxjb2RlPklSZXNvdXJjZTwvY29kZT5zIHRvIGJlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UmVzdWx0fS4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkICgpCi0gIHsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZpbGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIHNlbGVjdGlvbl8gPSBuZXcgSVJlc291cmNlW3N0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpXTsKLSAgICAgIGludCBpPTA7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gc3RydWN0dXJlZFNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25fW2krK10gPSAoSVJlc291cmNlKW9iamVjdDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5PSyk7Ci0gICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGx9LgotICAqIEBwYXJhbSBzaGVsbCBUaGUgc2hlbGwuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsICggU2hlbGwgc2hlbGwgKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLkRJQUxPR19USVRMRV9SRVNPVVJDRV9CUk9XU0UpOwotICB9Ci0KLSAgLyoqIAotICAqIENyZWF0ZXMgdGhlIGRpYWxvZyBhcmVhLgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICogQHJldHVybiBUaGUgY29udHJvbCBhcmVhLgotICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhICggQ29tcG9zaXRlIHBhcmVudCApCi0gIHsKLSAgICBHcmlkTGF5b3V0IGdsOwotICAgIEdyaWREYXRhIGdkOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBnZC53aWR0aEhpbnQgPSA0MDA7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IDMwMDsKLSAgICBnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgaWYgKGZpbHRlcnNfLmxlbmd0aCA+IDEpCi0gICAgewotICAgICAgQ29tcG9zaXRlIGYgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSxTV1QuTk9ORSk7Ci0gICAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICBmLnNldExheW91dChnbCk7Ci0gICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAgZi5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgZmlsdGVyTGFiZWxfID0gbmV3IExhYmVsKGYsU1dULldSQVApOwotICAgICAgZmlsdGVyTGFiZWxfLnNldFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX1JFU09VUkNFX0ZJTFRFUik7Ci0gICAgICBmaWx0ZXJMYWJlbF8uc2V0VG9vbFRpcFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfRFJFU19DT01CT19SRVNPVVJDRV9UWVBFKTsKLQotICAgICAgZmlsdGVyQ29tYm9fID0gbmV3IENvbWJvKGYsU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgIGZpbHRlckNvbWJvXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgIGZpbHRlckNvbWJvXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLHRoaXMpOwotICAgICAgZmlsdGVyQ29tYm9fLnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRSk7Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZpbHRlckNvbWJvXyxJTkZPUE9QX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRSk7Ci0gICAgfQotCi0gICAgaWYgKG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF8pCi0gICAgewotICAgICAgcmVzb3VyY2VUcmVlXyA9IG5ldyBUcmVlKGNvbXBvc2l0ZSxTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc291cmNlVHJlZV8gPSBuZXcgVHJlZShjb21wb3NpdGUsU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIH0KLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHJlc291cmNlVHJlZV8uc2V0TGF5b3V0RGF0YShnZCk7Ci0vLyAgcmVzb3VyY2VUcmVlXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLHRoaXMpOwotICAgIHJlc291cmNlVHJlZV8uc2V0VG9vbFRpcFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfRFJFU19UUkVFX1JFU09VUkNFKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlc291cmNlVHJlZV8sSU5GT1BPUF9EUkVTX1RSRUVfUkVTT1VSQ0UpOwotCi0gICAgZmlsZVZpZXdlcl8gPSBuZXcgVHJlZVZpZXdlcihyZXNvdXJjZVRyZWVfKTsKLSAgICBmaWxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBmaWxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcigKLQkJCQkgICAgICAgIG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIAotCQkJCSAgICAgICAgV2ViU2VydmljZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLSAgICBmaWxlVmlld2VyXy5hZGRGaWx0ZXIoCi0gICAgICBuZXcgVmlld2VyRmlsdGVyICgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdCAoIFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRPYmplY3QsIE9iamVjdCBvYmplY3QgKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgKAotICAgICAgICAgICAgKChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpICYmICgoSVJlc291cmNlKW9iamVjdCkuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotICAgICAgICAgICAgfHwgKFJlc291cmNlU2VsZWN0aW9uRGlhbG9nLnRoaXMuY3VycmVudEZpbHRlcl8uYWNjZXB0cyhvYmplY3QpKQotICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGZpbGVWaWV3ZXJfLnNldElucHV0KHJvb3RfKTsKLSAgICBmaWxlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0gICAgICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciAoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkICggU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ICkKLSAgICAgICAgewotLy8gICAgICAgIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nLnRoaXMudmFsaWRhdGVQYWdlVG9TdGF0dXMoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgaWYgKGluaXRpYWxTZWxlY3Rpb25fICE9IG51bGwpCi0gICAgewotICAgICAgZmlsZVZpZXdlcl8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKFJlc291cmNlU2VsZWN0aW9uRGlhbG9nLnRoaXMuaW5pdGlhbFNlbGVjdGlvbl8pLHRydWUpOwotICAgIH0KLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhbiBldmVudCBvY2N1cnMgb24gdGhlIHBhZ2UuCi0gICogSGFuZGxlcyB0aGUgZXZlbnQgYW5kIHJldmFsaWRhdGVzIHRoZSBwYWdlLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCBvY2N1cmVkLgotICAqLwotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoIEV2ZW50IGV2ZW50ICkKLSAgewotLy8gIHZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dlYlNlcnZpY2VVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wbHVnaW4vV2ViU2VydmljZVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTFhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wbHVnaW4vV2ViU2VydmljZVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjQgICAxMTU2OTAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBwbHVnaW4uCi0qIDxwPgotKiBUaGlzIHBsdWdpbiBjb250YWlucyB0aGUgZ3JhcGhpYyB1c2VyIGludGVyZmFjZSB0byB0aGUKLSogV2ViIFNlcnZpY2VzIHJ1bnRpbWUgZm91bmQgaW4gb3JnLmVjbGlwc2UuanN0LndzLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLnVpIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VVSVBsdWdpbiBpbnN0YW5jZV87Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbigpIHsKLQlzdXBlcigpOwotCWluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MudWkiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlVUlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0JCQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBuYW1lKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wb3B1cC9Qb3B1cFRlc3RTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3BvcHVwL1BvcHVwVGVzdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0OGFlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3BvcHVwL1BvcHVwVGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDgwMyAgIDE1Mjc5MCBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24gKGNyZWF0ZWQgY2xhc3MpCi0gKiAyMDA3MDMyNyAgIDE3MjMzOSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wb3B1cDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFQWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wb3B1cC5Qb3B1cFRlc3RXU0RMOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS51dGlscy5BZGFwdGVyVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFBvcHVwVGVzdFNlcnZpY2UgZXh0ZW5kcyBQb3B1cFRlc3RXU0RMCi17Ci0gIHB1YmxpYyBQb3B1cFRlc3RTZXJ2aWNlKCkKLSAgewotCSAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLQlTdHJpbmcgc3RhdGVMb2NhdGlvbiA9IEV4cGxvcmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpOwotCVN0cmluZyBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24gPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbigpOwotICAJV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCBjb21tYW5kID0gbmV3IFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQoKTsKLSAgICBjb21tYW5kLnNldEZvcmNlTGF1bmNoT3V0c2lkZUlERShmYWxzZSk7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0V29ya2JlbmNoU2VsZWN0aW9uKCk7Ci0gICAgVmVjdG9yIGxhdW5jaE9wdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHdzZGxVUkwgPSBudWxsOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlUmVmIHNlcnZpY2VJbXBsID0gKFNlcnZpY2VSZWYpb2JqZWN0OwotICAgICAgICAgIHdzZGxVUkwgPSBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSShzZXJ2aWNlSW1wbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgIAl3c2RsVVJMID0gKFN0cmluZykgb2JqZWN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJLy8gT2JqZWN0IGlzIG5vdCBhbnkgdHlwZXMgd2UgcmVjb2duaXplZCwgd3NkbFVSTCBpcyBzdGlsbCBudWxsLgotICAgICAgICAgIAkvLyBUcnkgbG9va2luZyB1cCBhbiBhZGFwdGVyIGZvciB0aGUgb2JqZWN0LgotICAgICAgICAJLy8gSWYgZm91bmQsIHVwZGF0ZSB3c2RsVVJMIGNvbnRhaW5zIHRoZSBhZGFwdGVkIFdTREwgc3RyaW5nLiAgCi0gICAgICAgIAkvLyBJZiBub3QgZm91bmQsIHdzZGxVUkwgd291bGQgc3RpbGwgYmUgbnVsbC4KLSAgICAgICAgCXdzZGxVUkwgPSBBZGFwdGVyVXRpbHMuZ2V0QWRhcHRlZFdTREwob2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYWRkTGF1bmNoT3B0aW9ucyhsYXVuY2hPcHRpb25zLCB3c2RsVVJMLCBzdGF0ZUxvY2F0aW9uLCBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBjb21tYW5kLnNldExhdW5jaE9wdGlvbnMoKExhdW5jaE9wdGlvbltdKWxhdW5jaE9wdGlvbnMudG9BcnJheShuZXcgTGF1bmNoT3B0aW9uWzBdKSk7Ci0gICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUmVzb3VyY2VNYW5hZ21lbnRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjNmZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMzMxICAgMTI4ODI3IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDQwMyAgIDEyODgyNyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5XU1VJUGx1Z2luTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlRGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJlZmVyZW5jZXMuTWVyZ2VEZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJlZmVyZW5jZXMuUGVyc2lzdGVudE1lcmdlQ29udGV4dDsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgLypDT05URVhUX0lEIFBQUk0wMDAxIGZvciB0aGUgUmVzb3VyY2UgTWFuYWdtZW50IFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFBSTV9QQUdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwMSI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIG92ZXJXcml0ZUZpbGVzOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDIgZm9yIHRoZSBmaWxlIG92ZXJ3cml0ZSBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFBSTTAwMDIiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVGb2xkZXJzOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDMgZm9yIHRoZSBjcmVhdGUgZm9sZGVycyBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwMyI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIGNoZWNrb3V0RmlsZXM7Ci0gIC8qQ09OVEVYVF9JRCBQUFJNMDAwNCBmb3IgdGhlIGNoZWNrb3V0IGZpbGVzIGNoZWNrIGJveCBvbiB0aGUgUmVzb3VyY2UgTWFuYWdlbWVudCBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQUk1fQ0hFQ0tCT1hfQ0hFQ0tfT1VUID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwNCI7Ci0gIAotICBwcml2YXRlIEJ1dHRvbiBza2VsZXRvbk1lcmdlOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDUgZm9yIHRoZSBza2VsZXRvbiBtZXJnZSBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX1NLRUxFVE9OX01FUkdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwNSI7Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAJCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BQUk1fUEFHRSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9QUFJNX1BBR0UpOwotCi0gICAgb3ZlcldyaXRlRmlsZXMgPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIFdTVUlQbHVnaW5NZXNzYWdlcy5CVVRUT05fT1ZFUldSSVRFX0ZJTEVTKTsKLSAgICBvdmVyV3JpdGVGaWxlcy5zZXRUb29sVGlwVGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKG92ZXJXcml0ZUZpbGVzLCBJTkZPUE9QX1BQUk1fQ0hFQ0tCT1hfT1ZFUldSSVRFX0ZJTEVTKTsKLQotICAgIGNyZWF0ZUZvbGRlcnMgID0gY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBXU1VJUGx1Z2luTWVzc2FnZXMuQlVUVE9OX0NSRUFURV9GT0xERVJTKTsKLSAgICBjcmVhdGVGb2xkZXJzLnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BQUk1fQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChjcmVhdGVGb2xkZXJzLCBJTkZPUE9QX1BQUk1fQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMpOwotCi0gICAgY2hlY2tvdXRGaWxlcyA9IGNyZWF0ZUNoZWNrQm94KHBhcmVudCwgV1NVSVBsdWdpbk1lc3NhZ2VzLkJVVFRPTl9DSEVDS09VVF9GSUxFUyk7ICAgIAotICAgIGNoZWNrb3V0RmlsZXMuc2V0VG9vbFRpcFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChjaGVja291dEZpbGVzLCBJTkZPUE9QX1BQUk1fQ0hFQ0tCT1hfQ0hFQ0tfT1VUKTsKLSAgICAKLSAgICBza2VsZXRvbk1lcmdlID0gY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBXU1VJUGx1Z2luTWVzc2FnZXMuQlVUVE9OX1NLRUxFVE9OX01FUkdFKTsgICAgCi0gICAgc2tlbGV0b25NZXJnZS5zZXRUb29sVGlwVGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9QUFJNX0NIRUNLQk9YX1NLRUxFVE9OX01FUkdFKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAoc2tlbGV0b25NZXJnZSwgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX1NLRUxFVE9OX01FUkdFKTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOyAgICAKLQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAKLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0ICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5DSEVDSyApOwotICAgIGJ1dHRvbi5zZXRUZXh0KCB0ZXh0ICk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgeyB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIG92ZXJXcml0ZUZpbGVzLnNldFNlbGVjdGlvbiggUmVzb3VyY2VEZWZhdWx0cy5nZXRPdmVyd3JpdGVGaWxlc0RlZmF1bHQoKSk7Ci0gICAgY3JlYXRlRm9sZGVycy5zZXRTZWxlY3Rpb24oIFJlc291cmNlRGVmYXVsdHMuZ2V0Q3JlYXRlRm9sZGVyc0RlZmF1bHQoKSk7Ci0gICAgY2hlY2tvdXRGaWxlcy5zZXRTZWxlY3Rpb24oIFJlc291cmNlRGVmYXVsdHMuZ2V0Q2hlY2tvdXRGaWxlc0RlZmF1bHQoKSk7Ci0gICAgc2tlbGV0b25NZXJnZS5zZXRTZWxlY3Rpb24oIE1lcmdlRGVmYXVsdHMuZ2V0U2tlbGV0b25NZXJnZURlZmF1bHQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgLy8gZ2V0IHRoZSBwZXJzaXN0ZW50IGNvbnRleHQgZnJvbSB0aGUgcGx1Z2luCi0gICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgUGVyc2lzdGVudE1lcmdlQ29udGV4dCBtZXJnZUNvbnRleHQgPSBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lcmdlQ29udGV4dCgpOwotICAgIG92ZXJXcml0ZUZpbGVzLnNldFNlbGVjdGlvbiggY29udGV4dC5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKTsKLSAgICBjcmVhdGVGb2xkZXJzLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkpOwotICAgIGNoZWNrb3V0RmlsZXMuc2V0U2VsZWN0aW9uKCBjb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSk7Ci0gICAgc2tlbGV0b25NZXJnZS5zZXRTZWxlY3Rpb24oIG1lcmdlQ29udGV4dC5pc1NrZWxldG9uTWVyZ2VFbmFibGVkKCkpOyAKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgLy8gZ2V0IHRoZSBwZXJzaXN0ZW50IGNvbnRleHQgZnJvbSB0aGUgcGx1Z2luCi0gICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgUGVyc2lzdGVudE1lcmdlQ29udGV4dCBtZXJnZUNvbnRleHQgPSBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lcmdlQ29udGV4dCgpOwotICAgIGNvbnRleHQuc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKCBvdmVyV3JpdGVGaWxlcy5nZXRTZWxlY3Rpb24oKSApOwotICAgIGNvbnRleHQuc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQoIGNyZWF0ZUZvbGRlcnMuZ2V0U2VsZWN0aW9uKCkgKTsKLSAgICBjb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKCBjaGVja291dEZpbGVzLmdldFNlbGVjdGlvbigpICk7ICAKLSAgICBtZXJnZUNvbnRleHQuc2V0U2tlbGV0b25NZXJnZUVuYWJsZWQoIHNrZWxldG9uTWVyZ2UuZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1Rlc3RGYWNpbGl0eURlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvVGVzdEZhY2lsaXR5RGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDEyZmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvVGVzdEZhY2lsaXR5RGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIxNyAgIDExMzE2OSBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDIyMiAgIDExODcxMSBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9EZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLldTVUlQbHVnaW5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RmFjaWxpdHlEZWZhdWx0c1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIAotICBwcml2YXRlIFRhYmxlVmlld2VyIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl87IAotICBwcml2YXRlIEJ1dHRvbiBtb3ZlVXBfOwotICBwcml2YXRlIEJ1dHRvbiBtb3ZlRG93bl87Ci0gIHByaXZhdGUgVmVjdG9yIHdlYlNlcnZpY2VUZXN0VHlwZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBQU0QwMDAxIGZvciB0aGUgU2NlbmFyaW8gRGVmYXVsdHMgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFNEX1BBR0UgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gbGF1bmNoU2FtcGxlOwotICAvKkNPTlRFWFRfSUQgUFBTRDAwMDIgZm9yIHRoZSBsYXVuY2ggc2FtcGxlIGNoZWNrIGJveCBvbiB0aGUgU2NlbmFyaW8gRGVmYXVsdHMgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QUFNEX0NIRUNLQk9YX0xBVU5DSF9TQU1QTEUgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAyIjsKLSAgLy8KLQotICAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIAotICAJQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BQU0RfUEFHRSk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCxJTkZPUE9QX1BQU0RfUEFHRSk7ICAgIAotCi0gICAgbGF1bmNoU2FtcGxlID0gY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBXU1VJUGx1Z2luTWVzc2FnZXMuQlVUVE9OX0xBVU5DSF9TQU1QTEUpOwotICAgIGxhdW5jaFNhbXBsZS5zZXRUb29sVGlwVGV4dChXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9QUFNEX0NIRUNLQk9YX0xBVU5DSF9TQU1QTEUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobGF1bmNoU2FtcGxlLCBJTkZPUE9QX1BQU0RfQ0hFQ0tCT1hfTEFVTkNIX1NBTVBMRSk7Ci0KLSAgICAKLSAgICBUZXh0IHRlc3RTZXJ2aWNlVHlwZUxhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotICAgIHRlc3RTZXJ2aWNlVHlwZUxhYmVsLnNldFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX1NBTVBMRV9UWVBFUyk7Ci0gICAgdGVzdFNlcnZpY2VUeXBlTGFiZWwuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotCi0gICAgQ29tcG9zaXRlIHdlYlNlcnZpY2VUZXN0VHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlQ29tcG9zaXRlLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLQotICAgIFRhYmxlIHRhYmxlPSBuZXcgVGFibGUod2ViU2VydmljZVRlc3RUeXBlQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMjU2OwotICAgIHRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlLnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX0NMSUVOVF9UWVBFX1RBQkxFX1ZJRVdFUik7Ci0KLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnNldENvbnRlbnRQcm92aWRlcihuZXcgV2ViU2VydmljZVRlc3RUeXBlQ29udGVudFByb3ZpZGVyKCkpOwotICAgIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcihuZXcgV2ViU2VydmljZVRlc3RUeXBlTGFiZWxQcm92aWRlcigpKTsKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnNldElucHV0KHdlYlNlcnZpY2VUZXN0VHlwZXNfKTsKLQotICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICB0YWJsZUNvbHVtbi5zZXRUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5MQUJFTF9DTElFTlRfVFlQRV9OQU1FKTsKLSAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbkRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyNTYsIDI1NiwgZmFsc2UpOwotICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uRGF0YSk7Ci0gICAgdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZSh3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMTA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIGMuc2V0TGF5b3V0KGdsKTsKLQotICAgIG1vdmVVcF8gPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLSAgICBtb3ZlVXBfLnNldFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX01PVkVfVVApOwotICAgIG1vdmVVcF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgbW92ZVVwXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBtb3ZlVXBfLnNldFRvb2xUaXBUZXh0KFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX01PVkVfVVApOwotCi0gICAgbW92ZURvd25fID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgbW92ZURvd25fLnNldFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX01PVkVfRE9XTik7Ci0gICAgbW92ZURvd25fLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgIG1vdmVEb3duXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBtb3ZlRG93bl8uc2V0VG9vbFRpcFRleHQoV1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfTU9WRV9ET1dOKTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOyAgICAKLQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0JveCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQgKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULkNIRUNLICk7Ci0gICAgYnV0dG9uLnNldFRleHQoIHRleHQgKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLSAgewotICAgIHRyeXsKLSAgICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgfWNhdGNoIChFeGNlcHRpb24gZXhjKXsKLSAgICAJZXhjLnByaW50U3RhY2tUcmFjZSgpO30KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0gIHsKLSAgICB0cnl7Ci0gIAlwZXJmb3JtT2soKTsKLSAgICB9Y2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKXsKLSAgICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICB7IH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB0byB0aGVpciBidXJuZWQtaW4gZGVmYXVsdHMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIFNjZW5hcmlvRGVmYXVsdHMgZGVmYXVsdHMgPSBuZXcgU2NlbmFyaW9EZWZhdWx0cygpOwotICAgIC8vcGdtIGxhdW5jaFNhbXBsZS5zZXRTZWxlY3Rpb24oIGRlZmF1bHRzLmdldExhdW5jaFNhbXBsZURlZmF1bHQoKSk7Ci0gICAgCi0gICAgd2ViU2VydmljZVRlc3RUeXBlc18uY2xlYXIoKTsKLSAgICBTdHJpbmdbXSB0eXBlcyA9IGRlZmF1bHRzLmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgd2ViU2VydmljZVRlc3RUeXBlc18uYWRkKHR5cGVzW2ldKTsKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gIAlTY2VuYXJpb0NvbnRleHQgIGNvbnRleHQgID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotICAgIFNjZW5hcmlvRGVmYXVsdHMgZGVmYXVsdHMgPSBuZXcgU2NlbmFyaW9EZWZhdWx0cygpOwotICAgIAotICAgIGxhdW5jaFNhbXBsZS5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkpOwotICAgICAgICAKLSAgICBTdHJpbmdbXSB0eXBlcyA9IGNvbnRleHQuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5hZGQodHlwZXNbaV0pOwotICAgIC8vIGNoZWNrIHdoZXRoZXIgd2UgbWlzc2VkIGFueSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IGxpc3QKLSAgICBib29sZWFuIG1pc3NlZCA9IGZhbHNlOwotICAgIHR5cGVzID0gZGVmYXVsdHMuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHdlYlNlcnZpY2VUZXN0VHlwZXNfLmluZGV4T2YodHlwZXNbaV0pID09IC0xKQotICAgICAgewotICAgICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5hZGQodHlwZXNbaV0pOwotICAgICAgICBtaXNzZWQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobWlzc2VkKQotICAgIHsKLSAgICAgIHR5cGVzID0gbmV3IFN0cmluZ1t3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5zaXplKCldOwotICAgICAgd2ViU2VydmljZVRlc3RUeXBlc18uY29weUludG8odHlwZXMpOwotICAgICAgY29udGV4dC5zZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKHR5cGVzKTsKLSAgICB9Ci0gICAgLy8gcmVmcmVzaCB2aWV3ZXIKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotICAgIFN0cmluZ1tdIHR5cGVzID0gbmV3IFN0cmluZ1t3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5zaXplKCldOwotICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmNvcHlJbnRvKHR5cGVzKTsKLSAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUZXN0VHlwZXModHlwZXMpOwotICAgIAotICAgIGNvbnRleHQuc2V0TGF1bmNoU2FtcGxlRW5hYmxlZChsYXVuY2hTYW1wbGUuZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgaWYgKGUud2lkZ2V0ID09IG1vdmVVcF8gJiYgaW5kZXggPiAwKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gd2ViU2VydmljZVRlc3RUeXBlc18ucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgd2ViU2VydmljZVRlc3RUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXgtMSk7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbW92ZURvd25fICYmIGluZGV4IDwgd2ViU2VydmljZVRlc3RUeXBlc18uc2l6ZSgpLTEpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleCsxKTsKLSAgICAgICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBXZWJTZXJ2aWNlVGVzdFR5cGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gKChWZWN0b3IpdmFsdWUpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIAotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgCi0gICAgewotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgV2ViU2VydmljZVRlc3RUeXBlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBXZWJTZXJ2aWNlVGVzdFR5cGVMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBhcmcwKSAKLSAgICB7IAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIC8vcmV0dXJuIGdldEVsZW1lbnRCeUF0dHJpYnV0ZSgiaWQiLCB2YWx1ZS50b1N0cmluZygpKS5nZXRBdHRyaWJ1dGUoImxhYmVsIik7IAotICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3VkZGkvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvdWRkaS9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzdhYmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvdWRkaS9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotCi1wdWJsaWMgaW50ZXJmYWNlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlCi17Ci0gICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCk7Ci0gICAgcHVibGljIFN0cmluZ1tdIGdldFByaXZhdGVVRERJUmVnaXN0cnlJbnF1aXJ5QVBJKCk7Ci0gICAgcHVibGljIFN0cmluZ1tdIGdldFByaXZhdGVVRERJUmVnaXN0cnlQdWJsaXNoQVBJKCk7Ci0gICAgcHVibGljIENvbW1hbmRXaWRnZXRCaW5kaW5nIGdldEJpbmRpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwMWIwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxNDUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTI4NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6MzU6MjYgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmNjOGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIEphbiAzMCAxMDo0MTo0MiBFU1QgMjAwNgotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMGQ3ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cwotQnVuZGxlLVZlcnNpb246IDEuMC4xMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5ydWxlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGlhbG9nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCwzLjUuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0ZmNjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBiZjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MiPgotICAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+Ci0gICA8L2NvbXBvbmVudC1kZXBlbmRzPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5IiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNWE4YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9XU1BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9XU1BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmZlZTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvV1NQbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1NU0dfRVJST1JfU0VSVkVSPUlXQUIwMjEzRSBFcnJvciBpbiBzdGFydGluZyBzZXJ2ZXIuCi0KLUFOWV9GSUxURVJfTkFNRT1BbGwgZmlsZXMKLUFOWV9GSUxURVJfREVTQz1UaGlzIGlzIGEga2luZCBvZiBGaWx0ZXIgdGhhdCBhY2NlcHRzIGFsbCBvYmplY3RzLgotCi1FUlJPUl9TRUxFQ1RJT05fVFJBTlNGT1JNPVNwZWNpZmllZCBzZWxlY3Rpb24gZG9lcyBub3QgbWF0Y2ggYSByZXNvdXJjZS4KLQotTVNHX0pBWFJQQzExX05PVF9DT01QTElBTlQ9VGhlIHNlcnZpY2UgY2xhc3MgInswfSIgZG9lcyBub3QgY29tcGx5IHRvIG9uZSBvciBtb3JlIHJlcXVpcmVtZW50cyBvZiB0aGUgSkFYLVJQQyAxLjEgc3BlY2lmaWNhdGlvbiwgYW5kIG1heSBub3QgZGVwbG95IG9yIGZ1bmN0aW9uIGNvcnJlY3RseS4KLU1TR19KQVhSUEMxMV9VTlJFU09MVkVEX0NMQVNTPVRoZSBjbGFzcyAiezB9IiBjYW5ub3QgYmUgbG9hZGVkIHZpYSBwcm9qZWN0ICJ7MX0iLiBDaGVjayB0aGF0IHRoZSBwcm9qZWN0IGNvbnRhaW5zIHRoZSBjbGFzcywgb3IgdGhhdCB0aGUgY2xhc3MgaXMgbG9hZGFibGUgYWNjb3JkaW5nIHRvIHRoZSBKYXZhIEJ1aWxkIFBhdGggb2YgdGhlIHByb2plY3QuCi1NU0dfSkFYUlBDMTFfVU5SRVNPTFZFRF9UWVBFPUEgZGF0YSB0eXBlLCAiezB9IiwgY291bGQgbm90IGJlIHJlc29sdmVkIHdoaWxlIGFuYWx5emluZyB0aGUgc2VydmljZSBjbGFzcy4gQ2hlY2sgeW91ciBwcm9qZWN0IGNsYXNzcGF0aC4KLU1TR19KQVhSUEMxMV9SVUxFXzAwMDE9VGhlIHNlcnZpY2UgY2xhc3MgInswfSIgZG9lcyBub3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDaGFwdGVyIDEwLjEgb2YgdGhlIEpBWC1SUEMgMS4xIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgYSBzZXJ2aWNlIGNsYXNzIHRvIGhhdmUgYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvciwgb3RoZXJ3aXNlIGEgSkFYLVJQQyAxLjEgY29tcGxpYW50IFdlYiBzZXJ2aWNlIGVuZ2luZSBtYXkgYmUgdW5hYmxlIHRvIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmljZSBjbGFzcyB0byBoYW5kbGUgYW4gaW5jb21pbmcgcmVxdWVzdCBtZXNzYWdlLiAKLU1TR19KQVhSUEMxMV9SVUxFXzAwMDI9VGhlIHZhbHVlIHR5cGUgInswfSIgdXNlZCB2aWEgdGhlIHNlcnZpY2UgY2xhc3MgInsxfSIgZG9lcyBub3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDaGFwdGVyIDUuNCBvZiB0aGUgSkFYLVJQQyAxLjEgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBhIHZhbHVlIHR5cGUgdG8gaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBvdGhlcndpc2UgYSBKQVgtUlBDIDEuMSBjb21wbGlhbnQgV2ViIHNlcnZpY2UgZW5naW5lIG1heSBiZSB1bmFibGUgdG8gY29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSB2YWx1ZSB0eXBlIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uCi1NU0dfSkFYUlBDMTFfUlVMRV8wMDAzPVRoZSBtZXRob2QgInswfSIgb24gdGhlIHNlcnZpY2UgY2xhc3MgInsxfSIgaXMgb3ZlcmxvYWRlZC4gT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBhbGxvd2VkIGJ5IGNoYXB0ZXIgNS41LjUgb2YgdGhlIEpBWC1SUEMgMS4xIHNwZWNpZmljYXRpb24sIGhvd2V2ZXIsIHNvbWUgSkFYLVJQQyAxLjEgY29tcGxpYW50IHRvb2xzIG1heSBub3QgYWxsb3cgb3ZlcmxvYWRlZCBtZXRob2RzIG9yIG1heSBnZW5lcmF0ZSBXU0RMIHdpdGggb3ZlcmxvYWRlZCBvcGVyYXRpb25zIGFzIGNvbnRyYXJ5IHRvIHJ1bGUgUjIzMDQgb2YgdGhlIFdTLUkgQmFzaWMgUHJvZmlsZS4KLU1TR19KQVhSUEMxMV9SVUxFXzAwMDQ9VGhlIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uIGNsYXNzICJ7MH0iIGRvZXMgbm90IGhhdmUgYSBwdWJsaWMgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGNvcnJlc3BvbmRpbmcgaW4gbnVtYmVyIGFuZCB0eXBlIHRvIHRoZSBnZXR0ZXIgbWV0aG9kcyBvbiB0aGUgY2xhc3MuIENoYXB0ZXIgNS41LjUgb2YgdGhlIEpBWC1SUEMgMS4xIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgYSBzZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbiB0byBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYXMgdGhlcmUgYXJlIGdldHRlciBtZXRob2RzLCBhbmQgb2YgbWF0Y2hpbmcgZGF0YSB0eXBlcywgb3RoZXJ3aXNlIGEgSkFYLVJQQyAxLjEgY29tcGxpYW50IFdlYiBzZXJ2aWNlIGVuZ2luZSBtYXkgYmUgdW5hYmxlIHRvIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgZXhjZXB0aW9uIGR1cmluZyBkZXNlcmlhbGl6YXRpb24gb2YgYSBmYXVsdCBtZXNzYWdlLgotTVNHX0pBWFJQQzExX1JVTEVfMDAwNT1UaGUgbWV0aG9kICJ7MH0iIG9uIHRoZSBzZXJ2aWNlIGNsYXNzICJ7MX0iIHVzZXMgYSBkYXRhIHR5cGUsICJ7Mn0iLCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEpBWC1SUEMgc3BlY2lmaWNhdGlvbi4gSW5zdGFuY2VzIG9mIHRoZSB0eXBlIG1heSBub3Qgc2VyaWFsaXplIG9yIGRlc2VyaWFsaXplIGNvcnJlY3RseS4gTG9zcyBvZiBkYXRhIG9yIGNvbXBsZXRlIGZhaWx1cmUgb2YgdGhlIFdlYiBzZXJ2aWNlIG1heSByZXN1bHQuCi1NU0dfSkFYUlBDMTFfUlVMRV8wMDA2PVRoZSBmaWVsZCBvciBwcm9wZXJ0eSAiezB9IiBvbiB0aGUgdmFsdWUgdHlwZSAiezF9IiB1c2VkIHZpYSB0aGUgc2VydmljZSBjbGFzcyAiezJ9IiBoYXMgYSBkYXRhIHR5cGUsICJ7M30iLCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEpBWC1SUEMgMS4xIHNwZWNpZmljYXRpb24uIEluc3RhbmNlcyBvZiB0aGUgdHlwZSBtYXkgbm90IHNlcmlhbGl6ZSBvciBkZXNlcmlhbGl6ZSBjb3JyZWN0bHkuIExvc3Mgb2YgZGF0YSBvciBjb21wbGV0ZSBmYWlsdXJlIG9mIHRoZSBXZWIgc2VydmljZSBtYXkgcmVzdWx0LgotTVNHX0pBWFJQQzExX1JVTEVfMDAwNz1UaGUgcHJpbWl0aXZlIHR5cGUgInswfSIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgSkFYLVJQQyAxLjEgc3BlY2lmaWNhdGlvbi4gQXMgc3RhdGVkIGluIGNoYXB0ZXIgNS4xLjEgb2YgdGhlIHNwZWNpZmljYXRpb24sIHRoZSBzdXBwb3J0ZWQgcHJpbWl0aXZlIHR5cGVzIGFyZSAiYm9vbGVhbiIsICJieXRlIiwgInNob3J0IiwgImludCIsICJsb25nIiwgImZsb2F0IiBhbmQgImRvdWJsZSIuCi1NU0dfSkFYUlBDMTFfUlVMRV8wMDA4PVRoZSB3cmFwcGVyIHR5cGUgInswfSIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgSkFYLVJQQyAxLjEgc3BlY2lmaWNhdGlvbi4gQXMgc3RhdGVkIGluIGNoYXB0ZXIgNS4xLjEgb2YgdGhlIHNwZWNpZmljYXRpb24sIHRoZSBzdXBwb3J0ZWQgd3JhcHBlciB0eXBlcyBhcmUgdGhvc2UgY29ycmVzcG9uZGluZyB0byAiYm9vbGVhbiIsICJieXRlIiwgInNob3J0IiwgImludCIsICJsb25nIiwgImZsb2F0IiBhbmQgImRvdWJsZSIuCi1NU0dfSkFYUlBDMTFfUlVMRV8wMDA5PVRoZSBKYXZhIHR5cGUgInswfSIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgSkFYLVJQQyAxLjEgc3BlY2lmaWNhdGlvbi4gQXMgc3RhdGVkIGluIGNoYXB0ZXIgNS4xLjMgb2YgdGhlIHNwZWNpZmljYXRpb24sIHRoZSBzdXBwb3J0ZWQgc3RhbmRhcmQgdHlwZXMgYXJlICJqYXZhLmxhbmcuU3RyaW5nIiwgImphdmEudXRpbC5EYXRlIiwgImphdmEudXRpbC5DYWxlbmRhciIsICJqYXZhLm1hdGguQmlnSW50ZWdlciIsICJqYXZhLm1hdGguQmlnRGVjaW1hbCIsICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIiBhbmQgImphdmEubmV0LlVSSSIuCi1NU0dfSkFYUlBDMTFfUlVMRV8wMDEwPVN1cHBvcnQgZm9yIGNvbGxlY3Rpb24gYW5kIG1hcCBjbGFzc2VzIHN1Y2ggYXMgInswfSIgaXMgbm90IHJlcXVpcmVkIGJ5IEpBWC1SUEMgMS4xLiBEdWUgdG8gdGhlaXIgbm9uLXR5cGUgc2FmZSBuYXR1cmUsIGEgSkFYLVJQQyAxLjEgY29tcGxpYW50IFdlYiBzZXJ2aWNlIGVuZ2luZSBtYXkgbm90IGhhbmRsZSBjb2xsZWN0aW9ucywgb3IgbWF5IHJlcHJlc2VudCB0aGVtIGluIFdTREwgZG9jdW1lbnRzIGFuZCBTT0FQIG1lc3NhZ2VzIGluIGEgbWFubmVyIHRoYXQgaW1wYWlycyBpbnRlcm9wZXJhYmlsaXR5LiBUaGUgdXNlIG9mIGFycmF5cyBpbnN0ZWFkIG9mIGNvbGxlY3Rpb25zIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvV1NQbHVnaW5NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9XU1BsdWdpbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ODc0ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9XU1BsdWdpbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjAgICAxMzI5MDUgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkgICAgICAgICAgCi0gKiAyMDA2MDYwNyAgIDE0NTYwNCBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleSAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NQbHVnaW5NZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLldTUGx1Z2luIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdTUGx1Z2luTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9TRVJWRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQU5ZX0ZJTFRFUl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOWV9GSUxURVJfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9TRUxFQ1RJT05fVFJBTlNGT1JNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19KQVhSUEMxMV9OT1RfQ09NUExJQU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19KQVhSUEMxMV9VTlJFU09MVkVEX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19KQVhSUEMxMV9VTlJFU09MVkVEX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0pBWFJQQzExX1JVTEVfMDAwMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSkFYUlBDMTFfUlVMRV8wMDAyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19KQVhSUEMxMV9SVUxFXzAwMDM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0pBWFJQQzExX1JVTEVfMDAwNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSkFYUlBDMTFfUlVMRV8wMDA1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19KQVhSUEMxMV9SVUxFXzAwMDY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0pBWFJQQzExX1JVTEVfMDAwNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSkFYUlBDMTFfUlVMRV8wMDA4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19KQVhSUEMxMV9SVUxFXzAwMDk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0pBWFJQQzExX1JVTEVfMDAxMDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdTUGx1Z2luTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvTnVsbFN0YXR1c01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbWFuZC9OdWxsU3RhdHVzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDQ1NGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbWFuZC9OdWxsU3RhdHVzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0qIEEgTnVsbFN0YXR1c1JlbmRlcmVyIHRocm93cyBhd2F5IElTdGF0dXMgaW5mb3JtYXRpb24uCi0qLwotcHVibGljIGNsYXNzIE51bGxTdGF0dXNNb25pdG9yIGltcGxlbWVudHMgU3RhdHVzTW9uaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHJlc3VsdDsKLQotICAvKioKLSAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAqLwotICBwdWJsaWMgTnVsbFN0YXR1c01vbml0b3IgKCkgIHt9Ci0gIC8qKgotICAqIERvZXMgbm90aGluZy4KLSAgKi8KLSAgcHVibGljIGludCByZXBvcnRTdGF0dXMoSVN0YXR1cyBzdGF0dXMsIFZlY3RvciBvcHRpb25zKSB7IHJldHVybiAwOyB9Ci0gIHB1YmxpYyBib29sZWFuIHJlcG9ydFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgCi0gIHsgCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIElTdGF0dXMuRVJST1I6Ci0gICAgICBjYXNlIElTdGF0dXMuV0FSTklORzoKLSAgICAgIAkJcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAJCWJyZWFrOwotCSAgY2FzZSBJU3RhdHVzLklORk86Ci0gICAgICBkZWZhdWx0OiAvL0lTdGF0dXMuT0sKLSAgICAgIAkJcmVzdWx0ID0gdHJ1ZTsgCi0gICAgICAJCWJyZWFrOwotICAgICB9Ci0gCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgcHVibGljIHZvaWQgZHVtcFNhdmVkU3RhdHVzKCkgeyB9Ci0gIHB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKCkgCi0gIHsgCi0JcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0ICgpIHsKLSAgCQlyZXN1bHQgPSB0cnVlOwotICAJfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNzU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0qIEEgU3RhdHVzTW9uaXRvciByZXBvcnRzIElTdGF0dXMgaW5mb3JtYXRpb24gdG8gYSBkaXNwbGF5IHN5c3RlbS4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c01vbml0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiByZXBvcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gc3RhdHVzIG9iamVjdC4KLSAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlcG9ydAotICAqIElTdGF0dXMgaW5mb3JtYXRpb24gdG8gYSBnaXZlbiBkaXNwbGF5IHN5c3RlbSwKLSAgKiBzdWNoIGFzIFNXVCwgdGhlIGNvbW1hbmQgbGluZSwgb3IgYSB0cmFjZSBmaWxlLgotICAqLwotICBwdWJsaWMgaW50IHJlcG9ydFN0YXR1cyhJU3RhdHVzIHN0YXR1cywgVmVjdG9yIG9wdGlvbnMpOwotICBwdWJsaWMgYm9vbGVhbiByZXBvcnRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpOwotICBwdWJsaWMgdm9pZCBkdW1wU2F2ZWRTdGF0dXMoKTsKLSAgcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoKTsKLSAgcHVibGljIHZvaWQgcmVzZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbWFuZC9TdGF0dXNSZW5kZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmYzYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c1JlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0qIEEgU3RhdHVzUmVuZGVyZXIgcmVuZGVycyBJU3RhdHVzIGluZm9ybWF0aW9uIHRvIGEgZGlzcGxheSBzeXN0ZW0uCi0qLwotcHVibGljIGludGVyZmFjZSBTdGF0dXNSZW5kZXJlcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFJlbmRlcnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBzdGF0dXMgb2JqZWN0LgotICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVuZGVyCi0gICogSVN0YXR1cyBpbmZvcm1hdGlvbiB0byBhIGdpdmVuIGRpc3BsYXkgc3lzdGVtLAotICAqIHN1Y2ggYXMgU1dULCB0aGUgY29tbWFuZCBsaW5lLCBvciBhIHRyYWNlIGZpbGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHJlbmRlciAoIElTdGF0dXMgc3RhdHVzICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9BbnlGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0FueUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODhiYTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0FueUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuV1NQbHVnaW5NZXNzYWdlczsKLQotLyoqCi0qIFRoaXMgaXMgYSBraW5kIG9mIHtAbGluayBGaWx0ZXJ9IHRoYXQgYWNjZXB0cyBhbGwgb2JqZWN0cywKLSogYW5kIGlzIGEgc3VpdGFibGUgYmFzZSBjbGFzcyBmb3IgbmV3IDxjb2RlPkZpbHRlcnM8L2NvZGU+LgotKi8KLXB1YmxpYyBjbGFzcyBBbnlGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkFueUZpbHRlcjwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBBbnlGaWx0ZXIgKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIFdTUGx1Z2luTWVzc2FnZXMuQU5ZX0ZJTFRFUl9OQU1FOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIFdTUGx1Z2luTWVzc2FnZXMuQU5ZX0ZJTFRFUl9ERVNDOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogZGVzY3JpYmluZyB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPidzIGFzc2Vzc21lbnQgb2YKLSAgKiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKiBTZWUge0BsaW5rIEZpbHRlciNzdGF0dXNPZn0gZm9yIGdlbmVyYWwgY29tbWVudHMuCi0gICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+QW55RmlsdGVyPC9jb2RlPgotICAqIHJldHVybnMgYSBzdGF0dXMgd2l0aCBzZXZlcml0eSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPi4KLSAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gQW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfS4KLSAgKi8KLSAgcHVibGljIElTdGF0dXMgc3RhdHVzT2YgKCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssV2ViU2VydmljZVBsdWdpbi5JRCwwLCIiLG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjc3RhdHVzT2Z9IHJldHVybnMKLSAgKiBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9IHdpdGggYQotICAqIHNldmVyaXR5IG9mIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEgaGlnaGVyLXBlcmZvcm1hbmNlCi0gICogaW1wbGVtZW50YXRpb24uCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0gcmV0dXJucwotICAqIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30gd2l0aCBhCi0gICogc2V2ZXJpdHkgb2YgbGVzcyB0aGFuIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICByZXR1cm4gIXN0YXR1c09mKG9iamVjdCkubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0OWNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgY2xhc3Mgb2Ygb2JqZWN0cyB0aGF0IGZpbHRlcgotKiBvdGhlciBvYmplY3RzIGZvciBpbmNsdXNpb24gb3IgZXhjbHVzaW9uIGJ5IHNvbWUgY29uc3VtZXIuCi0qLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXIKLXsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogZGVzY3JpYmluZyB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPidzIGFzc2Vzc21lbnQgb2YKLSAgKiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKiBUaGUgc2V2ZXJpdHkgb2YgdGhlCi0gICogcmV0dXJuZWQgPGNvZGU+SVN0YXR1czwvY29kZT4gaXMgYXMgZm9sbG93czoKLSAgKiA8dWw+Ci0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNPS30KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBhY2NlcHRzIHRoZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogd2l0aCBubyBmdXJ0aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgY2FsbGVyIChtZWFuaW5nIHRoZQotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRNZXNzYWdlfSBhbmQKLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjZ2V0RXhjZXB0aW9ufSBtZXRob2RzCi0gICogYXJlIGlnbm9yZWQpLgotICAqIDxsaT4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjSU5GT30KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBhY2NlcHRzIHRoZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNXQVJOSU5HfQotICAqIGlmIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+IGFjY2VwdHMgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNFUlJPUn0KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBkb2VzIG5vdCBhY2NlcHQgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPC91bD4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gQW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApOwotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LiBUaGlzIG1ldGhvZAotICAqIG11c3QgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0KLSAgKiByZXR1cm5zIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggYSBzZXZlcml0eSBvZgotICAqIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzICggT2JqZWN0IG9iamVjdCApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSVByb2plY3RUb1N0cmluZ1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9JUHJvamVjdFRvU3RyaW5nVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlYzU1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9JUHJvamVjdFRvU3RyaW5nVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotCi0vKioKLSAqIFRyYW5zZnJvbXMgYSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2plY3QgdG8gamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgSVByb2plY3RUb1N0cmluZ1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCQotCSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotCSAgewotCSAgCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpdmFsdWU7Ci0JICAgIHJldHVybiBwcm9qZWN0LmdldE5hbWUoKTsKLQkgIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmY3YmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjIgICAxMjU1NzQgemluYUBjYS5pYm0uY29tIC0gWmluYSBNb3N0YWZpYQotICogMjAwNjAyMjIgICAyMjU1NzQgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgOCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICovCi1wdWJsaWMgY2xhc3MgSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5IHsKLQkKLSAJCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTRExVUkkoU2VydmljZUltcGwgc2VydmljZUltcGwpCi0gIHsKLSAgCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IHNlcnZpY2VJbXBsLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgCVN0cmluZyBsb2NhdGlvbiA9IGRlZmluaXRpb24uZ2V0TG9jYXRpb24oKTsKLSAgCQotICAJcmV0dXJuIGxvY2F0aW9uOwotICB9Ci0gICAKLSAgLy9oYXMgdG8gYmUgdW5kZXIgdGhlIHdlYmNvbnRlbnQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX01PRFVMRSA9ICJlamJNb2R1bGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfTU9EVUxFID0gImFwcENsaWVudE1vZHVsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEUgPSAiV2ViQ29udGVudCI7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NETFVSSShTZXJ2aWNlUmVmIHNlcnZpY2VJbXBsKQotICB7Ci0gIAkgU3RyaW5nIG1vZHVsZVJvb3QgPSBudWxsOwotCSBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2VJbXBsKTsKLQkgaWYoSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KHByb2plY3QpKQotCSB7Ci0JICAgbW9kdWxlUm9vdCA9IFdFQl9NT0RVTEU7Ci0JIH0KLSAgICAgZWxzZSBpZiAoSjJFRVV0aWxzLmlzRUpCQ29tcG9uZW50KHByb2plY3QpKQotCSB7Ci0JICAgbW9kdWxlUm9vdCA9IEVKQl9NT0RVTEU7Ci0JIH0KLQkgZWxzZSBpZiAoSjJFRVV0aWxzLmlzQXBwQ2xpZW50Q29tcG9uZW50KHByb2plY3QpKQotCSB7Ci0JICAgbW9kdWxlUm9vdCA9IEFQUENMSUVOVF9NT0RVTEU7Ci0JIH0KLQkgSVBhdGggcGF0aCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCSBwYXRoID0gcGF0aC5hcHBlbmQobW9kdWxlUm9vdCkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkgcGF0aCA9IHBhdGguYXBwZW5kKHNlcnZpY2VJbXBsLmdldFdzZGxGaWxlKCkpOwotCSBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoLnRvU3RyaW5nKCkpOwotCSB0cnl7Ci0JICAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLQkgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0JIH1jYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7cmV0dXJuIG51bGw7fQotCSAKLSAgCi0JICAKLQkKLSB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFdTRExSZXNvdXJjZUltcGwgd3NkbFJJKQotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUkkuZ2V0RGVmaW5pdGlvbigpOwotICAJU3RyaW5nIGxvY2F0aW9uID0gZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpOwotICAJCi0gIAlyZXR1cm4gbG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTSUxQYXRoKFdTRExSZXNvdXJjZUltcGwgd3NkbFJJKQotICB7Ci0gIAlyZXR1cm4gY29udmVydFRvUmVsYXRpdmUoZ2V0V1NETFVSSSh3c2RsUkkpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NJTFBhdGgoU2VydmljZVJlZiBzZXJ2aWNlSW1wbCkKLSAgewotICAJcmV0dXJuIGNvbnZlcnRUb1JlbGF0aXZlKGdldFdTRExVUkkoc2VydmljZUltcGwpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NJTFBhdGgoU2VydmljZUltcGwgc2VydmljZUltcGwpCi0gIHsKLSAgCXJldHVybiBjb252ZXJ0VG9SZWxhdGl2ZShnZXRXU0RMVVJJKHNlcnZpY2VJbXBsKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEU9ImZpbGU6LyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEVMPSJmaWxlOiI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZWxhdGl2ZShTdHJpbmcgdXJpKQotICB7Ci0gIAkvL3JlbW92ZSBmaWxlOgotICAJU3RyaW5nIHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICByb290ID0gRklMRSArIHJvb3Q7Ci0gIAlTdHJpbmcgcm9vdEwgPSBGSUxFTCArIHJvb3Q7Ci0gICAgaWYodXJpLnN0YXJ0c1dpdGgocm9vdCkgfHwgdXJpLnN0YXJ0c1dpdGgocm9vdEwpKXsKLSAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKHJvb3QubGVuZ3RoKCkpOyAgCQotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KMkVFVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTEzZDczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMDQgIDEyNDE0MyAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lciAgICAgCi0gKiAyMDA2MDMyOSAgIDEyODA2OSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNTAzICAgMTI2ODE5IHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA1MjQgICAxMzExMzIgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBzb21lIHVzZWZ1bCBKMkVFIHV0aWxpdGllcyBmb3IgV2ViIHNlcnZpY2VzIGludGVybmFsIHVzZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEoyRUVVdGlscyB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0VCID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFSkIgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFQUENMSUVOVCA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRUFSID0gODsJCi0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBJVmlydHVhbENvbXBvbmVudAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0VmlydHVhbENvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0KXsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBnZXRWaXJ0dWFsQ29tcG9uZW50KFN0cmluZyBwcm9qZWN0TmFtZSl7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAocHJvamVjdE5hbWUhPW51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICkKLSAgICAgIHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCX0KLQkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEoyRUUgdmVyc2lvbgotCSAqIEBwYXJhbSBwIHByb2plY3QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEoyRUVWZXJzaW9uKElQcm9qZWN0IHApewotCQkKLQkJU3RyaW5nIHZlciA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihwKTsKLQkJcmV0dXJuIEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHZlcik7Ci0KLQkJLyoKLQkJaW50IGoyZWVWZXIgPSAtMTsKLQkJdHJ5IHsKLSAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHApOwotICAgICAgICAgIGlmICh2YyE9bnVsbCl7Ci0gICAgICAgICAgICBqMmVlVmVyID0gZ2V0SjJFRVZlcnNpb24odmMpOwotICAgICAgICAgIH0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy9oYW5kbGUgZXhjZXB0aW9uCi0JCX0KLQkJcmV0dXJuIGoyZWVWZXI7Ci0JCSovCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEoyRUVWZXJzaW9uKElWaXJ0dWFsQ29tcG9uZW50IGNoKXsKLSAgICAgIGludCBqMmVlVmVyID0gLTE7Ci0gICAgICAvL2NoZWNrIHR5cGUKLSAgICAgIGlmIChjaCE9bnVsbCl7Ci0gICAgCSAgSVByb2plY3QgcHJvamVjdCA9IGNoLmdldFByb2plY3QoKTsKLSAgICAJICBqMmVlVmVyID0gZ2V0SjJFRVZlcnNpb24ocHJvamVjdCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qICBVc2UgbmV3IEFQSSBwcm92aWRlZCBieSBKMkVFIAotICAgICAgaWYgKGNoIT1udWxsKSB7Ci0gICAgICAgIGlmIChpc1dlYkNvbXBvbmVudChjaCkpCi0gICAgICAgICAgajJlZVZlciA9IGdldFdlYkNvbXBvbmVudEoyRUVWZXJzaW9uKGNoKTsKLSAgICAgICAgZWxzZSBpZiAoaXNBcHBDbGllbnRDb21wb25lbnQoY2gpKQotICAgICAgICAgIGoyZWVWZXIgPSBnZXRBcHBDbGllbnRDb21wb25lbnRKMkVFVmVyc2lvbihjaCk7Ci0gICAgICAgIGVsc2UgaWYgKGlzRUpCQ29tcG9uZW50KGNoKSkKLSAgICAgICAgICBqMmVlVmVyID0gZ2V0RUpCQ29tcG9uZW50SjJFRVZlcnNpb24oY2gpOwotICAgICAgICBlbHNlIGlmIChpc0VBUkNvbXBvbmVudChjaCkpCi0gICAgICAgICAgajJlZVZlciA9IGdldEVBUkNvbXBvbmVudEoyRUVWZXJzaW9uKGNoKTsKLSAgICAgIH0KLSAgICAgICovCi0gICAgICAKLSAgICAgIHJldHVybiBqMmVlVmVyOyAKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKMkVFVmVyc2lvbgotCSAqIEBwYXJhbSBwIElQcm9qZWN0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbkFzU3RyaW5nKElQcm9qZWN0IHApewotCQkKLQkJU3RyaW5nIHZlciA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihwKTsKLQkJcmV0dXJuICB2ZXIgIT0gbnVsbCA/IHZlciA6IG51bGw7Ci0JCSAKLQkJLyoKLQkJaW50IGoyZWVWZXIgPSBnZXRKMkVFVmVyc2lvbihwKTsKLQkJaWYgKGoyZWVWZXIhPS0xKXsKLQkJCXJldHVybiBKMkVFVmVyc2lvblV0aWwuZ2V0SjJFRVRleHRWZXJzaW9uKGoyZWVWZXIpOwotCQl9Ci0JCWVsc2UgCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCSovCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRBbGxDb21wb25lbnRzKCl7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RzW2ldKTsKLSAgICAgICAgICBpZih2YyAhPSBudWxsKQotICAgICAgICAJICB2LmFkZCh2Yyk7Ci0gICAgICAgICAgfQotCi0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSl2LnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50WzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIEVBUiBjb21wb25lbnRzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIElWaXJ0dWFsQ29tcG9uZW50W107IGVtcHR5IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0QWxsRUFSQ29tcG9uZW50cygpIHsKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJVmlydHVhbENvbXBvbmVudFtdIGNvbXBvbmVudHMgPSBnZXRFQVJDb21wb25lbnRzRnJvbVByb2plY3QocHJvamVjdHNbaV0pOwotCQkJCWZvciAoaW50IGo9MDsgajxjb21wb25lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChjb21wb25lbnRzW2pdIT1udWxsKQotCQkJCQkJdi5hZGQoY29tcG9uZW50c1tqXSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQkJfQotCi0JCX0KLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKXYudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0QWxsV2ViQ29tcG9uZW50cygpewotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gY29tcG9uZW50cyA9IGdldFdlYkNvbXBvbmVudHMocHJvamVjdHNbaV0pOwotCQkJCWZvciAoaW50IGo9MDsgajxjb21wb25lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChjb21wb25lbnRzW2pdIT1udWxsKQotCQkJCQkJdi5hZGQoY29tcG9uZW50c1tqXSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQkJfQotCi0JCX0KLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKXYudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwkJCi0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRBbGxFSkJDb21wb25lbnRzKCl7Ci0gICAgICAgIExpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzID0gZ2V0RUpCQ29tcG9uZW50cyhwcm9qZWN0c1tpXSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPGNvbXBvbmVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHNbal0hPW51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB2LmFkZChjb21wb25lbnRzW2pdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgLy9oYW5kbGUgZXhjZXB0aW9uCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pdi50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7ICAgICAgICAKLSAgICB9ICAgIAotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEVBUiBjb21wb25lbnRzIGluIGEgZ2l2ZW4gSVByb2plY3QKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gZW1wdHkgaWYgbm8gRUFSIGNvbXBvbmVudHM7IG11c3Qgbm90IHJldHVybiBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldEVBUkNvbXBvbmVudHNGcm9tUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KXsKLQkJLy9nZXQgYWxsIGNvbXBvbmVudHMgaW4gdGhlIHByb2plY3QKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCXRyeSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCAmJiBpc0VBUkNvbXBvbmVudChjb21wb25lbnQpKXsKLQkJCQl2LmFkZChjb21wb25lbnQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkvL2hhbmRsZSBleGNlcHRpb24KLQkJfQotCQkKLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKXYudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIFdlYiBjb21wb25lbnRzIGluIGEgcHJvamVjdAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBlbXB0eSBhcnJheSBpZiBubyB3ZWIgY29tcG9uZW50czsgbXVzdCBub3QgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0V2ViQ29tcG9uZW50cyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJCi0JCS8vZ2V0IGFsbCBjb21wb25lbnRzIGluIHRoZSBwcm9qZWN0Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCi0JCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGlzV2ViQ29tcG9uZW50KGNvbXBvbmVudCkpewotCQkJCQl2LmFkZChjb21wb25lbnQpOwotCQkJCX0JCQotCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pdi50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7Ci0JfSAKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFdlYkNvbXBvbmVudE5hbWVzKElQcm9qZWN0IHByb2plY3QpewotCQlJVmlydHVhbENvbXBvbmVudFtdIHZjcyA9IGdldFdlYkNvbXBvbmVudHMocHJvamVjdCk7Ci0JCXJldHVybiB0b0NvbXBvbmVudE5hbWVzQXJyYXkodmNzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFQVJDb21wb25lbnROYW1lcyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSB2Y3MgPSBnZXRFQVJDb21wb25lbnRzRnJvbVByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiB0b0NvbXBvbmVudE5hbWVzQXJyYXkodmNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgY29tcG9uZW50cyBvZiB0eXBlLCBjb21wb25lbnRUeXBlIGluIHRoZSBwcm9qZWN0LgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbXBvbmVudFR5cGUgaS5lLiBKMkVFVXRpbHMuV0VCCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRDb21wb25lbnRzQnlUeXBlKElQcm9qZWN0IHByb2plY3QsIGludCBjb21wb25lbnRUeXBlKXsKLQkJCi0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCAoV0VCICYgY29tcG9uZW50VHlwZSk9PVdFQiApewotCQkJSVZpcnR1YWxDb21wb25lbnRbXSB3ZWJWQyA9IGdldFdlYkNvbXBvbmVudHMocHJvamVjdCk7Ci0JCQlhZGRUb0FycmF5TGlzdEhlbHBlcih3ZWJWQywgdik7Ci0JCX0KLQkJaWYgKCAoRUpCICYgY29tcG9uZW50VHlwZSk9PUVKQiApewotCQkJSVZpcnR1YWxDb21wb25lbnRbXSBlamJWQyA9IGdldEVKQkNvbXBvbmVudHMocHJvamVjdCk7Ci0JCQlhZGRUb0FycmF5TGlzdEhlbHBlcihlamJWQywgdik7Ci0JCX0KLQkJaWYgKCAoQVBQQ0xJRU5UICYgY29tcG9uZW50VHlwZSk9PUFQUENMSUVOVCApIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gYXBwQ2xpZW50VkMgPSBnZXRBcHBDbGllbnRDb21wb25lbnRzKHByb2plY3QpOwotCQkJYWRkVG9BcnJheUxpc3RIZWxwZXIoYXBwQ2xpZW50VkMsIHYpOwotCQl9Ci0JCWlmICggKEVBUiAmIGNvbXBvbmVudFR5cGUpPT1FQVIgKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudFtdIGVhclZDID0gZ2V0RUFSQ29tcG9uZW50c0Zyb21Qcm9qZWN0KHByb2plY3QpOwotCQkJYWRkVG9BcnJheUxpc3RIZWxwZXIoZWFyVkMsIHYpOwotCQl9Ci0JCQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pdi50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgY29tcG9uZW50cyBvZiB0eXBlLCBjb21wb25lbnRUeXBlIGluIHRoZSBwcm9qZWN0LgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbXBvbmVudFR5cGVJZCBhcyBkZWZpbmVkIGluIElNb2R1bGVDb25zdGFudHMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRDb21wb25lbnRzQnlUeXBlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wb25lbnRUeXBlSWQpewotCQkKLQkJLy9nZXQgYWxsIGNvbXBvbmVudHMgaW4gdGhlIHByb2plY3Qgb2YgdHlwZSBjb21wb25lbnRUeXBlSWQKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCi0JCQlJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwkKLQkJCWlmICggdmMgIT0gbnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc1Byb2plY3RPZlR5cGUocHJvamVjdCxjb21wb25lbnRUeXBlSWQpKQotCQkJewotCQkJCXYuYWRkKHZjKTsKLQkJCX0KLQkJCS8vaWYgKGlzV2ViQ29tcG9uZW50KHByb2plY3QsIGNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpKSl7Ci0JCQkJLy92LmFkZChjb21wb25lbnRzW2ldKTsKLQkJCS8vfQkJCi0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy9oYW5kbGUgZXhjZXB0aW9uCi0JCX0KLQkJCi0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSl2LnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50WzBdKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9qZWN0c0NvbnRhaW5pbmdDb21wb25lbnRPZlR5cGUoU3RyaW5nIGNvbXBvbmVudFR5cGVJZCkKLQl7Ci0JICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOyAKLQkgICAgSVZpcnR1YWxDb21wb25lbnRbXSBjb21wcyA9IGdldEFsbENvbXBvbmVudHMoKTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzUHJvamVjdE9mVHlwZShjb21wc1tpXS5nZXRQcm9qZWN0KCksY29tcG9uZW50VHlwZUlkKSkKLQkJCXsKLQkJCQkvL0FkZCB0aGUgcHJvamVjdCBuYW1lIHRvIHRoZSB2ZWN0b3IgaWYgaXQgaGFzIG5vdCBiZWVuIGFkZGVkIGFscmVhZHkKLQkJCQlTdHJpbmcgbmFtZSA9IGNvbXBzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKCF2LmNvbnRhaW5zKG5hbWUpKQotCQkJCXsKLQkJCQkJdi5hZGQobmFtZSk7CQotCQkJCX0JCSAgICAgICAgCQkJCi0JCQl9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoU3RyaW5nW10pdi50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLSAgIAotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgZm9yIGdldENvbXBvbmVudHNCeVR5cGUKLQkgKiBAcGFyYW0gdmNzCi0JICogQHBhcmFtIHZlY3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvQXJyYXlMaXN0SGVscGVyKElWaXJ0dWFsQ29tcG9uZW50W10gdmNzLCBMaXN0IGFsKXsKLQkJZm9yIChpbnQgaT0wO2k8dmNzLmxlbmd0aDtpKyspewotCQkJYWwuYWRkKHZjc1tpXSk7Ci0JCX0JCQotCX0KLQotCQotCS8qKgotCSAqIEVzc2VudGlhbGx5LCByZXR1cm5zIGFsbCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRBbGxGbGV4aWJsZVByb2plY3RzKCl7Ci0KLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHMoKTsKLQkJCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDtpKyspIHsKLQkJCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3RzW2ldKSE9bnVsbCl7Ci0JCQkJCXYuYWRkKHByb2plY3RzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpewotCQl9Ci0KLQkJcmV0dXJuIChJUHJvamVjdFtdKXYudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCX0KLQkKLQkKLQkvKioKLQkgKiBUcnVlIGlmIHRoZXJlIGV4aXN0cyBhIHVuZGVybHlpbmcgcmVzb3VyY2UgYmFja2luZyB1cCB0aGUgY29tcG9uZW50IGFuZCBwcm9qZWN0IAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGlzdHMoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZSl7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAocHJvamVjdE5hbWUhPW51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICkgewotCQkgIHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gZXhpc3RzKHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBUcnVlIGlmIHRoZXJlIGV4aXN0cyBhIHVuZGVybHlpbmcgcmVzb3VyY2UgYmFja2luZyB1cCB0aGUgY29tcG9uZW50IGFuZCBwcm9qZWN0Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGV4aXN0cyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJaWYgKHByb2plY3QhPW51bGwpIHsKLSAgICAgICAgICAgIGlmICghcHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0JCQlJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJcmV0dXJuIHZjLmV4aXN0cygpOwotCQl9Ci0JCWVsc2UgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCX0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEVBUiBjb21wb25lbnRzIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBjb21wb25lbnQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0UmVmZXJlbmNpbmdFQVJDb21wb25lbnRzKElQcm9qZWN0IHByb2plY3QpewotCQlMaXN0IGVhcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeXsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldFZDID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkKLQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gZWFyVkMgPSBnZXRBbGxFQVJDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8ZWFyVkMubGVuZ3RoO2krKykgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGVhclZDW2ldLmdldFJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBrPTA7azxyZWZzLmxlbmd0aDtrKyspIHsKLQkJCQkJaWYgKHRhcmdldFZDLmVxdWFscyhyZWZzW2tdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSkpewotCQkJCQkJZWFycy5hZGQocmVmc1trXS5nZXRFbmNsb3NpbmdDb21wb25lbnQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQl9Ci0KLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKWVhcnMudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFSkIgQ29tcG9uZW50cyByZWZlcmVuY2VkIGJ5IHRoZSBlYXIKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0UmVmZXJlbmNpbmdFSkJDb21wb25lbnRzRnJvbUVBUihJUHJvamVjdCBwcm9qZWN0KXsKLQotCQlMaXN0IGVqYkNvbXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnl7Ci0JCQlJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gdmMuZ2V0UmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaT0wO2k8cmVmcy5sZW5ndGg7aSsrKXsKLQkJCQlpZiAoaXNFSkJDb21wb25lbnQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKXsKLQkJCQkJZWpiQ29tcHMuYWRkKHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpewotCQl9Ci0JCQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pZWpiQ29tcHMudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwkJCi0JfQotCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGphcgotCSAqIEByZXR1cm4gIFZlY3RvciBvZiBiZWFuIFN0cmluZyBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRCZWFuTmFtZXMoRUpCSmFyIGphcikgewotCQkvLyBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IFN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zLgotCQkvLyBMaXN0IGNtcEJlYW5zID0gamFyLmdldEJlYW5NYW5hZ2VkQmVhbnMoKTsKLQkJLy8gTGlzdCBibXBCZWFucyA9IGphci5nZXRDb250YWluZXJNYW5hZ2VkQmVhbnMoKTsKLQkJTGlzdCBzZXNzaW9uQmVhbnMgPSBqYXIuZ2V0U2Vzc2lvbkJlYW5zKCk7Ci0KLQkJVmVjdG9yIG5hbWVzID0gbmV3IFZlY3RvcigpOwotCi0JCS8vIGdldEJlYW5OYW1lcyggbmFtZXMsIGNtcEJlYW5zICk7Ci0JCS8vIGdldEJlYW5OYW1lcyggbmFtZXMsIGJtcEJlYW5zICk7Ci0JCWdldEJlYW5OYW1lcyhuYW1lcywgc2Vzc2lvbkJlYW5zKTsKLQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWVzCi0JICogICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCB2ZWN0b3Igb2Ygc3RyaW5ncyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhZGQgYmVhbgotCSAqICAgICAgICAgICAgbmFtZXMgdG8uCi0JICogQHBhcmFtIGJlYW5zCi0JICogICAgICAgICAgICBzcGVjaWZpZXMgYSBsaXN0IG9mIGJlYW5zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QmVhbk5hbWVzKFZlY3RvciBuYW1lcywgTGlzdCBiZWFucykgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGJlYW5zLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbikgKGl0ZXJhdG9yLm5leHQoKSk7Ci0KLQkJCWlmIChiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkJU2Vzc2lvbiBzZXNzaW9uQmVhbiA9IChTZXNzaW9uKSBiZWFuOwotCi0JCQkJaWYgKHNlc3Npb25CZWFuLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUxFU1MpIHsKLQkJCQkJbmFtZXMuYWRkKGJlYW4uZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VzIGplbSBQcm9qZWN0VXRpbGl0aWVzIHRvIGdldCB0aGUgcHJvamVjdAotCSAqIEBwYXJhbSBlamIgZU9iamVjdAotCSAqIEByZXR1cm4gSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3RGcm9tRUpCKEVudGVycHJpc2VCZWFuIGVqYikgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVqYik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgSjJFRSAxLjMgRUFSIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBFQVIgY29tcG9uZW50IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldERlZmF1bHQxM0VBUkNvbXBvbmVudCgpewotCQlJVmlydHVhbENvbXBvbmVudFtdIGFsbEVBUkNvbXBvbmVudHMgPSBnZXRBbGxFQVJDb21wb25lbnRzKCk7Ci0JCWZvciAoaW50IGo9MDtqPGFsbEVBUkNvbXBvbmVudHMubGVuZ3RoO2orKyl7Ci0JCQlpbnQgajJlZVZlcnNpb24gPSBnZXRKMkVFVmVyc2lvbihhbGxFQVJDb21wb25lbnRzW2pdKTsKLQkJCWlmIChqMmVlVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkKLQkJCQkgcmV0dXJuIGFsbEVBUkNvbXBvbmVudHNbal07Ci0JCSB9CQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgSjJFRSAxLjQgRUFSIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBFQVIgY29tcG9uZW50IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldERlZmF1bHQxNEVBUkNvbXBvbmVudCgpewotCQlJVmlydHVhbENvbXBvbmVudFtdIGFsbEVBUkNvbXBvbmVudHMgPSBnZXRBbGxFQVJDb21wb25lbnRzKCk7Ci0JCWZvciAoaW50IGo9MDtqPGFsbEVBUkNvbXBvbmVudHMubGVuZ3RoO2orKyl7Ci0JCQlpbnQgajJlZVZlcnNpb24gPSBnZXRKMkVFVmVyc2lvbihhbGxFQVJDb21wb25lbnRzW2pdKTsKLQkJCWlmIChqMmVlVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCQkgcmV0dXJuIGFsbEVBUkNvbXBvbmVudHNbal07Ci0JCSB9CQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgRUFSIGNvbXBvbmVudCBvZiB0aGUgSjJFRSB2ZXJzaW9uCi0JICogQHBhcmFtIHZlcnNpb25JZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldEVBUkNvbXBvbmVudG9mSjJFRVZlcnNpb24oaW50IHZlcnNpb25JZCl7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50W10gY29tcG9uZW50cyA9IGdldEFsbEVBUkNvbXBvbmVudHMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbXBvbmVudHMubGVuZ3RoOyBpKyspewotCQkJaWYgKGdldEoyRUVWZXJzaW9uKGNvbXBvbmVudHNbaV0pID09IHZlcnNpb25JZCkKLQkJCQlyZXR1cm4gY29tcG9uZW50c1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gajJlZVZlcnNpb25JbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWxGcm9tSjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uSW50KSB7Ci0JCWlmIChqMmVlVmVyc2lvbkludCA9PSBudWxsIHx8IGoyZWVWZXJzaW9uSW50Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7Ci0KLQkJaW50IGoyZWVWZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChqMmVlVmVyc2lvbkludCk7Ci0JCXN3aXRjaCAoajJlZVZlcnNpb24pIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVDsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAiIjsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVWZXJzaW9uRnJvbUxhYmVsKFN0cmluZyBqMmVlTGFiZWwpIHsKLQkJU3RyaW5nIGoyZWUxMlN0cmluZyA9IFN0cmluZy52YWx1ZU9mKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLQkJU3RyaW5nIGoyZWUxM1N0cmluZyA9IFN0cmluZy52YWx1ZU9mKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJU3RyaW5nIGoyZWUxNFN0cmluZyA9IFN0cmluZy52YWx1ZU9mKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJaWYgKGoyZWVMYWJlbC5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVCkpCi0JCQlyZXR1cm4gajJlZTEyU3RyaW5nOwotCi0JCWlmIChqMmVlTGFiZWwuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQpKQotCQkJcmV0dXJuIGoyZWUxM1N0cmluZzsKLQotCQlpZiAoajJlZUxhYmVsLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkKLQkJCXJldHVybiBqMmVlMTRTdHJpbmc7Ci0KLQkJcmV0dXJuICIiOwotCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgU3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiBKMkVFIHZlcnNpb25zCi0JICogQHBhcmFtIGFWZXJzaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVJbnRWZXJzaW9uQXNTdHJpbmcoU3RyaW5nIGFWZXJzaW9uKSB7Ci0JCWlmIChhVmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVCkpCi0JCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpLnRvU3RyaW5nKCk7Ci0JCWlmIChhVmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpCi0JCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpLnRvU3RyaW5nKCk7Ci0JCWlmIChhVmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVCkpCi0JCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpLnRvU3RyaW5nKCk7CQkKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpLnRvU3RyaW5nKCk7Ci0JfQkKLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgIC8vIHVzZSBnZXRBTExFQVJDb21wb25lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEVBUlByb2plY3RzKCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0vLwkJCQlpZiAocHJvamVjdHNbaV0uaGFzTmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkgewotCQkJCWlmIChSZXNvdXJjZVV0aWxzLmlzRUFSUHJvamVjdChwcm9qZWN0c1tpXSkpIHsKLQkJCQkJdi5hZGQocHJvamVjdHNbaV0pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkvL2hhbmRsZSBleGNlcHRpb24KLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIChJUHJvamVjdFtdKXYudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBFQVIgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QgYW5kIHNlcnZlcgotCSAqIEBwYXJhbSBzZXJ2aWNlUHJvamVjdAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgIC8vIHRvIGJlIHNpbXBsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldERlZmF1bHRFQVJQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0LCBJU2VydmVyIHNlcnZlcikgewotCi0JCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBudWxsOwotCQlJUHJvamVjdCBlYXIgPSBudWxsOwotCi0JCWlmIChzZXJ2aWNlUHJvamVjdCAhPSBudWxsICYmIHNlcnZpY2VQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCi0JCQkJYm9vbGVhbiBpc1dlYkVKQk9yQXBwQ2xpZW50ID0gUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3Qoc2VydmljZVByb2plY3QpIC8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpCi0JCQkJCQl8fCAgUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3Qoc2VydmljZVByb2plY3QpIC8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKQotCQkJCQkJfHwgIFJlc291cmNlVXRpbHMuaXNBcHBDbGllbnRQcm9qZWN0KHNlcnZpY2VQcm9qZWN0KTsvL3NlcnZpY2VQcm9qZWN0Lmhhc05hdHVyZShJQXBwbGljYXRpb25DbGllbnROYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKTsKLQkJCQlpZiAoIWlzV2ViRUpCT3JBcHBDbGllbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJSVByb2plY3RbXSBlYXJzID0gZ2V0RUFSUHJvamVjdHMoKTsKLQotCQkJCS8vIHNlcGFyYXRlIEVBUnMgd2hpY2ggYXJlIGFscmVhZHkgZGVwbG95ZWQgdG8gdGhlIGV4aXN0aW5nCi0JCQkJLy8gc2VydmVyCi0JCQkJaWYgKGVhcnMgIT0gbnVsbCAmJiBlYXJzLmxlbmd0aCA+PSAxKSB7Ci0JCQkJCUFycmF5TGlzdCBwcmVmZXJyZWRFQVJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlBcnJheUxpc3Qgc2Vjb25kYXJ5RUFSTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQllYXIgPSBlYXJzW2ldOwotCQkJCQkJSU1vZHVsZSBtb2R1bGUgPSBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXIpOwotCQkJCQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsCi0JCQkJCQkJCQl8fCBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwKLQkJCQkJCQkJCQkJbW9kdWxlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKSkgewotCQkJCQkJCQlwcmVmZXJyZWRFQVJMaXN0LmFkZChlYXIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNlY29uZGFyeUVBUkxpc3QuYWRkKGVhcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGFkZCBzZWNvbmRhcnlFQVJMaXN0IGl0ZW1zIHRvIGVuZCBvZiBwcmltYXJ5IGxpc3QKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWNvbmRhcnlFQVJMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCQlwcmVmZXJyZWRFQVJMaXN0LmFkZChzZWNvbmRhcnlFQVJMaXN0LmdldChqKSk7Ci0JCQkJCX0KLQkJCQkJLy8gdG9BcnJheQotCQkJCQlpZiAocHJlZmVycmVkRUFSTGlzdCAhPSBudWxsKSB7Ci0JCQkJCQllYXJQcm9qZWN0cyA9IChJUHJvamVjdFtdKSBwcmVmZXJyZWRFQVJMaXN0LnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjZSkgewotCQkJCUlMb2cgbG9nID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VMb2coKTsKLQkJCQlsb2cubG9nKElMb2cuRVJST1IsIDUwMzksIEoyRUVVdGlscy5jbGFzcywgImdldEVBUlByb2plY3RzIiwgY2UpOwotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVhclByb2plY3RzWzBdOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEVKQiBDb21wb25lbnRzIGluIHRoZSBwcm9qZWN0Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldEVKQkNvbXBvbmVudHMoSVByb2plY3QgcHJvamVjdCl7Ci0JCQotCQkvL2dldCBhbGwgY29tcG9uZW50cyBpbiB0aGUgcHJvamVjdAotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQl0cnkgewotCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGlzRUpCQ29tcG9uZW50KGNvbXBvbmVudCkpewotCQkJCXYuYWRkKGNvbXBvbmVudCk7Ci0JCQl9CQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkvL2hhbmRsZSBleGNlcHRpb24KLQkJfQotCQkKLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKXYudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwotCX0gCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgQXBwbGljYXRpb24gQ2xpZW50IGNvbXBvbmVudHMgaW4gYSBwcm9qZWN0LgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRBcHBDbGllbnRDb21wb25lbnRzKElQcm9qZWN0IHByb2plY3QpewotCQkKLQkJLy9nZXQgYWxsIGNvbXBvbmVudHMgaW4gdGhlIHByb2plY3QKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkKLQkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgaXNBcHBDbGllbnRDb21wb25lbnQoY29tcG9uZW50KSl7Ci0JCQkJCXYuYWRkKGNvbXBvbmVudCk7Ci0JCQkJfQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy9oYW5kbGUgZXhjZXB0aW9uCi0JCX0KLQkJCi0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSl2LnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50WzBdKTsKLQl9IAkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0UmVmZXJlbmNpbmdFSkIyMENvbXBvbmVudHNGcm9tRUFSKElQcm9qZWN0IHByb2plY3QpewotCQkgCi0JCUxpc3QgZWpiQ29tcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeXsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSB2Yy5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8cmVmcy5sZW5ndGg7aSsrKSB7Ci0JCQkJaWYgKGlzRUpCMjBDb21wb25lbnQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKQotCQkJCQllamJDb21wcy5hZGQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCX0KLQkJCi0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSllamJDb21wcy50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7CQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gY29tYmluZSB0d28gSVByb2plY3RbXQotCSAqIEBwYXJhbSBwcm9qZWN0QXJyYXkxCi0JICogQHBhcmFtIHByb2plY3RBcnJheTIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGNvbWJpbmVQcm9qZWN0QXJyYXlzKElQcm9qZWN0W10gcHJvamVjdEFycmF5MSwKLQkJCUlQcm9qZWN0W10gcHJvamVjdEFycmF5MikgewotCi0JCS8vIGNoZWNrIGlmIGVpdGhlciBvciBib3RoIGFycmF5cyBhcmUgbnVsbC4KLQkJaWYgKHByb2plY3RBcnJheTEgPT0gbnVsbCAmJiBwcm9qZWN0QXJyYXkyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAocHJvamVjdEFycmF5MSAhPSBudWxsICYmIHByb2plY3RBcnJheTIgPT0gbnVsbCkKLQkJCXJldHVybiBwcm9qZWN0QXJyYXkxOwotCQllbHNlIGlmIChwcm9qZWN0QXJyYXkxID09IG51bGwgJiYgcHJvamVjdEFycmF5MiAhPSBudWxsKQotCQkJcmV0dXJuIHByb2plY3RBcnJheTI7Ci0KLQkJSVByb2plY3RbXSBjb21iaW5lZFByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RBcnJheTEubGVuZ3RoCi0JCQkJKyBwcm9qZWN0QXJyYXkyLmxlbmd0aF07Ci0KLQkJU3lzdGVtLmFycmF5Y29weShwcm9qZWN0QXJyYXkxLCAwLCBjb21iaW5lZFByb2plY3RzLCAwLAotCQkJCXByb2plY3RBcnJheTEubGVuZ3RoKTsKLQkJaWYgKHByb2plY3RBcnJheTIubGVuZ3RoID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShwcm9qZWN0QXJyYXkyLCAwLCBjb21iaW5lZFByb2plY3RzLAotCQkJCQlwcm9qZWN0QXJyYXkxLmxlbmd0aCwgcHJvamVjdEFycmF5Mi5sZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbWJpbmVkUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldFJlZmVyZW5jaW5nV2ViQ29tcG9uZW50c0Zyb21FQVIoSVByb2plY3QgcHJvamVjdCl7Ci0JCUxpc3Qgd2ViQ29tcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeXsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSB2Yy5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8cmVmcy5sZW5ndGg7aSsrKSB7Ci0JCQkJaWYgKGlzV2ViQ29tcG9uZW50KHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKSkKLQkJCQkJd2ViQ29tcHMuYWRkKHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCX0JCQkKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSl7Ci0JCX0KLQkJCi0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSl3ZWJDb21wcy50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7CQotCX0KLQkKLQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlamJDb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCMjBDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgZWpiQ29tcG9uZW50KXsKLQkJcmV0dXJuIGlzRUpCMjBDb21wb25lbnQoZWpiQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VKQjIwQ29tcG9uZW50KElQcm9qZWN0IHByb2plY3QpewotCQlib29sZWFuIGlzRUpCID0gZmFsc2U7Ci0JCXRyeSB7Ci0gICAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkgIGlmIChFSkJBcnRpZmFjdEVkaXQuaXNWYWxpZEVKQk1vZHVsZSh2YykpIHsKLQkJCSAgRUpCQXJ0aWZhY3RFZGl0ICBlamJFZGl0ID0gbnVsbDsKLQkJCSAgdHJ5IHsKLQkJCQkgIGVqYkVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZCh2Yyk7Ci0JCQkJICBFSkJSZXNvdXJjZSBlamJSZXMgPSBlamJFZGl0LmdldEVKQkphclhtaVJlc291cmNlKCk7Ci0JCQkJICBpZiAoZWpiUmVzLmdldE1vZHVsZVZlcnNpb25JRCgpPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJCQkgIHJldHVybiB0cnVlOwotCQkJCSAgfQotCQkJICB9Ci0JCQkgIGZpbmFsbHkgewotCQkJCSAgaWYgKGVqYkVkaXQhPW51bGwpCi0JCQkJCSAgZWpiRWRpdC5kaXNwb3NlKCk7Ci0JCQkgIH0KLQkJICB9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGV4KXt9Ci0JCQotCQlyZXR1cm4gaXNFSkI7CQkJCi0JfQotCi0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBjb21wb25lbnQgYXQgY29tcE5hbWUgaXMgcmVmZXJlbmNlZCBieSB0aGUgZWFyIGF0IGVhckNvbXBOYW1lCi0JICogQHBhcmFtIGVhclByb2plY3QKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb21wb25lbnRBc3NvY2lhdGVkKElQcm9qZWN0IGVhclByb2plY3QsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmMxID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZjMiA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlyZXR1cm4gaXNDb21wb25lbnRBc3NvY2lhdGVkKHZjMSwgdmMyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBjb21wb25lbnQgaXMgcmVmZXJlbmNlZCBieSB0aGUgZWFyCi0JICogQHBhcmFtIGVhciAKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21wb25lbnRBc3NvY2lhdGVkKElWaXJ0dWFsQ29tcG9uZW50IGVhciwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KXsKLQkJYm9vbGVhbiBpc0Fzc29jaWF0ZWQgPSBmYWxzZTsKLQkJCi0JCS8vIE5vdGU6IG5vdCBpbXBsZW1lbnRlZCBieSBKMkVFIHlldC4uIHRvIGJlIHVzZWQgbGF0ZXIuCi0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gY29tcFJlZnMgPSBlYXIuZ2V0UmVmZXJlbmNlcygpOwotCQlpZiAoY29tcFJlZnMhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPTA7aTxjb21wUmVmcy5sZW5ndGg7aSsrKXsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZSB2cmVmID0gY29tcFJlZnNbaV07Ci0JCQkJaWYgKGNvbXBvbmVudC5lcXVhbHModnJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKQotCQkJCQkJaXNBc3NvY2lhdGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNBc3NvY2lhdGVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGVhclByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzb2NpYXRlQ29tcG9uZW50VG9FQVIoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3QgZWFyUHJvamVjdCkgewotCQkKLSAgICAgICAgSURhdGFNb2RlbCBhZGRDb21wb25lbnRUb0VBUkRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0gICAgICAgIGFkZENvbXBvbmVudFRvRUFSRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wKTsKLSAgICAgICAgTGlzdCBtb2RMaXN0ID0gKExpc3QpIGFkZENvbXBvbmVudFRvRUFSRGF0YU1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotICAgICAgICBJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0gICAgICAgIG1vZExpc3QuYWRkKHRhcmdldENvbXApOwotCQlhZGRDb21wb25lbnRUb0VBUkRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RMaXN0KTsKLSAgICAgICAgCi0JCXRyeSB7Ci0JCQlhZGRDb21wb25lbnRUb0VBUkRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCX0KLSAgICAgICAgICAgIAotCX0KLSAgICAKLSAgICAvKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBwcm9qZWN0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZWFyUHJvamVjdC4KLSAgICAgKiBAcmV0dXJucyBJU3RhdHVzIG9mIE9LIGlmIHRoZSBwcm9qZWN0IGlzIGEgV2ViIHByb2plY3QsIEVKQiBwcm9qZWN0LCBvciBBcHBDbGllbnQKLSAgICAgKiBwcm9qZWN0IHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgRUFSIHByb2plY3QuIAotICAgICAqIFJldHVybnMgSVN0YXR1cyB3aXRoIGFuIEVSUk9SIHNldmVyaXR5IGlmIHRoZSBwcm9qZWN0IGlzIGEgV2ViIHByb2plY3QsIAotICAgICAqIEVKQiBwcm9qZWN0LCBvciBBcHBDbGllbnQgcHJvamVjdCB0aGF0IGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIEVBUiBwcm9qZWN0LiAKLSAgICAgKiBXaGVuIGFuIElTdGF0dXMgb2Ygc2V2ZXJpdHkgRVJST1IgaXMgcmV0dXJuZWQsIHRoZSBJU3RhdHVzJyBtZXNzYWdlIHdpbGwgY29udGFpbiB0aGUgCi0gICAgICogbG93ZXN0IEoyRUUgbGV2ZWwgdGhhdCB0aGlzIHByb2plY3QgcmVxdWlyZXMgb24gYW4gRUFSLgotICAgICAqIFJldHVybnMgYW4gSVN0YXR1cyB3aXRoIHNldmVyaXR5IE9LIGlmIHByb2plY3QgaXMgbm90IHJlY29nbml6ZWQgYXMgYSBXZWIsIEVKQiwgb3IKLSAgICAgKiBBcHBDbGllbnQgcHJvamVjdCBvciBpZiBlYXJQcm9qZWN0IGlzIG5vdCByZWNvZ25pemVkIGFzIGFuIEVBUiBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjYW5Bc3NvY2lhdGVQcm9qZWN0VG9FQVIoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3QgZWFyUHJvamVjdCkKLSAgICB7Ci0gICAgICAvL0lmIHByb2plY3QgY29udGFpbnMgdGhlIHdlYiwgZWpiLCBvciBhcHBjbGllbnQgZmFjZXQsIGFuZCBlYXJQcm9qZWN0IGNvbnRhaW5zIHRoZSAKLSAgICAgIC8vZWFyIGZhY2V0LCByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGZhY2V0IHZlcnNpb25zIGFyZSBzdWNoIHRoYXQgdGhlIHByb2plY3QKLSAgICAgIC8vY2FuIGJlIGFkZGVkIHRvIHRoZSBlYXIuICAgICAgCi0KLSAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgIGJvb2xlYW4gaXNXZWIgPSBpc1dlYkNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgIGJvb2xlYW4gaXNFSkIgPSBpc0VKQkNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgIGJvb2xlYW4gaXNBcHBDbGllbnQgPSBpc0FwcENsaWVudENvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgIGJvb2xlYW4gaXNFQVIgPSBpc0VBUkNvbXBvbmVudChlYXJQcm9qZWN0KTsKLSAgICAgIGlmICgoaXNXZWIgfHwgaXNFSkIgfHwgaXNBcHBDbGllbnQpICYmIGlzRUFSKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgIElGYWNldGVkUHJvamVjdCBmRWFyUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShlYXJQcm9qZWN0KTsKLSAgICAgICAgICAKLSAgICAgICAgICBJUHJvamVjdEZhY2V0IGVhclBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKTsKLSAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBlYXJQZnYgPSBmRWFyUHJvamVjdC5nZXRJbnN0YWxsZWRWZXJzaW9uKGVhclBmKTsKLSAgICAgICAgICBTdHJpbmcgZWFyVmVyc2lvbiA9IGVhclBmdi5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIHdlYlZlcnNpb24gPSBudWxsOwotICAgICAgICAgIFN0cmluZyBlamJWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgICBTdHJpbmcgYWNWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgIGlmIChpc1dlYikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJUHJvamVjdEZhY2V0IHdlYlBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKTsKLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHdlYlBmdiA9IGZQcm9qZWN0LmdldEluc3RhbGxlZFZlcnNpb24od2ViUGYpOwotICAgICAgICAgICAgd2ViVmVyc2lvbiA9IHdlYlBmdi5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGlzRUpCKSAgICAgICAgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXQgZWpiUGYgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSUoyRUVNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpOwotICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZWpiUGZ2ID0gZlByb2plY3QuZ2V0SW5zdGFsbGVkVmVyc2lvbihlamJQZik7Ci0gICAgICAgICAgICBlamJWZXJzaW9uID0gZWpiUGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoaXNBcHBDbGllbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgSVByb2plY3RGYWNldCBhY1BmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFKTsKLSAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGFjUGZ2ID0gZlByb2plY3QuZ2V0SW5zdGFsbGVkVmVyc2lvbihhY1BmKTsKLSAgICAgICAgICAgIGFjVmVyc2lvbiA9IGFjUGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICB9IAotICAgICAgICAgIAotICAgICAgICAgIGlmICgoaXNXZWIgJiYgd2ViVmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzJfVEVYVCkpIHx8Ci0gICAgICAgICAgICAgIChpc0VKQiAmJiBlamJWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMV9URVhUKSkgfHwKLSAgICAgICAgICAgICAgKGlzQXBwQ2xpZW50ICYmIGFjVmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVCkpCi0gICAgICAgICAgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWdyZWF0ZXJUaGFuT3JFcXVhbFRvKGVhclZlcnNpb24sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoKGlzV2ViICYmIHdlYlZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8zX1RFWFQpKSB8fAotICAgICAgICAgICAgICAoaXNFSkIgJiYgZWpiVmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzBfVEVYVCkpIHx8Ci0gICAgICAgICAgICAgIChpc0FwcENsaWVudCAmJiBhY1ZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQpKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFncmVhdGVyVGhhbk9yRXF1YWxUbyhlYXJWZXJzaW9uLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQpOwotICAgICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICAgIGVsc2UgaWYgKChpc1dlYiAmJiB3ZWJWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNF9URVhUKSkgfHwKLSAgICAgICAgICAgICAgKGlzRUpCICYmIGVqYlZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8xX1RFWFQpKSB8fAotICAgICAgICAgICAgICAoaXNBcHBDbGllbnQgJiYgYWNWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghZ3JlYXRlclRoYW5PckVxdWFsVG8oZWFyVmVyc2lvbiwgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKTsKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAvL0lmIGZhY2V0IEFQSSB0aHJvd3MgYSBDb3JlRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZSBhbiBJRmFjZXRlZFByb2plY3QgZnJvbSAKLSAgICAgICAgICAvL2FuIElQcm9qZWN0LCBhbiBPSyBTdGF0dXMgd2lsbCBiZSByZXR1cm5lZCBhbmQgY2xpZW50cyBvZiB0aGlzIHV0aWxpdHkgbWV0aG9kCi0gICAgICAgICAgLy93b24ndCByYWlzZSBhIHZhbGlkYXRpb24gZXJyb3IuCi0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLQkKLSAgICAvKgotICAgICAqIEBwYXJhbSB2ZXJzaW9uQSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZm9ybSAxLjIuMwotICAgICAqIEBwYXJhbSB2ZXJzaW9uQSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZm9ybSAxLjIuMwotICAgICAqIEByZXR1cm4gYm9vbGVhbiByZXR1cm5zIHdoZXRoZXIgdmVyc2lvbkEgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHZlcnNpb25CCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBncmVhdGVyVGhhbk9yRXF1YWxUbyhTdHJpbmcgdmVyc2lvbkEsIFN0cmluZyB2ZXJzaW9uQikKLSAgICB7Ci0gICAgICBpZiAodmVyc2lvbkEuZXF1YWxzKHZlcnNpb25CKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdEEgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcnNpb25BLCAiLiIpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RCID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJzaW9uQiwgIi4iKTsKLQotICAgICAgICBpbnQgc2l6ZUEgPSBzdEEuY291bnRUb2tlbnMoKTsKLSAgICAgICAgaW50IHNpemVCID0gc3RCLmNvdW50VG9rZW5zKCk7Ci0KLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChzaXplQSA8IHNpemVCKQotICAgICAgICB7Ci0gICAgICAgICAgc2l6ZSA9IHNpemVBOwotICAgICAgICB9IAotICAgICAgICBlbHNlCi0gICAgICAgICAgc2l6ZSA9IHNpemVCOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHN0QS5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHN0Qi5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgaWYgKGEgIT0gYikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYSA+IGI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNpemVBID4gc2l6ZUI7Ci0gICAgICB9Ci0gICAgfQotCQotCS8qKgotICAgKiBAcGFyYW0gcHJvamVjdAotICAgKiBAcmV0dXJuCi0gICAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V2ViSW5mUGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLQkJCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkKLQkJLy9zaG91bGQgV0VCLUlORiBsb2NhdGlvbiBiZSBwdWxsZWQgaW4gZnJvbSB0aGUgLmNvbXBvbmVudCBmaWxlIHJhdGhlciB0aGFuIGhhcmRjb2RlZCBoZXJlPwotCQlJVmlydHVhbEZvbGRlciB3ZWJJbmZEaXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihuZXcgUGF0aCgiL1dFQi1JTkYiKSk7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSB3ZWJJbmZEaXIuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCQotCQlpZiAoIXdlYkluZkRpci5leGlzdHMoKSkKLQkJewkKLQkJCXRyeSAKLQkJCXsJCi0JCQkJd2ViSW5mRGlyLmNyZWF0ZSgwLG51bGwpOwkJCQkKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7fQotCQl9CQkKLQkJcmV0dXJuIG1vZHVsZVBhdGg7Ci0JfQotCQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Rmlyc3RXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLQkJCi0JCUlQYXRoIG1vZHVsZVBhdGggPSBudWxsOwotCQl0cnkgewotICAgICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCSAgaWYgKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgIG1vZHVsZVBhdGggPSB2Yy5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCSAgfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBleCl7fQotCi0JCXJldHVybiBtb2R1bGVQYXRoOwkJCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJSVBhdGggbW9kdWxlUGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCXJldHVybiBtb2R1bGVQYXRoOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0Rmlyc3RXZWJDb250ZW50Q29udGFpbmVyKElQcm9qZWN0IHByb2plY3QpewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBnZXRGaXJzdFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQlJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UobW9kdWxlUGF0aCk7Ci0JCWlmIChyZXMhPW51bGwpewotCQkgIGNvbnRhaW5lciA9IHJlcy5nZXRQYXJlbnQoKTsKLQkJfQkJCi0JCSAgCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRXZWJDb250ZW50Q29udGFpbmVyKElQcm9qZWN0IHByb2plY3QpewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJSVJlc291cmNlIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKG1vZHVsZVBhdGgpOwotCQlpZiAocmVzIGluc3RhbmNlb2YgSUNvbnRhaW5lcil7Ci0JCSAgY29udGFpbmVyID0gKElDb250YWluZXIpcmVzOwotCQl9CQkKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgTW9kdWxlIG5hbWUgCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RXZWJNb2R1bGVOYW1lKElQcm9qZWN0IHByb2plY3QpewotICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgICAgbW9kdWxlTmFtZSA9IHZjLmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCl7fQotICAKLSAgICAgIHJldHVybiBtb2R1bGVOYW1lOyAgCQkJCi0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wKXsKLQkgICAgcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpOwotICB9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUFSQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXApewotCSAgICByZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcnVlIGlmIHRoZSBjb21wb25lbnQgaXMgYSB2YWxpZCBFSkIgY29tcG9uZW50Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCQ29tcG9uZW50KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0gICAgICBpZiAodmMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGlzRUpCQ29tcG9uZW50KHZjKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFSkJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcCl7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpOwotCX0JCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBDbGllbnRDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcCl7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChjb21wLmdldFByb2plY3QoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcCl7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGVJZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUocHJvamVjdCk7Ci0JfQotICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRvQ29tcG9uZW50TmFtZXNBcnJheShJVmlydHVhbENvbXBvbmVudFtdIGNvbXBvbmVudHMpewotCQlTdHJpbmdbXSBlY05hbWVzID0gbmV3IFN0cmluZ1tjb21wb25lbnRzLmxlbmd0aF07Ci0JCWZvcihpbnQgaT0wOyBpPGNvbXBvbmVudHMubGVuZ3RoOyBpKyspewotCQkJZWNOYW1lc1tpXSA9IGNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlY05hbWVzOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSB0b1Byb2plY3RBcnJheShJVmlydHVhbENvbXBvbmVudFtdIGNvbXBvbmVudHMpewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElQcm9qZWN0W2NvbXBvbmVudHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbXBvbmVudHMubGVuZ3RoOyBpKyspewotCQkJcHJvamVjdHNbaV0gPSBjb21wb25lbnRzW2ldLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gcHJvamVjdHM7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgSjJFRSBsZXZlbCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgc2VydmxldCBsZXZlbAotCSAqIEBwYXJhbSBqMmVlTGV2ZWwKLQkgKiBAcmV0dXJuIHdlYiBhcHAgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRTZXJ2bGV0VmVyc2lvbkZvckoyRUVWZXJzaW9uKFN0cmluZyBqMmVlTGV2ZWwpewotCQlpbnQgYVZlcnNpb24gPSBJbnRlZ2VyLnZhbHVlT2YoajJlZUxldmVsKS5pbnRWYWx1ZSgpOwotCQlzd2l0Y2ggKGFWZXJzaW9uKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ6Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRCk7Ci0KLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLQkJCXJldHVybiBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEKTsKLQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOgotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQpOwotCQkJCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiBhIEoyRUUgbGV2ZWwsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIEVKQiB2ZXJzaW9uCi0JICogQHBhcmFtIGoyZWVMZXZlbAotCSAqIEByZXR1cm4gZWpiIHNwZWMgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRFSkJWZXJzaW9uRm9ySjJFRVZlcnNpb24oU3RyaW5nIGoyZWVMZXZlbCl7Ci0JCWludCBhVmVyc2lvbiA9IEludGVnZXIudmFsdWVPZihqMmVlTGV2ZWwpLmludFZhbHVlKCk7Ci0JCXN3aXRjaCAoYVZlcnNpb24pIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDoKLQkJCXJldHVybiBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEKTsKLQotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOgotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpOwotCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ6Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCk7Ci0JCQkKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKTsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIFRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyBhIHZhbGlkIEphdmEgY29tcG9uZW50Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUNvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotICAgICAgaWYgKHZjICE9IG51bGwpCi0gICAgICB7Ci0JICAgIHJldHVybiBpc0phdmFDb21wb25lbnQodmMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL2NoZWNrIGlmIGl0J3MgYSBmYWNldGVkIHByb2plY3Qgd2l0aCBvbmx5IHRoZSBKYXZhIGZhY2V0LgotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwcm9qZWN0LmV4aXN0cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGYWNldGVkUHJvamVjdCBmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgICAgIGlmIChmUHJvamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTZXQgZmFjZXRzID0gZlByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpOwotICAgICAgICAgICAgICBpZiAoZmFjZXRzLnNpemUoKT09MSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIHBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbilmYWNldHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9KQVZBKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vVGhpcyBpcyBub3QgYSBmYWNldGVkIHByb2plY3QuIENoZWNrIGlmIHRoaXMgaXMgYSBzaW1wbGUgSmF2YSBwcm9qZWN0LiAgICAKLSAgICAgICAgICAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIGEgdmFsaWQgV2ViIGNvbXBvbmVudAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYkNvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotICAgICAgaWYgKHZjICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBpc1dlYkNvbXBvbmVudCh2Yyk7ICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQkKLQl9Ci0KLQkvKioKLQkgKiBUcnVlIGlmIHRoZSBjb21wb25lbnQgaXMgYSB0cnVlIEFwcGxpY2F0aW9uIGNsaWVudCBjb21wb25lbnQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBDbGllbnRDb21wb25lbnQoSVByb2plY3QgcHJvamVjdCkgewotCSAgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgIGlmICh2YyAhPSBudWxsKQotICAgICAgewotCSAgcmV0dXJuIGlzQXBwQ2xpZW50Q29tcG9uZW50KHZjKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCX0KLQotCS8qKgotCSAqIFRydWUgaXMgdGhlIGNvbXBvbmVudCBpcyBhIHZhbGlkIEVBUiBjb21wb25lbnQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFQVJDb21wb25lbnQoSVByb2plY3QgcHJvamVjdCl7Ci0JICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotICAgICAgaWYgKHZjICE9IG51bGwpCi0gICAgICB7Ci0JICByZXR1cm4gaXNFQVJDb21wb25lbnQodmMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBnZXRPdXRwdXRDb250YWluZXJSb290IChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIChJRm9sZGVyKUoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE91dHB1dENvbnRhaW5lcnMoY29tcG9uZW50LmdldFByb2plY3QoKSlbMF07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSmF2YU1PRlV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KYXZhTU9GVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4M2RkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KYXZhTU9GVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLQotLyoqCi0qIFRoaXMgY2xhc3MgY29udGFpbnMgc29tZSB1c2VmdWwgdXRpbGl0aWVzIGZvciBkZWFsaW5nIHdpdGggdGhlIEphdmFNT0YKLSovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhTU9GVXRpbHMKLXsKLSAvKioKLSAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIG9mIHRoZSBnaXZlbiBuYW1lIGlzIGxvYWRhYmxlIGluIHRoZSBnaXZlbgotICAqIHByb2plY3QuCi0gICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGxvYWRhYmxlIGFuZCBubyBleGNlcHRpb25zIGFyZSB0aHJvd24uIAotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc0xvYWRhYmxlKFN0cmluZyBjbGFzc05hbWUsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgIAlyZXR1cm4gaXNDbGFzc0xvYWRhYmxlKGdldEphdmFDbGFzcyhjbGFzc05hbWUscHJvamVjdCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NMb2FkYWJsZShKYXZhQ2xhc3MgamF2YUNsYXNzKQotICB7Ci0JcmV0dXJuIGphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpOyAgICAKLSAgfQotCi0gIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaGFzIGEgcHVibGljIGNvbnN0cnVjdG9yCi0gICogd2l0aCBhbiBlbXB0eSBwYXJhbWV0ZXIgbGlzdC4KLSAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MKLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdAotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xhc3MgaXMgbG9hZGFibGUgZnJvbSB0aGUgcHJvamVjdCBhbmQgdGhlIAotICAqICAgICAgICAgY2xhc3MgaGFzIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggYW4gZW1wdHkgcGFyYW1ldGVyIGxpc3QgIAotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHVibGljRGVmYXVsdEN0b3IoU3RyaW5nIGNsYXNzTmFtZSwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBoYXNQdWJsaWNEZWZhdWx0Q3RvcihnZXRKYXZhQ2xhc3MoY2xhc3NOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1B1YmxpY0RlZmF1bHRDdG9yKEphdmFDbGFzcyBqYXZhQ2xhc3MpCi0gIHsKLSAgIAotICAgIExpc3QgbWV0aG9kTGlzdCA9IGphdmFDbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgaWYgKG1ldGhvZExpc3Q9PW51bGwpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEl0ZXJhdG9yIGlNZXRob2RzID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotICAgIGJvb2xlYW4gdXNlckRlZmluZWRDdG9yID0gZmFsc2U7Ci0gICAgd2hpbGUgKGlNZXRob2RzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBNZXRob2QgdGhpc01ldGhvZCA9IChNZXRob2QpaU1ldGhvZHMubmV4dCgpOwotCi0gICAgICBpZiAodGhpc01ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCi0gICAgICB7Ci0gICAgICAgIHVzZXJEZWZpbmVkQ3RvciA9IHRydWU7IAotCi0gICAgICAgIC8vU2luY2UgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBjdG9yLCB0aGUgZGVmYXVsdCBjdG9yIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCi0gICAgICAgIC8vV2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgdXNlciBoYXMgcHJvdmlkZWQgYSBwdWJsaWMgY3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgLy9jaGVjayBpZiBwdWJsaWMKLSAgICAgICAgaWYgKHRoaXNNZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUMpCi0gICAgICAgIHsKLSAgICAgICAgICAvL3NlZSBpZiBwYXJhbWV0ZXIgbGlzdCBpcyBlbXB0eQotICAgICAgICAgIExpc3QgcGFyYW1MaXN0ID0gdGhpc01ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgaWYgKHBhcmFtTGlzdC5pc0VtcHR5KCkgKQotICAgICAgICAgIHsKLQkgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLQotICAgIGlmICh1c2VyRGVmaW5lZEN0b3IpCi0gICAgewotCSAgcmV0dXJuIGZhbHNlOyAvL2lmIHRoZSB1c2VyIGRlZmluZWQgYSBjdG9yIGFuZCB3ZSBzdGlsbCBoYXZlbid0Ci0JICAJICAgICAgICAgICAgLy9yZXR1cm5lZCB0cnVlLCBub25lIG9mIHRoZW0gd2VyZSBwdWJsaWMgd2l0aCBubyBwYXJhbWV0ZXJzLgotICAgIH0KLSAgICBlbHNlCi0gICAgeyAKLSAgICAgICByZXR1cm4gdHJ1ZTsgICAgCi0gICAgfQotCi0gIH0KLSAgLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlLgotICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW50ZXJmYWNlCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGFuZCBpbnRlcmZhY2UgYXJlIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kCi0gICogICAgICAgICB0aGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgSVByb2plY3QgcHJvamVjdCkKLSAgCQkJdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgcmV0dXJuIGltcGxlbWVudHNJbnRlcmZhY2UoZ2V0SmF2YUNsYXNzKGNsYXNzTmFtZSwgcHJvamVjdCksIGdldEphdmFDbGFzcyhpbnRlcmZhY2VOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotcHVibGljIHN0YXRpYyBib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoSmF2YUNsYXNzIGphdmFDbGFzcywgSmF2YUNsYXNzIGludGVyZmFjZUNsYXNzKQotICB7Ci0gICAKLSAgICBpZiAoIWphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFpbnRlcmZhY2VDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICByZXR1cm4gamF2YUNsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UoaW50ZXJmYWNlQ2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBleHRlbmRzIHRoZSBzcGVjaWZpZWQgc3VwZXJjbGFzcwotICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAqIEBwYXJhbSBzdXBlckNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHN1cGVyY2xhc3MKLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdAotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xhc3MgYW5kIHN1cGVyQ2xhc3MgYXJlIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kCi0gICogICAgICAgICB0aGUgY2xhc3MgZXh0ZW5kcyB0aGUgc3VwZXJDbGFzcwotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXh0ZW5kc0NsYXNzKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBzdXBlckNsYXNzTmFtZSwgSVByb2plY3QgcHJvamVjdCkKLSAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5kc0NsYXNzKGdldEphdmFDbGFzcyhjbGFzc05hbWUscHJvamVjdCksIGdldEphdmFDbGFzcyhzdXBlckNsYXNzTmFtZSwgcHJvamVjdCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4dGVuZHNDbGFzcyhKYXZhQ2xhc3MgamF2YUNsYXNzLCBKYXZhQ2xhc3Mgc3VwZXJDbGFzcykKLSAgewotICAgIHJldHVybiBzdXBlckNsYXNzLmlzQXNzaWduYWJsZUZyb20oamF2YUNsYXNzKTsKLSAgfQotCi0gIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYWN0dWFsbHkgYW4gaW50ZXJmYWNlCi0gICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kIGlzIAotICAqICAgICAgICAgYWN0dWFsbHkgYW4gaW50ZXJmYWNlCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZShTdHJpbmcgY2xhc3NOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgIHJldHVybiBpc0ludGVyZmFjZShnZXRKYXZhQ2xhc3MoY2xhc3NOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZShKYXZhQ2xhc3MgamF2YUNsYXNzKQotICB7Ci0gICAgICByZXR1cm4gamF2YUNsYXNzLmlzSW50ZXJmYWNlKCk7Ci0gIH0KLSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQWJzdHJhY3RNZXRob2RzIChTdHJpbmcgY2xhc3NOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotIAl7Ci0JICAgIHJldHVybiBoYXNBYnN0cmFjdE1ldGhvZHMoZ2V0SmF2YUNsYXNzKGNsYXNzTmFtZSwgcHJvamVjdCkpOwotICAJfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNBYnN0cmFjdE1ldGhvZHMgKEphdmFDbGFzcyBqYXZhQ2xhc3MpCi0gCXsKLQkgICBMaXN0IG1ldGhvZExpc3QgPSBqYXZhQ2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgIGlmIChtZXRob2RMaXN0PT1udWxsKQotICAgICAgCXJldHVybiBmYWxzZTsKLQotCSAgIEl0ZXJhdG9yIGlNZXRob2RzID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotCSAgIHdoaWxlIChpTWV0aG9kcy5oYXNOZXh0KCkpCi0gICAgCXsKLSAgICAgIAkJTWV0aG9kIHRoaXNNZXRob2QgPSAoTWV0aG9kKWlNZXRob2RzLm5leHQoKTsKLQkJCWlmICggdGhpc01ldGhvZC5pc0Fic3RyYWN0KCkpIHJldHVybiB0cnVlOwotCSAgIAl9Ci0JCXJldHVybiBmYWxzZTsKLSAJfQotCi0gIC8qIAotICAgKiAKLSAgICovCi0gLyoqCi0gKiBAcGFyYW0gY2xhc3NRTmFtZSBGdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIChwYWNrYWdlTmFtZSArIHR5cGVOYW1lKQotICogQHBhcmFtIHByb2plY3QKLSAqIEByZXR1cm4KLSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICovCi1wdWJsaWMgc3RhdGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoU3RyaW5nIGNsYXNzUU5hbWUgLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotIAl7Ci0JIAlFTUZOYXR1cmUgak1PRiA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SkVNX0VNRl9OYXR1cmUocHJvamVjdCwgdHJ1ZSk7Ci0JIAlyZXR1cm4gKEphdmFDbGFzcylKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoY2xhc3NRTmFtZSxqTU9GLmdldFJlc291cmNlU2V0KCkpOwotIAl9Ci0gCi0gLyoqCi0gKiBAcGFyYW0gcGFja2FnZU5hbWUKLSAqIEBwYXJhbSB0eXBlTmFtZQotICogQHBhcmFtIHByb2plY3QKLSAqIEByZXR1cm4KLSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICovCi1wdWJsaWMgc3RhdGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZU5hbWUgLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkgCUVNRk5hdHVyZSBqTU9GID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKRU1fRU1GX05hdHVyZShwcm9qZWN0LCB0cnVlKTsKLQkgCXJldHVybiAoSmF2YUNsYXNzKUphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShwYWNrYWdlTmFtZSwgdHlwZU5hbWUsIGpNT0YuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JfQotCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRTRUlGaWxlKEphdmFDbGFzcyBiZWFuQ2xhc3MsIEphdmFDbGFzcyBzZWlDbGFzcykKLSAJewotIAkJaWYgKCFzZWlDbGFzcy5pc0ludGVyZmFjZSgpKQotIAkJCXJldHVybiBmYWxzZTsKLQotCQlWZWN0b3IgYmVhbk1ldGhvZHNMaXN0ID0gbmV3IFZlY3RvcigpOwotIAkJTGlzdCBiZWFuTWV0aG9kcyA9IGJlYW5DbGFzcy5nZXRNZXRob2RzKCk7Ci0JCUl0ZXJhdG9yIGJlYW5NZXRob2RzSXRlcmF0b3IgPSBiZWFuTWV0aG9kcy5pdGVyYXRvcigpOwotCSAgIAl3aGlsZSAoYmVhbk1ldGhvZHNJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgCXsKLSAgICAgIAkJTWV0aG9kIHRoaXNNZXRob2QgPSAoTWV0aG9kKWJlYW5NZXRob2RzSXRlcmF0b3IubmV4dCgpOwotCQkJYmVhbk1ldGhvZHNMaXN0LmFkZCh0aGlzTWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0JICAgCX0KLQotCQlMaXN0IHNlaU1ldGhvZHMgPSBzZWlDbGFzcy5nZXRNZXRob2RzKCk7Ci0gCQlpZiAoYmVhbk1ldGhvZHMgPT0gbnVsbCApIHsKLSAJCQlpZiAoIHNlaU1ldGhvZHMgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gCQkJZWxzZQlyZXR1cm4gZmFsc2U7Ci0gCQl9Ci0JCWlmIChzZWlNZXRob2RzID09IG51bGwpIHJldHVybiBmYWxzZTsKLQotCQlJdGVyYXRvciBzZWlNZXRob2RzSXRlcmF0b3IgPSBzZWlNZXRob2RzLml0ZXJhdG9yKCk7Ci0JICAgCXdoaWxlIChzZWlNZXRob2RzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIAl7Ci0gICAgICAJCU1ldGhvZCB0aGlzTWV0aG9kID0gKE1ldGhvZClzZWlNZXRob2RzSXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCAhYmVhbk1ldGhvZHNMaXN0LmNvbnRhaW5zKHRoaXNNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkgICAJfQotCQlyZXR1cm4gdHJ1ZTsKLSAJCQotIAl9Ci0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9SZXNvdXJjZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9SZXNvdXJjZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MGFmNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vUmVzb3VyY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMzAgICAxMjQ2Njcga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNDIxICAgMTM2NzYxIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA0MjQgICAxMTU2OTAgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA2MDUwMyAgIDEyNjgxOSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5jb21wb25lbnRjb3JlLnV0aWwuQXBwQ2xpZW50QXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHVzZWZ1bCBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggRWNsaXBzZSByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVV0aWxzIHsKLQotCS8vIEtlZXBzIHRoZSBJV29ya3NwYWNlUm9vdCBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZVJvb3QoKS4KLQlwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCByb290XyA9IG51bGw7Ci0KLQkvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZSBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZSgpLgotCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZSB3b3Jrc3BhY2VfID0gbnVsbDsKLQotCS8qKgotCSAqIEFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UHJvamVjdFR5cGUgZ2V0UHJvamVjdFR5cGUoKX0sIGluZGljYXRlcyB0aGF0Ci0JICogdGhlIGdpdmVuIHByb2plY3QgaGFzIG5vIEphdmEgb3IgV2ViIG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUFJPSkVDVF9UWVBFX05PTkUgPSAwOwotCi0JLyoqCi0JICogQXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRQcm9qZWN0VHlwZSBnZXRQcm9qZWN0VHlwZSgpfSwgaW5kaWNhdGVzIHRoYXQKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBoYXMgYSBKYXZhIHByb2plY3QgbmF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBQUk9KRUNUX1RZUEVfSkFWQSA9IDE7Ci0KLQkvKioKLQkgKiBBcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3RUeXBlIGdldFByb2plY3RUeXBlKCl9LCBpbmRpY2F0ZXMgdGhhdAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBhIFdlYiBwcm9qZWN0IG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUFJPSkVDVF9UWVBFX1dFQiA9IDI7Ci0KLQkvKioKLQkgKiBBcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3RUeXBlIGdldFByb2plY3RUeXBlKCl9LCBpbmRpY2F0ZXMgdGhhdAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBhbiBFSkIgcHJvamVjdCBuYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIFBST0pFQ1RfVFlQRV9FSkIgPSA0OwotCQotCS8qKgotCSAqIEFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UHJvamVjdFR5cGUgZ2V0UHJvamVjdFR5cGUoKX0sIGluZGljYXRlcyB0aGF0Ci0JICogdGhlIGdpdmVuIHByb2plY3QgaGFzIGFuIEFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IG5hdHVyZS4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBieXRlIFBST0pFQ1RfVFlQRV9BUFBDTElFTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIFNPQVAgcnBjcm91dGVyIHNlcnZsZXQgZXh0ZW5zaW9uIHRvIGJlIGFkZGVkIHRvIHdlYiBwcm9qZWN0IFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfRVhUID0gIi9zZXJ2bGV0L3JwY3JvdXRlciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTElFTlRfV0VCX1BST0pFQ1RfRVhUID0gIkNsaWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xJRU5UX0VKQl9QUk9KRUNUX0VYVCA9ICJFSkJDbGllbnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VKQl9QUk9KRUNUX05BTUUgPSAiV2ViU2VydmljZUVKQlByb2plY3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VKQl9DT01QT05FTlRfTkFNRSA9ICJXZWJTZXJ2aWNlRUpCIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJfUFJPSkVDVF9OQU1FID0gIldlYlNlcnZpY2VQcm9qZWN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJfQ09NUE9ORU5UX05BTUUgPSAiV2ViU2VydmljZVByb2plY3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JPVVRFUl9QUk9KRUNUX0VYVCA9ICJSb3V0ZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRV9FQVJfUFJPSkVDVF9OQU1FID0gIldlYlNlcnZpY2VQcm9qZWN0RUFSIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFX0VBUl9DT01QT05FTlRfTkFNRSA9ICJXZWJTZXJ2aWNlUHJvamVjdEVBUiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xJRU5UX0VBUl9QUk9KRUNUX05BTUUgPSAiV2ViU2VydmljZVByb2plY3RDbGllbnRFQVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMSUVOVF9FQVJfQ09NUE9ORU5UX05BTUUgPSAiV2ViU2VydmljZVByb2plY3RDbGllbnRFQVIiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VBUl9FWFQgPSAiRUFSIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlUm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlpZiAocm9vdF8gPT0gbnVsbCkgewotCQkJcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl9Ci0JCXJldHVybiByb290XzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJV29ya3NwYWNlIG9iamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlpZiAod29ya3NwYWNlXyA9PSBudWxsKSB7Ci0JCQlpZiAocm9vdF8gPT0gbnVsbCkgewotCQkJCXJvb3RfID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCX0KLQkJCXdvcmtzcGFjZV8gPSByb290Xy5nZXRXb3Jrc3BhY2UoKTsKLQkJfQotCQlyZXR1cm4gd29ya3NwYWNlXzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfW9mIHRoZQotCSAqIGdpdmVuIGFic29sdXRlIHBhdGhuYW1lIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZShTdHJpbmcgYWJzb2x1dGVQYXRobmFtZSkgewotCQlpZiAoYWJzb2x1dGVQYXRobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmluZFJlc291cmNlKG5ldyBQYXRoKGFic29sdXRlUGF0aG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfW9mIHRoZQotCSAqIGdpdmVuIGFic29sdXRlIHBhdGggb3IgbnVsbCBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgPGNvZGU+SVBhdGg8L2NvZGU+IG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZShJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZmluZE1lbWJlcihhYnNvbHV0ZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBJUmVzb3VyY2V9b2YgdGhlCi0JICogZ2l2ZW4gZmlsZSBzeXN0ZW0gcmVsYXRpdmUgcGF0aG5hbWUgYW5kIHByb2plY3Qgb3IgbnVsbCBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLQkgKgotCSAqIEBwYXJhbSBmaWxlUGF0aCBGaWxlIHN5c3RlbSByZWxhdGl2ZSBwYXRobmFtZQotCSAqIEBwYXJhbSBwcm9qZWN0IFByb2plY3QKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZUF0TG9jYXRpb24oU3RyaW5nIGZpbGVQYXRoLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQotCQlyZXR1cm4gZmluZFJlc291cmNlKGZpbmRQYXRoQXRMb2NhdGlvbiggbmV3IFBhdGgoZmlsZVBhdGgpLCBwcm9qZWN0KSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGNvbnZlcnQgYSBwYXRoIHRoYXQgaXMgcmVsYXRpdmUgdG8gYSBmaWxlIHN5c3RlbQotCSAqIHRvIGEgcGF0aCB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2UuIEluc3RlYWQgb2YgY29tcGFyaW5nIHRoZQotCSAqIGZpbGVQYXRoIHdpdGggdGhlIGluc3RhbGwgbG9jYXRpb24gb2YgdGhlIHdvcmtzcGFjZSAoaS5lLgotCSAqIFBsYXRmb3JtLmdldExvY2F0aW9uKCkpLCB0aGUgZmlsZVBhdGggaXMgY29tcGFyZWQgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIHByb2plY3QKLQkgKiBzaW5jZSB0aGUgcHJvamVjdCBjb3VsZCBiZSBpbiBhIGxvY2F0aW9uIG90aGVyIHRoYW4gdGhlIHRoZSBkZWZhdWx0IGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZQotCSAqIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVBhdGgJRmlsZSBwYXRoIHJlbGF0aXZlIHRvIGEgZmlsZSBzeXN0ZW0KLQkgKiBAcGFyYW0gcHJvamVjdAlUaGUgcHJvamVjdCB0aGUgZmlsZSBpcyBpbgotCSAqIEByZXR1cm4gCQkJUGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBmaW5kUGF0aEF0TG9jYXRpb24oSVBhdGggZmlsZVBhdGgsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhdGggcmVzdWx0ID0gbnVsbDsKLQotCQlJUGF0aCBwcm9qZWN0TG9jYXRpb24gPSBwcm9qZWN0LmdldExvY2F0aW9uKCk7Ci0KLQkJaWYgKHByb2plY3RMb2NhdGlvbi5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoZmlsZVBhdGgpID09IHByb2plY3RMb2NhdGlvbgotCQkJCS5zZWdtZW50Q291bnQoKSkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHByb2plY3RMb2NhdGlvbgotCQkJCQkuc2VnbWVudENvdW50KCkgLSAxKTsKLQkJCXJlc3VsdCA9IGZpbGVQYXRoLnNldERldmljZShudWxsKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGEgbmFtZSBmb3IgYSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gdHlwZShzKS4KLQkgKiBUaGlzIG1ldGhvZCBvYmV5cyB0aGUgY29udHJhY3Qgb2YKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZU5hbWUgSVdvcmtzcGFjZS52YWxpZGF0ZU5hbWUoKX0uCi0JICogCi0JICogQHBhcmFtIHNlZ21lbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB0eXBlTWFzawotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdHlwZSBvciB0eXBlcy4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0dXMgd2l0aCBhIHZhbHVlIGlmIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBwYXRoCi0JICogICAgICAgICBpcyB2YWxpZCwgb3Igd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBpbmZvcm1hdGlvbiBpZgotCSAqICAgICAgICAgdGhlIHBhdGggaXMgbm90IHZhbGlkLgotCSAqICAgICAgICAgCi0JICogQGRlcHJlY2F0ZWQgbm90IHVzZWQgICAgICAgICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVOYW1lKFN0cmluZyBzZWdtZW50LCBpbnQgdHlwZU1hc2spIHsKLQkJcmV0dXJuIGdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShzZWdtZW50LCB0eXBlTWFzayk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgdGhlIHBhdGggb2YgYSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4KLQkgKiB0eXBlKHMpLiBUaGlzIG1ldGhvZCBvYmV5cyB0aGUgY29udHJhY3Qgb2YKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZVBhdGggSVdvcmtzcGFjZS52YWxpZGF0ZVBhdGgoKX0uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB0eXBlTWFzawotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdHlwZSBvciB0eXBlcy4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0dXMgd2l0aCBhIHZhbHVlIGlmIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBwYXRoCi0JICogICAgICAgICBpcyB2YWxpZCwgb3Igd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBpbmZvcm1hdGlvbiBpZgotCSAqICAgICAgICAgdGhlIHBhdGggaXMgbm90IHZhbGlkLgotCSAqIEBkZXByZWNhdGVkIG5vdCB1c2VkIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBhdGgoU3RyaW5nIHBhdGgsIGludCB0eXBlTWFzaykgewotCQlyZXR1cm4gZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVQYXRoKHBhdGgsIHR5cGVNYXNrKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqICAgICAgICAgICAgVGhlIEphdmEgdHlwZSBuYW1lLgotCSAqIEByZXR1cm4gVGhlIHN0YXR1cyB3aXRoIGEgdmFsdWUgb2YgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIG5hbWUKLQkgKiAgICAgICAgIGlzIHZhbGlkLCBvciB3aXRoIGFwcHJvcHJpYXRlIHNldmVyaXR5IGFuZCBtZXNzYWdlIGluZm9ybWF0aW9uIGlmCi0JICogICAgICAgICBuYW1lIGlzIG5vdCB2YWxpZC4gVGhlIHByaW1pdGl2ZSB0eXBlcyAoYm9vbGVhbiwgY2hhciwgYnl0ZSwKLQkgKiAgICAgICAgIHNob3J0LCBpbnQsIGxvbmcsIGZsb2F0LCBkb3VibGUpIGFyZSB2YWxpZC4gQXJyYXlzIG9mIHZhbGlkIHR5cGVzCi0JICogICAgICAgICBhcmUgdGhlbXNlbHZlcyB2YWxpZC4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgSmF2YUNvbnZlbnRpb25zIGluIHRoZSBqZHQgY29yZSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVKYXZhVHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCS8vCi0JCS8vIFN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgYXJyYXkgYml0cywgaWYgYW55LgotCQkvLwotCQlpbnQgYSA9IHR5cGVOYW1lLmluZGV4T2YoJ1snKTsKLQkJaWYgKGEgPiAwKSB7Ci0JCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBhKTsKLQkJfQotCQkvLwotCQkvLyBBbGxvdyBwcmltaXRpdmVzLgotCQkvLwotCQlpZiAoaXNQcmltaXRpdmVKYXZhVHlwZSh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFdlYlNlcnZpY2VQbHVnaW4uSUQsIDAsICIiLCBudWxsKTsKLQkJfQotCQkvLwotCQkvLyBEZWZlciB0byBKYXZhQ29udmVudGlvbnMuCi0JCS8vCi0JCXJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUodHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gPGNvZGU+dHlwZU5hbWU8L2NvZGU+IGlzIGEgSmF2YSBwcmltaXRpdmUKLQkgKiAoYm9vbGVhbiwgY2hhciwgYnl0ZSwgc2hvcnQsIGludCwgbG9uZywgZmxvYXQsIGRvdWJsZSkuCi0JICogCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSB0eXBlIG5hbWUgaXMgYSBKYXZhIHByaW1pdGl2ZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZUphdmFUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gKHR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpIHx8IHR5cGVOYW1lLmVxdWFscygiY2hhciIpCi0JCQkJfHwgdHlwZU5hbWUuZXF1YWxzKCJieXRlIikgfHwgdHlwZU5hbWUuZXF1YWxzKCJzaG9ydCIpCi0JCQkJfHwgdHlwZU5hbWUuZXF1YWxzKCJpbnQiKSB8fCB0eXBlTmFtZS5lcXVhbHMoImxvbmciKQotCQkJCXx8IHR5cGVOYW1lLmVxdWFscygiZmxvYXQiKSB8fCB0eXBlTmFtZS5lcXVhbHMoImRvdWJsZSIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYW5kbGUgb2YgdGhlIElQcm9qZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdpdmVuCi0JICogPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPi4gTmVpdGhlciB0aGUgZ2l2ZW4gcGF0aCBub3IgdGhlIHByb2plY3QgbmVlZAotCSAqIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuIFRoZSBwYXRoIG11c3QgYmUgYWJzb2x1dGUsIGFuZCBtdXN0IGNvbnNpc3Qgb2YgYXQKLQkgKiBsZWFzdCBvbmUgc2VnbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIElQcm9qZWN0IGhhbmRsZSBmb3IgdGhlIHByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4sIG9yIG51bGwgaWYgdGhlIHBhdGggZG9lcyBub3QKLQkgKiAgICAgICAgIHNwZWNpZnkgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdE9mKElQYXRoIGFic29sdXRlUGF0aCkgewotCQlpZiAoYWJzb2x1dGVQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gYWJzb2x1dGVQYXRoLnNlZ21lbnQoMCk7Ci0JCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudE9mKElQYXRoIGFic29sdXRlUGF0aCl7Ci0JCWlmIChhYnNvbHV0ZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gYWJzb2x1dGVQYXRoLnNlZ21lbnQoMCk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudE9mKElSZXNvdXJjZSByZXMpCi0JewotCQlJVmlydHVhbFJlc291cmNlW10gdnJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlcyk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZjb21wID0gbnVsbDsKLQkJaWYgKHZyZXNvdXJjZXMgIT0gbnVsbCAmJiB2cmVzb3VyY2VzLmxlbmd0aD4wKQotCQl7Ci0JCQlJVmlydHVhbFJlc291cmNlIHZyZXMgPSB2cmVzb3VyY2VzWzBdOwotCQkJdmNvbXAgPSB2cmVzLmdldENvbXBvbmVudCgpOwotCQl9Ci0JCXJldHVybiB2Y29tcDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhIEphdmEgUHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBwcm9qZWN0IGlzIGEgSmF2YSBQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5Ci0JCXsKLQkJICByZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLQkJewotCQkJLy9SZXR1cm4gZmFsc2UgaWYgQ29yZUV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgY2hlY2tpbmcgbmF0dXJlLgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhIEphdmEgUHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBwcm9qZWN0IGlzIGEgSmF2YSBQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWVKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAoIWlzV2ViUHJvamVjdChwcm9qZWN0KSAmJiAhaXNBcHBDbGllbnRQcm9qZWN0KHByb2plY3QpICYmICFpc0VBUlByb2plY3QocHJvamVjdCkKLQkJCQkmJiAhaXNFSkJQcm9qZWN0KHByb2plY3QpICYmIGlzSmF2YVByb2plY3QocHJvamVjdCkpOwotCQkvKgotCQkgKiB0cnkgeyBTdHJpbmdbXSBuYXR1cmVzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldE5hdHVyZUlkcygpOwotCQkgKiByZXR1cm4gKG5hdHVyZXMubGVuZ3RoID09IDEgJiYKLQkJICogbmF0dXJlc1swXS5lcXVhbHMoSmF2YUNvcmUuTkFUVVJFX0lEKSk7IH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeyB9Ci0JCSAqIHJldHVybiBmYWxzZTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhIFdlYiBQcm9qZWN0LgotCSAqIE5vdGU6IEZvciBjb21wb25lbnRzOyB1c2UgSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KCkKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBwcm9qZWN0IGlzIGEgV2ViIFByb2plY3QuCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzV2ViID0gZmFsc2U7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJICAvL2lzV2ViID0gV2ViQXJ0aWZhY3RFZGl0LmlzVmFsaWRXZWJNb2R1bGUod2Jjc1swXSk7Ci0JCSAgfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBleCl7Ci0JCQkvLyBoYW5kbGUgZXhjZXB0aW9uCi0JCX0KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gaXNXZWI7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogZm9yIGNvbXBvbmVudHM7IHVzZSBKMkVFVXRpbHMuaXNFQVJDb21wb25lbnQoKQotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotICAgKiAKLSAgICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFQVJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpewotCQlib29sZWFuIGlzRUFSID0gZmFsc2U7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJRUFSQXJ0aWZhY3RFZGl0IGVhckVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCSAgLy9lYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQod2Jjc1swXSk7Ci0JCQkgIGlmIChlYXJFZGl0IT1udWxsKXsKLQkJCQlpc0VBUiA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGVhckVkaXQhPW51bGwpCi0JCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0VBUjsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBFSkIgMS4xIG9yIEVKQiAyLjAKLQkgKiBQcm9qZWN0LgotCSAqIE5vdGU6IGZvciBjb21wb25lbnRzLCB1c2UgSjJFRVV0aWxzLmlzRUpCQ29tcG9uZW50Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhbiBFSkIgMS4xIG9yIGFuIEVKQiAyLjAgUHJvamVjdC4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkCi0gICAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VKQlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzRUpCID0gZmFsc2U7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJRUpCQXJ0aWZhY3RFZGl0IGVqYkVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCSAgLy9lamJFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQod2Jjc1swXSk7Ci0JCQkgIGlmIChlamJFZGl0IT1udWxsKXsKLQkJCQlpc0VKQiA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGVqYkVkaXQhPW51bGwpCi0JCQkJCWVqYkVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0VKQjsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBBcHBsaWNhdGlvbiBDbGllbnQKLQkgKiBQcm9qZWN0LgotCSAqIE5vdGU6IGZvciBjb21wb25lbnRzLCB1c2UgSjJFRVV0aWxzLmlzQXBwQ2xpZW50Q29tcG9uZW50KCkKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBwcm9qZWN0IGlzIGFuIEFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0Ci0gICAqIAotICAgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FwcENsaWVudFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzQXBwQ2xpZW50ID0gZmFsc2U7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGFwcENsaWVudEVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvL2FwcENsaWVudEVkaXQgPSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZCh3YmNzWzBdKTsKLQkJCSAgaWYgKGFwcENsaWVudEVkaXQhPW51bGwpewotCQkJCSAgaXNBcHBDbGllbnQgPSB0cnVlOwotCQkJICB9Ci0JCQl9Ci0JCQlmaW5hbGx5ewotCQkJCWlmIChhcHBDbGllbnRFZGl0IT1udWxsKQotCQkJCQlhcHBDbGllbnRFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJICB9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGV4KXt9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gaXNBcHBDbGllbnQ7CQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFzIGEgYml0bWFzay4KLQkgKiBSZWxldmFudCBiaXRtYXNrIHZhbHVlcyBhcmU6Ci0JICogPG9sPgotCSAqIDxsaT57QGxpbmsgI1BST0pFQ1RfVFlQRV9KQVZBIFBST0pFQ1RfVFlQRV9KQVZBfQotCSAqIDxsaT57QGxpbmsgI1BST0pFQ1RfVFlQRV9XRUIgUFJPSkVDVF9UWVBFX1dFQn0KLQkgKiA8bGk+e0BsaW5rICNQUk9KRUNUX1RZUEVfRUpCIFBST0pFQ1RfVFlQRV9FSkJ9Ci0JICogPGxpPntAbGluayAjUFJPSkVDVF9UWVBFX05PTkUgUFJPSkVDVF9UWVBFX05PTkV9Ci0JICogPC9vbD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUaGUgdHlwZSBiaXRtYXNrIG9mIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRDb21wb25lbnRUeXBlCi0JICovIAotCXB1YmxpYyBzdGF0aWMgYnl0ZSBnZXRQcm9qZWN0VHlwZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJ5dGUgcHJvamVjdFR5cGUgPSBQUk9KRUNUX1RZUEVfTk9ORTsKLQkJaWYgKFJlc291cmNlVXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0KSkgewotCQkJcHJvamVjdFR5cGUgfD0gUFJPSkVDVF9UWVBFX0pBVkE7Ci0JCX0KLQkJaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlwcm9qZWN0VHlwZSB8PSBQUk9KRUNUX1RZUEVfV0VCOwotCQl9Ci0JCWlmIChSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkgewotCQkJcHJvamVjdFR5cGUgfD0gUFJPSkVDVF9UWVBFX0VKQjsKLQkJfQotCQlyZXR1cm4gcHJvamVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgaWQgYXMgZGVmaW5lZCBpbiBJTW9kdWxlQ29uc3RhbnRzCi0JICogaS5lLiBJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFID0gImpzdC53ZWIiCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZShJUHJvamVjdCBwcm9qZWN0KXsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VHlwZShwcm9qZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KXsKLQkJcmV0dXJuIGdldENvbXBvbmVudFR5cGUoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgV2ViTW9kdWxlIERlcGxveWFibGUgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFzIGFuCi0JICogPGNvZGU+SURlcGxveWFibGU8L2NvZGU+LCBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBXZWIgbmF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFdlYk1vZHVsZSBEZXBsb3lhYmxlIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBvciBudWxsIGlmIHRoZQotCSAqICAgICAgICAgcHJvamVjdCBoYXMgbm8gV2ViIG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQlyZXR1cm4gU2VydmVyVXRpbC5nZXRNb2R1bGUocHJvamVjdCk7Ci19Ci0JCi0vLyBXb3JrYXJvdW5kIGZvciAxMTM2MjEgCi0vL3B1YmxpYyBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotLy8JSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMocHJvamVjdCk7Ci0vLwlpZiAobW9kdWxlcyE9bnVsbCAmJiBtb2R1bGVzLmxlbmd0aCE9MCkgewotLy8JCXJldHVybiBtb2R1bGVzWzBdOwotLy8JfQotLy8JcmV0dXJuIG51bGw7Ci0vL30KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJ1aWxkIG91dHB1dCBsb2NhdGlvbiBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgYW4KLQkgKiA8Y29kZT5JUGF0aDwvY29kZT4sIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIEphdmEgbmF0dXJlLgotCSAqIGkuZS4gV1BcLmRlcGxveWFibGVzXHdlYk1vZHVsZVxXRUItSU5GXGNsYXNzZXMKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUaGUgYnVpbGQgb3V0cHV0IGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBvciBudWxsCi0JICogICAgICAgICBpZiB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUuCi0JICogQGRlcHJlY2F0ZWQgbm90IHVzZWQgCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhT3V0cHV0TG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCW91dHB1dExvY2F0aW9uID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlJTG9nIGxvZyA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlTG9nKCk7Ci0JCWxvZy5sb2coSUxvZy5JTkZPLCA1MDMyLCBSZXNvdXJjZVV0aWxzLmNsYXNzLCAiZ2V0SmF2YU91dHB1dExvY2F0aW9uIiwKLQkJCQkicHJvamVjdD0iICsgcHJvamVjdCArICIsb3V0cHV0TG9jYXRpb249IiArIG91dHB1dExvY2F0aW9uKTsKLQotCQlyZXR1cm4gb3V0cHV0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGJ1aWxkIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgYW4KLQkgKiA8Y29kZT5JUGF0aDwvY29kZT4sIG9yIG51bGwgaWYgdGhlIHByb2plY3QgZWl0aGVyIGhhcyBubyBKYXZhIG5hdHVyZQotCSAqIG9yIGlmIHRoZSBwcm9qZWN0J3MgYnVpbGQgY2xhc3NwYXRoIGNvbnRhaW5zIG5vIGZvbGRlcnMgbG9jYWwgdG8gdGhlCi0JICogcHJvamVjdC4gSWYgdGhlIHByb2plY3QgaGFzIG1vcmUgdGhhbiBvbmUgb2YgaXRzIG93biBmb2xkZXJzIG9uIHRoZSBidWlsZAotCSAqIGNsYXNzcGF0aCwgdGhlbiBvbmUgb2YgdGhlbSBpcyBjaG9zZW4gYXJiaXRyYXJpbHkgYXMgdGhlIGJ1aWxkIHNvdXJjZQotCSAqIGxvY2F0aW9uLiBUbyB3b3JrIHdpdGggYWxsIGVudHJpZXMgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCwgdXNlCi0JICoge0BsaW5rICNnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdHMgZ2V0SmF2YVBhY2thZ2VGcmFnbWVudFJvb3RzKCl9b3IKLQkgKiB7QGxpbmsgI2dldEphdmFDbGFzc3BhdGggZ2V0SmF2YUNsYXNzcGF0aCgpfS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBBIGJ1aWxkIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gb3IgbnVsbCBpZgotCSAqICAgICAgICAgdGhlIHByb2plY3QgaGFzIG5vIEphdmEgbmF0dXJlIG9yIGlmIHRoZSBwcm9qZWN0J3MgYnVpbGQKLQkgKiAgICAgICAgIGNsYXNzcGF0aCBjb250YWlucyBubyBmb2xkZXJzIGxvY2FsIHRvIHRoZSBwcm9qZWN0LgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhU291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCBzb3VyY2VMb2NhdGlvbiA9IG51bGw7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZnJhZ21lbnRSb290cyA9IGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyhwcm9qZWN0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudFJvb3RzLmxlbmd0aCAmJiBzb3VyY2VMb2NhdGlvbiA9PSBudWxsOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlIGZyYWdtZW50Um9vdCA9IGZyYWdtZW50Um9vdHNbaV0KLQkJCQkJCS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQlpZiAoZnJhZ21lbnRSb290ICE9IG51bGwKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSkgewotCQkJCQlzb3VyY2VMb2NhdGlvbiA9IGZyYWdtZW50Um9vdC5nZXRGdWxsUGF0aCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlJTG9nIGxvZyA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlTG9nKCk7Ci0JCWxvZy5sb2coSUxvZy5JTkZPLCA1MDMwLCBSZXNvdXJjZVV0aWxzLmNsYXNzLCAiZ2V0SmF2YVNvdXJjZUxvY2F0aW9uIiwKLQkJCQkicHJvamVjdD0iICsgcHJvamVjdCArICIsc291cmNlTG9jYXRpb249IiArIHNvdXJjZUxvY2F0aW9uKTsKLQkJCi0JCXJldHVybiBzb3VyY2VMb2NhdGlvbjsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAiSmF2YVNvdXJjZSIgZm9sZGVyCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0gICAgLyoKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFTb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KXsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCXJldHVybiBnZXRKYXZhU291cmNlTG9jYXRpb24oY29tcG9uZW50KTsJCQkKLQl9Ci0JKi8KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhU291cmNlIGxvY2F0aW9uIGZvbGRlcgotCSAqIEBwYXJhbSBjb21wCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKElWaXJ0dWFsQ29tcG9uZW50IGNvbXApewotCQlpZiAoY29tcCE9bnVsbCl7Ci0JCSAgIElWaXJ0dWFsRm9sZGVyIGZvbGRlciA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihuZXcgUGF0aCgiL1dFQi1JTkYvY2xhc3NlcyIpKTsKLQkJICAgcmV0dXJuIGZvbGRlci5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YVNvdXJjZSBsb2NhdGlvbnMgaW4gZWFjaCBwcm9qZWN0Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aFtdIGdldEFsbEphdmFTb3VyY2VMb2NhdGlvbnMoSVByb2plY3QgcHJvamVjdCkgewotCQlWZWN0b3IgcGF0aFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBmcmFnbWVudFJvb3RzID0gZ2V0SmF2YVBhY2thZ2VGcmFnbWVudFJvb3RzKHByb2plY3QpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRSb290cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJUmVzb3VyY2UgZnJhZ21lbnRSb290ID0gZnJhZ21lbnRSb290c1tpXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQlpZiAoZnJhZ21lbnRSb290ICE9IG51bGwgJiYgKGZyYWdtZW50Um9vdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCQkJJiYgKGZyYWdtZW50Um9vdC5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpKSB7Ci0JCQkJCXBhdGhWZWN0b3IuYWRkKGZyYWdtZW50Um9vdC5nZXRGdWxsUGF0aCgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAoSVBhdGhbXSkgcGF0aFZlY3Rvci50b0FycmF5KG5ldyBQYXRoW3BhdGhWZWN0b3Iuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUGF0aFtdIGdldEFsbEphdmFTb3VyY2VMb2NhdGlvbnMoSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzKSB7Ci0KLQkJaWYgKGNvbXBvbmVudHMhPW51bGwpewotCQkJTGlzdCBqYXZhU291cmNlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpPTA7aTxjb21wb25lbnRzLmxlbmd0aDtpKyspewotCQkJCUlQYXRoIHBhdGggPSBnZXRKYXZhU291cmNlTG9jYXRpb24oY29tcG9uZW50c1tpXSk7Ci0JCQkJamF2YVNvdXJjZVBhdGhzLmFkZChwYXRoKTsKLQkJCX0KLQkJCXJldHVybiAoSVBhdGhbXSlqYXZhU291cmNlUGF0aHMudG9BcnJheShuZXcgSVBhdGhbMF0pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgYnVpbGQgc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4KLQkgKiBhcyBhbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4sIG9yIG51bGwgaWYgdGhlIHByb2plY3QgZWl0aGVyCi0JICogaGFzIG5vIEphdmEgbmF0dXJlIG9yIGlmIHRoZSBwcm9qZWN0J3MgYnVpbGQgY2xhc3NwYXRoIGNvbnRhaW5zIG5vCi0JICogZm9sZGVycyBsb2NhbCB0byB0aGUgcHJvamVjdC4gSWYgdGhlIHByb2plY3QgaGFzIG1vcmUgdGhhbiBvbmUgb2YgaXRzIG93bgotCSAqIGZvbGRlcnMgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCwgdGhlbiBvbmUgb2YgdGhlbSBpcyBjaG9zZW4gYXJiaXRyYXJpbHkgYXMKLQkgKiB0aGUgYnVpbGQgc291cmNlIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIEEgYnVpbGQgc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4KLQkgKiAgICAgICAgIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIEphdmEgbmF0dXJlIG9yIGlmIHRoZSBwcm9qZWN0J3MKLQkgKiAgICAgICAgIGJ1aWxkIGNsYXNzcGF0aCBjb250YWlucyBubyBmb2xkZXJzIGxvY2FsIHRvIHRoZSBwcm9qZWN0LgotCSAqICAgICAgICAgCi0JICogQGRlcHJlY2F0ZWQgbm90IHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldEphdmFTb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IG51bGw7Ci0JCUlQYXRoIGphdmFTb3VyY2VMb2NhdGlvbiA9IGdldEphdmFTb3VyY2VMb2NhdGlvbihwcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZUZyYWdtZW50Um9vdCA9IGphdmFQcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290KGphdmFTb3VyY2VMb2NhdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cyBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgYW4KLQkgKiBhcnJheSBvZiA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4gb2JqZWN0cy4gSWYgdGhlIHByb2plY3QgaGFzCi0JICogbm8gSmF2YSBuYXR1cmUgdGhlbiB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBiZSBvZiBsZW5ndGggemVyby4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUaGUgcGFja2FnZSBmcmFnbWVudCByb290cyBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdAotCQkJCQkJLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3RzOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGQgY2xhc3NwYXRoIGVudHJpZXMgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFzIGFuCi0JICogYXJyYXkgb2YgPGNvZGU+SUNsYXNzcGF0aEVudHJ5PC9jb2RlPiBvYmplY3RzLiBJZiB0aGUgcHJvamVjdCBoYXMgbm8KLQkgKiBKYXZhIG5hdHVyZSB0aGVuIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIG9mIGxlbmd0aCB6ZXJvLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGggZW50cmllcyBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4uCi0JICogCi0JICogQGRlcHJlY2F0ZWQgbm90IHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeVtdIGdldEphdmFDbGFzc3BhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQkJcmV0dXJuIGNsYXNzcGF0aEVudHJpZXM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldFdlYkNvbXBvbmVudFNlcnZlclJvb3QoSVByb2plY3QgcHJvamVjdCl7Ci0JCQotICAgICAgSUZvbGRlciB3ZWJNb2R1bGVTZXJ2ZXJSb290ID0gbnVsbDsKLSAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0gICAgICBpZiAodmMuZXhpc3RzKCkpCi0gICAgICAgIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBKMkVFVXRpbHMuZ2V0T3V0cHV0Q29udGFpbmVyUm9vdCh2Yyk7Ci0KLQkgIHJldHVybiB3ZWJNb2R1bGVTZXJ2ZXJSb290OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBvZiB0aGUKLQkgKiBwcm9qZWN0IGluIGEgc2VydmVyIGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUgb3IKLQkgKiBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqICAgICAgICAgbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0V2ViQ29tcG9uZW50VVJMKC4uKSB3aGljaCBiZWxvbmdzIGluIFNlcnZlclV0aWxzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViUHJvamVjdFVSTChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgSVNlcnZlciBzZXJ2ZXIpIHsKLQotCQlTdHJpbmcgd2ViUHJvamVjdFVSTCA9IG51bGw7Ci0JCUlNb2R1bGUgbW9kdWxlID0gZ2V0TW9kdWxlKHByb2plY3QpOwotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXIgc2VydmVySW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUobW9kdWxlLAotCQkJCQlzZXJ2ZXJGYWN0b3J5SWQsIHNlcnZlciwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlpZiAoc2VydmVySW5zdGFuY2UgIT0gbnVsbCkgewotLy8JCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBzZXJ2ZXJJbnN0YW5jZS5nZXREZWxlZ2F0ZSgpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZSk7Ci0JCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKXNlcnZlckluc3RhbmNlLmdldEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzKSkuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGUpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcyA9IHVybC50b1N0cmluZygpOwotCQkJCQl3ZWJQcm9qZWN0VVJMID0gKHMuZW5kc1dpdGgoIi8iKSA/IHMuc3Vic3RyaW5nKDAsIHMKLQkJCQkJCQkubGVuZ3RoKCkgLSAxKSA6IHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJSUxvZyBsb2cgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUxvZygpOwotCQlsb2cubG9nKElMb2cuSU5GTywgNTAzNiwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFdlYlByb2plY3RVUkwiLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIix3ZWJQcm9qZWN0VVJMPSIgKyB3ZWJQcm9qZWN0VVJMKTsKLQotCQlyZXR1cm4gd2ViUHJvamVjdFVSTDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9yZ2VkIFVSTCBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdAotCSAqIG9mIHRoZSBwcm9qZWN0IGluIGEgc2VydmVyIGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqIG5hdHVyZSBvciBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIFRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290IFVSTCBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBXZWIKLQkgKiAgICAgICAgIG5hdHVyZSBvciBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogQGRlcHJlY2F0ZWQgIG5vdCB1c2VkCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JnZWRXZWJQcm9qZWN0VVJMKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKXsKLS8vICAJCi0vLyAgCVN0cmluZyB3ZWJQcm9qZWN0VVJMID0gbnVsbDsKLS8vICAJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUocHJvamVjdCk7Ci0vLyAgCWlmIChtb2R1bGUgIT0gbnVsbCkKLS8vICAJewotLy8gIAkJLy9JU2VydmVyIHNlcnZlckluc3RhbmNlID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyRm9yTW9kdWxlKG1vZHVsZSwKLS8vCQkgIC8vIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vICAJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLS8vICAJCXsKLS8vICAJCQlTdHJpbmcgaG9zdG5hbWUgPSBzZXJ2ZXIuZ2V0SG9zdCgpOwotLy8KLS8vICAJCQkvLyBnZXQgU2VydmVyUG9ydAotLy8gIAkJCWludCBwb3J0TnVtYmVyID0gMDsKLS8vCi0vLyAgCSAgICAgICAgICBTZXJ2ZXJQb3J0W10gcG9ydHMgPSBzZXJ2ZXIuZ2V0U2VydmVyUG9ydHMobnVsbCk7Ci0vLyAgCSAgICAgICAgICBTZXJ2ZXJQb3J0IHBvcnQgPSBudWxsOwotLy8gIAkgICAgICAgICAgZm9yIChpbnQgaXQgPSAwOyBpdDxwb3J0cy5sZW5ndGg7IGl0KyspCi0vLyAgCSAgICAgICAgICB7Ci0vLyAgCSAgICAgICAgICAgIFNlcnZlclBvcnQgcCA9IHBvcnRzW2l0XTsKLS8vICAJICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gcC5nZXRQcm90b2NvbCgpOwotLy8gIAkgICAgICAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiBwcm90b2NvbC50cmltKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoImh0dHAiKSkKLS8vICAJICAgICAgICAgICAgewotLy8gIAkgICAgICAgICAgICAgIHBvcnQgPSBwOwotLy8gIAkgICAgICAgICAgICAgIHBvcnROdW1iZXIgPSBwLmdldFBvcnQoKTsKLS8vICAJICAgICAgICAgICAgICBicmVhazsKLS8vICAJICAgICAgICAgICAgfQotLy8gIAkgICAgICAgICAgfQotLy8gIAkgICAgICAgICAgCi0vLyAgCSAgICAgICAgCi0vLyAgCSAgICAgICAgCi0vLyAgCSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0vLyAgCSAgICAgICAgdHJ5IHsKLS8vICAJICAgICAgICAJdXJsID0gbmV3IFVSTCgiaHR0cCIsIGhvc3RuYW1lLCBwb3J0TnVtYmVyLCAiIik7Ci0vLyAgCSAgICAgICAgfQotLy8gIAkgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKLS8vICAJICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vICAJICAgICAgICB9Ci0vLwotLy8gIAkgICAgICAgIAotLy8gIAkJCS8vVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBzZXJ2ZXJJbnN0YW5jZS5nZXREZWxlZ2F0ZSgpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZSk7Ci0vLyAgCQkJCi0vLyAgCQkJaWYgKHVybCAhPSBudWxsKQotLy8gIAkJCXsKLS8vICAJCQkJU3RyaW5nIHMgPSB1cmwudG9TdHJpbmcoKTsKLS8vICAJCQkJd2ViUHJvamVjdFVSTCA9IHMgKyAiLyIrcHJvamVjdC5nZXROYW1lKCk7Ci0vLyAgCQkJCS8vd2ViUHJvamVjdFVSTCA9IChzLmVuZHNXaXRoKCIvIikgPyBzLnN1YnN0cmluZygwLHMubGVuZ3RoKCktMSkgOiBzKTsKLS8vICAJCQl9Ci0vLyAgCQl9Ci0vLyAgCX0KLS8vIAlJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0vLyAgICBsb2cubG9nKElMb2cuSU5GTywgNTAzNiwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFdlYlByb2plY3RVUkwiLCAicHJvamVjdD0iK3Byb2plY3QrIix3ZWJQcm9qZWN0VVJMPSIrd2ViUHJvamVjdFVSTCk7Ci0vLyAgCXJldHVybiB3ZWJQcm9qZWN0VVJMOyAgCQotLy8gIH0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3Qgb2YgdGhlCi0JICogcHJvamVjdCBpbiBhIHNlcnZlciBpbnN0YW5jZSBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBXZWIgbmF0dXJlIG9yCi0JICogaGFzIG5vIGFzc29jaWF0aW9uIHRvIGEgc2VydmVyIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290IFVSTCBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBXZWIKLQkgKiAgICAgICAgIG5hdHVyZSBvciBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogQGRlcHJlY2F0ZWQgYmVsb25ncyBpbiBTZXJ2ZXJVdGlscwotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViUHJvamVjdFVSTChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyB3ZWJQcm9qZWN0VVJMID0gbnVsbDsKLQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUocHJvamVjdCk7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJSVNlcnZlciBzZXJ2ZXJJbnN0YW5jZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlckZvck1vZHVsZShtb2R1bGUpOwotCQkJaWYgKHNlcnZlckluc3RhbmNlICE9IG51bGwpIHsKLQkJCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpc2VydmVySW5zdGFuY2UuZ2V0QWRhcHRlcihJVVJMUHJvdmlkZXIuY2xhc3MpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZSk7Ci0JCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzID0gdXJsLnRvU3RyaW5nKCk7Ci0JCQkJCXdlYlByb2plY3RVUkwgPSAocy5lbmRzV2l0aCgiLyIpID8gcy5zdWJzdHJpbmcoMCwgcwotCQkJCQkJCS5sZW5ndGgoKSAtIDEpIDogcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlMb2cgbG9nID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhJTG9nLklORk8sIDUwMzcsIFJlc291cmNlVXRpbHMuY2xhc3MsICJnZXRXZWJQcm9qZWN0VVJMIiwKLQkJCQkicHJvamVjdD0iICsgcHJvamVjdCArICIsd2ViUHJvamVjdFVSTD0iICsgd2ViUHJvamVjdFVSTCk7Ci0KLQkJcmV0dXJuIHdlYlByb2plY3RVUkw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIGJlIGluIFNlcnZlclV0aWxzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RlZFdlYlByb2plY3RVUkwoSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcgdXJsID0gZ2V0V2ViUHJvamVjdFVSTChwcm9qZWN0KTsKLQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZ0J1ZmZlciBlbmNvZGVkVVJMID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWVuY29kZWRVUkwuYXBwZW5kKHVybC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGN0eHRSb290ID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsLnN1YnN0cmluZyhpbmRleCArIDEsIHVybC5sZW5ndGgoKSksICJVVEYtOCIpOwotCQkJCQlpbnQgcGx1c0luZGV4ID0gY3R4dFJvb3QuaW5kZXhPZignKycpOwotCQkJCQl3aGlsZSAocGx1c0luZGV4ICE9IC0xKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlzYi5hcHBlbmQoY3R4dFJvb3Quc3Vic3RyaW5nKDAsIHBsdXNJbmRleCkpOwotCQkJCQkJc2IuYXBwZW5kKCIlMjAiKTsKLQkJCQkJCXNiLmFwcGVuZChjdHh0Um9vdC5zdWJzdHJpbmcocGx1c0luZGV4ICsgMSwgY3R4dFJvb3QKLQkJCQkJCQkubGVuZ3RoKCkpKTsKLQkJCQkJCWN0eHRSb290ID0gc2IudG9TdHJpbmcoKTsKLQkJCQkJCXBsdXNJbmRleCA9IGN0eHRSb290LmluZGV4T2YoJysnKTsKLQkJCQkJfQotCQkJCQllbmNvZGVkVVJMLmFwcGVuZChjdHh0Um9vdCk7Ci0JCQkJfWNhdGNoIChJT0V4Y2VwdGlvbiBpbyl7Ci0JCQkJCS8vaGFuZGxlciBleGNlcHRpb24KLQkJCQl9CQkJCQotCQkJCXVybCA9IGVuY29kZWRVUkwudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IG9mIGEgSmF2YSByZXNvdXJjZSwgcmV0dXJucyB0aGUKLQkgKiBwYWNrYWdlIG5hbWUgb2YgdGhlIHJlc291cmNlIG9yIG51bGwgaWYgdGhlIHJlc291cmNlIGlzIG5vdCBwcm9wZXJseQotCSAqIGxvY2F0ZWQgaW4gYSBwcm9qZWN0IG9yIGZvbGRlciBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG9yIHRoYXQgaXMgdGhlCi0JICogYnVpbGQgb3V0cHV0IHBhdGguCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIEphdmEgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBKYXZhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKElQYXRoIGFic29sdXRlUGF0aCkgewotCQl0cnkgewotCQkJSVBhdGggamF2YUZvbGRlclBhdGggPSBhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RPZihhYnNvbHV0ZVBhdGgpOwotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gamF2YVByb2plY3QKLQkJCQkJCS5maW5kUGFja2FnZUZyYWdtZW50KGphdmFGb2xkZXJQYXRoKTsKLQkJCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQl9Ci0JCQkJSVBhdGggb3V0cHV0UGF0aCA9IGdldEphdmFPdXRwdXRMb2NhdGlvbihwcm9qZWN0KTsKLQkJCQlpZiAob3V0cHV0UGF0aC5pc1ByZWZpeE9mKGphdmFGb2xkZXJQYXRoKSkgewotCQkJCQlJUGF0aCBqYXZhUGFja2FnZVBhdGggPSBqYXZhRm9sZGVyUGF0aAotCQkJCQkJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKG91dHB1dFBhdGguc2VnbWVudENvdW50KCkpOwotCQkJCQlyZXR1cm4gamF2YVBhY2thZ2VQYXRoLmlzRW1wdHkoKSA/IG51bGwgOiBqYXZhUGFja2FnZVBhdGgKLQkJCQkJCQkudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gb2YgYSBKYXZhIHJlc291cmNlLCByZXR1cm5zIHRoZQotCSAqIHBhY2thZ2UgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYXMgYSByZWxhdGl2ZSBwYXRobmFtZSBvciBudWxsIGlmIHRoZQotCSAqIHJlc291cmNlIGlzIG5vdCBwcm9wZXJseSBsb2NhdGVkIGluIGEgcHJvamVjdCBvciBmb2xkZXIgb24gdGhlIGJ1aWxkCi0JICogY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBKYXZhIHJlc291cmNlLgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgSmF2YSByZXNvdXJjZSBhcyBhIHJlbGF0aXZlIHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlUGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gUmVzb3VyY2VVdGlscwotCQkJCS5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZShhYnNvbHV0ZVBhdGgpOwotCQlyZXR1cm4gKHBhY2thZ2VOYW1lID09IG51bGwgPyBudWxsIDogbmV3IFBhdGgocGFja2FnZU5hbWUucmVwbGFjZSgnLicsCi0JCQkJSVBhdGguU0VQQVJBVE9SKSkpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IG9mIGEgSmF2YSByZXNvdXJjZSwgcmV0dXJucyB0aGUKLQkgKiBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IGlzIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggb3IKLQkgKiBpcyB0aGUgYnVpbGQgb3V0cHV0IHBhdGggYW5kIHRoYXQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhCi0JICogcmVzb3VyY2UsIG9yIG51bGwgaWYgbm8gc3VjaCBwcm9qZWN0IG9yIGZvbGRlciBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIEphdmEgcmVzb3VyY2UuCi0JICogQHJldHVybiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcHJvamVjdCBvciBmb2xkZXIgY29udGFpbmluZyB0aGUgZnVsbHkKLQkgKiAgICAgICAgIHF1YWxpZmllZCBKYXZhIHJlc291cmNlLgotCSAqIEBkZXByZWNhdGVkIG5vdCB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUmVzb3VyY2VSb290UGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0T2YoYWJzb2x1dGVQYXRoKTsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwZnJzID0gamF2YVByb2plY3QKLQkJCQkJCS5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGZycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUmVzb3VyY2UgZnJhZ21lbnRSb290ID0gcGZyc1tpXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQkJaWYgKGZyYWdtZW50Um9vdCAhPSBudWxsKSB7Ci0JCQkJCQlJUGF0aCBmcmFnbWVudFBhdGggPSBmcmFnbWVudFJvb3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCWlmIChmcmFnbWVudFBhdGguaXNQcmVmaXhPZihhYnNvbHV0ZVBhdGgpKSB7Ci0JCQkJCQkJcmV0dXJuIGZyYWdtZW50UGF0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dExvY2F0aW9uKHByb2plY3QpOwotCQkJCWlmIChvdXRwdXRQYXRoLmlzUHJlZml4T2YoYWJzb2x1dGVQYXRoKSkgewotCQkJCQlyZXR1cm4gb3V0cHV0UGF0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBhbiBVUkwgKEhUVFAgb3IgRklMRSkgdG8gYW4gRWNsaXBzZSByZXNvdXJjZSwgcmV0dXJuaW5nIHRoZQotCSAqIFVSTCBzdHJpbmcgaWYgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiBBIHZhbHVlIG9mIG51bGwgd2lsbAotCSAqIGRlZmluaXRlbHkgYmUgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbm90IG1ldDoKLQkgKiA8b2w+Ci0JICogPGxpPlRoZSBhYnNvbHV0ZSBwYXRoIGJlZ2lucyB3aXRoIGEgV2ViIFByb2plY3QuCi0JICogPGxpPlRoZSBsZWFkaW5nIHBvcnRpb24gb2YgdGhlIGFic29sdXRlIHBhdGggbWF0Y2hlcyB0aGUgcGF0aCBvZiB0aGUKLQkgKiBjb250YWluZXIgcmV0dXJuZWQgYnkgeyNsaW5rICNnZXRXZWJNb2R1bGVTZXJ2ZXJSb290Ci0JICogZ2V0V2ViTW9kdWxlU2VydmVyUm9vdH0gZm9yIHRoZSBwcm9qZWN0LgotCSAqIDxsaT5UaGUgcGF0aCBkb2VzIG5vdCBsZWFkIHRvIHRoZSBXRUItSU5GIGZvbGRlciBvciBhbnkgZGVzY2VuZGVudAotCSAqIHRoZXJlb2YuCi0JICogPGxpPlRoZSBXZWIgUHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZXhwbGljaXQgb3IgZGVmYXVsdCBzZXJ2ZXIKLQkgKiBpbnN0YW5jZS4KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSBVUkwgb2YgdGhlIGZpbGUsIG9yIG51bGwgaWYgbm8gVVJMIGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqIEBkZXByZWNhdGVkIG5vdCB1c2VkCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUkxGcm9tUGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgsCi0vLwkJCVN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0vLwkJcmV0dXJuIGdldFVSTEZyb21QYXRoKGFic29sdXRlUGF0aCwgZ2V0V2ViUHJvamVjdFVSTCgKLS8vCQkJCWdldFByb2plY3RPZihhYnNvbHV0ZVBhdGgpLCBzZXJ2ZXJGYWN0b3J5SWQsIHNlcnZlcikpOwotLy8JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqIEBwYXJhbSB3ZWJQcm9qZWN0VVJMCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIG5vdCB1c2VkCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUkxGcm9tUGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgsIFN0cmluZyB3ZWJQcm9qZWN0VVJMKSB7Ci0vLwkJU3RyaW5nQnVmZmVyIHVybCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdE9mKGFic29sdXRlUGF0aCk7Ci0vLwkJSUNvbnRhaW5lciB3ZWJNb2R1bGVTZXJ2ZXJSb290ID0gZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KTsKLS8vCQlpZiAod2ViTW9kdWxlU2VydmVyUm9vdCAhPSBudWxsKSB7Ci0vLwkJCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3RQYXRoID0gd2ViTW9kdWxlU2VydmVyUm9vdC5nZXRGdWxsUGF0aCgpOwotLy8JCQlpZiAod2ViTW9kdWxlU2VydmVyUm9vdFBhdGguaXNQcmVmaXhPZihhYnNvbHV0ZVBhdGgpKSB7Ci0vLwkJCQlpbnQgbnVtU2VnbWVudCA9IHdlYk1vZHVsZVNlcnZlclJvb3RQYXRoLnNlZ21lbnRDb3VudCgpOwotLy8JCQkJaW50IG51bVNlZ21lbnRGcm9tUGF0aCA9IGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKTsKLS8vCQkJCWlmIChudW1TZWdtZW50RnJvbVBhdGggPiBudW1TZWdtZW50KSB7Ci0vLwkJCQkJU3RyaW5nIG5leHRTZWdtZW50ID0gYWJzb2x1dGVQYXRoLnNlZ21lbnQobnVtU2VnbWVudCk7Ci0vLwkJCQkJLy8gY2hlY2sgaWYgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIFdlYk1vZHVsZVNlcnZlclJvb3QgaXMKLS8vCQkJCQkvLyBXRUItSU5GIChpZ25vcmluZyBjYXNlKQotLy8JCQkJCWlmIChuZXh0U2VnbWVudCAhPSBudWxsCSYmICFuZXh0U2VnbWVudC5lcXVhbHNJZ25vcmVDYXNlKCJXRUItSU5GIikpIHsKLS8vCQkJCQkJSVBhdGggcmVsYXRpdmVQYXRoID0gYWJzb2x1dGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobnVtU2VnbWVudCk7Ci0vLwkJCQkJCWlmICh3ZWJQcm9qZWN0VVJMICE9IG51bGwpCi0vLwkJCQkJCQl1cmwuYXBwZW5kKHdlYlByb2plY3RVUkwpLmFwcGVuZChJUGF0aC5TRVBBUkFUT1IpLmFwcGVuZChyZWxhdGl2ZVBhdGgudG9TdHJpbmcoKSk7Ci0vLwkJCQkJfQotLy8JCQkJfSBlbHNlIGlmIChudW1TZWdtZW50RnJvbVBhdGggPT0gbnVtU2VnbWVudCkKLS8vCQkJCQl1cmwuYXBwZW5kKHdlYlByb2plY3RVUkwpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWlmICh1cmwubGVuZ3RoKCkgPCAxKSB7Ci0vLwkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IGdldFdvcmtzcGFjZVJvb3QoKTsKLS8vCQkJdXJsLmFwcGVuZChnZXRSZXNvdXJjZVVSSSh3b3Jrc3BhY2UuZ2V0RmlsZShhYnNvbHV0ZVBhdGgpKSk7Ci0vLwkJfQotLy8JCUlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLS8vCQlsb2cubG9nKElMb2cuSU5GTywgNTAzOCwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFVSTEZyb21QYXRoIiwKLS8vCQkJCSJhYnNvbHV0ZVBhdGg9IiArIGFic29sdXRlUGF0aCArICIsdXJsPSIgKyB1cmwpOwotLy8KLS8vCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYSBzZXQgb2YgZmlsZXMgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbiB0byBhIG5hdGl2ZQotCSAqIGRpcmVjdG9yeS4gVGhlIGZpbGVzIGFyZSBuYW1lZCBpbiBhbiBpbmRleCBmaWxlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlCi0JICogcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBpbmRleFBhdGhuYW1lCi0JICogICAgICAgICAgICBBIGZpbGUgY29udGFpbmluZyBhIHdoaXRlc3BhY2UtZGVsaW1pdHRlZCBsaXN0IG9mIHBhdGhuYW1lcyBvZgotCSAqICAgICAgICAgICAgdGhlIGZpbGVzIHRvIGNvcHkuIFRoZSBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgbmF0aXZlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgZmlsZXMKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWVzIG9mIHRoZSBmaWxlcyBuYW1lZCBpbgotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmluZGV4UGF0aG5hbWU8L2NvZGU+IGZpbGUgYXJlIHByZXNlcnZlZC4gTXVzdCBub3QKLQkgKiAgICAgICAgICAgIGJlIG51bGwuCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFuIElPIGVycm9yIGhhcyBvY2N1cmVkLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5SW5kZXhlZEZpbGVzVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJSVBhdGggaW5kZXhQYXRobmFtZSwgSVBhdGggdGFyZ2V0UGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKGluZGV4UGF0aG5hbWUpOwotCQlFbnVtZXJhdGlvbiBmaWxlbmFtZXMgPSBTdHJpbmdVdGlscy5wYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0oaW5wdXQpOwotCQljb3B5RW51bWVyYXRlZEZpbGVzVG9PUyhwbHVnaW4sIHNvdXJjZVBhdGgsIGZpbGVuYW1lcywgdGFyZ2V0UGF0aCwKLQkJCQlwcm9ncmVzc01vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhIHNldCBvZiBmaWxlcyBmcm9tIGEgcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHRvIGEgbmF0aXZlCi0JICogZGlyZWN0b3J5LiBUaGUgZmlsZXMgYXJlIG5hbWVkIGluIGFuIGVudW1lcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBwYXRobmFtZXMKLQkgKiAgICAgICAgICAgIEFuIGVudW1lcmF0aW9uIG9mIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgdG8gY29weS4gVGhlCi0JICogICAgICAgICAgICBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW4gc291cmNlUGF0aDwvY29kZT4uCi0JICogICAgICAgICAgICBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgbmF0aXZlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgZmlsZXMKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWVzIG9mIHRoZSBmaWxlcyBuYW1lZCBpbgotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPnBhdGhuYW1lczwvY29kZT4gZW51bWVyYXRpb24gYXJlIHByZXNlcnZlZC4gTXVzdAotCSAqICAgICAgICAgICAgbm90IGJlIG51bGwuCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFuIElPIGVycm9yIGhhcyBvY2N1cmVkLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRlZEZpbGVzVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJRW51bWVyYXRpb24gcGF0aG5hbWVzLCBJUGF0aCB0YXJnZXRQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdoaWxlIChwYXRobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpIHBhdGhuYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJY29weUZpbGVUb09TKHBsdWdpbiwgc291cmNlUGF0aCwgbmV3IFBhdGgoZmlsZW5hbWUpLCB0YXJnZXRQYXRoLAotCQkJCQlwcm9ncmVzc01vbml0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGEgZmlsZSBmcm9tIGEgcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHRvIGEgbmF0aXZlCi0JICogZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBwYXRobmFtZQotCSAqICAgICAgICAgICAgVGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGNvcHkuIFRoZSBwYXRobmFtZSBpcyByZWxhdGl2ZSB0bwotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPnBsdWdpbiBzb3VyY2VQYXRoPC9jb2RlPi4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gdGFyZ2V0UGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG5hdGl2ZSBkaXJlY3RvcnkgdG8gd2hpY2ggdGhlIGZpbGUKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgaXMKLQkgKiAgICAgICAgICAgIHByZXNlcnZlZC4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGluZGljYXRpbmcgYW4gSU8gZXJyb3IgaGFzIG9jY3VyZWQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGNvcHlGaWxlVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJSVBhdGggcGF0aG5hbWUsIElQYXRoIHRhcmdldFBhdGgsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVBhdGggdGFyZ2V0ID0gdGFyZ2V0UGF0aC5hcHBlbmQocGF0aG5hbWUpOwotCQlJUGF0aCBzb3VyY2UgPSBzb3VyY2VQYXRoID09IG51bGwgPyBwYXRobmFtZSA6IHNvdXJjZVBhdGgKLQkJCQkuYXBwZW5kKHBhdGhuYW1lKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShzb3VyY2UpOwotCQlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0LnRvT1NTdHJpbmcoKSk7Ci0JCWNvcHlTdHJlYW0oaW5wdXQsIG91dHB1dCk7Ci0JCWlucHV0LmNsb3NlKCk7Ci0JCW91dHB1dC5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBkYXRhIGZyb20gb25lIHN0cmVhbSB0byBhbm90aGVyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgVGhlIGlucHV0IHN0cmVhbS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcgZWl0aGVyIG9mCi0JICogICAgICAgICAgICAgdGhlIHN0cmVhbXMuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBpbnQgY29weVN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCB0ID0gMDsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQlpbnQgbiA9IGlucHV0LnJlYWQoYnVmZmVyKTsKLQkJd2hpbGUgKG4gPj0gMCkgewotCQkJb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgbik7Ci0JCQl0ICs9IG47Ci0JCQluID0gaW5wdXQucmVhZChidWZmZXIpOwotCQl9Ci0JCXJldHVybiB0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuYXRpdmUgZGlyZWN0b3J5IHBhdGggZXF1YWwgdG8gdGhlIHBhcmVudCBwb3J0aW9uIG9mIHRoZSBnaXZlbgotCSAqIDxjb2RlPnBhdGhuYW1lPC9jb2RlPi4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgdGhlbiBubyBhY3Rpb24KLQkgKiBpcyB0YWtlbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSB3aG9zZSBwYXJlbnQgZGlyZWN0b3J5IHNob3VsZCBiZQotCSAqICAgICAgICAgICAgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIG9jY3Vycy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgY3JlYXRlUGFyZW50RGlyZWN0b3J5Rm9yKFN0cmluZyBwYXRobmFtZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGhuYW1lKTsKLQkJRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uCi0JICogQHJldHVybiBJUmVzb3VyY2UgaWYgdGhlIHNlbGVjdGlvbiByZXByZXNlbnRzIGFuIElSZXNvdXJjZS4gUmV0dXJucyBudWxsCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKE9iamVjdCBvYmopCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotCQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpIG9iajsKLQkJCQlyZXMgPSBqYXZhRWxlbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKLQkJCQlFbnRlcnByaXNlQmVhbiBlamJCZWFuID0gKEVudGVycHJpc2VCZWFuKSBvYmo7Ci0JCQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlamJCZWFuKTsKLQkJCQlpZiAoZWpiUHJvamVjdCAhPSBudWxsKQotCQkJCQlyZXMgPSBlamJQcm9qZWN0OwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIE5hdWdodHkgYml0cy4uLgotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLy8KLQkvLyBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotCS8vIERvIG5vdCBjYWxsIHdpdGggYW4gYWJzb2x1dGVQYXRoIG9mIGxlc3MgdGhhbiBvbmUgc2VnbWVudC4KLQkvLwotCS8vICBwcml2YXRlIHN0YXRpYyBJQ29udGFpbmVyIG1ha2VGb2xkZXJQYXRoICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJUGF0aCBhYnNvbHV0ZVBhdGgsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPD0gMSkKLQkvLyAgICB7Ci0JLy8gICAgICByZXR1cm4gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoYWJzb2x1dGVQYXRoLnNlZ21lbnQoMCkpOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgewotCS8vICAgICAgSUNvbnRhaW5lciBwYXJlbnQgPSBtYWtlRm9sZGVyUGF0aChyZXNvdXJjZUNvbnRleHQsCi0JLy8gYWJzb2x1dGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIFN0cmluZyBmb2xkZXJOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JLy8gICAgICByZXR1cm4gbWFrZUZvbGRlcihyZXNvdXJjZUNvbnRleHQsIHBhcmVudCxmb2xkZXJOYW1lLCBwcm9ncmVzc01vbml0b3IgLAotCS8vIHN0YXR1c01vbml0b3IpOwotCS8vICAgIH0KLQkvLyAgfQotCS8vCi0JLy8gQ3JlYXRlcyBhIGZvbGRlciB1bmRlciBhIGNvbnRhaW5lci4KLQkvLyBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLQkvLwotCS8vIHByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0JLy8gICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgSUNvbnRhaW5lciBwYXJlbnQsCi0JLy8gICAgU3RyaW5nIGZvbGRlck5hbWUsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIElSZXNvdXJjZSBjaGlsZCA9IHBhcmVudC5maW5kTWVtYmVyKGZvbGRlck5hbWUpOwotCS8vICAgIGlmIChjaGlsZCA9PSBudWxsKQotCS8vICAgIHsKLQkvLyAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSkgewotCS8vICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMobmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlUGx1Z2luLklELDAsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRk9MREVSX0NSRUFUSU9OX0RJU0FCTEVEIiwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmb2xkZXJOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JLy8KLQkvLyAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQodHJ1ZSk7Ci0JLy8KLQkvLyAgICAgIH0KLQkvLyAgICAgIElGb2xkZXIgZm9sZGVyID0gcGFyZW50LmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0JLy8gICAgICBmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxwcm9ncmVzc01vbml0b3IpOwotCS8vICAgICAgcmV0dXJuIGZvbGRlcjsKLQkvLyAgICB9Ci0JLy8gICAgZWxzZSBpZiAoY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpCi0JLy8gICAgewotCS8vICAgICAgcmV0dXJuIChJRm9sZGVyKWNoaWxkOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgewotCS8vICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZVBsdWdpbi5JRCwwLFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSIixuZXcKLQkvLyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZvbGRlck5hbWUpLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0JLy8gICAgfQotCS8vICB9Ci0KLQkvLwotCS8vIENyZWF0ZXMgYSBmaWxlIHVuZGVyIGEgY29udGFpbmVyLgotCS8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotCS8vCi0JLy8gcHJpdmF0ZSBzdGF0aWMgSUZpbGUgbWFrZUZpbGUgKAotCS8vICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgSUNvbnRhaW5lciBwYXJlbnQsCi0JLy8gICAgU3RyaW5nIGZpbGVOYW1lLAotCS8vICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICBJUmVzb3VyY2UgY2hpbGQgPSBwYXJlbnQuZmluZE1lbWJlcihmaWxlTmFtZSk7Ci0JLy8gICAgaWYgKGNoaWxkICE9IG51bGwpCi0JLy8gICAgewotCS8vICAgICAgaWYgKGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgaWYgKCFyZXNvdXJjZUNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSkgewotCS8vICAgICAgICAgIGludCByZXN1bHQgPSBzdGF0dXNNb25pdG9yLnJlcG9ydFN0YXR1cyggbmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlUGx1Z2luLklELDAsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLGZpbGVOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vCi0JLy8gICAgICAgICAgaWYgKHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCS8vCi0JLy8gICAgICAgICAgaWYgKCByZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLQkvLyAgICAgICAgfQotCS8vICAgICAgICAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLQkvLyAgICAgICAgaWYgKGNoaWxkLmlzUmVhZE9ubHkoKSkKLQkvLyAgICAgICAgewotCS8vICAgICAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSkgewotCS8vCi0JLy8gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLGZpbGVOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vCi0JLy8gICAgICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JLy8KLQkvLyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29udGV4dC5zZXRDaGVja291dEZpbGVzRW5hYmxlZCh0cnVlKTsKLQkvLyAgICAgICAgICB9Ci0JLy8KLQkvLyAgICAgICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotCS8vICAgICAgICAgIGZpbGVzWzBdID0gKElGaWxlKWNoaWxkOwotCS8vCi0JLy8gICAgICAgICAgaWYgKAotCS8vICFzdGF0dXNNb25pdG9yLnJlcG9ydFN0YXR1cyhnZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsbnVsbCkpKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQkvLyAgICAgICAgfQotCS8vCi0JLy8gICAgICAgIC8vQ2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZXhpc3RpbmcgZmlsZS4KLQkvLyAgICAgICAgICAgIElGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwotCS8vICAgICAgICBmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLHRydWUsdHJ1ZSxwcm9ncmVzc01vbml0b3IpOwotCS8vICAgICAgICByZXR1cm4gZmlsZTsKLQkvLwotCS8vICAgICAgfQotCS8vICAgICAgZWxzZQotCS8vICAgICAgewotCS8vICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlUGx1Z2luLklELDAsV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFIixuZXcKLQkvLyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZpbGVOYW1lKX0pLG51bGwpKTsKLQkvLyAgICAgIH0KLQkvLyAgICB9Ci0JLy8gICAgZWxzZQotCS8vICAgIHsKLQkvLyAgICAgICAgLy9DcmVhdGUgYSBuZXcgZmlsZS4KLQkvLyAgICAgICAgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKG5ldyBQYXRoKGZpbGVOYW1lKSk7Ci0JLy8gICAgICAgIGZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLHRydWUscHJvZ3Jlc3NNb25pdG9yKTsKLQkvLyAgICAgICAgcmV0dXJuIGZpbGU7Ci0JLy8gICAgfQotCS8vICB9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4gVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUgLQotCSAqICAgICAgICAgICAgdGhlIElGaWxlIHRvIGJlIGRlbGV0ZWQKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHN0YXR1c01vbml0b3IKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcwotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuIEZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQkvLyAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUgKAotCS8vICAgICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCS8vICAgIElGaWxlIGZpbGUsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yICkKLQkvLyAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICAgIHsKLQkvLyAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCi0JLy8gICAgICAgIHsKLQkvLyAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKSB7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10KLQkvLyB7ZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksZmlsZS5nZXROYW1lKCl9KSxudWxsKSwKLQkvLyBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSk7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKHRydWUpOwotCS8vICAgICAgICAgICAgICAgICAgICAgICAgfQotCS8vICAgICAgICAgICAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotCS8vICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzUmVhZE9ubHkoKSkKLQkvLyAgICAgICAgICAgICAgICB7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpIHsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRCIsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXQotCS8vIHtmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmaWxlLmdldE5hbWUoKX0pLG51bGwpLAotCS8vIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpKTsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbMV07Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1swXSA9IGZpbGU7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKLQkvLyAhc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLG51bGwpKSkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCS8vICAgICAgICAgICAgICAgIH0KLQkvLyAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSh0cnVlLHByb2dyZXNzTW9uaXRvcik7Ci0JLy8gICAgICAgICAgICAgICAgfQotCS8vICAgICAgICAvL0F0IHRoaXMgcG9pbnQsIGVpdGhlciB0aGUgZmlsZSBkaWQgbm90IGV4aXN0IG9yIHdlIHN1Y2Nlc3NmdWxseSBkZWxldGVkCi0JLy8gaXQuIFJldHVybiBzdWNjZXNzLgotCS8vICAgICAgICByZXR1cm4gdHJ1ZTsKLQkvLyAgfQotCS8qKgotCSAqIERlbGV0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGZvbGRlciAtCi0JICogICAgICAgICAgICB0aGUgSUZvbGRlciB0byBiZSBkZWxldGVkCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcwotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgYWxvbmcgd2l0aCBpdHMgbWVtYmVycy4gRmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCS8vICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRm9sZGVyICgKLQkvLyAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCS8vICAgIElGb2xkZXIgZm9sZGVyLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgcmV0dXJuIHRydWU7Ci0JLy8KLQkvLyAgICBib29sZWFuIGRlbGV0ZWQgPSB0cnVlOwotCS8vICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0JLy8gICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykKLQkvLyAgICB7Ci0JLy8gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JLy8gICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgZGVsZXRlZCA9IGRlbGV0ZUZpbGUocmVzb3VyY2VDb250ZXh0LCAoSUZpbGUpcmVzb3VyY2UsIHByb2dyZXNzTW9uaXRvciwKLQkvLyBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIH0KLQkvLyAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpCi0JLy8gICAgICB7Ci0JLy8gICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGb2xkZXIoIHJlc291cmNlQ29udGV4dCwgKElGb2xkZXIpcmVzb3VyY2UsCi0JLy8gcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIH0KLQkvLwotCS8vICAgICAgaWYgKCFkZWxldGVkKSBicmVhazsKLQkvLyAgICB9Ci0JLy8gICAgaWYgKGRlbGV0ZWQpIHsKLQkvLyAgICAgIGZvbGRlci5kZWxldGUodHJ1ZSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkvLyAgICAgIHJldHVybiB0cnVlOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgICByZXR1cm4gZmFsc2U7Ci0JLy8KLQkvLyAgfQotCS8qKgotCSAqIERlbGV0ZXMgYSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgbmFtZWQgaW4gYW4gaW5kZXggZmlsZSBsb2NhdGVkIHJlbGF0aXZlCi0JICogdG8gdGhlIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGluZGV4ZWQgZmlsZSBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBzb3VyY2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHJlbGF0aXZlIHBhdGggb2YgdGhlIGluZGV4ZWQgZmlsZSBwYXNzaW5nIGEgbnVsbCBpbiBoYXMgdGhlCi0JICogICAgICAgICAgICBzYW1lIGVmZmVjdCBhcyBwYXNzaW5nIGEgIi4iIGluCi0JICogQHBhcmFtIGluZGV4RmlsZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIGluZGV4ZWQgZmlsZW5hbWUgTXVzdCBub3QgYmUgbnVsbAotCSAqIEBwYXJhbSB0YXJnZXRQYXRoIC0KLQkgKiAgICAgICAgICAgIHBhdGggY29udGFpbmluZyB0aGUgZmlsZXMgbmFtZWQgaW4gdGhlIGluZGV4ZWQgZmlsZSBNdXN0IG5vdAotCSAqICAgICAgICAgICAgYmUgbnVsbCwgdGhpcyBwYXRoIG11c3QgZW5kIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JLy8gIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVJbmRleEZpbGVzRnJvbU9TICgKLQkvLyAgICBQbHVnaW4gcGx1Z2luLAotCS8vICAgIElQYXRoIGluZGV4RmlsZVBhdGgsCi0JLy8gICAgSVBhdGggdGFyZ2V0UGF0aAotCS8vICApCi0JLy8gIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShpbmRleEZpbGVQYXRoKTsKLQkvLyAgICBFbnVtZXJhdGlvbiBmaWxlbmFtZXMgPSBTdHJpbmdVdGlscy5wYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0oaW5wdXQpOwotCS8vICAgIHdoaWxlIChmaWxlbmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkvLyAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9Ci0JLy8gdGFyZ2V0UGF0aC5hcHBlbmQoKFN0cmluZylmaWxlbmFtZXMubmV4dEVsZW1lbnQoKSkudG9GaWxlKCk7Ci0JLy8gICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkKLQkvLyAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBSZXR1cm5zIGEgVVJJIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gRWNsaXBzZSByZXNvdXJjZSwgb3IgbnVsbCBpZiBubyBzdWNoCi0JICogcmVmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIChmb3IgZXhhbXBsZSwgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0Ci0JICogaW4gdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UuCi0JICogQHJldHVybiBUaGUgVVJJIGFzIGEgc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIFVSSSB0byB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyB1cmkgPSBudWxsOwotCQlJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQl1cmkgPSAiZmlsZToiICsgbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBVUkkgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBFY2xpcHNlIHJlc291cmNlIHVzaW5nIHRoZQotCSAqICJwbGF0Zm9ybToiIHByb3RvY29sLCBvciBudWxsIGlmIG5vIHN1Y2ggcmVmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIChmb3IKLQkgKiBleGFtcGxlLCBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UuCi0JICogQHJldHVybiBUaGUgVVJJIGFzIGEgc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIFVSSSB0byB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1SZXNvdXJjZVVSSShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXVyaSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYmluZGluZyBuYW1lc3BhY2Ugc3RyaW5nIGdpdmVuIGEgSmF2YSBiZWFuIG5hbWUKLQkgKiAodXNpbmcgdGhlIGNvbnZlbnRpb24gdXNlZCBieSBDVEMgaW4gR00pLiBlLmcuIEphdmEgYmVhbiBNeUNsYXNzIHJlc3VsdAotCSAqIGluIGJpbmRpbmcgbmFtZXNwYWNlIG9mCi0JICogImh0dHA6Ly93d3cubXljbGFzcy5jb20vZGVmaW5pdGlvbnMvTXlDbGFzc1JlbW90ZUludGVyZmFjZSIKLQkgKiAKLQkgKiBAcGFyYW0gYmVhbk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBqYXZhIGJlYW4uCi0JICogQHJldHVybiBUaGUgYmluZGluZyBuYW1lc3BhY2UgYXMgYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmluZGluZ05hbWVzcGFjZShTdHJpbmcgYmVhbk5hbWUpIHsKLQkJcmV0dXJuICJodHRwOi8vd3d3LiIgKyBiZWFuTmFtZS50b0xvd2VyQ2FzZSgpICsgIi5jb20vZGVmaW5pdGlvbnMvIgotCQkJCSsgYmVhbk5hbWUgKyAiUmVtb3RlSW50ZXJmYWNlIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNjaGVtYSBuYW1lc3BhY2Ugc3RyaW5nIGdpdmVuIGEgSmF2YSBiZWFuIG5hbWUgKHVzaW5nCi0JICogdGhlIGNvbnZlbnRpb24gdXNlZCBieSBDVEMgaW4gR00pLiBlLmcuIEphdmEgYmVhbiBNeUNsYXNzIHJlc3VsdCBpbgotCSAqIHNjaGVtYSBuYW1lc3BhY2Ugb2YKLQkgKiAiaHR0cDovL3d3dy5teWNsYXNzLmNvbS9zY2hlbWFzL015Q2xhc3NSZW1vdGVJbnRlcmZhY2UiCi0JICogCi0JICogQHBhcmFtIGJlYW5OYW1lCi0JICogICAgICAgICAgICBUaGUgamF2YSBiZWFuLgotCSAqIEByZXR1cm4gVGhlIHNjaGVtYXMgbmFtZXNwYWNlIGFzIGEgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNjaGVtYU5hbWVzcGFjZShTdHJpbmcgYmVhbk5hbWUpIHsKLQkJcmV0dXJuICJodHRwOi8vd3d3LiIgKyBiZWFuTmFtZS50b0xvd2VyQ2FzZSgpICsgIi5jb20vc2NoZW1hcy8iCi0JCQkJKyBiZWFuTmFtZSArICJSZW1vdGVJbnRlcmZhY2UiOwotCX0KLQotCS8vICBwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSB7Ci0JLy8gICAgICAgIFZlY3RvciBvcHRpb25zID0gbmV3IFZlY3RvcigpOwotCS8vICAgIG9wdGlvbnMuYWRkKG5ldwotCS8vIFN0YXR1c09wdGlvbihJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19JRCxJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwiIiwiIikpOwotCS8vICAgIG9wdGlvbnMuYWRkKG5ldwotCS8vIFN0YXR1c09wdGlvbihJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQsSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCIiLCIiKSk7Ci0JLy8gICAgb3B0aW9ucy5hZGQobmV3Ci0JLy8gU3RhdHVzT3B0aW9uKElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCIiLCIiKSk7Ci0JLy8gICAgcmV0dXJuIG9wdGlvbnM7Ci0JLy8gIH0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogR2V0cyB0aGUgU09BUCBycGNyb3V0ZXIgc2VydmxldCBVUkwgZm9yIHRoZSBzZXJ2aWNlIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZAotCSAqICAgICAgICAgICAgVGhlIHNlcnZlciBmYWN0b3J5IGlkCi0JICogQHBhcmFtIHNlcnZlcgotCSAqICAgICAgICAgICAgVGhlIHNlcnZlcgotCSAqIEByZXR1cm4gVGhlIFVSTCwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZsZXRVUkwoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBnZXRTZXJ2bGV0VVJMKGdldFdlYlByb2plY3RVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkLCBzZXJ2ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0VVJMKFN0cmluZyB3ZWJQcm9qZWN0VVJMKSB7Ci0JCWlmICh3ZWJQcm9qZWN0VVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHdlYlByb2plY3RVUkwgKyBTRVJWTEVUX0VYVDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjbGllbnQgV2ViIHByb2plY3QgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QgbmFtZSB0byBiYXNlIG9uLgotCSAqIEBwYXJhbSB0eXBlSWQgdGhlIHdlYnNlcnZpY2UgdHlwZSBpZC4KLQkgKiBAcmV0dXJuIFRoZSBjbGllbnQgV2ViIHByb2plY3QgbmFtZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsaWVudFdlYlByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHR5cGVJZCkgCi0JewotCQlTdHJpbmcgICBiYXNlQ2xpZW50V2ViUHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZSArIERFRkFVTFRfQ0xJRU5UX1dFQl9QUk9KRUNUX0VYVDsKLQkJSVBhdGggICAgcHJvamVjdFBhdGg7Ci0JCUlQcm9qZWN0IHByb2plY3Q7Ci0JCWJvb2xlYW4gIGZvdW5kV2ViUHJvamVjdCAgICAgPSBmYWxzZTsKLQkJaW50ICAgICAgaSAgICAgICAgICAgICAgICAgICA9IDE7Ci0JCQotCQlpZiggaXNTa2VsZXRvbkVKQlR5cGUoIHR5cGVJZCApICkKLQkJewotCQkgIC8vIEZvciB0aGUgc2tlbGV0b24gRUpCIHNjZW5hcmlvIHdlIG5lZWQgdG8gY3JlYXRlIGEgc2xpZ2h0bHkgZGlmZmVyZW50Ci0JCSAgLy8gYmFzZSBuYW1lLiAgV2hlbiB0aGUgRUpCIHByb2plY3QgaXMgY3JlYXRlZCBhbm90aGVyIHByb2plY3QKLQkJICAvLyBpcyBjcmVhdGVkIHdpdGggIkNsaWVudCIgdGFja2VkIG9udG8gdGhlIGVuZC4gIFdlIHdpbGwKLQkJICAvLyBhZGQgIldTIiB0byBvdXIgY2xpZW50IHNvIHdlIGRvbid0IGNvbGxpZGUgd2l0aCB0aGUgb3RoZXIKLQkJICAvLyBjbGllbnQgcHJvamVjdC4KLQkJICBiYXNlQ2xpZW50V2ViUHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZSArICJXUyIgKyBERUZBVUxUX0NMSUVOVF9XRUJfUFJPSkVDVF9FWFQ7ICAgIAotCQl9Ci0JCQotCQlTdHJpbmcgIGNsaWVudFdlYlByb2plY3ROYW1lID0gYmFzZUNsaWVudFdlYlByb2plY3ROYW1lOwotCQkKLQkJd2hpbGUgKCFmb3VuZFdlYlByb2plY3QpIAotCQl7Ci0JCSAgcHJvamVjdFBhdGggPSBuZXcgUGF0aChjbGllbnRXZWJQcm9qZWN0TmFtZSkubWFrZUFic29sdXRlKCk7Ci0JCSAgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHByb2plY3RQYXRoKTsKLQkJICAKLQkJICBpZiAocHJvamVjdC5leGlzdHMoKSAmJiAhUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkpIAotCQkgIHsKLQkJCWNsaWVudFdlYlByb2plY3ROYW1lID0gYmFzZUNsaWVudFdlYlByb2plY3ROYW1lICsgaTsKLQkJCWkrKzsKLQkJICB9Ci0JCSAgZWxzZSAKLQkJICB7Ci0JCQlmb3VuZFdlYlByb2plY3QgPSB0cnVlOwotCQkgIH0KLQkJfQotCQkKLQkJcmV0dXJuIGNsaWVudFdlYlByb2plY3ROYW1lOwotCX0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENsaWVudFByb2plY3RDb21wb25lbnROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIGJvb2xlYW4gaXNFSkIpCi0gIHsKLSAgICBTdHJpbmcgY2xpZW50UHJvamVjdE5hbWUgPSBudWxsOwotICAgIFN0cmluZyBjbGllbnRDb21wb25lbnROYW1lID0gbnVsbDsKLSAgICBpZiAoaXNFSkIpCi0gICAgewotICAgICAgY2xpZW50UHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZSArIERFRkFVTFRfQ0xJRU5UX0VKQl9QUk9KRUNUX0VYVDsKLSAgICAgIGNsaWVudENvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lICsgREVGQVVMVF9DTElFTlRfRUpCX1BST0pFQ1RfRVhUOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY2xpZW50UHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZSArIERFRkFVTFRfQ0xJRU5UX1dFQl9QUk9KRUNUX0VYVDsKLS8vICAgICAgU3RyaW5nIGJhc2VOYW1lID0gY2xpZW50UHJvamVjdE5hbWU7Ci0gICAgICBjbGllbnRDb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSArIERFRkFVTFRfQ0xJRU5UX1dFQl9QUk9KRUNUX0VYVDsKLS8vICAgICAgU3RyaW5nIGJhc2VDb21wTmFtZSA9IGNsaWVudENvbXBvbmVudE5hbWU7Ci0gICAgfQotICAgIAotICAgIC8vVE9ETyB3ZSBtYXkgd2FudCB0byByZW1vdmUgdGhpcyBpZiBzdGF0ZW1lbnQgb25jZSBkZWZlY3QgMTAzMzY2IGlzIHJlc29sdmVkLgotICAgIC8vVE9ETzogIERlZmVjdCAxMDc5OTcgLSBSZXZpc2l0IHByamVjdCBhbmQgbW9kdWxlIGNyZWF0aW9uIGxvZ2ljCi0vLyAgICBpZiggIUZsZXhpYmxlSmF2YVByb2plY3RQcmVmZXJlbmNlVXRpbC5nZXRNdWx0aXBsZU1vZHVsZXNQZXJQcm9qZWN0UHJvcCgpICkKLS8vICAgIHsKLS8vICAgICAgY2xpZW50Q29tcG9uZW50TmFtZSA9IGNsaWVudFByb2plY3ROYW1lOwkKLS8vICAgIH0KLSAgICAKLS8vICAgIGJvb2xlYW4gIGZvdW5kV2ViUHJvamVjdCAgICAgPSBmYWxzZTsKLS8vICAgIGludCAgICAgIGkgICAgICAgICAgICAgICAgICAgPSAxOwotLy8gICAgCi0vLyAgICB3aGlsZSAoIWZvdW5kV2ViUHJvamVjdCkgCi0vLyAgICB7Ci0vLyAgICAgIElQYXRoIHByb2plY3RQYXRoID0gbmV3IFBhdGgoY2xpZW50UHJvamVjdE5hbWUpLm1ha2VBYnNvbHV0ZSgpOwotLy8gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocHJvamVjdFBhdGgpOwotLy8gICAgICAKLS8vICAgICAgaWYgKHByb2plY3QuZXhpc3RzKCkpIAotLy8gICAgICB7Ci0vLyAgICAgICAgY2xpZW50UHJvamVjdE5hbWUgPSBiYXNlTmFtZSArIGk7Ci0vLyAgICAgICAgY2xpZW50Q29tcG9uZW50TmFtZSA9IGJhc2VDb21wTmFtZSArIGk7Ci0vLyAgICAgICAgaSsrOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgCi0vLyAgICAgIHsKLS8vICAgICAgICBmb3VuZFdlYlByb2plY3QgPSB0cnVlOwotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ldyBTdHJpbmdbXXtjbGllbnRQcm9qZWN0TmFtZSwgY2xpZW50Q29tcG9uZW50TmFtZX07Ci0gIH0KLSAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGVJRAotICAgICAqIEByZXR1cm4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NrZWxldG9uRUpCVHlwZSggU3RyaW5nIHR5cGVJRCApCi0JewotCSAgcmV0dXJuIHR5cGVJRC5lcXVhbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS53c2RsLmVqYiIgKTsgICAgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFSkJQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRUpCX1BST0pFQ1RfTkFNRTsKLQl9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RUpCQ29tcG9uZW50TmFtZSgpIHsKLSAgICByZXR1cm4gREVGQVVMVF9FSkJfQ09NUE9ORU5UX05BTUU7Ci0gIH0gIAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFdlYlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUJfUFJPSkVDVF9OQU1FOwotCX0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRXZWJDb21wb25lbnROYW1lKCkgewotICAgIHJldHVybiBERUZBVUxUX1dFQl9DT01QT05FTlRfTkFNRTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRDbGllbnRFeHRlbnNpb24oKSB7Ci0gICAgcmV0dXJuIERFRkFVTFRfQ0xJRU5UX1dFQl9QUk9KRUNUX0VYVDsKLSAgfQotICAKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Um91dGVyUHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCXJldHVybiBwcm9qZWN0TmFtZSArIERFRkFVTFRfUk9VVEVSX1BST0pFQ1RfRVhUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRTZXJ2aWNlRUFSUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NFUlZJQ0VfRUFSX1BST0pFQ1RfTkFNRTsKLQl9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2VydmljZUVBUkNvbXBvbmVudE5hbWUoKSB7Ci0gICAgcmV0dXJuIERFRkFVTFRfU0VSVklDRV9FQVJfQ09NUE9ORU5UX05BTUU7Ci0gIH0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRDbGllbnRFQVJQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQ0xJRU5UX0VBUl9QUk9KRUNUX05BTUU7Ci0JfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRDbGllbnRFQVJDb21wb25lbnROYW1lKCkgewotICAgIHJldHVybiBERUZBVUxUX0NMSUVOVF9FQVJfQ09NUE9ORU5UX05BTUU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFQVJFeHRlbnNpb24oKSB7Ci0JICAgIHJldHVybiBERUZBVUxUX0VBUl9FWFQ7Ci0JICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlbGVjdGlvblRvUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlbGVjdGlvblRvUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3N2RhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TZWxlY3Rpb25Ub1Jlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25Ub1Jlc291cmNlIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIjdHJhbnNmb3JtKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmFsdWU7Ci0gICAgSVJlc291cmNlICAgICAgICAgICAgcmVzb3VyY2UgID0gbnVsbDsKLSAgICAKLSAgICBpZiggc2VsZWN0aW9uICE9IG51bGwgKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIGlmKCBvYmplY3QgIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9iamVjdCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21wVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KW9iamVjdDsKLSAgICAgICAgICAKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IGNvbXBVbml0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCggSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9iamVjdCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuICkgCi0gICAgICAgIHsKLSAgICAgICAgICBFbnRlcnByaXNlQmVhbiBlamJCZWFuICAgID0gKEVudGVycHJpc2VCZWFuKW9iamVjdDsKLSAgICAgICAgICBJUHJvamVjdCAgICAgICBlamJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KCBlamJCZWFuICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIGVqYlByb2plY3QgIT0gbnVsbCApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb3VyY2UgPSBlamJQcm9qZWN0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXNvdXJjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VydmVyVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlcnZlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzliMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VydmVyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMDQgIDEyNDQwOCAgIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lciAgICAgICAgICAKLSAqIDIwMDYwMzMwICAgMTI0NjY3IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MTAwNCAgIDE1OTM1NiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbiwgR2V0IGNvcnJlY3QgbW9kdWxlIHJvb3QgVVJMIGJhc2VkIG9uIHNlcnZlciBjaG9zZW4KLSAqIDIwMDcwMTE5ICAgMTU5NDU4IG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LklTZXJ2ZXJUYXJnZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLldTUGx1Z2luTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVVSTFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgdXNlZnVsIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBTZXJ2ZXIgcGx1Z2luIGZ1bmN0aW9ucwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyVXRpbHMgewotCi0JcHJpdmF0ZSBIYXNodGFibGUgc2VydmVySWRUb0xhYmVsXzsKLQotCXByaXZhdGUgSGFzaHRhYmxlIHNlcnZlckxhYmVsVG9JZF87Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXJ2ZXJVdGlscyBpbnN0YW5jZV87Ci0KLQlwdWJsaWMgc3RhdGljIFNlcnZlclV0aWxzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLQkJCWluc3RhbmNlXyA9IG5ldyBTZXJ2ZXJVdGlscygpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZV87Ci0KLQl9Ci0KLQlwdWJsaWMgU2VydmVyVXRpbHMoKSB7Ci0JfQotCi0JLy8gR2V0cyB0aGUgU2VydmVyIGxhYmVscyBnaXZlbiB0aGUgc2VydmVyIGZhY3RvcnkgaWQKLQlwdWJsaWMgdm9pZCBnZXRTZXJ2ZXJMYWJlbHNBbmRJZHMoKSB7Ci0JCXNlcnZlcklkVG9MYWJlbF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXNlcnZlckxhYmVsVG9JZF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUlTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclR5cGVzKCk7Ci0JCWZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHNlcnZlclR5cGVzLmxlbmd0aDsgaWR4KyspIHsKLQotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChJU2VydmVyVHlwZSkgc2VydmVyVHlwZXNbaWR4XTsKLQotCQkJU3RyaW5nIGlkID0gc2VydmVyVHlwZS5nZXRJZCgpOwotCQkJU3RyaW5nIHNlcnZlckxhYmVsID0gc2VydmVyVHlwZS5nZXROYW1lKCk7Ci0JCQlpZiAoIShpZCA9PSBudWxsKSAmJiAhKHNlcnZlckxhYmVsID09IG51bGwpKSB7Ci0JCQkJc2VydmVySWRUb0xhYmVsXy5wdXQoaWQsIHNlcnZlckxhYmVsKTsKLQkJCQlzZXJ2ZXJMYWJlbFRvSWRfLnB1dChzZXJ2ZXJMYWJlbCwgaWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJMYWJlbEZvcklkKFN0cmluZyBmYWN0b3J5SWQpIHsKLQkJaWYgKHNlcnZlcklkVG9MYWJlbF8gPT0gbnVsbCkKLQkJCXRoaXMuZ2V0U2VydmVyTGFiZWxzQW5kSWRzKCk7Ci0JCXJldHVybiAoU3RyaW5nKSBzZXJ2ZXJJZFRvTGFiZWxfLmdldChmYWN0b3J5SWQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySWRGb3JMYWJlbChTdHJpbmcgZmFjdG9yeUxhYmVsKSB7Ci0JCWlmIChzZXJ2ZXJMYWJlbFRvSWRfID09IG51bGwpCi0JCQl0aGlzLmdldFNlcnZlckxhYmVsc0FuZElkcygpOwotCQlyZXR1cm4gKFN0cmluZykgc2VydmVyTGFiZWxUb0lkXy5nZXQoZmFjdG9yeUxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBtb2RpZnlNb2R1bGVzKElFbnZpcm9ubWVudCBlbnYsIElTZXJ2ZXIgc2VydmVyLAotCQkJSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gYWRkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCi0JCXRyeSB7Ci0KLQkJCWlmIChtb2R1bGUgPT0gbnVsbCB8fCAhbW9kdWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkgewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIG1vZHVsZSBpcyBhIHRydWUgSmF2YSBwcm9qZWN0Ci0JCQlpZiAobW9kdWxlIGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCUlNb2R1bGUgcG0gPSAoSU1vZHVsZSkgbW9kdWxlOwotCQkJCWlmIChwbSAhPSBudWxsKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwbS5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmIChwcm9qZWN0ID09IG51bGwKLQkJCQkJCQl8fCBSZXNvdXJjZVV0aWxzLmlzVHJ1ZUphdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQl3YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJaWYgKHdjICE9IG51bGwpIHsKLS8vCQkJCU9iamVjdCB4ID0gc2VydmVyLmdldEFkYXB0ZXIoSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIuY2xhc3MpOwotLy8JCQkJaWYgKHggIT0gbnVsbCAmJiB4IGluc3RhbmNlb2YgSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIpIHsKLS8vCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLS8vCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVECi0vLwkJCQkJCQl8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIHsKLS8vCQkJCQkJU3RyaW5nIG1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLS8vCQkJCQkJc2VydmVyLnN5bmNocm9ub3VzU3RhcnQobW9kZSwgbW9uaXRvcik7Ci0vLwkJCQkJfQotLy8JCQkJfQotCi0JCQkJTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdChzZXJ2ZXIuZ2V0TW9kdWxlcygpKTsKLQkJCQlpZiAoYWRkKSB7Ci0JCQkJCWlmICghbGlzdC5jb250YWlucyhtb2R1bGUpKSB7Ci0JCQkJCQlTZXJ2ZXJVdGlsLm1vZGlmeU1vZHVsZXMod2MsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwKLQkJCQkJCQkJbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsgLy8gcmVtb3ZlcyBtb2R1bGUKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMobW9kdWxlKSkgewotCQkJCQkJU2VydmVyVXRpbC5tb2RpZnlNb2R1bGVzKHdjLCBuZXcgSU1vZHVsZVswXSwKLQkJCQkJCQkJbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gaGFuZGxlIGNhc2Ugb2YgTnVsbCBXQzsgbm9uLWlzc3VlIGZvciBub3cKLQkJCX0KLQkJfSAKLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMgKSAKLSAgICB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NQbHVnaW5NZXNzYWdlcy5NU0dfRVJST1JfU0VSVkVSLCBleGMgKTsKLQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2MgIT0gbnVsbCkgewotCQkJCS8vIEFsd2F5cyBzYXZlQWxsIGFuZCByZWxlYXNlIHRoZSBzZXJ2ZXJXb3JraW5nQ29weQotCQkJCXRyeSAKLSAgICAgICAgewotCQkJCQl3Yy5zYXZlQWxsKHRydWUsIG1vbml0b3IpOwotCQkJCX0gCi0gICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YyApIAotICAgICAgICB7Ci0JCQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU1BsdWdpbk1lc3NhZ2VzLk1TR19FUlJPUl9TRVJWRVIsIGV4YyApOwotCQkJCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGdldFNlcnZlckZvck1vZHVsZShJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgCi0JCQkJCQkJCUlTZXJ2ZXIgc2VydmVyLCBib29sZWFuIGNyZWF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXI7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRTZXJ2ZXJGb3JNb2R1bGUobW9kdWxlLCBzZXJ2ZXJUeXBlSWQsIGNyZWF0ZSwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGdldFNlcnZlckZvck1vZHVsZShJTW9kdWxlIG1vZHVsZSwKLQkJCVN0cmluZyBzZXJ2ZXJUeXBlSWQsIGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQotCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShtb2R1bGUsIG1vbml0b3IpOwotCi0JCQlpZiAoc2VydmVycyAhPSBudWxsICYmIHNlcnZlcnMubGVuZ3RoID4gMCkgewotCQkJCWlmIChzZXJ2ZXJUeXBlSWQgPT0gbnVsbCB8fCBzZXJ2ZXJUeXBlSWQubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcmV0dXJuIHNlcnZlcnNbMF07IC8vIFdTQUQgdjQgYmVoYXZpb3IKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQkJCXNlcnZlclR5cGVJZCkpCi0JCQkJCQlyZXR1cm4gc2VydmVyc1tpXTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjcmVhdGVTZXJ2ZXIobW9kdWxlLCBzZXJ2ZXJUeXBlSWQsIG1vbml0b3IpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRTZXJ2ZXJGb3JNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUobW9kdWxlLCBudWxsKTsKLQkJCXJldHVybiAoKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApID8gc2VydmVyc1swXSA6IG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZW52Ci0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBJU2VydmVyIGNyZWF0ZVNlcnZlcihJRW52aXJvbm1lbnQgZW52LCBJTW9kdWxlIG1vZHVsZSwKLQkJCVN0cmluZyBzZXJ2ZXJUeXBlSWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV0MgPSBudWxsOwotCQlJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJUeXBlSWQpOwotCQkJc2VydmVyV0MgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihzZXJ2ZXJUeXBlSWQsIG51bGwsIG1vbml0b3IpOwotCQkJdHJ5IHsKLQkJCQlpZiAoc2VydmVyV0MgIT0gbnVsbCkgewotCQkJCQlzZXJ2ZXIgPSBzZXJ2ZXJXQy5zYXZlQWxsKHRydWUsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIAotICAgICAgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIFdTUGx1Z2luTWVzc2FnZXMuTVNHX0VSUk9SX1NFUlZFUiwgY2UpOwotCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0KLS8vCQkJCU9iamVjdCB4ID0gc2VydmVyLmdldEFkYXB0ZXIoSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIuY2xhc3MpOwotLy8JCQkJaWYgKHggIT0gbnVsbCAmJiB4IGluc3RhbmNlb2YgSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIpIHsKLS8vCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLS8vCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVECi0vLwkJCQkJCQl8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIHsKLS8vCQkJCQkJU3RyaW5nIG1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLS8vCQkJCQkJc2VydmVyLnN5bmNocm9ub3VzU3RhcnQobW9kZSwgbW9uaXRvcik7Ci0vLwkJCQkJfQotLy8JCQkJfQotCi0JCQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZS5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpIHsKLQkJCQkJSU1vZHVsZVtdIHBhcmVudE1vZHVsZXMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMobW9kdWxlLAotCQkJCQkJCW1vbml0b3IpOwotCQkJCQlpZiAocGFyZW50TW9kdWxlcyAhPSBudWxsICYmIHBhcmVudE1vZHVsZXMubGVuZ3RoICE9IDApIHsKLQkJCQkJCW1vZHVsZSA9IChJTW9kdWxlKSBwYXJlbnRNb2R1bGVzWzBdOwotCQkJCQl9Ci0JCQkJCXNlcnZlcldDLm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAotCQkJCQkJCW5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLQkJCQl9Ci0KLQkJCX0KLQotCQkJcmV0dXJuIHNlcnZlcjsKLQkJfSAKLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIAotICAgIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIFdTUGx1Z2luTWVzc2FnZXMuTVNHX0VSUk9SX1NFUlZFUiwgZSk7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNlcnZlcldDICE9IG51bGwpIHsKLQkJCQkJc2VydmVyV0Muc2F2ZUFsbCh0cnVlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NQbHVnaW5NZXNzYWdlcy5NU0dfRVJST1JfU0VSVkVSLCBjZSk7Ci0JCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlU2VydmVyIFRoaXMgY3JlYXRlcyBhIHNlcnZlciBidXQgZG9lcyBub3QgcmVwb3J0IGVycm9ycy4gQHBhcmFtCi0JICogbW9kdWxlIAotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQgCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciAKLQkgKiBAcmV0dXJuIElTZXJ2ZXIgcmV0dXJucyBudWxsIGlmIHVuc3VjY2Vzc2Z1bAotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGNyZWF0ZVNlcnZlcihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV0MgPSBudWxsOwotCQlJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJUeXBlSWQpOwotCQkJc2VydmVyV0MgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihzZXJ2ZXJUeXBlSWQsIG51bGwsIG1vbml0b3IpOwotCi0JCQl0cnkgewotCQkJCWlmIChzZXJ2ZXJXQyAhPSBudWxsKSB7Ci0JCQkJCXNlcnZlciA9IHNlcnZlcldDLnNhdmVBbGwodHJ1ZSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQotLy8JCQkJT2JqZWN0IHggPSBzZXJ2ZXIuZ2V0QWRhcHRlcihJUnVubmluZ0FjdGlvblNlcnZlci5jbGFzcyk7Ci0vLwkJCQlpZiAoeCAhPSBudWxsICYmIHggaW5zdGFuY2VvZiBJUnVubmluZ0FjdGlvblNlcnZlcikgewotLy8JCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotLy8JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQKLS8vCQkJCQkJCXx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotLy8JCQkJCQlTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotLy8JCQkJCQlzZXJ2ZXIuc3luY2hyb25vdXNTdGFydChtb2RlLCBtb25pdG9yKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCUlNb2R1bGVbXSBwYXJlbnRNb2R1bGVzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwKLQkJCQkJCQltb25pdG9yKTsKLQkJCQkJaWYgKHBhcmVudE1vZHVsZXMgIT0gbnVsbCAmJiBwYXJlbnRNb2R1bGVzLmxlbmd0aCAhPSAwKSB7Ci0JCQkJCQltb2R1bGUgPSAoSU1vZHVsZSkgcGFyZW50TW9kdWxlc1swXTsKLQkJCQkJfQotCQkJCQlzZXJ2ZXJXQy5tb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwKLQkJCQkJCQluZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCXJldHVybiBzZXJ2ZXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNlcnZlcldDICE9IG51bGwpIHsKLQkJCQkJc2VydmVyV0Muc2F2ZUFsbCh0cnVlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQkJLy8gaGFuZGxlciBjb3JlIGV4Y2VwdGlvbgotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJUeXBlSWRzQnlNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQlTdHJpbmdbXSBzZXJ2ZXJJZHMgPSBudWxsOwotCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLQkJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCQlzZXJ2ZXJJZHMgPSBuZXcgU3RyaW5nW3NlcnZlcnMubGVuZ3RoXTsKLQotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzZXJ2ZXJzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCQlzZXJ2ZXJJZHNbaW5kZXhdID0gc2VydmVyc1tpbmRleF0uZ2V0SWQoKTsKLQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChzZXJ2ZXJJZHMgPT0gbnVsbCkgewotCQkJc2VydmVySWRzID0gbmV3IFN0cmluZ1swXTsKLQkJfQotCi0JCXJldHVybiBzZXJ2ZXJJZHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIGJlIHVzaW5nIGdldFNlcnZlclR5cGVJZHNCeU1vZHVsZSggSVZpcnR1YWxDb21wb25lbnQgKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyVHlwZUlkc0J5TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmVjdG9yIHNlcnZlcklkcyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzCi0JCQkJCS5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJc2VydmVySWRzLmFkZChzZXJ2ZXJzW2ldLmdldElkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBzZXJ2ZXJJZHMudG9BcnJheShuZXcgU3RyaW5nW3NlcnZlcklkcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQlyZXR1cm4gU2VydmVyVXRpbC5nZXRNb2R1bGUocHJvamVjdCk7Ci19Ci0JCi0vLyBXb3JrYXJvdW5kIGZvciAxMTM2MjEKLS8vcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0vLwlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KTsKLS8vCWlmIChtb2R1bGVzIT1udWxsICYmIG1vZHVsZXMubGVuZ3RoIT0wKSB7Ci0vLwkJcmV0dXJuIG1vZHVsZXNbMF07Ci0vLwl9Ci0vLwlyZXR1cm4gbnVsbDsKLS8vfQotICAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3Qgb2YgdGhlCi0JICogY29tcG9uZW50IGJhc2VkIG9uIGEgc2VydmVyIGZhY3RvcnkgSUQgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViIG5hdHVyZQotCSAqIG9yIHRoZSBtb2R1bGUgcm9vdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAoZS5nLiBGb3Igc29tZSB0eXBlcyBvZiAKLQkgKiBzZXJ2ZXJzLCB3ZSB3b3VsZCBub3QgYmUgYWJsZSB0byBnZXQgbW9kdWxlIHJvb3QgVVJMIGlmIHRoZSBzZXJ2ZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQpLgotCSAqIE5vdGUgdGhhdCB3ZSBhcmUgbm90IHJlbHlpbmcgb24gd2hpY2ggc2VydmVyIHRoZSBtb2R1bGUgaXMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0byBkZXRlcm1pbmUKLQkgKiB0aGUgY29ycmVjdCBtb2R1bGUgc2VydmVyIHJvb3QgYmVjYXVzZSB0aGUgcHJvamVjdCBtaWdodCBiZSBhc3NvY2lhdGVkIHdpdGggYSBzZXJ2ZXIgYnV0IHdlIG5lZWQgdGhlCi0JICogbW9kdWxlIHJvb3QgYmFzZWQgb24gYW5vdGhlciBzZXJ2ZXIgZmFjdG9yeSBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZCBzZXJ2ZXIgZmFjdG9yeSBJRAotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViQ29tcG9uZW50VVJMKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpIHsKLQkJU3RyaW5nIHdlYlByb2plY3RVUkwgPSBudWxsOwotCQlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShwcm9qZWN0KTsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWQpOyAgICAgICAgICAgICAgIAotCQkJaWYgKHNlcnZlclR5cGUhPW51bGwpCi0JCQl7Ci0JCQkJdHJ5IHsKLQkJCQkJLy9DaG9vc2UgYSBSdW50aW1lIHdoaWNoIGlzIG5vdCBhIHN0dWIKLQkJCQkJSVJ1bnRpbWUgbm9uU3R1YlJ1bnRpbWUgPSBudWxsOwotCQkJCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyVXRpbC5nZXRSdW50aW1lcyhudWxsLCBudWxsKTsKLQkJCQkJU3RyaW5nIHNlcnZlclJ1bnRpbWVUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVzW2ldOwotCQkJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCi0JCQkJCQl7Ci0JCQkJCQkJU3RyaW5nIHRoaXNSdW50aW1lVHlwZUlkID0gcnVudGltZVR5cGUuZ2V0SWQoKTsKLQkJCQkJCQlpZiAodGhpc1J1bnRpbWVUeXBlSWQuZXF1YWxzKHNlcnZlclJ1bnRpbWVUeXBlSWQpICYmICFydW50aW1lLmlzU3R1YigpKSB7Ci0JCQkJCQkJCS8vRm91bmQgYW4gYXBwcm9wcmlhdGUgSVJ1bnRpbWUgdGhhdCBpcyBub3QgYSBzdHViCi0JCQkJCQkJCW5vblN0dWJSdW50aW1lID0gcnVudGltZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKG5vblN0dWJSdW50aW1lICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXQyA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKG51bGwsIG51bGwsIG5vblN0dWJSdW50aW1lLCBudWxsKTsKLQkJCQkJCUlVUkxQcm92aWRlciB1cmxQcm92aWRlciA9IChJVVJMUHJvdmlkZXIpIHNlcnZlcldDLmxvYWRBZGFwdGVyKElVUkxQcm92aWRlci5jbGFzcywgbnVsbCk7Ci0JCQkJCQlpZiAodXJsUHJvdmlkZXIhPW51bGwpIHsKLQkJCQkJCQlVUkwgdXJsID0gdXJsUHJvdmlkZXIuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGUpOwkJCQkJCQkKLQkJCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIHMgPSB1cmwudG9TdHJpbmcoKTsKLQkJCQkJCQkJd2ViUHJvamVjdFVSTCA9IChzLmVuZHNXaXRoKCIvIikgPyBzLnN1YnN0cmluZygwLCBzLmxlbmd0aCgpIC0gMSkgOiBzKTsKLQkJCQkJCQl9CQkJCQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gY2UpewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGNlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd2ViUHJvamVjdFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3Qgb2YgdGhlCi0JICogY29tcG9uZW50IGJhc2VkIG9uIGEgc2VydmVyIGZhY3RvcnkgSUQgYW5kIHNlcnZlci4gIFJldHVybnMgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViIG5hdHVyZQotCSAqIG9yIHRoZSBtb2R1bGUgcm9vdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAoZS5nLiBGb3Igc29tZSB0eXBlcyBvZiAKLQkgKiBzZXJ2ZXJzLCB3ZSB3b3VsZCBub3QgYmUgYWJsZSB0byBnZXQgbW9kdWxlIHJvb3QgVVJMIGlmIHRoZSBzZXJ2ZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQpLgotCSAqIE5vdGUgdGhhdCB3ZSBhcmUgbm90IHJlbHlpbmcgb24gd2hpY2ggc2VydmVyIHRoZSBtb2R1bGUgaXMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0byBkZXRlcm1pbmUKLQkgKiB0aGUgY29ycmVjdCBtb2R1bGUgc2VydmVyIHJvb3QgYmVjYXVzZSB0aGUgcHJvamVjdCBtaWdodCBiZSBhc3NvY2lhdGVkIHdpdGggYSBzZXJ2ZXIgYnV0IHdlIG5lZWQgdGhlCi0JICogbW9kdWxlIHJvb3QgYmFzZWQgb24gYW5vdGhlciBzZXJ2ZXIgLyBzZXJ2ZXIgZmFjdG9yeSBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZCBzZXJ2ZXIgZmFjdG9yeSBJRAotCSAqIEBwYXJhbSBzZXJ2ZXIgU2VydmVyIGlkCi0JICogQHJldHVybiBUaGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBVUkwgb3IgbnVsbCAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJDb21wb25lbnRVUkwoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0KLQkJU3RyaW5nIHdlYlByb2plY3RVUkwgPSBudWxsOwotCQlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShwcm9qZWN0KTsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJVVJMUHJvdmlkZXIgdXJsUHJvdmlkZXIgPSAoSVVSTFByb3ZpZGVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAodXJsUHJvdmlkZXIhPW51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IHVybFByb3ZpZGVyLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlKTsgICAgICAgICAgICAgIAotCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJICBTdHJpbmcgcyA9IHVybC50b1N0cmluZygpOwotCQkJCQkgIHdlYlByb2plY3RVUkwgPSAocy5lbmRzV2l0aCgiLyIpID8gcy5zdWJzdHJpbmcoMCwgcy5sZW5ndGgoKSAtIDEpIDogcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXdlYlByb2plY3RVUkwgPSBnZXRXZWJDb21wb25lbnRVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd2ViUHJvamVjdFVSTDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RlZFdlYkNvbXBvbmVudFVSTChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc2VydmVyRmFjdG9yeUlkKSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRXZWJDb21wb25lbnRVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkKTsKLQkJcmV0dXJuIGVuY29kZVVSTCh1cmwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbmNvZGVkV2ViQ29tcG9uZW50VVJMKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRXZWJDb21wb25lbnRVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkLCBzZXJ2ZXIpOwotCQlyZXR1cm4gZW5jb2RlVVJMKHVybCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlVVJMKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZ0J1ZmZlciBlbmNvZGVkVVJMID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWVuY29kZWRVUkwuYXBwZW5kKHVybC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGN0eHRSb290ID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsLnN1YnN0cmluZyhpbmRleCArIDEsIHVybC5sZW5ndGgoKSksICJVVEYtOCIpOwotCQkJCQlpbnQgcGx1c0luZGV4ID0gY3R4dFJvb3QuaW5kZXhPZignKycpOwotCQkJCQl3aGlsZSAocGx1c0luZGV4ICE9IC0xKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlzYi5hcHBlbmQoY3R4dFJvb3Quc3Vic3RyaW5nKDAsIHBsdXNJbmRleCkpOwotCQkJCQkJc2IuYXBwZW5kKCIlMjAiKTsKLQkJCQkJCXNiLmFwcGVuZChjdHh0Um9vdC5zdWJzdHJpbmcocGx1c0luZGV4ICsgMSwgY3R4dFJvb3QKLQkJCQkJCQkubGVuZ3RoKCkpKTsKLQkJCQkJCWN0eHRSb290ID0gc2IudG9TdHJpbmcoKTsKLQkJCQkJCXBsdXNJbmRleCA9IGN0eHRSb290LmluZGV4T2YoJysnKTsKLQkJCQkJfQotCQkJCQllbmNvZGVkVVJMLmFwcGVuZChjdHh0Um9vdCk7Ci0JCQkJfWNhdGNoIChJT0V4Y2VwdGlvbiBpbyl7Ci0JCQkJCS8vaGFuZGxlciBleGNlcHRpb24KLQkJCQl9CQkJCQotCQkJCXVybCA9IGVuY29kZWRVUkwudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJsOwotCX0JCi0KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0RGVmYXVsdEV4aXN0aW5nU2VydmVyKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUocHJvamVjdCk7Ci0JCUlTZXJ2ZXIgcHJlZmVycmVkU2VydmVyID0gU2VydmVyQ29yZS5nZXREZWZhdWx0U2VydmVyKG1vZHVsZSk7Ci0JCWlmIChwcmVmZXJyZWRTZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwcmVmZXJyZWRTZXJ2ZXI7Ci0JCQotCQlJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShtb2R1bGUsCi0JCQkJbnVsbCk7Ci0KLQkJaWYgKGNvbmZpZ3VyZWRTZXJ2ZXJzICE9IG51bGwgJiYgY29uZmlndXJlZFNlcnZlcnMubGVuZ3RoID4gMCkgewotCQkJcHJlZmVycmVkU2VydmVyID0gY29uZmlndXJlZFNlcnZlcnNbMF07Ci0JCX0gZWxzZSB7Ci0JCQlJU2VydmVyW10gbm9uQ29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsCi0JCQkJCS5nZXRBdmFpbGFibGVTZXJ2ZXJzRm9yTW9kdWxlKG1vZHVsZSwgZmFsc2UsIG51bGwpOwotCi0JCQlpZiAobm9uQ29uZmlndXJlZFNlcnZlcnMgIT0gbnVsbAotCQkJCQkmJiBub25Db25maWd1cmVkU2VydmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJcHJlZmVycmVkU2VydmVyID0gbm9uQ29uZmlndXJlZFNlcnZlcnNbMF07Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJlZmVycmVkU2VydmVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIHNob3VsZCBiZSB1c2luZyBnZXREZWZhdWx0RXhpc3RpbmdTZXJ2ZXIoIElWaXJ0dWFsQ29tcG9uZW50ICkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0RGVmYXVsdEV4aXN0aW5nU2VydmVyKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAKLSAgICAgIElNb2R1bGUgbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUocHJvamVjdCk7Ci0gICAgICBJU2VydmVyIHByZWZlcnJlZFNlcnZlciA9IG51bGw7Ci0gICAgICBwcmVmZXJyZWRTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmdldERlZmF1bHRTZXJ2ZXIobW9kdWxlKTsKLQkJCi0vLyBXb3JrYXJvdW5kIGZvciAxMTM2MjEKLS8vCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KTsKLS8vICAgICAgSVNlcnZlciBwcmVmZXJyZWRTZXJ2ZXIgPSBudWxsOwotLy8gICAgICBpZiAobW9kdWxlcy5sZW5ndGggPiAwKXsKLS8vICAgICAgICBwcmVmZXJyZWRTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmdldERlZmF1bHRTZXJ2ZXIobW9kdWxlc1swXSk7Ci0vLyAgICAgIH0KLSAgCi0JCWlmIChwcmVmZXJyZWRTZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwcmVmZXJyZWRTZXJ2ZXI7Ci0KLQkJSVNlcnZlcltdIGNvbmZpZ3VyZWRTZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoCi0JCQkJUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotCQlpZiAoY29uZmlndXJlZFNlcnZlcnMgIT0gbnVsbCAmJiBjb25maWd1cmVkU2VydmVycy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gY29uZmlndXJlZFNlcnZlcnNbMF07Ci0JCX0KLQotCQlJU2VydmVyW10gbm9uQ29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsCi0JCQkJLmdldEF2YWlsYWJsZVNlcnZlcnNGb3JNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksCi0JCQkJCQlmYWxzZSwgbnVsbCk7Ci0JCWlmIChub25Db25maWd1cmVkU2VydmVycyAhPSBudWxsICYmIG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBub25Db25maWd1cmVkU2VydmVyc1swXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBtb2R1bGVUeXBlIC0gYWQgZGVmaW5lZCBpbiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzIChpLmUuIEVBUl9UWVBFLAotCSAqIFdFQl9UWVBFLCBldGMuKSBAcGFyYW0gajJlZVZlcnNpb24gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnQKLQkgKiB2YWx1ZXMgaW4gSjJFRVZlcnNpb25Db25zdGFudHMgaS5lLiAiMTIiIG9yICIxMyIgb3IgIjE0IiBAcmV0dXJuIFN0cmluZwotCSAqIHRoZSBpZCBvZiB0aGUgc2VydmVyIHRhcmdldCAtIHRvIGJlIHVzZWQgaW4gcHJvamVjdCBjcmVhdGlvbiBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlclRhcmdldElkRnJvbUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkLAotCQkJU3RyaW5nIG1vZHVsZVR5cGUsIFN0cmluZyBqMmVlVmVyc2lvbikgewotCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWQpOwotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHNlcnZlclJ1bnRpbWVUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQotCQlTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICAgICAgTGlzdCBydW50aW1lcyA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRSdW50aW1lcyhtb2R1bGVUeXBlLCBzdEoyRUVWZXJzaW9uKSk7ICAgIAotCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBydW50aW1lcy5nZXQoaSk7Ci0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKLQkJCXsKLQkJCQlTdHJpbmcgdGhpc1J1bnRpbWVUeXBlSWQgPSBydW50aW1lVHlwZS5nZXRJZCgpOwotCQkJCWlmICh0aGlzUnVudGltZVR5cGVJZC5lcXVhbHMoc2VydmVyUnVudGltZVR5cGVJZCkgJiYgIXJ1bnRpbWUuaXNTdHViKCkpIHsKLQkJCQkJcmV0dXJuIHJ1bnRpbWUuZ2V0SWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgdGhlIHNlcnZlcidzIGZhY3RvcnkgaWQgQHJldHVybnMgdGhlIHJ1bnRpbWUgdHlwZQotCSAqIGlkIGdpdmVuIHRoZSBzZXJ2ZXIncyBmYWN0b3J5IGlkLiBSZXR1cm5zIGEgYmxhbmsgU3RyaW5nIGlmIHRoZSBubwotCSAqIFNlcnZlclR5cGUgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gZmFjdG9yeSBpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpIHsKLQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLQkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotCQkJcmV0dXJuIHNlcnZlclJ1bnRpbWVJZDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gIiI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZhY3RvcnlJZEZyb21SdW50aW1lVGFyZ2V0SWQoU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCl7Ci0JCUlTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclR5cGVzKCk7Ci0JCWZvciAoaW50IGk9MDtpPHNlcnZlclR5cGVzLmxlbmd0aDtpKyspIHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwID0gc2VydmVyVHlwZXNbaV0uZ2V0UnVudGltZVR5cGUoKTsKLQkJCWlmIChydW50aW1lVHlwIT1udWxsKXsKLQkJCQlpZiAocnVudGltZVR5cC5nZXRJZCgpLmVxdWFscyhydW50aW1lVGFyZ2V0SWQpKQotCQkJCQlyZXR1cm4gc2VydmVyVHlwZXNbaV0uZ2V0SWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7Ci0JCQotCX0KLQkKLQotCS8qCi0JICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZCB0aGUgc2VydmVyJ3MgZmFjdG9yeSBpZCBAcmV0dXJucyB0aGUgc2VydmVyIHR5cGUKLQkgKiBpZCBnaXZlbiB0aGUgc2VydmVyJ3MgZmFjdG9yeSBpZC4gUmV0dXJucyBhIGJsYW5rIFN0cmluZyBpZiB0aGUgbm8KLQkgKiBTZXJ2ZXJUeXBlIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGZhY3RvcnkgaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyVHlwZUlkRnJvbUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKSB7Ci0JCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZCk7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldElkKCk7Ci0JCQlyZXR1cm4gc2VydmVyVHlwZUlkOwotCQl9IGVsc2UKLQkJCXJldHVybiAiIjsKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBqMmVlVmVyc2lvbiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludCB2YWx1ZXMgaW4KLQkgKiBKMkVFVmVyc2lvbkNvbnN0YW50cyBpLmUuICIxMiIgb3IgIjEzIiBvciAiMTQiCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGFyZ2V0VmFsaWRGb3JFQVIoU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCwKLQkJCVN0cmluZyBqMmVlVmVyc2lvbikgewotCQlpZiAocnVudGltZVRhcmdldElkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGVhck1vZHVsZVR5cGUgPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFOwotCQlTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICAgICAgTGlzdCBydW50aW1lcyA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRSdW50aW1lcyhlYXJNb2R1bGVUeXBlLCBzdEoyRUVWZXJzaW9uKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHJ1bnRpbWVzLmdldChpKTsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsKQotCQkJewotCQkJCVN0cmluZyB0aGlzSWQgPSBydW50aW1lVHlwZS5nZXRJZCgpOwotCQkJCWlmICh0aGlzSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXRJZCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHBhcmFtIGoyZWVWZXJzaW9uIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50IHZhbHVlcyBpbgotCSAqIEoyRUVWZXJzaW9uQ29uc3RhbnRzIGkuZS4gIjEyIiBvciAiMTMiIG9yICIxNCIgQHBhcmFtIHRoZSBwcm9qZWN0IHR5cGUKLQkgKiBmcm9tIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUYXJnZXRWYWxpZEZvclByb2plY3RUeXBlKFN0cmluZyBydW50aW1lVGFyZ2V0SWQsCi0JCQlTdHJpbmcgajJlZVZlcnNpb24sIFN0cmluZyBwcm9qZWN0VHlwZSkgewotCQlpZiAocnVudGltZVRhcmdldElkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKHByb2plY3RUeXBlID09IG51bGwgfHwgcHJvamVjdFR5cGUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICAgICAgTGlzdCBydW50aW1lcyA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRSdW50aW1lcyhwcm9qZWN0VHlwZSwgc3RKMkVFVmVyc2lvbikpOyAgICAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lcy5zaXplKCk7IGkrKykgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgcnVudGltZXMuZ2V0KGkpOwotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCi0JCQl7Ci0JCQkJU3RyaW5nIHRoaXNJZCA9IHJ1bnRpbWVUeXBlLmdldElkKCk7Ci0JCQkJaWYgKHRoaXNJZC5lcXVhbHMocnVudGltZVRhcmdldElkKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyVGFyZ2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKSB7Ci0KLQkJaWYgKGoyZWVWZXJzaW9uID09IG51bGwgfHwgajJlZVZlcnNpb24ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBqMmVlVmVyc2lvbkludCA9IEludGVnZXIucGFyc2VJbnQoajJlZVZlcnNpb24pOwotCQlzd2l0Y2ggKGoyZWVWZXJzaW9uSW50KSB7Ci0JCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKToKLQkJCXJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTI7Ci0JCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKToKLQkJCXJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTM7Ci0JCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKToKLQkJCXJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTQ7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvL0NvbnZlcnRzIGEgbW9kdWxlIHR5cGUgZnJvbSBKMkVFVXRpbHMgdG8gYSBtb2R1bGUgdHlwZSBsaWtlCi0JLy90aGUgb25lIGluIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyVGFyZ2V0TW9kdWxlVHlwZShpbnQgbW9kdWxlVHlwZSkKLQl7Ci0JCXN3aXRjaCAobW9kdWxlVHlwZSkKLSAgICB7Ci0gICAgY2FzZSBKMkVFVXRpbHMuV0VCIDoKLSAgICAgIHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLldFQl9UWVBFOwotICAgIGNhc2UgSjJFRVV0aWxzLkVKQiA6Ci0gICAgICByZXR1cm4gSVNlcnZlclRhcmdldENvbnN0YW50cy5FSkJfVFlQRTsKLSAgICBjYXNlIEoyRUVVdGlscy5BUFBDTElFTlQgOgotICAgICAgcmV0dXJuIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuQVBQX0NMSUVOVF9UWVBFOwotICAgIGNhc2UgSjJFRVV0aWxzLkVBUiA6Ci0gICAgICByZXR1cm4gSVNlcnZlclRhcmdldENvbnN0YW50cy5FQVJfVFlQRTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAKLSAgICB9ICAgICAgCQkJCi0JfQotICAgIAotICAvKgotICAgKiBSZXR1cm5zIGEgbm9uLXN0dWIgcnVudGltZSBpZiBvbmUgaXMgYXZhaWxhYmxlIGZvciB0aGUgdGhlIGdpdmVuIHNlcnZlciB0eXBlLgotICAgKiBAcGFyYW0gc2VydmVyRmFjdG9yeUlkIC0gc2VydmVyIHR5cGUgaWQKLSAgICogQHJldHVybnMgSVJ1bnRpbWUgUmV0dXJucyBhIG5vbi1zdHViIHJ1bnRpbWUgaWYgb25lIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZS4KLSAgICogUmV0dXJucyBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZ2V0Tm9uU3R1YlJ1bnRpbWUoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIC8vRmluZCBhIFJ1bnRpbWUgd2hpY2ggaXMgbm90IGEgc3R1YgotICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgSVJ1bnRpbWUgbm9uU3R1YlJ1bnRpbWUgPSBudWxsOwotICAgIGlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgLy9ib29sZWFuIGZvdW5kTm9uU3R1YlJ1bnRpbWUgPSBmYWxzZTsKLSAgICAgIElSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJVdGlsLmdldFJ1bnRpbWVzKG51bGwsIG51bGwpOwotICAgICAgU3RyaW5nIHNlcnZlclJ1bnRpbWVUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lc1tpXTsKLSAgICAgICAgSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotICAgIAlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKLSAgICAJewotICAgIAkJU3RyaW5nIHRoaXNSdW50aW1lVHlwZUlkID0gcnVudGltZVR5cGUuZ2V0SWQoKTsKLQkgICAgICAgIGlmICh0aGlzUnVudGltZVR5cGVJZC5lcXVhbHMoc2VydmVyUnVudGltZVR5cGVJZCkgJiYgIXJ1bnRpbWUuaXNTdHViKCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIC8vIEZvdW5kIGFuIGFwcHJvcHJpYXRlIElSdW50aW1lIHRoYXQgaXMgbm90IGEgc3R1YgotCSAgICAgICAgICAvL2ZvdW5kTm9uU3R1YlJ1bnRpbWUgPSB0cnVlOwotCSAgICAgICAgICBub25TdHViUnVudGltZSA9IHJ1bnRpbWU7Ci0JICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgfQotICAgIAl9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBub25TdHViUnVudGltZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RhdHVzT2JqZWN0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RhdHVzT2JqZWN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTExZDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0YXR1c09iamVjdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFN0YXR1c09iamVjdEhhbmRsZXIKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfREVUQUlMUyA9IDE2OwotCi0gIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBnZW5lcmF0ZVRyZWVTdGF0dXMgKElTdGF0dXMgc3RhdHVzKSAKLSAgCXsKLSAgICAvLwotICAgIC8vIFRoZXJlIGNvdWxkIGJlIGxvdHMgb2YgVGhyb3dhYmxlcywgQ29yZUV4Y2VwdGlvbnMsCi0gICAgLy8gV3JhcHBlZEV4Y2VwdGlvbnMgYW5kIElTdGF0dXMgb2JqZWN0cyBiZW5lYXRoIHRoZQotICAgIC8vIGdpdmVuIHN0YXR1cy4gRmluZCB0aGVtLgotICAgIC8vCi0gICAgTGlua2VkTGlzdCBzdGF0dXNMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICBhcHBlbmRTdGF0dXMoTUFYX0RFVEFJTFMsIHN0YXR1c0xpc3QsIHN0YXR1cywgc3RhdHVzLmdldFNldmVyaXR5KCkpOwotICAgIGlmIChzdGF0dXNMaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgSVN0YXR1cyBuZXdTdGF0dXMgPSAoSVN0YXR1cylzdGF0dXNMaXN0LnJlbW92ZUZpcnN0KCk7Ci0gICAgICBpZiAoc3RhdHVzTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBJU3RhdHVzW10gc2Vjb25kYXJ5U3RhdHVzQXJyYXkgPSBuZXcgSVN0YXR1c1tzdGF0dXNMaXN0LnNpemUoKV07Ci0gICAgICAgIGludCBuID0gMDsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc2Vjb25kYXJ5U3RhdHVzQXJyYXlbbisrXSA9IChJU3RhdHVzKWkubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIG5ld1N0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhzdGF0dXMuZ2V0UGx1Z2luKCksc3RhdHVzLmdldENvZGUoKSxzZWNvbmRhcnlTdGF0dXNBcnJheSxzdGF0dXMuZ2V0TWVzc2FnZSgpLHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3U3RhdHVzOwotICAgIH0KLSAgICBlbHNlIAotICAgIAlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8vCi0gIC8vIEFwcGVuZHMgemVybyBvciBtb3JlIElTdGF0dXMgb2JqZWN0cyB0byB0aGUgbGlzdCBvZiBJU3RhdHVzIG9iamVjdHMKLSAgLy8gYmFzZWQgdXBvbiBhbiBJU3RhdHVzLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kU3RhdHVzICggaW50IG1heCwgTGlzdCBzdGF0dXNMaXN0LCBJU3RhdHVzIHN0YXR1cywgaW50IHNldmVyaXR5ICkKLSAgewotICAgIGlmIChtYXggPiAwICYmIHN0YXR1cyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgYW4gSVN0YXR1cyBvYmplY3QgZm9yIHRoZSBnaXZlbiBzdGF0dXMnIG1lc3NhZ2UuCi0gICAgICAvLwotICAgICAgaWYgKHN0YXR1cy5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWF4ID0gYXBwZW5kKHN0YXR1c0xpc3QsbWF4LHNldmVyaXR5LHN0YXR1cy5nZXRQbHVnaW4oKSxzdGF0dXMuZ2V0Q29kZSgpLHN0YXR1cy5nZXRNZXNzYWdlKCksc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgdGhlIElTdGF0dXMnIFRocm93YWJsZSwgaWYgYW55LgotICAgICAgLy8KLSAgICAgIG1heCA9IGFwcGVuZFRocm93YWJsZShtYXgsc3RhdHVzTGlzdCxzdGF0dXMuZ2V0RXhjZXB0aW9uKCksc2V2ZXJpdHkpOwotICAgICAgLy8KLSAgICAgIC8vIElmIHRoZSBJU3RhdHVzIGlzIGEgbXVsdGkgc3RhdHVzLCBhcHBlbmQgdGhlIGNoaWxkcmVuLgotICAgICAgLy8KLSAgICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aCAmJiBtYXg+MDsgaSsrKQotICAgICAgewotICAgICAgICBtYXggPSBhcHBlbmRTdGF0dXMobWF4LHN0YXR1c0xpc3QsY2hpbGRyZW5baV0sc2V2ZXJpdHkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4OwotICB9Ci0KLSAgLy8KLSAgLy8gQXBwZW5kcyB6ZXJvIG9yIG1vcmUgSVN0YXR1cyBvYmplY3RzIHRvIHRoZSBsaXN0IG9mIElTdGF0dXMgb2JqZWN0cwotICAvLyBiYXNlZCB1cG9uIGEgVGhyb3dhYmxlLiBXcmFwcGVkRXhjZXB0aW9ucyBhbmQgQ29yZUV4Y2VwdGlvbnMgYXJlCi0gIC8vIGdpdmVuIHNwZWNpYWwgdHJlYXRtZW50LgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kVGhyb3dhYmxlICggaW50IG1heCwgTGlzdCBzdGF0dXNMaXN0LCBUaHJvd2FibGUgdGhyb3dhYmxlLCBpbnQgc2V2ZXJpdHkgKQotICB7Ci0gICAgaWYgKG1heCA+IDAgJiYgdGhyb3dhYmxlICE9IG51bGwpCi0gICAgewotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCBhbiBJU3RhdHVzIG9iamVjdCBmb3IgdGhlIGV4Y2VwdGlvbidzIG1lc3NhZ2UuCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWF4ID0gYXBwZW5kKHN0YXR1c0xpc3QsbWF4LHNldmVyaXR5LFdlYlNlcnZpY2VQbHVnaW4uSUQsMCx0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLHRocm93YWJsZSk7Ci0gICAgICB9Ci0gICAgICAvLwotICAgICAgLy8gSWYgdGhlIGV4Y2VwdGlvbiBpcyBhIFdyYXBwZWRFeGNlcHRpb24sIGFwcGVuZCB0aGUgd3JhcHBlZCBFeGNlcHRpb24uCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIFdyYXBwZWRFeGNlcHRpb24gd2V4YyA9IChXcmFwcGVkRXhjZXB0aW9uKXRocm93YWJsZTsKLSAgICAgICAgbWF4ID0gYXBwZW5kVGhyb3dhYmxlKG1heCxzdGF0dXNMaXN0LHdleGMuZXhjZXB0aW9uKCksc2V2ZXJpdHkpOwotICAgICAgfQotICAgICAgLy8KLSAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gaXMgYSBDb3JlRXhjZXB0aW9uLCBhcHBlbmQgdGhlIGVuY2xvc2VkIElTdGF0dXMuCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIENvcmVFeGNlcHRpb24gY2V4YyA9IChDb3JlRXhjZXB0aW9uKXRocm93YWJsZTsKLSAgICAgICAgbWF4ID0gYXBwZW5kU3RhdHVzKG1heCxzdGF0dXNMaXN0LGNleGMuZ2V0U3RhdHVzKCksc2V2ZXJpdHkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4OwotICB9Ci0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhbmQgYXBwZW5kcyBhbiBJU3RhdHVzIHRvIHRoZSBsaXN0IG9mIElTdGF0dXMgb2JqZWN0cy4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGFwcGVuZCAoIExpc3Qgc3RhdHVzTGlzdCwgaW50IG1heCwgaW50IHNldmVyaXR5LCBTdHJpbmcgaWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gIHsKLSAgICBpZiAobWF4ID4gMCkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksaWQsY29kZSxtZXNzYWdlLHRocm93YWJsZSk7Ci0gICAgICBzdGF0dXNMaXN0LmFkZChzdGF0dXMpOwotICAgICAgbWF4LS07Ci0gICAgfQotICAgIHJldHVybiBtYXg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZzJQYXRoVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZzJQYXRoVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3ZTFkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmcyUGF0aFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIAotICogVHJhbnNmb3JtcyBhIGlucHV0IFN0cmluZyB0byBhIFBhdGgKLSAqIAotICogQGF1dGhvciBqb2FuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmcyUGF0aFRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCQotCXB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewkJCQkgCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKHZhbHVlLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcGF0aDsJCSAKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nMlNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmcyU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwNjdkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmcyU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjIgICAxMjgwOTQgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICogMjAwNzAzMDUgICAxNzUxOTQgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIEFudCB0YXNrIEluaXRpYWxTZWxlY3Rpb24gb25seSBhbGxvd3Mgd3NkbCB3aXRoaW4gdGhlIHdvcmtzcGFjZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5XU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIGEgd29ya3NwYWNlIHJlc291cmNlIHBhdGggaW50byBhIFN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3Igam9hbgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nMlNlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCi0JcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKG5ldyBQYXRoKHZhbHVlLnRvU3RyaW5nKCkpKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCXsKLQkJCUlQcm9qZWN0IHJlc1Byb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7CQkJCi0JCQkvLyBjaGVjayBpZiByZXNvdXJjZSBpcyBwYXJ0IG9mIGFuIEVKQgotCQkJaWYgKEoyRUVVdGlscy5pc0VKQkNvbXBvbmVudChyZXNQcm9qZWN0KSkKLQkJCXsKLQkJCQkvLyBpZiByZXNvdXJjZSBpcyBwYXJ0IG9mIEVKQiBuZWVkIHRvIGdldCB0aGUgRW50ZXJwcmlzZUJlYW4gYXMgdGhlIHNlbGVjdGlvbgotCQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gZWpiQ29tcG9uZW50cyA9IEoyRUVVdGlscy5nZXRFSkJDb21wb25lbnRzKHJlc1Byb2plY3QpOwotCQkJCUVKQkFydGlmYWN0RWRpdCAgZWpiRWRpdCA9IG51bGw7CQkJCi0JCQkJdHJ5ewkJCQkKLQkJCQkJZWpiRWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkKGVqYkNvbXBvbmVudHNbMF0pOwkJCQkKLQkJICAgICAgICAgICAgRUpCUmVzb3VyY2UgZWpiUmVzID0gZWpiRWRpdC5nZXRFSkJKYXJYbWlSZXNvdXJjZSgpOwotCQkgICAgICAgICAgICBFSkJKYXIgZWpiSmFyID0gZWpiUmVzLmdldEVKQkphcigpOwkgICAgICAgICAgICAKLQkJICAgICAgICAgICAgSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSBSZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKHBhdGgpOwotCQkgICAgICAgICAgICBTdHJpbmcgamF2YUNsYXNzTmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJICAgICAgICAgICAgLy8gc3RyaXAgb2ZmIGZpbGUgZXh0ZW5zaW9uIGlmIG5lY2Vzc2FyeQotCQkgICAgICAgICAgICBpZiAoamF2YUNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpPi0xKQotCQkgICAgICAgICAgICB7CQotCQkgICAgICAgICAgICAgIGphdmFDbGFzc05hbWUgPSBqYXZhQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBqYXZhQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykpOwkgICAgICAgICAgICAgIAotCQkgICAgICAgICAgICB9IAotCQkgICAgICAgICAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gSmF2YU1PRlV0aWxzLmdldEphdmFDbGFzcyhyZXNvdXJjZVBhdGgsIGphdmFDbGFzc05hbWUsIHJlc1Byb2plY3QpOwotCQkgICAgICAgICAgICBFbnRlcnByaXNlQmVhbiBlamIgPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5XaXRoUmVmZXJlbmNlKGphdmFDbGFzcyk7Ci0JCSAgICAgICAgICAgIGlmIChlamIgIT0gbnVsbCkKLQkJICAgICAgICAgICAgewotCQkgICAgICAgICAgICAJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWpiLmdldE5hbWUoKSk7CQotCQkgICAgICAgICAgICB9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjKQotCQkJCXsKLQkJCQkJCi0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkgICAgICAgICAgICAgIGlmIChlamJFZGl0IT1udWxsKQotCQkgICAgICAgICAgICAgICAgZWpiRWRpdC5kaXNwb3NlKCk7Ci0JCSAgICAgICAgfQotCQkJfQotCQkJLy8gaWYgc2VsZWN0aW9uIG5vdCBhbHJlYWR5IHNldCAtIGNyZWF0ZSBpdCBmcm9tIHRoZSByZXNvdXJjZSBvYmplY3QKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXsKLQkJCSAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICYmIHZhbHVlLnRvU3RyaW5nKCkuaW5kZXhPZigiOiIpICE9IC0xKSB7Ci0JCQkvLyByZW1vdGUgZmlsZQotCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gc3RyaW5nIGRvZXNuJ3QgcmV0dXJuIHJlc291cmNlIC0gZXJyb3IgY29uZGl0aW9uCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFdTUGx1Z2luTWVzc2FnZXMuRVJST1JfU0VMRUNUSU9OX1RSQU5TRk9STSk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZzJUZXN0RmFjaWxpdHlMaXN0VHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZzJUZXN0RmFjaWxpdHlMaXN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1OTYwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmcyVGVzdEZhY2lsaXR5TGlzdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLQotcHVibGljIGNsYXNzIFN0cmluZzJUZXN0RmFjaWxpdHlMaXN0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLQlwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLQkJU3RyaW5nIHRlc3RGYWNpbGl0eSA9IChTdHJpbmcpdmFsdWU7Ci0JCS8vdmFsdWUgcmVwcmVzZW50cyBuYW1lIG9mIGEgdGVzdCBmYWNpbGl0eQotCQkvL3BpY2sgdXAgbGlzdCBvZiB0ZXN0IGZhY2lsaXRpZXMKLQkJU3RyaW5nW10gdGVzdFR5cGVzID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpLmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsgICAgICAgIAkKLQkJCi0JCWludCBpbmRleCA9IDA7Ci0JCS8vbWF0Y2ggdmFsdWUgdG8gbmFtZSBvZiB0ZXN0IGZhY2lsaXR5IGFuZCBzZXQgaW5kZXggYWNjb3JkaW5nbHkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0ZXN0VHlwZXNbaV0uZXF1YWxzKHRlc3RGYWNpbGl0eSkpCi0JCQl7CQkKLQkJCQlicmVhazsKLQkJCX0JCQkKLQkJCWluZGV4Kys7Ci0JCX0KLQkJCi0JCVNlbGVjdGlvbkxpc3Qgc2VsZWN0aW9uTGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KHRlc3RUeXBlcywgaW5kZXgpOwkJCi0JCXJldHVybiBzZWxlY3Rpb25MaXN0OwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmcyVHlwZVJ1bnRpbWVTZXJ2ZXJNb2RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nMlR5cGVSdW50aW1lU2VydmVyTW9kaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0ZmNmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmcyVHlwZVJ1bnRpbWVTZXJ2ZXJNb2RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDMwMyAgIDEyODgzMiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkJlYW5Nb2RpZmllcjsKLQotcHVibGljIGNsYXNzIFN0cmluZzJUeXBlUnVudGltZVNlcnZlck1vZGlmaWVyIGltcGxlbWVudHMgQmVhbk1vZGlmaWVyIHsKLQotCXByaXZhdGUgU3RyaW5nIFNFUlZJQ0VfUlRfSURfS0VZID0gIlNlcnZpY2UuUnVudGltZUlkIjsgIC8vJE5PTi1OTFMtTiQKLQlwcml2YXRlIFN0cmluZyBSVU5USU1FX0lEID0gIlJ1bnRpbWVJZCI7ICAvLyROT04tTkxTLU4kCi0JcHJpdmF0ZSBTdHJpbmcgU0VSVklDRV9TUlZfSURfS0VZID0gIlNlcnZpY2UuU2VydmVySWQiOyAgLy8kTk9OLU5MUy1OJAotCXByaXZhdGUgU3RyaW5nIFNFUlZFUl9JRCA9ICJTZXJ2ZXJJZCI7ICAvLyROT04tTkxTLU4kCi0JcHJpdmF0ZSBTdHJpbmcgVFlQRV9JRCA9ICJUeXBlSWQiOyAgLy8kTk9OLU5MUy1OJAotCXByaXZhdGUgU3RyaW5nIFREX0VKQiA9ICJUT1AgRE9XTiBFSkIiOyAgLy8kTk9OLU5MUy1OJAotCXByaXZhdGUgU3RyaW5nIEJVX0VKQiA9ICJCT1RUT00gVVAgRUpCIjsgIC8vJE5PTi1OTFMtTiQKLQlwcml2YXRlIFN0cmluZyBURF9FSkJfVFlQRV9JRCA9ICIxL29yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuZWpiIjsKLQlwcml2YXRlIFN0cmluZyBCVV9FSkJfVFlQRV9JRCA9ICIwL29yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuZWpiIjsKLQlwcml2YXRlIFN0cmluZyBTRVJWSUNFX1BSRUZJWCA9ICJTZXJ2aWNlLiI7ICAvLyROT04tTkxTLU4kCi0JcHJpdmF0ZSBTdHJpbmcgQ0xJRU5UX1BSRUZJWCA9ICJDbGllbnQuIjsgIC8vJE5PTi1OTFMtTiQKLQkKLQkvKioKLQkgKiBNb2RpZmllcyB0aGUgc3VwcGxpZWQgVHlwZVJ1bnRpbWVTZXJ2ZXIgYmVhbiB3aXRoIHByb3BlcnRpZXMgaW4gaG9sZGVyLgotCSAqIElmIHRoZSBiZWFuIGlzIG51bGwsIGNvbnN0cnVjdCBhIG5ldyBvbmUgYW5kIHNldCBpdHMgcHJvcGVydGllcy4KLQkgKiBAcGFyYW0gYmVhbiBUeXBlUnVudGltZVNlcnZlciBiZWFuIHRvIGJlIG1vZGlmaWVkCi0JICogQHBhcmFtIGhvbGRlciBNYXAgY29udGFpbmluZyB2YWx1ZXMgZm9yIFR5cGVSdW50aW1lU2VydmVyIHByb3BlcnRpZXMgCi0JICogQHJldHVybiBUeXBlUnVudGltZVNlcnZlciB3aXRoIHByb3BlcnRpZXMgc2V0Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBiZWFuLCBPYmplY3QgaG9sZGVyKSB7Ci0JCQotCQlUeXBlUnVudGltZVNlcnZlciB0eXBlcyA9IG51bGw7Ci0JCWlmIChiZWFuID09IG51bGwgfHwgIShiZWFuIGluc3RhbmNlb2YgVHlwZVJ1bnRpbWVTZXJ2ZXIpKQotCQl7Ci0JCQl0eXBlcyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwkJCQotCQl9Ci0JCWVsc2UKLQkJewotCQkJdHlwZXMgPSAoVHlwZVJ1bnRpbWVTZXJ2ZXIpYmVhbjsKLQkJfQotCQkKLQkJaWYgKGhvbGRlciBpbnN0YW5jZW9mIE1hcCkKLQkJewkKLQkJCU1hcCB0eXBlc01hcCA9IChNYXApaG9sZGVyOwotCQkJU3RyaW5nIHByZWZpeCA9ICIiOwotCQkJCi0JCQkKLQkJCWlmICh0eXBlc01hcC5jb250YWluc0tleShTRVJWSUNFX1JUX0lEX0tFWSl8fHR5cGVzTWFwLmNvbnRhaW5zS2V5KFNFUlZJQ0VfU1JWX0lEX0tFWSkpCi0JCQl7Ci0JCQkJcHJlZml4ID0gU0VSVklDRV9QUkVGSVg7Ci0JCQl9CQkJICAJCi0JCQllbHNlCi0JCQl7Ci0JCQkJcHJlZml4ID0gQ0xJRU5UX1BSRUZJWDsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHJ1bnRpbWVJRCA9IChTdHJpbmcpdHlwZXNNYXAuZ2V0KHByZWZpeCtSVU5USU1FX0lEKTsKLQkJCWlmIChydW50aW1lSUQgIT0gbnVsbCkKLQkJCQl0eXBlcy5zZXRSdW50aW1lSWQocnVudGltZUlEKTsJCQotCQkJCi0JCQlTdHJpbmcgc2VydmVySUQgPSAoU3RyaW5nKXR5cGVzTWFwLmdldChwcmVmaXgrU0VSVkVSX0lEKTsKLQkJCWlmIChzZXJ2ZXJJRCAgIT0gbnVsbCkJCQkJCi0JCQkJdHlwZXMuc2V0U2VydmVySWQoc2VydmVySUQpOwkKLQkJCQotCQkJLy9jaGVjayBpZiB3ZWIgc2VydmljZSB0eXBlIGlzIEVKQiAtIGlmIG5vdCwgZGVmYXVsdCBmb3IgSmF2YSBiZWFuIHR5cGVzCi0JCQlTdHJpbmcgdHlwZUlEID0gKFN0cmluZyl0eXBlc01hcC5nZXQocHJlZml4K1RZUEVfSUQpOwotCQkJaWYgKHR5cGVJRCAhPSBudWxsKQotCQkJewotCQkJCWlmICh0eXBlSUQudG9VcHBlckNhc2UoKS5lcXVhbHMoVERfRUpCKSkgIC8vb25seSBzZXR0aW5nIHR5cGVJRCBzcGVjaWZpY2FsbHkgZm9yIEVKQiBjYXNlCi0JCQkJewotCQkJCQl0eXBlcy5zZXRUeXBlSWQoVERfRUpCX1RZUEVfSUQpOwotCQkJCX0JCi0JCQkJZWxzZSBpZiAodHlwZUlELnRvVXBwZXJDYXNlKCkuZXF1YWxzKEJVX0VKQikpCi0JCQkJewotCQkJCQl0eXBlcy5zZXRUeXBlSWQoQlVfRUpCX1RZUEVfSUQpOwotCQkJCX0JCi0JCQl9CQkJCi0JCX0KLSAgfQkKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZmMzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi0KLS8qKgotICogVHJhbnNmcm9tcyBhIGphdmEubGFuZy5TdHJpbmcgdG8gYW4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9qZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lciN0cmFuc2Zvcm0oamF2YS5sYW5nLk9iamVjdCkKLSAgICogQHBhcmFtIE9iamVjdCBUaGlzIG11c3QgYmUgYSBqYXZhLmxhbmcuU3RyaW5nCi0gICAqIEByZXR1cm4gT2JqZWN0IFJldHVybnMgYW4gSVByb2plY3QKLSAgICovCi0KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0JU3RyaW5nIHByb2plY3QgICAgID0gKFN0cmluZyl2YWx1ZTsKLQlpbnQgICAgc2xhc2hJbmRleCAgPSBwcm9qZWN0LmluZGV4T2YoICcvJyApOwotCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3Q7Ci0JCi0JaWYoIHNsYXNoSW5kZXggIT0gLTEgKQotCXsKLQkgIHByb2plY3ROYW1lID0gcHJvamVjdC5zdWJzdHJpbmcoIDAsIHNsYXNoSW5kZXggKTsKLQl9Ci0JCi0gICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzRiZDJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotCi0vKioKLSAgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHNvbWUgdXNlZnVsIHN0cmluZyB1dGlsaXRpZXMgdGhhdCBhcmUgbm90IHByb3ZpZGVkIGJ5Ci0gICogZWl0aGVyIFN0cmluZyBvciBTdHJpbmdCdWZmZXIuCi0gICoKLSAgKiBAYXV0aG9yIFBldGVyIE1vb2drCi0gICogQGRhdGUgICBKdWx5IDEzLCAyMDAwCi0qKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdVdGlscwotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvci4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICBwcml2YXRlIFN0cmluZ1V0aWxzKCl7fTsKLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHNwbGl0cyBhIHNpbmdsZSBsaW5lIG9mIHRleHQgaW50byBtdWx0aXBsZSBsaW5lcwotICAgICogYmFzZWQgb24gYSBtYXhpbXVtIGxpbmUgbGVuZ3RoLiAgVGhlIG1ldGhvZCB3aWxsIHRyeSB0byBmaXQgYXMKLSAgICAqIG1hbnkgd29yZHMgYXMgcG9zc2libGUgb250byBhIGxpbmUgd2l0aG91dCBleGNlZWRpbmcgdGhlIG1heGltdW0KLSAgICAqIGxpbmUgbGVuZ3RoLiAgTm90ZTogdGhlIG9ubHkgY2FzZSB3aGVyZSBhIGxpbmUgbWlnaHQgZXhjZWVkIHRoZQotICAgICogbWF4aW11bSBpcyBpZiBhIHNpbmdsZSB3b3JkIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtLgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdHRlciggU3RyaW5nIHRleHQsIGludCBtYXhfbGVuZ3RoICkKLSAgewotICAgIFZlY3RvciAgICAgICAgICByZXR1cm5fdGV4dCA9IG5ldyBWZWN0b3IoMjApOwotICAgIFN0cmluZ1tdICAgICAgICByZXR1cm5fc3RyOwotICAgIGludCAgICAgICAgICAgICBpbmRleCA9IDA7Ci0KLSAgICB3aGlsZSggaW5kZXggPCB0ZXh0Lmxlbmd0aCgpICkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gdGV4dC5zdWJzdHJpbmcoIGluZGV4LCBNYXRoLm1pbiggbWF4X2xlbmd0aCArIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQubGVuZ3RoKCkgKSApOwotICAgICAgaW50IHNwYWNlX2luZGV4ID0gc3RyLmxhc3RJbmRleE9mKCAiICIgKTsKLQotICAgICAgaWYoIGluZGV4ICsgc3RyLmxlbmd0aCgpIDwgdGV4dC5sZW5ndGgoKSAmJgotICAgICAgICAgIHRleHQuY2hhckF0KCBpbmRleCArIHN0ci5sZW5ndGgoKSAtIDEgKSAhPSAnICcgJiYKLSAgICAgICAgICB0ZXh0LmNoYXJBdCggaW5kZXggKyBzdHIubGVuZ3RoKCkgKSAhPSAnICcgJiYKLSAgICAgICAgICBzcGFjZV9pbmRleCAhPSAtMSApCi0gICAgICB7Ci0gICAgICAgIHJldHVybl90ZXh0LmFkZEVsZW1lbnQoIHN0ci5zdWJzdHJpbmcoIDAsIHNwYWNlX2luZGV4ICkgKTsKLSAgICAgICAgaW5kZXggKz0gc3BhY2VfaW5kZXggKyAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm5fdGV4dC5hZGRFbGVtZW50KCBzdHIudHJpbSgpICk7Ci0gICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm5fc3RyID0gbmV3IFN0cmluZ1tyZXR1cm5fdGV4dC5zaXplKCldOwotCi0gICAgZm9yKCBpbmRleCA9IDA7IGluZGV4IDwgcmV0dXJuX3RleHQuc2l6ZSgpOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICByZXR1cm5fc3RyW2luZGV4XSA9IChTdHJpbmcpKHJldHVybl90ZXh0LmVsZW1lbnRBdChpbmRleCkpOwotICAgIH0KLQotICAgIHJldHVybiByZXR1cm5fc3RyOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIHdpdGggYSByZXBlYXRlZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KLSAgKiovCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIHJlcGVhdCggY2hhciB0aGVfY2hhciwgaW50IGNvdW50ICkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCBjb3VudCApOwotCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBidWYuYXBwZW5kKCB0aGVfY2hhciApOwotICAgIH0KLQotICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgZmxhdHRlbnMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGEgc3RyaW5nLgotICAgICogVGhlIG1ldGhvZCByZXNwZWN0cyBlbWJlZGRlZCB3aGl0ZXNwYWNlIGFuZCBxdW90ZXMuCi0gICAgKiA8dWw+Ci0gICAgKiA8bGk+QW55IGFyZ3VtZW50IHdpdGggZW1iZWRkZWQgd2hpdGVzcGFjZSB3aWxsIGJlIGZsYXR0ZW5lZCBvdXQKLSAgICAqIHdpdGggZW5jbG9zaW5nIHF1b3Rlcy4gRm9yIGV4YW1wbGUsIHRoZSBzaW5nbGUgYXJndW1lbnQKLSAgICAqIDx1PkhlbGxvIFdvcmxkPC91PgotICAgICogd2lsbCBiZSByZXR1cm5lZCBhcwotICAgICogPHU+IkhlbGxvIFdvcmxkIjwvdT4uCi0gICAgKiA8bGk+QW55IGFyZ3VtZW50IHdpdGggcXVvdGVzIHdpbGwgYmUgZmxhdHRlbmVkIG91dCB3aXRoIHRoZQotICAgICogcXVvdGVzIGVzY2FwZWQuIEZvciBleGFtcGxlLCB0aGUgc2luZ2xlIGFyZ3VtZW50Ci0gICAgKiA8dT4iSGFwcHkgZGF5cyI8L3U+Ci0gICAgKiB3aWxsIGJlIHJldHVybmVkIGFzCi0gICAgKiA8dT5cIkhhcHB5IGRheXNcIjwvdT4uCi0gICAgKiA8L3VsPgotICAgICogQHBhcmFtIGFyZ3VtZW50cyBUaGUgYXJyYXkgb2Ygc3RyaW5ncyB0byBmbGF0dGVuLgotICAgICogQHJldHVybiB0aGUgZmxhdHRlbmVkIHN0cmluZy4KLSAgKi8KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZmxhdHRlbkFyZ3VtZW50cyAoIFN0cmluZ1tdIGFyZ3VtZW50cyApCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgZm9yIChpbnQgaT0wOyBpPGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAvLwotICAgICAgLy8gQXBwZW5kIGEgc2VwYXJhdG9yIChleGNlcHQgdGhlIGZpcnN0IHRpbWUpLgotICAgICAgLy8KLSAgICAgIGlmIChpID4gMCkgYnVmLmFwcGVuZCgnICcpOwotCi0gICAgICAvLwotICAgICAgLy8gTG9vayBmb3Igd2hpdGVzcGFjZS4KLSAgICAgIC8vCi0gICAgICBib29sZWFuIHdoaXRlc3BhY2UgPSBmYWxzZTsKLSAgICAgIGNoYXJbXSBjaGFycyA9IGFyZ3VtZW50c1tpXS50b0NoYXJBcnJheSgpOwotICAgICAgZm9yIChpbnQgaj0wOyAhd2hpdGVzcGFjZSAmJiBqPGNoYXJzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaGFyc1tqXSkpCi0gICAgICAgIHsKLSAgICAgICAgICB3aGl0ZXNwYWNlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLwotICAgICAgLy8gQXBwZW5kIHRoZSBhcmd1bWVudCwgcXVvdGVkIGFzIG5lY2Vzc2FyeS4KLSAgICAgIC8vCi0gICAgICBpZiAod2hpdGVzcGFjZSkgYnVmLmFwcGVuZCgnIicpOwotICAgICAgZm9yIChpbnQgaj0wOyBqPGNoYXJzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBpZiAoY2hhcnNbal0gPT0gJyInKSBidWYuYXBwZW5kKCdcXCcpOwotICAgICAgICBidWYuYXBwZW5kKGNoYXJzW2pdKTsKLSAgICAgIH0KLSAgICAgIGlmICh3aGl0ZXNwYWNlKSBidWYuYXBwZW5kKCciJyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBwYXJzZXMgd2hpdGVzcGFjZS1kZWxpbWl0dGVkIGZpbGVuYW1lcyBmcm9tCi0gICAgKiB0aGUgZ2l2ZW4gPGNvZGU+aW5wdXQ8L2NvZGU+IHN0cmVhbS4gPGI+TGltaXRhdGlvbjo8L2I+Ci0gICAgKiBRdW90ZWQgZmlsZW5hbWVzIG9yIGZpbGVuYW1lcyB3aXRoIGVtYmVkZGVkIHdoaXRlc3BhY2UKLSAgICAqIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KLSAgICAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgc3RyZWFtLgotICAgICogQHJldHVybiBBbiBlbnVtZXJhdGlvbiBvZiBmaWxlbmFtZXMgZnJvbSB0aGUgc3RyZWFtLgotICAqLwotICBzdGF0aWMgcHVibGljIEVudW1lcmF0aW9uIHBhcnNlRmlsZW5hbWVzRnJvbVN0cmVhbSAoIElucHV0U3RyZWFtIGlucHV0ICkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBWZWN0b3IgZmlsZW5hbWVzID0gbmV3IFZlY3Rvcig2NCw2NCk7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0gICAgYnl0ZSBzdGF0ZSA9IFNUQVRFX1dTOwotICAgIGludCBpYyA9IGlucHV0LnJlYWQoKTsKLSAgICB3aGlsZSAoaWMgPj0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGMgPSAoY2hhcilpYzsKLSAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgU1RBVEVfV1M6Ci0gICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYyk7Ci0gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX05XUzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfTldTOgotICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBmaWxlbmFtZXMuYWRkKGZpbGVuYW1lKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IG51bGw7Ci0gICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1dTOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGljID0gaW5wdXQucmVhZCgpOwotICAgIH0KLSAgICByZXR1cm4gZmlsZW5hbWVzLmVsZW1lbnRzKCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFNUQVRFX1dTID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTVEFURV9OV1MgPSAxOwotCi0KLSAgLyoqCi0gICogUmV0dXJucyB0cnVlIGlzIHRoZSB0eXBlIHBhc3NlZCBpbiBpcyBhIHByaW10aXZlIGphdmEgdHlwZQotICAqIEBwYXJhbSBjbGFzcyBuYW1lIFN0cmluZwotICAqIEByZXR1cm4gdHJ1ZSBpcyBwcmltaXRpdmUgdHlwZQotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlKFN0cmluZyB0eXBlTmFtZSkgCi0gIHsKLQotICAgIGlmICh0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJib29sZWFuIikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJ5dGUiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZG91YmxlIikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImZsb2F0IikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImludCIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJsb25nIikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNob3J0IikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImNoYXIiKSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLSAgLyoqCi0gICogVGhlIG1ldGhvZCByZXBsYWNlIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbG93ZWQgaW4gVVJJcwotICAqIGFuZCBub3QgYWxsb3dlZCBpbiBKYXZhIGNsYXNzIG5hbWVzIHRvIGFuIHVuZGVyc2NvcmUgKCdfJykKLSAgKiBAcGFyYW0gVVJJIFN0cmluZwotICAqIEByZXR1cm4gdmFsaWQgSmF2YSBjbGFzcyBuYW1lIFN0cmluZwotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVUkkyQ2xhc3NOYW1lKCBTdHJpbmcgdXJpICkgewotICAgIFN0cmluZyBjbGFzc05hbWUgPSB1cmk7Ci0gICAgZm9yICggaW50IGkgPSAwOyBpIDwgVVJJX1NZTUJPTFMubGVuZ3RoOyBpKysgKSB7Ci0gICAgCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlICggVVJJX1NZTUJPTFNbaV0sIFVOREVSU0NPUkUgKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBVUklfU1lNQk9MUyA9IHsnLScsICd+JywgJyMnLCAnLycsICcuJ307Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLQotCi0gIC8qKgotICAgKiBUaGlzIHJldHVybnMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIgYmFzZWQgb24gdGhlIGdpdmVuIG5hbWUuIAotICAgKiAoZm9sbG93cyBKQVgtUlBDIDEuMCBQdWJsaWMgUmV2aWV3IERyYWZ0IDIgcmVjb21tZW5kYXRpb25zKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgamF2YUlkZW50aWZpZXJGb3IoU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgYm9vbGVhbiBza2lwcGVkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGxvY2FsTmFtZS5sZW5ndGgoKTsgaSA8IGxlbmd0aDsgKytpKQotICAgIHsKLSAgICAgIGNoYXIgY2hhcmFjdGVyID0gbG9jYWxOYW1lLmNoYXJBdChpKTsKLSAgICAgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY2hhcmFjdGVyKSAmJiAhaXNEZWxpbWl0ZXIoY2hhcmFjdGVyKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNraXBwZWQgJiYgcmVzdWx0Lmxlbmd0aCgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyYWN0ZXIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2hhcmFjdGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGNoYXJhY3Rlcik7Ci0gICAgICAgIHNraXBwZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2tpcHBlZCA9dHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIUphdmFDb252ZW50aW9ucy52YWxpZGF0ZUlkZW50aWZpZXIocmVzdWx0LnRvU3RyaW5nKCkpLmlzT0soKSkKLSAgICB7Ci0gICAgICByZXN1bHQuaW5zZXJ0KDAsICJfIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RlbGltaXRlcihjaGFyIGNoYXJhY3RlcikKLSAgewotICAgIHJldHVybiAiXHUwMDJEXHUwMDJFXHUwMDNBXHUwMDVGXHUwMEI3XHUwMzg3XHUwNkREXHUwNkRFIi5pbmRleE9mKGNoYXJhY3RlcikgIT0gLTE7Ci0gIH0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vVW5pdmVyc2FsUGF0aFRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9Vbml2ZXJzYWxQYXRoVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlNmMzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9Vbml2ZXJzYWxQYXRoVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA4MjUgICAxMzU1NzAgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gVVJMIG5vdCBkaXNwbGF5ZWQgcHJvcGVybHkgb24gZmlyc3QgcGFnZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogPHA+QSB1dGlsaXR5IGNsYXNzIGZvciB0cmFuc2Zvcm1pbmcgYSBwYXRoIHRvIGFuZCBmcm9tIHRoZSBmb2xsb3dpbmcgZm9ybWF0czo8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+QW4gYWJzb2x1dGUgZWNsaXBzZSBwYXRoIChpLmUuIHN0YXJ0cyB3aXRoIC9Qcm9qZWN0TmFtZS8uLi4pPC9saT4KLSAqIDxsaT5BbiBhYnNvbHV0ZSBmaWxlc3lzdGVtIFVSSSBwYXRoIChpLmUuIGZpbGU6L0M6L015V29ya3NwYWNlL1Byb2plY3ROYW1lLy4uLik8L2xpPgotICogPGxpPkEgcGxhdGZvcm0gVVJJIHBhdGggKGkuZS4gcGxhdGZvcm06L3Jlc291cmNlL1Byb2plY3ROYW1lLy4uLik8L2xpPiAKLSAqIDwvdWw+IAotICogPHA+SW4gYWxsIGNhc2VzLCBpZiB0aGUgdHJhbnNmb3JtZXIgY291bGQgbm90IGNvbnZlcnQgdGhlIHBhdGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbml2ZXJzYWxQYXRoVHJhbnNmb3JtZXIgewotCQotCS8qKgotCSAqIFByZWZpeCBvZiBwbGF0Zm9ybSBVUklzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BSRUZJWCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIjsKLQkKLQkvKioKLQkgKiBQcmVmaXggb2YgZmlsZXN5c3RlbSBVUklzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1BSRUZJWCA9ICJmaWxlOi8iOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST1RPQ09MX01BUktFUiA9ICI6IjsKLQlwcml2YXRlIHN0YXRpYyBjaGFyIFBBVEhfU0VQQVJBVE9SICAgID0gJy8nOwotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgYSBVUkkgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguICBUaGlzIG1ldGhvZCBpcyBjYXNlLWluc2Vuc2l0aXZlLiAKLQkgKiAKLQkgKiBAcGFyYW0gdXJpIFRoZSBVUkkgc3RyaW5nIHRvIGNoZWNrLgotCSAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeC4KLQkgKiBAcmV0dXJuIHRydWUgaWZmIHByZWZpeCBpcyBhIHN0cmljdCBwcmVmaXggb2YgdGhlIFVSSSBzdHJpbmcgKGkuZS4gcHJlZml4ICE9IHVyaSksIGZhbHNlCi0JICogaXMgcmV0dXJuZWQgb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ByZWZpeChTdHJpbmcgdXJpLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChwcmVmaXgubGVuZ3RoKCkgPj0gdXJpLmxlbmd0aCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHVyaS5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCgpKS5lcXVhbHNJZ25vcmVDYXNlKHByZWZpeCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBnaXZlbiBwYXRoIHRvIGFuIGVjbGlwc2UgcGF0aC4gIElmIHRoZSBnaXZlbiBwYXRoIGlzIGEgZmlsZXN5c3RlbSBVUkksIGl0IG11c3QgbWFwIHRvCi0JICogYSByZWFsIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHN0ciBUaGUgcGF0aCB0byB0cmFuc2Zvcm0uCi0JICogQHJldHVybiBSZXR1cm5zIGFuIGVjbGlwc2UgcGF0aCBlcXVpdmFsZW50IG9mIHRoZSBnaXZlbiBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9QYXRoKFN0cmluZyBzdHIpIHsKLQkJCi0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBzdHI7Ci0JCQotCQlpZiAoaXNQcmVmaXgoc3RyLCBQTEFURk9STV9QUkVGSVgpKSB7Ci0JCQlzdHIgPSBzdHIuc3Vic3RyaW5nKFBMQVRGT1JNX1BSRUZJWC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCWVsc2UgaWYgKGlzUHJlZml4KHN0ciwgTE9DQVRJT05fUFJFRklYKSkgewotCQkJU3RyaW5nIHMgPSBzdHIuc3Vic3RyaW5nKExPQ0FUSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocykpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlzdHIgPSBmaWxlLmdldEZ1bGxQYXRoKCkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGdpdmVuIHBhdGggdG8gYSBwbGF0Zm9ybSBVUkkgcGF0aC4gIElmIHRoZSBnaXZlbiBwYXRoIGlzIGEgZmlsZXN5c3RlbSBVUkksIGl0IG11c3QgbWFwIHRvCi0JICogYSByZWFsIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHN0ciBUaGUgcGF0aCB0byB0cmFuc2Zvcm0uCi0JICogQHJldHVybiBSZXR1cm5zIGEgcGxhdGZvcm0gVVJJIHBhdGggZXF1aXZhbGVudCBvZiB0aGUgZ2l2ZW4gcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvUGxhdGZvcm1QYXRoKFN0cmluZyBzdHIpIHsKLQotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gc3RyOwkJCi0JCQotCQlpZiAoaXNQcmVmaXgoc3RyLCBMT0NBVElPTl9QUkVGSVgpKSB7Ci0JCQlTdHJpbmcgcyA9IHN0ci5zdWJzdHJpbmcoTE9DQVRJT05fUFJFRklYLmxlbmd0aCgpKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChzKSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXN0ciA9IFBMQVRGT1JNX1BSRUZJWCArIGZpbGUuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKTsKLQkJfQkJCQotCQllbHNlIGlmIChzdHIuaW5kZXhPZihQUk9UT0NPTF9NQVJLRVIpID09IC0xKSB7Ci0JCQlpZiAoc3RyLmNoYXJBdCgwKSA9PSBQQVRIX1NFUEFSQVRPUikKLQkJCQlzdHIgPSBQTEFURk9STV9QUkVGSVggKyBzdHIuc3Vic3RyaW5nKDEpOwotCQkJZWxzZQotCQkJCXN0ciA9IFBMQVRGT1JNX1BSRUZJWCArIHN0cjsKLQkJfQotCQkKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBnaXZlbiBwYXRoIHRvIGEgZmlsZXN5c3RlbSBVUkkgcGF0aC4gIFRoZSBwYXRoIG11c3QgYmUgYSB2YWxpZAotCSAqIGVjbGlwc2UgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHN0ciBUaGUgcGF0aCB0byB0cmFuc2Zvcm0uCi0JICogQHJldHVybiBSZXR1cm5zIGEgZmlsZXN5c3RlbSBVUkkgcGF0aCBlcXVpdmFsZW50IG9mIHRoZSBnaXZlbiBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9Mb2NhdGlvbihTdHJpbmcgc3RyKSB7Ci0JCQotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gc3RyOwotCQkKLQkJU3RyaW5nIHMgPSBzdHI7Ci0JCQotCQlpZiAoaXNQcmVmaXgocywgUExBVEZPUk1fUFJFRklYKSkKLQkJCXMgPSB0b1BhdGgocyk7Ci0JCQotCQlpZiAocy5pbmRleE9mKFBST1RPQ09MX01BUktFUikgPT0gLTEpIHsJCQkKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgocykpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlzdHIgPSBmaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQkJfQotCQkJCQotCQlyZXR1cm4gc3RyOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0lKYXZhQmVhblByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0lKYXZhQmVhblByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmUyN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9JSmF2YUJlYW5Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci0KLS8qKgotICogQGF1dGhvciBjYnJlYWxleQotICogVGhpcyBvYmplY3QgcmVwcmVzZW50cyBhIHNpbXBsZSBvciBpbmRleGVkIHByb3BlcnR5Ci0gKiBhcyBkZWZpbmVkIGJ5IHRoZSBKYXZhIEJlYW4gc3BlY2lmaWNhdGlvbi4gRXZlcnkKLSAqIElKYXZhQmVhblByb3BlcnR5IGlzIGNoYXJhY3Rlcml6ZWQgYnkgZm91ciB0aGluZ3M6Ci0gKiA8b2w+Ci0gKiA8bGk+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LjwvbGk+Ci0gKiA8bGk+V2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5IGlzIGluZGV4ZWQuPC9saT4KLSAqIDxsaT5UaGUgSkRUIElNZXRob2Qgb2YgdGhlIGdldHRlciwgaWYgYW55LjwvbGk+Ci0gKiA8bGk+VGhlIEpEVCBJTWV0aG9kIG9mIHRoZSBzZXR0ZXIsIGlmIGFueS48L2xpPgotICogPC9vbD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YUJlYW5Qcm9wZXJ0eQotewotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgaXMgaW5kZXhlZC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHByb3BlcnR5IGlzIGluZGV4ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmRleGVkICgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkRUIElNZXRob2Qgb2YgdGhlIGdldHRlci4KLQkgKiBGb3IgaW5kZXhlZCBwcm9wZXJ0aWVzLAotCSAqIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZ2V0dGVyIHdpbGwgYmUgYW4gYXJyYXkuCi0JICogRm9yIHNpbXBsZSBwcm9wZXJ0aWVzLAotCSAqIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZ2V0dGVyIHdpbGwgbm90IGJlIGFuIGFycmF5LgotCSAqIEByZXR1cm4gVGhlIEpEVCBJTWV0aG9kIG9mIHRoZSBnZXR0ZXIsCi0JICogb3IgbnVsbCBpZiB0aGlzIGlzIGEgd3JpdGUtb25seSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZCBnZXRHZXR0ZXIgKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkRUIElNZXRob2Qgb2YgdGhlIGluZGV4ZWQgZ2V0dGVyLAotCSAqIG9yIG51bGwgaWYgdGhpcyBpcyBlaXRoZXIgbm90IGFuIGluZGV4ZWQgcHJvcGVydHksCi0JICogb3IgaXMgYW4gaW5kZXhlZCBwcm9wZXJ0eSBidXQgaGFzIG9ubHkgdGhlIGFycmF5LQotCSAqIGJhc2VkIGdldHRlci4KLQkgKiBAcmV0dXJuIFRoZSBKRFQgSU1ldGhvZCBvZiB0aGUgaW5kZXhlZCBnZXR0ZXIsCi0JICogb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhbiBpbmRleGVkIHByb3BlcnR5IG9yCi0JICogaWYgdGhlcmUgaXMgbm8gaW5kZXhlZCBnZXR0ZXIuCi0JICovCi0JcHVibGljIElNZXRob2QgZ2V0SW5kZXhlZEdldHRlciAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpEVCBJTWV0aG9kIG9mIHRoZSBzZXR0ZXIuCi0JICogRm9yIGluZGV4ZWQgcHJvcGVydGllcywKLQkgKiB0aGUgcGFyYW1ldGVyIHR5cGUgb2YgdGhlIHNldHRlciB3aWxsIGJlIGFuIGFycmF5LgotCSAqIEZvciBzaW1wbGUgcHJvcGVydGllcywKLQkgKiB0aGUgcGFyYW1ldGVyIHR5cGUgb2YgdGhlIHNldHRlciB3aWxsIG5vdCBiZSBhbiBhcnJheS4KLQkgKiBAcmV0dXJuIFRoZSBKRFQgSU1ldGhvZCBvZiB0aGUgc2V0dGVyLAotCSAqIG9yIG51bGwgaWYgdGhpcyBpcyBhIHJlYWQtb25seSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZCBnZXRTZXR0ZXIgKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkRUIElNZXRob2Qgb2YgdGhlIGluZGV4ZWQgc2V0dGVyLAotCSAqIG9yIG51bGwgaWYgdGhpcyBpcyBlaXRoZXIgbm90IGFuIGluZGV4ZWQgcHJvcGVydHksCi0JICogb3IgaXMgYW4gaW5kZXhlZCBwcm9wZXJ0eSBidXQgaGFzIG9ubHkgdGhlIGFycmF5LQotCSAqIGJhc2VkIHNldHRlci4KLQkgKiBAcmV0dXJuIFRoZSBKRFQgSU1ldGhvZCBvZiB0aGUgaW5kZXhlZCBzZXR0ZXIsCi0JICogb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhbiBpbmRleGVkIHByb3BlcnR5IG9yCi0JICogaWYgdGhlcmUgaXMgbm8gaW5kZXhlZCBzZXR0ZXIuCi0JICovCi0JcHVibGljIElNZXRob2QgZ2V0SW5kZXhlZFNldHRlciAoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIHdpdGhpbiB3aGljaCB0aGUgZ2V0dGVyIGFuZC9vciBzZXR0ZXIKLQkgKiBvZiB0aGlzIHByb3BlcnR5IGlzIGRlY2xhcmVkLCBvciBudWxsIGlmIG5vbmUuCi0JICogQHJldHVybiBUaGUgdHlwZSB3aXRoaW4gd2hpY2ggdGhlIGdldHRlciBhbmQvb3Igc2V0dGVyCi0JICogb2YgdGhpcyBwcm9wZXJ0eSBpcyBkZWNsYXJlZC4KLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0RGVjbGFyaW5nVHlwZSAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvSUphdmFXZWJTZXJ2aWNlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9JSmF2YVdlYlNlcnZpY2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTJjOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9JSmF2YVdlYlNlcnZpY2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotCi0vKioKLSAqIEBhdXRob3IgY2JyZWFsZXkKLSAqIEEgSmF2YSBXZWIgc2VydmljZSBjb25mb3JtYW5jZSBSdWxlIHRlc3RzIHNvbWUgY29sbGVjdGlvbgotICogb2YgSmF2YSByZXNvdXJjZXMgdGhhdCBpbXBsZW1lbnQsIG9yIGFyZSBtZWFudCB0byBpbXBsZW1lbnQsCi0gKiBhIFdlYiBzZXJ2aWNlIGFnYWluc3QgYSBzaW5nbGUsIGNvbmNpc2UgcmVxdWlyZW1lbnQgYXMgaXMKLSAqIHR5cGljYWxseSBkZWZpbmVkIGJ5IGEgc3BlY2lmaWNhdGlvbiAoZWcuIEpBWC1SUEMsIEpTUiAxMDkpCi0gKiBvciBhIHJ1bnRpbWUgKGVnLiBBcGFjaGUgQXhpcykuCi0gKiA8cD4KLSAqIEV2ZXJ5IHJ1bGUgbXVzdCBoYXZlIGEgbmFtZXNwYWNlIGFuZCBhIHVuaXF1ZSBJRCB1bmRlciB0aGF0Ci0gKiB0aGF0IG5hbWVzcGFjZS4gRXZlcnkgcnVsZSBtYXkgaGF2ZSBhIHNob3J0IG5hbWUgYW5kIGEgbG9uZwotICogZGVzY3JpcHRpb24sIGJvdGggb2Ygd2hpY2ggYXJlIHJlY29tbWVuZGVkIGJ1dCBvcHRpb25hbC4KLSAqIDxwPgotICogRXZlcnkgcnVsZSBmb2xsb3dzIGEgbGlmZWN5Y2xlIG9mIGluaXRpYWxpemF0aW9uLCBhbmFseXNpcwotICogYW5kIGNvbXBsZXRpb24uIEEgSmF2YSBXZWIgc2VydmljZSBydWxlIGVuZ2luZSB3aWxsIGRyaXZlCi0gKiB0aGUgPGNvZGU+aW5pdCgpPC9jb2RlPiBtZXRob2QgdG8gaW5pdGlhbGl6ZSB0aGUgcnVsZSwgdGhlbgotICogZHJpdmUgdGhlIHZhcmlvdXMgPGNvZGU+dmlzaXQuLi4oKTwvY29kZT4gbWV0aG9kcyBhcyBpdAotICogbmF2aWdhdGVzIHNvbWUgY29sbGVjdGlvbiBvZiBKRFQgcmVzb3VyY2VzLCB0aGVuIGRyaXZlIHRoZQotICogPGNvZGU+Z2V0UmVzdWx0cygpPC9jb2RlPiBtZXRob2QgdG8gaW5kaWNhdGUgYW5hbHlzaXMgaXMgZG9uZQotICogYW5kIHJldHJpZXZlIGEgc3RhdHVzIG9iamVjdCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVdlYlNlcnZpY2VSdWxlCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJ1bGUKLQkgKiB3aXRoaW4gdGhlIG5hbWVzcGFjZSB0byB3aGljaCB0aGUgcnVsZSBiZWxvbmdzLgotCSAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBydWxlLgotCSAqIFZhbGlkIHJ1bGUgaWRlbnRpZmllcnMgbXVzdCBub3QgYmUgbmVnYXRpdmUuCi0JICovCi0JcHVibGljIGludCBnZXRJZCAoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgdG8gd2hpY2ggdGhpcyBydWxlIGJlbG9uZ3MuCi0JICogQHJldHVybiBUaGUgbmFtZXNwYWNlIHRvIHdoaWNoIHRoaXMgcnVsZSBiZWxvbmdzLgotCSAqIE5ldmVyIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0YWJsZSBzaG9ydCBuYW1lIG9mIHRoaXMgcnVsZS4gIAotCSAqIEByZXR1cm4gVGhlIHRyYW5zbGF0YWJsZSBzaG9ydCBuYW1lIG9mIHRoaXMgcnVsZSwKLQkgKiBvciBudWxsIGlmIHRoZSBydWxlIGhhcyBubyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHJ1bGUuCi0JICogQHJldHVybiBUaGUgdHJhbnNsYXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcnVsZSwKLQkgKiBvciBudWxsIGlmIHRoZSBydWxlIGhhcyBubyBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpOwotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBydWxlIGVuZ2luZSB0byBnaXZlIHRoaXMgcnVsZSBhIGNoYW5jZQotCSAqIHRvIGluaXRpYWxpemUgaXRzZWxmIHByaW9yIHRvIHZpc2l0aW5nIEpEVCBvYmplY3RzLgotCSAqIEBwYXJhbSBlbmdpbmUgVGhlIGVuZ2luZSBpbml0aWFsaXppbmcgdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQgKCBJSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lIGVuZ2luZSApOwotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBydWxlIGVuZ2luZSB3aGVuIGl0IGRlY2lkZXMgdG8gdmlzaXQKLQkgKiBhIEphdmEgY2xhc3MgKGllLiBwcmltaXRpdmUgdHlwZXMgYXJlIGV4Y2x1ZGVkKS4KLQkgKiBAcGFyYW0gamR0Q2xhc3MgVGhlIGNsYXNzIHRvIHZpc2l0LgotCSAqIEBwYXJhbSBwZWFudXRUcmFpbCBUaGUgdHJhaWwgb2Ygb2JqZWN0cyBiYWNrIHRvIHRoZSByb290LgotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0Q2xhc3MgKCBJVHlwZSBqZHRDbGFzcywgU3RhY2sgcGVhbnV0VHJhaWwgKTsKLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgcnVsZSBlbmdpbmUgd2hlbiBpdCBkZWNpZGVzIHRvIHZpc2l0Ci0JICogYSBKYXZhIGNsYXNzIGZvdW5kIG9uIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgbWV0aG9kLgotCSAqIEBwYXJhbSBqZHRDbGFzcyBUaGUgZXhjZXB0aW9uIGNsYXNzIHRvIHZpc2l0LgotCSAqIEBwYXJhbSBwZWFudXRUcmFpbCBUaGUgdHJhaWwgb2Ygb2JqZWN0cyBiYWNrIHRvIHRoZSByb290LgotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0RXhjZXB0aW9uICggSVR5cGUgamR0Q2xhc3MsIFN0YWNrIHBlYW51dFRyYWlsICk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIHJ1bGUgZW5naW5lIHdoZW4gaXQgZGVjaWRlcyB0byB2aXNpdAotCSAqIGEgZmllbGQgYmVsb25naW5nIHRvIGEgY2xhc3MuCi0JICogQHBhcmFtIGpkdEZpZWxkIFRoZSBmaWVsZCB0byB2aXNpdC4KLQkgKiBAcGFyYW0gcGVhbnV0VHJhaWwgVGhlIHRyYWlsIG9mIG9iamVjdHMgYmFjayB0byB0aGUgcm9vdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdEZpZWxkICggSUZpZWxkIGpkdEZpZWxkLCBTdGFjayBwZWFudXRUcmFpbCApOwotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBydWxlIGVuZ2luZSB3aGVuIGl0IGRlY2lkZXMgdG8gdmlzaXQKLQkgKiBhIEphdmEgQmVhbiBwcm9wZXJ0eSAoaWUuIHJlcHJlc2VudGVkIGJ5IGEgImdldCIgYW5kL29yCi0JICogInNldCIgbWV0aG9kKSBiZWxvbmluZyB0byBhIGNsYXNzLgotCSAqIEBwYXJhbSBiZWFuUHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIHZpc2l0LgotCSAqIEBwYXJhbSBwZWFudXRUcmFpbCBUaGUgdHJhaWwgb2Ygb2JqZWN0cyBiYWNrIHRvIHRoZSByb290LgotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0UHJvcGVydHkgKCBJSmF2YUJlYW5Qcm9wZXJ0eSBiZWFuUHJvcGVydHksIFN0YWNrIHBlYW51dFRyYWlsICk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIHJ1bGUgZW5naW5lIHdoZW4gaXQgZGVjaWRlcyB0byB2aXNpdCBhIG1ldGhvZC4KLQkgKiBAcGFyYW0gamR0TWV0aG9kIFRoZSBtZXRob2QgdG8gdmlzaXQuCi0JICogQHBhcmFtIHBlYW51dFRyYWlsIFRoZSB0cmFpbCBvZiBvYmplY3RzIGJhY2sgdG8gdGhlIHJvb3QuCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRNZXRob2QgKCBJTWV0aG9kIGpkdE1ldGhvZCwgU3RhY2sgcGVhbnV0VHJhaWwgKTsKLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgcnVsZSBlbmdpbmUgYWZ0ZXIgYWxsIEpEVCBvYmplY3RzIGhhdmUKLQkgKiBiZWVuIHZpc2l0ZWQgc28gdGhhdCB0aGUgcnVsZSBjYW4gcmV0dXJuIGEgc3RhdHVzCi0JICogb2JqZWN0ICh1c3VhbGx5IGEgbXVsdGktc3RhdHVzKSB3aXRoIGEgc3VtbWFyeSBvZgotCSAqIGFueSB2aW9sYXRpb25zIGJ5IEpEVCBvYmplY3RzIGRldGVjdGVkIGJ5IHRoaXMgcnVsZS4KLQkgKiBAcmV0dXJuIFRoZSByZXN1bHRzIG9mIHRoZSBydWxlJ3MgYW5hbHlzaXMuCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0UmVzdWx0cyAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvSUphdmFXZWJTZXJ2aWNlUnVsZUVuZ2luZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9JSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZWYwYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9JSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MTkgICAxMzI5MDUgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci0KLS8qKgotICogQGF1dGhvciBjYnJlYWxleQotICogVGhpcyBpcyBhbiBlbmdpbmUgdGhhdCB3YWxrcyBhIEpEVCBtb2RlbCBhbmQgcnVucyBydWxlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lCi17Ci0JLyoqCi0JICogQW5hbHl6ZXMgdGhlIGdpdmVuIGNsYXNzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBnaXZlbiAKLQkgKiBwcm9qZWN0IGZvciBjb21wbGlhbmNlIHRvIGEgc2V0IG9mIEpBWC1SUEMgcnVsZXMuCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgY29udGV4dCBvZiB0aGUgYW5hbHlzaXMuCi0JICogQHBhcmFtIHJvb3RDbGFzcyBUaGUgSVR5cGUgb2YgdGhlIGNsYXNzIHRvIGFuYWx5emUuCi0JICogQHBhcmFtIHJ1bGVzIFRoZSBydWxlcyB0byB1c2UgZm9yIHRoZSBhbmFseXNpcy4KLQkgKiBAcmV0dXJuIEFuIElTdGF0dXMgc3VtbWFyaXppbmcgdGhlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGFuYWx5emUgKCBJUHJvamVjdCBwcm9qZWN0LCBJVHlwZSByb290Q2xhc3MsIEphdmFXZWJTZXJ2aWNlUnVsZVNldCBydWxlcyApOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpEVFJlc29sdmVyIGluIHVzZSBieSB0aGlzIGFuYWx5emVyLgotCSAqIFRoZSBKRFRSZXNvbHZlciBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBudWxsIG9ubHkKLQkgKiBhZnRlciB0aGUgYW5hbHl6ZSBtZXRob2QgaGFzIGJlZW4gaW52b2tlZCBhbmQgYmVmb3JlCi0JICogdGhlIGZpcnN0IHJ1bGUgaXMgdmlzaXRlZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQKLQkgKiBmb3IgdXNlIGJ5IGltcGxlbWVudGF0aW9ucyBvZiBJSmF2YVdlYlNlcnZpY2VSdWxlLgotCSAqIEByZXR1cm4gVGhlIEpEVFJlc29sdmVyIGluIHVzZSBieSB0aGlzIGFuYWx5emVyLgotCSAqLwotCXB1YmxpYyBKRFRSZXNvbHZlciBnZXRKRFRSZXNvbHZlciAoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9ncmVzcyBtb25pdG9yIGluIHVzZSBieSB0aGlzIGFuYWx5emVyLAotCSAqIG9yIG51bGwgaWYgbm8gcHJvZ3Jlc3MgbW9uaXRvciBpcyBpbiB1c2UuCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbXBsZW1lbnRhdGlvbnMKLQkgKiBvZiBJSmF2YVdlYlNlcnZpY2VSdWxlLgotCSAqIEByZXR1cm4gVGhlIHByb2dyZXNzIG1vbml0b3IgaW4gdXNlIGJ5IHRoaXMgYW5hbHl6ZXIsCi0JICogb3IgbnVsbCBmb3Igbm9uZS4KLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IgKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0pBWFJQQ1dlYlNlcnZpY2VBbmFseXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9KQVhSUENXZWJTZXJ2aWNlQW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZWZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0pBWFJQQ1dlYlNlcnZpY2VBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxOSAgIDEzMjkwNSBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleSAgICAgICAgICAKLSAqIDIwMDYwNjA3ICAgMTQ1NjA0IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5XU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5ydWxlcy5KQVhSUENSdWxlU2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgYW5hbHl6aW5nCi0gKiBjb21wbGlhbmNlIG9mIEphdmEgc2VydmljZSBjbGFzc2VzIGFuZCB2YWx1ZSB0eXBlcyB0bwotICogdGhlIEpBWC1SUEMgMS4xIHNwZWNpZmljYXRpb24uIFR5cGljYWwgdXNhZ2Ugb2YgdGhpcwotICogY2xhc3M6Ci0gKiA8Y29kZT4KLSAqIElUeXBlIHR5cGUgPSBKQVhSUENXZWJTZXJ2aWNlQW5hbHl6ZXIuYXNUeXBlKG15SmF2YUZpbGVSZXNvdXJjZSk7Ci0gKiBKYXZhV2ViU2VydmljZVJ1bGVTZXQgcnVsZXMgPSBKQVhSUENXZWJTZXJ2aWNlQW5hbHl6ZXIuZ2V0UnVsZVNldCgpOwotICogSkFYUlBDV2ViU2VydmljZUFuYWx5emVyLmdldFJ1bGVFbmdpbmUoKS5hbmFseXplKHR5cGUscnVsZXMsbXlQcm9ncmVzc01vbml0b3IpOwotICogPC9jb2RlPiAKLSAqIEBhdXRob3IgY2JyZWFsZXkKLSAqLwotcHVibGljIGNsYXNzIEpBWFJQQ1dlYlNlcnZpY2VBbmFseXplcgotewotCXByaXZhdGUgSmF2YVdlYlNlcnZpY2VSdWxlU2V0IHJ1bGVTZXRfOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgSkFYLVJQQyBXZWIgc2VydmljZSBhbmFseXplciwKLQkgKiBhIGNvbnZlbmllbmNlIGNsYXNzIHdyYXBwZWQgYXJvdW5kIGEKLQkgKiBKQVhSUENXZWJTZXJ2aWNlQW5hbHl6ZXIuCi0JICovCi0JcHVibGljIEpBWFJQQ1dlYlNlcnZpY2VBbmFseXplciAoKQotCXsKLQkJcnVsZVNldF8gPSBKQVhSUENSdWxlU2V0RmFjdG9yeS5uZXdSdWxlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0IG9mIHJ1bGVzIGluIHVzZSwgdGhlIGNvbnRlbnRzIG9mCi0JICogd2hpY2ggY2FuIGJlIG1hbmlwdWxhdGVkIGFuZCB3aWxsIGJlIHJlc3BlY3RlZCBieQotCSAqIHRoaXMgYW5hbHl6ZXIuIEluIG90aGVyIHdvcmRzLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEKLQkgKiByZWZlcmVuY2UgdG8sIG5vdCBhIGNvcHkgb2YsIHRoZSBzZXQgb2YgcnVsZXMgaW4gdXNlLgotCSAqIEByZXR1cm4gVGhlIHNldCBvZiBydWxlcyBpbiB1c2UgYnkgdGhlIGFuYWx5emVyLgotCSAqLwotCXB1YmxpYyBKYXZhV2ViU2VydmljZVJ1bGVTZXQgZ2V0UnVsZVNldCAoKQotCXsKLQkJcmV0dXJuIHJ1bGVTZXRfOwotCX0KLQkKLQkvKioKLQkgKiBBbmFseXplcyB0aGUgSmF2YSBzZXJ2aWNlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgotCSAqIEpEVCB0eXBlIGZvciBjb21wbGlhbmNlIHRvIHRoZSBKQVgtUlBDIGZvciBjb21wbGlhbmNlIHRvCi0JICogdGhlIEpBWC1SUEMgc3BlY2lmaWNhdGlvbi4KLQkgKiBQcm9ncmVzcyBtb25pdG9yaW5nIGlzIHByb3ZpZGVkIGJ5IHRoZSBnaXZlbiBtb25pdG9yLiAKLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBjb250ZXh0IGluIHdoaWNoIHRoZSBhbmFseXNpcwotCSAqIHNob3VsZCB0YWtlIHBsYWNlLgotCSAqIEBwYXJhbSByb290Q2xhc3MgVGhlIEphdmEgc2VydmljZSBjbGFzcyB0byBhbmFseXplLgotCSAqIEBwYXJhbSBtb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSwKLQkgKiBvciBudWxsIGlmIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBIHN0YXR1cyBvYmplY3Qgd2hvc2Ugc2V2ZXJpdHksIG1lc3NhZ2UgYW5kCi0JICogY2hpbGQgc3RhdHVzIG9iamVjdHMsIGlmIGFueSwgZGVzY3JpYmUgYW55IEpBWC1SUEMKLQkgKiBydWxlcyB0aGF0IG1heSBiZSBjb21wcm9taXNlZCBieSB0aGUgc2VydmljZSBjbGFzcy4KLQkgKiBOZXZlciByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIElTdGF0dXMgYW5hbHl6ZSAoIElQcm9qZWN0IHByb2plY3QsIElUeXBlIHJvb3RDbGFzcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCUlKYXZhV2ViU2VydmljZVJ1bGVFbmdpbmUgZW5naW5lID0gbmV3IEpBWFJQQ1dlYlNlcnZpY2VSdWxlRW5naW5lKG1vbml0b3IpOwotCQlyZXR1cm4gZW5naW5lLmFuYWx5emUocHJvamVjdCxyb290Q2xhc3MscnVsZVNldF8pOwotCX0KLQotCS8qKgotCSAqIEFuYWx5emVzIHRoZSBKYXZhIHNlcnZpY2UgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuCi0JICogSkRUIHR5cGUgZm9yIGNvbXBsaWFuY2UgdG8gdGhlIEpBWC1SUEMgZm9yIGNvbXBsaWFuY2UgdG8KLQkgKiB0aGUgSkFYLVJQQyBzcGVjaWZpY2F0aW9uLgotCSAqIFByb2dyZXNzIG1vbml0b3JpbmcgaXMgcHJvdmlkZWQgYnkgdGhlIGdpdmVuIG1vbml0b3IuIAotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IGNvbnRleHQgaW4gd2hpY2ggdGhlIGFuYWx5c2lzCi0JICogc2hvdWxkIHRha2UgcGxhY2UuCi0JICogQHBhcmFtIHJvb3RDbGFzcyBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi0JICogSmF2YSBzZXJ2aWNlIGNsYXNzIHRvIGFuYWx5emUuCi0JICogQHBhcmFtIG1vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlLAotCSAqIG9yIG51bGwgaWYgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiBAcmV0dXJuIEEgc3RhdHVzIG9iamVjdCB3aG9zZSBzZXZlcml0eSwgbWVzc2FnZSBhbmQKLQkgKiBjaGlsZCBzdGF0dXMgb2JqZWN0cywgaWYgYW55LCBkZXNjcmliZSBhbnkgSkFYLVJQQwotCSAqIHJ1bGVzIHRoYXQgbWF5IGJlIGNvbXByb21pc2VkIGJ5IHRoZSBzZXJ2aWNlIGNsYXNzLgotCSAqIE5ldmVyIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBhbmFseXplICggSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHJvb3RDbGFzcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlJVHlwZSByb290VHlwZSA9IGFzVHlwZShyb290Q2xhc3MscHJvamVjdCk7Ci0JCQlpZiAocm9vdFR5cGUgPT0gbnVsbCkKLQkJCXsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFdTUGx1Z2luTWVzc2FnZXMuTVNHX0pBWFJQQzExX1VOUkVTT0xWRURfQ0xBU1Mscm9vdENsYXNzLHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJvcmcuZWNsaXBzZS5qc3Qud3MiLDAsbWVzc2FnZSxudWxsKTsKLQkJCX0KLQkJCXJldHVybiBhbmFseXplKHByb2plY3Qscm9vdFR5cGUsbW9uaXRvcik7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBBbiBleGNlcHRpb24gbWF5IGJlIHRocm93biBmcm9tIHRoZSBjYWxsIHRvIGFzVHlwZSguLi4pLAotCQkJLy8gbm90IGZyb20gdGhlIGNhbGwgdG8gYW5hbHl6ZSguLi4pLiBFeGNlcHRpb25zIHdpdGhpbiB0aGUKLQkJCS8vIGFuYWx5emUoLi4uKSBtZXRob2QgYXJlIGNhcHR1cmVkIGluIHRoZSByZXR1cm5lZCBJU3RhdHVzLgotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwib3JnLmVjbGlwc2UuanN0LndzIiwwLCJJbnRlcm5hbCBlcnJvciIsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbmFseXplcyB0aGUgSmF2YSBzZXJ2aWNlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgotCSAqICIuamF2YSIgY29tcGlsYXRpb24gdW5pdCBvciAiLmNsYXNzIiBmaWxlIGZvciBjb21wbGlhbmNlCi0JICogdG8gdGhlIEpBWC1SUEMgc3BlY2lmaWNhdGlvbi4KLQkgKiBQcm9ncmVzcyBtb25pdG9yaW5nIGlzIHByb3ZpZGVkIGJ5IHRoZSBnaXZlbiBtb25pdG9yLiAKLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBjb250ZXh0IGluIHdoaWNoIHRoZSBhbmFseXNpcwotCSAqIHNob3VsZCB0YWtlIHBsYWNlLgotCSAqIEBwYXJhbSByb290Q2xhc3MgVGhlIEphdmEgc2VydmljZSBjbGFzcyB0byBhbmFseXplLgotCSAqIEBwYXJhbSBtb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSwKLQkgKiBvciBudWxsIGlmIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBIHN0YXR1cyBvYmplY3Qgd2hvc2Ugc2V2ZXJpdHksIG1lc3NhZ2UgYW5kCi0JICogY2hpbGQgc3RhdHVzIG9iamVjdHMsIGlmIGFueSwgZGVzY3JpYmUgYW55IEpBWC1SUEMKLQkgKiBydWxlcyB0aGF0IG1heSBiZSBjb21wcm9taXNlZCBieSB0aGUgc2VydmljZSBjbGFzcy4KLQkgKiBOZXZlciByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIElTdGF0dXMgYW5hbHl6ZSAoIElQcm9qZWN0IHByb2plY3QsIElGaWxlIHJvb3RDbGFzcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlJVHlwZSByb290VHlwZSA9IGFzVHlwZShyb290Q2xhc3MpOwotCQkJaWYgKHJvb3RUeXBlID09IG51bGwpCi0JCQl7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChXU1BsdWdpbk1lc3NhZ2VzLk1TR19KQVhSUEMxMV9VTlJFU09MVkVEX0NMQVNTLHJvb3RDbGFzcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkscHJvamVjdC5nZXROYW1lKCkpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIm9yZy5lY2xpcHNlLmpzdC53cyIsMCxtZXNzYWdlLG51bGwpOwotCQkJfQotCQkJcmV0dXJuIGFuYWx5emUocHJvamVjdCxyb290VHlwZSxtb25pdG9yKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIEFuIGV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGZyb20gdGhlIGNhbGwgdG8gYXNUeXBlKC4uLiksCi0JCQkvLyBub3QgZnJvbSB0aGUgY2FsbCB0byBhbmFseXplKC4uLikuIEV4Y2VwdGlvbnMgd2l0aGluIHRoZQotCQkJLy8gYW5hbHl6ZSguLi4pIG1ldGhvZCBhcmUgY2FwdHVyZWQgaW4gdGhlIHJldHVybmVkIElTdGF0dXMuCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJvcmcuZWNsaXBzZS5qc3Qud3MiLDAsIkludGVybmFsIGVycm9yIixlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgdHlwZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gZmlsZSwKLQkgKiBvciBudWxsIGlmIG5vIHN1Y2ggdHlwZSBjYW4gYmUgY2xlYXJseSBkZXRlcm1pbmVkLgotCSAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHdob3NlIHR5cGUgdG8gaW5mZXIsIHVzdWFsbHkgYQotCSAqICIuamF2YSIgb3IgIi5jbGFzcyIgZmlsZS4gRm9yICIuamF2YSIgZmlsZXMsIHRoaXMKLQkgKiBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHByaW1hcnkgdHlwZS4KLQkgKiBAcmV0dXJuIFRoZSBpbmZlcnJlZCBKRFQgSmF2YSB0eXBlLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBnaXZlbiBmaWxlIGNvdWxkIG5vdAotCSAqIG1hcHBlZCB0byBhIEpEVCBJVHlwZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJVHlwZSBhc1R5cGUgKCBTdHJpbmcgcW5hbWUsIElQcm9qZWN0IHByb2plY3QgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlUeXBlIHR5cGUgPSBudWxsOwotCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkKLQkJewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdClqYXZhRWxlbWVudDsKLQkJCXR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShxbmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgdHlwZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gZmlsZSwKLQkgKiBvciBudWxsIGlmIG5vIHN1Y2ggdHlwZSBjYW4gYmUgY2xlYXJseSBkZXRlcm1pbmVkLgotCSAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHdob3NlIHR5cGUgdG8gaW5mZXIsIHVzdWFsbHkgYQotCSAqICIuamF2YSIgb3IgIi5jbGFzcyIgZmlsZS4gRm9yICIuamF2YSIgZmlsZXMsIHRoaXMKLQkgKiBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHByaW1hcnkgdHlwZS4KLQkgKiBAcmV0dXJuIFRoZSBpbmZlcnJlZCBKRFQgSmF2YSB0eXBlLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBnaXZlbiBmaWxlIGNvdWxkIG5vdAotCSAqIG1hcHBlZCB0byBhIEpEVCBJVHlwZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJVHlwZSBhc1R5cGUgKCBJRmlsZSBmaWxlICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKGZpbGUpOwotCQlpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotCQl7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KWphdmFFbGVtZW50OwotCQkJdHlwZSA9IGNvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKTsKLQkJfQotCQllbHNlIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCXsKLQkJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKElDbGFzc0ZpbGUpamF2YUVsZW1lbnQ7Ci0JCQl0eXBlID0gY2xhc3NGaWxlLmdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0pBWFJQQ1dlYlNlcnZpY2VSdWxlRW5naW5lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0pBWFJQQ1dlYlNlcnZpY2VSdWxlRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTk3ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9KQVhSUENXZWJTZXJ2aWNlUnVsZUVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxOSAgIDEzMjkwNSBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleQotICogMjAwNjA3MTEgICAxNDk0MTEgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5XU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBjYnJlYWxleQotICogVGhpcyBlbmdpbmUgbmF2aWdhdGVkIEpEVCBjbGFzc2VzIGFjY29yZGluZyB0byBhIEpBWC1SUEMKLSAqIGludGVycHJldGF0aW9uLiBUaGUgcm9vdCBjbGFzcyBpcyBjb25zaWRlcmVkIHRvIGJlIGEKLSAqIGNhbmRpZGF0ZSBKQVgtUlBDIHNlcnZpY2UgY2xhc3MsIGFuZCBhbnkgbm9uLXN0YW5kYXJkCi0gKiBvciBub24tcHJpbWl0aXZlIHR5cGVzIHVzZWQgYnkgdGhlIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2UKLSAqIGNsYXNzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGNhbmRpZGF0ZXMgZm9yIEpBWC1SUEMgdmFsdWUKLSAqIHR5cGUgY2xhc3Nlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhSUENXZWJTZXJ2aWNlUnVsZUVuZ2luZSBpbXBsZW1lbnRzIElKYXZhV2ViU2VydmljZVJ1bGVFbmdpbmUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEpBWC1SUEMgYW5hbHlzaXMgZW5naW5lIHdpdGggdGhlIGdpdmVuCi0JICogcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUKLQkgKiBlbmdpbmUgdG8gdXNlLCBvciBudWxsIGlmIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICovCi0JcHVibGljIEpBWFJQQ1dlYlNlcnZpY2VSdWxlRW5naW5lICggSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKQotCXsKLQkJcHJvZ3Jlc3NNb25pdG9yXyA9IHByb2dyZXNzTW9uaXRvcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhV2ViU2VydmljZVJ1bGVFbmdpbmUjYW5hbHl6ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUsIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGVTZXQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGFuYWx5emUgKCBJUHJvamVjdCBwcm9qZWN0LCBJVHlwZSByb290Q2xhc3MsIEphdmFXZWJTZXJ2aWNlUnVsZVNldCBydWxlcyApCi0JewotCQl2aXNpdGVkXyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXBlYW51dFRyYWlsXyA9IG5ldyBTdGFjaygpOwkJCi0JCXJlc29sdmVyXyA9IG5ldyBKRFRSZXNvbHZlcihwcm9qZWN0LHByb2dyZXNzTW9uaXRvcl8pOwotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCXJ1bGVzLmluaXQodGhpcyk7Ci0JCXRyeQotCQl7Ci0JCQlhbmFseXplU2VydmljZUNsYXNzKHJvb3RDbGFzcyxydWxlcyk7Ci0JCQlTdHJpbmcgaW5DYXNlT2ZGYWlsdXJlTWVzc2FnZSA9IE5MUy5iaW5kKFdTUGx1Z2luTWVzc2FnZXMuTVNHX0pBWFJQQzExX05PVF9DT01QTElBTlQscm9vdENsYXNzLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCXN0YXR1cyA9IHJ1bGVzLmdldFJlc3VsdHMoaW5DYXNlT2ZGYWlsdXJlTWVzc2FnZSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIm9yZy5lY2xpcHNlLmpzdC53cyIsMCwiSW50ZXJuYWwgRXJyb3IiLGUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplU2VydmljZUNsYXNzICggSVR5cGUgdHlwZSwgSmF2YVdlYlNlcnZpY2VSdWxlU2V0IHJ1bGVzICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlydWxlcy52aXNpdENsYXNzKHR5cGUscGVhbnV0VHJhaWxfKTsKLQkJdmlzaXRlZF8uYWRkKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlwdXNoKHR5cGUpOwotCQl0cnkKLQkJewotCQkJSVR5cGVbXSBzdXBlckNsYXNzZXMgPSByZXNvbHZlcl8uZ2V0U3VwZXJDbGFzc2VzKHR5cGUpOwotCQkJSU1ldGhvZFtdIG1ldGhvZHMgPSByZXNvbHZlcl8uZ2V0UHVibGljTWV0aG9kcyh0eXBlLHN1cGVyQ2xhc3Nlcyk7Ci0JCQlmb3IgKGludCBtPTA7IG08bWV0aG9kcy5sZW5ndGg7IG0rKykKLQkJCXsKLQkJCQlhbmFseXplTWV0aG9kKG1ldGhvZHNbbV0scnVsZXMpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJcG9wKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFuYWx5emVNZXRob2QgKCBJTWV0aG9kIG1ldGhvZCwgSmF2YVdlYlNlcnZpY2VSdWxlU2V0IHJ1bGVzICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlydWxlcy52aXNpdE1ldGhvZChtZXRob2QscGVhbnV0VHJhaWxfKTsKLQkJcHVzaChtZXRob2QpOwotCQl0cnkKLQkJewotCQkJSVR5cGUgcmV0dXJuVHlwZSA9IHJlc29sdmVyXy5nZXRSZXR1cm5UeXBlKG1ldGhvZCk7Ci0JCQlhbmFseXplRGF0YVR5cGUocmV0dXJuVHlwZSxydWxlcyk7Ci0JCQlJVHlwZVtdIHBhcmFtZXRlclR5cGVzID0gcmVzb2x2ZXJfLmdldFBhcmFtZXRlclR5cGVzKG1ldGhvZCk7Ci0JCQlmb3IgKGludCBwPTA7IHA8cGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBwKyspCi0JCQl7Ci0JCQkJYW5hbHl6ZURhdGFUeXBlKHBhcmFtZXRlclR5cGVzW3BdLHJ1bGVzKTsKLQkJCX0KLQkJCUlUeXBlW10gZXhjZXB0aW9uVHlwZXMgPSByZXNvbHZlcl8uZ2V0RXhjZXB0aW9uVHlwZXMobWV0aG9kKTsKLQkJCWZvciAoaW50IGU9MDsgZTxleGNlcHRpb25UeXBlcy5sZW5ndGg7IGUrKykKLQkJCXsKLQkJCQlhbmFseXplRXhjZXB0aW9uVHlwZShleGNlcHRpb25UeXBlc1tlXSxydWxlcyk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlwb3AoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYW5hbHl6ZURhdGFUeXBlICggSVR5cGUgdHlwZSwgSmF2YVdlYlNlcnZpY2VSdWxlU2V0IHJ1bGVzICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlpZiAodHlwZSAhPSBudWxsICYmICFyZXNvbHZlcl8uaXNTdGFuZGFyZFR5cGUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgJiYgIXZpc2l0ZWRfLmNvbnRhaW5zKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKQotCQl7Ci0JCQlydWxlcy52aXNpdENsYXNzKHR5cGUscGVhbnV0VHJhaWxfKTsJCQkKLQkJCXZpc2l0ZWRfLmFkZCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCXB1c2godHlwZSk7Ci0JCQl0cnkKLQkJCXsJCi0JCQkJSVR5cGVbXSBzdXBlckNsYXNzZXMgPSByZXNvbHZlcl8uZ2V0U3VwZXJDbGFzc2VzKHR5cGUpOwotCQkJCUlGaWVsZFtdIGZpZWxkcyA9IHJlc29sdmVyXy5nZXRQdWJsaWNGaWVsZHModHlwZSxzdXBlckNsYXNzZXMpOwotCQkJCWZvciAoaW50IGY9MDsgZjxmaWVsZHMubGVuZ3RoOyBmKyspCi0JCQkJewotCQkJCQlhbmFseXplRmllbGQoZmllbGRzW2ZdLHJ1bGVzKTsKLQkJCQl9Ci0JCQkJSUphdmFCZWFuUHJvcGVydHlbXSBwcm9wZXJ0aWVzID0gcmVzb2x2ZXJfLmdldFB1YmxpY1Byb3BlcnRpZXModHlwZSxzdXBlckNsYXNzZXMpOwotCQkJCWZvciAoaW50IHA9MDsgcDxwcm9wZXJ0aWVzLmxlbmd0aDsgcCsrKQotCQkJCXsKLQkJCQkJYW5hbHl6ZVByb3BlcnR5KHByb3BlcnRpZXNbcF0scnVsZXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkKLQkJCXsKLQkJCQlwb3AoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYW5hbHl6ZUZpZWxkICggSUZpZWxkIGZpZWxkLCBKYXZhV2ViU2VydmljZVJ1bGVTZXQgcnVsZXMgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWlmIChmaWVsZCAhPSBudWxsKQotCQl7Ci0JCQlydWxlcy52aXNpdEZpZWxkKGZpZWxkLHBlYW51dFRyYWlsXyk7Ci0JCQlwdXNoKGZpZWxkKTsKLQkJCXRyeQotCQkJewotCQkJCS8vVE9ETzogR2V0IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmaWVsZCB0eXBlCi0JCQkJLy9hbmQgZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gSVR5cGUKLQkJCQkvL2ZvciBpdCBhbmQgYW5hbHl6ZSBpdC4KLQkJCQlJVHlwZSB0eXBlID0gcmVzb2x2ZXJfLmdldEZpZWxkVHlwZShmaWVsZCk7Ci0JCQkJYW5hbHl6ZURhdGFUeXBlKHR5cGUscnVsZXMpOwotCQkJfQotCQkJZmluYWxseQotCQkJewotCQkJCXBvcCgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplUHJvcGVydHkgKCBJSmF2YUJlYW5Qcm9wZXJ0eSBwcm9wZXJ0eSwgSmF2YVdlYlNlcnZpY2VSdWxlU2V0IHJ1bGVzICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkKLQkJewotCQkJcnVsZXMudmlzaXRQcm9wZXJ0eShwcm9wZXJ0eSxwZWFudXRUcmFpbF8pOwotCQkJcHVzaChwcm9wZXJ0eSk7Ci0JCQl0cnkKLQkJCXsKLQkJCQlJVHlwZSB0eXBlID0gcmVzb2x2ZXJfLmdldFByb3BlcnR5VHlwZShwcm9wZXJ0eSk7Ci0JCQkJYW5hbHl6ZURhdGFUeXBlKHR5cGUscnVsZXMpOwotCQkJfQotCQkJZmluYWxseQotCQkJewotCQkJCXBvcCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFuYWx5emVFeGNlcHRpb25UeXBlICggSVR5cGUgdHlwZSwgSmF2YVdlYlNlcnZpY2VSdWxlU2V0IHJ1bGVzICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlpZiAodHlwZSAhPSBudWxsICYmICFyZXNvbHZlcl8uaXNTdGFuZGFyZFR5cGUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgJiYgIXZpc2l0ZWRfLmNvbnRhaW5zKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKQotCQl7Ci0JCQlydWxlcy52aXNpdEV4Y2VwdGlvbih0eXBlLHBlYW51dFRyYWlsXyk7Ci0JCQl2aXNpdGVkXy5hZGQodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQlwdXNoKHR5cGUpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJLy8gV2UgdHJ1c3QgamF2YS5sYW5nLkV4Y2VwdGlvbi9UaHJvd2FibGUgYXMgc3VwZXJjbGFzc2VzCi0JCQkJLy8gZm9yIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uIGNsYXNzZXMsIHRoZXJlZm9yZSB3ZSBkbwotCQkJCS8vIG5vdCB0cnkgdG8gYW5hbHl6ZSB0aGVpciBwcm9wZXJ0aWVzIChzb21lIG9mIHdoaWNoIHdvdWxkCi0JCQkJLy8gb3RoZXJ3aXNlIHZpb2xhdGUgSkFYLVJQQydzIHJ1bGVzIGFueXdheXMpLgotCQkJCUlUeXBlW10gc3VwZXJDbGFzc2VzID0gcmVzb2x2ZXJfLmdldFN1cGVyQ2xhc3Nlcyh0eXBlLCJqYXZhLmxhbmcuRXhjZXB0aW9uIik7Ci0JCQkJSUphdmFCZWFuUHJvcGVydHlbXSBwcm9wZXJ0aWVzID0gcmVzb2x2ZXJfLmdldFB1YmxpY1Byb3BlcnRpZXModHlwZSxzdXBlckNsYXNzZXMpOwotCQkJCWZvciAoaW50IHA9MDsgcDxwcm9wZXJ0aWVzLmxlbmd0aDsgcCsrKQotCQkJCXsKLQkJCQkJYW5hbHl6ZVByb3BlcnR5KHByb3BlcnRpZXNbcF0scnVsZXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkKLQkJCXsKLQkJCQlwb3AoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lI2dldEpEVFJlc29sdmVyKCkKLQkgKi8KLQlwdWJsaWMgSkRUUmVzb2x2ZXIgZ2V0SkRUUmVzb2x2ZXIgKCkKLQl7Ci0JCXJldHVybiByZXNvbHZlcl87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lI2dldFByb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yICgpCi0JewotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yXzsKLQl9Ci0JCi0JLyoKLQkgKiBQdXNoZXMgYSBwZWFudXQgb250byB0aGUgcGVhbnV0IHRyYWlsLgotCSAqLwotCXByaXZhdGUgdm9pZCBwdXNoICggT2JqZWN0IHBlYW51dCApCi0JewotCQlwZWFudXRUcmFpbF8ucHVzaChwZWFudXQpOwotCX0KLQkKLQkvKgotCSAqIFBvcHMgYSBwZWFudXQgb2ZmIHRoZSBwZWFudXQgdHJhaWwuIAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3AgKCkKLQl7Ci0JCXBlYW51dFRyYWlsXy5wb3AoKTsKLQl9Ci0JCi0JLyoKLQkgKiBUaGUgSkRUUmVzb2x2ZXIgdXNlZCBieSB0aGlzIGFuYWx5emVyLgotCSAqLwotCXByaXZhdGUgSkRUUmVzb2x2ZXIgcmVzb2x2ZXJfOwotCQotCS8qCi0JICogVGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCBieSB0aGlzIGFuYWx5emVyLiAKLQkgKi8KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yXzsKLQkKLQkvKgotCSAqIFRoaXMgc2V0IGtlZXBzIHRyYWNrIG9mIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZXMgb2YKLQkgKiBjbGFzc2VzIHdlIGhhdmUgdmlzaXRlZCBzbyB0aGF0IHdlIGRvbid0IHZpc2l0IHRoZSBzYW1lCi0JICogc2VydmljZSBjbGFzcywgdmFsdWUgdHlwZSBvciBleGNlcHRpb24gY2xhc3MgbW9yZSB0aGFuIG9uY2UuCi0JICovCi0JcHJpdmF0ZSBTZXQgdmlzaXRlZF87Ci0KLQkvKgotCSAqIFRoaXMgc3RhY2sga2VlcHMgYSB0cmFpbCBvZiBKRFQgb2JqZWN0cyBiYWNrIHRvIHRoZQotCSAqIHNlcnZpY2UgY2xhc3Mgd2UgYmVnYW4gd2l0aC4gVGhpcyBjYW4gYmUgdXNlZnVsIHRvCi0JICogdmlzaXRvcnMgdGhhdCBuZWVkIHRvIGluc3BlY3QgdGhlIEpEVCBlbGVtZW50cyB0aGF0Ci0JICogZW5jbG9zZSB0aGUgY3VycmVudGx5IHZpc2l0ZWQgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIFN0YWNrIHBlYW51dFRyYWlsXzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvSkRUUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvSkRUUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmMzcxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0pEVFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKiAyMDA2MDcxMSAgIDE0OTQxMSBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleQotICogMjAwNzAxMDIgICAxOTYzNzEgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmVhbGV5Ci0gKiBBIEpEVFJlc29sdmVyIHByb3ZpZGVzIHNldmVyYWwgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IKLSAqIG5hdmlnYXRpbmcgcmVmZXJlbmNlcyBiZXR3ZWVuIEphdmEgY2xhc3NlcywgbWV0aG9kcywKLSAqIGZpZWxkcyBhbmQgcHJvcGVydGllcy4gQSBKRFRSZXNvbHZlciBpcyBjb25zdHJ1Y3RlZAotICogZm9yIGEgSmF2YSBwcm9qZWN0IHdob3NlIGVmZmVjdGl2ZSBjbGFzc3BhdGggd2lsbAotICogZ292ZXJuIHRoZSBzY29wZSBvZiBzZWFyY2ggb3BlcmF0aW9ucyBwZXJmb3JtZWQgYnkgdGhlCi0gKiBKRFRSZXNvbHZlciB3aGVuZXZlciBpdCBuZWVkcyB0byBjb252ZXJ0IGEgc2lnbmF0dXJlCi0gKiBpbnRvIGEgSkRUIElUeXBlIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEpEVFJlc29sdmVyCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBKRFRSZXNvbHZlciBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgcHJvdmlkaW5nIHRoZSBjb250ZXh0Ci0JICogQHBhcmFtIG1vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiB0byB1c2UsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiB3aXRoaW4gd2hpY2ggdGhpcyByZXNvbHZlciB3aWxsIHNlYXJjaCBmb3IgY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgSkRUUmVzb2x2ZXIgKCBJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCXsKLQkJamF2YVByb2plY3RfID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQltb25pdG9yXyA9IG1vbml0b3I7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gSkRUIElUeXBlIGlzIGFuIGludGVyZmFjZS4KLQkgKiBAcGFyYW0gamR0VHlwZSBUaGUgdHlwZSB0byBhbmFseXplLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gSkRUIElUeXBlIGlzIGFuIGludGVyZmFjZS4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBJZiB0aGUgSkRUIG1vZGVsIGZhaWxzIHRvCi0JICogYW5hbHl6ZSB0aGUgZ2l2ZW4gdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSAoIElUeXBlIGpkdFR5cGUgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBqZHRUeXBlLmlzSW50ZXJmYWNlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gSkRUIElUeXBlIGlzIGFuIGFic3RyYWN0IGNsYXNzLgotCSAqIEBwYXJhbSBqZHRUeXBlIFRoZSB0eXBlIHRvIGFuYWx5emUuCi0JICogQHJldHVybiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBKRFQgSVR5cGUgaXMgYW4gYWJzdHJhY3QgY2xhc3MuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gSWYgdGhlIEpEVCBtb2RlbCBmYWlscyB0bwotCSAqIGFuYWx5emUgdGhlIGdpdmVuIHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCAoIElUeXBlIGpkdFR5cGUgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBGbGFncy5pc0Fic3RyYWN0KGpkdFR5cGUuZ2V0RmxhZ3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBpbnN0YW5jZXMgb2YgdGhlIGdpdmVuIEpEVCBJVHlwZQotCSAqIGNhbiBiZSBpbnN0YW50aWF0ZWQgdmlhIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuIFRoZSBjbGFzcwotCSAqIG11c3QgaGF2ZSBhbiBleHBsaWNpdCBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvciwgb3IgaGF2ZSBubwotCSAqIGV4cGxpY2l0IGNvbnN0cnVjdG9ycyBhdCBhbGwgdG8gbWVldCB0aGlzIGNyaXRlcmlhLgotCSAqIEBwYXJhbSBqZHRUeXBlIFRoZSB0eXBlIHRvIGFuYWx5emUuCi0JICogQHJldHVybiBUcnVlIGlmIGFuZCBvbmx5IGlmIGluc3RhbmNlcyBvZiB0aGUgdHlwZSBhcmUKLQkgKiBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RhYmxlLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBKRFQgbW9kZWwgZmFpbHMgdG8KLQkgKiBhbmFseXplIHRoZSBnaXZlbiB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0YWJsZSAoIElUeXBlIGpkdFR5cGUgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlNZXRob2RbXSBtZXRob2RzID0gamR0VHlwZS5nZXRNZXRob2RzKCk7Ci0JCWludCBudW1iZXJPZkNvbnN0cnVjdG9ycyA9IDA7Ci0JCWZvciAoaW50IG09MDsgbTxtZXRob2RzLmxlbmd0aDsgbSsrKQotCQl7Ci0JCQlpZiAobWV0aG9kc1ttXS5pc0NvbnN0cnVjdG9yKCkpCi0JCQl7Ci0JCQkJbnVtYmVyT2ZDb25zdHJ1Y3RvcnMrKzsKLQkJCQlpZiAobWV0aG9kc1ttXS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSA9PSAwICYmIEZsYWdzLmlzUHVibGljKG1ldGhvZHNbbV0uZ2V0RmxhZ3MoKSkpCi0JCQkJewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bWJlck9mQ29uc3RydWN0b3JzID09IDA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkCi0JICogdHlwZSBuYW1lIGlzIGEgdHlwZSBmcm9tIHRoZSBzdGFuZGFyZCBKREssIHRoYXQgaXMsCi0JICogaWYgdGhlIGdpdmVuIHR5cGUgbmFtZSBiZWxvbmdzIHVuZGVyIHRoZSAiamF2YSIgb3IKLQkgKiAiamF2YXgiIHBhY2thZ2VzLgotCSAqIEBwYXJhbSB0eXBlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHlwZSB0byBjaGVjay4KLQkgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHR5cGUgaXMgYSBub24tcHJpbWl0aXZlLAotCSAqIEphdmEgc3RhbmRhcmQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYXJkVHlwZSAoIFN0cmluZyB0eXBlTmFtZSApCi0JewotCQlyZXR1cm4gdHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YS4iKSB8fCB0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZheC4iKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiB0eXBlIG5hbWUgaXMgYQotCSAqIEphdmEgcHJpbWl0aXZlIHR5cGUuCi0JICogQHBhcmFtIHR5cGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRvIGNoZWNrLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHlwZSBpcyBhIEphdmEgcHJpbWl0aXZlIHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlICggU3RyaW5nIHR5cGVOYW1lICkKLQl7Ci0JCWZvciAoaW50IGk9MDsgaTxwcmltaXRpdmVUeXBlc18ubGVuZ3RoOyBpKyspCi0JCXsKLQkJCWlmIChwcmltaXRpdmVUeXBlc19baV0uZXF1YWxzKHR5cGVOYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkCi0JICogdHlwZSBuYW1lIGlzIGEgSmF2YSB3cmFwcGVyIHR5cGUuCi0JICogQHBhcmFtIHR5cGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRvIGNoZWNrLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHlwZSBpcyBhIEphdmEgd3JhcHBlciB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV3JhcHBlclR5cGUgKCBTdHJpbmcgdHlwZU5hbWUgKQotCXsKLQkJZm9yIChpbnQgaT0wOyBpPHdyYXBwZXJUeXBlc18ubGVuZ3RoOyBpKyspCi0JCXsKLQkJCWlmICh3cmFwcGVyVHlwZXNfW2ldLmVxdWFscyh0eXBlTmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQKLQkgKiB0eXBlIG5hbWUgaXMgYSBKYXZhIHByaW1pdGl2ZSBvciBzdGFuZGFyZCB0eXBlIHN1cHBvcnRlZAotCSAqIGJ5IHRoZSBKQVgtUlBDIHNwZWNpZmljYXRpb24uCi0JICogQHBhcmFtIHR5cGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRvIGNoZWNrLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHlwZSBpcyBhIEphdmEgd3JhcHBlciB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSkFYUlBDU3RhbmRhcmRUeXBlICggU3RyaW5nIHR5cGVOYW1lICkKLQl7Ci0JCWZvciAoaW50IGk9MDsgaTxqYXhycGNUeXBlc18ubGVuZ3RoOyBpKyspCi0JCXsKLQkJCWlmIChqYXhycGNUeXBlc19baV0uZXF1YWxzKHR5cGVOYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoaXNXcmFwcGVyVHlwZSh0eXBlTmFtZSkgJiYgISJqYXZhLmxhbmcuQ2hhcmFjdGVyIi5lcXVhbHModHlwZU5hbWUpKQotCQl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoaXNQcmltaXRpdmVUeXBlKHR5cGVOYW1lKSAmJiAhImNoYXIiLmVxdWFscyh0eXBlTmFtZSkpCi0JCXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgemVybyBvciBtb3JlIEpEVCBJVHlwZSBvYmplY3RzCi0JICogZm9yIHRoZSBwdWJsaWMgZmllbGRzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gdHlwZQotCSAqIEBwYXJhbSBqZHRUeXBlIFRoZSB0eXBlIHRvIGFuYWx5emUuCi0JICogQHBhcmFtIGpkdFN1cGVyVHlwZXMgQW55IHN1cGVydHlwZXMgdG8gYW5hbHl6ZSwKLQkgKiBvciBudWxsIHRvIGFuYWx5emUgb25seSB0aGUgPGNvZGU+amR0VHlwZTwvY29kZT4uCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgcHVibGljIGZpZWxkIHR5cGVzLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBKRFQgZW5naW5lIGZhaWxzIHRvCi0JICogYW5hbHl6ZSB0aGUgZ2l2ZW4gdHlwZXMgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHVibGljIElGaWVsZFtdIGdldFB1YmxpY0ZpZWxkcyAoIElUeXBlIGpkdFR5cGUsIElUeXBlW10gamR0U3VwZXJDbGFzc2VzICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlMaXN0IGZpZWxkc0xpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQloYXJ2ZXN0UHVibGljRmllbGRzKGpkdFR5cGUsZmllbGRzTGlzdCk7Ci0JCWlmIChqZHRTdXBlckNsYXNzZXMgIT0gbnVsbCkKLQkJewotCQkJZm9yIChpbnQgdD0wOyB0PGpkdFN1cGVyQ2xhc3Nlcy5sZW5ndGg7IHQrKykKLQkJCXsKLQkJCQloYXJ2ZXN0UHVibGljRmllbGRzKGpkdFN1cGVyQ2xhc3Nlc1t0XSxmaWVsZHNMaXN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElGaWVsZFtdKWZpZWxkc0xpc3QudG9BcnJheShuZXcgSUZpZWxkWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgSkRUIElNZXRob2Qgb2JqZWN0cwotCSAqIGZvciB0aGUgcHVibGljIG1ldGhvZHMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiB0eXBlLgotCSAqIEBwYXJhbSBqZHRUeXBlIFRoZSB0eXBlIHRvIGFuYWx5emUuCi0JICogQHBhcmFtIGpkdFN1cGVyVHlwZXMgQW55IHN1cGVydHlwZXMgdG8gYW5hbHl6ZSwKLQkgKiBvciBudWxsIHRvIGFuYWx5emUgb25seSB0aGUgPGNvZGU+amR0VHlwZTwvY29kZT4uCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgcHVibGljIG1ldGhvZHMuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gSWYgdGhlIEpEVCBlbmdpbmUgZmFpbHMgdG8KLQkgKiBhbmFseXplIHRoZSBnaXZlbiB0eXBlcyB0byBzYXRpc2Z5IHRoaXMgcmVxdWVzdC4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFtdIGdldFB1YmxpY01ldGhvZHMgKCBJVHlwZSBqZHRUeXBlLCBJVHlwZVtdIGpkdFN1cGVyQ2xhc3NlcyApCi0JdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJTGlzdCBtZXRob2RzTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWhhcnZlc3RQdWJsaWNNZXRob2RzKGpkdFR5cGUsbWV0aG9kc0xpc3QpOwotCQlpZiAoamR0U3VwZXJDbGFzc2VzICE9IG51bGwpCi0JCXsKLQkJCWZvciAoaW50IHQ9MDsgdDxqZHRTdXBlckNsYXNzZXMubGVuZ3RoOyB0KyspCi0JCQl7Ci0JCQkJaGFydmVzdFB1YmxpY01ldGhvZHMoamR0U3VwZXJDbGFzc2VzW3RdLG1ldGhvZHNMaXN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElNZXRob2RbXSltZXRob2RzTGlzdC50b0FycmF5KG5ldyBJTWV0aG9kWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgSkRUIElUeXBlIG9iamVjdHMKLQkgKiBmb3IgdGhlIHB1YmxpYyBwcm9wZXJ0aWVzIChnZXR0ZXJzIGFuZC9vciBzZXR0ZXJzKQotCSAqIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiBAcGFyYW0gamR0VHlwZSBUaGUgdHlwZSB0byBhbmFseXplLgotCSAqIEBwYXJhbSBqZHRTdXBlclR5cGVzIEFueSBzdXBlcnR5cGVzIHRvIGFuYWx5emUsCi0JICogb3IgbnVsbCB0byBhbmFseXplIG9ubHkgdGhlIDxjb2RlPmpkdFR5cGU8L2NvZGU+LgotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgemVybyBvciBtb3JlIHB1YmxpYyBwcm9wZXJ0eSB0eXBlcy4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBJZiB0aGUgSkRUIGVuZ2luZSBmYWlscyB0bwotCSAqIGFuYWx5emUgdGhlIGdpdmVuIHR5cGVzIHRvIHNhdGlzZnkgdGhpcyByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyBJSmF2YUJlYW5Qcm9wZXJ0eVtdIGdldFB1YmxpY1Byb3BlcnRpZXMgKCBJVHlwZSBqZHRUeXBlLCBJVHlwZVtdIGpkdFN1cGVyQ2xhc3NlcyApCi0JdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzKGpkdFR5cGUsamR0U3VwZXJDbGFzc2VzKTsKLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBtPTA7IG08bWV0aG9kcy5sZW5ndGg7IG0rKykKLQkJewotCQkJU3RyaW5nIG5hbWUgPSBnZXRHZXR0ZXJOYW1lKG1ldGhvZHNbbV0pOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCXsKLQkJCQlKYXZhQmVhblByb3BlcnR5IHByb3BlcnR5ID0gKEphdmFCZWFuUHJvcGVydHkpcHJvcGVydGllcy5nZXQobmFtZSk7Ci0JCQkJaWYgKHByb3BlcnR5ID09IG51bGwpCi0JCQkJewotCQkJCQlwcm9wZXJ0eSA9IG5ldyBKYXZhQmVhblByb3BlcnR5KCk7Ci0JCQkJCXByb3BlcnR5LnNldE5hbWUobmFtZSk7Ci0JCQkJCXByb3BlcnRpZXMucHV0KG5hbWUscHJvcGVydHkpOwotCQkJCX0KLQkJCQlwcm9wZXJ0eS5zZXRHZXR0ZXIobWV0aG9kc1ttXSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbmFtZSA9IGdldFNldHRlck5hbWUobWV0aG9kc1ttXSk7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUphdmFCZWFuUHJvcGVydHkgcHJvcGVydHkgPSAoSmF2YUJlYW5Qcm9wZXJ0eSlwcm9wZXJ0aWVzLmdldChuYW1lKTsKLQkJCQkJaWYgKHByb3BlcnR5ID09IG51bGwpCi0JCQkJCXsKLQkJCQkJCXByb3BlcnR5ID0gbmV3IEphdmFCZWFuUHJvcGVydHkoKTsKLQkJCQkJCXByb3BlcnR5LnNldE5hbWUobmFtZSk7Ci0JCQkJCQlwcm9wZXJ0aWVzLnB1dChuYW1lLHByb3BlcnR5KTsKLQkJCQkJfQotCQkJCQlwcm9wZXJ0eS5zZXRTZXR0ZXIobWV0aG9kc1ttXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUphdmFCZWFuUHJvcGVydHlbXSlwcm9wZXJ0aWVzLnZhbHVlcygpLnRvQXJyYXkobmV3IEphdmFCZWFuUHJvcGVydHlbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRFQgSVR5cGUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZmllbGQuCi0JICogQHBhcmFtIGpkdEZpZWxkIFRoZSBmaWVsZCB0byBhbmFseXplLgotCSAqIEByZXR1cm4gVGhlIGZpZWxkIHR5cGUuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gSWYgdGhlIEpEVCBlbmdpbmUgZmFpbHMgdG8KLQkgKiBhbmFseXplIHRoZSBnaXZlbiBmaWVsZCB0byBzYXRpc2Z5IHRoaXMgcmVxdWVzdC4KLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0RmllbGRUeXBlICggSUZpZWxkIGpkdEZpZWxkICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJSmF2YUVsZW1lbnQgZWxlbSA9IGpkdEZpZWxkLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5UWVBFKTsKLQkJSVR5cGUgYW5jZXN0b3IgPSBlbGVtIGluc3RhbmNlb2YgSVR5cGUgPyAoSVR5cGUpZWxlbSA6IG51bGw7Ci0JCVN0cmluZyBzaWduYXR1cmUgPSBqZHRGaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lRnJvbVNpZ25hdHVyZShzaWduYXR1cmUpOwotCQlyZXR1cm4gZmluZFR5cGUodHlwZU5hbWUsYW5jZXN0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgZm9yIHRoZSBnaXZlbiBmaWVsZC4KLQkgKiBAcGFyYW0gamR0RmllbGQgVGhlIGZpZWxkIHRvIGFuYWx5emUuCi0JICogQHJldHVybiBUaGUgZmllbGQgdHlwZSBuYW1lLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBKRFQgZW5naW5lIGZhaWxzIHRvCi0JICogYW5hbHl6ZSB0aGUgZ2l2ZW4gZmllbGQgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZFR5cGVOYW1lICggSUZpZWxkIGpkdEZpZWxkICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJSmF2YUVsZW1lbnQgZWxlbSA9IGpkdEZpZWxkLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5UWVBFKTsKLQkJSVR5cGUgYW5jZXN0b3IgPSBlbGVtIGluc3RhbmNlb2YgSVR5cGUgPyAoSVR5cGUpZWxlbSA6IG51bGw7Ci0JCVN0cmluZyBzaWduYXR1cmUgPSBqZHRGaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lRnJvbVNpZ25hdHVyZShzaWduYXR1cmUpOwotCQlyZXR1cm4gcmVzb2x2ZVR5cGUodHlwZU5hbWUsYW5jZXN0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRFQgSVR5cGUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gYmVhbiBwcm9wZXJ0eS4KLQkgKiBAcGFyYW0gamF2YUJlYW5Qcm9wZXJ0eSBUaGUgYmVhbiBwcm9wZXJ0eSB0byBhbmFseXplLgotCSAqIEByZXR1cm4gVGhlIHByb3BlcnR5IHR5cGUuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gSWYgdGhlIEpEVCBlbmdpbmUgZmFpbHMgdG8KLQkgKiBhbmFseXplIHRoZSBnaXZlbiBiZWFuIHByb3BlcnR5IHRvIHNhdGlzZnkgdGhpcyByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyBJVHlwZSBnZXRQcm9wZXJ0eVR5cGUgKCBJSmF2YUJlYW5Qcm9wZXJ0eSBqYXZhQmVhblByb3BlcnR5ICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJTWV0aG9kIG1ldGhvZCA9IGphdmFCZWFuUHJvcGVydHkuZ2V0R2V0dGVyKCk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGdldFJldHVyblR5cGUobWV0aG9kKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW1ldGhvZCA9IGphdmFCZWFuUHJvcGVydHkuZ2V0U2V0dGVyKCk7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQl7Ci0JCQkJSVR5cGVbXSBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kKTsKLQkJCQlpZiAocGFyYW1ldGVycy5sZW5ndGggPiAwKQotCQkJCXsKLQkJCQkJLy8KLQkJCQkJLy8gSXQncyB0aGUgbGFzdCBwYXJhbWV0ZXIncyB0eXBlIHdlIHdhbnQsCi0JCQkJCS8vIGZvciBpbmRleGVkIG9yIG5vbi1pbmRleGVkIHNldHRlcnMuCi0JCQkJCS8vCi0JCQkJCXJldHVybiBwYXJhbWV0ZXJzW3BhcmFtZXRlcnMubGVuZ3RoLTFdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBuYW1lIGZvciB0aGUgZ2l2ZW4gYmVhbiBwcm9wZXJ0eS4KLQkgKiBAcGFyYW0gamF2YUJlYW5Qcm9wZXJ0eSBUaGUgYmVhbiBwcm9wZXJ0eSB0byBhbmFseXplLgotCSAqIEByZXR1cm4gVGhlIHByb3BlcnR5IHR5cGUgbmFtZS4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBJZiB0aGUgSkRUIGVuZ2luZSBmYWlscyB0bwotCSAqIGFuYWx5emUgdGhlIGdpdmVuIGJlYW4gcHJvcGVydHkgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVR5cGVOYW1lICggSUphdmFCZWFuUHJvcGVydHkgamF2YUJlYW5Qcm9wZXJ0eSApCi0JdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJSU1ldGhvZCBtZXRob2QgPSBqYXZhQmVhblByb3BlcnR5LmdldEdldHRlcigpOwotCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiBnZXRSZXR1cm5UeXBlTmFtZShtZXRob2QpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbWV0aG9kID0gamF2YUJlYW5Qcm9wZXJ0eS5nZXRTZXR0ZXIoKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkKLQkJCXsKLQkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBnZXRQYXJhbWV0ZXJUeXBlTmFtZXMobWV0aG9kKTsKLQkJCQlpZiAocGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aCA+IDApCi0JCQkJewotCQkJCQlyZXR1cm4gcGFyYW1ldGVyVHlwZU5hbWVzWzBdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkRUIElUeXBlIG9iamVjdCBmb3IgdGhlIHJldHVybiB0eXBlCi0JICogb2YgdGhlIGdpdmVuIG1ldGhvZCwgb3IgbnVsbCBpZiB0aGUgbWV0aG9kIGlzIHZvaWQuCi0JICogQHBhcmFtIGpkdE1ldGhvZCBUaGUgbWV0aG9kIHRvIGFuYWx5emUuCi0JICogQHJldHVybiBUaGUgbWV0aG9kIHJldHVybiB0eXBlLCBvciBudWxsIGlmIG5vbmUuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gSWYgdGhlIEpEVCBlbmdpbmUgZmFpbHMgdG8KLQkgKiBhbmFseXplIHRoZSBnaXZlbiBtZXRob2QgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHVibGljIElUeXBlIGdldFJldHVyblR5cGUgKCBJTWV0aG9kIGpkdE1ldGhvZCApCi0JdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJSUphdmFFbGVtZW50IGVsZW0gPSBqZHRNZXRob2QuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlRZUEUpOwotCQlJVHlwZSBhbmNlc3RvciA9IGVsZW0gaW5zdGFuY2VvZiBJVHlwZSA/IChJVHlwZSllbGVtIDogbnVsbDsKLQkJU3RyaW5nIHNpZ25hdHVyZSA9IGpkdE1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lRnJvbVNpZ25hdHVyZShzaWduYXR1cmUpOwotCQlyZXR1cm4gZmluZFR5cGUodHlwZU5hbWUsYW5jZXN0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgZm9yIHRoZSByZXR1cm4gdHlwZQotCSAqIG9mIHRoZSBnaXZlbiBtZXRob2QsIG9yIG51bGwgaWYgdGhlIG1ldGhvZCBpcyB2b2lkLgotCSAqIEBwYXJhbSBqZHRNZXRob2QgVGhlIG1ldGhvZCB0byBhbmFseXplLgotCSAqIEByZXR1cm4gVGhlIG1ldGhvZCByZXR1cm4gdHlwZSBuYW1lLCBvciBudWxsIGlmIG5vbmUuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gSWYgdGhlIEpEVCBlbmdpbmUgZmFpbHMgdG8KLQkgKiBhbmFseXplIHRoZSBnaXZlbiBtZXRob2QgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlTmFtZSAoIElNZXRob2QgamR0TWV0aG9kICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJSmF2YUVsZW1lbnQgZWxlbSA9IGpkdE1ldGhvZC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuVFlQRSk7Ci0JCUlUeXBlIGFuY2VzdG9yID0gZWxlbSBpbnN0YW5jZW9mIElUeXBlID8gKElUeXBlKWVsZW0gOiBudWxsOwotCQlTdHJpbmcgc2lnbmF0dXJlID0gamR0TWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZSk7Ci0JCXJldHVybiByZXNvbHZlVHlwZSh0eXBlTmFtZSxhbmNlc3Rvcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgemVybyBvciBtb3JlIEpEVCBJVHlwZSBvYmplY3RzCi0JICogZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBnaXZlbiBtZXRob2QuCi0JICogQHBhcmFtIGpkdE1ldGhvZCBUaGUgbWV0aG9kIHRvIGFuYWx5emUuCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgcGFyYW1ldGVyIHR5cGVzLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBKRFQgZW5naW5lIGZhaWxzIHRvCi0JICogYW5hbHl6ZSB0aGUgZ2l2ZW4gbWV0aG9kIHRvIHNhdGlzZnkgdGhpcyByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyBJVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzICggSU1ldGhvZCBqZHRNZXRob2QgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlKYXZhRWxlbWVudCBlbGVtID0gamR0TWV0aG9kLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5UWVBFKTsKLQkJSVR5cGUgYW5jZXN0b3IgPSBlbGVtIGluc3RhbmNlb2YgSVR5cGUgPyAoSVR5cGUpZWxlbSA6IG51bGw7Ci0JCVN0cmluZ1tdIHNpZ25hdHVyZXMgPSBqZHRNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJSVR5cGVbXSB0eXBlcyA9IG5ldyBJVHlwZVtzaWduYXR1cmVzLmxlbmd0aF07Ci0JCWZvciAoaW50IHM9MDsgczxzaWduYXR1cmVzLmxlbmd0aDsgcysrKQotCQl7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlc1tzXSk7Ci0JCQl0eXBlc1tzXSA9IGZpbmRUeXBlKHR5cGVOYW1lLGFuY2VzdG9yKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgemVybyBvciBtb3JlIHR5cGUgbmFtZXMKLQkgKiBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGdpdmVuIG1ldGhvZC4KLQkgKiBAcGFyYW0gamR0TWV0aG9kIFRoZSBtZXRob2QgdG8gYW5hbHl6ZS4KLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHplcm8gb3IgbW9yZSBwYXJhbWV0ZXIgdHlwZSBuYW1lcy4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBJZiB0aGUgSkRUIGVuZ2luZSBmYWlscyB0bwotCSAqIGFuYWx5emUgdGhlIGdpdmVuIG1ldGhvZCB0byBzYXRpc2Z5IHRoaXMgcmVxdWVzdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVHlwZU5hbWVzICggSU1ldGhvZCBqZHRNZXRob2QgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlKYXZhRWxlbWVudCBlbGVtID0gamR0TWV0aG9kLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5UWVBFKTsKLQkJSVR5cGUgYW5jZXN0b3IgPSBlbGVtIGluc3RhbmNlb2YgSVR5cGUgPyAoSVR5cGUpZWxlbSA6IG51bGw7Ci0JCVN0cmluZ1tdIHNpZ25hdHVyZXMgPSBqZHRNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJU3RyaW5nW10gdHlwZU5hbWVzID0gbmV3IFN0cmluZ1tzaWduYXR1cmVzLmxlbmd0aF07Ci0JCWZvciAoaW50IHM9MDsgczxzaWduYXR1cmVzLmxlbmd0aDsgcysrKQotCQl7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlc1tzXSk7Ci0JCQl0eXBlTmFtZXNbc10gPSByZXNvbHZlVHlwZSh0eXBlTmFtZSxhbmNlc3Rvcik7Ci0JCX0KLQkJcmV0dXJuIHR5cGVOYW1lczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgSkRUIElUeXBlIG9iamVjdHMKLQkgKiBmb3IgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBnaXZlbiBtZXRob2QuCi0JICogQHBhcmFtIGpkdE1ldGhvZCBUaGUgbWV0aG9kIHRvIGFuYWx5emUuCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgZXhjZXB0aW9uIHR5cGVzLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBKRFQgZW5naW5lIGZhaWxzIHRvCi0JICogYW5hbHl6ZSB0aGUgZ2l2ZW4gbWV0aG9kIHRvIHNhdGlzZnkgdGhpcyByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyBJVHlwZVtdIGdldEV4Y2VwdGlvblR5cGVzICggSU1ldGhvZCBqZHRNZXRob2QgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlKYXZhRWxlbWVudCBlbGVtID0gamR0TWV0aG9kLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5UWVBFKTsKLQkJSVR5cGUgYW5jZXN0b3IgPSBlbGVtIGluc3RhbmNlb2YgSVR5cGUgPyAoSVR5cGUpZWxlbSA6IG51bGw7Ci0JCVN0cmluZ1tdIHNpZ25hdHVyZXMgPSBqZHRNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLQkJSVR5cGVbXSB0eXBlcyA9IG5ldyBJVHlwZVtzaWduYXR1cmVzLmxlbmd0aF07Ci0JCWZvciAoaW50IHM9MDsgczxzaWduYXR1cmVzLmxlbmd0aDsgcysrKQotCQl7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlc1tzXSk7Ci0JCQl0eXBlc1tzXSA9IGZpbmRUeXBlKHR5cGVOYW1lLGFuY2VzdG9yKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgemVybyBvciBtb3JlIHR5cGUgbmFtZXMKLQkgKiBmb3IgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBnaXZlbiBtZXRob2QuCi0JICogQHBhcmFtIGpkdE1ldGhvZCBUaGUgbWV0aG9kIHRvIGFuYWx5emUuCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgZXhjZXB0aW9uIHR5cGUgbmFtZXMuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gSWYgdGhlIEpEVCBlbmdpbmUgZmFpbHMgdG8KLQkgKiBhbmFseXplIHRoZSBnaXZlbiBtZXRob2QgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEV4Y2VwdGlvblR5cGVOYW1lcyAoIElNZXRob2QgamR0TWV0aG9kICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJSmF2YUVsZW1lbnQgZWxlbSA9IGpkdE1ldGhvZC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuVFlQRSk7Ci0JCUlUeXBlIGFuY2VzdG9yID0gZWxlbSBpbnN0YW5jZW9mIElUeXBlID8gKElUeXBlKWVsZW0gOiBudWxsOwotCQlTdHJpbmdbXSBzaWduYXR1cmVzID0gamR0TWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0JCVN0cmluZ1tdIHR5cGVOYW1lcyA9IG5ldyBTdHJpbmdbc2lnbmF0dXJlcy5sZW5ndGhdOwotCQlmb3IgKGludCBzPTA7IHM8c2lnbmF0dXJlcy5sZW5ndGg7IHMrKykKLQkJewotCQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZXNbc10pOwotCQkJdHlwZU5hbWVzW3NdID0gcmVzb2x2ZVR5cGUodHlwZU5hbWUsYW5jZXN0b3IpOwotCQl9Ci0JCXJldHVybiB0eXBlTmFtZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgemVybyBvciBtb3JlIHR5cGVzIHJlcHJlc2VudGluZwotCSAqIHRoZSBzdXBlcmNsYXNzZXMsIGlmIGFueSwgb2YgdGhlIGdpdmVuIElUeXBlIGluIGJvdHRvbS11cAotCSAqIG9yZGVyIGV4Y2x1ZGluZyBqYXZhLmxhbmcuT2JqZWN0LgotCSAqIEBwYXJhbSBqZHRUeXBlIFRoZSB0eXBlIHRvIGFuYWx5emUuCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgc3VwZXJjbGFzcyB0eXBlcy4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBJZiB0aGUgSkRUIGVuZ2luZSBmYWlscyB0bwotCSAqIGFuYWx5emUgdGhlIGdpdmVuIHR5cGUgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHVibGljIElUeXBlW10gZ2V0U3VwZXJDbGFzc2VzICggSVR5cGUgamR0VHlwZSApCi0JdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldFN1cGVyQ2xhc3NlcyhqZHRUeXBlLCJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgemVybyBvciBtb3JlIHR5cGVzIHJlcHJlc2VudGluZwotCSAqIHRoZSBzdXBlcmNsYXNzZXMsIGlmIGFueSwgb2YgdGhlIGdpdmVuIElUeXBlLgotCSAqIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBqYXZhLmxhbmcuT2JqZWN0IGlzIGluY2x1ZGVkLgotCSAqIEBwYXJhbSBqZHRUeXBlIFRoZSB0eXBlIHRvIGFuYWx5emUuCi0JICogQHBhcmFtIHN0b3BDbGFzc05hbWUgVGhlIG5hbWUgb2YgYSBzdG9wIGNsYXNzIHVzZWQgdG8gbGltaXQKLQkgKiB0aGUgc3VwZXJjbGFzc2VzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIElmIHRoZSBzdG9wIGNsYXNzCi0JICogaXMgbnVsbCBvciBuYW1lcyBhIGNsYXNzIG5vdCBmb3VuZCBpbiB0aGUgaGllcmFyY2h5LCBhbGwKLQkgKiBzdXBlcmNsYXNzZXMgYXJlIHJldHVybmVkLiBPdGhlcndpc2UsIG9ubHkgc3VwZXJjbGFzc2VzIHVwCi0JICogdG8gYnV0IGV4Y2x1ZGluZyB0aGUgc3RvcCBjbGFzcyBhcmUgcmV0dXJuZWQuCi0JICogQHJldHVybiBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgc3VwZXJjbGFzcyB0eXBlcy4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBJZiB0aGUgSkRUIGVuZ2luZSBmYWlscyB0bwotCSAqIGFuYWx5emUgdGhlIGdpdmVuIHR5cGUgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHVibGljIElUeXBlW10gZ2V0U3VwZXJDbGFzc2VzICggSVR5cGUgamR0VHlwZSwgU3RyaW5nIHN0b3BDbGFzc05hbWUgKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IGpkdFR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG1vbml0b3JfKTsKLQkJSVR5cGVbXSBhbGxTdXBlckNsYXNzZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJjbGFzc2VzKGpkdFR5cGUpOwotCQlMaXN0IHN1cGVyQ2xhc3NlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhbGxTdXBlckNsYXNzZXMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCWlmIChhbGxTdXBlckNsYXNzZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHN0b3BDbGFzc05hbWUpKQotCQkJCWJyZWFrOwotCQkJc3VwZXJDbGFzc2VzLmFkZChhbGxTdXBlckNsYXNzZXNbaV0pOwotCQl9Ci0JCXJldHVybiAoSVR5cGVbXSlzdXBlckNsYXNzZXMudG9BcnJheShuZXcgSVR5cGVbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZSBmcm9tIGEgSkRUIHNpZ25hdHVyZS4KLQkgKiBAcGFyYW0gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgdG8gZXhhbWluZS4KLQkgKiBAcmV0dXJuIFRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lIGZyb20gdGhlIHNpZ25hdHVyZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lRnJvbVNpZ25hdHVyZSAoIFN0cmluZyBzaWduYXR1cmUgKQotCXsKLQotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKHNpZ25hdHVyZSk7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IFNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKHNpZ25hdHVyZSk7Ci0JCWlmIChiYXNlTmFtZS5lbmRzV2l0aCgiW10iKSl7Ci0JCQliYXNlTmFtZSA9IGJhc2VOYW1lLnN1YnN0cmluZygwLCBiYXNlTmFtZS5pbmRleE9mKCJbIikpOwotCQl9Ci0JCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gKHBhY2thZ2VOYW1lLnRyaW0oKS5lcXVhbHMoIiIpPyIiOnBhY2thZ2VOYW1lKyIuIikgKyBiYXNlTmFtZTsKLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0cyB0byByZXNvbHZlIGFuIHVucmVzb2x2ZWQgdHlwZSBuYW1lIGluIHRoZQotCSAqIGNvbnRleHQgb2YgdGhlIGdpdmVuIGFuY2VzdG9yIHR5cGUgKGllLiB0aGUgdHlwZQotCSAqIGFjdGluZyBhcyB0aGUgY29udGV4dCB3aXRoaW4gd2hpY2ggdGhlIHR5cGUgbmFtZQotCSAqIHNob3VsZCBiZSByZXNvbHZlZCkuCi0JICogQHBhcmFtIHR5cGVOYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSB0byBmaW5kLgotCSAqIEBwYXJhbSBhbmNlc3RvciBUaGUgdHlwZSBwcm92aWRpbmcgdGhlIGNvbnRleHQgd2l0aGluCi0JICogd2hpY2ggdG8gbG9vayB1cCB0aGUgdHlwZS4KLQkgKiBAcmV0dXJuIFRoZSBxdWFsaWZpZWQgbmFtZSwgb3IgdGhlIG9yaWdpbmFsIHR5cGUgbmFtZQotCSAqIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlICggU3RyaW5nIHR5cGVOYW1lLCBJVHlwZSBhbmNlc3RvciApCi0JdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJaWYgKGFuY2VzdG9yICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZ1tdW10gbWF0Y2hlcyA9IGFuY2VzdG9yLnJlc29sdmVUeXBlKHR5cGVOYW1lKTsKLQkJCWlmIChtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlcy5sZW5ndGggPiAwKQotCQkJewotCQkJCVN0cmluZ0J1ZmZlciBxbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlpbnQgbiA9IG1hdGNoZXNbMF0ubGVuZ3RoOwotCQkJCWZvciAoaW50IGo9MDsgajxuLTE7IGorKykKLQkJCQl7Ci0JCQkJCXFuYW1lLmFwcGVuZChtYXRjaGVzWzBdW2pdKS5hcHBlbmQoIi4iKTsKLQkJCQl9Ci0JCQkJaWYgKG4gPj0gMCkKLQkJCQl7Ci0JCQkJCXFuYW1lLmFwcGVuZChtYXRjaGVzWzBdW24tMV0pOwotCQkJCX0KLQkJCQlyZXR1cm4gcW5hbWUudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gZmluZCBhIEpEVCBJVHlwZSBvYmplY3QgZm9yIHRoZSBnaXZlbgotCSAqIHJlc29sdmVkIG9yIHVucmVzb2x2ZWQgdHlwZSBuYW1lIGluIHRoZSBjb250ZXh0IG9mCi0JICogdGhlIGdpdmVuIGFuY2VzdG9yIHR5cGUgKGllLiB0aGUgdHlwZSBhY3RpbmcgYXMgdGhlCi0JICogY29udGV4dCB3aXRoaW4gd2hpY2ggdGhlIHR5cGUgbmFtZSBzaG91bGQgYmUgcmVzb2x2ZWQpLgotCSAqIEBwYXJhbSB0eXBlTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgdG8gZmluZC4KLQkgKiBAcGFyYW0gYW5jZXN0b3IgVGhlIHR5cGUgcHJvdmlkaW5nIHRoZSBjb250ZXh0IHdpdGhpbgotCSAqIHdoaWNoIHRvIGxvb2sgdXAgdGhlIHR5cGUuCi0JICogQHJldHVybiBUaGUgSVR5cGUgb2JqZWN0IG9mIHRoZSBnaXZlbiBxdWFsaWZpZWQgbmFtZSwKLQkgKiBvciBudWxsIGlmIG5vIHR5cGUgY291bGQgYmUgZm91bmQgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgSVR5cGUgZmluZFR5cGUgKCBTdHJpbmcgdHlwZU5hbWUsIElUeXBlIGFuY2VzdG9yICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJVHlwZSB0eXBlID0gamF2YVByb2plY3RfLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCAmJiBhbmNlc3RvciAhPSBudWxsKQotCQl7Ci0JCQlTdHJpbmdbXVtdIG1hdGNoZXMgPSBhbmNlc3Rvci5yZXNvbHZlVHlwZSh0eXBlTmFtZSk7Ci0JCQlpZiAobWF0Y2hlcyAhPSBudWxsKQotCQkJewotCQkJCWludCBpPTA7Ci0JCQkJd2hpbGUgKHR5cGUgPT0gbnVsbCAmJiBpPG1hdGNoZXMubGVuZ3RoKQotCQkJCXsKLQkJCQkJU3RyaW5nQnVmZmVyIHFuYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlpbnQgbiA9IG1hdGNoZXNbaV0ubGVuZ3RoOwotCQkJCQlmb3IgKGludCBqPTA7IGo8bi0xOyBqKyspCi0JCQkJCXsKLQkJCQkJCXFuYW1lLmFwcGVuZChtYXRjaGVzW2ldW2pdKS5hcHBlbmQoIi4iKTsKLQkJCQkJfQotCQkJCQlpZiAobiA+PSAwKQotCQkJCQl7Ci0JCQkJCQlxbmFtZS5hcHBlbmQobWF0Y2hlc1tpXVtuLTFdKTsKLQkJCQkJfQotCQkJCQl0eXBlID0gamF2YVByb2plY3RfLmZpbmRUeXBlKHFuYW1lLnRvU3RyaW5nKCkpOwotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGFsbCBwdWJsaWMsIG5vbi1jb25zdHJ1Y3RvciBJTWV0aG9kcyBiZWxvbmdpbmcKLQkgKiB0byB0aGUgZ2l2ZW4gSVR5cGUgYW5kIGFkZHMgdGhlbSB0byB0aGUgZ2l2ZW4gbGlzdC4KLQkgKiBAcGFyYW0gamR0VHlwZSBUaGUgdHlwZSB3aG9zZSBtZXRob2RzIGFyZSB0byBiZSBoYXJ2ZXN0ZWQuCi0JICogQHBhcmFtIGxpc3QgVGhlIGxpc3QgdG8gd2hpY2ggdGhlIGhhcnZlc3RlZCBtZXRob2RzIHdpbGwgYmUgYWRkZWQuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gSWYgdGhlIEpEVCBlbmdpbmUgZmFpbHMgdG8KLQkgKiBhbmFseXplIHRoZSBnaXZlbiB0eXBlIHRvIHNhdGlzZnkgdGhpcyByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGhhcnZlc3RQdWJsaWNNZXRob2RzICggSVR5cGUgamR0VHlwZSwgTGlzdCBsaXN0ICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJTWV0aG9kW10gbWV0aG9kcyA9IGpkdFR5cGUuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBtPTA7IG08bWV0aG9kcy5sZW5ndGg7IG0rKykKLQkJewotCQkJaWYgKCFtZXRob2RzW21dLmlzQ29uc3RydWN0b3IoKSAmJiBGbGFncy5pc1B1YmxpYyhtZXRob2RzW21dLmdldEZsYWdzKCkpKQotCQkJewotCQkJCWxpc3QuYWRkKG1ldGhvZHNbbV0pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEZpbmRzIGFsbCBwdWJsaWMgSUZpZWxkcyBiZWxvbmdpbmcKLQkgKiB0byB0aGUgZ2l2ZW4gSVR5cGUgYW5kIGFkZHMgdGhlbSB0byB0aGUgZ2l2ZW4gbGlzdC4KLQkgKiBAcGFyYW0gamR0VHlwZSBUaGUgdHlwZSB3aG9zZSBmaWVsZHMgYXJlIHRvIGJlIGhhcnZlc3RlZC4KLQkgKiBAcGFyYW0gbGlzdCBUaGUgbGlzdCB0byB3aGljaCB0aGUgaGFydmVzdGVkIGZpZWxkcyB3aWxsIGJlIGFkZGVkLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBKRFQgZW5naW5lIGZhaWxzIHRvCi0JICogYW5hbHl6ZSB0aGUgZ2l2ZW4gdHlwZSB0byBzYXRpc2Z5IHRoaXMgcmVxdWVzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoYXJ2ZXN0UHVibGljRmllbGRzICggSVR5cGUgamR0VHlwZSwgTGlzdCBsaXN0ICkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJRmllbGRbXSBmaWVsZHMgPSBqZHRUeXBlLmdldEZpZWxkcygpOwotCQlmb3IgKGludCBmPTA7IGY8ZmllbGRzLmxlbmd0aDsgZisrKQotCQl7Ci0JCQlpZiAoRmxhZ3MuaXNQdWJsaWMoZmllbGRzW2ZdLmdldEZsYWdzKCkpKQotCQkJewotCQkJCWxpc3QuYWRkKGZpZWxkc1tmXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBhIGdldHRlciBhY2NvcmRpbmcgdG8gdGhlIEJlYW4gc3BlYwotCSAqIChlZy4gIk15VHlwZSBnZXRNeVByb3BlcnR5ICgpIiBvciAiYm9vbGVhbiBpc015UHJvcGVydHkgKCkiKQotCSAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBiZWFuIHByb3BlcnR5IG5hbWUgKGVnLiAibXlQcm9wZXJ0eSIpLAotCSAqIG90aGVyd2lzZSwgcmV0dXJuIG51bGwuCi0JICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGNoZWNrLgotCSAqIEByZXR1cm4gVGhlIHByb3BlcnR5IG5hbWUgb3Igbm9uZSBpZiB0aGUgbWV0aG9kIGlzIG5vdCBhIGdldHRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdldHRlck5hbWUgKCBJTWV0aG9kIG1ldGhvZCApCi0JewotCQl0cnkKLQkJewotCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCWlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpICYmIG1ldGhvZE5hbWUubGVuZ3RoKCkgPiAzKQotCQkJewotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBtZXRob2QuZ2V0U2lnbmF0dXJlKCk7Ci0JCQkJU3RyaW5nIHJldHVyblR5cGVOYW1lID0gU2lnbmF0dXJlLmdldFJldHVyblR5cGUoc2lnbmF0dXJlKTsKLQkJCQkvLwotCQkJCS8vIEdldHRlcnMgbXVzdCBub3QgYmUgdm9pZC4KLQkJCQkvLwotCQkJCWlmIChyZXR1cm5UeXBlTmFtZSAhPSBudWxsICYmIHJldHVyblR5cGVOYW1lICE9IFNpZ25hdHVyZS5TSUdfVk9JRCkKLQkJCQl7Ci0JCQkJCVN0cmluZ1tdIHBhcmFtZXRlclNpZ25hdHVyZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQkJLy8KLQkJCQkJLy8gTm9uLWluZGV4ZWQgZ2V0dGVycyBtdXN0IGhhdmUgemVybyBwYXJhbWV0ZXJzLgotCQkJCQkvLwotCQkJCQlpZiAocGFyYW1ldGVyU2lnbmF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCQkJewotCQkJCQkJcmV0dXJuIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDMsNCkudG9Mb3dlckNhc2UoKSArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDQpOwotCQkJCQl9Ci0JCQkJCS8vCi0JCQkJCS8vIEluZGV4ZWQgZ2V0dGVycyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyIG9mIHR5cGUgImludCIuCi0JCQkJCS8vCi0JCQkJCWVsc2UgaWYgKHBhcmFtZXRlclNpZ25hdHVyZXMubGVuZ3RoID09IDEpCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBpbmRleFR5cGVOYW1lID0gZ2V0VHlwZU5hbWVGcm9tU2lnbmF0dXJlKHBhcmFtZXRlclNpZ25hdHVyZXNbMF0pOwotCQkJCQkJaWYgKGluZGV4VHlwZU5hbWUuZXF1YWxzKCJpbnQiKSkKLQkJCQkJCXsKLQkJCQkJCQlyZXR1cm4gbWV0aG9kTmFtZS5zdWJzdHJpbmcoMyw0KS50b0xvd2VyQ2FzZSgpICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoNCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImlzIikgJiYgbWV0aG9kTmFtZS5sZW5ndGgoKSA+IDIpCi0JCQl7Ci0JCQkJU3RyaW5nIHNpZ25hdHVyZSA9IG1ldGhvZC5nZXRTaWduYXR1cmUoKTsKLQkJCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSBTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZShzaWduYXR1cmUpOwotCQkJCS8vCi0JCQkJLy8gImlzIiBnZXR0ZXJzIG11c3QgYmUgYm9vbGVhbi4KLQkJCQkvLwotCQkJCWlmIChTaWduYXR1cmUuU0lHX0JPT0xFQU4uZXF1YWxzKHJldHVyblR5cGVOYW1lKSkKLQkJCQl7Ci0JCQkJCS8vCi0JCQkJCS8vICJpcyIgZ2V0dGVycyBtdXN0IGhhdmUgbm8gcGFyYW1ldGVycy4KLQkJCQkJLy8KLQkJCQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKQotCQkJCQl7Ci0JCQkJCQlyZXR1cm4gbWV0aG9kTmFtZS5zdWJzdHJpbmcoMiwzKS50b0xvd2VyQ2FzZSgpICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBhIHNldHRlciBhY2NvcmRpbmcgdG8gdGhlIEJlYW4gc3BlYwotCSAqIChlZy4gInZvaWQgc2V0TXlQcm9wZXJ0eSAoTXlUeXBlKSIgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi0JICogYmVhbiBwcm9wZXJ0eSBuYW1lIChlZy4gIm15UHJvcGVydHkiKSwgb3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4KLQkgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gY2hlY2suCi0JICogQHJldHVybiBUaGUgcHJvcGVydHkgbmFtZSBvciBub25lIGlmIHRoZSBtZXRob2QgaXMgbm90IGEgc2V0dGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyTmFtZSAoIElNZXRob2QgbWV0aG9kICkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgic2V0IikgJiYgbWV0aG9kTmFtZS5sZW5ndGgoKSA+IDMpCi0JCQl7Ci0JCQkJU3RyaW5nIHNpZ25hdHVyZSA9IG1ldGhvZC5nZXRTaWduYXR1cmUoKTsKLQkJCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSBTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZShzaWduYXR1cmUpOwotCQkJCS8vCi0JCQkJLy8gU2V0dGVycyBtdXN0IGJlIHZvaWQuCi0JCQkJLy8KLQkJCQlpZiAoU2lnbmF0dXJlLlNJR19WT0lELmVxdWFscyhyZXR1cm5UeXBlTmFtZSkpCi0JCQkJewotCQkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJTaWduYXR1cmVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJCS8vCi0JCQkJCS8vIE5vbi1pbmRleGVkIHNldHRlcnMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlci4KLQkJCQkJLy8KLQkJCQkJaWYgKHBhcmFtZXRlclNpZ25hdHVyZXMubGVuZ3RoID09IDEpCi0JCQkJCXsKLQkJCQkJCXJldHVybiBtZXRob2ROYW1lLnN1YnN0cmluZygzLDQpLnRvTG93ZXJDYXNlKCkgKyBtZXRob2ROYW1lLnN1YnN0cmluZyg0KTsKLQkJCQkJfQotCQkJCQkvLwotCQkJCQkvLyBJbmRleGVkIHNldHRlcnMgbXVzdCBoYXZlIGV4YWN0bHkgdHdvIHBhcmFtZXRlcnMsCi0JCQkJCS8vIHRoZSBmaXJzdCBvZiB3aGljaCBtdXN0IGJlICJpbnQiLgotCQkJCQkvLwotCQkJCQllbHNlIGlmIChwYXJhbWV0ZXJTaWduYXR1cmVzLmxlbmd0aCA9PSAyKQotCQkJCQl7Ci0JCQkJCQlpZiAoU2lnbmF0dXJlLlNJR19JTlQuZXF1YWxzKHBhcmFtZXRlclNpZ25hdHVyZXNbMF0pKQotCQkJCQkJewotCQkJCQkJCXJldHVybiBtZXRob2ROYW1lLnN1YnN0cmluZygzLDQpLnRvTG93ZXJDYXNlKCkgKyBtZXRob2ROYW1lLnN1YnN0cmluZyg0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIFRoZSBKYXZhIHByb2plY3QgdGhhdCBnb3Zlcm5zIHRoZSBzZWFyY2ggc2NvcGUgZm9yIHRoaXMgcmVzb2x2ZXIuCi0JICovCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3RfOwotCQotCS8qCi0JICogVGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlLCBpZiBhbnkuIAotCSAqLwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yXzsKLQkKLQkvKgotCSAqIFRoZSBzZXQgb2YgSmF2YSB3cmFwcGVyIHR5cGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHdyYXBwZXJUeXBlc18gPSB7Ci0JCSJqYXZhLmxhbmcuQ2hhcmFjdGVyIiwKLQkJImphdmEubGFuZy5Cb29sZWFuIiwKLQkJImphdmEubGFuZy5CeXRlIiwKLQkJImphdmEubGFuZy5TaG9ydCIsCi0JCSJqYXZhLmxhbmcuSW50ZWdlciIsCi0JCSJqYXZhLmxhbmcuTG9uZyIsCi0JCSJqYXZhLmxhbmcuRmxvYXQiLAotCQkiamF2YS5sYW5nLkRvdWJsZSIKLQl9OwotCi0JLyoKLQkgKiBUaGUgc2V0IG9mIEphdmEgcHJpbWl0aXZlIHR5cGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHByaW1pdGl2ZVR5cGVzXyA9IHsKLQkJImNoYXIiLAotCQkiYm9vbGVhbiIsCi0JCSJieXRlIiwKLQkJInNob3J0IiwKLQkJImludCIsCi0JCSJsb25nIiwKLQkJImZsb2F0IiwKLQkJImRvdWJsZSIKLQl9OwotCi0JLyoKLQkgKiBUaGUgc2V0IG9mIEpBWC1SUEMgc3VwcG9ydGVkIEphdmEgc3RhbmRhcmQgdHlwZXMsCi0JICogZXhjbHVkaW5nIHByaW1pdGl2ZXMgYW5kIHdyYXBwZXIgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gamF4cnBjVHlwZXNfID0gewotCQkiYm9vbGVhbiIsCi0JCSJieXRlIiwKLQkJInNob3J0IiwKLQkJImludCIsCi0JCSJsb25nIiwKLQkJImZsb2F0IiwKLQkJImRvdWJsZSIsCi0JCSJqYXZhLmxhbmcuU3RyaW5nIiwKLQkJImphdmEubGFuZy5Cb29sZWFuIiwKLQkJImphdmEubGFuZy5CeXRlIiwKLQkJImphdmEubGFuZy5TaG9ydCIsCi0JCSJqYXZhLmxhbmcuSW50ZWdlciIsCi0JCSJqYXZhLmxhbmcuTG9uZyIsCi0JCSJqYXZhLmxhbmcuRmxvYXQiLAotCQkiamF2YS5sYW5nLkRvdWJsZSIsCi0JCSJqYXZhLnV0aWwuRGF0ZSIsCi0JCSJqYXZhLnV0aWwuQ2FsZW5kYXIiLAotCQkiamF2YS5tYXRoLkJpZ0ludGVnZXIiLAotCQkiamF2YS5tYXRoLkJpZ0RlY2ltYWwiLAotCQkiamF2YS5uZXQuVVJJIiwKLQkJImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiCi0JfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvSmF2YUJlYW5Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9KYXZhQmVhblByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOWQ1NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9KYXZhQmVhblByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci0KLS8qKgotICogQGF1dGhvciBjYnJlYWxleQotICogVGhpcyBpcyBhIGdhcmRlbiB2YXJpZXR5IGltcGxlbWVudGF0aW9uIG9mIElKYXZhQmVhblByb3BlcnR5LAotICogY29uc3RydWN0YWJsZSBieSBkZWZhdWx0IGFuZCBlcXVpcHBlZCB3aXRoIGdldHRlcnMgYW5kIHNldHRlcnMKLSAqIGZvciB0aGUgcHJvcGVydGllcyBvZiBJSmF2YUJlYW5Qcm9wZXJ0eS4KLSAqLwotcHVibGljIGNsYXNzIEphdmFCZWFuUHJvcGVydHkgaW1wbGVtZW50cyBJSmF2YUJlYW5Qcm9wZXJ0eQotewotCXByaXZhdGUgU3RyaW5nIG5hbWVfOwotCXByaXZhdGUgYm9vbGVhbiBpbmRleGVkXzsKLQlwcml2YXRlIElNZXRob2QgZ2V0dGVyXzsKLQlwcml2YXRlIElNZXRob2Qgc2V0dGVyXzsKLQlwcml2YXRlIElNZXRob2QgaW5kZXhlZEdldHRlcl87Ci0JcHJpdmF0ZSBJTWV0aG9kIGluZGV4ZWRTZXR0ZXJfOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YUJlYW5Qcm9wZXJ0eSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLQl7Ci0JCXJldHVybiBuYW1lXzsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgIm5hbWUiIHByb3BlcnR5IG9mIHRoaXMgSmF2YSBCZWFuIFByb3BlcnR5IGRlc2NyaXB0b3IuCi0JICogQHBhcmFtIG5hbWUgVGhlIHN0cmluZyB2YWx1ZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICkKLQl7Ci0JCW5hbWVfID0gbmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhQmVhblByb3BlcnR5I2lzSW5kZXhlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmRleGVkICgpCi0JewotCQlyZXR1cm4gaW5kZXhlZF87Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlICJpbmRleGVkIiBwcm9wZXJ0eSBvZiB0aGlzIEphdmEgQmVhbiBQcm9wZXJ0eSBkZXNjcmlwdG9yLgotCSAqIEBwYXJhbSBpbmRleGVkIFRoZSBib29sZWFuIHZhbHVlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleGVkICggYm9vbGVhbiBpbmRleGVkICkKLQl7Ci0JCWluZGV4ZWRfID0gaW5kZXhlZDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhQmVhblByb3BlcnR5I2dldEdldHRlcigpCi0JICovCi0JcHVibGljIElNZXRob2QgZ2V0R2V0dGVyICgpCi0JewotCQlyZXR1cm4gZ2V0dGVyXzsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgImdldHRlciIgcHJvcGVydHkgb2YgdGhpcyBKYXZhIEJlYW4gUHJvcGVydHkgZGVzY3JpcHRvci4KLQkgKiBAcGFyYW0gZ2V0dGVyIFRoZSBJTWV0aG9kIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHZXR0ZXIgKCBJTWV0aG9kIGdldHRlciApCi0JewotCQlnZXR0ZXJfID0gZ2V0dGVyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSUphdmFCZWFuUHJvcGVydHkjZ2V0U2V0dGVyKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZCBnZXRTZXR0ZXIgKCkKLQl7Ci0JCXJldHVybiBzZXR0ZXJfOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSAic2V0dGVyIiBwcm9wZXJ0eSBvZiB0aGlzIEphdmEgQmVhbiBQcm9wZXJ0eSBkZXNjcmlwdG9yLgotCSAqIEBwYXJhbSBzZXR0ZXIgVGhlIElNZXRob2QgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldHRlciAoIElNZXRob2Qgc2V0dGVyICkKLQl7Ci0JCXNldHRlcl8gPSBzZXR0ZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YUJlYW5Qcm9wZXJ0eSNnZXRJbmRleGVkR2V0dGVyKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZCBnZXRJbmRleGVkR2V0dGVyICgpCi0JewotCQlyZXR1cm4gaW5kZXhlZEdldHRlcl87Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlICJpbmRleGVkR2V0dGVyIiBwcm9wZXJ0eSBvZiB0aGlzIEphdmEgQmVhbiBQcm9wZXJ0eSBkZXNjcmlwdG9yLgotCSAqIEBwYXJhbSBpbmRleGVkR2V0dGVyIFRoZSBJTWV0aG9kIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleGVkR2V0dGVyICggSU1ldGhvZCBpbmRleGVkR2V0dGVyICkKLQl7Ci0JCWluZGV4ZWRHZXR0ZXJfID0gaW5kZXhlZEdldHRlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhQmVhblByb3BlcnR5I2dldEluZGV4ZWRTZXR0ZXIoKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kIGdldEluZGV4ZWRTZXR0ZXIgKCkKLQl7Ci0JCXJldHVybiBpbmRleGVkU2V0dGVyXzsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgImluZGV4ZWRTZXR0ZXIiIHByb3BlcnR5IG9mIHRoaXMgSmF2YSBCZWFuIFByb3BlcnR5IGRlc2NyaXB0b3IuCi0JICogQHBhcmFtIGluZGV4ZWRTZXR0ZXIgVGhlIElNZXRob2QgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGV4ZWRTZXR0ZXIgKCBJTWV0aG9kIGluZGV4ZWRTZXR0ZXIgKQotCXsKLQkJaW5kZXhlZFNldHRlcl8gPSBpbmRleGVkU2V0dGVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YUJlYW5Qcm9wZXJ0eSNnZXREZWNsYXJpbmdUeXBlKCkKLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0RGVjbGFyaW5nVHlwZSAoKQotCXsKLQkJSU1ldGhvZCBtZXRob2QgPSBnZXRHZXR0ZXIoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSBtZXRob2QgPSBnZXRTZXR0ZXIoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSBtZXRob2QgPSBnZXRJbmRleGVkR2V0dGVyKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgbWV0aG9kID0gZ2V0SW5kZXhlZFNldHRlcigpOwotCQlyZXR1cm4gbWV0aG9kICE9IG51bGwgPyBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0phdmFXZWJTZXJ2aWNlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9KYXZhV2ViU2VydmljZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmZmEzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0phdmFXZWJTZXJ2aWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxOSAgIDEzMjkwNSBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleSAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci0KLS8qKgotICogQSBiYXNpYyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElKYXZhV2ViU2VydmljZVJ1bGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV2ViU2VydmljZVJ1bGUgaW1wbGVtZW50cyBJSmF2YVdlYlNlcnZpY2VSdWxlCi17Ci0JcHJvdGVjdGVkIElKYXZhV2ViU2VydmljZVJ1bGVFbmdpbmUgZW5naW5lXzsKLQlwcm90ZWN0ZWQgTGlzdCBzdGF0dXNMaXN0XzsKLQlwcm90ZWN0ZWQgaW50IGlkXzsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZV87Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lXzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uXzsKLQkKLQlwcm90ZWN0ZWQgSmF2YVdlYlNlcnZpY2VSdWxlICgpCi0JewotCQkvLyBOb3QgcHVibGljbHkgY29uc3RydWN0YWJsZS4KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhV2ViU2VydmljZVJ1bGUjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQgKCkKLQl7Ci0JCXJldHVybiBpZF87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlI2dldE5hbWVzcGFjZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UgKCkKLQl7Ci0JCXJldHVybiBuYW1lc3BhY2VfOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSUphdmFXZWJTZXJ2aWNlUnVsZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLQl7Ci0JCXJldHVybiBuYW1lXzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhV2ViU2VydmljZVJ1bGUjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbl87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlI2luaXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQgKCBJSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lIGVuZ2luZSApCi0JewotCQllbmdpbmVfID0gZW5naW5lOwotCQlzdGF0dXNMaXN0XyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlI3Zpc2l0Q2xhc3Mob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUsIGphdmEudXRpbC5TdGFjaykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdENsYXNzICggSVR5cGUgamR0Q2xhc3MsIFN0YWNrIHBlYW51dFRyYWlsICkKLQl7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlI3Zpc2l0RXhjZXB0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZCwgamF2YS51dGlsLlN0YWNrKQotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0RXhjZXB0aW9uICggSVR5cGUgamR0Q2xhc3MsIFN0YWNrIHBlYW51dFRyYWlsICkKLQl7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlI3Zpc2l0RmllbGQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkLCBqYXZhLnV0aWwuU3RhY2spCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRGaWVsZCAoIElGaWVsZCBqZHRGaWVsZCwgU3RhY2sgcGVhbnV0VHJhaWwgKQotCXsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhV2ViU2VydmljZVJ1bGUjdmlzaXRQcm9wZXJ0eShvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kLCBqYXZhLnV0aWwuU3RhY2spCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRQcm9wZXJ0eSAoIElKYXZhQmVhblByb3BlcnR5IGJlYW5Qcm9wZXJ0eSwgU3RhY2sgcGVhbnV0VHJhaWwgKQotCXsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhV2ViU2VydmljZVJ1bGUjdmlzaXRNZXRob2Qob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCwgamF2YS51dGlsLlN0YWNrKQotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kICggSU1ldGhvZCBqZHRNZXRob2QsIFN0YWNrIHBlYW51dFRyYWlsICkKLQl7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlI2dldFJlc3VsdHMoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFJlc3VsdHMgKCkKLQl7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKHN0YXR1c0xpc3RfLnNpemUoKSA9PSAwKQotCQl7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIm9yZy5lY2xpcHNlLmpzdC53cyIsMCwiIixudWxsKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKCJvcmcuZWNsaXBzZS5qc3Qud3MiLDAsIiIsbnVsbCk7Ci0JCQlJdGVyYXRvciBpID0gc3RhdHVzTGlzdF8uaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkKLQkJCXsKLQkJCQltdWx0aVN0YXR1cy5hZGQoKElTdGF0dXMpaS5uZXh0KCkpOwotCQkJfQotCQkJc3RhdHVzID0gbXVsdGlTdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0phdmFXZWJTZXJ2aWNlUnVsZVNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9KYXZhV2ViU2VydmljZVJ1bGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4NzcxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL0phdmFXZWJTZXJ2aWNlUnVsZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxOSAgIDEzMjkwNSBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleSAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotCi0vKioKLSAqIEBhdXRob3IgY2JyZWFsZXkKLSAqIFRoaXMgb2JqZWN0IG1hbmFnZXMgYSBzZXQgb2YgcnVsZXMuCi0gKiBSdWxlcyBpbiB0aGUgc2V0IG1heSBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVdlYlNlcnZpY2VSdWxlU2V0Ci17Ci0JcHJpdmF0ZSBTZXQgZW5hYmxlZFJ1bGVzXyA9IG5ldyBIYXNoU2V0KCk7Ci0JcHJpdmF0ZSBTZXQgZGlzYWJsZWRSdWxlc18gPSBuZXcgSGFzaFNldCgpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcsIGluaXRpYWxseSBlbXB0eSBzZXQgb2YgcnVsZXMuCi0JICovCi0JcHVibGljIEphdmFXZWJTZXJ2aWNlUnVsZVNldCAoKQotCXsKLQkJLy8gTm90aGluZyB0byBkby4KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNldCBvZiBydWxlcyBpbml0aWFsaXplZCB3aXRoIHRob3NlCi0JICogZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgb2YgPGNvZGU+cnVsZXM8L2NvZGU+LgotCSAqIEBwYXJhbSBydWxlcyBBbiBhcnJheSBvZiBydWxlcyB0byBhZGQuCi0JICovCi0JcHVibGljIEphdmFXZWJTZXJ2aWNlUnVsZVNldCAoIElKYXZhV2ViU2VydmljZVJ1bGVbXSBydWxlcyApCi0JewotCQlhZGRSdWxlcyhydWxlcyk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgYSA8Y29kZT5ydWxlPC9jb2RlPiB0byB0aGUgc2V0LgotCSAqIFJ1bGVzIGFkZGVkIHRvIHRoZSBzZXQgYXJlIGluaXRpYWxseSBlbmFibGVkLgotCSAqIEBwYXJhbSBydWxlIFRoZSBydWxlIHRvIGFkZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSdWxlICggSUphdmFXZWJTZXJ2aWNlUnVsZSBydWxlICkKLQl7Ci0JCWVuYWJsZWRSdWxlc18uYWRkKHJ1bGUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHNldmVyYWwgPGNvZGU+cnVsZXM8L2NvZGU+IHRvIHRoZSBzZXQuCi0JICogUnVsZXMgYWRkZWQgdG8gdGhlIHNldCBhcmUgaW5pdGlhbGx5IGVuYWJsZWQuCi0JICogQHBhcmFtIHJ1bGVzIFRoZSBhcnJheSBvZiBydWxlcyB0byBhZGQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUnVsZXMgKCBJSmF2YVdlYlNlcnZpY2VSdWxlW10gcnVsZXMgKQotCXsKLQkJZW5hYmxlZFJ1bGVzXy5hZGRBbGwoQXJyYXlzLmFzTGlzdChydWxlcykpOwotCX0KLQkKLQkvKioKLQkgKiBNYXJrcyB0aGUgZ2l2ZW4gPGNvZGU+cnVsZTwvY29kZT4gYXMgZGlzYWJsZWQgb3IgZW5hYmxlZC4KLQkgKiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBydWxlIGlzIG5vdCBhbHJlYWR5IGluCi0JICogdGhlIHNldCwgaW4gb3RoZXIgd29yZHMsIHRoaXMgbWV0aG9kIHdpbGwgbm90IGhhdmUgdGhlCi0JICogc2lkZSBlZmZlY3Qgb2YgYWRkaW5nIGEgcnVsZSB0byB0aGUgc2V0LgotCSAqIEBwYXJhbSBydWxlIFRoZSBydWxlIHRvIGRpc2FibGUgb3IgZW5hYmxlLgotCSAqIEBwYXJhbSBkaXNhYmxlZCBUcnVlIHRvIGRpc2FibGUgdGhlIHJ1bGUgb3IgZmFsc2UgdG8gZW5hYmxlIGl0LgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBhIGNoYW5nZSBpbiBzdGF0dXMgd2FzIGFjdHVhbGx5IG1hZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0UnVsZURpc2FibGVkICggSUphdmFXZWJTZXJ2aWNlUnVsZSBydWxlLCBib29sZWFuIGRpc2FibGVkICkKLQl7Ci0JCWlmIChkaXNhYmxlZCkKLQkJewotCQkJaWYgKGVuYWJsZWRSdWxlc18ucmVtb3ZlKHJ1bGUpKQotCQkJewotCQkJCWRpc2FibGVkUnVsZXNfLmFkZChydWxlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChkaXNhYmxlZFJ1bGVzXy5yZW1vdmUocnVsZSkpCi0JCQl7Ci0JCQkJZW5hYmxlZFJ1bGVzXy5hZGQocnVsZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgc2V0LgotCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSAoKQotCXsKLQkJcmV0dXJuIGVuYWJsZWRSdWxlc18uc2l6ZSgpICsgZGlzYWJsZWRSdWxlc18uc2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW5hYmxlZCBydWxlcyBpbiB0aGUgc2V0LgotCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBlbmFibGVkIHJ1bGVzIGluIHRoZSBzZXQuCi0JICovCi0JcHVibGljIGludCBudW1iZXJFbmFibGVkICgpCi0JewotCQlyZXR1cm4gZW5hYmxlZFJ1bGVzXy5zaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCBydWxlcyBpbiB0aGUgc2V0LgotCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBkaXNhYmxlZCBydWxlcyBpbiB0aGUgc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyRGlzYWJsZWQgKCkKLQl7Ci0JCXJldHVybiBkaXNhYmxlZFJ1bGVzXy5zaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGN1cnJlbnRseSBlbmFibGVkIHJ1bGVzIGZyb20gdGhlIHNldC4KLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGFsbCBjdXJyZW50bHkgZW5hYmxlZCBydWxlcyBmcm9tIHRoZSBzZXQuCi0JICovCi0JcHVibGljIElKYXZhV2ViU2VydmljZVJ1bGVbXSBnZXRFbmFibGVkUnVsZXMgKCkKLQl7Ci0JCXJldHVybiAoSUphdmFXZWJTZXJ2aWNlUnVsZVtdKWVuYWJsZWRSdWxlc18udG9BcnJheShuZXcgSUphdmFXZWJTZXJ2aWNlUnVsZVswXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGN1cnJlbnRseSBkaXNhYmxlZCBydWxlcyBmcm9tIHRoZSBzZXQuCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBhbGwgY3VycmVudGx5IGRpc2FibGVkIHJ1bGVzIGZyb20gdGhlIHNldC4KLQkgKi8KLQlwdWJsaWMgSUphdmFXZWJTZXJ2aWNlUnVsZVtdIGdldERpc2FibGVkUnVsZXMgKCkKLQl7Ci0JCXJldHVybiAoSUphdmFXZWJTZXJ2aWNlUnVsZVtdKWRpc2FibGVkUnVsZXNfLnRvQXJyYXkobmV3IElKYXZhV2ViU2VydmljZVJ1bGVbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplcyBhbGwgcnVsZXMgaW4gdGhlIHNldCBieSBjYWxsaW5nCi0JICogdGhlaXIgaW5pdCgpIG1ldGhvZHMgd2l0aCB0aGUgZ2l2ZW4gZW5naW5lLgotCSAqIEBwYXJhbSBlbmdpbmUgVGhlIGVuZ2luZSBpbml0aWFsaXppbmcgCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCAoIElKYXZhV2ViU2VydmljZVJ1bGVFbmdpbmUgZW5naW5lICkKLQl7Ci0JCUl0ZXJhdG9yIGkgPSBlbmFibGVkUnVsZXNfLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkKLQkJewotCQkJSUphdmFXZWJTZXJ2aWNlUnVsZSBydWxlID0gKElKYXZhV2ViU2VydmljZVJ1bGUpaS5uZXh0KCk7Ci0JCQlydWxlLmluaXQoZW5naW5lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZpc2l0cyB0aGUgInZpc2l0Q2xhc3MiIG1ldGhvZCBvZiBhbGwgcnVsZXMgaW4gdGhlIHNldC4gCi0JICogQHBhcmFtIGpkdENsYXNzIFRoZSBKRFQgSVR5cGUgYmVpbmcgdmlzaXRlZC4KLQkgKiBAcGFyYW0gcGVhbnV0VHJhaWwgVGhlIHN0YWNrIG9mIG9iamVjdHMgdXAgdG8gdGhlIHJvb3QuCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRDbGFzcyAoIElUeXBlIGpkdENsYXNzLCBTdGFjayBwZWFudXRUcmFpbCApCi0JewotCQlJdGVyYXRvciBpID0gZW5hYmxlZFJ1bGVzXy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpCi0JCXsKLQkJCUlKYXZhV2ViU2VydmljZVJ1bGUgcnVsZSA9IChJSmF2YVdlYlNlcnZpY2VSdWxlKWkubmV4dCgpOwotCQkJcnVsZS52aXNpdENsYXNzKGpkdENsYXNzLHBlYW51dFRyYWlsKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogVmlzaXRzIHRoZSAidmlzaXRFeGNlcHRpb24iIG1ldGhvZCBvZiBhbGwgcnVsZXMgaW4gdGhlIHNldC4gCi0JICogQHBhcmFtIGpkdENsYXNzIFRoZSBKRFQgSVR5cGUgYmVpbmcgdmlzaXRlZC4KLQkgKiBAcGFyYW0gcGVhbnV0VHJhaWwgVGhlIHN0YWNrIG9mIG9iamVjdHMgdXAgdG8gdGhlIHJvb3QuCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRFeGNlcHRpb24gKCBJVHlwZSBqZHRDbGFzcywgU3RhY2sgcGVhbnV0VHJhaWwgKQotCXsKLQkJSXRlcmF0b3IgaSA9IGVuYWJsZWRSdWxlc18uaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKQotCQl7Ci0JCQlJSmF2YVdlYlNlcnZpY2VSdWxlIHJ1bGUgPSAoSUphdmFXZWJTZXJ2aWNlUnVsZSlpLm5leHQoKTsKLQkJCXJ1bGUudmlzaXRFeGNlcHRpb24oamR0Q2xhc3MscGVhbnV0VHJhaWwpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBWaXNpdHMgdGhlICJ2aXNpdEZpZWxkIiBtZXRob2Qgb2YgYWxsIHJ1bGVzIGluIHRoZSBzZXQuIAotCSAqIEBwYXJhbSBqZHRDbGFzcyBUaGUgSkRUIElGaWVsZCBiZWluZyB2aXNpdGVkLgotCSAqIEBwYXJhbSBwZWFudXRUcmFpbCBUaGUgc3RhY2sgb2Ygb2JqZWN0cyB1cCB0byB0aGUgcm9vdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdEZpZWxkICggSUZpZWxkIGpkdEZpZWxkLCBTdGFjayBwZWFudXRUcmFpbCApCi0JewotCQlJdGVyYXRvciBpID0gZW5hYmxlZFJ1bGVzXy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpCi0JCXsKLQkJCUlKYXZhV2ViU2VydmljZVJ1bGUgcnVsZSA9IChJSmF2YVdlYlNlcnZpY2VSdWxlKWkubmV4dCgpOwotCQkJcnVsZS52aXNpdEZpZWxkKGpkdEZpZWxkLHBlYW51dFRyYWlsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZpc2l0cyB0aGUgInZpc2l0UHJvcGVydHkiIG1ldGhvZCBvZiBhbGwgcnVsZXMgaW4gdGhlIHNldC4gCi0JICogQHBhcmFtIGpkdENsYXNzIFRoZSBJSmF2YUJlYW5Qcm9wZXJ0eSBiZWluZyB2aXNpdGVkLgotCSAqIEBwYXJhbSBwZWFudXRUcmFpbCBUaGUgc3RhY2sgb2Ygb2JqZWN0cyB1cCB0byB0aGUgcm9vdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdFByb3BlcnR5ICggSUphdmFCZWFuUHJvcGVydHkgYmVhblByb3BlcnR5LCBTdGFjayBwZWFudXRUcmFpbCApCi0JewotCQlJdGVyYXRvciBpID0gZW5hYmxlZFJ1bGVzXy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpCi0JCXsKLQkJCUlKYXZhV2ViU2VydmljZVJ1bGUgcnVsZSA9IChJSmF2YVdlYlNlcnZpY2VSdWxlKWkubmV4dCgpOwotCQkJcnVsZS52aXNpdFByb3BlcnR5KGJlYW5Qcm9wZXJ0eSxwZWFudXRUcmFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWaXNpdHMgdGhlICJ2aXNpdE1ldGhvZCIgbWV0aG9kIG9mIGFsbCBydWxlcyBpbiB0aGUgc2V0LiAKLQkgKiBAcGFyYW0gamR0Q2xhc3MgVGhlIEpEVCBJTWV0aG9kIGJlaW5nIHZpc2l0ZWQuCi0JICogQHBhcmFtIHBlYW51dFRyYWlsIFRoZSBzdGFjayBvZiBvYmplY3RzIHVwIHRvIHRoZSByb290LgotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kICggSU1ldGhvZCBqZHRNZXRob2QsIFN0YWNrIHBlYW51dFRyYWlsICkKLQl7Ci0JCUl0ZXJhdG9yIGkgPSBlbmFibGVkUnVsZXNfLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkKLQkJewotCQkJSUphdmFXZWJTZXJ2aWNlUnVsZSBydWxlID0gKElKYXZhV2ViU2VydmljZVJ1bGUpaS5uZXh0KCk7Ci0JCQlydWxlLnZpc2l0TWV0aG9kKGpkdE1ldGhvZCxwZWFudXRUcmFpbCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29sbGVjdHMgdGhlIHJlc3VsdHMgb2YgYWxsIHJ1bGVzIGluIHRoZSBzZXQgdG9nZXRoZXIuCi0JICogSWYgb25lIG9yIG1vcmUgd2FybmluZ3Mgb3IgZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJucwotCSAqIGEgc3RhdHVzIG9iamVjdCB3aG9zZSB0b3AgbGV2ZWwgbWVzc2FnZSBpcyB0aGUgcm9vdAotCSAqIG1lc3NhZ2UgcGFzc2VkIHRvIHRoaXMgbWVzc2FnZSwgb3RoZXJ3aXNlLCByZXR1cm5zIGEKLQkgKiBiYXNpYyAiT0siIHN0YXR1cy4KLQkgKiBAcGFyYW0gcm9vdE1lc3NhZ2UgVGhlIHdhcm5pbmcvZXJyb3IgbWVzc2FnZSB0byBhY3QgYXMKLQkgKiB0aGUgcm9vdCBtZXNzYWdlIGlmIG5lY2Vzc2FyeSAoaWUuIGlmIGF0IGxlYXN0IG9uZSBydWxlCi0JICogaW4gdGhlIHNldCByZXBvcnRlZCBhdCBsZWFzdCBvbmUgd2FybmluZy9lcnJvcikuCi0JICogQHJldHVybiBUaGUgY29sbGVjdGl2ZSBzdGF0dXMuCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0UmVzdWx0cyAoIFN0cmluZyByb290TWVzc2FnZSApCi0JewotCQlMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJdGVyYXRvciBlID0gZW5hYmxlZFJ1bGVzXy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpCi0JCXsKLQkJCUlKYXZhV2ViU2VydmljZVJ1bGUgcnVsZSA9IChJSmF2YVdlYlNlcnZpY2VSdWxlKWUubmV4dCgpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBydWxlLmdldFJlc3VsdHMoKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXsKLQkJCQlsaXN0LmFkZChzdGF0dXMpOwotCQkJfQotCQl9Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApCi0JCXsKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKCJvcmcuZWNsaXBzZS5qc3Qud3MiLDAscm9vdE1lc3NhZ2UsbnVsbCk7Ci0JCQlJdGVyYXRvciBsID0gbGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGwuaGFzTmV4dCgpKQotCQkJewotCQkJCUlTdGF0dXMgc3RhdHVzID0gKElTdGF0dXMpbC5uZXh0KCk7Ci0JCQkJbXVsdGlTdGF0dXMuYWRkQWxsKHN0YXR1cyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCJvcmcuZWNsaXBzZS5qc3Qud3MiLDAsIiIsbnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL3J1bGVzL0pBWFJQQ1J1bGUwMDAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL3J1bGVzL0pBWFJQQ1J1bGUwMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDEwNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9ydWxlcy9KQVhSUENSdWxlMDAwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5ydWxlczsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5XU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KRFRSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSmF2YVdlYlNlcnZpY2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBydWxlIGNoZWNrcyBpZiBhIHNlcnZpY2UgY2xhc3MKLSAqIGlzIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdGFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhSUENSdWxlMDAwMSBleHRlbmRzIEphdmFXZWJTZXJ2aWNlUnVsZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyBKQVhSUENSdWxlMDAwMSAoKQotCXsKLQkJaWRfID0gMTsKLQkJbmFtZXNwYWNlXyA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL29yZy5lY2xpcHNlLmpzdC53cy9qYXhycGMvMS4xIjsKLQkJbmFtZV8gPSBudWxsOwotCQlkZXNjcmlwdGlvbl8gPSBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGUjdmlzaXRDbGFzcyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSwgamF2YS51dGlsLlN0YWNrKQotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0Q2xhc3MgKCBJVHlwZSBqZHRDbGFzcywgU3RhY2sgcGVhbnV0VHJhaWwgKQotCXsKLQkJLy8gQW4gZW1wdHkgcGVhbnV0IHRyYWlsIGltcGxpZXMgdGhpcyBpcyB0aGUgcm9vdAotCQkvLyBjbGFzcyBvciBKQVgtUlBDIHNlcnZpY2UgY2xhc3MuCi0JCWlmIChwZWFudXRUcmFpbC5zaXplKCkgPT0gMCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSkRUUmVzb2x2ZXIgcmVzb2x2ZXIgPSBlbmdpbmVfLmdldEpEVFJlc29sdmVyKCk7Ci0JCQkJaWYgKCFyZXNvbHZlci5pc0NvbnN0cnVjdGFibGUoamR0Q2xhc3MpIHx8IHJlc29sdmVyLmlzSW50ZXJmYWNlKGpkdENsYXNzKSB8fCByZXNvbHZlci5pc0Fic3RyYWN0KGpkdENsYXNzKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoV1NQbHVnaW5NZXNzYWdlcy5NU0dfSkFYUlBDMTFfUlVMRV8wMDAxLGpkdENsYXNzLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQkJc3RhdHVzTGlzdF8uYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCJvcmcuZWNsaXBzZS5qc3Qud3MiLDAsbWVzc2FnZSxudWxsKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXN0YXR1c0xpc3RfLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIm9yZy5lY2xpcHNlLmpzdC53cyIsMCwiSW50ZXJuYWwgZXJyb3IiLGUpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvcnVsZXMvSkFYUlBDUnVsZTAwMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvcnVsZXMvSkFYUlBDUnVsZTAwMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0OWMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL3J1bGVzL0pBWFJQQ1J1bGUwMDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MTkgICAxMzI5MDUgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLnJ1bGVzOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLldTUGx1Z2luTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLkpEVFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIHJ1bGUgY2hlY2tzIGlmIGEgdmFsdWUgdHlwZSBjbGFzcwotICogaXMgcHVibGljIGRlZmF1bHQgY29uc3RydWN0YWJsZS4KLSAqLwotcHVibGljIGNsYXNzIEpBWFJQQ1J1bGUwMDAyIGV4dGVuZHMgSmF2YVdlYlNlcnZpY2VSdWxlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHJ1bGUuCi0JICovCi0JcHVibGljIEpBWFJQQ1J1bGUwMDAyICgpCi0JewotCQlpZF8gPSAyOwotCQluYW1lc3BhY2VfID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvb3JnLmVjbGlwc2UuanN0LndzL2pheHJwYy8xLjEiOwotCQluYW1lXyA9IG51bGw7Ci0JCWRlc2NyaXB0aW9uXyA9IG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLkphdmFXZWJTZXJ2aWNlUnVsZSN2aXNpdENsYXNzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlLCBqYXZhLnV0aWwuU3RhY2spCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRDbGFzcyAoIElUeXBlIGpkdENsYXNzLCBTdGFjayBwZWFudXRUcmFpbCApCi0JewotCQkvLyBBbiBlbXB0eSBwZWFudXQgdHJhaWwgaW1wbGllcyB0aGlzIGlzIHRoZSByb290IGNsYXNzCi0JCS8vIHJvb3QgY2xhc3Mgb3IgSkFYLVJQQyBzZXJ2aWNlIGNsYXNzLCB3aGVyZWFzIGEgbm9uLWVtcHR5Ci0JCS8vIHBlYW51dCB0cmFpbCBpbXBsaWVzIHRoaXMgaXMgYSBjbGFzcyBmcm9tIGEgbWV0aG9kLCBmaWVsZAotCQkvLyBvciBwcm9wZXJ0eSBzaWduYXR1cmUuIEluIHRoZSBmb3JtZXIgY2FzZSwgcmVtZW1iZXIgdGhlCi0JCS8vIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIGp1c3QgaW4gY2FzZSB3ZSBuZWVkIGl0IGZvciB0aGUKLQkJLy8gbGF0dGVyIGNhc2UuCi0JCWlmIChwZWFudXRUcmFpbC5zaXplKCkgPT0gMCkKLQkJewotCQkJc2VydmljZUNsYXNzTmFtZV8gPSBqZHRDbGFzcy5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUpEVFJlc29sdmVyIHJlc29sdmVyID0gZW5naW5lXy5nZXRKRFRSZXNvbHZlcigpOwotCQkJCVN0cmluZyBxbmFtZSA9IGpkdENsYXNzLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCWlmICghcmVzb2x2ZXIuaXNTdGFuZGFyZFR5cGUocW5hbWUpKQotCQkJCXsgCi0JCQkJCWlmICghcmVzb2x2ZXIuaXNDb25zdHJ1Y3RhYmxlKGpkdENsYXNzKSB8fCByZXNvbHZlci5pc0ludGVyZmFjZShqZHRDbGFzcykgfHwgcmVzb2x2ZXIuaXNBYnN0cmFjdChqZHRDbGFzcykpCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoV1NQbHVnaW5NZXNzYWdlcy5NU0dfSkFYUlBDMTFfUlVMRV8wMDAyLHFuYW1lLHNlcnZpY2VDbGFzc05hbWVfKTsKLQkJCQkJCXN0YXR1c0xpc3RfLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywib3JnLmVjbGlwc2UuanN0LndzIiwwLG1lc3NhZ2UsbnVsbCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXN0YXR1c0xpc3RfLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIm9yZy5lY2xpcHNlLmpzdC53cyIsMCwiSW50ZXJuYWwgZXJyb3IiLGUpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBzZXJ2aWNlQ2xhc3NOYW1lXzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvcnVsZXMvSkFYUlBDUnVsZTAwMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvcnVsZXMvSkFYUlBDUnVsZTAwMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NWJjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL3J1bGVzL0pBWFJQQ1J1bGUwMDAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5ydWxlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5XU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIHJ1bGUgdmVyaWZpZXMgdGhhdCBhIHNlcnZpY2UgY2xhc3MgaGFzIG5vIG92ZXJsb2FkZWQgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIEpBWFJQQ1J1bGUwMDAzIGV4dGVuZHMgSmF2YVdlYlNlcnZpY2VSdWxlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHJ1bGUuCi0JICovCi0JcHVibGljIEpBWFJQQ1J1bGUwMDAzICgpCi0JewotCQlpZF8gPSAzOwotCQluYW1lc3BhY2VfID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvb3JnLmVjbGlwc2UuanN0LndzL2pheHJwYy8xLjEiOwotCQluYW1lXyA9IG51bGw7Ci0JCWRlc2NyaXB0aW9uXyA9IG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGUjaW5pdChvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSUphdmFXZWJTZXJ2aWNlUnVsZUVuZ2luZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0ICggSUphdmFXZWJTZXJ2aWNlUnVsZUVuZ2luZSBlbmdpbmUgKQotCXsKLQkJc3VwZXIuaW5pdChlbmdpbmUpOwotCQltZXRob2ROYW1lc18gPSBuZXcgSGFzaE1hcCgpOwotCQlvdmVybG9hZGVkTWV0aG9kTmFtZXNfID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLkphdmFXZWJTZXJ2aWNlUnVsZSN2aXNpdENsYXNzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlLCBqYXZhLnV0aWwuU3RhY2spCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRDbGFzcyAoIElUeXBlIGpkdENsYXNzLCBTdGFjayBwZWFudXRUcmFpbCApCi0JewotCQkvLwotCQkvLyBBbiBlbXB0eSBwZWFudXQgdHJhaWwgaW1wbGllcyB0aGlzIGlzIHRoZSByb290Ci0JCS8vIGNsYXNzLCBha2EuIEpBWC1SUEMgc2VydmljZSBjbGFzcy4gUHV0IGFzaWRlCi0JCS8vIHRoZSBjbGFzcyBuYW1lIGluIGNhc2UgdmlzaXRNZXRob2QoKSBuZWVkcyBpdC4KLQkJLy8KLQkJaWYgKHBlYW51dFRyYWlsLnNpemUoKSA9PSAwKQotCQl7Ci0JCQlzZXJ2aWNlQ2xhc3NOYW1lXyA9IGpkdENsYXNzLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLkphdmFXZWJTZXJ2aWNlUnVsZSN2aXNpdE1ldGhvZChvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kLCBqYXZhLnV0aWwuU3RhY2spCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRNZXRob2QgKCBJTWV0aG9kIGpkdE1ldGhvZCwgU3RhY2sgcGVhbnV0VHJhaWwgKQotCXsKLQkJLy8KLQkJLy8gQSBwZWFudXQgdHJhaWwgb2YgbGVuZ3RoIG9uZSBpbXBsaWVzIHRoaXMgaXMgYSBtZXRob2QKLQkJLy8gYmVsb25naW5nIHRvIHRoZSByb290IGNsYXNzLCBha2EuIEpBWC1SUEMgc2VydmljZSBjbGFzcy4KLQkJLy8KLQkJaWYgKHBlYW51dFRyYWlsLnNpemUoKSA9PSAxKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQkvLwotCQkJCS8vIElmIHdlIGhhdmUgZW5jb3VudGVyZWQgdGhpcyBtZXRob2QgYWxyZWFkeSBidXQgaGF2ZW4ndAotCQkJCS8vIHJlcG9ydGVkIHRoZSBvdmVybG9hZCBjb25kaXRpb24sIHJlcG9ydCBpdC4KLQkJCQkvLwotCQkJCVN0cmluZyBtZXRob2ROYW1lID0gamR0TWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJU3RyaW5nIGZpcnN0UGFyYW1ldGVyU2lnbmF0dXJlID0gKFN0cmluZyltZXRob2ROYW1lc18uZ2V0KG1ldGhvZE5hbWUpOwotCQkJCVN0cmluZyB0aGlzUGFyYW1ldGVyU2lnbmF0dXJlID0gZmxhdHRlbmVkU2lnbmF0dXJlT2YoamR0TWV0aG9kKTsKLQkJCQlpZiAodGhpc1BhcmFtZXRlclNpZ25hdHVyZSAhPSBudWxsKQotCQkJCXsKLQkJCQkJaWYgKGZpcnN0UGFyYW1ldGVyU2lnbmF0dXJlICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCS8vCi0JCQkJCQkvLyBJZiB3ZSBoYXZlIGVuY291bnRlcmVkIHRoaXMgbWV0aG9kJ3MgbmFtZSBhbHJlYWR5LAotCQkJCQkJLy8gYnV0IGhhdmUgbm90IHlldCBkZXRlcm1pbmVkIGlmIGl0IGlzIG92ZXJsb2FkZWQsCi0JCQkJCQkvLyB0aGVuIGNvbXBhcmUgdGhpcyBtZXRob2QncyBwYXJhbWV0ZXIgc2lnbmF0dXJlIHdpdGgKLQkJCQkJCS8vIHRoYXQgb2YgdGhlICJmaXJzdCBzaWduYXR1cmUiIG9mIHRoZSBtZXRob2QgbmFtZS4KLQkJCQkJCS8vIFRoZSBtb21lbnQgd2UgZmluZCBhIHNlY29uZCBzaWduYXR1cmUgZm9yIGEgZ2l2ZW4KLQkJCQkJCS8vIG1ldGhvZCBuYW1lLCB3ZSBoYXZlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbi4KLQkJCQkJCS8vCi0JCQkJCQlpZiAoIW92ZXJsb2FkZWRNZXRob2ROYW1lc18uY29udGFpbnMobWV0aG9kTmFtZSkgJiYgIXRoaXNQYXJhbWV0ZXJTaWduYXR1cmUuZXF1YWxzKGZpcnN0UGFyYW1ldGVyU2lnbmF0dXJlKSkKLQkJCQkJCXsKLQkJCQkJCQlvdmVybG9hZGVkTWV0aG9kTmFtZXNfLmFkZChtZXRob2ROYW1lKTsKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFdTUGx1Z2luTWVzc2FnZXMuTVNHX0pBWFJQQzExX1JVTEVfMDAwMyxtZXRob2ROYW1lLHNlcnZpY2VDbGFzc05hbWVfKTsKLQkJCQkJCQlzdGF0dXNMaXN0Xy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIm9yZy5lY2xpcHNlLmpzdC53cyIsMCxtZXNzYWdlLG51bGwpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCS8vCi0JCQkJCQkvLyBJZiB3ZSBoYXZlIHJlY29yZGVkIG5vIHNpZ25hdHVyZSBmb3IgdGhlIGdpdmVuIG1ldGhvZAotCQkJCQkJLy8gbmFtZSAoaWUuIHdlIGhhdmUgbm90IGVuY291bnRlcmVkIHRoZSBtZXRob2QgbmFtZSB5ZXQpLAotCQkJCQkJLy8gdGhlbiByZWNvcmQgdGhpcyBvbmUuIEFueSAiZmlyc3Qgc2lnbmF0dXJlIiB3aWxsIGRvLgotCQkJCQkJLy8KLQkJCQkJCW1ldGhvZE5hbWVzXy5wdXQobWV0aG9kTmFtZSx0aGlzUGFyYW1ldGVyU2lnbmF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkvLyBEbyBub3RoaW5nLgotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogR3JhYnMgdGhlIHR5cGVzIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBnaXZlbiBtZXRob2QKLQkgKiBhbmQgZmxhdHRlbnMgdGhlbiBpbnRvIGEgc2luZ2xlIHN0cmluZyBzdWZmaWNpZW50IHRvCi0JICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBvdmVybG9hZGVkIHZzLiBvdmVycmlkZGVuIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZmxhdHRlbmVkU2lnbmF0dXJlT2YgKCBJTWV0aG9kIGpkdE1ldGhvZCApCi0JdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nW10gc2lnbmF0dXJlcyA9IGVuZ2luZV8uZ2V0SkRUUmVzb2x2ZXIoKS5nZXRQYXJhbWV0ZXJUeXBlTmFtZXMoamR0TWV0aG9kKTsKLQkJU3RyaW5nQnVmZmVyIGZsYXR0ZW5lZFNpZ25hdHVyZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgcz0wOyBzPHNpZ25hdHVyZXMubGVuZ3RoOyBzKyspCi0JCXsKLQkJCWZsYXR0ZW5lZFNpZ25hdHVyZS5hcHBlbmQoc2lnbmF0dXJlc1tzXSkuYXBwZW5kKCIsIik7Ci0JCX0KLQkJcmV0dXJuIGZsYXR0ZW5lZFNpZ25hdHVyZS50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIE1hcCBtZXRob2ROYW1lc187Ci0JcHJpdmF0ZSBTZXQgb3ZlcmxvYWRlZE1ldGhvZE5hbWVzXzsKLQlwcml2YXRlIFN0cmluZyBzZXJ2aWNlQ2xhc3NOYW1lXzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvcnVsZXMvSkFYUlBDUnVsZTAwMDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvcnVsZXMvSkFYUlBDUnVsZTAwMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2Y2Y3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL3J1bGVzL0pBWFJQQ1J1bGUwMDA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5ydWxlczsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLldTUGx1Z2luTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhV2ViU2VydmljZVJ1bGVFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLkpEVFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIHJ1bGUgdmVyaWZpZXMgdGhhdCB0aGUgbWV0aG9kcyBvZiBhIHNlcnZpY2UgY2xhc3MKLSAqIHVzZXMgb25seSBKQVgtUlBDIHN1cHBvcnRlZCB0eXBlcy4KLSAqLwotcHVibGljIGNsYXNzIEpBWFJQQ1J1bGUwMDA1IGV4dGVuZHMgSmF2YVdlYlNlcnZpY2VSdWxlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHJ1bGUuCi0JICovCi0JcHVibGljIEpBWFJQQ1J1bGUwMDA1ICgpCi0JewotCQlpZF8gPSA1OwotCQluYW1lc3BhY2VfID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvb3JnLmVjbGlwc2UuanN0LndzL2pheHJwYy8xLjEiOwotCQluYW1lXyA9IG51bGw7Ci0JCWRlc2NyaXB0aW9uXyA9IG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGUjaW5pdChvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSUphdmFXZWJTZXJ2aWNlUnVsZUVuZ2luZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0ICggSUphdmFXZWJTZXJ2aWNlUnVsZUVuZ2luZSBlbmdpbmUgKQotCXsKLQkJc3VwZXIuaW5pdChlbmdpbmUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSmF2YVdlYlNlcnZpY2VSdWxlI3Zpc2l0Q2xhc3Mob3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUsIGphdmEudXRpbC5TdGFjaykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdENsYXNzICggSVR5cGUgamR0Q2xhc3MsIFN0YWNrIHBlYW51dFRyYWlsICkKLQl7Ci0JCS8vCi0JCS8vIEFuIGVtcHR5IHBlYW51dCB0cmFpbCBpbXBsaWVzIHRoaXMgaXMgdGhlIHJvb3QKLQkJLy8gY2xhc3MsIGFrYS4gSkFYLVJQQyBzZXJ2aWNlIGNsYXNzLiBQdXQgYXNpZGUKLQkJLy8gdGhlIGNsYXNzIG5hbWUgaW4gY2FzZSB2aXNpdE1ldGhvZCgpIG5lZWRzIGl0LgotCQkvLwotCQlpZiAocGVhbnV0VHJhaWwuc2l6ZSgpID09IDApCi0JCXsKLQkJCXNlcnZpY2VDbGFzc05hbWVfID0gamR0Q2xhc3MuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSmF2YVdlYlNlcnZpY2VSdWxlI3Zpc2l0TWV0aG9kKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QsIGphdmEudXRpbC5TdGFjaykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZCAoIElNZXRob2QgamR0TWV0aG9kLCBTdGFjayBwZWFudXRUcmFpbCApCi0JewotCQkvLwotCQkvLyBBIHBlYW51dCB0cmFpbCBvZiBsZW5ndGggb25lIGltcGxpZXMgdGhpcyBpcyBhIG1ldGhvZAotCQkvLyBiZWxvbmdpbmcgdG8gdGhlIHJvb3QgY2xhc3MsIGFrYS4gSkFYLVJQQyBzZXJ2aWNlIGNsYXNzLgotCQkvLwotCQlpZiAocGVhbnV0VHJhaWwuc2l6ZSgpID09IDEpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCVN0cmluZyBtZXRob2ROYW1lID0gamR0TWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJLy8KLQkJCQkvLyBDaGVjayB0aGUgbWV0aG9kIHJldHVybiB0eXBlIGZvciBjb21wbGlhbmNlLgotCQkJCS8vIEFueSBKYXZhIHByaW1pdGl2ZSBvciBzdGFuZGFyZCAoImphdmEuIiBvciAiamF2YXguIikgdHlwZQotCQkJCS8vIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSBKQVgtUlBDIHdpbGwgZ2V0IGZsYWdnZWQuCi0JCQkJLy8gQW55IG5vbi1wcmltaXRpdmUgb3Igbm9uLXN0YW5kYXJkIHR5cGUgaXMgcHJlc3VtZWQgdG8gYmUgYQotCQkJCS8vIHBvdGVudGlhbCB2YWx1ZSB0eXBlIGFuZCBpcyBieXBhc3NlZCBzaW5jZSB0aGUgcnVsZSBlbmdpbmUKLQkJCQkvLyB3aWxsIG5hdmlnYXRlIGludG8gdGhlIHBvdGVudGlhbCB2YWx1ZSB0eXBlJ3MgY2xhc3MuCi0JCQkJLy8KLQkJCQlKRFRSZXNvbHZlciByZXNvbHZlciA9IGVuZ2luZV8uZ2V0SkRUUmVzb2x2ZXIoKTsKLQkJCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSByZXNvbHZlci5nZXRSZXR1cm5UeXBlTmFtZShqZHRNZXRob2QpOwotCQkJCWlmICgocmVzb2x2ZXIuaXNQcmltaXRpdmVUeXBlKHJldHVyblR5cGVOYW1lKSB8fCByZXNvbHZlci5pc1N0YW5kYXJkVHlwZShyZXR1cm5UeXBlTmFtZSkpICYmICFyZXNvbHZlci5pc0pBWFJQQ1N0YW5kYXJkVHlwZShyZXR1cm5UeXBlTmFtZSkpCi0JCQkJewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFdTUGx1Z2luTWVzc2FnZXMuTVNHX0pBWFJQQzExX1JVTEVfMDAwNSxuZXcgU3RyaW5nW10ge21ldGhvZE5hbWUsc2VydmljZUNsYXNzTmFtZV8scmV0dXJuVHlwZU5hbWV9KTsKLQkJCQkJc3RhdHVzTGlzdF8uYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCJvcmcuZWNsaXBzZS5qc3Qud3MiLDAsbWVzc2FnZSxudWxsKSk7Ci0JCQkJfQotCQkJCS8vCi0JCQkJLy8gQ2hlY2sgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMgZm9yIGNvbXBsaWFuY2UuCi0JCQkJLy8gU2FtZSBjb21tZW50IGFzIGFib3ZlLCBvbmx5IGFwcGxpZWQgdG8gdGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMuCi0JCQkJLy8KLQkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSByZXNvbHZlci5nZXRQYXJhbWV0ZXJUeXBlTmFtZXMoamR0TWV0aG9kKTsKLQkJCQlmb3IgKGludCBwPTA7IHA8cGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aDsgcCsrKQotCQkJCXsKLQkJCQkJaWYgKChyZXNvbHZlci5pc1ByaW1pdGl2ZVR5cGUocGFyYW1ldGVyVHlwZU5hbWVzW3BdKSB8fCByZXNvbHZlci5pc1N0YW5kYXJkVHlwZShwYXJhbWV0ZXJUeXBlTmFtZXNbcF0pKSAmJiAhcmVzb2x2ZXIuaXNKQVhSUENTdGFuZGFyZFR5cGUocGFyYW1ldGVyVHlwZU5hbWVzW3BdKSkKLQkJCQkJewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChXU1BsdWdpbk1lc3NhZ2VzLk1TR19KQVhSUEMxMV9SVUxFXzAwMDUsbmV3IFN0cmluZ1tdIHttZXRob2ROYW1lLHNlcnZpY2VDbGFzc05hbWVfLHBhcmFtZXRlclR5cGVOYW1lc1twXX0pOwotCQkJCQkJc3RhdHVzTGlzdF8uYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCJvcmcuZWNsaXBzZS5qc3Qud3MiLDAsbWVzc2FnZSxudWxsKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJLy8gRG8gbm90aGluZy4KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBzZXJ2aWNlQ2xhc3NOYW1lXzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvcnVsZXMvSkFYUlBDUnVsZTAwMDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uZm9ybWFuY2UvcnVsZXMvSkFYUlBDUnVsZTAwMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3YWZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL3J1bGVzL0pBWFJQQ1J1bGUwMDA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5ydWxlczsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuV1NQbHVnaW5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSUphdmFCZWFuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLklKYXZhV2ViU2VydmljZVJ1bGVFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLkpEVFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIHJ1bGUgdmVyaWZpZXMgdGhhdCB0aGUgZmllbGRzIGFuZCBwcm9wZXJ0aWVzIG9mIGEKLSAqIHZhbHVlIHR5cGUgY2xhc3MgdXNlcyBvbmx5IEpBWC1SUEMgc3VwcG9ydGVkIHR5cGVzLgotICovCi1wdWJsaWMgY2xhc3MgSkFYUlBDUnVsZTAwMDYgZXh0ZW5kcyBKYXZhV2ViU2VydmljZVJ1bGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgSkFYUlBDUnVsZTAwMDYgKCkKLQl7Ci0JCWlkXyA9IDY7Ci0JCW5hbWVzcGFjZV8gPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9vcmcuZWNsaXBzZS5qc3Qud3MvamF4cnBjLzEuMSI7Ci0JCW5hbWVfID0gbnVsbDsKLQkJZGVzY3JpcHRpb25fID0gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbmZvcm1hbmNlLkphdmFXZWJTZXJ2aWNlUnVsZSNpbml0KG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5JSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQgKCBJSmF2YVdlYlNlcnZpY2VSdWxlRW5naW5lIGVuZ2luZSApCi0JewotCQlzdXBlci5pbml0KGVuZ2luZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGUjdmlzaXRDbGFzcyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSwgamF2YS51dGlsLlN0YWNrKQotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0Q2xhc3MgKCBJVHlwZSBqZHRDbGFzcywgU3RhY2sgcGVhbnV0VHJhaWwgKQotCXsKLQkJLy8KLQkJLy8gQW4gZW1wdHkgcGVhbnV0IHRyYWlsIGltcGxpZXMgdGhpcyBpcyB0aGUgcm9vdAotCQkvLyBjbGFzcywgYWthLiBKQVgtUlBDIHNlcnZpY2UgY2xhc3MuIFB1dCBhc2lkZQotCQkvLyB0aGUgY2xhc3MgbmFtZSBpbiBjYXNlIHZpc2l0TWV0aG9kKCkgbmVlZHMgaXQuCi0JCS8vCi0JCWlmIChwZWFudXRUcmFpbC5zaXplKCkgPT0gMCkKLQkJewotCQkJc2VydmljZUNsYXNzTmFtZV8gPSBqZHRDbGFzcy5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGUjdmlzaXRNZXRob2Qob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCwgamF2YS51dGlsLlN0YWNrKQotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0RmllbGQgKCBJRmllbGQgamR0RmllbGQsIFN0YWNrIHBlYW51dFRyYWlsICkKLQl7Ci0JCS8vCi0JCS8vIEEgcGVhbnV0IHRyYWlsIG9mIGxlbmd0aCBncmVhdGVyIHRoYW4gb25lIGltcGxpZXMgdGhpcyBpcyBhCi0JCS8vIGZpZWxkIGJlbG9uZ2luZyB0byBhIGNsYXNzIG90aGVyIHRoYW4gdGhlIHJvb3QgKGFrYS4gSkFYLVJQQwotCQkvLyBzZXJ2aWNlKSBjbGFzcywgbmFtZWx5IGEgcHJlc3VtZWQgdmFsdWUgdHlwZSBjbGFzcy4KLQkJLy8KLQkJaWYgKHBlYW51dFRyYWlsLnNpemUoKSA+IDEpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCS8vCi0JCQkJLy8gQW55IEphdmEgcHJpbWl0aXZlIG9yIHN0YW5kYXJkICgiamF2YS4iIG9yICJqYXZheC4iKSB0eXBlCi0JCQkJLy8gdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEpBWC1SUEMgd2lsbCBnZXQgZmxhZ2dlZC4KLQkJCQkvLyBBbnkgbm9uLXByaW1pdGl2ZSBvciBub24tc3RhbmRhcmQgdHlwZSBpcyBwcmVzdW1lZCB0byBiZSBhCi0JCQkJLy8gcG90ZW50aWFsIHZhbHVlIHR5cGUgYW5kIGlzIGJ5cGFzc2VkIHNpbmNlIHRoZSBydWxlIGVuZ2luZQotCQkJCS8vIHdpbGwgbmF2aWdhdGUgaW50byB0aGUgcG90ZW50aWFsIHZhbHVlIHR5cGUncyBjbGFzcy4KLQkJCQkvLwotCQkJCUpEVFJlc29sdmVyIHJlc29sdmVyID0gZW5naW5lXy5nZXRKRFRSZXNvbHZlcigpOwotCQkJCVN0cmluZyBmaWVsZFR5cGVOYW1lID0gcmVzb2x2ZXIuZ2V0RmllbGRUeXBlTmFtZShqZHRGaWVsZCk7Ci0JCQkJaWYgKChyZXNvbHZlci5pc1ByaW1pdGl2ZVR5cGUoZmllbGRUeXBlTmFtZSkgfHwgcmVzb2x2ZXIuaXNTdGFuZGFyZFR5cGUoZmllbGRUeXBlTmFtZSkpICYmICFyZXNvbHZlci5pc0pBWFJQQ1N0YW5kYXJkVHlwZShmaWVsZFR5cGVOYW1lKSkKLQkJCQl7Ci0JCQkJCS8vCi0JCQkJCS8vIFRoZSBmaWVsZCBwcmV0dHkgbXVjaCBNVVNUIGJlIGRlY2xhcmVkIGluIGEgdHlwZSBvcgotCQkJCQkvLyB3ZSB3b3VsZCBub3QgaGF2ZSBnb3R0ZW4gaGVyZS4gU3RpbGwsIGJlc3QgdG8gYmUgc2FmZS4KLQkJCQkJLy8KLQkJCQkJSVR5cGUgdmFsdWVUeXBlID0gamR0RmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQkJCQlpZiAodmFsdWVUeXBlICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCVN0cmluZyB2YWx1ZVR5cGVDbGFzc05hbWUgPSB2YWx1ZVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJCQlTdHJpbmcgZmllbGROYW1lID0gamR0RmllbGQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoV1NQbHVnaW5NZXNzYWdlcy5NU0dfSkFYUlBDMTFfUlVMRV8wMDA2LG5ldyBTdHJpbmdbXSB7ZmllbGROYW1lLHZhbHVlVHlwZUNsYXNzTmFtZSxzZXJ2aWNlQ2xhc3NOYW1lXyxmaWVsZFR5cGVOYW1lfSk7Ci0JCQkJCQlzdGF0dXNMaXN0Xy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIm9yZy5lY2xpcHNlLmpzdC53cyIsMCxtZXNzYWdlLG51bGwpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkvLyBEbyBub3RoaW5nLgotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGUjdmlzaXRQcm9wZXJ0eShvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uZm9ybWFuY2UuSUphdmFCZWFuUHJvcGVydHksIGphdmEudXRpbC5TdGFjaykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdFByb3BlcnR5ICggSUphdmFCZWFuUHJvcGVydHkgcHJvcGVydHksIFN0YWNrIHBlYW51dFRyYWlsICkKLQl7Ci0JCS8vCi0JCS8vIEEgcGVhbnV0IHRyYWlsIG9mIGxlbmd0aCBncmVhdGVyIHRoYW4gb25lIGltcGxpZXMgdGhpcyBpcyBhCi0JCS8vIHByb3BlcnR5IGJlbG9uZ2luZyB0byBhIGNsYXNzIG90aGVyIHRoYW4gdGhlIHJvb3QgKGFrYS4gSkFYLVJQQwotCQkvLyBzZXJ2aWNlKSBjbGFzcywgbmFtZWx5IGEgcHJlc3VtZWQgdmFsdWUgdHlwZSBjbGFzcy4KLQkJLy8KLQkJaWYgKHBlYW51dFRyYWlsLnNpemUoKSA+IDEpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCS8vCi0JCQkJLy8gQW55IEphdmEgcHJpbWl0aXZlIG9yIHN0YW5kYXJkICgiamF2YS4iIG9yICJqYXZheC4iKSB0eXBlCi0JCQkJLy8gdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEpBWC1SUEMgd2lsbCBnZXQgZmxhZ2dlZC4KLQkJCQkvLyBBbnkgbm9uLXByaW1pdGl2ZSBvciBub24tc3RhbmRhcmQgdHlwZSBpcyBwcmVzdW1lZCB0byBiZSBhCi0JCQkJLy8gcG90ZW50aWFsIHZhbHVlIHR5cGUgYW5kIGlzIGJ5cGFzc2VkIHNpbmNlIHRoZSBydWxlIGVuZ2luZQotCQkJCS8vIHdpbGwgbmF2aWdhdGUgaW50byB0aGUgcG90ZW50aWFsIHZhbHVlIHR5cGUncyBjbGFzcy4KLQkJCQkvLwotCQkJCUpEVFJlc29sdmVyIHJlc29sdmVyID0gZW5naW5lXy5nZXRKRFRSZXNvbHZlcigpOwotCQkJCVN0cmluZyBwcm9wZXJ0eVR5cGVOYW1lID0gcmVzb2x2ZXIuZ2V0UHJvcGVydHlUeXBlTmFtZShwcm9wZXJ0eSk7Ci0JCQkJaWYgKChyZXNvbHZlci5pc1ByaW1pdGl2ZVR5cGUocHJvcGVydHlUeXBlTmFtZSkgfHwgcmVzb2x2ZXIuaXNTdGFuZGFyZFR5cGUocHJvcGVydHlUeXBlTmFtZSkpICYmICFyZXNvbHZlci5pc0pBWFJQQ1N0YW5kYXJkVHlwZShwcm9wZXJ0eVR5cGVOYW1lKSkKLQkJCQl7Ci0JCQkJCS8vCi0JCQkJCS8vIFRoZSBmaWVsZCBwcmV0dHkgbXVjaCBNVVNUIGJlIGRlY2xhcmVkIGluIGEgdHlwZSBvcgotCQkJCQkvLyB3ZSB3b3VsZCBub3QgaGF2ZSBnb3R0ZW4gaGVyZS4gU3RpbGwsIGJlc3QgdG8gYmUgc2FmZS4KLQkJCQkJLy8KLQkJCQkJSVR5cGUgdmFsdWVUeXBlID0gcHJvcGVydHkuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQkJCQlpZiAodmFsdWVUeXBlICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCVN0cmluZyB2YWx1ZVR5cGVDbGFzc05hbWUgPSB2YWx1ZVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpOwotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChXU1BsdWdpbk1lc3NhZ2VzLk1TR19KQVhSUEMxMV9SVUxFXzAwMDYsbmV3IFN0cmluZ1tdIHtwcm9wZXJ0eU5hbWUsdmFsdWVUeXBlQ2xhc3NOYW1lLHNlcnZpY2VDbGFzc05hbWVfLHByb3BlcnR5VHlwZU5hbWV9KTsKLQkJCQkJCXN0YXR1c0xpc3RfLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywib3JnLmVjbGlwc2UuanN0LndzIiwwLG1lc3NhZ2UsbnVsbCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCS8vIERvIG5vdGhpbmcuCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc2VydmljZUNsYXNzTmFtZV87Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL3J1bGVzL0pBWFJQQ1J1bGVTZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbmZvcm1hbmNlL3J1bGVzL0pBWFJQQ1J1bGVTZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWM3YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25mb3JtYW5jZS9ydWxlcy9KQVhSUENSdWxlU2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDE5ICAgMTMyOTA1IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5ICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5ydWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25mb3JtYW5jZS5KYXZhV2ViU2VydmljZVJ1bGVTZXQ7Ci0KLS8qKgotICogQSBmYWN0b3J5IHRoYXQgcHJvZHVjZXMgYSBKYXZhV2ViU2VydmljZVJ1bGVTZXQKLSAqIGZvciB0aGUgSkFYLVJQQyAxLjEgc3BlY2lmaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEpBWFJQQ1J1bGVTZXRGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBKQVhSUENSdWxlU2V0RmFjdG9yeSAoKQotCXsKLQkJLy8gTm90IHB1YmxpY2x5IGNvbnN0cnVjdGFibGUuCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzZXQgb2YgcnVsZXMgZm9yIGFuYWx5emluZyBKYXZhIGNsYXNzZXMKLQkgKiBmb3IgY29tcGxpYW5jZSB0byB0aGUgcnVsZXMgb2YgSkFYLVJQQyAxLjEuICAKLQkgKiBAcmV0dXJuIEEgc2V0IG9mIEpBWC1SUEMgMS4xIGFuYWx5c2lzIHJ1bGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVdlYlNlcnZpY2VSdWxlU2V0IG5ld1J1bGVTZXQgKCkKLQl7Ci0JCUphdmFXZWJTZXJ2aWNlUnVsZVNldCBzZXQgPSBuZXcgSmF2YVdlYlNlcnZpY2VSdWxlU2V0KCk7Ci0JCXNldC5hZGRSdWxlKG5ldyBKQVhSUENSdWxlMDAwMSgpKTsKLQkJc2V0LmFkZFJ1bGUobmV3IEpBWFJQQ1J1bGUwMDAyKCkpOwotCQlzZXQuYWRkUnVsZShuZXcgSkFYUlBDUnVsZTAwMDMoKSk7Ci0JCXNldC5hZGRSdWxlKG5ldyBKQVhSUENSdWxlMDAwNSgpKTsKLQkJc2V0LmFkZFJ1bGUobmV3IEpBWFJQQ1J1bGUwMDA2KCkpOwotCQlyZXR1cm4gc2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudFNjZW5hcmlvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmRlZmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjE2ICAgMTI3MTM4IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBTY2VuYXJpb0NvbnRleHQKLXsKLSAgcHVibGljIFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQoKQotICB7Ci0gICAgc3VwZXIoV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2FkKCkKLSAgewotICAgIFNjZW5hcmlvRGVmYXVsdHMgZGVmYXVsdHMgPSBuZXcgU2NlbmFyaW9EZWZhdWx0cygpOwotICAgIFN0cmluZ1tdIGlkcyA9IGRlZmF1bHRzLmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkgc2IuYXBwZW5kKCIsIik7Ci0gICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgICB9Ci0gICAgU3RyaW5nIG5vbkphdmFUZXN0U2VydmljZSA9IGRlZmF1bHRzLmdldE5vbkphdmFUZXN0U2VydmljZURlZmF1bHQoKTsKLSAgICBzZXREZWZhdWx0U3RyaW5nSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RFU1RfVFlQRVMsIHNiLnRvU3RyaW5nKCkpOwotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX05PTl9KQVZBX1RFU1RfU0VSVklDRSwgbm9uSmF2YVRlc3RTZXJ2aWNlKTsKLSAgICAKLSAgICBzZXREZWZhdWx0U3RyaW5nSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFLCBkZWZhdWx0cy53ZWJzZXJ2aWNlQ2xpZW50VHlwZURlZmF1bHQoKSApOwotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVFlQRSwgZGVmYXVsdHMud2Vic2VydmljZVR5cGVJZERlZmF1bHQoKSApOwotICAgIHNldERlZmF1bHRCb29sZWFuSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9HRU5FUkFURV9QUk9YWSwgZGVmYXVsdHMuZ2VuZXJhdGVQcm94eURlZmF1bHQoKSApOwotICAgIHNldERlZmF1bHRCb29sZWFuSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9MQVVOQ0hfV0VCU0VSVklDRV9FWFBMT1JFUiwgZGVmYXVsdHMubGF1bmNoV2Vic2VydmljZUV4cGxvcmVyRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX0lOU1RBTExfV0VCU0VSVklDRSwgZGVmYXVsdHMuaW5zdGFsbFdlYnNlcnZpY2VEZWZhdWx0KCkgKTsKLSAgICBzZXREZWZhdWx0Qm9vbGVhbklmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfSU5TVEFMTF9DTElFTlQsIGRlZmF1bHRzLmluc3RhbGxDbGllbnREZWZhdWx0KCkgKTsKLSAgICBzZXREZWZhdWx0Qm9vbGVhbklmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfU1RBUlRfV0VCU0VSVklDRSwgZGVmYXVsdHMuc3RhcnRXZWJzZXJ2aWNlRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX1RFU1RfV0VCU0VSVklDRSwgZGVmYXVsdHMudGVzdFdlYnNlcnZpY2VEZWZhdWx0KCkgKTsKLSAgICBzZXREZWZhdWx0Qm9vbGVhbklmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFLCBkZWZhdWx0cy5nZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKSk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX0xBVU5DSF9TQU1QTEUsIGRlZmF1bHRzLmxhdW5jaFNhbXBsZSgpICk7Ci0gICAgCi0gICAgc2V0RGVmYXVsdEludElmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCU0VSVklDRSwgZGVmYXVsdHMuc2VydmljZUdlbmVyYXRpb25EZWZhdWx0KCkpOyAvL2p2aAotICAgIHNldERlZmF1bHRJbnRJZk5vRGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX0NMSUVOVCwgZGVmYXVsdHMuY2xpZW50R2VuZXJhdGlvbkRlZmF1bHQoKSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKCkKLSAgewotICAgIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgcmVnaXN0cnkgPSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nW10gdGVzdFR5cGVzID0gZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICAgIFZlY3RvciBuZXdUZXN0Q2FzZXMgPSBuZXcgVmVjdG9yKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NlID0gKFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKSByZWdpc3RyeQotICAgICAgICAgIC5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSh0ZXN0VHlwZXNbaV0pOwotICAgICAgaWYgKHdzZS50ZXN0V1NETCgpKSAKLQkJICBuZXdUZXN0Q2FzZXMuYWRkRWxlbWVudCh0ZXN0VHlwZXNbaV0pOwotICAgIH0KLQlTdHJpbmdbXSB3c2RsVGVzdEFycmF5ID0gbmV3IFN0cmluZ1tuZXdUZXN0Q2FzZXMuc2l6ZSgpXTsKLQlFbnVtZXJhdGlvbiBlID0gbmV3VGVzdENhc2VzLmVsZW1lbnRzKCk7Ci0JaW50IGkgPSAwOwotCXdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpewotCSAgd3NkbFRlc3RBcnJheVtpXSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotCSAgaSsrOwotCX0KLQkKLQlyZXR1cm4gd3NkbFRlc3RBcnJheTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVRlc3RUeXBlcyhTdHJpbmdbXSBpZHMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkgc2IuYXBwZW5kKCIsIik7Ci0gICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgICB9Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RFU1RfVFlQRVMsIHNiLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVEVTVF9UWVBFUyksICIsIik7Ci0gICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKQotICAgICAgc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgcHVibGljIFNjZW5hcmlvQ29udGV4dCBjb3B5KCkKLSAgewotICAgIFRyYW5zaWVudFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFNjZW5hcmlvQ29udGV4dCgpOwotICAgIGNvbnRleHQuc2V0V2ViU2VydmljZVRlc3RUeXBlcyhnZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCkpOwotICAgIGNvbnRleHQuc2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKGdldE5vbkphdmFUZXN0U2VydmljZSgpKTsKLSAgICAKLSAgICBjb250ZXh0LnNldENsaWVudFdlYlNlcnZpY2VUeXBlKCBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpICk7Ci0gICAgY29udGV4dC5zZXRXZWJTZXJ2aWNlVHlwZSggZ2V0V2ViU2VydmljZVR5cGUoKSApOwotICAgIGNvbnRleHQuc2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoKSApOwotICAgIGNvbnRleHQuc2V0U3RhcnRXZWJTZXJ2aWNlKCBnZXRTdGFydFdlYlNlcnZpY2UoKSApOwotICAgIGNvbnRleHQuc2V0R2VuZXJhdGVQcm94eSggZ2V0R2VuZXJhdGVQcm94eSgpICk7Ci0gICAgY29udGV4dC5zZXRUZXN0V2ViU2VydmljZSggZ2V0VGVzdFdlYlNlcnZpY2UoKSApOwotICAgIGNvbnRleHQuc2V0TW9uaXRvcldlYlNlcnZpY2UoZ2V0TW9uaXRvcldlYlNlcnZpY2UoKSk7Ci0gICAgY29udGV4dC5zZXRMYXVuY2hTYW1wbGVFbmFibGVkKCBpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKSApOwotICAgIAotICAgIHJldHVybiBjb250ZXh0OwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldENsaWVudFdlYlNlcnZpY2VUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRHZW5lcmF0ZVByb3h5KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfR0VORVJBVEVfUFJPWFkpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5RGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9QUk9YWSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9MQVVOQ0hfV0VCU0VSVklDRV9FWFBMT1JFUik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlckRlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKFBSRUZFUkVOQ0VfTEFVTkNIX1dFQlNFUlZJQ0VfRVhQTE9SRVIpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldFN0YXJ0V2ViU2VydmljZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGFydFdlYlNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfU1RBUlRfV0VCU0VSVklDRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKFBSRUZFUkVOQ0VfU1RBUlRfV0VCU0VSVklDRSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0SW5zdGFsbFdlYlNlcnZpY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbFdlYlNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSU5TVEFMTF9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbFdlYlNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0Qm9vbGVhbihQUkVGRVJFTkNFX0lOU1RBTExfV0VCU0VSVklDRSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0SW5zdGFsbFdlYlNlcnZpY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbENsaWVudCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9JTlNUQUxMX0NMSUVOVCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEluc3RhbGxDbGllbnREZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0Qm9vbGVhbihQUkVGRVJFTkNFX0lOU1RBTExfQ0xJRU5UKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRUZXN0V2ViU2VydmljZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKFBSRUZFUkVOQ0VfVEVTVF9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRXZWJTZXJ2aWNlVHlwZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RZUEUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldENsaWVudFdlYlNlcnZpY2VUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRXZWJTZXJ2aWNlVHlwZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFLCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0R2VuZXJhdGVQcm94eShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfR0VORVJBVEVfUFJPWFksIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfTEFVTkNIX1dFQlNFUlZJQ0VfRVhQTE9SRVIsIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRJbnN0YWxsV2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5zdGFsbFdlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKCBQUkVGRVJFTkNFX0lOU1RBTExfV0VCU0VSVklDRSwgdmFsdWUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldEluc3RhbGxXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnN0YWxsQ2xpZW50KGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9JTlNUQUxMX0NMSUVOVCwgdmFsdWUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFN0YXJ0V2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFLCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0VGVzdFdlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UsIHZhbHVlKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFdlYlNlcnZpY2VUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVHlwZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RZUEUsIHZhbHVlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TW9uaXRvcldlYlNlcnZpY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0Qm9vbGVhbihQUkVGRVJFTkNFX01PTklUT1JfV0VCU0VSVklDRSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldE1vbml0b3JXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yV2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9NT05JVE9SX1dFQlNFUlZJQ0UsIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRMYXVuY2hTYW1wbGVFbmFibGVkRGVmYXVsdCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hTYW1wbGVFbmFibGVkRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0xBVU5DSF9TQU1QTEUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldExhdW5jaFNhbXBsZUVuYWJsZWQoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFNhbXBsZUVuYWJsZWQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKCBQUkVGRVJFTkNFX0xBVU5DSF9TQU1QTEUsIHZhbHVlKTsKLSAgfQotICAKLSAgLy9qdmgKLSAgcHVibGljIGludCBnZXRHZW5lcmF0ZVdlYlNlcnZpY2UoKQotICB7Ci0JICByZXR1cm4gZ2V0VmFsdWVBc0ludChQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQlNFUlZJQ0UpOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldEdlbmVyYXRlV2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0JICByZXR1cm4gZ2V0RGVmYXVsdEludChQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQlNFUlZJQ0UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdlYlNlcnZpY2UoaW50IHZhbHVlKQotICB7Ci0JICBzZXRWYWx1ZShQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQlNFUlZJQ0UsIHZhbHVlKTsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRHZW5lcmF0ZUNsaWVudERlZmF1bHQoKQotICB7Ci0JICByZXR1cm4gZ2V0RGVmYXVsdEludChQUkVGRVJFTkNFX0dFTkVSQVRFX0NMSUVOVCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0R2VuZXJhdGVDbGllbnQoKQotICB7Ci0JICByZXR1cm4gZ2V0VmFsdWVBc0ludChQUkVGRVJFTkNFX0dFTkVSQVRFX0NMSUVOVCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGludCB2YWx1ZSkKLSAgewotCSAgc2V0VmFsdWUoUFJFRkVSRU5DRV9HRU5FUkFURV9DTElFTlQsIHZhbHVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRVRERJUHJlZmVyZW5jZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODg4MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRVRERJUHJlZmVyZW5jZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRVRERJUHJlZmVyZW5jZUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIFVERElQcmVmZXJlbmNlQ29udGV4dAotewotICBwdWJsaWMgUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dCgpCi0gIHsKLSAgICBzdXBlcihXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbG9hZCgpCi0gIHsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU1JVEVSLCBVRERJUHJlZmVyZW5jZURlZmF1bHRzLmdldFVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyKCkpOwotICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX1NUUklOR19ERUxJTUlURVIsIFVERElQcmVmZXJlbmNlRGVmYXVsdHMuZ2V0VWRkaUNhdERhdGFTdHJpbmdEZWxpbWl0ZXIoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX0NPTFVNTl9ERUxJTUlURVIsIGRlbGltaXRlcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU1JVEVSKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpCi0gIHsKLSAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNSVRFUiwgZGVsaW1pdGVyKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VWRkaUNhdERhdGFTdHJpbmdEZWxpbWl0ZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX1NUUklOR19ERUxJTUlURVIpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjg3MjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFNjZW5hcmlvQ29udGV4dCAKLXsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVEVTVF9UWVBFUyA9ICJ3ZWJTZXJ2aWNlVGVzdFR5cGVzIjsKLSAgICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PTl9KQVZBX1RFU1RfU0VSVklDRT0gIm5vbkphdmFUZXN0U2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFID0gIndlYlNlcnZpY2VUeXBlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFID0gInN0YXJ0V2ViU2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSU5TVEFMTF9XRUJTRVJWSUNFID0gImluc3RhbGxXZWJTZXJ2aWNlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9JTlNUQUxMX0NMSUVOVCA9ICJpbnN0YWxsQ2xpZW50IjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9MQVVOQ0hfV0VCU0VSVklDRV9FWFBMT1JFUiA9ICJsYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1BST1hZID0gImdlbmVyYXRlUHJveHkiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUgPSAiY2xpZW50V2ViU2VydmljZVR5cGUiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1RFU1RfV0VCU0VSVklDRSA9ICJ0ZXN0V2ViU2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFID0gIm1vbml0b3JXZWJTZXJ2aWNlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFID0gImxhdW5jaFNhbXBsZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCU0VSVklDRSA9ICJnZW5lcmF0ZVdlYlNlcnZpY2UiOyAvL2p2aAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfR0VORVJBVEVfQ0xJRU5UID0gImdlbmVyYXRlQ2xpZW50IjsgLy9qdmggIAotICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV1NfVEVTVD0wOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXU19TVEFSVD0xOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXU19JTlNUQUxMPTI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFdTX0RFUExPWT0zOyAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFdTX0FTU0VNQkxFPTQ7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFdTX0RFVkVMT1A9NTsgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXU19OT05FPTY7Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKFN0cmluZ1tdIHRlc3RUeXBlcyk7Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGVEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgc2V0V2ViU2VydmljZVR5cGUoIFN0cmluZyB2YWx1ZSApOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbFdlYlNlcnZpY2UoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbFdlYlNlcnZpY2VEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldEluc3RhbGxXZWJTZXJ2aWNlKCBib29sZWFuIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRJbnN0YWxsQ2xpZW50KCk7Ci0gIHB1YmxpYyBib29sZWFuIGdldEluc3RhbGxDbGllbnREZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldEluc3RhbGxDbGllbnQoIGJvb2xlYW4gdmFsdWUgKTsKLSAgICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlKCk7Ci0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZURlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICAgc2V0U3RhcnRXZWJTZXJ2aWNlKCBib29sZWFuIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyRGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgICBzZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoIGJvb2xlYW4gdmFsdWUgKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHkoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eURlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICAgc2V0R2VuZXJhdGVQcm94eSggYm9vbGVhbiB2YWx1ZSApOwotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgIHNldENsaWVudFdlYlNlcnZpY2VUeXBlKCBTdHJpbmcgdmFsdWUgKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlKCk7Ci0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlRGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgICBzZXRUZXN0V2ViU2VydmljZSggYm9vbGVhbiB2YWx1ZSApOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2UoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpOwotICAKLSAgcHVibGljIGJvb2xlYW4gaXNMYXVuY2hTYW1wbGVFbmFibGVkKCk7Ci0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFNhbXBsZUVuYWJsZWREZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldExhdW5jaFNhbXBsZUVuYWJsZWQoIGJvb2xlYW4gdmFsdWUgKTsKLSAgCi0gIHB1YmxpYyBpbnQgZ2V0R2VuZXJhdGVXZWJTZXJ2aWNlRGVmYXVsdCgpOwotICBwdWJsaWMgaW50IGdldEdlbmVyYXRlV2ViU2VydmljZSgpOwotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdlYlNlcnZpY2UoaW50IHZhbHVlKTsKLSAgCi0gIHB1YmxpYyBpbnQgZ2V0R2VuZXJhdGVDbGllbnREZWZhdWx0KCk7Ci0gIHB1YmxpYyBpbnQgZ2V0R2VuZXJhdGVDbGllbnQoKTsKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDbGllbnQoaW50IHZhbHVlKTsKLSAgCi0gIHB1YmxpYyBTY2VuYXJpb0NvbnRleHQgY29weSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvRGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0RlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDNmNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvRGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2NlbmFyaW9EZWZhdWx0cwoteyAgCi0gIAotCQotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpCi0gIHsKLSAgCS8vd2Ugd2lsbCBzZXQgdGhlIGhvbWUgZ3Jvd24gc2FtcGxlIGFzIHRoZSBmaXJzdCBjaG9pY2UKLSAgCVdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgdGVzdFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAJCi0gIAlMYWJlbHNBbmRJZHMgbGFiZWxzYW5kaWRzID0gdGVzdFJlZ2lzdHJ5LmdldExhYmVsc0FuZElEcygpOwotICAJU3RyaW5nW10gbGFiZWxzID0gbGFiZWxzYW5kaWRzLmdldExhYmVsc18oKTsKLSAgCVN0cmluZ1tdIGlkcyA9IGxhYmVsc2FuZGlkcy5nZXRJZHNfKCk7Ci0gIAkKLSAgCVN0cmluZ1tdIG5ld05hbWVzID0gbmV3IFN0cmluZ1tsYWJlbHMubGVuZ3RoXTsKLSAgCWludCBpbmRleCA9IC0xOwotICAJZm9yKGludCBpID0gMDtpPGlkcy5sZW5ndGg7aSsrKXsKLSAgCSAgaWYoaWRzW2ldLmVxdWFscygib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XZWJTZXJ2aWNlU2FtcGxlVGVzdCIpKSAgCQotICAJICAgIGluZGV4ID0gaTsgICAKLSAgCX0KLSAgCWlmKGluZGV4ICE9IC0xKXsKLSAgCSAgbmV3TmFtZXNbMF0gPSBsYWJlbHNbaW5kZXhdOwotICAJICBpbnQgaiA9IDE7Ci0gIAkgIGZvcihpbnQgaSA9IDA7aTxsYWJlbHMubGVuZ3RoO2krKyl7Ci0gIAkgICAgaWYoaSAhPSBpbmRleCl7Ci0gIAkgIAkgIG5ld05hbWVzW2pdID0gbGFiZWxzW2ldOyAKLSAgCSAgICAgIGorKzsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCX0KLSAgCWVsc2UgcmV0dXJuIGxhYmVsczsKLSAgCQotICAJcmV0dXJuIG5ld05hbWVzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE5vbkphdmFUZXN0U2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuICJXZWIgU2VydmljZXMgRXhwbG9yZXIiOwkKLSAgfSAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgd2Vic2VydmljZVR5cGVJZERlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuICIwL29yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuamF2YSI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgc2VydmljZUdlbmVyYXRpb25EZWZhdWx0KCkKLSAgewotCSAgcmV0dXJuIFNjZW5hcmlvQ29udGV4dC5XU19TVEFSVDsgIAotICB9Ci0gIAotICBwdWJsaWMgaW50IGNsaWVudEdlbmVyYXRpb25EZWZhdWx0KCkKLSAgewotCSAgcmV0dXJuIFNjZW5hcmlvQ29udGV4dC5XU19OT05FOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHN0YXJ0V2Vic2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGluc3RhbGxXZWJzZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaW5zdGFsbENsaWVudERlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGxhdW5jaFdlYnNlcnZpY2VFeHBsb3JlckRlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZVByb3h5RGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgd2Vic2VydmljZUNsaWVudFR5cGVEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiB0ZXN0V2Vic2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gbGF1bmNoU2FtcGxlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzAxOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1RyYW5zaWVudFNjZW5hcmlvQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotcHVibGljIGNsYXNzIFRyYW5zaWVudFNjZW5hcmlvQ29udGV4dCBpbXBsZW1lbnRzIFNjZW5hcmlvQ29udGV4dAotewotICBwcml2YXRlIFN0cmluZ1tdIHdlYlNlcnZpY2VUZXN0VHlwZXM7Ci0gIHByaXZhdGUgU3RyaW5nW10gbm9uSmF2YVRlc3RTZXJ2aWNlOwotICBwcml2YXRlIFN0cmluZyAgIHdlYlNlcnZpY2VUeXBlXzsKLSAgcHJpdmF0ZSBib29sZWFuICBpbnN0YWxsV2ViU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgaW5zdGFsbENsaWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgc3RhcnRXZWJTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuICBsYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXJfOwotICBwcml2YXRlIGJvb2xlYW4gIGdlbmVyYXRlUHJveHlfOwotICBwcml2YXRlIFN0cmluZyAgIGNsaWVudFdlYlNlcnZpY2VUeXBlXzsKLSAgcHJpdmF0ZSBib29sZWFuICB0ZXN0V2ViU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgbW9uaXRvcldlYlNlcnZpY2U7Ci0gIHByaXZhdGUgYm9vbGVhbiAgbGF1bmNoU2FtcGxlXzsKLSAgcHJpdmF0ZSBpbnQgZ2VuZXJhdGVXZWJTZXJ2aWNlXzsgLy9qdmgKLSAgcHJpdmF0ZSBpbnQgZ2VuZXJhdGVDbGllbnRfOyAvL2p2aAotICAKLSAgcHJpdmF0ZSBTY2VuYXJpb0RlZmF1bHRzIGRlZmF1bHRzID0gbmV3IFNjZW5hcmlvRGVmYXVsdHMoKTsKLSAKLSAgcHVibGljIFRyYW5zaWVudFNjZW5hcmlvQ29udGV4dCAoKSB7fQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXROb25KYXZhVGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5vbkphdmFUZXN0U2VydmljZTsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXROb25KYXZhVGVzdFNlcnZpY2UoU3RyaW5nW10gbm9uSmF2YVRlc3RTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5ub25KYXZhVGVzdFNlcnZpY2UgPSBub25KYXZhVGVzdFNlcnZpY2U7CQotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VUZXN0VHlwZXMoU3RyaW5nW10gd2ViU2VydmljZVRlc3RUeXBlcykKLSAgewotICAgIHRoaXMud2ViU2VydmljZVRlc3RUeXBlcyA9IHdlYlNlcnZpY2VUZXN0VHlwZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCkKLSAgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlVGVzdFR5cGVzOwkKLSAgfQotIAotICBwdWJsaWMgU2NlbmFyaW9Db250ZXh0IGNvcHkoKSB7Ci0gIAlUcmFuc2llbnRTY2VuYXJpb0NvbnRleHQgY29udGV4dCA9IG5ldyBUcmFuc2llbnRTY2VuYXJpb0NvbnRleHQoKTsKLQljb250ZXh0LnNldFdlYlNlcnZpY2VUZXN0VHlwZXMoZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpKTsKLQljb250ZXh0LnNldE5vbkphdmFUZXN0U2VydmljZShnZXROb25KYXZhVGVzdFNlcnZpY2UoKSk7Ci0JCi0JY29udGV4dC5zZXRXZWJTZXJ2aWNlVHlwZSggZ2V0V2ViU2VydmljZVR5cGUoKSApOwotCWNvbnRleHQuc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoIGdldENsaWVudFdlYlNlcnZpY2VUeXBlKCkgKTsKLQljb250ZXh0LnNldEdlbmVyYXRlUHJveHkoIGdldEdlbmVyYXRlUHJveHkoKSApOwotCWNvbnRleHQuc2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoKSApOwotCWNvbnRleHQuc2V0SW5zdGFsbFdlYlNlcnZpY2UoIGdldEluc3RhbGxXZWJTZXJ2aWNlKCkgKTsKLQljb250ZXh0LnNldEluc3RhbGxDbGllbnQoIGdldEluc3RhbGxDbGllbnQoKSApOwotCWNvbnRleHQuc2V0U3RhcnRXZWJTZXJ2aWNlKCBnZXRTdGFydFdlYlNlcnZpY2UoKSApOwotCWNvbnRleHQuc2V0VGVzdFdlYlNlcnZpY2UoIGdldFRlc3RXZWJTZXJ2aWNlKCkgKTsKLQljb250ZXh0LnNldE1vbml0b3JXZWJTZXJ2aWNlKGdldE1vbml0b3JXZWJTZXJ2aWNlKCkpOwotCWNvbnRleHQuc2V0TGF1bmNoU2FtcGxlRW5hYmxlZCggaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkgKTsKLQljb250ZXh0LnNldEdlbmVyYXRlV2ViU2VydmljZShnZXRHZW5lcmF0ZVdlYlNlcnZpY2UoKSk7ICAvL2p2aAotCXJldHVybiBjb250ZXh0OwotICB9Ci0gCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50V2ViU2VydmljZVR5cGVfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMud2Vic2VydmljZUNsaWVudFR5cGVEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0R2VuZXJhdGVQcm94eSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBnZW5lcmF0ZVByb3h5XzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eURlZmF1bHQoKXsgcmV0dXJuIGRlZmF1bHRzLmdlbmVyYXRlUHJveHlEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpCi0gIHsKLSAgICByZXR1cm4gbGF1bmNoV2ViU2VydmljZUV4cGxvcmVyXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMubGF1bmNoV2Vic2VydmljZUV4cGxvcmVyRGVmYXVsdCgpOyB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldEluc3RhbGxXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEluc3RhbGxXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBpbnN0YWxsV2ViU2VydmljZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEluc3RhbGxXZWJTZXJ2aWNlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMuaW5zdGFsbFdlYnNlcnZpY2VEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0SW5zdGFsbFdlYlNlcnZpY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbENsaWVudCgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFsbENsaWVudF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEluc3RhbGxDbGllbnREZWZhdWx0KCl7IHJldHVybiBkZWZhdWx0cy5pbnN0YWxsQ2xpZW50RGVmYXVsdCgpOyB9Ci0gIAotICAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0U3RhcnRXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRXZWJTZXJ2aWNlXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMuc3RhcnRXZWJzZXJ2aWNlRGVmYXVsdCgpOyB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldFRlc3RXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiB0ZXN0V2ViU2VydmljZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMudGVzdFdlYnNlcnZpY2VEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0V2ViU2VydmljZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gd2ViU2VydmljZVR5cGVfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMud2Vic2VydmljZVR5cGVJZERlZmF1bHQoKTsgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRDbGllbnRXZWJTZXJ2aWNlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgY2xpZW50V2ViU2VydmljZVR5cGVfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0R2VuZXJhdGVQcm94eShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgZ2VuZXJhdGVQcm94eV8gPSB2YWx1ZTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgbGF1bmNoV2ViU2VydmljZUV4cGxvcmVyXyA9IHZhbHVlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldEluc3RhbGxXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnN0YWxsV2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgaW5zdGFsbFdlYlNlcnZpY2VfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0SW5zdGFsbFdlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluc3RhbGxDbGllbnQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIGluc3RhbGxDbGllbnRfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0U3RhcnRXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGFydFdlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHN0YXJ0V2ViU2VydmljZV8gPSB2YWx1ZTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRUZXN0V2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGVzdFdlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHRlc3RXZWJTZXJ2aWNlXyA9IHZhbHVlOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0V2ViU2VydmljZVR5cGUoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VUeXBlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHdlYlNlcnZpY2VUeXBlXyA9IHZhbHVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRNb25pdG9yV2ViU2VydmljZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yV2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbW9uaXRvcldlYlNlcnZpY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZGVmYXVsdHMuZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldE1vbml0b3JXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yV2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgbW9uaXRvcldlYlNlcnZpY2UgPSB2YWx1ZTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRMYXVuY2hTYW1wbGVFbmFibGVkRGVmYXVsdCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hTYW1wbGVFbmFibGVkRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZGVmYXVsdHMubGF1bmNoU2FtcGxlKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gbGF1bmNoU2FtcGxlXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hTYW1wbGVFbmFibGVkKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hTYW1wbGVFbmFibGVkKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBsYXVuY2hTYW1wbGVfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV2ViU2VydmljZShpbnQgdmFsdWUpCi0gIHsKLQkgIGdlbmVyYXRlV2ViU2VydmljZV8gPSB2YWx1ZTsgIAotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldEdlbmVyYXRlV2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0JICByZXR1cm4gZGVmYXVsdHMuc2VydmljZUdlbmVyYXRpb25EZWZhdWx0KCk7ICAKLSAgfSAgCi0gIAotICBwdWJsaWMgaW50IGdldEdlbmVyYXRlV2ViU2VydmljZSgpCi0gIHsKLQkgIHJldHVybiBnZW5lcmF0ZVdlYlNlcnZpY2VfOyAKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRHZW5lcmF0ZUNsaWVudERlZmF1bHQoKQotICB7Ci0JICByZXR1cm4gZGVmYXVsdHMuY2xpZW50R2VuZXJhdGlvbkRlZmF1bHQoKTsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRHZW5lcmF0ZUNsaWVudCgpCi0gIHsKLQkgIHJldHVybiBnZW5lcmF0ZUNsaWVudF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGludCB2YWx1ZSkKLSAgewotCSAgZ2VuZXJhdGVDbGllbnRfID0gdmFsdWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9VRERJUHJlZmVyZW5jZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9VRERJUHJlZmVyZW5jZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0YWRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFVERElQcmVmZXJlbmNlQ29udGV4dCAKLXsKLSAgLyoKLSAgICogVGhpcyBjb25zdGFudCBTdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIGNvbHVtbiBkZWxpbWl0ZXIgZm9yIHVzZXItZGVmaW5lZCBVRERJCi0gICAqIENhdGVnb3J5IGRhdGEuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfQ09MVU1OX0RFTElNSVRFUiA9ICJ1ZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlciI7Ci0gIAotICAvKgotICAgKiBUaGlzIGNvbnN0YW50IFN0cmluZyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgc3RyaW5nIGRlbGltaXRlciBmb3IgdXNlci1kZWZpbmVkIFVEREkKLSAgICogQ2F0ZWdvcnkgZGF0YS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9TVFJJTkdfREVMSU1JVEVSID0gInVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyIjsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpOwotICBwdWJsaWMgU3RyaW5nIGdldFVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyKCk7Ci0gIHB1YmxpYyB2b2lkIHNldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpOwotICBwdWJsaWMgU3RyaW5nIGdldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1VERElQcmVmZXJlbmNlRGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9VRERJUHJlZmVyZW5jZURlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZWJhOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1VERElQcmVmZXJlbmNlRGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBVRERJUHJlZmVyZW5jZURlZmF1bHRzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyKCkKLSAgewotICAgIHJldHVybiAiIyI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKCkKLSAgewotICAgIHJldHVybiAiXCIiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RhdGEvTGFiZWxzQW5kSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RhdGEvTGFiZWxzQW5kSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDBmNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL0xhYmVsc0FuZElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBMYWJlbHNBbmRJZHMKLXsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBsYWJlbHNfOwotICBwcml2YXRlIFN0cmluZ1tdIGlkc187Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZHNfLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldElkc18oKQotICB7Ci0gICAgcmV0dXJuIGlkc187Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBpZHNfIFRoZSBpZHNfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElkc18oU3RyaW5nW10gaWRzXykKLSAgewotICAgIHRoaXMuaWRzXyA9IGlkc187Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFiZWxzXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRMYWJlbHNfKCkKLSAgewotICAgIHJldHVybiBsYWJlbHNfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gbGFiZWxzXyBUaGUgbGFiZWxzXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMYWJlbHNfKFN0cmluZ1tdIGxhYmVsc18pCi0gIHsKLSAgICB0aGlzLmxhYmVsc18gPSBsYWJlbHNfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RhdGEvVHlwZVJ1bnRpbWVTZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZGF0YS9UeXBlUnVudGltZVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWI0NDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZGF0YS9UeXBlUnVudGltZVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxMyAgIDEzNTU4MSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlUnVudGltZVNlcnZlcgotewotICBwcml2YXRlIFN0cmluZyB0eXBlSWRfICAgICA9ICIiOwotICBwcml2YXRlIFN0cmluZyBydW50aW1lSWRfICA9ICIiOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJJZF8gICA9ICIiOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkXzsKLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJ1bnRpbWVJZF8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVJZCgpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZUlkXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHJ1bnRpbWVJZF8gVGhlIHJ1bnRpbWVJZF8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UnVudGltZUlkKFN0cmluZyBydW50aW1lSWRfKQotICB7Ci0gICAgdGhpcy5ydW50aW1lSWRfID0gcnVudGltZUlkXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJJZF8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlcklkKCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2ZXJJZF8gVGhlIHNlcnZlcklkXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJZChTdHJpbmcgc2VydmVySWRfKQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJJZF8gPSBzZXJ2ZXJJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVySW5zdGFuY2VJZF8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluc3RhbmNlSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZlckluc3RhbmNlSWRfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gc2VydmVySW5zdGFuY2VJZF8gVGhlIHNlcnZlckluc3RhbmNlSWRfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWRfKQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJJbnN0YW5jZUlkXyA9IHNlcnZlckluc3RhbmNlSWRfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHR5cGVJZF8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpCi0gIHsKLSAgICByZXR1cm4gdHlwZUlkXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHR5cGVJZF8gVGhlIHR5cGVJZF8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZUlkKFN0cmluZyB0eXBlSWRfKQotICB7Ci0gICAgdGhpcy50eXBlSWRfID0gdHlwZUlkXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gInR5cGUoIiArIHR5cGVJZF8gKyAiKSBydW50aW1lKCIgKyBydW50aW1lSWRfICsgIikgZmFjdG9yeSgiICsgc2VydmVySWRfICsgIikgc2Vydkluc3RJZCgiICsgc2VydmVySW5zdGFuY2VJZF8gKyAiKSI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KQotICB7Ci0JaWYgKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIFR5cGVSdW50aW1lU2VydmVyKQotCXsKLQkJVHlwZVJ1bnRpbWVTZXJ2ZXIgdHJzID0gKFR5cGVSdW50aW1lU2VydmVyKW9iamVjdDsKLQkJU3RyaW5nIHRyc1R5cGVJZCA9IHRycy5nZXRUeXBlSWQoKTsKLQkJU3RyaW5nIHRyc1J1bnRpbWVJZCA9IHRycy5nZXRSdW50aW1lSWQoKTsKLQkJU3RyaW5nIHRyc1NlcnZlcklkID0gdHJzLmdldFNlcnZlcklkKCk7Ci0JCVN0cmluZyB0cnNTZXJ2ZXJJbnN0YW5jZUlkID0gdHJzLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLQkJCi0JCWJvb2xlYW4gdHlwZUlkc01hdGNoID0gKCh0eXBlSWRfID09IG51bGwpICYmICh0cnNUeXBlSWQgPT0gbnVsbCkpIHx8ICgodHlwZUlkXyAhPSBudWxsKSAmJiAodHlwZUlkXy5lcXVhbHModHJzVHlwZUlkKSkpOwotCQlpZiAoIXR5cGVJZHNNYXRjaCkgcmV0dXJuIGZhbHNlOwotCQlib29sZWFuIHJ1bnRpbWVJZHNNYXRjaCA9ICgocnVudGltZUlkXyA9PSBudWxsKSAmJiAodHJzUnVudGltZUlkID09IG51bGwpKSB8fCAoKHJ1bnRpbWVJZF8gIT0gbnVsbCkgJiYgKHJ1bnRpbWVJZF8uZXF1YWxzKHRyc1J1bnRpbWVJZCkpKTsKLQkJaWYgKCFydW50aW1lSWRzTWF0Y2gpIHJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiBzZXJ2ZXJJZHNNYXRjaCA9ICgoc2VydmVySWRfID09IG51bGwpICYmICh0cnNTZXJ2ZXJJZCA9PSBudWxsKSkgfHwgKChzZXJ2ZXJJZF8gIT0gbnVsbCkgJiYgKHNlcnZlcklkXy5lcXVhbHModHJzU2VydmVySWQpKSk7Ci0JCWlmICghc2VydmVySWRzTWF0Y2gpIHJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiBzZXJ2ZXJJbnN0YW5jZUlkc01hdGNoID0gKChzZXJ2ZXJJbnN0YW5jZUlkXyA9PSBudWxsKSAmJiAodHJzU2VydmVySW5zdGFuY2VJZCA9PSBudWxsKSkgfHwgKChzZXJ2ZXJJbnN0YW5jZUlkXyAhPSBudWxsKSAmJiAoc2VydmVySW5zdGFuY2VJZF8uZXF1YWxzKHRyc1NlcnZlckluc3RhbmNlSWQpKSk7Ci0JCWlmICghc2VydmVySW5zdGFuY2VJZHNNYXRjaCkgcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7CQkKLQl9Ci0JCi0JcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RpYWxvZy9JU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RpYWxvZy9JU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzFiMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kaWFsb2cvSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kaWFsb2c7Ci0KLS8qKgotKiBDb25zdGFudHMgZm9yIHN0YXR1cyBkaWFsb2dzCi0qLwotcHVibGljIGludGVyZmFjZSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzIHsKLQotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfSUQgPSAyOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX1RPX0FMTF9JRCA9IDQ7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JRCA9IDE7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIk9LIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfSUQgPSAwOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJEZXRhaWxzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMU19JRCA9IDEzOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4ZWN1dGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2MGZiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXhlY3V0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSogQWxsIEV4dGVuc2lvbnMgd2l0aCBleGVjdHV0YWJsZSBleHRlbnNpb25zIHNob3VsZCBpbXBsZW1lbnQgdGhpcyAKLSogdG8gZml0IG91ciBmcmFtZXdvcmsKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAvKioKLSAgKlJldHVybnMgYSB3aXphcmQgZnJhZ21lbnQgZm9yIHRoaXMgZXhlbnRpb24gdHlwZSAKLSAgKgotICAqLwotICBwdWJsaWMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gZ2V0RmluaXNoQ29tbWFuZCgpOwotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzMmQwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUV4dGVuc2lvbgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgb3IgYSBmcmFnbWVudCBhZGRlZAotICAqIEByZXR1cm4gV2ViU2VydmljZUV4ZWN1dGFibGUgdGhpcyBpbnRlcmZhY2UgaG9sZHMgZXhlY3V0YWJsZSBjb2RlIGFuZCBhIAotICAqIGZyYWdtZW50Ci0gICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24oKTsKLQotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBjb25maWcgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBleHRlbnNpb24gaW5mbwotICAqIEBwYXJhbSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgRXh0ZW5zaW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29uZmlnRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCk7Ci0gCi0gIC8qKgotICAqIElmIHRoZSBleHRlbnNpb24gaGFzIGNvZGUgdGhhdCAKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uRWxlbWVudCBFeHRlbnNpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ0VsZW1lbnQoKTsKLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ZDkyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci0KLQotCi0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeHRlbnNpb24KLXsKLQotCXByaXZhdGUgSUxvZwlsb2dfOwotCQotICAvKgotICAqIFRoZSBDb25maWdFbGVtZW50IHRoYXQgaG9sZHMgZXh0ZW5zaW9uIGluZm8KLSAgKi8KLSAgcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50XzsKLQotICAvKgotICAqIFRoZSBleHRlbnNpb24gZXhlY3V0YWJsZSAKLSAgKi8KLSAgcHJvdGVjdGVkIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHdlYlNlcnZpY2VFeGVjdXRhYmxlXzsKLSAgCi0KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb25JbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgY29uZmlnRWxlbWVudF8gPSBjb25maWdFbGVtZW50OwotICAgIGxvZ18gPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUxvZygpOwotICB9Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogSWYgdGhlIGV4dGVuc2lvbiBoYXMgY29kZSB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIG9yIGEgZnJhZ21lbnQgYWRkZWQKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHRoaXMgaW50ZXJmYWNlIGhvbGRzIGV4ZWN1dGFibGUgY29kZSBhbmQgYSAKLSAgKiBmcmFnbWVudAotICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uKCkKLSAgewotICAgIGlmKHdlYlNlcnZpY2VFeGVjdXRhYmxlXyAhPSBudWxsKSByZXR1cm4gd2ViU2VydmljZUV4ZWN1dGFibGVfOwotCi0gICAgdHJ5ewotICAgICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRfLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgfWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotICAgICAgbG9nXy5sb2coSUxvZy5FUlJPUiwgNTAyOSwgdGhpcywgImdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uIixlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIGNvbmZpZyBlbGVtZW50IHRoYXQgaG9sZHMgdGhlIGV4dGVuc2lvbiBpbmZvCi0gICogQHBhcmFtIElDb25maWd1cmF0aW9uRWxlbWVudCBFeHRlbnNpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb25maWdFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgY29uZmlnRWxlbWVudF8gPSBjb25maWdFbGVtZW50OwotICB9CQotCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIGNvbmZpZyBlbGVtZW50IHRoYXQgaG9sZHMgdGhlIGV4dGVuc2lvbiBpbmZvCi0gICogQHJldHVybiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgRXh0ZW5zaW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWdFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBjb25maWdFbGVtZW50XzsKLSAgfQotICAKLSAgLyoqCi0gICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBiZWluZyB1c2VkCi0gICogQHJldHVybiBTdHJpbmcgbmFtZSBvZiB0aGlzIGV4dGVuc2lvbgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOwotICB9Ci0KLQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYzFkMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDsKLQotCi0vKioKLSogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGV4dGVuc2lvbnMgZm9yIGEgZ2l2ZW4gZXh0ZW5zaW9uLXBvaW50IAotKiBhbHNvIHJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3RzIAotKgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zCi0gICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucy4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VFeHRlbnNpb25OYW1lcyAoKTsKLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3Qgb2YgdGhlIGdpdmVuIG5hbWUKLSAgKkByZXR1cm4gV2ViU2VydmljZUV4dGVuc2lvbiBvYmplY3QKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb24gZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUoIFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIEFsbCBleHRlbnRpb24gb2JqZWN0cyBpbiB0aGlzIHJlZ2lzdHJ5Ci0gICpAcmV0dXJuIFdlYlNlcnZpY2VFeHRlbnNpb24gb2JqZWN0cwotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbltdIGdldFdlYlNlcnZpY2VFeHRlbnNpb25zKCk7Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiZWExMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDgyMSAgIDE1MzgzMyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgQWxsb3cgdGhlIFdlYiBTZXJ2aWNlIFRlc3QgZXh0ZW5zaW9uIHBvaW50IHRvIHNwZWNpZnkgdGhlIHN1cHBvcnRlZCBjbGllbnQgcnVudGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLkxhYmVsc0FuZElkczsKLQotCi0vKioKLSogVGhpcyBpcyBhIGdlbmVyaWMgcmVnaXN0cnkgd2hpY2ggc2V0cyB1cCBnZW5lcmFsIGNvZGUgaW4gaGFuZGxpbmcgICAKLSogSUNvbmZpZ0VsZW1lbnRzIGZvciBhbiBleHRlbnNpb24KLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeQotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgbmFtZUV4dGVuc2lvblRhYmxlXzsKLSAgcHJvdGVjdGVkIFZlY3RvciBpZF87Ci0gIHByb3RlY3RlZCBWZWN0b3IgbGFiZWxfOwotICBwcml2YXRlIExhYmVsc0FuZElkcyBsYWJlbHNhbmRpZHNfOwotICAgIAotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbCgpCi0gIHsKLSAgICBuYW1lRXh0ZW5zaW9uVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGxhYmVsXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZF8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgbG9hZEV4dGVuc2lvbnMoKTsKLSAgfQotICAKLSAgLyoqCi0gICogQ2hpbGRyZW4gcmVnaXN0cmllcyB3aWxsIGhhdmUgZGlmZmVyZW50IGV4dGVuc2lvbiB0eXBlcyAKLSAgKiBAcmV0dXJuIFdlYnNlcnZpY2VFeHRlbnNpb24gaG9sZHMgYSBjb25maWcgZWxlbQotICAqIGZvciB0aGF0IGV4dGVuc2lvbiBjYXBhYmxlIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgZmlsZQotICAqLwotICBwdWJsaWMgYWJzdHJhY3QgV2ViU2VydmljZUV4dGVuc2lvbiBjcmVhdGVXZWJTZXJ2aWNlRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KTsKLQotICAvKioKLSAgKiBDaGlsZHJlbiBtdXN0IGltcGxlbWVudCBob3cgdGhleSBnZXQgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIAotICAqIEByZXR1cm4gSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYW4gYXJyYXkgb2YgZWxlbWVudHMgcGFydGljdWxhciB0byB0aGF0Ci0gICogZXh0ZW5zaW9uCi0gICovCi0gIHB1YmxpYyBhYnN0cmFjdCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWdFbGVtZW50cygpOwotCi0gIC8qCi0gICogTG9hZHMgV2ViU2VydmljZUV4dGVuc2lvbnMgZm9yIFdlYlNlcnZpY2VDbGllbnRUZXN0IGludG8gdGhpcyByZWdpc3RyeS4KLSAgKiBUaGlzIGlzIGRvbmUgYnkgcXVlcnlpbmcgdGhlIHBsdWdpbiByZWdpc3RyeSBmb3IgYWxsIGV4dGVuc2lvbnMKLSAgKiB0aGF0IGV4dGVuZCB3ZWJTZXJ2aWNlQ2xpZW50VGVzdCAgCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGxvYWRFeHRlbnNpb25zICgpCi0gIHsgICAgCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gZ2V0Q29uZmlnRWxlbWVudHMoKTsKLQotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIFN0cmluZyBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKCAibGFiZWwiICk7Ci0gICAgICBTdHJpbmcgaWQgPSAgIGVsZW0uZ2V0QXR0cmlidXRlKCAiaWQiICk7ICAgICAgCi0gICAgICBXZWJTZXJ2aWNlRXh0ZW5zaW9uIHdlYlNlcnZpY2VFeHRlbnNpb24gPSBjcmVhdGVXZWJTZXJ2aWNlRXh0ZW5zaW9uKGVsZW0pOwkKLSAgICAgIG5hbWVFeHRlbnNpb25UYWJsZV8ucHV0KGxhYmVsLHdlYlNlcnZpY2VFeHRlbnNpb24pOwotICAgICAgbGFiZWxfLmFkZChsYWJlbCk7Ci0gICAgICBpZF8uYWRkKGlkKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zCi0gICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucy4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VFeHRlbnNpb25OYW1lcyAoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSluYW1lRXh0ZW5zaW9uVGFibGVfLmtleVNldCgpLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5hbWVzIGFuZCBJZHMgCi0gICAqLwotICBwdWJsaWMgTGFiZWxzQW5kSWRzIGdldExhYmVsc0FuZElEcygpCi0gIHsKLSAgCWxhYmVsc2FuZGlkc18gPSBuZXcgTGFiZWxzQW5kSWRzKCk7Ci0gIAlsYWJlbHNhbmRpZHNfLnNldExhYmVsc18oKFN0cmluZ1tdKWxhYmVsXy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICkpOwotICAJbGFiZWxzYW5kaWRzXy5zZXRJZHNfKChTdHJpbmdbXSlpZF8udG9BcnJheSggbmV3IFN0cmluZ1swXSApKTsKLSAgCXJldHVybiBsYWJlbHNhbmRpZHNfOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0IG9mIHRoZSBnaXZlbiBuYW1lCi0gICogQHJldHVybiBXZWJTZXJ2aWNlRXh0ZW5zaW9uIG9iamVjdAotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbiBnZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSggU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gKFdlYlNlcnZpY2VFeHRlbnNpb24pbmFtZUV4dGVuc2lvblRhYmxlXy5nZXQobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIEFsbCBleHRlbnRpb24gb2JqZWN0cyBpbiB0aGlzIHJlZ2lzdHJ5Ci0gICpAcmV0dXJuIFdlYlNlcnZpY2VFeHRlbnNpb24gb2JqZWN0cwotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbltdIGdldFdlYlNlcnZpY2VFeHRlbnNpb25zKCkKLSAgewotICAgIHJldHVybiAoV2ViU2VydmljZUV4dGVuc2lvbltdKW5hbWVFeHRlbnNpb25UYWJsZV8udmFsdWVzKCkudG9BcnJheSggbmV3IFdlYlNlcnZpY2VFeHRlbnNpb25bMF0gKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvSmF2YVByb3h5VGVzdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvSmF2YVByb3h5VGVzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZTM0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC90ZXN0L0phdmFQcm94eVRlc3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVByb3h5VGVzdENvbW1hbmQgZXh0ZW5kcyBXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQKLXsKLQotIC8qKgotICAqIFRoaXMgaG9sZHMgYW4gaW5mbyBjbGFzcyB0aGF0IGNvbWVzIGZyb20gdXNlciBpbnB1dCBvciBzb21lIGNhbGNpbGF0aW9ucyB0aGF0IG5lZWRzIHRvIGJlCi0gICogdXNlZCBmb3IgdGhlIGZpbmlzaAotICAqLwotICAKLSAgcHVibGljIHZvaWQgc2V0SnNwRm9sZGVyKFN0cmluZyBqc3BGb2xkZXIpOwotICAKLSAgcHVibGljIHZvaWQgc2V0UnVuQ2xpZW50VGVzdChib29sZWFuIHJ1bkNsaWVudFRlc3QpOwotICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChTdHJpbmcgc2FtcGxlUHJvamVjdCk7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm94eUJlYW4oU3RyaW5nIHByb3h5QmVhbik7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXRFbmRwb2ludE1ldGhvZChTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2QpOwotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCk7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RzKEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzKTsKLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XU0RMVGVzdEZpbmlzaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV1NETFRlc3RGaW5pc2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjllNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XU0RMVGVzdEZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFRlc3RGaW5pc2hDb21tYW5kIGV4dGVuZHMgV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kCi17Ci0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KTsKLSAgcHVibGljIHZvaWQgc2V0V3NkbFNlcnZpY2VVUkwoU3RyaW5nIHdzZGxVUkkpOwotICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEJyb3dzZXIoYm9vbGVhbiBleHRlcm5hbCk7IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODgxOTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA4MTYgICAxMDQ4NzAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwODIxICAgMTUzODMzIG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBBbGxvdyB0aGUgV2ViIFNlcnZpY2UgVGVzdCBleHRlbnNpb24gcG9pbnQgdG8gc3BlY2lmeSB0aGUgc3VwcG9ydGVkIGNsaWVudCBydW50aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeHRlbnNpb25JbXBsOwotCi0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKiBJbiBwYXJ0aWN1bGFyIGl0IGhvbGRzIGEgY2xpZW50IHRlc3QgZXh0ZW5zaW9uIGVsZW1lbnQgCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIGV4dGVuZHMgV2ViU2VydmljZUV4dGVuc2lvbkltcGwKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBMaXN0IHN1cHBvcnRlZFJ1bnRpbWVzXyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkKLSAgewotICAgIHN1cGVyKGNvbmZpZ0VsZW1lbnQpOwotICAgICAgIAotICAgIFN0cmluZyBydW50aW1lc0xpc3QgPSBnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJzdXBwb3J0ZWRDbGllbnRSdW50aW1lcyIpOyAgCi0gICAKLSAgICBhZGRSdW50aW1lcyhydW50aW1lc0xpc3QpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkcyBhIGxpc3Qgb2Ygc3BhY2UgZGVsaW1pdGVkIHJ1bnRpbWUgSURzLgotICAgKiAKLSAgICogQHBhcmFtIHJ1bnRpbWVzTGlzdCBUaGUgbGlzdCBvZiBydW50aW1lIElEcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFJ1bnRpbWVzKFN0cmluZyBydW50aW1lc0xpc3QpIHsKLQkgIAotCSAgaWYgKHJ1bnRpbWVzTGlzdCA9PSBudWxsKQotCQkgIHJldHVybjsKLQkgIAotCSAgU3RyaW5nW10gcnVudGltZXMgPSBydW50aW1lc0xpc3Quc3BsaXQoIlxccysiKTsKLQkgICAgCi0JICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLmxlbmd0aDsgaSsrKSB7CSAgICAJCi0JCSAgaWYgKHJ1bnRpbWVzW2ldLmxlbmd0aCgpID4gMCkKLQkJCSAgc3VwcG9ydGVkUnVudGltZXNfLmFkZChydW50aW1lc1tpXSk7ICAgCi0JICB9Ci0gIH0KLSAgCi0gIC8qKgotICAqIFdpbGwgdGhpcyB0ZXN0Q2xpZW50IGdlbmVyYXRlIGNvZGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjb2RlZ2VuIG5lZWRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NvZGVHZW5OZWVkZWQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAiY29kZUdlbmVyYXRlZCIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFVzZSB0aGUgZGVmYXVsdCBGb2xkZXIgUHJvdmlkZWQgYnkgdXMKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBubyBzcGVjaWFsIGZvbGRlciByZXF1aXJlcwotICAqLwotICBwdWJsaWMgYm9vbGVhbiB1c2VEZWZhdWx0Q29kZUdlbkZvbGRlcigpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJkZWZhdWx0Y29kZWdlbmZvbGRlciIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBVc2UgU3BlY2lhbCBGb2xkZXIgZm9yIGdlbmVyYXRlZCBjb2RlCi0gICogQHJldHVybiBTdHJpbmcgc3BlY2lhbCBmb2xkZXIgbmFtZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvZGVHZW5Gb2xkZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJjb2RlZ2VuZm9sZGVyIiApOwotICB9Ci0KLSAgLyoqCi0gICogRG8gd2UgbmVlZCB0byBsYXVuY2ggc29tZXRoaW5nCi0gICogQHJldHVybiBCb29sZWFuIGlmIHRydWUgbGF1bmNoIGNvZGVnZW4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMYXVuY2hSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJsYXVuY2hSZXF1aXJlZCIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBEbyB3ZSBuZWVkIHRoZSBtZXRob2RzIGZvciB0aGUgcHJveHkKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBwcm94eSBtZXRob2RzIG5lZWRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcmVNZXRob2RzTmVlZGVkKCkKLSAgewotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggIm1ldGhvZHNuZWVkZWQiICkpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICogRG9lcyB0aGlzIHRlc3QgbWFjaGluZSBuZWVkIGEgc2VydmVyCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYSBzZXJ2ZXIgaXMgcmVxdWlyZWQKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJOZWVkZWQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAic2VydmVyUmVxdWlyZWQiICkpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICogVXNlIHRoZSBEZWZhdWx0IFNlcnZlciBjaG9zZW4gYnkgdGhlIHdpemFyZAotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBkZWZhdWx0IHNlcnZlciBpcyB3YW50ZWQKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gdXNlRGVmYXVsdFNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJkZWZhdWx0c2VydmVyIiApKS5ib29sZWFuVmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAqIFVzZSB0aGUgRGVmYXVsdCBTZXJ2ZXIgY2hvc2VuIGJ5IHRoZSB3aXphcmQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZGVmYXVsdCBzZXJ2ZXIgaXMgd2FudGVkCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgdXNlU2VydmVyKCkKLSAgewotICAgIHJldHVybiBnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAidXNlc2VydmVyIiApOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdGVzdFdTREwoKQotICB7Ci0gIAlTdHJpbmcgd3NkbCA9IGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJ0ZXN0V1NETCIgKTsKLSAgICBpZih3c2RsLmVxdWFscygieWVzIikgfHwgd3NkbC5lcXVhbHMoInRydWUiKSkKLQkgIHJldHVybiB0cnVlOwotCSAKLQlyZXR1cm4gZmFsc2U7ICAKLSAgfQotICAJCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhpcyBXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGlkIGF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JcmV0dXJuIGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJpZCIgKTsgCi0gIH0KLSAgIAotICAvKioKLSAgICogRG9lcyB0aGlzIGV4dGVuc2lvbiBhbGxvdyBleHRlbmRlcnMgdG8gcmVzdHJpY3QgdGhlIHJ1bnRpbWVzIHRoYXQgYXJlIHN1cHBvcnRlZD8KLSAgICogIAotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYWxsb3dSdW5pbWVzUmVzdHJpY3Rpb24gYXR0cmlidXRlLCBmYWxzZSBpZiBub3QgcHJlc2VudC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFsbG93Q2xpZW50UnVudGltZXNSZXN0cmljdGlvbigpIHsKLQkgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggImFsbG93Q2xpZW50UnVudGltZXNSZXN0cmljdGlvbiIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0gIAotICAgICAgIAotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIHN1cHBvcnRzIHRoZSBnaXZlIGNsaWVudCBydW50aW1lIElELgotICAgKiAKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGllbnQgcnVudGltZSBJRCBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUnVudGltZShTdHJpbmcgcnVudGltZUlkKSB7Ci0JICAKLQkgaWYgKCFhbGxvd0NsaWVudFJ1bnRpbWVzUmVzdHJpY3Rpb24oKSB8fCBzdXBwb3J0ZWRSdW50aW1lc18uaXNFbXB0eSgpKQotCQkgcmV0dXJuIHRydWU7Ci0JICAKLQkgcmV0dXJuIHN1cHBvcnRlZFJ1bnRpbWVzXy5jb250YWlucyhydW50aW1lSWQpOwotICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MTkzNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQgCi17Ci0KLSAgLyoqCi0gICAqIElmIHRoZSBjb21tYW5kIG5lZWRzIGEgc2VydmVyIHRoaXMgaXMgdGhlIGNob3NlbiAKLSAgICogY2xpZW50IHNlcnZlcklECi0gICAqIEBwYXJhbSBzYW1wbGVTZXJ2ZXJUeXBlSUQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclR5cGVJRChTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRCk7Ci0gIAotICAvKioKLSAgICogVGhpcyBpcyB0aGUgSVNlcnZlciBpZiByZXF1aXJlZAotICAgKiBAcGFyYW0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKTsKLSAgCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBlbmRwb2ludHMgaWYgbW9uaXRvciBzZXJ2aWNlIGlzIGVuYWJsZWQKLSAgICogQHBhcmFtIGVuZHBvaW50cwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoTGlzdCBlbmRwb2ludHMpOwotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjlhZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDgyMSAgIDE1MzgzMyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgQWxsb3cgdGhlIFdlYiBTZXJ2aWNlIFRlc3QgZXh0ZW5zaW9uIHBvaW50IHRvIHNwZWNpZnkgdGhlIHN1cHBvcnRlZCBjbGllbnQgcnVudGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQuV2ViU2VydmljZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IGV4dGVuZHMgV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbAotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgLyoKLSAgICogVGhpcyBpcyBhIHNpbmdsZXRvbiBiZWNhc3VlIGl0IHdhcyBkZWNpZGVkIHRoYXQgdGhlIG1lbW9yeSBmb290IHByaW50IAotICAgKiBpcyBub3QgYXMgZXhwZW5zaXZlIGFzIHRoZSB0aW1lIHRha2VuIHJldHJpZXZpbmcgdGhlIGRhdGEKLSAgICogCi0gICAqLwotICAKLSAgCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgd3N0cjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVRlc3RSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgCWlmKHdzdHIgPT0gbnVsbCkgd3N0ciA9IG5ldyBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5KCk7Ci0gICAgcmV0dXJuIHdzdHI7Ci0gIH0KLSAgCi0gIHByaXZhdGUgV2ViU2VydmljZVRlc3RSZWdpc3RyeSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byAiam9pbiIgYW4gZXhpc3RpbmcgdmFsdWUgYW5kIGEgbmV3IHZhbHVlIHRvZ2V0aGVyIGJ5Ci0gICAqIGEgc3BhY2UgaW4gYmV0d2Vlbi4gIEhhbmRsZXMgc3BlY2lhbCBjYXNlIHdoZW4gZWl0aGVyIHZhbHVlIGlzIG51bGwuIAotICAgKiAgCi0gICAqIEBwYXJhbSBleGlzdGluZ1ZhbHVlIFRoZSBleGlzdGluZyB2YWx1ZQotICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZQotICAgKiBAcmV0dXJuIElmIGVpdGVyIHRoZSBleGlzdGluZyBvciBuZXcgdmFsdWUgaXMgbnVsbCwgc2ltcGx5IHJldHVybnMgdGhlCi0gICAqIG5ldyB2YWx1ZSBhcyBpcyAod2hpY2ggY291bGQgYmUgbnVsbCkuICBPdGhlcndpc2UgcmV0dXJucyB0aGUgdmFsdWUgam9pbmVkCi0gICAqIGJ5IGEgc3BhY2UuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZW5OZXdWYWx1ZShTdHJpbmcgZXhpc3RpbmdWYWx1ZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JICAKLQkgIGlmIChleGlzdGluZ1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT0gbnVsbCkKLQkJICByZXR1cm4gbmV3VmFsdWU7Ci0JICAJICAJIAotCSAgcmV0dXJuIGV4aXN0aW5nVmFsdWUgKyAiICIgKyBuZXdWYWx1ZTsKLSAgfQotICAgIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsI2xvYWRFeHRlbnNpb25zKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGxvYWRFeHRlbnNpb25zICgpCi0gIHsKLQkvLyBrZWVwIHRyYWNrIG9mIHRoZSBzdXBwb3J0IHJ1bnRpbWVzIGZvciBlYWNoIHRlc3QgZmFjaWxpdHkgSUQKLSAgICBIYXNodGFibGUgc3VwcG9ydGVkQ2xpZW50UnVudGltZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSBnZXRDb25maWdFbGVtZW50cygpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIFN0cmluZyBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKCAibGFiZWwiICk7Ci0gICAgICBTdHJpbmcgaWQgPSAgIGVsZW0uZ2V0QXR0cmlidXRlKCAiaWQiICk7ICAgICAgCi0gICAgICAKLSAgICAgIC8vIGxhYmVsIGlzIGZvdW5kLCBoZW5jZSB3ZSBoYXZlIGEgbWFzdGVyIGV4dGVuc2lvbiBlbGVtZW50Ci0gICAgICBpZiAobGFiZWwgIT0gbnVsbCkgewotICAgIAkgIFdlYlNlcnZpY2VFeHRlbnNpb24gd2ViU2VydmljZUV4dGVuc2lvbiA9IGNyZWF0ZVdlYlNlcnZpY2VFeHRlbnNpb24oZWxlbSk7CQotICAgIAkgIG5hbWVFeHRlbnNpb25UYWJsZV8ucHV0KGxhYmVsLHdlYlNlcnZpY2VFeHRlbnNpb24pOwotICAgIAkgIGxhYmVsXy5hZGQobGFiZWwpOwotICAgIAkgIGlkXy5hZGQoaWQpOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBzbGF2ZSBleHRlbnNpb24gZWxlbWVudCwgd2hpY2ggb25seSBoYXMgdGhlIGlkIGFuZCBzdXBwb3J0ZWRDbGllbnRSdW50aW1lcyBhdHRyaWJ1dGVzCi0gICAgICBlbHNlIHsKLSAgICAJICBTdHJpbmcgZXhpc3RpbmdWYWx1ZSA9IChTdHJpbmcpIHN1cHBvcnRlZENsaWVudFJ1bnRpbWVzLmdldChpZCk7Ci0gICAgCSAgU3RyaW5nIG5ld1ZhbHVlID0gZ2VuTmV3VmFsdWUoZXhpc3RpbmdWYWx1ZSwgZWxlbS5nZXRBdHRyaWJ1dGUoInN1cHBvcnRlZENsaWVudFJ1bnRpbWVzIikpOwotICAgIAkgIAotICAgIAkgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgIAkJICBzdXBwb3J0ZWRDbGllbnRSdW50aW1lcy5wdXQoaWQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gbWVyZ2UgYW55IHN1cHBvcnRlZENsaWVudFJ1bnRpbWVzIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2xhdmUgZWxlbWVudHMgYmFjayB0byB0aGUgbWFzdGVyIGVsZW1lbnRzCi0gICAgCi0gICAgSXRlcmF0b3IgaXRlciA9IG5hbWVFeHRlbnNpb25UYWJsZV8udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAJV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd2ViU2VydmljZVRlc3RFeHRlbnNpb24gPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pIGl0ZXIubmV4dCgpOwotICAgIAotICAgIAkvLyBza2lwIGlmIHRoZSBleHRlbnNpb24gZG9lcyBub3QgYWxsb3cgcmVzdHJpY3Rpb24gb24gdGhlIHN1cHBvcnRlZCBjbGllbnQgcnVudGltZXMKLSAgICAJaWYgKHdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uLmFsbG93Q2xpZW50UnVudGltZXNSZXN0cmljdGlvbigpKSB7Ci0gICAgCQlTdHJpbmcgaWQgPSB3ZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5nZXRJZCgpOwotICAgIAkJd2ViU2VydmljZVRlc3RFeHRlbnNpb24uYWRkUnVudGltZXMoKFN0cmluZykgc3VwcG9ydGVkQ2xpZW50UnVudGltZXMuZ2V0KGlkKSk7Ci0gICAgCX0KLSAgICB9ICAgIAotICB9Ci0gIAotICAvKioKLSAgKiBDaGlsZHJlbiByZWdpc3RyaWVzIHdpbGwgaGF2ZSBkaWZmZXJlbnQgZXh0ZW5zaW9uIHR5cGVzIAotICAqIEByZXR1cm4gV2Vic2VydmljZUV4dGVuc2lvbiBob2xkcyBhIGNvbmZpZyBlbGVtCi0gICogZm9yIHRoYXQgZXh0ZW5zaW9uIGNhcGFibGUgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uIGNyZWF0ZVdlYlNlcnZpY2VFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKGNvbmZpZ0VsZW1lbnQpOwotICB9Ci0KLSAgLyoqCi0gICogQ2hpbGRyZW4gbXVzdCBpbXBsZW1lbnQgaG93IHRoZXkgZ2V0IHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSAKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGFuIGFycmF5IG9mIGVsZW1lbnRzIHBhcnRpY3VsYXIgdG8gdGhhdAotICAqIGV4dGVuc2lvbgotICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29uZmlnRWxlbWVudHMoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGVyIik7Ci0gICAgcmV0dXJuIGNvbmZpZzsgICAgCi0gIH0KLQotCi0gICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTIwZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNCAgIDExNTY5MCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuVURESVByZWZlcmVuY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBwbHVnaW4uCi0qIDxwPgotKiBUaGlzIHBsdWdpbiBjb250YWlucyB0aGUgYnVsayBvZiB0aGUgV2ViIFNlcnZpY2VzIHJ1bnRpbWUuCi0qIE9ubHkgdGhlIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBwb3J0aW9uIG9mIHRoZSBydW50aW1lIGlzCi0qIGZvdW5kIGVsc2V3aGVyZSAtIGluIHRoZSBvcmcuZWNsaXBzZS5qc3Qud3MudWkgcGx1Z2luLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0gIC8qKgotICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC53cyI7Ci0KLSAgLyoqCi0gICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlUGx1Z2luIGluc3RhbmNlXzsKLQotICBwcml2YXRlIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0XzsKLSAgcHJpdmF0ZSBQZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0IHNjZW5hcmlvQ29udGV4dF87Ci0gIHByaXZhdGUgUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dCB1ZGRpUHJlZmVyZW5jZUNvbnRleHQ7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZVBsdWdpbigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGluc3RhbmNlXyA9IHRoaXM7IAotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICogQHJldHVybiBUaGUgV2ViU2VydmljZVBsdWdpbiBzaW5nbGV0b24uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSAKLSAgewotICAJCSgoUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dCkgZ2V0VURESVByZWZlcmVuY2VDb250ZXh0KCkpLmxvYWQoKTsKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkKLSAgewotICAJCWlmIChyZXNvdXJjZUNvbnRleHRfID09IG51bGwpIAotICAJCQlyZXNvdXJjZUNvbnRleHRfID0gUGVyc2lzdGVudFJlc291cmNlQ29udGV4dC5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gcmVzb3VyY2VDb250ZXh0XzsKLSAgfQotCi0gIHB1YmxpYyBTY2VuYXJpb0NvbnRleHQgZ2V0U2NlbmFyaW9Db250ZXh0KCkKLSAgewotICAJCWlmIChzY2VuYXJpb0NvbnRleHRfID09IG51bGwpCi0gIAkJewotICAJCSAgc2NlbmFyaW9Db250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0KCk7Ci0gIAkJICBzY2VuYXJpb0NvbnRleHRfLmxvYWQoKTsKLSAgCQl9Ci0KLQkJcmV0dXJuIHNjZW5hcmlvQ29udGV4dF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBVRERJUHJlZmVyZW5jZUNvbnRleHQgZ2V0VURESVByZWZlcmVuY2VDb250ZXh0KCkKLSAgewotICAgIGlmICh1ZGRpUHJlZmVyZW5jZUNvbnRleHQgPT0gbnVsbCkKLSAgICAgIHVkZGlQcmVmZXJlbmNlQ29udGV4dCA9IG5ldyBQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0KCk7Ci0gICAgcmV0dXJuIHVkZGlQcmVmZXJlbmNlQ29udGV4dDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUphdmFDbGllbnRJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUphdmFDbGllbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTAwMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VKYXZhQ2xpZW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDYyMCAgIDE0Nzg2NCBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLQotLyoqCi0gKiBUaGlzIHN1YmNsYXNzIG9mIFdlYlNlcnZpY2VDbGllbnRJbmZvIGFkZHMgcHJvcGVydGllcwotICogcmVsZXZhbnQgdG8gZGVzY3JpcHRvcnMgb2YgSmF2YSBXZWIgc2VydmljZSBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUphdmFDbGllbnRJbmZvIGV4dGVuZHMgV2ViU2VydmljZUNsaWVudEluZm8KLXsKLQlwcml2YXRlIElUeXBlIGpkdFR5cGVfOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpEVCBJVHlwZSBvZiB0aGUgcHJpbWFyeSBKYXZhIHByb3h5IGNsYXNzCi0JICogb2YgYSBXZWIgc2VydmljZSBjbGllbnQsIG9yIG51bGwgaWYgbm8gc3VjaCBjbGFzcyBoYXMKLQkgKiBiZWVuIGxvY2F0ZWQuCi0JICogQHJldHVybiBUaGUgSkRUIElUeXBlIG9mIHRoZSBKYXZhIGNsaWVudCBwcm94eSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0VHlwZSAoKQotCXsKLQkJcmV0dXJuIGpkdFR5cGVfOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBKRFQgSVR5cGUgb2YgdGhlIHByaW1hcnkgSmF2YSBwcm94eSBjbGFzcwotCSAqIG9mIGEgV2ViIHNlcnZpY2UgY2xpZW50LgotCSAqIEBwYXJhbSBqZHRUeXBlIFRoZSBKRFQgSVR5cGUgb2YgdGhlIEphdmEgY2xpZW50IHByb3h5IGNsYXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUgKCBJVHlwZSBqZHRUeXBlICkKLQl7Ci0JCWpkdFR5cGVfID0gamR0VHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUphdmFJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUphdmFJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDllYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VKYXZhSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDYyMCAgIDE0Nzg2NCBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotLyoqCi0gKiBUaGlzIHN1YmNsYXNzIG9mIFdlYlNlcnZpY2VJbmZvIGFkZHMgcHJvcGVydGllcwotICogcmVsZXZhbnQgdG8gZGVzY3JpcHRvcnMgb2YgSmF2YSBXZWIgc2VydmljZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlSmF2YUluZm8gZXh0ZW5kcyBXZWJTZXJ2aWNlSW5mbwotewotCXByaXZhdGUgSVR5cGUgamR0VHlwZV87Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkRUIElUeXBlIG9mIHRoZSBwcmltYXJ5IEphdmEgaW1wbGVtZW50YXRpb24KLQkgKiBjbGFzcyBvZiBhIFdlYiBzZXJ2aWNlLCBvciBudWxsIGlmIG5vIHN1Y2ggY2xhc3MgaGFzCi0JICogYmVlbiBsb2NhdGVkLgotCSAqIEByZXR1cm4gVGhlIEpEVCBJVHlwZSBvZiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0VHlwZSAoKQotCXsKLQkJcmV0dXJuIGpkdFR5cGVfOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBKRFQgSVR5cGUgb2YgdGhlIHByaW1hcnkgSmF2YSBpbXBsZW1lbnRhdGlvbgotCSAqIGNsYXNzIG9mIGEgV2ViIHNlcnZpY2UuCi0JICogQHBhcmFtIGpkdFR5cGUgVGhlIEpEVCBJVHlwZSBvZiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlICggSVR5cGUgamR0VHlwZSApCi0JewotCQlqZHRUeXBlXyA9IGpkdFR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjhjN2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1ydW50aW1lCi10ZW1wLmZvbGRlcgotZW52dWkuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWIwYjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3YWVlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIEphbiAzMCAxMDozNzoyOCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWU4NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjQwOjMwIEVTVCAyMDA2Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiOTE3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAzLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLnBsdWdpbi5FbnZVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmNvbW1vbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2c7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uub3NnaTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ3ZTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotc3JjLmluY2x1ZGVzID0gc2NoZW1hLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnRfYnVpbGRmaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL2ljb25zL2Z1bGwvb2JqMTYvYW50X2J1aWxkZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjM0NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnRfYnVpbGRmaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2FudGZpbGVzX3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdhbnRmaWxlc193aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjIzYzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2FudGZpbGVzX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzU3ZWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9RW52aXJvbm1lbnQgQ29tbWFuZCBGcmFtZXdvcmsgKEdVSSkKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1XSURHRVRfUkVHSVNUUllfTkFNRT1XaWRnZXQgY29udHJpYnV0b3IgcmVnaXN0cnkKLQotUExVR0lOX1hQX0FOVF9XSVpBUkRfTkFNRT1BbnQgRmlsZXMKLVBMVUdJTl9YUF9BTlRfV0laQVJEX0RFU0M9Q3JlYXRlIEFudCBzY3JpcHQgYW5kIHByb3BlcnRpZXMgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDYzOTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX1hQX0FOVF9XSVpBUkRfTkFNRSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvYW50X2J1aWxkZmlsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nLkFudEZpbGVJbXBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLkFudEZpbGVJbXBvcnRXaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVBMVUdJTl9YUF9BTlRfV0laQVJEX0RFU0MKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBsaWtlbHkgdG8gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndpZGdldFJlZ2lzdHJ5IiBuYW1lPSIlV0lER0VUX1JFR0lTVFJZX05BTUUiIHNjaGVtYT0ic2NoZW1hL3dpZGdldFJlZ2lzdHJ5LmV4c2QiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zY2hlbWEvd2lkZ2V0UmVnaXN0cnkuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NjaGVtYS93aWRnZXRSZWdpc3RyeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZjYzdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NjaGVtYS93aWRnZXRSZWdpc3RyeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpIiBpZD0id2lkZ2V0UmVnaXN0cnkiIG5hbWU9IldpZGdldCBSZWdpc3RyeSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2lkZ2V0RmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpZGdldEZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRCZWZvcmVDb21tYW5kSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvRW52aXJvbm1lbnRVSS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9FbnZpcm9ubWVudFVJLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMGViZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9FbnZpcm9ubWVudFVJLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNjA1MDkgICAxMTkyOTYgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1CVVRUT05fU0hPV19BTExfRElBTE9HUz0mU2hvdyBBbGwKLUJVVFRPTl9ISURFX0FMTF9ESUFMT0dTPSZIaWRlIEFsbAotQ0hFQ0tCT1hfRE9fTk9UX1NIT1dfRElBTE9HX0FHQUlOPURvIG5vdCBzaG93IG1lIHRoaXMgZGlhbG9nIGJveCBhZ2Fpbi4KLQotVE9PTFRJUF9QUEFEX1BBR0U9Q29udHJvbCB0byBzaG93L2hpZGUgdGhlIGRpYWxvZ3MgdGhhdCBhcHBlYXIgd2hlbiBhIHBvcC11cCBhY3Rpb24gaXMgZXhlY3V0ZWQuCi1UT09MVElQX0RPX05PVF9TSE9XX0RJQUxPR19BR0FJTj1UbyBhbGxvdyB0aGlzIGRpYWxvZyB0byBzaG93IGFnYWluLCBlbmFibGUgZnJvbSBwcmVmZXJlbmNlIC0gZGlhbG9ncy4KLVRPT0xUSVBfUFBBRF9CVVRUT05fU0hPV19BTEw9U2hvdyBhbGwgZGlhbG9ncy4KLVRPT0xUSVBfUFBBRF9CVVRUT05fSElERV9BTEw9SGlkZSBhbGwgZGlhbG9ncyBhbmQgZXhlY3V0ZSBwb3AtdXAgYWN0aW9ucy4KLQotV0laQVJEX1RJVExFX0FOVD1DcmVhdGUgQW50IEZpbGVzCi1XSVpBUkRfUEFHRV9USVRMRV9BTlQ9Q3JlYXRlIFdlYiBTZXJ2aWNlIEFudCBmaWxlcwotV0laQVJEX1BBR0VfREVTQ19BTlQ9U2VsZWN0IHdvcmtzcGFjZSBmb2xkZXIgZm9yIEFudCBzY3JpcHQgYW5kIHByb3BlcnRpZXMgZmlsZXMKLU1TR19TVEFUVVNfQ09QWUlOR19BTlRfRklMRVM9Q29weWluZyB3ZWIgc2VydmljZXMgQW50IGZpbGVzCi1NU0dfRVJSX0NPUFlJTkdfQU5UX0ZJTEVTPUVycm9yIGVuY291bnRlcmVkIGNvcHlpbmcgQW50IGZpbGVzCi1NU0dfV0FSTklOR19GSUxFX0VYSVNUUz1UaGUgZmlsZSB7MH0gZXhpc3RzLiAgRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlPwotRElBTE9HX1RJVExFX09WRVJXUklURT1Db25maXJtIE92ZXJ3cml0ZQotCi1NU0dfRVJST1JfV0laQVJEX0lEX05PVF9GT1VORD1JV0FCMDAxM0UgQ291bGQgbm90IGZpbmQgd2l6YXJkIGlkOiB7MH0KLU1TR19FUlJPUl9PUEVSQVRJT05fVElNRURfT1VUPU9wZXJhdGlvbiB0aW1lZCBvdXQuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL0Vudmlyb25tZW50VUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9FbnZpcm9ubWVudFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzMWQ4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL0Vudmlyb25tZW50VUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTA5ICAgMTE5Mjk2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRW52aXJvbm1lbnRVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuRW52aXJvbm1lbnRVSSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFbnZpcm9ubWVudFVJTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9TSE9XX0FMTF9ESUFMT0dTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVVFRPTl9ISURFX0FMTF9ESUFMT0dTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENIRUNLQk9YX0RPX05PVF9TSE9XX0RJQUxPR19BR0FJTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BQQURfUEFHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX0RPX05PVF9TSE9XX0RJQUxPR19BR0FJTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BQQURfQlVUVE9OX1NIT1dfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFBBRF9CVVRUT05fSElERV9BTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1dJWkFSRF9JRF9OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0laQVJEX1RJVExFX0FOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXSVpBUkRfUEFHRV9USVRMRV9BTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0laQVJEX1BBR0VfREVTQ19BTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NUQVRVU19DT1BZSU5HX0FOVF9GSUxFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJSX0NPUFlJTkdfQU5UX0ZJTEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19XQVJOSU5HX0ZJTEVfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJQUxPR19USVRMRV9PVkVSV1JJVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9PUEVSQVRJT05fVElNRURfT1VUOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRW52aXJvbm1lbnRVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2NvbW1vbi9UaW1lZE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9jb21tb24vVGltZWRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxMmRjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2NvbW1vbi9UaW1lZE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUwNCAgIDExOTI5NiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDgyMiAgIDE1NDc1MCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuRW52aXJvbm1lbnRVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgVGltZWRPcGVyYXRpb24gaW1wbGVtZW50cyBJVW5kb2FibGVPcGVyYXRpb24KLXsKLSAgcHJpdmF0ZSBBYnN0cmFjdE9wZXJhdGlvbiBvcGVyYXRpb247Ci0gIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgdGltZW91dDsKLSAgcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yICB0ZW1wTW9uaXRvcjsKLSAgcHJpdmF0ZSBJQWRhcHRhYmxlICAgICAgICB0ZW1wSW5mbzsKLSAgcHJpdmF0ZSBJU3RhdHVzICAgICAgICAgICByZXR1cm5TdGF0dXM7Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgb3BlcmF0aW9uQ29tcGxldGU7Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgdGltZU91dE1lc3NhZ2U7Ci0gIAotICBwdWJsaWMgVGltZWRPcGVyYXRpb24oIEFic3RyYWN0T3BlcmF0aW9uIG9wZXJhdGlvbiwgaW50IHRpbWVvdXQsIFN0cmluZyB0aW1lT3V0TWVzc2FnZSApCi0gIHsKLSAgICB0aGlzLm9wZXJhdGlvbiAgICAgID0gb3BlcmF0aW9uOwotICAgIHRoaXMudGltZW91dCAgICAgICAgPSB0aW1lb3V0OwotICAgIHRoaXMudGltZU91dE1lc3NhZ2UgPSB0aW1lT3V0TWVzc2FnZTsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIAotICB7Ci0gICAgVGhyZWFkICBleGVjdXRlVGhyZWFkID0gbmV3IFRocmVhZCggbmV3IE9wZXJhdGlvblJ1bm5hYmxlKCkgKTsKLSAgICAKLSAgICByZXR1cm5TdGF0dXMgICAgICA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgdGVtcE1vbml0b3IgICAgICAgPSBtb25pdG9yOwotICAgIHRlbXBJbmZvICAgICAgICAgID0gaW5mbzsKLSAgICBvcGVyYXRpb25Db21wbGV0ZSA9IGZhbHNlOwotICAgIGV4ZWN1dGVUaHJlYWQuc3RhcnQoKTsKLSAgICAKLSAgICBzeW5jaHJvbml6ZWQoIG9wZXJhdGlvbiApCi0gICAgewotICAgICAgd2hpbGUoICFvcGVyYXRpb25Db21wbGV0ZSApCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgb3BlcmF0aW9uLndhaXQodGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbWVzc2FnZSAgICAgPSBleGMuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsImlkIiwgMCwgbWVzc2FnZSA9PSBudWxsID8gIiIgOiBtZXNzYWdlLCBleGMgKTsKLSAgICAgICAgICBleGVjdXRlVGhyZWFkLmludGVycnVwdCgpOwotICAgICAgICAgIHJldHVybiBlcnJvclN0YXR1czsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoICFvcGVyYXRpb25Db21wbGV0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZSB0aW1lZCBvdXQsIHNpbmNlIHRoZSBleGVjdXRpb24gdGhyZWFkIGhhc24ndCBzZXQgb3BlcmF0aW9uQ29tcGxldGUgCi0gICAgICAgICAgLy8gdG8gdHJ1ZS4KLSAgICAgICAgICBTdGF0dXMgIGVycm9yU3RhdHVzID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwiaWQiLCAwLCBFbnZpcm9ubWVudFVJTWVzc2FnZXMuTVNHX0VSUk9SX09QRVJBVElPTl9USU1FRF9PVVQsIG51bGwpOwotICAgICAgICAgIFNoZWxsICAgc2hlbGwgICAgICAgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gICAgICAgICAgYm9vbGVhbiB3YWl0TW9yZSAgICA9IE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIEVudmlyb25tZW50VUlNZXNzYWdlcy5NU0dfRVJST1JfT1BFUkFUSU9OX1RJTUVEX09VVCwgdGltZU91dE1lc3NhZ2UgKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiggIXdhaXRNb3JlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBleGVjdXRlVGhyZWFkLmludGVycnVwdCgpOwotICAgICAgICAgICAgb3BlcmF0aW9uQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGVycm9yU3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBXZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiAgVGhlcmVmb3JlIHJldHVybiB0aGUgc3RhdHVzIHNldCBpbiB0aGUgZm9ya2VkCi0gICAgLy8gdGhyZWFkLgotICAgIHJldHVybiByZXR1cm5TdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIE9wZXJhdGlvblJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUKLSAgewotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJldHVyblN0YXR1cyA9IG9wZXJhdGlvbi5leGVjdXRlKHRlbXBNb25pdG9yLCB0ZW1wSW5mbyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggVGhyb3dhYmxlIGV4YyApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXhjLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVyblN0YXR1cyA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsImlkIiwgMCwgbWVzc2FnZSA9PSBudWxsID8gIiIgOiBtZXNzYWdlLCBleGMgKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBvcGVyYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgb3BlcmF0aW9uQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgIG9wZXJhdGlvbi5ub3RpZnkoKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uLnJlZG8obW9uaXRvciwgaW5mbyk7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uLnVuZG8obW9uaXRvciwgaW5mbyk7Ci0gIH0KLSAgcHVibGljIElVbmRvQ29udGV4dFtdIGdldENvbnRleHRzKCkKLSAgewotICAgIHJldHVybiBvcGVyYXRpb24uZ2V0Q29udGV4dHMoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc0NvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uLmhhc0NvbnRleHQoY29udGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRDb250ZXh0KElVbmRvQ29udGV4dCBjb250ZXh0KQotICB7Ci0gICAgb3BlcmF0aW9uLmFkZENvbnRleHQoY29udGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLSAgewotICAgIHJldHVybiBvcGVyYXRpb24uY2FuRXhlY3V0ZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVkbygpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uLmNhblJlZG8oKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhblVuZG8oKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbi5jYW5VbmRvKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIG9wZXJhdGlvbi5kaXNwb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgewotICAgIHJldHVybiBvcGVyYXRpb24uZ2V0TGFiZWwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICBvcGVyYXRpb24ucmVtb3ZlQ29udGV4dChjb250ZXh0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBuYW1lKQotICB7Ci0gICAgb3BlcmF0aW9uLnNldExhYmVsKG5hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9BbnRGaWxlSW1wb3J0V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9BbnRGaWxlSW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2QxNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvQW50RmlsZUltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTUgICAxMjg3MTEgam9hbkBjYS5pYm0uY29tIC0gSm9hbiBIYWdnYXJ0eQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wbHVnaW4uRW52UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5FbnZpcm9ubWVudFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLnBsdWdpbi5FbnZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBBbnRGaWxlSW1wb3J0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvL3ByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZDb25maWdFbGVtZW50OwotCXByaXZhdGUgQW50RmlsZUltcG9ydFdpemFyZFBhZ2UgbWFpblBhZ2U7Ci0JLyoqCi0gICAgICogVGhlIHdvcmtiZW5jaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0gICAgCi0JcHVibGljIEFudEZpbGVJbXBvcnRXaXphcmQoKQotCXsKLQkJc3VwZXIoKTsJCSAKLQkJc2V0V2luZG93VGl0bGUoRW52aXJvbm1lbnRVSU1lc3NhZ2VzLldJWkFSRF9USVRMRV9BTlQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXaW5kb3dUaXRsZShTdHJpbmcgbmV3VGl0bGUpIHsKLQkJc3VwZXIuc2V0V2luZG93VGl0bGUobmV3VGl0bGUpOwotCX0KLQkKLQkgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JICAgICAgICBzdXBlci5hZGRQYWdlcygpOwkgICAgICAgIAotCSAgICAgICAgbWFpblBhZ2UgPSBuZXcgQW50RmlsZUltcG9ydFdpemFyZFBhZ2UoRW52aXJvbm1lbnRVSU1lc3NhZ2VzLldJWkFSRF9QQUdFX1RJVExFX0FOVCwgZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgYWRkUGFnZShtYWluUGFnZSk7Ci0JICAgIH0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewkKLQkJSVBhdGggZGVzdGluYXRpb24gPSBtYWluUGFnZS5nZXRQYXRoKCk7Ci0JCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCQkKLQkJZWxzZQotCQl7Ci0JCQkvL2p2aDogVE9ETzogYWRkIGV4dGVuc2lvbiBzbyBleHRlbmRlcnMgb2YgdGhlIGNvbW1hbmQgZnJhbWV3b3JrIGNhbiByZWdpc3RlciBwcm9wZXJ0aWVzIGZpbGVzIHRvIGltcG9ydAotCQkJLy8gIGhlcmUgd2UgcGljayB1cCBhbGwgcmVnaXN0ZXJlZCBBbnQgZmlsZXMgYW5kIGltcG9ydCAtIGFsc28gd291bGQgYmUgbmljZSB0byBhbGxvdyB1c2VyIHRvIGNob29zZSBhIHN1YnNldAotCQkJU3RyaW5nW10gc291cmNlRmlsZXMgPSBuZXcgU3RyaW5nW117ImFudC93c2dlbi54bWwiLCAiYW50L2F4aXNjbGllbnQucHJvcGVydGllcyIsICJhbnQvYXhpc3NlcnZpY2UucHJvcGVydGllcyJ9OyAvLyROT04tTkxTJAotCQkJaW50IGZpbGVjb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZpbGVTb3VyY2UgPSBzb3VyY2VGaWxlc1tpXTsKLQkJCQlTdHJpbmcgdGFyZ2V0RmlsZSA9IGZpbGVTb3VyY2U7Ci0JCQkJLy9zdHJpcCBhbnkgbGVhZGluZyBzZWdtZW50cyBvZmYgb2YgdGFyZ2V0RmlsZQotCQkJCWludCBmaWxlU3RhcnQgPSB0YXJnZXRGaWxlLmxhc3RJbmRleE9mKCIvIik7Ci0JCQkJaWYgKGZpbGVTdGFydCA+PSAwKQotCQkJCXsKLQkJCQkgIHRhcmdldEZpbGUgPSB0YXJnZXRGaWxlLnN1YnN0cmluZyhmaWxlU3RhcnQpOwotCQkJCX0KLQkJCQlQbHVnaW4gc291cmNlUGx1Z2luID0gRW52UGx1Z2luLmdldEluc3RhbmNlKCk7ICAKLQkJCQkvL2p2aDogVE9ETyAtIGFkZCByZWFsIHByb2dyZXNzIG1vbml0b3IgaW4gaGVyZS4uLgotCQkJCQkJCQkKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNvcHlJRmlsZShzb3VyY2VQbHVnaW4sIGZpbGVTb3VyY2UsIGRlc3RpbmF0aW9uLCB0YXJnZXRGaWxlLCAoSVByb2dyZXNzTW9uaXRvciluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlpZiAoc3RhdHVzID09IFN0YXR1cy5DQU5DRUxfU1RBVFVTKQotCQkJCXsKLQkJCQkJZmlsZWNvdW50Kys7Ci0JCQkJfQkJCQkJCQkJCi0JCQl9Ci0JCQlpZiAoZmlsZWNvdW50ID09IHNvdXJjZUZpbGVzLmxlbmd0aCkKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvL2Rvbid0IGNsb3NlIGlmIGFsbCBmaWxlcyB3ZXJlIG5vdCB3cml0dGVuIG91dCAtIGdpdmUgdXNlciBvcHBvcnR1bml0eSB0byBjaGFuZ2UgZGVzdGluYXRpb24KLQkJCX0KLQkJfQotCSAgICByZXR1cm4gdHJ1ZTsJCQotICB9CQotCQotCXByaXZhdGUgSVN0YXR1cyBjb3B5SUZpbGUoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHNvdXJjZSwgSVBhdGggdGFyZ2V0UGF0aCwgU3RyaW5nIHRhcmdldEZpbGUsIC8qSUVudmlyb25tZW50IGVudiwqLyBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCXsKLQkgICAgCi0JICBpZiAocGx1Z2luICE9IG51bGwpCi0JICB7Ci0JICAgIElQYXRoIHRhcmdldCA9IHRhcmdldFBhdGguYXBwZW5kKG5ldyBQYXRoKHRhcmdldEZpbGUpKTsKLQkgICAgCi0JICAgIFByb2dyZXNzVXRpbHMucmVwb3J0KCBtb25pdG9yLCBFbnZpcm9ubWVudFVJTWVzc2FnZXMuTVNHX1NUQVRVU19DT1BZSU5HX0FOVF9GSUxFUyk7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgIFJlc291cmNlQ29udGV4dCBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotCSAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgZmlsZSBleGlzdHMgYmVmb3JlIGNvcHkKLQkgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gRmlsZVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHRhcmdldCk7CSAgICAgCi0JICAgICAgIAotCSAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCXsKLQkJCQlNZXNzYWdlQm94IG92ZXJ3cml0ZUJveCA9IG5ldyBNZXNzYWdlQm94KGdldFNoZWxsKCksIFNXVC5JQ09OX1FVRVNUSU9OfFNXVC5ZRVN8U1dULk5PKTsKLQkJCQlvdmVyd3JpdGVCb3guc2V0TWVzc2FnZShFbnZpcm9ubWVudFVJTWVzc2FnZXMuYmluZChFbnZpcm9ubWVudFVJTWVzc2FnZXMuTVNHX1dBUk5JTkdfRklMRV9FWElTVFMsIHRhcmdldC50b1N0cmluZygpKSk7CQkJCQotCQkJCW92ZXJ3cml0ZUJveC5zZXRUZXh0KEVudmlyb25tZW50VUlNZXNzYWdlcy5ESUFMT0dfVElUTEVfT1ZFUldSSVRFKTsKLQkJCQlpbnQgcmVzdWx0ID0gb3ZlcndyaXRlQm94Lm9wZW4oKTsKLQkJCQlpZiAocmVzdWx0ICE9IFNXVC5OTykKLQkJCQkJRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZShjb250ZXh0LCB0YXJnZXQsIHBsdWdpbi5vcGVuU3RyZWFtKG5ldyBQYXRoKHNvdXJjZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IsIChJU3RhdHVzSGFuZGxlciluZXcgTnVsbFN0YXR1c0hhbmRsZXIoKSk7Ci0JCQkJZWxzZSAKLQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfSAgICAgICAKLQkJCWVsc2UgCi0JCQl7Ci0JCQkJRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZShjb250ZXh0LCB0YXJnZXQsIHBsdWdpbi5vcGVuU3RyZWFtKG5ldyBQYXRoKHNvdXJjZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciwgKElTdGF0dXNIYW5kbGVyKW5ldyBOdWxsU3RhdHVzSGFuZGxlcigpKTsKLQkJCX0KLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJICAgIAkKLQkgICAgICByZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoRW52aXJvbm1lbnRVSU1lc3NhZ2VzLk1TR19FUlJfQ09QWUlOR19BTlRfRklMRVMsIGUpOwotCSAgICB9Ci0JICB9CSAgCi0JICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIHdoaWNoIHdhcyBwYXNzZWQgdG8gPGNvZGU+aW5pdDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCB3aGljaCB3YXMgcGFzc2VkIHRvIDxjb2RlPmluaXQ8L2NvZGU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgd29ya2JlbmNoCi0gICAgICovCi0gICAgcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotICAgICAgICByZXR1cm4gd29ya2JlbmNoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5CYXNpY05ld1Jlc291cmNlV2l6YXJkPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICAgICAqIDxjb2RlPklXb3JrYmVuY2hXaXphcmQ8L2NvZGU+IG1ldGhvZCByZWNvcmRzIHRoZSBnaXZlbiB3b3JrYmVuY2ggYW5kCi0gICAgICogc2VsZWN0aW9uLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIGRlZmF1bHQgYmFubmVyIGltYWdlIGZvciB0aGUgcGFnZXMKLSAgICAgKiBieSBjYWxsaW5nIDxjb2RlPmluaXRpYWxpemVEZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcjwvY29kZT4uCi0gICAgICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjsKLQotICAgICAgICBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgZGVmYXVsdCBwYWdlIGltYWdlIGRlc2NyaXB0b3IgdG8gYW4gYXBwcm9wcmlhdGUgYmFubmVyLgotICAgICAqIEJ5IGNhbGxpbmcgPGNvZGU+c2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3I8L2NvZGU+LgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHVzZXMgYSBnZW5lcmljIG5ldyB3aXphcmQgaW1hZ2UuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBFbnZVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2Z1bGwvd2l6YmFuL25ld2FudGZpbGVzX3dpei5wbmciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgYW5kIHJldmVhbHMgdGhlIG5ld2x5IGFkZGVkIHJlc291cmNlIGluIGFsbCBwYXJ0cwotICAgICAqIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdydzIGFjdGl2ZSBwYWdlLgotICAgICAqCi0gICAgICogQHNlZSBJU2V0U2VsZWN0aW9uVGFyZ2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0QW5kUmV2ZWFsKElSZXNvdXJjZSBuZXdSZXNvdXJjZSkgewotICAgICAgICBzZWxlY3RBbmRSZXZlYWwobmV3UmVzb3VyY2UsIGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byBzZWxlY3QgYW5kIHJldmVhbCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGluIGFsbAotICAgICAqIHBhcnRzIHdpdGhpbiB0aGUgc3VwcGxpZWQgd29ya2JlbmNoIHdpbmRvdydzIGFjdGl2ZSBwYWdlLgotICAgICAqIDxwPgotICAgICAqIENoZWNrcyBhbGwgcGFydHMgaW4gdGhlIGFjdGl2ZSBwYWdlIHRvIHNlZSBpZiB0aGV5IGltcGxlbWVudCA8Y29kZT5JU2V0U2VsZWN0aW9uVGFyZ2V0PC9jb2RlPiwKLSAgICAgKiBlaXRoZXIgZGlyZWN0bHkgb3IgYXMgYW4gYWRhcHRlci4gSWYgc28sIHRlbGxzIHRoZSBwYXJ0IHRvIHNlbGVjdCBhbmQgcmV2ZWFsIHRoZQotICAgICAqIHNwZWNpZmllZCByZXNvdXJjZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGJlIHNlbGVjdGVkIGFuZCByZXZlYWxlZAotICAgICAqIEBwYXJhbSB3aW5kb3cgdGhlIHdvcmtiZW5jaCB3aW5kb3cgdG8gc2VsZWN0IGFuZCByZXZlYWwgdGhlIHJlc291cmNlCi0gICAgICogCi0gICAgICogQHNlZSBJU2V0U2VsZWN0aW9uVGFyZ2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdEFuZFJldmVhbChJUmVzb3VyY2UgcmVzb3VyY2UsCi0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgaW5wdXQKLSAgICAgICAgaWYgKHdpbmRvdyA9PSBudWxsIHx8IHJlc291cmNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAocGFnZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIGdldCBhbGwgdGhlIHZpZXcgYW5kIGVkaXRvciBwYXJ0cwotICAgICAgICBMaXN0IHBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJV29ya2JlbmNoUGFydFJlZmVyZW5jZSByZWZzW10gPSBwYWdlLmdldFZpZXdSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IHJlZnNbaV0uZ2V0UGFydChmYWxzZSk7Ci0gICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHBhcnRzLmFkZChwYXJ0KTsKLSAgICAgICAgfQotICAgICAgICByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHJlZnNbaV0uZ2V0UGFydChmYWxzZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBwYXJ0cy5hZGQocmVmc1tpXS5nZXRQYXJ0KGZhbHNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc291cmNlKTsKLSAgICAgICAgSXRlcmF0b3IgaXRyID0gcGFydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSAoSVdvcmtiZW5jaFBhcnQpIGl0ci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcGFydCdzIElTZXRTZWxlY3Rpb25UYXJnZXQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIElTZXRTZWxlY3Rpb25UYXJnZXQgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSAoSVNldFNlbGVjdGlvblRhcmdldCkgcGFydDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSAoSVNldFNlbGVjdGlvblRhcmdldCkgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSVNldFNlbGVjdGlvblRhcmdldC5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNlbGVjdCBhbmQgcmV2ZWFsIHJlc291cmNlCi0gICAgICAgICAgICAgICAgZmluYWwgSVNldFNlbGVjdGlvblRhcmdldCBmaW5hbFRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgICAgICB3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxUYXJnZXQuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0FudEZpbGVJbXBvcnRXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9BbnRGaWxlSW1wb3J0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUzYTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0FudEZpbGVJbXBvcnRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZFJlc291cmNlSW1wb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuRW52aXJvbm1lbnRVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQW50RmlsZUltcG9ydFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRSZXNvdXJjZUltcG9ydFBhZ2V7Ci0JICAKLQlwdWJsaWMgQW50RmlsZUltcG9ydFdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCSAgICAgICAgc3VwZXIoIldTQW50RmlsZXNQYWdlMSIsIHNlbGVjdGlvbik7Ly8kTk9OLU5MUy0xJAotCSAgICAgICAgc2V0VGl0bGUocGFnZU5hbWUpOwkgICAgICAgIAotCSAgICAgICAgc2V0RGVzY3JpcHRpb24oRW52aXJvbm1lbnRVSU1lc3NhZ2VzLldJWkFSRF9QQUdFX0RFU0NfQU5UKTsJICAgICAgICAKLQkgICAgfQotCQotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRGaWxlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpCi0JewotCQlyZXR1cm4gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQl9Ci0JCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCS8vZG9uJ3QgbmVlZCBzb3VyY2UgZ3JvdXAKLQkJfQotCQotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRGb2xkZXJQcm92aWRlcigpIHsKLQkJIHJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcHRpb25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvL2VtcHR5IC0gZG9uJ3Qgd2FudCBhbiBvcHRpb25zIGdyb3VwIAotICAgIH0KLQkKLQkKLQkKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0Vycm9yRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9FcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmNjNzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0Vycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckRpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cKLXsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgRXJyb3JEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBPSyBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpIHx8IHN0YXR1cy5nZXRFeGNlcHRpb24oKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvSW5mb0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvSW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTZjODRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0luZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEluZm9EaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBJbmZvRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXREaWFsb2dJbWFnZSgpCi0gIHsKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL01lc3NhZ2VEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL01lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhZjcyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9NZXNzYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTA0ICAgMTI4OTg0IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGlhbG9nIGV4dGVuZHMgRGlhbG9nCi17Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0gIC8qKgotICAgKiBSZXNlcnZlIHJvb20gZm9yIHRoaXMgbWFueSBsaXN0IGl0ZW1zLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9JVEVNX0NPVU5UID0gNzsKLQotICAvKioKLSAgICogVGhlIERldGFpbHMgYnV0dG9uLgotICAgKi8KLSAgcHJvdGVjdGVkIEJ1dHRvbiBkZXRhaWxzQnV0dG9uOwotCi0gIC8qKgotICAgKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBTV1QgbGlzdCBjb250cm9sIHRoYXQgZGlzcGxheXMgdGhlIGVycm9yIGRldGFpbHMuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0OwotICBwcm90ZWN0ZWQgVGV4dCBkZXRhaWxzOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3IgZGV0YWlscyB2aWV3ZXIgaXMgY3VycmVudGx5IGNyZWF0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0Q3JlYXRlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxzQ3JlYXRlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBGaWx0ZXIgbWFzayBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggc3RhdHVzIGl0ZW1zIHRvIGRpc3BsYXkuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGRpc3BsYXlNYXNrID0gMHhGRkZGOwotCi0gIC8qKgotICAgKiBUaGUgbWFpbiBzdGF0dXMgb2JqZWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIElTdGF0dXMgc3RhdHVzOwotICAKLSAgcHJpdmF0ZSBQb2ludCBzYXZlZFNpemUgPSBudWxsOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIHRoZSBtYWluIGVycm9yIG9iamVjdCdzIGRldGFpbGVkIGVycm9ycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5TdGF0dXM8L2NvZGU+KS4KLSAgICovCi0gIHByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBzdGF0dXNMaXN0OwotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgTWVzc2FnZURpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgdGhpcy50aXRsZSA9IGRpYWxvZ1RpdGxlID09IG51bGwgPyBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlByb2JsZW1fT2NjdXJyZWQiKSA6IC8vJE5PTi1OTFMtMSQKLSAgZGlhbG9nVGl0bGU7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSA9PSBudWxsID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6IEpGYWNlUmVzb3VyY2VzLmZvcm1hdCgiUmVhc29uIiwgbmV3IE9iamVjdFtdIHsgbWVzc2FnZSwgc3RhdHVzLmdldE1lc3NhZ2UoKX0pOyAvLyROT04tTkxTLTEkCi0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgc3RhdHVzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc3RhdHVzLmdldENoaWxkcmVuKCkpOwotICAgIHRoaXMuZGlzcGxheU1hc2sgPSBkaXNwbGF5TWFzazsKLSAgICBzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gSGFuZGxlcyB0aGUgcHJlc3Npbmcgb2YgdGhlIE9rIG9yCi0gICAqIERldGFpbHMgYnV0dG9uIGluIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UKLSAgICogdGhpcyBkaWFsb2cuIElmIHRoZSBEZXRhaWxzIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIHRvZ2dsZSB0aGUgZGlzcGxheWluZwotICAgKiBvZiB0aGUgZXJyb3IgZGV0YWlscyBhcmVhLiBOb3RlIHRoYXQgdGhlIERldGFpbHMgYnV0dG9uIHdpbGwgb25seSBiZQotICAgKiB2aXNpYmxlIGlmIHRoZSBlcnJvciBiZWluZyBkaXNwbGF5ZWQgc3BlY2lmaWVzIGNoaWxkIGRldGFpbHMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkKLSAgewotICAgIGlmIChpZCA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkKLSAgICB7IC8vIHdhcyB0aGUgZGV0YWlscyBidXR0b24gcHJlc3NlZD8KLSAgICAgIHRvZ2dsZURldGFpbHNBcmVhKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLSAgICB9Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSB8fCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSk7Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMKLSAgICogb2YgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLSAgICAvLyBjcmVhdGUgY29tcG9zaXRlCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBDb21wb3NpdGUgaW1hZ2VBbmRMYWJlbCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgaW1hZ2VBbmRMYWJlbC5zZXRMYXlvdXQoZ2wpOwotICAgIGltYWdlQW5kTGFiZWwuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApKTsKLSAgICAKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICBJbWFnZSBpbWFnZSA9IGdldERpYWxvZ0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgewotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaW1hZ2VBbmRMYWJlbCwgMCk7Ci0gICAgICBpbWFnZS5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICBsYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0gICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKAotICAgICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIKLSAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIG1lc3NhZ2UKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KGltYWdlQW5kTGFiZWwsIFNXVC5SRUFEX09OTFl8U1dULldSQVApOwotICAgICAgdGV4dC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgR3JpZERhdGEgZGF0YSA9Ci0gICAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTAotICAgICAgICAgICAgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLSAgICAgIGRhdGEud2lkdGhIaW50ID0KLSAgICAgICAgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0gICAgIAotICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgdGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgIH0KLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVEcm9wRG93bkxpc3QoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSB0aGUgbGlzdAotICAgIGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgLy8gZmlsbCB0aGUgbGlzdAotICAgIHBvcHVsYXRlTGlzdChsaXN0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCkgKiBMSVNUX0lURU1fQ09VTlQ7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGxpc3RDcmVhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICBwcm90ZWN0ZWQgVGV4dCBjcmVhdGVEcm9wRG93bkRldGFpbHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGRldGFpbHMgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVAgKTsKLSAgICAvL2RldGFpbHMuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIENvbG9yIGNvbG9yID0gcGFyZW50LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKCBTV1QuQ09MT1JfV0hJVEUgKTsKLSAgICBkZXRhaWxzLnNldEJhY2tncm91bmQoY29sb3IpOwotICAgIHBvcHVsYXRlRGV0YWlscyhkZXRhaWxzLCBzdGF0dXMsIDApOwotICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgCi0gICAgZGV0YWlscy5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGRldGFpbHMuc2V0U2VsZWN0aW9uKDApOwotICAgIGRldGFpbHNDcmVhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gZGV0YWlsczsKLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0gICAqLwotICAvKioKLSAgICogRXh0ZW5kcyA8Y29kZT5XaW5kb3cub3BlbigpPC9jb2RlPi4gT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvIGRpc3BsYXkKLSAgICogdGhlIGVycm9yLiBJZiB5b3Ugc3BlY2lmaWVkIGEgbWFzayB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UKLSAgICogY2hpbGRyZW4sIHRoZSBlcnJvciBkaWFsb2cgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLSAgICogY2hpbGQgc3RhdHVzIG1hdGNoaW5nIHRoZSBtYXNrLgotICAgKi8KLSAgcHVibGljIGludCBvcGVuKCkKLSAgewotICAgIGlmIChzaG91bGREaXNwbGF5KHN0YXR1cywgZGlzcGxheU1hc2spKQotICAgIHsKLSAgICAgIHJldHVybiBzdXBlci5vcGVuKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0gIC8qKgotICAgKiBUaGlzIGVzc2VudGlhbGx5IGRvZXMgdGhlIHdvcmsgb2YgYSBmYWN0b3J5IE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0bwotICAgKiBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcKLSAgICogZGlzcGxheWVkIGRvZXMgbm90IGNvbnRhaW4gY2hpbGQgaXRlbXMsIG9yIGlmIHlvdSB3aXNoIHRvIGRpc3BsYXkgYWxsIHN1Y2gKLSAgICogaXRlbXMgd2l0aG91dCBmaWx0ZXJpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cgY2xvc2luZy4gVGhpcyB3aWxsIGJlIDxjb2RlPkRpYWxvZy5PSzwvY29kZT4gaWYgdGhlIE9LCi0gICAqICAgICAgICAgYnV0dG9uIHdhcyBwcmVzc2VkLCBvciA8Y29kZT5EaWFsb2cuQ0FOQ0VMPC9jb2RlPiBpZiB0aGlzCi0gICAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBvcGVuTWVzc2FnZSgKLSAgICBTaGVsbCBwYXJlbnQsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzKQotICB7Ci0KLSAgICBzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKQotICAgIHsKLSAgICAgIGNhc2UgSVN0YXR1cy5JTkZPIDoKLSAgICAgICAgcmV0dXJuIG9wZW5JbmZvKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBkaWFsb2dUaXRsZSwKLSAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7Ci0gICAgICBjYXNlIElTdGF0dXMuV0FSTklORyA6Ci0gICAgICAgIHJldHVybiBvcGVuV2FybmluZygKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHJldHVybiBvcGVuRXJyb3IoCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5NZXNzYWdlKAotICAgIFNoZWxsIHBhcmVudCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgQ2hvaWNlW10gb3B0aW9ucykKLSAgewotCi0gICAgcmV0dXJuIG9wZW5PcHRpb25zKAotICAgICAgcGFyZW50LAotICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICBtZXNzYWdlLAotICAgICAgc3RhdHVzLAotICAgICAgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IsCi0gICAgICBvcHRpb25zKTsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUKLSAgICogZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZCBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IHdpc2gKLSAgICogdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZQotICAgKiBjaGlsZHJlbi4gVGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotICAgKiBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cgY2xvc2luZy4gVGhpcyB3aWxsIGJlIDxjb2RlPkRpYWxvZy5PSzwvY29kZT4gaWYgdGhlIE9LCi0gICAqICAgICAgICAgYnV0dG9uIHdhcyBwcmVzc2VkLCBvciA8Y29kZT5EaWFsb2cuQ0FOQ0VMPC9jb2RlPiBpZiB0aGlzCi0gICAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBvcGVuRXJyb3IoCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIEVycm9yRGlhbG9nIGRpYWxvZyA9Ci0gICAgICBuZXcgRXJyb3JEaWFsb2cocGFyZW50U2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICByZXR1cm4gZGlhbG9nLm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5JbmZvKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBJbmZvRGlhbG9nIGRpYWxvZyA9Ci0gICAgICBuZXcgSW5mb0RpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbldhcm5pbmcoCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIFdhcm5pbmdEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBXYXJuaW5nRGlhbG9nKHBhcmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuT3B0aW9ucygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrLAotICAgIENob2ljZVtdIG9wdGlvbnMpCi0gIHsKLSAgICBPcHRpb25zRGlhbG9nIGRpYWxvZyA9Ci0gICAgICBuZXcgT3B0aW9uc0RpYWxvZygKLSAgICAgICAgcGFyZW50U2hlbGwsCi0gICAgICAgIHRpdGxlLAotICAgICAgICBtZXNzYWdlLAotICAgICAgICBzdGF0dXMsCi0gICAgICAgIGRpc3BsYXlNYXNrLAotICAgICAgICBvcHRpb25zKTsKLSAgICBkaWFsb2cub3BlbigpOwotICAgIHJldHVybiBkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcHVsYXRlcyB0aGUgbGlzdCB1c2luZyB0aGlzIGVycm9yIGRpYWxvZydzIHN0YXR1cyBvYmplY3QuIFRoaXMgd2Fsa3MgdGhlCi0gICAqIGNoaWxkIHN0YXRpIG9mIHRoZSBzdGF0dXMgb2JqZWN0IGFuZCBkaXNwbGF5cyB0aGVtIGluIGEgbGlzdC4gVGhlIGZvcm1hdAotICAgKiBmb3IgZWFjaCBlbnRyeSBpcyBzdGF0dXNfcGF0aCA6IHN0YXR1c19tZXNzYWdlIElmIHRoZSBzdGF0dXMncyBwYXRoIHdhcwotICAgKiBudWxsIHRoZW4gaXQgKGFuZCB0aGUgY29sb24pIGFyZSBvbWl0dGVkLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0IGxpc3QpCi0gIHsKLSAgICBJdGVyYXRvciBlbnVtZXJhdGlvbiA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIElTdGF0dXMgY2hpbGRTdGF0dXMgPSAoSVN0YXR1cykgZW51bWVyYXRpb24ubmV4dCgpOwotICAgICAgcG9wdWxhdGVMaXN0KGxpc3QsIGNoaWxkU3RhdHVzLCAwKTsKLSAgICB9Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0IGxpc3QsIElTdGF0dXMgc3RhdHVzLCBpbnQgbmVzdGluZykKLSAgewotICAgIGlmICghc3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGluZzsgaSsrKQotICAgIHsKLSAgICAgIHNiLmFwcGVuZCgiICAiKTsKLSAgICB9Ci0gICAgc2IuYXBwZW5kKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgIGxpc3QuYWRkKHNiLnRvU3RyaW5nKCkpOwotICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcG9wdWxhdGVMaXN0KGxpc3QsIGNoaWxkcmVuW2ldLCBuZXN0aW5nICsgMSk7Ci0gICAgfQotICB9Ci0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZURldGFpbHMoVGV4dCB0ZXh0LCBJU3RhdHVzIHN0YXR1cywgaW50IG5lc3RpbmcpCi0gIHsKLSAgICBpZiAoIXN0YXR1cy5tYXRjaGVzKGRpc3BsYXlNYXNrKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICBTdHJpbmcgICAgdGFiQ2hhcnMgICAgPSBTdHJpbmdVdGlscy5yZXBlYXQoICcgJywgbmVzdGluZyAqIDIgKTsKLSAgICBTdHJpbmcgICAgbWVzc2FnZUxpbmUgPSB0YWJDaGFycyArIHN0YXR1cy5nZXRNZXNzYWdlKCkgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgVGhyb3dhYmxlIGV4Y2VwdCAgICAgID0gc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotICAgIAotICAgIHRleHQuYXBwZW5kKCBtZXNzYWdlTGluZSApOwotICAgIAotICAgIGlmKCBleGNlcHQgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nW10gdHJhY2UgPSBTdHJpbmdVdGlscy5nZXRTdGFja1RyYWNlKCBleGNlcHQgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNlLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIHRleHQuYXBwZW5kKCB0YWJDaGFycyArICIgICAgIiArIHRyYWNlW2luZGV4XSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHBvcHVsYXRlRGV0YWlscyh0ZXh0LCBjaGlsZHJlbltpXSwgbmVzdGluZyArIDEpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBzdGF0dXMgb2JqZWN0IHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgYSBzdGF0dXMgb2JqZWN0Ci0gICAqIEBwYXJhbSBtYXNrCi0gICAqICAgICAgICAgICAgYSBtYXNrIGFzIHBlciA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RhdHVzIHNob3VsZCBiZSBkaXNwbGF5ZWQsIGFuZAotICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzaG91bGREaXNwbGF5KElTdGF0dXMgc3RhdHVzLCBpbnQgbWFzaykKLSAgewotICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgIGlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBzdGF0dXMubWF0Y2hlcyhtYXNrKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoY2hpbGRyZW5baV0ubWF0Y2hlcyhtYXNrKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKioKLSAgICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyCi0gICAqIHByZXNzaW5nIHRoZSBkZXRhaWxzIGJ1dHRvbi4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpCi0gIHsKLSAgICBQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0gICAgaW50ICAgbmV3SGVpZ2h0ICA9IC0xOwotICAgIAotICAgIGlmIChkZXRhaWxzQ3JlYXRlZCkKLSAgICB7Ci0gICAgICBkZXRhaWxzLmRpc3Bvc2UoKTsKLSAgICAgIGRldGFpbHNDcmVhdGVkID0gZmFsc2U7Ci0gICAgICBkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotICAgICAgCi0gICAgICAvLyBXaXRob3V0IHRoZSBmb2xsb3dpbmcgY29tcHV0ZVNpemUgY2FsbCB0aGUgc2V0U2l6ZSBjYWxsIGJlbG93IHRocm93cyBhbiBhcnJheSBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbi4KLSAgICAgIC8vIFZlcnkgd2VpcmQuCi0gICAgICBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAKLSAgICAgIG5ld0hlaWdodCA9IHNhdmVkU2l6ZS55OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYoIHNhdmVkU2l6ZSA9PSBudWxsICkgc2F2ZWRTaXplID0gd2luZG93U2l6ZTsKLSAgICAgICAgCi0gICAgICBkZXRhaWxzID0gY3JlYXRlRHJvcERvd25EZXRhaWxzKChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotICAgICAgZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLSAgICAgIG5ld0hlaWdodCA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotICAgICAgbmV3SGVpZ2h0ID0gbmV3SGVpZ2h0IDwgMjUwID8gMjUwIDogbmV3SGVpZ2h0OwotICAgIH0KLQotICAgIG5ld0hlaWdodCA9IG5ld0hlaWdodCA+IDQwMCA/IDQwMCA6IG5ld0hlaWdodDsKLSAgICAKLSAgICBnZXRTaGVsbCgpLnNldFNpemUoIG5ldyBQb2ludCh3aW5kb3dTaXplLngsIG5ld0hlaWdodCkgKTsKLSAgICBwYXJlbnQubGF5b3V0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL09wdGlvbnNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL09wdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjZWVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9PcHRpb25zRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9uc0RpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cKLXsKLSAgcHJpdmF0ZSBDaG9pY2VbXSBjaG9pY2VzOwotICBwcml2YXRlIGludCByZXR1cm5Db2RlXzsKLQotICBwdWJsaWMgT3B0aW9uc0RpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrLAotICAgIENob2ljZVtdIGNob2ljZXMpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHRoaXMuY2hvaWNlcyA9IGNob2ljZXM7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBhIGJ1dHRvbiBmb3IgZWFjaCBvcHRpb25zCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGNob2ljZXNbaV0uZ2V0U2hvcnRjdXQoKSwgY2hvaWNlc1tpXS5nZXRMYWJlbCgpLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkKLSAgewotICAgIGlmIChpZCA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkKLSAgICAgIC8vIHdhcyB0aGUgRGV0YWlscyBidXR0b24gcHJlc3NlZD8KLSAgICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRSZXR1cm5Db2RlKGlkKTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0UmV0dXJuQ29kZShpbnQgaWQpCi0gIHsKLSAgICByZXR1cm5Db2RlXyA9IGlkOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRSZXR1cm5Db2RlKCkKLSAgewotICAgIHJldHVybiByZXR1cm5Db2RlXzsKLSAgfQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIElTdGF0dXMuSU5GTyA6Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gICAgICBjYXNlIElTdGF0dXMuV0FSTklORyA6Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9TdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL1N0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTU2Nzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL1N0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nOwotCi0vKioKLSogQ29uc3RhbnRzIGZvciBzdGF0dXMgZGlhbG9ncwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzRGlhbG9nQ29uc3RhbnRzIHsKLQotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfSUQgPSAyOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX1RPX0FMTF9JRCA9IDQ7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JRCA9IDE7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIk9LIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfSUQgPSAwOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJEZXRhaWxzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMU19JRCA9IDEzOwotCi0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyIgYnV0dG9uCi0gICovCi0gLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX0xBQkVMID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19ZRVNfTEFCRUwiKTsKLSAgLyoKLSAgKiBCdXR0b24gbGFiZWwgZm9yIHRoZSAiWWVzIHRvIGFsbCIgYnV0dG9uCi0gICovCi0gLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX1RPX0FMTF9MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX1RPX0FMTF9MQUJFTCIpOwotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJDYW5jZWwiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTkNFTF9MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfQ0FOQ0VMX0xBQkVMIik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9XYXJuaW5nRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9XYXJuaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjhlM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvV2FybmluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFdhcm5pbmdEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBXYXJuaW5nRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0ssIENhbmNlbCBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwKLSAgICAgIGZhbHNlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2VjbGlwc2UvRWNsaXBzZVN0YXR1c0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZWNsaXBzZS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzEzMzEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZWNsaXBzZS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuRW52aXJvbm1lbnRDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2cuU3RhdHVzRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBFY2xpcHNlIFVJIHZlcnNpb24gb2YgdGhlIElTdGF0dXNIYW5kbGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlU3RhdHVzSGFuZGxlciBpbXBsZW1lbnRzIElTdGF0dXNIYW5kbGVyCi17Ci0gIHByaXZhdGUgSVN0YXR1cyB3b3JzdFN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gIHByaXZhdGUgU2hlbGwgICBzaGVsbCAgICAgICA9IG51bGw7Ci0gICAgCi0gIHB1YmxpYyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpCi0gIHsgIAotICB9Ci0gIAotICBwdWJsaWMgRWNsaXBzZVN0YXR1c0hhbmRsZXIoIFNoZWxsIHRoZVNoZWxsICkKLSAgewotICAgIHNoZWxsID0gdGhlU2hlbGw7ICAKLSAgfQotICAKLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiB3b3JzdFN0YXR1czsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVzZXRTdGF0dXMoKQotICB7Ci0gICAgd29yc3RTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOyAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzLCBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkNob2ljZVtdKQotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQoIGZpbmFsIElTdGF0dXMgc3RhdHVzLCBmaW5hbCBDaG9pY2VbXSBjaG9pY2VzKSAKLSAgewotICAgIGZpbmFsIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbMV07Ci0gICAgCi0gICAgY2hlY2tTdGF0dXMoIHN0YXR1cyApOwotICAgIAotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICByZXN1bHRbMF0gPQotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoIGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnRDb3JlTWVzc2FnZXMuVElUTEVfV0FSTklORywgLy9UT0RPOiBTaG91bGQgYmUgaW5mZXJyZWQgZnJvbSBzdGF0dXMnIHNldmVyaXR5LgotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXMpOwotICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMoIHJ1bm5hYmxlICk7Ci0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQotICAgICB7Ci0gICAgICBpZiAoY2hvaWNlc1tpXS5nZXRTaG9ydGN1dCgpID09IHJlc3VsdFswXSApCi0gICAgICAgIHJldHVybiBjaG9pY2VzW2ldOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KElTdGF0dXMgc3RhdHVzKSB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIHVzZXJPayA9IGZhbHNlOwotICAgIAotICAgIGNoZWNrU3RhdHVzKCBzdGF0dXMgKTsKLSAgICAKLSAgICBzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKQotICAgIHsKLSAgICAgIC8vIGFuIGVycm9yIGhhcyBiZWVuIHJlcG9ydGVkIGFuZCB3ZSBuZWVkIHRvIHN0b3AgZXhlY3V0aW5nIHRoZSBjb21taW5nCi0gICAgICAvLyBjb21tYW5kcwotICAgICAgY2FzZSBTdGF0dXMuRVJST1IgOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSByZXBvcnRFcnJvclN0YXR1cyhzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgU3RhdHVzLldBUk5JTkcgOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSByZXBvcnRXYXJuaW5nKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgCi0gICAgICBjYXNlIFN0YXR1cy5JTkZPIDoKLSAgICAgIHsKLSAgICAgICAgdXNlck9rID0gdHJ1ZTsKLSAgICAgICAgcmVwb3J0SW5mbyhzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYoICF1c2VyT2sgKSB0aHJvdyBuZXcgU3RhdHVzRXhjZXB0aW9uKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydFdhcm5pbmcoIGZpbmFsIElTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIGZpbmFsIGludCB1c2VyUmVzcG9uc2VbXSA9IG5ldyBpbnRbMV07Ci0gICAgCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIHVzZXJSZXNwb25zZVswXSA9Ci0gICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSggZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudENvcmVNZXNzYWdlcy5USVRMRV9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgIH0KLSAgICB9OwotICAgIAotICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKCBydW5uYWJsZSApOwotICAgIAotICAgIHJldHVybiAodXNlclJlc3BvbnNlWzBdID09IFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0RXJyb3JTdGF0dXMoZmluYWwgSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSggZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnRDb3JlTWVzc2FnZXMuVElUTEVfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyggcnVubmFibGUgKTsKLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjaGVja1N0YXR1cyggSVN0YXR1cyBzdGF0dXMgKQotICB7Ci0gICAgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID4gd29yc3RTdGF0dXMuZ2V0U2V2ZXJpdHkoKSApCi0gICAgewotICAgICAgd29yc3RTdGF0dXMgPSBzdGF0dXM7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgY2hlY2tTdGF0dXMoIHN0YXR1cyApOwotICAgIHJlcG9ydEVycm9yU3RhdHVzKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8ob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oZmluYWwgSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSggZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnRDb3JlTWVzc2FnZXMuVElUTEVfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgIH0KLSAgICB9OwotICAgIAotICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKCBydW5uYWJsZSApOwotICB9Ci0gIAotICBwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkKLSAgewotICAgIGlmKCBzaGVsbCAhPSBudWxsICkgcmV0dXJuIHNoZWxsOwotICAgIAotICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotICAgIAotICAgIHJldHVybiBkaXNwbGF5ID09IG51bGwgPyBudWxsIDogZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2VjbGlwc2UvRW52aXJvbm1lbnRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9lY2xpcHNlL0Vudmlyb25tZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYTZkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2VjbGlwc2UvRW52aXJvbm1lbnRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotcHVibGljIGZpbmFsIGNsYXNzIEVudmlyb25tZW50VXRpbHMKLXsgICAgIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBlbnYgVGhpcyBzaG91bGQgYmUgYW4gRWNsaXBzZUVudmlyb25tZW50LgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBSZXNvdXJjZUNvbnRleHQuCi0gICAqLyAKLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCBJRW52aXJvbm1lbnQgZW52ICkKLSAgewotICAgIFJlc291cmNlQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICAKLSAgICBpZiggZW52IGluc3RhbmNlb2YgRWNsaXBzZUVudmlyb25tZW50ICkKLSAgICB7Ci0gICAgICBjb250ZXh0ID0gKChFY2xpcHNlRW52aXJvbm1lbnQpZW52KS5nZXRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjb250ZXh0OwotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZWNsaXBzZS9TV1RFbnZpcm9ubWVudE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZWNsaXBzZS9TV1RFbnZpcm9ubWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxMzJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2VjbGlwc2UvU1dURW52aXJvbm1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5CYXNlRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLQotcHVibGljIGNsYXNzIFNXVEVudmlyb25tZW50TWFuYWdlcgotewotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBJRW52aXJvbm1lbnQgZm9yIHRoZSBFY2xpcHNlIFNXVCBHVUkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJhc2VFY2xpcHNlRW52aXJvbm1lbnQgZ2V0TmV3U1dURW52aXJvbm1lbnQoKQotICB7Ci0gICAgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCBjb250ZXh0ICAgICAgICA9IFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLSAgICBFY2xpcHNlU3RhdHVzSGFuZGxlciAgICAgIGhhbmRsZXIgICAgICAgID0gbmV3IEVjbGlwc2VTdGF0dXNIYW5kbGVyKCk7Ci0gICAgRWNsaXBzZUVudmlyb25tZW50ICAgICAgICBlbnZpcm9ubWVudCAgICA9IG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoIG51bGwsIGNvbnRleHQsIGhhbmRsZXIgKTsKLSAgICAKLSAgICByZXR1cm4gZW52aXJvbm1lbnQ7ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9wbHVnaW4vRW52VUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcGx1Z2luL0VudlVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTVkNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9wbHVnaW4vRW52VUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEVudlVJUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFbnZVSVBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRW52VUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnZVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yICggU3RyaW5nIG5hbWUgKQotCSAgewotCSAgICB0cnkKLQkgICAgewotCSAgICAgIFVSTCBpbnN0YWxsVVJMID0gaW5zdGFuY2UuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkgICAgICBVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsbmFtZSk7Ci0JICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkgICAgfQotCSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JICAgIHsKLQkgICAgICByZXR1cm4gbnVsbDsKLQkgICAgfQotCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTRhNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNzI2ICAgMTUxODY2IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBQb3B1cCBEaWFsb2cgU2VsZWN0aW9uIHByZWZlcmVuY2VzIGRlZmF1bHRzIGluY29ycmVjdGx5IHRvIGhpZGUgYWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYucHJlZmVyZW5jZXMuQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLkVudmlyb25tZW50VUlNZXNzYWdlczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcG9wdXAgYWN0aW9ucyBwcmVmZXJlbmNlIHBhZ2UgZm9yIGEgCi0gKiBwYXJ0aWN1bGFyIGNhdGVnb3J5LiAgRm9yIGV4YW1wbGU6Ci0gKgotICogPHByZT4KLSAqICAmbHQ7ZXh0ZW5zaW9uCi0gKiAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyImZ3Q7Ci0gKiAgICAgJmx0O3BhZ2UKLSAqICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9ESUFMT0dTIgotICogICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkucHJlZmVyZW5jZXMubmFtZSIKLSAqICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzLkFjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZSIKLSAqICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSImZ3Q7Ci0gKiAgICAgJmx0Oy9wYWdlJmd0OwotICogKiA8L3ByZT4KLSAqIFRoaXMgZW50cnkgc3BlY2lmaWVzIHRoYXQgYWxsIHBvcHVwIGFjdGlvbnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogb3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSB3aWxsIGJlIGRpc3BsYXllZCBvbiB0aGlzCi0gKiBwcmVmZXJlbmNlIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgTGlzdGVuZXIsIElFeGVjdXRhYmxlRXh0ZW5zaW9uCi17Ci0gIC8qQ09OVEVYVF9JRCBQUEFEMDAwMSBmb3IgdGhlIEFjdGlvbiBEaWFsb2dzIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFBBRF9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5QUEFEMDAwMSI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIHNob3dBbGw7Ci0gIC8qQ09OVEVYVF9JRCBQUEFEMDAwMiBmb3IgdGhlICBzaG93IGFsbCBjaGVjayBib3ggb24gdGhlIEFjdGlvbiBEaWFsb2dzIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFBBRF9CVVRUT05fU0hPV19BTEwgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLlBQQUQwMDAyIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gaGlkZUFsbDsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAzIGZvciB0aGUgIGhpZGUgYWxsIGNoZWNrIGJveCBvbiB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX0JVVFRPTl9ISURFX0FMTCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuUFBBRDAwMDMiOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIGNoZWNrQm94ZXNfOwotICBwcml2YXRlIFN0cmluZyAgICBjYXRlZ29yeUlkXzsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YSggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgICBkYXRhICkKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgY2F0ZWdvcnlJZF8gICA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoICJpZCIgKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyBvbiBkZW1hbmQuCi0gICAqICAgQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHN1cGVycGFyZW50KQotICB7Ci0gICAKLSAgICBjaGVja0JveGVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBhZGRPcHRpb25hbERpYWxvZ3NDaGVja0JveGVzIChzdXBlcnBhcmVudCk7Ci0JbmV3IExhYmVsKHN1cGVycGFyZW50LCBTV1QuSE9SSVpPTlRBTCk7Ci0JCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KEVudmlyb25tZW50VUlNZXNzYWdlcy5UT09MVElQX1BQQURfUEFHRSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElORk9QT1BfUFBBRF9QQUdFICk7Ci0JCi0gICAgc2hvd0FsbCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgc2hvd0FsbC5zZXRUZXh0KEVudmlyb25tZW50VUlNZXNzYWdlcy5CVVRUT05fU0hPV19BTExfRElBTE9HUyk7Ci0gICAgc2hvd0FsbC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICBzaG93QWxsLnNldFRvb2xUaXBUZXh0KEVudmlyb25tZW50VUlNZXNzYWdlcy5UT09MVElQX1BQQURfQlVUVE9OX1NIT1dfQUxMKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNob3dBbGwsIElORk9QT1BfUFBBRF9CVVRUT05fU0hPV19BTEwgKTsKLSAgIAotICAgIGhpZGVBbGwgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGhpZGVBbGwuc2V0VGV4dChFbnZpcm9ubWVudFVJTWVzc2FnZXMuQlVUVE9OX0hJREVfQUxMX0RJQUxPR1MpOwotICAgIGhpZGVBbGwuYWRkTGlzdGVuZXIgKCBTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICBoaWRlQWxsLnNldFRvb2xUaXBUZXh0KEVudmlyb25tZW50VUlNZXNzYWdlcy5UT09MVElQX1BQQURfQlVUVE9OX0hJREVfQUxMKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhpZGVBbGwsIElORk9QT1BfUFBBRF9CVVRUT05fSElERV9BTEwgKTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOwotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgCi0gewotICAgIGlmIChzaG93QWxsID09IGV2ZW50LndpZGdldCkKLQkJaGFuZGxlU2hvd0FsbEV2ZW50KCk7Ci0gICAgCi0gICAgZWxzZSBpZiAoIGhpZGVBbGwgPT0gZXZlbnQud2lkZ2V0KQotICAgIAloYW5kbGVIaWRlQWxsRXZlbnQoKTsKLSB9Ci0KLSBwcml2YXRlIHZvaWQgaGFuZGxlU2hvd0FsbEV2ZW50ICgpCi0gewotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5lbGVtZW50cygpOwotIAlmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICAJewotICAgIAkJQnV0dG9uIGRpYWxvZyA9IChCdXR0b24pIGUubmV4dEVsZW1lbnQoKTsKLSAgICAJCWRpYWxvZy5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0gICAgCX0gICAgICAgICAgICAgICAgICAgICAgCi0gfQotCi0gcHJpdmF0ZSB2b2lkIGhhbmRsZUhpZGVBbGxFdmVudCAoKQotIHsKLSAJRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmVsZW1lbnRzKCk7Ci0gCWZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIAl7Ci0gICAgCQlCdXR0b24gZGlhbG9nID0gKEJ1dHRvbikgZS5uZXh0RWxlbWVudCgpOwotICAgIAkJZGlhbG9nLnNldFNlbGVjdGlvbiggdHJ1ZSApOwotICAgIAl9Ci0gfQotIAotIHByaXZhdGUgdm9pZCBhZGRPcHRpb25hbERpYWxvZ3NDaGVja0JveGVzICggQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBjb250ZXh0ID0gUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBkaWFsb2dzID0gY29udGV4dC5nZXREaWFsb2dzKCk7Ci0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSAKLSAgICB7Ci0gICAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBkaWFsb2cgICA9IGRpYWxvZ3NbaV07Ci0gICAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IGRpYWxvZy5nZXRDYXRlZ29yeSgpOwotICAgICAgCi0gICAgICBpZiggZGlhbG9nLmdldFNob3dDaGVja2JveCgpICYmICBjYXRlZ29yeSAhPSBudWxsICYmIGNhdGVnb3J5LmVxdWFscyggY2F0ZWdvcnlJZF8pICkKLSAgICAgIHsKLSAgICAJQnV0dG9uIGNoZWNrQm94ID0gY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBkaWFsb2cuZ2V0TmFtZSgpKTsKLSAgICAJY2hlY2tCb3guc2V0VG9vbFRpcFRleHQoIGRpYWxvZy5nZXRUb29sdGlwKCkgKTsKLSAgICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjaGVja0JveCwgZGlhbG9nLmdldEluZm9wb3AoKSApOwotICAgIAljaGVja0JveGVzXy5wdXQoZGlhbG9nLmdldElkKCksIGNoZWNrQm94KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCApCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuQ0hFQ0sgKTsKLSAgICBidXR0b24uc2V0VGV4dCggdGV4dCApOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgc3RvcmVWYWx1ZXMoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0gIHsKLSAgICBwZXJmb3JtT2soKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgIHsgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzCi0gICAqIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpCi0gIHsKLSAgICBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgY29udGV4dCA9IFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5nZXRJbnN0YW5jZSgpOyAgCi0gICAgRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmtleXMoKTsKLSAgICBmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgaWQgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7ICAgICAgICAgICAgCQotICAgICAgQnV0dG9uIGRpYWxvZyA9IChCdXR0b24pIGNoZWNrQm94ZXNfLmdldChpZCk7Ci0gICAgICBkaWFsb2cuc2V0U2VsZWN0aW9uKGNvbnRleHQuZ2V0RGVmYXVsdEJvb2xlYW4oaWQpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlcy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLSAgewotICAgIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBjb250ZXh0ID0gUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmtleXMoKTsKLSAgICBmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgaWQgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgY2hlY2tCb3hlc18uZ2V0KGlkKTsKLSAgICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0FjdGlvbkRpYWxvZ0VuYWJsZWQoaWQpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgPSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLQotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5rZXlzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgY29udGV4dC5zZXRBY3Rpb25EaWFsb2dFbmFibGVkKGlkLCAoKEJ1dHRvbiljaGVja0JveGVzXy5nZXQoaWQpKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcmVnaXN0cnkvV2lkZ2V0UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcmVnaXN0cnkvV2lkZ2V0UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiNWIzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3JlZ2lzdHJ5L1dpZGdldFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgV2lkZ2V0UmVnaXN0cnkgCi17Ci0gIHByaXZhdGUgc3RhdGljIFdpZGdldFJlZ2lzdHJ5IHJlZ2lzdHJ5XzsKLSAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIGVudHJpZXNfOwotICAKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSgpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBXaWRnZXRSZWdpc3RyeSBpbnN0YW5jZSgpCi0gIHsKLQlpZiAocmVnaXN0cnlfID09IG51bGwpCi0JewotCQlyZWdpc3RyeV8gPSBuZXcgV2lkZ2V0UmVnaXN0cnkoKTsKLQkJcmVnaXN0cnlfLmxvYWQoKTsKLQl9Ci0KLQlyZXR1cm4gcmVnaXN0cnlfOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpCi0gIHsKLSAgICByZWdpc3RyeV8gPSBudWxsOyAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGlkIHRoZSBtZXRob2RJZCB0aGF0IG1heSBoYXZlIFdpZGdldENvbnRyaWJ1dG9yIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICogQHJldHVybiByZXR1cm5zIGEgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGlmIG9uZSB3YXMgZGVmaW5lZCBpbiB0aGUgcmVnaXN0cnkuCi0gICAqIE90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBnZXRGYWN0b3J5KCBTdHJpbmcgaWQgKQotICB7Ci0JSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSAgID0gKEVudHJ5KWVudHJpZXNfLmdldCggaWQgKTsKLQkKLQlpZiggZW50cnkgIT0gbnVsbCApCi0JewotCSAgdHJ5Ci0JICB7Ci0JCWlmKCBlbnRyeS5mYWN0b3J5XyA9PSBudWxsICkKLQkJewotCQkgIGVudHJ5LmZhY3RvcnlfID0gKElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSllbnRyeS5lbGVtZW50Xy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCAiY2xhc3MiICk7Ci0JCX0KLQkJCi0JCWZhY3RvcnkgPSBlbnRyeS5mYWN0b3J5XzsKLQkgIH0KLQkgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0JICB7Ci0JICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkgIH0KLQkgIGNhdGNoKCBUaHJvd2FibGUgZXhjICkKLQkgIHsKLQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCSAgfQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGxvYWQoKQotICB7Ci0JSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Iik7Ci0JCi0JZW50cmllc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCi0JZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVsZW1lbnRzLmxlbmd0aDsgaW5kZXgrKyApCi0JewotCSAgLy8gSWYgdGhpcyBpcyBub3QgYW4gZWxlbWVudCB0aGF0IGtub3cgYWJvdXQgd2Ugd2lsbCBza2lwIGl0LgotCSAgaWYoICFlbGVtZW50c1tpbmRleF0uZ2V0TmFtZSgpLmVxdWFscygid2lkZ2V0RmFjdG9yeSIpICkgY29udGludWU7Ci0JICAKLQkgIEVudHJ5ICAgICAgICAgICAgICAgICBlbnRyeSAgICA9IG5ldyBFbnRyeSgpOwotCSAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgID0gZWxlbWVudHNbaW5kZXhdOwotCSAgU3RyaW5nICAgICAgICAgICAgICAgIGlkICAgICAgID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoICJpZCIgKTsKLQkgIFN0cmluZyAgICAgICAgICAgICAgICBtZXRob2RJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAiaW5zZXJ0QmVmb3JlQ29tbWFuZElkIiApOwotCSAgCi0JICBlbnRyeS5lbGVtZW50XyA9IGVsZW1lbnQ7Ci0JICBlbnRyeS5pZF8gICAgICA9IGlkOwotCSAgCi0JICBlbnRyaWVzXy5wdXQoIG1ldGhvZElkLCBlbnRyeSApOwotCX0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBFbnRyeQotICB7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIGlkXzsKLQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgICAgICAgICAgZWxlbWVudF87Ci0JSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGZhY3RvcnlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQWJzdHJhY3RTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9BYnN0cmFjdFNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJhYjJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9BYnN0cmFjdFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIFNpbXBsZURpYWxvZyB7Ci0JCi0JcHVibGljIEFic3RyYWN0U2VsZWN0aW9uRGlhbG9nKCBTaGVsbCBzaGVsbCwgUGFnZUluZm8gcGFnZUluZm8pCi0JewotCQlzdXBlcihzaGVsbCwgcGFnZUluZm8pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhbGxTZXR0ZXJzKCkgewotCQkvLyBleHRlbmRlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5YWJsZVNlbGVjdGlvblN0cmluZygpCi0JewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0NhbkZpbmlzaFJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQ2FuRmluaXNoUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlMGEwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQ2FuRmluaXNoUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gaW50ZXJmYWNlIGZvciBhbiBhYnN0cmFjdCBjYW4gZmluaXNoIHJlZ2lzdHJ5LgotICogVGhpcyByZWdpc3RyeSBpcyB1c3VhbGx5IGFzc29jaWF0ZSB3aXRoIGFuIEVjbGlwc2Ugd2l6YXJkLiAgVGhpcwotICogcmVnaXN0cnkgYWxsb3cgY29uZGl0aW9uIG9iamVjdCB0byBiZSBhZGRlZCB0byBpdCBpbiBvcmRlciB0bwotICogZGV0ZXJtaW5lIGlmIHRoZSB3aXphcmQgY2FuIGZpbmlzaCBvciBub3QuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhbkZpbmlzaFJlZ2lzdHJ5Ci17Ci0gIC8qKgotICAgKiBBZGQgYSBjb25kaXRpb24gb2JqZWN0IHRvIHRoZSByZWdpc3RyeS4KLSAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZGl0aW9uKCBDb25kaXRpb24gY29uZGl0aW9uICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQ29tbWFuZFdpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9Db21tYW5kV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmQ1OTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9Db21tYW5kV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRXaWRnZXRCaW5kaW5nIGV4dGVuZHMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkKLXsKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgZXh0ZW5zaW9ucyB0byByZWdpc3RlciB0aGVpciB3aWRnZXRzIHdpdGgKLSAgICogQ29tbWFuZEZyYWdtZW50cwotICAgKiAKLSAgICogQHBhcmFtIHdpZGdldFJlZ2lzdHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKCBXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSApOwotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgZXh0ZW5pb25zIHRvIHJlZ2lzdGVyIHRoZSBkYXRhIG1hcHBpbmdzCi0gICAqIHRoYXQgdGhlaXIgd2lkZ2V0cyB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gZGF0YVJlZ2lzdHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyggRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkgKTsKLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGV4dGVuc2lvbnMgdG8gcmVnaXN0ZXIgY29uZGl0aW9uIG9iamVjdHMKLSAgICogdGhhdCBjb250cm9sIGlmIHRoZSB3aXphcmQgY2FuIGZpbmlzaCBvciBub3QuCi0gICAqIAotICAgKiBAcGFyYW0gY2FuRmluaXNoUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKCBDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0NvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0NvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjg3ODQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9Db21tYW5kV2lkZ2V0QmluZGluZ0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kV2lkZ2V0QmluZGluZ0xpc3QgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIFZlY3RvciAgICAgICAgICAgICAgICAgYmluZGluZ3NfOwotICBwcml2YXRlIFZlY3RvciAgICAgICAgICAgICAgICAgZnJhZ21lbnRzXzsKLSAgcHJpdmF0ZSBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGZhY3RvcnlfOwotICAKLSAgLyoqCi0gICAqIFRoaXMgQ29tbWFuZFdpZGdldEJpbmRpbmcgY29tYmluZXMgYSBsaXN0IG9mIENvbW1hbmRXaWRnZXRCaW5kaW5ncy4KLSAgICogVGhlcmUgc2hvdWxkIGJlIHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGluIGJvdGggdGhlIGJpbmRpbmdzCi0gICAqIHBhcmFtZXRlciBhbmQgdGhlIGZyYWdtZW50cyBwYXJhbWV0ZXIuICBFbnRyaWVzIGluIGVpdGhlciBvZiB0aGUKLSAgICogYmluZGluZ3MgZm9yIGZyYWdtZW50cyB2ZWN0b3JzIGFyZSBhbGxvd2VkIHRvIGJlIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZ3MgICB0aGUgYmluZGluZ3MgdG8gY29tYmluZS4KLSAgICogQHBhcmFtIGZyYWdtZW50cyAgVGhlc2UgZnJhZ21lbnRzIHdpbGwgYmUgaW50ZXJzcGVyc2VkIHdpdGggdGhlCi0gICAqICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBiaW5kaW5nLiAgVGhlIGZpcnN0Ci0gICAqICAgICAgICAgICAgICAgICAgIGZyYWdtZW50IHdpbGwgYmUgcHV0IGJlZm9yZSB0aGUgZnJhZ21lbnQgZnJvbSB0aGUKLSAgICogICAgICAgICAgICAgICAgICAgZmlyc3QgYmluZGluZy4gIEZvbGxvd2luZyB0aGlzIHdpbGwgYmUgdGhlIHNlY29uZAotICAgKiAgICAgICAgICAgICAgICAgICBmcmFnbWVudCBmcm9tIHRoZSBmcmFnbWVudHMgdmVjdG9yIGFuZCB0aGVuIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICBzZWNvbmQgZnJhZ21lbnQgZnJvbSB0aGUgYmluZGluZ3MgdmVjdG9yLCBldGMuCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0KCBWZWN0b3IgYmluZGluZ3MsIFZlY3RvciBmcmFnbWVudHMgKQotICB7Ci0gICAgYmluZGluZ3NfICA9IGJpbmRpbmdzOyAKLSAgICBmcmFnbWVudHNfID0gZnJhZ21lbnRzOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkgCi0gIHsKLSAgICBpbnQgbGVuZ3RoID0gYmluZGluZ3NfLnNpemUoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBDb21tYW5kV2lkZ2V0QmluZGluZyBiaW5kaW5nID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKWJpbmRpbmdzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICAKLSAgICAgIGlmKCBiaW5kaW5nICE9IG51bGwgKSBiaW5kaW5nLnJlZ2lzdGVyQ2FuRmluaXNoKCBjYW5GaW5pc2hSZWdpc3RyeSApOwotICAgIH0KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSAKLSAgewotICAgIGludCBsZW5ndGggPSBiaW5kaW5nc18uc2l6ZSgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIENvbW1hbmRXaWRnZXRCaW5kaW5nIGJpbmRpbmcgPSAoQ29tbWFuZFdpZGdldEJpbmRpbmcpYmluZGluZ3NfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAgIGlmKCBiaW5kaW5nICE9IG51bGwgKSBiaW5kaW5nLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkgCi0gIHsKLSAgICBpbnQgbGVuZ3RoID0gYmluZGluZ3NfLnNpemUoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBDb21tYW5kV2lkZ2V0QmluZGluZyBiaW5kaW5nID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKWJpbmRpbmdzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICBpZiggYmluZGluZyAhPSBudWxsICkgYmluZGluZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKCB3aWRnZXRSZWdpc3RyeSApOwotICAgIH0KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5I2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKSAKLSAgewotICAgIGlmKCBmYWN0b3J5XyA9PSBudWxsICkKLSAgICB7Ci0gICAgICBmYWN0b3J5XyA9IG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTZXF1ZW5jZUZyYWdtZW50IGZyYWdtZW50TGlzdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGxlbmd0aCAgICAgICA9IGJpbmRpbmdzXy5zaXplKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgPSAoQ29tbWFuZEZyYWdtZW50KWZyYWdtZW50c18uZWxlbWVudEF0KCBpbmRleCApOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYoIGZyYWdtZW50ICE9IG51bGwgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnRMaXN0LmFkZCggZnJhZ21lbnQgKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgQ29tbWFuZFdpZGdldEJpbmRpbmcgYmluZGluZyA9IChDb21tYW5kV2lkZ2V0QmluZGluZyliaW5kaW5nc18uZWxlbWVudEF0KCBpbmRleCApOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYoIGJpbmRpbmcgIT0gbnVsbCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmFnbWVudExpc3QuYWRkKCBiaW5kaW5nLmNyZWF0ZSgpLmNyZWF0ZSgpICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50TGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgIH07IAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFjdG9yeV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9DdXJyZW50UGFnZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9DdXJyZW50UGFnZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwOTQwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQ3VycmVudFBhZ2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLS8qKgotICogVGhpcyBDb21tYW5kIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBwYWdlLgotICogVXNlIG9mIHRoaXMgY2xhc3MgaXMgbm90IHJlY29tbWVuZGVkLgotICoKLSAqLwotcHVibGljIGNsYXNzIEN1cnJlbnRQYWdlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIHByaXZhdGUgV2l6YXJkUGFnZU1hbmFnZXIgcGFnZU1hbmFnZXJfOwotICAKLSAgcHVibGljIEN1cnJlbnRQYWdlQ29tbWFuZCggV2l6YXJkUGFnZU1hbmFnZXIgcGFnZU1hbmFnZXIgKQotICB7Ci0gICAgcGFnZU1hbmFnZXJfID0gcGFnZU1hbmFnZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRDdXJyZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gcGFnZU1hbmFnZXJfLmdldEN1cnJlbnRQYWdlKCk7Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0RhdGFPYmplY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvRGF0YU9iamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MGFkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvRGF0YU9iamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgQ29tbWFuZCBjYW4gYmUgdXNlIHRvIGdldCB0aGUgcmVzdWx0aW5nIGRhdGEgb2JqZWN0IGZvcgotICogdGhpcyB3aXphcmQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGF0YU9iamVjdENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotICBwcml2YXRlIE9iamVjdCBkYXRhT2JqZWN0XzsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldERhdGFPYmplY3QoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgZGF0YU9iamVjdF8gPSBvYmplY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0RGF0YU9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gZGF0YU9iamVjdF87Ci0gIH0KLQotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0RpYWxvZ0RhdGFFdmVudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9EaWFsb2dEYXRhRXZlbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzhiYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0RpYWxvZ0RhdGFFdmVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLQotLyoqCi0gKiBEeW5hbWljIHdpemFyZCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3YW50IHRvIGNyZWF0ZSBkaWZmZXJlbnQKLSAqIGtpbmRzIG9mIHdpemFyZCBwYWdlcyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIFRoZSBXaXphcmRQYWdlRmFjdG9yeSByZXR1cm5zIGEgY2xhc3Mgb2YgdGhpcyB0eXBlLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBEaWFsb2dEYXRhRXZlbnRzCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBXaWRnZXREYXRhRXZlbnRzIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBhZGRDb250cm9scwotICAgKiBtZXRob2Qgb2YgYSBXaWRnZXRDb250cmlidXRvci4KLSAgICovCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGdldERhdGFFdmVudHMoKTsKLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGlzIHdpemFyZCBwYWdlIGlzIGNvbXBsZXRlLiAKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9EeW5hbWljV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvRHluYW1pY1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ3MWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9EeW5hbWljV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIzICAgMTI5MjMyIHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDYwODIyICAgMTU0NzUwIHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YUZsb3dNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5FbnZpcm9ubWVudFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLnJlZ2lzdHJ5LldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYWRkIGR5bmFtaWMgd2l6YXJkcyBpbnRvIEVjbGlwc2UuICBXaGVuIGFkZGluZwotICogYSBkeW5hbWljIHdpemFyZCBpbnRvIGVjbGlwc2UgdHdvIGVudHJpZXMgbmVlZCB0byBiZSBtYWRlIGluIHRoZSBwbHVnaW4ueG1sCi0gKiBmaWxlLiAgVGhpcyBmaXJzdCBlbnRyeSB0ZWxscyBFY2xpcHNlIHRoYXQgYSBuZXcgd2l6YXJkIHNob3VsZCBiZSBhZGRlZAotICogYW5kIGl0IHJlZmVyZW5jZXMgdGhpcyBjbGFzcy4gIFRoZSBzZWNvbmQgZW50cnkgc3BlY2lmaWVzIGRldGFpbGVkIGluZm9ybWF0aW9uCi0gKiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSB3aXphcmQgdG8gYmUgYWRkZWQuICBUaGVzZSB0d28gcGx1Z2luLnhtbCBlbnRyaWVzCi0gKiBhcmUgbGlua2VkIHRvZ2V0aGVyIHZpYSB0aGVpciBpZCBhdHRyaWJ1dGVzLiAgRm9yIGV4YW1wbGUgaGVyZSBpcyBhbgotICogZW50cnkgdGhhdCByZWdpc3RlcnMgYSBuZXcgd2l6YXJkIHdpdGggZWNsaXBzZS4gIE5vdGUgdGhlIGNsYXNzIGF0dHJpYnV0ZQotICogcmVmZXJlbmNlcyB0aGlzIGNsYXNzLgotICogPHByZT4KLSAqICAgJmx0O2V4dGVuc2lvbgotICogICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIiZndDsKLSAqICAgICAmbHQ7d2l6YXJkCi0gKiAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfQ0xJRU5UIgotICogICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjbGllbnRfd2Vic2Vydl93aXouZ2lmIgotICogICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICogICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICogICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiJmd0OwotICogICAgICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAqICAgICAgICAgICAlUExVR0lOX05FV19XSVpBUkRfREVTQ19XU19DTElFTlQKLSAqICAgICAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICogICAgICAgICZsdDtzZWxlY3Rpb24KLSAqICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiZndDsKLSAqICAgICAgICAmbHQ7L3NlbGVjdGlvbiZndDsKLSAqICAgICAmbHQ7L3dpemFyZCZndDsKLSAqICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKgotICogPC9wcmU+Ci0gKiBIZXJlIGlzIHRoZSBkeW5hbWljV2l6YXJkIGVudHJ5IGZvciB0aGlzIHBhcnRpY3VsYXIgd2l6YXJkLiAgVGhpcyBpZCBhdHRyaWJ1dGVzCi0gKiBsaW5rIHRoZXNlIHR3byBlbnRyaWVzIHRvZ2V0aGVyLiAgVGhlIGNsYXNzIGF0dHJpYnV0ZSBtdXN0IHNwZWNpZnkgYSBjbGFzcyB0aGF0Ci0gKiBpbXBsZW1lbnRzIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyBpbnRlcmZhY2UuICBUaGlzCi0gKiBpbnRlcmZhY2Ugc3BlY2lmaWVzIHdoYXQgdGhlIFVJIHNob3VsZCBsb29rIGxpa2UgYW5kIHRoZSBjb21tYW5kcyB0aGUgc2hvdWxkCi0gKiBiZSBleGVjdXRlZCBpbiB0aGUgd2l6YXJkLgotICogCi0gKiA8cHJlPgotICogICAmbHQ7ZXh0ZW5zaW9uCi0gKiAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIiZndDsKLSAqICAgICAmbHQ7ZHluYW1pY1dpemFyZAotICogICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYiCi0gKiAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuQ2xpZW50V2lkZ2V0QmluZGluZyIKLSAqICAgICAgICAgICB0aXRsZT0iJVdJWkFSRF9USVRMRV9XU0MiCi0gKiAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCImZ3Q7Ci0gKiAgICAgJmx0Oy9keW5hbWljV2l6YXJkJmd0OwotICogICAmbHQ7L2V4dGVuc2lvbiZndDsKLSAqIDwvcHJlPgotICoKLSAqLwotcHVibGljIGNsYXNzIER5bmFtaWNXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJRXhlY3V0YWJsZUV4dGVuc2lvbgotewotICBwcml2YXRlICAgU3RyaW5nICAgICAgICAgICAgICAgICAgaWNvbkJhbm5lck5hbWVfOwotICBwcml2YXRlICAgQnVuZGxlICAgICAgICAgICAgICAgICAgYnVuZGxlXzsKLSAgcHJpdmF0ZSAgIFNpbXBsZUNhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5XzsgCi0gIHByaXZhdGUgICBTdHJpbmcgICAgICAgICAgICAgICAgICB3aXphcmRUaXRsZV87Ci0gIHByaXZhdGUgICBEYXRhT2JqZWN0Q29tbWFuZCAgICAgICBkYXRhT2JqZWN0Q29tbWFuZF8gPSBudWxsOwotICBwcml2YXRlICAgV2l6YXJkUGFnZU1hbmFnZXIgICAgICAgcGFnZU1hbmFnZXJfOwotICAKLSAgcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCAgIHdpemFyZEVsZW1lbnRfOwotICBwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50ICAgb3JpZ2luYWxFbGVtZW50XzsKLSAgcHJvdGVjdGVkIENvbW1hbmRXaWRnZXRCaW5kaW5nICAgIGNvbW1hbmRXaWRnZXRCaW5kaW5nXzsKLSAgCi0gIHB1YmxpYyBEeW5hbWljV2l6YXJkKCkKLSAgewotCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIER5bmFtaWMgd2l6YXJkIGlzIGNyZWF0ZWQgYnkgZWNsaXBzZS4KLSAgICogV2UgbmVlZCB0byBmaW5kIGEgZHluYW1pY1dpemFyZCBleHRlbnNpb24gcG9pbnQgdGhhdCBtYXRjaGVzIHRoZSBpZAotICAgKiBmb3IgdGhpcyB3aXphcmQuICBPbmNlIHRoZSBleHRlbnNpb24gcG9pbnQgaXMgZm91bmQgaXQgd2lsbCBjb250YWluCi0gICAqIGEgcmVmZXJlbmNlIHRvIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3Mgd2hpY2ggZGVmaW5lcyB0aGUgd2lkZ2V0cyAKLSAgICogYW5kIGNvbW1hbmRzIGZvciB0aGlzIHdpemFyZC4KLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgIGRhdGEgKQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgd2l6YXJkSWQgICA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoICJpZCIgKTsKLSAgICAKLSAgICBzZXRJbml0aWFsRGF0YSggd2l6YXJkSWQgKTsKLSAgICBvcmlnaW5hbEVsZW1lbnRfID0gY29uZmlnOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBEeW5hbWljIFdpemFyZCBpcyBiZWluZwotICAgKiBsYXVuY2hlZCB0aHJvdWdoIHNvbWUgb3RoZXIgbWVjaGFuaXNlIG90aGVyIHRoYW4gdGhlIEVjbGlwc2UgTmV3IFdpemFyZAotICAgKiBtZWNoYW5pc20uCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZyAgICAgICAgdGhlIGNvbW1hbmQgd2lkZ2V0IGJpbmRpbmcgZm9yIHRoaXMgd2l6YXJkLgotICAgKiBAcGFyYW0gZGVzY3JpcHRvciAgICAgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIHdoZXJlIHRoZSBpY29uIGJhbm5lciBpcwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRlZC4KLSAgICogQHBhcmFtIGljb25CYW5uZXJQYXRoIHRoZSBpY29uIGJhbm5lciBwYXRoIGZvciB0aGlzIHdpemFyZC4gIFRoZSBwYXRoCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBpcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIHNwZWNpZmllZCBieSB0aGUgCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHBhcmFtZXRlci4KLSAgICogQHBhcmFtIHdpemFyZFRpdGxlICAgIHRoZSB3aXphcmQgdGl0bGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxEYXRhKCBDb21tYW5kV2lkZ2V0QmluZGluZyBiaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlICAgICAgICAgICAgICAgYnVuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAgaWNvbkJhbm5lclBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICAgICB3aXphcmRUaXRsZSApCi0gIHsKLSAgICBjb21tYW5kV2lkZ2V0QmluZGluZ18gPSBiaW5kaW5nOwotICAgIGJ1bmRsZV8gICAgICAgICAgICAgICA9IGJ1bmRsZTsKLSAgICBpY29uQmFubmVyTmFtZV8gICAgICAgPSBpY29uQmFubmVyUGF0aDsKLSAgICB3aXphcmRUaXRsZV8gICAgICAgICAgPSB3aXphcmRUaXRsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIGluaXRpYWwgZGF0YSBiYXNlZCBvbiB0aGUgZHluYW1pYyB3aXphcmQgaWQuCi0gICAqIAotICAgKiBAcGFyYW0gd2l6YXJkSWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxEYXRhKCBTdHJpbmcgd2l6YXJkSWQgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5ICAgIHJlZ2lzdHJ5ICAgICAgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCAgICAgICBwb2ludCAgICAgICAgID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIik7Ci0gICAgSUV4dGVuc2lvbltdICAgICAgICAgIGV4dGVuc2lvbnMgICAgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpbmRleCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbnNbaW5kZXhdLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgCi0gICAgICBpZiggZWxlbWVudHMubGVuZ3RoID09IDEgJiYgZWxlbWVudHNbMF0uZ2V0TmFtZSgpLmVxdWFscyggImR5bmFtaWNXaXphcmQiKSApIAotICAgICAgewotICAgICAgICBTdHJpbmcgaWQgPSBlbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoICJpZCIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBpZCAhPSBudWxsICYmIGlkLmVxdWFscyggd2l6YXJkSWQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICB3aXphcmRFbGVtZW50XyA9IGVsZW1lbnRzWzBdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBpZiggd2l6YXJkRWxlbWVudF8gPT0gbnVsbCApCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoIFN0YXR1cy5FUlJPUiwgImlkIiwgMCwgTkxTLmJpbmQoRW52aXJvbm1lbnRVSU1lc3NhZ2VzLk1TR19FUlJPUl9XSVpBUkRfSURfTk9UX0ZPVU5ELCBuZXcgU3RyaW5nW117IHdpemFyZElkfSkgLCBudWxsICk7Ci0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggc3RhdHVzICk7Ci0gICAgfQotICB9Ci0gICAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGVjbGlwc2UgZnJhbWV3b3JrIHRvIGluaXRpYWxpemUgdGhlCi0gICAqIHdpemFyZC4gCi0gICAqIAotICAgKiBAcGFyYW0gd29ya2JlbmNoIHRoZSBlY2xpcHNlIHdvcmtiZW5jaAotICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBpbml0aWFsIHNlbGVjdGlvbiB0aGF0IHRoZSB1c2VyIGhhcyBtYWRlIHdpdGhpbgotICAgKiAgICAgICAgICAgICAgICAgIGVjbGlwc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0ICggSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsgICAgCi0gICAgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCBjb250ZXh0ICAgICAgICA9IFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLSAgICBFY2xpcHNlU3RhdHVzSGFuZGxlciAgICAgIGhhbmRsZXIgICAgICAgID0gbmV3IEVjbGlwc2VTdGF0dXNIYW5kbGVyKCk7Ci0gICAgRWNsaXBzZUVudmlyb25tZW50ICAgICAgICBlbnZpcm9ubWVudCAgICA9IG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoIG51bGwsIGNvbnRleHQsIGhhbmRsZXIgKTsKLSAgICAKLSAgICBEYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbCBkYXRhUmVnaXN0cnlfICAgPSBuZXcgRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwoKTsKLSAgICBTaW1wbGVXaWRnZXRSZWdpc3RyeSAgICB3aWRnZXRSZWdpc3RyeV8gPSBuZXcgU2ltcGxlV2lkZ2V0UmVnaXN0cnkoKTsgIAotICAgIERhdGFGbG93TWFuYWdlciAgICAgICAgIGRhdGFNYW5hZ2VyICAgICA9IG5ldyBEYXRhRmxvd01hbmFnZXIoIGRhdGFSZWdpc3RyeV8sIGVudmlyb25tZW50ICk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgY29tbWFuZFdpZGdldEJpbmRpbmdfID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKXdpemFyZEVsZW1lbnRfLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oICJjbGFzcyIgKTsKLSAgICAgIGJ1bmRsZV8gICAgICAgICAgICAgICA9IFBsYXRmb3JtLmdldEJ1bmRsZSggd2l6YXJkRWxlbWVudF8uZ2V0TmFtZXNwYWNlKCkgKTsKLSAgICAgIGljb25CYW5uZXJOYW1lXyAgICAgICA9IHdpemFyZEVsZW1lbnRfLmdldEF0dHJpYnV0ZSggImljb25iYW5uZXIiICk7Ci0gICAgICB3aXphcmRUaXRsZV8gICAgICAgICAgPSB3aXphcmRFbGVtZW50Xy5nZXRBdHRyaWJ1dGUoICJ0aXRsZSIgKTsKLSAgICB9Ci0gICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIAotCWRhdGFPYmplY3RDb21tYW5kXyA9IG5ldyBEYXRhT2JqZWN0Q29tbWFuZCgpOwotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IG5ldyBTaW1wbGVDYW5GaW5pc2hSZWdpc3RyeSgpOyAKLSAgICBwYWdlTWFuYWdlcl8gICAgICAgPSBuZXcgV2l6YXJkUGFnZU1hbmFnZXIoIHdpZGdldFJlZ2lzdHJ5XywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXaXphcmRQYWdlRmFjdG9yeSgpLCAKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTWFuYWdlciwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ICk7ICAKLSAgICAKLSAgICBwYWdlTWFuYWdlcl8uc2V0Um9vdEZyYWdtZW50KCBnZXRSb290RnJhZ21lbnQoIHNlbGVjdGlvbiwgcGFnZU1hbmFnZXJfICkgKTsKLSAgICAKLSAgICBjb21tYW5kV2lkZ2V0QmluZGluZ18ucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgY29tbWFuZFdpZGdldEJpbmRpbmdfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnlfICk7Ci0gICAgY29tbWFuZFdpZGdldEJpbmRpbmdfLnJlZ2lzdGVyQ2FuRmluaXNoKCBjYW5GaW5pc2hSZWdpc3RyeV8gKTsKLSAgICAgICAgCi0gICAgLy8gSWYgYSBwYWdlIGlzIG5vdCBjb21wbGV0ZSBlbnN1cmUgdGhhdCBjYW5GaW5pc2ggaXMgZmFsc2UuCi0gICAgQ29uZGl0aW9uIGNhbkZpbmlzaCA9IG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXaXphcmRQYWdlIGN1cnJlbnRQYWdlID0gcGFnZU1hbmFnZXJfLmdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGFnZSAhPSBudWxsID8gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKSA6IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAKLSAgICAKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8uYWRkKCBjYW5GaW5pc2ggKTsKLSAgICAKLSAgICAvLyBTZXQgdGhhdCB3ZSBuZWVkIGEgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvciggdHJ1ZSApOwotICAgIAotICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBuZXh0L2JhY2sgYnV0dG9ucyBhcmUgZW5hYmxlZC4KLQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoIHRydWUgKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIGljb24gYmFubmVyIGlmIHNwZWNpZmllZC4KLSAgICBpZiggaWNvbkJhbm5lck5hbWVfICE9IG51bGwgJiYgaWNvbkJhbm5lck5hbWVfLmxlbmd0aCgpID4gMCApCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSTCBpbnN0YWxsVVJMICAgICAgICA9IGJ1bmRsZV8uZ2V0RW50cnkoIi8iKTsKLSAgICAgICAgVVJMIGltYWdlVVJMICAgICAgICAgID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uQmFubmVyTmFtZV8gKTsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotICAgICAgICAKLSAgICAgICAgaWYoIGltYWdlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoIGltYWdlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYoIHdpemFyZFRpdGxlXyAhPSBudWxsICYmIHdpemFyZFRpdGxlXy5sZW5ndGgoKSA+IDAgKQotICAgIHsKLSAgICAgIHNldFdpbmRvd1RpdGxlKCB3aXphcmRUaXRsZV8gKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMuCi0gIHByb3RlY3RlZCBXaXphcmRQYWdlRmFjdG9yeSBnZXRXaXphcmRQYWdlRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVBhZ2VGYWN0b3J5KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgcGFnZXMgYXJlIGNvbXBsZXRlLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbGwgcGFnZXMgYXJlIGNvbXBsZXRlLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2ggKCkKLSAgewotICAJaW50ICAgICBsZW5ndGggPSBjYW5GaW5pc2hSZWdpc3RyeV8uc2l6ZSgpOwotICAJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAJCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgQ29uZGl0aW9uIGNvbmRpdGlvbiA9IChDb25kaXRpb24pY2FuRmluaXNoUmVnaXN0cnlfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAKLSAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi5ldmFsdWF0ZSgpOwotICAgICAgCi0gICAgICBpZiggIXJlc3VsdCApIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBwYWdlIGZvciB0aGlzIHdpemFyZC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBwYWdlIGZvciB0aGlzIHdpemFyZC4KLSAgKiovCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHBhZ2VNYW5hZ2VyXy5nZXRTdGFydGluZ1BhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgICogUmV0dXJucyB0aGUgbmV4dCBwYWdlIGFmdGVyIHBhZ2UgYW5kCi0gICAgKiBydW5zIHRoZSBhcHByb3ByaWF0ZSB0YXNrcy4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBuZXh0IHBhZ2UgYWZ0ZXIgcGFnZS4KLSAgKiovCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSggSVdpemFyZFBhZ2UgcGFnZSApCi0gIHsgICAKLSAgICByZXR1cm4gcGFnZU1hbmFnZXJfLmdldE5leHRQYWdlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoICgpCi0gIHsgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBwYWdlTWFuYWdlcl8ucGVyZm9ybUZpbmlzaCgpOwotICAgIAotICAgIGlmKCByZXN1bHQgKSBjbGVhbnVwKCk7Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBVbmRvIGZyYWdtZW50cwotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsICgpCi0gIHsKLSAgCWJvb2xlYW4gcmVzdWx0ID0gcGFnZU1hbmFnZXJfLnBlcmZvcm1DYW5jZWwoKTsKLSAgCQotICAJaWYoIHJlc3VsdCApIGNsZWFudXAoKTsKLSAgCQotICAJcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0gICAgICAKLSAgcHVibGljIE9iamVjdCBnZXREYXRhT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBkYXRhT2JqZWN0Q29tbWFuZF8uZ2V0RGF0YU9iamVjdCgpOyAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBDb21tYW5kRnJhZ21lbnQgZ2V0Um9vdEZyYWdtZW50KCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFdpemFyZFBhZ2VNYW5hZ2VyIHBhZ2VNYW5hZ2VyICkKLSAgewotICAgIFNlcXVlbmNlRnJhZ21lbnQgcm9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgCi0gICAgcm9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNlbGVjdGlvbkNvbW1hbmQoIHNlbGVjdGlvbiApLCAiIiApICk7Ci0gICAgcm9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEN1cnJlbnRQYWdlQ29tbWFuZCggcGFnZU1hbmFnZXIgKSwgIiIgKSApOwotICAgIHJvb3QuYWRkKCBjb21tYW5kV2lkZ2V0QmluZGluZ18uY3JlYXRlKCkuY3JlYXRlKCkgKTsKLQlyb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBkYXRhT2JqZWN0Q29tbWFuZF8sICIiICkpOwotICAgIAotICAgIHJldHVybiByb290OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHdpemFyZEVsZW1lbnRfOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgZnJlZXMgdXAgdGhlIG1lbW9yeSBoZWxkIGJ5IHRoaXMgb2JqZWN0LgotICAgKgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNsZWFudXAoKQotICB7Ci0JICBpY29uQmFubmVyTmFtZV8gICAgICAgPSBudWxsOwotCSAgYnVuZGxlXyAgICAgICAgICAgICAgID0gbnVsbDsKLQkgIGNhbkZpbmlzaFJlZ2lzdHJ5XyAgICA9IG51bGw7IAotCSAgcGFnZU1hbmFnZXJfICAgICAgICAgID0gbnVsbDsKLQkgIHdpemFyZFRpdGxlXyAgICAgICAgICA9IG51bGw7Ci0JICBjb21tYW5kV2lkZ2V0QmluZGluZ18gPSBudWxsOwotCSAgV2lkZ2V0UmVnaXN0cnkuaW5pdGlhbGl6ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWJhZjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBXaWRnZXRDb250cmlidXRvciBmb3IgdGhpcyBOYW1lZCB3aWRnZXQuCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGdldFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIGRlc2NyaXB0aW9uIHRoYXQgbWlnaHQgYmUgZGlzcGxheWVkIG9uCi0gICAqIGEgd2l6YXJkIHBhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGl0bGUgdGhhdCBtYXkgYmUgZGlzcGxheWVkIG9uIAotICAgKiBhIHdpemFyZCBwYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGZmMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0lOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSAKLXsKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IG5hbWVkIHdpZGdldC4KLSAgICovCi0gIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHdpZGdldENvbnRyaWJ1dG9yCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBuYW1lZCB3aWRnZXQgYWZ0ZXIgdGhlIG9uZSBzcGVjaWZpZWQuCi0gICAqLwotICBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yICk7Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBleHRlbmlvbnMgdG8gcmVnaXN0ZXIgdGhlIGRhdGEgbWFwcGluZ3MKLSAgICogdGhhdCB0aGVpciB3aWRnZXRzIHVzZS4KLSAgICogCi0gICAqIEBwYXJhbSBkYXRhUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSApOwotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9QYWdlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1BhZ2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWQ3YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1BhZ2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi0KLQotcHVibGljIGNsYXNzIFBhZ2VJbmZvIAotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgICBwYWdlTmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZV87Ci0gIHByaXZhdGUgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHdpZGdldEZhY3RvcnlfOwotICAKLSAgcHVibGljIFBhZ2VJbmZvKCBTdHJpbmcgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZSwKLSAgICAgICAgICAgICAgICAgICBXaWRnZXRDb250cmlidXRvckZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSApCi0gIHsKLSAgICBwYWdlTmFtZV8gICAgICAgPSBwYWdlTmFtZTsKLSAgICBwYWdlVGl0bGVfICAgICAgPSBwYWdlVGl0bGU7Ci0gICAgd2lkZ2V0RmFjdG9yeV8gID0gd2lkZ2V0RmFjdG9yeTsKLSAgfSAgIAotICAKLSAgcHVibGljIFN0cmluZyBnZXRQYWdlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcGFnZU5hbWVfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VUaXRsZSgpCi0gIHsKLSAgICByZXR1cm4gcGFnZVRpdGxlXzsKLSAgfQotICAKLSAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiB3aWRnZXRGYWN0b3J5XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1BhZ2VXaXphcmREYXRhRXZlbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvUGFnZVdpemFyZERhdGFFdmVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjODU4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvUGFnZVdpemFyZERhdGFFdmVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogRHluYW1pYyB3aXphcmQgaW1wbGVtZW50YXRpb25zIHRoYXQgd2FudCB0byBjcmVhdGUgZGlmZmVyZW50Ci0gKiBraW5kcyBvZiB3aXphcmQgcGFnZXMgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiBUaGUgV2l6YXJkUGFnZUZhY3RvcnkgcmV0dXJucyBhIGNsYXNzIG9mIHRoaXMgdHlwZS4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFnZVdpemFyZERhdGFFdmVudHMgZXh0ZW5kcyBJV2l6YXJkUGFnZQotewotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgV2lkZ2V0RGF0YUV2ZW50cyBvYmplY3QgY3JlYXRlZCBieSB0aGUgYWRkQ29udHJvbHMKLSAgICogbWV0aG9kIG9mIGEgV2lkZ2V0Q29udHJpYnV0b3IuCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBnZXREYXRhRXZlbnRzKCk7Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGVzIHRoYXQgdGhpcyB3aXphcmQgcGFnZSBpcyBjb21wbGV0ZS4gCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVBhZ2VUb1N0YXR1cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NlbGVjdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TZWxlY3Rpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYmIxZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NlbGVjdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0KLS8qKgotICogVGhpcyBTZWxlY3Rpb25Db21tYW5kIGlzIGV4ZWN1dGUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZQotICogZHluYW1pYyB3aXphcmQuICBDb21tYW5kcyBleGVjdXRlZCBpbiB0aGUgd2l6YXJkIHRoYXQgbmVlZAotICogdGhlIGluaXRpYWwgc2VsZWN0aW9uIGNhbiBnZXQgaXQgdGhyb3VnaCBhIGRhdGEgbWFwcGluZyBmcm9tIAotICogdGhpcyBjb21tYW5kIHRvIHRoZSBjb21tYW5kIHRoYXQgbmVlZHMgaXQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uXzsKLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25Db21tYW5kKCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0gICAgc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsgIAotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0SW5pdGlhbFNlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlQ2FuRmluaXNoUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDYW5GaW5pc2hSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2QxOTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDYW5GaW5pc2hSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIFNpbXBsZUNhbkZpbmlzaFJlZ2lzdHJ5IGV4dGVuZHMgVmVjdG9yIGltcGxlbWVudHMgQ2FuRmluaXNoUmVnaXN0cnkKLXsKLQotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTcyODU4Mzc4NzA3NDEzMDVMOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSNhZGRDb25kaXRpb24ob3JnLmVjbGlwc2UuZW52LmNvbW1hbmQuZnJhZ21lbnQuQ29uZGl0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZGl0aW9uKENvbmRpdGlvbiBjb25kaXRpb24pCi0gIHsKLSAgICBhZGQoIGNvbmRpdGlvbiApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDMxNzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMyAgIDEyOTIzMiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhRmxvd01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5GcmFnbWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGV4ZWN1dGlvbiBvZiBDb21tYW5kcyBpbiBhIGZsb3cgb2YgQ29tbWFuZEZyYWdtZW50cy4KLSAqIFRoZSBidWxrIG9mIHRoaXMgd29yayBpcyBkb25lIGJ5IHRoZSBDb21tYW5kRnJhZ21lbnRFbmdpbmUuICBUaGUgbWFpbiBqb2Igb2YKLSAqIHRoaXMgY2xhc3MgaXMgcnVuIHRoZSBmcmFnbWVudHMgaW4gYSBwYXJ0aWN1bGFyIHRyYW5zYWN0aW9uYWwgZW52aXJvbm1lbnQuCi0gKiBBIGZyYWdtZW50IGhhcyBhIG1ldGhvZCBjYWxsZWQgZG9Ob3RSdW5JblRyYW5zYWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCi0gKiBpZiBpdHMgY29tbWFuZHMgc2hvdWxkIGJlIHJ1biBpbiBhIHRyYW5zYWN0aW9uIG9yIG5vdC4gIElmIHRoaXMgbWV0aG9kIHJldHVybnMKLSAqIHRydWUoaWUuIG5vdCBpbiBhIHRyYW5zYWN0aW9uKSB0aGUgQ29tbWFuZHMgYXJlIHdyYXBwZWQgaW4gYSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuCi0gKiBJZiBmYWxzZSggaWUuIGluIGEgdHJhbnNhY3Rpb24gKSB0aGUgQ29tbWFuZHMgYXJlIHdyYXBwZWQgaW4gYSBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24uIAotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBDb21tYW5kRnJhZ21lbnRFbmdpbmUgZW5naW5lXzsKLSAgcHJvdGVjdGVkIERhdGFGbG93TWFuYWdlciAgICAgICBkYXRhTWFuYWdlcl87Ci0gIHByb3RlY3RlZCAgIEVjbGlwc2VFbnZpcm9ubWVudCAgICBlbnZpcm9ubWVudF87Ci0gIAotICBwcml2YXRlICAgYm9vbGVhbiAgICAgICAgICAgICAgIGZvdW5kU3RvcF87Ci0gIHByaXZhdGUgICBib29sZWFuICAgICAgICAgICAgICAgZG9Ob3RSdW5JblRyYW5zYWN0aW9uXzsKLSAgCi0gIHB1YmxpYyBTaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlciggRWNsaXBzZUVudmlyb25tZW50IGVudmlyb25tZW50LCBEYXRhRmxvd01hbmFnZXIgZGF0YU1hbmFnZXIgKQotICB7Ci0gICAgZW52aXJvbm1lbnRfID0gZW52aXJvbm1lbnQ7Ci0gICAgZGF0YU1hbmFnZXJfID0gZGF0YU1hbmFnZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSByb290IGZyYWdtZW50LiAgVGhlIGV4ZWN1dGlvbiBlbmdpbmUgd2lsbCBzdGFydCBleGVjdXRpbmcgY29tbWFuZHMKLSAgICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHJvb3QgZnJhZ21lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcm9vdCB0aGUgcm9vdCBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3RGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IHJvb3QgKQotICB7Ci0gIAllbmdpbmVfID0gbmV3IENvbW1hbmRGcmFnbWVudEVuZ2luZSggcm9vdCwgZGF0YU1hbmFnZXJfLCBlbnZpcm9ubWVudF8gKTsKLQkKLQkgIGVudmlyb25tZW50Xy5zZXRDb21tYW5kTWFuYWdlciggZW5naW5lXyApOwotICAJCi0gICAgZW5naW5lXy5zZXRQZWVrRnJhZ21lbnRMaXN0ZW5lciggCi0gICAgICBuZXcgRnJhZ21lbnRMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyAgYm9vbGVhbiBub3RpZnkoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gcGVla0ZyYWdtZW50KCBmcmFnbWVudCApOwotICAgICAgICB9Ci0gICAgICB9ICk7ICAKLSAgICAgICAgICAgICAgICAgIAotICAgIGVuZ2luZV8uc2V0TmV4dEZyYWdtZW50TGlzdGVuZXIoIAotICAgICAgbmV3IEZyYWdtZW50TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgIGJvb2xlYW4gbm90aWZ5KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5leHRGcmFnbWVudCggZnJhZ21lbnQgKTsKLSAgICAgICAgfQotICAgICAgfSApOyAgCi0gICAgCi0gICAgZW5naW5lXy5zZXRBZnRlckV4ZWN1dGVGcmFnbWVudExpc3RlbmVyKCAKLSAgICAgICAgbmV3IEZyYWdtZW50TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljICBib29sZWFuIG5vdGlmeSggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYWZ0ZXJFeGVjdXRlTmV4dEZyYWdtZW50KCBmcmFnbWVudCApOwotICAgICAgICAgIH0KLSAgICAgICAgfSApOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICBlbmdpbmVfLnNldFVuZG9GcmFnbWVudExpc3RlbmVyKAotICAgICAgbmV3IEZyYWdtZW50TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBub3RpZnkoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdW5kb0ZyYWdtZW50KCBmcmFnbWVudCApOwotICAgICAgICB9Ci0gICAgICB9ICk7ICAgICAgICAgICAgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBhZnRlckV4ZWN1dGVOZXh0RnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICBib29sZWFuICAgICAgICAgICAgICBjb250aW51ZUV4ZWN1dGUgPSB0cnVlOwotICAgIEVjbGlwc2VTdGF0dXNIYW5kbGVyIHN0YXR1c0hhbmRsZXIgICA9IChFY2xpcHNlU3RhdHVzSGFuZGxlcillbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgIElTdGF0dXMgICAgICAgICAgICAgIGNvbW1hbmRTdGF0dXMgICA9IGVuZ2luZV8uZ2V0TGFzdFN0YXR1cygpOwotICAgIElTdGF0dXMgICAgICAgICAgICAgIGhhbmRsZXJTdGF0dXMgICA9IHN0YXR1c0hhbmRsZXIuZ2V0U3RhdHVzKCk7Ci0gICAgCi0gICAgaWYoIGNvbW1hbmRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SICYmCi0gICAgICAgIGhhbmRsZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SICkKLSAgICB7Ci0gICAgICAvLyBUaGUgY29tbWFuZCByZXR1cm5lZCBhbiBlcnJvciBzdGF0dXMgZm9yIHRoZSBlbmdpbmUgdG8gc3RvcCwKLSAgICAgIC8vIGJ1dCB0aGUgc3RhdHVzIGhhbmRsZXIgZGlkIG5vdCBoYXZlIHJlcG9ydCBhbmQgZXJyb3IuCi0gICAgICAvLyBUaGVyZWZvcmUsIHdlIHdpbGwgcmVwb3J0IHRoaXMgc3RhdHVzIHJldHVybmVkIGJ5IHRoZSBjb21tYW5kCi0gICAgICAvLyBpZiB0aGVyZSBpcyBhIG1lc3NhZ2UgdG8gZGlzcGxheS4gIAotICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGNvbW1hbmRTdGF0dXMuZ2V0TWVzc2FnZSgpOwotICAgICAgCi0gICAgICBpZiggZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID4gMCApCi0gICAgICB7Ci0gICAgICAgIHN0YXR1c0hhbmRsZXIucmVwb3J0RXJyb3IoIGNvbW1hbmRTdGF0dXMgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggY29tbWFuZFN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IgJiYKLSAgICAgICAgICAgICBoYW5kbGVyU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApCi0gICAgewotICAgICAgLy8gVGhlIGxhc3QgY29tbWFuZCBkaWRuJ3QgcmV0dXJuIGFuIGVycm9yLCBidXQgdGhlIHN0YXR1cyBoYW5kbGVyCi0gICAgICAvLyBkaWQgcmVwb3J0IGFuZCBlcnJvci4gIFRoZXJlZm9yZSwgd2Ugc2hvdWxkIHN0b3AuCi0gICAgICBjb250aW51ZUV4ZWN1dGUgPSBmYWxzZTsgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGNvbnRpbnVlRXhlY3V0ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZSBDb21tYW5kRnJhZ21lbnRFbmdpbmUgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiBpdCBpcyBwZWVraW5nIGZvcndhcmQKLSAgICogaW4gdGhlIGZyYWdtZW50cy4gIFdoZW4gcGVla2luZyBmb3J3YXJkIHRoZSBjb21tYW5kIHN0YWNrIHN0YXRlIGluIHRoZQotICAgKiBlbmdpbmUgaXMgbm90IGNoYW5nZXMuCi0gICAqIAotICAgKiAKLSAgICogQHBhcmFtIGZyYWdtZW50IHRoZSBmcmFnbWVudCB0aGF0IGl0IGlzIHBlZWtpbmcgYXQuCi0gICAqIEByZXR1cm4gSW5kaWNhdGVzIHdoZXRoZXIgcGVla2luZyBzaG91bGQgc3RvcCBvciBub3QuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwZWVrRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsgICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogVGhlIENvbW1hbmRGcmFnbWVudEVuZ2luZSBjYWxscyB0aGlzIG1ldGhvZCB3aGVuIGl0IGlzIG1vdmluZyBmb3J3YXJkCi0gICAqIGluIHRoZSBmcmFnbWVudHMuICAgV2hlbiBtb3ZpbmcgZm9yd2FyZCB0aGUgY29tbWFuZCBzdGFjayBzdGF0ZSBpcyBzYXZlZAotICAgKiBhdCBlYWNoIGZyYWdtZW50IGlzIHRyYXZlcnNlZC4KLSAgICogCi0gICAqIEBwYXJhbSBmcmFnbWVudCB0aGUgZnJhZ21lbnQgdGhhdCBpcyBiZWluZyB0cmF2ZXJzZWQuCi0gICAqIEByZXR1cm4gaW5kaWNhdGVzIGlmIHRoZSBmb3J3YXJkIHRyYXZlcnNhbCBzaG91bGQgY29udGludWUuICAKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIG5leHRGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgeyAgICAgCi0gICAgaWYoIGZyYWdtZW50LmRvTm90UnVuSW5UcmFuc2FjdGlvbigpICE9IGRvTm90UnVuSW5UcmFuc2FjdGlvbl8gKQotICAgIHsKLSAgICAgIC8vIFRoZSBmcmFnbWVudCBpcyByZXF1ZXN0aW5nIGEgZGlmZmVyZW50IHRyYW5zYWN0aW9uIGVudmlyb25tZW50IHRoYW4KLSAgICAgIC8vIHRoZSBvbmUgdGhhdCB3ZSBhcmUgaW4gc28gd2UgbXVzdCBzdG9wIGFuZCBjaGFuZ2UgZW52aXJvbm1lbnRzLgotICAgICAgZG9Ob3RSdW5JblRyYW5zYWN0aW9uXyA9IGZyYWdtZW50LmRvTm90UnVuSW5UcmFuc2FjdGlvbigpOwotICAgICAgZm91bmRTdG9wXyAgICAgICAgICAgICA9IGZhbHNlOyAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZm91bmRTdG9wXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCBmcmFnbWVudCB3aGVuIHRoZSBjb21tYW5kIGVuZ2luZSBpcyB1bndpbmRpbmcKLSAgICogaXRzIHN0YWNrIGR1cmluZyBhbiB1bmRvIG9wZXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmcmFnbWVudCAgdGhlIGZyYWdtZW50IGJlaW5nIHVuZG9uZS4KLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIHVuZG8gcHJvY2VzcyBzaG91bGQgY29udGludWUuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRvRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsgIAkgIAkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAgIAotICAvKioKLSAgICogVGhlIG1ldGhvZCBleGVjdXRlcyB0aGUgQ29tbWFuZEZyYWdtZW50IGNvbW1hbmRzIGluIHRoZSBjb250ZXh0IHByb3ZpZGVkLgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBzdGF0dXMgb2YgZXhlY3V0aW5nIHRoZSBjb21tYW5kcy4KLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHJ1bkZvcndhcmRUb05leHRTdG9wKCBJUnVubmFibGVDb250ZXh0IGNvbnRleHQgKQotICB7Ci0gICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgCi0gIAlkb05vdFJ1bkluVHJhbnNhY3Rpb25fID0gZmFsc2U7Ci0gIAkKLSAgCWRvCi0gIAl7Ci0gIAkgIC8vIFdlIHdpbGwgc3RvcCB1bmxlc3Mgd2UgYXJlIGNoYW5naW5nIHRyYW5zYWN0aW9uIG1vZGVzLgotICAgICAgZm91bmRTdG9wXyA9IHRydWU7Ci0gICAgICAKLSAgCSAgaWYoIGRvTm90UnVuSW5UcmFuc2FjdGlvbl8gKQotICAJICB7Ci0gIAkgICAgb3BlcmF0aW9uID0gZ2V0Tm9UcmFuc2FjdGlvbk9wZXJhdGlvbigpOwotICAJICB9Ci0gIAkgIGVsc2UKLSAgCSAgewotICAJICAgIG9wZXJhdGlvbiA9IGdldFRyYW5zYWN0aW9uT3BlcmF0aW9uKCk7Ci0gIAkgIH0KLSAgCSAgCi0gICAJICB0cnkKLSAgCSAgeyAgCSAgIAotICAJICAgIGlmKCBjb250ZXh0ID09IG51bGwgKQotICAJICAgIHsKLSAgCSAgIAkgIC8vIFdlIGRvbid0IGhhdmUgYSBjb250YWluZXIgeWV0IHNvIGp1c3QgcnVuIHRoZSBvcGVyYXRpb24uCi0gIAkgICAJICBvcGVyYXRpb24ucnVuKCBudWxsICk7Ci0gIAkgICAgfQotICAJICAgIGVsc2UKLSAgCSAgICB7Ci0gIAkgICAJICAvLyBXZSBoYXZlIGEgY29udGFpbmVyIHdoZXJlIHRoaXMgb3BlcmF0aW9uIGNhbiBydW4gYW5kIGhhdmUKLSAgCSAgIAkgIC8vIGl0cyBwcm9ncmVzcyBkaXNwbGF5ZWQuCi0gIAkgICAgICBjb250ZXh0LnJ1biggZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24gKTsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCSAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGV4YyApCi0gIAkgIHsKLSAgCSAgICAvL1RPRE8gc2hvdWxkIGxvZyB0aGVzZSBleGNlcHRpb25zLgotICAJICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgCSAgfQotICAJICBjYXRjaCggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMgKQotICAJICB7Ci0gIAkgICAgLy9UT0RPIHNob3VsZCBsb2cgdGhlc2UgZXhjZXB0aW9ucy4KLSAgCSAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gIAkgIH0KLSAgCX0gIAotICAJd2hpbGUoICFmb3VuZFN0b3BfICk7IAotICAJCi0gIAlyZXR1cm4gZW5naW5lXy5nZXRMYXN0U3RhdHVzKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFRyYW5zYWN0aW9uT3BlcmF0aW9uKCkKLSAgewotICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgICB7Ci0gICAgICAgIGVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coSUxvZy5JTkZPLCAiY29tbWFuZCIsIDUwMDIsIHRoaXMsICJnZXRUcmFuc2FjdGlvbk9wZXJhdGlvbiIsICJTdGFydCBvZiB0cmFuc2FjdGlvbiIpOwotICAgICAgICAKLSAgICAgICAgRWNsaXBzZVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IChFY2xpcHNlU3RhdHVzSGFuZGxlcillbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgICAKLSAgICAgICAgc3RhdHVzSGFuZGxlci5yZXNldFN0YXR1cygpOwotICAgICAgICBlbmdpbmVfLm1vdmVGb3J3YXJkVG9OZXh0U3RvcCggbW9uaXRvciApOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coSUxvZy5JTkZPLCAiY29tbWFuZCIsIDUwMDMsIHRoaXMsICJnZXRUcmFuc2FjdGlvbk9wZXJhdGlvbiIsICJFbmQgb2YgdHJhbnNhY3Rpb24iKTsKLSAgICAgIH0KLSAgICB9OwotICAgIAotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldE5vVHJhbnNhY3Rpb25PcGVyYXRpb24oKQotICB7Ci0gICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1biggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAgIHsKLSAgICAgICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhJTG9nLklORk8sICJjb21tYW5kIiwgNTA4NSwgdGhpcywgImdldE5vVHJhbnNhY3Rpb25PcGVyYXRpb24iLCAiU3RhcnQgb2YgTk9OIHRyYW5zYWN0aW9uIik7Ci0gICAgICAgIAotICAgICAgICBFY2xpcHNlU3RhdHVzSGFuZGxlciBzdGF0dXNIYW5kbGVyID0gKEVjbGlwc2VTdGF0dXNIYW5kbGVyKWVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0gICAgICAgIAotICAgICAgICBzdGF0dXNIYW5kbGVyLnJlc2V0U3RhdHVzKCk7Ci0gICAgICAgIGVuZ2luZV8ubW92ZUZvcndhcmRUb05leHRTdG9wKCBtb25pdG9yICk7Ci0gICAgICAgIGVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coSUxvZy5JTkZPLCAiY29tbWFuZCIsIDUwODYsIHRoaXMsICJnZXROb1RyYW5zYWN0aW9uT3BlcmF0aW9uIiwgIkVuZCBvZiBOT04gdHJhbnNhY3Rpb24iKTsKLSAgICAgIH0KLSAgICB9OyAKLSAgICAKLSAgICByZXR1cm4gb3BlcmF0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTU1YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQxOCAgIDEzNjMzNSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDQxOCAgIDEzNjc1OSBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2ltcGxlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgRGlhbG9nRGF0YUV2ZW50cwotewotICBwcml2YXRlICAgV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0XzsKLSAgcHJpdmF0ZSAgIFdpZGdldERhdGFFdmVudHMgIGRhdGFFdmVudHNfOwotICBwcml2YXRlICAgTGlzdGVuZXIgICAgICAgICAgc3RhdHVzTGlzdGVuZXJfOwotICBwcm90ZWN0ZWQgV2l6YXJkUGFnZU1hbmFnZXIgcGFnZU1hbmFnZXJfOyAgCi0gIHByaXZhdGUgVGV4dCBtZXNzYWdlVGV4dF87Ci0gIHByaXZhdGUgYm9vbGVhbiBva187Ci0gIAkKLSAgcHVibGljIFNpbXBsZURpYWxvZyggU2hlbGwgc2hlbGwsIFBhZ2VJbmZvIHBhZ2VJbmZvKQotICB7Ci0Jc3VwZXIoc2hlbGwpOwotCXdpZGdldF8gID0gcGFnZUluZm8uZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZSgpOwotICAJc3RhdHVzTGlzdGVuZXJfID0gbmV3IFN0YXR1c0xpc3RlbmVyKCk7Ci0gIH0gCSAKLSAgCi0gIENvbXBvc2l0ZSBwYXJlbnRfOwotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKCBDb21wb3NpdGUgcGFyZW50ICkKLSAgewkKLQkgIHBhcmVudF8gPSBwYXJlbnQ7Ci0JQ29tcG9zaXRlIGNvbnRyb2wgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JZGF0YUV2ZW50c18gPSB3aWRnZXRfLmFkZENvbnRyb2xzKCBjb250cm9sLCBzdGF0dXNMaXN0ZW5lcl8gKTsKLQkKLQkvL1RleHQgYXJlYSB0byBkaXNwbGF5IHZhbGlkYXRpb24gbWVzc2FnZXMKLQltZXNzYWdlVGV4dF8gPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5XUkFQIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBncmlkZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0gICAgbWVzc2FnZVRleHRfLnNldExheW91dERhdGEoIGdyaWRkYXRhICk7ICAgIAotICAgIHBhcmVudF8uc2V0Rm9jdXMoKTsKLSAgICAKLSAgICAvL0NhbGwgZXh0ZW5kZXJzIG92ZXJyaWRlIG9mIHRoZSBjYWxsU2V0dGVycyBtZXRob2QgdG8gaW50aWFsaXplIGFueSBkYXRhIGluIHdpZGdldAotICAgIGNhbGxTZXR0ZXJzKCk7ICAgCi0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRyb2wpOwotICAgIHJldHVybiBjb250cm9sOwotICB9ICAKLSAgCi0gIC8vT3ZlcnJpZGUgb2YgRGlhbG9nLmNyZWF0ZUNvbnRlbnRzIHNvIHdlIGNhbiBhZmZlY3QgYnV0dG9uIGVuYWJsZW1lbnQgCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCS8vZW5hYmxlIGNvbnRyb2xzIGZvciBpbml0aWFsIGVudHJ5IHRvIGRpYWxvZwotCXZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci0JcmV0dXJuIGM7Ci0gIH0KLQotICAvLyBFbmFibGUgb3IgZGlzYWJsZSBvayBidXR0b24gYmFzZWQgb24gc3RhdGUKLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZU9rKGJvb2xlYW4gc3RhdGUpCi0gIHsKLQkgIEJ1dHRvbiBva0J1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQkgIGlmIChva0J1dHRvbiAhPSBudWxsKQotCSAgICBva0J1dHRvbi5zZXRFbmFibGVkKHN0YXRlKTsKLSAgfQotICAKLSAgLy9JbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gY2FsbCBhbGwgc2V0dGVycyBvbiB0aGUgZGlhbG9nIHdpZGdldCBhZnRlciB0aGUgY29udHJvbHMgYXJlIGNyZWF0ZWQKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2FsbFNldHRlcnMoKTsKLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGdldERhdGFFdmVudHMoKQotICB7Ci0gICAgcmV0dXJuIGRhdGFFdmVudHNfOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgV2lkZ2V0Q29udHJpYnV0b3IgZ2V0V2lkZ2V0KCkKLSAgewotCSAgcmV0dXJuIHdpZGdldF87Ci0gIH0KLSAgCi0gIC8vIHNldHMgbWVzc2FnZSBpbiBtZXNzYWdlIGFyZWEgYWJvdmUgT0sgYW5kIENhbmNlbCBidXR0b25zCi0gIHByaXZhdGUgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7ICAKLQkgIGlmIChtZXNzYWdlID09IG51bGwpCi0JCSAgbWVzc2FnZVRleHRfLnNldFRleHQoIiIpOwkgICAgICAKLQkgIGVsc2UJCSAgCi0JICAgICAgbWVzc2FnZVRleHRfLnNldFRleHQobWVzc2FnZSk7Ci0gICAgICAvLyBmb3JjZSBhIHJlc2l6ZSBvZiB0aGUgcGFyZW50IGNvbXBvc2l0ZSBhbmQgd3JhcCBvZiB0aGUgdGV4dCBmaWVsZCBpZiBuZWNlc3NhcnkKLQkgIHBhcmVudF8ubGF5b3V0KCk7ICAKLSAgfQotICAJICAKLSAgCi0gIAotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVBhZ2VUb1N0YXR1cygpCi0gIHsKLSAgICBJU3RhdHVzIHN0YXR1cyAgPSB3aWRnZXRfLmdldFN0YXR1cygpOyAgICAKLSAgICAgICAgCi0gICAgaWYoIHN0YXR1cyAhPSBudWxsICkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgIAotICAgICAgLy8gZm9yIGVycm9yIGNvbmRpdGlvbiwgZGlzYWJsZSBvayBhbmQgcHJpbnQgbWVzc2FnZQotICAgICAgaWYoIHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IgKQotICAgICAgeyAKLSAgICAgICAgaWYoIG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRNZXNzYWdlKCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIG9rXyA9IGZhbHNlOwotICAgICAgfQotICAgICAgLy8gZGlzcGxheSB3YXJuaW5nIGFuZCBpbmZvIG1lc3NhZ2VzIGJ1dCBzdGlsbCBlbmFibGUgT0sKLSAgICAgIGVsc2UgaWYgKHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORyB8IHNldmVyaXR5ID09IElTdGF0dXMuSU5GTykKLSAgICAgIHsKLSAgICAgICAgc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgb2tfID0gdHJ1ZTsgICAgICAgIAotICAgICAgfSAgICAgCi0gICAgICAvLyBubyBtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICAgIGVsc2UgIAotICAgICAgewotICAgICAgICBzZXRNZXNzYWdlKCBudWxsKTsKLSAgICAgICAgb2tfID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gbnVsbCBzdGF0dXMgY2FzZQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRNZXNzYWdlKG51bGwpOwotICAgICAgb2tfID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgZW5hYmxlT2sob2tfKTsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgU3RhdHVzTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lcgotICB7Ci0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIEV2ZW50IGV2dCApIAotCXsKLSAgICAgIHZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci0JfQotICB9Ci19ICAKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBhZ2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwMmU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZVBhZ2VGYWN0b3J5IGltcGxlbWVudHMgV2l6YXJkUGFnZUZhY3RvcnkKLXsgICAKLSAgcHVibGljIFBhZ2VXaXphcmREYXRhRXZlbnRzIGdldFBhZ2UoIFBhZ2VJbmZvIHBhZ2VJbmZvLCBXaXphcmRQYWdlTWFuYWdlciBtYW5hZ2VyICkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlV2l6YXJkUGFnZSggcGFnZUluZm8sIG1hbmFnZXIgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBvcHVwUGFnZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVQb3B1cFBhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTk2ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBvcHVwUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZVBvcHVwUGFnZUZhY3RvcnkgaW1wbGVtZW50cyBXaXphcmRQYWdlRmFjdG9yeQoteyAgIAotICBwcml2YXRlIFN0cmluZyBpZF87Ci0gIAotICBwdWJsaWMgU2ltcGxlUG9wdXBQYWdlRmFjdG9yeSggU3RyaW5nIGlkICkKLSAgewotICAgIGlkXyA9IGlkOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBQYWdlV2l6YXJkRGF0YUV2ZW50cyBnZXRQYWdlKCBQYWdlSW5mbyBwYWdlSW5mbywgV2l6YXJkUGFnZU1hbmFnZXIgbWFuYWdlciApCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVBvcHVwV2l6YXJkUGFnZSggcGFnZUluZm8sIG1hbmFnZXIsIGlkXyApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUG9wdXBXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUG9wdXBXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MmU2MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBvcHVwV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDczMSAgIDEyMDM3OCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgRmllbGRzIG5vdCB2aXNpYmxlIGluIExhcmdlIGZvbnQgc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuRW52aXJvbm1lbnRVSU1lc3NhZ2VzOwotCi0KLQotcHVibGljIGNsYXNzIFNpbXBsZVBvcHVwV2l6YXJkUGFnZSBleHRlbmRzIFNpbXBsZVdpemFyZFBhZ2UKLXsgIAotICBwcml2YXRlIFN0cmluZyBpZF87Ci0gIAotICBwdWJsaWMgU2ltcGxlUG9wdXBXaXphcmRQYWdlKCBQYWdlSW5mbyBwYWdlSW5mbywgV2l6YXJkUGFnZU1hbmFnZXIgcGFnZU1hbmFnZXIsIFN0cmluZyBpZCApCi0gIHsKLSAgCXN1cGVyKCBwYWdlSW5mbywgcGFnZU1hbmFnZXIgKTsKLSAgCQotICAJaWRfID0gaWQ7Ci0gIH0gCSAgCi0gIAkKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBpbnRlcm5hbENyZWF0ZUNvbnRyb2woIENvbXBvc2l0ZSBwYXJlbnQgKSAKLSAgeyAgCQotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5pbnRlcm5hbENyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkgIAotICAJZmluYWwgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgICA9IFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5nZXRJbnN0YW5jZSgpOwotICAJCi0gIAkvLyBJZiB0aGUgY3VycmVudCBwYWdlIGlzIG51bGwgdGhlbiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IHBhZ2UuCi0gIAlpZiggcGFnZU1hbmFnZXJfLmdldEN1cnJlbnRQYWdlKCkgPT0gbnVsbCAmJiBjb250ZXh0LnNob3dDaGVja2JveChpZF8pICkKLSAgCXsKLSAgICAgIGZpbmFsICBCdXR0b24gYnV0dG9uICA9IG5ldyBCdXR0b24oIGNvbXBvc2l0ZSwgU1dULkNIRUNLICk7Ci0gICAgICBTdHJpbmcgbGFiZWwgICA9IEVudmlyb25tZW50VUlNZXNzYWdlcy5DSEVDS0JPWF9ET19OT1RfU0hPV19ESUFMT0dfQUdBSU47Ci0gICAgICAKLSAgICAgIC8qQ09OVEVYVF9JRCBUV1AwMDAxIGZvciB0aGUgc2hvdy9oaWRlIGNoZWNrIGJveCovCi0gICAgICBTdHJpbmcgaW5mb3BvcCA9CSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuVFdQMDAwMSI7Ci0gICAgICBTdHJpbmcgdG9vbHRpcCA9IEVudmlyb25tZW50VUlNZXNzYWdlcy5UT09MVElQX0RPX05PVF9TSE9XX0RJQUxPR19BR0FJTjsKLSAgICAgIAotICAgICAgYnV0dG9uLnNldFRleHQoIGxhYmVsICk7Ci0gICAgICBidXR0b24uc2V0VG9vbFRpcFRleHQoIHRvb2x0aXAgKTsKLSAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRBY3Rpb25EaWFsb2dFbmFibGVkKCBpZF8sIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSApOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGJ1dHRvbiwgaW5mb3BvcCApOyAgCQotICAJfQotICAJCi0gIAlyZXR1cm4gY29tcG9zaXRlOwotICB9ICAKLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpZGdldENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyYWNiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgCi17Ci0gICAgcHJpdmF0ZSBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZmFjdG9yeV87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgbmFtZV87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fOwotCXByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgIHRpdGxlXzsKLQkKLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIAotCXsKLQkJZGVzY3JpcHRpb25fID0gZGVzY3JpcHRpb247Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeShXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZmFjdG9yeSkgCi0JewotCQlmYWN0b3J5XyA9IGZhY3Rvcnk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgCi0JewotCQluYW1lXyA9IG5hbWU7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSAKLQl7Ci0JCXRpdGxlXyA9IHRpdGxlOwotCX0KLQkKLQotCXB1YmxpYyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZ2V0V2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgCi0JewotCQlyZXR1cm4gZmFjdG9yeV87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgCi0JewotCQlyZXR1cm4gbmFtZV87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIAotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uXzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgCi0JewotCQlyZXR1cm4gdGl0bGVfOwotCX0KLQotCS8qKgotCSAqIFN1YnNjbGFzc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotCXsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4NGM5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNpbXBsZSBXaWRnZXREYXRhQ29udHJpYnV0b3IgY2xhc3MgdGhhdCBjb25jcmV0ZSAKLSAqIFdpZGdldERhdGFDb250cmlidXRvcnMgY2FuIHN1YmNsYXNzLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciBpbXBsZW1lbnRzIFdpZGdldERhdGFDb250cmlidXRvcgoteyAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2FkZENvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzI2V4dGVybmFsaXplKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4dGVybmFsaXplKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50cyNpbnRlcm5hbGl6ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpZGdldFJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4OWJjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0KLQotcHVibGljIGNsYXNzIFNpbXBsZVdpZGdldFJlZ2lzdHJ5IGltcGxlbWVudHMgV2lkZ2V0UmVnaXN0cnkKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgdGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgcHVibGljIHZvaWQgYWRkKCBTdHJpbmcgZnJhZ21lbnRJZCwKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhZ2VUaXRsZSwKLSAgICAgICAgICAgICAgICAgICBXaWRnZXRDb250cmlidXRvckZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSApCi0gIHsKLSAgCVBhZ2VJbmZvIGVudHJ5ID0gbmV3IFBhZ2VJbmZvKCBwYWdlTmFtZSwgcGFnZVRpdGxlLCB3aWRnZXRGYWN0b3J5ICk7Ci0gIAl0YWJsZV8ucHV0KCBmcmFnbWVudElkLCBlbnRyeSApOwotICB9ICAgICAgICAgICAgICAgICAgIAotICAKLSAgcHVibGljIFBhZ2VJbmZvIGdldFBhZ2VJbmZvKCBTdHJpbmcgZnJhZ21lbnRJZCApCi0gIHsKLSAgICByZXR1cm4gKFBhZ2VJbmZvKXRhYmxlXy5nZXQoIGZyYWdtZW50SWQgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjU5NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNzMxICAgMTIwMzc4IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBGaWVsZHMgbm90IHZpc2libGUgaW4gTGFyZ2UgZm9udCBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBQYWdlV2l6YXJkRGF0YUV2ZW50cwotewotICBwcml2YXRlICAgV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0XzsKLSAgcHJpdmF0ZSAgIFdpZGdldERhdGFFdmVudHMgIGRhdGFFdmVudHNfOwotICBwcml2YXRlICAgTGlzdGVuZXIgICAgICAgICAgc3RhdHVzTGlzdGVuZXJfOwotICBwcm90ZWN0ZWQgV2l6YXJkUGFnZU1hbmFnZXIgcGFnZU1hbmFnZXJfOwotICAJCi0gIHB1YmxpYyBTaW1wbGVXaXphcmRQYWdlKCBQYWdlSW5mbyBwYWdlSW5mbywgV2l6YXJkUGFnZU1hbmFnZXIgcGFnZU1hbmFnZXIgKQotICB7Ci0gIAlzdXBlciggIiIgKTsKLSAgCQotICAJc2V0VGl0bGUoIHBhZ2VJbmZvLmdldFBhZ2VOYW1lKCkgKTsKLSAgCXNldERlc2NyaXB0aW9uKCBwYWdlSW5mby5nZXRQYWdlVGl0bGUoKSk7Ci0gIAkgIAotICAJd2lkZ2V0XyAgICAgICAgID0gcGFnZUluZm8uZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZSgpOwotICAJc3RhdHVzTGlzdGVuZXJfID0gbmV3IFN0YXR1c0xpc3RlbmVyKCk7Ci0gIAlwYWdlTWFuYWdlcl8gICAgPSBwYWdlTWFuYWdlcjsKLSAgfSAJICAKLSAgCQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCBDb21wb3NpdGUgcGFyZW50ICkgCi0gIHsJICAKLQlTY3JvbGxlZENvbXBvc2l0ZSBjb250cm9sID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5WX1NDUk9MTCApOwkKLQlDb21wb3NpdGUgaW5uZXIgPSBpbnRlcm5hbENyZWF0ZUNvbnRyb2woY29udHJvbCk7Ci0JCi0JY29udHJvbC5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotICAJY29udHJvbC5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQljb250cm9sLnNldENvbnRlbnQoaW5uZXIpOyAgCQotICAgIGNvbnRyb2wuc2V0TWluU2l6ZShpbm5lci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsJCi0JCi0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRyb2wpOwotICAgIHNldENvbnRyb2woIGNvbnRyb2wgKTsKLSAgfQotCQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGludGVybmFsQ3JlYXRlQ29udHJvbCggQ29tcG9zaXRlIHBhcmVudCApIHsKLQotCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotCWNvbnRyb2wuc2V0TGF5b3V0KCBuZXcgR3JpZExheW91dCgpICk7Ci0gIAljb250cm9sLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9CT1RIICkpOwotCQotCWRhdGFFdmVudHNfID0gd2lkZ2V0Xy5hZGRDb250cm9scyggY29udHJvbCwgc3RhdHVzTGlzdGVuZXJfICk7CQotCQotCXJldHVybiBjb250cm9sOwotICB9Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBnZXREYXRhRXZlbnRzKCkKLSAgewotICAgIHJldHVybiBkYXRhRXZlbnRzXzsKLSAgfQotICAJICAKLSAgcHVibGljIHZvaWQgdmFsaWRhdGVQYWdlVG9TdGF0dXMoKQotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgID0gd2lkZ2V0Xy5nZXRTdGF0dXMoKTsKLSAgICAKLSAgICBpZiggc3RhdHVzICE9IG51bGwgKQotICAgIHsKLSAgICAgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgIGlmKCBtZXNzYWdlLmxlbmd0aCgpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCBudWxsICk7Ci0gICAgICAgICAgc2V0TWVzc2FnZSggZ2V0RGVzY3JpcHRpb24oKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNldEVycm9yTWVzc2FnZSggbWVzc2FnZSApOwotICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSggZmFsc2UgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyApCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZSggbnVsbCApOwotICAgICAgICBzZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElTdGF0dXMuV0FSTklORyApOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTyApCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZSggbnVsbCApOwotICAgICAgICBzZXRNZXNzYWdlKCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJU3RhdHVzLklORk8gKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKCB0cnVlICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZSggbnVsbCApOwotICAgICAgICBzZXRNZXNzYWdlKCBnZXREZXNjcmlwdGlvbigpICk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSggdHJ1ZSApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKCBudWxsICk7Ci0gICAgICBzZXRNZXNzYWdlKCBnZXREZXNjcmlwdGlvbigpICk7Ci0gICAgICBzZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLSAgICB9Ci0gICAgCi0gICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgCi0gIHsKLQlyZXR1cm4gaXNQYWdlQ29tcGxldGUoKSAmJiBwYWdlTWFuYWdlcl8uaGFzTmV4dFBhZ2UoKTsKLSAgfQotCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIAotICB7Ci0JcmV0dXJuIHBhZ2VNYW5hZ2VyXy5nZXROZXh0UGFnZSgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmFsdWUpIAotICB7Ci0gIAlwYWdlTWFuYWdlcl8uaGFuZGxlUGFnZVZpc2libGUoIHRoaXMsIHZhbHVlICk7Ci0gIAkKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZhbHVlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBTdGF0dXNMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyCi0gIHsKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggRXZlbnQgZXZ0ICkgCi0JewotICAgICAgdmFsaWRhdGVQYWdlVG9TdGF0dXMoKTsKLQl9Ci0gIH0KLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyZjdjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBXaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlciAKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgICAgICAgICB3aWRnZXRDb250cmlidXRvcl87Ci0gIHByaXZhdGUgQ29tbWFuZFdpZGdldEJpbmRpbmcgYmluZGluZ187Ci0gIAotICBwdWJsaWMgV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIoIENvbW1hbmRXaWRnZXRCaW5kaW5nIGJpbmRpbmcgKQotICB7Ci0gICAgd2lkZ2V0Q29udHJpYnV0b3JfID0gbmV3IEhhc2h0YWJsZSgpOyAKLQliaW5kaW5nXyAgICAgICAgICAgPSBiaW5kaW5nOwotCQotCWJpbmRpbmcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggbmV3IE15V2lkZ2V0UmVnaXN0cnkoKSApOwotICB9Ci0gIAotICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0V2lkZ2V0KCBTdHJpbmcgaWQgKQotICB7Ci0gICAgcmV0dXJuIChJTmFtZWRXaWRnZXRDb250cmlidXRvcil3aWRnZXRDb250cmlidXRvcl8uZ2V0KCBpZCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIGJpbmRpbmdfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCByZWdpc3RyeSApOyAgCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgTXlXaWRnZXRSZWdpc3RyeSBpbXBsZW1lbnRzIFdpZGdldFJlZ2lzdHJ5Ci0gIHsKLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGZyYWdtZW50SWQsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VUaXRsZSwgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHdpZGdldEZhY3RvcnkpIAotCXsKLQkgIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdpZGdldCA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotCSAgd2lkZ2V0LnNldFRpdGxlKCBwYWdlTmFtZSApOwotCSAgd2lkZ2V0LnNldERlc2NyaXB0aW9uKCBwYWdlVGl0bGUgKTsKLQkgIHdpZGdldC5zZXRGYWN0b3J5KCBuZXcgTXlXaWRnZXRDb250cmlidXRvckZhY3RvcnkoIHdpZGdldEZhY3RvcnkgKSApOwotCSAgCi0JICB3aWRnZXRDb250cmlidXRvcl8ucHV0KCBmcmFnbWVudElkLCB3aWRnZXQgKTsKLQl9CSAgCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgTXlXaWRnZXRDb250cmlidXRvckZhY3RvcnkgaW1wbGVtZW50cyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkKLSAgewotCXByaXZhdGUgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGZhY3RvcnlfOwotCXByaXZhdGUgV2lkZ2V0Q29udHJpYnV0b3IgICAgICAgIHdpZGdldF87Ci0JCi0JcHVibGljIE15V2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZmFjdG9yeSApCi0JewotCSAgZmFjdG9yeV8gPSBmYWN0b3J5OwkKLQl9Ci0JCi0JcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIAotCXsKLSAgICAgIGlmKCB3aWRnZXRfID09IG51bGwgKQotCSAgewotCSAgICB3aWRnZXRfID0gZmFjdG9yeV8uY3JlYXRlKCk7Ci0JICB9Ci0JICAKLQkgIHJldHVybiB3aWRnZXRfOwotCX0JICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkYjYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhIHdheSBmb3IgZGV2ZWxvcGVycyB0byBjcmVhdGUgdmFsaWRhdGFibGUgd2lkZ2V0cwotICogdGhhdCBjYW4gYmUgdXNlZCBpbiBtYW55IGRpZmZlcmVudCBFY2xpcHNlIFVJIGNvbnRleHRzLiAoaWUuIGluIGEgV2luZG93cywgRGlhZ2xvZ3MsCi0gKiB3aXphcmQgcGFnZXMsIGV0YykKLSAqCi0gKiBUaGUgbWFpbiBmdW5jdGlvbmFsaXR5IHRoaXMgaW50ZXJmYWNlIGhhcyBvdmVyIGp1c3QgYSByZWd1bGFyIEVjbGlwc2UgQ29tcG9zaXRlCi0gKiBpcyB0aGF0IGl0IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB2YWxpZGF0aW5nIHRoZSBXaWRnZXQuICBXaGVuIHZhbGlkYXRpbmcKLSAqIHRoZXJlIGFyZSB0d28gYXNwZWN0cyB0byBrZWVwIGluIG1pbmQuICBUaGUgZmlyc3QgYXNwZWN0IGRlYWxzIHdpdGggV0hFTiB2YWxpZGF0aW9uCi0gKiBvY2N1cnMgYW5kIHRoZSBzZWNvbmQgYXNwZWN0IGRlYWxzIHdpdGggV0hBVCB0byBkbyBmb3IgYSB2YWxpZGF0aW9uIGV2ZW50LgotICogCi0gKiBUaGUgZmlyc3QgYXNwZWN0IG9mIHRyaWdnZXJpbmcgdmFsaWRhdGlvbiBldmVudHMgaXMgaGFuZGxlZCBieSB0aGUgc3RhdHVzTGlzdGVuZXIKLSAqIHBhcmFtZXRlciBvZiB0aGUgYWRkQ29udHJvbHMgbWV0aG9kLiAgSWYgYSBwYXJ0aWN1bGFyIGNvbnRyb2wgdGhhdCBpcyBjb250cmlidXRlZCBjYW4KLSAqIGFmZmVjdCB0aGUgdmFsaWRpdHkgb2YgdGhpcyBXaWRnZXRDb250cmlidXRvciB0aGVuIHRoZSBzdGF0dXNMaXN0ZW5lciBvYmplY3QKLSAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBvZiB0aGF0IGNvbnRyb2wuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRleHQgaW4KLSAqIGEgVGV4dCB3aWRnZXQgY2FuIGFmZmVjdCB0aGUgdmFsaWRpdHkgb2YgdGhpcyBXaWRnZXRDb250cmlidXRvciB0aGVuIHlvdSB3b3VsZAotICogYWRkIHRoZSBzdGF0dXNMaXN0ZW5lciB0byB0aGUgVGV4dCB3aWRnZXRzIE1vZGlmeSBsaXN0ZW5lciBsaXN0OgotICogCi0gKiAKLSAqICAgVGV4dCBzb21lVGV4dCA9IG5ldyBUZXh0KCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gKiAgIHNvbWVUZXh0LmFkZExpc3RlbmVyKCBTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lciApOwotICogCi0gKiBOb3RlOiBpZiB5b3Ugd2FudCB0byBmb3JjZSB2YWxpZGF0aW9uIG9mIHRoaXMgd2lkZ2V0IHlvdSBjYW4gY2FsbAotICogICAgICAgdGhlIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpIG1ldGhvZCBkaXJlY3RseS4gIFRoaXMKLSAqICAgICAgIGlzIG5vdCB0aGUgcHJlZmVyZWQgbWF5IHRvIHRyaWdnZXIgdmFsaWRhdGlvbiwgaG93ZXZlci4KLSAqICAgICAgIAotICogVGhlIHNlY29uZCBhc3BlY3Qgb2YgdmFsaWF0aW9uIGlzIHdoYXQgdG8gZG8gd2hlbiB0aGUgdmFsaWRhdGlvbiBldmVudCBvY2N1cnMuCi0gKiBUaGlzIGlzIGhhbmRsZWQgYnkgZ2V0U3RhdHVzIG1ldGhvZC4gIEFueSBjb2RlIHRoYXQgZW5zdXJlcyB0aGF0IHRoaXMgd2lkZ2V0IGlzCi0gKiB2YWxpZCBzaG91bGQgYmUgcHV0IGluIHRoZSBnZXRTdGF0dXMgaW1wbGVtZW50YXRpb24uIAotICogCi0gKiAKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdpZGdldENvbnRyaWJ1dG9yIAotewotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBVSSBjb250cmlidXRpb25zIGZvciB0aGlzIHdpZGdldC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQgVGhlIGNvbXBvc2l0ZSBwYXJlbnQgdGhhdCBzdWIgd2lkZ2V0cyBzaG91bGQgdXNlLgotICAgKiBAcGFyYW0gc3RhdHVzTGlzdGVuZXIgVGhpcyBsaXN0ZW5lciBzaG91bGQgYmUgYWRkZWQgdG8gYW55IHdpZGdldCB0aGF0IGNhbgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgYWZmZWN0IHRoZSB2YWxpZGl0eSBvZiB0aGlzIFdpZGdldENvbnRyaWJ1dG9yLgotICAgKiBAcmV0dXJuIHJldHVybnMgYSBXaWRnZXREYXRhRXZlbnRzIG9iamVjdC4gIFRoaXMgb2JqZWN0IGlzIHVzZWQgYnkgdGhlCi0gICAqICAgICAgICAgZnJhbWV3b3JrIHRvIGludGVybmFsaXplIGFuZCBleHRlcm5hbGl6ZSBkYXRhIGZvciB0aGlzIHdpZGdldC4KLSAgICovCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApOwotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBpbXBsZW1lbnQgdmFsaWRhdGlvbiBjb2RlIGZvciB0aGlzIFdpZGdldENvbnRyaWJ1dG9yLgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHRoZSB2YWxpZGl0eSBvZiB0aGlzIHdpZGdldC4KLSAgICogICAgICAgICBJZiB0aGUgc3RhdHVzIHNldmVyaXR5IGlzIEVSUk9SIHRoZW4gdGhpcyB3aWRnZXQgaXMgY29uc2lkZXJlZCB0bwotICAgKiAgICAgICAgIGJlIGludmFsaWQuICBGb3IgYW55IG90aGVyIHN0YXR1cyBzZXZlcml0eSBvciBpZiB0aGUgc3RhdHVzIHJldHVybmVkCi0gICAqICAgICAgICAgaXMgbnVsbCB0aGlzIHdpZGdldCBpcyBjb25zaWRlcmVkIHRvIGJlIHZhbGlkLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjVkMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldENvbnRyaWJ1dG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlIGEgd2F5IGZvciBjcmVhdGluZyBXaWRnZXRDb250cmlidXRvcnMKLSAqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSAKLXsKLSAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldERhdGFDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldERhdGFDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWFhMzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXREYXRhQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgV2lkZ2V0Q29udHJpYnV0b3IgaW50ZXJmYWNlIGFuZAotICogdGhlIFdpZGdldERhdGFFdmVudHMgaW50ZXJmYWNlLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXREYXRhQ29udHJpYnV0b3IgZXh0ZW5kcyBXaWRnZXRDb250cmlidXRvciwgV2lkZ2V0RGF0YUV2ZW50cyAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXREYXRhRXZlbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0RGF0YUV2ZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2IwM2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXREYXRhRXZlbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IGZvciBpbnRlcm5hbGl6aW5nIGFuZCBleHRlcm5hbGl6aW5nIHN0YXRlCi0gKiBkYXRhIGluIGEgV2lkZ2V0Q29udHJpYnV0b3IuICBUaGUgaW50ZXJuYWxpemUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCi0gKiBiZWZvcmUgdGhlIHdpZGdldCBpcyBkaXNwbGF5ZWQgc28gdGhhdCBpdCBjYW4gc2V0IHRoZSBkZWZhdWx0IGRhdGEKLSAqIGZvciB0aGF0IHdpZGdldC4gIFRoZSBleHRlcm5hbGl6ZSBtZXRob2QgcHJvdmlkZXMgYSB3YXkgb2YgZ2V0dGluZyBkYXRhCi0gKiBmcm9tIHRoZSB3aWRnZXQgYWZ0ZXIgaXQgaXMgZGlzcGxheWVkLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXREYXRhRXZlbnRzIAotewotICAvKioKLSAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBzZXQgd2lkZ2V0IHN0YXRlIGRhdGEgaGVyZS4KLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCk7Ci0gIAotICAvKioKLSAgICogSW1wbGVtZW5hdGlvbnMgc2hvdWxkIGdldCB3aWRnZXQgc3RhdGUgZGF0YSBoZXJlLgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgZXh0ZXJuYWxpemUoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldFJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMTA3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBob3cgV2lkZ2V0Q29udHJpYnV0b3JzIGFyZSBtYWRlIGtub3duIHRvIHRoZQotICogZHluYW1pYyB3aXphcmQgZnJhbWV3b3JrLiAgVGhpcyB3aWRnZXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYSB3aXphcmQgcGFnZQotICogd2l0aCB0aGUgbmFtZSBhbmQgdGl0bGUgc3BlY2lmaWVkIGluIHRoZSBhZGQgbWV0aG9kLiAgVGhlIGZyYWdtZW50SWQgaXMgCi0gKiB1c2VkIHRvIGFzc29jaWF0ZSB0aGlzIHdpZGdldCB3aXRoIGEgcGFydGljdWxhciBDb21tYW5kRnJhZ21lbnQuICBXaGVuCi0gKiBhIENvbW1hbmRGcmFnbWVudCB3aXRoIHRoaXMgZnJhZ21lbnRJZCBpcyB0cmF2ZXJzZWQgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIFdpZGdldENvbnRyaWJ1dG9yIHdpbGwgYmUgZGlzcGxheWVkLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXRSZWdpc3RyeQotewotICAvKioKLSAgICogQWRkcyBhIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB0byB0aGUgZnJhbWV3b3JrLiAgVGhpcyBmYWN0b3J5Ci0gICAqIGlzIHVzZWQgdG8gZ2V0IHRoZSBXaWRnZXRDb250cmlidXRvci4gIFRoaXMgV2lkZ2V0Q29udHJpYnV0b3IKLSAgICogd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgd2l6YXJkIHBhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gZnJhZ21lbnRJZCB0aGUgQ29tbWFuZEZyYWdtZW50IGlkIHRoYXQgdGhpcyBXaWRnZXRDb250cmlidXRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGlzIHdpemFyZCBwYWdlLgotICAgKiBAcGFyYW0gcGFnZVRpdGxlIHRoZSB0aXRsZSBvZiB0aGlzIHdpemFyZCBwYWdlLgotICAgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSB0aGUgZmFjdG9yeSB3aGljaCB3aWxsIGNyZWF0ZSB0aGUgV2lkZ2V0Q29udHJpYnV0b3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGQoIFN0cmluZyBmcmFnbWVudElkLAotCQkJCSAgIFN0cmluZyBwYWdlTmFtZSwKLQkJCQkgICBTdHJpbmcgcGFnZVRpdGxlLAotCQkJCSAgIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB3aWRnZXRGYWN0b3J5ICk7Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpemFyZFBhZ2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyMDk3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2l6YXJkUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLQotLyoqCi0gKiAKLSAqCi0gKgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXaXphcmRQYWdlRmFjdG9yeSAKLXsKLSAgcHVibGljIFBhZ2VXaXphcmREYXRhRXZlbnRzIGdldFBhZ2UoIFBhZ2VJbmZvIHBhZ2VJbmZvLCBXaXphcmRQYWdlTWFuYWdlciBtYW5hZ2VyICk7IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpemFyZFBhZ2VNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2l6YXJkUGFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NWVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2l6YXJkUGFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjMgICAxMjkyMzIgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNjAzMTMgICAxMzA5NTggcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNzAzMTkgICAxNzU3MjEgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YUZsb3dNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLnJlZ2lzdHJ5LldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZzsKLQotCi0KLXB1YmxpYyBjbGFzcyBXaXphcmRQYWdlTWFuYWdlciBleHRlbmRzIFNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyCi17Ci0gIHByaXZhdGUgICBXaXphcmRQYWdlRmFjdG9yeSAgICAgIHBhZ2VGYWN0b3J5XzsKLSAgcHJpdmF0ZSAgIEhhc2h0YWJsZSAgICAgICAgICAgICAgcGFnZVRhYmxlXzsKLSAgcHJpdmF0ZSAgIElXaXphcmQgICAgICAgICAgICAgICAgd2l6YXJkXzsKLSAgcHJvdGVjdGVkIFNpbXBsZVdpZGdldFJlZ2lzdHJ5ICAgcmVnaXN0cnlfOwotICAKLSAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIGFuZCBzZXQgYnkgb3VyIG1ldGhvZHMgd2hpY2ggaXMKLSAgLy8gd2h5IHRoZXkgYXJlIG5vdCBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3IuCi0gIHByaXZhdGUgUGFnZVdpemFyZERhdGFFdmVudHMgY3VycmVudFBhZ2VfOwotICBwcml2YXRlIFBhZ2VXaXphcmREYXRhRXZlbnRzIG5leHRQYWdlXzsKLSAgcHJpdmF0ZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBuZXh0UGVla1BhZ2VfOwotICBwcml2YXRlIFBhZ2VXaXphcmREYXRhRXZlbnRzIGZpcnN0UGFnZV87Ci0gIHByaXZhdGUgQ29tbWFuZEZyYWdtZW50ICAgICAgbGFzdFVuZG9GcmFnbWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgZmlyc3RGcmFnbWVudF87Ci0gIAotICBwcml2YXRlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB3aWRnZXRGYWN0b3J5XzsKLSAgcHJpdmF0ZSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0U3RhY2tfOwotICBwcml2YXRlIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRTdGFja1N0YWNrXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0VGFibGVfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgICAgICAgICAgICB3aWRnZXRSZWdpc3RyeV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlICAgICAgICAgICAgICAgICAgICAgIHdpZGdldEZhY3RvcnlUYWJsZV87Ci0gICAgCi0gIHB1YmxpYyBXaXphcmRQYWdlTWFuYWdlciggU2ltcGxlV2lkZ2V0UmVnaXN0cnkgIHJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpemFyZFBhZ2VGYWN0b3J5ICAgICBwYWdlRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV2l6YXJkICAgICAgICAgICAgICAgd2l6YXJkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFGbG93TWFuYWdlciAgICAgICBkYXRhTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlRW52aXJvbm1lbnQgICAgZW52aXJvbm1lbnQgKQotICB7IAotICAgIHN1cGVyKCBlbnZpcm9ubWVudCwgZGF0YU1hbmFnZXIgKTsgIAotICAgIAotICAJcGFnZUZhY3RvcnlfICAgICAgICA9IHBhZ2VGYWN0b3J5OwotICAJcGFnZVRhYmxlXyAgICAgICAgICA9IG5ldyBIYXNodGFibGUoKTsgIAotICAJcmVnaXN0cnlfICAgICAgICAgICA9IHJlZ2lzdHJ5OwotICAJd2l6YXJkXyAgICAgICAgICAgICA9IHdpemFyZDsKLQkgIHdpZGdldFRhYmxlXyAgICAgICAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JICB3aWRnZXRGYWN0b3J5VGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotCSAgd2lkZ2V0UmVnaXN0cnlfICAgICA9IFdpZGdldFJlZ2lzdHJ5Lmluc3RhbmNlKCk7Ci0JICB3aWRnZXRTdGFja1N0YWNrXyAgID0gbmV3IFN0YWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyAgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCkKLSAgewotICAgIGlmKCBmaXJzdFBhZ2VfID09IG51bGwgKQotICAgIHsKLSAgICAgIGZpcnN0UGFnZV8gPSAoUGFnZVdpemFyZERhdGFFdmVudHMpZ2V0TmV4dFBhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZpcnN0UGFnZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIHJ1bkZvcndhcmRUb05leHRTdG9wKCkKLSAgeyAgICAKLSAgCWZpcnN0RnJhZ21lbnRfICA9IHRydWU7Ci0gIAluZXh0UGFnZV8gICAgICAgPSBudWxsOwotIAotICAJSVdpemFyZENvbnRhaW5lciBjb250YWluZXIgPSB3aXphcmRfLmdldENvbnRhaW5lcigpOwotICAJCi0gIAlpZiggY29udGFpbmVyID09IG51bGwgfHwgY29udGFpbmVyLmdldEN1cnJlbnRQYWdlKCkgPT0gbnVsbCApCi0gIAl7Ci0gIAkgIGNvbnRhaW5lciA9IG51bGw7Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBzdXBlci5ydW5Gb3J3YXJkVG9OZXh0U3RvcCggY29udGFpbmVyICk7Ci0gIH0KLSAgICAKLSAgcHVibGljIElXaXphcmRQYWdlIGdldEN1cnJlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50UGFnZV87Ci0gIH0KLSAgICAKLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dFBhZ2UoKQotICB7CQotCSAKLSAgICBuZXh0UGVla1BhZ2VfID0gbnVsbDsKLSAgICAKLQl0cnkKLQl7Ci0gIAluZXh0UGVla1BhZ2VfID0gZ2V0TmV4dFBhZ2VJbkdyb3VwKCB3aWRnZXRGYWN0b3J5XywgZmFsc2UgKTsKLQkJCi0JICBpZiggbmV4dFBlZWtQYWdlXyA9PSBudWxsICkKLQkgIHsKLQkgICAgLy8gSWYgYSBwYWdlIGlzIGZvdW5kIG5leHRQYWdlXyB3aWxsIGJlIHNldCB0byBpdHMgdmFsdWUgaW4gdGhlIG1ldGhvZCBiZWxvdy4KLSAgCSAgICBlbmdpbmVfLnBlZWtGb3J3YXJkVG9OZXh0U3RvcCgpOwotCSAgfQotCX0KLQljYXRjaCggVGhyb3dhYmxlIGV4YyApCi0JewotCSAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLSAgCQotICAgIHJldHVybiBuZXh0UGVla1BhZ2VfICE9IG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpCi0gIHsgIAkKLQl0cnkKLQl7ICAgIAotICAJLy8gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcGFnZSBzbyB0aGF0Ci0gIAkvLyB3aGVuIHdlIG1vdmUgZm9yd2FyZCBiZWxvdyB0aGUgZGF0YSBpcyBhdmFpbGFibGUuCi0gIAlpZiggY3VycmVudFBhZ2VfICE9IG51bGwgKSBjdXJyZW50UGFnZV8uZ2V0RGF0YUV2ZW50cygpLmV4dGVybmFsaXplKCk7Ci0gIAkKLSAgICBpZiggZW52aXJvbm1lbnRfLmdldExvZygpLmlzRW5hYmxlZCgpICkKLSAgICB7Ci0gICAgICBlbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKElMb2cuSU5GTywgIndzX2R0X2NtZF9lbmdpbmUiLCA1MDEwLCB0aGlzLCAiQ21kIHN0YWNrIGR1bXA6IiwgZW5naW5lXyApOwotICAgIH0KLSAgICAKLQkgIG5leHRQYWdlXyA9IGdldE5leHRQYWdlSW5Hcm91cCggd2lkZ2V0RmFjdG9yeV8sIHRydWUgKTsKLQkKLQkgIGlmKCBuZXh0UGFnZV8gPT0gbnVsbCApCi0JICB7Ci0JICAgIHdpZGdldEZhY3RvcnlfID0gbnVsbDsKLQkgICAgd2lkZ2V0U3RhY2tfICAgPSBudWxsOwotCQkKLSAgCSAgSVN0YXR1cyBzdGF0dXMgPSBydW5Gb3J3YXJkVG9OZXh0U3RvcCgpOwotICAJCi0gIAkgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SICkKLSAgCSAgewotICAJICAgIC8vIEFuIGVycm9yIGhhcyBvY2N1cmVkIHNvIHdlIG5lZWQgdW5kbyB0byB0aGUgcHJldmlvdXMgc3RvcCBwb2ludC4KLSAgCSAgICB1bmRvVG9MYXN0UGFnZSgpOwotICAJICB9Ci0JICB9Ci0JCi0gIAlpZiggbmV4dFBhZ2VfICE9IG51bGwgKSBuZXh0UGFnZV8uc2V0V2l6YXJkKCB3aXphcmRfICk7Ci0gIAkgIAkKLSAgCXJldHVybiBuZXh0UGFnZV87Ci0JfQotCWNhdGNoKCBUaHJvd2FibGUgZXhjICkKLQl7Ci0JICBleGMucHJpbnRTdGFja1RyYWNlKCk7CQotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBoYW5kbGVQYWdlVmlzaWJsZSggUGFnZVdpemFyZERhdGFFdmVudHMgcGFnZSwgYm9vbGVhbiBpc1BhZ2VWaXNpYmxlICkKLSAgewotICAgIGlmKCAhaXNQYWdlVmlzaWJsZSAmJiBwYWdlID09IGZpcnN0UGFnZV8gJiYgcGFnZSA9PSBjdXJyZW50UGFnZV8gKQotICAgIHsKLSAgICAgIC8vIFdlIGFyZSBtb3ZpbmcgYmFjayBvbmUgcGFnZSBmcm9tIHRoZSBmaXJzdCBwYWdlLiAgVGhpcyBjYW4ndCBoYXBwZW4gd2l0aCBwb3B1cCB3aXphcmRzCi0gICAgICAvLyBzaW5jZSB0aGUgcHJldmlvdXMgYnV0dG9uIHdvdWxkIGJlIGdyZXllZCBvdXQuICBCdXQgd2hlbiB0aGUgbmV3IHdpemFyZCBsYXVuY2hlcyB0aGlzIHdpemFyZAotICAgICAgLy8gdGhlIHByZXZpb3VzIGJ1dHRvbiBpcyBub3QgZ3JleWVkIG91dCBhbmQgYnJpbmdzIHRoZSB1c2VyIGJhY2sgdG8gdGhlIGxpc3Qgd2l6YXJkcyB0byBzZWxlY3QuCi0gICAgICAvLyBUaGVyZWZvcmUsIHdlIG11c3QgdW53aW5kIHRoZSBjb21tYW5kIGVuZ2luZSBhbmQgZ2V0IHJlYWR5IGZvciB0aGUgdXNlciB0byBpbnZva2UgdGhpcyB3aXphcmQgCi0gICAgICAvLyBhZ2Fpbi4gIFdlIGFyZSBhc3N1bWluZyBoZXJlIHRoYXQgdGhlIGZpcnN0IHBhZ2UgaXMgbmV2ZXIgcGFydCBvZiBhIHdpZGdldCBncm91cCEKLSAgCSAgdW5kb1RvTGFzdFBhZ2UoKTsJICAKLSAgICAgIGN1cnJlbnRQYWdlXyA9IG51bGw7Ci0gICAgICBmaXJzdFBhZ2VfICAgPSBudWxsOwotICAgIH0KLSAgCWlmKCBjdXJyZW50UGFnZV8gIT0gbnVsbCAmJiBwYWdlID09IGN1cnJlbnRQYWdlXy5nZXRQcmV2aW91c1BhZ2UoKSAmJiBpc1BhZ2VWaXNpYmxlICkKLSAgCXsKLSAgCSAgLy8gV2UgYXJlIG1vdmluZyBiYWNrIG9uZSBwYWdlLgotICAJICAvLyBOb3RlOiB3ZSBkb24ndCBpbnRlcm5hbGl6ZSB0aGUgcHJldmlvdXMgcGFnZSBhbmQgd2UgZG8gbm90IGV4dGVybmFsaXplIHRoZSBjdXJyZW50IHBhZ2UuCi0gIAkgIC8vICAgICAgIHdlIGFyZSBiYXNpY2FsbHkganVzdCBsZWF2aW5nIHRoZSBjdXJyZW50IHBhZ2Ugd2l0aG91dCByZXRyaWV2aW5nIGl0cyBzdGF0ZSBhbmQKLSAgCSAgLy8gICAgICAgbW92aW5nIHRvIHRoZSBwcmV2aW91cyBwYWdlIHdoaWNoIGFscmVhZHkgaGFzIGl0cyBzdGF0ZSBzZXQuCi0JCi0JICAgIGlmKCB3aWRnZXRGYWN0b3J5XyAhPSBudWxsICkKLQkgICAgewotCQkgICAgaWYoIHdpZGdldFN0YWNrXy5zaXplKCkgPiAwICkKLQkJICAgIHsKLQkJICAgICAgd2lkZ2V0U3RhY2tfLnBvcCgpOwotCQkgICAgfQotCQkKLQkJICAgIGlmKCB3aWRnZXRTdGFja18uc2l6ZSgpID09IDAgKQotCQkgICAgewotCQkgICAgICB3aWRnZXRGYWN0b3J5XyA9IG51bGw7Ci0JCSAgICAgIHdpZGdldFN0YWNrXyA9IG51bGw7Ci0JCSAgICAgIHdpZGdldFN0YWNrU3RhY2tfLnBvcCgpOwotCQkgICAgfQotCSAgICB9Ci0JICAKLQkgICAgaWYoIHdpZGdldEZhY3RvcnlfID09IG51bGwgKQotCSAgICB7Ci0gIAkgICAgdW5kb1RvTGFzdFBhZ2UoKTsKLQkgICAgfQotCSAgCi0gICAgICAvLyBTaW5jZSB3ZSBhcmUgbW92aW5nIGJhY2t3YXJkcyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUKLSAgICAgIC8vIGN1cnJlbnQgcGFnZSBvYmplY3QgZnJvbSB0aGUgbWFwcGluZyB0YWJsZS4KLSAgICAgIGRhdGFNYW5hZ2VyXy51bnByb2Nlc3MoIGN1cnJlbnRQYWdlXy5nZXREYXRhRXZlbnRzKCkgKTsKLSAgICAgIAotICAJICBjdXJyZW50UGFnZV8gPSBwYWdlOwotICAJfQkKLSAgCWVsc2UgaWYoIGlzUGFnZVZpc2libGUgKQotICAJewotCSAgICB0cnkKLQkgICAgewotICAJICAgIC8vIFdlIGFyZSBtb3ZpbmcgZm9yd2FyZCBvbmUgcGFnZS4KLSAgCSAgICBXaWRnZXREYXRhRXZlbnRzIGRhdGFFdmVudHMgPSBwYWdlLmdldERhdGFFdmVudHMoKTsKLSAgCSAgCi0gIAkgICAgZGF0YU1hbmFnZXJfLnByb2Nlc3MoIGRhdGFFdmVudHMgKTsgIC8vIFB1c2ggbW9kZWwgZGF0YSBpbnRvIHRoZSBuZXcgcGFnZS4KLSAgCSAgICBkYXRhRXZlbnRzLmludGVybmFsaXplKCk7Ci0gIAkgIAotICAJICAgIHBhZ2UudmFsaWRhdGVQYWdlVG9TdGF0dXMoKTsgIAkgIAotCSAgICB9Ci0JICAgIGNhdGNoKCBUaHJvd2FibGUgZXhjICkKLQkgICAgewotCQkgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICB9Ci0JICAgIGZpbmFsbHkKLQkgICAgewotCSAgCSAgaWYoIGN1cnJlbnRQYWdlXyAhPSBudWxsICkgcGFnZS5zZXRQcmV2aW91c1BhZ2UoIGN1cnJlbnRQYWdlXyApOwotCSAgICAJICAKLQkgIAkgIGN1cnJlbnRQYWdlXyA9IHBhZ2U7ICAKLQkgICAgfQotICAJfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgeyAJCi0gIAkvLyBXZSBuZWVkIHRvIHNpbXVsYXRlIHRoZSBuZXh0IGJ1dHRvbiBiZWluZyBwcmVzc2VkIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHBhZ2VzLgotICAJLy8gSWYgYW4gZXJyb3Igb2NjdXJzIHdlIHdpbGwgcmV0dXJuIGZhbHNlIGFuZCByZXNldCB0aGUgY29tbWFuZCBzdGFjayBiYWNrIG91ciBvcmlnaW5hbCBzdGF0ZS4KLSAgCWJvb2xlYW4gICAgICAgICAgICAgIGRvbmVPayAgICAgICAgID0gdHJ1ZTsKLSAgCVBhZ2VXaXphcmREYXRhRXZlbnRzIHN0YXJ0UGFnZSAgICAgID0gY3VycmVudFBhZ2VfOwotICAgIGludCAgICAgICAgICAgICAgICAgIHN0YWNrU3RhY2tTaXplID0gd2lkZ2V0U3RhY2tTdGFja18uc2l6ZSgpOwotICAgIAotICAgIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBjdXJyZW50RmFjdG9yeSA9IHdpZGdldEZhY3RvcnlfOwotICAJCi0gIAkvLyBFeHRlcm5hbGl6ZSB0aGUgY3VycmVudCBwYWdlLgotICAJY3VycmVudFBhZ2VfLmdldERhdGFFdmVudHMoKS5leHRlcm5hbGl6ZSgpOwotICAJCi0gIAkvLyBMb29wIHRocm91Z2ggc3Vic2VxdWVudCBwYWdlcy4KLSAgCWRvCi0gIAl7ICAJICAKLSAgCSAgSVN0YXR1cyBzdGF0dXMgPSBydW5Gb3J3YXJkVG9OZXh0U3RvcCgpOwkgIAotICAJICAKLSAgCSAgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgKQotICAJICB7Ci0gIAkgIAkvLyBBbiBlcnJvciBvY2N1cmVkIGluIG9uZSBvZiB0aGUgY29tbWFuZHMuCi0gIAkgIAlkb25lT2sgPSBmYWxzZTsKLSAgCSAgfQotICAJfQotICAJd2hpbGUoIG5leHRQYWdlXyAhPSBudWxsICYmIGRvbmVPayk7Ci0gIAkKLSAgCWlmKCAhZG9uZU9rICkKLSAgCXsKLSAgCSAgLy8gQW4gZXJyb3Igb2NjdXJlZCwgc28gd2UgbmVlZCB0byByZXR1cm4gdGhlIGNvbW1hbmQgc3RhY2sgdG8gaXQncwotICAJICAvLyBvcmdpbmFsIHN0YXRlLgotICAJICBQYWdlV2l6YXJkRGF0YUV2ZW50cyBwYWdlID0gbnVsbDsKLSAgCSAgYm9vbGVhbiAgICAgICAgICAgICAgZG9uZSA9IGZhbHNlOwotICAJICAKLSAgCSAgZG8KLSAgCSAgewotICAJICAgIGRvbmUgPSBlbmdpbmVfLnVuZG9Ub0xhc3RTdG9wKCk7Ci0gIAkgICAgcGFnZSA9IGdldFBhZ2UoIGxhc3RVbmRvRnJhZ21lbnRfICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcGFnZSA9PSBudWxsICYmIAotICAgICAgICAgICAgY3VycmVudEZhY3RvcnkgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgIGxhc3RVbmRvRnJhZ21lbnRfICE9IG51bGwgJiYKLSAgICAgICAgICAgIGdldFdpZGdldEZhY3RvcnkoIGxhc3RVbmRvRnJhZ21lbnRfLmdldElkKCkgKSA9PSBjdXJyZW50RmFjdG9yeSApCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBUaGUgY3VycmVudCB3aWRnZXQgZmFjdG9yeSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhc3QgZnJhZ21lbnQgdGhhdCB3YXMgdW5kb25lLgotICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgYXJlIGJhY2sgdG8gd2hlcmUgd2Ugc3RhcnRlZC4KLSAgICAgICAgICBkb25lID0gdHJ1ZTsgICAgCi0gICAgICAgICAgCi0gICAgICAgICAgLy8gUmVzdG9yZSB0aGUgd2lkZ2V0U3RhY2tTdGFjayBiYWNrIHRvIHRoZSBzdGF0ZSBpdCB3YXMgaW4gYmVmb3JlCi0gICAgICAgICAgLy8gcnVubmluZyBmb3J3YXJkLgotICAgICAgICAgIHdpZGdldFN0YWNrU3RhY2tfLnNldFNpemUoIHN0YWNrU3RhY2tTaXplICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgU3RhY2tFbnRyeSBlbnRyeSA9IChTdGFja0VudHJ5KXdpZGdldFN0YWNrU3RhY2tfLnBlZWsoKTsKLSAgICAgICAgICAKLSAgICAgICAgICB3aWRnZXRGYWN0b3J5XyA9IGVudHJ5LmZhY3RvcnlfOwotICAgICAgICAgIHdpZGdldFN0YWNrXyAgID0gZW50cnkuc3RhY2tfOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBhZ2UgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICB3aWRnZXRGYWN0b3J5XyA9IG51bGw7Ci0gICAgICAgICAgd2lkZ2V0U3RhY2tfID0gbnVsbDsKLSAgICAgICAgfQotICAJICB9Ci0gIAkgIHdoaWxlKCBwYWdlICE9IHN0YXJ0UGFnZSAmJiAhZG9uZSApOyAJICAKLSAgCX0KLSAgCQotICAJcmV0dXJuIGRvbmVPazsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpCi0gIHsKLSAgCXdoaWxlKCAhZW5naW5lXy51bmRvVG9MYXN0U3RvcCgpICl7fQotICAJCi0gIAlyZXR1cm4gdHJ1ZTsKLSAgfQotICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwZWVrRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsgICAgIAkKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmcmFnbWVudCBpcyBpbiBvdXIgcGFnZSB0YWJsZS4KLSAgICBuZXh0UGVla1BhZ2VfID0gZ2V0UGFnZSggZnJhZ21lbnQgKTsKLSAgICAgICAgICAJCi0JICBpZiggbmV4dFBlZWtQYWdlXyA9PSBudWxsICkKLQkgIHsKLQkgICAgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCBmcmFnbWVudC5nZXRJZCgpICk7Ci0JICAKLQkgICAgaWYoIGZhY3RvcnkgIT0gbnVsbCApCi0JICAgIHsKLQkJICAgIG5leHRQZWVrUGFnZV8gPSBnZXROZXh0UGFnZUluR3JvdXAoIGZhY3RvcnksIGZhbHNlICk7ICAKLQkgICAgfQotCSAgfQotCQotICAgIHJldHVybiBuZXh0UGVla1BhZ2VfID09IG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIG5leHRGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIC8vIElmIHRoZSBzdXBlciBjbGFzcyBuZXh0RnJhZ21lbnQgd2FudCB1cyB0byBzdG9wIHRoZW4gd2Ugd2lsbCBzdG9wIHJpZ2h0IGF3YXkuCi0gICAgaWYoICFzdXBlci5uZXh0RnJhZ21lbnQoIGZyYWdtZW50ICkgKSByZXR1cm4gZmFsc2U7Ci0gICAgCi0gIAkvLyBUaGUgZmlyc3QgZnJhZ21lbnQgaXMgZWl0aGVyIGF0IHRoZSBzdGFydCBvZiB0aGUgd2l6YXJkCi0gIAkvLyBvciBpdCBpcyBvbiBhIHdpemFyZCBwYWdlLiAgSW4gZWl0aGVyIGNhc2Ugd2UgZG8gbm90IHdhbnQgCi0gIAkvLyB0byBzdG9wIGlmIGEgcGFnZSBpcyBmb3VuZC4KLSAgCWlmKCBmaXJzdEZyYWdtZW50XyApCi0gIAl7Ci0gIAkgIGZpcnN0RnJhZ21lbnRfID0gZmFsc2U7Ci0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0JICAgIHdpZGdldEZhY3RvcnlfID0gZ2V0V2lkZ2V0RmFjdG9yeSggZnJhZ21lbnQuZ2V0SWQoKSApOwotCSAgCi0JICAgIGlmKCB3aWRnZXRGYWN0b3J5XyAhPSBudWxsICkKLQkgICAgewotCQkgICAgd2lkZ2V0U3RhY2tfID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgIAotICAgICAgICBuZXh0UGFnZV8gPSBnZXROZXh0UGFnZUluR3JvdXAoIHdpZGdldEZhY3RvcnlfLCB0cnVlICk7Ci0JCQotICAgICAgICBpZiggbmV4dFBhZ2VfID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gV2UgZm91bmQgYSB3aWRnZXQgY29udHJpYnV0b3IgZm9yIHRoaXMgZnJhZ21lbnQsIGJ1dCBubyBwYWdlIHdhcyBkZWxpdmVyZWQgZm9yIGl0LgotICAgICAgICAgIC8vIFdlIHdpbGwgdGhlcmVmb3JlLCBub3QgcHV0IGl0IG9uIG91ciBzdGFjayBvZiB3aWRnZXQgc3RhY2tzLgotICAgICAgICAgIHdpZGdldFN0YWNrXyA9IG51bGw7Ci0gICAgICAgICAgd2lkZ2V0RmFjdG9yeV8gPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotCQkgICAgICBTdGFja0VudHJ5IGVudHJ5ID0gbmV3IFN0YWNrRW50cnkoKTsKLQkJCi0JCSAgICAgIGVudHJ5LmZhY3RvcnlfID0gd2lkZ2V0RmFjdG9yeV87Ci0JCSAgICAgIGVudHJ5LnN0YWNrXyAgID0gd2lkZ2V0U3RhY2tfOwotCQkgICAgICB3aWRnZXRTdGFja1N0YWNrXy5wdXNoKCBlbnRyeSApOwotICAgICAgICB9Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0gIAkgICAgbmV4dFBhZ2VfID0gZ2V0UGFnZSggZnJhZ21lbnQgKTsKLQkgICAgfQotICAJfSAgCSAgCQotICAJCi0gICAgcmV0dXJuIG5leHRQYWdlXyA9PSBudWxsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRvRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgCWxhc3RVbmRvRnJhZ21lbnRfID0gZnJhZ21lbnQ7Ci0gIAkKLSAgCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAKLSAgcHJpdmF0ZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBnZXROZXh0UGFnZUluR3JvdXAoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBmYWN0b3J5LCBib29sZWFuIHB1c2hOZXdXaWRnZXQgKQotICB7Ci0JICBQYWdlV2l6YXJkRGF0YUV2ZW50cyBwYWdlID0gbnVsbDsKLQkKLQkgIGlmKCBmYWN0b3J5ICE9IG51bGwgKQotCSAgewkgIAotCSAgICBJTmFtZWRXaWRnZXRDb250cmlidXRvciBuZXdXaWRnZXQgPSBudWxsOwotCQkgIAotCSAgICBpZiggd2lkZ2V0U3RhY2tfID09IG51bGwgfHwgd2lkZ2V0U3RhY2tfLnNpemUoKSA9PSAwICkKLQkgICAgewotCQkgICAgbmV3V2lkZ2V0ID0gZmFjdG9yeS5nZXRGaXJzdE5hbWVkV2lkZ2V0KCk7ICAgCi0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCSAgICBJTmFtZWRXaWRnZXRDb250cmlidXRvciBjdXJyZW50V2lkZ2V0ID0gKElOYW1lZFdpZGdldENvbnRyaWJ1dG9yKXdpZGdldFN0YWNrXy5wZWVrKCk7Ci0JCSAgICBuZXdXaWRnZXQgPSBmYWN0b3J5LmdldE5leHROYW1lZFdpZGdldCggY3VycmVudFdpZGdldCApOyAKLQkgICAgfQotCQkgIAotCSAgICBpZiggbmV3V2lkZ2V0ICE9IG51bGwgKQotCSAgICB7Ci0JCSAgICBwYWdlID0gZ2V0UGFnZSggbmV3V2lkZ2V0ICk7Ci0JCQotCQkgICAgaWYoIHB1c2hOZXdXaWRnZXQgKQotCQkgICAgewotCQkgICAgICB3aWRnZXRTdGFja18ucHVzaCggbmV3V2lkZ2V0ICk7Ci0JCSAgICB9Ci0JICAgIH0KLQkgIH0KLQkJCi0JICByZXR1cm4gcGFnZTsgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdW5kb1RvTGFzdFBhZ2UoKQotICB7Ci0gICAgYm9vbGVhbiBzdGFja0VtcHR5ICA9IGZhbHNlOwotCSAgYm9vbGVhbiBkb25lVW5kb2luZyA9IGZhbHNlOwotICAgIAotCSAgd2hpbGUoICFkb25lVW5kb2luZyApCi0JICB7Ci0JICAgIHN0YWNrRW1wdHkgPSBlbmdpbmVfLnVuZG9Ub0xhc3RTdG9wKCk7Ci0JICAKLQkgICAgSVdpemFyZFBhZ2UgcGFnZSA9IG51bGw7Ci0JICAKLQkgICAgaWYoIGxhc3RVbmRvRnJhZ21lbnRfICE9IG51bGwgKQotCSAgICB7Ci0JICAgICAgcGFnZSA9IGdldFBhZ2UoIGxhc3RVbmRvRnJhZ21lbnRfICk7Ci0JCQotCSAgICAgIGlmKCBwYWdlID09IG51bGwgKQotCSAgICAgIHsKLQkJICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgZ3JvdXAgcGFnZSBmcmFnbWVudCB3YXMgZm91bmQuCi0JCSAgICAgIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSggbGFzdFVuZG9GcmFnbWVudF8uZ2V0SWQoKSApOwotCQkgIAotCQkgICAgICBpZiggZmFjdG9yeSAhPSBudWxsICkKLQkJICAgICAgewotCQkgICAgICAgIFN0YWNrRW50cnkgZW50cnkgPSAoU3RhY2tFbnRyeSl3aWRnZXRTdGFja1N0YWNrXy5wZWVrKCk7Ci0JCQkKLQkJICAgICAgICB3aWRnZXRGYWN0b3J5XyA9IGVudHJ5LmZhY3RvcnlfOwotCQkgICAgICAgIHdpZGdldFN0YWNrXyAgID0gZW50cnkuc3RhY2tfOwkKLQkJCQotCQkgICAgICAgIGlmKCB3aWRnZXRTdGFja18gIT0gbnVsbCAmJiAhd2lkZ2V0U3RhY2tfLmVtcHR5KCkgKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGN1cnJlbnRXaWRnZXQgPSAoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Ipd2lkZ2V0U3RhY2tfLnBlZWsoKTsKLQkJCQotCQkgICAgICAgICAgcGFnZSA9IGdldFBhZ2UoIGN1cnJlbnRXaWRnZXQgKTsKLQkJICAgICAgICB9Ci0JCSAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIAotCSAgICBkb25lVW5kb2luZyA9IHBhZ2UgIT0gbnVsbCB8fCBzdGFja0VtcHR5OwotCSAgfQotICB9Ci0gIAotICBwcml2YXRlIFBhZ2VXaXphcmREYXRhRXZlbnRzIGdldFBhZ2UoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmcmFnbWVudCBpcyBpbiBvdXIgcGFnZSB0YWJsZS4KLSAgCVBhZ2VXaXphcmREYXRhRXZlbnRzIHBhZ2UgPSAoUGFnZVdpemFyZERhdGFFdmVudHMpcGFnZVRhYmxlXy5nZXQoIGZyYWdtZW50ICk7IAotICAJU3RyaW5nICAgICAgaWQgICA9IGZyYWdtZW50LmdldElkKCk7ICAgICAgCQotICAgICAgICAgIAkKLSAgICBpZiggcGFnZSA9PSBudWxsICYmIGlkICE9IG51bGwgKQotICAgIHsKLSAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGZyYWdtZW50IGlkIGlzIGluIHRoZSByZWdpc3RyeS4KLSAgICAgIFBhZ2VJbmZvIHBhZ2VJbmZvID0gcmVnaXN0cnlfLmdldFBhZ2VJbmZvKCBpZCApOyAgICAgICAgICAJICAKLSAgICAgICAgICAgICAgCi0gICAgICBpZiggcGFnZUluZm8gIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIHBhZ2UgPSBwYWdlRmFjdG9yeV8uZ2V0UGFnZSggcGFnZUluZm8sIHRoaXMgKTsKLSAgICAgICAgcGFnZVRhYmxlXy5wdXQoIGZyYWdtZW50LCBwYWdlICk7ICAgICAgICAgICAgCQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBwYWdlOwotICB9ICAgIAotICAKLSAgcHJpdmF0ZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBnZXRQYWdlKCBJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXQgKQotICB7Ci0JICBQYWdlV2l6YXJkRGF0YUV2ZW50cyBwYWdlID0gKFBhZ2VXaXphcmREYXRhRXZlbnRzKXdpZGdldFRhYmxlXy5nZXQoIHdpZGdldCApOwotCi0JICBpZiggcGFnZSA9PSBudWxsICkKLQkgIHsKLQkgICAgUGFnZUluZm8gcGFnZUluZm8gPSBuZXcgUGFnZUluZm8od2lkZ2V0LmdldFRpdGxlKCksIHdpZGdldC5nZXREZXNjcmlwdGlvbigpLCB3aWRnZXQuZ2V0V2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgKTsKLQkgIAotCSAgICBwYWdlID0gcGFnZUZhY3RvcnlfLmdldFBhZ2UoIHBhZ2VJbmZvLCB0aGlzICk7Ci0JICAgIHdpZGdldFRhYmxlXy5wdXQoIHdpZGdldCwgcGFnZSApOwotCSAgfQotCQotCSAgcmV0dXJuIHBhZ2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoIFN0cmluZyBpZCApCi0gIHsKLQkgIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBmYWN0b3J5ID0gKElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSl3aWRnZXRGYWN0b3J5VGFibGVfLmdldCggaWQgKTsKLQkKLQkgIGlmKCBmYWN0b3J5ID09IG51bGwgKQotCSAgewotCSAgICAvLyBUaGUgZmFjdG9yeSBpcyBub3QgaW4gb3VyIHRhYmxlIHNvIHdlIHdpbGwgdHJ5IHRoZSByZWdpc3RyeS4KLQkgICAgZmFjdG9yeSA9IHdpZGdldFJlZ2lzdHJ5Xy5nZXRGYWN0b3J5KCBpZCApOwotCSAgCi0JICAgIGlmKCBmYWN0b3J5ICE9IG51bGwgKQotCSAgICB7Ci0JICAgICAgd2lkZ2V0RmFjdG9yeVRhYmxlXy5wdXQoIGlkLCBmYWN0b3J5ICk7Ci0JICAgICAgZmFjdG9yeS5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YU1hbmFnZXJfLmdldE1hcHBpbmdSZWdpc3RyeSgpICk7Ci0JCSAgICBkYXRhTWFuYWdlcl8ucHJvY2VzcyggZmFjdG9yeSApOwotCSAgICB9Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JICAgIGRhdGFNYW5hZ2VyXy5wcm9jZXNzKCBmYWN0b3J5ICk7Ci0JICB9Ci0JCi0JICByZXR1cm4gZmFjdG9yeTsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBTdGFja0VudHJ5Ci0gIHsKLSAgICBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZmFjdG9yeV87Ci0JICBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvcG9wdXAvRHluYW1pY1BvcHVwV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvcG9wdXAvRHluYW1pY1BvcHVwV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTc0OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL3BvcHVwL0R5bmFtaWNQb3B1cFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMyAgIDEyOTIzMiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDQxNyAgIDEzNjU5NiBqb2FuQGNhLmlibS5jb20gLSBKb2FuIEhhZ2dhcnR5Ci0gKiAyMDA2MDczMSAgIDEyMDM3OCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgRmllbGRzIG5vdCB2aXNpYmxlIGluIExhcmdlIGZvbnQgc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhRmxvd01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlUG9wdXBQYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaXphcmRQYWdlRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwb3B1cCBkeW5hbWljIHdpemFyZHMuICBUaGUgcG9wdXBNZW51cyBleHRlbnNpb24gaXMgdXNlZAotICogdGhlIGNvbnRyaWJ1dGUgYSBwb3B1cCB0byBFY2xpcHNlLiAgVGhlIGNsYXNzIGluIHRoZSBhY3Rpb24gZWxlbWVudCBzaG91bGQgcmVmZXJlbmNlCi0gKiB0aGlzIER5bmFtaWNQb3B1cFdpemFyZCBjbGFzcy4gIFRoaXMgaWQgYXR0cmlidXRlIGluIHRoZSBhY3Rpb24gZWxlbWVudCBzaG91bGQgY29udGFpbgotICogYW4gaWQgdGhhdCByZWZlcmVuY2VzIGEgZHluYW1pY1dpemFyZCBleHRlbnNpb24gcG9pbnQuICBUaGlzIGlzIGhvdyB0aGUgRHluYW1pY1BvcHVwV2l6YXJkCi0gKiBjbGFzcyBrbm93cyB3aGljaCB3aXphcmQgdG8gZGlzcGxheS4KLSAqICAgCi0gKiBOb3RlOiB0aGUgaWQgYXR0cmlidXRlIGluIHRoZSBvYmplY3RDb250cmlidXRpb24gZWxlbWVudCByZWZlcnMgdG8gYW4KLSAqICAgICAgIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGV4dGVuc2lvbiBwb2ludC4gIFRoZSBpZHMgaW4gb2JqZWN0Q29udHJpYnV0aW9uCi0gKiAgICAgICBlbGVtZW50IGFuZCB0aGUgYWN0aW9uIGVsZW1lbnQgbmVlZCBub3QgYmUgdGhlIHNhbWUgYXMgdGhleSBhcmUgaW4gdGhlCi0gKiAgICAgICBleGFtcGxlIGJlbG93LgotICoKLSAqPHByZT4KLSAqICAgJmx0O2V4dGVuc2lvbgotICogICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyImZ3Q7Ci0gKiZsdDshLS0gSUZpbGUgKi53c2RsIHBvcHVwIG1lbnUgLS0mZ3Q7Ci0gKiAgICAgJmx0O29iamVjdENvbnRyaWJ1dGlvbgotICogICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAqICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gKiAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCImZ3Q7Ci0gKiZsdDshLS0gV1NETCBUbyBKYXZhIEJlYW4gUHJveHkgLS0mZ3Q7Ci0gKiAgICAgICAgJmx0O2FjdGlvbgotICogICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gKiAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAqICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gKiAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCImZ3Q7Ci0gKiAgICAgICAgJmx0Oy9hY3Rpb24mZ3Q7Ci0gKiAgICAgJmx0Oy9vYmplY3RDb250cmlidXRpb24mZ3Q7Ci0gKiAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKgotICogICAmbHQ7ZXh0ZW5zaW9uCi0gKiAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIiZndDsKLSAqICAgICAmbHQ7ZHluYW1pY1dpemFyZAotICogICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYiCi0gKiAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuQ2xpZW50V2lkZ2V0QmluZGluZyIKLSAqICAgICAgICAgICB0aXRsZT0iJVdJWkFSRF9USVRMRV9XU0MiCi0gKiAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCImZ3Q7Ci0gKiAgICAgJmx0Oy9keW5hbWljV2l6YXJkJmd0OwotICogICZsdDsvZXh0ZW5zaW9uJmd0OwotICo8L3ByZT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljUG9wdXBXaXphcmQgZXh0ZW5kcyBEeW5hbWljV2l6YXJkIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17Ci0gIHByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb25fOwotICAKLSAgcHVibGljIER5bmFtaWNQb3B1cFdpemFyZCgpCi0gIHsKLQlzdXBlcigpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCNnZXRXaXphcmRQYWdlRmFjdG9yeSgpCi0gICAqLwotICBwcm90ZWN0ZWQgV2l6YXJkUGFnZUZhY3RvcnkgZ2V0V2l6YXJkUGFnZUZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVQb3B1cFBhZ2VGYWN0b3J5KCBnZXRJZCgpICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAoKElDb25maWd1cmF0aW9uRWxlbWVudClvcmlnaW5hbEVsZW1lbnRfLmdldFBhcmVudCgpKS5nZXRBdHRyaWJ1dGUoICJpZCIgKTsgIAotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBJQWN0aW9uRGVsZWdhdGUjcnVuCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIAotICB7Ci0gICAgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgPSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgaWQgICAgICA9IGdldElkKCk7Ci0gICAgCi0JaWYoIGNvbnRleHQuc2hvd0RpYWxvZyhpZCkgKQotCXsKLQkgIC8vIExhdW5jaCB0aGUgd2l6YXJkLgotCSAgaW5pdCggUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgZ2V0U2VsZWN0aW9uKCkgKTsgIAotCSAgICAKLQkgIFdpemFyZERpYWxvZyBkaWFsb2c9IG5ldyBXaXphcmREaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCB0aGlzKTsKLQkgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAKLSAgICBpZiggZ2V0U3RhcnRpbmdQYWdlKCkgIT0gbnVsbCApCi0gICAgewotCSAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkgIGZpbmFsIFByb2dyZXNzTW9uaXRvckRpYWxvZyBtb25pdG9yID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCSAgCi0JICB0cnkKLQkgIHsKLQkgICAgbW9uaXRvci5ydW4oIGZhbHNlLCBmYWxzZSwgbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICBydW5IZWFkTGVzcyggZ2V0U2VsZWN0aW9uKCksIG1vbml0b3IgKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLQkgIH0KLQkgIGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGMgKQotCSAgeyAKLQkgIH0KLQkgIGNhdGNoKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YyApCi0JICB7Ci0JICB9Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogUnVucyBvbmx5IHRoZSBDb21tYW5kcyBhc3NvY2lhdGVkIHdpdGggdGhlIGR5bmFtaWMgd2l6YXJkLgotICAgKiAKLSAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gZnJvbSB0aGUgdXNlci4KLSAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdGhhdCB0aGlzIGV4ZWN1dGlvbiBzaG91bGQgdGFrZSBwbGFjZSBpbi4gIFRoaXMKLSAgICogICAgICAgICAgICAgICAgaXMgdXN1YWxseSBhIHByb2dyZXNzIGNvbnRleHQgc28gdGhhdCB0aGUgdXNlciBjYW4gZ2V0IGZlZWRiYWNrCi0gICAqICAgICAgICAgICAgICAgIG9uIGhvdyBleGVjdXRpb24gaXMgcHJvZ3Jlc3NpbmcuICBUaGUgY29udGV4dCBtYXkgYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bkhlYWRMZXNzKCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIElSdW5uYWJsZUNvbnRleHQgY29udGV4dCApCi0gIHsKLQlQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0ICByZXNvdXJjZUNvbnRleHQgPSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JRWNsaXBzZVN0YXR1c0hhbmRsZXIgICAgICAgaGFuZGxlciAgICAgICAgID0gbmV3IEVjbGlwc2VTdGF0dXNIYW5kbGVyKCk7Ci0JRWNsaXBzZUVudmlyb25tZW50ICAgICAgICAgZW52aXJvbm1lbnQgICAgID0gbmV3IEVjbGlwc2VFbnZpcm9ubWVudCggbnVsbCwgcmVzb3VyY2VDb250ZXh0LCBoYW5kbGVyICk7Ci0JICAgIAotCURhdGFNYXBwaW5nUmVnaXN0cnlJbXBsICAgIGRhdGFSZWdpc3RyeV8gICA9IG5ldyBEYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbCgpOwkgICAgCi0JRGF0YUZsb3dNYW5hZ2VyICAgICAgICAgICAgZGF0YU1hbmFnZXIgICAgID0gbmV3IERhdGFGbG93TWFuYWdlciggZGF0YVJlZ2lzdHJ5XywgZW52aXJvbm1lbnQgKTsKLQlTaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlciBtYW5hZ2VyICAgICAgICAgPSBuZXcgU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIoZW52aXJvbm1lbnQsIGRhdGFNYW5hZ2VyICk7Ci0JCi0gICAgdHJ5Ci0gICAgewotICAgICAgY29tbWFuZFdpZGdldEJpbmRpbmdfID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKXdpemFyZEVsZW1lbnRfLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oICJjbGFzcyIgKTsKLSAgICB9Ci0gICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCSAgCi0JY29tbWFuZFdpZGdldEJpbmRpbmdfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnlfICk7Ci0JCi0JQ29tbWFuZEZyYWdtZW50IHJvb3RGcmFnbWVudCA9IGdldFJvb3RGcmFnbWVudCggc2VsZWN0aW9uLCBudWxsICk7Ci0JCi0JbWFuYWdlci5zZXRSb290RnJhZ21lbnQoIHJvb3RGcmFnbWVudCApOwotCW1hbmFnZXIucnVuRm9yd2FyZFRvTmV4dFN0b3AoIGNvbnRleHQgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSAKLSAgewotICAgICAgc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICAKLQlpZiggc2VsZWN0aW9uXyAhPSBudWxsKSAKLQl7CQotCSAgaWYoIHNlbGVjdGlvbl8gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiApIAotCSAgewotCSAgICByZXN1bHQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uXzsKLQkgIH0KLQl9Ci0JZWxzZSAKLQl7Ci0JICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JICAKLQkgIGlmKCB3aW5kb3cgIT0gbnVsbCApIAotCSAgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQotCQlpZiggc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gKSAKLQkJewotCQkgIHJlc3VsdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCX0KLQkgIH0KLQl9Ci0JCi0JcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3NWQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3c2V4cGxvcmVyLXNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndzZXhwbG9yZXItcHJvcGVydGllcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmZDk5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4KLWJ1aWxkCi13ZWJhcHBzCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi0qLmphcgotKi53YXIKLWV4cGxvcmVyc3JjLnppcAotamF2YUNvbXBpbGVyLiouYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyMTk5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwN2ZhYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6Mzg6MDEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwMGY3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIEp1biAwMyAwMDozMjowMiBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxZTkzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6NDA6MDQgRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTNhODUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDUucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBleHBsb3Jlci5qYXIsCi0gd3NleHBsb3Jlci1wcm9wZXJ0aWVzLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsdWdpbi5FeHBsb3JlclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLmZhdm9yaXRlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucG9wdXA7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuMy4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjEwMCwzLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiLAotIG9yZy5lY2xpcHNlLnhzZDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcud3NkbDRqO2J1bmRsZS12ZXJzaW9uPSJbMS40LjAsMS41LjApIiwKLSBvcmcuYXBhY2hlLndzaWw0ajtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLnVkZGk0ajtidW5kbGUtdmVyc2lvbj0iWzIuMC40LDIuMS4wKSIsCi0gb3JnLmFwYWNoZS5heGlzO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMS40LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDMuNS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywxLjEuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL2J1aWxkLXdhci1wZGUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYnVpbGQtd2FyLXBkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDg0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYnVpbGQtd2FyLXBkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciIgZGVmYXVsdD0iYnVpbGQud2FycyIgYmFzZWRpcj0iLiI+Ci0KLQk8IS0tCi0JVGhpcyBzY3JpcHQgY2xlYW5zIGFuZCBidWlsZHMgd3NleHBsb3Jlci53YXIgd2l0aGluIHRoZSBQREUuCi0JVXNlICJidWlsZC54bWwiIHRvIGJ1aWxkIGV4cGxvcmVyLmphciBhbmQgd3NleHBsb3Jlci5qYXIuCi0KLQlJbml0aWFsIGNvbmZpZ3VyYXRpb246Ci0KLQkxLiBDaG9vc2UgYnVpbGQtd2FyLXBkZS54bWwgLT4gUnVuIEFzIC0+IEFudCBCdWlsZC4uLgotCSAgIHRvIG9wZW4gdGhlICJNb2RpZnkgYXR0cmlidXRlcyBhbmQgbGF1bmNoIiBkaWFsb2cuCi0JMi4gQ2xpY2sgb24gdGhlICJSZWZyZXNoIiB0YWIuCi0JCWEuIEVuYWJsZSAiUmVmcmVzaCByZXNvdXJjZXMgdXBvbiBjb21wbGV0aW9uIi4KLQkJYi4gU2VsZWN0ICJUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBzZWxlY3RlZCByZXNvdXJjZSIuCi0JMy4gQ2xpY2sgb24gdGhlICJQcm9wZXJ0aWVzIiB0YWIuCi0JCWEuIERlc2VsZWN0ICJVc2UgZ2xvYmFsIHByb3BlcnRpZXMuLi4iLgotCQliLiBBZGQgdGhlIGZvbGxvd2luZyB0d28gcHJvcGVydGllczoKLQkJCWJhc2VMb2NhdGlvbiA9IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHlvdXIgdGFyZ2V0IHBsYXRmb3JtJ3MgImVjbGlwc2UiIGRpcmVjdG9yeS4KLQkJCWJ1aWxkRGlyZWN0b3J5ID0gdGhlIGFic29sdXRlIHBhdGggdG8geW91ciB3b3Jrc3BhY2UgZGlyZWN0b3J5LgotCTQuCUNsaWNrIG9uICJBcHBseSIuCi0JCi0JVG8gY2xlYW4gYSBwcmV2aW91cyBidWlsZCBvZiB0aGUgV0FSOgotCi0JMS4gQ2hvb3NlIGJ1aWxkLXdhci1wZGUueG1sIC0+IFJ1biBBcyAtPiBBbnQgQnVpbGQuLi4KLQkyLiBTZWxlY3QgYW5kIHJ1biB0aGUgImNsZWFuLndhcnMiIHRhcmdldC4KLQkzLiBPcHRpb25hbGx5LCByZXBsYWNlIHdzZXhwbG9yZXIvV0VCLUlORi93ZWIueG1sIGZyb20gSEVBRC4KLQotCVRvIGJ1aWxkIHRoZSBXQVI6Ci0KLQkxLiBJZiBuZWNlc3NhcnksIGdlbmVyYXRlIGFuZCBydW4gYnVpbGQueG1sCi0JICAgdG8gY3JlYXRlIGV4cGxvcmVyLmphciBhbmQgd3NleHBsb3Jlci5qYXI6Ci0JCWEuIENob29zZSBwbHVnaW4ueG1sIC0+IFBERSBUb29scyAtPiBDcmVhdGUgQW50IEJ1aWxkIEZpbGUKLQkJYi4gQ2hvb3NlIGJ1aWxkLnhtbCAtPiBSdW4gQXMgLT4gQW50IEJ1aWxkCi0JCWMuIFJlZnJlc2ggdGhlIHByb2plY3QuCi0JMS4gQ2hvb3NlIGJ1aWxkLXdhci1wZGUueG1sIC0+IFJ1biBBcyAtPiBBbnQgQnVpbGQuLi4KLQkyLiBTZWxlY3QgYW5kIHJ1biB0aGUgImJ1aWxkLndhcnMiIHRhcmdldC4KLQotCVNob3J0IGN1dDoKLQotCTEuIENob29zZSBidWlsZC13YXItcGRlLnhtbCAtPiBSdW4gQXMgLT4gQW50IEJ1aWxkLi4uCi0JMi4gQ2xpY2sgb24gdGhlICJUYXJnZXRzIiB0YWIuCi0JMy4gRW5hYmxlIHRoZSAiY2xlYW4ud2FycyIgYW5kICJidWlsZC53YXJzIiB0YXJnZXRzLgotCTQuIFZlcmlmeSB0aGF0IHRoZSBUYXJnZXQgZXhlY3V0aW9uIG9yZGVyIHJlYWRzCi0JCSJjbGVhbi53YXJzLCBidWlsZC53YXJzIgotCQlJZiBpdCBkb2Vzbid0LCB1c2UgdGhlICJPcmRlci4uLiIgYnV0dG9uIHRvIGNoYW5nZSBpdC4KLQk1LiBDbGljayAiQXBwbHkiIG9yICJSdW4iLgotCTYuIEhlbmNlZm9ydGggeW91IGNhbiBjaG9vc2UKLQkJYnVpbGQtd2FyLXBkZS54bWwgLT4gUnVuIEFzIC0+IEFudCBCdWlsZAotCQl0byBza2lwIHRoZSBkaWFsb2cgYW5kIGFsd2F5cyBjbGVhbiBhbmQgcmVidWlsZCB0aGUgV0FSLgotCS0tPgotCQotCTxwcm9wZXJ0eSBuYW1lPSJ3c2V4cGxvcmVyRGlyIiB2YWx1ZT0iJHtidWlsZERpcmVjdG9yeX0vb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIiLz4KLQotCTx0YXJnZXQgbmFtZT0ianNwY29tcGlsZSIgdW5sZXNzPSJ3c2V4cGxvcmVyLndhciIgZGVzY3JpcHRpb249IlByZS1jb21waWxlIHRoZSBKU1BzIGluIHRoZSBvcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIgcGx1Z2luIj4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmphc3Blci5Kc3BDIiBmb3JrPSJ0cnVlIj4KLQkJCTxhcmcgbGluZT0iLXdlYnhtbCAke3dzZXhwbG9yZXJEaXJ9L1dFQi1JTkYvd2ViLnhtbCAtZCAke3dzZXhwbG9yZXJEaXJ9IC13ZWJhcHAgJHt3c2V4cGxvcmVyRGlyfSIvPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7YmFzZUxvY2F0aW9ufS9wbHVnaW5zIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2UudG9tY2F0Ki8qLmphciIgLz4KLQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VMb2NhdGlvbn0vcGx1Z2lucyI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9Im9yZy5hcGFjaGUuYW50Ki9saWIvKi5qYXIiIC8+Ci0JCQkJPC9maWxlc2V0PgotCQkJPC9jbGFzc3BhdGg+Ci0JCTwvamF2YT4KLQkJPGphdmFjIGRlYnVnPSJ0cnVlIiBkZXN0ZGlyPSIke3dzZXhwbG9yZXJEaXJ9L1dFQi1JTkYvY2xhc3NlcyIgaW5jbHVkZUFudFJ1bnRpbWU9ImZhbHNlIj4KLQkJCTxzcmMgcGF0aD0iJHt3c2V4cGxvcmVyRGlyfSIvPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8ZGlyc2V0IGRpcj0iJHtidWlsZERpcmVjdG9yeX0iPgotCQkJCQk8aW5jbHVkZSBuYW1lPSIqL0Bkb3QiIC8+Ci0JCQkJPC9kaXJzZXQ+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPiAKLQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VMb2NhdGlvbn0vcGx1Z2lucyI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPiAKLQkJCQk8L2ZpbGVzZXQ+Ci0JCQk8L2NsYXNzcGF0aD4KLQkJPC9qYXZhYz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0id3NleHBsb3Jlci53YXIiIHVubGVzcz0id3NleHBsb3Jlci53YXIiIGRlc2NyaXB0aW9uPSJDcmVhdGUgd2FyOiB3c2V4cGxvcmVyLndhci4iPgotCQk8emlwCi0JCQliYXNlZGlyPSIke3dzZXhwbG9yZXJEaXJ9IgotCQkJZGVzdGZpbGU9IiR7d3NleHBsb3JlckRpcn0vLi4vd3NleHBsb3Jlci53YXIiCi0JCQl3aGVuZW1wdHk9InNraXAiIHVwZGF0ZT0iZmFsc2UiCi0JCQlleGNsdWRlcz0iKiovKi5qYXZhICoqLyouanNwICoqLyouaW5jIgotCQkvPgotCTwvdGFyZ2V0PgkKLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLndhcnMiIGRlc2NyaXB0aW9uPSJCdWlsZCBhbGwgdGhlIHdhcnMgZm9yIHRoZSBwbHVnLWluOiBvcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIuIj4KLQkJPGF2YWlsYWJsZSBwcm9wZXJ0eT0id3NleHBsb3Jlci53YXIiIGZpbGU9IiR7d3NleHBsb3JlckRpcn0vLi4vd3NleHBsb3Jlci53YXIiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJqc3Bjb21waWxlIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0id3NleHBsb3Jlci53YXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4ud2FycyIgZGVzY3JpcHRpb249IkNsZWFuIGFsbCB0aGUgd2FycyBmb3IgdGhlIHBsdWctaW46IG9yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci4iPgotCQk8ZGVsZXRlIGZpbGU9IndzZXhwbG9yZXIud2FyIi8+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IndzZXhwbG9yZXIiIGluY2x1ZGVzPSIqKi8qLmphdmEiLz4KLQkJPC9kZWxldGU+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IndzZXhwbG9yZXIiIGluY2x1ZGVzPSIqKi8qLmNsYXNzIi8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9idWlsZC13YXIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYnVpbGQtd2FyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlYzhiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9idWlsZC13YXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciIgZGVmYXVsdD0iYnVpbGQud2FycyIgYmFzZWRpcj0iLiI+Ci0gICAgCi0gICAgPCEtLSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBpbXBvcnRhbnQgdG8gc2V0IGhlcmUsIGFuZCAKLSAgICB0byBoYXZlIEpBVkFfNF9IT01FIHNldCB0byBzb21lIEphdmEgMS40IFNESyBob21lLCAKLSAgICBzaW5jZSB3ZSB3YW50IHRoaXMgY29tcGlsZWQgd2l0aCBhIDEuNCB2ZXJzaW9uLCBidXQgCi0gICAgdGhpcyBvdmVyYWxsIGJ1aWxkIGl0c2VsZiBtaWdodCBiZSBiZWluZyByYW4gaW4gSmF2YSAxLjUgLS0+Ci0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0gICAgCi0JPHByb3BlcnR5IG5hbWU9IndzZXhwbG9yZXJEaXIiIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImpzcGNvbXBpbGUiIHVubGVzcz0id3NleHBsb3Jlci53YXIiIGRlc2NyaXB0aW9uPSJQcmUtY29tcGlsZSB0aGUgSlNQcyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyIHBsdWdpbiI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5qYXNwZXIuSnNwQyIgZm9yaz0idHJ1ZSIganZtPSIke2Vudi5KQVZBXzRfSE9NRX0vYmluL2phdmEiPgotCQkJPGFyZyBsaW5lPSItd2VieG1sICR7d3NleHBsb3JlckRpcn0vV0VCLUlORi93ZWIueG1sIC1kICR7d3NleHBsb3JlckRpcn0gLXdlYmFwcCAke3dzZXhwbG9yZXJEaXJ9Ii8+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlTG9jYXRpb259L3BsdWdpbnMiPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS50b21jYXQqLyouamFyIiAvPgotCQkJCTwvZmlsZXNldD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7YmFzZUxvY2F0aW9ufS9wbHVnaW5zIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0ib3JnLmFwYWNoZS5hbnQqL2xpYi8qLmphciIgLz4KLQkJCQk8L2ZpbGVzZXQ+Ci0JCQk8L2NsYXNzcGF0aD4KLQkJPC9qYXZhPgotCQk8amF2YWMgZGVzdGRpcj0iJHt3c2V4cGxvcmVyRGlyfS9XRUItSU5GL2NsYXNzZXMiIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBleGVjdXRhYmxlPSIke2Vudi5KQVZBXzRfSE9NRX0vYmluL2phdmFjIiBmb3JrPSJ0cnVlIj4KLQkJCTxzcmMgcGF0aD0iJHt3c2V4cGxvcmVyRGlyfSIvPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMiPgotCQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCQkJPC9maWxlc2V0PgotCQkJCTxkaXJzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0iKiovQGRvdCIvPgotCQkJCTwvZGlyc2V0PgotCQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlTG9jYXRpb259L3BsdWdpbnMiPgotCQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VMb2NhdGlvbn0vcGx1Z2lucyI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQkJCTwvZmlsZXNldD4KLQkJCTwvY2xhc3NwYXRoPgotCQk8L2phdmFjPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ3c2V4cGxvcmVyLndhciIgdW5sZXNzPSJ3c2V4cGxvcmVyLndhciIgZGVzY3JpcHRpb249IkNyZWF0ZSB3YXI6IHdzZXhwbG9yZXIud2FyLiI+Ci0JCTx6aXAKLQkJCWJhc2VkaXI9IiR7d3NleHBsb3JlckRpcn0iCi0JCQlkZXN0ZmlsZT0iJHt3c2V4cGxvcmVyRGlyfS8uLi93c2V4cGxvcmVyLndhciIKLQkJCXdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIKLQkJCWV4Y2x1ZGVzPSIqKi8qLmphdmEgKiovKi5qc3AgKiovKi5pbmMiCi0JCS8+Ci0JPC90YXJnZXQ+CQotCQotCTx0YXJnZXQgbmFtZT0iYnVpbGQud2FycyIgZGVzY3JpcHRpb249IkJ1aWxkIGFsbCB0aGUgd2FycyBmb3IgdGhlIHBsdWctaW46IG9yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci4iPgotCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJ3c2V4cGxvcmVyLndhciIgZmlsZT0iJHt3c2V4cGxvcmVyRGlyfS8uLi93c2V4cGxvcmVyLndhciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImpzcGNvbXBpbGUiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ3c2V4cGxvcmVyLndhciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbi53YXJzIiBkZXNjcmlwdGlvbj0iQ2xlYW4gYWxsIHRoZSB3YXJzIGZvciB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyLiI+Ci0JCTxkZWxldGUgZmlsZT0id3NleHBsb3Jlci53YXIiLz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmE1ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXNvdXJjZS5leHBsb3Jlci5qYXIgPSBzcmMvCi1zb3VyY2Uud3NleHBsb3Jlci9XRUItSU5GL2xpYi93c2V4cGxvcmVyLmphciA9IHdzZXhwbG9yZXItc3JjLwotamFycy5jb21waWxlLm9yZGVyID0gZXhwbG9yZXIuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIHdzZXhwbG9yZXIvV0VCLUlORi9saWIvd3NleHBsb3Jlci5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgd3NleHBsb3Jlci1wcm9wZXJ0aWVzLmphcgotb3V0cHV0LndzZXhwbG9yZXIvV0VCLUlORi9saWIvd3NleHBsb3Jlci5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIGV4cGxvcmVyLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0aWVzLyxcCi0gICAgICAgICAgICAgICB3c2V4cGxvcmVyLndhcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB3c2V4cGxvcmVyLXByb3BlcnRpZXMuamFyCi0KLQotY3VzdG9tID0gZmFsc2UKLXNvdXJjZS53c2V4cGxvcmVyLXByb3BlcnRpZXMuamFyID0gd3NleHBsb3Jlci1wcm9wZXJ0aWVzLwotamFycy5leHRyYS5jbGFzc3BhdGggPSBzZXJ2bGV0YXBpL29yZy5lY2xpcHNlLmVxdWlub3guc2VydmxldC5hcGlfMS4wLjAudjIwMDYwMjA2LmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjMDFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLSMKLSMgTWVzc2FnZXMgZm9yIHRoZSBjbGllbnQgdHlwZSBleHRlbnNpb24KLSMKLVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfV1NFWFBMT1JFUj1TdHVibGVzcyAoV2ViIFNlcnZpY2VzIEV4cGxvcmVyKQotVEFTS19MQUJFTF9FWFBMT1JFX1dTRExfVVNJTkdfV1NFPUV4cGxvcmVyIFdTREwgdXNpbmcgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLgotCi0jCi0jIE1lc3NhZ2VzIGZvciB0aGUgV1NFeHBsb3JlciB0eXBlIGV4dGVuc2lvbgotIwotTVNHX0VSUk9SX0xBVU5DSF9XU0VYUExPUkVSPUlXQUIwMzY2RSBVbmFibGUgdG8gbGF1bmNoIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLU1TR19FUlJPUl9MT0FEX0xBVU5DSF9PUFRJT05TPUlXQUIwMzY3RSBVbmFibGUgdG8gbG9hZCBsYXVuY2ggb3B0aW9ucy4KLU1TR19CUk9LRU5fVk1fRE9FU19OT1RfU1VQUE9SVF9VVEYtOD1Ccm9rZW4gVk0gZG9lcyBub3Qgc3VwcG9ydCBVVEYtOC4KLQotIwotIyBNZXNzYWdlcyBmb3IgcG9wdXAgYWN0aW9uIChUZXN0IHdpdGggV2ViIFNlcnZpY2VzIEV4cGxvcmVyKQotIwotUE9QVVBfVEVTVF9XU0RMPVRlc3Qgd2l0aCBXZWIgU2VydmljZXMgRXhwbG9yZXIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZGMxZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogRWNsaXBzZSBQb3B1cCBBY3Rpb24gKG9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMpIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uLldTRExGaWxlTWVudSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX1RFU1RfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucG9wdXAuUG9wdXBUZXN0V1NETCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucG9wdXAuUG9wdXBUZXN0V1NETCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5XU0RMRmlsZU1lbnUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9URVNUX1dTREwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBvcHVwLlBvcHVwVGVzdFdTREwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wb3B1cC5Qb3B1cFRlc3RXU0RMIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5XU0RMRmlsZU1lbnUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9URVNUX1dTREwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBvcHVwLlBvcHVwVGVzdFdTREwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wb3B1cC5Qb3B1cFRlc3RXU0RMIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9wcm9wZXJ0aWVzL2Zhdm9yaXRlc19kZWZhdWx0LndzaWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9wcm9wZXJ0aWVzL2Zhdm9yaXRlc19kZWZhdWx0LndzaWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNWNhYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcHJvcGVydGllcy9mYXZvcml0ZXNfZGVmYXVsdC53c2lsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxpbnNwZWN0aW9uIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAxLzEwL2luc3BlY3Rpb24vIgotICB4bWxuczp3c2lsd3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMS8xMC9pbnNwZWN0aW9uL3dzZGwvIgotICB4bWxuczp3c2lsdWRkaT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMS8xMC9pbnNwZWN0aW9uL3VkZGkvIgotICB4bWxuczp1ZGRpPSJ1cm46dWRkaS1vcmc6YXBpIj4KLSAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+djVfMF8xXzA8L2Fic3RyYWN0PgotCi0gIDxsaW5rIHJlZmVyZW5jZWROYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGkiPgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1Q8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHA6Ly91ZGRpdGVzdC5zYXAuY29tL1VEREkvYXBpL2lucXVpcnkvPC9hYnN0cmFjdD4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj5odHRwczovL3VkZGl0ZXN0LnNhcC5jb20vVURESS9hcGkvcHVibGlzaC88L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHA6Ly91ZGRpdGVzdC5zYXAuY29tLzwvYWJzdHJhY3Q+Ci0gIDwvbGluaz4KLQotICA8bGluayByZWZlcmVuY2VkTmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpIj4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj4lUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUDwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3VkZGkuc2FwLmNvbS9VRERJL2FwaS9pbnF1aXJ5LzwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cHM6Ly91ZGRpLnNhcC5jb20vVURESS9hcGkvcHVibGlzaC88L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHA6Ly91ZGRpLnNhcC5jb20vPC9hYnN0cmFjdD4KLSAgPC9saW5rPgotCi0gIDxsaW5rIHJlZmVyZW5jZWROYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGkiPgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfWE1FVEhPRFM8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlPC9hYnN0cmFjdD4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj5odHRwczovL3VkZGkueG1ldGhvZHMubmV0L3B1Ymxpc2g8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3ZlMi9SZWdpc3Rlci5wbz9ldmVudD1yZWdpc3Rlck9yZzwvYWJzdHJhY3Q+Ci0gIDwvbGluaz4KLQotICA8bGluayByZWZlcmVuY2VkTmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpIj4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj4lUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX05UVENPTU08L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHA6Ly93d3cudWRkaS5uZS5qcC9yZWdpc3RyeS9pbnF1aXJ5YXBpPC9hYnN0cmFjdD4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj5odHRwczovL3d3dy51ZGRpLm5lLmpwL3JlZ2lzdHJ5L3B1Ymxpc2hhcGk8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHA6Ly93d3cudWRkaS5uZS5qcC9yZWdpc3RyeS9yZWdpc3RyeS5odG1sPC9hYnN0cmFjdD4KLSAgPC9saW5rPgotCi0gIDxsaW5rIHJlZmVyZW5jZWROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDEvMTAvaW5zcGVjdGlvbi8iIGxvY2F0aW9uPSJodHRwOi8vd3d3LnhtZXRob2RzLmNvbS9pbnNwZWN0aW9uLndzaWwiLz4KLTwvaW5zcGVjdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NlcnZsZXRhcGkvb3JnLmVjbGlwc2UuZXF1aW5veC5zZXJ2bGV0LmFwaV8xLjAuMC52MjAwNjAyMDYuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc2VydmxldGFwaS9vcmcuZWNsaXBzZS5lcXVpbm94LnNlcnZsZXQuYXBpXzEuMC4wLnYyMDA2MDIwNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWQ1NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc2VydmxldGFwaS9vcmcuZWNsaXBzZS5lcXVpbm94LnNlcnZsZXQuYXBpXzEuMC4wLnYyMDA2MDIwNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0NhdGFsaW5hUnVubmFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvQ2F0YWxpbmFSdW5uYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWJhMWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvQ2F0YWxpbmFSdW5uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3JlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmhlbHAuaW50ZXJuYWwuYXBwc2VydmVyLkFwcHNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmFwcHNlcnZlci5XZWJhcHBNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ2F0YWxpbmFSdW5uYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDYXRhbGluYVJ1bm5hYmxlIGNhdGFsaW5hUnVubmFibGVfOwotCi0JcHJpdmF0ZSBDYXRhbGluYVJ1bm5hYmxlKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2F0YWxpbmFSdW5uYWJsZSBnZXRDYXRhbGluYVJ1bm5hYmxlKCkgewotCQlpZiAoY2F0YWxpbmFSdW5uYWJsZV8gPT0gbnVsbCkgewotCQkJY2F0YWxpbmFSdW5uYWJsZV8gPSBuZXcgQ2F0YWxpbmFSdW5uYWJsZSgpOwotCQkJY2F0YWxpbmFSdW5uYWJsZV8uaW5pdCgpOwotCQl9Ci0JCXJldHVybiBjYXRhbGluYVJ1bm5hYmxlXzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RvbWNhdFN0YXJ0ZWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQXBwc2VydmVyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRBcHBTZXJ2ZXIoKS5pc1J1bm5pbmcoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VG9tY2F0UG9ydCgpIHsKLQkJcmV0dXJuIFdlYmFwcE1hbmFnZXIuZ2V0UG9ydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlXU0V4cGxvcmVyIHdzRXhwbG9yZXIgPSBXU0V4cGxvcmVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZyBjdHh0ID0gd3NFeHBsb3Jlci5nZXRDb250ZXh0TmFtZSgpOwotCQlTdHJpbmcgcGx1Z2luSUQgPSB3c0V4cGxvcmVyLmdldFBhcmVudFBsdWdpbklEKCk7Ci0JCVN0cmluZyB3YXJMb2NhdGlvbiA9IHdzRXhwbG9yZXIuZ2V0V0FSTG9jYXRpb24oKTsKLQkJU3RyaW5nIHdlYmFwcExvY2F0aW9uID0gd3NFeHBsb3Jlci5nZXRXZWJBcHBMb2NhdGlvbigpOwotCQl0cnkgewotCQkJaWYgKHdhckxvY2F0aW9uICE9IG51bGwpCi0JCQkJV2ViYXBwTWFuYWdlci5zdGFydChjdHh0LCBwbHVnaW5JRCwgbmV3IFBhdGgod2FyTG9jYXRpb24pKTsKLQkJCWVsc2UKLQkJCQlXZWJhcHBNYW5hZ2VyLnN0YXJ0KGN0eHQsIHBsdWdpbklELCBuZXcgUGF0aCh3ZWJhcHBMb2NhdGlvbikpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoT3B0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0xhdW5jaE9wdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjY2ZWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoT3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyOwotCi0vKioKLSAqIEBhdXRob3IgY2JyZWFsZXlAY2EuaWJtLmNvbQotICogCi0gKiBUaGlzIHNpbXBsZSBjbGFzcyBpcyB1c2VkIHRvIGhvbGQgYSBzaW5nbGUgV2ViIFNlcnZpY2VzCi0gKiBFeHBsb3JlciBsYXVuY2ggb3B0aW9uIHByb3BlcnR5IGFuZCBpdHMgdmFsdWUuIEFsbG93ZWQKLSAqIGxhdW5jaCBvcHRpb24gcHJvcGVydGllcyBhcmUgZGVmaW5lZCBieQotICogPGNvZGU+e0BsaW5rIExhdW5jaE9wdGlvbnN9PC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIExhdW5jaE9wdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcga2V5XzsKLQotCXByaXZhdGUgU3RyaW5nIG9wdGlvbl87Ci0KLQkvKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgbGF1bmNoIG9wdGlvbiB3aXRoIHRoZSBnaXZlbgotCSAqIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLiAKLQkgKi8KLQlwdWJsaWMgTGF1bmNoT3B0aW9uKFN0cmluZyBrZXksIFN0cmluZyBvcHRpb24pIHsKLQkJa2V5XyA9IGtleTsKLQkJb3B0aW9uXyA9IG9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoaXMgbGF1bmNoIG9wdGlvbi4KLQkgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4ga2V5XzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGlzIGxhdW5jaCBvcHRpb24uCi0JICogQHJldHVybiBUaGUgcHJvcGVydHkgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcHRpb24oKSB7Ci0JCXJldHVybiBvcHRpb25fOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoT3B0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9MYXVuY2hPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MmYwM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9MYXVuY2hPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyOwotCi0vKioKLSAqIEBhdXRob3IgY2JyZWFsZXlAY2EuaWJtLmNvbQotICogCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIHByb3BlcnR5IG5hbWVzIHVuZGVyc3Rvb2QgYnkgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotICogYW5kIHVzZWQgdG8gY29uZmlndXJlIGl0J3MgaW5pdGlhbCBhcHBlYXJhbmNlIGFuZCBiZWhhdmlvdXIgYXQgdGhlIHRpbWUgaXQgaXMKLSAqIGxhdW5jaGVkLgotICogQHNlZSBMYXVuY2hPcHRpb24KLSAqLwotcHVibGljIGNsYXNzIExhdW5jaE9wdGlvbnMgewotCS8vIEdlbmVyYWwgcHVycG9zZSBwcmVsb2FkIGNvbnN0YW50cwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0xPQ0FUSU9OID0gInN0YXRlTG9jYXRpb24iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFWT1JJVEVTX0xPQ0FUSU9OID0gImRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbiI7Ci0JCi0JLy8gV1NETCBQYWdlIHByZWxvYWQgY29uc3RhbnRzCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1VSTCA9ICJ3c2RsIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9TRVJWSUNFX0VORFBPSU5UID0gIndlYlNlcnZpY2VFbmRwb2ludCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1FOQU1FX1NUUklORyA9ICJzZXJ2aWNlUU5hbWVTdHJpbmciOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19OQU1FX1NUUklORyA9ICJiaW5kaW5nTmFtZVN0cmluZyI7Ci0KLQkvLyBVRERJIFBhZ2UgcHJlbG9hZCBjb25zdGFudHMKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUVVJUllfVVJMID0gImlucXVpcnkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9VUkwgPSAicHVibGlzaCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSAic2VydmljZU5hbWUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9LRVkgPSAic2VydmljZUtleSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTX0RJUkVDVE9SWSA9ICJjYXRlZ29yaWVzRGlyZWN0b3J5IjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoV2l6YXJkUnVubmFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoV2l6YXJkUnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3NWQ1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0xhdW5jaFdpemFyZFJ1bm5hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3JlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hXaXphcmRSdW5uYWJsZSBleHRlbmRzIFRocmVhZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByaXZhdGUgU3RyaW5nIHdzZGxVUkw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmluaXNoOwotCi0JcHVibGljIExhdW5jaFdpemFyZFJ1bm5hYmxlKFN0cmluZyBpZCwgU3RyaW5nIHdzZGxVUkwpIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLndzZGxVUkwgPSAod3NkbFVSTCAhPSBudWxsKSA/IHdzZGxVUkwgOiAiIjsKLQkJZmluaXNoID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJRHluYW1pY1dpemFyZCB3aXphcmQgPSBuZXcgRHluYW1pY1dpemFyZCgpOwotCQkJd2l6YXJkLnNldEluaXRpYWxEYXRhKGlkKTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzZGxVUkwpOwotCQkJd2l6YXJkLmluaXQobnVsbCwgc2VsKTsKLQkJCVdpemFyZERpYWxvZyB3ZCA9IG5ldyBXaXphcmREaWFsb2cobmV3IFNoZWxsKERpc3BsYXkuZ2V0RGVmYXVsdCgpLAotCQkJCQlTV1QuQVBQTElDQVRJT05fTU9EQUwpLCB3aXphcmQpOwotCQkJd2Qub3BlbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJZmluaXNoID0gdHJ1ZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoV2l6YXJkVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9MYXVuY2hXaXphcmRUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzI5ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9MYXVuY2hXaXphcmRUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3JlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIExhdW5jaFdpemFyZFRhc2sgewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIExhdW5jaFdpemFyZFRhc2sgdGFza187Ci0KLQkvLyB0aGUgc2hlbGwgZm9yIHRoZSB3aXphcmQgdG8gYmUgbGF1bmNoZWQKLQlwcml2YXRlIFNoZWxsIHNoZWxsXzsKLQotCS8vIHRoZSBMYXVuY2hXaXphcmRSdW5uYWJsZSB0aGF0IGlzIGN1cnJlbnRseSBydW5uaW5nCi0JcHJpdmF0ZSBMYXVuY2hXaXphcmRSdW5uYWJsZSBydW5uYWJsZV87Ci0KLQlwcml2YXRlIExhdW5jaFdpemFyZFRhc2soU2hlbGwgc2hlbGwpIHsKLQkJc2hlbGxfID0gc2hlbGw7Ci0JCXJ1bm5hYmxlXyA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMYXVuY2hXaXphcmRUYXNrIGdldEluc3RhbmNlKCkgewotCQlpZiAodGFza18gPT0gbnVsbCkKLQkJCXRhc2tfID0gbmV3IExhdW5jaFdpemFyZFRhc2soUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCXJldHVybiB0YXNrXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHRocm93cyBTV1RFeGNlcHRpb24gewotCQlzaGVsbF8uZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbmRBc3luY0V4ZWMoTGF1bmNoV2l6YXJkUnVubmFibGUgcnVubmFibGUpIHsKLQkJdHJ5IHsKLQkJCWlmICghZ2V0SXNFeGVjdXRpbmcoKSkgewotCQkJCWFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJcnVubmFibGVfID0gcnVubmFibGU7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJc0V4ZWN1dGluZygpIHsKLQkJaWYgKHJ1bm5hYmxlXyAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGlzRmluaXNoID0gcnVubmFibGVfLmlzRmluaXNoKCk7Ci0JCQlpZiAoaXNGaW5pc2gpCi0JCQkJcnVubmFibGVfID0gbnVsbDsKLQkJCXJldHVybiAhaXNGaW5pc2g7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL1dTRXhwbG9yZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvV1NFeHBsb3Jlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjYzMjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvV1NFeHBsb3Jlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDcyMSAgIDE1MTQwOSBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgV1NFIGRvZXMgbm90IG9wZW4gaW4gZXh0ZXJuYWwgYnJvd3NlciBvbiBSSAotICogMjAwNjA4MDIgICAxNTA0Mjggc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA2MTIxOSAgIDE2ODYyMCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgV1NFIGRvZXMgbm90IG9wZW4gaW4gZXh0ZXJuYWwgYnJvd3NlciBvbiBMaW51eAotICogMjAwNzAyMjAgICAxNjg2MjAgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFdTRSBkb2VzIG5vdCBvcGVuIGluIGV4dGVybmFsIGJyb3dzZXIgb24gTGludXggKGNvbnQuKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3JlcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsdWdpbi5FeHBsb3JlclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFdTRXhwbG9yZXIgewotCXByaXZhdGUgc3RhdGljIFdTRXhwbG9yZXIgaW5zdGFuY2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbGF1bmNoT3B0aW9uc0tleV8gPSAwOwotCi0JcHJpdmF0ZSBJV2ViQnJvd3NlciBpbnRlcm5hbEJyb3dzZXJfID0gbnVsbDsKLQkKLQlwdWJsaWMgV1NFeHBsb3JlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdTRXhwbG9yZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBXU0V4cGxvcmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dE5hbWUoKSB7Ci0JCXJldHVybiAid3NleHBsb3JlciI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIEV4cGxvcmVyUGx1Z2luLklEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V0FSTG9jYXRpb24oKSB7Ci0JCXJldHVybiAid3NleHBsb3Jlci53YXIiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViQXBwTG9jYXRpb24oKSB7Ci0JCXJldHVybiAid3NleHBsb3JlciI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXZWxjb21lVVJMKCkgewotCQlyZXR1cm4gIndzZXhwbG9yZXIuanNwIjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaE9wdGlvblJlZ2lzdHJ5VVJMKCkgewotCQlyZXR1cm4gImxhdW5jaF9vcHRpb25zX3JlZ2lzdHJ5LmpzcCI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJMKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiaHR0cDovL2xvY2FsaG9zdDoiKTsKLQkJc2IuYXBwZW5kKENhdGFsaW5hUnVubmFibGUuZ2V0Q2F0YWxpbmFSdW5uYWJsZSgpLmdldFRvbWNhdFBvcnQoKSk7Ci0JCXNiLmFwcGVuZCgiLyIpOwotCQlzYi5hcHBlbmQoZ2V0Q29udGV4dE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgiLyIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFkYXRhRGlyZWN0b3J5KCkgewotCQkvLyA8d29ya3NwYWNlPi8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyLyAobm90ZQotCQkvLyB0aGUgdHJhaWxpbmcgc2VwYXJhdG9yKS4KLQkJcmV0dXJuIEV4cGxvcmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJV29ya2JlbmNoIHdiLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwsCi0JCUxhdW5jaE9wdGlvbltdIG9wdGlvbnMsIGJvb2xlYW4gZm9yY2VMYXVuY2hPdXRzaWRlSURFKSB7Ci0JCS8vIGxhdW5jaE9wdGlvbktleQotCQlpbnQgbGF1bmNoT3B0aW9uS2V5ID0gZ2V0TGF1bmNoT3B0aW9uc0tleSgpOwotCQkvLyBXZWIgU2VydmljZXMgRXhwbG9yZXIgVVJMCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKGdldEJhc2VVUkwoKSk7Ci0JCXNiLmFwcGVuZChnZXRXZWxjb21lVVJMKCkpOwotCQlzYi5hcHBlbmQoIj8iKTsKLQkJaWYgKG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZyBlbmNvZGVkSUQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQllbmNvZGVkSUQgPSBVUkxFbmNvZGVyLmVuY29kZShFeHBsb3JlclBsdWdpbi5JRCwKLQkJCQkJCUV4cGxvcmVyUGx1Z2luLkNIQVJTRVQpOwotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJRXhwbG9yZXJQbHVnaW4uSUQsCi0JCQkJCQkwLAotCQkJCQkJRXhwbG9yZXJQbHVnaW4KLQkJCQkJCQkJLmdldE1lc3NhZ2UoIiVNU0dfQlJPS0VOX1ZNX0RPRVNfTk9UX1NVUFBPUlRfVVRGLTgiKSwKLQkJCQkJCWUpOwotCQkJfQotCQkJc2IuYXBwZW5kKGVuY29kZWRJRCk7Ci0JCQlzYi5hcHBlbmQoIj0iKTsKLQkJCXNiLmFwcGVuZChsYXVuY2hPcHRpb25LZXkpOwotCQl9Ci0JCS8vIGxhdW5jaCBXZWIgU2VydmljZXMgRXhwbG9yZXIKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCBicm93c2VyU3VwcG9ydCA9IEV4cGxvcmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKLQkJCUlXZWJCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCQkJCi0JCQlpZiAoZm9yY2VMYXVuY2hPdXRzaWRlSURFKSB7Ci0JCQkJCi0JCQkJLy8gZXh0ZXJuYWwgYnJvd3NlciBzdXBwb3J0IHVzZXMgc3d0IFByb2dyYW0uZmluZFByb2dyYW0oKSB0byBsb2NhdGUgYW4gYXBwcm9wcmlhdGUgYnJvd3NlciBmb3IgSFRNTCBmaWxlcwotCQkJCS8vIGNlcnRhaW4gdmVyc2lvbnMgb2Ygc3d0IFByb2dyYW0gY2xhc3MgbmVlZCB0byBiZSBydW4gZnJvbSB0aGUgVUkgdGhyZWFkLCBvdGhlcndpc2UgZmluZFByb2dyYW0oKSBkb2VzIG5vdAotCQkJCS8vIHdvcmsgcHJvcGVybHkgKHRoaXMgYXBwbGllcyB0byBMaW51eCBvbmx5KS4gIFRoZSBjb2RlIGJlbG93IGlzIHRvIHdvcmthcm91bmQgdGhpcyBwcm9ibGVtLgotCQkJCQotCQkJCS8vIERpc3BsYXkuZ2V0Q3VycmVudCgpIHdpbGwgYmUgbnVsbCBpZiB0aGlzIGlzIG5vdCB0aGUgVUkgdGhyZWFkCi0JCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIGNyZWF0ZSBhIHJ1bm5hYmxlIHRvIG9wZW4gdGhlIGJyb3dzZXIsIHJ1biBpdCBpbiB0aGUgVUkgdGhyZWFkCi0JCQkJCU9wZW5Ccm93c2VyUnVubmFibGUgcnVubmFibGUgPSBuZXcgT3BlbkJyb3dzZXJSdW5uYWJsZShicm93c2VyU3VwcG9ydCwgbmV3IFVSTChzYi50b1N0cmluZygpKSk7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQkJCi0JCQkJCWlmIChydW5uYWJsZS5nZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCQkJdGhyb3cgcnVubmFibGUuZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicm93c2VyID0gYnJvd3NlclN1cHBvcnQuZ2V0RXh0ZXJuYWxCcm93c2VyKCk7Ci0JCQkJCWJyb3dzZXIub3BlblVSTChuZXcgVVJMKHNiLnRvU3RyaW5nKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBicm93c2VySWQKLQkJCQlTdHJpbmdCdWZmZXIgYnJvd3NlcklkID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWJyb3dzZXJJZC5hcHBlbmQoRXhwbG9yZXJQbHVnaW4uSUQpOwotCQkJCWJyb3dzZXJJZC5hcHBlbmQoZ2V0Q29udGV4dE5hbWUoKSk7Ci0JCQkJCi0JCQkJaWYgKGludGVybmFsQnJvd3Nlcl89PW51bGwpCi0JCQkJCWludGVybmFsQnJvd3Nlcl8gPSBicm93c2VyU3VwcG9ydC5jcmVhdGVCcm93c2VyKGJyb3dzZXJJZC50b1N0cmluZygpKTsKLQkJCQlicm93c2VyID0gaW50ZXJuYWxCcm93c2VyXzsKLQkJCQlicm93c2VyLm9wZW5VUkwobmV3IFVSTChzYi50b1N0cmluZygpKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFeHBsb3JlclBsdWdpbi5JRCwgMCwKLQkJCQkJRXhwbG9yZXJQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9MQVVOQ0hfV1NFWFBMT1JFUiIpLAotCQkJCQllKTsKLQkJfQotCQkvLyByZWdpc3RlciBsYXVuY2ggb3B0aW9ucwotCQlpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMubGVuZ3RoID4gMCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmdCdWZmZXIgbGF1bmNoT3B0aW9uc1JlZ1VSTCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlsYXVuY2hPcHRpb25zUmVnVVJMLmFwcGVuZChnZXRCYXNlVVJMKCkpOwotCQkJCWxhdW5jaE9wdGlvbnNSZWdVUkwuYXBwZW5kKGdldExhdW5jaE9wdGlvblJlZ2lzdHJ5VVJMKCkpOwotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKGxhdW5jaE9wdGlvbnNSZWdVUkwudG9TdHJpbmcoKSk7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJY29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKLQkJCQlQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0JCQkJU3RyaW5nQnVmZmVyIHBhcmFtcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlTdHJpbmcgZW5jb2RlZElEID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQllbmNvZGVkSUQgPSBVUkxFbmNvZGVyLmVuY29kZShFeHBsb3JlclBsdWdpbi5JRCwKLQkJCQkJCQlFeHBsb3JlclBsdWdpbi5DSEFSU0VUKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlFeHBsb3JlclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCUV4cGxvcmVyUGx1Z2luCi0JCQkJCQkJCQkuZ2V0TWVzc2FnZSgiJU1TR19CUk9LRU5fVk1fRE9FU19OT1RfU1VQUE9SVF9VVEYtOCIpLAotCQkJCQkJCWUpOwotCQkJCX0KLQkJCQlwYXJhbXMuYXBwZW5kKGVuY29kZWRJRCk7Ci0JCQkJcGFyYW1zLmFwcGVuZCgiPSIpOwotCQkJCXBhcmFtcy5hcHBlbmQobGF1bmNoT3B0aW9uS2V5KTsKLQkJCQlwYXJhbXMuYXBwZW5kKCImIik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChvcHRpb25zW2ldICE9IG51bGwpIHsKLQkJCQkJCXBhcmFtcy5hcHBlbmQob3B0aW9uc1tpXS5nZXRLZXkoKSk7Ci0JCQkJCQlwYXJhbXMuYXBwZW5kKCI9Iik7Ci0JCQkJCQlTdHJpbmcgb3B0aW9uID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJb3B0aW9uID0gVVJMRW5jb2Rlci5lbmNvZGUob3B0aW9uc1tpXS5nZXRPcHRpb24oKSwKLQkJCQkJCQkJCUV4cGxvcmVyUGx1Z2luLkNIQVJTRVQpOwotCQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJRXhwbG9yZXJQbHVnaW4uSUQsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJRXhwbG9yZXJQbHVnaW4KLQkJCQkJCQkJCQkJLmdldE1lc3NhZ2UoIiVNU0dfQlJPS0VOX1ZNX0RPRVNfTk9UX1NVUFBPUlRfVVRGLTgiKSwKLQkJCQkJCQkJCWUpOwotCQkJCQkJfQotCQkJCQkJcGFyYW1zLmFwcGVuZChvcHRpb24pOwotCQkJCQkJcGFyYW1zLmFwcGVuZCgiJiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW91dC5wcmludChwYXJhbXMudG9TdHJpbmcoKSk7Ci0JCQkJb3V0LmNsb3NlKCk7Ci0JCQkJb3V0ID0gbnVsbDsKLQkJCQlJbnB1dFN0cmVhbSBpcyA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQlpcy5jbG9zZSgpOwotCQkJCWlzID0gbnVsbDsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBFeHBsb3JlclBsdWdpbi5JRCwgMCwKLQkJCQkJCUV4cGxvcmVyUGx1Z2luCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0xPQURfTEFVTkNIX09QVElPTlMiKSwKLQkJCQkJCWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEV4cGxvcmVyUGx1Z2luLklELCAwLCAiIiwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldExhdW5jaE9wdGlvbnNLZXkoKSB7Ci0JCXJldHVybiBsYXVuY2hPcHRpb25zS2V5XysrOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJV29ya2JlbmNoIHdiLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmdbXSBpbnF1aXJ5VVJMLCBTdHJpbmdbXSBwdWJsaXNoVVJMLAotCQkJYm9vbGVhbiBmb3JjZUxhdW5jaE91dHNpZGVJREUpIHsKLQkJaW50IGlucXVpcnlVUkxPcHRpb25MZW5ndGggPSAoaW5xdWlyeVVSTCAhPSBudWxsKSA/IGlucXVpcnlVUkwubGVuZ3RoCi0JCQkJOiAwOwotCQlpbnQgcHVibGlzaFVSTE9wdGlvbkxlbmd0aCA9IChwdWJsaXNoVVJMICE9IG51bGwpID8gcHVibGlzaFVSTC5sZW5ndGgKLQkJCQk6IDA7Ci0JCUxhdW5jaE9wdGlvbltdIG9wdGlvbnMgPSBuZXcgTGF1bmNoT3B0aW9uW2lucXVpcnlVUkxPcHRpb25MZW5ndGgKLQkJCQkrIHB1Ymxpc2hVUkxPcHRpb25MZW5ndGhdOwotCQlpbnQgaW5kZXggPSAwOwotCQlpZiAoaW5xdWlyeVVSTCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlucXVpcnlVUkwubGVuZ3RoOyBpKyspIHsKLQkJCQlvcHRpb25zW2luZGV4XSA9IG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5JTlFVSVJZX1VSTCwKLQkJCQkJCWlucXVpcnlVUkxbaV0pOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJaWYgKHB1Ymxpc2hVUkwgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJsaXNoVVJMLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb3B0aW9uc1tpbmRleF0gPSBuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuUFVCTElTSF9VUkwsCi0JCQkJCQlwdWJsaXNoVVJMW2ldKTsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsYXVuY2god2IsIHNlbCwgb3B0aW9ucywgZm9yY2VMYXVuY2hPdXRzaWRlSURFKTsKLQl9Ci19Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBvcGVuaW5nIGEgYnJvd3NlciBhbmQgc3RvcmluZyB0aGUKLSAqIEV4Y2VwdGlvbiB0aHJvd24gaWYgaXQgd2FzIHVuc3VjY2Vzc2Z1bC4gCi0gKi8KLWNsYXNzIE9wZW5Ccm93c2VyUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCi0JcHJpdmF0ZSBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQ7Ci0JcHJpdmF0ZSBVUkwgdXJsOwotCXByaXZhdGUgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0JCi0JcHVibGljIE9wZW5Ccm93c2VyUnVubmFibGUoSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0LCBVUkwgdXJsKSB7Ci0JCXRoaXMuYnJvd3NlclN1cHBvcnQgPSBicm93c2VyU3VwcG9ydDsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCWJyb3dzZXJTdXBwb3J0LmdldEV4dGVybmFsQnJvd3NlcigpLm9wZW5VUkwodXJsKTsJCQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBleGNlcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9XU0V4cGxvcmVyQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9XU0V4cGxvcmVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDhlZTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvV1NFeHBsb3JlckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NFeHBsb3JlckNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL1dTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNzY1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL1dTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgY2JyZWFsZXlAY2EuaWJtLmNvbQotICogCi0gKiBUaGlzIDxjb2RlPkNvbW1hbmQ8L2NvZGU+LCB3aGVuIGV4ZWN1dGVkLCBsYXVuY2hlcyB0aGUKLSAqIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLSAqLwotcHVibGljIGNsYXNzIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBib29sZWFuIGZvcmNlTGF1bmNoT3V0c2lkZUlERTsKLQotCXByaXZhdGUgTGF1bmNoT3B0aW9uW10gbGF1bmNoT3B0aW9uczsKLQotCXB1YmxpYyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQ2F0ZWdvcnlJbmZvKFN0cmluZyBpbnF1aXJ5VVJMLCBTdHJpbmcgY2F0ZWdvcmllc0RpcmVjdG9yeSkgewotCQl0cnkgewotCQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXAuc2V0UHJvcGVydHkoTGF1bmNoT3B0aW9ucy5DQVRFR09SSUVTX0RJUkVDVE9SWSwKLQkJCQkJY2F0ZWdvcmllc0RpcmVjdG9yeSk7Ci0JCQlTdHJpbmdCdWZmZXIgcHJvcGVydGllc0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJcHJvcGVydGllc0ZpbGVOYW1lLmFwcGVuZChXU0V4cGxvcmVyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldE1ldGFkYXRhRGlyZWN0b3J5KCkpOwotCQkJRmlsZSBtZXRhZGF0YURpcmVjdG9yeUZpbGUgPSBuZXcgRmlsZShwcm9wZXJ0aWVzRmlsZU5hbWUudG9TdHJpbmcoKSk7Ci0JCQlpZiAoIW1ldGFkYXRhRGlyZWN0b3J5RmlsZS5leGlzdHMoKSkgewotCQkJCW1ldGFkYXRhRGlyZWN0b3J5RmlsZS5ta2RpcnMoKTsKLQkJCX0KLQkJCXByb3BlcnRpZXNGaWxlTmFtZS5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoaW5xdWlyeVVSTCwiVVRGLTgiKSkuYXBwZW5kKAotCQkJCQkiLnByb3BlcnRpZXMiKTsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHByb3BlcnRpZXNGaWxlTmFtZQotCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQlwLnN0b3JlKGZvdXQsIG51bGwpOwotCQkJZm91dC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCkgewotCQlyZXR1cm4gV1NFeHBsb3Jlci5nZXRJbnN0YW5jZSgpLmxhdW5jaChudWxsLCBudWxsLCBsYXVuY2hPcHRpb25zLAotCQkJCWZvcmNlTGF1bmNoT3V0c2lkZUlERSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApIAotICB7Ci0gICAgcmV0dXJuIGV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZm9yY2VMYXVuY2hPdXRzaWRlSURFCi0JICogICAgICAgICAgICBUaGUgZm9yY2VMYXVuY2hPdXRzaWRlSURFIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZUxhdW5jaE91dHNpZGVJREUoYm9vbGVhbiBmb3JjZUxhdW5jaE91dHNpZGVJREUpIHsKLQkJdGhpcy5mb3JjZUxhdW5jaE91dHNpZGVJREUgPSBmb3JjZUxhdW5jaE91dHNpZGVJREU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhdW5jaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIFRoZSBsYXVuY2hPcHRpb25zIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hPcHRpb25zKExhdW5jaE9wdGlvbltdIGxhdW5jaE9wdGlvbnMpIHsKLQkJdGhpcy5sYXVuY2hPcHRpb25zID0gbGF1bmNoT3B0aW9uczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDg4MDlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1JlZ2lzdHJ5VHlwZURlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbHVnaW4uRXhwbG9yZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXMuRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3Q7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNSZWdpc3RyeVR5cGVEZWZhdWx0IGV4dGVuZHMgRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QgewotCXByaXZhdGUgc3RhdGljIFdTSUxEb2N1bWVudCB3c2lsRG9jXzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVk9SSVRFU19ERUZBVUxUID0gInByb3BlcnRpZXMvZmF2b3JpdGVzX2RlZmF1bHQud3NpbCI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc18gPSBudWxsOwotCi0JcHVibGljIEZhdm9yaXRlc1JlZ2lzdHJ5VHlwZURlZmF1bHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXdzaWxEb2NfID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdChTdHJpbmcgZGVmYXVsdEZhdm9yaXRlcykgewotCQlzdXBlcigpOwotCQl3c2lsRG9jXyA9IG51bGw7Ci0JCWRlZmF1bHRGYXZvcml0ZXNfID0gZGVmYXVsdEZhdm9yaXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlYWRMb2NhdGlvbigpIHsKLQkJU3RyaW5nQnVmZmVyIHJlYWRMb2NhdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGRlZmF1bHRGYXZvcml0ZXNfID09IG51bGwpCi0JCXsKLQkJCXJlYWRMb2NhdGlvbi5hcHBlbmQoRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSk7Ci0JCQlyZWFkTG9jYXRpb24uYXBwZW5kKEZBVk9SSVRFU19ERUZBVUxUKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJlYWRMb2NhdGlvbi5hcHBlbmQoZGVmYXVsdEZhdm9yaXRlc18pOwotCQl9Ci0JCXJldHVybiByZWFkTG9jYXRpb24udG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdyaXRlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBXU0lMRG9jdW1lbnQgZ2V0V1NJTERvY3VtZW50KCkgewotCQlpZiAod3NpbERvY18gPT0gbnVsbCkgewotCQkJd3NpbERvY18gPSBsb2FkV1NJTERvY3VtZW50KGdldFJlYWRMb2NhdGlvbigpLCB0cnVlKTsKLQkJCWdldEZhdm9yaXRlc1VERElSZWdpc3RyaWVzKCk7Ci0JCQkvKiBUT0RPOiBQdWJsaWMgcmVnaXN0cnkgc3RyaW5ncyBzaG91bGRuJ3QgYmUgaW4gcHJvcGVydGllcyAtIEFpbid0IGV4dGVuc2libGUuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lzdHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWdpc3RyaWVzW2ldLnNldE5hbWUoV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcocmVnaXN0cmllc1tpXS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJCSovCi0JCX0KLQkJcmV0dXJuIHdzaWxEb2NfOwotCX0KLQotCXB1YmxpYyBXU0lMRG9jdW1lbnQgZ2V0RmF2b3JpdGVzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGdldFdTSUxEb2N1bWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgV1NJTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1JlZ2lzdHJ5VHlwZVdTRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2ZjOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLmZhdm9yaXRlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsdWdpbi5FeHBsb3JlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlcy5GYXZvcml0ZXNSZWdpc3RyeVR5cGVBYnN0cmFjdDsKLQotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFIGV4dGVuZHMgRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgV1NJTERvY3VtZW50IHdzaWxEb2NfOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZPUklURVNfV1NFWFBMT1JFUiA9ICJmYXZvcml0ZXMud3NpbCI7Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRGYXZvcml0ZXNfID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgc3RhdGVMb2NhdGlvbl8gPSBudWxsOwotICAKLSAgcHVibGljIEZhdm9yaXRlc1JlZ2lzdHJ5VHlwZVdTRSgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHdzaWxEb2NfID0gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIEZhdm9yaXRlc1JlZ2lzdHJ5VHlwZVdTRShTdHJpbmcgZGVmYXVsdEZhdm9yaXRlcywgU3RyaW5nIHN0YXRlTG9jYXRpb24pIHsKLQlzdXBlcigpOwotCXdzaWxEb2NfID0gbnVsbDsKLQlkZWZhdWx0RmF2b3JpdGVzXyA9IGRlZmF1bHRGYXZvcml0ZXM7Ci0Jc3RhdGVMb2NhdGlvbl8gPSBzdGF0ZUxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkTG9jYXRpb24oKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHJlYWRMb2NhdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICByZWFkTG9jYXRpb24uYXBwZW5kKHN0YXRlTG9jYXRpb25fID09IG51bGwgPyBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblN0YXRlTG9jYXRpb24oKSA6IHN0YXRlTG9jYXRpb25fKTsKLSAgICByZWFkTG9jYXRpb24uYXBwZW5kKEZBVk9SSVRFU19XU0VYUExPUkVSKTsKLSAgICByZXR1cm4gcmVhZExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldFJlYWRMb2NhdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFdTSUxEb2N1bWVudCBnZXRXU0lMRG9jdW1lbnQoKQotICB7Ci0gICAgaWYgKHdzaWxEb2NfID09IG51bGwpCi0gICAgewotICAgICAgd3NpbERvY18gPSBsb2FkV1NJTERvY3VtZW50KGdldFJlYWRMb2NhdGlvbigpLCBmYWxzZSk7Ci0gICAgICBpZiAod3NpbERvY18gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdG9yZUZhdm9yaXRlc0RlZmF1bHQoKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzYXZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHdzaWxEb2NfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzdG9yZUZhdm9yaXRlc0RlZmF1bHQoKQotICB7Ci0gICAgd3NpbERvY18gPSAobmV3IEZhdm9yaXRlc1JlZ2lzdHJ5VHlwZURlZmF1bHQoZGVmYXVsdEZhdm9yaXRlc18pKS5nZXRXU0lMRG9jdW1lbnQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbHVnaW4vRXhwbG9yZXJQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGx1Z2luL0V4cGxvcmVyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTEwNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbHVnaW4vRXhwbG9yZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hXaXphcmRUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5mYXZvcml0ZXMuRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLSAqLwotcHVibGljIGNsYXNzIEV4cGxvcmVyUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotICAvKioKLSAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVQgPSAiVVRGLTgiOwotICAvKioKLSAgICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgRXhwbG9yZXJQbHVnaW4gaW5zdGFuY2VfOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4gVGhlICJwbHVnaW4iIGVsZW1lbnQKLSAgICogaW4gcGx1Z2luLnhtbCBzaG91bGQgaW5jbHVkZSB0aGUgYXR0cmlidXRlIGNsYXNzID0KLSAgICogIm9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbHVnaW4uRXhwbG9yZXJQbHVnaW4iLgotICAgKiAKLSAgICogQHBhcmFtIGRlc2NyaXB0b3IKLSAgICogICAgICAgICAgICBUaGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbi4KLSAgICovCi0gIHB1YmxpYyBFeHBsb3JlclBsdWdpbigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgICogKEV4cGxvcmVyUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyIik7Ci0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBFeHBsb3JlclBsdWdpbiBzaW5nbGV0b24uCi0gICAqLwotICBzdGF0aWMgcHVibGljIEV4cGxvcmVyUGx1Z2luIGdldEluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgZmlyc3QgbG9hZGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBidW5kbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0YXJ0KGJ1bmRsZSk7Ci0gICAgLy8gaW5pdCB0aGUgc2hlbGwgb2YgTGF1bmNoV2l6YXJkVGFzawotICAgIExhdW5jaFdpemFyZFRhc2suZ2V0SW5zdGFuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgb25jZSBieSB0aGUgcGxhdGZvcm0gd2hlbiB0aGlzIHBsdWdpbiBpcyB1bmxvYWRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0b3AoYnVuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUKLSAgICogcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgICogCi0gICAqIEBwYXJhbSBrZXkKLSAgICogICAgICAgICAgICBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4gVGhhdCBpcywgdGhlCi0gICAqICAgICAgICAgICAgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIiB3aGVyZSB0aGUKLSAgICogICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUgZm9ybTogIktFWSA9Ci0gICAqICAgICAgICAgICAgdmFsdWUiLgotICAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhpbnN0YW5jZV8uZ2V0QnVuZGxlKCksIGtleSk7IAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tIHRoZQotICAgKiBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzCi0gICAqIGluIHRoZSBtZXNzYWdlIHN0cmluZyBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbgotICAgKiBvYmplY3RzICh3aGljaCBhcmUgbW9zdCBmcmVxdWVudGx5IHN0cmluZ3MpLiBTZWUgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQKLSAgICogZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0ga2V5Ci0gICAqICAgICAgICAgICAgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuIFRoYXQgaXMsIHRoZQotICAgKiAgICAgICAgICAgIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIgd2hlcmUgdGhlCi0gICAqICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlIGZvcm06ICJLRVkgPQotICAgKiAgICAgICAgICAgIHZhbHVlIi4KLSAgICogQHBhcmFtIGFyZ3MKLSAgICogICAgICAgICAgICBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgYXMgcmVxdWlyZWQgYnkgdGhlCi0gICAqICAgICAgICAgICAgbWVzc2FnZSBpbiBwbHVnaW4ucHJvcGVydGllcyBhbmQgYnkgdGhlIHJ1bGVzIG9mIGNsYXNzCi0gICAqICAgICAgICAgICAgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuCi0gICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSwgYXJncyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgcmVzb3VyY2UgYXMgcmVsYXRpdmUgdG8gdGhlCi0gICAqIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uLgotICAgKiAKLSAgICogQHJldHVybiBBbiBpbWFnZSBkZXNjcmlwdG9yLCBwb3NzaWJseSBudWxsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIGluc3RhbGxVUkwgPSBpbnN0YW5jZV8uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLSAgICAgIFVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgbmFtZSk7Ci0gICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlZSBJUGx1Z2luSGVscGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TXNnTG9nZ2VyQ29uZmlnKEhhc2h0YWJsZSBtc2dMb2dnZXJDb25maWcpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBTZWUgSVBsdWdpbkhlbHBlci4KLSAgICovCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0TXNnTG9nZ2VyQ29uZmlnKFBsdWdpbiBwbHVnaW4pCi0gIHsKLSAgICByZXR1cm4gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlZSBJUGx1Z2luSGVscGVyLgotICAgKi8KLSAgcHVibGljIEhhc2h0YWJsZSBnZXRNc2dMb2dnZXJDb25maWcoKQotICB7Ci0gICAgcmV0dXJuIGdldE1zZ0xvZ2dlckNvbmZpZyh0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbih0aGlzKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvT1NTdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKCkKLSAgewotCS8vIFRPRE86IGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbiBjYW4gcmV0dXJuIG51bGwgYW5kIGNhdXNlIHRyb3VibGUgZm9yIHRoZSBXU0UncyBmYXZvdXJpdGVzIG1lY2hhbmlzbS4gODkxMDEgc2hvdWxkIGNvcnJlY3QgdGhpcy4KLQlyZXR1cm4gZ2V0UGx1Z2luSW5zdGFsbExvY2F0aW9uKCkrRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdC5GQVZPUklURVNfREVGQVVMVDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoaW5zdGFuY2VfLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wb3B1cC9Qb3B1cFRlc3RXU0RMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BvcHVwL1BvcHVwVGVzdFdTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyYjU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BvcHVwL1BvcHVwVGVzdFdTREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA2MDYgICAxMDUwNjkgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uCi0gKiAyMDA2MDgwMyAgIDE1Mjc5MCBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24KLSAqIDIwMDcwMzI3ICAgMTcyMzM5IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBvcHVwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb25pdG9yLkdldE1vbml0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkudXRpbHMuQWRhcHRlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1cFRlc3RXU0RMIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17Ci0gIHB1YmxpYyBQb3B1cFRlc3RXU0RMKCkKLSAgewotICAgIHN1cGVyKEV4cGxvcmVyUGx1Z2luLmdldE1lc3NhZ2UoIiVQT1BVUF9URVNUX1dTREwiKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0V29ya2JlbmNoU2VsZWN0aW9uKCkKLSAgewotICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBpZiAod2luZG93ICE9IG51bGwpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICByZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0JU3RyaW5nIHN0YXRlTG9jYXRpb24gPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblN0YXRlTG9jYXRpb24oKTsKLQlTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uID0gRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24oKTsKLSAgCVdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCk7Ci0gICAgY29tbWFuZC5zZXRGb3JjZUxhdW5jaE91dHNpZGVJREUoZmFsc2UpOwotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFdvcmtiZW5jaFNlbGVjdGlvbigpOwotICAgIFZlY3RvciBsYXVuY2hPcHRpb25zID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB3c2RsVVJMID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAJRmlsZSB3c2RsRmlsZSA9ICgoSVJlc291cmNlKW9iamVjdCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLSAgICAgICAgCXRyeQotICAgICAgICAJewotICAgICAgICAJCXdzZGxVUkwgPSB3c2RsRmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgICAJewotICAgICAgICAJCXdzZGxVUkwgPSB3c2RsRmlsZS50b1N0cmluZygpOwotICAgICAgICAJfQotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsKQotICAgICAgICB7Ci0gICAgICAgIAlTZXJ2aWNlSW1wbCBzZXJ2aWNlSW1wbCA9IChTZXJ2aWNlSW1wbClvYmplY3Q7ICAgICAgICAgIAotICAgICAgICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gc2VydmljZUltcGwuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOyAgICAgICAgCi0gICAgICAgIAl3c2RsVVJMID0gZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICAgIHsKLSAgICAgICAgCVdTRExSZXNvdXJjZUltcGwgV1NETFJJbXBsID0gKFdTRExSZXNvdXJjZUltcGwpb2JqZWN0OwotICAgICAgICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gV1NETFJJbXBsLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgCXdzZGxVUkwgPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgIAl3c2RsVVJMID0gKFN0cmluZykgb2JqZWN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJLy8gT2JqZWN0IGlzIG5vdCBhbnkgdHlwZXMgd2UgcmVjb2duaXplZCwgd3NkbFVSTCBpcyBzdGlsbCBudWxsLgotICAgICAgICAgIAkvLyBUcnkgbG9va2luZyB1cCBhbiBhZGFwdGVyIGZvciB0aGUgb2JqZWN0LgotICAgICAgICAJLy8gSWYgZm91bmQsIHVwZGF0ZSB3c2RsVVJMIGNvbnRhaW5zIHRoZSBhZGFwdGVkIFdTREwgc3RyaW5nLiAgCi0gICAgICAgIAkvLyBJZiBub3QgZm91bmQsIHdzZGxVUkwgd291bGQgc3RpbGwgYmUgbnVsbC4KLSAgICAgICAgCXdzZGxVUkwgPSBBZGFwdGVyVXRpbHMuZ2V0QWRhcHRlZFdTREwob2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICBhZGRMYXVuY2hPcHRpb25zKGxhdW5jaE9wdGlvbnMsIHdzZGxVUkwsIHN0YXRlTG9jYXRpb24sIGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbik7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgY29tbWFuZC5zZXRMYXVuY2hPcHRpb25zKChMYXVuY2hPcHRpb25bXSlsYXVuY2hPcHRpb25zLnRvQXJyYXkobmV3IExhdW5jaE9wdGlvblswXSkpOwotICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhbmQgYWRkIHRoZSBXRUJfU0VSVklDRV9FTkRQT0lOVCwgV1NETF9VUkwsIFNUQVRFX0xPQ0FUSUlPTiBhbmQgCi0gICAqIERFRkFVTFRfRkFWT1JJVEVTX0xPQ0FUSU9OIExhdW5jaE9wdGlvbnMgdG8gdGhlIGxhdW5jaE9wdGlvbnMgdmVjdG9yCi0gICAqIAotICAgKiBAcGFyYW0gbGF1bmNoT3B0aW9ucyAtIHZlY3RvciBvZiBsYXVuY2hPcHRpb25zIHRvIGFkZCB0bwotICAgKiBAcGFyYW0gd3NkbFVSTAotICAgKiBAcGFyYW0gc3RhdGVMb2NhdGlvbgotICAgKiBAcGFyYW0gZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRMYXVuY2hPcHRpb25zKFZlY3RvciBsYXVuY2hPcHRpb25zLCBTdHJpbmcgd3NkbFVSTCwgU3RyaW5nIHN0YXRlTG9jYXRpb24sIFN0cmluZyBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24pCi0gIHsKLQkgIEdldE1vbml0b3JDb21tYW5kIGdldE1vbml0b3JDbWQgPSBuZXcgR2V0TW9uaXRvckNvbW1hbmQoKTsKLSAgICAgIGdldE1vbml0b3JDbWQuc2V0TW9uaXRvclNlcnZpY2UodHJ1ZSk7Ci0gICAgICBnZXRNb25pdG9yQ21kLnNldENyZWF0ZShmYWxzZSk7Ci0gICAgICBnZXRNb25pdG9yQ21kLnNldFdlYlNlcnZpY2VzUGFyc2VyKG5ldyBXZWJTZXJ2aWNlc1BhcnNlcigpKTsKLSAgICAgIGdldE1vbml0b3JDbWQuc2V0V3NkbFVSSSh3c2RsVVJMKTsKLSAgICAgIGdldE1vbml0b3JDbWQuZXhlY3V0ZShudWxsLCBudWxsKTsKLSAgICAgIExpc3QgZW5kcG9pbnRzID0gZ2V0TW9uaXRvckNtZC5nZXRFbmRwb2ludHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgZW5kcG9pbnRzSXQgPSBlbmRwb2ludHMuaXRlcmF0b3IoKTsgZW5kcG9pbnRzSXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAJICBsYXVuY2hPcHRpb25zLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV0VCX1NFUlZJQ0VfRU5EUE9JTlQsIChTdHJpbmcpZW5kcG9pbnRzSXQubmV4dCgpKSk7Ci0gICAgICB9Ci0gICAgICBsYXVuY2hPcHRpb25zLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV1NETF9VUkwsIHdzZGxVUkwpKTsKLQkgIGxhdW5jaE9wdGlvbnMuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5TVEFURV9MT0NBVElPTixzdGF0ZUxvY2F0aW9uKSk7Ci0JICBsYXVuY2hPcHRpb25zLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuREVGQVVMVF9GQVZPUklURVNfTE9DQVRJT04sZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIHJ1bigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItcHJvcGVydGllcy9leHBsb3Jlci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1wcm9wZXJ0aWVzL2V4cGxvcmVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZTVlOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1wcm9wZXJ0aWVzL2V4cGxvcmVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVElUTEVfV1NFWFBMT1JFUj1XZWIgU2VydmljZXMgRXhwbG9yZXIKLQotIyBUcmVlIE5vZGVzCi1BTFRfT1BFTj1PcGVuCi1BTFRfQ0xPU0U9Q2xvc2UKLQotIyBQZXJzcGVjdGl2ZSBUb29sYmFyCi1BTFRfQkFDSz1CYWNrCi1BTFRfRk9SV0FSRD1Gb3J3YXJkCi1BTFRfQUNUSU9OX0VOR0lORT1BY3Rpb24gUmVjb3JkZXIKLUFMVF9VRERJX1BFUlNQRUNUSVZFPVVEREkgUGFnZQotQUxUX1dTSUxfUEVSU1BFQ1RJVkU9V1NJTCBQYWdlCi1BTFRfV1NETF9QRVJTUEVDVElWRT1XU0RMIFBhZ2UKLUFMVF9GQVZPUklURVNfUEVSU1BFQ1RJVkU9RmF2b3JpdGVzCi0KLSMgVG9vbGJhcnMKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkU9RG91YmxlIENsaWNrIHRvIE1heGltaXplCi1BTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkU9RG91YmxlIENsaWNrIHRvIFJlc3RvcmUKLQotIyBTZXREZWZhdWx0Vmlld1Rvb2wKLUFMVF9CQUNLX1RPX1RPUD1CYWNrIHRvIHRvcAotCi0jIENvbW1vbiBBY3Rpb25zCi1BTFRfUkVGUkVTSD1SZWZyZXNoCi1BTFRfQ0xFQVI9Q2xlYXIKLUFMVF9SRVNVTFRTPVJlc3VsdHMKLQotIyBDb21tb24gTGFiZWxzCi1BTFRfTkFWSUdBVE9SPU5hdmlnYXRvcgotQUxUX0FDVElPTlM9QWN0aW9ucwotQUxUX1NUQVRVUz1TdGF0dXMKLUFMVF9PVEhFUl9BQ1RJT05TPU90aGVyIEFjdGlvbnMKLUZPUk1fQlVUVE9OX0dPPSZuYnNwOyZuYnNwO0dvJm5ic3A7Jm5ic3A7Ci1GT1JNX0JVVFRPTl9SRVNFVD1SZXNldAotRk9STV9CVVRUT05fQ0FOQ0VMPUNhbmNlbAotRk9STV9MQUJFTF9BQ1RJT05TPUFjdGlvbnMKLUZPUk1fTEFCRUxfQUNUSU9OU19OT05FPU5vbmUKLQotIyBQbGFjZWhvbGRlciBmb3IgYmxhbmsgdGFibGUgZW50cmllcwotVEFCTEVfQkxBTktfUExBQ0VIT0xERVI9LS0KLQotIyBDb21tb24gRm9ybSBDb250cm9sIFRpdGxlcwotRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YPVNlbGVjdCBhbGwKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWD1TZWxlY3Qgcm93Ci0KLSMgQ29tbW9uIE1lc3NhZ2VzCi1NU0dfRVJST1JfVU5FWFBFQ1RFRD1JV0FCMDEzNUUgQW4gdW5leHBlY3RlZCBlcnJvciBoYXMgb2NjdXJyZWQuCi1NU0dfRVJST1JfTk9fQUNUSU9OX1NFTEVDVEVEPUlXQUIwMTI0RSBTZWxlY3QgYW4gYWN0aW9uLgotTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQ9SVdBQjAxMjVFIFNlbGVjdCBhIG5vZGUuCi1NU0dfU1VCTUlUX0lOX1BST0dSRVNTPVBsZWFzZSB3YWl0LiBUaGUgb3BlcmF0aW9uIGlzIHN0aWxsIGluIHByb2dyZXNzLgotTVNHX0xPQURfSU5fUFJPR1JFU1M9UGxlYXNlIHdhaXQgd2hpbGUgdGhlIGZvcm0gbG9hZHMuLi4KLQotI0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24KLUFMVF9MQVVOQ0hfV0VCX1NFUlZJQ0VfV0laQVJEPUxhdW5jaCBXZWIgU2VydmljZSBXaXphcmQKLUZPUk1fTEFCRUxfQ0hPT1NFX1dJWkFSRD1TZWxlY3QgYSB3aXphcmQgdG8gbGF1bmNoOgotRk9STV9SQURJT19XRUJfU0VSVklDRV9DTElFTlRfV0laQVJEPVdlYiBTZXJ2aWNlIENsaWVudAotRk9STV9SQURJT19XRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQ9V2ViIFNlcnZpY2UgU2tlbGV0b24KLU1TR19FUlJPUl9XSVpBUkRfQUxSRUFEWV9SVU5OSU5HPUlXQUIwMTI2RSBBIFdlYiBzZXJ2aWNlIHdpemFyZCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLiAgRmluaXNoIHdpdGggdGhlIGV4aXN0aW5nIHdpemFyZCBiZWZvcmUgbGF1bmNoaW5nIGEgbmV3IG9uZS4KLU1TR19FUlJPUl9XU0RMX1VSTF9JU19VTlJFQUNIQUJMRT1JV0FCMDEyN0UgVGhlIFdTREwgZG9jdW1lbnQgaXMgdW5yZWFjaGFibGUuCi0KLSMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uCi1BTFRfV1NJTF9JTVBPUlRfVE9fRlM9SW1wb3J0IFdTSUwgVG8gRmlsZSBTeXN0ZW0KLUFMVF9XU0RMX0lNUE9SVF9UT19GUz1JbXBvcnQgV1NETCBUbyBGaWxlIFN5c3RlbQotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NETF9ET0M9SVdBQjAxMjhFIFVuYWJsZSB0byByZXRyaWV2ZSBXU0RMIGRvY3VtZW50LgotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NJTF9ET0M9SVdBQjAxMjlFIFVuYWJsZSB0byByZXRyaWV2ZSBXU0lMIGRvY3VtZW50LgotTVNHX0lNUE9SVF9XU0RMX1NVQ0NFU1NGVUw9V1NETCBkb2N1bWVudCBzdWNjZXNzZnVsbHkgaW1wb3J0ZWQuCi1NU0dfSU1QT1JUX1dTSUxfU1VDQ0VTU0ZVTD1XU0lMIGRvY3VtZW50IHN1Y2Nlc3NmdWxseSBpbXBvcnRlZC4KLQotIyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbgotQUxUX0lNUE9SVF9XU0RMX1RPX1dPUktCRU5DSD1JbXBvcnQgV1NETCBUbyB3b3JrYmVuY2gKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1dPUktCRU5DSF9ERVNDPVNlbGVjdCBhIHdvcmtiZW5jaCBwcm9qZWN0IHRvIHNhdmUgdGhlIFdTREwgZmlsZSBpbnRvLiBZb3UgbWF5IGFsc28gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBXU0RMIGZpbGUuCi1XRUJfUFJPSkVDVF9OQU1FPVdlYiBwcm9qZWN0OgotV09SS0JFTkNIX1BST0pFQ1RfTkFNRT1Xb3JrYmVuY2ggcHJvamVjdDoKLUxBQkVMX0lNUE9SVF9XU0RMPUltcG9ydCBXU0RMIGRvY3VtZW50Ci1MQUJFTF9JTVBPUlRfVE9fV1NJTD1JbXBvcnQgYXMgYSBzZXJ2aWNlIHJlZmVyZW5jZSB0byBhIFdTSUwgZG9jdW1lbnQKLUlNUE9SVEVEX1dTRExfRklMRV9OQU1FPVdTREwgZmlsZSBuYW1lOgotV1NJTF9GSUxFX05BTUU9V1NJTCBmaWxlIG5hbWU6Ci1NU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9Q2Fubm90IGNyZWF0ZSB0aGUgZmlsZSAiJTIiIHJlbGF0aXZlIHRvIHRoZSBwYXRoICIlMSIgYmVjYXVzZSBhdXRvbWF0aWMgZmlsZSBvdmVyd3JpdGluZyBoYXMgbm90IGJlZW4gZW5hYmxlZC4gRG8geW91IHdhbnQgdG8gZW5hYmxlIGl0IGZvciB0aGlzIGZpbGU/Ci1NU0dfRVJST1JfSU5WQUxJRF9XT1JLQkVOQ0hfUFJPSkVDVD1JV0FCMDEzMEUgU2VsZWN0IGEgd29ya2JlbmNoIHByb2plY3QuCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfTkFNRT1JV0FCMDEzMUUgSW52YWxpZCBmaWxlIG5hbWUuCi1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX0ZJTEVfTkFNRT1JV0FCMDQ3MEUgSW52YWxpZCBXU0lMIGZpbGUgbmFtZS4KLU1TR19FUlJPUl9OT19JTVBPUlRfT1BUSU9OX1NFTEVDVEVEPUlXQUIwNDcxRSBObyBpbXBvcnQgb3B0aW9uIGlzIHNlbGVjdGVkLiAgUGxlYXNlIGNob29zZSBhdCBsZWFzdCBvbmUgaW1wb3J0IG9wdGlvbi4KLU1TR19FUlJPUl9XUklUSU5HX1RFTVBfRklMRV9UT19GUz1JV0FCMDEzMkUgVW5hYmxlIHRvIHdyaXRlIHRlbXBvcmFyeSBmaWxlLgotTVNHX0lORk9fSU1QT1JUX1RPX1dPUktCRU5DSF9TVUNDRVNTRlVMPUlXQUIwMzE0SSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IGltcG9ydGVkIHRvIHRoZSB3b3JrYmVuY2guCi1NU0dfSU5GT19JTVBPUlRfU0VSVklDRV9SRUZfVE9fV1NJTF9TVUNDRVNTRlVMPUlXQUIwNDcySSBTZXJ2aWNlIHJlZmVyZW5jZSB3YXMgc3VjY2Vzc2Z1bGx5IGltcG9ydGVkIHRvICUxLgotCi0jIENoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uCi1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1DYW5ub3QgY3JlYXRlIHRoZSBmaWxlICIlMiIgcmVsYXRpdmUgdG8gdGhlIHBhdGggIiUxIiBiZWNhdXNlIGF1dG9tYXRpYyBmaWxlIGNoZWNrIG91dCBoYXMgbm90IGJlZW4gZW5hYmxlZC4gRG8geW91IHdhbnQgdG8gZW5hYmxlIGl0IGZvciB0aGlzIGZpbGU/Ci0KLSMgQ2xlYXJOb2RlQWN0aW9uCi1NU0dfSU5GT19OT0RFX0NMRUFSRUQ9SVdBQjAxMzNJICUxIGNsZWFyZWQuCi0KLSMgVGFibGUgdHdpc3RlZXMKLUFMVF9UV0lTVF9PUEVORUQ9SGlkZQotQUxUX1RXSVNUX0NMT1NFRD1FeHBhbmQKLQotIyBXU0RMIEJyb3dzZXIKLUZPUk1fTElOS19CUk9XU0U9QnJvd3NlLi4uCi1USVRMRV9XU0RMX0JST1dTRVI9V1NETCBCcm93c2VyIC0gJTEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0U9U2VsZWN0IGEgV1NETCBzb3VyY2U6Ci1GT1JNX0xBQkVMX1dTRExfQ0FURUdPUlk9Q2F0ZWdvcnkKLUZPUk1fTEFCRUxfV1NETF9BbGw9QWxsCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFX1dFQlBST0pFQ1RTPVdvcmtzcGFjZSBQcm9qZWN0cwotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9RmF2b3JpdGVzCi1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVdvcmtzcGFjZSBQcm9qZWN0Ci1GT1JNX0xBQkVMX1dTRExfVVJMPVdTREwgVVJMCi1GT1JNX0JVVFRPTl9SRUZSRVNIPVJlZnJlc2gKLUFMVF9XU0RMX0JST1dTRVI9V1NETCBCcm93c2VyCi1XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0VTPVNlcnZpY2UgSW50ZXJmYWNlcwotV1NETF9UWVBFX1NFUlZJQ0VTPVNlcnZpY2VzCi0KLSMgQ2FsZW5kYXIgQnJvd3NlcgotVElUTEVfQ0FMRU5EQVJfQlJPV1NFUj1DYWxlbmRhciBCcm93c2VyCi0jIDIgY2hhcmFjdGVyIGFiYnJldmlhdGlvbnMgZm9yIGRheXMgb2YgdGhlIHdlZWsuCi1GT1JNX0xBQkVMX1NIX1NVTkRBWT1TdQotRk9STV9MQUJFTF9TSF9NT05EQVk9TW8KLUZPUk1fTEFCRUxfU0hfVFVFU0RBWT1UdQotRk9STV9MQUJFTF9TSF9XRURORVNEQVk9V2UKLUZPUk1fTEFCRUxfU0hfVEhVUlNEQVk9VGgKLUZPUk1fTEFCRUxfU0hfRlJJREFZPUZyCi1GT1JNX0xBQkVMX1NIX1NBVFVSREFZPVNhCi0jIE1vbnRocyBvZiB0aGUgeWVhcgotRk9STV9MQUJFTF9NT05USD1Nb250aDoKLUZPUk1fTEFCRUxfSkFOVUFSWT1KYW51YXJ5Ci1GT1JNX0xBQkVMX0ZFQlJVQVJZPUZlYnJ1YXJ5Ci1GT1JNX0xBQkVMX01BUkNIPU1hcmNoCi1GT1JNX0xBQkVMX0FQUklMPUFwcmlsCi1GT1JNX0xBQkVMX01BWT1NYXkKLUZPUk1fTEFCRUxfSlVORT1KdW5lCi1GT1JNX0xBQkVMX0pVTFk9SnVseQotRk9STV9MQUJFTF9BVUdVU1Q9QXVndXN0Ci1GT1JNX0xBQkVMX1NFUFRFTUJFUj1TZXB0ZW1iZXIKLUZPUk1fTEFCRUxfT0NUT0JFUj1PY3RvYmVyCi1GT1JNX0xBQkVMX05PVkVNQkVSPU5vdmVtYmVyCi1GT1JNX0xBQkVMX0RFQ0VNQkVSPURlY2VtYmVyCi1GT1JNX0xBQkVMX1lFQVI9WWVhcjoKLUZPUk1fTEFCRUxfVElNRT1UaW1lOgotRk9STV9MSU5LX1RPREFZPVRvZGF5Ci1GT1JNX0xJTktfUFJFVklPVVNfWUVBUj08PAotRk9STV9MSU5LX1BSRVZJT1VTX01PTlRIPTwKLUZPUk1fTElOS19ORVhUX01PTlRIPT4KLUZPUk1fTElOS19ORVhUX1lFQVI9Pj4KLUFMVF9QUkVWSU9VU19ZRUFSPVByZXZpb3VzIFllYXIKLUFMVF9QUkVWSU9VU19NT05USD1QcmV2aW91cyBNb250aAotQUxUX05FWFRfTU9OVEg9TmV4dCBNb250aAotQUxUX05FWFRfWUVBUj1OZXh0IFllYXIKLUFMVF9UT0RBWT1Ub2RheQotQUxUX0NBTEVOREFSX0JST1dTRVI9Q2FsZW5kYXIgQnJvd3NlcgotTVNHX0VSUk9SX0lOVkFMSURfVElNRV9GT1JNQVQ9SVdBQjAzNjhFIFRpbWUgd2FzIG5vdCBmb3JtYXR0ZWQgYXMgSEg6TU06U1NbLlNTU10uIERvIHlvdSB3aXNoIHRvIHVzZSB0aGUgY3VycmVudCB0aW1lIGluc3RlYWQ/Ci0KLSMgQWN0aW9uIGVuZ2luZQotVElUTEVfQUNUSU9OX1JFQ09SREVSPUFjdGlvbiBSZWNvcmRlcgotRk9STV9MQUJFTF9NT0RFPU1vZGU6Ci1GT1JNX0xBQkVMX01PREVfUExBWT1QbGF5Ci1GT1JNX0xBQkVMX01PREVfU1RPUD1TdG9wCi1GT1JNX0xBQkVMX01PREVfUkVDT1JEPVJlY29yZAotRk9STV9MQUJFTF9TQVZFPVNhdmUKLUZPUk1fTEFCRUxfUExBWV9GSUxFPVBsYXkgZmlsZToKLU1TR19FUlJPUl9JTlZBTElEX1BMQVlfRklMRT1JV0FCMDM2MkUgRW50ZXIgYSBwbGF5IGZpbGUuCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9QRVJTUEVDVElWRV9XT1JLQVJFQT1XZWIgU2VydmljZXMgRXhwbG9yZXIgSW50ZXJuYWwgV29yayBBcmVhCi1GUkFNRV9USVRMRV9QRVJTUEVDVElWRV9UT09MQkFSPVdlYiBTZXJ2aWNlcyBFeHBsb3JlciBUb29sYmFyCi1GUkFNRV9USVRMRV9QRVJTUEVDVElWRV9DT05URU5UPVdlYiBTZXJ2aWNlcyBFeHBsb3JlciBQYWdlIENvbnRlbnQKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1XU0RMIEJyb3dzZXIgVG9vbGJhcgotRlJBTUVfVElUTEVfV1NETF9DT05URU5UPVdTREwgQnJvd3NlciBDb250ZW50Ci0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfUEFHRV9MT0FERVI9UGFnZSBMb2FkZXIKLUZPUk1fVElUTEVfUEFHRV9DT05URU5UPUxvYWRlZCBQYWdlIENvbnRlbnQKLUZPUk1fVElUTEVfTEFVTkNIX1dFQlNFUlZJQ0VfV0laQVJEPUxhdW5jaCBXZWIgU2VydmljZSBXaXphcmQgRm9ybQotRk9STV9USVRMRV9JTVBPUlRfVE9fV09SS0JFTkNIPUltcG9ydCB0byBXb3JrYmVuY2ggRm9ybQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1wcm9wZXJ0aWVzL2Zhdm9yaXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1wcm9wZXJ0aWVzL2Zhdm9yaXRlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGY2YjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItcHJvcGVydGllcy9mYXZvcml0ZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1GYXZvcml0ZXMKLQotIyBOYXZpZ2F0b3IKLUZBVk9SSVRFU19NQUlOX05PREU9RmF2b3JpdGVzIE1haW4KLUZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFPUZhdm9yaXRlIFdTSUxzCi1GQVZPUklURVNfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFPUZhdm9yaXRlIFdTREwgU2VydmljZXMKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfRk9MREVSX05PREU9RmF2b3JpdGUgVURESSBTZXJ2aWNlcwotRkFWT1JJVEVTX1VERElfQlVTSU5FU1NFU19GT0xERVJfTk9ERT1GYXZvcml0ZSBVRERJIEJ1c2luZXNzZXMKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERT1GYXZvcml0ZSBVRERJIFNlcnZpY2UgSW50ZXJmYWNlcwotRkFWT1JJVEVTX1VERElfUkVHSVNUUklFU19GT0xERVJfTk9ERT1GYXZvcml0ZSBVRERJIFJlZ2lzdHJpZXMKLUZBVk9SSVRFU19VU0VSX0RFRl9VRERJX1JFR0lTVFJJRVNfRk9MREVSX05PREU9RmF2b3JpdGUgVXNlciBEZWZpbmVkIFVEREkgUmVnaXN0cmllcwotCi0jIEZvcm0KLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NJTD1GYXZvcml0ZSBXU0lMcwotRk9STV9MQUJFTF9GQVZPUklURV9XU0RMPUZhdm9yaXRlIFdTRExzCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfUkVHSVNUUlk9RmF2b3JpdGUgVURESSBSZWdpc3RyaWVzCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VTRVJfREVGX1VERElfUkVHSVNUUlk9RmF2b3JpdGUgVXNlciBEZWZpbmVkIFVEREkgUmVnaXN0cmllcwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0U9RmF2b3JpdGUgVURESSBTZXJ2aWNlcwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX0JVU0lORVNTPUZhdm9yaXRlIFVEREkgQnVzaW5lc3MgRW50aXRpZXMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1GYXZvcml0ZSBVRERJIFNlcnZpY2UgSW50ZXJmYWNlcwotRk9STV9MQUJFTF9SRU1PVkU9UmVtb3ZlCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFPUFkZCBUbyBXU0lMIFBhZ2UKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkU9QWRkIFRvIFVEREkgUGFnZQotRk9STV9MQUJFTF9JTVBPUlRfVE9fV1NETF9QRVJTUEVDVElWRT1BZGQgVG8gV1NETCBQYWdlCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9SXRlbSAjCi1GT1JNX0xBQkVMX1VERElfVkVSU0lPTj1VRERJIFZlcnNpb24KLUZPUk1fTEFCRUxfTkFNRT1OYW1lCi1GT1JNX0xBQkVMX0RFU0M9RGVzY3JpcHRpb24KLUZPUk1fTEFCRUxfREVGQVVMVF9MT0dJTj1EZWZhdWx0IExvZ2luCi1GT1JNX0xBQkVMX0RFRkFVTFRfUEFTU1dPUkQ9RGVmYXVsdCBQYXNzd29yZAotRk9STV9MQUJFTF9JTlFVSVJZX1VSTD1JbnF1aXJ5IFVSTAotRk9STV9MQUJFTF9QVUJMSVNIX1VSTD1QdWJsaXNoIFVSTAotRk9STV9MQUJFTF9TRUNVUkVfSU5RVUlSWV9VUkw9U2VjdXJlIElucXVpcnkgVVJMCi1GT1JNX0xBQkVMX1NFQ1VSRV9QVUJMSVNIX1VSTD1TZWN1cmUgUHVibGlzaCBVUkwKLUZPUk1fTEFCRUxfVEFYT05PTVk9VGF4b25vbXkKLUZPUk1fTEFCRUxfTEFOR1VBR0U9TGFuZ3VhZ2UKLUZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRT1SZWdpc3RyeSBOYW1lCi1GT1JNX0xBQkVMX0JVU0lORVNTX05BTUU9QnVzaW5lc3MgTmFtZQotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9QnVzaW5lc3MgS2V5Ci1GT1JNX0xBQkVMX1NFUlZJQ0VfTkFNRT1TZXJ2aWNlIE5hbWUKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9U2VydmljZSBLZXkKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRT1TZXJ2aWNlIEludGVyZmFjZSBOYW1lCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX0tFWT1TZXJ2aWNlIEludGVyZmFjZSBLZXkKLUZPUk1fTEFCRUxfUkVHSVNUUllfVVJMPTxhIGhyZWY9IiUxIiB0YXJnZXQ9Il9ibGFuayI+Q2xpY2sgaGVyZTwvYT4gdG8gb2J0YWluIGEgdXNlciBJRCBhbmQgcGFzc3dvcmQgZm9yIHRoaXMgcmVnaXN0cnkuCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVTPURhdGEgZmlsZXMgZm9yIFVzZXIgRGVmaW5lZCBDYXRlZ29yaWVzCi1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDMxNUUgU2VsZWN0IGF0IGxlYXN0IG9uZSBpdGVtLgotCi0jIExpc3RGYXZvcml0ZVdTSUxBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1dTSUw9TGlzdCBGYXZvcml0ZSBXU0lMcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1dTSUxfREVTQz1TZWxlY3QgYSBzZXQgb2YgZmF2b3JpdGUgV1NJTCBsaW5rcyBhbmQgcHJlc3MgPHN0cm9uZz5BZGQgdG8gV1NJTCBQYWdlPC9zdHJvbmc+IHRvIG9wZW4gdGhlbSBpbiB0aGUgV1NJTCBuYXZpZ2F0b3IuIFByZXNzIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IHRvIHJlbW92ZSB0aGUgc2VsZWN0aW9ucy4KLQotIyBMaXN0RmF2b3JpdGVXU0RMU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFPUxpc3QgRmF2b3JpdGUgV1NETCBTZXJ2aWNlcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1dTRExfU0VSVklDRV9ERVNDPVNlbGVjdCBhIHNldCBvZiBmYXZvcml0ZSBXU0RMIHNlcnZpY2VzIGFuZCBwcmVzcyA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiB0byByZW1vdmUgdGhlbS4KLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFPUxpc3QgRmF2b3JpdGUgVURESSBTZXJ2aWNlcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9ERVNDPVNlbGVjdCBhIHNldCBvZiBmYXZvcml0ZSBVRERJIHNlcnZpY2VzIGFuZCBwcmVzcyA8c3Ryb25nPkFkZCB0byBVRERJIFBhZ2U8L3N0cm9uZz4gdG8gb3BlbiB0aGVtIGluIHRoZSBVRERJIG5hdmlnYXRvci4gUHJlc3MgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gdG8gcmVtb3ZlIHRoZSBzZWxlY3Rpb25zLgotCi0jIExpc3RGYXZvcml0ZVVERElCdXNpbmVzc0FjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTUz1MaXN0IEZhdm9yaXRlIFVEREkgQnVzaW5lc3NlcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1NfREVTQz1TZWxlY3QgYSBzZXQgb2YgZmF2b3JpdGUgVURESSBidXNpbmVzc2VzIGFuZCBwcmVzcyA8c3Ryb25nPkFkZCB0byBVRERJIFBhZ2U8L3N0cm9uZz4gdG8gb3BlbiB0aGVtIGluIHRoZSBVRERJIG5hdmlnYXRvci4gUHJlc3MgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gdG8gcmVtb3ZlIHRoZSBzZWxlY3Rpb25zLgotCi0jIExpc3RGYXZvcml0ZVVERElSZWdpc3RyeUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWT1MaXN0IEZhdm9yaXRlIFVEREkgUmVnaXN0cmllcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUllfREVTQz1TZWxlY3QgYSBzZXQgb2YgZmF2b3JpdGUgVURESSByZWdpc3RyaWVzIGFuZCBwcmVzcyA8c3Ryb25nPkFkZCB0byBVRERJIFBhZ2U8L3N0cm9uZz4gdG8gb3BlbiB0aGVtIGluIHRoZSBVRERJIG5hdmlnYXRvci4gUHJlc3MgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gdG8gcmVtb3ZlIHRoZSBzZWxlY3Rpb25zLgotCi0jIExpc3RGYXZvcml0ZVVzZXJEZWZVRERJUmVnaXN0cnlBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VTRVJfREVGX1VERElfUkVHSVNUUlk9TGlzdCBGYXZvcml0ZSBVc2VyIERlZmluZWQgVURESSBSZWdpc3RyaWVzCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9ERVNDPVNlbGVjdCBhIHNldCBvZiBmYXZvcml0ZSBVRERJIHJlZ2lzdHJpZXMgYW5kIHByZXNzIDxzdHJvbmc+QWRkIHRvIFVEREkgUGFnZTwvc3Ryb25nPiB0byBvcGVuIHRoZW0gaW4gdGhlIFVEREkgbmF2aWdhdG9yLgotCi0jIExpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFPUxpc3QgRmF2b3JpdGUgVURESSBTZXJ2aWNlIEludGVyZmFjZXMKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0M9U2VsZWN0IGEgc2V0IG9mIGZhdm9yaXRlIFVEREkgc2VydmljZSBpbnRlcmZhY2VzIGFuZCBwcmVzcyA8c3Ryb25nPkFkZCB0byBVRERJIFBhZ2U8L3N0cm9uZz4gdG8gb3BlbiB0aGVtIGluIHRoZSBVRERJIG5hdmlnYXRvci4gUHJlc3MgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gdG8gcmVtb3ZlIHRoZSBzZWxlY3Rpb25zLgotCi0jIEZhdm9yaXRlc1dTSUxEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1dTSUxfREVUQUlMUz1GYXZvcml0ZSBXU0lMIERldGFpbHMKLQotIyBGYXZvcml0ZXNXU0RMRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19XU0RMX0RFVEFJTFM9RmF2b3JpdGUgV1NETCBEZXRhaWxzCi0KLSMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1JFR0lTVFJZX0RFVEFJTFM9RmF2b3JpdGUgVURESSBSZWdpc3RyeSBEZXRhaWxzCi0KLSMgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9ERVRBSUxTPUZhdm9yaXRlIFVzZXIgRGVmaW5lZCBVRERJIFJlZ2lzdHJ5IERldGFpbHMKLQotIyBGYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfQlVTSU5FU1NfREVUQUlMUz1GYXZvcml0ZSBVRERJIEJ1c2luZXNzIERldGFpbHMKLQotIyBGYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0RFVEFJTFM9RmF2b3JpdGUgVURESSBTZXJ2aWNlIERldGFpbHMKLQotIyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPUZhdm9yaXRlIFVEREkgU2VydmljZSBJbnRlcmZhY2UgRGV0YWlscwotCi0jIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9QWRkIHRvIFdTSUwgUGFnZQotTVNHX0VSUk9SX1dTSUxfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMTZFICUxIGlzIGFscmVhZHkgb3BlbmVkIGluIFdTSUwgUGFnZS4KLU1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMxN0kgJTEgaXMgYWRkZWQgdG8gV1NJTCBQYWdlLgotTVNHX0VSUk9SX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9SVdBQjAzMThFIFdTSUwgJTEgY291bGQgbm90IGJlIGxvYWRlZC4KLQotIyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUFkZCB0byBVRERJIFBhZ2UKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMyMEUgJTEgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4KLU1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMjFJICUxIGlzIGFkZGVkIHRvIFVEREkgUGFnZS4KLQotIyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9QWRkIHRvIFdTREwgUGFnZQotTVNHX0lORk9fQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzY5SSAlMSBpcyBhZGRlZCB0byBXU0RMIFBhZ2UuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3MEUgV1NETCAlMSBjb3VsZCBub3QgYmUgbG9hZGVkLgotCi0jIFJlbW92ZUZhdm9yaXRlQWN0aW9uCi1BTFRfUkVNT1ZFX0ZBVk9SSVRFPVJlbW92ZSBGYXZvcml0ZQotTVNHX0NPTkZJUk1fUkVNT1ZFX05PREU9JTEgaXMgbm8gbG9uZ2VyIHJlc29sdmFibGUuICBEbyB5b3Ugd2lzaCB0byBjbGVhciBpdD8KLQotIyBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbgotQUxUX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9UmVzdG9yZSBEZWZhdWx0IEZhdm9yaXRlcwotTVNHX0NPTkZJUk1fUkVTVE9SRV9ERUZBVUxUX0ZBVk9SSVRFUz1UaGlzIG9wZXJhdGlvbiB3aWxsIG92ZXJ3cml0ZSB0aGUgY3VycmVudCBmYXZvcml0ZXMuICBEbyB5b3Ugd2lzaCB0byBjb250aW51ZT8KLU1TR19FUlJPUl9PUEVOX0ZBVk9SSVRFU19CQUNLVVA9SVdBQjAxMzRFIFVuYWJsZSB0byBsb2FkIHRoZSBkZWZhdWx0IGZhdm9yaXRlcy4KLU1TR19JTkZPX0ZBVk9SSVRFU19SRVNUT1JFRF9UT19ERUZBVUxUPUlXQUIwMzIySSBEZWZhdWx0IEZhdm9yaXRlcyBhcmUgcmVzdG9yZWQuCi1NU0dfRVJST1JfU0FWRV9GQVZPUklURVNfV1NJTD1JV0FCMDE4NkUgVW5hYmxlIHRvIHNhdmUgZmF2b3JpdGVzIHRvICUxLgotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1OYXZpZ2F0b3IgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1OYXZpZ2F0b3IgVG9vbGJhcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9TmF2aWdhdG9yIENvbnRlbnQKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPUFjdGlvbnMgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Qcm9wZXJ0aWVzIENvbnRhaW5lcgotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPVByb3BlcnRpZXMgQ29udGVudAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPVByb3BlcnRpZXMgVG9vbGJhcgotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1TdGF0dXMgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1TdGF0dXMgQ29udGVudAotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9U3RhdHVzIFRvb2xiYXIKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9VRERJX0JVU0lORVNTX0RFVEFJTFM9VURESSBCdXNpbmVzcyBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfVURESV9SRUdJU1RSWV9ERVRBSUxTPVVEREkgUmVnaXN0cnkgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1VTRVJfREVGX1VERElfUkVHSVNUUllfREVUQUlMUz1Vc2VyIERlZmluZWQgVURESSBSZWdpc3RyeSBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9VURESSBTZXJ2aWNlIERldGFpbHMgRm9ybQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9VURESSBTZXJ2aWNlIEludGVyZmFjZSBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPVdTREwgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1dTSUxfREVUQUlMUz1XU0lMIERldGFpbHMgRm9ybQotCi0jIFZpZXcgdGl0bGVzCi1WSUVXX1RJVExFX1VERElfQlVTSU5FU1NfTElTVD1VRERJIEJ1c2luZXNzZXMgTGlzdCBWaWV3Ci1WSUVXX1RJVExFX1VERElfUkVHSVNUUllfTElTVD1VRERJIFJlZ2lzdHJpZXMgTGlzdCBWaWV3Ci1WSUVXX1RJVExFX1VTRVJfREVGX1VERElfUkVHSVNUUllfTElTVD1Vc2VyIERlZmluZWQgVURESSBSZWdpc3RyaWVzIExpc3QgVmlldwotVklFV19USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0xJU1Q9VURESSBTZXJ2aWNlIEludGVyZmFjZXMgTGlzdCBWaWV3Ci1WSUVXX1RJVExFX1VERElfU0VSVklDRV9MSVNUPVVEREkgU2VydmljZXMgTGlzdCBWaWV3Ci1WSUVXX1RJVExFX1dTRExfU0VSVklDRV9MSVNUPVdTREwgU2VydmljZXMgTGlzdCBWaWV3Ci1WSUVXX1RJVExFX1dTSUxfTElTVD1XU0lMIExpbmtzIExpc3QgVmlldwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1wcm9wZXJ0aWVzL3VkZGkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItcHJvcGVydGllcy91ZGRpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0N2JmODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1wcm9wZXJ0aWVzL3VkZGkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1VRERJCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9VRERJX01BSU49VURESSBNYWluCi1OT0RFX05BTUVfUVVFUklFU19GT0xERVI9RXhlY3V0ZWQgUXVlcmllcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9CVVNJTkVTU0VTX0ZPTERFUj1QdWJsaXNoZWQgQnVzaW5lc3NlcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFU19GT0xERVI9UHVibGlzaGVkIFNlcnZpY2VzCi1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVI9UHVibGlzaGVkIFNlcnZpY2UgSW50ZXJmYWNlcwotCi0jIE9wZW5SZWdpc3RyeUFjdGlvbgotQUxUX09QRU5fUkVHSVNUUlk9T3BlbiBSZWdpc3RyeQotRk9STV9MQUJFTF9PUEVOX1JFR0lTVFJZX0RFU0M9U3BlY2lmeSB0aGUgbmFtZSBhbmQgaW5xdWlyeSBVUkwgb2YgdGhlIHJlZ2lzdHJ5IHRvIGJlIG9wZW5lZC4gU2VsZWN0aW5nIGEgZmF2b3JpdGUgcmVnaXN0cnkgd2lsbCBhdXRvbWF0aWNhbGx5IGZpbGwgaW4gdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIG9wZW4gdGhlIHJlZ2lzdHJ5LgotRk9STV9MQUJFTF9GQVZPUklURV9SRUdJU1RSWT1GYXZvcml0ZSBSZWdpc3RyeQotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPVJlZ2lzdHJ5IE5hbWUKLUZPUk1fTEFCRUxfSU5RVUlSWV9VUkw9SW5xdWlyeSBVUkwKLU1TR19FUlJPUl9JTlZBTElEX1JFR0lTVFJZX05BTUU9SVdBQjAxMzZFIEVudGVyIGEgdmFsaWQgcmVnaXN0cnkgbmFtZS4KLU1TR19FUlJPUl9JTlZBTElEX0lOUVVJUllfVVJMPUlXQUIwMTM4RSBFbnRlciBhIHZhbGlkIGlucXVpcnkgVVJMLgotTVNHX0lORk9fUkVHSVNUUllfT1BFTkVEPUlXQUIwMTM5SSBUaGUgcmVnaXN0cnkgbmFtZWQgJTEgbG9jYXRlZCBhdCAlMiB3YXMgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQotIyBVc2VyLWRlZmluZWQgQ2F0ZWdvcmllcwotRk9STV9MQUJFTF9BRERfQ0FURUdPUllfREFUQT08YSBocmVmPSIlMSI+Q2xpY2sgaGVyZTwvYT4gdG8gbG9hZCB0aGlzIGNhdGVnb3J5J3MgZGF0YS4KLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9GSUxFPUNhdGVnb3J5IGRhdGEgZmlsZSBuYW1lCi1NU0dfSU5GT19OT19VU0VSX0RFRklORURfQ0FURUdPUklFU19GT1VORD1JV0FCMDM3MUkgTm8gdXNlciBkZWZpbmVkIGNhdGVnb3JpZXMgZGV0ZWN0ZWQuCi1NU0dfSU5GT19OT19DQVRFR09SWV9EQVRBPUlXQUIwMzcySSBDYXRlZ29yeSBkYXRhIGZvciAlMSBpcyBub3QgYXZhaWxhYmxlIG9yIGlzIGludmFsaWQuCi1NU0dfSU5GT19VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9MT0FERUQ9SVdBQjAzNzNJIERhdGEgZm9yIHVzZXIgZGVmaW5lZCBjYXRlZ29yeSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZC4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfS0VZPUlXQUIwMzc0RSBJbnZhbGlkIGRhdGEgZmlsZSBmb3IgdXNlciBkZWZpbmVkIGNhdGVnb3J5ICUxLiBBIGNhdGVnb3J5IGtleSAnJTInIHdhcyBmb3VuZCBidXQgJyUzJyB3YXMgZXhwZWN0ZWQuCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0ZPUk1BVD1JV0FCMDQ3M0UgVW5rbm93biBmb3JtYXQgaW4gbGluZTogJTEgb2YgdGhlIGRhdGEgZmlsZSBmb3IgdXNlciBkZWZpbmVkIGNhdGVnb3J5ICUyLiBUaGUgbGluZSBpczogIiUzIgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRT1JV0FCMDM3NUUgSW52YWxpZCBkYXRhIGZpbGUgZm9yIHVzZXIgZGVmaW5lZCBjYXRlZ29yeSAlMS4KLU1TR19FUlJPUl9TQVZJTkdfQ0FURUdPUllfREFUQT1JV0FCMDQ3NEUgQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBzYXZpbmcgZGF0YSBmb3IgY2F0ZWdvcnkgJTEuIEV4Y2VwdGlvbiB0ZXh0OiAlMgotCi0jIFVEREkgQ2F0ZWdvcnkgQnJvd3NlcgotVElUTEVfQ0FURUdPUllfQlJPV1NFUj1DYXRlZ29yeSBCcm93c2VyCi1BTFRfQ0FURUdPUklFUz1DYXRlZ29yaWVzCi0KLSMgRGV0YWlscwotQUxUX1JFR0lTVFJZX0RFVEFJTFM9UmVnaXN0cnkgRGV0YWlscwotQUxUX0JVU0lORVNTX0RFVEFJTFM9QnVzaW5lc3MgRGV0YWlscwotQUxUX1NFUlZJQ0VfREVUQUlMUz1TZXJ2aWNlIERldGFpbHMKLUFMVF9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPVNlcnZpY2UgSW50ZXJmYWNlIERldGFpbHMKLUZPUk1fTEFCRUxfREVUQUlMU19FRElUQUJMRT1EZXRhaWxzIGZvciA8c3Ryb25nPiUxPC9zdHJvbmc+IGFyZSBzaG93biBiZWxvdy4gU29tZSBpdGVtcyBtYXkgYmUgYWRkZWQsIHJlbW92ZWQsIG9yIGNoYW5nZWQuIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZCBmb3IgY2hhbmdlcy4gT3RoZXIgYWN0aW9ucyBhcmUgbGlzdGVkIGF0IHRoZSBib3R0b20gb2YgdGhpcyBwYWdlLgotCi0jIEdldAotQUxUX0dFVD1HZXQKLQotIyBDb21tb24gRm9ybSBDb250cm9sIFRpdGxlCi1GT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFPU5hbWUgdmFsdWUKLUZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFPURlc2NyaXB0aW9uIHZhbHVlCi1GT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfS0VZX05BTUU9Q2F0ZWdvcnkga2V5IG5hbWUKLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfVkFMVUU9Q2F0ZWdvcnkga2V5IHZhbHVlCi1GT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfTkFNRT1JZGVudGlmaWVyIGtleSBuYW1lCi1GT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfVkFMVUU9SWRlbnRpZmllciBrZXkgdmFsdWUKLUZPUk1fQ09OVFJPTF9USVRMRV9ESVNDT1ZFUllfVVJMPURpc2NvdmVyeSBVUkwKLUZPUk1fQ09OVFJPTF9USVRMRV9JTlBVVF9URVhUX1ZBTFVFPVVEREkgcmVnaXN0cnkgbmFtZQotCi0jIEZpbmQgYWN0aW9ucwotQUxUX0ZJTkQ9RmluZAotQUxUX1NVQlFVRVJZPUZpbmQgJTEgU3VicXVlcnkKLUZPUk1fTEFCRUxfUVVFUllfTkFNRT1OYW1lIG9mIHRoaXMgcXVlcnkKLURFRkFVTFRfUVVFUllfTkFNRT1xdWVyeSByZXN1bHRzCi1ERUZBVUxUX1NVQlFVRVJZX05BTUU9JTEgLSAlMiBzdWJxdWVyeQotRk9STV9MQUJFTF9TRUFSQ0hfRk9SPVNlYXJjaCBmb3IKLUZPUk1fT1BUSU9OX0JVU0lORVNTRVM9QnVzaW5lc3NlcwotRk9STV9PUFRJT05fU0VSVklDRVM9U2VydmljZXMKLUZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUz1TZXJ2aWNlIEludGVyZmFjZXMKLUZPUk1fTEFCRUxfU0VBUkNIX1RZUEU9VHlwZSBvZiBzZWFyY2gKLUZPUk1fUkFESU9fU0lNUExFPVNpbXBsZQotRk9STV9SQURJT19BRFZBTkNFRD1BZHZhbmNlZAotRk9STV9SQURJT19VVUlEPVVVSUQKLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU0VTX1NJTVBMRV9ERVNDPUVudGVyIHRoZSBwYXJ0aWFsIG9yIGNvbXBsZXRlIG5hbWUgb2YgYSBidXNpbmVzcyB0byBzZWFyY2ggZm9yLiBUaGUgJyUnIHN5bWJvbCBjYW4gYmUgdXNlZCBhcyBhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIGV4ZWN1dGUgdGhlIHNlYXJjaC4KLUZPUk1fTEFCRUxfRklORF9BRFZBTkNFRF9ERVNDPUVudGVyIHZhbHVlcyBmb3Igb25lIG9yIG1vcmUgb2YgdGhlIHBhcmFtZXRlcnMgbGlzdGVkIGJlbG93LiBUaGUgJyUnIHN5bWJvbCBjYW4gYmUgdXNlZCBhcyBhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluIHRoZSBOYW1lIGZpZWxkIG9mIHRoZSBOYW1lcyB0YWJsZS4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIGV4ZWN1dGUgdGhlIHNlYXJjaC4KLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU19VVUlEX0RFU0M9RW50ZXIgdGhlIFVVSUQgb2YgdGhlIGJ1c2luZXNzIHRvIHNlYXJjaCBmb3IuIFByZXNzIDxzdHJvbmc+R288L3N0cm9uZz4gdG8gZXhlY3V0ZSB0aGUgc2VhcmNoLgotRk9STV9MQUJFTF9OQU1FUz1OYW1lcwotRk9STV9MSU5LX0FERD1BZGQKLUZPUk1fTElOS19HRVQ9R2V0Ci1GT1JNX0xJTktfRklORD1GaW5kCi1GT1JNX0xJTktfUkVNT1ZFPVJlbW92ZQotRk9STV9MQUJFTF9PV05FRD1Pd25lZAotRk9STV9MQUJFTF9QVUJMSVNIX1VSTD1QdWJsaXNoIFVSTAotRk9STV9MQUJFTF9VU0VSSUQ9VXNlciBJRAotRk9STV9MQUJFTF9QQVNTV09SRD1QYXNzd29yZAotRk9STV9MQUJFTF9MQU5HVUFHRT1MYW5ndWFnZQotRk9STV9MQUJFTF9OQU1FPU5hbWUKLUZPUk1fTEFCRUxfREVTQ1JJUFRJT049RGVzY3JpcHRpb24KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VOPUVuZ2xpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FBPUFmYXIKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FCPUFia2hhemlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQUY9QWZyaWthYW5zCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BTT1BbWhhcmljCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BUj1BcmFiaWMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FTPUFzc2FtZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BWT1BeW1hcmEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FaPUF6ZXJiYWlqYW5pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CQT1CYXNoa2lyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CRT1CeWVsb3J1c3NpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JHPUJ1bGdhcmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQkg9QmloYXJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CST1CaXNsYW1hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CTj1CZW5nYWxpOyBCYW5nbGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JPPVRpYmV0YW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JSPUJyZXRvbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQ0E9Q2F0YWxhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQ089Q29yc2ljYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NaPUN6ZWNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DWT1XZWxzaAotRk9STV9PUFRJT05fTEFOR1VBR0VfREE9RGFuaXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ERT1HZXJtYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RaPUJodXRhbmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VMPUdyZWVrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTz1Fc3BlcmFudG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VTPVNwYW5pc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VUPUVzdG9uaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FVT1CYXNxdWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZBPVBlcnNpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZJPUZpbm5pc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZKPUZpamkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZPPUZhZXJvZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GUj1GcmVuY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZZPUZyaXNpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dBPUlyaXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HRD1TY290cyBHYWVsaWMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dMPUdhbGljaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HTj1HdWFyYW5pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HVT1HdWphcmF0aQotRk9STV9PUFRJT05fTEFOR1VBR0VfSEE9SGF1c2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hJPUhpbmRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IUj1Dcm9hdGlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfSFU9SHVuZ2FyaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IWT1Bcm1lbmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfSUE9SW50ZXJsaW5ndWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lFPUludGVybGluZ3VlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JSz1JbnVwaWFrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JTj1JbmRvbmVzaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JUz1JY2VsYW5kaWMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lUPUl0YWxpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lXPUhlYnJldwotRk9STV9PUFRJT05fTEFOR1VBR0VfSkE9SmFwYW5lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pJPVlpZGRpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pXPUphdmFuZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LQT1HZW9yZ2lhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfS0s9S2F6YWtoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTD1HcmVlbmxhbmRpYwotRk9STV9PUFRJT05fTEFOR1VBR0VfS009Q2FtYm9kaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTj1LYW5uYWRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTz1Lb3JlYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tTPUthc2htaXJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LVT1LdXJkaXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LWT1LaXJnaGl6Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9MQT1MYXRpbgotRk9STV9PUFRJT05fTEFOR1VBR0VfTE49TGluZ2FsYQotRk9STV9PUFRJT05fTEFOR1VBR0VfTE89TGFvdGhpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xUPUxpdGh1YW5pYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xWPUxhdHZpYW4sIExldHRpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01HPU1hbGFnYXN5Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9NST1NYW9yaQotRk9STV9PUFRJT05fTEFOR1VBR0VfTUs9TWFjZWRvbmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfTUw9TWFsYXlhbGFtCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTj1Nb25nb2xpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01PPU1vbGRhdmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfTVI9TWFyYXRoaQotRk9STV9PUFRJT05fTEFOR1VBR0VfTVM9TWFsYXkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01UPU1hbHRlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01ZPUJ1cm1lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05BPU5hdXJ1Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9ORT1OZXBhbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05MPUR1dGNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9OTz1Ob3J3ZWdpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09DPU9jY2l0YW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09NPShBZmFuKSBPcm9tbwotRk9STV9PUFRJT05fTEFOR1VBR0VfT1I9T3JpeWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BBPVB1bmphYmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BMPVBvbGlzaAotRk9STV9PUFRJT05fTEFOR1VBR0VfUFM9UGFzaHRvLCBQdXNodG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BUPVBvcnR1Z3Vlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1FVPVF1ZWNodWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JNPVJoYWV0by1Sb21hbmNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STj1LaXJ1bmRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STz1Sb21hbmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfUlU9UnVzc2lhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfUlc9S2lueWFyd2FuZGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NBPVNhbnNrcml0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TRD1TaW5kaGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NHPVNhbmdybwotRk9STV9PUFRJT05fTEFOR1VBR0VfU0g9U2VyYm8tQ3JvYXRpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NJPVNpbmdoYWxlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NLPVNsb3ZhawotRk9STV9PUFRJT05fTEFOR1VBR0VfU0w9U2xvdmVuaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTT1TYW1vYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NOPVNob25hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTz1Tb21hbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NRPUFsYmFuaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUj1TZXJiaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUz1TaXN3YXRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVD1TZXNvdGhvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVT1TdW5kYW5lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NWPVN3ZWRpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NXPVN3YWhpbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RBPVRhbWlsCi1GT1JNX09QVElPTl9MQU5HVUFHRV9URT1UZWd1bHUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RHPVRhamlrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9USD1UaGFpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UST1UaWdyaW55YQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEs9VHVya21lbgotRk9STV9PUFRJT05fTEFOR1VBR0VfVEw9VGFnYWxvZwotRk9STV9PUFRJT05fTEFOR1VBR0VfVE49U2V0c3dhbmEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RPPVRvbmdhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UUj1UdXJraXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UUz1Uc29uZ2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RUPVRhdGFyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVz1Ud2kKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VLPVVrcmFpbmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfVVI9VXJkdQotRk9STV9PUFRJT05fTEFOR1VBR0VfVVo9VXpiZWsKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ZJPVZpZXRuYW1lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ZPPVZvbGFwdWsKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1dPPVdvbG9mCi1GT1JNX09QVElPTl9MQU5HVUFHRV9YSD1YaG9zYQotRk9STV9PUFRJT05fTEFOR1VBR0VfWU89WW9ydWJhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aSD1DaGluZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aVT1adWx1Ci1GT1JNX0xBQkVMX0VYQUNUX05BTUVfTUFUQ0g9RXhhY3QgbWF0Y2gKLUZPUk1fTEFCRUxfQ0FTRV9TRU5TSVRJVkVfTUFUQ0g9Q2FzZSBzZW5zaXRpdmUKLUZPUk1fTEFCRUxfU09VTkRFWD1Tb3VuZCBhbGlrZQotRk9STV9MQUJFTF9JREVOVElGSUVSUz1JZGVudGlmaWVycwotRk9STV9MQUJFTF9JREVOVElGSUVSX1RZUEU9VHlwZQotCi0jIERvIG5vdCB0cmFuc2xhdGUgdGhlIHR3byBpdGVtcyBiZWxvdy4KLUZPUk1fT1BUSU9OX0lERU5USUZJRVJfRFVOUz1ELVUtTi1TCi1GT1JNX09QVElPTl9JREVOVElGSUVSX1RIT01BU19SRUdJU1RSWT1UaG9tYXMgUmVnaXN0cnkKLQotRk9STV9MQUJFTF9LRVlfTkFNRT1LZXkgbmFtZQotRk9STV9MQUJFTF9LRVlfVkFMVUU9S2V5IHZhbHVlCi1GT1JNX0xBQkVMX0NBVEVHT1JJRVM9Q2F0ZWdvcmllcwotRk9STV9MQUJFTF9DQVRFR09SWV9UWVBFPVR5cGUKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX05BSUNTPU5BSUNTCi1GT1JNX09QVElPTl9DQVRFR09SWV9VTlNQU0NfNzM9VU5TUFNDIDcuMwotRk9STV9PUFRJT05fQ0FURUdPUllfR0VPPUdFTwotRk9STV9MQUJFTF9CVVNJTkVTU19DQVRFR09SSUVTPUNvbXBhcmUgd2l0aDoKLUZPUk1fT1BUSU9OX0JVU0lORVNTRVNfT05MWT1CdXNpbmVzc2VzIG9ubHkKLUZPUk1fT1BUSU9OX1NFUlZJQ0VTX09OTFk9U2VydmljZXMgb25seQotRk9STV9PUFRJT05fQk9USD1CdXNpbmVzc2VzIGFuZCBTZXJ2aWNlcwotRk9STV9MQUJFTF9ESVNDT1ZFUllVUkxTPURpc2NvdmVyeSBVUkxzCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTD1EaXNjb3ZlcnkgVVJMCi1GT1JNX0xBQkVMX0ZJTkRRVUFMSUZJRVJTPUZpbmQgUXVhbGlmaWVycwotRk9STV9MQUJFTF9DT01CSU5FX0tFWVM9Q29tYmluZSBrZXlzOgotRk9STV9PUFRJT05fQU5EQUxMS0VZUz1BbmQKLUZPUk1fT1BUSU9OX09SQUxMS0VZUz1PcgotRk9STV9PUFRJT05fT1JMSUtFS0VZUz1PciBMaWtlCi1GT1JNX0xBQkVMX1NPUlRfQllfTkFNRT1Tb3J0IGJ5IG5hbWU6Ci1GT1JNX1JBRElPX1NPUlRfQVNDPUFzY2VuZGluZwotRk9STV9SQURJT19TT1JUX0RFU0M9RGVzY2VuZGluZwotRk9STV9MQUJFTF9TT1JUX0JZX0RBVEU9U29ydCBieSBkYXRlOgotRk9STV9MQUJFTF9NQVhfU0VBUkNIX1NFVD1NYXhpbXVtIHNpemUgb2Ygc2VhcmNoIHNldDoKLUZPUk1fTEFCRUxfTUFYX1JFU1VMVFM9TWF4aW11bSBudW1iZXIgb2YgcmVzdWx0czoKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFU19TSU1QTEVfREVTQz1FbnRlciB0aGUgcGFydGlhbCBvciBjb21wbGV0ZSBuYW1lIG9mIGEgc2VydmljZSB0byBzZWFyY2ggZm9yLiBUaGUgJyUnIHN5bWJvbCBjYW4gYmUgdXNlZCBhcyBhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIGV4ZWN1dGUgdGhlIHNlYXJjaC4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX1VVSURfREVTQz1FbnRlciB0aGUgVVVJRCBvZiB0aGUgc2VydmljZSB0byBzZWFyY2ggZm9yLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIGV4ZWN1dGUgdGhlIHNlYXJjaC4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRVNfU0lNUExFX0RFU0M9RW50ZXIgdGhlIHBhcnRpYWwgb3IgY29tcGxldGUgbmFtZSBvZiBhIHNlcnZpY2UgaW50ZXJmYWNlIHRvIHNlYXJjaCBmb3IuIFRoZSAnJScgc3ltYm9sIGNhbiBiZSB1c2VkIGFzIGEgd2lsZGNhcmQgdGhhdCBtYXRjaGVzIGFueSBjaGFyYWN0ZXIuIFByZXNzIDxzdHJvbmc+R288L3N0cm9uZz4gdG8gZXhlY3V0ZSB0aGUgc2VhcmNoLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFX1VVSURfREVTQz1FbnRlciB0aGUgVVVJRCBvZiB0aGUgc2VydmljZSBpbnRlcmZhY2UgdG8gc2VhcmNoIGZvci4gUHJlc3MgPHN0cm9uZz5Hbzwvc3Ryb25nPiB0byBleGVjdXRlIHRoZSBzZWFyY2guCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFUz1TZXJ2aWNlIEludGVyZmFjZXMKLUZPUk1fTEFCRUxfVVVJRF9LRVk9VVVJRCBLZXk6Ci1GT1JNX0xBQkVMX1VTRV9TRVJWSUNFPVVzZSBzZXJ2aWNlCi1GT1JNX0xBQkVMX1NFUlZJQ0U9U2VydmljZQotRk9STV9MQUJFTF9CVVNJTkVTUz1CdXNpbmVzcwotRk9STV9MQUJFTF9QVUJMSVNIX0FTU0VSVElPTlM9UHVibGlzaGVyIEFzc2VydGlvbnMKLUZPUk1fTEFCRUxfRElSRUNUSU9OPURpcmVjdGlvbgotRk9STV9MQUJFTF9GUk9NX0tFWT1Gcm9tIEtleQotRk9STV9MQUJFTF9UT19LRVk9VG8gS2V5Ci1GT1JNX0xBQkVMX1NUQVRVUz1TdGF0dXMKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX1RZUEU9QXNzZXJ0aW9uIFR5cGUKLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX1BBUkVOVF9DSElMRD1QYXJlbnQtQ2hpbGQKLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX1BFRVJfVE9fUEVFUj1QZWVyLVBlZXIKLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX0lERU5USVRZPUlkZW50aXR5Ci1GT1JNX0xBQkVMX0FTU0VSVElPTl9ESVJFVElPTl9ERVNDPURpcmVjdGlvbiA8c3Ryb25nPkZyb208L3N0cm9uZz4gd2lsbCBjcmVhdGUgYSBwdWJsaXNoZXIgYXNzZXJ0aW9uIGZyb20gdGhpcyBidXNpbmVzcyB0byB0aGUgYnVzaW5lc3NlcyBhYm92ZS4gIERpcmVjdGlvbiA8c3Ryb25nPlRvPC9zdHJvbmc+IHdpbGwgY3JlYXRlIGEgcHVibGlzaGVyIGFzc2VydGlvbiBmcm9tIHRoZSBhYm92ZSBidXNpbmVzc2VzIHRvIHRoaXMgYnVzaW5lc3MuCi1GT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX0ZST009LS0tPgotRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9UTz08LS0tCi1GT1JNX0xBQkVMX1RISVNfQlVTSU5FU1M9VGhpcwotTVNHX0VSUk9SX0lOVkFMSURfUVVFUllfTkFNRT1JV0FCMDE0MEUgRW50ZXIgYSB2YWxpZCBuYW1lIGZvciB0aGUgcXVlcnkuCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FUz1JV0FCMDE0MUUgRW50ZXIgYSBzZXJpZXMgb2YgdmFsaWQgbmFtZXMuCi1NU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTD1JV0FCMDE0MkUgRW50ZXIgYSB2YWxpZCBwdWJsaXNoIFVSTC4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJJRD1JV0FCMDE0M0UgRW50ZXIgYSB2YWxpZCB1c2VyIElELgotTVNHX0VSUk9SX0lOVkFMSURfTUFYX1NFQVJDSF9TRVQ9SVdBQjAxNDVFIEVudGVyIGEgdmFsaWQgc2l6ZSBmb3IgdGhlIG1heGltdW0gc2VhcmNoIHNldC4KLU1TR19FUlJPUl9JTlZBTElEX01BWF9SRVNVTFRTPUlXQUIwMTQ2RSBFbnRlciBhIHZhbGlkIHNpemUgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzLgotTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0N0kgTnVtYmVyIG9mIGJ1c2luZXNzZXMgZm91bmQ6ICUxCi1NU0dfRVJST1JfTk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0OEUgTm8gYnVzaW5lc3NlcyBmb3VuZC4KLU1TR19JTkZPX1NFUlZJQ0VTX0ZPVU5EPUlXQUIwMTQ5SSBOdW1iZXIgb2Ygc2VydmljZXMgZm91bmQ6ICUxCi1NU0dfRVJST1JfTk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNTBFIE5vIHNlcnZpY2VzIGZvdW5kLgotTVNHX0VSUk9SX1NJTkdMRV9JVEVNPUlXQUIwMTUxRSBTZWxlY3QganVzdCBvbmUgaXRlbS4KLU1TR19RVUVTVElPTl9JVEVNX1JFUExBQ0VNRU5UPVRoZSBzZWxlY3Rpb24gd2lsbCByZXBsYWNlIGFuIGl0ZW0gYWxyZWFkeSBpbiB0aGUgdGFyZ2V0LiBEbyB5b3Ugd2lzaCB0byBwcm9jZWVkPwotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUySSBOdW1iZXIgb2Ygc2VydmljZSBpbnRlcmZhY2VzIGZvdW5kOiAlMQotTVNHX0VSUk9SX05PX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORD1JV0FCMDE1M0UgTm8gc2VydmljZSBpbnRlcmZhY2VzIGZvdW5kLgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAxNTRFIFNlbGVjdCBhdCBsZWFzdCBvbmUgaXRlbS4KLU1TR19FUlJPUl9JTlZBTElEX1VVSURfS0VZPUlXQUIwMTU1RSBFbnRlciBhIHZhbGlkIFVVSUQga2V5LgotTVNHX0VSUk9SX1FVRVJZX05BTUVfQ09ORkxJQ1Q9SVdBQjAxNTZFIFRoZSBzdWJxdWVyeSdzIHF1ZXJ5IG5hbWUgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hdG9yLgotTVNHX0VSUk9SX05PX0lURU1TX1RPX0dFVD1JV0FCMDE1N0UgTm8gaXRlbXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGhhdmUgYmVlbiBwdWJsaXNoZWQgb3IgZGlzY292ZXJlZCB5ZXQuCi1NU0dfSU5GT19OT19CVVNJTkVTU0VTX09SX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORD1JV0FCMDE2MkkgTm8gQnVzaW5lc3NlcywgU2VydmljZXMgb3IgU2VydmljZSBJbnRlcmZhY2VzIGZvdW5kLgotCi0jIFJlc3VsdHMKLUFMVF9RVUVSWV9SRVNVTFRTPVF1ZXJ5IFJlc3VsdHMKLUZPUk1fTEFCRUxfU1VCUVVFUlk9VGhlIHJlc3VsdHMgbWF5IGJlIHVzZWQgYXMgaW5wdXRzIG9mIGFub3RoZXIgb3BlcmF0aW9uLiBDbGljayB0aGUgPHN0cm9uZz50YXJnZXQ8L3N0cm9uZz4gbGluayBhdCB0aGUgdG9wIHRvIHNlZSB0aGUgb3BlcmF0aW9uLiBTZWxlY3RlZCByZXN1bHRzIGNhbiBiZSB1c2VkIGluIHRoZSBvcGVyYXRpb24gYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+VHJhbnNmZXI8L3N0cm9uZz4gYnV0dG9uLgotRk9STV9MQUJFTF9RVUVSWT1TZWxlY3QgYSByZXN1bHQgdG8gc2VlIG1vcmUgZGV0YWlscyBvciBzZWxlY3QgYSBzZXQgb2YgcmVzdWx0cyBhbmQgY2xpY2sgYSBidXR0b24gdG8gcGVyZm9ybSBhbiBvcGVyYXRpb24uCi1GT1JNX0xJTktfVEFSR0VUPXRhcmdldAotRk9STV9CVVRUT05fVFJBTlNGRVI9VHJhbnNmZXIKLUZPUk1fQlVUVE9OX1JFRlJFU0g9UmVmcmVzaAotRk9STV9CVVRUT05fQUREX1RPX0ZBVk9SSVRFUz1BZGQgdG8gZmF2b3JpdGVzCi1GT1JNX0JVVFRPTl9VTlBVQkxJU0g9VW5wdWJsaXNoCi1GT1JNX0JVVFRPTl9DTEVBUj1DbGVhcgotCi0jIFB1Ymxpc2ggYWN0aW9ucwotQUxUX1BVQkxJU0g9UHVibGlzaAotRk9STV9MQUJFTF9QVUJMSVNIPVB1Ymxpc2g6Ci1GT1JNX09QVElPTl9CVVNJTkVTUz1CdXNpbmVzcwotRk9STV9PUFRJT05fU0VSVklDRT1TZXJ2aWNlCi1GT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRT1TZXJ2aWNlIEludGVyZmFjZQotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX1NJTVBMRV9ERVNDPUVudGVyIGEgbmFtZSBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBidXNpbmVzcyB0byBiZSBwdWJsaXNoZWQuIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZC4KLUZPUk1fTEFCRUxfUFVCTElTSF9CVVNJTkVTU19BRFZBTkNFRF9ERVNDPVByb3ZpZGUgYSBuYW1lIGZvciB0aGUgYnVzaW5lc3MgdG8gYmUgcHVibGlzaGVkLiBPdGhlciBwYXJhbWV0ZXJzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0M9R2V0IG9yIGZpbmQgYSBidXNpbmVzcyBhbmQgdGhlbiBwcm92aWRlIHRoZSBXU0RMIFVSTCwgbmFtZSBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBzZXJ2aWNlIHRvIGJlIHB1Ymxpc2hlZC4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQz1HZXQgb3IgZmluZCBhIGJ1c2luZXNzIGFuZCB0aGVuIHByb3ZpZGUgdGhlIFdTREwgVVJMIGFuZCBhIG5hbWUgZm9yIHRoZSBzZXJ2aWNlIHRvIGJlIHB1Ymxpc2hlZC4gT3RoZXIgcGFyYW1ldGVycyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZC4KLUZPUk1fTEFCRUxfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFX1NJTVBMRV9ERVNDPVByb3ZpZGUgdGhlIFdTREwgVVJMLCBuYW1lIGFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHNlcnZpY2UgdG8gYmUgcHVibGlzaGVkLiBBdXRoZW50aWNhdGlvbiBtYXkgYmUgcmVxdWlyZWQuCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9BRFZBTkNFRF9ERVNDPVByb3ZpZGUgdGhlIFdTREwgVVJMIGFuZCBhIG5hbWUgZm9yIHRoZSBzZXJ2aWNlIHRvIGJlIHB1Ymxpc2hlZC4gT3RoZXIgcGFyYW1ldGVycyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZC4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9TSU1QTEVfREVTQz1FbnRlciBhIFdTREwgVVJMLCBuYW1lIGFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHNlcnZpY2UgaW50ZXJmYWNlIHRvIGJlIHB1Ymxpc2hlZC4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFX0FEVkFOQ0VEX0RFU0M9UHJvdmlkZSB0aGUgV1NETCBVUkwgYW5kIG5hbWUgZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSB0byBiZSBwdWJsaXNoZWQuIE90aGVyIHBhcmFtZXRlcnMgbWF5IGFsc28gYmUgc3BlY2lmaWVkLiBBdXRoZW50aWNhdGlvbiBtYXkgYmUgcmVxdWlyZWQuCi1GT1JNX0xBQkVMX1BVQkxJU0hfRk9STT1QdWJsaWNhdGlvbiBmb3JtYXQKLUZPUk1fTEFCRUxfREVTQ1JJUFRJT049RGVzY3JpcHRpb24KLUZPUk1fTEFCRUxfREVTQ1JJUFRJT05TPURlc2NyaXB0aW9ucwotTVNHX0lORk9fQlVTSU5FU1NfUFVCTElTSEVEPUlXQUIwMTU4SSBCdXNpbmVzcyAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZC4KLU1TR19JTkZPX1NFUlZJQ0VfUFVCTElTSEVEPUlXQUIwMTU5SSBTZXJ2aWNlICUxIHdhcyBzdWNjZXNzZnVsbHkgcHVibGlzaGVkLgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfUFVCTElTSEVEPUlXQUIwMTYwSSBTZXJ2aWNlIGludGVyZmFjZSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZC4KLU1TR19FUlJPUl9JTlZBTElEX05BTUU9SVdBQjAxNjFFIEVudGVyIGEgdmFsaWQgbmFtZS4KLU1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0U9SVdBQjAyNTBFIFNlbGVjdCBhIG5vbi1ibGFuayBsYW5ndWFnZSBmb3IgdGhlICUxIGluIHJvdyAlMi4gT25seSB0aGUgZmlyc3Qgcm93IGNhbiBoYXZlIGEgYmxhbmsgbGFuZ3VhZ2UuCi1NU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRT1JV0FCMDI1MUUgQ2hhbmdlIHRoZSBsYW5ndWFnZSBmb3IgdGhlICUxIGluIHJvdyAlMi4gVGhlIGN1cnJlbnQgb25lIGlzIGFscmVhZHkgaW4gdXNlLgotTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQ9SVdBQjAyNTJFIEVudGVyIGEgdmFsaWQgJTEgaW4gcm93ICUyCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTD1JV0FCMDI1M0UgRW50ZXIgYSB2YWxpZCBXU0RMIFVSTC4KLU1TR19FUlJPUl9OT19OQU1FUz1JV0FCMDI1NEUgQWRkIGF0IGxlYXN0IG9uZSBuYW1lLgotTVNHX0VSUk9SX0lOVkFMSURfU0VSVklDRT1JV0FCMDI1NUUgUHJvdmlkZSBhIHZhbGlkIHNlcnZpY2UuCi1NU0dfRVJST1JfSU5WQUxJRF9CVVNJTkVTUz1JV0FCMDI1NkUgUHJvdmlkZSBhIHZhbGlkIGJ1c2luZXNzLgotCi0jIEJ1c2luZXNzIFB1Ymxpc2ggU2VydmljZSBhY3Rpb24KLUFMVF9QVUJMSVNIX1NFUlZJQ0U9UHVibGlzaCBTZXJ2aWNlCi0KLSMgTG9naW4gYWN0aW9ucwotQUxUX0xPR0lOPUxvZ2luCi1BTFRfTE9HT1VUPUxvZ291dAotTVNHX0lORk9fTk9fTVVMVElQTEVfTE9HSU49TXVsdGlwbGUgbG9naW5zIHdpdGggc2FtZSBJRCBub3QgYWxsb3dlZAotTVNHX0lORk9fTE9HR0VEX0lOX05PREU9JTEgLSBsb2dnZWQgaW4gYXMgJTIKLQotIyBXU0RMIEJyb3dzZXIKLVRJVExFX1dTRExfQlJPV1NFUj1XU0RMIEJyb3dzZXIgLSAlMQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRT1TZWxlY3QgYSBXU0RMIHNvdXJjZToKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9V2ViIFByb2plY3RzCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFX0ZBVk9SSVRFUz1GYXZvcml0ZXMKLUZPUk1fTEFCRUxfV0VCX1BST0pFQ1Q9V2ViIFByb2plY3QKLUZPUk1fTEFCRUxfV1NETF9VUkw9V1NETCBVUkwKLUFMVF9XU0RMX0JST1dTRVI9V1NETCBCcm93c2VyCi0KLSMgRGV0YWlscwotRk9STV9MSU5LX0VESVQ9RWRpdAotRk9STV9MSU5LX0NBTkNFTD1DYW5jZWwKLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPUJ1c2luZXNzIEtleQotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1TZXJ2aWNlIEtleQotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVk9VE1vZGVsIEtleQotRk9STV9MQUJFTF9VU0VSX0RFRklORURfQ0FURUdPUklFUz1Vc2VyIERlZmluZWQgQ2F0ZWdvcmllcwotRk9STV9MQUJFTF9DSEVDS0VEPUNoZWNrZWQKLUZPUk1fTEFCRUxfRklMRT1GaWxlCi1NU0dfUVVFU1RJT05fUFVCTElTSF9JVEVNPVRoZSBpdGVtIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIERvIHlvdSB3aXNoIHRvIHB1Ymxpc2ggaXQ/Ci1NU0dfUVVFU1RJT05fU0VSVklDRV9QVUJMSVNIX0JVU0lORVNTPVRoZSBzZXJ2aWNlIGFuZCBpdHMgYnVzaW5lc3MgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4gUHJvY2VlZCB0byBwdWJsaXNoPwotTVNHX0lORk9fQlVTSU5FU1NfVVBEQVRFRD1JV0FCMDI1N0kgQnVzaW5lc3MgJTEgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLgotTVNHX0lORk9fU0VSVklDRV9VUERBVEVEPUlXQUIwMjU4SSBTZXJ2aWNlICUxIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VQREFURUQ9SVdBQjAyNTlJIFNlcnZpY2UgSW50ZXJmYWNlICUxIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC4KLU1TR19JTkZPX1JFR0lTVFJZX1VQREFURUQ9SVdBQjAzMjNJIFJlZ2lzdHJ5ICUxIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC4KLQotIyBVbnB1Ymxpc2hBY3Rpb24KLUFMVF9VTlBVQkxJU0hfQlVTSU5FU1M9VW5wdWJsaXNoIEJ1c2luZXNzCi1BTFRfVU5QVUJMSVNIX1NFUlZJQ0U9VW5wdWJsaXNoIFNlcnZpY2UKLUFMVF9VTlBVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0U9VW5wdWJsaXNoIFNlcnZpY2UgSW50ZXJmYWNlCi1GT1JNX0xBQkVMX1VOUFVCTElTSF9ERVNDPVByZXNzIDxzdHJvbmc+R288L3N0cm9uZz4gdG8gdW5wdWJsaXNoIHRoaXMgb2JqZWN0LiBBdXRoZW50aWNhdGlvbiBtYXkgYmUgcmVxdWlyZWQuCi1NU0dfSU5GT19CVVNJTkVTU19VTlBVQkxJU0hFRD1JV0FCMDI2MEkgQnVzaW5lc3MgJTEgd2FzIHN1Y2Nlc3NmdWxseSB1bnB1Ymxpc2hlZC4KLU1TR19JTkZPX1NFUlZJQ0VfVU5QVUJMSVNIRUQ9SVdBQjAyNjFJIFNlcnZpY2UgJTEgd2FzIHN1Y2Nlc3NmdWxseSB1bnB1Ymxpc2hlZC4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VOUFVCTElTSEVEPUlXQUIwMjYySSBTZXJ2aWNlIEludGVyZmFjZSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHVucHVibGlzaGVkLgotCi0jIEFkZCB0byBXU0RMIFBlcnNwZWN0aXZlCi1BTFRfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkU9QWRkIFRvIFdTREwgUGFnZQotTVNHX0lORk9fV1NETF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzc2SSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIFdTREwgcGFnZS4KLU1TR19FUlJPUl9XU0RMX05PVF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzc3RSAlMSBjb3VsZCBub3QgYmUgYWRkZWQgdG8gV1NETCBwYWdlLgotCi0jIEFkZCB0byBGYXZvcml0ZXMKLUFMVF9BRERfVE9fRkFWT1JJVEVTPUFkZCBUbyBGYXZvcml0ZXMKLU1TR19JTkZPX0ZBVk9SSVRFX0FEREVEPUlXQUIwMjYzSSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIGZhdm9yaXRlcy4KLU1TR19FUlJPUl9GQVZPUklURV9OT1RfQURERUQ9SVdBQjAyNjRFICUxIGNvdWxkIG5vdCBiZSBhZGRlZCB0byBmYXZvcml0ZXMuCi1NU0dfRVJST1JfRkFWT1JJVEVfQUxSRUFEWV9FWElTVFM9SVdBQjAzMjRFICUxIGFscmVhZHkgZXhpc3RzIGluIGZhdm9ydGllcy4KLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPUZhdm9yaXRlIGFscmVhZHkgZXhpc3RzLiAgRG8geW91IHdpc2ggdG8gb3ZlcndyaXRlPwotCi0jIFJlZnJlc2gKLU1TR19JTkZPX05PREVfUkVGUkVTSEVEPUlXQUIwMjY1SSAlMSByZWZyZXNoZWQuCi1NU0dfUVVFU1RJT05fUkVNT1ZFX05PREU9JTEgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4gRG8geW91IHdpc2ggdG8gY2xlYXIgaXQ/Ci0KLSMgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzCi1BTFRfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVM9TWFuYWdlIFJlZmVyZW5jZWQgU2VydmljZXMKLUZPUk1fTEFCRUxfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfREVTQz1BZGQgZGlzY292ZXJlZCBvciBwdWJsaXNoZWQgc2VydmljZXMgdG8gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlZCBzZXJ2aWNlcyBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQgU2VydmljZXM8L3N0cm9uZz4gYnV0dG9uLiBSZW1vdmUgc2VsZWN0ZWQgcmVmZXJlbmNlcyBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5SZW1vdmUgUmVmZXJlbmNlczwvc3Ryb25nPiBidXR0b24uIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZCBmb3IgY2hhbmdlcy4KLUZPUk1fTEFCRUxfUkVGRVJFTkNFRF9TRVJWSUNFUz1SZWZlcmVuY2VkIFNlcnZpY2VzCi1GT1JNX0JVVFRPTl9BRERfU0VSVklDRVM9QWRkIFNlcnZpY2VzCi1GT1JNX0JVVFRPTl9SRU1PVkVfUkVGRVJFTkNFUz1SZW1vdmUgUmVmZXJlbmNlcwotTVNHX0VSUk9SX05PX1JFRkVSRU5DRV9TRUxFQ1RFRD1JV0FCMDI2NkUgU2VsZWN0IGF0IGxlYXN0IG9uZSByZWZlcmVuY2VkIHNlcnZpY2UgYmVmb3JlIHByb2NlZWRpbmcuCi1NU0dfRVJST1JfTk9fU0VSVklDRVM9SVdBQjAyNjdFIEdldCBvciBmaW5kIGF0IGxlYXN0IG9uZSBzZXJ2aWNlIGJlZm9yZSBwcm9jZWVkaW5nLgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX1JFRkVSRU5DRUQ9SVdBQjAyNjhFIFNlcnZpY2UgJTEgY291bGQgbm90IGJlIHJlZmVyZW5jZWQuCi1NU0dfRVJST1JfUkVGRVJFTkNFX05PVF9SRU1PVkVEPUlXQUIwMjY5RSBTZXJ2aWNlIHJlZmVyZW5jZSAlMSBjb3VsZCBub3QgYmUgcmVtb3ZlZC4KLU1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFRD1JV0FCMDI3MEkgU2VydmljZSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHJlZmVyZW5jZWQuCi1NU0dfSU5GT19TRVJWSUNFX1JFRkVSRU5DRV9SRU1PVkVEPUlXQUIwMjcxSSBTZXJ2aWNlIHJlZmVyZW5jZSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuCi0KLSMgTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9ucwotQUxUX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1NYW5hZ2UgUHVibGlzaGVyIEFzc2VydGlvbnMKLUZPUk1fTEFCRUxfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TX0RFU0M9QWRkIGRpc2NvdmVyZWQgb3IgcHVibGlzaGVkIGJ1c2luZXNzZXMgdG8gdGhlIGxpc3Qgb2YgcHVibGlzaGVyIGFzc2VydGlvbnMgYnkgY2xpY2tpbmcgPHN0cm9uZz5BZGQgQXNzZXJ0aW9uczwvc3Ryb25nPi4gUmVtb3ZlIHNlbGVjdGVkIGFzc2VydGlvbnMgYnkgY2xpY2tpbmcgPHN0cm9uZz5SZW1vdmUgQXNzZXJ0aW9uczwvc3Ryb25nPi4gQ29tcGxldGUgc2VsZWN0ZWQgYXNzZXJ0aW9ucyBieSBjbGlja2luZyA8c3Ryb25nPkNvbXBsZXRlIEFzc2VydGlvbnM8L3N0cm9uZz4uIENsaWNrIDxzdHJvbmc+UmVmcmVzaCBBc3NlcnRpb25zPC9zdHJvbmc+IHRvIHJlZnJlc2ggdGhlIGxpc3Qgb2YgYXNzZXJ0aW9ucy4KLUZPUk1fTEFCRUxfSU5DT01QTEVURV9BU1NFUlRJT05TX1ZJU0lCSUxJVFlfREVTQz1QbGVhc2Ugbm90ZSB0aGF0IGluY29tcGxldGUgcHVibGlzaGVyIGFzc2VydGlvbnMgYXJlIHZpc2libGUgb25seSB0byB0aGUgb3duZXIgb2YgdGhlIGJ1c2luZXNzLgotRk9STV9MQUJFTF9CVVNJTkVTU0VTPUJ1c2luZXNzZXMKLUZPUk1fQlVUVE9OX1NIT1dfQUxMX1BVQkxJU0hFUl9BU1NFUlRJT05TPVJlZnJlc2ggQXNzZXJ0aW9ucwotRk9STV9CVVRUT05fQ09NUExFVEVfUFVCTElTSEVSX0FTU0VSVElPTlM9Q29tcGxldGUgQXNzZXJ0aW9ucwotRk9STV9CVVRUT05fQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TPUFkZCBBc3NlcnRpb25zCi1GT1JNX0JVVFRPTl9SRU1PVkVfUFVCTElTSEVSX0FTU0VSVElPTlM9UmVtb3ZlIEFzc2VydGlvbnMKLU1TR19JTkZPX1BVQkxJU0hFUl9BU1NFUlRJT05TX1JFRlJFU0hFRD1JV0FCMDMyNUkgUHVibGlzaGVyIEFzc2VydGlvbnMgYXJlIHJlZnJlc2hlZC4KLU1TR19FUlJPUl9OT19JTkNPTVBMRVRFX0FTU0VSVElPTl9TRUxFQ1RFRD1JV0FCMDMyNkUgU2VsZWN0IGF0IGxlYXN0IG9uZSBpbmNvbXBsZXRlIHB1Ymxpc2hlciBhc3NlcnRpb24uCi1NU0dfRVJST1JfTk9UX09XTkVEX0JVU0lORVNTPUlXQUIwMzI3RSBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIG9uIGEgYnVzaW5lc3Mgb3duZWQgYnkgYW5vdGhlciBwYXJ0eS4KLQotIyBHZXRCdXNpbmVzc2VzCi1BTFRfR0VUX0JVU0lORVNTPUdldCBCdXNpbmVzcwotQUxUX0dFVF9CVVNJTkVTU0VTPUdldCBCdXNpbmVzc2VzCi1OT0RFX05BTUVfU0VSVklDRV9CVVNJTkVTUz1CdXNpbmVzcyBmb3Igc2VydmljZSAlMQotTk9ERV9OQU1FX1NJX0JVU0lORVNTRVM9QnVzaW5lc3NlcyBmb3Igc2VydmljZSBpbnRlcmZhY2UgJTEKLU1TR19RVUVTVElPTl9SRU1PVkVfU0VSVklDRV9OT0RFPVRoZSBzZXJ2aWNlIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIERvIHlvdSB3aXNoIHRvIHJlbW92ZSB0aGlzIG5vZGU/Ci0KLSMgR2V0U2VydmljZUludGVyZmFjZXMKLUFMVF9HRVRfU0VSVklDRV9JTlRFUkZBQ0VTPUdldCBTZXJ2aWNlIEludGVyZmFjZXMKLU5PREVfTkFNRV9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUz1TZXJ2aWNlIGludGVyZmFjZXMgZm9yIHNlcnZpY2UgJTEKLU1TR19RVUVTVElPTl9HRVRfU0lfUkVNT1ZFX1NFUlZJQ0VfTk9ERT1UaGUgc2VydmljZSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBEbyB5b3Ugd2lzaCB0byByZW1vdmUgdGhpcyBub2RlPwotCi0jIEdldFNlcnZpY2VzCi1BTFRfR0VUX1NFUlZJQ0VTPUdldCBTZXJ2aWNlcwotTk9ERV9OQU1FX1NJX1NFUlZJQ0VTPVNlcnZpY2VzIGZvciBzZXJ2aWNlIGludGVyZmFjZSAlMQotTk9ERV9OQU1FX0JVU0lORVNTX1NFUlZJQ0VTPVNlcnZpY2VzIGZvciBidXNpbmVzcyAlMQotTVNHX1FVRVNUSU9OX1JFTU9WRV9TSV9OT0RFPVRoZSBzZXJ2aWNlIGludGVyZmFjZSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBEbyB5b3Ugd2lzaCB0byByZW1vdmUgdGhpcyBub2RlPwotTVNHX1FVRVNUSU9OX1JFTU9WRV9CVVNJTkVTU19OT0RFPVRoZSBidXNpbmVzcyBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBEbyB5b3Ugd2lzaCB0byByZW1vdmUgdGhpcyBub2RlPwotCi0jIFJlZnJlc2hVRERJTm9kZXNBY3Rpb24KLU1TR19FUlJPUl9OT0RFX0RBVEFfVkFMSURBVElPTl9GQUlMRUQ9SVdBQjAyNzJFICUxIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuCi0KLSMgU3VtbWFyaWVzCi1BTFRfU1VNTUFSWV9RVUVSSUVTPVN1bW1hcnkgb2YgUXVlcmllcwotQUxUX1NVTU1BUllfQlVTSU5FU1NFUz1TdW1tYXJ5IG9mIEJ1c2luZXNzZXMKLUFMVF9TVU1NQVJZX1NFUlZJQ0VTPVN1bW1hcnkgb2YgU2VydmljZXMKLUFMVF9TVU1NQVJZX1NFUlZJQ0VfSU5URVJGQUNFUz1TdW1tYXJ5IG9mIFNlcnZpY2UgSW50ZXJmYWNlcwotRk9STV9MQUJFTF9RVUVSSUVTPVF1ZXJpZXMKLQotIyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24KLU1TR19RVUVTVElPTl9JVEVNX1ZBTElEQVRJT05fRkFJTEVEPSUxIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIERvIHlvdSB3aXNoIHRvIHJlbW92ZSBpdD8KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9TmF2aWdhdG9yIENvbnRhaW5lcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9TmF2aWdhdG9yIFRvb2xiYXIKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPU5hdmlnYXRvciBDb250ZW50Ci1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1BY3Rpb25zIENvbnRhaW5lcgotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9UHJvcGVydGllcyBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1Qcm9wZXJ0aWVzIFRvb2xiYXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1Qcm9wZXJ0aWVzIENvbnRlbnQKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9U3RhdHVzIENvbnRhaW5lcgotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9U3RhdHVzIFRvb2xiYXIKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVN0YXR1cyBDb250ZW50Ci1GUkFNRV9USVRMRV9VRERJX1BFUlNQRUNUSVZFX0NPTlRFTlQ9VURESSBQYWdlIENvbnRlbnQKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfV09SS0FSRUE9Q2F0ZWdvcmllcyBXb3JrIEFyZWEKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfVE9PTEJBUj1DYXRlZ29yaWVzIFRvb2xiYXIKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfQ09OVEVOVD1DYXRlZ29yaWVzIENvbnRlbnQKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1XU0RMIEJyb3dzZXIgVG9vbGJhcgotRlJBTUVfVElUTEVfV1NETF9DT05URU5UPVdTREwgQnJvd3NlciBDb250ZW50Ci0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfQlVTSU5FU1NfREVUQUlMUz1CdXNpbmVzcyBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFPUJ1c2luZXNzIFB1Ymxpc2ggU2VydmljZSBGb3JtCi1GT1JNX1RJVExFX0dFVF9GT1JNPVNlbGVjdCBmcm9tIERpc2NvdmVyZWQgYW5kIFB1Ymxpc2hlZCBPYmplY3RzIEZvcm0KLUZPUk1fVElUTEVfSVRFTVNfU1VNTUFSWT1TdW1tYXJ5IG9mIEl0ZW1zIEZvcm0KLUZPUk1fVElUTEVfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPU1hbmFnZSBQdWJsaXNoZXIgQXNzZXJ0aW9ucyBGb3JtCi1GT1JNX1RJVExFX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTPU1hbmFnZSBSZWZlcmVuY2VkIFNlcnZpY2VzIEZvcm0KLUZPUk1fVElUTEVfT1BFTl9SRUdJU1RSWT1PcGVuIFJlZ2lzdHJ5IEZvcm0KLUZPUk1fVElUTEVfUkVHSVNUUllfREVUQUlMUz1SZWdpc3RyeSBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfUkVHSVNUUllfUFVCTElTSD1SZWdpc3RyeSBQdWJsaXNoIEZvcm0KLUZPUk1fVElUTEVfUkVHSVNUUllfRklORD1SZWdpc3RyeSBGaW5kIEZvcm0KLUZPUk1fVElUTEVfUkVTVUxUUz1SZXN1bHRzIEZvcm0KLUZPUk1fVElUTEVfU0VSVklDRV9ERVRBSUxTPVNlcnZpY2UgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9U2VydmljZSBJbnRlcmZhY2UgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1VOUFVCTElTSD1VbnB1Ymxpc2ggRm9ybQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1wcm9wZXJ0aWVzL3dzZGwucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItcHJvcGVydGllcy93c2RsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZGU3ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1wcm9wZXJ0aWVzL3dzZGwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0RMCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9XU0RMX01BSU49V1NETCBNYWluCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPU5hdmlnYXRvciBDb250YWluZXIKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPU5hdmlnYXRvciBUb29sYmFyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1OYXZpZ2F0b3IgQ29udGVudAotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9QWN0aW9ucyBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPVByb3BlcnRpZXMgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9UHJvcGVydGllcyBUb29sYmFyCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9UHJvcGVydGllcyBDb250ZW50Ci1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPVN0YXR1cyBDb250YWluZXIKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVN0YXR1cyBUb29sYmFyCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1TdGF0dXMgQ29udGVudAotRlJBTUVfVElUTEVfV1NETF9QRVJTUEVDVElWRV9DT05URU5UPVdTREwgUGFnZSBDb250ZW50Ci1GUkFNRV9USVRMRV9YU0RfSU5GT1JNQVRJT05fVE9PTEJBUj1YU0QgSW5mb3JtYXRpb24gRGlhbG9nIFRvb2xiYXIKLUZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9DT05URU5UPVhTRCBJbmZvcm1hdGlvbiBEaWFsb2cgQ29udGVudAotCi0jIE9wZW5XU0RMQWN0aW9uCi1BTFRfT1BFTl9XU0RMPU9wZW4gV1NETAotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkw9SVdBQjAzNzhFIEVudGVyIGEgdmFsaWQgV1NETCBVUkwuCi1NU0dfRVJST1JfT1BFTl9XU0RMPUlXQUIwMzc5RSBVbmFibGUgdG8gb3BlbiAlMS4KLU1TR19FUlJPUl9YU0RfVkFMSURBVElPTj1JV0FCMDM4MEUgRXJyb3JzIHdlcmUgZW5jb3VudGVyZWQgd2hpbGUgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4KLU1TR19JTkZPX09QRU5fV1NETF9TVUNDRVNTRlVMPUlXQUIwMzgxSSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZC4KLQotIyBXU0RMIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfREVUQUlMUz1XU0RMIERldGFpbHMKLUZPUk1fTEFCRUxfV1NETF9ERVRBSUxTX0RFU0M9U2hvd24gYmVsb3cgYXJlIHRoZSBkZXRhaWxzIGZvciB0aGlzIFdTREwgZG9jdW1lbnQuIENsaWNrIG9uIGEgc2VydmljZSBvciBiaW5kaW5nIHRvIHNlZSBpdHMgZGV0YWlscy4KLQotIyBXU0RMIFNlcnZpY2UgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9TRVJWSUNFX0RFVEFJTFM9V1NETCBTZXJ2aWNlIERldGFpbHMKLUZPUk1fTEFCRUxfU0VSVklDRV9ERVRBSUxTX0RFU0M9U2hvd24gYmVsb3cgYXJlIHRoZSBkZXRhaWxzIGZvciB0aGlzICZsdDtzZXJ2aWNlJmd0OyBlbGVtZW50LiBDbGljayBvbiBhIGJpbmRpbmcgdG8gc2VlIGl0cyBvcGVyYXRpb25zLgotCi1BTFRfTklMPW5pbD8KLQotIyBXU0RMIEJpbmRpbmcgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9CSU5ESU5HX0RFVEFJTFM9V1NETCBCaW5kaW5nIERldGFpbHMKLUZPUk1fTEFCRUxfQklORElOR19ERVRBSUxTX0RFU0M9U2hvd24gYmVsb3cgYXJlIHRoZSBkZXRhaWxzIGZvciB0aGlzIDxzdHJvbmc+JTE8L3N0cm9uZz4gICZsdDtiaW5kaW5nJmd0OyBlbGVtZW50LiBDbGljayBvbiBhbiBvcGVyYXRpb24gdG8gZmlsbCBpbiBpdHMgcGFyYW1ldGVycyBhbmQgaW52b2tlIGl0IG9yIHNwZWNpZnkgYWRkaXRpb25hbCBlbmRwb2ludHMuCi0KLSMgSW52b2tlV1NETE9wZXJhdGlvbkFjdGlvbgotQUxUX0lOVk9LRV9XU0RMX09QRVJBVElPTj1JbnZva2UgYSBXU0RMIE9wZXJhdGlvbgotTVNHX0VSUk9SX1VOQUJMRV9UT19DT05ORUNUPUlXQUIwMzgyRSBVbmFibGUgdG8gY29ubmVjdCB0byAlMQotTVNHX0VSUk9SX1ZBTElEQVRJTkdfUEFSQU1FVEVSPUlXQUIwMzgzRSBFcnJvciB2YWxpZGF0aW5nICUxCi0KLSMgV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fRkFWT1JJVEVTPUFkZCBXU0RMIFRvIEZhdm9yaXRlcwotTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUz1JV0FCMDM4NEUgJTEgYWxyZWFkeSBleGlzdHMgaW4gZmF2b3JpdGVzLgotTVNHX0VSUk9SX0FERF9UT19GQVZPUklURVM9SVdBQjAzODVFIFVuYWJsZSB0byBhZGQgJTEgdG8gZmF2b3JpdGVzLgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzg2SSAlMSBpcyBhZGRlZCB0byBmYXZvcml0ZXMuCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1GYXZvcml0ZSBhbHJlYWR5IGV4aXN0cy4gIERvIHlvdSB3aXNoIHRvIG92ZXJ3cml0ZT8KLQotIyBSZWZyZXNoV1NETEFjdGlvbgotTVNHX0lORk9fUkVGUkVTSF9XU0RMX1NVQ0NFU1NGVUw9SVdBQjAzODdJICUxIGlzIHJlZnJlc2hlZC4KLU1TR19RVUVTVElPTl9SRU1PVkVfV1NETF9OT0RFPSUxIGlzIG5vIGxvbmdlciByZXNvbHZhYmxlLiAgRG8geW91IHdpc2ggdG8gY2xlYXIgaXQ/Ci0KLSMgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24KLU1TR19JTkZPX1VQREFURV9XU0RMX0JJTkRJTkdfU1VDQ0VTU0ZVTD1JV0FCMDM4OEkgRW5kcG9pbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfT1BFTl9XU0RMPU9wZW4gV1NETCBGb3JtCi1GT1JNX1RJVExFX1dTRExfREVUQUlMUz1XU0RMIERldGFpbHMgRm9ybQotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFNlcnZpY2UgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1dTRExfQklORElOR19ERVRBSUxTPVdTREwgQmluZGluZyBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfSU5WT0tFX1dTRExfT1BFUkFUSU9OPVdTREwgT3BlcmF0aW9uIEZvcm0KLQotIyBGb3JtIExhYmVscwotRk9STV9MQUJFTF9PUEVOX1dTRExfREVTQz1FbnRlciB0aGUgVVJMIG9mIGEgV1NETCBkb2N1bWVudCBhbmQgY2xpY2sgPHN0cm9uZz5Hbzwvc3Ryb25nPiB0byBleHBsb3JlLgotRk9STV9MQUJFTF9TRVJWSUNFUz1TZXJ2aWNlcwotRk9STV9MQUJFTF9CSU5ESU5HUz1CaW5kaW5ncwotRk9STV9MQUJFTF9PUEVSQVRJT05TPU9wZXJhdGlvbnMKLUZPUk1fTEFCRUxfQklORElOR19UWVBFPVR5cGUKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX1VOU1VQUE9SVEVEPVVuc3VwcG9ydGVkCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9TT0FQPVNPQVAKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX0hUVFBfR0VUPUhUVFAgR0VUCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX1BPU1Q9SFRUUCBQT1NUCi1GT1JNX0xBQkVMX05BTUU9TmFtZQotRk9STV9MQUJFTF9ET0NVTUVOVEFUSU9OPURvY3VtZW50YXRpb24KLUZPUk1fTEFCRUxfRU5EUE9JTlQ9RW5kcG9pbnQKLUZPUk1fTEFCRUxfSU5WT0tFX1dTRExfT1BFUkFUSU9OX0RFU0M9RW50ZXIgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBXU0RMIG9wZXJhdGlvbiBhbmQgY2xpY2sgPHN0cm9uZz5HbzwvU3Ryb25nPiB0byBpbnZva2UuCi1GT1JNX0xBQkVMX0lOVk9LRV9XU0RMX09QRVJBVElPTl9ERVNDX05PX0lOUFVUPVRoZXJlIGFyZSBubyBpbnB1dCBwYXJhbWV0ZXJzIGZvciB0aGUgV1NETCBvcGVyYXRpb24gIiUxIi4gQ2xpY2sgPHN0cm9uZz5HbzwvU3Ryb25nPiB0byBpbnZva2UuCi1GT1JNX0xJTktfQUREPUFkZAotRk9STV9MSU5LX1JFTU9WRT1SZW1vdmUKLUZPUk1fTEFCRUxfVkFMVUVTPVZhbHVlcwotRk9STV9MQUJFTF9FTkFCTEVfRElTQUJMRV9HUk9VUD1FbmFibGUvRGlzYWJsZSBncm91cAotRk9STV9MQUJFTF9VTklPTl9UWVBFPVVuaW9uIHR5cGVzCi1GT1JNX0xBQkVMX0xBTkdVQUdFPUxhbmd1YWdlCi1GT1JNX0xBQkVMX1hTRF9BUFBMSUNBVElPTl9JTkZPUk1BVElPTj1BcHBsaWNhdGlvbiBJbmZvcm1hdGlvbgotRk9STV9MQUJFTF9YU0RfRE9DVU1FTlRBVElPTj1Eb2N1bWVudGF0aW9uCi1GT1JNX0xBQkVMX1NPQVBfUkVRVUVTVF9FTlZFTE9QRT1TT0FQIFJlcXVlc3QgRW52ZWxvcGU6Ci1GT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRU5WRUxPUEU9U09BUCBSZXNwb25zZSBFbnZlbG9wZToKLUZPUk1fTEFCRUxfR1JPVVBfQUxMX09SREVSSU5HX01PVkVfVVA9TW92ZSBlbGVtZW50IHVwCi1GT1JNX0xBQkVMX0dST1VQX0FMTF9PUkRFUklOR19NT1ZFX0RPV049TW92ZSBlbGVtZW50IGRvd24KLUZPUk1fTEFCRUxfQkFTRV9UWVBFPUJhc2UgdHlwZQotRk9STV9MQUJFTF9VTkJPVU5ERUQ9VW5ib3VuZGVkCi1GT1JNX0xBQkVMX0xFTkdUSD1MZW5ndGgKLUZPUk1fTEFCRUxfTEVOR1RIX1ZBTFVFPVslMS4uJTJdCi1GT1JNX0xBQkVMX1BBVFRFUk49UGF0dGVybgotRk9STV9MQUJFTF9XSElURVNQQUNFPVdoaXRlc3BhY2UKLUZPUk1fTEFCRUxfUkFOR0VfT0ZfVkFMVUVTPVJhbmdlIG9mIHZhbHVlcwotRk9STV9MQUJFTF9NSU5fRVhDTFVTSVZFPSglMS4uCi1GT1JNX0xBQkVMX01JTl9JTkNMVVNJVkU9WyUxLi4KLUZPUk1fTEFCRUxfTUFYX0VYQ0xVU0lWRT0lMSkKLUZPUk1fTEFCRUxfTUFYX0lOQ0xVU0lWRT0lMV0KLUZPUk1fTEFCRUxfVE9UQUxfRElHSVRTPVRvdGFsIGRpZ2l0cwotRk9STV9MQUJFTF9GUkFDVElPTl9ESUdJVFM9RnJhY3Rpb24gZGlnaXRzCi1GT1JNX0xBQkVMX09DQ1VSQU5DRT1PY2N1cmFuY2Ugb2YKLUZPUk1fTEFCRUxfVU5JT05fTUVNQkVSUz1VbmlvbiBNZW1iZXJzCi1GT1JNX0xBQkVMX0xJU1RfSVRFTVM9TGlzdCBpdGVtcwotRk9STV9MQUJFTF9FTEVNRU5UUz1FbGVtZW50cwotRk9STV9MQUJFTF9TT0FQX0VOQ19BUlJBWVM9U09BUCBBcnJheXMKLUZPUk1fTEFCRUxfQ09OVEVOVD1Db250ZW50Ci1GT1JNX0xBQkVMX0FUT01JQ19OQU1FX1RZUEU9JTEgKCUyKToKLUZPUk1fTEFCRUxfTlVMTD1udWxsCi1GT1JNX0xBQkVMX0dST1VQX05VTUJFUj1Hcm91cCAlMQotRk9STV9MQUJFTF9DSE9JQ0VTPUNob2ljZXMKLUZPUk1fTEFCRUxfTk9USElOR19UT19ESVNQTEFZX0lOX0ZPUk1fVklFVz1UaGVyZSBpcyBub3RoaW5nIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZm9ybSB2aWV3LiAgUGxlYXNlIHN3aXRjaCB0byB0aGUgc291cmNlIHZpZXcgZm9yIHRoZSBTT0FQIHJlcXVlc3QgYW5kIHJlc3BvbnNlLgotRk9STV9MQUJFTF9TT0FQX1JFU1BPTlNFX0ZBSUxFRF9WQUxJREFUSU9OX0lOX0ZPUk1fVklFVz1UaGUgU09BUCByZXNwb25zZSBmYWlsZWQgc2NoZW1hIHZhbGlkYXRpb24uICBQbGVhc2Ugc3dpdGNoIHRvIHRoZSBzb3VyY2UgdmlldyBmb3IgdGhlIFNPQVAgcmVzcG9uc2UgaW4gWE1MIGZvcm1hdC4KLUZPUk1fTEFCRUxfRU5EX1BPSU5UUz1FbmRwb2ludHMKLQotIyBTb3VyY2UvRm9ybSB2aWV3cwotRk9STV9MSU5LX0ZPUk09Rm9ybQotQUxUX1NXSVRDSF9UT19GT1JNX1ZJRVc9U3dpdGNoIHRvIGZvcm0gdmlldwotRk9STV9MSU5LX1NPVVJDRT1Tb3VyY2UKLUFMVF9TV0lUQ0hfVE9fU09VUkNFX1ZJRVc9U3dpdGNoIHRvIHNvdXJjZSB2aWV3Ci1GT1JNX0xBQkVMX0ZSQUdNRU5UX1NPQVBfVklFV19DT05URU5UPVNvYXAgQm9keToKLUJVVFRPTl9MQUJFTF9MT0FEPUxvYWQKLUJVVFRPTl9MQUJFTF9TQVZFX0FTPVNhdmUgQXMuLi4KLU1TR19RVUVTVElPTl9TWU5DX1ZJRVdTPUZvcm1hdCBvZiB0aGUgc291cmNlIGNvbnRlbnQgbWF5IGJlIGFsdGVyZWQgYXMgYSByZXN1bHQgb2Ygc3dpdGNoaW5nIHRvIHRoZSBmb3JtIHZpZXcuICBEbyB5b3Ugd2lzaCB0byBwcm9jZXNzPwotTVNHX1FVRVNUSU9OX1NZTkNfVklFV1NfREVTUElURV9JTlZBTElEX1NPVVJDRV9DT05URU5UPUNvbnRlbnQgb2YgdGhlIHNvdXJjZSB2aWV3IGZhaWxlZCBzY2hlbWEgdmFsaWRhdGlvbi4gIFN5bmNocm9uaXplIGFueXdheXM/ICAoQ29udGVudCBvZiB0aGUgc291cmNlIHZpZXcgbWF5IGJlIG1vZGlmaWVkKQotCi0jIEZvcm0gY29udHJvbCB0aXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9FTkFCTEVfRElTQUJMRV9HUk9VUD1FbmFibGUvRGlzYWJsZSBncm91cAotRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9FTEVNRU5UX0lOX0dST1VQPVNlbGVjdCBlbGVtZW50IGluIGdyb3VwCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1VOSU9OX1RZUEU9U2VsZWN0IHVuaW9uIHR5cGUKLUZPUk1fQ09OVFJPTF9USVRMRV9TT0FQX0ZJTEU9U09BUCBkYXRhIGZpbGUKLQotIyBYU0QgSW5mb3JtYXRpb24gRGlhbG9nCi1USVRMRV9YU0RfSU5GT1JNQVRJT05fRElBTE9HPVhTRCBJbmZvcm1hdGlvbiBEaWFsb2cKLQotIyBFcnJvciBtZXNzYWdlcwotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzODlFIFNlbGVjdCBhdCBsZWFzdCBvbmUgaXRlbS4KLU1TR19FUlJPUl9NQVhfT0NDVVJTX1ZJT0xBVElPTj1JV0FCMDM5MEUgTWF4aW11bSBvY2N1cmFuY2UgaXMgcmVhY2hlZC4KLU1TR19FUlJPUl9NSU5fT0NDVVJTX1ZJT0xBVElPTj1JV0FCMDM5MUUgTWluaW11bSBvY2N1cmFuY2UgaXMgcmVhY2hlZC4KLU1TR19FUlJPUl9DQU5OT1RfTU9WRV9GSVJTVF9FTEVNRU5UX1VQPUlXQUIwMzkyRSBTZWxlY3RlZCBlbGVtZW50IGlzIGFscmVhZHkgdGhlIGZpcnN0IGluIHRoZSBncm91cC4KLU1TR19FUlJPUl9DQU5OT1RfTU9WRV9MQVNUX0VMRU1FTlRfRE9XTj1JV0FCMDM5M0UgU2VsZWN0ZWQgZWxlbWVudCBpcyBhbHJlYWR5IHRoZSBsYXN0IGluIHRoZSBncm91cC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItcHJvcGVydGllcy93c2lsLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXByb3BlcnRpZXMvd3NpbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRjNWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItcHJvcGVydGllcy93c2lsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9V1NJTAotCi0jIE5hdmlnYXRvcgotV1NJTF9NQUlOX05PREU9V1NJTCBNYWluCi0KLSMgRm9ybXMKLUZPUk1fTEFCRUxfVVJMPVVSTAotRk9STV9MQUJFTF9JVEVNX05VTUJFUj1JdGVtICMKLUZPUk1fTEFCRUxfVURESV9CVVNJTkVTU19OQU1FPVVEREkgQnVzaW5lc3MgTmFtZQotRk9STV9MQUJFTF9VRERJX1NFUlZJQ0VfTkFNRT1VRERJIFNlcnZpY2UgTmFtZQotRk9STV9MQUJFTF9MQU5HVUFHRT1MYW5ndWFnZQotRk9STV9MQUJFTF9BQlNUUkFDVD1BYnN0cmFjdAotRk9STV9MQUJFTF9OQU1FPU5hbWUKLUZPUk1fTEFCRUxfV1NETF9CSU5ESU5HUz1XU0RMIEJpbmRpbmdzCi1GT1JNX0xBQkVMX05BTUVTUEFDRV9VUkk9TmFtZXNwYWNlIFVSSQotRk9STV9MQUJFTF9MT0NBTF9OQU1FPUxvY2FsIE5hbWUKLUZPUk1fTEFCRUxfSU5RVUlSWV9BUEk9SW5xdWlyeSBBUEkKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9U2VydmljZSBLZXkKLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPUJ1c2luZXNzIEtleQotRk9STV9MQUJFTF9ESVNDT1ZFUllfVVJMPURpc2NvdmVyeSBVUkwKLUZPUk1fTEFCRUxfV1NJTD1XU0lMIERldGFpbHMKLUZPUk1fTEFCRUxfV1NJTF9MSU5LUz1XU0lMIExpbmtzCi1GT1JNX0xBQkVMX1dTRExfU0VSVklDRT1XU0RMIFNlcnZpY2VzCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRT1VRERJIFNlcnZpY2VzCi1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1M9VURESSBCdXNpbmVzc2VzCi1GT1JNX0xBQkVMX0FERF9UT19OQVZJR0FUT1I9QWRkIFRvIE5hdmlnYXRvcgotRk9STV9MQUJFTF9BRERfVE9fRkFWT1JJVEVTPUFkZCBUbyBGYXZvcml0ZXMKLUZPUk1fTEFCRUxfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9QWRkIFRvIFVEREkgUGFnZQotRk9STV9MQUJFTF9BRERfVE9fV1NETF9QRVJTUEVDVElWRT1BZGQgVG8gV1NETCBQYWdlCi1GT1JNX0xBQkVMX1JFRlJFU0g9UmVmcmVzaAotRk9STV9MQUJFTF9OQT1OL0EKLUZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9TRVJWSUNFPVNlcnZpY2UgVW5hdmFpbGFibGU6Ci1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfQlVTSU5FU1M9QnVzaW5lc3MgVW5hdmFpbGFibGU6Ci1GT1JNX0xBQkVMX0NIT09TRV9XU0lMX0lOU1BFQ1RJT05fVFlQRT1DaG9vc2UgdGhlIHR5cGUgb2Ygb2JqZWN0cyB0byBpbnNwZWN0OgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMjhFIFNlbGVjdCBhdCBsZWFzdCBvbmUgaXRlbS4KLQotIyBPcGVuV1NJTEFjdGlvbgotQUxUX09QRU5fV1NJTD1PcGVuIFdTSUwKLUZPUk1fTEFCRUxfT1BFTl9XU0lMX0RFU0M9RW50ZXIgdGhlIFVSTCBvZiBhIFdTSUwgZG9jdW1lbnQgb3IgYSBIVE1MIGRvY3VtZW50IGFuZCBjbGljayA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIG9wZW4gaW5zcGVjdC4KLVdTSUxfVVJMPVVSTCB0byBkb2N1bWVudDoKLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfVVJMPUlXQUIwMzk0RSAlMSBpcyBub3QgYSB2YWxpZCBXU0lMIFVSTCBvciBIVE1MIFVSTC4KLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzI5RSAlMSBpcyBhbHJlYWR5IG9wZW5lZCBpbiB0aGUgbmF2aWdhdG9yLgotTVNHX0lORk9fT1BFTl9XU0lMX1NVQ0NFU1NGVUw9SVdBQjAzMzBJICUxIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkLgotCi0jIE9wZW5XU0lMTGlua0FjdGlvbgotQUxUX09QRU5fV1NJTF9MSU5LPU9wZW4gV1NJTCBMaW5rCi1NU0dfRVJST1JfV1NJTF9MSU5LX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzMxRSAlMSBpcyBhbHJlYWR5IG9wZW5lZCBpbiB0aGUgbmF2aWdhdG9yCi1NU0dfSU5GT19PUEVOX1dTSUxfTElOS19TVUNDRVNTRlVMPUlXQUIwMzMySSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZC4KLQotIyBXc2lsRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfREVUQUlMUz1XU0lMIERldGFpbHMKLQotIyBXc2lsU2VydmljZURldGFpbHNBY3Rpb24KLUFMVF9XU0lMX1NFUlZJQ0VfREVUQUlMUz1XU0lMIFNlcnZpY2UgRGV0YWlscwotCi0jIFVkZGlMaW5rRGV0YWlsc0FjdGlvbgotQUxUX1VERElfTElOS19ERVRBSUxTPVVEREkgQnVzaW5lc3MgRGV0YWlscwotCi0jIFdzaWxMaW5rRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfTElOS19ERVRBSUxTPVdTSUwgTGluayBEZXRhaWxzCi0KLSMgTGlzdFdTRExTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfV1NETF9TRVJWSUNFUz1MaXN0IEFsbCBXU0RMIFNlcnZpY2VzCi1GT1JNX0xBQkVMX0xJU1RfV1NETF9TRVJWSUNFU19ERVNDPVNlbGVjdCBhIHNldCBvZiBXU0RMIHNlcnZpY2VzIGFuZCBjbGljayA8c3Ryb25nPkFkZCB0byBGYXZvcml0ZXM8L3N0cm9uZz4gdG8gYWRkIHRoZXNlIHRvIHRoZSBsaXN0IG9mIGZhdm9yaXRlcy4KLQotIyBMaXN0VURESVNlcnZpY2VzQWN0aW9uCi1BTFRfTElTVF9VRERJX1NFUlZJQ0VTPUxpc3QgQWxsIFVEREkgU2VydmljZXMKLUZPUk1fTEFCRUxfTElTVF9VRERJX1NFUlZJQ0VTX0RFU0M9U2VsZWN0IGEgc2V0IG9mIFVEREkgc2VydmljZXMgYW5kIGNsaWNrIDxzdHJvbmc+QWRkIHRvIEZhdm9yaXRlczwvc3Ryb25nPiB0byBhZGQgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgZmF2b3JpdGVzLiBDbGljayA8c3Ryb25nPkFkZCB0byBVRERJIFBhZ2U8L3N0cm9uZz4gdG8gYWRkIHRoZSBzZWxlY3Rpb25zIHRvIHRoZSBVRERJIFBhZ2UuIENsaWNrIDxzdHJvbmc+UmVmcmVzaDwvc3Ryb25nPiB0byByZWZyZXNoIHRoZSBzZWxlY3Rpb25zLgotCi0jIExpc3RVRERJQnVzaW5lc3Nlc0FjdGlvbgotQUxUX0xJU1RfVURESV9MSU5LUz1MaXN0IEFsbCBVRERJIEJ1c2luZXNzZXMKLUZPUk1fTEFCRUxfTElTVF9VRERJX0JVU0lORVNTRVNfREVTQz1TZWxlY3QgYSBzZXQgb2YgVURESSBidXNpbmVzc2VzIGFuZCBjbGljayA8c3Ryb25nPkFkZCB0byBGYXZvcml0ZXM8L3N0cm9uZz4gdG8gYWRkIHRoZXNlIHRvIHRoZSBsaXN0IG9mIGZhdm9yaXRlcy4gQ2xpY2sgPHN0cm9uZz5BZGQgdG8gVURESSBQYWdlPC9zdHJvbmc+IHRvIGFkZCB0aGVzZSB0byB0aGUgVURESSBQYWdlLiBDbGljayA8c3Ryb25nPlJlZnJlc2g8L3N0cm9uZz4gdG8gcmVmcmVzaCB0aGUgc2VsZWN0aW9ucy4KLQotIyBMaXN0V1NJTExpbmtzQWN0aW9uCi1BTFRfTElTVF9XU0lMX0xJTktTPUxpc3QgQWxsIFdTSUwgTGlua3MKLUZPUk1fTEFCRUxfTElTVF9XU0lMX0xJTktTPVNlbGVjdCBhIHNldCBvZiBXU0lMIGxpbmtzIGFuZCBwcmVzcyA8c3Ryb25nPkFkZCB0byBOYXZpZ2F0b3I8L3N0cm9uZz4gdG8gb3BlbiB0aGVtIGluIHRoZSBuYXZpZ2F0b3IuCi0KLSMgQ2xlYXJXU0lMQWN0aW9uCi1BTFRfQ0xFQVJfV1NJTD1DbGVhciBXU0lMCi0KLSMgUmVmcmVzaEFjdGlvbgotQUxUX1JFRlJFU0hfV1NJTD1SZWZyZXNoIFdTSUwKLUFMVF9SRUZSRVNIX1VERElfQlVTSU5FU1M9UmVmcmVzaCBVRERJIEJ1c2luZXNzCi1BTFRfUkVGUkVTSF9VRERJX1NFUlZJQ0U9UmVmcmVzaCBVRERJIFNlcnZpY2UKLU1TR19FUlJPUl9XU0lMX05PVF9GT1VORD1JV0FCMDMzM0UgV1NJTCAlMSBjb3VsZCBub3QgYmUgbG9hZGVkLgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzNEUgQnVzaW5lc3MgJTEgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDMzNUUgU2VydmljZSAlMSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LgotTVNHX0lORk9fUkVGUkVTSF9TVUNDRVNTRlVMPUlXQUIwMzM2SSAlMSBpcyByZWZyZXNoZWQuCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSBpcyBubyBsb25nZXIgcmVzb2x2YWJsZS4gIERvIHlvdSB3aXNoIHRvIGNsZWFyIGl0PwotCi0jIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX0JVU0lORVNTX1RPX1VERElfUEVSU1BFQ1RJVkU9QWRkIEJ1c2luZXNzIFRvIFVEREkgUGFnZQotQUxUX0FERF9TRVJWSUNFX1RPX1VERElfUEVSU1BFQ1RJVkU9QWRkIFNlcnZpY2UgVG8gVURESSBQYWdlCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzM3SSAlMSBpcyBhZGRlZCB0byBVRERJIFBhZ2UuCi1NU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9SVdBQjAzMzhFIFVuYWJsZSB0byBhZGQgJTEgdG8gVURESSBQYWdlLgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzOUUgQnVzaW5lc3MgJTEgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDM0MEUgU2VydmljZSAlMSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LgotCi0jIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9QWRkIFdTREwgVG8gV1NETCBQYWdlCi1NU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzOTVJICUxIGlzIGFkZGVkIHRvIFdTREwgUGFnZS4KLU1TR19FUlJPUl9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzk2RSAlMSBjb3VsZCBub3QgYmUgbG9hZGVkLgotCi0jIEFkZFdTSUxUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0lMX1RPX0ZBVk9SSVRFUz1BZGQgV1NJTCBUbyBGYXZvcml0ZXMKLU1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTPUlXQUIwMzQxRSBVbmFibGUgdG8gYWRkICUxIHRvIGZhdm9yaXRlcy4KLU1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFM9SVdBQjAzNDJFICUxIGFscmVhZHkgZXhpc3RzIGluIGZhdm9yaXRlcy4KLU1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTD1JV0FCMDM0M0kgJTEgaXMgYWRkZWQgdG8gZmF2b3JpdGVzLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9RmF2b3JpdGUgYWxyZWFkeSBleGlzdHMuICBEbyB5b3Ugd2lzaCB0byBvdmVyd3JpdGU/Ci0KLSMgQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0RMX1NFUlZJQ0VfVE9fRkFWT1JJVEVTPUFkZCBXU0RMIFRvIEZhdm9yaXRlcwotCi0jIEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfVURESV9CVVNJTkVTU19UT19GQVZPUklURVM9QWRkIFVEREkgQnVzaW5lc3MgVG8gRmF2b3JpdGVzCi0KLSMgQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1NFUlZJQ0VfVE9fRkFWT1JJVEVTPUFkZCBVRERJIFNlcnZpY2UgVG8gRmF2b3JpdGVzCi0KLSMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaAotQVRMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSD1JbXBvcnQgV1NJTCBUbyBXb3JrYmVuY2gKLUZPUk1fTEFCRUxfSU1QT1JUX1dTSUxfVE9fV09SS0JFTkNIX0RFU0M9U2VsZWN0IGEgd29ya2JlbmNoIHByb2plY3QgdG8gc2F2ZSB0aGUgV1NJTCBmaWxlIGludG8uIFlvdSBtYXkgYWxzbyBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIFdTSUwgZmlsZS4KLQotIyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLUFMVF9XU0lMX0lNUE9SVF9UT19GUz1JbXBvcnQgV1NJTCBUbyBGaWxlIFN5c3RlbQotQUxUX1dTRExfSU1QT1JUX1RPX0ZTPUltcG9ydCBXU0RMIFRvIEZpbGUgU3lzdGVtCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPU5hdmlnYXRvciBDb250YWluZXIKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPU5hdmlnYXRvciBUb29sYmFyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1OYXZpZ2F0b3IgQ29udGVudAotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9QWN0aW9ucyBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPVByb3BlcnRpZXMgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9UHJvcGVydGllcyBDb250ZW50Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9UHJvcGVydGllcyBUb29sYmFyCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPVN0YXR1cyBDb250YWluZXIKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVN0YXR1cyBDb250ZW50Ci1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1TdGF0dXMgVG9vbGJhcgotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NJTD1PcGVuIFdTSUwgRm9ybQotRk9STV9USVRMRV9VRERJX0JVU0lORVNTX0RFVEFJTFM9VURESSBCdXNpbmVzcyBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9VURESSBTZXJ2aWNlIERldGFpbHMgRm9ybQotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFNlcnZpY2UgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1dTSUxfREVUQUlMUz1XU0lMIERldGFpbHMgRm9ybQotRk9STV9USVRMRV9XU0lMX0xJTktfREVUQUlMUz1XU0lMIExpbmsgRGV0YWlscyBGb3JtCi0KLSMgVmlldyB0aXRsZXMKLVZJRVdfVElUTEVfVURESV9CVVNJTkVTU0VTPVVEREkgQnVzaW5lc3NlcyBWaWV3Ci1WSUVXX1RJVExFX1VERElfU0VSVklDRVM9VURESSBTZXJ2aWNlcyBWaWV3Ci1WSUVXX1RJVExFX1dTRExfU0VSVklDRVM9V1NETCBTZXJ2aWNlcyBWaWV3Ci1WSUVXX1RJVExFX1dTSUxfTElOS1M9V1NJTCBMaW5rcyBWaWV3CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI3YzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5DdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlOwotCi0vLyBBYnN0cmFjdCBhY3Rpb24gY2xhc3MgdXNlZCBmb3IgYm90aCBMaW5rIGFuZCBGb3JtIGFjdGlvbnMuCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBDb250cm9sbGVyIGNvbnRyb2xsZXJfOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnR5VGFibGVfOwotICBwcm90ZWN0ZWQgVmVjdG9yIHJlbW92ZWRQcm9wZXJ0aWVzXzsKLQotICBwdWJsaWMgQWN0aW9uKCkKLSAgewotICAgIHRoaXMobnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKLSAgICBwcm9wZXJ0eVRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICByZW1vdmVkUHJvcGVydGllc18gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgQ29udHJvbGxlciBnZXRDb250cm9sbGVyKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXzsKLSAgfQotCi0gIC8qKgotICAqIFJlYWQgcHJvcGVydGllcyBmcm9tIGFuIEh0dHBTZXJ2bGV0UmVxdWVzdCBhbmQgYWRkIHRoZW0gdG8gdGhlIHByb3BlcnR5IHRhYmxlLgotICAqIEBwYXJhbSBIdHRwU2VydmxldFJlcXVlc3QgVGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBjb250YWluaW5nIHRoZSBlbWJlZGRlZCBwYXJhbWV0ZXJzLgotICAqIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIG9yIG5vdCB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpOwotCi0gIC8qKgotICAqIEdldCB0aGUgcHJvcGVydHkgdGFibGUuCi0gICogQHJldHVybiBIYXNodGFibGUgQSBoYXNodGFibGUgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBmb3IgdGhpcyBhY3Rpb24uCi0gICovCi0gIHB1YmxpYyBmaW5hbCBIYXNodGFibGUgZ2V0UHJvcGVydHlUYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydHlUYWJsZV87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHByb3BlcnR5IHRhYmxlLgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VGFibGUoSGFzaHRhYmxlIHByb3BlcnR5VGFibGUpCi0gIHsKLSAgIHByb3BlcnR5VGFibGVfID0gcHJvcGVydHlUYWJsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIHByb3BlcnR5IHRvIHRoZSBwcm9wZXJ0eSB0YWJsZS4KLSAgICogQHBhcmFtIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFkZFByb3BlcnR5KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIHByb3BlcnR5VGFibGVfLnB1dChrZXksIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAqIFJlbW92ZSBhIHByb3BlcnR5IGZyb20gdGhlIHByb3BlcnR5IHRhYmxlLiBUcmFjayB0aGUgZGVsZXRpb25zLgotICAqIEBwYXJhbSBPYmplY3QgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgcmVtb3ZlZC4KLSAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlUHJvcGVydHkoT2JqZWN0IGtleSkKLSAgewotICAgIHByb3BlcnR5VGFibGVfLnJlbW92ZShrZXkpOwotICAgIHJlbW92ZWRQcm9wZXJ0aWVzXy5hZGRFbGVtZW50KGtleSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSBnZXRQcm9wZXJ0eUFzU3RyaW5nQXJyYXkoT2JqZWN0IGtleSkKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBwcm9wZXJ0eVRhYmxlXy5nZXQoa2V5KTsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nW10pCi0gICAgICByZXR1cm4gKFN0cmluZ1tdKW9iamVjdDsKLSAgICBlbHNlIGlmIChvYmplY3QgIT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge29iamVjdC50b1N0cmluZygpfTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4ZWN1dGUoKQotICB7Ci0gICAgcmV0dXJuIGV4ZWN1dGUodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBleGVjdXRlKGJvb2xlYW4gdXNlQWN0aW9uRW5naW5lKQotICB7Ci0gICAgaWYgKHVzZUFjdGlvbkVuZ2luZSkKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRBY3Rpb25FbmdpbmUoKS5leGVjdXRlQWN0aW9uKHRoaXMpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBydW4oKTsKLSAgfQotCi0gIC8vIEFic3RyYWN0IG1ldGhvZCBmb3IgcnVubmluZyB0aGlzIGFjdGlvbi4KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcnVuKCk7Ci0gIAotICAvKioKLSAgKiBSZXR1cm4gdGhlIHRyYW5zZm9ybWVycyB1c2VkIHRvIG5vcm1hbGl6ZSB0aGUgaW5wdXQvb3V0cHV0IHBhcmFtZXRlcnMgZm9yIHRoaXMgYWN0aW9uCi0gICogQHJldHVybiBJVHJhbnNmb3JtZXJbXQotICAqLwotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIHJldHVybiBuZXcgSVRyYW5zZm9ybWVyW10ge25ldyBDdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKX07Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24oUGVyc3BlY3RpdmUgcGVyc3BlY3RpdmUsTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSxTdHJpbmcgZXhjZXB0aW9uTmFtZSxUaHJvd2FibGUgdCkKLSAgewotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHBlcnNwZWN0aXZlLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShleGNlcHRpb25OYW1lKTsKLSAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh0LmdldE1lc3NhZ2UoKSk7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0NoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGU4MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDaGVja1dvcmtiZW5jaEZpbGVSZWFkT25seUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiAiYWN0aW9ucy9DaGVja1dvcmtiZW5jaEZpbGVSZWFkT25seUFjdGlvbkpTUC5qc3AiOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIHBvcHVsYXRlUHJvcGVydHlUYWJsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQ2xlYXJOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2ZkYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQ2xlYXJOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA5MDYgICAxNTYzOTggamVmZmxpdUBjYS5pYm0uY29tIC0gSmVmZnJleSBMaXUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xlYXJOb2RlQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbgotewotICBwdWJsaWMgQ2xlYXJOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcixOb2RlTWFuYWdlciBub2RlTWFuYWdlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsbm9kZU1hbmFnZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpZiAoIWlzU3RhbGVOb2RlKG5vZGVJZCkpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKTsKLSAgICAgIFRyZWVFbGVtZW50IGVsZW1lbnQgPSBub2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAvL2VsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgTGlzdCBlbGVtZW50czJyZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBjb2xsZWN0RWxlbWVudHMyUmVtb3ZlKGVsZW1lbnQsIGVsZW1lbnRzMnJlbW92ZSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMycmVtb3ZlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IGUgPSAoVHJlZUVsZW1lbnQpaXQubmV4dCgpOwotICAgICAgICBlLmdldE1vZGVsKCkucmVtb3ZlRWxlbWVudChlKTsKLSAgICAgIH0KLSAgICAgIGlmIChlbGVtZW50LmdldE1vZGVsKCkuZ2V0Um9vdEVsZW1lbnQoKSAhPSBlbGVtZW50KQotICAgICAgICBub2RlTWFuYWdlcl8ucmVtb3ZlRnJvbU5vZGVUYWJsZShub2RlSWQpOwotICAgICAgLy8gRG8gbm90IGFkZCB0aGlzIHRvIHRoZSBoaXN0b3J5LgotICAgICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IGNvbnRyb2xsZXJfLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0lORk9fTk9ERV9DTEVBUkVEIixub2RlLmdldE5vZGVOYW1lKCkpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29sbGVjdEVsZW1lbnRzMlJlbW92ZShUcmVlRWxlbWVudCBlbGVtZW50LCBMaXN0IGVsZW1lbnRzMnJlbW92ZSkKLSAgewotICAgIGlmICghZWxlbWVudHMycmVtb3ZlLmNvbnRhaW5zKGVsZW1lbnQpKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldE1vZGVsKCkuZ2V0Um9vdEVsZW1lbnQoKSAhPSBlbGVtZW50KQotICAgICAgICBlbGVtZW50czJyZW1vdmUuYWRkKGVsZW1lbnQpOwotICAgICAgRW51bWVyYXRpb24gcmVscyA9IGVsZW1lbnQuZ2V0UmVscygpOwotICAgICAgd2hpbGUgKHJlbHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFJlbCByZWwgPSAoUmVsKXJlbHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIHJlbE5hbWUgPSByZWwuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIU1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUi5lcXVhbHMocmVsTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBFbnVtZXJhdGlvbiBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0RWxlbWVudHMocmVsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgd2hpbGUgKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbGxlY3RFbGVtZW50czJSZW1vdmUoKFRyZWVFbGVtZW50KWNoaWxkcmVuLm5leHRFbGVtZW50KCksIGVsZW1lbnRzMnJlbW92ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8vIERlbGV0aW5nIGEgbm9kZSBmcm9tIHRoZSB0cmVlIHJlc3VsdHMgaW4gY2hhbmdlcyB0byB0aGUgdHJlZXZpZXcgYW5kIHN0YXR1cyBjb250ZW50cy4KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQ2xlYXJWaWV3RWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQ2xlYXJWaWV3RWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGQ5NzIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0NsZWFyVmlld0VsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVmlld1Rvb2w7Ci0KLS8vIEFic3RyYWN0IGFjdGlvbiBjbGFzcyB1c2VkIGZvciBib3RoIExpbmsgYW5kIEZvcm0gYWN0aW9ucy4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGVhclZpZXdFbGVtZW50QWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwcml2YXRlIFN0cmluZyBsaXN0TWFuYWdlclJlbF87Ci0gIHByaXZhdGUgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBwdWJsaWMgQ2xlYXJWaWV3RWxlbWVudEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsU3RyaW5nIGxpc3RNYW5hZ2VyUmVsKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgbm9kZU1hbmFnZXJfICA9IG5vZGVNYW5hZ2VyOwotICAgIGxpc3RNYW5hZ2VyUmVsXyA9IGxpc3RNYW5hZ2VyUmVsOwotICB9Ci0KLSAgLy8gLi4uanNwP3ZpZXdJZD0uLi4KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nIHZpZXdJZFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIC8vIFBlcmZvcm0gZGF0YSB2YWxpZGF0aW9uLgotICAgIHRyeQotICAgIHsKLSAgICAgIEludGVnZXIucGFyc2VJbnQodmlld0lkU3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkIQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdJRCx2aWV3SWRTdHJpbmcpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCB2aWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBWaWV3VG9vbCB2aWV3VG9vbCA9IChWaWV3VG9vbClzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICBpZiAodmlld1Rvb2wuZ2V0VG9vbE1hbmFnZXIodmlld0lkKSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFN0YWxlIHZpZXcuCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFRyZWVFbGVtZW50IGVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBMaXN0TWFuYWdlciBsaXN0TWFuYWdlciA9IChMaXN0TWFuYWdlcillbGVtZW50LmdldFByb3BlcnR5QXNPYmplY3QobGlzdE1hbmFnZXJSZWxfKTsKLSAgICBsaXN0TWFuYWdlci5yZW1vdmVFbGVtZW50V2l0aFZpZXdJZCh2aWV3SWQpOwotICAgIHZpZXdUb29sLmNsZWFyVmlld1Rvb2xNYW5hZ2VyKHZpZXdJZCk7Ci0gICAgc2VsZWN0ZWROb2RlLnNldFZpZXdJZChBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotICAgIC8vIERvIG5vdCBhZGQgdGhpcyB0byB0aGUgaGlzdG9yeS4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvRm9ybUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvRm9ybUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWRlM2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0Zvcm1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5IVE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHB1YmxpYyBGb3JtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyID0gbmV3IE11bHRpcGFydEZvcm1EYXRhUGFyc2VyKCk7Ci0gICAgICBwYXJzZXIucGFyc2VSZXF1ZXN0KHJlcXVlc3QsSFRNTFV0aWxzLlVURjhfRU5DT0RJTkcpOwotICAgICAgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpLmNsZWFyRXJyb3JzKCk7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IHByb2Nlc3NQYXJzZWRSZXN1bHRzKHBhcnNlcik7Ci0gICAgICByZW1vdmVkUHJvcGVydGllc18ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGNhdGNoIChNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVRhYmxlKEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcHJvY2Vzc1BhcnNlZFJlc3VsdHMobmV3IE11bHRpcGFydEZvcm1EYXRhUGFyc2VyKHByb3BlcnR5VGFibGUpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIG1mZGUpCi0gICAgewotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvcGVydHlUYWJsZS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICBIYXNodGFibGUgdGhpc1Byb3BlcnR5VGFibGUgPSBnZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgICBpZiAoIXRoaXNQcm9wZXJ0eVRhYmxlLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIGFkZFByb3BlcnR5KGtleSwgcHJvcGVydHlUYWJsZS5nZXQoa2V5KSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkVG9IaXN0b3J5KGludCBwZXJzcGVjdGl2ZUlkLFN0cmluZyB1cmwpCi0gIHsKLSAgICBjb250cm9sbGVyXy5hZGRUb0hpc3RvcnkocGVyc3BlY3RpdmVJZCx1cmwpOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0Zvcm1JbnB1dEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvRm9ybUlucHV0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTRhOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvRm9ybUlucHV0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLS8vIEEgY2xhc3MgZm9yIHJlcG9ydGluZyBmb3JtIGlucHV0IGV4Y2VwdGlvbnMuCi1wdWJsaWMgY2xhc3MgRm9ybUlucHV0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIC8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1Nzg0NjYwMTY4NTkzODc0Mkw7Ci0KLXB1YmxpYyBGb3JtSW5wdXRFeGNlcHRpb24oU3RyaW5nIG1zZykKLSAgewotICAgIHN1cGVyKG1zZyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDEyYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwdWJsaWMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgLy8gb3MgaXMgdGhlIE91dHB1dFN0cmVhbSBvZiB0aGUgZmlsZSBpbiB0aGUgZmlsZSBzeXN0ZW0KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gd3JpdGUoT3V0cHV0U3RyZWFtIG9zKTsKLQotICAvLyB0aGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgZmlsZQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRGaWxlTmFtZSgpOwotCi0gIHB1YmxpYyBib29sZWFuIHdyaXRlV1NETERlZmluaXRpb24oT3V0cHV0U3RyZWFtIG9zLCBEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBXU0RMRmFjdG9yeSB3c2RsRmFjdG9yeSA9IG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExXcml0ZXIoKTsKLSAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIG9zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHdyaXRlV1NJTERvY3VtZW50KE91dHB1dFN0cmVhbSBvcywgV1NJTERvY3VtZW50IHdzaWxEb2MpCi0gIHsKLSAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zKTsKLSAgICAgIHdzaWxEb2Mud3JpdGUob3N3KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChvc3cgIT0gbnVsbCkKLSAgICAgICAgICBvc3cuY2xvc2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElELCBTdHJpbmcganNwUGFnZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcihqc3BQYWdlKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPycpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgbm9kZUlEID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgU3RyaW5nIHRvb2xJRCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIFN0cmluZyB2aWV3SUQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICBTdHJpbmcgdmlld1Rvb2xJRCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRCk7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KHRvb2xJRCk7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KHZpZXdJRCk7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KHZpZXdUb29sSUQpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIG5vZGVJRCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlRPT0xJRCwgdG9vbElEKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVklFV0lELCB2aWV3SUQpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXVE9PTElELCB2aWV3VG9vbElEKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGMzZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA3MjEgICAxNDkwNzAgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cywgdXBkYXRlIHRvIHJlc3BlY3QgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NpbC5BZGRXU0RMVG9XU0lMQ29tbWFuZDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGV4dGVuZHMgRm9ybUFjdGlvbiB7Ci0gIHByaXZhdGUgSVdvcmtzcGFjZVJvb3QgaVdvcmtzcGFjZVJvb3RfOwotICBwcml2YXRlIElQcm9qZWN0IGlQcm9qZWN0XzsKLSAgcHJpdmF0ZSBJUmVzb3VyY2UgdGFyZ2V0RmlsZVJlc291cmNlXzsKLQotICAgIHB1YmxpYyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgICAgIGlXb3Jrc3BhY2VSb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24gewotICAgICAgICBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0gICAgICAgIE1lc3NhZ2VRdWV1ZSBtc2dRdWV1ZSA9IGNvbnRyb2xsZXJfLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgICAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgU3RyaW5nIHdvcmtiZW5jaFByb2plY3ROYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuV09SS0JFTkNIX1BST0pFQ1RfTkFNRSk7Ci0gICAgICAgIGlmICh3b3JrYmVuY2hQcm9qZWN0TmFtZSA9PSBudWxsIHx8IHdvcmtiZW5jaFByb2plY3ROYW1lLmxlbmd0aCgpIDw9IDApIHsKLSAgICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfV09SS0JFTkNIX1BST0pFQ1QiKSk7Ci0gICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaVByb2plY3RfID0gaVdvcmtzcGFjZVJvb3RfLmdldFByb2plY3Qod29ya2JlbmNoUHJvamVjdE5hbWUpOwotICAgICAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FLCB3b3JrYmVuY2hQcm9qZWN0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGltcG9ydEZpbGUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5JTVBPUlRfRklMRSk7Ci0gICAgICAgIGlmIChpbXBvcnRGaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuSU1QT1JUX0ZJTEUsIEFjdGlvbklucHV0cy5JTVBPUlRfRklMRSk7Ci0gICAgICAgICAgICBTdHJpbmcgaW1wb3J0ZWRGaWxlTmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLklNUE9SVEVEX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICBpZiAoaW1wb3J0ZWRGaWxlTmFtZSA9PSBudWxsIHx8IGltcG9ydGVkRmlsZU5hbWUubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX0ZJTEVfTkFNRSIpKTsKLSAgICAgICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FLCBpbXBvcnRlZEZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgaW1wb3J0VG9XU0lMID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuSU1QT1JUX1RPX1dTSUwpOwotICAgICAgICBpZiAoaW1wb3J0VG9XU0lMICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuSU1QT1JUX1RPX1dTSUwsIEFjdGlvbklucHV0cy5JTVBPUlRfVE9fV1NJTCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLklNUE9SVEVEX1dTRExfVVJMLCBwYXJzZXIuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5JTVBPUlRFRF9XU0RMX1VSTCkpOwotICAgICAgICAgICAgU3RyaW5nIHdzaWxGaWxlTmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLldTSUxfRklMRV9OQU1FKTsKLSAgICAgICAgICAgIGlmICh3c2lsRmlsZU5hbWUgPT0gbnVsbCB8fCB3c2lsRmlsZU5hbWUubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1dTSUxfRklMRV9OQU1FIikpOwotICAgICAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5XU0lMX0ZJTEVfTkFNRSwgd3NpbEZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW1wb3J0RmlsZSA9PSBudWxsICYmIGltcG9ydFRvV1NJTCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19JTVBPUlRfT1BUSU9OX1NFTEVDVEVEIikpOwotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKFN0cmluZyBkZWZhdWx0RmlsZU5hbWUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjb250cm9sbGVyXy5nZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpICsgZGVmYXVsdEZpbGVOYW1lKTsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgcmV0dXJuIGZvczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW1wb3J0VGVtcEZpbGVUb1dlYlByb2plY3QoU3RyaW5nIGRlZmF1bHRGaWxlTmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmICh0YXJnZXRGaWxlUmVzb3VyY2VfICE9IG51bGwgJiYgdGFyZ2V0RmlsZVJlc291cmNlXy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgIHRhcmdldEZpbGVSZXNvdXJjZV8uZGVsZXRlKHRydWUsbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgIFN0cmluZyBpbXBvcnRlZEZpbGVOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLklNUE9SVEVEX0ZJTEVfTkFNRSk7Ci0gICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjb250cm9sbGVyXy5nZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpK2RlZmF1bHRGaWxlTmFtZSk7Ci0gICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCi0gICAgICBJRmlsZSBpRmlsZSA9IGlQcm9qZWN0Xy5nZXRGaWxlKCIvIitpbXBvcnRlZEZpbGVOYW1lKTsKLSAgICAgIGlGaWxlLmNyZWF0ZShiaXMsdHJ1ZSxuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgZmlsZS5kZWxldGUoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZpbGVFeGlzdHMoKQotICAgIHsKLSAgICAgIFN0cmluZyBpbXBvcnRlZEZpbGVOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLklNUE9SVEVEX0ZJTEVfTkFNRSk7Ci0gICAgICBpZiAoaW1wb3J0ZWRGaWxlTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0YXJnZXRGaWxlUmVzb3VyY2VfID0gaVByb2plY3RfLmZpbmRNZW1iZXIoaW1wb3J0ZWRGaWxlTmFtZSk7Ci0gICAgICAgIHJldHVybiAodGFyZ2V0RmlsZVJlc291cmNlXyAhPSBudWxsICYmIHRhcmdldEZpbGVSZXNvdXJjZV8uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGFyZ2V0RmlsZVJlc291cmNlUmVhZE9ubHkoKQotICAgIHsKLSAgICAgIHJldHVybiB0YXJnZXRGaWxlUmVzb3VyY2VfLmdldFJlc291cmNlQXR0cmlidXRlcygpLmlzUmVhZE9ubHkoKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkKLSAgICB7Ci0gICAgCXJldHVybiBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCkuaXNDaGVja291dEZpbGVzRW5hYmxlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVBsdWdpbkZpbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQpCi0gICAgewotICAgICAgU3RyaW5nIGltcG9ydGVkRmlsZU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FKTsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRNZXNzYWdlKG1lc3NhZ2VJZCxuZXcgU3RyaW5nW117aVByb2plY3RfLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxpbXBvcnRlZEZpbGVOYW1lfSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKQotICAgIHsKLSAgICAJcmV0dXJuIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuZ2V0SW5zdGFuY2UoKS5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWRpdCgpCi0gICAgewotICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLSAgICAgIGZpbGVzWzBdID0gKElGaWxlKXRhcmdldEZpbGVSZXNvdXJjZV87Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsbnVsbCk7Ci0gICAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gY29udHJvbGxlcl8uZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIHJldHVybiBzdGF0dXMuaXNPSygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICAgICAgTWVzc2FnZVF1ZXVlIG1zZ1F1ZXVlID0gY29udHJvbGxlcl8uZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLklNUE9SVF9GSUxFKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiBhY3Rpb24gPSBuZXdJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRGaWxlTmFtZSA9IGFjdGlvbi5nZXREZWZhdWx0RmlsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbi53cml0ZShnZXRPdXRwdXRTdHJlYW0oZGVmYXVsdEZpbGVOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1JJVElOR19URU1QX0ZJTEVfVE9fRlMiKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW1wb3J0VGVtcEZpbGVUb1dlYlByb2plY3QoZGVmYXVsdEZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0ZWRGaWxlTmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5JTVBPUlRFRF9GSUxFX05BTUUpOwotICAgICAgICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0lORk9fSU1QT1JUX1RPX1dPUktCRU5DSF9TVUNDRVNTRlVMIiwgaW1wb3J0ZWRGaWxlTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICAgICAgbXNnUXVldWUuYWRkTWVzc2FnZShmbmZlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKGNlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLklNUE9SVF9UT19XU0lMKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuV09SS0JFTkNIX1BST0pFQ1RfTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgaW1wb3J0ZWRXU0lMRmlsZU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuV1NJTF9GSUxFX05BTUUpOwotICAgICAgICAgICAgU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSU1QT1JURURfV1NETF9VUkwpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHdzaWxQbGF0Zm9ybVVSTCA9IG5ldyBTdHJpbmdCdWZmZXIoInBsYXRmb3JtOi9yZXNvdXJjZS8iKTsKLSAgICAgICAgICAgIHdzaWxQbGF0Zm9ybVVSTC5hcHBlbmQocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgd3NpbFBsYXRmb3JtVVJMLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgd3NpbFBsYXRmb3JtVVJMLmFwcGVuZChpbXBvcnRlZFdTSUxGaWxlTmFtZSk7Ci0gICAgICAgICAgICBBZGRXU0RMVG9XU0lMQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFdTRExUb1dTSUxDb21tYW5kKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1s1XTsKLSAgICAgICAgICAgIGFyZ3NbMF0gPSBBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfV1NJTDsKLSAgICAgICAgICAgIGFyZ3NbMV0gPSB3c2lsUGxhdGZvcm1VUkwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGFyZ3NbMl0gPSBBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfV1NETDsKLSAgICAgICAgICAgIGFyZ3NbM10gPSB3c2RsVVJMOwotICAgICAgICAgICAgYXJnc1s0XSA9IEFkZFdTRExUb1dTSUxDb21tYW5kLkFSR19SRVNPTFZFX1dTREw7Ci0gICAgICAgICAgICBjb21tYW5kLnNldEFyZ3VtZW50cyhhcmdzKTsKLSAgICAgICAgICAgIElFbnZpcm9ubWVudCBlbnYgPSBuZXcgRWNsaXBzZUVudmlyb25tZW50KG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgY29tbWFuZC5zZXRFbnZpcm9ubWVudCggZW52ICk7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0lORk9fSU1QT1JUX1NFUlZJQ0VfUkVGX1RPX1dTSUxfU1VDQ0VTU0ZVTCIsIGltcG9ydGVkV1NJTEZpbGVOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gbmV3SW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZGRmNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hXaXphcmRSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoV2l6YXJkVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gZXh0ZW5kcyBGb3JtQWN0aW9uCi17Ci0gIHB1YmxpYyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB3aXphcmRJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLldFQl9TRVJWSUNFX1dJWkFSRCk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5XRUJfU0VSVklDRV9XSVpBUkQsIHdpemFyZElEKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGxhdW5jaFdpemFyZChTdHJpbmcgd3NkbFVSTCkKLSAgewotICAgIExhdW5jaFdpemFyZFRhc2sgdGFzayA9IExhdW5jaFdpemFyZFRhc2suZ2V0SW5zdGFuY2UoKTsKLSAgICBpZiAodGFzay5nZXRJc0V4ZWN1dGluZygpKQotICAgIHsKLSAgICAgIGNvbnRyb2xsZXJfLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dJWkFSRF9BTFJFQURZX1JVTk5JTkciKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGludCB3aXphcmRJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLldFQl9TRVJWSUNFX1dJWkFSRCkpOwotICAgIExhdW5jaFdpemFyZFJ1bm5hYmxlIHJ1bm5hYmxlOwotICAgIGlmICh3aXphcmRJRCA9PSBBY3Rpb25JbnB1dHMuV0VCX1NFUlZJQ0VfQ0xJRU5UX1dJWkFSRCkKLSAgICAgIHJ1bm5hYmxlID0gbmV3IExhdW5jaFdpemFyZFJ1bm5hYmxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiLCB3c2RsVVJMKTsKLSAgICBlbHNlIGlmICh3aXphcmRJRCA9PSBBY3Rpb25JbnB1dHMuV0VCX1NFUlZJQ0VfU0tFTEVUT05fV0laQVJEKQotICAgICAgcnVubmFibGUgPSBuZXcgTGF1bmNoV2l6YXJkUnVubmFibGUoIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIiwgd3NkbFVSTCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHRhc2suY2hlY2tBbmRBc3luY0V4ZWMocnVubmFibGUpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0xpbmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0xpbmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZjNTA4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9MaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotCi0vLyBBYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGFjdGlvbiBvZiBjbGlja2luZyBhIGxpbmsuIFRoZXNlIGFjdGlvbnMKLS8vIG1heSBjaGFuZ2UgdGhlIGhpc3RvcnkgbGlzdC4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5rQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5XzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzU3RhbGVCcmVhZENydW1iXzsKLQotICBwdWJsaWMgTGlua0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBpc0FkZGVkVG9IaXN0b3J5XyA9IGZhbHNlOwotICAgIGlzU3RhbGVCcmVhZENydW1iXyA9IGZhbHNlOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGlzIGhpc3RvcnkgbGlzdC4KLSAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBydW4oKSBtZXRob2QuCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIGlzQWRkZWRUb0hpc3RvcnlfOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KTsKLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgaXNIaXN0b3J5U3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLklTSElTVE9SWSk7Ci0gICAgaWYgKGlzSGlzdG9yeVN0cmluZyAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5JU0hJU1RPUlksaXNIaXN0b3J5U3RyaW5nKTsKLSAgICByZXR1cm4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKHJlcXVlc3QpOwotICB9Ci0KLSAgLy8gQWRkIHRoZSBhY3Rpb24ncyBVUkwgdG8gdGhlIGNvbnRyb2xsZXIncyBoaXN0b3J5IGxpc3QuCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFRvSGlzdG9yeShpbnQgcGVyc3BlY3RpdmVJZCxTdHJpbmcgdXJsKQotICB7Ci0gICAgaWYgKCFpc0hpc3RvcnlBY3Rpb24oKSkKLSAgICAgIGlzQWRkZWRUb0hpc3RvcnlfID0gY29udHJvbGxlcl8uYWRkVG9IaXN0b3J5KHBlcnNwZWN0aXZlSWQsdXJsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSGlzdG9yeUFjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFN0YWxlQnJlYWRDcnVtYigpCi0gIHsKLSAgICBpZiAoaXNIaXN0b3J5QWN0aW9uKCkpCi0gICAgewotICAgICAgaXNTdGFsZUJyZWFkQ3J1bWJfID0gdHJ1ZTsKLSAgICAgIGNvbnRyb2xsZXJfLnByb2Nlc3NTdGFsZUJyZWFkQ3J1bWIoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N0YWxlQnJlYWRDcnVtYigpCi0gIHsKLSAgICByZXR1cm4gaXNTdGFsZUJyZWFkQ3J1bWJfOwotICB9Ci0KLSAgLy8gQ2FsbCB0aGlzIHdoZW4gYSBzdGFsZSBicmVhZGNydW1iIGlzIGVuY291bnRlcmVkIHdoaWxlIHRyYXZlcnNpbmcgaGlzdG9yeSBjaGFpbi4KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROZXh0SGlzdG9yeUFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuIFJldHJpZXZlSGlzdG9yeUFjdGlvbi5nZXRBY3Rpb25MaW5rKGNvbnRyb2xsZXJfLmdldEhpc3RvcnlEaXJlY3Rpb24oKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL05vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL05vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1OWJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlQWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwcm90ZWN0ZWQgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfOwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNOb2RlU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzVmlld1NlbGVjdGlvbl87Ci0gIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlc1N0YXR1c1VwZGF0ZV87Ci0KLSAgcHVibGljIE5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyLE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgbm9kZU1hbmFnZXJfID0gbm9kZU1hbmFnZXI7Ci0gICAgcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfID0gZmFsc2U7Ci0gICAgcmVxdWlyZXNOb2RlU2VsZWN0aW9uXyA9IGZhbHNlOwotICAgIHJlcXVpcmVzVmlld1NlbGVjdGlvbl8gPSBmYWxzZTsKLSAgICByZXF1aXJlc1N0YXR1c1VwZGF0ZV8gPSBmYWxzZTsKLSAgfQotCi0gIC8vIC4uLmpzcD9ub2RlSWQ9Li4uPCZpc0hpc3Rvcnk9MT4KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nIG5vZGVJZFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIC8vIFBlcmZvcm0gZGF0YSB2YWxpZGF0aW9uLgotICAgIHRyeQotICAgIHsKLSAgICAgIEludGVnZXIucGFyc2VJbnQobm9kZUlkU3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkIQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxub2RlSWRTdHJpbmcpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNTdGFsZU5vZGUoaW50IG5vZGVJZCkKLSAgewotICAgIHJldHVybiAobm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKSA9PSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAqIE1ha2UgYSBub2RlIHZpc2libGUuIEEgbm9kZSBpcyB2aXNpYmxlIHdoZW4gYWxsIG9mIGl0cyBhbmNlc3RvcnMgYXJlIGV4cGFuZGVkLgotICAqIEBwYXJhbSBOb2RlIFRoZSBub2RlIHRvIGJlIG1hZGUgdmlzaWJsZS4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gSW5kaWNhdG9yIGZvciB3aGV0aGVyIG9yIG5vdCB0aGUgdHJlZSBzdHJ1Y3R1cmUgd2FzIGNoYW5nZWQgKGkuZS4gZXhwYW5kZWQgdG8gc2hvdyB0aGUgbm9kZSBpbiBxdWVzdGlvbikuCi0gICovCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1ha2VOb2RlVmlzaWJsZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXF1aXJlc1RyZWVWaWV3UmVmcmVzaF8gPSBub2RlLmdldE5vZGVNYW5hZ2VyKCkubWFrZU5vZGVWaXNpYmxlKG5vZGUpOwotICAgIHJldHVybiByZXF1aXJlc1RyZWVWaWV3UmVmcmVzaF87Ci0gIH0KLQotICAvKioKLSAgICogTWFrZSBhIG5vZGUgdmlzaWJsZS4gQSBub2RlIGlzIHZpc2libGUgd2hlbiBhbGwgb2YgaXRzIGFuY2VzdG9ycyBhcmUgZXhwYW5kZWQuCi0gICAqIEBwYXJhbSBOb2RlIFRoZSBub2RlIHRvIGJlIG1hZGUgdmlzaWJsZS4KLSAgICogQHJldHVybiBib29sZWFuIEluZGljYXRvciBmb3Igd2hldGhlciBvciBub3QgdGhlIHRyZWUgc3RydWN0dXJlIHdhcyBjaGFuZ2VkIChpLmUuIGV4cGFuZGVkIHRvIHNob3cgdGhlIG5vZGUgaW4gcXVlc3Rpb24pLgotICAgKi8KLSAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFRyZWVSZWZyZXNoTmVlZGVkKCkKLSAgIHsKLSAgICAgcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfID0gdHJ1ZTsKLSAgICAgCi0gICB9Ci0gIAotICAvKioKLSAgKiBTZWxlY3QgYSBub2RlIHdpdGggaWQgbm9kZUlkLgotICAqIEBwYXJhbSBpbnQgVGhlIGlkIG9mIHRoZSBub2RlIHRvIGJlIHNlbGVjdGVkLgotICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTZWxlY3RlZE5vZGVJZChpbnQgbm9kZUlkKQotICB7Ci0gICAgaWYgKG5vZGVNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGVJZCgpICE9IG5vZGVJZCkKLSAgICB7Ci0gICAgICByZXF1aXJlc05vZGVTZWxlY3Rpb25fID0gdHJ1ZTsKLSAgICAgIG5vZGVNYW5hZ2VyXy5zZXRTZWxlY3RlZE5vZGVJZChub2RlSWQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNlbGVjdGVkVmlld0lkKGludCB2aWV3SWQpCi0gIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpICE9IHZpZXdJZCkKLSAgICB7Ci0gICAgICByZXF1aXJlc1ZpZXdTZWxlY3Rpb25fID0gdHJ1ZTsKLSAgICAgIHNlbGVjdGVkTm9kZS5zZXRWaWV3SWQodmlld0lkKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIHRyZWV2aWV3IHJlcXVpcmVzIHJlbG9hZGluZyBhcyBhIHJlc3VsdCBvZiB0aGlzIGFjdGlvbi4KLSAgLy8gUmVsb2FkaW5nIGlzIHJlcXVpcmVkIHdoZW4gYnJhbmNoZXMgYXJlIGFkZGVkL3JlbW92ZWQuCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoKCkKLSAgewotICAgIHJldHVybiByZXF1aXJlc1RyZWVWaWV3UmVmcmVzaF87Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBuZXcgbm9kZSBoYXMgYmVlbiBzZWxlY3RlZCBhcyBhIHJlc3VsdCBvZiB0aGUgYWN0aW9uLgotICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc05vZGVTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHJlcXVpcmVzTm9kZVNlbGVjdGlvbl87Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgaWYgYSBuZXcgdmlldyBlbGVtZW50IGlzIHNlbGVjdGVkLgotICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc1ZpZXdTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHJlcXVpcmVzVmlld1NlbGVjdGlvbl87Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgaWYgYW55IHN0YXR1cyBtZXNzYWdlcyBhcm9zZSBmcm9tIHRoaXMgYWN0aW9uLgotICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc1N0YXR1c1VwZGF0ZSgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZXNTdGF0dXNVcGRhdGVfOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvT3BlbkNhbGVuZGFyQnJvd3NlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvT3BlbkNhbGVuZGFyQnJvd3NlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGVjMDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL09wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuQ2FsZW5kYXJCcm93c2VyQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHB1YmxpYyBPcGVuQ2FsZW5kYXJCcm93c2VyQWN0aW9uKCkKLSAgewotICB9Ci0KLSAgLy8gY2FsZW5kYXJfYnJvd3Nlci5qc3A/c2Vzc2lvbklkPS4uLiZjYWxlbmRhclR5cGU9Li4uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHNlc3Npb25JZCxpbnQgY2FsZW5kYXJUeXBlKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJjYWxlbmRhcl9icm93c2VyLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRSkuYXBwZW5kKCc9JykuYXBwZW5kKGNhbGVuZGFyVHlwZSk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0ZvckRhdGUoU3RyaW5nIHNlc3Npb25JZCkKLSAgewotICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKHNlc3Npb25JZCxBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0ZvckRhdGVUaW1lKFN0cmluZyBzZXNzaW9uSWQpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURVRJTUUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9yR1llYXJNb250aChTdHJpbmcgc2Vzc2lvbklkKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsoc2Vzc2lvbklkLEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dZRUFSTU9OVEgpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9yR0RheShTdHJpbmcgc2Vzc2lvbklkKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsoc2Vzc2lvbklkLEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dEQVkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9yR01vbnRoRGF5KFN0cmluZyBzZXNzaW9uSWQpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR01PTlRIREFZKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHBvcHVsYXRlUHJvcGVydHlUYWJsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9PcGVuV1NETEJyb3dzZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL09wZW5XU0RMQnJvd3NlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzE3NjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL09wZW5XU0RMQnJvd3NlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLQotcHVibGljIGNsYXNzIE9wZW5XU0RMQnJvd3NlckFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwdWJsaWMgT3BlbldTRExCcm93c2VyQWN0aW9uKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhTdHJpbmcgc2Vzc2lvbklkLGludCB3c2RsVHlwZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NkbF9icm93c2VyLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuV1NETF9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQod3NkbFR5cGUpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9yU2VydmljZShTdHJpbmcgc2Vzc2lvbklkKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsoc2Vzc2lvbklkLEFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZyBzZXNzaW9uSWQpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsQWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUHJveHlMb2FkUGFnZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUHJveHlMb2FkUGFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmVmMmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1Byb3h5TG9hZFBhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eUxvYWRQYWdlQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIC8vIEdldCB0aGUgYWN0aW9uIGdpdmVuIGEgcmVsYXRpdmUgdGFyZ2V0UGFnZSBVUkwuIGUuZy4gImZvcm1zL0xvbmdMb2FkaW5nRm9ybS5qc3AiCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHRhcmdldFBhZ2UpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhudWxsLHRhcmdldFBhZ2UpOwotICB9Ci0gIAotICAvLyBHZXQgdGhlIGFjdGlvbiBnaXZlbiBhIHNlc3Npb25JZCBhbmQgYSByZWxhdGl2ZSB0YXJnZXRQYWdlIFVSTC4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhTdHJpbmcgc2Vzc2lvbklkLFN0cmluZyB0YXJnZXRQYWdlKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJmb3Jtcy9Qcm94eUxvYWRQYWdlLmpzcD8iKTsKLSAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpCi0gICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKS5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVEFSR0VUX1BBR0UpLmFwcGVuZCgnPScpLmFwcGVuZCh0YXJnZXRQYWdlKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9SZXNpemVGcmFtZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1Jlc2l6ZUZyYW1lc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2M5ZTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1Jlc2l6ZUZyYW1lc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5IVE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNpemVGcmFtZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZnJhbWVOYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuRlJBTUVfTkFNRSk7Ci0gICAgaWYgKGZyYW1lTmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5GUkFNRV9OQU1FLGZyYW1lTmFtZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBwcm9jZXNzT3RoZXJzKHBhcnNlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci0gIAotICBwdWJsaWMgUmVzaXplRnJhbWVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyID0gbmV3IE11bHRpcGFydEZvcm1EYXRhUGFyc2VyKCk7Ci0gICAgICBwYXJzZXIucGFyc2VSZXF1ZXN0KHJlcXVlc3QsSFRNTFV0aWxzLlVURjhfRU5DT0RJTkcpOwotICAgICAgYm9vbGVhbiByZXN1bHQgPSBwcm9jZXNzUGFyc2VkUmVzdWx0cyhwYXJzZXIpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgY2F0Y2ggKE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1JldHJpZXZlSGlzdG9yeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUmV0cmlldmVIaXN0b3J5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNGNlMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUmV0cmlldmVIaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5CcmVhZENydW1iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgUmV0cmlldmVIaXN0b3J5QWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwcml2YXRlIEJyZWFkQ3J1bWIgYnJlYWRDcnVtYl87Ci0KLSAgcHVibGljIFJldHJpZXZlSGlzdG9yeUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBicmVhZENydW1iXyA9IG51bGw7Ci0gIH0KLQotICAvLyBhY3Rpb25zL1JldHJpZXZlSGlzdG9yeUFjdGlvbi5qc3A/anVtcD0xICAtIGZvcndhcmQgIChBY3Rpb25JbnB1dHMuSlVNUF9GT1JXQVJEKQotICAvLyBhY3Rpb25zL1JldHJpZXZlSGlzdG9yeUFjdGlvbi5qc3A/anVtcD0tMSAtIGJhY2t3YXJkIChBY3Rpb25JbnB1dHMuSlVNUF9CQUNLKQotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBqdW1wKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJhY3Rpb25zL1JldHJpZXZlSGlzdG9yeUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLkpVTVApLmFwcGVuZCgnPScpLmFwcGVuZChqdW1wKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nIGp1bXBTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuSlVNUCk7Ci0gICAgLy8gUGVyZm9ybSBkYXRhIHZhbGlkYXRpb24uCi0gICAgdHJ5Ci0gICAgewotICAgICAgSW50ZWdlci5wYXJzZUludChqdW1wU3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkIQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLkpVTVAsanVtcFN0cmluZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgaW50IGp1bXAgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5KVU1QKSk7Ci0gICAgc3dpdGNoIChqdW1wKQotICAgIHsKLSAgICAgIGNhc2UgQWN0aW9uSW5wdXRzLkpVTVBfRk9SV0FSRDoKLSAgICAgICAgYnJlYWRDcnVtYl8gPSBjb250cm9sbGVyXy5mb3J3YXJkKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBBY3Rpb25JbnB1dHMuSlVNUF9CQUNLOgotICAgICAgICBicmVhZENydW1iXyA9IGNvbnRyb2xsZXJfLmJhY2soKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBCcmVhZENydW1iIGdldEJyZWFkQ3J1bWIoKQotICB7Ci0gICAgcmV0dXJuIGJyZWFkQ3J1bWJfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZmFlOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvU2VsZWN0Tm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuTm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdE5vZGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBOb2RlIHNlbGVjdGVkTm9kZV87Ci0KLSAgcHVibGljIFNlbGVjdE5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyLE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcixub2RlTWFuYWdlcik7Ci0gICAgc2VsZWN0ZWROb2RlXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBwZXJmb3JtQmFzZUFjdGlvbihpbnQgbm9kZUlkKQotICB7Ci0gICAgc2V0U2VsZWN0ZWROb2RlSWQobm9kZUlkKTsKLSAgICBzZWxlY3RlZE5vZGVfID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybUV4dGVuZGVkQWN0aW9uKCkKLSAgewotCSAvL3RoZSBleHRlbmRlZCBjbGFzc2VzIGNhbiBpbnRlcmplY3QgaGVyZSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaWYgKCFpc1N0YWxlTm9kZShub2RlSWQpKQotICAgIHsKLSAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBub2RlIGlzIHZpc2libGUuCi0gICAgICBtYWtlTm9kZVZpc2libGUobm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKSk7Ci0gICAgICBwZXJmb3JtQmFzZUFjdGlvbihub2RlSWQpOwotICAgICAgcGVyZm9ybUV4dGVuZGVkQWN0aW9uKCk7Ci0gICAgICBhZGRUb0hpc3RvcnkoZ2V0UGVyc3BlY3RpdmVJZCgpLGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHNldFN0YWxlQnJlYWRDcnVtYigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldFNlbGVjdGVkTm9kZSgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWROb2RlXzsKLSAgfQotICAKLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICByZXR1cm4gbmV3IElUcmFuc2Zvcm1lcltdIHtuZXcgTm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKX07Ci0gIH0KLQotICAvLyBTZWxlY3RpbmcgYSBub2RlIGNoYW5nZXMgdGhlIHRyZWV2aWV3IGNvbnRlbnQgYW5kIHRoZSBwcm9wZXJ0aWVzIGNvbnRhaW5lci4KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBlcnNwZWN0aXZlSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmRmN2I1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5DdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlZpZXdUb29sOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0Tm9kZVRvb2xBY3Rpb24gZXh0ZW5kcyBTZWxlY3ROb2RlQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBOb2RlTWFuYWdlciBub2RlTWFuYWdlcl87Ci0gIHByb3RlY3RlZCBUb29sIHNlbGVjdGVkVG9vbF87Ci0KLSAgcHVibGljIFNlbGVjdE5vZGVUb29sQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcixOb2RlTWFuYWdlciBub2RlTWFuYWdlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsbm9kZU1hbmFnZXIpOwotICAgIG5vZGVNYW5hZ2VyXyA9IG5vZGVNYW5hZ2VyOwotICAgIHNlbGVjdGVkVG9vbF8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE5vZGVNYW5hZ2VyIGdldE5vZGVNYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBub2RlTWFuYWdlcl87Ci0gIH0KLQotICAvLyAuLi5qc3A/bm9kZUlkPS4uLiZ0b29sSWQ9Li4uPCZ2aWV3SWQ9Li4uJnZpZXdUb29sSWQ9Li4uPjwmaXNIaXN0b3J5PTE+Ci0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKHJlcXVlc3QpOwotICAgIFN0cmluZyB0b29sSWRTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVE9PTElEKTsKLSAgICBTdHJpbmcgdmlld0lkU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgU3RyaW5nIHZpZXdUb29sSWRTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0KLSAgICAvLyBQZXJmb3JtIGRhdGEgdmFsaWRhdGlvbi4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KHRvb2xJZFN0cmluZyk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBWYWxpZGF0aW9uIGZhaWxlZC4KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5UT09MSUQsdG9vbElkU3RyaW5nKTsKLQotICAgIC8vIE9wdGlvbmFsIHByb3BlcnRpZXMKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbnQgdmlld0lkID0gSW50ZWdlci5wYXJzZUludCh2aWV3SWRTdHJpbmcpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsdmlld0lkU3RyaW5nKTsKLSAgICAgIGlmICh2aWV3SWQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgewotICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHZpZXdUb29sSWRTdHJpbmcpOwotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQsdmlld1Rvb2xJZFN0cmluZyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIGlmICghaXNTdGFsZU5vZGUobm9kZUlkKSkKLSAgICB7Ci0gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbm9kZSBpcyB2aXNpYmxlLgotICAgICAgbWFrZU5vZGVWaXNpYmxlKG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJZCkpOwotICAgICAgc2V0U2VsZWN0ZWROb2RlSWQobm9kZUlkKTsKLSAgICAgIHNlbGVjdGVkTm9kZV8gPSBub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICBpbnQgdG9vbElkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVE9PTElEKSk7Ci0gICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgIHRvb2xNYW5hZ2VyLnNldFNlbGVjdGVkVG9vbElkKHRvb2xJZCk7Ci0gICAgICBzZWxlY3RlZFRvb2xfID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICBTdHJpbmcgdmlld0lkU3RyaW5nID0gKChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICAgIGlmICh2aWV3SWRTdHJpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IHZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQodmlld0lkU3RyaW5nKTsKLSAgICAgICAgc2V0U2VsZWN0ZWRWaWV3SWQodmlld0lkKTsKLSAgICAgICAgaWYgKHZpZXdJZCAhPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdmlld1Rvb2xJZFN0cmluZyA9ICgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCkpOwotICAgICAgICAgIFZpZXdUb29sIHZpZXdUb29sID0gKFZpZXdUb29sKXNlbGVjdGVkVG9vbF87Ci0gICAgICAgICAgaWYgKHZpZXdUb29sSWRTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdmlld1Rvb2xJZCA9IEludGVnZXIucGFyc2VJbnQodmlld1Rvb2xJZFN0cmluZyk7Ci0gICAgICAgICAgICBUb29sTWFuYWdlciB2aWV3VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdUb29sTWFuYWdlcigpOwotICAgICAgICAgICAgaWYgKHZpZXdUb29sTWFuYWdlciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIWlzSGlzdG9yeUFjdGlvbigpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlld1Rvb2xNYW5hZ2VyID0gdmlld1Rvb2wuY3JlYXRlVG9vbE1hbmFnZXIodmlld0lkKTsKLSAgICAgICAgICAgICAgICB2aWV3VG9vbElkID0gdmlld1Rvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbElkKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0U3RhbGVCcmVhZENydW1iKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWV3VG9vbE1hbmFnZXIuc2V0U2VsZWN0ZWRUb29sSWQodmlld1Rvb2xJZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHNldFNlbGVjdGVkVmlld0lkKEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0gICAgICBhZGRUb0hpc3RvcnkoZ2V0UGVyc3BlY3RpdmVJZCgpLGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHNldFN0YWxlQnJlYWRDcnVtYigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBJVHJhbnNmb3JtZXJbXSB7bmV3IEN1cnJlbnROb2RlU2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8pfTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBUb29sIGdldFNlbGVjdGVkVmlld1Rvb2woKQotICB7Ci0gICAgaWYgKHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVklFV0lEKSAhPSBudWxsKQotICAgICAgcmV0dXJuIHNlbGVjdGVkTm9kZV8uZ2V0Vmlld1Rvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVG9vbCBnZXRTZWxlY3RlZFRvb2woKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGVkVG9vbF87Ci0gIH0KLQotICAvLyBTZWxlY3RpbmcgYSBub2RlIHRvb2wgdXBkYXRlcyB0aGUgcHJvcGVydGllcyBjb250ZW50LiBBbHNvLCBpbiB0aGUgZXZlbnQKLSAgLy8gb2YgYSBoaXN0b3J5IHN3aXRjaCwgbm9kZXMgbWF5IG5lZWQgdG8gYmUgc2VsZWN0ZWQgcmVzdWx0aW5nIGluIGNoYW5nZXMgdG8KLSAgLy8gYm90aCB0aGUgdHJlZXZpZXcgY29udGVudCBhbmQgdGhlIHByb3BlcnRpZXMgY29udGFpbmVyLiBUaGVzZSByZXF1aXJlbWVudHMgYXJlCi0gIC8vIGNvdmVyZWQgdGhyb3VnaCB0aGUgYmFzZSBjbGFzcy4KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGVudFZhcigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnRpZXNDb250ZW50UGFnZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBlcnNwZWN0aXZlSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1Nob3dQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzJmNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkhUTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLQotcHVibGljIGNsYXNzIFNob3dQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24KLXsKLSAgcHVibGljIFNob3dQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIC8vIGFjdGlvbnMvc2hvd19wZXJzcGVjdGl2ZS5qc3A/cGVyc3BlY3RpdmU9MDwmaXNIaXN0b3J5PTE+IC0gVURESSAoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREkpCi0gIC8vIGFjdGlvbnMvc2hvd19wZXJzcGVjdGl2ZS5qc3A/cGVyc3BlY3RpdmU9MTwmaXNIaXN0b3J5PTE+IC0gV1NJTCAoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUwpCi0gIC8vIGFjdGlvbnMvc2hvd19wZXJzcGVjdGl2ZS5qc3A/cGVyc3BlY3RpdmU9MjwmaXNIaXN0b3J5PTE+IC0gV1NETCAoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwpCi0gIC8vIGFjdGlvbnMvc2hvd19wZXJzcGVjdGl2ZS5qc3A/cGVyc3BlY3RpdmU9MzwmaXNIaXN0b3J5PTE+IC0gRmF2b3JpdGVzIChBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfRkFWT1JJVEVTKQotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBuZXdQZXJzcGVjdGl2ZSxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImFjdGlvbnMvU2hvd1BlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkUpLmFwcGVuZCgnPScpLmFwcGVuZChuZXdQZXJzcGVjdGl2ZSk7Ci0gICAgaWYgKGZvckhpc3RvcnkpCi0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKS5hcHBlbmQoIj0xIik7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIFN0cmluZyBwZXJzcGVjdGl2ZVN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSk7Ci0gICAgLy8gUGVyZm9ybSBkYXRhIHZhbGlkYXRpb24uCi0gICAgdHJ5Ci0gICAgewotICAgICAgSW50ZWdlci5wYXJzZUludChwZXJzcGVjdGl2ZVN0cmluZyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFLHBlcnNwZWN0aXZlU3RyaW5nKTsKLSAgICAgIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlciA9IG5ldyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlcigpOwotICAgICAgcGFyc2VyLnBhcnNlUmVxdWVzdChyZXF1ZXN0LEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKTsKLSAgICAgIHJlc3VsdCA9IHByb2Nlc3NQYXJzZWRSZXN1bHRzKHBhcnNlcik7Ci0gICAgICByZW1vdmVkUHJvcGVydGllc18ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkISAtIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCi0gICAgfQotICAgIGNhdGNoIChNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgcGVyc3BlY3RpdmUgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSkpOwotICAgIGNvbnRyb2xsZXJfLnNldEN1cnJlbnRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZSk7Ci0gICAgYWRkVG9IaXN0b3J5KHBlcnNwZWN0aXZlLGdldEFjdGlvbkxpbmsocGVyc3BlY3RpdmUsdHJ1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDA0OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvVG9nZ2xlTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuTm9kZUlkVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9nZ2xlTm9kZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE5vZGUgdG9nZ2xlZE5vZGVfOwotICBwdWJsaWMgVG9nZ2xlTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLG5vZGVNYW5hZ2VyKTsKLSAgICB0b2dnbGVkTm9kZV8gPSBudWxsOwotICB9Ci0KLSAgLy8gVG9nZ2xlIHRoZSBjdXJyZW50IG5vZGUgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGlmZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gIC8vIGlzIGEgcmVsYXRlZCBkZXNjZW5kYW50IG9mIGEgY29sbGFwc2VkIG5vZGUuCi0gIC8qKgotICAqIFRvZ2dsZSB0aGUgY3VycmVudCBub2RlIGFuZCB1cGRhdGUgdGhlIHNlbGVjdGlvbiBpZmYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAqIG5vZGUgaXMgYSByZWxhdGVkIGRlc2NlbmRhbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdGhlIGN1cnJlbnQgbm9kZSBpcwotICAqIG5vdyBjb2xsYXBzZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBhY3Rpb24uCi0gICoKLSAgKiBAcGFyYW0gaW50IFRoZSBub2RlIElEIG9mIHRoZSBub2RlIGZvciB3aGljaCB0aGlzIGFjdGlvbiBhcHBsaWVzIHRvLgotICAqIEByZXR1cm4gYm9vbGVhbiBJbmRpY2F0b3Igb2Ygd2hldGhlciBvciBub3QgYSBzZWxlY3Rpb24gY2hhbmdlIHdhcyBuZWNlc3NhcnkuCi0gICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHBlcmZvcm1CYXNlQWN0aW9uKGludCBub2RlSWQpCi0gIHsKLSAgICB0b2dnbGVkTm9kZV8gPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpOwotICAgIG5vZGVNYW5hZ2VyXy5zZXRGb2N1c2VkTm9kZUlkKG5vZGVJZCk7Ci0gICAgdG9nZ2xlZE5vZGVfLnNldFZpc2liaWxpdHlPZkNoaWxkcmVuKCF0b2dnbGVkTm9kZV8uaXNPcGVuKCkpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIXNlbGVjdGVkTm9kZS5pc1Zpc2libGUoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0U2VsZWN0ZWROb2RlSWQobm9kZUlkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaWYgKCFpc1N0YWxlTm9kZShub2RlSWQpKQotICAgIHsKLSAgICAgIGlmIChwZXJmb3JtQmFzZUFjdGlvbihub2RlSWQpKQotICAgICAgewotICAgICAgICAvLyBTYXZlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHRvZ2dsZSBsaW5rIGluIHRoZSBoaXN0b3J5LgotICAgICAgICBhZGRUb0hpc3RvcnkoZ2V0UGVyc3BlY3RpdmVJZCgpLGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkpOwotICAgICAgfQotICAgICAgLy8gRG8gbm90IHNhdmUgdGhlIHRvZ2dsZSBpbiBoaXN0b3J5LgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHNldFN0YWxlQnJlYWRDcnVtYigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldFRvZ2dsZWROb2RlKCkKLSAgewotICAgIHJldHVybiB0b2dnbGVkTm9kZV87Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIHJldHVybiBuZXcgSVRyYW5zZm9ybWVyW10ge25ldyBOb2RlSWRUcmFuc2Zvcm1lcihjb250cm9sbGVyXyl9OwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBlcnNwZWN0aXZlSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1ZhbGlkYXRlRWRpdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvVmFsaWRhdGVFZGl0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Yzk1NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvVmFsaWRhdGVFZGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVFZGl0QWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJhY3Rpb25zL1ZhbGlkYXRlRWRpdEFjdGlvbkpTUC5qc3AiOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIHBvcHVsYXRlUHJvcGVydHlUYWJsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1dTRExGaWxlTmFtZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvV1NETEZpbGVOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzFlYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvV1NETEZpbGVOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRmlsZU5hbWVIZWxwZXIKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRfID0gInRlbXAud3NkbCI7Ci0gIAotICAvKioKLSAgKiBHaXZlbiBhIHdzZGwgcGF0aCAoZmlsZSwgVVJMIGV0Yy4pLCBndWVzcyBhdCB0aGUgZmlsZSBuYW1lIGJ5IGxvb2tpbmcgZm9yIHRoZSAud3NkbCBleHRlbnNpb24gYXQgdGhlIGVuZCBvZiB0aGUKLSAgKiBwYXRoIGFuZCB0aGUgZmlsZSB0aGF0IGl0IGJlbG9uZ3MgdG8uIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCByZXR1cm4gdGhlIGRlZmF1bHQgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLgotICAqIEBwYXJhbSBTdHJpbmcgVGhlIHBhdGggKGZpbGUsIFVSTCBldGMuKSBvZiB0aGlzIFdTREwgZmlsZS4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgV1NETCBmaWxlIG5hbWUgZGV0ZXJtaW5lZCBieSB0aGlzIHJvdXRpbmUuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFdTRExGaWxlTmFtZShTdHJpbmcgd3NkbFBhdGhuYW1lKQotICB7Ci0gICAgaWYgKHdzZGxQYXRobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh3c2RsUGF0aG5hbWUuZW5kc1dpdGgoIi53c2RsIikpCi0gICAgICB7Ci0gICAgICAgIGludCBsYXN0U2VwYXJhdG9yUG9zID0gTWF0aC5tYXgod3NkbFBhdGhuYW1lLmxhc3RJbmRleE9mKCIvIiksd3NkbFBhdGhuYW1lLmxhc3RJbmRleE9mKCJcXCIpKTsKLSAgICAgICAgaWYgKGxhc3RTZXBhcmF0b3JQb3MgPiAwKQotICAgICAgICAgIHJldHVybiB3c2RsUGF0aG5hbWUuc3Vic3RyaW5nKGxhc3RTZXBhcmF0b3JQb3MrMSx3c2RsUGF0aG5hbWUubGVuZ3RoKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGVmYXVsdF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1dyaXRlV1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Xcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjk2ZDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1dyaXRlV1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1wdWJsaWMgY2xhc3MgV3JpdGVXU0RMVG9Xb3JrYmVuY2hBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gImFjdGlvbnMvV3JpdGVXU0RMVG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwIjsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vY29uc3RhbnRzL0FjdGlvbklucHV0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9BY3Rpb25JbnB1dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmOTc4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vY29uc3RhbnRzL0FjdGlvbklucHV0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEFjdGlvbklucHV0cwotewotICAvLyBVUkwgcGFybSBmb3IgYWxsIGFjdGlvbnMgd2hpY2ggYXJlIGluIHRoZSBoaXN0b3J5IGxpc3QuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTSElTVE9SWSA9ICJpc0hpc3RvcnkiOwotCi0gIC8vIFV0aWxpdHkgY29uc3RhbnQgZm9yIHRyZWUgbm9kZSBpZGVudGlmaWNhdGlvbi4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERUlEID0gIm5vZGVJZCI7Ci0KLSAgLy8gVXRpbGl0eSBjb25zdGFudCBmb3IgdG9vbCBpZGVudGlmaWNhdGlvbi4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTElEID0gInRvb2xJZCI7Ci0KLSAgLy8gVXRpbGl0eSBjb25zdGFudCBmb3IgdmlldyBpZGVudGlmaWNhdGlvbi4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV0lEID0gInZpZXdJZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJRVdJRF9ERUZBVUxUID0gLTE7Ci0KLSAgLy8gVXRpbGl0eSBjb25zdGFudCBmb3IgdmlldyB0b29sIGlkZW50aWZpY2F0aW9uLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXVE9PTElEID0gInZpZXdUb29sSWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSUVXVE9PTElEX0RFRkFVTFQgPSAtMTsKLQotICAvLyBVdGlsaXR5IGNvbnN0YW50cyBmb3IgdHJhbnNwb3J0IGNsYXNzZXMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0NMQVNTX05BTUUgPSAib3JnLnVkZGk0ai5UcmFuc3BvcnRDbGFzc05hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFTUE9SVF9DTEFTUyA9ICJvcmcudWRkaTRqLnRyYW5zcG9ydC5BcGFjaGVBeGlzVHJhbnNwb3J0IjsKLSAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX1RSQU5TUE9SVF9DTEFTUyA9ICJvcmcudWRkaTRqLnRyYW5zcG9ydC5BcGFjaGVBeGlzVHJhbnNwb3J0IjsKLSAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1RSQU5TUE9SVF9DTEFTUyA9ICJvcmcudWRkaTRqLnRyYW5zcG9ydC5BcGFjaGVTT0FQVHJhbnNwb3J0IjsKLQotICAvLyBUb2dnbGVOb2RlQWN0aW9uIGFuZCBpdHMgZGVyaXZhdGl2ZXMuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU4gPSAib3BlbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5fTk9ERSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT1NFX05PREUgPSAwOwotCi0gIC8vIFNob3dQZXJzcGVjdGl2ZUFjdGlvbgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUEVDVElWRSA9ICJwZXJzcGVjdGl2ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNQRUNUSVZFX1VEREkgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTUEVDVElWRV9XU0lMID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU1BFQ1RJVkVfV1NETCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNQRUNUSVZFX0ZBVk9SSVRFUyA9IDM7Ci0KLSAgLy8gUmV0cmlldmVIaXN0b3J5QWN0aW9uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVTVAgPSAianVtcCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpVTVBfRk9SV0FSRCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpVTVBfQkFDSyA9IC0xOwotCi0gIC8vIExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0VCX1NFUlZJQ0VfV0laQVJEID0gIndlYlNlcnZpY2VXaXphcmQiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXRUJfU0VSVklDRV9DTElFTlRfV0laQVJEID0gMDsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0VCX1NFUlZJQ0VfU0tFTEVUT05fV0laQVJEID0gMTsKLQotICAvLyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbgotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXT1JLQkVOQ0hfUFJPSkVDVF9OQU1FID0gIndvcmtiZW5jaFByb2plY3ROYW1lIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX0ZJTEUgPSAiaW1wb3J0V1NETCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElNUE9SVEVEX0ZJTEVfTkFNRSA9ICJpbXBvcnRlZEZpbGVOYW1lIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1RPX1dTSUwgPSAiaW1wb3J0VG9XU0lMIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9GSUxFX05BTUUgPSAiV1NJTEZpbGVOYW1lIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JURURfV1NETF9VUkwgPSAiaW1wb3J0ZWRXc2RsVXJsIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX0FDVElPTiA9ICJpbXBvcnRBY3Rpb24iOwotCi0gIC8vIFByb3h5TG9hZEFjdGlvbgotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVJHRVRfUEFHRSA9ICJ0YXJnZXRQYWdlIjsKLQotICAvLyBTZXNzaW9uIElEIGZvciBwb3AgdXBzIHdob3NlIGJyb3dzZXJzIGNob29zZSB0byBpZ25vcmUgdGhlIHNlc3Npb24uCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFU1NJT05JRCA9ICJzSWQiOwotCi0gIC8vIFdTREwgQnJvd3NlcgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUID0gInByb2plY3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWSA9ICJjYXRlZ29yeSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfVFlQRSA9ICJ3c2RsVHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTRExfVFlQRV9TRVJWSUNFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCA9ICJ3ZWJQcm9qZWN0V1NETFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0ZBVk9SSVRFX1dTRExfVVJMID0gImZhdm9yaXRlV1NETFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1dTRExfVVJMID0gIndzZGxVUkwiOwotCi0gIC8vIENhbGVuZGFyIEJyb3dzZXIKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMRU5EQVJfVFlQRSA9ICJjYWxlbmRhclR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxFTkRBUl9UWVBFX0RBVEUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxFTkRBUl9UWVBFX0RBVEVUSU1FID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMRU5EQVJfVFlQRV9HWUVBUk1PTlRIID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMRU5EQVJfVFlQRV9HREFZID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMRU5EQVJfVFlQRV9HTU9OVEhEQVkgPSA0OwotCi0gIC8vIFJlc2l6ZUZyYW1lQWN0aW9uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FX05BTUUgPSAiZnJhbWVOYW1lIjsKLQotICAvLyBPdGhlciBBY3Rpb25zCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVE9PTF9NQU5BR0VSID0gImN1cnJlbnRUb29sTWFuYWdlciI7Ci0gIAotICAvLyBBY3Rpb24gRW5naW5lCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTkdJTkVfU0NFTkFSSU8gPSAiYWN0aW9uRW5naW5lU2NlbmFyaW8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5HSU5FX01PREUgPSAiYWN0aW9uRW5naW5lTW9kZSI7Ci0KLSAgLy8gTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElQQVJUX0ZPUk1fREFUQV9QQVJTRVIgPSAibXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9jb25zdGFudHMvRnJhbWVOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9GcmFtZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzFmNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9GcmFtZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBGcmFtZU5hbWVzCi17Ci0gIC8vIHdzZXhwbG9yZXIuanNwCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdJTkRPV19OQU1FX1dTRVhQTE9SRVJfSlNQID0gIndzZXhwbG9yZXIuanNwIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEVSU1BFQ1RJVkVfV09SS0FSRUEgPSAicGVyc3BlY3RpdmVfd29ya2FyZWEiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRVJTUEVDVElWRV9UT09MQkFSID0gInBlcnNwZWN0aXZlX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRVJTUEVDVElWRV9DT05URU5UID0gInBlcnNwZWN0aXZlX2NvbnRlbnQiOwotICAKLSAgLy8gV1NETCBCcm93c2VyCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfVE9PTEJBUiA9ICJ3c2RsX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlQgPSAid3NkbF9jb250ZW50IjsKLSAgCi0gIC8vIENhbGVuZGFyIEJyb3dzZXIKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FMRU5EQVJfVE9PTEJBUiA9ICJjYWxlbmRhcl90b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FMRU5EQVJfQ09OVEVOVCA9ICJjYWxlbmRhcl9jb250ZW50IjsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9Nb2RlbENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9Nb2RlbENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDU1NTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9jb25zdGFudHMvTW9kZWxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIE1vZGVsQ29uc3RhbnRzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9JRCA9ICJyZWxhdGlvbnNoaXBJZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9MT0NBTE5BTUVfU0VQQVJBVE9SID0gIiMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfT1dORVIgPSAib3duZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfQ0hJTERSRU4gPSAiY2hpbGRyZW4iOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9Ub29sVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9jb25zdGFudHMvVG9vbFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzEzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9Ub29sVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgVG9vbFR5cGVzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGT1JNID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEFDVElPTiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBWSUVXID0gMjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9kYXRhbW9kZWwvTGlzdEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9kYXRhbW9kZWwvTGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmM2YzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZGF0YW1vZGVsL0xpc3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotCi1wdWJsaWMgY2xhc3MgTGlzdEVsZW1lbnQKLXsKLSAgcHJpdmF0ZSBpbnQgdmlld0lkXzsKLSAgcHJpdmF0ZSBPYmplY3Qgb2JqZWN0XzsKLSAgLy8gRm9yIHNlYXJjaCBwYXJhbWV0ZXJzOiBpbmZvIG9uIHRoZSBOb2RlIGFuZCBWaWV3VG9vbCBob2xkaW5nIHRoaXMgZWxlbWVudC4KLSAgcHJpdmF0ZSBpbnQgdGFyZ2V0Tm9kZUlkXzsKLSAgcHJpdmF0ZSBpbnQgdGFyZ2V0VG9vbElkXzsKLSAgcHJpdmF0ZSBpbnQgdGFyZ2V0Vmlld0lkXzsKLQotICBwdWJsaWMgTGlzdEVsZW1lbnQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIG9iamVjdF8gPSBvYmplY3Q7Ci0gICAgdmlld0lkXyA9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVDsKLSAgICB0YXJnZXROb2RlSWRfID0gLTE7Ci0gICAgdGFyZ2V0VG9vbElkXyA9IC0xOwotICAgIHRhcmdldFZpZXdJZF8gPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldE9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gb2JqZWN0XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZpZXdJZChpbnQgdmlld0lkKQotICB7Ci0gICAgdmlld0lkXyA9IHZpZXdJZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Vmlld0lkKCkKLSAgewotICAgIHJldHVybiB2aWV3SWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0VGFyZ2V0Vmlld1Rvb2xJbmZvKGludCBub2RlSWQsaW50IHRvb2xJZCxpbnQgdmlld0lkKQotICB7Ci0gICAgdGFyZ2V0Tm9kZUlkXyA9IG5vZGVJZDsKLSAgICB0YXJnZXRUb29sSWRfID0gdG9vbElkOwotICAgIHRhcmdldFZpZXdJZF8gPSB2aWV3SWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFRhcmdldE5vZGVJZCgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0Tm9kZUlkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGFyZ2V0VG9vbElkKCkKLSAgewotICAgIHJldHVybiB0YXJnZXRUb29sSWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRUYXJnZXRWaWV3SWQoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldFZpZXdJZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBnZXRPYmplY3QoKS50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZGF0YW1vZGVsL0xpc3RNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZGF0YW1vZGVsL0xpc3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYmQxNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2RhdGFtb2RlbC9MaXN0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIExpc3RNYW5hZ2VyCi17Ci0gIHByaXZhdGUgaW50IG5leHRWaWV3SWRfOwotICBwcml2YXRlIFZlY3RvciBpdGVtc0xpc3RfOwotICBwcml2YXRlIEhhc2h0YWJsZSBpdGVtc1RhYmxlXzsKLQotICBwdWJsaWMgTGlzdE1hbmFnZXIoKQotICB7Ci0gICAgbmV4dFZpZXdJZF8gPSAwOwotICAgIGl0ZW1zTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgaXRlbXNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgdXBkYXRlTWFuYWdlcihMaXN0RWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaXRlbXNUYWJsZV8ucHV0KFN0cmluZy52YWx1ZU9mKG5leHRWaWV3SWRfKSxlbGVtZW50KTsKLSAgICBlbGVtZW50LnNldFZpZXdJZChuZXh0Vmlld0lkXyk7Ci0gICAgbmV4dFZpZXdJZF8rKzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFkZChMaXN0RWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaXRlbXNMaXN0Xy5hZGRFbGVtZW50KGVsZW1lbnQpOwotICAgIHVwZGF0ZU1hbmFnZXIoZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBhZGRXaXRoQ3VycmVudFZpZXdJZChMaXN0RWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaXRlbXNMaXN0Xy5hZGRFbGVtZW50KGVsZW1lbnQpOwotICAgIGl0ZW1zVGFibGVfLnB1dChTdHJpbmcudmFsdWVPZihlbGVtZW50LmdldFZpZXdJZCgpKSxlbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBMaXN0RWxlbWVudCBlbGVtZW50QXQoaW50IGluZGV4KQotICB7Ci0gICAgcmV0dXJuIChMaXN0RWxlbWVudClpdGVtc0xpc3RfLmVsZW1lbnRBdChpbmRleCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTGlzdEVsZW1lbnQgZ2V0RWxlbWVudFdpdGhWaWV3SWQoaW50IHZpZXdJZCkKLSAgewotICAgIHJldHVybiAoTGlzdEVsZW1lbnQpaXRlbXNUYWJsZV8uZ2V0KFN0cmluZy52YWx1ZU9mKHZpZXdJZCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlRWxlbWVudFdpdGhWaWV3SWQoaW50IHZpZXdJZCkKLSAgewotICAgIGl0ZW1zVGFibGVfLnJlbW92ZShTdHJpbmcudmFsdWVPZih2aWV3SWQpKTsKLSAgICBmb3IgKGludCBpPTA7aTxpdGVtc0xpc3RfLnNpemUoKTtpKyspCi0gICAgewotICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSBlbGVtZW50QXQoaSk7Ci0gICAgICBpZiAobGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCkgPT0gdmlld0lkKQotICAgICAgewotICAgICAgICBpdGVtc0xpc3RfLnJlbW92ZUVsZW1lbnRBdChpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlRWxlbWVudEF0KGludCBpbmRleCkKLSAgewotICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWVsZW1lbnRBdChpbmRleCk7Ci0gICAgaXRlbXNMaXN0Xy5yZW1vdmVFbGVtZW50QXQoaW5kZXgpOwotICAgIGl0ZW1zVGFibGVfLnJlbW92ZShTdHJpbmcudmFsdWVPZihsaXN0RWxlbWVudC5nZXRWaWV3SWQoKSkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgaW5zZXJ0RWxlbWVudEF0KExpc3RFbGVtZW50IGVsZW1lbnQsaW50IGluZGV4KQotICB7Ci0gICAgaXRlbXNMaXN0Xy5pbnNlcnRFbGVtZW50QXQoZWxlbWVudCxpbmRleCk7Ci0gICAgdXBkYXRlTWFuYWdlcihlbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBFbnVtZXJhdGlvbiBnZXRMaXN0RWxlbWVudHMoKQotICB7Ci0gICAgcmV0dXJuIGl0ZW1zTGlzdF8uZWxlbWVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKCkKLSAgewotICAgIGl0ZW1zTGlzdF8ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBpdGVtc1RhYmxlXy5jbGVhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIExpc3RNYW5hZ2VyIGNvcHkoTGlzdE1hbmFnZXIgbmV3TGlzdE1hbmFnZXIpCi0gIHsKLSAgICBuZXdMaXN0TWFuYWdlci5jbGVhcigpOwotICAgIGZvciAoaW50IGk9MDtpPGl0ZW1zTGlzdF8uc2l6ZSgpO2krKykKLSAgICB7Ci0gICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCllbGVtZW50QXQoaSk7Ci0gICAgICBMaXN0RWxlbWVudCBuZXdMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudChsaXN0RWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICBuZXdMaXN0RWxlbWVudC5zZXRWaWV3SWQobGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCkpOwotICAgICAgbmV3TGlzdEVsZW1lbnQuc2V0VGFyZ2V0Vmlld1Rvb2xJbmZvKGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpLGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpLGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpKTsKLSAgICAgIG5ld0xpc3RNYW5hZ2VyLmFkZFdpdGhDdXJyZW50Vmlld0lkKG5ld0xpc3RFbGVtZW50KTsKLSAgICB9Ci0gICAgbmV3TGlzdE1hbmFnZXIuc2V0TmV4dFZpZXdJZChuZXh0Vmlld0lkXyk7Ci0gICAgcmV0dXJuIG5ld0xpc3RNYW5hZ2VyOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0TmV4dFZpZXdJZChpbnQgbmV4dFZpZXdJZCkKLSAgewotICAgIG5leHRWaWV3SWRfID0gbmV4dFZpZXdJZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TmV4dFZpZXdJZCgpCi0gIHsKLSAgICByZXR1cm4gbmV4dFZpZXdJZF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9kYXRhbW9kZWwvVHJlZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9kYXRhbW9kZWwvVHJlZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyOGFkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZGF0YW1vZGVsL1RyZWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBUcmVlRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotICBwcml2YXRlIFN0cmluZyBrZXlfOwotCi0gIHB1YmxpYyBUcmVlRWxlbWVudChTdHJpbmcgbmFtZSxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIGtleV8gPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gIHsKLSAgICBrZXlfID0ga2V5OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICB7Ci0gICAgcmV0dXJuIGtleV87Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVHJlZUVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChrZXlfID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGtleV8uZXF1YWxzKGVsZW1lbnQuZ2V0S2V5KCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL0FjdGlvbkRhdGFQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvQWN0aW9uRGF0YVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjEzZjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvQWN0aW9uRGF0YVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmNvbnN0YW50cy5BY3Rpb25EYXRhQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuZGF0YS5BY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuZGF0YS5TY2VuYXJpb0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlRyYW5zYWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIEFjdGlvbkRhdGFQYXJzZXIKLXsKLSAgcHJpdmF0ZSBEb2N1bWVudCBkb2M7Ci0KLSAgcHVibGljIFNjZW5hcmlvRGVzY3JpcHRvciBwYXJzZVNjZW5hcmlvKEVsZW1lbnQgZSkKLSAgewotICAgIFNjZW5hcmlvRGVzY3JpcHRvciBzY2VuYXJpb0Rlc2NyaXB0b3IgPSBuZXcgU2NlbmFyaW9EZXNjcmlwdG9yKCk7Ci0gICAgTm9kZUxpc3QgdHJhbnNhY3Rpb25zID0gZS5nZXRFbGVtZW50c0J5VGFnTmFtZShBY3Rpb25EYXRhQ29uc3RhbnRzLkVMRU1FTlRfVFJBTlNBQ1RJT04pOwotICAgIFRyYW5zYWN0aW9uRGVzY3JpcHRvcltdIHRyYW5zYWN0aW9uRGVzY3JpcHRvcnMgPSBuZXcgVHJhbnNhY3Rpb25EZXNjcmlwdG9yW3RyYW5zYWN0aW9ucy5nZXRMZW5ndGgoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotICAgICAgdHJhbnNhY3Rpb25EZXNjcmlwdG9yc1tpXSA9IHBhcnNlVHJhbnNhY3Rpb24oKEVsZW1lbnQpIHRyYW5zYWN0aW9ucy5pdGVtKGkpKTsKLSAgICBzY2VuYXJpb0Rlc2NyaXB0b3Iuc2V0VHJhbnNhY3Rpb25EZXNjcmlwdG9ycyh0cmFuc2FjdGlvbkRlc2NyaXB0b3JzKTsKLSAgICByZXR1cm4gc2NlbmFyaW9EZXNjcmlwdG9yOwotICB9Ci0KLSAgcHVibGljIFRyYW5zYWN0aW9uRGVzY3JpcHRvciBwYXJzZVRyYW5zYWN0aW9uKEVsZW1lbnQgZSkKLSAgewotICAgIFRyYW5zYWN0aW9uRGVzY3JpcHRvciB0cmFuc2FjdGlvbkRlc2NyaXB0b3IgPSBuZXcgVHJhbnNhY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgTm9kZUxpc3QgYWN0aW9ucyA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoQWN0aW9uRGF0YUNvbnN0YW50cy5FTEVNRU5UX0FDVElPTik7Ci0gICAgQWN0aW9uRGVzY3JpcHRvcltdIGFjdGlvbkRlc2NyaXB0b3JzID0gbmV3IEFjdGlvbkRlc2NyaXB0b3JbYWN0aW9ucy5nZXRMZW5ndGgoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykKLSAgICAgIGFjdGlvbkRlc2NyaXB0b3JzW2ldID0gcGFyc2VBY3Rpb24oKEVsZW1lbnQpIGFjdGlvbnMuaXRlbShpKSk7Ci0gICAgdHJhbnNhY3Rpb25EZXNjcmlwdG9yLnNldEFjdGlvbkRlc2NyaXB0b3JzKGFjdGlvbkRlc2NyaXB0b3JzKTsKLSAgICByZXR1cm4gdHJhbnNhY3Rpb25EZXNjcmlwdG9yOwotICB9Ci0KLSAgcHVibGljIEFjdGlvbkRlc2NyaXB0b3IgcGFyc2VBY3Rpb24oRWxlbWVudCBlKQotICB7Ci0gICAgQWN0aW9uRGVzY3JpcHRvciBhY3Rpb25EZXNjcmlwdG9yID0gbmV3IEFjdGlvbkRlc2NyaXB0b3IoKTsKLSAgICBhY3Rpb25EZXNjcmlwdG9yLnNldElkKGUuZ2V0QXR0cmlidXRlKEFjdGlvbkRhdGFDb25zdGFudHMuQVRUUl9JRCkpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGFjdGlvbkRlc2NyaXB0b3Iuc2V0QXR0ZW1wdHMoSW50ZWdlci5wYXJzZUludChlLmdldEF0dHJpYnV0ZShBY3Rpb25EYXRhQ29uc3RhbnRzLkFUVFJfQVRURU1QVFMpKSk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICBhY3Rpb25EZXNjcmlwdG9yLnNldEF0dGVtcHRzKDEpOwotICAgIH0KLSAgICBhY3Rpb25EZXNjcmlwdG9yLnNldFN0YXR1c0lkKGUuZ2V0QXR0cmlidXRlKEFjdGlvbkRhdGFDb25zdGFudHMuQVRUUl9TVEFUVVNfSUQpKTsKLSAgICBIYXNodGFibGUgcHJvcGVydGllc1RhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIE5vZGVMaXN0IHByb3BlcnRpZXMgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKEFjdGlvbkRhdGFDb25zdGFudHMuRUxFTUVOVF9QUk9QRVJUWSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCBwcm9wZXJ0eSA9IChFbGVtZW50KSBwcm9wZXJ0aWVzLml0ZW0oaSk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IHByb3BlcnR5LmdldEF0dHJpYnV0ZShBY3Rpb25EYXRhQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgICBOb2RlTGlzdCB2YWx1ZUxpc3QgPSBwcm9wZXJ0eS5nZXRFbGVtZW50c0J5VGFnTmFtZShBY3Rpb25EYXRhQ29uc3RhbnRzLkVMRU1FTlRfVkFMVUUpOwotICAgICAgaWYgKHZhbHVlTGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbdmFsdWVMaXN0LmdldExlbmd0aCgpXTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IHZhbHVlID0gKEVsZW1lbnQpIHZhbHVlTGlzdC5pdGVtKGopOwotICAgICAgICAgIE5vZGUgdGV4dE5vZGUgPSB2YWx1ZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgdmFsdWVzW2pdID0gKHRleHROb2RlICE9IG51bGwpID8gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpIDogIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydGllc1RhYmxlLnB1dChuYW1lLCB2YWx1ZXMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBOb2RlIHRleHROb2RlID0gKChFbGVtZW50KSB2YWx1ZUxpc3QuaXRlbSgwKSkuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBwcm9wZXJ0aWVzVGFibGUucHV0KG5hbWUsICh0ZXh0Tm9kZSAhPSBudWxsKSA/IHRleHROb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKSA6ICIiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYWN0aW9uRGVzY3JpcHRvci5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXNUYWJsZSk7Ci0gICAgTm9kZUxpc3Qgc3RhdHVzTGlzdCA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoQWN0aW9uRGF0YUNvbnN0YW50cy5FTEVNRU5UX1NUQVRVUyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNMaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCBzdGF0dXMgPSAoRWxlbWVudClzdGF0dXNMaXN0Lml0ZW0oaSk7Ci0gICAgICBDREFUQVNlY3Rpb24gY0RhdGEgPSAoQ0RBVEFTZWN0aW9uKXN0YXR1cy5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICBhY3Rpb25EZXNjcmlwdG9yLmFkZFN0YXR1cyhjRGF0YS5nZXREYXRhKCkpOwotICAgIH0KLSAgICByZXR1cm4gYWN0aW9uRGVzY3JpcHRvcjsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IHRvRWxlbWVudChTY2VuYXJpb0Rlc2NyaXB0b3Igc2NlbmFyaW9EZXNjcmlwdG9yKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotICAgICAgRWxlbWVudCBzY2VuYXJpb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEFjdGlvbkRhdGFDb25zdGFudHMuRUxFTUVOVF9TQ0VOQVJJTyk7Ci0gICAgICBUcmFuc2FjdGlvbkRlc2NyaXB0b3JbXSB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzID0gc2NlbmFyaW9EZXNjcmlwdG9yLmdldFRyYW5zYWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCB0cmFuc2FjdGlvbkVsZW1lbnQgPSB0b0VsZW1lbnQodHJhbnNhY3Rpb25EZXNjcmlwdG9yc1tpXSk7Ci0gICAgICAgIGlmICh0cmFuc2FjdGlvbkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICBzY2VuYXJpb0VsZW1lbnQuYXBwZW5kQ2hpbGQodHJhbnNhY3Rpb25FbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzY2VuYXJpb0VsZW1lbnQ7Ci0gICAgfQotICAgIGNhdGNoIChET01FeGNlcHRpb24gZG9tZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCB0b0VsZW1lbnQoVHJhbnNhY3Rpb25EZXNjcmlwdG9yIHRyYW5zYWN0aW9uRGVzY3JpcHRvcikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLSAgICAgIEVsZW1lbnQgdHJhbnNhY3Rpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChBY3Rpb25EYXRhQ29uc3RhbnRzLkVMRU1FTlRfVFJBTlNBQ1RJT04pOwotICAgICAgQWN0aW9uRGVzY3JpcHRvcltdIGFjdGlvbkRlc2NyaXB0b3JzID0gdHJhbnNhY3Rpb25EZXNjcmlwdG9yLmdldEFjdGlvbkRlc2NyaXB0b3JzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBFbGVtZW50IGFjdGlvbkVsZW1lbnQgPSB0b0VsZW1lbnQoYWN0aW9uRGVzY3JpcHRvcnNbaV0pOwotICAgICAgICBpZiAoYWN0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHRyYW5zYWN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChhY3Rpb25FbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cmFuc2FjdGlvbkVsZW1lbnQ7Ci0gICAgfQotICAgIGNhdGNoIChET01FeGNlcHRpb24gZG9tZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCB0b0VsZW1lbnQoQWN0aW9uRGVzY3JpcHRvciBhY3Rpb25EZXNjcmlwdG9yKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotICAgICAgRWxlbWVudCBhY3Rpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChBY3Rpb25EYXRhQ29uc3RhbnRzLkVMRU1FTlRfQUNUSU9OKTsKLSAgICAgIGFjdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKEFjdGlvbkRhdGFDb25zdGFudHMuQVRUUl9JRCwgYWN0aW9uRGVzY3JpcHRvci5nZXRJZCgpKTsKLSAgICAgIGFjdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKEFjdGlvbkRhdGFDb25zdGFudHMuQVRUUl9BVFRFTVBUUywgU3RyaW5nLnZhbHVlT2YoYWN0aW9uRGVzY3JpcHRvci5nZXRBdHRlbXB0cygpKSk7Ci0gICAgICBTdHJpbmcgc3RhdHVzSWQgPSBhY3Rpb25EZXNjcmlwdG9yLmdldFN0YXR1c0lkKCk7Ci0gICAgICBpZiAoc3RhdHVzSWQgIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoQWN0aW9uRGF0YUNvbnN0YW50cy5BVFRSX1NUQVRVU19JRCwgc3RhdHVzSWQpOwotICAgICAgSGFzaHRhYmxlIHByb3BlcnRpZXMgPSBhY3Rpb25EZXNjcmlwdG9yLmdldFByb3BlcnRpZXMoKTsKLSAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgICAgT2JqZWN0W10gdmFsdWVzOwotICAgICAgICAgIGlmICh2YWx1ZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkKLSAgICAgICAgICAgIHZhbHVlcyA9IChPYmplY3RbXSl2YWx1ZTsKLSAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgICAgICB2YWx1ZXMgPSAoKExpc3QpdmFsdWUpLnRvQXJyYXkoKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB2YWx1ZXMgPSBuZXcgT2JqZWN0W10ge3ZhbHVlfTsKLSAgICAgICAgICBib29sZWFuIGlzQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgICBFbGVtZW50IHByb3BlcnR5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoQWN0aW9uRGF0YUNvbnN0YW50cy5FTEVNRU5UX1BST1BFUlRZKTsKLSAgICAgICAgICBwcm9wZXJ0eUVsZW1lbnQuc2V0QXR0cmlidXRlKEFjdGlvbkRhdGFDb25zdGFudHMuQVRUUl9OQU1FLCBrZXkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWxlbWVudCB2YWx1ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEFjdGlvbkRhdGFDb25zdGFudHMuRUxFTUVOVF9WQUxVRSk7Ci0gICAgICAgICAgICAgIHZhbHVlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZXNbaV0udG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICBwcm9wZXJ0eUVsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWVFbGVtZW50KTsKLSAgICAgICAgICAgICAgaXNBZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpc0FkZGVkKQotICAgICAgICAgICAgYWN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChwcm9wZXJ0eUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBMaXN0IHN0YXR1cyA9IGFjdGlvbkRlc2NyaXB0b3IuZ2V0U3RhdHVzKCk7Ci0gICAgICBpZiAoc3RhdHVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzdGF0dXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgc3RhdHVzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoQWN0aW9uRGF0YUNvbnN0YW50cy5FTEVNRU5UX1NUQVRVUyk7Ci0gICAgICAgICAgQ0RBVEFTZWN0aW9uIGNEYXRhID0gZG9jdW1lbnQuY3JlYXRlQ0RBVEFTZWN0aW9uKGl0Lm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICBzdGF0dXNFbGVtZW50LmFwcGVuZENoaWxkKGNEYXRhKTsKLSAgICAgICAgICBhY3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKHN0YXR1c0VsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYWN0aW9uRWxlbWVudDsKLSAgICB9Ci0gICAgY2F0Y2ggKERPTUV4Y2VwdGlvbiBkb21lKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgZG9jID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0gICAgY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZmNlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9BY3Rpb25FbmdpbmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvQWN0aW9uRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YWU4NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9BY3Rpb25FbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2hvd1BlcnNwZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuY29uc3RhbnRzLkFjdGlvbkRhdGFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLkFjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlNjZW5hcmlvRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmRhdGEuVHJhbnNhY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uRW5naW5lCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0RJU0FCTEVEID0gMHgwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9TVE9QID0gMHgxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9SRUNPUkQgPSAweDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX1BMQVkgPSAweDM7Ci0KLSAgcHJpdmF0ZSBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0gIHByaXZhdGUgYnl0ZSBtb2RlOwotICBwcml2YXRlIFZlY3RvciBhY3Rpb25EZXNjcmlwdG9yczsKLQotICBwdWJsaWMgQWN0aW9uRW5naW5lKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0gICAgbW9kZSA9IE1PREVfRElTQUJMRUQ7Ci0gICAgYWN0aW9uRGVzY3JpcHRvcnMgPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlU2NlbmFyaW8oU2NlbmFyaW9EZXNjcmlwdG9yIHNjZW5hcmlvRGVzY3JpcHRvcikKLSAgewotICAgIFRyYW5zYWN0aW9uRGVzY3JpcHRvcltdIHRyYW5zYWN0aW9uRGVzY3JpcHRvcnMgPSBzY2VuYXJpb0Rlc2NyaXB0b3IuZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdG9ycygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykKLSAgICAgIGV4ZWN1dGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbkRlc2NyaXB0b3JzW2ldKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVUcmFuc2FjdGlvbihUcmFuc2FjdGlvbkRlc2NyaXB0b3IgdHJhbnNhY3Rpb25EZXNjcmlwdG9yKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIEFjdGlvbkRlc2NyaXB0b3JbXSBhY3Rpb25EZXNjcmlwdG9ycyA9IHRyYW5zYWN0aW9uRGVzY3JpcHRvci5nZXRBY3Rpb25EZXNjcmlwdG9ycygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHJlc3VsdCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFleGVjdXRlQWN0aW9uKGFjdGlvbkRlc2NyaXB0b3JzW2ldKSkKLSAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgYWN0aW9uRGVzY3JpcHRvcnNbaV0uc2V0U3RhdHVzSWQoQWN0aW9uRGF0YUNvbnN0YW50cy5WQUxVRV9TVEFUVVNfSURfVU5BVFRFTVBURUQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZUFjdGlvbihBY3Rpb25EZXNjcmlwdG9yIGFjdGlvbkRlc2NyaXB0b3IpCi0gIHsKLSAgICBpbnQgYXR0ZW1wdHMgPSBhY3Rpb25EZXNjcmlwdG9yLmdldEF0dGVtcHRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRlbXB0czsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBDbGFzcyBjbGFzc0FjdGlvbiA9IENsYXNzLmZvck5hbWUoYWN0aW9uRGVzY3JpcHRvci5nZXRJZCgpKTsKLSAgICAgICAgaWYgKEFjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXNzQWN0aW9uKSkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBuZXdJbnN0YW5jZShjbGFzc0FjdGlvbik7Ci0gICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0aWVzID0gYWN0aW9uRGVzY3JpcHRvci5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBJVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMgPSBhY3Rpb24uZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRyYW5zZm9ybWVycy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgcHJvcGVydGllcyA9IHRyYW5zZm9ybWVyc1tqXS5kZU5vcm1hbGl6ZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGFjdGlvbi5zZXRQcm9wZXJ0eVRhYmxlKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAvLyBUT0RPIGFjdGlvbkRlc2NyaXB0b3IuYWRkU3RhdHVzKGFjdGlvbi5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uUmVzdWx0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhY3Rpb25EZXNjcmlwdG9yLnNldFN0YXR1c0lkKEFjdGlvbkRhdGFDb25zdGFudHMuVkFMVUVfU1RBVFVTX0lEX1BBU1NFRCk7Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihhY3Rpb25EZXNjcmlwdG9yLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKQotICAgICAgewotICAgICAgICBjbmZlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGNuZmUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOwotICAgICAgICBhY3Rpb25EZXNjcmlwdG9yLmFkZFN0YXR1cyhzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICB0LnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKLSAgICAgICAgYWN0aW9uRGVzY3JpcHRvci5hZGRTdGF0dXMoc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGFjdGlvbkRlc2NyaXB0b3Iuc2V0U3RhdHVzSWQoQWN0aW9uRGF0YUNvbnN0YW50cy5WQUxVRV9TVEFUVVNfSURfRkFJTEVEKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIFNjZW5hcmlvRGVzY3JpcHRvciBuZXdTY2VuYXJpb0Rlc2NyaXB0b3IoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTY2VuYXJpb0Rlc2NyaXB0b3IoKTsKLSAgfQotCi0gIHByaXZhdGUgVHJhbnNhY3Rpb25EZXNjcmlwdG9yIG5ld1RyYW5zYWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpOwotICB9Ci0KLSAgcHJpdmF0ZSBBY3Rpb25EZXNjcmlwdG9yIG5ld0FjdGlvbkRlc2NyaXB0b3IoQWN0aW9uIGFjdGlvbikKLSAgewotICAgIEFjdGlvbkRlc2NyaXB0b3IgYWN0aW9uRGVzY3JpcHRvciA9IG5ldyBBY3Rpb25EZXNjcmlwdG9yKCk7Ci0gICAgYWN0aW9uRGVzY3JpcHRvci5zZXRJZChhY3Rpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZShhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpKTsKLSAgICBJVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMgPSBhY3Rpb24uZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1lcnMubGVuZ3RoOyBpKyspCi0gICAgICBwcm9wZXJ0aWVzID0gdHJhbnNmb3JtZXJzW2ldLm5vcm1hbGl6ZShwcm9wZXJ0aWVzKTsKLSAgICBhY3Rpb25EZXNjcmlwdG9yLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgcmV0dXJuIGFjdGlvbkRlc2NyaXB0b3I7Ci0gIH0KLQotICBwcml2YXRlIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyBjKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gaW5zdGFudGlhdGVzIHRoZSBhY3Rpb24gdXNpbmcgdGhlIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgaW4gYQotICAgICAgLy8gY29udHJvbGxlciBvYmplY3QKLSAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gYy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtDb250cm9sbGVyLmNsYXNzfSk7Ci0gICAgICByZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2NvbnRyb2xsZXJ9KTsKLSAgICB9Ci0gICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgIH0KLSAgICBPYmplY3QgaW5zdGFuY2UgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGluc3RhbnRpYXRlcyB0aGUgYWN0aW9uIHVzaW5nIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGMuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzWzBdKTsKLSAgICAgIGluc3RhbmNlID0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFswXSk7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gYy5nZXRNZXRob2QoInNldENvbnRyb2xsZXIiLCBuZXcgQ2xhc3NbXXtDb250cm9sbGVyLmNsYXNzfSk7Ci0gICAgICBtZXRob2QuaW52b2tlKGluc3RhbmNlLCBuZXcgT2JqZWN0W117Y29udHJvbGxlcn0pOwotICAgIH0KLSAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICBwdWJsaWMgYnl0ZSBnZXRNb2RlKCkKLSAgewotICAgIHJldHVybiBtb2RlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2RlKGJ5dGUgbW9kZSkKLSAgewotICAgIHRoaXMubW9kZSA9IG1vZGU7Ci0gICAgaWYgKG1vZGUgPT0gTU9ERV9SRUNPUkQpCi0gICAgewotICAgICAgYWN0aW9uRGVzY3JpcHRvcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBTaG93UGVyc3BlY3RpdmVBY3Rpb24gc2hvd1BlcnNwZWN0aXZlQWN0aW9uID0gbmV3IFNob3dQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIHNob3dQZXJzcGVjdGl2ZUFjdGlvbi5hZGRQcm9wZXJ0eShBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkUsIFN0cmluZy52YWx1ZU9mKGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0UGVyc3BlY3RpdmVJZCgpKSk7Ci0gICAgICBhY3Rpb25EZXNjcmlwdG9ycy5hZGQobmV3QWN0aW9uRGVzY3JpcHRvcihzaG93UGVyc3BlY3RpdmVBY3Rpb24pKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVBY3Rpb24oQWN0aW9uIGFjdGlvbikKLSAgewotICAgIGlmIChtb2RlID09IE1PREVfUkVDT1JEKQotICAgIHsKLSAgICAgIEFjdGlvbkRlc2NyaXB0b3IgYWN0aW9uRGVzY3JpcHRvciA9IG5ld0FjdGlvbkRlc2NyaXB0b3IoYWN0aW9uKTsKLSAgICAgIGFjdGlvbkRlc2NyaXB0b3JzLmFkZChhY3Rpb25EZXNjcmlwdG9yKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgfQotICAKLSAgcHVibGljIFNjZW5hcmlvRGVzY3JpcHRvciBnZXRTY2VuYXJpbygpCi0gIHsKLSAgICBTY2VuYXJpb0Rlc2NyaXB0b3Igc2NlbmFyaW9EZXNjcmlwdG9yID0gbmV3U2NlbmFyaW9EZXNjcmlwdG9yKCk7Ci0gICAgVHJhbnNhY3Rpb25EZXNjcmlwdG9yIHRyYW5zYWN0aW9uRGVzY3JpcHRvciA9IG5ld1RyYW5zYWN0aW9uRGVzY3JpcHRvcigpOwotICAgIEFjdGlvbkRlc2NyaXB0b3JbXSBhY3Rpb25EZXNjcmlwdG9yQXJyYXkgPSAoQWN0aW9uRGVzY3JpcHRvcltdKWFjdGlvbkRlc2NyaXB0b3JzLnRvQXJyYXkobmV3IEFjdGlvbkRlc2NyaXB0b3JbMF0pOwotICAgIHRyYW5zYWN0aW9uRGVzY3JpcHRvci5zZXRBY3Rpb25EZXNjcmlwdG9ycyhhY3Rpb25EZXNjcmlwdG9yQXJyYXkpOwotICAgIHNjZW5hcmlvRGVzY3JpcHRvci5zZXRUcmFuc2FjdGlvbkRlc2NyaXB0b3JzKG5ldyBUcmFuc2FjdGlvbkRlc2NyaXB0b3JbXSB7dHJhbnNhY3Rpb25EZXNjcmlwdG9yfSk7Ci0gICAgcmV0dXJuIHNjZW5hcmlvRGVzY3JpcHRvcjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvY29uc3RhbnRzL0FjdGlvbkRhdGFDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvY29uc3RhbnRzL0FjdGlvbkRhdGFDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1M2VlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2NvbnN0YW50cy9BY3Rpb25EYXRhQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGF0YUNvbnN0YW50cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FUVEVNUFRTID0gImF0dGVtcHRzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFUVVNfSUQgPSAic3RhdHVzSWQiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TQ0VOQVJJTyA9ICJzY2VuYXJpbyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVFJBTlNBQ1RJT04gPSAidHJhbnNhY3Rpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0FDVElPTiA9ICJhY3Rpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BST1BFUlRZID0gInByb3BlcnR5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9WQUxVRSA9ICJ2YWx1ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU1RBVFVTID0gInN0YXR1cyI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9TVEFUVVNfSURfVU5BVFRFTVBURUQgPSAidW5hdHRlbXB0ZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9TVEFUVVNfSURfUEFTU0VEID0gInBhc3NlZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1NUQVRVU19JRF9GQUlMRUQgPSAiZmFpbGVkIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2RhdGEvQWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9kYXRhL0FjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViYjViNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2RhdGEvQWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIGlkOwotICBwcml2YXRlIEhhc2h0YWJsZSBwcm9wZXJ0aWVzOwotICBwcml2YXRlIGludCBhdHRlbXB0czsKLSAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzSWQ7Ci0gIHByaXZhdGUgTGlzdCBzdGF0dXNMaXN0OwotICAKLSAgcHVibGljIEFjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgYXR0ZW1wdHMgPSAxOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLSAgewotICAgIHRoaXMuaWQgPSBpZDsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0UHJvcGVydGllcygpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0QXR0ZW1wdHMoKQotICB7Ci0gIAlyZXR1cm4gYXR0ZW1wdHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEF0dGVtcHRzKGludCBhdHRlbXB0cykKLSAgewotICAJdGhpcy5hdHRlbXB0cyA9IGF0dGVtcHRzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0lkKCkKLSAgewotICAgIHJldHVybiBzdGF0dXNJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U3RhdHVzSWQoU3RyaW5nIHN0YXR1c0lkKQotICB7Ci0gICAgdGhpcy5zdGF0dXNJZCA9IHN0YXR1c0lkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRTdGF0dXMoT2JqZWN0IHN0YXR1cykKLSAgewotICAgIGlmIChzdGF0dXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoc3RhdHVzTGlzdCA9PSBudWxsKQotICAgICAgICBzdGF0dXNMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgc3RhdHVzTGlzdC5hZGQoc3RhdHVzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZVN0YXR1cyhPYmplY3Qgc3RhdHVzKQotICB7Ci0gICAgaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1c0xpc3QgIT0gbnVsbCkKLSAgICAgIHJldHVybiBzdGF0dXNMaXN0LnJlbW92ZShzdGF0dXMpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiBzdGF0dXNMaXN0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9kYXRhL1NjZW5hcmlvRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9kYXRhL1NjZW5hcmlvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWEzZjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvZGF0YS9TY2VuYXJpb0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhOwotCi1wdWJsaWMgY2xhc3MgU2NlbmFyaW9EZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgVHJhbnNhY3Rpb25EZXNjcmlwdG9yW10gdHJhbnNhY3Rpb25EZXNjcmlwdG9yczsKLQotICBwdWJsaWMgVHJhbnNhY3Rpb25EZXNjcmlwdG9yW10gZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdG9ycygpCi0gIHsKLSAgICByZXR1cm4gdHJhbnNhY3Rpb25EZXNjcmlwdG9yczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25EZXNjcmlwdG9ycyhUcmFuc2FjdGlvbkRlc2NyaXB0b3JbXSB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzKQotICB7Ci0gICAgdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzID0gdHJhbnNhY3Rpb25EZXNjcmlwdG9yczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvZGF0YS9UcmFuc2FjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvZGF0YS9UcmFuc2FjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmNjdiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2RhdGEvVHJhbnNhY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuZGF0YTsKLQotcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uRGVzY3JpcHRvcgotewotICBwcml2YXRlIEFjdGlvbkRlc2NyaXB0b3JbXSBhY3Rpb25EZXNjcmlwdG9yczsKLQotICBwdWJsaWMgQWN0aW9uRGVzY3JpcHRvcltdIGdldEFjdGlvbkRlc2NyaXB0b3JzKCkKLSAgewotICAgIHJldHVybiBhY3Rpb25EZXNjcmlwdG9yczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QWN0aW9uRGVzY3JpcHRvcnMoQWN0aW9uRGVzY3JpcHRvcltdIGFjdGlvbkRlc2NyaXB0b3JzKQotICB7Ci0gICAgdGhpcy5hY3Rpb25EZXNjcmlwdG9ycyA9IGFjdGlvbkRlc2NyaXB0b3JzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9DdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL0N1cnJlbnROb2RlU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMGIyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL0N1cnJlbnROb2RlU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgSVRyYW5zZm9ybWVyCi17Ci0gIHByb3RlY3RlZCBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2V5OwotCi0gIHB1YmxpYyBDdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHRoaXMoY29udHJvbGxlciwgQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gIH0KLQotICBwdWJsaWMgQ3VycmVudE5vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lcihDb250cm9sbGVyIGNvbnRyb2xsZXIsIFN0cmluZyBrZXkpCi0gIHsKLSAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgIHRoaXMua2V5ID0ga2V5OwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBub3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotICAKLSAgcHVibGljIEhhc2h0YWJsZSBkZU5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIE5vZGUgY3Vyck5vZGUgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgaWYgKGN1cnJOb2RlICE9IG51bGwpCi0gICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIFN0cmluZy52YWx1ZU9mKGN1cnJOb2RlLmdldE5vZGVJZCgpKSk7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL0lUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9JVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1NWZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL0lUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGludGVyZmFjZSBJVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIEhhc2h0YWJsZSBub3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpOwotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL01hc3NOb2RlSWRUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9NYXNzTm9kZUlkVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxODY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL01hc3NOb2RlSWRUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgTWFzc05vZGVJZFRyYW5zZm9ybWVyIGV4dGVuZHMgTm9kZUlkVHJhbnNmb3JtZXIKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBtYXNzTm9kZUlkS2V5OwotCi0gIHB1YmxpYyBNYXNzTm9kZUlkVHJhbnNmb3JtZXIoQ29udHJvbGxlciBjb250cm9sbGVyLCBTdHJpbmcgbWFzc05vZGVJZEtleSkKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHRoaXMubWFzc05vZGVJZEtleSA9IG1hc3NOb2RlSWRLZXk7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIG5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIGlmICghcHJvcGVydGllcy5jb250YWluc0tleShtYXNzTm9kZUlkS2V5KSkKLSAgICAgIHJldHVybiBzdXBlci5ub3JtYWxpemUocHJvcGVydGllcyk7Ci0gICAgT2JqZWN0IG9yaWdOb2RlSWQgPSBwcm9wZXJ0aWVzLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBTdHJpbmdbXSBtYXNzTm9kZUlkcyA9IGdldFZhbHVlQXNTdHJpbmdBcnJheShwcm9wZXJ0aWVzLCBtYXNzTm9kZUlkS2V5KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hc3NOb2RlSWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHByb3BlcnRpZXMucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIG1hc3NOb2RlSWRzW2ldKTsKLSAgICAgIHByb3BlcnRpZXMgPSBzdXBlci5ub3JtYWxpemUocHJvcGVydGllcyk7Ci0gICAgICBTdHJpbmdbXSByZWxzID0gZ2V0VmFsdWVBc1N0cmluZ0FycmF5KHByb3BlcnRpZXMsIE1vZGVsQ29uc3RhbnRzLlJFTF9JRCk7Ci0gICAgICBpZiAocmVscy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKE1vZGVsQ29uc3RhbnRzLlJFTF9JRCk7Ci0gICAgICAgIHNiLmFwcGVuZChNb2RlbENvbnN0YW50cy5SRUxfTE9DQUxOQU1FX1NFUEFSQVRPUik7Ci0gICAgICAgIHNiLmFwcGVuZChtYXNzTm9kZUlkc1tpXSk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KHNiLnRvU3RyaW5nKCksIHJlbHMpOwotICAgICAgfQotICAgICAgcHJvcGVydGllcy5yZW1vdmUoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICBwcm9wZXJ0aWVzLnJlbW92ZShNb2RlbENvbnN0YW50cy5SRUxfSUQpOwotICAgIH0KLSAgICBpZiAob3JpZ05vZGVJZCAhPSBudWxsKQotICAgICAgcHJvcGVydGllcy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgb3JpZ05vZGVJZCk7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgaWYgKCFwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG1hc3NOb2RlSWRLZXkpKQotICAgICAgcmV0dXJuIHN1cGVyLmRlTm9ybWFsaXplKHByb3BlcnRpZXMpOwotICAgIFZlY3RvciBtYXNzTm9kZUlkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIE9iamVjdCBvcmlnTm9kZUlkID0gcHJvcGVydGllcy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgcHJvcGVydGllcy5yZW1vdmUoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgU3RyaW5nW10gbWFzc05vZGVJZHMgPSBnZXRWYWx1ZUFzU3RyaW5nQXJyYXkocHJvcGVydGllcywgbWFzc05vZGVJZEtleSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXNzTm9kZUlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKE1vZGVsQ29uc3RhbnRzLlJFTF9JRCk7Ci0gICAgICBzYi5hcHBlbmQoTW9kZWxDb25zdGFudHMuUkVMX0xPQ0FMTkFNRV9TRVBBUkFUT1IpOwotICAgICAgc2IuYXBwZW5kKG1hc3NOb2RlSWRzW2ldKTsKLSAgICAgIE9iamVjdCByZWxzID0gcHJvcGVydGllcy5nZXQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICBpZiAocmVscyAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0aWVzLnB1dChNb2RlbENvbnN0YW50cy5SRUxfSUQsIHJlbHMpOwotICAgICAgICBwcm9wZXJ0aWVzID0gc3VwZXIuZGVOb3JtYWxpemUocHJvcGVydGllcyk7Ci0gICAgICAgIE9iamVjdCBub2RlSWQgPSBwcm9wZXJ0aWVzLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgaWYgKG5vZGVJZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbWFzc05vZGVJZFZlY3Rvci5hZGQobm9kZUlkKTsKLSAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShNb2RlbENvbnN0YW50cy5SRUxfSUQpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAob3JpZ05vZGVJZCAhPSBudWxsKQotICAgICAgcHJvcGVydGllcy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgb3JpZ05vZGVJZCk7Ci0gICAgaW50IHNpemUgPSBtYXNzTm9kZUlkVmVjdG9yLnNpemUoKTsKLSAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgcHJvcGVydGllcy5wdXQobWFzc05vZGVJZEtleSwgbWFzc05vZGVJZFZlY3Rvci5nZXQoMCkpOwotICAgIGVsc2UgaWYgKHNpemUgPiAxKQotICAgICAgcHJvcGVydGllcy5wdXQobWFzc05vZGVJZEtleSwgbWFzc05vZGVJZFZlY3Rvci50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICBlbHNlCi0gICAgICBwcm9wZXJ0aWVzLnJlbW92ZShtYXNzTm9kZUlkS2V5KTsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0VmFsdWVBc1N0cmluZ0FycmF5KEhhc2h0YWJsZSBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KQotICB7Ci0gICAgT2JqZWN0IHZhbHVlcyA9IHByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgaWYgKHZhbHVlcyA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgZWxzZSBpZiAodmFsdWVzIGluc3RhbmNlb2YgU3RyaW5nW10pCi0gICAgICByZXR1cm4gKFN0cmluZ1tdKXZhbHVlczsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHt2YWx1ZXMudG9TdHJpbmcoKX07Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL011bHRpcGFydEZvcm1EYXRhUGFyc2VyVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJmM2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlclRyYW5zZm9ybWVyIGltcGxlbWVudHMgSVRyYW5zZm9ybWVyCi17Ci0gIHByb3RlY3RlZCBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0KLSAgcHVibGljIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyVHJhbnNmb3JtZXIoQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgbm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyID0gKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyKXByb3BlcnRpZXMuZ2V0KEFjdGlvbklucHV0cy5NVUxUSVBBUlRfRk9STV9EQVRBX1BBUlNFUik7Ci0gICAgU3RyaW5nW10ga2V5czsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBrZXlzID0gcGFyc2VyLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICBrZXlzID0gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBuZXdLZXkgPSBuZXcgU3RyaW5nQnVmZmVyKEFjdGlvbklucHV0cy5NVUxUSVBBUlRfRk9STV9EQVRBX1BBUlNFUik7Ci0gICAgICBuZXdLZXkuYXBwZW5kKGtleXNbaV0pOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KG5ld0tleS50b1N0cmluZygpLCBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKGtleXNbaV0pKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBIYXNodGFibGUgZGVOb3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gcHJvcGVydGllcy5rZXlzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgT2JqZWN0IGtleSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFN0cmluZylrZXkpLnN0YXJ0c1dpdGgoQWN0aW9uSW5wdXRzLk1VTFRJUEFSVF9GT1JNX0RBVEFfUEFSU0VSKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyByZWFsS2V5ID0gKChTdHJpbmcpa2V5KS5zdWJzdHJpbmcoQWN0aW9uSW5wdXRzLk1VTFRJUEFSVF9GT1JNX0RBVEFfUEFSU0VSLmxlbmd0aCgpKTsKLSAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuY29udGFpbnNLZXkocmVhbEtleSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KHJlYWxLZXksIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL05vZGVJZFRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL05vZGVJZFRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NjU3ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9Ob2RlSWRUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlSWRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElUcmFuc2Zvcm1lcgotewotICBwcm90ZWN0ZWQgQ29udHJvbGxlciBjb250cm9sbGVyOwotCi0gIHB1YmxpYyBOb2RlSWRUcmFuc2Zvcm1lcihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBub3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICBWZWN0b3IgcmVscyA9IG5ldyBWZWN0b3IoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnRpZXMuZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgTm9kZSByb290Tm9kZSA9IG5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJZCk7Ci0gICAgICBpbnQgZGVwdGggPSAwOwotICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgZGVwdGggPSBub2RlLmdldE5vZGVEZXB0aCgpOwotICAgICAgd2hpbGUgKHJlbHMuc2l6ZSgpIDwgZGVwdGggJiYgbm9kZSAhPSBudWxsICYmIG5vZGUgIT0gcm9vdE5vZGUpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgUmVsIHJlbCA9IGdldFJlbChwYXJlbnROb2RlLmdldFRyZWVFbGVtZW50KCksIGVsZW1lbnQpOwotICAgICAgICBTdHJpbmdCdWZmZXIgcmVsVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKHJlbC5nZXROYW1lKCkpOwotICAgICAgICByZWxWYWx1ZS5hcHBlbmQoTW9kZWxDb25zdGFudHMuUkVMX0xPQ0FMTkFNRV9TRVBBUkFUT1IpOwotICAgICAgICByZWxWYWx1ZS5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICByZWxzLmluc2VydEVsZW1lbnRBdChyZWxWYWx1ZS50b1N0cmluZygpLCAwKTsKLSAgICAgICAgbm9kZSA9IHBhcmVudE5vZGU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgIHsKLSAgICB9Ci0gICAgaW50IG51bVJlbGF0aW9uc2hpcHMgPSByZWxzLnNpemUoKTsKLSAgICBpZiAobnVtUmVsYXRpb25zaGlwcyA9PSAxKQotICAgICAgcHJvcGVydGllcy5wdXQoTW9kZWxDb25zdGFudHMuUkVMX0lELCByZWxzLmdldCgwKS50b1N0cmluZygpKTsKLSAgICBlbHNlIGlmIChudW1SZWxhdGlvbnNoaXBzID4gMSkKLSAgICAgIHByb3BlcnRpZXMucHV0KE1vZGVsQ29uc3RhbnRzLlJFTF9JRCwgKFN0cmluZ1tdKXJlbHMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLQotICBwcml2YXRlIFJlbCBnZXRSZWwoRWxlbWVudCBzb3VyY2VFbGVtZW50LCBFbGVtZW50IHRhcmdldEVsZW1lbnQpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiByZWxzID0gc291cmNlRWxlbWVudC5nZXRSZWxzKCk7Ci0gICAgd2hpbGUgKHJlbHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgUmVsIHJlbCA9IChSZWwpcmVscy5uZXh0RWxlbWVudCgpOwotICAgICAgRW51bWVyYXRpb24gdGFyZ2V0RWxlbWVudHMgPSByZWwuZ2V0VGFyZ2V0RWxlbWVudHMoKTsKLSAgICAgIHdoaWxlICh0YXJnZXRFbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHRhcmdldEVsZW1lbnRzLm5leHRFbGVtZW50KCkgPT0gdGFyZ2V0RWxlbWVudCkKLSAgICAgICAgICByZXR1cm4gcmVsOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZGVOb3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgIE9iamVjdCB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KE1vZGVsQ29uc3RhbnRzLlJFTF9JRCk7Ci0gICAgU3RyaW5nW10gcmVsYXRpb25zaGlwcyA9IG51bGw7Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pCi0gICAgICByZWxhdGlvbnNoaXBzID0gKFN0cmluZ1tdKXZhbHVlOwotICAgIGVsc2UgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICByZWxhdGlvbnNoaXBzID0gbmV3IFN0cmluZ1tdIHt2YWx1ZS50b1N0cmluZygpfTsKLSAgICBpZiAocmVsYXRpb25zaGlwcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRpb25zaGlwcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gcmVsYXRpb25zaGlwc1tpXS5pbmRleE9mKE1vZGVsQ29uc3RhbnRzLlJFTF9MT0NBTE5BTUVfU0VQQVJBVE9SKTsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgICAgIHJldHVybiBkZU5vcm1hbGl6ZUFzU2VsZWN0ZWROb2RlKHByb3BlcnRpZXMpOwotICAgICAgICBTdHJpbmcgcmVsID0gKGluZGV4ICE9IC0xKSA/IHJlbGF0aW9uc2hpcHNbaV0uc3Vic3RyaW5nKDAsIGluZGV4KSA6IHJlbGF0aW9uc2hpcHNbaV07Ci0gICAgICAgIFN0cmluZyBsb2NhbG5hbWUgPSAoaW5kZXggIT0gLTEpID8gcmVsYXRpb25zaGlwc1tpXS5zdWJzdHJpbmcoaW5kZXggKyAxLCByZWxhdGlvbnNoaXBzW2ldLmxlbmd0aCgpKSA6IG51bGw7Ci0gICAgICAgIGlmIChsb2NhbG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gZGVOb3JtYWxpemVBc1NlbGVjdGVkTm9kZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgbm9kZSA9IGdldE5vZGUobm9kZSwgcmVsLCBsb2NhbG5hbWUpOwotICAgICAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgICAgIHJldHVybiBkZU5vcm1hbGl6ZUFzU2VsZWN0ZWROb2RlKHByb3BlcnRpZXMpOwotICAgICAgfQotICAgICAgcHJvcGVydGllcy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgU3RyaW5nLnZhbHVlT2Yobm9kZS5nZXROb2RlSWQoKSkpOwotICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBkZU5vcm1hbGl6ZUFzU2VsZWN0ZWROb2RlKHByb3BlcnRpZXMpOwotICB9Ci0gIAotICBwcml2YXRlIEhhc2h0YWJsZSBkZU5vcm1hbGl6ZUFzU2VsZWN0ZWROb2RlKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgcmV0dXJuIChuZXcgQ3VycmVudE5vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lcihjb250cm9sbGVyKSkuZGVOb3JtYWxpemUocHJvcGVydGllcyk7Ci0gIH0KLQotICBwcml2YXRlIE5vZGUgZ2V0Tm9kZShOb2RlIHBhcmVudCwgU3RyaW5nIHJlbCwgU3RyaW5nIGxvY2FsbmFtZSkKLSAgewotICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IHBhcmVudC5nZXRUcmVlRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBwYXJlbnRFbGVtZW50LmdldEVsZW1lbnRzKHJlbCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKGxvY2FsbmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotICAgICAgICByZXR1cm4gcGFyZW50LmdldENoaWxkTm9kZSgoVHJlZUVsZW1lbnQpZWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9Ob2RlU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvTm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NWRjMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9Ob2RlU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgSVRyYW5zZm9ybWVyCi17Ci0gIHByb3RlY3RlZCBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0KLSAgcHVibGljIE5vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lcihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBub3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgIE5vZGUgbmV4dE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpKTsKLSAgICAgIE5vZGUgY3Vyck5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgIGlmIChjdXJyTm9kZSA9PSBudWxsKQotICAgICAgICBjdXJyTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICAgICBWZWN0b3IgbmV4dFJlbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBWZWN0b3IgY3VyclJlbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICB3aGlsZSAobmV4dE5vZGUgIT0gbnVsbCAmJiBjdXJyTm9kZSAhPSBudWxsICYmICghaXNSb290RWxlbWVudChuZXh0Tm9kZS5nZXRUcmVlRWxlbWVudCgpKSB8fCAhaXNSb290RWxlbWVudChjdXJyTm9kZS5nZXRUcmVlRWxlbWVudCgpKSkgJiYgbmV4dE5vZGUgIT0gY3Vyck5vZGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChuZXh0Tm9kZS5nZXROb2RlRGVwdGgoKSA+PSBjdXJyTm9kZS5nZXROb2RlRGVwdGgoKSkKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5leHROb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgIEVsZW1lbnQgbmV4dEVsZW1lbnQgPSBuZXh0Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgIFJlbCByZWwgPSBnZXRSZWwocGFyZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpLCBuZXh0RWxlbWVudCk7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIHJlbFZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcihyZWwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICByZWxWYWx1ZS5hcHBlbmQoTW9kZWxDb25zdGFudHMuUkVMX0xPQ0FMTkFNRV9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlbFZhbHVlLmFwcGVuZChuZXh0RWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICAgIG5leHRSZWxzLmluc2VydEVsZW1lbnRBdChyZWxWYWx1ZS50b1N0cmluZygpLCAwKTsKLSAgICAgICAgICBuZXh0Tm9kZSA9IHBhcmVudE5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBwYXJlbnROb2RlID0gY3Vyck5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gcGFyZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgIFJlbCByZWwgPSBnZXRSZWwoY3Vyck5vZGUuZ2V0VHJlZUVsZW1lbnQoKSwgcGFyZW50RWxlbWVudCk7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIHJlbFZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcihyZWwuZ2V0TmFtZSgpKTsKLSAgICAgICAgICByZWxWYWx1ZS5hcHBlbmQoTW9kZWxDb25zdGFudHMuUkVMX0xPQ0FMTkFNRV9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlbFZhbHVlLmFwcGVuZChwYXJlbnRFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgY3VyclJlbHMuYWRkKHJlbFZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGN1cnJOb2RlID0gcGFyZW50Tm9kZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY3VyclJlbHMuYWRkQWxsKG5leHRSZWxzKTsKLSAgICAgIGludCBudW1SZWxhdGlvbnNoaXBzID0gY3VyclJlbHMuc2l6ZSgpOwotICAgICAgaWYgKG51bVJlbGF0aW9uc2hpcHMgPT0gMSkKLSAgICAgICAgcHJvcGVydGllcy5wdXQoTW9kZWxDb25zdGFudHMuUkVMX0lELCBjdXJyUmVscy5nZXQoMCkudG9TdHJpbmcoKSk7Ci0gICAgICBlbHNlIGlmIChudW1SZWxhdGlvbnNoaXBzID4gMSkKLSAgICAgICAgcHJvcGVydGllcy5wdXQoTW9kZWxDb25zdGFudHMuUkVMX0lELCAoU3RyaW5nW10pIGN1cnJSZWxzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzUm9vdEVsZW1lbnQoRWxlbWVudCBlKQotICB7Ci0gICAgcmV0dXJuIGUuZ2V0TW9kZWwoKS5nZXRSb290RWxlbWVudCgpID09IGU7Ci0gIH0KLQotICBwcml2YXRlIFJlbCBnZXRSZWwoRWxlbWVudCBzb3VyY2VFbGVtZW50LCBFbGVtZW50IHRhcmdldEVsZW1lbnQpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiByZWxzID0gc291cmNlRWxlbWVudC5nZXRSZWxzKCk7Ci0gICAgd2hpbGUgKHJlbHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgUmVsIHJlbCA9IChSZWwpIHJlbHMubmV4dEVsZW1lbnQoKTsKLSAgICAgIEVudW1lcmF0aW9uIHRhcmdldEVsZW1lbnRzID0gcmVsLmdldFRhcmdldEVsZW1lbnRzKCk7Ci0gICAgICB3aGlsZSAodGFyZ2V0RWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICh0YXJnZXRFbGVtZW50cy5uZXh0RWxlbWVudCgpID09IHRhcmdldEVsZW1lbnQpCi0gICAgICAgICAgcmV0dXJuIHJlbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSByb290Tm9kZSA9IG5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICAgTm9kZSBjdXJyTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChjdXJyTm9kZSA9PSBudWxsKQotICAgICAgY3Vyck5vZGUgPSByb290Tm9kZTsKLSAgICBPYmplY3QgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldChNb2RlbENvbnN0YW50cy5SRUxfSUQpOwotICAgIFN0cmluZ1tdIHJlbGF0aW9uc2hpcHMgPSBudWxsOwotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1tdKQotICAgICAgcmVsYXRpb25zaGlwcyA9IChTdHJpbmdbXSkgdmFsdWU7Ci0gICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgIHJlbGF0aW9uc2hpcHMgPSBuZXcgU3RyaW5nW117dmFsdWUudG9TdHJpbmcoKX07Ci0gICAgaWYgKHJlbGF0aW9uc2hpcHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGN1cnJFbGVtZW50ID0gY3Vyck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRpb25zaGlwcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gcmVsYXRpb25zaGlwc1tpXS5pbmRleE9mKE1vZGVsQ29uc3RhbnRzLlJFTF9MT0NBTE5BTUVfU0VQQVJBVE9SKTsKLSAgICAgICAgU3RyaW5nIHJlbCA9IChpbmRleCAhPSAtMSkgPyByZWxhdGlvbnNoaXBzW2ldLnN1YnN0cmluZygwLCBpbmRleCkgOiByZWxhdGlvbnNoaXBzW2ldOwotICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gKGluZGV4ICE9IC0xKSA/IHJlbGF0aW9uc2hpcHNbaV0uc3Vic3RyaW5nKGluZGV4ICsgMSwgcmVsYXRpb25zaGlwc1tpXS5sZW5ndGgoKSkgOiBudWxsOwotICAgICAgICBFbnVtZXJhdGlvbiBlID0gY3VyckVsZW1lbnQuZ2V0RWxlbWVudHMocmVsKTsKLSAgICAgICAgRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGxvY2FsbmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBmaXJzdEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbmV4dEVsZW1lbnQgPSAoRWxlbWVudCkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGZpcnN0RWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgICBmaXJzdEVsZW1lbnQgPSBuZXh0RWxlbWVudDsKLSAgICAgICAgICAgIGlmIChsb2NhbG5hbWUuZXF1YWxzKG5leHRFbGVtZW50LmdldE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRhcmdldEVsZW1lbnQgPSBuZXh0RWxlbWVudDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh0YXJnZXRFbGVtZW50ID09IG51bGwpCi0gICAgICAgICAgICB0YXJnZXRFbGVtZW50ID0gZmlyc3RFbGVtZW50OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IChFbGVtZW50KSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGN1cnJFbGVtZW50ID0gKEVsZW1lbnQpIHRhcmdldEVsZW1lbnQ7Ci0gICAgICAgICAgTm9kZSBwYXJlbnROb2RlID0gY3Vyck5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmdldFRyZWVFbGVtZW50KCkgPT0gY3VyckVsZW1lbnQpCi0gICAgICAgICAgICBjdXJyTm9kZSA9IHBhcmVudE5vZGU7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY3Vyck5vZGUgPSBjdXJyTm9kZS5nZXRDaGlsZE5vZGUoKFRyZWVFbGVtZW50KSBjdXJyRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcHJvcGVydGllcy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgU3RyaW5nLnZhbHVlT2YoY3Vyck5vZGUuZ2V0Tm9kZUlkKCkpKTsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL1ZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJkMTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgSVRyYW5zZm9ybWVyCi17Ci0gIHByb3RlY3RlZCBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbGlzdE1hbmFnZXJLZXk7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdmlld0tleTsKLQotICBwdWJsaWMgVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKENvbnRyb2xsZXIgY29udHJvbGxlciwgU3RyaW5nIGxpc3RNYW5hZ2VyS2V5LCBTdHJpbmcgdmlld0tleSkKLSAgewotICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0gICAgdGhpcy5saXN0TWFuYWdlcktleSA9IGxpc3RNYW5hZ2VyS2V5OwotICAgIHRoaXMudmlld0tleSA9IHZpZXdLZXk7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIG5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIFZlY3RvciBub3JtYWxpemVkVmlld0lkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIGN1cnJOb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgY3VyckVsZW1lbnQgPSBjdXJyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIE9iamVjdCBsaXN0TWFuYWdlck9iaiA9IGN1cnJFbGVtZW50LmdldFByb3BlcnR5QXNPYmplY3QobGlzdE1hbmFnZXJLZXkpOwotICAgIGlmIChsaXN0TWFuYWdlck9iaiBpbnN0YW5jZW9mIExpc3RNYW5hZ2VyKQotICAgIHsKLSAgICAgIExpc3RNYW5hZ2VyIGxpc3RNYW5hZ2VyID0gKExpc3RNYW5hZ2VyKSBsaXN0TWFuYWdlck9iajsKLSAgICAgIFN0cmluZ1tdIHZpZXdJZHMgPSBnZXRWaWV3VmFsdWVzKHByb3BlcnRpZXMpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aWV3SWRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdEVsZW1lbnQgPSBsaXN0TWFuYWdlci5nZXRFbGVtZW50V2l0aFZpZXdJZChJbnRlZ2VyLnBhcnNlSW50KHZpZXdJZHNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGlmIChsaXN0RWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBvYmplY3Q7Ci0gICAgICAgICAgICBub3JtYWxpemVkVmlld0lkcy5hZGQoZWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBwcm9wZXJ0aWVzLnB1dCh2aWV3S2V5LCBub3JtYWxpemVkVmlld0lkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZGVOb3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICBWZWN0b3Igdmlld0lkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBOb2RlIGN1cnJOb2RlID0gY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChjdXJyTm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFRyZWVFbGVtZW50IGN1cnJFbGVtZW50ID0gY3Vyck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIE9iamVjdCBsaXN0TWFuYWdlck9iaiA9IGN1cnJFbGVtZW50LmdldFByb3BlcnR5QXNPYmplY3QobGlzdE1hbmFnZXJLZXkpOwotICAgICAgaWYgKGxpc3RNYW5hZ2VyT2JqIGluc3RhbmNlb2YgTGlzdE1hbmFnZXIpCi0gICAgICB7Ci0gICAgICAgIExpc3RNYW5hZ2VyIGxpc3RNYW5hZ2VyID0gKExpc3RNYW5hZ2VyKSBsaXN0TWFuYWdlck9iajsKLSAgICAgICAgU3RyaW5nW10gbm9ybWFsaXplZFZpZXdJZHMgPSBnZXRWaWV3VmFsdWVzKHByb3BlcnRpZXMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vcm1hbGl6ZWRWaWV3SWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgRW51bWVyYXRpb24gZSA9IGxpc3RNYW5hZ2VyLmdldExpc3RFbGVtZW50cygpOwotICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIG5vcm1hbGl6ZWRWaWV3SWRzW2ldLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZpZXdJZHMuYWRkKFN0cmluZy52YWx1ZU9mKGxpc3RFbGVtZW50LmdldFZpZXdJZCgpKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpbnQgc2l6ZSA9IHZpZXdJZHMuc2l6ZSgpOwotICAgIGlmIChzaXplID09IDEpCi0gICAgICBwcm9wZXJ0aWVzLnB1dCh2aWV3S2V5LCB2aWV3SWRzLmdldCgwKSk7Ci0gICAgZWxzZSBpZiAoc2l6ZSA+IDEpCi0gICAgICBwcm9wZXJ0aWVzLnB1dCh2aWV3S2V5LCB2aWV3SWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRWaWV3VmFsdWVzKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgT2JqZWN0IHZpZXdWYWx1ZU9iaiA9IHByb3BlcnRpZXMuZ2V0KHZpZXdLZXkpOwotICAgIFN0cmluZ1tdIHZpZXdWYWx1ZXM7Ci0gICAgaWYgKHZpZXdWYWx1ZU9iaiA9PSBudWxsKQotICAgICAgdmlld1ZhbHVlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgZWxzZSBpZiAodmlld1ZhbHVlT2JqLmdldENsYXNzKCkuaXNBcnJheSgpKQotICAgICAgdmlld1ZhbHVlcyA9IChTdHJpbmdbXSkgdmlld1ZhbHVlT2JqOwotICAgIGVsc2UKLSAgICAgIHZpZXdWYWx1ZXMgPSBuZXcgU3RyaW5nW117KFN0cmluZykgdmlld1ZhbHVlT2JqfTsKLSAgICByZXR1cm4gdmlld1ZhbHVlczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTg1NzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uIGV4dGVuZHMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLXsKLSAgcHVibGljIEFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgU3RyaW5nIGJ1c2luZXNzTmFtZSA9IGJ1c0VsZW1lbnQuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gYnVzRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0tleSgpOwotICAgIC8vIGNyZWF0ZSB0aGUgcmVnaXN0cnkgaW4gdGhlIFVEREkgcGVyc3BlY3RpdmUKLSAgICBpZiAoIWNyZWF0ZVJlZ2lzdHJ5SW5VRERJUGVyc3BlY3RpdmUoaW5xdWlyeUFQSSwgbnVsbCwgaW5xdWlyeUFQSSwgbnVsbCwgdHJ1ZSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVksIGJ1c2luZXNzS2V5KTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUsIGJ1c2luZXNzTmFtZSk7Ci0gICAgaWYgKCFhY3Rpb24ucnVuKCkpCi0gICAgewotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiLCBidXNpbmVzc05hbWUpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5zZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbih0cnVlKTsKLSAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUwiLCBidXNpbmVzc05hbWUpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmRjNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQWRkUmVnaXN0cnlUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgU3RyaW5nIHJlZ2lzdHJ5TmFtZSA9IHJlZ0VsZW1lbnQuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gcmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgU3RyaW5nIHB1Ymxpc2hBUEkgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBTdHJpbmcgcmVnaXN0cmF0aW9uVVJMID0gcmVnRWxlbWVudC5nZXRSZWdpc3RyYXRpb25VUkwoKTsKLSAgICBpZiAoIWNyZWF0ZVJlZ2lzdHJ5SW5VRERJUGVyc3BlY3RpdmUoaW5xdWlyeUFQSSwgcHVibGlzaEFQSSwgcmVnaXN0cnlOYW1lLCByZWdpc3RyYXRpb25VUkwsIGZhbHNlKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUwiLCByZWdpc3RyeU5hbWUpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFNlcnZpY2VJbnRlcmZhY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFNlcnZpY2VJbnRlcmZhY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzMzN2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRTZXJ2aWNlSW50ZXJmYWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRTZXJ2aWNlSW50ZXJmYWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotewotICBwdWJsaWMgQWRkU2VydmljZUludGVyZmFjZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2VySW50RWxlbWVudCA9IChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudDsKLSAgICBTdHJpbmcgc2VySW50TmFtZSA9IHNlckludEVsZW1lbnQuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gc2VySW50RWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgU3RyaW5nIHNlckludEtleSA9IHNlckludEVsZW1lbnQuZ2V0U2VydmljZUludGVyZmFjZUtleSgpOwotICAgIC8vIGNyZWF0ZSB0aGUgcmVnaXN0cnkgaW4gdGhlIFVEREkgcGVyc3BlY3RpdmUKLSAgICBpZiAoIWNyZWF0ZVJlZ2lzdHJ5SW5VRERJUGVyc3BlY3RpdmUoaW5xdWlyeUFQSSwgbnVsbCwgaW5xdWlyeUFQSSwgbnVsbCwgdHJ1ZSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZLCBzZXJJbnRLZXkpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSwgc2VySW50TmFtZSk7Ci0gICAgaWYgKCFhY3Rpb24ucnVuKCkpCi0gICAgewotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiLCBzZXJJbnROYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4odHJ1ZSk7Ci0gICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMIiwgc2VySW50TmFtZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYjdmNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLQotcHVibGljIGNsYXNzIEFkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCBzZXJFbGVtZW50ID0gKEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50OwotICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHNlckVsZW1lbnQuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gc2VyRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSBzZXJFbGVtZW50LmdldFNlcnZpY2VLZXkoKTsKLSAgICAvLyBjcmVhdGUgdGhlIHJlZ2lzdHJ5IGluIHRoZSBVRERJIHBlcnNwZWN0aXZlCi0gICAgaWYgKCFjcmVhdGVSZWdpc3RyeUluVURESVBlcnNwZWN0aXZlKGlucXVpcnlBUEksIG51bGwsIGlucXVpcnlBUEksIG51bGwsIHRydWUpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZLCBzZXJ2aWNlS2V5KTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUsIHNlcnZpY2VOYW1lKTsKLSAgICBpZiAoIWFjdGlvbi5ydW4oKSkKLSAgICB7Ci0gICAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRSIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4odHJ1ZSk7Ci0gICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMIiwgc2VydmljZU5hbWUpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjY2E2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5PcGVuUmVnaXN0cnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkNhdGVnb3J5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5SZWdpc3RyeU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESU1haW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBNdWx0aXBsZUxpbmtBY3Rpb24gewotICAgIHB1YmxpYyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImZhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlQWN0aW9uTGluaygpIHsKLSAgICAgICAgcmV0dXJuICJmYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZVJlZ2lzdHJ5SW5VRERJUGVyc3BlY3RpdmUoU3RyaW5nIGlucXVpcnlBUEksIFN0cmluZyBwdWJsaXNoQVBJLCBTdHJpbmcgcmVnaXN0cnlOYW1lLCBTdHJpbmcgcmVnaXN0cmF0aW9uVVJMLCBib29sZWFuIHVzZUV4aXN0aW5nKQotICAgIHsKLSAgICAgIHJldHVybiBjcmVhdGVSZWdpc3RyeUluVURESVBlcnNwZWN0aXZlKGlucXVpcnlBUEksIHB1Ymxpc2hBUEksIHJlZ2lzdHJ5TmFtZSwgcmVnaXN0cmF0aW9uVVJMLCBudWxsLCBudWxsLCBudWxsLCB1c2VFeGlzdGluZyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlUmVnaXN0cnlJblVERElQZXJzcGVjdGl2ZShTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIHB1Ymxpc2hBUEksIFN0cmluZyByZWdpc3RyeU5hbWUsIFN0cmluZyByZWdpc3RyYXRpb25VUkwsIFN0cmluZyBkZWZhdWx0TG9naW4sIFN0cmluZyBkZWZhdWx0UGFzc3dvcmQsIFRheG9ub215W10gdGF4b25vbWllcywgYm9vbGVhbiB1c2VFeGlzdGluZykgewotICAgICAgVmVjdG9yIHJlZ2lzdHJ5Tm9kZXMgPSBnZXRSZWdpc3RyeU5vZGVzQnlJbnF1aXJ5VVJMKGlucXVpcnlBUEkpOwotICAgICAgICBpZiAocmVnaXN0cnlOb2RlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHVzZUV4aXN0aW5nKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgcmVnaXN0cnlOb2RlID0gKE5vZGUpcmVnaXN0cnlOb2Rlcy5lbGVtZW50QXQoMCk7Ci0gICAgICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHJlZ2lzdHJ5Tm9kZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICAgICAgbm9kZU1hbmFnZXIuc2V0U2VsZWN0ZWROb2RlSWQocmVnaXN0cnlOb2RlLmdldE5vZGVJZCgpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gb3BlbiB0aGUgcmVnaXN0cnkgaWYgaXQgaXMgbm90IGFscmVhZHkgb3BlbmVkIGluIHRoZSBVRERJIHBlcnNwZWN0aXZlCi0gICAgICAgIE9wZW5SZWdpc3RyeUFjdGlvbiBvcGVuUmVnQWN0aW9uID0gbmV3IE9wZW5SZWdpc3RyeUFjdGlvbihjb250cm9sbGVyXyk7Ci0KLSAgICAgICAgLy8gcG9wdWxhdGUgdGhlIHByb3BlcnR5IHRhYmxlCi0gICAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gb3BlblJlZ0FjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcocmVnaXN0cnlOYW1lKSkKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSxyZWdpc3RyeU5hbWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKFZhbGlkYXRvci52YWxpZGF0ZVVSTChpbnF1aXJ5QVBJKSkKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuSU5RVUlSWV9VUkwsaW5xdWlyeUFQSSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHB1Ymxpc2hBUEkpKQotICAgICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIX1VSTCxwdWJsaXNoQVBJKTsKLQotICAgICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHJlZ2lzdHJhdGlvblVSTCkpCi0gICAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJBVElPTl9VUkwscmVnaXN0cmF0aW9uVVJMKTsKLQotICAgICAgICBpZiAoZGVmYXVsdExvZ2luICE9IG51bGwpCi0gICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5VRERJX1VTRVJOQU1FLCBkZWZhdWx0TG9naW4pOwotCi0gICAgICAgIGlmIChkZWZhdWx0UGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlVERElfUEFTU1dPUkQsIGRlZmF1bHRQYXNzd29yZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgLy8gSWYgdXNlci1kZWZpbmVkIGNhdGVnb3J5IG1ldGFkYXRhIGV4aXN0cywgc2VhcmNoIGFuZCBtYWtlIHRoZSBhc3NvY2lhdGlvbnMuCi0gICAgICAgIFN0cmluZ0J1ZmZlciBkaXJlY3RvcnlCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQuZm9ybUNhdGVnb3JpZXNEaXJlY3RvcnkoZGlyZWN0b3J5QnVmZmVyLGNvbnRyb2xsZXJfLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkscmVnaXN0cnlOYW1lKTsKLSAgICAgICAgRmlsZSBjYXRlZ29yaWVzRGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyZWN0b3J5QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICBGaWxlW10gY2F0ZWdvcnlGaWxlcyA9IG51bGw7Ci0gICAgICAgIGlmIChjYXRlZ29yaWVzRGlyZWN0b3J5LmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgY2F0ZWdvcnlGaWxlcyA9IGNhdGVnb3JpZXNEaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgaWYgKGNhdGVnb3J5RmlsZXMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuQ0hFQ0tfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMsQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJ1biB0aGUgYWN0aW9uCi0gICAgICAgIGlmICghb3BlblJlZ0FjdGlvbi5ydW4oKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0YXhvbm9taWVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBIYXNodGFibGUgdGF4b25vbXlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGF4b25vbWllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUYXhvbm9teSB0YXhvbm9teSA9IHRheG9ub21pZXNbaV07Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRheG9ub215LmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyB0bW9kZWxLZXkgPSB0YXhvbm9teS5nZXRUbW9kZWxLZXkoKTsKLSAgICAgICAgICAgIENhdGVnb3J5TW9kZWwgY2F0TW9kZWwgPSBuZXcgQ2F0ZWdvcnlNb2RlbCgpOwotICAgICAgICAgICAgY2F0TW9kZWwuc2V0RGlzcGxheU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBjYXRNb2RlbC5zZXRDYXRlZ29yeUtleShuYW1lKTsKLSAgICAgICAgICAgIGNhdE1vZGVsLnNldFRNb2RlbEtleSh0bW9kZWxLZXkpOwotICAgICAgICAgICAgY2F0TW9kZWwubG9hZEZyb21UYXhvbm9teSh0YXhvbm9teSk7Ci0gICAgICAgICAgICB0YXhvbm9teVRhYmxlLnB1dCh0bW9kZWxLZXksIGNhdE1vZGVsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KShjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgICAgICAgcmVnRWxlbWVudC5zZXRVc2VyRGVmaW5lZENhdGVnb3JpZXModGF4b25vbXlUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjYXRlZ29yeUZpbGVzICE9IG51bGwgJiYgY2F0ZWdvcnlGaWxlcy5sZW5ndGggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KShjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgICAgICAgcmVnRWxlbWVudC5zZXRDaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllcyh0cnVlKTsKLSAgICAgICAgICByZWdFbGVtZW50LmdldFVzZXJEZWZpbmVkQ2F0ZWdvcmllcygpOwotICAgICAgICAgIGxpbmtDYXRlZ29yeU1vZGVsc1dpdGhTYXZlZERhdGEocmVnaXN0cnlOYW1lLHJlZ0VsZW1lbnQuZ2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBsaW5rQ2F0ZWdvcnlNb2RlbHNXaXRoU2F2ZWREYXRhKFN0cmluZyByZWdpc3RyeU5hbWUsRW51bWVyYXRpb24gdXNlckRlZmluZWRDYXRlZ29yaWVzKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBkaXJlY3RvcnlCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LmZvcm1DYXRlZ29yaWVzRGlyZWN0b3J5KGRpcmVjdG9yeUJ1ZmZlcixjb250cm9sbGVyXy5nZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpLHJlZ2lzdHJ5TmFtZSk7Ci0gICAgICBsaW5rQ2F0ZWdvcnlNb2RlbHNXaXRoU2F2ZWREYXRhKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyxkaXJlY3RvcnlCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGxpbmtDYXRlZ29yeU1vZGVsc1dpdGhTYXZlZERhdGEoRW51bWVyYXRpb24gdXNlckRlZmluZWRDYXRlZ29yaWVzLFN0cmluZyBjYXRlZ29yaWVzRGlyZWN0b3J5KQotICAgIHsKLSAgICAgIEZpbGUgY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUgPSBuZXcgRmlsZShjYXRlZ29yaWVzRGlyZWN0b3J5KTsKLSAgICAgIEZpbGVbXSBjYXRlZ29yeUZpbGVzID0gbnVsbDsKLSAgICAgIGlmIChjYXRlZ29yaWVzRGlyZWN0b3J5RmlsZS5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgY2F0ZWdvcnlGaWxlcyA9IGNhdGVnb3JpZXNEaXJlY3RvcnlGaWxlLmxpc3RGaWxlcygpOyAKLSAgICAgICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgd2hpbGUgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDYXRlZ29yeU1vZGVsIGNhdGVnb3J5TW9kZWwgPSAoQ2F0ZWdvcnlNb2RlbCl1c2VyRGVmaW5lZENhdGVnb3JpZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeUtleSA9IGNhdGVnb3J5TW9kZWwuZ2V0Q2F0ZWdvcnlLZXkoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPGNhdGVnb3J5RmlsZXMubGVuZ3RoO2krKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5UHJvcGVydGllc0ZpbGVOYW1lID0gY2F0ZWdvcnlGaWxlc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIGludCBsYXN0RG90UG9zID0gY2F0ZWdvcnlQcm9wZXJ0aWVzRmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGRlY29kZWRDYXRlZ29yeVByb3BlcnRpZXNGaWxlTmFtZUJhc2UgPSBVUkxVdGlscy5kZWNvZGUoY2F0ZWdvcnlQcm9wZXJ0aWVzRmlsZU5hbWUuc3Vic3RyaW5nKDAsbGFzdERvdFBvcykpOwotICAgICAgICAgICAgICBpZiAobGFzdERvdFBvcyA+IDAgJiYgY2F0ZWdvcnlQcm9wZXJ0aWVzRmlsZU5hbWUuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikgJiYgY2F0ZWdvcnlLZXkuZXF1YWxzKGRlY29kZWRDYXRlZ29yeVByb3BlcnRpZXNGaWxlTmFtZUJhc2UpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnlNb2RlbC5zZXREZWZhdWx0RGF0YUZpbGUoY2F0ZWdvcnlGaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnlNb2RlbC5sb2FkRnJvbURlbGltaXRlckZpbGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBWZWN0b3IgZ2V0UmVnaXN0cnlOb2Rlc0J5SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCkKLSAgICB7Ci0gICAgICBWZWN0b3IgcmVnaXN0cnlOb2RlcyA9IG51bGw7Ci0gICAgICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpKG5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKSk7Ci0gICAgICBWZWN0b3IgY2hpbGROb2RlcyA9IHVkZGlNYWluTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjaGlsZE5vZGVzLnNpemUoKTtpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpY2hpbGROb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgIGlmIChjaGlsZE5vZGUgaW5zdGFuY2VvZiBSZWdpc3RyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpY2hpbGROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICAgU3RyaW5nIGN1cnJJbnF1aXJ5VVJMID0gcmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgICAgICAgaWYgKGN1cnJJbnF1aXJ5VVJMICE9IG51bGwgJiYgY3VycklucXVpcnlVUkwuZXF1YWxzKGlucXVpcnlVUkwpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWdpc3RyeU5vZGVzID09IG51bGwpCi0gICAgICAgICAgICAgIHJlZ2lzdHJ5Tm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICByZWdpc3RyeU5vZGVzLmFkZEVsZW1lbnQoY2hpbGROb2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuIHJlZ2lzdHJ5Tm9kZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gbmV3QWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IGZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNGb2xkZXJFbGVtZW50KSB7Ci0gICAgICAgICAgICBmYXZvcml0ZXNGb2xkZXJFbGVtZW50ID0gKEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc0VsZW1lbnQpIHsKLSAgICAgICAgICAgIGZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgPSAoKEZhdm9yaXRlc0VsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRQYXJlbnRGb2xkZXJFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHVybiBhbiBpbnN0YW5jZSBvZiBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YKLSAgICAgICAgLy8gZmF2b3JpdGVzIGZvbGRlciBlbGVtZW50IGJlaW5nIHNlbGVjdGVkLgotICAgICAgICBpZiAoZmF2b3JpdGVzRm9sZGVyRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICAgIGVsc2UgaWYgKGZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgQWRkVXNlckRlZlJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICAgIGVsc2UgaWYgKGZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50KQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgICAgICBlbHNlIGlmIChmYXZvcml0ZXNGb2xkZXJFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50KQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICAgIGVsc2UgaWYgKGZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFkZFNlcnZpY2VJbnRlcmZhY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFVzZXJEZWZSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkVXNlckRlZlJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwOTUzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkVXNlckRlZlJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci0KLXB1YmxpYyBjbGFzcyBBZGRVc2VyRGVmUmVnaXN0cnlUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRVc2VyRGVmUmVnaXN0cnlUb1VERElQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgIFN0cmluZyByZWdpc3RyeU5hbWUgPSByZWdFbGVtZW50LmdldE5hbWUoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IHJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgIFN0cmluZyBwdWJsaXNoQVBJID0gcmVnRWxlbWVudC5nZXRQdWJsaXNoVVJMKCk7Ci0gICAgU3RyaW5nIGRlZmF1bHRMb2dpbiA9IHJlZ0VsZW1lbnQuZ2V0RGVmYXVsdExvZ2luKCk7Ci0gICAgU3RyaW5nIGRlZmF1bHRQYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0RGVmYXVsdFBhc3N3b3JkKCk7Ci0gICAgVGF4b25vbXlbXSB0YXhvbm9taWVzID0gcmVnRWxlbWVudC5nZXRUYXhvbm9taWVzKCk7Ci0gICAgaWYgKCFjcmVhdGVSZWdpc3RyeUluVURESVBlcnNwZWN0aXZlKGlucXVpcnlBUEksIHB1Ymxpc2hBUEksIHJlZ2lzdHJ5TmFtZSwgbnVsbCwgZGVmYXVsdExvZ2luLCBkZWZhdWx0UGFzc3dvcmQsIHRheG9ub21pZXMsIGZhbHNlKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUwiLCByZWdpc3RyeU5hbWUpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQ5ZWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1dTSUxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuT3BlbldTSUxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLldzaWxBY3Rpb25JbnB1dHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBNdWx0aXBsZUxpbmtBY3Rpb24KLXsKLSAgcHVibGljIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgaW50IHRvb2xJRCwgaW50IHZpZXdJRCwgaW50IHZpZXdUb29sSUQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImZhdm9yaXRlcy9hY3Rpb25zL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiAiZmF2b3JpdGVzL2FjdGlvbnMvQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzV1NJTEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoRmF2b3JpdGVzV1NJTEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudDsKLSAgICBTdHJpbmcgd3NpbFVSTCA9IHdzaWxFbGVtZW50LmdldFdzaWxVcmwoKTsKLSAgICBPcGVuV1NJTEFjdGlvbiBvcGVuV1NJTEFjdGlvbiA9IG5ldyBPcGVuV1NJTEFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuV1NJTEFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoV3NpbEFjdGlvbklucHV0cy5XU0lMX1VSTCwgd3NpbFVSTCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoV3NpbEFjdGlvbklucHV0cy5XU0lMX0lOU1BFQ1RJT05fVFlQRSwgU3RyaW5nLnZhbHVlT2YoV3NpbEFjdGlvbklucHV0cy5XU0lMX0RFVEFJTFMpKTsKLSAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IG9wZW5XU0lMQWN0aW9uLnJ1bigpOwotICAgIGlmIChhY3Rpb25SZXN1bHQpCi0gICAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTCIsIHdzaWxVUkwpKTsKLSAgICBlbHNlCi0gICAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfV1NJTF9UT19XU0lMX1BFUlNQRUNUSVZFIiwgd3NpbFVSTCkpOwotICAgIHJldHVybiBhY3Rpb25SZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGIyMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuT3BlbldTRExBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIE11bHRpcGxlTGlua0FjdGlvbgotewotICBwdWJsaWMgRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElEKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJmYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiAiZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwIjsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgd3NkbFVybCA9IHdzZGxFbGVtZW50LmdldFdzZGxVcmwoKTsKLSAgICBPcGVuV1NETEFjdGlvbiBvcGVuV1NETEFjdGlvbiA9IG5ldyBPcGVuV1NETEFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuV1NETEFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMLCB3c2RsVXJsKTsKLSAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IG9wZW5XU0RMQWN0aW9uLnJ1bigpOwotICAgIGlmIChhY3Rpb25SZXN1bHQpCi0gICAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTCIsIHdzZGxVcmwpKTsKLSAgICBlbHNlCi0gICAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFIiwgd3NkbFVybCkpOwotICAgIHJldHVybiBhY3Rpb25SZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyODE0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5XU0RMRmlsZU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gewotCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZl87Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZpbGVOYW1lXzsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxpbnQgdG9vbElkLGludCB2aWV3SWQsaW50IHZpZXdUb29sSWQpCi0gICAgewotICAgICAgcmV0dXJuIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCx0b29sSWQsdmlld0lkLHZpZXdUb29sSWQsImZhdm9yaXRlcy9hY3Rpb25zL0Zhdm9ydGllc0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZShPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICAgICAgaWYgKGRlZl8gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHdyaXRlV1NETERlZmluaXRpb24ob3MsIGRlZl8pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZU5hbWVfOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICAgICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotCi0gICAgICAgIC8vIHJldHVybiBmYWxzZSBpZiBub2RlSUQgPT0gMCwgdGhhdCBpcyB0aGUgbWFpbiBub2RlCi0gICAgICAgIGlmIChub2RlSUQgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgICAgIFN0cmluZyB3c2RsVVJMID0gKChGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRXc2RsVXJsKCk7Ci0gICAgICAgIHdzZGxGaWxlTmFtZV8gPSBXU0RMRmlsZU5hbWVIZWxwZXIuZ2V0V1NETEZpbGVOYW1lKHdzZGxVUkwpOwotICAgICAgICB0cnkgewotICAgICAgICAgIGRlZl8gPSAobmV3IFVkZGk0akhlbHBlcigpKS5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UodC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2NjNkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbiBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZvcml0ZXNQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIHJldHVybiAoRm9ybVRvb2wpZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gbmV3SW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKCkgewotICAgICAgICBGYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gYWN0aW9uID0gbmV3IEZhdm9yaXRlc0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0KLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2b3JpdGVzUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0KLSAgICAgICAgdGFibGUucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSkpOwotICAgICAgICB0YWJsZS5wdXQoQWN0aW9uSW5wdXRzLlZJRVdJRCwgU3RyaW5nLnZhbHVlT2Yoc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICAgIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50UGFnZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDkxNzQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIGV4dGVuZHMgTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIG5ld0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZvcml0ZXNQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIHJldHVybiAoRm9ybVRvb2wpZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2b3JpdGVzUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KQotICAgICAgICAgICAgcmV0dXJuIGxhdW5jaFdpemFyZCgoKEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldFdzZGxVcmwoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwNzZlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc0ZvbGRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzTWFpbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24KLXsKLSAgcHVibGljIEZhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiZmF2b3JpdGVzL2FjdGlvbnMvUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNDb25maXJtSlNQLmpzcCIpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgbWFpbk5vZGUgPSBub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IG1haW5FbGVtZW50ID0gKEZhdm9yaXRlc01haW5FbGVtZW50KW1haW5Ob2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBtYWluRWxlbWVudC5yZXN0b3JlRmF2b3JpdGVzRGVmYXVsdCgpOwotICAgIGlmIChhY3Rpb25SZXN1bHQpCi0gICAgewotICAgICAgVmVjdG9yIGZvbGRlck5vZGVzID0gbWFpbk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJOb2Rlcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBmb2xkZXJOb2RlID0gKE5vZGUpZm9sZGVyTm9kZXMuZWxlbWVudEF0KGkpOwotICAgICAgICBUcmVlRWxlbWVudCB0cmVlRWxlbWVudCA9IGZvbGRlck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHRyZWVFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgZm9sZGVyRWxlbWVudCA9IChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KXRyZWVFbGVtZW50OwotICAgICAgICAgIGZvbGRlckVsZW1lbnQucmVtb3ZlQWxsRmF2b3JpdGVzKGNvbnRyb2xsZXJfLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkpOwotICAgICAgICAgIGZvbGRlckVsZW1lbnQuaW5pdChtYWluRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UoZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fRkFWT1JJVEVTX1JFU1RPUkVEX1RPX0RFRkFVTFQiKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UoZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX09QRU5fRkFWT1JJVEVTX0JBQ0tVUCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWZhNjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuVG9nZ2xlTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLlRvb2xUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uIGV4dGVuZHMgVG9nZ2xlTm9kZUFjdGlvbiB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1RvZ2dsZU5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsIGJvb2xlYW4gb3BlbikgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImZhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc1RvZ2dsZU5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlkKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk9QRU4pOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBpZiAob3BlbikKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5PUEVOX05PREUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuQ0xPU0VfTk9ERSk7Ci0gICAgICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpIHsKLSAgICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSB0b2dnbGVkTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgVG9vbCBzZWxlY3RlZFRvb2wgPSB0b29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgICAgaW50IG5vZGVJZCA9IHRvZ2dsZWROb2RlXy5nZXROb2RlSWQoKTsKLSAgICAgICAgaW50IHRvb2xJZCA9IHNlbGVjdGVkVG9vbC5nZXRUb29sSWQoKTsKLSAgICAgICAgaW50IHZpZXdJZCA9IHRvZ2dsZWROb2RlXy5nZXRWaWV3SWQoKTsKLSAgICAgICAgaW50IHZpZXdUb29sSWQgPSB0b2dnbGVkTm9kZV8uZ2V0Vmlld1Rvb2xJZCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikKLSAgICAgICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLCB0b29sSWQsIHZpZXdJZCwgdmlld1Rvb2xJZCwgdHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLCB0cnVlKTsKLSAgICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRUcmVlQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0VHJlZUNvbnRlbnRQYWdlKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICB7Ci0gICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9GQVZPUklURVM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9NdWx0aXBsZUxpbmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9NdWx0aXBsZUxpbmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1YWEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvTXVsdGlwbGVMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5NYXNzTm9kZUlkVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXVsdGlwbGVMaW5rQWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwdWJsaWMgTXVsdGlwbGVMaW5rQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nIGlzTXVsdGlwbGVMaW5rQWN0aW9uID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OKTsKLSAgICBpZiAoaXNNdWx0aXBsZUxpbmtBY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OLCBpc011bHRpcGxlTGlua0FjdGlvbik7Ci0gICAgICByZXR1cm4gcHJvY2Vzc011bHRpcGxlTGlua0FjdGlvblBhcmFtZXRlcnMocmVxdWVzdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5yZW1vdmUoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OKTsKLSAgICAgIFN0cmluZyBub2RlSURTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgIFN0cmluZyB0b29sSURTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVE9PTElEKTsKLSAgICAgIFN0cmluZyB2aWV3SURTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICAgIFN0cmluZyB2aWV3VG9vbElEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgICAgaWYgKG5vZGVJRFN0cmluZyAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgbm9kZUlEU3RyaW5nKTsKLSAgICAgIGlmICh0b29sSURTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5UT09MSUQsIHRvb2xJRFN0cmluZyk7Ci0gICAgICBpZiAodmlld0lEU3RyaW5nICE9IG51bGwpCi0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVklFV0lELCB2aWV3SURTdHJpbmcpOwotICAgICAgaWYgKHZpZXdUb29sSURTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXVE9PTElELCB2aWV3VG9vbElEU3RyaW5nKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NNdWx0aXBsZUxpbmtBY3Rpb25QYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nW10gbWFzc0FjdGlvbk5vZGVJRHMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhGYXZvcml0ZXNBY3Rpb25JbnB1dHMuTUFTU19BQ1RJT05fTk9ERV9JRCk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5NQVNTX0FDVElPTl9OT0RFX0lELCBtYXNzQWN0aW9uTm9kZUlEcyk7Ci0gICAgaWYgKG1hc3NBY3Rpb25Ob2RlSURzLmxlbmd0aCA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICByZXR1cm4gbmV3IElUcmFuc2Zvcm1lcltdIHtuZXcgTWFzc05vZGVJZFRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfLCBGYXZvcml0ZXNBY3Rpb25JbnB1dHMuTUFTU19BQ1RJT05fTk9ERV9JRCl9OwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNdWx0aXBsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHByb3BlcnR5VGFibGVfLmNvbnRhaW5zS2V5KEZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TWFzc0FjdGlvbk5vZGVJZHMoKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IHByb3BlcnR5VGFibGVfLmdldChGYXZvcml0ZXNBY3Rpb25JbnB1dHMuTUFTU19BQ1RJT05fTk9ERV9JRCk7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgZWxzZSBpZiAob2JqZWN0LmdldENsYXNzKCkuaXNBcnJheSgpKQotICAgICAgcmV0dXJuIChTdHJpbmdbXSlvYmplY3Q7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7KFN0cmluZylvYmplY3R9OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiAoaXNNdWx0aXBsZUxpbmtBY3Rpb24oKSkgPyBleGVjdXRlTXVsdGlwbGVMaW5rQWN0aW9uKCkgOiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU11bHRpcGxlTGlua0FjdGlvbigpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIFN0cmluZ1tdIG1hc3NBY3Rpb25Ob2RlSURzID0gZ2V0TWFzc0FjdGlvbk5vZGVJZHMoKTsKLSAgICBpZiAobWFzc0FjdGlvbk5vZGVJRHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hc3NBY3Rpb25Ob2RlSURzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgbWFzc0FjdGlvbk5vZGVJRHNbaV0pOwotICAgICAgICBpZiAoZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKSkKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucmVtb3ZlKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3N2M3MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc01haW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgTXVsdGlwbGVMaW5rQWN0aW9uCi17Ci0gIHB1YmxpYyBSZW1vdmVGYXZvcml0ZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElEKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJmYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlQWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gImZhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0FjdGlvbkpTUC5qc3AiOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBTdHJpbmcgbm9kZUlEU3RyaW5nID0gKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGludCBub2RlSUQ7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludChub2RlSURTdHJpbmcpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICB7Ci0gICAgICBub2RlSUQgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGVJZCgpOwotICAgIH0KLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5ID0gY29udHJvbGxlcl8uZ2V0U2VydmxldEVuZ2luZVN0YXRlTG9jYXRpb24oKTsKLSAgICBib29sZWFuIGFjdGlvblJlc3VsdDsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzRWxlbWVudCkKLSAgICAgIGFjdGlvblJlc3VsdCA9ICgoRmF2b3JpdGVzRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50KS5nZXRQYXJlbnRGb2xkZXJFbGVtZW50KCkucmVtb3ZlRmF2b3JpdGVCeU5vZGVJRChub2RlSUQsIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KTsKLSAgICBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNGb2xkZXJFbGVtZW50KQotICAgICAgYWN0aW9uUmVzdWx0ID0gKChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLnJlbW92ZUFsbEZhdm9yaXRlcyhwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0gICAgZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzTWFpbkVsZW1lbnQpCi0gICAgewotICAgICAgRW51bWVyYXRpb24gZTsKLSAgICAgIEZhdm9yaXRlc01haW5FbGVtZW50IG1haW5FbGVtZW50ID0gKEZhdm9yaXRlc01haW5FbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgICBlID0gbWFpbkVsZW1lbnQuZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfRk9MREVSX05PREUpOwotICAgICAgYWN0aW9uUmVzdWx0ID0gKChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KSBlLm5leHRFbGVtZW50KCkpLnJlbW92ZUFsbEZhdm9yaXRlcyhwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0gICAgICBlID0gbWFpbkVsZW1lbnQuZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9GT0xERVJfTk9ERSk7Ci0gICAgICBhY3Rpb25SZXN1bHQgPSBhY3Rpb25SZXN1bHQgJiYgKChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KSBlLm5leHRFbGVtZW50KCkpLnJlbW92ZUFsbEZhdm9yaXRlcyhwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0gICAgICBlID0gbWFpbkVsZW1lbnQuZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9GT0xERVJfTk9ERSk7Ci0gICAgICBhY3Rpb25SZXN1bHQgPSBhY3Rpb25SZXN1bHQgJiYgKChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KSBlLm5leHRFbGVtZW50KCkpLnJlbW92ZUFsbEZhdm9yaXRlcyhwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0gICAgICBlID0gbWFpbkVsZW1lbnQuZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfQlVTSU5FU1NfRk9MREVSX05PREUpOwotICAgICAgYWN0aW9uUmVzdWx0ID0gYWN0aW9uUmVzdWx0ICYmICgoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkgZS5uZXh0RWxlbWVudCgpKS5yZW1vdmVBbGxGYXZvcml0ZXMocGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpOwotICAgICAgZSA9IG1haW5FbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0ZPTERFUl9OT0RFKTsKLSAgICAgIGFjdGlvblJlc3VsdCA9IGFjdGlvblJlc3VsdCAmJiAoKEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQpIGUubmV4dEVsZW1lbnQoKSkucmVtb3ZlQWxsRmF2b3JpdGVzKHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KTsKLSAgICAgIGUgPSBtYWluRWxlbWVudC5nZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9GT0xERVJfTk9ERSk7Ci0gICAgICBhY3Rpb25SZXN1bHQgPSBhY3Rpb25SZXN1bHQgJiYgKChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KSBlLm5leHRFbGVtZW50KCkpLnJlbW92ZUFsbEZhdm9yaXRlcyhwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGFjdGlvblJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChhY3Rpb25SZXN1bHQpCi0gICAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19JTkZPX05PREVfQ0xFQVJFRCIsIHNlbGVjdGVkTm9kZS5nZXROb2RlTmFtZSgpKSk7Ci0gICAgcmV0dXJuIGFjdGlvblJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJmYXZOYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAiZmF2b3JpdGVzL2Zhdl9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiAiZmF2UHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAiZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiAiZmF2U3RhdHVzQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZmZlNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5SZXNpemVGcmFtZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc0ZyYW1lTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLQotcHVibGljIGNsYXNzIFJlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbiBleHRlbmRzIFJlc2l6ZUZyYW1lc0FjdGlvbgotewotICBwdWJsaWMgUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgIT0gbnVsbCAmJiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUixhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGZyYW1lc2V0IHNpemVzLgotICAgIFN0cmluZyBmcmFtZU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuRlJBTUVfTkFNRSk7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIG5ldyBmcmFtZXNldCBzaXplcy4KLSAgICBpZiAoZnJhbWVOYW1lLmVxdWFscyhGYXZvcml0ZXNGcmFtZU5hbWVzLk5BVklHQVRPUl9DT05UQUlORVIpKQotICAgIHsKLSAgICAgIGZhdlBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgIHsKLSAgICAgICAgLy8gUmVzdG9yZS4KLSAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKGZhdlBlcnNwZWN0aXZlLmdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIxMDAlLDAlIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGZyYW1lTmFtZS5lcXVhbHMoRmF2b3JpdGVzRnJhbWVOYW1lcy5QUk9QRVJUSUVTX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgaWYgKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3Muc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICAgewotICAgICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZXN0b3JlLgotICAgICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhmYXZQZXJzcGVjdGl2ZS5nZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpKTsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGZhdlBlcnNwZWN0aXZlLmdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCIxMDAlLDAlIik7Ci0gICAgICAgIGlmICghcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMCUsMTAwJSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGZyYW1lTmFtZS5lcXVhbHMoRmF2b3JpdGVzRnJhbWVOYW1lcy5TVEFUVVNfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICBpZiAoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgewotICAgICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZXN0b3JlLgotICAgICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhmYXZQZXJzcGVjdGl2ZS5nZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpKTsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGZhdlBlcnNwZWN0aXZlLmdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCIwJSwxMDAlIik7Ci0gICAgICAgIGlmICghcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMCUsMTAwJSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkZmUxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TZWxlY3ROb2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuVG9vbFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVBY3Rpb24KLXsKLSAgICBwdWJsaWMgU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gICAgewotICAgICAgICBzdXBlcihjb250cm9sbGVyLCBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBib29sZWFuIGtlZXBIaXN0b3J5KQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJmYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgICAgIGlmIChrZWVwSGlzdG9yeSkgewotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoIj0xIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgICB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZFRvb2wgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBlbHNlIGlmIChzZWxlY3RlZFRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKQotICAgICAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkVG9vbC5nZXRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCB0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRUcmVlQ29udGVudFZhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRUcmVlQ29udGVudFBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKSB7Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICAgIHsKLSAgICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfRkFWT1JJVEVTOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTViNzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlNlbGVjdE5vZGVUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuVG9vbFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVUb29sQWN0aW9uCi17Ci0gICAgcHVibGljIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlciwgY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgaW50IHRvb2xJRCwgaW50IHZpZXdJRCwgaW50IHZpZXdUb29sSUQsIGJvb2xlYW4ga2VlcEhpc3RvcnkpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImZhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb25KU1AuanNwPyIpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKHRvb2xJRCk7Ci0gICAgICAgIGlmICh2aWV3SUQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtlZXBIaXN0b3J5KSB7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgiPTEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYgKGdldFNlbGVjdGVkVG9vbCgpLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikgewotICAgICAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgZ2V0U2VsZWN0ZWRUb29sKCkuZ2V0VG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0VHJlZUNvbnRlbnRWYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0VHJlZUNvbnRlbnRQYWdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGVudFZhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGVudFBhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX0ZBVk9SSVRFUzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvU2VsZWN0RmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Tm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWQwZGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Tm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uCi17Ci0gICAgcHVibGljIFNlbGVjdEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1FeHRlbmRlZEFjdGlvbigpCi0gICAgewotICAgIAlUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgCSgoRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5yZWZyZXNoKCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgYm9vbGVhbiBrZWVwSGlzdG9yeSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiZmF2b3JpdGVzL2FjdGlvbnMvU2VsZWN0RmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICAgICAgaWYgKGtlZXBIaXN0b3J5KSB7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgiPTEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21GYXZvcml0ZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21GYXZvcml0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkYzY5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2hvd1BlcnNwZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc0FjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgU2hvd1BlcnNwZWN0aXZlQWN0aW9uCi17Ci0gIHB1YmxpYyBTd2l0Y2hQZXJzcGVjdGl2ZUZyb21GYXZvcml0ZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgIT0gbnVsbCAmJiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUixhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgCi0gICAgLy8gU2F2ZSB0aGUgZnJhbWVzZXQgc2l6ZXMgaWZmIG5vIGZyYW1lIGlzIG1heGltaXplZC4KLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuc3RhcnRzV2l0aCgiMTAwJSIpICYmICFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgCi0gICAgaWYgKCFhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzLnN0YXJ0c1dpdGgoIjEwMCUiKSAmJiAhYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIAotICAgIHJldHVybiBzdXBlci5ydW4oKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUFjdGlvbkxpbmsoaW50IHRhcmdldFBlcnNwZWN0aXZlSWQsYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGZvcm1MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NkbC9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb25KU1AuanNwPyIpOwotICAgIGZvcm1MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkUpLmFwcGVuZCgnPScpLmFwcGVuZCh0YXJnZXRQZXJzcGVjdGl2ZUlkKTsKLSAgICBpZiAoZm9ySGlzdG9yeSkKLSAgICAgIGZvcm1MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKS5hcHBlbmQoIj0xIik7ICAgIAotICAgIHJldHVybiBmb3JtTGluay50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2NvbnN0YW50cy9GYXZvcml0ZXNBY3Rpb25JbnB1dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvY29uc3RhbnRzL0Zhdm9yaXRlc0FjdGlvbklucHV0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGNhNjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvY29uc3RhbnRzL0Zhdm9yaXRlc0FjdGlvbklucHV0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzQWN0aW9uSW5wdXRzCi17Ci0gICAgLy8gbWFzcyBhY3Rpb25zCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTVVMVElQTEVfTElOS19BQ1RJT04gPSAibXVsdGlwbGVMaW5rQWN0aW9uIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVNTX0FDVElPTl9OT0RFX0lEID0gIm1hc3NBY3Rpb25Ob2RlSUQiOwotCi0gICAgLy8gcmVzaXplIGZhdm9yaXRlcyBmcmFtZXMgYWN0aW9uCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UID0gImZyYW1lc2V0Q29sc1BlcnNwZWN0aXZlQ29udGVudCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUiA9ICJmcmFtZXNldFJvd3NBY3Rpb25zQ29udGFpbmVyIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvY29uc3RhbnRzL0Zhdm9yaXRlc0ZyYW1lTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvY29uc3RhbnRzL0Zhdm9yaXRlc0ZyYW1lTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyNjIyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2NvbnN0YW50cy9GYXZvcml0ZXNGcmFtZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNGcmFtZU5hbWVzCi17Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BVklHQVRPUl9DT05UQUlORVIgPSAiZmF2X25hdmlnYXRvcl9jb250YWluZXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQVZJR0FUT1JfVE9PTEJBUiA9ICJmYXZfbmF2aWdhdG9yX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQVZJR0FUT1JfQ09OVEVOVCA9ICJmYXZfbmF2aWdhdG9yX2NvbnRlbnQiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05TX0NPTlRBSU5FUiA9ICJmYXZfYWN0aW9uc19jb250YWluZXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX0NPTlRBSU5FUiA9ICJmYXZfcHJvcGVydGllc19jb250YWluZXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX1RPT0xCQVIgPSAiZmF2X3Byb3BlcnRpZXNfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfQ09OVEVOVCA9ICJmYXZfcHJvcGVydGllc19jb250ZW50IjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVFVTX0NPTlRBSU5FUiA9ICJmYXZfc3RhdHVzX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRVU19UT09MQkFSID0gImZhdl9zdGF0dXNfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRVU19DT05URU5UID0gImZhdl9zdGF0dXNfY29udGVudCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2NvbnN0YW50cy9GYXZvcml0ZXNNb2RlbENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9jb25zdGFudHMvRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3MjUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2NvbnN0YW50cy9GYXZvcml0ZXNNb2RlbENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMgewotICAgIC8vIFJlbGF0aW9ucwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9XU0lMX0ZPTERFUl9OT0RFID0gInJlbFdTSUxGb2xkZXJOb2RlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUxfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFID0gInJlbFdTRExTZXJ2aWNlRm9sZGVyTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1VERElfU0VSVklDRV9GT0xERVJfTk9ERSA9ICJyZWxVRERJU2VydmljZUZvbGRlck5vZGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9VRERJX0JVU0lORVNTX0ZPTERFUl9OT0RFID0gInJlbFVERElCdXNpbmVzc0ZvbGRlck5vZGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0ZPTERFUl9OT0RFID0gInJlbFVERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1VERElfUkVHSVNUUllfRk9MREVSX05PREUgPSAicmVsVURESVJlZ2lzdHJ5Rm9sZXJOb2RlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUxfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9GT0xERVJfTk9ERSA9ICJyZWxVc2VyRGVmVURESVJlZ2lzdHJ5Rm9sZGVyTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1dTSUxfTk9ERSA9ICJyZWxXU0lMTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1dTRExfU0VSVklDRV9OT0RFID0gInJlbFdTRExTZXJ2aWNlTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1VERElfU0VSVklDRV9OT0RFID0gInJlbFVERElTZXJ2aWNlTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1VERElfQlVTSU5FU1NfTk9ERSA9ICJyZWxVRERJQnVzaW5lc3NOb2RlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OT0RFID0gInJlbFVERElTZXJ2aWNlSW50ZXJmYWNlTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1VERElfUkVHSVNUUllfTk9ERSA9ICJyZWxVRERJUmVnaXN0cnlOb2RlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUxfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9OT0RFID0gInJlbFVzZXJEZWZVRERJUmVnaXN0cnlOb2RlIjsKLQotICAgIC8vIFByb3BlcnRpZXMKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1BMVUdJTl9NRVRBREFUQV9ESVJFQ1RPUlkgPSAicGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfV1NJTF9VUkwgPSAid3NpbFVSTCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9XU0RMX1VSTCA9ICJ3c2RsVVJMIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfU0VSVklDRV9OQU1FID0gIlVERElTZXJ2aWNlTmFtZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1NFUlZJQ0VfSU5RVUlSWV9BUEkgPSAiVURESVNlcnZpY2VJbnF1aXJ5QVBJIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfU0VSVklDRV9LRVkgPSAiVURESVNlcnZpY2VLZXkiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfVURESV9CVVNJTkVTU19OQU1FID0gIlVERElCdXNpbmVzc05hbWUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfVURESV9CVVNJTkVTU19JTlFVSVJZX0FQSSA9ICJVRERJQnVzaW5lc3NJbnF1aXJ5QVBJIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfQlVTSU5FU1NfS0VZID0gIlVERElCdXNpbmVzc0tleSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUgPSAiVURESVNlcnZpY2VJbnRlcmZhY2VOYW1lIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfSU5RVUlSWV9BUEkgPSAiVURESVNlcnZpY2VJbnRlcmZhY2VJbnF1aXJ5QVBJIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfS0VZID0gIlVERElTZXJ2aWNlSW50ZXJmYWNlS2V5IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfUkVHSVNUUllfTkFNRSA9ICJVRERJUmVnaXN0cnlOYW1lIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfUkVHSVNUUllfSU5RVUlSWV9BUEkgPSAiVURESVJlZ2lzdHJ5SW5xdWlyeUFQSSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1JFR0lTVFJZX1BVQkxJU0hfQVBJID0gIlVERElSZWdpc3RyeVB1Ymxpc2hBUEkiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfVURESV9SRUdJU1RSWV9SRUdJU1RSQVRJT05fVVJMID0gIlVERElSZWdpc3RyeVJlZ2lzdHJhdGlvblVSTCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1JFR0lTVFJZX0NBVEVHT1JJRVNfRU5VTSA9ICJVRERJUmVnaXN0cnlDYXRlZ29yaWVzRW51bSI7Ci0KLSAgICAvLyBMaXN0IE1hbmFnZXJzIGZvciBGYXZvcml0ZXMKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMSVNUX01BTkFHRVJfV1NETF9TRVJWSUNFUyA9ICJ3c2RsU2VydmljZXMiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfTUFOQUdFUl9VRERJX1NFUlZJQ0VTID0gInVkZGlTZXJ2aWNlcyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9NQU5BR0VSX1VERElfQlVTSU5FU1MgPSAidWRkaUJ1c2luZXNzIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMSVNUX01BTkFHRVJfV1NJTF9MSU5LUyA9ICJ3c2lsTGlua3MiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfTUFOQUdFUl9VRERJX1JFR0lTVFJZID0gInVkZGlSZWdpc3RyeSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9NQU5BR0VSX1VERElfU0VSVklDRV9JTlRFUkZBQ0UgPSAidWRkaVNlcnZpY2VJbnRlcmZhY2UiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzEwMmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgZG9jdW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzRWxlbWVudCBleHRlbmRzIFRyZWVFbGVtZW50IHsKLQotICBwdWJsaWMgRmF2b3JpdGVzRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gIH0KLQotICBwdWJsaWMgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBnZXRQYXJlbnRGb2xkZXJFbGVtZW50KCkgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIGlmICghZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc0ZvbGRlckVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc0ZvbGRlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2MzdkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNGb2xkZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi0vKioKLSogVGhlIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgCi0qIGEgV1NJTCBkb2N1bWVudAotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IGV4dGVuZHMgVHJlZUVsZW1lbnQKLXsKLSAgICBwcm90ZWN0ZWQgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICAgIAotICAgIHB1YmxpYyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgICAgICBub2RlTWFuYWdlcl8gPSBub2RlTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoRmF2b3JpdGVzTWFpbkVsZW1lbnQpbm9kZU1hbmFnZXJfLmdldFJvb3ROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50KTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlbW92ZUZhdm9yaXRlQnlOb2RlSUQoaW50IG5vZGVJRCxTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlQWxsRmF2b3JpdGVzKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBFbnVtZXJhdGlvbiBnZXRBbGxGYXZvcml0ZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzTWFpbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc01haW5FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWI2NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzTWFpbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5mYXZvcml0ZXMuRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgZG9jdW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZXh0ZW5kcyBUcmVlRWxlbWVudAotewotICBwcml2YXRlIENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIHByaXZhdGUgRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFIGZhdlJlZ2lzdHJ5XzsKLQotICBwdWJsaWMgRmF2b3JpdGVzTWFpbkVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgIGZhdlJlZ2lzdHJ5XyA9IG5ldyBGYXZvcml0ZXNSZWdpc3RyeVR5cGVXU0UoCi0JCQljb250cm9sbGVyLmdldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbigpLAotCQkJY29udHJvbGxlci5nZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpCi0JKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlc3RvcmVGYXZvcml0ZXNEZWZhdWx0KCkKLSAgewotICAgIGZhdlJlZ2lzdHJ5Xy5yZXN0b3JlRmF2b3JpdGVzRGVmYXVsdCgpOwotICAgIHJldHVybiBzYXZlRmF2b3JpdGVzKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzYXZlRmF2b3JpdGVzKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGZhdlJlZ2lzdHJ5Xy5zYXZlKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UoZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBVkVfRkFWT1JJVEVTX1dTSUwiLCBmYXZSZWdpc3RyeV8uZ2V0V3JpdGVMb2NhdGlvbigpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExpbmsgYWRkVURESVJlZ2lzdHJ5KFN0cmluZyByZWdpc3RyeU5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgcHVibGlzaEFQSSwgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8uYWRkVURESVJlZ2lzdHJ5KHJlZ2lzdHJ5TmFtZSwgaW5xdWlyeUFQSSwgcHVibGlzaEFQSSwgcmVnaXN0cmF0aW9uVVJMKTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rIGFkZFVERElCdXNpbmVzcyhTdHJpbmcgYnVzaW5lc3NOYW1lLCBTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIGJ1c2luZXNzS2V5KQotICB7Ci0gICAgcmV0dXJuIGZhdlJlZ2lzdHJ5Xy5hZGRVRERJQnVzaW5lc3MoYnVzaW5lc3NOYW1lLCBpbnF1aXJ5QVBJLCBidXNpbmVzc0tleSk7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBhZGRVRERJU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgc2VydmljZUtleSkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8uYWRkVURESVNlcnZpY2Uoc2VydmljZU5hbWUsIGlucXVpcnlBUEksIHNlcnZpY2VLZXkpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgYWRkVURESVNlcnZpY2VJbnRlcmZhY2UoU3RyaW5nIHNlckludE5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgc2VySW50S2V5KQotICB7Ci0gICAgcmV0dXJuIGZhdlJlZ2lzdHJ5Xy5hZGRVRERJU2VydmljZUludGVyZmFjZShzZXJJbnROYW1lLCBpbnF1aXJ5QVBJLCBzZXJJbnRLZXkpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgYWRkV1NETFNlcnZpY2UoU3RyaW5nIHVybCkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8uYWRkV1NETFNlcnZpY2UodXJsKTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rIGFkZFdTSUxMaW5rKFN0cmluZyB1cmwpCi0gIHsKLSAgICByZXR1cm4gZmF2UmVnaXN0cnlfLmFkZFdTSUxMaW5rKHVybCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgIGZhdlJlZ2lzdHJ5Xy5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlTGluayhMaW5rIGxpbmspIHsKLSAgICBmYXZSZWdpc3RyeV8ucmVtb3ZlTGluayhsaW5rKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rW10gbG9hZFVERElSZWdpc3RyaWVzKCkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8ubG9hZFVERElSZWdpc3RyaWVzKCk7Ci0gIH0KLSAgICAKLSAgcHVibGljIExpbmtbXSBsb2FkVURESUJ1c2luZXNzZXMoKQotICB7Ci0gICAgcmV0dXJuIGZhdlJlZ2lzdHJ5Xy5sb2FkVURESUJ1c2luZXNzZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlW10gbG9hZFVERElTZXJ2aWNlcygpCi0gIHsKLSAgICByZXR1cm4gZmF2UmVnaXN0cnlfLmxvYWRVRERJU2VydmljZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlW10gbG9hZFVERElTZXJ2aWNlSW50ZXJmYWNlcygpCi0gIHsKLSAgICByZXR1cm4gZmF2UmVnaXN0cnlfLmxvYWRVRERJU2VydmljZUludGVyZmFjZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlW10gbG9hZFdTRExTZXJ2aWNlcygpCi0gIHsKLSAgICByZXR1cm4gZmF2UmVnaXN0cnlfLmxvYWRXU0RMU2VydmljZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rW10gbG9hZFdTSUxzKCkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8ubG9hZFdTSUxzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50IGdldEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KShnZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9GT0xERVJfTk9ERSkubmV4dEVsZW1lbnQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhMTQ4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzLkZhdm9yaXRlc1VERElCdXNpbmVzczsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNFbGVtZW50IHsKLQotICBwcml2YXRlIEZhdm9yaXRlc1VERElCdXNpbmVzcyB1ZGRpQnVzaW5lc3NfOwotCi0gIHB1YmxpYyBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTGluayBsaW5rKSB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHVkZGlCdXNpbmVzc18gPSBuZXcgRmF2b3JpdGVzVURESUJ1c2luZXNzKCk7Ci0gICAgdWRkaUJ1c2luZXNzXy5zZXRMaW5rKGxpbmspOwotICB9Ci0KLSAgcHVibGljIExpbmsgZ2V0TGluaygpIHsKLSAgICByZXR1cm4gdWRkaUJ1c2luZXNzXy5nZXRMaW5rKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgcmV0dXJuIHVkZGlCdXNpbmVzc18uZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgIHJldHVybiB1ZGRpQnVzaW5lc3NfLmdldElucXVpcnlVUkwoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QnVzaW5lc3NLZXkoKSB7Ci0gICAgcmV0dXJuIHVkZGlCdXNpbmVzc18uZ2V0QnVzaW5lc3NLZXkoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNlYzg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlckVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50Ci17Ci0gIHB1YmxpYyBGYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCwgbm9kZU1hbmFnZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCkgewotICAgIExpbmtbXSBsaW5rcyA9IGZhdk1haW5FbGVtZW50LmxvYWRVRERJQnVzaW5lc3NlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIExpbmsgbGluayA9IGxpbmtzW2ldOwotICAgICAgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCBmYXZVRERJQnVzaW5lc3NFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQoKGxpbmsuZ2V0QWJzdHJhY3RzKCkpWzBdLmdldFRleHQoKSwgZ2V0TW9kZWwoKSwgbGluayk7Ci0gICAgICBjb25uZWN0KGZhdlVERElCdXNpbmVzc0VsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gYWRkRmF2b3JpdGUoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIGJ1c2luZXNzTmFtZSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19OQU1FKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19JTlFVSVJZX0FQSSk7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX0tFWSk7Ci0gICAgaWYgKGJ1c2luZXNzTmFtZSA9PSBudWxsIHx8IGlucXVpcnlBUEkgPT0gbnVsbCB8fCBidXNpbmVzc0tleSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQgZSA9IGdldEZhdm9yaXRlKGlucXVpcnlBUEksIGJ1c2luZXNzS2V5KTsKLSAgICBpZiAoZSAhPSBudWxsKQotICAgICAgcmVtb3ZlRmF2b3JpdGUoZSk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIExpbmsgbGluayA9IGZhdk1haW5FbGVtZW50LmFkZFVERElCdXNpbmVzcyhidXNpbmVzc05hbWUsIGlucXVpcnlBUEksIGJ1c2luZXNzS2V5KTsKLSAgICBib29sZWFuIHNhdmVkID0gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICAgIGlmIChzYXZlZCkgewotICAgICAgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCBmYXZVRERJQnVzaW5lc3NFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQoYnVzaW5lc3NOYW1lLCBnZXRNb2RlbCgpLCBsaW5rKTsKLSAgICAgIGNvbm5lY3QoZmF2VURESUJ1c2luZXNzRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfQlVTSU5FU1NfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNhdmVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIGlucXVpcnlBUEkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfQlVTSU5FU1NfSU5RVUlSWV9BUEkpOwotICAgIFN0cmluZyBidXNpbmVzc0tleSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19LRVkpOwotICAgIGlmIChpbnF1aXJ5QVBJID09IG51bGwgfHwgYnVzaW5lc3NLZXkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gKGdldEZhdm9yaXRlKGlucXVpcnlBUEksIGJ1c2luZXNzS2V5KSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUZhdm9yaXRlQnlOb2RlSUQoaW50IG5vZGVJRCxTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50KQotICAgICAgcmV0dXJuIChyZW1vdmVGYXZvcml0ZSgoRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpICYmIGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZUZhdm9yaXRlKEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQgZWxlbWVudCkgewotICAgIExpbmsgbGluayA9IGVsZW1lbnQuZ2V0TGluaygpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBpZiAoZmF2TWFpbkVsZW1lbnQucmVtb3ZlTGluayhsaW5rKSkgewotICAgICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsRmF2b3JpdGVzKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkgewotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCBmYXZVRERJQnVzaW5lc3NFbGVtZW50ID0gKEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgTGluayBsaW5rID0gZmF2VURESUJ1c2luZXNzRWxlbWVudC5nZXRMaW5rKCk7Ci0gICAgICBmYXZNYWluRWxlbWVudC5yZW1vdmVMaW5rKGxpbmspOwotICAgIH0KLSAgICBkaXNjb25uZWN0UmVsKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX05PREUpOwotICAgIHJldHVybiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QWxsRmF2b3JpdGVzKCkgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9CVVNJTkVTU19OT0RFKTsKLSAgfQotCi0gIHByaXZhdGUgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCBnZXRGYXZvcml0ZShTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIGJ1c2luZXNzS2V5KSB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBpZiAoaW5xdWlyeUFQSS5lcXVhbHMoYnVzRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCkpICYmCi0gICAgICAgICAgYnVzaW5lc3NLZXkuZXF1YWxzKGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NLZXkoKSkpCi0gICAgICAgIHJldHVybiBidXNFbGVtZW50OwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXMuRmF2b3JpdGVzVURESVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzLklGYXZvcml0ZXNVRERJUmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50IGV4dGVuZHMgRmF2b3JpdGVzRWxlbWVudCB7Ci0KLSAgcHJpdmF0ZSBGYXZvcml0ZXNVRERJUmVnaXN0cnkgdWRkaVJlZ187Ci0KLSAgcHVibGljIEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBMaW5rIGxpbmspIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgdWRkaVJlZ18gPSBuZXcgRmF2b3JpdGVzVURESVJlZ2lzdHJ5KCk7Ci0gICAgdWRkaVJlZ18uc2V0TGluayhsaW5rKTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rIGdldExpbmsoKSB7Ci0gICAgcmV0dXJuIHVkZGlSZWdfLmdldExpbmsoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gdWRkaVJlZ18uZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgIHJldHVybiB1ZGRpUmVnXy5nZXRJbnF1aXJ5VVJMKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgcmV0dXJuIHVkZGlSZWdfLmdldFB1Ymxpc2hVUkwoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgIHJldHVybiB1ZGRpUmVnXy5nZXRSZWdpc3RyYXRpb25VUkwoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotICAKLSAgcHVibGljIElGYXZvcml0ZXNVRERJUmVnaXN0cnkgZ2V0SUZhdm9yaXRlc1VERElSZWdpc3RyeUludGVyZmFjZSgpCi0gIHsKLSAgICByZXR1cm4gdWRkaVJlZ187Ci0gIH0KLX0KLSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzViMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkNhdGVnb3J5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVVJMVXRpbHM7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50Ci17Ci0gIHB1YmxpYyBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCwgbm9kZU1hbmFnZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCkgewotICAgIExpbmtbXSBsaW5rcyA9IGZhdk1haW5FbGVtZW50LmxvYWRVRERJUmVnaXN0cmllcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIExpbmsgbGluayA9IGxpbmtzW2ldOwotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZVRERJUmVnc2l0cnlFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQoKGxpbmsuZ2V0QWJzdHJhY3RzKCkpWzBdLmdldFRleHQoKSwgZ2V0TW9kZWwoKSwgbGluayk7Ci0gICAgICBjb25uZWN0KGZhdlVERElSZWdzaXRyeUVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgcmVnaXN0cnlOYW1lID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1JFR0lTVFJZX05BTUUpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1JFR0lTVFJZX0lOUVVJUllfQVBJKTsKLSAgICBTdHJpbmcgcHVibGlzaEFQSSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9QVUJMSVNIX0FQSSk7Ci0gICAgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9SRUdJU1RSQVRJT05fVVJMKTsKLSAgICBFbnVtZXJhdGlvbiB1c2VyRGVmaW5lZENhdGVnb3JpZXMgPSAoRW51bWVyYXRpb24pdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9DQVRFR09SSUVTX0VOVU0pOwotICAgIC8vIFNhdmUgdGhlIGNhdGVnb3J5IGRhdGEgZmlyc3QgYW5kIHVuZG8gaWYgbmVjZXNzYXJ5LgotICAgIGlmICh1c2VyRGVmaW5lZENhdGVnb3JpZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1BMVUdJTl9NRVRBREFUQV9ESVJFQ1RPUlkpOwotICAgICAgU3RyaW5nQnVmZmVyIGRpcmVjdG9yeUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGZvcm1DYXRlZ29yaWVzRGlyZWN0b3J5KGRpcmVjdG9yeUJ1ZmZlcixwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSxyZWdpc3RyeU5hbWUpOwotICAgICAgRmlsZSBjYXRlZ29yaWVzRGlyZWN0b3J5RmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeUJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgIGNhdGVnb3JpZXNEaXJlY3RvcnlGaWxlLm1rZGlycygpOwotICAgICAgU3RyaW5nQnVmZmVyIGNhdGVnb3J5RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB3aGlsZSAodXNlckRlZmluZWRDYXRlZ29yaWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBDYXRlZ29yeU1vZGVsIGNhdGVnb3J5TW9kZWwgPSAoQ2F0ZWdvcnlNb2RlbCl1c2VyRGVmaW5lZENhdGVnb3JpZXMubmV4dEVsZW1lbnQoKTsgICAgICAgIAotICAgICAgICBjYXRlZ29yeUZpbGVOYW1lLnNldExlbmd0aCgwKTsKLSAgICAgICAgU3RyaW5nIGVuY29kZWRDYXRlZ29yeUtleSA9IFVSTFV0aWxzLmVuY29kZShjYXRlZ29yeU1vZGVsLmdldENhdGVnb3J5S2V5KCkpOwotICAgICAgICBjYXRlZ29yeUZpbGVOYW1lLmFwcGVuZChjYXRlZ29yaWVzRGlyZWN0b3J5RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKGVuY29kZWRDYXRlZ29yeUtleSkuYXBwZW5kKCIudHh0Iik7Ci0gICAgICAgIGJ5dGUgcmMgPSBjYXRlZ29yeU1vZGVsLnNhdmVEYXRhKGNhdGVnb3J5RmlsZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChyYyAhPSBDYXRlZ29yeU1vZGVsLk9QRVJBVElPTl9TVUNDRVNTRlVMKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRGVsZXRlIHRoZSBjYXRlZ29yeSBmaWxlIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgICBGaWxlIGNhdGVnb3J5RmlsZSA9IG5ldyBGaWxlKGNhdGVnb3J5RmlsZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgaWYgKGNhdGVnb3J5RmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgIGNhdGVnb3J5RmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2xlYW51cENhdGVnb3J5RGlyZWN0b3JpZXMoY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUpOwotICAgIH0KLSAgICBpZiAocmVnaXN0cnlOYW1lID09IG51bGwgfHwgaW5xdWlyeUFQSSA9PSBudWxsIHx8IHB1Ymxpc2hBUEkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50IGUgPSBnZXRGYXZvcml0ZShyZWdpc3RyeU5hbWUpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgICByZW1vdmVGYXZvcml0ZShlKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgTGluayBsaW5rID0gZmF2TWFpbkVsZW1lbnQuYWRkVURESVJlZ2lzdHJ5KHJlZ2lzdHJ5TmFtZSwgaW5xdWlyeUFQSSwgcHVibGlzaEFQSSwgcmVnaXN0cmF0aW9uVVJMKTsKLSAgICBib29sZWFuIHNhdmVkID0gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICAgIGlmIChzYXZlZCkgewotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZVRERJUmVnc2l0cnlFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQocmVnaXN0cnlOYW1lLCBnZXRNb2RlbCgpLCBsaW5rKTsKLSAgICAgIGNvbm5lY3QoZmF2VURESVJlZ3NpdHJ5RWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNhdmVkOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZm9ybUNhdGVnb3JpZXNEaXJlY3RvcnkoU3RyaW5nQnVmZmVyIGNhdGVnb3JpZXNEaXJlY3RvcnksU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5LFN0cmluZyByZWdpc3RyeU5hbWUpCi0gIHsKLSAgICAvLyA8bWV0YWRhdGE+L3VkZGkvPHJlZ2lzdHJ5SWQ+L2NhdGVnb3JpZXMKLQlTdHJpbmcgZW5jb2RlZFJlZ2lzdHJ5TmFtZSA9IFVSTFV0aWxzLmVuY29kZShyZWdpc3RyeU5hbWUpOwotICAgIGNhdGVnb3JpZXNEaXJlY3RvcnkuYXBwZW5kKHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KS5hcHBlbmQoInVkZGkiKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKS5hcHBlbmQoZW5jb2RlZFJlZ2lzdHJ5TmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKCJjYXRlZ29yaWVzIik7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHZvaWQgY2xlYXJSZWdpc3RyeU1ldGFkYXRhKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSxTdHJpbmcgcmVnaXN0cnlOYW1lKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGNhdGVnb3JpZXNEaXJlY3RvcnkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9ybUNhdGVnb3JpZXNEaXJlY3RvcnkoY2F0ZWdvcmllc0RpcmVjdG9yeSxwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSxyZWdpc3RyeU5hbWUpOwotICAgIEZpbGUgY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUgPSBuZXcgRmlsZShjYXRlZ29yaWVzRGlyZWN0b3J5LnRvU3RyaW5nKCkpOwotICAgIEZpbGVbXSBjYXRlZ29yeUZpbGVzID0gY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUubGlzdEZpbGVzKCk7Ci0gICAgaWYgKGNhdGVnb3J5RmlsZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjYXRlZ29yeUZpbGVzLmxlbmd0aDtpKyspCi0gICAgICAgIGNhdGVnb3J5RmlsZXNbaV0uZGVsZXRlKCk7Ci0gICAgfQotICAgIGNsZWFudXBDYXRlZ29yeURpcmVjdG9yaWVzKGNhdGVnb3JpZXNEaXJlY3RvcnlGaWxlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNsZWFudXBDYXRlZ29yeURpcmVjdG9yaWVzKEZpbGUgY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUpCi0gIHsKLSAgICAvLyBEZWxldGUgdGhlIGNhdGVnb3JpZXMgc3ViZGlyZWN0b3J5IGlmIGl0IGlzIGVtcHR5LgotICAgIFN0cmluZ1tdIGZpbGVMaXN0OwotICAgIGZpbGVMaXN0ID0gY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUubGlzdCgpOwotICAgIGlmIChmaWxlTGlzdCA9PSBudWxsIHx8IGZpbGVMaXN0Lmxlbmd0aCA9PSAwKQotICAgICAgY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUuZGVsZXRlKCk7Ci0gICAgLy8gRGVsZXRlIHRoZSA8cmVnaXN0cnlJZD4gc3ViZGlyZWN0b3J5IGlmIGl0IGlzIGVtcHR5LgotICAgIEZpbGUgcmVnaXN0cnlJZERpcmVjdG9yeUZpbGUgPSBjYXRlZ29yaWVzRGlyZWN0b3J5RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgZmlsZUxpc3QgPSByZWdpc3RyeUlkRGlyZWN0b3J5RmlsZS5saXN0KCk7Ci0gICAgaWYgKGZpbGVMaXN0ID09IG51bGwgfHwgZmlsZUxpc3QubGVuZ3RoID09IDApCi0gICAgICByZWdpc3RyeUlkRGlyZWN0b3J5RmlsZS5kZWxldGUoKTsKLSAgICAvLyBEZWxldGUgdGhlIHVkZGkgc3ViZGlyZWN0b3J5IGlmIGl0IGlzIGVtcHR5LgotICAgIEZpbGUgdWRkaURpcmVjdG9yeUZpbGUgPSByZWdpc3RyeUlkRGlyZWN0b3J5RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgZmlsZUxpc3QgPSB1ZGRpRGlyZWN0b3J5RmlsZS5saXN0KCk7Ci0gICAgaWYgKGZpbGVMaXN0ID09IG51bGwgfHwgZmlsZUxpc3QubGVuZ3RoID09IDApCi0gICAgICB1ZGRpRGlyZWN0b3J5RmlsZS5kZWxldGUoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKEhhc2h0YWJsZSB0YWJsZSkgewotICAgIFN0cmluZyByZWdpc3RyeU5hbWUgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfUkVHSVNUUllfTkFNRSk7Ci0gICAgaWYgKHJlZ2lzdHJ5TmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAoZ2V0RmF2b3JpdGUocmVnaXN0cnlOYW1lKSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUZhdm9yaXRlQnlOb2RlSUQoaW50IG5vZGVJRCxTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50KQotICAgIHsKLSAgICAgIGNsZWFyUmVnaXN0cnlNZXRhZGF0YShwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSxzZWxlY3RlZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIGJvb2xlYW4gcmMgPSByZW1vdmVGYXZvcml0ZSgoRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudClzZWxlY3RlZEVsZW1lbnQpOwotICAgICAgcmMgPSByYyAmJiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gICAgICByZXR1cm4gcmM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVGYXZvcml0ZShGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50IGVsZW1lbnQpIHsKLSAgICBMaW5rIGxpbmsgPSAoKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZWxlbWVudCkuZ2V0TGluaygpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBpZiAoZmF2TWFpbkVsZW1lbnQucmVtb3ZlTGluayhsaW5rKSkgewotICAgICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsRmF2b3JpdGVzKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkgewotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZVRERJUmVnaXN0cnlFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgY2xlYXJSZWdpc3RyeU1ldGFkYXRhKHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5LGZhdlVERElSZWdpc3RyeUVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIExpbmsgbGluayA9IGZhdlVERElSZWdpc3RyeUVsZW1lbnQuZ2V0TGluaygpOwotICAgICAgZmF2TWFpbkVsZW1lbnQucmVtb3ZlTGluayhsaW5rKTsKLSAgICB9Ci0gICAgZGlzY29ubmVjdFJlbChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9OT0RFKTsKLSAgICByZXR1cm4gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEZhdm9yaXRlcygpIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfTk9ERSk7Ci0gIH0KLQotICBwcml2YXRlIEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQgZ2V0RmF2b3JpdGUoU3RyaW5nIHJlZ2lzdHJ5TmFtZSkgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKHJlZ2lzdHJ5TmFtZS5lcXVhbHMocmVnRWxlbWVudC5nZXROYW1lKCkpKQotICAgICAgICByZXR1cm4gcmVnRWxlbWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODZlZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzLkZhdm9yaXRlc1VERElTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50IGV4dGVuZHMgRmF2b3JpdGVzRWxlbWVudCB7Ci0KLSAgcHJpdmF0ZSBGYXZvcml0ZXNVRERJU2VydmljZSB1ZGRpU2VydmljZV87Ci0KLSAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgICB1ZGRpU2VydmljZV8gPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2UoKTsKLSAgICB1ZGRpU2VydmljZV8uc2V0U2VydmljZShzZXJ2aWNlKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoKSB7Ci0gICAgcmV0dXJuIHVkZGlTZXJ2aWNlXy5nZXRTZXJ2aWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgcmV0dXJuIHVkZGlTZXJ2aWNlXy5nZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgcmV0dXJuIHVkZGlTZXJ2aWNlXy5nZXRJbnF1aXJ5VVJMKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VLZXkoKSB7Ci0gICAgcmV0dXJuIHVkZGlTZXJ2aWNlXy5nZXRTZXJ2aWNlS2V5KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiODU5NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi0vKioKLSogVGhlIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgCi0qIGEgV1NJTCBkb2N1bWVudAotKi8KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZUZvbGRlckVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50Ci17Ci0KLSAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKSB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwsIG5vZGVNYW5hZ2VyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQpIHsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBmYXZNYWluRWxlbWVudC5sb2FkVURESVNlcnZpY2VzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gc2VydmljZXNbaV07Ci0gICAgICBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgZmF2VURESVNlcnZpY2VFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCgoc2VydmljZS5nZXRTZXJ2aWNlTmFtZXMoKSlbMF0uZ2V0VGV4dCgpLCBnZXRNb2RlbCgpLCBzZXJ2aWNlKTsKLSAgICAgIGNvbm5lY3QoZmF2VURESVNlcnZpY2VFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gYWRkRmF2b3JpdGUoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfTkFNRSk7Ci0gICAgU3RyaW5nIGlucXVpcnlBUEkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlFVSVJZX0FQSSk7Ci0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9LRVkpOwotICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IGlucXVpcnlBUEkgPT0gbnVsbCB8fCBzZXJ2aWNlS2V5ID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50IGUgPSBnZXRGYXZvcml0ZShpbnF1aXJ5QVBJLCBzZXJ2aWNlS2V5KTsKLSAgICBpZiAoZSAhPSBudWxsKQotICAgICAgcmVtb3ZlRmF2b3JpdGUoZSk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IGZhdk1haW5FbGVtZW50LmFkZFVERElTZXJ2aWNlKHNlcnZpY2VOYW1lLCBpbnF1aXJ5QVBJLCBzZXJ2aWNlS2V5KTsKLSAgICBib29sZWFuIHNhdmVkID0gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICAgIGlmIChzYXZlZCkgewotICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50IGZhdlVERElTZXJ2aWNlRWxlbWVudCA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQoc2VydmljZU5hbWUsIGdldE1vZGVsKCksIHNlcnZpY2UpOwotICAgICAgY29ubmVjdChmYXZVRERJU2VydmljZUVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNhdmVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIGlucXVpcnlBUEkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlFVSVJZX0FQSSk7Ci0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9LRVkpOwotICAgIGlmIChpbnF1aXJ5QVBJID09IG51bGwgfHwgc2VydmljZUtleSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAoZ2V0RmF2b3JpdGUoaW5xdWlyeUFQSSwgc2VydmljZUtleSkgIT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVGYXZvcml0ZUJ5Tm9kZUlEKGludCBub2RlSUQsU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50KQotICAgICAgcmV0dXJuIChyZW1vdmVGYXZvcml0ZSgoRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkgJiYgZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRmF2b3JpdGUoRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50IGVsZW1lbnQpIHsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoKEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCllbGVtZW50KS5nZXRTZXJ2aWNlKCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChmYXZNYWluRWxlbWVudC5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGxGYXZvcml0ZXMoU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KSB7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgZmF2VURESVNlcnZpY2VFbGVtZW50ID0gKEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBmYXZVRERJU2VydmljZUVsZW1lbnQuZ2V0U2VydmljZSgpOwotICAgICAgZmF2TWFpbkVsZW1lbnQucmVtb3ZlU2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0gICAgZGlzY29ubmVjdFJlbChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX05PREUpOwotICAgIHJldHVybiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QWxsRmF2b3JpdGVzKCkgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX05PREUpOwotICB9Ci0KLSAgcHJpdmF0ZSBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgZ2V0RmF2b3JpdGUoU3RyaW5nIGlucXVpcnlBUEksIFN0cmluZyBzZXJ2aWNlS2V5KSB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgc2VyRWxlbWVudCA9IChGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKGlucXVpcnlBUEkuZXF1YWxzKHNlckVsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpKSAmJgotICAgICAgICAgIHNlcnZpY2VLZXkuZXF1YWxzKHNlckVsZW1lbnQuZ2V0U2VydmljZUtleSgpKSkKLSAgICAgICAgcmV0dXJuIHNlckVsZW1lbnQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWU4YmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlcy5GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZTsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBleHRlbmRzIEZhdm9yaXRlc0VsZW1lbnQgewotCi0gIHByaXZhdGUgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UgdWRkaVNlckludF87Ci0KLSAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgICB1ZGRpU2VySW50XyA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSgpOwotICAgIHVkZGlTZXJJbnRfLnNldFNlcnZpY2Uoc2VydmljZSk7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgewotICAgIHJldHVybiB1ZGRpU2VySW50Xy5nZXRTZXJ2aWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgcmV0dXJuIHVkZGlTZXJJbnRfLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICByZXR1cm4gdWRkaVNlckludF8uZ2V0SW5xdWlyeVVSTCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW50ZXJmYWNlS2V5KCkgewotICAgIHJldHVybiB1ZGRpU2VySW50Xy5nZXRTZXJ2aWNlSW50ZXJmYWNlS2V5KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZTYyY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi0vKioKLSogVGhlIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgCi0qIGEgV1NJTCBkb2N1bWVudAotKi8KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50Ci17Ci0KLSAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKSB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwsIG5vZGVNYW5hZ2VyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQpIHsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBmYXZNYWluRWxlbWVudC5sb2FkVURESVNlcnZpY2VJbnRlcmZhY2VzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gc2VydmljZXNbaV07Ci0gICAgICBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgZmF2VURESVNlckludEVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KChzZXJ2aWNlLmdldFNlcnZpY2VOYW1lcygpKVswXS5nZXRUZXh0KCksIGdldE1vZGVsKCksIHNlcnZpY2UpOwotICAgICAgY29ubmVjdChmYXZVRERJU2VySW50RWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgc2VySW50TmFtZSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9JTlFVSVJZX0FQSSk7Ci0gICAgU3RyaW5nIHNlckludEtleSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9LRVkpOwotICAgIGlmIChzZXJJbnROYW1lID09IG51bGwgfHwgaW5xdWlyeUFQSSA9PSBudWxsIHx8IHNlckludEtleSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBlID0gZ2V0RmF2b3JpdGUoaW5xdWlyeUFQSSwgc2VySW50S2V5KTsKLSAgICBpZiAoZSAhPSBudWxsKQotICAgICAgcmVtb3ZlRmF2b3JpdGUoZSk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IGZhdk1haW5FbGVtZW50LmFkZFVERElTZXJ2aWNlSW50ZXJmYWNlKHNlckludE5hbWUsIGlucXVpcnlBUEksIHNlckludEtleSk7Ci0gICAgYm9vbGVhbiBzYXZlZCA9IGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKTsKLSAgICBpZiAoc2F2ZWQpIHsKLSAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBmYXZVRERJU2VySW50RWxlbWVudCA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQoc2VySW50TmFtZSwgZ2V0TW9kZWwoKSwgc2VydmljZSk7Ci0gICAgICBjb25uZWN0KGZhdlVERElTZXJJbnRFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIH0KLSAgICByZXR1cm4gc2F2ZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cyhIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9JTlFVSVJZX0FQSSk7Ci0gICAgU3RyaW5nIHNlckludEtleSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9LRVkpOwotICAgIGlmIChpbnF1aXJ5QVBJID09IG51bGwgfHwgc2VySW50S2V5ID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIChnZXRGYXZvcml0ZShpbnF1aXJ5QVBJLCBzZXJJbnRLZXkpICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRmF2b3JpdGVCeU5vZGVJRChpbnQgbm9kZUlELFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCkKLSAgICAgIHJldHVybiAocmVtb3ZlRmF2b3JpdGUoKEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpICYmIGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZUZhdm9yaXRlKEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gKChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpZWxlbWVudCkuZ2V0U2VydmljZSgpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBpZiAoZmF2TWFpbkVsZW1lbnQucmVtb3ZlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsRmF2b3JpdGVzKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkgewotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IGZhdlVERElTZXJJbnRFbGVtZW50ID0gKEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBmYXZVRERJU2VySW50RWxlbWVudC5nZXRTZXJ2aWNlKCk7Ci0gICAgICBmYXZNYWluRWxlbWVudC5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLSAgICBkaXNjb25uZWN0UmVsKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX05PREUpOwotICAgIHJldHVybiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QWxsRmF2b3JpdGVzKCkgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OT0RFKTsKLSAgfQotCi0gIHByaXZhdGUgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IGdldEZhdm9yaXRlKFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgc2VySW50S2V5KSB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2VySW50RWxlbWVudCA9IChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKGlucXVpcnlBUEkuZXF1YWxzKHNlckludEVsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpKSAmJgotICAgICAgICAgICBzZXJJbnRLZXkuZXF1YWxzKHNlckludEVsZW1lbnQuZ2V0U2VydmljZUludGVyZmFjZUtleSgpKSkKLSAgICAgICAgcmV0dXJuIHNlckludEVsZW1lbnQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhNGRlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA5MTIgICAxNDE3OTYgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuUmVnaXN0cnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5VRERJUmVnaXN0cnlTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNFbGVtZW50Ci17Ci0gIHByaXZhdGUgTGlzdCBuYW1lczsKLSAgcHJpdmF0ZSBMaXN0IGRlc2NzOwotICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotICBwcml2YXRlIFN0cmluZyBkZWZhdWx0TG9naW47Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRQYXNzd29yZDsKLSAgcHJpdmF0ZSBTdHJpbmcgaW5xdWlyeVVSTDsKLSAgcHJpdmF0ZSBTdHJpbmcgcHVibGlzaFVSTDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VjdXJlSW5xdWlyeVVSTDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VjdXJlUHVibGlzaFVSTDsKLSAgcHJpdmF0ZSBUYXhvbm9teVtdIHRheG9ub21pZXM7Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0TG9naW4oKQotICB7Ci0gICAgcmV0dXJuIGRlZmF1bHRMb2dpbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRMb2dpbihTdHJpbmcgZGVmYXVsdExvZ2luKQotICB7Ci0gICAgdGhpcy5kZWZhdWx0TG9naW4gPSBkZWZhdWx0TG9naW47Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpCi0gIHsKLSAgICByZXR1cm4gZGVmYXVsdFBhc3N3b3JkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFBhc3N3b3JkKFN0cmluZyBkZWZhdWx0UGFzc3dvcmQpCi0gIHsKLSAgICB0aGlzLmRlZmF1bHRQYXNzd29yZCA9IGRlZmF1bHRQYXNzd29yZDsKLSAgfQotCi0gIHB1YmxpYyBUYXhvbm9teVtdIGdldFRheG9ub21pZXMoKQotICB7Ci0gICAgcmV0dXJuIHRheG9ub21pZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUYXhvbm9taWVzKFRheG9ub215W10gdGF4b25vbWllcykKLSAgewotICAgIHRoaXMudGF4b25vbWllcyA9IHRheG9ub21pZXM7Ci0gIH0KLQotICBwdWJsaWMgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RGVzY3MoKQotICB7Ci0gICAgcmV0dXJuIGRlc2NzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3MoTGlzdCBkZXNjcykKLSAgewotICAgIHRoaXMuZGVzY3MgPSBkZXNjczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpCi0gIHsKLSAgICByZXR1cm4gaW5xdWlyeVVSTDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgICB0aGlzLmlucXVpcnlVUkwgPSBpbnF1aXJ5VVJMOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXMoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZXMoTGlzdCBuYW1lcykKLSAgewotICAgIHRoaXMubmFtZXMgPSBuYW1lczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpCi0gIHsKLSAgICByZXR1cm4gcHVibGlzaFVSTDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hVUkwoU3RyaW5nIHB1Ymxpc2hVUkwpCi0gIHsKLSAgICB0aGlzLnB1Ymxpc2hVUkwgPSBwdWJsaXNoVVJMOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWN1cmVJbnF1aXJ5VVJMKCkKLSAgewotICAgIHJldHVybiBzZWN1cmVJbnF1aXJ5VVJMOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VjdXJlSW5xdWlyeVVSTChTdHJpbmcgc2VjdXJlSW5xdWlyeVVSTCkKLSAgewotICAgIHRoaXMuc2VjdXJlSW5xdWlyeVVSTCA9IHNlY3VyZUlucXVpcnlVUkw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlY3VyZVB1Ymxpc2hVUkwoKQotICB7Ci0gICAgcmV0dXJuIHNlY3VyZVB1Ymxpc2hVUkw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWN1cmVQdWJsaXNoVVJMKFN0cmluZyBzZWN1cmVQdWJsaXNoVVJMKQotICB7Ci0gICAgdGhpcy5zZWN1cmVQdWJsaXNoVVJMID0gc2VjdXJlUHVibGlzaFVSTDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gdmVyc2lvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoTWV0YSgpewotCSAgICAKLQkgICAgUmVnaXN0cnlTZXJ2aWNlIHJlZ1NlcnZpY2UgPSBSZWdpc3RyeVNlcnZpY2UuaW5zdGFuY2UoKTsKLQkgICAgSVJlZ2lzdHJ5TWFuYWdlciByZWdNYW5hZ2VyID0gcmVnU2VydmljZS5nZXREZWZhdWx0UmVnaXN0cnlNYW5hZ2VyKCk7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgCi0JICAgIAkKLQkgICAgICByZWdNYW5hZ2VyLnJlZnJlc2hNYW5hZ2VyKCk7Ci0JICAgICAgU3RyaW5nW10gcmVnVVJJcyA9IHJlZ01hbmFnZXIuZ2V0UmVnaXN0cnlVUklzKCk7Ci0JICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWdVUklzLmxlbmd0aDsgaSsrKQotCSAgICAgIHsKLQkgICAgICAgIFJlZ2lzdHJ5IHJlZyA9IHJlZ01hbmFnZXIubG9hZFJlZ2lzdHJ5KHJlZ1VSSXNbaV0pOwotCSAgICAgICAgaWYgKHJlZyBpbnN0YW5jZW9mIFVERElSZWdpc3RyeSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgVURESVJlZ2lzdHJ5IHVkZGlSZWcgPSAoVURESVJlZ2lzdHJ5KXJlZzsKLQkgICAgICAgICAgTGlzdCBuYW1lcyA9IHVkZGlSZWcuZ2V0TmFtZSgpOwotCSAgICAgICAgICAKLQkgICAgICAgICAgaWYodWRkaVJlZy5nZXREaXNjb3ZlcnlVUkwoKS5lcXVhbHMoZ2V0SW5xdWlyeVVSTCgpKSl7Ci0JICAgICAgICAgIAotCSAgICAgICAgCSAgc2V0TmFtZXMobmFtZXMpOwotCSAgICAgICAgCSAgc2V0RGVzY3ModWRkaVJlZy5nZXREZXNjcmlwdGlvbigpKTsKLQkgICAgICAgIAkgIHNldFZlcnNpb24odWRkaVJlZy5nZXRWZXJzaW9uKCkpOwotCSAgICAgICAgCSAgc2V0RGVmYXVsdExvZ2luKHVkZGlSZWcuZ2V0RGVmYXVsdExvZ2luKCkpOwotCSAgICAgICAgCSAgc2V0RGVmYXVsdFBhc3N3b3JkKHVkZGlSZWcuZ2V0RGVmYXVsdFBhc3N3b3JkKCkpOwotCSAgICAgICAgCSAgc2V0SW5xdWlyeVVSTCh1ZGRpUmVnLmdldERpc2NvdmVyeVVSTCgpKTsKLQkgICAgICAgIAkgIHNldFB1Ymxpc2hVUkwodWRkaVJlZy5nZXRQdWJsaWNhdGlvblVSTCgpKTsKLQkgICAgICAgIAkgIHNldFNlY3VyZUlucXVpcnlVUkwodWRkaVJlZy5nZXRTZWN1cmVkRGlzY292ZXJ5VVJMKCkpOwotCSAgICAgICAgCSAgc2V0U2VjdXJlUHVibGlzaFVSTCh1ZGRpUmVnLmdldFNlY3VyZWRQdWJsaWNhdGlvblVSTCgpKTsKLQkgICAgICAgIAkgIFRheG9ub215W10gdGF4b25vbWllcyA9IHJlZ01hbmFnZXIubG9hZFRheG9ub21pZXMoVURESVJlZ2lzdHJ5U2VydmljZS5pbnN0YW5jZSgpLmdldFRheG9ub215VVJJcyh1ZGRpUmVnKSk7Ci0JICAgICAgICAJICBzZXRUYXhvbm9taWVzKHRheG9ub21pZXMpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotCSAgICB7Ci0JICAgICAgLy8gVE9ETzogQmV0dGVyIGVycm9yIHJlcG9ydGluZwotCSAgICAgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICB9ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWFkMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwOTA2ICAgMTQxNzk2IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5JUmVnaXN0cnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5SZWdpc3RyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnJlZ2lzdHJ5LlVERElSZWdpc3RyeVNlcnZpY2U7Ci0KLS8qKgotICogVGhlIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBXU0lMIGRvY3VtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudCBleHRlbmRzIEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQKLXsKLSAgcHVibGljIEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCwgbm9kZU1hbmFnZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCkKLSAgewotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKXsKLQkgICAgZGlzY29ubmVjdFJlbChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9OT0RFKTsKLQkgICAgUmVnaXN0cnlTZXJ2aWNlIHJlZ1NlcnZpY2UgPSBSZWdpc3RyeVNlcnZpY2UuaW5zdGFuY2UoKTsKLQkgICAgSVJlZ2lzdHJ5TWFuYWdlciByZWdNYW5hZ2VyID0gcmVnU2VydmljZS5nZXREZWZhdWx0UmVnaXN0cnlNYW5hZ2VyKCk7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgcmVnTWFuYWdlci5yZWZyZXNoTWFuYWdlcigpOwotCSAgICAgIFN0cmluZ1tdIHJlZ1VSSXMgPSByZWdNYW5hZ2VyLmdldFJlZ2lzdHJ5VVJJcygpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVnVVJJcy5sZW5ndGg7IGkrKykKLQkgICAgICB7Ci0JICAgICAgICBSZWdpc3RyeSByZWcgPSByZWdNYW5hZ2VyLmxvYWRSZWdpc3RyeShyZWdVUklzW2ldKTsKLQkgICAgICAgIGlmIChyZWcgaW5zdGFuY2VvZiBVRERJUmVnaXN0cnkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIFVERElSZWdpc3RyeSB1ZGRpUmVnID0gKFVERElSZWdpc3RyeSlyZWc7Ci0JICAgICAgICAgIExpc3QgbmFtZXMgPSB1ZGRpUmVnLmdldE5hbWUoKTsKLQkgICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0gbmFtZXMgIT0gbnVsbCAmJiAhbmFtZXMuaXNFbXB0eSgpID8gKChOYW1lKW5hbWVzLmdldCgwKSkuZ2V0VmFsdWUoKSA6ICIiOwotCSAgICAgICAgICBGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZVc2VyRGVmVURESVJlZ0VsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUVsZW1lbnQoZGlzcGxheU5hbWUsIGdldE1vZGVsKCkpOwotCSAgICAgICAgICBmYXZVc2VyRGVmVURESVJlZ0VsZW1lbnQuc2V0TmFtZXMobmFtZXMpOwotCSAgICAgICAgICBmYXZVc2VyRGVmVURESVJlZ0VsZW1lbnQuc2V0RGVzY3ModWRkaVJlZy5nZXREZXNjcmlwdGlvbigpKTsKLQkgICAgICAgICAgZmF2VXNlckRlZlVERElSZWdFbGVtZW50LnNldFZlcnNpb24odWRkaVJlZy5nZXRWZXJzaW9uKCkpOwotCSAgICAgICAgICBmYXZVc2VyRGVmVURESVJlZ0VsZW1lbnQuc2V0RGVmYXVsdExvZ2luKHVkZGlSZWcuZ2V0RGVmYXVsdExvZ2luKCkpOwotCSAgICAgICAgICBmYXZVc2VyRGVmVURESVJlZ0VsZW1lbnQuc2V0RGVmYXVsdFBhc3N3b3JkKHVkZGlSZWcuZ2V0RGVmYXVsdFBhc3N3b3JkKCkpOwotCSAgICAgICAgICBmYXZVc2VyRGVmVURESVJlZ0VsZW1lbnQuc2V0SW5xdWlyeVVSTCh1ZGRpUmVnLmdldERpc2NvdmVyeVVSTCgpKTsKLQkgICAgICAgICAgZmF2VXNlckRlZlVERElSZWdFbGVtZW50LnNldFB1Ymxpc2hVUkwodWRkaVJlZy5nZXRQdWJsaWNhdGlvblVSTCgpKTsKLQkgICAgICAgICAgZmF2VXNlckRlZlVERElSZWdFbGVtZW50LnNldFNlY3VyZUlucXVpcnlVUkwodWRkaVJlZy5nZXRTZWN1cmVkRGlzY292ZXJ5VVJMKCkpOwotCSAgICAgICAgICBmYXZVc2VyRGVmVURESVJlZ0VsZW1lbnQuc2V0U2VjdXJlUHVibGlzaFVSTCh1ZGRpUmVnLmdldFNlY3VyZWRQdWJsaWNhdGlvblVSTCgpKTsKLQkgICAgICAgICAgVGF4b25vbXlbXSB0YXhvbm9taWVzID0gcmVnTWFuYWdlci5sb2FkVGF4b25vbWllcyhVRERJUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCkuZ2V0VGF4b25vbXlVUklzKHVkZGlSZWcpKTsKLQkgICAgICAgICAgZmF2VXNlckRlZlVERElSZWdFbGVtZW50LnNldFRheG9ub21pZXModGF4b25vbWllcyk7Ci0JICAgICAgICAgIGNvbm5lY3QoZmF2VXNlckRlZlVERElSZWdFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLQkgICAgewotCSAgICAgIC8vIFRPRE86IEJldHRlciBlcnJvciByZXBvcnRpbmcKLQkgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgICAgfSAgCi0gIH0KLSAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpCi0gIHsKLSAgICAvLyBkbyBub3RoaW5nCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cyhIYXNodGFibGUgdGFibGUpCi0gIHsKLSAgICAvLyBkbyBub3RoaW5nCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVGYXZvcml0ZUJ5Tm9kZUlEKGludCBub2RlSUQsIFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkKLSAgewotICAgIC8vIGRvIG5vdGhpbmcKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbEZhdm9yaXRlcyhTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpCi0gIHsKLSAgICAvLyBkbyBub3RoaW5nCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QWxsRmF2b3JpdGVzKCkKLSAgewotICAgICByZXR1cm4gZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VTRVJfREVGX1VERElfUkVHSVNUUllfTk9ERSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDJmZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzLkZhdm9yaXRlc1dTREw7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNFbGVtZW50IHsKLQotICBwcml2YXRlIEZhdm9yaXRlc1dTREwgd3NkbF87Ci0KLSAgcHVibGljIEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgICB3c2RsXyA9IG5ldyBGYXZvcml0ZXNXU0RMKCk7Ci0gICAgd3NkbF8uc2V0U2VydmljZShzZXJ2aWNlKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoKSB7Ci0gICAgcmV0dXJuIHdzZGxfLmdldFNlcnZpY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVybCgpIHsKLSAgICByZXR1cm4gd3NkbF8uZ2V0V3NkbFVybCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gZ2V0V3NkbFVybCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlckVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTk1ZTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc01vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyRWxlbWVudCBleHRlbmRzIEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQKLXsKLQotICBwdWJsaWMgRmF2b3JpdGVzV1NETFNlcnZpY2VGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCwgbm9kZU1hbmFnZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCkgewotICAgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IGZhdk1haW5FbGVtZW50LmxvYWRXU0RMU2VydmljZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlc1tpXTsKLSAgICAgIEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCBmYXZXU0RMU2VydmljZUVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KChzZXJ2aWNlLmdldERlc2NyaXB0aW9ucygpKVswXS5nZXRMb2NhdGlvbigpLCBnZXRNb2RlbCgpLCBzZXJ2aWNlKTsKLSAgICAgIGNvbm5lY3QoZmF2V1NETFNlcnZpY2VFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gYWRkRmF2b3JpdGUoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1dTRExfVVJMKTsKLSAgICBpZiAod3NkbFVSTCA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCBlID0gZ2V0RmF2b3JpdGUod3NkbFVSTCk7Ci0gICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgIHJlbW92ZUZhdm9yaXRlKGUpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBmYXZNYWluRWxlbWVudC5hZGRXU0RMU2VydmljZSh3c2RsVVJMKTsKLSAgICBib29sZWFuIHNhdmVkID0gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICAgIGlmIChzYXZlZCkgewotICAgICAgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IGZhdldTRExTZXJ2aWNlRWxlbWVudCA9IG5ldyBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQod3NkbFVSTCwgZ2V0TW9kZWwoKSwgc2VydmljZSk7Ci0gICAgICBjb25uZWN0KGZhdldTRExTZXJ2aWNlRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIH0KLSAgICByZXR1cm4gc2F2ZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cyhIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfV1NETF9VUkwpOwotICAgIGlmICh3c2RsVVJMID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIChnZXRGYXZvcml0ZSh3c2RsVVJMKSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUZhdm9yaXRlQnlOb2RlSUQoaW50IG5vZGVJRCxTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpCi0gICAgICByZXR1cm4gKHJlbW92ZUZhdm9yaXRlKChGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KSAmJiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZUZhdm9yaXRlKEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gKChGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpZWxlbWVudCkuZ2V0U2VydmljZSgpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBpZiAoZmF2TWFpbkVsZW1lbnQucmVtb3ZlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsRmF2b3JpdGVzKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkgewotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IGZhdldTRExTZXJ2aWNlRWxlbWVudCA9IChGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgU2VydmljZSBzZXJ2aWNlID0gZmF2V1NETFNlcnZpY2VFbGVtZW50LmdldFNlcnZpY2UoKTsKLSAgICAgIGZhdk1haW5FbGVtZW50LnJlbW92ZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotICAgIGRpc2Nvbm5lY3RSZWwoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9OT0RFKTsKLSAgICByZXR1cm4gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEZhdm9yaXRlcygpIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9OT0RFKTsKLSAgfQotCi0gIHByaXZhdGUgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IGdldEZhdm9yaXRlKFN0cmluZyB3c2RsVXJsKSB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmICh3c2RsVXJsLmVxdWFscyh3c2RsRWxlbWVudC5nZXRXc2RsVXJsKCkpKQotICAgICAgICByZXR1cm4gd3NkbEVsZW1lbnQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0lMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzV1NJTEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1ZDM4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0lMRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlcy5GYXZvcml0ZXNXU0lMOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzV1NJTEVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNFbGVtZW50IHsKLQotICBwcml2YXRlIEZhdm9yaXRlc1dTSUwgd3NpbF87Ci0KLSAgcHVibGljIEZhdm9yaXRlc1dTSUxFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTGluayBsaW5rKSB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHdzaWxfID0gbmV3IEZhdm9yaXRlc1dTSUwoKTsKLSAgICB3c2lsXy5zZXRMaW5rKGxpbmspOwotICB9Ci0KLSAgcHVibGljIExpbmsgZ2V0TGluaygpIHsKLSAgICByZXR1cm4gd3NpbF8uZ2V0TGluaygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVXJsKCkgewotICAgIHJldHVybiB3c2lsXy5nZXRXc2lsVXJsKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBnZXRXc2lsVXJsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0lMRm9sZGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmZiMmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzV1NJTEZvbGRlckVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IHsKLQotICBwdWJsaWMgRmF2b3JpdGVzV1NJTEZvbGRlckVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBOb2RlTWFuYWdlciBub2RlTWFuYWdlcikgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsLCBub2RlTWFuYWdlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50KSB7Ci0gICAgTGlua1tdIGxpbmtzID0gZmF2TWFpbkVsZW1lbnQubG9hZFdTSUxzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgewotICAgICAgTGluayBsaW5rID0gbGlua3NbaV07Ci0gICAgICBGYXZvcml0ZXNXU0lMRWxlbWVudCBmYXZXU0lMRWxlbWVudCA9IG5ldyBGYXZvcml0ZXNXU0lMRWxlbWVudChsaW5rLmdldExvY2F0aW9uKCksIGdldE1vZGVsKCksIGxpbmspOwotICAgICAgY29ubmVjdChmYXZXU0lMRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgd3NpbFVSTCA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfV1NJTF9VUkwpOwotICAgIGlmICh3c2lsVVJMID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgRmF2b3JpdGVzV1NJTEVsZW1lbnQgZSA9IGdldEZhdm9yaXRlKHdzaWxVUkwpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgICByZW1vdmVGYXZvcml0ZShlKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgTGluayBsaW5rID0gZmF2TWFpbkVsZW1lbnQuYWRkV1NJTExpbmsod3NpbFVSTCk7Ci0gICAgYm9vbGVhbiBzYXZlZCA9IGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKTsKLSAgICBpZiAoc2F2ZWQpIHsKLSAgICAgIEZhdm9yaXRlc1dTSUxFbGVtZW50IGZhdldTSUxFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1dTSUxFbGVtZW50KHdzaWxVUkwsIGdldE1vZGVsKCksIGxpbmspOwotICAgICAgY29ubmVjdChmYXZXU0lMRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNhdmVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIHdzaWxVUkwgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1dTSUxfVVJMKTsKLSAgICBpZiAod3NpbFVSTCA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAoZ2V0RmF2b3JpdGUod3NpbFVSTCkgIT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVGYXZvcml0ZUJ5Tm9kZUlEKGludCBub2RlSUQsU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzV1NJTEVsZW1lbnQpCi0gICAgICByZXR1cm4gKHJlbW92ZUZhdm9yaXRlKChGYXZvcml0ZXNXU0lMRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpICYmIGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZUZhdm9yaXRlKEZhdm9yaXRlc1dTSUxFbGVtZW50IGVsZW1lbnQpIHsKLSAgICBMaW5rIGxpbmsgPSBlbGVtZW50LmdldExpbmsoKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgaWYgKGZhdk1haW5FbGVtZW50LnJlbW92ZUxpbmsobGluaykpIHsKLSAgICAgIGVsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbEZhdm9yaXRlcyhTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIEZhdm9yaXRlc1dTSUxFbGVtZW50IGZhdldTSUxFbGVtZW50ID0gKEZhdm9yaXRlc1dTSUxFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIExpbmsgbGluayA9IGZhdldTSUxFbGVtZW50LmdldExpbmsoKTsKLSAgICAgIGZhdk1haW5FbGVtZW50LnJlbW92ZUxpbmsobGluayk7Ci0gICAgfQotICAgIGRpc2Nvbm5lY3RSZWwoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfTk9ERSk7Ci0gICAgcmV0dXJuIGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBbGxGYXZvcml0ZXMoKSB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX05PREUpOwotICB9Ci0KLSAgcHJpdmF0ZSBGYXZvcml0ZXNXU0lMRWxlbWVudCBnZXRGYXZvcml0ZShTdHJpbmcgd3NpbFVybCkgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzV1NJTEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoRmF2b3JpdGVzV1NJTEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKHdzaWxVcmwuZXF1YWxzKHdzaWxFbGVtZW50LmdldFdzaWxVcmwoKSkpCi0gICAgICAgIHJldHVybiB3c2lsRWxlbWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvQWRkVG9VRERJUGVyc3BlY3RpdmVUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0FkZFRvVURESVBlcnNwZWN0aXZlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTIzNjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvQWRkVG9VRERJUGVyc3BlY3RpdmVUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5BZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGRUb1VERElQZXJzcGVjdGl2ZVRvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLQotICAgIHB1YmxpYyBBZGRUb1VERElQZXJzcGVjdGl2ZVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJmYXZvcml0ZXMvaW1hZ2VzL2FkZF90b191ZGRpX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIiwgImZhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3VkZGlfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmIzNWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZVRvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLQotICAgIHB1YmxpYyBBZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fd3NpbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIsICJmYXZvcml0ZXMvaW1hZ2VzL2FkZF90b193c2lsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGViYTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5GYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCBleHRlbmRzIEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCB7Ci0KLSAgcHVibGljIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0ltcG9ydFRvRmlsZVN5c3RlbVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTEwOTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkltcG9ydFRvRmlsZVN5c3RlbVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtVG9vbCBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbVRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc0ltcG9ydFRvRmlsZVN5c3RlbVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCJmYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1MzM0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuSW1wb3J0VG9Xb3JrYmVuY2hUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoVG9vbCBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoVG9vbCB7Ci0KLSAgICBwdWJsaWMgRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hGb3JtLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTU0NjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sIGV4dGVuZHMgTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc01haW5Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc01haW5Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYmFmZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNNYWluTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzTWFpbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzV1NETFNlcnZpY2VGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc01haW5Ob2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yTm9kZSB7Ci0gICAgcHVibGljIEZhdm9yaXRlc01haW5Ob2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlcikgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIDEsICJpbWFnZXMvcm9vdF9tYWluLmdpZiIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBVRERJIFJlZ2lzdHJ5IEZvbGRlciBOb2RlCi0gICAgICAgIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQgZmF2VURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudCA9IG5ldyBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KGdldE1lc3NhZ2UoIkZBVk9SSVRFU19VRERJX1JFR0lTVFJJRVNfRk9MREVSX05PREUiKSwgdHJlZUVsZW1lbnQuZ2V0TW9kZWwoKSwgbm9kZU1hbmFnZXIpOwotICAgICAgICB0cmVlRWxlbWVudC5jb25uZWN0KGZhdlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX0ZPTERFUl9OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJOb2RlIGZhdlVERElSZWdpc3RyeUZvbGRlck5vZGUgPSBuZXcgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyTm9kZShmYXZVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoXyArIDEpOwotICAgICAgICBhZGRDaGlsZChmYXZVRERJUmVnaXN0cnlGb2xkZXJOb2RlKTsKLSAgICAgICAgZmF2VURESVJlZ2lzdHJ5Rm9sZGVyTm9kZS5zZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbihmYWxzZSk7Ci0gICAgICAgIGZhdlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQuaW5pdCgoRmF2b3JpdGVzTWFpbkVsZW1lbnQpdHJlZUVsZW1lbnQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBVc2VyIGRlZmluZWQgVURESSBSZWdpc3RyeSBGb2xkZXIgTm9kZQotICAgICAgICBGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudCBmYXZVc2VyRGVmVURESUZvbGRlckVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQoZ2V0TWVzc2FnZSgiRkFWT1JJVEVTX1VTRVJfREVGX1VERElfUkVHSVNUUklFU19GT0xERVJfTk9ERSIpLCB0cmVlRWxlbWVudC5nZXRNb2RlbCgpLCBub2RlTWFuYWdlcik7Ci0gICAgICAgIHRyZWVFbGVtZW50LmNvbm5lY3QoZmF2VXNlckRlZlVERElGb2xkZXJFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9GT0xERVJfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlck5vZGUgZmF2VXNlckRlZlVERElGb2xkZXJOb2RlID0gbmV3IEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlGb2xkZXJOb2RlKGZhdlVzZXJEZWZVRERJRm9sZGVyRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgYWRkQ2hpbGQoZmF2VXNlckRlZlVERElGb2xkZXJOb2RlKTsKLSAgICAgICAgZmF2VXNlckRlZlVERElGb2xkZXJOb2RlLnNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGZhbHNlKTsKLSAgICAgICAgZmF2VXNlckRlZlVERElGb2xkZXJFbGVtZW50LmluaXQoKEZhdm9yaXRlc01haW5FbGVtZW50KXRyZWVFbGVtZW50KTsKLQotICAgICAgICAvLyBDcmVhdGUgVURESSBCdXNpbmVzcyBGb2xkZXIgTm9kZQotICAgICAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50IGZhdlVERElCdXNpbmVzc0ZvbGRlckVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudChnZXRNZXNzYWdlKCJGQVZPUklURVNfVURESV9CVVNJTkVTU0VTX0ZPTERFUl9OT0RFIiksIHRyZWVFbGVtZW50LmdldE1vZGVsKCksIG5vZGVNYW5hZ2VyKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuY29ubmVjdChmYXZVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9CVVNJTkVTU19GT0xERVJfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyTm9kZSBmYXZVRERJQnVzaW5lc3NGb2xkZXJOb2RlID0gbmV3IEZhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlck5vZGUoZmF2VURESUJ1c2luZXNzRm9sZGVyRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgYWRkQ2hpbGQoZmF2VURESUJ1c2luZXNzRm9sZGVyTm9kZSk7Ci0gICAgICAgIGZhdlVERElCdXNpbmVzc0ZvbGRlck5vZGUuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICAgICAgICBmYXZVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50LmluaXQoKEZhdm9yaXRlc01haW5FbGVtZW50KXRyZWVFbGVtZW50KTsKLQotICAgICAgICAvLyBDcmVhdGUgVURESSBTZXJ2aWNlIEZvbGRlciBOb2RlCi0gICAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudCBmYXZVRERJU2VydmljZUZvbGRlckVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50KGdldE1lc3NhZ2UoIkZBVk9SSVRFU19VRERJX1NFUlZJQ0VfRk9MREVSX05PREUiKSwgdHJlZUVsZW1lbnQuZ2V0TW9kZWwoKSwgbm9kZU1hbmFnZXIpOwotICAgICAgICB0cmVlRWxlbWVudC5jb25uZWN0KGZhdlVERElTZXJ2aWNlRm9sZGVyRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9GT0xERVJfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJOb2RlIGZhdlVERElTZXJ2aWNlRm9sZGVyTm9kZSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUZvbGRlck5vZGUoZmF2VURESVNlcnZpY2VGb2xkZXJFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoXyArIDEpOwotICAgICAgICBhZGRDaGlsZChmYXZVRERJU2VydmljZUZvbGRlck5vZGUpOwotICAgICAgICBmYXZVRERJU2VydmljZUZvbGRlck5vZGUuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICAgICAgICBmYXZVRERJU2VydmljZUZvbGRlckVsZW1lbnQuaW5pdCgoRmF2b3JpdGVzTWFpbkVsZW1lbnQpdHJlZUVsZW1lbnQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBVRERJIFNlcnZpY2UgSW50ZXJmYWNlIEZvbGRlciBOb2RlCi0gICAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyRWxlbWVudCBmYXZVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50KGdldE1lc3NhZ2UoIkZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERSIpLCB0cmVlRWxlbWVudC5nZXRNb2RlbCgpLCBub2RlTWFuYWdlcik7Ci0gICAgICAgIHRyZWVFbGVtZW50LmNvbm5lY3QoZmF2VURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9GT0xERVJfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJOb2RlIGZhdlVERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyTm9kZSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUoZmF2VURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoXyArIDEpOwotICAgICAgICBhZGRDaGlsZChmYXZVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUpOwotICAgICAgICBmYXZVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICAgICAgICBmYXZVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQuaW5pdCgoRmF2b3JpdGVzTWFpbkVsZW1lbnQpdHJlZUVsZW1lbnQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBXU0lMIEZvbGRlciBOb2RlCi0gICAgICAgIEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50IGZhdldTSUxGb2xkZXJFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50KGdldE1lc3NhZ2UoIkZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFIiksIHRyZWVFbGVtZW50LmdldE1vZGVsKCksIG5vZGVNYW5hZ2VyKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuY29ubmVjdChmYXZXU0lMRm9sZGVyRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfRk9MREVSX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgICAgIEZhdm9yaXRlc1dTSUxGb2xkZXJOb2RlIGZhdldTSUxGb2xkZXJOb2RlID0gbmV3IEZhdm9yaXRlc1dTSUxGb2xkZXJOb2RlKGZhdldTSUxGb2xkZXJFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoXyArIDEpOwotICAgICAgICBhZGRDaGlsZChmYXZXU0lMRm9sZGVyTm9kZSk7Ci0gICAgICAgIGZhdldTSUxGb2xkZXJOb2RlLnNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGZhbHNlKTsKLSAgICAgICAgZmF2V1NJTEZvbGRlckVsZW1lbnQuaW5pdCgoRmF2b3JpdGVzTWFpbkVsZW1lbnQpdHJlZUVsZW1lbnQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBXU0RMIFNlcnZpY2UgRm9sZGVyIE5vZGUKLSAgICAgICAgRmF2b3JpdGVzV1NETFNlcnZpY2VGb2xkZXJFbGVtZW50IGZhdldTRExTZXJ2aWNlRm9sZGVyRWxlbWVudCA9IG5ldyBGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlckVsZW1lbnQoZ2V0TWVzc2FnZSgiRkFWT1JJVEVTX1dTRExfU0VSVklDRV9GT0xERVJfTk9ERSIpLCB0cmVlRWxlbWVudC5nZXRNb2RlbCgpLCBub2RlTWFuYWdlcik7Ci0gICAgICAgIHRyZWVFbGVtZW50LmNvbm5lY3QoZmF2V1NETFNlcnZpY2VGb2xkZXJFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgICAgICBGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlck5vZGUgZmF2V1NETFNlcnZpY2VGb2xkZXJOb2RlID0gbmV3IEZhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyTm9kZShmYXZXU0RMU2VydmljZUZvbGRlckVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgIGFkZENoaWxkKGZhdldTRExTZXJ2aWNlRm9sZGVyTm9kZSk7Ci0gICAgICAgIGZhdldTRExTZXJ2aWNlRm9sZGVyTm9kZS5zZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbihmYWxzZSk7Ci0gICAgICAgIGZhdldTRExTZXJ2aWNlRm9sZGVyRWxlbWVudC5pbml0KChGYXZvcml0ZXNNYWluRWxlbWVudCl0cmVlRWxlbWVudCk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0gICAgICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICByZXR1cm4gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZShtc2cpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNOYXZpZ2F0b3JGb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc05hdmlnYXRvckZvbGRlck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmOWQ3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc05hdmlnYXRvckZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9sZGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYXZvcml0ZXNOYXZpZ2F0b3JGb2xkZXJOb2RlIGV4dGVuZHMgRm9sZGVyTm9kZSB7Ci0KLSAgICBwdWJsaWMgRmF2b3JpdGVzTmF2aWdhdG9yRm9sZGVyTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKSB7Ci0gICAgICAgIHJldHVybiBGYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxpc09wZW5fKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCkgewotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8sIGZhbHNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzTmF2aWdhdG9yTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNOYXZpZ2F0b3JOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzM2ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNOYXZpZ2F0b3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkZhdm9yaXRlc1RvZ2dsZU5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmF2b3JpdGVzTmF2aWdhdG9yTm9kZSBleHRlbmRzIE5vZGUgewotCi0gICAgcHVibGljIEZhdm9yaXRlc05hdmlnYXRvck5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoLCBTdHJpbmcgaW1hZ2VQYXRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCBpbWFnZVBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKSB7Ci0gICAgICAgIHJldHVybiBGYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxpc09wZW5fKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCkgewotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8sIGZhbHNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzUGVyc3BlY3RpdmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkNmNkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc01haW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBleHRlbmRzIFBlcnNwZWN0aXZlCi17Ci0gICAgcHJpdmF0ZSBCYXNpY01vZGVsIG1vZGVsXzsKLSAgICBwcml2YXRlIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyXzsKLSAgICBwcml2YXRlIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICAgIHByaXZhdGUgU3RyaW5nIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgICBwcml2YXRlIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgICBwcml2YXRlIFN0cmluZyBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotCi0gICAgcHVibGljIEZhdm9yaXRlc1BlcnNwZWN0aXZlKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKCJmYXZvcml0ZXMiLGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXRQZXJzcGVjdGl2ZShTZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIG1vZGVsXyA9IG5ldyBCYXNpY01vZGVsKCJGYXZvcml0ZXNNb2RlbCIpOwotICAgICAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZvcml0ZXNNYWluRWxlbWVudCA9IG5ldyBGYXZvcml0ZXNNYWluRWxlbWVudChnZXRNZXNzYWdlKCJGQVZPUklURVNfTUFJTl9OT0RFIiksIG1vZGVsXywgY29udHJvbGxlcl8pOwotICAgICAgICBtb2RlbF8uc2V0Um9vdEVsZW1lbnQoZmF2b3JpdGVzTWFpbkVsZW1lbnQpOwotICAgICAgICBub2RlTWFuYWdlcl8gPSBuZXcgTm9kZU1hbmFnZXIoY29udHJvbGxlcl8pOwotICAgICAgICBGYXZvcml0ZXNNYWluTm9kZSBmYXZNYWluTm9kZSA9IG5ldyBGYXZvcml0ZXNNYWluTm9kZShmYXZvcml0ZXNNYWluRWxlbWVudCwgbm9kZU1hbmFnZXJfKTsKLSAgICAgICAgbm9kZU1hbmFnZXJfLnNldFJvb3ROb2RlKGZhdk1haW5Ob2RlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN0YXJ0aW5nIGZyYW1lc2V0IHNpemVzLgotICAgICAgICBpZiAoIURpclV0aWxzLmlzUlRMKCkpCi0gICAgICAgICAgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9ICIzMCUsKiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gIiosMzAlIjsKLSAgICAgICAgc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgICAgICAgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSAiNzUlLCoiOwotICAgICAgICBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZU1hbmFnZXIgZ2V0Tm9kZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBub2RlTWFuYWdlcl87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL2Zhdl9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfRkFWT1JJVEVTOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFuZXNGaWxlKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1BhbmVzLmpzcCI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc0ZyYW1lc2V0c0Zvcm0oKQotICAgIHsKLSAgICAgIHJldHVybiAiZmF2b3JpdGVzL2Zvcm1zL1Byb2Nlc3NGYXZvcml0ZXNGcmFtZXNldHNGb3JtLmpzcCI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJhbWVzZXRzRmlsZSgpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNmcmFtZXNldHMuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gImZhdk5hdmlnYXRvckNvbnRlbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRlbnQuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2UHJvcGVydGllc0NvbnRhaW5lciI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gImZhdlN0YXR1c0NvbnRlbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRWYXIoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2UHJvcGVydGllc0NvbnRlbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250ZW50LmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKQotICAgIHsKLSAgICAgIHJldHVybiBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoU3RyaW5nIGNvbHMpCi0gICAgewotICAgICAgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9IGNvbHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKQotICAgIHsKLSAgICAgIHJldHVybiBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKFN0cmluZyBjb2xzKQotICAgIHsKLSAgICAgIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9IGNvbHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpCi0gICAgewotICAgICAgcmV0dXJuIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKFN0cmluZyByb3dzKQotICAgIHsKLSAgICAgIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gcm93czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKQotICAgIHsKLSAgICAgIHJldHVybiBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoU3RyaW5nIHJvd3MpCi0gICAgewotICAgICAgc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IHJvd3M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3dpdGNoUGVyc3BlY3RpdmVGb3JtQWN0aW9uTGluayhpbnQgdGFyZ2V0UGVyc3BlY3RpdmVJZCxib29sZWFuIGZvckhpc3RvcnkpCi0gICAgewotICAgICAgcmV0dXJuIFN3aXRjaFBlcnNwZWN0aXZlRnJvbUZhdm9yaXRlc0FjdGlvbi5nZXRGb3JtQWN0aW9uTGluayh0YXJnZXRQZXJzcGVjdGl2ZUlkLGZvckhpc3RvcnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTA0MDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5GYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc1Rvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1NldERlZmF1bHRWaWV3VG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNTZXREZWZhdWx0Vmlld1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmZDQxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1NldERlZmF1bHRWaWV3VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2V0RGVmYXVsdFZpZXdUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1NldERlZmF1bHRWaWV3VG9vbCBleHRlbmRzIFNldERlZmF1bHRWaWV3VG9vbCB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1NldERlZmF1bHRWaWV3VG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQsIEFjdGlvbklucHV0cy5WSUVXVE9PTElEX0RFRkFVTFQsIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxULCBBY3Rpb25JbnB1dHMuVklFV1RPT0xJRF9ERUZBVUxULCBmYWxzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDlhMmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESUJ1c2luZXNzRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICAgIHsKLSAgICAgIHJldHVybiAiZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1N2ZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJOb2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yRm9sZGVyTm9kZSB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlck5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbC5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfQlVTSU5FU1NfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESUJ1c2luZXNzTm9kZSBmYXZvcml0ZXNVRERJQnVzaW5lc3NOb2RlID0gbmV3IEZhdm9yaXRlc1VERElCdXNpbmVzc05vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENoaWxkKGZhdm9yaXRlc1VERElCdXNpbmVzc05vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBMaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTUyIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElCdXNpbmVzc05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESUJ1c2luZXNzTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjVkZmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESUJ1c2luZXNzTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElCdXNpbmVzc05vZGUgZXh0ZW5kcyBGYXZvcml0ZXNOYXZpZ2F0b3JOb2RlIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzVURESUJ1c2luZXNzTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgsICJmYXZvcml0ZXMvaW1hZ2VzL3VkZGlfYnVzaW5lc3Nfbm9kZS5naWYiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgRmF2b3JpdGVzVURESUJ1c2luZXNzRGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfRkFWT1JJVEVTX1VERElfQlVTSU5FU1NfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IEFkZFRvVURESVBlcnNwZWN0aXZlVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfVE9fVURESV9QRVJTUEVDVElWRSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5Nzk5NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJUmVnaXN0cnlEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0KLSAgICBwdWJsaWMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc1BhZ2UuanNwIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmFlYzhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlck5vZGUgZXh0ZW5kcyBGYXZvcml0ZXNOYXZpZ2F0b3JGb2xkZXJOb2RlIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgpOwotICAgICAgICB0cmVlRWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlRWxlbWVudCByZWdFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGltYWdlUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGNhdGVnb3JpZXNEaXJlY3RvcnkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQuZm9ybUNhdGVnb3JpZXNEaXJlY3RvcnkoY2F0ZWdvcmllc0RpcmVjdG9yeSxub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkscmVnRWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGNhdGVnb3J5RGlyZWN0b3J5RmlsZSA9IG5ldyBGaWxlKGNhdGVnb3JpZXNEaXJlY3RvcnkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNhdGVnb3J5RmlsZXMgPSBjYXRlZ29yeURpcmVjdG9yeUZpbGUubGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlGaWxlcyAhPSBudWxsICYmIGNhdGVnb3J5RmlsZXMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBhdGggPSAiZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3JlZ2lzdHJ5X2NhdF9ub2RlLmdpZiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBhdGggPSAiZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3JlZ2lzdHJ5X25vZGUuZ2lmIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Tm9kZSBmYXZvcml0ZXNVRERJUmVnaXN0cnlOb2RlID0gbmV3IEZhdm9yaXRlc1VERElSZWdpc3RyeU5vZGUocmVnRWxlbWVudCwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSwgaW1hZ2VQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2hpbGQoZmF2b3JpdGVzVURESVJlZ2lzdHJ5Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IExpc3RGYXZvcml0ZVVERElSZWdpc3RyeVRvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9GQVZPUklURV9VRERJX1JFR0lTVFJZIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVJlZ2lzdHJ5Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJUmVnaXN0cnlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjN2ZjOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJUmVnaXN0cnlOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Tm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNVRERJUmVnaXN0cnlOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCxTdHJpbmcgaW1hZ2VQYXRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCBpbWFnZVBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBGYXZvcml0ZXNVRERJUmVnaXN0cnlEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfVURESV9SRUdJU1RSWV9ERVRBSUxTIikpOwotICAgICAgICBuZXcgQWRkVG9VRERJUGVyc3BlY3RpdmVUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9UT19VRERJX1BFUlNQRUNUSVZFIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGJmNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTU1NWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJOb2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yRm9sZGVyTm9kZSB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgpOwotICAgICAgICB0cmVlRWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlTm9kZSBmYXZvcml0ZXNVRERJU2VydmljZU5vZGUgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VOb2RlKChUcmVlRWxlbWVudClldmVudC5nZXRQYXJlbnRFbGVtZW50KCksIG5vZGVNYW5hZ2VyXywgbm9kZURlcHRoXyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDaGlsZChmYXZvcml0ZXNVRERJU2VydmljZU5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0T3V0Qm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkTm9kZShjaGlsZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZURldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMThkZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZURldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZURldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVNlcnZpY2VJbnREZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZThiMTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJOb2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yRm9sZGVyTm9kZSB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgpOwotICAgICAgICB0cmVlRWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZU5vZGUgZmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VOb2RlID0gbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlTm9kZSgoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpLCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2hpbGQoZmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0T3V0Qm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkTm9kZShjaGlsZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MjIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZU5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCAiZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3NlcnZpY2VfaW50ZXJmYWNlX25vZGUuZ2lmIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfRkFWT1JJVEVTX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IEFkZFRvVURESVBlcnNwZWN0aXZlVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfVE9fVURESV9QRVJTUEVDVElWRSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlZTM4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNVRERJU2VydmljZU5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCAiZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3NlcnZpY2Vfbm9kZS5naWYiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0RFVEFJTFMiKSk7Ci0gICAgICAgIG5ldyBBZGRUb1VERElQZXJzcGVjdGl2ZVRvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeURldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTU3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sCi17Ci0gIHB1YmxpYyBGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9kZXRhaWxzX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeURldGFpbHNQYWdlLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhZTI1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlGb2xkZXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlOb2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc01vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlGb2xkZXJOb2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yRm9sZGVyTm9kZQotewotICBwdWJsaWMgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlck5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgpOwotICAgIHRyZWVFbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgaWYgKHJlbC5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VTRVJfREVGX1VERElfUkVHSVNUUllfTk9ERSkpCi0gICAgICAgIHsKLSAgICAgICAgICBUcmVlRWxlbWVudCByZWdFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICBTdHJpbmcgaW1hZ2VQYXRoID0gImZhdm9yaXRlcy9pbWFnZXMvdWRkaV9yZWdpc3RyeV9ub2RlLmdpZiI7Ci0gICAgICAgICAgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGUgZmF2VXNlckRlZlVERElSZWdpc3RyeU5vZGUgPSBuZXcgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGUocmVnRWxlbWVudCwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSwgaW1hZ2VQYXRoKTsKLSAgICAgICAgICBhZGRDaGlsZChmYXZVc2VyRGVmVURESVJlZ2lzdHJ5Tm9kZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VU0VSX0RFRl9VRERJX1JFR0lTVFJZX05PREUpKQotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9OT0RFKSkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpCi0gIHsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBuZXcgTGlzdEZhdm9yaXRlVXNlckRlZlVERElSZWdpc3RyeVRvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9GQVZPUklURV9VU0VSX0RFRl9VRERJX1JFR0lTVFJZIikpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5rQWN0aW9uSHJlZigpIHsKLSAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Tm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8sIGZhbHNlKTsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2MTc1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGUgZXh0ZW5kcyBGYXZvcml0ZXNOYXZpZ2F0b3JOb2RlCi17Ci0gIHB1YmxpYyBGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Tm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgsIFN0cmluZyBpbWFnZVBhdGgpCi0gIHsKLSAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCwgaW1hZ2VQYXRoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpCi0gIHsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBuZXcgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeURldGFpbHNUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19VU0VSX0RFRl9VRERJX1JFR0lTVFJZX0RFVEFJTFMiKSk7Ci0gICAgbmV3IEFkZFRvVURESVBlcnNwZWN0aXZlVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfVE9fVURESV9QRVJTUEVDVElWRSIpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NETERldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDlmNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTRExEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNXU0RMRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NETERldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NETFNlcnZpY2VGb2xkZXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjMwZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlck5vZGUgZXh0ZW5kcyBGYXZvcml0ZXNOYXZpZ2F0b3JGb2xkZXJOb2RlIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzV1NETFNlcnZpY2VGb2xkZXJOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCkgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCk7Ci0gICAgICAgIHRyZWVFbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWwuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzV1NETFNlcnZpY2VOb2RlIGZhdm9yaXRlc1dTRExTZXJ2aWNlTm9kZSA9IG5ldyBGYXZvcml0ZXNXU0RMU2VydmljZU5vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENoaWxkKGZhdm9yaXRlc1dTRExTZXJ2aWNlTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBMaXN0RmF2b3JpdGVXU0RMU2VydmljZVRvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0UiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMU2VydmljZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NETFNlcnZpY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMTk1N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMU2VydmljZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0RMU2VydmljZU5vZGUgZXh0ZW5kcyBGYXZvcml0ZXNOYXZpZ2F0b3JOb2RlIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzV1NETFNlcnZpY2VOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCkgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCwgImZhdm9yaXRlcy9pbWFnZXMvd3NkbF9zZXJ2aWNlX25vZGUuZ2lmIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpOwotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IEZhdm9yaXRlc1dTRExEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfV1NETF9ERVRBSUxTIikpOwotICAgICAgICBuZXcgRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hUb29sKHRvb2xNYW5hZ2VyXywgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIikpOwotICAgICAgICBuZXcgRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtVG9vbCh0b29sTWFuYWdlcl8sIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1dTRExfSU1QT1JUX1RPX0ZTIikpOwotICAgICAgICBuZXcgRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wodG9vbE1hbmFnZXJfLCBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9MQVVOQ0hfV0VCX1NFUlZJQ0VfV0laQVJEIikpOwotICAgICAgICBuZXcgRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NJTERldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTVhYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTSUxEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNXU0lMRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NJTERldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMRm9sZGVyTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMRm9sZGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGYzZWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NJTEZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0lMRm9sZGVyTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvckZvbGRlck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNXU0lMRm9sZGVyTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgpOwotICAgICAgICB0cmVlRWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NJTF9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXZvcml0ZXNXU0lMTm9kZSBmYXZvcml0ZXNXU0lMTm9kZSA9IG5ldyBGYXZvcml0ZXNXU0lMTm9kZSgoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpLCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2hpbGQoZmF2b3JpdGVzV1NJTE5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBMaXN0RmF2b3JpdGVXU0lMVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX0ZBVk9SSVRFX1dTSUwiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTY5ZDk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NJTE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0lMTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNXU0lMTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgsICJmYXZvcml0ZXMvaW1hZ2VzL3dzaWxfbm9kZS5naWYiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgRmF2b3JpdGVzV1NJTERldGFpbHNUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19XU0lMX0RFVEFJTFMiKSk7Ci0gICAgICAgIG5ldyBBZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0xpc3RGYXZvcml0ZVVERElCdXNpbmVzc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxZmNlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0xpc3RGYXZvcml0ZVVERElCdXNpbmVzc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVVERElCdXNpbmVzc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIExpc3RGYXZvcml0ZVVERElCdXNpbmVzc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfZW5hYmxlZC5naWYiLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NWaWV3LmpzcCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0xpc3RGYXZvcml0ZVVERElSZWdpc3RyeVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjAxNmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLSAgICBwdWJsaWMgTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9yZWdpc3RyeV9lbmFibGVkLmdpZiIsICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElSZWdpc3RyeVZpZXcuanNwIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0xpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDIzM2Y1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZVRvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIExpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2ludGVyZmFjZV9lbmFibGVkLmdpZiIsICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVmlldy5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVVRERJU2VydmljZVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzJiZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVVRERJU2VydmljZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVVERElTZXJ2aWNlVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLSAgICBwdWJsaWMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfZW5hYmxlZC5naWYiLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElTZXJ2aWNlVmlldy5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVVc2VyRGVmVURESVJlZ2lzdHJ5VG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVVc2VyRGVmVURESVJlZ2lzdHJ5VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI4Yzk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVXNlckRlZlVERElSZWdpc3RyeVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVVzZXJEZWZVRERJUmVnaXN0cnlUb29sIGV4dGVuZHMgRm9ybVRvb2wKLXsKLSAgcHVibGljIExpc3RGYXZvcml0ZVVzZXJEZWZVRERJUmVnaXN0cnlUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfZW5hYmxlZC5naWYiLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3JlZ2lzdHJ5X2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJmYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVXNlckRlZlVERElSZWdpc3RyeVZpZXcuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVXU0RMU2VydmljZVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlV1NETFNlcnZpY2VUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNWUyYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVXU0RMU2VydmljZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVdTRExTZXJ2aWNlVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLSAgICBwdWJsaWMgTGlzdEZhdm9yaXRlV1NETFNlcnZpY2VUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfZW5hYmxlZC5naWYiLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVdTRExTZXJ2aWNlVmlldy5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVXU0lMVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVXU0lMVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGU4M2YxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlV1NJTFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVdTSUxUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotICAgIHB1YmxpYyBMaXN0RmF2b3JpdGVXU0lMVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2VuYWJsZWQuZ2lmIiwgImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVXU0lMVmlldy5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9SZW1vdmVGYXZvcml0ZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL1JlbW92ZUZhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0YTZlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL1JlbW92ZUZhdm9yaXRlc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlJlbW92ZUZhdm9yaXRlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVGYXZvcml0ZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0KLSAgICBwdWJsaWMgUmVtb3ZlRmF2b3JpdGVzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIsICJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0FjdGlvblRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9BY3Rpb25Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTU2MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0FjdGlvblRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLlRvb2xUeXBlczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvblRvb2wgZXh0ZW5kcyBUb29sCi17Ci0gIHB1YmxpYyBBY3Rpb25Ub29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBlbmFibGVkSW1hZ2VMaW5rLFN0cmluZyBoaWdobGlnaHRlZEltYWdlTGluayxTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsZW5hYmxlZEltYWdlTGluayxoaWdobGlnaHRlZEltYWdlTGluayxhbHQsVG9vbFR5cGVzLkFDVElPTik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODJhOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCBleHRlbmRzIEFjdGlvblRvb2wKLXsKLSAgcHVibGljIEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsImltYWdlcy9hZGRfdG9fd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIsImltYWdlcy9hZGRfdG9fd3NkbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9CcmVhZENydW1iLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvQnJlYWRDcnVtYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDIxMWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9CcmVhZENydW1iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi0vLyBBIGNsYXNzIHVzZWQgdG8gcmVwcmVzZW50IGEgYnJvd2VyIGJyZWFkY3J1bWIuIEVhY2ggYnJlYWRjcnVtYiBlbmNhcHN1bGF0ZXMKLS8vIGEgbmF2aWdhdGVkIFVSTC4KLXB1YmxpYyBjbGFzcyBCcmVhZENydW1iCi17Ci0gIHByaXZhdGUgaW50IHBlcnNwZWN0aXZlSWRfOwotICBwcml2YXRlIFN0cmluZyB1cmxfOwotCi0gIHB1YmxpYyBCcmVhZENydW1iKGludCBwZXJzcGVjdGl2ZUlkLFN0cmluZyB1cmwpCi0gIHsKLSAgICBwZXJzcGVjdGl2ZUlkXyA9IHBlcnNwZWN0aXZlSWQ7Ci0gICAgdXJsXyA9IHVybDsKLSAgfQotCi0gIC8qKgotICAqIEdldCB0aGUgVVJMIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJyZWFkY3J1bWIuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIFVSTC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICB7Ci0gICAgcmV0dXJuIHVybF87Ci0gIH0KLQotICAvKioKLSAgKiBHZXQgdGhlIElEIG9mIHRoZSBwZXJzcGVjdGl2ZSB3aGVyZSB0aGlzIGJyZWFkY3J1bWIgYmVsb25ncy4KLSAgKiBAcmV0dXJuIGludCBUaGUgcGVyc3BlY3RpdmVJRCBhcyBkZWZpbmVkIGluIEFjdGlvbklucHV0cy4KLSAgKi8KLSAgcHVibGljIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgewotICAgIHJldHVybiBwZXJzcGVjdGl2ZUlkXzsKLSAgfQotCi0gIC8qKgotICAqIFRlc3QgZXF1YWxpdHkgYmV0d2VlbiB0aGlzIGJyZWFkY3J1bWIgYW5kIGFub3RoZXIuIEJvdGggdGhlIFVSTHMgYW5kIHBlcnNwZWN0aXZlCi0gICogSURzIG11c3QgYmUgZXF1YWwgZm9yIHR3byBicmVhZGNydW1icyB0byBiZSBlcXVhbC4KLSAgKiBAcGFyYW0gQnJlYWRDcnVtYiBBIGJyZWFkY3J1bWIuCi0gICogQHJldHVybiBib29sZWFuIFRoZSByZXN1bHQgb2YgdGhlIGVxdWFsaXR5IHRlc3QuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhCcmVhZENydW1iIGIpCi0gIHsKLSAgICByZXR1cm4gKCh1cmxfLmVxdWFscyhiLmdldFVSTCgpKSkgJiYgKHBlcnNwZWN0aXZlSWRfID09IGIuZ2V0UGVyc3BlY3RpdmVJZCgpKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Db250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNjZmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25FbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLQotcHVibGljIGNsYXNzIENvbnRyb2xsZXIgZXh0ZW5kcyBNZXNzYWdlUHJvdmlkZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbklkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc3RhdGVMb2NhdGlvbl87Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbl87Ci0gIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoXzsKLSAgcHJpdmF0ZSBpbnQgaGlzdG9yeURpcmVjdGlvbl87Ci0gIHByaXZhdGUgSGlzdG9yeSBoaXN0b3J5XzsKLSAgcHJpdmF0ZSBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlXzsKLSAgcHJpdmF0ZSBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlXzsKLSAgcHJpdmF0ZSBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlXzsKLSAgcHJpdmF0ZSBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZvcml0ZXNQZXJzcGVjdGl2ZV87Ci0gIHByaXZhdGUgUGVyc3BlY3RpdmUgY3VycmVudFBlcnNwZWN0aXZlXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzUGVyc3BlY3RpdmVDb250ZW50QmxhbmtfOwotICBwcml2YXRlIEFjdGlvbkVuZ2luZSBhY3Rpb25FbmdpbmU7Ci0gIAotICAvLyBXU0RMIEJyb3dzZXIKLSAgcHJpdmF0ZSBpbnQgd3NkbFR5cGVfOwotCi0gIHB1YmxpYyBDb250cm9sbGVyKCkKLSAgewotICAgIHN1cGVyKCJleHBsb3JlciIpOwotICAgIGNvbnRleHRQYXRoXyA9IG51bGw7Ci0Jc3RhdGVMb2NhdGlvbl8gPSBudWxsOwotICAgIGhpc3RvcnlfID0gbmV3IEhpc3RvcnkoKTsKLSAgICB1ZGRpUGVyc3BlY3RpdmVfID0gbmV3IFVERElQZXJzcGVjdGl2ZSh0aGlzKTsKLSAgICB3c2lsUGVyc3BlY3RpdmVfID0gbmV3IFdTSUxQZXJzcGVjdGl2ZSh0aGlzKTsKLSAgICB3c2RsUGVyc3BlY3RpdmVfID0gbmV3IFdTRExQZXJzcGVjdGl2ZSh0aGlzKTsKLSAgICBmYXZvcml0ZXNQZXJzcGVjdGl2ZV8gPSBuZXcgRmF2b3JpdGVzUGVyc3BlY3RpdmUodGhpcyk7Ci0gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHBlcnNwZWN0aXZlIHRvIFVEREkuCi0gICAgY3VycmVudFBlcnNwZWN0aXZlXyA9IHVkZGlQZXJzcGVjdGl2ZV87Ci0gICAgaGlzdG9yeURpcmVjdGlvbl8gPSBBY3Rpb25JbnB1dHMuSlVNUF9CQUNLOwotICAgIHdzZGxUeXBlXyA9IEFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0U7Ci0gICAgaXNQZXJzcGVjdGl2ZUNvbnRlbnRCbGFua18gPSB0cnVlOwotICAgIGFjdGlvbkVuZ2luZSA9IG5ldyBBY3Rpb25FbmdpbmUodGhpcyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFN0YXRlTG9jYXRpb24oU3RyaW5nIHN0YXRlTG9jYXRpb24pCi0gIHsKLQlzdGF0ZUxvY2F0aW9uXyA9IHN0YXRlTG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24oU3RyaW5nIGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbikKLSAgewotCSAgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uXyA9IGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbjsKLSAgfQotICAKLSAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgQ29udHJvbGxlciBiZWFuIGlzIGluc3RhbnRpYXRlZC4KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldENvbnRleHRQYXRoKFN0cmluZyBjb250ZXh0UGF0aCkKLSAgewotICAgIGlmIChjb250ZXh0UGF0aF8gPT0gbnVsbCkKLSAgICAgIGNvbnRleHRQYXRoXyA9IGNvbnRleHRQYXRoOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBhdGhXaXRoQ29udGV4dChTdHJpbmcgcmVsYXRpdmVQYXRoKQotICB7Ci0gICAgaWYgKHJlbGF0aXZlUGF0aCA9PSBudWxsKQotICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDsKLSAgICBTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIocmVsYXRpdmVQYXRoKTsKLSAgICBpZiAoY29udGV4dFBhdGhfICE9IG51bGwpCi0gICAgICBwYXRoLmluc2VydCgwLCcvJykuaW5zZXJ0KDAsY29udGV4dFBhdGhfKTsKLSAgICByZXR1cm4gcGF0aC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTZXNzaW9uSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlc3Npb25JZF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRleHRQYXRoXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpIHsKLQlyZXR1cm4gc3RhdGVMb2NhdGlvbl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uICgpIHsKLQlyZXR1cm4gZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChTdHJpbmcgc2Vzc2lvbklkLFNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uLFN0cmluZyBjb250ZXh0UGF0aCkKLSAgewotICAgIHNlc3Npb25JZF8gPSBzZXNzaW9uSWQ7Ci0gICAgc2V0Q29udGV4dFBhdGgoY29udGV4dFBhdGgpOwotICAgIHVkZGlQZXJzcGVjdGl2ZV8uaW5pdFBlcnNwZWN0aXZlKGFwcGxpY2F0aW9uKTsKLSAgICB3c2lsUGVyc3BlY3RpdmVfLmluaXRQZXJzcGVjdGl2ZShhcHBsaWNhdGlvbik7Ci0gICAgd3NkbFBlcnNwZWN0aXZlXy5pbml0UGVyc3BlY3RpdmUoYXBwbGljYXRpb24pOwotICAgIGZhdm9yaXRlc1BlcnNwZWN0aXZlXy5pbml0UGVyc3BlY3RpdmUoYXBwbGljYXRpb24pOwotICB9Ci0KLSAgLy8gU2V0dGVyIGZvciB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZS4KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q3VycmVudFBlcnNwZWN0aXZlKGludCBwZXJzcGVjdGl2ZSkKLSAgewotICAgIHN3aXRjaCAocGVyc3BlY3RpdmUpCi0gICAgewotICAgICAgY2FzZSBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESToKLSAgICAgICAgY3VycmVudFBlcnNwZWN0aXZlXyA9IHVkZGlQZXJzcGVjdGl2ZV87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NJTDoKLSAgICAgICAgY3VycmVudFBlcnNwZWN0aXZlXyA9IHdzaWxQZXJzcGVjdGl2ZV87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETDoKLSAgICAgICAgY3VycmVudFBlcnNwZWN0aXZlXyA9IHdzZGxQZXJzcGVjdGl2ZV87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfRkFWT1JJVEVTOgotICAgICAgICBjdXJyZW50UGVyc3BlY3RpdmVfID0gZmF2b3JpdGVzUGVyc3BlY3RpdmVfOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBHZXR0ZXIgZm9yIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlLgotICBwdWJsaWMgZmluYWwgUGVyc3BlY3RpdmUgZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50UGVyc3BlY3RpdmVfOwotICB9Ci0KLSAgLy8gR2V0dGVyIGZvciB0aGUgVURESSBwZXJzcGVjdGl2ZS4KLSAgcHVibGljIGZpbmFsIFVERElQZXJzcGVjdGl2ZSBnZXRVRERJUGVyc3BlY3RpdmUoKQotICB7Ci0gICAgcmV0dXJuIHVkZGlQZXJzcGVjdGl2ZV87Ci0gIH0KLQotICAvLyBHZXR0ZXIgZm9yIHRoZSBXU0lMIHBlcnNwZWN0aXZlLgotICBwdWJsaWMgZmluYWwgV1NJTFBlcnNwZWN0aXZlIGdldFdTSUxQZXJzcGVjdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gd3NpbFBlcnNwZWN0aXZlXzsKLSAgfQotICAKLSAgLy8gR2V0dGVyIGZvciB0aGUgV1NETCBwZXJzcGVjdGl2ZS4KLSAgcHVibGljIGZpbmFsIFdTRExQZXJzcGVjdGl2ZSBnZXRXU0RMUGVyc3BlY3RpdmUoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxQZXJzcGVjdGl2ZV87Ci0gIH0KLQotICAvLyBHZXR0ZXIgZm9yIHRoZSBGYXZvcml0ZXMgcGVyc3BlY3RpdmUuCi0gIHB1YmxpYyBmaW5hbCBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBnZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpIHsKLSAgICByZXR1cm4gZmF2b3JpdGVzUGVyc3BlY3RpdmVfOwotICB9Ci0gIAotICAvLyBHZXR0ZXIgZm9yIHRoZSBhY3Rpb24gZW5naW5lCi0gIHB1YmxpYyBmaW5hbCBBY3Rpb25FbmdpbmUgZ2V0QWN0aW9uRW5naW5lKCkgewotICAgIHJldHVybiBhY3Rpb25FbmdpbmU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhZGRUb0hpc3RvcnkoaW50IHBlcnNwZWN0aXZlSWQsU3RyaW5nIHVybCkKLSAgewotICAgIGlmICh1cmwgIT0gbnVsbCkKLSAgICAgIHJldHVybiBoaXN0b3J5Xy5hZGRCcmVhZENydW1iKG5ldyBCcmVhZENydW1iKHBlcnNwZWN0aXZlSWQsdXJsKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gV3JhcHBlciBmb3IgbW92aW5nIGZvcndhcmQgaW4gdGhlIGhpc3RvcnkgbGlzdCBhbmQgb2J0YWluaW5nIHRoZSBicmVhZGNydW1iLgotICBwdWJsaWMgZmluYWwgQnJlYWRDcnVtYiBmb3J3YXJkKCkKLSAgewotICAgIGhpc3RvcnlEaXJlY3Rpb25fID0gQWN0aW9uSW5wdXRzLkpVTVBfRk9SV0FSRDsKLSAgICByZXR1cm4gaGlzdG9yeV8uZm9yd2FyZCgpOwotICB9Ci0KLSAgLy8gV3JhcHBlciBmb3IgbW92aW5nIGJhY2sgaW4gdGhlIGhpc3RvcnkgbGlzdCBhbmQgb2J0YWluaW5nIHRoZSBicmVhZGNydW1iLgotICBwdWJsaWMgZmluYWwgQnJlYWRDcnVtYiBiYWNrKCkKLSAgewotICAgIGhpc3RvcnlEaXJlY3Rpb25fID0gQWN0aW9uSW5wdXRzLkpVTVBfQkFDSzsKLSAgICByZXR1cm4gaGlzdG9yeV8uYmFjaygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRIaXN0b3J5RGlyZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBoaXN0b3J5RGlyZWN0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NTdGFsZUJyZWFkQ3J1bWIoKQotICB7Ci0gICAgaGlzdG9yeV8ucmVtb3ZlQ3VycmVudEJyZWFkQ3J1bWIoKTsKLSAgfQotICAKLSAgLy8gV1NETCBCcm93c2VyCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFdTRExUeXBlKGludCB3c2RsVHlwZSkKLSAgewotICAgIHdzZGxUeXBlXyA9IHdzZGxUeXBlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRXU0RMVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFR5cGVfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1BlcnNwZWN0aXZlQ29udGVudEJsYW5rKCkKLSAgewotICAgIHJldHVybiBpc1BlcnNwZWN0aXZlQ29udGVudEJsYW5rXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgZW5hYmxlUGVyc3BlY3RpdmVDb250ZW50QmxhbmsoYm9vbGVhbiBpc1BlcnNwZWN0aXZlQ29udGVudEJsYW5rKQotICB7Ci0gICAgaXNQZXJzcGVjdGl2ZUNvbnRlbnRCbGFua18gPSBpc1BlcnNwZWN0aXZlQ29udGVudEJsYW5rOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBkdW1wSGlzdG9yeSgpCi0gIHsKLSAgICBoaXN0b3J5Xy5kdW1wKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvRm9sZGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmZjNGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb2xkZXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZvbGRlck5vZGUgZXh0ZW5kcyBOb2RlCi17Ci0gIHB1YmxpYyBGb2xkZXJOb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsaW50IG5vZGVEZXB0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoLCJpbWFnZXMvZm9sZGVyX2Nsb3NlZC5naWYiKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3BlbkltYWdlUGF0aCgpCi0gIHsKLSAgICByZXR1cm4gImltYWdlcy9mb2xkZXJfb3Blbi5naWYiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvRm9ybVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb3JtVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWY5NWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb3JtVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuVG9vbFR5cGVzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9ybVRvb2wgZXh0ZW5kcyBUb29sIGltcGxlbWVudHMgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlCi17Ci0gIHByb3RlY3RlZCBGb3JtVG9vbFByb3BlcnRpZXMgZm9ybVRvb2xQcm9wZXJ0aWVzXzsKLQotICBwdWJsaWMgRm9ybVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGVuYWJsZWRJbWFnZUxpbmssU3RyaW5nIGhpZ2hsaWdodGVkSW1hZ2VMaW5rLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixlbmFibGVkSW1hZ2VMaW5rLGhpZ2hsaWdodGVkSW1hZ2VMaW5rLGFsdCxUb29sVHlwZXMuRk9STSk7Ci0gICAgZm9ybVRvb2xQcm9wZXJ0aWVzXyA9IG5ldyBGb3JtVG9vbFByb3BlcnRpZXMoKTsKLSAgICBpbml0RGVmYXVsdFByb3BlcnRpZXMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IGtleSkKLSAgewotICAgIHJldHVybiBmb3JtVG9vbFByb3BlcnRpZXNfLmdldFByb3BlcnR5KGtleSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3Qga2V5LE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGZvcm1Ub29sUHJvcGVydGllc18uc2V0UHJvcGVydHkoa2V5LHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZVByb3BlcnR5KE9iamVjdCBrZXkpCi0gIHsKLSAgICBmb3JtVG9vbFByb3BlcnRpZXNfLnJlbW92ZVByb3BlcnR5KGtleSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhclByb3BlcnR5VGFibGUoKQotICB7Ci0gICAgZm9ybVRvb2xQcm9wZXJ0aWVzXy5jbGVhclByb3BlcnR5VGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZVByb3BlcnR5VGFibGUoSGFzaHRhYmxlIG5ld1Byb3BlcnR5VGFibGUpCi0gIHsKLSAgICBmb3JtVG9vbFByb3BlcnRpZXNfLnVwZGF0ZVByb3BlcnR5VGFibGUobmV3UHJvcGVydHlUYWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eVRhYmxlKEhhc2h0YWJsZSBuZXdQcm9wZXJ0eVRhYmxlKQotICB7Ci0gICAgZm9ybVRvb2xQcm9wZXJ0aWVzXy5zZXRQcm9wZXJ0eVRhYmxlKG5ld1Byb3BlcnR5VGFibGUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZmxhZ0Vycm9yKE9iamVjdCBpbnB1dEtleSkKLSAgewotICAgIGZvcm1Ub29sUHJvcGVydGllc18uZmxhZ0Vycm9yKGlucHV0S2V5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGZsYWdSb3dFcnJvcihPYmplY3QgaW5wdXRLZXksaW50IHJvd051bWJlcikKLSAgewotICAgIGZvcm1Ub29sUHJvcGVydGllc18uZmxhZ1Jvd0Vycm9yKGlucHV0S2V5LHJvd051bWJlcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGZsYWdSb3dFcnJvcihPYmplY3QgaW5wdXRLZXksT2JqZWN0IHJvd0lkKQotICB7Ci0gICAgZm9ybVRvb2xQcm9wZXJ0aWVzXy5mbGFnUm93RXJyb3IoaW5wdXRLZXkscm93SWQpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXJFcnJvcnMoKQotICB7Ci0gICAgZm9ybVRvb2xQcm9wZXJ0aWVzXy5jbGVhckVycm9ycygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbnB1dFZhbGlkKE9iamVjdCBpbnB1dEtleSkKLSAgewotICAgIHJldHVybiBmb3JtVG9vbFByb3BlcnRpZXNfLmlzSW5wdXRWYWxpZChpbnB1dEtleSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Jvd0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5LGludCByb3dOdW1iZXIpCi0gIHsKLSAgICByZXR1cm4gZm9ybVRvb2xQcm9wZXJ0aWVzXy5pc1Jvd0lucHV0VmFsaWQoaW5wdXRLZXksU3RyaW5nLnZhbHVlT2Yocm93TnVtYmVyKSk7Ci0gIH0KLSAgCi0gIC8vIFRoZSByb3cgbnVtYmVyIG1heSBhbHNvIGJlIHJlcHJlc2VudGVkIGJ5IGEgdW5pcXVlIG9iamVjdCAoZS5nLiBVVUlEKQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Jvd0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5LE9iamVjdCByb3dJZCkKLSAgewotICAgIHJldHVybiBmb3JtVG9vbFByb3BlcnRpZXNfLmlzUm93SW5wdXRWYWxpZChpbnB1dEtleSxyb3dJZCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb3JtVG9vbFByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb3JtVG9vbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlNTgzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvRm9ybVRvb2xQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgRm9ybVRvb2xQcm9wZXJ0aWVzIGltcGxlbWVudHMgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlCi17Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHByb3BlcnR5VGFibGVfOwotICBwcml2YXRlIEhhc2h0YWJsZSBlcnJhbnRWYWx1ZXNfOwotCi0gIHB1YmxpYyBGb3JtVG9vbFByb3BlcnRpZXMoKQotICB7Ci0gICAgcHJvcGVydHlUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZXJyYW50VmFsdWVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IGtleSkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eVRhYmxlXy5nZXQoa2V5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5KE9iamVjdCBrZXksT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KGtleSx2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVQcm9wZXJ0eShPYmplY3Qga2V5KQotICB7Ci0gICAgcHJvcGVydHlUYWJsZV8ucmVtb3ZlKGtleSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhclByb3BlcnR5VGFibGUoKQotICB7Ci0gICAgcHJvcGVydHlUYWJsZV8uY2xlYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZVByb3BlcnR5VGFibGUoSGFzaHRhYmxlIG5ld1Byb3BlcnR5VGFibGUpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gbmV3UHJvcGVydHlUYWJsZS5rZXlzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KGtleSxuZXdQcm9wZXJ0eVRhYmxlLmdldChrZXkpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eVRhYmxlKEhhc2h0YWJsZSBuZXdQcm9wZXJ0eVRhYmxlKQotICB7Ci0gICAgY2xlYXJQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgdXBkYXRlUHJvcGVydHlUYWJsZShuZXdQcm9wZXJ0eVRhYmxlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGZsYWdFcnJvcihPYmplY3QgaW5wdXRLZXkpCi0gIHsKLSAgICBpZiAoaXNJbnB1dFZhbGlkKGlucHV0S2V5KSkKLSAgICAgIGVycmFudFZhbHVlc18ucHV0KGlucHV0S2V5LEJvb2xlYW4uVFJVRSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBmbGFnUm93RXJyb3IoT2JqZWN0IGlucHV0S2V5LGludCByb3dOdW1iZXIpCi0gIHsKLSAgICBmbGFnUm93RXJyb3IoaW5wdXRLZXksU3RyaW5nLnZhbHVlT2Yocm93TnVtYmVyKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGZsYWdSb3dFcnJvcihPYmplY3QgaW5wdXRLZXksT2JqZWN0IHJvd0lkKQotICB7Ci0gICAgT2JqZWN0IGVycm9yT2JqZWN0ID0gZXJyYW50VmFsdWVzXy5nZXQoaW5wdXRLZXkpOwotICAgIEhhc2h0YWJsZSByb3dIYXNoOwotICAgIGlmIChlcnJvck9iamVjdCBpbnN0YW5jZW9mIEhhc2h0YWJsZSkKLSAgICAgIHJvd0hhc2ggPSAoSGFzaHRhYmxlKWVycm9yT2JqZWN0OwotICAgIGVsc2UKLSAgICAgIHJvd0hhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcm93SGFzaC5wdXQocm93SWQsQm9vbGVhbi5UUlVFKTsKLSAgICBlcnJhbnRWYWx1ZXNfLnB1dChpbnB1dEtleSxyb3dIYXNoKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXJFcnJvcnMoKQotICB7Ci0gICAgZXJyYW50VmFsdWVzXy5jbGVhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbnB1dFZhbGlkKE9iamVjdCBpbnB1dEtleSkKLSAgewotICAgIHJldHVybiAoZXJyYW50VmFsdWVzXy5nZXQoaW5wdXRLZXkpID09IG51bGwpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSb3dJbnB1dFZhbGlkKE9iamVjdCBpbnB1dEtleSxpbnQgcm93TnVtYmVyKQotICB7Ci0gICAgcmV0dXJuIGlzUm93SW5wdXRWYWxpZChpbnB1dEtleSxTdHJpbmcudmFsdWVPZihyb3dOdW1iZXIpKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSb3dJbnB1dFZhbGlkKE9iamVjdCBpbnB1dEtleSxPYmplY3Qgcm93SWQpCi0gIHsKLSAgICBIYXNodGFibGUgcm93SGFzaCA9IChIYXNodGFibGUpZXJyYW50VmFsdWVzXy5nZXQoaW5wdXRLZXkpOwotICAgIGlmIChyb3dIYXNoID09IG51bGwpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gKHJvd0hhc2guZ2V0KHJvd0lkKSA9PSBudWxsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0Zvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0Zvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2NkMGQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZQotewotICAvLyBHZXR0ZXIgYW5kIFNldHRlciBmb3IgYSBwcm9wZXJ0eS4KLSAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KTsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IGtleSxPYmplY3QgdmFsdWUpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVQcm9wZXJ0eShPYmplY3Qga2V5KTsKLQotICAvLyBQcm9wZXJ0eSB0YWJsZSBvcGVyYXRvcnMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyUHJvcGVydHlUYWJsZSgpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVQcm9wZXJ0eVRhYmxlKEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlKTsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHlUYWJsZShIYXNodGFibGUgcHJvcGVydHlUYWJsZSk7Ci0KLSAgLy8gRXJyb3IgaGFuZGxpbmcuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZsYWdFcnJvcihPYmplY3QgaW5wdXRLZXkpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbGFnUm93RXJyb3IoT2JqZWN0IGlucHV0S2V5LGludCByb3dOdW1iZXIpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbGFnUm93RXJyb3IoT2JqZWN0IGlucHV0S2V5LE9iamVjdCByb3dJZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyRXJyb3JzKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSW5wdXRWYWxpZChPYmplY3QgaW5wdXRLZXkpOwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Jvd0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5LGludCByb3dOdW1iZXIpOwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Jvd0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5LE9iamVjdCByb3dJZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvSGlzdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0hpc3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0OTFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvSGlzdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIGEgVmVjdG9yIG9mIGJyZWFkY3J1bWJzLiBBIHBvc2l0aW9uIGluZGV4IGlzIHVzZWQKLS8vIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIGRhdGEgc3RydWN0dXJlLgotcHVibGljIGNsYXNzIEhpc3RvcnkKLXsKLSAgcHJpdmF0ZSBWZWN0b3IgaXRlbXNfOwotICBwcml2YXRlIGludCBwb3NpdGlvbl87Ci0KLSAgcHVibGljIEhpc3RvcnkoKQotICB7Ci0gICAgaXRlbXNfID0gbmV3IFZlY3RvcigpOwotICAgIHBvc2l0aW9uXyA9IC0xOwotICB9Ci0KLSAgLy8gQWRkIGEgbmV3IGJyZWFkY3J1bWIgdG8gdGhlIGhpc3RvcnkgbGlzdC4gV2hlbiBhZGRpbmcgYSBuZXcgYnJlYWRjcnVtYgotICAvLyB3aXRoaW4gdGhlIGN1cnJlbnQgbGlzdCwgYWxsIGJyZWFkY3J1bWJzIGFmdGVyIHRoZSBuZXdseSBhZGRlZCBvbmUgYXJlCi0gIC8vIHJlbW92ZWQuCi0gIHB1YmxpYyBib29sZWFuIGFkZEJyZWFkQ3J1bWIoQnJlYWRDcnVtYiBiKQotICB7Ci0gICAgaW50IG51bWJlck9mSXRlbXMgPSBpdGVtc18uc2l6ZSgpOwotICAgIGlmIChudW1iZXJPZkl0ZW1zID09IDApCi0gICAgewotICAgICAgcG9zaXRpb25fKys7Ci0gICAgICBpdGVtc18uYWRkRWxlbWVudChiKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgQnJlYWRDcnVtYiBjdXJyZW50QnJlYWRDcnVtYiA9IChCcmVhZENydW1iKWl0ZW1zXy5lbGVtZW50QXQocG9zaXRpb25fKTsKLSAgICAgIGlmICghY3VycmVudEJyZWFkQ3J1bWIuZXF1YWxzKGIpKQotICAgICAgewotICAgICAgICBwb3NpdGlvbl8rKzsKLSAgICAgICAgaXRlbXNfLmluc2VydEVsZW1lbnRBdChiLHBvc2l0aW9uXyk7Ci0gICAgICAgIGZvciAoaW50IGk9aXRlbXNfLnNpemUoKS0xO2k+cG9zaXRpb25fO2ktLSkKLSAgICAgICAgICBpdGVtc18ucmVtb3ZlRWxlbWVudEF0KGkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gTW92ZSBmb3J3YXJkIHdpdGhpbiB0aGUgaGlzdG9yeSBsaXN0IGFuZCBvYnRhaW4gdGhlIGJyZWFkY3J1bWIuCi0gIHB1YmxpYyBCcmVhZENydW1iIGZvcndhcmQoKQotICB7Ci0gICAgaWYgKHBvc2l0aW9uXyA8IGl0ZW1zXy5zaXplKCktMSkKLSAgICB7Ci0gICAgICBwb3NpdGlvbl8rKzsKLSAgICAgIEJyZWFkQ3J1bWIgYiA9IChCcmVhZENydW1iKWl0ZW1zXy5lbGVtZW50QXQocG9zaXRpb25fKTsKLSAgICAgIHJldHVybiBiOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8vIE1vdmUgYmFjayB3aXRoaW4gdGhlIGhpc3RvcnkgbGlzdCBhbmQgb2J0YWluIHRoZSBicmVhZGNydW1iLgotICBwdWJsaWMgQnJlYWRDcnVtYiBiYWNrKCkKLSAgewotICAgIGlmIChwb3NpdGlvbl8gPiAwKQotICAgIHsKLSAgICAgIHBvc2l0aW9uXy0tOwotICAgICAgQnJlYWRDcnVtYiBiID0gKEJyZWFkQ3J1bWIpaXRlbXNfLmVsZW1lbnRBdChwb3NpdGlvbl8pOwotICAgICAgcmV0dXJuIGI7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlQ3VycmVudEJyZWFkQ3J1bWIoKQotICB7Ci0gICAgaXRlbXNfLnJlbW92ZUVsZW1lbnRBdChwb3NpdGlvbl8pOwotICAgIGlmIChwb3NpdGlvbl8gPiBpdGVtc18uc2l6ZSgpLTEpCi0gICAgICBwb3NpdGlvbl8tLTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZHVtcCgpCi0gIHsKLSAgICBmb3IgKGludCBpPTA7aTxpdGVtc18uc2l6ZSgpO2krKykKLSAgICB7Ci0gICAgICBpdGVtc18uZWxlbWVudEF0KGkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0ltcG9ydFRvRmlsZVN5c3RlbVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9JbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTNjNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0ltcG9ydFRvRmlsZVN5c3RlbVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIEltcG9ydFRvRmlsZVN5c3RlbVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvaW1wb3J0X2ZzX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9pbXBvcnRfZnNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9JbXBvcnRUb1dvcmtiZW5jaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9JbXBvcnRUb1dvcmtiZW5jaFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3NDA1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvSW1wb3J0VG9Xb3JrYmVuY2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1wb3J0VG9Xb3JrYmVuY2hUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotICAgIHB1YmxpYyBJbXBvcnRUb1dvcmtiZW5jaFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvaW1wb3J0X3RvX3dvcmtiZW5jaF9lbmFibGVkLmdpZiIsICJpbWFnZXMvaW1wb3J0X3RvX3dvcmtiZW5jaF9oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZm9ybXMvSW1wb3J0VG9Xb3JrYmVuY2hGb3JtLmpzcCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTGF1bmNoT3B0aW9uc01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9MYXVuY2hPcHRpb25zTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE5ZTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9MYXVuY2hPcHRpb25zTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hPcHRpb25zTWFuYWdlcgotewotICBwcml2YXRlIHN0YXRpYyBMYXVuY2hPcHRpb25zTWFuYWdlciBpbnN0YW5jZV87Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgb3B0aW9uc1RhYmxlXzsKLQotICBwcml2YXRlIExhdW5jaE9wdGlvbnNNYW5hZ2VyKCkKLSAgewotICAgIG9wdGlvbnNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExhdW5jaE9wdGlvbnNNYW5hZ2VyIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBMYXVuY2hPcHRpb25zTWFuYWdlcigpOwotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFuYWdlKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSwgU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gIHsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICBtYW5hZ2VTZXNzaW9uKGtleSwgKFN0cmluZyl2YWx1ZSwgYXBwbGljYXRpb24pOwotICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSGFzaHRhYmxlKQotICAgICAgbWFuYWdlT3B0aW9ucyhrZXksIChIYXNodGFibGUpdmFsdWUsIGFwcGxpY2F0aW9uKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBtYW5hZ2VTZXNzaW9uKFN0cmluZyBrZXksIFN0cmluZyBzZXNzaW9uSWQsIFNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iaiA9IG9wdGlvbnNUYWJsZV8ucmVtb3ZlKGtleSk7Ci0gICAgaWYgKG9iaiAhPSBudWxsICYmIChvYmogaW5zdGFuY2VvZiBIYXNodGFibGUpKQotICAgICAgbG9hZE9wdGlvbnMoc2Vzc2lvbklkLCAoSGFzaHRhYmxlKW9iaiwgYXBwbGljYXRpb24pOwotICAgIGVsc2UKLSAgICAgIG9wdGlvbnNUYWJsZV8ucHV0KGtleSwgc2Vzc2lvbklkKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBtYW5hZ2VPcHRpb25zKFN0cmluZyBrZXksIEhhc2h0YWJsZSBvcHRpb25zLCBTZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbikKLSAgewotICAgIE9iamVjdCBvYmogPSBvcHRpb25zVGFibGVfLnJlbW92ZShrZXkpOwotICAgIGlmIChvYmogIT0gbnVsbCAmJiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSkKLSAgICAgIGxvYWRPcHRpb25zKChTdHJpbmcpb2JqLCBvcHRpb25zLCBhcHBsaWNhdGlvbik7Ci0gICAgZWxzZQotICAgICAgb3B0aW9uc1RhYmxlXy5wdXQoa2V5LCBvcHRpb25zKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBsb2FkT3B0aW9ucyhTdHJpbmcgc2Vzc2lvbklkLCBIYXNodGFibGUgb3B0aW9ucywgU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gIHsKLSAgICBIdHRwU2Vzc2lvbiBodHRwU2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgICBpZiAoaHR0cFNlc3Npb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlcilodHRwU2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLQkgIFN0cmluZ1tdIHN0YXRlTG9jYXRpb25zID0gKFN0cmluZ1tdKW9wdGlvbnMuZ2V0KExhdW5jaE9wdGlvbnMuU1RBVEVfTE9DQVRJT04pOwotCSAgU3RyaW5nW10gZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9ucyA9IChTdHJpbmdbXSlvcHRpb25zLmdldChMYXVuY2hPcHRpb25zLkRFRkFVTFRfRkFWT1JJVEVTX0xPQ0FUSU9OKTsKLSAgICAgIFN0cmluZ1tdIGlucXVpcnlVUkxzID0gKFN0cmluZ1tdKW9wdGlvbnMuZ2V0KExhdW5jaE9wdGlvbnMuSU5RVUlSWV9VUkwpOwotICAgICAgU3RyaW5nW10gcHVibGlzaFVSTHMgPSAoU3RyaW5nW10pb3B0aW9ucy5nZXQoTGF1bmNoT3B0aW9ucy5QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmdbXSBzZXJ2aWNlTmFtZXMgPSAoU3RyaW5nW10pb3B0aW9ucy5nZXQoTGF1bmNoT3B0aW9ucy5TRVJWSUNFX05BTUUpOwotICAgICAgU3RyaW5nW10gc2VydmljZUtleXMgPSAoU3RyaW5nW10pb3B0aW9ucy5nZXQoTGF1bmNoT3B0aW9ucy5TRVJWSUNFX0tFWSk7Ci0gICAgICBTdHJpbmdbXSB3c2RsVVJMcyA9IChTdHJpbmdbXSlvcHRpb25zLmdldChMYXVuY2hPcHRpb25zLldTRExfVVJMKTsKLSAgICAgIFN0cmluZ1tdIGVuZHBvaW50cyA9IChTdHJpbmdbXSlvcHRpb25zLmdldChMYXVuY2hPcHRpb25zLldFQl9TRVJWSUNFX0VORFBPSU5UKTsKLSAgICAgIFN0cmluZ1tdIHNlcnZpY2VRTmFtZVN0cmluZ3MgPSAoU3RyaW5nW10pb3B0aW9ucy5nZXQoTGF1bmNoT3B0aW9ucy5TRVJWSUNFX1FOQU1FX1NUUklORyk7Ci0gICAgICBTdHJpbmdbXSBiaW5kaW5nTmFtZVN0cmluZ3MgPSAoU3RyaW5nW10pb3B0aW9ucy5nZXQoTGF1bmNoT3B0aW9ucy5CSU5ESU5HX05BTUVfU1RSSU5HKTsKLQkgIFN0cmluZyBzdGF0ZUxvY2F0aW9uID0gKHN0YXRlTG9jYXRpb25zID09IG51bGwgfHwgc3RhdGVMb2NhdGlvbnMubGVuZ3RoID09IDApID8gbnVsbCA6IHN0YXRlTG9jYXRpb25zWzBdOwotCSAgY29udHJvbGxlci5zZXRTdGF0ZUxvY2F0aW9uKHN0YXRlTG9jYXRpb24pOwotCSAgU3RyaW5nIGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbiA9IChkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb25zID09IG51bGwgfHwgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9ucy5sZW5ndGggPT0gMCkgPyBudWxsIDogZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uc1swXTsKLQkgIGNvbnRyb2xsZXIuc2V0RGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbik7Ci0gICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICAgIHVkZGlQZXJzcGVjdGl2ZS5wcmVsb2FkVURESVJlZ2lzdHJpZXMoaW5xdWlyeVVSTHMsIHB1Ymxpc2hVUkxzKTsKLSAgICAgIHVkZGlQZXJzcGVjdGl2ZS5wcmVsb2FkU2VydmljZXMoaW5xdWlyeVVSTHMsc2VydmljZU5hbWVzLHNlcnZpY2VLZXlzKTsKLSAgICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgICAgd3NkbFBlcnNwZWN0aXZlLnByZWxvYWRXU0RMKHdzZGxVUkxzKTsKLSAgICAgIHdzZGxQZXJzcGVjdGl2ZS5wcmVsb2FkRW5kcG9pbnRzKHdzZGxVUkxzLCBlbmRwb2ludHMpOwotICAgICAgd3NkbFBlcnNwZWN0aXZlLnByZXNlbGVjdFNlcnZpY2VPckJpbmRpbmcod3NkbFVSTHMsc2VydmljZVFOYW1lU3RyaW5ncyxiaW5kaW5nTmFtZVN0cmluZ3MpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2VhOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2xhdW5jaF93c3dpemFyZF9lbmFibGVkLmdpZiIsICJpbWFnZXMvbGF1bmNoX3dzd2l6YXJkX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpIHsKLSAgICAgICAgcmV0dXJuICJmb3Jtcy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL01lc3NhZ2VCdW5kbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9NZXNzYWdlQnVuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGJjNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL01lc3NhZ2VCdW5kbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotKiBBbiBtZXNzYWdlIGJ1bmRsZSBpcyBhIGNvbGxlY3Rpb24gb2YgbWVzc2FnZXMgZHJhd24gZnJvbSBzb21lCi0qIHNldCBvZiBwcm9wZXJ0aWVzLgotKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQnVuZGxlCi17Ci0gIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgTWVzc2FnZUJ1bmRsZSBmcm9tIHRoZSBnaXZlbiBSZXNvdXJjZUJ1bmRsZS4KLSAgKi8KLSAgcHVibGljIE1lc3NhZ2VCdW5kbGUgKCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSApCi0gIHsKLSAgICBmUmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgaWRlbnRpZmllZCBieSBtZXNzYWdlSWQuCi0gICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgbWVzc2FnZSBJRC4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbWVzc2FnZSB0ZXh0LgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcgbWVzc2FnZUlkICkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBmUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKG1lc3NhZ2VJZCk7Ci0gICAgfQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbWVzc2FnZUlkOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgaWRlbnRpZmllZCBieSBtZXNzYWdlSWQuCi0gICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgbWVzc2FnZSBJRC4KLSAgKiBAcGFyYW0gc3ViIEEgc3Vic3RpdHV0aW9uIHZhbHVlIGZvciAiJTEiIGluIHRoZSBtZXNzYWdlLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBtZXNzYWdlIHRleHQuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBzdWIgKQotICB7Ci0gICAgU3RyaW5nW10gcyA9IHtzdWJ9OwotICAgIHJldHVybiBnZXRNZXNzYWdlKG1lc3NhZ2VJZCxzKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgaWRlbnRpZmllZCBieSBtZXNzYWdlSWQuCi0gICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgbWVzc2FnZSBJRC4KLSAgKiBAcGFyYW0gc3ViIFN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yICIlMS4uJW4iIChzdWJbMF0uLnN1YltuLTFdKSBpbgotICAqIHRoZSBtZXNzYWdlLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBtZXNzYWdlIHRleHQuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHN1YiApCi0gIHsKLSAgICBTdHJpbmcgbSA9IGdldE1lc3NhZ2UobWVzc2FnZUlkKTsKLSAgICBpbnQgbGVuID0gbS5sZW5ndGgoKTsKLSAgICBpbnQgbWF4ID0gc3ViLmxlbmd0aDsKLSAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpbnQgcG9zID0gMDsKLSAgICB3aGlsZSAocG9zID49IDApCi0gICAgewotICAgICAgaW50IHBjdCA9IG0uaW5kZXhPZignJScscG9zKTsKLSAgICAgIGlmIChwY3QgPj0gMCkKLSAgICAgIHsKLSAgICAgICAgYi5hcHBlbmQobS5zdWJzdHJpbmcocG9zLHBjdCkpOwotICAgICAgICBwb3MgPSBwY3QgKyAxOwotICAgICAgICBpZiAocG9zIDwgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciBkID0gbS5jaGFyQXQocG9zKTsKLSAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoZCkgJiYgZCAhPSAnMCcpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IHYgPSBJbnRlZ2VyLnBhcnNlSW50KG5ldyBDaGFyYWN0ZXIoZCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAodiA8PSBtYXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGIuYXBwZW5kKHN1Ylt2LTFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYi5hcHBlbmQoJz8nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgYi5hcHBlbmQoJyUnKTsKLSAgICAgICAgICAgIGIuYXBwZW5kKGQpOwotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGIuYXBwZW5kKCclJyk7Ci0gICAgICAgICAgcG9zID0gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYi5hcHBlbmQobS5zdWJzdHJpbmcocG9zKSk7Ci0gICAgICAgIHBvcyA9IC0xOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYi50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL01lc3NhZ2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL01lc3NhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA4NTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9NZXNzYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLy8gQSBDbGFzcyB3aGljaCBwcm92aWRlcyBTdHJpbmcgbWVzc2FnZXMuCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGVfOwotICBwcml2YXRlIFN0cmluZyBtZXNzYWdlUHJvdmlkZXJOYW1lXzsKLQotICBwdWJsaWMgTWVzc2FnZVByb3ZpZGVyKFN0cmluZyBtZXNzYWdlQnVuZGxlRmlsZU5hbWUpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBMb2FkIHRoZSBtZXNzYWdlIGJ1bmRsZSBmcm9tIHRoZSBXRUItSU5GXGNsYXNzZXMgc3ViZGlyZWN0b3J5LgotICAgICAgbWVzc2FnZVByb3ZpZGVyTmFtZV8gPSBtZXNzYWdlQnVuZGxlRmlsZU5hbWU7Ci0gICAgICBtZXNzYWdlQnVuZGxlXyA9IG5ldyBNZXNzYWdlQnVuZGxlKFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShtZXNzYWdlQnVuZGxlRmlsZU5hbWUpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgbG9hZCAiK21lc3NhZ2VCdW5kbGVGaWxlTmFtZSk7Ci0gICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZV8uZ2V0TWVzc2FnZShtZXNzYWdlSWQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQsU3RyaW5nIHN1YikKLSAgewotICAgIHJldHVybiBtZXNzYWdlQnVuZGxlXy5nZXRNZXNzYWdlKG1lc3NhZ2VJZCxzdWIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQsU3RyaW5nW10gc3ViKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGVfLmdldE1lc3NhZ2UobWVzc2FnZUlkLHN1Yik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVByb3ZpZGVyTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZVByb3ZpZGVyTmFtZV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9NZXNzYWdlUXVldWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9NZXNzYWdlUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4YzgxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTWVzc2FnZVF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVF1ZXVlCi17Ci0gIHByb3RlY3RlZCBWZWN0b3IgbWVzc2FnZUxpc3RfOwotCi0gIHB1YmxpYyBNZXNzYWdlUXVldWUoKQotICB7Ci0gICAgbWVzc2FnZUxpc3RfID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIG1lc3NhZ2VMaXN0Xy5hZGRFbGVtZW50KG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlc0Zyb21MaXN0KCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGlmIChtZXNzYWdlTGlzdF8uc2l6ZSgpPT0wKQotICAgICAgcmV0dXJuICIiOwotCi0gICAgRW51bWVyYXRpb24gZSA9IG1lc3NhZ2VMaXN0Xy5lbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyB0aGlzTWVzc2FnZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgbWVzc2FnZXMuYXBwZW5kKHRoaXNNZXNzYWdlKTsKLSAgICAgIG1lc3NhZ2VzLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotICAgIH0KLSAgICBtZXNzYWdlTGlzdF8ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICByZXR1cm4gbWVzc2FnZXMudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDEzNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkZyYW1lTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5IVE1MVXRpbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlCi17Ci0gIHByb3RlY3RlZCBUcmVlRWxlbWVudCBlbGVtZW50XzsKLSAgcHJvdGVjdGVkIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyXzsKLSAgcHJvdGVjdGVkIGludCBub2RlSWRfOwotICBwcm90ZWN0ZWQgaW50IG5vZGVEZXB0aF87Ci0gIHByb3RlY3RlZCBTdHJpbmcgaW1hZ2VQYXRoXzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPcGVuXzsKLSAgcHJvdGVjdGVkIFZlY3RvciBjaGlsZE5vZGVzXzsKLSAgcHJvdGVjdGVkIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyXzsKLSAgcHJvdGVjdGVkIE5vZGUgcGFyZW50XzsKLSAgcHJpdmF0ZSBTdHJpbmcgYW5jaG9yTmFtZV87Ci0gIHByaXZhdGUgaW50IHZpZXdJZF87Ci0KLSAgcHVibGljIE5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoLFN0cmluZyBpbWFnZVBhdGgpCi0gIHsKLSAgICBlbGVtZW50XyA9IGVsZW1lbnQ7Ci0gICAgbm9kZU1hbmFnZXJfID0gbm9kZU1hbmFnZXI7Ci0gICAgbm9kZUlkXyA9IG5vZGVNYW5hZ2VyLmFkZFRvTm9kZVRhYmxlKHRoaXMpOwotICAgIG5vZGVEZXB0aF8gPSBub2RlRGVwdGg7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBpZiAoaW1hZ2VQYXRoID09IG51bGwpCi0gICAgICBpbWFnZVBhdGhfID0gY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoTm9kZU1hbmFnZXIuUEFUSF9TUEFDRSk7Ci0gICAgZWxzZQotICAgICAgaW1hZ2VQYXRoXyA9IGltYWdlUGF0aDsKLSAgICBpc09wZW5fID0gdHJ1ZTsKLSAgICBjaGlsZE5vZGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICB0b29sTWFuYWdlcl8gPSBuZXcgVG9vbE1hbmFnZXIodGhpcyk7Ci0gICAgaW5pdFRvb2xzKCk7Ci0gICAgYW5jaG9yTmFtZV8gPSAobmV3IFN0cmluZ0J1ZmZlcigiYWN0aW9uIikpLmFwcGVuZChub2RlSWRfKS50b1N0cmluZygpOwotICAgIHBhcmVudF8gPSBudWxsOwotICAgIHZpZXdJZF8gPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQ7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBUcmVlRWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotICAqIEByZXR1cm4gVHJlZUVsZW1lbnQgVGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLSAgKi8KLSAgcHVibGljIFRyZWVFbGVtZW50IGdldFRyZWVFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBlbGVtZW50XzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICogQHJldHVybiBTdHJpbmcKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudF8uZ2V0TmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgTm9kZU1hbmFnZXIgbWFuYWdpbmcgdGhpcyBub2RlLgotICAqIEByZXR1cm4gTm9kZU1hbmFnZXIKLSAgKi8KLSAgcHVibGljIE5vZGVNYW5hZ2VyIGdldE5vZGVNYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBub2RlTWFuYWdlcl87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIG5vZGUuCi0gICogQHJldHVybiBpbnQKLSAgKi8KLSAgcHVibGljIGludCBnZXROb2RlSWQoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVJZF87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBkZXB0aCBpbiB0aGUgdHJlZSBvZiB0aGlzIG5vZGUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgbm9kZQotICAqIEByZXR1cm4gaW50Ci0gICovCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZURlcHRoKCkKLSAgewotICAgIHJldHVybiBub2RlRGVwdGhfOwotICB9Ci0KLSAgLyoqCi0gICogU2V0IHRoZSBwYXRoIG9mIHRoZSBpbWFnZSByZXByZXNlbnRpbmcgdGhpcyBjbGFzcyBvZiBOb2RlLgotICAqIEBwYXJhbSBTdHJpbmcgVGhlIHBhdGguCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEltYWdlUGF0aChTdHJpbmcgcGF0aCkKLSAgewotICAgIGltYWdlUGF0aF8gPSBwYXRoOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgYXJlIHZpc2libGUuIFJldHVybnMgZmFsc2UKLSAgKiBpZiB0aGV5IGFyZSBub3QuCi0gICogQHJldHVybiBib29sZWFuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzT3BlbigpCi0gIHsKLSAgICByZXR1cm4gaXNPcGVuXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBwYXJlbnRfOwotICAgIHdoaWxlIChwYXJlbnROb2RlICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKCFwYXJlbnROb2RlLmlzT3BlbigpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRQYXJlbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoaXMgbm9kZSdzIGNoaWxkcmVuIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICogVXBkYXRlcyB0aGUgTm9kZU1hbmFnZXIncyByZWNvcmQgb2YgdGhlIG1heGltdW0gZGVwdGggdmlzaWJsZSBpbiB0aGUgdHJlZS4KLSAgKiBAcGFyYW0gYm9vbGVhbgotICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbihib29sZWFuIG9wZW4pCi0gIHsKLSAgICBpc09wZW5fID0gb3BlbjsKLSAgICBub2RlTWFuYWdlcl8udXBkYXRlTWF4RGVwdGhWaXNpYmxlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBtYXhpbXVtIGRlcHRoIGRpc3BsYXllZCBpbiB0aGlzIG5vZGUncyBicmFuY2ggb2YgdGhlIHRyZWUKLSAgKiBVc2VkIGJ5IE5vZGVNYW5hZ2VyIGZvciBodG1sIGRpc3BsYXkgcHVycG9zZXMuCi0gICogQHJldHVybiBpbnQKLSAgKi8KLSAgcHVibGljIGludCBnZXRNYXhEZXB0aFZpc2libGUoKQotICB7Ci0gICAgaWYgKCFpc09wZW5fKQotICAgICAgcmV0dXJuIG5vZGVEZXB0aF87Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGludCBjdXJyZW50RGVwdGggPSBub2RlRGVwdGhfOwotICAgICAgRW51bWVyYXRpb24gZSA9IGNoaWxkTm9kZXNfLmVsZW1lbnRzKCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSB0aGlzTm9kZSA9IChOb2RlKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgaW50IGRlcHRoID0gdGhpc05vZGUuZ2V0TWF4RGVwdGhWaXNpYmxlKCk7Ci0gICAgICAgIGlmIChkZXB0aD5jdXJyZW50RGVwdGgpCi0gICAgICAgICAgY3VycmVudERlcHRoPWRlcHRoOwotICAgICAgfQotICAgICAgcmV0dXJuIGN1cnJlbnREZXB0aDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQYXJlbnQoTm9kZSBub2RlKQotICB7Ci0gICAgcGFyZW50XyA9IG5vZGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTm9kZSBnZXRQYXJlbnQoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWaWV3SWQoaW50IHZpZXdJZCkKLSAgewotICAgIHZpZXdJZF8gPSB2aWV3SWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFZpZXdJZCgpCi0gIHsKLSAgICByZXR1cm4gdmlld0lkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Vmlld1Rvb2xJZCgpCi0gIHsKLSAgICBUb29sTWFuYWdlciB2aWV3VG9vbE1hbmFnZXIgPSBnZXRWaWV3VG9vbE1hbmFnZXIoKTsKLSAgICBpZiAodmlld1Rvb2xNYW5hZ2VyICE9IG51bGwpCi0gICAgICByZXR1cm4gdmlld1Rvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbElkKCk7Ci0gICAgcmV0dXJuIEFjdGlvbklucHV0cy5WSUVXVE9PTElEX0RFRkFVTFQ7Ci0gIH0KLQotICAvKioKLSAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgbm9kZSBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLSAgKiBAcGFyYW0gTm9kZSBUaGUgY2hpbGQgYmVpbmcgYWRkZWQuCi0gICogQHJldHVybiBib29sZWFuIEFsd2F5cyB0cnVlLgotICAqLwotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhZGRDaGlsZChOb2RlIGNoaWxkTm9kZSkKLSAgewotICAgIGNoaWxkTm9kZS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgY2hpbGROb2Rlc18uYWRkRWxlbWVudChjaGlsZE5vZGUpOwotICAgIG5vZGVNYW5hZ2VyXy51cGRhdGVNYXhEZXB0aFZpc2libGUoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoaXMgbm9kZS4gSWYgdGhpcyBub2RlIGhhcyBubyBjaGlsZHJlbiwgYW4KLSAgKiBlbXB0eSB2ZWN0b3IgaXMgcmV0dXJuZWQuCi0gICogQHJldHVybiBWZWN0b3IKLSAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRDaGlsZE5vZGVzKCkKLSAgewotICAgIHJldHVybiBjaGlsZE5vZGVzXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldENoaWxkTm9kZShUcmVlRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGNoaWxkTm9kZXNfLmVsZW1lbnRzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgTm9kZSBwcmVzZW50Tm9kZSA9IChOb2RlKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmIChwcmVzZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpID09IGVsZW1lbnQpCi0gICAgICAgIHJldHVybiBwcmVzZW50Tm9kZTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVDaGlsZE5vZGVzKGJvb2xlYW4gaXNFbnRyeSkKLSAgewotICAgIGludCBudW1iZXJPZkNoaWxkTm9kZXMgPSBjaGlsZE5vZGVzXy5zaXplKCk7Ci0gICAgZm9yIChpbnQgaT1udW1iZXJPZkNoaWxkTm9kZXMtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkTm9kZSA9IChOb2RlKWNoaWxkTm9kZXNfLmVsZW1lbnRBdChpKTsKLSAgICAgIGNoaWxkTm9kZS5yZW1vdmVDaGlsZE5vZGVzKGZhbHNlKTsKLSAgICAgIG5vZGVNYW5hZ2VyXy5yZW1vdmVGcm9tTm9kZVRhYmxlKGNoaWxkTm9kZS5nZXROb2RlSWQoKSk7Ci0gICAgfQotICAgIGlmIChudW1iZXJPZkNoaWxkTm9kZXMgPiAwKQotICAgIHsKLSAgICAgIGNoaWxkTm9kZXNfLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICBpZiAoaXNFbnRyeSkKLSAgICAgICAgbm9kZU1hbmFnZXJfLnVwZGF0ZU1heERlcHRoVmlzaWJsZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJlbW92ZUNoaWxkTm9kZShUcmVlRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTm9kZSBjaGlsZE5vZGUgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCk7Ci0gICAgaWYgKGNoaWxkTm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBjaGlsZE5vZGVJZCA9IGNoaWxkTm9kZS5nZXROb2RlSWQoKTsKLSAgICAgIGlmIChub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlSWQoKSA9PSBjaGlsZE5vZGVJZCkKLSAgICAgICAgbm9kZU1hbmFnZXJfLnNldFNlbGVjdGVkTm9kZUlkKG5vZGVJZF8pOwotICAgICAgY2hpbGROb2Rlc18ucmVtb3ZlRWxlbWVudChjaGlsZE5vZGUpOwotICAgICAgbm9kZU1hbmFnZXJfLnJlbW92ZUZyb21Ob2RlVGFibGUoY2hpbGROb2RlSWQpOwotICAgICAgbm9kZU1hbmFnZXJfLnVwZGF0ZU1heERlcHRoVmlzaWJsZSgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgSFRNTCBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbmFtZSBvZiB0aGUgYW5jaG9yLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFuY2hvck5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGFuY2hvck5hbWVfOwotICB9Ci0KLSAgcHVibGljIFRvb2xNYW5hZ2VyIGdldFRvb2xNYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiB0b29sTWFuYWdlcl87Ci0gIH0KLQotICBwdWJsaWMgVG9vbE1hbmFnZXIgZ2V0Vmlld1Rvb2xNYW5hZ2VyKCkKLSAgewotICAgIGlmICh2aWV3SWRfICE9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICB7Ci0gICAgICBWaWV3VG9vbCB2aWV3VG9vbCA9IChWaWV3VG9vbCl0b29sTWFuYWdlcl8uZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICByZXR1cm4gdmlld1Rvb2wuZ2V0VG9vbE1hbmFnZXIodmlld0lkXyk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgVG9vbE1hbmFnZXIgZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkKLSAgewotICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gZ2V0Vmlld1Rvb2xNYW5hZ2VyKCk7Ci0gICAgaWYgKHRvb2xNYW5hZ2VyID09IG51bGwpCi0gICAgICB0b29sTWFuYWdlciA9IHRvb2xNYW5hZ2VyXzsKLSAgICByZXR1cm4gdG9vbE1hbmFnZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0VG9vbHMoKTsKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25IcmVmKCk7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRUb2dnbGVOb2RlQWN0aW9uVGFyZ2V0KCkKLSAgewotICAgIHJldHVybiBGcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkVG9nZ2xlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsU3RyaW5nQnVmZmVyIHRyZWVWaWV3LGJvb2xlYW4gaXNMYXN0Q2hpbGQpCi0gIHsKLSAgICBpZiAobm9kZURlcHRoXyAhPSAxKQotICAgIHsKLSAgICAgIHRyZWVWaWV3LmFwcGVuZCgiICAgIDx0ZCBhbGlnbj1cImxlZnRcIiB3aWR0aD0xNiBoZWlnaHQ9MTYgbm93cmFwPiIpOwotICAgICAgU3RyaW5nIHRvZ2dsZUltYWdlVGFnOwotICAgICAgaWYgKGNoaWxkTm9kZXNfLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIC8vIDxhIGhyZWY9Ii4uLiIgdGFyZ2V0PSIuLi4iPnRvZ2dsZUltYWdlVGFnPC9hPgotICAgICAgICBTdHJpbmcgaHJlZiA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KGdldFRvZ2dsZU5vZGVBY3Rpb25IcmVmKCkpOwotICAgICAgICBpZiAoaXNPcGVuXykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0b2dnbGVBbHQgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIkFMVF9DTE9TRSIpOwotICAgICAgICAgIGlmIChpc0xhc3RDaGlsZCkKLSAgICAgICAgICAgIHRvZ2dsZUltYWdlVGFnID0gSFRNTFV0aWxzLmdldEhUTUxJbWFnZVRhZyhyZXNwb25zZSxub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFBhdGhXaXRoQ29udGV4dChOb2RlTWFuYWdlci5QQVRIX01JTlVTX0xBU1QpLHRvZ2dsZUFsdCwiMTYiLCIxNiIsbnVsbCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdG9nZ2xlSW1hZ2VUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KE5vZGVNYW5hZ2VyLlBBVEhfTUlOVVNfTk9UTEFTVCksdG9nZ2xlQWx0LCIxNiIsIjE2IixudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdG9nZ2xlQWx0ID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJBTFRfT1BFTiIpOwotICAgICAgICAgIGlmIChpc0xhc3RDaGlsZCkKLSAgICAgICAgICAgIHRvZ2dsZUltYWdlVGFnID0gSFRNTFV0aWxzLmdldEhUTUxJbWFnZVRhZyhyZXNwb25zZSxub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFBhdGhXaXRoQ29udGV4dChOb2RlTWFuYWdlci5QQVRIX1BMVVNfTEFTVCksdG9nZ2xlQWx0LCIxNiIsIjE2IixudWxsKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB0b2dnbGVJbWFnZVRhZyA9IEhUTUxVdGlscy5nZXRIVE1MSW1hZ2VUYWcocmVzcG9uc2Usbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRQYXRoV2l0aENvbnRleHQoTm9kZU1hbmFnZXIuUEFUSF9QTFVTX05PVExBU1QpLHRvZ2dsZUFsdCwiMTYiLCIxNiIsbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGxpbmtUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTExpbmtUYWcocmVzcG9uc2UsaHJlZixnZXRUb2dnbGVOb2RlQWN0aW9uVGFyZ2V0KCksU3RyaW5nLnZhbHVlT2Yobm9kZUlkXyksdG9nZ2xlSW1hZ2VUYWcsbnVsbCk7Ci0gICAgICAgIHRyZWVWaWV3LmFwcGVuZChsaW5rVGFnKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gPGltZy4uLj4KLSAgICAgICAgaWYgKGlzTGFzdENoaWxkKQotICAgICAgICAgIHRvZ2dsZUltYWdlVGFnID0gSFRNTFV0aWxzLmdldEhUTUxJbWFnZVRhZyhyZXNwb25zZSxub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFBhdGhXaXRoQ29udGV4dChOb2RlTWFuYWdlci5QQVRIX0xJTkVfTEFTVCksIiIsIjE2IiwiMTYiLG51bGwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdG9nZ2xlSW1hZ2VUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KE5vZGVNYW5hZ2VyLlBBVEhfTElORV9OT1RMQVNUKSwiIiwiMTYiLCIxNiIsbnVsbCk7Ci0gICAgICAgIHRyZWVWaWV3LmFwcGVuZCh0b2dnbGVJbWFnZVRhZyk7Ci0gICAgICB9Ci0gICAgICB0cmVlVmlldy5hcHBlbmQoIjwvdGQ+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMaW5rQWN0aW9uSHJlZigpOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGlua0FjdGlvblRhcmdldCgpCi0gIHsKLSAgICByZXR1cm4gRnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3BlbkltYWdlUGF0aCgpCi0gIHsKLSAgICByZXR1cm4gaW1hZ2VQYXRoXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xvc2VkSW1hZ2VQYXRoKCkKLSAgewotICAgIHJldHVybiBpbWFnZVBhdGhfOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSFRNTExhYmVsKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsU3RyaW5nQnVmZmVyIHRyZWVWaWV3LGJvb2xlYW4gaXNMYXN0Q2hpbGQpCi0gIHsKLSAgICAvLyA8YSBocmVmPSIuLi4iIHRhcmdldD0iLi4uIiBvbkNsaWNrPSJzZWxlY3ROb2RlKCcuLi4nKSI+PGltZy4uLj48L2E+Ci0gICAgSGFzaHRhYmxlIGFkZGl0aW9uYWxBdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGFkZGl0aW9uYWxBdHRyaWJ1dGVzLnB1dCgibmFtZSIsYW5jaG9yTmFtZV8pOwotICAgIFN0cmluZyBpbWFnZVBhdGggPSAobm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZUlkKCkgPT0gbm9kZUlkXyk/Z2V0T3BlbkltYWdlUGF0aCgpOmdldENsb3NlZEltYWdlUGF0aCgpOwotCi0gICAgU3RyaW5nIGltYWdlVGFnID0gSFRNTFV0aWxzLmdldEhUTUxJbWFnZVRhZyhyZXNwb25zZSxub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFBhdGhXaXRoQ29udGV4dChpbWFnZVBhdGgpLCIiLCIxNiIsIjE2IixhZGRpdGlvbmFsQXR0cmlidXRlcyk7Ci0gICAgU3RyaW5nIGJhc2VIcmVmID0gZ2V0TGlua0FjdGlvbkhyZWYoKTsKLSAgICBTdHJpbmcgaHJlZiA9ICgoYmFzZUhyZWYgPT0gbnVsbCk/YmFzZUhyZWY6bm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRQYXRoV2l0aENvbnRleHQoYmFzZUhyZWYpKTsKLSAgICBTdHJpbmcgdGFyZ2V0ID0gZ2V0TGlua0FjdGlvblRhcmdldCgpOwotICAgIGFkZGl0aW9uYWxBdHRyaWJ1dGVzLmNsZWFyKCk7Ci0KLSAgICB0cmVlVmlldy5hcHBlbmQoIiAgICA8dGQgYWxpZ249XCJsZWZ0XCIgd2lkdGg9MTYgaGVpZ2h0PTE2IG5vd3JhcD4iKTsKLSAgICBpZiAoaHJlZiAhPSBudWxsKQotICAgICAgdHJlZVZpZXcuYXBwZW5kKEhUTUxVdGlscy5nZXRIVE1MTGlua1RhZyhyZXNwb25zZSxocmVmLHRhcmdldCxudWxsLGltYWdlVGFnLGFkZGl0aW9uYWxBdHRyaWJ1dGVzKSk7Ci0gICAgZWxzZQotICAgICAgdHJlZVZpZXcuYXBwZW5kKGltYWdlVGFnKTsKLSAgICB0cmVlVmlldy5hcHBlbmQoIjwvdGQ+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgdHJlZVZpZXcuYXBwZW5kKCIgICAgPHRkIGFsaWduPVwibGVmdFwiIHdpZHRoPTMgaGVpZ2h0PTEwIG5vd3JhcD4iKS5hcHBlbmQoSFRNTFV0aWxzLmdldEhUTUxJbWFnZVRhZyhyZXNwb25zZSxub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFBhdGhXaXRoQ29udGV4dChOb2RlTWFuYWdlci5QQVRIX1NQQUNFKSwiIiwiMyIsIjEwIixudWxsKSkuYXBwZW5kKCI8L3RkPiIpLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotCi0gICAgLy8gPGEgbmFtZT0iLi4uIiBocmVmPSIuLi4iIHRhcmdldD0iLi4uIj5sYWJlbDwvYT4KLSAgICB0cmVlVmlldy5hcHBlbmQoIiAgICA8dGQgYWxpZ249XCJsZWZ0XCIgbm93cmFwPiIpLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotICAgIHRyZWVWaWV3LmFwcGVuZCgiICAgICAgIik7Ci0gICAgaWYgKGhyZWYgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdGV4dEFuY2hvckNsYXNzOwotICAgICAgaWYgKG5vZGVNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGVJZCgpID09IG5vZGVJZF8pCi0gICAgICAgIHRleHRBbmNob3JDbGFzcz0ic2VsZWN0ZWRUZXh0QW5jaG9yIjsKLSAgICAgIGVsc2UKLSAgICAgICAgdGV4dEFuY2hvckNsYXNzPSJ1bnNlbGVjdGVkVGV4dEFuY2hvciI7Ci0gICAgICBhZGRpdGlvbmFsQXR0cmlidXRlcy5wdXQoImNsYXNzIix0ZXh0QW5jaG9yQ2xhc3MpOwotICAgICAgdHJlZVZpZXcuYXBwZW5kKEhUTUxVdGlscy5nZXRIVE1MTGlua1RhZyhyZXNwb25zZSxocmVmLHRhcmdldCxhbmNob3JOYW1lXyxnZXROb2RlTmFtZSgpLGFkZGl0aW9uYWxBdHRyaWJ1dGVzKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHRyZWVWaWV3LmFwcGVuZCgiPHN0cm9uZz4iKS5hcHBlbmQoZ2V0Tm9kZU5hbWUoKSkuYXBwZW5kKCI8L3N0cm9uZz4iKTsKLSAgICB0cmVlVmlldy5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKS5hcHBlbmQoIiAgICA8L3RkPiIpLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVuZGVyTm9kZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLFN0cmluZ0J1ZmZlciB0cmVlVmlldyxTdHJpbmcgcHJlZml4Q29sdW1ucyxib29sZWFuIGlzTGFzdENoaWxkKQotICB7Ci0gICAgU3RyaW5nIHNwYWNlXzE2eDE2ID0gSFRNTFV0aWxzLmdldEhUTUxJbWFnZVRhZyhyZXNwb25zZSxub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFBhdGhXaXRoQ29udGV4dChOb2RlTWFuYWdlci5QQVRIX1NQQUNFKSwiIiwiMTYiLCIxNiIsbnVsbCk7Ci0gICAgU3RyaW5nIGxpbmVfMTZ4MTYgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KE5vZGVNYW5hZ2VyLlBBVEhfTElORSksIiIsIjE2IiwiMTYiLG51bGwpOwotCi0gICAgLy8gVXNlIGJvcmRlcj0xIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuCi0gICAgdHJlZVZpZXcuYXBwZW5kKCI8dGFibGUgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0wIGJvcmRlcj0wPiIpLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotICAgIHRyZWVWaWV3LmFwcGVuZCgiICA8dHI+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgdHJlZVZpZXcuYXBwZW5kKCIgICAgPHRkIGFsaWduPVwibGVmdFwiIHdpZHRoPTE2IGhlaWdodD0xNiBub3dyYXA+IikuYXBwZW5kKHNwYWNlXzE2eDE2KS5hcHBlbmQoIjwvdGQ+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgU3RyaW5nQnVmZmVyIG5ld1ByZWZpeENvbHVtbnMgPSBuZXcgU3RyaW5nQnVmZmVyKHByZWZpeENvbHVtbnMpOwotICAgIGlmIChub2RlRGVwdGhfID49IDIpCi0gICAgewotICAgICAgaWYgKHByZWZpeENvbHVtbnMubGVuZ3RoKCkgPiAwKQotICAgICAgICB0cmVlVmlldy5hcHBlbmQocHJlZml4Q29sdW1ucykuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgICAvLyBnZW5lcmF0ZSBhIG5ldyBwcmVmaXggY29sdW1ucy4KLSAgICAgIG5ld1ByZWZpeENvbHVtbnMuYXBwZW5kKCIgICAgPHRkIGFsaWduPVwibGVmdFwiIHdpZHRoPTE2IGhlaWdodD0xNiBub3dyYXA+Iik7Ci0gICAgICBpZiAoaXNMYXN0Q2hpbGQpCi0gICAgICAgIG5ld1ByZWZpeENvbHVtbnMuYXBwZW5kKHNwYWNlXzE2eDE2KTsKLSAgICAgIGVsc2UKLSAgICAgICAgbmV3UHJlZml4Q29sdW1ucy5hcHBlbmQobGluZV8xNngxNik7Ci0gICAgICBuZXdQcmVmaXhDb2x1bW5zLmFwcGVuZCgiPC90ZD4iKS5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKTsKLSAgICB9Ci0gICAgYWRkVG9nZ2xlKHJlc3BvbnNlLHRyZWVWaWV3LGlzTGFzdENoaWxkKTsKLSAgICBhZGRIVE1MTGFiZWwocmVzcG9uc2UsdHJlZVZpZXcsaXNMYXN0Q2hpbGQpOwotICAgIHRyZWVWaWV3LmFwcGVuZCgiICA8L3RyPiIpLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotICAgIHRyZWVWaWV3LmFwcGVuZCgiPC90YWJsZT4iKS5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKTsKLSAgICBpbnQgbnVtYmVyT2ZDaGlsZE5vZGVzID0gY2hpbGROb2Rlc18uc2l6ZSgpOwotICAgIGlmIChudW1iZXJPZkNoaWxkTm9kZXMgPiAwKQotICAgIHsKLSAgICAgIGlmIChpc09wZW5fKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7aTxudW1iZXJPZkNoaWxkTm9kZXMtMTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIGNoaWxkTm9kZSA9IChOb2RlKWNoaWxkTm9kZXNfLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBjaGlsZE5vZGUucmVuZGVyTm9kZShyZXNwb25zZSx0cmVlVmlldyxuZXdQcmVmaXhDb2x1bW5zLnRvU3RyaW5nKCksZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGUgbGFzdENoaWxkTm9kZSA9IChOb2RlKWNoaWxkTm9kZXNfLmVsZW1lbnRBdChudW1iZXJPZkNoaWxkTm9kZXMtMSk7Ci0gICAgICAgIGxhc3RDaGlsZE5vZGUucmVuZGVyTm9kZShyZXNwb25zZSx0cmVlVmlldyxuZXdQcmVmaXhDb2x1bW5zLnRvU3RyaW5nKCksdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gRm9yIHNvcnRpbmcgcHVycG9zZXMuICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL05vZGVNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTm9kZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyMzgwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTm9kZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotcHVibGljIGNsYXNzIE5vZGVNYW5hZ2VyCi17Ci0gIC8vIHBhdGhzIHRvIGljb24gaW1hZ2VzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfUExVU19OT1RMQVNUID0gImltYWdlcy9wbHVzX25vdGxhc3QuZ2lmIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9QTFVTX0xBU1QgPSAiaW1hZ2VzL3BsdXNfbGFzdC5naWYiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX01JTlVTX05PVExBU1QgPSAiaW1hZ2VzL21pbnVzX25vdGxhc3QuZ2lmIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9NSU5VU19MQVNUID0gImltYWdlcy9taW51c19sYXN0LmdpZiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTElORSA9ICJpbWFnZXMvbGluZS5naWYiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xJTkVfTk9UTEFTVCA9ICJpbWFnZXMvbGluZV9ub3RsYXN0LmdpZiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTElORV9MQVNUID0gImltYWdlcy9saW5lX2xhc3QuZ2lmIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TUEFDRSA9ICJpbWFnZXMvc3BhY2UuZ2lmIjsKLQotICBwcml2YXRlIENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIHByaXZhdGUgTm9kZSByb290Tm9kZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIG5vZGVUYWJsZV87Ci0gIHByaXZhdGUgaW50IGZvY3VzZWROb2RlSWRfOwotICBwcml2YXRlIGludCBzZWxlY3RlZE5vZGVJZF87Ci0gIHByaXZhdGUgaW50IHByZXZpb3VzU2VsZWN0ZWROb2RlSWRfOwotICBwcml2YXRlIGludCBtYXhEZXB0aFZpc2libGVfOwotICBwcml2YXRlIGludCBuZXh0SWRfOwotCi0gIHB1YmxpYyBOb2RlTWFuYWdlcihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7Ci0gICAgcm9vdE5vZGVfID0gbnVsbDsKLSAgICBub2RlVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZvY3VzZWROb2RlSWRfID0gLTE7Ci0gICAgc2VsZWN0ZWROb2RlSWRfID0gLTE7Ci0gICAgcHJldmlvdXNTZWxlY3RlZE5vZGVJZF8gPSAtMTsKLSAgICBtYXhEZXB0aFZpc2libGVfID0gMTsKLSAgICBuZXh0SWRfID0gMDsKLSAgfQotCi0gIC8qKgotICAqIEhvb2sgZm9yIHRoZSBjb250cm9sbGVyLgotICAqIEByZXR1cm4gQ29udHJvbGxlciBUaGUgcGVyc3BlY3RpdmUgY29udHJvbGxlci4KLSAgKi8KLSAgcHVibGljIENvbnRyb2xsZXIgZ2V0Q29udHJvbGxlcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl87Ci0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSByb290IG5vZGUgb2YgdGhlIHRyZWUuCi0gICogQHBhcmFtIHJvb3ROb2RlIFRoZSBub2RlIGJlaW5nIGRlc2lnbmF0ZWQgYXMgdGhlIHJvb3Qgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdE5vZGUoTm9kZSByb290Tm9kZSkKLSAgewotICAgIHJvb3ROb2RlXyA9IHJvb3ROb2RlOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIG1hbmFnZWQgYnkgdGhpcyBOb2RlTWFuYWdlci4KLSAgKiBAcmV0dXJuIE5vZGUgVGhlIHJvb3Qgbm9kZS4KLSAgKi8KLSAgcHVibGljIE5vZGUgZ2V0Um9vdE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHJvb3ROb2RlXzsKLSAgfQotCi0gIC8qKgotICAqIEBwYXJhbSBJbnRlZ2VyIFRoZSBpZCBvZiB0aGUgbm9kZSBiZWluZyBhZGRlZC4KLSAgKiBAcGFyYW0gTm9kZSBUaGUgbm9kZSBiZWluZyBhZGRlZC4KLSAgKiBAcmV0dXJuIFRoZSBub2RlSWQgYXNzaWduZWQgdG8gdGhpcyBub2RlLgotICAqLwotICBwdWJsaWMgaW50IGFkZFRvTm9kZVRhYmxlKE5vZGUgbm9kZSkKLSAgewotICAgIGludCBhc3NpZ25lZE5vZGVJZCA9IG5leHRJZF87Ci0gICAgbm9kZVRhYmxlXy5wdXQoU3RyaW5nLnZhbHVlT2YoYXNzaWduZWROb2RlSWQpLG5vZGUpOwotICAgIG5leHRJZF8rKzsKLSAgICByZXR1cm4gYXNzaWduZWROb2RlSWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGcm9tTm9kZVRhYmxlKGludCBub2RlSWQpCi0gIHsKLSAgICBWZWN0b3Igbm9kZXNUb1JlbW92ZSA9IG5ldyBWZWN0b3IoKTsKLSAgICBOb2RlIG5vZGUgPSBnZXROb2RlKG5vZGVJZCk7Ci0gICAgZ2F0aGVyTm9kZXNUb1JlbW92ZShub2Rlc1RvUmVtb3ZlLCBub2RlKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICBub2RlVGFibGVfLnJlbW92ZShTdHJpbmcudmFsdWVPZigoKE5vZGUpaXQubmV4dCgpKS5nZXROb2RlSWQoKSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnYXRoZXJOb2Rlc1RvUmVtb3ZlKFZlY3RvciBub2Rlc1RvUmVtb3ZlLCBOb2RlIG5vZGUpIHsKLSAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICBub2Rlc1RvUmVtb3ZlLmFkZChub2RlKTsKLSAgICAgIFZlY3RvciBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGROb2Rlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgIGdhdGhlck5vZGVzVG9SZW1vdmUobm9kZXNUb1JlbW92ZSwgKE5vZGUpaXQubmV4dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBkZXB0aCBvZiB0aGUgZGVlcGVzdCB2aXNpYmxlIG5vZGUgaW4gdGhlIHRyZWUuCi0gICogQHJldHVybiBpbnQKLSAgKi8KLSAgcHVibGljIGludCBnZXRNYXhEZXB0aFZpc2libGUoKQotICB7Ci0gICAgcmV0dXJuIG1heERlcHRoVmlzaWJsZV87Ci0gIH0KLQotICAvKioKLSAgKiBVcGRhdGVzIHRoZSBkZXB0aCBvZiB0aGUgZGVlcGVzdCB2aXNpYmxlIG5vZGUgaW4gdGhlIHRyZWUuIE5vZGVzCi0gICogbXVzdCBjYWxsIHRoaXMgd2hlbiB0aGUgdmlzaWJpbGl0eSBvZiB0aGVpciBjaGlsZHJlbiBjaGFuZ2VzLgotICAqIChlLmcuIGV4cGFuZC9jb2xsYXBzZSBvZiBhIHBhcmVudCBub2RlKS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdXBkYXRlTWF4RGVwdGhWaXNpYmxlKCkKLSAgewotICAgIGlmIChyb290Tm9kZV8gIT0gbnVsbCkKLSAgICAgIG1heERlcHRoVmlzaWJsZV8gPSByb290Tm9kZV8uZ2V0TWF4RGVwdGhWaXNpYmxlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBpZCBmb3IgYSBuZXdseSBjcmVhdGVkIG5vZGUuCi0gICogQHJldHVybiBpbnQKLSAgKi8KLSAgcHVibGljIGludCBnZXROZXh0Tm9kZUlkKCkKLSAgewotICAgIHJldHVybiBuZXh0SWRfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIG5vZGUgaW4gdGhlIHRyZWUuIEEgbm9kZQotICAqIGJlY29tZXMgZm9jdXNlZCB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyBvY2N1cjoKLSAgKiAxKSBUaGUgbm9kZSdzIGljb24gb3IgaW1hZ2UgYXJlIHNlbGVjdGVkIGJ5IGEgdXNlci4KLSAgKiAyKSBUaGUgbm9kZSdzIGV4cGFuZC9jb2xsYXBzZSBpY29uIGlzIGNsaWNrZWQuCi0gICogMykgUHJvZ3JhbW1hdGljYWxseSBzZXQgYnkgdGhlIHByb2dyYW1tZXIuCi0gICogVGhlIHRyZWV2aWV3IHdpbGwgYWx3YXlzIHNjcm9sbCB0byB0aGUgY3VycmVudCBmb2N1c2VkIG5vZGUgd2hlbiBsb2FkZWQuCi0gICogQHJldHVybiBpbnQgVGhlIGlkLgotICAqLwotICBwdWJsaWMgaW50IGdldEZvY3VzZWROb2RlSWQoKQotICB7Ci0gICAgcmV0dXJuIGZvY3VzZWROb2RlSWRfOwotICB9Ci0KLSAgLyoqCi0gICogQWxsb3dzIG1vZGlmaWNhdGlvbiBvZiB0aGUgZm9jdXNlZCBub2RlLgotICAqIEBwYXJhbSBpbnQgVGhlIGlkIG9mIHRoZSBub2RlIHRoYXQgaXMgaW4gZm9jdXMuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEZvY3VzZWROb2RlSWQoaW50IG5vZGVJZCkKLSAgewotICAgIGZvY3VzZWROb2RlSWRfID0gbm9kZUlkOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Rm9jdXNlZE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGdldE5vZGUoZm9jdXNlZE5vZGVJZF8pOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBub2RlIGluIHRoZSB0cmVlLgotICAqIEByZXR1cm4gaW50IFRoZSBpZC4KLSAgKi8KLSAgcHVibGljIGludCBnZXRTZWxlY3RlZE5vZGVJZCgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWROb2RlSWRfOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0U2VsZWN0ZWROb2RlKCkKLSAgewotICAgIHJldHVybiBnZXROb2RlKHNlbGVjdGVkTm9kZUlkXyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byBhIE5vZGUgaW4gdGhpcyBtYW5hZ2VyJ3Mgbm9kZSB0YWJsZS4KLSAgKiBAcmV0dXJuIE5vZGUgVGhlIG5vZGUuCi0gICovCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoaW50IG5vZGVJZCkKLSAgewotICAgIHJldHVybiAoTm9kZSlub2RlVGFibGVfLmdldChTdHJpbmcudmFsdWVPZihub2RlSWQpKTsKLSAgfQotCi0gIC8qKgotICAqIEFsbG93cyBtb2RpZmljYXRpb24gb2YgdGhlIHNlbGVjdGVkIE5vZGUuIE5vdGUgdGhhdCBzZXR0aW5nIGEgbm9kZSB0byBiZWNvbWUKLSAgKiBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5IG1ha2VzIGl0IHRoZSBmb2N1c2VkIG5vZGUuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBhIG9uZQotICAqIHdheSByZWxhdGlvbnNoaXAuCi0gICogQHBhcmFtIGludCBUaGUgaWQgb2YgdGhlIG5vZGUgdGhhdCBpcyBiZWluZyBzZWxlY3RlZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROb2RlSWQoaW50IG5vZGVJZCkKLSAgewotICAgIHByZXZpb3VzU2VsZWN0ZWROb2RlSWRfID0gc2VsZWN0ZWROb2RlSWRfOwotICAgIHNlbGVjdGVkTm9kZUlkXyA9IG5vZGVJZDsKLSAgICBzZXRGb2N1c2VkTm9kZUlkKHNlbGVjdGVkTm9kZUlkXyk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFByZXZpb3VzU2VsZWN0ZWROb2RlSWQoKQotICB7Ci0gICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0ZWROb2RlSWRfOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTZWxlY3RlZE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIChOb2RlKW5vZGVUYWJsZV8uZ2V0KFN0cmluZy52YWx1ZU9mKHByZXZpb3VzU2VsZWN0ZWROb2RlSWRfKSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZW5kZXIgdGhlIEhUTUwgdHJlZSB2aWV3IGZvciB0aGlzIG5vZGUuCi0gICogQHBhcmFtIEh0dHBTZXJ2bGV0UmVzcG9uc2UgRm9yIGVuY29kaW5nIFVSTHMuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIEhUTUwgcmVwcmVzZW50aW5nIHRoZSB0cmVlIHZpZXcuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgcmVuZGVyVHJlZVZpZXcoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciB0cmVlVmlldyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICByb290Tm9kZV8ucmVuZGVyTm9kZShyZXNwb25zZSx0cmVlVmlldywiIixmYWxzZSk7Ci0gICAgcmV0dXJuIHRyZWVWaWV3LnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIE1ha2UgdGhlIHByb3ZpZGVkIG5vZGUgaXMgdmlzaWJsZSBieSBlbnN1cmluZyB0aGF0IGl0cyBhbmNlc3RvcnMgYXJlIHZpc2libGUuCi0gICogQHBhcmFtIE5vZGUgVGhlIG5vZGUgdG8gYmUgbWFkZSB2aXNpYmxlLgotICAqIEByZXR1cm4gYm9vbGVhbiBJbmRpY2F0b3IgZm9yIHdoZXRoZXIgb3Igbm90IHRoZSB0cmVldmlldyBuZWVkcyByZWZyZXNoaW5nIChpLmUuIGFuIGFuY2VzdG9yIHdhcyBub3QgdmlzaWJsZSkuCi0gICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIG1ha2VOb2RlVmlzaWJsZShOb2RlIG5vZGUpCi0gIHsKLSAgICBib29sZWFuIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoID0gZmFsc2U7Ci0gICAgd2hpbGUgKChub2RlID0gbm9kZS5nZXRQYXJlbnQoKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIW5vZGUuaXNPcGVuKCkpCi0gICAgICB7Ci0gICAgICAgIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgbm9kZS5zZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbih0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoOwotICB9Ci0gIAotICAvKioKLSAgKiBNYWtlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSB2aXNpYmxlIGJ5IGVuc3VyaW5nIHRoYXQgaXRzIGFuY2VzdG9ycyBhcmUgdmlzaWJsZS4KLSAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gbWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKQotICB7Ci0gICAgcmV0dXJuIG1ha2VOb2RlVmlzaWJsZShnZXRTZWxlY3RlZE5vZGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZjQ0MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzcGVjdGl2ZSBleHRlbmRzIE1lc3NhZ2VQcm92aWRlcgotewotICBwcm90ZWN0ZWQgQ29udHJvbGxlciBjb250cm9sbGVyXzsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWVfOwotCi0gIHB1YmxpYyBQZXJzcGVjdGl2ZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUZpbGVOYW1lLENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKG1lc3NhZ2VCdW5kbGVGaWxlTmFtZSk7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgIG1lc3NhZ2VRdWV1ZV8gPSBuZXcgTWVzc2FnZVF1ZXVlKCk7Ci0gIH0KLQotICBwdWJsaWMgTWVzc2FnZVF1ZXVlIGdldE1lc3NhZ2VRdWV1ZSgpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZVF1ZXVlXzsKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sbGVyIGdldENvbnRyb2xsZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQYW5lc0ZpbGUoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGcmFtZXNldHNGaWxlKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvY2Vzc0ZyYW1lc2V0c0Zvcm0oKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTd2l0Y2hQZXJzcGVjdGl2ZUZvcm1BY3Rpb25MaW5rKGludCB0YXJnZXRQZXJzcGVjdGl2ZUlkLGJvb2xlYW4gZm9ySGlzdG9yeSk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UGVyc3BlY3RpdmVDb250ZW50UGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBlcnNwZWN0aXZlSWQoKTsKLQotICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUgcGVyc3BlY3RpdmUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluc3RhbnRpYXRlZC4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdFBlcnNwZWN0aXZlKFNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uKTsKLSAgCi0gIC8vIE5vZGUgbWFuYWdlciBmb3IgdGhlIG5hdmlnYXRvci90cmVlIGNvbnRlbnQgcGFnZQotICBwdWJsaWMgYWJzdHJhY3QgTm9kZU1hbmFnZXIgZ2V0Tm9kZU1hbmFnZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9TZWN0aW9uSGVhZGVySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1NlY3Rpb25IZWFkZXJJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNWYzOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1NlY3Rpb25IZWFkZXJJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkhlYWRlckluZm8KLXsKLSAgcHJpdmF0ZSBTdHJpbmcgY29udGFpbmVySWRfOwotICBwcml2YXRlIGJvb2xlYW4gZHluYW1pY187Ci0gIHByaXZhdGUgT2JqZWN0IG90aGVyUHJvcGVydGllc187Ci0KLSAgcHVibGljIFNlY3Rpb25IZWFkZXJJbmZvKCkKLSAgewotICAgIGNsZWFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhcigpCi0gIHsKLSAgICBjb250YWluZXJJZF8gPSAiIjsKLSAgICBkeW5hbWljXyA9IHRydWU7Ci0gICAgb3RoZXJQcm9wZXJ0aWVzXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDb250YWluZXJJZChTdHJpbmcgY29udGFpbmVySWQpCi0gIHsKLSAgICBjb250YWluZXJJZF8gPSBjb250YWluZXJJZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udGFpbmVySWQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRhaW5lcklkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGVuYWJsZUR5bmFtaWMoYm9vbGVhbiBpc0VuYWJsZWQpCi0gIHsKLSAgICBkeW5hbWljXyA9IGlzRW5hYmxlZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRHluYW1pYygpCi0gIHsKLSAgICByZXR1cm4gZHluYW1pY187Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRPdGhlclByb3BlcnRpZXMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIG90aGVyUHJvcGVydGllc18gPSBvYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldE90aGVyUHJvcGVydGllcygpCi0gIHsKLSAgICByZXR1cm4gb3RoZXJQcm9wZXJ0aWVzXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1NldERlZmF1bHRWaWV3VG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1NldERlZmF1bHRWaWV3VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2VmMWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9TZXREZWZhdWx0Vmlld1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXREZWZhdWx0Vmlld1Rvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sCi17Ci0gIHB1YmxpYyBTZXREZWZhdWx0Vmlld1Rvb2woVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih2aWV3VG9vbE1hbmFnZXIsImltYWdlcy90b3BfZW5hYmxlZC5naWYiLCJpbWFnZXMvdG9wX2hpZ2hsaWdodGVkLmdpZiIsYWx0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmZiOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTM2NDQ5IGJydW5zc2VuQHVzLmlibS5jb20gLSBWaW5jZSBCcnVuc3NlbiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5IVE1MVXRpbHM7Ci0KLS8vIEEgY2xhc3MgZm9yIHJlcHJlc2VudGluZyB0b29sYmFyIHRvb2xzLgotcHVibGljIGFic3RyYWN0IGNsYXNzIFRvb2wKLXsKLSAgcHJvdGVjdGVkIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZW5hYmxlZEltYWdlTGlua187Ci0gIHByaXZhdGUgU3RyaW5nIGhpZ2hsaWdodGVkSW1hZ2VMaW5rXzsKLSAgcHJpdmF0ZSBTdHJpbmcgYWx0XzsKLSAgcHJvdGVjdGVkIGludCB0b29sSWRfOwotICBwcm90ZWN0ZWQgYnl0ZSB0b29sVHlwZV87Ci0KLSAgcHVibGljIFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGVuYWJsZWRJbWFnZUxpbmssU3RyaW5nIGhpZ2hsaWdodGVkSW1hZ2VMaW5rLFN0cmluZyBhbHQsYnl0ZSB0b29sVHlwZSkKLSAgewotICAgIHRvb2xNYW5hZ2VyXyA9IHRvb2xNYW5hZ2VyOwotICAgIGVuYWJsZWRJbWFnZUxpbmtfID0gZW5hYmxlZEltYWdlTGluazsKLSAgICBoaWdobGlnaHRlZEltYWdlTGlua18gPSBoaWdobGlnaHRlZEltYWdlTGluazsKLSAgICBhbHRfID0gYWx0OwotICAgIHRvb2xJZF8gPSB0b29sTWFuYWdlcl8uYWRkVG9vbCh0aGlzKTsKLSAgICB0b29sVHlwZV8gPSB0b29sVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KTsKLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25UYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIEZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUE7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgZ2VuZXJhdGVPbk1vdXNlVmFsdWUoU3RyaW5nQnVmZmVyIHZhbHVlLEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsU3RyaW5nIGZ1bGxJbWFnZUxpbmspCi0gIHsKLSAgICB2YWx1ZS5hcHBlbmQoInNyYz0nIikuYXBwZW5kKHJlc3BvbnNlLmVuY29kZVVSTChmdWxsSW1hZ2VMaW5rKSkuYXBwZW5kKCdcJycpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyByZW5kZXJUb29sKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgSGFzaHRhYmxlIGpzSW1hZ2VQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIFN0cmluZ0J1ZmZlciBwcm9wZXJ0eVZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZyBmdWxsRW5hYmxlZEltYWdlTGluayA9IGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGVuYWJsZWRJbWFnZUxpbmtfKTsKLSAgICBnZW5lcmF0ZU9uTW91c2VWYWx1ZShwcm9wZXJ0eVZhbHVlLHJlc3BvbnNlLGZ1bGxFbmFibGVkSW1hZ2VMaW5rKTsKLSAgICBpbnQgcHJvcGVydHlWYWx1ZUxlbmd0aCA9IHByb3BlcnR5VmFsdWUubGVuZ3RoKCk7Ci0gICAganNJbWFnZVByb3BlcnRpZXMucHV0KCJjbGFzcyIsIm5vcm1hbCIpOwotICAgIGpzSW1hZ2VQcm9wZXJ0aWVzLnB1dCgib25Nb3VzZU91dCIscHJvcGVydHlWYWx1ZS5hcHBlbmQoIjttb3VzZW91dCh0aGlzKSIpLnRvU3RyaW5nKCkpOwotICAgIHByb3BlcnR5VmFsdWUuZGVsZXRlKHByb3BlcnR5VmFsdWVMZW5ndGgscHJvcGVydHlWYWx1ZS5sZW5ndGgoKSk7Ci0gICAganNJbWFnZVByb3BlcnRpZXMucHV0KCJvbk1vdXNlVXAiLHByb3BlcnR5VmFsdWUuYXBwZW5kKCI7bW91c2V1cCh0aGlzKSIpLnRvU3RyaW5nKCkpOwotICAgIHByb3BlcnR5VmFsdWUuc2V0TGVuZ3RoKDApOwotICAgIGdlbmVyYXRlT25Nb3VzZVZhbHVlKHByb3BlcnR5VmFsdWUscmVzcG9uc2UsY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoaGlnaGxpZ2h0ZWRJbWFnZUxpbmtfKSk7Ci0gICAgcHJvcGVydHlWYWx1ZUxlbmd0aCA9IHByb3BlcnR5VmFsdWUubGVuZ3RoKCk7Ci0gICAganNJbWFnZVByb3BlcnRpZXMucHV0KCJvbk1vdXNlT3ZlciIscHJvcGVydHlWYWx1ZS5hcHBlbmQoIjttb3VzZW92ZXIodGhpcykiKS50b1N0cmluZygpKTsKLSAgICBwcm9wZXJ0eVZhbHVlLmRlbGV0ZShwcm9wZXJ0eVZhbHVlTGVuZ3RoLHByb3BlcnR5VmFsdWUubGVuZ3RoKCkpOwotICAgIGpzSW1hZ2VQcm9wZXJ0aWVzLnB1dCgib25Nb3VzZURPd24iLHByb3BlcnR5VmFsdWUuYXBwZW5kKCI7bW91c2Vkb3duKHRoaXMpIikudG9TdHJpbmcoKSk7Ci0KLSAgICBTdHJpbmcgaW1hZ2VUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLGZ1bGxFbmFibGVkSW1hZ2VMaW5rLGFsdF8sIjE2IiwiMTYiLGpzSW1hZ2VQcm9wZXJ0aWVzKTsKLSAgICByZXR1cm4gSFRNTFV0aWxzLmdldEhUTUxMaW5rVGFnKHJlc3BvbnNlLGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGZhbHNlKSksZ2V0U2VsZWN0VG9vbEFjdGlvblRhcmdldCgpLG51bGwsaW1hZ2VUYWcsbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVG9vbE1hbmFnZXIgZ2V0VG9vbE1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xNYW5hZ2VyXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VG9vbElkKCkKLSAgewotICAgIHJldHVybiB0b29sSWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJ5dGUgZ2V0VG9vbFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xUeXBlXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRFbmFibGVkSW1hZ2VMaW5rKCkKLSAgewotICAgIHJldHVybiBlbmFibGVkSW1hZ2VMaW5rXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRIaWdobGlnaHRlZEltYWdlTGluaygpCi0gIHsKLSAgICByZXR1cm4gaGlnaGxpZ2h0ZWRJbWFnZUxpbmtfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsdFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGFsdF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldEFsdFRleHQoU3RyaW5nIGFsdCkKLSAgewotICAJYWx0XyA9IGFsdDsKLSAgfSAgCi0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGb3JtTGluaygpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFjdGlvbkxpbmsoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Ub29sTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1Rvb2xNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTI0ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1Rvb2xNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUb29sTWFuYWdlcgotewotICBwcml2YXRlIFZlY3RvciB0b29sc187Ci0gIHByaXZhdGUgaW50IHNlbGVjdGVkVG9vbElkXzsKLSAgcHJpdmF0ZSBOb2RlIG5vZGVfOwotCi0gIHB1YmxpYyBUb29sTWFuYWdlcihOb2RlIG5vZGUpCi0gIHsKLSAgICB0b29sc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgc2VsZWN0ZWRUb29sSWRfID0gMDsKLSAgICBub2RlXyA9IG5vZGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFNlbGVjdGVkVG9vbElkKCkKLSAgewotICAgIHJldHVybiBzZWxlY3RlZFRvb2xJZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IHNldFNlbGVjdGVkVG9vbElkKGludCB0b29sSWQpCi0gIHsKLSAgICBpZiAodG9vbElkID49IDAgJiYgdG9vbElkIDwgdG9vbHNfLnNpemUoKSkKLSAgICAgIHNlbGVjdGVkVG9vbElkXyA9IHRvb2xJZDsKLSAgICByZXR1cm4gc2VsZWN0ZWRUb29sSWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBhZGRUb29sKFRvb2wgdG9vbCkKLSAgewotICAgIHRvb2xzXy5hZGRFbGVtZW50KHRvb2wpOwotICAgIHJldHVybiB0b29sc18uc2l6ZSgpLTE7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVG9vbCBnZXRUb29sKGludCB0b29sSWQpCi0gIHsKLSAgICBpZiAodG9vbElkID49MCAmJiB0b29sSWQgPCBnZXROdW1iZXJPZlRvb2xzKCkpCi0gICAgICByZXR1cm4gKFRvb2wpdG9vbHNfLmVsZW1lbnRBdCh0b29sSWQpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgTGlzdCBnZXRUb29scygpCi0gIHsKLSAgICByZXR1cm4gdG9vbHNfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFRvb2wgZ2V0U2VsZWN0ZWRUb29sKCkKLSAgewotICAgIGlmIChzZWxlY3RlZFRvb2xJZF8gPj0wICYmIHNlbGVjdGVkVG9vbElkXyA8IGdldE51bWJlck9mVG9vbHMoKSkKLSAgICAgIHJldHVybiAoVG9vbCl0b29sc18uZWxlbWVudEF0KHNlbGVjdGVkVG9vbElkXyk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldE51bWJlck9mVG9vbHMoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xzXy5zaXplKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBub2RlXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1ZpZXdUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvVmlld1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5MDEzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvVmlld1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuVG9vbFR5cGVzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbAotewotICBwcml2YXRlIEhhc2h0YWJsZSB2aWV3VG9vbE1hbmFnZXJzXzsKLQotICBwdWJsaWMgVmlld1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGVuYWJsZWRJbWFnZUxpbmssU3RyaW5nIGhpZ2hsaWdodGVkSW1hZ2VMaW5rLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixlbmFibGVkSW1hZ2VMaW5rLGhpZ2hsaWdodGVkSW1hZ2VMaW5rLGFsdCk7Ci0gICAgdG9vbFR5cGVfID0gVG9vbFR5cGVzLlZJRVc7Ci0gICAgdmlld1Rvb2xNYW5hZ2Vyc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRTZXREZWZhdWx0Vmlld1Rvb2woVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLGludCBpbmRleCk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFRvb2xzKFRvb2xNYW5hZ2VyIHZpZXdUb29sTWFuYWdlcixpbnQgaW5kZXgpOwotCi0gIHB1YmxpYyBmaW5hbCBUb29sTWFuYWdlciBjcmVhdGVUb29sTWFuYWdlcihpbnQgdmlld0lkKQotICB7Ci0gICAgVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyID0gbmV3IFRvb2xNYW5hZ2VyKHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkpOwotICAgIGFkZFRvb2xzKHZpZXdUb29sTWFuYWdlcix2aWV3SWQpOwotICAgIGFkZFNldERlZmF1bHRWaWV3VG9vbCh2aWV3VG9vbE1hbmFnZXIsdmlld0lkKTsKLSAgICB2aWV3VG9vbE1hbmFnZXJzXy5wdXQoU3RyaW5nLnZhbHVlT2Yodmlld0lkKSx2aWV3VG9vbE1hbmFnZXIpOwotICAgIHJldHVybiB2aWV3VG9vbE1hbmFnZXI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVG9vbE1hbmFnZXIgZ2V0VG9vbE1hbmFnZXIoaW50IHZpZXdJZCkKLSAgewotICAgIHJldHVybiAoVG9vbE1hbmFnZXIpKHZpZXdUb29sTWFuYWdlcnNfLmdldChTdHJpbmcudmFsdWVPZih2aWV3SWQpKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhclZpZXdUb29sTWFuYWdlcihpbnQgdmlld0lkKQotICB7Ci0gICAgdmlld1Rvb2xNYW5hZ2Vyc18ucmVtb3ZlKFN0cmluZy52YWx1ZU9mKHZpZXdJZCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXJWaWV3VG9vbE1hbmFnZXJzKCkKLSAgewotICAgIHZpZXdUb29sTWFuYWdlcnNfLmNsZWFyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9BZGRJdGVtc1RvRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjBmYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9BZGRJdGVtc1RvRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbiBleHRlbmRzIFVERElQcm9wZXJ0aWVzRm9ybUFjdGlvbgotewotICBwdWJsaWMgQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHNlbGVjdGVkTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgLy8gVGhlIGNsaWVudCBKYXZhc2NyaXB0IGVuZm9yY2VzIHRoZSBydWxlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSB0aGUgZm9ybSBjYW4gYmUgc3VibWl0dGVkLgotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlNFTEVDVEVEX05PREVJRFMsc2VsZWN0ZWROb2RlSWRzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFN0cmluZ1tdIHNlbGVjdGVkTm9kZUlkcyA9IChTdHJpbmdbXSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5TRUxFQ1RFRF9OT0RFSURTKTsKLSAgICBBZGRUb0Zhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBuZXcgQWRkVG9GYXZvcml0ZXNBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBmb3IgKGludCBpPTA7aTxzZWxlY3RlZE5vZGVJZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELHNlbGVjdGVkTm9kZUlkc1tpXSk7Ci0gICAgICBpZiAoYWN0aW9uLmZhdm9yaXRlRXhpc3RzKCkpIHsKLSAgICAgICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgICAgICBOb2RlIG5vZGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChzZWxlY3RlZE5vZGVJZHNbaV0pKTsKLSAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZBVk9SSVRFX0FMUkVBRFlfRVhJU1RTIixub2RlTmFtZSkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0FkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFkNmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5CdXNpbmVzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5NdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5hc3NlcnRpb24uUHVibGlzaGVyQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuRGlzcG9zaXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5SZXN1bHQ7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEFkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gZXh0ZW5kcyBDb21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIGlmIChyZWdpc3RyeU5vZGVfID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLQotICAgIC8vIGlkcyBmcm9tIHVkZGlPYmplY3RzX3RhYmxlLmpzcAotICAgIFN0cmluZ1tdIHNlbGVjdGVkQnVzSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCk7Ci0gICAgaWYgKHNlbGVjdGVkQnVzSWRzID09IG51bGwgfHwgc2VsZWN0ZWRCdXNJZHMubGVuZ3RoID09IDApIHsKLSAgICAgIC8vIFN5bmNocm9uaXplIGNsaWVudCB2aWV3IGFuZCBzZXJ2ZXIgbW9kZWwgKHVkZGlPYmplY3RfdGFibGUuanNwKQotICAgICAgc3luY2hyb25pemVVRERJT2JqZWN0VGFibGUoKTsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lELCBzZWxlY3RlZEJ1c0lkcyk7Ci0gICAgICAvLyBTeW5jaHJvbml6ZSBjbGllbnQgdmlldyBhbmQgc2VydmVyIG1vZGVsICh1ZGRpT2JqZWN0X3RhYmxlLmpzcCkKLSAgICAgIHN5bmNocm9uaXplVURESU9iamVjdFRhYmxlKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nW10gYXNzZXJ0aW9uVHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfVFlQRSk7Ci0gICAgaWYgKGFzc2VydGlvblR5cGVzICE9IG51bGwgJiYgYXNzZXJ0aW9uVHlwZXMubGVuZ3RoID4gMCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1RZUEUsIGFzc2VydGlvblR5cGVzKTsKLSAgICBlbHNlCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotCi0gICAgU3RyaW5nW10gZGlyZWN0aW9ucyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19ESVJFQ1RJT04pOwotICAgIGlmIChkaXJlY3Rpb25zICE9IG51bGwgJiYgZGlyZWN0aW9ucy5sZW5ndGggPiAwKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfRElSRUNUSU9OLCBkaXJlY3Rpb25zKTsKLSAgICBlbHNlCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotCi0gICAgLy8gaWYgbm90IHlldCBsb2dnZWQgaW4sIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCB0byBsb2cgaW4KLSAgICBpZiAoIWlzTG9nZ2VkSW5fKSB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcklEID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotCi0gICAgICBpZiAocHVibGlzaFVSTCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICAgIH0KLSAgCi0gICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhwdWJsaXNoVVJMKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfUFVCTElTSF9VUkwiKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh1c2VySUQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJRCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJRCk7Ci0gICAgICB9Ci0gIAotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcodXNlcklEKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VTRVJJRCIpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGlmIChyZWdpc3RyeU5vZGVfID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnaXN0cnlFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgLy8gaWYgbm90IHlldCBsb2dnZWQgaW4sIGxvZyBpbiBmaXJzdAotICAgIGlmICghaXNMb2dnZWRJbl8pIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcklEID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHJlZ2lzdHJ5RWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCwgdXNlcklELCBwYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIHRlKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHRlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIHVkZGllKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpZS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShtZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgVURESVByb3h5IHByb3h5ID0gcmVnaXN0cnlFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgcmVnaXN0cnlFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIHJlZ2lzdHJ5RWxlbWVudC5nZXRDcmVkKCk7Ci0gICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLQotICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBvd25lZCBidXNpbmVzcwotICAgIC8vIGlmIG5vdCwgdGhlIEFkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gY2Fubm90IGJlIHBlcmZvcm1lZAotICAgIGlmICghaXNCdXNpbmVzc093bmVkKGJ1c0VsZW1lbnQpKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9UX09XTkVEX0JVU0lORVNTIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFN0cmluZ1tdIGFzc2VydGlvblR5cGVzID0gKFN0cmluZ1tdKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1RZUEUpOwotICAgICAgU3RyaW5nW10gZGlyZWN0aW9ucyA9IChTdHJpbmdbXSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19ESVJFQ1RJT04pOwotICAgICAgU3RyaW5nIHRoaXNCdXNpbmVzc0tleSA9IGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKS5nZXRCdXNpbmVzc0tleSgpOwotCi0gICAgICAvLyBnZXQgYWxsIHNlbGVjdGVkIGJ1c2luZXNzZXMKLSAgICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleSk7Ci0gICAgICBWZWN0b3Igc2VsZWN0ZWRCdXNpbmVzc2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TKTsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBzZWxlY3RlZEJ1c2luZXNzZXMuZWxlbWVudHMoKTsKLSAgICAgIGlmICghZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8vIGNyZWF0ZSBhIHZlY3RvciBvZiBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBiYXNlZCBvbiBhbGwgdGhlIHNlbGVjdGVkIGJ1c2luZXNzZXMKLSAgICAgIFZlY3RvciBwdWJBc3NlcnRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBMaXN0RWxlbWVudCBsZSA9IChMaXN0RWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIEJ1c2luZXNzRW50aXR5IHNwID0gKEJ1c2luZXNzRW50aXR5KWxlLmdldE9iamVjdCgpOwotICAgICAgICBLZXllZFJlZmVyZW5jZSBrZXllZFJlZiA9IG5ldyBLZXllZFJlZmVyZW5jZShhc3NlcnRpb25UeXBlc1tpXSwgYXNzZXJ0aW9uVHlwZXNbaV0sIFRNb2RlbC5SRUxBVElPTlNISVBTX1RNT0RFTF9LRVkpOwotICAgICAgICBpZiAoSW50ZWdlci5wYXJzZUludChkaXJlY3Rpb25zW2ldKSA9PSBVRERJQWN0aW9uSW5wdXRzLkRJUkVDVElPTl9UTykKLSAgICAgICAgICBwdWJBc3NlcnRpb25WZWN0b3IuYWRkKG5ldyBQdWJsaXNoZXJBc3NlcnRpb24oc3AuZ2V0QnVzaW5lc3NLZXkoKSwgdGhpc0J1c2luZXNzS2V5LCBrZXllZFJlZikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcHViQXNzZXJ0aW9uVmVjdG9yLmFkZChuZXcgUHVibGlzaGVyQXNzZXJ0aW9uKHRoaXNCdXNpbmVzc0tleSwgc3AuZ2V0QnVzaW5lc3NLZXkoKSwga2V5ZWRSZWYpKTsKLSAgICAgICAgaSsrOwotICAgICAgfQotCi0gICAgICAvLyBwcm94eS5hZGRfcHVibGlzaGVyQXNzZXJ0aW9ucyguLi4pCi0gICAgICBEaXNwb3NpdGlvblJlcG9ydCByZXBvcnQgPSBwcm94eS5hZGRfcHVibGlzaGVyQXNzZXJ0aW9ucyhyZWdpc3RyeUVsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgcHViQXNzZXJ0aW9uVmVjdG9yKTsKLQotICAgICAgLy8gcmVmcmVzaCBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBpZmYgcHJveHkgcmVwb3J0cyBzdWNjZXNzCi0gICAgICBpZiAocmVwb3J0LnN1Y2Nlc3MoKSkgewotICAgICAgICBzZWxlY3RlZEJ1c2luZXNzZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgICAgU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gc2hvd1BBQWN0aW9uID0gbmV3IFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBzaG93UEFBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICAgICBPYmplY3QgaWRzID0gcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lEKTsKLSAgICAgICAgaWYgKGlkcyAhPSBudWxsKQotICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lELCBpZHMpOwotICAgICAgICBzaG93UEFBY3Rpb24ucnVuKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiByZXBvcnQuc3VjY2VzcygpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiB1ZGRpZSkgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgRGlzcG9zaXRpb25SZXBvcnQgcmVwb3J0ID0gdWRkaWUuZ2V0RGlzcG9zaXRpb25SZXBvcnQoKTsKLQkgIFZlY3RvciByZXBvcnRFcnJJbmZvID0gcmVwb3J0LmdldFJlc3VsdFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvcnRFcnJJbmZvLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCgoUmVzdWx0KSByZXBvcnRFcnJJbmZvLmdldChpKSkuZ2V0RXJySW5mbygpLmdldFRleHQoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQWRkVG9GYXZvcml0ZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQWRkVG9GYXZvcml0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkOGIwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0FkZFRvRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5CdXNpbmVzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkNhdGVnb3J5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlNlcnZpY2VJbnRlcmZhY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLkJ1c2luZXNzTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5SZWdpc3RyeU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU2VydmljZUludGVyZmFjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU2VydmljZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgQWRkVG9GYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBVRERJTm9kZUFjdGlvbgotewotICBwdWJsaWMgQWRkVG9GYXZvcml0ZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9DaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVnaXN0cnlFeGlzdHMoU3RyaW5nIHJlZ2lzdHJ5TmFtZSxOb2RlIHJlZ2lzdHJ5Tm9kZSkKLSAgewotICAgIHJlZ2lzdHJ5Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1JFR0lTVFJZX05BTUUscmVnaXN0cnlOYW1lKTsKLSAgICByZXR1cm4gZmF2b3JpdGVFeGlzdHModGFibGUsRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfRk9MREVSX05PREUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gYnVzaW5lc3NFeGlzdHMoU3RyaW5nIGJ1c2luZXNzTmFtZSxOb2RlIGJ1c2luZXNzTm9kZSkKLSAgewotICAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClidXNpbmVzc05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgYnVzaW5lc3NLZXkgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IHJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX05BTUUsYnVzaW5lc3NOYW1lKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX0lOUVVJUllfQVBJLGlucXVpcnlVUkwpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfQlVTSU5FU1NfS0VZLCBidXNpbmVzc0tleSk7Ci0gICAgcmV0dXJuIGZhdm9yaXRlRXhpc3RzKHRhYmxlLEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzZXJ2aWNlRXhpc3RzKFN0cmluZyBzZXJ2aWNlTmFtZSxOb2RlIHNlcnZpY2VOb2RlKQotICB7Ci0gICAgU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoU2VydmljZUVsZW1lbnQpc2VydmljZU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgc2VydmljZUtleSA9IHNlcnZpY2VFbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpLmdldFNlcnZpY2VLZXkoKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IHJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfTkFNRSxzZXJ2aWNlTmFtZSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOUVVJUllfQVBJLGlucXVpcnlVUkwpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9LRVksc2VydmljZUtleSk7Ci0gICAgcmV0dXJuIGZhdm9yaXRlRXhpc3RzKHRhYmxlLEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfRk9MREVSX05PREUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gc2VydmljZUludGVyZmFjZUV4aXN0cyhTdHJpbmcgc2lOYW1lLE5vZGUgc2lOb2RlKQotICB7Ci0gICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KXNpTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFN0cmluZyB0TW9kZWxLZXkgPSBzaUVsZW1lbnQuZ2V0VE1vZGVsKCkuZ2V0VE1vZGVsS2V5KCk7Ci0gICAgU3RyaW5nIGlucXVpcnlVUkwgPSByZWdFbGVtZW50LmdldElucXVpcnlVUkwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLHNpTmFtZSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9JTlFVSVJZX0FQSSxpbnF1aXJ5VVJMKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSx0TW9kZWxLZXkpOwotICAgIHJldHVybiBmYXZvcml0ZUV4aXN0cyh0YWJsZSxGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9GT0xERVJfTk9ERSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhZGRSZWdpc3RyeVRvRmF2b3JpdGVzKFN0cmluZyByZWdpc3RyeU5hbWUsTm9kZSByZWdpc3RyeU5vZGUpCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIGlucXVpcnlVUkwgPSByZWdFbGVtZW50LmdldElucXVpcnlVUkwoKTsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfUkVHSVNUUllfUFVCTElTSF9BUEkscHVibGlzaFVSTCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9JTlFVSVJZX0FQSSxpbnF1aXJ5VVJMKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1JFR0lTVFJZX05BTUUscmVnaXN0cnlOYW1lKTsKLSAgICBFbnVtZXJhdGlvbiB1c2VyRGVmaW5lZENhdGVnb3JpZXNFbnVtID0gcmVnRWxlbWVudC5nZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoKTsKLSAgICBpZiAodXNlckRlZmluZWRDYXRlZ29yaWVzRW51bSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfUkVHSVNUUllfQ0FURUdPUklFU19FTlVNLHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0VudW0pOwotICAgICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfUExVR0lOX01FVEFEQVRBX0RJUkVDVE9SWSxjb250cm9sbGVyXy5nZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFkZFRvRmF2b3JpdGVzKHRhYmxlLEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGFkZEJ1c2luZXNzVG9GYXZvcml0ZXMoU3RyaW5nIGJ1c2luZXNzTmFtZSxOb2RlIGJ1c2luZXNzTm9kZSkKLSAgewotICAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClidXNpbmVzc05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgYnVzaW5lc3NLZXkgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IHJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX05BTUUsYnVzaW5lc3NOYW1lKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX0lOUVVJUllfQVBJLGlucXVpcnlVUkwpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfQlVTSU5FU1NfS0VZLCBidXNpbmVzc0tleSk7Ci0gICAgcmV0dXJuIGFkZFRvRmF2b3JpdGVzKHRhYmxlLEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX0ZPTERFUl9OT0RFKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gYWRkU2VydmljZVRvRmF2b3JpdGVzKFN0cmluZyBzZXJ2aWNlTmFtZSxOb2RlIHNlcnZpY2VOb2RlKQotICB7Ci0gICAgU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoU2VydmljZUVsZW1lbnQpc2VydmljZU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgc2VydmljZUtleSA9IHNlcnZpY2VFbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpLmdldFNlcnZpY2VLZXkoKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IHJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfTkFNRSxzZXJ2aWNlTmFtZSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOUVVJUllfQVBJLGlucXVpcnlVUkwpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9LRVksc2VydmljZUtleSk7Ci0gICAgcmV0dXJuIGFkZFRvRmF2b3JpdGVzKHRhYmxlLEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfRk9MREVSX05PREUpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhZGRTZXJ2aWNlSW50ZXJmYWNlVG9GYXZvcml0ZXMoU3RyaW5nIHNpTmFtZSxOb2RlIHNpTm9kZSkKLSAgewotICAgIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNpRWxlbWVudCA9IChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudClzaU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgdE1vZGVsS2V5ID0gc2lFbGVtZW50LmdldFRNb2RlbCgpLmdldFRNb2RlbEtleSgpOwotICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gcmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSxzaU5hbWUpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfSU5RVUlSWV9BUEksaW5xdWlyeVVSTCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9LRVksdE1vZGVsS2V5KTsKLSAgICByZXR1cm4gYWRkVG9GYXZvcml0ZXModGFibGUsRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfRk9MREVSX05PREUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoKQotICB7Ci0gICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIE5vZGUgbm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJZCk7Ci0gICAgU3RyaW5nIG5vZGVOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgUmVnaXN0cnlOb2RlKQotICAgICAgcmV0dXJuIHJlZ2lzdHJ5RXhpc3RzKG5vZGVOYW1lLG5vZGUpOwotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBCdXNpbmVzc05vZGUpCi0gICAgICByZXR1cm4gYnVzaW5lc3NFeGlzdHMobm9kZU5hbWUsbm9kZSk7Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VOb2RlKQotICAgICAgcmV0dXJuIHNlcnZpY2VFeGlzdHMobm9kZU5hbWUsbm9kZSk7Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VOb2RlKQotICAgICAgcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2VFeGlzdHMobm9kZU5hbWUsbm9kZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpOwotICAgIFN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBib29sZWFuIGFkZFRvRmF2b3JpdGVzUmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWdpc3RyeU5vZGUpCi0gICAgewotICAgICAgYWRkVG9GYXZvcml0ZXNSZXN1bHQgPSBhZGRSZWdpc3RyeVRvRmF2b3JpdGVzKG5vZGVOYW1lLG5vZGUpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KW5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSByZWdFbGVtZW50LmdldFVzZXJEZWZpbmVkQ2F0ZWdvcmllcygpOwotICAgICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBDYXRlZ29yeU1vZGVsIGNhdGVnb3J5TW9kZWwgPSAoQ2F0ZWdvcnlNb2RlbCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgVGhyb3dhYmxlIGVycm9yRXhjZXB0aW9uID0gY2F0ZWdvcnlNb2RlbC5nZXRFcnJvckV4Y2VwdGlvbigpOwotICAgICAgICAgIGlmIChlcnJvckV4Y2VwdGlvbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7Y2F0ZWdvcnlNb2RlbC5nZXREaXNwbGF5TmFtZSgpLGVycm9yRXhjZXB0aW9uLmdldE1lc3NhZ2UoKX07Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBVklOR19DQVRFR09SWV9EQVRBIixhcmdzKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBCdXNpbmVzc05vZGUpCi0gICAgICBhZGRUb0Zhdm9yaXRlc1Jlc3VsdCA9IGFkZEJ1c2luZXNzVG9GYXZvcml0ZXMobm9kZU5hbWUsbm9kZSk7Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VOb2RlKQotICAgICAgYWRkVG9GYXZvcml0ZXNSZXN1bHQgPSBhZGRTZXJ2aWNlVG9GYXZvcml0ZXMobm9kZU5hbWUsbm9kZSk7Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VOb2RlKQotICAgICAgYWRkVG9GYXZvcml0ZXNSZXN1bHQgPSBhZGRTZXJ2aWNlSW50ZXJmYWNlVG9GYXZvcml0ZXMobm9kZU5hbWUsbm9kZSk7Ci0gICAgaWYgKGFkZFRvRmF2b3JpdGVzUmVzdWx0KQotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0ZBVk9SSVRFX0FEREVEIixub2RlTmFtZSkpOwotICAgIGVsc2UKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRkFWT1JJVEVfTk9UX0FEREVEIixub2RlTmFtZSkpOwotICAgIHJldHVybiBhZGRUb0Zhdm9yaXRlc1Jlc3VsdDsgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9GYXZvcml0ZXMoSGFzaHRhYmxlIHRhYmxlLCBTdHJpbmcgcmVsKQotICB7Ci0gICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIGZhdk5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBUcmVlRWxlbWVudCBmYXZSb290RWxlbWVudCA9IGZhdk5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZmF2Um9vdEVsZW1lbnQuZ2V0RWxlbWVudHMocmVsKTsKLSAgICBpZiAoIWUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBmYXZGb2xkZXJFbGVtZW50ID0gKEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgIHJldHVybiBmYXZGb2xkZXJFbGVtZW50LmFkZEZhdm9yaXRlKHRhYmxlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGZhdm9yaXRlRXhpc3RzKEhhc2h0YWJsZSB0YWJsZSwgU3RyaW5nIHJlbCkKLSAgewotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBmYXZOb2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgVHJlZUVsZW1lbnQgZmF2Um9vdEVsZW1lbnQgPSBmYXZOb2RlTWFuYWdlci5nZXRSb290Tm9kZSgpLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IGZhdlJvb3RFbGVtZW50LmdldEVsZW1lbnRzKHJlbCk7Ci0gICAgaWYgKCFlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgZmF2Rm9sZGVyRWxlbWVudCA9IChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICByZXR1cm4gZmF2Rm9sZGVyRWxlbWVudC5mYXZvcml0ZUV4aXN0cyh0YWJsZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9CdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOGRjNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9CdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQnVzaW5lc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci0KLXB1YmxpYyBjbGFzcyBCdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uIGV4dGVuZHMgUHVibGlzaEFjdGlvbgotewotICBwcml2YXRlIFJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24gcmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbl87Ci0gIHB1YmxpYyBCdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25fID0gbmV3IFJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8gPSByZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uXy5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBOb2RlIGJ1c2luZXNzTm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIEJ1c2luZXNzRWxlbWVudCBidXNpbmVzc0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KWJ1c2luZXNzTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEJ1c2luZXNzRW50aXR5IGJ1c2luZXNzRW50aXR5ID0gYnVzaW5lc3NFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCk7Ci0gICAgTGlzdEVsZW1lbnQgYnVzTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQoYnVzaW5lc3NFbnRpdHkpOwotICAgIFZlY3RvciBzZXJ2aWNlQnVzaW5lc3NDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkuYWRkRWxlbWVudChidXNMaXN0RWxlbWVudCk7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSxzZXJ2aWNlQnVzaW5lc3NDb3B5KTsKLSAgICBib29sZWFuIHJlc3VsdCA9IHJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25fLnByb2Nlc3NPdGhlcnMocGFyc2VyLGZvcm1Ub29sUEkpOwotICAgIGlmICghcHJvcGVydHlUYWJsZV8uY29udGFpbnNLZXkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIpKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSLGJ1c2luZXNzRW50aXR5KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiByZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uXy5ydW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9CdXNQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9CdXNQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWMzNjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5CdXNpbmVzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLQotcHVibGljIGNsYXNzIEJ1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uIGV4dGVuZHMgUHVibGlzaEFjdGlvbgotewotICBwcml2YXRlIFJlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uIHJlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uXzsKLQotICBwdWJsaWMgQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25fID0gbmV3IFJlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfID0gcmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25fLmdldFByb3BlcnR5VGFibGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIE5vZGUgYnVzaW5lc3NOb2RlID0gZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCk7Ci0gICAgQnVzaW5lc3NFbGVtZW50IGJ1c2luZXNzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpYnVzaW5lc3NOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgQnVzaW5lc3NFbnRpdHkgYnVzaW5lc3NFbnRpdHkgPSBidXNpbmVzc0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKTsKLSAgICBMaXN0RWxlbWVudCBidXNMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudChidXNpbmVzc0VudGl0eSk7Ci0gICAgVmVjdG9yIHNlcnZpY2VCdXNpbmVzc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc2VydmljZUJ1c2luZXNzQ29weS5hZGRFbGVtZW50KGJ1c0xpc3RFbGVtZW50KTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSxzZXJ2aWNlQnVzaW5lc3NDb3B5KTsgCi0gICAgYm9vbGVhbiByZXN1bHQgPSByZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbl8ucHJvY2Vzc090aGVycyhwYXJzZXIsZm9ybVRvb2xQSSk7Ci0gICAgaWYgKCFwcm9wZXJ0eVRhYmxlXy5jb250YWluc0tleShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIpKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUixidXNpbmVzc0VudGl0eSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gcmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25fLnJ1bigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0J1c2luZXNzR2V0U2VydmljZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQnVzaW5lc3NHZXRTZXJ2aWNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTVlZTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQnVzaW5lc3NHZXRTZXJ2aWNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQnVzaW5lc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLkJ1c2luZXNzTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLQotcHVibGljIGNsYXNzIEJ1c2luZXNzR2V0U2VydmljZXNBY3Rpb24gZXh0ZW5kcyBVRERJTm9kZUFjdGlvbgotewotICBwcml2YXRlIEJ1c2luZXNzTm9kZSBidXNOb2RlXzsKLSAgcHVibGljIEJ1c2luZXNzR2V0U2VydmljZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgYnVzTm9kZV8gPSBudWxsOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL0J1c2luZXNzR2V0U2VydmljZXNBY3Rpb25KU1AuanNwP25vZGVJZD0uLi4KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvQnVzaW5lc3NHZXRTZXJ2aWNlc0FjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHZhbGlkYXRlQnVzaW5lc3MoKQotICB7Ci0gICAgaW50IGJ1c05vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIGJ1c05vZGVfID0gKEJ1c2luZXNzTm9kZSlub2RlTWFuYWdlcl8uZ2V0Tm9kZShidXNOb2RlSWQpOwotICAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClidXNOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24gdmVyaWZ5QWN0aW9uID0gbmV3IFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gdmVyaWZ5QWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFLEJvb2xlYW4uVFJVRSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSxidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB2ZXJpZnlBY3Rpb24ucnVuKCk7Ci0gICAgaWYgKHJlc3VsdCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QscHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBCdXNpbmVzc0VudGl0eSBzcCA9IChCdXNpbmVzc0VudGl0eSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKTsKLQotICAgIFJlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTk9ERV9OQU1FX0JVU0lORVNTX1NFUlZJQ0VTIixidXNOb2RlXy5nZXROb2RlTmFtZSgpKSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIsc3ApOyAgICAKLSAgICAKLSAgICBMaXN0RWxlbWVudCBidXNpbmVzc0xpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHNwKTsKLSAgICBidXNpbmVzc0xpc3RFbGVtZW50LnNldFRhcmdldFZpZXdUb29sSW5mbyhidXNOb2RlXy5nZXROb2RlSWQoKSxidXNOb2RlXy5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksYnVzTm9kZV8uZ2V0Vmlld0lkKCkpOwotICAgIFZlY3RvciBidXNpbmVzc0xpc3RWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgYnVzaW5lc3NMaXN0VmVjdG9yLmFkZEVsZW1lbnQoYnVzaW5lc3NMaXN0RWxlbWVudCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTLGJ1c2luZXNzTGlzdFZlY3Rvcik7Ci0gICAgCi0gICAgCi0gICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvckZvbGRlck5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JGb2xkZXJOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODA2MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvckZvbGRlck5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ2xlYXJOYXZpZ2F0b3JGb2xkZXJOb2RlQWN0aW9uIGV4dGVuZHMgQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uCi17Ci0gIHB1YmxpYyBDbGVhck5hdmlnYXRvckZvbGRlck5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JGb2xkZXJOb2RlQWN0aW9uLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yRm9sZGVyTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaWYgKCFpc1N0YWxlTm9kZShub2RlSWQpKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJZCk7Ci0gICAgICBUcmVlRWxlbWVudCBlbGVtZW50ID0gbm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgZWxlbWVudC5kaXNjb25uZWN0UmVsKGVsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhNb2RlbENvbnN0YW50cy5SRUxfQ0hJTERSRU4pKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliZGY0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5DbGVhck5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhck5hdmlnYXRvck5vZGVBY3Rpb24gZXh0ZW5kcyBDbGVhck5vZGVBY3Rpb24KLXsKLSAgcHVibGljIENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxTdHJpbmcudmFsdWVPZihjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGVJZCgpKSk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJuYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiAicHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiAic3RhdHVzQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9zdGF0dXNfY29udGVudC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE3YjIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbiBleHRlbmRzIFVERElQcm9wZXJ0aWVzRm9ybUFjdGlvbgotewotICBwdWJsaWMgQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHNlbGVjdGVkTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZUlkcyAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyxzZWxlY3RlZE5vZGVJZHMpOwotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmdbXSBzZWxlY3RlZE5vZGVJZHMgPSAoU3RyaW5nW10pcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZUlkcyAhPSBudWxsKQotICAgIHsKLSAgICAgIENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHNlbGVjdGVkTm9kZUlkcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELHNlbGVjdGVkTm9kZUlkc1tpXSk7Ci0gICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ29tbW9uUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Db21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjAxMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Db21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkJ1c2luZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLk11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlJlZ2lzdHJ5Tm9kZTsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5SZWdpc3RlcmVkSW5mbzsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1vblB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLQotICBwcm90ZWN0ZWQgUmVnaXN0cnlOb2RlIHJlZ2lzdHJ5Tm9kZV87Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzTG9nZ2VkSW5fOwotCi0gIHB1YmxpYyBDb21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotCi0gICAgcmVnaXN0cnlOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgpOwotICAgIGlmIChyZWdpc3RyeU5vZGVfICE9IG51bGwpCi0gICAgICBpc0xvZ2dlZEluXyA9ICgoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZV8uZ2V0VHJlZUVsZW1lbnQoKSkuaXNMb2dnZWRJbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVVRERJT2JqZWN0VGFibGUoKSB7Ci0gICAgU3RyaW5nW10gc2VsZWN0ZWRCdXNJZHMgPSAoU3RyaW5nW10pcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lEKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleSk7Ci0gICAgVmVjdG9yIGJ1c2luZXNzVmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TKTsKLSAgICBMaXN0TWFuYWdlciBidXNpbmVzc0NvcHkgPSAoTGlzdE1hbmFnZXIpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OU19DT1BZKTsKLSAgICBpZiAoc2VsZWN0ZWRCdXNJZHMgPT0gbnVsbCB8fCBzZWxlY3RlZEJ1c0lkcy5sZW5ndGggPD0gMCkgewotICAgICAgYnVzaW5lc3NWZWN0b3IucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgIGJ1c2luZXNzQ29weS5jbGVhcigpOwotICAgIH0KLSAgICBFbnVtZXJhdGlvbiBlID0gYnVzaW5lc3NDb3B5LmdldExpc3RFbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBib29sZWFuIGlzSWRGb3VuZCA9IGZhbHNlOwotICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoTGlzdEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaW50IGxpc3RFbGVtZW50Vmlld0lkID0gbGUuZ2V0Vmlld0lkKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkQnVzSWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChsaXN0RWxlbWVudFZpZXdJZCA9PSBJbnRlZ2VyLnBhcnNlSW50KHNlbGVjdGVkQnVzSWRzW2ldKSkgewotICAgICAgICAgIGlzSWRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghaXNJZEZvdW5kKQotICAgICAgICBidXNpbmVzc1ZlY3Rvci5yZW1vdmUobGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQnVzaW5lc3NPd25lZChCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCkgewotICAgIGJvb2xlYW4gaXNCdXNpbmVzc093bmVkID0gZmFsc2U7Ci0gICAgU3RyaW5nIGlzQnVzaW5lc3NPd25lZFN0cmluZyA9IGJ1c0VsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhVRERJTW9kZWxDb25zdGFudHMuSVNfQlVTSU5FU1NfT1dORUQpOwotICAgIGlmIChpc0J1c2luZXNzT3duZWRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgaXNCdXNpbmVzc093bmVkID0gQm9vbGVhbi52YWx1ZU9mKGlzQnVzaW5lc3NPd25lZFN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlzTG9nZ2VkSW5fKSB7Ci0gICAgICB0cnkgewotICAgICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICAgIFJlZ2lzdGVyZWRJbmZvIHJpID0gcHJveHkuZ2V0X3JlZ2lzdGVyZWRJbmZvKHJlZ0VsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSk7Ci0gICAgICAgIFZlY3RvciBiZVZlY3RvciA9IHJpLmdldEJ1c2luZXNzSW5mb3MoKS5nZXRCdXNpbmVzc0luZm9WZWN0b3IoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGJlVmVjdG9yLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsgCi0gICAgICAgICAgQnVzaW5lc3NJbmZvIGJpID0gKEJ1c2luZXNzSW5mbylpdC5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGJpLmdldEJ1c2luZXNzS2V5KCkuZXF1YWxzKGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKS5nZXRCdXNpbmVzc0tleSgpKSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIGlzQnVzaW5lc3NPd25lZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnVzRWxlbWVudC5zZXRQcm9wZXJ0eUFzU3RyaW5nKFVERElNb2RlbENvbnN0YW50cy5JU19CVVNJTkVTU19PV05FRCwgU3RyaW5nLnZhbHVlT2YoaXNCdXNpbmVzc093bmVkKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgfQotICAgIHJldHVybiBpc0J1c2luZXNzT3duZWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ29tcGxldGVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0NvbXBsZXRlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTAwODUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ29tcGxldGVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQnVzaW5lc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5QdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQ29tcGxldGlvblN0YXR1czsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLkRpc3Bvc2l0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuUmVzdWx0OwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIENvbXBsZXRlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbiBleHRlbmRzIENvbW1vblB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24KLXsKLSAgcHVibGljIENvbXBsZXRlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAocmVnaXN0cnlOb2RlXyA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0KLSAgICAvLyBpZHMgZnJvbSB1ZGRpT2JqZWN0c190YWJsZQotICAgIFN0cmluZ1tdIHNlbGVjdGVkQnVzSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCk7Ci0gICAgaWYgKHNlbGVjdGVkQnVzSWRzICE9IG51bGwgJiYgc2VsZWN0ZWRCdXNJZHMubGVuZ3RoID4gMCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCwgc2VsZWN0ZWRCdXNJZHMpOwotICAgIC8vIFN5bmNocm9uaXplIGNsaWVudCB2aWV3IGFuZCBzZXJ2ZXIgbW9kZWwgKHVkZGlPYmplY3RfdGFibGUuanNwKQotICAgIHN5bmNocm9uaXplVURESU9iamVjdFRhYmxlKCk7Ci0KLSAgICAvLyBpZiBub3QgeWV0IGxvZ2dlZCBpbiwgdmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGxvZyBpbgotICAgIGlmICghaXNMb2dnZWRJbl8pIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySUQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0KLSAgICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgfQotICAKLSAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHB1Ymxpc2hVUkwpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTCIpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHVzZXJJRCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklEKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklEKTsKLSAgICAgIH0KLSAgCi0gICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh1c2VySUQpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEIikpOwotICAgICAgfQotCi0gICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBpZHMgZnJvbSBwdWJsaXNoZXIgYXNzZXJ0aW9uIHRhYmxlCi0gICAgU3RyaW5nW10gcHViQXNzZXJ0aW9uc1ZpZXdJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfVklFV0lEKTsKLSAgICBpZiAocHViQXNzZXJ0aW9uc1ZpZXdJZHMgPT0gbnVsbCB8fCBwdWJBc3NlcnRpb25zVmlld0lkcy5sZW5ndGggPT0gMCkKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgZWxzZQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfVklFV0lELCBwdWJBc3NlcnRpb25zVmlld0lkcyk7Ci0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgaWYgKHJlZ2lzdHJ5Tm9kZV8gPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdpc3RyeUVsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICAvLyBpZiBub3QgeWV0IGxvZ2dlZCBpbiwgbG9nIGluIGZpcnN0Ci0gICAgaWYgKCFpc0xvZ2dlZEluXykgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySUQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgcmVnaXN0cnlFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLCB1c2VySUQsIHBhc3N3b3JkKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gdGUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGllLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKG1lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0KLSAgICBVRERJUHJveHkgcHJveHkgPSByZWdpc3RyeUVsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICByZWdpc3RyeUVsZW1lbnQuZ2V0VXNlcklkKCk7Ci0gICAgcmVnaXN0cnlFbGVtZW50LmdldENyZWQoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgIExpc3RNYW5hZ2VyIHB1YkFzc2VydGlvbnMgPSBidXNFbGVtZW50LmdldFB1Ymxpc2hlckFzc2VydGlvbnMoKTsKLQotICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBvd25lZCBidXNpbmVzcwotICAgIC8vIGlmIG5vdCwgdGhlIEFkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gY2Fubm90IGJlIHBlcmZvcm1lZAotICAgIGlmICghaXNCdXNpbmVzc093bmVkKGJ1c0VsZW1lbnQpKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9UX09XTkVEX0JVU0lORVNTIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFN0cmluZ1tdIHB1YkFzc2VydGlvblZpZXdJZHMgPSAoU3RyaW5nW10pcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfVklFV0lEKTsKLSAgICAgIFZlY3RvciBwdWJBc3NlcnRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHViQXNzZXJ0aW9uVmlld0lkcy5sZW5ndGg7IGkrKykgewotICAgICAgICBpbnQgdmlld0lEID0gSW50ZWdlci5wYXJzZUludChwdWJBc3NlcnRpb25WaWV3SWRzW2ldKTsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSBwdWJBc3NlcnRpb25zLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCk7Ci0gICAgICAgIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQgcHViQXNzZXJ0aW9uRWxlbWVudCA9IChQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICBpZiAoIShwdWJBc3NlcnRpb25FbGVtZW50LmdldFN0YXR1cygpLmVxdWFscyhDb21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFKSkpCi0gICAgICAgICAgcHViQXNzZXJ0aW9uVmVjdG9yLmFkZChwdWJBc3NlcnRpb25FbGVtZW50LmdldFB1Ymxpc2hlckFzc2VydGlvbigpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHB1YkFzc2VydGlvblZlY3Rvci5zaXplKCkgPD0gMCkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0lOQ09NUExFVEVfQVNTRVJUSU9OX1NFTEVDVEVEIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IHJlcG9ydCA9IHByb3h5LmFkZF9wdWJsaXNoZXJBc3NlcnRpb25zKHJlZ2lzdHJ5RWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBwdWJBc3NlcnRpb25WZWN0b3IpOwotICAgICAgLy9yZXBvcnQgc3RhdHVzCi0JICBWZWN0b3IgcmVwb3J0RXJySW5mbyA9IHJlcG9ydC5nZXRSZXN1bHRWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVwb3J0RXJySW5mby5zaXplKCk7IGorKykgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoKFJlc3VsdCkgcmVwb3J0RXJySW5mby5nZXQoaikpLmdldEVyckluZm8oKS5nZXRUZXh0KCkpOwotICAgICAgfQotCi0gICAgICBTaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbiBzaG93UEFBY3Rpb24gPSBuZXcgU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBzaG93UEFBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICAgT2JqZWN0IGlkcyA9IHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCk7Ci0gICAgICBpZiAoaWRzICE9IG51bGwpCi0gICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lELCBpZHMpOwotICAgICAgc2hvd1BBQWN0aW9uLnJ1bigpOwotCi0gICAgICByZXR1cm4gcmVwb3J0LnN1Y2Nlc3MoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IHJlcG9ydCA9IHVkZGllLmdldERpc3Bvc2l0aW9uUmVwb3J0KCk7Ci0JICBWZWN0b3IgcmVwb3J0RXJySW5mbyA9IHJlcG9ydC5nZXRSZXN1bHRWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVwb3J0RXJySW5mby5zaXplKCk7IGorKykgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoKFJlc3VsdCkgcmVwb3J0RXJySW5mby5nZXQoaikpLmdldEVyckluZm8oKS5nZXRUZXh0KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIkV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9GaW5kQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0ZpbmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkZTU1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0ZpbmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5RdWVyeVBhcmVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5NdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5RdWVyeU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUmVnaXN0cnlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbmRBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFF1ZXJ5RWxlbWVudCBxdWVyeUVsZW1lbnRfOwotICBwcm90ZWN0ZWQgU3RyaW5nIHN1YlF1ZXJ5S2V5XzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdWJRdWVyeUdldF87Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3U3ViUXVlcnlfOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld1N1YlF1ZXJ5SXRlbV87Ci0gIHByb3RlY3RlZCBib29sZWFuIHN1YlF1ZXJ5SW5pdGlhdGVkXzsKLSAgcHJvdGVjdGVkIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzUmVmcmVzaEFjdGlvbl87Ci0KLSAgcHVibGljIEZpbmRBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcXVlcnlFbGVtZW50XyA9IG51bGw7Ci0gICAgc3ViUXVlcnlLZXlfID0gbnVsbDsKLSAgICBpc1N1YlF1ZXJ5R2V0XyA9IGZhbHNlOwotICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IGZhbHNlOwotICAgIHJlZ05vZGVfID0gZ2V0UmVnaXN0cnlOb2RlKCk7Ci0gICAgaXNSZWZyZXNoQWN0aW9uXyA9IGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gU2V0dXAgZm9yIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyVHJhbnNmb3JtZXIKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk1VTFRJUEFSVF9GT1JNX0RBVEFfUEFSU0VSLCBwYXJzZXIpOwotCi0gICAgbmV3U3ViUXVlcnlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQpOwotICAgIFN0cmluZyBpc1N1YlF1ZXJ5R2V0U3RyaW5nID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCk7Ci0gICAgbmV3U3ViUXVlcnlJdGVtXyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSk7Ci0gICAgc3ViUXVlcnlLZXlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0gICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlfKTsKLSAgICBmb3JtVG9vbFBJLmNsZWFyRXJyb3JzKCk7Ci0KLSAgICBpZiAobmV3U3ViUXVlcnlfICE9IG51bGwgJiYgbmV3U3ViUXVlcnlfLmxlbmd0aCgpID4gMCkKLSAgICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgc3ViUXVlcnlJbml0aWF0ZWRfID0gZmFsc2U7Ci0gICAgICAKLSAgICBpZiAoaXNTdWJRdWVyeUdldFN0cmluZyAhPSBudWxsKQotICAgICAgaXNTdWJRdWVyeUdldF8gPSBCb29sZWFuLnZhbHVlT2YoaXNTdWJRdWVyeUdldFN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0KLSAgICBpZiAocXVlcnlOYW1lICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLHF1ZXJ5TmFtZSk7Ci0KLSAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhxdWVyeU5hbWUpICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfUVVFUllfTkFNRSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoIXByb2Nlc3NPdGhlcnMocGFyc2VyLGZvcm1Ub29sUEkpICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgCi0gICAgZm9yIChpbnQgaT0wO2k8cmVtb3ZlZFByb3BlcnRpZXNfLnNpemUoKTtpKyspCi0gICAgICBmb3JtVG9vbFBJLnJlbW92ZVByb3BlcnR5KHJlbW92ZWRQcm9wZXJ0aWVzXy5lbGVtZW50QXQoaSkpOwotICAgIGZvcm1Ub29sUEkudXBkYXRlUHJvcGVydHlUYWJsZShwcm9wZXJ0eVRhYmxlXyk7Ci0gICAgICAKLSAgICAvLyBQcm9jZXNzIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiBJZiB2YWxpZCwgdGhlc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgZm9ybVRvb2wgKG5vdCB0aGUgZm9ybVRvb2xQSSkuCi0gICAgU3RyaW5nIG93bmVkQ2hlY2tlZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9PV05FRCk7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgIFN0cmluZyB1c2VySWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgYm9vbGVhbiB2YWxpZGF0ZUF1dGhlbnRpY2F0aW9uID0gKG93bmVkQ2hlY2tlZCAhPSBudWxsKSAmJiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKSAmJiAhb3ZlcnJpZGVBdXRoZW50aWNhdGlvblZhbGlkYXRpb24oKTsKLQotICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIH0gICAgICAKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmIHZhbGlkYXRlQXV0aGVudGljYXRpb24gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhwdWJsaXNoVVJMKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMIikpOwotICAgIH0KLQotICAgIGlmICh1c2VySWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgfQotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgdmFsaWRhdGVBdXRoZW50aWNhdGlvbiAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHVzZXJJZCkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEIikpOwotICAgIH0KLQotICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIH0gICAgICAgIAotICAgICAgCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcnJpZGVBdXRoZW50aWNhdGlvblZhbGlkYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlF1ZXJ5SW5pdGlhdGVkKCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUluaXRpYXRlZF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3ViUXVlcnlHZXQoKQotICB7Ci0gICAgcmV0dXJuIGlzU3ViUXVlcnlHZXRfOwotICB9ICAgIAotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3ViUXVlcnlLZXkoKQotICB7Ci0gICAgcmV0dXJuIHN1YlF1ZXJ5S2V5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ld1N1YlF1ZXJ5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnlJdGVtKCkKLSAgewotICAgIHJldHVybiBuZXdTdWJRdWVyeUl0ZW1fOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSZWZyZXNoQWN0aW9uKGJvb2xlYW4gaXNSZWZyZXNoQWN0aW9uKQotICB7Ci0gICAgaXNSZWZyZXNoQWN0aW9uXyA9IGlzUmVmcmVzaEFjdGlvbjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSZWZyZXNoQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBpc1JlZnJlc2hBY3Rpb25fOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUXVlcnlOb2RlKCkKLSAgewotICAgIC8vIElmIHRoZSBxdWVyeUVsZW1lbnQgYWxyZWFkeSBleGlzdHMsIHJlbW92ZSBpdCBmaXJzdC4KLSAgICBTdHJpbmcgcXVlcnlOYW1lID0gcXVlcnlFbGVtZW50Xy5nZXROYW1lKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgUXVlcnlQYXJlbnRFbGVtZW50IHF1ZXJ5UGFyZW50RWxlbWVudCA9IHJlZ0VsZW1lbnQuZ2V0UXVlcnlQYXJlbnRFbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IHF1ZXJ5UGFyZW50RWxlbWVudC5nZXRRdWVyaWVzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgUXVlcnlFbGVtZW50IHFlID0gKFF1ZXJ5RWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBpZiAocWUuZ2V0TmFtZSgpLmVxdWFscyhxdWVyeU5hbWUpKQotICAgICAgewotICAgICAgICBTdWJRdWVyeVRyYW5zZmVyVGFyZ2V0IHN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgPSAoU3ViUXVlcnlUcmFuc2ZlclRhcmdldClxZS5nZXRQcm9wZXJ0eUFzT2JqZWN0KFVERElNb2RlbENvbnN0YW50cy5TVUJRVUVSWV9UUkFOU0ZFUl9UQVJHRVQpOwotICAgICAgICBpZiAoc3ViUXVlcnlUcmFuc2ZlclRhcmdldCAhPSBudWxsICYmIChxZS5nZXRRdWVyeVR5cGUoKSA9PSBxdWVyeUVsZW1lbnRfLmdldFF1ZXJ5VHlwZSgpKSkKLSAgICAgICAgICBxdWVyeUVsZW1lbnRfLnNldFByb3BlcnR5QXNPYmplY3QoVURESU1vZGVsQ29uc3RhbnRzLlNVQlFVRVJZX1RSQU5TRkVSX1RBUkdFVCxzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0KTsKLSAgICAgICAgcWUuZGlzY29ubmVjdEFsbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpc1JlZnJlc2hBY3Rpb25fKQotICAgIHsKLSAgICAgIC8vIFdlIGNhbiBtYWtlIHNhZmUgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIG5vZGUgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICBpZiAoc3ViUXVlcnlLZXlfICE9IG51bGwgJiYgc3ViUXVlcnlLZXlfLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmVudFF1ZXJ5S2V5OwotICAgICAgICBpbnQgbGFzdFNlcGFyYXRvclBvcyA9IHN1YlF1ZXJ5S2V5Xy5sYXN0SW5kZXhPZignOicpOwotICAgICAgICBpZiAobGFzdFNlcGFyYXRvclBvcyA9PSAtMSkKLSAgICAgICAgICBwYXJlbnRRdWVyeUtleSA9ICIiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcGFyZW50UXVlcnlLZXkgPSBzdWJRdWVyeUtleV8uc3Vic3RyaW5nKDAsbGFzdFNlcGFyYXRvclBvcyk7Ci0gICAgICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBwYXJlbnRGb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlnZXRTZWxlY3RlZEZvcm1Ub29sKCkpLmdldEZvcm1Ub29sUHJvcGVydGllcyhwYXJlbnRRdWVyeUtleSk7Ci0gICAgICAgIE9iamVjdCBxdWVyeUl0ZW0gPSBwYXJlbnRGb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSk7Ci0gICAgICAgIE9iamVjdCBxdWVyeVN0eWxlQnVzID0gcGFyZW50Rm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMpOwotICAgICAgICBPYmplY3QgcXVlcnlTdHlsZVNlciA9IHBhcmVudEZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyk7Ci0gICAgICAgIE9iamVjdCBxdWVyeVN0eWxlU2VySW50ID0gcGFyZW50Rm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICAgICAgIEhhc2h0YWJsZSBwYXJlbnRRdWVyeURhdGEgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGlmIChxdWVyeUl0ZW0gIT0gbnVsbCkKLSAgICAgICAgICBwYXJlbnRRdWVyeURhdGEucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSwgcXVlcnlJdGVtKTsKLSAgICAgICAgaWYgKHF1ZXJ5U3R5bGVCdXMgIT0gbnVsbCkKLSAgICAgICAgICBwYXJlbnRRdWVyeURhdGEucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUywgcXVlcnlTdHlsZUJ1cyk7Ci0gICAgICAgIGlmIChxdWVyeVN0eWxlU2VyICE9IG51bGwpCi0gICAgICAgICAgcGFyZW50UXVlcnlEYXRhLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLCBxdWVyeVN0eWxlU2VyKTsKLSAgICAgICAgaWYgKHF1ZXJ5U3R5bGVTZXJJbnQgIT0gbnVsbCkKLSAgICAgICAgICBwYXJlbnRRdWVyeURhdGEucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTLCBxdWVyeVN0eWxlU2VySW50KTsKLSAgICAgICAgcXVlcnlFbGVtZW50Xy5zZXRQcm9wZXJ0eUFzT2JqZWN0KFVERElNb2RlbENvbnN0YW50cy5TVUJRVUVSWV9UUkFOU0ZFUl9UQVJHRVQsbmV3IFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQoZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCksc3ViUXVlcnlLZXlfLHBhcmVudFF1ZXJ5RGF0YSkpOwotICAgICAgfQotICAgIH0KLSAgICBxdWVyeVBhcmVudEVsZW1lbnQuY29ubmVjdChxdWVyeUVsZW1lbnRfLFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUklFUyxNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIFF1ZXJ5Tm9kZSBxdWVyeU5vZGUgPSAoUXVlcnlOb2RlKShyZWdOb2RlXy5nZXRDaGlsZE5vZGUocXVlcnlQYXJlbnRFbGVtZW50KS5nZXRDaGlsZE5vZGUocXVlcnlFbGVtZW50XykpOwotICAgIGludCBuZXdTZWxlY3RlZE5vZGVJZDsKLSAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IDEgcmVzdWx0LCBzZWxlY3QgdGhlIHJlc3VsdC4gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIHF1ZXJ5IG5vZGUgdG8gcHJlc2VudCBhIHN1bW1hcnkuCi0gICAgaWYgKHF1ZXJ5Tm9kZS5nZXRDaGlsZE5vZGVzKCkuc2l6ZSgpID09IDEgJiYgKHN1YlF1ZXJ5S2V5XyA9PSBudWxsIHx8IHN1YlF1ZXJ5S2V5Xy5sZW5ndGgoKSA9PSAwKSkKLSAgICAgIG5ld1NlbGVjdGVkTm9kZUlkID0gKChOb2RlKShxdWVyeU5vZGUuZ2V0Q2hpbGROb2RlcygpLmVsZW1lbnRBdCgwKSkpLmdldE5vZGVJZCgpOwotICAgIGVsc2UKLSAgICAgIG5ld1NlbGVjdGVkTm9kZUlkID0gcXVlcnlOb2RlLmdldE5vZGVJZCgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gcmVnTm9kZV8uZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChuZXdTZWxlY3RlZE5vZGVJZCk7Ci0gICAgcXVlcnlOb2RlLnNldEZpbmRUb29sUHJvcGVydGllcyh0aGlzKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgYWRkVG9IaXN0b3J5KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLHNlbGVjdGVkVG9vbC5nZXRTZWxlY3RUb29sQWN0aW9uSHJlZih0cnVlKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoICsgMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRUcmFuc2Zvcm1lcnMsIDAsIHRyYW5zZm9ybWVycywgMCwgcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCk7Ci0gICAgdHJhbnNmb3JtZXJzW3RyYW5zZm9ybWVycy5sZW5ndGggLSAxXSA9IG5ldyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlclRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Mb2dpbkFkdmFuY2VkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0xvZ2luQWR2YW5jZWRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3ZTBhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0xvZ2luQWR2YW5jZWRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLAotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjcgICAxMzY0NDkgYnJ1bnNzZW5AdXMuaWJtLmNvbSAtIFZpbmNlIEJydW5zc2VuCi0gKiAyMDA2MDQyNyAgIDEzNjQ0OSBjbGJ1c2hAdXMuaWJtLmNvbSAtIENocmlzdG9waGVyIEJ1c2ggIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS5ybWkuQWxyZWFkeUJvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUmVnaXN0cnlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLQotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlczsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm9zOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuUmVnaXN0ZXJlZEluZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5UTW9kZWxJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsSW5mb3M7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTG9naW5BZHZhbmNlZEFjdGlvbiBleHRlbmRzIFB1Ymxpc2hBY3Rpb24gewotICAgcHVibGljIExvZ2luQWR2YW5jZWRBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sIFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXwotICAgICAgICAgICAgLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMsIFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQpKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9TRUFSQ0hfU0VULCBTdHJpbmcKLSAgICAgICAgICAgIC52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1NFQVJDSF9TRVQpKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9SRVNVTFRTLCBTdHJpbmcKLSAgICAgICAgICAgIC52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1JFU1VMVFMpKTsKLSAgIH0KLQotICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKQotICAgICAgICAgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIHsKLSAgICAgIFN0cmluZyBvd25lZENoZWNrZWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfT1dORUQpOwotCi0gICAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgICAgaWYgKG93bmVkQ2hlY2tlZCAhPSBudWxsKQotICAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfT1dORUQsIG93bmVkQ2hlY2tlZCk7Ci0gICAgICBlbHNlCi0gICAgICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX09XTkVEKTsKLQotICAgICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICAgfQotICAgCi0gICBwcml2YXRlIGJvb2xlYW4gYXR0ZW1wdGluZ0RvdWJsZUxvZ2luKCl7Ci0JICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0JICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0JICAgTm9kZSByb290Tm9kZSA9IHJlZ05vZGVfLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Um9vdE5vZGUoKTsKLSAgICAgICBWZWN0b3IgYWxsTm9kZXMgPSByb290Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgCi0gICAgICAgZm9yKGludCBrID0gMDsgayA8IGFsbE5vZGVzLnNpemUoKTsgaysrKXsKLSAgICAgIAkgTm9kZSBuID0gKE5vZGUpYWxsTm9kZXMuZ2V0KGspOwotICAgICAgCSBpZiAobiBpbnN0YW5jZW9mIFJlZ2lzdHJ5Tm9kZSl7Ci0gICAgICAJCSBSZWdpc3RyeUVsZW1lbnQgbXlFbGVtZW50ID0gKChSZWdpc3RyeUVsZW1lbnQpbi5nZXRUcmVlRWxlbWVudCgpKTsKLSAgICAgIAkJIGlmIChuLmdldE5vZGVJZCgpICE9IHJlZ05vZGVfLmdldE5vZGVJZCgpICYmIHB1Ymxpc2hVUkwuZXF1YWxzKG15RWxlbWVudC5nZXRQdWJsaXNoVVJMKCkpKQotICAgICAgCQkJIGlmKHVzZXJJZC5lcXVhbHMobXlFbGVtZW50LmdldFVzZXJJZCgpKSkKLSAgICAgIAkJCQkgcmV0dXJuIHRydWU7Ci0gICAgICAJIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotICAgCi0gICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKSB7Ci0gICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIrKysrKyBUcnlpbmcgdG8gbG9naW4gKysrKysiKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgICBib29sZWFuIHNob3VsZEFkZFF1ZXJ5Tm9kZSA9IChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSkgPT0gbnVsbCk7Ci0gICAgICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgICAgaW50IG1heFJlc3VsdHMgPSAzMDA7Ci0gICAgICAgICAKLSAgICAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhCi0gICAgICAgICAvLyBxdWVyeSBub2RlLgotICAgICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KSByZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgCi0gICAgICAgICAgICAgICAgIAotICAgICAgICAgaWYoYXR0ZW1wdGluZ0RvdWJsZUxvZ2luKCkpCi0gICAgICAgIAkgdGhyb3cgbmV3IEFscmVhZHlCb3VuZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fTk9fTVVMVElQTEVfTE9HSU4iKSk7IAotICAgICAgICAgCi0gICAgICAgICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgICAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCwgdXNlcklkLCBwYXNzd29yZCk7Ci0KLSAgICAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLQotICAgICAgICAgQnVzaW5lc3NJbmZvcyBidXNJbmZvcyA9IG51bGw7Ci0gICAgICAgICBUTW9kZWxJbmZvcyB0bUluZm9zID0gbnVsbDsKLQotICAgICAgICAgUmVnaXN0ZXJlZEluZm8gcmkgPSBwcm94eS5nZXRfcmVnaXN0ZXJlZEluZm8ocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpKTsKLSAgICAgICAgIGJ1c0luZm9zID0gcmkuZ2V0QnVzaW5lc3NJbmZvcygpOwotICAgICAgICAgdG1JbmZvcyA9IHJpLmdldFRNb2RlbEluZm9zKCk7Ci0KLSAgICAgICAgIGludCBmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllcyA9IE1hdGgubWluKG1heFJlc3VsdHMsIGJ1c0luZm9zLnNpemUoKSk7Ci0gICAgICAgICBWZWN0b3IgYnVzaW5lc3NLZXlzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllczsgaSsrKSB7Ci0gICAgICAgICAgICBCdXNpbmVzc0luZm8gYnVzSW5mbyA9IChCdXNpbmVzc0luZm8pIGJ1c0luZm9zLmdldChpKTsKLSAgICAgICAgICAgIGJ1c2luZXNzS2V5cy5hZGRFbGVtZW50KGJ1c0luZm8uZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllcyA+IDApIHsKLSAgICAgICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpIHsKLSAgICAgICAgICAgICAgIFZlY3RvciBiZVZlY3RvciA9IHByb3h5LmdldF9idXNpbmVzc0RldGFpbChidXNpbmVzc0tleXMpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCk7Ci0gICAgICAgICAgICAgICBCdXNpbmVzc0VudGl0eSBiZSA9IG51bGw7Ci0gICAgICAgICAgICAgICBCdXNpbmVzc1NlcnZpY2VzIGJzID0gbnVsbDsKLSAgICAgICAgICAgICAgIGludCBzaXplID0gYmVWZWN0b3Iuc2l6ZSgpOwotICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgYmUgPSAoQnVzaW5lc3NFbnRpdHkpIGJlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgIGFkZFB1Ymxpc2hlZEl0ZW1Ob2RlKGJlLCByZWdFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgIGJzID0gYmUuZ2V0QnVzaW5lc3NTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKGJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciB2U2VydmljZXMgPSBicy5nZXRCdXNpbmVzc1NlcnZpY2VWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlcyA9IHZTZXJ2aWNlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNlcnZpY2VzOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFB1Ymxpc2hlZEl0ZW1Ob2RlKGJzLmdldChqKSwgcmVnRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19CVVNJTkVTU0VTX0ZPVU5EIiwgU3RyaW5nLnZhbHVlT2Yoc2l6ZSkpKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgaW50IGZpbmFsTnVtYmVyT2ZUTW9kZWxzID0gTWF0aC5taW4obWF4UmVzdWx0cywgdG1JbmZvcy5zaXplKCkpOwotICAgICAgICAgVmVjdG9yIHRNb2RlbEtleXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmFsTnVtYmVyT2ZUTW9kZWxzOyBpKyspIHsKLSAgICAgICAgICAgIFRNb2RlbEluZm8gdG1JbmZvID0gKFRNb2RlbEluZm8pIHRtSW5mb3MuZ2V0KGkpOwotICAgICAgICAgICAgdE1vZGVsS2V5cy5hZGRFbGVtZW50KHRtSW5mby5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChmaW5hbE51bWJlck9mVE1vZGVscyA+IDApIHsKLSAgICAgICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpIHsKLSAgICAgICAgICAgICAgIFZlY3RvciBmaW5hbFRNb2RlbFZlY3RvciA9IHByb3h5LmdldF90TW9kZWxEZXRhaWwodE1vZGVsS2V5cykuZ2V0VE1vZGVsVmVjdG9yKCk7Ci0KLSAgICAgICAgICAgICAgIGludCBzaXplID0gZmluYWxUTW9kZWxWZWN0b3Iuc2l6ZSgpOwotICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICBUTW9kZWwgdG0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIHRtID0gKFRNb2RlbCkgZmluYWxUTW9kZWxWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgYWRkUHVibGlzaGVkSXRlbU5vZGUodG0sIHJlZ0VsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORCIsIFN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlT2Yoc2l6ZSkpKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgaW50IGlkID0gMTsKLSAgICAgICAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gZ2V0UmVnaXN0cnlOb2RlKCk7Ci0KLSAgICAgICAgIC8vIHdlIGFyZSBsb2dnZWQgaW4gc28gY2hhbmdlIHRoZSBsb2dpblRvb2wgdG8gYWN0IGFzIGEgbG9nb3V0VG9vbDsKLSAgICAgICAgIHJlZ05vZGUuZ2V0TG9naW5Ub29sKCkuc2V0QWx0VGV4dCh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xPR09VVCIpKTsKLSAgICAgICAgIHJlZ05vZGUuZ2V0TG9naW5Ub29sKCkuc2V0VG9Mb2dvdXRMaW5rKCk7Ci0gICAgICAgICBTdHJpbmcgcmVnaXN0cnlOYW1lID0gcmVnRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgIHNbMF0gPSByZWdpc3RyeU5hbWU7Ci0gICAgICAgICBzWzFdID0gdXNlcklkOwotICAgICAgICAgcmVnRWxlbWVudC5zZXROYW1lKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19MT0dHRURfSU5fTk9ERSIsIHMpKTsKLQotICAgICAgICAgaWYgKGZpbmFsTnVtYmVyT2ZCdXNpbmVzc0VudGl0aWVzID4gMCkgewotICAgICAgICAgICAgTm9kZSBwYmVOb2RlID0gcmVnTm9kZS5nZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRQdWJsaXNoZWRCdXNpbmVzc2VzRWxlbWVudCgpKTsKLSAgICAgICAgICAgIGlkID0gcGJlTm9kZS5nZXROb2RlSWQoKTsKLSAgICAgICAgIH0gZWxzZSBpZiAoZmluYWxOdW1iZXJPZlRNb2RlbHMgPiAwKSB7Ci0gICAgICAgICAgICBOb2RlIHBzaU5vZGUgPSByZWdOb2RlLmdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzRWxlbWVudCgpKTsKLSAgICAgICAgICAgIGlkID0gcHNpTm9kZS5nZXROb2RlSWQoKTsKLSAgICAgICAgIH0gCi0gICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgaWQgPSAiICsgaWQpOwotICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuc2V0U2VsZWN0ZWROb2RlSWQoaWQpOwotICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLQotICAgICAgICAgaWYgKChmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllcyA8IDEpICYmIChmaW5hbE51bWJlck9mVE1vZGVscyA8IDEpKQotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX05PX0JVU0lORVNTRVNfT1JfU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EIikpOwotCi0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gY2F0Y2ggKFVERElFeGNlcHRpb24gZSkgewotICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iKTsKLSAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gY2F0Y2ggKEFscmVhZHlCb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgCSBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAJIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJBbHJlYWR5Qm91bmRFeGNlcHRpb24iKTsKLSAgICAJIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvTG9nb3V0QWR2YW5jZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvTG9nb3V0QWR2YW5jZWRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2ZGYzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0xvZ291dEFkdmFuY2VkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTM2NDQ5IGJydW5zc2VuQHVzLmlibS5jb20gLSBWaW5jZSBCcnVuc3NlbiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBMb2dvdXRBZHZhbmNlZEFjdGlvbiBleHRlbmRzIFB1Ymxpc2hBY3Rpb24KLXsKLSAgcHVibGljIExvZ291dEFkdmFuY2VkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHJlZ05vZGVfLmdldExvZ2luVG9vbCgpLnNldFRvUmVnaXN0cnlMaW5rKCk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUuCi0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGlmIChyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkgewotICAgICAgICByZWdFbGVtZW50LnBlcmZvcm1Mb2dvdXQoKTsKLSAgICAgICAgcmVnRWxlbWVudC5yZW1vdmUoKTsKLSAgICAgICAgcmVnTm9kZV8uZ2V0Tm9kZU1hbmFnZXIoKS5zZXRTZWxlY3RlZE5vZGVJZCgwKTsgIAotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlRyYW5zcG9ydEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTNmMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkJ1c2luZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLk11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlJlZ2lzdHJ5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2VzOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0FjdGlvbiBleHRlbmRzIFVERElQcm9wZXJ0aWVzRm9ybUFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIHN1YlF1ZXJ5S2V5XzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdWJRdWVyeUdldF87Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3U3ViUXVlcnlfOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld1N1YlF1ZXJ5SXRlbV87Ci0gIHByb3RlY3RlZCBib29sZWFuIHN1YlF1ZXJ5SW5pdGlhdGVkXzsKLSAgcHJvdGVjdGVkIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlXzsKLQotICBwdWJsaWMgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHN1YlF1ZXJ5S2V5XyA9IG51bGw7Ci0gICAgaXNTdWJRdWVyeUdldF8gPSBmYWxzZTsKLSAgICBzdWJRdWVyeUluaXRpYXRlZF8gPSBmYWxzZTsKLSAgICByZWdOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIG5ld1N1YlF1ZXJ5XyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfSU5JVElBVEVEKTsKLSAgICBTdHJpbmcgaXNTdWJRdWVyeUdldFN0cmluZyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgIG5ld1N1YlF1ZXJ5SXRlbV8gPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0pOwotICAgIHN1YlF1ZXJ5S2V5XyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIFN0cmluZ1tdIHJlZmVyZW5jZWRTZXJ2aWNlc0NoZWNrYm94ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUkVGRVJFTkNFRF9TRVJWSUNFX1NFTEVDVF9TVEFURSk7Ci0gICAgU3RyaW5nW10gc2VydmljZU5vZGVJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuTk9ERUlEX1NFUlZJQ0UpOwotICAgIFN0cmluZyBvcGVyYXRpb24gPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OKTsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgU3RyaW5nIHVzZXJJZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLQotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5Xyk7Ci0gICAgZm9ybVRvb2xQSS5jbGVhckVycm9ycygpOwotCi0gICAgaWYgKG5ld1N1YlF1ZXJ5XyAhPSBudWxsICYmIG5ld1N1YlF1ZXJ5Xy5sZW5ndGgoKSA+IDApCi0gICAgICBzdWJRdWVyeUluaXRpYXRlZF8gPSB0cnVlOwotICAgIGVsc2UKLSAgICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IGZhbHNlOwotCi0gICAgaWYgKGlzU3ViUXVlcnlHZXRTdHJpbmcgIT0gbnVsbCkKLSAgICAgIGlzU3ViUXVlcnlHZXRfID0gQm9vbGVhbi52YWx1ZU9mKGlzU3ViUXVlcnlHZXRTdHJpbmcpLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OLG9wZXJhdGlvbik7Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19PUEVSQVRJT04pOwotCi0gICAgaWYgKHJlZmVyZW5jZWRTZXJ2aWNlc0NoZWNrYm94ZXMgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFRkVSRU5DRURfU0VSVklDRV9TRUxFQ1RfU1RBVEUscmVmZXJlbmNlZFNlcnZpY2VzQ2hlY2tib3hlcyk7Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5SRUZFUkVOQ0VEX1NFUlZJQ0VfU0VMRUNUX1NUQVRFKTsKLQotICAgIGlmIChzZXJ2aWNlTm9kZUlkcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBzZXJ2aWNlcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NFUlZJQ0VTKTsKLSAgICAgIGlmIChzZXJ2aWNlcyA9PSBudWxsKQotICAgICAgICBzZXJ2aWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIEhhc2h0YWJsZSByZXN1bHRIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZU5vZGVJZHMubGVuZ3RoO2krKykKLSAgICAgICAgcmVzdWx0SGFzaC5wdXQoc2VydmljZU5vZGVJZHNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VzLnNpemUoKTtpKyspCi0gICAgICB7Ci0gICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgaWYgKHJlc3VsdEhhc2guZ2V0KFN0cmluZy52YWx1ZU9mKGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpKSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZpY2VzLnJlbW92ZUVsZW1lbnRBdChpKTsKLSAgICAgICAgICBpLS07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NFUlZJQ0VTLHNlcnZpY2VzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TRVJWSUNFUyk7Ci0KLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgIHsKLSAgICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgfQotCi0gICAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHB1Ymxpc2hVUkwpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTCIpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHVzZXJJZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh1c2VySWQpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEIikpOwotICAgICAgfQotCi0gICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBpPTA7aTxyZW1vdmVkUHJvcGVydGllc18uc2l6ZSgpO2krKykKLSAgICAgIGZvcm1Ub29sUEkucmVtb3ZlUHJvcGVydHkocmVtb3ZlZFByb3BlcnRpZXNfLmVsZW1lbnRBdChpKSk7Ci0gICAgZm9ybVRvb2xQSS51cGRhdGVQcm9wZXJ0eVRhYmxlKHByb3BlcnR5VGFibGVfKTsKLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBTdHJpbmcgb3BlcmF0aW9uU3RyaW5nID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19PUEVSQVRJT04pOwotICAgIGludCBvcGVyYXRpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG9wZXJhdGlvblN0cmluZyk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleV8pOwotICAgIFZlY3RvciByZWZlcmVuY2VkU2VydmljZXMgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9SRUZFUkVOQ0VEX1NFUlZJQ0VTKTsKLSAgICBib29sZWFuIG9wZXJhdGlvblJlc3VsdCA9IHRydWU7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGN1cnJlbnRTUCA9IGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IHNwID0gKEJ1c2luZXNzRW50aXR5KXByb3h5LmdldF9idXNpbmVzc0RldGFpbChjdXJyZW50U1AuZ2V0QnVzaW5lc3NLZXkoKSkuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICAKLSAgICAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICAgIHJlZ0VsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLSAgICAgICAgCi0gICAgICBIYXNodGFibGUgc2VydmljZXNIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgVmVjdG9yIGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLk1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTl9BREQ6Ci0gICAgICAgICAgVmVjdG9yIHNlcnZpY2VzID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TRVJWSUNFUyk7ICAgICAgICAgIAotICAgICAgICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VzLnNpemUoKTtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdEVsZW1lbnQgc2VydmljZUxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2Upc2VydmljZUxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgc2VydmljZXNIYXNoLnB1dChicy5nZXRTZXJ2aWNlS2V5KCksYnMpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgQnVzaW5lc3NTZXJ2aWNlcyBmb3Igcm9sbGJhY2sgb3BlcmF0aW9ucy4KLSAgICAgICAgICBiYWNrdXBBbmRVcGRhdGVCdXNpbmVzc1NlcnZpY2VzKGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3Isc3Asc2VydmljZXNIYXNoLHRydWUpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBWZWN0b3IgYmVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBiZVZlY3Rvci5hZGQoc3ApOwotICAgICAgICAgICAgc3AgPSAoQnVzaW5lc3NFbnRpdHkpcHJveHkuc2F2ZV9idXNpbmVzcyhyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIGJlVmVjdG9yKS5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpLmdldCgwKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VzLnNpemUoKTtpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIExpc3RFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlzZXJ2aWNlRWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGJzTmFtZSA9IGJzLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX1JFRkVSRU5DRUQiLGJzTmFtZSkpOwotICAgICAgICAgICAgICBzZXJ2aWNlcy5yZW1vdmVFbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFJvbGwgYmFjayBhbmQgcmVzdG9yZSB0aGUgb2xkIGxpc3Qgb2Ygc2VydmljZXMuCi0gICAgICAgICAgICByb2xsYmFja0J1c2luZXNzU2VydmljZXMoc3AsYmFja3VwQnVzU2VydmljZVZlY3RvcixzZXJ2aWNlcyx1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJNU0dfRVJST1JfU0VSVklDRV9OT1RfUkVGRVJFTkNFRCIpOwotICAgICAgICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJUcmFuc3BvcnRFeGNlcHRpb24iLGUpOwotICAgICAgICAgICAgb3BlcmF0aW9uUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUm9sbCBiYWNrIGFuZCByZXN0b3JlIHRoZSBvbGQgbGlzdCBvZiBzZXJ2aWNlcy4KLSAgICAgICAgICAgIHJvbGxiYWNrQnVzaW5lc3NTZXJ2aWNlcyhzcCxiYWNrdXBCdXNTZXJ2aWNlVmVjdG9yLHNlcnZpY2VzLHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIk1TR19FUlJPUl9TRVJWSUNFX05PVF9SRUZFUkVOQ0VEIik7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NFUlZJQ0VTLHNlcnZpY2VzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLk1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTl9SRU1PVkU6Ci0gICAgICAgICAgU3RyaW5nW10gcmVmZXJlbmNlZFNlcnZpY2VzQ2hlY2tib3hlcyA9IChTdHJpbmdbXSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5SRUZFUkVOQ0VEX1NFUlZJQ0VfU0VMRUNUX1NUQVRFKTsKLSAgICAgICAgICBWZWN0b3Igc2VsZWN0ZWRSZWZlcmVuY2VkU2VydmljZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7aTxyZWZlcmVuY2VkU2VydmljZXNDaGVja2JveGVzLmxlbmd0aDtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBpc0NoZWNrZWQgPSBCb29sZWFuLnZhbHVlT2YocmVmZXJlbmNlZFNlcnZpY2VzQ2hlY2tib3hlc1tpXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoaXNDaGVja2VkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBMaXN0RWxlbWVudCByZWZlcmVuY2VkU2VydmljZUxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXJlZmVyZW5jZWRTZXJ2aWNlcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpcmVmZXJlbmNlZFNlcnZpY2VMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgc2VydmljZXNIYXNoLnB1dChicy5nZXRTZXJ2aWNlS2V5KCksYnMpOwotICAgICAgICAgICAgICBzZWxlY3RlZFJlZmVyZW5jZWRTZXJ2aWNlVmVjdG9yLmFkZEVsZW1lbnQoYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgCi0gICAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBsaXN0IG9mIGJ1c2luZXNzIHNlcnZpY2VzIGZvciByb2xsYmFjayBvcGVyYXRpb25zLgotICAgICAgICAgIGJhY2t1cEFuZFVwZGF0ZUJ1c2luZXNzU2VydmljZXMoYmFja3VwQnVzU2VydmljZVZlY3RvcixzcCxzZXJ2aWNlc0hhc2gsZmFsc2UpOwotICAgICAgICAgIAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZlY3RvciBiZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGJlVmVjdG9yLmFkZChzcCk7Ci0gICAgICAgICAgICBzcCA9IChCdXNpbmVzc0VudGl0eSlwcm94eS5zYXZlX2J1c2luZXNzKHJlZ0VsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgYmVWZWN0b3IpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCkuZ2V0KDApOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8c2VsZWN0ZWRSZWZlcmVuY2VkU2VydmljZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSAoQnVzaW5lc3NTZXJ2aWNlKXNlbGVjdGVkUmVmZXJlbmNlZFNlcnZpY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICBTdHJpbmcgYnNOYW1lID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFX1JFTU9WRUQiLGJzTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUm9sbCBiYWNrIGFuZCByZXN0b3JlIHRoZSBvbGQgbGlzdCBvZiBzZXJ2aWNlcy4KLSAgICAgICAgICAgIHJvbGxiYWNrQnVzaW5lc3NTZXJ2aWNlcyhzcCxiYWNrdXBCdXNTZXJ2aWNlVmVjdG9yLHNlbGVjdGVkUmVmZXJlbmNlZFNlcnZpY2VWZWN0b3IsdWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiTVNHX0VSUk9SX1JFRkVSRU5DRV9OT1RfUkVNT1ZFRCIpOwotICAgICAgICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJUcmFuc3BvcnRFeGNlcHRpb24iLGUpOwotICAgICAgICAgICAgb3BlcmF0aW9uUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUm9sbCBiYWNrIGFuZCByZXN0b3JlIHRoZSBvbGQgbGlzdCBvZiBzZXJ2aWNlcy4KLSAgICAgICAgICAgIHJvbGxiYWNrQnVzaW5lc3NTZXJ2aWNlcyhzcCxiYWNrdXBCdXNTZXJ2aWNlVmVjdG9yLHNlbGVjdGVkUmVmZXJlbmNlZFNlcnZpY2VWZWN0b3IsdWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiTVNHX0VSUk9SX1JFRkVSRU5DRV9OT1RfUkVNT1ZFRCIpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgb3BlcmF0aW9uUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlZmVyZW5jZWQgc2VydmljZXMgYXJlIHJlZnJlc2hlZCB3aGVuIHRoZSBmb3JtIHJlbG9hZHMuCi0gICAgICBmb3JtVG9vbFBJLnJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfUkVGRVJFTkNFRF9TRVJWSUNFUyk7Ci0gICAgICBidXNFbGVtZW50LnNldEJ1c2luZXNzRW50aXR5KHNwKTsKLSAgICAgIHJldHVybiBvcGVyYXRpb25SZXN1bHQ7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgICBvcGVyYXRpb25SZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgICBvcGVyYXRpb25SZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIixlKTsKLSAgICAgIG9wZXJhdGlvblJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gb3BlcmF0aW9uUmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTdWJRdWVyeUluaXRpYXRlZCgpCi0gIHsKLSAgICByZXR1cm4gc3ViUXVlcnlJbml0aWF0ZWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTdWJRdWVyeUdldCgpCi0gIHsKLSAgICByZXR1cm4gaXNTdWJRdWVyeUdldF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN1YlF1ZXJ5S2V5KCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUtleV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5ld1N1YlF1ZXJ5KCkKLSAgewotICAgIHJldHVybiBuZXdTdWJRdWVyeV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5ld1N1YlF1ZXJ5SXRlbSgpCi0gIHsKLSAgICByZXR1cm4gbmV3U3ViUXVlcnlJdGVtXzsKLSAgfQotICAKLSAgLy8gQmFja3VwIHRoZSBidXNpbmVzcyBzZXJ2aWNlcyBhbmQgcmVtb3ZlIHRob3NlIGluIHNlcnZpY2VIYXNoIGZyb20gdGhlIGN1cnJlbnQgbGlzdC4gUmV0dXJuIHRoZSB1cGRhdGVkIGxpc3Qgb2YgYnVzaW5lc3Mgc2VydmljZXMKLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGJhY2t1cEFuZFVwZGF0ZUJ1c2luZXNzU2VydmljZXMoVmVjdG9yIGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3IsQnVzaW5lc3NFbnRpdHkgYmUsSGFzaHRhYmxlIHNlcnZpY2VzSGFzaCxib29sZWFuIGlzQWRkKQotICB7Ci0gICAgLy8gU2F2ZSB0aGUgY3VycmVudCBsaXN0IG9mIGJ1c2luZXNzIHNlcnZpY2VzIGZvciByb2xsYmFjayBvcGVyYXRpb25zLgotICAgIEJ1c2luZXNzU2VydmljZXMgY3VycmVudEJ1c1NlcnZpY2VzID0gYmUuZ2V0QnVzaW5lc3NTZXJ2aWNlcygpOwotICAgIGlmIChjdXJyZW50QnVzU2VydmljZXMgPT0gbnVsbCkKLSAgICAgIGN1cnJlbnRCdXNTZXJ2aWNlcyA9IG5ldyBCdXNpbmVzc1NlcnZpY2VzKCk7Ci0gICAgVmVjdG9yIGN1cnJlbnRCdXNTZXJ2aWNlVmVjdG9yID0gY3VycmVudEJ1c1NlcnZpY2VzLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDtpPGN1cnJlbnRCdXNTZXJ2aWNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgewotICAgICAgQnVzaW5lc3NTZXJ2aWNlIGN1cnJlbnRCdXNTZXJ2aWNlID0gKEJ1c2luZXNzU2VydmljZSljdXJyZW50QnVzU2VydmljZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICBiYWNrdXBCdXNTZXJ2aWNlVmVjdG9yLmFkZEVsZW1lbnQoY3VycmVudEJ1c1NlcnZpY2UpOwotICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgYnVzaW5lc3Mgc2VydmljZSBpcyBhIG1lbWJlciBvZiB0aGUgbGlzdCB0byBiZSByZW1vdmVkL2FkZGVkLCByZW1vdmUgaXQgbm93LgotICAgICAgaWYgKHNlcnZpY2VzSGFzaC5nZXQoY3VycmVudEJ1c1NlcnZpY2UuZ2V0U2VydmljZUtleSgpKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjdXJyZW50QnVzU2VydmljZVZlY3Rvci5yZW1vdmVFbGVtZW50QXQoaSk7Ci0gICAgICAgIGktLTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlzQWRkKQotICAgIHsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBzZXJ2aWNlc0hhc2guZWxlbWVudHMoKTsKLSAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICBjdXJyZW50QnVzU2VydmljZVZlY3Rvci5hZGRFbGVtZW50KChCdXNpbmVzc1NlcnZpY2UpZS5uZXh0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgYmUuc2V0QnVzaW5lc3NTZXJ2aWNlcyhjdXJyZW50QnVzU2VydmljZXMpOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHZvaWQgcm9sbGJhY2tCdXNpbmVzc1NlcnZpY2VzKEJ1c2luZXNzRW50aXR5IGJlLFZlY3RvciBiYWNrdXBCdXNTZXJ2aWNlVmVjdG9yLFZlY3RvciBvcGVyYXRlZFNlcnZpY2VzLFBlcnNwZWN0aXZlIHBlcnNwZWN0aXZlLE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUsU3RyaW5nIGVycm9yTWVzc2FnZUtleSkKLSAgewotICAgIC8vIFJvbGwgYmFjayBhbmQgcmVzdG9yZSB0aGUgb2xkIGxpc3Qgb2Ygc2VydmljZXMuCi0gICAgYmUuZ2V0QnVzaW5lc3NTZXJ2aWNlcygpLnNldEJ1c2luZXNzU2VydmljZVZlY3RvcihiYWNrdXBCdXNTZXJ2aWNlVmVjdG9yKTsKLSAgICBmb3IgKGludCBpPTA7aTxvcGVyYXRlZFNlcnZpY2VzLnNpemUoKTtpKyspCi0gICAgewotICAgICAgTGlzdEVsZW1lbnQgc2VydmljZUxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KW9wZXJhdGVkU2VydmljZXMuZWxlbWVudEF0KGkpOwotICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlzZXJ2aWNlTGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICBTdHJpbmcgYnNOYW1lID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoZXJyb3JNZXNzYWdlS2V5LGJzTmFtZSkpOwotICAgIH0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvT3BlbkNhdGVnb3J5QnJvd3NlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9PcGVuQ2F0ZWdvcnlCcm93c2VyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMWIxZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9PcGVuQ2F0ZWdvcnlCcm93c2VyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotCi1wdWJsaWMgY2xhc3MgT3BlbkNhdGVnb3J5QnJvd3NlckFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwdWJsaWMgT3BlbkNhdGVnb3J5QnJvd3NlckFjdGlvbigpCi0gIHsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYWRkU2Vzc2lvbkFuZFRNb2RlbEtleShTdHJpbmdCdWZmZXIgcmVzdWx0LFN0cmluZyBzZXNzaW9uSWQsU3RyaW5nIGNhdGVnb3J5VE1vZGVsS2V5KQotICB7Ci0gICAgcmVzdWx0LmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKS5hcHBlbmQoJyYnKS5hcHBlbmQoVURESUFjdGlvbklucHV0cy5DQVRFR09SWV9UTU9ERUxfS0VZKS5hcHBlbmQoJz0nKS5hcHBlbmQoY2F0ZWdvcnlUTW9kZWxLZXkpOwotICB9Ci0gIAotICAvLyB1ZGRpL2NhdGVnb3J5X2Jyb3dzZXIuanNwP3Nlc3Npb25JZD0uLi4mY2F0ZWdvcnlUTW9kZWxLZXk9Li4uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHNlc3Npb25JZCxTdHJpbmcgY2F0ZWdvcnlUTW9kZWxLZXkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvY2F0ZWdvcnlfYnJvd3Nlci5qc3A/Iik7Ci0gICAgYWRkU2Vzc2lvbkFuZFRNb2RlbEtleShhY3Rpb25MaW5rLHNlc3Npb25JZCxjYXRlZ29yeVRNb2RlbEtleSk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Q2F0ZWdvcnlDb250ZW50UGFnZShTdHJpbmcgc2Vzc2lvbklkLFN0cmluZyBjYXRlZ29yeVRNb2RlbEtleSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9jYXRlZ29yeV9jb250ZW50LmpzcD8iKTsKLSAgICBhZGRTZXNzaW9uQW5kVE1vZGVsS2V5KGFjdGlvbkxpbmssc2Vzc2lvbklkLGNhdGVnb3J5VE1vZGVsS2V5KTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRXaWxkQ2FyZEFjdGlvbkxpbmsoU3RyaW5nIHNlc3Npb25JZCkKLSAgewotICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKHNlc3Npb25JZCwiJSIpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9PcGVuUmVnaXN0cnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvT3BlblJlZ2lzdHJ5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyODhjN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9PcGVuUmVnaXN0cnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwOTEyICAgMTQxNzk2IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkNhdGVnb3J5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuVURESU1haW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElNYWluTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsSW5mbzsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlRNb2RlbEluZm9zOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsTGlzdDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIE9wZW5SZWdpc3RyeUFjdGlvbiBleHRlbmRzIFVERElQcm9wZXJ0aWVzRm9ybUFjdGlvbgotewotICBwdWJsaWMgT3BlblJlZ2lzdHJ5QWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIC8vIFNlbGVjdCBVRERJIE1haW4uCi0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHJlZ2lzdHJ5TmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5SRUdJU1RSWV9OQU1FKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCk7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSF9VUkwpOwotICAgIFN0cmluZyB1c2VybmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5VRERJX1VTRVJOQU1FKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuVURESV9QQVNTV09SRCk7Ci0gICAgU3RyaW5nIGNoZWNrVXNlckRlZmluZWRDYXRlZ29yaWVzQ2hlY2tlZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUyk7Ci0gICAgU3RyaW5nIGNhdGVnb3JpZXNEaXJlY3RvcnkgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUklFU19ESVJFQ1RPUlkpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0gICAgaWYgKHJlZ2lzdHJ5TmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSxyZWdpc3RyeU5hbWUpOwotCi0gICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcocmVnaXN0cnlOYW1lKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfUkVHSVNUUllfTkFNRSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoaW5xdWlyeVVSTCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuSU5RVUlSWV9VUkwsaW5xdWlyeVVSTCk7Ci0gICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVVUkwoaW5xdWlyeVVSTCkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9JTlFVSVJZX1VSTCIpKTsKLSAgICB9Ci0KLSAgICBpZiAocHVibGlzaFVSTCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSF9VUkwsIHB1Ymxpc2hVUkwpOwotICAgIAotICAgIGlmICh1c2VybmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuVURESV9VU0VSTkFNRSwgdXNlcm5hbWUpOwotCi0gICAgaWYgKHBhc3N3b3JkICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5VRERJX1BBU1NXT1JELCBwYXNzd29yZCk7Ci0KLSAgICBpZiAoY2hlY2tVc2VyRGVmaW5lZENhdGVnb3JpZXNDaGVja2VkICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUyxjaGVja1VzZXJEZWZpbmVkQ2F0ZWdvcmllc0NoZWNrZWQpOwotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuQ0hFQ0tfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMpOwotICAgICAgCi0gICAgaWYgKGNhdGVnb3JpZXNEaXJlY3RvcnkgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JJRVNfRElSRUNUT1JZLGNhdGVnb3JpZXNEaXJlY3RvcnkpOwotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUklFU19ESVJFQ1RPUlkpOwotCi0gICAgZm9ybVRvb2wudXBkYXRlUHJvcGVydHlUYWJsZShwcm9wZXJ0eVRhYmxlXyk7Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZ2F0aGVyV1NVc2VyRGVmaW5lZENhdGVnb3JpZXMoVURESVByb3h5IHByb3h5LEhhc2h0YWJsZSBjYXRlZ29yeU1vZGVscykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIENhdGVnb3J5QmFnIGNhdGVnb3J5QmFnID0gbmV3IENhdGVnb3J5QmFnKCk7Ci0gICAgICBjYXRlZ29yeUJhZy5hZGQobmV3IEtleWVkUmVmZXJlbmNlKCIiLCJjYXRlZ29yaXphdGlvbiIsVE1vZGVsLlRZUEVTX1RNT0RFTF9LRVkpKTsKLSAgICAgIFRNb2RlbExpc3QgdE1vZGVsTGlzdCA9IHByb3h5LmZpbmRfdE1vZGVsKCIlIixjYXRlZ29yeUJhZyxudWxsLG51bGwsMTAwKTsKLSAgICAgIFRNb2RlbEluZm9zIHRNb2RlbEluZm9zID0gdE1vZGVsTGlzdC5nZXRUTW9kZWxJbmZvcygpOwotICAgICAgVmVjdG9yIHRNb2RlbEtleVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHRNb2RlbEluZm9zLnNpemUoKTtpKyspCi0gICAgICB7Ci0gICAgICAgIFRNb2RlbEluZm8gdE1vZGVsSW5mbyA9IHRNb2RlbEluZm9zLmdldChpKTsKLSAgICAgICAgdE1vZGVsS2V5VmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsSW5mby5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgICB9Ci0gICAgICBUTW9kZWxEZXRhaWwgdE1vZGVsRGV0YWlsID0gcHJveHkuZ2V0X3RNb2RlbERldGFpbCh0TW9kZWxLZXlWZWN0b3IpOwotICAgICAgVmVjdG9yIHRNb2RlbFZlY3RvciA9IHRNb2RlbERldGFpbC5nZXRUTW9kZWxWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHRNb2RlbFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbCl0TW9kZWxWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICBib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNhdGVnb3J5S2V5ID0gbnVsbDsKLSAgICAgICAgY2F0ZWdvcnlCYWcgPSB0TW9kZWwuZ2V0Q2F0ZWdvcnlCYWcoKTsKLSAgICAgICAgZm9yIChpbnQgaj0wO2o8Y2F0ZWdvcnlCYWcuc2l6ZSgpO2orKykKLSAgICAgICAgewotICAgICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gY2F0ZWdvcnlCYWcuZ2V0KGopOwotICAgICAgICAgIFN0cmluZyBrclRNb2RlbEtleSA9IGtyLmdldFRNb2RlbEtleSgpOwotICAgICAgICAgIGlmIChrclRNb2RlbEtleS5lcXVhbHNJZ25vcmVDYXNlKFRNb2RlbC5HRU5FUkFMX0tFWVdPUkRTX1RNT0RFTF9LRVkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrcktleU5hbWUgPSBrci5nZXRLZXlOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoa3JLZXlOYW1lLmVxdWFscygidXJuOngtaWJtOnVkZGk6Y3VzdG9tVGF4b25vbXk6a2V5IikpCi0gICAgICAgICAgICAgIGNhdGVnb3J5S2V5ID0ga3IuZ2V0S2V5VmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGtyS2V5TmFtZS5lcXVhbHMoInVybjp4LWlibTp1ZGRpOmN1c3RvbVRheG9ub215OmRpc3BsYXlOYW1lIikpCi0gICAgICAgICAgICAgIGRpc3BsYXlOYW1lID0ga3IuZ2V0S2V5VmFsdWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoa3JUTW9kZWxLZXkuZXF1YWxzSWdub3JlQ2FzZShUTW9kZWwuVFlQRVNfVE1PREVMX0tFWSkpCi0gICAgICAgICAgICBjaGVja2VkID0ga3IuZ2V0S2V5VmFsdWUoKS5lcXVhbHMoImNoZWNrZWQiKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpZiAoY2F0ZWdvcnlLZXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgZGlzcGxheU5hbWUgPSB0TW9kZWwuZ2V0TmFtZVN0cmluZygpOwotICAgICAgICAgIENhdGVnb3J5TW9kZWwgY2F0ZWdvcnlNb2RlbCA9IG5ldyBDYXRlZ29yeU1vZGVsKCk7Ci0gICAgICAgICAgY2F0ZWdvcnlNb2RlbC5zZXRDYXRlZ29yeUtleShjYXRlZ29yeUtleSk7Ci0gICAgICAgICAgY2F0ZWdvcnlNb2RlbC5lbmFibGVDaGVja2VkKGNoZWNrZWQpOwotICAgICAgICAgIGNhdGVnb3J5TW9kZWwuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOwotICAgICAgICAgIFN0cmluZyB0TW9kZWxLZXkgPSB0TW9kZWwuZ2V0VE1vZGVsS2V5KCk7Ci0gICAgICAgICAgY2F0ZWdvcnlNb2RlbC5zZXRUTW9kZWxLZXkodE1vZGVsS2V5KTsKLSAgICAgICAgICBjYXRlZ29yeU1vZGVscy5wdXQodE1vZGVsS2V5LGNhdGVnb3J5TW9kZWwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyByZWdpc3RyeU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUpOwotICAgICAgU3RyaW5nIGlucXVpcnlVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMKTsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgcmVnaXN0cmF0aW9uVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5SRUdJU1RSQVRJT05fVVJMKTsKLSAgICAgIFN0cmluZyB1c2VybmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuVURESV9VU0VSTkFNRSk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlVERElfUEFTU1dPUkQpOwotICAgICAgYm9vbGVhbiBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllc0NoZWNrZWQgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuQ0hFQ0tfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMpICE9IG51bGwpOwotICAgICAgU3RyaW5nIGNhdGVnb3JpZXNEaXJlY3RvcnkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JJRVNfRElSRUNUT1JZKTsKLQotICAgICAgU3RyaW5nIHJlY29nbml6ZWRQdWJsaXNoVVJMID0gdWRkaVBlcnNwZWN0aXZlLmdldEtub3duUmVnaXN0cnlQdWJsaXNoVVJMKGlucXVpcnlVUkwpOwotICAgICAgU3RyaW5nIHJlY29nbml6ZWRSZWdpc3RyYXRpb25VUkwgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0S25vd25SZWdpc3RyeVJlZ2lzdHJhdGlvblVSTChpbnF1aXJ5VVJMKTsKLSAgICAgIAotICAgICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgICAgcHVibGlzaFVSTCA9IHJlY29nbml6ZWRQdWJsaXNoVVJMOwotICAgICAgaWYgKHJlZ2lzdHJhdGlvblVSTCA9PSBudWxsKQotICAgICAgICByZWdpc3RyYXRpb25VUkwgPSByZWNvZ25pemVkUmVnaXN0cmF0aW9uVVJMOwotICAgICAgICAKLSAgICAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKShjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0Um9vdE5vZGUoKSk7Ci0gICAgICBVRERJTWFpbkVsZW1lbnQgdWRkaU1haW5FbGVtZW50ID0gKFVERElNYWluRWxlbWVudCl1ZGRpTWFpbk5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgcHJvcHMucHV0KEFjdGlvbklucHV0cy5UUkFOU1BPUlRfQ0xBU1NfTkFNRSwgQWN0aW9uSW5wdXRzLlRSQVNQT1JUX0NMQVNTKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IG5ldyBVRERJUHJveHkocHJvcHMpOwotICAgICAgcHJveHkuc2V0SW5xdWlyeVVSTChuZXcgVVJMKGlucXVpcnlVUkwpKTsKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdpc3RyeUVsZW1lbnQgPSBuZXcgUmVnaXN0cnlFbGVtZW50KHByb3h5LGlucXVpcnlVUkwscmVnaXN0cnlOYW1lLHVkZGlNYWluRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICAgIC8vIFNldCByZWdpc3RyeSBlbGVtZW50J3MgcHVibGlzaCBVUkwgYW5kIHJlZ2lzdHJhdGlvbiBVUkwgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgY2FsbGVycyAoZS5nLiBmYXZvcml0ZXMpLgotICAgICAgaWYgKHB1Ymxpc2hVUkwgIT0gbnVsbCkKLSAgICAgICAgcmVnaXN0cnlFbGVtZW50LnNldENhY2hlZFB1Ymxpc2hVUkwocHVibGlzaFVSTCk7Ci0gICAgICBpZiAocmVnaXN0cmF0aW9uVVJMICE9IG51bGwpCi0gICAgICAgIHJlZ2lzdHJ5RWxlbWVudC5zZXRSZWdpc3RyYXRpb25VUkwocmVnaXN0cmF0aW9uVVJMKTsKLSAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsKQotICAgICAgCXJlZ2lzdHJ5RWxlbWVudC5zZXRVc2VySWQodXNlcm5hbWUpOwotICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpCi0gICAgICAJcmVnaXN0cnlFbGVtZW50LnNldENyZWQocGFzc3dvcmQpOwotICAgICAgcmVnaXN0cnlFbGVtZW50LnNldENoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzKGNoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzQ2hlY2tlZCk7Ci0gICAgICBpZiAoY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXNDaGVja2VkKQotICAgICAgewotICAgICAgICBIYXNodGFibGUgY2F0ZWdvcnlNb2RlbHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGdhdGhlcldTVXNlckRlZmluZWRDYXRlZ29yaWVzKHByb3h5LGNhdGVnb3J5TW9kZWxzKTsKLSAgICAgICAgaWYgKGNhdGVnb3J5TW9kZWxzLnNpemUoKSA+IDApCi0gICAgICAgICAgcmVnaXN0cnlFbGVtZW50LnNldFVzZXJEZWZpbmVkQ2F0ZWdvcmllcyhjYXRlZ29yeU1vZGVscyk7Ci0gICAgICB9Ci0gICAgICByZWdpc3RyeUVsZW1lbnQuc2V0Q2F0ZWdvcmllc0RpcmVjdG9yeShjYXRlZ29yaWVzRGlyZWN0b3J5KTsKLSAgICAgIHVkZGlNYWluRWxlbWVudC5jb25uZWN0KHJlZ2lzdHJ5RWxlbWVudCxVRERJTW9kZWxDb25zdGFudHMuUkVMX1JFR0lTVFJJRVMsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gdWRkaU1haW5Ob2RlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICBpbnQgbmV3UmVnaXN0cnlOb2RlSWQgPSB1ZGRpTWFpbk5vZGUuZ2V0Q2hpbGROb2RlKHJlZ2lzdHJ5RWxlbWVudCkuZ2V0Tm9kZUlkKCk7Ci0gICAgICAvLyBTZWxlY3QgdGhlIG5ldyByZWdpc3RyeSBub2RlIGFuZCBhZGQgdGhlIHNlbGVjdCBhY3Rpb24gdG8gdGhlIGhpc3RvcnkuCi0gICAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChuZXdSZWdpc3RyeU5vZGVJZCk7Ci0gICAgICBOb2RlIHJlZ2lzdHJ5Tm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSByZWdpc3RyeU5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgICBhZGRUb0hpc3RvcnkoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREksdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCkuZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYodHJ1ZSkpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1JFR0lTVFJZX09QRU5FRCIsbmV3IFN0cmluZ1tde3JlZ2lzdHJ5TmFtZSxpbnF1aXJ5VVJMfSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuSU5RVUlSWV9VUkwpOwotICAgIH0KLSAgICAvKgotICAgIGNhdGNoIChGb3JtSW5wdXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgICovCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1B1Ymxpc2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUHVibGlzaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmM5ZDhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUHVibGlzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlclRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESU1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5CdXNpbmVzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlB1Ymxpc2hlZEl0ZW1zRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5TZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUludGVyZmFjZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUmVnaXN0cnlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFB1Ymxpc2hBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBzdWJRdWVyeUtleV87Ci0gIHByb3RlY3RlZCBib29sZWFuIHN1YlF1ZXJ5SW5pdGlhdGVkXzsKLSAgcHJvdGVjdGVkIFN0cmluZyBuZXdTdWJRdWVyeV87Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzU3ViUXVlcnlHZXRfOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld1N1YlF1ZXJ5SXRlbV87Ci0gIHByb3RlY3RlZCBSZWdpc3RyeU5vZGUgcmVnTm9kZV87Ci0KLSAgcHVibGljIFB1Ymxpc2hBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgc3ViUXVlcnlLZXlfID0gbnVsbDsKLSAgICBpc1N1YlF1ZXJ5R2V0XyA9IGZhbHNlOwotICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IGZhbHNlOwotICAgIHJlZ05vZGVfID0gZ2V0UmVnaXN0cnlOb2RlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTZXR1cCBmb3IgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcgotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTVVMVElQQVJUX0ZPUk1fREFUQV9QQVJTRVIsIHBhcnNlcik7Ci0gCi0gICAgbmV3U3ViUXVlcnlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQpOwotICAgIFN0cmluZyBpc1N1YlF1ZXJ5R2V0U3RyaW5nID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCk7Ci0gICAgbmV3U3ViUXVlcnlJdGVtXyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSk7Ci0gICAgc3ViUXVlcnlLZXlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleV8pOwotICAgIGZvcm1Ub29sUEkuY2xlYXJFcnJvcnMoKTsKLQotICAgIGlmIChuZXdTdWJRdWVyeV8gIT0gbnVsbCAmJiBuZXdTdWJRdWVyeV8ubGVuZ3RoKCkgPiAwKQotICAgICAgc3ViUXVlcnlJbml0aWF0ZWRfID0gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICBzdWJRdWVyeUluaXRpYXRlZF8gPSBmYWxzZTsKLQotICAgIGlmIChpc1N1YlF1ZXJ5R2V0U3RyaW5nICE9IG51bGwpCi0gICAgICBpc1N1YlF1ZXJ5R2V0XyA9IEJvb2xlYW4udmFsdWVPZihpc1N1YlF1ZXJ5R2V0U3RyaW5nKS5ib29sZWFuVmFsdWUoKTsKLQotICAgIGlmICghcHJvY2Vzc090aGVycyhwYXJzZXIsZm9ybVRvb2xQSSkgJiYgIXN1YlF1ZXJ5SW5pdGlhdGVkXykKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0KLSAgICBmb3IgKGludCBpPTA7aTxyZW1vdmVkUHJvcGVydGllc18uc2l6ZSgpO2krKykKLSAgICAgIGZvcm1Ub29sUEkucmVtb3ZlUHJvcGVydHkocmVtb3ZlZFByb3BlcnRpZXNfLmVsZW1lbnRBdChpKSk7Ci0gICAgZm9ybVRvb2xQSS51cGRhdGVQcm9wZXJ0eVRhYmxlKHByb3BlcnR5VGFibGVfKTsKLQotICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLQotICAgIGJvb2xlYW4gdmFsaWRhdGVBdXRoZW50aWNhdGlvbiA9ICFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKTsKLQotICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIH0KLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmIHZhbGlkYXRlQXV0aGVudGljYXRpb24gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhwdWJsaXNoVVJMKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMIikpOwotICAgIH0KLQotICAgIGlmICh1c2VySWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgfQotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgdmFsaWRhdGVBdXRoZW50aWNhdGlvbiAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHVzZXJJZCkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEIikpOwotICAgIH0KLQotICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIH0KLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFB1Ymxpc2hlZEl0ZW1Ob2RlKEJ1c2luZXNzRW50aXR5IGJlLFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgQnVzaW5lc3NFbGVtZW50IGJlRWxlbWVudCA9IG5ldyBCdXNpbmVzc0VsZW1lbnQoYmUscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICBQdWJsaXNoZWRJdGVtc0VsZW1lbnQgcHVibGlzaGVkQnVzaW5lc3Nlc0VsZW1lbnQgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hlZEJ1c2luZXNzZXNFbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IHB1Ymxpc2hlZEJ1c2luZXNzZXNFbGVtZW50LmdldEl0ZW1zKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgQnVzaW5lc3NFbGVtZW50IGVsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGVsZW1lbnRCRSA9IGVsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKTsKLSAgICAgIGlmIChlbGVtZW50QkUuZ2V0QnVzaW5lc3NLZXkoKS5lcXVhbHMoYmUuZ2V0QnVzaW5lc3NLZXkoKSkpCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgY29ubmVjdEVsZW1lbnRzKHB1Ymxpc2hlZEJ1c2luZXNzZXNFbGVtZW50LGJlRWxlbWVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRQdWJsaXNoZWRJdGVtTm9kZShCdXNpbmVzc1NlcnZpY2UgYnMsUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTZXJ2aWNlRWxlbWVudCBzRWxlbWVudCA9IG5ldyBTZXJ2aWNlRWxlbWVudChicyxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBwdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VzRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBwdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQuZ2V0SXRlbXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTZXJ2aWNlRWxlbWVudCBlbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIEJ1c2luZXNzU2VydmljZSBlbGVtZW50QlMgPSBlbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpOwotICAgICAgaWYgKGVsZW1lbnRCUy5nZXRTZXJ2aWNlS2V5KCkuZXF1YWxzKGJzLmdldFNlcnZpY2VLZXkoKSkpCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgY29ubmVjdEVsZW1lbnRzKHB1Ymxpc2hlZFNlcnZpY2VzRWxlbWVudCxzRWxlbWVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRQdWJsaXNoZWRJdGVtTm9kZShUTW9kZWwgdE1vZGVsLFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KHRNb2RlbCxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBwdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlc0VsZW1lbnQgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBwdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlc0VsZW1lbnQuZ2V0SXRlbXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBlbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIFRNb2RlbCBlbGVtZW50VE1vZGVsID0gZWxlbWVudC5nZXRUTW9kZWwoKTsKLSAgICAgIGlmICh0TW9kZWwuZ2V0VE1vZGVsS2V5KCkuZXF1YWxzKGVsZW1lbnRUTW9kZWwuZ2V0VE1vZGVsS2V5KCkpKQotICAgICAgewotICAgICAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvbm5lY3RFbGVtZW50cyhwdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlc0VsZW1lbnQsc2lFbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjb25uZWN0RWxlbWVudHMoUHVibGlzaGVkSXRlbXNFbGVtZW50IHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCxUcmVlRWxlbWVudCBpdGVtRWxlbWVudCkKLSAgewotICAgIHB1Ymxpc2hlZEl0ZW1zRWxlbWVudC5jb25uZWN0KGl0ZW1FbGVtZW50LFVERElNb2RlbENvbnN0YW50cy5SRUxfUFVCTElTSEVEX0lURU1TLE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgaW50IG5ld05vZGVJZCA9IHJlZ05vZGVfLmdldENoaWxkTm9kZShwdWJsaXNoZWRJdGVtc0VsZW1lbnQpLmdldENoaWxkTm9kZShpdGVtRWxlbWVudCkuZ2V0Tm9kZUlkKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSByZWdOb2RlXy5nZXROb2RlTWFuYWdlcigpOwotICAgIG5vZGVNYW5hZ2VyLnNldFNlbGVjdGVkTm9kZUlkKG5ld05vZGVJZCk7Ci0gICAgTm9kZSBuZXdOb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSBuZXdOb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgVG9vbCBzZWxlY3RlZFRvb2wgPSB0b29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICBhZGRUb0hpc3RvcnkoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREksc2VsZWN0ZWRUb29sLmdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKHRydWUpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3ViUXVlcnlJbml0aWF0ZWQoKQotICB7Ci0gICAgcmV0dXJuIHN1YlF1ZXJ5SW5pdGlhdGVkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3ViUXVlcnlHZXQoKQotICB7Ci0gICAgcmV0dXJuIGlzU3ViUXVlcnlHZXRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdWJRdWVyeUtleSgpCi0gIHsKLSAgICByZXR1cm4gc3ViUXVlcnlLZXlfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROZXdTdWJRdWVyeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3U3ViUXVlcnlfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROZXdTdWJRdWVyeUl0ZW0oKQotICB7Ci0gICAgcmV0dXJuIG5ld1N1YlF1ZXJ5SXRlbV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoICsgMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRUcmFuc2Zvcm1lcnMsIDAsIHRyYW5zZm9ybWVycywgMCwgcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCk7Ci0gICAgdHJhbnNmb3JtZXJzW3RyYW5zZm9ybWVycy5sZW5ndGggLSAxXSA9IG5ldyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlclRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTkyZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkFkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQnVzaW5lc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlNlcnZpY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5TZXJ2aWNlSW50ZXJmYWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5CdXNpbmVzc05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUHVibGlzaGVkSXRlbXNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlF1ZXJ5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5RdWVyeVBhcmVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUmVnaXN0cnlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlNlcnZpY2VJbnRlcmZhY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlNlcnZpY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFVERElOb2RlQWN0aW9uIGV4dGVuZHMgVURESU5vZGVBY3Rpb24KLXsKLSAgcHJpdmF0ZSBWZWN0b3Igc3RhbGVOb2Rlc187Ci0gIHB1YmxpYyBSZWZyZXNoVURESU5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsU3RyaW5nLnZhbHVlT2YoY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlSWQoKSkpOwotICAgIHN0YWxlTm9kZXNfID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZUFjdGlvbkpTUC5qc3A/bm9kZUlkPS4uLgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiB2ZXJpZnlOb2RlRGF0YSgpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKTsKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEJ1c2luZXNzTm9kZSkKLSAgICAgIHJldHVybiByZWZyZXNoQnVzaW5lc3NFbGVtZW50KChCdXNpbmVzc05vZGUpbm9kZSk7Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VOb2RlKQotICAgICAgcmV0dXJuIHJlZnJlc2hTZXJ2aWNlRWxlbWVudCgoU2VydmljZU5vZGUpbm9kZSk7Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VOb2RlKQotICAgICAgcmV0dXJuIHJlZnJlc2hTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCgoU2VydmljZUludGVyZmFjZU5vZGUpbm9kZSk7Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFF1ZXJ5Tm9kZSkKLSAgICB7Ci0gICAgICAvLyBOb3RoaW5nIHRvIHZlcmlmeQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBSZWdpc3RyeU5vZGUKLSAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgUmVnaXN0cnlOb2RlKQotICAgICAgICByZWZyZXNoUmVnaXN0cnlFbGVtZW50KChSZWdpc3RyeU5vZGUpbm9kZSk7Ci0gICAgICAgIAotICAgICAgLy8gRm9sZGVyTm9kZXMKLSAgICAgIFZlY3RvciBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBWZWN0b3IgcmVmcmVzaEFjdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjaGlsZE5vZGVzLnNpemUoKTtpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpY2hpbGROb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgIFJlZnJlc2hVRERJTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVmcmVzaFVERElOb2RlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgYWN0aW9uLnNldFN0YWxlTm9kZXMoc3RhbGVOb2Rlc18pOwotICAgICAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgICAgIFN0cmluZyBjaGlsZE5vZGVJZFN0cmluZyA9IFN0cmluZy52YWx1ZU9mKGNoaWxkTm9kZS5nZXROb2RlSWQoKSk7Ci0gICAgICAgIHByb3BlcnR5VGFibGUucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsY2hpbGROb2RlSWRTdHJpbmcpOwotICAgICAgICBpZiAoIWFjdGlvbi52ZXJpZnlOb2RlRGF0YSgpKQotICAgICAgICAgIHN0YWxlTm9kZXNfLmFkZEVsZW1lbnQoY2hpbGROb2RlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJlZnJlc2hBY3Rpb25zLmFkZEVsZW1lbnQoYWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QscmVmcmVzaEFjdGlvbnMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHZvaWQgcmVmcmVzaFJlZ2lzdHJ5RWxlbWVudChSZWdpc3RyeU5vZGUgcmVnTm9kZSkKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgSGFzaHRhYmxlIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IG51bGw7Ci0gICAgaWYgKHJlZ0VsZW1lbnQuZ2V0Q2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXMoKSkKLSAgICB7Ci0gICAgICB1c2VyRGVmaW5lZENhdGVnb3JpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBPcGVuUmVnaXN0cnlBY3Rpb24gb3BlblJlZ0FjdGlvbiA9IG5ldyBPcGVuUmVnaXN0cnlBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgb3BlblJlZ0FjdGlvbi5nYXRoZXJXU1VzZXJEZWZpbmVkQ2F0ZWdvcmllcyhyZWdFbGVtZW50LmdldFByb3h5KCksdXNlckRlZmluZWRDYXRlZ29yaWVzKTsKLSAgICAgIGlmICghdXNlckRlZmluZWRDYXRlZ29yaWVzLmtleXMoKS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgdXNlckRlZmluZWRDYXRlZ29yaWVzID0gbnVsbDsKLSAgICAgICAgcmVnTm9kZS5zZXRJbWFnZVBhdGgoUmVnaXN0cnlOb2RlLklNQUdFX1BBVEhfU1RBTkRBUkQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgY2F0ZWdvcmllc0RpcmVjdG9yeSA9IHJlZ0VsZW1lbnQuZ2V0Q2F0ZWdvcmllc0RpcmVjdG9yeSgpOwotICAgICAgICBBZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uIGFkZEFjdGlvbiA9IG5ldyBBZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgaWYgKGNhdGVnb3JpZXNEaXJlY3RvcnkgIT0gbnVsbCkKLSAgICAgICAgICBhZGRBY3Rpb24ubGlua0NhdGVnb3J5TW9kZWxzV2l0aFNhdmVkRGF0YSh1c2VyRGVmaW5lZENhdGVnb3JpZXMuZWxlbWVudHMoKSxjYXRlZ29yaWVzRGlyZWN0b3J5KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGFkZEFjdGlvbi5saW5rQ2F0ZWdvcnlNb2RlbHNXaXRoU2F2ZWREYXRhKHJlZ0VsZW1lbnQuZ2V0TmFtZSgpLHVzZXJEZWZpbmVkQ2F0ZWdvcmllcy5lbGVtZW50cygpKTsKLSAgICAgICAgcmVnTm9kZS5zZXRJbWFnZVBhdGgoUmVnaXN0cnlOb2RlLklNQUdFX1BBVEhfV0lUSF9VU0VSX0RFRklORURfQ0FURUdPUklFUyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJlZ0VsZW1lbnQuc2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVmcmVzaEJ1c2luZXNzRWxlbWVudChCdXNpbmVzc05vZGUgYnVzTm9kZSkKLSAgewotICAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClidXNOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHV1aWRLZXkgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uIHZlcmlmeUFjdGlvbiA9IG5ldyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IHZlcmlmeUFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSx1dWlkS2V5KTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFRlJFU0hfTk9ERSxidXNOb2RlKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFLEJvb2xlYW4uVFJVRSk7Ci0gICAgYm9vbGVhbiB2ZXJpZnlSZXN1bHQgPSB2ZXJpZnlBY3Rpb24ucnVuKCk7Ci0gICAgaWYgKHZlcmlmeVJlc3VsdCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QsbmV3IEJ1c2luZXNzRWxlbWVudCgoQnVzaW5lc3NFbnRpdHkpcHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKSxidXNFbGVtZW50LmdldE1vZGVsKCkpKTsKLSAgICByZXR1cm4gdmVyaWZ5UmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlZnJlc2hTZXJ2aWNlRWxlbWVudChTZXJ2aWNlTm9kZSBzZXJ2aWNlTm9kZSkKLSAgewotICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KXNlcnZpY2VOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHV1aWRLZXkgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKS5nZXRTZXJ2aWNlS2V5KCk7Ci0gICAgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uIHZlcmlmeUFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gdmVyaWZ5QWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVksdXVpZEtleSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5SRUZSRVNIX05PREUsc2VydmljZU5vZGUpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUsQm9vbGVhbi5UUlVFKTsKLSAgICBib29sZWFuIHZlcmlmeVJlc3VsdCA9IHZlcmlmeUFjdGlvbi5ydW4oKTsKLSAgICBpZiAodmVyaWZ5UmVzdWx0KQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxuZXcgU2VydmljZUVsZW1lbnQoKEJ1c2luZXNzU2VydmljZSlwcm9wZXJ0eVRhYmxlLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpLHNlcnZpY2VFbGVtZW50LmdldE1vZGVsKCkpKTsKLSAgICByZXR1cm4gdmVyaWZ5UmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlZnJlc2hTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudChTZXJ2aWNlSW50ZXJmYWNlTm9kZSBzaU5vZGUpCi0gIHsKLSAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBzaUVsZW1lbnQgPSAoU2VydmljZUludGVyZmFjZUVsZW1lbnQpc2lOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHV1aWRLZXkgPSBzaUVsZW1lbnQuZ2V0VE1vZGVsKCkuZ2V0VE1vZGVsS2V5KCk7Ci0gICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uIHZlcmlmeUFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gdmVyaWZ5QWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZLHV1aWRLZXkpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUkVGUkVTSF9OT0RFLHNpTm9kZSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSxCb29sZWFuLlRSVUUpOwotICAgIGJvb2xlYW4gdmVyaWZ5UmVzdWx0ID0gdmVyaWZ5QWN0aW9uLnJ1bigpOwotICAgIGlmICh2ZXJpZnlSZXN1bHQpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNULG5ldyBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCgoVE1vZGVsKXByb3BlcnR5VGFibGUuZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCksc2lFbGVtZW50LmdldE1vZGVsKCkpKTsKLSAgICByZXR1cm4gdmVyaWZ5UmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgY29ubmVjdEVsZW1lbnRzKE5vZGUgcGFyZW50Tm9kZSxUcmVlRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgVHJlZUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IHBhcmVudE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgcmVsID0gbnVsbDsKLSAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIFB1Ymxpc2hlZEl0ZW1zTm9kZSkKLSAgICAgIHJlbCA9IFVERElNb2RlbENvbnN0YW50cy5SRUxfUFVCTElTSEVEX0lURU1TOwotICAgIGVsc2UgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBRdWVyeU5vZGUpCi0gICAgICByZWwgPSBVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJZX1JFU1VMVFM7Ci0gICAgZWxzZSBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIFF1ZXJ5UGFyZW50Tm9kZSkKLSAgICAgIHJlbCA9IFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUklFUzsKLSAgICBwYXJlbnRFbGVtZW50LmNvbm5lY3QobmV3RWxlbWVudCxyZWwsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICBOb2RlIG5ld05vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShuZXdFbGVtZW50KTsKLSAgICBpbnQgbmV3Tm9kZUlkID0gbmV3Tm9kZS5nZXROb2RlSWQoKTsKLSAgICBub2RlTWFuYWdlcl8uc2V0U2VsZWN0ZWROb2RlSWQobmV3Tm9kZUlkKTsKLSAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IG5ld05vZGUuZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIGFkZFRvSGlzdG9yeShBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESSxzZWxlY3RlZFRvb2wuZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYodHJ1ZSkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaWYgKCFpc1N0YWxlTm9kZShub2RlSWQpKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJZCk7Ci0gICAgICBPYmplY3QgbGF0ZXN0T2JqZWN0ID0gcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCk7Ci0gICAgICBpZiAobGF0ZXN0T2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYXRlc3RPYmplY3QgaW5zdGFuY2VvZiBWZWN0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICBWZWN0b3IgcmVmcmVzaEFjdGlvbnMgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpOwotICAgICAgICAgIGZvciAoaW50IGk9MDtpPHJlZnJlc2hBY3Rpb25zLnNpemUoKTtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVmcmVzaFVERElOb2RlQWN0aW9uIHJlZnJlc2hBY3Rpb24gPSAoUmVmcmVzaFVERElOb2RlQWN0aW9uKXJlZnJlc2hBY3Rpb25zLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIHJlZnJlc2hBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIG5vZGVNYW5hZ2VyXy5zZXRTZWxlY3RlZE5vZGVJZChub2RlSWQpOyAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgVHJlZUVsZW1lbnQgb2xkRWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgICBvbGRFbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICAgICAgICBjb25uZWN0RWxlbWVudHMobm9kZS5nZXRQYXJlbnQoKSwoVHJlZUVsZW1lbnQpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFF1ZXJ5Tm9kZXMKLSAgICAgICAgUXVlcnlOb2RlIHF1ZXJ5Tm9kZSA9IChRdWVyeU5vZGUpbm9kZTsKLSAgICAgICAgRmluZEFjdGlvbiBmaW5kQWN0aW9uID0gcXVlcnlOb2RlLmdldEZpbmRBY3Rpb24oKTsKLSAgICAgICAgZmluZEFjdGlvbi5zZXRSZWZyZXNoQWN0aW9uKHRydWUpOwotICAgICAgICBpZiAoIWZpbmRBY3Rpb24ucnVuKCkpCi0gICAgICAgICAgcXVlcnlOb2RlLnJlbW92ZUNoaWxkTm9kZXModHJ1ZSk7Ci0gICAgICAgIGZpbmRBY3Rpb24uc2V0UmVmcmVzaEFjdGlvbihmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fTk9ERV9SRUZSRVNIRUQiLG5vZGUuZ2V0Tm9kZU5hbWUoKSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFZlY3RvciBnZXRTdGFsZU5vZGVzKCkKLSAgewotICAgIHJldHVybiBzdGFsZU5vZGVzXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0U3RhbGVOb2RlcyhWZWN0b3Igc3RhbGVOb2RlcykKLSAgewotICAgIHN0YWxlTm9kZXNfID0gc3RhbGVOb2RlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlYjFmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLQotcHVibGljIGNsYXNzIFJlZnJlc2hVRERJTm9kZXNBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJpdmF0ZSBWZWN0b3Igc3RhbGVOb2Rlc187Ci0KLSAgcHVibGljIFJlZnJlc2hVRERJTm9kZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgc3RhbGVOb2Rlc18gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nW10gc2VsZWN0ZWROb2RlSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAvLyBUaGUgY2xpZW50IEphdmFzY3JpcHQgZW5mb3JjZXMgdGhlIHJ1bGUgdGhhdCBhdCBsZWFzdCBvbmUgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHRoZSBmb3JtIGNhbiBiZSBzdWJtaXR0ZWQuCi0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyxzZWxlY3RlZE5vZGVJZHMpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIGludCBjb2xsZWN0b3JOb2RlSWQgPSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXROb2RlSWQoKTsKLSAgICBTdHJpbmdbXSBzZWxlY3RlZE5vZGVJZHMgPSAoU3RyaW5nW10pcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyk7Ci0gICAgUmVmcmVzaFVERElOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWZyZXNoVURESU5vZGVBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBmb3IgKGludCBpPTA7aTxzZWxlY3RlZE5vZGVJZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELHNlbGVjdGVkTm9kZUlkc1tpXSk7Ci0gICAgICBpZiAoYWN0aW9uLnZlcmlmeU5vZGVEYXRhKCkpCi0gICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoc2VsZWN0ZWROb2RlSWRzW2ldKTsKLSAgICAgICAgc3RhbGVOb2Rlc18uYWRkRWxlbWVudChuYXZpZ2F0b3JNYW5hZ2VyLmdldE5vZGUobm9kZUlkKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9ERV9EQVRBX1ZBTElEQVRJT05fRkFJTEVEIixuYXZpZ2F0b3JNYW5hZ2VyLmdldE5vZGUobm9kZUlkKS5nZXROb2RlTmFtZSgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG5hdmlnYXRvck1hbmFnZXIuc2V0U2VsZWN0ZWROb2RlSWQoY29sbGVjdG9yTm9kZUlkKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBWZWN0b3IgZ2V0U3RhbGVOb2RlcygpCi0gIHsKLSAgICByZXR1cm4gc3RhbGVOb2Rlc187Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlM2Q4YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkZvcm1JbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlF1ZXJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfVVVJRCkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB1dWlkS2V5ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfS0VZKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIAotICAgIGlmICh1dWlkS2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSx1dWlkS2V5KTsKLSAgICAgIAotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcodXVpZEtleSkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VVSURfS0VZIikpOwotICAgIH0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOyAgICAgIAotICAgICAgU3RyaW5nIHV1aWRLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKTsKLSAgICAgIAotICAgICAgLy8gVGhlIGFjdGlvbiBjYW4gYmUgcnVuIHVuZGVyIHRoZSBjb250ZXh0IG9mIGVpdGhlciBhIHJlZ2lzdHJ5IG9yIGEgcXVlcnkgbm9kZSBvciBldmVuIFVERElNYWluTm9kZS4KLSAgICAgIGlmIChyZWdOb2RlXyA9PSBudWxsKQotICAgICAgICByZWdOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgoTm9kZSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5SRUZSRVNIX05PREUpKTsKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgQnVzaW5lc3NFbnRpdHlbXSBiZUxpc3QgPSBuZXcgQnVzaW5lc3NFbnRpdHlbMV07Ci0gICAgICBWZWN0b3IgYmVWZWN0b3IgPSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwodXVpZEtleSkuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLSAgICAgIGlmIChiZVZlY3Rvci5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBiZVZlY3Rvci50b0FycmF5KGJlTGlzdCk7Ci0gICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcXVlcnlOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FKTsKLSAgICAgICAgICBxdWVyeUVsZW1lbnRfID0gbmV3IFF1ZXJ5RWxlbWVudChiZUxpc3QscXVlcnlOYW1lLHJlZ0VsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgICAgYWRkUXVlcnlOb2RlKCk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0JVU0lORVNTRVNfRk9VTkQiLFN0cmluZy52YWx1ZU9mKGJlTGlzdC5sZW5ndGgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxiZUxpc3RbMF0pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IEZvcm1JbnB1dEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0JVU0lORVNTRVNfRk9VTkQiKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRm9ybUlucHV0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWFiYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5Gb3JtSW5wdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlF1ZXJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLk5hbWU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm9zOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkRpc2NvdmVyeVVSTDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRGlzY292ZXJ5VVJMczsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcnM7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLklkZW50aWZpZXJCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5UTW9kZWxCYWc7Ci0KLXB1YmxpYyBjbGFzcyBSZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQWN0aW9uIGV4dGVuZHMgRmluZEFjdGlvbgotewotICBwdWJsaWMgUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEKSk7ICAgIAotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9TRUFSQ0hfU0VULFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1NFQVJDSF9TRVQpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfUkVTVUxUUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9SRVNVTFRTKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgb3duZWRDaGVja2VkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEKTsKLSAgICBTdHJpbmdbXSBsYW5ndWFnZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSk7Ci0gICAgU3RyaW5nW10gbmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSk7Ci0gICAgU3RyaW5nW10gaWRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX1RZUEUpOwotICAgIFN0cmluZ1tdIGlkS2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gaWRLZXlWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfVkFMVUUpOwotICAgIFN0cmluZ1tdIGNhdFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX1RZUEUpOwotICAgIFN0cmluZ1tdIGNhdEtleU5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX1ZBTFVFKTsKLSAgICBTdHJpbmdbXSBzaU5vZGVJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuTk9ERUlEX1NFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICBTdHJpbmdbXSBkaXNjb3ZlcnlVUkxWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRElTQ09WRVJZVVJMKTsKLSAgICBTdHJpbmdbXSBmaW5kUXVhbGlmaWVyVmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0ZJTkRRVUFMSUZJRVIpOwotICAgIFN0cmluZyBtYXhTZWFyY2hTZXQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1NFQVJDSF9TRVQpOwotICAgIFN0cmluZyBtYXhSZXN1bHRzID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9SRVNVTFRTKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIGdldFJlZ2lzdHJ5Tm9kZSgpOwotICAgIHJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICBpZiAob3duZWRDaGVja2VkICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19PV05FRCxvd25lZENoZWNrZWQpOwotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfT1dORUQpOwotCi0gICAgaWYgKGxhbmd1YWdlcyAhPSBudWxsICYmIG5hbWVzICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxuYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBOYW1lIHVkZGk0ak5hbWU7Ci0gICAgICAgIGlmIChsYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0ak5hbWUgPSBuZXcgTmFtZShuYW1lc1tpXSxsYW5ndWFnZXNbaV0pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldKTsKLSAgICAgICAgbmFtZVZlY3Rvci5hZGRFbGVtZW50KHVkZGk0ak5hbWUpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsbmFtZVZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMpOwotCi0gICAgaWYgKGlkVHlwZXMgIT0gbnVsbCAmJiBpZEtleU5hbWVzICE9IG51bGwgJiYgaWRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gbmV3IElkZW50aWZpZXJCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGlkS2V5TmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoaWRLZXlOYW1lc1tpXSxpZEtleVZhbHVlc1tpXSxpZFR5cGVzW2ldKTsKLSAgICAgICAgaWRCYWcuYWRkKGtyKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTLGlkQmFnKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyk7Ci0KLSAgICBpZiAoY2F0VHlwZXMgIT0gbnVsbCAmJiBjYXRLZXlOYW1lcyAhPSBudWxsICYmIGNhdEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VHlwZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoY2F0S2V5TmFtZXNbaV0sY2F0S2V5VmFsdWVzW2ldLGNhdFR5cGVzW2ldKTsKLSAgICAgICAgY2F0QmFnLmFkZChrcik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19DQVRFR09SSUVTLGNhdEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7Ci0KLSAgICBpZiAoc2lOb2RlSWRzICE9IG51bGwpCi0gICAgewotICAgICAgLy8gQWx0aG91Z2ggd2UgYWxyZWFkeSBoYXZlIHRoZSAic3VibWl0dGVkIiBkYXRhLCBkZWxldGlvbnMgb2NjdXIgb24gdGhlIGNsaWVudCBzaWRlIGFuZCB0aHVzIHRoZSBuZWVkIHRvIHRyYWNrIHRoaXMgdXNpbmcgaGlkZGVuIGZvcm0gZWxlbWVudHMuCi0gICAgICBWZWN0b3IgYnVzU2VydmljZUludGVyZmFjZXMgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgICAgaWYgKGJ1c1NlcnZpY2VJbnRlcmZhY2VzID09IG51bGwpCi0gICAgICAgIGJ1c1NlcnZpY2VJbnRlcmZhY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgZWxzZQotICAgICAgICBidXNTZXJ2aWNlSW50ZXJmYWNlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgVmVjdG9yIGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZKTsKLSAgICAgIFZlY3RvciB0TW9kZWxLZXlTdHJpbmdWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBIYXNodGFibGUgcmVzdWx0SGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHNpTm9kZUlkcy5sZW5ndGg7aSsrKQotICAgICAgICByZXN1bHRIYXNoLnB1dChzaU5vZGVJZHNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weS5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClidXNTZXJ2aWNlSW50ZXJmYWNlc0NvcHkuZWxlbWVudEF0KGkpOwotICAgICAgICBpZiAocmVzdWx0SGFzaC5nZXQoU3RyaW5nLnZhbHVlT2YobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCkpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnVzU2VydmljZUludGVyZmFjZXMuYWRkRWxlbWVudChsaXN0RWxlbWVudCk7Ci0gICAgICAgICAgVE1vZGVsIHRNb2RlbCA9IChUTW9kZWwpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgdE1vZGVsS2V5U3RyaW5nVmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsLmdldFRNb2RlbEtleSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgVE1vZGVsQmFnIHRNb2RlbEJhZyA9IG5ldyBUTW9kZWxCYWcodE1vZGVsS2V5U3RyaW5nVmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFUyxidXNTZXJ2aWNlSW50ZXJmYWNlcyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19UTU9ERUxCQUcsdE1vZGVsQmFnKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfVE1PREVMQkFHKTsKLSAgICB9Ci0KLSAgICBpZiAoZGlzY292ZXJ5VVJMVmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgRGlzY292ZXJ5VVJMcyBkaXNjb3ZlcnlVUkxzID0gbmV3IERpc2NvdmVyeVVSTHMoKTsKLSAgICAgIFZlY3RvciBkaXNjb3ZlcnlVUkxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxkaXNjb3ZlcnlVUkxWYWx1ZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgRGlzY292ZXJ5VVJMIGRpc2NvdmVyeVVSTCA9IG5ldyBEaXNjb3ZlcnlVUkwoZGlzY292ZXJ5VVJMVmFsdWVzW2ldLCIiKTsKLSAgICAgICAgZGlzY292ZXJ5VVJMVmVjdG9yLmFkZEVsZW1lbnQoZGlzY292ZXJ5VVJMKTsKLSAgICAgIH0KLSAgICAgIGRpc2NvdmVyeVVSTHMuc2V0RGlzY292ZXJ5VVJMVmVjdG9yKGRpc2NvdmVyeVVSTFZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTLGRpc2NvdmVyeVVSTHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMpOwotCi0gICAgaWYgKGZpbmRRdWFsaWZpZXJWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBGaW5kUXVhbGlmaWVycyBmaW5kUXVhbGlmaWVycyA9IG5ldyBGaW5kUXVhbGlmaWVycygpOwotICAgICAgVmVjdG9yIGZpbmRRdWFsaWZpZXJWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxmaW5kUXVhbGlmaWVyVmFsdWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEZpbmRRdWFsaWZpZXIgZmluZFF1YWxpZmllciA9IG5ldyBGaW5kUXVhbGlmaWVyKGZpbmRRdWFsaWZpZXJWYWx1ZXNbaV0pOwotICAgICAgICBmaW5kUXVhbGlmaWVyVmVjdG9yLmFkZEVsZW1lbnQoZmluZFF1YWxpZmllcik7Ci0gICAgICB9Ci0gICAgICBmaW5kUXVhbGlmaWVycy5zZXRGaW5kUXVhbGlmaWVyVmVjdG9yKGZpbmRRdWFsaWZpZXJWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRklORFFVQUxJRklFUlMsZmluZFF1YWxpZmllcnMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0ZJTkRRVUFMSUZJRVJTKTsKLQotICAgIGlmIChtYXhTZWFyY2hTZXQgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9TRUFSQ0hfU0VULG1heFNlYXJjaFNldCk7Ci0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZUludGVnZXIobWF4U2VhcmNoU2V0KSkKLSAgICB7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9TRUFSQ0hfU0VUKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9NQVhfU0VBUkNIX1NFVCIpKTsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1heFJlc3VsdHMgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9SRVNVTFRTLG1heFJlc3VsdHMpOwotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVJbnRlZ2VyKG1heFJlc3VsdHMpKQotICAgIHsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1JFU1VMVFMpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX01BWF9SRVNVTFRTIikpOwotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHJpdmF0ZSBEaXNjb3ZlcnlVUkxzIGR1cERpc2NvdmVyeVVSTHMoRGlzY292ZXJ5VVJMcyBkaXNjb3ZlcnlVUkxzLCBTdHJpbmcgdXNlVHlwZSwgU3RyaW5nIGR1cFVzZVR5cGUpIHsKLSAgICBpZiAoZGlzY292ZXJ5VVJMcyA9PSBudWxsKQotICAgICAgcmV0dXJuIGRpc2NvdmVyeVVSTHM7Ci0gICAgVmVjdG9yIGRpc2NvdmVyeVVSTFZlY3RvciA9IGRpc2NvdmVyeVVSTHMuZ2V0RGlzY292ZXJ5VVJMVmVjdG9yKCk7Ci0gICAgaWYgKGRpc2NvdmVyeVVSTFZlY3RvciA9PSBudWxsKQotICAgICAgcmV0dXJuIGRpc2NvdmVyeVVSTHM7Ci0gICAgVmVjdG9yIG5ld0Rpc2NvdmVyeVVSTFZlY3RvciA9IG5ldyBWZWN0b3IoZGlzY292ZXJ5VVJMVmVjdG9yKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZGlzY292ZXJ5VVJMVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIERpc2NvdmVyeVVSTCBkaXNjb3ZlcnlVUkwgPSAoRGlzY292ZXJ5VVJMKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmIChkaXNjb3ZlcnlVUkwuZ2V0VXNlVHlwZSgpLmVxdWFscyh1c2VUeXBlKSkgewotICAgICAgICBuZXdEaXNjb3ZlcnlVUkxWZWN0b3IuYWRkKG5ldyBEaXNjb3ZlcnlVUkwoZGlzY292ZXJ5VVJMLmdldFRleHQoKSwgZHVwVXNlVHlwZSkpOwotICAgICAgfQotICAgIH0KLSAgICBEaXNjb3ZlcnlVUkxzIG5ld0Rpc2NvdmVyeVVSTHMgPSBuZXcgRGlzY292ZXJ5VVJMcygpOwotICAgIG5ld0Rpc2NvdmVyeVVSTHMuc2V0RGlzY292ZXJ5VVJMVmVjdG9yKG5ld0Rpc2NvdmVyeVVSTFZlY3Rvcik7Ci0gICAgcmV0dXJuIG5ld0Rpc2NvdmVyeVVSTHM7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOyAgICAgIAotICAgICAgRmluZFF1YWxpZmllcnMgZmluZFF1YWxpZmllcnMgPSAoRmluZFF1YWxpZmllcnMpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRklORFFVQUxJRklFUlMpOwotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgICAgIERpc2NvdmVyeVVSTHMgZGlzY292ZXJ5VVJMcyA9IChEaXNjb3ZlcnlVUkxzKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMpOwotICAgICAgSWRlbnRpZmllckJhZyBpZGVudGlmaWVyQmFnID0gKElkZW50aWZpZXJCYWcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMpOwotICAgICAgQ2F0ZWdvcnlCYWcgY2F0ZWdvcnlCYWcgPSAoQ2F0ZWdvcnlCYWcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7Ci0gICAgICBUTW9kZWxCYWcgdE1vZGVsQmFnID0gKFRNb2RlbEJhZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19UTU9ERUxCQUcpOwotICAgICAgYm9vbGVhbiBvd25lZCA9IChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19PV05FRCkgIT0gbnVsbCk7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgaW50IG1heFNlYXJjaFNldCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfU0VBUkNIX1NFVCkpOwotICAgICAgaW50IG1heFJlc3VsdHMgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1JFU1VMVFMpKTsKLQotICAgICAgLy8gVGhlIGFjdGlvbiBjYW4gYmUgcnVuIHVuZGVyIHRoZSBjb250ZXh0IG9mIGVpdGhlciBhIHJlZ2lzdHJ5IG9yIGEgcXVlcnkgbm9kZS4KLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgaWYgKG93bmVkICYmICFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotCi0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0KLSAgICAgIEJ1c2luZXNzSW5mb3MgYnVzSW5mb3MgPSBudWxsOwotICAgICAgaWYgKG93bmVkKQotICAgICAgICBidXNJbmZvcyA9IHByb3h5LmdldF9yZWdpc3RlcmVkSW5mbyhyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCkpLmdldEJ1c2luZXNzSW5mb3MoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYnVzSW5mb3MgPSBwcm94eS5maW5kX2J1c2luZXNzKG5hbWVWZWN0b3IsIGR1cERpc2NvdmVyeVVSTHMoZGlzY292ZXJ5VVJMcywiIixVRERJQWN0aW9uSW5wdXRzLkRJU0NPVkVSWV9VUkxfVFlQRSksIGlkZW50aWZpZXJCYWcsIGNhdGVnb3J5QmFnLCB0TW9kZWxCYWcsIGZpbmRRdWFsaWZpZXJzLCBtYXhTZWFyY2hTZXQpLmdldEJ1c2luZXNzSW5mb3MoKTsKLSAgICAgIAotICAgICAgaW50IGZpbmFsTnVtYmVyT2ZCdXNpbmVzc0VudGl0aWVzID0gTWF0aC5taW4obWF4UmVzdWx0cywgYnVzSW5mb3Muc2l6ZSgpKTsKLSAgICAgIFZlY3RvciBidXNpbmVzc0tleXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmFsTnVtYmVyT2ZCdXNpbmVzc0VudGl0aWVzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJ1c2luZXNzSW5mbyBidXNJbmZvID0gKEJ1c2luZXNzSW5mbylidXNJbmZvcy5nZXQoaSk7Ci0gICAgICAgIGJ1c2luZXNzS2V5cy5hZGRFbGVtZW50KGJ1c0luZm8uZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllcyA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBWZWN0b3IgYmVWZWN0b3IgPSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwoYnVzaW5lc3NLZXlzKS5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpOwotICAgICAgICAgIEJ1c2luZXNzRW50aXR5W10gYmVMaXN0ID0gbmV3IEJ1c2luZXNzRW50aXR5W2JlVmVjdG9yLnNpemUoKV07Ci0gICAgICAgICAgYmVWZWN0b3IudG9BcnJheShiZUxpc3QpOwotICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUpOwotICAgICAgICAgIHF1ZXJ5RWxlbWVudF8gPSBuZXcgUXVlcnlFbGVtZW50KGJlTGlzdCxxdWVyeU5hbWUscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICAgICAgICBhZGRRdWVyeU5vZGUoKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORCIsU3RyaW5nLnZhbHVlT2YoYmVMaXN0Lmxlbmd0aCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IEZvcm1JbnB1dEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0JVU0lORVNTRVNfRk9VTkQiKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRm9ybUlucHV0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQzOGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuRm9ybUlucHV0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5OYW1lOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm9zOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlZ0ZpbmRCdXNpbmVzc2VzU2ltcGxlQWN0aW9uIGV4dGVuZHMgRmluZEFjdGlvbgotewotICBwdWJsaWMgUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUpKTsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSxuYW1lKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIuCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOwotICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FKTsKLSAgICAgIFZlY3RvciBuYW1lVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgbmFtZVZlY3Rvci5hZGRFbGVtZW50KG5ldyBOYW1lKG5hbWUpKTsKLQotICAgICAgLy8gVGhlIGFjdGlvbiBjYW4gYmUgcnVuIHVuZGVyIHRoZSBjb250ZXh0IG9mIGVpdGhlciBhIHJlZ2lzdHJ5IG9yIGEgcXVlcnkgbm9kZS4KLSAgICAgIGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICAKLSAgICAgIEJ1c2luZXNzSW5mb3MgYnVzSW5mb3MgPSBwcm94eS5maW5kX2J1c2luZXNzKG5hbWVWZWN0b3IsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1NFQVJDSF9TRVQpLmdldEJ1c2luZXNzSW5mb3MoKTsKLSAgICAgIGludCBmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllcyA9IE1hdGgubWluKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1JFU1VMVFMsIGJ1c0luZm9zLnNpemUoKSk7Ci0gICAgICBWZWN0b3IgYnVzaW5lc3NLZXlzID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllczsgaSsrKQotICAgICAgewotICAgICAgICBCdXNpbmVzc0luZm8gYnVzSW5mbyA9IGJ1c0luZm9zLmdldChpKTsKLSAgICAgICAgYnVzaW5lc3NLZXlzLmFkZEVsZW1lbnQoYnVzSW5mby5nZXRCdXNpbmVzc0tleSgpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGZpbmFsTnVtYmVyT2ZCdXNpbmVzc0VudGl0aWVzID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNob3VsZEFkZFF1ZXJ5Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgIFZlY3RvciBiZVZlY3RvciA9IHByb3h5LmdldF9idXNpbmVzc0RldGFpbChidXNpbmVzc0tleXMpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCk7Ci0gICAgICAgICAgQnVzaW5lc3NFbnRpdHlbXSBiZUxpc3QgPSBuZXcgQnVzaW5lc3NFbnRpdHlbYmVWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgICAgICBiZVZlY3Rvci50b0FycmF5KGJlTGlzdCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICAgICAgcXVlcnlFbGVtZW50XyA9IG5ldyBRdWVyeUVsZW1lbnQoYmVMaXN0LHF1ZXJ5TmFtZSxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgICAgICAgIGFkZFF1ZXJ5Tm9kZSgpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19CVVNJTkVTU0VTX0ZPVU5EIixTdHJpbmcudmFsdWVPZihiZUxpc3QubGVuZ3RoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgRm9ybUlucHV0RXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fQlVTSU5FU1NFU19GT1VORCIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlRyYW5zcG9ydEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChGb3JtSW5wdXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Zjg2ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuRm9ybUlucHV0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlRNb2RlbERldGFpbDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfVVVJRCkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB1dWlkS2V5ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfS0VZKTsKLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLQotICAgIGlmICh1dWlkS2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSx1dWlkS2V5KTsKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcodXVpZEtleSkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVkpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VVSURfS0VZIikpOwotICAgIH0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOyAgICAgIAotICAgICAgU3RyaW5nIHV1aWRLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZKTsKLQotICAgICAgLy8gVGhlIGFjdGlvbiBjYW4gYmUgcnVuIHVuZGVyIHRoZSBjb250ZXh0IG9mIGVpdGhlciBhIHJlZ2lzdHJ5IG9yIGEgcXVlcnkgbm9kZSBvciBldmVuIFVERElNYWluTm9kZS4KLSAgICAgIGlmIChyZWdOb2RlXyA9PSBudWxsKQotICAgICAgICByZWdOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgoTm9kZSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5SRUZSRVNIX05PREUpKTsKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgVE1vZGVsRGV0YWlsIHRNb2RlbERldGFpbCA9IHByb3h5LmdldF90TW9kZWxEZXRhaWwodXVpZEtleSk7Ci0gICAgICBWZWN0b3IgdE1vZGVsVmVjdG9yID0gdE1vZGVsRGV0YWlsLmdldFRNb2RlbFZlY3RvcigpOwotICAgICAgaWYgKHRNb2RlbFZlY3Rvci5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbCl0TW9kZWxWZWN0b3IuZWxlbWVudEF0KDApOwotICAgICAgICBpZiAoc2hvdWxkQWRkUXVlcnlOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgVE1vZGVsW10gdE1vZGVsQXJyYXkgPSBuZXcgVE1vZGVsWzFdOwotICAgICAgICAgIHRNb2RlbEFycmF5WzBdID0gdE1vZGVsOwotICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUpOwotICAgICAgICAgIHF1ZXJ5RWxlbWVudF8gPSBuZXcgUXVlcnlFbGVtZW50KHRNb2RlbEFycmF5LHF1ZXJ5TmFtZSxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgICAgICAgIGFkZFF1ZXJ5Tm9kZSgpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQiLFN0cmluZy52YWx1ZU9mKHRNb2RlbEFycmF5Lmxlbmd0aCkpKTsKLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNULHRNb2RlbCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgRm9ybUlucHV0RXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EIikpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZvcm1JbnB1dEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDI3ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkZvcm1JbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5CaW5kaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkJpbmRpbmdUZW1wbGF0ZXM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLlRNb2RlbEluc3RhbmNlRGV0YWlsczsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJpbmRpbmcuVE1vZGVsSW5zdGFuY2VJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuRGlzcG9zaXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5SZWdpc3RlcmVkSW5mbzsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlJlc3VsdDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlRNb2RlbERldGFpbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlRNb2RlbEluZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5UTW9kZWxJbmZvczsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlRNb2RlbExpc3Q7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcnM7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLklkZW50aWZpZXJCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCkpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9TRUFSQ0hfU0VULFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1NFQVJDSF9TRVQpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9NQVhfUkVTVUxUUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9SRVNVTFRTKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgdXNlU2VydmljZUNoZWNrZWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfVVNFX1NFUlZJQ0UpOwotICAgIFN0cmluZ1tdIHNlcnZpY2VOb2RlSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFKTsKLSAgICBTdHJpbmcgb3duZWRDaGVja2VkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEKTsKLSAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICBTdHJpbmdbXSBpZFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfVFlQRSk7Ci0gICAgU3RyaW5nW10gaWRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBpZEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9WQUxVRSk7Ci0gICAgU3RyaW5nW10gY2F0VHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfVFlQRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGNhdEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfVkFMVUUpOwotICAgIFN0cmluZ1tdIGZpbmRRdWFsaWZpZXJWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRklORFFVQUxJRklFUik7Ci0gICAgU3RyaW5nIG1heFNlYXJjaFNldCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfU0VBUkNIX1NFVCk7Ci0gICAgU3RyaW5nIG1heFJlc3VsdHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1JFU1VMVFMpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLQotICAgIGlmICh1c2VTZXJ2aWNlQ2hlY2tlZCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfVVNFX1NFUlZJQ0UsdXNlU2VydmljZUNoZWNrZWQpOwotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfVVNFX1NFUlZJQ0UpOwotICAgIAotICAgIGlmIChzZXJ2aWNlTm9kZUlkcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEFsdGhvdWdoIHdlIGFscmVhZHkgaGF2ZSB0aGUgInN1Ym1pdHRlZCIgZGF0YSwgZGVsZXRpb25zIG9jY3VyIG9uIHRoZSBjbGllbnQgc2lkZSBhbmQgdGh1cyB0aGUgbmVlZCB0byB0cmFjayB0aGlzIHVzaW5nIGhpZGRlbiBmb3JtIGVsZW1lbnRzLgotICAgICAgVmVjdG9yIHNpU2VydmljZSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0UpOwotICAgICAgaWYgKHNpU2VydmljZSA9PSBudWxsKQotICAgICAgICBzaVNlcnZpY2UgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNpU2VydmljZS5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgVmVjdG9yIHNpU2VydmljZUNvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFX0NPUFkpOwotICAgICAgLy8gVGhlIGJyb3dzZXIgd2lsbCBlbmZvcmNlIHRoZSBydWxlIG9mIGhhdmluZyBvbmx5IG9uZSBzZXJ2aWNlIGluIHRoaXMgbGlzdC4KLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNpU2VydmljZUNvcHkuZWxlbWVudEF0KDApOwotICAgICAgc2lTZXJ2aWNlLmFkZEVsZW1lbnQobGlzdEVsZW1lbnQpOwotICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0Usc2lTZXJ2aWNlKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0JVU0lORVNTX1NFUlZJQ0UsYnMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFKTsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQlVTSU5FU1NfU0VSVklDRSk7Ci0gICAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiB1c2VTZXJ2aWNlQ2hlY2tlZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0UpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfU0VSVklDRSIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKG93bmVkQ2hlY2tlZCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfT1dORUQsb3duZWRDaGVja2VkKTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX09XTkVEKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLG5hbWUpOwotCi0gICAgaWYgKGlkVHlwZXMgIT0gbnVsbCAmJiBpZEtleU5hbWVzICE9IG51bGwgJiYgaWRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gbmV3IElkZW50aWZpZXJCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGlkS2V5TmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoaWRLZXlOYW1lc1tpXSxpZEtleVZhbHVlc1tpXSxpZFR5cGVzW2ldKTsKLSAgICAgICAgaWRCYWcuYWRkKGtyKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTLGlkQmFnKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0KLSAgICBpZiAoY2F0VHlwZXMgIT0gbnVsbCAmJiBjYXRLZXlOYW1lcyAhPSBudWxsICYmIGNhdEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VHlwZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoY2F0S2V5TmFtZXNbaV0sY2F0S2V5VmFsdWVzW2ldLGNhdFR5cGVzW2ldKTsKLSAgICAgICAgY2F0QmFnLmFkZChrcik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTLGNhdEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyk7Ci0KLSAgICBpZiAoZmluZFF1YWxpZmllclZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEZpbmRRdWFsaWZpZXJzIGZpbmRRdWFsaWZpZXJzID0gbmV3IEZpbmRRdWFsaWZpZXJzKCk7Ci0gICAgICBWZWN0b3IgZmluZFF1YWxpZmllclZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGZpbmRRdWFsaWZpZXJWYWx1ZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgRmluZFF1YWxpZmllciBmaW5kUXVhbGlmaWVyID0gbmV3IEZpbmRRdWFsaWZpZXIoZmluZFF1YWxpZmllclZhbHVlc1tpXSk7Ci0gICAgICAgIGZpbmRRdWFsaWZpZXJWZWN0b3IuYWRkRWxlbWVudChmaW5kUXVhbGlmaWVyKTsKLSAgICAgIH0KLSAgICAgIGZpbmRRdWFsaWZpZXJzLnNldEZpbmRRdWFsaWZpZXJWZWN0b3IoZmluZFF1YWxpZmllclZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9GSU5EUVVBTElGSUVSUyxmaW5kUXVhbGlmaWVycyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfRklORFFVQUxJRklFUlMpOwotCi0gICAgaWYgKG1heFNlYXJjaFNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9TRUFSQ0hfU0VULG1heFNlYXJjaFNldCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9NQVhfU0VBUkNIX1NFVCxtYXhTZWFyY2hTZXQpOwotICAgIH0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlSW50ZWdlcihtYXhTZWFyY2hTZXQpKQotICAgIHsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1NFQVJDSF9TRVQpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX01BWF9TRUFSQ0hfU0VUIikpOwotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobWF4UmVzdWx0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9SRVNVTFRTLG1heFJlc3VsdHMpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1JFU1VMVFMsbWF4UmVzdWx0cyk7Ci0gICAgfQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVJbnRlZ2VyKG1heFJlc3VsdHMpKQotICAgIHsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1JFU1VMVFMpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX01BWF9SRVNVTFRTIikpOwotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBvdmVycmlkZUF1dGhlbnRpY2F0aW9uVmFsaWRhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1VTRV9TRVJWSUNFKSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZEFkZFF1ZXJ5Tm9kZSA9IChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSkgPT0gbnVsbCk7ICAgICAgCi0gICAgICBib29sZWFuIHVzZVNlcnZpY2UgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfVVNFX1NFUlZJQ0UpICE9IG51bGwpOwotICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9CVVNJTkVTU19TRVJWSUNFKTsKLSAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgIEZpbmRRdWFsaWZpZXJzIGZpbmRRdWFsaWZpZXJzID0gKEZpbmRRdWFsaWZpZXJzKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0ZJTkRRVUFMSUZJRVJTKTsKLSAgICAgIElkZW50aWZpZXJCYWcgaWRlbnRpZmllckJhZyA9IChJZGVudGlmaWVyQmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTKTsKLSAgICAgIENhdGVnb3J5QmFnIGNhdGVnb3J5QmFnID0gKENhdGVnb3J5QmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMpOwotICAgICAgYm9vbGVhbiBvd25lZCA9IChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9PV05FRCkgIT0gbnVsbCk7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgaW50IG1heFNlYXJjaFNldCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9NQVhfU0VBUkNIX1NFVCkpOwotICAgICAgaW50IG1heFJlc3VsdHMgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1JFU1VMVFMpKTsKLQotICAgICAgLy8gVGhlIGFjdGlvbiBjYW4gYmUgcnVuIHVuZGVyIHRoZSBjb250ZXh0IG9mIGVpdGhlciBhIHJlZ2lzdHJ5IG9yIGEgcXVlcnkgbm9kZS4KLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgVmVjdG9yIHRNb2RlbEtleVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIAotICAgICAgaWYgKG93bmVkKQotICAgICAgewotICAgICAgICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgICAgICAgIHJlZ0VsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLSAgICAgICAgdE1vZGVsS2V5VmVjdG9yID0gZmluZEFsbE93bmVkVE1vZGVscyhwcm94eSwgcmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBtYXhSZXN1bHRzKTsKLSAgICAgIH0KLSAgICAgIGlmICh1c2VTZXJ2aWNlKQotICAgICAgewotICAgICAgICBCaW5kaW5nVGVtcGxhdGVzIGJpbmRpbmdUZW1wbGF0ZXMgPSBicy5nZXRCaW5kaW5nVGVtcGxhdGVzKCk7Ci0gICAgICAgIGJvb2xlYW4gZW5kU2VhcmNoID0gZmFsc2U7Ci0gICAgICAgIGlmIChiaW5kaW5nVGVtcGxhdGVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpPTA7aTxiaW5kaW5nVGVtcGxhdGVzLnNpemUoKTtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgQmluZGluZ1RlbXBsYXRlIGJ0ID0gYmluZGluZ1RlbXBsYXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICBUTW9kZWxJbnN0YW5jZURldGFpbHMgdE1vZGVsSW5zdGFuY2VEZXRhaWxzID0gYnQuZ2V0VE1vZGVsSW5zdGFuY2VEZXRhaWxzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqPTA7ajx0TW9kZWxJbnN0YW5jZURldGFpbHMuc2l6ZSgpO2orKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgVE1vZGVsSW5zdGFuY2VJbmZvIHRNb2RlbEluc3RhbmNlSW5mbyA9IHRNb2RlbEluc3RhbmNlRGV0YWlscy5nZXQoaik7Ci0gICAgICAgICAgICAgIGlmICh0TW9kZWxLZXlWZWN0b3Iuc2l6ZSgpIDwgbWF4UmVzdWx0cykKLSAgICAgICAgICAgICAgICB0TW9kZWxLZXlWZWN0b3IuYWRkRWxlbWVudCh0TW9kZWxJbnN0YW5jZUluZm8uZ2V0VE1vZGVsS2V5KCkpOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbmRTZWFyY2ggPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kU2VhcmNoKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgIAotICAgICAgICBUTW9kZWxMaXN0IHRNb2RlbExpc3QgPSBwcm94eS5maW5kX3RNb2RlbChuYW1lLGNhdGVnb3J5QmFnLGlkZW50aWZpZXJCYWcsZmluZFF1YWxpZmllcnMsbWF4U2VhcmNoU2V0KTsKLSAgICAgICAgVE1vZGVsSW5mb3MgdE1vZGVsSW5mb3MgPSB0TW9kZWxMaXN0LmdldFRNb2RlbEluZm9zKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHRNb2RlbEluZm9zLnNpemUoKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBUTW9kZWxJbmZvIHRNb2RlbEluZm8gPSB0TW9kZWxJbmZvcy5nZXQoaSk7Ci0gICAgICAgICAgaWYgKHRNb2RlbEtleVZlY3Rvci5zaXplKCkgPCBtYXhSZXN1bHRzKQotICAgICAgICAgICAgdE1vZGVsS2V5VmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsSW5mby5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaW50IGZpbmFsTnVtYmVyT2ZUTW9kZWxLZXlzID0gdE1vZGVsS2V5VmVjdG9yLnNpemUoKTsKLSAgICAgIGlmIChmaW5hbE51bWJlck9mVE1vZGVsS2V5cyA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBWZWN0b3IgZmluYWxUTW9kZWxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgaW50IGN1cnJlbnRJbmRleCA9IDA7Ci0gICAgICAgICAgaW50IHdpbmRvd1NpemUgPSBmaW5hbE51bWJlck9mVE1vZGVsS2V5czsKLSAgICAgICAgICB3aGlsZSAoY3VycmVudEluZGV4IDwgdE1vZGVsS2V5VmVjdG9yLnNpemUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc3ViTGlzdFRvSW5kZXggPSBNYXRoLm1pbihjdXJyZW50SW5kZXgrd2luZG93U2l6ZSx0TW9kZWxLZXlWZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBUTW9kZWxEZXRhaWwgdE1vZGVsRGV0YWlsID0gcHJveHkuZ2V0X3RNb2RlbERldGFpbChuZXcgVmVjdG9yKHRNb2RlbEtleVZlY3Rvci5zdWJMaXN0KGN1cnJlbnRJbmRleCxzdWJMaXN0VG9JbmRleCkpKTsKLSAgICAgICAgICAgICAgVmVjdG9yIHRNb2RlbFZlY3RvciA9IHRNb2RlbERldGFpbC5nZXRUTW9kZWxWZWN0b3IoKTsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8dE1vZGVsVmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgICAgICAgICAgZmluYWxUTW9kZWxWZWN0b3IuYWRkRWxlbWVudCh0TW9kZWxWZWN0b3IuZWxlbWVudEF0KGkpKTsKLSAgICAgICAgICAgICAgaWYgKHRNb2RlbERldGFpbC5nZXRUcnVuY2F0ZWRCb29sZWFuKCkpCi0gICAgICAgICAgICAgICAgd2luZG93U2l6ZSA9IHRNb2RlbFZlY3Rvci5zaXplKCk7Ci0gICAgICAgICAgICAgIGN1cnJlbnRJbmRleCArPSB3aW5kb3dTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRGlzcG9zaXRpb25SZXBvcnQgZHIgPSBlLmdldERpc3Bvc2l0aW9uUmVwb3J0KCk7Ci0gICAgICAgICAgICAgIGlmICgoKFJlc3VsdCkgZHIuZ2V0UmVzdWx0VmVjdG9yKCkuZ2V0KDApKS5nZXRFcnJJbmZvKCkuZ2V0RXJyQ29kZSgpID09IERpc3Bvc2l0aW9uUmVwb3J0LkVfaW52YWxpZEtleVBhc3NlZCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJJbmZvVGV4dCA9ICgoUmVzdWx0KSBkci5nZXRSZXN1bHRWZWN0b3IoKS5nZXQoMCkpLmdldEVyckluZm8oKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT1jdXJyZW50SW5kZXg7aTxzdWJMaXN0VG9JbmRleDtpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgU3RyaW5nIHRNb2RlbEtleSA9IChTdHJpbmcpdE1vZGVsS2V5VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChlcnJJbmZvVGV4dC5pbmRleE9mKHRNb2RlbEtleSkgIT0gLTEgfHwgZXJySW5mb1RleHQuaW5kZXhPZih0TW9kZWxLZXkudG9VcHBlckNhc2UoKSkgIT0gLTEgfHwgZXJySW5mb1RleHQuaW5kZXhPZih0TW9kZWxLZXkudG9Mb3dlckNhc2UoKSkgIT0gLTEpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRNb2RlbEtleVZlY3Rvci5yZW1vdmVFbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaW50IGZpbmFsTnVtYmVyT2ZUTW9kZWxzID0gZmluYWxUTW9kZWxWZWN0b3Iuc2l6ZSgpOwotICAgICAgICAgIGlmIChmaW5hbE51bWJlck9mVE1vZGVscyA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgVE1vZGVsW10gdE1vZGVsQXJyYXkgPSBuZXcgVE1vZGVsW2ZpbmFsTnVtYmVyT2ZUTW9kZWxzXTsKLSAgICAgICAgICAgIGZpbmFsVE1vZGVsVmVjdG9yLnRvQXJyYXkodE1vZGVsQXJyYXkpOwotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICAgICAgICBxdWVyeUVsZW1lbnRfID0gbmV3IFF1ZXJ5RWxlbWVudCh0TW9kZWxBcnJheSxxdWVyeU5hbWUscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICAgICAgICAgIGFkZFF1ZXJ5Tm9kZSgpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORCIsU3RyaW5nLnZhbHVlT2YodE1vZGVsQXJyYXkubGVuZ3RoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybUlucHV0RXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgRm9ybUlucHV0RXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EIikpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZvcm1JbnB1dEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvLyBDb3BpZWQgZGlyZWN0bHkgZnJvbSBVRERJV1NETFByb3h5J3MgZmluZEFsbFNlcnZpY2VJbnRlcmZhY2VzKCkgbWV0aG9kIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucy4gVGhlIGhhcmRjb2RlZCBzdHJpbmdzIHNob3VsZCBOT1QgYmUgdHJhbnNsYXRlZC4KLSAgcHJpdmF0ZSBmaW5hbCBWZWN0b3IgZmluZEFsbE93bmVkVE1vZGVscyhVRERJUHJveHkgcHJveHksIFN0cmluZyBhdXRoSW5mb1N0cmluZywgaW50IG1heFJlc3VsdHMpIHRocm93cyBVRERJRXhjZXB0aW9uLCBUcmFuc3BvcnRFeGNlcHRpb24KLSAgewotICAgIFJlZ2lzdGVyZWRJbmZvIHJlZ2lzdGVyZWRJbmZvID0gbnVsbDsKLQotICAgIC8vIEdldCB0aGUgY29tcGxldGUgbGlzdCBvZiBvd25lZCAocmVnaXN0ZXJlZCkgaW5mby4KLSAgICAvLyAoQSBSZWdpc3RlcmVkSW5mbyBjb25zaXN0cyBvZiBCdXNpbmVzc0luZm9zIGFuZCBUTW9kZWxJbmZvcy4KLSAgICAvLyBCdXNpbmVzc0luZm9zIGFsc28gY29udGFpbiBTZXJ2aWNlSW5mb3MuKQotICAgIHJlZ2lzdGVyZWRJbmZvID0gcHJveHkuZ2V0X3JlZ2lzdGVyZWRJbmZvKGF1dGhJbmZvU3RyaW5nKTsKLQotICAgIC8vQ3JlYXRlIGEgVmVjdG9yIHRvIGFkZCB0aGUgVE1vZGVsS2V5cyBmcm9tIHRoZSByZWdpc3RlcmVkSW5mby4KLSAgICBWZWN0b3IgdE1vZGVsS2V5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vR2V0IHRoZSBUTW9kZWxJbmZvcyBmcm9tIHRoZSByZWdpc3RlcmVkSW5mby4KLSAgICBUTW9kZWxJbmZvcyB0TW9kZWxJbmZvcyA9IHJlZ2lzdGVyZWRJbmZvLmdldFRNb2RlbEluZm9zKCk7Ci0KLSAgICAvL0dldCBhbGwgdGhlIFRNb2RlbEtleXMgZnJvbSB3aXRoaW4gdGhlIFRNb2RlbEluZm9zCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0TW9kZWxJbmZvcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBUTW9kZWxJbmZvIHRNb2RlbEluZm8gPSB0TW9kZWxJbmZvcy5nZXQoaSk7Ci0gICAgICBpZiAodE1vZGVsS2V5TGlzdC5zaXplKCkgPCBtYXhSZXN1bHRzKQotICAgICAgICB0TW9kZWxLZXlMaXN0LmFkZEVsZW1lbnQodE1vZGVsSW5mby5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGJyZWFrOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHRNb2RlbEtleUxpc3Q7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMDM1OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuRm9ybUlucHV0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsSW5mbzsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlRNb2RlbEluZm9zOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsTGlzdDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUsbmFtZSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyLgotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJvb2xlYW4gc2hvdWxkQWRkUXVlcnlOb2RlID0gKHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFKSA9PSBudWxsKTsgICAgICAKLSAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICAvLyBUaGUgYWN0aW9uIGNhbiBiZSBydW4gdW5kZXIgdGhlIGNvbnRleHQgb2YgZWl0aGVyIGEgcmVnaXN0cnkgb3IgYSBxdWVyeSBub2RlLgotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBUTW9kZWxMaXN0IHRNb2RlbExpc3QgPSBwcm94eS5maW5kX3RNb2RlbChuYW1lLG51bGwsbnVsbCxudWxsLFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1NFQVJDSF9TRVQpOwotICAgICAgVE1vZGVsSW5mb3MgdE1vZGVsSW5mb3MgPSB0TW9kZWxMaXN0LmdldFRNb2RlbEluZm9zKCk7Ci0gICAgICBWZWN0b3IgdE1vZGVsS2V5VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgCi0gICAgICBmb3IgKGludCBpPTA7aTx0TW9kZWxJbmZvcy5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBUTW9kZWxJbmZvIHRNb2RlbEluZm8gPSB0TW9kZWxJbmZvcy5nZXQoaSk7Ci0gICAgICAgIGlmICh0TW9kZWxLZXlWZWN0b3Iuc2l6ZSgpIDwgVURESUFjdGlvbklucHV0cy5RVUVSWV9NQVhfUkVTVUxUUykKLSAgICAgICAgICB0TW9kZWxLZXlWZWN0b3IuYWRkRWxlbWVudCh0TW9kZWxJbmZvLmdldFRNb2RlbEtleSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAodE1vZGVsS2V5VmVjdG9yLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBUTW9kZWxEZXRhaWwgdE1vZGVsRGV0YWlsID0gcHJveHkuZ2V0X3RNb2RlbERldGFpbCh0TW9kZWxLZXlWZWN0b3IpOwotICAgICAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSB0TW9kZWxEZXRhaWwuZ2V0VE1vZGVsVmVjdG9yKCk7Ci0gICAgICAgICAgVE1vZGVsW10gdE1vZGVsQXJyYXkgPSBuZXcgVE1vZGVsW3RNb2RlbFZlY3Rvci5zaXplKCldOwotICAgICAgICAgIHRNb2RlbFZlY3Rvci50b0FycmF5KHRNb2RlbEFycmF5KTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnlOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FKTsKLSAgICAgICAgICBxdWVyeUVsZW1lbnRfID0gbmV3IFF1ZXJ5RWxlbWVudCh0TW9kZWxBcnJheSxxdWVyeU5hbWUscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICAgICAgICBhZGRRdWVyeU5vZGUoKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EIixTdHJpbmcudmFsdWVPZih0TW9kZWxBcnJheS5sZW5ndGgpKSk7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IEZvcm1JbnB1dEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORCIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChGb3JtSW5wdXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZVVVSURBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYmMwMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZVVVSURBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuRm9ybUlucHV0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5TZXJ2aWNlRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbiBleHRlbmRzIEZpbmRBY3Rpb24KLXsKLSAgcHVibGljIFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfVVVJRCkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB1dWlkS2V5ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfS0VZKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgaWYgKHV1aWRLZXkgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVksdXVpZEtleSk7Ci0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHV1aWRLZXkpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVkpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VVSURfS0VZIikpOwotICAgIH0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOwotICAgICAgU3RyaW5nIHV1aWRLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVkpOwotCi0gICAgICAvLyBUaGUgYWN0aW9uIGNhbiBiZSBydW4gdW5kZXIgdGhlIGNvbnRleHQgb2YgZWl0aGVyIGEgcmVnaXN0cnkgb3IgYSBxdWVyeSBub2RlIG9yIGV2ZW4gVURESU1haW5Ob2RlLgotICAgICAgaWYgKHJlZ05vZGVfID09IG51bGwpCi0gICAgICAgIHJlZ05vZGVfID0gZ2V0UmVnaXN0cnlOb2RlKChOb2RlKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlJFRlJFU0hfTk9ERSkpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBCdXNpbmVzc1NlcnZpY2VbXSBic0FycmF5ID0gbmV3IEJ1c2luZXNzU2VydmljZVsxXTsKLSAgICAgIFNlcnZpY2VEZXRhaWwgc2VydmljZURldGFpbCA9IHByb3h5LmdldF9zZXJ2aWNlRGV0YWlsKHV1aWRLZXkpOwotICAgICAgVmVjdG9yIGJzVmVjdG9yID0gc2VydmljZURldGFpbC5nZXRCdXNpbmVzc1NlcnZpY2VWZWN0b3IoKTsKLSAgICAgIGlmIChic1ZlY3Rvci5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBic1ZlY3Rvci50b0FycmF5KGJzQXJyYXkpOwotICAgICAgICBpZiAoc2hvdWxkQWRkUXVlcnlOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICAgICAgcXVlcnlFbGVtZW50XyA9IG5ldyBRdWVyeUVsZW1lbnQoYnNBcnJheSxxdWVyeU5hbWUscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICAgICAgICBhZGRRdWVyeU5vZGUoKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRVNfRk9VTkQiLFN0cmluZy52YWx1ZU9mKGJzQXJyYXkubGVuZ3RoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QsYnNBcnJheVswXSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgRm9ybUlucHV0RXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fU0VSVklDRVNfRk9VTkQiKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJUcmFuc3BvcnRFeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICBjYXRjaCAoRm9ybUlucHV0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1NmRiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5Gb3JtSW5wdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlF1ZXJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLk5hbWU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLkJ1c2luZXNzSW5mbzsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLkJ1c2luZXNzSW5mb3M7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5EaXNwb3NpdGlvblJlcG9ydDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlJlZ2lzdGVyZWRJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuUmVzdWx0OwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuU2VydmljZURldGFpbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlNlcnZpY2VJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuU2VydmljZUluZm9zOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuU2VydmljZUxpc3Q7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcnM7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5UTW9kZWxCYWc7Ci0KLXB1YmxpYyBjbGFzcyBSZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbiBleHRlbmRzIEZpbmRBY3Rpb24KLXsKLSAgcHVibGljIFJlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCkpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTUFYX1NFQVJDSF9TRVQsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9NQVhfU0VBUkNIX1NFVCkpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTUFYX1JFU1VMVFMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9NQVhfUkVTVUxUUykpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG93bmVkQ2hlY2tlZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9PV05FRCk7Ci0gICAgU3RyaW5nW10gYnVzTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5OT0RFSURfQlVTSU5FU1MpOwotICAgIFN0cmluZ1tdIGxhbmd1YWdlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBuYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FKTsKLSAgICBTdHJpbmdbXSBjYXRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSk7Ci0gICAgU3RyaW5nW10gc2lOb2RlSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgU3RyaW5nW10gZmluZFF1YWxpZmllclZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9GSU5EUVVBTElGSUVSKTsKLSAgICBTdHJpbmcgbWF4U2VhcmNoU2V0ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9TRUFSQ0hfU0VUKTsKLSAgICBTdHJpbmcgbWF4UmVzdWx0cyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfUkVTVUxUUyk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICByZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgaWYgKG93bmVkQ2hlY2tlZCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9PV05FRCxvd25lZENoZWNrZWQpOwotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9PV05FRCk7Ci0KLSAgICBpZiAoYnVzTm9kZUlkcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEFsdGhvdWdoIHdlIGFscmVhZHkgaGF2ZSB0aGUgInN1Ym1pdHRlZCIgZGF0YSwgZGVsZXRpb25zIG9jY3VyIG9uIHRoZSBjbGllbnQgc2lkZSBhbmQgdGh1cyB0aGUgbmVlZCB0byB0cmFjayB0aGlzIHVzaW5nIGhpZGRlbiBmb3JtIGVsZW1lbnRzLgotICAgICAgVmVjdG9yIHNlcnZpY2VCdXNpbmVzcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1MpOwotICAgICAgaWYgKHNlcnZpY2VCdXNpbmVzcyA9PSBudWxsKQotICAgICAgICBzZXJ2aWNlQnVzaW5lc3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNlcnZpY2VCdXNpbmVzcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgVmVjdG9yIHNlcnZpY2VCdXNpbmVzc0NvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTX0NPUFkpOwotICAgICAgLy8gVGhlIGJyb3dzZXIgd2lsbCBlbmZvcmNlIHRoZSBydWxlIG9mIGhhdmluZyBvbmx5IG9uZSBidXNpbmVzcyBpbiB0aGlzIGxpc3QuCi0gICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzZXJ2aWNlQnVzaW5lc3NDb3B5LmVsZW1lbnRBdCgwKTsKLSAgICAgIHNlcnZpY2VCdXNpbmVzcy5hZGRFbGVtZW50KGxpc3RFbGVtZW50KTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IHNwID0gKEJ1c2luZXNzRW50aXR5KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyxzZXJ2aWNlQnVzaW5lc3MpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSLHNwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUik7Ci0gICAgfQotCi0gICAgaWYgKGxhbmd1YWdlcyAhPSBudWxsICYmIG5hbWVzICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxuYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBOYW1lIHVkZGk0ak5hbWU7Ci0gICAgICAgIGlmIChsYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0ak5hbWUgPSBuZXcgTmFtZShuYW1lc1tpXSxsYW5ndWFnZXNbaV0pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldKTsKLSAgICAgICAgbmFtZVZlY3Rvci5hZGRFbGVtZW50KHVkZGk0ak5hbWUpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxuYW1lVmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLQotICAgIGlmIChjYXRUeXBlcyAhPSBudWxsICYmIGNhdEtleU5hbWVzICE9IG51bGwgJiYgY2F0S2V5VmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgQ2F0ZWdvcnlCYWcgY2F0QmFnID0gbmV3IENhdGVnb3J5QmFnKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjYXRUeXBlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShjYXRLZXlOYW1lc1tpXSxjYXRLZXlWYWx1ZXNbaV0sY2F0VHlwZXNbaV0pOwotICAgICAgICBjYXRCYWcuYWRkKGtyKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyxjYXRCYWcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0KLSAgICBpZiAoc2lOb2RlSWRzICE9IG51bGwpCi0gICAgewotICAgICAgLy8gQWx0aG91Z2ggd2UgYWxyZWFkeSBoYXZlIHRoZSAic3VibWl0dGVkIiBkYXRhLCBkZWxldGlvbnMgb2NjdXIgb24gdGhlIGNsaWVudCBzaWRlIGFuZCB0aHVzIHRoZSBuZWVkIHRvIHRyYWNrIHRoaXMgdXNpbmcgaGlkZGVuIGZvcm0gZWxlbWVudHMuCi0gICAgICBWZWN0b3Igc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgICAgaWYgKHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcyA9PSBudWxsKQotICAgICAgICBzZXJ2aWNlU2VydmljZUludGVyZmFjZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgVmVjdG9yIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZKTsKLSAgICAgIFZlY3RvciB0TW9kZWxLZXlTdHJpbmdWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBIYXNodGFibGUgcmVzdWx0SGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHNpTm9kZUlkcy5sZW5ndGg7aSsrKQotICAgICAgICByZXN1bHRIYXNoLnB1dChzaU5vZGVJZHNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzQ29weS5lbGVtZW50QXQoaSk7Ci0gICAgICAgIGlmIChyZXN1bHRIYXNoLmdldChTdHJpbmcudmFsdWVPZihsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKSkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlU2VydmljZUludGVyZmFjZXMuYWRkRWxlbWVudChsaXN0RWxlbWVudCk7Ci0gICAgICAgICAgVE1vZGVsIHRNb2RlbCA9IChUTW9kZWwpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgdE1vZGVsS2V5U3RyaW5nVmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsLmdldFRNb2RlbEtleSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgVE1vZGVsQmFnIHRNb2RlbEJhZyA9IG5ldyBUTW9kZWxCYWcodE1vZGVsS2V5U3RyaW5nVmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTLHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1RNT0RFTEJBRyx0TW9kZWxCYWcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfVE1PREVMQkFHKTsKLSAgICB9Ci0KLSAgICBpZiAoZmluZFF1YWxpZmllclZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEZpbmRRdWFsaWZpZXJzIGZpbmRRdWFsaWZpZXJzID0gbmV3IEZpbmRRdWFsaWZpZXJzKCk7Ci0gICAgICBWZWN0b3IgZmluZFF1YWxpZmllclZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGZpbmRRdWFsaWZpZXJWYWx1ZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgRmluZFF1YWxpZmllciBmaW5kUXVhbGlmaWVyID0gbmV3IEZpbmRRdWFsaWZpZXIoZmluZFF1YWxpZmllclZhbHVlc1tpXSk7Ci0gICAgICAgIGZpbmRRdWFsaWZpZXJWZWN0b3IuYWRkRWxlbWVudChmaW5kUXVhbGlmaWVyKTsKLSAgICAgIH0KLSAgICAgIGZpbmRRdWFsaWZpZXJzLnNldEZpbmRRdWFsaWZpZXJWZWN0b3IoZmluZFF1YWxpZmllclZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0ZJTkRRVUFMSUZJRVJTLGZpbmRRdWFsaWZpZXJzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0ZJTkRRVUFMSUZJRVJTKTsKLQotICAgIGlmIChtYXhTZWFyY2hTZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfU0VBUkNIX1NFVCxtYXhTZWFyY2hTZXQpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfU0VBUkNIX1NFVCxtYXhTZWFyY2hTZXQpOwotICAgIH0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlSW50ZWdlcihtYXhTZWFyY2hTZXQpKQotICAgIHsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfU0VBUkNIX1NFVCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfTUFYX1NFQVJDSF9TRVQiKSk7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtYXhSZXN1bHRzICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1JFU1VMVFMsbWF4UmVzdWx0cyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9SRVNVTFRTLG1heFJlc3VsdHMpOwotICAgIH0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlSW50ZWdlcihtYXhSZXN1bHRzKSkKLSAgICB7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTUFYX1JFU1VMVFMpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX01BWF9SRVNVTFRTIikpOwotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJvb2xlYW4gc2hvdWxkQWRkUXVlcnlOb2RlID0gKHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFKSA9PSBudWxsKTsgICAgICAKLSAgICAgIEZpbmRRdWFsaWZpZXJzIGZpbmRRdWFsaWZpZXJzID0gKEZpbmRRdWFsaWZpZXJzKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfRklORFFVQUxJRklFUlMpOwotICAgICAgQnVzaW5lc3NFbnRpdHkgc3AgPSAoQnVzaW5lc3NFbnRpdHkpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSKTsKLSAgICAgIFZlY3RvciBuYW1lVmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgICAgIENhdGVnb3J5QmFnIGNhdGVnb3J5QmFnID0gKENhdGVnb3J5QmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0gICAgICBUTW9kZWxCYWcgdE1vZGVsQmFnID0gKFRNb2RlbEJhZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1RNT0RFTEJBRyk7Ci0gICAgICBib29sZWFuIG93bmVkID0gKHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfT1dORUQpICE9IG51bGwpOwotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICAgIGludCBtYXhTZWFyY2hTZXQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfU0VBUkNIX1NFVCkpOwotICAgICAgaW50IG1heFJlc3VsdHMgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfUkVTVUxUUykpOwotCi0gICAgICAvLyBUaGUgYWN0aW9uIGNhbiBiZSBydW4gdW5kZXIgdGhlIGNvbnRleHQgb2YgZWl0aGVyIGEgcmVnaXN0cnkgb3IgYSBxdWVyeSBub2RlLgotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBpZiAob3duZWQgJiYgIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgICAgICByZWdFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLHVzZXJJZCxwYXNzd29yZCk7Ci0gICAgICAgIAotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgU3RyaW5nIGJ1c2luZXNzS2V5OwotICAgICAgaWYgKHNwICE9IG51bGwpCi0gICAgICAgIGJ1c2luZXNzS2V5ID0gc3AuZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYnVzaW5lc3NLZXkgPSAiIjsKLQotICAgICAgaW50IGZpbmFsTnVtYmVyT2ZTZXJ2aWNlS2V5czsKLSAgICAgIFZlY3RvciBzZXJ2aWNlS2V5VmVjdG9yOwotICAgICAgaWYgKG93bmVkKQotICAgICAgewotICAgICAgICBzZXJ2aWNlS2V5VmVjdG9yID0gZmluZEFsbE93bmVkU2VydmljZXMocHJveHkscmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLGJ1c2luZXNzS2V5LG1heFJlc3VsdHMpOwotICAgICAgICBmaW5hbE51bWJlck9mU2VydmljZUtleXMgPSBzZXJ2aWNlS2V5VmVjdG9yLnNpemUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU2VydmljZUxpc3Qgc2VydmljZUxpc3QgPSBwcm94eS5maW5kX3NlcnZpY2UoYnVzaW5lc3NLZXksbmFtZVZlY3RvcixjYXRlZ29yeUJhZyx0TW9kZWxCYWcsZmluZFF1YWxpZmllcnMsbWF4U2VhcmNoU2V0KTsKLSAgICAgICAgU2VydmljZUluZm9zIHNJbmZvcyA9IHNlcnZpY2VMaXN0LmdldFNlcnZpY2VJbmZvcygpOwotICAgICAgICBmaW5hbE51bWJlck9mU2VydmljZUtleXMgPSBNYXRoLm1pbihtYXhSZXN1bHRzLHNJbmZvcy5zaXplKCkpOwotICAgICAgICBzZXJ2aWNlS2V5VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxmaW5hbE51bWJlck9mU2VydmljZUtleXM7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU2VydmljZUluZm8gc0luZm8gPSBzSW5mb3MuZ2V0KGkpOwotICAgICAgICAgIHNlcnZpY2VLZXlWZWN0b3IuYWRkRWxlbWVudChzSW5mby5nZXRTZXJ2aWNlS2V5KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChmaW5hbE51bWJlck9mU2VydmljZUtleXMgPiAwKQotICAgICAgeyAgICAgIAotICAgICAgICBpZiAoc2hvdWxkQWRkUXVlcnlOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgVmVjdG9yIGZpbmFsQnVzU2VydmljZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICBpbnQgY3VycmVudEluZGV4ID0gMDsKLSAgICAgICAgICBpbnQgd2luZG93U2l6ZSA9IGZpbmFsTnVtYmVyT2ZTZXJ2aWNlS2V5czsKLSAgICAgICAgICB3aGlsZSAoY3VycmVudEluZGV4IDwgc2VydmljZUtleVZlY3Rvci5zaXplKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IHN1Ykxpc3RUb0luZGV4ID0gTWF0aC5taW4oY3VycmVudEluZGV4K3dpbmRvd1NpemUsc2VydmljZUtleVZlY3Rvci5zaXplKCkpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFNlcnZpY2VEZXRhaWwgc2VydmljZURldGFpbCA9IHByb3h5LmdldF9zZXJ2aWNlRGV0YWlsKG5ldyBWZWN0b3Ioc2VydmljZUtleVZlY3Rvci5zdWJMaXN0KGN1cnJlbnRJbmRleCxzdWJMaXN0VG9JbmRleCkpKTsKLSAgICAgICAgICAgICAgVmVjdG9yIGJ1c1NlcnZpY2VWZWN0b3IgPSBzZXJ2aWNlRGV0YWlsLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpOwotICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aTxidXNTZXJ2aWNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgICAgICAgICAgZmluYWxCdXNTZXJ2aWNlVmVjdG9yLmFkZEVsZW1lbnQoYnVzU2VydmljZVZlY3Rvci5lbGVtZW50QXQoaSkpOwotICAgICAgICAgICAgICBpZiAoc2VydmljZURldGFpbC5nZXRUcnVuY2F0ZWRCb29sZWFuKCkpCi0gICAgICAgICAgICAgICAgd2luZG93U2l6ZSA9IGJ1c1NlcnZpY2VWZWN0b3Iuc2l6ZSgpOwotICAgICAgICAgICAgICBjdXJyZW50SW5kZXggKz0gd2luZG93U2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IGRyID0gZS5nZXREaXNwb3NpdGlvblJlcG9ydCgpOwotICAgICAgICAgICAgICBpZiAoKChSZXN1bHQpIGRyLmdldFJlc3VsdFZlY3RvcigpLmdldCgwKSkuZ2V0RXJySW5mbygpLmdldEVyckNvZGUoKSA9PSBEaXNwb3NpdGlvblJlcG9ydC5FX2ludmFsaWRLZXlQYXNzZWQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJySW5mb1RleHQgPSAoKFJlc3VsdCkgZHIuZ2V0UmVzdWx0VmVjdG9yKCkuZ2V0KDApKS5nZXRFcnJJbmZvKCkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9Y3VycmVudEluZGV4O2k8c3ViTGlzdFRvSW5kZXg7aSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlS2V5ID0gKFN0cmluZylzZXJ2aWNlS2V5VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChlcnJJbmZvVGV4dC5pbmRleE9mKHNlcnZpY2VLZXkpICE9IC0xIHx8IGVyckluZm9UZXh0LmluZGV4T2Yoc2VydmljZUtleS50b1VwcGVyQ2FzZSgpKSAhPSAtMSB8fCBlcnJJbmZvVGV4dC5pbmRleE9mKHNlcnZpY2VLZXkudG9Mb3dlckNhc2UoKSkgIT0gLTEpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VLZXlWZWN0b3IucmVtb3ZlRWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGludCBmaW5hbE51bWJlck9mQnVzaW5lc3NTZXJ2aWNlcyA9IGZpbmFsQnVzU2VydmljZVZlY3Rvci5zaXplKCk7Ci0gICAgICAgICAgaWYgKGZpbmFsTnVtYmVyT2ZCdXNpbmVzc1NlcnZpY2VzID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBCdXNpbmVzc1NlcnZpY2VbXSBic0FycmF5ID0gbmV3IEJ1c2luZXNzU2VydmljZVtmaW5hbE51bWJlck9mQnVzaW5lc3NTZXJ2aWNlc107Ci0gICAgICAgICAgICBmaW5hbEJ1c1NlcnZpY2VWZWN0b3IudG9BcnJheShic0FycmF5KTsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUpOwotICAgICAgICAgICAgcXVlcnlFbGVtZW50XyA9IG5ldyBRdWVyeUVsZW1lbnQoYnNBcnJheSxxdWVyeU5hbWUscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICAgICAgICAgIGFkZFF1ZXJ5Tm9kZSgpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VTX0ZPVU5EIixTdHJpbmcudmFsdWVPZihic0FycmF5Lmxlbmd0aCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1JbnB1dEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1NFUlZJQ0VTX0ZPVU5EIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgRm9ybUlucHV0RXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fU0VSVklDRVNfRk9VTkQiKSk7Ci0gICAgfSAgIAotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJUcmFuc3BvcnRFeGNlcHRpb24iLGUpOwotICAgIH0gCi0gICAgY2F0Y2ggKEZvcm1JbnB1dEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvLyBDb3BpZWQgZGlyZWN0bHkgZnJvbSBVRERJV1NETFByb3h5J3MgZmluZEFsbE93bmVkU2VydmljZXMoKSBtZXRob2Qgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLiBUaGUgaGFyZGNvZGVkIHN0cmluZ3Mgc2hvdWxkIE5PVCBiZSB0cmFuc2xhdGVkLgotICBwcml2YXRlIGZpbmFsIFZlY3RvciBmaW5kQWxsT3duZWRTZXJ2aWNlcyhVRERJUHJveHkgcHJveHksU3RyaW5nIGF1dGhJbmZvU3RyaW5nLFN0cmluZyBidXNpbmVzc0tleSxpbnQgbWF4UmVzdWx0cykgdGhyb3dzIFVERElFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgUmVnaXN0ZXJlZEluZm8gcmVnaXN0ZXJlZEluZm8gPSBudWxsOwotCi0gICAgLy8gR2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIG93bmVkIChyZWdpc3RlcmVkKSBpbmZvLgotICAgIC8vIChBIFJlZ2lzdGVyZWRJbmZvIGNvbnNpc3RzIG9mIEJ1c2luZXNzSW5mb3MgYW5kIFRNb2RlbEluZm9zLgotICAgIC8vIEJ1c2luZXNzSW5mb3MgYWxzbyBjb250YWluIFNlcnZpY2VJbmZvcy4pCi0gICAgcmVnaXN0ZXJlZEluZm8gPSBwcm94eS5nZXRfcmVnaXN0ZXJlZEluZm8oYXV0aEluZm9TdHJpbmcpOwotCi0gICAgLy9DcmVhdGUgYSB2ZWN0b3IgdG8gYWRkIHRoZSBzZXJ2aWNlS2V5cyBmcm9tIHRoZSByZWdpc3RlcmVkSW5mbyB0by4KLSAgICBWZWN0b3Igc2VydmljZUtleUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvL0dldCB0aGUgYnVzaW5lc3NJbmZvcyBmcm9tIHRoZSByZWdpc3RlcmVkSW5mby4KLSAgICBCdXNpbmVzc0luZm9zIGJ1c2luZXNzSW5mb3MgPSByZWdpc3RlcmVkSW5mby5nZXRCdXNpbmVzc0luZm9zKCk7Ci0KLSAgICAvL0dldCBhbGwgdGhlIHNlcnZpY2VLZXlzIGZyb20gdGhlIHNlcnZpY2VJbmZvcyB3aXRoaW4gdGhlIGJ1c2luZXNzSW5mb3MsCi0gICAgLy9hbmQgYWRkIHRoZW0gdG8gdGhlIHNlcnZpY2VLZXlMaXN0LgotICAgIGJvb2xlYW4gZW5kU2VhcmNoID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidXNpbmVzc0luZm9zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIEJ1c2luZXNzSW5mbyBidXNpbmVzc0luZm8gPSBidXNpbmVzc0luZm9zLmdldChpKTsKLSAgICAgIFN0cmluZyBjdXJyZW50QnVzaW5lc3NLZXkgPSBidXNpbmVzc0luZm8uZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICAgIGlmIChidXNpbmVzc0tleS5sZW5ndGgoKSA+IDAgJiYgY3VycmVudEJ1c2luZXNzS2V5LmVxdWFscyhidXNpbmVzc0tleSkpCi0gICAgICAgIGVuZFNlYXJjaCA9IHRydWU7Ci0gICAgICBTZXJ2aWNlSW5mb3Mgc2VydmljZUluZm9zID0gYnVzaW5lc3NJbmZvLmdldFNlcnZpY2VJbmZvcygpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzZXJ2aWNlSW5mb3Muc2l6ZSgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gc2VydmljZUluZm9zLmdldChqKTsKLSAgICAgICAgaWYgKHNlcnZpY2VJbmZvLmdldEJ1c2luZXNzS2V5KCkuZXF1YWxzKGN1cnJlbnRCdXNpbmVzc0tleSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc2VydmljZUtleUxpc3Quc2l6ZSgpIDwgbWF4UmVzdWx0cykKLSAgICAgICAgICAgIHNlcnZpY2VLZXlMaXN0LmFkZChzZXJ2aWNlSW5mby5nZXRTZXJ2aWNlS2V5KCkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbmRTZWFyY2ggPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZW5kU2VhcmNoKQotICAgICAgICBicmVhazsKLSAgICB9ICAgIAotICAgIHJldHVybiBzZXJ2aWNlS2V5TGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VzU2ltcGxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYWVmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuRm9ybUlucHV0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5OYW1lOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5TZXJ2aWNlRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuU2VydmljZUluZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5TZXJ2aWNlSW5mb3M7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5TZXJ2aWNlTGlzdDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSxuYW1lKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIuCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOwotICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUpOwotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBuYW1lVmVjdG9yLmFkZEVsZW1lbnQobmV3IE5hbWUobmFtZSkpOwotCi0gICAgICAvLyBUaGUgYWN0aW9uIGNhbiBiZSBydW4gdW5kZXIgdGhlIGNvbnRleHQgb2YgZWl0aGVyIGEgcmVnaXN0cnkgb3IgYSBxdWVyeSBub2RlLgotICAgICAgZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCk7Ci0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIFNlcnZpY2VMaXN0IHNlcnZpY2VMaXN0ID0gcHJveHkuZmluZF9zZXJ2aWNlKCIiLG5hbWVWZWN0b3IsbnVsbCxudWxsLG51bGwsVURESUFjdGlvbklucHV0cy5RVUVSWV9NQVhfU0VBUkNIX1NFVCk7Ci0gICAgICAKLSAgICAgIFNlcnZpY2VJbmZvcyBzSW5mb3MgPSBzZXJ2aWNlTGlzdC5nZXRTZXJ2aWNlSW5mb3MoKTsKLSAgICAgIGludCBmaW5hbE51bWJlck9mQnVzaW5lc3NTZXJ2aWNlcyA9IE1hdGgubWluKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1JFU1VMVFMsc0luZm9zLnNpemUoKSk7Ci0gICAgICBWZWN0b3Igc2VydmljZUtleVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGZpbmFsTnVtYmVyT2ZCdXNpbmVzc1NlcnZpY2VzO2krKykKLSAgICAgIHsKLSAgICAgICAgU2VydmljZUluZm8gc0luZm8gPSBzSW5mb3MuZ2V0KGkpOwotICAgICAgICBzZXJ2aWNlS2V5VmVjdG9yLmFkZEVsZW1lbnQoc0luZm8uZ2V0U2VydmljZUtleSgpKTsKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBpZiAoZmluYWxOdW1iZXJPZkJ1c2luZXNzU2VydmljZXMgPiAwKQotICAgICAgewotICAgICAgICBpZiAoc2hvdWxkQWRkUXVlcnlOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgU2VydmljZURldGFpbCBzZXJ2aWNlRGV0YWlsID0gcHJveHkuZ2V0X3NlcnZpY2VEZXRhaWwoc2VydmljZUtleVZlY3Rvcik7Ci0gICAgICAgICAgVmVjdG9yIGJ1c2luZXNzU2VydmljZVZlY3RvciA9IHNlcnZpY2VEZXRhaWwuZ2V0QnVzaW5lc3NTZXJ2aWNlVmVjdG9yKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICAgICAgQnVzaW5lc3NTZXJ2aWNlW10gYnNBcnJheSA9IG5ldyBCdXNpbmVzc1NlcnZpY2VbZmluYWxOdW1iZXJPZkJ1c2luZXNzU2VydmljZXNdOwotICAgICAgICAgIGJ1c2luZXNzU2VydmljZVZlY3Rvci50b0FycmF5KGJzQXJyYXkpOwotICAgICAgICAgIHF1ZXJ5RWxlbWVudF8gPSBuZXcgUXVlcnlFbGVtZW50KGJzQXJyYXkscXVlcnlOYW1lLHJlZ0VsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgICAgYWRkUXVlcnlOb2RlKCk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VTX0ZPVU5EIixTdHJpbmcudmFsdWVPZihic0FycmF5Lmxlbmd0aCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IEZvcm1JbnB1dEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1NFUlZJQ0VTX0ZPVU5EIikpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZvcm1JbnB1dEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTNhOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLk5hbWU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5EaXNjb3ZlcnlVUkw7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkRpc2NvdmVyeVVSTHM7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLklkZW50aWZpZXJCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgUmVnUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRBY3Rpb24gZXh0ZW5kcyBQdWJsaXNoQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nW10gbmFtZUxhbmd1YWdlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBuYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbkxhbmd1YWdlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25zID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OKTsKLSAgICBTdHJpbmdbXSBpZFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfVFlQRSk7Ci0gICAgU3RyaW5nW10gaWRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBpZEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9WQUxVRSk7Ci0gICAgU3RyaW5nW10gY2F0VHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfVFlQRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGNhdEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfVkFMVUUpOwotICAgIFN0cmluZ1tdIGRpc2NvdmVyeVVSTFZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ESVNDT1ZFUllVUkwpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0KLSAgICBIYXNodGFibGUgbGFuZ3VhZ2VIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChuYW1lTGFuZ3VhZ2VzICE9IG51bGwgJiYgbmFtZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgbmFtZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIC8vIFVEREkncyBzYXZlIEFQSSAoQXBwZW5kaXggQyBvZiB0aGUgVURESSBWMiBQcm9ncmFtbWVycyBBUEkgU3BlY2lmaWNhdGlvbikgcmVxdWlyZXMgdGhlIGZvbGxvd2luZzoKLSAgICAgIC8vIDEpIE9ubHkgdGhlIGZpcnN0IHJvdyBjYW4gaGF2ZSBhIGJsYW5rIGxhbmd1YWdlLgotICAgICAgLy8gMikgT25seSAxIG5hbWUgcGVyIGxhbmd1YWdlLgotICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICBwYXJhbWV0ZXJzWzBdID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpOwotICAgICAgZm9yIChpbnQgaT0wO2k8bmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIE5hbWUgdWRkaTRqTmFtZTsKLSAgICAgICAgaWYgKG5hbWVMYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0ak5hbWUgPSBuZXcgTmFtZShuYW1lc1tpXSxuYW1lTGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldKTsKLSAgICAgICAgICBpZiAoaSAhPSAwICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsaSk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZ3VhZ2VIYXNoLmdldChuYW1lTGFuZ3VhZ2VzW2ldKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsYW5ndWFnZUhhc2gucHV0KG5hbWVMYW5ndWFnZXNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaWYgKG5hbWVzW2ldLnRyaW0oKS5sZW5ndGgoKSA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZVZlY3Rvci5hZGRFbGVtZW50KHVkZGk0ak5hbWUpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsbmFtZVZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19OQU1FUyIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZGVzY3JpcHRpb25MYW5ndWFnZXMgIT0gbnVsbCAmJiBkZXNjcmlwdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgZGVzY3JpcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVNDUklQVElPTiIpOwotICAgICAgbGFuZ3VhZ2VIYXNoLmNsZWFyKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbnMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIERlc2NyaXB0aW9uIHVkZGk0akRlc2NyaXB0aW9uOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSxkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSk7Ci0gICAgICAgICAgaWYgKGkgIT0gMCAmJiAhc3ViUXVlcnlJbml0aWF0ZWRfKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYW5ndWFnZUhhc2guZ2V0KGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgbGFuZ3VhZ2VIYXNoLnB1dChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25zW2ldLnRyaW0oKS5sZW5ndGgoKSA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yLmFkZEVsZW1lbnQodWRkaTRqRGVzY3JpcHRpb24pOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpOwotCi0gICAgaWYgKGlkVHlwZXMgIT0gbnVsbCAmJiBpZEtleU5hbWVzICE9IG51bGwgJiYgaWRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gbmV3IElkZW50aWZpZXJCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGlkS2V5TmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoaWRLZXlOYW1lc1tpXSxpZEtleVZhbHVlc1tpXSxpZFR5cGVzW2ldKTsKLSAgICAgICAgaWRCYWcuYWRkKGtyKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTLGlkQmFnKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyk7Ci0KLSAgICBpZiAoY2F0VHlwZXMgIT0gbnVsbCAmJiBjYXRLZXlOYW1lcyAhPSBudWxsICYmIGNhdEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VHlwZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoY2F0S2V5TmFtZXNbaV0sY2F0S2V5VmFsdWVzW2ldLGNhdFR5cGVzW2ldKTsKLSAgICAgICAgY2F0QmFnLmFkZChrcik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19DQVRFR09SSUVTLGNhdEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7Ci0gICAgICAKLSAgICBpZiAoZGlzY292ZXJ5VVJMVmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgRGlzY292ZXJ5VVJMcyBkaXNjb3ZlcnlVUkxzID0gbmV3IERpc2NvdmVyeVVSTHMoKTsKLSAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcGFyYW1ldGVyc1swXSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RJU0NPVkVSWVVSTCIpOwotICAgICAgZm9yIChpbnQgaT0wO2k8ZGlzY292ZXJ5VVJMVmFsdWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIHBhcmFtZXRlcnNbMV0gPSBTdHJpbmcudmFsdWVPZihpKzEpOwotICAgICAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlVVJMKGRpc2NvdmVyeVVSTFZhbHVlc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBkaXNjb3ZlcnlVUkxzLmFkZChuZXcgRGlzY292ZXJ5VVJMKGRpc2NvdmVyeVVSTFZhbHVlc1tpXSwiIikpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyxkaXNjb3ZlcnlVUkxzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsgICAgICAKLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TKTsKLSAgICAgIElkZW50aWZpZXJCYWcgaWRlbnRpZmllckJhZyA9IChJZGVudGlmaWVyQmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLSAgICAgIENhdGVnb3J5QmFnIGNhdGVnb3J5QmFnID0gKENhdGVnb3J5QmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMpOwotICAgICAgRGlzY292ZXJ5VVJMcyBkaXNjb3ZlcnlVUkxzID0gKERpc2NvdmVyeVVSTHMpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyk7Ci0KLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUuCi0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICAgIHJlZ0VsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLQotICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSBuZXcgQnVzaW5lc3NFbnRpdHkoKTsKLSAgICAgIGJlLnNldEJ1c2luZXNzS2V5KCIiKTsKLSAgICAgIGJlLnNldE5hbWVWZWN0b3IobmFtZVZlY3Rvcik7Ci0gICAgICBiZS5zZXREZXNjcmlwdGlvblZlY3RvcihkZXNjcmlwdGlvblZlY3Rvcik7Ci0gICAgICBiZS5zZXRJZGVudGlmaWVyQmFnKGlkZW50aWZpZXJCYWcpOwotICAgICAgYmUuc2V0Q2F0ZWdvcnlCYWcoY2F0ZWdvcnlCYWcpOwotICAgICAgYmUuc2V0RGlzY292ZXJ5VVJMcyhkaXNjb3ZlcnlVUkxzKTsKLSAgICAgIFZlY3RvciBiZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGJlVmVjdG9yLmFkZChiZSk7Ci0KLSAgICAgIGJlID0gKEJ1c2luZXNzRW50aXR5KXByb3h5LnNhdmVfYnVzaW5lc3MocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBiZVZlY3RvcikuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICBhZGRQdWJsaXNoZWRJdGVtTm9kZShiZSxyZWdFbGVtZW50KTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19CVVNJTkVTU19QVUJMSVNIRUQiLGJlLmdldERlZmF1bHROYW1lU3RyaW5nKCkpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2RkNjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5OYW1lOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uIGV4dGVuZHMgUHVibGlzaEFjdGlvbgotewotICBwdWJsaWMgUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfREVTQ1JJUFRJT04pOwotCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUsbmFtZSk7Ci0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKG5hbWUpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9OQU1FIikpOwotICAgIH0KLQotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX0RFU0NSSVBUSU9OLGRlc2NyaXB0aW9uKTsKLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0gICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19ERVNDUklQVElPTik7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotCi0gICAgICBCdXNpbmVzc0VudGl0eSBiZSA9IG5ldyBCdXNpbmVzc0VudGl0eSgpOwotICAgICAgYmUuc2V0QnVzaW5lc3NLZXkoIiIpOwotICAgICAgYmUuc2V0RGVmYXVsdE5hbWUobmV3IE5hbWUobmFtZSkpOwotICAgICAgYmUuc2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKGRlc2NyaXB0aW9uKTsKLSAgICAgIFZlY3RvciBiZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGJlVmVjdG9yLmFkZChiZSk7Ci0KLSAgICAgIGJlID0gKEJ1c2luZXNzRW50aXR5KXByb3h5LnNhdmVfYnVzaW5lc3MocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBiZVZlY3RvcikuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICBhZGRQdWJsaXNoZWRJdGVtTm9kZShiZSxyZWdFbGVtZW50KTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19CVVNJTkVTU19QVUJMSVNIRUQiLGJlLmdldERlZmF1bHROYW1lU3RyaW5nKCkpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYjQ4YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLk5hbWU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24gZXh0ZW5kcyBQdWJsaXNoQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBidXNOb2RlSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5PREVJRF9CVVNJTkVTUyk7Ci0gICAgU3RyaW5nW10gc2VySW50SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCk7Ci0gICAgU3RyaW5nW10gbmFtZUxhbmd1YWdlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBuYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FKTsgICAgCi0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25MYW5ndWFnZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT05fTEFOR1VBR0UpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTik7Ci0gICAgU3RyaW5nW10gY2F0VHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfVFlQRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGNhdEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfVkFMVUUpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0KLSAgICBpZiAoYnVzTm9kZUlkcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBzZXJ2aWNlQnVzaW5lc3MgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTKTsKLSAgICAgIGlmIChzZXJ2aWNlQnVzaW5lc3MgPT0gbnVsbCkKLSAgICAgICAgc2VydmljZUJ1c2luZXNzID0gbmV3IFZlY3RvcigpOwotICAgICAgZWxzZQotICAgICAgICBzZXJ2aWNlQnVzaW5lc3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgIFZlY3RvciBzZXJ2aWNlQnVzaW5lc3NDb3B5ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU19DT1BZKTsKLSAgICAgIC8vIFRoZSBicm93c2VyIHdpbGwgZW5mb3JjZSB0aGUgcnVsZSBvZiBoYXZpbmcgb25seSBvbmUgYnVzaW5lc3MgaW4gdGhpcyBsaXN0LgotICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZUJ1c2luZXNzQ29weS5lbGVtZW50QXQoMCk7Ci0gICAgICBzZXJ2aWNlQnVzaW5lc3MuYWRkRWxlbWVudChsaXN0RWxlbWVudCk7Ci0gICAgICBCdXNpbmVzc0VudGl0eSBzcCA9IChCdXNpbmVzc0VudGl0eSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1Msc2VydmljZUJ1c2luZXNzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUixzcCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSxzcC5nZXRCdXNpbmVzc0tleSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUik7Ci0gICAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXykKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX0JVU0lORVNTIikpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICBpZiAoc2VySW50SWRzICE9IG51bGwgJiYgc2VySW50SWRzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgVmVjdG9yIHNlcnZpY2VJbnRlcmZhY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgICAgaWYgKHNlcnZpY2VJbnRlcmZhY2VzID09IG51bGwpCi0gICAgICAgIHNlcnZpY2VJbnRlcmZhY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgZWxzZQotICAgICAgICBzZXJ2aWNlSW50ZXJmYWNlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgVmVjdG9yIHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFkpOwotICAgICAgVmVjdG9yIHRtb2RlbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VydmljZUludGVyZmFjZXNDb3B5Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWl0Lm5leHQoKTsKLSAgICAgICAgaW50IHRhcmdldE5vZGVJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlckludElkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXROb2RlSWQgPT0gSW50ZWdlci5wYXJzZUludChzZXJJbnRJZHNbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZXJ2aWNlSW50ZXJmYWNlcy5hZGQobGlzdEVsZW1lbnQpOwotICAgICAgICAgICAgICB0bW9kZWxzLmFkZChsaXN0RWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUywgc2VydmljZUludGVyZmFjZXMpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9UTU9ERUwsIHRtb2RlbHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfVE1PREVMKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHdzZGxVUkwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMLHdzZGxVUkwpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCx3c2RsVVJMKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHdzZGxVUkwpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMIikpOwotICAgIH0KLQotICAgIEhhc2h0YWJsZSBsYW5ndWFnZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgaWYgKG5hbWVMYW5ndWFnZXMgIT0gbnVsbCAmJiBuYW1lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBuYW1lVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgLy8gVURESSdzIHNhdmUgQVBJIChBcHBlbmRpeCBDIG9mIHRoZSBVRERJIFYyIFByb2dyYW1tZXJzIEFQSSBTcGVjaWZpY2F0aW9uKSByZXF1aXJlcyB0aGUgZm9sbG93aW5nOgotICAgICAgLy8gMSkgT25seSB0aGUgZmlyc3Qgcm93IGNhbiBoYXZlIGEgYmxhbmsgbGFuZ3VhZ2UuCi0gICAgICAvLyAyKSBPbmx5IDEgbmFtZSBwZXIgbGFuZ3VhZ2UuCi0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxuYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwYXJhbWV0ZXJzWzFdID0gU3RyaW5nLnZhbHVlT2YoaSsxKTsKLSAgICAgICAgTmFtZSB1ZGRpNGpOYW1lOwotICAgICAgICBpZiAobmFtZUxhbmd1YWdlc1tpXS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldLG5hbWVMYW5ndWFnZXNbaV0pOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpNGpOYW1lID0gbmV3IE5hbWUobmFtZXNbaV0pOwotICAgICAgICAgIGlmIChpICE9IDAgJiYgIXN1YlF1ZXJ5SW5pdGlhdGVkXykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLGkpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlSGFzaC5nZXQobmFtZUxhbmd1YWdlc1tpXSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsYW5ndWFnZUhhc2gucHV0KG5hbWVMYW5ndWFnZXNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaWYgKG5hbWVzW2ldLnRyaW0oKS5sZW5ndGgoKSA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBuYW1lVmVjdG9yLmFkZEVsZW1lbnQodWRkaTRqTmFtZSk7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLG5hbWVWZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX05BTUVTIikpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChkZXNjcmlwdGlvbkxhbmd1YWdlcyAhPSBudWxsICYmIGRlc2NyaXB0aW9ucyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcGFyYW1ldGVyc1swXSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIik7Ci0gICAgICBsYW5ndWFnZUhhc2guY2xlYXIoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGRlc2NyaXB0aW9ucy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwYXJhbWV0ZXJzWzFdID0gU3RyaW5nLnZhbHVlT2YoaSsxKTsKLSAgICAgICAgRGVzY3JpcHRpb24gdWRkaTRqRGVzY3JpcHRpb247Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgdWRkaTRqRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb24oZGVzY3JpcHRpb25zW2ldLGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaTRqRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb24oZGVzY3JpcHRpb25zW2ldKTsKLSAgICAgICAgICBpZiAoaSAhPSAwICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZ3VhZ2VIYXNoLmdldChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgbGFuZ3VhZ2VIYXNoLnB1dChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25zW2ldLnRyaW0oKS5sZW5ndGgoKSA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzY3JpcHRpb25WZWN0b3IuYWRkRWxlbWVudCh1ZGRpNGpEZXNjcmlwdGlvbik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyxkZXNjcmlwdGlvblZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpOwotCi0gICAgaWYgKGNhdFR5cGVzICE9IG51bGwgJiYgY2F0S2V5TmFtZXMgIT0gbnVsbCAmJiBjYXRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSBuZXcgQ2F0ZWdvcnlCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGNhdFR5cGVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gbmV3IEtleWVkUmVmZXJlbmNlKGNhdEtleU5hbWVzW2ldLGNhdEtleVZhbHVlc1tpXSxjYXRUeXBlc1tpXSk7Ci0gICAgICAgIGNhdEJhZy5hZGQoa3IpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTLGNhdEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSKTsKLSAgICAgIFN0cmluZyBidXNpbmVzc0tleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpOwotICAgICAgVmVjdG9yIHRNb2RlbFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9UTU9ERUwpOwotICAgICAgU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpOwotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0gICAgICBDYXRlZ29yeUJhZyBjYXRlZ29yeUJhZyA9IChDYXRlZ29yeUJhZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMpOwotCi0gICAgICAvLyBUaGUgYWN0aW9uIGNhbiBiZSBydW4gdW5kZXIgdGhlIGNvbnRleHQgb2YgZWl0aGVyIGEgcmVnaXN0cnkgb3IgYSBxdWVyeSBub2RlLgotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgICAgICByZWdFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLHVzZXJJZCxwYXNzd29yZCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0KLSAgICAgIFVkZGk0akhlbHBlciB1ZGRpNGpIZWxwZXIgPSBuZXcgVWRkaTRqSGVscGVyKCk7Ci0gICAgICBEZWZpbml0aW9uIGRlZiA9IHVkZGk0akhlbHBlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLQotICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzOwotICAgICAgaWYgKHRNb2RlbFZlY3RvciAhPSBudWxsICYmIHRNb2RlbFZlY3Rvci5zaXplKCkgPiAwKQotICAgICAgICBicyA9IHVkZGk0akhlbHBlci5uZXdCdXNpbmVzc1NlcnZpY2Uod3NkbFVSTCwgZGVmLCAoVE1vZGVsW10pdE1vZGVsVmVjdG9yLnRvQXJyYXkobmV3IFRNb2RlbFswXSkpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUFjdGlvbiByZWdQdWJsaXNoU0lBY3Rpb24gPSBuZXcgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICBpbnQgY3VycmVudE5vZGVJZCA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpLmdldE5vZGVJZCgpOwotICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHJlZ05vZGVfLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIFRNb2RlbFtdIHRNb2RlbHMgPSBudWxsOwotICAgICAgICBpZiAodWRkaTRqSGVscGVyLmlzTW9ub2xpdGhpY1dTREwoZGVmKSkKLSAgICAgICAgewotICAgICAgICAgIHRNb2RlbHMgPSBuZXcgVE1vZGVsWzFdOwotICAgICAgICAgIHRNb2RlbHNbMF0gPSB1ZGRpNGpIZWxwZXIubmV3VE1vZGVsKHdzZGxVUkwsIGRlZik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nW10gaW1wb3J0cyA9IHVkZGk0akhlbHBlci5nZXRJbXBvcnRzKGRlZiwgd3NkbFVSTCk7Ci0gICAgICAgICAgdE1vZGVscyA9IG5ldyBUTW9kZWxbaW1wb3J0cy5sZW5ndGhdOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdE1vZGVscy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHRNb2RlbHNbaV0gPSB1ZGRpNGpIZWxwZXIubmV3VE1vZGVsKGltcG9ydHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIEhhc2h0YWJsZSB0TW9kZWxzVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGlmICh0TW9kZWxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpPTA7aTx0TW9kZWxzLmxlbmd0aDtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHJlZ1B1Ymxpc2hTSUFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUodWRkaTRqSGVscGVyLmdldFdTREwodE1vZGVsc1tpXSksIHRNb2RlbHNbaV0pOwotICAgICAgICAgICAgaWYgKGlucHV0c1ZhbGlkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWdQdWJsaXNoU0lBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgIE9iamVjdCBzYXZlZFRNb2RlbCA9IHJlZ1B1Ymxpc2hTSUFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkuZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfT1VUUFVUX1NBVkVEX1RNT0RFTCk7Ci0gICAgICAgICAgICAgIGlmIChzYXZlZFRNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRNb2RlbHNUYWJsZS5wdXQoKChUTW9kZWwpc2F2ZWRUTW9kZWwpLmdldE5hbWVTdHJpbmcoKSwgc2F2ZWRUTW9kZWwpOwotICAgICAgICAgICAgICAvLyBSZXNlbGVjdCB0aGUgY3VycmVudCBub2RlLgotICAgICAgICAgICAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChjdXJyZW50Tm9kZUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnMgPSB1ZGRpNGpIZWxwZXIubmV3QnVzaW5lc3NTZXJ2aWNlKHdzZGxVUkwsIGRlZiwgdE1vZGVsc1RhYmxlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGJlICE9IG51bGwpCi0gICAgICAgIGJzLnNldEJ1c2luZXNzS2V5KGJlLmdldEJ1c2luZXNzS2V5KCkpOwotICAgICAgZWxzZSBpZiAoYnVzaW5lc3NLZXkgIT0gbnVsbCkKLSAgICAgICAgYnMuc2V0QnVzaW5lc3NLZXkoYnVzaW5lc3NLZXkpOwotICAgICAgYnMuc2V0TmFtZVZlY3RvcihuYW1lVmVjdG9yKTsKLSAgICAgIGJzLnNldERlc2NyaXB0aW9uVmVjdG9yKGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICAgIGJzLnNldENhdGVnb3J5QmFnKGNhdGVnb3J5QmFnKTsKLSAgICAgIFZlY3RvciBic1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGJzVmVjdG9yLmFkZChicyk7Ci0gICAgICByZWdFbGVtZW50LmhhbmRsZVByZUludm9jYXRpb24oYnMpOwotICAgICAgYnMgPSAoQnVzaW5lc3NTZXJ2aWNlKXByb3h5LnNhdmVfc2VydmljZShyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIGJzVmVjdG9yKS5nZXRCdXNpbmVzc1NlcnZpY2VWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICBhZGRQdWJsaXNoZWRJdGVtTm9kZShicyxyZWdFbGVtZW50KTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX1BVQkxJU0hFRCIsYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiV1NETEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOyAgICAgIAotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjQyNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuSWRlbnRpZmllckJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuS2V5ZWRSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQWN0aW9uIGV4dGVuZHMgUHVibGlzaEFjdGlvbgotewotICBwdWJsaWMgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB3c2RsVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwpOwotICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04pOwotICAgIFN0cmluZ1tdIGlkVHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9UWVBFKTsKLSAgICBTdHJpbmdbXSBpZEtleU5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGlkS2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX1ZBTFVFKTsKLSAgICBTdHJpbmdbXSBjYXRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLQotICAgIEhhc2h0YWJsZSBsYW5ndWFnZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBpZiAod3NkbFVSTCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwsd3NkbFVSTCk7Ci0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHdzZGxVUkwpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTCIpKTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSxuYW1lKTsKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcobmFtZSkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfTkFNRSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVzY3JpcHRpb25MYW5ndWFnZXMgIT0gbnVsbCAmJiBkZXNjcmlwdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgZGVzY3JpcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVNDUklQVElPTiIpOwotICAgICAgbGFuZ3VhZ2VIYXNoLmNsZWFyKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbnMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIERlc2NyaXB0aW9uIHVkZGk0akRlc2NyaXB0aW9uOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSxkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSk7Ci0gICAgICAgICAgaWYgKGkgIT0gMCAmJiAhc3ViUXVlcnlJbml0aWF0ZWRfKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYW5ndWFnZUhhc2guZ2V0KGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgbGFuZ3VhZ2VIYXNoLnB1dChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25zW2ldLnRyaW0oKS5sZW5ndGgoKSA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yLmFkZEVsZW1lbnQodWRkaTRqRGVzY3JpcHRpb24pOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMpOwotCi0gICAgaWYgKGlkVHlwZXMgIT0gbnVsbCAmJiBpZEtleU5hbWVzICE9IG51bGwgJiYgaWRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gbmV3IElkZW50aWZpZXJCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGlkS2V5TmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoaWRLZXlOYW1lc1tpXSxpZEtleVZhbHVlc1tpXSxpZFR5cGVzW2ldKTsKLSAgICAgICAgaWRCYWcuYWRkKGtyKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTLGlkQmFnKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0KLSAgICBpZiAoY2F0VHlwZXMgIT0gbnVsbCAmJiBjYXRLZXlOYW1lcyAhPSBudWxsICYmIGNhdEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VHlwZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoY2F0S2V5TmFtZXNbaV0sY2F0S2V5VmFsdWVzW2ldLGNhdFR5cGVzW2ldKTsKLSAgICAgICAgY2F0QmFnLmFkZChrcik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTLGNhdEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyk7Ci0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICAgIFN0cmluZyB3c2RsVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICBWZWN0b3IgZGVzY3JpcHRpb25WZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyk7Ci0gICAgICBJZGVudGlmaWVyQmFnIGlkZW50aWZpZXJCYWcgPSAoSWRlbnRpZmllckJhZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0gICAgICBDYXRlZ29yeUJhZyBjYXRlZ29yeUJhZyA9IChDYXRlZ29yeUJhZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTKTsKLQotICAgICAgLy8gVGhlIGFjdGlvbiBjYW4gYmUgcnVuIHVuZGVyIHRoZSBjb250ZXh0IG9mIGVpdGhlciBhIHJlZ2lzdHJ5IG9yIGEgcXVlcnkgbm9kZS4KLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotCi0gICAgICBUTW9kZWwgdE1vZGVsID0gKG5ldyBVZGRpNGpIZWxwZXIoKSkubmV3VE1vZGVsKHdzZGxVUkwpOwotICAgICAgdE1vZGVsLnNldE5hbWUobmFtZSk7Ci0gICAgICB0TW9kZWwuc2V0RGVzY3JpcHRpb25WZWN0b3IoZGVzY3JpcHRpb25WZWN0b3IpOwotICAgICAgdE1vZGVsLnNldElkZW50aWZpZXJCYWcoaWRlbnRpZmllckJhZyk7Ci0gICAgICAKLSAgICAgIC8vIFRoZSBjYXRlZ29yeSBiYWcgbWF5IGNvbnRhaW4gd3NkbFNwZWMuCi0gICAgICBDYXRlZ29yeUJhZyBkZWZhdWx0Q2F0ZWdvcnlCYWcgPSB0TW9kZWwuZ2V0Q2F0ZWdvcnlCYWcoKTsKLSAgICAgIFZlY3RvciBkZWZhdWx0S2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBudWxsOwotICAgICAgaWYgKGRlZmF1bHRDYXRlZ29yeUJhZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoY2F0ZWdvcnlCYWcgPT0gbnVsbCkKLSAgICAgICAgICBjYXRlZ29yeUJhZyA9IGRlZmF1bHRDYXRlZ29yeUJhZzsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZGVmYXVsdEtleWVkUmVmZXJlbmNlVmVjdG9yID0gZGVmYXVsdENhdGVnb3J5QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wO2k8ZGVmYXVsdEtleWVkUmVmZXJlbmNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpZGVmYXVsdEtleWVkUmVmZXJlbmNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeUJhZyAhPSBudWxsKQotICAgICAgICAgICAgICBjYXRlZ29yeUJhZy5hZGQoa3IpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgdE1vZGVsLnNldENhdGVnb3J5QmFnKGNhdGVnb3J5QmFnKTsKLQotICAgICAgVmVjdG9yIHRNb2RlbFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHRNb2RlbFZlY3Rvci5hZGQodE1vZGVsKTsKLSAgICAgIHRNb2RlbCA9IChUTW9kZWwpcHJveHkuc2F2ZV90TW9kZWwocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCB0TW9kZWxWZWN0b3IpLmdldFRNb2RlbFZlY3RvcigpLmdldCgwKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX09VVFBVVF9TQVZFRF9UTU9ERUwsIHRNb2RlbCk7Ci0gICAgICBhZGRQdWJsaXNoZWRJdGVtTm9kZSh0TW9kZWwscmVnRWxlbWVudCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfUFVCTElTSEVEIix0TW9kZWwuZ2V0TmFtZVN0cmluZygpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJXU0RMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NjU3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUFjdGlvbiBleHRlbmRzIFB1Ymxpc2hBY3Rpb24KLXsKLSAgcHVibGljIFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB3c2RsVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwpOwotICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OKTsKLQotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgaWYgKHdzZGxVUkwgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCx3c2RsVVJMKTsKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcod3NkbFVSTCkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTCIpKTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUsbmFtZSk7Ci0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKG5hbWUpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9OQU1FIikpOwotICAgIH0KLQotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OLGRlc2NyaXB0aW9uKTsKLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKFN0cmluZyB3c2RsVVJMLCBUTW9kZWwgdE1vZGVsKQotICB7Ci0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgU3RyaW5nIG5hbWUgPSB0TW9kZWwuZ2V0TmFtZVN0cmluZygpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHRNb2RlbC5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSAgICBpZiAod3NkbFVSTCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMLHdzZGxVUkwpOwotICAgIGVsc2UKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkgCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSxuYW1lKTsKLSAgICBlbHNlCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIAotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OLGRlc2NyaXB0aW9uKTsKLSAgICBlbHNlCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT04sIiIpOwotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTik7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotCi0gICAgICBUTW9kZWwgdE1vZGVsID0gKG5ldyBVZGRpNGpIZWxwZXIoKSkubmV3VE1vZGVsKHdzZGxVUkwpOwotICAgICAgdE1vZGVsLnNldE5hbWUobmFtZSk7Ci0gICAgICB0TW9kZWwuc2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKGRlc2NyaXB0aW9uKTsKLQotICAgICAgVmVjdG9yIHRNb2RlbFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHRNb2RlbFZlY3Rvci5hZGQodE1vZGVsKTsKLSAgICAgIHRNb2RlbCA9IChUTW9kZWwpcHJveHkuc2F2ZV90TW9kZWwocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCB0TW9kZWxWZWN0b3IpLmdldFRNb2RlbFZlY3RvcigpLmdldCgwKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX09VVFBVVF9TQVZFRF9UTU9ERUwsIHRNb2RlbCk7Ci0gICAgICBhZGRQdWJsaXNoZWRJdGVtTm9kZSh0TW9kZWwscmVnRWxlbWVudCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfUFVCTElTSEVEIix0TW9kZWwuZ2V0TmFtZVN0cmluZygpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiV1NETEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlRyYW5zcG9ydEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1YzIyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLk5hbWU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbiBleHRlbmRzIFB1Ymxpc2hBY3Rpb24KLXsKLSAgcHVibGljIFJlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUpKTsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsgICAgCi0gICAgU3RyaW5nIGJ1c05vZGVJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuTk9ERUlEX0JVU0lORVNTKTsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMKTsKLSAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfREVTQ1JJUFRJT04pOwotCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0KLSAgICBpZiAoYnVzTm9kZUlkcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBzZXJ2aWNlQnVzaW5lc3MgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICAgICBpZiAoc2VydmljZUJ1c2luZXNzID09IG51bGwpCi0gICAgICAgIHNlcnZpY2VCdXNpbmVzcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2VydmljZUJ1c2luZXNzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICBWZWN0b3Igc2VydmljZUJ1c2luZXNzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTX0NPUFkpOwotICAgICAgLy8gVGhlIGJyb3dzZXIgd2lsbCBlbmZvcmNlIHRoZSBydWxlIG9mIGhhdmluZyBvbmx5IG9uZSBidXNpbmVzcyBpbiB0aGlzIGxpc3QuCi0gICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzZXJ2aWNlQnVzaW5lc3NDb3B5LmVsZW1lbnRBdCgwKTsKLSAgICAgIHNlcnZpY2VCdXNpbmVzcy5hZGRFbGVtZW50KGxpc3RFbGVtZW50KTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1Msc2VydmljZUJ1c2luZXNzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIsYmUpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVksYmUuZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTKTsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUik7Ci0gICAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXykKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9CVVNJTkVTUyIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAod3NkbFVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwsd3NkbFVSTCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9XU0RMX1VSTCx3c2RsVVJMKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHdzZGxVUkwpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1dTRExfVVJMKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTCIpKTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSxuYW1lKTsKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcobmFtZSkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfTkFNRSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OLGRlc2NyaXB0aW9uKTsKLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0gICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUik7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSk7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1dTRExfVVJMKTsKLSAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9ERVNDUklQVElPTik7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgCi0gICAgICBVZGRpNGpIZWxwZXIgdWRkaTRqSGVscGVyID0gbmV3IFVkZGk0akhlbHBlcigpOwotICAgICAgRGVmaW5pdGlvbiBkZWYgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgICBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUFjdGlvbiByZWdQdWJsaXNoU0lBY3Rpb24gPSBuZXcgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgaW50IGN1cnJlbnROb2RlSWQgPSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXROb2RlSWQoKTsKLSAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gcmVnTm9kZV8uZ2V0Tm9kZU1hbmFnZXIoKTsKLQotICAgICAgSGFzaHRhYmxlIHRNb2RlbHNUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIFRNb2RlbFtdIHRNb2RlbHMgPSBudWxsOwotICAgICAgaWYgKHVkZGk0akhlbHBlci5pc01vbm9saXRoaWNXU0RMKGRlZikpCi0gICAgICB7Ci0gICAgICAgIHRNb2RlbHMgPSBuZXcgVE1vZGVsWzFdOwotICAgICAgICB0TW9kZWxzWzBdID0gdWRkaTRqSGVscGVyLm5ld1RNb2RlbCh3c2RsVVJMLCBkZWYpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBpbXBvcnRzID0gdWRkaTRqSGVscGVyLmdldEltcG9ydHMoZGVmLCB3c2RsVVJMKTsKLSAgICAgICAgdE1vZGVscyA9IG5ldyBUTW9kZWxbaW1wb3J0cy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRNb2RlbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgdE1vZGVsc1tpXSA9IHVkZGk0akhlbHBlci5uZXdUTW9kZWwoaW1wb3J0c1tpXSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0TW9kZWxzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHRNb2RlbHMubGVuZ3RoO2krKykKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSByZWdQdWJsaXNoU0lBY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHVkZGk0akhlbHBlci5nZXRXU0RMKHRNb2RlbHNbaV0pLCB0TW9kZWxzW2ldKTsKLSAgICAgICAgICBpZiAoaW5wdXRzVmFsaWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVnUHVibGlzaFNJQWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgT2JqZWN0IHNhdmVkVE1vZGVsID0gcmVnUHVibGlzaFNJQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKS5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9PVVRQVVRfU0FWRURfVE1PREVMKTsKLSAgICAgICAgICAgIGlmIChzYXZlZFRNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0TW9kZWxzVGFibGUucHV0KCgoVE1vZGVsKXNhdmVkVE1vZGVsKS5nZXROYW1lU3RyaW5nKCksIHNhdmVkVE1vZGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFJlc2VsZWN0IHRoZSBjdXJyZW50IG5vZGUuCi0gICAgICAgICAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChjdXJyZW50Tm9kZUlkKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gdWRkaTRqSGVscGVyLm5ld0J1c2luZXNzU2VydmljZSh3c2RsVVJMLCBkZWYsIHRNb2RlbHNUYWJsZSk7Ci0gICAgICBpZiAoYmUgIT0gbnVsbCkKLSAgICAgICAgYnMuc2V0QnVzaW5lc3NLZXkoYmUuZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgICBlbHNlIGlmIChidXNpbmVzc0tleSAhPSBudWxsKQotICAgICAgICBicy5zZXRCdXNpbmVzc0tleShidXNpbmVzc0tleSk7Ci0gICAgICBicy5zZXREZWZhdWx0TmFtZShuZXcgTmFtZShuYW1lKSk7Ci0gICAgICBicy5zZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoZGVzY3JpcHRpb24pOwotICAgICAgVmVjdG9yIGJzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgYnNWZWN0b3IuYWRkKGJzKTsKLSAgICAgIHJlZ0VsZW1lbnQuaGFuZGxlUHJlSW52b2NhdGlvbihicyk7Ci0gICAgICBicyA9IChCdXNpbmVzc1NlcnZpY2UpcHJveHkuc2F2ZV9zZXJ2aWNlKHJlZ0VsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgYnNWZWN0b3IpLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpLmdldCgwKTsKLSAgICAgIGFkZFB1Ymxpc2hlZEl0ZW1Ob2RlKGJzLHJlZ0VsZW1lbnQpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfUFVCTElTSEVEIixicy5nZXREZWZhdWx0TmFtZVN0cmluZygpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJXU0RMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVtb3ZlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjYxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQnVzaW5lc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5QdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYXNzZXJ0aW9uLlB1Ymxpc2hlckFzc2VydGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLkNvbXBsZXRpb25TdGF0dXM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5EaXNwb3NpdGlvblJlcG9ydDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlJlc3VsdDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGV4dGVuZHMgQ29tbW9uUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbgotewotICBwdWJsaWMgUmVtb3ZlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAocmVnaXN0cnlOb2RlXyA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0KLSAgICAvLyBpZHMgZnJvbSB1ZGRpT2JqZWN0c190YWJsZQotICAgIFN0cmluZ1tdIHNlbGVjdGVkQnVzSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCk7Ci0gICAgaWYgKHNlbGVjdGVkQnVzSWRzICE9IG51bGwgJiYgc2VsZWN0ZWRCdXNJZHMubGVuZ3RoID4gMCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCwgc2VsZWN0ZWRCdXNJZHMpOwotICAgIC8vIFN5bmNocm9uaXplIGNsaWVudCB2aWV3IGFuZCBzZXJ2ZXIgbW9kZWwgKHVkZGlPYmplY3RfdGFibGUuanNwKQotICAgIHN5bmNocm9uaXplVURESU9iamVjdFRhYmxlKCk7Ci0KLSAgICAvLyBpZiBub3QgeWV0IGxvZ2dlZCBpbiwgdmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGxvZyBpbgotICAgIGlmICghaXNMb2dnZWRJbl8pIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySUQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0KLSAgICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgfQotICAKLSAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHB1Ymxpc2hVUkwpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTCIpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHVzZXJJRCE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySUQpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySUQpOwotICAgICAgfQotICAKLSAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHVzZXJJRCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9VU0VSSUQiKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIGlkcyBmcm9tIHB1Ymxpc2hlciBhc3NlcnRpb24gdGFibGUKLSAgICBTdHJpbmdbXSBwdWJBc3NlcnRpb25zVmlld0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19WSUVXSUQpOwotICAgIGlmIChwdWJBc3NlcnRpb25zVmlld0lkcyA9PSBudWxsIHx8IHB1YkFzc2VydGlvbnNWaWV3SWRzLmxlbmd0aCA9PSAwKQotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICBlbHNlCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19WSUVXSUQsIHB1YkFzc2VydGlvbnNWaWV3SWRzKTsKLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpZiAocmVnaXN0cnlOb2RlXyA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ2lzdHJ5RWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLQotICAgIGlmICghKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEJ1c2luZXNzRWxlbWVudCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBpZiBub3QgeWV0IGxvZ2dlZCBpbiwgbG9nIGluIGZpcnN0Ci0gICAgaWYgKCFpc0xvZ2dlZEluXykgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySUQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgcmVnaXN0cnlFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLCB1c2VySUQsIHBhc3N3b3JkKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gdGUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGllLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKG1lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0KLSAgICBVRERJUHJveHkgcHJveHkgPSByZWdpc3RyeUVsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICByZWdpc3RyeUVsZW1lbnQuZ2V0VXNlcklkKCk7Ci0gICAgcmVnaXN0cnlFbGVtZW50LmdldENyZWQoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgIExpc3RNYW5hZ2VyIHB1YkFzc2VydGlvbnMgPSBidXNFbGVtZW50LmdldFB1Ymxpc2hlckFzc2VydGlvbnMoKTsKLQotICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBvd25lZCBidXNpbmVzcwotICAgIC8vIGlmIG5vdCwgdGhlIEFkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gY2Fubm90IGJlIHBlcmZvcm1lZAotICAgIGlmICghaXNCdXNpbmVzc093bmVkKGJ1c0VsZW1lbnQpKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9UX09XTkVEX0JVU0lORVNTIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFN0cmluZ1tdIHB1YkFzc2VydGlvblZpZXdJZHMgPSAoU3RyaW5nW10pcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfVklFV0lEKTsKLSAgICAgIFZlY3RvciBwdWJBc3NlcnRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBib29sZWFuIHJlZnJlc2hSZXF1aXJlZCA9IGZhbHNlOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YkFzc2VydGlvblZpZXdJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQocHViQXNzZXJ0aW9uVmlld0lkc1tpXSk7Ci0gICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gcHViQXNzZXJ0aW9ucy5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpOwotICAgICAgICBQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50IHB1YkFzc2VydGlvbkVsZW1lbnQgPSAoUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgUHVibGlzaGVyQXNzZXJ0aW9uIHB1YkFzc2VydGlvbiA9IHB1YkFzc2VydGlvbkVsZW1lbnQuZ2V0UHVibGlzaGVyQXNzZXJ0aW9uKCk7Ci0gICAgICAgIHB1YkFzc2VydGlvblZlY3Rvci5hZGQocHViQXNzZXJ0aW9uKTsKLSAgICAgICAgaWYgKHB1YkFzc2VydGlvbkVsZW1lbnQuZ2V0U3RhdHVzKCkuZXF1YWxzKENvbXBsZXRpb25TdGF0dXMuQ09NUExFVEUpKQotICAgICAgICAgIHJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IHJlcG9ydCA9IHByb3h5LmRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zKHJlZ2lzdHJ5RWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBwdWJBc3NlcnRpb25WZWN0b3IpOwotICAgICAgLy9yZXBvcnQgc3RhdHVzCi0JICBWZWN0b3IgcmVwb3J0RXJySW5mbyA9IHJlcG9ydC5nZXRSZXN1bHRWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3J0RXJySW5mby5zaXplKCk7IGkrKykgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoKFJlc3VsdCkgcmVwb3J0RXJySW5mby5nZXQoaSkpLmdldEVyckluZm8oKS5nZXRUZXh0KCkpOwotICAgICAgfQotCi0gICAgICAvLyByZWZyZXNoIGlzIHJlcXVpcmVkLCByZWZyZXNoIHRoZSB3aG9sZSBwdWJsaXNoZXIgYXNzZXJ0aW9uIHRhYmxlCi0gICAgICBpZiAocmVmcmVzaFJlcXVpcmVkKSB7Ci0gICAgICAgIFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIHNob3dQQUFjdGlvbiA9IG5ldyBTaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gc2hvd1BBQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgICAgT2JqZWN0IGlkcyA9IHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCk7Ci0gICAgICAgIGlmIChpZHMgIT0gbnVsbCkKLSAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCwgaWRzKTsKLSAgICAgICAgc2hvd1BBQWN0aW9uLnJ1bigpOwotICAgICAgfQotICAgICAgLy8gcmVmcmVzaCBpcyBub3QgcmVxdWlyZWQsIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgcHVibGlzaGVyIGFzc2VydGlvbiBlbGVtZW50cwotICAgICAgZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcHViQXNzZXJ0aW9uVmlld0lkcy5sZW5ndGg7IGsrKykgewotICAgICAgICAgIHB1YkFzc2VydGlvbnMucmVtb3ZlRWxlbWVudFdpdGhWaWV3SWQoSW50ZWdlci5wYXJzZUludChwdWJBc3NlcnRpb25WaWV3SWRzW2tdKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlcG9ydC5zdWNjZXNzKCk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIHVkZGllKSB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBEaXNwb3NpdGlvblJlcG9ydCByZXBvcnQgPSB1ZGRpZS5nZXREaXNwb3NpdGlvblJlcG9ydCgpOwotCSAgVmVjdG9yIHJlcG9ydEVyckluZm8gPSByZXBvcnQuZ2V0UmVzdWx0VmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcG9ydEVyckluZm8uc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoKChSZXN1bHQpIHJlcG9ydEVyckluZm8uZ2V0KGkpKS5nZXRFcnJJbmZvKCkuZ2V0VGV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlbW92ZVN1YlF1ZXJ5SXRlbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWJiMWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLk11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZVN1YlF1ZXJ5SXRlbUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcml2YXRlIENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIAotICBwdWJsaWMgUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICB9Ci0gIAotICAvLyB1ZGRpL2FjdGlvbnMvUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uSlNQLmpzcD9zdWJRdWVyeUtleT0uLi4mc3ViUXVlcnlMaXN0S2V5PS4uLiZzdWJRdWVyeUxpc3RJdGVtSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHN1YlF1ZXJ5S2V5LFN0cmluZyBzdWJRdWVyeUxpc3RLZXksaW50IHN1YlF1ZXJ5TGlzdEl0ZW1JZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1JlbW92ZVN1YlF1ZXJ5SXRlbUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpLmFwcGVuZCgnPScpLmFwcGVuZChzdWJRdWVyeUtleSk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0tFWSkuYXBwZW5kKCc9JykuYXBwZW5kKHN1YlF1ZXJ5TGlzdEtleSk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0lURU1JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHN1YlF1ZXJ5TGlzdEl0ZW1JZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIFN0cmluZyBzdWJRdWVyeUxpc3RLZXkgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfS0VZKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlMaXN0SXRlbUlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0lURU1JRCk7Ci0gICAgCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksc3ViUXVlcnlLZXkpOwotICAgICAgCi0gICAgaWYgKHN1YlF1ZXJ5TGlzdEtleSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9LRVksc3ViUXVlcnlMaXN0S2V5KTsKLSAgICAgIAotICAgIGlmIChzdWJRdWVyeUxpc3RJdGVtSWQgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfSVRFTUlELHN1YlF1ZXJ5TGlzdEl0ZW1JZCk7Ci0gICAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9LRVkpOwotICAgIGludCBzdWJRdWVyeUxpc3RJdGVtSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9JVEVNSUQpKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgTm9kZSBjdXJyZW50Tm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKGN1cnJlbnROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcygoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSkpOwotICAgIFZlY3RvciBsaXN0ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9LRVkpKTsKLSAgICBsaXN0LnJlbW92ZUVsZW1lbnRBdChzdWJRdWVyeUxpc3RJdGVtSWQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1Jlc2l6ZVVERElGcmFtZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVzaXplVURESUZyYW1lc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM3YTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVzaXplVURESUZyYW1lc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuUmVzaXplRnJhbWVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJRnJhbWVOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXNpemVVRERJRnJhbWVzQWN0aW9uIGV4dGVuZHMgUmVzaXplRnJhbWVzQWN0aW9uCi17Ci0gIHB1YmxpYyBSZXNpemVVRERJRnJhbWVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyAhPSBudWxsICYmIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIsYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgLy8gU2F2ZSB0aGUgY3VycmVudCBmcmFtZXNldCBzaXplcy4KLSAgICBTdHJpbmcgZnJhbWVOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLkZSQU1FX05BTUUpOwotICAgIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIG5ldyBmcmFtZXNldCBzaXplcy4KLSAgICBpZiAoZnJhbWVOYW1lLmVxdWFscyhVRERJRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgIHsKLSAgICAgICAgLy8gUmVzdG9yZS4KLSAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyh1ZGRpUGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIE1heGltaXplLgotICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMTAwJSwwJSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChmcmFtZU5hbWUuZXF1YWxzKFVERElGcmFtZU5hbWVzLlBST1BFUlRJRVNfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICBpZiAoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyh1ZGRpUGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3ModWRkaVBlcnNwZWN0aXZlLmdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoIjEwMCUsMCUiKTsKLSAgICAgICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChmcmFtZU5hbWUuZXF1YWxzKFVERElGcmFtZU5hbWVzLlNUQVRVU19DT05UQUlORVIpKQotICAgIHsKLSAgICAgIGlmIChhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyh1ZGRpUGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3ModWRkaVBlcnNwZWN0aXZlLmdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoIjAlLDEwMCUiKTsKLSAgICAgICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZWxlY3RDYXRlZ29yeU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODhkM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZWxlY3RDYXRlZ29yeU5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2VsZWN0Tm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdENhdGVnb3J5Tm9kZUFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVBY3Rpb24KLXsKLSAgcHVibGljIFNlbGVjdENhdGVnb3J5Tm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0Q2F0ZWdvcnlNYW5hZ2VyKCkpOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1NlbGVjdENhdGVnb3J5Tm9kZUFjdGlvbi5qc3A/c2Vzc2lvbklkPS4uLiZub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHNlc3Npb25JZCxpbnQgbm9kZUlkKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIC8vIERvIG5vdCBhZGQgdGhpcyBhY3Rpb24gdG8gdGhlIGhpc3RvcnkuCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgcGVyZm9ybUJhc2VBY3Rpb24obm9kZUlkKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJjYXRlZ29yeUJyb3dzZXJXaW5kb3dDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgewotICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZkMGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0RmluZFRvb2xBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmluZFRvb2xBY3Rpb24gZXh0ZW5kcyBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIHN1YlF1ZXJ5S2V5XzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdG9vbExpbmtDaGFuZ2VkXzsKLQotICBwdWJsaWMgU2VsZWN0RmluZFRvb2xBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgc3ViUXVlcnlLZXlfID0gbnVsbDsKLSAgICB0b29sTGlua0NoYW5nZWRfID0gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHN1cGVyLnByb2Nlc3NMaW5rUGFyYW1ldGVycyhyZXF1ZXN0KTsKLSAgICBzdWJRdWVyeUtleV8gPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIC91ZGRpL2FjdGlvbnMvU2VsZWN0RmluZFRvb2xBY3Rpb24uanNwP25vZGVJZD0uLi4mdG9vbElkPS4uLjwmdmlld0lkPS4uLiZ2aWV3VG9vbElkPS4uLj4mc3ViUXVlcnlLZXk9Li4uPCZpc0hpc3Rvcnk9MT4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkLGludCB0b29sSWQsaW50IHZpZXdJZCxpbnQgdmlld1Rvb2xJZCxTdHJpbmcgc3ViUXVlcnlLZXksYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvU2VsZWN0RmluZFRvb2xBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpLmFwcGVuZCgnPScpLmFwcGVuZCh0b29sSWQpOwotICAgIGlmICh2aWV3SWQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgIHsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpLmFwcGVuZCgnPScpLmFwcGVuZCh2aWV3SWQpOwotICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpLmFwcGVuZCgnPScpLmFwcGVuZCh2aWV3VG9vbElkKTsKLSAgICB9Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpLmFwcGVuZCgnPScpLmFwcGVuZChzdWJRdWVyeUtleSk7Ci0KLSAgICBpZiAoZm9ySGlzdG9yeSkKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpLmFwcGVuZCgiPTEiKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGlmICghc3VwZXIucnVuKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZV8uZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgIFN0cmluZyBjdXJyZW50U3ViUXVlcnlLZXkgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICBpZiAoc3ViUXVlcnlLZXlfICE9IG51bGwgJiYgIXN1YlF1ZXJ5S2V5Xy5lcXVhbHMoY3VycmVudFN1YlF1ZXJ5S2V5KSkKLSAgICB7Ci0gICAgICB0b29sTGlua0NoYW5nZWRfID0gdHJ1ZTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZLHN1YlF1ZXJ5S2V5Xyk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNWaWV3U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiB0b29sTGlua0NoYW5nZWRfOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gc2VsZWN0ZWROb2RlXy5nZXROb2RlSWQoKTsKLSAgICBpbnQgdG9vbElkID0gc2VsZWN0ZWRUb29sXy5nZXRUb29sSWQoKTsKLSAgICBpbnQgdmlld0lkID0gc2VsZWN0ZWROb2RlXy5nZXRWaWV3SWQoKTsKLSAgICBpbnQgdmlld1Rvb2xJZCA9IHNlbGVjdGVkTm9kZV8uZ2V0Vmlld1Rvb2xJZCgpOwotICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKG5vZGVJZCx0b29sSWQsdmlld0lkLHZpZXdUb29sSWQsc3ViUXVlcnlLZXlfLHRydWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhkZGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TZWxlY3ROb2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuVG9vbFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3ROb2RlQWN0aW9uCi17Ci0gIHB1YmxpYyBTZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkpOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1NlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb24uanNwP25vZGVJZD0uLi48JmlzSGlzdG9yeT0xPgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgaWYgKGZvckhpc3RvcnkpCi0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKS5hcHBlbmQoIj0xIik7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGVfLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgVG9vbCBzZWxlY3RlZFRvb2wgPSB0b29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICBpbnQgbm9kZUlkID0gc2VsZWN0ZWROb2RlXy5nZXROb2RlSWQoKTsKLSAgICBzZWxlY3RlZFRvb2wuZ2V0VG9vbElkKCk7Ci0gICAgc2VsZWN0ZWROb2RlXy5nZXRWaWV3SWQoKTsKLSAgICBzZWxlY3RlZE5vZGVfLmdldFZpZXdUb29sSWQoKTsKLSAgICBpZiAoc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikKLSAgICAgIHJldHVybiBzZWxlY3RlZFRvb2wuZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYodHJ1ZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGdldEFjdGlvbkxpbmsobm9kZUlkLHRydWUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gIm5hdmlnYXRvckNvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuICJwcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxNzg0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TZWxlY3ROb2RlVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uIGV4dGVuZHMgU2VsZWN0Tm9kZVRvb2xBY3Rpb24KLXsKLSAgcHVibGljIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpKTsKLSAgfQotCi0gIC8vIC91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uanNwP25vZGVJZD0uLi4mdG9vbElkPS4uLjwmdmlld0lkPS4uLiZ2aWV3VG9vbElkPS4uLj48JmlzSGlzdG9yeT0xPgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsaW50IHRvb2xJZCxpbnQgdmlld0lkLGludCB2aWV3VG9vbElkLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuVE9PTElEKS5hcHBlbmQoJz0nKS5hcHBlbmQodG9vbElkKTsKLSAgICBpZiAodmlld0lkICE9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICB7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKS5hcHBlbmQoJz0nKS5hcHBlbmQodmlld0lkKTsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKS5hcHBlbmQoJz0nKS5hcHBlbmQodmlld1Rvb2xJZCk7Ci0gICAgfQotICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSkuYXBwZW5kKCI9MSIpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgIGludCB0b29sSWQgPSBzZWxlY3RlZFRvb2xfLmdldFRvb2xJZCgpOwotICAgIGludCB2aWV3SWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgIGludCB2aWV3VG9vbElkID0gc2VsZWN0ZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCx0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJuYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiAicHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gInByb3BlcnRpZXNDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgewotICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTBmYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlZpZXdUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLk11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24gZXh0ZW5kcyBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbgotewotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfOwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNWaWV3U2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIG5ld1VVSURRdWVyeUNyZWF0ZWRfOwotICBwcml2YXRlIFN0cmluZyBpdGVtTmFtZV87Ci0gIHB1YmxpYyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfID0gZmFsc2U7Ci0gICAgcmVxdWlyZXNWaWV3U2VsZWN0aW9uXyA9IGZhbHNlOwotICAgIG5ld1VVSURRdWVyeUNyZWF0ZWRfID0gZmFsc2U7Ci0gICAgaXRlbU5hbWVfID0gbnVsbDsKLSAgfQotCi0gIC8vIC91ZGRpL2FjdGlvbnMvU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmpzcD9ub2RlSWQ9Li4uJnRvb2xJZD0uLi48JnZpZXdJZD0uLi4+JnN1YlF1ZXJ5S2V5PS4uLiZzdWJRdWVyeUxpc3RLZXk9Li4uJnN1YlF1ZXJ5TGlzdEl0ZW1JZD0uLi4mcXVlcnlJdGVtPS4uLjwmaXNIaXN0b3J5PTE+Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxpbnQgdG9vbElkLGludCB2aWV3SWQsU3RyaW5nIHN1YlF1ZXJ5S2V5LFN0cmluZyBzdWJRdWVyeUxpc3RLZXksaW50IHN1YlF1ZXJ5TGlzdEl0ZW1JZCxpbnQgcXVlcnlJdGVtLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCkuYXBwZW5kKCc9JykuYXBwZW5kKHRvb2xJZCk7Ci0gICAgaWYgKHZpZXdJZCAhPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKS5hcHBlbmQoJz0nKS5hcHBlbmQodmlld0lkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSkuYXBwZW5kKCc9JykuYXBwZW5kKHN1YlF1ZXJ5S2V5KTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfS0VZKS5hcHBlbmQoJz0nKS5hcHBlbmQoc3ViUXVlcnlMaXN0S2V5KTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfSVRFTUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc3ViUXVlcnlMaXN0SXRlbUlkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0pLmFwcGVuZCgnPScpLmFwcGVuZChxdWVyeUl0ZW0pOwotCi0gICAgaWYgKGZvckhpc3RvcnkpCi0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKS5hcHBlbmQoIj0xIik7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKHJlcXVlc3QpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlMaXN0S2V5ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0tFWSk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5TGlzdEl0ZW1JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9JVEVNSUQpOwotICAgIFN0cmluZyBxdWVyeUl0ZW1TdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0pOwotCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksc3ViUXVlcnlLZXkpOwotCi0gICAgaWYgKHN1YlF1ZXJ5TGlzdEtleSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9LRVksc3ViUXVlcnlMaXN0S2V5KTsKLQotICAgIGlmIChzdWJRdWVyeUxpc3RJdGVtSWQgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfSVRFTUlELHN1YlF1ZXJ5TGlzdEl0ZW1JZCk7Ci0KLSAgICBpZiAocXVlcnlJdGVtU3RyaW5nICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLHF1ZXJ5SXRlbVN0cmluZyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBmaW5kQnlVVUlEKCkKLSAgewotICAgIE5vZGUgY3VycmVudE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKGN1cnJlbnROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcygoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSkpOwotICAgIFZlY3RvciBsaXN0ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9LRVkpKTsKLSAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClsaXN0LmVsZW1lbnRBdChJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9JVEVNSUQpKSk7Ci0gICAgaW50IHF1ZXJ5SXRlbSA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNKSk7Ci0gICAgRmluZEFjdGlvbiBmaW5kQWN0aW9uID0gbnVsbDsKLSAgICBTdHJpbmcgdXVpZEtleSA9IG51bGw7Ci0gICAgU3RyaW5nIHV1aWRLZXlWYWx1ZSA9IG51bGw7Ci0gICAgc3dpdGNoIChxdWVyeUl0ZW0pCi0gICAgewotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgZmluZEFjdGlvbiA9IG5ldyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgdXVpZEtleSA9IFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVk7Ci0gICAgICAgIEJ1c2luZXNzRW50aXR5IHNwID0gKEJ1c2luZXNzRW50aXR5KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICB1dWlkS2V5VmFsdWUgPSBzcC5nZXRCdXNpbmVzc0tleSgpOwotICAgICAgICBpdGVtTmFtZV8gPSBzcC5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTOgotICAgICAgICBmaW5kQWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIHV1aWRLZXkgPSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVk7Ci0gICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHV1aWRLZXlWYWx1ZSA9IGJzLmdldFNlcnZpY2VLZXkoKTsKLSAgICAgICAgaXRlbU5hbWVfID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBmaW5kQWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIHV1aWRLZXkgPSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZOwotICAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgdXVpZEtleVZhbHVlID0gdE1vZGVsLmdldFRNb2RlbEtleSgpOwotICAgICAgICBpdGVtTmFtZV8gPSB0TW9kZWwuZ2V0TmFtZVN0cmluZygpOwotICAgIH0KLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGZpbmRBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSx1dWlkS2V5VmFsdWUpOwotICAgIHByb3BlcnR5VGFibGUucHV0KHV1aWRLZXksdXVpZEtleVZhbHVlKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZpbmRBY3Rpb24ucnVuKCk7Ci0gICAgaWYgKHJlc3VsdCkKLSAgICB7Ci0gICAgICBOb2RlIGl0ZW1Ob2RlID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgaW50IG5vZGVJZCA9IGl0ZW1Ob2RlLmdldE5vZGVJZCgpOwotICAgICAgaW50IHRvb2xJZCA9IGl0ZW1Ob2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKTsKLSAgICAgIGludCB2aWV3SWQgPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQ7Ci0gICAgICBpbnQgdmlld1Rvb2xJZCA9IEFjdGlvbklucHV0cy5WSUVXVE9PTElEX0RFRkFVTFQ7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxTdHJpbmcudmFsdWVPZihub2RlSWQpKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVE9PTElELFN0cmluZy52YWx1ZU9mKHRvb2xJZCkpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsU3RyaW5nLnZhbHVlT2Yodmlld0lkKSk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQsU3RyaW5nLnZhbHVlT2Yodmlld1Rvb2xJZCkpOwotICAgICAgc3VwZXIucnVuKCk7Ci0gICAgICByZXF1aXJlc1RyZWVWaWV3UmVmcmVzaF8gPSB0cnVlOwotICAgICAgcmVxdWlyZXNWaWV3U2VsZWN0aW9uXyA9IHRydWU7Ci0gICAgICBuZXdVVUlEUXVlcnlDcmVhdGVkXyA9IHRydWU7Ci0gICAgICBsaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8obm9kZUlkLHRvb2xJZCx2aWV3SWQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUaGUgaXRlbSBpcyBubyBsb25nZXIgaW4gdGhlIHJlZ2lzdHJ5LgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SXRlbU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGl0ZW1OYW1lXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIC8vIEdpdmVuIHRoZSBub2RlSWQsIHRvb2xJZCBhbmQgdmlld0lkLCBjaGVjayBpZiB0aGUgbm9kZSBvciB2aWV3IGlzIHN0YWxlLgotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpbnQgdG9vbElkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVE9PTElEKSk7Ci0gICAgaW50IHZpZXdJZCA9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICB2aWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaW50IHZpZXdUb29sSWQgPSAwOwotICAgIGlmICghaXNTdGFsZU5vZGUobm9kZUlkKSkKLSAgICB7Ci0gICAgICAvLyBFbnVzcmUgdGhlIG5vZGUgaXMgdmlzaWJsZS4KLSAgICAgIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoXyA9IG1ha2VOb2RlVmlzaWJsZShub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpKTsKLQotICAgICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKTsKLSAgICAgIGlmICh2aWV3SWQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgewotICAgICAgICBWaWV3VG9vbCB2aWV3VG9vbCA9IChWaWV3VG9vbCkobm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFRvb2wodG9vbElkKSk7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIGVsZW1lbnRUb29sTWFuYWdlciA9IHZpZXdUb29sLmdldFRvb2xNYW5hZ2VyKHZpZXdJZCk7Ci0gICAgICAgIGlmIChlbGVtZW50VG9vbE1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3VG9vbElkID0gZWxlbWVudFRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbElkKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFN0YWxlIHZpZXcKLSAgICAgICAgICByZXR1cm4gZmluZEJ5VVVJRCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQsU3RyaW5nLnZhbHVlT2Yodmlld1Rvb2xJZCkpOwotICAgICAgcmV0dXJuIHN1cGVyLnJ1bigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3RhbGUgbm9kZQotICAgICAgcmV0dXJuIGZpbmRCeVVVSUQoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgIGludCB0b29sSWQgPSBzZWxlY3RlZFRvb2xfLmdldFRvb2xJZCgpOwotICAgIGludCB2aWV3SWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgIGludCB2aWV3VG9vbElkID0gc2VsZWN0ZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCx0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoKCkKLSAgewotICAgIHJldHVybiBzdXBlci5yZXF1aXJlc1RyZWVWaWV3UmVmcmVzaCgpfHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzVmlld1NlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIucmVxdWlyZXNWaWV3U2VsZWN0aW9uKCl8cmVxdWlyZXNWaWV3U2VsZWN0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzU3RhdHVzVXBkYXRlKCkKLSAgewotICAgIHJldHVybiBuZXdVVUlEUXVlcnlDcmVhdGVkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gInN0YXR1c0NvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VydmljZUdldEJ1c2luZXNzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTIzNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5Ob2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5TZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TZXJ2aWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VHZXRCdXNpbmVzc0FjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24KLXsKLSAgcHJpdmF0ZSBTZXJ2aWNlTm9kZSBzZXJ2aWNlTm9kZV87Ci0gIHB1YmxpYyBTZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcixjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKSk7Ci0gICAgc2VydmljZU5vZGVfID0gbnVsbDsKLSAgfQotCi0gIC8vIHVkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb25KU1AuanNwP25vZGVJZD0uLi4KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvU2VydmljZUdldEJ1c2luZXNzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlKCkKLSAgewotICAgIGludCBzZXJ2aWNlTm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgc2VydmljZU5vZGVfID0gKFNlcnZpY2VOb2RlKW5vZGVNYW5hZ2VyXy5nZXROb2RlKHNlcnZpY2VOb2RlSWQpOwotICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KXNlcnZpY2VOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbiB2ZXJpZnlBY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IHZlcmlmeUFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSxCb29sZWFuLlRSVUUpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSxzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKS5nZXRTZXJ2aWNlS2V5KCkpOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gdmVyaWZ5QWN0aW9uLnJ1bigpOwotICAgIGlmIChyZXN1bHQpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNULHByb3BlcnR5VGFibGUuZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSAoQnVzaW5lc3NTZXJ2aWNlKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpOwotCi0gICAgUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTk9ERV9OQU1FX1NFUlZJQ0VfQlVTSU5FU1MiLHNlcnZpY2VOb2RlXy5nZXROb2RlTmFtZSgpKSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSxicy5nZXRCdXNpbmVzc0tleSgpKTsKLQotICAgIHJldHVybiBhY3Rpb24ucnVuKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWY4MTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5TZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TZXJ2aWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbiBleHRlbmRzIFVERElOb2RlQWN0aW9uCi17Ci0gIHByaXZhdGUgU2VydmljZU5vZGUgc2VydmljZU5vZGVfOwotICBwdWJsaWMgU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHNlcnZpY2VOb2RlXyA9IG51bGw7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uSlNQLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHZhbGlkYXRlU2VydmljZSgpCi0gIHsKLSAgICBpbnQgc2VydmljZU5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIHNlcnZpY2VOb2RlXyA9IChTZXJ2aWNlTm9kZSlub2RlTWFuYWdlcl8uZ2V0Tm9kZShzZXJ2aWNlTm9kZUlkKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudClzZXJ2aWNlTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24gdmVyaWZ5QWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSB2ZXJpZnlBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUsQm9vbGVhbi5UUlVFKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVksc2VydmljZUVsZW1lbnQuZ2V0QnVzaW5lc3NTZXJ2aWNlKCkuZ2V0U2VydmljZUtleSgpKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IHZlcmlmeUFjdGlvbi5ydW4oKTsKLSAgICBpZiAocmVzdWx0KQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxwcm9wZXJ0eVRhYmxlLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCk7Ci0gICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJOT0RFX05BTUVfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMiLHNlcnZpY2VOb2RlXy5nZXROb2RlTmFtZSgpKSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9VU0VfU0VSVklDRSxCb29sZWFuLlRSVUUpOwotICAgIExpc3RFbGVtZW50IHNlcnZpY2VMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudChicyk7Ci0gICAgc2VydmljZUxpc3RFbGVtZW50LnNldFRhcmdldFZpZXdUb29sSW5mbyhzZXJ2aWNlTm9kZV8uZ2V0Tm9kZUlkKCksc2VydmljZU5vZGVfLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSxzZXJ2aWNlTm9kZV8uZ2V0Vmlld0lkKCkpOwotICAgIFZlY3RvciBzZXJ2aWNlTGlzdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBzZXJ2aWNlTGlzdFZlY3Rvci5hZGRFbGVtZW50KHNlcnZpY2VMaXN0RWxlbWVudCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFLHNlcnZpY2VMaXN0VmVjdG9yKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0JVU0lORVNTX1NFUlZJQ0UsYnMpOwotICAgIHJldHVybiBhY3Rpb24ucnVuKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwMDM1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRCdXNpbmVzc2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5TZXJ2aWNlSW50ZXJmYWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TZXJ2aWNlSW50ZXJmYWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5UTW9kZWxCYWc7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW50ZXJmYWNlR2V0QnVzaW5lc3Nlc0FjdGlvbiBleHRlbmRzIFVERElOb2RlQWN0aW9uCi17Ci0gIHByaXZhdGUgU2VydmljZUludGVyZmFjZU5vZGUgc2lOb2RlXzsKLSAgcHVibGljIFNlcnZpY2VJbnRlcmZhY2VHZXRCdXNpbmVzc2VzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHNpTm9kZV8gPSBudWxsOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY0dldEJ1c2luZXNzZXNBY3Rpb25KU1AuanNwP25vZGVJZD0uLi4KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VJbnRlcmZhY2UoKQotICB7Ci0gICAgaW50IHNpTm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgc2lOb2RlXyA9IChTZXJ2aWNlSW50ZXJmYWNlTm9kZSlub2RlTWFuYWdlcl8uZ2V0Tm9kZShzaU5vZGVJZCk7Ci0gICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KXNpTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24gdmVyaWZ5QWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSB2ZXJpZnlBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUsQm9vbGVhbi5UUlVFKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZLHNpRWxlbWVudC5nZXRUTW9kZWwoKS5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB2ZXJpZnlBY3Rpb24ucnVuKCk7Ci0gICAgaWYgKHJlc3VsdCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QscHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbClwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKTsKLQotICAgIFJlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk5PREVfTkFNRV9TSV9CVVNJTkVTU0VTIixzaU5vZGVfLmdldE5vZGVOYW1lKCkpKTsKLSAgICAKLSAgICBMaXN0RWxlbWVudCBzaUxpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHRNb2RlbCk7Ci0gICAgc2lMaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8oc2lOb2RlXy5nZXROb2RlSWQoKSxzaU5vZGVfLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSxzaU5vZGVfLmdldFZpZXdJZCgpKTsKLSAgICBWZWN0b3Igc2lMaXN0VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIHNpTGlzdFZlY3Rvci5hZGRFbGVtZW50KHNpTGlzdEVsZW1lbnQpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfU0VSVklDRV9JTlRFUkZBQ0VTLHNpTGlzdFZlY3Rvcik7Ci0gICAgCi0gICAgVmVjdG9yIHRNb2RlbEtleVN0cmluZ1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICB0TW9kZWxLZXlTdHJpbmdWZWN0b3IuYWRkRWxlbWVudCh0TW9kZWwuZ2V0VE1vZGVsS2V5KCkpOwotICAgIFRNb2RlbEJhZyB0TW9kZWxCYWcgPSBuZXcgVE1vZGVsQmFnKHRNb2RlbEtleVN0cmluZ1ZlY3Rvcik7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19UTU9ERUxCQUcsdE1vZGVsQmFnKTsKLSAgICAKLSAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRTZXJ2aWNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNlR2V0U2VydmljZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyM2YyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRTZXJ2aWNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUludGVyZmFjZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU2VydmljZUludGVyZmFjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuVE1vZGVsQmFnOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uIGV4dGVuZHMgVURESU5vZGVBY3Rpb24KLXsKLSAgcHJpdmF0ZSBTZXJ2aWNlSW50ZXJmYWNlTm9kZSBzaU5vZGVfOwotICBwdWJsaWMgU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHNpTm9kZV8gPSBudWxsOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY0dldFNlcnZpY2VzQWN0aW9uSlNQLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRTZXJ2aWNlc0FjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHZhbGlkYXRlU2VydmljZUludGVyZmFjZSgpCi0gIHsKLSAgICBpbnQgc2lOb2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBzaU5vZGVfID0gKFNlcnZpY2VJbnRlcmZhY2VOb2RlKW5vZGVNYW5hZ2VyXy5nZXROb2RlKHNpTm9kZUlkKTsKLSAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBzaUVsZW1lbnQgPSAoU2VydmljZUludGVyZmFjZUVsZW1lbnQpc2lOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbiB2ZXJpZnlBY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IHZlcmlmeUFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSxCb29sZWFuLlRSVUUpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVksc2lFbGVtZW50LmdldFRNb2RlbCgpLmdldFRNb2RlbEtleSgpKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IHZlcmlmeUFjdGlvbi5ydW4oKTsKLSAgICBpZiAocmVzdWx0KQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxwcm9wZXJ0eVRhYmxlLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpOwotCi0gICAgUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJOT0RFX05BTUVfU0lfU0VSVklDRVMiLHNpTm9kZV8uZ2V0Tm9kZU5hbWUoKSkpOwotICAgIAotICAgIExpc3RFbGVtZW50IHNpTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQodE1vZGVsKTsKLSAgICBzaUxpc3RFbGVtZW50LnNldFRhcmdldFZpZXdUb29sSW5mbyhzaU5vZGVfLmdldE5vZGVJZCgpLHNpTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLHNpTm9kZV8uZ2V0Vmlld0lkKCkpOwotICAgIFZlY3RvciBzaUxpc3RWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc2lMaXN0VmVjdG9yLmFkZEVsZW1lbnQoc2lMaXN0RWxlbWVudCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyxzaUxpc3RWZWN0b3IpOwotICAgIAotICAgIFZlY3RvciB0TW9kZWxLZXlTdHJpbmdWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgdE1vZGVsS2V5U3RyaW5nVmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsLmdldFRNb2RlbEtleSgpKTsKLSAgICBUTW9kZWxCYWcgdE1vZGVsQmFnID0gbmV3IFRNb2RlbEJhZyh0TW9kZWxLZXlTdHJpbmdWZWN0b3IpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9UTU9ERUxCQUcsdE1vZGVsQmFnKTsKLSAgICAKLSAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1Nob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1Nob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTZhOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkJ1c2luZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLk11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQXNzZXJ0aW9uU3RhdHVzSXRlbTsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLkFzc2VydGlvblN0YXR1c1JlcG9ydDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLkNvbXBsZXRpb25TdGF0dXM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5EaXNwb3NpdGlvblJlcG9ydDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlJlbGF0ZWRCdXNpbmVzc0luZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5SZWxhdGVkQnVzaW5lc3Nlc0xpc3Q7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5SZXN1bHQ7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5TaGFyZWRSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcnM7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gZXh0ZW5kcyBDb21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uCi17Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBzdWJRdWVyeUtleV87Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzU3ViUXVlcnlHZXRfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzdWJRdWVyeUluaXRpYXRlZF87Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3U3ViUXVlcnlfOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld1N1YlF1ZXJ5SXRlbV87Ci0KLSAgcHVibGljIFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotCi0gICAgc3ViUXVlcnlLZXlfID0gbnVsbDsKLSAgICBpc1N1YlF1ZXJ5R2V0XyA9IGZhbHNlOwotICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIGlmIChyZWdpc3RyeU5vZGVfID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBpZHMgZnJvbSB1ZGRpT2JqZWN0c190YWJsZQotICAgIFN0cmluZ1tdIHNlbGVjdGVkQnVzSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCk7Ci0gICAgaWYgKHNlbGVjdGVkQnVzSWRzICE9IG51bGwgJiYgc2VsZWN0ZWRCdXNJZHMubGVuZ3RoID4gMCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCwgc2VsZWN0ZWRCdXNJZHMpOwotCi0gICAgbmV3U3ViUXVlcnlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQpOwotICAgIFN0cmluZyBpc1N1YlF1ZXJ5R2V0U3RyaW5nID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCk7Ci0gICAgbmV3U3ViUXVlcnlJdGVtXyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSk7Ci0gICAgc3ViUXVlcnlLZXlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleV8pOwotICAgIGZvcm1Ub29sUEkuY2xlYXJFcnJvcnMoKTsKLQotICAgIGlmIChuZXdTdWJRdWVyeV8gIT0gbnVsbCAmJiBuZXdTdWJRdWVyeV8ubGVuZ3RoKCkgPiAwKQotICAgICAgc3ViUXVlcnlJbml0aWF0ZWRfID0gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICBzdWJRdWVyeUluaXRpYXRlZF8gPSBmYWxzZTsKLQotICAgIGlmIChpc1N1YlF1ZXJ5R2V0U3RyaW5nICE9IG51bGwpCi0gICAgICBpc1N1YlF1ZXJ5R2V0XyA9IEJvb2xlYW4udmFsdWVPZihpc1N1YlF1ZXJ5R2V0U3RyaW5nKS5ib29sZWFuVmFsdWUoKTsKLQotICAgIC8vIGlmIG5vdCB5ZXQgbG9nZ2VkIGluLCB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVycyBuZWVkZWQgdG8gbG9nIGluCi0gICAgLy8gTk9URTogVGhpcyBhY3Rpb24gZG9lcyBOT1QgcmVxdWlyZSB0aGUgdXNlciB0byBiZSBsb2dnZWQgaW4uCi0gICAgaWYgKCFpc0xvZ2dlZEluXykgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLQotICAgICAgaWYgKHB1Ymxpc2hVUkwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh1c2VySUQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJRCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJRCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTdWJRdWVyeUluaXRpYXRlZCgpCi0gIHsKLSAgICByZXR1cm4gc3ViUXVlcnlJbml0aWF0ZWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTdWJRdWVyeUdldCgpCi0gIHsKLSAgICByZXR1cm4gaXNTdWJRdWVyeUdldF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN1YlF1ZXJ5S2V5KCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUtleV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5ld1N1YlF1ZXJ5KCkKLSAgewotICAgIHJldHVybiBuZXdTdWJRdWVyeV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5ld1N1YlF1ZXJ5SXRlbSgpCi0gIHsKLSAgICByZXR1cm4gbmV3U3ViUXVlcnlJdGVtXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICAvLyBTeW5jaHJvbml6ZSBjbGllbnQgdmlldyBhbmQgc2VydmVyIG1vZGVsICh1ZGRpT2JqZWN0X3RhYmxlLmpzcCkKLSAgICBzeW5jaHJvbml6ZVVERElPYmplY3RUYWJsZSgpOwotCi0gICAgaWYgKHJlZ2lzdHJ5Tm9kZV8gPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdpc3RyeUVsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICBpZiAoIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBCdXNpbmVzc0VsZW1lbnQpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gaWYgbm90IHlldCBsb2dnZWQgaW4sIGxvZyBpbiBmaXJzdAotICAgIGlmICghaXNMb2dnZWRJbl8pIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcklEID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocHVibGlzaFVSTCkgJiYKLSAgICAgICAgICAgIFZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh1c2VySUQpICYmCi0gICAgICAgICAgICBwYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgcmVnaXN0cnlFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLCB1c2VySUQsIHBhc3N3b3JkKTsKLSAgICAgICAgICBpc0xvZ2dlZEluXyA9IHJlZ2lzdHJ5RWxlbWVudC5pc0xvZ2dlZEluKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gdGUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGllLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKG1lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0KLSAgICAvLyBzaG93IGFsbCBhc3NlcnRpb24gaWZmIGlzIGxvZ2dlZCBpbiBhbmQgYnVzaW5lc3MgaXMgb3duZWQKLSAgICAvLyBlbHNlIHNob3cgb25seSBjb21wbGV0ZWQgb25lcwotICAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgaWYgKGlzTG9nZ2VkSW5fICYmIGlzQnVzaW5lc3NPd25lZChidXNFbGVtZW50KSkKLSAgICAgIHJldHVybiBzaG93UHVibGlzaGVyQXNzZXJ0aW9uc0Zvck93bmVkQnVzKGJ1c0VsZW1lbnQpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBzaG93UHVibGlzaGVyQXNzZXJ0aW9uc0Zvck5vbk93bmVkQnVzKGJ1c0VsZW1lbnQpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHNob3dQdWJsaXNoZXJBc3NlcnRpb25zRm9yT3duZWRCdXMoQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQpIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLQotICAgIC8vIHRyeSB0byBnZXQgYSBsaXN0IG9mIGFsbCBwdWJsaXNoZXIgYXNzZXJ0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlZ2lzdHJ5J3MgYXV0aFRva2VuCi0gICAgTGlzdE1hbmFnZXIgbGlzdE1hbmFnZXIgPSBuZXcgTGlzdE1hbmFnZXIoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleV8pOwotICAgIGZvcm1Ub29sUEkucmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9FWElTVElOR19QVUJMSVNIRVJfQVNTRVJUSU9OUyk7Ci0gICAgVmVjdG9yIHF1ZXJ5SW5wdXRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ2lzdHJ5RWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIHJlZ2lzdHJ5RWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICByZWdpc3RyeUVsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgLy8gc2hvdyBhbGwgcHVibGlzaGVyIGFzc2VydGlvbnMKLSAgICBVRERJUHJveHkgcHJveHkgPSAoKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGVfLmdldFRyZWVFbGVtZW50KCkpLmdldFByb3h5KCk7Ci0gICAgQXNzZXJ0aW9uU3RhdHVzUmVwb3J0IGFzc2VydGlvblJlcG9ydDsKLSAgICB0cnkgewotICAgICAgYXNzZXJ0aW9uUmVwb3J0ID0gcHJveHkuZ2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydChyZWdpc3RyeUVsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgKENvbXBsZXRpb25TdGF0dXMpbnVsbCk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIHVkZGllKSB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBEaXNwb3NpdGlvblJlcG9ydCByZXBvcnQgPSB1ZGRpZS5nZXREaXNwb3NpdGlvblJlcG9ydCgpOwotCSAgVmVjdG9yIHJlcG9ydEVyckluZm8gPSByZXBvcnQuZ2V0UmVzdWx0VmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcG9ydEVyckluZm8uc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoKChSZXN1bHQpIHJlcG9ydEVyckluZm8uZ2V0KGkpKS5nZXRFcnJJbmZvKCkuZ2V0VGV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgVmVjdG9yIGFzc2VydGlvblZlY3RvciA9IGFzc2VydGlvblJlcG9ydC5nZXRBc3NlcnRpb25TdGF0dXNJdGVtVmVjdG9yKCk7Ci0gICAgVmVjdG9yIG90aGVyQnVzaW5lc3NLZXlzID0gbmV3IFZlY3RvcigpOwotICAgIFZlY3RvciBwdWJBc3NlcnRpb25FbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXNzZXJ0aW9uVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICBBc3NlcnRpb25TdGF0dXNJdGVtIGFzc2VydGlvbkl0ZW0gPSAoQXNzZXJ0aW9uU3RhdHVzSXRlbSlhc3NlcnRpb25WZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBmcm9tL3RvIGJ1c2luZXNzIGtleXMKLSAgICAgIFN0cmluZyBmcm9tS2V5ID0gYXNzZXJ0aW9uSXRlbS5nZXRGcm9tS2V5KCkuZ2V0VGV4dCgpOwotICAgICAgU3RyaW5nIHRvS2V5ID0gYXNzZXJ0aW9uSXRlbS5nZXRUb0tleSgpLmdldFRleHQoKTsKLSAgICAgIFN0cmluZyBvd25pbmdCdXNpbmVzc0tleSA9IGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKS5nZXRCdXNpbmVzc0tleSgpOwotICAgICAgLy8gaWdub3JlIHRoaXMgYXNzZXJ0aW9uIGlmIG5laXRoZXIgdGhlIGZyb20ga2V5IG5vciB0aGUgdG8ga2V5IGVxdWFscyB0byB0aGlzIGJ1c2luZXNzJ3Mga2V5Ci0gICAgICBpZiAoIW93bmluZ0J1c2luZXNzS2V5LmVxdWFscyhmcm9tS2V5KSAmJiAhb3duaW5nQnVzaW5lc3NLZXkuZXF1YWxzKHRvS2V5KSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBTdHJpbmcgb3RoZXJCdXNpbmVzc0tleSA9ICgob3duaW5nQnVzaW5lc3NLZXkuZXF1YWxzKGZyb21LZXkpKSA/IHRvS2V5IDogZnJvbUtleSk7Ci0gICAgICAvLyByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24gb2YgdGhlICJvdGhlciBidXNpbmVzcyIKLSAgICAgIG90aGVyQnVzaW5lc3NLZXlzLmFkZChvdGhlckJ1c2luZXNzS2V5KTsKLQotICAgICAgLy8gcmV0cmlldmUgdGhlIHN0YXR1cyBvZiB0aGUgcHVibGlzaGVyIGFzc2VydGlvbgotICAgICAgU3RyaW5nIHN0YXR1cyA9IGFzc2VydGlvbkl0ZW0uZ2V0Q29tcGxldGlvblN0YXR1cygpLmdldFRleHQoKTsKLSAgICAgIEtleWVkUmVmZXJlbmNlIGtleWVkUmVmID0gYXNzZXJ0aW9uSXRlbS5nZXRLZXllZFJlZmVyZW5jZSgpOwotICAgICAgUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudCBwdWJBc3NlcnRpb25FbGVtZW50ID0gbmV3IFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25pbmdCdXNpbmVzc0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWVkUmVmKTsKLSAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnRzLmFkZChwdWJBc3NlcnRpb25FbGVtZW50KTsKLSAgICB9Ci0gICAgaWYgKG90aGVyQnVzaW5lc3NLZXlzLnNpemUoKSA+IDApIHsKLSAgICAgIFZlY3RvciBidXNFbnRpdGllczsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1c0VudGl0aWVzID0gcHJveHkuZ2V0X2J1c2luZXNzRGV0YWlsKG90aGVyQnVzaW5lc3NLZXlzKS5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICBidXNFbnRpdGllcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgaWYgKG90aGVyQnVzaW5lc3NLZXlzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG90aGVyQnVzaW5lc3NLZXlzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBidXNFbnRpdGllcy5hZGQocHJveHkuZ2V0X2J1c2luZXNzRGV0YWlsKChTdHJpbmcpb3RoZXJCdXNpbmVzc0tleXMuZ2V0KGopKS5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpLmdldCgwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgICBwdWJBc3NlcnRpb25FbGVtZW50cy5yZW1vdmUoaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwdWJBc3NlcnRpb25FbGVtZW50cy5yZW1vdmUoMCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ1c0VudGl0aWVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KWJ1c0VudGl0aWVzLmdldChqKTsKLSAgICAgICAgUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudCBwdWJBc3NlcnRpb25FbGVtZW50ID0gKFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQpcHViQXNzZXJ0aW9uRWxlbWVudHMuZ2V0KGopOwotICAgICAgICBMaXN0RWxlbWVudCBsZSA9IG5ldyBMaXN0RWxlbWVudChiZSk7Ci0gICAgICAgIHF1ZXJ5SW5wdXRWZWN0b3IuYWRkKGxlKTsKLSAgICAgICAgaW50IHN1YlF1ZXJ5SXRlbUlkID0gcXVlcnlJbnB1dFZlY3Rvci5pbmRleE9mKGxlKTsKLSAgICAgICAgcHViQXNzZXJ0aW9uRWxlbWVudC5zZXRTZXJ2aWNlUHJvdmlkZXIobGUpOwotICAgICAgICBwdWJBc3NlcnRpb25FbGVtZW50LnNldFN1YlF1ZXJ5SXRlbUlkKHN1YlF1ZXJ5SXRlbUlkKTsKLSAgICAgICAgbGlzdE1hbmFnZXIuYWRkKG5ldyBMaXN0RWxlbWVudChwdWJBc3NlcnRpb25FbGVtZW50KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGJ1c0VsZW1lbnQuc2V0UHVibGlzaGVyQXNzZXJ0aW9ucyhsaXN0TWFuYWdlcik7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0VYSVNUSU5HX1BVQkxJU0hFUl9BU1NFUlRJT05TLCBxdWVyeUlucHV0VmVjdG9yKTsKLSAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fUFVCTElTSEVSX0FTU0VSVElPTlNfUkVGUkVTSEVEIikpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHNob3dQdWJsaXNoZXJBc3NlcnRpb25zRm9yTm9uT3duZWRCdXMoQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQpIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLQotICAgIC8vIHRyeSB0byBnZXQgYSBsaXN0IG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zIGJhc2VkIG9uIHRoZSBidXNpbmVzcyBrZXkKLSAgICBMaXN0TWFuYWdlciBsaXN0TWFuYWdlciA9IG5ldyBMaXN0TWFuYWdlcigpOwotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5Xyk7Ci0gICAgZm9ybVRvb2xQSS5yZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0VYSVNUSU5HX1BVQkxJU0hFUl9BU1NFUlRJT05TKTsKLSAgICBWZWN0b3IgcXVlcnlJbnB1dFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBVRERJUHJveHkgcHJveHkgPSAoKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGVfLmdldFRyZWVFbGVtZW50KCkpLmdldFByb3h5KCk7Ci0gICAgUmVsYXRlZEJ1c2luZXNzZXNMaXN0IHJlbGF0ZWRCdXNMaXN0OwotICAgIHRyeSB7Ci0gICAgICByZWxhdGVkQnVzTGlzdCA9IHByb3h5LmZpbmRfcmVsYXRlZEJ1c2luZXNzZXMoYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpLmdldEJ1c2luZXNzS2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS2V5ZWRSZWZlcmVuY2UpbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGaW5kUXVhbGlmaWVycyludWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IHJlcG9ydCA9IHVkZGllLmdldERpc3Bvc2l0aW9uUmVwb3J0KCk7Ci0JICBWZWN0b3IgcmVwb3J0RXJySW5mbyA9IHJlcG9ydC5nZXRSZXN1bHRWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3J0RXJySW5mby5zaXplKCk7IGkrKykgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoKFJlc3VsdCkgcmVwb3J0RXJySW5mby5nZXQoaSkpLmdldEVyckluZm8oKS5nZXRUZXh0KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIkV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBWZWN0b3IgcmVsYXRlZEJ1c1ZlY3RvciA9IHJlbGF0ZWRCdXNMaXN0LmdldFJlbGF0ZWRCdXNpbmVzc0luZm9zKCkuZ2V0UmVsYXRlZEJ1c2luZXNzSW5mb1ZlY3RvcigpOwotICAgIFZlY3RvciBvdGhlckJ1c2luZXNzS2V5cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBWZWN0b3IgcHViQXNzZXJ0aW9uRWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSAgPSAwOyBpIDwgcmVsYXRlZEJ1c1ZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgUmVsYXRlZEJ1c2luZXNzSW5mbyByZWxhdGVkQnVzSW5mbyA9IChSZWxhdGVkQnVzaW5lc3NJbmZvKXJlbGF0ZWRCdXNWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBmcm9tL3RvIGJ1c2luZXNzIGtleXMKLSAgICAgIFN0cmluZyBmcm9tS2V5OwotICAgICAgU3RyaW5nIHRvS2V5OwotICAgICAgU3RyaW5nIG93bmluZ0J1c2luZXNzS2V5OwotICAgICAgaWYgKHJlbGF0ZWRCdXNJbmZvLmdldERlZmF1bHRTaGFyZWRSZWxhdGlvbnNoaXBzKCkuZ2V0RGlyZWN0aW9uKCkuZXF1YWxzKFNoYXJlZFJlbGF0aW9uc2hpcHMuRElSRUNUSU9OX0ZST01LRVkpKSB7Ci0gICAgICAgIGZyb21LZXkgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICAgICAgdG9LZXkgPSByZWxhdGVkQnVzSW5mby5nZXRCdXNpbmVzc0tleSgpOwotICAgICAgICBvd25pbmdCdXNpbmVzc0tleSA9IGZyb21LZXk7Ci0gICAgICAgIG90aGVyQnVzaW5lc3NLZXlzLmFkZCh0b0tleSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgZnJvbUtleSA9IHJlbGF0ZWRCdXNJbmZvLmdldEJ1c2luZXNzS2V5KCk7Ci0gICAgICAgIHRvS2V5ID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpLmdldEJ1c2luZXNzS2V5KCk7Ci0gICAgICAgIG93bmluZ0J1c2luZXNzS2V5ID0gdG9LZXk7Ci0gICAgICAgIG90aGVyQnVzaW5lc3NLZXlzLmFkZChmcm9tS2V5KTsKLSAgICAgIH0KLQotICAgICAgVmVjdG9yIGtleWVkUmVmVmVjdG9yID0gcmVsYXRlZEJ1c0luZm8uZ2V0RGVmYXVsdFNoYXJlZFJlbGF0aW9uc2hpcHMoKS5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICAgUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudFtdIHB1YkFzc2VydGlvbkVsZW1lbnRBcnJheSA9IG5ldyBQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50W2tleWVkUmVmVmVjdG9yLnNpemUoKV07Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8IGtleWVkUmVmVmVjdG9yLnNpemUoKTsgaysrKSB7Ci0gICAgICAgIC8vIHJldHJpZXZlIHRoZSBzdGF0dXMgb2YgdGhlIHB1Ymxpc2hlciBhc3NlcnRpb24KLSAgICAgICAgU3RyaW5nIHN0YXR1cyA9IENvbXBsZXRpb25TdGF0dXMuQ09NUExFVEU7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtleWVkUmVmID0gKEtleWVkUmVmZXJlbmNlKWtleWVkUmVmVmVjdG9yLmVsZW1lbnRBdChrKTsKLSAgICAgICAgUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudCBwdWJBc3NlcnRpb25FbGVtZW50ID0gbmV3IFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25pbmdCdXNpbmVzc0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZWRSZWYpOwotICAgICAgICBwdWJBc3NlcnRpb25FbGVtZW50QXJyYXlba10gPSBwdWJBc3NlcnRpb25FbGVtZW50OwotICAgICAgfQotICAgICAgcHViQXNzZXJ0aW9uRWxlbWVudHMuYWRkKHB1YkFzc2VydGlvbkVsZW1lbnRBcnJheSk7Ci0gICAgfQotICAgIGlmIChvdGhlckJ1c2luZXNzS2V5cy5zaXplKCkgPiAwKSB7Ci0gICAgICBWZWN0b3IgYnVzRW50aXRpZXM7Ci0gICAgICB0cnkgewotICAgICAgICBidXNFbnRpdGllcyA9IHByb3h5LmdldF9idXNpbmVzc0RldGFpbChvdGhlckJ1c2luZXNzS2V5cykuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgYnVzRW50aXRpZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGlmIChvdGhlckJ1c2luZXNzS2V5cy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBvdGhlckJ1c2luZXNzS2V5cy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgYnVzRW50aXRpZXMuYWRkKHByb3h5LmdldF9idXNpbmVzc0RldGFpbCgoU3RyaW5nKW90aGVyQnVzaW5lc3NLZXlzLmdldChqKSkuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKS5nZXQoMCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgcHViQXNzZXJ0aW9uRWxlbWVudHMucmVtb3ZlKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcHViQXNzZXJ0aW9uRWxlbWVudHMucmVtb3ZlKDApOwotICAgICAgfQotICAgICAgZm9yIChpbnQgaiAgPSAwOyBqIDwgYnVzRW50aXRpZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpYnVzRW50aXRpZXMuZ2V0KGopOwotICAgICAgICBMaXN0RWxlbWVudCBsZSA9IG5ldyBMaXN0RWxlbWVudChiZSk7Ci0gICAgICAgIHF1ZXJ5SW5wdXRWZWN0b3IuYWRkKGxlKTsKLSAgICAgICAgaW50IHN1YlF1ZXJ5SXRlbUlkID0gcXVlcnlJbnB1dFZlY3Rvci5pbmRleE9mKGxlKTsKLSAgICAgICAgUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudFtdIHB1YkFzc2VydGlvbkVsZW1lbnRBcnJheSA9IChQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50W10pcHViQXNzZXJ0aW9uRWxlbWVudHMuZ2V0KGopOwotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHB1YkFzc2VydGlvbkVsZW1lbnRBcnJheS5sZW5ndGg7IGsrKykgewotICAgICAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnRBcnJheVtrXS5zZXRTZXJ2aWNlUHJvdmlkZXIobGUpOwotICAgICAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnRBcnJheVtrXS5zZXRTdWJRdWVyeUl0ZW1JZChzdWJRdWVyeUl0ZW1JZCk7Ci0gICAgICAgICAgbGlzdE1hbmFnZXIuYWRkKG5ldyBMaXN0RWxlbWVudChwdWJBc3NlcnRpb25FbGVtZW50QXJyYXlba10pKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBidXNFbGVtZW50LnNldFB1Ymxpc2hlckFzc2VydGlvbnMobGlzdE1hbmFnZXIpOwotICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9FWElTVElOR19QVUJMSVNIRVJfQVNTRVJUSU9OUywgcXVlcnlJbnB1dFZlY3Rvcik7Ci0gICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1BVQkxJU0hFUl9BU1NFUlRJT05TX1JFRlJFU0hFRCIpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21VRERJQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjNzllNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2hvd1BlcnNwZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb24gZXh0ZW5kcyBTaG93UGVyc3BlY3RpdmVBY3Rpb24KLXsKLSAgcHVibGljIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyAhPSBudWxsICYmIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIsYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgCi0gICAgLy8gU2F2ZSB0aGUgZnJhbWVzZXQgc2l6ZXMgaWZmIG5vIGZyYW1lIGlzIG1heGltaXplZC4KLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuc3RhcnRzV2l0aCgiMTAwJSIpICYmICFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIAotICAgIGlmICghYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5zdGFydHNXaXRoKCIxMDAlIikgJiYgIWFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgCi0gICAgcmV0dXJuIHN1cGVyLnJ1bigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb3JtQWN0aW9uTGluayhpbnQgdGFyZ2V0UGVyc3BlY3RpdmVJZCxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgZm9ybUxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tVURESUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgZm9ybUxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSkuYXBwZW5kKCc9JykuYXBwZW5kKHRhcmdldFBlcnNwZWN0aXZlSWQpOwotICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgZm9ybUxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpLmFwcGVuZCgiPTEiKTsKLSAgICByZXR1cm4gZm9ybUxpbmsudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Ub2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTA4OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Ub2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuVG9nZ2xlTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBUb2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24gZXh0ZW5kcyBUb2dnbGVOb2RlQWN0aW9uCi17Ci0gIHB1YmxpYyBUb2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcixjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldENhdGVnb3J5TWFuYWdlcigpKTsKLSAgfQotCi0gIC8vIHVkZGkvYWN0aW9ucy9Ub2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uLmpzcD9zSWQ9Li4uJm5vZGVJZD0uLi4mb3Blbj0uLi4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhTdHJpbmcgc2Vzc2lvbklkLGludCBub2RlSWQsYm9vbGVhbiBvcGVuKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuT1BFTikuYXBwZW5kKCc9JykuYXBwZW5kKG9wZW4/QWN0aW9uSW5wdXRzLk9QRU5fTk9ERTpBY3Rpb25JbnB1dHMuQ0xPU0VfTk9ERSk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgcGVyZm9ybUJhc2VBY3Rpb24obm9kZUlkKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiAiY2F0ZWdvcnlCcm93c2VyV2luZG93Q29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgcmV0dXJuIE9wZW5DYXRlZ29yeUJyb3dzZXJBY3Rpb24uZ2V0Q2F0ZWdvcnlDb250ZW50UGFnZShjb250cm9sbGVyXy5nZXRTZXNzaW9uSWQoKSx1ZGRpUGVyc3BlY3RpdmUuZ2V0Q2F0ZWdvcnlUTW9kZWxLZXkoKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250YWluZXJQYWdlKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICByZXR1cm4gT3BlbkNhdGVnb3J5QnJvd3NlckFjdGlvbi5nZXRBY3Rpb25MaW5rKGNvbnRyb2xsZXJfLmdldFNlc3Npb25JZCgpLHVkZGlQZXJzcGVjdGl2ZS5nZXRDYXRlZ29yeVRNb2RlbEtleSgpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Ub2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhODA0NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Ub2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlRvZ2dsZU5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Ub29sVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbiBleHRlbmRzIFRvZ2dsZU5vZGVBY3Rpb24KLXsKLSAgcHVibGljIFRvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcixjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKSk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLiZvcGVuPS4uLgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsYm9vbGVhbiBvcGVuKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLk9QRU4pLmFwcGVuZCgnPScpLmFwcGVuZChvcGVuP0FjdGlvbklucHV0cy5PUEVOX05PREU6QWN0aW9uSW5wdXRzLkNMT1NFX05PREUpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgb25seSB0byBzZWxlY3QgdGhlIHRvZ2dsZWQgbm9kZSB3aGVuLCBhdCB0aGUgdGltZSBvZgotICAvLyB0aGUgY29sbGFwc2UgZXZlbnQsIGEgZGVzY2VuZGFudCBub2RlIHdhcyBzZWxlY3RlZC4KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IHRvZ2dsZWROb2RlXy5nZXRUb29sTWFuYWdlcigpOwotICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgaW50IG5vZGVJZCA9IHRvZ2dsZWROb2RlXy5nZXROb2RlSWQoKTsKLSAgICBpbnQgdG9vbElkID0gc2VsZWN0ZWRUb29sLmdldFRvb2xJZCgpOwotICAgIGludCB2aWV3SWQgPSB0b2dnbGVkTm9kZV8uZ2V0Vmlld0lkKCk7Ci0gICAgaW50IHZpZXdUb29sSWQgPSB0b2dnbGVkTm9kZV8uZ2V0Vmlld1Rvb2xJZCgpOwotICAgIGlmIChzZWxlY3RlZFRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKQotICAgICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCx0cnVlKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCx0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJuYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiAicHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICB7Ci0gICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1RyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1RyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjAxMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9UcmFuc2ZlclN1YlF1ZXJ5UmVzdWx0c0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkJ1c2luZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlNlcnZpY2VJbnRlcmZhY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLk11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJpdmF0ZSBOb2RlIHRhcmdldE5vZGVfOwotICBwdWJsaWMgVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgdGFyZ2V0Tm9kZV8gPSBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHNlbGVjdGVkTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgLy8gVGhlIGNsaWVudCBKYXZhc2NyaXB0IGVuZm9yY2VzIHRoZSBydWxlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSB0aGUgZm9ybSBjYW4gYmUgc3VibWl0dGVkLgotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlNFTEVDVEVEX05PREVJRFMsc2VsZWN0ZWROb2RlSWRzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JSZXR1cm4oKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKFVERElBY3Rpb25JbnB1dHMuU0hPV19SRVNVTFRTX1RBUkdFVCkuYXBwZW5kKCI9MSIpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBlbmFibGVTaG93UmVzdWx0c1RhcmdldCgpCi0gIHsKLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIHRhcmdldCBsaW5rIG9uIHRoZSBxdWVyeSByZXN1bHRzIHBhZ2UuIEluc2VydCBhIHplcm8gZWxlbWVudAotICAgIC8vIGFycmF5IHNvIHRoYXQgbm8gcmVzdWx0cyBhcmUgdHJhbnNmZXJyZWQgYnV0IHRoZSBqdW1wIGJhY2sgdG8gdGhlIGNvcnJlY3QgcXVlcnkgYW5kIGl0cyBpbmZvIG9jY3Vycy4KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5TRUxFQ1RFRF9OT0RFSURTLG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIC8vIFRyYW5zZmVyIHRoZSByZXN1bHRzIGluIHRoaXMgUXVlcnkgbm9kZSBpbnRvIHRoZSBwcm9wZXJ0eSBleHBlY3RlZCBieSB0aGUgb3JpZ2luYXRpbmcgbm9kZS4KLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgU3RyaW5nW10gc2VsZWN0ZWROb2RlSWRzID0gKFN0cmluZ1tdKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlNFTEVDVEVEX05PREVJRFMpOwotICAgIE5vZGUgY3VycmVudE5vZGUgPSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3ViUXVlcnlUcmFuc2ZlclRhcmdldCB0YXJnZXQgPSAoU3ViUXVlcnlUcmFuc2ZlclRhcmdldCkoY3VycmVudEVsZW1lbnQuZ2V0UHJvcGVydHlBc09iamVjdChVRERJTW9kZWxDb25zdGFudHMuU1VCUVVFUllfVFJBTlNGRVJfVEFSR0VUKSk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gdGFyZ2V0LmdldFN1YlF1ZXJ5S2V5KCk7Ci0gICAgU3RyaW5nIHRhcmdldFF1ZXJ5S2V5OwotCi0gICAgaW50IGxhc3RTZXBhcmF0b3JQb3MgPSBzdWJRdWVyeUtleS5sYXN0SW5kZXhPZignOicpOwotICAgIGlmIChsYXN0U2VwYXJhdG9yUG9zID09IC0xKQotICAgICAgdGFyZ2V0UXVlcnlLZXkgPSAiIjsKLSAgICBlbHNlCi0gICAgICB0YXJnZXRRdWVyeUtleSA9IHN1YlF1ZXJ5S2V5LnN1YnN0cmluZygwLGxhc3RTZXBhcmF0b3JQb3MpOwotCi0gICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gc3ViUXVlcnlLZXkuc3Vic3RyaW5nKGxhc3RTZXBhcmF0b3JQb3MrMSxzdWJRdWVyeUtleS5sZW5ndGgoKSk7Ci0gICAgRm9ybVRvb2wgdGFyZ2V0Rm9ybVRvb2wgPSB0YXJnZXQuZ2V0VGFyZ2V0Rm9ybVRvb2woKTsKLSAgICAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKXRhcmdldEZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXkpOwotICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSB0YXJnZXRRdWVyeUZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKXRhcmdldEZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXModGFyZ2V0UXVlcnlLZXkpOwotICAgIFZlY3RvciB0YXJnZXRMaXN0ID0gKFZlY3Rvcil0YXJnZXRRdWVyeUZvcm1Ub29sUEkuZ2V0UHJvcGVydHkodGFyZ2V0UHJvcGVydHkpOwotICAgIGlmICh0YXJnZXRMaXN0ID09IG51bGwpCi0gICAgICB0YXJnZXRMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBjdXJyZW50Tm9kZS5nZXROb2RlTWFuYWdlcigpOwotICAgIGZvciAoaW50IGk9MDtpPHNlbGVjdGVkTm9kZUlkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGludCBzZWxlY3RlZE5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoc2VsZWN0ZWROb2RlSWRzW2ldKTsKLSAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShzZWxlY3RlZE5vZGVJZCk7Ci0gICAgICBUcmVlRWxlbWVudCB0cmVlRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgT2JqZWN0IG9iamVjdDsKLSAgICAgIGlmICh0cmVlRWxlbWVudCBpbnN0YW5jZW9mIEJ1c2luZXNzRWxlbWVudCkKLSAgICAgICAgb2JqZWN0ID0gKChCdXNpbmVzc0VsZW1lbnQpdHJlZUVsZW1lbnQpLmdldEJ1c2luZXNzRW50aXR5KCk7Ci0gICAgICBlbHNlIGlmICh0cmVlRWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VFbGVtZW50KQotICAgICAgICBvYmplY3QgPSAoKFNlcnZpY2VFbGVtZW50KXRyZWVFbGVtZW50KS5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gU2VydmljZSBpbnRlcmZhY2UKLSAgICAgICAgb2JqZWN0ID0gKChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCl0cmVlRWxlbWVudCkuZ2V0VE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgICBMaXN0RWxlbWVudCB0YXJnZXRMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudChvYmplY3QpOwotICAgICAgdGFyZ2V0TGlzdEVsZW1lbnQuc2V0VGFyZ2V0Vmlld1Rvb2xJbmZvKHNlbGVjdGVkTm9kZUlkLHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpKTsKLSAgICAgIGlmICh0YXJnZXRQcm9wZXJ0eS5lcXVhbHMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUykgfHwgdGFyZ2V0UHJvcGVydHkuZXF1YWxzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUykgfHwgdGFyZ2V0UHJvcGVydHkuZXF1YWxzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRSkpCi0gICAgICB7Ci0gICAgICAgIC8vIENsZWFyIHRoZSBtYW5hZ2VyIHNvIGEgcmVwbGFjZW1lbnQgb2NjdXJzLgotICAgICAgICB0YXJnZXRMaXN0LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICB0YXJnZXRMaXN0LmFkZEVsZW1lbnQodGFyZ2V0TGlzdEVsZW1lbnQpOwotICAgIH0KLSAgICB0YXJnZXRRdWVyeUZvcm1Ub29sUEkuc2V0UHJvcGVydHkodGFyZ2V0UHJvcGVydHksdGFyZ2V0TGlzdCk7Ci0gICAgSGFzaHRhYmxlIHNhdmVkUGFyZW50UXVlcnlQcm9wZXJ0aWVzID0gdGFyZ2V0LmdldFBhcmVudFF1ZXJ5RGF0YSgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBzYXZlZFBhcmVudFF1ZXJ5UHJvcGVydGllcy5rZXlzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgdGFyZ2V0UXVlcnlGb3JtVG9vbFBJLnNldFByb3BlcnR5KGtleSxzYXZlZFBhcmVudFF1ZXJ5UHJvcGVydGllcy5nZXQoa2V5KSk7Ci0gICAgfQotCi0gICAgLy8gU2VsZWN0IHRoZSBub2RlIGFuZCB0aGUgZGF0YXN0cnVjdHVyZSB3aGljaCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBzdWJxdWVyeS4KLSAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gdGFyZ2V0LmdldE5vZGVJZCgpOwotICAgIGludCB0YXJnZXRUb29sSWQgPSB0YXJnZXQuZ2V0VG9vbElkKCk7Ci0gICAgaW50IHRhcmdldFZpZXdJZCA9IHRhcmdldC5nZXRWaWV3SWQoKTsKLSAgICBpbnQgdGFyZ2V0Vmlld1Rvb2xJZCA9IHRhcmdldC5nZXRWaWV3VG9vbElkKCk7Ci0gICAgbm9kZU1hbmFnZXIuc2V0U2VsZWN0ZWROb2RlSWQodGFyZ2V0Tm9kZUlkKTsKLSAgICB0YXJnZXROb2RlXyA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIHRhcmdldE5vZGVfLmdldFRvb2xNYW5hZ2VyKCkuc2V0U2VsZWN0ZWRUb29sSWQodGFyZ2V0VG9vbElkKTsKLSAgICB0YXJnZXROb2RlXy5zZXRWaWV3SWQodGFyZ2V0Vmlld0lkKTsKLSAgICBpZiAodGFyZ2V0Vmlld0lkICE9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICAgIHRhcmdldE5vZGVfLmdldFZpZXdUb29sTWFuYWdlcigpLnNldFNlbGVjdGVkVG9vbElkKHRhcmdldFZpZXdUb29sSWQpOwotICAgIHRhcmdldEZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZLHRhcmdldFF1ZXJ5S2V5KTsKLSAgICBhZGRUb0hpc3RvcnkoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREksU2VsZWN0RmluZFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCx0YXJnZXRWaWV3VG9vbElkLHRhcmdldFF1ZXJ5S2V5LHRydWUpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldFRhcmdldE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldE5vZGVfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1RyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVHJhbnNmZXJUb0FkZENhdGVnb3J5RGF0YUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjUyNjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVHJhbnNmZXJUb0FkZENhdGVnb3J5RGF0YUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLQotcHVibGljIGNsYXNzIFRyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHVibGljIFRyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb24oKQotICB7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvVHJhbnNmZXJUb0FkZENhdGVnb3J5RGF0YUFjdGlvbkpTUC5qc3A/c2Vzc2lvbklkPS4uLiZjYXRlZ29yeVRNb2RlbEtleT0uLi4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhTdHJpbmcgc2Vzc2lvbklkLFN0cmluZyBjYXRlZ29yeVRNb2RlbEtleSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1RyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX1RNT0RFTF9LRVkpLmFwcGVuZCgnPScpLmFwcGVuZChjYXRlZ29yeVRNb2RlbEtleSk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjA2NTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuT3BlbldTRExBY3Rpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLQotcHVibGljIGNsYXNzIFVERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24KLXsKLSAgcHVibGljIFVERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxpbnQgdG9vbElkLGludCB2aWV3SWQsaW50IHZpZXdUb29sSWQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9VRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSWQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgbm9kZUlkU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgLy8gUGVyZm9ybSBkYXRhIHZhbGlkYXRpb24uCi0gICAgdHJ5Ci0gICAgewotICAgICAgSW50ZWdlci5wYXJzZUludChub2RlSWRTdHJpbmcpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gVmFsaWRhdGlvbiBmYWlsZWQhCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELG5vZGVJZFN0cmluZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJZCk7Ci0gICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VFbGVtZW50KQotICAgIHsKLSAgICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICAgIFVkZGk0akhlbHBlciB1ZGRpNGpIZWxwZXIgPSBuZXcgVWRkaTRqSGVscGVyKCk7Ci0gICAgICBTdHJpbmcgd3NkbFVSTCA9IHVkZGk0akhlbHBlci5nZXRXU0RMKGJzLCBzZXJ2aWNlRWxlbWVudC5nZXRSZWdpc3RyeUVsZW1lbnQoKS5nZXRQcm94eSgpKTsKLSAgICAgIGlmICh3c2RsVVJMID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlbXAiLCIud3NkbCIpOwotICAgICAgICAgIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgICAgYWN0aW9uLndyaXRlV1NETERlZmluaXRpb24obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpLGRlZik7Ci0gICAgICAgICAgd3NkbFVSTCA9IHRlbXBGaWxlLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbFVSTCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbFVSTCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsVVJMID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgICAKLSAgICAgIGlmICh3c2RsVVJMICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9wZW5XU0RMQWN0aW9uIG9wZW5XU0RMQWN0aW9uID0gbmV3IE9wZW5XU0RMQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuV1NETEFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgICAgIHByb3BlcnR5VGFibGUucHV0KEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCx3c2RsVVJMKTsKLSAgICAgICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBvcGVuV1NETEFjdGlvbi5ydW4oKTsKLSAgICAgICAgaWYgKGFjdGlvblJlc3VsdCkgewotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19XU0RMX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkUiLHdzZGxVUkwpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dTRExfTk9UX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDlkNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5XU0RMRmlsZU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlNlcnZpY2VJbnRlcmZhY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLXsKLSAgcHJpdmF0ZSBOb2RlTWFuYWdlciBub2RlTWFuYWdlcl87Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZfOwotICBwcml2YXRlIFN0cmluZyBkZWZhdWx0V1NETEZpbGVOYW1lXzsKLQotICBwdWJsaWMgVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgbm9kZU1hbmFnZXJfID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgZGVmXyA9IG51bGw7Ci0gICAgZGVmYXVsdFdTRExGaWxlTmFtZV8gPSAidGVtcC53c2RsIjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxpbnQgdG9vbElkLGludCB2aWV3SWQsaW50IHZpZXdUb29sSWQpCi0gIHsKLSAgICByZXR1cm4gSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCwidWRkaS9hY3Rpb25zL1VERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcCIpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gd3JpdGUoT3V0cHV0U3RyZWFtIG9zKQotICB7Ci0gICAgcmV0dXJuIHdyaXRlV1NETERlZmluaXRpb24ob3MsZGVmXyk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldERlZmF1bHRGaWxlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZGVmYXVsdFdTRExGaWxlTmFtZV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpOwotICAgIFVkZGk0akhlbHBlciB1ZGRpNGpIZWxwZXIgPSBuZXcgVWRkaTRqSGVscGVyKCk7Ci0gICAgU3RyaW5nIHdzZGxVcmwgPSBudWxsOwotICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgewotICAgICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmljZUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IHNlcnZpY2VFbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpOwotICAgICAgICB3c2RsVXJsID0gdWRkaTRqSGVscGVyLmdldFdTREwoYnMsIHNlcnZpY2VFbGVtZW50LmdldFJlZ2lzdHJ5RWxlbWVudCgpLmdldFByb3h5KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KQotICAgICAgewotICAgICAgICBUTW9kZWwgdE1vZGVsID0gKChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCllbGVtZW50KS5nZXRUTW9kZWwoKTsKLSAgICAgICAgd3NkbFVybCA9IHVkZGk0akhlbHBlci5nZXRXU0RMKHRNb2RlbCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh3c2RsVXJsICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZl8gPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVybCk7Ci0gICAgICAgIGlmIChkZWZfICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgd3NkbFBhdGhuYW1lOwotICAgICAgICAgIGludCBpbmRleCA9IHdzZGxVcmwuaW5kZXhPZignLycpOwotICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgICAgIHdzZGxQYXRobmFtZSA9IHdzZGxVcmwuc3Vic3RyaW5nKGluZGV4KzEsIHdzZGxVcmwubGVuZ3RoKCkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHdzZGxQYXRobmFtZSA9IHdzZGxVcmw7Ci0gICAgICAgICAgZGVmYXVsdFdTRExGaWxlTmFtZV8gPSBXU0RMRmlsZU5hbWVIZWxwZXIuZ2V0V1NETEZpbGVOYW1lKHdzZGxQYXRobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9SRVRSSUVWSU5HX1dTRExfRE9DIikpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYjFjYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvV29ya2JlbmNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbiBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi17Ci0gIHB1YmxpYyBVRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIHJldHVybiAoRm9ybVRvb2wpdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgfQotCi0gICAgcHVibGljIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiBuZXdJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24oKSB7Ci0gICAgICAgIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0KLSAgICAgICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0KLSAgICAgICAgdGFibGUucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSkpOwotCi0gICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTY1ZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlNlcnZpY2VJbnRlcmZhY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlcjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotcHVibGljIGNsYXNzIFVERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIGV4dGVuZHMgTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbgotewotICBwdWJsaWMgVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgcmV0dXJuIChGb3JtVG9vbCl1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBlbGVtZW50ID0gbm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFVkZGk0akhlbHBlciB1ZGRpNGpIZWxwZXIgPSBuZXcgVWRkaTRqSGVscGVyKCk7Ci0gICAgU3RyaW5nIHdzZGxVcmwgPSBudWxsOwotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmljZUVsZW1lbnQpCi0gICAgewotICAgICAgU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoU2VydmljZUVsZW1lbnQpZWxlbWVudDsKLSAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IHNlcnZpY2VFbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpOwotICAgICAgd3NkbFVybCA9IHVkZGk0akhlbHBlci5nZXRXU0RMKGJzLCBzZXJ2aWNlRWxlbWVudC5nZXRSZWdpc3RyeUVsZW1lbnQoKS5nZXRQcm94eSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KQotICAgIHsKLSAgICAgIFRNb2RlbCB0TW9kZWwgPSAoKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KWVsZW1lbnQpLmdldFRNb2RlbCgpOwotICAgICAgd3NkbFVybCA9IHVkZGk0akhlbHBlci5nZXRXU0RMKHRNb2RlbCk7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHdzZGxVcmwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVybCk7Ci0gICAgICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wIiwiLndzZGwiKTsKLSAgICAgICAgVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24gYWN0aW9uID0gbmV3IFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgYWN0aW9uLndyaXRlV1NETERlZmluaXRpb24obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpLGRlZik7Ci0gICAgICAgIHdzZGxVcmwgPSB0ZW1wRmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBsYXVuY2hXaXphcmQod3NkbFVybCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUkVUUklFVklOR19XU0RMX0RPQyIpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50UGFnZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzODdmZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5Ob2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlJlZ2lzdHJ5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJTWFpbk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVRERJTm9kZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlXzsKLSAgcHVibGljIFVERElOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkpOwotICAgIHJlZ05vZGVfID0gZ2V0UmVnaXN0cnlOb2RlKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTm9kZSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKQotICB7Ci0gICAgTm9kZSBzZWxlY3RlZE5hdmlnYXRvck5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgcmV0dXJuIHNlbGVjdGVkTmF2aWdhdG9yTm9kZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBSZWdpc3RyeU5vZGUgZ2V0UmVnaXN0cnlOb2RlKCkKLSAgewotICAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5vZGVNYW5hZ2VyXy5nZXRSb290Tm9kZSgpOwotICAgIHJldHVybiB1ZGRpTWFpbk5vZGUuZ2V0UmVnaXN0cnlOb2RlKGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJUHJvcGVydGllc0Zvcm1BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESVByb3BlcnRpZXNGb3JtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzhiMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJUHJvcGVydGllc0Zvcm1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuRm9ybUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlJlZ2lzdHJ5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJTWFpbk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24gZXh0ZW5kcyBGb3JtQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyXzsKLSAgcHVibGljIFVERElQcm9wZXJ0aWVzRm9ybUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBuYXZpZ2F0b3JNYW5hZ2VyXyA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE5vZGUgZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkKLSAgewotICAgIHJldHVybiBuYXZpZ2F0b3JNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkKLSAgewotICAgIHJldHVybiAoRm9ybVRvb2wpKGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBSZWdpc3RyeU5vZGUgZ2V0UmVnaXN0cnlOb2RlKCkKLSAgewotICAgIHJldHVybiBnZXRSZWdpc3RyeU5vZGUoZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFJlZ2lzdHJ5Tm9kZSBnZXRSZWdpc3RyeU5vZGUoTm9kZSByZWdpc3RyeUNoaWxkTm9kZSkKLSAgewotICAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXJfLmdldFJvb3ROb2RlKCk7Ci0gICAgcmV0dXJuIHVkZGlNYWluTm9kZS5nZXRSZWdpc3RyeU5vZGUocmVnaXN0cnlDaGlsZE5vZGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VucHVibGlzaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VbnB1Ymxpc2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5YWY3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VucHVibGlzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5CdXNpbmVzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlNlcnZpY2VJbnRlcmZhY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlJlZ2lzdHJ5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5EaXNwb3NpdGlvblJlcG9ydDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBVbnB1Ymxpc2hBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFJlZ2lzdHJ5Tm9kZSByZWdpc3RyeU5vZGVfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvZ2dlZEluXzsKLQotICBwdWJsaWMgVW5wdWJsaXNoQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHJlZ2lzdHJ5Tm9kZV8gPSBnZXRSZWdpc3RyeU5vZGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotCi0gICAgLy8gaWYgbm90IHlldCBsb2dnZWQgaW4sIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCB0byBsb2cgaW4KLSAgICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0KLSAgICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgICAgaWYgKHB1Ymxpc2hVUkwgIT0gbnVsbCkKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwsIHB1Ymxpc2hVUkwpOwotICAgICAgICAKLSAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHB1Ymxpc2hVUkwpKQotICAgICAgewotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTCIpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHVzZXJJZCAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICAgICAgCi0gICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh1c2VySWQpKQotICAgICAgewotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEIikpOwotICAgICAgfQotCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCwgcGFzc3dvcmQpOwotICAgICAgCi0gICAgICBmb3JtVG9vbC51cGRhdGVQcm9wZXJ0eVRhYmxlKHByb3BlcnR5VGFibGVfKTsKLQotICAgICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdpc3RyeUVsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoIXJlZ2lzdHJ5RWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIG5vdCB5ZXQgbG9nZ2VkIGluLCBsb2cgaW4gZmlyc3QKLSAgICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0gICAgICAgIAotICAgICAgICByZWdpc3RyeUVsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHNlbGVjdGVkRWxlbWVudEtleSA9IHNlbGVjdGVkRWxlbWVudC5nZXRLZXkoKTsKLSAgICAgIFN0cmluZyB1bnB1Ymxpc2hUeXBlTWVzc2FnZUtleSA9IG51bGw7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdpc3RyeUVsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIFN0cmluZyBhdXRoSW5mbyA9IHJlZ2lzdHJ5RWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpOwotICAgICAgRGlzcG9zaXRpb25SZXBvcnQgZHIgPSBudWxsOwotICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEJ1c2luZXNzRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgdW5wdWJsaXNoVHlwZU1lc3NhZ2VLZXkgPSAiTVNHX0lORk9fQlVTSU5FU1NfVU5QVUJMSVNIRUQiOwotICAgICAgICBkciA9IHByb3h5LmRlbGV0ZV9idXNpbmVzcyhhdXRoSW5mbyxzZWxlY3RlZEVsZW1lbnRLZXkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgU2VydmljZUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHVucHVibGlzaFR5cGVNZXNzYWdlS2V5ID0gIk1TR19JTkZPX1NFUlZJQ0VfVU5QVUJMSVNIRUQiOwotICAgICAgICBkciA9IHByb3h5LmRlbGV0ZV9zZXJ2aWNlKGF1dGhJbmZvLHNlbGVjdGVkRWxlbWVudEtleSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgdW5wdWJsaXNoVHlwZU1lc3NhZ2VLZXkgPSAiTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfVU5QVUJMSVNIRUQiOwotICAgICAgICBkciA9IHByb3h5LmRlbGV0ZV90TW9kZWwoYXV0aEluZm8sc2VsZWN0ZWRFbGVtZW50S2V5KTsKLSAgICAgIH0KLSAgICAgIGlmICghZHIuc3VjY2VzcygpKQotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGRyLnRvU3RyaW5nKCkpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZWxlY3RlZEVsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSh1bnB1Ymxpc2hUeXBlTWVzc2FnZUtleSxzZWxlY3RlZEVsZW1lbnQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJUcmFuc3BvcnRFeGNlcHRpb24iLGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIixlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLCBtZXNzYWdlUXVldWUsICJFeGNlcHRpb24iLCBlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VwZGF0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjYzNjUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkJ1c2luZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5TZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuU2VydmljZUludGVyZmFjZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUHVibGlzaGVkSXRlbXNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlJlZ2lzdHJ5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVcGRhdGVBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlXzsKLSAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzQXV0aGVudGljYXRpb25fOwotICBwdWJsaWMgVXBkYXRlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcixib29sZWFuIHJlcXVpcmVzQXV0aGVudGljYXRpb24pCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICByZWdOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgpOwotICAgIHJlcXVpcmVzQXV0aGVudGljYXRpb25fID0gcmVxdWlyZXNBdXRoZW50aWNhdGlvbjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLSAgCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTZXR1cCBmb3IgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcgotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTVVMVElQQVJUX0ZPUk1fREFUQV9QQVJTRVIsIHBhcnNlcik7Ci0KLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9IGZvcm1Ub29sOwotICAgIGZvcm1Ub29sUEkuY2xlYXJFcnJvcnMoKTsKLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gcHJvY2Vzc090aGVycyhwYXJzZXIsZm9ybVRvb2xQSSk7Ci0gICAgZm9yIChpbnQgaT0wO2k8cmVtb3ZlZFByb3BlcnRpZXNfLnNpemUoKTtpKyspCi0gICAgICBmb3JtVG9vbFBJLnJlbW92ZVByb3BlcnR5KHJlbW92ZWRQcm9wZXJ0aWVzXy5lbGVtZW50QXQoaSkpOwotICAgIGZvcm1Ub29sUEkudXBkYXRlUHJvcGVydHlUYWJsZShwcm9wZXJ0eVRhYmxlXyk7Ci0gICAgCi0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgIFN0cmluZyB1c2VySWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIAotICAgIGJvb2xlYW4gdmFsaWRhdGVBdXRoZW50aWNhdGlvbiA9ICFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSAmIHJlcXVpcmVzQXV0aGVudGljYXRpb25fOwotICAgIAotICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIH0KLSAgICAKLSAgICBpZiAodmFsaWRhdGVBdXRoZW50aWNhdGlvbiAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHB1Ymxpc2hVUkwpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfUFVCTElTSF9VUkwiKSk7Ci0gICAgfQotICAgIAotICAgIGlmICh1c2VySWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgfQotICAgIAotICAgIGlmICh2YWxpZGF0ZUF1dGhlbnRpY2F0aW9uICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcodXNlcklkKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9VU0VSSUQiKSk7Ci0gICAgfQotICAgIAotICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWZyZXNoRnJvbVJlZ2lzdHJ5KCk7Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWZyZXNoTm9kZShCdXNpbmVzc0VudGl0eSBiZSkKLSAgewotICAgIE5vZGUgbm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgbmV3QnVzaW5lc3NFbGVtZW50ID0gbmV3IEJ1c2luZXNzRWxlbWVudChiZSxyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpLmdldE1vZGVsKCkpOwotICAgIGNvbm5lY3RFbGVtZW50cyhwYXJlbnROb2RlLG5ld0J1c2luZXNzRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZnJlc2hOb2RlKEJ1c2luZXNzU2VydmljZSBicykKLSAgewotICAgIE5vZGUgbm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBuZXdTZXJ2aWNlRWxlbWVudCA9IG5ldyBTZXJ2aWNlRWxlbWVudChicyxyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpLmdldE1vZGVsKCkpOwotICAgIGNvbm5lY3RFbGVtZW50cyhwYXJlbnROb2RlLG5ld1NlcnZpY2VFbGVtZW50KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmcmVzaE5vZGUoVE1vZGVsIHRNb2RlbCkKLSAgewotICAgIE5vZGUgbm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBuZXdTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCh0TW9kZWwscmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKS5nZXRNb2RlbCgpKTsKLSAgICBjb25uZWN0RWxlbWVudHMocGFyZW50Tm9kZSxuZXdTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjb25uZWN0RWxlbWVudHMoTm9kZSBwYXJlbnROb2RlLFRyZWVFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBUcmVlRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gcGFyZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFN0cmluZyByZWwgPSBudWxsOwotICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgUHVibGlzaGVkSXRlbXNOb2RlKQotICAgICAgcmVsID0gVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFF1ZXJ5Tm9kZQotICAgICAgcmVsID0gVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSWV9SRVNVTFRTOwotICAgIH0KLSAgICBwYXJlbnRFbGVtZW50LmNvbm5lY3QobmV3RWxlbWVudCxyZWwsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICBOb2RlIG5ld05vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShuZXdFbGVtZW50KTsKLSAgICBpbnQgbmV3Tm9kZUlkID0gbmV3Tm9kZS5nZXROb2RlSWQoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHBhcmVudE5vZGUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChuZXdOb2RlSWQpOwotICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gbmV3Tm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgYWRkVG9IaXN0b3J5KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLHNlbGVjdGVkVG9vbC5nZXRTZWxlY3RUb29sQWN0aW9uSHJlZih0cnVlKSk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKFZlY3RvciB2KQotICB7Ci0gICAgZm9yIChpbnQgaT0wO2k8di5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXYuZWxlbWVudEF0KGkpOwotICAgICAgbGlzdEVsZW1lbnQuc2V0Vmlld0lkKGkpOwotICAgICAgLy8gdGFyZ2V0Vmlld0lkIGRldGVybWluZXMgd2hldGhlciBvciBub3QgYSBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkIGxpc3QgZWxlbWVudCByZW1haW5zIGluIGVkaXQgc3RhdGUuCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCArIDFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoIC0gMV0gPSBuZXcgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcihjb250cm9sbGVyXyk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlQnVzaW5lc3NBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlQnVzaW5lc3NBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMGZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VwZGF0ZUJ1c2luZXNzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5OYW1lOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRGlzY292ZXJ5VVJMOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5EaXNjb3ZlcnlVUkxzOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5JZGVudGlmaWVyQmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUJ1c2luZXNzQWN0aW9uIGV4dGVuZHMgVXBkYXRlQWN0aW9uCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1VwZGF0ZV87Ci0gIHB1YmxpYyBVcGRhdGVCdXNpbmVzc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLHRydWUpOwotICAgIGlzVXBkYXRlXyA9IHRydWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB1dWlkS2V5ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKTsKLSAgICBTdHJpbmdbXSBkaXNjb3ZlcnlVUkxNb2RpZmllZFN0YXRlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5ESVNDT1ZFUllVUkxfTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIGRpc2NvdmVyeVVSTFZpZXdJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuRElTQ09WRVJZVVJMX1ZJRVdJRCk7Ci0gICAgU3RyaW5nW10gZGlzY292ZXJ5VVJMcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ESVNDT1ZFUllVUkwpOwotICAgIFN0cmluZ1tdIG5hbWVNb2RpZmllZFN0YXRlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5OQU1FX01PRElGSUVEKTsKLSAgICBTdHJpbmdbXSBuYW1lVmlld0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5OQU1FX1ZJRVdJRCk7Ci0gICAgU3RyaW5nW10gbmFtZUxhbmd1YWdlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBuYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbk1vZGlmaWVkU3RhdGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkRFU0NSSVBUSU9OX01PRElGSUVEKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvblZpZXdJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fVklFV0lEKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbkxhbmd1YWdlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25zID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OKTsKLSAgICBTdHJpbmdbXSBpZE1vZGlmaWVkU3RhdGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLklERU5USUZJRVJfTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIGlkVmlld0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5JREVOVElGSUVSX1ZJRVdJRCk7Ci0gICAgU3RyaW5nW10gaWRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX1RZUEUpOwotICAgIFN0cmluZ1tdIGlkS2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gaWRLZXlWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfVkFMVUUpOwotICAgIFN0cmluZ1tdIGNhdE1vZGlmaWVkU3RhdGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX01PRElGSUVEKTsKLSAgICBTdHJpbmdbXSBjYXRWaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX1ZJRVdJRCk7Ci0gICAgU3RyaW5nW10gY2F0VHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfVFlQRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGNhdEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfVkFMVUUpOwotICAgIAotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIAotICAgIGlmICh1dWlkS2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSx1dWlkS2V5KTsKLSAgICAKLSAgICAKLSAgICBpZiAoZGlzY292ZXJ5VVJMTW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBkaXNjb3ZlcnlVUkxWaWV3SWRzICE9IG51bGwgJiYgZGlzY292ZXJ5VVJMcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBvbGREaXNjb3ZlcnlVUkxMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMpOwotICAgICAgVmVjdG9yIG5ld0Rpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICBwYXJhbWV0ZXJzWzBdID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRElTQ09WRVJZVVJMIik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxkaXNjb3ZlcnlVUkxzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIHBhcmFtZXRlcnNbMV0gPSBTdHJpbmcudmFsdWVPZihpKzEpOwotICAgICAgICBEaXNjb3ZlcnlVUkwgZGlzY292ZXJ5VVJMID0gbmV3IERpc2NvdmVyeVVSTChkaXNjb3ZlcnlVUkxzW2ldLCIiKTsKLSAgICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVVUkwoZGlzY292ZXJ5VVJMc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGRpc2NvdmVyeVVSTFZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQoZGlzY292ZXJ5VVJMVmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihkaXNjb3ZlcnlVUkxNb2RpZmllZFN0YXRlc1tpXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGlzY292ZXJ5VVJMVmlld0lkID09IC0xIHx8IGlzTW9kaWZpZWQpCi0gICAgICAgICAgbmV3RGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQoZGlzY292ZXJ5VVJMKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuZXdEaXNjb3ZlcnlVUkxMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG9sZERpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChkaXNjb3ZlcnlVUkxWaWV3SWQpKTsgICAgIAotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld0Rpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMsbmV3RGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3IpOyAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLSAgICAKLSAgICBIYXNodGFibGUgbGFuZ3VhZ2VIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChuYW1lTW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBuYW1lVmlld0lkcyAhPSBudWxsICYmIG5hbWVMYW5ndWFnZXMgIT0gbnVsbCAmJiBuYW1lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBvbGROYW1lTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyk7Ci0gICAgICBWZWN0b3IgbmV3TmFtZUxpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgLy8gVURESSdzIHNhdmUgQVBJIChBcHBlbmRpeCBDIG9mIHRoZSBVRERJIFYyIFByb2dyYW1tZXJzIEFQSSBTcGVjaWZpY2F0aW9uKSByZXF1aXJlcyB0aGUgZm9sbG93aW5nOgotICAgICAgLy8gMSkgT25seSB0aGUgZmlyc3Qgcm93IGNhbiBoYXZlIGEgYmxhbmsgbGFuZ3VhZ2UuCi0gICAgICAvLyAyKSBPbmx5IDEgbmFtZSBwZXIgbGFuZ3VhZ2UuCi0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxuYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwYXJhbWV0ZXJzWzFdID0gU3RyaW5nLnZhbHVlT2YoaSsxKTsKLSAgICAgICAgTmFtZSB1ZGRpNGpOYW1lOwotICAgICAgICBpZiAobmFtZUxhbmd1YWdlc1tpXS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldLG5hbWVMYW5ndWFnZXNbaV0pOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpNGpOYW1lID0gbmV3IE5hbWUobmFtZXNbaV0pOwotICAgICAgICAgIGlmIChpICE9IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsaSk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZ3VhZ2VIYXNoLmdldChuYW1lTGFuZ3VhZ2VzW2ldKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsYW5ndWFnZUhhc2gucHV0KG5hbWVMYW5ndWFnZXNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcobmFtZXNbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgbmFtZVZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQobmFtZVZpZXdJZHNbaV0pOwotICAgICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YobmFtZU1vZGlmaWVkU3RhdGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIAotICAgICAgICBpZiAobmFtZVZpZXdJZCA9PSAtMSB8fCBpc01vZGlmaWVkKQotICAgICAgICAgIG5ld05hbWVMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudCh1ZGRpNGpOYW1lKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuZXdOYW1lTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGROYW1lTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KG5hbWVWaWV3SWQpKTsKLSAgICAgIH0KLSAgICAgIHJlaW5kZXhMaXN0RWxlbWVudFZlY3RvcihuZXdOYW1lTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsbmV3TmFtZUxpc3RFbGVtZW50VmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMpOwotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19OQU1FUyIpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGRlc2NyaXB0aW9uTW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBkZXNjcmlwdGlvblZpZXdJZHMgIT0gbnVsbCAmJiBkZXNjcmlwdGlvbkxhbmd1YWdlcyAhPSBudWxsICYmIGRlc2NyaXB0aW9ucyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBvbGREZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TKTsKLSAgICAgIFZlY3RvciBuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICBwYXJhbWV0ZXJzWzBdID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKTsKLSAgICAgIGxhbmd1YWdlSGFzaC5jbGVhcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25zLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIHBhcmFtZXRlcnNbMV0gPSBTdHJpbmcudmFsdWVPZihpKzEpOwotICAgICAgICBEZXNjcmlwdGlvbiB1ZGRpNGpEZXNjcmlwdGlvbjsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB1ZGRpNGpEZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbihkZXNjcmlwdGlvbnNbaV0sZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpNGpEZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbihkZXNjcmlwdGlvbnNbaV0pOwotICAgICAgICAgIGlmIChpICE9IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlSGFzaC5nZXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsYW5ndWFnZUhhc2gucHV0KGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKGRlc2NyaXB0aW9uc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZGVzY3JpcHRpb25WaWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGRlc2NyaXB0aW9uVmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihkZXNjcmlwdGlvbk1vZGlmaWVkU3RhdGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIAotICAgICAgICBpZiAoZGVzY3JpcHRpb25WaWV3SWQgPT0gLTEgfHwgaXNNb2RpZmllZCkKLSAgICAgICAgICBuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQobmV3IExpc3RFbGVtZW50KHVkZGk0akRlc2NyaXB0aW9uKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQob2xkRGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoZGVzY3JpcHRpb25WaWV3SWQpKTsKLSAgICAgIH0KLSAgICAgIHJlaW5kZXhMaXN0RWxlbWVudFZlY3RvcihuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyxuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yKTsgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpOwotICAgICAgCi0gICAgaWYgKGlkTW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBpZFZpZXdJZHMgIT0gbnVsbCAmJiBpZFR5cGVzICE9IG51bGwgJiYgaWRLZXlOYW1lcyAhPSBudWxsICYmIGlkS2V5VmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG9sZElkTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyk7Ci0gICAgICBWZWN0b3IgbmV3SWRMaXN0RWxlbWVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGlkS2V5TmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoaWRLZXlOYW1lc1tpXSxpZEtleVZhbHVlc1tpXSxpZFR5cGVzW2ldKTsKLSAgICAgICAgaW50IGlkVmlld0lkID0gSW50ZWdlci5wYXJzZUludChpZFZpZXdJZHNbaV0pOwotICAgICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YoaWRNb2RpZmllZFN0YXRlc1tpXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChpZFZpZXdJZCA9PSAtMSB8fCBpc01vZGlmaWVkKQotICAgICAgICAgIG5ld0lkTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQoa3IpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld0lkTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGRJZExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpZFZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld0lkTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMsbmV3SWRMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMpOwotICAgICAgCi0gICAgaWYgKGNhdE1vZGlmaWVkU3RhdGVzICE9IG51bGwgJiYgY2F0Vmlld0lkcyAhPSBudWxsICYmIGNhdFR5cGVzICE9IG51bGwgJiYgY2F0S2V5TmFtZXMgIT0gbnVsbCAmJiBjYXRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Igb2xkQ2F0TGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19DQVRFR09SSUVTKTsKLSAgICAgIFZlY3RvciBuZXdDYXRMaXN0RWxlbWVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGNhdFR5cGVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gbmV3IEtleWVkUmVmZXJlbmNlKGNhdEtleU5hbWVzW2ldLGNhdEtleVZhbHVlc1tpXSxjYXRUeXBlc1tpXSk7Ci0gICAgICAgIGludCBjYXRWaWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGNhdFZpZXdJZHNbaV0pOwotICAgICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YoY2F0TW9kaWZpZWRTdGF0ZXNbaV0pLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICBpZiAoY2F0Vmlld0lkID09IC0xIHx8IGlzTW9kaWZpZWQpCi0gICAgICAgICAgbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQoa3IpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld0NhdExpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQob2xkQ2F0TGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGNhdFZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld0NhdExpc3RFbGVtZW50VmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMsbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMpOyAgICAgICAgICAgIAotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJlZnJlc2hGcm9tUmVnaXN0cnkoKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXVpZEtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBWZWN0b3IgYmVWZWN0b3IgPSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwodXVpZEtleSkuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJlOwotICAgICAgaWYgKGJlVmVjdG9yLnNpemUoKSA+IDApCi0gICAgICAgIGJlID0gKEJ1c2luZXNzRW50aXR5KWJlVmVjdG9yLmdldCgwKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmUgPSBudWxsOwotICAgICAgaWYgKGJlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QsYmUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIEZlZWRiYWNrIHZpYSBKYXZhc2NyaXB0IHBvcHVwcy4KLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBGZWVkYmFjayB2aWEgSmF2YXNjcmlwdCBwb3B1cHMuCi0gICAgfQotICAgIGlzVXBkYXRlXyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAgIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCk7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgVmVjdG9yIGRpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLSAgICAgIFZlY3RvciBuYW1lTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpOwotICAgICAgVmVjdG9yIGlkTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLSAgICAgIFZlY3RvciBjYXRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7Ci0gICAgICAKLSAgICAgIFZlY3RvciBkaXNjb3ZlcnlVUkxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpZiAoZGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8ZGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICAgewotICAgICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWRpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBEaXNjb3ZlcnlVUkwgZGlzY292ZXJ5VVJMID0gKERpc2NvdmVyeVVSTClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICBkaXNjb3ZlcnlVUkxWZWN0b3IuYWRkRWxlbWVudChkaXNjb3ZlcnlVUkwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxuYW1lTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpbmFtZUxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIG5hbWVWZWN0b3IuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gbnVsbDsKLSAgICAgIGlmIChkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICBkZXNjcmlwdGlvblZlY3Rvci5hZGRFbGVtZW50KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gbnVsbDsKLSAgICAgIGlmIChpZExpc3RFbGVtZW50VmVjdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlkQmFnID0gbmV3IElkZW50aWZpZXJCYWcoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8aWRMaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpaWRMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgaWRCYWcuYWRkKGtyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSBudWxsOwotICAgICAgaWYgKGNhdExpc3RFbGVtZW50VmVjdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxjYXRMaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpY2F0TGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgIGNhdEJhZy5hZGQoa3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaXNjb3ZlcnlVUkxWZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgICAgYmUuc2V0RGlzY292ZXJ5VVJMcyhuZXcgRGlzY292ZXJ5VVJMcyhkaXNjb3ZlcnlVUkxWZWN0b3IpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmUuc2V0RGlzY292ZXJ5VVJMcyhudWxsKTsKLSAgICAgIGJlLnNldE5hbWVWZWN0b3IobmFtZVZlY3Rvcik7Ci0gICAgICBiZS5zZXREZXNjcmlwdGlvblZlY3RvcihkZXNjcmlwdGlvblZlY3Rvcik7Ci0gICAgICBiZS5zZXRJZGVudGlmaWVyQmFnKGlkQmFnKTsKLSAgICAgIGJlLnNldENhdGVnb3J5QmFnKGNhdEJhZyk7Ci0gICAgICAKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgVmVjdG9yIGJlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgYmVWZWN0b3IuYWRkKGJlKTsKLSAgICAgIGJlID0gKEJ1c2luZXNzRW50aXR5KXByb3h5LnNhdmVfYnVzaW5lc3MocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBiZVZlY3RvcikuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICByZWZyZXNoTm9kZShiZSk7Ci0gICAgICBpZiAoaXNVcGRhdGVfKSAgICAgIAotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQlVTSU5FU1NfVVBEQVRFRCIsYmUuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSkpOwotICAgICAgZWxzZQotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQlVTSU5FU1NfUFVCTElTSEVEIixiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIsZSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkYzMxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VwZGF0ZVJlZ2lzdHJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5DYXRlZ29yeU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVJlZ2lzdHJ5QWN0aW9uIGV4dGVuZHMgVXBkYXRlQWN0aW9uCi17Ci0gIHB1YmxpYyBVcGRhdGVSZWdpc3RyeUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGZhbHNlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5hbWVNb2RpZmllZFN0YXRlID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5BTUVfTU9ESUZJRUQpOwotICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1JFR0lTVFJZX05BTUUpOwotICAgIFN0cmluZ1tdIHVzZXJEZWZpbmVkQ2F0ZWdvcnlUTW9kZWxLZXlzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX1RNT0RFTF9LRVkpOwotICAgIFN0cmluZ1tdIHVzZXJEZWZpbmVkQ2F0ZWdvcnlEYXRhID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX0ZJTEVOQU1FKTsKLSAgICAKLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICAKLSAgICBpZiAobmFtZU1vZGlmaWVkU3RhdGUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKG5hbWVNb2RpZmllZFN0YXRlKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIFN0cmluZyBuZXdOYW1lOwotICAgICAgaWYgKGlzTW9kaWZpZWQpCi0gICAgICAgIG5ld05hbWUgPSBuYW1lOwotICAgICAgZWxzZQotICAgICAgICBuZXdOYW1lID0gKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUkVHSVNUUllfTkFNRSk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9SRUdJU1RSWV9OQU1FLG5ld05hbWUpOwotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUkVHSVNUUllfTkFNRSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9OQU1FIikpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1JFR0lTVFJZX05BTUUpOwotICAgIAotICAgIGlmICh1c2VyRGVmaW5lZENhdGVnb3J5VE1vZGVsS2V5cyAhPSBudWxsICYmIHVzZXJEZWZpbmVkQ2F0ZWdvcnlEYXRhICE9IG51bGwpCi0gICAgewotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTx1c2VyRGVmaW5lZENhdGVnb3J5VE1vZGVsS2V5cy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBDYXRlZ29yeU1vZGVsIHVzZXJEZWZpbmVkQ2F0ZWdvcnkgPSByZWdFbGVtZW50LmdldFVzZXJEZWZpbmVkQ2F0ZWdvcnkodXNlckRlZmluZWRDYXRlZ29yeVRNb2RlbEtleXNbaV0pOwotLy8gICAgICBUT0RPOiBNb3ZlIFVERElQcmVmZXJlbmNlQ29udGV4dCBkb3duIHRvIG9yZy5lY2xpcHNlLndzdC53cyAKLS8vICAgICAgVURESVByZWZlcmVuY2VDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0VURESVByZWZlcmVuY2VDb250ZXh0KCk7ICAgICAgICAKLS8vICAgICAgdXNlckRlZmluZWRDYXRlZ29yeS5zZXRDb2x1bW5EZWxpbWl0ZXIoY29udGV4dC5nZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpKTsKLS8vICAgICAgdXNlckRlZmluZWRDYXRlZ29yeS5zZXRTdHJpbmdEZWxpbWl0ZXIoY29udGV4dC5nZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcigpKTsKLSAgICAgICAgdXNlckRlZmluZWRDYXRlZ29yeS5zZXRDb2x1bW5EZWxpbWl0ZXIoIiMiKTsKLSAgICAgICAgdXNlckRlZmluZWRDYXRlZ29yeS5zZXRTdHJpbmdEZWxpbWl0ZXIoIlwiIik7Ci0gICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IHVzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2V0RGlzcGxheU5hbWUoKTsKLSAgICAgICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcnlEYXRhW2ldID09IG51bGwgfHwgdXNlckRlZmluZWRDYXRlZ29yeURhdGFbaV0ubGVuZ3RoKCkgPCAxKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRSIsZGlzcGxheU5hbWUpKTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlVTRVJfREVGSU5FRF9DQVRFR09SSUVTLHVzZXJEZWZpbmVkQ2F0ZWdvcnlUTW9kZWxLZXlzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBieXRlIHJjID0gdXNlckRlZmluZWRDYXRlZ29yeS5sb2FkRGF0YShuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih1c2VyRGVmaW5lZENhdGVnb3J5RGF0YVtpXSkpKTsKLSAgICAgICAgICBzd2l0Y2ggKHJjKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQ2F0ZWdvcnlNb2RlbC5PUEVSQVRJT05fU1VDQ0VTU0ZVTDoKLSAgICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0xPQURFRCIsZGlzcGxheU5hbWUpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENhdGVnb3J5TW9kZWwuRVJST1JfRklMRToKLSAgICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgUGFyc2VFeGNlcHRpb24gcGUgPSAoUGFyc2VFeGNlcHRpb24pdXNlckRlZmluZWRDYXRlZ29yeS5nZXRFcnJvckV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICBTdHJpbmdbXSBhcmdzMSA9IHtTdHJpbmcudmFsdWVPZihwZS5nZXRFcnJvck9mZnNldCgpKSxkaXNwbGF5TmFtZSxwZS5nZXRNZXNzYWdlKCksdXNlckRlZmluZWRDYXRlZ29yeS5nZXRDYXRlZ29yeUtleSgpfTsKLSAgICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfRk9STUFUIixhcmdzMSkpOwotICAgICAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlVTRVJfREVGSU5FRF9DQVRFR09SSUVTLHVzZXJEZWZpbmVkQ2F0ZWdvcnlUTW9kZWxLZXlzW2ldKTsKLSAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgQ2F0ZWdvcnlNb2RlbC5FUlJPUl9DQVRFR09SWV9LRVk6Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICBTdHJpbmdbXSBhcmdzMiA9IHtkaXNwbGF5TmFtZSx1c2VyRGVmaW5lZENhdGVnb3J5LmdldEVycm9yRXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpLHVzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2V0Q2F0ZWdvcnlLZXkoKX07Ci0gICAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0tFWSIsYXJnczIpKTsKLSAgICAgICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5VU0VSX0RFRklORURfQ0FURUdPUklFUyx1c2VyRGVmaW5lZENhdGVnb3J5VE1vZGVsS2V5c1tpXSk7ICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVmcmVzaEZyb21SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9SRUdJU1RSWV9OQU1FKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICByZWdFbGVtZW50LnNldE5hbWUobmFtZSk7Ci0gICAgcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKS5zZXROYW1lKG5hbWUpOwotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19SRUdJU1RSWV9VUERBVEVEIixuYW1lKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlU2VydmljZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWJmYzU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlU2VydmljZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlJlZ1B1Ymxpc2hUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuTmFtZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuU2VydmljZURldGFpbDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVNlcnZpY2VBY3Rpb24gZXh0ZW5kcyBVcGRhdGVBY3Rpb24KLXsKLSAgcHJpdmF0ZSBib29sZWFuIGlzVXBkYXRlXzsKLSAgcHVibGljIFVwZGF0ZVNlcnZpY2VBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcix0cnVlKTsKLSAgICBpc1VwZGF0ZV8gPSB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHV1aWRCdXNpbmVzc0tleSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSk7Ci0gICAgU3RyaW5nIHV1aWRTZXJ2aWNlS2V5ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVkpOwotICAgIFN0cmluZyB3c2RsVVJMTW9kaWZpZWRTdGF0ZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5XU0RMX1VSTF9NT0RJRklFRCk7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICAgU3RyaW5nW10gbmFtZU1vZGlmaWVkU3RhdGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5BTUVfTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIG5hbWVWaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5BTUVfVklFV0lEKTsKLSAgICBTdHJpbmdbXSBuYW1lTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UpOwotICAgIFN0cmluZ1tdIG5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uVmlld0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5ERVNDUklQVElPTl9WSUVXSUQpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04pOwotICAgIFN0cmluZ1tdIGNhdE1vZGlmaWVkU3RhdGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX01PRElGSUVEKTsKLSAgICBTdHJpbmdbXSBjYXRWaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX1ZJRVdJRCk7Ci0gICAgU3RyaW5nW10gY2F0VHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfVFlQRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGNhdEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfVkFMVUUpOwotCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0KLSAgICBpZiAodXVpZEJ1c2luZXNzS2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSx1dWlkQnVzaW5lc3NLZXkpOwotCi0gICAgaWYgKHV1aWRTZXJ2aWNlS2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZLHV1aWRTZXJ2aWNlS2V5KTsKLQotICAgIGlmICh3c2RsVVJMTW9kaWZpZWRTdGF0ZSAhPSBudWxsICYmIHdzZGxVUkwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0RWxlbWVudCB3c2RsVVJMTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpOwotICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKHdzZGxVUkxNb2RpZmllZFN0YXRlKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIGlmIChpc01vZGlmaWVkKQotICAgICAgICB3c2RsVVJMTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQod3NkbFVSTCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHdzZGxVUkwgPSAoU3RyaW5nKXdzZGxVUkxMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwsd3NkbFVSTExpc3RFbGVtZW50KTsKLSAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHdzZGxVUkwpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkwiKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCk7Ci0KLSAgICBIYXNodGFibGUgbGFuZ3VhZ2VIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChuYW1lTW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBuYW1lVmlld0lkcyAhPSBudWxsICYmIG5hbWVMYW5ndWFnZXMgIT0gbnVsbCAmJiBuYW1lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBvbGROYW1lTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgICAgIFZlY3RvciBuZXdOYW1lTGlzdEVsZW1lbnRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAvLyBVRERJJ3Mgc2F2ZSBBUEkgKEFwcGVuZGl4IEMgb2YgdGhlIFVEREkgVjIgUHJvZ3JhbW1lcnMgQVBJIFNwZWNpZmljYXRpb24pIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAvLyAxKSBPbmx5IHRoZSBmaXJzdCByb3cgY2FuIGhhdmUgYSBibGFuayBsYW5ndWFnZS4KLSAgICAgIC8vIDIpIE9ubHkgMSBuYW1lIHBlciBsYW5ndWFnZS4KLSAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcGFyYW1ldGVyc1swXSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPG5hbWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIHBhcmFtZXRlcnNbMV0gPSBTdHJpbmcudmFsdWVPZihpKzEpOwotICAgICAgICBOYW1lIHVkZGk0ak5hbWU7Ci0gICAgICAgIGlmIChuYW1lTGFuZ3VhZ2VzW2ldLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB1ZGRpNGpOYW1lID0gbmV3IE5hbWUobmFtZXNbaV0sbmFtZUxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVkZGk0ak5hbWUgPSBuZXcgTmFtZShuYW1lc1tpXSk7Ci0gICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLGkpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlSGFzaC5nZXQobmFtZUxhbmd1YWdlc1tpXSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsYW5ndWFnZUhhc2gucHV0KG5hbWVMYW5ndWFnZXNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcobmFtZXNbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbmFtZVZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQobmFtZVZpZXdJZHNbaV0pOwotICAgICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YobmFtZU1vZGlmaWVkU3RhdGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLQotICAgICAgICBpZiAobmFtZVZpZXdJZCA9PSAtMSB8fCBpc01vZGlmaWVkKQotICAgICAgICAgIG5ld05hbWVMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudCh1ZGRpNGpOYW1lKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuZXdOYW1lTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGROYW1lTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KG5hbWVWaWV3SWQpKTsKLSAgICAgIH0KLSAgICAgIHJlaW5kZXhMaXN0RWxlbWVudFZlY3RvcihuZXdOYW1lTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxuZXdOYW1lTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19OQU1FUyIpKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVzY3JpcHRpb25Nb2RpZmllZFN0YXRlcyAhPSBudWxsICYmIGRlc2NyaXB0aW9uVmlld0lkcyAhPSBudWxsICYmIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzICE9IG51bGwgJiYgZGVzY3JpcHRpb25zICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG9sZERlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0gICAgICBWZWN0b3IgbmV3RGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcGFyYW1ldGVyc1swXSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIik7Ci0gICAgICBsYW5ndWFnZUhhc2guY2xlYXIoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGRlc2NyaXB0aW9ucy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwYXJhbWV0ZXJzWzFdID0gU3RyaW5nLnZhbHVlT2YoaSsxKTsKLSAgICAgICAgRGVzY3JpcHRpb24gdWRkaTRqRGVzY3JpcHRpb247Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgdWRkaTRqRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb24oZGVzY3JpcHRpb25zW2ldLGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaTRqRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb24oZGVzY3JpcHRpb25zW2ldKTsKLSAgICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlSGFzaC5nZXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGxhbmd1YWdlSGFzaC5wdXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcoZGVzY3JpcHRpb25zW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkZXNjcmlwdGlvblZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQoZGVzY3JpcHRpb25WaWV3SWRzW2ldKTsKLSAgICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKGRlc2NyaXB0aW9uTW9kaWZpZWRTdGF0ZXNbaV0pLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgICAgIGlmIChkZXNjcmlwdGlvblZpZXdJZCA9PSAtMSB8fCBpc01vZGlmaWVkKQotICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQodWRkaTRqRGVzY3JpcHRpb24pKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGREZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChkZXNjcmlwdGlvblZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsbmV3RGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpOwotCi0gICAgaWYgKGNhdE1vZGlmaWVkU3RhdGVzICE9IG51bGwgJiYgY2F0Vmlld0lkcyAhPSBudWxsICYmIGNhdFR5cGVzICE9IG51bGwgJiYgY2F0S2V5TmFtZXMgIT0gbnVsbCAmJiBjYXRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Igb2xkQ2F0TGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMpOwotICAgICAgVmVjdG9yIG5ld0NhdExpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VHlwZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoY2F0S2V5TmFtZXNbaV0sY2F0S2V5VmFsdWVzW2ldLGNhdFR5cGVzW2ldKTsKLSAgICAgICAgaW50IGNhdFZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQoY2F0Vmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihjYXRNb2RpZmllZFN0YXRlc1tpXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChjYXRWaWV3SWQgPT0gLTEgfHwgaXNNb2RpZmllZCkKLSAgICAgICAgICBuZXdDYXRMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudChrcikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGRDYXRMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoY2F0Vmlld0lkKSk7Ci0gICAgICB9Ci0gICAgICByZWluZGV4TGlzdEVsZW1lbnRWZWN0b3IobmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTLG5ld0NhdExpc3RFbGVtZW50VmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMpOwotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJlZnJlc2hCdXNpbmVzc0Zyb21SZWdpc3RyeSgpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyB1dWlkQnVzaW5lc3NLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKTsKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgVmVjdG9yIGJlVmVjdG9yID0gcHJveHkuZ2V0X2J1c2luZXNzRGV0YWlsKHV1aWRCdXNpbmVzc0tleSkuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJlOwotICAgICAgaWYgKGJlVmVjdG9yLnNpemUoKSA+IDApCi0gICAgICAgIGJlID0gKEJ1c2luZXNzRW50aXR5KWJlVmVjdG9yLmdldCgwKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmUgPSBudWxsOwotICAgICAgaWYgKGJlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9CVVNJTkVTUyxiZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gRmVlZGJhY2sgdmlhIEphdmFzY3JpcHQgcG9wdXBzLgotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIEZlZWRiYWNrIHZpYSBKYXZhc2NyaXB0IHBvcHVwcy4KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiByZWZyZXNoRnJvbVJlZ2lzdHJ5KCkKLSAgewotICAgIGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyB1dWlkU2VydmljZUtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSk7Ci0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIFNlcnZpY2VEZXRhaWwgc2VydmljZURldGFpbCA9IHByb3h5LmdldF9zZXJ2aWNlRGV0YWlsKHV1aWRTZXJ2aWNlS2V5KTsKLSAgICAgIFZlY3RvciBidXNpbmVzc1NlcnZpY2VWZWN0b3IgPSBzZXJ2aWNlRGV0YWlsLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpOwotICAgICAgaWYgKGJ1c2luZXNzU2VydmljZVZlY3Rvci5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNULGJ1c2luZXNzU2VydmljZVZlY3Rvci5lbGVtZW50QXQoMCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBGZWVkYmFjayB2aWEgSmF2YXNjcmlwdCBwb3B1cHMuCi0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBGZWVkYmFjayB2aWEgSmF2YXNjcmlwdCBwb3B1cHMuCi0gICAgfQotICAgIGlzVXBkYXRlXyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFJlZ1B1Ymxpc2hUb29sIHNldHVwUmVnUHVibGlzaFRvb2woKQotICB7Ci0gICAgLy8gUHJlcGFyZSBmb3IgcmUtcHVibGlzaGluZyBhIG5vdy1zdGFsZSBzZXJ2aWNlIHdob3NlIGJ1c2luZXNzIGhhcyBhbHNvIGJlZW4gZWxpbWluYXRlZC4KLSAgICBSZWdQdWJsaXNoVG9vbCByZWdQdWJsaXNoVG9vbCA9IHJlZ05vZGVfLmdldFJlZ1B1Ymxpc2hUb29sKCk7Ci0gICAgcmVnUHVibGlzaFRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksIiIpOwotICAgIHJlZ1B1Ymxpc2hUb29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMpKTsKLSAgICByZWdQdWJsaXNoVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQpKTsKLSAgICAKLSAgICByZWdQdWJsaXNoVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwscHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCkpOwotICAgIAotICAgIFZlY3RvciBuYW1lTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgIFZlY3RvciBkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0gICAgVmVjdG9yIGNhdExpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMpOwotICAgIAotICAgIFZlY3RvciBuYW1lVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDtpPG5hbWVMaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KW5hbWVMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICBOYW1lIG5hbWUgPSAoTmFtZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgIG5hbWVWZWN0b3IuYWRkRWxlbWVudChuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gbnVsbDsKLSAgICBpZiAoZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3RvciAhPSBudWxsKQotICAgIHsKLSAgICAgIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yLmFkZEVsZW1lbnQoZGVzY3JpcHRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICByZWdQdWJsaXNoVG9vbC5yZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TKTsKLSAgICAKLSAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSBudWxsOwotICAgIGlmIChjYXRMaXN0RWxlbWVudFZlY3RvciAhPSBudWxsKQotICAgIHsKLSAgICAgIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0TGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpY2F0TGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgY2F0QmFnLmFkZChrcik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlZ1B1Ymxpc2hUb29sLnJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLSAgICAKLSAgICByZWdQdWJsaXNoVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMsbmFtZVZlY3Rvcik7Ci0gICAgaWYgKGRlc2NyaXB0aW9uVmVjdG9yICE9IG51bGwpCi0gICAgICByZWdQdWJsaXNoVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TLGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICBpZiAoY2F0QmFnICE9IG51bGwpCi0gICAgICByZWdQdWJsaXNoVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyxjYXRCYWcpOwotICAgIHJldHVybiByZWdQdWJsaXNoVG9vbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX0JVU0lORVNTKTsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0gICAgICBTdHJpbmcgdXVpZFNlcnZpY2VLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVkpOwotICAgICAgTGlzdEVsZW1lbnQgd3NkbFVSTExpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpOwotICAgICAgVmVjdG9yIG5hbWVMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyk7Ci0gICAgICBWZWN0b3IgZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpOwotICAgICAgVmVjdG9yIGNhdExpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMpOwotCi0gICAgICBTdHJpbmcgd3NkbFVSTCA9IChTdHJpbmcpd3NkbFVSTExpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgCi0gICAgICBWZWN0b3IgbmFtZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPG5hbWVMaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCluYW1lTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgbmFtZVZlY3Rvci5hZGRFbGVtZW50KG5hbWUpOwotICAgICAgfQotCi0gICAgICBWZWN0b3IgZGVzY3JpcHRpb25WZWN0b3IgPSBudWxsOwotICAgICAgaWYgKGRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVzY3JpcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICAgewotICAgICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yLmFkZEVsZW1lbnQoZGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IG51bGw7Ci0gICAgICBpZiAoY2F0TGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY2F0QmFnID0gbmV3IENhdGVnb3J5QmFnKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGNhdExpc3RFbGVtZW50VmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCljYXRMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgY2F0QmFnLmFkZChrcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgIAlyZWdFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLHVzZXJJZCxwYXNzd29yZCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0KLSAgICAgIC8vIE5vdGU6IFRoZSBKU1Agd2lsbCBwcmV2ZW50IHRoaXMgcm91dGluZSBmcm9tIGV4ZWN1dGluZyBpZiBiZSBpcyBudWxsLgotICAgICAgVWRkaTRqSGVscGVyIHVkZGk0akhlbHBlciA9IG5ldyBVZGRpNGpIZWxwZXIoKTsKLSAgICAgIERlZmluaXRpb24gZGVmID0gdWRkaTRqSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgICAgCi0gICAgICAvLyBQdWJsaXNoL3VwZGF0ZSB0aGUgc2VydmljZSBpbnRlcmZhY2VzIGZpcnN0LgotICAgICAgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24gcmVnUHVibGlzaFNJQWN0aW9uID0gbmV3IFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgIGludCBjdXJyZW50Tm9kZUlkID0gZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkuZ2V0Tm9kZUlkKCk7Ci0gICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHJlZ05vZGVfLmdldE5vZGVNYW5hZ2VyKCk7Ci0KLSAgICAgIEhhc2h0YWJsZSB0TW9kZWxzVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBUTW9kZWxbXSB0TW9kZWxzID0gbnVsbDsKLSAgICAgIGlmICh1ZGRpNGpIZWxwZXIuaXNNb25vbGl0aGljV1NETChkZWYpKQotICAgICAgewotICAgICAgCXRNb2RlbHMgPSBuZXcgVE1vZGVsWzFdOwotICAgICAgCXRNb2RlbHNbMF0gPSB1ZGRpNGpIZWxwZXIubmV3VE1vZGVsKHdzZGxVUkwsIGRlZik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJU3RyaW5nW10gaW1wb3J0cyA9IHVkZGk0akhlbHBlci5nZXRJbXBvcnRzKGRlZiwgd3NkbFVSTCk7Ci0gICAgICAJdE1vZGVscyA9IG5ldyBUTW9kZWxbaW1wb3J0cy5sZW5ndGhdOwotICAgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgdE1vZGVscy5sZW5ndGg7IGkrKykKLSAgICAgIAkgIHRNb2RlbHNbaV0gPSB1ZGRpNGpIZWxwZXIubmV3VE1vZGVsKGltcG9ydHNbaV0pOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAodE1vZGVscyAhPSBudWxsKQotICAgICAgewotICAgICAgCWZvciAoaW50IGk9MDtpPHRNb2RlbHMubGVuZ3RoO2krKykKLSAgICAgIAl7Ci0gICAgICAJICBib29sZWFuIGlucHV0c1ZhbGlkID0gcmVnUHVibGlzaFNJQWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZSh1ZGRpNGpIZWxwZXIuZ2V0V1NETCh0TW9kZWxzW2ldKSwgdE1vZGVsc1tpXSk7Ci0gICAgICAJICBpZiAoaW5wdXRzVmFsaWQpCi0gICAgICAJICB7Ci0gICAgICAJICAgIHJlZ1B1Ymxpc2hTSUFjdGlvbi5ydW4oKTsKLSAgICAgIAkgICAgT2JqZWN0IHNhdmVkVE1vZGVsID0gcmVnUHVibGlzaFNJQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKS5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9PVVRQVVRfU0FWRURfVE1PREVMKTsKLSAgICAgIAkgICAgaWYgKHNhdmVkVE1vZGVsICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAJICAgICAgdE1vZGVsc1RhYmxlLnB1dCgoKFRNb2RlbClzYXZlZFRNb2RlbCkuZ2V0TmFtZVN0cmluZygpLCBzYXZlZFRNb2RlbCk7Ci0gICAgICAJICAgIH0KLSAgICAgICAgICAgIC8vIFJlc2VsZWN0IHRoZSBjdXJyZW50IG5vZGUuCi0gICAgICAJICAgIG5vZGVNYW5hZ2VyLnNldFNlbGVjdGVkTm9kZUlkKGN1cnJlbnROb2RlSWQpOwotICAgICAgICAgIH0KLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEJ1c2luZXNzU2VydmljZSBidXNTZXJ2aWNlID0gdWRkaTRqSGVscGVyLm5ld0J1c2luZXNzU2VydmljZSh3c2RsVVJMLCBkZWYsIHRNb2RlbHNUYWJsZSk7Ci0gICAgICBpZiAoaXNVcGRhdGVfKQotICAgICAgICBidXNTZXJ2aWNlLnNldFNlcnZpY2VLZXkodXVpZFNlcnZpY2VLZXkpOwotICAgICAgYnVzU2VydmljZS5zZXRCdXNpbmVzc0tleShiZS5nZXRCdXNpbmVzc0tleSgpKTsKLSAgICAgIGJ1c1NlcnZpY2Uuc2V0TmFtZVZlY3RvcihuYW1lVmVjdG9yKTsKLSAgICAgIGJ1c1NlcnZpY2Uuc2V0RGVzY3JpcHRpb25WZWN0b3IoZGVzY3JpcHRpb25WZWN0b3IpOwotICAgICAgYnVzU2VydmljZS5zZXRDYXRlZ29yeUJhZyhjYXRCYWcpOwotICAgICAgcmVnRWxlbWVudC5oYW5kbGVQcmVJbnZvY2F0aW9uKGJ1c1NlcnZpY2UpOyAgICAgIAotICAgICAgVmVjdG9yIGJzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgYnNWZWN0b3IuYWRkKGJ1c1NlcnZpY2UpOwotICAgICAgYnVzU2VydmljZSA9IChCdXNpbmVzc1NlcnZpY2UpcHJveHkuc2F2ZV9zZXJ2aWNlKHJlZ0VsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgYnNWZWN0b3IpLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpLmdldCgwKTsKLSAgICAgIHJlZnJlc2hOb2RlKGJ1c1NlcnZpY2UpOwotICAgICAgaWYgKGlzVXBkYXRlXykKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfVVBEQVRFRCIsYnVzU2VydmljZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX1BVQkxJU0hFRCIsYnVzU2VydmljZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIldTRExFeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJUcmFuc3BvcnRFeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIixlKTsKLSAgICB9ICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlSW50ZXJmYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0MmEyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLklkZW50aWZpZXJCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbiBleHRlbmRzIFVwZGF0ZUFjdGlvbgotewotICBwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGVfOwotICBwdWJsaWMgVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLHRydWUpOwotICAgIGlzVXBkYXRlXyA9IHRydWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB1dWlkS2V5ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZKTsKLSAgICBTdHJpbmcgd3NkbFVSTE1vZGlmaWVkU3RhdGUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuV1NETF9VUkxfTU9ESUZJRUQpOwotICAgIFN0cmluZyB3c2RsVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsKLSAgICBTdHJpbmcgbmFtZU1vZGlmaWVkU3RhdGUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuTkFNRV9NT0RJRklFRCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25Nb2RpZmllZFN0YXRlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5ERVNDUklQVElPTl9NT0RJRklFRCk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25WaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkRFU0NSSVBUSU9OX1ZJRVdJRCk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25MYW5ndWFnZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT05fTEFOR1VBR0UpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTik7Ci0gICAgU3RyaW5nW10gaWRNb2RpZmllZFN0YXRlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5JREVOVElGSUVSX01PRElGSUVEKTsKLSAgICBTdHJpbmdbXSBpZFZpZXdJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuSURFTlRJRklFUl9WSUVXSUQpOwotICAgIFN0cmluZ1tdIGlkVHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9UWVBFKTsKLSAgICBTdHJpbmdbXSBpZEtleU5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGlkS2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX1ZBTFVFKTsKLSAgICBTdHJpbmdbXSBjYXRNb2RpZmllZFN0YXRlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5DQVRFR09SWV9NT0RJRklFRCk7Ci0gICAgU3RyaW5nW10gY2F0Vmlld0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5DQVRFR09SWV9WSUVXSUQpOwotICAgIFN0cmluZ1tdIGNhdFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX1RZUEUpOwotICAgIFN0cmluZ1tdIGNhdEtleU5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX1ZBTFVFKTsKLSAgICAKLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICAKLSAgICBpZiAodXVpZEtleSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVksdXVpZEtleSk7Ci0gICAgCi0gICAgaWYgKHdzZGxVUkxNb2RpZmllZFN0YXRlICE9IG51bGwgJiYgd3NkbFVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IHdzZGxVUkxMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwpOyAgICAgIAotICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKHdzZGxVUkxNb2RpZmllZFN0YXRlKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIGlmIChpc01vZGlmaWVkKQotICAgICAgICB3c2RsVVJMTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQod3NkbFVSTCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHdzZGxVUkwgPSAoU3RyaW5nKXdzZGxVUkxMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMLHdzZGxVUkxMaXN0RWxlbWVudCk7Ci0gICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVVSTCh3c2RsVVJMKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTCIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICAgCi0gICAgaWYgKG5hbWVNb2RpZmllZFN0YXRlICE9IG51bGwgJiYgbmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IG5hbWVMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YobmFtZU1vZGlmaWVkU3RhdGUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgaWYgKGlzTW9kaWZpZWQpCi0gICAgICAgIG5hbWVMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudChuYW1lKTsKLSAgICAgIGVsc2UKLSAgICAgICAgbmFtZSA9IChTdHJpbmcpbmFtZUxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSxuYW1lTGlzdEVsZW1lbnQpOwotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9OQU1FIikpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgICAgCi0gICAgSGFzaHRhYmxlIGxhbmd1YWdlSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBpZiAoZGVzY3JpcHRpb25Nb2RpZmllZFN0YXRlcyAhPSBudWxsICYmIGRlc2NyaXB0aW9uVmlld0lkcyAhPSBudWxsICYmIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzICE9IG51bGwgJiYgZGVzY3JpcHRpb25zICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG9sZERlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMpOwotICAgICAgVmVjdG9yIG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVNDUklQVElPTiIpOwotICAgICAgbGFuZ3VhZ2VIYXNoLmNsZWFyKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbnMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIERlc2NyaXB0aW9uIHVkZGk0akRlc2NyaXB0aW9uOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSxkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSk7Ci0gICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZ3VhZ2VIYXNoLmdldChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGxhbmd1YWdlSGFzaC5wdXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcoZGVzY3JpcHRpb25zW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBkZXNjcmlwdGlvblZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQoZGVzY3JpcHRpb25WaWV3SWRzW2ldKTsKLSAgICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKGRlc2NyaXB0aW9uTW9kaWZpZWRTdGF0ZXNbaV0pLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvblZpZXdJZCA9PSAtMSB8fCBpc01vZGlmaWVkKQotICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQodWRkaTRqRGVzY3JpcHRpb24pKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGREZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChkZXNjcmlwdGlvblZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IpOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyk7Ci0gICAgICAKLSAgICBpZiAoaWRNb2RpZmllZFN0YXRlcyAhPSBudWxsICYmIGlkVmlld0lkcyAhPSBudWxsICYmIGlkVHlwZXMgIT0gbnVsbCAmJiBpZEtleU5hbWVzICE9IG51bGwgJiYgaWRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Igb2xkSWRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTKTsKLSAgICAgIFZlY3RvciBuZXdJZExpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8aWRLZXlOYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShpZEtleU5hbWVzW2ldLGlkS2V5VmFsdWVzW2ldLGlkVHlwZXNbaV0pOwotICAgICAgICBpbnQgaWRWaWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGlkVmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihpZE1vZGlmaWVkU3RhdGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgaWYgKGlkVmlld0lkID09IC0xIHx8IGlzTW9kaWZpZWQpCi0gICAgICAgICAgbmV3SWRMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudChrcikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3SWRMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG9sZElkTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGlkVmlld0lkKSk7Ci0gICAgICB9Ci0gICAgICByZWluZGV4TGlzdEVsZW1lbnRWZWN0b3IobmV3SWRMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyxuZXdJZExpc3RFbGVtZW50VmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0gICAgICAKLSAgICBpZiAoY2F0TW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBjYXRWaWV3SWRzICE9IG51bGwgJiYgY2F0VHlwZXMgIT0gbnVsbCAmJiBjYXRLZXlOYW1lcyAhPSBudWxsICYmIGNhdEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBvbGRDYXRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMpOwotICAgICAgVmVjdG9yIG5ld0NhdExpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VHlwZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoY2F0S2V5TmFtZXNbaV0sY2F0S2V5VmFsdWVzW2ldLGNhdFR5cGVzW2ldKTsKLSAgICAgICAgaW50IGNhdFZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQoY2F0Vmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihjYXRNb2RpZmllZFN0YXRlc1tpXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChjYXRWaWV3SWQgPT0gLTEgfHwgaXNNb2RpZmllZCkKLSAgICAgICAgICBuZXdDYXRMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudChrcikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGRDYXRMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoY2F0Vmlld0lkKSk7Ci0gICAgICB9Ci0gICAgICByZWluZGV4TGlzdEVsZW1lbnRWZWN0b3IobmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyxuZXdDYXRMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyk7ICAgICAgICAgICAgCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVmcmVzaEZyb21SZWdpc3RyeSgpCi0gIHsKLSAgICBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXVpZEtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVkpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBUTW9kZWxEZXRhaWwgdE1vZGVsRGV0YWlsID0gcHJveHkuZ2V0X3RNb2RlbERldGFpbCh1dWlkS2V5KTsKLSAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSB0TW9kZWxEZXRhaWwuZ2V0VE1vZGVsVmVjdG9yKCk7Ci0gICAgICBpZiAodE1vZGVsVmVjdG9yLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QsdE1vZGVsVmVjdG9yLmVsZW1lbnRBdCgwKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIEZlZWRiYWNrIHZpYSBKYXZhc2NyaXB0IHBvcHVwcy4KLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIEZlZWRiYWNrIHZpYSBKYXZhc2NyaXB0IHBvcHVwcy4KLSAgICB9Ci0gICAgaXNVcGRhdGVfID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gICAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXVpZEtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVkpOyAgICAgIAotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICAgIExpc3RFbGVtZW50IHdzZGxVUkxMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICAgICBMaXN0RWxlbWVudCBuYW1lTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICBWZWN0b3IgZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TKTsKLSAgICAgIFZlY3RvciBpZExpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0gICAgICBWZWN0b3IgY2F0TGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMpOwotICAgICAgCi0gICAgICBTdHJpbmcgd3NkbFVSTCA9IChTdHJpbmcpd3NkbFVSTExpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpbmFtZUxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgCi0gICAgICBWZWN0b3IgZGVzY3JpcHRpb25WZWN0b3IgPSBudWxsOwotICAgICAgaWYgKGRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVzY3JpcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICAgewotICAgICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yLmFkZEVsZW1lbnQoZGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIElkZW50aWZpZXJCYWcgaWRCYWcgPSBudWxsOwotICAgICAgaWYgKGlkTGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWRCYWcgPSBuZXcgSWRlbnRpZmllckJhZygpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxpZExpc3RFbGVtZW50VmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClpZExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICBpZEJhZy5hZGQoa3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IG51bGw7Ci0gICAgICBpZiAoY2F0TGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY2F0QmFnID0gbmV3IENhdGVnb3J5QmFnKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGNhdExpc3RFbGVtZW50VmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCljYXRMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgY2F0QmFnLmFkZChrcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgVE1vZGVsIHRNb2RlbCA9IChuZXcgVWRkaTRqSGVscGVyKCkpLm5ld1RNb2RlbCh3c2RsVVJMKTsKLSAgICAgIGlmIChpc1VwZGF0ZV8pCi0gICAgICAgIHRNb2RlbC5zZXRUTW9kZWxLZXkodXVpZEtleSk7Ci0gICAgICB0TW9kZWwuc2V0TmFtZShuYW1lKTsgICAgICAKLSAgICAgIHRNb2RlbC5zZXREZXNjcmlwdGlvblZlY3RvcihkZXNjcmlwdGlvblZlY3Rvcik7Ci0gICAgICB0TW9kZWwuc2V0SWRlbnRpZmllckJhZyhpZEJhZyk7Ci0gICAgICB0TW9kZWwuc2V0Q2F0ZWdvcnlCYWcoY2F0QmFnKTsKLSAgICAgIAotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgICAgICByZWdFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLHVzZXJJZCxwYXNzd29yZCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBWZWN0b3IgdE1vZGVsVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgdE1vZGVsVmVjdG9yLmFkZCh0TW9kZWwpOwotICAgICAgdE1vZGVsID0gKFRNb2RlbClwcm94eS5zYXZlX3RNb2RlbChyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIHRNb2RlbFZlY3RvcikuZ2V0VE1vZGVsVmVjdG9yKCkuZ2V0KDApOwotICAgICAgcmVmcmVzaE5vZGUodE1vZGVsKTsKLSAgICAgIGlmIChpc1VwZGF0ZV8pICAgICAgCi0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9VUERBVEVEIix0TW9kZWwuZ2V0TmFtZVN0cmluZygpKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9QVUJMSVNIRUQiLHRNb2RlbC5nZXROYW1lU3RyaW5nKCkpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiV1NETEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2NvbnN0YW50cy9VRERJQWN0aW9uSW5wdXRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9jb25zdGFudHMvVURESUFjdGlvbklucHV0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWU2ZGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2NvbnN0YW50cy9VRERJQWN0aW9uSW5wdXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBVRERJQWN0aW9uSW5wdXRzCi17Ci0gIC8vIE9wZW5SZWdpc3RyeUFjdGlvbgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdJU1RSWV9OQU1FID0gInJlZ2lzdHJ5TmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUVVJUllfVVJMID0gImlucXVpcnlVUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1VSTCA9ICJwdWJsaXNoVVJMIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHSVNUUkFUSU9OX1VSTCA9ICJyZWdpc3RyYXRpb25VUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUyA9ICJjaGVja1VzZXJEZWZpbmVkQ2F0ZWdvcmllcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVERElfVVNFUk5BTUUgPSAidWRkaVVzZXJuYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVURESV9QQVNTV09SRCA9ICJ1ZGRpUGFzc3dvcmQiOwotCi0gIC8vIEZpeGVkIGFuZCB1c2VyLWRlZmluZWQgY2F0ZWdvcmllcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTX0RJUkVDVE9SWSA9ICJjYXRlZ29yaWVzRGlyZWN0b3J5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfVE1PREVMX0tFWSA9ICJjYXRlZ29yeVRNb2RlbEtleSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0ZJTEVOQU1FID0gImNhdGVnb3J5RmlsZU5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFRklORURfQ0FURUdPUklFUyA9ICJ1c2VyRGVmaW5lZENhdGVnb3JpZXMiOwotCi0gIC8vIERpc2NvdmVyeSBVUkwgdXNlIHR5cGUKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ09WRVJZX1VSTF9UWVBFID0gImJ1c2luZXNzRW50aXR5IjsKLQotICAvLyBSZXN1bHRzIChOT0RFSUQpCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVJRF9TRVJWSUNFX0lOVEVSRkFDRSA9ICJub2RlSWRfU2VydmljZUludGVyZmFjZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVJRF9TRVJWSUNFID0gIm5vZGVJZF9TZXJ2aWNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERUlEX0JVU0lORVNTID0gIm5vZGVJZF9CdXNpbmVzcyI7Ci0KLSAgLy8gUmVnRmluZC4uQWN0aW9ucy9SZWdQdWJsaXNoLi5BY3Rpb25zCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFID0gIm92ZXJyaWRlQWRkUXVlcnlOb2RlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTkFNRSA9ICJxdWVyeU5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JVEVNID0gInF1ZXJ5SXRlbSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVJZX0lURU1fUVVFUklFUyA9IC0xOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVSWV9JVEVNX0JVU0lORVNTRVMgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVSWV9JVEVNX1NFUlZJQ0VTID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVSWV9TVFlMRV9TSU1QTEUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVSWV9TVFlMRV9BRFZBTkNFRCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVJZX1NUWUxFX1VVSUQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9PV05FRCA9ICJhZHZhbmNlZE93bmVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwgPSAiYWR2YW5jZWRQdWJsaXNoVVJMIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEID0gImFkdmFuY2VkVXNlcklkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQgPSAiYWR2YW5jZWRQYXNzd29yZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UgPSAiYWR2YW5jZWROYW1lTGFuZ3VhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FID0gImFkdmFuY2VkTmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfVFlQRSA9ICJhZHZhbmNlZElkZW50aWZpZXJUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfTkFNRSA9ICJhZHZhbmNlZElkZW50aWZpZXJLZXlOYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfVkFMVUUgPSAiYWR2YW5jZWRJZGVudGlmaWVyS2V5VmFsdWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFID0gImFkdmFuY2VkQ2F0ZWdvcnlUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUgPSAiYWR2YW5jZWRDYXRlZ29yeUtleU5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfVkFMVUUgPSAiYWR2YW5jZWRDYXRlZ29yeUtleVZhbHVlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfRElTQ09WRVJZVVJMID0gImFkdmFuY2VkRGlzY292ZXJ5VVJMIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfRklORFFVQUxJRklFUiA9ICJhZHZhbmNlZEZpbmRRdWFsaWZpZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TT1JUX0JZX05BTUUgPSAiYWR2YW5jZWRTb3J0QnlOYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU09SVF9CWV9EQVRFID0gImFkdmFuY2VkU29ydEJ5RGF0ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9TRUFSQ0hfU0VUID0gImFkdmFuY2VkTWF4U2VhcmNoU2V0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFUllfTUFYX1NFQVJDSF9TRVQgPSAxMDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9SRVNVTFRTID0gImFkdmFuY2VkTWF4UmVzdWx0cyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVJZX01BWF9SRVNVTFRTID0gMTA7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfU1RZTEVfQlVTSU5FU1NFUyA9ICJxdWVyeVN0eWxlQnVzaW5lc3NlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FID0gInNpbXBsZUJ1c2luZXNzTmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX09XTkVEID0gImFkdmFuY2VkQnVzaW5lc3NPd25lZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTID0gImFkdmFuY2VkQnVzaW5lc3NOYW1lcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTID0gImFkdmFuY2VkQnVzaW5lc3NJZGVudGlmaWVycyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMgPSAiYWR2YW5jZWRCdXNpbmVzc0NhdGVnb3JpZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTID0gImFkdmFuY2VkQnVzaW5lc3NEaXNjb3ZlcnlVUkxzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfU0VSVklDRV9JTlRFUkZBQ0VTID0gImFkdmFuY2VkQnVzaW5lc3NTZXJ2aWNlSW50ZXJmYWNlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZID0gImFkdmFuY2VkQnVzaW5lc3NTZXJ2aWNlSW50ZXJmYWNlc0NvcHkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19UTU9ERUxCQUcgPSAiYWR2YW5jZWRCdXNpbmVzc1RNb2RlbEJhZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0ZJTkRRVUFMSUZJRVJTID0gImFkdmFuY2VkQnVzaW5lc3NGaW5kUXVhbGlmaWVycyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9TRUFSQ0hfU0VUID0gImFkdmFuY2VkQnVzaW5lc3NNYXhTZWFyY2hTZXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfUkVTVUxUUyA9ICJhZHZhbmNlZEJ1c2luZXNzTWF4UmVzdWx0cyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfU1RZTEVfU0VSVklDRVMgPSAicXVlcnlTdHlsZVNlcnZpY2VzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSA9ICJzaW1wbGVTZXJ2aWNlTmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfT1dORUQgPSAiYWR2YW5jZWRTZXJ2aWNlT3duZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTID0gImFkdmFuY2VkU2VydmljZUJ1c2luZXNzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU19DT1BZID0gImFkdmFuY2VkU2VydmljZUJ1c2luZXNzQ29weSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUiA9ICJhZHZhbmNlZFNlcnZpY2VTZXJ2aWNlUHJvdmlkZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTID0gImFkdmFuY2VkU2VydmljZU5hbWVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTID0gImFkdmFuY2VkU2VydmljZUNhdGVnb3JpZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyA9ICJhZHZhbmNlZFNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFkgPSAiYWR2YW5jZWRTZXJ2aWNlU2VydmljZUludGVyZmFjZXNDb3B5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9UTU9ERUwgPSAiYWR2YW5jZWRTZXJ2aWNlVE1vZGVsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9UTU9ERUxCQUcgPSAiYWR2YW5jZWRTZXJ2aWNlVE1vZGVsQmFnIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9GSU5EUVVBTElGSUVSUyA9ICJhZHZhbmNlZFNlcnZpY2VGaW5kUXVhbGlmaWVycyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTUFYX1NFQVJDSF9TRVQgPSAiYWR2YW5jZWRTZXJ2aWNlTWF4U2VhcmNoU2V0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfUkVTVUxUUyA9ICJhZHZhbmNlZFNlcnZpY2VNYXhSZXN1bHRzIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMgPSAicXVlcnlTdHlsZVNlcnZpY2VJbnRlcmZhY2VzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUgPSAic2ltcGxlU2VydmljZUludGVyZmFjZU5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9VU0VfU0VSVklDRSA9ICJhZHZhbmNlZFVzZVNlcnZpY2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZVNlcnZpY2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFX0NPUFkgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlU2VydmljZUNvcHkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9CVVNJTkVTU19TRVJWSUNFID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZUJ1c2luZXNzU2VydmljZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX09XTkVEID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZU93bmVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSA9ICJhZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VOYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlSWRlbnRpZmllcnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZUNhdGVnb3JpZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9GSU5EUVVBTElGSUVSUyA9ICJhZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VGaW5kUXVhbGlmaWVycyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9TRUFSQ0hfU0VUID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZU1heFNlYXJjaFNldCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9SRVNVTFRTID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZU1heFJlc3VsdHMiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfUkVHSVNUUllfTkFNRSA9ICJhZHZhbmNlZFJlZ2lzdHJ5TmFtZSI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfVVVJRF9LRVkgPSAidXVpZEtleSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZID0gInV1aWRCdXNpbmVzc0tleSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVkgPSAidXVpZFNlcnZpY2VLZXkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSA9ICJ1dWlkU2VydmljZUludGVyZmFjZUtleSI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9PVVRQVVRfU0FWRURfVE1PREVMID0gInNhdmVkVE1vZGVsIjsKLQotICAvLyBTdWIgUXVlcmllczoKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCUVVFUklFU19QUk9QRVJUSUVTID0gInN1YlF1ZXJpZXNQcm9wZXJ0aWVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCUVVFUllfS0VZID0gInN1YlF1ZXJ5S2V5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NVQlFVRVJZX0lOSVRJQVRFRCA9ICJuZXdTdWJRdWVyeUluaXRpYXRlZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19TVUJRVUVSWV9RVUVSWV9JVEVNID0gIm5ld1N1YlF1ZXJ5UXVlcnlJdGVtIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNURURfTk9ERUlEUyA9ICJzZWxlY3RlZE5vZGVJZHMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJRVUVSWV9MSVNUX0tFWSA9ICJzdWJRdWVyeUxpc3RLZXkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJRVUVSWV9MSVNUX0lURU1JRCA9ICJzdWJRdWVyeUxpc3RJdGVtSWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1JFU1VMVFNfVEFSR0VUID0gInNob3dSZXN1bHRzVGFyZ2V0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCUVVFUllfR0VUID0gInN1YlF1ZXJ5R2V0IjsKLQotICAvLyBSZWdQdWJsaXNoLi5BY3Rpb25zIChzb21lIGNvbnN0YW50cyBmcm9tIHRoZSBSZWdGaW5kLi4uQWN0aW9ucyB3aWxsIGJlIHJldXNlZC4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX0RFU0NSSVBUSU9OID0gInNpbXBsZUJ1c2luZXNzRGVzY3JpcHRpb24iOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFID0gImFkdmFuY2VkRGVzY3JpcHRpb25MYW5ndWFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OID0gImFkdmFuY2VkRGVzY3JpcHRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMgPSAiYWR2YW5jZWRCdXNpbmVzc0Rlc2NyaXB0aW9ucyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfV1NETF9VUkwgPSAid3NkbFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCA9ICJzaW1wbGVTZXJ2aWNlSW50ZXJmYWNlV1NETFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTiA9ICJzaW1wbGVTZXJ2aWNlSW50ZXJmYWNlRGVzY3JpcHRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCA9ICJhZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VXU0RMVVJMIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZURlc2NyaXB0aW9ucyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1MgPSAic2ltcGxlU2VydmljZUJ1c2luZXNzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSA9ICJzaW1wbGVTZXJ2aWNlQnVzaW5lc3NDb3B5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUiA9ICJzaW1wbGVTZXJ2aWNlU2VydmljZVByb3ZpZGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfV1NETF9VUkwgPSAic2ltcGxlU2VydmljZVdTRExVUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9ERVNDUklQVElPTiA9ICJzaW1wbGVTZXJ2aWNlRGVzY3JpcHRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMID0gImFkdmFuY2VkU2VydmljZVdTRExVUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyA9ICJhZHZhbmNlZFNlcnZpY2VEZXNjcmlwdGlvbnMiOwotCi0gIC8vIFdTREwgQnJvd3NlcgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUID0gInByb2plY3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1RZUEUgPSAid3NkbFR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0UgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU0RMX1RZUEVfU0VSVklDRSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1dFQlBST0pFQ1RfV1NETF9VUkwgPSAid2ViUHJvamVjdFdTRExVUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9GQVZPUklURV9XU0RMX1VSTCA9ICJmYXZvcml0ZVdTRExVUkwiOwotCi0gIC8vIERldGFpbHMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFURVNUX09CSkVDVCA9ICJsYXRlc3RPYmplY3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDT1ZFUllVUkxfTU9ESUZJRUQgPSAiZGlzY292ZXJ5VVJMTW9kaWZpZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDT1ZFUllVUkxfVklFV0lEID0gImRpc2NvdmVyeVVSTFZpZXdJZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfTU9ESUZJRUQgPSAibmFtZU1vZGlmaWVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9WSUVXSUQgPSAiYnVzaW5lc3NWaWV3SWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9NT0RJRklFRCA9ICJkZXNjcmlwdGlvbk1vZGlmaWVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fVklFV0lEID0gImRlc2NyaXB0aW9uVmlld0lkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUl9NT0RJRklFRCA9ICJpZGVudGlmaWVyTW9kaWZpZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSX1ZJRVdJRCA9ICJpZGVudGlmaWVyVmlld0lkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfTU9ESUZJRUQgPSAiY2F0ZWdvcnlNb2RpZmllZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1ZJRVdJRCA9ICJjYXRlZ29yeVZpZXdJZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfVVJMX01PRElGSUVEID0gIndzZGxVUkxNb2RpZmllZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQUNUSU9OID0gInB1Ymxpc2hBY3Rpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVRFU1RfQlVTSU5FU1MgPSAibGF0ZXN0QnVzaW5lc3MiOwotCi0gIC8vIFJlZnJlc2ggYWN0aW9uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfTk9ERSA9ICJyZWZyZXNoTm9kZSI7Ci0KLSAgLy8gTWFuYWdlIFB1Ymxpc2hlckFzc2VydGlvbnMKLSAgLy8gIlRvIiBtZWFucyBmcm9tIGFub3RoZXIgYnVzaW5lc3MgdG8gbXkgb3duaW5nIGJ1c2luZXNzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9UTyA9IDA7Ci0gIC8vICJGcm9tIiBtZWFucyBmcm9tIG15IG93bmluZyBidXNpbmVzcyB0byBhbm90aGVyIGJ1c2luZXNzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9GUk9NID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0FTU0VSVElPTlNfVklFV0lEID0gInB1Ymxpc2hlckFzc2VydGlvbnNWaWV3SWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVJfQVNTRVJUSU9OU19TRUxFQ1RFRF9CVVNfSUQgPSAicHVibGlzaGVyQXNzZXJ0aW9uc1NlbGVjdGVkQnVzSUQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVJfQVNTRVJUSU9OU19ESVJFQ1RJT04gPSAicHVibGlzaGVyQXNzZXJ0aW9uc0RpcmVjdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OUyA9ICJxdWVyeUlucHV0QWRkUHVibGlzaGVyQXNzZXJ0aW9ucyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OU19DT1BZID0gInF1ZXJ5SW5wdXRBZGRQdWJsaXNoZXJBc3NlcnRpb25zQ29weSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0VYSVNUSU5HX1BVQkxJU0hFUl9BU1NFUlRJT05TID0gInF1ZXJ5SW5wdXRFeGlzdGluZ1B1Ymxpc2hlckFzc2VydGlvbnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVJfQVNTRVJUSU9OU19UWVBFID0gInB1Ymxpc2hlckFzc2VydGlvbnNUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0FTU0VSVElPTlNfVFlQRV9QQVJFTlRfQ0hJTEQgPSAicGFyZW50LWNoaWxkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0FTU0VSVElPTlNfVFlQRV9QRUVSX1RPX1BFRVIgPSAicGVlci1wZWVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0FTU0VSVElPTlNfVFlQRV9JREVOVElUWSA9ICJpZGVudGl0eSI7Ci0KLSAgLy8gTWFuYWdlIFJlZmVyZW5jZWQgU2VydmljZXMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfUkVGRVJFTkNFRF9TRVJWSUNFUyA9ICJyZWZlcmVuY2VkU2VydmljZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TRVJWSUNFUyA9ICJzZXJ2aWNlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTiA9ICJtYW5hZ2VkUmVmZXJlbmNlZFNlcnZpY2VzT3BlcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OX0FERCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTl9SRU1PVkUgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX1NFUlZJQ0VfU0VMRUNUX1NUQVRFID0gInJlZmVyZW5jZWRTZXJ2aWNlU2VsZWN0U3RhdGUiOwotICAKLSAgLy8gUmVzaXplVURESUZyYW1lQWN0aW9uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCA9ICJmcmFtZXNldENvbHNQZXJzcGVjdGl2ZUNvbnRlbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSID0gImZyYW1lc2V0Um93c0FjdGlvbnNDb250YWluZXIiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvY29uc3RhbnRzL1VERElGcmFtZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9jb25zdGFudHMvVURESUZyYW1lTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwZmZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9jb25zdGFudHMvVURESUZyYW1lTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBVRERJRnJhbWVOYW1lcwotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQVZJR0FUT1JfQ09OVEFJTkVSID0gInVkZGlfbmF2aWdhdG9yX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BVklHQVRPUl9UT09MQkFSID0gInVkZGlfbmF2aWdhdG9yX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQVZJR0FUT1JfQ09OVEVOVCA9ICJ1ZGRpX25hdmlnYXRvcl9jb250ZW50IjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OU19DT05UQUlORVIgPSAidWRkaV9hY3Rpb25zX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfQ09OVEFJTkVSID0gInVkZGlfcHJvcGVydGllc19jb250YWluZXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX1RPT0xCQVIgPSAidWRkaV9wcm9wZXJ0aWVzX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX0NPTlRFTlQgPSAidWRkaV9wcm9wZXJ0aWVzX2NvbnRlbnQiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEFUVVNfQ09OVEFJTkVSID0gInVkZGlfc3RhdHVzX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRVU19UT09MQkFSID0gInVkZGlfc3RhdHVzX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEFUVVNfQ09OVEVOVCA9ICJ1ZGRpX3N0YXR1c19jb250ZW50IjsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SSUVTX1dPUktBUkVBID0gImNhdGVnb3JpZXNfd29ya2FyZWEiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SSUVTX1RPT0xCQVIgPSAiY2F0ZWdvcmllc190b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUklFU19DT05URU5UID0gImNhdGVnb3JpZXNfY29udGVudCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9jb25zdGFudHMvVURESU1vZGVsQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9jb25zdGFudHMvVURESU1vZGVsQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNDRmZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvY29uc3RhbnRzL1VERElNb2RlbENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFVERElNb2RlbENvbnN0YW50cwotewotICAvLyBSZWdpc3RyaWVzIHVuZGVyIFVERElNYWluLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUkVHSVNUUklFUyA9ICJyZWdpc3RyaWVzIjsKLQotICAvLyBFeGVjdXRlZCBRdWVyaWVzIGZvbGRlciB1bmRlciBhIHJlZ2lzdHJ5LgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUVVFUklFU19QQVJFTlQgPSAicXVlcmllc1BhcmVudCI7Ci0KLSAgLy8gUHVibGlzaGVkIEJ1c2luZXNzZXMgZm9sZGVyIHVuZGVyIGEgcmVnaXN0cnkuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9QVUJMSVNIRURfQlVTSU5FU1NFU19QQVJFTlQgPSAicHVibGlzaGVkQnVzaW5lc3Nlc1BhcmVudCI7Ci0KLSAgLy8gUHVibGlzaGVkIFNlcnZpY2VzIGZvbGRlciB1bmRlciBhIHJlZ2lzdHJ5LgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUFVCTElTSEVEX1NFUlZJQ0VTX1BBUkVOVCA9ICJwdWJsaXNoZWRTZXJ2aWNlc1BhcmVudCI7Ci0KLSAgLy8gUHVibGlzaGVkIFNlcnZpY2UgaW50ZXJmYWNlcyBmb2xkZXIgdW5kZXIgYSByZWdpc3RyeS4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1BVQkxJU0hFRF9TRVJWSUNFX0lOVEVSRkFDRVNfUEFSRU5UID0gInB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzUGFyZW50IjsKLQotICAvLyBRdWVyaWVzIHVuZGVyIHRoZSBRdWVyaWVzIGZvbGRlci4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1FVRVJJRVMgPSAicXVlcmllcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfUkVTVUxUUyA9ICJpbml0aWFsUmVzdWx0cyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1RZUEUgPSAicXVlcnlUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCUVVFUllfVFJBTlNGRVJfVEFSR0VUID0gInN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQiOwotCi0gIC8vIE9iamVjdHMgdW5kZXIgYSBRdWVyeSBub2RlLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUVVFUllfUkVTVUxUUyA9ICJxdWVyeVJlc3VsdHMiOwotCi0gIC8vIENhdGVnb3JpZXMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1NVQkNBVEVHT1JJRVMgPSAic3ViQ2F0ZWdvcmllcyI7Ci0KLSAgLy8gUHVibGlzaGVkIGl0ZW1zIGluc2lkZSB0aGUgUHVibGlzaGVkIGl0ZW1zIGZvbGRlci4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1BVQkxJU0hFRF9JVEVNUyA9ICJwdWJsaXNoZWRJdGVtcyI7Ci0KLSAgLy8gQnVzaW5lc3NlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19CVVNJTkVTU19PV05FRCA9ICJpc0J1c2luZXNzT3duZWQiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0Fic3RyYWN0VURESUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9BYnN0cmFjdFVERElFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MGIyMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0Fic3RyYWN0VURESUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVRERJRWxlbWVudCBleHRlbmRzIFRyZWVFbGVtZW50Ci17Ci0gIHB1YmxpYyBBYnN0cmFjdFVERElFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBUcmVlRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBnZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFRyZWVFbGVtZW50IGdldFBhcmVudEVsZW1lbnQoVHJlZUVsZW1lbnQgY2hpbGQpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gY2hpbGQuZ2V0RWxlbWVudHMoTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICBpZiAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHJldHVybiAoVHJlZUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFJlZ2lzdHJ5RWxlbWVudCBnZXRSZWdpc3RyeUVsZW1lbnQoKQotICB7Ci0gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWdpc3RyeUVsZW1lbnQpCi0gICAgICByZXR1cm4gKFJlZ2lzdHJ5RWxlbWVudCl0aGlzOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBUcmVlRWxlbWVudCBjaGlsZEVsZW1lbnQgPSB0aGlzOwotICAgICAgVHJlZUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGdldFBhcmVudEVsZW1lbnQoY2hpbGRFbGVtZW50KTsKLSAgICAgIHdoaWxlIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudCAhPSBjaGlsZEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVnaXN0cnlFbGVtZW50KQotICAgICAgICAgIHJldHVybiAoUmVnaXN0cnlFbGVtZW50KXBhcmVudEVsZW1lbnQ7Ci0gICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7Ci0gICAgICAgIHBhcmVudEVsZW1lbnQgPSBnZXRQYXJlbnRFbGVtZW50KGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQnVzaW5lc3NFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQnVzaW5lc3NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZmNjNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0J1c2luZXNzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLQotcHVibGljIGNsYXNzIEJ1c2luZXNzRWxlbWVudCBleHRlbmRzIEFic3RyYWN0VURESUVsZW1lbnQKLXsKLSAgcHJpdmF0ZSBCdXNpbmVzc0VudGl0eSBiZV87Ci0gIHByaXZhdGUgTGlzdE1hbmFnZXIgcHVibGlzaGVyQXNzZXJ0aW9uc187Ci0gIAotICBwdWJsaWMgQnVzaW5lc3NFbGVtZW50KEJ1c2luZXNzRW50aXR5IGJlLE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIoYmUuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSxtb2RlbCk7Ci0gICAgYmVfID0gYmU7Ci0gICAgc2V0S2V5KGJlXy5nZXRCdXNpbmVzc0tleSgpKTsKLSAgICBwdWJsaXNoZXJBc3NlcnRpb25zXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgQnVzaW5lc3NFbnRpdHkgZ2V0QnVzaW5lc3NFbnRpdHkoKQotICB7Ci0gICAgcmV0dXJuIGJlXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0QnVzaW5lc3NFbnRpdHkoQnVzaW5lc3NFbnRpdHkgYmUpCi0gIHsKLSAgICBiZV8gPSBiZTsKLSAgICBzZXRLZXkoYmVfLmdldEJ1c2luZXNzS2V5KCkpOwotICB9Ci0KLSAgcHVibGljIExpc3RNYW5hZ2VyIGdldFB1Ymxpc2hlckFzc2VydGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIHB1Ymxpc2hlckFzc2VydGlvbnNfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaGVyQXNzZXJ0aW9ucyhMaXN0TWFuYWdlciBsaXN0TWFuYWdlcikKLSAgewotICAgIHB1Ymxpc2hlckFzc2VydGlvbnNfID0gbGlzdE1hbmFnZXI7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQ2F0ZWdvcnlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQ2F0ZWdvcnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTFiMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0NhdGVnb3J5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIENhdGVnb3J5RWxlbWVudCBleHRlbmRzIEFic3RyYWN0VURESUVsZW1lbnQKLXsKLSAgcHJpdmF0ZSBLZXllZFJlZmVyZW5jZSBjYXRlZ29yeV87Ci0KLSAgcHVibGljIENhdGVnb3J5RWxlbWVudChTdHJpbmcgbmFtZSxLZXllZFJlZmVyZW5jZSBjYXRlZ29yeSxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIGNhdGVnb3J5XyA9IGNhdGVnb3J5OwotICAgIHNhdmVDYXRlZ29yeVByb3BlcnRpZXMoKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBzYXZlQ2F0ZWdvcnlQcm9wZXJ0aWVzKCkKLSAgewotICAgIGlmIChjYXRlZ29yeV8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcga2V5TmFtZSA9IGNhdGVnb3J5Xy5nZXRLZXlOYW1lKCk7Ci0gICAgICBpZiAoa2V5TmFtZSAhPSBudWxsKQotICAgICAgICBzZXROYW1lKGtleU5hbWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBLZXllZFJlZmVyZW5jZSBnZXRDYXRlZ29yeSgpCi0gIHsKLSAgICByZXR1cm4gY2F0ZWdvcnlfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lRm9yVHJlZSgpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgbmFtZUZvclRyZWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJbIik7Ci0gICAgbmFtZUZvclRyZWUuYXBwZW5kKGNhdGVnb3J5Xy5nZXRLZXlWYWx1ZSgpKS5hcHBlbmQoIl0gIikuYXBwZW5kKGNhdGVnb3J5Xy5nZXRLZXlOYW1lKCkpOwotICAgIHJldHVybiBuYW1lRm9yVHJlZS50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlQ2F0ZWdvcnkoU3RyaW5nIGtleU5hbWUsU3RyaW5nIGtleVZhbHVlLFN0cmluZyB0TW9kZWxLZXkpCi0gIHsKLSAgICBjYXRlZ29yeV8uc2V0S2V5TmFtZShrZXlOYW1lKTsKLSAgICBjYXRlZ29yeV8uc2V0S2V5VmFsdWUoa2V5VmFsdWUpOwotICAgIGNhdGVnb3J5Xy5zZXRUTW9kZWxLZXkodE1vZGVsS2V5KTsKLSAgICBzYXZlQ2F0ZWdvcnlQcm9wZXJ0aWVzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9DYXRlZ29yeU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQ2F0ZWdvcnlNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTRkMDdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9DYXRlZ29yeU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5IVE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215OwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIENhdGVnb3J5TW9kZWwgZXh0ZW5kcyBCYXNpY01vZGVsCi17Ci0gIHByaXZhdGUgU2VydmxldENvbnRleHQgYXBwbGljYXRpb25fOwotICBwcml2YXRlIFN0cmluZyBkZWZhdWx0RGF0YUZpbGVfOwotICBwcml2YXRlIEhhc2h0YWJsZSBjYXRlZ29yeUVsZW1lbnRzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY29sdW1uRGVsaW1pdGVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nRGVsaW1pdGVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2F0ZWdvcnlLZXlfOwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tlZF87Ci0gIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgdE1vZGVsS2V5XzsKLSAgcHJpdmF0ZSBUaHJvd2FibGUgZXJyb3JFeGNlcHRpb25fOwotICAKLSAgLy8gUmV0dXJuIGNvZGVzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgY2F0ZWdvcnkgZGF0YS4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QRVJBVElPTl9TVUNDRVNTRlVMID0gMHgwMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVSUk9SX0ZJTEUgPSAweDAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRVJST1JfU0VDVVJJVFkgPSAweDAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRVJST1JfRU5DT0RJTkcgPSAweDAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRVJST1JfSU8gPSAweDA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRVJST1JfQ0FURUdPUllfS0VZID0gMHgwNTsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRDb2x1bW5EZWxpbWl0ZXJfID0gIiMiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0U3RyaW5nRGVsaW1pdGVyXyA9ICJcIiI7Ci0gIAotICBwdWJsaWMgQ2F0ZWdvcnlNb2RlbCgpCi0gIHsKLSAgICBzdXBlcigiY2F0ZWdvcmllcyIpOwotICAgIGFwcGxpY2F0aW9uXyA9IG51bGw7Ci0JZGVmYXVsdERhdGFGaWxlXyA9IG51bGw7Ci0gICAgY29sdW1uRGVsaW1pdGVyXyA9IGRlZmF1bHRDb2x1bW5EZWxpbWl0ZXJfOwotICAgIHN0cmluZ0RlbGltaXRlcl8gPSBkZWZhdWx0U3RyaW5nRGVsaW1pdGVyXzsKLSAgICBjYXRlZ29yeUVsZW1lbnRzXyA9IG51bGw7Ci0gICAgY2F0ZWdvcnlLZXlfID0gbnVsbDsKLSAgICBjaGVja2VkXyA9IHRydWU7Ci0gICAgZGlzcGxheU5hbWVfID0gbnVsbDsKLSAgICB0TW9kZWxLZXlfID0gbnVsbDsKLSAgICBlcnJvckV4Y2VwdGlvbl8gPSBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogQ2F0ZWdvcnlNb2RlbHMgbG9hZCB0aGVpciBkYXRhIGZyb20gdGhlIGZpbGUgbmFtZWQgdmlhIHRoZQotICAgKiB7QGxpbmsgI3NldERlZmF1bHREYXRhRmlsZShTdHJpbmcpfSBtZXRob2QuIFRoZSBkYXRhIGZpbGUKLSAgICogbmFtZSBpcyBpbnRlcnByZXR0ZWQgYXMgZWl0aGVyIGEgcGh5c2ljYWwgcGF0aG5hbWUgb3IgYQotICAgKiBjb250ZXh0LXJvb3QgcmVsYXRpdmUgcGF0aG5hbWUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCi0gICAqIHNlcnZsZXQgY29udGV4dCBvciAiYXBwbGljYXRpb24iIGlzIG51bGwgKGRlZmF1bHQpIG9yIG5vdC4KLSAgICogQHBhcmFtIGFwcGxpY2F0aW9uIFRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LCBudWxsIGJ5IGRlZmF1bHQuCi0gICAqIFZhbHVlIGNhbiBiZSB0aGUgU2VydmxldENvbnRleHQgb2YgdGhlIFdTRXhwbG9yZXIgb3IgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNlcnZsZXRDb250ZXh0KFNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uKQotICB7Ci0JYXBwbGljYXRpb25fID0gYXBwbGljYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldERlZmF1bHREYXRhRmlsZShTdHJpbmcgZGVmYXVsdERhdGFGaWxlKQotICB7Ci0gICAgZGVmYXVsdERhdGFGaWxlXyA9IGRlZmF1bHREYXRhRmlsZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldENhdGVnb3J5S2V5KFN0cmluZyBjYXRlZ29yeUtleSkKLSAgewotICAgIGNhdGVnb3J5S2V5XyA9IGNhdGVnb3J5S2V5OwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldENhdGVnb3J5S2V5KCkKLSAgewotICAgIHJldHVybiBjYXRlZ29yeUtleV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldENvbHVtbkRlbGltaXRlcihTdHJpbmcgY29sdW1uRGVsaW1pdGVyKQotICB7Ci0gICAgY29sdW1uRGVsaW1pdGVyXyA9IGNvbHVtbkRlbGltaXRlcjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb2x1bW5EZWxpbWl0ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbkRlbGltaXRlcl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFN0cmluZ0RlbGltaXRlcihTdHJpbmcgc3RyaW5nRGVsaW1pdGVyKQotICB7Ci0gICAgc3RyaW5nRGVsaW1pdGVyXyA9IHN0cmluZ0RlbGltaXRlcjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdHJpbmdEZWxpbWl0ZXIoKQotICB7Ci0gICAgcmV0dXJuIHN0cmluZ0RlbGltaXRlcl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGVuYWJsZUNoZWNrZWQoYm9vbGVhbiBpc0NoZWNrZWQpCi0gIHsKLSAgICBjaGVja2VkXyA9IGlzQ2hlY2tlZDsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDaGVja2VkKCkKLSAgewotICAgIHJldHVybiBjaGVja2VkXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKQotICB7Ci0gICAgZGlzcGxheU5hbWVfID0gZGlzcGxheU5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGRpc3BsYXlOYW1lXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0VE1vZGVsS2V5KFN0cmluZyB0TW9kZWxLZXkpCi0gIHsKLSAgICB0TW9kZWxLZXlfID0gdE1vZGVsS2V5OwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRNb2RlbEtleSgpCi0gIHsKLSAgICByZXR1cm4gdE1vZGVsS2V5XzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEYXRhTG9hZGVkKCkKLSAgewotICAgIHJldHVybiAoY2F0ZWdvcnlFbGVtZW50c18gIT0gbnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBUaHJvd2FibGUgZ2V0RXJyb3JFeGNlcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIGVycm9yRXhjZXB0aW9uXzsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRW5jbG9zZWRJblF1b3RlcyhTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIHN0cmluZy5zdGFydHNXaXRoKCJcIiIpICYmIHN0cmluZy5lbmRzV2l0aCgiXCIiKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGxvYWRGcm9tVGF4b25vbXkoVGF4b25vbXkgdGF4b25vbXkpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IHRheG9ub215LmdldE5hbWUoKTsKLSAgICBDYXRlZ29yeUVsZW1lbnQgcm9vdCA9IG5ldyBDYXRlZ29yeUVsZW1lbnQobmFtZSxudWxsLHRoaXMpOwotICAgIHNldFJvb3RFbGVtZW50KHJvb3QpOwotICAgIGNhdGVnb3J5RWxlbWVudHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSB0YXhvbm9teS5nZXRDYXRlZ29yeSgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgYWRkQ2F0ZWdvcnkocm9vdCwgKENhdGVnb3J5KWl0Lm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZENhdGVnb3J5KENhdGVnb3J5RWxlbWVudCBwYXJlbnQsIENhdGVnb3J5IGNhdGVnb3J5KQotICB7Ci0gICAgU3RyaW5nIGtleU5hbWUgPSBjYXRlZ29yeS5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIGtleVZhbHVlID0gY2F0ZWdvcnkuZ2V0Q29kZSgpOwotICAgIENhdGVnb3J5RWxlbWVudCBjaGlsZCA9IG5ldyBDYXRlZ29yeUVsZW1lbnQoa2V5TmFtZSxuZXcgS2V5ZWRSZWZlcmVuY2Uoa2V5TmFtZSxrZXlWYWx1ZSx0TW9kZWxLZXlfKSx0aGlzKTsKLSAgICBwYXJlbnQuY29ubmVjdChjaGlsZCxVRERJTW9kZWxDb25zdGFudHMuUkVMX1NVQkNBVEVHT1JJRVMsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICBjYXRlZ29yeUVsZW1lbnRzXy5wdXQoa2V5VmFsdWUsIGNoaWxkKTsgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2F0ZWdvcnkuZ2V0Q2F0ZWdvcnkoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIGFkZENhdGVnb3J5KGNoaWxkLCAoQ2F0ZWdvcnkpaXQubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYnl0ZSBsb2FkRnJvbURlZmF1bHREYXRhRmlsZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoZGVmYXVsdERhdGFGaWxlXyA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7Ci0JICBCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0JICBpZiAoYXBwbGljYXRpb25fID09IG51bGwpCi0JCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGRlZmF1bHREYXRhRmlsZV8pLEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKSk7Ci0JICBlbHNlCi0JICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihhcHBsaWNhdGlvbl8uZ2V0UmVzb3VyY2VBc1N0cmVhbShkZWZhdWx0RGF0YUZpbGVfKSxIVE1MVXRpbHMuVVRGOF9FTkNPRElORykpOwotICAgICAgcmV0dXJuIGxvYWREYXRhKGJyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGVycm9yRXhjZXB0aW9uXyA9IGU7Ci0gICAgICByZXR1cm4gRVJST1JfRklMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZXJyb3JFeGNlcHRpb25fID0gZTsKLSAgICAgIHJldHVybiBFUlJPUl9TRUNVUklUWTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuIEVSUk9SX0VOQ09ESU5HOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJ5dGUgbG9hZEZyb21EZWxpbWl0ZXJGaWxlKCkKLSAgewotICAgIC8vIEdldCB0aGUgYXNzb2NpYXRlZCAucHJvcGVydGllcyBmaWxlIGFuZCBzZXQgdGhlIGRlbGltaXRlcnMuIFRoZSBkZWZhdWx0RGF0YUZpbGVfIGlzIHNldCB0byB0aGUgZGVsaW1pdGVyIGZpbGUgaW4gdGhpcyBjYXNlLgotICAgIC8vIFRoZSBwcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBrZXlzOgotICAgIC8vIHdzYWQuZGF0YUZpbGUgLSBsb2NhdGlvbiBvZiB0aGUgY2F0ZWdvcnkgZGF0YSBmaWxlLgotICAgIC8vIHdzYWQuY2hlY2tlZCAtIHdoZXRoZXIgb3Igbm90IHRoZSBjYXRlZ29yeSBpcyBjaGVja2VkLgotICAgIC8vIHdzYWQubmFtZSAtIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNhdGVnb3J5LgotICAgIC8vIGNvbHVtbi5kZWxpbWl0ZXIgLSB0aGUgZGVsaW1pdGVyIGNoYXJhY3RlciB1c2VkIGZvciBzZXBhcmF0aW5nIGNvbHVtbnMuCi0gICAgLy8gc3RyaW5nLmRlbGltaXRlciAtIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyIHVzZWQgdG8gZW5jYXBzdWxhdGUgZGF0YSBzdWNoIHRoYXQgY29sdW1uIGRlbGltaXRlciBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIGRhdGEuCi0gICAgdHJ5Ci0gICAgewotICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgIElucHV0U3RyZWFtIGZpbiA9IG51bGw7Ci0JICBpZiAoYXBwbGljYXRpb25fID09IG51bGwpCi0JICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVmYXVsdERhdGFGaWxlXyk7Ci0JICBlbHNlCi0JCWZpbiA9IGFwcGxpY2F0aW9uXy5nZXRSZXNvdXJjZUFzU3RyZWFtKGRlZmF1bHREYXRhRmlsZV8pOwotICAgICAgcC5sb2FkKGZpbik7Ci0gICAgICBmaW4uY2xvc2UoKTsKLSAgICAgIGNvbHVtbkRlbGltaXRlcl8gPSBwLmdldFByb3BlcnR5KCJjb2x1bW4uZGVsaW1pdGVyIik7Ci0gICAgICBzdHJpbmdEZWxpbWl0ZXJfID0gcC5nZXRQcm9wZXJ0eSgic3RyaW5nLmRlbGltaXRlciIpOwotICAgICAgZGVmYXVsdERhdGFGaWxlXyA9IHAuZ2V0UHJvcGVydHkoIndzYWQuZGF0YUZpbGUiKTsKLSAgICAgIHJldHVybiBsb2FkRnJvbURlZmF1bHREYXRhRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZXJyb3JFeGNlcHRpb25fID0gZTsKLSAgICAgIHJldHVybiBFUlJPUl9GSUxFOwotICAgIH0KLSAgICBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuIEVSUk9SX1NFQ1VSSVRZOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0gICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYnl0ZSBsb2FkRGF0YShCdWZmZXJlZFJlYWRlciBicikKLSAgewotICAgIGVycm9yRXhjZXB0aW9uXyA9IG51bGw7Ci0gICAgQ2F0ZWdvcnlFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKLSAgICBjYXRlZ29yeUVsZW1lbnRzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBieXRlIHJldHVybkNvZGUgPSBPUEVSQVRJT05fU1VDQ0VTU0ZVTDsKLSAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgaW50IGxpbmVOdW1iZXIgPSAwOwotICAgIHRyeQotICAgIHsKLSAgICAgIGNoYXIgY29sdW1uRGVsaW1pdGVyQ2hhciA9IGNvbHVtbkRlbGltaXRlcl8uY2hhckF0KDApOwotICAgICAgY2hhciBzdHJpbmdEZWxpbWl0ZXJDaGFyID0gc3RyaW5nRGVsaW1pdGVyXy5jaGFyQXQoMCk7Ci0gICAgICBWZWN0b3IgdmFsdWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgd2hpbGUoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaW5lTnVtYmVyKys7Ci0gICAgICAgIC8vIElnbm9yZSBibGFuayBsaW5lcy4KLSAgICAgICAgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBsZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotICAgICAgICBib29sZWFuIGluU3RyaW5nRGVsaW1pdGVycyA9IGZhbHNlOwotICAgICAgICB2YWx1ZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGN1cnJlbnRUb2tlbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IGxpbmUuY2hhckF0KGluZGV4KTsKLSAgICAgICAgICBpZiAoaW5TdHJpbmdEZWxpbWl0ZXJzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEluIHF1b3RlIHNvIGlnbm9yaW5nIGRlbGltaXRlcnMKLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSBzdHJpbmdEZWxpbWl0ZXJDaGFyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggLSAxKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY3VycmVudENoYXIgY291bGQgYmUgYSBjbG9zaW5nIHN0cmluZyBkZWxpbWl0ZXIgb3IgZXNjYXBlCi0gICAgICAgICAgICAgICAgLy8gTmVlZCB0byBsb29rIGFoZWFkIHRvIGJlIHN1cmUuLi4KLSAgICAgICAgICAgICAgICBjaGFyIGZvbGxvd2luZ0NoYXIgPSBsaW5lLmNoYXJBdChpbmRleCArIDEpOwotICAgICAgICAgICAgICAgIGlmIChmb2xsb3dpbmdDaGFyID09IHN0cmluZ0RlbGltaXRlckNoYXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXNjYXBlZCBxdW90ZQotICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLmFwcGVuZChzdHJpbmdEZWxpbWl0ZXJDaGFyKTsKLSAgICAgICAgICAgICAgICAgIC8vIGp1bXAgZm9yd2FyZCB0d28gY2hhcmFjdGVycy4KLSAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBUaGVyZSB3YXMgYSBjbG9zaW5nIHN0cmluZyBkZWxpbWl0ZXIuLi5qdW1wIGZvcndhcmQgdG8gdGhlIG5leHQgZGVsaW1pdGVyCi0gICAgICAgICAgICAgICAgICBpblN0cmluZ0RlbGltaXRlcnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIC8vbG9vayBmb3IgdGhlIG5leHQgY29sdW1uIGRlbGltaXRlciBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgIGludCBuZXh0RGVsaW1pdGVyID0gbGluZS5pbmRleE9mKGNvbHVtbkRlbGltaXRlckNoYXIsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgIGlmIChuZXh0RGVsaW1pdGVyID09IC0xKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSB3ZXJlIG5vIG1vcmUgZGVsaW1pdGVycyBzbyBicmVhayBvdXQgb2YgdGhlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGRFbGVtZW50KGN1cnJlbnRUb2tlbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy92YWx1ZXNbdG9rZW5Db3VudCsrXSA9IGN1cnJlbnRUb2tlbi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICBpblN0cmluZ0RlbGltaXRlcnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBuZXh0RGVsaW1pdGVyICsgMTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgYW5kIGl0J3MgYSBjbG9zaW5nIHN0cmluZyBkZWxpbWl0ZXIuCi0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpblN0cmluZ0RlbGltaXRlcnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uYXBwZW5kKGN1cnJlbnRDaGFyKTsKLSAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY3VycmVudENoYXIgPT0gY29sdW1uRGVsaW1pdGVyQ2hhcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGVyZSB3YXMgYSBkZWxpbWl0ZXIgb3V0c2lkZSBvZiBxdW90ZXMKLSAgICAgICAgICAgIHZhbHVlcy5hZGRFbGVtZW50KGN1cnJlbnRUb2tlbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIC8vdmFsdWVzW3Rva2VuQ291bnQrK10gPSBjdXJyZW50VG9rZW4udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChjdXJyZW50Q2hhciA9PSBzdHJpbmdEZWxpbWl0ZXJDaGFyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEEgcXVvdGUgYXBwZWFyaW5nIG91dHNpZGUgb2YgcXVvdGVzIG11c3QgYmUgYSBvcGVuaW5nIHF1b3RlCi0gICAgICAgICAgICBpblN0cmluZ0RlbGltaXRlcnMgPSB0cnVlOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgbm9ybWFsIGNoYXIgb3V0c2lkZSBvZiBxdW90ZXMKLSAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5hcHBlbmQoY3VycmVudENoYXIpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRXhwZWN0IHRva2VuIGNvdW50IHRvIGJlIHZhbHVlcy5sZW5ndGggLSAxIGF0IHRoaXMgcG9pbnQgaWYgZXZlcnl0aGluZyBpcyBvawotICAgICAgICBpZiAoaW5TdHJpbmdEZWxpbWl0ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24obGluZSxsaW5lTnVtYmVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRoZSBmaW5hbCB0b2tlbi4KLSAgICAgICAgdmFsdWVzLmFkZEVsZW1lbnQoY3VycmVudFRva2VuLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIDMgY29sdW1ucyBmb3JtYXQuIEZyb20gbGVmdCB0byByaWdodCwgdGhlc2UgYXJlOgotICAgICAgICAvLyAxKSBjYXRlZ29yeSdzIGtleSB2YWx1ZQotICAgICAgICAvLyAyKSBjYXRlZ29yeSdzIGtleSBuYW1lCi0gICAgICAgIC8vIDMpIGNhdGVnb3J5J3MgcGFyZW50IGtleSB2YWx1ZQotICAgICAgICAvLyBDb252ZXJ0IHRvIDQgY29sdW1ucyBmb3JtYXQuCi0gICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2F0ZWdvcnlLZXlfICE9IG51bGwpCi0gICAgICAgICAgICB2YWx1ZXMuaW5zZXJ0RWxlbWVudEF0KGNhdGVnb3J5S2V5XywgMCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFsdWVzLmluc2VydEVsZW1lbnRBdCh0TW9kZWxLZXlfLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDQgY29sdW1ucyBmb3JtYXQuIEZyb20gbGVmdCB0byByaWdodCwgdGhlc2UgYXJlOgotICAgICAgICAvLyAxKSB0eXBlIG9mIGNhdGVnb3J5IChjYXRlZ29yeUtleSkKLSAgICAgICAgLy8gMikgY2F0ZWdvcnkncyBrZXkgdmFsdWUKLSAgICAgICAgLy8gMykgY2F0ZWdvcnkncyBrZXkgbmFtZQotICAgICAgICAvLyA0KSBjYXRlZ29yeSdzIHBhcmVudCBrZXkgdmFsdWUKLSAgICAgICAgaWYgKHZhbHVlcy5zaXplKCkgPT0gNCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjYXRlZ29yeUtleSA9IChTdHJpbmcpdmFsdWVzLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgICBpZiAoY2F0ZWdvcnlLZXlfID09IG51bGwpCi0gICAgICAgICAgICBjYXRlZ29yeUtleV8gPSBjYXRlZ29yeUtleTsKLSAgICAgICAgICBlbHNlIGlmICghY2F0ZWdvcnlLZXlfLmVxdWFscyhjYXRlZ29yeUtleSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGNhdGVnb3J5S2V5KTsKLSAgICAgICAgICBTdHJpbmcga2V5VmFsdWUgPSAoU3RyaW5nKXZhbHVlcy5lbGVtZW50QXQoMSk7Ci0gICAgICAgICAgU3RyaW5nIGtleU5hbWUgPSAoU3RyaW5nKXZhbHVlcy5lbGVtZW50QXQoMik7Ci0gICAgICAgICAgU3RyaW5nIHBhcmVudEtleVZhbHVlID0gKFN0cmluZyl2YWx1ZXMuZWxlbWVudEF0KDMpOwotICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJvb3RFbGVtZW50ID0gbmV3IENhdGVnb3J5RWxlbWVudChkaXNwbGF5TmFtZV8sbnVsbCx0aGlzKTsKLSAgICAgICAgICAgIHNldFJvb3RFbGVtZW50KHJvb3RFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlzRW5jbG9zZWRJblF1b3RlcyhrZXlOYW1lKSkKLSAgICAgICAgICAgIGtleU5hbWUgPSBrZXlOYW1lLnN1YnN0cmluZygxLGtleU5hbWUubGVuZ3RoKCktMSk7Ci0gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIENhdGVnb3J5RWxlbWVudCBhbHJlYWR5IGV4aXN0cy4gSWYgaXQgZG9lcywgcmVmcmVzaCB0aGUgQ2F0ZWdvcnkuCi0gICAgICAgICAgQ2F0ZWdvcnlFbGVtZW50IGNhdGVnb3J5RWxlbWVudCA9IChDYXRlZ29yeUVsZW1lbnQpY2F0ZWdvcnlFbGVtZW50c18uZ2V0KGtleVZhbHVlKTsKLSAgICAgICAgICBpZiAoY2F0ZWdvcnlFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICBjYXRlZ29yeUVsZW1lbnQudXBkYXRlQ2F0ZWdvcnkoa2V5TmFtZSxrZXlWYWx1ZSx0TW9kZWxLZXlfKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjYXRlZ29yeUVsZW1lbnQgPSBuZXcgQ2F0ZWdvcnlFbGVtZW50KGtleU5hbWUsbmV3IEtleWVkUmVmZXJlbmNlKGtleU5hbWUsa2V5VmFsdWUsdE1vZGVsS2V5XyksdGhpcyk7Ci0gICAgICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50OwotICAgICAgICAgIGlmIChwYXJlbnRLZXlWYWx1ZS5lcXVhbHMoa2V5VmFsdWUpKQotICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IHJvb3RFbGVtZW50OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCljYXRlZ29yeUVsZW1lbnRzXy5nZXQocGFyZW50S2V5VmFsdWUpOwotICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IG5ldyBDYXRlZ29yeUVsZW1lbnQoInRlbXAiLG5ldyBLZXllZFJlZmVyZW5jZSgiIixwYXJlbnRLZXlWYWx1ZSx0TW9kZWxLZXlfKSx0aGlzKTsKLSAgICAgICAgICAgIGNhdGVnb3J5RWxlbWVudHNfLnB1dChwYXJlbnRLZXlWYWx1ZSxwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jb25uZWN0KGNhdGVnb3J5RWxlbWVudCxVRERJTW9kZWxDb25zdGFudHMuUkVMX1NVQkNBVEVHT1JJRVMsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgICBjYXRlZ29yeUVsZW1lbnRzXy5wdXQoa2V5VmFsdWUsY2F0ZWdvcnlFbGVtZW50KTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24obGluZSxsaW5lTnVtYmVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnIuY2xvc2UoKTsKLSAgICAgIHJldHVybiByZXR1cm5Db2RlOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuQ29kZSA9IEVSUk9SX0lPOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuQ29kZSA9IEVSUk9SX0ZJTEU7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuQ29kZSA9IEVSUk9SX0NBVEVHT1JZX0tFWTsKLSAgICB9Ci0gICAgY2F0ZWdvcnlFbGVtZW50c18gPSBudWxsOwotICAgIHJldHVybiByZXR1cm5Db2RlOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHZvaWQgc2F2ZURhdGEoUHJpbnRXcml0ZXIgcHcsQ2F0ZWdvcnlFbGVtZW50IGNhdGVnb3J5RWxlbWVudCxDYXRlZ29yeUVsZW1lbnQgcGFyZW50RWxlbWVudCxib29sZWFuIGlzRmlyc3QpCi0gIHsKLSAgICAvLyBGaWxlIGZvcm1hdDoKLSAgICAvLyA8Y2F0ZWdvcnlLZXk+IzxrZXlWYWx1ZT4jPGtleU5hbWU+IzxwYXJlbnRLZXlWYWx1ZT4KLSAgICBLZXllZFJlZmVyZW5jZSBrciA9IGNhdGVnb3J5RWxlbWVudC5nZXRDYXRlZ29yeSgpOwotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgbm90IHRoZSByb290IGVsZW1lbnQuCi0gICAgaWYgKGtyICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGtleU5hbWUgPSBrci5nZXRLZXlOYW1lKCk7Ci0gICAgICBTdHJpbmcga2V5VmFsdWUgPSBrci5nZXRLZXlWYWx1ZSgpOwotICAgICAgU3RyaW5nIHBhcmVudEtleVZhbHVlOwotICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgcGFyZW50S2V5VmFsdWUgPSBrZXlWYWx1ZTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2UgcGFyZW50S3IgPSBwYXJlbnRFbGVtZW50LmdldENhdGVnb3J5KCk7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgaXMgdGhlIHJvb3QgZWxlbWVudC4KLSAgICAgICAgaWYgKHBhcmVudEtyID09IG51bGwpCi0gICAgICAgICAgcGFyZW50S2V5VmFsdWUgPSBrZXlWYWx1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBhcmVudEtleVZhbHVlID0gcGFyZW50S3IuZ2V0S2V5VmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGlmICghaXNGaXJzdCkKLSAgICAgICAgcHcucHJpbnRsbigpOwotICAgICAgZWxzZQotICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICBwdy5wcmludChtYW5nbGUoY2F0ZWdvcnlLZXlfKSk7Ci0gICAgICBwdy5wcmludChjb2x1bW5EZWxpbWl0ZXJfKTsKLSAgICAgIHB3LnByaW50KG1hbmdsZShrZXlWYWx1ZSkpOwotICAgICAgcHcucHJpbnQoY29sdW1uRGVsaW1pdGVyXyk7Ci0gICAgICBwdy5wcmludChtYW5nbGUoa2V5TmFtZSkpOwotICAgICAgcHcucHJpbnQoY29sdW1uRGVsaW1pdGVyXyk7Ci0gICAgICBwdy5wcmludChtYW5nbGUocGFyZW50S2V5VmFsdWUpKTsKLSAgICB9Ci0gICAgRW51bWVyYXRpb24gZSA9IGNhdGVnb3J5RWxlbWVudC5nZXRFbGVtZW50cyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1NVQkNBVEVHT1JJRVMpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgewotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHNhdmVEYXRhKHB3LChDYXRlZ29yeUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpLGNhdGVnb3J5RWxlbWVudCxpc0ZpcnN0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIE1hbmdsZSBhbiBpbnB1dCBzdHJpbmcgaWYgaXQgY29udGFpbnMgZGVmYXVsdCBjb2x1bW4gZGVsaW1pdGVyIGNoYXJhY3RlcnMgYnkgc3Vycm91bmRpbmcgaXQgd2l0aCB0aGUgc3RyaW5nIGRlbGltaXRlcnMuCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIG1hbmdsZShTdHJpbmcgaW5wdXQpCi0gIHsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5pbmRleE9mKGNvbHVtbkRlbGltaXRlcl8pICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcihpbnB1dCk7Ci0gICAgICBzLmluc2VydCgwLHN0cmluZ0RlbGltaXRlcl8pLmFwcGVuZChzdHJpbmdEZWxpbWl0ZXJfKTsKLSAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dDsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJ5dGUgc2F2ZURhdGEoU3RyaW5nIGZpbGVOYW1lKQotICB7Ci0gICAgLy8gVGhlIGZpbGVOYW1lIHNob3VsZCBhbHJlYWR5IGJlIFVSTEVuY29kZWQuCi0gICAgYnl0ZSByZXR1cm5Db2RlID0gT1BFUkFUSU9OX1NVQ0NFU1NGVUw7Ci0gICAgZXJyb3JFeGNlcHRpb25fID0gbnVsbDsKLSAgICBpZiAoaXNEYXRhTG9hZGVkKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpLEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKSx0cnVlKTsKLSAgICAgICAgQ2F0ZWdvcnlFbGVtZW50IHJvb3RFbGVtZW50ID0gKENhdGVnb3J5RWxlbWVudClnZXRSb290RWxlbWVudCgpOwotICAgICAgICBzYXZlRGF0YShwdyxyb290RWxlbWVudCxudWxsLHRydWUpOwotICAgICAgICBwdy5mbHVzaCgpOwotICAgICAgICBwdy5jbG9zZSgpOwotICAgICAgICAvLyBTYXZlIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0gICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHAuc2V0UHJvcGVydHkoIndzYWQuZGF0YUZpbGUiLGZpbGVOYW1lKTsKLSAgICAgICAgcC5zZXRQcm9wZXJ0eSgid3NhZC5jaGVja2VkIixTdHJpbmcudmFsdWVPZihjaGVja2VkXykpOwotICAgICAgICBwLnNldFByb3BlcnR5KCJ3c2FkLm5hbWUiLGRpc3BsYXlOYW1lXyk7Ci0gICAgICAgIHAuc2V0UHJvcGVydHkoImNvbHVtbi5kZWxpbWl0ZXIiLGNvbHVtbkRlbGltaXRlcl8pOwotICAgICAgICBwLnNldFByb3BlcnR5KCJzdHJpbmcuZGVsaW1pdGVyIixzdHJpbmdEZWxpbWl0ZXJfKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHByb3BlcnRpZXNGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZU5hbWUuc3Vic3RyaW5nKDAsZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSkpOwotICAgICAgICBwcm9wZXJ0aWVzRmlsZU5hbWUuYXBwZW5kKCIucHJvcGVydGllcyIpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHAuc3RvcmUoZm91dCxudWxsKTsKLSAgICAgICAgZm91dC5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgICByZXR1cm5Db2RlID0gRVJST1JfRklMRTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgICByZXR1cm5Db2RlID0gRVJST1JfU0VDVVJJVFk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgICByZXR1cm5Db2RlID0gRVJST1JfRU5DT0RJTkc7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZXJyb3JFeGNlcHRpb25fID0gZTsKLSAgICAgICAgcmV0dXJuQ29kZSA9IEVSUk9SX0lPOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuQ29kZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gZGlzcGxheU5hbWVfOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1B1Ymxpc2hlZEl0ZW1zRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1B1Ymxpc2hlZEl0ZW1zRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjRiMjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9QdWJsaXNoZWRJdGVtc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESU1vZGVsQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVkSXRlbXNFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RVRERJRWxlbWVudAotewotICBwdWJsaWMgUHVibGlzaGVkSXRlbXNFbGVtZW50KGludCB0eXBlLFN0cmluZyBuYW1lLE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCk7Ci0gICAgc2V0UHJvcGVydHlBc1N0cmluZyhNb2RlbENvbnN0YW50cy5SRUxfQ0hJTERSRU4sVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVMpOwotICAgIHNldFByb3BlcnR5QXNTdHJpbmcoVURESU1vZGVsQ29uc3RhbnRzLlFVRVJZX1RZUEUsU3RyaW5nLnZhbHVlT2YodHlwZSkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldFByb3BlcnR5QXNTdHJpbmcoVURESU1vZGVsQ29uc3RhbnRzLlFVRVJZX1RZUEUpKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRJdGVtcygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1B1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjN2Q2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYXNzZXJ0aW9uLlB1Ymxpc2hlckFzc2VydGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuS2V5ZWRSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50IHsKLQotICAvLyBvd25pbmdCdXNpbmVzc0tleV8gaXMgdGhlIGtleSBvZiB0aGUgYnVzaW5lc3MgZWxlbWVudCB0aGF0IG93bnMgdGhpcwotICAvLyBwdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50Ci0gIHByaXZhdGUgU3RyaW5nIGZyb21LZXlfOwotICBwcml2YXRlIFN0cmluZyB0b0tleV87Ci0gIHByaXZhdGUgU3RyaW5nIG93bmluZ0J1c2luZXNzS2V5XzsKLQotICAvLyB0aGUgb3RoZXIgYnVzaW5lc3MgdGhhdCB0aGUgY29udGFpbmluZyBidXNpbmVzcyBpcyBhc3NlcnRlZCBmcm9tIG9yIHRvCi0gIHByaXZhdGUgTGlzdEVsZW1lbnQgc3BfOwotICBwcml2YXRlIGludCBzdWJRdWVyeUl0ZW1JZF87Ci0KLSAgLy8gc3RhdHVzIG9mIHRoaXMgcHVibGlzaGVyQXNzZXJ0aW9uCi0gIHByaXZhdGUgU3RyaW5nIHN0YXR1c187Ci0gIHByaXZhdGUgS2V5ZWRSZWZlcmVuY2Uga2V5ZWRSZWZlcmVuY2VfOwotCi0gIHB1YmxpYyBQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50KFN0cmluZyBmcm9tS2V5LCBTdHJpbmcgdG9LZXksIFN0cmluZyBvd25pbmdCdXNpbmVzc0tleSwgTGlzdEVsZW1lbnQgc3AsIGludCBzdWJRdWVyeUl0ZW1JZCwgU3RyaW5nIHN0YXR1cywgS2V5ZWRSZWZlcmVuY2Uga2V5ZWRSZWYpIHsKLSAgICBmcm9tS2V5XyA9IGZyb21LZXk7Ci0gICAgdG9LZXlfID0gdG9LZXk7Ci0gICAgb3duaW5nQnVzaW5lc3NLZXlfID0gb3duaW5nQnVzaW5lc3NLZXk7Ci0gICAgc3BfID0gc3A7Ci0gICAgc3ViUXVlcnlJdGVtSWRfID0gc3ViUXVlcnlJdGVtSWQ7Ci0gICAgc3RhdHVzXyA9IHN0YXR1czsKLSAgICBrZXllZFJlZmVyZW5jZV8gPSBrZXllZFJlZjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZyb21LZXkoU3RyaW5nIGZyb21LZXkpIHsKLSAgICBmcm9tS2V5XyA9IGZyb21LZXk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZyb21LZXkoKSB7Ci0gICAgcmV0dXJuIGZyb21LZXlfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VG9LZXkoU3RyaW5nIHRvS2V5KSB7Ci0gICAgdG9LZXlfID0gdG9LZXk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRvS2V5KCkgewotICAgIHJldHVybiB0b0tleV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPd25pbmdCdXNpbmVzc0tleShTdHJpbmcga2V5KSB7Ci0gICAgb3duaW5nQnVzaW5lc3NLZXlfID0ga2V5OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRPd25pbmdCdXNpbmVzc0tleSgpIHsKLSAgICByZXR1cm4gb3duaW5nQnVzaW5lc3NLZXlfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb3ZpZGVyKExpc3RFbGVtZW50IHNwKSB7Ci0gICAgc3BfID0gc3A7Ci0gIH0KLQotICBwdWJsaWMgTGlzdEVsZW1lbnQgZ2V0U2VydmljZVByb3ZpZGVyKCkgewotICAgIHJldHVybiBzcF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTdWJRdWVyeUl0ZW1JZChpbnQgaWQpIHsKLSAgICBzdWJRdWVyeUl0ZW1JZF8gPSBpZDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0U3ViUXVlcnlJdGVtSWQoKSB7Ci0gICAgcmV0dXJuIHN1YlF1ZXJ5SXRlbUlkXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7Ci0gICAgc3RhdHVzXyA9IHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgewotICAgIHJldHVybiBzdGF0dXNfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0S2V5ZWRSZWYoS2V5ZWRSZWZlcmVuY2Uga2V5ZWRSZWYpIHsKLSAgICBrZXllZFJlZmVyZW5jZV8gPSBrZXllZFJlZjsKLSAgfQotCi0gIHB1YmxpYyBLZXllZFJlZmVyZW5jZSBnZXRLZXllZFJlZigpIHsKLSAgICByZXR1cm4ga2V5ZWRSZWZlcmVuY2VfOwotICB9Ci0KLSAgcHVibGljIFB1Ymxpc2hlckFzc2VydGlvbiBnZXRQdWJsaXNoZXJBc3NlcnRpb24oKSB7Ci0gICAgaWYgKGZyb21LZXlfID09IG51bGwgfHwKLSAgICAgICAgdG9LZXlfID09IG51bGwgfHwKLSAgICAgICAga2V5ZWRSZWZlcmVuY2VfID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIFB1Ymxpc2hlckFzc2VydGlvbiBwdWJBc3NlcnRpb24gPSBuZXcgUHVibGlzaGVyQXNzZXJ0aW9uKGZyb21LZXlfLCB0b0tleV8sIGtleWVkUmVmZXJlbmNlXyk7Ci0gICAgcmV0dXJuIHB1YkFzc2VydGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUXVlcnlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUXVlcnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YmVkNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1F1ZXJ5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESU1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeUVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFVERElFbGVtZW50Ci17Ci0gIHByaXZhdGUgZmluYWwgdm9pZCBpbml0UXVlcnlQcm9wZXJ0aWVzKGludCBpdGVtVHlwZSxPYmplY3RbXSByZXN1bHRzKQotICB7Ci0gICAgVmVjdG9yIHJlc3VsdHNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8cmVzdWx0cy5sZW5ndGg7aSsrKQotICAgICAgcmVzdWx0c1ZlY3Rvci5hZGRFbGVtZW50KHJlc3VsdHNbaV0pOwotICAgIHNldFByb3BlcnR5QXNTdHJpbmcoTW9kZWxDb25zdGFudHMuUkVMX0NISUxEUkVOLFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUllfUkVTVUxUUyk7Ci0gICAgc2V0UHJvcGVydHlBc09iamVjdChVRERJTW9kZWxDb25zdGFudHMuSU5JVElBTF9SRVNVTFRTLHJlc3VsdHNWZWN0b3IpOwotICAgIHNldFByb3BlcnR5QXNTdHJpbmcoVURESU1vZGVsQ29uc3RhbnRzLlFVRVJZX1RZUEUsU3RyaW5nLnZhbHVlT2YoaXRlbVR5cGUpKTsKLSAgfQotICAKLSAgcHVibGljIFF1ZXJ5RWxlbWVudChCdXNpbmVzc0VudGl0eVtdIHNwTGlzdCxTdHJpbmcgbmFtZSxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIGluaXRRdWVyeVByb3BlcnRpZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMsc3BMaXN0KTsKLSAgfQotCi0gIHB1YmxpYyBRdWVyeUVsZW1lbnQoQnVzaW5lc3NTZXJ2aWNlW10gYnNMaXN0LFN0cmluZyBuYW1lLE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCk7Ci0gICAgaW5pdFF1ZXJ5UHJvcGVydGllcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMsYnNMaXN0KTsKLSAgfQotCi0gIHB1YmxpYyBRdWVyeUVsZW1lbnQoVE1vZGVsW10gdE1vZGVsTGlzdCxTdHJpbmcgbmFtZSxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIGluaXRRdWVyeVByb3BlcnRpZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyx0TW9kZWxMaXN0KTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0UXVlcnlUeXBlKCkKLSAgewotICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldFByb3BlcnR5QXNTdHJpbmcoVURESU1vZGVsQ29uc3RhbnRzLlFVRVJZX1RZUEUpKTsKLSAgfQotCi0gIHB1YmxpYyBRdWVyeVBhcmVudEVsZW1lbnQgZ2V0UXVlcnlQYXJlbnRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiAoUXVlcnlQYXJlbnRFbGVtZW50KWdldFBhcmVudEVsZW1lbnQoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9RdWVyeVBhcmVudEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9RdWVyeVBhcmVudEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkODIyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUXVlcnlQYXJlbnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElNb2RlbENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFF1ZXJ5UGFyZW50RWxlbWVudCBleHRlbmRzIEFic3RyYWN0VURESUVsZW1lbnQKLXsKLSAgcHVibGljIFF1ZXJ5UGFyZW50RWxlbWVudChTdHJpbmcgbmFtZSxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIHNldFByb3BlcnR5QXNTdHJpbmcoTW9kZWxDb25zdGFudHMuUkVMX0NISUxEUkVOLFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUklFUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UXVlcmllcygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1JlZ2lzdHJ5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1JlZ2lzdHJ5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTIzZmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9SZWdpc3RyeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTM2NDQ5IGJydW5zc2VuQHVzLmlibS5jb20gLSBWaW5jZSBCcnVuc3NlbiAgCi0gKiAyMDA2MDkxMiAgIDE0MTc5NiBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5OZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuUmVnaXN0cnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5VRERJUmVnaXN0cnlTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQXV0aFRva2VuOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlZ2lzdHJ5RWxlbWVudCBleHRlbmRzIEFic3RyYWN0VURESUVsZW1lbnQKLXsKLSAgcHJpdmF0ZSBmaW5hbCBsb25nIEFVVEhfSU5GT19USU1FT1VUID0gMzAwMDAwMDsKLSAgcHJpdmF0ZSBVRERJUHJveHkgcHJveHlfOwotICBwcml2YXRlIGxvbmcgYXV0aFRva2VuVGltZXN0YW1wXzsKLSAgcHJpdmF0ZSBBdXRoVG9rZW4gYXV0aFRva2VuXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaWRfOwotICBwcml2YXRlIFN0cmluZyBwYXNzd29yZF87Ci0gIHByaXZhdGUgU3RyaW5nIGlucXVpcnlVUkxfOwotICBwcml2YXRlIFN0cmluZyBwdWJsaXNoVVJMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2FjaGVkUHVibGlzaFVSTF87Ci0gIHByaXZhdGUgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTF87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHVzZXJEZWZpbmVkQ2F0ZWdvcmllc187Ci0gIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllc187Ci0gIHByaXZhdGUgU3RyaW5nIGNhdGVnb3JpZXNEaXJlY3RvcnlfOwotCi0gIHB1YmxpYyBSZWdpc3RyeUVsZW1lbnQoVURESVByb3h5IHByb3h5LCBTdHJpbmcgaW5xdWlyeVVSTCwgU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHByb3h5XyA9IHByb3h5OwotICAgIGlucXVpcnlVUkxfID0gaW5xdWlyeVVSTDsKLSAgICBwdWJsaXNoVVJMXyA9IG51bGw7Ci0gICAgYXV0aFRva2VuVGltZXN0YW1wXyA9IC0xOwotICAgIGF1dGhUb2tlbl8gPSBudWxsOwotICAgIGlkXyA9IG51bGw7Ci0gICAgcGFzc3dvcmRfID0gbnVsbDsKLSAgICBjYWNoZWRQdWJsaXNoVVJMXyA9IG51bGw7Ci0gICAgcmVnaXN0cmF0aW9uVVJMXyA9IG51bGw7Ci0gICAgdXNlckRlZmluZWRDYXRlZ29yaWVzXyA9IG51bGw7Ci0gICAgY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXNfID0gZmFsc2U7Ci0gICAgY2F0ZWdvcmllc0RpcmVjdG9yeV8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFVERElQcm94eSBnZXRQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHlfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIHJldHVybiBpbnF1aXJ5VVJMXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBRdWVyeVBhcmVudEVsZW1lbnQgZ2V0UXVlcnlQYXJlbnRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiAoUXVlcnlQYXJlbnRFbGVtZW50KSAoZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTX1BBUkVOVCkubmV4dEVsZW1lbnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgUHVibGlzaGVkSXRlbXNFbGVtZW50IGdldFB1Ymxpc2hlZEJ1c2luZXNzZXNFbGVtZW50KCkKLSAgewotICAgIHJldHVybiAoUHVibGlzaGVkSXRlbXNFbGVtZW50KSAoZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfQlVTSU5FU1NFU19QQVJFTlQpLm5leHRFbGVtZW50KCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBnZXRQdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChQdWJsaXNoZWRJdGVtc0VsZW1lbnQpIChnZXRFbGVtZW50cyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9TRVJWSUNFU19QQVJFTlQpLm5leHRFbGVtZW50KCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBnZXRQdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlc0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChQdWJsaXNoZWRJdGVtc0VsZW1lbnQpIChnZXRFbGVtZW50cyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9TRVJWSUNFX0lOVEVSRkFDRVNfUEFSRU5UKS5uZXh0RWxlbWVudCgpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1Mb2dpbihTdHJpbmcgcHVibGlzaFVSTCwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uLCBVRERJRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgewotICAgIHB1Ymxpc2hVUkxfID0gcHVibGlzaFVSTDsKLSAgICBwcm94eV8uc2V0UHVibGlzaFVSTChOZXRVdGlscy5jcmVhdGVVUkwocHVibGlzaFVSTCkpOwotICAgIGF1dGhUb2tlbl8gPSBwcm94eV8uZ2V0X2F1dGhUb2tlbih1c2VySWQsIHBhc3N3b3JkKTsKLSAgICBhdXRoVG9rZW5UaW1lc3RhbXBfID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgaWRfID0gdXNlcklkOwotICAgIHBhc3N3b3JkXyA9IHBhc3N3b3JkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgcGVyZm9ybUxvZ291dCgpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sIFVERElFeGNlcHRpb24KLSAgewotICAgIHByb3h5Xy5kaXNjYXJkX2F1dGhUb2tlbihhdXRoVG9rZW5fLmdldEF1dGhJbmZvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBdXRoSW5mb1N0cmluZygpCi0gIHsKLSAgICBpZiAoIWlzTG9nZ2VkSW4oKSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIGlmICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBhdXRoVG9rZW5UaW1lc3RhbXBfKSA+IEFVVEhfSU5GT19USU1FT1VUKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBhdXRoVG9rZW5fID0gcHJveHlfLmdldF9hdXRoVG9rZW4oaWRfLCBwYXNzd29yZF8pOwotICAgICAgICBhdXRoVG9rZW5UaW1lc3RhbXBfID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhdXRoVG9rZW5fLmdldEF1dGhJbmZvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0xvZ2dlZEluKCkKLSAgewotICAgIHJldHVybiBhdXRoVG9rZW5fICE9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDYWNoZWRQdWJsaXNoVVJMKFN0cmluZyBwdWJsaXNoVVJMKQotICB7Ci0gICAgY2FjaGVkUHVibGlzaFVSTF8gPSBwdWJsaXNoVVJMOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkKLSAgewotICAgIGlmIChpc0xvZ2dlZEluKCkgJiYgcHVibGlzaFVSTF8gIT0gbnVsbCkKLSAgICAgIHJldHVybiBwdWJsaXNoVVJMXzsKLSAgICByZXR1cm4gY2FjaGVkUHVibGlzaFVSTF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSZWdpc3RyYXRpb25VUkwoU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCkKLSAgewotICAgIHJlZ2lzdHJhdGlvblVSTF8gPSByZWdpc3RyYXRpb25VUkw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpCi0gIHsKLSAgICByZXR1cm4gcmVnaXN0cmF0aW9uVVJMXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VXNlcklkKCkKLSAgewotICAgIHJldHVybiBpZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRVc2VySWQoU3RyaW5nIHVzZXJJZCkKLSAgewotICAgIGlkXyA9IHVzZXJJZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q3JlZCgpCi0gIHsKLSAgICByZXR1cm4gcGFzc3dvcmRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q3JlZChTdHJpbmcgY3JlZCkKLSAgewotICAgIHBhc3N3b3JkXyA9IGNyZWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoSGFzaHRhYmxlIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcykKLSAgewotICAgIHVzZXJEZWZpbmVkQ2F0ZWdvcmllc18gPSB1c2VyRGVmaW5lZENhdGVnb3JpZXM7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgRW51bWVyYXRpb24gZ2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKCkKLSAgewotICAgIGlmICh1c2VyRGVmaW5lZENhdGVnb3JpZXNfICE9IG51bGwpCi0gICAgICByZXR1cm4gdXNlckRlZmluZWRDYXRlZ29yaWVzXy5lbGVtZW50cygpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIENhdGVnb3J5TW9kZWwgZ2V0VXNlckRlZmluZWRDYXRlZ29yeShTdHJpbmcgdE1vZGVsS2V5KQotICB7Ci0gICAgcmV0dXJuIChDYXRlZ29yeU1vZGVsKSB1c2VyRGVmaW5lZENhdGVnb3JpZXNfLmdldCh0TW9kZWxLZXkpOwotICB9Ci0KLSAgLy8gU3BlY2lhbCBoYW5kbGVyIHRvIGJlIGludm9rZWQgYmVmb3JlIHNlbmRpbmcgYSBtZXNzYWdlIHRvIHRoZSByZWdpc3RyeS4KLSAgcHVibGljIGZpbmFsIHZvaWQgaGFuZGxlUHJlSW52b2NhdGlvbihCdXNpbmVzc1NlcnZpY2UgYnVzU2VydmljZSkKLSAgewotICAgIC8vIEZvciBYTWV0aG9kcywgYnVzaW5lc3Mgc2VydmljZXMgbXVzdCBjb250YWluIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm06Ci0gICAgLy8gSU1QTEVNRU5UQVRJT046IGlibXdzCi0gICAgaWYgKGdldElucXVpcnlVUkwoKS5lcXVhbHMoImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIikpCi0gICAgewotICAgICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gYnVzU2VydmljZS5nZXREZXNjcmlwdGlvblZlY3RvcigpOwotICAgICAgaWYgKGRlc2NyaXB0aW9uVmVjdG9yID09IG51bGwpCi0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgYm9vbGVhbiBjb250YWluc0ltcGxlbWVudGF0aW9uRGVzY3JpcHRpb24gPSBmYWxzZTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRpb25WZWN0b3Iuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKSBkZXNjcmlwdGlvblZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbi5nZXRUZXh0KCkuc3RhcnRzV2l0aCgiSU1QTEVNRU5UQVRJT046ICIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGFpbnNJbXBsZW1lbnRhdGlvbkRlc2NyaXB0aW9uID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFjb250YWluc0ltcGxlbWVudGF0aW9uRGVzY3JpcHRpb24pCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yLmFkZEVsZW1lbnQobmV3IERlc2NyaXB0aW9uKCJJTVBMRU1FTlRBVElPTjogaWJtd3MiKSk7Ci0gICAgICAgIGJ1c1NlcnZpY2Uuc2V0RGVzY3JpcHRpb25WZWN0b3IoZGVzY3JpcHRpb25WZWN0b3IpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldENoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzKGJvb2xlYW4gY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXMpCi0gIHsKLSAgICBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllc18gPSBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllczsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldENoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzKCkKLSAgewotICAgIHJldHVybiBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllc187Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXRlZ29yaWVzRGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpCi0gIHsKLSAgICBjYXRlZ29yaWVzRGlyZWN0b3J5XyA9IGRpcmVjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q2F0ZWdvcmllc0RpcmVjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gY2F0ZWdvcmllc0RpcmVjdG9yeV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoTWV0YSgpewotCSAgICAKLQkgIFJlZ2lzdHJ5U2VydmljZSByZWdTZXJ2aWNlID0gUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk7Ci0JICBJUmVnaXN0cnlNYW5hZ2VyIHJlZ01hbmFnZXIgPSByZWdTZXJ2aWNlLmdldERlZmF1bHRSZWdpc3RyeU1hbmFnZXIoKTsKLQkgIAotCSAgCi0JICB0cnkKLQkgIHsKLSAgICAJICByZWdNYW5hZ2VyLnJlZnJlc2hNYW5hZ2VyKCk7Ci0JCSAgU3RyaW5nW10gcmVnVVJJcyA9IHJlZ01hbmFnZXIuZ2V0UmVnaXN0cnlVUklzKCk7Ci0JCSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWdVUklzLmxlbmd0aDsgaSsrKQotCQkgIHsKLQkJCSAgUmVnaXN0cnkgcmVnID0gcmVnTWFuYWdlci5sb2FkUmVnaXN0cnkocmVnVVJJc1tpXSk7Ci0JCQkgIGlmIChyZWcgaW5zdGFuY2VvZiBVRERJUmVnaXN0cnkpCi0JCQkgIHsKLQkJCQkgIFVERElSZWdpc3RyeSB1ZGRpUmVnID0gKFVERElSZWdpc3RyeSlyZWc7Ci0JCQkJICBpZih1ZGRpUmVnLmdldERpc2NvdmVyeVVSTCgpLmVxdWFscyhnZXRJbnF1aXJ5VVJMKCkpKXsKLQkJCQkJICAKLQkJCQkJICAKLQkJCQkJIAotCQkJCQkgIFRheG9ub215W10gdGF4b25vbWllcyA9IHJlZ01hbmFnZXIubG9hZFRheG9ub21pZXMoVURESVJlZ2lzdHJ5U2VydmljZS5pbnN0YW5jZSgpLmdldFRheG9ub215VVJJcyh1ZGRpUmVnKSk7Ci0JCQkJCSAgaWYgKHRheG9ub21pZXMgIT0gbnVsbCkKLQkJCQkgICAgICAgIHsKLQkJCQkgICAgICAgICAgSGFzaHRhYmxlIHRheG9ub215VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQkJICAgICAgICAgIGZvciAoaW50IGo9MDsgajx0YXhvbm9taWVzLmxlbmd0aDsgaisrKQotCQkJCSAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgVGF4b25vbXkgdGF4b25vbXkgPSB0YXhvbm9taWVzW2pdOwotCQkJCSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdGF4b25vbXkuZ2V0TmFtZSgpOwotCQkJCSAgICAgICAgICAgIFN0cmluZyB0bW9kZWxLZXkgPSB0YXhvbm9teS5nZXRUbW9kZWxLZXkoKTsKLQkJCQkgICAgICAgICAgICBDYXRlZ29yeU1vZGVsIGNhdE1vZGVsID0gbmV3IENhdGVnb3J5TW9kZWwoKTsKLQkJCQkgICAgICAgICAgICBjYXRNb2RlbC5zZXREaXNwbGF5TmFtZShuYW1lKTsKLQkJCQkgICAgICAgICAgICBjYXRNb2RlbC5zZXRDYXRlZ29yeUtleShuYW1lKTsKLQkJCQkgICAgICAgICAgICBjYXRNb2RlbC5zZXRUTW9kZWxLZXkodG1vZGVsS2V5KTsKLQkJCQkgICAgICAgICAgICBjYXRNb2RlbC5sb2FkRnJvbVRheG9ub215KHRheG9ub215KTsKLQkJCQkgICAgICAgICAgICB0YXhvbm9teVRhYmxlLnB1dCh0bW9kZWxLZXksIGNhdE1vZGVsKTsKLQkJCQkgICAgICAgICAgfQotCQkJCSAgICAgICAgICAKLQkJCQkgICAgICAgICAgc2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKHRheG9ub215VGFibGUpOwotCQkJCSAgICAgICAgfSAgIAotCQkJCSAgfQotCQkgIAotCQkJICB9Ci0JICAKLQkJICB9Ci0JICB9Y2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0JICB7Ci0JCSAgLy8gVE9ETzogQmV0dGVyIGVycm9yIHJlcG9ydGluZwotCQkgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotCSAgfSAgCi0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9TZXJ2aWNlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1NlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMTBlMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1NlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RVRERJRWxlbWVudAotewotICBwcml2YXRlIEJ1c2luZXNzU2VydmljZSBic187Ci0gIAotICBwdWJsaWMgU2VydmljZUVsZW1lbnQoQnVzaW5lc3NTZXJ2aWNlIGJzLE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIoYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSxtb2RlbCk7Ci0gICAgc2V0S2V5KGJzLmdldFNlcnZpY2VLZXkoKSk7Ci0gICAgYnNfID0gYnM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBCdXNpbmVzc1NlcnZpY2UgZ2V0QnVzaW5lc3NTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBic187Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvU2VydmljZUludGVyZmFjZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9TZXJ2aWNlSW50ZXJmYWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgxNDJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9TZXJ2aWNlSW50ZXJmYWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RVRERJRWxlbWVudAotewotICBwcml2YXRlIFRNb2RlbCB0TW9kZWxfOwotICAgIAotICBwdWJsaWMgU2VydmljZUludGVyZmFjZUVsZW1lbnQoVE1vZGVsIHRNb2RlbCxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKHRNb2RlbC5nZXROYW1lU3RyaW5nKCksbW9kZWwpOwotICAgIHRNb2RlbF8gPSB0TW9kZWw7Ci0gICAgc2V0S2V5KHRNb2RlbC5nZXRUTW9kZWxLZXkoKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVE1vZGVsIGdldFRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gdE1vZGVsXzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9VRERJTWFpbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9VRERJTWFpbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3MmY2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvVURESU1haW5FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBVRERJTWFpbkVsZW1lbnQgZXh0ZW5kcyBUcmVlRWxlbWVudAotewotICBwcml2YXRlIEhhc2h0YWJsZSByZWdpc3RyeU5hbWVzXzsKLQotICBwdWJsaWMgVURESU1haW5FbGVtZW50KFN0cmluZyBuYW1lLE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCk7Ci0gICAgcmVnaXN0cnlOYW1lc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc1JlZ2lzdHJ5TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAocmVnaXN0cnlOYW1lc18uZ2V0KG5hbWUpICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgYWRkUmVnaXN0cnlOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmVnaXN0cnlOYW1lc18ucHV0KG5hbWUsQm9vbGVhbi5UUlVFKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZVJlZ2lzdHJ5TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJlZ2lzdHJ5TmFtZXNfLnJlbW92ZShuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyUmVnaXN0cnlOYW1lcygpCi0gIHsKLSAgICByZWdpc3RyeU5hbWVzXy5jbGVhcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9BZGRUb0Zhdm9yaXRlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0FkZFRvRmF2b3JpdGVzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQyMjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0FkZFRvRmF2b3JpdGVzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5TZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFRvRmF2b3JpdGVzVG9vbCBleHRlbmRzIEFjdGlvblRvb2wgewotICAgIHB1YmxpYyBBZGRUb0Zhdm9yaXRlc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZmF2b3JpdGVzX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9mYXZvcml0ZXNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIEFkZFRvRmF2b3JpdGVzQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0J1c1B1Ymxpc2hTZXJ2aWNlVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvQnVzUHVibGlzaFNlcnZpY2VUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmE2MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvQnVzUHVibGlzaFNlcnZpY2VUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0RmluZFRvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIEJ1c1B1Ymxpc2hTZXJ2aWNlVG9vbCBleHRlbmRzIEZvcm1Ub29sIGltcGxlbWVudHMgTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UKLXsKLSAgcHJpdmF0ZSBSZWdGaW5kVG9vbCByZWdGaW5kVG9vbF87Ci0KLSAgcHVibGljIEJ1c1B1Ymxpc2hTZXJ2aWNlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsInVkZGkvaW1hZ2VzL3B1Ymxpc2hfc2VydmljZV9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3B1Ymxpc2hfc2VydmljZV9oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gICAgcmVnRmluZFRvb2xfID0gbmV3IFJlZ0ZpbmRUb29sKG5ldyBUb29sTWFuYWdlcih0b29sTWFuYWdlci5nZXROb2RlKCkpLCAiIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKQotICB7Ci0gICAgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLQotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZLCIiKTsKLQotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMpKTsKLSAgICBTdHJpbmcgc2ltcGxlU3R5bGVTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0KLSAgICAvLyBSZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbiBpbnB1dHMKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1dTRExfVVJMLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUsIiIpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfREVTQ1JJUFRJT04sIiIpOwotCi0gICAgLy8gUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbiBpbnB1dHMKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwsIiIpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcmVnRWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSByZWdFbGVtZW50LmdldENyZWQoKTsKLQotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgaWYgKHVzZXJJZCA9PSBudWxsKQotICAgICAgdXNlcklkID0gIiI7Ci0gICAgaWYgKHBhc3N3b3JkID09IG51bGwpCi0gICAgICBwYXNzd29yZCA9ICIiOwotCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIHJlZ0ZpbmRUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGdldEZvcm1Ub29sUHJvcGVydGllcyhPYmplY3Qgc3ViUXVlcnlLZXlPYmplY3QpCi0gIHsKLSAgICAvLyBFbXB0eS9Ob24tZXhpc3RlbnQgc3VicXVlcnlrZXkgaW1wbGllcyBwdWJsaXNoIGZvcm0uIEFsbCBlbHNlIGltcGxpZXMgcXVlcnkgZm9ybS4KLSAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKXN1YlF1ZXJ5S2V5T2JqZWN0OwotICAgIGlmIChzdWJRdWVyeUtleSA9PSBudWxsIHx8IHN1YlF1ZXJ5S2V5Lmxlbmd0aCgpIDwgMSkKLSAgICAgIHJldHVybiB0aGlzOwotICAgIGVsc2UKLSAgICAgIHJldHVybiByZWdGaW5kVG9vbF8uZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5T2JqZWN0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKWdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICByZXR1cm4gU2VsZWN0RmluZFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxzdWJRdWVyeUtleSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgT2JqZWN0IHN1YlF1ZXJ5S2V5T2JqZWN0ID0gZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IG51bGw7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5T2JqZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSSUVTX1BST1BFUlRJRVMpOwotICAgICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHN1YlF1ZXJ5UHJvcGVydGllcyA9IGdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleU9iamVjdCk7Ci0gICAgICBPYmplY3Qgc3ViUXVlcnlHZXRPYmplY3QgPSBzdWJRdWVyeVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgICAgaWYgKHN1YlF1ZXJ5R2V0T2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNTdWJRdWVyeUdldCA9ICgoQm9vbGVhbilzdWJRdWVyeUdldE9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChpc1N1YlF1ZXJ5R2V0KQotICAgICAgICAgIHJldHVybiAidWRkaS9mb3Jtcy9HZXRGb3JtLmpzcCI7Ci0gICAgICB9Ci0gICAgICBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgfQotICAgICAgCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL0J1c1B1Ymxpc2hTZXJ2aWNlRm9ybS5qc3AiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiByZWdGaW5kVG9vbF8uZ2V0Rm9ybUxpbmsoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVhODUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0J1c2luZXNzRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuUHJveHlMb2FkUGFnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkJ1c2luZXNzRWxlbWVudDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRGlzY292ZXJ5VVJMczsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuSWRlbnRpZmllckJhZzsKLQotcHVibGljIGNsYXNzIEJ1c2luZXNzRGV0YWlsc1Rvb2wgZXh0ZW5kcyBEZXRhaWxzVG9vbAotewotICBwdWJsaWMgQnVzaW5lc3NEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0LFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygidWRkaS9mb3Jtcy9CdXNpbmVzc0RldGFpbHNGb3JtLmpzcCIpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgICBjbGVhclByb3BlcnR5VGFibGUoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpKHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgQnVzaW5lc3NFbnRpdHkgYmUgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCk7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLGJlLmdldEJ1c2luZXNzS2V5KCkpOwotCi0gICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY29weUluZGV4VmVjdG9yKGJlLmdldE5hbWVWZWN0b3IoKSxuYW1lVmVjdG9yKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTLG5hbWVWZWN0b3IpOwotCi0gICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIGNvcHlJbmRleFZlY3RvcihiZS5nZXREZXNjcmlwdGlvblZlY3RvcigpLGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyxkZXNjcmlwdGlvblZlY3Rvcik7Ci0KLSAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gYmUuZ2V0SWRlbnRpZmllckJhZygpOwotICAgIGlmIChpZEJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBpZFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGNvcHlJbmRleFZlY3RvcihpZEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpLGlkVmVjdG9yKTsKLSAgICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMsaWRWZWN0b3IpOwotICAgIH0KLQotICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IGJlLmdldENhdGVnb3J5QmFnKCk7Ci0gICAgaWYgKGNhdEJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBjYXRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBjb3B5SW5kZXhWZWN0b3IoY2F0QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCksY2F0VmVjdG9yKTsKLSAgICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyxjYXRWZWN0b3IpOwotICAgIH0KLQotICAgIERpc2NvdmVyeVVSTHMgZGlzY292ZXJ5VVJMcyA9IGJlLmdldERpc2NvdmVyeVVSTHMoKTsKLSAgICBpZiAoZGlzY292ZXJ5VVJMcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBkaXNjb3ZlcnlVUkxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBjb3B5SW5kZXhWZWN0b3IoZGlzY292ZXJ5VVJMcy5nZXREaXNjb3ZlcnlVUkxWZWN0b3IoKSxkaXNjb3ZlcnlVUkxWZWN0b3IpOwotICAgICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTLGRpc2NvdmVyeVVSTFZlY3Rvcik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9CdXNpbmVzc05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0J1c2luZXNzTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTAyM2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0J1c2luZXNzTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5CdXNpbmVzc0dldFNlcnZpY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBCdXNpbmVzc05vZGUgZXh0ZW5kcyBVRERJTmF2aWdhdG9yTm9kZQotewotICBwcml2YXRlIERldGFpbHNUb29sIGRldGFpbHNUb29sXzsKLSAgcHJpdmF0ZSBCdXNQdWJsaXNoU2VydmljZVRvb2wgcHVibGlzaFNlcnZpY2VUb29sXzsKLSAgcHJpdmF0ZSBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbCBtYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbF87Ci0gIHByaXZhdGUgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzVG9vbCBtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sXzsKLSAgcHJpdmF0ZSBVbnB1Ymxpc2hUb29sIHVucHVibGlzaFRvb2xfOwotCi0gIHB1YmxpYyBCdXNpbmVzc05vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsInVkZGkvaW1hZ2VzL2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZiIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgZGV0YWlsc1Rvb2xfID0gbmV3IEJ1c2luZXNzRGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQlVTSU5FU1NfREVUQUlMUyIpKTsKLSAgICBuZXcgR2V0U2VydmljZXNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0dFVF9TRVJWSUNFUyIpLEJ1c2luZXNzR2V0U2VydmljZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWRfKSk7ICAgIAotICAgIHB1Ymxpc2hTZXJ2aWNlVG9vbF8gPSBuZXcgQnVzUHVibGlzaFNlcnZpY2VUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1BVQkxJU0hfU0VSVklDRSIpKTsKLSAgICBtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sXyA9IG5ldyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTIikpOwotICAgIG1hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnNUb29sXyA9IG5ldyBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbCh0b29sTWFuYWdlcl8sdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlMiKSk7Ci0gICAgbmV3IEFkZFRvRmF2b3JpdGVzVG9vbCh0b29sTWFuYWdlcl8sIHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQUREX1RPX0ZBVk9SSVRFUyIpKTsKLSAgICB1bnB1Ymxpc2hUb29sXyA9IG5ldyBVbnB1Ymxpc2hUb29sKHRvb2xNYW5hZ2VyXywidWRkaS9pbWFnZXMvdW5wdWJsaXNoX2J1c19lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3VucHVibGlzaF9idXNfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1VOUFVCTElTSF9CVVNJTkVTUyIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCkKLSAgewotICAgIGRldGFpbHNUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gICAgcHVibGlzaFNlcnZpY2VUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gICAgbWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzVG9vbF8uYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKHJlZ0VsZW1lbnQpOwotICAgIG1hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnNUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gICAgdW5wdWJsaXNoVG9vbF8uYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKHJlZ0VsZW1lbnQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9DYXRlZ29yeU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0NhdGVnb3J5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzRhYzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0NhdGVnb3J5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJRnJhbWVOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESU1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5DYXRlZ29yeUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeU5vZGUgZXh0ZW5kcyBOb2RlCi17Ci0gIHB1YmxpYyBDYXRlZ29yeU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsInVkZGkvaW1hZ2VzL2NhdGVnb3J5LmdpZiIpOwotICAgIHNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUNoaWxkcmVuKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGNoaWxkcmVuID0gZWxlbWVudF8uZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9TVUJDQVRFR09SSUVTKTsKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIENhdGVnb3J5RWxlbWVudCBjYXRlZ29yeUVsZW1lbnQgPSAoQ2F0ZWdvcnlFbGVtZW50KWNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIENhdGVnb3J5Tm9kZSBjYXRlZ29yeU5vZGUgPSBuZXcgQ2F0ZWdvcnlOb2RlKGNhdGVnb3J5RWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxKTsKLSAgICAgICAgYWRkQ2hpbGQoY2F0ZWdvcnlOb2RlKTsKLSAgICAgICAgY2F0ZWdvcnlOb2RlLmNyZWF0ZUNoaWxkcmVuKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICBDYXRlZ29yeUVsZW1lbnQgY2F0ZWdvcnlFbGVtZW50ID0gKENhdGVnb3J5RWxlbWVudCllbGVtZW50XzsKLSAgICByZXR1cm4gY2F0ZWdvcnlFbGVtZW50LmdldE5hbWVGb3JUcmVlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25IcmVmKCkKLSAgewotICAgIHJldHVybiBUb2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhnZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRTZXNzaW9uSWQoKSxub2RlSWRfLGlzT3Blbl8pOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMaW5rQWN0aW9uSHJlZigpCi0gIHsKLSAgICByZXR1cm4gU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0U2Vzc2lvbklkKCksbm9kZUlkXyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25UYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIFVERElGcmFtZU5hbWVzLkNBVEVHT1JJRVNfV09SS0FSRUE7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExpbmtBY3Rpb25UYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIFVERElGcmFtZU5hbWVzLkNBVEVHT1JJRVNfV09SS0FSRUE7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0RldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9EZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTcxZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0RldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sCi17Ci0gIHByaXZhdGUgU3RyaW5nIGZvcm1MaW5rXzsKLQotICBwdWJsaWMgRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCxTdHJpbmcgZm9ybUxpbmspCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gICAgZm9ybUxpbmtfID0gZm9ybUxpbms7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIHJldHVybiBmb3JtTGlua187Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjb3B5SW5kZXhWZWN0b3IoVmVjdG9yIHNvdXJjZSxWZWN0b3IgZGVzdGluYXRpb24pCi0gIHsKLSAgICBkZXN0aW5hdGlvbi5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDtpPHNvdXJjZS5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHNvdXJjZS5lbGVtZW50QXQoaSkpOwotICAgICAgbGlzdEVsZW1lbnQuc2V0Vmlld0lkKGkpOwotICAgICAgLy8gVGhlIG5leHQgaXRlbSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGVsZW1lbnQgaXMgdG8gYmUgaW4gbm9uLWVkaXQgc3RhdGUuCi0gICAgICBsaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8oLTEsLTEsaSk7Ci0gICAgICBkZXN0aW5hdGlvbi5hZGRFbGVtZW50KGxpc3RFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldEJ1c2luZXNzZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9HZXRCdXNpbmVzc2VzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzA0MGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldEJ1c2luZXNzZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5TZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEdldEJ1c2luZXNzZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbAotewotICBwcml2YXRlIFN0cmluZyBhY3Rpb25MaW5rXzsKLSAgcHVibGljIEdldEJ1c2luZXNzZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBlbmFibGVkSW1hZ2VQYXRoLFN0cmluZyBoaWdobGlnaHRlZEltYWdlUGF0aCxTdHJpbmcgYWx0LFN0cmluZyBhY3Rpb25MaW5rKQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsZW5hYmxlZEltYWdlUGF0aCxoaWdobGlnaHRlZEltYWdlUGF0aCxhbHQpOwotICAgIGFjdGlvbkxpbmtfID0gYWN0aW9uTGluazsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gYWN0aW9uTGlua187Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldFNlcnZpY2VJbnRlcmZhY2VzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvR2V0U2VydmljZUludGVyZmFjZXNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDc2NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvR2V0U2VydmljZUludGVyZmFjZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5TZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEdldFNlcnZpY2VJbnRlcmZhY2VzVG9vbCBleHRlbmRzIEFjdGlvblRvb2wKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uTGlua187Ci0gIHB1YmxpYyBHZXRTZXJ2aWNlSW50ZXJmYWNlc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCxTdHJpbmcgYWN0aW9uTGluaykKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlX2ludGVyZmFjZXNfY2xvc2VkX2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gICAgYWN0aW9uTGlua18gPSBhY3Rpb25MaW5rOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiBhY3Rpb25MaW5rXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvR2V0U2VydmljZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9HZXRTZXJ2aWNlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0ZTY1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9HZXRTZXJ2aWNlc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2V0U2VydmljZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbAotewotICBwcml2YXRlIFN0cmluZyBhY3Rpb25MaW5rXzsKLSAgcHVibGljIEdldFNlcnZpY2VzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0LFN0cmluZyBhY3Rpb25MaW5rKQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsInVkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gICAgYWN0aW9uTGlua18gPSBhY3Rpb25MaW5rOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiBhY3Rpb25MaW5rXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvSXRlbXNTdW1tYXJ5VG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvSXRlbXNTdW1tYXJ5VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVmM2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0l0ZW1zU3VtbWFyeVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlByb3h5TG9hZFBhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgSXRlbXNTdW1tYXJ5VG9vbCBleHRlbmRzIEZvcm1Ub29sCi17Ci0gIHByaXZhdGUgU3RyaW5nIGZvcm1MaW5rXzsKLQotICBwdWJsaWMgSXRlbXNTdW1tYXJ5VG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgZW5hYmxlZEltYWdlLFN0cmluZyBoaWdobGlnaHRlZEltYWdlLFN0cmluZyBhbHQsaW50IHF1ZXJ5SXRlbSkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGVuYWJsZWRJbWFnZSxoaWdobGlnaHRlZEltYWdlLGFsdCk7Ci0gICAgU3RyaW5nQnVmZmVyIGZvcm1MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9mb3Jtcy9JdGVtc1N1bW1hcnlGb3JtLmpzcD8iKTsKLSAgICBmb3JtTGluay5hcHBlbmQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNKS5hcHBlbmQoJz0nKS5hcHBlbmQocXVlcnlJdGVtKTsKLQlTdHJpbmcgZW5jb2RlZEZvcm1MaW5rID0gVVJMVXRpbHMuZW5jb2RlKGZvcm1MaW5rLnRvU3RyaW5nKCkpOwotICAgIGZvcm1MaW5rXyA9IFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluayhlbmNvZGVkRm9ybUxpbmspOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpCi0gIHsKLSAgICByZXR1cm4gZm9ybUxpbmtfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9Mb2dpblRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0xvZ2luVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZiMjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0xvZ2luVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNyAgIDEzNjQ0OSBicnVuc3NlbkB1cy5pYm0uY29tIC0gVmluY2UgQnJ1bnNzZW4gIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc01vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5TZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIExvZ2luVG9vbCBleHRlbmRzIEZvcm1Ub29sCi17Ci0gIHByaXZhdGUgQ29udHJvbGxlciBjb250cm9sbGVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZm9ybUxpbmsgPSAidWRkaS9mb3Jtcy9Mb2dpblVkZGlGb3JtLmpzcCI7Ci0gIAotICBwdWJsaWMgTG9naW5Ub29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsInVkZGkvaW1hZ2VzL29wZW5fcmVnaXN0cnlfZW5hYmxlZC5naWYiLCJ1ZGRpL2ltYWdlcy9vcGVuX3JlZ2lzdHJ5X2hpZ2hsaWdodGVkLmdpZiIsYWx0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgICBjb250cm9sbGVyXyA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIHJldHVybiBmb3JtTGluazsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VG9Mb2dvdXRMaW5rKCkgCi0gIHsKLSAgCWZvcm1MaW5rID0gInVkZGkvYWN0aW9ucy9Mb2dvdXRBZHZhbmNlZEFjdGlvbkpTUC5qc3AiOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUb1JlZ2lzdHJ5TGluaygpIAotICB7Ci0gIAlmb3JtTGluayA9ICIiOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgRW51bWVyYXRpb24gZ2V0RmF2b3JpdGVSZWdpc3RyeUVsZW1lbnRzKCkKLSAgewotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBmYXZvcml0ZXNOb2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgVHJlZUVsZW1lbnQgZmF2b3JpdGVzTWFpbkVsZW1lbnQgPSBmYXZvcml0ZXNOb2RlTWFuYWdlci5nZXRSb290Tm9kZSgpLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgVHJlZUVsZW1lbnQgZmF2b3JpdGVSZWdpc3RyaWVzRWxlbWVudCA9IChUcmVlRWxlbWVudCkoZmF2b3JpdGVzTWFpbkVsZW1lbnQuZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfRk9MREVSX05PREUpLm5leHRFbGVtZW50KCkpOwotICAgIHJldHVybiBmYXZvcml0ZVJlZ2lzdHJpZXNFbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX05PREUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9NYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1NTFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9NYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlByb3h5TG9hZFBhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0RmluZFRvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIE1hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnNUb29sIGV4dGVuZHMgRm9ybVRvb2wgaW1wbGVtZW50cyBNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZQotewotICBUb29sTWFuYWdlciBpbnZpc2libGVUb29sTWFuYWdlcl87Ci0gIHByaXZhdGUgUmVnRmluZFRvb2wgcmVnRmluZFRvb2xfOwotCi0gIHB1YmxpYyBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAidWRkaS9pbWFnZXMvcHVibGlzaGVyX2Fzc2VydGlvbnNfZW5hYmxlZC5naWYiLCAidWRkaS9pbWFnZXMvcHVibGlzaGVyX2Fzc2VydGlvbnNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICBpbnZpc2libGVUb29sTWFuYWdlcl8gPSBuZXcgVG9vbE1hbmFnZXIodG9vbE1hbmFnZXIuZ2V0Tm9kZSgpKTsKLSAgICByZWdGaW5kVG9vbF8gPSBuZXcgUmVnRmluZFRvb2woaW52aXNpYmxlVG9vbE1hbmFnZXJfLCIiKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSwiIik7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSk7Ci0gICAgU3RyaW5nIHNpbXBsZVN0eWxlU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMsc2ltcGxlU3R5bGVTdHJpbmcpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBnZXRGb3JtVG9vbFByb3BlcnRpZXMoT2JqZWN0IHN1YlF1ZXJ5S2V5T2JqZWN0KQotICB7Ci0gICAgLy8gRW1wdHkvTm9uLWV4aXN0ZW50IHN1YnF1ZXJ5a2V5IGltcGxpZXMgcHVibGlzaCBmb3JtLiBBbGwgZWxzZSBpbXBsaWVzIHF1ZXJ5IGZvcm0uCi0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylzdWJRdWVyeUtleU9iamVjdDsKLSAgICBpZiAoc3ViUXVlcnlLZXkgPT0gbnVsbCB8fCBzdWJRdWVyeUtleS5sZW5ndGgoKSA8IDEpCi0gICAgICByZXR1cm4gdGhpczsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gcmVnRmluZFRvb2xfLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleU9iamVjdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylnZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgcmV0dXJuIFNlbGVjdEZpbmRUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksc3ViUXVlcnlLZXksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgcmVnRmluZFRvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgT2JqZWN0IHN1YlF1ZXJ5S2V5T2JqZWN0ID0gZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IG51bGw7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5T2JqZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSSUVTX1BST1BFUlRJRVMpOwotICAgICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHN1YlF1ZXJ5UHJvcGVydGllcyA9IGdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleU9iamVjdCk7Ci0gICAgICBPYmplY3Qgc3ViUXVlcnlHZXRPYmplY3QgPSBzdWJRdWVyeVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgICAgaWYgKHN1YlF1ZXJ5R2V0T2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNTdWJRdWVyeUdldCA9ICgoQm9vbGVhbilzdWJRdWVyeUdldE9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChpc1N1YlF1ZXJ5R2V0KQotICAgICAgICAgIHJldHVybiAidWRkaS9mb3Jtcy9HZXRGb3JtLmpzcCI7Ci0gICAgICB9Ci0gICAgICBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgfQotCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuIFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygidWRkaS9mb3Jtcy9NYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zRm9ybS5qc3AiKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gcmVnRmluZFRvb2xfLmdldEZvcm1MaW5rKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmMmM2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0RmluZFRvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIE1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCBpbXBsZW1lbnRzIE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlCi17Ci0gIFRvb2xNYW5hZ2VyIGludmlzaWJsZVRvb2xNYW5hZ2VyXzsKLSAgcHJpdmF0ZSBSZWdGaW5kVG9vbCByZWdGaW5kVG9vbF87Ci0KLSAgcHVibGljIE1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwgInVkZGkvaW1hZ2VzL3JlZmVyZW5jZWRfc2VydmljZXNfZW5hYmxlZC5naWYiLCAidWRkaS9pbWFnZXMvcmVmZXJlbmNlZF9zZXJ2aWNlc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIGludmlzaWJsZVRvb2xNYW5hZ2VyXyA9IG5ldyBUb29sTWFuYWdlcih0b29sTWFuYWdlci5nZXROb2RlKCkpOwotICAgIHJlZ0ZpbmRUb29sXyA9IG5ldyBSZWdGaW5kVG9vbChpbnZpc2libGVUb29sTWFuYWdlcl8sIiIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSk7Ci0gICAgU3RyaW5nIHNpbXBsZVN0eWxlU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMsc2ltcGxlU3R5bGVTdHJpbmcpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBnZXRGb3JtVG9vbFByb3BlcnRpZXMoT2JqZWN0IHN1YlF1ZXJ5S2V5T2JqZWN0KQotICB7Ci0gICAgLy8gRW1wdHkvTm9uLWV4aXN0ZW50IHN1YnF1ZXJ5a2V5IGltcGxpZXMgcHVibGlzaCBmb3JtLiBBbGwgZWxzZSBpbXBsaWVzIHF1ZXJ5IGZvcm0uCi0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylzdWJRdWVyeUtleU9iamVjdDsKLSAgICBpZiAoc3ViUXVlcnlLZXkgPT0gbnVsbCB8fCBzdWJRdWVyeUtleS5sZW5ndGgoKSA8IDEpCi0gICAgICByZXR1cm4gdGhpczsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gcmVnRmluZFRvb2xfLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleU9iamVjdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylnZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgcmV0dXJuIFNlbGVjdEZpbmRUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksc3ViUXVlcnlLZXksZm9ySGlzdG9yeSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCkKLSAgewotICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcmVnRWxlbWVudC5nZXRQdWJsaXNoVVJMKCk7Ci0gICAgU3RyaW5nIHVzZXJJZCA9IHJlZ0VsZW1lbnQuZ2V0VXNlcklkKCk7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gcmVnRWxlbWVudC5nZXRDcmVkKCk7Ci0gICAgCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0gICAgICAKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgcmVnRmluZFRvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgT2JqZWN0IHN1YlF1ZXJ5S2V5T2JqZWN0ID0gZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IG51bGw7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5T2JqZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSSUVTX1BST1BFUlRJRVMpOwotICAgICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHN1YlF1ZXJ5UHJvcGVydGllcyA9IGdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleU9iamVjdCk7Ci0gICAgICBPYmplY3Qgc3ViUXVlcnlHZXRPYmplY3QgPSBzdWJRdWVyeVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgICAgaWYgKHN1YlF1ZXJ5R2V0T2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNTdWJRdWVyeUdldCA9ICgoQm9vbGVhbilzdWJRdWVyeUdldE9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChpc1N1YlF1ZXJ5R2V0KQotICAgICAgICAgIHJldHVybiAidWRkaS9mb3Jtcy9HZXRGb3JtLmpzcCI7Ci0gICAgICB9Ci0gICAgICBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgfQotCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0Zvcm0uanNwIjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gcmVnRmluZFRvb2xfLmdldEZvcm1MaW5rKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL011bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9NdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRmYmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL011bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlCi17Ci0gIHB1YmxpYyBhYnN0cmFjdCBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKE9iamVjdCBrZXkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvT3BlblJlZ2lzdHJ5VG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvT3BlblJlZ2lzdHJ5VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM3YmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL09wZW5SZWdpc3RyeVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjQgICAxMjI3NTIgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotCi1wdWJsaWMgY2xhc3MgT3BlblJlZ2lzdHJ5VG9vbCBleHRlbmRzIEZvcm1Ub29sCi17Ci0gIHByaXZhdGUgQ29udHJvbGxlciBjb250cm9sbGVyXzsKLSAgCi0gIHB1YmxpYyBPcGVuUmVnaXN0cnlUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwidWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL29wZW5fcmVnaXN0cnlfaGlnaGxpZ2h0ZWQuZ2lmIixhbHQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICAgIGNvbnRyb2xsZXJfID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5SRUdJU1RSWV9OQU1FLHVkZGlQZXJzcGVjdGl2ZS5nZXREZWZhdWx0VURESVJlZ2lzdHJ5KCkuZ2V0TmFtZSgpKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMLHVkZGlQZXJzcGVjdGl2ZS5nZXREZWZhdWx0VURESVJlZ2lzdHJ5KCkuZ2V0SW5xdWlyeVVSTCgpKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL09wZW5SZWdpc3RyeUZvcm0uanNwIjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIEVudW1lcmF0aW9uIGdldEZhdm9yaXRlUmVnaXN0cnlFbGVtZW50cygpCi0gIHsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgZmF2b3JpdGVzTm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIFRyZWVFbGVtZW50IGZhdm9yaXRlc01haW5FbGVtZW50ID0gZmF2b3JpdGVzTm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFRyZWVFbGVtZW50IGZhdm9yaXRlUmVnaXN0cmllc0VsZW1lbnQgPSAoVHJlZUVsZW1lbnQpKGZhdm9yaXRlc01haW5FbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX0ZPTERFUl9OT0RFKS5uZXh0RWxlbWVudCgpKTsKLSAgICByZXR1cm4gZmF2b3JpdGVSZWdpc3RyaWVzRWxlbWVudC5nZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9OT0RFKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUHVibGlzaGVkSXRlbXNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9QdWJsaXNoZWRJdGVtc05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzOWQ5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9QdWJsaXNoZWRJdGVtc05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESU1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5QdWJsaXNoZWRJdGVtc0VsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZWRJdGVtc05vZGUgZXh0ZW5kcyBVRERJTmF2aWdhdG9yRm9sZGVyTm9kZQotewotICBwdWJsaWMgUHVibGlzaGVkSXRlbXNOb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsaW50IG5vZGVEZXB0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoKTsKLSAgICBlbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgaWYgKHJlbC5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVMpKQotICAgICAgICB7Ci0gICAgICAgICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICAgIGNyZWF0ZUNoaWxkTm9kZSh0cmVlRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVMpKQotICAgICAgICAgIHRyZWVFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgIGVsc2UgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9JVEVNUykpCi0gICAgICAgICAgdHJlZUVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0T3V0Qm91bmRFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKHRyZWVFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKHRyZWVFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVDaGlsZE5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBwdWJsaXNoZWRJdGVtc0VsZW1lbnQgPSAoUHVibGlzaGVkSXRlbXNFbGVtZW50KWVsZW1lbnRfOwotICAgIE5vZGUgY2hpbGROb2RlID0gbnVsbDsKLSAgICBzd2l0Y2ggKHB1Ymxpc2hlZEl0ZW1zRWxlbWVudC5nZXRUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgY2hpbGROb2RlID0gbmV3IEJ1c2luZXNzTm9kZShlbGVtZW50LG5vZGVNYW5hZ2VyXyxub2RlRGVwdGhfKzEpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTOgotICAgICAgICBjaGlsZE5vZGUgPSBuZXcgU2VydmljZU5vZGUoZWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgICAgIGNoaWxkTm9kZSA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlTm9kZShlbGVtZW50LG5vZGVNYW5hZ2VyXyxub2RlRGVwdGhfKzEpOwotICAgIH0KLSAgICBpZiAoY2hpbGROb2RlICE9IG51bGwpCi0gICAgICBhZGRDaGlsZChjaGlsZE5vZGUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgUHVibGlzaGVkSXRlbXNFbGVtZW50IHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCA9IChQdWJsaXNoZWRJdGVtc0VsZW1lbnQpZWxlbWVudF87Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgaW50IHB1Ymxpc2hlZEl0ZW1zVHlwZSA9IHB1Ymxpc2hlZEl0ZW1zRWxlbWVudC5nZXRUeXBlKCk7Ci0gICAgc3dpdGNoIChwdWJsaXNoZWRJdGVtc1R5cGUpCi0gICAgewotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL2J1c2luZXNzZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVU1NQVJZX0JVU0lORVNTRVMiKSxwdWJsaXNoZWRJdGVtc1R5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTOgotICAgICAgICBuZXcgSXRlbXNTdW1tYXJ5VG9vbCh0b29sTWFuYWdlcl8sInVkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1VNTUFSWV9TRVJWSUNFUyIpLHB1Ymxpc2hlZEl0ZW1zVHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlX2ludGVyZmFjZXNfY2xvc2VkX2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1VNTUFSWV9TRVJWSUNFX0lOVEVSRkFDRVMiKSxwdWJsaXNoZWRJdGVtc1R5cGUpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRPcGVuSW1hZ2VQYXRoKCkKLSAgewotICAgIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBwdWJsaXNoZWRJdGVtc0VsZW1lbnQgPSAoUHVibGlzaGVkSXRlbXNFbGVtZW50KWVsZW1lbnRfOwotICAgIGludCBwdWJsaXNoZWRJdGVtc1R5cGUgPSBwdWJsaXNoZWRJdGVtc0VsZW1lbnQuZ2V0VHlwZSgpOwotICAgIHN3aXRjaCAocHVibGlzaGVkSXRlbXNUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVM6Ci0gICAgICAgIHJldHVybiAidWRkaS9pbWFnZXMvYnVzaW5lc3Nlc19vcGVuX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICAgcmV0dXJuICJ1ZGRpL2ltYWdlcy9zZXJ2aWNlc19vcGVuX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgICAgIHJldHVybiAidWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX29wZW5faGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldE9wZW5JbWFnZVBhdGgoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbG9zZWRJbWFnZVBhdGgoKQotICB7Ci0gICAgUHVibGlzaGVkSXRlbXNFbGVtZW50IHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCA9IChQdWJsaXNoZWRJdGVtc0VsZW1lbnQpZWxlbWVudF87Ci0gICAgaW50IHB1Ymxpc2hlZEl0ZW1zVHlwZSA9IHB1Ymxpc2hlZEl0ZW1zRWxlbWVudC5nZXRUeXBlKCk7Ci0gICAgc3dpdGNoIChwdWJsaXNoZWRJdGVtc1R5cGUpCi0gICAgewotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgcmV0dXJuICJ1ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiOwotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgIHJldHVybiAidWRkaS9pbWFnZXMvc2VydmljZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgICAgIHJldHVybiAidWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0Q2xvc2VkSW1hZ2VQYXRoKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1F1ZXJ5Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUXVlcnlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMDE0ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUXVlcnlOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLkZpbmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQnVzaW5lc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlNlcnZpY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5TZXJ2aWNlSW50ZXJmYWNlRWxlbWVudDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlOb2RlIGV4dGVuZHMgVURESU5hdmlnYXRvck5vZGUKLXsKLSAgcHJpdmF0ZSBGb3JtVG9vbCByZWdGaW5kVG9vbF87Ci0gIHByaXZhdGUgRmluZEFjdGlvbiBmaW5kQWN0aW9uXzsKLSAgcHVibGljIFF1ZXJ5Tm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCwidWRkaS9pbWFnZXMvcXVlcnkuZ2lmIik7Ci0gICAgZWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgIGlmIChyZWwuZXF1YWxzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUllfUkVTVUxUUykpCi0gICAgICAgIHsKLSAgICAgICAgICBUcmVlRWxlbWVudCB0cmVlRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgICAgY3JlYXRlQ2hpbGROb2RlKHRyZWVFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBUcmVlRWxlbWVudCB0cmVlRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJZX1JFU1VMVFMpKQotICAgICAgICAgIHRyZWVFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgIGVsc2UgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJZX1JFU1VMVFMpKQotICAgICAgICAgIHRyZWVFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotCi0gICAgICAgIGlmICh0cmVlRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHJlbW92ZUNoaWxkTm9kZSh0cmVlRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgY3JlYXRlQ2hpbGRyZW4oKTsKLSAgICBzZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbihmYWxzZSk7Ci0gICAgZmluZEFjdGlvbl8gPSBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZUNoaWxkcmVuKCkKLSAgewotICAgIFZlY3RvciBpbml0aWFsUmVzdWx0cyA9IChWZWN0b3IpZWxlbWVudF8uZ2V0UHJvcGVydHlBc09iamVjdChVRERJTW9kZWxDb25zdGFudHMuSU5JVElBTF9SRVNVTFRTKTsKLSAgICBmb3IgKGludCBpPTA7aTxpbml0aWFsUmVzdWx0cy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBpbml0aWFsUmVzdWx0cy5lbGVtZW50QXQoaSk7Ci0gICAgICBUcmVlRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJ1c2luZXNzRW50aXR5KQotICAgICAgICBjaGlsZEVsZW1lbnQgPSBuZXcgQnVzaW5lc3NFbGVtZW50KChCdXNpbmVzc0VudGl0eSlvYmplY3QsZWxlbWVudF8uZ2V0TW9kZWwoKSk7Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCdXNpbmVzc1NlcnZpY2UpCi0gICAgICAgIGNoaWxkRWxlbWVudCA9IG5ldyBTZXJ2aWNlRWxlbWVudCgoQnVzaW5lc3NTZXJ2aWNlKW9iamVjdCxlbGVtZW50Xy5nZXRNb2RlbCgpKTsKLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRNb2RlbCkKLSAgICAgICAgY2hpbGRFbGVtZW50ID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KChUTW9kZWwpb2JqZWN0LGVsZW1lbnRfLmdldE1vZGVsKCkpOwotICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgICBlbGVtZW50Xy5jb25uZWN0KGNoaWxkRWxlbWVudCxVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJZX1JFU1VMVFMsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlQ2hpbGROb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlIGNoaWxkTm9kZSA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCdXNpbmVzc0VsZW1lbnQpCi0gICAgICBjaGlsZE5vZGUgPSBuZXcgQnVzaW5lc3NOb2RlKGVsZW1lbnQsbm9kZU1hbmFnZXJfLG5vZGVEZXB0aF8rMSk7Ci0gICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VFbGVtZW50KQotICAgICAgY2hpbGROb2RlID0gbmV3IFNlcnZpY2VOb2RlKGVsZW1lbnQsbm9kZU1hbmFnZXJfLG5vZGVEZXB0aF8rMSk7Ci0gICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KQotICAgICAgY2hpbGROb2RlID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VOb2RlKGVsZW1lbnQsbm9kZU1hbmFnZXJfLG5vZGVEZXB0aF8rMSk7Ci0gICAgaWYgKGNoaWxkTm9kZSAhPSBudWxsKQotICAgICAgYWRkQ2hpbGQoY2hpbGROb2RlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRUb29scygpCi0gIHsKLSAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIG5ldyBSZXN1bHRzVG9vbCh0b29sTWFuYWdlcl8sY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfUkVTVUxUUyIpKTsKLSAgICByZWdGaW5kVG9vbF8gPSBuZXcgUmVnRmluZFRvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfRklORCIpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldEZpbmRUb29sUHJvcGVydGllcyhGaW5kQWN0aW9uIGZpbmRBY3Rpb24pCi0gIHsKLSAgICBmaW5kQWN0aW9uXyA9IGZpbmRBY3Rpb247Ci0gICAgcmVnRmluZFRvb2xfLnVwZGF0ZVByb3BlcnR5VGFibGUoZmluZEFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgKChSZWdGaW5kVG9vbClyZWdGaW5kVG9vbF8pLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgICBWZWN0b3IgY2hpbGROb2RlcyA9IGdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpPTA7aTxjaGlsZE5vZGVzLnNpemUoKTtpKyspCi0gICAgewotICAgICAgVURESU5hdmlnYXRvck5vZGUgbmF2aWdhdG9yTm9kZSA9IChVRERJTmF2aWdhdG9yTm9kZSljaGlsZE5vZGVzLmVsZW1lbnRBdChpKTsKLSAgICAgIG5hdmlnYXRvck5vZGUuYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKHJlZ0VsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBGaW5kQWN0aW9uIGdldEZpbmRBY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGZpbmRBY3Rpb25fOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9RdWVyeVBhcmVudE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1F1ZXJ5UGFyZW50Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDgyZmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1F1ZXJ5UGFyZW50Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeVBhcmVudE5vZGUgZXh0ZW5kcyBVRERJTmF2aWdhdG9yRm9sZGVyTm9kZQotewotICBwdWJsaWMgUXVlcnlQYXJlbnROb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsaW50IG5vZGVEZXB0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoKTsKLSAgICBlbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgaWYgKHJlbC5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTKSkKLSAgICAgICAgewotICAgICAgICAgIFF1ZXJ5RWxlbWVudCBxdWVyeUVsZW1lbnQgPSAoUXVlcnlFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICBjcmVhdGVDaGlsZE5vZGUocXVlcnlFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBRdWVyeUVsZW1lbnQgcXVlcnlFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUklFUykpCi0gICAgICAgICAgcXVlcnlFbGVtZW50ID0gKFF1ZXJ5RWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICBlbHNlIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTKSkKLSAgICAgICAgICBxdWVyeUVsZW1lbnQgPSAoUXVlcnlFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotCi0gICAgICAgIGlmIChxdWVyeUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICByZW1vdmVDaGlsZE5vZGUocXVlcnlFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVDaGlsZE5vZGUoUXVlcnlFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBRdWVyeU5vZGUgcXVlcnlOb2RlID0gbmV3IFF1ZXJ5Tm9kZShlbGVtZW50LG5vZGVNYW5hZ2VyXyxub2RlRGVwdGhfKzEpOwotICAgIC8vIEFkZCByZWdpc3RyeSBhdXRoZW50aWNhdGlvbiBwcm9wZXJ0aWVzLgotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCkoZ2V0UGFyZW50KCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgcXVlcnlOb2RlLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgICBhZGRDaGlsZChxdWVyeU5vZGUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9xdWVyaWVzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVU1NQVJZX1FVRVJJRVMiKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fUVVFUklFUyk7Ci0gICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL2J1c2luZXNzZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVU1NQVJZX0JVU0lORVNTRVMiKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyk7Ci0gICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlc19jbG9zZWRfZW5hYmxlZC5naWYiLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NVTU1BUllfU0VSVklDRVMiKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMpOwotICAgIG5ldyBJdGVtc1N1bW1hcnlUb29sKHRvb2xNYW5hZ2VyXywidWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NVTU1BUllfU0VSVklDRV9JTlRFUkZBQ0VTIiksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3BlbkltYWdlUGF0aCgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvaW1hZ2VzL3F1ZXJpZXNfb3Blbl9oaWdobGlnaHRlZC5naWYiOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsb3NlZEltYWdlUGF0aCgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZnJlc2hUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWZyZXNoVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzNmOGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZnJlc2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5SZWZyZXNoVURESU5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5TZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFJlZnJlc2hUb29sIGV4dGVuZHMgQWN0aW9uVG9vbAotewotICBwdWJsaWMgUmVmcmVzaFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIsImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIsYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gUmVmcmVzaFVERElOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsodG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlSWQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ0ZpbmRUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWdGaW5kVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGM5YWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ0ZpbmRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdEZpbmRUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBSZWdGaW5kVG9vbCBleHRlbmRzIEZvcm1Ub29sIGltcGxlbWVudHMgTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UKLXsKLSAgcHVibGljIFJlZ0ZpbmRUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwidWRkaS9pbWFnZXMvZmluZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL2ZpbmRfaGlnaGxpZ2h0ZWQuZ2lmIixhbHQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICAgIGluaXREZWZhdWx0UHJvcGVydGllcyh0aGlzKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSwiIik7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSSUVTX1BST1BFUlRJRVMsbmV3IEhhc2h0YWJsZSgpKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkRFRkFVTFRfUVVFUllfTkFNRSIpKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpCi0gIHsKLSAgICB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldFVERElQZXJzcGVjdGl2ZSgpOwotCi0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpKTsKLSAgICBTdHJpbmcgc2ltcGxlU3R5bGVTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSk7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMsc2ltcGxlU3R5bGVTdHJpbmcpOwotICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0KLSAgICBTdHJpbmcgbWF4U2VhcmNoU2V0ID0gU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9NQVhfU0VBUkNIX1NFVCk7Ci0gICAgU3RyaW5nIG1heFJlc3VsdHMgPSBTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9SRVNVTFRTKTsKLQotICAgIC8vIFJlZ0ZpbmRCdXNpbmVzc2VzU2ltcGxlQWN0aW9uIGlucHV0cwotICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSwiIik7Ci0KLSAgICAvLyBSZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQWN0aW9uIGlucHV0cwotICAgIC8vIFRoZSBhdXRoZW50aWNhdGlvbiBpbnB1dHMgbXVzdCBiZSBhZGRlZCBsYXRlciBhcyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHdlIGNhbiBnZXQgYSB2YWxpZCBoYW5kbGUKLSAgICAvLyB0byB0aGUgUmVnaXN0cnlFbGVtZW50IGluIHRoZSBjYXNlIG9mIGEgcXVlcnkgbm9kZS4KLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1NFQVJDSF9TRVQsbWF4U2VhcmNoU2V0KTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1JFU1VMVFMsbWF4UmVzdWx0cyk7Ci0KLSAgICAvLyBSZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb24gaW5wdXRzCi0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUsIiIpOwotCi0gICAgLy8gUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24gaW5wdXRzCi0gICAgLy8gVGhlIGF1dGhlbnRpY2F0aW9uIGlucHV0cyBtdXN0IGJlIGFkZGVkIGxhdGVyIGFzIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgd2UgY2FuIGdldCBhIHZhbGlkIGhhbmRsZQotICAgIC8vIHRvIHRoZSBSZWdpc3RyeUVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBxdWVyeSBub2RlLgotICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9TRUFSQ0hfU0VULG1heFNlYXJjaFNldCk7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTUFYX1JFU1VMVFMsbWF4UmVzdWx0cyk7Ci0KLSAgICAvLyBSZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb24gaW5wdXRzCi0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLCIiKTsKLQotICAgIC8vIFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uIGlucHV0cwotICAgIC8vIFRoZSBhdXRoZW50aWNhdGlvbiBpbnB1dHMgbXVzdCBiZSBhZGRlZCBsYXRlciBhcyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHdlIGNhbiBnZXQgYSB2YWxpZCBoYW5kbGUKLSAgICAvLyB0byB0aGUgUmVnaXN0cnlFbGVtZW50IGluIHRoZSBjYXNlIG9mIGEgcXVlcnkgbm9kZS4KLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSwiIik7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9TRUFSQ0hfU0VULG1heFNlYXJjaFNldCk7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9SRVNVTFRTLG1heFJlc3VsdHMpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcmVnRWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSByZWdFbGVtZW50LmdldENyZWQoKTsKLQotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgaWYgKHVzZXJJZCA9PSBudWxsKQotICAgICAgdXNlcklkID0gIiI7Ci0gICAgaWYgKHBhc3N3b3JkID09IG51bGwpCi0gICAgICBwYXNzd29yZCA9ICIiOwotCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBnZXRGb3JtVG9vbFByb3BlcnRpZXMoT2JqZWN0IHN1YlF1ZXJ5S2V5T2JqZWN0KQotICB7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylzdWJRdWVyeUtleU9iamVjdDsKLSAgICBpZiAoc3ViUXVlcnlLZXkgPT0gbnVsbCB8fCBzdWJRdWVyeUtleS5sZW5ndGgoKSA8IDEpCi0gICAgICByZXR1cm4gdGhpczsKLSAgICBIYXNodGFibGUgc3ViUXVlcmllc1Byb3BlcnRpZXMgPSAoSGFzaHRhYmxlKWdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUklFU19QUk9QRVJUSUVTKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2Ugc3ViUXVlcnlQcm9wZXJ0aWVzID0gKEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlzdWJRdWVyaWVzUHJvcGVydGllcy5nZXQoc3ViUXVlcnlLZXkpOwotICAgIGlmIChzdWJRdWVyeVByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdWJRdWVyeVByb3BlcnRpZXMgPSBuZXcgRm9ybVRvb2xQcm9wZXJ0aWVzKCk7Ci0gICAgICBpbml0RGVmYXVsdFByb3BlcnRpZXMoc3ViUXVlcnlQcm9wZXJ0aWVzKTsKLSAgICAgIHN1YlF1ZXJpZXNQcm9wZXJ0aWVzLnB1dChzdWJRdWVyeUtleSxzdWJRdWVyeVByb3BlcnRpZXMpOwotICAgIH0KLSAgICByZXR1cm4gc3ViUXVlcnlQcm9wZXJ0aWVzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIHJldHVybiBTZWxlY3RGaW5kVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLHN1YlF1ZXJ5S2V5LGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpCi0gIHsKLSAgICBPYmplY3Qgc3ViUXVlcnlLZXlPYmplY3QgPSBnZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5T2JqZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSSUVTX1BST1BFUlRJRVMpOwotICAgICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHN1YlF1ZXJ5UHJvcGVydGllcyA9IGdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleU9iamVjdCk7Ci0gICAgICBPYmplY3Qgc3ViUXVlcnlHZXRPYmplY3QgPSBzdWJRdWVyeVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgICAgaWYgKHN1YlF1ZXJ5R2V0T2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNTdWJRdWVyeUdldCA9ICgoQm9vbGVhbilzdWJRdWVyeUdldE9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChpc1N1YlF1ZXJ5R2V0KQotICAgICAgICAgIHJldHVybiAidWRkaS9mb3Jtcy9HZXRGb3JtLmpzcCI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAidWRkaS9mb3Jtcy9SZWdGaW5kRm9ybS5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWdQdWJsaXNoVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUmVnUHVibGlzaFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5YWMyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWdQdWJsaXNoVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdEZpbmRUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBSZWdQdWJsaXNoVG9vbCBleHRlbmRzIEZvcm1Ub29sIGltcGxlbWVudHMgTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UKLXsKLSAgVG9vbE1hbmFnZXIgaW52aXNpYmxlVG9vbE1hbmFnZXJfOwotICBwcml2YXRlIFJlZ0ZpbmRUb29sIHJlZ0ZpbmRUb29sXzsKLSAgcHVibGljIFJlZ1B1Ymxpc2hUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwidWRkaS9pbWFnZXMvcHVibGlzaF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3B1Ymxpc2hfaGlnaGxpZ2h0ZWQuZ2lmIixhbHQpOwotICAgIGludmlzaWJsZVRvb2xNYW5hZ2VyXyA9IG5ldyBUb29sTWFuYWdlcih0b29sTWFuYWdlci5nZXROb2RlKCkpOwotICAgIHJlZ0ZpbmRUb29sXyA9IG5ldyBSZWdGaW5kVG9vbChpbnZpc2libGVUb29sTWFuYWdlcl8sIiIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICAgIHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSwiIik7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpKTsKLSAgICBTdHJpbmcgc2ltcGxlU3R5bGVTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTLHNpbXBsZVN0eWxlU3RyaW5nKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLHNpbXBsZVN0eWxlU3RyaW5nKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0KLSAgICAvLyBSZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVBY3Rpb24gaW5wdXRzCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSwiIik7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfREVTQ1JJUFRJT04sIiIpOwotCi0gICAgLy8gUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24gaW5wdXRzCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9XU0RMX1VSTCwiIik7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OLCIiKTsKLQotICAgIC8vIFJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24gaW5wdXRzCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMLCIiKTsKLQotICAgIC8vIFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uIGlucHV0cwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTiwiIik7Ci0KLSAgICAvLyBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQWN0aW9uIGlucHV0cwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwsIiIpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSwiIik7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgcmVnRmluZFRvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKE9iamVjdCBzdWJRdWVyeUtleU9iamVjdCkKLSAgewotICAgIC8vIEVtcHR5L05vbi1leGlzdGVudCBzdWJxdWVyeWtleSBpbXBsaWVzIHB1Ymxpc2ggZm9ybS4gQWxsIGVsc2UgaW1wbGllcyBxdWVyeSBmb3JtLgotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHJlZ0ZpbmRUb29sXy5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlPYmplY3QpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIHJldHVybiBTZWxlY3RGaW5kVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLHN1YlF1ZXJ5S2V5LGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpCi0gIHsKLSAgICBPYmplY3Qgc3ViUXVlcnlLZXlPYmplY3QgPSBnZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gbnVsbDsKLSAgICBpZiAoc3ViUXVlcnlLZXlPYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJJRVNfUFJPUEVSVElFUyk7Ci0gICAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2Ugc3ViUXVlcnlQcm9wZXJ0aWVzID0gZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5T2JqZWN0KTsKLSAgICAgIE9iamVjdCBzdWJRdWVyeUdldE9iamVjdCA9IHN1YlF1ZXJ5UHJvcGVydGllcy5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCk7Ci0gICAgICBpZiAoc3ViUXVlcnlHZXRPYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBpc1N1YlF1ZXJ5R2V0ID0gKChCb29sZWFuKXN1YlF1ZXJ5R2V0T2JqZWN0KS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgaWYgKGlzU3ViUXVlcnlHZXQpCi0gICAgICAgICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL0dldEZvcm0uanNwIjsKLSAgICAgIH0KLSAgICAgIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylzdWJRdWVyeUtleU9iamVjdDsKLSAgICB9Ci0gICAgICAKLSAgICBpZiAoc3ViUXVlcnlLZXkgPT0gbnVsbCB8fCBzdWJRdWVyeUtleS5sZW5ndGgoKSA8IDEpCi0gICAgICByZXR1cm4gInVkZGkvZm9ybXMvUmVnUHVibGlzaEZvcm0uanNwIjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gcmVnRmluZFRvb2xfLmdldEZvcm1MaW5rKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ2lzdHJ5RGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ2lzdHJ5RGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NjBmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWdpc3RyeURldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5Qcm94eUxvYWRQYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUmVnaXN0cnlEZXRhaWxzVG9vbCBleHRlbmRzIERldGFpbHNUb29sCi17Ci0gIHB1YmxpYyBSZWdpc3RyeURldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQsUHJveHlMb2FkUGFnZUFjdGlvbi5nZXRBY3Rpb25MaW5rKCJ1ZGRpL2Zvcm1zL1JlZ0RldGFpbHNGb3JtLmpzcCIpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgICBjbGVhclByb3BlcnR5VGFibGUoKTsKLSAgICB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCkodG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1JFR0lTVFJZX05BTUUscmVnRWxlbWVudC5nZXROYW1lKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWdpc3RyeU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ2lzdHJ5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjg3ODQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ2lzdHJ5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjcgICAxMzY0NDkgYnJ1bnNzZW5AdXMuaWJtLmNvbSAtIFZpbmNlIEJydW5zc2VuICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlB1Ymxpc2hlZEl0ZW1zRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUXVlcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5RdWVyeVBhcmVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFJlZ2lzdHJ5Tm9kZSBleHRlbmRzIFVERElOYXZpZ2F0b3JOb2RlCi17Ci0gIHByaXZhdGUgUmVnaXN0cnlEZXRhaWxzVG9vbCByZWdEZXRhaWxzVG9vbF87Ci0gIHByaXZhdGUgUmVnUHVibGlzaFRvb2wgcmVnUHVibGlzaFRvb2xfOwotICBwcml2YXRlIExvZ2luVG9vbCBsb2dpblRvb2xfOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfUEFUSF9TVEFOREFSRCA9ICJ1ZGRpL2ltYWdlcy9yZWdpc3RyeS5naWYiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9QQVRIX1dJVEhfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMgPSAidWRkaS9pbWFnZXMvcmVnc3RyeWNhdF9vYmouZ2lmIjsKLSAgCi0gIHB1YmxpYyBSZWdpc3RyeU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoLFN0cmluZyBpbWFnZVBhdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCxpbWFnZVBhdGgpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJJRVNfUEFSRU5UKSkKLSAgICAgICAgewotICAgICAgICAgIFF1ZXJ5UGFyZW50RWxlbWVudCBxdWVyeVBhcmVudEVsZW1lbnQgPSAoUXVlcnlQYXJlbnRFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICBjcmVhdGVDaGlsZE5vZGUocXVlcnlQYXJlbnRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1B1Ymxpc2hlZEl0ZW1zUmVsKHJlbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQdWJsaXNoZWRJdGVtc0VsZW1lbnQgcHVibGlzaGVkSXRlbXNFbGVtZW50ID0gKFB1Ymxpc2hlZEl0ZW1zRWxlbWVudClldmVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgICAgY3JlYXRlQ2hpbGROb2RlKHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBpbkJvdW5kUmVsTmFtZSA9IGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBvdXRCb3VuZFJlbE5hbWUgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgaWYgKGluQm91bmRSZWxOYW1lLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJJRVNfUEFSRU5UKSB8fCBpc1B1Ymxpc2hlZEl0ZW1zUmVsKGluQm91bmRSZWxOYW1lKSkKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgZWxzZSBpZiAob3V0Qm91bmRSZWxOYW1lLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJJRVNfUEFSRU5UKSB8fCBpc1B1Ymxpc2hlZEl0ZW1zUmVsKG91dEJvdW5kUmVsTmFtZSkpCi0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotCi0gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBlbGVtZW50LmNvbm5lY3QobmV3IFF1ZXJ5UGFyZW50RWxlbWVudCh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTk9ERV9OQU1FX1FVRVJJRVNfRk9MREVSIiksZWxlbWVudF8uZ2V0TW9kZWwoKSksVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTX1BBUkVOVCxNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIGVsZW1lbnQuY29ubmVjdChuZXcgUHVibGlzaGVkSXRlbXNFbGVtZW50KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJOT0RFX05BTUVfUFVCTElTSEVEX0JVU0lORVNTRVNfRk9MREVSIiksZWxlbWVudF8uZ2V0TW9kZWwoKSksVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfQlVTSU5FU1NFU19QQVJFTlQsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICBlbGVtZW50LmNvbm5lY3QobmV3IFB1Ymxpc2hlZEl0ZW1zRWxlbWVudChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk5PREVfTkFNRV9QVUJMSVNIRURfU0VSVklDRVNfRk9MREVSIiksZWxlbWVudF8uZ2V0TW9kZWwoKSksVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfU0VSVklDRVNfUEFSRU5ULE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgZWxlbWVudC5jb25uZWN0KG5ldyBQdWJsaXNoZWRJdGVtc0VsZW1lbnQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFX0lOVEVSRkFDRVNfRk9MREVSIiksZWxlbWVudF8uZ2V0TW9kZWwoKSksVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfU0VSVklDRV9JTlRFUkZBQ0VTX1BBUkVOVCxNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIHNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hlZEl0ZW1zUmVsKFN0cmluZyByZWwpCi0gIHsKLSAgICByZXR1cm4gcmVsLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9CVVNJTkVTU0VTX1BBUkVOVCkgfHwgcmVsLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9TRVJWSUNFU19QQVJFTlQpIHx8IHJlbC5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfU0VSVklDRV9JTlRFUkZBQ0VTX1BBUkVOVCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlQ2hpbGROb2RlKFF1ZXJ5UGFyZW50RWxlbWVudCBxdWVyeVBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBRdWVyeVBhcmVudE5vZGUgcXVlcnlQYXJlbnROb2RlID0gbmV3IFF1ZXJ5UGFyZW50Tm9kZShxdWVyeVBhcmVudEVsZW1lbnQsbm9kZU1hbmFnZXJfLG5vZGVEZXB0aF8rMSk7Ci0gICAgYWRkQ2hpbGQocXVlcnlQYXJlbnROb2RlKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVDaGlsZE5vZGUoUHVibGlzaGVkSXRlbXNFbGVtZW50IHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCkKLSAgewotICAgIFB1Ymxpc2hlZEl0ZW1zTm9kZSBwdWJsaXNoZWRJdGVtc05vZGUgPSBuZXcgUHVibGlzaGVkSXRlbXNOb2RlKHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxKTsKLSAgICBhZGRDaGlsZChwdWJsaXNoZWRJdGVtc05vZGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgcmVnRGV0YWlsc1Rvb2xfID0gbmV3IFJlZ2lzdHJ5RGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfICx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1JFR0lTVFJZX0RFVEFJTFMiKSk7Ci0gICAgUmVnRmluZFRvb2wgcmVnRmluZFRvb2wgPSBuZXcgUmVnRmluZFRvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfRklORCIpKTsKLSAgICByZWdQdWJsaXNoVG9vbF8gPSBuZXcgUmVnUHVibGlzaFRvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfUFVCTElTSCIpKTsKLSAgICBsb2dpblRvb2xfID0gbmV3IExvZ2luVG9vbCh0b29sTWFuYWdlcl8sIHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTE9HSU4iKSk7Ci0gICAgbmV3IEFkZFRvRmF2b3JpdGVzVG9vbCh0b29sTWFuYWdlcl8sdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfVE9fRkFWT1JJVEVTIikpOwotICAgIHJlZ0ZpbmRUb29sLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcygoUmVnaXN0cnlFbGVtZW50KWVsZW1lbnRfKTsKLSAgICByZWdQdWJsaXNoVG9vbF8uYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF8pOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgUmVnaXN0cnlEZXRhaWxzVG9vbCBnZXRSZWdEZXRhaWxzVG9vbCgpCi0gIHsKLSAgICByZXR1cm4gcmVnRGV0YWlsc1Rvb2xfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFJlZ1B1Ymxpc2hUb29sIGdldFJlZ1B1Ymxpc2hUb29sKCkKLSAgewotICAgIHJldHVybiByZWdQdWJsaXNoVG9vbF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTG9naW5Ub29sIGdldExvZ2luVG9vbCgpCi0gIHsKLSAgICByZXR1cm4gbG9naW5Ub29sXzsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBhZGREaXNjb3ZlcmVkTm9kZXMoVmVjdG9yIGFsbE5vZGVzLE5vZGUgcXVlcnlQYXJlbnROb2RlLGludCBxdWVyeVR5cGUpCi0gIHsKLSAgICBWZWN0b3IgcXVlcnlOb2RlcyA9IHF1ZXJ5UGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8cXVlcnlOb2Rlcy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIFF1ZXJ5Tm9kZSBxdWVyeU5vZGUgPSAoUXVlcnlOb2RlKXF1ZXJ5Tm9kZXMuZWxlbWVudEF0KGkpOwotICAgICAgUXVlcnlFbGVtZW50IHF1ZXJ5RWxlbWVudCA9IChRdWVyeUVsZW1lbnQpcXVlcnlOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBpZiAocXVlcnlUeXBlID09IFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9RVUVSSUVTKQotICAgICAgICBhbGxOb2Rlcy5hZGRFbGVtZW50KHF1ZXJ5Tm9kZSk7Ci0gICAgICBlbHNlIGlmIChxdWVyeUVsZW1lbnQuZ2V0UXVlcnlUeXBlKCkgPT0gcXVlcnlUeXBlKQotICAgICAgewotICAgICAgICBWZWN0b3IgZGlzY292ZXJlZE5vZGVzID0gcXVlcnlOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaj0wO2o8ZGlzY292ZXJlZE5vZGVzLnNpemUoKTtqKyspCi0gICAgICAgICAgYWxsTm9kZXMuYWRkRWxlbWVudChkaXNjb3ZlcmVkTm9kZXMuZWxlbWVudEF0KGopKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkUHVibGlzaGVkTm9kZXMoVmVjdG9yIGFsbE5vZGVzLE5vZGUgcHVibGlzaGVkSXRlbXNOb2RlKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1Ob2RlcyA9IHB1Ymxpc2hlZEl0ZW1zTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8aXRlbU5vZGVzLnNpemUoKTtpKyspCi0gICAgICBhbGxOb2Rlcy5hZGRFbGVtZW50KGl0ZW1Ob2Rlcy5lbGVtZW50QXQoaSkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZ2V0QWxsQnVzaW5lc3NOb2RlcyhWZWN0b3IgYWxsQnVzaW5lc3NOb2RlcykKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHF1ZXJ5UGFyZW50Tm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFF1ZXJ5UGFyZW50RWxlbWVudCgpKTsKLSAgICBOb2RlIHB1Ymxpc2hlZEJ1c2luZXNzZXNOb2RlID0gZ2V0Q2hpbGROb2RlKHJlZ0VsZW1lbnQuZ2V0UHVibGlzaGVkQnVzaW5lc3Nlc0VsZW1lbnQoKSk7Ci0gICAgYWRkRGlzY292ZXJlZE5vZGVzKGFsbEJ1c2luZXNzTm9kZXMscXVlcnlQYXJlbnROb2RlLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKTsKLSAgICBhZGRQdWJsaXNoZWROb2RlcyhhbGxCdXNpbmVzc05vZGVzLHB1Ymxpc2hlZEJ1c2luZXNzZXNOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGdldEFsbFNlcnZpY2VOb2RlcyhWZWN0b3IgYWxsU2VydmljZXNOb2RlcykKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHF1ZXJ5UGFyZW50Tm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFF1ZXJ5UGFyZW50RWxlbWVudCgpKTsKLSAgICBOb2RlIHB1Ymxpc2hlZFNlcnZpY2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VzRWxlbWVudCgpKTsKLSAgICBhZGREaXNjb3ZlcmVkTm9kZXMoYWxsU2VydmljZXNOb2RlcyxxdWVyeVBhcmVudE5vZGUsVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKTsKLSAgICBhZGRQdWJsaXNoZWROb2RlcyhhbGxTZXJ2aWNlc05vZGVzLHB1Ymxpc2hlZFNlcnZpY2VzTm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBnZXRBbGxTZXJ2aWNlSW50ZXJmYWNlTm9kZXMoVmVjdG9yIGFsbFNlcnZpY2VJbnRlcmZhY2VOb2RlcykKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHF1ZXJ5UGFyZW50Tm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFF1ZXJ5UGFyZW50RWxlbWVudCgpKTsKLSAgICBOb2RlIHB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzRWxlbWVudCgpKTsKLSAgICBhZGREaXNjb3ZlcmVkTm9kZXMoYWxsU2VydmljZUludGVyZmFjZU5vZGVzLHF1ZXJ5UGFyZW50Tm9kZSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgICBhZGRQdWJsaXNoZWROb2RlcyhhbGxTZXJ2aWNlSW50ZXJmYWNlTm9kZXMscHVibGlzaGVkU2VydmljZUludGVyZmFjZXNOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGdldFB1Ymxpc2hlZEJ1c2luZXNzTm9kZXMoVmVjdG9yIHB1Ymxpc2hlZEJ1c2luZXNzTm9kZXMpCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF87Ci0gICAgTm9kZSBwdWJsaXNoZWRCdXNpbmVzc2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZEJ1c2luZXNzZXNFbGVtZW50KCkpOwotICAgIGFkZFB1Ymxpc2hlZE5vZGVzKHB1Ymxpc2hlZEJ1c2luZXNzTm9kZXMscHVibGlzaGVkQnVzaW5lc3Nlc05vZGUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZ2V0UHVibGlzaGVkU2VydmljZU5vZGVzKFZlY3RvciBwdWJsaXNoZWRTZXJ2aWNlTm9kZXMpCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF87Ci0gICAgTm9kZSBwdWJsaXNoZWRTZXJ2aWNlc05vZGUgPSBnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRQdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQoKSk7Ci0gICAgYWRkUHVibGlzaGVkTm9kZXMocHVibGlzaGVkU2VydmljZU5vZGVzLHB1Ymxpc2hlZFNlcnZpY2VzTm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBnZXRQdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlTm9kZXMoVmVjdG9yIHB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VOb2RlcykKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzRWxlbWVudCgpKTsKLSAgICBhZGRQdWJsaXNoZWROb2RlcyhwdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlTm9kZXMscHVibGlzaGVkU2VydmljZUludGVyZmFjZXNOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGdldERpc2NvdmVyZWROb2RlcyhWZWN0b3IgZGlzY292ZXJlZE5vZGVzLGludCBxdWVyeUl0ZW0pCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF87Ci0gICAgTm9kZSBxdWVyeVBhcmVudE5vZGUgPSBnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRRdWVyeVBhcmVudEVsZW1lbnQoKSk7Ci0gICAgYWRkRGlzY292ZXJlZE5vZGVzKGRpc2NvdmVyZWROb2RlcyxxdWVyeVBhcmVudE5vZGUscXVlcnlJdGVtKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNRdWVyeVJlc3VsdHMoTm9kZSBxdWVyeVBhcmVudE5vZGUsaW50IHF1ZXJ5VHlwZSkKLSAgewotICAgIFZlY3RvciBxdWVyaWVzID0gcXVlcnlQYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpPTA7aTxxdWVyaWVzLnNpemUoKTtpKyspCi0gICAgewotICAgICAgUXVlcnlOb2RlIHF1ZXJ5Tm9kZSA9IChRdWVyeU5vZGUpcXVlcmllcy5lbGVtZW50QXQoaSk7Ci0gICAgICBpZiAocXVlcnlOb2RlLmdldENoaWxkTm9kZXMoKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBRdWVyeUVsZW1lbnQgcXVlcnlFbGVtZW50ID0gKFF1ZXJ5RWxlbWVudClxdWVyeU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHF1ZXJ5RWxlbWVudC5nZXRRdWVyeVR5cGUoKSA9PSBxdWVyeVR5cGUpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0J1c2luZXNzKCkKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHB1Ymxpc2hlZEJ1c2luZXNzZXNOb2RlID0gZ2V0Q2hpbGROb2RlKHJlZ0VsZW1lbnQuZ2V0UHVibGlzaGVkQnVzaW5lc3Nlc0VsZW1lbnQoKSk7Ci0gICAgaWYgKHB1Ymxpc2hlZEJ1c2luZXNzZXNOb2RlLmdldENoaWxkTm9kZXMoKS5zaXplKCkgPiAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGhhc1F1ZXJ5UmVzdWx0cyhnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRRdWVyeVBhcmVudEVsZW1lbnQoKSksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzU2VydmljZSgpCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF87Ci0gICAgTm9kZSBwdWJsaXNoZWRTZXJ2aWNlc05vZGUgPSBnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRQdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQoKSk7Ci0gICAgaWYgKHB1Ymxpc2hlZFNlcnZpY2VzTm9kZS5nZXRDaGlsZE5vZGVzKCkuc2l6ZSgpID4gMCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBoYXNRdWVyeVJlc3VsdHMoZ2V0Q2hpbGROb2RlKHJlZ0VsZW1lbnQuZ2V0UXVlcnlQYXJlbnRFbGVtZW50KCkpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNTZXJ2aWNlSW50ZXJmYWNlKCkKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzRWxlbWVudCgpKTsKLSAgICBpZiAocHVibGlzaGVkU2VydmljZUludGVyZmFjZXNOb2RlLmdldENoaWxkTm9kZXMoKS5zaXplKCkgPiAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGhhc1F1ZXJ5UmVzdWx0cyhnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRRdWVyeVBhcmVudEVsZW1lbnQoKSksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1Jlc3VsdHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZXN1bHRzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWE3NjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1Jlc3VsdHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5Qcm94eUxvYWRQYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5TZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFJlc3VsdHNUb29sIGV4dGVuZHMgRm9ybVRvb2wKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZm9ybUxpbmtfOwotCi0gIHB1YmxpYyBSZXN1bHRzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsImltYWdlcy9kZXRhaWxzX2VuYWJsZWQuZ2lmIiwiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIixhbHQpOwotICAgIGZvcm1MaW5rXyA9IFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygidWRkaS9mb3Jtcy9SZXN1bHRzRm9ybS5qc3AiKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuIGZvcm1MaW5rXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUm9vdENhdGVnb3J5Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUm9vdENhdGVnb3J5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGM0MjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1Jvb3RDYXRlZ29yeU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESU1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5DYXRlZ29yeUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBSb290Q2F0ZWdvcnlOb2RlIGV4dGVuZHMgTm9kZQotewotICBwdWJsaWMgUm9vdENhdGVnb3J5Tm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlciwxLCJpbWFnZXMvcm9vdF9tYWluLmdpZiIpOwotICAgIHNldFZpc2liaWxpdHlPZkNoaWxkcmVuKHRydWUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQ2hpbGRyZW4oKQotICB7Ci0gICAgRW51bWVyYXRpb24gY2hpbGRyZW4gPSBlbGVtZW50Xy5nZXRFbGVtZW50cyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1NVQkNBVEVHT1JJRVMpOwotICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHdoaWxlIChjaGlsZHJlbi5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgQ2F0ZWdvcnlFbGVtZW50IGNhdGVnb3J5RWxlbWVudCA9IChDYXRlZ29yeUVsZW1lbnQpY2hpbGRyZW4ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgQ2F0ZWdvcnlOb2RlIGNhdGVnb3J5Tm9kZSA9IG5ldyBDYXRlZ29yeU5vZGUoY2F0ZWdvcnlFbGVtZW50LG5vZGVNYW5hZ2VyXyxub2RlRGVwdGhfKzEpOwotICAgICAgICBhZGRDaGlsZChjYXRlZ29yeU5vZGUpOwotICAgICAgICBjYXRlZ29yeU5vZGUuY3JlYXRlQ2hpbGRyZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBSb290IG5vZGU6IG5vIG5lZWQgZm9yIHRvZ2dsZSBhY3Rpb24uCi0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8vIFRleHQgb25seSBub2RlLgotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU2VydmljZURldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzBiNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU2VydmljZURldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlByb3h5TG9hZFBhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlNlcnZpY2VFbGVtZW50OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZURldGFpbHNUb29sIGV4dGVuZHMgRGV0YWlsc1Rvb2wKLXsKLSAgcHVibGljIFNlcnZpY2VEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0LFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygidWRkaS9mb3Jtcy9TZXJ2aWNlRGV0YWlsc0Zvcm0uanNwIikpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICAgIGNsZWFyUHJvcGVydHlUYWJsZSgpOwotICAgIHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCk7Ci0gICAgU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoU2VydmljZUVsZW1lbnQpKHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgQnVzaW5lc3NTZXJ2aWNlIGJ1c1NlcnZpY2UgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLQotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSxidXNTZXJ2aWNlLmdldFNlcnZpY2VLZXkoKSk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSxidXNTZXJ2aWNlLmdldEJ1c2luZXNzS2V5KCkpOwotCi0gICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY29weUluZGV4VmVjdG9yKGJ1c1NlcnZpY2UuZ2V0TmFtZVZlY3RvcigpLG5hbWVWZWN0b3IpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxuYW1lVmVjdG9yKTsKLQotICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBjb3B5SW5kZXhWZWN0b3IoYnVzU2VydmljZS5nZXREZXNjcmlwdGlvblZlY3RvcigpLGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TLGRlc2NyaXB0aW9uVmVjdG9yKTsKLQotICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IGJ1c1NlcnZpY2UuZ2V0Q2F0ZWdvcnlCYWcoKTsKLSAgICBpZiAoY2F0QmFnICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIGNhdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGNvcHlJbmRleFZlY3RvcihjYXRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKSxjYXRWZWN0b3IpOwotICAgICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMsY2F0VmVjdG9yKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCkKLSAgewotICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcmVnRWxlbWVudC5nZXRQdWJsaXNoVVJMKCk7Ci0gICAgU3RyaW5nIHVzZXJJZCA9IHJlZ0VsZW1lbnQuZ2V0VXNlcklkKCk7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gcmVnRWxlbWVudC5nZXRDcmVkKCk7Ci0KLSAgICBpZiAocHVibGlzaFVSTCA9PSBudWxsKQotICAgICAgcHVibGlzaFVSTCA9ICIiOwotICAgIGlmICh1c2VySWQgPT0gbnVsbCkKLSAgICAgIHVzZXJJZCA9ICIiOwotICAgIGlmIChwYXNzd29yZCA9PSBudWxsKQotICAgICAgcGFzc3dvcmQgPSAiIjsKLQotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU2VydmljZUludGVyZmFjZURldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3MGU5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuUHJveHlMb2FkUGFnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5TZXJ2aWNlSW50ZXJmYWNlRWxlbWVudDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5JZGVudGlmaWVyQmFnOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUludGVyZmFjZURldGFpbHNUb29sIGV4dGVuZHMgRGV0YWlsc1Rvb2wKLXsKLSAgcHVibGljIFNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0LFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygidWRkaS9mb3Jtcy9TZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Zvcm0uanNwIikpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICAgIGNsZWFyUHJvcGVydHlUYWJsZSgpOwotICAgIHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCk7Ci0gICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KSh0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldFRyZWVFbGVtZW50KCkpOwotICAgIFRNb2RlbCB0TW9kZWwgPSBzaUVsZW1lbnQuZ2V0VE1vZGVsKCk7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZLHRNb2RlbC5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgTGlzdEVsZW1lbnQgbmFtZUxpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHRNb2RlbC5nZXROYW1lU3RyaW5nKCkpOwotICAgIG5hbWVMaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8oLTEsLTEsMCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLG5hbWVMaXN0RWxlbWVudCk7Ci0KLSAgICBWZWN0b3IgZGVzY3JpcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY29weUluZGV4VmVjdG9yKHRNb2RlbC5nZXREZXNjcmlwdGlvblZlY3RvcigpLGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyxkZXNjcmlwdGlvblZlY3Rvcik7Ci0KLSAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gdE1vZGVsLmdldElkZW50aWZpZXJCYWcoKTsKLSAgICBpZiAoaWRCYWcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgaWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBjb3B5SW5kZXhWZWN0b3IoaWRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKSxpZFZlY3Rvcik7Ci0gICAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTLGlkVmVjdG9yKTsKLSAgICB9Ci0KLSAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSB0TW9kZWwuZ2V0Q2F0ZWdvcnlCYWcoKTsKLSAgICBpZiAoY2F0QmFnICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIGNhdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGNvcHlJbmRleFZlY3RvcihjYXRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKSxjYXRWZWN0b3IpOwotICAgICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTLGNhdFZlY3Rvcik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcmVnRWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSByZWdFbGVtZW50LmdldENyZWQoKTsKLQotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgaWYgKHVzZXJJZCA9PSBudWxsKQotICAgICAgdXNlcklkID0gIiI7Ci0gICAgaWYgKHBhc3N3b3JkID09IG51bGwpCi0gICAgICBwYXNzd29yZCA9ICIiOwotCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VJbnRlcmZhY2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TZXJ2aWNlSW50ZXJmYWNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ZjYTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VJbnRlcmZhY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5TZXJ2aWNlSW50ZXJmYWNlR2V0U2VydmljZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VJbnRlcmZhY2VOb2RlIGV4dGVuZHMgVURESU5hdmlnYXRvck5vZGUKLXsKLSAgcHJpdmF0ZSBEZXRhaWxzVG9vbCBkZXRhaWxzVG9vbF87Ci0gIHByaXZhdGUgVW5wdWJsaXNoVG9vbCB1bnB1Ymxpc2hUb29sXzsKLSAgcHVibGljIFNlcnZpY2VJbnRlcmZhY2VOb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsaW50IG5vZGVEZXB0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlX2ludGVyZmFjZV9oaWdobGlnaHRlZC5naWYiKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRUb29scygpCi0gIHsKLSAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIGRldGFpbHNUb29sXyA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUyIpKTsKLSAgICBuZXcgR2V0U2VydmljZXNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0dFVF9TRVJWSUNFUyIpLFNlcnZpY2VJbnRlcmZhY2VHZXRTZXJ2aWNlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8pKTsKLSAgICBuZXcgR2V0QnVzaW5lc3Nlc1Rvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL2J1c2luZXNzZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9HRVRfQlVTSU5FU1NFUyIpLFNlcnZpY2VJbnRlcmZhY2VHZXRCdXNpbmVzc2VzQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXykpOwotICAgIG5ldyBVRERJSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbCh0b29sTWFuYWdlcl8sY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIikpOwotICAgIG5ldyBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wodG9vbE1hbmFnZXJfLGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1dTRExfSU1QT1JUX1RPX0ZTIikpOwotICAgIG5ldyBVRERJTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wodG9vbE1hbmFnZXJfLGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQiKSk7Ci0gICAgbmV3IEFkZFRvRmF2b3JpdGVzVG9vbCh0b29sTWFuYWdlcl8sIHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQUREX1RPX0ZBVk9SSVRFUyIpKTsKLSAgICB1bnB1Ymxpc2hUb29sXyA9IG5ldyBVbnB1Ymxpc2hUb29sKHRvb2xNYW5hZ2VyXywidWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9VTlBVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0UiKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCkKLSAgewotICAgIGRldGFpbHNUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gICAgdW5wdWJsaXNoVG9vbF8uYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKHJlZ0VsZW1lbnQpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdTRExVUkxGcm9tRGV0YWlsc1Rvb2woKQotICB7Ci0gICAgTGlzdEVsZW1lbnQgd3NkbFVSTExpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWRldGFpbHNUb29sXy5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsKLSAgICBpZiAod3NkbFVSTExpc3RFbGVtZW50ICE9IG51bGwpCi0gICAgICByZXR1cm4gKFN0cmluZyl3c2RsVVJMTGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICJ0ZW1wLndzZGwiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TZXJ2aWNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU2VydmljZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjMGE1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TZXJ2aWNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlcnZpY2VHZXRCdXNpbmVzc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuUmVnaXN0cnlFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZU5vZGUgZXh0ZW5kcyBVRERJTmF2aWdhdG9yTm9kZQotewotICBwcml2YXRlIERldGFpbHNUb29sIGRldGFpbHNUb29sXzsKLSAgcHJpdmF0ZSBVbnB1Ymxpc2hUb29sIHVucHVibGlzaFRvb2xfOwotICBwdWJsaWMgU2VydmljZU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsInVkZGkvaW1hZ2VzL3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBkZXRhaWxzVG9vbF8gPSBuZXcgU2VydmljZURldGFpbHNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NFUlZJQ0VfREVUQUlMUyIpKTsKLSAgICBuZXcgR2V0QnVzaW5lc3Nlc1Rvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9idXNpbmVzc19lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9HRVRfQlVTSU5FU1MiKSxTZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWRfKSk7Ci0gICAgbmV3IEdldFNlcnZpY2VJbnRlcmZhY2VzVG9vbCh0b29sTWFuYWdlcl8sdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9HRVRfU0VSVklDRV9JTlRFUkZBQ0VTIiksU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXykpOwotICAgIG5ldyBVRERJSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbCh0b29sTWFuYWdlcl8sY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIikpOwotICAgIG5ldyBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wodG9vbE1hbmFnZXJfLGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1dTRExfSU1QT1JUX1RPX0ZTIikpOwotICAgIG5ldyBVRERJTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wodG9vbE1hbmFnZXJfLGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQiKSk7Ci0gICAgbmV3IFVERElBZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgbmV3IEFkZFRvRmF2b3JpdGVzVG9vbCh0b29sTWFuYWdlcl8sdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfVE9fRkFWT1JJVEVTIikpOwotICAgIHVucHVibGlzaFRvb2xfID0gbmV3IFVucHVibGlzaFRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy91bnB1Ymxpc2hfc2VydmljZV9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9VTlBVQkxJU0hfU0VSVklDRSIpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgZGV0YWlsc1Rvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgICB1bnB1Ymxpc2hUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdTRExVUkxGcm9tRGV0YWlsc1Rvb2woKQotICB7Ci0gICAgTGlzdEVsZW1lbnQgd3NkbFVSTExpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWRldGFpbHNUb29sXy5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpOwotICAgIGlmICh3c2RsVVJMTGlzdEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHJldHVybiAoU3RyaW5nKXdzZGxVUkxMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gInRlbXAud3NkbCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1N1YlF1ZXJ5S2V5UHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1N1YlF1ZXJ5S2V5UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxMTU0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TdWJRdWVyeUtleVByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBTdWJRdWVyeUtleVByb3BlcnR5Ci17Ci0gIHByaXZhdGUgU3RyaW5nIHN1YlF1ZXJ5S2V5XzsKLQotICBwdWJsaWMgU3ViUXVlcnlLZXlQcm9wZXJ0eSgpCi0gIHsKLSAgICBzdWJRdWVyeUtleV8gPSAiIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFN1YlF1ZXJ5S2V5KFN0cmluZyBzdWJRdWVyeUtleSkKLSAgewotICAgIHN1YlF1ZXJ5S2V5XyA9IHN1YlF1ZXJ5S2V5OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdWJRdWVyeUtleSgpCi0gIHsKLSAgICByZXR1cm4gc3ViUXVlcnlLZXlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TdWJRdWVyeVRyYW5zZmVyVGFyZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TdWJRdWVyeVRyYW5zZmVyVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDgyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU3ViUXVlcnlUcmFuc2ZlclRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVmlld1Rvb2w7Ci0KLXB1YmxpYyBjbGFzcyBTdWJRdWVyeVRyYW5zZmVyVGFyZ2V0Ci17Ci0gIHByaXZhdGUgaW50IG5vZGVJZF87Ci0gIHByaXZhdGUgaW50IHRvb2xJZF87Ci0gIHByaXZhdGUgaW50IHZpZXdJZF87Ci0gIHByaXZhdGUgaW50IHZpZXdUb29sSWRfOwotICBwcml2YXRlIFN0cmluZyBzdWJRdWVyeUtleV87Ci0gIHByaXZhdGUgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBIYXNodGFibGUgcGFyZW50UXVlcnlEYXRhXzsKLQotICBwdWJsaWMgU3ViUXVlcnlUcmFuc2ZlclRhcmdldChOb2RlIG5vZGUsU3RyaW5nIHN1YlF1ZXJ5S2V5LEhhc2h0YWJsZSBwYXJlbnRRdWVyeURhdGEpCi0gIHsKLSAgICBub2RlSWRfID0gbm9kZS5nZXROb2RlSWQoKTsKLSAgICB0b29sSWRfID0gbm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCk7Ci0gICAgdmlld0lkXyA9IG5vZGUuZ2V0Vmlld0lkKCk7Ci0gICAgdmlld1Rvb2xJZF8gPSBub2RlLmdldFZpZXdUb29sSWQoKTsKLSAgICBzdWJRdWVyeUtleV8gPSBzdWJRdWVyeUtleTsKLSAgICBub2RlTWFuYWdlcl8gPSBub2RlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgcGFyZW50UXVlcnlEYXRhXyA9IHBhcmVudFF1ZXJ5RGF0YTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Tm9kZUlkKCkKLSAgewotICAgIHJldHVybiBub2RlSWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRUb29sSWQoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xJZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFZpZXdJZCgpCi0gIHsKLSAgICByZXR1cm4gdmlld0lkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Vmlld1Rvb2xJZCgpCi0gIHsKLSAgICByZXR1cm4gdmlld1Rvb2xJZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN1YlF1ZXJ5S2V5KCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUtleV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgRm9ybVRvb2wgZ2V0VGFyZ2V0Rm9ybVRvb2woKQotICB7Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkXyk7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgVG9vbCB0b29sID0gbm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFRvb2wodG9vbElkXyk7Ci0KLSAgICBpZiAodmlld0lkXyAhPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgewotICAgICAgVmlld1Rvb2wgdmlld1Rvb2wgPSAoVmlld1Rvb2wpdG9vbDsKLSAgICAgIFRvb2xNYW5hZ2VyIHZpZXdUb29sTWFuYWdlciA9IHZpZXdUb29sLmdldFRvb2xNYW5hZ2VyKHZpZXdJZF8pOwotICAgICAgaWYgKHZpZXdUb29sTWFuYWdlciAhPSBudWxsKQotICAgICAgICB0b29sID0gdmlld1Rvb2xNYW5hZ2VyLmdldFRvb2wodmlld1Rvb2xJZF8pOwotICAgICAgZWxzZQotICAgICAgICB0b29sID0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIChGb3JtVG9vbCl0b29sOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgSGFzaHRhYmxlIGdldFBhcmVudFF1ZXJ5RGF0YSgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50UXVlcnlEYXRhXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2E2OGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElBZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5VRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBVRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sIGV4dGVuZHMgQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sIHsKLSAgcHVibGljIFVERElBZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gVURESUFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmE3YmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkltcG9ydFRvRmlsZVN5c3RlbVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbjsKLQotcHVibGljIGNsYXNzIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbCBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbVRvb2wKLXsKLSAgcHVibGljIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluaygpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzY4M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5JbXBvcnRUb1dvcmtiZW5jaFRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBVRERJSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbCBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoVG9vbAotewotICBwdWJsaWMgVURESUltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIHJldHVybiAidWRkaS9mb3Jtcy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoRm9ybS5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjQzMmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sIGV4dGVuZHMgTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wKLXsKLSAgcHVibGljIFVERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL1VERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJTWFpbk5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElNYWluTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmVkODllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElNYWluTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESU1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlVERElNYWluRWxlbWVudDsKLQotLy8gUm9vdCBub2RlIGZvciB0aGUgVURESSBOYXZpZ2F0b3IgVHJlZSBWaWV3Ci1wdWJsaWMgY2xhc3MgVURESU1haW5Ob2RlIGV4dGVuZHMgVURESU5hdmlnYXRvck5vZGUKLXsKLSAgcHVibGljIFVERElNYWluTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlciwxLCJpbWFnZXMvcm9vdF9tYWluLmdpZiIpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1JFR0lTVFJJRVMpKQotICAgICAgICB7Ci0gICAgICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ2lzdHJ5RWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICAgIFVERElNYWluRWxlbWVudCB1ZGRpTWFpbkVsZW1lbnQgPSAoVURESU1haW5FbGVtZW50KWVsZW1lbnRfOwotICAgICAgICAgIHVkZGlNYWluRWxlbWVudC5hZGRSZWdpc3RyeU5hbWUocmVnaXN0cnlFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgY3JlYXRlQ2hpbGROb2RlKHJlZ2lzdHJ5RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgUmVnaXN0cnlFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1JFR0lTVFJJRVMpKQotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUkVHSVNUUklFUykpCi0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBVRERJTWFpbkVsZW1lbnQgdWRkaU1haW5FbGVtZW50ID0gKFVERElNYWluRWxlbWVudCllbGVtZW50XzsKLSAgICAgICAgICB1ZGRpTWFpbkVsZW1lbnQucmVtb3ZlUmVnaXN0cnlOYW1lKGNoaWxkRWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICAgIHJlbW92ZUNoaWxkTm9kZShjaGlsZEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlQ2hpbGROb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudDsKLSAgICBFbnVtZXJhdGlvbiB1c2VyRGVmaW5lZENhdGVnb3JpZXMgPSByZWdFbGVtZW50LmdldFVzZXJEZWZpbmVkQ2F0ZWdvcmllcygpOwotICAgIFN0cmluZyBpbWFnZVBhdGg7Ci0gICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyAhPSBudWxsICYmIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIGltYWdlUGF0aCA9IFJlZ2lzdHJ5Tm9kZS5JTUFHRV9QQVRIX1dJVEhfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVM7Ci0gICAgZWxzZQotICAgICAgaW1hZ2VQYXRoID0gUmVnaXN0cnlOb2RlLklNQUdFX1BBVEhfU1RBTkRBUkQ7Ci0gICAgCi0gICAgUmVnaXN0cnlOb2RlIHJlZ05vZGUgPSBuZXcgUmVnaXN0cnlOb2RlKGVsZW1lbnQsbm9kZU1hbmFnZXJfLG5vZGVEZXB0aF8rMSxpbWFnZVBhdGgpOwotICAgIGFkZENoaWxkKHJlZ05vZGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgbmV3IE9wZW5SZWdpc3RyeVRvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfT1BFTl9SRUdJU1RSWSIpKTsKLSAgfQotICAKLSAgLy8gR2l2ZW4gYSBub2RlIHVuZGVyIGEgcGFydGljdWxhciByZWdpc3RyeSBub2RlLCBvYnRhaW4gdGhlIHJlZ2lzdHJ5IG5vZGUuCi0gIHB1YmxpYyBmaW5hbCBSZWdpc3RyeU5vZGUgZ2V0UmVnaXN0cnlOb2RlKE5vZGUgY3VycmVudE5vZGUpCi0gIHsKLSAgICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IG51bGw7Ci0gICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgUmVnaXN0cnlOb2RlKQotICAgIHsKLSAgICAgIHJlZ05vZGUgPSAoUmVnaXN0cnlOb2RlKWN1cnJlbnROb2RlOwotICAgIH0KLSAgICBlbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFF1ZXJ5Tm9kZSkKLSAgICB7Ci0gICAgICAvLyBRdWVyeSAtPiBRdWVyeSBmb2xkZXIgLT4gUmVnaXN0cnkKLSAgICAgIHJlZ05vZGUgPSAoUmVnaXN0cnlOb2RlKShjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgUXVlcnlQYXJlbnROb2RlIHx8IGN1cnJlbnROb2RlIGluc3RhbmNlb2YgUHVibGlzaGVkSXRlbXNOb2RlKQotICAgIHsKLSAgICAgIC8vIFF1ZXJ5IGZvbGRlciAtPiBSZWdpc3RyeQotICAgICAgcmVnTm9kZSA9IChSZWdpc3RyeU5vZGUpKGN1cnJlbnROb2RlLmdldFBhcmVudCgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBCdXNpbmVzc05vZGUgfHwgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBTZXJ2aWNlTm9kZSB8fCBjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VOb2RlKQotICAgIHsKLSAgICAgIC8vIGl0ZW1Ob2RlIC0+IFB1Ymxpc2hlZCBJdGVtcyBmb2xkZXIgLT4gUmVnaXN0cnkKLSAgICAgIC8vIE9SOgotICAgICAgLy8gaXRlbU5vZGUgLT4gUXVlcnlOb2RlIC0+IFF1ZXJ5IGZvbGRlciAtPiBSZWdpc3RyeQotICAgICAgTm9kZSBwYXJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIFF1ZXJ5Tm9kZSkKLSAgICAgICAgcmVnTm9kZSA9IChSZWdpc3RyeU5vZGUpKHBhcmVudE5vZGUuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkpOwotICAgICAgZWxzZQotICAgICAgICByZWdOb2RlID0gKFJlZ2lzdHJ5Tm9kZSlwYXJlbnROb2RlLmdldFBhcmVudCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVnTm9kZTsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElOYXZpZ2F0b3JGb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJTmF2aWdhdG9yRm9sZGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJmNGNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElOYXZpZ2F0b3JGb2xkZXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb2xkZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5Ub2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVURESU5hdmlnYXRvckZvbGRlck5vZGUgZXh0ZW5kcyBGb2xkZXJOb2RlCi17Ci0gIHB1YmxpYyBVRERJTmF2aWdhdG9yRm9sZGVyTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLgotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25IcmVmKCkKLSAgewotICAgIHJldHVybiBUb2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxpc09wZW5fKTsKLSAgfQotCi0gIC8vIHVkZGkvYWN0aW9ucy9TZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TGlua0FjdGlvbkhyZWYoKQotICB7Ci0gICAgcmV0dXJuIFNlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWRfLGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESU5hdmlnYXRvck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElOYXZpZ2F0b3JOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTlhYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESU5hdmlnYXRvck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlRvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFVERElOYXZpZ2F0b3JOb2RlIGV4dGVuZHMgTm9kZQotewotICBwdWJsaWMgVURESU5hdmlnYXRvck5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoLFN0cmluZyBpbWFnZVBhdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCxpbWFnZVBhdGgpOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1RvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24uanNwP25vZGVJZD0uLi4KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUb2dnbGVOb2RlQWN0aW9uSHJlZigpCi0gIHsKLSAgICByZXR1cm4gVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8saXNPcGVuXyk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLgotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCkKLSAgewotICAgIHJldHVybiBTZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESVBlcnNwZWN0aXZlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2OGRiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjI0ICAgMTIyNzUyIGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLmZhdm9yaXRlcy5GYXZvcml0ZXNSZWdpc3RyeVR5cGVEZWZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkFkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzTWFpbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5PcGVuUmVnaXN0cnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5SZWdGaW5kU2VydmljZVVVSURBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5Td2l0Y2hQZXJzcGVjdGl2ZUZyb21VRERJQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5DYXRlZ29yeU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlVERElNYWluRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5VUkxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXMuSUZhdm9yaXRlc1VERElSZWdpc3RyeTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBVRERJUGVyc3BlY3RpdmUgZXh0ZW5kcyBQZXJzcGVjdGl2ZQotewotICBwcml2YXRlIEhhc2h0YWJsZSBrbm93blJlZ2lzdHJpZXNfOwotICBwcml2YXRlIElGYXZvcml0ZXNVRERJUmVnaXN0cnkgZGVmYXVsdFVERElSZWdpc3RyeV87Ci0gIHByaXZhdGUgTW9kZWwgbmF2aWdhdG9yTW9kZWxfOwotICBwcml2YXRlIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXJfOwotICBwcml2YXRlIGludCB3c2RsVHlwZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGNhdGVnb3J5TWFuYWdlcnNfOwotICBTdHJpbmcgY2F0ZWdvcnlUTW9kZWxLZXlfOwotICAKLSAgLy8gV2luZG93IHNpemVzCi0gIHByaXZhdGUgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gIHByaXZhdGUgU3RyaW5nIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0gIHByaXZhdGUgU3RyaW5nIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0KLSAgcHVibGljIFVERElQZXJzcGVjdGl2ZShDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcigidWRkaSIsY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBpbml0UGVyc3BlY3RpdmUoU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gIHsKLSAgICBTdHJpbmcgZGVmYXVsdEZhdm9yaXRlcyA9IGNvbnRyb2xsZXJfLmdldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbigpOwotCUZhdm9yaXRlc1JlZ2lzdHJ5VHlwZURlZmF1bHQgZmF2UmVnVHlwZURlZmF1bHQgPSBuZXcgRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdChkZWZhdWx0RmF2b3JpdGVzKTsKLSAgICBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5W10gZmF2UmVnaXN0cmllc0RlZmF1bHQgPSBmYXZSZWdUeXBlRGVmYXVsdC5nZXRGYXZvcml0ZXNVRERJUmVnaXN0cmllcygpOwotICAgIGtub3duUmVnaXN0cmllc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8ZmF2UmVnaXN0cmllc0RlZmF1bHQubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBrbm93blJlZ2lzdHJpZXNfLnB1dChmYXZSZWdpc3RyaWVzRGVmYXVsdFtpXS5nZXRJbnF1aXJ5VVJMKCksZmF2UmVnaXN0cmllc0RlZmF1bHRbaV0pOwotICAgIH0KLSAgICBpZiAoZmF2UmVnaXN0cmllc0RlZmF1bHQubGVuZ3RoID4gMCkKLSAgICAgIGRlZmF1bHRVRERJUmVnaXN0cnlfID0gZmF2UmVnaXN0cmllc0RlZmF1bHRbMF07Ci0gICAgCi0gICAgbmF2aWdhdG9yTW9kZWxfID0gbmV3IEJhc2ljTW9kZWwoInVkZGlNb2RlbCIpOwotICAgIFVERElNYWluRWxlbWVudCB1ZGRpTWFpbkVsZW1lbnQgPSBuZXcgVURESU1haW5FbGVtZW50KGdldE1lc3NhZ2UoIk5PREVfTkFNRV9VRERJX01BSU4iKSxuYXZpZ2F0b3JNb2RlbF8pOwotICAgIG5hdmlnYXRvck1vZGVsXy5zZXRSb290RWxlbWVudCh1ZGRpTWFpbkVsZW1lbnQpOwotICAgIG5hdmlnYXRvck1hbmFnZXJfID0gbmV3IE5vZGVNYW5hZ2VyKGNvbnRyb2xsZXJfKTsKLSAgICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gbmV3IFVERElNYWluTm9kZSh1ZGRpTWFpbkVsZW1lbnQsbmF2aWdhdG9yTWFuYWdlcl8pOwotICAgIG5hdmlnYXRvck1hbmFnZXJfLnNldFJvb3ROb2RlKHVkZGlNYWluTm9kZSk7Ci0KLSAgICB3c2RsVHlwZV8gPSBVRERJQWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRTsKLSAgICBjYXRlZ29yeU1hbmFnZXJzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAKLSAgICAvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGNhdGVnb3J5IG1vZGVscy4KLSAgICBpZiAoYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKCJjb21tb25DYXRlZ29yeU1vZGVscyIpID09IG51bGwpCi0gICAgewotICAgICAgc3luY2hyb25pemVkIChhcHBsaWNhdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKGFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZSgiY29tbW9uQ2F0ZWdvcnlNb2RlbHMiKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSGFzaHRhYmxlIGNvbW1vbkNhdGVnb3J5TW9kZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkgIAotICAgICAgICAgIENhdGVnb3J5TW9kZWwgbmFpY3NNb2RlbCA9IG5ldyBDYXRlZ29yeU1vZGVsKCk7Ci0gICAgICAgICAgbmFpY3NNb2RlbC5zZXRTZXJ2bGV0Q29udGV4dChhcHBsaWNhdGlvbik7Ci0gICAgICAgICAgbmFpY3NNb2RlbC5zZXREZWZhdWx0RGF0YUZpbGUoIi91ZGRpL2RhdGEvbmFpY3MtZGF0YS50eHQiKTsKLSAgICAgICAgICBuYWljc01vZGVsLnNldERpc3BsYXlOYW1lKGdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0NBVEVHT1JZX05BSUNTIikpOwotICAgICAgICAgIG5haWNzTW9kZWwuc2V0VE1vZGVsS2V5KFRNb2RlbC5OQUlDU19UTU9ERUxfS0VZKTsKLSAgICAgICAgICBjb21tb25DYXRlZ29yeU1vZGVscy5wdXQoVE1vZGVsLk5BSUNTX1RNT0RFTF9LRVksbmFpY3NNb2RlbCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQ2F0ZWdvcnlNb2RlbCB1bnNwc2NNb2RlbCA9IG5ldyBDYXRlZ29yeU1vZGVsKCk7Ci0JCSAgdW5zcHNjTW9kZWwuc2V0U2VydmxldENvbnRleHQoYXBwbGljYXRpb24pOwotICAgICAgICAgIHVuc3BzY01vZGVsLnNldERlZmF1bHREYXRhRmlsZSgiL3VkZGkvZGF0YS91bnNwc2MtZGF0YS50eHQiKTsKLSAgICAgICAgICB1bnNwc2NNb2RlbC5zZXREaXNwbGF5TmFtZShnZXRNZXNzYWdlKCJGT1JNX09QVElPTl9DQVRFR09SWV9VTlNQU0NfNzMiKSk7Ci0gICAgICAgICAgdW5zcHNjTW9kZWwuc2V0VE1vZGVsS2V5KFRNb2RlbC5VTlNQU0NfNzNfVE1PREVMX0tFWSk7Ci0gICAgICAgICAgY29tbW9uQ2F0ZWdvcnlNb2RlbHMucHV0KFRNb2RlbC5VTlNQU0NfNzNfVE1PREVMX0tFWSx1bnNwc2NNb2RlbCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQ2F0ZWdvcnlNb2RlbCBnZW9Nb2RlbCA9IG5ldyBDYXRlZ29yeU1vZGVsKCk7Ci0JCSAgZ2VvTW9kZWwuc2V0U2VydmxldENvbnRleHQoYXBwbGljYXRpb24pOwotICAgICAgICAgIGdlb01vZGVsLnNldERlZmF1bHREYXRhRmlsZSgiL3VkZGkvZGF0YS9nZW8tZGF0YS50eHQiKTsKLSAgICAgICAgICBnZW9Nb2RlbC5zZXREaXNwbGF5TmFtZShnZXRNZXNzYWdlKCJGT1JNX09QVElPTl9DQVRFR09SWV9HRU8iKSk7Ci0gICAgICAgICAgZ2VvTW9kZWwuc2V0VE1vZGVsS2V5KFRNb2RlbC5JU09fQ0hfVE1PREVMX0tFWSk7Ci0gICAgICAgICAgY29tbW9uQ2F0ZWdvcnlNb2RlbHMucHV0KFRNb2RlbC5JU09fQ0hfVE1PREVMX0tFWSxnZW9Nb2RlbCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgYXBwbGljYXRpb24uc2V0QXR0cmlidXRlKCJjb21tb25DYXRlZ29yeU1vZGVscyIsY29tbW9uQ2F0ZWdvcnlNb2RlbHMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGVnb3J5VE1vZGVsS2V5XyA9IG51bGw7Ci0gICAgCi0gICAgLy8gU3RhcnRpbmcgZnJhbWVzZXQgc2l6ZXMuCi0gICAgaWYgKCFEaXJVdGlscy5pc1JUTCgpKQotICAgICAgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9ICIzMCUsKiI7Ci0gICAgZWxzZQotICAgICAgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9ICIqLDMwJSI7Ci0gICAgc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9ICI3NSUsKiI7Ci0gICAgc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgSGFzaHRhYmxlIGdldEtub3duUmVnaXN0cmllcygpCi0gIHsKLSAgICAvLyBXZSBtdXN0IGFsd2F5cyBxdWVyeSB0aGUgZmF2b3JpdGVzIHRvIHNlZSBpZiBhZGRpdGlvbmFsIHJlZ2lzdHJpZXMgd2VyZSBhZGRlZCBvdmVyIHRpbWUuIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIGNhY2hlZC4KLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IChGYXZvcml0ZXNNYWluRWxlbWVudCkoY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFJvb3ROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudCBmYXZSZWdGb2xkZXJFbGVtZW50ID0gZmF2TWFpbkVsZW1lbnQuZ2V0RmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBmYXZSZWdGb2xkZXJFbGVtZW50LmdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQgZmF2UmVnRWxlbWVudCA9IChGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gZmF2UmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgICBpZiAoa25vd25SZWdpc3RyaWVzXy5nZXQoaW5xdWlyeVVSTCkgPT0gbnVsbCkKLSAgICAgICAga25vd25SZWdpc3RyaWVzXy5wdXQoaW5xdWlyeVVSTCxmYXZSZWdFbGVtZW50LmdldElGYXZvcml0ZXNVRERJUmVnaXN0cnlJbnRlcmZhY2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBrbm93blJlZ2lzdHJpZXNfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRLbm93blJlZ2lzdHJ5UHVibGlzaFVSTChTdHJpbmcgaW5xdWlyeVVSTCkKLSAgewotICAgIElGYXZvcml0ZXNVRERJUmVnaXN0cnkga25vd25SZWdpc3RyeSA9IChJRmF2b3JpdGVzVURESVJlZ2lzdHJ5KWdldEtub3duUmVnaXN0cmllcygpLmdldChpbnF1aXJ5VVJMKTsKLSAgICBpZiAoa25vd25SZWdpc3RyeSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0ga25vd25SZWdpc3RyeS5nZXRQdWJsaXNoVVJMKCk7Ci0gICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHB1Ymxpc2hVUkwpKQotICAgICAgICByZXR1cm4gcHVibGlzaFVSTDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEtub3duUmVnaXN0cnlSZWdpc3RyYXRpb25VUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgICBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5IGtub3duUmVnaXN0cnkgPSAoSUZhdm9yaXRlc1VERElSZWdpc3RyeSlnZXRLbm93blJlZ2lzdHJpZXMoKS5nZXQoaW5xdWlyeVVSTCk7Ci0gICAgaWYgKGtub3duUmVnaXN0cnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVnaXN0cmF0aW9uVVJMID0ga25vd25SZWdpc3RyeS5nZXRSZWdpc3RyYXRpb25VUkwoKTsKLSAgICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocmVnaXN0cmF0aW9uVVJMKSkKLSAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvblVSTDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0KLSAgcHVibGljIGZpbmFsIElGYXZvcml0ZXNVRERJUmVnaXN0cnkgZ2V0RGVmYXVsdFVERElSZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gZGVmYXVsdFVERElSZWdpc3RyeV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByZWxvYWRVRERJUmVnaXN0cmllcyhTdHJpbmdbXSBpbnF1aXJ5VVJMcywgU3RyaW5nW10gcHVibGlzaFVSTHMpCi0gIHsKLSAgICBpZiAoaW5xdWlyeVVSTHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBIYXNodGFibGUga25vd25SZWdpc3RyaWVzID0gZ2V0S25vd25SZWdpc3RyaWVzKCk7Ci0gICAgICBTdHJpbmdCdWZmZXIgZGlyZWN0b3J5QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnF1aXJ5VVJMcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLQkJU3RyaW5nIGlucXVpcnlVUkwgPSBVUkxVdGlscy5kZWNvZGUoaW5xdWlyeVVSTHNbaV0pOwotICAgICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyByZWdOYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCA9IG51bGw7Ci0gICAgICAgIC8vIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHJlZ2lzdHJ5IGlmIGlucXVpcnlVUkwgZG9lcyBub3QgZXhpc3QKLSAgICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVVUkwoaW5xdWlyeVVSTCkpCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIC8vIHBvcHVsYXRlIGFuZCBydW4gYW4gT3BlblJlZ2lzdHJ5QWN0aW9uCi0gICAgICAgIE9wZW5SZWdpc3RyeUFjdGlvbiBhY3Rpb24gPSBuZXcgT3BlblJlZ2lzdHJ5QWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICAgICBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5IGtub3duUmVnaXN0cnkgPSAoSUZhdm9yaXRlc1VERElSZWdpc3RyeSlrbm93blJlZ2lzdHJpZXMuZ2V0KGlucXVpcnlVUkwpOwotICAgICAgICBib29sZWFuIGNoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzID0gZmFsc2U7Ci0gICAgICAgIEZpbGUgZGlyZWN0b3J5RmlsZSA9IG51bGw7Ci0gICAgICAgIGlmIChrbm93blJlZ2lzdHJ5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaXNoVVJMID0ga25vd25SZWdpc3RyeS5nZXRQdWJsaXNoVVJMKCk7Ci0gICAgICAgICAgcmVnTmFtZSA9IGtub3duUmVnaXN0cnkuZ2V0TmFtZSgpOwotICAgICAgICAgIHJlZ2lzdHJhdGlvblVSTCA9IGtub3duUmVnaXN0cnkuZ2V0UmVnaXN0cmF0aW9uVVJMKCk7Ci0gICAgICAgICAgZGlyZWN0b3J5QnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LmZvcm1DYXRlZ29yaWVzRGlyZWN0b3J5KGRpcmVjdG9yeUJ1ZmZlcixjb250cm9sbGVyXy5nZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpLHJlZ05hbWUpOwotICAgICAgICAgIGRpcmVjdG9yeUZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnlCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgaWYgKGRpcmVjdG9yeUZpbGUuZXhpc3RzKCkgJiYgZGlyZWN0b3J5RmlsZS5saXN0RmlsZXMoKS5sZW5ndGggPiAwKQotICAgICAgICAgICAgY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWdOYW1lID09IG51bGwpCi0gICAgICAgICAgcmVnTmFtZSA9IGlucXVpcnlVUkw7Ci0gICAgICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwgJiYgcHVibGlzaFVSTHMgIT0gbnVsbCAmJiBpIDwgcHVibGlzaFVSTHMubGVuZ3RoICYmIHB1Ymxpc2hVUkxzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICBwdWJsaXNoVVJMID0gVVJMVXRpbHMuZGVjb2RlKHB1Ymxpc2hVUkxzW2ldKTsKLSAgICAgICAgfSAgCi0gICAgICAgIC8vIHBvcHVsYXRlIHRoZSBhY3Rpb24KLSAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCwgaW5xdWlyeVVSTCk7Ci0gICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSwgcmVnTmFtZSk7Ci0gICAgICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocHVibGlzaFVSTCkpCi0gICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIX1VSTCwgcHVibGlzaFVSTCk7Ci0gICAgICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocmVnaXN0cmF0aW9uVVJMKSkKLSAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJBVElPTl9VUkwsIHJlZ2lzdHJhdGlvblVSTCk7Ci0gICAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGlmIHByaXZhdGUgcmVnaXN0cnkgY2F0ZWdvcnkgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGZvciB0aGlzIHJlZ2lzdHJ5LgotICAgICAgICBkaXJlY3RvcnlCdWZmZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICBTdHJpbmcgZW5jb2RlZElucXVpcnlVUkwgPSBVUkxVdGlscy5lbmNvZGUoaW5xdWlyeVVSTCk7Ci0gICAgICAgIGRpcmVjdG9yeUJ1ZmZlci5hcHBlbmQoY29udHJvbGxlcl8uZ2V0U2VydmxldEVuZ2luZVN0YXRlTG9jYXRpb24oKSkuYXBwZW5kKGVuY29kZWRJbnF1aXJ5VVJMKS5hcHBlbmQoIi5wcm9wZXJ0aWVzIik7Ci0gICAgICAgIGRpcmVjdG9yeUZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnlCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChkaXJlY3RvcnlGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGRpcmVjdG9yeUZpbGUpOwotICAgICAgICAgICAgcC5sb2FkKGZpbik7Ci0gICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIGRpcmVjdG9yeUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZGF0YURpcmVjdG9yeSA9IHAuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5DQVRFR09SSUVTX0RJUkVDVE9SWSk7Ci0gICAgICAgICAgICBpZiAoZGF0YURpcmVjdG9yeSAhPSBudWxsKQotICAgICAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JJRVNfRElSRUNUT1JZLGRhdGFEaXJlY3RvcnkpOwotICAgICAgICAgICAgY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXMgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllcykKLSAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLkNIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnJlbW92ZShVRERJQWN0aW9uSW5wdXRzLkNIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gcnVuIHRoZSBhY3Rpb24KLSAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAKLSAgICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KShuYXZpZ2F0b3JNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKTsKLSAgICAgICAgRW51bWVyYXRpb24gdXNlckRlZmluZWRDYXRlZ29yaWVzID0gcmVnRWxlbWVudC5nZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoKTsKLSAgICAgICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyAhPSBudWxsICYmIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgIEFkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gYWN0aW9uMiA9IG5ldyBBZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgICBTdHJpbmcgY2F0ZWdvcmllc0RpcmVjdG9yeSA9IHJlZ0VsZW1lbnQuZ2V0Q2F0ZWdvcmllc0RpcmVjdG9yeSgpOwotICAgICAgICAgIGlmIChjYXRlZ29yaWVzRGlyZWN0b3J5ICE9IG51bGwpCi0gICAgICAgICAgICBhY3Rpb24yLmxpbmtDYXRlZ29yeU1vZGVsc1dpdGhTYXZlZERhdGEodXNlckRlZmluZWRDYXRlZ29yaWVzLGNhdGVnb3JpZXNEaXJlY3RvcnkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFjdGlvbjIubGlua0NhdGVnb3J5TW9kZWxzV2l0aFNhdmVkRGF0YShyZWdFbGVtZW50LmdldE5hbWUoKSx1c2VyRGVmaW5lZENhdGVnb3JpZXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoaW5xdWlyeVVSTHMubGVuZ3RoID4gMCkKLSAgICAgICAgY29udHJvbGxlcl8uc2V0Q3VycmVudFBlcnNwZWN0aXZlKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIFByZWNvbmRpdGlvbnM6IAotICAvLyBzZXJ2aWNlTmFtZXMgYW5kIHNlcnZpY2VLZXlzIGhhdmUgbGVuZ3RoID49IDEuCi0gIC8vIHJlZ05vZGUgIT0gbnVsbAotICBwcml2YXRlIGZpbmFsIHZvaWQgcHJlbG9hZFNlcnZpY2VzRm9yUmVnaXN0cnkoUmVnaXN0cnlOb2RlIHJlZ05vZGUsU3RyaW5nW10gc2VydmljZU5hbWVzLFN0cmluZ1tdIHNlcnZpY2VLZXlzKQotICB7Ci0gICAgaW50IHJlZ05vZGVJZCA9IHJlZ05vZGUuZ2V0Tm9kZUlkKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8c2VydmljZUtleXMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBuYXZpZ2F0b3JNYW5hZ2VyXy5zZXRTZWxlY3RlZE5vZGVJZChyZWdOb2RlSWQpOwotICAgICAgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLHNlcnZpY2VOYW1lc1tpXSk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVksc2VydmljZUtleXNbaV0pOwotICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgbmF2aWdhdG9yTWFuYWdlcl8ubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByZWxvYWRTZXJ2aWNlcyhTdHJpbmdbXSBpbnF1aXJ5VVJMcyxTdHJpbmdbXSBzZXJ2aWNlTmFtZXMsU3RyaW5nW10gc2VydmljZUtleXMpCi0gIHsKLSAgICAvLyBUaGUgYWxnb3JpdGhtIHdpbGwgc2VhcmNoIGZvciBlYWNoIHNlcnZpY2Uga2V5IGluIGVhY2ggaW5xdWlyeSBVUkwuCi0gICAgaWYgKHNlcnZpY2VLZXlzICE9IG51bGwgJiYgc2VydmljZU5hbWVzICE9IG51bGwgJiYgc2VydmljZU5hbWVzLmxlbmd0aCA9PSBzZXJ2aWNlS2V5cy5sZW5ndGgpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZUtleXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGlucXVpcnlVUkxzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBFbGltaW5hdGUgZHVwbGljYXRlIGlucXVpcnkgVVJMcy4KLSAgICAgICAgICBIYXNodGFibGUgaW5xdWlyeVVSTHNIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICAgIGZvciAoaW50IGo9MDtqPGlucXVpcnlVUkxzLmxlbmd0aDtqKyspCi0gICAgICAgICAgICBpbnF1aXJ5VVJMc0hhc2gucHV0KGlucXVpcnlVUkxzW2pdLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgYXZhaWxhYmxlIHJlZ2lzdHJpZXMgYW5kIHVzZSB0aGVtIGlmIHBvc3NpYmxlLgotICAgICAgICAgIE5vZGUgdWRkaU1haW5Ob2RlID0gbmF2aWdhdG9yTWFuYWdlcl8uZ2V0Um9vdE5vZGUoKTsKLSAgICAgICAgICBWZWN0b3IgcmVnaXN0cnlOb2RlcyA9IHVkZGlNYWluTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaz0wO2s8cmVnaXN0cnlOb2Rlcy5zaXplKCk7aysrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gKFJlZ2lzdHJ5Tm9kZSlyZWdpc3RyeU5vZGVzLmVsZW1lbnRBdChrKTsKLSAgICAgICAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgZXhpc3RpbmdSZWdpc3RyeUlucXVpcnlVUkwgPSByZWdFbGVtZW50LmdldElucXVpcnlVUkwoKTsKLSAgICAgICAgICAgIGlmIChpbnF1aXJ5VVJMc0hhc2guZ2V0KGV4aXN0aW5nUmVnaXN0cnlJbnF1aXJ5VVJMKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwcmVsb2FkU2VydmljZXNGb3JSZWdpc3RyeShyZWdOb2RlLHNlcnZpY2VOYW1lcyxzZXJ2aWNlS2V5cyk7Ci0gICAgICAgICAgICAgIGlucXVpcnlVUkxzSGFzaC5yZW1vdmUoZXhpc3RpbmdSZWdpc3RyeUlucXVpcnlVUkwpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBFbnVtZXJhdGlvbiBpbnF1aXJ5VVJMc0VudW0gPSBpbnF1aXJ5VVJMc0hhc2gua2V5cygpOwotICAgICAgICAgIHdoaWxlIChpbnF1aXJ5VVJMc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGlucXVpcnlVUkwgPSAoU3RyaW5nKWlucXVpcnlVUkxzRW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgcHJlbG9hZFVERElSZWdpc3RyaWVzKG5ldyBTdHJpbmdbXSB7aW5xdWlyeVVSTH0sbnVsbCk7Ci0gICAgICAgICAgICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IChSZWdpc3RyeU5vZGUpbmF2aWdhdG9yTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgICAgICBwcmVsb2FkU2VydmljZXNGb3JSZWdpc3RyeShyZWdOb2RlLHNlcnZpY2VOYW1lcyxzZXJ2aWNlS2V5cyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2F0ZWdvcnlUTW9kZWxLZXkoU3RyaW5nIGNhdGVnb3J5VE1vZGVsS2V5KQotICB7Ci0gICAgY2F0ZWdvcnlUTW9kZWxLZXlfID0gY2F0ZWdvcnlUTW9kZWxLZXk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q2F0ZWdvcnlUTW9kZWxLZXkoKQotICB7Ci0gICAgcmV0dXJuIGNhdGVnb3J5VE1vZGVsS2V5XzsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGluaXRDYXRlZ29yeUJyb3dzZXIoQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeU1vZGVsLE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKQotICB7Ci0gICAgVHJlZUVsZW1lbnQgY2F0ZWdvcnlSb290RWxlbWVudCA9IChUcmVlRWxlbWVudCljYXRlZ29yeU1vZGVsLmdldFJvb3RFbGVtZW50KCk7Ci0gICAgUm9vdENhdGVnb3J5Tm9kZSByb290Q2F0ZWdvcnlOb2RlID0gbmV3IFJvb3RDYXRlZ29yeU5vZGUoY2F0ZWdvcnlSb290RWxlbWVudCxub2RlTWFuYWdlcik7Ci0gICAgbm9kZU1hbmFnZXIuc2V0Um9vdE5vZGUocm9vdENhdGVnb3J5Tm9kZSk7Ci0gICAgcm9vdENhdGVnb3J5Tm9kZS5jcmVhdGVDaGlsZHJlbigpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgTm9kZU1hbmFnZXIgZ2V0Q2F0ZWdvcnlNYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiAoTm9kZU1hbmFnZXIpY2F0ZWdvcnlNYW5hZ2Vyc18uZ2V0KGNhdGVnb3J5VE1vZGVsS2V5Xyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBOb2RlTWFuYWdlciBnZXRDYXRlZ29yeU1hbmFnZXIoQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeU1vZGVsKQotICB7Ci0gICAgU3RyaW5nIHRNb2RlbEtleSA9IGNhdGVnb3J5TW9kZWwuZ2V0VE1vZGVsS2V5KCk7Ci0gICAgTm9kZU1hbmFnZXIgY2F0ZWdvcnlNYW5hZ2VyID0gKE5vZGVNYW5hZ2VyKWNhdGVnb3J5TWFuYWdlcnNfLmdldCh0TW9kZWxLZXkpOwotICAgIGlmIChjYXRlZ29yeU1hbmFnZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjYXRlZ29yeU1hbmFnZXIgPSBuZXcgTm9kZU1hbmFnZXIoY29udHJvbGxlcl8pOwotICAgICAgaW5pdENhdGVnb3J5QnJvd3NlcihjYXRlZ29yeU1vZGVsLGNhdGVnb3J5TWFuYWdlcik7Ci0gICAgICBjYXRlZ29yeU1hbmFnZXJzXy5wdXQodE1vZGVsS2V5LGNhdGVnb3J5TWFuYWdlcik7ICAgICAgCi0gICAgfQotICAgIHJldHVybiBjYXRlZ29yeU1hbmFnZXI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTm9kZU1hbmFnZXIgZ2V0TmF2aWdhdG9yTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gbmF2aWdhdG9yTWFuYWdlcl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBOb2RlTWFuYWdlciBnZXROb2RlTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0V1NETFR5cGUoaW50IHdzZGxUeXBlKQotICB7Ci0gICAgd3NkbFR5cGVfID0gd3NkbFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFdTRExUeXBlKCkKLSAgewotICAgIHJldHVybiB3c2RsVHlwZV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBlcnNwZWN0aXZlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL3VkZGlfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgewotICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGcmFtZXNldHNGaWxlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9zY3JpcHRzL3VkZGlmcmFtZXNldHMuanNwIjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9jZXNzRnJhbWVzZXRzRm9ybSgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvZm9ybXMvUHJvY2Vzc1VERElGcmFtZXNldHNGb3JtLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBhbmVzRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gIm5hdmlnYXRvckNvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuICJwcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJzdGF0dXNDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2F2ZVBlcnNwZWN0aXZlQWN0aW9uTGluaygpCi0gIHsKLSAgICAvL3JldHVybiBTYXZlVURESVBlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoKTsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkKLSAgewotICAgIHJldHVybiBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoU3RyaW5nIGNvbHMpCi0gIHsKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gY29sczsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoU3RyaW5nIGNvbHMpCi0gIHsKLSAgICBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkKLSAgewotICAgIHJldHVybiBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpCi0gIHsKLSAgICByZXR1cm4gYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoU3RyaW5nIHJvd3MpCi0gIHsKLSAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IHJvd3M7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhTdHJpbmcgcm93cykKLSAgewotICAgIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSByb3dzOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpCi0gIHsKLSAgICByZXR1cm4gc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTd2l0Y2hQZXJzcGVjdGl2ZUZvcm1BY3Rpb25MaW5rKGludCB0YXJnZXRQZXJzcGVjdGl2ZUlkLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIHJldHVybiBTd2l0Y2hQZXJzcGVjdGl2ZUZyb21VRERJQWN0aW9uLmdldEZvcm1BY3Rpb25MaW5rKHRhcmdldFBlcnNwZWN0aXZlSWQsZm9ySGlzdG9yeSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VucHVibGlzaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VucHVibGlzaFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmY2QwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VbnB1Ymxpc2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFVucHVibGlzaFRvb2wgZXh0ZW5kcyBGb3JtVG9vbAotewotICBwdWJsaWMgVW5wdWJsaXNoVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGVuYWJsZUltYWdlLCBTdHJpbmcgaGlnaGxpZ2h0SW1hZ2UsIFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwgZW5hYmxlSW1hZ2UsIGhpZ2hsaWdodEltYWdlLCBhbHQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcmVnRWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSByZWdFbGVtZW50LmdldENyZWQoKTsKLQotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgaWYgKHVzZXJJZCA9PSBudWxsKQotICAgICAgdXNlcklkID0gIiI7Ci0gICAgaWYgKHBhc3N3b3JkID09IG51bGwpCi0gICAgICBwYXNzd29yZCA9ICIiOwotCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvZm9ybXMvVW5wdWJsaXNoRm9ybS5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS91dGlsL1VkZGk0akhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvdXRpbC9VZGRpNGpIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3YjJmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS91dGlsL1VkZGk0akhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MTAwNCAgIDE0ODA1MiBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5PdmVydmlld0RvYzsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLk92ZXJ2aWV3VVJMOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5BY2Nlc3NQb2ludDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJpbmRpbmcuQmluZGluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5CaW5kaW5nVGVtcGxhdGVzOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5JbnN0YW5jZURldGFpbHM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLlRNb2RlbEluc3RhbmNlRGV0YWlsczsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJpbmRpbmcuVE1vZGVsSW5zdGFuY2VJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgVWRkaTRqSGVscGVyCi17Ci0gIHB1YmxpYyBmaW5hbCBLZXllZFJlZmVyZW5jZSBnZXRXU0RMS2V5ZWRSZWZlcmVuY2UoKQotICB7Ci0gICAgS2V5ZWRSZWZlcmVuY2Uga2V5UmVmID0gbmV3IEtleWVkUmVmZXJlbmNlKCJ0eXBlcyIsICJ3c2RsU3BlYyIpOwotICAgIGtleVJlZi5zZXRUTW9kZWxLZXkoIlVVSUQ6QzFBQ0YyNkQtOTY3Mi00NDA0LTlENzAtMzlCNzU2RTYyQUI0Iik7Ci0gICAgcmV0dXJuIGtleVJlZjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBUTW9kZWwgbmV3VE1vZGVsKFN0cmluZyB3c2RsVXJsKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1RNb2RlbCh3c2RsVXJsLCBnZXRXU0RMRGVmaW5pdGlvbih3c2RsVXJsKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVE1vZGVsIG5ld1RNb2RlbChTdHJpbmcgd3NkbFVybCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBUTW9kZWwgdE1vZGVsID0gbmV3IFRNb2RlbCgpOwotICAgIHRNb2RlbC5zZXRUTW9kZWxLZXkoIiIpOwotICAgIHRNb2RlbC5zZXROYW1lKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgdE1vZGVsLnNldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygiIik7Ci0gICAgT3ZlcnZpZXdEb2Mgb3ZlcnZpZXdEb2MgPSBuZXcgT3ZlcnZpZXdEb2MoKTsKLSAgICBvdmVydmlld0RvYy5zZXRPdmVydmlld1VSTCh3c2RsVXJsKTsKLSAgICB0TW9kZWwuc2V0T3ZlcnZpZXdEb2Mob3ZlcnZpZXdEb2MpOwotICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgIFZlY3RvciBrZXlSZWZWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAga2V5UmVmVmVjdG9yLmFkZChnZXRXU0RMS2V5ZWRSZWZlcmVuY2UoKSk7Ci0gICAgY2F0QmFnLnNldEtleWVkUmVmZXJlbmNlVmVjdG9yKGtleVJlZlZlY3Rvcik7Ci0gICAgdE1vZGVsLnNldENhdGVnb3J5QmFnKGNhdEJhZyk7Ci0gICAgcmV0dXJuIHRNb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBCdXNpbmVzc1NlcnZpY2UgbmV3QnVzaW5lc3NTZXJ2aWNlKFN0cmluZyB3c2RsVXJsLCBIYXNodGFibGUgdE1vZGVsc1RhYmxlKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld0J1c2luZXNzU2VydmljZSh3c2RsVXJsLCBnZXRXU0RMRGVmaW5pdGlvbih3c2RsVXJsKSwgdE1vZGVsc1RhYmxlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBCdXNpbmVzc1NlcnZpY2UgbmV3QnVzaW5lc3NTZXJ2aWNlKFN0cmluZyB3c2RsVXJsLCBEZWZpbml0aW9uIGRlZiwgSGFzaHRhYmxlIHRNb2RlbHNUYWJsZSkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJ1c2luZXNzU2VydmljZSBicyA9IG5ldyBCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICBicy5zZXRTZXJ2aWNlS2V5KCIiKTsKLSAgICBCaW5kaW5nVGVtcGxhdGVzIGJpbmRpbmdUZW1wbGF0ZXMgPSBuZXcgQmluZGluZ1RlbXBsYXRlcygpOwotICAgIFZlY3RvciBiaW5kaW5nVGVtcGxhdGVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gKFNlcnZpY2VbXSlkZWYuZ2V0U2VydmljZXMoKS52YWx1ZXMoKS50b0FycmF5KG5ldyBTZXJ2aWNlWzBdKTsKLSAgICBpZiAoc2VydmljZXMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBQb3J0W10gcG9ydHMgPSAoUG9ydFtdKXNlcnZpY2VzWzBdLmdldFBvcnRzKCkudmFsdWVzKCkudG9BcnJheShuZXcgUG9ydFswXSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvcnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBUTW9kZWxJbnN0YW5jZURldGFpbHMgdE1vZGVsRGV0YWlscyA9IG5ldyBUTW9kZWxJbnN0YW5jZURldGFpbHMoKTsKLSAgICAgICAgVmVjdG9yIHRNb2RlbEluZm9WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKXRNb2RlbHNUYWJsZS5nZXQocG9ydHNbaV0uZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCkuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIHRNb2RlbEluZm9WZWN0b3IuYWRkKGNyZWF0ZVRNb2RlbEluc3RhbmNlSW5mbyh3c2RsVXJsLCBwb3J0c1tpXSwgdE1vZGVsLmdldFRNb2RlbEtleSgpKSk7Ci0gICAgICAgIHRNb2RlbERldGFpbHMuc2V0VE1vZGVsSW5zdGFuY2VJbmZvVmVjdG9yKHRNb2RlbEluZm9WZWN0b3IpOwotICAgICAgICBCaW5kaW5nVGVtcGxhdGUgYmluZGluZ1RlbXBsYXRlID0gbmV3IEJpbmRpbmdUZW1wbGF0ZSgpOwotICAgICAgICBiaW5kaW5nVGVtcGxhdGUuc2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKGNyZWF0ZURlc2NyaXB0aW9uKHBvcnRzW2ldKSk7Ci0gICAgICAgIGJpbmRpbmdUZW1wbGF0ZS5zZXRBY2Nlc3NQb2ludChjcmVhdGVBY2Nlc3NQb2ludChwb3J0c1tpXSkpOwotICAgICAgICBiaW5kaW5nVGVtcGxhdGUuc2V0VE1vZGVsSW5zdGFuY2VEZXRhaWxzKHRNb2RlbERldGFpbHMpOwotICAgICAgICBiaW5kaW5nVGVtcGxhdGUuc2V0QmluZGluZ0tleSgiIik7Ci0gICAgICAgIGJpbmRpbmdUZW1wbGF0ZVZlY3Rvci5hZGQoYmluZGluZ1RlbXBsYXRlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYmluZGluZ1RlbXBsYXRlcy5zZXRCaW5kaW5nVGVtcGxhdGVWZWN0b3IoYmluZGluZ1RlbXBsYXRlVmVjdG9yKTsKLSAgICBicy5zZXRCaW5kaW5nVGVtcGxhdGVzKGJpbmRpbmdUZW1wbGF0ZXMpOwotICAgIHJldHVybiBiczsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIEJ1c2luZXNzU2VydmljZSBuZXdCdXNpbmVzc1NlcnZpY2UoU3RyaW5nIHdzZGxVcmwsIERlZmluaXRpb24gZGVmLCBUTW9kZWxbXSB0TW9kZWxzKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gbmV3IEJ1c2luZXNzU2VydmljZSgpOwotICAgIGJzLnNldFNlcnZpY2VLZXkoIiIpOwotICAgIEJpbmRpbmdUZW1wbGF0ZXMgYmluZGluZ1RlbXBsYXRlcyA9IG5ldyBCaW5kaW5nVGVtcGxhdGVzKCk7Ci0gICAgVmVjdG9yIGJpbmRpbmdUZW1wbGF0ZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSAoU2VydmljZVtdKWRlZi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLnRvQXJyYXkobmV3IFNlcnZpY2VbMF0pOwotICAgIGlmIChzZXJ2aWNlcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIFBvcnRbXSBwb3J0cyA9IChQb3J0W10pc2VydmljZXNbMF0uZ2V0UG9ydHMoKS52YWx1ZXMoKS50b0FycmF5KG5ldyBQb3J0WzBdKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdE1vZGVscy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIFRNb2RlbEluc3RhbmNlRGV0YWlscyB0TW9kZWxEZXRhaWxzID0gbmV3IFRNb2RlbEluc3RhbmNlRGV0YWlscygpOwotICAgICAgICAgIFZlY3RvciB0TW9kZWxJbmZvVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIHRNb2RlbEluZm9WZWN0b3IuYWRkKGNyZWF0ZVRNb2RlbEluc3RhbmNlSW5mbyh3c2RsVXJsLCBwb3J0c1tpXSwgdE1vZGVsc1tqXS5nZXRUTW9kZWxLZXkoKSkpOwotICAgICAgICAgIHRNb2RlbERldGFpbHMuc2V0VE1vZGVsSW5zdGFuY2VJbmZvVmVjdG9yKHRNb2RlbEluZm9WZWN0b3IpOwotICAgICAgICAgIEJpbmRpbmdUZW1wbGF0ZSBiaW5kaW5nVGVtcGxhdGUgPSBuZXcgQmluZGluZ1RlbXBsYXRlKCk7Ci0gICAgICAgICAgYmluZGluZ1RlbXBsYXRlLnNldERlZmF1bHREZXNjcmlwdGlvblN0cmluZyhjcmVhdGVEZXNjcmlwdGlvbihwb3J0c1tpXSkpOwotICAgICAgICAgIGJpbmRpbmdUZW1wbGF0ZS5zZXRBY2Nlc3NQb2ludChjcmVhdGVBY2Nlc3NQb2ludChwb3J0c1tpXSkpOwotICAgICAgICAgIGJpbmRpbmdUZW1wbGF0ZS5zZXRUTW9kZWxJbnN0YW5jZURldGFpbHModE1vZGVsRGV0YWlscyk7Ci0gICAgICAgICAgYmluZGluZ1RlbXBsYXRlLnNldEJpbmRpbmdLZXkoIiIpOwotICAgICAgICAgIGJpbmRpbmdUZW1wbGF0ZVZlY3Rvci5hZGQoYmluZGluZ1RlbXBsYXRlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBiaW5kaW5nVGVtcGxhdGVzLnNldEJpbmRpbmdUZW1wbGF0ZVZlY3RvcihiaW5kaW5nVGVtcGxhdGVWZWN0b3IpOwotICAgIGJzLnNldEJpbmRpbmdUZW1wbGF0ZXMoYmluZGluZ1RlbXBsYXRlcyk7Ci0gICAgcmV0dXJuIGJzOwotICB9Ci0KLSAgcHVibGljIERlZmluaXRpb24gZ2V0V1NETERlZmluaXRpb24oU3RyaW5nIHdzZGxVcmwpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlc1BhcnNlckV4dCBwYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsKLSAgICAgIFN0cmluZyBwcm94eVNldCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVNldCIpOwotICAgICAgaWYgKHByb3h5U2V0ICE9IG51bGwgJiYgcHJveHlTZXQuZXF1YWxzKCJ0cnVlIikpCi0gICAgICB7Ci0gICAgICAgIHBhcnNlci5zZXRIVFRQQmFzaWNBdXRoVXNlcm5hbWUoU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5VXNlck5hbWUiKSk7Ci0gICAgICAgIHBhcnNlci5zZXRIVFRQQmFzaWNBdXRoUGFzc3dvcmQoU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5UGFzc3dvcmQiKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcGFyc2VyLmdldFdTRExEZWZpbml0aW9uVmVyYm9zZSh3c2RsVXJsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uUEFSU0VSX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY3JlYXRlRGVzY3JpcHRpb24oUG9ydCBwb3J0KQotICB7Ci0gICAgU3RyaW5nIGRlc2MgPSBudWxsOwotICAgIEVsZW1lbnQgZSA9IHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICBpZiAoZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOgotICAgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgICAgICBzYi5hcHBlbmQoKChDaGFyYWN0ZXJEYXRhKW5vZGUpLmdldERhdGEoKSk7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZGVzYyA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBkZXNjOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIFRNb2RlbEluc3RhbmNlSW5mbyBjcmVhdGVUTW9kZWxJbnN0YW5jZUluZm8oU3RyaW5nIHdzZGxVcmwsIFBvcnQgcG9ydCwgU3RyaW5nIHRNb2RlbEtleSkKLSAgewotICAgIEluc3RhbmNlRGV0YWlscyBkZXRhaWxzID0gbmV3IEluc3RhbmNlRGV0YWlscygpOwotICAgIE92ZXJ2aWV3RG9jIG92ZXJ2aWV3RG9jID0gbmV3IE92ZXJ2aWV3RG9jKCk7Ci0gICAgVE1vZGVsSW5zdGFuY2VJbmZvIHRNb2RlbEluZm8gPSBuZXcgVE1vZGVsSW5zdGFuY2VJbmZvKCk7Ci0gICAgU3RyaW5nQnVmZmVyIG92ZXJ2aWV3VVJMU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcih3c2RsVXJsKTsKLSAgICBTdHJpbmcgcG9ydE5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLSAgICBpZiAocG9ydE5hbWUgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIG92ZXJ2aWV3VVJMU3RyaW5nLmFwcGVuZCgiIyIpOwotICAgICAgb3ZlcnZpZXdVUkxTdHJpbmcuYXBwZW5kKHBvcnROYW1lKTsKLSAgICB9Ci0gICAgb3ZlcnZpZXdEb2Muc2V0T3ZlcnZpZXdVUkwobmV3IE92ZXJ2aWV3VVJMKG92ZXJ2aWV3VVJMU3RyaW5nLnRvU3RyaW5nKCkpKTsKLSAgICBkZXRhaWxzLnNldE92ZXJ2aWV3RG9jKG92ZXJ2aWV3RG9jKTsKLSAgICB0TW9kZWxJbmZvLnNldEluc3RhbmNlRGV0YWlscyhkZXRhaWxzKTsKLSAgICBpZiAodE1vZGVsS2V5ICE9IG51bGwpCi0gICAgICB0TW9kZWxJbmZvLnNldFRNb2RlbEtleSh0TW9kZWxLZXkpOwotICAgIHJldHVybiB0TW9kZWxJbmZvOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIEFjY2Vzc1BvaW50IGNyZWF0ZUFjY2Vzc1BvaW50KFBvcnQgcG9ydCkKLSAgewotICAgIEFjY2Vzc1BvaW50IGFjY2Vzc1BvaW50ID0gbnVsbDsKLSAgICBMaXN0IGxpc3QgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGlzdC5zaXplKCk7IGorKykKLSAgICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClsaXN0LmdldChqKTsKLSAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgICAgeyAgCi0gICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9ICgoU09BUEFkZHJlc3MpZXh0RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgYWNjZXNzUG9pbnQgPSBuZXcgQWNjZXNzUG9pbnQobG9jYXRpb25VUkksIGdldFVSTFR5cGUobG9jYXRpb25VUkkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpCi0gICAgICAgewotICAgICAgICBTdHJpbmcgbG9jYXRpb25VUkkgPSAoKEhUVFBBZGRyZXNzKWV4dEVsZW1lbnQpLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgIGFjY2Vzc1BvaW50ID0gbmV3IEFjY2Vzc1BvaW50KGxvY2F0aW9uVVJJLCBnZXRVUkxUeXBlKGxvY2F0aW9uVVJJKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWNjZXNzUG9pbnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFVSTF9UWVBFX09USEVSID0gIm90aGVyIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVVJMX1RZUEVTID0gImh0dHAgaHR0cHMgbWFpbCBmdHAgZmF4IHBob25lIG90aGVyIjsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGdldFVSTFR5cGUoU3RyaW5nIHVybCkKLSAgewotICAgIGludCBpID0gdXJsLmluZGV4T2YoIjoiKTsKLSAgICBTdHJpbmcgdHlwZTsKLSAgICBpZiAoaSA9PSAtMSkKLSAgICAgIHR5cGUgPSBVUkxfVFlQRV9PVEhFUjsKLSAgICBlbHNlCi0gICAgewotICAgICAgdHlwZSA9IHVybC5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgICBpZiAodHlwZS5lcXVhbHMoIiIpIHx8IFVSTF9UWVBFUy5pbmRleE9mKHR5cGUpID09IC0xKQotICAgICAgICB0eXBlID0gVVJMX1RZUEVfT1RIRVI7Ci0gICAgfQotICAgIHJldHVybiB0eXBlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc01vbm9saXRoaWNXU0RMKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgcmV0dXJuIGhhc01lc3NhZ2UoZGVmKSAmJiBoYXNQb3J0VHlwZShkZWYpICYmIGhhc0JpbmRpbmcoZGVmKSAmJiBoYXNTZXJ2aWNlKGRlZik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VydmljZUltcGxlbWVudChEZWZpbml0aW9uIGRlZikKLSAgewotICAgIHJldHVybiBoYXNJbXBvcnQoZGVmKSAmJiBoYXNTZXJ2aWNlKGRlZik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VydmljZUludGVyZmFjZShEZWZpbml0aW9uIGRlZikKLSAgewotICAgIHJldHVybiBoYXNNZXNzYWdlKGRlZikgJiYgaGFzUG9ydFR5cGUoZGVmKSAmJiBoYXNCaW5kaW5nKGRlZik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VydmljZUludGVyZmFjZVdpdGhCaW5kaW5nc09ubHkoRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICByZXR1cm4gIWhhc1NlcnZpY2UoZGVmKSAmJiBoYXNCaW5kaW5nKGRlZik7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaGFzTWVzc2FnZShEZWZpbml0aW9uIGRlZikKLSAgewotICAgIGZvcihJdGVyYXRvciBpdCA9IGRlZi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICBpZiAoISgoTWVzc2FnZSlpdC5uZXh0KCkpLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGhhc1BvcnRUeXBlKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgZm9yKEl0ZXJhdG9yIGl0ID0gZGVmLmdldFBvcnRUeXBlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICBpZiAoISgoUG9ydFR5cGUpaXQubmV4dCgpKS5pc1VuZGVmaW5lZCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNCaW5kaW5nKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgZm9yKEl0ZXJhdG9yIGl0ID0gZGVmLmdldEJpbmRpbmdzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIGlmICghKChCaW5kaW5nKWl0Lm5leHQoKSkuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaGFzU2VydmljZShEZWZpbml0aW9uIGRlZikKLSAgewotICAgIHJldHVybiAhZGVmLmdldFNlcnZpY2VzKCkuaXNFbXB0eSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGhhc0ltcG9ydChEZWZpbml0aW9uIGRlZikKLSAgewotICAgIHJldHVybiAhZGVmLmdldEltcG9ydHMoKS5pc0VtcHR5KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRJbXBvcnRzKERlZmluaXRpb24gZGVmLCBTdHJpbmcgd3NkbFVybCkKLSAgewotICAKLQkgIAotCU1hcCBpbXBvcnRzTWFwID0gZGVmLmdldEltcG9ydHMoKTsKLSAgICBDb2xsZWN0aW9uIHZhbHVlcyA9IGltcG9ydHNNYXAudmFsdWVzKCk7Ci0gICAgSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsKLSAgICAKLSAgICBWZWN0b3IgaW1wb3J0c1ZlYyA9IG5ldyBWZWN0b3IoKTsgIAotICAgIGZvcihpbnQgaSA9MDtpdC5oYXNOZXh0KCk7aSsrKXsKLSAgICAJQXJyYXlMaXN0IGFMaXN0ID0gKEFycmF5TGlzdClpdC5uZXh0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0SW1wb3J0cyA9IGFMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0SW1wb3J0cy5oYXNOZXh0KCkpewotICAgICAgICAJaW1wb3J0c1ZlYy5hZGQoaXRJbXBvcnRzLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgSW1wb3J0IGltcG9ydHNbXSA9IG5ldyBJbXBvcnRbaW1wb3J0c1ZlYy5zaXplKCldIDsKLSAgICBJdGVyYXRvciBpdFZlYyA9IGltcG9ydHNWZWMuaXRlcmF0b3IoKTsKLSAgICBmb3IoaW50IGogPSAwO2l0VmVjLmhhc05leHQoKTtqKyspewotICAgIAlpbXBvcnRzW2pdID0gKEltcG9ydClpdFZlYy5uZXh0KCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIAotICAgIFN0cmluZ1tdIGltcG9ydFN0cmluZ3MgPSBuZXcgU3RyaW5nW2ltcG9ydHMubGVuZ3RoXTsKLSAgICBTdHJpbmcgczsKLSAgICBpZiAod3NkbFVybCAhPSBudWxsICYmIHdzZGxVcmwuaW5kZXhPZignLycpICE9IC0xKQotICAgICAgcyA9IHdzZGxVcmwuc3Vic3RyaW5nKDAsIHdzZGxVcmwubGFzdEluZGV4T2YoJy8nKSsxKTsKLSAgICBlbHNlCi0gICAgICBzID0gIiI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRTdHJpbmdzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IGltcG9ydHNbaV0uZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgIGlmIChsb2NhdGlvblVSSS5pbmRleE9mKCc6JykgIT0gLTEpCi0gICAgICAgIHNiLmFwcGVuZChsb2NhdGlvblVSSSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNiLmFwcGVuZChzKS5hcHBlbmQobG9jYXRpb25VUkkpOwotICAgICAgaW1wb3J0U3RyaW5nc1tpXSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBpbXBvcnRTdHJpbmdzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMKEJ1c2luZXNzU2VydmljZSBicywgVURESVByb3h5IHByb3h5KQotICB7Ci0gICAgVmVjdG9yIGJpbmRpbmdUZW1wbGF0ZVZlY3RvciA9IGJzLmdldEJpbmRpbmdUZW1wbGF0ZXMoKS5nZXRCaW5kaW5nVGVtcGxhdGVWZWN0b3IoKTsKLSAgICBpZiAoYmluZGluZ1RlbXBsYXRlVmVjdG9yLnNpemUoKSA+IDApCi0gICAgewotICAgICAgQmluZGluZ1RlbXBsYXRlIGJ0ID0gKEJpbmRpbmdUZW1wbGF0ZSliaW5kaW5nVGVtcGxhdGVWZWN0b3IuZ2V0KDApOwotICAgICAgVE1vZGVsSW5zdGFuY2VEZXRhaWxzIHRNb2RlbERldGFpbHMgPSBidC5nZXRUTW9kZWxJbnN0YW5jZURldGFpbHMoKTsKLSAgICAgIGlmICh0TW9kZWxEZXRhaWxzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFZlY3RvciB0TW9kZWxJbmZvVmVjdG9yID0gdE1vZGVsRGV0YWlscy5nZXRUTW9kZWxJbnN0YW5jZUluZm9WZWN0b3IoKTsKLSAgICAgICAgaWYgKHRNb2RlbEluZm9WZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIFRNb2RlbEluc3RhbmNlSW5mbyB0TW9kZWxJbmZvID0gKFRNb2RlbEluc3RhbmNlSW5mbyl0TW9kZWxJbmZvVmVjdG9yLmdldCgwKTsKLSAgICAgICAgICBJbnN0YW5jZURldGFpbHMgZGV0YWlscyA9IHRNb2RlbEluZm8uZ2V0SW5zdGFuY2VEZXRhaWxzKCk7Ci0gICAgICAgICAgaWYgKGRldGFpbHMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPdmVydmlld0RvYyBvdmVydmlld0RvYyA9IGRldGFpbHMuZ2V0T3ZlcnZpZXdEb2MoKTsKLSAgICAgICAgICAgIGlmIChvdmVydmlld0RvYyAhPSBudWxsKQotICAgICAgICAgICAgICByZXR1cm4gcGFyc2Uob3ZlcnZpZXdEb2MuZ2V0T3ZlcnZpZXdVUkxTdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHByb3h5ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgIAlTdHJpbmcgdE1vZGVsS2V5ID0gdE1vZGVsSW5mby5nZXRUTW9kZWxLZXkoKTsKLSAgICAgICAgICAJaWYgKHRNb2RlbEtleSAhPSBudWxsKQotICAgICAgICAgIAl7Ci0gICAgICAgICAgCSAgdHJ5Ci0JCQkgIHsKLSAgICAgICAgICAJICAgIFRNb2RlbERldGFpbCB0ID0gcHJveHkuZ2V0X3RNb2RlbERldGFpbCh0TW9kZWxLZXkpOwotICAgICAgICAgIAkgICAgaWYgKHQgIT0gbnVsbCkKLSAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSB0LmdldFRNb2RlbFZlY3RvcigpOwotICAgICAgICAgICAgICAgICAgaWYgKHRNb2RlbFZlY3RvciAhPSBudWxsICYmIHRNb2RlbFZlY3Rvci5zaXplKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V1NETCgoVE1vZGVsKXRNb2RlbFZlY3Rvci5nZXQoMCkpOwotICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgCSAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpCi0JCQkgIHsKLSAgICAgICAgICAJICB9Ci0gICAgICAgICAgCSAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiB0ZSkKLQkJCSAgewotICAgICAgICAgIAkgIH0KLSAgICAgICAgICAJfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXU0RMKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBPdmVydmlld0RvYyBvdmVydmlld0RvYyA9IHRNb2RlbC5nZXRPdmVydmlld0RvYygpOwotICAgIGlmIChvdmVydmlld0RvYyAhPSBudWxsKQotICAgICAgcmV0dXJuIHBhcnNlKG92ZXJ2aWV3RG9jLmdldE92ZXJ2aWV3VVJMU3RyaW5nKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBwYXJzZShTdHJpbmcgcykKLSAgewotICAgIGlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcy5pbmRleE9mKCcjJyk7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgfQotICAgIHJldHVybiBzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9DaGFyQXJyYXlXcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9DaGFyQXJyYXlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NGY4MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvQ2hhckFycmF5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDaGFyQXJyYXlXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIKLXsKLQlwcml2YXRlIENoYXJBcnJheVdyaXRlciBjaGFyQXJyYXlXcml0ZXJfOwotCQotCXB1YmxpYyBDaGFyQXJyYXlXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0JewotCQlzdXBlcihyZXNwb25zZSk7Ci0JICBjaGFyQXJyYXlXcml0ZXJfID0gbmV3IENoYXJBcnJheVdyaXRlcigpOwotCX0KLQkKLQlwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkKLQl7Ci0JCXJldHVybiBuZXcgUHJpbnRXcml0ZXIoY2hhckFycmF5V3JpdGVyXyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGNoYXJBcnJheVdyaXRlcl8udG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9EaXJVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvRGlyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhOGJjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9EaXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaXJVdGlscwotewotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSVEwoKQotICB7Ci0gICAgcmV0dXJuICJydGwiLmVxdWFscyhnZXREaXIoKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXIoKQotICB7Ci0gICAgU3RyaW5nIHJ0bCA9ICJydGwiOwotICAgIFN0cmluZyBsdHIgPSAibHRyIjsKLQotICAgIC8vIGZyb20gc3lzdGVtIHByb3BlcnR5Ci0gICAgU3RyaW5nIG9yaWVudGF0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLm9yaWVudGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAocnRsLmVxdWFscyhvcmllbnRhdGlvbikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBydGw7Ci0gICAgZWxzZSBpZiAobHRyLmVxdWFscyhvcmllbnRhdGlvbikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBsdHI7Ci0KLSAgICAvLyBmcm9tIGNvbW1hbmQgbGluZQotICAgIFN0cmluZ1tdIGFyZ3MgPSBQbGF0Zm9ybS5nZXRDb21tYW5kTGluZUFyZ3MoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKCItZGlyIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbaV0pKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIGlmICgoaSArIDEpIDwgYXJncy5sZW5ndGggJiYgInJ0bCIuZXF1YWxzSWdub3JlQ2FzZShhcmdzW2kgKyAxXSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBydGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGx0cjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBwcm9wZXJ0eSBpcyBzZXQuIElmIG5vdCBkbyBub3QKLSAgICAvLyByZWx5IG9uIHRoZSB2bS4KLSAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvc2dpLm5sLnVzZXIiKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gbHRyOwotCi0gICAgLy8gZ3Vlc3MgZnJvbSBkZWZhdWx0IGxvY2FsZQotICAgIFN0cmluZyBsb2NhbGUgPSBQbGF0Zm9ybS5nZXROTCgpOwotICAgIGlmIChsb2NhbGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGlmIChsb2NhbGUuc3RhcnRzV2l0aCgiYXIiKSB8fCBsb2NhbGUuc3RhcnRzV2l0aCgiZmEiKSAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotICAgICAgICB8fCBsb2NhbGUuc3RhcnRzV2l0aCgiaGUiKSB8fCBsb2NhbGUuc3RhcnRzV2l0aCgiaXciKSAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotICAgICAgICB8fCBsb2NhbGUuc3RhcnRzV2l0aCgidXIiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJldHVybiBydGw7Ci0gICAgfQotICAgIHJldHVybiBsdHI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL0hUTUxVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvSFRNTFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzY2Y5NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvSFRNTFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMiAgIDEyNzQ0MyBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEhUTUxVdGlscwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEY4X0VOQ09ESU5HID0gIlVURi04IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9CUkVBSyA9ICI8YnI+IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gIC8qKgotICAqIEdldCB0aGUgSFRNTCB0YWcgZm9yIGFuIGltYWdlLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBIVE1MIHRhZyBmb3IgdGhpcyBpbWFnZS4KLSAgKiBAcGFyYW0gSHR0cFNlcnZsZXRSZXNwb25zZSBUbyBlbmNvZGUgdGhlIHNyYyBhdHRyaWJ1dGUuCi0gICogQHBhcmFtIFN0cmluZyBzcmMgYXR0cmlidXRlIGRlZmluaW5nIHRoZSBwYXRoIHRvIHRoZSBpbWFnZSBmaWxlLiBUaGlzIG11c3QgaW5jbHVkZSB0aGUgY29udGV4dCBwYXRoLgotICAqIEBwYXJhbSBTdHJpbmcgT3B0aW9uYWwgYWx0IHRleHQgdG8gYmUgZGlzcGxheWVkIHdpdGggdGhlIGltYWdlLiBTZXQgdGhpcyB0byBudWxsIHRvIGRpc2FibGUgdGhlIGF0dHJpYnV0ZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE9wdGlvbmFsIHdpZHRoIG9mIHRoZSByZW5kZXJlZCBpbWFnZS4gU2V0IHRoaXMgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBhdHRyaWJ1dGUuCi0gICogQHBhcmFtIFN0cmluZyBPcHRpb25hbCBoZWlnaHQgb2YgdGhlIHJlbmRlcmVkIGltYWcuIFNldCB0aGlzIHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgYXR0cmlidXRlLgotICAqIEBwYXJhbSBIYXNodGFibGUgT3B0aW9uYWwga2V5LXZhbHVlIHBhaXJzIG9mIGFkZGl0aW9uYWwgc3RyaW5ncyB0byBiZSBhZGRlZCBhcy1pcyB0byB0aGUgdGFnLiBTZXQgdGhpcyB0byBudWxsIHRvIGRpc2FibGUuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGltYWdlIHRhZy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SFRNTEltYWdlVGFnKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsU3RyaW5nIHNyYyxTdHJpbmcgYWx0LFN0cmluZyB3aWR0aCxTdHJpbmcgaGVpZ2h0LEhhc2h0YWJsZSBhZGRpdGlvbmFsQXR0cmlidXRlcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciB0YWcgPSBuZXcgU3RyaW5nQnVmZmVyKCI8aW1nIHNyYz1cIiIpOwotICAgIHRhZy5hcHBlbmQocmVzcG9uc2UuZW5jb2RlVVJMKHNyYykpLmFwcGVuZCgnXCInKTsKLSAgICBpZiAoYWx0ICE9IG51bGwpCi0gICAgewotICAgICAgdGFnLmFwcGVuZCgiIGFsdD1cIiIpLmFwcGVuZChhbHQpLmFwcGVuZCgnXCInKTsKLSAgICAgIHRhZy5hcHBlbmQoIiB0aXRsZT1cIiIpLmFwcGVuZChhbHQpLmFwcGVuZCgnXCInKTsKLSAgICB9Ci0gICAgaWYgKHdpZHRoICE9IG51bGwpCi0gICAgICB0YWcuYXBwZW5kKCIgd2lkdGg9IikuYXBwZW5kKHdpZHRoKTsKLSAgICBpZiAoaGVpZ2h0ICE9IG51bGwpCi0gICAgICB0YWcuYXBwZW5kKCIgaGVpZ2h0PSIpLmFwcGVuZChoZWlnaHQpOwotICAgIHRhZy5hcHBlbmQoIiBib3JkZXI9MCIpOwotICAgIGlmIChhZGRpdGlvbmFsQXR0cmlidXRlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBhZGRpdGlvbmFsQXR0cmlidXRlcy5rZXlzKCk7Ci0gICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICB0YWcuYXBwZW5kKCcgJykuYXBwZW5kKGtleSkuYXBwZW5kKCI9XCIiKS5hcHBlbmQoKFN0cmluZylhZGRpdGlvbmFsQXR0cmlidXRlcy5nZXQoa2V5KSkuYXBwZW5kKCdcIicpOwotICAgICAgfQotICAgIH0KLSAgICB0YWcuYXBwZW5kKCc+Jyk7Ci0gICAgcmV0dXJuIHRhZy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICogR2V0IHRoZSBIVE1MIHRhZyBmb3IgdGhpcyBsaW5rLiBUaGUgY29tcGxldGUgdGFnIGNvbnNpc3RzIG9mIHRoZSBvcGVuIHRhZyA8YT4gZm9sbG93ZWQgYnkgYSBzdWJlbGVtZW50IGFuZCwgZmluYWxseSwgYnkgYW4gZW5kIHRhZyA8L2E+LgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBIVE1MIHRhZyBvZiB0aGUgbGluay4KLSAgKiBAcGFyYW0gSHR0cFNlcnZsZXRSZXNwb25zZSBUbyBlbmNvZGUgdGhlIGhyZWYgYXR0cmlidXRlLgotICAqIEBwYXJhbSBTdHJpbmcgVGhlIGhyZWYgYXR0cmlidXRlIG9mIHRoZSBsaW5rLiBUaGlzIG11c3QgaW5jbHVkZSB0aGUgY29udGV4dCBwYXRoLgotICAqIEBwYXJhbSBTdHJpbmcgdGFyZ2V0IE9wdGlvbmFsIHRhcmdldCBhdHRyaWJ1dGUgZm9yIHRoZSBsaW5rLiBTZXQgdGhpcyB0byBudWxsIHRvIGRpc2FibGUgdGhlIGF0dHJpYnV0ZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBsaW5rLiBTZXQgdGhpcyB0byBudWxsIHRvIGRpc2FibGUgdGhlIGF0dHJpYnV0ZS4KLSAgKiBAcGFyYW0gU3RyaW5nIFRoZSBsYWJlbCB3aGljaCBhY3RzIGFzIHRoZSBzdWJlbGVtZW50LiBpLmUuIDxhPmxhYmVsPC9hPi4KLSAgKiBAcGFyYW0gSGFzaHRhYmxlIE9wdGlvbmFsIGtleS12YWx1ZSBwYWlycyBvZiBhZGRpdGlvbmFsIHN0cmluZyBhdHRyaWJ1dGVzIHRvIGJlIGFkZGVkIGFzLWlzIHRvIHRoZSBvcGVuIHRhZy4gU2V0IHRoaXMgdG8gbnVsbCB0byBkaXNhYmxlLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRIVE1MTGlua1RhZyhIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLFN0cmluZyBocmVmLFN0cmluZyB0YXJnZXQsU3RyaW5nIG5hbWUsU3RyaW5nIGxhYmVsLEhhc2h0YWJsZSBhZGRpdGlvbmFsQXR0cmlidXRlcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciB0YWcgPSBuZXcgU3RyaW5nQnVmZmVyKCI8YSBocmVmPVwiIik7Ci0gICAgdGFnLmFwcGVuZChyZXNwb25zZS5lbmNvZGVVUkwoaHJlZikpLmFwcGVuZCgnXCInKTsKLSAgICBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgICB0YWcuYXBwZW5kKCIgdGFyZ2V0PVwiIikuYXBwZW5kKHRhcmdldCkuYXBwZW5kKCdcIicpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB0YWcuYXBwZW5kKCIgbmFtZT1cIiIpLmFwcGVuZChuYW1lKS5hcHBlbmQoJ1wiJyk7Ci0gICAgaWYgKGFkZGl0aW9uYWxBdHRyaWJ1dGVzICE9IG51bGwpCi0gICAgewotICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGFkZGl0aW9uYWxBdHRyaWJ1dGVzLmtleXMoKTsKLSAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIHRhZy5hcHBlbmQoJyAnKS5hcHBlbmQoa2V5KS5hcHBlbmQoIj1cIiIpLmFwcGVuZCgoU3RyaW5nKWFkZGl0aW9uYWxBdHRyaWJ1dGVzLmdldChrZXkpKS5hcHBlbmQoJ1wiJyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHRhZy5hcHBlbmQoJz4nKTsKLSAgICB0YWcuYXBwZW5kKGxhYmVsKTsKLSAgICB0YWcuYXBwZW5kKCI8L2E+Iik7Ci0gICAgcmV0dXJuIHRhZy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICogR2V0IHRoZSBIVE1MIHRhZyBmb3IgYSByZWQgYXN0ZXJpc3QuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIEhUTUwgdGFnIGZvciB0aGUgcmVkIGFzdGVyaXNrLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyByZWRBc3RlcmlzaygpCi0gIHsKLSAgICByZXR1cm4gIjxmb250IGNvbG9yPVwiI2ZmMDAwMFwiPio8L2ZvbnQ+IjsKLSAgfQotCi0gIC8qKgotICAqIEdldCB0aGUgSmF2YXNjcmlwdCBtYW5nbGVkIHZlcnNpb24gb2YgYSBnaXZlbiBpbnB1dCBTdHJpbmcuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIEphdmFzY3JpcHQgbWFuZ2xlZCBTdHJpbmcuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTTWFuZ2xlKFN0cmluZyBpbnB1dCkKLSAgewotICAgIGlmIChpbnB1dCA9PSBudWxsKQotICAgICAgcmV0dXJuICIiOwotCi0gICAgU3RyaW5nQnVmZmVyIG1hbmdsZWRPdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8aW5wdXQubGVuZ3RoKCk7aSsrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IGlucHV0LmNoYXJBdChpKTsKLSAgICAgIHN3aXRjaCAoYykKLSAgICAgIHsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIG1hbmdsZWRPdXRwdXQuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIG1hbmdsZWRPdXRwdXQuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICBtYW5nbGVkT3V0cHV0LmFwcGVuZCgnXFwnKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBtYW5nbGVkT3V0cHV0LmFwcGVuZChjKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1hbmdsZWRPdXRwdXQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTX1RIQU4gPSAiPCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTX1RIQU5fSFRNTF9FTlRJVFkgPSAiJmx0OyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU4gPSAiPiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU5fSFRNTF9FTlRJVFkgPSAiJmd0OyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX0hUTUxfRU5USVRZID0gIiZuYnNwOyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTVBFUlNBTkQgPSAiJiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTVBFUlNBTkRfSFRNTF9FTlRJVFkgPSAiJmFtcDsiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVEFUSU9OID0gIlwiIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RBVElPTl9IVE1MX0VOVElUWSA9ICImcXVvdDsiOwotCi0gIC8qKgotICAqIFJlcGxhY2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIHdpdGggSFRNTCBlbnRpdGllcyByZXByZXNlbnRpbmcgdGhlc2UgY2hhcmFjdGVycy4KLSAgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIGFsc28gY29udmVydCBub3JtYWwgc3BhY2VzIGludG8gbm9uLWJyZWFraW5nIHNwYWNlcywgd2hpY2ggbWF5IGJlIGdvb2QgZm9yCi0gICogcHJlc2VudGF0aW9uIGJ1dCBub3QgZm9yIGVkaXRpbmcuCi0gICogCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGNvbnZlcnRlZCBTdHJpbmcuIE5vdGU6IE9yZGVyIGlzIGltcG9ydGFudCBzbyB0aGF0IGNvcnJlY3RlZCBlbnRpdHkgcmVmZXJlbmNlcyBhcmUgbm90IHJlLW1hbmdsZWQuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhTdHJpbmcgcykgewotICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIEFNUEVSU0FORCwgQU1QRVJTQU5EX0hUTUxfRU5USVRZKTsKLSAgICBzID0gc3RyaW5nUmVwbGFjZShzLCBMRVNTX1RIQU4sIExFU1NfVEhBTl9IVE1MX0VOVElUWSk7Ci0gICAgcyA9IHN0cmluZ1JlcGxhY2UocywgR1JFQVRFUl9USEFOLCBHUkVBVEVSX1RIQU5fSFRNTF9FTlRJVFkpOwotICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIFNQQUNFLCBTUEFDRV9IVE1MX0VOVElUWSk7Ci0gICAgcyA9IHN0cmluZ1JlcGxhY2UocywgUVVPVEFUSU9OLCBRVU9UQVRJT05fSFRNTF9FTlRJVFkpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIHdpdGggSFRNTCBlbnRpdGllcyByZXByZXNlbnRpbmcgdGhlc2UgY2hhcmFjdGVycwotICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgY29udmVydGVkIFN0cmluZy4gTm90ZTogT3JkZXIgaXMgaW1wb3J0YW50IHNvIHRoYXQgY29ycmVjdGVkIGVudGl0eSByZWZlcmVuY2VzIGFyZSBub3QgcmUtbWFuZ2xlZC4KLSAgICovCi0gICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3QoU3RyaW5nIHMpIHsKLSAgICAgcyA9IHN0cmluZ1JlcGxhY2UocywgQU1QRVJTQU5ELCBBTVBFUlNBTkRfSFRNTF9FTlRJVFkpOwotICAgICBzID0gc3RyaW5nUmVwbGFjZShzLCBMRVNTX1RIQU4sIExFU1NfVEhBTl9IVE1MX0VOVElUWSk7Ci0gICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIEdSRUFURVJfVEhBTiwgR1JFQVRFUl9USEFOX0hUTUxfRU5USVRZKTsKLSAgICAgcyA9IHN0cmluZ1JlcGxhY2UocywgUVVPVEFUSU9OLCBRVU9UQVRJT05fSFRNTF9FTlRJVFkpOwotICAgICByZXR1cm4gczsKLSAgIH0KLQotICAvKioKLSAgKiBSZXBsYWNlIEhUTUwgY2hhcmFjdGVyIGVudGl0aWVzIHdpdGggdGhlaXIgYXNzb2NpYXRlZCBjaGFyYWN0ZXJzLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBjb252ZXJ0ZWQgU3RyaW5nLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBodG1sRW50aXRpZXNUb0NoYXJhY3RlcnMoU3RyaW5nIHMpIHsKLSAgICBzID0gc3RyaW5nUmVwbGFjZShzLCBMRVNTX1RIQU5fSFRNTF9FTlRJVFksIExFU1NfVEhBTik7Ci0gICAgcyA9IHN0cmluZ1JlcGxhY2UocywgR1JFQVRFUl9USEFOX0hUTUxfRU5USVRZLCBHUkVBVEVSX1RIQU4pOwotICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIFNQQUNFX0hUTUxfRU5USVRZLCBTUEFDRSk7Ci0gICAgcyA9IHN0cmluZ1JlcGxhY2UocywgQU1QRVJTQU5EX0hUTUxfRU5USVRZLCBBTVBFUlNBTkQpOwotICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIFFVT1RBVElPTl9IVE1MX0VOVElUWSwgUVVPVEFUSU9OKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzdHJpbmdSZXBsYWNlKFN0cmluZyBzLCBTdHJpbmcgb2xkU3RyaW5nLCBTdHJpbmcgbmV3U3RyaW5nKSB7Ci0gICAgU3RyaW5nIHNDb3B5ID0gczsKLSAgICBpbnQgZnJvbUluZGV4ID0gMDsKLSAgICBpbnQgb2xkU3RyaW5nSW5kZXggPSBzQ29weS5pbmRleE9mKG9sZFN0cmluZywgZnJvbUluZGV4KTsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgd2hpbGUgKG9sZFN0cmluZ0luZGV4ICE9IC0xKSB7Ci0gICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgICBzYi5hcHBlbmQoc0NvcHkuc3Vic3RyaW5nKDAsIG9sZFN0cmluZ0luZGV4KSk7Ci0gICAgICBzYi5hcHBlbmQobmV3U3RyaW5nKTsKLSAgICAgIHNiLmFwcGVuZChzQ29weS5zdWJzdHJpbmcob2xkU3RyaW5nSW5kZXggKyBvbGRTdHJpbmcubGVuZ3RoKCksIHNDb3B5Lmxlbmd0aCgpKSk7Ci0gICAgICBzQ29weSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICBmcm9tSW5kZXggPSBvbGRTdHJpbmdJbmRleCArIG5ld1N0cmluZy5sZW5ndGgoKTsKLSAgICAgIG9sZFN0cmluZ0luZGV4ID0gc0NvcHkuaW5kZXhPZihvbGRTdHJpbmcsIGZyb21JbmRleCk7Ci0gICAgfQotICAgIHJldHVybiBzQ29weTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL011bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDA4YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbDsKLQotcHVibGljIGZpbmFsIGNsYXNzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIGV4dGVuZHMgVGhyb3dhYmxlCi17Ci0gIC8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1Nzg0NTQ3MjIyNzExMDk2MUw7Ci0KLXB1YmxpYyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9NdWx0aXBhcnRGb3JtRGF0YVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzMDM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9NdWx0aXBhcnRGb3JtRGF0YVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLQotcHVibGljIGZpbmFsIGNsYXNzIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyCi17Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHBhcmFtVGFibGVfOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9UWVBFICAgICAgICA9ICJDb250ZW50LVR5cGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX01VTFRJUEFSVCAgICAgICAgICAgPSAibXVsdGlwYXJ0IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9CT1VOREFSWSAgICAgICAgICAgID0gImJvdW5kYXJ5PSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9ESVNQT1NJVElPTiA9ICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGEiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX05BTUUgICAgICAgICAgICAgICAgPSAibmFtZT1cIiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBQQVJTRVJfU1RBVEVfSU5JVElBTCAgICAgICAgID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBQQVJTRVJfU1RBVEVfQk9VTkRBUlkgICAgICAgID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBQQVJTRVJfU1RBVEVfUEFSQU1FVEVSICAgICAgID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBQQVJTRVJfU1RBVEVfQkxBTksgICAgICAgICAgID0gMzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBQQVJTRVJfU1RBVEVfREFUQSAgICAgICAgICAgID0gNDsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyc2VyU3RhdGVzW10gPSB7ImluaXRpYWwiLCJib3VuZGFyeSIsInBhcmFtZXRlciBuYW1lIiwiYmxhbmsgbGluZSIsImRhdGEifTsKLQotICBwdWJsaWMgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIoKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlcihIYXNodGFibGUgcGFyYW1ldGVycykKLSAgewotICAgIHBhcmFtVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwYXJhbWV0ZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0KGtleSk7Ci0gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCl2YWx1ZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgICAgIHNhdmVEYXRhKGtleS50b1N0cmluZygpLCBpdDIubmV4dCgpLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdFtdIGFycmF5ID0gKE9iamVjdFtdKXZhbHVlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICAgIHNhdmVEYXRhKGtleS50b1N0cmluZygpLCBhcnJheVtpXS50b1N0cmluZygpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2F2ZURhdGEoa2V5LnRvU3RyaW5nKCksIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIG11bHRpcGFydC9mb3JtLWRhdGEgZW5jb2RlZCBwb3N0IHJlcXVlc3Qgd2l0aCBhIGdpdmVuIGVuY29kaW5nLgotICAgKiBJZiB0aGUgZW5jb2RpbmcgaXMgbnVsbCwgdXNlIHRoZSBzeXN0ZW0gZGVmYXVsdCBlbmNvZGluZy4gdXRmLTggaXMgbm90IGEKLSAgICogYmFkIGNob2ljZSBmb3IgdGhlIGVuY29kaW5nLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcGFyc2VSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LFN0cmluZyBlbmNvZGluZykgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDb250ZW50LVR5cGUgaGVhZGVyIHNob3VsZCBoYXZlIHRoZSBmb3JtOgotICAgIC8vIG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PS4uLgotICAgIC8vCi0gICAgLy8gUkZDMjA0NiA1LjEuMSBwYWdlIDE5LCBwYXJhZ3JhcGggMjoKLSAgICAvLyBUaGUgQ29udGVudC1UeXBlIGZpZWxkIGZvciBtdWx0aXBhcnQgZW50aXRpZXMgcmVxdWlyZXMgb25lIHBhcmFtZXRlciwgImJvdW5kYXJ5IiAobm8gcXVvdGVzKQotICAgIFN0cmluZyBjb250ZW50VHlwZSA9IHJlcXVlc3QuZ2V0SGVhZGVyKEhFQURFUl9DT05URU5UX1RZUEUpOwotICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8ICFjb250ZW50VHlwZS5zdGFydHNXaXRoKEhFQURFUl9NVUxUSVBBUlQpIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoSEVBREVSX0JPVU5EQVJZKSA9PSAtMSkKLSAgICAgIHRocm93IG5ldyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbigiQ29udGVudC1UeXBlIGlzIG5vdCBtdWx0aXBhcnQvZm9ybS1kYXRhIik7Ci0KLSAgICAvLyBSRkMyMDQ2IDUuMS4xIHBhZ2UgMTksIHBhcmFncmFwaCA0OgotICAgIC8vIFRoZSBib3VuZGFyeSB2YWx1ZSBtYXkgYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3Rlcy4gU3RyaXAgdGhlc2UgaWYgdGhleSBhcmUgcHJlc2VudC4KLSAgICBTdHJpbmcgYm91bmRhcnkgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoY29udGVudFR5cGUuaW5kZXhPZihIRUFERVJfQk9VTkRBUlkpK0hFQURFUl9CT1VOREFSWS5sZW5ndGgoKSxjb250ZW50VHlwZS5sZW5ndGgoKSk7Ci0gICAgaWYgKGJvdW5kYXJ5LmNoYXJBdCgwKSA9PSAnXCInICYmIGJvdW5kYXJ5LmNoYXJBdChib3VuZGFyeS5sZW5ndGgoKS0xKSA9PSAnXCInKQotICAgICAgYm91bmRhcnkgPSBib3VuZGFyeS5zdWJzdHJpbmcoMSxib3VuZGFyeS5sZW5ndGgoKS0xKTsKLQotICAgIC8vIFJGQzIwNDYgNS4xLjEgcGFnZSAxOSwgcGFyYWdyYXBoIDI6Ci0gICAgLy8gVGhlIGJvdW5kYXJ5IGRlbGltaXRlciBsaW5lIGlzIHRoZW4gZGVmaW5lZCBhcyBhIGxpbmUgY29uc2lzdGluZyBlbnRpcmVseQotICAgIC8vIG9mIHR3byBoeXBoZW4gY2hhcmFjdGVycy4KLSAgICBTdHJpbmcgZGVsaW1pdGVyID0gIi0tIitib3VuZGFyeTsKLQotICAgIGlmIChwYXJhbVRhYmxlXyA9PSBudWxsKQotICAgICAgcGFyYW1UYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZWxzZQotICAgICAgcGFyYW1UYWJsZV8uY2xlYXIoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXF1ZXN0LmdldElucHV0U3RyZWFtKCksZW5jb2RpbmcpKTsKLSAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKLSAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gbnVsbDsKLSAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXJWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGJ5dGUgY3VycmVudFBhcnNlclN0YXRlID0gUEFSU0VSX1NUQVRFX0lOSVRJQUw7Ci0gICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBMaW5lcyBhcHBlYXIgaW4gdGhlIGZvbGxvd2luZyBzZXF1ZW5jZS4KLSAgICAgICAgLy8gMSkgYm91bmRhcnkgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgYSBuZXcgcGFyYW1ldGVyIGFuZCBlbmQgb2YgYSBkYXRhIHNlZ21lbnQuCi0gICAgICAgIC8vIDIpIENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iLi4uIiAtIHRoZSBuYW1lIG9mIGEgbmV3IHBhcmFtZXRlci4KLSAgICAgICAgLy8gMykgYSBibGFuayBsaW5lCi0gICAgICAgIC8vIDQpIGRhdGEKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgc2VxdWVuY2UgaXMgcmVwZWF0ZWQuCi0gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoZGVsaW1pdGVyKSkKLSAgICAgICAgewotICAgICAgICAgIGJ5dGVbXSBleHBlY3RlZFBhcnNlclN0YXRlcyA9IHtQQVJTRVJfU1RBVEVfSU5JVElBTCxQQVJTRVJfU1RBVEVfREFUQX07Ci0gICAgICAgICAgaWYgKGlzVmFsaWRQYXJzZXJTdGF0ZShjdXJyZW50UGFyc2VyU3RhdGUsZXhwZWN0ZWRQYXJzZXJTdGF0ZXMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNhdmUgYW55IGN1cnJlbnQgZGF0YSBhbmQgcHJlcGFyZSBmb3IgYSBuZXcgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICBpZiAocGFyYW1ldGVyTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzYXZlRGF0YShwYXJhbWV0ZXJOYW1lLHBhcmFtZXRlclZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudFBhcnNlclN0YXRlID0gUEFSU0VSX1NUQVRFX0JPVU5EQVJZOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24oZ2V0UGFyc2VyRXhjZXB0aW9uTWVzc2FnZShjdXJyZW50UGFyc2VyU3RhdGUsZXhwZWN0ZWRQYXJzZXJTdGF0ZXMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoSEVBREVSX0NPTlRFTlRfRElTUE9TSVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgYnl0ZVtdIGV4cGVjdGVkUGFyc2VyU3RhdGVzID0ge1BBUlNFUl9TVEFURV9CT1VOREFSWX07Ci0gICAgICAgICAgaWYgKGlzVmFsaWRQYXJzZXJTdGF0ZShjdXJyZW50UGFyc2VyU3RhdGUsZXhwZWN0ZWRQYXJzZXJTdGF0ZXMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIE9idGFpbiB0aGUgcGFyYW1ldGVyIG5hbWUgd2l0aG91dCB0aGUgc3Vycm91bmRpbmcgZG91YmxlIHF1b3Rlcy4gQWNjb3VudHMgZm9yIFJGQyAxODY3IHRvby4KLSAgICAgICAgICAgIGludCBwYXJhbWV0ZXJOYW1lU3RhcnRpbmdQb3NpdGlvbiA9IGxpbmUuaW5kZXhPZihIRUFERVJfTkFNRSkrSEVBREVSX05BTUUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gbGluZS5zdWJzdHJpbmcocGFyYW1ldGVyTmFtZVN0YXJ0aW5nUG9zaXRpb24sK3BhcmFtZXRlck5hbWVTdGFydGluZ1Bvc2l0aW9uK2xpbmUuc3Vic3RyaW5nKHBhcmFtZXRlck5hbWVTdGFydGluZ1Bvc2l0aW9uKS5pbmRleE9mKCdcIicpKTsKLSAgICAgICAgICAgIGN1cnJlbnRQYXJzZXJTdGF0ZSA9IFBBUlNFUl9TVEFURV9QQVJBTUVURVI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRQYXJzZXJTdGF0ZSA9PSBQQVJTRVJfU1RBVEVfUEFSQU1FVEVSKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQSBibGFuayBsaW5lIHNob3VsZCBmb2xsb3cgdGhlIFBBUkFNRVRFUi4gRGlzY2FyZCB0aGUgbGluZSBhbmQgbW92ZSBvbi4KLSAgICAgICAgICBjdXJyZW50UGFyc2VyU3RhdGUgPSBQQVJTRVJfU1RBVEVfQkxBTks7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRXhwZWN0IHRoZSBsaW5lIHRvIGNvbnRhaW4gZGF0YS4KLSAgICAgICAgICBpZiAocGFyYW1ldGVyVmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUuYXBwZW5kKCdcbicpOwotICAgICAgICAgIHBhcmFtZXRlclZhbHVlLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICBjdXJyZW50UGFyc2VyU3RhdGUgPSBQQVJTRVJfU1RBVEVfREFUQTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgLy9kdW1wUGFyYW1UYWJsZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcmVxdWVzdCBwYXJhbWV0ZXIgYXMgYSBTdHJpbmcsIG9yIG51bGwgaWYgdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4KLSAgICogSWYgdGhlIHBhcmFtZXRlciBoYXMgbXVsdGlwbGUgdmFsdWVzLCBvbmx5IHRoZSBmaXJzdCB2YWx1ZSBpcyByZXR1cm5lZC4gVXNlIGdldFBhcmFtZXRlclZhbHVlcygpCi0gICAqIGZvciBwYXJhbWV0ZXJzIHdpdGggbXVsdGlwbGUgdmFsdWVzLgotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtZXRlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAocGFyYW1UYWJsZV8gPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbigiUGFyc2VyIGNvbnRhaW5zIG5vIHBhcnNlZCBkYXRhIik7Ci0gICAgVmVjdG9yIHZhbHVlcyA9IChWZWN0b3IpcGFyYW1UYWJsZV8uZ2V0KHBhcmFtZXRlcik7Ci0gICAgcmV0dXJuICgodmFsdWVzICE9IG51bGwpPygoU3RyaW5nKXZhbHVlcy5lbGVtZW50QXQoMCkpOm51bGwpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1ldGVyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIGlmIChwYXJhbVRhYmxlXyA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uKCJQYXJzZXIgY29udGFpbnMgbm8gcGFyc2VkIGRhdGEiKTsKLSAgICBWZWN0b3IgdmFsdWVzVmVjdG9yID0gKFZlY3RvcilwYXJhbVRhYmxlXy5nZXQocGFyYW1ldGVyKTsKLSAgICBpZiAodmFsdWVzVmVjdG9yID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBTdHJpbmdbXSB2YWx1ZXNBcnJheSA9IG5ldyBTdHJpbmdbdmFsdWVzVmVjdG9yLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaT0wO2k8dmFsdWVzQXJyYXkubGVuZ3RoO2krKykKLSAgICAgIHZhbHVlc0FycmF5W2ldID0gKFN0cmluZyl2YWx1ZXNWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgIHJldHVybiB2YWx1ZXNBcnJheTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcygpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKHBhcmFtVGFibGVfID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24oIlBhcnNlciBjb250YWlucyBubyBwYXJzZWQgZGF0YSIpOwotCi0gICAgaW50IHNpemUgPSBwYXJhbVRhYmxlXy5zaXplKCk7Ci0gICAgaWYgKHNpemUgPT0gMCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICBFbnVtZXJhdGlvbiBrZXlzID0gcGFyYW1UYWJsZV8ua2V5cygpOwotICAgIGZvciAoaW50IGk9MDtpPHNpemU7aSsrKQotICAgICAgbmFtZXNbaV0gPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgc2F2ZURhdGEoU3RyaW5nIHBhcmFtZXRlck5hbWUsU3RyaW5nIHBhcmFtZXRlclZhbHVlKQotICB7Ci0gICAgVmVjdG9yIHZhbHVlcyA9IChWZWN0b3IpcGFyYW1UYWJsZV8uZ2V0KHBhcmFtZXRlck5hbWUpOwotICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkKLSAgICAgIHZhbHVlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICB2YWx1ZXMuYWRkRWxlbWVudChwYXJhbWV0ZXJWYWx1ZSk7Ci0gICAgcGFyYW1UYWJsZV8ucHV0KHBhcmFtZXRlck5hbWUsdmFsdWVzKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1ZhbGlkUGFyc2VyU3RhdGUoYnl0ZSBjdXJyZW50U3RhdGUsYnl0ZVtdIGV4cGVjdGVkU3RhdGVzKQotICB7Ci0gICAgYm9vbGVhbiB2YWxpZGl0eSA9IGZhbHNlOwotICAgIGZvciAoaW50IGk9MDtpPGV4cGVjdGVkU3RhdGVzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSBleHBlY3RlZFN0YXRlc1tpXSkKLSAgICAgIHsKLSAgICAgICAgdmFsaWRpdHkgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbGlkaXR5OwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ2V0UGFyc2VyRXhjZXB0aW9uTWVzc2FnZShieXRlIGN1cnJlbnRTdGF0ZSxieXRlW10gZXhwZWN0ZWRTdGF0ZXMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigiUGFyc2VyIHN0YXRlIGluY29uc2lzdGVuY3khIik7Ci0gICAgbXNnLmFwcGVuZCgnXG4nKTsKLSAgICBtc2cuYXBwZW5kKCJDdXJyZW50IHN0YXRlICAgIDogIikuYXBwZW5kKHBhcnNlclN0YXRlc1tjdXJyZW50U3RhdGVdKS5hcHBlbmQoJ1xuJyk7Ci0gICAgbXNnLmFwcGVuZCgiRXhwZWN0ZWQgc3RhdGUocyk6ICIpOwotICAgIGZvciAoaW50IGk9MDtpPGV4cGVjdGVkU3RhdGVzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgbXNnLmFwcGVuZChwYXJzZXJTdGF0ZXNbZXhwZWN0ZWRTdGF0ZXNbaV1dKTsKLSAgICAgIGlmIChpICE9IGV4cGVjdGVkU3RhdGVzLmxlbmd0aC0xKQotICAgICAgICBtc2cuYXBwZW5kKCIsICIpOwotICAgIH0KLSAgICBtc2cuYXBwZW5kKCdcbicpOwotICAgIHJldHVybiBtc2cudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvUXVpY2tTb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9RdWlja1NvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxOGVlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9RdWlja1NvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIxNyAgIDEyNzEzOCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotcHVibGljIGNsYXNzIFF1aWNrU29ydAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc29ydChPYmplY3RbXSBhLGludCBsbyxpbnQgaGkpCi0gIHsKLSAgICBPYmplY3QgdG1wOwotICAgIGludCBpID0gbG87Ci0gICAgaW50IGogPSBoaTsKLSAgICBPYmplY3QgeCA9IGFbKGxvK2hpKS8yXTsKLSAgICBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIHdoaWxlIChjb2xsYXRvci5jb21wYXJlKGFbaV0udG9TdHJpbmcoKSx4LnRvU3RyaW5nKCkpIDwgMCkgaSsrOwotICAgICAgd2hpbGUgKGNvbGxhdG9yLmNvbXBhcmUoYVtqXS50b1N0cmluZygpLHgudG9TdHJpbmcoKSkgPiAwKSBqLS07Ci0gICAgICBpZiAoaSA8PSBqKQotICAgICAgewotICAgICAgICB0bXAgPSBhW2ldOwotICAgICAgICBhW2ldID0gYVtqXTsKLSAgICAgICAgYVtqXSA9IHRtcDsKLSAgICAgICAgaSsrOwotICAgICAgICBqLS07Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoaSA8PSBqKTsKLQotICAgIGlmIChsbyA8IGopCi0gICAgICBzb3J0KGEsbG8saik7Ci0gICAgaWYgKGkgPCBoaSkKLSAgICAgIHNvcnQoYSxpLGhpKTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBtZXRob2Qgd2lsbCB1c2UgdGhlIHNhbWUgYWxnb3JpdGhtIGFzIGFib3ZlCi0gICogd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgYW55IG51bGxzIHdpbGwgYmUgYXR0YWNoZWQKLSAgKiBhdCB0aGUgZW5kCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzb3J0KFZlY3RvciB2KQotICB7Ci0gICAgLy8gZG8gbm90IHNvcnQgaWYgdmVjdG9yIGNvbnRhaW5zIGxlc3MgdGhhbiAyIGVsZW1lbnRzCi0gICAgaWYgKHYuc2l6ZSgpIDwgMikKLSAgICAgICAgcmV0dXJuOwotICAKLSAgICAvLyBwdWxscyBvdXQgdGhlIG51bGxzCi0gICAgVmVjdG9yIG51bGxzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykgewotICAgICAgT2JqZWN0IG9iaiA9IHYuZWxlbWVudEF0KGkpOwotICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iai50b1N0cmluZygpID09IG51bGwpIHsKLSAgICAgICAgbnVsbHMuYWRkKG9iaik7Ci0gICAgICAgIHYucmVtb3ZlKGkpOwotICAgICAgICBpLS07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gc29ydCB0aGUgbm90IG51bGwgb2JqZWN0cwotICAgIE9iamVjdFtdIG9ianMgPSB2LnRvQXJyYXkoKTsKLSAgICAvLyBkbyBub3Qgc29ydCBpZiBhcnJheSBjb250YWlucyBsZXNzIHRoYW4gMiBvYmplY3RzCi0gICAgaWYgKG9ianMubGVuZ3RoID49IDIpCi0gICAgICAgIHNvcnQob2JqcywgMCwgb2Jqcy5sZW5ndGgtMSk7Ci0KLSAgICAvLyByZS1jb25zdHJ1Y3QgdGhlIHZlY3RvciBmcm9tIHRoZSBzb3J0ZWQgb2JqZWN0cywgdGhlbiB0aGUgbnVsbHMKLSAgICB2LmNsZWFyKCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBvYmpzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgIHYuYWRkKG9ianNbal0pOwotICAgIH0KLSAgICB2LmFkZEFsbChudWxscyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1RyaW1GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1RyaW1GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxNjBkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9UcmltRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47Ci1pbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLXB1YmxpYyBjbGFzcyBUcmltRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuRmlsdGVyI2luaXQoamF2YXguc2VydmxldC5GaWx0ZXJDb25maWcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBhcmcwKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YXguc2VydmxldC5GaWx0ZXIjZG9GaWx0ZXIoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCwgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UsIGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXEsIFNlcnZsZXRSZXNwb25zZSByZXNwLCBGaWx0ZXJDaGFpbiBmYykgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgQ2hhckFycmF5V3JhcHBlciByZXNwb25zZVdyYXBwZXIgPSBuZXcgQ2hhckFycmF5V3JhcHBlcigoSHR0cFNlcnZsZXRSZXNwb25zZSlyZXNwKTsKLSAgICAvLyBIYWNrIGZvciBUb21jYXQgcGVyZm9ybWFuY2UgcHJvYmxlbSB3aXRoIGZpbHRlcnMuCi0gICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocmVzcC5nZXRPdXRwdXRTdHJlYW0oKSxIVE1MVXRpbHMuVVRGOF9FTkNPRElORyk7Ci0gICAgZmMuZG9GaWx0ZXIocmVxLHJlc3BvbnNlV3JhcHBlcik7Ci0gICAgU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gcmVzcG9uc2VXcmFwcGVyLnRvU3RyaW5nKCk7Ci0gICAgb3N3LndyaXRlKHJlc3BvbnNlU3RyaW5nLnRyaW0oKSk7Ci0gICAgb3N3LmNsb3NlKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YXguc2VydmxldC5GaWx0ZXIjZGVzdHJveSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkZXN0cm95KCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1VSTFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9VUkxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA3MGIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1VSTFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIG1hbmFnaW5nIFVSTHMKLSAqIGFzIHVzZWQgYnkgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciBXZWIgYXBwbGljYXRpb24uCi0gKiBAYXV0aG9yIGNicmVhbGV5QGNhLmlibS5jb20KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVSTFV0aWxzCi17Ci0JLyoqCi0JICogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHNob3VsZCBub3QgYmUgY29uc3RydWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBVUkxVdGlscyAoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBVVEYtOAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVURjggPSAiVVRGLTgiOwotCi0JLyoqCi0JICogRXF1aXZhbGVudCB0byB7QGxpbmsgI2VuY29kZShTdHJpbmcsU3RyaW5nKX0KLQkgKiB3aXRoIHNlY29uZCBwYXJhbWV0ZXIgc2V0IHRvIHRoZSAiVVRGLTgiIGVuY29kaW5nLgotCSAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZW5jb2RlLgotCSAqIEByZXR1cm4gVGhlIGVuY29kZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykKLQl7Ci0JCXJldHVybiBlbmNvZGUocyxVVEY4KTsKLQl9Ci0JCi0JLyoqCi0JICogRXF1aXZhbGVudCB0byB7QGxpbmsgVVJMRW5jb2RlciNlbmNvZGUoU3RyaW5nLFN0cmluZyl9LAotCSAqIG9ubHkgdGhyb3dzIGFuIHVuY2hlY2tlZCB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0gd3JhcHBlZAotCSAqIGFyb3VuZCBhbiB7QGxpbmsgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbn0gaW5zdGVhZCBvZgotCSAqIGFuIHtAbGluayBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9ufS4KLQkgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIGVuY29kZS4KLQkgKiBAcGFyYW0gZW5jIFRoZSBlbmNvZGluZyB0byB1c2UuCi0JICogQHJldHVybiBUaGUgZW5jb2RlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzLCBTdHJpbmcgZW5jKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCXJldHVybiBVUkxFbmNvZGVyLmVuY29kZShzLGVuYyk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gVE9ETzogTVNHX0JST0tFTl9WTV9ET0VTX05PVF9TVVBQT1JUX1VURi04Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJU1TR19CUk9LRU5fVk1fRE9FU19OT1RfU1VQUE9SVF9VVEYtOCIsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXF1aXZhbGVudCB0byB7QGxpbmsgI2RlY29kZShTdHJpbmcsU3RyaW5nKX0KLQkgKiB3aXRoIHNlY29uZCBwYXJhbWV0ZXIgc2V0IHRvIHRoZSAiVVRGLTgiIGVuY29kaW5nLgotCSAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZGVjb2RlLgotCSAqIEByZXR1cm4gVGhlIGRlY29kZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcykKLQl7Ci0JCXJldHVybiBkZWNvZGUocyxVVEY4KTsKLQl9Ci0JCi0JLyoqCi0JICogRXF1aXZhbGVudCB0byB7QGxpbmsgVVJMRW5jb2RlciNkZWNvZGUoU3RyaW5nLFN0cmluZyl9LAotCSAqIG9ubHkgdGhyb3dzIGFuIHVuY2hlY2tlZCB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0gd3JhcHBlZAotCSAqIGFyb3VuZCBhbiB7QGxpbmsgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbn0gaW5zdGVhZCBvZgotCSAqIGFuIHtAbGluayBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9ufS4KLQkgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIGRlY29kZS4KLQkgKiBAcGFyYW0gZW5jIFRoZSBlbmNvZGluZyB0byB1c2UuCi0JICogQHJldHVybiBUaGUgZGVjb2RlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzLCBTdHJpbmcgZW5jKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCXJldHVybiBVUkxEZWNvZGVyLmRlY29kZShzLGVuYyk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gVE9ETzogTVNHX0JST0tFTl9WTV9ET0VTX05PVF9TVVBQT1JUX1VURi04Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJU1TR19CUk9LRU5fVk1fRE9FU19OT1RfU1VQUE9SVF9VVEYtOCIsZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGY3YWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDYxMiAgIDE0MjI5MCBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbDsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVTdHJpbmcoU3RyaW5nIGlucHV0KQotICB7Ci0gICAgcmV0dXJuICgoaW5wdXQgIT0gbnVsbCkgJiYgKGlucHV0LnRyaW0oKS5sZW5ndGgoKSA+IDApKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB2YWxpZGF0ZVVSTChTdHJpbmcgaW5wdXQpCi0gIHsKLQkgIHJldHVybiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5tYXRjaGVzKCJbYS16QS1aXFwrXFwtXFwuXSsrOi4qIikpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVJbnRlZ2VyKFN0cmluZyBpbnB1dCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIEludGVnZXIucGFyc2VJbnQoaW5wdXQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9YTUxVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvWE1MVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyZTEyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9YTUxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MVXRpbHMKLXsKLSAgLyoqCi0gICAqIFNlcmlhbGl6ZSBhbiBYTUwgRWxlbWVudCBpbnRvIGEgU3RyaW5nLgotICAgKiBAcGFyYW0gZSBFbGVtZW50IHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIEBwYXJhbSBvbWl0WE1MRGVjbGFyYXRpb24gYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdG8gb21pdCB0aGUgWE1MIGRlY2xhcmF0aW9uLgotICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgWE1MIGRvY3VtZW50IGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VyaWFsaXplKEVsZW1lbnQgZSxib29sZWFuIG9taXRYTUxEZWNsYXJhdGlvbikKLSAgewotICAgIGlmIChlICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0JCURPTVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGUpOwotCQlUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAoKG9taXRYTUxEZWNsYXJhdGlvbikgPyAieWVzIiA6ICJubyIpKTsKLQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKTsKLQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiMiIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2VyaWFsaXplci50cmFuc2Zvcm0oZG9tU291cmNlLCBuZXcJU3RyZWFtUmVzdWx0KGJhb3MpKTsKLQkJYmFvcy5jbG9zZSgpOwotCQlyZXR1cm4gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksIEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIFNlcmlhbGl6ZSBhbiBYTUwgRWxlbWVudCBpbnRvIGEgU3RyaW5nLgotICAgKiBAcGFyYW0gZGYgRG9jdW1lbnRGcmFnbWVudCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBAcGFyYW0gb21pdFhNTERlY2xhcmF0aW9uIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRvIG9taXQgdGhlIFhNTCBkZWNsYXJhdGlvbi4KLSAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFhNTCBkb2N1bWVudCBmcmFnbWVudC4KLSAgICovICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VyaWFsaXplKERvY3VtZW50RnJhZ21lbnQgZGYsYm9vbGVhbiBvbWl0WE1MRGVjbGFyYXRpb24pCi0gIHsKLSAgICBpZiAoZGYgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLQkJRE9NU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZGYpOwotCQlUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAoKG9taXRYTUxEZWNsYXJhdGlvbikgPyAieWVzIiA6ICJubyIpKTsKLQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKTsKLQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiMiIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2VyaWFsaXplci50cmFuc2Zvcm0oZG9tU291cmNlLCBuZXcJU3RyZWFtUmVzdWx0KGJhb3MpKTsKLQkJYmFvcy5jbG9zZSgpOwotCQlyZXR1cm4gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksIEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgWE1MIERvY3VtZW50LgotICAgKiBAcGFyYW0gZG9jQnVpbGRlciBEb2N1bWVudEJ1aWxkZXIuIFNldHRpbmcgdGhpcyB0byBudWxsIHdpbGwgY3JlYXRlIGEgbmV3IERvY3VtZW50QnVpbGRlci4KLSAgICogQHJldHVybiBEb2N1bWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBEb2N1bWVudCBjcmVhdGVOZXdEb2N1bWVudChEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlcikgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIGlmIChkb2NCdWlsZGVyID09IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7Ci0gICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgZG9jQnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgfQotICAgIERvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICByZXR1cm4gZG9jOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBFbGVtZW50IGludG8gYW4gRWxlbWVudAotICAgKiBAcGFyYW0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIEVsZW1lbnQuCi0gICAqIEByZXR1cm4gRWxlbWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFbGVtZW50IHN0cmluZ1RvRWxlbWVudChTdHJpbmcgcykgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBzdHJpbmdUb0VsZW1lbnQocywgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBFbGVtZW50IGludG8gYW4gRWxlbWVudAotICAgKiBAcGFyYW0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIEVsZW1lbnQuCi0gICAqIEBwYXJhbSBib29sZWFuIHNldCB3aGV0aGVyIHRoZSByZXR1cm4gRWxlbWVudCBzaG91bGQgYmUgbmFtZXNwYWNlIGF3YXJlLgotICAgKiBAcmV0dXJuIEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBzdHJpbmdUb0VsZW1lbnQoU3RyaW5nIHMsIGJvb2xlYW4gbmFtZXNwYWNlQXdhcmUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gYnl0ZUFycmF5VG9FbGVtZW50KHMuZ2V0Qnl0ZXMoSFRNTFV0aWxzLlVURjhfRU5DT0RJTkcpLCBuYW1lc3BhY2VBd2FyZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydCB0aGUgYnl0ZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiBhbiBFbGVtZW50IGludG8gYW4gRWxlbWVudAotICAgKiBAcGFyYW0gYnl0ZVtdIHJlcHJlc2VudGF0aW9uIG9mIGFuIEVsZW1lbnQuCi0gICAqIEBwYXJhbSBib29sZWFuIHNldCB3aGV0aGVyIHRoZSByZXR1cm4gRWxlbWVudCBzaG91bGQgYmUgbmFtZXNwYWNlIGF3YXJlLgotICAgKiBAcmV0dXJuIEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBieXRlQXJyYXlUb0VsZW1lbnQoYnl0ZVtdIGIsIGJvb2xlYW4gbmFtZXNwYWNlQXdhcmUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY0J1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIGRvY0J1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKG5hbWVzcGFjZUF3YXJlKTsKLSAgICBkb2NCdWlsZGVyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRvY0J1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIERvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpKTsKLSAgICByZXR1cm4gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0NsZWFyV1NETEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9DbGVhcldTRExBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmMmMyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0NsZWFyV1NETEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5DbGVhck5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETE1haW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExOb2RlOwotCi1wdWJsaWMgY2xhc3MgQ2xlYXJXU0RMQWN0aW9uIGV4dGVuZHMgQ2xlYXJOb2RlQWN0aW9uIHsKLQotICBwdWJsaWMgQ2xlYXJXU0RMQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQpIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGwvYWN0aW9ucy9DbGVhcldTRExBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgU3RyaW5nIG5vZGVJRFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGludCBub2RlSUQ7Ci0gICAgdHJ5IHsKLSAgICAgIG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQobm9kZUlEU3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgIG5vZGVJRCA9IG5vZGVNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGVJZCgpOwotICAgIH0KLSAgICBib29sZWFuIHBhcmFtVmFsaWQgPSBmYWxzZTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgV1NETE1haW5Ob2RlKQotICAgICAgcGFyYW1WYWxpZCA9IHRydWU7Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFdTRExOb2RlKQotICAgICAgcGFyYW1WYWxpZCA9IHRydWU7Ci0gICAgZWxzZSB7Ci0gICAgICB3aGlsZSAobm9kZSAhPSBudWxsICYmICEobm9kZSBpbnN0YW5jZW9mIFdTRExNYWluTm9kZSkpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgV1NETE5vZGUpIHsKLSAgICAgICAgICBub2RlSUQgPSBub2RlLmdldE5vZGVJZCgpOwotICAgICAgICAgIHBhcmFtVmFsaWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBTdHJpbmcudmFsdWVPZihub2RlSUQpKTsKLSAgICByZXR1cm4gcGFyYW1WYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICBpZiAoc3VwZXIucnVuKCkpIHsKLSAgICAgIG5vZGVNYW5hZ2VyXy5zZXRTZWxlY3RlZE5vZGVJZChub2RlTWFuYWdlcl8uZ2V0Um9vdE5vZGUoKS5nZXROb2RlSWQoKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpIHsKLSAgICByZXR1cm4gIndzZGxOYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkgewotICAgIHJldHVybiAid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKSB7Ci0gICAgcmV0dXJuICJ3c2RsUHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkgewotICAgIHJldHVybiAid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKSB7Ci0gICAgcmV0dXJuICJ3c2RsU3RhdHVzQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkgewotICAgIHJldHVybiAid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvQ3JlYXRlSW5zdGFuY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvQ3JlYXRlSW5zdGFuY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwZDI1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0NyZWF0ZUluc3RhbmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMT3BlcmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTRE1hcEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLkludm9rZVdTRExPcGVyYXRpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZTsKLQotcHVibGljIGNsYXNzIENyZWF0ZUluc3RhbmNlQWN0aW9uIGV4dGVuZHMgV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHB1YmxpYyBDcmVhdGVJbnN0YW5jZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5wcm9jZXNzUGFyc2VkUmVzdWx0cyhwYXJzZXIpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgSW52b2tlV1NETE9wZXJhdGlvblRvb2wgaW52b2tlV1NETE9wZXJhdGlvblRvb2wgPSAoSW52b2tlV1NETE9wZXJhdGlvblRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgSXRlcmF0b3IgaXQgPSBvcGVyRWxlbWVudC5nZXRPcmRlcmVkQm9keVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICBib29sZWFuIHJlc3VsdHNWYWxpZCA9IHRydWU7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdC5uZXh0KCk7Ci0gICAgICBJWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgaWYgKCFmcmFnLnByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMocGFyc2VyKSkKLSAgICAgICAgcmVzdWx0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIFN0cmluZyBmcmFnbWVudElEID0gcGFyc2VyLmdldFBhcmFtZXRlcihGcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9JRCk7Ci0gICAgaWYgKGZyYWdtZW50SUQgIT0gbnVsbCAmJiBmcmFnbWVudElELmxlbmd0aCgpID4gMCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChGcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9JRCwgZnJhZ21lbnRJRCk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnJlbW92ZShGcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9JRCk7Ci0gICAgICByZXN1bHRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgU3RyaW5nIG5hbWVBbmNob3JJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoRnJhZ21lbnRDb25zdGFudHMuTkFNRV9BTkNIT1JfSUQpOwotICAgIGludm9rZVdTRExPcGVyYXRpb25Ub29sLnNldEZyYWdtZW50TmFtZUFuY2hvcklEKG5hbWVBbmNob3JJRCk7Ci0gICAgcmV0dXJuIHJlc3VsdHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkKLSAgewotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICByZXR1cm4gKEZvcm1Ub29sKXdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nIGZyYWdtZW50SUQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChGcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9JRCk7Ci0gICAgaWYgKGZyYWdtZW50SUQgIT0gbnVsbCAmJiBmcmFnbWVudElELmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ21lbnRJRCk7Ci0gICAgICBpZiAoKGZyYWcgaW5zdGFuY2VvZiBJWFNETWFwRnJhZ21lbnQpICYmICgoSVhTRE1hcEZyYWdtZW50KWZyYWcpLmNyZWF0ZUluc3RhbmNlKCkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cEdldE9wZXJhdGlvbkZvcm1BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvSW52b2tlV1NETEh0dHBHZXRPcGVyYXRpb25Gb3JtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNGY4YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cEdldE9wZXJhdGlvbkZvcm1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5Lk5ldFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgSW52b2tlV1NETEh0dHBHZXRPcGVyYXRpb25Gb3JtQWN0aW9uIGV4dGVuZHMgSW52b2tlV1NETEh0dHBPcGVyYXRpb25Gb3JtQWN0aW9uCi17Ci0gIHB1YmxpYyBJbnZva2VXU0RMSHR0cEdldE9wZXJhdGlvbkZvcm1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLSAgICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIFN0cmluZ0J1ZmZlciBlbmRQb2ludCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0RW5kUG9pbnQoKSk7Ci0gICAgZW5kUG9pbnQuYXBwZW5kKCc/Jyk7Ci0gICAgYWRkUGFyYW1ldGVycyhlbmRQb2ludCk7Ci0gICAgU3RyaW5nIGVuZFBvaW50U3RyaW5nID0gZW5kUG9pbnQudG9TdHJpbmcoKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IE5ldFV0aWxzLmdldFVSTENvbm5lY3Rpb24oZW5kUG9pbnRTdHJpbmcpOwotICAgICAgaWYgKGNvbm4gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVjb3JkSHR0cFJlc3BvbnNlKGNvbm4sbWVzc2FnZVF1ZXVlKTsKLSAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldE9wZXJhdGlvbk5vZGUoZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkpOwotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fQ09OTkVDVCIsZW5kUG9pbnRTdHJpbmcpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih3c2RsUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJJT0V4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvSW52b2tlV1NETEh0dHBPcGVyYXRpb25Gb3JtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwT3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTYxNjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvSW52b2tlV1NETEh0dHBPcGVyYXRpb25Gb3JtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExPcGVyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC5IVFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5JbnZva2VXU0RMT3BlcmF0aW9uVG9vbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEludm9rZVdTRExIdHRwT3BlcmF0aW9uRm9ybUFjdGlvbiBleHRlbmRzIFdTRExQcm9wZXJ0aWVzRm9ybUFjdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX0NIQVJTRVRFUSA9ICJjaGFyc2V0PSI7Ci0gIAotICBwdWJsaWMgSW52b2tlV1NETEh0dHBPcGVyYXRpb25Gb3JtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIucHJvY2Vzc1BhcnNlZFJlc3VsdHMocGFyc2VyKTsKLSAgICBTdHJpbmcgZW5kUG9pbnQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIEludm9rZVdTRExPcGVyYXRpb25Ub29sIGludm9rZVdTRExPcGVyYXRpb25Ub29sID0gKEludm9rZVdTRExPcGVyYXRpb25Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgIGludm9rZVdTRExPcGVyYXRpb25Ub29sLnNldEVuZFBvaW50KGVuZFBvaW50KTsKLSAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudCkoc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCkpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChXU0RMQWN0aW9uSW5wdXRzLk9QRVJBVElPTl9FTEVNRU5ULG9wZXJFbGVtZW50KTsKLSAgICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgIGJvb2xlYW4gcmVzdWx0c1ZhbGlkID0gdHJ1ZTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdC5uZXh0KCk7Ci0gICAgICBJRnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgaWYgKCFmcmFnLnByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMocGFyc2VyKSkKLSAgICAgICAgcmVzdWx0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHRzVmFsaWQ7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRFbmRQb2ludCgpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgZW5kUG9pbnQgPSBuZXcgU3RyaW5nQnVmZmVyKChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UKSk7Ci0gICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpcHJvcGVydHlUYWJsZV8uZ2V0KFdTRExBY3Rpb25JbnB1dHMuT1BFUkFUSU9OX0VMRU1FTlQpOwotICAgIGlmIChlbmRQb2ludC5jaGFyQXQoZW5kUG9pbnQubGVuZ3RoKCktMSkgIT0gJy8nKQotICAgICAgZW5kUG9pbnQuYXBwZW5kKCcvJyk7Ci0gICAgZW5kUG9pbnQuYXBwZW5kKG9wZXJFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgcmV0dXJuIGVuZFBvaW50LnRvU3RyaW5nKCk7ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbWV0ZXJzKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5PUEVSQVRJT05fRUxFTUVOVCk7Ci0gICAgSXRlcmF0b3IgaXQgPSBvcGVyRWxlbWVudC5nZXRPcmRlcmVkQm9keVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWl0Lm5leHQoKTsKLSAgICAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICBidWZmZXIuYXBwZW5kKEhUVFBVdGlsLmdlblVSTEVuY29kZWRQYXJhbWV0ZXJzKGZyYWcpKTsKLSAgICAgIGlmIChpdC5oYXNOZXh0KCkpCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJyYnKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlY29yZEh0dHBSZXNwb25zZShVUkxDb25uZWN0aW9uIGNvbm4sTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaW4gPSBudWxsOwotICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gY29ubi5nZXRDb250ZW50VHlwZSgpOwotICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBjaGFyc2V0RXFQb3MgPSBjb250ZW50VHlwZS5pbmRleE9mKENPTlRFTlRfVFlQRV9DSEFSU0VURVEpOwotICAgICAgICBpZiAoY2hhcnNldEVxUG9zICE9IC0xKQotICAgICAgICAgIGluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbm4uZ2V0SW5wdXRTdHJlYW0oKSxjb250ZW50VHlwZS5zdWJzdHJpbmcoY2hhcnNldEVxUG9zK0NPTlRFTlRfVFlQRV9DSEFSU0VURVEubGVuZ3RoKCkpKTsKLSAgICAgIH0KLSAgICAgIGlmIChpbiA9PSBudWxsKQotICAgICAgICBpbiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb25uLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaW4pOwotICAgICAgU3RyaW5nIHM7Ci0gICAgICB3aGlsZSAoKHMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShzKTsKLSAgICAgIGJyLmNsb3NlKCk7Ci0gICAgICBiciA9IG51bGw7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGlmIChiciAhPSBudWxsKQotICAgICAgICBici5jbG9zZSgpOwotICAgICAgdGhyb3cgZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvSW52b2tlV1NETEh0dHBQb3N0T3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cFBvc3RPcGVyYXRpb25Gb3JtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzU2MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cFBvc3RPcGVyYXRpb25Gb3JtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5Lk5ldFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgSW52b2tlV1NETEh0dHBQb3N0T3BlcmF0aW9uRm9ybUFjdGlvbiBleHRlbmRzIEludm9rZVdTRExIdHRwT3BlcmF0aW9uRm9ybUFjdGlvbgotewotCi0gIHB1YmxpYyBJbnZva2VXU0RMSHR0cFBvc3RPcGVyYXRpb25Gb3JtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgU3RyaW5nIGVuZFBvaW50U3RyaW5nID0gZ2V0RW5kUG9pbnQoKTsKLSAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSBOZXRVdGlscy5nZXRVUkxDb25uZWN0aW9uKGVuZFBvaW50U3RyaW5nKTsKLSAgICBpZiAoY29ubiAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgYWRkUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKLSAgICAgIGNvbm4uc2V0RG9PdXRwdXQodHJ1ZSk7Ci0gICAgICBQcmludFdyaXRlciBvdXQgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIG91dCA9IG5ldyBQcmludFdyaXRlcihjb25uLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgb3V0LnByaW50KHBhcmFtZXRlcnMpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgb3V0ID0gbnVsbDsKLSAgICAgICAgcmVjb3JkSHR0cFJlc3BvbnNlKGNvbm4sbWVzc2FnZVF1ZXVlKTsKLSAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldE9wZXJhdGlvbk5vZGUoZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkpOwotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiSU9FeGNlcHRpb24iLGUpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBpZiAob3V0ICE9IG51bGwpCi0gICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiRXhjZXB0aW9uIixuZXcgSU9FeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fQ09OTkVDVCIsZW5kUG9pbnRTdHJpbmcpKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNhNGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvSW52b2tlV1NETFNPQVBPcGVyYXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLkVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMQmluZGluZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMT3BlcmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETFNlcnZpY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5JbnZva2VXU0RMT3BlcmF0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5TT0FQTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQuSFRUUEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQuSFRUUFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC51dGlsLlNvYXBIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuTmV0VXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEludm9rZVdTRExTT0FQT3BlcmF0aW9uQWN0aW9uIGV4dGVuZHMgV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHB1YmxpYyBJbnZva2VXU0RMU09BUE9wZXJhdGlvbkFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5wcm9jZXNzUGFyc2VkUmVzdWx0cyhwYXJzZXIpOwotICAgIFN0cmluZyBlbmRQb2ludCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQpOwotICAgIEludm9rZVdTRExPcGVyYXRpb25Ub29sIGludm9rZVdTRExPcGVyYXRpb25Ub29sID0gKEludm9rZVdTRExPcGVyYXRpb25Ub29sKShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICAgaW52b2tlV1NETE9wZXJhdGlvblRvb2wuc2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUlBDV3JhcHBlcihWZWN0b3IgYm9keUVudHJpZXMsV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQsV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQsSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgLy8gTXVzdCBiZSBSUEMgc3R5bGUuCi0gICAgU3RyaW5nIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAvKgotICAgICAqIFdTLUk6IEluIGEgcnBjLWxpdGVyYWwgU09BUCBiaW5kaW5nLCB0aGUgc2VyaWFsaXplZCBjaGlsZCBlbGVtZW50IG9mIHRoZSAKLSAgICAgKiBzb2FwOkJvZHkgZWxlbWVudCBjb25zaXN0cyBvZiBhIHdyYXBwZXIgZWxlbWVudCwgd2hvc2UgbmFtZXNwYWNlIGlzIHRoZSB2YWx1ZSAKLSAgICAgKiBvZiB0aGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBvZiB0aGUgc29hcGJpbmQ6Ym9keSBlbGVtZW50IGFuZCB3aG9zZSBsb2NhbCBuYW1lIGlzIAotICAgICAqIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIG9yIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gc3VmZml4ZWQgCi0gICAgICogd2l0aCAiUmVzcG9uc2UiLiBUaGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgYXMgb3Bwb3NlZCB0byBiZWluZyAKLSAgICAgKiBvcHRpb25hbCwgdG8gZW5zdXJlIHRoYXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBzb2FwOkJvZHkgZWxlbWVudCBhcmUgbmFtZXNwYWNlLQotICAgICAqIHF1YWxpZmllZC4KLSAgICAgKi8KLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBvcGVyRWxlbWVudC5nZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgIGlmIChiaW5kaW5nSW5wdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0Lm5leHQoKTsKLSAgICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gKChTT0FQQm9keSlleHRFbGVtZW50KS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBJZiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQgaXMgbm90IHNldCwgZ2V0IGl0IGZyb20gdGhlIG9wZXJhdGlvbiBlbGVtZW50Ci0gICAgaWYgKGVuY29kaW5nTmFtZXNwYWNlVVJJID09IG51bGwpCi0gICAgICBlbmNvZGluZ05hbWVzcGFjZVVSSSA9IG9wZXJFbGVtZW50LmdldEVuY29kaW5nTmFtZXNwYWNlKCk7Ci0gICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBvZiB0aGUgb3BlcmF0aW9uIGVsZW1lbnQgaXMgbm90IHNldCwgZ2V0IGl0IGZyb20gdGhlIGRlZmluaXRpb24gZWxlbWVudAotICAgIGlmIChlbmNvZGluZ05hbWVzcGFjZVVSSSA9PSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxFbGVtZW50LmdldERlZmluaXRpb24oKTsKLSAgICAgIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgLy8gR2VuZXJhdGUgYW4gUlBDIHN0eWxlIHdyYXBwZXIgZWxlbWVudC4KLSAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKTsKLSAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZSA9IChvcGVyRWxlbWVudC5pc1VzZUxpdGVyYWwoKSA/IG51bGwgOiBvcGVyRWxlbWVudC5nZXRFbmNvZGluZ1N0eWxlKCkpOwotICAgIEVsZW1lbnQgd3JhcHBlckVsZW1lbnQgPSBTb2FwSGVscGVyLmNyZWF0ZVJQQ1dyYXBwZXJFbGVtZW50KGRvYyxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxlbmNvZGluZ05hbWVzcGFjZVVSSSxvcGVyRWxlbWVudC5nZXRPcGVyYXRpb24oKS5nZXROYW1lKCksZW5jb2RpbmdTdHlsZSk7Ci0gICAgZm9yIChpbnQgaT0wO2k8Ym9keUVudHJpZXMuc2l6ZSgpO2krKykKLSAgICAgIHdyYXBwZXJFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKChFbGVtZW50KWJvZHlFbnRyaWVzLmVsZW1lbnRBdChpKSx0cnVlKSk7Ci0gICAgYm9keUVudHJpZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBib2R5RW50cmllcy5hZGRFbGVtZW50KHdyYXBwZXJFbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBhIFZlY3RvciBvZiB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSBTb2FwIEJvZHkuCi0gICAqIEBwYXJhbSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSAtIEhhc2h0YWJsZSBjb250YWluaW5nIGEgbWFwIG9mIHRoZSBuYW1lc3BhY2UgVVJJcyB0byBwcmVmaXhlcy4KLSAgICogQHBhcmFtIG9wZXJFbGVtZW50IC0gV1NETE9wZXJhdGlvbkVsZW1lbnQgZW5jYXBzdWxhdGluZyB0aGUgV1NETCBvcGVyYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGdldEJvZHlFbnRyaWVzKEhhc2h0YWJsZSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCxXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsV1NETFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50KSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbixFeGNlcHRpb24KLSAgewotICAgIFZlY3RvciBib2R5RW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBib29sZWFuIGlzVXNlTGl0ZXJhbCA9IG9wZXJFbGVtZW50LmlzVXNlTGl0ZXJhbCgpOwotICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlID0gb3BlckVsZW1lbnQuZ2V0RW5jb2RpbmdTdHlsZSgpOwotICAgIGJvb2xlYW4gYWRkRW5jb2RpbmdTdHlsZSA9ICghaXNVc2VMaXRlcmFsICYmICFDb25zdGFudHMuVVJJX1NPQVAxMV9FTkMuZXF1YWxzKGVuY29kaW5nU3R5bGUpKTsKLSAgICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXQubmV4dCgpOwotICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSAoSVhTREZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gZnJhZy5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoIWlzVXNlTGl0ZXJhbCxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSwgWE1MVXRpbHMuY3JlYXRlTmV3RG9jdW1lbnQobnVsbCkpOwotICAgICAgZm9yIChpbnQgaj0wO2o8aW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoO2orKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzW2pdID09IG51bGwpCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChhZGRFbmNvZGluZ1N0eWxlKQotICAgICAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2pdLnNldEF0dHJpYnV0ZSgic29hcGVudjplbmNvZGluZ1N0eWxlIixlbmNvZGluZ1N0eWxlKTsKLSAgICAgICAgYm9keUVudHJpZXMuYWRkRWxlbWVudChpbnN0YW5jZURvY3VtZW50c1tqXSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFvcGVyRWxlbWVudC5pc0RvY3VtZW50U3R5bGUoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYWRkUlBDV3JhcHBlcihib2R5RW50cmllcywoV1NETEVsZW1lbnQpc2VydmljZUVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpLG9wZXJFbGVtZW50LHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBib2R5RW50cmllczsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldFNPQVBFbnZlbG9wZShIYXNodGFibGUgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUsIFZlY3RvciBib2R5RW50cmllcykgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLmNyZWF0ZU5ld0RvY3VtZW50KGRvY0J1aWxkZXIpOwotICAgIEVsZW1lbnQgc29hcEVudmVsb3BlRWxlbWVudCA9IFNvYXBIZWxwZXIuY3JlYXRlU29hcEVudmVsb3BlRWxlbWVudChkb2Msc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUpOwotICAgIEVsZW1lbnQgc29hcEJvZHlFbGVtZW50ID0gU29hcEhlbHBlci5jcmVhdGVTb2FwQm9keUVsZW1lbnQoZG9jKTsKLSAgICBmb3IgKGludCBpPTA7aTxib2R5RW50cmllcy5zaXplKCk7aSsrKQotICAgICAgc29hcEJvZHlFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKChFbGVtZW50KWJvZHlFbnRyaWVzLmVsZW1lbnRBdChpKSx0cnVlKSk7Ci0gICAgc29hcEVudmVsb3BlRWxlbWVudC5hcHBlbmRDaGlsZChzb2FwQm9keUVsZW1lbnQpOwotICAgIHJldHVybiBzb2FwRW52ZWxvcGVFbGVtZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHJlY29yZFNvYXBSZXF1ZXN0KFNPQVBNZXNzYWdlUXVldWUgc29hcFJlcXVlc3RRdWV1ZSxIYXNodGFibGUgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUsRWxlbWVudCBzb2FwRW52ZWxvcGUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLElPRXhjZXB0aW9uCi0gIHsKLSAgICBzb2FwUmVxdWVzdFF1ZXVlLmNsZWFyKCk7Ci0gICAgc29hcFJlcXVlc3RRdWV1ZS5hZGRNZXNzYWdlKFhNTFV0aWxzLnNlcmlhbGl6ZShzb2FwRW52ZWxvcGUsZmFsc2UpKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCByZWNvcmRTT0FQUmVzcG9uc2UoU09BUE1lc3NhZ2VRdWV1ZSBzb2FwUmVzcG9uc2VRdWV1ZSxCdWZmZXJlZFJlYWRlciByZXNwb25zZVJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBzb2FwUmVzcG9uc2VRdWV1ZS5jbGVhcigpOwotICAgIGlmIChyZXNwb25zZVJlYWRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKLSAgICAgIHdoaWxlICgobGluZSA9IHJlc3BvbnNlUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgICAgIHNvYXBSZXNwb25zZVF1ZXVlLmFkZE1lc3NhZ2UobGluZSk7Ci0gICAgICByZXNwb25zZVJlYWRlci5jbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgc29hcEFkZHJlc3NMb2NhdGlvbiA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IChXU0RMQmluZGluZ0VsZW1lbnQpb3BlckVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpYmluZGluZ0VsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNPYmplY3QoV1NETEFjdGlvbklucHV0cy5TT0FQX1JFU1BPTlNFX0NBQ0hFRCwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZW5lcmF0ZSB0aGUgU09BUCBlbnZlbG9wZSBhbmQgaXRzIGNoaWxkcmVuLiBXZSBuZWVkIHRvIGNyZWF0ZSBhIERPTSBlbGVtZW50IHZlcnNpb24gdG8gZGlzcGxheSBhbmQgdGhlIG9iamVjdCB2ZXJzaW9uIHRvIGV4ZWN1dGUuCi0gICAgICAvLyA8U09BUC1FTlY6RW52ZWxvcGUKLSAgICAgIC8vICAgIHhtbG5zOlNPQVAtRU5WPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgIC8vICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAvLyAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIC8vIC4uLgotICAgICAgSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgU29hcEhlbHBlci5hZGREZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlcyhzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSk7Ci0gICAgICBWZWN0b3IgYm9keUVudHJpZXMgPSBnZXRCb2R5RW50cmllcyhzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxvcGVyRWxlbWVudCxiaW5kaW5nRWxlbWVudCxzZXJ2aWNlRWxlbWVudCk7Ci0gICAgICBFbGVtZW50IHNvYXBFbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZShzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSwgYm9keUVudHJpZXMpOwotICAgICAgcmVjb3JkU29hcFJlcXVlc3Qod3NkbFBlcnNwZWN0aXZlLmdldFNPQVBSZXF1ZXN0UXVldWUoKSxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxzb2FwRW52ZWxvcGUpOwotCi0gICAgICAvLyBFeGVjdXRlIHRoZSBTT0FQIG9wZXJhdGlvbi4KLSAgICAgIGlmIChzb2FwQWRkcmVzc0xvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgYW5kIHJlY29yZCB0aGUgU09BUCBSZXNwb25zZSBFbnZlbG9wZS4KLSAgICAgICAgSFRUUFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBjcmVhdGVUcmFuc3BvcnQoYmluZGluZ0VsZW1lbnQsIHNvYXBBZGRyZXNzTG9jYXRpb24pOwotICAgICAgICB0cmFuc3BvcnQuc2VuZChOZXRVdGlscy5jcmVhdGVVUkwoc29hcEFkZHJlc3NMb2NhdGlvbiksb3BlckVsZW1lbnQuZ2V0U29hcEFjdGlvbigpLFhNTFV0aWxzLnNlcmlhbGl6ZShzb2FwRW52ZWxvcGUsIHRydWUpKTsKLSAgICAgICAgcmVjb3JkU09BUFJlc3BvbnNlKHdzZGxQZXJzcGVjdGl2ZS5nZXRTT0FQUmVzcG9uc2VRdWV1ZSgpLHRyYW5zcG9ydC5yZWNlaXZlKCkpOwotICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0T3BlcmF0aW9uTm9kZShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX0NPTk5FQ1QiLHNvYXBBZGRyZXNzTG9jYXRpb24pKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIklPRXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEhUVFBFeGNlcHRpb24gaHR0cGUpCi0gICAgewotICAgICAgdGhyb3dIVFRQRXhjZXB0aW9uKGJpbmRpbmdFbGVtZW50LCBzb2FwQWRkcmVzc0xvY2F0aW9uLCBodHRwZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIkV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHRocm93SFRUUEV4Y2VwdGlvbihXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsIFN0cmluZyBlbmRwb2ludFN0cmluZywgSFRUUEV4Y2VwdGlvbiBodHRwRXhjZXB0aW9uKSB0aHJvd3MgSFRUUEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGh0dHBFeGNlcHRpb24uZ2V0U3RhdHVzQ29kZSgpID09IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKQotICAgIHsKLSAgICAgIEVuZHBvaW50IGVuZHBvaW50ID0gYmluZGluZ0VsZW1lbnQuZ2V0RW5kcG9pbnQoZW5kcG9pbnRTdHJpbmcpOwotICAgICAgaWYgKGVuZHBvaW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVuZHBvaW50LnNldFJlcXVpcmVIVFRQQmFzaWNBdXRoKHRydWUpOwotICAgICAgICBlbmRwb2ludC5zZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUobnVsbCk7Ci0gICAgICAgIGVuZHBvaW50LnNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgaHR0cEV4Y2VwdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBIVFRQVHJhbnNwb3J0IGNyZWF0ZVRyYW5zcG9ydChXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsIFN0cmluZyBlbmRwb2ludFN0cmluZykKLSAgewotICAgIEhUVFBUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IEhUVFBUcmFuc3BvcnQoKTsKLSAgICBFbmRwb2ludCBlbmRwb2ludCA9IGJpbmRpbmdFbGVtZW50LmdldEVuZHBvaW50KGVuZHBvaW50U3RyaW5nKTsKLSAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZW5kcG9pbnQuaXNSZXF1aXJlSFRUUEJhc2ljQXV0aCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gZW5kcG9pbnQuZ2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKCk7Ci0gICAgICAgIFN0cmluZyBodHRwQmFzaWNBdXRoUGFzc3dvcmQgPSBlbmRwb2ludC5nZXRIdHRwQmFzaWNBdXRoUGFzc3dvcmQoKTsKLSAgICAgICAgaWYgKGh0dHBCYXNpY0F1dGhVc2VybmFtZSA9PSBudWxsIHx8IGh0dHBCYXNpY0F1dGhQYXNzd29yZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUpOwotICAgICAgICAgIGh0dHBCYXNpY0F1dGhQYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdTRExBY3Rpb25JbnB1dHMuSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEKTsKLSAgICAgICAgICBlbmRwb2ludC5zZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUoaHR0cEJhc2ljQXV0aFVzZXJuYW1lKTsKLSAgICAgICAgICBlbmRwb2ludC5zZXRIdHRwQmFzaWNBdXRoUGFzc3dvcmQoaHR0cEJhc2ljQXV0aFBhc3N3b3JkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHR0cEJhc2ljQXV0aFVzZXJuYW1lICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aFBhc3N3b3JkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cmFuc3BvcnQuc2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKGh0dHBCYXNpY0F1dGhVc2VybmFtZSk7Ci0gICAgICAgICAgdHJhbnNwb3J0LnNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChodHRwQmFzaWNBdXRoUGFzc3dvcmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cmFuc3BvcnQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvbkZvcm1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1MzYzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETE9wZXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc2Zvcm1lci5GcmFnbWVudFRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgSW52b2tlV1NETFNPQVBPcGVyYXRpb25Gb3JtQWN0aW9uIGV4dGVuZHMgSW52b2tlV1NETFNPQVBPcGVyYXRpb25BY3Rpb24KLXsKLSAgcHVibGljIEludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdHNWYWxpZCA9IHRydWU7Ci0gICAgc3VwZXIucHJvY2Vzc1BhcnNlZFJlc3VsdHMocGFyc2VyKTsKLSAgICBTdHJpbmcgc291cmNlQ29udGVudCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoRnJhZ21lbnRDb25zdGFudHMuU09VUkNFX0NPTlRFTlQpOwotICAgIGlmIChzb3VyY2VDb250ZW50ID09IG51bGwpCi0gICAgewotICAgICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgSXRlcmF0b3IgaXQgPSBvcGVyRWxlbWVudC5nZXRPcmRlcmVkQm9keVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpdC5uZXh0KCk7Ci0gICAgICAgIElGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICAgIGlmICghZnJhZy5wcm9jZXNzUGFyYW1ldGVyVmFsdWVzKHBhcnNlcikpCi0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1ZBTElEQVRJTkdfUEFSQU1FVEVSIiwgcGFydC5nZXROYW1lKCkpKTsKLSAgICAgICAgICByZXN1bHRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICBJVHJhbnNmb3JtZXJbXSBwYXJlbnRUcmFuc2Zvcm1lcnMgPSBzdXBlci5nZXRUcmFuc2Zvcm1lcnMoKTsKLSAgICBJVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMgPSBuZXcgSVRyYW5zZm9ybWVyW3BhcmVudFRyYW5zZm9ybWVycy5sZW5ndGggKyAxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyYW5zZm9ybWVycywgMCwgdHJhbnNmb3JtZXJzLCAwLCBwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKTsKLSAgICB0cmFuc2Zvcm1lcnNbdHJhbnNmb3JtZXJzLmxlbmd0aCAtIDFdID0gbmV3IEZyYWdtZW50VHJhbnNmb3JtZXIoY29udHJvbGxlcl8pOwotICAgIHJldHVybiB0cmFuc2Zvcm1lcnM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTdmNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvblNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExCaW5kaW5nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExPcGVyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudXRpbC5Tb2FwSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBJbnZva2VXU0RMU09BUE9wZXJhdGlvblNvdXJjZUFjdGlvbiBleHRlbmRzIEludm9rZVdTRExTT0FQT3BlcmF0aW9uQWN0aW9uCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBuZXdGaWxlU2VsZWN0ZWRfOwotICBwcml2YXRlIGJvb2xlYW4gc2F2ZUFzU2VsZWN0ZWRfOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfV1JBUFBFUl9TVEFSVF9UQUcgPSAiPGR1bW15V3JhcHBlcj4iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfV1JBUFBFUl9FTkRfVEFHID0gIjwvZHVtbXlXcmFwcGVyPiI7Ci0gIAotICBwdWJsaWMgSW52b2tlV1NETFNPQVBPcGVyYXRpb25Tb3VyY2VBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgbmV3RmlsZVNlbGVjdGVkXyA9IGZhbHNlOwotICAgIHNhdmVBc1NlbGVjdGVkXyA9IGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnByb2Nlc3NQYXJzZWRSZXN1bHRzKHBhcnNlcik7Ci0gICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBuZXdGaWxlU2VsZWN0ZWRfID0gZmFsc2U7Ci0gICAgc2F2ZUFzU2VsZWN0ZWRfID0gZmFsc2U7Ci0gICAgLyogIHRyeSBhbmQgY2F0Y2ggaXMgbmVlZGVkIGlmIHdlIGFyZSBkb2luZyBmcmFnbWVudGl6YXRpb24uCi0gICAgdHJ5Ci0gICAgewotICAgICovCi0gICAgICBTdHJpbmcgc3VibWlzc2lvbkFjdGlvbiA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTik7Ci0gICAgICBTdHJpbmcgc291cmNlQ29udGVudHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEZyYWdtZW50Q29uc3RhbnRzLlNPVVJDRV9DT05URU5UKTsKLSAgICAgIGlmIChzb3VyY2VDb250ZW50cyAhPSBudWxsKQotICAgICAgICBvcGVyRWxlbWVudC5zZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX1NPVVJDRV9DT05URU5ULHNvdXJjZUNvbnRlbnRzKTsKLSAgICAgIGlmIChXU0RMQWN0aW9uSW5wdXRzLlNVQk1JU1NJT05fQUNUSU9OX0JST1dTRV9GSUxFLmVxdWFscyhzdWJtaXNzaW9uQWN0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgbmV3RmlsZVNlbGVjdGVkXyA9IHRydWU7Ci0gICAgICAgIFN0cmluZyBmaWxlQ29udGVudHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuU0VMRUNURURfRklMRSk7Ci0gICAgICAgIGlmIChmaWxlQ29udGVudHMgIT0gbnVsbCkKLSAgICAgICAgICBvcGVyRWxlbWVudC5zZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX1NPVVJDRV9DT05URU5ULGZpbGVDb250ZW50cyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChXU0RMQWN0aW9uSW5wdXRzLlNVQk1JU1NJT05fQUNUSU9OX1NBVkVfQVMuZXF1YWxzKHN1Ym1pc3Npb25BY3Rpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2F2ZSBBcy4uLiBhY3Rpb24KLSAgICAgICAgICBzYXZlQXNTZWxlY3RlZF8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIEZyYWdtZW50aXplIG9uIEdvIGFjdGlvbi4KLSAgICAgICAgICAvLyBmcmFnbWVudGl6ZShuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZUNvbnRlbnRzKSk7Ci0gICAgICAgICAgU3RyaW5nW10gbnNEZWNsYXJhdGlvbnMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKEZyYWdtZW50Q29uc3RhbnRzLlNPVVJDRV9DT05URU5UX05BTUVTUEFDRSk7Ci0gICAgICAgICAgaWYgKG5zRGVjbGFyYXRpb25zICE9IG51bGwpCi0gICAgICAgICAgICBvcGVyRWxlbWVudC5zZXRQcm9wZXJ0eUFzT2JqZWN0KFdTRExNb2RlbENvbnN0YW50cy5QUk9QX1NPVVJDRV9DT05URU5UX05BTUVTUEFDRSxuc0RlY2xhcmF0aW9ucyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIC8qCi0gICAgfSAgICAgICAKLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlNBWEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih3c2RsUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih3c2RsUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJJT0V4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgICAqLwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIGEgVmVjdG9yIG9mIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlIFNvYXAgQm9keS4KLSAgICogQHBhcmFtIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlIC0gSGFzaHRhYmxlIGNvbnRhaW5pbmcgYSBtYXAgb2YgdGhlIG5hbWVzcGFjZSBVUklzIHRvIHByZWZpeGVzLgotICAgKiBAcGFyYW0gb3BlckVsZW1lbnQgLSBXU0RMT3BlcmF0aW9uRWxlbWVudCBlbmNhcHN1bGF0aW5nIHRoZSBXU0RMIG9wZXJhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBWZWN0b3IgZ2V0Qm9keUVudHJpZXMoSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50LFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCxXU0RMU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLEV4Y2VwdGlvbgotICB7Ci0gICAgVmVjdG9yIGJvZHlFbnRyaWVzID0gbmV3IFZlY3RvcigpOwotICAgIFN0cmluZ1tdIG5zRGVjbGFyYXRpb25zID0gKFN0cmluZ1tdKW9wZXJFbGVtZW50LmdldFByb3BlcnR5QXNPYmplY3QoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlRfTkFNRVNQQUNFKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zRGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHByZWZpeF9ucyA9IFNvYXBIZWxwZXIuZGVjb2RlTmFtZXNwYWNlRGVjbGFyYXRpb24obnNEZWNsYXJhdGlvbnNbaV0pOwotICAgICAgaWYgKCFzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5jb250YWlucyhwcmVmaXhfbnNbMV0pKQotICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5wdXQocHJlZml4X25zWzFdLCBwcmVmaXhfbnNbMF0pOwotICAgIH0KLSAgICBTdHJpbmdCdWZmZXIgc291cmNlQ29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIob3BlckVsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9TT1VSQ0VfQ09OVEVOVCkpOwotICAgIHNvdXJjZUNvbnRlbnQuaW5zZXJ0KDAsRFVNTVlfV1JBUFBFUl9TVEFSVF9UQUcpLmFwcGVuZChEVU1NWV9XUkFQUEVSX0VORF9UQUcpOwotICAgIEVsZW1lbnQgZHVtbXlXcmFwcGVyRWxlbWVudCA9IFhNTFV0aWxzLnN0cmluZ1RvRWxlbWVudChzb3VyY2VDb250ZW50LnRvU3RyaW5nKCkpOyAgICAgICAgICAKLSAgICBOb2RlTGlzdCBubCA9IGR1bW15V3JhcHBlckVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmwuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIGJvZHlFbnRyaWVzLmFkZChubC5pdGVtKGkpKTsKLSAgICB9Ci0gICAgaWYgKCFvcGVyRWxlbWVudC5pc0RvY3VtZW50U3R5bGUoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYWRkUlBDV3JhcHBlcihib2R5RW50cmllcywoV1NETEVsZW1lbnQpc2VydmljZUVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpLG9wZXJFbGVtZW50LHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBib2R5RW50cmllczsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHdhc05ld0ZpbGVTZWxlY3RlZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3RmlsZVNlbGVjdGVkXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gd2FzU2F2ZUFzU2VsZWN0ZWQoKQotICB7Ci0gICAgcmV0dXJuIHNhdmVBc1NlbGVjdGVkXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0U2F2ZUFzRmlsZU5hbWUoKQotICB7Ci0gICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpKGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpLmdldFRyZWVFbGVtZW50KCkpOwotICAgIHJldHVybiAobmV3IFN0cmluZ0J1ZmZlcihvcGVyRWxlbWVudC5nZXRPcGVyYXRpb24oKS5nZXROYW1lKCkpKS5hcHBlbmQoIi50eHQiKS50b1N0cmluZygpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNvdXJjZUNvbnRlbnQoT3V0cHV0U3RyZWFtIG9zKQotICB7Ci0gICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpKGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpLmdldFRyZWVFbGVtZW50KCkpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG9zKTsgCi0gICAgcHcucHJpbnRsbihvcGVyRWxlbWVudC5nZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX1NPVVJDRV9DT05URU5UKSk7Ci0gICAgcHcuY2xvc2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9PcGVuV1NETEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9PcGVuV1NETEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjRmMTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvT3BlbldTRExBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgT3BlbldTRExBY3Rpb24gZXh0ZW5kcyBXU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24gewotCi0gIHB1YmxpYyBPcGVuV1NETEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgd3NkbFVybCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMLCB3c2RsVXJsKTsKLSAgICBmb3JtVG9vbC51cGRhdGVQcm9wZXJ0eVRhYmxlKHByb3BlcnR5VGFibGVfKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICBTdHJpbmcgd3NkbFVybCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHJvb3ROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCByb290RWxlbWVudCA9IHJvb3ROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICAvLyBjcmVhdGUgYSBXU0RMRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIFdTREwKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IG5ldyBXU0RMRWxlbWVudCh3c2RsVXJsLCByb290RWxlbWVudC5nZXRNb2RlbCgpLCB3c2RsVXJsKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBvcGVuIFdTREwKLSAgICAgIFZlY3RvciBlcnJvck1lc3NhZ2VzID0gd3NkbEVsZW1lbnQubG9hZFdTREwoKTsKLSAgICAgIGlmIChlcnJvck1lc3NhZ2VzLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfWFNEX1ZBTElEQVRJT04iKSk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGVycm9yTWVzc2FnZXMuc2l6ZSgpO2krKykKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoU3RyaW5nKWVycm9yTWVzc2FnZXMuZWxlbWVudEF0KGkpKTsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX09QRU5fV1NETCIsd3NkbFVybCkpOyAgICAgICAgICAKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiV1NETEV4Y2VwdGlvbiIsZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJvb3RFbGVtZW50LmNvbm5lY3Qod3NkbEVsZW1lbnQsV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotCi0gICAgLy8gYnVpbGQgdGhlIGRhdGFtb2RlbCBmb3IgdGhpcyBXU0RMRWxlbWVudAotICAgIHdzZGxFbGVtZW50LmJ1aWxkTW9kZWwoKTsKLQotICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiAxIHNlcnZpY2Ugbm9kZSwgc2VsZWN0IHRoZSBXU0RMIG5vZGUuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiAxIGJpbmRpbmcgbm9kZSwgc2VsZWN0IHRoZSBzZXJ2aWNlIG5vZGUuCi0gICAgLy8gSWYgdGhlcmUgaXMganVzdCB0aGUgb25lIHNlcnZpY2UgYW5kIGJpbmRpbmcgbm9kZSwgc2VsZWN0IHRoZSBiaW5kaW5nIG5vZGUuCi0gICAgLy8gc2VsZWN0IHRoZSBuZXcgV1NETCBub2RlCi0gICAgTm9kZSB3c2RsTm9kZSA9IHJvb3ROb2RlLmdldENoaWxkTm9kZSh3c2RsRWxlbWVudCk7Ci0gICAgVmVjdG9yIHNlcnZpY2VOb2RlcyA9IHdzZGxOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbmV3U2VsZWN0ZWROb2RlSWQgPSB3c2RsTm9kZS5nZXROb2RlSWQoKTsKLSAgICBpZiAoc2VydmljZU5vZGVzLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KDApOwotICAgICAgVmVjdG9yIGJpbmRpbmdOb2RlcyA9IHNlcnZpY2VOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChiaW5kaW5nTm9kZXMuc2l6ZSgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgYmluZGluZ05vZGUgPSAoTm9kZSliaW5kaW5nTm9kZXMuZWxlbWVudEF0KDApOwotICAgICAgICBuZXdTZWxlY3RlZE5vZGVJZCA9IGJpbmRpbmdOb2RlLmdldE5vZGVJZCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBuZXdTZWxlY3RlZE5vZGVJZCA9IHNlcnZpY2VOb2RlLmdldE5vZGVJZCgpOwotICAgIH0KLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChuZXdTZWxlY3RlZE5vZGVJZCk7Ci0gICAgbm9kZU1hbmFnZXIubWFrZU5vZGVWaXNpYmxlKG5vZGVNYW5hZ2VyLmdldE5vZGUobmV3U2VsZWN0ZWROb2RlSWQpKTsKLSAgICBhZGRUb0hpc3RvcnkoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwsU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobmV3U2VsZWN0ZWROb2RlSWQsIDAsIEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCwgQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCwgdHJ1ZSkpOwotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19PUEVOX1dTRExfU1VDQ0VTU0ZVTCIsIHdzZGxVcmwpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9PcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9PcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDM4YWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvT3BlblhTREluZm9EaWFsb2dBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExBY3Rpb25JbnB1dHM7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwdWJsaWMgT3BlblhTREluZm9EaWFsb2dBY3Rpb24oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKFN0cmluZyBzZXNzaW9uSWQsaW50IG5vZGVJZCxTdHJpbmcgZnJhZ0lkKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsL2ZyYWdtZW50L1hTREluZm9EaWFsb2cuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpLmFwcGVuZCgnPScpLmFwcGVuZChmcmFnSWQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9SZWZyZXNoV1NETEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9SZWZyZXNoV1NETEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTIyZWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvUmVmcmVzaFdTRExBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExNYWluTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoV1NETEFjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24gewotCi0gIHB1YmxpYyBSZWZyZXNoV1NETEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgaW50IHRvb2xJRCwgaW50IHZpZXdJRCwgaW50IHZpZXdUb29sSUQpIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGwvYWN0aW9ucy9XU0RMUmVmcmVzaEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBTdHJpbmcgbm9kZUlEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgaW50IG5vZGVJRDsKLSAgICB0cnkgewotICAgICAgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludChub2RlSURTdHJpbmcpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgbm9kZUlEID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlSWQoKTsKLSAgICB9Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSUQpOwotICAgIHdoaWxlIChub2RlICE9IG51bGwgJiYgIShub2RlIGluc3RhbmNlb2YgV1NETE1haW5Ob2RlKSkgewotICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBXU0RMTm9kZSkgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgU3RyaW5nLnZhbHVlT2Yobm9kZS5nZXROb2RlSWQoKSkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudCgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKSB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSB3c2RsTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCl3c2RsTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbkNvcHkgPSB3c2RsRWxlbWVudC5nZXREZWZpbml0aW9uKCk7Ci0gICAgVmVjdG9yIHNjaGVtYUxpc3RDb3B5ID0gd3NkbEVsZW1lbnQuZ2V0U2NoZW1hTGlzdCgpOwotICAgIHdzZGxFbGVtZW50LnNldERlZmluaXRpb24obnVsbCk7Ci0gICAgd3NkbEVsZW1lbnQuc2V0U2NoZW1hTGlzdChuZXcgVmVjdG9yKCkpOwotICAgIGludCBzZWxlY3RlZE5vZGVJRCA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpLmdldE5vZGVJZCgpOwotCi0gICAgdHJ5IHsKLSAgICAgIC8vIG9wZW4gV1NETAotICAgICAgVmVjdG9yIGVycm9yTWVzc2FnZXMgPSB3c2RsRWxlbWVudC5sb2FkV1NETCgpOwotICAgICAgaWYgKGVycm9yTWVzc2FnZXMuc2l6ZSgpID4gMCkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1hTRF9WQUxJREFUSU9OIikpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxlcnJvck1lc3NhZ2VzLnNpemUoKTtpKyspCi0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoKFN0cmluZyllcnJvck1lc3NhZ2VzLmVsZW1lbnRBdChpKSk7Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2Uod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9PUEVOX1dTREwiLHdzZGxFbGVtZW50LmdldFdzZGxVcmwoKSkpOyAgICAgICAgICAKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiV1NETEV4Y2VwdGlvbiIsZSk7Ci0gICAgICB3c2RsRWxlbWVudC5zZXREZWZpbml0aW9uKGRlZmluaXRpb25Db3B5KTsKLSAgICAgIHdzZGxFbGVtZW50LnNldFNjaGVtYUxpc3Qoc2NoZW1hTGlzdENvcHkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIGJ1aWxkIHRoZSBkYXRhbW9kZWwgZm9yIHRoaXMgV1NETEVsZW1lbnQKLSAgICB3c2RsRWxlbWVudC5idWlsZE1vZGVsKCk7Ci0KLSAgICAvLyBTZWxlY3QgYSBuZXcgbm9kZSBpZiB0aGUgcHJldmlvdXMgc2VsZWN0ZWQgbm9kZSBubyBsb25nZXIgZXhpc3RzCi0gICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIDEgc2VydmljZSBub2RlLCBzZWxlY3QgdGhlIFdTREwgbm9kZS4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIDEgYmluZGluZyBub2RlLCBzZWxlY3QgdGhlIHNlcnZpY2Ugbm9kZS4KLSAgICAvLyBJZiB0aGVyZSBpcyBqdXN0IHRoZSBvbmUgc2VydmljZSBhbmQgYmluZGluZyBub2RlLCBzZWxlY3QgdGhlIGJpbmRpbmcgbm9kZS4KLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKHNlbGVjdGVkTm9kZUlEKTsKLSAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICBzZWxlY3RlZE5vZGVJRCA9IHdzZGxOb2RlLmdldE5vZGVJZCgpOwotICAgICAgVmVjdG9yIHNlcnZpY2VOb2RlcyA9IHdzZGxOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChzZXJ2aWNlTm9kZXMuc2l6ZSgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KDApOwotICAgICAgICBWZWN0b3IgYmluZGluZ05vZGVzID0gc2VydmljZU5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBpZiAoYmluZGluZ05vZGVzLnNpemUoKSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBiaW5kaW5nTm9kZSA9IChOb2RlKWJpbmRpbmdOb2Rlcy5lbGVtZW50QXQoMCk7Ci0gICAgICAgICAgc2VsZWN0ZWROb2RlSUQgPSBiaW5kaW5nTm9kZS5nZXROb2RlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgc2VsZWN0ZWROb2RlSUQgPSBzZXJ2aWNlTm9kZS5nZXROb2RlSWQoKTsKLSAgICAgIH0KLSAgICAgIG5vZGVNYW5hZ2VyLnNldFNlbGVjdGVkTm9kZUlkKHNlbGVjdGVkTm9kZUlEKTsKLSAgICAgIG5vZGVNYW5hZ2VyLm1ha2VOb2RlVmlzaWJsZShub2RlTWFuYWdlci5nZXROb2RlKHNlbGVjdGVkTm9kZUlEKSk7Ci0gICAgfQotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19SRUZSRVNIX1dTRExfU1VDQ0VTU0ZVTCIsIHdzZGxFbGVtZW50LmdldFdzZGxVcmwoKSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1Jlc2l6ZVdTRExGcmFtZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvUmVzaXplV1NETEZyYW1lc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc3M2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvUmVzaXplV1NETEZyYW1lc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuUmVzaXplRnJhbWVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMRnJhbWVOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBSZXNpemVXU0RMRnJhbWVzQWN0aW9uIGV4dGVuZHMgUmVzaXplRnJhbWVzQWN0aW9uCi17Ci0gIHB1YmxpYyBSZXNpemVXU0RMRnJhbWVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihXU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyAhPSBudWxsICYmIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChXU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIsYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgLy8gU2F2ZSB0aGUgY3VycmVudCBmcmFtZXNldCBzaXplcy4KLSAgICBTdHJpbmcgZnJhbWVOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLkZSQU1FX05BTUUpOwotICAgIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChXU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChXU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIG5ldyBmcmFtZXNldCBzaXplcy4KLSAgICBpZiAoZnJhbWVOYW1lLmVxdWFscyhXU0RMRnJhbWVOYW1lcy5XU0RMX05BVklHQVRPUl9DT05UQUlORVIpKQotICAgIHsKLSAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICAgewotICAgICAgICAvLyBSZXN0b3JlLgotICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHdzZGxQZXJzcGVjdGl2ZS5nZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIxMDAlLDAlIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGZyYW1lTmFtZS5lcXVhbHMoV1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgaWYgKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3Muc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICAgewotICAgICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZXN0b3JlLgotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMod3NkbFBlcnNwZWN0aXZlLmdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkpOwotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKHdzZGxQZXJzcGVjdGl2ZS5nZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCIxMDAlLDAlIik7Ci0gICAgICAgIGlmICghcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZnJhbWVOYW1lLmVxdWFscyhXU0RMRnJhbWVOYW1lcy5XU0RMX1NUQVRVU19DT05UQUlORVIpKQotICAgIHsKLSAgICAgIGlmIChhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyh3c2RsUGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3Mod3NkbFBlcnNwZWN0aXZlLmdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoIjAlLDEwMCUiKTsKLSAgICAgICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9TZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9TZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmI5ZmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2VsZWN0Tm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLlRvb2xUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVBY3Rpb24KLXsKLQotICAgIHB1YmxpYyBTZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gICAgewotICAgICAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBib29sZWFuIGZvckhpc3RvcnkpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGwvYWN0aW9ucy9TZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSUQpOwotICAgICAgICBpZiAoZm9ySGlzdG9yeSkKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpLmFwcGVuZCgiPTEiKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgICB7Ci0gICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICBpbnQgbm9kZUlkID0gc2VsZWN0ZWROb2RlXy5nZXROb2RlSWQoKTsKLSAgICAgIAotICAgICAgaWYgKHNlbGVjdGVkVG9vbC5nZXRUb29sVHlwZSgpICE9IFRvb2xUeXBlcy5BQ1RJT04pCi0gICAgICAgIHJldHVybiBzZWxlY3RlZFRvb2wuZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYodHJ1ZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKG5vZGVJZCx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gIndzZGxOYXZpZ2F0b3JDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2RsL3dzZGxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NkbFByb3BlcnRpZXNDb250YWluZXIiOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gICAgewotICAgICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0RMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1NlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRkMThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TZWxlY3ROb2RlVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVUb29sQWN0aW9uCi17Ci0KLSAgICBwdWJsaWMgU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCwgYm9vbGVhbiBrZWVwSGlzdG9yeSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NkbC9hY3Rpb25zL1NlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVE9PTElEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICAgICAgaWYgKHZpZXdJRCAhPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpIHsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoa2VlcEhpc3RvcnkpIHsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCI9MSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gICAgewotICAgICAgICBpbnQgbm9kZUlkID0gc2VsZWN0ZWROb2RlXy5nZXROb2RlSWQoKTsKLSAgICAgICAgaW50IHRvb2xJZCA9IHNlbGVjdGVkVG9vbF8uZ2V0VG9vbElkKCk7Ci0gICAgICAgIGludCB2aWV3SWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgICAgICBpbnQgdmlld1Rvb2xJZCA9IHNlbGVjdGVkTm9kZV8uZ2V0Vmlld1Rvb2xJZCgpOwotICAgICAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NkbE5hdmlnYXRvckNvbnRlbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gIndzZGwvd3NkbF9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpIHsKLSAgICAgICAgcmV0dXJuICJ3c2RsUHJvcGVydGllc0NvbnRhaW5lciI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250YWluZXIuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gIndzZGxQcm9wZXJ0aWVzQ29udGVudCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGVudFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICAgIHsKLSAgICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjU1NzQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TaG93UGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbiBleHRlbmRzIFNob3dQZXJzcGVjdGl2ZUFjdGlvbgotewotICBwdWJsaWMgU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSKTsKLSAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzICE9IG51bGwgJiYgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChXU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCxwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUixhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSKTsKLSAgICAKLSAgICAvLyBTYXZlIHRoZSBmcmFtZXNldCBzaXplcyBpZmYgbm8gZnJhbWUgaXMgbWF4aW1pemVkLgotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBpZiAoIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5zdGFydHNXaXRoKCIxMDAlIikgJiYgIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgCi0gICAgaWYgKCFhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzLnN0YXJ0c1dpdGgoIjEwMCUiKSAmJiAhYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAKLSAgICByZXR1cm4gc3VwZXIucnVuKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEZvcm1BY3Rpb25MaW5rKGludCB0YXJnZXRQZXJzcGVjdGl2ZUlkLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBmb3JtTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0RMQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBmb3JtTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFKS5hcHBlbmQoJz0nKS5hcHBlbmQodGFyZ2V0UGVyc3BlY3RpdmVJZCk7Ci0gICAgaWYgKGZvckhpc3RvcnkpCi0gICAgICBmb3JtTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSkuYXBwZW5kKCI9MSIpOyAgICAKLSAgICByZXR1cm4gZm9ybUxpbmsudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9TeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTMxZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9TeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExPcGVyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5JbnZva2VXU0RMT3BlcmF0aW9uVG9vbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uIGV4dGVuZHMgV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHB1YmxpYyBTeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIucHJvY2Vzc1BhcnNlZFJlc3VsdHMocGFyc2VyKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEl0ZXJhdG9yIGl0ID0gb3BlckVsZW1lbnQuZ2V0T3JkZXJlZEJvZHlQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgSW52b2tlV1NETE9wZXJhdGlvblRvb2wgaW52b2tlV1NETE9wZXJhdGlvblRvb2wgPSAoSW52b2tlV1NETE9wZXJhdGlvblRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICAgU3RyaW5nIHZpZXdJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19JRCk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfSUQsIHZpZXdJRCk7Ci0gICAgaWYgKHZpZXdJRC5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfRk9STV9UT19TT1VSQ0UpKQotICAgIHsKLSAgICAgIGludm9rZVdTRExPcGVyYXRpb25Ub29sLnNldEZyYWdtZW50Vmlld0lEKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX0ZPUk1fVE9fU09VUkNFKTsKLSAgICAgIHJldHVybiBwcm9jZXNzRm9ybVZpZXdQYXJzZWRSZXN1bHRzKHBhcnNlciwgb3BlckVsZW1lbnQsIGl0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGludm9rZVdTRExPcGVyYXRpb25Ub29sLnNldEZyYWdtZW50Vmlld0lEKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNKTsKLSAgICAgIHJldHVybiBwcm9jZXNzU291cmNlVmlld1BhcnNlZFJlc3VsdHMocGFyc2VyLCBvcGVyRWxlbWVudCwgaXQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRm9ybVZpZXdQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlciwgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQsIEl0ZXJhdG9yIGl0KSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNPYmplY3QoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlQsIG51bGwpOwotICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNPYmplY3QoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlRfTkFNRVNQQUNFLCBudWxsKTsKLSAgICBib29sZWFuIHJlc3VsdHNWYWxpZCA9IHRydWU7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdC5uZXh0KCk7Ci0gICAgICBJWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgaWYgKCFmcmFnLnByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMocGFyc2VyKSkKLSAgICAgICAgcmVzdWx0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChyZXN1bHRzVmFsaWQpCi0gICAgICBvcGVyRWxlbWVudC5zZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX1NPVVJDRV9DT05URU5ULG51bGwpOwotICAgIHJldHVybiByZXN1bHRzVmFsaWQ7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NvdXJjZVZpZXdQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlciwgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQsIEl0ZXJhdG9yIGl0KSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBzb3VyY2VDb250ZW50ID0gcGFyc2VyLmdldFBhcmFtZXRlcihGcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVCk7Ci0gICAgaWYgKHNvdXJjZUNvbnRlbnQgIT0gbnVsbCkKLSAgICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlQsIHNvdXJjZUNvbnRlbnQpOwotICAgIFN0cmluZ1tdIG5zRGVjbGFyYXRpb25zID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhGcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVF9OQU1FU1BBQ0UpOwotICAgIGlmIChuc0RlY2xhcmF0aW9ucyAhPSBudWxsKQotICAgICAgb3BlckVsZW1lbnQuc2V0UHJvcGVydHlBc09iamVjdChXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9TT1VSQ0VfQ09OVEVOVF9OQU1FU1BBQ0UsbnNEZWNsYXJhdGlvbnMpOwotICAgIHNvdXJjZUNvbnRlbnQgPSBhZGRSb290RWxlbWVudChzb3VyY2VDb250ZW50KTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBFbGVtZW50IHNvdXJjZUVsZW1lbnRzID0gWE1MVXRpbHMuc3RyaW5nVG9FbGVtZW50KHNvdXJjZUNvbnRlbnQpOwotICAgICAgTm9kZUxpc3QgbmwgPSBzb3VyY2VFbGVtZW50cy5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBWZWN0b3IgZWxlbWVudHNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG9yZy53M2MuZG9tLk5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgZWxlbWVudHNWZWN0b3IuYWRkKG5vZGUpOwotICAgICAgfQotICAgICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbZWxlbWVudHNWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgIGVsZW1lbnRzVmVjdG9yLmNvcHlJbnRvKGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgICAgIGJvb2xlYW4gc291cmNlRWxlbWVudHNWYWxpZCA9IHRydWU7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdC5uZXh0KCk7Ci0gICAgICAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICAgIGlmICghZnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoaW5zdGFuY2VEb2N1bWVudHMpKQotICAgICAgICAgIHNvdXJjZUVsZW1lbnRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzb3VyY2VFbGVtZW50c1ZhbGlkOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFkZFJvb3RFbGVtZW50KFN0cmluZyBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHNiLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5ST09UX0VMRU1FTlRfU1RBUlRfVEFHKTsKLSAgICBzYi5hcHBlbmQoZWxlbWVudCk7Ci0gICAgc2IuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlJPT1RfRUxFTUVOVF9FTkRfVEFHKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlNjgwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1RvZ2dsZVdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlRvZ2dsZU5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Ub29sVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24gZXh0ZW5kcyBUb2dnbGVOb2RlQWN0aW9uCi17Ci0gIHB1YmxpYyBUb2dnbGVXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKSk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLiZvcGVuPS4uLgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsYm9vbGVhbiBvcGVuKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5PUEVOKS5hcHBlbmQoJz0nKS5hcHBlbmQob3Blbj9BY3Rpb25JbnB1dHMuT1BFTl9OT0RFOkFjdGlvbklucHV0cy5DTE9TRV9OT0RFKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgdG8gc2VsZWN0IHRoZSB0b2dnbGVkIG5vZGUgd2hlbiwgYXQgdGhlIHRpbWUgb2YKLSAgLy8gdGhlIGNvbGxhcHNlIGV2ZW50LCBhIGRlc2NlbmRhbnQgbm9kZSB3YXMgc2VsZWN0ZWQuCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSB0b2dnbGVkTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIGludCBub2RlSWQgPSB0b2dnbGVkTm9kZV8uZ2V0Tm9kZUlkKCk7Ci0gICAgaW50IHRvb2xJZCA9IHNlbGVjdGVkVG9vbC5nZXRUb29sSWQoKTsKLSAgICBpbnQgdmlld0lkID0gdG9nZ2xlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgIGludCB2aWV3VG9vbElkID0gdG9nZ2xlZE5vZGVfLmdldFZpZXdUb29sSWQoKTsKLSAgICBpZiAoc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikKLSAgICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLHRydWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBTZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCx0cnVlKTsKLSAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gICAgewotICAgICAgcmV0dXJuICJ3c2RsTmF2aWdhdG9yQ29udGVudCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiAid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIndzZGxQcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICAgIHsKLSAgICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1VwZGF0ZVdTRExCaW5kaW5nQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1VwZGF0ZVdTRExCaW5kaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMmRjNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9VcGRhdGVXU0RMQmluZGluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExCaW5kaW5nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5JbnZva2VXU0RMT3BlcmF0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMQmluZGluZ05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24gZXh0ZW5kcyBXU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHVibGljIFVwZGF0ZVdTRExCaW5kaW5nQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIG5vZGVJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGlmIChub2RlSWRzID09IG51bGwpCi0gICAgICBub2RlSWRzID0gbmV3IFN0cmluZ1swXTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgbm9kZUlkcyk7Ci0gICAgU3RyaW5nW10gZW5kcG9pbnRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhXU0RMQWN0aW9uSW5wdXRzLkVORF9QT0lOVCk7Ci0gICAgaWYgKGVuZHBvaW50cyA9PSBudWxsKQotICAgICAgZW5kcG9pbnRzID0gbmV3IFN0cmluZ1swXTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQsIGVuZHBvaW50cyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nW10gbm9kZUlkcyA9IGdldFByb3BlcnR5QXNTdHJpbmdBcnJheShBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBTdHJpbmdbXSBlbmRwb2ludHMgPSBnZXRQcm9wZXJ0eUFzU3RyaW5nQXJyYXkoV1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBiaW5kaW5nTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSWRzW2ldKSk7Ci0gICAgICAgIGlmIChiaW5kaW5nTm9kZSBpbnN0YW5jZW9mIFdTRExCaW5kaW5nTm9kZSkKLSAgICAgICAgewotICAgICAgICAgIFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IChXU0RMQmluZGluZ0VsZW1lbnQpYmluZGluZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgICBTdHJpbmdbXSBlbmRwb2ludHNDb3B5ID0gZW5kcG9pbnRzOwotICAgICAgICAgIGJpbmRpbmdFbGVtZW50LnNldEVuZFBvaW50cyhlbmRwb2ludHNDb3B5KTsKLSAgICAgICAgICBpZiAoZW5kcG9pbnRzQ29weS5sZW5ndGggPD0gMCkKLSAgICAgICAgICAgIGVuZHBvaW50c0NvcHkgPSBiaW5kaW5nRWxlbWVudC5nZXRFbmRQb2ludHMoKTsKLSAgICAgICAgICBpZiAoZW5kcG9pbnRzQ29weS5sZW5ndGggPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZlY3RvciBvcGVyYXRpb25Ob2RlcyA9IGJpbmRpbmdOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBvcGVyYXRpb25Ob2Rlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBOb2RlIG9wZXJhdGlvbk5vZGUgPSAoTm9kZSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgIExpc3QgdG9vbHMgPSBvcGVyYXRpb25Ob2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFRvb2xzKCk7Ci0gICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgdG9vbHNJdGVyYXRvciA9IHRvb2xzLml0ZXJhdG9yKCk7IHRvb2xzSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRvb2wgdG9vbCA9IChUb29sKXRvb2xzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICh0b29sIGluc3RhbmNlb2YgSW52b2tlV1NETE9wZXJhdGlvblRvb2wpCi0gICAgICAgICAgICAgICAgICAoKEludm9rZVdTRExPcGVyYXRpb25Ub29sKXRvb2wpLnNldEVuZFBvaW50KGVuZHBvaW50c0NvcHlbMF0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fVVBEQVRFX1dTRExfQklORElOR19TVUNDRVNTRlVMIikpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmNiMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5MaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbiB7Ci0gIHB1YmxpYyBXU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICBTdHJpbmcgbm9kZUlEID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgdHJ5IHsKLSAgICAgIEludGVnZXIucGFyc2VJbnQobm9kZUlEKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBub2RlSUQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCkgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NkbC9hY3Rpb25zL1dTRExDaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKCkgewotICAgIFN0cmluZyB3c2RsVXJsID0gZ2V0V3NkbFVybCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9XU0RMX1VSTCwgd3NkbFVybCk7Ci0gICAgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBmYXZGb2xkZXJFbGVtZW50ID0gZ2V0RmF2V1NETEZvbGRlckVsZW1lbnQoKTsKLSAgICByZXR1cm4gZmF2Rm9sZGVyRWxlbWVudC5mYXZvcml0ZUV4aXN0cyh0YWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKSB7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIFN0cmluZyB3c2RsVXJsID0gZ2V0V3NkbFVybCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9XU0RMX1VSTCwgd3NkbFVybCk7Ci0gICAgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBmYXZGb2xkZXJFbGVtZW50ID0gZ2V0RmF2V1NETEZvbGRlckVsZW1lbnQoKTsKLSAgICBpZiAoZmF2Rm9sZGVyRWxlbWVudC5hZGRGYXZvcml0ZSh0YWJsZSkpIHsKLSAgICAgIHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUwiLCB3c2RsVXJsKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0FERF9UT19GQVZPUklURVMiLCB3c2RsVXJsKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0V3NkbFVybCgpIHsKLSAgICBTdHJpbmcgbm9kZUlEID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIHdzZGxOb2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIFdTRExFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChXU0RMRWxlbWVudCl3c2RsTm9kZU1hbmFnZXIuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRCkpLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudC5nZXRXc2RsVXJsKCk7Ci0gIH0KLQotICBwcml2YXRlIEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgZ2V0RmF2V1NETEZvbGRlckVsZW1lbnQoKSB7Ci0gICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIGZhdk5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBUcmVlRWxlbWVudCBmYXZSb290RWxlbWVudCA9IGZhdk5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZmF2Um9vdEVsZW1lbnQuZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9GT0xERVJfTk9ERSk7Ci0gICAgcmV0dXJuIChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDNmY2MzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5XU0RMRmlsZU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiB7Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFdTRExGaWxlTmFtZV87Ci0KLSAgcHVibGljIFdTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIGRlZmluaXRpb25fID0gbnVsbDsKLSAgICBkZWZhdWx0V1NETEZpbGVOYW1lXyA9ICJ0ZW1wLndzZGwiOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkLGludCB0b29sSWQsaW50IHZpZXdJZCxpbnQgdmlld1Rvb2xJZCkgewotICAgIHJldHVybiBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLCJ3c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIik7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiB3cml0ZShPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICByZXR1cm4gd3JpdGVXU0RMRGVmaW5pdGlvbihvcywgZGVmaW5pdGlvbl8pOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0gICAgcmV0dXJuIGRlZmF1bHRXU0RMRmlsZU5hbWVfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkgewotICAgIGludCBub2RlSUQ7Ci0gICAgdHJ5IHsKLSAgICAgIG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgbm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudClub2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgZGVmaW5pdGlvbl8gPSB3c2RsRWxlbWVudC5nZXREZWZpbml0aW9uKCk7Ci0gICAgZGVmYXVsdFdTRExGaWxlTmFtZV8gPSBXU0RMRmlsZU5hbWVIZWxwZXIuZ2V0V1NETEZpbGVOYW1lKHdzZGxFbGVtZW50LmdldFdzZGxVcmwoKSk7Ci0gICAgcmV0dXJuIChkZWZpbml0aW9uXyAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkOGIwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uIGV4dGVuZHMgSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24gewotICBwdWJsaWMgV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkgewotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICByZXR1cm4gKEZvcm1Ub29sKXdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICB9Ci0KLSAgcHVibGljIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiBuZXdJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24oKSB7Ci0gICAgV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24gYWN0aW9uID0gbmV3IFdTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgdGFibGUucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSkpOwotICAgIHJldHVybiBhY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKSB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhZGU3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1dTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gZXh0ZW5kcyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIHsKLQotICBwdWJsaWMgV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpIHsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgcmV0dXJuIChGb3JtVG9vbCl3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBXU0RMRWxlbWVudCBlbGVtZW50ID0gKFdTRExFbGVtZW50KW5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICByZXR1cm4gbGF1bmNoV2l6YXJkKGVsZW1lbnQuZ2V0V3NkbFVybCgpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzNjZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkZvcm1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExQcm9wZXJ0aWVzRm9ybUFjdGlvbiBleHRlbmRzIEZvcm1BY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXJfOwotICBwdWJsaWMgV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIG5hdmlnYXRvck1hbmFnZXJfID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIGtleXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nW10gdmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhrZXlzW2ldKTsKLSAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMSkKLSAgICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoa2V5c1tpXSwgdmFsdWVzWzBdKTsKLSAgICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+IDEpCi0gICAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KGtleXNbaV0sIHZhbHVlcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkKLSAgewotICAgIHJldHVybiBuYXZpZ2F0b3JNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgfQotCi0gIHB1YmxpYyBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkKLSAgewotICAgIHJldHVybiAoRm9ybVRvb2wpKGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL0JpbmRpbmdUeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL0JpbmRpbmdUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDhhZjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9CaW5kaW5nVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nVHlwZXMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TVVBQT1JURUQgPSAtMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09BUCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfR0VUID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QT1NUID0gMjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVkVSQl9HRVQgPSAiR0VUIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9WRVJCX1BPU1QgPSAiUE9TVCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvRnJhZ21lbnRDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9GcmFnbWVudENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVkOWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9GcmFnbWVudENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBGcmFnbWVudENvbnN0YW50cwotewotICAvLyBYU0QgbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NSU5fT0NDVVJTID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfT0NDVVJTID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5CT1VOREVEID0gLTE7Ci0KLSAgLy8gV1NETCBzdHlsZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9ET0NVTUVOVCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX1JQQyA9IDE7Ci0KLSAgLy8gV1NETCBFbmNvZGluZyBzdHlsZXMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfTElURVJBTCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX1NPQVAgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19VUkwgPSAyOyAvLyBIVFRQIEdldC9Qb3N0Ci0KLSAgLy8gSURzIHVzZWQgYnkgdGhlIGZyYWdtZW50IG1vZGVsCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NFUEVSQVRPUiA9ICI6OiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0lEID0gIjo6aW5wdXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfSUQgPSAiOjpvdXRwdXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9JRCA9ICI6OnRhYmxlSUQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9JRCA9ICI6OmZyYWdtZW50SUQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FOQ0hPUl9JRCA9ICI6Om5hbWVBbmNob3JJRCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UX1ZJRVdfSUQgPSAiOjpmcmFnbWVudFZpZXdJRCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9BVE9NSUNfRU5VTV9JRCA9ICI6OnhzZEF0b21pY0VudW1JRCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9BTExfR1JPVVBfSUQgPSAiOjp4c2RBbGxHcm91cElEIjsKLQotICAvLyBGcmFnbWVudCB2aWV3IElEcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9WSUVXX1NXSVRDSF9GT1JNX1RPX1NPVVJDRSA9ICI6OmZyYWdtZW50Vmlld1N3aXRjaEZvcm1Ub1NvdXJjZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNID0gIjo6ZnJhZ21lbnRWaWV3U3dpdGNoU291cmNlVG9Gb3JtIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0NPTlRFTlQgPSAiOjpzb3VyY2VDb250ZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0NPTlRFTlRfTkFNRVNQQUNFID0gIjo6c291cmNlQ29udGVudE5TIjsKLQotICAvLyBBY3Rpb24gaW5wdXQgY29uc3RhbnRzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQU5DSE9SID0gIm5hbWVBbmNob3IiOwotCi0gIC8vIE5hbWVzcGFjZXMgY29udGFudHMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1hTRCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVBfRU5WID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1dTREwgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfWFNJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTkNfQVJSQVlfVFlQRSA9ICJhcnJheVR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0lfVFlQRSA9ICJ0eXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUU5BTUVfUFJFRklYID0gInEiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRTkFNRV9MT0NBTF9OQU1FX0FSUkFZX1RZUEUgPSAiYXJyYXlUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUU5BTUVfTE9DQUxfTkFNRV9BUlJBWSA9ICJBcnJheSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9OID0gIjoiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRTkFNRV9MT0NBTF9OQU1FX0JPRFkgPSAiQm9keSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFOQU1FX0xPQ0FMX05BTUVfRkFVTFQgPSAiRmF1bHQiOwotCi0gIC8vIExpc3QKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9TRVBFUkFUT1IgPSAiICI7Ci0KLSAgLy8gU09BUC1FTkM6QXJyYXkKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVGVF9TUVVBUkVfQlJBQ0tFVCA9ICJbIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUklHSFRfU1FVQVJFX0JSQUNLRVQgPSAiXSI7Ci0KLSAgLy8gWFNERGVmYXVsdEZyYWdtZW50Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRUxFTUVOVF9TVEFSVF9UQUcgPSAiPHJvb3Q+IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9FTEVNRU5UX0VORF9UQUcgPSAiPC9yb290PiI7Ci0KLSAgLy8gTmFtZXNwYWNlIFVSSXMuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9YTUxOUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9TT0FQX0VOViA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9TT0FQX0VOQyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV8xOTk5X1NDSEVNQV9YU0kgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfMTk5OV9TQ0hFTUFfWFNEID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJXzIwMDBfU0NIRU1BX1hTSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV8yMDAwX1NDSEVNQV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfMjAwMV9TQ0hFTUFfWFNJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJXzIwMDFfU0NIRU1BX1hTRCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9DVVJSRU5UX1NDSEVNQV9YU0kgPSBOU19VUklfMjAwMV9TQ0hFTUFfWFNJOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfQ1VSUkVOVF9TQ0hFTUFfWFNEID0gTlNfVVJJXzIwMDFfU0NIRU1BX1hTRDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1hNTF9TT0FQID0gImh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9YTUxfU09BUF9ERVBMT1lNRU5UID0gImh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcC9kZXBsb3ltZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX0xJVEVSQUxfWE1MID0gImh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcC9saXRlcmFseG1sIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1hNSV9FTkMgPSAiaHR0cDovL3d3dy5pYm0uY29tL25hbWVzcGFjZXMveG1pIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvV1NETEFjdGlvbklucHV0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL1dTRExBY3Rpb25JbnB1dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxZGU5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvV1NETEFjdGlvbklucHV0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQWN0aW9uSW5wdXRzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCA9ICJmcmFtZXNldENvbHNQZXJzcGVjdGl2ZUNvbnRlbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSID0gImZyYW1lc2V0Um93c0FjdGlvbnNDb250YWluZXIiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fSUQgPSAic2Vzc2lvbklEIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRfSUQgPSAiZnJhZ21lbnRJRCI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTlZFTE9QRV9UWVBFID0gInNvYXBFbnZlbG9wZVR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX0VOVkVMT1BFX1RZUEVfUkVRVUVTVCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPQVBfRU5WRUxPUEVfVFlQRV9SRVNQT05TRSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUkVTUE9OU0VfQ0FDSEVEID0gInNvYXBSZXNwb25zZUNhY2hlZCI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCTUlTU0lPTl9BQ1RJT04gPSAic3VibWlzc2lvbkFjdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQk1JU1NJT05fQUNUSU9OX0ZPUk0gPSAic3VibWlzc2lvbkFjdGlvbkZvcm0iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNSVNTSU9OX0FDVElPTl9CUk9XU0VfRklMRSA9ICJzdWJtaXNzaW9uQWN0aW9uQnJvd3NlRmlsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQk1JU1NJT05fQUNUSU9OX1NBVkVfQVMgPSAic3VibWlzc2lvbkFjdGlvblNhdmVBcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVEVEX0ZJTEUgPSAic2VsZWN0ZWRGaWxlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX0VMRU1FTlQgPSAib3BlcmF0aW9uRWxlbWVudCI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1BPSU5UID0gIjo6ZW5kUG9pbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUgPSAiaHR0cEJhc2ljQXV0aFVzZXJuYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEID0gImh0dHBCYXNpY0F1dGhQYXNzd29yZCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvV1NETEZyYW1lTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9XU0RMRnJhbWVOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWY3MTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9XU0RMRnJhbWVOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFdTRExGcmFtZU5hbWVzCi17Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfTkFWSUdBVE9SX0NPTlRBSU5FUiA9ICJ3c2RsX25hdmlnYXRvcl9jb250YWluZXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX05BVklHQVRPUl9UT09MQkFSID0gIndzZGxfbmF2aWdhdG9yX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX05BVklHQVRPUl9DT05URU5UID0gIndzZGxfbmF2aWdhdG9yX2NvbnRlbnQiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX0FDVElPTlNfQ09OVEFJTkVSID0gIndzZGxfYWN0aW9uc19jb250YWluZXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX1BST1BFUlRJRVNfQ09OVEFJTkVSID0gIndzZGxfcHJvcGVydGllc19jb250YWluZXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX1BST1BFUlRJRVNfVE9PTEJBUiA9ICJ3c2RsX3Byb3BlcnRpZXNfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfUFJPUEVSVElFU19DT05URU5UID0gIndzZGxfcHJvcGVydGllc19jb250ZW50IjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETF9TVEFUVVNfQ09OVEFJTkVSID0gIndzZGxfc3RhdHVzX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfU1RBVFVTX1RPT0xCQVIgPSAid3NkbF9zdGF0dXNfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfU1RBVFVTX0NPTlRFTlQgPSAid3NkbF9zdGF0dXNfY29udGVudCI7Ci0KLSAgLy8gWFNEIEluZm8gRGlhbG9nCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhTRF9JTkZPX1RPT0xCQVIgPSAieHNkX2luZm9fdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhTRF9JTkZPX0NPTlRFTlQgPSAieHNkX2luZm9fY29udGVudCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvV1NETE1vZGVsQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvV1NETE1vZGVsQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYjE5YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL1dTRExNb2RlbENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFdTRExNb2RlbENvbnN0YW50cwotewotICAgIC8vIFJlbGF0aW9uCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1dTREwgPSAicmVsV1NETCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1dTRExfU0VSVklDRSA9ICJyZWxXU0RMU2VydmljZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1dTRExfQklORElORyA9ICJyZWxXU0RMQmluZGluZyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1dTRExfT1BFUkFUSU9OID0gInJlbFdTRExPcGVyYXRpb24iOwotCi0gICAgLy8gRG9jdW1lbnRhdGlvbgotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfRE9DVU1FTlRBVElPTiA9ICJwcm9wRG9jdW1lbnRhdGlvbiI7Ci0KLSAgICAvLyBTb3VyY2UgQ29udGVudAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfU09VUkNFX0NPTlRFTlQgPSAicHJvcFNvdXJjZUNvbnRlbnQiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfU09VUkNFX0NPTlRFTlRfTkFNRVNQQUNFID0gInByb3BTb3VyY2VDb250ZW50TlMiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL0VuZHBvaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvRW5kcG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzYzkyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvRW5kcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnQ7Ci0gIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlSFRUUEJhc2ljQXV0aDsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotICBwcml2YXRlIFN0cmluZyBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIAotICBwdWJsaWMgRW5kcG9pbnQoKQotICB7Ci0gICAgZW5kcG9pbnQgPSBudWxsOwotICAgIHJlcXVpcmVIVFRQQmFzaWNBdXRoID0gZmFsc2U7Ci0gICAgaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gbnVsbDsKLSAgICBodHRwQmFzaWNBdXRoUGFzc3dvcmQgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludCgpCi0gIHsKLSAgICByZXR1cm4gZW5kcG9pbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KFN0cmluZyBlbmRwb2ludCkKLSAgewotICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlSFRUUEJhc2ljQXV0aCgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZUhUVFBCYXNpY0F1dGg7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVIVFRQQmFzaWNBdXRoKGJvb2xlYW4gcmVxdWlyZUhUVFBCYXNpY0F1dGgpCi0gIHsKLSAgICB0aGlzLnJlcXVpcmVIVFRQQmFzaWNBdXRoID0gcmVxdWlyZUhUVFBCYXNpY0F1dGg7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKCkKLSAgewotICAgIHJldHVybiBodHRwQmFzaWNBdXRoVXNlcm5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhVc2VybmFtZShTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lKQotICB7Ci0gICAgdGhpcy5odHRwQmFzaWNBdXRoVXNlcm5hbWUgPSBodHRwQmFzaWNBdXRoVXNlcm5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFBhc3N3b3JkKCkKLSAgewotICAgIHJldHVybiBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkKQotICB7Ci0gICAgdGhpcy5odHRwQmFzaWNBdXRoUGFzc3dvcmQgPSBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETEJpbmRpbmdFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETEJpbmRpbmdFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGZlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL1dTRExCaW5kaW5nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5CaW5kaW5nVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExNb2RlbENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFdTRExCaW5kaW5nRWxlbWVudCBleHRlbmRzIFdTRExDb21tb25FbGVtZW50Ci17Ci0gIHByaXZhdGUgaW50IGJpbmRpbmdUeXBlXzsKLSAgcHJpdmF0ZSBCaW5kaW5nIGJpbmRpbmdfOwotICBwcml2YXRlIEV4dGVuc2liaWxpdHlFbGVtZW50IGJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudF87Ci0gIHByaXZhdGUgVmVjdG9yIGVuZFBvaW50c187Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICBiaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRfID0gbnVsbDsKLSAgICBiaW5kaW5nVHlwZV8gPSBCaW5kaW5nVHlwZXMuVU5TVVBQT1JURUQ7Ci0gICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBiaW5kaW5nXy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpLm5leHQoKTsKLSAgICAgIGlmIChlIGluc3RhbmNlb2YgSFRUUEJpbmRpbmcpCi0gICAgICB7Ci0gICAgICAgIEhUVFBCaW5kaW5nIGJpbmRpbmcgPSAoSFRUUEJpbmRpbmcpZTsKLSAgICAgICAgU3RyaW5nIHZlcmIgPSBiaW5kaW5nLmdldFZlcmIoKTsKLSAgICAgICAgaWYgKEJpbmRpbmdUeXBlcy5IVFRQX1ZFUkJfR0VULmVxdWFscyh2ZXJiKSkKLSAgICAgICAgICBiaW5kaW5nVHlwZV8gPSBCaW5kaW5nVHlwZXMuSFRUUF9HRVQ7Ci0gICAgICAgIGVsc2UgaWYgKEJpbmRpbmdUeXBlcy5IVFRQX1ZFUkJfUE9TVC5lcXVhbHModmVyYikpCi0gICAgICAgICAgYmluZGluZ1R5cGVfID0gQmluZGluZ1R5cGVzLkhUVFBfUE9TVDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBTT0FQQmluZGluZykKLSAgICAgICAgYmluZGluZ1R5cGVfID0gQmluZGluZ1R5cGVzLlNPQVA7Ci0gICAgICBpZiAoYmluZGluZ1R5cGVfICE9IEJpbmRpbmdUeXBlcy5VTlNVUFBPUlRFRCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50XyA9IGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExCaW5kaW5nRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgICBzZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIGVuZFBvaW50c18gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgewotICAgIGJpbmRpbmdfID0gYmluZGluZzsKLSAgICBzZXREb2N1bWVudGF0aW9uKGJpbmRpbmcuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgc2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgIHJldHVybiBiaW5kaW5nXzsKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGdldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50XzsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRCaW5kaW5nVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ1R5cGVfOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlc2V0RW5kUG9pbnRzKCkKLSAgewotICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpZ2V0UGFyZW50RWxlbWVudCgpOwotICAgIFN0cmluZyBmaXhlZEVuZHBvaW50U3RyaW5nID0gc2VydmljZUVsZW1lbnQuZ2V0QWRkcmVzc0xvY2F0aW9uKGJpbmRpbmdfKTsKLSAgICBFbmRwb2ludCBmaXhlZEVuZHBvaW50ID0gZ2V0RW5kcG9pbnQoZml4ZWRFbmRwb2ludFN0cmluZyk7Ci0gICAgaWYgKGZpeGVkRW5kcG9pbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaXhlZEVuZHBvaW50ID0gbmV3IEVuZHBvaW50KCk7Ci0gICAgICBmaXhlZEVuZHBvaW50LnNldEVuZHBvaW50KGZpeGVkRW5kcG9pbnRTdHJpbmcpOwotICAgIH0KLSAgICBlbmRQb2ludHNfLmNsZWFyKCk7Ci0gICAgZW5kUG9pbnRzXy5hZGQoZml4ZWRFbmRwb2ludCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RW5kUG9pbnRzKCkKLSAgewotICAgIFN0cmluZ1tdIGVuZFBvaW50cyA9IG5ldyBTdHJpbmdbZW5kUG9pbnRzXy5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kUG9pbnRzLmxlbmd0aDsgaSsrKQotICAgICAgZW5kUG9pbnRzW2ldID0gKChFbmRwb2ludCllbmRQb2ludHNfLmdldChpKSkuZ2V0RW5kcG9pbnQoKTsKLSAgICByZXR1cm4gZW5kUG9pbnRzOwotICB9Ci0gIAotICBwdWJsaWMgRW5kcG9pbnQgZ2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50U3RyaW5nKQotICB7Ci0gICAgaWYgKGVuZHBvaW50U3RyaW5nICE9IG51bGwgJiYgZW5kcG9pbnRTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlbmRQb2ludHNfLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEVuZHBvaW50IGVuZHBvaW50ID0gKEVuZHBvaW50KWl0Lm5leHQoKTsKLSAgICAgICAgaWYgKGVuZHBvaW50U3RyaW5nLmVxdWFscyhlbmRwb2ludC5nZXRFbmRwb2ludCgpKSkKLSAgICAgICAgICByZXR1cm4gZW5kcG9pbnQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW5kUG9pbnRzKFN0cmluZ1tdIGVuZHBvaW50cykKLSAgewotICAgIFZlY3RvciBlbmRwb2ludFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZHBvaW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBFbmRwb2ludCBlbmRwb2ludCA9IGdldEVuZHBvaW50KGVuZHBvaW50c1tpXSk7Ci0gICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZW5kcG9pbnQgPSBuZXcgRW5kcG9pbnQoKTsKLSAgICAgICAgZW5kcG9pbnQuc2V0RW5kcG9pbnQoZW5kcG9pbnRzW2ldKTsKLSAgICAgIH0KLSAgICAgIGVuZHBvaW50VmVjdG9yLmFkZChlbmRwb2ludCk7Ci0gICAgfQotICAgIHJlc2V0RW5kUG9pbnRzKCk7Ci0gICAgZW5kUG9pbnRzXy5hZGRBbGwoZW5kcG9pbnRWZWN0b3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRW5kUG9pbnQoU3RyaW5nIGVuZHBvaW50U3RyaW5nKQotICB7Ci0gICAgaWYgKGVuZHBvaW50U3RyaW5nICE9IG51bGwgJiYgZW5kcG9pbnRTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIEVuZHBvaW50IGVuZHBvaW50ID0gbmV3IEVuZHBvaW50KCk7Ci0gICAgICBlbmRwb2ludC5zZXRFbmRwb2ludChlbmRwb2ludFN0cmluZyk7Ci0gICAgICBlbmRQb2ludHNfLmFkZChlbmRwb2ludCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRW5kUG9pbnQoU3RyaW5nIGVuZHBvaW50U3RyaW5nKQotICB7Ci0gICAgaWYgKGVuZHBvaW50U3RyaW5nICE9IG51bGwgJiYgZW5kcG9pbnRTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgU3RyaW5nIGZpeGVkRW5kcG9pbnRTdHJpbmcgPSBzZXJ2aWNlRWxlbWVudC5nZXRBZGRyZXNzTG9jYXRpb24oYmluZGluZ18pOwotICAgICAgaWYgKGZpeGVkRW5kcG9pbnRTdHJpbmcgPT0gbnVsbCB8fCAhZml4ZWRFbmRwb2ludFN0cmluZy5lcXVhbHMoZW5kcG9pbnRTdHJpbmcpKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZFBvaW50c18uc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZW5kcG9pbnRTdHJpbmcuZXF1YWxzKCgoRW5kcG9pbnQpZW5kUG9pbnRzXy5nZXQoaSkpLmdldEVuZHBvaW50KCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuZFBvaW50c18ucmVtb3ZlKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYnVpbGRNb2RlbCgpIHsKLSAgICByZXNldEVuZFBvaW50cygpOwotICAgIGlmIChiaW5kaW5nXyAhPSBudWxsKSB7Ci0gICAgICBQb3J0VHlwZSBwdCA9IGJpbmRpbmdfLmdldFBvcnRUeXBlKCk7Ci0gICAgICBpZiAocHQgIT0gbnVsbCkgewotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwdC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIEhhc2hNYXAgb3BlcmF0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykgewotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKWl0Lm5leHQoKTsKLSAgICAgICAgICBvcGVyYXRpb25zTWFwLnB1dChjcmVhdGVPcGVyYXRpb25VbmlxdWVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETE9wZXJhdGlvbkVsZW1lbnRbXSB3c2RsT3BlcmF0aW9uRWxlbWVudHMgPSBuZXcgV1NETE9wZXJhdGlvbkVsZW1lbnRbZ2V0TnVtYmVyT2ZFbGVtZW50cyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfT1BFUkFUSU9OKV07Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfT1BFUkFUSU9OKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsT3BlcmF0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICB3c2RsT3BlcmF0aW9uRWxlbWVudHNbaV0gPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd3NkbE9wZXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBjcmVhdGVPcGVyYXRpb25VbmlxdWVOYW1lKHdzZGxPcGVyYXRpb25FbGVtZW50c1tqXS5nZXRPcGVyYXRpb24oKSk7Ci0gICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pb3BlcmF0aW9uc01hcC5nZXQob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcGVyYXRpb25zTWFwLnJlbW92ZShvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgICAgIHdzZGxPcGVyYXRpb25FbGVtZW50c1tqXS5zZXRPcGVyYXRpb24odGhpcywgb3BlcmF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGlzY29ubmVjdCh3c2RsT3BlcmF0aW9uRWxlbWVudHNbal0sIFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9PUEVSQVRJT04pOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBvcGVyYXRpb25zTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykgewotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyID0gKE9wZXJhdGlvbilpdC5uZXh0KCk7Ci0gICAgICAgICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgd3NkbE9wZXJhdGlvbkVsZW1lbnQgPSBuZXcgV1NETE9wZXJhdGlvbkVsZW1lbnQob3Blci5nZXROYW1lKCksIHRoaXMsIG9wZXIpOwotICAgICAgICAgIGNvbm5lY3Qod3NkbE9wZXJhdGlvbkVsZW1lbnQsV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX09QRVJBVElPTixNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlT3BlcmF0aW9uVW5pcXVlTmFtZShPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIG5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgbmFtZS5hcHBlbmQob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgSW5wdXQgaW5wdXRNc2cgPSBvcGVyYXRpb24uZ2V0SW5wdXQoKTsKLSAgICBpZiAoaW5wdXRNc2cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBRTmFtZSBxbmFtZSA9IGlucHV0TXNnLmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpOwotICAgICAgbmFtZS5hcHBlbmQocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgbmFtZS5hcHBlbmQoIjoiKTsKLSAgICAgIG5hbWUuYXBwZW5kKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gICAgT3V0cHV0IG91dHB1dE1zZyA9IG9wZXJhdGlvbi5nZXRPdXRwdXQoKTsKLSAgICBpZiAob3V0cHV0TXNnICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgcW5hbWUgPSBvdXRwdXRNc2cuZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCk7Ci0gICAgICBuYW1lLmFwcGVuZChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBuYW1lLmFwcGVuZCgiOiIpOwotICAgICAgbmFtZS5hcHBlbmQocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETENvbW1vbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMQ29tbW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjkwZTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMQ29tbW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgV1NETENvbW1vbkVsZW1lbnQgZXh0ZW5kcyBUcmVlRWxlbWVudAotewotCi0gIHB1YmxpYyBXU0RMQ29tbW9uRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVHJlZUVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudCgpIHsKLSAgICAgIHJldHVybiAoVHJlZUVsZW1lbnQpZ2V0RWxlbWVudHMoTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKS5uZXh0RWxlbWVudCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXREb2N1bWVudGF0aW9uKE5vZGUgZG9jdW1lbnRhdGlvbkVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9ICIiOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKTsKLSAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBkZiA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0gICAgICAgIE5vZGVMaXN0IGRvY3VtZW50YXRpb25Ob2RlcyA9IGRvY3VtZW50YXRpb25FbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8ZG9jdW1lbnRhdGlvbk5vZGVzLmdldExlbmd0aCgpO2krKykKLSAgICAgICAgICBkZi5hcHBlbmRDaGlsZChkb2MuaW1wb3J0Tm9kZShkb2N1bWVudGF0aW9uTm9kZXMuaXRlbShpKSx0cnVlKSk7Ci0gICAgICAgIGRvY3VtZW50YXRpb24gPSBYTUxVdGlscy5zZXJpYWxpemUoZGYsdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBzZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX0RPQ1VNRU5UQVRJT04sZG9jdW1lbnRhdGlvbik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL1dTRExFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MzBhNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL1dTRExFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNzE3ICAgMTQ2NzA3IG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbgotICogMjAwNzAxMjQgICAxNjc0ODcgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklFbmNvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5jb21tb24uSFRUUFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5OZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRERpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRERpYWdub3N0aWNTZXZlcml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExFbGVtZW50IGV4dGVuZHMgV1NETENvbW1vbkVsZW1lbnQKLXsKLQotICBwcml2YXRlIFN0cmluZyB3c2RsVXJsXzsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb25fOwotICBwcml2YXRlIFZlY3RvciBzY2hlbWFMaXN0XzsKLSAgcHJpdmF0ZSBWZWN0b3Igc2NoZW1hVVJJXzsKLQotICBwcml2YXRlIHN0YXRpYyBWZWN0b3IgdzNTY2hlbWFRTmFtZUxpc3RfOwotICBwcml2YXRlIHN0YXRpYyBWZWN0b3IgY29uc3RhbnRTY2hlbWFMaXN0XzsKLSAgCi0gIC8vQSBSZXNvdXJjZVNldCBmb3IgYWxsIHNjaGVtYXMgaW4gdGhpcyBXU0RMCi0gIHByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLSAgc3RhdGljCi0gIHsKLSAgICAvLyB3MyBzY2hlbWEgVVJJIGxpc3Q6Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYQotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hCi0gICAgdzNTY2hlbWFRTmFtZUxpc3RfID0gbmV3IFZlY3RvcigpOwotICAgIHczU2NoZW1hUU5hbWVMaXN0Xy5hZGRFbGVtZW50KG5ldyBRTmFtZShGcmFnbWVudENvbnN0YW50cy5OU19VUklfQ1VSUkVOVF9TQ0hFTUFfWFNELCJzY2hlbWEiKSk7Ci0gICAgdzNTY2hlbWFRTmFtZUxpc3RfLmFkZEVsZW1lbnQobmV3IFFOYW1lKEZyYWdtZW50Q29uc3RhbnRzLk5TX1VSSV8yMDAwX1NDSEVNQV9YU0QsInNjaGVtYSIpKTsKLSAgICB3M1NjaGVtYVFOYW1lTGlzdF8uYWRkRWxlbWVudChuZXcgUU5hbWUoRnJhZ21lbnRDb25zdGFudHMuTlNfVVJJXzE5OTlfU0NIRU1BX1hTRCwic2NoZW1hIikpOwotCi0gICAgLy8gQ29uc3RhbnQgc2NoZW1hIFVSSSBsaXN0OgotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYQotICAgIC8vIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgLy8gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8KLSAgICBjb25zdGFudFNjaGVtYUxpc3RfID0gbmV3IFZlY3RvcigpOwotICAgIGNvbnN0YW50U2NoZW1hTGlzdF8uYWRkRWxlbWVudChYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShGcmFnbWVudENvbnN0YW50cy5OU19VUklfQ1VSUkVOVF9TQ0hFTUFfWFNEKSk7Ci0gICAgY29uc3RhbnRTY2hlbWFMaXN0Xy5hZGRFbGVtZW50KFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKEZyYWdtZW50Q29uc3RhbnRzLk5TX1VSSV8yMDAwX1NDSEVNQV9YU0QpKTsKLSAgICBjb25zdGFudFNjaGVtYUxpc3RfLmFkZEVsZW1lbnQoWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoRnJhZ21lbnRDb25zdGFudHMuTlNfVVJJXzE5OTlfU0NIRU1BX1hTRCkpOwotICAgIGNvbnN0YW50U2NoZW1hTGlzdF8uYWRkRWxlbWVudChYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShGcmFnbWVudENvbnN0YW50cy5OU19VUklfU09BUF9FTkMpKTsKLSAgICBjb25zdGFudFNjaGVtYUxpc3RfLmFkZEVsZW1lbnQoWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoRnJhZ21lbnRDb25zdGFudHMuVVJJX1dTREwpKTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFN0cmluZyB3c2RsVXJsKQotICB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHNldFdzZGxVcmwod3NkbFVybCk7Ci0gICAgZGVmaW5pdGlvbl8gPSBudWxsOwotICAgIHNjaGVtYUxpc3RfID0gbmV3IFZlY3RvcigpOwotCXNjaGVtYVVSSV8gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXc2RsVXJsKFN0cmluZyB3c2RsVXJsKSB7Ci0JICBIVFRQVXRpbGl0eSBodHRwID0gbmV3IEhUVFBVdGlsaXR5KCk7Ci0JICB3c2RsVXJsXyA9IGh0dHAuaGFuZGxlUmVkaXJlY3Qod3NkbFVybCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVcmwoKSB7Ci0gICAgcmV0dXJuIHdzZGxVcmxfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hTGlzdChWZWN0b3Igc2NoZW1hTGlzdCkKLSAgewotICAgIHNjaGVtYUxpc3RfID0gc2NoZW1hTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0U2NoZW1hTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hTGlzdF87Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgRGVmaW5pdGlvbiBsb2FkV1NETChTdHJpbmcgd3NkbFVSTCkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBwYXJzZXIuZ2V0V1NETERlZmluaXRpb25WZXJib3NlKHdzZGxVUkwpOwotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiB3c2RsZSkKLSAgICB7Ci0gICAgICB0aHJvdyB3c2RsZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uT1RIRVJfRVJST1IgLCB0LmdldE1lc3NhZ2UoKSwgdCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFZlY3RvciBsb2FkV1NETCgpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLQkgIAotCS8vCVJlZ2lzdGVyIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBmYWN0b3J5IHRvIGhhbmRsZSBhbGwgZmlsZSBleHRlbnRpb25zLgotCXJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7ICAgIAkJCi0JLy9SZWdpc3RlciB0aGUgcGFja2FnZSB0byBlbnN1cmUgaXQgaXMgYXZhaWxhYmxlIGR1cmluZyBsb2FkaW5nLgotCXJlc291cmNlU2V0LmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dChYU0RQYWNrYWdlLmVOU19VUkksWFNEUGFja2FnZS5lSU5TVEFOQ0UpOwkKLQkgIAotCSAgCi0gICAgVmVjdG9yIGVycm9yTWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZGVmaW5pdGlvbl8gPSBsb2FkV1NETCh3c2RsVXJsXyk7Ci0gICAgCi0gICAgCi0gICAgaWYgKGRlZmluaXRpb25fICE9IG51bGwpCi0gICAgewotICAgICAgc2V0RG9jdW1lbnRhdGlvbihkZWZpbml0aW9uXy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgIGdhdGhlclNjaGVtYXMoZGVmaW5pdGlvbl8sIHdzZGxVcmxfKTsKLSAgICAgIC8vIFZhbGlkYXRlIHRoZSBzY2hlbWFzLgotICAgICAgZm9yIChpbnQgaT0wO2k8c2NoZW1hTGlzdF8uc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpc2NoZW1hTGlzdF8uZWxlbWVudEF0KGkpOwotICAgICAgICB4c2RTY2hlbWEudmFsaWRhdGUoKTsKLSAgICAgICAgRUxpc3QgZXJyb3JzID0geHNkU2NoZW1hLmdldEFsbERpYWdub3N0aWNzKCk7Ci0gICAgICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoTGlzdEl0ZXJhdG9yIGxpID0gZXJyb3JzLmxpc3RJdGVyYXRvcigpO2xpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNERGlhZ25vc3RpYyB4ZCA9IChYU0REaWFnbm9zdGljKWxpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSB4ZC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAvLyBkbyBub3QgcmVwb3J0IGxvdyBzZXZlcml0eSBkaWFnbm9zdGljcyBvciBlcnJvbmVvdXMgYXJyYXkgcmVmZXJlbmNlIGVycm9ycy4KLSAgICAgICAgICAgIGlmICh4ZC5nZXRTZXZlcml0eSgpLmdldFZhbHVlKCkgPT0gWFNERGlhZ25vc3RpY1NldmVyaXR5LkZBVEFMX0xJVEVSQUwuZ2V0VmFsdWUoKSB8fCAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCAmJiBtc2cudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIjYXJyYXkiKSAhPSAtMSkpCi0gICAgICAgICAgICAgIGxpLnJlbW92ZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2VzLmFkZEVsZW1lbnQoeGQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaT0wO2k8Y29uc3RhbnRTY2hlbWFMaXN0Xy5zaXplKCk7aSsrKQotICAgICAgICBzY2hlbWFMaXN0Xy5hZGRFbGVtZW50KGNvbnN0YW50U2NoZW1hTGlzdF8uZWxlbWVudEF0KGkpKTsKLSAgICAgIAotCX0KLSAgICByZXR1cm4gZXJyb3JNZXNzYWdlczsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBnYXRoZXJTY2hlbWFzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGRlZmluaXRpb25VUkwpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IGV4dFR5cGVzID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBpZiAoZXh0VHlwZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8ZXh0VHlwZXMuc2l6ZSgpO2krKykKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotICAgICAgICAgIE9iamVjdCBvYmogPSBleHRUeXBlcy5nZXQoaSk7Ci0gICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpb2JqOwotICAgICAgICAgICAgaWYgKGlzVzNTY2hlbWFFbGVtZW50VHlwZShzY2hlbWFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmNyZWF0ZVNjaGVtYShzY2hlbWFFbGVtZW50LmdldEVsZW1lbnQoKSk7Ci0JCQkgIGlmKCFjaGVja1NjaGVtYVVSSShkZWZpbml0aW9uVVJMKSl7Ci0JCQkJICBzY2hlbWFMaXN0Xy5hZGRFbGVtZW50KHhzZFNjaGVtYSk7Ci0JCQkJICBnYXRoZXJTY2hlbWFEaXJlY3RpdmUoeHNkU2NoZW1hLCBkZWZpbml0aW9uVVJMKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIAl9Ci0gICAgICAgICAgfSAJCi0gICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBzY2hlbWFFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbClvYmo7Ci0gICAgICAgICAgICB4c2RTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmNyZWF0ZVNjaGVtYShzY2hlbWFFbGVtZW50LmdldEVsZW1lbnQoKSk7Ci0JCQlpZighY2hlY2tTY2hlbWFVUkkoZGVmaW5pdGlvblVSTCkpewotCQkJCXNjaGVtYUxpc3RfLmFkZEVsZW1lbnQoeHNkU2NoZW1hKTsKLQkJCQlnYXRoZXJTY2hlbWFEaXJlY3RpdmUoeHNkU2NoZW1hLCBkZWZpbml0aW9uVVJMKTsKLQkJCX0KLQkJICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgCSAgLy9XZSBuZWVkIHRvIGFkZCB0aGUgc2NoZW1hIHRvIGEgUmVzb3VyY2UgaW4gYSBSZXNvdXJjZSBzZXQgZm9yIHByb3BlciB2YWxpZGF0aW9uCi0gICAgICAgIAkgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgdXJpID0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSS5jcmVhdGVVUkkoZGVmaW5pdGlvblVSTCk7ICAgIAkJCi0gICAgICAgIAkgIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLSAgICAgICAgCSAgLy9BZGQgdGhlIFNjaGVtYSB0byB0aGUgcmVzb3VyY2UKLSAgICAgICAgCSAgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgTWFwIGltcG9ydHMgPSBkZWZpbml0aW9uLmdldEltcG9ydHMoKTsKLSAgICBpZiAoaW1wb3J0cyAhPSBudWxsKQotICAgICAgZ2F0aGVySW1wb3J0ZWRTY2hlbWFzKGRlZmluaXRpb24saW1wb3J0cyk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgZ2F0aGVyU2NoZW1hRGlyZWN0aXZlKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyB4c2RTY2hlbWFVUkwpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgRUxpc3QgeHNkU2NoZW1hQ29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB4c2RTY2hlbWFDb250ZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgY29udGVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgeHNkU2NoZW1hRGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSljb250ZW50OwotICAgICAgICAgIFN0cmluZ0J1ZmZlciB4c2RTY2hlbWFEaXJlY3RpdmVVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgU3RyaW5nIHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uID0geHNkU2NoZW1hRGlyZWN0aXZlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgICAgICAgaWYgKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uICE9IG51bGwgJiYgeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24uaW5kZXhPZignOicpID09IC0xICYmIHhzZFNjaGVtYVVSTCAhPSBudWxsICYmIHhzZFNjaGVtYVVSTC5pbmRleE9mKCc6JykgIT0gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gcmVsYXRpdmUgVVJMCi0gICAgICAgICAgICBpbnQgaW5kZXggPSB4c2RTY2hlbWFVUkwubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgICAgICAgeHNkU2NoZW1hRGlyZWN0aXZlVVJMLmFwcGVuZCh4c2RTY2hlbWFVUkwuc3Vic3RyaW5nKDAsIGluZGV4KzEpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2NoZW1hRGlyZWN0aXZlVVJMLmFwcGVuZCh4c2RTY2hlbWFVUkwpOwotICAgICAgICAgICAgICB4c2RTY2hlbWFEaXJlY3RpdmVVUkwuYXBwZW5kKCcvJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHhzZFNjaGVtYURpcmVjdGl2ZVVSTC5hcHBlbmQoeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24pOwotICAgICAgICAgIC8vIHJlc29sdmUgc2NoZW1hIGRpcmVjdGl2ZQotICAgICAgICAgIFhTRFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IHhzZFNjaGVtYURpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsICYmIHhzZFNjaGVtYURpcmVjdGl2ZVVSTC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICByZXNvbHZlZFNjaGVtYSA9IGdldFNjaGVtYSh4c2RTY2hlbWFEaXJlY3RpdmVVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotCQkJaWYoIWNoZWNrU2NoZW1hVVJJKHhzZFNjaGVtYURpcmVjdGl2ZVVSTC50b1N0cmluZygpKSl7Ci0JCQkJc2NoZW1hTGlzdF8uYWRkRWxlbWVudChyZXNvbHZlZFNjaGVtYSk7Ci0JCQkJZ2F0aGVyU2NoZW1hRGlyZWN0aXZlKHJlc29sdmVkU2NoZW1hLCB4c2RTY2hlbWFEaXJlY3RpdmVVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAJCX0KLSAgICAgIAkgIH0KLSAgICAgICAgfQotCSAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBjaGVja1NjaGVtYVVSSShTdHJpbmcgc2NoZW1hVVJJKXsKLQkgIAlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JICAJIAkKLQkJCi0JCXNjaGVtYVVSSSA9IG5vcm1hbGl6ZShzY2hlbWFVUkkpOyAKLQkJaWYoc2NoZW1hVVJJLmVxdWFscyhub3JtYWxpemUod3NkbFVybF8pKSlyZXR1cm4gZmFsc2U7Ci0JCUVudW1lcmF0aW9uIGUgPSBzY2hlbWFVUklfLmVsZW1lbnRzKCk7Ci0JCXdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpewotCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwkKLQkJCWlmKHNjaGVtYVVSSS5lcXVhbHModXJpKSl7IAotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0JCi0JCX0KLQkJCi0JICAgIGlmICghZm91bmQpewotCSAgICAJc2NoZW1hVVJJXy5hZGRFbGVtZW50KHNjaGVtYVVSSSk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGZvdW5kOwotCSAgCi0JICB9Ci0JICAKLSAgcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyB1cmkgKQotICB7Ci0JICB0cnkgewotCQkgIFN0cmluZyBlbmNvZGVkVVJJID0gVVJJRW5jb2Rlci5lbmNvZGUodXJpLCJVVEYtOCIpOwotCQkgIFVSSSBub3JtYWxpemVkVVJJID0gbmV3IFVSSShlbmNvZGVkVVJJKTsKLQkJICBub3JtYWxpemVkVVJJID0gbm9ybWFsaXplZFVSSS5ub3JtYWxpemUoKTsKLQkJICByZXR1cm4gbm9ybWFsaXplZFVSSS50b1N0cmluZygpOwotCSAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJICByZXR1cm4gdXJpOwotCSAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCSAgcmV0dXJuIHVyaTsKLQkgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzVzNTY2hlbWFFbGVtZW50VHlwZShRTmFtZSBxbmFtZSkKLSAgewotICAgIGZvciAoaW50IGk9MDtpPHczU2NoZW1hUU5hbWVMaXN0Xy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIFFOYW1lIHczU2NoZW1hUU5hbWUgPSAoUU5hbWUpdzNTY2hlbWFRTmFtZUxpc3RfLmVsZW1lbnRBdChpKTsKLSAgICAgIGlmICh3M1NjaGVtYVFOYW1lLmVxdWFscyhxbmFtZSkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgZ2F0aGVySW1wb3J0ZWRTY2hlbWFzKERlZmluaXRpb24gZGVmaW5pdGlvbixNYXAgaW1wb3J0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpbXBvcnRzLmtleVNldCgpLml0ZXJhdG9yKCk7aXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBMaXN0IGltcG9ydExpc3QgPSAoTGlzdClpbXBvcnRzLmdldChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgZm9yIChpbnQgaT0wO2k8aW1wb3J0TGlzdC5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBJbXBvcnQgaW1wID0gKEltcG9ydClpbXBvcnRMaXN0LmdldChpKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGxvY1VSSSA9IG5ldyBTdHJpbmdCdWZmZXIoaW1wLmdldExvY2F0aW9uVVJJKCkpOwotICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVVSTChsb2NVUkkudG9TdHJpbmcoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYmFzZSA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgICAgICAgbG9jVVJJLmluc2VydCgwLGJhc2Uuc3Vic3RyaW5nKDAsYmFzZS5sYXN0SW5kZXhPZignLycpKzEpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0RGVmID0gbG9hZFdTREwobG9jVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGdhdGhlclNjaGVtYXMoaW1wb3J0RGVmLCBsb2NVUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIE1heSBiZSBhbiBYU0QgZmlsZS4KLSAgICAgICAgICBnYXRoZXJTY2hlbWEobG9jVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGdhdGhlclNjaGVtYShTdHJpbmcgbG9jVVJJKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFNjaGVtYShsb2NVUkkpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzY2hlbWFMaXN0Xy5hZGRFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgICBnYXRoZXJTY2hlbWFEaXJlY3RpdmUoeHNkU2NoZW1hLCBsb2NVUkkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgZmluYWwgWFNEU2NoZW1hIGdldFNjaGVtYShTdHJpbmcgbG9jVVJJKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKGxvY1VSSSk7Ci0gICAgaWYgKHhzZFNjaGVtYSA9PSBudWxsKQotICAgIHsKLSAgICAgIFhTRFBhcnNlciBwID0gbmV3IFhTRFBhcnNlcigpOwotICAgICAgSW5wdXRTdHJlYW0gaXMgPSBOZXRVdGlscy5nZXRVUkxJbnB1dFN0cmVhbShsb2NVUkkpOwotICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHAucGFyc2UoaXMpOwotICAgICAgICB4c2RTY2hlbWEgPSBwLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBkZWZpbml0aW9uXyA9IGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJ1aWxkTW9kZWwoKSB7Ci0gICAgaWYgKGRlZmluaXRpb25fICE9IG51bGwpIHsKLSAgICAgIE1hcCBzZXJ2aWNlcyA9IG5ldyBIYXNoTWFwKGRlZmluaXRpb25fLmdldFNlcnZpY2VzKCkpOwotICAgICAgV1NETFNlcnZpY2VFbGVtZW50W10gd3NkbFNlcnZpY2VFbGVtZW50cyA9IG5ldyBXU0RMU2VydmljZUVsZW1lbnRbZ2V0TnVtYmVyT2ZFbGVtZW50cyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRSldOwotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbFNlcnZpY2VFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICB3c2RsU2VydmljZUVsZW1lbnRzW2ldID0gKFdTRExTZXJ2aWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzZGxTZXJ2aWNlRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSB3c2RsU2VydmljZUVsZW1lbnRzW2pdLmdldFNlcnZpY2UoKS5nZXRRTmFtZSgpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlzZXJ2aWNlcy5nZXQocW5hbWUpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgc2VydmljZXMucmVtb3ZlKHFuYW1lKTsKLSAgICAgICAgICB3c2RsU2VydmljZUVsZW1lbnRzW2pdLnNldFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgd3NkbFNlcnZpY2VFbGVtZW50c1tqXS5idWlsZE1vZGVsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpc2Nvbm5lY3Qod3NkbFNlcnZpY2VFbGVtZW50c1tqXSwgV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0UpOwotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlpdC5uZXh0KCk7Ci0gICAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCB3c2RsU2VydmljZUVsZW1lbnQgPSBuZXcgV1NETFNlcnZpY2VFbGVtZW50KHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgZ2V0TW9kZWwoKSwgc2VydmljZSk7Ci0gICAgICAgIGNvbm5lY3Qod3NkbFNlcnZpY2VFbGVtZW50LFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFLE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgICAgIHdzZGxTZXJ2aWNlRWxlbWVudC5idWlsZE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETE9wZXJhdGlvbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMT3BlcmF0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM0MzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMT3BlcmF0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuQmluZGluZ1R5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwueHNkLldTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMT3BlcmF0aW9uRWxlbWVudCBleHRlbmRzIFdTRExDb21tb25FbGVtZW50Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9UWVBFX1NPQVAgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVSQVRJT05fVFlQRV9IVFRQX0dFVCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9UWVBFX0hUVFBfUE9TVCA9IDI7Ci0KLSAgcHJpdmF0ZSBpbnQgb3BlcmF0aW9uVHlwZV87Ci0gIHByaXZhdGUgT3BlcmF0aW9uIG9wZXJhdGlvbl87Ci0gIHByaXZhdGUgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIHdzZGxQYXJ0c1RvWHNkVHlwZU1hcHBlcl87Ci0gIHByaXZhdGUgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgZnJhZ0NvbnRyb2xsZXJfOwotICBwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudFN0eWxlXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzVXNlTGl0ZXJhbF87Ci0gIHByaXZhdGUgU3RyaW5nIHNvYXBBY3Rpb25fOwotICBwcml2YXRlIFN0cmluZyBlbmNvZGluZ1N0eWxlXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmdOYW1lc3BhY2VfOwotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBnYXRoZXJTb2FwSW5mb3JtYXRpb24oV1NETEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50LFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nKQotICB7Ci0gICAgLy8gSW5pdGlhbGl6ZSBkZWZhdWx0cy4KLSAgICBpc0RvY3VtZW50U3R5bGVfID0gdHJ1ZTsKLSAgICBzb2FwQWN0aW9uXyA9ICIiOwotICAgIGlzVXNlTGl0ZXJhbF8gPSB0cnVlOwotICAgIGVuY29kaW5nU3R5bGVfID0gbnVsbDsKLSAgICBlbmNvZGluZ05hbWVzcGFjZV8gPSBudWxsOwotCi0gICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwpCi0gICAgICBpc0RvY3VtZW50U3R5bGVfID0gImRvY3VtZW50Ii5lcXVhbHMoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSk7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nRWxlbWVudCk7Ci0gICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0gbnVsbDsKLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaS5uZXh0KCk7Ci0gICAgICBpZiAoZSBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHNvYXBPcGVyYXRpb24gPSAoU09BUE9wZXJhdGlvbillOwotICAgICAgICBzb2FwQWN0aW9uXyA9IHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpOwotICAgICAgICBTdHJpbmcgc3R5bGUgPSBzb2FwT3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsKQotICAgICAgICAgIGlzRG9jdW1lbnRTdHlsZV8gPSBzdHlsZS5lcXVhbHMoImRvY3VtZW50Iik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpLm5leHQoKTsKLSAgICAgIGlmIChlIGluc3RhbmNlb2YgU09BUEJvZHkpCi0gICAgICB7Ci0gICAgICAgIHNvYXBCb2R5ID0gKFNPQVBCb2R5KWU7Ci0gICAgICAgIGlzVXNlTGl0ZXJhbF8gPSAibGl0ZXJhbCIuZXF1YWxzKHNvYXBCb2R5LmdldFVzZSgpKTsKLSAgICAgICAgaWYgKCFpc1VzZUxpdGVyYWxfKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRW5jb2RlZC4KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzb2FwQm9keS5nZXRFbmNvZGluZ1N0eWxlcygpLml0ZXJhdG9yKCk7ai5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kaW5nU3R5bGVfID0gKFN0cmluZylqLm5leHQoKTsKLSAgICAgICAgICAgIGVuY29kaW5nTmFtZXNwYWNlXyA9IHNvYXBCb2R5LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBXU0RMT3BlcmF0aW9uRWxlbWVudChTdHJpbmcgbmFtZSxXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIHN1cGVyKG5hbWUsIGJpbmRpbmdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgIC8vIFNldCB0aGUgZGVmYXVsdCBvcGVyYXRpb24gdHlwZSB0byBiZSBTT0FQLgotICAgIHNldE9wZXJhdGlvbihiaW5kaW5nRWxlbWVudCxvcGVyYXRpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uKFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCxPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgb3BlcmF0aW9uXyA9IG9wZXJhdGlvbjsKLSAgICBzZXREb2N1bWVudGF0aW9uKG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBmcmFnQ29udHJvbGxlcl8gPSBudWxsOwotICAgIHdzZGxQYXJ0c1RvWHNkVHlwZU1hcHBlcl8gPSBudWxsOwotICAgIG9wZXJhdGlvblR5cGVfID0gYmluZGluZ0VsZW1lbnQuZ2V0QmluZGluZ1R5cGUoKTsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBiaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBiaW5kaW5nRWxlbWVudC5nZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICBzd2l0Y2ggKG9wZXJhdGlvblR5cGVfKQotICAgIHsKLSAgICAgIGNhc2UgQmluZGluZ1R5cGVzLlNPQVA6Ci0gICAgICAgIGdhdGhlclNvYXBJbmZvcm1hdGlvbihiaW5kaW5nRWxlbWVudCwoU09BUEJpbmRpbmcpYmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgIGNhc2UgQmluZGluZ1R5cGVzLkhUVFBfR0VUOgotICAgICAgY2FzZSBCaW5kaW5nVHlwZXMuSFRUUF9QT1NUOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbl87Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRCaW5kaW5nT3BlcmF0aW9uKChXU0RMQmluZGluZ0VsZW1lbnQpZ2V0UGFyZW50RWxlbWVudCgpKTsKLSAgfQotCi0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCkKLSAgewotICAgIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdFbGVtZW50LmdldEJpbmRpbmcoKTsKLSAgICBTdHJpbmcgb3BlcmF0aW9uSW5wdXROYW1lID0gbnVsbDsKLSAgICBTdHJpbmcgb3BlcmF0aW9uT3V0cHV0TmFtZSA9IG51bGw7Ci0gICAgSW5wdXQgb3BlcmF0aW9uSW5wdXQgPSBvcGVyYXRpb25fLmdldElucHV0KCk7Ci0gICAgT3V0cHV0IG9wZXJhdGlvbk91dHB1dCA9IG9wZXJhdGlvbl8uZ2V0T3V0cHV0KCk7Ci0gICAgaWYgKG9wZXJhdGlvbklucHV0ICE9IG51bGwpCi0gICAgICBvcGVyYXRpb25JbnB1dE5hbWUgPSBvcGVyYXRpb25JbnB1dC5nZXROYW1lKCk7Ci0gICAgaWYgKG9wZXJhdGlvbk91dHB1dCAhPSBudWxsKQotICAgICAgb3BlcmF0aW9uT3V0cHV0TmFtZSA9IG9wZXJhdGlvbk91dHB1dC5nZXROYW1lKCk7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbl8uZ2V0TmFtZSgpLG9wZXJhdGlvbklucHV0TmFtZSxvcGVyYXRpb25PdXRwdXROYW1lKTsKLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgYmluZGluZ09wZXJhdGlvbiA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbihvcGVyYXRpb25fLmdldE5hbWUoKSxudWxsLG51bGwpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0T3JkZXJlZEJvZHlQYXJ0cygpCi0gIHsKLSAgICBMaXN0IHBhcnRzID0gbmV3IFZlY3RvcihvcGVyYXRpb25fLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpLmdldE9yZGVyZWRQYXJ0cyhvcGVyYXRpb25fLmdldFBhcmFtZXRlck9yZGVyaW5nKCkpKTsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBnZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXQubmV4dCgpOwotICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgIHsKLSAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSAoU09BUEJvZHkpZTsKLSAgICAgICAgTGlzdCBib2R5UGFydHMgPSBzb2FwQm9keS5nZXRQYXJ0cygpOwotICAgICAgICBpZiAoYm9keVBhcnRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KXBhcnRzLmdldChpKTsKLSAgICAgICAgICAgIGlmICghYm9keVBhcnRzLmNvbnRhaW5zKHBhcnQpICYmICFib2R5UGFydHMuY29udGFpbnMocGFydC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJ0cy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwYXJ0czsKLSAgfQotCi0gIHByaXZhdGUgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgZ2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKSB7Ci0gICAgaWYgKGZyYWdDb250cm9sbGVyXyA9PSBudWxsKSB7Ci0gICAgICBmcmFnQ29udHJvbGxlcl8gPSBuZXcgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKTsKLSAgICAgIGZyYWdDb250cm9sbGVyXy5zZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIod3NkbFBhcnRzVG9Yc2RUeXBlTWFwcGVyXyk7Ci0gICAgfQotICAgIHJldHVybiBmcmFnQ29udHJvbGxlcl87Ci0gIH0KLQotICBwcml2YXRlIFhTRE5hbWVkQ29tcG9uZW50IGdldFNjaGVtYShQYXJ0IHBhcnQsIFN0cmluZyBpZCkgewotICAgIGlmICh3c2RsUGFydHNUb1hzZFR5cGVNYXBwZXJfID09IG51bGwpIHsKLSAgICAgIHdzZGxQYXJ0c1RvWHNkVHlwZU1hcHBlcl8gPSBuZXcgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCk7Ci0gICAgICBXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSAoV1NETEJpbmRpbmdFbGVtZW50KWdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpYmluZGluZ0VsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpc2VydmljZUVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgd3NkbFBhcnRzVG9Yc2RUeXBlTWFwcGVyXy5hZGRTY2hlbWFzKHdzZGxFbGVtZW50LmdldFNjaGVtYUxpc3QoKSk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsUGFydHNUb1hzZFR5cGVNYXBwZXJfLmdldFhTRFR5cGUocGFydCwgaWQpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChQYXJ0IHBhcnQpIHsKLSAgICByZXR1cm4gZ2V0RnJhZ21lbnQocGFydCwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldEZyYWdtZW50KFBhcnQgcGFydCwgYm9vbGVhbiBpc0lucHV0KSB7Ci0gICAgU3RyaW5nQnVmZmVyIGlkID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChpc0lucHV0KQotICAgICAgaWQuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLklOUFVUX0lEKTsKLSAgICBlbHNlCi0gICAgICBpZC5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuT1VUUFVUX0lEKTsKLSAgICBTdHJpbmcgcGFydE5hbWUgPSBwYXJ0LmdldE5hbWUoKTsKLSAgICBpZC5hcHBlbmQocGFydE5hbWUpOwotICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIGNvbmZpZy5zZXRJc1dTRExQYXJ0KHRydWUpOwotICAgIGNvbmZpZy5zZXRXU0RMUGFydE5hbWUocGFydE5hbWUpOwotICAgIGNvbmZpZy5zZXRYU0RDb21wb25lbnQoZ2V0U2NoZW1hKHBhcnQsIGlkLnRvU3RyaW5nKCkpKTsKLSAgICBpZiAoaXNEb2N1bWVudFN0eWxlKCkpCi0gICAgICBjb25maWcuc2V0U3R5bGUoRnJhZ21lbnRDb25zdGFudHMuU1RZTEVfRE9DVU1FTlQpOwotICAgIGVsc2UKLSAgICAgIGNvbmZpZy5zZXRTdHlsZShGcmFnbWVudENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgIGlmIChvcGVyYXRpb25UeXBlXyA9PSBCaW5kaW5nVHlwZXMuU09BUCkKLSAgICB7Ci0gICAgICBpZiAoIWlzVXNlTGl0ZXJhbF8pCi0gICAgICAgIGNvbmZpZy5zZXRQYXJ0RW5jb2RpbmcoRnJhZ21lbnRDb25zdGFudHMuRU5DT0RJTkdfU09BUCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGNvbmZpZy5zZXRQYXJ0RW5jb2RpbmcoRnJhZ21lbnRDb25zdGFudHMuRU5DT0RJTkdfVVJMKTsKLSAgICBJWFNERnJhZ21lbnQgZnJhZ21lbnQgPSBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldEZyYWdtZW50KGNvbmZpZywgaWQudG9TdHJpbmcoKSwgcGFydC5nZXROYW1lKCkpOwotICAgIHJldHVybiBmcmFnbWVudDsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnQgZ2V0RnJhZ21lbnRCeUlEKFN0cmluZyBpZCkgewotICAgIHJldHVybiBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldENhY2hlZEZyYWdtZW50KGlkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUFsbEZyYWdtZW50KCkgewotICAgIGdldFhTRFRvRnJhZ21lbnRDb250cm9sbGVyKCkuZW1wdHlDYWNoZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudFN0eWxlKCkKLSAgewotICAgIHJldHVybiBpc0RvY3VtZW50U3R5bGVfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTb2FwQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzb2FwQWN0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVXNlTGl0ZXJhbCgpCi0gIHsKLSAgICByZXR1cm4gaXNVc2VMaXRlcmFsXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdTdHlsZSgpCi0gIHsKLSAgICByZXR1cm4gZW5jb2RpbmdTdHlsZV87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nTmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiBlbmNvZGluZ05hbWVzcGFjZV87Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE9wZXJhdGlvblR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblR5cGVfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETFNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETFNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDFhMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL1dTRExTZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETE1vZGVsQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VFbGVtZW50IGV4dGVuZHMgV1NETENvbW1vbkVsZW1lbnQKLXsKLQotICBwcml2YXRlIFNlcnZpY2Ugc2VydmljZV87Ci0KLSAgcHVibGljIFdTRExTZXJ2aWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgICBzZXRTZXJ2aWNlKHNlcnZpY2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgIHNlcnZpY2VfID0gc2VydmljZTsKLSAgICBzZXREb2N1bWVudGF0aW9uKHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgewotICAgIHJldHVybiBzZXJ2aWNlXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzTG9jYXRpb24oQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgTWFwIHBvcnRzID0gc2VydmljZV8uZ2V0UG9ydHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydClpLm5leHQoKTsKLSAgICAgIGlmIChwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmVxdWFscyhiaW5kaW5nLmdldFFOYW1lKCkpKQotICAgICAgewotICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpO2ouaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpai5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcyllbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIHNvYXBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBIVFRQQWRkcmVzcyBodHRwQWRkcmVzcyA9IChIVFRQQWRkcmVzcyllbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIGh0dHBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYnVpbGRNb2RlbCgpIHsKLSAgICBpZiAoc2VydmljZV8gIT0gbnVsbCkgewotICAgICAgTWFwIHBvcnRzID0gc2VydmljZV8uZ2V0UG9ydHMoKTsKLSAgICAgIE1hcCBiaW5kaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTtpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KWl0Lm5leHQoKTsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nLmdldFBvcnRUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGJpbmRpbmdzLnB1dChiaW5kaW5nLmdldFFOYW1lKCksIGJpbmRpbmcpOwotICAgICAgfQotICAgICAgV1NETEJpbmRpbmdFbGVtZW50W10gd3NkbEJpbmRpbmdFbGVtZW50cyA9IG5ldyBXU0RMQmluZGluZ0VsZW1lbnRbZ2V0TnVtYmVyT2ZFbGVtZW50cyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfQklORElORyldOwotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9CSU5ESU5HKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbEJpbmRpbmdFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICB3c2RsQmluZGluZ0VsZW1lbnRzW2ldID0gKFdTRExCaW5kaW5nRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzZGxCaW5kaW5nRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSB3c2RsQmluZGluZ0VsZW1lbnRzW2pdLmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZyliaW5kaW5ncy5nZXQocW5hbWUpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgYmluZGluZ3MucmVtb3ZlKHFuYW1lKTsKLSAgICAgICAgICB3c2RsQmluZGluZ0VsZW1lbnRzW2pdLnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgICAgICAgd3NkbEJpbmRpbmdFbGVtZW50c1tqXS5idWlsZE1vZGVsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpc2Nvbm5lY3Qod3NkbEJpbmRpbmdFbGVtZW50c1tqXSwgV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX0JJTkRJTkcpOwotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGJpbmRpbmdzLnZhbHVlcygpLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylpdC5uZXh0KCk7Ci0gICAgICAgIFdTRExCaW5kaW5nRWxlbWVudCB3c2RsQmluZGluZ0VsZW1lbnQgPSBuZXcgV1NETEJpbmRpbmdFbGVtZW50KGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgZ2V0TW9kZWwoKSwgYmluZGluZyk7Ci0gICAgICAgIGNvbm5lY3Qod3NkbEJpbmRpbmdFbGVtZW50LFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9CSU5ESU5HLE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgICAgIHdzZGxCaW5kaW5nRWxlbWVudC5idWlsZE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njk1YTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZyYWdtZW50IHsKLSAgcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKTsKLSAgcHVibGljIFN0cmluZyBnZXRJRCgpOwotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUGFyYW1ldGVyVmFsdWVzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXksIFN0cmluZ1tdIHBhcmFtcyk7Ci0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSwgVmVjdG9yIHBhcmFtcyk7Ci0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KTsKLSAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgcGFyYW1LZXksIGludCBwYXJhbUluZGV4KTsKLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpOwotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlKFN0cmluZyBwYXJhbUtleSwgaW50IHBhcmFtSW5kZXgpOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKTsKLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lTT0FQRW5jQXJyYXlGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVNPQVBFbmNBcnJheUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGRiZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVNPQVBFbmNBcnJheUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElTT0FQRW5jQXJyYXlGcmFnbWVudCBleHRlbmRzIElYU0RHcm91cFNlcUZyYWdtZW50IHsKLSAgcHVibGljIFN0cmluZyBjcmVhdGVTT0FQRW5jQXJyYXlJbnN0YW5jZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTAxM2Q5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lTT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQgZXh0ZW5kcyBJWFNERGVsZWdhdGlvbkZyYWdtZW50Ci17Ci0gIHB1YmxpYyB2b2lkIHNldFVSSVJlZmVyZW5jZXMoSGFzaHRhYmxlIHVyaVJlZmVyZW5jZXMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREF0dHJpYnV0ZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEQXR0cmlidXRlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmMjNjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEQXR0cmlidXRlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qCi0qIEZpbGUgcGx1Z2lucy9jb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmV4cGxvcmVyL3dzZXhwbG9yZXIvc3JjL2NvbS9pYm0vZXRvb2xzL3dlYnNlcnZpY2UvZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9JWFNERWxlbWVudEZyYWdtZW50LmphdmEsIHdzYS5ldG9vbHMud3MuZXhwbG9yZXIsIGx1bmFyLTUuMS4yLCAyMDAzMTIzMWEgMQotKiBWZXJzaW9uIDEuMSAwMy8wMi8yOCAxNToyNjowNQotKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTREF0dHJpYnV0ZUZyYWdtZW50IGV4dGVuZHMgSVhTRERlbGVnYXRpb25GcmFnbWVudCB7Ci0gIAotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEQ29tcGxleEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEQ29tcGxleEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmJjMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRENvbXBsZXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJWFNEQ29tcGxleEZyYWdtZW50IGV4dGVuZHMgSVhTRE1hcEZyYWdtZW50IHsKLSAgcHVibGljIFN0cmluZyBjcmVhdGVDb21wbGV4SW5zdGFuY2UoKTsKLSAgcHVibGljIElYU0RBdHRyaWJ1dGVGcmFnbWVudFtdIGdldEFsbEF0dHJpYnV0ZUZyYWdtZW50cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRERlbGVnYXRpb25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRERlbGVnYXRpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQzYmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0REZWxlZ2F0aW9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRERlbGVnYXRpb25GcmFnbWVudCBleHRlbmRzIElYU0RGcmFnbWVudCB7Ci0gIHB1YmxpYyB2b2lkIHNldFhTRERlbGVnYXRpb25GcmFnbWVudChJWFNERnJhZ21lbnQgeHNkRnJhZ21lbnQpOwotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREVsZW1lbnRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREVsZW1lbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzI3YjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RFbGVtZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTREVsZW1lbnRGcmFnbWVudCBleHRlbmRzIElYU0REZWxlZ2F0aW9uRnJhZ21lbnQgewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBOSUwgPSAibmlsVmFsdWUiOyAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5JTF9WQUxVRSA9ICJuaWwiOyAKLSAgCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCk7Ci0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKTsKLSAgcHVibGljIFN0cmluZyBnZXROaWxJRCgpOwotICBwdWJsaWMgYm9vbGVhbiBpc05pbCgpOwotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNERnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmJhNmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RGcmFnbWVudCBleHRlbmRzIElGcmFnbWVudCB7Ci0gIHB1YmxpYyB2b2lkIHNldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0gIHB1YmxpYyBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotCi0gIHB1YmxpYyB2b2lkIHNldFhTRFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYpOwotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgcHVibGljIEVsZW1lbnQgc2V0QXR0cmlidXRlc09uSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudCBpbnN0YW5jZURvY3VtZW50LFN0cmluZyBuYW1lKTsKLSAgcHVibGljIGJvb2xlYW4gc2V0QXR0cmlidXRlUGFyYW1zRnJvbUluc3RhbmNlRG9jdW1lbnRzIChOb2RlIGF0dHJpYnV0ZSk7Ci0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpOwotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgRG9jdW1lbnQgZG9jKTsKLQotICBwdWJsaWMgU3RyaW5nIGdlbklEKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBBbGxGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREdyb3VwQWxsRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNTRlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBBbGxGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJWFNER3JvdXBBbGxGcmFnbWVudCBleHRlbmRzIElYU0RHcm91cEZyYWdtZW50IHsKLSAgcHVibGljIFN0cmluZyBnZXRHcm91cEFsbEluc3RhbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBDaG9pY2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREdyb3VwQ2hvaWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0ODM3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBDaG9pY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLQotcHVibGljIGludGVyZmFjZSBJWFNER3JvdXBDaG9pY2VGcmFnbWVudCBleHRlbmRzIElYU0RHcm91cEZyYWdtZW50IHsKLSAgcHVibGljIFhTRFBhcnRpY2xlW10gZ2V0Q2hvaWNlcygpOwotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUdyb3VwQ2hvaWNlSW5zdGFuY2UoaW50IGNob2ljZUluZGV4KTsKLSAgcHVibGljIGludCBnZXRDaG9pY2VJbmRleChTdHJpbmcgZ3JvdXBJRCk7Ci0gIHB1YmxpYyB2b2lkIHNldENob2ljZUluZGV4KFN0cmluZyBncm91cElELCBpbnQgY2hvaWNlSW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREdyb3VwRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RHcm91cEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTg3NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREdyb3VwRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGludGVyZmFjZSBJWFNER3JvdXBGcmFnbWVudCBleHRlbmRzIElYU0RNYXBGcmFnbWVudCB7Ci0gIHB1YmxpYyB2b2lkIHNldFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKTsKLSAgcHVibGljIFhTRE1vZGVsR3JvdXAgZ2V0WFNETW9kZWxHcm91cCgpOwotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRHcm91cElEcygpOwotICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBNZW1iZXJJRHMoU3RyaW5nIGdyb3VwSUQpOwotICBwdWJsaWMgSVhTREZyYWdtZW50W10gZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoU3RyaW5nIGdyb3VwSUQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREdyb3VwU2VxRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RHcm91cFNlcUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDQzM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREdyb3VwU2VxRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTREdyb3VwU2VxRnJhZ21lbnQgZXh0ZW5kcyBJWFNER3JvdXBGcmFnbWVudCB7Ci0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBTZXFJbnN0YW5jZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRE1hcEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNETWFwRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5ZmQzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNETWFwRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRE1hcEZyYWdtZW50IGV4dGVuZHMgSVhTREZyYWdtZW50IHsKLSAgcHVibGljIHZvaWQgc2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcik7Ci0gIHB1YmxpYyBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpOwotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlSW5zdGFuY2UoKTsKLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RnJhZ21lbnRzT3JkZXIoKTsKLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChTdHJpbmcgaWQpOwotICBwdWJsaWMgSVhTREZyYWdtZW50W10gZ2V0RnJhZ21lbnRzKFN0cmluZ1tdIGlkcyk7Ci0gIHB1YmxpYyBJWFNERnJhZ21lbnRbXSBnZXRBbGxGcmFnbWVudHMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RTaW1wbGVBdG9taWNGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZjk3ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RTaW1wbGVBdG9taWNGcmFnbWVudCBleHRlbmRzIElYU0RGcmFnbWVudCB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEU2ltcGxlTGlzdEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEU2ltcGxlTGlzdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOTI1YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRFNpbXBsZUxpc3RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJWFNEU2ltcGxlTGlzdEZyYWdtZW50IGV4dGVuZHMgSVhTRE1hcEZyYWdtZW50IHsKLSAgcHVibGljIFN0cmluZyBjcmVhdGVMaXN0SW5zdGFuY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RTaW1wbGVVbmlvbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEU2ltcGxlVW5pb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTg2YTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RTaW1wbGVVbmlvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RTaW1wbGVVbmlvbkZyYWdtZW50IGV4dGVuZHMgSVhTRE1hcEZyYWdtZW50IHsKLSAgcHVibGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uW10gZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlVW5pb25JbnN0YW5jZShpbnQgbWVtYmVyVHlwZUluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTREF0dHJpYnV0ZVVzZVRvRnJhZ21lbnRNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTREF0dHJpYnV0ZVVzZVRvRnJhZ21lbnRNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlMTBlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RBdHRyaWJ1dGVVc2VUb0ZyYWdtZW50TWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioKLSogPGNvcHlyaWdodD4KLSoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qCi0qIDwvY29weXJpZ2h0PgotKgotKiBGaWxlIHBsdWdpbnMvY29tLmlibS5ldG9vbHMud2Vic2VydmljZS5leHBsb3Jlci93c2V4cGxvcmVyL3NyYy9jb20vaWJtL2V0b29scy93ZWJzZXJ2aWNlL2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERWxlbWVudERlY2xhcmF0aW9uVG9GcmFnbWVudE1hcHBlci5qYXZhLCB3c2EuZXRvb2xzLndzLmV4cGxvcmVyLCBsdW5hci01LjEuMiwgMjAwMzEyMzFhIDIKLSogVmVyc2lvbiAxLjIgMDMvMDYvMDUgMTQ6MTc6NDQKLSovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5YU0RBdHRyaWJ1dGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlVXNlVG9GcmFnbWVudE1hcHBlciBleHRlbmRzIFhTRFRvRnJhZ21lbnRNYXBwZXIgewotICBwdWJsaWMgWFNEQXR0cmlidXRlVXNlVG9GcmFnbWVudE1hcHBlcihYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIgd3NkbFRvWFNETWFwcGVyKSB7Ci0gICAgc3VwZXIoY29udHJvbGxlciwgd3NkbFRvWFNETWFwcGVyKTsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnQgZ2V0RnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAJWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVVc2UpY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCAmJiBhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0gICAJICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXNvbHZlZEF0dHJpYnV0ZSA9IHJlc29sdmVYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gZ2V0WFNEVHlwZURlZmluaXRpb24ocmVzb2x2ZWRBdHRyaWJ1dGUpOwotICAgICAgSVhTREF0dHJpYnV0ZUZyYWdtZW50IGF0dHJpYnV0ZUZyYWcgPSBuZXcgWFNEQXR0cmlidXRlRnJhZ21lbnQoaWQsIHJlc29sdmVkQXR0cmlidXRlLmdldE5hbWUoKSwgY29uZmlnKTsKLSAgICAgIGF0dHJpYnV0ZUZyYWcuc2V0WFNEVHlwZURlZmluaXRpb24odHlwZURlZik7Ci0gICAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBhdHRyaWJ1dGVUeXBlQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICBhdHRyaWJ1dGVUeXBlQ29uZmlnLnNldFhTRENvbXBvbmVudCh0eXBlRGVmKTsKLSAgICAgIGF0dHJpYnV0ZVR5cGVDb25maWcuc2V0U3R5bGUoY29uZmlnLmdldFN0eWxlKCkpOwotICAgICAgYXR0cmlidXRlVHlwZUNvbmZpZy5zZXRQYXJ0RW5jb2RpbmcoY29uZmlnLmdldFBhcnRFbmNvZGluZygpKTsKLSAgICAgIGF0dHJpYnV0ZVR5cGVDb25maWcuc2V0V1NETFBhcnROYW1lKGNvbmZpZy5nZXRXU0RMUGFydE5hbWUoKSk7Ci0gICAgICBJWFNERnJhZ21lbnQgeHNkRnJhZ21lbnQgPSBnZXRDb250cm9sbGVyKCkuZ2V0RnJhZ21lbnQoYXR0cmlidXRlVHlwZUNvbmZpZywgYXR0cmlidXRlRnJhZy5nZW5JRCgpLCByZXNvbHZlZEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotICAgICAgYXR0cmlidXRlRnJhZy5zZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoeHNkRnJhZ21lbnQpOwotICAgICAgcmV0dXJuIGF0dHJpYnV0ZUZyYWc7Ci0gICAgfQotICAgIHJldHVybiBnZXRYU0REZWZhdWx0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc29sdmVYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUpIHsKLSAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgIGlmIChhdHRyaWJ1dGUuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzb2x2ZWRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgaWYgKCFpc0NvbXBvbmVudFJlc29sdmFibGUocmVzb2x2ZWRBdHRyaWJ1dGUpKQotICAgICAgewotICAgICAgICBYU0RDb21wb25lbnQgcmVzb2x2ZWRDb21wb25lbnQgPSBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKS5yZXNvbHZlWFNETmFtZWRDb21wb25lbnQocmVzb2x2ZWRBdHRyaWJ1dGUpOwotICAgICAgICBpZiAocmVzb2x2ZWRDb21wb25lbnQgIT0gbnVsbCAmJiAocmVzb2x2ZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikpCi0gICAgICAgICAgcmVzb2x2ZWRBdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pcmVzb2x2ZWRDb21wb25lbnQ7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzb2x2ZWRBdHRyaWJ1dGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gIH0KLQotICBwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGVEZWZpbml0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSkgewotICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgaWYgKGF0dHJpYnV0ZS5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICByZXR1cm4gYXR0cmlidXRlLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgLy8gcG9ydCB0byBvcmcuZWNsaXBzZS54c2QKLSAgICBlbHNlIGlmIChhdHRyaWJ1dGUuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFR5cGVUb0ZyYWdtZW50TWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwMGQzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLlhTRENvbXBsZXhGaXhGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLlhTRENvbXBsZXhSYW5nZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRGaXhGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLlhTRENvbXBsZXhTaW1wbGVDb250ZW50UmFuZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsLlhTRFR5cGVEZWZpbml0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29udGVudFR5cGVDYXRlZ29yeTsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlVG9GcmFnbWVudE1hcHBlciBleHRlbmRzIFhTRFRvRnJhZ21lbnRNYXBwZXIgewotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVUb0ZyYWdtZW50TWFwcGVyKFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyLCB3c2RsVG9YU0RNYXBwZXIpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBpbnQgY2F0ZWdvcnkgPSBjb21wbGV4VHlwZS5nZXRDb250ZW50VHlwZUNhdGVnb3J5KCkuZ2V0VmFsdWUoKTsKLSAgICBpZiAoY29tcGxleFR5cGUgIT0gbnVsbCAmJiBjb21wbGV4VHlwZS5pc01peGVkKCkpCi0gICAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4VHlwZUNvbnRlbnQgPSBYU0RUeXBlRGVmaW5pdGlvblV0aWwuZ2V0WFNEQ29tcGxleFR5cGVDb250ZW50KGNvbXBsZXhUeXBlKTsKLSAgICBpZiAoY29tcGxleFR5cGVDb250ZW50ICE9IG51bGwpCi0gICAgICByZXR1cm4gZ2V0WFNEQ29tcGxleEZyYWdtZW50KGNhdGVnb3J5LGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRYU0RFbXB0eUZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBJWFNERnJhZ21lbnQgZ2V0WFNEQ29tcGxleEZyYWdtZW50KGludCBjYXRlZ29yeSxYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBpbnQgbWluT2NjdXJzID0gY29uZmlnLmdldE1pbk9jY3VycygpOwotICAgIGludCBtYXhPY2N1cnMgPSBjb25maWcuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgaWYgKG1pbk9jY3VycyA9PSBtYXhPY2N1cnMpCi0gICAgICBpZihjYXRlZ29yeSA9PSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LlNJTVBMRSl7Ci0gICAgICAJcmV0dXJuIG5ldyBYU0RDb21wbGV4U2ltcGxlQ29udGVudEZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSk7Ci0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQkKLSAgICAgIAlyZXR1cm4gbmV3IFhTRENvbXBsZXhGaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCkpOwotICAgIGVsc2UgCi0gICAgCWlmKGNhdGVnb3J5ID09IFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkuU0lNUExFKQotICAgIAkgIHJldHVybiBuZXcgWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRSYW5nZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSk7Ci0gICAgCWVsc2UKLSAgICAgICAgICByZXR1cm4gbmV3IFhTRENvbXBsZXhSYW5nZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTREVsZW1lbnREZWNsYXJhdGlvblRvRnJhZ21lbnRNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTREVsZW1lbnREZWNsYXJhdGlvblRvRnJhZ21lbnRNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0ZDZhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RFbGVtZW50RGVjbGFyYXRpb25Ub0ZyYWdtZW50TWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDQwNCAgIDE4MTA2NSBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgV1NFIGRvZXMgbm90IGhhbmRsZSB0eXBlcyByZWZlcmVuY2VkIGFjcm9zcyBpbmxpbmUgc2NoZW1hcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNERWxlbWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnhzZC5XU0RMUGFydHNUb1hTRFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25Ub0ZyYWdtZW50TWFwcGVyIGV4dGVuZHMgWFNEVG9GcmFnbWVudE1hcHBlciB7Ci0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb25Ub0ZyYWdtZW50TWFwcGVyKFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyLCB3c2RsVG9YU0RNYXBwZXIpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXNvbHZlZEVsZW1lbnQgPSByZXNvbHZlWFNERWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IHJlc29sdmVYU0RUeXBlRGVmaW5pdGlvbihnZXRYU0RUeXBlRGVmaW5pdGlvbihyZXNvbHZlZEVsZW1lbnQpKTsKLSAgICAgIGlmICh0eXBlRGVmICE9IG51bGwpIHsKLSAgICAgICAgaW50IG1pbk9jY3VycyA9IEZyYWdtZW50Q29uc3RhbnRzLkRFRkFVTFRfTUlOX09DQ1VSUzsKLSAgICAgICAgaW50IG1heE9jY3VycyA9IEZyYWdtZW50Q29uc3RhbnRzLkRFRkFVTFRfTUFYX09DQ1VSUzsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBlbGVtZW50LmdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAoY29uY3JldGVDb21wb25lbnQgIT0gbnVsbCAmJiBjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSB7Ci0gICAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpY29uY3JldGVDb21wb25lbnQ7Ci0gICAgICAgICAgaWYgKHBhcnRpY2xlLmlzU2V0TWluT2NjdXJzKCkpCi0gICAgICAgICAgICBtaW5PY2N1cnMgPSBwYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICBpZiAocGFydGljbGUuaXNTZXRNYXhPY2N1cnMoKSkKLSAgICAgICAgICAgIG1heE9jY3VycyA9IHBhcnRpY2xlLmdldE1heE9jY3VycygpOwotICAgICAgICB9Ci0gICAgICAgIGNvbmZpZy5zZXRNaW5PY2N1cnMobWluT2NjdXJzKTsKLSAgICAgICAgY29uZmlnLnNldE1heE9jY3VycyhtYXhPY2N1cnMpOwotICAgICAgICBJWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnID0gbmV3IFhTREVsZW1lbnRGcmFnbWVudChpZCwgcmVzb2x2ZWRFbGVtZW50LmdldE5hbWUoKSwgY29uZmlnKTsKLSAgICAgICAgZWxlbWVudEZyYWcuc2V0WFNEVHlwZURlZmluaXRpb24odHlwZURlZik7Ci0gICAgICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGVsZW1lbnRUeXBlQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGVsZW1lbnRUeXBlQ29uZmlnLnNldFhTRENvbXBvbmVudCh0eXBlRGVmKTsKLSAgICAgICAgZWxlbWVudFR5cGVDb25maWcuc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7Ci0gICAgICAgIGVsZW1lbnRUeXBlQ29uZmlnLnNldE1heE9jY3VycyhtYXhPY2N1cnMpOwotICAgICAgICBlbGVtZW50VHlwZUNvbmZpZy5zZXRTdHlsZShjb25maWcuZ2V0U3R5bGUoKSk7Ci0gICAgICAgIGVsZW1lbnRUeXBlQ29uZmlnLnNldFBhcnRFbmNvZGluZyhjb25maWcuZ2V0UGFydEVuY29kaW5nKCkpOwotICAgICAgICBlbGVtZW50VHlwZUNvbmZpZy5zZXRXU0RMUGFydE5hbWUoY29uZmlnLmdldFdTRExQYXJ0TmFtZSgpKTsKLSAgICAgICAgSVhTREZyYWdtZW50IHhzZEZyYWdtZW50ID0gZ2V0Q29udHJvbGxlcigpLmdldEZyYWdtZW50KGVsZW1lbnRUeXBlQ29uZmlnLCBlbGVtZW50RnJhZy5nZW5JRCgpLCByZXNvbHZlZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgZWxlbWVudEZyYWcuc2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KHhzZEZyYWdtZW50KTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRGcmFnOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzb2x2ZVhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkgewotICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgaWYgKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXNvbHZlZEVsZW1lbnQgPSBlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICBpZiAoIWlzQ29tcG9uZW50UmVzb2x2YWJsZShyZXNvbHZlZEVsZW1lbnQpKQotICAgICAgewotICAgICAgICBYU0RDb21wb25lbnQgcmVzb2x2ZWRDb21wb25lbnQgPSBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKS5yZXNvbHZlWFNETmFtZWRDb21wb25lbnQocmVzb2x2ZWRFbGVtZW50KTsKLSAgICAgICAgaWYgKHJlc29sdmVkQ29tcG9uZW50ICE9IG51bGwgJiYgKHJlc29sdmVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSkKLSAgICAgICAgICByZXNvbHZlZEVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKXJlc29sdmVkQ29tcG9uZW50OwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc29sdmVkRWxlbWVudDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gcmVzb2x2ZVhTRFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYpIHsKLQkgIAotCSAgaWYgKCFpc0NvbXBvbmVudFJlc29sdmFibGUodHlwZURlZikpIHsKLQkJICBYU0RDb21wb25lbnQgcmVzb2x2ZWRDb21wb25lbnQgPSBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKS5yZXNvbHZlWFNETmFtZWRDb21wb25lbnQodHlwZURlZik7Ci0JCSAgaWYgKHJlc29sdmVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0JCQkgIHJldHVybiAoWFNEVHlwZURlZmluaXRpb24pIHJlc29sdmVkQ29tcG9uZW50OwotCSAgfQotCSAgCi0JICByZXR1cm4gdHlwZURlZjsKLSAgfQotCi0gIHByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZURlZmluaXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpIHsKLSAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgIGlmIChlbGVtZW50LmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBlbGVtZW50LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgLy8gcG9ydCB0byBvcmcuZWNsaXBzZS54c2QKLSAgICBlbHNlIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RMaXRlcmFsWE1MRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RMaXRlcmFsWE1MRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2N2VhOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNETGl0ZXJhbFhNTEVuY29kaW5nVG9GcmFnbWVudE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnhzZC5XU0RMUGFydHNUb1hTRFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RMaXRlcmFsWE1MRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyIGV4dGVuZHMgWFNEVG9GcmFnbWVudE1hcHBlciB7Ci0gIHByaXZhdGUgWFNEU2ltcGxlVHlwZVRvRnJhZ21lbnRNYXBwZXIgeHNkU2ltcGxlTWFwcGVyXzsKLSAgcHJpdmF0ZSBYU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIgeHNkQ29tcGxleE1hcHBlcl87Ci0gIHByaXZhdGUgWFNERWxlbWVudERlY2xhcmF0aW9uVG9GcmFnbWVudE1hcHBlciB4c2RFbGVtZW50TWFwcGVyXzsKLSAgcHJpdmF0ZSBYU0RBdHRyaWJ1dGVVc2VUb0ZyYWdtZW50TWFwcGVyIHhzZEF0dHJpYnV0ZU1hcHBlcl87Ci0gIHByaXZhdGUgWFNEUGFydGljbGVUb0ZyYWdtZW50TWFwcGVyIHhzZFBhcnRpY2xlTWFwcGVyXzsKLQotICBwdWJsaWMgWFNETGl0ZXJhbFhNTEVuY29kaW5nVG9GcmFnbWVudE1hcHBlcihYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIgd3NkbFRvWFNETWFwcGVyKSB7Ci0gICAgc3VwZXIoY29udHJvbGxlciwgd3NkbFRvWFNETWFwcGVyKTsKLSAgICB4c2RTaW1wbGVNYXBwZXJfID0gbnVsbDsKLSAgICB4c2RDb21wbGV4TWFwcGVyXyA9IG51bGw7Ci0gICAgeHNkRWxlbWVudE1hcHBlcl8gPSBudWxsOwotICAgIHhzZEF0dHJpYnV0ZU1hcHBlcl8gPSBudWxsOwotICAgIHhzZFBhcnRpY2xlTWFwcGVyXz0gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgWFNEU2ltcGxlVHlwZVRvRnJhZ21lbnRNYXBwZXIgZ2V0WFNEU2ltcGxlTWFwcGVyKCkgewotICAgIGlmICh4c2RTaW1wbGVNYXBwZXJfID09IG51bGwpCi0gICAgICB4c2RTaW1wbGVNYXBwZXJfID0gbmV3IFhTRFNpbXBsZVR5cGVUb0ZyYWdtZW50TWFwcGVyKGdldENvbnRyb2xsZXIoKSwgZ2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkpOwotICAgIHJldHVybiB4c2RTaW1wbGVNYXBwZXJfOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIgZ2V0WFNEQ29tcGxleE1hcHBlcigpIHsKLSAgICBpZiAoeHNkQ29tcGxleE1hcHBlcl8gPT0gbnVsbCkKLSAgICAgIHhzZENvbXBsZXhNYXBwZXJfID0gbmV3IFhTRENvbXBsZXhUeXBlVG9GcmFnbWVudE1hcHBlcihnZXRDb250cm9sbGVyKCksIGdldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcigpKTsKLSAgICByZXR1cm4geHNkQ29tcGxleE1hcHBlcl87Ci0gIH0KLQotICBwcml2YXRlIFhTREVsZW1lbnREZWNsYXJhdGlvblRvRnJhZ21lbnRNYXBwZXIgZ2V0WFNERWxlbWVudE1hcHBlcigpIHsKLSAgICBpZiAoeHNkRWxlbWVudE1hcHBlcl8gPT0gbnVsbCkKLSAgICAgIHhzZEVsZW1lbnRNYXBwZXJfID0gbmV3IFhTREVsZW1lbnREZWNsYXJhdGlvblRvRnJhZ21lbnRNYXBwZXIoZ2V0Q29udHJvbGxlcigpLCBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKSk7Ci0gICAgcmV0dXJuIHhzZEVsZW1lbnRNYXBwZXJfOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RBdHRyaWJ1dGVVc2VUb0ZyYWdtZW50TWFwcGVyIGdldFhTREF0dHJpYnV0ZU1hcHBlcigpIHsKLSAgICBpZiAoeHNkQXR0cmlidXRlTWFwcGVyXyA9PSBudWxsKQotICAgICAgeHNkQXR0cmlidXRlTWFwcGVyXyA9IG5ldyBYU0RBdHRyaWJ1dGVVc2VUb0ZyYWdtZW50TWFwcGVyKGdldENvbnRyb2xsZXIoKSwgZ2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkpOwotICAgIHJldHVybiB4c2RBdHRyaWJ1dGVNYXBwZXJfOwotICB9Ci0gIAotICBwcml2YXRlIFhTRFBhcnRpY2xlVG9GcmFnbWVudE1hcHBlciBnZXRYU0RQYXJ0aWNsZU1hcHBlcigpIHsKLSAgICBpZiAoeHNkUGFydGljbGVNYXBwZXJfID09IG51bGwpCi0gICAgICB4c2RQYXJ0aWNsZU1hcHBlcl8gPSBuZXcgWFNEUGFydGljbGVUb0ZyYWdtZW50TWFwcGVyKGdldENvbnRyb2xsZXIoKSwgZ2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkpOwotICAgIHJldHVybiB4c2RQYXJ0aWNsZU1hcHBlcl87Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldEZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIGNvbmZpZyA9IHJlc29sdmVYU0RDb21wb25lbnQoY29uZmlnKTsKLSAgICBYU0RDb21wb25lbnQgY29tcG9uZW50ID0gY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmICghaXNDb21wb25lbnRSZXNvbHZhYmxlKGNvbXBvbmVudCkpCi0gICAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHJldHVybiBnZXRYU0RFbGVtZW50TWFwcGVyKCkuZ2V0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICByZXR1cm4gZ2V0WFNEU2ltcGxlTWFwcGVyKCkuZ2V0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgcmV0dXJuIGdldFhTRENvbXBsZXhNYXBwZXIoKS5nZXRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHJldHVybiBnZXRYU0RQYXJ0aWNsZU1hcHBlcigpLmdldEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICAgIHJldHVybiBnZXRYU0RQYXJ0aWNsZU1hcHBlcigpLmdldEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVNYXBwZXIoKS5nZXRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsJCi0gICAgZWxzZQotICAgICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEUGFydGljbGVUb0ZyYWdtZW50TWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RQYXJ0aWNsZVRvRnJhZ21lbnRNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0NTc5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RQYXJ0aWNsZVRvRnJhZ21lbnRNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNER3JvdXBBbGxGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLlhTREdyb3VwQ2hvaWNlRml4RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5YU0RHcm91cENob2ljZVJhbmdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5YU0RHcm91cFNlcUZpeEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNER3JvdXBTZXFSYW5nZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnhzZC5XU0RMUGFydHNUb1hTRFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotCi1wdWJsaWMgY2xhc3MgWFNEUGFydGljbGVUb0ZyYWdtZW50TWFwcGVyIGV4dGVuZHMgWFNEVG9GcmFnbWVudE1hcHBlciB7Ci0gIHB1YmxpYyBYU0RQYXJ0aWNsZVRvRnJhZ21lbnRNYXBwZXIoWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIHdzZGxUb1hTRE1hcHBlcikgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsIHdzZGxUb1hTRE1hcHBlcik7Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldEZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIFhTRENvbXBvbmVudCBjb21wb25lbnQgPSBjb25maWcuZ2V0WFNEQ29tcG9uZW50KCk7Ci0gICAgWFNEUGFydGljbGVDb250ZW50IHhzZFBhcnRpY2xlQ29udGVudDsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB4c2RQYXJ0aWNsZUNvbnRlbnQgPSAoKFhTRFBhcnRpY2xlKWNvbXBvbmVudCkuZ2V0Q29udGVudCgpOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICAgIHhzZFBhcnRpY2xlQ29udGVudCA9IChYU0RQYXJ0aWNsZUNvbnRlbnQpY29tcG9uZW50OwotICAgIGVsc2UKLSAgICAgIHhzZFBhcnRpY2xlQ29udGVudCA9IG51bGw7Ci0gICAgaWYgKHhzZFBhcnRpY2xlQ29udGVudCAhPSBudWxsKSB7Ci0gICAgICBpZiAoeHNkUGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHJldHVybiBnZXRYU0RNb2RlbEdyb3VwRGVmRnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSwgKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXhzZFBhcnRpY2xlQ29udGVudCk7Ci0gICAgICBlbHNlIGlmICh4c2RQYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICByZXR1cm4gZ2V0WFNETW9kZWxHcm91cEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUsIChYU0RNb2RlbEdyb3VwKXhzZFBhcnRpY2xlQ29udGVudCk7Ci0gICAgICBlbHNlIGlmICh4c2RQYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgICAgcmV0dXJuIGdldFhTRFdpbGRjYXJkRnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSwgKFhTRFdpbGRjYXJkKXhzZFBhcnRpY2xlQ29udGVudCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBnZXRYU0REZWZhdWx0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRYU0REZWZhdWx0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIElYU0RGcmFnbWVudCBnZXRYU0RNb2RlbEdyb3VwRGVmRnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmKSB7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gcmVzb2x2ZWRYU0RNb2RlbEdyb3VwRGVmID0geHNkTW9kZWxHcm91cERlZjsKLSAgICBpZiAoeHNkTW9kZWxHcm91cERlZi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICByZXNvbHZlZFhTRE1vZGVsR3JvdXBEZWYgPSB4c2RNb2RlbEdyb3VwRGVmLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSByZXNvbHZlZFhTRE1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpOwotICAgIGlmICh4c2RNb2RlbEdyb3VwID09IG51bGwpCi0gICAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRYU0RNb2RlbEdyb3VwRnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSwgeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwcml2YXRlIElYU0RGcmFnbWVudCBnZXRYU0RNb2RlbEdyb3VwRnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApIHsKLSAgICBpbnQgbWluT2NjdXJzID0gRnJhZ21lbnRDb25zdGFudHMuREVGQVVMVF9NSU5fT0NDVVJTOwotICAgIGludCBtYXhPY2N1cnMgPSBGcmFnbWVudENvbnN0YW50cy5ERUZBVUxUX01BWF9PQ0NVUlM7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSB4c2RNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpOwotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsICYmIGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpIHsKLSAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKWNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgaWYgKHBhcnRpY2xlLmlzU2V0TWluT2NjdXJzKCkpCi0gICAgICAgIG1pbk9jY3VycyA9IHBhcnRpY2xlLmdldE1pbk9jY3VycygpOwotICAgICAgaWYgKHBhcnRpY2xlLmlzU2V0TWF4T2NjdXJzKCkpCi0gICAgICAgIG1heE9jY3VycyA9IHBhcnRpY2xlLmdldE1heE9jY3VycygpOwotICAgIH0KLSAgICBjb25maWcuc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7Ci0gICAgY29uZmlnLnNldE1heE9jY3VycyhtYXhPY2N1cnMpOwotICAgIAotICAgIHN3aXRjaCAoeHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkuZ2V0VmFsdWUoKSkgewotICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLlNFUVVFTkNFOiAKLSAgICAgICAgaWYgKG1pbk9jY3VycyA9PSBtYXhPY2N1cnMpCi0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RHcm91cFNlcUZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSwgeHNkTW9kZWxHcm91cCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gbmV3IFhTREdyb3VwU2VxUmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCksIHhzZE1vZGVsR3JvdXApOwotICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkNIT0lDRToKLSAgICAgICAgaWYgKG1pbk9jY3VycyA9PSBtYXhPY2N1cnMpCi0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RHcm91cENob2ljZUZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSwgeHNkTW9kZWxHcm91cCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gbmV3IFhTREdyb3VwQ2hvaWNlUmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCksIHhzZE1vZGVsR3JvdXApOwotICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkFMTDoKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RHcm91cEFsbEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSwgeHNkTW9kZWxHcm91cCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgSVhTREZyYWdtZW50IGdldFhTRFdpbGRjYXJkRnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RXaWxkY2FyZCB4c2RQYXJ0aWNsZUNvbnRlbnQpIHsKLSAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RTT0FQRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RTT0FQRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYWZhY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEU09BUEVuY29kaW5nVG9GcmFnbWVudE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuU09BUEVuY0FycmF5Rml4RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5TT0FQRW5jQXJyYXlSYW5nZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuWFNEVHlwZURlZmluaXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnhzZC5XU0RMUGFydHNUb1hTRFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRFNPQVBFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIgZXh0ZW5kcyBYU0RUb0ZyYWdtZW50TWFwcGVyIHsKLSAgcHJpdmF0ZSBYU0RMaXRlcmFsWE1MRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyIHhzZExpdGVyYWxNYXBwZXJfOwotICBwcml2YXRlIFhTRENvbXBsZXhUeXBlVG9GcmFnbWVudE1hcHBlciB4c2RDb21wbGV4TWFwcGVyXzsKLQotICBwdWJsaWMgWFNEU09BUEVuY29kaW5nVG9GcmFnbWVudE1hcHBlcihYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIgd3NkbFRvWFNETWFwcGVyKSB7Ci0gICAgc3VwZXIoY29udHJvbGxlciwgd3NkbFRvWFNETWFwcGVyKTsKLSAgICB4c2RMaXRlcmFsTWFwcGVyXyA9IG51bGw7Ci0gICAgeHNkQ29tcGxleE1hcHBlcl8gPSBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RMaXRlcmFsWE1MRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyIGdldFhTRExpdGVyYWxNYXBwZXIoKSB7Ci0gICAgaWYgKHhzZExpdGVyYWxNYXBwZXJfID09IG51bGwpCi0gICAgICB4c2RMaXRlcmFsTWFwcGVyXyA9IG5ldyBYU0RMaXRlcmFsWE1MRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyKGdldENvbnRyb2xsZXIoKSwgZ2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkpOwotICAgIHJldHVybiB4c2RMaXRlcmFsTWFwcGVyXzsKLSAgfQotCi0gIHByaXZhdGUgWFNEQ29tcGxleFR5cGVUb0ZyYWdtZW50TWFwcGVyIGdldFhTRENvbXBsZXhNYXBwZXIoKSB7Ci0gICAgaWYgKHhzZENvbXBsZXhNYXBwZXJfID09IG51bGwpCi0gICAgICB4c2RDb21wbGV4TWFwcGVyXyA9IG5ldyBYU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIoZ2V0Q29udHJvbGxlcigpLCBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKSk7Ci0gICAgIHJldHVybiB4c2RDb21wbGV4TWFwcGVyXzsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnQgZ2V0RnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgaWYgKGNvbmZpZy5nZXRJc1dTRExQYXJ0KCkpIHsKLSAgICAgIElTT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQgd3JhcHBlckZyYWdtZW50ID0gbmV3IFNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudChpZCwgbmFtZSwgbnVsbCk7Ci0gICAgICBTdHJpbmcgZGVsZWdhdGlvbkZyYWdJZCA9IHdyYXBwZXJGcmFnbWVudC5nZW5JRCgpOwotICAgICAgSVhTREZyYWdtZW50IGRlbGVnYXRpb25GcmFnbWVudCA9IGdldEZyYWdtZW50RGVsZWdhdGUoY29uZmlnLCBkZWxlZ2F0aW9uRnJhZ0lkLCBuYW1lKTsKLSAgICAgIHdyYXBwZXJGcmFnbWVudC5zZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoZGVsZWdhdGlvbkZyYWdtZW50KTsKLSAgICAgIGdldENvbnRyb2xsZXIoKS5hZGRUb0NhY2hlKGRlbGVnYXRpb25GcmFnSWQsIGRlbGVnYXRpb25GcmFnbWVudCk7Ci0gICAgICByZXR1cm4gd3JhcHBlckZyYWdtZW50OwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZ2V0RnJhZ21lbnREZWxlZ2F0ZShjb25maWcsIGlkLCBuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnQgZ2V0RnJhZ21lbnREZWxlZ2F0ZShYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBjb25maWcgPSByZXNvbHZlWFNEQ29tcG9uZW50KGNvbmZpZyk7Ci0gICAgWFNEQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBpZiAoIWlzQ29tcG9uZW50UmVzb2x2YWJsZShjb21wb25lbnQpKQotICAgICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pY29tcG9uZW50OwotICAgICAgaWYgKFhTRFR5cGVEZWZpbml0aW9uVXRpbC5pc1NvYXBFbmNBcnJheShjb21wbGV4VHlwZSkpCi0gICAgICAgIHJldHVybiBnZXRTT0FQRW5jQXJyYXlGcmFnbWVudChjb25maWcsIGlkLCBuYW1lLCBjb21wbGV4VHlwZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBnZXRYU0RDb21wbGV4TWFwcGVyKCkuZ2V0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRYU0RMaXRlcmFsTWFwcGVyKCkuZ2V0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIElYU0RGcmFnbWVudCBnZXRTT0FQRW5jQXJyYXlGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSkgewotICAgIEVMaXN0IHhzZEF0dHJDb250ZW50cyA9IGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RBdHRyQ29udGVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIFN0cmluZyBzb2FwRW5jQXJyYXlUeXBlTmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgIFN0cmluZyBzb2FwRW5jQXJyYXlUeXBlTG9jYWxOYW1lID0gbnVsbDsKLSAgICAgIGludCBzb2FwRW5jQXJyYXlEaW1lbnNpb24gPSAwOwotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IHhzZEF0dHJDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCl4c2RBdHRyQ29udGVudHMuZ2V0KGkpOwotICAgICAgRWxlbWVudCBlbGVtZW50ID0geHNkQXR0ckNvbnRlbnQuZ2V0RWxlbWVudCgpOwotICAgICAgU3RyaW5nIGFycmF5VHlwZUF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5TKEZyYWdtZW50Q29uc3RhbnRzLlVSSV9XU0RMLCBGcmFnbWVudENvbnN0YW50cy5RTkFNRV9MT0NBTF9OQU1FX0FSUkFZX1RZUEUpOwotICAgICAgaWYgKGFycmF5VHlwZUF0dHIgIT0gbnVsbCAmJiBhcnJheVR5cGVBdHRyLmxlbmd0aCgpID4gMCkgewotICAgICAgICBpbnQgY29sb24gPSBhcnJheVR5cGVBdHRyLmluZGV4T2YoRnJhZ21lbnRDb25zdGFudHMuQ09MT04pOwotICAgICAgICBTdHJpbmcgbnNQcmVmaXggPSAoY29sb24gPiAwKSA/IGFycmF5VHlwZUF0dHIuc3Vic3RyaW5nKDAsIGNvbG9uKSA6IG51bGw7Ci0gICAgICAgIHNvYXBFbmNBcnJheVR5cGVOYW1lc3BhY2VVUkkgPSAoU3RyaW5nKXhzZEF0dHJDb250ZW50LmdldFNjaGVtYSgpLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKS5nZXQobnNQcmVmaXgpOwotICAgICAgICBpbnQgZGltZW5zaW9uSW5kZXggPSBhcnJheVR5cGVBdHRyLmluZGV4T2YoRnJhZ21lbnRDb25zdGFudHMuTEVGVF9TUVVBUkVfQlJBQ0tFVCk7Ci0gICAgICAgIHNvYXBFbmNBcnJheVR5cGVMb2NhbE5hbWUgPSBhcnJheVR5cGVBdHRyLnN1YnN0cmluZyhjb2xvbiArIDEsIGRpbWVuc2lvbkluZGV4KTsKLSAgICAgICAgU3RyaW5nIGRpbWVuc2lvblN0cmluZyA9IGFycmF5VHlwZUF0dHIuc3Vic3RyaW5nKGRpbWVuc2lvbkluZGV4LCBhcnJheVR5cGVBdHRyLmxlbmd0aCgpKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaW1lbnNpb25TdHJpbmcubGVuZ3RoKCkgLSAxOyBqKyspIHsKLSAgICAgICAgICBpZiAoZGltZW5zaW9uU3RyaW5nLmNoYXJBdChqKSA9PSBGcmFnbWVudENvbnN0YW50cy5MRUZUX1NRVUFSRV9CUkFDS0VULmNoYXJBdCgwKSAmJiBkaW1lbnNpb25TdHJpbmcuY2hhckF0KGogKyAxKSA9PSBGcmFnbWVudENvbnN0YW50cy5SSUdIVF9TUVVBUkVfQlJBQ0tFVC5jaGFyQXQoMCkpIHsKLSAgICAgICAgICAgIHNvYXBFbmNBcnJheURpbWVuc2lvbisrOwotICAgICAgICAgICAgaisrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBFbmNBcnJheURpbWVuc2lvbiA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzb2FwRW5jQXJyYXlUeXBlTmFtZXNwYWNlVVJJICE9IG51bGwgJiYgc29hcEVuY0FycmF5VHlwZUxvY2FsTmFtZSAhPSBudWxsICYmIHNvYXBFbmNBcnJheURpbWVuc2lvbiA9PSAxKSB7Ci0gICAgICAgIFhTRENvbXBvbmVudCBzb2FwRW5jQXJyYXlUeXBlID0gZ2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkuZ2V0WFNEVHlwZUZyb21TY2hlbWEoc29hcEVuY0FycmF5VHlwZU5hbWVzcGFjZVVSSSwgc29hcEVuY0FycmF5VHlwZUxvY2FsTmFtZSwgZmFsc2UpOwotICAgICAgICBpZiAoc29hcEVuY0FycmF5VHlwZSAhPSBudWxsICYmIHNvYXBFbmNBcnJheVR5cGUgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgIFhTRE1vZGVsR3JvdXAgc2VxdWVuY2UgPSBudWxsOwotICAgICAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4VHlwZUNvbnRlbnQgPSBYU0RUeXBlRGVmaW5pdGlvblV0aWwuZ2V0WFNEQ29tcGxleFR5cGVDb250ZW50KGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICBpZiAoY29tcGxleFR5cGVDb250ZW50ICE9IG51bGwgJiYgKGNvbXBsZXhUeXBlQ29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSkgewotICAgICAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHhzZFBhcnRpY2xlQ29udGVudCA9ICgoWFNEUGFydGljbGUpY29tcGxleFR5cGVDb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICBpZiAoeHNkUGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgICAgICAgc2VxdWVuY2UgPSAoWFNETW9kZWxHcm91cCl4c2RQYXJ0aWNsZUNvbnRlbnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIElTT0FQRW5jQXJyYXlGcmFnbWVudCBmcmFnOwotICAgICAgICAgIGlmIChjb25maWcuZ2V0TWluT2NjdXJzKCkgPT0gY29uZmlnLmdldE1heE9jY3VycygpKQotICAgICAgICAgICAgZnJhZyA9IG5ldyBTT0FQRW5jQXJyYXlGaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCksIHNlcXVlbmNlKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcmFnID0gbmV3IFNPQVBFbmNBcnJheVJhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgZ2V0Q29udHJvbGxlcigpLCBzZXF1ZW5jZSk7Ci0gICAgICAgICAgZnJhZy5zZXRYU0RUeXBlRGVmaW5pdGlvbigoWFNEVHlwZURlZmluaXRpb24pc29hcEVuY0FycmF5VHlwZSk7Ci0gICAgICAgICAgcmV0dXJuIGZyYWc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGdldFhTRENvbXBsZXhNYXBwZXIoKS5nZXRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVHlwZVRvRnJhZ21lbnRNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVR5cGVUb0ZyYWdtZW50TWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MjQ4OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVHlwZVRvRnJhZ21lbnRNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLlhTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5YU0RTaW1wbGVBdG9taWNEYXRlVGltZVJhbmdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5YU0RTaW1wbGVBdG9taWNFbnVtRml4RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5YU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLlhTRFNpbXBsZUF0b21pY0ZpeEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5YU0RTaW1wbGVBdG9taWNSYW5nZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNEU2ltcGxlTGlzdEZpeEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNEU2ltcGxlTGlzdFJhbmdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC5YU0RTaW1wbGVVbmlvbkZpeEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNEU2ltcGxlVW5pb25SYW5nZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuT3B0aW9uVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuWFNEVHlwZURlZmluaXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnhzZC5XU0RMUGFydHNUb1hTRFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RWYXJpZXR5OwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZVRvRnJhZ21lbnRNYXBwZXIgZXh0ZW5kcyBYU0RUb0ZyYWdtZW50TWFwcGVyIHsKLSAgcHVibGljIFhTRFNpbXBsZVR5cGVUb0ZyYWdtZW50TWFwcGVyKFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyLCB3c2RsVG9YU0RNYXBwZXIpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBpZiAoc2ltcGxlVHlwZSAhPSBudWxsICYmIHNpbXBsZVR5cGUuZ2V0VmFyaWV0eSgpICE9IG51bGwpIHsKLSAgICAgIHN3aXRjaCAoc2ltcGxlVHlwZS5nZXRWYXJpZXR5KCkuZ2V0VmFsdWUoKSkgewotICAgICAgICBjYXNlIFhTRFZhcmlldHkuQVRPTUlDOgotICAgICAgICAgIHJldHVybiBnZXRYU0RTaW1wbGVBdG9taWNGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICAgICAgY2FzZSBYU0RWYXJpZXR5LkxJU1Q6Ci0gICAgICAgICAgcmV0dXJuIGdldFhTRFNpbXBsZUxpc3RGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICAgICAgY2FzZSBYU0RWYXJpZXR5LlVOSU9OOgotICAgICAgICAgIHJldHVybiBnZXRYU0RTaW1wbGVVbmlvbkZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBnZXRYU0REZWZhdWx0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRYU0REZWZhdWx0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIElYU0RGcmFnbWVudCBnZXRYU0RTaW1wbGVBdG9taWNGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBib29sZWFuIGlzRml4ZWQgPSAoKGNvbmZpZy5nZXRNaW5PY2N1cnMoKSA9PSBjb25maWcuZ2V0TWF4T2NjdXJzKCkpICYmIGNvbmZpZy5nZXRNYXhPY2N1cnMoKSAhPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQpOwotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZEJhc2VTaW1wbGVUeXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKVhTRFR5cGVEZWZpbml0aW9uVXRpbC5yZXNvbHZlVG9YU0RCdWlsdEluVHlwZURlZmluaXRpb24oeHNkU2ltcGxlVHlwZURlZik7Ci0gICAgU3RyaW5nIGJhc2VTaW1wbGVUeXBlRGVmTlMgPSBudWxsOwotICAgIFN0cmluZyBiYXNlU2ltcGxlVHlwZURlZk5hbWUgPSBudWxsOwotICAgIGlmICh4c2RCYXNlU2ltcGxlVHlwZURlZiAhPSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VTaW1wbGVUeXBlRGVmTlMgPSB4c2RCYXNlU2ltcGxlVHlwZURlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIGJhc2VTaW1wbGVUeXBlRGVmTmFtZSA9IHhzZEJhc2VTaW1wbGVUeXBlRGVmLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgYm9vbGVhbiBpc0VudW0gPSBpc1NpbXBsZVR5cGVFbnVtZXJhdGlvbih4c2RTaW1wbGVUeXBlRGVmKTsKLSAgICBpZiAoRnJhZ21lbnRDb25zdGFudHMuVVJJX1hTRC5lcXVhbHMoYmFzZVNpbXBsZVR5cGVEZWZOUykpCi0gICAgewotICAgICAgaWYgKGJhc2VTaW1wbGVUeXBlRGVmTmFtZS5lcXVhbHMoImRhdGUiKSkKLSAgICAgICAgcmV0dXJuIGdldFhTRFNpbXBsZURhdGVUaW1lRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURSx4c2RTaW1wbGVUeXBlRGVmLGlzRW51bSxpc0ZpeGVkKTsKLSAgICAgIGVsc2UgaWYgKGJhc2VTaW1wbGVUeXBlRGVmTmFtZS5lcXVhbHMoImRhdGVUaW1lIikpCi0gICAgICAgIHJldHVybiBnZXRYU0RTaW1wbGVEYXRlVGltZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0RBVEVUSU1FLHhzZFNpbXBsZVR5cGVEZWYsaXNFbnVtLGlzRml4ZWQpOwotICAgICAgZWxzZSBpZiAoYmFzZVNpbXBsZVR5cGVEZWZOYW1lLmVxdWFscygiZ1llYXJNb250aCIpKQotICAgICAgICByZXR1cm4gZ2V0WFNEU2ltcGxlRGF0ZVRpbWVGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9HWUVBUk1PTlRILHhzZFNpbXBsZVR5cGVEZWYsaXNFbnVtLGlzRml4ZWQpOwotICAgICAgZWxzZSBpZiAoYmFzZVNpbXBsZVR5cGVEZWZOYW1lLmVxdWFscygiZ01vbnRoRGF5IikpCi0gICAgICAgIHJldHVybiBnZXRYU0RTaW1wbGVEYXRlVGltZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dNT05USERBWSx4c2RTaW1wbGVUeXBlRGVmLGlzRW51bSxpc0ZpeGVkKTsKLSAgICAgIGVsc2UgaWYgKGJhc2VTaW1wbGVUeXBlRGVmTmFtZS5lcXVhbHMoImdEYXkiKSkKLSAgICAgICAgcmV0dXJuIGdldFhTRFNpbXBsZUdEYXlGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCB4c2RTaW1wbGVUeXBlRGVmLGlzRW51bSxpc0ZpeGVkKTsgICAgICAgIAotICAgICAgZWxzZSBpZiAoYmFzZVNpbXBsZVR5cGVEZWZOYW1lLmVxdWFscygiYm9vbGVhbiIpKQotICAgICAgICByZXR1cm4gZ2V0WFNEU2ltcGxlQm9vbGVhbkZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIHhzZFNpbXBsZVR5cGVEZWYsaXNFbnVtLGlzRml4ZWQpOwotICAgIH0KLQotICAgIGlmIChpc0VudW0pCi0gICAgewotICAgICAgaWYgKGlzRml4ZWQpCi0gICAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRW51bUZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIHhzZFNpbXBsZVR5cGVEZWYuZ2V0RW51bWVyYXRpb25GYWNldHMoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgeHNkU2ltcGxlVHlwZURlZi5nZXRFbnVtZXJhdGlvbkZhY2V0cygpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc0ZpeGVkKQotICAgICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUF0b21pY0ZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUF0b21pY1JhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBYU0RTaW1wbGVBdG9taWNGcmFnbWVudCBnZXRYU0RTaW1wbGVEYXRlVGltZUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IGNhbGVuZGFyVHlwZSxYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2REYXRlVGltZVR5cGUsYm9vbGVhbiBpc0VudW0sYm9vbGVhbiBpc0ZpeGVkKQotICB7Ci0gICAgaWYgKGlzRW51bSkKLSAgICB7Ci0gICAgICBpZiAoaXNGaXhlZCkKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVBdG9taWNFbnVtRml4RnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgeHNkRGF0ZVRpbWVUeXBlLmdldEVudW1lcmF0aW9uRmFjZXRzKCkpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUF0b21pY0VudW1SYW5nZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIHhzZERhdGVUaW1lVHlwZS5nZXRFbnVtZXJhdGlvbkZhY2V0cygpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc0ZpeGVkKQotICAgICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4RnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgY2FsZW5kYXJUeXBlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVBdG9taWNEYXRlVGltZVJhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgY2FsZW5kYXJUeXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQgZ2V0WFNEU2ltcGxlR0RheUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkRGF0ZVRpbWVUeXBlLGJvb2xlYW4gaXNFbnVtLGJvb2xlYW4gaXNGaXhlZCkKLSAgewotICAgIGlmIChpc0VudW0pCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBPcHRpb25WZWN0b3Igb3B0aW9uVmVjdG9yID0gbmV3IE9wdGlvblZlY3RvcigpOwotICAgIFN0cmluZ0J1ZmZlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpPTE7aTw9MzE7aSsrKQotICAgIHsKLSAgICAgIHZhbHVlLnNldExlbmd0aCgwKTsKLSAgICAgIHZhbHVlLmFwcGVuZCgiLS0tIik7Ci0gICAgICBpZiAoaTwxMCkKLSAgICAgICAgdmFsdWUuYXBwZW5kKDApOwotICAgICAgdmFsdWUuYXBwZW5kKGkpOwotICAgICAgb3B0aW9uVmVjdG9yLmFkZE9wdGlvbihTdHJpbmcudmFsdWVPZihpKSx2YWx1ZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKGlzRml4ZWQpCi0gICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBvcHRpb25WZWN0b3IpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgb3B0aW9uVmVjdG9yKTsKLSAgfQotCi0gIHByaXZhdGUgWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQgZ2V0WFNEU2ltcGxlQm9vbGVhbkZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkQm9vbGVhblR5cGUsYm9vbGVhbiBpc0VudW0sYm9vbGVhbiBpc0ZpeGVkKQotICB7Ci0gICAgaWYgKGlzRW51bSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIE9wdGlvblZlY3RvciBvcHRpb25WZWN0b3IgPSBuZXcgT3B0aW9uVmVjdG9yKCk7Ci0gICAgb3B0aW9uVmVjdG9yLmFkZE9wdGlvbigidHJ1ZSIsInRydWUiKTsKLSAgICBvcHRpb25WZWN0b3IuYWRkT3B0aW9uKCJmYWxzZSIsImZhbHNlIik7Ci0gICAgaWYgKGlzRml4ZWQpCi0gICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBvcHRpb25WZWN0b3IpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgb3B0aW9uVmVjdG9yKTsKLSAgfQotCi0gIHByaXZhdGUgSVhTREZyYWdtZW50IGdldFhTRFNpbXBsZUxpc3RGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAKLSAgICBib29sZWFuIGlzRml4ZWQgPSAoKGNvbmZpZy5nZXRNaW5PY2N1cnMoKSA9PSBjb25maWcuZ2V0TWF4T2NjdXJzKCkpICYmIGNvbmZpZy5nZXRNYXhPY2N1cnMoKSAhPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQpOwotICAgIGlmIChpc0ZpeGVkKQotICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVMaXN0Rml4RnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgZ2V0Q29udHJvbGxlcigpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUxpc3RSYW5nZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSk7Ci0gIH0KLQotICBwcml2YXRlIElYU0RGcmFnbWVudCBnZXRYU0RTaW1wbGVVbmlvbkZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIAotICAgIGJvb2xlYW4gaXNGaXhlZCA9ICgoY29uZmlnLmdldE1pbk9jY3VycygpID09IGNvbmZpZy5nZXRNYXhPY2N1cnMoKSkgJiYgY29uZmlnLmdldE1heE9jY3VycygpICE9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCk7Ci0gICAgaWYgKGlzRml4ZWQpCi0gICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZVVuaW9uRml4RnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgZ2V0Q29udHJvbGxlcigpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZVVuaW9uUmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzU2ltcGxlVHlwZUVudW1lcmF0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUpIHsKLSAgICBFTGlzdCBlID0gc2ltcGxlVHlwZS5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgIHJldHVybiAoZSAhPSBudWxsICYmIGUuc2l6ZSgpID4gMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTM3ZGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB7Ci0gIHByaXZhdGUgWFNEQ29tcG9uZW50IGNvbXBvbmVudF87Ci0gIHByaXZhdGUgaW50IG1pbk9jY3Vyc187Ci0gIHByaXZhdGUgaW50IG1heE9jY3Vyc187Ci0gIHByaXZhdGUgaW50IHN0eWxlXzsKLSAgcHJpdmF0ZSBpbnQgcGFydEVuY29kaW5nXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzV1NETFBhcnRfOwotICBwcml2YXRlIFN0cmluZyB3c2RsUGFydE5hbWVfOwotCi0gIHB1YmxpYyBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpIHsKLSAgICBjb21wb25lbnRfID0gbnVsbDsKLSAgICBtaW5PY2N1cnNfID0gRnJhZ21lbnRDb25zdGFudHMuREVGQVVMVF9NSU5fT0NDVVJTOwotICAgIG1heE9jY3Vyc18gPSBGcmFnbWVudENvbnN0YW50cy5ERUZBVUxUX01BWF9PQ0NVUlM7Ci0gICAgc3R5bGVfID0gRnJhZ21lbnRDb25zdGFudHMuU1RZTEVfRE9DVU1FTlQ7Ci0gICAgcGFydEVuY29kaW5nXyA9IEZyYWdtZW50Q29uc3RhbnRzLkVOQ09ESU5HX0xJVEVSQUw7Ci0gICAgaXNXU0RMUGFydF8gPSBmYWxzZTsKLSAgICB3c2RsUGFydE5hbWVfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRENvbXBvbmVudChYU0RDb21wb25lbnQgY29tcG9uZW50KSB7Ci0gICAgY29tcG9uZW50XyA9IGNvbXBvbmVudDsKLSAgfQotCi0gIHB1YmxpYyBYU0RDb21wb25lbnQgZ2V0WFNEQ29tcG9uZW50KCkgewotICAgIHJldHVybiBjb21wb25lbnRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzKGludCBtaW5PY2N1cnMpIHsKLSAgICBtaW5PY2N1cnNfID0gbWluT2NjdXJzOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKSB7Ci0gICAgcmV0dXJuIG1pbk9jY3Vyc187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cnMoaW50IG1heE9jY3VycykgewotICAgIG1heE9jY3Vyc18gPSBtYXhPY2N1cnM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpIHsKLSAgICByZXR1cm4gbWF4T2NjdXJzXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlKSB7Ci0gICAgc3R5bGVfID0gc3R5bGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0gICAgcmV0dXJuIHN0eWxlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBhcnRFbmNvZGluZyhpbnQgcGFydEVuY29kaW5nKSB7Ci0gICAgcGFydEVuY29kaW5nXyA9IHBhcnRFbmNvZGluZzsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0UGFydEVuY29kaW5nKCkgewotICAgIHJldHVybiBwYXJ0RW5jb2RpbmdfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNXU0RMUGFydChib29sZWFuIGlzV1NETFBhcnQpIHsKLSAgICBpc1dTRExQYXJ0XyA9IGlzV1NETFBhcnQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRJc1dTRExQYXJ0KCkgewotICAgIHJldHVybiBpc1dTRExQYXJ0XzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V1NETFBhcnROYW1lKFN0cmluZyB3c2RsUGFydE5hbWUpIHsKLSAgICB3c2RsUGFydE5hbWVfID0gd3NkbFBhcnROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdTRExQYXJ0TmFtZSgpIHsKLSAgICByZXR1cm4gd3NkbFBhcnROYW1lXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEVG9GcmFnbWVudENvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFRvRnJhZ21lbnRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzIzYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEVG9GcmFnbWVudENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyOwotCi1wdWJsaWMgY2xhc3MgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgewotICBwcml2YXRlIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXJfOwotICBwcml2YXRlIFhTRExpdGVyYWxYTUxFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIgeHNkTGl0ZXJhbE1hcHBlcl87Ci0gIHByaXZhdGUgWFNEU09BUEVuY29kaW5nVG9GcmFnbWVudE1hcHBlciB4c2RTb2FwTWFwcGVyXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgeHNkVG9GcmFnbWVudENhY2hlXzsKLQotICBwdWJsaWMgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKSB7Ci0gICAgd3NkbFRvWFNETWFwcGVyXyA9IG51bGw7Ci0gICAgeHNkTGl0ZXJhbE1hcHBlcl8gPSBudWxsOwotICAgIHhzZFNvYXBNYXBwZXJfID0gbnVsbDsKLSAgICB4c2RUb0ZyYWdtZW50Q2FjaGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXIpIHsKLSAgICB3c2RsVG9YU0RNYXBwZXJfID0gd3NkbFRvWFNETWFwcGVyOwotICB9Ci0KLSAgcHVibGljIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKSB7Ci0gICAgcmV0dXJuIHdzZGxUb1hTRE1hcHBlcl87Ci0gIH0KLQotICBwcml2YXRlIFhTRExpdGVyYWxYTUxFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIgZ2V0WFNETGl0ZXJhbE1hcHBlcigpIHsKLSAgICBpZiAoeHNkTGl0ZXJhbE1hcHBlcl8gPT0gbnVsbCkKLSAgICAgIHhzZExpdGVyYWxNYXBwZXJfID0gbmV3IFhTRExpdGVyYWxYTUxFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIodGhpcywgd3NkbFRvWFNETWFwcGVyXyk7Ci0gICAgcmV0dXJuIHhzZExpdGVyYWxNYXBwZXJfOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RTT0FQRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyIGdldFhTRFNPQVBNYXBwZXIoKSB7Ci0gICAgaWYgKHhzZFNvYXBNYXBwZXJfID09IG51bGwpCi0gICAgICB4c2RTb2FwTWFwcGVyXyA9IG5ldyBYU0RTT0FQRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyKHRoaXMsIHdzZGxUb1hTRE1hcHBlcl8pOwotICAgIHJldHVybiB4c2RTb2FwTWFwcGVyXzsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnQgZ2V0RnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgSVhTREZyYWdtZW50IGZyYWcgPSBnZXRDYWNoZWRGcmFnbWVudChpZCk7Ci0gICAgaWYgKGZyYWcgIT0gbnVsbCkKLSAgICAgIHJldHVybiBmcmFnOwotICAgIGZyYWcgPSBnZXROZXdGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICBpZiAoZnJhZyAhPSBudWxsKQotICAgICAgYWRkVG9DYWNoZShpZCwgZnJhZyk7Ci0gICAgcmV0dXJuIGZyYWc7Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldENhY2hlZEZyYWdtZW50KFN0cmluZyBpZCkgewotICAgIHJldHVybiAoSVhTREZyYWdtZW50KXhzZFRvRnJhZ21lbnRDYWNoZV8uZ2V0KGlkKTsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnQgZ2V0TmV3RnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgc3dpdGNoIChjb25maWcuZ2V0UGFydEVuY29kaW5nKCkpCi0gICAgewotICAgICAgY2FzZSBGcmFnbWVudENvbnN0YW50cy5FTkNPRElOR19TT0FQOgotICAgICAgICByZXR1cm4gZ2V0WFNEU09BUE1hcHBlcigpLmdldEZyYWdtZW50KGNvbmZpZyxpZCxuYW1lKTsgICAgICAKLSAgICAgIGNhc2UgRnJhZ21lbnRDb25zdGFudHMuRU5DT0RJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgRnJhZ21lbnRDb25zdGFudHMuRU5DT0RJTkdfVVJMOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGdldFhTRExpdGVyYWxNYXBwZXIoKS5nZXRGcmFnbWVudChjb25maWcsaWQsbmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkVG9DYWNoZShTdHJpbmcgaWQsIElYU0RGcmFnbWVudCBmcmFnKSB7Ci0gICAgeHNkVG9GcmFnbWVudENhY2hlXy5wdXQoaWQsIGZyYWcpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRnJvbUNhY2hlKFN0cmluZyBpZCkgewotICAgIHhzZFRvRnJhZ21lbnRDYWNoZV8ucmVtb3ZlKGlkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVtcHR5Q2FjaGUoKSB7Ci0gICAgeHNkVG9GcmFnbWVudENhY2hlXy5jbGVhcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RUb0ZyYWdtZW50TWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RUb0ZyYWdtZW50TWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmM1OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEVG9GcmFnbWVudE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNERGVmYXVsdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuWFNERW1wdHlGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RUb0ZyYWdtZW50TWFwcGVyIHsKLSAgcHJpdmF0ZSBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyXzsKLSAgcHJpdmF0ZSBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIgd3NkbFRvWFNETWFwcGVyXzsKLQotICBwdWJsaWMgWFNEVG9GcmFnbWVudE1hcHBlcihYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIgd3NkbFRvWFNETWFwcGVyKSB7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgIHdzZGxUb1hTRE1hcHBlcl8gPSB3c2RsVG9YU0RNYXBwZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyKFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7Ci0gIH0KLQotICBwdWJsaWMgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgZ2V0Q29udHJvbGxlcigpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIHdzZGxUb1hTRE1hcHBlcikgewotICAgIHdzZGxUb1hTRE1hcHBlcl8gPSB3c2RsVG9YU0RNYXBwZXI7Ci0gIH0KLQotICBwdWJsaWMgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIGdldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcigpIHsKLSAgICByZXR1cm4gd3NkbFRvWFNETWFwcGVyXzsKLSAgfQotCi0gIHByb3RlY3RlZCBJWFNERnJhZ21lbnQgZ2V0WFNERGVmYXVsdEZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBuZXcgWFNERGVmYXVsdEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElYU0RGcmFnbWVudCBnZXRYU0RFbXB0eUZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBuZXcgWFNERW1wdHlGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnKTsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBJWFNERnJhZ21lbnQgZ2V0RnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKTsKLQotICBwcm90ZWN0ZWQgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gcmVzb2x2ZVhTRENvbXBvbmVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpCi0gIHsKLSAgICBYU0RDb21wb25lbnQgY29tcG9uZW50ID0gY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmICghaXNDb21wb25lbnRSZXNvbHZhYmxlKGNvbXBvbmVudCkgJiYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KSkKLSAgICB7Ci0gICAgICBYU0RDb21wb25lbnQgcmVzb2x2ZWRDb21wb25lbnQgPSBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKS5yZXNvbHZlWFNETmFtZWRDb21wb25lbnQoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXBvbmVudCk7Ci0gICAgICBpZiAocmVzb2x2ZWRDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgY29uZmlnLnNldFhTRENvbXBvbmVudChyZXNvbHZlZENvbXBvbmVudCk7Ci0gICAgfQotICAgIHJldHVybiBjb25maWc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBvbmVudFJlc29sdmFibGUoWFNEQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gY29tcG9uZW50LmdldFNjaGVtYSgpOwotICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3MWUyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JRnJhZ21lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGcmFnbWVudCBpbXBsZW1lbnRzIElGcmFnbWVudCB7Ci0gIHByaXZhdGUgU3RyaW5nIGlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHBhcmFtc187Ci0KLSAgcHVibGljIEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBpZF8gPSBpZDsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gICAgcGFyYW1zXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgewotICAgIGlkXyA9IGlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLSAgICByZXR1cm4gaWRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgIG5hbWVfID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUGFyYW1ldGVyVmFsdWVzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIHsKLSAgICBTdHJpbmdbXSBwYXJhbXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKGdldElEKCkpOwotICAgIHNldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpLCBwYXJhbXMpOwotICAgIHJldHVybiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSwgU3RyaW5nW10gcGFyYW1zKSB7Ci0gICAgaWYgKHBhcmFtcyA9PSBudWxsKQotICAgICAgcGFyYW1zXy5yZW1vdmUocGFyYW1LZXkpOwotICAgIGVsc2UKLSAgICAgIHBhcmFtc18ucHV0KHBhcmFtS2V5LCBwYXJhbXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSwgVmVjdG9yIHBhcmFtcykgewotICAgIGlmIChwYXJhbXMgPT0gbnVsbCkKLSAgICAgIHBhcmFtc18ucmVtb3ZlKHBhcmFtS2V5KTsKLSAgICBlbHNlIHsKLSAgICAgIFN0cmluZ1tdIHBhcmFtc0FycmF5ID0gbmV3IFN0cmluZ1twYXJhbXMuc2l6ZSgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgcGFyYW1zQXJyYXlbaV0gPSBwYXJhbXMuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXksIHBhcmFtc0FycmF5KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSkgewotICAgIHJldHVybiAoU3RyaW5nW10pcGFyYW1zXy5nZXQocGFyYW1LZXkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgcGFyYW1LZXksIGludCBwYXJhbUluZGV4KSB7Ci0gICAgU3RyaW5nW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtS2V5KTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1JbmRleCA8IHBhcmFtcy5sZW5ndGgpCi0gICAgICByZXR1cm4gcGFyYW1zW3BhcmFtSW5kZXhdOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKSB7Ci0gICAgRW51bWVyYXRpb24gcGFyYW1LZXlzID0gcGFyYW1zXy5rZXlzKCk7Ci0gICAgd2hpbGUgKHBhcmFtS2V5cyAhPSBudWxsICYmIHBhcmFtS2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgaWYgKCF2YWxpZGF0ZVBhcmFtZXRlclZhbHVlcygoU3RyaW5nKXBhcmFtS2V5cy5uZXh0RWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSkgewotICAgIFN0cmluZ1tdIHBhcmFtcyA9IGdldFBhcmFtZXRlclZhbHVlcyhwYXJhbUtleSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IHBhcmFtcyAhPSBudWxsICYmIGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmICghdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShwYXJhbUtleSwgaSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9TT0FQRW5jQXJyYXlGaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9TT0FQRW5jQXJyYXlGaXhGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ1OWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY0FycmF5Rml4RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotCi1wdWJsaWMgY2xhc3MgU09BUEVuY0FycmF5Rml4RnJhZ21lbnQgZXh0ZW5kcyBTT0FQRW5jQXJyYXlGcmFnbWVudCB7Ci0gIHB1YmxpYyBTT0FQRW5jQXJyYXlGaXhGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIsIHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9TT0FQRW5jQXJyYXlSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheUZpeFdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1NPQVBFbmNBcnJheUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1NPQVBFbmNBcnJheUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwODVkZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9TT0FQRW5jQXJyYXlGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklTT0FQRW5jQXJyYXlGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTT0FQRW5jQXJyYXlGcmFnbWVudCBleHRlbmRzIFhTREdyb3VwU2VxRnJhZ21lbnQgaW1wbGVtZW50cyBJU09BUEVuY0FycmF5RnJhZ21lbnQKLXsKLSAgcHVibGljIFNPQVBFbmNBcnJheUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlciwgeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKQotICB7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGdldEluc3RhbmNlRG9jdW1lbnRzQnlUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCBnZXROYW1lKCkpOwotICAgIHJlbW92ZUdyb3VwSURzKCk7Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IGludGVybmFsRXF1YWxzKGluc3RhbmNlRG9jdW1lbnRzQ29weSwgaW5zdGFuY2VEb2N1bWVudHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElYU0RGcmFnbWVudCBzb2FwRW5jQXJyYXlUeXBlRnJhZyA9IChnZXRHcm91cE1lbWJlckZyYWdtZW50cyhjcmVhdGVTT0FQRW5jQXJyYXlJbnN0YW5jZSgpKSlbMF07Ci0gICAgICBWZWN0b3IgaW5zdGFuY2VzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgTm9kZUxpc3QgbmwgPSBpbnN0YW5jZURvY3VtZW50c0NvcHlbaV0uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBubC5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBubC5pdGVtKGopOwotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgaW5zdGFuY2VzVmVjdG9yLmFkZChub2RlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBFbGVtZW50W10gY2hpbGRJbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2luc3RhbmNlc1ZlY3Rvci5zaXplKCldOwotICAgICAgaW5zdGFuY2VzVmVjdG9yLmNvcHlJbnRvKGNoaWxkSW5zdGFuY2VEb2N1bWVudHMpOwotICAgICAgaWYgKCFzb2FwRW5jQXJyYXlUeXBlRnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoc2V0RWxlbWVudHNUYWdOYW1lKGNoaWxkSW5zdGFuY2VEb2N1bWVudHMsIHNvYXBFbmNBcnJheVR5cGVGcmFnLmdldE5hbWUoKSkpKQotICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgU3RyaW5nW10gZ3JvdXBJRHMgPSBnZXRHcm91cElEcygpOwotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50ID0gbmV3IEVsZW1lbnRbZ3JvdXBJRHMubGVuZ3RoXTsKLSAgICBTdHJpbmdCdWZmZXIgYXR0ck5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgU3RyaW5nQnVmZmVyIGF0dHJWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vICAgIFN0cmluZ0J1ZmZlciBhdHRyQXJyYXlUeXBlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vICAgIFN0cmluZ0J1ZmZlciBhdHRyQXJyYXlUeXBlVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGludCBudW1JbnN0YW5jZXMgPSAwOwotICAgICAgaW5zdGFuY2VEb2N1bWVudFtpXSA9IGRvYy5jcmVhdGVFbGVtZW50KGdldEluc3RhbmNlRG9jdW1lbnRUYWdOYW1lKG5hbWVzcGFjZVRhYmxlKSk7Ci0gICAgICBJWFNERnJhZ21lbnQgZnJhZ21lbnQgPSAoZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbaV0pKVswXTsKLSAgICAgIEVsZW1lbnRbXSBmcmFnbWVudEluc3RhbmNlRG9jdW1lbnRzID0gZnJhZ21lbnQuZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCBkb2MpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmcmFnbWVudEluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBpZiAoZnJhZ21lbnRJbnN0YW5jZURvY3VtZW50c1tqXSAhPSBudWxsKQotICAgICAgICAgIGluc3RhbmNlRG9jdW1lbnRbaV0uYXBwZW5kQ2hpbGQoZnJhZ21lbnRJbnN0YW5jZURvY3VtZW50c1tqXSk7Ci0gICAgICAgIG51bUluc3RhbmNlcysrOwotICAgICAgfQotICAgICAgU3RyaW5nIHNvYXBVUkkgPSBGcmFnbWVudENvbnN0YW50cy5VUklfU09BUDsKLSAgICAgIFN0cmluZyBzb2FwUHJlZml4ID0gZ2V0UHJlZml4RnJvbU5hbWVzcGFjZVVSSShzb2FwVVJJLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICBTdHJpbmcgc29hcEVuY0FycmF5VHlwZVVSSSA9IGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBTdHJpbmcgc29hcEVuY0FycmF5VHlwZVByZWZpeCA9IGdldFByZWZpeEZyb21OYW1lc3BhY2VVUkkoc29hcEVuY0FycmF5VHlwZVVSSSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgLy8gU2V0IHRoZSBhcnJheVR5cGUgYXR0cmlidXRlCi0gICAgICBhdHRyTmFtZS5zZXRMZW5ndGgoMCk7Ci0gICAgICBhdHRyTmFtZS5zZXRMZW5ndGgoMCk7Ci0gICAgICBhdHRyTmFtZS5hcHBlbmQoc29hcFByZWZpeCk7Ci0gICAgICBhdHRyTmFtZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuQ09MT04pOwotICAgICAgYXR0ck5hbWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlNPQVBfRU5DX0FSUkFZX1RZUEUpOwotICAgICAgYXR0clZhbHVlLnNldExlbmd0aCgwKTsKLSAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoc29hcEVuY0FycmF5VHlwZVByZWZpeCk7Ci0gICAgICBhdHRyVmFsdWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXROYW1lKCkpOwotICAgICAgYXR0clZhbHVlLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5MRUZUX1NRVUFSRV9CUkFDS0VUKTsKLSAgICAgIGF0dHJWYWx1ZS5hcHBlbmQobnVtSW5zdGFuY2VzKTsKLSAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuUklHSFRfU1FVQVJFX0JSQUNLRVQpOwotICAgICAgaW5zdGFuY2VEb2N1bWVudFtpXS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUudG9TdHJpbmcoKSwgYXR0clZhbHVlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBpZiAoZ2VuWFNJVHlwZSkKLSAgICB7Ci0vLwkgIFRPRE86IFVzZWQgdG8gY2FsbCB0aGUgcGx1Z2luJ3MgaWdub3JlU2NoZW1hRm9yU09BUEFycmF5cygpbWV0aG9kLgotCSAgYm9vbGVhbiBpZ25vcmVTY2hlbWFGb3JTT0FQQXJyYXlzID0gdHJ1ZTsKLSAgICAgIGlmIChpZ25vcmVTY2hlbWFGb3JTT0FQQXJyYXlzKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnQubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgeHNpVVJJID0gRnJhZ21lbnRDb25zdGFudHMuVVJJX1hTSTsKLSAgICAgICAgICBTdHJpbmcgeHNpUHJlZml4ID0gZ2V0UHJlZml4RnJvbU5hbWVzcGFjZVVSSSh4c2lVUkksIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgICAgICBTdHJpbmcgeHNpVHlwZVVSSSA9IEZyYWdtZW50Q29uc3RhbnRzLlVSSV9TT0FQOwotICAgICAgICAgIFN0cmluZyB4c2lUeXBlUHJlZml4ID0gZ2V0UHJlZml4RnJvbU5hbWVzcGFjZVVSSSh4c2lUeXBlVVJJLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgICAgYXR0ck5hbWUuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIGF0dHJOYW1lLmFwcGVuZCh4c2lQcmVmaXgpLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5DT0xPTikuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlhTSV9UWVBFKTsKLSAgICAgICAgICBhdHRyVmFsdWUuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoeHNpVHlwZVByZWZpeCkuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlFOQU1FX0xPQ0FMX05BTUVfQVJSQVkpOwotICAgICAgICAgIGluc3RhbmNlRG9jdW1lbnRbaV0uc2V0QXR0cmlidXRlKGF0dHJOYW1lLnRvU3RyaW5nKCksIGF0dHJWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gYWRkWFNJVHlwZShpbnN0YW5jZURvY3VtZW50LCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZURvY3VtZW50OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBjcmVhdGVTT0FQRW5jQXJyYXlJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoZ2V0WFNEVHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBncm91cElEID0gZ2VuSUQoKTsKLSAgICAgIFN0cmluZ1tdIGdyb3VwTWVtYmVySUQgPSB7Z2VuSUQoKX07Ci0gICAgICBpbnQgbWluT2NjdXJzID0gMDsKLSAgICAgIGludCBtYXhPY2N1cnMgPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQ7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBudWxsOwotICAgICAgaWYgKGdldFhTRE1vZGVsR3JvdXAoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZSBncm91cE93bmVyID0gKFhTRFBhcnRpY2xlKWdldFhTRE1vZGVsR3JvdXAoKS5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaW50IGdyb3VwTWluID0gZ3JvdXBPd25lci5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgaW50IGdyb3VwTWF4ID0gZ3JvdXBPd25lci5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgaW50IGVsZW1lbnRNaW4gPSAwOwotICAgICAgICBpbnQgZWxlbWVudE1heCA9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRDsKLSAgICAgICAgRUxpc3QgeHNkUGFydGljbGVzID0gZ2V0WFNETW9kZWxHcm91cCgpLmdldFBhcnRpY2xlcygpOwotICAgICAgICBpZiAoeHNkUGFydGljbGVzLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgeHNkUGFydGljbGVDb250ZW50ID0gKChYU0RQYXJ0aWNsZSl4c2RQYXJ0aWNsZXMuZ2V0KDApKS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgaWYgKHhzZFBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50RGVjbCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24peHNkUGFydGljbGVDb250ZW50OwotICAgICAgICAgICAgWFNEUGFydGljbGUgZWxlbWVudE93bmVyID0gKFhTRFBhcnRpY2xlKWVsZW1lbnREZWNsLmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgZWxlbWVudE1pbiA9IGVsZW1lbnRPd25lci5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICAgIGVsZW1lbnRNYXggPSBlbGVtZW50T3duZXIuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChncm91cE1pbiA+PSAwICYmIGVsZW1lbnRNaW4gPj0gMCkKLSAgICAgICAgICBtaW5PY2N1cnMgPSBncm91cE1pbiAqIGVsZW1lbnRNaW47Ci0gICAgICAgIGlmIChncm91cE1heCA+PSAwICYmIGdyb3VwTWF4ICE9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCAmJiBlbGVtZW50TWF4ID49IDAgJiYgZWxlbWVudE1heCAhPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQpCi0gICAgICAgICAgbWF4T2NjdXJzID0gZ3JvdXBNYXggKiBlbGVtZW50TWF4OwotICAgICAgfQotICAgICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gdGhpc0NvbmZpZyA9IGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBuZXcgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgICAgIHhzZENvbmZpZy5zZXRYU0RDb21wb25lbnQoZ2V0WFNEVHlwZURlZmluaXRpb24oKSk7Ci0gICAgICB4c2RDb25maWcuc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7Ci0gICAgICB4c2RDb25maWcuc2V0TWF4T2NjdXJzKG1heE9jY3Vycyk7Ci0gICAgICB4c2RDb25maWcuc2V0U3R5bGUodGhpc0NvbmZpZy5nZXRTdHlsZSgpKTsKLSAgICAgIHhzZENvbmZpZy5zZXRQYXJ0RW5jb2RpbmcodGhpc0NvbmZpZy5nZXRQYXJ0RW5jb2RpbmcoKSk7Ci0gICAgICB4c2RDb25maWcuc2V0V1NETFBhcnROYW1lKHRoaXNDb25maWcuZ2V0V1NETFBhcnROYW1lKCkpOwotICAgICAgU3RyaW5nIG5hbWUgPSAoZWxlbWVudERlY2wgIT0gbnVsbCkgPyBlbGVtZW50RGVjbC5nZXROYW1lKCkgOiBnZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldE5hbWUoKTsKLSAgICAgIElYU0RGcmFnbWVudCBmcmFnID0gZ2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKS5nZXRGcmFnbWVudCh4c2RDb25maWcsIGdyb3VwTWVtYmVySURbMF0sIG5hbWUpOwotICAgICAgYWRkRnJhZ21lbnQoZ3JvdXBNZW1iZXJJRFswXSwgZnJhZyk7Ci0gICAgICBzZXRHcm91cE1lbWJlcklEcyhncm91cElELCBncm91cE1lbWJlcklEKTsKLSAgICAgIHJldHVybiBncm91cElEOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBTZXFJbnN0YW5jZSgpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlU09BUEVuY0FycmF5SW5zdGFuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlSW5zdGFuY2UoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZVNPQVBFbmNBcnJheUluc3RhbmNlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY0FycmF5UmFuZ2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9TT0FQRW5jQXJyYXlSYW5nZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzdlZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9TT0FQRW5jQXJyYXlSYW5nZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGNsYXNzIFNPQVBFbmNBcnJheVJhbmdlRnJhZ21lbnQgZXh0ZW5kcyBTT0FQRW5jQXJyYXlGcmFnbWVudCB7Ci0gIHB1YmxpYyBTT0FQRW5jQXJyYXlSYW5nZUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlciwgeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheVJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvU09BUEVuY0FycmF5UmFuZ2VXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9TT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOGFiZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9TT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50IGV4dGVuZHMgWFNERGVsZWdhdGlvbkZyYWdtZW50IGltcGxlbWVudHMgSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudAotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFJFRiA9ICJocmVmIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPVU5EID0gIiMiOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHVyaVJlZmVyZW5jZVRhYmxlXzsKLQotICBwdWJsaWMgU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykKLSAgewotICAgIHN1cGVyKGlkLCBuYW1lLCBudWxsKTsKLSAgICB1cmlSZWZlcmVuY2VUYWJsZV8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKQotICB7Ci0gICAgZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCkuc2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCkuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYpCi0gIHsKLSAgICBnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKS5zZXRYU0RUeXBlRGVmaW5pdGlvbih0eXBlRGVmKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCkuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSByZXNvbHZlVVJJUmVmZXJlbmNlcyh1cmlSZWZlcmVuY2VUYWJsZV8sIGluc3RhbmNlRG9jdW1lbnRzW2ldKTsKLSAgICByZXR1cm4gZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCkuc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlZmVyZW5jZXMoSGFzaHRhYmxlIHVyaVJlZmVyZW5jZXMpCi0gIHsKLSAgICB1cmlSZWZlcmVuY2VUYWJsZV8gPSB1cmlSZWZlcmVuY2VzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBIYXNodGFibGUgcGFyc2VVUklSZWZlcmVuY2VzKEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBvdmVyd3JpdGVzKQotICB7Ci0gICAgSGFzaHRhYmxlIHVyaVJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcGFyc2VVUklSZWZlcmVuY2VzKHVyaVJlZmVyZW5jZXMsIGVsZW1lbnQsIG92ZXJ3cml0ZXMpOwotICAgIHJldHVybiB1cmlSZWZlcmVuY2VzOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYXJzZVVSSVJlZmVyZW5jZXMoSGFzaHRhYmxlIHVyaVJlZmVyZW5jZXMsIEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBvdmVyd3JpdGVzKQotICB7Ci0gICAgYm9vbGVhbiByZXNvbHZlZCA9IHRydWU7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBVUklSZWZlcmVuY2UgcmVmID0gbnVsbDsKLSAgICAgIFN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKTsKLSAgICAgIHJlc29sdmVkID0gIWVsZW1lbnQuaGFzQXR0cmlidXRlKEhSRUYpOwotICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQubGVuZ3RoKCkgPiAwICYmIChvdmVyd3JpdGVzIHx8ICF1cmlSZWZlcmVuY2VzLmNvbnRhaW5zKGlkKSkpCi0gICAgICB7Ci0gICAgICAgIHJlZiA9IG5ldyBVUklSZWZlcmVuY2UoZWxlbWVudCwgdHJ1ZSk7Ci0gICAgICAgIHVyaVJlZmVyZW5jZXMucHV0KGlkLCByZWYpOwotICAgICAgfQotICAgICAgTm9kZUxpc3QgbmwgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbmwuaXRlbShpKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHJlc29sdmVkID0gcGFyc2VVUklSZWZlcmVuY2VzKHVyaVJlZmVyZW5jZXMsIChFbGVtZW50KW5vZGUsIG92ZXJ3cml0ZXMpICYmIHJlc29sdmVkOwotICAgICAgfQotICAgICAgaWYgKHJlZiAhPSBudWxsKQotICAgICAgICByZWYuc2V0UmVzb2x2ZWQocmVzb2x2ZWQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzb2x2ZWQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgcmVzb2x2ZVVSSVJlZmVyZW5jZXMoSGFzaHRhYmxlIHVyaVJlZmVyZW5jZXMsIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmICh1cmlSZWZlcmVuY2VzICE9IG51bGwgJiYgIXVyaVJlZmVyZW5jZXMuaXNFbXB0eSgpKQotICAgICAgcmV0dXJuIHJlc29sdmVVUklSZWZlcmVuY2VzKHVyaVJlZmVyZW5jZXMsIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBlbGVtZW50LCBuZXcgVmVjdG9yKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCByZXNvbHZlVVJJUmVmZXJlbmNlcyhIYXNodGFibGUgdXJpUmVmZXJlbmNlcywgRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsZW1lbnQsIFZlY3RvciB1c2VkSWRzKQotICB7Ci0gICAgU3RyaW5nIGhyZWYgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShIUkVGKTsKLSAgICBFbGVtZW50IHJlc29sdmVkRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgYm9vbGVhbiByZXNvbHZlZCA9IGZhbHNlOwotICAgIGlmIChocmVmICE9IG51bGwgJiYgaHJlZi5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgVVJJUmVmZXJlbmNlIHJlZiA9IG51bGw7Ci0gICAgICBpZiAoaHJlZi5pbmRleE9mKFBPVU5EKSAhPSAtMSkKLSAgICAgICAgaHJlZiA9IGhyZWYuc3Vic3RyaW5nKDEsIGhyZWYubGVuZ3RoKCkpOwotICAgICAgaWYgKCF1c2VkSWRzLmNvbnRhaW5zKGhyZWYpKQotICAgICAgewotICAgICAgICByZWYgPSAoVVJJUmVmZXJlbmNlKXVyaVJlZmVyZW5jZXMuZ2V0KGhyZWYpOwotICAgICAgICBpZiAocmVmICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB1c2VkSWRzLmFkZChocmVmKTsKLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnRSZWYgPSByZWYuZ2V0UmVmRWxlbWVudCgpOwotICAgICAgICAgIHJlc29sdmVkID0gcmVmLmdldFJlc29sdmVkKCk7Ci0gICAgICAgICAgcmVzb2x2ZWRFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoZWxlbWVudC5nZXRUYWdOYW1lKCkpOwotICAgICAgICAgIE5vZGVMaXN0IG5sID0gZWxlbWVudFJlZi5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQotICAgICAgICAgICAgICByZXNvbHZlZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoIXJlc29sdmVkKQotICAgIHsKLSAgICAgIE5vZGVMaXN0IG5sID0gcmVzb2x2ZWRFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbmwuaXRlbShpKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBjaGlsZCA9IHJlc29sdmVVUklSZWZlcmVuY2VzKHVyaVJlZmVyZW5jZXMsIHJlc29sdmVkRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCksIChFbGVtZW50KW5vZGUsIHVzZWRJZHMpOwotCQkgIGlmIChjaGlsZCAhPSBub2RlKQotICAgICAgICAgICAgcmVzb2x2ZWRFbGVtZW50LnJlcGxhY2VDaGlsZChjaGlsZCwgbm9kZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGhyZWYgIT0gbnVsbCkKLSAgICAgIHVzZWRJZHMucmVtb3ZlKGhyZWYpOwotICAgIHJldHVybiByZXNvbHZlZEVsZW1lbnQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVUklSZWZlcmVuY2UKLSAgewotICAgIHByaXZhdGUgRWxlbWVudCByZWZfOwotICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlZF87Ci0KLSAgICBwdWJsaWMgVVJJUmVmZXJlbmNlKEVsZW1lbnQgcmVmLCBib29sZWFuIHJlc29sdmVkKQotICAgIHsKLSAgICAgIHJlZl8gPSByZWY7Ci0gICAgICByZXNvbHZlZF8gPSByZXNvbHZlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRSZWZFbGVtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVmXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZFbGVtZW50KEVsZW1lbnQgcmVmKQotICAgIHsKLSAgICAgIHJlZl8gPSByZWY7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVzb2x2ZWQoKQotICAgIHsKLSAgICAgIHJldHVybiByZXNvbHZlZF87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZWQoYm9vbGVhbiByZXNvbHZlZCkKLSAgICB7Ci0gICAgICByZXNvbHZlZF8gPSByZXNvbHZlZDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQXR0cmlidXRlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQXR0cmlidXRlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1MzlhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREF0dHJpYnV0ZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyIC0gQWxsIFJpZ2h0cwotICogUmVzZXJ2ZWQuIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yCi0gKiBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICogCi0gKiA8L2NvcHlyaWdodD4KLSAqIAotICogRmlsZQotICogcGx1Z2lucy9jb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmV4cGxvcmVyL3dzZXhwbG9yZXIvc3JjL2NvbS9pYm0vZXRvb2xzL3dlYnNlcnZpY2UvZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9JbXBsL1hTREVsZW1lbnRGcmFnbWVudC5qYXZhLAotICogd3NhLmV0b29scy53cy5leHBsb3JlciwgbHVuYXItNS4xLjIsIDIwMDMxMjMxYSA1IFZlcnNpb24gMS41IDAzLzA5LzI0Ci0gKiAxNDozMDozOAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREF0dHJpYnV0ZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVGcmFnbWVudCBleHRlbmRzIFhTRERlbGVnYXRpb25GcmFnbWVudCBpbXBsZW1lbnRzIElYU0RBdHRyaWJ1dGVGcmFnbWVudAotewotICAgCi0gIAotICBwdWJsaWMgWFNEQXR0cmlidXRlRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUGFyYW1ldGVyVmFsdWVzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBJWFNERnJhZ21lbnQgYXR0cmlidXRlVHlwZUZyYWdtZW50ID0gZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCk7Ci0gICAgCQotICAgIGlmICghYXR0cmlidXRlVHlwZUZyYWdtZW50LnByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMocGFyc2VyKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKQotICB7Ci0gICAgSVhTREZyYWdtZW50IGF0dHJpYnV0ZVR5cGVGcmFnbWVudCA9IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIGlmICghYXR0cmlidXRlVHlwZUZyYWdtZW50LnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpCi0gIHsKLSAgICBTdHJpbmdbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXkpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIWdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKHBhcmFtS2V5KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVyVmFsdWUoU3RyaW5nIHBhcmFtS2V5LCBpbnQgcGFyYW1JbmRleCkKLSAgewotICAgIGlmICghZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCkudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShwYXJhbUtleSwgcGFyYW1JbmRleCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbihYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpCi0gIHsKLSAgICBzdXBlci5zZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbihjb25maWcpOwotICAgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykKLSAgewotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBpbnN0YW5jZURvY3VtZW50czsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIFN0cmluZyB3c2RsUGFydE5hbWUgPSBjb25maWcuZ2V0V1NETFBhcnROYW1lKCk7Ci0gICAgTm9kZUxpc3QgbmwgPSBpbnN0YW5jZURvY3VtZW50c0NvcHlbMF0uZ2V0Q2hpbGROb2RlcygpOwotICAgICAKLSAgICAKLSAgICAKLSAgICBpZiAoY29uZmlnLmdldElzV1NETFBhcnQoKSAmJiBjb25maWcuZ2V0U3R5bGUoKSA9PSBGcmFnbWVudENvbnN0YW50cy5TVFlMRV9SUEMgJiYgd3NkbFBhcnROYW1lICE9IG51bGwgJiYgd3NkbFBhcnROYW1lLmxlbmd0aCgpID4gMCAmJiBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoID09IDEgJiYgd3NkbFBhcnROYW1lLmVxdWFscyhpbnN0YW5jZURvY3VtZW50c0NvcHlbMF0uZ2V0VGFnTmFtZSgpKSkKLSAgICB7Ci0gICAgICBWZWN0b3IgY2hpbGRFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbmwuaXRlbShpKTsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSl7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IChFbGVtZW50W10pY2hpbGRFbGVtZW50cy50b0FycmF5KG5ldyBFbGVtZW50WzBdKTsKLSAgICB9Ci0gICAgSVhTREZyYWdtZW50IGF0dHJpYnV0ZVR5cGVGcmFnbWVudCA9IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGdldEluc3RhbmNlRG9jdW1lbnRzQnlUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzQ29weSwgZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gYXR0cmlidXRlVHlwZUZyYWdtZW50LnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhzZXRFbGVtZW50c1RhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBhdHRyaWJ1dGVUeXBlRnJhZ21lbnQuZ2V0TmFtZSgpKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luc3RhbmNlTmFtZXNwYWNlUXVhbGlmaWVkKCkKLSAgewotICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgaWYgKGNvbmZpZy5nZXRQYXJ0RW5jb2RpbmcoKSA9PSBGcmFnbWVudENvbnN0YW50cy5FTkNPRElOR19MSVRFUkFMKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbil4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgIGlmICh4c2RBdHRyaWJ1dGUuaXNHbG9iYWwoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh4c2RBdHRyaWJ1dGUuaXNTZXRGb3JtKCkpCi0gICAgICAgICAgcmV0dXJuICh4c2RBdHRyaWJ1dGUuZ2V0Rm9ybSgpLmdldFZhbHVlKCkgPT0gWFNERm9ybS5RVUFMSUZJRUQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuICh4c2RBdHRyaWJ1dGUuZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKS5nZXRWYWx1ZSgpID09IFhTREZvcm0uUVVBTElGSUVEKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnN0YW5jZURvY3VtZW50VGFnTmFtZShIYXNodGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAKLSAgICBTdHJpbmdCdWZmZXIgdGFnTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAoaXNJbnN0YW5jZU5hbWVzcGFjZVF1YWxpZmllZCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBuc1VSSSA9IG51bGw7Ci0gICAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgICAgaWYgKHhzZEF0dHJpYnV0ZS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgbnNVUkkgPSB4c2RBdHRyaWJ1dGUuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgZWxzZQotICAgICAgICBuc1VSSSA9IHhzZEF0dHJpYnV0ZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIGlmIChuc1VSSSAhPSBudWxsICYmIG5zVVJJLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeEZyb21OYW1lc3BhY2VVUkkobnNVUkksIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgICAgdGFnTmFtZS5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgdGFnTmFtZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuQ09MT04pOwotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmcgeHNkQXR0cmlidXRlTmFtZSA9IHhzZEF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0gICAgaWYgKHhzZEF0dHJpYnV0ZU5hbWUgPT0gbnVsbCB8fCB4c2RBdHRyaWJ1dGVOYW1lLmxlbmd0aCgpIDw9IDApCi0gICAgewotICAgICAgLy8gcG9ydCB0byBvcmcuZWNsaXBzZS54c2QKLSAgICAgIGlmICh4c2RBdHRyaWJ1dGUuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpICE9IG51bGwpCi0gICAgICAJeHNkQXR0cmlidXRlTmFtZSA9IHhzZEF0dHJpYnV0ZS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgZWxzZQotICAgICAgCXhzZEF0dHJpYnV0ZU5hbWUgPSBnZXROYW1lKCk7Ci0gICAgfQotICAgIHRhZ05hbWUuYXBwZW5kKHhzZEF0dHJpYnV0ZU5hbWUpOwotICAgIHJldHVybiB0YWdOYW1lLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAKLQotICAKLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKQotICB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWxlZ2F0ZUZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKQotICB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWxlZ2F0ZUZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RDb21wbGV4Rml4RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleEZpeEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliM2ZkMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RDb21wbGV4Rml4RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tcGxleEZpeEZyYWdtZW50IGV4dGVuZHMgWFNEQ29tcGxleEZyYWdtZW50IHsKLSAgcHVibGljIFhTRENvbXBsZXhGaXhGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleEZpeFdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRENvbXBsZXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RDb21wbGV4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1N2M0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRENvbXBsZXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREF0dHJpYnV0ZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RDb21wbGV4RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuWFNEVHlwZURlZmluaXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleEZpbmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNEQ29tcGxleEZyYWdtZW50IGV4dGVuZHMgWFNETWFwRnJhZ21lbnQgaW1wbGVtZW50cyBJWFNEQ29tcGxleEZyYWdtZW50Ci17Ci0gIHB1YmxpYyBYU0RDb21wbGV4RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKQotICB7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGdldEluc3RhbmNlRG9jdW1lbnRzQnlUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCBnZXROYW1lKCkpOwotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSBpbnRlcm5hbEVxdWFscyhpbnN0YW5jZURvY3VtZW50c0NvcHksIGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhUeXBlQ29udGVudCA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5nZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoY29tcGxleFR5cGUpOwotICAgIGlmIChjb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIHNldFBhcmFtc0ZvclhTRFR5cGVEZWYoaW5zdGFuY2VEb2N1bWVudHNDb3B5KTsKLSAgICBlbHNlCi0gICAgICBzZXRQYXJhbXNGb3JYU0RQYXJ0aWNsZShpbnN0YW5jZURvY3VtZW50c0NvcHkpOyAKLSAgICByZXR1cm4gc2V0UGFyYW1zRm9yQXR0cmlidXRlcyhpbnN0YW5jZURvY3VtZW50c0NvcHkpICYmIHBhcmFtc1ZhbGlkOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHNldFBhcmFtc0ZvckF0dHJpYnV0ZXMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKXsKLSAgCWJvb2xlYW4gcGFyYW1zVmFsaWQgPSB0cnVlOwotICAJCi0gIAlJWFNEQXR0cmlidXRlRnJhZ21lbnRbXSBhdHRyaWJ1dGVGcmFnbWVudHMgPSBnZXRBbGxBdHRyaWJ1dGVGcmFnbWVudHMoKTsKLSAgCWZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspewotICAJICAKLSAgCSAgTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBpbnN0YW5jZURvY3VtZW50c1tpXS5nZXRBdHRyaWJ1dGVzKCk7CQotICAJICBmb3IgKGludCBrID0gMDsgayA8IGF0dHJpYnV0ZUZyYWdtZW50cy5sZW5ndGg7IGsrKyl7Ci0gICAgCQotICAJICAJU3RyaW5nIG5hbWUgPSAoKFhTREF0dHJpYnV0ZVVzZSlhdHRyaWJ1dGVGcmFnbWVudHNba10uZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKSkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gIAkgICAgcGFyYW1zVmFsaWQgPSBhdHRyaWJ1dGVGcmFnbWVudHNba10uZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCkuc2V0QXR0cmlidXRlUGFyYW1zRnJvbUluc3RhbmNlRG9jdW1lbnRzKG5vZGVNYXAuZ2V0TmFtZWRJdGVtKG5hbWUpKTsJCi0gICAgICB9Ci0gIAl9Ci0gICAgcmV0dXJuIHBhcmFtc1ZhbGlkOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gc2V0UGFyYW1zRm9yWFNEVHlwZURlZihFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpCi0gIHsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gdHJ1ZTsKLSAgICByZW1vdmVBbGxGcmFnbWVudHMoKTsKLSAgICByZW1vdmVBbGxBdHRyaWJ1dGVGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBJWFNERnJhZ21lbnQgY2hpbGRGcmFnID0gZ2V0RnJhZ21lbnQoY3JlYXRlSW5zdGFuY2UoKSk7Ci0gICAgICBFbGVtZW50W10gY2hpbGRJbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50WzFdOwotICAgICAgY2hpbGRJbnN0YW5jZURvY3VtZW50c1swXSA9IGluc3RhbmNlRG9jdW1lbnRzW2ldOwotICAgICAgaWYgKCFjaGlsZEZyYWcuc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKHNldEVsZW1lbnRzVGFnTmFtZShjaGlsZEluc3RhbmNlRG9jdW1lbnRzLCBjaGlsZEZyYWcuZ2V0TmFtZSgpKSkpCi0gICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBzZXRQYXJhbXNGb3JYU0RQYXJ0aWNsZShFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpCi0gIHsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gdHJ1ZTsKLSAgICByZW1vdmVBbGxGcmFnbWVudHMoKTsKLSAgICByZW1vdmVBbGxBdHRyaWJ1dGVGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBJWFNERnJhZ21lbnQgY2hpbGRGcmFnID0gZ2V0RnJhZ21lbnQoY3JlYXRlSW5zdGFuY2UoKSk7Ci0gICAgICBWZWN0b3IgaW5zdGFuY2VzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgTm9kZUxpc3QgbmwgPSBpbnN0YW5jZURvY3VtZW50c1tpXS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5sLmdldExlbmd0aCgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaik7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICBpbnN0YW5jZXNWZWN0b3IuYWRkKG5vZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIEVsZW1lbnRbXSBjaGlsZEluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbaW5zdGFuY2VzVmVjdG9yLnNpemUoKV07Ci0gICAgICBpbnN0YW5jZXNWZWN0b3IuY29weUludG8oY2hpbGRJbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgICBpZiAoIWNoaWxkRnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoY2hpbGRJbnN0YW5jZURvY3VtZW50cykpCi0gICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhUeXBlQ29udGVudCA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5nZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoY29tcGxleFR5cGUpOwotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50czsKLSAgICBTdHJpbmcgdGFnTmFtZSA9IGdldEluc3RhbmNlRG9jdW1lbnRUYWdOYW1lKG5hbWVzcGFjZVRhYmxlKTsKLSAgICBpZiAoY29tcGxleFR5cGVDb250ZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICBpbnN0YW5jZURvY3VtZW50cyA9IGdlbkluc3RhbmNlc0ZvclhTRFR5cGVEZWYoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsIHRhZ05hbWUsIGRvYyk7Ci0gICAgZWxzZQotICAgICAgaW5zdGFuY2VEb2N1bWVudHMgPSBnZW5JbnN0YW5jZXNGb3JYU0RQYXJ0aWNsZShnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgdGFnTmFtZSwgZG9jKTsKLSAgICAgIGlmKGdlblhTSVR5cGUpIGFkZFhTSVR5cGUoaW5zdGFuY2VEb2N1bWVudHMsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzID0gYWRkQXR0cmlidXRlcyhpbnN0YW5jZURvY3VtZW50cyk7Ci0JcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHJpdmF0ZSBFbGVtZW50W10gYWRkQXR0cmlidXRlcyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpewotICAJCi0gIAlmb3IgKGludCBpID0gMDtpPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7aSsrKXsKLSAgCSAgSVhTREF0dHJpYnV0ZUZyYWdtZW50W10gYXR0cmlidXRlRnJhZ21lbnRzID0gZ2V0QWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8IGF0dHJpYnV0ZUZyYWdtZW50cy5sZW5ndGg7IGsrKyl7Ci0gICAgCVN0cmluZyBuYW1lID0gKChYU0RBdHRyaWJ1dGVVc2UpYXR0cmlidXRlRnJhZ21lbnRzW2tdLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCkuZ2V0WFNEQ29tcG9uZW50KCkpLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgIAlhdHRyaWJ1dGVGcmFnbWVudHNba10uZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCkuc2V0QXR0cmlidXRlc09uSW5zdGFuY2VEb2N1bWVudHMoaW5zdGFuY2VEb2N1bWVudHNbaV0sbmFtZSk7CQotICAgICAgfQotICAgCX0KLSAgIAlyZXR1cm4gaW5zdGFuY2VEb2N1bWVudHM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudFtdIGdlbkluc3RhbmNlc0ZvclhTRFR5cGVEZWYoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIFN0cmluZyB0YWdOYW1lLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBJWFNERnJhZ21lbnRbXSBmcmFnbWVudHMgPSBnZXRBbGxGcmFnbWVudHMoKTsKLSAgICBWZWN0b3IgaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnRbXSBmcmFnbWVudEluc3RhbmNlcyA9IGZyYWdtZW50c1tpXS5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsIGRvYyk7Ci0gICAgICBpZiAoZnJhZ21lbnRJbnN0YW5jZXMubGVuZ3RoID4gMCkKLSAgICAgICAgaW5zdGFuY2VEb2N1bWVudHNDb3B5LmFkZChmcmFnbWVudEluc3RhbmNlc1swXSk7Ci0gICAgfQotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2luc3RhbmNlRG9jdW1lbnRzQ29weS5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSAoRWxlbWVudClpbnN0YW5jZURvY3VtZW50c0NvcHkuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RWxlbWVudHNUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCB0YWdOYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudFtdIGdlbkluc3RhbmNlc0ZvclhTRFBhcnRpY2xlKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBTdHJpbmcgdGFnTmFtZSwgRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGdldEFsbEZyYWdtZW50cygpOwotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2NoaWxkRnJhZ3MubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnRbXSBjaGlsZEluc3RhbmNlcyA9IGNoaWxkRnJhZ3NbaV0uZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCBkb2MpOwotICAgICAgRWxlbWVudCBpbnN0YW5jZURvY3VtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkSW5zdGFuY2VzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBpZiAoY2hpbGRJbnN0YW5jZXNbal0gIT0gbnVsbCkKLSAgICAgICAgICBpbnN0YW5jZURvY3VtZW50LmFwcGVuZENoaWxkKGNoaWxkSW5zdGFuY2VzW2pdKTsKLSAgICAgIH0KLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2ldID0gaW5zdGFuY2VEb2N1bWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RNb2RlbEdyb3VwIGdldFhTRE1vZGVsR3JvdXAoWFNEUGFydGljbGUgeHNkUGFydGljbGUpCi0gIHsKLSAgICBpZiAoeHNkUGFydGljbGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgeHNkUGFydGljbGVDb250ZW50ID0geHNkUGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKHhzZFBhcnRpY2xlQ29udGVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoeHNkUGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXhzZFBhcnRpY2xlQ29udGVudDsKLSAgICAgICAgICBpZiAoeHNkTW9kZWxHcm91cERlZi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB4c2RNb2RlbEdyb3VwRGVmID0geHNkTW9kZWxHcm91cERlZi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIHhzZE1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHhzZFBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKXhzZFBhcnRpY2xlQ29udGVudDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0SW5oZXJpdGVkUGFydGljbGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSkKLSAgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChjb21wbGV4VHlwZS5nZXREZXJpdmF0aW9uTWV0aG9kKCkuZ2V0VmFsdWUoKSA9PSBYU0RDb21wbGV4RmluYWwuRVhURU5TSU9OKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGV4dFR5cGUgPSBjb21wbGV4VHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgaWYgKGV4dFR5cGUgIT0gbnVsbCAmJiAhKGV4dFR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZXh0VHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IGV4dFR5cGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbG9jYWxuYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0ROYW1lZENvbXBvbmVudCB4c2ROYW1lZENvbXAgPSBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcigpLmdldFhTRFR5cGVGcm9tU2NoZW1hKG5hbWVzcGFjZSwgbG9jYWxuYW1lLCBmYWxzZSk7Ci0gICAgICAgICAgaWYgKHhzZE5hbWVkQ29tcCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBleHRUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil4c2ROYW1lZENvbXA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZXh0VHlwZSAhPSBudWxsICYmIGV4dFR5cGUgIT0gY29tcGxleFR5cGUgJiYgZXh0VHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGV4dFR5cGVDb250ZW50ID0gWFNEVHlwZURlZmluaXRpb25VdGlsLmdldFhTRENvbXBsZXhUeXBlQ29udGVudCgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWV4dFR5cGUpOwotICAgICAgICBpZiAoZXh0VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgewotICAgICAgICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKFhTRFBhcnRpY2xlKWV4dFR5cGVDb250ZW50KTsKLSAgICAgICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHYuYWRkQWxsKGdldEluaGVyaXRlZFBhcnRpY2xlcygoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWV4dFR5cGUpKTsKLSAgICAgICAgICAgIHYuYWRkQWxsKHhzZE1vZGVsR3JvdXAuZ2V0UGFydGljbGVzKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnYXRoZXJJbmhlcml0ZWRQYXJ0aWNsZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgaWYgKGNvbXBsZXhUeXBlLmdldERlcml2YXRpb25NZXRob2QoKS5nZXRWYWx1ZSgpID09IFhTRENvbXBsZXhGaW5hbC5FWFRFTlNJT04pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhUeXBlQ29udGVudCA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5nZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoY29tcGxleFR5cGUpOwotICAgICAgaWYgKGNvbXBsZXhUeXBlQ29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKChYU0RQYXJ0aWNsZSljb21wbGV4VHlwZUNvbnRlbnQpOwotICAgICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBpbmhlcml0ZWRQYXJ0aWNsZXMgPSBnZXRJbmhlcml0ZWRQYXJ0aWNsZXMoY29tcGxleFR5cGUpOwotICAgICAgICAgIExpc3QgcGFydGljbGVzID0geHNkTW9kZWxHcm91cC5nZXRQYXJ0aWNsZXMoKTsKLSAgICAgICAgICBwYXJ0aWNsZXMuYWRkQWxsKDAsIGluaGVyaXRlZFBhcnRpY2xlcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAKLSAgCi0gIHB1YmxpYyBJWFNEQXR0cmlidXRlRnJhZ21lbnRbXSBnZXRBbGxBdHRyaWJ1dGVGcmFnbWVudHMoKQotICB7Ci0gIAlyZXR1cm4gc3VwZXIuZ2V0QWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7CQkKLSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUF0dHJpYnV0ZUZyYWdtZW50cyhTdHJpbmcgY29tcGxleENoaWxkSUQpCi0gIHsKLSAgCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgCUVMaXN0IGF0Q29udGVudExpc3QgPSBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpOwotICAJSXRlcmF0b3IgaXRlcmF0b3IgPSBhdENvbnRlbnRMaXN0Lml0ZXJhdG9yKCk7Ci0gIAl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotICAJICBPYmplY3Qgb2JqZWN0ID0gKE9iamVjdClpdGVyYXRvci5uZXh0KCk7Ci0gIAkgIGlmKG9iamVjdCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbil7Ci0gIAkJWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEFHRCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pb2JqZWN0OwotICAJCVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiByZXNvbHZlZCA9IHhzZEFHRC5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAJCUVMaXN0IGFMaXN0ID0gcmVzb2x2ZWQuZ2V0Q29udGVudHMoKTsKLSAgCQlJdGVyYXRvciBpdGVyYXRvcjIgPSBhTGlzdC5pdGVyYXRvcigpOwotICAJCXdoaWxlKGl0ZXJhdG9yMi5oYXNOZXh0KCkpewotICAJCQljcmVhdGVBdHRyaWJ1dGVIZWxwZXIoKFhTREF0dHJpYnV0ZVVzZSlpdGVyYXRvcjIubmV4dCgpLGNvbXBsZXhDaGlsZElEKTsKLSAgCQl9Ci0gIAkgIH0KLSAgCSAgZWxzZXsKLSAgCSAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0VXNlID0gIChYU0RBdHRyaWJ1dGVVc2Upb2JqZWN0OwotICAJICAgIGNyZWF0ZUF0dHJpYnV0ZUhlbHBlcihhdHRVc2UsY29tcGxleENoaWxkSUQpOwotICAJICB9Ci0gIAkgIAotICAJfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlSGVscGVyKFhTREF0dHJpYnV0ZVVzZSBhdHRVc2UsU3RyaW5nIGNvbXBsZXhDaGlsZElEKXsKLQkgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHRoaXNDb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICB4c2RDb25maWcuc2V0WFNEQ29tcG9uZW50KGF0dFVzZSk7Ci0gICAgICB4c2RDb25maWcuc2V0U3R5bGUodGhpc0NvbmZpZy5nZXRTdHlsZSgpKTsKLSAgICAgIHhzZENvbmZpZy5zZXRQYXJ0RW5jb2RpbmcodGhpc0NvbmZpZy5nZXRQYXJ0RW5jb2RpbmcoKSk7Ci0gICAgICB4c2RDb25maWcuc2V0V1NETFBhcnROYW1lKHRoaXNDb25maWcuZ2V0V1NETFBhcnROYW1lKCkpOwotICAgICAgU3RyaW5nIG5ld0lEID0gZ2VuSUQoKTsKLSAgICAgIGFkZEF0dHJpYnV0ZUZyYWdtZW50KGNvbXBsZXhDaGlsZElEICsgbmV3SUQsIGdldFhTRFRvRnJhZ21lbnRDb250cm9sbGVyKCkuZ2V0RnJhZ21lbnQoeHNkQ29uZmlnLGNvbXBsZXhDaGlsZElEICsgbmV3SUQsIGNvbXBsZXhDaGlsZElEICsgbmV3SUQpKTsKLSAgCSAgCi0gIH0KLSAgCi0gIAotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbXBsZXhJbnN0YW5jZSgpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgZ2F0aGVySW5oZXJpdGVkUGFydGljbGVzKGNvbXBsZXhUeXBlKTsKLSAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleFR5cGVDb250ZW50ID0gWFNEVHlwZURlZmluaXRpb25VdGlsLmdldFhTRENvbXBsZXhUeXBlQ29udGVudChjb21wbGV4VHlwZSk7Ci0gICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gdGhpc0NvbmZpZyA9IGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgeHNkQ29uZmlnLnNldFhTRENvbXBvbmVudChjb21wbGV4VHlwZUNvbnRlbnQpOwotICAgIHhzZENvbmZpZy5zZXRTdHlsZSh0aGlzQ29uZmlnLmdldFN0eWxlKCkpOwotICAgIHhzZENvbmZpZy5zZXRQYXJ0RW5jb2RpbmcodGhpc0NvbmZpZy5nZXRQYXJ0RW5jb2RpbmcoKSk7Ci0gICAgeHNkQ29uZmlnLnNldFdTRExQYXJ0TmFtZSh0aGlzQ29uZmlnLmdldFdTRExQYXJ0TmFtZSgpKTsKLSAgICBTdHJpbmcgbmV3SUQgPSBnZW5JRCgpOwotICAgIGFkZEZyYWdtZW50KG5ld0lELCBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldEZyYWdtZW50KHhzZENvbmZpZywgbmV3SUQsIG5ld0lEKSk7Ci0gICAgY3JlYXRlQXR0cmlidXRlRnJhZ21lbnRzKG5ld0lEKTsKLSAgICByZXR1cm4gbmV3SUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVDb21wbGV4SW5zdGFuY2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RDb21wbGV4UmFuZ2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RDb21wbGV4UmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQ1M2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleFJhbmdlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tcGxleFJhbmdlRnJhZ21lbnQgZXh0ZW5kcyBYU0RDb21wbGV4RnJhZ21lbnQgewotICBwdWJsaWMgWFNEQ29tcGxleFJhbmdlRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSYW5nZVdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRENvbXBsZXhTaW1wbGVDb250ZW50Rml4RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRGaXhGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzVhMzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRGaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qCi0qIEZpbGUgcGx1Z2lucy9jb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmV4cGxvcmVyL3dzZXhwbG9yZXIvc3JjL2NvbS9pYm0vZXRvb2xzL3dlYnNlcnZpY2UvZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9JbXBsL1hTRENvbXBsZXhGaXhGcmFnbWVudC5qYXZhLCB3c2EuZXRvb2xzLndzLmV4cGxvcmVyLCBsdW5hci01LjEuMiAxCi0qIFZlcnNpb24gMS4xIDAzLzAyLzI4IDE1OjI1OjE1Ci0qLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREF0dHJpYnV0ZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsLlhTRFR5cGVEZWZpbml0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhTaW1wbGVDb250ZW50Rml4RnJhZ21lbnQgZXh0ZW5kcyBYU0RDb21wbGV4RnJhZ21lbnQgewotICBwdWJsaWMgWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRGaXhGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyKTsKLSAgfQotCi0gIAotICAKLSAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKSB7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGdldEluc3RhbmNlRG9jdW1lbnRzQnlUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCBnZXROYW1lKCkpOwotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSBpbnRlcm5hbEVxdWFscyhpbnN0YW5jZURvY3VtZW50c0NvcHksIGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhUeXBlQ29udGVudCA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5nZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoY29tcGxleFR5cGUpOwotICAgIGlmIChjb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIHJldHVybiBzZXRQYXJhbXNGb3JYU0RUeXBlRGVmKGluc3RhbmNlRG9jdW1lbnRzQ29weSkgJiYgcGFyYW1zVmFsaWQ7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHNldFBhcmFtc0ZvclhTRFBhcnRpY2xlKGluc3RhbmNlRG9jdW1lbnRzQ29weSkgJiYgcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gc2V0UGFyYW1zRm9yQXR0cmlidXRlcyhFbGVtZW50IGluc3RhbmNlRG9jdW1lbnQsSVhTREZyYWdtZW50IGZyYWcpewotICAJYm9vbGVhbiBwYXJhbXNWYWxpZCA9IHRydWU7Ci0gIAkKLSAgCUlYU0RBdHRyaWJ1dGVGcmFnbWVudFtdIGF0dHJpYnV0ZUZyYWdtZW50cyA9IGdldEFsbEF0dHJpYnV0ZUZyYWdtZW50cygpOwotICAJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVGcmFnbWVudHMubGVuZ3RoOyBpKyspewotICAJICBpZihhdHRyaWJ1dGVGcmFnbWVudHNbaV0uZ2V0SUQoKS5zdGFydHNXaXRoKGZyYWcuZ2V0SUQoKSkpeyAgCi0gIAkgIAkgIE5hbWVkTm9kZU1hcCBub2RlTWFwID0gaW5zdGFuY2VEb2N1bWVudC5nZXRBdHRyaWJ1dGVzKCk7CQotICAJICAgICAgU3RyaW5nIG5hbWUgPSAoKFhTREF0dHJpYnV0ZVVzZSlhdHRyaWJ1dGVGcmFnbWVudHNbaV0uZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKSkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gIAkgICAgICBwYXJhbXNWYWxpZCA9IGF0dHJpYnV0ZUZyYWdtZW50c1tpXS5nZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKS5zZXRBdHRyaWJ1dGVQYXJhbXNGcm9tSW5zdGFuY2VEb2N1bWVudHMobm9kZU1hcC5nZXROYW1lZEl0ZW0obmFtZSkpOwkKLSAgICAgIH0KLSAgCX0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBzZXRQYXJhbXNGb3JYU0RUeXBlRGVmKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykKLSAgewotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSB0cnVlOwotICAgIHJlbW92ZUFsbEZyYWdtZW50cygpOwotICAgIHJlbW92ZUFsbEF0dHJpYnV0ZUZyYWdtZW50cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIElYU0RGcmFnbWVudCBjaGlsZEZyYWcgPSBnZXRGcmFnbWVudChjcmVhdGVJbnN0YW5jZSgpKTsKLSAgICAgIEVsZW1lbnRbXSBjaGlsZEluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbMV07Ci0gICAgICBjaGlsZEluc3RhbmNlRG9jdW1lbnRzWzBdID0gaW5zdGFuY2VEb2N1bWVudHNbaV07Ci0gICAgICBpZiAoIWNoaWxkRnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoc2V0RWxlbWVudHNUYWdOYW1lKGNoaWxkSW5zdGFuY2VEb2N1bWVudHMsIGNoaWxkRnJhZy5nZXROYW1lKCkpKSkKLSAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgIHNldFBhcmFtc0ZvckF0dHJpYnV0ZXMoY2hpbGRJbnN0YW5jZURvY3VtZW50c1swXSxjaGlsZEZyYWcpOwotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gc2V0UGFyYW1zRm9yWFNEUGFydGljbGUoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKSB7Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IHRydWU7Ci0gICAgcmVtb3ZlQWxsRnJhZ21lbnRzKCk7Ci0gICAgcmVtb3ZlQWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgSVhTREZyYWdtZW50IGNoaWxkRnJhZyA9IGdldEZyYWdtZW50KGNyZWF0ZUluc3RhbmNlKCkpOwotICAgICAgVmVjdG9yIGluc3RhbmNlc1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIAotICAgICAgTm9kZUxpc3QgbmwgPSBpbnN0YW5jZURvY3VtZW50c1tpXS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5sLmdldExlbmd0aCgpOyBqKyspIHsKLSAgICAgICAgTm9kZSBub2RlID0gbmwuaXRlbShqKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIGluc3RhbmNlc1ZlY3Rvci5hZGQobm9kZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgfQotICAgICAgRWxlbWVudFtdIGNoaWxkSW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFtpbnN0YW5jZXNWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgIGluc3RhbmNlc1ZlY3Rvci5jb3B5SW50byhjaGlsZEluc3RhbmNlRG9jdW1lbnRzKTsKLSAgICAgIGlmICghY2hpbGRGcmFnLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhjaGlsZEluc3RhbmNlRG9jdW1lbnRzKSkKLSAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgIHNldFBhcmFtc0ZvckF0dHJpYnV0ZXMoY2hpbGRJbnN0YW5jZURvY3VtZW50c1tpXSxjaGlsZEZyYWcpOwotICAgIAotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSxEb2N1bWVudCBkb2MpIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhUeXBlQ29udGVudCA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5nZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoY29tcGxleFR5cGUpOwotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50czsKLSAgICBTdHJpbmcgdGFnTmFtZSA9IGdldEluc3RhbmNlRG9jdW1lbnRUYWdOYW1lKG5hbWVzcGFjZVRhYmxlKTsKLSAgICBpZiAoY29tcGxleFR5cGVDb250ZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICBpbnN0YW5jZURvY3VtZW50cyA9IGdlbkluc3RhbmNlc0ZvclhTRFR5cGVEZWYoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsIHRhZ05hbWUsZG9jKTsKLSAgICBlbHNlCi0gICAgICBpbnN0YW5jZURvY3VtZW50cyA9IGdlbkluc3RhbmNlc0ZvclhTRFBhcnRpY2xlKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCB0YWdOYW1lLGRvYyk7Ci0gICAgICBpZihnZW5YU0lUeXBlKSBhZGRYU0lUeXBlKGluc3RhbmNlRG9jdW1lbnRzLCBuYW1lc3BhY2VUYWJsZSk7Ci0gIAlyZXR1cm4gaW5zdGFuY2VEb2N1bWVudHM7Ci0gIH0KLQotICBwcml2YXRlIEVsZW1lbnQgYWRkQXR0cmlidXRlcyhFbGVtZW50IGluc3RhbmNlRG9jdW1lbnQsIElYU0RGcmFnbWVudCBmcmFnbWVudCwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlICl7Ci0gIAkKLSAgCUlYU0RBdHRyaWJ1dGVGcmFnbWVudFtdIGF0dHJpYnV0ZUZyYWdtZW50cyA9IGdldEFsbEF0dHJpYnV0ZUZyYWdtZW50cygpOwotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYXR0cmlidXRlRnJhZ21lbnRzLmxlbmd0aDsgaysrKXsKLSAgICAgIGlmKGF0dHJpYnV0ZUZyYWdtZW50c1trXS5nZXRJRCgpLnN0YXJ0c1dpdGgoZnJhZ21lbnQuZ2V0SUQoKSkpewotICAgICAgICBTdHJpbmcgbmFtZSA9ICgoWFNEQXR0cmlidXRlVXNlKWF0dHJpYnV0ZUZyYWdtZW50c1trXS5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpLmdldFhTRENvbXBvbmVudCgpKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICAgICAgYXR0cmlidXRlRnJhZ21lbnRzW2tdLmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLnNldEF0dHJpYnV0ZXNPbkluc3RhbmNlRG9jdW1lbnRzKGluc3RhbmNlRG9jdW1lbnQsbmFtZSk7CQotICAgICAgfQotICAgIH0KLSAgIAkKLSAgIAlyZXR1cm4gaW5zdGFuY2VEb2N1bWVudDsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50W10gZ2VuSW5zdGFuY2VzRm9yWFNEVHlwZURlZihib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgU3RyaW5nIHRhZ05hbWUsRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgSVhTREZyYWdtZW50W10gZnJhZ21lbnRzID0gZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gICAgVmVjdG9yIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgRWxlbWVudFtdIGZyYWdtZW50SW5zdGFuY2VzID0gZnJhZ21lbnRzW2ldLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSxkb2MpOwotICAgICAgaWYgKGZyYWdtZW50SW5zdGFuY2VzLmxlbmd0aCA+IDApewotICAgICAgCWZyYWdtZW50SW5zdGFuY2VzWzBdID0gYWRkQXR0cmlidXRlcyhmcmFnbWVudEluc3RhbmNlc1swXSxmcmFnbWVudHNbaV0sbmFtZXNwYWNlVGFibGUpOwotICAgICAgICBpbnN0YW5jZURvY3VtZW50c0NvcHkuYWRkKGZyYWdtZW50SW5zdGFuY2VzWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbaW5zdGFuY2VEb2N1bWVudHNDb3B5LnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSAoRWxlbWVudClpbnN0YW5jZURvY3VtZW50c0NvcHkuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RWxlbWVudHNUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCB0YWdOYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudFtdIGdlbkluc3RhbmNlc0ZvclhTRFBhcnRpY2xlKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBTdHJpbmcgdGFnTmFtZSxEb2N1bWVudCBkb2MpIHsKLSAgICBJWFNERnJhZ21lbnRbXSBjaGlsZEZyYWdzID0gZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbY2hpbGRGcmFncy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgRWxlbWVudFtdIGNoaWxkSW5zdGFuY2VzID0gY2hpbGRGcmFnc1tpXS5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsZG9jKTsKLSAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgaW5zdGFuY2VEb2N1bWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkSW5zdGFuY2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgaWYgKGNoaWxkSW5zdGFuY2VzW2pdICE9IG51bGwpewotICAgICAgICAgIAlhZGRBdHRyaWJ1dGVzKGNoaWxkSW5zdGFuY2VzW2pdLGNoaWxkRnJhZ3NbaV0sbmFtZXNwYWNlVGFibGUpOyAKLSAgICAgICAgICAJaW5zdGFuY2VEb2N1bWVudC5hcHBlbmRDaGlsZChkb2MuaW1wb3J0Tm9kZShjaGlsZEluc3RhbmNlc1tqXSwgdHJ1ZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnN0YW5jZURvY3VtZW50c1tpXSA9IGluc3RhbmNlRG9jdW1lbnQ7Ci0gICAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhTaW1wbGVDb250ZW50Rml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRSYW5nZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRENvbXBsZXhTaW1wbGVDb250ZW50UmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDliYjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRSYW5nZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqCi0qIDxjb3B5cmlnaHQ+Ci0qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKgotKiA8L2NvcHlyaWdodD4KLSoKLSogRmlsZSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuZXhwbG9yZXIvd3NleHBsb3Jlci9zcmMvY29tL2libS9ldG9vbHMvd2Vic2VydmljZS9leHBsb3Jlci93c2RsL2ZyYWdtZW50L0ltcGwvWFNEQ29tcGxleFJhbmdlRnJhZ21lbnQuamF2YSwgd3NhLmV0b29scy53cy5leHBsb3JlciwgbHVuYXItNS4xLjIgMQotKiBWZXJzaW9uIDEuMSAwMy8wMi8yOCAxNToyNToxOAotKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RBdHRyaWJ1dGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC5YU0RUeXBlRGVmaW5pdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wbGV4U2ltcGxlQ29udGVudFJhbmdlRnJhZ21lbnQgZXh0ZW5kcyBYU0RDb21wbGV4U2ltcGxlQ29udGVudEZpeEZyYWdtZW50IHsKLSAgcHVibGljIFhTRENvbXBsZXhTaW1wbGVDb250ZW50UmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpIHsKLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gZ2V0SW5zdGFuY2VEb2N1bWVudHNCeVRhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHMsIGdldE5hbWUoKSk7Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IGludGVybmFsRXF1YWxzKGluc3RhbmNlRG9jdW1lbnRzQ29weSwgaW5zdGFuY2VEb2N1bWVudHMpOwotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleFR5cGVDb250ZW50ID0gWFNEVHlwZURlZmluaXRpb25VdGlsLmdldFhTRENvbXBsZXhUeXBlQ29udGVudChjb21wbGV4VHlwZSk7Ci0gICAgaWYgKGNvbXBsZXhUeXBlQ29udGVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgcmV0dXJuIHNldFBhcmFtc0ZvclhTRFR5cGVEZWYoaW5zdGFuY2VEb2N1bWVudHNDb3B5KSAmJiBwYXJhbXNWYWxpZDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gc2V0UGFyYW1zRm9yWFNEUGFydGljbGUoaW5zdGFuY2VEb2N1bWVudHNDb3B5KSAmJiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBzZXRQYXJhbXNGb3JBdHRyaWJ1dGVzKEVsZW1lbnQgaW5zdGFuY2VEb2N1bWVudCxJWFNERnJhZ21lbnQgZnJhZyl7Ci0gIAlib29sZWFuIHBhcmFtc1ZhbGlkID0gdHJ1ZTsKLSAgCQotICAJSVhTREF0dHJpYnV0ZUZyYWdtZW50W10gYXR0cmlidXRlRnJhZ21lbnRzID0gZ2V0QWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gIAlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZUZyYWdtZW50cy5sZW5ndGg7IGkrKyl7Ci0gIAkgIGlmKGF0dHJpYnV0ZUZyYWdtZW50c1tpXS5nZXRJRCgpLnN0YXJ0c1dpdGgoZnJhZy5nZXRJRCgpKSl7ICAKLSAgCSAgCSAgTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBpbnN0YW5jZURvY3VtZW50LmdldEF0dHJpYnV0ZXMoKTsJCi0gIAkgICAgICBTdHJpbmcgbmFtZSA9ICgoWFNEQXR0cmlidXRlVXNlKWF0dHJpYnV0ZUZyYWdtZW50c1tpXS5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpLmdldFhTRENvbXBvbmVudCgpKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgCSAgICAgIHBhcmFtc1ZhbGlkID0gYXR0cmlidXRlRnJhZ21lbnRzW2ldLmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLnNldEF0dHJpYnV0ZVBhcmFtc0Zyb21JbnN0YW5jZURvY3VtZW50cyhub2RlTWFwLmdldE5hbWVkSXRlbShuYW1lKSk7CQotICAgICAgfQotICAJfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIHNldFBhcmFtc0ZvclhTRFR5cGVEZWYoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKQotICB7Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IHRydWU7Ci0gICAgcmVtb3ZlQWxsRnJhZ21lbnRzKCk7Ci0gICAgcmVtb3ZlQWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgSVhTREZyYWdtZW50IGNoaWxkRnJhZyA9IGdldEZyYWdtZW50KGNyZWF0ZUluc3RhbmNlKCkpOwotICAgICAgRWxlbWVudFtdIGNoaWxkSW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFsxXTsKLSAgICAgIGNoaWxkSW5zdGFuY2VEb2N1bWVudHNbMF0gPSBpbnN0YW5jZURvY3VtZW50c1tpXTsKLSAgICAgIGlmICghY2hpbGRGcmFnLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhzZXRFbGVtZW50c1RhZ05hbWUoY2hpbGRJbnN0YW5jZURvY3VtZW50cywgY2hpbGRGcmFnLmdldE5hbWUoKSkpKQotICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgc2V0UGFyYW1zRm9yQXR0cmlidXRlcyhjaGlsZEluc3RhbmNlRG9jdW1lbnRzWzBdLGNoaWxkRnJhZyk7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBzZXRQYXJhbXNGb3JYU0RQYXJ0aWNsZShFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpIHsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gdHJ1ZTsKLSAgICByZW1vdmVBbGxGcmFnbWVudHMoKTsKLSAgICByZW1vdmVBbGxBdHRyaWJ1dGVGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBJWFNERnJhZ21lbnQgY2hpbGRGcmFnID0gZ2V0RnJhZ21lbnQoY3JlYXRlSW5zdGFuY2UoKSk7Ci0gICAgICBWZWN0b3IgaW5zdGFuY2VzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgCi0gICAgICBOb2RlTGlzdCBubCA9IGluc3RhbmNlRG9jdW1lbnRzW2ldLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbmwuZ2V0TGVuZ3RoKCk7IGorKykgewotICAgICAgICBOb2RlIG5vZGUgPSBubC5pdGVtKGopOwotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgaW5zdGFuY2VzVmVjdG9yLmFkZChub2RlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBFbGVtZW50W10gY2hpbGRJbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2luc3RhbmNlc1ZlY3Rvci5zaXplKCldOwotICAgICAgaW5zdGFuY2VzVmVjdG9yLmNvcHlJbnRvKGNoaWxkSW5zdGFuY2VEb2N1bWVudHMpOwotICAgICAgaWYgKCFjaGlsZEZyYWcuc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKGNoaWxkSW5zdGFuY2VEb2N1bWVudHMpKQotICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgc2V0UGFyYW1zRm9yQXR0cmlidXRlcyhjaGlsZEluc3RhbmNlRG9jdW1lbnRzW2ldLGNoaWxkRnJhZyk7Ci0gICAgCi0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLERvY3VtZW50IGRvYykgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleFR5cGVDb250ZW50ID0gWFNEVHlwZURlZmluaXRpb25VdGlsLmdldFhTRENvbXBsZXhUeXBlQ29udGVudChjb21wbGV4VHlwZSk7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzOwotICAgIFN0cmluZyB0YWdOYW1lID0gZ2V0SW5zdGFuY2VEb2N1bWVudFRhZ05hbWUobmFtZXNwYWNlVGFibGUpOwotICAgIGlmIChjb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzID0gZ2VuSW5zdGFuY2VzRm9yWFNEVHlwZURlZihnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgdGFnTmFtZSwgZG9jKTsKLSAgICBlbHNlCi0gICAgICBpbnN0YW5jZURvY3VtZW50cyA9IGdlbkluc3RhbmNlc0ZvclhTRFBhcnRpY2xlKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCB0YWdOYW1lLCBkb2MpOwotICAgICAgaWYoZ2VuWFNJVHlwZSkgYWRkWFNJVHlwZShpbnN0YW5jZURvY3VtZW50cywgbmFtZXNwYWNlVGFibGUpOwotICAJcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHJpdmF0ZSBFbGVtZW50IGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBpbnN0YW5jZURvY3VtZW50LCBJWFNERnJhZ21lbnQgZnJhZ21lbnQsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSApewotICAJCi0gIAlJWFNEQXR0cmlidXRlRnJhZ21lbnRbXSBhdHRyaWJ1dGVGcmFnbWVudHMgPSBnZXRBbGxBdHRyaWJ1dGVGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBrID0gMDsgayA8IGF0dHJpYnV0ZUZyYWdtZW50cy5sZW5ndGg7IGsrKyl7Ci0gICAgICBpZihhdHRyaWJ1dGVGcmFnbWVudHNba10uZ2V0SUQoKS5zdGFydHNXaXRoKGZyYWdtZW50LmdldElEKCkpKXsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoKFhTREF0dHJpYnV0ZVVzZSlhdHRyaWJ1dGVGcmFnbWVudHNba10uZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKSkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICAgIGF0dHJpYnV0ZUZyYWdtZW50c1trXS5nZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKS5zZXRBdHRyaWJ1dGVzT25JbnN0YW5jZURvY3VtZW50cyhpbnN0YW5jZURvY3VtZW50LG5hbWUpOwkKLSAgICAgIH0KLSAgICB9Ci0gICAJCi0gICAJcmV0dXJuIGluc3RhbmNlRG9jdW1lbnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudFtdIGdlbkluc3RhbmNlc0ZvclhTRFR5cGVEZWYoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIFN0cmluZyB0YWdOYW1lLERvY3VtZW50IGRvYykKLSAgewotICAgIElYU0RGcmFnbWVudFtdIGZyYWdtZW50cyA9IGdldEFsbEZyYWdtZW50cygpOwotICAgIFZlY3RvciBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIEVsZW1lbnRbXSBmcmFnbWVudEluc3RhbmNlcyA9IGZyYWdtZW50c1tpXS5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsZG9jKTsKLSAgICAgIGlmIChmcmFnbWVudEluc3RhbmNlcy5sZW5ndGggPiAwKXsKLSAgICAgIAlmcmFnbWVudEluc3RhbmNlc1swXSA9IGFkZEF0dHJpYnV0ZXMoZnJhZ21lbnRJbnN0YW5jZXNbMF0sZnJhZ21lbnRzW2ldLG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgICAgaW5zdGFuY2VEb2N1bWVudHNDb3B5LmFkZChmcmFnbWVudEluc3RhbmNlc1swXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2luc3RhbmNlRG9jdW1lbnRzQ29weS5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2ldID0gKEVsZW1lbnQpaW5zdGFuY2VEb2N1bWVudHNDb3B5LmdldChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEVsZW1lbnRzVGFnTmFtZShpbnN0YW5jZURvY3VtZW50cywgdGFnTmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIEVsZW1lbnRbXSBnZW5JbnN0YW5jZXNGb3JYU0RQYXJ0aWNsZShib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgU3RyaW5nIHRhZ05hbWUsRG9jdW1lbnQgZG9jKSB7Ci0gICAgSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGdldEFsbEZyYWdtZW50cygpOwotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2NoaWxkRnJhZ3MubGVuZ3RoXTsKLSAgICAKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgRWxlbWVudFtdIGNoaWxkSW5zdGFuY2VzID0gY2hpbGRGcmFnc1tpXS5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsIGRvYyk7Ci0gICAgICAgIAotICAgICAgICBFbGVtZW50IGluc3RhbmNlRG9jdW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZEluc3RhbmNlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgIGlmIChjaGlsZEluc3RhbmNlc1tqXSAhPSBudWxsKXsKLSAgICAgICAgICAJYWRkQXR0cmlidXRlcyhjaGlsZEluc3RhbmNlc1tqXSxjaGlsZEZyYWdzW2ldLG5hbWVzcGFjZVRhYmxlKTsgCi0gICAgICAgICAgCWluc3RhbmNlRG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmltcG9ydE5vZGUoY2hpbGRJbnN0YW5jZXNbal0sIHRydWUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSBpbnN0YW5jZURvY3VtZW50OwotICAgICAgfQotICAgIHJldHVybiBpbnN0YW5jZURvY3VtZW50czsKLSAgfQotCi0gIAotICAKLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4U2ltcGxlQ29udGVudFJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRSYW5nZVdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRERlZmF1bHRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0REZWZhdWx0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjZTAwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRERlZmF1bHRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgWFNERGVmYXVsdEZyYWdtZW50IGV4dGVuZHMgWFNERnJhZ21lbnQgewotICBwdWJsaWMgWFNERGVmYXVsdEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nW10gcGFyYW0gPSBuZXcgU3RyaW5nWzFdOwotICAgIHBhcmFtWzBdID0gcGFyc2VyLmdldFBhcmFtZXRlcihnZXRJRCgpKTsKLSAgICBzZXRQYXJhbWV0ZXJWYWx1ZXMoZ2V0SUQoKSwgcGFyYW0pOwotICAgIHJldHVybiBpc0VsZW1lbnQoYWRkUm9vdEVsZW1lbnQocGFyYW1bMF0pKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFkZFJvb3RFbGVtZW50KFN0cmluZyBlbGVtZW50KSB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHNiLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5ST09UX0VMRU1FTlRfU1RBUlRfVEFHKTsKLSAgICBzYi5hcHBlbmQoZWxlbWVudCk7Ci0gICAgc2IuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlJPT1RfRUxFTUVOVF9FTkRfVEFHKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnQoU3RyaW5nIGVsZW1lbnRTdHJpbmcpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIChYTUxVdGlscy5zdHJpbmdUb0VsZW1lbnQoZWxlbWVudFN0cmluZykgIT0gbnVsbCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkgewotICAgIFN0cmluZyBwYXJhbSA9IGdldFBhcmFtZXRlclZhbHVlKGdldElEKCksIDApOwotICAgIHJldHVybiAocGFyYW0gPT0gbnVsbCB8fCBpc0VsZW1lbnQoYWRkUm9vdEVsZW1lbnQocGFyYW0pKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpIHsKLSAgICBTdHJpbmcgcGFyYW0gPSBnZXRQYXJhbWV0ZXJWYWx1ZShnZXRJRCgpLCAwKTsKLSAgICByZXR1cm4gKHBhcmFtID09IG51bGwgfHwgaXNFbGVtZW50KGFkZFJvb3RFbGVtZW50KHBhcmFtKSkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgcGFyYW1LZXksIGludCBwYXJhbUluZGV4KSB7Ci0gICAgU3RyaW5nIHBhcmFtID0gZ2V0UGFyYW1ldGVyVmFsdWUoZ2V0SUQoKSwgMCk7Ci0gICAgcmV0dXJuIChwYXJhbSA9PSBudWxsIHx8IGlzRWxlbWVudChhZGRSb290RWxlbWVudChwYXJhbSkpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpIHsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgYm9vbGVhbiBwYXJhbVZhbGlkID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBTdHJpbmcgaW5zdGFuY2VTdHJpbmcgPSBYTUxVdGlscy5zZXJpYWxpemUoaW5zdGFuY2VEb2N1bWVudHNbaV0sIHRydWUpOwotICAgICAgaWYgKGluc3RhbmNlU3RyaW5nICE9IG51bGwgJiYgaW5zdGFuY2VTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgICAgICBzYi5hcHBlbmQoaW5zdGFuY2VTdHJpbmcpOwotICAgICAgZWxzZQotICAgICAgICBwYXJhbVZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIFN0cmluZ1tdIHBhcmFtID0ge3NiLnRvU3RyaW5nKCl9OwotICAgIHNldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpLCBwYXJhbSk7Ci0gICAgcmV0dXJuIHBhcmFtVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgRG9jdW1lbnQgZG9jKSB7Ci0gICAgU3RyaW5nIHBhcmFtID0gZ2V0UGFyYW1ldGVyVmFsdWUoZ2V0SUQoKSwgMCk7Ci0gICAgaWYgKHBhcmFtID09IG51bGwpCi0gICAgICByZXR1cm4gbmV3IEVsZW1lbnRbMF07Ci0gICAgRWxlbWVudCByb290OwotICAgIHRyeSB7Ci0gICAgICByb290ID0gKEVsZW1lbnQpZG9jLmltcG9ydE5vZGUoWE1MVXRpbHMuc3RyaW5nVG9FbGVtZW50KGFkZFJvb3RFbGVtZW50KHBhcmFtKSksIHRydWUpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgIHJldHVybiBuZXcgRWxlbWVudFswXTsKLSAgICB9Ci0gICAgTm9kZUxpc3QgbmwgPSByb290LmdldENoaWxkTm9kZXMoKTsKLSAgICBWZWN0b3IgaW5zdGFuY2VEb2N1bWVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIGluc3RhbmNlRG9jdW1lbnRWZWN0b3IuYWRkKG5vZGUpOwotICAgIH0KLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFtpbnN0YW5jZURvY3VtZW50VmVjdG9yLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSAoRWxlbWVudClpbnN0YW5jZURvY3VtZW50VmVjdG9yLmdldChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0UkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERGVsZWdhdGlvbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRERlbGVnYXRpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2IyMjllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERGVsZWdhdGlvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0REZWxlZ2F0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0REZWxlZ2F0aW9uRnJhZ21lbnQgZXh0ZW5kcyBYU0RGcmFnbWVudCBpbXBsZW1lbnRzIElYU0REZWxlZ2F0aW9uRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBJWFNERnJhZ21lbnQgeHNkRnJhZ21lbnRfOwotCi0gIHB1YmxpYyBYU0REZWxlZ2F0aW9uRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgeHNkRnJhZ21lbnRfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICBzdXBlci5zZXROYW1lKG5hbWUpOwotICAgIGlmICh4c2RGcmFnbWVudF8gIT0gbnVsbCkKLSAgICAgIHhzZEZyYWdtZW50Xy5zZXROYW1lKG5hbWUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHhzZEZyYWdtZW50Xy5wcm9jZXNzUGFyYW1ldGVyVmFsdWVzKHBhcnNlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5LCBTdHJpbmdbXSBwYXJhbXMpCi0gIHsKLSAgICB4c2RGcmFnbWVudF8uc2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtS2V5LCBwYXJhbXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSwgVmVjdG9yIHBhcmFtcykKLSAgewotICAgIHhzZEZyYWdtZW50Xy5zZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXksIHBhcmFtcyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSkKLSAgewotICAgIHJldHVybiB4c2RGcmFnbWVudF8uZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtS2V5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyVmFsdWUoU3RyaW5nIHBhcmFtS2V5LCBpbnQgcGFyYW1JbmRleCkKLSAgewotICAgIHJldHVybiB4c2RGcmFnbWVudF8uZ2V0UGFyYW1ldGVyVmFsdWUocGFyYW1LZXksIHBhcmFtSW5kZXgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKQotICB7Ci0gICAgcmV0dXJuIHhzZEZyYWdtZW50Xy52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KQotICB7Ci0gICAgcmV0dXJuIHhzZEZyYWdtZW50Xy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhwYXJhbUtleSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlKFN0cmluZyBwYXJhbUtleSwgaW50IHBhcmFtSW5kZXgpCi0gIHsKLSAgICByZXR1cm4geHNkRnJhZ21lbnRfLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWUocGFyYW1LZXksIHBhcmFtSW5kZXgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykKLSAgewotICAgIHJldHVybiB4c2RGcmFnbWVudF8uc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICByZXR1cm4geHNkRnJhZ21lbnRfLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgZG9jKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpCi0gIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvblJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvbldGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KElYU0RGcmFnbWVudCB4c2RGcmFnbWVudCkKLSAgewotICAgIHhzZEZyYWdtZW50XyA9IHhzZEZyYWdtZW50OwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKQotICB7Ci0gICAgcmV0dXJuIHhzZEZyYWdtZW50XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RFbGVtZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERWxlbWVudEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMWIzY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RFbGVtZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMTE5ICAgMTIzNTM5IGplc3BlckBzZWxza2FiZXQub3JnIC0gSmVzcGVyIE34bGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RFbGVtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZvcm07Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudEZyYWdtZW50IGV4dGVuZHMgWFNERGVsZWdhdGlvbkZyYWdtZW50IGltcGxlbWVudHMgSVhTREVsZW1lbnRGcmFnbWVudAotewotICBwcml2YXRlIGludCBtaW5PY2N1cnNfOwotICBwcml2YXRlIGludCBtYXhPY2N1cnNfOwotICBwcml2YXRlIGJvb2xlYW4gaXNOaWxfOwotIAotICAKLSAgcHVibGljIFhTREVsZW1lbnRGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpCi0gIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnKTsKLSAgICBpZiAoY29uZmlnICE9IG51bGwpCi0gICAgewotICAgICAgbWluT2NjdXJzXyA9IGNvbmZpZy5nZXRNaW5PY2N1cnMoKTsKLSAgICAgIG1heE9jY3Vyc18gPSBjb25maWcuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtaW5PY2N1cnNfID0gRnJhZ21lbnRDb25zdGFudHMuREVGQVVMVF9NSU5fT0NDVVJTOwotICAgICAgbWF4T2NjdXJzXyA9IEZyYWdtZW50Q29uc3RhbnRzLkRFRkFVTFRfTUFYX09DQ1VSUzsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUGFyYW1ldGVyVmFsdWVzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBJWFNERnJhZ21lbnQgZWxlbWVudFR5cGVGcmFnbWVudCA9IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIHNldElzTmlsKHBhcnNlcik7Ci0gICAgaWYoaXNOaWxfKXJldHVybiB0cnVlOwotICAgIAkKLSAgICBpZiAoIWVsZW1lbnRUeXBlRnJhZ21lbnQucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IGdldFBhcmFtZXRlclZhbHVlcyhlbGVtZW50VHlwZUZyYWdtZW50LmdldElEKCkpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCAmJiAhd2l0aGluUmFuZ2UocGFyYW1zLmxlbmd0aCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRJc05pbChNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5pbCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoZ2V0TmlsSUQoKSk7Ci0gICAgaWYobmlsICE9IG51bGwpIGlzTmlsXyA9IHRydWU7Ci0gICAgZWxzZSBpc05pbF8gPSBmYWxzZTsKLSAgICByZXR1cm4gaXNOaWxfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpCi0gIHsKLSAgICBJWFNERnJhZ21lbnQgZWxlbWVudFR5cGVGcmFnbWVudCA9IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IGdldFBhcmFtZXRlclZhbHVlcyhlbGVtZW50VHlwZUZyYWdtZW50LmdldElEKCkpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCAmJiAhd2l0aGluUmFuZ2UocGFyYW1zLmxlbmd0aCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFlbGVtZW50VHlwZUZyYWdtZW50LnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpCi0gIHsKLSAgICBTdHJpbmdbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXkpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCAmJiAhd2l0aGluUmFuZ2UocGFyYW1zLmxlbmd0aCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKS52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhwYXJhbUtleSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlKFN0cmluZyBwYXJhbUtleSwgaW50IHBhcmFtSW5kZXgpCi0gIHsKLSAgICBpZiAoIXdpdGhpblJhbmdlKHBhcmFtSW5kZXggKyAxKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBTdHJpbmcgcGFyYW0gPSBnZXRQYXJhbWV0ZXJWYWx1ZShwYXJhbUtleSwgcGFyYW1JbmRleCk7Ci0gICAgaWYgKHBhcmFtICE9IG51bGwgJiYgcGFyYW0ubGVuZ3RoKCkgPD0gMCAmJiAheHNkRWxlbWVudC5pc05pbGxhYmxlKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKS52YWxpZGF0ZVBhcmFtZXRlclZhbHVlKHBhcmFtS2V5LCBwYXJhbUluZGV4KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykKLSAgewotICAgIHN1cGVyLnNldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0gICAgbWluT2NjdXJzXyA9IGNvbmZpZy5nZXRNaW5PY2N1cnMoKTsKLSAgICBtYXhPY2N1cnNfID0gY29uZmlnLmdldE1heE9jY3VycygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykKLSAgewotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBpbnN0YW5jZURvY3VtZW50czsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIFN0cmluZyB3c2RsUGFydE5hbWUgPSBjb25maWcuZ2V0V1NETFBhcnROYW1lKCk7Ci0gICAgTm9kZUxpc3QgbmwgPSBpbnN0YW5jZURvY3VtZW50c0NvcHlbMF0uZ2V0Q2hpbGROb2RlcygpOwotICAgIAotICAgIGlmKGluc3RhbmNlRG9jdW1lbnRzQ29weVswXS5oYXNBdHRyaWJ1dGUoWFNJX05JTF9BVFRSSUJVVEUpKXsKLSAgICAgIFN0cmluZyBuaWwgPSBpbnN0YW5jZURvY3VtZW50c0NvcHlbMF0uZ2V0QXR0cmlidXRlKFhTSV9OSUxfQVRUUklCVVRFKTsKLSAgICAgIGlmKG5pbC5lcXVhbHMoVFJVRSkpIGlzTmlsXyA9IHRydWU7IAotICAgIH0gIAotICAgIAotICAgIAotICAgIGlmIChjb25maWcuZ2V0SXNXU0RMUGFydCgpICYmIGNvbmZpZy5nZXRTdHlsZSgpID09IEZyYWdtZW50Q29uc3RhbnRzLlNUWUxFX1JQQyAmJiB3c2RsUGFydE5hbWUgIT0gbnVsbCAmJiB3c2RsUGFydE5hbWUubGVuZ3RoKCkgPiAwICYmIGluc3RhbmNlRG9jdW1lbnRzQ29weS5sZW5ndGggPT0gMSAmJiB3c2RsUGFydE5hbWUuZXF1YWxzKGluc3RhbmNlRG9jdW1lbnRzQ29weVswXS5nZXRUYWdOYW1lKCkpKQotICAgIHsKLSAgICAgIFZlY3RvciBjaGlsZEVsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBubC5pdGVtKGkpOwotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKG5vZGUpOwotICAgICAgfQotICAgICAgaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gKEVsZW1lbnRbXSljaGlsZEVsZW1lbnRzLnRvQXJyYXkobmV3IEVsZW1lbnRbMF0pOwotICAgIH0KLSAgICBJWFNERnJhZ21lbnQgZWxlbWVudFR5cGVGcmFnbWVudCA9IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGdldEluc3RhbmNlRG9jdW1lbnRzQnlUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzQ29weSwgZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gZWxlbWVudFR5cGVGcmFnbWVudC5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoc2V0RWxlbWVudHNUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzQ29weSwgZWxlbWVudFR5cGVGcmFnbWVudC5nZXROYW1lKCkpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTSV9OSUxfQVRUUklCVVRFID0gInhzaTpuaWwiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBUUlVFID0gInRydWUiOwotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgRG9jdW1lbnQgZG9jKQotICB7Ci0gIAkKLSAgCUVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgZG9jKTsKLSAgICBpZihpc05pbF8peyAKLSAgICAgIGZvcihpbnQgaj0wO2ogPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7aisrKXsgIAotICAgICAgCWluc3RhbmNlRG9jdW1lbnRzW2pdLnNldEF0dHJpYnV0ZShYU0lfTklMX0FUVFJJQlVURSxUUlVFKTsKLSAgICAgIAlOb2RlTGlzdCBub2RlTGlzdCA9IGluc3RhbmNlRG9jdW1lbnRzW2pdLmdldENoaWxkTm9kZXMoKTsgCi0gICAgICAgIGludCBsZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgICAgZm9yKGludCBpID0wO2kgPCBsZW5ndGg7aSsrKXsKLSAgICAgICAgICBpbnN0YW5jZURvY3VtZW50c1tqXS5yZW1vdmVDaGlsZChub2RlTGlzdC5pdGVtKDApKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfQotICAgIGluc3RhbmNlRG9jdW1lbnRzID0gc2V0RWxlbWVudHNUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCBnZXRJbnN0YW5jZURvY3VtZW50VGFnTmFtZShuYW1lc3BhY2VUYWJsZSkpOwotICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgU3RyaW5nIHdzZGxQYXJ0TmFtZSA9IGNvbmZpZy5nZXRXU0RMUGFydE5hbWUoKTsKLSAgICBpZiAoY29uZmlnLmdldElzV1NETFBhcnQoKSAmJiBjb25maWcuZ2V0U3R5bGUoKSA9PSBGcmFnbWVudENvbnN0YW50cy5TVFlMRV9SUEMgJiYgd3NkbFBhcnROYW1lICE9IG51bGwgJiYgd3NkbFBhcnROYW1lLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gaW5zdGFuY2VEb2N1bWVudHM7Ci0gICAgICBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50WzFdOwotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbMF0gPSBkb2MuY3JlYXRlRWxlbWVudCh3c2RsUGFydE5hbWUpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChpbnN0YW5jZURvY3VtZW50c0NvcHlbaV0gIT0gbnVsbCkKLSAgICAgICAgICBpbnN0YW5jZURvY3VtZW50c1swXS5hcHBlbmRDaGlsZChpbnN0YW5jZURvY3VtZW50c0NvcHlbaV0pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VEb2N1bWVudHM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luc3RhbmNlTmFtZXNwYWNlUXVhbGlmaWVkKCkKLSAgewotICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgaWYgKGNvbmZpZy5nZXRQYXJ0RW5jb2RpbmcoKSA9PSBGcmFnbWVudENvbnN0YW50cy5FTkNPRElOR19MSVRFUkFMKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbiljb25maWcuZ2V0WFNEQ29tcG9uZW50KCk7Ci0gICAgICAvLyBUcnkgdG8gcmVzb2x2ZSB0aGUgZWxlbWVudCwgc2luY2UgYW4gZWxlbWVudCB3aXRoIGEgcmVmIGNhbiBuZXZlciBiZSBnbG9iYWwKLSAgICAgIGlmICh4c2RFbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgeHNkRWxlbWVudCA9IHhzZEVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgIAotICAgICAgaWYgKHhzZEVsZW1lbnQuaXNHbG9iYWwoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh4c2RFbGVtZW50LmlzU2V0Rm9ybSgpKQotICAgICAgICAgIHJldHVybiAoeHNkRWxlbWVudC5nZXRGb3JtKCkuZ2V0VmFsdWUoKSA9PSBYU0RGb3JtLlFVQUxJRklFRCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gKHhzZEVsZW1lbnQuZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0VmFsdWUoKSA9PSBYU0RGb3JtLlFVQUxJRklFRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zdGFuY2VEb2N1bWVudFRhZ05hbWUoSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIFN0cmluZ0J1ZmZlciB0YWdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChpc0luc3RhbmNlTmFtZXNwYWNlUXVhbGlmaWVkKCkpCi0gICAgewotICAgICAgU3RyaW5nIG5zVVJJID0gbnVsbDsKLSAgICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgICBpZiAoeHNkRWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpICE9IG51bGwpCi0gICAgICAgIG5zVVJJID0geHNkRWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgZWxzZQotICAgICAgICBuc1VSSSA9IHhzZEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobnNVUkkgIT0gbnVsbCAmJiBuc1VSSS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXhGcm9tTmFtZXNwYWNlVVJJKG5zVVJJLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgIHRhZ05hbWUuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIHRhZ05hbWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nIHhzZEVsZW1lbnROYW1lID0geHNkRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgaWYgKHhzZEVsZW1lbnROYW1lID09IG51bGwgfHwgeHNkRWxlbWVudE5hbWUubGVuZ3RoKCkgPD0gMCkKLSAgICB7Ci0gICAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgICAgaWYgKHhzZEVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsKQotICAgICAgICB4c2RFbGVtZW50TmFtZSA9IHhzZEVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHhzZEVsZW1lbnROYW1lID0gZ2V0TmFtZSgpOwotICAgIH0KLSAgICB0YWdOYW1lLmFwcGVuZCh4c2RFbGVtZW50TmFtZSk7Ci0gICAgcmV0dXJuIHRhZ05hbWUudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiB3aXRoaW5SYW5nZShpbnQgc2l6ZSkKLSAgewotICAgIGlmIChzaXplIDwgbWluT2NjdXJzXykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAobWF4T2NjdXJzXyAhPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQgJiYgc2l6ZSA+IG1heE9jY3Vyc18pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoaW50IG1pbk9jY3VycykKLSAgewotICAgIG1pbk9jY3Vyc18gPSBtaW5PY2N1cnM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gbWluT2NjdXJzXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhpbnQgbWF4T2NjdXJzKQotICB7Ci0gICAgbWF4T2NjdXJzXyA9IG1heE9jY3VyczsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkKLSAgewotICAgIHJldHVybiBtYXhPY2N1cnNfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc05pbGxhYmxlKCkKLSAgewotICAJaWYoZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJuaWxsYWJsZSIpLmVxdWFscygidHJ1ZSIpKQotICAJICByZXR1cm4gdHJ1ZTsKLSAgCXJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNOaWwoKQotICB7Ci0gIAlyZXR1cm4gaXNOaWxfOwotICB9Ci0gIAotICAKLSAgcHVibGljIFN0cmluZyBnZXROaWxJRCgpCi0gIHsKLSAgCXJldHVybiBnZXRJRCgpICsgSVhTREVsZW1lbnRGcmFnbWVudC5OSUw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKQotICB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpCi0gIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREVsZW1lbnRSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpCi0gIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREVsZW1lbnRXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREVtcHR5RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERW1wdHlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2FiZjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERW1wdHlGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFhTREVtcHR5RnJhZ21lbnQgZXh0ZW5kcyBYU0RGcmFnbWVudCB7Ci0gIHByaXZhdGUgaW50IG9jY3VyYW5jZV87Ci0KLSAgcHVibGljIFhTREVtcHR5RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgb2NjdXJhbmNlXyA9IDA7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUGFyYW1ldGVyVmFsdWVzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgb2NjdXJhbmNlID0gcGFyc2VyLmdldFBhcmFtZXRlcihnZXRJRCgpKTsKLSAgICB0cnkgewotICAgICAgb2NjdXJhbmNlXyA9IEludGVnZXIucGFyc2VJbnQob2NjdXJhbmNlKTsKLSAgICAgIHJldHVybiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgIG9jY3VyYW5jZV8gPSAtMTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5LCBTdHJpbmdbXSBwYXJhbXMpIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXksIFZlY3RvciBwYXJhbXMpIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KSB7Ci0gICAgaWYgKG9jY3VyYW5jZV8gPCAwKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZWxzZSB7Ci0gICAgICBTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nW29jY3VyYW5jZV9dOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgcGFyYW1zW2ldID0gIiI7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyVmFsdWUoU3RyaW5nIHBhcmFtS2V5LCBpbnQgcGFyYW1JbmRleCkgewotICAgIGlmIChwYXJhbUluZGV4ID49IDAgJiYgcGFyYW1JbmRleCA8IG9jY3VyYW5jZV8pCi0gICAgICByZXR1cm4gIiI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpIHsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIGludCBtaW4gPSB4c2RDb25maWcuZ2V0TWluT2NjdXJzKCk7Ci0gICAgaW50IG1heCA9IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsKLSAgICByZXR1cm4gKG9jY3VyYW5jZV8gPj0gMCAmJiBvY2N1cmFuY2VfID49IG1pbiAmJiAobWF4ID09IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCB8fCBvY2N1cmFuY2VfIDw9IG1heCkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KSB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlKFN0cmluZyBwYXJhbUtleSwgaW50IHBhcmFtSW5kZXgpIHsKLSAgICByZXR1cm4gdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpIHsKLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gZ2V0SW5zdGFuY2VEb2N1bWVudHNCeVRhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHMsIGdldE5hbWUoKSk7Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoOyBpKyspIHsKLSAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gaW5zdGFuY2VEb2N1bWVudHNDb3B5W2ldLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUgfHwgIWlzV2hpdGVzcGFjZShub2RlLmdldE5vZGVWYWx1ZSgpKSkKLSAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBvY2N1cmFuY2VfID0gaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aDsKLSAgICByZXR1cm4gcGFyYW1zVmFsaWQgJiYgdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc1doaXRlc3BhY2UoU3RyaW5nIHMpIHsKLSAgICBjaGFyW10gY2hhcnMgPSBzLnRvQ2hhckFycmF5KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2ldKSB8fCAhQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKGNoYXJzW2ldKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREVtcHR5V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREVtcHR5UkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliZTIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNERnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCBpbXBsZW1lbnRzIElYU0RGcmFnbWVudAotewotICBwcml2YXRlIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZ187Ci0gIHByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZl87Ci0gIHByaXZhdGUgaW50IHNlZWRfOwotCi0gIHB1YmxpYyBYU0RGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpCi0gIHsKLSAgICBzdXBlcihpZCwgbmFtZSk7Ci0gICAgY29uZmlnXyA9IGNvbmZpZzsKLSAgICBpZiAoY29uZmlnXyAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBvbmVudCBjb21wb25lbnQgPSBjb25maWcuZ2V0WFNEQ29tcG9uZW50KCk7Ci0gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgIHR5cGVEZWZfID0gKFhTRFR5cGVEZWZpbml0aW9uKWNvbXBvbmVudDsKLSAgICAgIGVsc2UKLSAgICAgICAgdHlwZURlZl8gPSBudWxsOwotICAgIH0KLSAgICBzZWVkXyA9IDA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbihYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpCi0gIHsKLSAgICBjb25maWdfID0gY29uZmlnOwotICAgIGlmIChjb25maWdfICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgc2V0WFNEVHlwZURlZmluaXRpb24oKFhTRFR5cGVEZWZpbml0aW9uKWNvbXBvbmVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCkKLSAgewotICAgIHJldHVybiBjb25maWdfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNEVHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZURlZikKLSAgewotICAgIHR5cGVEZWZfID0gdHlwZURlZjsKLSAgfQotCi0gIHB1YmxpYyBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdHlwZURlZl87Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKQotICB7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGdldEluc3RhbmNlRG9jdW1lbnRzQnlUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCBnZXROYW1lKCkpOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aF07Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IGludGVybmFsRXF1YWxzKGluc3RhbmNlRG9jdW1lbnRzQ29weSwgaW5zdGFuY2VEb2N1bWVudHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHBhcmFtc1tpXSA9ICIiOwotICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBpbnN0YW5jZURvY3VtZW50c0NvcHlbaV0uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwYXJhbXNbaV0gPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICBzZXRQYXJhbWV0ZXJWYWx1ZXMoZ2V0SUQoKSwgcGFyYW1zKTsKLSAgICByZXR1cm4gcGFyYW1zVmFsaWQgJiYgdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50W10gZ2V0SW5zdGFuY2VEb2N1bWVudHNCeVRhZ05hbWUoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzLCBTdHJpbmcgdGFnTmFtZSkKLSAgewotICAgIGlmIChpbnN0YW5jZURvY3VtZW50cyA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBFbGVtZW50WzBdOwotICAgIFZlY3RvciBpbnN0YW5jZXNDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzW2ldID09IG51bGwpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgU3RyaW5nIGluc3RhbmNlVGFnTmFtZSA9IHRyaW1QcmVmaXgoaW5zdGFuY2VEb2N1bWVudHNbaV0uZ2V0VGFnTmFtZSgpKTsKLSAgICAgIGlmIChpbnN0YW5jZVRhZ05hbWUuZXF1YWxzKHRhZ05hbWUpKQotICAgICAgICBpbnN0YW5jZXNDb3B5LmFkZChpbnN0YW5jZURvY3VtZW50c1tpXSk7Ci0gICAgfQotICAgIEVsZW1lbnRbXSBpbnN0YW5jZXMgPSBuZXcgRWxlbWVudFtpbnN0YW5jZXNDb3B5LnNpemUoKV07Ci0gICAgaW5zdGFuY2VzQ29weS5jb3B5SW50byhpbnN0YW5jZXMpOwotICAgIHJldHVybiBpbnN0YW5jZXM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHRyaW1QcmVmaXgoU3RyaW5nIHMpCi0gIHsKLSAgICBTdHJpbmcgc0NvcHkgPSBuZXcgU3RyaW5nKHMpOwotICAgIGludCBjb2xvbkluZGV4ID0gc0NvcHkuaW5kZXhPZihGcmFnbWVudENvbnN0YW50cy5DT0xPTik7Ci0gICAgaWYgKGNvbG9uSW5kZXggIT0gLTEgJiYgY29sb25JbmRleCArIDEgPCBzQ29weS5sZW5ndGgoKSAmJiAhKChTdHJpbmcudmFsdWVPZihzQ29weS5jaGFyQXQoY29sb25JbmRleCArIDEpKSkuZXF1YWxzKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKSkpCi0gICAgICBzQ29weSA9IHNDb3B5LnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMSwgc0NvcHkubGVuZ3RoKCkpOwotICAgIHJldHVybiBzQ29weTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGb3JOaWwoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsRG9jdW1lbnQgZG9jKXsKLSAgCUVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50WzFdOwotICAgIFN0cmluZyB0YWdOYW1lID0gZ2V0SW5zdGFuY2VEb2N1bWVudFRhZ05hbWUobmFtZXNwYWNlVGFibGUpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICBFbGVtZW50IGluc3RhbmNlRG9jdW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLSAgICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSBpbnN0YW5jZURvY3VtZW50OwotICAgICAgfQotICAgIHJldHVybiAoZ2VuWFNJVHlwZSA/IGFkZFhTSVR5cGUoaW5zdGFuY2VEb2N1bWVudHMsIG5hbWVzcGFjZVRhYmxlKSA6IGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgCQotICB9Ci0gIAotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSxEb2N1bWVudCBkb2MpIHsKLSAgICBTdHJpbmdbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJWYWx1ZXMoZ2V0SUQoKSk7Ci0gICAgaWYgKHBhcmFtcyA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBFbGVtZW50WzBdOwotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W3BhcmFtcy5sZW5ndGhdOwotICAgIFN0cmluZyB0YWdOYW1lID0gZ2V0SW5zdGFuY2VEb2N1bWVudFRhZ05hbWUobmFtZXNwYWNlVGFibGUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCBpbnN0YW5jZURvY3VtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0gICAgICBOb2RlIHRleHROb2RlID0gZG9jLmNyZWF0ZVRleHROb2RlKHBhcmFtc1tpXSk7Ci0gICAgICBpbnN0YW5jZURvY3VtZW50LmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2ldID0gaW5zdGFuY2VEb2N1bWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIChnZW5YU0lUeXBlID8gYWRkWFNJVHlwZShpbnN0YW5jZURvY3VtZW50cywgbmFtZXNwYWNlVGFibGUpIDogaW5zdGFuY2VEb2N1bWVudHMpOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgc2V0QXR0cmlidXRlc09uSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudCBpbnN0YW5jZURvY3VtZW50LFN0cmluZyBhdHROYW1lKXsKLSAgCVN0cmluZ1tdIHBhcmFtcyA9IGdldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpKTsKLSAgICBpZiAocGFyYW1zID09IG51bGwpCi0gICAgICByZXR1cm4gaW5zdGFuY2VEb2N1bWVudDsKLSAgICBpZiAoaXNBdHRyaWJ1dGVJbnN0YW5jZU5hbWVzcGFjZVF1YWxpZmllZCgpKXsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnQuc2V0QXR0cmlidXRlTlMoY29uZmlnXy5nZXRYU0RDb21wb25lbnQoKS5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSxhdHROYW1lLHBhcmFtc1swXSk7Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZSBpbnN0YW5jZURvY3VtZW50LnNldEF0dHJpYnV0ZShhdHROYW1lLHBhcmFtc1swXSk7Ci0gICAgCi0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNldEF0dHJpYnV0ZVBhcmFtc0Zyb21JbnN0YW5jZURvY3VtZW50cyhOb2RlIGF0dHJpYnV0ZSl7Ci0gIAlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzFdOwotICAJcGFyYW1zWzBdID0gYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOyAKLSAgCXNldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpLCBwYXJhbXMpOwotICAgIHJldHVybiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdlbklEKCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBuZXdJRCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBuZXdJRC5hcHBlbmQoZ2V0SUQoKSk7Ci0gICAgbmV3SUQuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLklEX1NFUEVSQVRPUik7Ci0gICAgbmV3SUQuYXBwZW5kKHNlZWRfKyspOwotICAgIHJldHVybiBuZXdJRC50b1N0cmluZygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnN0YW5jZU5hbWVzcGFjZVF1YWxpZmllZCgpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gY29uZmlnXy5nZXRYU0RDb21wb25lbnQoKS5nZXRTY2hlbWEoKTsKLSAgICByZXR1cm4gKCFjb25maWdfLmdldElzV1NETFBhcnQoKSAmJiBjb25maWdfLmdldFBhcnRFbmNvZGluZygpID09IEZyYWdtZW50Q29uc3RhbnRzLkVOQ09ESU5HX0xJVEVSQUwgJiYgeHNkU2NoZW1hLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpLmdldFZhbHVlKCkgPT0gWFNERm9ybS5RVUFMSUZJRUQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBdHRyaWJ1dGVJbnN0YW5jZU5hbWVzcGFjZVF1YWxpZmllZCgpIHsKLSAgCVhTRFNjaGVtYSB4c2RTY2hlbWEgPSBjb25maWdfLmdldFhTRENvbXBvbmVudCgpLmdldFNjaGVtYSgpOwotICAgIAotICAgIHJldHVybiAoIWNvbmZpZ18uZ2V0SXNXU0RMUGFydCgpICYmCi0gICAgICAgICAgICAgICAgY29uZmlnXy5nZXRQYXJ0RW5jb2RpbmcoKSA9PSBGcmFnbWVudENvbnN0YW50cy5FTkNPRElOR19MSVRFUkFMICYmCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkuZ2V0VmFsdWUoKSA9PSBYU0RGb3JtLlFVQUxJRklFRCk7Ci0KLSAgfQotCi0gCi0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEluc3RhbmNlRG9jdW1lbnRUYWdOYW1lKEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSkgewotICAgIFN0cmluZ0J1ZmZlciB0YWdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChpc0luc3RhbmNlTmFtZXNwYWNlUXVhbGlmaWVkKCkpCi0gICAgewotICAgICAgU3RyaW5nIG5zVVJJID0gY29uZmlnXy5nZXRYU0RDb21wb25lbnQoKS5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXhGcm9tTmFtZXNwYWNlVVJJKG5zVVJJLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB0YWdOYW1lLmFwcGVuZChwcmVmaXgpOwotICAgICAgdGFnTmFtZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuQ09MT04pOwotICAgIH0KLSAgICB0YWdOYW1lLmFwcGVuZChnZXROYW1lKCkpOwotICAgIHJldHVybiB0YWdOYW1lLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudFtdIGFkZFhTSVR5cGUoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsKLSAgICBYU0RDb21wb25lbnQgeHNkQ29tcG9uZW50ID0gY29uZmlnXy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBpZiAoaW5zdGFuY2VEb2N1bWVudHMgIT0gbnVsbCAmJiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpKQotICAgIHsKLSAgICAgIFN0cmluZyB4c2RDb21wb25lbnROYW1lID0gKChYU0ROYW1lZENvbXBvbmVudCl4c2RDb21wb25lbnQpLmdldE5hbWUoKTsKLSAgICAgIGlmICh4c2RDb21wb25lbnROYW1lICE9IG51bGwgJiYgeHNkQ29tcG9uZW50TmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW5zdGFuY2VEb2N1bWVudHNbaV0gPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIFN0cmluZyB4c2lVUkkgPSBGcmFnbWVudENvbnN0YW50cy5VUklfWFNJOwotICAgICAgICAgIFN0cmluZyB4c2lQcmVmaXggPSBnZXRQcmVmaXhGcm9tTmFtZXNwYWNlVVJJKHhzaVVSSSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgICAgIFN0cmluZyB4c2lUeXBlVVJJID0geHNkQ29tcG9uZW50LmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgIFN0cmluZyB4c2lUeXBlUHJlZml4ID0gZ2V0UHJlZml4RnJvbU5hbWVzcGFjZVVSSSh4c2lUeXBlVVJJLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgICAgOwotICAgICAgICAgIFN0cmluZ0J1ZmZlciBhdHRyTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBhdHRyTmFtZS5hcHBlbmQoeHNpUHJlZml4KTsKLSAgICAgICAgICBhdHRyTmFtZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuQ09MT04pOwotICAgICAgICAgIGF0dHJOYW1lLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5YU0lfVFlQRSk7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIGF0dHJWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKHhzaVR5cGVQcmVmaXgpOwotICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuQ09MT04pOwotICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoeHNkQ29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0uc2V0QXR0cmlidXRlKGF0dHJOYW1lLnRvU3RyaW5nKCksIGF0dHJWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VEb2N1bWVudHM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpCi0gIHsKLSAgICBpZiAoIXN1cGVyLnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgU3RyaW5nW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVyVmFsdWVzKGdldElEKCkpOwotICAgIGludCBsZW5ndGggPSAocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmxlbmd0aCA6IDA7Ci0gICAgaW50IG1pbiA9IGNvbmZpZ18uZ2V0TWluT2NjdXJzKCk7Ci0gICAgaW50IG1heCA9IGNvbmZpZ18uZ2V0TWF4T2NjdXJzKCk7Ci0gICAgcmV0dXJuIChsZW5ndGggPj0gbWluICYmIChtYXggPT0gRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEIHx8IGxlbmd0aCA8PSBtYXgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZml4RnJvbU5hbWVzcGFjZVVSSShTdHJpbmcgbnNVUkksIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKW5hbWVzcGFjZVRhYmxlLmdldChuc1VSSSk7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPD0gMCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcHJlZml4Q29weSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIHByZWZpeENvcHkuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlFOQU1FX1BSRUZJWCk7Ci0gICAgICBwcmVmaXhDb3B5LmFwcGVuZChTdHJpbmcudmFsdWVPZihpKSk7Ci0gICAgICBpKys7Ci0gICAgICBpZiAoIW5hbWVzcGFjZVRhYmxlLmNvbnRhaW5zKHByZWZpeENvcHkudG9TdHJpbmcoKSkpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzcGFjZVRhYmxlLnB1dChuc1VSSSwgcHJlZml4Q29weS50b1N0cmluZygpKTsKLSAgICAgICAgcHJlZml4ID0gcHJlZml4Q29weS50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgc2V0RWxlbWVudFRhZ05hbWUoRWxlbWVudCBlLCBTdHJpbmcgdGFnTmFtZSkKLSAgewotICAgIGlmICghZS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ05hbWUpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgRWxlbWVudCBlQ29weSA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlQ29weS5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAvLyBXaGVuIHlvdSBhcHBlbmQgYSBub2RlIGZyb20gb25lIGVsZW1lbnQgdG8gYW5vdGhlciwKLSAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBlbGVtZW50IHdpbGwgbG9zZSBpdHMgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSwKLSAgICAgICAgICAgIC8vIHRoZXJlZm9yZSwgdGhlIHNpemUgb2YgdGhlIG5vZGUgbGlzdCB3aWxsIGRlY3JlYXNlIGJ5IDEuCi0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBhdHRyID0gYXR0cmlidXRlcy5pdGVtKGopOwotICAgICAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgKGF0dHIgaW5zdGFuY2VvZiBBdHRyKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKWF0dHI7Ci0gICAgICAgICAgICBlQ29weS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLmdldE5hbWUoKSwgYXR0cmlidXRlLmdldFZhbHVlKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZUNvcHk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudFtdIHNldEVsZW1lbnRzVGFnTmFtZShFbGVtZW50W10gZSwgU3RyaW5nIHRhZ05hbWUpCi0gIHsKLSAgICBFbGVtZW50W10gZUNvcHkgPSBuZXcgRWxlbWVudFtlLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlQ29weS5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBlQ29weVtpXSA9IHNldEVsZW1lbnRUYWdOYW1lKGVbaV0sIHRhZ05hbWUpOwotICAgIH0KLSAgICByZXR1cm4gZUNvcHk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcm5hbEVxdWFscyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpCi0gIHsKLSAgICBpZiAoIWNvbmZpZ18uZ2V0SXNXU0RMUGFydCgpKQotICAgIHsKLSAgICAgIGludCBsZW5ndGggPSAoaW5zdGFuY2VEb2N1bWVudHMgIT0gbnVsbCkgPyBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGggOiAwOwotICAgICAgaW50IGxlbmd0aENvcHkgPSAoaW5zdGFuY2VEb2N1bWVudHNDb3B5ICE9IG51bGwpID8gaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aCA6IDA7Ci0gICAgICByZXR1cm4gKGxlbmd0aCA9PSBsZW5ndGhDb3B5KTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBBbGxGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cEFsbEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDZkZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cEFsbEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREdyb3VwQWxsRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREdyb3VwQWxsRnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cEZyYWdtZW50IGltcGxlbWVudHMgSVhTREdyb3VwQWxsRnJhZ21lbnQgewotICBwcml2YXRlIFN0cmluZyBncm91cElEXzsKLQotICBwdWJsaWMgWFNER3JvdXBBbGxGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIsIHhzZE1vZGVsR3JvdXApOwotICAgIGdyb3VwSURfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24gewotICAgIFN0cmluZyBncm91cElEID0gcGFyc2VyLmdldFBhcmFtZXRlcihnZXRJRCgpKTsKLSAgICBpZiAoZ3JvdXBJRF8gIT0gbnVsbCAmJiBncm91cElEICE9IG51bGwgJiYgZ3JvdXBJRF8uZXF1YWxzKGdyb3VwSUQpKSB7Ci0gICAgICBzZXRHcm91cE1lbWJlcklEc09yZGVyaW5nKHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoZ3JvdXBJRF8pKTsKLSAgICAgIGJvb2xlYW4gdmFsdWVzVmFsaWQgPSB0cnVlOwotICAgICAgSVhTREZyYWdtZW50W10gZ3JvdXBNZW1iZXJGcmFnbWVudHMgPSBnZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEXyk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChncm91cE1lbWJlckZyYWdtZW50c1tpXSAhPSBudWxsICYmICFncm91cE1lbWJlckZyYWdtZW50c1tpXS5wcm9jZXNzUGFyYW1ldGVyVmFsdWVzKHBhcnNlcikpCi0gICAgICAgICAgdmFsdWVzVmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2YWx1ZXNWYWxpZDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBncm91cElEXyA9IG51bGw7Ci0gICAgICByZW1vdmVHcm91cElEcygpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykgewotICAgIHJlbW92ZUdyb3VwSURzKCk7Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IHRydWU7Ci0gICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzICE9IG51bGwgJiYgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoID4gMCkgewotICAgICAgZ3JvdXBJRF8gPSBjcmVhdGVJbnN0YW5jZSgpOwotICAgICAgSVhTREZyYWdtZW50W10gZ3JvdXBNZW1iZXJGcmFncyA9IGdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGdyb3VwSURfKTsKLSAgICAgIFN0cmluZ1tdIGdyb3VwTWVtYmVySURzT3JkZXIgPSBuZXcgU3RyaW5nW2dyb3VwTWVtYmVyRnJhZ3MubGVuZ3RoXTsKLSAgICAgIGludCBvcmRlckluZGV4ID0gMDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgYm9vbGVhbiBwYXJhbXNBc3NpZ25lZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdyb3VwTWVtYmVyRnJhZ3MubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXJGcmFnc1tqXSAhPSBudWxsICYmIGdyb3VwTWVtYmVyRnJhZ3Nbal0uZ2V0TmFtZSgpLmVxdWFscyh0cmltUHJlZml4KGluc3RhbmNlRG9jdW1lbnRzW2ldLmdldFRhZ05hbWUoKSkpKSB7Ci0gICAgICAgICAgICBFbGVtZW50W10gY2hpbGRJbnN0YW5jZSA9IHtpbnN0YW5jZURvY3VtZW50c1tpXX07Ci0gICAgICAgICAgICBpZiAoIWdyb3VwTWVtYmVyRnJhZ3Nbal0uc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKGNoaWxkSW5zdGFuY2UpKQotICAgICAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZ3JvdXBNZW1iZXJJRHNPcmRlcltvcmRlckluZGV4XSA9IGdyb3VwTWVtYmVyRnJhZ3Nbal0uZ2V0SUQoKTsKLSAgICAgICAgICAgIG9yZGVySW5kZXgrKzsKLSAgICAgICAgICAgIHBhcmFtc0Fzc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGdyb3VwTWVtYmVyRnJhZ3Nbal0gPSBudWxsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghcGFyYW1zQXNzaWduZWQpCi0gICAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZ3JvdXBNZW1iZXJGcmFncy5sZW5ndGg7IGsrKykgewotICAgICAgICBpZiAoZ3JvdXBNZW1iZXJGcmFnc1trXSAhPSBudWxsKSB7Ci0gICAgICAgICAgZ3JvdXBNZW1iZXJJRHNPcmRlcltvcmRlckluZGV4XSA9IGdyb3VwTWVtYmVyRnJhZ3Nba10uZ2V0SUQoKTsKLSAgICAgICAgICBvcmRlckluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHNldEdyb3VwTWVtYmVySURzT3JkZXJpbmcoZ3JvdXBNZW1iZXJJRHNPcmRlcik7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBBbGxJbnN0YW5jZSgpIHsKLSAgICBpZiAoZ3JvdXBJRF8gPT0gbnVsbCkKLSAgICAgIGdyb3VwSURfID0gY3JlYXRlR3JvdXBJbnN0YW5jZSgpOwotICAgIHJldHVybiBncm91cElEXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlSW5zdGFuY2UoKSB7Ci0gICAgcmV0dXJuIGdldEdyb3VwQWxsSW5zdGFuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldEdyb3VwTWVtYmVySURzT3JkZXJpbmcoU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMpIHsKLSAgICBpZiAoZ3JvdXBNZW1iZXJJRHMgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmdbXSBleGlzdGluZ0dyb3VwTWVtYmVySURzID0gZ2V0R3JvdXBNZW1iZXJJRHMoZ3JvdXBJRF8pOwotICAgIGlmIChleGlzdGluZ0dyb3VwTWVtYmVySURzLmxlbmd0aCAhPSBncm91cE1lbWJlcklEcy5sZW5ndGgpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgVmVjdG9yIGV4aXN0aW5nR3JvdXBNZW1iZXJJRHNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ0dyb3VwTWVtYmVySURzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBleGlzdGluZ0dyb3VwTWVtYmVySURzVmVjdG9yLmFkZChleGlzdGluZ0dyb3VwTWVtYmVySURzW2ldKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBncm91cE1lbWJlcklEcy5sZW5ndGg7IGorKykgewotICAgICAgaWYgKCFleGlzdGluZ0dyb3VwTWVtYmVySURzVmVjdG9yLnJlbW92ZShncm91cE1lbWJlcklEc1tqXSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHNldEZyYWdtZW50c09yZGVyKGdyb3VwTWVtYmVySURzKSkgewotICAgICAgc2V0R3JvdXBNZW1iZXJJRHMoZ3JvdXBJRF8sIGdyb3VwTWVtYmVySURzKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtb3ZlVXBHcm91cE1lbWJlcklEKFN0cmluZyBncm91cE1lbWJlcklEKSB7Ci0gICAgU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMgPSBnZXRHcm91cE1lbWJlcklEcyhncm91cElEXyk7Ci0gICAgaWYgKGdyb3VwTWVtYmVySUQuZXF1YWxzKGdyb3VwTWVtYmVySURzWzBdKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGdyb3VwTWVtYmVySURzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAoZ3JvdXBNZW1iZXJJRC5lcXVhbHMoZ3JvdXBNZW1iZXJJRHNbaV0pKSB7Ci0gICAgICAgIGdyb3VwTWVtYmVySURzW2ldID0gZ3JvdXBNZW1iZXJJRHNbaSAtIDFdOwotICAgICAgICBncm91cE1lbWJlcklEc1tpIC0gMV0gPSBncm91cE1lbWJlcklEOwotICAgICAgICBpZiAoc2V0RnJhZ21lbnRzT3JkZXIoZ3JvdXBNZW1iZXJJRHMpKSB7Ci0gICAgICAgICAgc2V0R3JvdXBNZW1iZXJJRHMoZ3JvdXBJRF8sIGdyb3VwTWVtYmVySURzKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtb3ZlRG93bkdyb3VwTWVtYmVySUQoU3RyaW5nIGdyb3VwTWVtYmVySUQpIHsKLSAgICBTdHJpbmdbXSBncm91cE1lbWJlcklEcyA9IGdldEdyb3VwTWVtYmVySURzKGdyb3VwSURfKTsKLSAgICBpZiAoZ3JvdXBNZW1iZXJJRC5lcXVhbHMoZ3JvdXBNZW1iZXJJRHNbZ3JvdXBNZW1iZXJJRHMubGVuZ3RoIC0gMV0pKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBNZW1iZXJJRHMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0gICAgICBpZiAoZ3JvdXBNZW1iZXJJRC5lcXVhbHMoZ3JvdXBNZW1iZXJJRHNbaV0pKSB7Ci0gICAgICAgIGdyb3VwTWVtYmVySURzW2ldID0gZ3JvdXBNZW1iZXJJRHNbaSArIDFdOwotICAgICAgICBncm91cE1lbWJlcklEc1tpICsgMV0gPSBncm91cE1lbWJlcklEOwotICAgICAgICBpZiAoc2V0RnJhZ21lbnRzT3JkZXIoZ3JvdXBNZW1iZXJJRHMpKSB7Ci0gICAgICAgICAgc2V0R3JvdXBNZW1iZXJJRHMoZ3JvdXBJRF8sIGdyb3VwTWVtYmVySURzKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREdyb3VwUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RHcm91cEFsbFdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlRml4RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBDaG9pY2VGaXhGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjZkNzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBDaG9pY2VGaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBYU0RHcm91cENob2ljZUZpeEZyYWdtZW50IGV4dGVuZHMgWFNER3JvdXBDaG9pY2VGcmFnbWVudCB7Ci0gIHB1YmxpYyBYU0RHcm91cENob2ljZUZpeEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlciwgeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREdyb3VwQ2hvaWNlUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZUZpeFdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBDaG9pY2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDhlZGM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBDaG9pY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNER3JvdXBDaG9pY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTREdyb3VwQ2hvaWNlRnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cEZyYWdtZW50IGltcGxlbWVudHMgSVhTREdyb3VwQ2hvaWNlRnJhZ21lbnQgewotICBwcml2YXRlIFhTRFBhcnRpY2xlW10gY2hvaWNlc187Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGNob2ljZUluZGV4ZXNfOwotCi0gIHB1YmxpYyBYU0RHcm91cENob2ljZUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlciwgeHNkTW9kZWxHcm91cCk7Ci0gICAgY2hvaWNlc18gPSBudWxsOwotICAgIGNob2ljZUluZGV4ZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiB7Ci0gICAgc3VwZXIucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpOwotICAgIFN0cmluZ1tdIGdyb3VwSURzID0gZ2V0R3JvdXBJRHMoKTsKLSAgICBjaG9pY2VJbmRleGVzXy5jbGVhcigpOwotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJRHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIFN0cmluZyBzZWxlY3RlZENob2ljZUZyYWdJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoZ3JvdXBJRHNbaV0pOwotICAgICAgaW50IGNob2ljZUluZGV4ID0gMDsKLSAgICAgIElYU0RGcmFnbWVudFtdIGNob2ljZUZyYWdzID0gZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbaV0pOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaG9pY2VGcmFncy5sZW5ndGg7IGorKykgewotICAgICAgICBpZiAoY2hvaWNlRnJhZ3Nbal0uZ2V0SUQoKS5lcXVhbHMoc2VsZWN0ZWRDaG9pY2VGcmFnSUQpKSB7Ci0gICAgICAgICAgY2hvaWNlSW5kZXggPSBqOwotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gKHBhcmFtc1ZhbGlkICYmIGNob2ljZUZyYWdzW2pdLnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZXRDaG9pY2VJbmRleChncm91cElEc1tpXSwgY2hvaWNlSW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKSB7Ci0gICAgcmVtb3ZlR3JvdXBJRHMoKTsKLSAgICBjaG9pY2VJbmRleGVzXy5jbGVhcigpOwotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSB0cnVlOwotICAgIGlmIChpbnN0YW5jZURvY3VtZW50cyAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIFN0cmluZyBncm91cElEID0gY3JlYXRlR3JvdXBDaG9pY2VJbnN0YW5jZSgwKTsKLSAgICAgICAgSVhTREZyYWdtZW50W10gY2hvaWNlRnJhZ3MgPSBnZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaG9pY2VGcmFncy5sZW5ndGg7IGorKykgewotICAgICAgICAgIGlmIChjaG9pY2VGcmFnc1tqXS5nZXROYW1lKCkuZXF1YWxzKHRyaW1QcmVmaXgoaW5zdGFuY2VEb2N1bWVudHNbaV0uZ2V0VGFnTmFtZSgpKSkpIHsKLSAgICAgICAgICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGNob2ljZUZyYWdzW2pdLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBFbGVtZW50W10gY2hpbGRJbnN0YW5jZXMgPSBnZXRJbnN0YW5jZURvY3VtZW50UGFydGl0aW9uKGluc3RhbmNlRG9jdW1lbnRzLCBpLCB4c2RDb25maWcuZ2V0TWluT2NjdXJzKCksIHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICBpZiAoIWNob2ljZUZyYWdzW2pdLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhjaGlsZEluc3RhbmNlcykpCi0gICAgICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBzZXRDaG9pY2VJbmRleChncm91cElELCBqKTsKLSAgICAgICAgICAgIGlmIChjaGlsZEluc3RhbmNlcy5sZW5ndGggPiAwKQotICAgICAgICAgICAgICBpID0gaSArIGNoaWxkSW5zdGFuY2VzLmxlbmd0aCAtIDE7IC8vIG1pbnVzIDEgYmVjYXVzZSB0aGVyZSdzIGFuIGkrKyBpbiB0aGUgb3V0ZXIgZm9yIGxvb3AKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwcml2YXRlIEVsZW1lbnRbXSBnZXRJbnN0YW5jZURvY3VtZW50UGFydGl0aW9uKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cywgaW50IHN0YXJ0LCBpbnQgbWluU2l6ZSwgaW50IG1heFNpemUpIHsKLSAgICBTdHJpbmcgdGFnTmFtZSA9IGluc3RhbmNlRG9jdW1lbnRzW3N0YXJ0XS5nZXRUYWdOYW1lKCk7Ci0gICAgaW50IHNpemUgPSAxOwotICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzW2ldLmdldFRhZ05hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0gICAgICAgIHNpemUrKzsKLSAgICAgIGVsc2UKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChtYXhTaXplICE9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCAmJiBzaXplID4gbWF4U2l6ZSkgewotICAgICAgc2l6ZSA9IHNpemUgLSBtaW5TaXplOwotICAgICAgaWYgKHNpemUgPiBtYXhTaXplKQotICAgICAgICBzaXplID0gbWF4U2l6ZTsKLSAgICB9Ci0gICAgRWxlbWVudFtdIHN1YnNldCA9IG5ldyBFbGVtZW50W3NpemVdOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3Vic2V0Lmxlbmd0aDsgaisrKSB7Ci0gICAgICBzdWJzZXRbal0gPSBpbnN0YW5jZURvY3VtZW50c1tzdGFydCArIGpdOwotICAgIH0KLSAgICByZXR1cm4gc3Vic2V0OwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnRbXSBnZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIERvY3VtZW50IGRvYykgewotICAgIFZlY3RvciBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nW10gZ3JvdXBJRHMgPSBnZXRHcm91cElEcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJRHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIElYU0RGcmFnbWVudFtdIGNob2ljZUZyYWdzID0gZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbaV0pOwotICAgICAgaW50IGNob2ljZUluZGV4ID0gZ2V0Q2hvaWNlSW5kZXgoZ3JvdXBJRHNbaV0pOwotICAgICAgRWxlbWVudFtdIGNob2ljZUZyYWdJbnN0YW5jZXMgPSBjaG9pY2VGcmFnc1tjaG9pY2VJbmRleF0uZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCBkb2MpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaG9pY2VGcmFnSW5zdGFuY2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weS5hZGQoY2hvaWNlRnJhZ0luc3RhbmNlc1tqXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2luc3RhbmNlRG9jdW1lbnRzQ29weS5zaXplKCldOwotICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weS5jb3B5SW50byhpbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHVibGljIFhTRFBhcnRpY2xlW10gZ2V0Q2hvaWNlcygpIHsKLSAgICBpZiAoY2hvaWNlc18gPT0gbnVsbCkgewotICAgICAgRUxpc3QgcGFydGljbGVzID0gZ2V0WFNETW9kZWxHcm91cCgpLmdldFBhcnRpY2xlcygpOwotICAgICAgY2hvaWNlc18gPSBuZXcgWFNEUGFydGljbGVbcGFydGljbGVzLnNpemUoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGNob2ljZXNfW2ldID0gKFhTRFBhcnRpY2xlKXBhcnRpY2xlcy5nZXQoaSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaG9pY2VzXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBDaG9pY2VJbnN0YW5jZShpbnQgY2hvaWNlSW5kZXgpIHsKLSAgICBnZXRDaG9pY2VzKCk7Ci0gICAgaWYgKGNob2ljZUluZGV4IDwgMCB8fCBjaG9pY2VJbmRleCA+IGNob2ljZXNfLmxlbmd0aCAtIDEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBTdHJpbmcgZ3JvdXBJRCA9IGNyZWF0ZUdyb3VwSW5zdGFuY2UoKTsKLSAgICBzZXRDaG9pY2VJbmRleChncm91cElELCBjaG9pY2VJbmRleCk7Ci0gICAgcmV0dXJuIGdyb3VwSUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkgewotICAgIHJldHVybiBjcmVhdGVHcm91cENob2ljZUluc3RhbmNlKDApOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRDaG9pY2VJbmRleChTdHJpbmcgZ3JvdXBJRCkgewotICAgIEludGVnZXIgaW5kZXggPSAoSW50ZWdlciljaG9pY2VJbmRleGVzXy5nZXQoZ3JvdXBJRCk7Ci0gICAgaWYgKGluZGV4ICE9IG51bGwpCi0gICAgICByZXR1cm4gaW5kZXguaW50VmFsdWUoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENob2ljZUluZGV4KFN0cmluZyBncm91cElELCBpbnQgY2hvaWNlSW5kZXgpIHsKLSAgICBjaG9pY2VJbmRleGVzXy5wdXQoZ3JvdXBJRCwgbmV3IEludGVnZXIoY2hvaWNlSW5kZXgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkKLSAgewotICAgIFN0cmluZ1tdIGdyb3VwSURzID0gZ2V0R3JvdXBJRHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwSURzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IGdldENob2ljZUluZGV4KGdyb3VwSURzW2ldKTsKLSAgICAgIGlmICghZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbaV0pW3NlbGVjdGlvbkluZGV4XS52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlUmFuZ2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cENob2ljZVJhbmdlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzYmZmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlUmFuZ2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBYU0RHcm91cENob2ljZVJhbmdlRnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cENob2ljZUZyYWdtZW50IHsKLSAgcHVibGljIFhTREdyb3VwQ2hvaWNlUmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIsIHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBDaG9pY2VSYW5nZVdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGVkNWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDQwNCAgIDE3Mzg3NyBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RHcm91cEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RHcm91cEZyYWdtZW50IGV4dGVuZHMgWFNETWFwRnJhZ21lbnQgaW1wbGVtZW50cyBJWFNER3JvdXBGcmFnbWVudCB7Ci0gIHByaXZhdGUgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwXzsKLSAgcHJpdmF0ZSBWZWN0b3IgZ3JvdXBJRHNPcmRlcl87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGdyb3VwSURzXzsKLSAgCi0gIHB1YmxpYyBYU0RHcm91cEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlcik7Ci0gICAgeHNkTW9kZWxHcm91cF8gPSB4c2RNb2RlbEdyb3VwOwotICAgIGdyb3VwSURzT3JkZXJfID0gbmV3IFZlY3RvcigpOwotICAgIGdyb3VwSURzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24gewotICAgIGJvb2xlYW4gdmFsdWVzVmFsaWQgPSB0cnVlOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoZ2V0SUQoKSk7Ci0gICAgVmVjdG9yIGZyYWdzID0gbmV3IFZlY3RvcigpOwotICAgIFZlY3RvciBncm91cElEc09yZGVyQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICBIYXNodGFibGUgZ3JvdXBJRHNDb3B5ID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAocGFyYW1zW2ldICE9IG51bGwpIHsKLSAgICAgICAgZ3JvdXBJRHNPcmRlckNvcHkuYWRkKHBhcmFtc1tpXSk7Ci0gICAgICAgIGdyb3VwSURzQ29weS5wdXQocGFyYW1zW2ldLCBnZXRHcm91cE1lbWJlcklEcyhwYXJhbXNbaV0pKTsKLSAgICAgICAgSVhTREZyYWdtZW50W10gZ3JvdXBNZW1iZXJGcmFnbWVudHMgPSBnZXRHcm91cE1lbWJlckZyYWdtZW50cyhwYXJhbXNbaV0pOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgaWYgKGdyb3VwTWVtYmVyRnJhZ21lbnRzW2pdICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZyYWdzLmFkZChncm91cE1lbWJlckZyYWdtZW50c1tqXSk7Ci0gICAgICAgICAgICBpZiAoIWdyb3VwTWVtYmVyRnJhZ21lbnRzW2pdLnByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMocGFyc2VyKSkKLSAgICAgICAgICAgICAgdmFsdWVzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZ3JvdXBJRHNPcmRlcl8gPSBncm91cElEc09yZGVyQ29weTsKLSAgICBncm91cElEc18gPSBncm91cElEc0NvcHk7Ci0gICAgcmVtb3ZlQWxsRnJhZ21lbnRzKCk7Ci0gICAgYWRkRnJhZ21lbnRzKGZyYWdzKTsKLSAgICByZXR1cm4gdmFsdWVzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKSB7Ci0gICAgcmVtb3ZlR3JvdXBJRHMoKTsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gdHJ1ZTsKLSAgICBTdHJpbmcgcHJldkdyb3VwSUQgPSBudWxsOwotICAgIFN0cmluZyBjdXJyR3JvdXBJRCA9IG51bGw7Ci0gICAgaW50IGdyb3VwTWVtYmVySW5kZXggPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyApIHsKLSAgICAgIGlmIChjdXJyR3JvdXBJRCA9PSBudWxsKSB7Ci0gICAgICAgIFN0cmluZyBuZXdHcm91cElEID0gY3JlYXRlSW5zdGFuY2UoKTsKLSAgICAgICAgcHJldkdyb3VwSUQgPSBjdXJyR3JvdXBJRDsKLSAgICAgICAgY3Vyckdyb3VwSUQgPSBuZXdHcm91cElEOwotICAgICAgfQotICAgICAgRWxlbWVudFtdIGluc3RhbmNlUGFydGl0aW9uID0gbnVsbDsKLSAgICAgIGludCBqID0gZ3JvdXBNZW1iZXJJbmRleDsKLSAgICAgIGJvb2xlYW4gcGFyYW1zQXNzaWduZWQgPSBmYWxzZTsKLSAgICAgIGludCB3aWxkY2FyZEZyYWdJbmRleCA9IC0xOwotICAgICAgZG8gewotICAgICAgICBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdzID0gZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoY3Vyckdyb3VwSUQpOwotICAgICAgICBYU0RDb21wb25lbnQgeHNkQ29tcG9uZW50ID0gZ3JvdXBNZW1iZXJGcmFnc1tqXS5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpLmdldFhTRENvbXBvbmVudCgpOwotICAgICAgICBpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpIHsKLSAgICAgICAgICBpZiAod2lsZGNhcmRGcmFnSW5kZXggPCAwKQotICAgICAgICAgICAgd2lsZGNhcmRGcmFnSW5kZXggPSBqOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGdyb3VwTWVtYmVyRnJhZ3Nbal0uZ2V0TmFtZSgpLmVxdWFscyh0cmltUHJlZml4KGluc3RhbmNlRG9jdW1lbnRzW2ldLmdldFRhZ05hbWUoKSkpKSB7Ci0gICAgICAgICAgaW5zdGFuY2VQYXJ0aXRpb24gPSBnZXRJbnN0YW5jZURvY3VtZW50UGFydGl0aW9uKGluc3RhbmNlRG9jdW1lbnRzLCBpLCBncm91cE1lbWJlckZyYWdzW2pdLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCkuZ2V0TWF4T2NjdXJzKCkpOwotICAgICAgICAgIGlmICghZ3JvdXBNZW1iZXJGcmFnc1tqXS5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoaW5zdGFuY2VQYXJ0aXRpb24pKQotICAgICAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBwYXJhbXNBc3NpZ25lZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihncm91cE1lbWJlckZyYWdzW2pdIGluc3RhbmNlb2YgWFNER3JvdXBGcmFnbWVudCkgewotICAgICAgICAJZ3JvdXBNZW1iZXJGcmFnc1tqXS5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoaW5zdGFuY2VEb2N1bWVudHMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaiA9PSBncm91cE1lbWJlckZyYWdzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICBqID0gMDsKLSAgICAgICAgICBTdHJpbmcgbmV3R3JvdXBJRDsKLSAgICAgICAgICBpZiAoIXBhcmFtc0Fzc2lnbmVkKQotICAgICAgICAgICAgbmV3R3JvdXBJRCA9IGNyZWF0ZUluc3RhbmNlKCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV3R3JvdXBJRCA9IG51bGw7Ci0gICAgICAgICAgcHJldkdyb3VwSUQgPSBjdXJyR3JvdXBJRDsKLSAgICAgICAgICBjdXJyR3JvdXBJRCA9IG5ld0dyb3VwSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGorKzsKLSAgICAgIH0gd2hpbGUgKCFwYXJhbXNBc3NpZ25lZCAmJiBqICE9IGdyb3VwTWVtYmVySW5kZXgpOwotICAgICAgZ3JvdXBNZW1iZXJJbmRleCA9IGo7Ci0gICAgICBpZiAoIXBhcmFtc0Fzc2lnbmVkKSB7Ci0gICAgICAgIGluc3RhbmNlUGFydGl0aW9uID0gZ2V0SW5zdGFuY2VEb2N1bWVudFBhcnRpdGlvbihpbnN0YW5jZURvY3VtZW50cywgaSwgRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEKTsKLSAgICAgICAgaWYgKHdpbGRjYXJkRnJhZ0luZGV4ID49IDApIHsKLSAgICAgICAgICBpZiAod2lsZGNhcmRGcmFnSW5kZXggPj0gZ3JvdXBNZW1iZXJJbmRleCkgewotICAgICAgICAgICAgcmVtb3ZlR3JvdXBJRChjdXJyR3JvdXBJRCk7Ci0gICAgICAgICAgICBjdXJyR3JvdXBJRCA9IHByZXZHcm91cElEOwotICAgICAgICAgIH0KLSAgICAgICAgICBncm91cE1lbWJlckluZGV4ID0gd2lsZGNhcmRGcmFnSW5kZXg7Ci0gICAgICAgICAgSVhTREZyYWdtZW50W10gZ3JvdXBNZW1iZXJGcmFncyA9IGdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGN1cnJHcm91cElEKTsKLSAgICAgICAgICBpZiAoIWdyb3VwTWVtYmVyRnJhZ3Nbd2lsZGNhcmRGcmFnSW5kZXhdLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhpbnN0YW5jZVBhcnRpdGlvbikpCi0gICAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHBhcmFtc0Fzc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJyR3JvdXBJRCAhPSBudWxsICYmIChwcmV2R3JvdXBJRCA9PSBudWxsIHx8ICFjdXJyR3JvdXBJRC5lcXVhbHMocHJldkdyb3VwSUQpKSkgewotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgcmVtb3ZlR3JvdXBJRChjdXJyR3JvdXBJRCk7Ci0gICAgICAgICAgY3Vyckdyb3VwSUQgPSBwcmV2R3JvdXBJRDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaSA9IGkgKyBpbnN0YW5jZVBhcnRpdGlvbi5sZW5ndGg7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudFtdIGdldEluc3RhbmNlRG9jdW1lbnRQYXJ0aXRpb24oRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzLCBpbnQgc3RhcnQsIGludCBtYXhTaXplKSB7Ci0gICAgU3RyaW5nIHRhZ05hbWUgPSBpbnN0YW5jZURvY3VtZW50c1tzdGFydF0uZ2V0VGFnTmFtZSgpOwotICAgIGludCBzaXplID0gMTsKLSAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChtYXhTaXplICE9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCAmJiBzaXplID49IG1heFNpemUpCi0gICAgICAgIGJyZWFrOwotICAgICAgZWxzZSBpZiAoaW5zdGFuY2VEb2N1bWVudHNbaV0uZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLSAgICAgICAgc2l6ZSsrOwotICAgICAgZWxzZQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgRWxlbWVudFtdIHN1YnNldCA9IG5ldyBFbGVtZW50W3NpemVdOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3Vic2V0Lmxlbmd0aDsgaisrKSB7Ci0gICAgICBzdWJzZXRbal0gPSBpbnN0YW5jZURvY3VtZW50c1tzdGFydCArIGpdOwotICAgIH0KLSAgICByZXR1cm4gc3Vic2V0OwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnRbXSBnZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIERvY3VtZW50IGRvYykgewotICAgIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gICAgVmVjdG9yIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBFbGVtZW50W10gZnJhZ21lbnRJbnN0YW5jZXMgPSBncm91cE1lbWJlckZyYWdtZW50c1tpXS5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsIGRvYyk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZyYWdtZW50SW5zdGFuY2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weS5hZGQoZnJhZ21lbnRJbnN0YW5jZXNbal0pOwotICAgICAgfQotICAgIH0KLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFtpbnN0YW5jZURvY3VtZW50c0NvcHkuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBrID0gMDsgayA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaysrKSB7Ci0gICAgICBpbnN0YW5jZURvY3VtZW50c1trXSA9IChFbGVtZW50KWluc3RhbmNlRG9jdW1lbnRzQ29weS5nZXQoayk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZURvY3VtZW50czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgeHNkTW9kZWxHcm91cF8gPSB4c2RNb2RlbEdyb3VwOwotICB9Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXAgZ2V0WFNETW9kZWxHcm91cCgpIHsKLSAgICByZXR1cm4geHNkTW9kZWxHcm91cF87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBJRHMoKSB7Ci0gICAgU3RyaW5nW10gZ3JvdXBJRHMgPSBuZXcgU3RyaW5nW2dyb3VwSURzT3JkZXJfLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cElEcy5sZW5ndGg7IGkrKykgewotICAgICAgZ3JvdXBJRHNbaV0gPSAoU3RyaW5nKWdyb3VwSURzT3JkZXJfLmdldChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdyb3VwSURzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlR3JvdXBJRHMoKSB7Ci0gICAgcmVtb3ZlQWxsRnJhZ21lbnRzKCk7Ci0gICAgZ3JvdXBJRHNPcmRlcl8uY2xlYXIoKTsKLSAgICBncm91cElEc18uY2xlYXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUdyb3VwSUQoU3RyaW5nIGdyb3VwSUQpIHsKLSAgICBTdHJpbmdbXSBtZW1iZXJGcmFnSURzID0gZ2V0R3JvdXBNZW1iZXJJRHMoZ3JvdXBJRCk7Ci0gICAgcmVtb3ZlRnJhZ21lbnRzKG1lbWJlckZyYWdJRHMpOwotICAgIGdyb3VwSURzT3JkZXJfLnJlbW92ZShncm91cElEKTsKLSAgICBncm91cElEc18ucmVtb3ZlKGdyb3VwSUQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0R3JvdXBNZW1iZXJJRHMoU3RyaW5nIGdyb3VwSUQsIFN0cmluZ1tdIGdyb3VwTWVtYmVySURzKSB7Ci0gICAgaWYgKGdyb3VwSUQgIT0gbnVsbCkgewotICAgICAgaWYgKCFncm91cElEc09yZGVyXy5jb250YWlucyhncm91cElEKSkKLSAgICAgICAgZ3JvdXBJRHNPcmRlcl8uYWRkKGdyb3VwSUQpOwotICAgICAgaWYgKGdyb3VwTWVtYmVySURzICE9IG51bGwpCi0gICAgICAgIGdyb3VwSURzXy5wdXQoZ3JvdXBJRCwgZ3JvdXBNZW1iZXJJRHMpOwotICAgICAgZWxzZQotICAgICAgICBncm91cElEc18ucHV0KGdyb3VwSUQsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldEdyb3VwTWVtYmVyRnJhZ21lbnRzKFN0cmluZyBncm91cElELCBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdtZW50cykgewotICAgIGFkZEZyYWdtZW50cyhncm91cE1lbWJlckZyYWdtZW50cyk7Ci0gICAgU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1tncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZHNbaV0gPSBncm91cE1lbWJlckZyYWdtZW50c1tpXS5nZXRJRCgpOwotICAgIH0KLSAgICBzZXRHcm91cE1lbWJlcklEcyhncm91cElELCBpZHMpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEdyb3VwTWVtYmVySURzKFN0cmluZyBncm91cElEKSB7Ci0gICAgaWYgKGdyb3VwSUQgIT0gbnVsbCkgewotICAgICAgU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMgPSAoU3RyaW5nW10pZ3JvdXBJRHNfLmdldChncm91cElEKTsKLSAgICAgIGlmIChncm91cE1lbWJlcklEcyAhPSBudWxsKQotICAgICAgICByZXR1cm4gZ3JvdXBNZW1iZXJJRHM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudFtdIGdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKFN0cmluZyBncm91cElEKSB7Ci0gICAgU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMgPSBnZXRHcm91cE1lbWJlcklEcyhncm91cElEKTsKLSAgICBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdtZW50cyA9IG5ldyBJWFNERnJhZ21lbnRbZ3JvdXBNZW1iZXJJRHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBncm91cE1lbWJlckZyYWdtZW50c1tpXSA9IGdldEZyYWdtZW50KGdyb3VwTWVtYmVySURzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdyb3VwTWVtYmVyRnJhZ21lbnRzOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVHcm91cEluc3RhbmNlKCkgewotICAgIFN0cmluZyBncm91cElEID0gZ2VuSUQoKTsKLSAgICBFTGlzdCBwYXJ0aWNsZXMgPSBnZXRYU0RNb2RlbEdyb3VwKCkuZ2V0UGFydGljbGVzKCk7Ci0gICAgU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMgPSBuZXcgU3RyaW5nW3BhcnRpY2xlcy5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBYU0RQYXJ0aWNsZSB4c2RQYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSlwYXJ0aWNsZXMuZ2V0KGkpOwotICAgICAgWFNEUGFydGljbGVDb250ZW50IHhzZFBhcnRpY2xlQ29udGVudCA9IHhzZFBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHRoaXNDb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICBpZiAoeHNkUGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgICB4c2RDb25maWcuc2V0WFNEQ29tcG9uZW50KChYU0RDb21wb25lbnQpeHNkUGFydGljbGVDb250ZW50KTsKLSAgICAgIGVsc2UKLSAgICAgICAgeHNkQ29uZmlnLnNldFhTRENvbXBvbmVudChudWxsKTsKLSAgICAgIHhzZENvbmZpZy5zZXRTdHlsZSh0aGlzQ29uZmlnLmdldFN0eWxlKCkpOwotICAgICAgeHNkQ29uZmlnLnNldFBhcnRFbmNvZGluZyh0aGlzQ29uZmlnLmdldFBhcnRFbmNvZGluZygpKTsKLSAgICAgIHhzZENvbmZpZy5zZXRXU0RMUGFydE5hbWUodGhpc0NvbmZpZy5nZXRXU0RMUGFydE5hbWUoKSk7Ci0gICAgICBncm91cE1lbWJlcklEc1tpXSA9IGdlbklEKCk7Ci0gICAgICBhZGRGcmFnbWVudChncm91cE1lbWJlcklEc1tpXSwgZ2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKS5nZXRGcmFnbWVudCh4c2RDb25maWcsIGdyb3VwTWVtYmVySURzW2ldLCBncm91cE1lbWJlcklEc1tpXSkpOwotICAgIH0KLSAgICBzZXRHcm91cE1lbWJlcklEcyhncm91cElELCBncm91cE1lbWJlcklEcyk7Ci0gICAgcmV0dXJuIGdyb3VwSUQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBTZXFGaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cFNlcUZpeEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTFhMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cFNlcUZpeEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGNsYXNzIFhTREdyb3VwU2VxRml4RnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cFNlcUZyYWdtZW50IHsKLSAgcHVibGljIFhTREdyb3VwU2VxRml4RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyLCB4c2RNb2RlbEdyb3VwKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREdyb3VwU2VxRml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBTZXFGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cFNlcUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDgxMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cFNlcUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNER3JvdXBTZXFGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTREdyb3VwU2VxRnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cEZyYWdtZW50IGltcGxlbWVudHMgSVhTREdyb3VwU2VxRnJhZ21lbnQgewotICBwdWJsaWMgWFNER3JvdXBTZXFGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIsIHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBjcmVhdGVHcm91cFNlcUluc3RhbmNlKCkgewotICAgIHJldHVybiBjcmVhdGVHcm91cEluc3RhbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkgewotICAgIHJldHVybiBjcmVhdGVHcm91cFNlcUluc3RhbmNlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBTZXFSYW5nZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwU2VxUmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI2YTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBTZXFSYW5nZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGNsYXNzIFhTREdyb3VwU2VxUmFuZ2VGcmFnbWVudCBleHRlbmRzIFhTREdyb3VwU2VxRnJhZ21lbnQgewotICBwdWJsaWMgWFNER3JvdXBTZXFSYW5nZUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlciwgeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREdyb3VwUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RHcm91cFNlcVJhbmdlV0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNETWFwRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNETWFwRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjNjgwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRE1hcEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREF0dHJpYnV0ZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNETWFwRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RNYXBGcmFnbWVudCBleHRlbmRzIFhTREZyYWdtZW50IGltcGxlbWVudHMgSVhTRE1hcEZyYWdtZW50IHsKLSAgcHJpdmF0ZSBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyXzsKLSAgcHJpdmF0ZSBWZWN0b3IgZnJhZ21lbnRzT3JkZXJfOwotICBwcml2YXRlIEhhc2h0YWJsZSBmcmFnbWVudHNfOwotICBwcml2YXRlIEhhc2h0YWJsZSBhdHRyaWJ1dGVGcmFnbWVudHNfOwotCi0gIHB1YmxpYyBYU0RNYXBGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnKTsKLSAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7Ci0gICAgZnJhZ21lbnRzT3JkZXJfID0gbmV3IFZlY3RvcigpOwotICAgIGZyYWdtZW50c18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgYXR0cmlidXRlRnJhZ21lbnRzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24gewotICAgIGJvb2xlYW4gdmFsdWVzVmFsaWQgPSB0cnVlOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoZ2V0SUQoKSk7Ci0gICAgVmVjdG9yIGZyYWdzID0gbmV3IFZlY3RvcigpOwotICAgIFZlY3RvciBhdHRmcmFncyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChwYXJhbXNbaV0gIT0gbnVsbCkgewotICAgICAgICAgIElYU0RGcmFnbWVudCBmcmFnID0gZ2V0RnJhZ21lbnQocGFyYW1zW2ldKTsKLSAgICAgICAgICBpZiAoZnJhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmcmFncy5hZGQoZnJhZyk7Ci0gICAgICAgICAgICBpZiAoIWZyYWcucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpKQotICAgICAgICAgICAgICB2YWx1ZXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAJSVhTREF0dHJpYnV0ZUZyYWdtZW50IGFmcmFnID0gZ2V0QXR0cmlidXRlRnJhZ21lbnQocGFyYW1zW2ldKTsKLSAgICAgICAgICAJaWYgKGFmcmFnICE9IG51bGwpIHsKLSAgICAgICAgICAJICBhdHRmcmFncy5hZGQoYWZyYWcpOwotICAgICAgICAgICAgICBpZiAoIWFmcmFnLnByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMocGFyc2VyKSkKLSAgICAgICAgICAgICAgICAgdmFsdWVzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICAJCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmVtb3ZlQWxsRnJhZ21lbnRzKCk7Ci0gICAgcmVtb3ZlQWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gICAgYWRkQXR0cmlidXRlRnJhZ21lbnRzKGF0dGZyYWdzKTsKLSAgICBhZGRGcmFnbWVudHMoZnJhZ3MpOwotICAgIHJldHVybiB2YWx1ZXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXksIFN0cmluZ1tdIHBhcmFtcykgewotICAgIElYU0RGcmFnbWVudCBmcmFnID0gZ2V0RnJhZ21lbnQocGFyYW1LZXkpOwotICAgIGlmIChmcmFnICE9IG51bGwpCi0gICAgICBmcmFnLnNldFBhcmFtZXRlclZhbHVlcyhwYXJhbUtleSwgcGFyYW1zKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KSB7Ci0gICAgSVhTREZyYWdtZW50IGZyYWcgPSBnZXRGcmFnbWVudChwYXJhbUtleSk7Ci0gICAgcmV0dXJuIChmcmFnICE9IG51bGwpID8gZnJhZy5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXkpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkgewotICAgIElYU0RGcmFnbWVudFtdIGZyYWdtZW50cyA9IGdldEFsbEZyYWdtZW50cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAoIWZyYWdtZW50c1tpXS52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KSB7Ci0gICAgSVhTREZyYWdtZW50IGZyYWcgPSBnZXRGcmFnbWVudChwYXJhbUtleSk7Ci0gICAgcmV0dXJuIChmcmFnICE9IG51bGwpID8gZnJhZy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhwYXJhbUtleSkgOiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgcGFyYW1LZXksIGludCBwYXJhbUluZGV4KSB7Ci0gICAgSVhTREZyYWdtZW50IGZyYWcgPSBnZXRGcmFnbWVudChwYXJhbUtleSk7Ci0gICAgcmV0dXJuIChmcmFnICE9IG51bGwpID8gZnJhZy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlKHBhcmFtS2V5LCBwYXJhbUluZGV4KSA6IHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcihYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICB9Ci0KLSAgcHVibGljIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGdldFhTRFRvRnJhZ21lbnRDb250cm9sbGVyKCkgewotICAgIHJldHVybiBjb250cm9sbGVyXzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEZyYWdtZW50KFN0cmluZyBpZCwgSVhTREZyYWdtZW50IGZyYWcpIHsKLSAgICBhZGRGcmFnbWVudChpZCwgZnJhZywgdHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRGcmFnbWVudHMoU3RyaW5nW10gaWQsIElYU0RGcmFnbWVudFtdIGZyYWdzKSB7Ci0gICAgYWRkRnJhZ21lbnRzKGlkLCBmcmFncywgdHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRGcmFnbWVudChJWFNERnJhZ21lbnQgZnJhZykgewotICAgIGFkZEZyYWdtZW50KGZyYWcsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRnJhZ21lbnRzKElYU0RGcmFnbWVudFtdIGZyYWdzKSB7Ci0gICAgYWRkRnJhZ21lbnRzKGZyYWdzLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEZyYWdtZW50cyhWZWN0b3IgZnJhZ3MpIHsKLSAgICBhZGRGcmFnbWVudHMoZnJhZ3MsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRnJhZ21lbnQoU3RyaW5nIGlkLCBJWFNERnJhZ21lbnQgZnJhZywgYm9vbGVhbiBhZGRUb0NvbnRyb2xsZXIpIHsKLSAgICBmcmFnbWVudHNPcmRlcl8uYWRkKGlkKTsKLSAgICBmcmFnbWVudHNfLnB1dChpZCwgZnJhZyk7Ci0gICAgY29udHJvbGxlcl8uYWRkVG9DYWNoZShpZCwgZnJhZyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUZyYWdtZW50KFN0cmluZyBpZCwgSVhTREZyYWdtZW50IGZyYWcpIHsKLSAgICBhdHRyaWJ1dGVGcmFnbWVudHNfLnB1dChpZCwgZnJhZyk7Ci0gICAgY29udHJvbGxlcl8uYWRkVG9DYWNoZShpZCwgZnJhZyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJWFNEQXR0cmlidXRlRnJhZ21lbnRbXSBnZXRBbGxBdHRyaWJ1dGVGcmFnbWVudHMoKSB7Ci0gICAgSVhTREF0dHJpYnV0ZUZyYWdtZW50W10gZnJhZ21lbnRzID0gbmV3IFhTREF0dHJpYnV0ZUZyYWdtZW50W2F0dHJpYnV0ZUZyYWdtZW50c18uc2l6ZSgpXTsKLSAgICBJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZUZyYWdtZW50c18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUoaXQuaGFzTmV4dCgpKXsKLSAgICAgIGZyYWdtZW50c1tpXSA9IChJWFNEQXR0cmlidXRlRnJhZ21lbnQpaXQubmV4dCgpOwotICAgICAgaSsrOyAKLSAgICB9Ci0gICAgcmV0dXJuIGZyYWdtZW50czsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkRnJhZ21lbnRzKFN0cmluZ1tdIGlkLCBJWFNERnJhZ21lbnRbXSBmcmFncywgYm9vbGVhbiBhZGRUb0NvbnRyb2xsZXIpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkLmxlbmd0aCAmJiBpIDwgZnJhZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIGFkZEZyYWdtZW50KGlkW2ldLCBmcmFnc1tpXSwgYWRkVG9Db250cm9sbGVyKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRGcmFnbWVudChJWFNERnJhZ21lbnQgZnJhZywgYm9vbGVhbiBhZGRUb0NvbnRyb2xsZXIpIHsKLSAgICBhZGRGcmFnbWVudChmcmFnLmdldElEKCksIGZyYWcsIGFkZFRvQ29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRGcmFnbWVudHMoSVhTREZyYWdtZW50W10gZnJhZ3MsIGJvb2xlYW4gYWRkVG9Db250cm9sbGVyKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFncy5sZW5ndGg7IGkrKykgewotICAgICAgYWRkRnJhZ21lbnQoZnJhZ3NbaV0uZ2V0SUQoKSwgZnJhZ3NbaV0sIGFkZFRvQ29udHJvbGxlcik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRnJhZ21lbnRzKFZlY3RvciBmcmFncywgYm9vbGVhbiBhZGRUb0NvbnRyb2xsZXIpIHsKLSAgICBJdGVyYXRvciBpdCA9IGZyYWdzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJWFNERnJhZ21lbnQpIHsKLSAgICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSAoSVhTREZyYWdtZW50KW9iajsKLSAgICAgICAgYWRkRnJhZ21lbnQoZnJhZy5nZXRJRCgpLCBmcmFnLCBhZGRUb0NvbnRyb2xsZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUZyYWdtZW50cyhWZWN0b3IgZnJhZ3MpIHsKLSAgICBJdGVyYXRvciBpdCA9IGZyYWdzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJWFNEQXR0cmlidXRlRnJhZ21lbnQpIHsKLSAgICAgICAgSVhTREF0dHJpYnV0ZUZyYWdtZW50IGZyYWcgPSAoSVhTREF0dHJpYnV0ZUZyYWdtZW50KW9iajsKLSAgICAgICAgYWRkQXR0cmlidXRlRnJhZ21lbnQoZnJhZy5nZXRJRCgpLCBmcmFnKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRGcmFnbWVudHNPcmRlcigpIHsKLSAgICBTdHJpbmdbXSBmcmFnbWVudHNPcmRlciA9IG5ldyBTdHJpbmdbZnJhZ21lbnRzT3JkZXJfLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHNPcmRlci5sZW5ndGg7IGkrKykgewotICAgICAgZnJhZ21lbnRzT3JkZXJbaV0gPSAoU3RyaW5nKWZyYWdtZW50c09yZGVyXy5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBmcmFnbWVudHNPcmRlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHNldEZyYWdtZW50c09yZGVyKFN0cmluZ1tdIGZyYWdtZW50c09yZGVyKSB7Ci0gICAgaWYgKGZyYWdtZW50c09yZGVyLmxlbmd0aCAhPSBmcmFnbWVudHNPcmRlcl8uc2l6ZSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFZlY3RvciBmcmFnbWVudHNPcmRlckNvcHkgPSBuZXcgVmVjdG9yKGZyYWdtZW50c09yZGVyXyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHNPcmRlci5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKCFmcmFnbWVudHNPcmRlckNvcHkucmVtb3ZlKGZyYWdtZW50c09yZGVyW2ldKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmcmFnbWVudHNPcmRlcl8uY2xlYXIoKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGZyYWdtZW50c09yZGVyLmxlbmd0aDsgaisrKSB7Ci0gICAgICBmcmFnbWVudHNPcmRlcl8uYWRkKGZyYWdtZW50c09yZGVyW2pdKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgSVhTREF0dHJpYnV0ZUZyYWdtZW50IGdldEF0dHJpYnV0ZUZyYWdtZW50KFN0cmluZyBpZCkgewotICAgIHJldHVybiAoSVhTREF0dHJpYnV0ZUZyYWdtZW50KWF0dHJpYnV0ZUZyYWdtZW50c18uZ2V0KGlkKTsKLSAgfQotICAKLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChTdHJpbmcgaWQpIHsKLSAgICByZXR1cm4gKElYU0RGcmFnbWVudClmcmFnbWVudHNfLmdldChpZCk7Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50W10gZ2V0RnJhZ21lbnRzKFN0cmluZ1tdIGlkcykgewotICAgIElYU0RGcmFnbWVudFtdIGZyYWdzID0gbmV3IElYU0RGcmFnbWVudFtpZHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBmcmFnc1tpXSA9IGdldEZyYWdtZW50KGlkc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiBmcmFnczsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnRbXSBnZXRBbGxGcmFnbWVudHMoKSB7Ci0gICAgSVhTREZyYWdtZW50W10gZnJhZ21lbnRzID0gbmV3IElYU0RGcmFnbWVudFtmcmFnbWVudHNPcmRlcl8uc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50c09yZGVyXy5zaXplKCk7IGkrKykgewotICAgICAgZnJhZ21lbnRzW2ldID0gZ2V0RnJhZ21lbnQoKFN0cmluZylmcmFnbWVudHNPcmRlcl8uZ2V0KGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZyYWdtZW50czsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZyYWdtZW50KFN0cmluZyBpZCkgewotICAgIHJlbW92ZUZyYWdtZW50KGlkLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZyYWdtZW50cyhTdHJpbmdbXSBpZHMpIHsKLSAgICByZW1vdmVGcmFnbWVudHMoaWRzLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbEZyYWdtZW50cygpIHsKLSAgICByZW1vdmVBbGxGcmFnbWVudHModHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcmFnbWVudChTdHJpbmcgaWQsIGJvb2xlYW4gcmVtb3ZlRnJvbUNvbnRyb2xsZXIpIHsKLSAgICBmcmFnbWVudHNPcmRlcl8ucmVtb3ZlKGlkKTsKLSAgICBmcmFnbWVudHNfLnJlbW92ZShpZCk7Ci0gICAgaWYgKHJlbW92ZUZyb21Db250cm9sbGVyKQotICAgICAgY29udHJvbGxlcl8ucmVtb3ZlRnJvbUNhY2hlKGlkKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZyYWdtZW50cyhTdHJpbmdbXSBpZHMsIGJvb2xlYW4gcmVtb3ZlRnJvbUNvbnRyb2xsZXIpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotICAgICAgcmVtb3ZlRnJhZ21lbnQoaWRzW2ldLCByZW1vdmVGcm9tQ29udHJvbGxlcik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsRnJhZ21lbnRzKGJvb2xlYW4gcmVtb3ZlRnJvbUNvbnRyb2xsZXIpIHsKLSAgICBpZiAocmVtb3ZlRnJvbUNvbnRyb2xsZXIpCi0gICAgewotICAgICAgRW51bWVyYXRpb24gaWRzID0gZnJhZ21lbnRzXy5rZXlzKCk7Ci0gICAgICB3aGlsZSAoaWRzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgaWQgPSAoU3RyaW5nKWlkcy5uZXh0RWxlbWVudCgpOwotICAgICAgICBjb250cm9sbGVyXy5yZW1vdmVGcm9tQ2FjaGUoaWQpOwotICAgICAgfQotICAgIH0KLSAgICBmcmFnbWVudHNPcmRlcl8uY2xlYXIoKTsKLSAgICBmcmFnbWVudHNfLmNsZWFyKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbEF0dHJpYnV0ZUZyYWdtZW50cygpIHsKLSAgICAgIEVudW1lcmF0aW9uIGlkcyA9IGF0dHJpYnV0ZUZyYWdtZW50c18ua2V5cygpOwotICAgICAgd2hpbGUgKGlkcy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGlkID0gKFN0cmluZylpZHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgY29udHJvbGxlcl8ucmVtb3ZlRnJvbUNhY2hlKGlkKTsKLSAgICAgIH0KLSAgICAKLSAgICAgIGF0dHJpYnV0ZUZyYWdtZW50c18uY2xlYXIoKTsKLSAgfQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVGaXhGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmU1MzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVGaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVBdG9taWNEYXRlVGltZUZpeEZyYWdtZW50IGV4dGVuZHMgWFNEU2ltcGxlQXRvbWljRml4RnJhZ21lbnQgewotICBwcml2YXRlIGludCBjYWxlbmRhclR5cGVfOwotICBwdWJsaWMgWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVGaXhGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIGludCBjYWxlbmRhclR5cGUpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnKTsKLSAgICBjYWxlbmRhclR5cGVfID0gY2FsZW5kYXJUeXBlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgU3RyaW5nQnVmZmVyIGZyYWdtZW50TGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4V0ZyYWdtZW50SlNQLmpzcD8iKTsKLSAgICBmcmFnbWVudExpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQoY2FsZW5kYXJUeXBlXyk7Ci0gICAgcmV0dXJuIGZyYWdtZW50TGluay50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lUmFuZ2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNEYXRlVGltZVJhbmdlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiMmYyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lUmFuZ2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVBdG9taWNEYXRlVGltZVJhbmdlRnJhZ21lbnQgZXh0ZW5kcyBYU0RTaW1wbGVBdG9taWNSYW5nZUZyYWdtZW50IHsKLSAgcHJpdmF0ZSBpbnQgY2FsZW5kYXJUeXBlXzsKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY0RhdGVUaW1lUmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIGludCBjYWxlbmRhclR5cGUpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnKTsKLSAgICBjYWxlbmRhclR5cGVfID0gY2FsZW5kYXJUeXBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIFN0cmluZ0J1ZmZlciBmcmFnbWVudExpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNEYXRlVGltZVJhbmdlV0ZyYWdtZW50SlNQLmpzcD8iKTsKLSAgICBmcmFnbWVudExpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQoY2FsZW5kYXJUeXBlXyk7Ci0gICAgcmV0dXJuIGZyYWdtZW50TGluay50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNFbnVtRml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2YmQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuT3B0aW9uVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlQXRvbWljRW51bUZpeEZyYWdtZW50IGV4dGVuZHMgWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50IHsKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIEVMaXN0IGVsaXN0KSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgZWxpc3QpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEU2ltcGxlQXRvbWljRW51bUZpeEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgT3B0aW9uVmVjdG9yIHYpCi0gIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCB2KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0luZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0VudW1GaXhXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNFbnVtRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Mzg3ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNFbnVtRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsLk9wdGlvblZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZUF0b21pY0ZyYWdtZW50IHsKLSAgcHJpdmF0ZSBPcHRpb25WZWN0b3Igb3B0aW9uVmVjdG9yXzsKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIEVMaXN0IGVsaXN0KSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgb3B0aW9uVmVjdG9yXyA9IG5ldyBPcHRpb25WZWN0b3IoKTsKLSAgICBmb3IgKGludCBpPTA7aTxlbGlzdC5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBlbnVtVmFsdWUgPSAoKFhTREVudW1lcmF0aW9uRmFjZXQpZWxpc3QuZ2V0KGkpKS5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgIG9wdGlvblZlY3Rvcl8uYWRkT3B0aW9uKGVudW1WYWx1ZSxlbnVtVmFsdWUpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIE9wdGlvblZlY3RvciB2KQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgb3B0aW9uVmVjdG9yXyA9IG5ldyBPcHRpb25WZWN0b3IoKTsKLSAgICBmb3IgKGludCBpPTA7aTx2LnNpemUoKTtpKyspCi0gICAgICBvcHRpb25WZWN0b3JfLmFkZE9wdGlvbih2LmdldERpc3BsYXlWYWx1ZShpKSx2LmdldFZhbHVlKGkpKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIE9wdGlvblZlY3RvciBnZXRPcHRpb25WZWN0b3IoKQotICB7Ci0gICAgcmV0dXJuIG9wdGlvblZlY3Rvcl87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkM2M4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0VudW1SYW5nZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC5PcHRpb25WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudCB7Ci0gIHB1YmxpYyBYU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIEVMaXN0IGVsaXN0KSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgZWxpc3QpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBPcHRpb25WZWN0b3IgdikKLSAgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIHYpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljSW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY1JGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlV0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRml4RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4ZGRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0ZpeEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZUF0b21pY0ZpeEZyYWdtZW50IGV4dGVuZHMgWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQgewotICBwdWJsaWMgWFNEU2ltcGxlQXRvbWljRml4RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNGaXhXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzJmNmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RTaW1wbGVBdG9taWNGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RTaW1wbGVBdG9taWNGcmFnbWVudCBleHRlbmRzIFhTREZyYWdtZW50IGltcGxlbWVudHMgSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50IHsKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY0ZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgcGFyYW1LZXksIGludCBwYXJhbUluZGV4KSB7Ci0gICAgU3RyaW5nIHBhcmFtID0gZ2V0UGFyYW1ldGVyVmFsdWUocGFyYW1LZXksIHBhcmFtSW5kZXgpOwotICAgIGlmIChwYXJhbSAhPSBudWxsICYmICEoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCkpLmlzVmFsaWRMaXRlcmFsKHBhcmFtKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNSYW5nZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY1JhbmdlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiYmQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY1JhbmdlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlQXRvbWljUmFuZ2VGcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZUF0b21pY0ZyYWdtZW50IHsKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY1JhbmdlRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNSYW5nZVdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUxpc3RGaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0Rml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2NWJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUxpc3RGaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVMaXN0Rml4RnJhZ21lbnQgZXh0ZW5kcyBYU0RTaW1wbGVMaXN0RnJhZ21lbnQgewotICBwdWJsaWMgWFNEU2ltcGxlTGlzdEZpeEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVMaXN0UkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVMaXN0Rml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlTGlzdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzY2NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMTcgICAxMjcxMzggcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTRFNpbXBsZUxpc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heExlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5MZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNEU2ltcGxlTGlzdEZyYWdtZW50IGV4dGVuZHMgWFNETWFwRnJhZ21lbnQgaW1wbGVtZW50cyBJWFNEU2ltcGxlTGlzdEZyYWdtZW50Ci17Ci0gIHB1YmxpYyBYU0RTaW1wbGVMaXN0RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIuc2V0TmFtZShuYW1lKTsKLSAgICBJWFNERnJhZ21lbnRbXSBmcmFnbWVudHMgPSBnZXRBbGxGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBmcmFnbWVudHNbaV0uc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKQotICB7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGdldEluc3RhbmNlRG9jdW1lbnRzQnlUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCBnZXROYW1lKCkpOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aF07Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IGludGVybmFsRXF1YWxzKGluc3RhbmNlRG9jdW1lbnRzQ29weSwgaW5zdGFuY2VEb2N1bWVudHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHBhcmFtc1tpXSA9ICIiOwotICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBpbnN0YW5jZURvY3VtZW50c0NvcHlbaV0uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwYXJhbXNbaV0gPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICByZW1vdmVBbGxGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJWFNERnJhZ21lbnQgY2hpbGRGcmFnID0gZ2V0RnJhZ21lbnQoY3JlYXRlTGlzdEluc3RhbmNlKCkpOwotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXJhbXNbaV0udHJpbSgpKTsKLSAgICAgIFN0cmluZ1tdIGNoaWxkUGFyYW1zID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRQYXJhbXMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkUGFyYW1zW2pdID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgICBjaGlsZEZyYWcuc2V0UGFyYW1ldGVyVmFsdWVzKGNoaWxkRnJhZy5nZXRJRCgpLCBjaGlsZFBhcmFtcyk7Ci0gICAgICBwYXJhbXNWYWxpZCA9IHBhcmFtc1ZhbGlkICYmIGNoaWxkRnJhZy52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgSVhTREZyYWdtZW50W10gZnJhZ21lbnRzID0gZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbZnJhZ21lbnRzLmxlbmd0aF07Ci0gICAgU3RyaW5nIHRhZ05hbWUgPSBnZXRJbnN0YW5jZURvY3VtZW50VGFnTmFtZShuYW1lc3BhY2VUYWJsZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCBpbnN0YW5jZURvY3VtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0gICAgICBTdHJpbmdCdWZmZXIgbGlzdFZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgU3RyaW5nW10gcGFyYW1zID0gZnJhZ21lbnRzW2ldLmdldFBhcmFtZXRlclZhbHVlcyhmcmFnbWVudHNbaV0uZ2V0SUQoKSk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgcGFyYW1zICE9IG51bGwgJiYgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGogIT0gMCkKLSAgICAgICAgICBsaXN0VmFsdWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkxJU1RfU0VQRVJBVE9SKTsKLSAgICAgICAgbGlzdFZhbHVlLmFwcGVuZChwYXJhbXNbal0pOwotICAgICAgfQotICAgICAgTm9kZSB0ZXh0Tm9kZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZShsaXN0VmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICBpbnN0YW5jZURvY3VtZW50LmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2ldID0gaW5zdGFuY2VEb2N1bWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIChnZW5YU0lUeXBlID8gYWRkWFNJVHlwZShpbnN0YW5jZURvY3VtZW50cywgbmFtZXNwYWNlVGFibGUpIDogaW5zdGFuY2VEb2N1bWVudHMpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBjcmVhdGVMaXN0SW5zdGFuY2UoKQotICB7Ci0gICAgU3RyaW5nIG5ld0lEID0gZ2VuSUQoKTsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaW50IG1pbiA9IDA7Ci0gICAgaW50IG1heCA9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRDsKLSAgICBYU0RMZW5ndGhGYWNldCB4c2RMZW5ndGhGYWNldCA9IHNpbXBsZVR5cGUuZ2V0TGVuZ3RoRmFjZXQoKTsKLSAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgIGlmICh4c2RMZW5ndGhGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIG1pbiA9IHhzZExlbmd0aEZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICBtYXggPSB4c2RMZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgWFNETWluTGVuZ3RoRmFjZXQgeHNkTWluTGVuZ3RoRmFjZXQgPSBzaW1wbGVUeXBlLmdldE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICBYU0RNYXhMZW5ndGhGYWNldCB4c2RNYXhMZW5ndGhGYWNldCA9IHNpbXBsZVR5cGUuZ2V0TWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgICBpZiAoeHNkTWluTGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgbWluID0geHNkTWluTGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgIGlmICh4c2RNYXhMZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICBtYXggPSB4c2RNYXhMZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICAgIH0KLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB0aGlzQ29uZmlnID0gZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBuZXcgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgICB4c2RDb25maWcuc2V0WFNEQ29tcG9uZW50KHNpbXBsZVR5cGUuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCkpOwotICAgIHhzZENvbmZpZy5zZXRTdHlsZSh0aGlzQ29uZmlnLmdldFN0eWxlKCkpOwotICAgIHhzZENvbmZpZy5zZXRQYXJ0RW5jb2RpbmcodGhpc0NvbmZpZy5nZXRQYXJ0RW5jb2RpbmcoKSk7Ci0gICAgeHNkQ29uZmlnLnNldFdTRExQYXJ0TmFtZSh0aGlzQ29uZmlnLmdldFdTRExQYXJ0TmFtZSgpKTsKLSAgICB4c2RDb25maWcuc2V0TWluT2NjdXJzKG1pbik7Ci0gICAgeHNkQ29uZmlnLnNldE1heE9jY3VycyhtYXgpOwotICAgIElYU0RGcmFnbWVudCBmcmFnID0gZ2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKS5nZXRGcmFnbWVudCh4c2RDb25maWcsIG5ld0lELCBnZXROYW1lKCkpOwotICAgIGZyYWcuc2V0SUQobmV3SUQpOwotICAgIGZyYWcuc2V0TmFtZShnZXROYW1lKCkpOwotICAgIGFkZEZyYWdtZW50KG5ld0lELCBmcmFnKTsKLSAgICByZXR1cm4gbmV3SUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVMaXN0SW5zdGFuY2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0UmFuZ2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0UmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWI5NTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlTGlzdFJhbmdlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlTGlzdFJhbmdlRnJhZ21lbnQgZXh0ZW5kcyBYU0RTaW1wbGVMaXN0RnJhZ21lbnQgewotICBwdWJsaWMgWFNEU2ltcGxlTGlzdFJhbmdlRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RSYW5nZVdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlVW5pb25GaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVVbmlvbkZpeEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzIyNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVVbmlvbkZpeEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZVVuaW9uRml4RnJhZ21lbnQgZXh0ZW5kcyBYU0RTaW1wbGVVbmlvbkZyYWdtZW50IHsKLSAgcHVibGljIFhTRFNpbXBsZVVuaW9uRml4RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvbkZpeFdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZVVuaW9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlVW5pb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTIwZTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlVW5pb25GcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RTaW1wbGVVbmlvbkZyYWdtZW50IGV4dGVuZHMgWFNETWFwRnJhZ21lbnQgaW1wbGVtZW50cyBJWFNEU2ltcGxlVW5pb25GcmFnbWVudCB7Ci0gIHByaXZhdGUgWFNEU2ltcGxlVHlwZURlZmluaXRpb25bXSBtZW1iZXJUeXBlc187Ci0KLSAgcHVibGljIFhTRFNpbXBsZVVuaW9uRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlcik7Ci0gICAgbWVtYmVyVHlwZXNfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICBzdXBlci5zZXROYW1lKG5hbWUpOwotICAgIElYU0RGcmFnbWVudFtdIGZyYWdtZW50cyA9IGdldEFsbEZyYWdtZW50cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBmcmFnbWVudHNbaV0uc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKSB7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGdldEluc3RhbmNlRG9jdW1lbnRzQnlUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCBnZXROYW1lKCkpOwotICAgIGludCBudW1UeXBlcyA9IGdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpLmxlbmd0aDsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gaW50ZXJuYWxFcXVhbHMoaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBpbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgVmVjdG9yIG1lbWJlckZyYWdtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzQ29weS5sZW5ndGg7IGkrKykgewotICAgICAgSVhTREZyYWdtZW50IGNvbXBhdGlibGVGcmFnID0gbnVsbDsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtVHlwZXM7IGorKykgewotICAgICAgICBJWFNERnJhZ21lbnQgbWVtYmVyRnJhZyA9IGdldEZyYWdtZW50KGNyZWF0ZVVuaW9uSW5zdGFuY2UoaikpOwotICAgICAgICBFbGVtZW50W10gbWVtYmVySW5zdGFuY2VEb2N1bWVudCA9IG5ldyBFbGVtZW50WzFdOwotICAgICAgICBtZW1iZXJJbnN0YW5jZURvY3VtZW50WzBdID0gc2V0RWxlbWVudFRhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHNDb3B5W2ldLCBtZW1iZXJGcmFnLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChtZW1iZXJGcmFnLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhtZW1iZXJJbnN0YW5jZURvY3VtZW50KSkgewotICAgICAgICAgIGlmIChtZW1iZXJGcmFnLnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGNvbXBhdGlibGVGcmFnID0gbWVtYmVyRnJhZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChjb21wYXRpYmxlRnJhZyA9PSBudWxsKQotICAgICAgICAgICAgY29tcGF0aWJsZUZyYWcgPSBtZW1iZXJGcmFnOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoY29tcGF0aWJsZUZyYWcgIT0gbnVsbCkKLSAgICAgICAgbWVtYmVyRnJhZ21lbnRzLmFkZChjb21wYXRpYmxlRnJhZyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJlbW92ZUFsbEZyYWdtZW50cygpOwotICAgIGFkZEZyYWdtZW50cyhtZW1iZXJGcmFnbWVudHMpOwotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBEb2N1bWVudCBkb2MpIHsKLSAgICBJWFNERnJhZ21lbnRbXSBmcmFnbWVudHMgPSBnZXRBbGxGcmFnbWVudHMoKTsKLSAgICBWZWN0b3IgaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBFbGVtZW50W10gZnJhZ21lbnRJbnN0YW5jZXMgPSBmcmFnbWVudHNbaV0uZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCBkb2MpOwotICAgICAgaWYgKGZyYWdtZW50SW5zdGFuY2VzLmxlbmd0aCA+IDApCi0gICAgICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weS5hZGQoZnJhZ21lbnRJbnN0YW5jZXNbMF0pOwotICAgIH0KLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFtpbnN0YW5jZURvY3VtZW50c0NvcHkuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpbnN0YW5jZURvY3VtZW50c1tpXSA9IChFbGVtZW50KWluc3RhbmNlRG9jdW1lbnRzQ29weS5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBzZXRFbGVtZW50c1RhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHMsIGdldEluc3RhbmNlRG9jdW1lbnRUYWdOYW1lKG5hbWVzcGFjZVRhYmxlKSk7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb25bXSBnZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKSB7Ci0gICAgaWYgKG1lbWJlclR5cGVzXyA9PSBudWxsKSB7Ci0gICAgICBFTGlzdCBtZW1iZXJUeXBlcyA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZ2V0WFNEVHlwZURlZmluaXRpb24oKSkuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICBtZW1iZXJUeXBlc18gPSBuZXcgWFNEU2ltcGxlVHlwZURlZmluaXRpb25bbWVtYmVyVHlwZXMuc2l6ZSgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIG1lbWJlclR5cGVzX1tpXSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiltZW1iZXJUeXBlcy5nZXQoaSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZW1iZXJUeXBlc187Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVVuaW9uSW5zdGFuY2UoaW50IG1lbWJlclR5cGVJbmRleCkgewotICAgIGdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotICAgIGlmIChtZW1iZXJUeXBlSW5kZXggPCAwIHx8IG1lbWJlclR5cGVJbmRleCA+IG1lbWJlclR5cGVzXy5sZW5ndGggLSAxKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgU3RyaW5nIG5ld0lEID0gZ2VuSUQoKTsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB0aGlzQ29uZmlnID0gZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBuZXcgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgICB4c2RDb25maWcuc2V0WFNEQ29tcG9uZW50KG1lbWJlclR5cGVzX1ttZW1iZXJUeXBlSW5kZXhdKTsKLSAgICB4c2RDb25maWcuc2V0U3R5bGUodGhpc0NvbmZpZy5nZXRTdHlsZSgpKTsKLSAgICB4c2RDb25maWcuc2V0UGFydEVuY29kaW5nKHRoaXNDb25maWcuZ2V0UGFydEVuY29kaW5nKCkpOwotICAgIHhzZENvbmZpZy5zZXRXU0RMUGFydE5hbWUodGhpc0NvbmZpZy5nZXRXU0RMUGFydE5hbWUoKSk7Ci0gICAgSVhTREZyYWdtZW50IGZyYWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldEZyYWdtZW50KHhzZENvbmZpZywgbmV3SUQsIGdldE5hbWUoKSk7Ci0gICAgZnJhZy5zZXRJRChuZXdJRCk7Ci0gICAgZnJhZy5zZXROYW1lKGdldE5hbWUoKSk7Ci0gICAgYWRkRnJhZ21lbnQobmV3SUQsIGZyYWcpOwotICAgIHJldHVybiBuZXdJRDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlSW5zdGFuY2UoKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVuaW9uSW5zdGFuY2UoMCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVVbmlvblJhbmdlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlVW5pb25SYW5nZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMmJiOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVVbmlvblJhbmdlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVW5pb25SYW5nZUZyYWdtZW50IGV4dGVuZHMgWFNEU2ltcGxlVW5pb25GcmFnbWVudCB7Ci0gIHB1YmxpYyBYU0RTaW1wbGVVbmlvblJhbmdlRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvblJhbmdlV0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvSFRUUFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvSFRUUFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0ODdlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC91dGlsL0hUVFBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVVJMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTRFNpbXBsZUxpc3RGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgSFRUUFV0aWwKLXsKLSAgcHJpdmF0ZSBIVFRQVXRpbCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlblVSTEVuY29kZWRQYXJhbWV0ZXJzKElYU0RGcmFnbWVudCBmcmFnbWVudCkKLSAgewotICAgIGlmIChmcmFnbWVudCBpbnN0YW5jZW9mIElYU0RTaW1wbGVMaXN0RnJhZ21lbnQpCi0gICAgICByZXR1cm4gZ2VuVVJMRW5jb2RlZFBhcmFtc0Zyb21MaXN0RnJhZ21lbnQoKElYU0RTaW1wbGVMaXN0RnJhZ21lbnQpZnJhZ21lbnQpOwotICAgIGVsc2UgaWYgKGZyYWdtZW50IGluc3RhbmNlb2YgSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50KQotICAgICAgcmV0dXJuIGdlblVSTEVuY29kZWRQYXJhbXNGcm9tQXRvbWljRnJhZ21lbnQoKElYU0RTaW1wbGVBdG9taWNGcmFnbWVudClmcmFnbWVudCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGdlblVSTEVuY29kZWRYTUxQYXJhbWV0ZXJzKGZyYWdtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZW5VUkxFbmNvZGVkUGFyYW1zRnJvbUF0b21pY0ZyYWdtZW50KElYU0RTaW1wbGVBdG9taWNGcmFnbWVudCBmcmFnbWVudCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciB1cmxFbmNvZGVkUGFyYW0gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgU3RyaW5nW10gcGFyYW1zID0gZnJhZ21lbnQuZ2V0UGFyYW1ldGVyVmFsdWVzKGZyYWdtZW50LmdldElEKCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHVybEVuY29kZWRQYXJhbS5hcHBlbmQoVVJMVXRpbHMuZW5jb2RlKGZyYWdtZW50LmdldE5hbWUoKSkpOwotICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZCgiPSIpOwotICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZChVUkxVdGlscy5lbmNvZGUocGFyYW1zW2ldKSk7Ci0gICAgICBpZiAoaSA8IHBhcmFtcy5sZW5ndGggLSAxKQotICAgICAgICB1cmxFbmNvZGVkUGFyYW0uYXBwZW5kKCImIik7Ci0gICAgfQotICAgIHJldHVybiB1cmxFbmNvZGVkUGFyYW0udG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZW5VUkxFbmNvZGVkUGFyYW1zRnJvbUxpc3RGcmFnbWVudChJWFNEU2ltcGxlTGlzdEZyYWdtZW50IGZyYWdtZW50KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHVybEVuY29kZWRQYXJhbSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBJWFNERnJhZ21lbnRbXSBjaGlsZEZyYWdzID0gZnJhZ21lbnQuZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEZyYWdzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHVybEVuY29kZWRQYXJhbS5hcHBlbmQoVVJMVXRpbHMuZW5jb2RlKGZyYWdtZW50LmdldE5hbWUoKSkpOwotICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZCgiPSIpOwotICAgICAgU3RyaW5nW10gcGFyYW1zID0gY2hpbGRGcmFnc1tpXS5nZXRQYXJhbWV0ZXJWYWx1ZXMoY2hpbGRGcmFnc1tpXS5nZXRJRCgpKTsKLSAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBwYXJhbUJ1ZmZlci5hcHBlbmQocGFyYW1zW2pdKTsKLSAgICAgICAgaWYgKGogPCBwYXJhbXMubGVuZ3RoIC0gMSkKLSAgICAgICAgICBwYXJhbUJ1ZmZlci5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuTElTVF9TRVBFUkFUT1IpOwotICAgICAgfQotICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZChVUkxVdGlscy5lbmNvZGUocGFyYW1CdWZmZXIudG9TdHJpbmcoKSkpOwotICAgICAgaWYgKGkgPCBjaGlsZEZyYWdzLmxlbmd0aCAtIDEpCi0gICAgICAgIHVybEVuY29kZWRQYXJhbS5hcHBlbmQoIiYiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVybEVuY29kZWRQYXJhbS50b1N0cmluZygpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdlblVSTEVuY29kZWRYTUxQYXJhbWV0ZXJzKElYU0RGcmFnbWVudCBmcmFnbWVudCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciB1cmxFbmNvZGVkUGFyYW0gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChDb25zdGFudHMuVVJJX1NPQVAxMV9FTlYsIENvbnN0YW50cy5OU19QUkVGSVhfU09BUF9FTlYpOwotICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTSSwgQ29uc3RhbnRzLk5TX1BSRUZJWF9TQ0hFTUFfWFNJKTsKLSAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5wdXQoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsIENvbnN0YW50cy5OU19QUkVGSVhfU0NIRU1BX1hTRCk7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbMF07Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaW5zdGFuY2VEb2N1bWVudHMgPSBmcmFnbWVudC5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXModHJ1ZSwgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUsIFhNTFV0aWxzLmNyZWF0ZU5ld0RvY3VtZW50KG51bGwpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKQotICAgIHsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB1cmxFbmNvZGVkUGFyYW0uYXBwZW5kKFVSTFV0aWxzLmVuY29kZShmcmFnbWVudC5nZXROYW1lKCkpKTsKLSAgICAgIHVybEVuY29kZWRQYXJhbS5hcHBlbmQoIj0iKTsKLSAgICAgIHVybEVuY29kZWRQYXJhbS5hcHBlbmQoVVJMVXRpbHMuZW5jb2RlKFhNTFV0aWxzLnNlcmlhbGl6ZShpbnN0YW5jZURvY3VtZW50c1tpXSwgdHJ1ZSkpKTsKLSAgICAgIGlmIChpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoIC0gMSkKLSAgICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZCgiJiIpOwotICAgIH0KLSAgICByZXR1cm4gdXJsRW5jb2RlZFBhcmFtLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvT3B0aW9uVmVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC91dGlsL09wdGlvblZlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTI4ODFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvT3B0aW9uVmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgT3B0aW9uVmVjdG9yCi17Ci0gIHByaXZhdGUgVmVjdG9yIG9wdGlvbnNfOwotICAKLSAgcHVibGljIE9wdGlvblZlY3RvcigpCi0gIHsKLSAgICBvcHRpb25zXyA9IG5ldyBWZWN0b3IoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkT3B0aW9uKFN0cmluZyBkaXNwbGF5VmFsdWUsU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgb3B0aW9uc18uYWRkRWxlbWVudChuZXcgT3B0aW9uKGRpc3BsYXlWYWx1ZSx2YWx1ZSkpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShpbnQgcG9zaXRpb24pCi0gIHsKLSAgICBPcHRpb24gb3B0aW9uID0gKE9wdGlvbilvcHRpb25zXy5lbGVtZW50QXQocG9zaXRpb24pOwotICAgIHJldHVybiBvcHRpb24uZ2V0RGlzcGxheVZhbHVlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IHBvc2l0aW9uKQotICB7Ci0gICAgT3B0aW9uIG9wdGlvbiA9IChPcHRpb24pb3B0aW9uc18uZWxlbWVudEF0KHBvc2l0aW9uKTsKLSAgICByZXR1cm4gb3B0aW9uLmdldFZhbHVlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgc2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gb3B0aW9uc18uc2l6ZSgpOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIGNsYXNzIE9wdGlvbgotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheVZhbHVlXzsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZV87Ci0gICAgcHVibGljIE9wdGlvbihTdHJpbmcgZGlzcGxheVZhbHVlLFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBkaXNwbGF5VmFsdWVfID0gZGlzcGxheVZhbHVlOwotICAgICAgdmFsdWVfID0gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZGlzcGxheVZhbHVlXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgcmV0dXJuIHZhbHVlXzsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvWFNEVHlwZURlZmluaXRpb25VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC91dGlsL1hTRFR5cGVEZWZpbml0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGUyNTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvWFNEVHlwZURlZmluaXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RUeXBlRGVmaW5pdGlvblV0aWwgewotICBwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uVXRpbCgpIHsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmcgbnMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIHJldHVybiAobnMgIT0gbnVsbCAmJiBucy5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuVVJJX1hTRCkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIFN0cmluZyB0eXBlTlMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIFN0cmluZyBiYXNlVHlwZU5TID0gYmFzZVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgU3RyaW5nIHR5cGVOYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIGJhc2VUeXBlTmFtZSA9IGJhc2VUeXBlLmdldE5hbWUoKTsKLSAgICBib29sZWFuIHNhbWVOUzsKLSAgICBib29sZWFuIHNhbWVOYW1lOwotICAgIGlmICh0eXBlTlMgPT0gbnVsbCAmJiBiYXNlVHlwZU5TID09IG51bGwpCi0gICAgICBzYW1lTlMgPSB0cnVlOwotICAgIGVsc2UgaWYgKHR5cGVOUyAhPSBudWxsICYmIGJhc2VUeXBlTlMgIT0gbnVsbCAmJiB0eXBlTlMuZXF1YWxzKGJhc2VUeXBlTlMpKQotICAgICAgc2FtZU5TID0gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICBzYW1lTlMgPSBmYWxzZTsKLSAgICBpZiAodHlwZU5hbWUgPT0gbnVsbCAmJiBiYXNlVHlwZU5hbWUgPT0gbnVsbCkKLSAgICAgIHNhbWVOYW1lID0gdHJ1ZTsKLSAgICBlbHNlIGlmICh0eXBlTmFtZSAhPSBudWxsICYmIGJhc2VUeXBlTmFtZSAhPSBudWxsICYmIHR5cGVOYW1lLmVxdWFscyhiYXNlVHlwZU5hbWUpKQotICAgICAgc2FtZU5hbWUgPSB0cnVlOwotICAgIGVsc2UKLSAgICAgIHNhbWVOYW1lID0gZmFsc2U7Ci0gICAgcmV0dXJuIChzYW1lTlMgJiYgc2FtZU5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIGN1cnJUeXBlID0gdHlwZTsKLSAgICB3aGlsZSAoIWlzWFNEQnVpbHRJblR5cGVEZWZpbml0aW9uKGN1cnJUeXBlKSkgewotICAgICAgaWYgKGlzUm9vdFR5cGVEZWZpbml0aW9uKGN1cnJUeXBlKSkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICBjdXJyVHlwZSA9IGN1cnJUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgfQotICAgIHJldHVybiBjdXJyVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NvYXBFbmNBcnJheShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gY3VyclR5cGUgPSB0eXBlOwotICAgIGlmIChjdXJyVHlwZSAhPSBudWxsKQotICAgIHdoaWxlKGN1cnJUeXBlICE9IG51bGwpIHsKLSAgICAgIFN0cmluZyBucyA9IGN1cnJUeXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgU3RyaW5nIG5hbWUgPSBjdXJyVHlwZS5nZXROYW1lKCk7Ci0gICAgICBpZiAoRnJhZ21lbnRDb25zdGFudHMuVVJJX1NPQVAuZXF1YWxzKG5zKSAmJiBGcmFnbWVudENvbnN0YW50cy5RTkFNRV9MT0NBTF9OQU1FX0FSUkFZLmVxdWFscyhuYW1lKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlIGlmIChpc1Jvb3RUeXBlRGVmaW5pdGlvbihjdXJyVHlwZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgY3VyclR5cGUgPSBjdXJyVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcGxleCB0eXBlIGNvbnRlbnQgZ2l2ZW4gYSBjb21wbGV4IHR5cGUuCi0gICAqIElmIGNvbXBsZXhUeXBlIGlzIGEgdXNlciBkZWZpbmVkIHR5cGU6Ci0gICAqICAgVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHVzZXIgZGVmaW5lZCBjb21wbGV4IGNvbnRlbnQgb2YgdGhpcyB0eXBlIG9yIHRoZSBjb250ZW50IG9mIHRoZSBleHRlbmRlZAotICAgKiAgIG9yIGRlcml2ZWQgdHlwZSBpZmYgdGhlIGV4dGVuZGVkIG9yIGRlcml2ZWQgdHlwZSBpcyBub3QgYSBidWlsdC1pbiBYU0QgdHlwZSAoZm9yIGV4YW1wbGUsIHhzZDphbnlUeXBlKS4KLSAgICogSWYgY29tcGxleFR5cGUgaXMgYSBidWlsdC1pbiBYU0QgdHlwZToKLSAgICogICBJdCB3aWxsIHJldHVybiB0aGUgY29tcGxleCBjb250ZW50IG9mIHRoaXMgYnVpbHQtaW4gWFNEIGNvbXBsZXggdHlwZS4gIEl0IHdpbGwgbm90IHJldHVybiB0aGUKLSAgICogICBjb21wbGV4IGNvbnRlbnQgb2YgaXRzIGV4dGVuZGVkIG9yIGRlcml2ZWQgdHlwZS4KLSAgICogQHBhcmFtIGNvbXBsZXhUeXBlIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4IHR5cGUuCi0gICAqIEByZXR1cm4gWFNEQ29tcGxleFR5cGVDb250ZW50IFhTRENvbXBsZXhUeXBlQ29udGVudCB0aGUgcmVzb2x2ZWQgY29tcGxleCB0eXBlIGNvbnRlbnQuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIFhTRENvbXBsZXhUeXBlQ29udGVudCBnZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgaWYgKCFpc1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihjb21wbGV4VHlwZSkpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGNvbXBsZXhUeXBlOwotICAgICAgd2hpbGUgKCFpc1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbih0eXBlKSAmJiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4VHlwZUNvbnRlbnQgPSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChjb21wbGV4VHlwZUNvbnRlbnQgIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gY29tcGxleFR5cGVDb250ZW50OwotICAgICAgICBpZiAoaXNSb290VHlwZURlZmluaXRpb24odHlwZSkpCi0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlLmdldENvbnRlbnQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL0RldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MGNhMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICBwdWJsaWMgU3RyaW5nIGZvcm1MaW5rXzsKLQotICBwdWJsaWMgRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQsIFN0cmluZyBmb3JtTGluaykgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICBmb3JtTGlua18gPSBmb3JtTGluazsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgIHJldHVybiBmb3JtTGlua187Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL0ludm9rZVdTRExPcGVyYXRpb25Ub29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9JbnZva2VXU0RMT3BlcmF0aW9uVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NjMTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL0ludm9rZVdTRExPcGVyYXRpb25Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETE9wZXJhdGlvbkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJbnZva2VXU0RMT3BlcmF0aW9uVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICBwcml2YXRlIFN0cmluZyBmcmFnbWVudFZpZXdJRF87Ci0gIHByaXZhdGUgU3RyaW5nIGZyYWdtZW50TmFtZUFuY2hvcklEXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZW5kUG9pbnRfOwotCi0gIHB1YmxpYyBJbnZva2VXU0RMT3BlcmF0aW9uVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAid3NkbC9pbWFnZXMvaW52b2tlX3dzZGxfb3BlcmF0aW9uX2VuYWJsZWQuZ2lmIiwgIndzZGwvaW1hZ2VzL2ludm9rZV93c2RsX29wZXJhdGlvbl9oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIGZyYWdtZW50Vmlld0lEXyA9IEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNOwotICAgIGZyYWdtZW50TmFtZUFuY2hvcklEXyA9IG51bGw7Ci0gICAgZW5kUG9pbnRfID0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgIFN0cmluZ0J1ZmZlciBmb3JtTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3JtTGluay5hcHBlbmQoIndzZGwvZm9ybXMvSW52b2tlV1NETE9wZXJhdGlvbkZvcm0uanNwIik7Ci0gICAgU3RyaW5nIG5hbWVBbmNob3JJRCA9IGdldEZyYWdtZW50TmFtZUFuY2hvcklEKCk7Ci0gICAgaWYgKG5hbWVBbmNob3JJRCAhPSBudWxsICYmIG5hbWVBbmNob3JJRC5sZW5ndGgoKSA+IDApIHsKLSAgICAgIGZvcm1MaW5rLmFwcGVuZCgiIyIpOwotICAgICAgZm9ybUxpbmsuYXBwZW5kKG5hbWVBbmNob3JJRCk7Ci0gICAgICBzZXRGcmFnbWVudE5hbWVBbmNob3JJRChudWxsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1BY3Rpb25MaW5rKGludCBvcGVyYXRpb25UeXBlLFN0cmluZyBmcmFnbWVudFZpZXdJRCkKLSAgewotICAgIHN3aXRjaCAob3BlcmF0aW9uVHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExPcGVyYXRpb25FbGVtZW50Lk9QRVJBVElPTl9UWVBFX1NPQVA6Ci0gICAgICAgIGlmIChmcmFnbWVudFZpZXdJRC5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfRk9STV9UT19TT1VSQ0UpKQotICAgICAgICAgIHJldHVybiAid3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uSlNQLmpzcCI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gIndzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvbkZvcm1BY3Rpb25KU1AuanNwIjsKLSAgICAgIGNhc2UgV1NETE9wZXJhdGlvbkVsZW1lbnQuT1BFUkFUSU9OX1RZUEVfSFRUUF9HRVQ6Ci0gICAgICAgIHJldHVybiAid3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AiOwotICAgICAgY2FzZSBXU0RMT3BlcmF0aW9uRWxlbWVudC5PUEVSQVRJT05fVFlQRV9IVFRQX1BPU1Q6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gIndzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cFBvc3RPcGVyYXRpb25Gb3JtQWN0aW9uSlNQLmpzcCI7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGcmFnbWVudFZpZXdJRCgpIHsKLSAgICByZXR1cm4gZnJhZ21lbnRWaWV3SURfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RnJhZ21lbnRWaWV3SUQoU3RyaW5nIGZyYWdtZW50Vmlld0lEKSB7Ci0gICAgZnJhZ21lbnRWaWV3SURfID0gZnJhZ21lbnRWaWV3SUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZyYWdtZW50TmFtZUFuY2hvcklEKCkgewotICAgIHJldHVybiBmcmFnbWVudE5hbWVBbmNob3JJRF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudE5hbWVBbmNob3JJRChTdHJpbmcgZnJhZ21lbnROYW1lQW5jaG9ySUQpIHsKLSAgICBmcmFnbWVudE5hbWVBbmNob3JJRF8gPSBmcmFnbWVudE5hbWVBbmNob3JJRDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kUG9pbnQoKQotICB7Ci0gICAgcmV0dXJuIGVuZFBvaW50XzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVuZFBvaW50KFN0cmluZyBlbmRQb2ludCkKLSAgewotICAgIGVuZFBvaW50XyA9IGVuZFBvaW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9PcGVuV1NETFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL09wZW5XU0RMVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzUyMTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL09wZW5XU0RMVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLlNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIE9wZW5XU0RMVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICAgIHB1YmxpYyBPcGVuV1NETFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJ3c2RsL2ltYWdlcy9vcGVuX3dzZGxfZW5hYmxlZC5naWYiLCAid3NkbC9pbWFnZXMvb3Blbl93c2RsX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzZGwvZm9ybXMvT3BlbldTRExGb3JtLmpzcCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9TT0FQTWVzc2FnZVF1ZXVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9TT0FQTWVzc2FnZVF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NTRlYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvU09BUE1lc3NhZ2VRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotCi1wdWJsaWMgY2xhc3MgU09BUE1lc3NhZ2VRdWV1ZSBleHRlbmRzIE1lc3NhZ2VRdWV1ZQotewotICBwcml2YXRlIFZlY3RvciBjYWNoZWRNZXNzYWdlTGlzdF87Ci0KLSAgcHVibGljIFNPQVBNZXNzYWdlUXVldWUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBjYWNoZWRNZXNzYWdlTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLSAgICBjYWNoZWRNZXNzYWdlTGlzdF8ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBtZXNzYWdlTGlzdF8ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZXNGcm9tTGlzdCgpCi0gIHsKLSAgICBpZiAobWVzc2FnZUxpc3RfLnNpemUoKSA9PSAwKQotICAgICAgY29weU1lc3NhZ2VzKGNhY2hlZE1lc3NhZ2VMaXN0XyxtZXNzYWdlTGlzdF8pOwotICAgIGVsc2UKLSAgICAgIGNvcHlNZXNzYWdlcyhtZXNzYWdlTGlzdF8sY2FjaGVkTWVzc2FnZUxpc3RfKTsKLSAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZXNGcm9tTGlzdCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNvcHlNZXNzYWdlcyhWZWN0b3Igc291cmNlTGlzdCxWZWN0b3IgZGVzdExpc3QpCi0gIHsKLSAgICBmb3IgKGludCBpPTA7aTxzb3VyY2VMaXN0LnNpemUoKTtpKyspCi0gICAgICBkZXN0TGlzdC5hZGRFbGVtZW50KHNvdXJjZUxpc3QuZWxlbWVudEF0KGkpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEFkZFRvRmF2b3JpdGVzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEFkZFRvRmF2b3JpdGVzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzFkNjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExBZGRUb0Zhdm9yaXRlc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLlNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLldTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbjsKLQotcHVibGljIGNsYXNzIFdTRExBZGRUb0Zhdm9yaXRlc1Rvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgcHVibGljIFdTRExBZGRUb0Zhdm9yaXRlc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9mYXZvcml0ZXNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2Zhdm9yaXRlc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFdTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExCaW5kaW5nRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExCaW5kaW5nRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MGQ4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMQmluZGluZ0RldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQmluZGluZ0RldGFpbHNUb29sIGV4dGVuZHMgRGV0YWlsc1Rvb2wgewotCi0gIHB1YmxpYyBXU0RMQmluZGluZ0RldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsIGFsdCwgIndzZGwvZm9ybXMvV1NETEJpbmRpbmdEZXRhaWxzRm9ybS5qc3AiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEJpbmRpbmdOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMQmluZGluZ05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjMDRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMQmluZGluZ05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMTW9kZWxDb25zdGFudHM7Ci0KLS8vIFdTREwgYmluZGluZyBub2RlIGZvciB0aGUgV1NETCBOYXZpZ2F0b3IgVHJlZSBWaWV3Ci1wdWJsaWMgY2xhc3MgV1NETEJpbmRpbmdOb2RlIGV4dGVuZHMgV1NETE5hdmlnYXRvck5vZGUKLXsKLSAgcHVibGljIFdTRExCaW5kaW5nTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCwid3NkbC9pbWFnZXMvd3NkbF9iaW5kaW5nX25vZGUuZ2lmIik7Ci0gICAgZWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgIGlmIChyZWwuZXF1YWxzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9PUEVSQVRJT04pKSB7Ci0gICAgICAgICAgV1NETE9wZXJhdGlvbk5vZGUgd3NkbE9wZXJhdGlvbk5vZGUgPSBuZXcgV1NETE9wZXJhdGlvbk5vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgYWRkQ2hpbGQod3NkbE9wZXJhdGlvbk5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfT1BFUkFUSU9OKSkgewotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX09QRVJBVElPTikpIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0T3V0Qm91bmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgbmV3IFdTRExCaW5kaW5nRGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfLCB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1dTRExfQklORElOR19ERVRBSUxTIikpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETERldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWVhZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETERldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRGV0YWlsc1Rvb2wgZXh0ZW5kcyBEZXRhaWxzVG9vbCB7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STV9WSUVXX0lEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX1ZJRVdfSUQgPSAxOwotCi0gIHByaXZhdGUgaW50IHZpZXdJZF87Ci0KLSAgcHVibGljIFdTRExEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQsICJ3c2RsL2Zvcm1zL1dTRExEZXRhaWxzRm9ybS5qc3AiKTsKLSAgICB2aWV3SWRfID0gRk9STV9WSUVXX0lEOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRWaWV3SWQoKSB7Ci0gICAgcmV0dXJuIHZpZXdJZF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWaWV3SWQoaW50IHZpZXdJZCkgewotICAgIGlmICh2aWV3SWQgPT0gRk9STV9WSUVXX0lEIHx8IHZpZXdJZCA9PSBTT1VSQ0VfVklFV19JRCkKLSAgICAgIHZpZXdJZF8gPSB2aWV3SWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0b2dnbGVWaWV3SWQoKSB7Ci0gICAgaWYgKHZpZXdJZF8gPT0gRk9STV9WSUVXX0lEKQotICAgICAgdmlld0lkXyA9IFNPVVJDRV9WSUVXX0lEOwotICAgIGVsc2UKLSAgICAgIHZpZXdJZF8gPSBGT1JNX1ZJRVdfSUQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTkxYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuSW1wb3J0VG9GaWxlU3lzdGVtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbjsKLQotcHVibGljIGNsYXNzIFdTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbCBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbVRvb2wgewotICBwdWJsaWMgV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBXU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2NjOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5JbXBvcnRUb1dvcmtiZW5jaFRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wgZXh0ZW5kcyBJbXBvcnRUb1dvcmtiZW5jaFRvb2wgewotICBwdWJsaWMgV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpIHsKLSAgICByZXR1cm4gIndzZGwvZm9ybXMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmOTc4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wgZXh0ZW5kcyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbCB7Ci0gIHB1YmxpYyBXU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpIHsKLSAgICByZXR1cm4gIndzZGwvZm9ybXMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExNYWluTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE1haW5Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTQ5MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE1haW5Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETE1vZGVsQ29uc3RhbnRzOwotCi0vLyBSb290IG5vZGUgZm9yIHRoZSBXU0RMIE5hdmlnYXRvciBUcmVlIFZpZXcKLXB1YmxpYyBjbGFzcyBXU0RMTWFpbk5vZGUgZXh0ZW5kcyBXU0RMTmF2aWdhdG9yTm9kZQotewotICBwdWJsaWMgV1NETE1haW5Ob2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLDEsImltYWdlcy9yb290X21haW4uZ2lmIik7Ci0gICAgZWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgIGlmIChyZWwuZXF1YWxzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETCkpIHsKLSAgICAgICAgICBXU0RMTm9kZSB3c2RsTm9kZSA9IG5ldyBXU0RMTm9kZSgoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpLCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgICBhZGRDaGlsZCh3c2RsTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETCkpIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETCkpIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0T3V0Qm91bmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBuZXcgT3BlbldTRExUb29sKHRvb2xNYW5hZ2VyXywgd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9PUEVOX1dTREwiKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE5hdmlnYXRvck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExOYXZpZ2F0b3JOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZWY1OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE5hdmlnYXRvck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5Ub2dnbGVXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExOYXZpZ2F0b3JOb2RlIGV4dGVuZHMgTm9kZQotewotICBwdWJsaWMgV1NETE5hdmlnYXRvck5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoLFN0cmluZyBpbWFnZVBhdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCxpbWFnZVBhdGgpOwotICB9Ci0KLSAgLy8gd3NkbC9hY3Rpb25zL1RvZ2dsZVdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKQotICB7Ci0gICAgcmV0dXJuIFRvZ2dsZVdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxpc09wZW5fKTsKLSAgfQotCi0gIC8vIHdzZGwvYWN0aW9ucy9TZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLgotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCkKLSAgewotICAgIHJldHVybiBTZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8sZmFsc2UpOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNDRhODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMTW9kZWxDb25zdGFudHM7Ci0KLS8vIFdTREwgbm9kZSBmb3IgdGhlIFdTREwgTmF2aWdhdG9yIFRyZWUgVmlldwotcHVibGljIGNsYXNzIFdTRExOb2RlIGV4dGVuZHMgV1NETE5hdmlnYXRvck5vZGUKLXsKLSAgcHVibGljIFdTRExOb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsaW50IG5vZGVEZXB0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoLCJpbWFnZXMvd3NkbC5naWYiKTsKLSAgICBlbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgaWYgKHJlbC5lcXVhbHMoV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0UpKSB7Ci0gICAgICAgICAgV1NETFNlcnZpY2VOb2RlIHdzZGxTZXJ2aWNlTm9kZSA9IG5ldyBXU0RMU2VydmljZU5vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgYWRkQ2hpbGQod3NkbFNlcnZpY2VOb2RlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBUcmVlRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0UpKSB7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRSkpIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0T3V0Qm91bmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgbmV3IFdTRExEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NETF9ERVRBSUxTIikpOwotICAgIG5ldyBXU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbCh0b29sTWFuYWdlcl8sIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0lNUE9SVF9XU0RMX1RPX1dPUktCRU5DSCIpKTsKLSAgICBuZXcgV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sKHRvb2xNYW5hZ2VyXywgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfV1NETF9JTVBPUlRfVE9fRlMiKSk7Ci0gICAgbmV3IFdTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbCh0b29sTWFuYWdlcl8sIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQiKSk7Ci0gICAgbmV3IFdTRExBZGRUb0Zhdm9yaXRlc1Rvb2wodG9vbE1hbmFnZXJfLCB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9XU0RMX1RPX0ZBVk9SSVRFUyIpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE9wZXJhdGlvbk5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExPcGVyYXRpb25Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwM2EwMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE9wZXJhdGlvbk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi0vLyBXU0RMIG9wZXJhdGlvbiBub2RlIGZvciB0aGUgV1NETCBOYXZpZ2F0b3IgVHJlZSBWaWV3Ci1wdWJsaWMgY2xhc3MgV1NETE9wZXJhdGlvbk5vZGUgZXh0ZW5kcyBXU0RMTmF2aWdhdG9yTm9kZQotewotICBwdWJsaWMgV1NETE9wZXJhdGlvbk5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsIndzZGwvaW1hZ2VzL3dzZGxfb3BlcmF0aW9uX25vZGUuZ2lmIik7Ci0gICAgZWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgbmV3IEludm9rZVdTRExPcGVyYXRpb25Ub29sKHRvb2xNYW5hZ2VyXywgd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9JTlZPS0VfV1NETF9PUEVSQVRJT04iKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFBlcnNwZWN0aXZlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2OWIyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuT3BlbldTRExBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0RMQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuVXBkYXRlV1NETEJpbmRpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkJpbmRpbmdUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETEFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETEJpbmRpbmdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExQZXJzcGVjdGl2ZSBleHRlbmRzIFBlcnNwZWN0aXZlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT05URU5UX0RFRkFVTFQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09OVEVOVF9SRVNVTFRfRk9STSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT05URU5UX1JFU1VMVF9TT1VSQ0UgPSAyOwotCi0gIHByaXZhdGUgQmFzaWNNb2RlbCBtb2RlbF87Ci0gIHByaXZhdGUgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBwcml2YXRlIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICBwcml2YXRlIFN0cmluZyBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gIHByaXZhdGUgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICBwcml2YXRlIFN0cmluZyBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICBwcml2YXRlIGludCBzdGF0dXNDb250ZW50VHlwZV87Ci0KLSAgcHJpdmF0ZSBTT0FQTWVzc2FnZVF1ZXVlIHNvYXBSZXF1ZXN0UXVldWVfOwotICBwcml2YXRlIFNPQVBNZXNzYWdlUXVldWUgc29hcFJlc3BvbnNlUXVldWVfOwotICBwcml2YXRlIE5vZGUgb3BlcmF0aW9uTm9kZV87Ci0KLSAgc3RhdGljCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBYU0Qgc3Vic3lzdGVtLgotICAgIChuZXcgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsKCkpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIixuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgIC8vIEluaXQuaW5pdCgpOwotICAgIEVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotICAgIFhTRFBhY2thZ2VJbXBsLmluaXQoKTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMUGVyc3BlY3RpdmUoQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoIndzZGwiLGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgaW5pdFBlcnNwZWN0aXZlKFNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uKQotICB7Ci0gICAgbW9kZWxfID0gbmV3IEJhc2ljTW9kZWwoIndzZGxNb2RlbCIpOwotICAgIFRyZWVFbGVtZW50IHRyZWVFbGVtZW50ID0gbmV3IFRyZWVFbGVtZW50KGdldE1lc3NhZ2UoIk5PREVfTkFNRV9XU0RMX01BSU4iKSwgbW9kZWxfKTsKLSAgICBtb2RlbF8uc2V0Um9vdEVsZW1lbnQodHJlZUVsZW1lbnQpOwotICAgIG5vZGVNYW5hZ2VyXyA9IG5ldyBOb2RlTWFuYWdlcihjb250cm9sbGVyXyk7Ci0gICAgV1NETE1haW5Ob2RlIHdzZGxNYWluTm9kZSA9IG5ldyBXU0RMTWFpbk5vZGUodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyXyk7Ci0gICAgbm9kZU1hbmFnZXJfLnNldFJvb3ROb2RlKHdzZGxNYWluTm9kZSk7Ci0KLSAgICAvLyBTdGFydGluZyBmcmFtZXNldCBzaXplcy4KLSAgICBpZiAoIURpclV0aWxzLmlzUlRMKCkpCi0gICAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gIjMwJSwqIjsKLSAgICBlbHNlCi0gICAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gIiosMzAlIjsKLSAgICBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICAgIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gIjc1JSwqIjsKLSAgICBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0KLSAgICAvLyBNZXNzYWdlIHN0YXR1cyBwYW5lCi0gICAgc3RhdHVzQ29udGVudFR5cGVfID0gU1RBVFVTX0NPTlRFTlRfREVGQVVMVDsKLSAgICBzb2FwUmVxdWVzdFF1ZXVlXyA9IG5ldyBTT0FQTWVzc2FnZVF1ZXVlKCk7Ci0gICAgc29hcFJlc3BvbnNlUXVldWVfID0gbmV3IFNPQVBNZXNzYWdlUXVldWUoKTsKLSAgICBvcGVyYXRpb25Ob2RlXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBwcmVsb2FkV1NETChTdHJpbmdbXSB3c2RsVVJMcykgewotICAgIGlmICh3c2RsVVJMcyAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxVUkxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE9wZW5XU0RMQWN0aW9uIG9wZW5XU0RMQWN0aW9uID0gbmV3IE9wZW5XU0RMQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuV1NETEFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgICAgIFN0cmluZyBkZWNvZGVkV1NETFVSTCA9IFVSTFV0aWxzLmRlY29kZSh3c2RsVVJMc1tpXSk7Ci0gICAgICAgIHByb3BlcnR5VGFibGUucHV0KEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCwgZGVjb2RlZFdTRExVUkwpOwotICAgICAgICBvcGVuV1NETEFjdGlvbi5ydW4oKTsKLSAgICAgIH0KLSAgICAgIGlmICh3c2RsVVJMcy5sZW5ndGggPiAwKQotICAgICAgICBjb250cm9sbGVyXy5zZXRDdXJyZW50UGVyc3BlY3RpdmUoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgcHJlbG9hZEVuZHBvaW50cyhTdHJpbmdbXSB3c2RsVVJMcywgU3RyaW5nW10gZW5kcG9pbnRzKQotICB7Ci0gICAgaWYgKHdzZGxVUkxzICE9IG51bGwgJiYgd3NkbFVSTHMubGVuZ3RoID4gMCAmJiBlbmRwb2ludHMgIT0gbnVsbCAmJiBlbmRwb2ludHMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmcgd3NkbFVSTCA9IHdzZGxVUkxzWzBdOwotICAgICAgVmVjdG9yIHdzZGxOb2RlcyA9IG5vZGVNYW5hZ2VyXy5nZXRSb290Tm9kZSgpLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3Igd3NkbE5vZGVzSXRlcmF0b3IgPSB3c2RsTm9kZXMuaXRlcmF0b3IoKTsgd3NkbE5vZGVzSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTm9kZSB3c2RsTm9kZSA9IChOb2RlKXdzZGxOb2Rlc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKHdzZGxOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKHdzZGxVUkwpKQotICAgICAgICB7Ci0gICAgICAgICAgVmVjdG9yIHNlcnZpY2VOb2RlcyA9IHdzZGxOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VOb2Rlc0l0ZXJhdG9yID0gc2VydmljZU5vZGVzLml0ZXJhdG9yKCk7IHNlcnZpY2VOb2Rlc0l0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgTm9kZSBzZXJ2aWNlTm9kZSA9IChOb2RlKXNlcnZpY2VOb2Rlc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFZlY3RvciBiaW5kaW5nTm9kZXMgPSBzZXJ2aWNlTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBub2RlSWRzID0gbmV3IFN0cmluZ1tiaW5kaW5nTm9kZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUlkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgbm9kZUlkc1tpXSA9IFN0cmluZy52YWx1ZU9mKCgoTm9kZSliaW5kaW5nTm9kZXMuZ2V0KGkpKS5nZXROb2RlSWQoKSk7Ci0gICAgICAgICAgICBVcGRhdGVXU0RMQmluZGluZ0FjdGlvbiBhY3Rpb24gPSBuZXcgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBub2RlSWRzKTsKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KFdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5ULCBlbmRwb2ludHMpOwotICAgICAgICAgICAgYWN0aW9uLnNldFByb3BlcnR5VGFibGUocHJvcGVydHlUYWJsZSk7Ci0gICAgICAgICAgICBhY3Rpb24uZXhlY3V0ZShmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgcHJlc2VsZWN0U2VydmljZU9yQmluZGluZyhTdHJpbmdbXSB3c2RsVVJMcyxTdHJpbmdbXSBzZXJ2aWNlUU5hbWVTdHJpbmdzLFN0cmluZ1tdIGJpbmRpbmdOYW1lU3RyaW5ncykKLSAgewotICAgIGlmICh3c2RsVVJMcyAhPSBudWxsICYmIHdzZGxVUkxzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgU3RyaW5nIHdzZGxVUkwgPSB3c2RsVVJMc1swXTsKLSAgICAgIGlmIChzZXJ2aWNlUU5hbWVTdHJpbmdzICE9IG51bGwgJiYgc2VydmljZVFOYW1lU3RyaW5ncy5sZW5ndGggPiAwKQotICAgICAgICBwcmVzZWxlY3RTZXJ2aWNlKHdzZGxVUkwsc2VydmljZVFOYW1lU3RyaW5nc1swXSk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChiaW5kaW5nTmFtZVN0cmluZ3MgIT0gbnVsbCAmJiBiaW5kaW5nTmFtZVN0cmluZ3MubGVuZ3RoID4gMCkKLSAgICAgICAgICBwcmVzZWxlY3RCaW5kaW5nKHdzZGxVUkwsYmluZGluZ05hbWVTdHJpbmdzWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgdm9pZCBwcmVzZWxlY3RTZXJ2aWNlKFN0cmluZyB3c2RsVVJMLFN0cmluZyBzZXJ2aWNlUU5hbWVTdHJpbmcpCi0gIHsKLSAgICBWZWN0b3Igd3NkbE5vZGVzID0gbm9kZU1hbmFnZXJfLmdldFJvb3ROb2RlKCkuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGk9MDtpPHdzZGxOb2Rlcy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIE5vZGUgd3NkbE5vZGUgPSAoTm9kZSl3c2RsTm9kZXMuZWxlbWVudEF0KGkpOwotICAgICAgaWYgKHdzZGxOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKHdzZGxVUkwpKQotICAgICAgewotICAgICAgICBWZWN0b3Igc2VydmljZU5vZGVzID0gd3NkbE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBqPTA7ajxzZXJ2aWNlTm9kZXMuc2l6ZSgpO2orKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KGopOwotICAgICAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpc2VydmljZU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgaWYgKHNlcnZpY2UuZ2V0UU5hbWUoKS50b1N0cmluZygpLmVxdWFscyhzZXJ2aWNlUU5hbWVTdHJpbmcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGVNYW5hZ2VyXy5zZXRTZWxlY3RlZE5vZGVJZChzZXJ2aWNlTm9kZS5nZXROb2RlSWQoKSk7Ci0gICAgICAgICAgICBub2RlTWFuYWdlcl8ubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXJfLnNldEN1cnJlbnRQZXJzcGVjdGl2ZShBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHZvaWQgcHJlc2VsZWN0QmluZGluZyhTdHJpbmcgd3NkbFVSTCxTdHJpbmcgYmluZGluZ05hbWVTdHJpbmcpCi0gIHsKLSAgICBWZWN0b3Igd3NkbE5vZGVzID0gbm9kZU1hbmFnZXJfLmdldFJvb3ROb2RlKCkuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGk9MDtpPHdzZGxOb2Rlcy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIE5vZGUgd3NkbE5vZGUgPSAoTm9kZSl3c2RsTm9kZXMuZWxlbWVudEF0KGkpOwotICAgICAgaWYgKHdzZGxOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKHdzZGxVUkwpKQotICAgICAgewotICAgICAgICBWZWN0b3Igc2VydmljZU5vZGVzID0gd3NkbE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBqPTA7ajxzZXJ2aWNlTm9kZXMuc2l6ZSgpO2orKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KGopOwotICAgICAgICAgIFZlY3RvciBiaW5kaW5nTm9kZXMgPSBzZXJ2aWNlTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaz0wO2s8YmluZGluZ05vZGVzLnNpemUoKTtrKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgTm9kZSBiaW5kaW5nTm9kZSA9IChOb2RlKWJpbmRpbmdOb2Rlcy5lbGVtZW50QXQoayk7Ci0gICAgICAgICAgICBXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSAoV1NETEJpbmRpbmdFbGVtZW50KWJpbmRpbmdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZ0VsZW1lbnQuZ2V0QmluZGluZygpLmdldFFOYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoYmluZGluZ05hbWVTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBub2RlTWFuYWdlcl8uc2V0U2VsZWN0ZWROb2RlSWQoYmluZGluZ05vZGUuZ2V0Tm9kZUlkKCkpOwotICAgICAgICAgICAgICBub2RlTWFuYWdlcl8ubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLSAgICAgICAgICAgICAgY29udHJvbGxlcl8uc2V0Q3VycmVudFBlcnNwZWN0aXZlKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0RMKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgICAKLSAgICAgIH0KLSAgICB9ICAgIAotICB9Ci0KLSAgcHVibGljIE5vZGVNYW5hZ2VyIGdldE5vZGVNYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBub2RlTWFuYWdlcl87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBlcnNwZWN0aXZlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ3c2RsL3dzZGxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgewotICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFuZXNGaWxlKCkKLSAgewotICAgIHJldHVybiAid3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGcmFtZXNldHNGaWxlKCkKLSAgewotICAgIHJldHVybiAid3NkbC9zY3JpcHRzL3dzZGxmcmFtZXNldHMuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc0ZyYW1lc2V0c0Zvcm0oKQotICB7Ci0gICAgcmV0dXJuICJ3c2RsL2Zvcm1zL1Byb2Nlc3NXU0RMRnJhbWVzZXRzRm9ybS5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gIndzZGxOYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuICJ3c2RsUHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJ3c2RsU3RhdHVzQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhTdHJpbmcgY29scykKLSAgewotICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoU3RyaW5nIGNvbHMpCi0gIHsKLSAgICBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpCi0gIHsKLSAgICByZXR1cm4gc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkKLSAgewotICAgIHJldHVybiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoU3RyaW5nIHJvd3MpCi0gIHsKLSAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IHJvd3M7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoU3RyaW5nIHJvd3MpCi0gIHsKLSAgICBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gcm93czsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkKLSAgewotICAgIHJldHVybiBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTd2l0Y2hQZXJzcGVjdGl2ZUZvcm1BY3Rpb25MaW5rKGludCB0YXJnZXRQZXJzcGVjdGl2ZUlkLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIHJldHVybiBTd2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0RMQWN0aW9uLmdldEZvcm1BY3Rpb25MaW5rKHRhcmdldFBlcnNwZWN0aXZlSWQsZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFN0YXR1c0NvbnRlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBzdGF0dXNDb250ZW50VHlwZV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTdGF0dXNDb250ZW50VHlwZShpbnQgc3RhdHVzQ29udGVudFR5cGUpCi0gIHsKLSAgICBzdGF0dXNDb250ZW50VHlwZV8gPSBzdGF0dXNDb250ZW50VHlwZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTT0FQTWVzc2FnZVF1ZXVlIGdldFNPQVBSZXF1ZXN0UXVldWUoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBSZXF1ZXN0UXVldWVfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFNPQVBNZXNzYWdlUXVldWUgZ2V0U09BUFJlc3BvbnNlUXVldWUoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBSZXNwb25zZVF1ZXVlXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldE9wZXJhdGlvbk5vZGUoKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbk5vZGVfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0T3BlcmF0aW9uTm9kZShOb2RlIG9wZXJhdGlvbk5vZGUpCi0gIHsKLSAgICBvcGVyYXRpb25Ob2RlXyA9IG9wZXJhdGlvbk5vZGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNPQVBFbnZlbG9wZVhNTExpbmsoaW50IHNvYXBFbnZlbG9wZVR5cGUpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgbGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGwvc29hcF9lbnZlbG9wZV94bWwuanNwPyIpOwotICAgIGxpbmsuYXBwZW5kKFdTRExBY3Rpb25JbnB1dHMuU09BUF9FTlZFTE9QRV9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQoc29hcEVudmVsb3BlVHlwZSk7Ci0gICAgcmV0dXJuIGxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QmluZGluZ1R5cGVTdHJpbmcoaW50IGJpbmRpbmdUeXBlKQotICB7Ci0gICAgc3dpdGNoIChiaW5kaW5nVHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIEJpbmRpbmdUeXBlcy5TT0FQOgotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfU09BUCIpOwotICAgICAgY2FzZSBCaW5kaW5nVHlwZXMuSFRUUF9HRVQ6Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX0dFVCIpOwotICAgICAgY2FzZSBCaW5kaW5nVHlwZXMuSFRUUF9QT1NUOgotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9QT1NUIik7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfVU5TVVBQT1JURUQiKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMU2VydmljZURldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMU2VydmljZURldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1N2ZlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFNlcnZpY2VEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VEZXRhaWxzVG9vbCBleHRlbmRzIERldGFpbHNUb29sIHsKLQotICBwdWJsaWMgV1NETFNlcnZpY2VEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQsICJ3c2RsL2Zvcm1zL1dTRExTZXJ2aWNlRGV0YWlsc0Zvcm0uanNwIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExTZXJ2aWNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFNlcnZpY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTI2ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFNlcnZpY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWxSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETE1vZGVsQ29uc3RhbnRzOwotCi0vLyBXU0RMIHNlcnZpY2Ugbm9kZSBmb3IgdGhlIFdTREwgTmF2aWdhdG9yIFRyZWUgVmlldwotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlTm9kZSBleHRlbmRzIFdTRExOYXZpZ2F0b3JOb2RlCi17Ci0gIHB1YmxpYyBXU0RMU2VydmljZU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsIndzZGwvaW1hZ2VzL3dzZGxfc2VydmljZV9ub2RlLmdpZiIpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfQklORElORykpIHsKLSAgICAgICAgICBXU0RMQmluZGluZ05vZGUgd3NkbEJpbmRpbmdOb2RlID0gbmV3IFdTRExCaW5kaW5nTm9kZSgoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpLCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgICBhZGRDaGlsZCh3c2RsQmluZGluZ05vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfQklORElORykpIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9CSU5ESU5HKSkgewotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBzZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbihmYWxzZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBuZXcgV1NETFNlcnZpY2VEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NETF9TRVJWSUNFX0RFVEFJTFMiKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNmb3JtZXIvRnJhZ21lbnRUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNmb3JtZXIvRnJhZ21lbnRUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWI0YmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zZm9ybWVyL0ZyYWdtZW50VHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETE9wZXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIEZyYWdtZW50VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBJVHJhbnNmb3JtZXIKLXsKLSAgcHJvdGVjdGVkIENvbnRyb2xsZXIgY29udHJvbGxlcjsKLQotICBwdWJsaWMgRnJhZ21lbnRUcmFuc2Zvcm1lcihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBub3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2IuYXBwZW5kKCI8cm9vdD4iKTsKLSAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudCljb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXQubmV4dCgpOwotICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSAoSVhTREZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IEVsZW1lbnRbMF07Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZWxlbWVudHMgPSBmcmFnLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyghb3BlckVsZW1lbnQuaXNVc2VMaXRlcmFsKCksIG5ldyBIYXNodGFibGUoKSwgWE1MVXRpbHMuY3JlYXRlTmV3RG9jdW1lbnQobnVsbCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKQotICAgICAgewotICAgICAgfQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgc2IuYXBwZW5kKFhNTFV0aWxzLnNlcmlhbGl6ZShlbGVtZW50c1tpXSwgdHJ1ZSkpOwotICAgIH0KLSAgICBzYi5hcHBlbmQoIjwvcm9vdD4iKTsKLSAgICBwcm9wZXJ0aWVzLnB1dChGcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVCwgc2IudG9TdHJpbmcoKSk7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgU3RyaW5nIHNvdXJjZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEZyYWdtZW50Q29uc3RhbnRzLlNPVVJDRV9DT05URU5UKTsKLSAgICBpZiAoc291cmNlICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgcm9vdCA9IFhNTFV0aWxzLnN0cmluZ1RvRWxlbWVudChzb3VyY2UpOwotICAgICAgICBpZiAocm9vdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgIFZlY3RvciBjaGlsZHJlblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICAgICAgY2hpbGRyZW5WZWN0b3IuYWRkKGNoaWxkKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgRWxlbWVudFtdIGNoaWxkcmVuID0gKEVsZW1lbnRbXSljaGlsZHJlblZlY3Rvci50b0FycmF5KG5ldyBFbGVtZW50WzBdKTsKLSAgICAgICAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudCkgY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICAgSXRlcmF0b3IgaXQgPSBvcGVyRWxlbWVudC5nZXRPcmRlcmVkQm9keVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWl0Lm5leHQoKTsKLSAgICAgICAgICAgIElYU0RGcmFnbWVudCBmcmFnID0gKElYU0RGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudChwYXJ0KTsKLSAgICAgICAgICAgIGZyYWcuc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKGNoaWxkcmVuKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvQ2h1bmtlZElucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvQ2h1bmtlZElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjRjZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNwb3J0L0NodW5rZWRJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENodW5rZWRJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtCi17Ci0gIHByb3RlY3RlZCBsb25nIGNodW5rU2l6ZSA9IDBsOwotICBwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1heENoYXJMb25nID0gKExvbmcudG9IZXhTdHJpbmcoTG9uZy5NQVhfVkFMVUUpKS50b1N0cmluZygpLmxlbmd0aCgpOwotCi0gIHByaXZhdGUgQ2h1bmtlZElucHV0U3RyZWFtKCkKLSAgewotICAgIHN1cGVyKG51bGwpOwotICB9Ci0KLSAgcHVibGljIENodW5rZWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykKLSAgewotICAgIHN1cGVyKGlzKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgYnl0ZVtdIGQgPSBuZXcgYnl0ZVsxXTsKLSAgICBpbnQgcmMgPSByZWFkKGQsIDAsIDEpOwotICAgIHJldHVybiByYyA+IDAgPyAoZFswXSAmIDB4RkYpIDogcmM7Ci0gIH0KLQotICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWQoYiwgMCwgYi5sZW5ndGgpOwotICB9Ci0KLSAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoY2xvc2VkKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW50IHRvdGFscmVhZCA9IDA7Ci0gICAgaW50IGJ5dGVzcmVhZCA9IDA7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgaWYgKGNodW5rU2l6ZSA8IDFMKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKDBsID09IGdldENodW5rZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG90YWxyZWFkID09IDApCi0gICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcmV0dXJuIHRvdGFscmVhZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZXNyZWFkID0gaW4ucmVhZChiLCBvZmYgKyB0b3RhbHJlYWQsIE1hdGgubWluKGxlbiAtIHRvdGFscmVhZCwgKGludCkgTWF0aC5taW4oY2h1bmtTaXplLCBJbnRlZ2VyLk1BWF9WQUxVRSkpKTsKLSAgICAgICAgaWYgKGJ5dGVzcmVhZCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICB0b3RhbHJlYWQgKz0gYnl0ZXNyZWFkOwotICAgICAgICAgIGNodW5rU2l6ZSAtPSBieXRlc3JlYWQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdoaWxlIChsZW4gLSB0b3RhbHJlYWQgPiAwICYmIGJ5dGVzcmVhZCA+IC0xKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgY2xvc2VkID0gdHJ1ZTsKLSAgICAgIHRocm93IGU7Ci0gICAgfQotICAgIHJldHVybiB0b3RhbHJlYWQ7Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBza2lwKGZpbmFsIGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoY2xvc2VkKQotICAgICAgcmV0dXJuIDA7Ci0gICAgbG9uZyBza2lwcGVkID0gMGw7Ci0gICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICBpbnQgYnJlYWQgPSAtMTsKLSAgICBkbwotICAgIHsKLSAgICAgIGJyZWFkID0gcmVhZChiLCAwLCBiLmxlbmd0aCk7Ci0gICAgICBpZiAoYnJlYWQgPiAwKQotICAgICAgICBza2lwcGVkICs9IGJyZWFkOwotICAgIH0KLSAgICB3aGlsZSAoYnJlYWQgIT0gLTEgJiYgc2tpcHBlZCA8IG4pOwotICAgIHJldHVybiBza2lwcGVkOwotICB9Ci0KLSAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChjbG9zZWQpCi0gICAgICByZXR1cm4gMDsKLSAgICBpbnQgcmMgPSAoaW50KSBNYXRoLm1pbihjaHVua1NpemUsIEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICByZXR1cm4gTWF0aC5taW4ocmMsIGluLmF2YWlsYWJsZSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBsb25nIGdldENodW5rZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigxMDI0KTsKLSAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbWF4Q2hhckxvbmcgKyAyXTsKLSAgICBpbnQgYnVmc3ogPSAwOwotICAgIGNodW5rU2l6ZSA9IC0xTDsKLSAgICBpbnQgYyA9IC0xOwotICAgIGRvCi0gICAgewotICAgICAgYyA9IGluLnJlYWQoKTsKLSAgICAgIGlmIChjID4gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmIChjICE9ICdccicgJiYgYyAhPSAnXG4nICYmIGMgIT0gJyAnICYmIGMgIT0gJ1x0JykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZltidWZzeisrXSA9ICgoYnl0ZSkgYyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKGMgPiAtMSAmJiAoYyAhPSAnXG4nIHx8IGJ1ZnN6ID09IDApICYmIGJ1ZnN6IDwgYnVmLmxlbmd0aCk7Ci0gICAgaWYgKGMgPCAwKQotICAgIHsKLSAgICAgIGNsb3NlZCA9IHRydWU7Ci0gICAgfQotICAgIFN0cmluZyBzYnVmID0gbmV3IFN0cmluZyhidWYsIDAsIGJ1ZnN6KTsKLSAgICBpZiAoYnVmc3ogPiBtYXhDaGFyTG9uZykKLSAgICB7Ci0gICAgICBjbG9zZWQgPSB0cnVlOwotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDaHVua2VkIGlucHV0IHN0cmVhbSBmYWlsZWQgdG8gcmVjZWl2ZSB2YWxpZCBjaHVuayBzaXplOiIgKyBzYnVmKTsKLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY2h1bmtTaXplID0gTG9uZy5wYXJzZUxvbmcoc2J1ZiwgMTYpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5lKQotICAgIHsKLSAgICAgIGNsb3NlZCA9IHRydWU7Ci0gICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIiciICsgc2J1ZiArICInICIgKyBuZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBpZiAoY2h1bmtTaXplIDwgMUwpCi0gICAgICBjbG9zZWQgPSB0cnVlOwotICAgIGlmIChjaHVua1NpemUgIT0gMEwgJiYgYyA8IDApCi0gICAgewotICAgICAgLy9JZiBjaHVuayBzaXplIGlzIHplcm8gdHJ5IGFuZCBiZSB0b2xlcmFudCB0aGF0IHRoZXJlIG1heWJlIG5vIGNyIG9yIGxmCi0gICAgICAvLyBhdCB0aGUgZW5kLgotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJIVFRQIENodW5rZWQgc3RyZWFtIGNsb3NlZCBpbiBtaWRkbGUgb2YgY2h1bmsuIik7Ci0gICAgfQotICAgIGlmIChjaHVua1NpemUgPCAwTCkKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSFRUUCBDaHVuayBzaXplIHJlY2VpdmVkICIgKyBjaHVua1NpemUgKyAiIGlzIGxlc3MgdGhhbiB6ZXJvLiIpOwotICAgIHJldHVybiBjaHVua1NpemU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgc3luY2hyb25pemVkICh0aGlzKQotICAgIHsKLSAgICAgIGlmIChjbG9zZWQpCi0gICAgICAgIHJldHVybjsKLSAgICAgIGNsb3NlZCA9IHRydWU7Ci0gICAgfQotICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgaW50IGJyZWFkID0gLTE7Ci0gICAgZG8KLSAgICB7Ci0gICAgICBicmVhZCA9IHJlYWQoYiwgMCwgYi5sZW5ndGgpOwotICAgIH0KLSAgICB3aGlsZSAoYnJlYWQgIT0gLTEpOwotICB9Ci0KLSAgLyoKLSAgICogcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KQotICAgKiB7Ci0gICAqIH0KLSAgICovCi0KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRG9uJ3Qgc3VwcG9ydCBtYXJrZWQgc3RyZWFtcyIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvSFRUUEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU4ODMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY0MzgxMDU5MDAxMzQ5NjFMOwotcHJpdmF0ZSBpbnQgc3RhdHVzQ29kZTsKLSAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzTWVzc2FnZTsKLSAgcHJpdmF0ZSBNYXAgaGVhZGVyczsKLSAgCi0gIHB1YmxpYyBIVFRQRXhjZXB0aW9uKGludCBzdGF0dXNDb2RlLCBTdHJpbmcgc3RhdHVzTWVzc2FnZSwgTWFwIGhlYWRlcnMpCi0gIHsKLSAgICBzdXBlcihzdGF0dXNNZXNzYWdlKTsKLSAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlOwotICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHN0YXR1c01lc3NhZ2U7Ci0gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkKLSAgewotICAgIHJldHVybiBzdGF0dXNDb2RlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c01lc3NhZ2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBNYXAgZ2V0SGVhZGVycygpCi0gIHsKLSAgICByZXR1cm4gaGVhZGVyczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIGtleSkKLSAgewotICAgIE9iamVjdCB2YWx1ZSA9IGhlYWRlcnMuZ2V0KGtleSk7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQUmVzcG9uc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViNjFhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvSFRUUFJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEhUVFBSZXNwb25zZQotewotICBwcml2YXRlIGJvb2xlYW4gc3RhdHVzU2V0OwotICBwcml2YXRlIGludCBzdGF0dXNDb2RlOwotICBwcml2YXRlIFN0cmluZyBzdGF0dXNNZXNzYWdlOwotICBwcml2YXRlIEhhc2h0YWJsZSBoZWFkZXJzOwotICBwcml2YXRlIGJ5dGVbXSBwYXlsb2FkOwotCi0gIHB1YmxpYyBIVFRQUmVzcG9uc2UoKQotICB7Ci0gICAgcmVzZXQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgewotICAgIHN0YXR1c1NldCA9IGZhbHNlOwotICAgIHN0YXR1c0NvZGUgPSAtMTsKLSAgICBzdGF0dXNNZXNzYWdlID0gbnVsbDsKLSAgICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgICAgaGVhZGVycy5jbGVhcigpOwotICAgIGVsc2UKLSAgICAgIGhlYWRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcGF5bG9hZCA9IG5ldyBieXRlWzBdOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNTdGF0dXNTZXQoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c1NldDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzQ29kZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1c0NvZGUoaW50IHN0YXR1c0NvZGUpCi0gIHsKLSAgICBzdGF0dXNTZXQgPSB0cnVlOwotICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c01lc3NhZ2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNNZXNzYWdlKFN0cmluZyBzdGF0dXNNZXNzYWdlKQotICB7Ci0gICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gc3RhdHVzTWVzc2FnZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBoZWFkZXJzLnB1dChrZXksIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgaGVhZGVycy5nZXQoa2V5KTsKLSAgfQotCi0gIHB1YmxpYyBNYXAgZ2V0SGVhZGVycygpCi0gIHsKLSAgICByZXR1cm4gaGVhZGVyczsKLSAgfQotCi0gIHB1YmxpYyBieXRlW10gZ2V0UGF5bG9hZCgpCi0gIHsKLSAgICByZXR1cm4gcGF5bG9hZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBheWxvYWQoYnl0ZVtdIHBheWxvYWQpCi0gIHsKLSAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNwb3J0L0hUVFBUcmFuc3BvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQVHJhbnNwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODQ5ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNwb3J0L0hUVFBUcmFuc3BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMTMxICAgMTI1Nzc3IGplc3BlckBzZWxza2FiZXQub3JnIC0gSmVzcGVyIFMgTW9sbGVyCi0gKiAyMDA2MDIyMiAgIDExODAxOSBhbmR5emhhaUBjYS5pYm0uY29tIC0gQW5keSBaaGFpCi0gKiAyMDA2MDIyMiAgIDEyODU2NCBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICogMjAwNjA4MjMgICAgOTkwMzQgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIFdTRSBzdXBwb3J0IGZvciBiYXNpYy1hdXRoZW50aWNhdGluZyBmaXJld2FsbHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgc3VuLm1pc2MuQkFTRTY0RW5jb2RlcjsKLQotcHVibGljIGNsYXNzIEhUVFBUcmFuc3BvcnQKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUFNfUFJPWFlfSE9TVCA9ICJodHRwcy5wcm94eUhvc3QiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNfUFJPUF9IVFRQU19QUk9YWV9QT1JUID0gImh0dHBzLnByb3h5UG9ydCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFNZU19QUk9QX0hUVFBTX05PTl9QUk9YWV9IT1NUUyA9ICJodHRwcy5ub25Qcm94eUhvc3RzIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUF9QUk9YWV9IT1NUID0gImh0dHAucHJveHlIb3N0IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUF9QUk9YWV9QT1JUID0gImh0dHAucHJveHlQb3J0IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUF9QUk9YWV9VU0VSX05BTUUgPSAiaHR0cC5wcm94eVVzZXJOYW1lIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUF9QUk9YWV9QQVNTV09SRCA9ICJodHRwLnByb3h5UGFzc3dvcmQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNfUFJPUF9IVFRQX05PTl9QUk9YWV9IT1NUUyA9ICJodHRwLm5vblByb3h5SG9zdHMiOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9NRVRIT0QgPSAiUE9TVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfQ09OTkVDVCA9ICJDT05ORUNUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9WRVJTSU9OXzFfMCA9ICJIVFRQLzEuMCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfVkVSU0lPTiA9ICJIVFRQLzEuMSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX1NPQVBfQUNUSU9OID0gIlNPQVBBY3Rpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9BVVRIID0gIkF1dGhvcml6YXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9XV1dfQVVUSCA9ICJXV1ctQXV0aGVudGljYXRlIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfUFJPWFlfQVVUSCA9ICJQcm94eS1hdXRob3JpemF0aW9uIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfQ09PS0lFID0gIkNvb2tpZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX0NPT0tJRTIgPSAiQ29va2llMiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX0hPU1QgPSAiSG9zdCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX0NPTlRFTlRfVFlQRSA9ICJDb250ZW50LVR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9DT05URU5UX0xFTkdUSCA9ICJDb250ZW50LUxlbmd0aCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX0FDQ0VQVCA9ICJBY2NlcHQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9VU0VSX0FHRU5UID0gIlVzZXItQWdlbnQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9DQUNIRV9DT05UUk9MID0gIkNhY2hlLUNvbnRyb2wiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9QUkFHTUEgPSAiUHJhZ21hIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfVFJBTlNGRVJfRU5DT0RFSU5HID0gIlRyYW5zZmVyLUVuY29kaW5nIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfQ09OTkVDVElPTiA9ICJDb25uZWN0aW9uIjsKLSAgCi0gIHByaXZhdGUgZmluYWwgaW50IEhUVFBfQ09ERV9DT05USU5VRSA9IDEwMDsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgSFRUUF9DT0RFX09LID0gMjAwOwotICBwcml2YXRlIGZpbmFsIGludCBIVFRQX0NPREVfRVhDRVBUSU9OID0gMzAwOwotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElCTV9XRUJfU0VSVklDRVNfRVhQTE9SRVIgPSAiSUJNIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRFWFRfWE1MID0gInRleHQveG1sIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX1ZBTFVFID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQUNDRVBUX1ZBTFVFID0gImFwcGxpY2F0aW9uL3NvYXAreG1sLCBhcHBsaWNhdGlvbi9kaW1lLCBtdWx0aXBhcnQvcmVsYXRlZCwgdGV4dC8qIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUMgPSAiQmFzaWMiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBOT19DQUNIRSA9ICJuby1jYWNoZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIENIVU5LRUQgPSAiY2h1bmtlZCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIENMT1NFID0gImNsb3NlIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUFMgPSAiaHR0cHMiOwotICBwcml2YXRlIGZpbmFsIGNoYXIgUVVPVEUgPSAnXCInOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ09MT04gPSAnOic7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBTUEFDRSA9ICcgJzsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIFRBQiA9ICdcdCc7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBSID0gJ1xyJzsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIE4gPSAnXG4nOwotICBwcml2YXRlIGZpbmFsIGNoYXIgUk9PVCA9ICcvJzsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTkVXX0xJTkUgPSAiXHJcbiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotCi0gIHByaXZhdGUgZmluYWwgaW50IERFRkFVTFRfSFRUUF9QT1JUID0gODA7Ci0gIHByaXZhdGUgZmluYWwgaW50IERFRkFVTFRfSFRUUFNfUE9SVCA9IDQ0MzsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT0FQX0VOQ09ESU5HID0gIlVURi04IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9IVFRQX0hFQURFUl9FTkNPRElORyA9ICJpc28tODg1OS0xIjsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFRkFVTFRfQ0FTRV9TRU5TSVRJVkVfRk9SX0hPU1RfTkFNRSA9IGZhbHNlOwotCi0gIHByaXZhdGUgU3RyaW5nIGh0dHBCYXNpY0F1dGhVc2VybmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotICBwcml2YXRlIGJvb2xlYW4gbWFpbnRhaW5TZXNzaW9uID0gZmFsc2U7Ci0gIHByaXZhdGUgU3RyaW5nIGNvb2tpZTsKLSAgcHJpdmF0ZSBTdHJpbmcgY29va2llMjsKLSAgcHJpdmF0ZSBIVFRQUmVzcG9uc2UgaHR0cFJlc3BvbnNlOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKCkKLSAgewotICAgIHJldHVybiBodHRwQmFzaWNBdXRoVXNlcm5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhVc2VybmFtZShTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lKQotICB7Ci0gICAgdGhpcy5odHRwQmFzaWNBdXRoVXNlcm5hbWUgPSBodHRwQmFzaWNBdXRoVXNlcm5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFBhc3N3b3JkKCkKLSAgewotICAgIHJldHVybiBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkKQotICB7Ci0gICAgdGhpcy5odHRwQmFzaWNBdXRoUGFzc3dvcmQgPSBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRNZXRob2QoVVJMIHVybCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoSFRUUF9NRVRIT0QpOwotICAgIHNiLmFwcGVuZChTUEFDRSk7Ci0gICAgU3RyaW5nIHByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCk7Ci0gICAgU3RyaW5nIGh0dHBQcm94eUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUF9QUk9YWV9IT1NUKTsKLSAgICBTdHJpbmcgaHR0cHNQcm94eUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUFNfUFJPWFlfSE9TVCk7Ci0gICAgaWYgKHByb3RvY29sLmVxdWFsc0lnbm9yZUNhc2UoImh0dHAiKSAmJiBodHRwUHJveHlIb3N0ICE9IG51bGwgJiYgaHR0cFByb3h5SG9zdC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgc2IuYXBwZW5kKHVybC50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzSWdub3JlQ2FzZSgiaHR0cHMiKSAmJiBodHRwc1Byb3h5SG9zdCAhPSBudWxsICYmIGh0dHBzUHJveHlIb3N0Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQodXJsLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIGZpbGUgPSB1cmwuZ2V0RmlsZSgpOwotICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgc2IuYXBwZW5kKGZpbGUpOwotICAgICAgZWxzZQotICAgICAgICBzYi5hcHBlbmQoUk9PVCk7Ci0gICAgfQotICAgIHNiLmFwcGVuZChTUEFDRSk7Ci0gICAgc2IuYXBwZW5kKEhUVFBfVkVSU0lPTik7Ci0gICAgc2IuYXBwZW5kKE5FV19MSU5FKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEhvc3QoVVJMIHVybCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoSFRUUF9IRUFERVJfSE9TVCk7Ci0gICAgc2IuYXBwZW5kKENPTE9OKTsKLSAgICBzYi5hcHBlbmQoU1BBQ0UpOwotICAgIHNiLmFwcGVuZCh1cmwuZ2V0SG9zdCgpKTsKLSAgICBzYi5hcHBlbmQoQ09MT04pOwotICAgIGludCBwb3J0ID0gdXJsLmdldFBvcnQoKTsKLSAgICBpZiAocG9ydCA+IDApCi0gICAgICBzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YocG9ydCkpOwotICAgIGVsc2UgaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFsc0lnbm9yZUNhc2UoSFRUUFMpKQotICAgICAgc2IuYXBwZW5kKERFRkFVTFRfSFRUUFNfUE9SVCk7Ci0gICAgZWxzZQotICAgICAgc2IuYXBwZW5kKERFRkFVTFRfSFRUUF9QT1JUKTsKLSAgICBzYi5hcHBlbmQoTkVXX0xJTkUpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DT05URU5UX1RZUEUsIENPTlRFTlRfVFlQRV9WQUxVRSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENvbnRlbnRMZW5ndGgoYnl0ZVtdIHBheWxvYWRBc0J5dGVzKQotICB7Ci0gICAgcmV0dXJuIGdldEhUVFBIZWFkZXIoSFRUUF9IRUFERVJfQ09OVEVOVF9MRU5HVEgsIFN0cmluZy52YWx1ZU9mKHBheWxvYWRBc0J5dGVzLmxlbmd0aCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0U09BUEFjdGlvbihTdHJpbmcgc29hcEFjdGlvbikKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoSFRUUF9IRUFERVJfU09BUF9BQ1RJT04pOwotICAgIHNiLmFwcGVuZChDT0xPTik7Ci0gICAgc2IuYXBwZW5kKFNQQUNFKTsKLSAgICBzYi5hcHBlbmQoUVVPVEUpOwotICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwpCi0gICAgICBzYi5hcHBlbmQoc29hcEFjdGlvbik7Ci0gICAgc2IuYXBwZW5kKFFVT1RFKTsKLSAgICBzYi5hcHBlbmQoTkVXX0xJTkUpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb29raWUoKQotICB7Ci0gICAgaWYgKG1haW50YWluU2Vzc2lvbikKLSAgICAgIHJldHVybiBnZXRIVFRQSGVhZGVyKEhUVFBfSEVBREVSX0NPT0tJRSwgY29va2llKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gRU1QVFlfU1RSSU5HOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb29raWUyKCkKLSAgewotICAgIGlmIChtYWludGFpblNlc3Npb24pCi0gICAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DT09LSUUyLCBjb29raWUyKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gRU1QVFlfU1RSSU5HOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRXV1dBdXRoZW50aWNhdGlvbigpCi0gIHsKLSAgICBpZiAoaHR0cEJhc2ljQXV0aFVzZXJuYW1lICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aFBhc3N3b3JkICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihodHRwQmFzaWNBdXRoVXNlcm5hbWUpOwotICAgICAgc2IuYXBwZW5kKENPTE9OKTsKLSAgICAgIHNiLmFwcGVuZChodHRwQmFzaWNBdXRoUGFzc3dvcmQpOwotICAgICAgQkFTRTY0RW5jb2RlciBlbmNvZGVyID0gbmV3IEJBU0U2NEVuY29kZXIoKTsKLSAgICAgIFN0cmluZyBlbmNvZGVkVXNlck5hbWVQYXNzd29yZCA9IGVuY29kZXIuZW5jb2RlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgICBzYi5hcHBlbmQoSFRUUF9IRUFERVJfQVVUSCk7Ci0gICAgICBzYi5hcHBlbmQoQ09MT04pOwotICAgICAgc2IuYXBwZW5kKFNQQUNFKTsKLSAgICAgIHNiLmFwcGVuZChCQVNJQyk7Ci0gICAgICBzYi5hcHBlbmQoU1BBQ0UpOwotICAgICAgc2IuYXBwZW5kKGVuY29kZWRVc2VyTmFtZVBhc3N3b3JkKTsKLSAgICAgIHNiLmFwcGVuZChORVdfTElORSk7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIEVNUFRZX1NUUklORzsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJveHlBdXRoZW50aWNhdGlvbigpCi0gIHsKLSAgICBTdHJpbmcgcHJveHlVc2VyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9IVFRQX1BST1hZX1VTRVJfTkFNRSk7Ci0gICAgU3RyaW5nIHByb3h5UGFzc3dvcmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUF9QUk9YWV9QQVNTV09SRCk7Ci0gICAgaWYgKHByb3h5VXNlck5hbWUgIT0gbnVsbCAmJiBwcm94eVBhc3N3b3JkICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwcm94eVVzZXJOYW1lKTsKLSAgICAgIHNiLmFwcGVuZChDT0xPTik7Ci0gICAgICBzYi5hcHBlbmQocHJveHlQYXNzd29yZCk7Ci0gICAgICBCQVNFNjRFbmNvZGVyIGVuY29kZXIgPSBuZXcgQkFTRTY0RW5jb2RlcigpOwotICAgICAgU3RyaW5nIGVuY29kZWRVc2VyTmFtZVBhc3N3b3JkID0gZW5jb2Rlci5lbmNvZGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgIHNiLnNldExlbmd0aCgwKTsKLSAgICAgIHNiLmFwcGVuZChIVFRQX0hFQURFUl9QUk9YWV9BVVRIKTsKLSAgICAgIHNiLmFwcGVuZChDT0xPTik7Ci0gICAgICBzYi5hcHBlbmQoU1BBQ0UpOwotICAgICAgc2IuYXBwZW5kKEJBU0lDKTsKLSAgICAgIHNiLmFwcGVuZChTUEFDRSk7Ci0gICAgICBzYi5hcHBlbmQoZW5jb2RlZFVzZXJOYW1lUGFzc3dvcmQpOwotICAgICAgc2IuYXBwZW5kKE5FV19MSU5FKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gRU1QVFlfU1RSSU5HOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRBY2NlcHQoKQotICB7Ci0gICAgcmV0dXJuIGdldEhUVFBIZWFkZXIoSFRUUF9IRUFERVJfQUNDRVBULCBBQ0NFUFRfVkFMVUUpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRVc2VyQWdlbnQoKQotICB7Ci0gICAgcmV0dXJuIGdldEhUVFBIZWFkZXIoSFRUUF9IRUFERVJfVVNFUl9BR0VOVCwgSUJNX1dFQl9TRVJWSUNFU19FWFBMT1JFUik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENhY2hlQ29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DQUNIRV9DT05UUk9MLCBOT19DQUNIRSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFByYWdtYSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9QUkFHTUEsIE5PX0NBQ0hFKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29ubmVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DT05ORUNUSU9OLCBDTE9TRSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEhUVFBIZWFkZXIoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihrZXkpOwotICAgICAgc2IuYXBwZW5kKENPTE9OKTsKLSAgICAgIHNiLmFwcGVuZChTUEFDRSk7Ci0gICAgICBzYi5hcHBlbmQodmFsdWUpOwotICAgICAgc2IuYXBwZW5kKE5FV19MSU5FKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gRU1QVFlfU1RSSU5HOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VuZChVUkwgdXJsLCBTdHJpbmcgc29hcEFjdGlvbiwgU3RyaW5nIHBheWxvYWQpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGJ5dGVbXSBwYXlsb2FkQXNVVEY4ID0gcGF5bG9hZC5nZXRCeXRlcyhERUZBVUxUX1NPQVBfRU5DT0RJTkcpOwotICAgICAgIAotICAgIFN0cmluZ0J1ZmZlciBodHRwSGVhZGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldE1ldGhvZCh1cmwpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRIb3N0KHVybCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldENvbnRlbnRUeXBlKCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldENvbnRlbnRMZW5ndGgocGF5bG9hZEFzVVRGOCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldEFjY2VwdCgpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRVc2VyQWdlbnQoKSk7Ci0gICAgaHR0cEhlYWRlci5hcHBlbmQoZ2V0Q2FjaGVDb250cm9sKCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldFByYWdtYSgpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRTT0FQQWN0aW9uKHNvYXBBY3Rpb24pKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRXV1dBdXRoZW50aWNhdGlvbigpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRQcm94eUF1dGhlbnRpY2F0aW9uKCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldENvb2tpZSgpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRDb29raWUyKCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldENvbm5lY3Rpb24oKSk7Ci0gICAgaHR0cEhlYWRlci5hcHBlbmQoTkVXX0xJTkUpOyAvLyBuZXcgbGluZSBiZXR3ZWVuIHRoZSBIVFRQIGhlYWRlciBhbmQgdGhlIHBheWxvYWQKLSAgICBTb2NrZXQgc29ja2V0ID0gYnVpbGRTb2NrZXQodXJsKTsKLSAgICBJbnB1dFN0cmVhbSBpcyA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotICAgIE91dHB1dFN0cmVhbSBvcyA9IHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICBvcy53cml0ZShodHRwSGVhZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoREVGQVVMVF9IVFRQX0hFQURFUl9FTkNPRElORykpOwotICAgIG9zLndyaXRlKHBheWxvYWRBc1VURjgpOwotICAgIG9zLmZsdXNoKCk7Ci0gICAgaHR0cFJlc3BvbnNlID0gbmV3IEhUVFBSZXNwb25zZSgpOwotICAgIHJlYWRIVFRQUmVzcG9uc2VIZWFkZXIoaXMsIGh0dHBSZXNwb25zZSk7Ci0gICAgaW50IGNvZGUgPSBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpOwotICAgIGlmIChjb2RlID09IEhUVFBfQ09ERV9DT05USU5VRSkKLSAgICB7Ci0gICAgICBodHRwUmVzcG9uc2UucmVzZXQoKTsKLSAgICAgIHJlYWRIVFRQUmVzcG9uc2VIZWFkZXIoaXMsIGh0dHBSZXNwb25zZSk7Ci0gICAgfQotICAgIHJlYWRIVFRQUmVzcG9uc2VQYXlsb2FkKGlzLCBodHRwUmVzcG9uc2UpOwotICAgIG9zLmNsb3NlKCk7Ci0gICAgaXMuY2xvc2UoKTsKLSAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICBjb2RlID0gaHR0cFJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKTsKLSAgICBTdHJpbmcgY29udGVudFR5cGUgPSBodHRwUmVzcG9uc2UuZ2V0SGVhZGVyKEhUVFBfSEVBREVSX0NPTlRFTlRfVFlQRS50b0xvd2VyQ2FzZSgpKTsKLSAgICBpZiAoY29kZSA+PSBIVFRQX0NPREVfRVhDRVBUSU9OICYmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IGNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihURVhUX1hNTC50b0xvd2VyQ2FzZSgpKSA9PSAtMSkpCi0gICAgICB0aHJvdyBuZXcgSFRUUEV4Y2VwdGlvbihjb2RlLCBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzTWVzc2FnZSgpLCBodHRwUmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZWFkSFRUUFJlc3BvbnNlSGVhZGVyKElucHV0U3RyZWFtIGlzLCBIVFRQUmVzcG9uc2UgcmVzcCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBieXRlIGIgPSAwOwotICAgIGludCBsZW4gPSAwOwotICAgIGludCBjb2xvbkluZGV4ID0gLTE7Ci0gICAgU3RyaW5nIGtleTsKLSAgICBTdHJpbmcgdmFsdWU7Ci0gICAgYm9vbGVhbiByZWFkVG9vTXVjaCA9IGZhbHNlOwotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zOwotICAgIGZvciAoYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oNDA5Nik7OykKLSAgICB7Ci0gICAgICBpZiAoIXJlYWRUb29NdWNoKQotICAgICAgICBiID0gKGJ5dGUpaXMucmVhZCgpOwotICAgICAgaWYgKGIgPT0gLTEpCi0gICAgICAgIGJyZWFrOwotICAgICAgcmVhZFRvb011Y2ggPSBmYWxzZTsKLSAgICAgIGlmICgoYiAhPSBSKSAmJiAoYiAhPSBOKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKChiID09IENPTE9OKSAmJiAoY29sb25JbmRleCA9PSAtMSkpCi0gICAgICAgICAgY29sb25JbmRleCA9IGxlbjsKLSAgICAgICAgbGVuKys7Ci0gICAgICAgIGJhb3Mud3JpdGUoYik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChiID09IFIpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgZWxzZSAvLyBiID09IE4KLSAgICAgIHsKLSAgICAgICAgaWYgKGxlbiA9PSAwKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBiID0gKGJ5dGUpaXMucmVhZCgpOwotICAgICAgICByZWFkVG9vTXVjaCA9IHRydWU7Ci0gICAgICAgIC8vIEEgc3BhY2Ugb3IgdGFiIGF0IHRoZSBiZWdpbmluZyBvZiBhIGxpbmUgbWVhbnMgdGhlIGhlYWRlciBjb250aW51ZXMuCi0gICAgICAgIGlmICgoYiA9PSBTUEFDRSkgfHwgKGIgPT0gVEFCKSkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYmFvcy5jbG9zZSgpOwotICAgICAgICBieXRlW10gYkFycmF5ID0gYmFvcy50b0J5dGVBcnJheSgpOwotICAgICAgICBiYW9zLnJlc2V0KCk7Ci0gICAgICAgIGlmIChjb2xvbkluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAga2V5ID0gbmV3IFN0cmluZyhiQXJyYXksIDAsIGNvbG9uSW5kZXgsIERFRkFVTFRfSFRUUF9IRUFERVJfRU5DT0RJTkcpOwotICAgICAgICAgIHZhbHVlID0gbmV3IFN0cmluZyhiQXJyYXksIGNvbG9uSW5kZXggKyAxLCBsZW4gLSAxIC0gY29sb25JbmRleCwgREVGQVVMVF9IVFRQX0hFQURFUl9FTkNPRElORyk7Ci0gICAgICAgICAgY29sb25JbmRleCA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGtleSA9IG5ldyBTdHJpbmcoYkFycmF5LCAwLCBsZW4sIERFRkFVTFRfSFRUUF9IRUFERVJfRU5DT0RJTkcpOwotICAgICAgICAgIHZhbHVlID0gRU1QVFlfU1RSSU5HOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVzcC5pc1N0YXR1c1NldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmVhZGVyIHN0YXR1cyBjb2RlCi0gICAgICAgICAgaW50IHN0YXJ0ID0ga2V5LmluZGV4T2YoU1BBQ0UpICsgMTsKLSAgICAgICAgICBTdHJpbmcgcyA9IGtleS5zdWJzdHJpbmcoc3RhcnQpLnRyaW0oKTsKLSAgICAgICAgICBpbnQgZW5kID0gcy5pbmRleE9mKFNQQUNFKTsKLSAgICAgICAgICBpZiAoZW5kICE9IC0xKQotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDAsIGVuZCk7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXNDb2RlKEludGVnZXIucGFyc2VJbnQocykpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNwLnNldFN0YXR1c0NvZGUoLTEpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXNwLnNldFN0YXR1c01lc3NhZ2Uoa2V5LnN1YnN0cmluZyhzdGFydCArIGVuZCArIDEpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcmVzcC5hZGRIZWFkZXIoa2V5LnRvTG93ZXJDYXNlKCkudHJpbSgpLCB2YWx1ZS50cmltKCkpOwotICAgICAgICBsZW4gPSAwOwotICAgICAgfQotICAgIH0KLSAgICBiYW9zLmNsb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVhZEhUVFBSZXNwb25zZVBheWxvYWQoSW5wdXRTdHJlYW0gaXMsIEhUVFBSZXNwb25zZSByZXNwKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJ5dGUgYiA9IChieXRlKWlzLnJlYWQoKTsKLSAgICAgIHdoaWxlIChiICE9IC0xKQotICAgICAgewotICAgICAgICBiYW9zLndyaXRlKGIpOwotICAgICAgICBiID0gKGJ5dGUpaXMucmVhZCgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBzdGUpCi0gICAgewotICAgIH0KLSAgICBiYW9zLmNsb3NlKCk7Ci0gICAgcmVzcC5zZXRQYXlsb2FkKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gIH0KLQotICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgcmVjZWl2ZSgpCi0gIHsKLSAgICBpZiAoaHR0cFJlc3BvbnNlICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGJ5dGVbXSBwYXlsb2FkID0gaHR0cFJlc3BvbnNlLmdldFBheWxvYWQoKTsKLSAgICAgICAgRWxlbWVudCBzb2FwRW52ZWxvcGUgPSBudWxsOwotICAgICAgICBpZiAoQ0hVTktFRC5lcXVhbHNJZ25vcmVDYXNlKGh0dHBSZXNwb25zZS5nZXRIZWFkZXIoSFRUUF9IRUFERVJfVFJBTlNGRVJfRU5DT0RFSU5HLnRvTG93ZXJDYXNlKCkpKSkKLSAgICAgICAgewotICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGF5bG9hZCk7Ci0gICAgICAgICAgQ2h1bmtlZElucHV0U3RyZWFtIGNpcyA9IG5ldyBDaHVua2VkSW5wdXRTdHJlYW0oYmFpcyk7Ci0gICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgYnl0ZSBiOwotICAgICAgICAgIHdoaWxlICgoYiA9IChieXRlKWNpcy5yZWFkKCkpICE9IC0xKQotICAgICAgICAgICAgYmFvcy53cml0ZShiKTsKLSAgICAgICAgICBiYW9zLmNsb3NlKCk7Ci0gICAgICAgICAgY2lzLmNsb3NlKCk7Ci0gICAgICAgICAgYmFpcy5jbG9zZSgpOwotICAgICAgICAgIHNvYXBFbnZlbG9wZSA9IFhNTFV0aWxzLmJ5dGVBcnJheVRvRWxlbWVudChiYW9zLnRvQnl0ZUFycmF5KCksIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzb2FwRW52ZWxvcGUgPSBYTUxVdGlscy5ieXRlQXJyYXlUb0VsZW1lbnQocGF5bG9hZCwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJlbW92ZSBYTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgIGlmIChzb2FwRW52ZWxvcGUgIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oWE1MVXRpbHMuc2VyaWFsaXplKHNvYXBFbnZlbG9wZSwgdHJ1ZSkuZ2V0Qnl0ZXMoREVGQVVMVF9TT0FQX0VOQ09ESU5HKSksIERFRkFVTFRfU09BUF9FTkNPRElORykpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0SGVhZGVycygpCi0gIHsKLSAgICBIYXNodGFibGUgaGVhZGVycyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBpZiAoaHR0cFJlc3BvbnNlICE9IG51bGwpCi0gICAgICBoZWFkZXJzLnB1dEFsbChodHRwUmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKLSAgICByZXR1cm4gaGVhZGVyczsKLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZHMgdGhlIGZpcnN0IGxpbmUgb2YgYSBjb25uZWN0aW9uIHJlcXVlc3QgdG8gdGhlIHByb3h5IHNlcnZlcgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIHRoYXQgd2Ugd2FudCB0byB1bHRpbWF0ZWx5IGNvbm5lY3QgdG8uCi0gICAqIEByZXR1cm4gQSBzdHJpbmcgb2YgdGhlIGZvcm0gIkNPTk5FQ1QgJmx0O2hvc3RuYW1lJmd0OzombHQ7cG9ydCZndDsgSFRUUC8xLjAiLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZ2V0Q29ubmVjdE1ldGhvZChVUkwgdXJsKSB7Ci0JCi0JICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKEhUVFBfQ09OTkVDVCk7Ci0JICBzYi5hcHBlbmQoU1BBQ0UpOwkgIAotCSAgc2IuYXBwZW5kKHVybC5nZXRIb3N0KCkpOwotCSAgc2IuYXBwZW5kKENPTE9OKTsKLQkgIHNiLmFwcGVuZCh1cmwuZ2V0UG9ydCgpKTsKLQkgIHNiLmFwcGVuZChTUEFDRSk7Ci0JICBzYi5hcHBlbmQoSFRUUF9WRVJTSU9OXzFfMCk7Ci0JICBzYi5hcHBlbmQoTkVXX0xJTkUpOwotCSAgcmV0dXJuIHNiOwotICB9Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0IGEgc29ja2V0IHRvIHRoZSBwcm94eSBzZXJ2ZXIgd2hpY2ggYmUgdXNlZCB0byB0dW5uZWwgdGhyb3VnaC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0aGF0IHdlIHdhbnQgdG8gdWx0aW1hdGVseSBjb25uZWN0IHRvLgotICAgKiBAcGFyYW0gcHJveHlIb3N0IFRoZSBwcm94eSBob3N0LgotICAgKiBAcGFyYW0gcHJveHlQb3J0IFRoZSBwcm94eSBwb3J0LgotICAgKiBAcmV0dXJuIEEgY29ubmVjdGVkIHNvY2tldCB0byB0aGUgcHJveHkgc2VydmVyLiAKLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKLSAgICovCi0gIHByaXZhdGUgU29ja2V0IGJ1aWxkVHVubmVsU29ja2V0KFVSTCB1cmwsIFN0cmluZyBwcm94eUhvc3QsIGludCBwcm94eVBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkgIFN0cmluZ0J1ZmZlciBodHRwSGVhZGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgaHR0cEhlYWRlci5hcHBlbmQoZ2V0Q29ubmVjdE1ldGhvZCh1cmwpKTsKLQkgIGh0dHBIZWFkZXIuYXBwZW5kKGdldFByb3h5QXV0aGVudGljYXRpb24oKSk7ICAgICAgIAotCSAgaHR0cEhlYWRlci5hcHBlbmQoTkVXX0xJTkUpOwotICAgIAotCSAgU29ja2V0IHR1bm5lbCA9IG5ldyBTb2NrZXQocHJveHlIb3N0LCBwcm94eVBvcnQpOwotICAgIAotCSAgSW5wdXRTdHJlYW0gIGlzID0gdHVubmVsLmdldElucHV0U3RyZWFtKCk7Ci0JICBPdXRwdXRTdHJlYW0gb3MgPSB0dW5uZWwuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgCi0JICBvcy53cml0ZShodHRwSGVhZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoREVGQVVMVF9IVFRQX0hFQURFUl9FTkNPRElORykpOyAgICAgICAgCi0JICBvcy5mbHVzaCgpOwotICAgIAotCSAgSFRUUFJlc3BvbnNlIGh0dHBSZXNwb25zZSA9IG5ldyBIVFRQUmVzcG9uc2UoKTsKLQkgIHJlYWRIVFRQUmVzcG9uc2VIZWFkZXIoaXMsIGh0dHBSZXNwb25zZSk7Ci0gICAgCi0JICBpbnQgY29kZSA9IGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCk7Ci0KLQkgIC8vIGVuc3VyZSB3ZSBhcmUgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB0aGUgcHJveHkKLQkgIGlmIChjb2RlICE9IEhUVFBfQ09ERV9PSykKLQkJICB0aHJvdyBuZXcgSFRUUEV4Y2VwdGlvbihjb2RlLCBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzTWVzc2FnZSgpLCBodHRwUmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKLQkgIAotCSAgcmV0dXJuIHR1bm5lbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTb2NrZXQgYnVpbGRTb2NrZXQoVVJMIHVybCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU29ja2V0IHMgPSBudWxsOwotICAgIFN0cmluZyBob3N0ID0gdXJsLmdldEhvc3QoKTsKLSAgICBpbnQgcG9ydCA9IHVybC5nZXRQb3J0KCk7Ci0gICAgU3RyaW5nIHByb3h5SG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9IVFRQX1BST1hZX0hPU1QpOwotICAgIGludCBwcm94eVBvcnQgPSBJbnRlZ2VyLmdldEludGVnZXIoU1lTX1BST1BfSFRUUF9QUk9YWV9QT1JULCBERUZBVUxUX0hUVFBfUE9SVCkuaW50VmFsdWUoKTsKLSAgICAKLSAgICBTdHJpbmcgbm9uUHJveHlIb3N0cyA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9IVFRQX05PTl9QUk9YWV9IT1NUUyk7Ci0KLSAgICAvLyAgU3RyaW5nIHByb3h5VXNlck5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUF9QUk9YWV9VU0VSX05BTUUpOwotICAgIC8vICBTdHJpbmcgcHJveHlQYXNzd29yZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9IVFRQX1BST1hZX1BBU1NXT1JEKTsKLSAgICBpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzSWdub3JlQ2FzZShIVFRQUykpCi0gICAgewotICAgICAgcHJveHlIb3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KFNZU19QUk9QX0hUVFBTX1BST1hZX0hPU1QpOwotICAgICAgcHJveHlQb3J0ID0gSW50ZWdlci5nZXRJbnRlZ2VyKFNZU19QUk9QX0hUVFBTX1BST1hZX1BPUlQsIERFRkFVTFRfSFRUUFNfUE9SVCkuaW50VmFsdWUoKTsKLSAgICAgIG5vblByb3h5SG9zdHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUFNfTk9OX1BST1hZX0hPU1RTKTsKLQotICAgICAgaWYgKHByb3h5SG9zdCAhPSBudWxsICYmIHByb3h5SG9zdC5sZW5ndGgoKSA+IDAgJiYgIWlzSG9zdEluTm9uUHJveHlIb3N0cyhob3N0LCBub25Qcm94eUhvc3RzLCBERUZBVUxUX0NBU0VfU0VOU0lUSVZFX0ZPUl9IT1NUX05BTUUpKQotICAgICAgewotICAgICAgICAvLyBTU0wgd2l0aCBwcm94eSBzZXJ2ZXIKLSAgICAgICAgU29ja2V0IHR1bm5lbCA9IGJ1aWxkVHVubmVsU29ja2V0KHVybCwgcHJveHlIb3N0LCBwcm94eVBvcnQpOyAgICAgICAKLSAgICAgICAgcyA9ICgoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCkpLmNyZWF0ZVNvY2tldCh0dW5uZWwsIGhvc3QsIHBvcnQsIHRydWUpOyAgICAJICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcyA9IFNTTFNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpLmNyZWF0ZVNvY2tldChob3N0LCAocG9ydCA+IDAgPyBwb3J0IDogREVGQVVMVF9IVFRQU19QT1JUKSk7Ci0gICAgICAvLyBSZW1vdmluZyBkZXBlbmRlbmN5IG9uIHNvYXAuamFyCi0gICAgICAvLyAgcyA9IFNTTFV0aWxzLmJ1aWxkU1NMU29ja2V0KGhvc3QsIChwb3J0ID4gMCA/IHBvcnQgOiBERUZBVUxUX0hUVFBTX1BPUlQpLCBwcm94eUhvc3QsIHByb3h5UG9ydCk7Ci0gICAgICAvLyBUT0RPOgotICAgICAgLy8gQnVpbGQgYW4gU1NMIHNvY2tldCB0aGF0IHN1cHBvcnRzIHByb3h5VXNlciBhbmQgcHJveHlQYXNzd29yZCwKLSAgICAgIC8vIGFzIGRlbW9uc3RyYXRlZCBpbiB0aGUgZm9sbG93aW5nIChvcmlnaW5hbCkgbGluZSBvZiBjb2RlOgotICAgICAgLy8gIHMgPSBTU0xVdGlscy5idWlsZFNTTFNvY2tldChob3N0LCAocG9ydCA+IDAgPyBwb3J0IDogREVGQVVMVF9IVFRQU19QT1JUKSwgcHJveHlIb3N0LCBwcm94eVBvcnQsIHByb3h5VXNlck5hbWUsIHByb3h5UGFzc3dvcmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm94eUhvc3QgIT0gbnVsbCAmJiBwcm94eUhvc3QubGVuZ3RoKCkgPiAwICYmICFpc0hvc3RJbk5vblByb3h5SG9zdHMoaG9zdCwgbm9uUHJveHlIb3N0cywgREVGQVVMVF9DQVNFX1NFTlNJVElWRV9GT1JfSE9TVF9OQU1FKSkKLSAgICAgIHMgPSBuZXcgU29ja2V0KHByb3h5SG9zdCwgcHJveHlQb3J0KTsKLSAgICBlbHNlCi0gICAgICBzID0gbmV3IFNvY2tldChob3N0LCAocG9ydCA+IDAgPyBwb3J0IDogREVGQVVMVF9IVFRQX1BPUlQpKTsKLSAgICByZXR1cm4gczsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzSG9zdEluTm9uUHJveHlIb3N0cyhTdHJpbmcgaG9zdCwgU3RyaW5nIG5vblByb3h5SG9zdHMsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkKLSAgewotICAJaWYgKGNhc2VTZW5zaXRpdmUpIHJldHVybiBob3N0Lm1hdGNoZXMoY3JlYXRlUGF0dGVybkZyb21TdHJpbmcobm9uUHJveHlIb3N0cykpOwotICAJZWxzZSByZXR1cm4gaG9zdC50b0xvd2VyQ2FzZSgpLm1hdGNoZXMoY3JlYXRlUGF0dGVybkZyb21TdHJpbmcobm9uUHJveHlIb3N0cy50b0xvd2VyQ2FzZSgpKSk7ICAKLSAgfQotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYSAKLSAgICogbm9ybWFsIGphdmEgU3RyaW5nIHVzZWQgaW4gdGhlIHByb3h5IG1lY2hhbmlzbS4gCi0gICAqIEZvciBleGFtcGxlLCB0aGUgaHR0cC5ub25Qcm94eUhvc3RzIGNvbnRhaW5zIGZvbGxvd2luZyBTdHJpbmc6IAotICAgKiAiMTkyLjE2OC4yLip8bG9jYWxob3N0fCouaWJtLmNvbSIgLiBJdCB3b3VsZCBiZSAKLSAgICogdHJhbnNmb3JtZWQgaW50bzogIjE5MlwuMTY4XC4yXC5cdyp8bG9jYWxob3N0fFx3KlwuaWJtXC5jb20iCi0gICAqIFRodXMsIGZvbGxvd2luZyBob3N0IHN0cmluZyB3b3VsZCBtYXRjaCBhYm92ZSBwYXR0ZXJuOgotICAgKiAxOTIuMTY4LjIuNSAxOTIuMTY4LjIuIDE5Mi4xNjguMi42NjYgMTkyLjE2OC4yLncKLSAgICogbG9jYWxob3N0Ci0gICAqIHRvcm9sYWIuaWJtLmNvbSAuaWJtLmNvbSAxMjMuaWJtLmNvbQotICAgKiAKLSAgICogVHdvIHRyYW5zZm9ybWF0aW9ucyBhcmUgZG9uZToKLSAgICogMS4gcmVwbGFjZSBhbGwgIi4iIGludG8gIlwuIiBBcyBpbiByZWd1bGFyIGV4cHJlc3Npb24sICcuJyByZXByZXNlbnRzIAotICAgKiAgICBhbnkgY2hhcmF0ZXIuICAiXC4nIHJlcHJlc2VudHMgdGhlIHJlYWwgY2hhcmFjdGVyICcuJwotICAgKiAyLiBJbiBvcmRlciB0byBnZXQgdGhlIHJlYWwgbWVhbmluZyBvZiAiKiIgdXNlZCBpbiBwcm9wZXJ0eSAKLSAgICogICAgaHR0cC5ub25Qcm94eUhvc3RzLCAiXHcqIiBpcyB1c2VkIHRvIHJlcGxhY2UgIioiCi0gICAqICAgICJcdyIgcmVwcmVzZW50IGEgd29yZCBjaGFyYWN0ZXI6IFthLXpBLVpfMC05XQotICAgKiAgICAKLSAgICogUmVzdHJpY3Rpb246Ci0gICAqIFRoZSB2YWxpZGl0eSBvZiBhZGRyZXNzIGlzIG5vdCBjaGVja2VkLiAKLSAgICogKDE5Mi4xNjguMi41NTUgYW5kIDE5Mi4xNjguMi5jb20gYXJlIE9LKQotICAgKiAKLSAgICogVE9ETyBjaGVjayB3aGV0aGVyICogb2NjdXJzIGluIGFkZHJlc3Mgb3IgaG9zdG5hbWUuCi0gICAqIGlmIGl0IG9jY3V1cyBpbiBhZGRyZXNzIHJlcHJlc2VudGF0aW9uLCByZXBsYWNlICIqIiB3aXRoICJcZCoiCi0gICAqIGFuZCBjaGVjazogdmFsdWUgPCAyNTYgPwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUGF0dGVybkZyb21TdHJpbmcoU3RyaW5nIHN0cikgCi0gIHsKLSAgICAvKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGZvbGxvd2luZyBtb3JlIHVuZGVyc3RhbmRhYmxlIHdheToKLQkgKiByZXR1cm4gc3RyLnJlcGxhY2UoIi4iLCAiXFwuIikucmVwbGFjZSgiKiIsICJcXHcqIik7Ci0JICogQnV0LCByZXBsYWNlKENoYXJTZXF1ZW5jZSB0YXJnZXQsIENoYXJTZXF1ZW5jZSByZXBsYWNlbWVudCkgY2FuIG9ubHkgYmUgCi0JICogc3VwcG9ydGVkIGFmdGVyIGoyc2UgMS41LCBvbiB0aGUgb3RoZXIgaGFuZCwgCi0JICogcmVwbGFjZUFsbChTdHJpbmcgcmVnZXgsIFN0cmluZyByZXBsYWNlbWVudCkgY2FuIGJlIHN1cHBvcnRlZCBiZWZvcmUgCi0JICogajJzZSAxLjUuCi0JICovCi0gICAgcmV0dXJuIHN0ciA9PSBudWxsID8gbnVsbCA6IHN0ci5yZXBsYWNlQWxsKCJcXC4iLCAiXFwuIikucmVwbGFjZUFsbCgiXFwqIiwgIlxcdyoiKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3V0aWwvU29hcEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdXRpbC9Tb2FwSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTlmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdXRpbC9Tb2FwSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTb2FwSGVscGVyCi17Ci0gIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlc18gPSBudWxsOwotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBpbml0RGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZXMoKQotICB7Ci0gICAgZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzXy5wdXQoQ29uc3RhbnRzLlVSSV9TT0FQMTFfRU5WLENvbnN0YW50cy5OU19QUkVGSVhfU09BUF9FTlYpOwotICAgIGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzXy5wdXQoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0ksQ29uc3RhbnRzLk5TX1BSRUZJWF9TQ0hFTUFfWFNJKTsKLSAgICBkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlc18ucHV0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELENvbnN0YW50cy5OU19QUkVGSVhfU0NIRU1BX1hTRCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhZGREZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlcyhIYXNodGFibGUgc29hcEVudmVsb3BlTmFtZXNwYWNlcykKLSAgewotICAgIGlmIChkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlc18gPT0gbnVsbCkKLSAgICAgIGluaXREZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlcygpOwotICAgIEVudW1lcmF0aW9uIGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VVUklzID0gZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZXNfLmtleXMoKTsKLSAgICB3aGlsZSAoZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VVUklzLm5leHRFbGVtZW50KCk7Ci0gICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VzLnB1dChkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlVVJJLChTdHJpbmcpZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZXNfLmdldChkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlVVJJKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkksU3RyaW5nIG5hbWVzcGFjZVByZWZpeCkKLSAgewotICAgIGlmIChkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlc18gPT0gbnVsbCkKLSAgICAgIGluaXREZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlcygpOwotICAgIGlmIChkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlc18uZ2V0KG5hbWVzcGFjZVVSSSkgIT0gbnVsbCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVsZW1lbnQgY3JlYXRlU29hcEVudmVsb3BlRWxlbWVudChEb2N1bWVudCBkb2MsSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgRWxlbWVudCBzb2FwRW52ZWxvcGVFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInNvYXBlbnY6RW52ZWxvcGUiKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUua2V5cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIFN0cmluZ0J1ZmZlciBzb2FwRW52ZWxvcGVOYW1lc3BhY2VBdHRyID0gbmV3IFN0cmluZ0J1ZmZlcigieG1sbnM6Iik7Ci0gICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VBdHRyLmFwcGVuZCgoU3RyaW5nKXNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLmdldChzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpKTsKLSAgICAgIHNvYXBFbnZlbG9wZUVsZW1lbnQuc2V0QXR0cmlidXRlKHNvYXBFbnZlbG9wZU5hbWVzcGFjZUF0dHIudG9TdHJpbmcoKSxzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOyAgICAgIAotICAgIH0gICAgCi0gICAgcmV0dXJuIHNvYXBFbnZlbG9wZUVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRWxlbWVudCBjcmVhdGVTb2FwQm9keUVsZW1lbnQoRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50KCJzb2FwZW52OkJvZHkiKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50IGNyZWF0ZVJQQ1dyYXBwZXJFbGVtZW50KERvY3VtZW50IGRvYyxIYXNodGFibGUgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUsU3RyaW5nIGVuY29kaW5nTmFtZXNwYWNlVVJJLFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgZW5jb2RpbmdTdHlsZSkKLSAgewotICAgIGludCBuc0lkID0gMDsKLSAgICBTdHJpbmdCdWZmZXIgd3JhcHBlckVsZW1lbnROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZyBlbmNvZGluZ05hbWVzcGFjZVByZWZpeCA9IChTdHJpbmcpc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUuZ2V0KGVuY29kaW5nTmFtZXNwYWNlVVJJKTsKLSAgICBpZiAoZW5jb2RpbmdOYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkKLSAgICAgIHdyYXBwZXJFbGVtZW50TmFtZS5hcHBlbmQoZW5jb2RpbmdOYW1lc3BhY2VQcmVmaXgpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBMb29wIHVudGlsIHdlIGdlbmVyYXRlIGEgdW5pcXVlIHByZWZpeC4KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIHdyYXBwZXJFbGVtZW50TmFtZS5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIHdyYXBwZXJFbGVtZW50TmFtZS5hcHBlbmQoIm5zIikuYXBwZW5kKG5zSWQpOwotICAgICAgICBpZiAoIXNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLmNvbnRhaW5zVmFsdWUod3JhcHBlckVsZW1lbnROYW1lLnRvU3RyaW5nKCkpKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBuc0lkKys7Ci0gICAgICB9IHdoaWxlICh0cnVlKTsKLSAgICB9ICAgIAotICAgIFN0cmluZyB3cmFwcGVyRWxlbWVudE5hbWVQcmVmaXggPSB3cmFwcGVyRWxlbWVudE5hbWUudG9TdHJpbmcoKTsKLSAgICB3cmFwcGVyRWxlbWVudE5hbWUuYXBwZW5kKCc6JykuYXBwZW5kKG9wZXJhdGlvbk5hbWUpOwotICAgIEVsZW1lbnQgd3JhcHBlckVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCh3cmFwcGVyRWxlbWVudE5hbWUudG9TdHJpbmcoKSk7Ci0gICAgU3RyaW5nQnVmZmVyIG5hbWVzcGFjZUF0dHJOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieG1sbnM6Iik7Ci0gICAgbmFtZXNwYWNlQXR0ck5hbWUuYXBwZW5kKHdyYXBwZXJFbGVtZW50TmFtZVByZWZpeCk7Ci0gICAgd3JhcHBlckVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWVzcGFjZUF0dHJOYW1lLnRvU3RyaW5nKCksZW5jb2RpbmdOYW1lc3BhY2VVUkkpOwotICAgIGlmIChlbmNvZGluZ1N0eWxlICE9IG51bGwpCi0gICAgICB3cmFwcGVyRWxlbWVudC5zZXRBdHRyaWJ1dGUoInNvYXBlbnY6ZW5jb2RpbmdTdHlsZSIsZW5jb2RpbmdTdHlsZSk7Ci0gICAgcmV0dXJuIHdyYXBwZXJFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW5jb2RlTmFtZXNwYWNlRGVjbGFyYXRpb24oU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQocHJlZml4KTsKLSAgICBzYi5hcHBlbmQoIiAiKTsKLSAgICBzYi5hcHBlbmQodXJpKTsKLSAgICBTdHJpbmcgcmVzdWx0ID0gVVJMVXRpbHMuZW5jb2RlKHNiLnRvU3RyaW5nKCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRlY29kZU5hbWVzcGFjZURlY2xhcmF0aW9uKFN0cmluZyBzKQotICB7Ci0gICAgU3RyaW5nIHNDb3B5ID0gVVJMVXRpbHMuZGVjb2RlKHMpOwotICAgIGludCBpbmRleCA9IHNDb3B5LmluZGV4T2YoIiAiKTsKLSAgICBTdHJpbmdbXSBuc0RlY2wgPSBuZXcgU3RyaW5nWzJdOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBuc0RlY2xbMF0gPSBzQ29weS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgbnNEZWNsWzFdID0gc0NvcHkuc3Vic3RyaW5nKGluZGV4KzEsIHNDb3B5Lmxlbmd0aCgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG5zRGVjbFswXSA9IG51bGw7Ci0gICAgICBuc0RlY2xbMV0gPSBzQ29weTsKLSAgICB9Ci0gICAgcmV0dXJuIG5zRGVjbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwveHNkL1dTRExQYXJ0c1RvWFNEVHlwZU1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwveHNkL1dTRExQYXJ0c1RvWFNEVHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2YzZDdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3hzZC9XU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIKLXsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIFBPVU5EID0gJyMnOwotICBwcml2YXRlIFZlY3RvciB4c2RTY2hlbWFMaXN0XzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcGFydFRvWFNEQ2FjaGVfOwotCi0gIHB1YmxpYyBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKSB7Ci0gICAgeHNkU2NoZW1hTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgcGFydFRvWFNEQ2FjaGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2NoZW1hcyhWZWN0b3Igc2NoZW1hTGlzdCkgewotICAgIGZvciAoaW50IGk9MDtpPHNjaGVtYUxpc3Quc2l6ZSgpO2krKykgewotICAgICAgT2JqZWN0IHNjaGVtYSA9IHNjaGVtYUxpc3QuZWxlbWVudEF0KGkpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICB4c2RTY2hlbWFMaXN0Xy5hZGRFbGVtZW50KHNjaGVtYSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRE5hbWVkQ29tcG9uZW50IGdldFhTRFR5cGUoUGFydCBwYXJ0LCBTdHJpbmcgaWQpIHsKLSAgICBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRYU0RUeXBlRnJvbUNhY2hlKGlkKTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICByZXR1cm4gY29tcG9uZW50OwotICAgIGNvbXBvbmVudCA9IGdldFhTRFR5cGVGcm9tU2NoZW1hKHBhcnQpOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgIGFkZFRvQ2FjaGUoaWQsIGNvbXBvbmVudCk7Ci0gICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgfQotCi0gIHB1YmxpYyBYU0ROYW1lZENvbXBvbmVudCBnZXRYU0RUeXBlRnJvbUNhY2hlKFN0cmluZyBpZCkgewotICAgIHJldHVybiAoWFNETmFtZWRDb21wb25lbnQpcGFydFRvWFNEQ2FjaGVfLmdldChpZCk7Ci0gIH0KLQotICBwdWJsaWMgWFNETmFtZWRDb21wb25lbnQgZ2V0WFNEVHlwZUZyb21TY2hlbWEoUGFydCBwYXJ0KSB7Ci0gICAgYm9vbGVhbiBpc0VsZW1lbnREZWNsYXJhdGlvbiA9IChwYXJ0LmdldFR5cGVOYW1lKCkgPT0gbnVsbCk7Ci0gICAgUU5hbWUgcU5hbWUgPSBpc0VsZW1lbnREZWNsYXJhdGlvbiA/IHBhcnQuZ2V0RWxlbWVudE5hbWUoKSA6IHBhcnQuZ2V0VHlwZU5hbWUoKTsKLSAgICByZXR1cm4gZ2V0WFNEVHlwZUZyb21TY2hlbWEocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lLmdldExvY2FsUGFydCgpLCBpc0VsZW1lbnREZWNsYXJhdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgWFNETmFtZWRDb21wb25lbnQgZ2V0WFNEVHlwZUZyb21TY2hlbWEoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgYm9vbGVhbiBpc0VsZW1lbnREZWNsYXJhdGlvbikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkU2NoZW1hTGlzdF8uc2l6ZSgpOyBpKyspIHsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKXhzZFNjaGVtYUxpc3RfLmVsZW1lbnRBdChpKTsKLSAgICAgIFZlY3RvciBjb21wb25lbnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgaWYgKGlzRWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICBjb21wb25lbnRzLmFkZEFsbCh4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgY29tcG9uZW50cy5hZGRBbGwoeHNkU2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCAgPSAoWFNETmFtZWRDb21wb25lbnQpaXQubmV4dCgpOwotICAgICAgICBTdHJpbmcgY29tcE5TVVJJID0gY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBTdHJpbmcgY29tcExvY2FsbmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChjb21wTlNVUkkgIT0gbnVsbCAmJiBjb21wTG9jYWxuYW1lICE9IG51bGwgJiYgY29tcE5TVVJJLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmIGNvbXBMb2NhbG5hbWUuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgWFNETmFtZWRDb21wb25lbnQgcmVzb2x2ZVhTRE5hbWVkQ29tcG9uZW50KFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXJpID0gY29tcG9uZW50LmdldFVSSSgpOwotICAgICAgU3RyaW5nIHFuYW1lID0gY29tcG9uZW50LmdldFFOYW1lKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhzZFNjaGVtYUxpc3RfLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSl4c2RTY2hlbWFMaXN0Xy5lbGVtZW50QXQoaSk7Ci0gICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0YXJnZXROUyA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICBpZiAodGFyZ2V0TlMgIT0gbnVsbCAmJiB0YXJnZXROUy5lcXVhbHModHJpbVFOYW1lKHVyaSwgcW5hbWUpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0ROYW1lZENvbXBvbmVudCByZXNvbHZlZENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICAgIHJlc29sdmVkQ29tcG9uZW50ID0geHNkU2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbihxbmFtZSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgICAgICAgIHJlc29sdmVkQ29tcG9uZW50ID0geHNkU2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24ocW5hbWUpOwotICAgICAgICAgICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgICAgICAgIHJlc29sdmVkQ29tcG9uZW50ID0geHNkU2NoZW1hLnJlc29sdmVNb2RlbEdyb3VwRGVmaW5pdGlvbihxbmFtZSk7Ci0gICAgICAgICAgICBpZiAoaXNDb21wb25lbnRSZXNvbHZhYmxlKHJlc29sdmVkQ29tcG9uZW50KSkKLSAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkQ29tcG9uZW50OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHRyaW1RTmFtZShTdHJpbmcgdXJpLCBTdHJpbmcgcW5hbWUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihxbmFtZSk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZyBucyA9IHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgaWYgKG5zLmNoYXJBdChpbmRleC0xKSA9PSBQT1VORCkKLSAgICAgICAgcmV0dXJuIG5zLnN1YnN0cmluZygwLCBpbmRleC0xKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5zOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZFRvQ2FjaGUoU3RyaW5nIGlkLCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQpIHsKLSAgICBwYXJ0VG9YU0RDYWNoZV8ucHV0KGlkLGNvbXBvbmVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBvbmVudFJlc29sdmFibGUoWFNEQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gY29tcG9uZW50LmdldFNjaGVtYSgpOwotICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRCdXNpbmVzc1RvRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MjQ1OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRCdXNpbmVzc1RvRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc01vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsVWRkaUJ1c2luZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBBZGRUb0Zhdm9yaXRlc0FjdGlvbgotewotICBwdWJsaWMgQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV3NpbEVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gKFdzaWxFbGVtZW50KSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBPYmplY3Qgb2JqID0gc2VsZWN0ZWRFbGVtZW50LmdldEFsbFVERElMaW5rcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCkuZ2V0T2JqZWN0KCk7Ci0gICAgV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgPSAoV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQpIG9iajsKLSAgICBTdHJpbmcgYnVzaW5lc3NOYW1lID0gd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0VURESUxpbmtJbnF1aXJ5QVBJKCk7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0VURESUxpbmtCdXNpbmVzc0tleSgpOwotICAgIGlmIChidXNpbmVzc05hbWUgPT0gbnVsbCkKLSAgICAgIGJ1c2luZXNzTmFtZSA9IGJ1c2luZXNzS2V5OwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX05BTUUsIGJ1c2luZXNzTmFtZSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19JTlFVSVJZX0FQSSwgaW5xdWlyeUFQSSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19LRVksIGJ1c2luZXNzS2V5KTsKLSAgICByZXR1cm4gZmF2b3JpdGVFeGlzdHModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKzFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoLTFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8sIFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUywgQWN0aW9uSW5wdXRzLlZJRVdJRCwgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5VRERJX0JVU0lORVNTKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpbnQgdmlld0lEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdJRCkpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV3NpbEVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gKFdzaWxFbGVtZW50KSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBPYmplY3Qgb2JqID0gc2VsZWN0ZWRFbGVtZW50LmdldEFsbFVERElMaW5rcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCkuZ2V0T2JqZWN0KCk7Ci0gICAgV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgPSAoV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQpIG9iajsKLSAgICBTdHJpbmcgYnVzaW5lc3NOYW1lID0gd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0VURESUxpbmtJbnF1aXJ5QVBJKCk7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0VURESUxpbmtCdXNpbmVzc0tleSgpOwotICAgIGlmIChidXNpbmVzc05hbWUgPT0gbnVsbCkKLSAgICAgIGJ1c2luZXNzTmFtZSA9IGJ1c2luZXNzS2V5OwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX05BTUUsIGJ1c2luZXNzTmFtZSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19JTlFVSVJZX0FQSSwgaW5xdWlyeUFQSSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19LRVksIGJ1c2luZXNzS2V5KTsKLSAgICBpZiAoaXNNdWx0aXBsZUxpbmtBY3Rpb24oKSAmJiBmYXZvcml0ZUV4aXN0cyh0YWJsZSwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfQlVTSU5FU1NfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTIiwgYnVzaW5lc3NOYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChhZGRUb0Zhdm9yaXRlcyh0YWJsZSwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfQlVTSU5FU1NfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUwiLCBidXNpbmVzc05hbWUpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTIiwgYnVzaW5lc3NOYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjYyYjgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5SZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsVWRkaUJ1c2luZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIEFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotewotICBwdWJsaWMgQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKzFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoLTFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8sIFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUywgQWN0aW9uSW5wdXRzLlZJRVdJRCwgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5VRERJX0JVU0lORVNTKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpbnQgdmlld0lEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdJRCkpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IG51bGw7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gbnVsbDsKLSAgICBTdHJpbmcgYnVzaW5lc3NOYW1lID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpCi0gICAgewotICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFVERElMaW5rcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCk7Ci0gICAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCB3c2lsVWRkaUJ1c2luZXNzRWxlbWVudCA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCkgbGUuZ2V0T2JqZWN0KCk7Ci0gICAgICBpbnF1aXJ5VVJMID0gd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0VURESUxpbmtJbnF1aXJ5QVBJKCk7Ci0gICAgICBidXNpbmVzc0tleSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldFVERElMaW5rQnVzaW5lc3NLZXkoKTsKLSAgICAgIGJ1c2luZXNzTmFtZSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldE5hbWUoKTsKLSAgICAgIGlmIChidXNpbmVzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgYnVzaW5lc3NOYW1lID0gYnVzaW5lc3NLZXk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvLyByZXR1cm4gZmFsc2UgaWYgdW5hYmxlIHRvIGZpbmQgb3IgY3JlYXRlIGEgcmVnaXN0cnkgbm9kZS9lbGVtZW50IGluIHRoZQotICAgIC8vIFVEREkgcGVyc3BlY3RpdmUKLSAgICBpZiAoIWNyZWF0ZVJlZ2lzdHJ5SW5VRERJUGVyc3BlY3RpdmUoaW5xdWlyeVVSTCwgbnVsbCwgaW5xdWlyeVVSTCkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRSIsIGJ1c2luZXNzTmFtZSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBwcmVwYXJlIHRoZSBhY3Rpb24KLSAgICBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAvLyBwb3B1bGF0ZSBwcm9wZXJ0eSB0YWJsZQotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLCBidXNpbmVzc0tleSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLCBidXNpbmVzc05hbWUpOwotICAgIC8vIHJ1biB0aGUgYWN0aW9uCi0gICAgaWYgKCFhY3Rpb24ucnVuKCkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQiLCBidXNpbmVzc05hbWUpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMIiwgYnVzaW5lc3NOYW1lKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZkOTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc01vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsVWRkaVNlcnZpY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC50cmFuc2Zvcm1lci5XU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgQWRkVG9GYXZvcml0ZXNBY3Rpb24KLXsKLSAgcHVibGljIEFkZFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV3NpbEVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gKFdzaWxFbGVtZW50KSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBPYmplY3Qgb2JqID0gc2VsZWN0ZWRFbGVtZW50LmdldEFsbFVERElTZXJ2aWNlcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCkuZ2V0T2JqZWN0KCk7Ci0gICAgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCB3c2lsVWRkaVNlcnZpY2VFbGVtZW50ID0gKFdzaWxVZGRpU2VydmljZUVsZW1lbnQpIG9iajsKLSAgICBTdHJpbmcgc2VydmljZU5hbWUgPSB3c2lsVWRkaVNlcnZpY2VFbGVtZW50LmdldE5hbWUoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IHdzaWxVZGRpU2VydmljZUVsZW1lbnQuZ2V0VURESVNlcnZpY2VJbnF1aXJ5QVBJKCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSB3c2lsVWRkaVNlcnZpY2VFbGVtZW50LmdldFVERElTZXJ2aWNlS2V5KCk7Ci0gICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpCi0gICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VLZXk7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9OQU1FLCBzZXJ2aWNlTmFtZSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOUVVJUllfQVBJLCBpbnF1aXJ5QVBJKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfS0VZLCBzZXJ2aWNlS2V5KTsKLSAgICByZXR1cm4gZmF2b3JpdGVFeGlzdHModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfRk9MREVSX05PREUpOwotICB9Ci0KLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICBJVHJhbnNmb3JtZXJbXSBwYXJlbnRUcmFuc2Zvcm1lcnMgPSBzdXBlci5nZXRUcmFuc2Zvcm1lcnMoKTsKLSAgICBJVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMgPSBuZXcgSVRyYW5zZm9ybWVyW3BhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgrMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRUcmFuc2Zvcm1lcnMsIDAsIHRyYW5zZm9ybWVycywgMCwgcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCk7Ci0gICAgdHJhbnNmb3JtZXJzW3RyYW5zZm9ybWVycy5sZW5ndGgtMV0gPSBuZXcgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcihjb250cm9sbGVyXywgV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX1NFUlZJQ0VTLCBBY3Rpb25JbnB1dHMuVklFV0lELCBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLlVERElfU0VSVklDRSk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFdzaWxFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChXc2lsRWxlbWVudCkgc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgT2JqZWN0IG9iaiA9IHNlbGVjdGVkRWxlbWVudC5nZXRBbGxVRERJU2VydmljZXMoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpLmdldE9iamVjdCgpOwotICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgd3NpbFVkZGlTZXJ2aWNlRWxlbWVudCA9IChXc2lsVWRkaVNlcnZpY2VFbGVtZW50KSBvYmo7Ci0gICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gd3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIGlucXVpcnlBUEkgPSB3c2lsVWRkaVNlcnZpY2VFbGVtZW50LmdldFVERElTZXJ2aWNlSW5xdWlyeUFQSSgpOwotICAgIFN0cmluZyBzZXJ2aWNlS2V5ID0gd3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5nZXRVRERJU2VydmljZUtleSgpOwotICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKQotICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlS2V5OwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfTkFNRSwgc2VydmljZU5hbWUpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlFVSVJZX0FQSSwgaW5xdWlyeUFQSSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0tFWSwgc2VydmljZUtleSk7Ci0gICAgaWYgKGlzTXVsdGlwbGVMaW5rQWN0aW9uKCkgJiYgZmF2b3JpdGVFeGlzdHModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTIiwgc2VydmljZU5hbWUpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGFkZFRvRmF2b3JpdGVzKHRhYmxlLCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFKSkKLSAgICB7Ci0gICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMIiwgc2VydmljZU5hbWUpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTIiwgc2VydmljZU5hbWUpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzdlYWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbE1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFVkZGlTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIEFkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCsxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyYW5zZm9ybWVycywgMCwgdHJhbnNmb3JtZXJzLCAwLCBwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKTsKLSAgICB0cmFuc2Zvcm1lcnNbdHJhbnNmb3JtZXJzLmxlbmd0aC0xXSA9IG5ldyBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfLCBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfU0VSVklDRVMsIEFjdGlvbklucHV0cy5WSUVXSUQsIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuVURESV9TRVJWSUNFKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpbnQgdmlld0lEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdJRCkpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IG51bGw7Ci0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSBudWxsOwotICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IGxlID0gKChXc2lsRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxVRERJU2VydmljZXMoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpOwotICAgICAgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCB3c2lsVWRkaVNlcnZpY2VFbGVtZW50ID0gKFdzaWxVZGRpU2VydmljZUVsZW1lbnQpIGxlLmdldE9iamVjdCgpOwotICAgICAgaW5xdWlyeVVSTCA9IHdzaWxVZGRpU2VydmljZUVsZW1lbnQuZ2V0VURESVNlcnZpY2VJbnF1aXJ5QVBJKCk7Ci0gICAgICBzZXJ2aWNlS2V5ID0gd3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5nZXRVRERJU2VydmljZUtleSgpOwotICAgICAgc2VydmljZU5hbWUgPSB3c2lsVWRkaVNlcnZpY2VFbGVtZW50LmdldE5hbWUoKTsKLSAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKQotICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VLZXk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvLyByZXR1cm4gZmFsc2UgaWYgdW5hYmxlIHRvIGZpbmQgb3IgY3JlYXRlIGEgcmVnaXN0cnkgbm9kZS9lbGVtZW50IGluIHRoZQotICAgIC8vIFVEREkgcGVyc3BlY3RpdmUKLSAgICBpZiAoIWNyZWF0ZVJlZ2lzdHJ5SW5VRERJUGVyc3BlY3RpdmUoaW5xdWlyeVVSTCwgbnVsbCwgaW5xdWlyeVVSTCkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRSIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIHByZXBhcmUgdGhlIGFjdGlvbgotICAgIFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAvLyBwb3B1bGF0ZSBwcm9wZXJ0eSB0YWJsZQotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVksIHNlcnZpY2VLZXkpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSwgc2VydmljZU5hbWUpOwotICAgIC8vIHJ1biB0aGUgYWN0aW9uCi0gICAgaWYgKCFhY3Rpb24ucnVuKCkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORCIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQUREX1RPX1VERElfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTCIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkVG9GYXZvcml0ZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkVG9GYXZvcml0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1ODgyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFRvRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0VURESUJ1c2luZXNzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0VURESVNlcnZpY2VzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0V1NETFNlcnZpY2VzVG9vbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFRvRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgTXVsdGlwbGVMaW5rQWN0aW9uIHsKLSAgICBwcm90ZWN0ZWQgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotCi0gICAgcHVibGljIEFkZFRvRmF2b3JpdGVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgICAgICBub2RlTWFuYWdlcl8gPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NpbC9hY3Rpb25zL1dzaWxDaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlQWN0aW9uTGluaygpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL2FjdGlvbnMvV3NpbENoZWNrRmF2b3JpdGVFeGlzdHNBY3Rpb25KU1AuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEFkZFRvRmF2b3JpdGVzQWN0aW9uIG5ld0FjdGlvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICBTdHJpbmcgbm9kZUlEID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRCkpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICBpZiAoc2VsZWN0ZWRUb29sIGluc3RhbmNlb2YgTGlzdFdTRExTZXJ2aWNlc1Rvb2wpCi0gICAgICAgIHJldHVybiBuZXcgQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJU2VydmljZXNUb29sKQotICAgICAgICByZXR1cm4gbmV3IEFkZFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJQnVzaW5lc3NUb29sKQotICAgICAgICByZXR1cm4gbmV3IEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFkZFRvRmF2b3JpdGVzKEhhc2h0YWJsZSB0YWJsZSwgU3RyaW5nIHJlbCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIGZhdk5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgVHJlZUVsZW1lbnQgZmF2Um9vdEVsZW1lbnQgPSBmYXZOb2RlTWFuYWdlci5nZXRSb290Tm9kZSgpLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBmYXZSb290RWxlbWVudC5nZXRFbGVtZW50cyhyZWwpOwotICAgICAgICBpZiAoIWUuaGFzTW9yZUVsZW1lbnRzKCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBmYXZGb2xkZXJFbGVtZW50ID0gKEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICByZXR1cm4gZmF2Rm9sZGVyRWxlbWVudC5hZGRGYXZvcml0ZSh0YWJsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlLCBTdHJpbmcgcmVsKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgZmF2Tm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBUcmVlRWxlbWVudCBmYXZSb290RWxlbWVudCA9IGZhdk5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGZhdlJvb3RFbGVtZW50LmdldEVsZW1lbnRzKHJlbCk7Ci0gICAgICAgIGlmICghZS5oYXNNb3JlRWxlbWVudHMoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IGZhdkZvbGRlckVsZW1lbnQgPSAoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIHJldHVybiBmYXZGb2xkZXJFbGVtZW50LmZhdm9yaXRlRXhpc3RzKHRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDZmZWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuT3BlblJlZ2lzdHJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUmVnaXN0cnlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElNYWluTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuTGlzdFVERElCdXNpbmVzc1Rvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuTGlzdFVERElTZXJ2aWNlc1Rvb2w7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIE11bHRpcGxlTGlua0FjdGlvbgotewotICBwdWJsaWMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElEKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2lsL2FjdGlvbnMvV3NpbEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHRvb2xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZUFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsL2FjdGlvbnMvV3NpbEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEFjdGlvbiBuZXdBY3Rpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIFN0cmluZyBub2RlSUQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBUb29sIHNlbGVjdGVkVG9vbCA9IG5vZGVNYW5hZ2VyLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQpKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkKLSAgICAgIHJldHVybiBuZXcgQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJQnVzaW5lc3NUb29sKQotICAgICAgcmV0dXJuIG5ldyBBZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgTnVsbEFjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlUmVnaXN0cnlJblVERElQZXJzcGVjdGl2ZShTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIHB1Ymxpc2hBUEksIFN0cmluZyByZWdpc3RyeU5hbWUpCi0gIHsKLSAgICBWZWN0b3IgcmVnaXN0cnlOb2RlcyA9IGdldFJlZ2lzdHJ5Tm9kZXNCeUlucXVpcnlVUkwoaW5xdWlyeUFQSSk7Ci0gICAgaWYgKHJlZ2lzdHJ5Tm9kZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBBbHdheXMgYXR0ZW1wdCB0byB1c2UgYW4gZXhpc3RpbmcgcmVnaXN0cnkuCi0gICAgICBOb2RlIHJlZ2lzdHJ5Tm9kZSA9IChOb2RlKSByZWdpc3RyeU5vZGVzLmVsZW1lbnRBdCgwKTsKLSAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gcmVnaXN0cnlOb2RlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChyZWdpc3RyeU5vZGUuZ2V0Tm9kZUlkKCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIC8vIG9wZW4gdGhlIHJlZ2lzdHJ5IGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9wZW5lZCBpbiB0aGUgVURESSBwZXJzcGVjdGl2ZQotICAgIE9wZW5SZWdpc3RyeUFjdGlvbiBvcGVuUmVnQWN0aW9uID0gbmV3IE9wZW5SZWdpc3RyeUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgLy8gcG9wdWxhdGUgdGhlIHByb3BlcnR5IHRhYmxlCi0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuUmVnQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHJlZ2lzdHJ5TmFtZSkpCi0gICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUsIHJlZ2lzdHJ5TmFtZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwoaW5xdWlyeUFQSSkpCi0gICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMLCBpbnF1aXJ5QVBJKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8gcnVuIHRoZSBhY3Rpb24KLSAgICBpZiAoIW9wZW5SZWdBY3Rpb24ucnVuKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgVmVjdG9yIGdldFJlZ2lzdHJ5Tm9kZXNCeUlucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgICBWZWN0b3IgcmVnaXN0cnlOb2RlcyA9IG51bGw7Ci0gICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSkgKG5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKSk7Ci0gICAgVmVjdG9yIGNoaWxkTm9kZXMgPSB1ZGRpTWFpbk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkTm9kZSA9IChOb2RlKSBjaGlsZE5vZGVzLmVsZW1lbnRBdChpKTsKLSAgICAgIGlmIChjaGlsZE5vZGUgaW5zdGFuY2VvZiBSZWdpc3RyeU5vZGUpCi0gICAgICB7Ci0gICAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCkgY2hpbGROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgIGlmIChyZWdFbGVtZW50LmdldElucXVpcnlVUkwoKS5lcXVhbHMoaW5xdWlyeVVSTCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocmVnaXN0cnlOb2RlcyA9PSBudWxsKQotICAgICAgICAgICAgcmVnaXN0cnlOb2RlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICByZWdpc3RyeU5vZGVzLmFkZEVsZW1lbnQoY2hpbGROb2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVnaXN0cnlOb2RlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5Y2ZlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLldzaWxNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxXc2RsU2VydmljZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnRyYW5zZm9ybWVyLldTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgQWRkVG9GYXZvcml0ZXNBY3Rpb24KLXsKLSAgcHVibGljIEFkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cygpCi0gIHsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IGdldFdzZGxVcmwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfV1NETF9VUkwsIHdzZGxVUkwpOwotICAgIHJldHVybiBmYXZvcml0ZUV4aXN0cyh0YWJsZSwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9GT0xERVJfTk9ERSk7Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCsxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyYW5zZm9ybWVycywgMCwgdHJhbnNmb3JtZXJzLCAwLCBwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKTsKLSAgICB0cmFuc2Zvcm1lcnNbdHJhbnNmb3JtZXJzLmxlbmd0aC0xXSA9IG5ldyBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfLCBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMsIEFjdGlvbklucHV0cy5WSUVXSUQsIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuV1NETF9TRVJWSUNFKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIFN0cmluZyB3c2RsVVJMID0gZ2V0V3NkbFVybCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9XU0RMX1VSTCwgd3NkbFVSTCk7Ci0gICAgaWYgKGlzTXVsdGlwbGVMaW5rQWN0aW9uKCkgJiYgZmF2b3JpdGVFeGlzdHModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTIiwgd3NkbFVSTCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoYWRkVG9GYXZvcml0ZXModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUwiLCB3c2RsVVJMKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUyIsIHdzZGxVUkwpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRXc2RsVXJsKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV3NpbEVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gKFdzaWxFbGVtZW50KSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBXc2lsV3NkbFNlcnZpY2VFbGVtZW50IHdzaWxXc2RsU2VydmljZUVsZW1lbnQ7Ci0gICAgT2JqZWN0IG9iaiA9IHNlbGVjdGVkRWxlbWVudC5nZXRBbGxXU0RMU2VydmljZXMoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpLmdldE9iamVjdCgpOwotICAgIHdzaWxXc2RsU2VydmljZUVsZW1lbnQgPSAoV3NpbFdzZGxTZXJ2aWNlRWxlbWVudCkgb2JqOwotICAgIHJldHVybiB3c2lsV3NkbFNlcnZpY2VFbGVtZW50LmdldFdTRExTZXJ2aWNlVVJMKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFdTSUxUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWJlOTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc01vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0lMVG9GYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBBZGRUb0Zhdm9yaXRlc0FjdGlvbgotewotICBwdWJsaWMgQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoKQotICB7Ci0gICAgU3RyaW5nIHdzaWxVUkwgPSBnZXRXc2lsVXJsKCk7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1dTSUxfVVJMLCB3c2lsVVJMKTsKLSAgICByZXR1cm4gZmF2b3JpdGVFeGlzdHModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBTdHJpbmcgd3NpbFVSTCA9IGdldFdzaWxVcmwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfV1NJTF9VUkwsIHdzaWxVUkwpOwotICAgIGlmIChpc011bHRpcGxlTGlua0FjdGlvbigpICYmIGZhdm9yaXRlRXhpc3RzKHRhYmxlLCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NJTF9GT0xERVJfTk9ERSkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFMiLCB3c2lsVVJMKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChhZGRUb0Zhdm9yaXRlcyh0YWJsZSwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUwiLCB3c2lsVVJMKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUyIsIHdzaWxVUkwpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRXc2lsVXJsKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFdzaWxFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChXc2lsRWxlbWVudCkgc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudC5nZXRXc2lsVXJsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0NsZWFyV1NJTEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzg5YzAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5DbGVhck5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhcldTSUxBY3Rpb24gZXh0ZW5kcyBDbGVhck5vZGVBY3Rpb24gewotCi0gICAgcHVibGljIENsZWFyV1NJTEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gICAgewotICAgICAgICBzdXBlcihjb250cm9sbGVyLCBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkpOwotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgU3RyaW5nLnZhbHVlT2YoY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZUlkKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzaWwvYWN0aW9ucy9DbGVhcldTSUxBY3Rpb25KU1AuanNwPyIpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gIndzaWxOYXZpZ2F0b3JDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbFByb3BlcnRpZXNDb250YWluZXIiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gIndzaWxTdGF0dXNDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gIndzaWwvd3NpbF9zdGF0dXNfY29udGVudC5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0ltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQwZmZiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0ltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLldTRExGaWxlTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFVkZGlTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFdzZGxTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0VURESVNlcnZpY2VzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0V1NETFNlcnZpY2VzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotCi1wdWJsaWMgY2xhc3MgSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmXzsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZpbGVOYW1lXzsKLSAgcHJpdmF0ZSBOb2RlTWFuYWdlciBub2RlTWFuYWdlcl87Ci0KLSAgcHVibGljIEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgbm9kZU1hbmFnZXJfID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkLCBpbnQgdG9vbElkLCBpbnQgdmlld0lkLCBpbnQgdmlld1Rvb2xJZCkKLSAgewotICAgIHJldHVybiBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsIHRvb2xJZCwgdmlld0lkLCB2aWV3VG9vbElkLCAid3NpbC9hY3Rpb25zL0ltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB3cml0ZShPdXRwdXRTdHJlYW0gb3MpCi0gIHsKLSAgICBpZiAoZGVmXyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB3cml0ZVdTRExEZWZpbml0aW9uKG9zLCBkZWZfKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRGaWxlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbEZpbGVOYW1lXzsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBnZXRXU0RMRnJvbVVSTCgpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdJRCkpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlEKTsKLSAgICBXc2lsRWxlbWVudCB3c2lsRWxlbWVudCA9IChXc2lsRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBMaXN0TWFuYWdlciB3c2lsU2VydmljZXMgPSB3c2lsRWxlbWVudC5nZXRBbGxXU0RMU2VydmljZXMoKTsKLSAgICBMaXN0RWxlbWVudCBsZSA9IHdzaWxTZXJ2aWNlcy5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpOwotICAgIFdzaWxXc2RsU2VydmljZUVsZW1lbnQgc2VydmljZSA9IChXc2lsV3NkbFNlcnZpY2VFbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgIFN0cmluZyB3c2RsVVJMID0gc2VydmljZS5nZXRXU0RMU2VydmljZVVSTCgpOwotICAgIHdzZGxGaWxlTmFtZV8gPSBXU0RMRmlsZU5hbWVIZWxwZXIuZ2V0V1NETEZpbGVOYW1lKHdzZGxVUkwpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZl8gPSAobmV3IFVkZGk0akhlbHBlcigpKS5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZ2V0V1NETEZyb21VRERJUmVnaXN0cnkoKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIGludCB2aWV3SUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgTGlzdE1hbmFnZXIgd3NpbFNlcnZpY2VzID0gd3NpbEVsZW1lbnQuZ2V0QWxsVURESVNlcnZpY2VzKCk7Ci0gICAgTGlzdEVsZW1lbnQgbGUgPSB3c2lsU2VydmljZXMuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICBXc2lsVWRkaVNlcnZpY2VFbGVtZW50IHNlcnZpY2UgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgd3NkbEZpbGVOYW1lXyA9IHNlcnZpY2UuZ2V0TmFtZSgpICsgIi53c2RsIjsKLSAgICBVZGRpNGpIZWxwZXIgdWRkaTRqSGVscGVyID0gbmV3IFVkZGk0akhlbHBlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IG51bGw7Ci0gICAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IHNlcnZpY2UuZ2V0VURESVNlcnZpY2VJbnF1aXJ5QVBJKCk7Ci0gICAgICBpZiAoaW5xdWlyeVVSTCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm94eSA9IG5ldyBVRERJUHJveHkoKTsKLSAgICAgICAgcHJveHkuc2V0SW5xdWlyeVVSTChpbnF1aXJ5VVJMKTsKLSAgICAgIH0KLSAgICAgIGRlZl8gPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24odWRkaTRqSGVscGVyLmdldFdTREwoc2VydmljZS5nZXRTZXJ2aWNlRGVmaW5pdGlvbigpLCBwcm94eSkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gdGhlIHdzZGwgcmVwcmVzZW50aW5nIHRoaXMgc2VydmljZSBpcyB1bnJlYWNoYWJsZSB0aHJvdWdoIHRoZSBVRERJCi0gICAgICAvLyByZWdpc3RyeS4gV2Ugd2lsbCB0cnkgdXNpbmcgdGhlIGRpc2NvdmVyeSBVUkwgaW5zdGVhZC4KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWZfID0gdWRkaTRqSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHNlcnZpY2UuZ2V0VURESVNlcnZpY2VEaXNjb3ZlcnlVUkwoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMikKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIC8vIGlmIHRoZSBkaXNjb3ZlcnlVUkwgYWxzbyBmYWlscywgcmV0dXJuIGFuIGVycm9yCi0gICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVG9vbCBzZWxlY3RlZFRvb2wgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICBpZiAoc2VsZWN0ZWRUb29sIGluc3RhbmNlb2YgTGlzdFdTRExTZXJ2aWNlc1Rvb2wpCi0gICAgICByZXR1cm4gZ2V0V1NETEZyb21VUkwoKTsKLSAgICBlbHNlIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkKLSAgICAgIHJldHVybiBnZXRXU0RMRnJvbVVERElSZWdpc3RyeSgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvSW1wb3J0V1NJTFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMzVjMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gewotICAgIHByaXZhdGUgV1NJTERvY3VtZW50IHdzaWxEb2NfOwotICAgIHByaXZhdGUgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnRfOwotICAgIHByaXZhdGUgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotCi0gICAgcHVibGljIEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgICAgICBub2RlTWFuYWdlcl8gPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkLGludCB0b29sSWQsaW50IHZpZXdJZCxpbnQgdmlld1Rvb2xJZCkKLSAgICB7Ci0gICAgICByZXR1cm4gSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCwid3NpbC9hY3Rpb25zL0ltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gd3JpdGUoT3V0cHV0U3RyZWFtIG9zKSB7Ci0gICAgICAgIGlmICh3c2lsRG9jXyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3JpdGVXU0lMRG9jdW1lbnQob3MsIHdzaWxEb2NfKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVOYW1lKCkgewotICAgICAgICBTdHJpbmcgd3NpbEZpbGVOYW1lID0gd3NpbEVsZW1lbnRfLmdldFdzaWxVcmwoKTsKLSAgICAgICAgcmV0dXJuIHdzaWxGaWxlTmFtZS5zdWJzdHJpbmcod3NpbEZpbGVOYW1lLmxhc3RJbmRleE9mKCcvJykgKyAxLCB3c2lsRmlsZU5hbWUubGVuZ3RoKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICAgICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotCi0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlEKTsKLSAgICAgICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICAgICAgICAgd3NpbEVsZW1lbnRfID0gKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICAgICAgICAgIHdzaWxEb2NfID0gKChXc2lsRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldFdTSUxEb2N1bWVudCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICAgIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9NdWx0aXBsZUxpbmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvTXVsdGlwbGVMaW5rQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZTA1NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9NdWx0aXBsZUxpbmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLldzaWxBY3Rpb25JbnB1dHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aXBsZUxpbmtBY3Rpb24gZXh0ZW5kcyBMaW5rQWN0aW9uCi17Ci0gIHB1YmxpYyBNdWx0aXBsZUxpbmtBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgaXNNdWx0aXBsZUxpbmtBY3Rpb24gPSByZXF1ZXN0LmdldFBhcmFtZXRlcihXc2lsQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OKTsKLSAgICBpZiAoaXNNdWx0aXBsZUxpbmtBY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV3NpbEFjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiwgaXNNdWx0aXBsZUxpbmtBY3Rpb24pOwotICAgICAgcmV0dXJuIHByb2Nlc3NNdWx0aXBsZUxpbmtBY3Rpb25QYXJhbWV0ZXJzKHJlcXVlc3QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucmVtb3ZlKFdzaWxBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04pOwotICAgICAgU3RyaW5nIG5vZGVJRFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgU3RyaW5nIHRvb2xJRFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgICAgU3RyaW5nIHZpZXdJRFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgICAgU3RyaW5nIHZpZXdUb29sSURTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgICBpZiAobm9kZUlEU3RyaW5nICE9IG51bGwpCi0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBub2RlSURTdHJpbmcpOwotICAgICAgaWYgKHRvb2xJRFN0cmluZyAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlRPT0xJRCwgdG9vbElEU3RyaW5nKTsKLSAgICAgIGlmICh2aWV3SURTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsIHZpZXdJRFN0cmluZyk7Ci0gICAgICBpZiAodmlld1Rvb2xJRFN0cmluZyAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQsIHZpZXdUb29sSURTdHJpbmcpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc011bHRpcGxlTGlua0FjdGlvblBhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgbm9kZUlEID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgU3RyaW5nW10gdmlld0lEcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBub2RlSUQpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVklFV0lELCB2aWV3SURzKTsKLSAgICBpZiAodmlld0lEcy5sZW5ndGggPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNdWx0aXBsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHByb3BlcnR5VGFibGVfLmNvbnRhaW5zS2V5KFdzaWxBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Vmlld0lkcygpCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIGVsc2UgaWYgKG9iamVjdC5nZXRDbGFzcygpLmlzQXJyYXkoKSkKLSAgICAgIHJldHVybiAoU3RyaW5nW10pb2JqZWN0OwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyhTdHJpbmcpb2JqZWN0fTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gKGlzTXVsdGlwbGVMaW5rQWN0aW9uKCkpID8gZXhlY3V0ZU11bHRpcGxlTGlua0FjdGlvbigpIDogZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVNdWx0aXBsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBTdHJpbmdbXSB2aWV3SWRzID0gZ2V0Vmlld0lkcygpOwotICAgIGlmICh2aWV3SWRzICE9IG51bGwgJiYgdmlld0lkcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlld0lkcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsIHZpZXdJZHNbaV0pOwotICAgICAgICBpZiAoZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKSkKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdJRCwgdmlld0lkcyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL051bGxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvTnVsbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzgyOTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvTnVsbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkFjdGlvbjsKLQotcHVibGljIGNsYXNzIE51bGxBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHVibGljIE51bGxBY3Rpb24oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9PcGVuV1NJTEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9PcGVuV1NJTEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2EzNjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvT3BlbldTSUxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLldTSUxEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5Gb3JtQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuV1NJTEFjdGlvbiBleHRlbmRzIEZvcm1BY3Rpb24KLXsKLQotICBwdWJsaWMgT3BlbldTSUxBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHdzaWxVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9VUkwpOwotICAgIFN0cmluZyBpbnNwZWN0aW9uVHlwZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV3NpbEFjdGlvbklucHV0cy5XU0lMX0lOU1BFQ1RJT05fVFlQRSk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9VUkwsIHdzaWxVUkwpOwotICAgIGlmIChpbnNwZWN0aW9uVHlwZSAhPSBudWxsICYmIGluc3BlY3Rpb25UeXBlLmxlbmd0aCgpID4gMCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChXc2lsQWN0aW9uSW5wdXRzLldTSUxfSU5TUEVDVElPTl9UWVBFLCBpbnNwZWN0aW9uVHlwZSk7Ci0gICAgZm9ybVRvb2wudXBkYXRlUHJvcGVydHlUYWJsZShwcm9wZXJ0eVRhYmxlXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpCi0gIHsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgcmV0dXJuIChGb3JtVG9vbCl3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFN0cmluZyB3c2lsVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV3NpbEFjdGlvbklucHV0cy5XU0lMX1VSTCk7Ci0gICAgaW50IGluc3BlY3Rpb25UeXBlID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChXc2lsQWN0aW9uSW5wdXRzLldTSUxfSU5TUEVDVElPTl9UWVBFKSk7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtc2dRdWV1ZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgcm9vdE5vZGUgPSBub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHJvb3QgPSByb290Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdzaWxFbGVtZW50IHdzaWxFbGVtZW50ID0gZ2V0T3BlbmVkV1NJTChyb290LCB3c2lsVVJMKTsKLSAgICBpZiAod3NpbEVsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlc1BhcnNlckV4dCBwYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQod3NpbFVSTCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX05PTkUpOwotICAgICAgICBXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5ID0gcGFyc2VyLmdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c2lsVVJMKTsKLSAgICAgICAgaW50IHR5cGUgPSB3c0VudGl0eS5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlID09IFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9IVE1MKQotICAgICAgICAgIHJldHVybiBvcGVuSFRNTCh3c0VudGl0eS5nZXRDaGlsZHJlbigpLCBpbnNwZWN0aW9uVHlwZSk7Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTSUwpCi0gICAgICAgICAgcmV0dXJuIG9wZW5XU0lMKHdzaWxVUkwsIHBhcnNlci5nZXRXU0lMRG9jdW1lbnQod3NpbFVSTCksIGluc3BlY3Rpb25UeXBlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1dTSUxfVVJMIiwgd3NpbFVSTCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHByZXNlbGVjdFdTSUxOb2RlKG5vZGVNYW5hZ2VyLCByb290Tm9kZS5nZXRDaGlsZE5vZGUod3NpbEVsZW1lbnQpLmdldE5vZGVJZCgpLCBpbnNwZWN0aW9uVHlwZSk7Ci0gICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1NJTF9BTFJFQURZX09QRU5FRCIsIHdzaWxVUkwpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBvcGVuSFRNTChMaXN0IHdzaWxzLCBpbnQgaW5zcGVjdGlvblR5cGUpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gLTE7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtc2dRdWV1ZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgcm9vdE5vZGUgPSBub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHJvb3QgPSByb290Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSB3c2lscy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NpbEVudGl0eSA9IChXZWJTZXJ2aWNlRW50aXR5KWl0Lm5leHQoKTsKLSAgICAgIFN0cmluZyB3c2lsVVJMID0gd3NpbEVudGl0eS5nZXRVUkkoKTsKLSAgICAgIFdzaWxFbGVtZW50IHdzaWxFbGVtZW50ID0gZ2V0T3BlbmVkV1NJTChyb290LCB3c2lsVVJMKTsKLSAgICAgIGlmICh3c2lsRWxlbWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gV1NJTERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgd3NpbERvYy5yZWFkKHdzaWxVUkwpOwotICAgICAgICAgIHdzaWxFbGVtZW50ID0gbmV3IFdzaWxFbGVtZW50KHdzaWxVUkwsIHJvb3QuZ2V0TW9kZWwoKSwgd3NpbERvYywgd3NpbFVSTCk7Ci0gICAgICAgICAgcm9vdC5jb25uZWN0KHdzaWxFbGVtZW50LCBXc2lsTW9kZWxDb25zdGFudHMuUkVMX1dTSUwsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgICAgICAgbm9kZUlkID0gcm9vdE5vZGUuZ2V0Q2hpbGROb2RlKHdzaWxFbGVtZW50KS5nZXROb2RlSWQoKTsKLSAgICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19PUEVOX1dTSUxfU1VDQ0VTU0ZVTCIsIHdzaWxVUkwpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1NJTF9BTFJFQURZX09QRU5FRCIsIHdzaWxVUkwpKTsKLSAgICAgICAgbm9kZUlkID0gcm9vdE5vZGUuZ2V0Q2hpbGROb2RlKHdzaWxFbGVtZW50KS5nZXROb2RlSWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5vZGVJZCAhPSAtMSkKLSAgICB7Ci0gICAgICBwcmVzZWxlY3RXU0lMTm9kZShub2RlTWFuYWdlciwgbm9kZUlkLCBpbnNwZWN0aW9uVHlwZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIG9wZW5XU0lMKFN0cmluZyB3c2lsVVJMLCBXU0lMRG9jdW1lbnQgd3NpbERvYywgaW50IGluc3BlY3Rpb25UeXBlKQotICB7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtc2dRdWV1ZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgcm9vdE5vZGUgPSBub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHJvb3QgPSByb290Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdzaWxFbGVtZW50IHdzaWxFbGVtZW50ID0gbmV3IFdzaWxFbGVtZW50KHdzaWxVUkwsIHJvb3QuZ2V0TW9kZWwoKSwgd3NpbERvYywgd3NpbFVSTCk7Ci0gICAgcm9vdC5jb25uZWN0KHdzaWxFbGVtZW50LCBXc2lsTW9kZWxDb25zdGFudHMuUkVMX1dTSUwsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgaW50IG5vZGVJZCA9IHJvb3ROb2RlLmdldENoaWxkTm9kZSh3c2lsRWxlbWVudCkuZ2V0Tm9kZUlkKCk7Ci0gICAgbXNnUXVldWUuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fT1BFTl9XU0lMX1NVQ0NFU1NGVUwiLCB3c2lsVVJMKSk7Ci0gICAgcHJlc2VsZWN0V1NJTE5vZGUobm9kZU1hbmFnZXIsIG5vZGVJZCwgaW5zcGVjdGlvblR5cGUpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByZXNlbGVjdFdTSUxOb2RlKE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZUlkLCBpbnQgaW5zcGVjdGlvblR5cGUpCi0gIHsKLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChub2RlSWQpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSWQpOwotICAgIHNlbGVjdGVkTm9kZS5zZXRWaWV3SWQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCk7Ci0gICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICB0b29sTWFuYWdlci5zZXRTZWxlY3RlZFRvb2xJZChpbnNwZWN0aW9uVHlwZSk7Ci0gICAgYWRkVG9IaXN0b3J5KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0lMLCBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCwgaW5zcGVjdGlvblR5cGUsIEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCwgQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCwgdHJ1ZSkpOyAgICAgICAgCi0gIH0KLQotICBwcml2YXRlIFdzaWxFbGVtZW50IGdldE9wZW5lZFdTSUwoVHJlZUVsZW1lbnQgcm9vdCwgU3RyaW5nIHdzaWxVUkwpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gcm9vdC5nZXRFbGVtZW50cyhXc2lsTW9kZWxDb25zdGFudHMuUkVMX1dTSUwpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFdzaWxFbGVtZW50IHdzaWxFbGVtZW50ID0gKFdzaWxFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmICh3c2lsRWxlbWVudC5nZXRXc2lsVXJsKCkuZXF1YWxzKHdzaWxVUkwpKQotICAgICAgICByZXR1cm4gd3NpbEVsZW1lbnQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL09wZW5XU0lMTGlua0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9PcGVuV1NJTExpbmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJhODgxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL09wZW5XU0lMTGlua0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsV3NpbExpbmtFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC50cmFuc2Zvcm1lci5XU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgT3BlbldTSUxMaW5rQWN0aW9uIGV4dGVuZHMgTXVsdGlwbGVMaW5rQWN0aW9uCi17Ci0gIHB1YmxpYyBPcGVuV1NJTExpbmtBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElEKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2lsL2FjdGlvbnMvT3BlbldTSUxMaW5rQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHRvb2xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZUFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsL2FjdGlvbnMvT3BlbldTSUxMaW5rQWN0aW9uSlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCsxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyYW5zZm9ybWVycywgMCwgdHJhbnNmb3JtZXJzLCAwLCBwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKTsKLSAgICB0cmFuc2Zvcm1lcnNbdHJhbnNmb3JtZXJzLmxlbmd0aC0xXSA9IG5ldyBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfLCBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTSUxfTElOS1MsIEFjdGlvbklucHV0cy5WSUVXSUQsIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuV1NJTF9MSU5LKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpbnQgdmlld0lEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdJRCkpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIGlmICghKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBMaXN0RWxlbWVudCBsZSA9ICgoV3NpbEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsV1NJTExpbmtzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICBXc2lsV3NpbExpbmtFbGVtZW50IGxpbmsgPSAoV3NpbFdzaWxMaW5rRWxlbWVudCkgbGUuZ2V0T2JqZWN0KCk7Ci0gICAgU3RyaW5nIHdzaWxVUkwgPSBsaW5rLmdldFdTSUxMaW5rTG9jYXRpb24oKTsKLSAgICAvLyBwb3B1bGF0ZSBhbmQgcnVuIHRoZSBPcGVuV1NJTEFjdGlvbgotICAgIE9wZW5XU0lMQWN0aW9uIGFjdGlvbiA9IG5ldyBPcGVuV1NJTEFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICB0YWJsZS5wdXQoV3NpbEFjdGlvbklucHV0cy5XU0lMX1VSTCwgd3NpbFVSTCk7Ci0gICAgdGFibGUucHV0KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9JTlNQRUNUSU9OX1RZUEUsIFN0cmluZy52YWx1ZU9mKFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9ERVRBSUxTKSk7Ci0gICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1ZTE4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0VURESUJ1c2luZXNzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0VURESVNlcnZpY2VzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5Xc2lsTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZnJlc2hBY3Rpb24gZXh0ZW5kcyBNdWx0aXBsZUxpbmtBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyXzsKLQotICBwdWJsaWMgUmVmcmVzaEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBub2RlTWFuYWdlcl8gPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEFjdGlvbiBuZXdBY3Rpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpOwotICAgIFN0cmluZyBub2RlSURTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBTdHJpbmcgdmlld0lEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgaW50IG5vZGVJRDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRFN0cmluZyk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgIHsKLSAgICAgIG5vZGVJRCA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZUlkKCk7Ci0gICAgfQotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUobm9kZUlEKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlID09IG51bGwgfHwgIShzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBXc2lsTm9kZSkpCi0gICAgICByZXR1cm4gbmV3IE51bGxBY3Rpb24oKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgVG9vbCBzZWxlY3RlZFRvb2wgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgIFJlZnJlc2hBY3Rpb24gYWN0aW9uOwotICAgICAgaWYgKHZpZXdJRFN0cmluZyA9PSBudWxsKQotICAgICAgICBhY3Rpb24gPSBuZXcgUmVmcmVzaFdTSUxBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkKLSAgICAgICAgYWN0aW9uID0gbmV3IFJlZnJlc2hVRERJU2VydmljZUFjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJQnVzaW5lc3NUb29sKQotICAgICAgICBhY3Rpb24gPSBuZXcgUmVmcmVzaFVERElCdXNpbmVzc0FjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBOdWxsQWN0aW9uKCk7Ci0gICAgICBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBTdHJpbmcudmFsdWVPZihub2RlSUQpKTsKLSAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NpbC9hY3Rpb25zL1JlZnJlc2hBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlQWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gIndzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uSlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvUmVmcmVzaFVERElCdXNpbmVzc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoVURESUJ1c2luZXNzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTkzZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoVURESUJ1c2luZXNzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbE1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnRyYW5zZm9ybWVyLldTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoVURESUJ1c2luZXNzQWN0aW9uIGV4dGVuZHMgUmVmcmVzaEFjdGlvbgotewotICBwdWJsaWMgUmVmcmVzaFVERElCdXNpbmVzc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKzFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoLTFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8sIFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUywgQWN0aW9uSW5wdXRzLlZJRVdJRCwgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5VRERJX0JVU0lORVNTKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU11bHRpcGxlTGlua0FjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpCi0gICAgewotICAgICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudDsKLSAgICAgIExpc3RNYW5hZ2VyIGxtID0gd3NpbEVsZW1lbnQuZ2V0QWxsVURESUxpbmtzKCk7Ci0gICAgICBWZWN0b3IgdWRkaUJ1c2luZXNzRWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBTdHJpbmdbXSB2aWV3SURzID0gZ2V0Vmlld0lkcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aWV3SURzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpbnQgdmlld0lEID0gSW50ZWdlci5wYXJzZUludCh2aWV3SURzW2ldKTsKLSAgICAgICAgV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgdWRkaUJ1c2luZXNzRWxlbWVudCA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCkgbG0uZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKS5nZXRPYmplY3QoKTsKLSAgICAgICAgdWRkaUJ1c2luZXNzRWxlbWVudHMuYWRkKHVkZGlCdXNpbmVzc0VsZW1lbnQpOwotICAgICAgfQotICAgICAgd3NpbEVsZW1lbnQucmVmcmVzaFNlcnZpY2VQcm92aWRlcnNGcm9tUmVnaXN0cnkodWRkaUJ1c2luZXNzRWxlbWVudHMpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHVkZGlCdXNpbmVzc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50IHVkZGlCdXNpbmVzc0VsZW1lbnQgPSAoV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB1ZGRpQnVzaW5lc3NFbGVtZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpIDw9IDApCi0gICAgICAgICAgbmFtZSA9IHVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0VURESUxpbmtCdXNpbmVzc0tleSgpOwotICAgICAgICBpZiAodWRkaUJ1c2luZXNzRWxlbWVudC5nZXRTZXJ2aWNlUHJvdmlkZXIoKSAhPSBudWxsKQotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19SRUZSRVNIX1NVQ0NFU1NGVUwiLCBuYW1lKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQlVTSU5FU1NfTk9UX0ZPVU5EIiwgbmFtZSkpOwotICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvUmVmcmVzaFVERElTZXJ2aWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hVRERJU2VydmljZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTE4YzNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvUmVmcmVzaFVERElTZXJ2aWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk1lc3NhZ2VRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbE1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFVkZGlTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIFJlZnJlc2hVRERJU2VydmljZUFjdGlvbiBleHRlbmRzIFJlZnJlc2hBY3Rpb24KLXsKLSAgcHVibGljIFJlZnJlc2hVRERJU2VydmljZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKzFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoLTFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8sIFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUywgQWN0aW9uSW5wdXRzLlZJRVdJRCwgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5VRERJX1NFUlZJQ0UpOwotICAgIHJldHVybiB0cmFuc2Zvcm1lcnM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgcmV0dXJuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlTXVsdGlwbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkKLSAgICB7Ci0gICAgICBXc2lsRWxlbWVudCB3c2lsRWxlbWVudCA9IChXc2lsRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50OwotICAgICAgTGlzdE1hbmFnZXIgbG0gPSB3c2lsRWxlbWVudC5nZXRBbGxVRERJU2VydmljZXMoKTsKLSAgICAgIFZlY3RvciB1ZGRpU2VydmljZUVsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgU3RyaW5nW10gdmlld0lEcyA9IGdldFZpZXdJZHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlld0lEcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQodmlld0lEc1tpXSk7Ci0gICAgICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgdWRkaVNlcnZpY2VFbGVtZW50ID0gKFdzaWxVZGRpU2VydmljZUVsZW1lbnQpIGxtLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCkuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHVkZGlTZXJ2aWNlRWxlbWVudHMuYWRkKHVkZGlTZXJ2aWNlRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICB3c2lsRWxlbWVudC5yZWZyZXNoU2VydmljZURlZmluaXRpb25zRnJvbVJlZ2lzdHJ5KHVkZGlTZXJ2aWNlRWxlbWVudHMpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHVkZGlTZXJ2aWNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCB1ZGRpU2VydmljZUVsZW1lbnQgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IHVkZGlTZXJ2aWNlRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA8PSAwKQotICAgICAgICAgIG5hbWUgPSB1ZGRpU2VydmljZUVsZW1lbnQuZ2V0VURESVNlcnZpY2VLZXkoKTsKLSAgICAgICAgaWYgKHVkZGlTZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1JFRlJFU0hfU1VDQ0VTU0ZVTCIsIG5hbWUpKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORCIsIG5hbWUpKTsKLSAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hXU0lMQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hXU0lMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNTVkOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoV1NJTEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFdTSUxBY3Rpb24gZXh0ZW5kcyBSZWZyZXNoQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWZyZXNoV1NJTEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpCi0gICAgewotICAgICAgU3RyaW5nIHdzaWxVUkwgPSAoKFdzaWxFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLmdldFdzaWxVcmwoKTsKLSAgICAgIGlmICgoKFdzaWxFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLnJlZnJlc2goKSkKLSAgICAgIHsKLSAgICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1JFRlJFU0hfU1VDQ0VTU0ZVTCIsIHdzaWxVUkwpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1NJTF9OT1RfRk9VTkQiLCB3c2lsVVJMKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZXNpemVXU0lMRnJhbWVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1Jlc2l6ZVdTSUxGcmFtZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1MmExNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1Jlc2l6ZVdTSUxGcmFtZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlJlc2l6ZUZyYW1lc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbEFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbEZyYW1lTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgUmVzaXplV1NJTEZyYW1lc0FjdGlvbiBleHRlbmRzIFJlc2l6ZUZyYW1lc0FjdGlvbgotewotICBwdWJsaWMgUmVzaXplV1NJTEZyYW1lc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gcGFyc2VyLmdldFBhcmFtZXRlcihXc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgIT0gbnVsbCAmJiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFdzaWxBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5ULHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSLGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgZnJhbWVzZXQgc2l6ZXMuCi0gICAgU3RyaW5nIGZyYW1lTmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5GUkFNRV9OQU1FKTsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBuZXcgZnJhbWVzZXQgc2l6ZXMuCi0gICAgaWYgKGZyYW1lTmFtZS5lcXVhbHMoV3NpbEZyYW1lTmFtZXMuV1NJTF9OQVZJR0FUT1JfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgIHsKLSAgICAgICAgLy8gUmVzdG9yZS4KLSAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyh3c2lsUGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIE1heGltaXplLgotICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMTAwJSwwJSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChmcmFtZU5hbWUuZXF1YWxzKFdzaWxGcmFtZU5hbWVzLldTSUxfUFJPUEVSVElFU19DT05UQUlORVIpKQotICAgIHsKLSAgICAgIGlmIChhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmVzdG9yZS4KLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHdzaWxQZXJzcGVjdGl2ZS5nZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpKTsKLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyh3c2lsUGVyc3BlY3RpdmUuZ2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIE1heGltaXplLgotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMCUsMTAwJSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIE1heGltaXplLgotICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygiMTAwJSwwJSIpOwotICAgICAgICBpZiAoIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMCUsMTAwJSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGZyYW1lTmFtZS5lcXVhbHMoV3NpbEZyYW1lTmFtZXMuV1NJTF9TVEFUVVNfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICBpZiAoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgewotICAgICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZXN0b3JlLgotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMod3NpbFBlcnNwZWN0aXZlLmdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkpOwotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKHdzaWxQZXJzcGVjdGl2ZS5nZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCIwJSwxMDAlIik7Ci0gICAgICAgIGlmICghcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTE5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTE5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxYWJhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TZWxlY3ROb2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuVG9vbFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0V1NJTE5vZGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3ROb2RlQWN0aW9uCi17Ci0gICAgcHVibGljIFNlbGVjdFdTSUxOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBib29sZWFuIGtlZXBIaXN0b3J5KQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2lsL2FjdGlvbnMvU2VsZWN0V1NJTE5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICAgICAgaWYgKGtlZXBIaXN0b3J5KSB7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgiPTEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICAgIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgVG9vbCBzZWxlY3RlZFRvb2wgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkVG9vbC5nZXRUb29sVHlwZSgpICE9IFRvb2xUeXBlcy5BQ1RJT04pCi0gICAgICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkVG9vbC5nZXRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCB0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gIndzaWxOYXZpZ2F0b3JDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbFByb3BlcnRpZXNDb250YWluZXIiOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gICAgewotICAgICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0lMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTFRvb2xBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTFRvb2xBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxOWM5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxUb29sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2VsZWN0Tm9kZVRvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Ub29sVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlZpZXdUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnRyYW5zZm9ybWVyLldTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RXU0lMVG9vbEFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVUb29sQWN0aW9uCi17Ci0gIHB1YmxpYyBTZWxlY3RXU0lMVG9vbEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLCBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkpOwotICB9Ci0KLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICBJVHJhbnNmb3JtZXJbXSBwYXJlbnRUcmFuc2Zvcm1lcnMgPSBzdXBlci5nZXRUcmFuc2Zvcm1lcnMoKTsKLSAgICBJVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMgPSBuZXcgSVRyYW5zZm9ybWVyW3BhcmVudFRyYW5zZm9ybWVycy5sZW5ndGggKyAxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyYW5zZm9ybWVycywgMCwgdHJhbnNmb3JtZXJzLCAwLCBwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKTsKLSAgICB0cmFuc2Zvcm1lcnNbdHJhbnNmb3JtZXJzLmxlbmd0aCAtIDFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8pOwotICAgIHJldHVybiB0cmFuc2Zvcm1lcnM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElELCBib29sZWFuIGtlZXBIaXN0b3J5KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2lsL2FjdGlvbnMvU2VsZWN0V1NJTFRvb2xBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICBpZiAodmlld0lEICE9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICB7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgfQotICAgIGlmIChrZWVwSGlzdG9yeSkKLSAgICB7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgiPTEiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgYm9vbGVhbiBrZWVwSGlzdG9yeSA9IGZhbHNlOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVG9vbCBzZWxlY3RlZFRvb2wgPSBnZXRTZWxlY3RlZFRvb2woKTsKLSAgICBpbnQgdG9vbFR5cGUgPSBnZXRTZWxlY3RlZFRvb2woKS5nZXRUb29sVHlwZSgpOwotICAgIGlmICh0b29sVHlwZSA9PSBUb29sVHlwZXMuRk9STSkKLSAgICAgIGtlZXBIaXN0b3J5ID0gdHJ1ZTsKLSAgICBlbHNlIGlmICh0b29sVHlwZSA9PSBUb29sVHlwZXMuVklFVykKLSAgICB7Ci0gICAgICBpbnQgdmlld0lEID0gc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpOwotICAgICAgaWYgKHZpZXdJRCA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgICAgIGtlZXBIaXN0b3J5ID0gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoVmlld1Rvb2wpIHNlbGVjdGVkVG9vbCkuZ2V0VG9vbE1hbmFnZXIodmlld0lEKS5nZXRUb29sKHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCkpLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikKLSAgICAgICAgICBrZWVwSGlzdG9yeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChrZWVwSGlzdG9yeSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkVG9vbC5nZXRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCB0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiAid3NpbE5hdmlnYXRvckNvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpCi0gIHsKLSAgICByZXR1cm4gIndzaWxQcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsUHJvcGVydGllc0NvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICB7Ci0gICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0lMOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVdTSUxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJkYjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TaG93UGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLldzaWxBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbiBleHRlbmRzIFNob3dQZXJzcGVjdGl2ZUFjdGlvbgotewotICBwdWJsaWMgU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdzaWxBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSKTsKLSAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzICE9IG51bGwgJiYgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChXc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCxwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFdzaWxBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUixhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSKTsKLSAgICAKLSAgICAvLyBTYXZlIHRoZSBmcmFtZXNldCBzaXplcyBpZmYgbm8gZnJhbWUgaXMgbWF4aW1pemVkLgotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBpZiAoIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5zdGFydHNXaXRoKCIxMDAlIikgJiYgIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgCi0gICAgaWYgKCFhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzLnN0YXJ0c1dpdGgoIjEwMCUiKSAmJiAhYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAKLSAgICByZXR1cm4gc3VwZXIucnVuKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEZvcm1BY3Rpb25MaW5rKGludCB0YXJnZXRQZXJzcGVjdGl2ZUlkLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBmb3JtTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzaWwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0lMQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBmb3JtTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFKS5hcHBlbmQoJz0nKS5hcHBlbmQodGFyZ2V0UGVyc3BlY3RpdmVJZCk7Ci0gICAgaWYgKGZvckhpc3RvcnkpCi0gICAgICBmb3JtTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSkuYXBwZW5kKCI9MSIpOwotICAgIHJldHVybiBmb3JtTGluay50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmYxNDZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLQotcHVibGljIGNsYXNzIFdTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hBY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbgotewotICBwdWJsaWMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkKLSAgewotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICByZXR1cm4gKEZvcm1Ub29sKXdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gIH0KLQotICBwdWJsaWMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uIG5ld0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbigpCi0gIHsKLSAgICBJbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBJbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgdGFibGUucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSkpOwotICAgIHJldHVybiBhY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgfQotICAgIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50UGFnZSgpOwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzRlNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5PcGVuV1NETEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbE1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFdzZGxTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIE11bHRpcGxlTGlua0FjdGlvbgotewotICBwdWJsaWMgV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NpbC9hY3Rpb25zL1dzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiAid3NpbC9hY3Rpb25zL1dzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICBJVHJhbnNmb3JtZXJbXSBwYXJlbnRUcmFuc2Zvcm1lcnMgPSBzdXBlci5nZXRUcmFuc2Zvcm1lcnMoKTsKLSAgICBJVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMgPSBuZXcgSVRyYW5zZm9ybWVyW3BhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgrMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRUcmFuc2Zvcm1lcnMsIDAsIHRyYW5zZm9ybWVycywgMCwgcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCk7Ci0gICAgdHJhbnNmb3JtZXJzW3RyYW5zZm9ybWVycy5sZW5ndGgtMV0gPSBuZXcgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcihjb250cm9sbGVyXywgV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9XU0RMX1NFUlZJQ0VTLCBBY3Rpb25JbnB1dHMuVklFV0lELCBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLldTRExfU0VSVklDRSk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpIHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdzaWxXc2RsU2VydmljZUVsZW1lbnQgd3NpbFdzZGxTZXJ2aWNlRWxlbWVudCA9IChXc2lsV3NkbFNlcnZpY2VFbGVtZW50KSB3c2lsRWxlbWVudC5nZXRBbGxXU0RMU2VydmljZXMoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpLmdldE9iamVjdCgpOwotICAgIFN0cmluZyB3c2RsVXJsID0gd3NpbFdzZGxTZXJ2aWNlRWxlbWVudC5nZXRXU0RMU2VydmljZVVSTCgpOwotICAgIE9wZW5XU0RMQWN0aW9uIG9wZW5XU0RMQWN0aW9uID0gbmV3IE9wZW5XU0RMQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IG9wZW5XU0RMQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwsIHdzZGxVcmwpOwotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gb3BlbldTRExBY3Rpb24ucnVuKCk7Ci0gICAgaWYgKGFjdGlvblJlc3VsdCkKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUwiLCB3c2RsVXJsKSk7Ci0gICAgZWxzZQotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFIiwgd3NkbFVybCkpOwotICAgIHJldHVybiBhY3Rpb25SZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9Xc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YWJlZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9Xc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvV29ya2JlbmNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbiBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIHsKLSAgICBwdWJsaWMgV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKSB7Ci0gICAgICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgcmV0dXJuIChGb3JtVG9vbCl3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gbmV3SW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKCkgewotICAgICAgICBJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgSGFzaHRhYmxlIHRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLQotICAgICAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0KLSAgICAgICAgdGFibGUucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSkpOwotICAgICAgICB0YWJsZS5wdXQoQWN0aW9uSW5wdXRzLlRPT0xJRCwgU3RyaW5nLnZhbHVlT2Yoc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSkpOwotICAgICAgICB0YWJsZS5wdXQoQWN0aW9uSW5wdXRzLlZJRVdJRCwgU3RyaW5nLnZhbHVlT2Yoc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICAgIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50UGFnZSgpOwotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjhhZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9Xc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFVkZGlTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFdzZGxTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0VURESVNlcnZpY2VzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0V1NETFNlcnZpY2VzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbiBleHRlbmRzIExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gewotICAgIHB1YmxpYyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIG5ld0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpIHsKLSAgICAgICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgICAgICByZXR1cm4gKEZvcm1Ub29sKXdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcnVuKCkgewotICAgICAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpbnQgdmlld0lEID0gc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpOwotCi0gICAgICAgIExpc3RFbGVtZW50IGxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybCA9IG51bGw7Ci0gICAgICAgIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0V1NETFNlcnZpY2VzVG9vbCkgewotICAgICAgICAgICAgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsV1NETFNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgICAgIHVybCA9ICgoV3NpbFdzZGxTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKSkuZ2V0V1NETFNlcnZpY2VVUkwoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkgewotICAgICAgICAgICAgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsVURESVNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgICAgIHVybCA9ICgoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKSkuZ2V0V3NkbFVybCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGxhdW5jaFdpemFyZCh1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbFRvZ2dsZU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbFRvZ2dsZU5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiOGEyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dzaWxUb2dnbGVOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlRvZ2dsZU5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Ub29sVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV3NpbFRvZ2dsZU5vZGVBY3Rpb24gZXh0ZW5kcyBUb2dnbGVOb2RlQWN0aW9uIHsKLSAgICBwdWJsaWMgV3NpbFRvZ2dsZU5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsIGJvb2xlYW4gb3BlbikgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzaWwvYWN0aW9ucy9Xc2lsVG9nZ2xlTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSWQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuT1BFTik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGlmIChvcGVuKQotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk9QRU5fTk9ERSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5DTE9TRV9OT0RFKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkgewotICAgICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IHRvZ2dsZWROb2RlXy5nZXRUb29sTWFuYWdlcigpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpbnQgbm9kZUlkID0gdG9nZ2xlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgICAgICBpbnQgdG9vbElkID0gc2VsZWN0ZWRUb29sLmdldFRvb2xJZCgpOwotICAgICAgICBpbnQgdmlld0lkID0gdG9nZ2xlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgICAgICBpbnQgdmlld1Rvb2xJZCA9IHRvZ2dsZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZFRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKQotICAgICAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLCB0b29sSWQsIHZpZXdJZCwgdmlld1Rvb2xJZCwgdHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBTZWxlY3RXU0lMTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCwgdHJ1ZSk7Ci0gICAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0VHJlZUNvbnRlbnRQYWdlKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsQWN0aW9uSW5wdXRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9jb25zdGFudHMvV3NpbEFjdGlvbklucHV0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWIzYzU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsQWN0aW9uSW5wdXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV3NpbEFjdGlvbklucHV0cwotewotICAgIC8vIG9wZW4gV1NJTCBmb3JtCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9VUkwgPSAid3NpbFVSTCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9JTlNQRUNUSU9OX1RZUEUgPSAid3NpbEluc3BlY3Rpb25UeXBlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXU0lMX0RFVEFJTFMgPSAwOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFdTRExfU0VSVklDRVMgPSAxOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVERElfU0VSVklDRVMgPSAyOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVERElfQlVTSU5FU1NFUyA9IDM7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV1NJTF9MSU5LUyA9IDQ7Ci0KLSAgICAvLyBtYXNzIGFjdGlvbgotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1VTFRJUExFX0xJTktfQUNUSU9OID0gIm11bHRpcGxlTGlua0FjdGlvbiI7Ci0KLSAgICAvLyByZXNpemUgV1NJTCBmcmFtZXMgYWN0aW9uCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UID0gImZyYW1lc2V0Q29sc1BlcnNwZWN0aXZlQ29udGVudCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUiA9ICJmcmFtZXNldFJvd3NBY3Rpb25zQ29udGFpbmVyIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsRnJhbWVOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvY29uc3RhbnRzL1dzaWxGcmFtZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmQyNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvY29uc3RhbnRzL1dzaWxGcmFtZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV3NpbEZyYW1lTmFtZXMKLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9OQVZJR0FUT1JfQ09OVEFJTkVSID0gIndzaWxfbmF2aWdhdG9yX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfTkFWSUdBVE9SX1RPT0xCQVIgPSAid3NpbF9uYXZpZ2F0b3JfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfTkFWSUdBVE9SX0NPTlRFTlQgPSAid3NpbF9uYXZpZ2F0b3JfY29udGVudCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfQUNUSU9OU19DT05UQUlORVIgPSAid3NpbF9hY3Rpb25zX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfUFJPUEVSVElFU19DT05UQUlORVIgPSAid3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfUFJPUEVSVElFU19UT09MQkFSID0gIndzaWxfcHJvcGVydGllc190b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9QUk9QRVJUSUVTX0NPTlRFTlQgPSAid3NpbF9wcm9wZXJ0aWVzX2NvbnRlbnQiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0lMX1NUQVRVU19DT05UQUlORVIgPSAid3NpbF9zdGF0dXNfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9TVEFUVVNfVE9PTEJBUiA9ICJ3c2lsX3N0YXR1c190b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9TVEFUVVNfQ09OVEVOVCA9ICJ3c2lsX3N0YXR1c19jb250ZW50IjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsTW9kZWxDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsTW9kZWxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiNjk0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9jb25zdGFudHMvV3NpbE1vZGVsQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV3NpbE1vZGVsQ29uc3RhbnRzCi17Ci0gICAgLy8gUmVsYXRpb24KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUxfV1NJTCA9ICJyZWxXU0lMIjsKLQotICAgIC8vIExpc3QgTWFuYWdlcnMgZm9yIFdzaWxFbGVtZW50Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMgPSAid3NkbFNlcnZpY2VzIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUyA9ICJ1ZGRpU2VydmljZXMiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfTUFOQUdFUl9VRERJX0xJTktTID0gInVkZGlMaW5rcyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9NQU5BR0VSX1dTSUxfTElOS1MgPSAid3NpbExpbmtzIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsQ29tbW9uRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxDb21tb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDI4ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxDb21tb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBXc2lsQ29tbW9uRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotICBwcml2YXRlIFN0cmluZyBiYXNlV3NpbFVSTDsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVsYXRpdmVVUklCYXNlOwotCi0gIHB1YmxpYyBXc2lsQ29tbW9uRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVdzaWxVUkwoKQotICB7Ci0gICAgcmV0dXJuIGJhc2VXc2lsVVJMOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRCYXNlV3NpbFVSTChTdHJpbmcgYmFzZVdzaWxVUkwpCi0gIHsKLSAgICB0aGlzLmJhc2VXc2lsVVJMID0gYmFzZVdzaWxVUkw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgY2hhciBGV0RfU0xBU0ggPSAnLyc7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBCV0RfU0xBU0ggPSAnXFwnOwotICBwcml2YXRlIGZpbmFsIGNoYXIgUFJPVE9DT0xfSU5ESUNBVE9SID0gJzonOwotICAKLSAgcHVibGljIFN0cmluZyBtYWtlQWJzb2x1dGUoU3RyaW5nIHVyaSkKLSAgewotICAgIGlmIChiYXNlV3NpbFVSTCAhPSBudWxsICYmIHVyaSAhPSBudWxsICYmIHVyaS5pbmRleE9mKFBST1RPQ09MX0lORElDQVRPUikgPT0gLTEpCi0gICAgewotICAgICAgaWYgKHJlbGF0aXZlVVJJQmFzZSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZWxhdGl2ZVVSSUJhc2UgPSBiYXNlV3NpbFVSTC5yZXBsYWNlKEJXRF9TTEFTSCwgRldEX1NMQVNIKTsKLSAgICAgICAgaW50IGluZGV4ID0gcmVsYXRpdmVVUklCYXNlLmxhc3RJbmRleE9mKEZXRF9TTEFTSCk7Ci0gICAgICAgIHJlbGF0aXZlVVJJQmFzZSA9IGJhc2VXc2lsVVJMLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotICAgICAgfQotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihyZWxhdGl2ZVVSSUJhc2UpOwotICAgICAgc2IuYXBwZW5kKHVyaSk7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ODI4ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkFic3RyYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuSW5zcGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLQotLyoqCi0gKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIFdTSUwgZG9jdW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFdzaWxFbGVtZW50IGV4dGVuZHMgVHJlZUVsZW1lbnQKLXsKLSAgcHJpdmF0ZSBXU0lMRG9jdW1lbnQgd3NpbERvY187Ci0gIHByaXZhdGUgU3RyaW5nIHRoaXNXc2lsVXJsXzsKLSAgLyoqICoqKioqKioqKioqKioqKioqKiBOYW1lc3BhY2UgKioqKioqKioqKiAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1dTREwgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VERElfVjEgPSAidXJuOnVkZGktb3JnOmFwaSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVURESV9WMiA9ICJ1cm46dWRkaS1vcmc6YXBpX3YyIjsKLSAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VERElfQklORElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAxLzEwL2luc3BlY3Rpb24vdWRkaS8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1dTSUxfSU5TUEVDVElPTiA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAxLzEwL2luc3BlY3Rpb24vIjsKLSAgLyoqICoqKioqKioqKioqKioqKioqKiBSZWxzICoqKioqKioqKioqKioqKiogKi8KLSAgLy8gUmVsYXRpb24gZm9yIGEgV1NJTCBkb3VjbWVudCBhbmQgaXRzIGxpbmsgbm9kZXMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1dTSUxfTElOSyA9ICJ3c2lsIGxpbmsgbm9kZXMiOwotCi0gIHB1YmxpYyBXc2lsRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFdTSUxEb2N1bWVudCB3c2lsRG9jdW1lbnQsIFN0cmluZyB3c2lsVVJMKQotICB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHdzaWxEb2NfID0gd3NpbERvY3VtZW50OwotICAgIHRoaXNXc2lsVXJsXyA9IHdzaWxVUkw7Ci0gICAgTGlzdE1hbmFnZXIgd3NkbFNlcnZpY2VzXyA9IG51bGw7Ci0gICAgTGlzdE1hbmFnZXIgdWRkaVNlcnZpY2VzXyA9IG51bGw7Ci0gICAgTGlzdE1hbmFnZXIgd3NpbExpbmtzXyA9IG51bGw7Ci0gICAgTGlzdE1hbmFnZXIgdWRkaUxpbmtzXyA9IG51bGw7Ci0gICAgc2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMsIHdzZGxTZXJ2aWNlc18pOwotICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX1NFUlZJQ0VTLCB1ZGRpU2VydmljZXNfKTsKLSAgICBzZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUywgd3NpbExpbmtzXyk7Ci0gICAgc2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTSUxfTElOS1MsIHVkZGlMaW5rc18pOwotICB9Ci0KLSAgLyoKLSAgICogUmVmcmVzaCB0aGUgV1NJTCBkb2N1bWVudAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVmcmVzaCgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBXU0lMRG9jdW1lbnQgbmV3V1NJTERvYyA9IFdTSUxEb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotICAgICAgbmV3V1NJTERvYy5yZWFkKGdldFdzaWxVcmwoKSk7Ci0gICAgICB3c2lsRG9jXyA9IG5ld1dTSUxEb2M7Ci0gICAgICBMaXN0TWFuYWdlciB3c2RsU2VydmljZXNfID0gbnVsbDsKLSAgICAgIExpc3RNYW5hZ2VyIHVkZGlTZXJ2aWNlc18gPSBudWxsOwotICAgICAgTGlzdE1hbmFnZXIgd3NpbExpbmtzXyA9IG51bGw7Ci0gICAgICBMaXN0TWFuYWdlciB1ZGRpTGlua3NfID0gbnVsbDsKLSAgICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9XU0RMX1NFUlZJQ0VTLCB3c2RsU2VydmljZXNfKTsKLSAgICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX1NFUlZJQ0VTLCB1ZGRpU2VydmljZXNfKTsKLSAgICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX0xJTktTLCB3c2lsTGlua3NfKTsKLSAgICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9XU0lMX0xJTktTLCB1ZGRpTGlua3NfKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIFdTSUwncyBVUkwKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NpbFVybCgpCi0gIHsKLSAgICByZXR1cm4gdGhpc1dzaWxVcmxfOwotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyB0aGUgV1NJTCBkb2N1bWVudAotICAgKi8KLSAgcHVibGljIFdTSUxEb2N1bWVudCBnZXRXU0lMRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHdzaWxEb2NfOwotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyBhbGwgYWJzdHJhY3QgbGFuZ3VhZ2VzCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFdTSUxBYnN0cmFjdExhbmdzKCkKLSAgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gd3NpbERvY18uZ2V0SW5zcGVjdGlvbigpLmdldEFic3RyYWN0cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWJzdHJhY3RzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKGFic3RyYWN0c1tpXS5nZXRMYW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgYWxsIGFic3RyYWN0cwotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRXU0lMQWJzdHJhY3RzKCkKLSAgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gd3NpbERvY18uZ2V0SW5zcGVjdGlvbigpLmdldEFic3RyYWN0cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWJzdHJhY3RzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKGFic3RyYWN0c1tpXS5nZXRUZXh0KCkpOwotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfQotCi0gIHB1YmxpYyBMaXN0TWFuYWdlciBnZXRBbGxXU0RMU2VydmljZXMoKQotICB7Ci0gICAgTGlzdE1hbmFnZXIgd3NkbFNlcnZpY2VzXyA9IChMaXN0TWFuYWdlcikgZ2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMpOwotICAgIGlmICh3c2RsU2VydmljZXNfID09IG51bGwpCi0gICAgewotICAgICAgaW5pdEFsbFdTRExTZXJ2aWNlcygpOwotICAgICAgd3NkbFNlcnZpY2VzXyA9IChMaXN0TWFuYWdlcikgZ2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbFNlcnZpY2VzXzsKLSAgfQotCi0gIHB1YmxpYyBMaXN0TWFuYWdlciBnZXRBbGxVRERJU2VydmljZXMoKQotICB7Ci0gICAgTGlzdE1hbmFnZXIgdWRkaVNlcnZpY2VzXyA9IChMaXN0TWFuYWdlcikgZ2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfU0VSVklDRVMpOwotICAgIGlmICh1ZGRpU2VydmljZXNfID09IG51bGwpCi0gICAgewotICAgICAgaW5pdEFsbFVERElTZXJ2aWNlcygpOwotICAgICAgdWRkaVNlcnZpY2VzXyA9IChMaXN0TWFuYWdlcikgZ2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfU0VSVklDRVMpOwotICAgIH0KLSAgICByZXR1cm4gdWRkaVNlcnZpY2VzXzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0QWxsV1NETFNlcnZpY2VzKCkKLSAgewotICAgIExpc3RNYW5hZ2VyIHdzZGxTZXJ2aWNlc18gPSBuZXcgTGlzdE1hbmFnZXIoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jXy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VMaXN0ID0gaW5zcGVjdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZUxpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8gc2tpcCBhbnkgc2VydmljZSB3aXRob3V0IGEgd3NkbCBuYW1lc3BhY2UKLSAgICAgIC8vIGFuZCBpbnZhbGlkIGRlc2NyaXB0aW9ucwotICAgICAgRGVzY3JpcHRpb25bXSBkZXNjTGlzdCA9IHNlcnZpY2VMaXN0W2ldLmdldERlc2NyaXB0aW9ucygpOwotICAgICAgaWYgKGRlc2NMaXN0Lmxlbmd0aCA8IDEpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlc2NMaXN0WzBdLmdldFJlZmVyZW5jZWROYW1lc3BhY2UoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBlbHNlIGlmIChuYW1lc3BhY2UuZXF1YWxzKE5BTUVTUEFDRV9XU0RMKSkKLSAgICAgIHsKLSAgICAgICAgV3NpbFdzZGxTZXJ2aWNlRWxlbWVudCB3c2RsU2VydmljZUVsZW1lbnQgPSBuZXcgV3NpbFdzZGxTZXJ2aWNlRWxlbWVudChuYW1lc3BhY2UsIGdldE1vZGVsKCksIHNlcnZpY2VMaXN0W2ldKTsKLSAgICAgICAgd3NkbFNlcnZpY2VFbGVtZW50LnNldEJhc2VXc2lsVVJMKGdldFdzaWxVcmwoKSk7Ci0gICAgICAgIGlmICh3c2RsU2VydmljZUVsZW1lbnQudmFsaWRhdGVXU0RMU2VydmljZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbFNlcnZpY2VFbGVtZW50LnNldE5hbWUod3NkbFNlcnZpY2VFbGVtZW50LmdldFdTRExTZXJ2aWNlVVJMKCkpOwotICAgICAgICAgIHdzZGxTZXJ2aWNlc18uYWRkKG5ldyBMaXN0RWxlbWVudCh3c2RsU2VydmljZUVsZW1lbnQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NETF9TRVJWSUNFUywgd3NkbFNlcnZpY2VzXyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdEFsbFVERElTZXJ2aWNlcygpCi0gIHsKLSAgICBMaXN0TWFuYWdlciB1ZGRpU2VydmljZXNfID0gbmV3IExpc3RNYW5hZ2VyKCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvY18uZ2V0SW5zcGVjdGlvbigpOwotICAgIFNlcnZpY2VbXSBzZXJ2aWNlTGlzdCA9IGluc3BlY3Rpb24uZ2V0U2VydmljZXMoKTsKLSAgICBWZWN0b3IgdWRkaVNlcnZpY2VFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VMaXN0Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIC8vIHNraXAgYW55IHNlcnZpY2Ugd2l0aG91dCBhIHdzZGwgbmFtZXNwYWNlCi0gICAgICAvLyBhbmQgaW52YWxpZCBkZXNjcmlwdGlvbnMKLSAgICAgIERlc2NyaXB0aW9uW10gZGVzY0xpc3QgPSBzZXJ2aWNlTGlzdFtpXS5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICAgIGlmIChkZXNjTGlzdC5sZW5ndGggPCAxKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBkZXNjTGlzdFswXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgZWxzZSBpZiAoKG5hbWVzcGFjZS5lcXVhbHMoTkFNRVNQQUNFX1VERElfVjEpIHx8IG5hbWVzcGFjZS5lcXVhbHMoTkFNRVNQQUNFX1VERElfVjIpKSkKLSAgICAgIHsKLSAgICAgICAgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCB1ZGRpU2VydmljZUVsZW1lbnQgPSBuZXcgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudChuYW1lc3BhY2UsIGdldE1vZGVsKCksIHNlcnZpY2VMaXN0W2ldKTsKLSAgICAgICAgdWRkaVNlcnZpY2VFbGVtZW50LnNldEJhc2VXc2lsVVJMKGdldFdzaWxVcmwoKSk7Ci0gICAgICAgIGlmICh1ZGRpU2VydmljZUVsZW1lbnQudmFsaWRhdGVVRERJU2VydmljZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaVNlcnZpY2VFbGVtZW50LnNldE5hbWUodWRkaVNlcnZpY2VFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgdWRkaVNlcnZpY2VFbGVtZW50cy5hZGQodWRkaVNlcnZpY2VFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZWZyZXNoU2VydmljZURlZmluaXRpb25zRnJvbVJlZ2lzdHJ5KHVkZGlTZXJ2aWNlRWxlbWVudHMpOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSB1ZGRpU2VydmljZUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgdWRkaVNlcnZpY2VzXy5hZGQobmV3IExpc3RFbGVtZW50KGl0Lm5leHQoKSkpOwotICAgIH0KLSAgICBzZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUywgdWRkaVNlcnZpY2VzXyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoU2VydmljZURlZmluaXRpb25zRnJvbVJlZ2lzdHJ5KFZlY3RvciB1ZGRpU2VydmljZUVsZW1lbnRzKQotICB7Ci0gICAgSGFzaE1hcCBpbnF1aXJ5QVBJVG9TZXJ2aWNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1ZGRpU2VydmljZUVsZW1lbnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgdWRkaVNlcnZpY2VFbGVtZW50ID0gKFdzaWxVZGRpU2VydmljZUVsZW1lbnQpIHVkZGlTZXJ2aWNlRWxlbWVudHMuZ2V0KGkpOwotICAgICAgU3RyaW5nIGlucXVpcnlBUEkgPSB1ZGRpU2VydmljZUVsZW1lbnQuZ2V0VURESVNlcnZpY2VJbnF1aXJ5QVBJKCk7Ci0gICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKGlucXVpcnlBUEkpKQotICAgICAgewotICAgICAgICBWZWN0b3Igc2VydmljZXMgPSAoVmVjdG9yKSBpbnF1aXJ5QVBJVG9TZXJ2aWNlcy5nZXQoaW5xdWlyeUFQSSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgaW5xdWlyeUFQSVRvU2VydmljZXMucHV0KGlucXVpcnlBUEksIHNlcnZpY2VzKTsKLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlcy5hZGQodWRkaVNlcnZpY2VFbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdWRkaVNlcnZpY2VFbGVtZW50LnNldFNlcnZpY2VEZWZpbml0aW9uKG51bGwpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaW5xdWlyeUFQSVRvU2VydmljZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgIFZlY3RvciBzZXJ2aWNlcyA9IChWZWN0b3IpIGlucXVpcnlBUElUb1NlcnZpY2VzLmdldChpbnF1aXJ5QVBJKTsKLSAgICAgIFVERElQcm94eSBwcm94eTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMucHV0KEFjdGlvbklucHV0cy5UUkFOU1BPUlRfQ0xBU1NfTkFNRSwgQWN0aW9uSW5wdXRzLlRSQVNQT1JUX0NMQVNTKTsKLSAgICAgICAgcHJveHkgPSBuZXcgVURESVByb3h5KHByb3BzKTsKLSAgICAgICAgcHJveHkuc2V0SW5xdWlyeVVSTChuZXcgVVJMKGlucXVpcnlBUEkpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzZXJ2aWNlcy5zaXplKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgdWRkaVNlcnZpY2VFbGVtZW50ID0gKFdzaWxVZGRpU2VydmljZUVsZW1lbnQpIHNlcnZpY2VzLmdldChqKTsKLSAgICAgICAgICB1ZGRpU2VydmljZUVsZW1lbnQuc2V0U2VydmljZURlZmluaXRpb24obnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBWZWN0b3Igc2VydmljZUtleXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNlcnZpY2VzLnNpemUoKTsgaisrKQotICAgICAgewotICAgICAgICBzZXJ2aWNlS2V5cy5hZGQoKChXc2lsVWRkaVNlcnZpY2VFbGVtZW50KSBzZXJ2aWNlcy5nZXQoaikpLmdldFVERElTZXJ2aWNlS2V5KCkpOwotICAgICAgfQotICAgICAgVmVjdG9yIGJ1c2luZXNzU2VydmljZXM7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYnVzaW5lc3NTZXJ2aWNlcyA9IHByb3h5LmdldF9zZXJ2aWNlRGV0YWlsKHNlcnZpY2VLZXlzKS5nZXRCdXNpbmVzc1NlcnZpY2VWZWN0b3IoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICB7Ci0gICAgICAgIGJ1c2luZXNzU2VydmljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlS2V5cy5zaXplKCkgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzZXJ2aWNlS2V5cy5zaXplKCk7IGsrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnVzaW5lc3NTZXJ2aWNlcy5hZGQoKEJ1c2luZXNzU2VydmljZSkgcHJveHkuZ2V0X3NlcnZpY2VEZXRhaWwoKFN0cmluZykgc2VydmljZUtleXMuZ2V0KGspKS5nZXRCdXNpbmVzc1NlcnZpY2VWZWN0b3IoKS5nZXQoMCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJ1c2luZXNzU2VydmljZXMuYWRkKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgYnVzaW5lc3NTZXJ2aWNlcy5hZGQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8IHNlcnZpY2VzLnNpemUoKTsgaysrKQotICAgICAgewotICAgICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSAoQnVzaW5lc3NTZXJ2aWNlKSBidXNpbmVzc1NlcnZpY2VzLmdldChrKTsKLSAgICAgICAgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCB1ZGRpU2VydmljZUVsZW1lbnQgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCkgc2VydmljZXMuZ2V0KGspOwotICAgICAgICB1ZGRpU2VydmljZUVsZW1lbnQuc2V0U2VydmljZURlZmluaXRpb24oYnMpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0TWFuYWdlciBnZXRBbGxXU0lMTGlua3MoKQotICB7Ci0gICAgTGlzdE1hbmFnZXIgd3NpbExpbmtzXyA9IChMaXN0TWFuYWdlcikgZ2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTSUxfTElOS1MpOwotICAgIGlmICh3c2lsTGlua3NfID09IG51bGwpCi0gICAgewotICAgICAgaW5pdEFsbFdTSUxMaW5rcygpOwotICAgICAgd3NpbExpbmtzXyA9IChMaXN0TWFuYWdlcikgZ2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTSUxfTElOS1MpOwotICAgIH0KLSAgICByZXR1cm4gd3NpbExpbmtzXzsKLSAgfQotCi0gIHB1YmxpYyBMaXN0TWFuYWdlciBnZXRBbGxVRERJTGlua3MoKQotICB7Ci0gICAgTGlzdE1hbmFnZXIgdWRkaUxpbmtzXyA9IChMaXN0TWFuYWdlcikgZ2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfTElOS1MpOwotICAgIGlmICh1ZGRpTGlua3NfID09IG51bGwpCi0gICAgewotICAgICAgaW5pdEFsbFVERElMaW5rcygpOwotICAgICAgdWRkaUxpbmtzXyA9IChMaXN0TWFuYWdlcikgZ2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfTElOS1MpOwotICAgIH0KLSAgICByZXR1cm4gdWRkaUxpbmtzXzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0QWxsVURESUxpbmtzKCkKLSAgewotICAgIExpc3RNYW5hZ2VyIHVkZGlMaW5rc18gPSBuZXcgTGlzdE1hbmFnZXIoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jXy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgTGlua1tdIGxpbmtMaXN0ID0gaW5zcGVjdGlvbi5nZXRMaW5rcygpOwotICAgIFZlY3RvciB1ZGRpQnVzaW5lc3NFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtMaXN0Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIC8vIHByb2Nlc3MgYW55IGxpbmtzIHdpdGggVURESSBuYW1lc3BhY2UKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBsaW5rTGlzdFtpXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgZWxzZSBpZiAoKG5hbWVzcGFjZS5lcXVhbHMoTkFNRVNQQUNFX1VERElfVjEpIHx8IG5hbWVzcGFjZS5lcXVhbHMoTkFNRVNQQUNFX1VERElfVjIpKSkKLSAgICAgIHsKLSAgICAgICAgV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgdWRkaUJ1c2luZXNzRWxlbWVudCA9IG5ldyBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudChuYW1lc3BhY2UsIGdldE1vZGVsKCksIGxpbmtMaXN0W2ldKTsKLSAgICAgICAgdWRkaUJ1c2luZXNzRWxlbWVudC5zZXRCYXNlV3NpbFVSTChnZXRXc2lsVXJsKCkpOwotICAgICAgICBpZiAodWRkaUJ1c2luZXNzRWxlbWVudC52YWxpZGF0ZVVERElMaW5rKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpQnVzaW5lc3NFbGVtZW50LnNldE5hbWUodWRkaUJ1c2luZXNzRWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICAgIHVkZGlCdXNpbmVzc0VsZW1lbnRzLmFkZCh1ZGRpQnVzaW5lc3NFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZWZyZXNoU2VydmljZVByb3ZpZGVyc0Zyb21SZWdpc3RyeSh1ZGRpQnVzaW5lc3NFbGVtZW50cyk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHVkZGlCdXNpbmVzc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgdWRkaUxpbmtzXy5hZGQobmV3IExpc3RFbGVtZW50KGl0Lm5leHQoKSkpOwotICAgIH0KLSAgICBzZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUywgdWRkaUxpbmtzXyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoU2VydmljZVByb3ZpZGVyc0Zyb21SZWdpc3RyeShWZWN0b3IgdWRkaUJ1c2luZXNzRWxlbWVudHMpCi0gIHsKLSAgICBIYXNoTWFwIGlucXVpcnlBUElUb0J1c2luZXNzZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdWRkaUJ1c2luZXNzRWxlbWVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgdWRkaUJ1c2luZXNzRWxlbWVudCA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCkgdWRkaUJ1c2luZXNzRWxlbWVudHMuZ2V0KGkpOwotICAgICAgU3RyaW5nIGlucXVpcnlBUEkgPSB1ZGRpQnVzaW5lc3NFbGVtZW50LmdldFVERElMaW5rSW5xdWlyeUFQSSgpOwotICAgICAgaWYgKFZhbGlkYXRvci52YWxpZGF0ZVVSTChpbnF1aXJ5QVBJKSkKLSAgICAgIHsKLSAgICAgICAgVmVjdG9yIGJ1c2luZXNzZXMgPSAoVmVjdG9yKSBpbnF1aXJ5QVBJVG9CdXNpbmVzc2VzLmdldChpbnF1aXJ5QVBJKTsKLSAgICAgICAgaWYgKGJ1c2luZXNzZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJ1c2luZXNzZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgaW5xdWlyeUFQSVRvQnVzaW5lc3Nlcy5wdXQoaW5xdWlyeUFQSSwgYnVzaW5lc3Nlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVzaW5lc3Nlcy5hZGQodWRkaUJ1c2luZXNzRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHVkZGlCdXNpbmVzc0VsZW1lbnQuc2V0U2VydmljZVByb3ZpZGVyKG51bGwpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaW5xdWlyeUFQSVRvQnVzaW5lc3Nlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgVmVjdG9yIGJ1c2luZXNzZXMgPSAoVmVjdG9yKSBpbnF1aXJ5QVBJVG9CdXNpbmVzc2VzLmdldChpbnF1aXJ5QVBJKTsKLSAgICAgIFVERElQcm94eSBwcm94eTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMucHV0KEFjdGlvbklucHV0cy5UUkFOU1BPUlRfQ0xBU1NfTkFNRSwgQWN0aW9uSW5wdXRzLlRSQVNQT1JUX0NMQVNTKTsKLSAgICAgICAgcHJveHkgPSBuZXcgVURESVByb3h5KHByb3BzKTsKLSAgICAgICAgcHJveHkuc2V0SW5xdWlyeVVSTChuZXcgVVJMKGlucXVpcnlBUEkpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBidXNpbmVzc2VzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgdWRkaUJ1c2luZXNzRWxlbWVudCA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCkgYnVzaW5lc3Nlcy5nZXQoaik7Ci0gICAgICAgICAgdWRkaUJ1c2luZXNzRWxlbWVudC5zZXRTZXJ2aWNlUHJvdmlkZXIobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBWZWN0b3IgYnVzaW5lc3NLZXlzID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBidXNpbmVzc2VzLnNpemUoKTsgaisrKQotICAgICAgewotICAgICAgICBidXNpbmVzc0tleXMuYWRkKCgoV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQpIGJ1c2luZXNzZXMuZ2V0KGopKS5nZXRVRERJTGlua0J1c2luZXNzS2V5KCkpOwotICAgICAgfQotICAgICAgVmVjdG9yIGJ1c2luZXNzRW50aXRpZXM7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYnVzaW5lc3NFbnRpdGllcyA9IHByb3h5LmdldF9idXNpbmVzc0RldGFpbChidXNpbmVzc0tleXMpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgewotICAgICAgICBidXNpbmVzc0VudGl0aWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBpZiAoYnVzaW5lc3NLZXlzLnNpemUoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGJ1c2luZXNzS2V5cy5zaXplKCk7IGsrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnVzaW5lc3NFbnRpdGllcy5hZGQoKEJ1c2luZXNzRW50aXR5KSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwoKFN0cmluZykgYnVzaW5lc3NLZXlzLmdldChrKSkuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKS5nZXQoMCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJ1c2luZXNzRW50aXRpZXMuYWRkKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgYnVzaW5lc3NFbnRpdGllcy5hZGQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8IGJ1c2luZXNzZXMuc2l6ZSgpOyBrKyspCi0gICAgICB7Ci0gICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KSBidXNpbmVzc0VudGl0aWVzLmdldChrKTsKLSAgICAgICAgV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQgdWRkaUJ1c2luZXNzRWxlbWVudCA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCkgYnVzaW5lc3Nlcy5nZXQoayk7Ci0gICAgICAgIHVkZGlCdXNpbmVzc0VsZW1lbnQuc2V0U2VydmljZVByb3ZpZGVyKGJlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdEFsbFdTSUxMaW5rcygpCi0gIHsKLSAgICBMaXN0TWFuYWdlciB3c2lsTGlua3NfID0gbmV3IExpc3RNYW5hZ2VyKCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvY18uZ2V0SW5zcGVjdGlvbigpOwotICAgIExpbmtbXSBsaW5rTGlzdCA9IGluc3BlY3Rpb24uZ2V0TGlua3MoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtMaXN0Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIC8vIHByb2Nlc3MgYW55IGxpbmtzIHdpdGggVURESSBuYW1lc3BhY2UKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBsaW5rTGlzdFtpXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgZWxzZSBpZiAobmFtZXNwYWNlLmVxdWFscyhOQU1FU1BBQ0VfV1NJTF9JTlNQRUNUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgV3NpbFdzaWxMaW5rRWxlbWVudCB3c2lsTGlua0VsZW1lbnQgPSBuZXcgV3NpbFdzaWxMaW5rRWxlbWVudChuYW1lc3BhY2UsIGdldE1vZGVsKCksIGxpbmtMaXN0W2ldKTsKLSAgICAgICAgd3NpbExpbmtFbGVtZW50LnNldEJhc2VXc2lsVVJMKGdldFdzaWxVcmwoKSk7Ci0gICAgICAgIGlmICh3c2lsTGlua0VsZW1lbnQudmFsaWRhdGVXU0lMTGluaygpKQotICAgICAgICB7Ci0gICAgICAgICAgd3NpbExpbmtFbGVtZW50LnNldE5hbWUod3NpbExpbmtFbGVtZW50LmdldFdTSUxMaW5rTG9jYXRpb24oKSk7Ci0gICAgICAgICAgd3NpbExpbmtzXy5hZGQobmV3IExpc3RFbGVtZW50KHdzaWxMaW5rRWxlbWVudCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9XU0lMX0xJTktTLCB3c2lsTGlua3NfKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxMaW5rRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxMaW5rRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Y3MmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsTGlua0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuQWJzdHJhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgTGluawotKi8KLXB1YmxpYyBjbGFzcyBXc2lsTGlua0VsZW1lbnQgZXh0ZW5kcyBXc2lsQ29tbW9uRWxlbWVudAotewotICBwcm90ZWN0ZWQgTGluayBsaW5rXzsKLQotICBwdWJsaWMgV3NpbExpbmtFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTGluayBsaW5rKQotICB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIGxpbmtfID0gbGluazsKLSAgfQotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0TGlua0Fic3RyYWN0TGFuZ3MoKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBsaW5rXy5nZXRBYnN0cmFjdHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFic3RyYWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChhYnN0cmFjdHNbaV0uZ2V0TGFuZygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLQotICBwdWJsaWMgVmVjdG9yIGdldExpbmtBYnN0cmFjdHMoKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBsaW5rXy5nZXRBYnN0cmFjdHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFic3RyYWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChhYnN0cmFjdHNbaV0uZ2V0VGV4dCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2EyNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxTZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5BYnN0cmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgU2VydmljZQotKi8KLXB1YmxpYyBjbGFzcyBXc2lsU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBXc2lsQ29tbW9uRWxlbWVudAotewotICAgIHByb3RlY3RlZCBTZXJ2aWNlIHNlcnZpY2VfOwotCi0gICAgcHVibGljIFdzaWxTZXJ2aWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgICAgIHNlcnZpY2VfID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldFNlcnZpY2VOYW1lTGFuZ3MoKSB7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBTZXJ2aWNlTmFtZVtdIHNlcnZpY2VOYW1lcyA9IHNlcnZpY2VfLmdldFNlcnZpY2VOYW1lcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdi5hZGQoc2VydmljZU5hbWVzW2ldLmdldExhbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotCi0gICAgcHVibGljIFZlY3RvciBnZXRTZXJ2aWNlTmFtZXMoKSB7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBTZXJ2aWNlTmFtZVtdIHNlcnZpY2VOYW1lcyA9IHNlcnZpY2VfLmdldFNlcnZpY2VOYW1lcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdi5hZGQoc2VydmljZU5hbWVzW2ldLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotCi0gICAgcHVibGljIFZlY3RvciBnZXRTZXJ2aWNlQWJzdHJhY3RMYW5ncygpIHsKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gc2VydmljZV8uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWJzdHJhY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2LmFkZChhYnN0cmFjdHNbaV0uZ2V0TGFuZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldFNlcnZpY2VBYnN0cmFjdHMoKSB7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IHNlcnZpY2VfLmdldEFic3RyYWN0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFic3RyYWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdi5hZGQoYWJzdHJhY3RzW2ldLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyZDMzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLkV4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLkJ1c2luZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRGlzY292ZXJ5VVJMOwotCi0vKioKLSogVGhlIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgCi0qIGEgVURESSBzZXJ2aWNlIGluIGEgV1NJTCBkb2N1bWVudAotKi8KLXB1YmxpYyBjbGFzcyBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCBleHRlbmRzIFdzaWxMaW5rRWxlbWVudAotewotICAgIHByaXZhdGUgQnVzaW5lc3NFbnRpdHkgYnVzRW50aXR5XzsKLQotICAgIHB1YmxpYyBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIExpbmsgbGluaykgewotICAgICAgICBzdXBlcihuYW1lLCBtb2RlbCwgbGluayk7Ci0gICAgICAgIGJ1c0VudGl0eV8gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm92aWRlcihCdXNpbmVzc0VudGl0eSBiZSkgewotICAgICAgYnVzRW50aXR5XyA9IGJlOwotICAgIH0KLQotICAgIHB1YmxpYyBCdXNpbmVzc0VudGl0eSBnZXRTZXJ2aWNlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBidXNFbnRpdHlfOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChidXNFbnRpdHlfICA9PSBudWxsKSA/IG51bGwgOiBidXNFbnRpdHlfLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChidXNFbnRpdHlfID09IG51bGwpID8gbnVsbCA6IGJ1c0VudGl0eV8uZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVRERJTGlua0lucXVpcnlBUEkoKSB7Ci0gICAgICAgIEJ1c2luZXNzRGVzY3JpcHRpb24gYmQgPSBnZXRWYWxpZFVERElCdXNpbmVzc0Rlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoYmQgPT0gbnVsbCkgPyBudWxsIDogYmQuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVERElMaW5rQnVzaW5lc3NLZXkoKSB7Ci0gICAgICAgIEJ1c2luZXNzRGVzY3JpcHRpb24gYmQgPSBnZXRWYWxpZFVERElCdXNpbmVzc0Rlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoYmQgPT0gbnVsbCkgPyBudWxsIDogYmQuZ2V0QnVzaW5lc3NLZXkoKS5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVRERJTGlua0Rpc2NvdmVyeVVSTCgpIHsKLSAgICAgICAgQnVzaW5lc3NEZXNjcmlwdGlvbiBiZCA9IGdldFZhbGlkVURESUJ1c2luZXNzRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGJkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBEaXNjb3ZlcnlVUkwgZGlzY292ZXJ5VVJMID0gYmQuZ2V0RGlzY292ZXJ5VVJMKCk7Ci0gICAgICAgICAgICByZXR1cm4gKGRpc2NvdmVyeVVSTCA9PSBudWxsKSA/IG51bGwgOiBkaXNjb3ZlcnlVUkwuZ2V0VGV4dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVRERJTGluaygpIHsKLSAgICAgICAgQnVzaW5lc3NEZXNjcmlwdGlvbiBiZCA9IGdldFZhbGlkVURESUJ1c2luZXNzRGVzY3JpcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIChiZCAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJ1c2luZXNzRGVzY3JpcHRpb24gZ2V0VmFsaWRVRERJQnVzaW5lc3NEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgRXh0ZW5zaW9uRWxlbWVudCBleHRFbGVtZW50ID0gbGlua18uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgICAgICAvLyBUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgb2YgYSBVRERJIGxpbmsKLSAgICAgICAgLy8gbXVzdCBiZSBhIEJ1c2luZXNzRGVzY3JpcHRpb24gZWxlbWVudAotICAgICAgICBpZiAoIShleHRFbGVtZW50IGluc3RhbmNlb2YgQnVzaW5lc3NEZXNjcmlwdGlvbikpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgLy8gQSB2YWxpZCBCdXNpbmVzc0Rlc2NyaXB0aW9uIG11c3QgaGF2ZSBhbiBpbnF1aXJ5IEFQSQotICAgICAgICBTdHJpbmcgaW5xdWlyeUFQSSA9ICgoQnVzaW5lc3NEZXNjcmlwdGlvbilleHRFbGVtZW50KS5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVVSTChpbnF1aXJ5QVBJKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAvLyBBIHZhbGlkIEJ1c2luZXNzRGVzY3JpcHRpb24gbXVzdCBoYXZlIGEgYnVzaW5lc3Mga2V5Ci0gICAgICAgIFN0cmluZyBidXNpbmVzc0tleSA9ICgoQnVzaW5lc3NEZXNjcmlwdGlvbilleHRFbGVtZW50KS5nZXRCdXNpbmVzc0tleSgpLmdldFRleHQoKTsKLSAgICAgICAgaWYgKGJ1c2luZXNzS2V5ID09IG51bGwgfHwgYnVzaW5lc3NLZXkubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKEJ1c2luZXNzRGVzY3JpcHRpb24pZXh0RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsVWRkaVNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Y5ZDY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsVWRkaVNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLkV4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5EaXNjb3ZlcnlVUkw7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBVRERJIHNlcnZpY2UgaW4gYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBXc2lsU2VydmljZUVsZW1lbnQKLXsKLSAgICBwcml2YXRlIEJ1c2luZXNzU2VydmljZSBidXNTZXJ2aWNlXzsKLQotICAgIHB1YmxpYyBXc2lsVWRkaVNlcnZpY2VFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIG1vZGVsLCBzZXJ2aWNlKTsKLSAgICAgICAgYnVzU2VydmljZV8gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VEZWZpbml0aW9uKEJ1c2luZXNzU2VydmljZSBidXNTZXJ2aWNlKSB7Ci0gICAgICAgIGJ1c1NlcnZpY2VfID0gYnVzU2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVzaW5lc3NTZXJ2aWNlIGdldFNlcnZpY2VEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gYnVzU2VydmljZV87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gKGJ1c1NlcnZpY2VfID09IG51bGwpID8gbnVsbCA6IGJ1c1NlcnZpY2VfLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChidXNTZXJ2aWNlXyA9PSBudWxsKSA/IG51bGwgOiBidXNTZXJ2aWNlXy5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVERElTZXJ2aWNlSW5xdWlyeUFQSSgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gZ2V0VmFsaWRVRERJU2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoc2QgPT0gbnVsbCkgPyBudWxsIDogc2QuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVERElTZXJ2aWNlS2V5KCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBnZXRWYWxpZFVERElTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIChzZCA9PSBudWxsKSA/IG51bGwgOiBzZC5nZXRTZXJ2aWNlS2V5KCkuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VURESVNlcnZpY2VEaXNjb3ZlcnlVUkwoKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IGdldFZhbGlkVURESVNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAoc2QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERpc2NvdmVyeVVSTCBkaXNjb3ZlcnlVUkwgPSBzZC5nZXREaXNjb3ZlcnlVUkwoKTsKLSAgICAgICAgICAgIHJldHVybiAoZGlzY292ZXJ5VVJMID09IG51bGwpID8gbnVsbCA6IGRpc2NvdmVyeVVSTC5nZXRUZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBnZXRWYWxpZFVERElTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uW10gZGVzY0xpc3QgPSBzZXJ2aWNlXy5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjTGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRXh0ZW5zaW9uRWxlbWVudCBleHRFbGVtZW50ID0gZGVzY0xpc3RbaV0uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgICAgICAgICAgLy8gVGhlIGV4dGVuc2lvbiBlbGVtZW50IG9mIGEgVURESSBzZXJ2aWNlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAvLyBtdXN0IGJlIGEgU2VydmljZURlc2NyaXB0aW9uIGVsZW1lbnQKLSAgICAgICAgICAgIGlmICghKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlRGVzY3JpcHRpb24pKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgLy8gQSB2YWxpZCBTZXJ2aWNlRGVzY3JpcHRpb24gbXVzdCBoYXZlIGFuIGlucXVpcnkgQVBJCi0gICAgICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVVSTCgoKFNlcnZpY2VEZXNjcmlwdGlvbilleHRFbGVtZW50KS5nZXRMb2NhdGlvbigpKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIC8vIEEgdmFsaWQgU2VydmljZURlc2NyaXB0aW9uIG11c3QgaGF2ZSBhIHNlcnZpY2Uga2V5Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljZUtleSA9ICgoU2VydmljZURlc2NyaXB0aW9uKWV4dEVsZW1lbnQpLmdldFNlcnZpY2VLZXkoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUtleSA9PSBudWxsIHx8IHNlcnZpY2VLZXkubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHJldHVybiAoU2VydmljZURlc2NyaXB0aW9uKWV4dEVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVRERJU2VydmljZSgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gZ2V0VmFsaWRVRERJU2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoc2QgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsVXJsKCkgewotICAgICAgICByZXR1cm4gKG5ldyBVZGRpNGpIZWxwZXIoKSkuZ2V0V1NETChnZXRTZXJ2aWNlRGVmaW5pdGlvbigpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsV3NkbFNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFdzZGxTZXJ2aWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY2Y2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsV3NkbFNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24uRXh0ZW5zaW9uRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLndzZGwuSW1wbGVtZW50ZWRCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLlJlZmVyZW5jZWRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBXU0RMIHNlcnZpY2UgaW4gYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIFdzaWxXc2RsU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBXc2lsU2VydmljZUVsZW1lbnQKLXsKLSAgICBwdWJsaWMgV3NpbFdzZGxTZXJ2aWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihuYW1lLCBtb2RlbCwgc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMU2VydmljZVVSTCgpIHsKLSAgICAgICAgRGVzY3JpcHRpb24gZGVzYyA9IGdldFZhbGlkV1NETERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoZGVzYyA9PSBudWxsKSA/IG51bGwgOiBtYWtlQWJzb2x1dGUoZGVzYy5nZXRMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldFdTRExCaW5kaW5nKCkgewotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgRGVzY3JpcHRpb25bXSBkZXNjTGlzdCA9IHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBFeHRlbnNpb25FbGVtZW50IGV4dEVsZW1lbnQgPSBkZXNjTGlzdFtpXS5nZXRFeHRlbnNpb25FbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZXh0RWxlbWVudCAhPSBudWxsICYmIGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VkU2VydmljZSByZWZTZXJ2aWNlID0gKChSZWZlcmVuY2UpZXh0RWxlbWVudCkuZ2V0UmVmZXJlbmNlZFNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVmU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkKHJlZlNlcnZpY2UuZ2V0UmVmZXJlbmNlZFNlcnZpY2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbXBsZW1lbnRlZEJpbmRpbmdbXSBpbXBsQmluZGluZ0xpc3QgPSAoKFJlZmVyZW5jZSlleHRFbGVtZW50KS5nZXRJbXBsZW1lbnRlZEJpbmRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbXBsQmluZGluZ0xpc3QubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdi5hZGQoaW1wbEJpbmRpbmdMaXN0W2pdLmdldEJpbmRpbmdOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBEZXNjcmlwdGlvbiBnZXRWYWxpZFdTRExEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgRGVzY3JpcHRpb25bXSBkZXNjTGlzdCA9IHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBza2lwIHRoaXMgZGVzY3JpcHRpb24gaWYgdGhlIGxvY2F0aW9pbiBhdHRyaWJ1dGUgaXMgYSBtYWxmb3JtZWQgVVJMCi0gICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBkZXNjTGlzdFtpXS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24ubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIC8vIHNraXAgdGhpcyBkZXNjcmlwdGlvbiBpZiB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgaW5kaWNhdGVzCi0gICAgICAgICAgICAvLyB0aGF0IHRoZSBkZXNjcmlwdGlvbidzIGxvY2F0aW9uIGNvbnRhaW5zIG9ubHkgdGhlIHdzZGwgYmluZGluZwotICAgICAgICAgICAgRXh0ZW5zaW9uRWxlbWVudCBleHRFbGVtZW50ID0gZGVzY0xpc3RbaV0uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgIT0gbnVsbCAmJiBleHRFbGVtZW50IGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBlbmRwb2ludFByZXNlbnQgPSAoKFJlZmVyZW5jZSlleHRFbGVtZW50KS5nZXRFbmRwb2ludFByZXNlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRQcmVzZW50ICE9IG51bGwgJiYgZW5kcG9pbnRQcmVzZW50LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGEgdmFsaWQgZGVzY3JpcHRpb24gaXMgZm91bmQKLSAgICAgICAgICAgIHJldHVybiBkZXNjTGlzdFtpXTsKLSAgICAgICAgfQotICAgICAgICAvLyBubyB2YWxpZCBkZXNjcmlwdGlvbiBpcyBmb3VuZCBmb3IgdGhpcyBzZXJ2aWNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlV1NETFNlcnZpY2UoKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uIGRlc2MgPSBnZXRWYWxpZFdTRExEZXNjcmlwdGlvbigpOwotICAgICAgICByZXR1cm4gKGRlc2MgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFdTRExTZXJ2aWNlVVJMKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsV3NpbExpbmtFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFdzaWxMaW5rRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWUyZDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsV3NpbExpbmtFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBXU0lMIGxpbmsgaW4gYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIFdzaWxXc2lsTGlua0VsZW1lbnQgZXh0ZW5kcyBXc2lsTGlua0VsZW1lbnQKLXsKLSAgcHVibGljIFdzaWxXc2lsTGlua0VsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBMaW5rIGxpbmspCi0gIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCwgbGluayk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdTSUxMaW5rTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIG1ha2VBYnNvbHV0ZShsaW5rXy5nZXRMb2NhdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlV1NJTExpbmsoKQotICB7Ci0gICAgcmV0dXJuIChsaW5rXy5nZXRMb2NhdGlvbigpICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0V1NJTExpbmtMb2NhdGlvbigpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZEJ1c2luZXNzVG9GYXZvcml0ZXNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjQyMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzVG9vbCBleHRlbmRzIEFjdGlvblRvb2wgewotICAgIHB1YmxpYyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9mYXZvcml0ZXNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2Zhdm9yaXRlc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTQ1MWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIEFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAid3NpbC9pbWFnZXMvYWRkX3RvX1VERElfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiLCAid3NpbC9pbWFnZXMvYWRkX3RvX1VERElfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIEFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRTZXJ2aWNlVG9GYXZvcml0ZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRTZXJ2aWNlVG9GYXZvcml0ZXNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OGMyYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkU2VydmljZVRvRmF2b3JpdGVzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFNlcnZpY2VUb0Zhdm9yaXRlc1Rvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgQWRkU2VydmljZVRvRmF2b3JpdGVzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9mYXZvcml0ZXNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2Zhdm9yaXRlc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTkyMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIEFkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJ3c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMDMxNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzVG9vbCBleHRlbmRzIEFjdGlvblRvb2wgewotICAgIHB1YmxpYyBBZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9mYXZvcml0ZXNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2Zhdm9yaXRlc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRXU0lMVG9GYXZvcml0ZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRXU0lMVG9GYXZvcml0ZXNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhM2NiNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkV1NJTFRvRmF2b3JpdGVzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFdTSUxUb0Zhdm9yaXRlc1Rvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgQWRkV1NJTFRvRmF2b3JpdGVzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9mYXZvcml0ZXNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2Zhdm9yaXRlc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCwgQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9DbGVhcldTSUxUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9DbGVhcldTSUxUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhY2M1ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQ2xlYXJXU0lMVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQ2xlYXJXU0lMQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBDbGVhcldTSUxUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIENsZWFyV1NJTFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICByZXR1cm4gQ2xlYXJXU0lMQWN0aW9uLmdldEFjdGlvbkxpbmsodG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlSWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0ltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzEwNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5JbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sIGV4dGVuZHMgSW1wb3J0VG9GaWxlU3lzdGVtVG9vbCB7Ci0gICAgcHVibGljIEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0ltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1Ub29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9JbXBvcnRXU0lMVG9GaWxlU3lzdGVtVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDAwYzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0ltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuSW1wb3J0VG9GaWxlU3lzdGVtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5JbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRXU0lMVG9GaWxlU3lzdGVtVG9vbCBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbVRvb2wgewotICAgIHB1YmxpYyBJbXBvcnRXU0lMVG9GaWxlU3lzdGVtVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIHJldHVybiBJbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlSWQoKSwgdG9vbElkXywgQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxULCBBY3Rpb25JbnB1dHMuVklFV1RPT0xJRF9ERUZBVUxUKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0xpc3RVRERJQnVzaW5lc3NUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9MaXN0VURESUJ1c2luZXNzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzdjMDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0xpc3RVRERJQnVzaW5lc3NUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5Qcm94eUxvYWRQYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVmlld1Rvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIExpc3RVRERJQnVzaW5lc3NUb29sIGV4dGVuZHMgVmlld1Rvb2wgewotICAgIHB1YmxpYyBMaXN0VURESUJ1c2luZXNzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgIndzaWwvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfZW5hYmxlZC5naWYiLCAid3NpbC9pbWFnZXMvbGlzdF9idXNpbmVzc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFNldERlZmF1bHRWaWV3VG9vbChUb29sTWFuYWdlciB2aWV3VG9vbE1hbmFnZXIsIGludCBpbmRleCkgewotICAgICAgICBuZXcgV3NpbFNldERlZmF1bHRWaWV3VG9vbCh2aWV3VG9vbE1hbmFnZXIsICB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIkFMVF9CQUNLX1RPX1RPUCIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb29scyhUb29sTWFuYWdlciB2aWV3VG9vbE1hbmFnZXIsIGludCBpbmRleCkgewotICAgICAgICBuZXcgVWRkaUJ1c2luZXNzRGV0YWlsc1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIkFMVF9VRERJX0xJTktfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IEFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVUb29sKHZpZXdUb29sTWFuYWdlciwgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlKCJBTFRfQUREX0JVU0lORVNTX1RPX1VERElfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgICAgIG5ldyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzVG9vbCh2aWV3VG9vbE1hbmFnZXIsIHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiQUxUX0FERF9VRERJX0JVU0lORVNTX1RPX0ZBVk9SSVRFUyIpKTsKLSAgICAgICAgbmV3IFJlZnJlc2hVRERJQnVzaW5lc3NUb29sKHZpZXdUb29sTWFuYWdlciwgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlKCJBTFRfUkVGUkVTSF9VRERJX0JVU0lORVNTIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiBQcm94eUxvYWRQYWdlQWN0aW9uLmdldEFjdGlvbkxpbmsoIndzaWwvdmlld3MvVWRkaUJ1c2luZXNzVmlldy5qc3AiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9MaXN0VURESVNlcnZpY2VzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFVERElTZXJ2aWNlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4ODRmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9MaXN0VURESVNlcnZpY2VzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuUHJveHlMb2FkUGFnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlZpZXdUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBMaXN0VURESVNlcnZpY2VzVG9vbCBleHRlbmRzIFZpZXdUb29sIHsKLSAgICBwdWJsaWMgTGlzdFVERElTZXJ2aWNlc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJ3c2lsL2ltYWdlcy9saXN0X1VERElfc2VydmljZV9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9saXN0X1VERElfc2VydmljZV9oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFNldERlZmF1bHRWaWV3VG9vbChUb29sTWFuYWdlciB2aWV3VG9vbE1hbmFnZXIsIGludCBpbmRleCkgewotICAgICAgICBuZXcgV3NpbFNldERlZmF1bHRWaWV3VG9vbCh2aWV3VG9vbE1hbmFnZXIsICB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIkFMVF9CQUNLX1RPX1RPUCIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb29scyhUb29sTWFuYWdlciB2aWV3VG9vbE1hbmFnZXIsIGludCBpbmRleCkgewotICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpOwotICAgICAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IFVkZGlTZXJ2aWNlRGV0YWlsc1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1dTSUxfU0VSVklDRV9ERVRBSUxTIikpOwotICAgICAgICBuZXcgV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wodmlld1Rvb2xNYW5hZ2VyLCBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9JTVBPUlRfV1NETF9UT19XT1JLQkVOQ0giKSk7Ci0gICAgICAgIG5ldyBJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbCh2aWV3VG9vbE1hbmFnZXIsIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1dTRExfSU1QT1JUX1RPX0ZTIikpOwotICAgICAgICBuZXcgV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sKHZpZXdUb29sTWFuYWdlciwgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTEFVTkNIX1dFQl9TRVJWSUNFX1dJWkFSRCIpKTsKLSAgICAgICAgbmV3IEFkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZVRvb2wodmlld1Rvb2xNYW5hZ2VyLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9TRVJWSUNFX1RPX1VERElfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgICAgIG5ldyBBZGRTZXJ2aWNlVG9GYXZvcml0ZXNUb29sKHZpZXdUb29sTWFuYWdlciwgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfU0VSVklDRV9UT19GQVZPUklURVMiKSk7Ci0gICAgICAgIG5ldyBSZWZyZXNoVURESVNlcnZpY2VUb29sKHZpZXdUb29sTWFuYWdlciwgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9SRUZSRVNIX1VERElfU0VSVklDRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gUHJveHlMb2FkUGFnZUFjdGlvbi5nZXRBY3Rpb25MaW5rKCJ3c2lsL3ZpZXdzL1VkZGlTZXJ2aWNlc1ZpZXcuanNwIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9MaXN0V1NETFNlcnZpY2VzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFdTRExTZXJ2aWNlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3NzYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9MaXN0V1NETFNlcnZpY2VzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5WaWV3VG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgTGlzdFdTRExTZXJ2aWNlc1Rvb2wgZXh0ZW5kcyBWaWV3VG9vbCB7Ci0gICAgcHVibGljIExpc3RXU0RMU2VydmljZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAid3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfZW5hYmxlZC5naWYiLCAid3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZXREZWZhdWx0Vmlld1Rvb2woVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgbmV3IFdzaWxTZXREZWZhdWx0Vmlld1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCAgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJBTFRfQkFDS19UT19UT1AiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9vbHMoVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBXc2RsU2VydmljZURldGFpbHNUb29sKHZpZXdUb29sTWFuYWdlciwgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0lMX1NFUlZJQ0VfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IFdzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sKHZpZXdUb29sTWFuYWdlciwgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIikpOwotICAgICAgICBuZXcgSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wodmlld1Rvb2xNYW5hZ2VyLCBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0lNUE9SVF9UT19GUyIpKTsKLSAgICAgICAgbmV3IFdzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbCh2aWV3VG9vbE1hbmFnZXIsIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQiKSk7Ci0gICAgICAgIG5ldyBXc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sKHZpZXdUb29sTWFuYWdlciwgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFIikpOwotICAgICAgICBuZXcgQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9XU0RMX1NFUlZJQ0VfVE9fRkFWT1JJVEVTIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC92aWV3cy9Xc2RsU2VydmljZXNWaWV3LmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFdTSUxMaW5rc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0xpc3RXU0lMTGlua3NUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZTUyZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFdTSUxMaW5rc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVmlld1Rvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIExpc3RXU0lMTGlua3NUb29sIGV4dGVuZHMgVmlld1Rvb2wgewotICAgIHB1YmxpYyBMaXN0V1NJTExpbmtzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgIndzaWwvaW1hZ2VzL2xpc3RfV1NJTF9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9saXN0X1dTSUxfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZXREZWZhdWx0Vmlld1Rvb2woVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgbmV3IFdzaWxTZXREZWZhdWx0Vmlld1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCAgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJBTFRfQkFDS19UT19UT1AiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9vbHMoVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgbmV3IFdzaWxMaW5rRGV0YWlsc1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIkFMVF9XU0lMX0xJTktfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IE9wZW5XU0lMTGlua1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIkFMVF9PUEVOX1dTSUxfTElOSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzaWwvdmlld3MvV3NpbExpbmtzVmlldy5qc3AiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL09wZW5XU0lMTGlua1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL09wZW5XU0lMTGlua1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjNjFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9PcGVuV1NJTExpbmtUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5PcGVuV1NJTExpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIE9wZW5XU0lMTGlua1Rvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgT3BlbldTSUxMaW5rVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgIndzaWwvaW1hZ2VzL29wZW5fd3NpbF9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9vcGVuX3dzaWxfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIE9wZW5XU0lMTGlua0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL09wZW5XU0lMVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvT3BlbldTSUxUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDUwMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvT3BlbldTSUxUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBPcGVuV1NJTFRvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIE9wZW5XU0lMVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgIndzaWwvaW1hZ2VzL29wZW5fd3NpbF9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9vcGVuX3dzaWxfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL2Zvcm1zL09wZW5XU0lMRm9ybS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvUmVmcmVzaFVERElCdXNpbmVzc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1JlZnJlc2hVRERJQnVzaW5lc3NUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjJhODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvUmVmcmVzaFVERElCdXNpbmVzc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlJlZnJlc2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFJlZnJlc2hVRERJQnVzaW5lc3NUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIFJlZnJlc2hVRERJQnVzaW5lc3NUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFJlZnJlc2hBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9SZWZyZXNoVURESVNlcnZpY2VUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9SZWZyZXNoVURESVNlcnZpY2VUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTg3OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvUmVmcmVzaFVERElTZXJ2aWNlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFVERElTZXJ2aWNlVG9vbCBleHRlbmRzIEFjdGlvblRvb2wgewotICAgIHB1YmxpYyBSZWZyZXNoVURESVNlcnZpY2VUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFJlZnJlc2hBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9SZWZyZXNoV1NJTFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1JlZnJlc2hXU0lMVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzYzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1JlZnJlc2hXU0lMVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFdTSUxUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIFJlZnJlc2hXU0lMVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICByZXR1cm4gUmVmcmVzaEFjdGlvbi5nZXRBY3Rpb25MaW5rKHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCwgQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9VZGRpQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvVWRkaUJ1c2luZXNzRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkYjE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9VZGRpQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgVWRkaUJ1c2luZXNzRGV0YWlsc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIFVkZGlCdXNpbmVzc0RldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzaWwvZm9ybXMvVWRkaUJ1c2luZXNzRGV0YWlsc1BhZ2UuanNwIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1VkZGlTZXJ2aWNlRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1VkZGlTZXJ2aWNlRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzZjVjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9VZGRpU2VydmljZURldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBVZGRpU2VydmljZURldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotICAgIHB1YmxpYyBVZGRpU2VydmljZURldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzaWwvZm9ybXMvVWRkaVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjhlYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5JbXBvcnRUb1dvcmtiZW5jaFRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoVG9vbCBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoVG9vbAotewotICBwdWJsaWMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwgYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsL2Zvcm1zL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hGb3JtLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dTSUxQZXJzcGVjdGl2ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV1NJTFBlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDBmNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV1NJTFBlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFdTSUxQZXJzcGVjdGl2ZSBleHRlbmRzIFBlcnNwZWN0aXZlCi17Ci0gICAgcHJpdmF0ZSBCYXNpY01vZGVsIG1vZGVsXzsKLSAgICBwcml2YXRlIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyXzsKLSAgICBwcml2YXRlIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICAgIHByaXZhdGUgU3RyaW5nIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgICBwcml2YXRlIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgICBwcml2YXRlIFN0cmluZyBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotCi0gICAgcHVibGljIFdTSUxQZXJzcGVjdGl2ZShDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gICAgewotICAgICAgICBzdXBlcigid3NpbCIsY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgaW5pdFBlcnNwZWN0aXZlKFNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uKQotICAgIHsKLSAgICAgICAgbW9kZWxfID0gbmV3IEJhc2ljTW9kZWwoIldzaWxNb2RlbCIpOwotICAgICAgICBUcmVlRWxlbWVudCB0cmVlRWxlbWVudCA9IG5ldyBUcmVlRWxlbWVudChnZXRNZXNzYWdlKCJXU0lMX01BSU5fTk9ERSIpLCBtb2RlbF8pOwotICAgICAgICBtb2RlbF8uc2V0Um9vdEVsZW1lbnQodHJlZUVsZW1lbnQpOwotICAgICAgICBub2RlTWFuYWdlcl8gPSBuZXcgTm9kZU1hbmFnZXIoY29udHJvbGxlcl8pOwotICAgICAgICBXc2lsTWFpbk5vZGUgd3NpbE1haW5Ob2RlID0gbmV3IFdzaWxNYWluTm9kZSh0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXJfKTsKLSAgICAgICAgbm9kZU1hbmFnZXJfLnNldFJvb3ROb2RlKHdzaWxNYWluTm9kZSk7Ci0KLSAgICAgICAgLy8gU3RhcnRpbmcgZnJhbWVzZXQgc2l6ZXMuCi0gICAgICAgIGlmICghRGlyVXRpbHMuaXNSVEwoKSkKLSAgICAgICAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gIjMwJSwqIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSAiKiwzMCUiOwotICAgICAgICBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICAgICAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9ICI3NSUsKiI7Ci0gICAgICAgIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZU1hbmFnZXIgZ2V0Tm9kZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBub2RlTWFuYWdlcl87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAid3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0lMOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFuZXNGaWxlKCkgewotICAgICAgICByZXR1cm4gIndzaWwvc2NyaXB0cy93c2lsUGFuZXMuanNwIjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRGcmFtZXNldHNGaWxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIndzaWwvc2NyaXB0cy93c2lsZnJhbWVzZXRzLmpzcCI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc0ZyYW1lc2V0c0Zvcm0oKQotICAgIHsKLSAgICAgIHJldHVybiAid3NpbC9mb3Jtcy9Qcm9jZXNzV1NJTEZyYW1lc2V0c0Zvcm0uanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gIndzaWxOYXZpZ2F0b3JDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbFByb3BlcnRpZXNDb250YWluZXIiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gIndzaWxTdGF0dXNDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gIndzaWwvd3NpbF9zdGF0dXNfY29udGVudC5qc3AiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpCi0gICAgewotICAgICAgcmV0dXJuIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhTdHJpbmcgY29scykKLSAgICB7Ci0gICAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gY29sczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpCi0gICAgewotICAgICAgcmV0dXJuIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoU3RyaW5nIGNvbHMpCi0gICAgewotICAgICAgc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gY29sczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoU3RyaW5nIHJvd3MpCi0gICAgewotICAgICAgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSByb3dzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpCi0gICAgewotICAgICAgcmV0dXJuIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhTdHJpbmcgcm93cykKLSAgICB7Ci0gICAgICBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gcm93czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTd2l0Y2hQZXJzcGVjdGl2ZUZvcm1BY3Rpb25MaW5rKGludCB0YXJnZXRQZXJzcGVjdGl2ZUlkLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgICB7Ci0gICAgICByZXR1cm4gU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbi5nZXRGb3JtQWN0aW9uTGluayh0YXJnZXRQZXJzcGVjdGl2ZUlkLGZvckhpc3RvcnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzZGxTZXJ2aWNlRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzZGxTZXJ2aWNlRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZGZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2RsU2VydmljZURldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXc2RsU2VydmljZURldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotICAgIHB1YmxpYyBXc2RsU2VydmljZURldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzaWwvZm9ybXMvV3NkbFNlcnZpY2VEZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZiYTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sIGV4dGVuZHMgQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sIHsKLQotICBwdWJsaWMgV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXywgZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBXc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbERldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZWNiOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbERldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXc2lsRGV0YWlsc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIFdzaWxEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9kZXRhaWxzX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL2Zvcm1zL1dzaWxEZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzEyNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5JbXBvcnRUb1dvcmtiZW5jaFRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbCBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoVG9vbCB7Ci0gICAgcHVibGljIFdzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICAgIHsKLSAgICAgIHJldHVybiAid3NpbC9mb3Jtcy9Xc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoRm9ybS5qc3AiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzExMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wgZXh0ZW5kcyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbCB7Ci0gICAgcHVibGljIFdzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIndzaWwvZm9ybXMvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbExpbmtEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbExpbmtEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODY1NDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxMaW5rRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFdzaWxMaW5rRGV0YWlsc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIFdzaWxMaW5rRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC9mb3Jtcy9Xc2lsTGlua0RldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsTWFpbk5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxNYWluTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU1YjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxNYWluTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuUmVsUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLldzaWxNb2RlbENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFdzaWxNYWluTm9kZSBleHRlbmRzIFdzaWxOYXZpZ2F0b3JOb2RlIHsKLQotICAgIHB1YmxpYyBXc2lsTWFpbk5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgMSwgImltYWdlcy9yb290X21haW4uZ2lmIik7Ci0gICAgICAgIHRyZWVFbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWwuZXF1YWxzKFdzaWxNb2RlbENvbnN0YW50cy5SRUxfV1NJTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3NpbE5vZGUgd3NpbE5vZGUgPSBuZXcgV3NpbE5vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENoaWxkKHdzaWxOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhXc2lsTW9kZWxDb25zdGFudHMuUkVMX1dTSUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKFdzaWxNb2RlbENvbnN0YW50cy5SRUxfV1NJTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IE9wZW5XU0lMVG9vbCh0b29sTWFuYWdlcl8sIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfT1BFTl9XU0lMIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxOYXZpZ2F0b3JOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsTmF2aWdhdG9yTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTIyOTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxOYXZpZ2F0b3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxOb2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuV3NpbFRvZ2dsZU5vZGVBY3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXc2lsTmF2aWdhdG9yTm9kZSBleHRlbmRzIE5vZGUgewotCi0gICAgcHVibGljIFdzaWxOYXZpZ2F0b3JOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCwgU3RyaW5nIGltYWdlUGF0aCkgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCwgaW1hZ2VQYXRoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25IcmVmKCkgewotICAgICAgICByZXR1cm4gV3NpbFRvZ2dsZU5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWRfLGlzT3Blbl8pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGlua0FjdGlvbkhyZWYoKSB7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8sIGZhbHNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg2OWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFdzaWxOb2RlIGV4dGVuZHMgV3NpbE5hdmlnYXRvck5vZGUgewotCi0gICAgcHVibGljIFdzaWxOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCkgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCwgIndzaWwvaW1hZ2VzL3dzaWxfbm9kZS5naWYiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgV3NpbERldGFpbHNUb29sKHRvb2xNYW5hZ2VyXywgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0lMX0RFVEFJTFMiKSk7Ci0gICAgICAgIG5ldyBMaXN0V1NETFNlcnZpY2VzVG9vbCh0b29sTWFuYWdlcl8sIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9XU0RMX1NFUlZJQ0VTIikpOwotICAgICAgICBuZXcgTGlzdFVERElTZXJ2aWNlc1Rvb2wodG9vbE1hbmFnZXJfLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfVURESV9TRVJWSUNFUyIpKTsKLSAgICAgICAgbmV3IExpc3RVRERJQnVzaW5lc3NUb29sKHRvb2xNYW5hZ2VyXywgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX1VERElfTElOS1MiKSk7Ci0gICAgICAgIG5ldyBMaXN0V1NJTExpbmtzVG9vbCh0b29sTWFuYWdlcl8sIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9XU0lMX0xJTktTIikpOwotICAgICAgICBuZXcgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaFRvb2wodG9vbE1hbmFnZXJfLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQVRMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSCIpKTsKLSAgICAgICAgbmV3IEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1Ub29sKHRvb2xNYW5hZ2VyXywgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfV1NJTF9JTVBPUlRfVE9fRlMiKSk7Ci0gICAgICAgIG5ldyBBZGRXU0lMVG9GYXZvcml0ZXNUb29sKHRvb2xNYW5hZ2VyXywgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfV1NJTF9UT19GQVZPUklURVMiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbFNldERlZmF1bHRWaWV3VG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbFNldERlZmF1bHRWaWV3VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWY2MzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxTZXREZWZhdWx0Vmlld1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZXREZWZhdWx0Vmlld1Rvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXc2lsU2V0RGVmYXVsdFZpZXdUb29sIGV4dGVuZHMgU2V0RGVmYXVsdFZpZXdUb29sIHsKLSAgICBwdWJsaWMgV3NpbFNldERlZmF1bHRWaWV3VG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxULCBBY3Rpb25JbnB1dHMuVklFV1RPT0xJRF9ERUZBVUxULCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQsIEFjdGlvbklucHV0cy5WSUVXVE9PTElEX0RFRkFVTFQsIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC90cmFuc2Zvcm1lci9XU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC90cmFuc2Zvcm1lci9XU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzQ5ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvdHJhbnNmb3JtZXIvV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5WaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLkxpc3RVRERJQnVzaW5lc3NUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLkxpc3RVRERJU2VydmljZXNUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLkxpc3RXU0RMU2VydmljZXNUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLkxpc3RXU0lMTGlua3NUb29sOwotCi1wdWJsaWMgY2xhc3MgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lciBleHRlbmRzIFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTk9ORSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXU0RMX1NFUlZJQ0UgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVURESV9TRVJWSUNFID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFVERElfQlVTSU5FU1MgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV1NJTF9MSU5LID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZST01fVE9PTElEID0gNTsKLSAgcHJpdmF0ZSBieXRlIHR5cGU7Ci0KLSAgcHVibGljIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgdGhpcyhjb250cm9sbGVyLCAiIiwgQWN0aW9uSW5wdXRzLlZJRVdJRCwgRlJPTV9UT09MSUQpOwotICB9Ci0KLSAgcHVibGljIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoQ29udHJvbGxlciBjb250cm9sbGVyLCBTdHJpbmcgbGlzdE1hbmFnZXJLZXksIFN0cmluZyB2aWV3S2V5LCBieXRlIHR5cGUpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLCBsaXN0TWFuYWdlcktleSwgdmlld0tleSk7Ci0gICAgdGhpcy50eXBlID0gdHlwZTsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgbm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgaWYgKHR5cGUgPT0gRlJPTV9UT09MSUQpCi0gICAgewotICAgICAgTm9kZSBjdXJyTm9kZSA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgIGlmIChjdXJyTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGludCB0b29sSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEFjdGlvbklucHV0cy5UT09MSUQpKTsKLSAgICAgICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IGN1cnJOb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgICAgVG9vbCB0b29sID0gdG9vbE1hbmFnZXIuZ2V0VG9vbCh0b29sSWQpOwotICAgICAgICAgIGlmICh0b29sIGluc3RhbmNlb2YgTGlzdFdTRExTZXJ2aWNlc1Rvb2wpCi0gICAgICAgICAgICBsaXN0TWFuYWdlcktleSA9IFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NETF9TRVJWSUNFUzsKLSAgICAgICAgICBlbHNlIGlmICh0b29sIGluc3RhbmNlb2YgTGlzdFVERElTZXJ2aWNlc1Rvb2wpCi0gICAgICAgICAgICBsaXN0TWFuYWdlcktleSA9IFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUzsKLSAgICAgICAgICBlbHNlIGlmICh0b29sIGluc3RhbmNlb2YgTGlzdFVERElCdXNpbmVzc1Rvb2wpCi0gICAgICAgICAgICBsaXN0TWFuYWdlcktleSA9IFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUzsKLSAgICAgICAgICBlbHNlIGlmICh0b29sIGluc3RhbmNlb2YgTGlzdFdTSUxMaW5rc1Rvb2wpCi0gICAgICAgICAgICBsaXN0TWFuYWdlcktleSA9IFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NJTF9MSU5LUzsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5ub3JtYWxpemUocHJvcGVydGllcyk7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgTm9kZSBjdXJyTm9kZSA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoY3Vyck5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUcmVlRWxlbWVudCBjdXJyRWxlbWVudCA9IGN1cnJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBpZiAoY3VyckVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpIGN1cnJFbGVtZW50OwotICAgICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIFdTRExfU0VSVklDRSA6Ci0gICAgICAgICAgICB3c2lsRWxlbWVudC5nZXRBbGxXU0RMU2VydmljZXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVURESV9TRVJWSUNFIDoKLSAgICAgICAgICAgIHdzaWxFbGVtZW50LmdldEFsbFVERElTZXJ2aWNlcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBVRERJX0JVU0lORVNTIDoKLSAgICAgICAgICAgIHdzaWxFbGVtZW50LmdldEFsbFVERElMaW5rcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBXU0lMX0xJTksgOgotICAgICAgICAgICAgd3NpbEVsZW1lbnQuZ2V0QWxsV1NJTExpbmtzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIEZST01fVE9PTElEIDoKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnQgdG9vbElkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChBY3Rpb25JbnB1dHMuVE9PTElEKSk7Ci0gICAgICAgICAgICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gY3Vyck5vZGUuZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgVG9vbCB0b29sID0gdG9vbE1hbmFnZXIuZ2V0VG9vbCh0b29sSWQpOwotICAgICAgICAgICAgICBpZiAodG9vbCBpbnN0YW5jZW9mIExpc3RXU0RMU2VydmljZXNUb29sKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdE1hbmFnZXJLZXkgPSBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVM7Ci0gICAgICAgICAgICAgICAgd3NpbEVsZW1lbnQuZ2V0QWxsV1NETFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAodG9vbCBpbnN0YW5jZW9mIExpc3RVRERJU2VydmljZXNUb29sKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdE1hbmFnZXJLZXkgPSBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfU0VSVklDRVM7Ci0gICAgICAgICAgICAgICAgd3NpbEVsZW1lbnQuZ2V0QWxsVURESVNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAodG9vbCBpbnN0YW5jZW9mIExpc3RVRERJQnVzaW5lc3NUb29sKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdE1hbmFnZXJLZXkgPSBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfTElOS1M7Ci0gICAgICAgICAgICAgICAgd3NpbEVsZW1lbnQuZ2V0QWxsVURESUxpbmtzKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAodG9vbCBpbnN0YW5jZW9mIExpc3RXU0lMTGlua3NUb29sKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdE1hbmFnZXJLZXkgPSBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTSUxfTElOS1M7Ci0gICAgICAgICAgICAgICAgd3NpbEVsZW1lbnQuZ2V0QWxsV1NJTExpbmtzKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZGVOb3JtYWxpemUocHJvcGVydGllcyk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9hY3Rpb25zLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9hY3Rpb25zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvYWN0aW9ucy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzL2FjdGlvbnMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlcy9hY3Rpb25zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzL2FjdGlvbnMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXMvZm9ybXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlcy9mb3Jtcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlcy9mb3Jtcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlcy9zY3JpcHRzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXMvc2NyaXB0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlcy9zY3JpcHRzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzL3ZpZXdzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXMvdmlld3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXMvdmlld3MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mb3Jtcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZm9ybXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mb3Jtcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3NjcmlwdHMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3NjcmlwdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9zY3JpcHRzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpL2FjdGlvbnMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGkvYWN0aW9ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGkvYWN0aW9ucy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGkvZm9ybXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGkvZm9ybXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpL2Zvcm1zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaS9zY3JpcHRzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpL3NjcmlwdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpL3NjcmlwdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGwvYWN0aW9ucy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC9hY3Rpb25zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC9hY3Rpb25zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC9mb3Jtcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC9mb3Jtcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGwvZm9ybXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsL2ZyYWdtZW50Ly5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsL2ZyYWdtZW50Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC9mcmFnbWVudC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGwvc2NyaXB0cy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC9zY3JpcHRzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC9zY3JpcHRzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbC8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsL2FjdGlvbnMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWwvYWN0aW9ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWwvYWN0aW9ucy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWwvZm9ybXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWwvZm9ybXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsL2Zvcm1zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbC9zY3JpcHRzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsL3NjcmlwdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsL3NjcmlwdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsL3ZpZXdzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsL3ZpZXdzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbC92aWV3cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9saWIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9saWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiNTgyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamFyCi13c2V4cGxvcmVyc3JjLnppcApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL3dlYi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwMmUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IURPQ1RZUEUgd2ViLWFwcAotICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgotICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgotCi08d2ViLWFwcD4KLTwvd2ViLWFwcD4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25lbmdpbmUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25lbmdpbmUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBiMDQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9uZW5naW5lLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25FbmdpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuQWN0aW9uRGF0YVBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlNjZW5hcmlvRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlRyYW5zYWN0aW9uRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLkFjdGlvbkRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlhNTFV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5IVE1MVXRpbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIiAlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotU3RyaW5nIG1vZGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuQUNUSU9OX0VOR0lORV9NT0RFKTsKLVN0cmluZyBzY2VuYXJpbyA9IG51bGw7Ci10cnkKLXsKLSAgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyID0gbmV3IE11bHRpcGFydEZvcm1EYXRhUGFyc2VyKCk7Ci0gIHBhcnNlci5wYXJzZVJlcXVlc3QocmVxdWVzdCwgSFRNTFV0aWxzLlVURjhfRU5DT0RJTkcpOwotICBzY2VuYXJpbyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkFDVElPTl9FTkdJTkVfU0NFTkFSSU8pOwotfQotY2F0Y2ggKFRocm93YWJsZSB0KQotewotfQotQWN0aW9uRW5naW5lIGFjdGlvbkVuZ2luZSA9IGNvbnRyb2xsZXIuZ2V0QWN0aW9uRW5naW5lKCk7Ci1pZiAobW9kZSAhPSBudWxsKQotewotICBhY3Rpb25FbmdpbmUuc2V0TW9kZShBY3Rpb25FbmdpbmUuTU9ERV9ESVNBQkxFRCk7Ci0gIHRyeQotICB7Ci0gICAgYWN0aW9uRW5naW5lLnNldE1vZGUoQnl0ZS5wYXJzZUJ5dGUobW9kZSkpOwotICB9Ci0gIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICB7Ci0gIH0KLX0KLWlmIChzY2VuYXJpbyAhPSBudWxsICYmIHNjZW5hcmlvLmxlbmd0aCgpID4gMCkKLXsKLSAgU2NlbmFyaW9EZXNjcmlwdG9yIHNjZW5hcmlvRGVzY3JpcHRvciA9IG51bGw7Ci0gIHRyeQotICB7Ci0gICAgQWN0aW9uRGF0YVBhcnNlciBwYXJzZXIgPSBuZXcgQWN0aW9uRGF0YVBhcnNlcigpOwotICAgIHNjZW5hcmlvRGVzY3JpcHRvciA9IHBhcnNlci5wYXJzZVNjZW5hcmlvKFhNTFV0aWxzLnN0cmluZ1RvRWxlbWVudChzY2VuYXJpbykpOwotICAgIGFjdGlvbkVuZ2luZS5leGVjdXRlU2NlbmFyaW8oc2NlbmFyaW9EZXNjcmlwdG9yKTsKLSAgfQotICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gIHsKLSAgfQotICBpZiAoc2NlbmFyaW9EZXNjcmlwdG9yICE9IG51bGwpCi0gIHsKLSAgICBUcmFuc2FjdGlvbkRlc2NyaXB0b3JbXSB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzID0gc2NlbmFyaW9EZXNjcmlwdG9yLmdldFRyYW5zYWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQWN0aW9uRGVzY3JpcHRvcltdIGFjdGlvbkRlc2NyaXB0b3JzID0gdHJhbnNhY3Rpb25EZXNjcmlwdG9yc1tpXS5nZXRBY3Rpb25EZXNjcmlwdG9ycygpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgJT4KLSAgICAgICAgPCEtLQotICAgICAgICA8JT1hY3Rpb25EZXNjcmlwdG9yc1tqXS5nZXRJZCgpJT4KLSAgICAgICAgPCU9YWN0aW9uRGVzY3JpcHRvcnNbal0uZ2V0U3RhdHVzSWQoKSU+Ci0gICAgICAgIDwlCi0gICAgICAgIExpc3Qgc3RhdHVzID0gYWN0aW9uRGVzY3JpcHRvcnNbal0uZ2V0U3RhdHVzKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzdGF0dXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAlPgotICAgICAgICAgICAgPCU9aXQubmV4dCgpLnRvU3RyaW5nKCklPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgJT4KLSAgICAgICAgLS0+Ci0gICAgICAgIDwlCi0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25lbmdpbmVfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9uZW5naW5lX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZmM2Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25lbmdpbmVfY29udGFpbmVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25FbmdpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LioiICU+Ci08JQotU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci1Db250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLUFjdGlvbkVuZ2luZSBhY3Rpb25FbmdpbmUgPSBjb250cm9sbGVyLmdldEFjdGlvbkVuZ2luZSgpOwotU3RyaW5nIG1vZGVTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuQUNUSU9OX0VOR0lORV9NT0RFKTsKLWlmIChtb2RlU3RyaW5nICE9IG51bGwgJiYgbW9kZVN0cmluZy5sZW5ndGgoKSA+IDApCi17Ci0gIHRyeQotICB7Ci0gICAgYnl0ZSBtb2RlID0gQnl0ZS5wYXJzZUJ5dGUobW9kZVN0cmluZyk7Ci0gICAgYWN0aW9uRW5naW5lLnNldE1vZGUobW9kZSk7Ci0gIH0KLSAgY2F0Y2ggKFRocm93YWJsZSB0KQotICB7Ci0gIH0KLX0KLVN0cmluZyBwbGF5RmlsZUlkID0gInBsYXlGaWxlSWQiOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiVElUTEVfQUNUSU9OX1JFQ09SREVSIiklPjwvdGl0bGU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGZ1bmN0aW9uIHNldE1vZGUobW9kZSkKLSAgICB7Ci0gICAgICA8JQotICAgICAgU3RyaW5nQnVmZmVyIGZvcm1BY3Rpb24gPSBuZXcgU3RyaW5nQnVmZmVyKHJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiYWN0aW9uZW5naW5lX2NvbnRhaW5lci5qc3A/IikpKTsKLSAgICAgIGZvcm1BY3Rpb24uYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgICAgZm9ybUFjdGlvbi5hcHBlbmQoIj0iKTsKLSAgICAgIGZvcm1BY3Rpb24uYXBwZW5kKHNlc3Npb25JZCk7Ci0gICAgICBmb3JtQWN0aW9uLmFwcGVuZCgiJiIpOwotICAgICAgZm9ybUFjdGlvbi5hcHBlbmQoQWN0aW9uSW5wdXRzLkFDVElPTl9FTkdJTkVfTU9ERSk7Ci0gICAgICBmb3JtQWN0aW9uLmFwcGVuZCgiPSIpOwotICAgICAgJT4KLSAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZm9ybXNbMF07Ci0gICAgICBmb3JtLmFjdGlvbiA9ICc8JT1mb3JtQWN0aW9uLnRvU3RyaW5nKCklPicgKyBtb2RlOwotICAgICAgZm9ybS50YXJnZXQgPSAiX3NlbGYiOwotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBwbGF5KCkKLSAgICB7Ci0gICAgICB2YXIgcGxheUZpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiPCU9cGxheUZpbGVJZCU+Iik7Ci0gICAgICBpZiAocGxheUZpbGUudmFsdWUgIT0gbnVsbCAmJiBwbGF5RmlsZS52YWx1ZS5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmZvcm1zWzBdOwotICAgICAgICBmb3JtLmFjdGlvbiA9ICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZXhwbG9yZXIuanNwIikpJT4nOwotICAgICAgICBmb3JtLnRhcmdldCA9ICI8JT1GcmFtZU5hbWVzLldJTkRPV19OQU1FX1dTRVhQTE9SRVJfSlNQJT4iOwotICAgICAgICBmb3JtLmVuY3R5cGUgPSAibXVsdGlwYXJ0L2Zvcm0tZGF0YSI7Ci0gICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIGZvcm0uZW5jb2RpbmcgPSAibXVsdGlwYXJ0L2Zvcm0tZGF0YSI7Ci0gICAgICAgIGZvcm0uc3VibWl0KCk7Ci0gICAgICAgIHNldE1vZGUoJzwlPUFjdGlvbkVuZ2luZS5NT0RFX1BMQVklPicpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBhbGVydCgnPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9QTEFZX0ZJTEUiKSU+Jyk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2F2ZSgpCi0gICAgewotICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtc1swXTsKLSAgICAgIGZvcm0uYWN0aW9uID0gJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiYWN0aW9ucy9TYXZlQWN0aW9uRW5naW5lU2NlbmFyaW8uanNwIikpJT4nOwotICAgICAgZm9ybS50YXJnZXQgPSAiX3NlbGYiOwotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICB9Ci0gIDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KLSAgICA8JQotICAgIFN0cmluZyBsYWJlbE1vZGVQbGF5ID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01PREVfUExBWSIpOwotICAgIFN0cmluZyBsYWJlbE1vZGVTdG9wID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01PREVfU1RPUCIpOwotICAgIFN0cmluZyBsYWJlbE1vZGVSZWNvcmQgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTU9ERV9SRUNPUkQiKTsKLSAgICBTdHJpbmcgbGFiZWxTYXZlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NBVkUiKTsKLSAgICBieXRlIG1vZGUgPSBhY3Rpb25FbmdpbmUuZ2V0TW9kZSgpOwotICAgIFN0cmluZyBpbWdQbGF5ID0gKG1vZGUgPT0gQWN0aW9uRW5naW5lLk1PREVfUExBWSkgPyAiaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfcGxheS5naWYiIDogImltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3BsYXkuZ2lmIjsKLSAgICBTdHJpbmcgaW1nU3RvcCA9IChtb2RlID09IEFjdGlvbkVuZ2luZS5NT0RFX1NUT1ApID8gImltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3N0b3AuZ2lmIiA6ICJpbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9zdG9wLmdpZiI7Ci0gICAgU3RyaW5nIGltZ1JlY29yZCA9IChtb2RlID09IEFjdGlvbkVuZ2luZS5NT0RFX1JFQ09SRCkgPyAiaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfcmVjb3JkLmdpZiIgOiAiaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfcmVjb3JkLmdpZiI7Ci0gICAgU3RyaW5nIGltZ1NhdmUgPSAiaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfc2F2ZS5naWYiOwotICAgICU+Ci0gICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9Mz4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgY2xhc3M9ImxhYmVscyIgbm93cmFwPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cGxheSgpIj4KLSAgICAgICAgICAgIDxpbWcgY2xhc3M9Im5vcm1hbCIgYm9yZGVyPTAgYWx0PSI8JT1sYWJlbE1vZGVQbGF5JT4iIHRpdGxlPSI8JT1sYWJlbE1vZGVQbGF5JT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGltZ1BsYXkpKSU+Ij4KLSAgICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NT0RFX1BMQVkiKSU+Ci0gICAgICAgICAgPC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIiBub3dyYXA+Ci0gICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXRNb2RlKCc8JT1TdHJpbmcudmFsdWVPZihBY3Rpb25FbmdpbmUuTU9ERV9TVE9QKSU+JykiPgotICAgICAgICAgICAgPGltZyBjbGFzcz0ibm9ybWFsIiBib3JkZXI9MCBhbHQ9IjwlPWxhYmVsTW9kZVN0b3AlPiIgdGl0bGU9IjwlPWxhYmVsTW9kZVN0b3AlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoaW1nU3RvcCkpJT4iPgotICAgICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01PREVfU1RPUCIpJT4KLSAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiIG5vd3JhcD4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnNldE1vZGUoJzwlPVN0cmluZy52YWx1ZU9mKEFjdGlvbkVuZ2luZS5NT0RFX1JFQ09SRCklPicpIj4KLSAgICAgICAgICAgIDxpbWcgY2xhc3M9Im5vcm1hbCIgYm9yZGVyPTAgYWx0PSI8JT1sYWJlbE1vZGVSZWNvcmQlPiIgdGl0bGU9IjwlPWxhYmVsTW9kZVJlY29yZCU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChpbWdSZWNvcmQpKSU+Ij4KLSAgICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NT0RFX1JFQ09SRCIpJT4KLSAgICAgICAgICA8L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiIG5vd3JhcD4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnNhdmUoKSI+Ci0gICAgICAgICAgICA8aW1nIGNsYXNzPSJub3JtYWwiIGJvcmRlcj0wIGFsdD0iPCU9bGFiZWxTYXZlJT4iIHRpdGxlPSI8JT1sYWJlbFNhdmUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoaW1nU2F2ZSkpJT4iPgotICAgICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NBVkUiKSU+Ci0gICAgICAgICAgPC9hPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTM+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiIG5vd3JhcD48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUExBWV9GSUxFIiklPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iPCU9cGxheUZpbGVJZCU+IiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuQUNUSU9OX0VOR0lORV9TQ0VOQVJJTyU+Ij4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9mb3JtPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0NoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhOWE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0UGFuZXNGaWxlKCkpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSI8JT1wYW5lc0ZpbGUudG9TdHJpbmcoKSU+IiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotPCUKLSAgIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IChJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbilzZXNzaW9uLmdldEF0dHJpYnV0ZShBY3Rpb25JbnB1dHMuSU1QT1JUX0FDVElPTik7Ci0gICBpZiAoYWN0aW9uLmlzVGFyZ2V0RmlsZVJlc291cmNlUmVhZE9ubHkoKSkKLSAgIHsKLSU+Ci0gIHZhciBwcm9jZWVkID0gdHJ1ZTsKLTwlICAgCi0gICAgIGlmICghYWN0aW9uLmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSkKLSAgICAgewotJT4KLSAgcHJvY2VlZCA9IGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZShhY3Rpb24uZ2V0V2ViU2VydmljZVBsdWdpbkZpbGVNZXNzYWdlKCJNU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRCIpKSU+Iik7Ci08JSAgICAgCi0gICAgIH0KLSU+Ci0gIGlmIChwcm9jZWVkKQotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFZhbGlkYXRlRWRpdEFjdGlvbi5nZXRBY3Rpb25MaW5rKCkpKSU+IjsKLTwlICAgICAKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFdyaXRlV1NETFRvV29ya2JlbmNoQWN0aW9uLmdldEFjdGlvbkxpbmsoKSkpJT4iOwotPCUKLSAgIH0KLSU+ICAgICAKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPiAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2xlYXJOb2RlQWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmOTgxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2xlYXJOb2RlQWN0aW9uLmluYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCUKLSAgIFBlcnNwZWN0aXZlIGN1cnJlbnRQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgeyAgICAKLTwlCi0gICBTdHJpbmcgdHJlZUNvbnRlbnRWYXIgPSBhY3Rpb24uZ2V0VHJlZUNvbnRlbnRWYXIoKTsKLSAgIGlmICh0cmVlQ29udGVudFZhciAhPSBudWxsKQotICAgewotJT4KLSAgICA8JT10cmVlQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0VHJlZUNvbnRlbnRQYWdlKCkpKSU+IjsKLTwlCi0gICB9Ci0gICBTdHJpbmcgcHJvcGVydGllc0NvbnRhaW5lclZhciA9IGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gICBpZiAocHJvcGVydGllc0NvbnRhaW5lclZhciAhPSBudWxsKQotICAgewotJT4KLSAgICA8JT1wcm9wZXJ0aWVzQ29udGFpbmVyVmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpKSklPiI7Ci08JSAgIAotICAgfQotICAgU3RyaW5nIHN0YXR1c0NvbnRlbnRWYXIgPSBhY3Rpb24uZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICAgaWYgKHN0YXR1c0NvbnRlbnRWYXIgIT0gbnVsbCkKLSAgIHsKLSU+Ci0gICAgPCU9c3RhdHVzQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSkpJT4iOwotPCUKLSAgIH0KLSU+Ci0gIH0KLSAgZWxzZQotICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoY3VycmVudFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudFBhZ2UoKSkpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2xlYXJWaWV3RWxlbWVudEFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2xlYXJWaWV3RWxlbWVudEFjdGlvbi5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZWUxMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0NsZWFyVmlld0VsZW1lbnRBY3Rpb24uaW5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JQotICAgUGVyc3BlY3RpdmUgY3VycmVudFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIHBhbmVzRmlsZS5hcHBlbmQoY3VycmVudFBlcnNwZWN0aXZlLmdldFBhbmVzRmlsZSgpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9cGFuZXNGaWxlLnRvU3RyaW5nKCklPiIgZmx1c2g9InRydWUiLz4KLTxoZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotPCUKLSAgIFN0cmluZyBwcm9wZXJ0aWVzQ29udGFpbmVyVmFyID0gYWN0aW9uLmdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgIGlmIChwcm9wZXJ0aWVzQ29udGFpbmVyVmFyICE9IG51bGwpCi0gICB7Ci0lPgotICA8JT1wcm9wZXJ0aWVzQ29udGFpbmVyVmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpKSklPiI7Ci08JQotICAgfQotICAgU3RyaW5nIHN0YXR1c0NvbnRlbnRWYXIgPSBhY3Rpb24uZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICAgaWYgKHN0YXR1c0NvbnRlbnRWYXIgIT0gbnVsbCkKLSAgIHsKLSU+Ci0gIDwlPXN0YXR1c0NvbnRlbnRWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRQYWdlKCkpKSU+IjsKLTwlCi0gICB9Ci0lPgotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg2YjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uaW5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBydW4gdGhlIGFjdGlvbgotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24ucnVuKCk7Ci0gICBib29sZWFuIHdyaXR0ZW4gPSBmYWxzZTsKLQotICAgaWYgKGFjdGlvblJlc3VsdCkKLSAgIHsKLSAgICAgLy8gd3JpdGUgdG8gZmlsZSBzeXN0ZW0KLSAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCJhdHRhY2htZW50O2ZpbGVuYW1lPSIrYWN0aW9uLmdldERlZmF1bHRGaWxlTmFtZSgpKTsKLSAgICAgYWN0aW9uLndyaXRlKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgd3JpdHRlbiA9IHRydWU7Ci0gICB9Ci0KLSAgIGlmICghd3JpdHRlbikKLSAgIHsKLSU+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPCUKLSAgICAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICAgICBwYW5lc0ZpbGUuYXBwZW5kKGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0UGFuZXNGaWxlKCkpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSI8JT1wYW5lc0ZpbGUudG9TdHJpbmcoKSU+IiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAgICBpZiAoYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRWYXIoKSAhPSBudWxsKQotICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICA8JT1hY3Rpb24uZ2V0U3RhdHVzQ29udGVudFZhcigpJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRTdGF0dXNDb250ZW50UGFnZSgpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgICB9Ci0lPiAgICAgIAotPC9ib2R5PgotPC9odG1sPgotPCUKLSAgIH0KLSU+ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJhZDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIHBhbmVzRmlsZS5hcHBlbmQoY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci08JQotICAgLy9Mb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotICAgaWYgKCFpbnB1dHNWYWxpZCkKLSAgIHsKLSAgICAgU3RyaW5nIHN0YXR1c0NvbnRlbnRWYXIgPSBhY3Rpb24uZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICAgICBpZiAoc3RhdHVzQ29udGVudFZhciAhPSBudWxsKQotICAgICB7Ci0lPgotICA8JT1zdGF0dXNDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRTdGF0dXNDb250ZW50UGFnZSgpKSklPiI7Ci08JQotICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKEFjdGlvbklucHV0cy5JTVBPUlRfQUNUSU9OLGFjdGlvbik7ICAgCi0gICAgIGlmIChhY3Rpb24uZmlsZUV4aXN0cygpKQotICAgICB7Ci0lPgotICB2YXIgcHJvY2VlZCA9IHRydWU7Ci08JSAgICAgICAgCi0gICAgICAgaWYgKCFhY3Rpb24uaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSkKLSAgICAgICB7Ci0lPgotICBwcm9jZWVkID0gY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGFjdGlvbi5nZXRXZWJTZXJ2aWNlUGx1Z2luRmlsZU1lc3NhZ2UoIk1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRCIpKSU+Iik7Ci08JQotICAgICAgIH0KLSU+Ci0gIGlmIChwcm9jZWVkKQotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KENoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uLmdldEFjdGlvbkxpbmsoKSkpJT4iOwotPCUKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSU+Ci0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFdyaXRlV1NETFRvV29ya2JlbmNoQWN0aW9uLmdldEFjdGlvbkxpbmsoKSkpJT4iOwotPCUKLSAgICAgfQotICAgfQotJT4KLTwvc2NyaXB0PiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uaW5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJkZWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmluYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCUKLSAgIC8vTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5ydW4oKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0UGFuZXNGaWxlKCkpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSI8JT1wYW5lc0ZpbGUudG9TdHJpbmcoKSU+IiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICBpZiAoIWFjdGlvblJlc3VsdCkKLSAgIHsKLSAgICAgU3RyaW5nIHN0YXR1c0NvbnRlbnRWYXIgPSBhY3Rpb24uZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICAgICBpZiAoc3RhdHVzQ29udGVudFZhciAhPSBudWxsKQotICAgICB7Ci0lPiAgICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICA8JT1zdGF0dXNDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRTdGF0dXNDb250ZW50UGFnZSgpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgIH0KLSU+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvUmV0cmlldmVIaXN0b3J5QWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9SZXRyaWV2ZUhpc3RvcnlBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWUxOWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9SZXRyaWV2ZUhpc3RvcnlBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJldHJpZXZlSGlzdG9yeUFjdGlvbiBhY3Rpb24gPSBuZXcgUmV0cmlldmVIaXN0b3J5QWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24ucnVuKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IFVURi04Ij4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLTwlCi0gICBCcmVhZENydW1iIGIgPSBhY3Rpb24uZ2V0QnJlYWRDcnVtYigpOwotICAgaWYgKGIgIT0gbnVsbCkKLSAgIHsKLSAgICAgaW50IGJyZWFkQ3J1bWJQZXJzcGVjdGl2ZUlkID0gYi5nZXRQZXJzcGVjdGl2ZUlkKCk7Ci0gICAgIGlmIChicmVhZENydW1iUGVyc3BlY3RpdmVJZCAhPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldFBlcnNwZWN0aXZlSWQoKSkKLSAgICAgewotICAgICAgIC8vIFN3aXRjaCB0aGUgcGVyc3BlY3RpdmUuCi0lPgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhicmVhZENydW1iUGVyc3BlY3RpdmVJZCx0cnVlKSkpJT4iOwotPCUKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAvLyBKdW1wIHRvIHRoZSBwYWdlIHJldHJpZXZlZCBmcm9tIGhpc3RvcnkuCi0lPgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYi5nZXRVUkwoKSkpJT4iOwotPCUKLSAgICAgfQotICAgfQotJT4KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1NhdmVBY3Rpb25FbmdpbmVTY2VuYXJpby5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2F2ZUFjdGlvbkVuZ2luZVNjZW5hcmlvLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwYjlkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2F2ZUFjdGlvbkVuZ2luZVNjZW5hcmlvLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlNjZW5hcmlvRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25EYXRhUGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5YTUxVdGlscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby5QcmludFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCIlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotcmVzcG9uc2Uuc2V0SGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uIiwiYXR0YWNobWVudDtmaWxlbmFtZT1zY2VuYXJpby54bWwiKTsKLVNjZW5hcmlvRGVzY3JpcHRvciBzY2VuYXJpb0Rlc2NyaXB0b3IgPSBjb250cm9sbGVyLmdldEFjdGlvbkVuZ2luZSgpLmdldFNjZW5hcmlvKCk7Ci1BY3Rpb25EYXRhUGFyc2VyIHBhcnNlciA9IG5ldyBBY3Rpb25EYXRhUGFyc2VyKCk7Ci1FbGVtZW50IHNjZW5hcmlvID0gcGFyc2VyLnRvRWxlbWVudChzY2VuYXJpb0Rlc2NyaXB0b3IpOwotaWYgKHNjZW5hcmlvICE9IG51bGwpCi17Ci0gIHRyeQotICB7Ci0gICAgU3RyaW5nIHNjZW5hcmlvU3RyaW5nID0gWE1MVXRpbHMuc2VyaWFsaXplKHNjZW5hcmlvLCBmYWxzZSk7Ci0gICAgaWYgKHNjZW5hcmlvU3RyaW5nICE9IG51bGwpCi0gICAgewotICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgcHcucHJpbnRsbihzY2VuYXJpb1N0cmluZyk7Ci0gICAgICBwdy5jbG9zZSgpOwotICAgIH0KLSAgfQotICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gIHsKLSAgfQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmM2VmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2VsZWN0Tm9kZUFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JQotICAgUGVyc3BlY3RpdmUgY3VycmVudFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgVVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIGlmICghYWN0aW9uUmVzdWx0KQotICAgewotICAgICBpZiAoYWN0aW9uLmlzU3RhbGVCcmVhZENydW1iKCkpCi0gICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgLy8gUmVydW4gdGhlIGhpc3RvcnkgYWN0aW9uIHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgaXRlbS4KLSAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldE5leHRIaXN0b3J5QWN0aW9uTGluaygpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgU3RyaW5nIHRyZWVDb250ZW50VmFyID0gYWN0aW9uLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gICAgIFN0cmluZyBwcm9wZXJ0aWVzQ29udGFpbmVyVmFyID0gYWN0aW9uLmdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgICAgaWYgKGFjdGlvbi5yZXF1aXJlc1RyZWVWaWV3UmVmcmVzaCgpKQotICAgICB7Ci0gICAgICAgaWYgKHRyZWVDb250ZW50VmFyICE9IG51bGwpCi0gICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICAvLyBVcGRhdGUgdGhlIHRyZWV2aWV3LgotICAgIDwlPXRyZWVDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRUcmVlQ29udGVudFBhZ2UoKSkpJT4iOwotICB9Ci0gIGVsc2UKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCkpKSU+IjsgIAotPC9zY3JpcHQ+Ci08JQotICAgICAgIH0KLSAgICAgICBpZiAocHJvcGVydGllc0NvbnRhaW5lclZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGlzTWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcigpKQotICAgIDwlPXByb3BlcnRpZXNDb250YWluZXJWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBhY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICBOb2RlIHByZXZpb3VzU2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0UHJldmlvdXNTZWxlY3RlZE5vZGUoKTsKLSAgICAgICBpbnQgc2VsZWN0ZWROb2RlSWQgPSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaWYgKHRyZWVDb250ZW50VmFyICE9IG51bGwpCi0gICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAvLyBVcGRhdGUgdGhlIHBlcnNwZWN0aXZlLgotPCUKLSAgICAgICAgIGlmIChwcmV2aW91c1NlbGVjdGVkTm9kZSAhPSBudWxsICYmIHByZXZpb3VzU2VsZWN0ZWROb2RlLmlzVmlzaWJsZSgpKQotICAgICAgICAgewotJT4KLSAgPCU9dHJlZUNvbnRlbnRWYXIlPi5hbHRlckltYWdlKCc8JT1wcmV2aW91c1NlbGVjdGVkTm9kZS5nZXRBbmNob3JOYW1lKCklPicsJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChwcmV2aW91c1NlbGVjdGVkTm9kZS5nZXRDbG9zZWRJbWFnZVBhdGgoKSkpJT4nKTsKLTwlCi0gICAgICAgICB9Ci0gICAgICAgICBTdHJpbmcgc2VsZWN0ZWROb2RlQW5jaG9yTmFtZSA9IHNlbGVjdGVkTm9kZS5nZXRBbmNob3JOYW1lKCk7Ci0lPgotICA8JT10cmVlQ29udGVudFZhciU+LnNlbGVjdE5vZGUoJzwlPXNlbGVjdGVkTm9kZUFuY2hvck5hbWUlPicsJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChzZWxlY3RlZE5vZGUuZ2V0T3BlbkltYWdlUGF0aCgpKSklPicpOwotICA8JT10cmVlQ29udGVudFZhciU+LmxvY2F0aW9uLmhhc2ggPSAnIzwlPXNlbGVjdGVkTm9kZUFuY2hvck5hbWUlPic7Ci08JQotICAgICAgIH0KLSAgICAgICBpZiAocHJvcGVydGllc0NvbnRhaW5lclZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci0gIDwlPXByb3BlcnRpZXNDb250YWluZXJWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkpKSU+IjsKLTwlCi0gICAgICAgfQotJT4KLTwvc2NyaXB0PgotPCUKLSAgICAgfQotICAgfQotJT4KLTwvYm9keT4KLTxodG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMzdmMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmluYworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlCi0gICBQZXJzcGVjdGl2ZSBjdXJyZW50UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBVVEYtOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIHBhbmVzRmlsZS5hcHBlbmQoY3VycmVudFBlcnNwZWN0aXZlLmdldFBhbmVzRmlsZSgpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9cGFuZXNGaWxlLnRvU3RyaW5nKCklPiIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgaWYgKCFhY3Rpb25SZXN1bHQpCi0gICB7Ci0gICAgIGlmIChhY3Rpb24uaXNTdGFsZUJyZWFkQ3J1bWIoKSkKLSAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAvLyBSZXJ1biB0aGUgaGlzdG9yeSBhY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBpdGVtLgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0TmV4dEhpc3RvcnlBY3Rpb25MaW5rKCkpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgICAgfQotICAgfQotICAgZWxzZQotICAgewotICAgICBpZiAoYWN0aW9uLnJlcXVpcmVzU3RhdHVzVXBkYXRlKCkpCi0gICAgIHsKLSAgICAgICBTdHJpbmcgc3RhdHVzQ29udGVudFZhciA9IGFjdGlvbi5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICAgICAgaWYgKHN0YXR1c0NvbnRlbnRWYXIgIT0gbnVsbCkKLSAgICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIC8vIFVwZGF0ZSB0aGUgc3RhdHVzIGNvbnRlbnQgd2l0aCBhbnkgbWVzc2FnZXMgYXJpc2luZyBmcm9tIHRoaXMgYWN0aW9uLgotICA8JT1zdGF0dXNDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRTdGF0dXNDb250ZW50UGFnZSgpKSklPiI7Ci08L3NjcmlwdD4gIAotPCUgICAgCi0gICAgICAgfQotICAgICB9IAotICAgICAgICAKLSAgICAgU3RyaW5nIHRyZWVDb250ZW50VmFyID0gYWN0aW9uLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gICAgIFN0cmluZyBwcm9wZXJ0aWVzQ29udGFpbmVyVmFyID0gYWN0aW9uLmdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgICAgaWYgKGFjdGlvbi5yZXF1aXJlc1RyZWVWaWV3UmVmcmVzaCgpKQotICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci08JQotICAgICAgIGlmICh0cmVlQ29udGVudFZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgewotICAgIC8vIFJlbG9hZCB0aGUgbmF2aWdhdG9yIHRyZWUgdmlldyB0byBzaG93IHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZS4KLSAgICA8JT10cmVlQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0VHJlZUNvbnRlbnRQYWdlKCkpKSU+IjsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCkpKSU+IjsKLSAgfQotPCUKLSAgICAgICB9Ci0gICAgICAgaWYgKHByb3BlcnRpZXNDb250YWluZXJWYXIgIT0gbnVsbCkKLSAgICAgICB7Ci0lPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gICAgPCU9cHJvcGVydGllc0NvbnRhaW5lclZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSkpJT4iOwotPCUKLSAgICAgICB9Ci0lPgotPC9zY3JpcHQ+Ci08JQotICAgICB9Ci0gICAgIGVsc2UgaWYgKGFjdGlvbi5yZXF1aXJlc05vZGVTZWxlY3Rpb24oKSkKLSAgICAgewotICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gYWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgTm9kZSBwcmV2aW91c1NlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFByZXZpb3VzU2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgaW50IHNlbGVjdGVkTm9kZUlkID0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotPCUKLSAgICAgICBpZiAodHJlZUNvbnRlbnRWYXIgIT0gbnVsbCkKLSAgICAgICB7Ci0lPgotICAvLyBVcGRhdGUgdGhlIG5hdmlnYXRvciB0cmVlIHRvIHNob3cgdGhlIHNlbGVjdGlvbi4KLTwlCi0gICAgICAgICBpZiAocHJldmlvdXNTZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgICAgICAgIHsKLSU+Ci0gIDwlPXRyZWVDb250ZW50VmFyJT4uYWx0ZXJJbWFnZSgnPCU9cHJldmlvdXNTZWxlY3RlZE5vZGUuZ2V0QW5jaG9yTmFtZSgpJT4nLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQocHJldmlvdXNTZWxlY3RlZE5vZGUuZ2V0Q2xvc2VkSW1hZ2VQYXRoKCkpKSU+Jyk7Ci08JQotICAgICAgICAgfQotICAgICAgICAgU3RyaW5nIHNlbGVjdGVkTm9kZUFuY2hvck5hbWUgPSBzZWxlY3RlZE5vZGUuZ2V0QW5jaG9yTmFtZSgpOwotJT4KLSAgPCU9dHJlZUNvbnRlbnRWYXIlPi5zZWxlY3ROb2RlKCc8JT1zZWxlY3RlZE5vZGVBbmNob3JOYW1lJT4nLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoc2VsZWN0ZWROb2RlLmdldE9wZW5JbWFnZVBhdGgoKSkpJT4nKTsKLSAgPCU9dHJlZUNvbnRlbnRWYXIlPi5sb2NhdGlvbi5oYXNoID0gJyM8JT1zZWxlY3RlZE5vZGVBbmNob3JOYW1lJT4nOwotPCUKLSAgICAgICB9Ci0gICAgICAgaWYgKHByb3BlcnRpZXNDb250YWluZXJWYXIgIT0gbnVsbCkKLSAgICAgICB7Ci0lPgotICA8JT1wcm9wZXJ0aWVzQ29udGFpbmVyVmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpKSklPiI7Ci08JQotICAgICAgIH0KLSU+Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgICAgZWxzZSBpZiAoYWN0aW9uLnJlcXVpcmVzVmlld1NlbGVjdGlvbigpKQotICAgICB7Ci0gICAgICAgaWYgKHByb3BlcnRpZXNDb250YWluZXJWYXIgIT0gbnVsbCkKLSAgICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIC8vIFVwZGF0ZSB0aGUgcHJvcGVydGllcyBjb250YWluZXIgdG8gc2hvdyB0aGUgdmlldy4KLSAgPCU9cHJvcGVydGllc0NvbnRhaW5lclZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBTdHJpbmcgcHJvcGVydGllc0NvbnRlbnRWYXIgPSBhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRlbnRWYXIoKTsKLSAgICAgICBUb29sIHRvb2wgPSBhY3Rpb24uZ2V0U2VsZWN0ZWRWaWV3VG9vbCgpOwotICAgICAgIGlmICh0b29sID09IG51bGwpCi0gICAgICAgICB0b29sID0gYWN0aW9uLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgIGlmICh0b29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikKLSAgICAgICB7Ci0gICAgICAgICBpZiAocHJvcGVydGllc0NvbnRlbnRWYXIgIT0gbnVsbCkKLSAgICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgLy8gVXBkYXRlIHRoZSBwcm9wZXJ0aWVzIGNvbnRlbnQgd2l0aCB0aGUgdG9vbCdzIGZvcm0uCi0gIDwlPXByb3BlcnRpZXNDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRvb2wuZ2V0Rm9ybUxpbmsoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgaWYgKCFhY3Rpb24uaXNIaXN0b3J5QWN0aW9uKCkpCi0gICAgICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIC8vIFJ1biB0aGUgdG9vbCdzIGFjdGlvbiBvbmx5IGlmIGl0IGlzIG5vdCBmcm9tIHRoZSBoaXN0b3J5LgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh0b29sLmdldEFjdGlvbkxpbmsoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICBpZiAocHJvcGVydGllc0NvbnRlbnRWYXIgIT0gbnVsbCkKLSAgICAgICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICA8JT1wcm9wZXJ0aWVzQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRlbnRQYWdlKCkpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgfQotJT4KLTwvYm9keT4KLTxodG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1Nob3dQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2hvd1BlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxZGRlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2hvd1BlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBQZXJzcGVjdGl2ZSBjdXJyZW50UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nQnVmZmVyIGZyYW1lc2V0c0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBmcmFtZXNldHNGaWxlLmFwcGVuZChjdXJyZW50UGVyc3BlY3RpdmUuZ2V0RnJhbWVzZXRzRmlsZSgpKTsKLSAgIAotICAgU3RyaW5nQnVmZmVyIGZyYW1lc2V0c0Zvcm0gPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBmcmFtZXNldHNGb3JtLmFwcGVuZChjdXJyZW50UGVyc3BlY3RpdmUuZ2V0UHJvY2Vzc0ZyYW1lc2V0c0Zvcm0oKSk7Ci0gICAKLSAgIGludCB0YXJnZXRQZXJzcGVjdGl2ZUlkOwotICAgYm9vbGVhbiBpc0hpc3Rvcnk7Ci0gICB0cnkKLSAgIHsKLSAgICAgdGFyZ2V0UGVyc3BlY3RpdmVJZCA9IEludGVnZXIucGFyc2VJbnQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFKSk7Ci0gICAgIGlzSGlzdG9yeSA9ICgiMSIuZXF1YWxzKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpKSk7Ci0gICB9Ci0gICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICB7Ci0gICAgIHRhcmdldFBlcnNwZWN0aXZlSWQgPSBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESTsKLSAgICAgaXNIaXN0b3J5ID0gZmFsc2U7Ci0gICB9Ci0gICAKLSAgIGlmIChjb250cm9sbGVyLmlzUGVyc3BlY3RpdmVDb250ZW50QmxhbmsoKSkKLSAgIHsKLSAgICAgY29udHJvbGxlci5lbmFibGVQZXJzcGVjdGl2ZUNvbnRlbnRCbGFuayhmYWxzZSk7Ci0gICAgIGNvbnRyb2xsZXIuYWRkVG9IaXN0b3J5KGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUlkKCksU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0UGVyc3BlY3RpdmVJZCx0cnVlKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3N3aXRjaHBlcnNwZWN0aXZlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9ZnJhbWVzZXRzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1BY3Rpb24uYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRTd2l0Y2hQZXJzcGVjdGl2ZUZvcm1BY3Rpb25MaW5rKHRhcmdldFBlcnNwZWN0aXZlSWQsaXNIaXN0b3J5KSk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9ZnJhbWVzZXRzRm9ybS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+Ci08JQotICAgfQotJT4gICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2ZmU5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvVG9nZ2xlTm9kZUFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlCi0gICBQZXJzcGVjdGl2ZSBjdXJyZW50UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBVVEYtOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIHBhbmVzRmlsZS5hcHBlbmQoY3VycmVudFBlcnNwZWN0aXZlLmdldFBhbmVzRmlsZSgpKTsKLSU+ICAgICAKLTxqc3A6aW5jbHVkZSBwYWdlPSI8JT1wYW5lc0ZpbGUudG9TdHJpbmcoKSU+IiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PiAgCi08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIGlmICghYWN0aW9uUmVzdWx0KQotICAgewotICAgICBpZiAoYWN0aW9uLmlzU3RhbGVCcmVhZENydW1iKCkpCi0gICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgLy8gUmVydW4gdGhlIGhpc3RvcnkgYWN0aW9uIHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgaXRlbS4KLSAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldE5leHRIaXN0b3J5QWN0aW9uTGluaygpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgU3RyaW5nIHRyZWVDb250ZW50VmFyID0gYWN0aW9uLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gICAgIGlmICh0cmVlQ29udGVudFZhciAhPSBudWxsKQotICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgewotICAgIC8vIFVwZGF0ZSB0aGUgcGVyc3BlY3RpdmUuCi0gICAgPCU9dHJlZUNvbnRlbnRWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFRyZWVDb250ZW50UGFnZSgpKSklPiI7Ci0gIH0KLSAgZWxzZQotICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoY3VycmVudFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudFBhZ2UoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICB9Ci0gICAgIGlmIChhY3Rpb24ucmVxdWlyZXNOb2RlU2VsZWN0aW9uKCkpCi0gICAgIHsKLSAgICAgICBTdHJpbmcgcHJvcGVydGllc0NvbnRhaW5lclZhciA9IGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gICAgICAgaWYgKHByb3BlcnRpZXNDb250YWluZXJWYXIgIT0gbnVsbCkKLSAgICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgewotICAgIC8vIFVwZGF0ZSB0aGUgcHJvcGVydGllcyBjb250YWluZXIuCi0gICAgPCU9cHJvcGVydGllc0NvbnRhaW5lclZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSkpJT4iOwotICB9Ci08L3NjcmlwdD4KLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0lPgotPC9ib2R5PgotPGh0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvVmFsaWRhdGVFZGl0QWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9WYWxpZGF0ZUVkaXRBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDUzODMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9WYWxpZGF0ZUVkaXRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0UGFuZXNGaWxlKCkpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSI8JT1wYW5lc0ZpbGUudG9TdHJpbmcoKSU+IiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSAoSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24pc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoQWN0aW9uSW5wdXRzLklNUE9SVF9BQ1RJT04pOwotICAgYm9vbGVhbiByZXN1bHQgPSBhY3Rpb24udmFsaWRhdGVFZGl0KCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmICg8JT1yZXN1bHQlPikKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChXcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbi5nZXRBY3Rpb25MaW5rKCkpKSU+IjsKLSAgZWxzZQotICB7Ci08JSAgCi0gICBTdHJpbmcgc3RhdHVzQ29udGVudFZhciA9IGFjdGlvbi5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICBpZiAoc3RhdHVzQ29udGVudFZhciAhPSBudWxsKQotICAgewotJT4gICAgCi0gICAgPCU9c3RhdHVzQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSkpJT4iOwotPCUKLSAgIH0KLSU+Ci0gIH0KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPiAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9Xcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvV3JpdGVXU0RMVG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2NkNTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9Xcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIHBhbmVzRmlsZS5hcHBlbmQoY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IChJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbilzZXNzaW9uLmdldEF0dHJpYnV0ZShBY3Rpb25JbnB1dHMuSU1QT1JUX0FDVElPTik7Ci0gICBhY3Rpb24ucnVuKCk7Ci0gICBTdHJpbmcgc3RhdHVzQ29udGVudFZhciA9IGFjdGlvbi5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICBpZiAoc3RhdHVzQ29udGVudFZhciAhPSBudWxsKQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICA8JT1zdGF0dXNDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRTdGF0dXNDb250ZW50UGFnZSgpKSklPiI7Ci08L3NjcmlwdD4gIAotPCUKLSAgIH0KLSU+Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX2Jyb3dzZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jYWxlbmRhcl9icm93c2VyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjMWU4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX2Jyb3dzZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPgotICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiVElUTEVfQ0FMRU5EQVJfQlJPV1NFUiIpJT4KLSAgPC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLTwlCi0gICBTdHJpbmdCdWZmZXIgbGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImNhbGVuZGFyX3Rvb2xiYXIuanNwPyIpOwotICAgbGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCk7Ci0lPiAgIAotICA8ZnJhbWUgbmFtZT0iPCU9RnJhbWVOYW1lcy5DQUxFTkRBUl9UT09MQkFSJT4iIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0NBTEVOREFSX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChsaW5rLnRvU3RyaW5nKCkpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08JQotICAgbGluay5zZXRMZW5ndGgoMCk7Ci0gICBsaW5rLmFwcGVuZCgiY2FsZW5kYXJfY29udGVudC5qc3A/Iik7Ci0gICBsaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSAgIGxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEUpKTsKLSU+ICAgICAKLSAgPGZyYW1lIG5hbWU9IjwlPUZyYW1lTmFtZXMuQ0FMRU5EQVJfQ09OVEVOVCU+IiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9DQUxFTkRBUl9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQobGluay50b1N0cmluZygpKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY2FsZW5kYXJfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM2Y2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY2FsZW5kYXJfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgaW50IGNhbGVuZGFyVHlwZSA9IEludGVnZXIucGFyc2VJbnQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEUpKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gIDx0aXRsZT48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0NBTEVOREFSX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvY2FsZW5kYXIuY3NzIikpJT4iPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgZGF5cyA9IG5ldyBBcnJheSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TSF9TVU5EQVkiKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0hfTU9OREFZIikpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NIX1RVRVNEQVkiKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0hfV0VETkVTREFZIikpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NIX1RIVVJTREFZIikpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NIX0ZSSURBWSIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TSF9TQVRVUkRBWSIpKSU+Iik7Ci0gIHZhciBtb250aHMgPSBuZXcgQXJyYXkoIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSkFOVUFSWSIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GRUJSVUFSWSIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NQVJDSCIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BUFJJTCIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NQVkiKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSlVORSIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9KVUxZIikpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FVR1VTVCIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVBURU1CRVIiKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfT0NUT0JFUiIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OT1ZFTUJFUiIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERUNFTUJFUiIpKSU+Iik7Ci0gIHZhciBlbmdNb250aHMgPSBuZXcgQXJyYXkoIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIik7Ci0gIHZhciBjdXJyZW50RGF0ZTsKLSAgdmFyIGNhbGVuZGFyQm9keVNldCA9IGZhbHNlOwotICB2YXIgY2FsZW5kYXJCb2R5OwotICB2YXIgc2F2ZWRZZWFyVGV4dFZhbHVlID0gIiI7Ci0KLTwlCi0gICAvLyBSZWd1bGFyIGV4cHJlc3Npb25zCi0gICAvLyB0aW1lICAgICAgIC0gSEg6TU06U1NbLlNTU10KLSAgIC8vIHllYXIgICAgICAgLSBZKgotICAgLy8gZGF0ZSAgICAgICAtIFlZWVkrLU1NLURECi0gICAvLyBkYXRlVGltZSAgIC0gWVlZWSstTU0tRERUSEg6TU06U1NbLlNTU11aCi0gICAvLyBnWWVhck1vbnRoIC0gWVlZWSstTU0gCi0gICAvLyBnRGF5ICAgICAgIC0gLS0tREQKLSAgIC8vIGdNb250aERheSAgLSAtLU1NLURECi0lPgotICB2YXIgdGltZVJlZ0V4cCA9IC9eKFxkezJ9KTooXGR7Mn0pOihcZHsyfSkoXC5cZHszfSk/JC87Ci0gIHZhciB5ZWFyUmVnRXhwID0gL14oXGQqKSQvOwotICB2YXIgZGF0ZVJlZ0V4cCA9IC9eKFxkezQsfSktKFxkezJ9KS0oXGR7Mn0pJC87Ci0gIHZhciBkYXRlVGltZVJlZ0V4cCA9IC9eKFxkezQsfSktKFxkezJ9KS0oXGR7Mn0pVChcZHsyfSk6KFxkezJ9KTooXGR7Mn0pKFwuXGR7M30pP1okLzsKLSAgdmFyIGdZZWFyTW9udGhSZWdFeHAgPSAvXihcZHs0LH0pLShcZHsyfSkkLzsKLSAgdmFyIGdEYXlSZWdFeHAgPSAvXi17M30oXGR7Mn0pJC87Ci0gIHZhciBnTW9udGhEYXlSZWdFeHAgPSAvXi17Mn0oXGR7Mn0pLShcZHsyfSkkLzsKLQotICBmdW5jdGlvbiB2YWxpZGF0ZVllYXJTdHJpbmcoeWVhclN0cmluZykKLSAgewotICAgIHJldHVybiB5ZWFyUmVnRXhwLnRlc3QoeWVhclN0cmluZyk7Ci0gIH0KLQotICBmdW5jdGlvbiBnZXRUaW1lUGFyYW1ldGVycyh0aW1lU3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIHRpbWVSZWdFeHAuZXhlYyh0aW1lU3RyaW5nKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldERhdGVQYXJhbWV0ZXJzKGRhdGVTdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gZGF0ZVJlZ0V4cC5leGVjKGRhdGVTdHJpbmcpOwotICB9Ci0KLSAgZnVuY3Rpb24gZ2V0RGF0ZVRpbWVQYXJhbWV0ZXJzKGRhdGVUaW1lU3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIGRhdGVUaW1lUmVnRXhwLmV4ZWMoZGF0ZVRpbWVTdHJpbmcpOwotICB9Ci0gIAotICBmdW5jdGlvbiBnZXRHWWVhck1vbnRoUGFyYW1ldGVycyhnWWVhck1vbnRoU3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIGdZZWFyTW9udGhSZWdFeHAuZXhlYyhnWWVhck1vbnRoU3RyaW5nKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gZ2V0R0RheVBhcmFtZXRlcnMoZ0RheVN0cmluZykKLSAgewotICAgIHJldHVybiBnRGF5UmVnRXhwLmV4ZWMoZ0RheVN0cmluZyk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGdldEdNb250aERheVBhcmFtZXRlcnMoZ01vbnRoRGF5U3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIGdNb250aERheVJlZ0V4cC5leGVjKGdNb250aERheVN0cmluZyk7Ci0gIH0KLSAgCi08JQotICAgLy8gSEg6TU06U1NbLlNTU10KLSU+Ci0gIGZ1bmN0aW9uIHNlcmlhbGl6ZVRpbWUoaG91cnMsbWludXRlcyxzZWNvbmRzLG1pbGxpc2Vjb25kcykKLSAgewotICAgIHZhciB0aW1lU3RyaW5nID0gIiI7Ci0gICAgaWYgKGhvdXJzIDwgMTApCi0gICAgICB0aW1lU3RyaW5nICs9ICIwIjsKLSAgICB0aW1lU3RyaW5nICs9IGhvdXJzICsgIjoiOwotICAgIGlmIChtaW51dGVzIDwgMTApCi0gICAgICB0aW1lU3RyaW5nICs9ICIwIjsKLSAgICB0aW1lU3RyaW5nICs9IG1pbnV0ZXMgKyAiOiI7Ci0gICAgaWYgKHNlY29uZHMgPCAxMCkKLSAgICAgIHRpbWVTdHJpbmcgKz0gIjAiOwotICAgIHRpbWVTdHJpbmcgKz0gc2Vjb25kczsKLSAgICBpZiAobWlsbGlzZWNvbmRzID4gMCkKLSAgICB7Ci0gICAgICB0aW1lU3RyaW5nICs9ICIuIjsKLSAgICAgIGlmIChtaWxsaXNlY29uZHMgPCAxMDApCi0gICAgICB7Ci0gICAgICAgIGlmIChtaWxsaXNlY29uZHMgPCAxMCkKLSAgICAgICAgICB0aW1lU3RyaW5nICs9ICIwMCI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0aW1lU3RyaW5nICs9ICIwIjsKLSAgICAgIH0KLSAgICAgIHRpbWVTdHJpbmcgKz0gbWlsbGlzZWNvbmRzOwotICAgIH0KLSAgICByZXR1cm4gdGltZVN0cmluZzsKLSAgfQotCi08JQotICAgLy8gWVlZWSstTU0KLSU+ICAgCi0gIGZ1bmN0aW9uIHNlcmlhbGl6ZUdZZWFyTW9udGgoZnVsbFllYXIsbW9udGgpCi0gIHsKLSAgICB2YXIgZ1llYXJNb250aFN0cmluZyA9ICIiOwotICAgIGlmIChmdWxsWWVhciA8IDEwMDApCi0gICAgewotICAgICAgaWYgKGZ1bGxZZWFyIDwgMTAwKQotICAgICAgewotICAgICAgICBpZiAoZnVsbFllYXIgPCAxMCkKLSAgICAgICAgICBnWWVhck1vbnRoU3RyaW5nICs9ICIwMDAiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZ1llYXJNb250aFN0cmluZyArPSAiMDAiOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBnWWVhck1vbnRoU3RyaW5nICs9ICIwIjsKLSAgICB9Ci0gICAgZ1llYXJNb250aFN0cmluZyArPSBmdWxsWWVhcisiLSI7Ci0gICAgaWYgKG1vbnRoIDwgMTApCi0gICAgICBnWWVhck1vbnRoU3RyaW5nICs9ICIwIjsKLSAgICBnWWVhck1vbnRoU3RyaW5nICs9IG1vbnRoOwotICAgIHJldHVybiBnWWVhck1vbnRoU3RyaW5nOyAgICAKLSAgfQotICAKLTwlCi0gICAvLyBZWVlZKy1NTS1ERAotJT4KLSAgZnVuY3Rpb24gc2VyaWFsaXplRGF0ZShmdWxsWWVhcixtb250aCxkYXRlKQotICB7Ci0gICAgdmFyIGRhdGVTdHJpbmcgPSBzZXJpYWxpemVHWWVhck1vbnRoKGZ1bGxZZWFyLG1vbnRoKSArICItIjsKLSAgICBpZiAoZGF0ZSA8IDEwKQotICAgICAgZGF0ZVN0cmluZyArPSAiMCI7Ci0gICAgZGF0ZVN0cmluZyArPSBkYXRlOwotICAgIHJldHVybiBkYXRlU3RyaW5nOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXJpYWxpemVHRGF5KGRhdGUpCi0gIHsKLSAgICB2YXIgZ0RheVN0cmluZyA9ICItLS0iOwotICAgIGlmIChkYXRlIDwgMTApCi0gICAgICBnRGF5U3RyaW5nICs9ICIwIjsKLSAgICBnRGF5U3RyaW5nICs9IGRhdGU7Ci0gICAgcmV0dXJuIGdEYXlTdHJpbmc7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNlcmlhbGl6ZUdNb250aERheShtb250aCxkYXRlKQotICB7Ci0gICAgdmFyIGdNb250aERheVN0cmluZyA9ICItLSI7Ci0gICAgaWYgKG1vbnRoIDwgMTApCi0gICAgICBnTW9udGhEYXlTdHJpbmcgKz0gIjAiOwotICAgIGdNb250aERheVN0cmluZyArPSBtb250aCsiLSI7Ci0gICAgaWYgKGRhdGUgPCAxMCkKLSAgICAgIGdNb250aERheVN0cmluZyArPSAiMCI7Ci0gICAgZ01vbnRoRGF5U3RyaW5nICs9IGRhdGU7Ci0gICAgcmV0dXJuIGdNb250aERheVN0cmluZzsKLSAgfSAgICAKLQotICBmdW5jdGlvbiBzZXREYXRlVXNpbmdHRGF5UGFyYW1ldGVycyhnRGF5UGFyYW1ldGVycyxkYXRlT2JqKQotICB7Ci0gICAgaWYgKGdEYXlQYXJhbWV0ZXJzICE9IG51bGwpCi0gICAgICBkYXRlT2JqLnNldERhdGUoZ0RheVBhcmFtZXRlcnNbMV0pOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXREYXRlVXNpbmdHTW9udGhEYXlQYXJhbWV0ZXJzKGdNb250aERheVBhcmFtZXRlcnMsZGF0ZU9iaikKLSAgewotICAgIGlmIChnTW9udGhEYXlQYXJhbWV0ZXJzICE9IG51bGwpCi0gICAgewotICAgICAgZGF0ZU9iai5zZXRNb250aChnTW9udGhEYXlQYXJhbWV0ZXJzWzFdLTEpOwotICAgICAgZGF0ZU9iai5zZXREYXRlKGdNb250aERheVBhcmFtZXRlcnNbMl0pOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gc2V0RGF0ZVVzaW5nR1llYXJNb250aFBhcmFtZXRlcnMoZ1llYXJNb250aFBhcmFtZXRlcnMsZGF0ZU9iaikKLSAgewotICAgIGlmIChnWWVhck1vbnRoUGFyYW1ldGVycyAhPSBudWxsKQotICAgIHsKLSAgICAgIGRhdGVPYmouc2V0RnVsbFllYXIoZ1llYXJNb250aFBhcmFtZXRlcnNbMV0pOwotICAgICAgZGF0ZU9iai5zZXRNb250aChnWWVhck1vbnRoUGFyYW1ldGVyc1syXS0xKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNldERhdGVVc2luZ0RhdGVQYXJhbWV0ZXJzKGRhdGVQYXJhbWV0ZXJzLGRhdGVPYmopCi0gIHsKLSAgICBpZiAoZGF0ZVBhcmFtZXRlcnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXREYXRlVXNpbmdHWWVhck1vbnRoUGFyYW1ldGVycyhkYXRlUGFyYW1ldGVycyxkYXRlT2JqKTsKLSAgICAgIGRhdGVPYmouc2V0RGF0ZShkYXRlUGFyYW1ldGVyc1szXSk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGF0ZVVzaW5nRGF0ZVRpbWVQYXJhbWV0ZXJzKGRhdGVUaW1lUGFyYW1ldGVycyxkYXRlT2JqKQotICB7Ci0gICAgaWYgKGRhdGVUaW1lUGFyYW1ldGVycyAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldERhdGVVc2luZ0RhdGVQYXJhbWV0ZXJzKGRhdGVUaW1lUGFyYW1ldGVycyxkYXRlT2JqKTsKLSAgICAgIGRhdGVPYmouc2V0VVRDSG91cnMoZGF0ZVRpbWVQYXJhbWV0ZXJzWzRdKTsKLSAgICAgIGRhdGVPYmouc2V0VVRDTWludXRlcyhkYXRlVGltZVBhcmFtZXRlcnNbNV0pOwotICAgICAgZGF0ZU9iai5zZXRVVENTZWNvbmRzKGRhdGVUaW1lUGFyYW1ldGVyc1s2XSk7Ci0gICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZGF0ZVRpbWVQYXJhbWV0ZXJzWzddOwotICAgICAgaWYgKG1pbGxpc2Vjb25kcy5sZW5ndGggPiAwKQotPCUKLSAgIC8vIEVsaW1pbmF0ZSB0aGUgZGVjaW1hbCBwb2ludAotJT4KLSAgICAgICAgZGF0ZU9iai5zZXRVVENNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzLnN1YnN0cigxKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGRhdGVPYmouc2V0VVRDTWlsbGlzZWNvbmRzKDApOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNldERhdGVVc2luZ1RpbWVQYXJhbWV0ZXJzKHRpbWVQYXJhbWV0ZXJzLGRhdGVPYmopCi0gIHsKLSAgICBpZiAodGltZVBhcmFtZXRlcnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkYXRlT2JqLnNldEhvdXJzKHRpbWVQYXJhbWV0ZXJzWzFdKTsKLSAgICAgIGRhdGVPYmouc2V0TWludXRlcyh0aW1lUGFyYW1ldGVyc1syXSk7Ci0gICAgICBkYXRlT2JqLnNldFNlY29uZHModGltZVBhcmFtZXRlcnNbM10pOwotICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRpbWVQYXJhbWV0ZXJzWzRdOwotICAgICAgaWYgKG1pbGxpc2Vjb25kcy5sZW5ndGggPiAwKQotPCUKLSAgIC8vIEVsaW1pbmF0ZSB0aGUgZGVjaW1hbCBwb2ludAotJT4KLSAgICAgICAgZGF0ZU9iai5zZXRNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzLnN1YnN0cigxKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGRhdGVPYmouc2V0TWlsbGlzZWNvbmRzKDApOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIGluaXQoKQotICB7Ci0gICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwotPCUKLSAgIHN3aXRjaCAoY2FsZW5kYXJUeXBlKQotICAgewotICAgICBjYXNlIEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0RBVEU6Ci0lPgotICAgIHNldERhdGVVc2luZ0RhdGVQYXJhbWV0ZXJzKGdldERhdGVQYXJhbWV0ZXJzKHRvcC5vcGVuZXIuY2FsZW5kYXJUYXJnZXQudmFsdWUpLGQpOwotPCUKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFVElNRToKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nRGF0ZVRpbWVQYXJhbWV0ZXJzKGdldERhdGVUaW1lUGFyYW1ldGVycyh0b3Aub3BlbmVyLmNhbGVuZGFyVGFyZ2V0LnZhbHVlKSxkKTsKLTwlCi0gICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR1lFQVJNT05USDoKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nR1llYXJNb250aFBhcmFtZXRlcnMoZ2V0R1llYXJNb250aFBhcmFtZXRlcnModG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSksZCk7Ci08JSAgICAgCi0gICAgIGNhc2UgQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR0RBWToKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nR0RheVBhcmFtZXRlcnMoZ2V0R0RheVBhcmFtZXRlcnModG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSksZCk7Ci08JSAgIAotICAgICBjYXNlIEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dNT05USERBWToKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nR01vbnRoRGF5UGFyYW1ldGVycyhnZXRHTW9udGhEYXlQYXJhbWV0ZXJzKHRvcC5vcGVuZXIuY2FsZW5kYXJUYXJnZXQudmFsdWUpLGQpOwotPCUgICAgICAgCi0gICAgIGRlZmF1bHQ6Ci0gICAgICAgYnJlYWs7Ci0gICB9Ci0lPgotICAgIGdlbmVyYXRlQ2FsZW5kYXIoZCk7Ci0gICAgdmFyIG1vbnRoU2VsZWN0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9udGhTZWxlY3RvciIpOwotICAgIGZvciAodmFyIGk9MDtpPG1vbnRocy5sZW5ndGg7aSsrKQotICAgICAgbW9udGhTZWxlY3Rvci5vcHRpb25zW2ldID0gbmV3IE9wdGlvbihtb250aHNbaV0saSk7Ci0gICAgZ2VuZXJhdGVDYWxlbmRhcihkKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGluaXRDYWxlbmRhckhlYWRlcih0YWJsZSkKLSAgewotICAgIGNhbGVuZGFyQm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRCT0RZIik7Ci0gICAgdmFyIGhlYWRlclJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgZm9yICh2YXIgaT0wO2k8ZGF5cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpOwotICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRheXNbaV0pKTsKLSAgICAgIGhlYWRlci5jbGFzc05hbWU9ImhlYWRlcmNvbG9yIjsKLSAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChoZWFkZXIpOwotICAgIH0KLSAgICBjYWxlbmRhckJvZHkuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTsKLSAgICB0YWJsZS5hcHBlbmRDaGlsZChjYWxlbmRhckJvZHkpOwotICAgIGNhbGVuZGFyQm9keVNldCA9IHRydWU7Ci0gIH0KLQotICBmdW5jdGlvbiBnZW5lcmF0ZUNhbGVuZGFyKGRhdGUpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsZW5kYXIiKTsKLSAgICB2YXIgZGF0ZURhdGUgPSBkYXRlLmdldERhdGUoKTsKLSAgICB2YXIgZGF0ZU1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwotICAgIHZhciBkYXRlRnVsbFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7Ci0gICAgdmFyIGRhdGVJdGVyYXRvciA9IG5ldyBEYXRlKCk7Ci0gICAgZGF0ZUl0ZXJhdG9yLnNldFRpbWUoRGF0ZS5wYXJzZShlbmdNb250aHNbZGF0ZU1vbnRoXSsiIDEsICIrZGF0ZUZ1bGxZZWFyKSk7Ci0gICAgdmFyIHN0YXJ0aW5nRGF0ZSA9IGRhdGVJdGVyYXRvci5nZXREYXRlKCk7IC8vIDEsMiwzLi4uCi0gICAgdmFyIHN0YXJ0aW5nRGF5ID0gZGF0ZUl0ZXJhdG9yLmdldERheSgpOyAvLyBTdW4sTW9uLFR1ZXMuLi4KLSAgICBjbGVhckNhbGVuZGFyKCk7Ci0gICAgZm9yICh2YXIgcm93cz0wO3Jvd3M8Njtyb3dzKyspCi0gICAgewotICAgICAgdmFyIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgICBmb3IgKHZhciBjb2x1bW5zPTA7Y29sdW1uczxkYXlzLmxlbmd0aDtjb2x1bW5zKyspCi0gICAgICB7Ci0gICAgICAgIHZhciBjb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgICAgICB2YXIgZGF0ZUl0ZXJhdG9yRGF0ZSA9IGRhdGVJdGVyYXRvci5nZXREYXRlKCk7Ci0gICAgICAgIHZhciBkYXRlSXRlcmF0b3JNb250aCA9IGRhdGVJdGVyYXRvci5nZXRNb250aCgpOwotICAgICAgICB2YXIgZGF0ZUl0ZXJhdG9yRnVsbFllYXIgPSBkYXRlSXRlcmF0b3IuZ2V0RnVsbFllYXIoKTsKLSAgICAgICAgY29sdW1uLndpZHRoID0gMjQ7Ci0gICAgICAgIGNvbHVtbi5oZWlnaHQgPSAyNDsKLSAgICAgICAgY29sdW1uLmFsaWduID0gImNlbnRlciI7Ci0gICAgICAgIGNvbHVtbi52YWxpZ24gPSAiY2VudGVyIjsKLSAgICAgICAgY29sdW1uLmNsYXNzTmFtZSA9ICJjYWxlbmRhcnRhYmxlY2VsbHMiOwotICAgICAgICBpZiAoKGRhdGVJdGVyYXRvckRhdGUgPT0gc3RhcnRpbmdEYXRlICYmIGNvbHVtbnMgPCBzdGFydGluZ0RheSkgfHwgKGRhdGVJdGVyYXRvck1vbnRoICE9IGRhdGVNb250aCkpCi0gICAgICAgICAgY29sdW1uLmlubmVySFRNTCA9ICImbmJzcDsiOwotICAgICAgICBlbHNlIGlmIChkYXRlSXRlcmF0b3JNb250aCA9PSBkYXRlTW9udGgpCi0gICAgICAgIHsKLSAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICAgICAgICBzd2l0Y2ggKDwlPWNhbGVuZGFyVHlwZSU+KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURSU+OgotICAgICAgICAgICAgICBsaW5rLmhyZWYgPSAiamF2YXNjcmlwdDp0cmFuc2ZlckRhdGUoIitkYXRlSXRlcmF0b3JEYXRlKyIpIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0RBVEVUSU1FJT46Ci0gICAgICAgICAgICAgIGxpbmsuaHJlZiA9ICJqYXZhc2NyaXB0OnRyYW5zZmVyRGF0ZVRpbWUoIitkYXRlSXRlcmF0b3JEYXRlKyIpIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dZRUFSTU9OVEglPjoKLSAgICAgICAgICAgICAgbGluay5ocmVmID0gImphdmFzY3JpcHQ6dHJhbnNmZXJHWWVhck1vbnRoKCkiOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR0RBWSU+OgotICAgICAgICAgICAgICBsaW5rLmhyZWYgPSAiamF2YXNjcmlwdDp0cmFuc2ZlckdEYXkoIitkYXRlSXRlcmF0b3JEYXRlKyIpIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dNT05USERBWSU+OgotICAgICAgICAgICAgICBsaW5rLmhyZWYgPSAiamF2YXNjcmlwdDp0cmFuc2ZlckdNb250aERheSgiK2RhdGVJdGVyYXRvckRhdGUrIikiOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRlSXRlcmF0b3JEYXRlKSk7Ci0gICAgICAgICAgY29sdW1uLmFwcGVuZENoaWxkKGxpbmspOwotICAgICAgICAgIGlmIChkYXRlSXRlcmF0b3JEYXRlID09IGRhdGVEYXRlICYmIGRhdGVJdGVyYXRvckZ1bGxZZWFyID09IGRhdGVGdWxsWWVhcikKLSAgICAgICAgICAgIGNvbHVtbi5jbGFzc05hbWUgPSAidG9kYXl0YWJsZWNlbGwiOwotICAgICAgICAgIGRhdGVJdGVyYXRvckRhdGUrKzsKLSAgICAgICAgICBkYXRlSXRlcmF0b3Iuc2V0VGltZShEYXRlLnBhcnNlKGVuZ01vbnRoc1tkYXRlSXRlcmF0b3JNb250aF0rIiAiK2RhdGVJdGVyYXRvckRhdGUrIiwgIitkYXRlSXRlcmF0b3IuZ2V0RnVsbFllYXIoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJvdy5hcHBlbmRDaGlsZChjb2x1bW4pOwotICAgICAgfQotICAgICAgY2FsZW5kYXJCb2R5LmFwcGVuZENoaWxkKHJvdyk7Ci0gICAgfQotICAgIHZhciBtb250aFNlbGVjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vbnRoU2VsZWN0b3IiKTsKLSAgICBmb3IgKHZhciBpPTA7aTxtb250aFNlbGVjdG9yLm9wdGlvbnMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAobW9udGhTZWxlY3Rvci5vcHRpb25zW2ldLnZhbHVlID09IGRhdGVNb250aCkKLSAgICAgIHsKLSAgICAgICAgbW9udGhTZWxlY3Rvci5zZWxlY3RlZEluZGV4ID0gaTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHZhciB5ZWFyVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ5ZWFyVGV4dCIpOwotICAgIHllYXJUZXh0LnZhbHVlID0gZGF0ZUZ1bGxZZWFyOwotICAgIHNhdmVkWWVhclRleHRWYWx1ZSA9IHllYXJUZXh0LnZhbHVlOwotPCUKLSAgIGlmIChjYWxlbmRhclR5cGUgPT0gQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURVRJTUUpCi0gICB7Ci0lPgotICAgIHZhciB0aW1lVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aW1lVGV4dCIpOwotICAgIHRpbWVUZXh0LnZhbHVlID0gc2VyaWFsaXplVGltZShkYXRlLmdldEhvdXJzKCksZGF0ZS5nZXRNaW51dGVzKCksZGF0ZS5nZXRTZWNvbmRzKCksZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7Ci08JQotICAgfQotJT4KLSAgICBjdXJyZW50RGF0ZSA9IGRhdGU7Ci0gIH0KLQotICBmdW5jdGlvbiBjbGVhckNhbGVuZGFyKCkKLSAgewotICAgIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYWxlbmRhciIpOwotICAgIGlmICghY2FsZW5kYXJCb2R5U2V0KQotICAgICAgaW5pdENhbGVuZGFySGVhZGVyKHRhYmxlKTsKLSAgICBmb3IgKHZhciBpPTE7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdGFibGUuZGVsZXRlUm93KGkpOwotICAgICAgaS0tOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHVwZGF0ZUNhbGVuZGFyKG5ld01vbnRoLG5ld0Z1bGxZZWFyKQotICB7Ci0gICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwotICAgIGlmIChuZXdNb250aCA+IG1vbnRocy5sZW5ndGgpCi0gICAgewotICAgICAgbmV3RnVsbFllYXIrKzsKLSAgICAgIG5ld01vbnRoID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobmV3TW9udGggPCAwKQotICAgIHsKLSAgICAgIG5ld0Z1bGxZZWFyLS07Ci0gICAgICBuZXdNb250aCA9IG1vbnRocy5sZW5ndGgtMTsKLSAgICB9Ci0gICAgZC5zZXRNb250aChuZXdNb250aCk7Ci0gICAgZC5zZXRGdWxsWWVhcihuZXdGdWxsWWVhcik7Ci08JQotICAgaWYgKGNhbGVuZGFyVHlwZSA9PSBBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFVElNRSkKLSAgIHsKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nVGltZVBhcmFtZXRlcnMoZ2V0VGltZVBhcmFtZXRlcnMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbWVUZXh0IikudmFsdWUpLGQpOwotPCUKLSAgIH0KLSU+Ci0gICAgZ2VuZXJhdGVDYWxlbmRhcihkKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGp1bXBUb1ByZXZpb3VzWWVhcigpCi0gIHsKLSAgICB1cGRhdGVDYWxlbmRhcihjdXJyZW50RGF0ZS5nZXRNb250aCgpLGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCktMSkKLSAgfQotCi0gIGZ1bmN0aW9uIGp1bXBUb1ByZXZpb3VzTW9udGgoKQotICB7Ci0gICAgdXBkYXRlQ2FsZW5kYXIoY3VycmVudERhdGUuZ2V0TW9udGgoKS0xLGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCkpOwotICB9Ci0KLSAgZnVuY3Rpb24ganVtcFRvTmV4dE1vbnRoKCkKLSAgewotICAgIHVwZGF0ZUNhbGVuZGFyKGN1cnJlbnREYXRlLmdldE1vbnRoKCkrMSxjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGp1bXBUb05leHRZZWFyKCkKLSAgewotICAgIHVwZGF0ZUNhbGVuZGFyKGN1cnJlbnREYXRlLmdldE1vbnRoKCksY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSsxKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGp1bXBUb1RvZGF5KCkKLSAgewotICAgIGdlbmVyYXRlQ2FsZW5kYXIobmV3IERhdGUoKSk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXROZXdEYXRlKCkKLSAgewotICAgIHZhciBtb250aFNlbGVjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vbnRoU2VsZWN0b3IiKTsKLSAgICB2YXIgbmV3TW9udGggPSBtb250aFNlbGVjdG9yLm9wdGlvbnNbbW9udGhTZWxlY3Rvci5zZWxlY3RlZEluZGV4XS52YWx1ZTsKLSAgICB2YXIgbmV3RnVsbFllYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieWVhclRleHQiKS52YWx1ZTsKLTwlCi0gICAvLyBZWVlZKwotJT4KLSAgICB2YXIgZCA9IG5ldyBEYXRlKCk7Ci0gICAgaWYgKHZhbGlkYXRlWWVhclN0cmluZyhuZXdGdWxsWWVhcikpCi0gICAgewotICAgICAgLy8gVGhlIHllYXIgc3RyaW5nIGNvbnRhaW5zIG9ubHkgZGlnaXRzIGFuZCBpcyBoZW5jZSBhIHZhbGlkIHllYXIuCi0gICAgICBkLnNldEZ1bGxZZWFyKG5ld0Z1bGxZZWFyKTsKLSAgICAgIGQuc2V0TW9udGgobmV3TW9udGgpOwotICAgIH0KLSAgICBnZW5lcmF0ZUNhbGVuZGFyKGQpOwotICB9Ci0KLSAgZnVuY3Rpb24gaGFuZGxlWWVhclRleHRLZXlVcEV2ZW50KCkKLSAgewotICAgIHZhciBjdXJyZW50WWVhclRleHRWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ5ZWFyVGV4dCIpLnZhbHVlOwotICAgIGlmIChjdXJyZW50WWVhclRleHRWYWx1ZSA9PSBzYXZlZFllYXJUZXh0VmFsdWUpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgc2V0TmV3RGF0ZSgpOwotICB9Ci0KLTwlCi0gICAvLyBZWVlZKy1NTS1ERAotJT4KLSAgZnVuY3Rpb24gdHJhbnNmZXJEYXRlKGRhdGUpCi0gIHsKLSAgICB2YXIgZnVsbFllYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieWVhclRleHQiKS52YWx1ZTsKLSAgICB2YXIgbW9udGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9udGhTZWxlY3RvciIpLnNlbGVjdGVkSW5kZXgrMTsKLSAgICB0b3Aub3BlbmVyLmNhbGVuZGFyVGFyZ2V0LnZhbHVlID0gc2VyaWFsaXplRGF0ZShmdWxsWWVhcixtb250aCxkYXRlKTsKLSAgICB0b3Aub3BlbmVyLmNsb3NlQ2FsZW5kYXJCcm93c2VyKCk7Ci0gIH0KLQotPCUKLSAgIC8vIFlZWVkrLU1NLUREVEhIOk1NOlNTWy5TU1NdWgotJT4KLSAgZnVuY3Rpb24gdHJhbnNmZXJEYXRlVGltZShkYXRlKQotICB7Ci0gICAgdmFyIGZ1bGxZZWFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInllYXJUZXh0IikudmFsdWU7Ci0gICAgdmFyIG1vbnRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vbnRoU2VsZWN0b3IiKS5zZWxlY3RlZEluZGV4KzE7Ci0gICAgdmFyIHNlcmlhbGl6ZWREYXRlID0gc2VyaWFsaXplRGF0ZShmdWxsWWVhcixtb250aCxkYXRlKTsKLSAgICB2YXIgZCA9IG5ldyBEYXRlKCk7Ci0gICAgc2V0RGF0ZVVzaW5nRGF0ZVBhcmFtZXRlcnMoZ2V0RGF0ZVBhcmFtZXRlcnMoc2VyaWFsaXplZERhdGUpLGQpOwotICAgIHZhciB0aW1lVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZVRleHQiKS52YWx1ZTsKLSAgICB2YXIgdGltZVBhcmFtZXRlcnMgPSBnZXRUaW1lUGFyYW1ldGVycyh0aW1lVmFsdWUpOwotICAgIGlmICh0aW1lUGFyYW1ldGVycyA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmICghY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVElNRV9GT1JNQVQiKSklPiIpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHNldERhdGVVc2luZ1RpbWVQYXJhbWV0ZXJzKHRpbWVQYXJhbWV0ZXJzLGQpOwotICAgIHRvcC5vcGVuZXIuY2FsZW5kYXJUYXJnZXQudmFsdWUgPSBzZXJpYWxpemVkRGF0ZSArICJUIiArIHNlcmlhbGl6ZVRpbWUoZC5nZXRVVENIb3VycygpLGQuZ2V0VVRDTWludXRlcygpLGQuZ2V0VVRDU2Vjb25kcygpLGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpICsgIloiOwotICAgIHRvcC5vcGVuZXIuY2xvc2VDYWxlbmRhckJyb3dzZXIoKTsKLSAgfQotICAKLTwlCi0gICAvLyBZWVlZKy1NTQotJT4KLSAgZnVuY3Rpb24gdHJhbnNmZXJHWWVhck1vbnRoKCkKLSAgewotICAgIHZhciBmdWxsWWVhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ5ZWFyVGV4dCIpLnZhbHVlOwotICAgIHZhciBtb250aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtb250aFNlbGVjdG9yIikuc2VsZWN0ZWRJbmRleCsxOwotICAgIHZhciBzZXJpYWxpemVkR1llYXJNb250aCA9IHNlcmlhbGl6ZUdZZWFyTW9udGgoZnVsbFllYXIsbW9udGgpOwotICAgIHZhciBkID0gbmV3IERhdGUoKTsKLSAgICBzZXREYXRlVXNpbmdHWWVhck1vbnRoUGFyYW1ldGVycyhnZXRHWWVhck1vbnRoUGFyYW1ldGVycyhzZXJpYWxpemVkR1llYXJNb250aCksZCk7Ci0gICAgdG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSA9IHNlcmlhbGl6ZWRHWWVhck1vbnRoOwotICAgIHRvcC5vcGVuZXIuY2xvc2VDYWxlbmRhckJyb3dzZXIoKTsKLSAgfSAgICAgCi0gIAotPCUKLSAgIC8vIC0tLURECi0lPgotICBmdW5jdGlvbiB0cmFuc2ZlckdEYXkoZGF0ZSkgICAgIAotICB7Ci0gICAgdG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSA9IHNlcmlhbGl6ZUdEYXkoZGF0ZSk7Ci0gICAgdG9wLm9wZW5lci5jbG9zZUNhbGVuZGFyQnJvd3NlcigpOwotICB9Ci08JQotICAgLy8gLS1NTS1ERAotJT4gIAotICBmdW5jdGlvbiB0cmFuc2ZlckdNb250aERheShkYXRlKQotICB7Ci0gICAgdmFyIG1vbnRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vbnRoU2VsZWN0b3IiKS5zZWxlY3RlZEluZGV4KzE7Ci0gICAgdG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSA9IHNlcmlhbGl6ZUdNb250aERheShtb250aCxkYXRlKTsKLSAgICB0b3Aub3BlbmVyLmNsb3NlQ2FsZW5kYXJCcm93c2VyKCk7Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPHRhYmxlIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIDx0YWJsZT4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibW9udGhTZWxlY3RvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01PTlRIIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJ5ZWFyVGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1lFQVIiKSU+PC9sYWJlbD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJjZW50ZXIiPgotICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9Im1vbnRoU2VsZWN0b3IiIG9uQ2hhbmdlPSJzZXROZXdEYXRlKCkiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJjZW50ZXIiPgotICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ieWVhclRleHQiIHNpemU9NiBvbmtleXVwPSJoYW5kbGVZZWFyVGV4dEtleVVwRXZlbnQoKSIgY2xhc3M9InRhYmxldGV4dGVudGVyIj4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgPHRhYmxlIGlkPSJjYWxlbmRhciIgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0zIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci08JQotICAgaWYgKGNhbGVuZGFyVHlwZSA9PSBBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFVElNRSkKLSAgIHsKLSU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgPHRhYmxlIGJvcmRlcj0wPgotICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iY2VudGVyIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idGltZVRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9USU1FIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iY2VudGVyIiB3aWR0aD0iODAlIj4KLSAgICAgICAgICAgICAgPGlucHV0IGlkPSJ0aW1lVGV4dCIgdHlwZT0idGV4dCIgY2xhc3M9InRhYmxldGV4dGVudGVyIiBzaXplPTEyIG1heGxlbmd0aD0xMj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgd2lkdGg9IjEwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLTwlCi0gICB9Ci0lPgotICAgICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIDx0YWJsZSBib3JkZXI9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6anVtcFRvUHJldmlvdXNZZWFyKCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9QUkVWSU9VU19ZRUFSIiklPiI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUFJFVklPVVNfWUVBUiIpJT48L2E+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Omp1bXBUb1ByZXZpb3VzTW9udGgoKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1BSRVZJT1VTX01PTlRIIiklPiI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUFJFVklPVVNfTU9OVEgiKSU+PC9hPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpqdW1wVG9Ub2RheSgpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVE9EQVkiKSU+Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19UT0RBWSIpJT48L2E+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Omp1bXBUb05leHRNb250aCgpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTkVYVF9NT05USCIpJT4iPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX05FWFRfTU9OVEgiKSU+PC9hPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpqdW1wVG9OZXh0WWVhcigpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTkVYVF9ZRUFSIiklPiI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfTkVYVF9ZRUFSIiklPjwvYT4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaW5pdCgpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jYWxlbmRhcl90b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1NWZiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQ0FMRU5EQVJfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgb25VbmxvYWQ9InRvcC5vcGVuZXIuY2FsZW5kYXJCcm93c2VyQ2xvc2VkPXRydWUiIGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2FsZW5kYXIuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfQ0FMRU5EQVJfQlJPV1NFUiIpJT48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHRvcC5vcGVuZXIuY2FsZW5kYXJCcm93c2VyQ2xvc2VkID0gZmFsc2U7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY3NzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY3NzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvY2FsZW5kYXIuY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvY2FsZW5kYXIuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM4ODA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY3NzL2NhbGVuZGFyLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotLmNhbGVuZGFydGFibGVjZWxscyB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNCOEI0QTM7IGZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTFweDsgdGV4dC1hbGlnbjpjZW50ZXJ9Ci0udG9kYXl0YWJsZWNlbGwgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1yaWdodDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXRvcDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0I4QjRBMzsgZm9udDogaWNvbjsgZm9udC1zaXplOiAxMXB4OyB0ZXh0LWFsaWduOmNlbnRlcn0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY3NzL3Rvb2xiYXIuY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvdG9vbGJhci5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NWVhMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvdG9vbGJhci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jdG9vbGJhciB7IHdpZHRoOjEwMCU7IGhlaWdodDoyNXB4OyBiYWNrZ3JvdW5kOiNFQ0U5RDg7IGJvcmRlci1jb2xvcjp3aGl0ZTsgIGJvcmRlci1zdHlsZTpzb2xpZDsgIGJvcmRlci13aWR0aDoxIDEgMSAxcHg7IGJvcmRlci1ib3R0b20tY29sb3I6Izg0ODI4NDsgYm9yZGVyLXJpZ2h0LWNvbG9yOiM4NDgyODQ7IG1hcmdpbjowIDAgMCAwcHg7fQotI3Rvb2xiYXJib3JkZXIgeyBoZWlnaHQ6MjZweDsgd2lkdGg6MTAwJTsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGg6MSAwIDAgMXB4OyBib3JkZXItY29sb3I6Izg0ODI4NDsgfQotCi0vKiBpZnJhbWUgU3BhY2luZyBDb250b2wgKi8KLS50b29sYmFyYm9keW1hcmdpbiB7IG1hcmdpbjogNSA1IDAgNTsgYmFja2dyb3VuZDogI0VDRTlEODsgfQotCi0vKiBUb29sYmFyIFN0eWxlcyAqLwotLnRleHQge2ZvbnQtc2l6ZToxMnB4OyBmb250OiBpY29uO30KLWE6bGluayB7Y29sb3I6IGJsYWNrO30KLQotLyogSlMgUm9sbG92ZXIgU3R5bGUgKi8KLUlNRyB7IGJvcmRlci13aWR0aDoycHg7IGJvcmRlci1zdHlsZTpzb2xpZDt9Ci0ubm9ybWFsIHsgYm9yZGVyLWNvbG9yIDogI0VDRTlEODsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOjFweDsgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsgYm9yZGVyLWJvdHRvbS1jb2xvciA6I0VDRTlEODsgYm9yZGVyLXJpZ2h0LWNvbG9yIDojRUNFOUQ4O30KLS5ob3ZlciB7IGJvcmRlci1jb2xvciA6IHdoaXRlOyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6MXB4OyBib3JkZXItbGVmdC13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLWNvbG9yIDojOEM4RThDOyBib3JkZXItcmlnaHQtY29sb3IgOiM4QzhFOEM7IH0KLS5kb3duIHsgYm9yZGVyLWNvbG9yIDogIzhDOEU4QzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOjFweDsgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsgYm9yZGVyLWJvdHRvbS1jb2xvcjp3aGl0ZTsgYm9yZGVyLXJpZ2h0LWNvbG9yOndoaXRlO30KLQotLyogR2xvYmFsVG9vbGJhciAqLwotLmd0b29sYmFyYm9keW1hcmdpbiB7bWFyZ2luIDogMCAxIDMgMDsgYmFja2dyb3VuZDogI0VDRTlEOH0KLSNnbG9iYWx0b29sYmFye2hlaWdodDoxMDAlOyBiYWNrZ3JvdW5kOiAjRUNFOUQ4OyBib3JkZXItY29sb3IgOiB3aGl0ZTsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOjFweDsgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsgYm9yZGVyLWJvdHRvbS1jb2xvciA6YmxhY2s7IGJvcmRlci1yaWdodC13aWR0aDogMXB4OyBib3JkZXItcmlnaHQtY29sb3IgOiM4NDgyODQ7fQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy90cmVldmlldy5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy90cmVldmlldy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMWU2YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvdHJlZXZpZXcuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1hIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7fQotYTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7fQotdGQge2ZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6IEJsYWNrO30KLS51bnNlbGVjdGVkVGV4dEFuY2hvciB7Y29sb3I6Ymx1ZTsgYmFja2dyb3VuZC1jb2xvcjpkb2N1bWVudC5iYWNrZ3JvdW5kQ29sb3J9Ci0uc2VsZWN0ZWRUZXh0QW5jaG9yIHtjb2xvcjp3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjpuYXZ5fQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3Mvd2luZG93cy5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy93aW5kb3dzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwZDJiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy93aW5kb3dzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSNjb250ZW50Ym9yZGVyIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICM4NDgyODQ7IGJvcmRlci1yaWdodDoxcHggc29saWQgIzg0ODI4NDsgYm9yZGVyLXRvcDowcHggc29saWQgIzg0ODI4NDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzg0ODI4NDsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7IGJhY2tncm91bmQ6d2hpdGU7IG92ZXJmbG93OmF1dG87IHBhZGRpbmctbGVmdDoxMHB4OyBwYWRkaW5nLXJpZ2h0OjA7IHBhZGRpbmctdG9wOjEwOyBwYWRkaW5nLWJvdHRvbToxMH0KLSN0cmVlY29udGVudGJvcmRlciB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjODQ4Mjg0OyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICM4NDgyODQ7IGJvcmRlci10b3A6MHB4IHNvbGlkICM4NDgyODQ7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICM4NDgyODQ7IGhlaWdodDoxMDAlOyB3aWR0aDoxMDAlOyBiYWNrZ3JvdW5kOndoaXRlOyBvdmVyZmxvdzphdXRvOyBwYWRkaW5nLXRvcDo1cHh9Ci0KLS8qIGlmcmFtZSBTcGFjaW5nIENvbnRvbCAqLwotLmNvbnRlbnRib2R5bWFyZ2luIHsgbWFyZ2luOiAwIDUgMTIgNTsgYmFja2dyb3VuZDojRUNFOUQ4OyB9Ci0KLS8qIERvY3VtZW50IFN0eWxlcyAgKi8KLS5sYWJlbHMgeyBmb250OiBpY29uOyBmb250LXNpemU6IDEycHg7IGNvbG9yOmJsYWNrOyBmb250LXdlaWdodDogbm9ybWFsO30KLQotLyogZmllbGRzZXQrbGVnZW5kIFN0eWxlcyAqLwotLmtleWxpbmVmaWVsZHNldCB7IGJvcmRlci1jb2xvcjojODA4MEZGOyBib3JkZXItd2lkdGg6MXB4OyBib3JkZXItc3R5bGU6c29saWQ7IH0KLQotLyogdGFibGUgU3R5bGVzICovCi0udGFibGVib3JkZXIge2JvcmRlci1sZWZ0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MHB4IHNvbGlkICNCOEI0QTM7IH0KLS50YWJsZWNlbGxzIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1yaWdodDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXRvcDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0I4QjRBMzsgZm9udDogaWNvbjsgZm9udC1zaXplOiAxMXB4OyB0ZXh0LWFsaWduOmxlZnR9Ci0uY2hlY2tib3hjZWxscyB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNCOEI0QTM7IGZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTFweDsgYmFja2dyb3VuZC1jb2xvcjogI0VDRTlEOH0KLXRoLmhlYWRlcmNvbG9yIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1yaWdodDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXRvcDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0I4QjRBMzsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250OiBpY29uOyBmb250LXNpemU6IDExcHg7IGJhY2tncm91bmQtY29sb3I6IzQ5NzdCNDsgY29sb3I6I0ZGRkZGRjsgdGV4dC1hbGlnbjpjZW50ZXJ9Ci10aC5zaW5nbGVoZWFkZXJjb2xvciB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNCOEI0QTM7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udDogaWNvbjsgZm9udC1zaXplOiAxMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiM0OTc3QjQ7IGNvbG9yOiNGRkZGRkY7IHRleHQtYWxpZ246bGVmdH0KLS5maXJzdGNvbHVtbmVycmFudHJvd2NvbG9yIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJlZDsgYm9yZGVyLXJpZ2h0OjBweCBzb2xpZCAjQjdCNEEzOyBib3JkZXItdG9wOjFweCBzb2xpZCByZWQ7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkIHJlZDsgZm9udDogaWNvbjsgZm9udC1zaXplOiAxMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiNFNkVBRDg7IHRleHQtYWxpZ246bGVmdH0KLS5taWRkbGVlcnJhbnRyb3djb2xvciB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjdCNEEzOyBib3JkZXItcmlnaHQ6MHB4IHNvbGlkICNCN0I0QTM7IGJvcmRlci10b3A6MXB4IHNvbGlkIHJlZDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgcmVkOyBmb250OiBpY29uOyBmb250LXNpemU6IDExcHg7IGJhY2tncm91bmQtY29sb3I6I0U2RUFEODsgdGV4dC1hbGlnbjpsZWZ0fQotLmxhc3Rjb2x1bW5lcnJhbnRyb3djb2xvciB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjdCNEEzOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJlZDsgYm9yZGVyLXRvcDoxcHggc29saWQgcmVkOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCByZWQ7IGZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTFweDsgYmFja2dyb3VuZC1jb2xvcjojRTZFQUQ4OyB0ZXh0LWFsaWduOmxlZnR9Ci0ucm93Y29sb3IgeyBib3JkZXItbGVmdDoxcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXJpZ2h0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItdG9wOjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjQjhCNEEzOyBmb250OiBpY29uOyBmb250LXNpemU6IDExcHg7IGJhY2tncm91bmQtY29sb3I6I0U2RUFEODsgdGV4dC1hbGlnbjpsZWZ0fQotCi0vKiBGb3JtIGVsZW1lbnRzIGFuZCBzdGF0dXMgY29udGVudHMgKi8KLXRkIHsgZm9udDogaWNvbjsgZm9udC1zaXplOiAxMnB4OyB9Ci10aCB7IGZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTJweDsgfQotaW5wdXQgeyBmb250OiBpY29uOyBmb250LXNpemU6IDEycHg7IH0KLS5zZWxlY3RsaXN0IHtmb250OiBpY29uOyBmb250LXNpemU6IDEycHg7IGNvbG9yOiBCbGFjazsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGggOiAxcHg7ICBib3JkZXItY29sb3I6I0M3QzVCMjt9Ci1zZWxlY3QgeyBmb250OiBpY29uOyBmb250LXNpemU6IDEycHg7IH0KLXByZSB7IGZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTJweDsgfQotLnNtdGV4dGVudGVyIHtmb250OiBpY29uOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiBCbGFjazsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGggOiAxcHg7IGJvcmRlci1jb2xvcjogI0M3QzVCMjsgd2lkdGg6MTAlOyB9Ci0udGV4dGVudGVyIHtmb250OiBpY29uOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiBCbGFjazsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGggOiAxcHg7IGJvcmRlci1jb2xvcjogI0M3QzVCMjsgd2lkdGg6OTAlOyB9Ci0udGFibGV0ZXh0ZW50ZXIge2ZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6IEJsYWNrOyBib3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci13aWR0aCA6IDFweDsgYm9yZGVyLWNvbG9yOiAjQzdDNUIyOyB3aWR0aDoxMDAlOyB9Ci0udGFibGVmaWxlYnJvd3NlIHt3aWR0aDoxMDAlOyBib3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci13aWR0aDoxcHg7IGZvbnQtc2l6ZTogMTRweDsgYm9yZGVyLWNvbG9yOiAjQzdDNUIyOyBmb250OiBpY29uOyB9Ci1pbnB1dC5idXR0b24ge2ZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTFweDsgYm9yZGVyLXdpZHRoIDogMXB4OyBib3JkZXItc3R5bGU6b3V0c2V0OyBoZWlnaHQ6MjJweDt9Ci1pbnB1dC5yYWRpbyB7Zm9udDogaWNvbjsgZm9udC1zaXplOiAxMXB4O30KLWltZy50d2lzdCB7Ym9yZGVyLXdpZHRoOjAgMCAwIDBweDsgaGVpZ2h0OjEwcHg7IHdpZHRoOjExcHg7fQotCi0vKiBGcmFnbWVudCBTdHlsZXMgKi8KLS5maXhmcmFndGFibGUge3dpZHRoOjk1JTsgYm9yZGVyOjBweCBub25lOyB9Ci0uaW5uZXJmaXhmcmFndGFibGUge3dpZHRoOjEwMCU7IGJvcmRlcjowcHggbm9uZTsgfQotLnJhbmdlZnJhZ3RhYmxlIHt3aWR0aDo5NSU7IGJvcmRlci1sZWZ0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MHB4IHNvbGlkICNCOEI0QTM7fQotLmlubmVycmFuZ2VmcmFndGFibGUge3dpZHRoOjEwMCU7IGJvcmRlci1sZWZ0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MHB4IHNvbGlkICNCOEI0QTM7fQotLnRleHRhcmVhZW50ZXIge2ZvbnQ6IGljb247IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6IEJsYWNrOyBib3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci13aWR0aCA6IDFweDsgYm9yZGVyLWNvbG9yOiAjQzdDNUIyOyB3aWR0aDoxMDAlOyBoZWlnaHQ6MTUwcHg7IH0KLS5iaWd0ZXh0YXJlYWVudGVyIHtmb250OiBpY29uOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiBCbGFjazsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGggOiAxcHg7IGJvcmRlci1jb2xvcjogI0M3QzVCMjsgd2lkdGg6MTAwJTsgaGVpZ2h0OjMwMHB4OyB9Ci0KLWlmcmFtZSB7Ym9yZGVyLXdpZHRoOiAycHg7IGJvcmRlci1zdHlsZTogaW5zZXQ7IH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZGZkZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9BZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbiBhY3Rpb24gPSBuZXcgQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0gIGlmIChhY3Rpb25SZXN1bHQpIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NJTCxmYWxzZSkpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLSAgZWxzZSB7Ci0gICAgaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTikgPT0gbnVsbCkgewotJT4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL2FjdGlvbnMvUmVtb3ZlRmF2b3JpdGVzQ29uZmlybUpTUC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgIH0KLSAgICBlbHNlIHsKLSU+Ci0gICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgZmF2UHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICBmYXZTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICA8L3NjcmlwdD4KLTwlCi0gICAgfQotICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiMDEwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5BZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uIGFjdGlvbiA9IEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLm5ld0FjdGlvbihjb250cm9sbGVyKTsKLQotICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICBpZiAoYWN0aW9uUmVzdWx0KSB7Ci0gICAgY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESSxmYWxzZSkpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLSAgZWxzZSB7Ci0gICAgaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTikgPT0gbnVsbCkgewotJT4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL2FjdGlvbnMvUmVtb3ZlRmF2b3JpdGVzQ29uZmlybUpTUC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgIH0KLSAgICBlbHNlIHsKLSU+Ci0gICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgZmF2UHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICBmYXZTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICA8L3NjcmlwdD4KLTwlCi0gICAgfQotICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiMjFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNBY3Rpb25JbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TaG93UGVyc3BlY3RpdmVBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5GYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzUGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLUZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uIGFjdGlvbiA9IG5ldyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1ib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLWlmIChhY3Rpb25SZXN1bHQpIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwsZmFsc2UpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi19Ci1lbHNlIHsKLSAgaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTikgPT0gbnVsbCkgewotJT4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0NvbmZpcm1KU1AuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgfQotICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBmYXZQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICBmYXZTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci19Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTk5NDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIEZhdm9yaXRlc0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiBhY3Rpb24gPSBuZXcgRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTkzNWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBGYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwMzNiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIGFjdGlvbiA9IG5ldyBGYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOGQxNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi0gICBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1RvZ2dsZU5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmExYjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVtb3ZlRmF2b3JpdGVzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuUmVtb3ZlRmF2b3JpdGVzQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgICBSZW1vdmVGYXZvcml0ZXNBY3Rpb24gYWN0aW9uID0gbmV3IFJlbW92ZUZhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0NvbmZpcm1KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNDb25maXJtSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkODljOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0NvbmZpcm1KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5SZW1vdmVGYXZvcml0ZXNBY3Rpb24iJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgaWYgKGNvbmZpcm0oIjwlPWNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlKCJNU0dfQ09ORklSTV9SRU1PVkVfTk9ERSIsIGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldE5vZGVOYW1lKCkpJT4iKSkgewotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgICAgICAlPgotICAgICAgICAgICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQsIEFjdGlvbklucHV0cy5WSUVXVE9PTElEX0RFRkFVTFQpKSklPiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmYXZQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgICAgICBmYXZTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgIH0KLSAgICA8L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3NTkxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gQ3JlYXRlIHRoZSBhY3Rpb24uCi0gICBSZXNpemVGYXZvcml0ZXNGcmFtZXNBY3Rpb24gYWN0aW9uID0gbmV3IFJlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbihjb250cm9sbGVyKTsKLSAgIAotICAgLy8gUG9wdWxhdGUgdGhlIGFjdGlvbiB3aXRoIHRoZSByZXF1ZXN0IHByb3BlcnRpZXMuCi0gICBib29sZWFuIHJlc3VsdCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICBpZiAocmVzdWx0KQotICAgewotICAgICBhY3Rpb24uZXhlY3V0ZShmYWxzZSk7Ci0gICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldC5zZXRBdHRyaWJ1dGUoImNvbHMiLCI8JT1mYXZQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSU+Iik7Ci0gICAgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0LnNldEF0dHJpYnV0ZSgicm93cyIsIjwlPWZhdlBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+Iik7Ci0gIH0KLSAgZWxzZQotICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9SZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlNGIxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5GYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgICBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBuZXcgRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgIGlmIChhY3Rpb25SZXN1bHQpIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICAgIH0KLSAgICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIGZhdlN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNDb25maXJtSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNDb25maXJtSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjNTM5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQ29uZmlybUpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIGlmIChjb25maXJtKCI8JT1jb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX0NPTkZJUk1fUkVTVE9SRV9ERUZBVUxUX0ZBVk9SSVRFUyIpJT4iKSkKLSAgICAgICAgICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvYWN0aW9ucy9SZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbkpTUC5qc3AiKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1NmUwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1TZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLS8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0vLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLWJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvU2VsZWN0Tm9kZUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiN2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLS8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0vLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLWJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvU2VsZWN0Tm9kZVRvb2xBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Tm9kZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmMTE5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeU5vZGVBY3Rpb24iICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLVNlbGVjdEZhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Tm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotLy9tYWtlIHN1cmUgdG8gcmVmcmVzaCBub2RlIHZpZXcKLWFjdGlvbi5zZXRUcmVlUmVmcmVzaE5lZWRlZCgpOwotCi0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhMGNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbUZhdm9yaXRlc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24KLVN3aXRjaFBlcnNwZWN0aXZlRnJvbUZhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBuZXcgU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLS8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0vLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLWJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3N3aXRjaHBlcnNwZWN0aXZlLmpzcCIgZmx1c2g9InRydWUiLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9hY3Rpb25zX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfYWN0aW9uc19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGE0ZWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9hY3Rpb25zX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjwlPWZhdlBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+IiBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05UQUlORVIlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTEgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuU1RBVFVTX0NPTlRBSU5FUiU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGFpbmVyLmpzcCIpKSU+IiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250YWluZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmU0MDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9uYXZpZ2F0b3JfY29udGFpbmVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX1RPT0xCQVIlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX3Rvb2xiYXIuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRFTlQlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRlbnQuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwNmNlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3RyZWV2aWV3LmNzcyIpKSU+Ij4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci0gIDwvc2NyaXB0PgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90cmVldmlldy5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08JQotICAgIFN0cmluZyBzZWxlY3RlZEFuY2hvck5hbWUgPSAiIjsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgaW50IGZvY3VzZWROb2RlSWQgPSBub2RlTWFuYWdlci5nZXRGb2N1c2VkTm9kZUlkKCk7Ci0gICAgU3RyaW5nIGZvY3VzZWRBbmNob3JOYW1lID0gU3RyaW5nLnZhbHVlT2YoZm9jdXNlZE5vZGVJZCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLSAgICAgICAgc2VsZWN0ZWRBbmNob3JOYW1lID0gc2VsZWN0ZWROb2RlLmdldEFuY2hvck5hbWUoKTsKLSAgICAgICAgaWYgKGZvY3VzZWROb2RlSWQgPT0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKQotICAgICAgICAgICAgZm9jdXNlZEFuY2hvck5hbWUgPSBzZWxlY3RlZEFuY2hvck5hbWU7Ci0gICAgfQotJT4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgb25Mb2FkPSJzZWxmLmxvY2F0aW9uLmhhc2g9JyM8JT1mb2N1c2VkQW5jaG9yTmFtZSU+JztzZXRTZWxlY3RlZEFuY2hvck5hbWUoJzwlPXNlbGVjdGVkQW5jaG9yTmFtZSU+JykiIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0cmVlY29udGVudGJvcmRlciI+Ci0gICAgPCU9bm9kZU1hbmFnZXIucmVuZGVyVHJlZVZpZXcocmVzcG9uc2UpJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X25hdmlnYXRvcl90b29sYmFyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9uYXZpZ2F0b3JfdG9vbGJhci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YTM3MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X25hdmlnYXRvcl90b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc2ZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci08L3NjcmlwdD4gIAotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgiZmF2b3JpdGVzL2FjdGlvbnMvUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChGYXZvcml0ZXNGcmFtZU5hbWVzLk5BVklHQVRPUl9DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9mb3Jtcy9Qcm9jZXNzRmF2b3JpdGVzRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvbmF2aWdhdG9yLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLTwlCi0gICBTdHJpbmcgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IG51bGw7Ci0gICBpZiAoZmF2UGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKTsKLSAgIGVsc2UKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9OQVZJR0FUT1IiKSU+PC90ZD4KLTwlCi0gICBTdHJpbmcgYWx0UmVzdG9yZSA9IGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9SRVNUT1JFX0RFRkFVTFRfRkFWT1JJVEVTIik7Ci0gICBTdHJpbmcgYWx0UmVtb3ZlID0gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1JFTU9WRV9GQVZPUklURSIpOwotJT4gICAKLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvYWN0aW9ucy9SZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0NvbmZpcm1KU1AuanNwIikpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTYgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRSZXN0b3JlJT4iIHRpdGxlPSI8JT1hbHRSZXN0b3JlJT4iPjwvYT48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0FjdGlvbkpTUC5qc3AiKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTYgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKSIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiIGFsdD0iPCU9YWx0UmVtb3ZlJT4iIHRpdGxlPSI8JT1hbHRSZW1vdmUlPiI+PC9hPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfcGVyc3BlY3RpdmVfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfcGVyc3BlY3RpdmVfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzE5YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfQ09OVEVOVCIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IGNvbHM9IjwlPWZhdlBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpJT4iIGJnY29sb3I9I0VDRTlEOD4KLSAgPCUKLSAgaWYgKG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmlzUlRMKCkpCi0gIHsKLSAgJT4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuQUNUSU9OU19DT05UQUlORVIlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfYWN0aW9uc19jb250YWluZXIuanNwIikpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250YWluZXIuanNwIikpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPCUKLSAgfQotICBlbHNlCi0gIHsKLSAgJT4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250YWluZXIuanNwIikpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuQUNUSU9OU19DT05UQUlORVIlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfYWN0aW9uc19jb250YWluZXIuanNwIikpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPCUKLSAgfQotICAlPgotPC9mcmFtZXNldD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGE4YmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5QUk9QRVJUSUVTX1RPT0xCQVIlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfdG9vbGJhci5qc3AiKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5QUk9QRVJUSUVTX0NPTlRFTlQlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NzJjMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTwlCi0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXI7Ci0gICAgICAgIGlmIChzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZFRvb2wgIT0gbnVsbCAmJiBzZWxlY3RlZFRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKSB7Ci0gICAgICAgICU+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgbG9jYXRpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChzZWxlY3RlZFRvb2wuZ2V0Rm9ybUxpbmsoKSkpJT4iOwotICAgICAgICA8L3NjcmlwdD4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0FDVElPTl9TRUxFQ1RFRCIpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAlPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fTk9ERV9TRUxFQ1RFRCIpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLSAgICA8JQotICAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfdG9vbGJhci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOTQ2NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4gIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgiZmF2b3JpdGVzL2FjdGlvbnMvUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChGYXZvcml0ZXNGcmFtZU5hbWVzLlBST1BFUlRJRVNfQ09OVEFJTkVSKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvZm9ybXMvUHJvY2Vzc0Zhdm9yaXRlc0ZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2FjdGlvbnMuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmIChmYXZQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgewotICAgICBpZiAoZmF2UGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKTsKLSAgIH0KLSAgIGlmIChkb3VibGVDbGlja0NvbHVtblRpdGxlID09IG51bGwpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkUiKTsKLSU+ICAgICAgICAKLSAgICAgICAgPHRkIGlkPSJkb3VibGVjbGlja2NvbHVtbiIgdGl0bGU9IjwlPWRvdWJsZUNsaWNrQ29sdW1uVGl0bGUlPiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfQUNUSU9OUyIpJT48L3RkPgotPCUKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLSAgICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXI7Ci0gICAgICAgIGlmIChzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPHRvb2xNYW5hZ2VyLmdldE51bWJlck9mVG9vbHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUb29sIHRvb2wgPSAoVG9vbCl0b29sTWFuYWdlci5nZXRUb29sKGkpOwotICAgICAgICAgICAgJT4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PCU9dG9vbC5yZW5kZXJUb29sKHJlc3BvbnNlLGNvbnRyb2xsZXIpJT48L3RkPgotICAgICAgICAgICAgPCUKLSAgICAgICAgfQotICAgIH0KLSU+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfc3RhdHVzX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfc3RhdHVzX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGQ2NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3N0YXR1c19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5TVEFUVVNfVE9PTEJBUiU+IiB0aXRsZT0iPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfdG9vbGJhci5qc3AiKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5TVEFUVVNfQ09OVEVOVCU+IiB0aXRsZT0iPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AiKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfc3RhdHVzX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzdmY2Q2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNyAgIDEyNzQ0MyBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLiosCi0Jb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPHByZT4KLTwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3QoZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuZ2V0TWVzc2FnZXNGcm9tTGlzdCgpKSU+Ci0gICAgICAgIDwvcHJlPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfc3RhdHVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3N0YXR1c190b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0NjZhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfc3RhdHVzX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4gIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgiZmF2b3JpdGVzL2FjdGlvbnMvUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChGYXZvcml0ZXNGcmFtZU5hbWVzLlNUQVRVU19DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9mb3Jtcy9Qcm9jZXNzRmF2b3JpdGVzRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3RhdHVzLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLTwlCi0gICBTdHJpbmcgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IG51bGw7Ci0gICBpZiAoZmF2UGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgIHsKLSAgICAgaWYgKGZhdlBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOyAgICAgICAKLSAgIH0KLSAgIGlmIChkb3VibGVDbGlja0NvbHVtblRpdGxlID09IG51bGwpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkUiKTsKLSU+ICAgICAgICAKLSAgICAgICAgPHRkIGlkPSJkb3VibGVjbGlja2NvbHVtbiIgdGl0bGU9IjwlPWRvdWJsZUNsaWNrQ29sdW1uVGl0bGUlPiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfU1RBVFVTIiklPjwvdGQ+Ci08JQotICAgU3RyaW5nIGFsdENsZWFyID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfQ0xFQVIiKTsKLSU+ICAgICAgICAgICAKLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3N0YXR1c19jb250ZW50LmpzcCIpKSU+IiB0YXJnZXQ9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuU1RBVFVTX0NPTlRFTlQlPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRDbGVhciU+IiB0aXRsZT0iPCU9YWx0Q2xlYXIlPiI+PC9hPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI0MTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1Qcm9wZXJ0aWVzIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgLy8gVGhlIHNlbGVjdGVkIG5vZGUgbXVzdCBiZSBhIEZhdm9yaXRlc1dTRExTZXJ2aWNlTm9kZS4KLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgZm9ybVByb3BlcnRpZXMucHV0KCJmb3JtQWN0aW9uTGluayIsImZhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcCIpOwotICAgZm9ybVByb3BlcnRpZXMucHV0KCJ3c2RsVVJMIix3c2RsRWxlbWVudC5nZXRXc2RsVXJsKCkpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL0ltcG9ydFdTRExBbmRXU0lMVG9Xb3JrYmVuY2hGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzMjNkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbkxpbmsiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUFjdGlvbkxpbmsuYXBwZW5kKCJmYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uSlNQLmpzcCIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNQYWdlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNQYWdlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0YWFjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzUGFnZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgICAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9VRERJX0JVU0lORVNTX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotCi0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfRkFWT1JJVEVTX1VERElfQlVTSU5FU1NfREVUQUlMUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCkgewotICAgICAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudClzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgJT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQlVTSU5FU1NfTkFNRSIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1idXNFbGVtZW50LmdldE5hbWUoKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5RVUlSWV9VUkwiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9YnVzRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JVU0lORVNTX0tFWSIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1idXNFbGVtZW50LmdldEJ1c2luZXNzS2V5KCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4gICAgICAgIAotCi0gICAgPCUKLSAgICB9Ci0gICAgJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc1BhZ2UuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzI0MjVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGkuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfVURESV9SRUdJU1RSWV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLQotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19VRERJX1JFR0lTVFJZX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpIHsKLSAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgICAgICBTdHJpbmcgcmVnaXN0cnlOYW1lID0gcmVnRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgJT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRSIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1yZWdpc3RyeU5hbWUlPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lOUVVJUllfVVJMIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcmVnRWxlbWVudC5nZXRQdWJsaXNoVVJMKCk7Ci0gICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocHVibGlzaFVSTCkpCi0gICAgIHsKLSU+Ci0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfVVJMIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXB1Ymxpc2hVUkwlPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPCUKLSAgICAgfQotICAgCi0gICAgIFN0cmluZyByZWdpc3RyeVVSTCA9IHJlZ0VsZW1lbnQuZ2V0UmVnaXN0cmF0aW9uVVJMKCk7Ci0gICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocmVnaXN0cnlVUkwpKQotICAgICB7Ci0lPgotICAgICAgICAgICAgPGJyPgotICAgICAgICAgICAgPHRhYmxlPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfVVJMIixyZWdpc3RyeVVSTCklPgotICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3RhYmxlPgotPCUKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nQnVmZmVyIGNhdGVnb3J5RGlyZWN0b3J5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudC5mb3JtQ2F0ZWdvcmllc0RpcmVjdG9yeShjYXRlZ29yeURpcmVjdG9yeSxjb250cm9sbGVyLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkscmVnaXN0cnlOYW1lKTsKLSAgICAgIEZpbGUgY2F0ZWdvcnlEaXJlY3RvcnlGaWxlID0gbmV3IEZpbGUoY2F0ZWdvcnlEaXJlY3RvcnkudG9TdHJpbmcoKSk7Ci0gICAgICBTdHJpbmdbXSBjYXRlZ29yeUZpbGVzID0gY2F0ZWdvcnlEaXJlY3RvcnlGaWxlLmxpc3QoKTsKLSAgICAgIGlmIChjYXRlZ29yeUZpbGVzICE9IG51bGwpCi0gICAgICB7Ci0lPgotPGJyPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVTIiklPgotICAgIDwvdGg+Ci0gIDwvdHI+Ci08JSAgICAgIAotICAgICAgICBmb3IgKGludCBpPTA7aTxjYXRlZ29yeUZpbGVzLmxlbmd0aDtpKyspCi0gICAgICAgIHsKLSU+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgPCU9Y2F0ZWdvcnlGaWxlc1tpXSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwlICAgICAgICAKLSAgICAgICAgfQotJT4KLTwvdGFibGU+Ci08JSAgICAgICAgCi0gICAgICB9ICAgICAgCi0lPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlICAgICAgCi0gICAgfQotJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNQYWdlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1NmY1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGkuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLQotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfREVUQUlMUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50KSB7Ci0gICAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCBzZXJFbGVtZW50ID0gKEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudClzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgJT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0VSVklDRV9OQU1FIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXNlckVsZW1lbnQuZ2V0TmFtZSgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTlFVSVJZX1VSTCIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1zZXJFbGVtZW50LmdldElucXVpcnlVUkwoKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0VSVklDRV9LRVkiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9c2VyRWxlbWVudC5nZXRTZXJ2aWNlS2V5KCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4gICAgICAgIAotCi0gICAgPCUKLSAgICB9Ci0gICAgJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVNlcnZpY2VJbnREZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJU2VydmljZUludERldGFpbHNQYWdlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxYTBmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJU2VydmljZUludERldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGkuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpIHsKLSAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNlckludEVsZW1lbnQgPSAoRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICAlPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXNlckludEVsZW1lbnQuZ2V0TmFtZSgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTlFVSVJZX1VSTCIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1zZXJJbnRFbGVtZW50LmdldElucXVpcnlVUkwoKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfS0VZIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXNlckludEVsZW1lbnQuZ2V0U2VydmljZUludGVyZmFjZUtleSgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgICAgICAKLQotICAgIDwlCi0gICAgfQotICAgICU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmQwMDNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1VzZXJEZWZVRERJUmVnaXN0cnlEZXRhaWxzUGFnZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA5MTIgICAxNDE3OTYgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlRheG9ub21pZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgICAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9VU0VSX0RFRl9VRERJX1JFR0lTVFJZX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotCi0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfRkFWT1JJVEVTX1VTRVJfREVGX1VERElfUkVHSVNUUllfREVUQUlMUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUVsZW1lbnQpIHsKLSAgICAgICAgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RWxlbWVudClzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgICAgIHJlZ0VsZW1lbnQucmVmcmVzaE1ldGEoKTsgICAgICAKLSAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSByZWdFbGVtZW50LmdldFZlcnNpb24oKTsKLSAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAlPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVURESV9WRVJTSU9OIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXZlcnNpb24lPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0KLSAgICAgICAgPCUKLSAgICAgICAgTGlzdCBuYW1lcyA9IHJlZ0VsZW1lbnQuZ2V0TmFtZXMoKTsKLSAgICAgICAgaWYgKG5hbWVzICE9IG51bGwgJiYgIW5hbWVzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAlPgotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiB3aWR0aD0iMSIgbm93cmFwPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xBTkdVQUdFIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRSIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbmFtZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpaXQubmV4dCgpOwotICAgICAgICAgICAgICBTdHJpbmcgbGFuZyA9IG5hbWUuZ2V0TGFuZygpOwotICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT1sYW5nICE9IG51bGwgPyBsYW5nIDogIi0tIiU+PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjwlPW5hbWUuZ2V0VmFsdWUoKSU+PC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgJT4KLQotICAgICAgICA8JQotICAgICAgICBMaXN0IGRlc2NzID0gcmVnRWxlbWVudC5nZXREZXNjcygpOwotICAgICAgICBpZiAoZGVzY3MgIT0gbnVsbCAmJiAhZGVzY3MuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICU+Ci0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIHdpZHRoPSIxIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEFOR1VBR0UiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVNDIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBkZXNjcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBkZXNjID0gKERlc2NyaXB0aW9uKWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGxhbmcgPSBkZXNjLmdldExhbmcoKTsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PCU9bGFuZyAhPSBudWxsID8gbGFuZyA6ICItLSIlPjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT1kZXNjLmdldFZhbHVlKCklPjwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAlPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0KLSAgICAgICAgPCUKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRMb2dpbiA9IHJlZ0VsZW1lbnQuZ2V0RGVmYXVsdExvZ2luKCk7Ci0gICAgICAgIGlmIChkZWZhdWx0TG9naW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAlPgotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERUZBVUxUX0xPR0lOIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWRlZmF1bHRMb2dpbiU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgJT4KLQotICAgICAgICA8JQotICAgICAgICBTdHJpbmcgZGVmYXVsdFBhc3N3b3JkID0gcmVnRWxlbWVudC5nZXREZWZhdWx0UGFzc3dvcmQoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRQYXNzd29yZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICU+Ci0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFRkFVTFRfUEFTU1dPUkQiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZGVmYXVsdFBhc3N3b3JkJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotCi0gICAgICAgIDwlCi0gICAgICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gcmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgICAgIGlmIChpbnF1aXJ5VVJMICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgJT4KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5RVUlSWV9VUkwiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9aW5xdWlyeVVSTCU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgJT4KLQotICAgICA8JQotICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHB1Ymxpc2hVUkwpKQotICAgICB7Ci0gICAgICU+Ci0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfVVJMIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXB1Ymxpc2hVUkwlPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICA8JQotICAgICB9Ci0KLSAgICAgU3RyaW5nIHNlY3VyZUlucXVpcnlVUkwgPSByZWdFbGVtZW50LmdldFNlY3VyZUlucXVpcnlVUkwoKTsKLSAgICAgaWYgKFZhbGlkYXRvci52YWxpZGF0ZVVSTChzZWN1cmVJbnF1aXJ5VVJMKSkKLSAgICAgewotICAgICAlPgotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRUNVUkVfSU5RVUlSWV9VUkwiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9c2VjdXJlSW5xdWlyeVVSTCU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgIDwlCi0gICAgIH0KLQotICAgICBTdHJpbmcgc2VjdXJlUHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0U2VjdXJlUHVibGlzaFVSTCgpOwotICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHNlY3VyZVB1Ymxpc2hVUkwpKQotICAgICB7Ci0gICAgICU+Ci0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NFQ1VSRV9QVUJMSVNIX1VSTCIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1zZWN1cmVQdWJsaXNoVVJMJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgPCUKLSAgICAgfQotICAgICAlPgotICAgICAKLSAgICAgPCUKLSAgICAgVGF4b25vbXlbXSB0YXhvbm9taWVzID0gcmVnRWxlbWVudC5nZXRUYXhvbm9taWVzKCk7Ci0gICAgIGlmICh0YXhvbm9taWVzICE9IG51bGwgJiYgdGF4b25vbWllcy5sZW5ndGggPiAwKQotICAgICB7Ci0gICAgICU+Ci0gICAgICAgPGJyPgotICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgIDx0cj4KLSAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9UQVhPTk9NWSIpJT4KLSAgICAgICAgICAgPC90aD4KLSAgICAgICAgIDwvdHI+Ci0gICAgICAgICA8JQotICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRheG9ub21pZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgIFRheG9ub215IHRheG9ub215ID0gdGF4b25vbWllc1tpXTsKLSAgICAgICAgICU+Ci0gICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PCU9dGF4b25vbXkuZ2V0TmFtZSgpJT48L3RkPgotICAgICAgICAgPC90cj4KLSAgICAgICAgIDwlCi0gICAgICAgICB9Ci0gICAgICAgICAlPgotICAgICAgIDwvdGFibGU+Ci0gICAgICAgPCUKLSAgICAgfQotICAgICAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUgICAgICAKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNXU0RMRGV0YWlsc1BhZ2UuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NETERldGFpbHNQYWdlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwNmY0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNXU0RMRGV0YWlsc1BhZ2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfV1NETF9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLQotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19XU0RMX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCkgewotICAgICAgICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICAlPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VUkwiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9d3NkbEVsZW1lbnQuZ2V0V3NkbFVybCgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgICAgICAKLQotICAgIDwlCi0gICAgfQotICAgICU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1dTSUxEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNXU0lMRGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBkY2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1dTSUxEZXRhaWxzUGFnZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzaWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTSUxfREVUQUlMUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfV1NJTF9ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNXU0lMRWxlbWVudCkgewotICAgICAgICBGYXZvcml0ZXNXU0lMRWxlbWVudCB3c2lsRWxlbWVudCA9IChGYXZvcml0ZXNXU0lMRWxlbWVudClzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgICAgICU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VSTCIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT13c2lsRWxlbWVudC5nZXRXc2lsVXJsKCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4gICAgICAgIAotCi0gICAgICAgIDwlCi0gICAgfQotICAgICU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL1Byb2Nlc3NGYXZvcml0ZXNGcmFtZXNldHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL1Byb2Nlc3NGYXZvcml0ZXNGcmFtZXNldHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5YTcxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9Qcm9jZXNzRmF2b3JpdGVzRnJhbWVzZXRzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoZm9ybUFjdGlvbi50b1N0cmluZygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjAiPgotICA8aW5wdXQgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLkZSQU1FX05BTUUlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9Zm9ybUZyYW1lTmFtZSU+Ij4KLSAgPGlucHV0IG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUiU+IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8JT1mYXZQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCklPiI+Ci08L2Zvcm0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fdWRkaV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fdWRkaV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1ZDE5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3VkZGlfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3VkZGlfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2FkZF90b191ZGRpX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhM2RkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3VkZGlfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2FkZF90b193c2lsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2FkZF90b193c2lsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQxODQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fd3NpbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fd3NpbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3dzaWxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjJiOGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fd3NpbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfV1NJTF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhMDk4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfV1NJTF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhNGNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X2J1c2luZXNzX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWUzN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9idXNpbmVzc19oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9idXNpbmVzc19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MWI5NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9yZWdpc3RyeV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWExNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9yZWdpc3RyeV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3JlZ2lzdHJ5X2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3JlZ2lzdHJ5X2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxZWNiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1MWRhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlMTMzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfaW50ZXJmYWNlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Njk4NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2ludGVyZmFjZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2ludGVyZmFjZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTMxMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfd3NkbF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzAyODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfd3NkbF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfd3NkbF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGM4ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfd3NkbF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9idXNpbmVzc19ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX2J1c2luZXNzX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q2YTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX2J1c2luZXNzX25vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3VkZGlfcmVnaXN0cnlfY2F0X25vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3VkZGlfcmVnaXN0cnlfY2F0X25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWVjMjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3JlZ2lzdHJ5X2NhdF9ub2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3JlZ2lzdHJ5X25vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3VkZGlfcmVnaXN0cnlfbm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDNjYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3VkZGlfcmVnaXN0cnlfbm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9zZXJ2aWNlX2ludGVyZmFjZV9ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3NlcnZpY2VfaW50ZXJmYWNlX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMyNWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3NlcnZpY2VfaW50ZXJmYWNlX25vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3VkZGlfc2VydmljZV9ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3NlcnZpY2Vfbm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDI1MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3VkZGlfc2VydmljZV9ub2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy93c2RsX3NlcnZpY2Vfbm9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvd3NkbF9zZXJ2aWNlX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy93c2RsX3NlcnZpY2Vfbm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvd3NpbF9ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy93c2lsX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzU5MTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy93c2lsX25vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc0Zvcm1TdWJtaXQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNGb3JtU3VibWl0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1ZmU5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc0Zvcm1TdWJtaXQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgZnVuY3Rpb24gaXNTb21ldGhpbmdTZWxlY3RlZCh0YWJsZUNvbnRhaW5lcklkKSB7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93czsgaTx0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgcm93Q2hlY2tib3hDZWxsID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKS5pdGVtKDApOwotICAgICAgICAgICAgdmFyIHJvd0NoZWNrYm94ID0gcm93Q2hlY2tib3hDZWxsLmNoaWxkTm9kZXNbMF07Ci0gICAgICAgICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhbGVydCgiPCU9Y29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KHRhYmxlQ29udGFpbmVySWQsIGZvcm0sIGxvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChpc1NvbWV0aGluZ1NlbGVjdGVkKHRhYmxlQ29udGFpbmVySWQpKQotICAgICAgICAgICAgc2V0TG9jYXRpb25BbmRTdWJtaXQoZm9ybSwgbG9jYXRpb24pOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHNldExvY2F0aW9uQW5kU3VibWl0KGZvcm0sIGxvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3JtLmFjdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICAgIGZvcm0uc3VibWl0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzUGFuZXMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTU4OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciBmYXZOYXZpZ2F0b3JDb250YWluZXIgPSBwZXJzcGVjdGl2ZUNvbnRlbnQuZnJhbWVzWyI8JT1GYXZvcml0ZXNGcmFtZU5hbWVzLk5BVklHQVRPUl9DT05UQUlORVIlPiJdOwotICB2YXIgZmF2TmF2aWdhdG9yVG9vbGJhciA9IGZhdk5hdmlnYXRvckNvbnRhaW5lci5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX1RPT0xCQVIlPiJdOwotICB2YXIgZmF2TmF2aWdhdG9yQ29udGVudCA9IGZhdk5hdmlnYXRvckNvbnRhaW5lci5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRFTlQlPiJdOwotICB2YXIgZmF2QWN0aW9uc0NvbnRhaW5lciA9IHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuQUNUSU9OU19DT05UQUlORVIlPiJdOwotICB2YXIgZmF2UHJvcGVydGllc0NvbnRhaW5lciA9IGZhdkFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1GYXZvcml0ZXNGcmFtZU5hbWVzLlBST1BFUlRJRVNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIGZhdlByb3BlcnRpZXNUb29sYmFyID0gZmF2UHJvcGVydGllc0NvbnRhaW5lci5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuUFJPUEVSVElFU19UT09MQkFSJT4iXTsKLSAgdmFyIGZhdlByb3BlcnRpZXNDb250ZW50ID0gZmF2UHJvcGVydGllc0NvbnRhaW5lci5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05URU5UJT4iXTsKLSAgdmFyIGZhdlN0YXR1c0NvbnRhaW5lciA9IGZhdkFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1GYXZvcml0ZXNGcmFtZU5hbWVzLlNUQVRVU19DT05UQUlORVIlPiJdOwotICB2YXIgZmF2U3RhdHVzVG9vbGJhciA9IGZhdlN0YXR1c0NvbnRhaW5lci5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuU1RBVFVTX1RPT0xCQVIlPiJdOwotICB2YXIgZmF2U3RhdHVzQ29udGVudCA9IGZhdlN0YXR1c0NvbnRhaW5lci5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuU1RBVFVTX0NPTlRFTlQlPiJdOwotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzVGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzZhZDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzVGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotCi0gICAgZnVuY3Rpb24gZmF2SGFuZGxlQ2hlY2tBbGxDbGljayh0YWJsZUNvbnRhaW5lcklkLCBjaGVja0FsbENoZWNrYm94KSB7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93czsgaTx0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgcm93Q2hlY2tib3hDZWxsID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKS5pdGVtKDApOwotICAgICAgICAgICAgdmFyIHJvd0NoZWNrYm94ID0gcm93Q2hlY2tib3hDZWxsLmNoaWxkTm9kZXNbMF07Ci0gICAgICAgICAgICByb3dDaGVja2JveC5jaGVja2VkID0gY2hlY2tBbGxDaGVja2JveC5jaGVja2VkOwotICAgICAgICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRSb3codGFibGUucm93c1tpXSwicm93Y29sb3IiKTsKLSAgICAgICAgICAgICAgICByb3dDaGVja2JveC5uYW1lID0gIjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NQVNTX0FDVElPTl9OT0RFX0lEJT4iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGlnaGxpZ2h0Um93KHRhYmxlLnJvd3NbaV0sInRhYmxlY2VsbHMiKTsKLSAgICAgICAgICAgICAgICByb3dDaGVja2JveC5uYW1lID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiB2YWxpZGF0ZUNoZWNrQm94SW5wdXQoY2hlY2tib3gsIGlzQ2hlY2tlZCkgewotICAgICAgICBpZiAoaXNDaGVja2VkKSB7Ci0gICAgICAgICAgICBjaGVja2JveC5uYW1lID0gIjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NQVNTX0FDVElPTl9OT0RFX0lEJT4iOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2hlY2tib3gubmFtZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGhhbmRsZVJvd0NoZWNrYm94Q2xpY2soKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiB0d2lzdEluaXQodGFibGVDb250YWluZXJJZCx0d2lzdEltYWdlTmFtZSkgewotICAgICAgICB2YXIgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICAgICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgICAgIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA+IG51bWJlck9mSGVhZGVyUm93cykgewotICAgICAgICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgICAgICAgIHR3aXN0KHRhYmxlQ29udGFpbmVySWQsIHR3aXN0SW1hZ2VOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgICAgICAgIHR3aXN0KHRhYmxlQ29udGFpbmVySWQsIHR3aXN0SW1hZ2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc2ZyYW1lc2V0cy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc2ZyYW1lc2V0cy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYmUwOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNmcmFtZXNldHMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKQotICB7Ci0gICAgcmV0dXJuIHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuQUNUSU9OU19DT05UQUlORVIlPiJdLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFtZXNldCIpLml0ZW0oMCk7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzZXRTaXplcyhmcmFtZXNldFNpemVzRm9ybSkKLSAgewotICAgIHRvZ2dsZURvdWJsZUNsaWNrQ29sdW1uVGl0bGUoKTsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UJT4udmFsdWUgPSBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldC5jb2xzOwotICAgIGZyYW1lc2V0U2l6ZXNGb3JtLjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSJT4udmFsdWUgPSBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQucm93czsKLSAgICBmcmFtZXNldFNpemVzRm9ybS5zdWJtaXQoKTsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElCdXNpbmVzc1ZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESUJ1c2luZXNzVmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDE3MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESUJ1c2luZXNzVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgU3RyaW5nIGRpdkZhdm9yaXRlVURESUJ1c2luZXNzVGFibGUgPSAiZGl2RmF2b3JpdGVVRERJQnVzaW5lc3NUYWJsZSI7Ci0gICAgU3RyaW5nIHhkaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlID0gInhkaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlIjsKLQotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VERElfQlVTSU5FU1NfTElTVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAid3NpbC9pbWFnZXMvbGlzdF9idXNpbmVzc19oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTUyIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1NfREVTQyIpJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZW1vdmVGYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50KSB7Ci0gICAgJT4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiU+IiB2YWx1ZT0iMSI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2RmF2b3JpdGVVRERJQnVzaW5lc3NUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlVURESUJ1c2luZXNzVGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhkaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9CVVNJTkVTUyIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9ZGl2RmF2b3JpdGVVRERJQnVzaW5lc3NUYWJsZSU+Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJmYXZIYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9ICgoRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbEZhdm9yaXRlcygpOwotICAgICAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAJc29ydGVkVmVjdG9yLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgICBRdWlja1NvcnQuc29ydChzb3J0ZWRWZWN0b3IpOwotICAgICAgICAgICAgICAgIGUgPSBzb3J0ZWRWZWN0b3IuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50IGZhdlVERElCdXNpbmVzc0VsZW1lbnQgPSAoRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGUoZmF2VURESUJ1c2luZXNzRWxlbWVudCkuZ2V0Tm9kZUlkKCklPiIgb25DbGljaz0idmFsaWRhdGVDaGVja0JveElucHV0KHRoaXMsIHRoaXMuY2hlY2tlZCkiICB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Q2hpbGROb2RlKGZhdlVERElCdXNpbmVzc0VsZW1lbnQpLmdldE5vZGVJZCgpLCBmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PCU9ZmF2VURESUJ1c2luZXNzRWxlbWVudC5nZXROYW1lKCklPjwvYT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2RmF2b3JpdGVVRERJQnVzaW5lc3NUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlVURESUJ1c2luZXNzVGFibGUlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlVURESUJ1c2luZXNzVGFibGUlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVNT1ZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlJT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLSAgICA8L2Zvcm0+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElSZWdpc3RyeVZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5Vmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDFiNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5Vmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgU3RyaW5nIGRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUgPSAiZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSI7Ci0gICAgU3RyaW5nIHhkaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlID0gInhkaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlIjsKLQotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VERElfUkVHSVNUUllfTElTVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9GQVZPUklURV9VRERJX1JFR0lTVFJZIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWV9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZW1vdmVGYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KSB7Ci0gICAgJT4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OJT4iIHZhbHVlPSIxIj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1kaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4nLCc8JT14ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+JykiPjxpbWcgbmFtZT0iPCU9eGRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+PCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1JFR0lTVFJZIiklPjwvc3Ryb25nPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8ZGl2IGlkPSI8JT1kaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImZhdkhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPWRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gKChGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgICAgICAgICAgICAgVmVjdG9yIHNvcnRlZFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIAlzb3J0ZWRWZWN0b3IuYWRkKGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgICAgIFF1aWNrU29ydC5zb3J0KHNvcnRlZFZlY3Rvcik7Ci0gICAgICAgICAgICAgICAgZSA9IHNvcnRlZFZlY3Rvci5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQgZmF2VURESVJlZ2lzdHJ5RWxlbWVudCA9IChGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giICBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTUFTU19BQ1RJT05fTk9ERV9JRCU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZVRERJUmVnaXN0cnlFbGVtZW50KS5nZXROb2RlSWQoKSU+IiBvbkNsaWNrPSJ2YWxpZGF0ZUNoZWNrQm94SW5wdXQodGhpcywgdGhpcy5jaGVja2VkKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZVRERJUmVnaXN0cnlFbGVtZW50KS5nZXROb2RlSWQoKSwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPWZhdlVERElSZWdpc3RyeUVsZW1lbnQuZ2V0TmFtZSgpJT48L2E+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAlPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICB0d2lzdEluaXQoJzwlPWRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4nKTsKLSAgICAgICAgPC9zY3JpcHQ+Ci0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lNUE9SVF9UT19VRERJX1BFUlNQRUNUSVZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1JFTU9WRSIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci0gICAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZVZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczNDI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZVZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuUXVpY2tTb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUgPSAiZGl2RmF2b3JpdGVVRERJU2VydmljZUludFRhYmxlIjsKLSAgICBTdHJpbmcgeGRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSA9ICJ4ZGl2RmF2b3JpdGVVRERJU2VydmljZUludFRhYmxlIjsKLQotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTElTVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZW1vdmVGYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+JykiPjxpbWcgbmFtZT0iPCU9eGRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0UiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJmYXZIYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gKChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICAgICAgICAgICAgICBWZWN0b3Igc29ydGVkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgCXNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgUXVpY2tTb3J0LnNvcnQoc29ydGVkVmVjdG9yKTsKLSAgICAgICAgICAgICAgICBlID0gc29ydGVkVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IGZhdlVERElTZXJJbnRFbGVtZW50ID0gKEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGUoZmF2VURESVNlckludEVsZW1lbnQpLmdldE5vZGVJZCgpJT4iIG9uQ2xpY2s9InZhbGlkYXRlQ2hlY2tCb3hJbnB1dCh0aGlzLCB0aGlzLmNoZWNrZWQpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Q2hpbGROb2RlKGZhdlVERElTZXJJbnRFbGVtZW50KS5nZXROb2RlSWQoKSwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPWZhdlVERElTZXJJbnRFbGVtZW50LmdldE5hbWUoKSU+PC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgJT4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgdHdpc3RJbml0KCc8JT1kaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SRU1PVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci0gICAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJU2VydmljZVZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmNTM2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJU2VydmljZVZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuUXVpY2tTb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZGYXZvcml0ZVVERElTZXJ2aWNlVGFibGUgPSAiZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlIjsKLSAgICBTdHJpbmcgeGRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSA9ICJ4ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlIjsKLQotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VERElfU0VSVklDRV9MSVNUIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNGb3JtU3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzaWwvaW1hZ2VzL2xpc3RfVURESV9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+ICAgIAotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDsiPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiU+IiB2YWx1ZT0iMSI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlJT4nLCc8JT14ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlJT4nKSI+PGltZyBuYW1lPSI8JT14ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9TRVJWSUNFIiklPjwvc3Ryb25nPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8ZGl2IGlkPSI8JT1kaXZGYXZvcml0ZVVERElTZXJ2aWNlVGFibGUlPiI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iZmF2SGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9ICgoRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgICAgICAgICAgICAgVmVjdG9yIHNvcnRlZFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIAlzb3J0ZWRWZWN0b3IuYWRkKGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgICAgIFF1aWNrU29ydC5zb3J0KHNvcnRlZFZlY3Rvcik7Ci0gICAgICAgICAgICAgICAgZSA9IHNvcnRlZFZlY3Rvci5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCBmYXZVRERJU2VydmljZUVsZW1lbnQgPSAoRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giICBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTUFTU19BQ1RJT05fTk9ERV9JRCU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZVRERJU2VydmljZUVsZW1lbnQpLmdldE5vZGVJZCgpJT4iIG9uQ2xpY2s9InZhbGlkYXRlQ2hlY2tCb3hJbnB1dCh0aGlzLCB0aGlzLmNoZWNrZWQpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Q2hpbGROb2RlKGZhdlVERElTZXJ2aWNlRWxlbWVudCkuZ2V0Tm9kZUlkKCksIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1mYXZVRERJU2VydmljZUVsZW1lbnQuZ2V0TmFtZSgpJT48L2E+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAlPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICB0d2lzdEluaXQoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSU+Jyk7Ci0gICAgICAgIDwvc2NyaXB0PgotCi0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTVBPUlRfVE9fVURESV9QRVJTUEVDVElWRSIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlJT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1JFTU9WRSIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlJT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLSAgICA8L2Zvcm0+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVzZXJEZWZVRERJUmVnaXN0cnlWaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVzZXJEZWZVRERJUmVnaXN0cnlWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhNzdhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVc2VyRGVmVURESVJlZ2lzdHJ5Vmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgU3RyaW5nIGRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUgPSAiZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSI7Ci0gICAgU3RyaW5nIHhkaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlID0gInhkaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlIjsKLQotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VTRVJfREVGX1VERElfUkVHSVNUUllfTElTVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9GQVZPUklURV9VU0VSX0RFRl9VRERJX1JFR0lTVFJZIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVVNFUl9ERUZfVURESV9SRUdJU1RSWV9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZW1vdmVGYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiU+IiB2YWx1ZT0iMSI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhkaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRkFWT1JJVEVfVVNFUl9ERUZfVURESV9SRUdJU1RSWSIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJmYXZIYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9ICgoRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICAgICAgICAgICAgICBWZWN0b3Igc29ydGVkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgCXNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgUXVpY2tTb3J0LnNvcnQoc29ydGVkVmVjdG9yKTsKLSAgICAgICAgICAgICAgICBlID0gc29ydGVkVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVXNlckRlZlVERElSZWdpc3RyeUVsZW1lbnQgZmF2VURESVJlZ2lzdHJ5RWxlbWVudCA9IChGYXZvcml0ZXNVc2VyRGVmVURESVJlZ2lzdHJ5RWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGUoZmF2VURESVJlZ2lzdHJ5RWxlbWVudCkuZ2V0Tm9kZUlkKCklPiIgb25DbGljaz0idmFsaWRhdGVDaGVja0JveElucHV0KHRoaXMsIHRoaXMuY2hlY2tlZCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGUoZmF2VURESVJlZ2lzdHJ5RWxlbWVudCkuZ2V0Tm9kZUlkKCksIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1mYXZVRERJUmVnaXN0cnlFbGVtZW50LmdldE5hbWUoKSU+PC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgJT4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgdHdpc3RJbml0KCc8JT1kaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4nLCc8JT14ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+Jyk7Ci0gICAgICAgIDwvc2NyaXB0PgotCi0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTVBPUlRfVE9fVURESV9QRVJTUEVDVElWRSIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLSAgICA8L2Zvcm0+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVdTRExTZXJ2aWNlVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVXU0RMU2VydmljZVZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTUxYWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVdTRExTZXJ2aWNlVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgU3RyaW5nIGRpdkZhdm9yaXRlV1NETFRhYmxlID0gImRpdkZhdm9yaXRlV1NETFRhYmxlIjsKLSAgICBTdHJpbmcgeGRpdkZhdm9yaXRlV1NETFRhYmxlID0gInhkaXZGYXZvcml0ZVdTRExUYWJsZSI7Ci0KLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZvcml0ZXNQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiVklFV19USVRMRV9XU0RMX1NFUlZJQ0VfTElTVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ3c2lsL2ltYWdlcy9saXN0X1dTRExfc2VydmljZV9oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX0ZBVk9SSVRFX1dTRExfU0VSVklDRSIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1dTRExfU0VSVklDRV9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZW1vdmVGYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlckVsZW1lbnQpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdkZhdm9yaXRlV1NETFRhYmxlJT4nLCc8JT14ZGl2RmF2b3JpdGVXU0RMVGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhkaXZGYXZvcml0ZVdTRExUYWJsZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1dTREwiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdkZhdm9yaXRlV1NETFRhYmxlJT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImZhdkhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPWRpdkZhdm9yaXRlV1NETFRhYmxlJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVVJMIiklPjwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gKChGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlckVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICAgICAgICAgICAgICBWZWN0b3Igc29ydGVkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgCXNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgUXVpY2tTb3J0LnNvcnQoc29ydGVkVmVjdG9yKTsKLSAgICAgICAgICAgICAgICBlID0gc29ydGVkVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IGZhdldTRExTZXJ2aWNlRWxlbWVudCA9IChGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgIG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NQVNTX0FDVElPTl9OT0RFX0lEJT4iIHZhbHVlPSI8JT1zZWxlY3RlZE5vZGUuZ2V0Q2hpbGROb2RlKGZhdldTRExTZXJ2aWNlRWxlbWVudCkuZ2V0Tm9kZUlkKCklPiIgb25DbGljaz0idmFsaWRhdGVDaGVja0JveElucHV0KHRoaXMsIHRoaXMuY2hlY2tlZCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGUoZmF2V1NETFNlcnZpY2VFbGVtZW50KS5nZXROb2RlSWQoKSwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPWZhdldTRExTZXJ2aWNlRWxlbWVudC5nZXRXc2RsVXJsKCklPjwvYT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2RmF2b3JpdGVXU0RMVGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVdTRExUYWJsZSU+Jyk7Ci0gICAgICAgIDwvc2NyaXB0PgotCi0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTVBPUlRfVE9fV1NETF9QRVJTUEVDVElWRSIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2RmF2b3JpdGVXU0RMVGFibGUlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVNT1ZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVdTRExUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci0gICAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVXU0lMVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVXU0lMVmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDUxMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlV1NJTFZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuUXVpY2tTb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZGYXZvcml0ZVdTSUxUYWJsZSA9ICJkaXZGYXZvcml0ZVdTSUxUYWJsZSI7Ci0gICAgU3RyaW5nIHhkaXZGYXZvcml0ZVdTSUxUYWJsZSA9ICJ4ZGl2RmF2b3JpdGVXU0lMVGFibGUiOwotCi0gICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2b3JpdGVzUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlZJRVdfVElUTEVfV1NJTF9MSVNUIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNGb3JtU3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfV1NJTCIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1dTSUxfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4gICAgCi0gICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyI+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzV1NJTEZvbGRlckVsZW1lbnQpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdkZhdm9yaXRlV1NJTFRhYmxlJT4nLCc8JT14ZGl2RmF2b3JpdGVXU0lMVGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhkaXZGYXZvcml0ZVdTSUxUYWJsZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1dTSUwiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdkZhdm9yaXRlV1NJTFRhYmxlJT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImZhdkhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPWRpdkZhdm9yaXRlV1NJTFRhYmxlJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVVJMIiklPjwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50IGZhdldTSUxGb2xkZXJFbGVtZW50ID0gKEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBmYXZXU0lMRm9sZGVyRWxlbWVudC5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFF1aWNrU29ydC5zb3J0KHNvcnRlZFZlY3Rvcik7Ci0gICAgICAgICAgICBlID0gc29ydGVkVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIEZhdm9yaXRlc1dTSUxFbGVtZW50IGZhdldTSUxFbGVtZW50ID0gKEZhdm9yaXRlc1dTSUxFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giICBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTUFTU19BQ1RJT05fTk9ERV9JRCU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZXU0lMRWxlbWVudCkuZ2V0Tm9kZUlkKCklPiIgb25DbGljaz0idmFsaWRhdGVDaGVja0JveElucHV0KHRoaXMsIHRoaXMuY2hlY2tlZCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZXU0lMRWxlbWVudCkuZ2V0Tm9kZUlkKCksIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1mYXZXU0lMRWxlbWVudC5nZXRXc2lsVXJsKCklPjwvYT48L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2RmF2b3JpdGVXU0lMVGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVdTSUxUYWJsZSU+Jyk7Ci0gICAgICAgIDwvc2NyaXB0PgotCi0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVdTSUxUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVNT1ZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVdTSUxUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSAgICAlPgotICAgIDwvZm9ybT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL0ltcG9ydFRvV29ya2JlbmNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL0ltcG9ydFRvV29ya2JlbmNoRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzYwYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9JbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTI3NDQzIGplc3BlckBzZWxza2FiZXQub3JnIC0gSmVzcGVyIFMgTW9sbGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1Qcm9wZXJ0aWVzIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiLz4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfSU1QT1JUX1RPX1dPUktCRU5DSCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm11dGlscy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgIAotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgoU3RyaW5nKWZvcm1Qcm9wZXJ0aWVzLmdldCgiZm9ybUFjdGlvbkxpbmsiKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRfRklMRSU+IiB2YWx1ZT0iPCU9QWN0aW9uSW5wdXRzLklNUE9SVF9GSUxFJT4iPgotCi0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9JTVBPUlRfV1NETF9UT19XT1JLQkVOQ0giKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTVBPUlRfVE9fV09SS0JFTkNIX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHRhYmxlPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTQwIHZhbGlnbj0iY2VudGVyIj4KLSAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzZWxlY3Rfd29ya2JlbmNoX3Byb2plY3RfbmFtZSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJXT1JLQkVOQ0hfUFJPSkVDVF9OQU1FIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD00MCB2YWxpZ249ImNlbnRlciIgbm93cmFwPgotICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgSVdvcmtzcGFjZVJvb3QgaVdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBpV29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ic2VsZWN0X3dvcmtiZW5jaF9wcm9qZWN0X25hbWUiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FJT4iIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvamVjdHNbaV0uaXNPcGVuKCkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1wcm9qZWN0TmFtZSU+Ij48JT1wcm9qZWN0TmFtZSU+Ci0gICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfaW1wb3J0ZWRfZmlsZV9uYW1lIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIklNUE9SVEVEX1dTRExfRklMRV9OQU1FIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iIHdpZHRoPSI2MCUiPgotPCUKLSAgIFN0cmluZyB3c2RsRmlsZU5hbWU9InRlbXAud3NkbCI7Ci0gICBTdHJpbmcgd3NkbFVSTCA9IChTdHJpbmcpZm9ybVByb3BlcnRpZXMuZ2V0KCJ3c2RsVVJMIik7Ci0gICBpZiAod3NkbFVSTCAhPSBudWxsICYmIHdzZGxVUkwuZW5kc1dpdGgoIi53c2RsIikpCi0gICB7Ci0gICAgIGludCBsYXN0U2VwYXJhdG9yUG9zID0gTWF0aC5tYXgod3NkbFVSTC5sYXN0SW5kZXhPZigiLyIpLHdzZGxVUkwubGFzdEluZGV4T2YoIlxcIikpOwotICAgICBpZiAobGFzdFNlcGFyYXRvclBvcyA+IDApCi0gICAgICAgd3NkbEZpbGVOYW1lID0gd3NkbFVSTC5zdWJzdHJpbmcobGFzdFNlcGFyYXRvclBvcysxLHdzZGxVUkwubGVuZ3RoKCkpOwotICAgfQotJT4gICAKLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfaW1wb3J0ZWRfZmlsZV9uYW1lIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FJT4iIHZhbHVlPSI8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHdzZGxGaWxlTmFtZSklPiIgc2l6ZT01MCBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgIAotICAgIDwvZm9ybT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9JbXBvcnRXU0RMQW5kV1NJTFRvV29ya2JlbmNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL0ltcG9ydFdTRExBbmRXU0lMVG9Xb3JrYmVuY2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4N2U0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL0ltcG9ydFdTRExBbmRXU0lMVG9Xb3JrYmVuY2hGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNyAgIDEyNzQ0MyBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtUHJvcGVydGllcyIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gdG9nZ2xlRGl2Q29udGFpbmVyKGRpdklkKQotICB7Ci0gICAgdmFyIGRpdkNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdklkKTsKLSAgICBpZiAoZGl2Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKQotICAgICAgZGl2Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICBlbHNlCi0gICAgICBkaXZDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgfQotPC9zY3JpcHQ+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfSU1QT1JUX1RPX1dPUktCRU5DSCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotCi0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KChTdHJpbmcpZm9ybVByb3BlcnRpZXMuZ2V0KCJmb3JtQWN0aW9uTGluayIpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0KLSAgPCUKLSAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9pbXBvcnRfdG9fd29ya2JlbmNoX2hpZ2hsaWdodGVkLmdpZiI7Ci0gIFN0cmluZyB0aXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0lNUE9SVF9XU0RMX1RPX1dPUktCRU5DSCIpOwotICAlPgotICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lNUE9SVF9UT19XT1JLQkVOQ0hfREVTQyIpJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9NDAgdmFsaWduPSJjZW50ZXIiPgotICAgICAgICA8bGFiZWwgZm9yPSJzZWxlY3Rfd29ya2JlbmNoX3Byb2plY3RfbmFtZSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJXT1JLQkVOQ0hfUFJPSkVDVF9OQU1FIiklPjwvbGFiZWw+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD00MCB2YWxpZ249ImNlbnRlciIgbm93cmFwPgotICAgICAgICA8JQotICAgICAgICBJV29ya3NwYWNlUm9vdCBpV29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBpV29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0cygpOwotICAgICAgICAlPgotICAgICAgICA8c2VsZWN0IGlkPSJzZWxlY3Rfd29ya2JlbmNoX3Byb2plY3RfbmFtZSIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLldPUktCRU5DSF9QUk9KRUNUX05BTUUlPiIgY2xhc3M9InNlbGVjdGxpc3QiPgotICAgICAgICA8JQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghcHJvamVjdHNbaV0uaXNPcGVuKCkpCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gcHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAlPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1wcm9qZWN0TmFtZSU+Ij48JT1wcm9qZWN0TmFtZSU+Ci0gICAgICAgIDwlCi0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgfQotICAgICAgICAlPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLQotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQgaWQ9ImlucHV0X2ltcG9ydF93c2RsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuSU1QT1JUX0ZJTEUlPiIgdmFsdWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRfRklMRSU+IiBvbkNsaWNrPSJ0b2dnbGVEaXZDb250YWluZXIoJ2Rpdl9pbXBvcnRfd3NkbCcpIj4KLSAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfaW1wb3J0X3dzZGwiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTEFCRUxfSU1QT1JUX1dTREwiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPGRpdiBpZD0iZGl2X2ltcG9ydF93c2RsIj4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfaW1wb3J0ZWRfd3NkbF9maWxlX25hbWUiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiSU1QT1JURURfV1NETF9GSUxFX05BTUUiKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iIHdpZHRoPSI2MCUiPgotPCUKLSBTdHJpbmcgd3NkbEZpbGVOYW1lPSJ0ZW1wLndzZGwiOwotIFN0cmluZyB3c2RsVVJMID0gKFN0cmluZylmb3JtUHJvcGVydGllcy5nZXQoIndzZGxVUkwiKTsKLSBpZiAod3NkbFVSTCAhPSBudWxsICYmIHdzZGxVUkwuZW5kc1dpdGgoIi53c2RsIikpCi0gewotICAgaW50IGxhc3RTZXBhcmF0b3JQb3MgPSBNYXRoLm1heCh3c2RsVVJMLmxhc3RJbmRleE9mKCIvIiksd3NkbFVSTC5sYXN0SW5kZXhPZigiXFwiKSk7Ci0gICBpZiAobGFzdFNlcGFyYXRvclBvcyA+IDApCi0gICAgIHdzZGxGaWxlTmFtZSA9IHdzZGxVUkwuc3Vic3RyaW5nKGxhc3RTZXBhcmF0b3JQb3MrMSx3c2RsVVJMLmxlbmd0aCgpKTsKLSB9Ci0lPiAgIAotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfaW1wb3J0ZWRfd3NkbF9maWxlX25hbWUiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRFRF9GSUxFX05BTUUlPiIgdmFsdWU9IjwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3Qod3NkbEZpbGVOYW1lKSU+IiBzaXplPTUwIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLQotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPiZuYnNwOzwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLQotICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuSU1QT1JURURfV1NETF9VUkwlPiIgdmFsdWU9IjwlPXdzZGxVUkwlPiI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImlucHV0X2ltcG9ydF93c2lsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuSU1QT1JUX1RPX1dTSUwlPiIgdmFsdWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRfVE9fV1NJTCU+IiBvbkNsaWNrPSJ0b2dnbGVEaXZDb250YWluZXIoJ2Rpdl9pbXBvcnRfd3NpbCcpIj4KLSAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfaW1wb3J0X3dzaWwiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTEFCRUxfSU1QT1JUX1RPX1dTSUwiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPGRpdiBpZD0iZGl2X2ltcG9ydF93c2lsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfaW1wb3J0ZWRfd3NpbF9maWxlX25hbWUiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiV1NJTF9GSUxFX05BTUUiKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iIHdpZHRoPSI2MCUiPgotPCUKLSBTdHJpbmcgd3NpbEZpbGVOYW1lID0gKFN0cmluZylmb3JtUHJvcGVydGllcy5nZXQoIndzaWxGaWxlTmFtZSIpOwotIGlmICh3c2lsRmlsZU5hbWUgPT0gbnVsbCB8fCB3c2lsRmlsZU5hbWUubGVuZ3RoKCkgPD0gMCkKLSAgIHdzaWxGaWxlTmFtZSA9IHdzZGxGaWxlTmFtZS5zdWJzdHJpbmcoMCwgd3NkbEZpbGVOYW1lLmxlbmd0aCgpLTQpICsgIndzaWwiOwotJT4gICAKLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X2ltcG9ydGVkX3dzaWxfZmlsZV9uYW1lIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuV1NJTF9GSUxFX05BTUUlPiIgdmFsdWU9IjwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3Qod3NpbEZpbGVOYW1lKSU+IiBzaXplPTUwIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgICAKLSAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQxMzE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkhUTUxVdGlscyIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb25MaW5rIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9MQVVOQ0hfV0VCU0VSVklDRV9XSVpBUkQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChmb3JtQWN0aW9uTGluay50b1N0cmluZygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2xhdW5jaF93c3dpemFyZF9oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTEFVTkNIX1dFQl9TRVJWSUNFX1dJWkFSRCIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NIT09TRV9XSVpBUkQiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fd3NfY2xpZW50X3dpemFyZCIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuV0VCX1NFUlZJQ0VfV0laQVJEJT4iIGNoZWNrZWQ9dHJ1ZSB2YWx1ZT0iPCU9U3RyaW5nLnZhbHVlT2YoQWN0aW9uSW5wdXRzLldFQl9TRVJWSUNFX0NMSUVOVF9XSVpBUkQpJT4iPjxsYWJlbCBmb3I9InJhZGlvX3dzX2NsaWVudF93aXphcmQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19XRUJfU0VSVklDRV9DTElFTlRfV0laQVJEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fd3Nfc2tlbGV0b25fd2l6YXJkIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5XRUJfU0VSVklDRV9XSVpBUkQlPiIgdmFsdWU9IjwlPVN0cmluZy52YWx1ZU9mKEFjdGlvbklucHV0cy5XRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQpJT4iPjxsYWJlbCBmb3I9InJhZGlvX3dzX3NrZWxldG9uX3dpemFyZCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX1dFQl9TRVJWSUNFX1NLRUxFVE9OX1dJWkFSRCIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgICAKLSAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL1Byb3h5TG9hZENvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9Qcm94eUxvYWRDb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4ZTU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL1Byb3h5TG9hZENvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0gICBTdHJpbmdCdWZmZXIgdGFyZ2V0Q29udGVudExpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5UQVJHRVRfUEFHRSkpOwotICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKQotICAgewotICAgICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgICAgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgICBpZiAodGFyZ2V0Q29udGVudExpbmsudG9TdHJpbmcoKS5pbmRleE9mKCI/IikgIT0gLTEpCi0gICAgICAgdGFyZ2V0Q29udGVudExpbmsuYXBwZW5kKCcmJyk7Ci0gICAgIGVsc2UKLSAgICAgICB0YXJnZXRDb250ZW50TGluay5hcHBlbmQoJz8nKTsKLSAgICAgdGFyZ2V0Q29udGVudExpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotICAgfQotICAgZWxzZQotICAgICBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIAotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9QQUdFX0xPQURFUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBsb2FkQ29udGVudCgpCi0gIHsKLSAgICB2YXIgZnJhbWVzZXQgPSBwYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb3h5UGFnZSIpOwotICAgIHZhciBjb250ZW50RnJhbWUgPSBmcmFtZXNldC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZnJhbWUiKS5pdGVtKDEpOwotICAgIGNvbnRlbnRGcmFtZS5zcmMgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRhcmdldENvbnRlbnRMaW5rLnRvU3RyaW5nKCkpKSU+IjsgIAotICB9Ci0gIAotICBmdW5jdGlvbiBoYW5kbGVDb21wbGV0aW9uKCkKLSAgewotICAgIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YWJsZSIpLml0ZW0oMCk7Ci0gICAgdmFyIHRCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgZG9uZVJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGRvbmVDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIGRvbmVDb2x1bW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlBhZ2UgbG9hZGVkLiIpKTsKLSAgICBkb25lUm93LmFwcGVuZENoaWxkKGRvbmVDb2x1bW4pOwotICAgIHRCb2R5LmFwcGVuZENoaWxkKGRvbmVSb3cpOyAgIAotICB9Ci08L3NjcmlwdD4gIAotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotICA8ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBsb2FkQ29udGVudCgpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL1Byb3h5TG9hZFBhZ2UuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9Qcm94eUxvYWRQYWdlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyNDYyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL1Byb3h5TG9hZFBhZ2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuKiIgJT4KLQotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlcjsKLSAgIFN0cmluZ0J1ZmZlciBsb2FkQ29udGVudExpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJmb3Jtcy9Qcm94eUxvYWRDb250ZW50LmpzcD8iKTsKLSAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkKLSAgIHsKLSAgICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICAgIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgICAgbG9hZENvbnRlbnRMaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKS5hcHBlbmQoJyYnKTsKLSAgIH0KLSAgIGVsc2UKLSAgICAgY29udHJvbGxlciA9IChDb250cm9sbGVyKXNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICBsb2FkQ29udGVudExpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UQVJHRVRfUEFHRSkuYXBwZW5kKCc9JykuYXBwZW5kKFVSTFV0aWxzLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVEFSR0VUX1BBR0UpKSk7Ci0lPgotPGZyYW1lc2V0IGlkPSJwcm94eVBhZ2UiIHJvd3M9IjEwMCUsKiIgYm9yZGVyPTA+Ci0gIDxmcmFtZSBzcmM9IjwlPWNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGxvYWRDb250ZW50TGluay50b1N0cmluZygpKSU+IiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1BBR0VfTE9BREVSIiklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG5vcmVzaXplPgotICA8ZnJhbWUgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9QQUdFX0NPTlRFTlQiKSU+IiBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbm9yZXNpemU+Ci08L2ZyYW1lc2V0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9jb3B5cmlnaHQuaW5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9jb3B5cmlnaHQuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2ZkY2VmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvY29weXJpZ2h0LmluYworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvZm9ybWhlYWRlci5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDFjOThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvZm9ybWhlYWRlci5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRpdGxlSW1hZ2VQYXRoKSklPiIgYWx0PSIiPgotICAgICAgPHN0cm9uZz48JT10aXRsZSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjA+IDxpbWcgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiIGFsaWduPSJ0b3AiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiI+IDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9vdGhlckFjdGlvbnMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDRlM2ZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSAoVG9vbE1hbmFnZXIpY3VycmVudFRvb2xNYW5hZ2VySGFzaC5nZXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSKTsKLSAgIGludCBudW1iZXJPZlRvb2xzID0gY3VycmVudFRvb2xNYW5hZ2VyLmdldE51bWJlck9mVG9vbHMoKTsKLSAgIGlmIChudW1iZXJPZlRvb2xzID4gMSkKLSAgIHsKLSU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDxzdHJvbmc+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfT1RIRVJfQUNUSU9OUyIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMD4gPGltZyBoZWlnaHQ9MiB3aWR0aD0iMTAwJSIgYWxpZ249InRvcCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+Ij4gPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGU+Ci08JQotICAgICBmb3IgKGludCBpPTE7aTxudW1iZXJPZlRvb2xzO2krKykKLSAgICAgewotICAgICAgIFRvb2wgdCA9IGN1cnJlbnRUb29sTWFuYWdlci5nZXRUb29sKGkpOwotJT4KLSAgPHRyPgotICAgIDx0ZD48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodC5nZXRTZWxlY3RUb29sQWN0aW9uSHJlZihmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPXQuZ2V0U2VsZWN0VG9vbEFjdGlvblRhcmdldCgpJT4iPjwlPXQuZ2V0QWx0VGV4dCgpJT48L2E+PC90ZD4KLSAgPC90cj4KLTwlCi0gICAgIH0KLSU+Ci08L3RhYmxlPgotPCUKLSAgIH0KLSU+ICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGZlOGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0dPIiklPiIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fUkVTRVQiKSU+IiBvbkNsaWNrPSJyZXNldEZvcm1JbnB1dHMoKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9hY3Rpb25zLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2FjdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWFlZDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2FjdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvYWRkX3RvX3dzZGxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9hZGRfdG9fd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjZTU2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9hZGRfdG9fd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2FkZF90b193c2RsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2FkZF90b193c2RsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhZDY2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9hZGRfdG9fd3NkbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9iYWNrX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvYmFja19lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0NjY3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9iYWNrX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvYmFja19oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9iYWNrX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNDE1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9iYWNrX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2NhbGVuZGFyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2NhbGVuZGFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyODE3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9jYWxlbmRhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzk4NDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmMxMGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kZXRhaWxzX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzMzMjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGEyYmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2Ly5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3BsYXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9wbGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxN2MxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3BsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9yZWNvcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9yZWNvcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzAwNGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfcmVjb3JkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfc2F2ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3NhdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTAwNDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfc2F2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3N0b3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlZTlhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2Ly5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3BsYXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9wbGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4ZmI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3BsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9yZWNvcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9yZWNvcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmNjZmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfcmVjb3JkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfc2F2ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3NhdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU3YjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfc2F2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3N0b3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMzY2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZXZpZXcxNi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZXZpZXcxNi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2V2aWV3MTYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9ldmlldzE2L2FjdGlvbmVuZ2luZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9ldmlldzE2L2FjdGlvbmVuZ2luZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjRiYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZXZpZXcxNi9hY3Rpb25lbmdpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2IwMjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2Zhdm9yaXRlc19lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2Zhdm9yaXRlc19oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mYXZvcml0ZXNfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTYyMjE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2Zhdm9yaXRlc19oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDA0YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2Zhdm9yaXRlc19wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NjViODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ZvbGRlcl9jbG9zZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9sZGVyX2Nsb3NlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZTAyN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9sZGVyX2Nsb3NlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb2xkZXJfb3Blbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb2xkZXJfb3Blbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzIyZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9sZGVyX29wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9yd2FyZF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ZvcndhcmRfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMzE0MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9yd2FyZF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ZvcndhcmRfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9yd2FyZF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZjhjM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9yd2FyZF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9pbXBvcnRfZnNfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9pbXBvcnRfZnNfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MGM3YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvaW1wb3J0X2ZzX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvaW1wb3J0X2ZzX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF9mc19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NmQzZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvaW1wb3J0X2ZzX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9pbXBvcnRfdG9fd29ya2JlbmNoX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRhMDdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9pbXBvcnRfdG9fd29ya2JlbmNoX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgwODVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9pbXBvcnRfdG9fd29ya2JlbmNoX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2tleWxpbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMva2V5bGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODA2OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMva2V5bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9sYXVuY2hfd3N3aXphcmRfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9sYXVuY2hfd3N3aXphcmRfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNThkYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGF1bmNoX3dzd2l6YXJkX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGF1bmNoX3dzd2l6YXJkX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2xhdW5jaF93c3dpemFyZF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMDk3ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGF1bmNoX3dzd2l6YXJkX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2xpbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWU1YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9saW5lX2xhc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGluZV9sYXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwZWY4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9saW5lX2xhc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGluZV9ub3RsYXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2xpbmVfbm90bGFzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTJjZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGluZV9ub3RsYXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL21pbnVzX2xhc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbWludXNfbGFzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZWJiNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbWludXNfbGFzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9taW51c19ub3RsYXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL21pbnVzX25vdGxhc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY0MzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL21pbnVzX25vdGxhc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbmF2aWdhdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL25hdmlnYXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzA1NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbmF2aWdhdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3BsdXNfbGFzdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9wbHVzX2xhc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBjODlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3BsdXNfbGFzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9wbHVzX25vdGxhc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcGx1c19ub3RsYXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3YmQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9wbHVzX25vdGxhc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDVkMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTA0MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9yb290X21haW4uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcm9vdF9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhZGUwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9yb290X21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvc3BhY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvc3BhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODExOTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3NwYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3N0YXR1cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9zdGF0dXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGEwMDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3N0YXR1cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90b3BfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90b3BfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNWJjOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdG9wX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdG9wX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3RvcF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTY0NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdG9wX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0MzMxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90d2lzdGNsb3NlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90d2lzdG9wZW5lZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90d2lzdG9wZW5lZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMmM1ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdHdpc3RvcGVuZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdWRkaV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3VkZGlfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhY2FiM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdWRkaV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3VkZGlfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdWRkaV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmMwYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdWRkaV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2RsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzZGxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMmFjZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzZGxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOGVmYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NpbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmODhmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NpbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiMzVhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvbGF1bmNoX29wdGlvbnNfcmVnaXN0cnkuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9sYXVuY2hfb3B0aW9uc19yZWdpc3RyeS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDU2YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9sYXVuY2hfb3B0aW9uc19yZWdpc3RyeS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUxNSAgIDEyODYwMiBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckNvbnRleHQsCi0gIGphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgamF2YS51dGlsLkhhc2h0YWJsZSwKLSAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVVJMVXRpbHMiICU+Ci0KLTwlCi0gIHJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7IAotICBTdHJpbmcga2V5ID0gbnVsbDsKLSAgSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIEVudW1lcmF0aW9uIHBhcmFtTmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Ci0gIHdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKQotICB7Ci0gICAgU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpOwotICAgIFN0cmluZ1tdIHBhcmFtVmFsdWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1OYW1lKTsKLSAgICBpZiAocGFyYW1WYWx1ZXMgIT0gbnVsbCAmJiBwYXJhbVZhbHVlcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGlmIChrZXkgPT0gbnVsbCAmJiBVUkxVdGlscy5kZWNvZGUocGFyYW1OYW1lKS5lcXVhbHMoV1NFeHBsb3JlckNvbnRleHQuSUQpKQotICAgICAgICBrZXkgPSBwYXJhbVZhbHVlc1swXTsKLSAgICAgIGVsc2UKLSAgICAgICAgb3B0aW9ucy5wdXQocGFyYW1OYW1lLCBwYXJhbVZhbHVlcyk7Ci0gICAgfQotICB9Ci0gIGlmIChrZXkgIT0gbnVsbCkKLSAgewotICAgIExhdW5jaE9wdGlvbnNNYW5hZ2VyIG1hbmFnZXIgPSBMYXVuY2hPcHRpb25zTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotICAgIG1hbmFnZXIubWFuYWdlKGtleSwgb3B0aW9ucywgYXBwbGljYXRpb24pOwotICB9Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvcGVyc3BlY3RpdmVfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjA3ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QRVJTUEVDVElWRV9DT05URU5UIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRQZXJzcGVjdGl2ZUlkKCksZmFsc2UpKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvcGVyc3BlY3RpdmVfdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3BlcnNwZWN0aXZlX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWRjMGQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvcGVyc3BlY3RpdmVfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25FbmdpbmUiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLVN0cmluZ0J1ZmZlciBocmVmQWN0aW9uRW5naW5lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotaHJlZkFjdGlvbkVuZ2luZS5hcHBlbmQocmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJhY3Rpb25lbmdpbmVfY29udGFpbmVyLmpzcCIpKSk7Ci1ocmVmQWN0aW9uRW5naW5lLmFwcGVuZCgiPyIpOwotaHJlZkFjdGlvbkVuZ2luZS5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci1ocmVmQWN0aW9uRW5naW5lLmFwcGVuZCgiPSIpOwotaHJlZkFjdGlvbkVuZ2luZS5hcHBlbmQoc2Vzc2lvbi5nZXRJZCgpKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci0gIDwvc2NyaXB0PgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBmdW5jdGlvbiBvcGVuQWN0aW9uRW5naW5lQ29udGFpbmVyKCkKLSAgICB7Ci0gICAgICB2YXIgbGluayA9ICI8JT1ocmVmQWN0aW9uRW5naW5lLnRvU3RyaW5nKCklPiI7Ci0gICAgICB2YXIgYWN0aW9uRW5naW5lQ29udGFpbmVyID0gd2luZG93Lm9wZW4obGluaywiYWN0aW9uRW5naW5lQ29udGFpbmVyIiwiaGVpZ2h0PTEwMCx3aWR0aD0zNTAsc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzIik7Ci0gICAgICBpZiAoYWN0aW9uRW5naW5lQ29udGFpbmVyLmZvY3VzKQotICAgICAgICBhY3Rpb25FbmdpbmVDb250YWluZXIuZm9jdXMoKTsKLSAgICB9Ci0gIDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iZ3Rvb2xiYXJib2R5bWFyZ2luIj4KLTxkaXYgaWQ9Imdsb2JhbHRvb2xiYXIiPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9InRleHQiIG5vd3JhcCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjU+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJUSVRMRV9XU0VYUExPUkVSIiklPjwvdGQ+Ci0gICAgPCUKLSAgICBTdHJpbmcgYWx0SGlzdG9yeUJhY2sgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9CQUNLIik7Ci0gICAgU3RyaW5nIGFsdEhpc3RvcnlGb3J3YXJkID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRk9SV0FSRCIpOwotICAgIFN0cmluZyBhbHRBY3Rpb25FbmdpbmUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9BQ1RJT05fRU5HSU5FIik7Ci0gICAgU3RyaW5nIGFsdFVEREkgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9VRERJX1BFUlNQRUNUSVZFIik7Ci0gICAgU3RyaW5nIGFsdFdTSUwgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9XU0lMX1BFUlNQRUNUSVZFIik7Ci0gICAgU3RyaW5nIGFsdFdTREwgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9XU0RMX1BFUlNQRUNUSVZFIik7Ci0gICAgU3RyaW5nIGFsdEZhdm9yaXRlcyA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19QRVJTUEVDVElWRSIpOwotICAgICU+ICAgCi0gICAgPHRkIGNsYXNzPSJ0ZXh0IiBub3dyYXAgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTE2IGhlaWdodD0yNj48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmV0cmlldmVIaXN0b3J5QWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLkpVTVBfQkFDSykpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBhbHQ9IjwlPWFsdEhpc3RvcnlCYWNrJT4iIHRpdGxlPSI8JT1hbHRIaXN0b3J5QmFjayU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2JhY2tfZW5hYmxlZC5naWYiKSklPiIgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvYmFja19oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpOyIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9iYWNrX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9iYWNrX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9iYWNrX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiPjwvYT48L3RkPgotICAgIDx0ZCBjbGFzcz0idGV4dCIgbm93cmFwIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZXRyaWV2ZUhpc3RvcnlBY3Rpb24uZ2V0QWN0aW9uTGluayhBY3Rpb25JbnB1dHMuSlVNUF9GT1JXQVJEKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIGFsdD0iPCU9YWx0SGlzdG9yeUZvcndhcmQlPiIgdGl0bGU9IjwlPWFsdEhpc3RvcnlGb3J3YXJkJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZm9yd2FyZF9lbmFibGVkLmdpZiIpKSU+IiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9mb3J3YXJkX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcyk7IiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2ZvcndhcmRfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2ZvcndhcmRfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2ZvcndhcmRfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSI+PC9hPjwvdGQ+Ci0gICAgPCUKLSAgICBBY3Rpb25FbmdpbmUgYWN0aW9uRW5naW5lID0gY29udHJvbGxlci5nZXRBY3Rpb25FbmdpbmUoKTsKLSAgICBpZiAoYWN0aW9uRW5naW5lICE9IG51bGwgJiYgYWN0aW9uRW5naW5lLmdldE1vZGUoKSAhPSBBY3Rpb25FbmdpbmUuTU9ERV9ESVNBQkxFRCkKLSAgICB7Ci0gICAgJT4KLSAgICAgIDx0ZCBjbGFzcz0idGV4dCIgbm93cmFwIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgaGVpZ2h0PTI1PjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbkFjdGlvbkVuZ2luZUNvbnRhaW5lcigpIj48aW1nIGNsYXNzPSJub3JtYWwiIGFsdD0iPCU9YWx0QWN0aW9uRW5naW5lJT4iIHRpdGxlPSI8JT1hbHRBY3Rpb25FbmdpbmUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9ldmlldzE2L2FjdGlvbmVuZ2luZS5naWYiKSklPiIgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZXZpZXcxNi9hY3Rpb25lbmdpbmUuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKTsiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZXZpZXcxNi9hY3Rpb25lbmdpbmUuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9ldmlldzE2L2FjdGlvbmVuZ2luZS5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZXZpZXcxNi9hY3Rpb25lbmdpbmUuZ2lmIikpJT4nO21vdXNldXAodGhpcykiPjwvYT48L3RkPgotICAgIDwlCi0gICAgfQotICAgICU+Ci0gICAgPHRkIGNsYXNzPSJ0ZXh0IiBub3dyYXAgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNob3dQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIGFsdD0iPCU9YWx0VURESSU+IiB0aXRsZT0iPCU9YWx0VURESSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3VkZGlfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiKSklPiIgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdWRkaV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpOyIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy91ZGRpX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy91ZGRpX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy91ZGRpX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiPjwvYT48L3RkPgotICAgIDx0ZCBjbGFzcz0idGV4dCIgbm93cmFwIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NJTCxmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBhbHQ9IjwlPWFsdFdTSUwlPiIgdGl0bGU9IjwlPWFsdFdTSUwlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIikpJT4iIG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3dzaWxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKTsiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NpbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NpbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NpbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIj48L2E+PC90ZD4KLSAgICA8dGQgY2xhc3M9InRleHQiIG5vd3JhcCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwsZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgYWx0PSI8JT1hbHRXU0RMJT4iIHRpdGxlPSI8JT1hbHRXU0RMJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+IiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy93c2RsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcyk7IiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3dzZGxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3dzZGxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3dzZGxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSI+PC9hPjwvdGQ+ICAgIAotICAgIDx0ZCBjbGFzcz0idGV4dCIgbm93cmFwIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfRkFWT1JJVEVTLGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIGFsdD0iPCU9YWx0RmF2b3JpdGVzJT4iIHRpdGxlPSI8JT1hbHRGYXZvcml0ZXMlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiKSklPiIgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZmF2b3JpdGVzX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcyk7IiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2Zhdm9yaXRlc19wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZmF2b3JpdGVzX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSI+PC9hPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODEzNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotLy8KLQotZnVuY3Rpb24gaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkKLXsKLSAgcmV0dXJuIG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2NhbGVuZGFyYnJvd3Nlci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvY2FsZW5kYXJicm93c2VyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliOWNhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvY2FsZW5kYXJicm93c2VyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSBzZXNzaW9uLmdldElkKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciBjYWxlbmRhckJyb3dzZXI7Ci0gIHZhciBjYWxlbmRhckJyb3dzZXJDbG9zZWQgPSB0cnVlOwotICB2YXIgY2FsZW5kYXJUYXJnZXRSb3cgPSAtMTsKLSAgdmFyIGNhbGVuZGFyVGFyZ2V0OwotCi0gIGZ1bmN0aW9uIG9wZW5DYWxlbmRhckJyb3dzZXIodHlwZSxmb3JtQ29udGFpbmVySWQsZWxlbWVudE5hbWUsaW5kZXgpCi0gIHsKLSAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1Db250YWluZXJJZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHZhciBlbGVtZW50cyA9IGZvcm0uZWxlbWVudHNbZWxlbWVudE5hbWVdOwotICAgIGlmIChpbmRleCA9PSAwICYmIGVsZW1lbnRzLmxlbmd0aCA9PSB1bmRlZmluZWQpCi08JQotICAgLy8gT25seSBvbmUgZWxlbWVudC4KLSU+Ci0gICAgICBjYWxlbmRhclRhcmdldCA9IGVsZW1lbnRzOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjYWxlbmRhclRhcmdldFJvdyA9IGluZGV4OwotICAgICAgY2FsZW5kYXJUYXJnZXQgPSBlbGVtZW50cy5pdGVtKGluZGV4KTsKLSAgICB9Ci0gICAgdmFyIGxpbms7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURSU+OgotICAgICAgICBsaW5rID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuQ2FsZW5kYXJCcm93c2VyQWN0aW9uLmdldEFjdGlvbkxpbmtGb3JEYXRlKHNlc3Npb25JZCkpKSU+IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0RBVEVUSU1FJT46Ci0gICAgICAgIGxpbmsgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uZ2V0QWN0aW9uTGlua0ZvckRhdGVUaW1lKHNlc3Npb25JZCkpKSU+IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dZRUFSTU9OVEglPjoKLSAgICAgICAgbGluayA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlbkNhbGVuZGFyQnJvd3NlckFjdGlvbi5nZXRBY3Rpb25MaW5rRm9yR1llYXJNb250aChzZXNzaW9uSWQpKSklPiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA8JT1BY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9HREFZJT46Ci0gICAgICAgIGxpbmsgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uZ2V0QWN0aW9uTGlua0ZvckdEYXkoc2Vzc2lvbklkKSkpJT4iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR01PTlRIREFZJT46Ci0gICAgICAgIGxpbmsgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uZ2V0QWN0aW9uTGlua0ZvckdNb250aERheShzZXNzaW9uSWQpKSklPiI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYWxlbmRhckJyb3dzZXIgPSB3aW5kb3cub3BlbihsaW5rLCJjYWxlbmRhckJyb3dzZXIiLCJoZWlnaHQ9MzUwLHdpZHRoPTI2NCxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMiKTsKLSAgICBpZiAoY2FsZW5kYXJCcm93c2VyLmZvY3VzKQotICAgICAgY2FsZW5kYXJCcm93c2VyLmZvY3VzKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBjbG9zZUNhbGVuZGFyQnJvd3NlcigpCi0gIHsKLSAgICBpZiAoIWNhbGVuZGFyQnJvd3NlckNsb3NlZCkKLSAgICAgIGNhbGVuZGFyQnJvd3Nlci5jbG9zZSgpOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzYjRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIHJlcXVlc3RTdWJtaXR0ZWQgPSBmYWxzZTsKLQotICBmdW5jdGlvbiBoYW5kbGVTdWJtaXQoZm9ybSkKLSAgewotICAgIGlmIChyZXF1ZXN0U3VibWl0dGVkKQotICAgIHsKLSAgICAgIGFsZXJ0KCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfU1VCTUlUX0lOX1BST0dSRVNTIikpJT4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmVxdWVzdFN1Ym1pdHRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBmdW5jdGlvbiByZXNldFN1Ym1pc3Npb24oKQotICB7Ci0gICAgcmVxdWVzdFN1Ym1pdHRlZCA9IGZhbHNlOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2Zvcm11dGlscy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWM4MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2Zvcm11dGlscy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICA8JS8vIFJlcXVpcmVzIGJyb3dzZXJkZXRlY3QuanMlPgotICBmdW5jdGlvbiBjcmVhdGVIaWRkZW5FbGVtZW50KGVsZW1lbnROYW1lLHZhbHVlKQotICB7Ci0gICAgdmFyIGhpZGRlbklucHV0OwotICAgIGlmIChlbGVtZW50TmFtZS5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgICAgICAgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCI8aW5wdXQgbmFtZT0nIitlbGVtZW50TmFtZSsiJz4iKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgICBoaWRkZW5JbnB1dC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGVsZW1lbnROYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGhpZGRlbklucHV0LnR5cGUgPSAiaGlkZGVuIjsKLSAgICBoaWRkZW5JbnB1dC52YWx1ZSA9IHZhbHVlOwotICAgIHJldHVybiBoaWRkZW5JbnB1dDsKLSAgfQotCi0gIGZ1bmN0aW9uIHJlc2V0Rm9ybUlucHV0cygpCi0gIHsKLSAgICBkb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQoKTsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvcGFuZXMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3BhbmVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2OWMyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvcGFuZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciBwZXJzcGVjdGl2ZVdvcmtBcmVhID0gdG9wLmZyYW1lc1siPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Il07Ci0gIHZhciBwZXJzcGVjdGl2ZVRvb2xiYXIgPSB0b3AuZnJhbWVzWyI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1RPT0xCQVIlPiJdOwotICB2YXIgcGVyc3BlY3RpdmVDb250ZW50ID0gdG9wLmZyYW1lc1siPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9DT05URU5UJT4iXTsKLQotICBmdW5jdGlvbiBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFtZXNldCIpLml0ZW0oMCk7Ci0gIH0KLQotICBmdW5jdGlvbiB0b2dnbGVEb3VibGVDbGlja0NvbHVtblRpdGxlKCkKLSAgewotICAgIHZhciBkb3VibGVDbGlja0NvbHVtbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkb3VibGVjbGlja2NvbHVtbiIpOwotICAgIGlmIChkb3VibGVDbGlja0NvbHVtbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotPCUKLSAgIFN0cmluZyBqc0FsdFJlc3RvcmUgPSBIVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKSk7Ci0lPgotICAgIGlmIChkb3VibGVDbGlja0NvbHVtbi50aXRsZSA9PSAiPCU9anNBbHRSZXN0b3JlJT4iKQotICAgICAgZG91YmxlQ2xpY2tDb2x1bW4udGl0bGUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpKSU+IjsKLSAgICBlbHNlCi0gICAgICBkb3VibGVDbGlja0NvbHVtbi50aXRsZSA9ICI8JT1qc0FsdFJlc3RvcmUlPiI7Ci0gIH0KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3Jlc3VtZXByb3h5bG9hZHBhZ2UuanMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMTU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0vLwotCi1mdW5jdGlvbiByZXN1bWVQcm94eUxvYWRQYWdlKCkKLXsKLSAgdmFyIHByb3h5UGFnZSA9IHBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJveHlQYWdlIik7Ci0gIHByb3h5UGFnZS5zZXRBdHRyaWJ1dGUoInJvd3MiLCAiMCwxMDAlIik7Ci0gIHBhcmVudC5mcmFtZXNbMF0uaGFuZGxlQ29tcGxldGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3N3aXRjaHBlcnNwZWN0aXZlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9zd2l0Y2hwZXJzcGVjdGl2ZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMGZjMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3N3aXRjaHBlcnNwZWN0aXZlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldFBlcnNwZWN0aXZlQ29udGVudFBhZ2UoKSkpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvdGFibGVzLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy90YWJsZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWEyNGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy90YWJsZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgbnVtYmVyT2ZIZWFkZXJSb3dzID0gMTsKLSAgZnVuY3Rpb24gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICByZXR1cm4gY29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YWJsZSIpLml0ZW0oMCk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRTZWxlY3Qoc2VsZWN0LHZhbHVlKQotICB7Ci0gICAgZm9yICh2YXIgaT0wO2k8c2VsZWN0Lm9wdGlvbnMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAoc2VsZWN0Lm9wdGlvbnNbaV0udmFsdWUgPT0gdmFsdWUpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gaTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdC5vcHRpb25zW2ldLnRleHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcmVtb3ZlU2VsZWN0ZWRSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgIHsKLSAgICAgICAgdGFibGUuZGVsZXRlUm93KGkpOwotICAgICAgICBpLS07Ci0gICAgICB9Ci0gICAgfQotICAgIHZhciBjaGVja0FsbENoZWNrYm94Um93ID0gdGFibGUucm93c1swXTsKLSAgICB2YXIgY2hlY2tBbGxDaGVja2JveCA9IGNoZWNrQWxsQ2hlY2tib3hSb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICBpZiAoY2hlY2tBbGxDaGVja2JveC5jaGVja2VkKQotICAgICAgY2hlY2tBbGxDaGVja2JveC5jaGVja2VkID0gZmFsc2U7Ci0gIH0KLQotICBmdW5jdGlvbiBoYW5kbGVSb3dDaGVja2JveENsaWNrKGUpCi0gIHsKLSAgICB2YXIgY2hlY2tib3g7Ci0gICAgaWYgKGlzTWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcigpKQotICAgICAgY2hlY2tib3ggPSBldmVudC5zcmNFbGVtZW50OwotICAgIGVsc2UKLSAgICAgIGNoZWNrYm94ID0gZS50YXJnZXQ7Ci0gICAgdmFyIGNlbGwgPSBjaGVja2JveC5wYXJlbnROb2RlOwotICAgIHZhciByb3cgPSBjZWxsLnBhcmVudE5vZGU7Ci0gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpCi0gICAgICBoaWdobGlnaHRSb3cocm93LCJyb3djb2xvciIpOwotICAgIGVsc2UKLSAgICAgIGhpZ2hsaWdodFJvdyhyb3csInRhYmxlY2VsbHMiKTsKLQotICAgIHZhciB0Ym9keSA9IHJvdy5wYXJlbnROb2RlOwotICAgIHZhciB0YWJsZSA9IHRib2R5LnBhcmVudE5vZGU7Ci0gICAgdmFyIGNoZWNrQWxsQ2hlY2tib3ggPSB0YWJsZS5yb3dzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgaWYgKGNoZWNrQWxsQ2hlY2tib3guY2hlY2tlZCkKLSAgICAgIGNoZWNrQWxsQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlOwotICB9Ci0KLSAgZnVuY3Rpb24gY3JlYXRlUm93Q2hlY2tib3goKQotICB7Ci0gICAgdmFyIHJvd0NoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICByb3dDaGVja2JveC5zZXRBdHRyaWJ1dGUoIm5hbWUiLHJvd0NoZWNrYm94TmFtZSk7Ci0gICAgcm93Q2hlY2tib3gudHlwZSA9ICJjaGVja2JveCI7Ci0gICAgcm93Q2hlY2tib3gudGl0bGUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIikpJT4iOwotICAgIHJvd0NoZWNrYm94Lm9uY2xpY2sgPSBoYW5kbGVSb3dDaGVja2JveENsaWNrOwotICAgIHJldHVybiByb3dDaGVja2JveDsKLSAgfQotCi0gIGZ1bmN0aW9uIGhhbmRsZUNoZWNrQWxsQ2xpY2sodGFibGVDb250YWluZXJJZCxjaGVja0FsbENoZWNrYm94KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94Q2VsbCA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIikuaXRlbSgwKTsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHJvd0NoZWNrYm94Q2VsbC5jaGlsZE5vZGVzWzBdOwotICAgICAgcm93Q2hlY2tib3guY2hlY2tlZCA9IGNoZWNrQWxsQ2hlY2tib3guY2hlY2tlZDsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBoaWdobGlnaHRSb3codGFibGUucm93c1tpXSwicm93Y29sb3IiKTsKLSAgICAgIGVsc2UKLSAgICAgICAgaGlnaGxpZ2h0Um93KHRhYmxlLnJvd3NbaV0sInRhYmxlY2VsbHMiKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBoaWdobGlnaHRSb3cocm93LGNsYXNzTmFtZSkKLSAgewotICAgIHZhciByb3dDb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIGZvciAodmFyIGk9MTtpPHJvd0NvbHVtbnMubGVuZ3RoO2krKykKLSAgICAgIHJvd0NvbHVtbnMuaXRlbShpKS5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gIH0KLQotICBmdW5jdGlvbiBoaWdobGlnaHRFcnJhbnRSb3cocm93LGNsYXNzTmFtZSkKLSAgewotICAgIHZhciByb3dDb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4wID0gcm93Q29sdW1ucy5pdGVtKDApOwotICAgIHZhciBjb2x1bW4wQ29udHJvbCA9IGNvbHVtbjAuY2hpbGROb2Rlc1swXTsKLSAgICB2YXIgc3RhcnQ7Ci0gICAgaWYgKGNvbHVtbjBDb250cm9sLnR5cGUgPT0gImNoZWNrYm94IikKLSAgICB7Ci0gICAgICBjb2x1bW4wQ29udHJvbC5jaGVja2VkID0gdHJ1ZTsKLSAgICAgIHJvd0NvbHVtbnMuaXRlbSgxKS5jbGFzc05hbWUgPSAiZmlyc3Rjb2x1bW5lcnJhbnRyb3djb2xvciI7Ci0gICAgICBzdGFydCA9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb2x1bW4wLmNsYXNzTmFtZSA9ICJmaXJzdGNvbHVtbmVycmFudHJvd2NvbG9yIjsKLSAgICAgIHN0YXJ0ID0gMTsKLSAgICB9Ci0gICAgcm93Q29sdW1ucy5pdGVtKHJvd0NvbHVtbnMubGVuZ3RoLTEpLmNsYXNzTmFtZSA9ICJsYXN0Y29sdW1uZXJyYW50cm93Y29sb3IiOwotICAgIGZvciAodmFyIGk9c3RhcnQ7aTxyb3dDb2x1bW5zLmxlbmd0aC0xO2krKykKLSAgICAgIHJvd0NvbHVtbnMuaXRlbShpKS5jbGFzc05hbWUgPSAibWlkZGxlZXJyYW50cm93Y29sb3IiOwotICB9Ci0KLSAgZnVuY3Rpb24gdHdpc3QodGFibGVDb250YWluZXJJZCx0d2lzdEltYWdlTmFtZSkKLSAgewotICAgIHZhciB0YWJsZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0d2lzdEltYWdlID0gZG9jdW1lbnQuaW1hZ2VzW3R3aXN0SW1hZ2VOYW1lXTsKLSAgICBpZiAodGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9PSAibm9uZSIpCi0gICAgewotICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgdHdpc3RJbWFnZS5zcmMgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iOwotICAgICAgdHdpc3RJbWFnZS5hbHQgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpKSU+IjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICB0d2lzdEltYWdlLnNyYyA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiI7Ci0gICAgICB0d2lzdEltYWdlLmFsdCA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIikpJT4iOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlQ29udGFpbmVySWQpLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKQotICAgICAgdHdpc3QodGFibGVDb250YWluZXJJZCwieCIrdGFibGVDb250YWluZXJJZCk7Ci0gIH0KLQotICBmdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheVN0cmluZyhpbnB1dFZhbHVlKQotICB7Ci0gICAgaWYgKGlucHV0VmFsdWUgPT0gbnVsbCB8fCBpbnB1dFZhbHVlLmxlbmd0aCA8IDEpCi0gICAgICByZXR1cm4gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIlRBQkxFX0JMQU5LX1BMQUNFSE9MREVSIikpJT4iOwotICAgIHJldHVybiBpbnB1dFZhbHVlOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy90b29sYmFyLmpzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3Rvb2xiYXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjFiMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3Rvb2xiYXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotLy8KLQotZnVuY3Rpb24gbW91c2VvdmVyKGltZykKLXsKLSAgaW1nLmNsYXNzTmFtZSA9ICJob3ZlciI7Ci19Ci0KLWZ1bmN0aW9uIG1vdXNlb3V0KGltZykKLXsKLSAgaW1nLmNsYXNzTmFtZSA9ICJub3JtYWwiOwotfQotCi1mdW5jdGlvbiBtb3VzZWRvd24oaW1nKQotewotICBpbWcuY2xhc3NOYW1lID0gImRvd24iOwotfQotCi1mdW5jdGlvbiBtb3VzZXVwKGltZykKLXsKLSAgcmV0dXJuIG1vdXNlb3V0KGltZyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3RyZWV2aWV3LmpzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3RyZWV2aWV3LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTg0M2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy90cmVldmlldy5qcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0vLwotCi0vLyBSZXF1aXJlcyBicm93c2VyZGV0ZWN0LmpzCi0KLXZhciBzZWxlY3RlZEFuY2hvck5hbWUgPSAiIjsKLQotZnVuY3Rpb24gc2V0U2VsZWN0ZWRBbmNob3JOYW1lKGFuY2hvck5hbWUpCi17Ci0gIHNlbGVjdGVkQW5jaG9yTmFtZSA9IGFuY2hvck5hbWU7Ci19Ci0KLWZ1bmN0aW9uIHNlbGVjdE5vZGUoYW5jaG9yTmFtZSxvcGVuSW1hZ2VQYXRoKQotewotICB2YXIgaXNJRSA9IGlzTWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcigpOwotICBpZiAoc2VsZWN0ZWRBbmNob3JOYW1lLmxlbmd0aCA+IDApCi0gIHsKLSAgICB2YXIgc2VsZWN0ZWRBbmNob3I7Ci0gICAgaWYgKGlzSUUpCi0gICAgICBzZWxlY3RlZEFuY2hvciA9IGRvY3VtZW50LmFuY2hvcnMoc2VsZWN0ZWRBbmNob3JOYW1lKTsKLSAgICBlbHNlCi0gICAgICBzZWxlY3RlZEFuY2hvciA9IGRvY3VtZW50LmFuY2hvcnNbc2VsZWN0ZWRBbmNob3JOYW1lXTsKLSAgICBpZiAoc2VsZWN0ZWRBbmNob3IpCi0gICAgICBzZWxlY3RlZEFuY2hvci5jbGFzc05hbWUgPSAidW5zZWxlY3RlZFRleHRBbmNob3IiOwotICB9Ci0gIGlmIChhbmNob3JOYW1lLmluZGV4T2YoIi0xIikgPT0gLTEpCi0gIHsKLSAgICBpZiAoaXNJRSkKLSAgICAgIGRvY3VtZW50LmFuY2hvcnMoYW5jaG9yTmFtZSkuY2xhc3NOYW1lID0gInNlbGVjdGVkVGV4dEFuY2hvciI7Ci0gICAgZWxzZQotICAgICAgZG9jdW1lbnQuYW5jaG9yc1thbmNob3JOYW1lXS5jbGFzc05hbWUgPSAic2VsZWN0ZWRUZXh0QW5jaG9yIjsKLSAgICBzZXRTZWxlY3RlZEFuY2hvck5hbWUoYW5jaG9yTmFtZSk7Ci0gICAgYWx0ZXJJbWFnZShhbmNob3JOYW1lLG9wZW5JbWFnZVBhdGgpOwotICB9Ci0gIGVsc2UKLSAgICBzZXRTZWxlY3RlZEFuY2hvck5hbWUoIiIpOwotfQotCi1mdW5jdGlvbiBhbHRlckltYWdlKGltYWdlTmFtZSxpbWFnZVBhdGgpCi17Ci0gIGRvY3VtZW50LmltYWdlc1tpbWFnZU5hbWVdLnNyYyA9IGltYWdlUGF0aDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy93c2RsYnJvd3Nlci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvd3NkbGJyb3dzZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQ1YTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy93c2RsYnJvd3Nlci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gc2Vzc2lvbi5nZXRJZCgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgd3NkbFdpbmRvdzsKLSAgdmFyIHdzZGxXaW5kb3dDbG9zZWQgPSB0cnVlOwotICB2YXIgdGFyZ2V0V1NETFVSTEVsZW1lbnQ7Ci0gIGZ1bmN0aW9uIG9wZW5XU0RMQnJvd3Nlcihmb3JtQ29udGFpbmVySWQsdHlwZSkKLSAgewotICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybUNvbnRhaW5lcklkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgdGFyZ2V0V1NETFVSTEVsZW1lbnQgPSBmb3JtLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+OwotICAgIHZhciBsaW5rOwotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRSU+OgotICAgICAgICBsaW5rID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuV1NETEJyb3dzZXJBY3Rpb24uZ2V0QWN0aW9uTGlua0ZvclNlcnZpY2Uoc2Vzc2lvbklkKSkpJT4iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSU+OgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgbGluayA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlbldTRExCcm93c2VyQWN0aW9uLmdldEFjdGlvbkxpbmtGb3JTZXJ2aWNlSW50ZXJmYWNlKHNlc3Npb25JZCkpKSU+IjsKLSAgICB9Ci0gICAgd3NkbFdpbmRvdyA9IHdpbmRvdy5vcGVuKGxpbmssIndzZGxXaW5kb3ciLCJoZWlnaHQ9MzAwLHdpZHRoPTQ1MCxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMiKTsKLSAgICBpZiAod3NkbFdpbmRvdy5mb2N1cykKLSAgICAgIHdzZGxXaW5kb3cuZm9jdXMoKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGNsb3NlV1NETEJyb3dzZXIoKQotICB7Ci0gICAgaWYgKCF3c2RsV2luZG93Q2xvc2VkKQotICAgICAgd3NkbFdpbmRvdy5jbG9zZSgpOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9BZGRJdGVtc1RvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0FkZEl0ZW1zVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjc5NzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0FkZEl0ZW1zVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBuZXcgQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0FkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWMzMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbiBhY3Rpb24gPSBuZXcgQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgaWYgKGlucHV0c1ZhbGlkKQotICAgewotICAgICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotICAgfQotJT4KLQotICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICA8L3NjcmlwdD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTBkMWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0FkZFRvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uIiU+Ci0KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIEFkZFRvRmF2b3JpdGVzQWN0aW9uIGFjdGlvbiA9IG5ldyBBZGRUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0J1c1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NzUyMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24KLSAgIEJ1c1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IEJ1c1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGlmICghYWN0aW9uLmlzU3ViUXVlcnlJbml0aWF0ZWQoKSkKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL0xhdW5jaFN1YlF1ZXJ5QWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDcwMDI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0J1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIEJ1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uIGFjdGlvbiA9IG5ldyBCdXNQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQnVzaW5lc3NHZXRTZXJ2aWNlc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9CdXNpbmVzc0dldFNlcnZpY2VzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNWQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9CdXNpbmVzc0dldFNlcnZpY2VzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBCdXNpbmVzc0dldFNlcnZpY2VzQWN0aW9uIGFjdGlvbiA9IG5ldyBCdXNpbmVzc0dldFNlcnZpY2VzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBib29sZWFuIGJ1c2luZXNzRXhpc3RzID0gYWN0aW9uLnZhbGlkYXRlQnVzaW5lc3MoKTsKLQotICAgaWYgKCFidXNpbmVzc0V4aXN0cykKLSAgIHsKLSAgICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykoYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKS5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpKTsKLSAgICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9SRU1PVkVfQlVTSU5FU1NfTk9ERSIpKSU+IikpCi0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0NoZWNrRmF2b3JpdGVFeGlzdHNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMDMzZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiU+Ci0KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9BZGRUb0Zhdm9yaXRlc0FjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+Ci08JQotRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLXdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gIFN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKXBhcmFtTmFtZXMubmV4dEVsZW1lbnQoKTsKLSAgU3RyaW5nW10gcGFyYW1WYWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbU5hbWUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0lPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPXBhcmFtTmFtZSU+IiB2YWx1ZT0iPCU9cGFyYW1WYWx1ZXNbaV0lPiI+Ci08JQotICB9Ci19Ci0lPgotPC9mb3JtPgotPC9ib2R5PgotPC9odG1sPgotCi08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotQWRkVG9GYXZvcml0ZXNBY3Rpb24gYWN0aW9uID0gbmV3IEFkZFRvRmF2b3JpdGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotaWYgKGFjdGlvbi5mYXZvcml0ZUV4aXN0cygpKSB7Ci0lPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVMiKSklPiIpKQotICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLWVsc2UgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkZWM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbiBhY3Rpb247Ci0gICBpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgRm9sZGVyTm9kZSkKLSAgICAgYWN0aW9uID0gbmV3IENsZWFyTmF2aWdhdG9yRm9sZGVyTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLSAgIGVsc2UKLSAgICAgYWN0aW9uID0gbmV3IENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gVGhlIGFjdGlvbiBtYXkgYmUgZXhlY3V0ZWQgcHJvZ3JhbW1lZCBsaW5rLgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIAotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAKLSAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGJmMTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBDbGVhck5hdmlnYXRvck5vZGVzQWN0aW9uIGFjdGlvbiA9IG5ldyBDbGVhck5hdmlnYXRvck5vZGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Db21wbGV0ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQ29tcGxldGVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwNGJhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Db21wbGV0ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIENvbXBsZXRlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbiBhY3Rpb24gPSBuZXcgQ29tcGxldGVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoaW5wdXRzVmFsaWQpCi0gICB7Ci0gICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gICB9Ci0lPgotCi0gICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgcHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgIHN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgIDwvc2NyaXB0PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYmZlZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvTGF1bmNoU3ViUXVlcnlBY3Rpb24uaW5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JQotICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gYWN0aW9uLmdldFN1YlF1ZXJ5S2V5KCk7Ci0gICBTdHJpbmdCdWZmZXIgbmV3U3ViUXVlcnlLZXkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICBpZiAoc3ViUXVlcnlLZXkgIT0gbnVsbCAmJiBzdWJRdWVyeUtleS5sZW5ndGgoKSA+IDApCi0gICAgIG5ld1N1YlF1ZXJ5S2V5LmFwcGVuZChhY3Rpb24uZ2V0U3ViUXVlcnlLZXkoKSkuYXBwZW5kKCc6Jyk7Ci0gICBuZXdTdWJRdWVyeUtleS5hcHBlbmQoYWN0aW9uLmdldE5ld1N1YlF1ZXJ5KCkpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpYWN0aW9uLmdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBwYXJlbnRGb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5KTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBzdWJRdWVyeUZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMobmV3U3ViUXVlcnlLZXkudG9TdHJpbmcoKSk7Ci0gICBTdHJpbmcgbmV3U3ViUXVlcnlJdGVtU3RyaW5nID0gYWN0aW9uLmdldE5ld1N1YlF1ZXJ5SXRlbSgpOwotICAgc3ViUXVlcnlGb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxuZXdTdWJRdWVyeUl0ZW1TdHJpbmcpOwotICAgc3ViUXVlcnlGb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VULG5ldyBCb29sZWFuKGFjdGlvbi5pc1N1YlF1ZXJ5R2V0KCkpKTsKLSAgIAotICAgLy8gQWx3YXlzIGluaXRpYWxpemUgdGhlIHF1ZXJ5IG5hbWUgc28gdGhlIHN1YnF1ZXJ5IG1ha2VzIHNlbnNlLgotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgcGFyZW50UXVlcnlOYW1lID0gKFN0cmluZylwYXJlbnRGb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICBpZiAocGFyZW50UXVlcnlOYW1lID09IG51bGwpCi0gICAgIHBhcmVudFF1ZXJ5TmFtZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJERUZBVUxUX1FVRVJZX05BTUUiKTsKLSAgIGludCBuZXdTdWJRdWVyeUl0ZW0gPSBJbnRlZ2VyLnBhcnNlSW50KG5ld1N1YlF1ZXJ5SXRlbVN0cmluZyk7Ci0gICBTdHJpbmcgbmV3U3ViUXVlcnlJdGVtVHlwZVN0cmluZyA9IG51bGw7Ci0gICBzd2l0Y2ggKG5ld1N1YlF1ZXJ5SXRlbSkKLSAgIHsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICBuZXdTdWJRdWVyeUl0ZW1UeXBlU3RyaW5nID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTRVMiKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgbmV3U3ViUXVlcnlJdGVtVHlwZVN0cmluZyA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFUyIpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgbmV3U3ViUXVlcnlJdGVtVHlwZVN0cmluZyA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVMiKTsKLSAgIH0KLSAgIFN0cmluZ1tdIG1lc3NhZ2VQYXJhbWV0ZXJzID0ge3BhcmVudFF1ZXJ5TmFtZSxuZXdTdWJRdWVyeUl0ZW1UeXBlU3RyaW5nfTsKLSAgIHN1YlF1ZXJ5Rm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkRFRkFVTFRfU1VCUVVFUllfTkFNRSIsbWVzc2FnZVBhcmFtZXRlcnMpKTsKLSAgIAotICAgTm9kZSBub2RlID0gYWN0aW9uLmdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgaW50IG5vZGVJZCA9IG5vZGUuZ2V0Tm9kZUlkKCk7Ci0gICBpbnQgdG9vbElkID0gbm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCk7Ci0gICBpbnQgdmlld0lkID0gbm9kZS5nZXRWaWV3SWQoKTsKLSAgIGludCB2aWV3VG9vbElkID0gbm9kZS5nZXRWaWV3VG9vbElkKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdEZpbmRUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCxuZXdTdWJRdWVyeUtleS50b1N0cmluZygpLGZhbHNlKSkpJT4iOwotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Mb2dpbkFkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0xvZ2luQWR2YW5jZWRBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDcyY2YyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0xvZ2luQWR2YW5jZWRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjcgICAxMzY0NDkgYnJ1bnNzZW5AdXMuaWJtLmNvbSAtIFZpbmNlIEJydW5zc2VuICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgTG9naW5BZHZhbmNlZEFjdGlvbiBhY3Rpb24gPSBuZXcgTG9naW5BZHZhbmNlZEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgaWYgKCFhY3Rpb24uaXNTdWJRdWVyeUluaXRpYXRlZCgpKQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTGF1bmNoU3ViUXVlcnlBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Mb2dvdXRBZHZhbmNlZEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Mb2dvdXRBZHZhbmNlZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTNhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvTG9nb3V0QWR2YW5jZWRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjcgICAxMzY0NDkgYnJ1bnNzZW5AdXMuaWJtLmNvbSAtIFZpbmNlIEJydW5zc2VuICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgTG9nb3V0QWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IExvZ291dEFkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOyAvL2FjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZDU1NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIE1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0FjdGlvbiBhY3Rpb24gPSBuZXcgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoIWlucHV0c1ZhbGlkKQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotICAgZWxzZQotICAgewotICAgICBpZiAoIWFjdGlvbi5pc1N1YlF1ZXJ5SW5pdGlhdGVkKCkpCi0gICAgIHsKLSAgICAgICBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTGF1bmNoU3ViUXVlcnlBY3Rpb24uaW5jIiAlPgotPCUKLSAgICAgfQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOWU0ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlCi0gICBpZiAoIWlucHV0c1ZhbGlkKQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotICAgZWxzZQotICAgewotICAgICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0gICAgIGlmIChhY3Rpb25SZXN1bHQpCi0gICAgIHsKLSAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgc2VsZWN0ZWQgbm9kZSBpcyB2aXNpYmxlLgotICAgICAgIGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpLm1ha2VTZWxlY3RlZE5vZGVWaXNpYmxlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgewotICAgIG5hdmlnYXRvckNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL25hdmlnYXRvcl9jb250ZW50LmpzcCIpKSU+IjsKLSAgICBwcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICB9Ci0gIGVsc2UKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3VkZGlfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgIH0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9PcGVuUmVnaXN0cnlBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvT3BlblJlZ2lzdHJ5QWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3MmViMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9PcGVuUmVnaXN0cnlBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0KLSAgIE9wZW5SZWdpc3RyeUFjdGlvbiBhY3Rpb24gPSBuZXcgT3BlblJlZ2lzdHJ5QWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzYmU1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZnJlc2hVRERJTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVmcmVzaFVERElOb2RlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBUaGUgYWN0aW9uIG1heSBiZSBleGVjdXRlZCB2aWEgcHJvZ3JhbSBsaW5rLgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIGJvb2xlYW4gaXNOb2RlRGF0YVZhbGlkID0gYWN0aW9uLnZlcmlmeU5vZGVEYXRhKCk7Ci0KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgU3RyaW5nIG9uTG9hZEFjdGlvbjsKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBwcm9jZXNzQ2xlYXJOb2Rlc0Zvcm0oKQotICB7Ci0gICAgdmFyIGNsZWFyTm9kZXNGb3JtID0gZG9jdW1lbnQuZm9ybXNbMF07Ci0gICAgdmFyIHN1Ym1pdENsZWFyTm9kZXNGb3JtID0gZmFsc2U7Ci08JQotICAgICBWZWN0b3Igc3RhbGVOb2RlcyA9IGFjdGlvbi5nZXRTdGFsZU5vZGVzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHN0YWxlTm9kZXMuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIE5vZGUgc3RhbGVOb2RlID0gKE5vZGUpc3RhbGVOb2Rlcy5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9SRU1PVkVfTk9ERSIsc3RhbGVOb2RlLmdldE5vZGVOYW1lKCkpKSU+IikpCi0gICAgewotICAgICAgY2xlYXJOb2Rlc0Zvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9QWN0aW9uSW5wdXRzLk5PREVJRCU+Iiw8JT1zdGFsZU5vZGUuZ2V0Tm9kZUlkKCklPikpOwotICAgICAgc3VibWl0Q2xlYXJOb2Rlc0Zvcm0gPSB0cnVlOwotICAgIH0KLTwlCi0gICAgIH0KLSU+Ci0gICAgaWYgKHN1Ym1pdENsZWFyTm9kZXNGb3JtKQotICAgICAgY2xlYXJOb2Rlc0Zvcm0uc3VibWl0KCk7Ci0gIH0KLTwvc2NyaXB0PiAgICAKLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb25KU1AuanNwIikpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgotPC9mb3JtPgotPCUKLSAgIGlmICghaXNOb2RlRGF0YVZhbGlkKQotICAgewotICAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKShhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSkpOwotICAgICBTdHJpbmcgbm9kZU5hbWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpLmdldE5vZGUobm9kZUlkKS5nZXROb2RlTmFtZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfUVVFU1RJT05fUkVNT1ZFX05PREUiLG5vZGVOYW1lKSklPiIpKQotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCkpKSU+IjsKLTwvc2NyaXB0PiAgICAKLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb2Nlc3NDbGVhck5vZGVzRm9ybSgpOwotPC9zY3JpcHQ+Ci08JUAgaW5jbHVkZSBmaWxlID0gIi91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2Rlc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzYyOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2Rlc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm11dGlscy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVmcmVzaFVERElOb2Rlc0FjdGlvbiBhY3Rpb24gPSBuZXcgUmVmcmVzaFVERElOb2Rlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIAotICAgLy8gUnVuIHRoZSBhY3Rpb24KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gcHJvY2Vzc0NsZWFyTm9kZXNGb3JtKCkKLSAgewotICAgIHZhciBjbGVhck5vZGVzRm9ybSA9IGRvY3VtZW50LmZvcm1zWzBdOwotPCUKLSAgICAgVmVjdG9yIHN0YWxlTm9kZXMgPSBhY3Rpb24uZ2V0U3RhbGVOb2RlcygpOwotICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8c3RhbGVOb2Rlcy5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTm9kZSBzdGFsZU5vZGUgPSAoTm9kZSlzdGFsZU5vZGVzLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1JFTU9WRV9OT0RFIixzdGFsZU5vZGUuZ2V0Tm9kZU5hbWUoKSkpJT4iKSkKLSAgICAgIGNsZWFyTm9kZXNGb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIsPCU9c3RhbGVOb2RlLmdldE5vZGVJZCgpJT4pKTsKLTwlICAgIAotICAgICB9Ci0lPgotICAgIGNsZWFyTm9kZXNGb3JtLnN1Ym1pdCgpOwotICB9ICAgICAgICAgCi08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb25KU1AuanNwIikpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgotPC9mb3JtPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb2Nlc3NDbGVhck5vZGVzRm9ybSgpOwotPC9zY3JpcHQ+ICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTQ1OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThiNmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgaWYgKCFhY3Rpb24uaXNTdWJRdWVyeUluaXRpYXRlZCgpKQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTGF1bmNoU3ViUXVlcnlBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzE2YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRCdXNpbmVzc2VzU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0NGM5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkMzI0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGlmICghYWN0aW9uLmlzU3ViUXVlcnlJbml0aWF0ZWQoKSkKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL0xhdW5jaFN1YlF1ZXJ5QWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYWNlNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZVVVSURBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhNWU2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZVVVSURBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzOGRlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGlmICghYWN0aW9uLmlzU3ViUXVlcnlJbml0aWF0ZWQoKSkKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL0xhdW5jaFN1YlF1ZXJ5QWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VzU2ltcGxlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYWQ1OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VzU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VzU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjM5YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDEyYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDY2YmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgaWYgKCFhY3Rpb24uaXNTdWJRdWVyeUluaXRpYXRlZCgpKQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTGF1bmNoU3ViUXVlcnlBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjUyNzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjVkYzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWIwNGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgaWYgKCFhY3Rpb24uaXNTdWJRdWVyeUluaXRpYXRlZCgpKQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTGF1bmNoU3ViUXVlcnlBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlbW92ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjZjZWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlbW92ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGFjdGlvbiA9IG5ldyBSZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoaW5wdXRzVmFsaWQpCi0gICB7Ci0gICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gICB9Ci0lPgotCi0gICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgcHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgIHN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgIDwvc2NyaXB0PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZW1vdmVTdWJRdWVyeUl0ZW1BY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1ZjYzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZW1vdmVTdWJRdWVyeUl0ZW1BY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBSZW1vdmVTdWJRdWVyeUl0ZW1BY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1Jlc2l6ZVVERElGcmFtZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVzaXplVURESUZyYW1lc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNzIyMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVzaXplVURESUZyYW1lc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAvLyBDcmVhdGUgdGhlIGFjdGlvbi4KLSAgIFJlc2l6ZVVERElGcmFtZXNBY3Rpb24gYWN0aW9uID0gbmV3IFJlc2l6ZVVERElGcmFtZXNBY3Rpb24oY29udHJvbGxlcik7Ci0gICAKLSAgIC8vIFBvcHVsYXRlIHRoZSBhY3Rpb24gd2l0aCB0aGUgcmVxdWVzdCBwcm9wZXJ0aWVzLgotICAgYm9vbGVhbiByZXN1bHQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICBpZiAocmVzdWx0KQotICAgewotICAgICBhY3Rpb24uZXhlY3V0ZShmYWxzZSk7Ci0gICAgIAotICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGlzTWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcigpKQotICB7Ci0gICAgdmFyIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0ID0gZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQoKTsKLSAgICB2YXIgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0ID0gZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0KCk7Ci0gICAgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQuc2V0QXR0cmlidXRlKCJjb2xzIiwiPCU9dWRkaVBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpJT4iKTsKLSAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQuc2V0QXR0cmlidXRlKCJyb3dzIiwiPCU9dWRkaVBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+Iik7Ci0gIH0KLSAgZWxzZQotICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvdWRkaV9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCIpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RDYXRlZ29yeU5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4NGY2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RDYXRlZ29yeU5vZGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnV0aWwuKiIgJT4KLQotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLSAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvY2JwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RDYXRlZ29yeU5vZGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLQotICAgQ2F0ZWdvcnlOb2RlIHNlbGVjdGVkTm9kZSA9IChDYXRlZ29yeU5vZGUpYWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpOwotICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgIE5vZGUgcHJldmlvdXNTZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRQcmV2aW91c1NlbGVjdGVkTm9kZSgpOwotICAgaW50IHNlbGVjdGVkTm9kZUlkID0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotPCUKLSAgIFN0cmluZyB0cmVlQ29udGVudFZhciA9IGFjdGlvbi5nZXRUcmVlQ29udGVudFZhcigpOwotICAgaWYgKHByZXZpb3VzU2VsZWN0ZWROb2RlICE9IG51bGwpCi0gICB7Ci0gICAgIGlmICh0cmVlQ29udGVudFZhciAhPSBudWxsKQotICAgICB7Ci0lPgotICA8JT10cmVlQ29udGVudFZhciU+LmFsdGVySW1hZ2UoJzwlPXByZXZpb3VzU2VsZWN0ZWROb2RlLmdldEFuY2hvck5hbWUoKSU+JywnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHByZXZpb3VzU2VsZWN0ZWROb2RlLmdldENsb3NlZEltYWdlUGF0aCgpKSklPicpOwotPCUKLSAgICAgfQotICAgfQotICAgU3RyaW5nIHNlbGVjdGVkTm9kZUFuY2hvck5hbWUgPSBzZWxlY3RlZE5vZGUuZ2V0QW5jaG9yTmFtZSgpOwotICAgaWYgKHRyZWVDb250ZW50VmFyICE9IG51bGwpCi0gICB7Ci0lPiAgICAgCi0gIDwlPXRyZWVDb250ZW50VmFyJT4uc2VsZWN0Tm9kZSgnPCU9c2VsZWN0ZWROb2RlQW5jaG9yTmFtZSU+JywnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHNlbGVjdGVkTm9kZS5nZXRPcGVuSW1hZ2VQYXRoKCkpKSU+Jyk7Ci0gIDwlPXRyZWVDb250ZW50VmFyJT4ubG9jYXRpb24uaGFzaCA9ICcjPCU9c2VsZWN0ZWROb2RlQW5jaG9yTmFtZSU+JzsKLTwlICAKLSAgIH0KLSAgIAotICAgQ2F0ZWdvcnlFbGVtZW50IGNhdGVnb3J5RWxlbWVudCA9IChDYXRlZ29yeUVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICBLZXllZFJlZmVyZW5jZSBrciA9IGNhdGVnb3J5RWxlbWVudC5nZXRDYXRlZ29yeSgpOwotJT4KLSAgY2F0ZWdvcnlCcm93c2VyV2luZG93Lm9wZW5lci50YXJnZXRDYXRlZ29yeUtleU5hbWVFbGVtZW50LnZhbHVlID0gIjwlPWtyLmdldEtleU5hbWUoKSU+IjsKLSAgY2F0ZWdvcnlCcm93c2VyV2luZG93Lm9wZW5lci50YXJnZXRDYXRlZ29yeUtleVZhbHVlRWxlbWVudC52YWx1ZSA9ICI8JT1rci5nZXRLZXlWYWx1ZSgpJT4iOwotICBjYXRlZ29yeUJyb3dzZXJXaW5kb3cub3BlbmVyLmNsb3NlQ2F0ZWdvcnlCcm93c2VyKCk7Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2M2NmMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0RmluZFRvb2xBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFNlbGVjdEZpbmRUb29sQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RGaW5kVG9vbEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi0gICBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYjdkMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi0gICBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1NlbGVjdE5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzRhNDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1TZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbiBhY3Rpb24gPSBuZXcgU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwMGVlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24gYWN0aW9uID0gbmV3IFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoZmFsc2UpOwotICAgCi0gICBpZiAoIWFjdGlvblJlc3VsdCkKLSAgIHsKLSAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGUuZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICAgU3RyaW5nIHN1YlF1ZXJ5TGlzdEtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0tFWSk7Ci0gICAgIGludCBzdWJRdWVyeUxpc3RJdGVtSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0lURU1JRCkpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBVVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPiAgCi08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9JVEVNX1ZBTElEQVRJT05fRkFJTEVEIixhY3Rpb24uZ2V0SXRlbU5hbWUoKSkpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZW1vdmVTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayhzdWJRdWVyeUtleSxzdWJRdWVyeUxpc3RLZXksc3ViUXVlcnlMaXN0SXRlbUlkKSkpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+Ci08JQotICAgfQotICAgZWxzZQotICAgewotICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLSAgICAgYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlcnZpY2VHZXRCdXNpbmVzc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzllNzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlcnZpY2VHZXRCdXNpbmVzc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgU2VydmljZUdldEJ1c2luZXNzQWN0aW9uIGFjdGlvbiA9IG5ldyBTZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGJvb2xlYW4gc2VydmljZUV4aXN0cyA9IGFjdGlvbi52YWxpZGF0ZVNlcnZpY2UoKTsKLQotICAgaWYgKCFzZXJ2aWNlRXhpc3RzKQotICAgewotICAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKShhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSkpOwotICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1JFTU9WRV9TRVJWSUNFX05PREUiKSklPiIpKQotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCkpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0U2VydmljZUludGVyZmFjZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiNWY5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0U2VydmljZUludGVyZmFjZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFNlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbiBhY3Rpb24gPSBuZXcgU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBib29sZWFuIHNlcnZpY2VFeGlzdHMgPSBhY3Rpb24udmFsaWRhdGVTZXJ2aWNlKCk7Ci0KLSAgIGlmICghc2VydmljZUV4aXN0cykKLSAgIHsKLSAgICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykoYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKS5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpKTsKLSAgICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9SRU1PVkVfU0VSVklDRV9OT0RFIikpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChDbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWIyODc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRCdXNpbmVzc2VzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBTZXJ2aWNlSW50ZXJmYWNlR2V0QnVzaW5lc3Nlc0FjdGlvbiBhY3Rpb24gPSBuZXcgU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGJvb2xlYW4gc2lFeGlzdHMgPSBhY3Rpb24udmFsaWRhdGVTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0KLSAgIGlmICghc2lFeGlzdHMpCi0gICB7Ci0gICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpKGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkuZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKSk7Ci0gICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfUVVFU1RJT05fUkVNT1ZFX1NJX05PREUiKSklPiIpKQotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCkpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNlR2V0U2VydmljZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5NjdiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNlR2V0U2VydmljZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFNlcnZpY2VJbnRlcmZhY2VHZXRTZXJ2aWNlc0FjdGlvbiBhY3Rpb24gPSBuZXcgU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBib29sZWFuIHNpRXhpc3RzID0gYWN0aW9uLnZhbGlkYXRlU2VydmljZUludGVyZmFjZSgpOwotCi0gICBpZiAoIXNpRXhpc3RzKQotICAgewotICAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKShhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSkpOwotICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1JFTU9WRV9TSV9OT0RFIikpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChDbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDZkMThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1Nob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGFjdGlvbiA9IG5ldyBTaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgaWYgKCFhY3Rpb24uaXNTdWJRdWVyeUluaXRpYXRlZCgpKQotICAgewotICAgICBpZiAoaW5wdXRzVmFsaWQpCi0gICAgIHsKLSAgICAgICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgICAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gICAgIH0KLSU+Ci0gICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgcHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgIHN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgIDwvc2NyaXB0PgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL0xhdW5jaFN1YlF1ZXJ5QWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tVURESUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21VRERJQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlMzc0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21VRERJQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24KLVN3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb24gYWN0aW9uID0gbmV3IFN3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb24oY29udHJvbGxlcik7Ci0gICAKLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIAotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gICAKLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvc3dpdGNocGVyc3BlY3RpdmUuanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RvZ2dsZUNhdGVnb3J5Tm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NzUzYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL2NicGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFRvZ2dsZUNhdGVnb3J5Tm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZShmYWxzZSk7Ci0KLSAgIFN0cmluZyB0cmVlQ29udGVudFZhciA9IGFjdGlvbi5nZXRUcmVlQ29udGVudFZhcigpOwotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci08JQotICAgaWYgKHRyZWVDb250ZW50VmFyICE9IG51bGwpCi0gICB7Ci0lPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gICAgPCU9dHJlZUNvbnRlbnRWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFRyZWVDb250ZW50UGFnZSgpKSklPiI7Ci0gIGVsc2UKLSAgICBjYXRlZ29yeUJyb3dzZXJXaW5kb3cubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRUcmVlQ29udGFpbmVyUGFnZSgpKSklPiI7Ci08JQotICAgfQotJT4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWU3NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLVRvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24gYWN0aW9uID0gbmV3IFRvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiMjgwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9UcmFuc2ZlclN1YlF1ZXJ5UmVzdWx0c0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb24gYWN0aW9uID0gbmV3IFRyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICBpZiAocmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TSE9XX1JFU1VMVFNfVEFSR0VUKSAhPSBudWxsKQotICAgICBhY3Rpb24uZW5hYmxlU2hvd1Jlc3VsdHNUYXJnZXQoKTsKLSAgIGVsc2UKLSAgICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotICAgTm9kZSB0YXJnZXROb2RlID0gYWN0aW9uLmdldFRhcmdldE5vZGUoKTsKLSAgIFN0cmluZyB0YXJnZXROb2RlQW5jaG9yTmFtZSA9IHRhcmdldE5vZGUuZ2V0QW5jaG9yTmFtZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBuYXZpZ2F0b3JDb250ZW50LnNlbGVjdE5vZGUoJzwlPXRhcmdldE5vZGVBbmNob3JOYW1lJT4nLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodGFyZ2V0Tm9kZS5nZXRPcGVuSW1hZ2VQYXRoKCkpKSU+Jyk7Ci0gIG5hdmlnYXRvckNvbnRlbnQubG9jYXRpb24uaGFzaD0nIzwlPXRhcmdldE5vZGVBbmNob3JOYW1lJT4nOwotICBwcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVHJhbnNmZXJUb0FkZENhdGVnb3J5RGF0YUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDYzNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVHJhbnNmZXJUb0FkZENhdGVnb3J5RGF0YUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBTdHJpbmcgY2F0ZWdvcnlUTW9kZWxLZXkgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX1RNT0RFTF9LRVkpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSluYXZpZ2F0b3JNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IHVkZGlNYWluTm9kZS5nZXRSZWdpc3RyeU5vZGUobmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKSk7Ci0gICBSZWdpc3RyeURldGFpbHNUb29sIHJlZ0RldGFpbHNUb29sID0gcmVnTm9kZS5nZXRSZWdEZXRhaWxzVG9vbCgpOwotICAgcmVnRGV0YWlsc1Rvb2wuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMsY2F0ZWdvcnlUTW9kZWxLZXkpOwotICAgcmVnTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5zZXRTZWxlY3RlZFRvb2xJZChyZWdEZXRhaWxzVG9vbC5nZXRUb29sSWQoKSk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKHJlZ05vZGUuZ2V0Tm9kZUlkKCksZmFsc2UpKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg0ZGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2hvd1BlcnNwZWN0aXZlQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlVERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiIlPgotCi0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1VRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24gYWN0aW9uID0gbmV3IFVERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1ib29sZWFuIHBhcmFtVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi1pZiAocGFyYW1WYWxpZCkgewotICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotICBpZiAoYWN0aW9uUmVzdWx0KSB7Ci0lPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwsZmFsc2UpKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci0gIGVsc2UgewotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotfQotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDNmZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1ODIwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzFmNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gYWN0aW9uID0gbmV3IFVERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVW5wdWJsaXNoQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VucHVibGlzaEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzU4ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVW5wdWJsaXNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgVW5wdWJsaXNoQWN0aW9uIGFjdGlvbiA9IG5ldyBVbnB1Ymxpc2hBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlQWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZUFjdGlvbi5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZjQwMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlQWN0aW9uLmluYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCUKLSAgIGlmICghaW5wdXRzVmFsaWQpCi0gICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIGJvb2xlYW4gcmVmcmVzaFJlc3VsdCA9IGFjdGlvbi5yZWZyZXNoRnJvbVJlZ2lzdHJ5KCk7Ci0gICAgIAotICAgICBpZiAoIXJlZnJlc2hSZXN1bHQpCi0gICAgIHsKLSAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hfQUNUSU9OLGFjdGlvbik7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1BVQkxJU0hfSVRFTSIpKSU+IikpCi0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9VcGRhdGVOZXdQdWJsaXNoQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgZWxzZQotICAgIHByb3BlcnRpZXNDb250ZW50LnJlcXVlc3RTdWJtaXR0ZWQgPSBmYWxzZTsKLTwvc2NyaXB0PgotPCUKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgICAgfQotICAgfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZUJ1c2luZXNzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZUJ1c2luZXNzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0N2FiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVCdXNpbmVzc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBVcGRhdGVCdXNpbmVzc0FjdGlvbiBhY3Rpb24gPSBuZXcgVXBkYXRlQnVzaW5lc3NBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9VcGRhdGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlTmV3UHVibGlzaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVOZXdQdWJsaXNoQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhNTdlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVOZXdQdWJsaXNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIFVwZGF0ZUFjdGlvbiBhY3Rpb24gPSAoVXBkYXRlQWN0aW9uKXNlc3Npb24uZ2V0QXR0cmlidXRlKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSF9BQ1RJT04pOwotICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoVURESUFjdGlvbklucHV0cy5QVUJMSVNIX0FDVElPTik7Ci0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjdlYmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVJlZ2lzdHJ5QWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFVwZGF0ZVJlZ2lzdHJ5QWN0aW9uIGFjdGlvbiA9IG5ldyBVcGRhdGVSZWdpc3RyeUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL1VwZGF0ZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTE0ZjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgVXBkYXRlU2VydmljZUFjdGlvbiBhY3Rpb24gPSBuZXcgVXBkYXRlU2VydmljZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgaWYgKCFpbnB1dHNWYWxpZCkKLSAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gIHN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgYm9vbGVhbiByZWZyZXNoU2VydmljZVJlc3VsdCA9IGFjdGlvbi5yZWZyZXNoRnJvbVJlZ2lzdHJ5KCk7Ci0gICAgIGJvb2xlYW4gcmVmcmVzaEJ1c2luZXNzUmVzdWx0ID0gYWN0aW9uLnJlZnJlc2hCdXNpbmVzc0Zyb21SZWdpc3RyeSgpOwotICAgICBpZiAoIXJlZnJlc2hTZXJ2aWNlUmVzdWx0KQotICAgICB7Ci0gICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoVURESUFjdGlvbklucHV0cy5QVUJMSVNIX0FDVElPTixhY3Rpb24pOwotICAgICAgIGlmICghcmVmcmVzaEJ1c2luZXNzUmVzdWx0KQotICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1NFUlZJQ0VfUFVCTElTSF9CVVNJTkVTUyIpKSU+IikpCi0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlTmV3UHVibGlzaEJ1c2luZXNzQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgZWxzZQotICAgIHByb3BlcnRpZXNDb250ZW50LnJlcXVlc3RTdWJtaXR0ZWQgPSBmYWxzZTsKLTwvc2NyaXB0PgotPCUKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1BVQkxJU0hfSVRFTSIpKSU+IikpCi0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9VcGRhdGVOZXdQdWJsaXNoQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgZWxzZQotICAgIHByb3BlcnRpZXNDb250ZW50LnJlcXVlc3RTdWJtaXR0ZWQgPSBmYWxzZTsKLTwvc2NyaXB0PgotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlSW50ZXJmYWNlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjE4YmM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbiBhY3Rpb24gPSBuZXcgVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL1VwZGF0ZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlTmV3UHVibGlzaEJ1c2luZXNzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VOZXdQdWJsaXNoQnVzaW5lc3NBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQ0ZTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VOZXdQdWJsaXNoQnVzaW5lc3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICAgVXBkYXRlU2VydmljZUFjdGlvbiBhY3Rpb24gPSAoVXBkYXRlU2VydmljZUFjdGlvbilzZXNzaW9uLmdldEF0dHJpYnV0ZShVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hfQUNUSU9OKTsKLSAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSF9BQ1RJT04pOwotCi0gICBSZWdQdWJsaXNoVG9vbCByZWdQdWJsaXNoVG9vbCA9IGFjdGlvbi5zZXR1cFJlZ1B1Ymxpc2hUb29sKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHJlZ1B1Ymxpc2hUb29sLmdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGZhbHNlKSkpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9uc19jb250YWluZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnNfY29udGFpbmVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExYWMyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9uc19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05UQUlORVIlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5TVEFUVVNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250YWluZXIuanNwIikpJT4iIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTEgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvY2F0ZWdvcnlfYnJvd3Nlci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvY2F0ZWdvcnlfYnJvd3Nlci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjM3NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2NhdGVnb3J5X2Jyb3dzZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBTdHJpbmcgY2F0ZWdvcnlUTW9kZWxLZXkgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX1RNT0RFTF9LRVkpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgdWRkaVBlcnNwZWN0aXZlLnNldENhdGVnb3J5VE1vZGVsS2V5KGNhdGVnb3J5VE1vZGVsS2V5KTsKLSAgIAotICAgU3RyaW5nQnVmZmVyIHRvb2xiYXJMaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9jYXRlZ29yeV90b29sYmFyLmpzcD8iKTsKLSAgIHRvb2xiYXJMaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiVElUTEVfQ0FURUdPUllfQlJPV1NFUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjAsMzMsKiIgYm9yZGVyPTAgYmdjb2xvcj0iI0VDRTlEOCI+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5DQVRFR09SSUVTX1dPUktBUkVBJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQ0FURUdPUklFU19XT1JLQVJFQSIpJT4iIGZyYW1lYm9yZGVyPTAgbm9yZXNpemU+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5DQVRFR09SSUVTX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9DQVRFR09SSUVTX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh0b29sYmFyTGluay50b1N0cmluZygpKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuQ0FURUdPUklFU19DT05URU5UJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQ0FURUdPUklFU19DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlbkNhdGVnb3J5QnJvd3NlckFjdGlvbi5nZXRDYXRlZ29yeUNvbnRlbnRQYWdlKHNlc3Npb25JZCxjYXRlZ29yeVRNb2RlbEtleSkpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2NhdGVnb3J5X2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2NhdGVnb3J5X2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzZiN2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9jYXRlZ29yeV9jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLioiICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotPGpzcDp1c2VCZWFuIGlkPSJjb21tb25DYXRlZ29yeU1vZGVscyIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJhcHBsaWNhdGlvbiIvPgotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLSAgIFN0cmluZyBjYXRlZ29yeVRNb2RlbEtleSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVE1PREVMX0tFWSk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0NBVEVHT1JJRVNfQ09OVEVOVCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90cmVldmlldy5jc3MiKSklPiI+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotICA8L3NjcmlwdD4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdHJlZXZpZXcuanMiKSklPiI+Ci0gIDwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHRyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGEoKQotICB7Ci0gICAgdG9wLm9wZW5lci50b3AuZnJhbWVzWyI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iXS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoVHJhbnNmZXJUb0FkZENhdGVnb3J5RGF0YUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb25JZCxjYXRlZ29yeVRNb2RlbEtleSkpKSU+IjsKLSAgfSAgCi08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTwlICAgCi0gICAvLyBDaGVjayBpZiB0aGUgY2F0ZWdvcnkgaXMgYSBjb21tb24gY2F0ZWdvcnkuCi0gICBDYXRlZ29yeU1vZGVsIGNhdGVnb3J5TW9kZWwgPSAoQ2F0ZWdvcnlNb2RlbCljb21tb25DYXRlZ29yeU1vZGVscy5nZXQoY2F0ZWdvcnlUTW9kZWxLZXkpOwotICAgaWYgKGNhdGVnb3J5TW9kZWwgPT0gbnVsbCkKLSAgIHsKLSAgICAgLy8gVGhlIGNhdGVnb3J5IGlzIHVzZXItZGVmaW5lZC4gICAgIAotICAgICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IHVkZGlNYWluTm9kZS5nZXRSZWdpc3RyeU5vZGUobmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKSk7Ci0gICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7ICAgCi0gICAgIGNhdGVnb3J5TW9kZWwgPSAoQ2F0ZWdvcnlNb2RlbClyZWdFbGVtZW50LmdldFVzZXJEZWZpbmVkQ2F0ZWdvcnkoY2F0ZWdvcnlUTW9kZWxLZXkpOwotICAgfQotICAgYnl0ZSByYyA9IENhdGVnb3J5TW9kZWwuT1BFUkFUSU9OX1NVQ0NFU1NGVUw7Ci0gICBpZiAoIWNhdGVnb3J5TW9kZWwuaXNEYXRhTG9hZGVkKCkpCi0gICB7Ci0gICAgIHN5bmNocm9uaXplZChjYXRlZ29yeU1vZGVsKQotICAgICB7Ci0gICAgICAgaWYgKCFjYXRlZ29yeU1vZGVsLmlzRGF0YUxvYWRlZCgpKQotICAgICAgICAgcmMgPSBjYXRlZ29yeU1vZGVsLmxvYWRGcm9tRGVmYXVsdERhdGFGaWxlKCk7Ci0gICAgIH0KLSAgIH0KLSAgIGlmIChyYyAhPSBDYXRlZ29yeU1vZGVsLk9QRVJBVElPTl9TVUNDRVNTRlVMKQotICAgewotJT4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fTk9fQ0FURUdPUllfREFUQSIsY2F0ZWdvcnlNb2RlbC5nZXREaXNwbGF5TmFtZSgpKSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgICA8dGQgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BRERfQ0FURUdPUllfREFUQSIsImphdmFzY3JpcHQ6dHJhbnNmZXJUb0FkZENhdGVnb3J5RGF0YSgpIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+Ci08JSAgIAotICAgfQotICAgZWxzZQotICAgewotICAgICBOb2RlTWFuYWdlciBjYXRlZ29yeU1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0Q2F0ZWdvcnlNYW5hZ2VyKGNhdGVnb3J5TW9kZWwpOwotICAgICBTdHJpbmcgc2VsZWN0ZWRBbmNob3JOYW1lID0gIiI7Ci0gICAgIGludCBmb2N1c2VkTm9kZUlkID0gY2F0ZWdvcnlNYW5hZ2VyLmdldEZvY3VzZWROb2RlSWQoKTsKLSAgICAgU3RyaW5nIGZvY3VzZWRBbmNob3JOYW1lID0gU3RyaW5nLnZhbHVlT2YoZm9jdXNlZE5vZGVJZCk7Ci0gICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gY2F0ZWdvcnlNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpCi0gICAgIHsKLSAgICAgICBzZWxlY3RlZEFuY2hvck5hbWUgPSBzZWxlY3RlZE5vZGUuZ2V0QW5jaG9yTmFtZSgpOwotICAgICAgIGlmIChmb2N1c2VkTm9kZUlkID09IHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSkKLSAgICAgICAgIGZvY3VzZWRBbmNob3JOYW1lID0gc2VsZWN0ZWRBbmNob3JOYW1lOwotICAgICB9Ci0lPgotPGRpdiBpZD0idHJlZWNvbnRlbnRib3JkZXIiPgotPCU9Y2F0ZWdvcnlNYW5hZ2VyLnJlbmRlclRyZWVWaWV3KHJlc3BvbnNlKSU+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZWxmLmxvY2F0aW9uLmhhc2g9IiM8JT1mb2N1c2VkQW5jaG9yTmFtZSU+IgotICBzZXRTZWxlY3RlZEFuY2hvck5hbWUoIjwlPXNlbGVjdGVkQW5jaG9yTmFtZSU+Iik7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0lPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2NhdGVnb3J5X3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2NhdGVnb3J5X3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWU2YjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9jYXRlZ29yeV90b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9DQVRFR09SSUVTX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiIgb25VbmxvYWQ9InRvcC5vcGVuZXIuY2F0ZWdvcnlXaW5kb3dDbG9zZWQ9dHJ1ZSI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2ltYWdlcy9jYXRlZ29yeS5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0NBVEVHT1JJRVMiKSU+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0b3Aub3BlbmVyLmNhdGVnb3J5V2luZG93Q2xvc2VkPWZhbHNlOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2RhdGEvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL2dlby1kYXRhLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL2dlby1kYXRhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3OGFiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS9nZW8tZGF0YS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzgzICswLDAgQEAKLWdlbyMtLSNXb3JsZCMtLQotZ2VvI0FFI1VuaXRlZCBBcmFiIEVtaXJhdGVzIy0tCi1nZW8jQUYjQWZnaGFuaXN0YW4jLS0KLWdlbyNBRyNBbnRpZ3VhIEFuZCBCYXJidWRhIy0tCi1nZW8jQUkjQW5ndWlsbGEjLS0KLWdlbyNBTCNBbGJhbmlhIy0tCi1nZW8jQU0jQXJtZW5pYSMtLQotZ2VvI0FOI05ldGhlcmxhbmRzIEFudGlsbGVzIy0tCi1nZW8jQU8jQW5nb2xhIy0tCi1nZW8jQVEjQW50YXJjdGljYSMtLQotZ2VvI0FSI0FyZ2VudGluYSMtLQotZ2VvI0FSLUEjU2FsdGEjQVIKLWdlbyNBUi1CI0J1ZW5vcyBBaXJlcyNBUgotZ2VvI0FSLUMjRGlzdHJpdG8gRmVkZXJhbCNBUgotZ2VvI0FSLUQjU2FuIEx1aXMjQVIKLWdlbyNBUi1FI0VudHJlIFJpb3MjQVIKLWdlbyNBUi1GI0xhIFJpb2phI0FSCi1nZW8jQVItRyNTYW50aWFnbyBEZWwgRXN0ZXJvI0FSCi1nZW8jQVItSCNDaGFjbyNBUgotZ2VvI0FSLUojU2FuIEp1YW4jQVIKLWdlbyNBUi1LI0NhdGFtYXJjYSNBUgotZ2VvI0FSLUwjTGEgUGFtcGEjQVIKLWdlbyNBUi1NI01lbmRvemEjQVIKLWdlbyNBUi1OI01pc2lvbmVzI0FSCi1nZW8jQVItUCNGb3Jtb3NhI0FSCi1nZW8jQVItUSNOZXVxdWVuI0FSCi1nZW8jQVItUiNSaW8gTmVncm8jQVIKLWdlbyNBUi1TI1NhbnRhIEZlI0FSCi1nZW8jQVItVCNUdWN1bWFuI0FSCi1nZW8jQVItVSNDaHVidXQjQVIKLWdlbyNBUi1WI1RpZXJyYSBEZWwgRnVlZ28jQVIKLWdlbyNBUi1XI0NvcnJpZW50ZXMjQVIKLWdlbyNBUi1YI0NvcmRvYmEjQVIKLWdlbyNBUi1ZI0p1anV5I0FSCi1nZW8jQVItWiNTYW50YSBDcnV6I0FSCi1nZW8jQVMjQW1lcmljYW4gU2Ftb2EjLS0KLWdlbyNBVCNBdXN0cmlhIy0tCi1nZW8jQVUjQXVzdHJhbGlhIy0tCi1nZW8jQVUtQ1QjQXVzdHJhbGlhbiBDYXBpdGFsIFRlcnJpdG9yeSNBVQotZ2VvI0FVLU5TI05ldyBTb3V0aCBXYWxlcyNBVQotZ2VvI0FVLU5UI05vcnRoZXJuIFRlcnJpdG9yeSNBVQotZ2VvI0FVLVFMI1F1ZWVuc2xhbmQjQVUKLWdlbyNBVS1TQSNTb3V0aCBBdXN0cmFsaWEjQVUKLWdlbyNBVS1UUyNUYXNtYW5pYSNBVQotZ2VvI0FVLVZJI1ZpY3RvcmlhI0FVCi1nZW8jQVUtV0EjV2VzdGVybiBBdXN0cmFsaWEjQVUKLWdlbyNBVyNBcnViYSMtLQotZ2VvI0FaI0F6ZXJiYWlqYW4jLS0KLWdlbyNCQSNCb3NuaWEtSGVyY2Vnb3ZpbmEjLS0KLWdlbyNCQiNCYXJiYWRvcyMtLQotZ2VvI0JEI0JhbmdsYWRlc2gjLS0KLWdlbyNCRSNCZWxnaXVtIy0tCi1nZW8jQkYjQnVya2luYSBGYXNvIy0tCi1nZW8jQkcjQnVsZ2FyaWEjLS0KLWdlbyNCSCNCYWhyYWluIy0tCi1nZW8jQkkjQnVydW5kaSMtLQotZ2VvI0JKI0JlbmluIy0tCi1nZW8jQk0jQmVybXVkYSMtLQotZ2VvI0JOI0JydW5laSBEYXJ1c3NhbGFtIy0tCi1nZW8jQk8jQm9saXZpYSMtLQotZ2VvI0JSI0JyYXppbCMtLQotZ2VvI0JSLUFDI0FjcmUjQlIKLWdlbyNCUi1BTCNBbGFnb2FzI0JSCi1nZW8jQlItQU0jQW1hem9uYXMjQlIKLWdlbyNCUi1BUCNBbWFwYSNCUgotZ2VvI0JSLUJBI0JhaGlhI0JSCi1nZW8jQlItQ0UjQ2VhcmEjQlIKLWdlbyNCUi1ERiNEaXN0cml0byBGZWRlcmFsI0JSCi1nZW8jQlItRVMjRXNwaXJpdG8gU2FudG8jQlIKLWdlbyNCUi1HTyNHb2lhcyNCUgotZ2VvI0JSLU1BI01hcmFuaGFvI0JSCi1nZW8jQlItTUcjTWluYXMgR2VyYWlzI0JSCi1nZW8jQlItTVMjTWF0byBHcm9zc28gRG8gU3VsI0JSCi1nZW8jQlItTVQjTWF0byBHcm9zc28jQlIKLWdlbyNCUi1QQSNQYXJhI0JSCi1nZW8jQlItUEIjUGFyYWliYSNCUgotZ2VvI0JSLVBFI1Blcm5hbWJ1Y28jQlIKLWdlbyNCUi1QSSNQaWF1aSNCUgotZ2VvI0JSLVBSI1BhcmFuYSNCUgotZ2VvI0JSLVJKI1JpbyBEZSBKYW5laXJvI0JSCi1nZW8jQlItUk4jUmlvIEdyYW5kZSBEbyBOb3J0ZSNCUgotZ2VvI0JSLVJPI1JvbmRvbmlhI0JSCi1nZW8jQlItUlIjUm9yYWltYSNCUgotZ2VvI0JSLVJTI1JpbyBHcmFuZGUgRG8gU3VsI0JSCi1nZW8jQlItU0MjU2FudGEgQ2F0YXJpbmEjQlIKLWdlbyNCUi1TRSNTZXJnaXBlI0JSCi1nZW8jQlItU1AjU2FvIFBhdWxvI0JSCi1nZW8jQlItVE8jVG9jYW50aW5hI0JSCi1nZW8jQlMjQmFoYW1hcyMtLQotZ2VvI0JUI0JodXRhbiMtLQotZ2VvI0JVI0J1cm1hIChTZWUgTU0gTXlhbm1hcikjLS0KLWdlbyNCVyNCb3Rzd2FuYSMtLQotZ2VvI0JZI0JlbGFydXMjLS0KLWdlbyNCWS1CUiNCcmVzdHNrYXlhIHZvYmxhc3RzJyNCWQotZ2VvI0JZLUhPI0hvbXllbCdza2F5YSB2b2JsYXN0cycjQlkKLWdlbyNCWS1IUiNIcm9kemVuc2theWEgdm9ibGFzdHMnI0JZCi1nZW8jQlktTUEjTWFoaWx5b3dza2F5YSB2b2JsYXN0cycjQlkKLWdlbyNCWS1NSSNNaW5za2F5YSB2b2JsYXN0cycjQlkKLWdlbyNCWS1WSSNWaXRzeWVic2theWEgdm9ibGFzdHMnI0JZCi1nZW8jQlojQmVsaXplIy0tCi1nZW8jQ0EjQ2FuYWRhIy0tCi1nZW8jQ0EtQUIjQWxiZXJ0YSNDQQotZ2VvI0NBLUJDI0JyaXRpc2ggQ29sdW1iaWEjQ0EKLWdlbyNDQS1NQiNNYW5pdG9iYSNDQQotZ2VvI0NBLU5CI05ldyBCcnVuc3dpY2sjQ0EKLWdlbyNDQS1ORiNOZXdmb3VuZGxhbmQjQ0EKLWdlbyNDQS1OUyNOb3ZhIFNjb3RpYSNDQQotZ2VvI0NBLU5UI05vcnRod2VzdCBUZXJyaXRvcmllcyNDQQotZ2VvI0NBLU5VI051bmF2dXQjQ0EKLWdlbyNDQS1PTiNPbnRhcmlvI0NBCi1nZW8jQ0EtUEUjUHJpbmNlIEVkd2FyZCBJc2xhbmQjQ0EKLWdlbyNDQS1RQyNRdWViZWMjQ0EKLWdlbyNDQS1TSyNTYXNrYXRjaGV3YW4jQ0EKLWdlbyNDQS1ZVCNZdWtvbiBUZXJyaXRvcnkjQ0EKLWdlbyNDQyNDb2NvcyAoS2VlbGluZykgSXNsYW5kcyMtLQotZ2VvI0NEIyJDb25nbywgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiIjLS0KLWdlbyNDRiNDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMjLS0KLWdlbyNDRyNDb25nbyMtLQotZ2VvI0NII1N3aXR6ZXJsYW5kIy0tCi1nZW8jQ0gtQUcjQWFyZ2F1I0NICi1nZW8jQ0gtQUkjQXBwZW56ZWxsIElubmVyLVJob2RlbiNDSAotZ2VvI0NILUFSI0FwcGVuemVsbCBBdXNzZXItUmhvZGVuI0NICi1nZW8jQ0gtQkUjQmVybiNDSAotZ2VvI0NILUJMI0Jhc2VsLUxhbmRzY2hhZnQjQ0gKLWdlbyNDSC1CUyNCYXNlbC1TdGFkdCNDSAotZ2VvI0NILUZSI0ZyaWJvdXJnI0NICi1nZW8jQ0gtR0UjR2Vuw6h2ZSNDSAotZ2VvI0NILUdMI0dsYXJ1cyNDSAotZ2VvI0NILUdSI0dyYXViw7xuZGVuI0NICi1nZW8jQ0gtSlUjSnVyYSNDSAotZ2VvI0NILUxVI0x1emVybiNDSAotZ2VvI0NILU5FI05ldWNoYXRlbCNDSAotZ2VvI0NILU5XI05pZHdhbGRlbiNDSAotZ2VvI0NILU9XI09id2FsZGVuI0NICi1nZW8jQ0gtU0cjU3QgR2FsbGVuI0NICi1nZW8jQ0gtU0gjU2NoYWZmaGF1c2VuI0NICi1nZW8jQ0gtU08jU29sb3RodXJuI0NICi1nZW8jQ0gtU1ojU2Nod3l6I0NICi1nZW8jQ0gtVEcjVGh1cmdhdSNDSAotZ2VvI0NILVRJI1RpY2lubyNDSAotZ2VvI0NILVVSI1VyaSNDSAotZ2VvI0NILVZEI1ZhdWQjQ0gKLWdlbyNDSC1WUyNWYWxhaXMjQ0gKLWdlbyNDSC1aRyNadWcjQ0gKLWdlbyNDSC1aSCNaw7xyaWNoI0NICi1nZW8jQ0kjQ290ZSBEJ0l2b2lyZSMtLQotZ2VvI0NLI0Nvb2sgSXNsYW5kcyMtLQotZ2VvI0NMI0NoaWxlIy0tCi1nZW8jQ00jQ2FtZXJvb24jLS0KLWdlbyNDTiNDaGluYSMtLQotZ2VvI0NOLTExI0JlaWppbmcjQ04KLWdlbyNDTi0xMiNUaWFuamluI0NOCi1nZW8jQ04tMTMjSGViZWkjQ04KLWdlbyNDTi0xNCNTaGFueGkjQ04KLWdlbyNDTi0xNSNOZWkgTW9uZ29sI0NOCi1nZW8jQ04tMjEjTGlhb25pbmcjQ04KLWdlbyNDTi0yMiNKaWxpbiNDTgotZ2VvI0NOLTIzI0hlaWxvbmdqaWFuZyNDTgotZ2VvI0NOLTMxI1NoYW5naGFpI0NOCi1nZW8jQ04tMzIjSmlhbmdzdSNDTgotZ2VvI0NOLTMzI1poZWppYW5nI0NOCi1nZW8jQ04tMzQjQW5odWkjQ04KLWdlbyNDTi0zNSNGdWppYW4jQ04KLWdlbyNDTi0zNiNKaWFuZ3hpI0NOCi1nZW8jQ04tMzcjU2hhbmRvbmcjQ04KLWdlbyNDTi00MSNIZW5hbiNDTgotZ2VvI0NOLTQyI0h1YmVpI0NOCi1nZW8jQ04tNDMjSHVuYW4jQ04KLWdlbyNDTi00NCNHdWFuZ2RvbmcjQ04KLWdlbyNDTi00NSNHdWFuZ3hpI0NOCi1nZW8jQ04tNDYjSGFpbmFuI0NOCi1nZW8jQ04tNTEjU2ljaHVhbiNDTgotZ2VvI0NOLTUyI0d1aXpob3UjQ04KLWdlbyNDTi01MyNZdW5uYW4jQ04KLWdlbyNDTi01NCNYaXphbmcjQ04KLWdlbyNDTi02MSNTaGFhbnhpI0NOCi1nZW8jQ04tNjIjR2Fuc3UjQ04KLWdlbyNDTi02MyNRaW5naGFpI0NOCi1nZW8jQ04tNjQjTmluZ3hpYSNDTgotZ2VvI0NOLTY1I1hpbmppYW5nI0NOCi1nZW8jQ04tNzEjVGFpd2FuI0NOCi1nZW8jQ04tOTEjWGlhbmdnYW5nIChIb25nIEtvbmcpI0NOCi1nZW8jQ04tOTIjQW9tZW4gKE1hY2F1KSNDTgotZ2VvI0NPI0NvbG9tYmlhIy0tCi1nZW8jQ1IjQ29zdGEgUmljYSMtLQotZ2VvI0NTI0Zvcm1lciBDemVjaG9zbG92YWtpYSMtLQotZ2VvI0NVI0N1YmEjLS0KLWdlbyNDViNDYXBlIFZlcmRlIy0tCi1nZW8jQ1gjQ2hyaXN0bWFzIElzbGFuZHMjLS0KLWdlbyNDWSNDeXBydXMjLS0KLWdlbyNDWiNDemVjaCBSZXB1YmxpYyMtLQotZ2VvI0RFIyJHZXJtYW55LCBGZWRlcmFsIFJlcHVibGljIG9mIiMtLQotZ2VvI0RFLUJFI0JlcmxpbiNERQotZ2VvI0RFLUJSI0JyYW5kZW5idXJnI0RFCi1nZW8jREUtQlcjQmFkZW4tV8O8cnR0ZW1iZXJnI0RFCi1nZW8jREUtQlkjQmF5ZXJuI0RFCi1nZW8jREUtSEIjQnJlbWVuIChIYW5zZXN0YWR0KSNERQotZ2VvI0RFLUhFI0hlc3NlbiNERQotZ2VvI0RFLUhII0hhbWJ1cmcgKEhhbnNlc3RhZHQpI0RFCi1nZW8jREUtTVYjTWVja2xlbmJ1cmctVm9ycG9tbWVybiNERQotZ2VvI0RFLU5JI05pZWRlcnNhY2hzZW4jREUKLWdlbyNERS1OVyNOb3JkcmhlaW4tV2VzdGZhbGVuI0RFCi1nZW8jREUtUlAjUmhlaW5sYW5kLVBmYWx6I0RFCi1nZW8jREUtU0gjU2NobGVzd2lnLUhvbHN0ZWluI0RFCi1nZW8jREUtU0wjU2FhcmxhbmQjREUKLWdlbyNERS1TTiNTYWNoc2VuI0RFCi1nZW8jREUtU1QjU2FjaHNlbi1BbmhhbHQjREUKLWdlbyNERS1USCNUaMO8cmluZ2VuI0RFCi1nZW8jREojRGppYm91dGkjLS0KLWdlbyNESyNEZW5tYXJrIy0tCi1nZW8jRE0jRG9taW5pY2EjLS0KLWdlbyNETyNEb21pbmljYW4gUmVwdWJsaWMjLS0KLWdlbyNETy0wMiNBenVhI0RPCi1nZW8jRE8tMDMjQmFob3J1Y28jRE8KLWdlbyNETy0wNCNCYXJhaG9uYSNETwotZ2VvI0RPLTA1I0RhamFiw7NuI0RPCi1nZW8jRE8tMDYjRHVhcnRlI0RPCi1nZW8jRE8tMDgjRWwgU2V5Ym8jRE8KLWdlbyNETy0wOSNFc3BhaWxsYXQjRE8KLWdlbyNETy0zMCNIYXRvIE1heW9yI0RPCi1nZW8jRE8tMTAjSW5kZXBlbmRlbmNpYSNETwotZ2VvI0RPLTExI0xhIEFsdGFncmFjaWEjRE8KLWdlbyNETy0wNyNMYSBFc3RyZWxsZXRhI0RPCi1nZW8jRE8tMTIjTGEgUm9tYW5hI0RPCi1nZW8jRE8tMTMjTGEgVmVnYSNETwotZ2VvI0RPLTE0I01hcsOtYSBUcmluaWRhZCBTw6FuY2hleiNETwotZ2VvI0RPLTI4I01vbnNlbm9yIE5vdWVsI0RPCi1nZW8jRE8tMTUjTW9udGUgQ3Jpc3RpI0RPCi1nZW8jRE8tMjkjTW9udGUgUGxhdGEjRE8KLWdlbyNETy0xNiNQZWRlcm5hbGVzI0RPCi1nZW8jRE8tMTcjUGVyYXZpYSNETwotZ2VvI0RPLTE4I1B1ZXJ0byBQbGF0YSNETwotZ2VvI0RPLTE5I1NvbGNlZG8jRE8KLWdlbyNETy0yMCNTYW1hbsOhI0RPCi1nZW8jRE8tMjEjU2FuIENyaXN0w7NiYWwjRE8KLWdlbyNETy0yMiNTYW4gSnVhbiNETwotZ2VvI0RPLTIzI1NhbiBQZWRybyBkZSBNYWNvcsOtcyNETwotZ2VvI0RPLTI0I1PDoW5jaGV6IFJhbcOtcmV6I0RPCi1nZW8jRE8tMjUjU2FudGlhZ28jRE8KLWdlbyNETy0yNiNTYW50aWFnbyBSb2Ryw61ndWV6I0RPCi1nZW8jRE8tMjcjVmFsdmVyZGUjRE8KLWdlbyNEWiNBbGdlcmlhIy0tCi1nZW8jRUMjRWN1YWRvciMtLQotZ2VvI0VFI0VzdG9uaWEjLS0KLWdlbyNFRyNFZ3lwdCMtLQotZ2VvI0VII1dlc3Rlcm4gU2FoYXJhIy0tCi1nZW8jRVIjRXJpdHJlYSMtLQotZ2VvI0VSLUFOI0Fuc2ViYSNFUgotZ2VvI0VSLURVI0RlYnViI0VSCi1nZW8jRVItREsjRGVidWJhd2kgS2V5aWggQmFocmkgW0RlYnViLUtlaWgtQmFocmldI0VSCi1nZW8jRVItR0IjR2FzaC1CYXJrYSNFUgotZ2VvI0VSLU1BI01hYWtlbCBbTWFla2VsXSNFUgotZ2VvI0VSLVNLI1NlbWVuYXdpIEtleWloIEJhaHJpIFtTZW1pZW4tS2VpaC1CYWhyaV0jRVIKLWdlbyNFUyNTcGFpbiMtLQotZ2VvI0VTLUFOI0FuZGFsdWPDrWEjRVMKLWdlbyNFUy1BTCNBbG1lcsOtYSNFUy1BTgotZ2VvI0VTLUNBI0PDoWRpeiNFUy1BTgotZ2VvI0VTLUNPI0PDs3Jkb2JhI0VTLUFOCi1nZW8jRVMtR1IjR3JhbmFkYSNFUy1BTgotZ2VvI0VTLUgjSHVlbHZhI0VTLUFOCi1nZW8jRVMtSiNKYcOpbiNFUy1BTgotZ2VvI0VTLU1BI03DoWxhZ2EjRVMtQU4KLWdlbyNFUy1TRSNTZXZpbGxhI0VTLUFOCi1nZW8jRVMtQVIjQXJhZ8OzbiNFUwotZ2VvI0VTLUhVI0h1ZXNjYSNFUy1BUgotZ2VvI0VTLVRFI1RlcnVlbCNFUy1BUgotZ2VvI0VTLVojWmFyYWdvemEjRVMtQVIKLWdlbyNFUy1PIyJBc3R1cmlhcywgUHJpbmNpcGFkbyBkZSIjRVMKLWdlbyNFUy1DTiNDYW5hcmlhcyNFUwotZ2VvI0VTLUdDI0xhcyBQYWxtYXMjRVMtQ04KLWdlbyNFUy1URiNTYW50YSBDcnV6IGRlIFRlbmVyaWZlI0VTLUNOCi1nZW8jRVMtUyNDYW50YWJyaWEjRVMKLWdlbyNFUy1DTSNDYXN0aWxsYS1MYSBNYW5jaGEjRVMKLWdlbyNFUy1BQiNBbGJhY2V0ZSNFUy1DTQotZ2VvI0VTLUNSI0N1aWRhZCBSZWFsI0VTLUNNCi1nZW8jRVMtQ1UjQ3VlbmNhI0VTLUNNCi1nZW8jRVMtR1UjR3VhZGFsYWphcmEjRVMtQ00KLWdlbyNFUy1UTyNUb2xlZG8jRVMtQ00KLWdlbyNFUy1DTCNDYXN0aWxsYSB5IExlw7NuI0VTCi1nZW8jRVMtQVYjw4F2aWxhI0VTLUNMCi1nZW8jRVMtQlUjQnVyZ29zI0VTLUNMCi1nZW8jRVMtTEUjTGXDs24jRVMtQ0wKLWdlbyNFUy1QI1BhbGVuY2lhI0VTLUNMCi1nZW8jRVMtU0EjU2FsYW1hbmNhI0VTLUNMCi1nZW8jRVMtU0cjU2Vnb3ZpYSNFUy1DTAotZ2VvI0VTLVNPI1NvcmlhI0VTLUNMCi1nZW8jRVMtVkEjVmFsbGFkb2xpZCNFUy1DTAotZ2VvI0VTLVpBI1phbW9yYSNFUy1DTAotZ2VvI0VTLUNUI0NhdGFsdW5hI0VTCi1nZW8jRVMtQiNCYXJjZWxvbmEjRVMtQ1QKLWdlbyNFUy1HRSNHaXJvbmEgW0dlcm9uYV0jRVMtQ1QKLWdlbyNFUy1MI0xsZWlkYSBbTMOpcnVkYV0jRVMtQ1QKLWdlbyNFUy1UI1RhcnJhZ29uYSNFUy1DVAotZ2VvI0VTLUVYI0V4dHJlbWFkdXJhI0VTCi1nZW8jRVMtQkEjQmFkYWpveiNFUy1FWAotZ2VvI0VTLUNDI0PDoWNlcmVzI0VTLUVYCi1nZW8jRVMtR0EjR2FsaWNpYSNFUwotZ2VvI0VTLUMjTGEgQ29ydW5hI0VTLUdBCi1nZW8jRVMtTFUjTHVnbyNFUy1HQQotZ2VvI0VTLU9SI09yZW5zZSNFUy1HQQotZ2VvI0VTLVBPI1BvbnRldmVkcmEjRVMtR0EKLWdlbyNFUy1QTSNJc2xhcyBCYWxlYXJlcyNFUwotZ2VvI0VTLUxPI0xhIFJpb2phI0VTCi1nZW8jRVMtTSMiTWFkcmlkLCBDb211bmlkYWQgZGUiI0VTCi1nZW8jRVMtTVUjIk11cmNpYSwgUmVnacOzbiBkZSIjRVMKLWdlbyNFUy1OQSMiTmF2YXJyYSwgQ29tdW5pZGFkIEZvcmFsIGRlIiNFUwotZ2VvI0VTLVBWI1Bhw61zIFZhc2NpI0VTCi1nZW8jRVMtVkkjw4FsYXZhI0VTLVBWCi1nZW8jRVMtU1MjR3VpcMO6emNvYSNFUy1QVgotZ2VvI0VTLUJJI1ZpemNheWEjRVMtUFYKLWdlbyNFUy1WQyMiVmFsZW5jaWFuYSwgQ29tdW5pZGFkIiNFUwotZ2VvI0VTLUEjQWxpY2FudGUjRVMtVkMKLWdlbyNFUy1DUyNDYXN0ZWxsw7NuI0VTLVZDCi1nZW8jRVMtViNWYWxlbmNpYSNFUy1WQwotZ2VvI0VTLUNFI0NldXRhI0VTCi1nZW8jRVMtTUwjTWVsaWxsYSNFUwotZ2VvI0VUI0V0aGlvcGlhIy0tCi1nZW8jRkkjRmlubGFuZCMtLQotZ2VvI0ZJLUFMI0FodmVuYW5tYWFuIE1hYWt1bnRhIChGaSkgw4VsYW5kcyBMw6RuIChTdikjRkkKLWdlbyNGSS1FUyNFdGVsw6QtU3VvbWVuIEzDpMOkbmkgKEZpKSBTw7ZkcmEgRmlubGFuZHMgTMOkbiAoU3YpI0ZJCi1nZW8jRkktSVMjSXTDpC1TdW9tZW4gTMOkw6RuaSAoRmkpIMOWc3RyYSBGaW5sYW5kcyBMw6RuIChTdikjRkkKLWdlbyNGSS1MTCNMYXBpbiBMw6TDpG5pIChGaSkgTGFwbGFuZHMgTMOkbiAoU3YpI0ZJCi1nZW8jRkktTFMjTMOkbnNpLVN1b21lbiBMw6TDpG5pIChGaSkgVsOkc3RyYSBGaW5sYW5kcyBMw6RuIChTdikjRkkKLWdlbyNGSS1PTCNPdWx1biBMw6TDpG5pIChGaSkgVWxlw6Vib3JncyBMw6RuIChTdikjRkkKLWdlbyNGSiNGaWppIy0tCi1nZW8jRksjRmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMpIy0tCi1nZW8jRk0jRmVkZXJhdGVkIFN0YXRlcyBPZiBNaWNyb25lc2lhIy0tCi1nZW8jRk8jRmFlcm9lIElzbGFuZHMjLS0KLWdlbyNGUiNGcmFuY2UjLS0KLWdlbyNGUi0wMSNBaW4jRlItVgotZ2VvI0ZSLTAyI0Fpc25lI0ZSLVMKLWdlbyNGUi0wMyNBbGxpZXIjRlItQwotZ2VvI0ZSLTA0I0FscGVzLURlLUhhdXRlLVByb3ZlbmNlI0ZSLVUKLWdlbyNGUi0wNSNIYXV0ZXMtQWxwZXMjRlItVQotZ2VvI0ZSLTA2I0FscGVzLU1hcml0aW1lcyNGUi1VCi1nZW8jRlItMDcjQXJkw6hjaGUjRlItVgotZ2VvI0ZSLTA4I0FyZGVubmVzI0ZSLUcKLWdlbyNGUi0wOSNBcmnDqGdlI0ZSLU4KLWdlbyNGUi0xMCNBdWJlI0ZSLUcKLWdlbyNGUi0xMSNBdWRlI0ZSLUsKLWdlbyNGUi0xMiNBdmV5cm9uI0ZSLU4KLWdlbyNGUi0xMyNCb3VjaGVzLUR1LVJow7RuZSNGUi1VCi1nZW8jRlItMTQjQ2FsdmFkb3MjRlItUAotZ2VvI0ZSLTE1I0NhbnRhbCNGUi1DCi1nZW8jRlItMTYjQ2hhcmVudGUjRlItVAotZ2VvI0ZSLTE3I0NoYXJlbnRlLU1hcml0aW1lI0ZSLVQKLWdlbyNGUi0xOCNDaGVyI0ZSLUYKLWdlbyNGUi0xOSNDb3Jyw6h6ZSNGUi1MCi1nZW8jRlItMjEjQ8O0dGUtRCdPciNGUi1ECi1nZW8jRlItMjIjQ8O0dGVzLUQnQXJtb3IjRlItRQotZ2VvI0ZSLTIzI0NyZXVzZSNGUi1MCi1nZW8jRlItMjQjRG9yZG9nbmUjRlItQgotZ2VvI0ZSLTI1I0RvdWJzI0ZSLUkKLWdlbyNGUi0yNiNEcsO0bWUjRlItVgotZ2VvI0ZSLTI3I0V1cmUjRlItUQotZ2VvI0ZSLTI4I0V1cmUtRXQtTG9pciNGUi1GCi1nZW8jRlItMjkjRmluaXN0w6hyZSNGUi1FCi1nZW8jRlItMkEjQ29yc2UtRHUtU3VkI0ZSLUgKLWdlbyNGUi0yQiNIYXV0ZS1Db3JzZSNGUi1ICi1nZW8jRlItMzAjR2FyZCNGUi1LCi1nZW8jRlItMzEjSGF1dGUtR2Fyb25uZSNGUi1OCi1nZW8jRlItMzIjR2VycyNGUi1OCi1nZW8jRlItMzMjR2lyb25kZSNGUi1CCi1nZW8jRlItMzQjSMOpcmF1bHQjRlItSwotZ2VvI0ZSLTM1I0lsbGUtRXQtVmlsYWluZSNGUi1FCi1nZW8jRlItMzYjSW5kcmUjRlItRgotZ2VvI0ZSLTM3I0luZHJlLUV0LUxvaXJlI0ZSLUYKLWdlbyNGUi0zOCNJc8OocmUjRlItVgotZ2VvI0ZSLTM5I0p1cmEjRlItSQotZ2VvI0ZSLTQwI0xhbmRlcyNGUi1CCi1nZW8jRlItNDEjTG9pci1FdC1DaGVyI0ZSLUYKLWdlbyNGUi00MiNMb2lyZSNGUi1WCi1nZW8jRlItNDMjSGF1dGUtTG9pcmUjRlItQwotZ2VvI0ZSLTQ0I0xvaXJlLUF0bGFudGlxdWUjRlItUgotZ2VvI0ZSLTQ1I0xvaXJldCNGUi1GCi1nZW8jRlItNDYjTG90I0ZSLU4KLWdlbyNGUi00NyNMb3QtRXQtR2Fyb25uZSNGUi1CCi1nZW8jRlItNDgjTG96w6hyZSNGUi1LCi1nZW8jRlItNDkjTWFpbmUtRXQtTG9pcmUjRlItUgotZ2VvI0ZSLTUwI01hbmNoZSNGUi1QCi1nZW8jRlItNTEjTWFybmUjRlItRwotZ2VvI0ZSLTUyI0hhdXRlLU1hcm5lI0ZSLUcKLWdlbyNGUi01MyNNYXllbm5lI0ZSLVIKLWdlbyNGUi01NCNNZXVydGhlLUV0LU1vc2VsbGUjRlItTQotZ2VvI0ZSLTU1I01ldXNlI0ZSLU0KLWdlbyNGUi01NiNNb3JiaWhhbiNGUi1FCi1nZW8jRlItNTcjTW9zZWxsZSNGUi1NCi1nZW8jRlItNTgjTmnDqHZyZSNGUi1ECi1nZW8jRlItNTkjTm9yZCNGUi1PCi1nZW8jRlItNjAjT2lzZSNGUi1TCi1nZW8jRlItNjEjT3JuZSNGUi1QCi1nZW8jRlItNjIjUGFzLURlLUNhbGFpcyNGUi1PCi1nZW8jRlItNjMjUHV5LURlLUTDtG1lI0ZSLUMKLWdlbyNGUi02NCNQeXLDqW7DqWVzLUF0bGFudGlxdWVzI0ZSLUIKLWdlbyNGUi02NSNIYXV0ZXMtUHlyw6luw6llcyNGUi1OCi1nZW8jRlItNjYjUHlyw6luw6llcy1PcmllbnRhbGVzI0ZSLUsKLWdlbyNGUi02NyNCYXMtUmhpbiNGUi1BCi1nZW8jRlItNjgjSGF1dC1SaGluI0ZSLUEKLWdlbyNGUi02OSNSaMO0bmUjRlItVgotZ2VvI0ZSLTcwI0hhdXRlLVNhw7RuZSNGUi1JCi1nZW8jRlItNzEjU2HDtG5lLUV0LUxvaXJlI0ZSLUQKLWdlbyNGUi03MiNTYXJ0aGUjRlItUgotZ2VvI0ZSLTczI1Nhdm9pZSNGUi1WCi1nZW8jRlItNzQjSGF1dGUtU2F2b2llI0ZSLVYKLWdlbyNGUi03NSNQYXJpcyNGUi1KCi1nZW8jRlItNzYjU2VpbmUtTWFyaXRpbWUjRlItUQotZ2VvI0ZSLTc3I1NlaW5lLUV0LU1hcm5lI0ZSLUoKLWdlbyNGUi03OCNZdmVsaW5lcyNGUi1KCi1nZW8jRlItNzkjRGV1eC1Tw6h2cmVzI0ZSLUIKLWdlbyNGUi04MCNTb21tZSNGUi1TCi1nZW8jRlItODEjVGFybiNGUi1OCi1nZW8jRlItODIjVGFybi1FdC1HYXJvbm5lI0ZSLU4KLWdlbyNGUi04MyNWYXIjRlItVQotZ2VvI0ZSLTg0I1ZhdWNsdXNlI0ZSLVUKLWdlbyNGUi04NSNWZW5kw6llI0ZSLVIKLWdlbyNGUi04NiNWaWVubmUjRlItVAotZ2VvI0ZSLTg3I0hhdXRlLVZpZW5uZSNGUi1MCi1nZW8jRlItODgjVm9zZ2VzI0ZSLU0KLWdlbyNGUi04OSNZb25uZSNGUi1ECi1nZW8jRlItOTAjVGVycml0b2lyZSBEZSBCZWxmb3J0I0ZSLUkKLWdlbyNGUi05MSNFc3Nvbm5lI0ZSLUoKLWdlbyNGUi05MiNIYXV0cy1EZS1TZWluZSNGUi1KCi1nZW8jRlItOTMjU2VpbmUtU2FpbnQtRGVuaXMjRlItSgotZ2VvI0ZSLTk0I1ZhbC1EZS1NYXJuZSNGUi1KCi1nZW8jRlItOTUjVmFsLUQnT2lzZSNGUi1KCi1nZW8jRlItQSNBbHNhY2UjRlIKLWdlbyNGUi1CI0FxdWl0YWluZSNGUgotZ2VvI0ZSLUMjQXV2ZXJnbmUjRlIKLWdlbyNGUi1EI0JvdXJnb2duZSNGUgotZ2VvI0ZSLUUjQnJldGFnbmUjRlIKLWdlbyNGUi1GI0NlbnRyZSNGUgotZ2VvI0ZSLUcjQ2hhbXBhZ25lLUFyZGVubmUjRlIKLWdlbyNGUi1II0NvcnNlI0ZSCi1nZW8jRlItSSNGcmFuY2hlLUNvbXTDqSNGUgotZ2VvI0ZSLUojSWxlLURlLUZyYW5jZSNGUgotZ2VvI0ZSLUsjTGFuZ3VlZG9jLVJvdXNzaWxsb24jRlIKLWdlbyNGUi1MI0xpbW91c2luI0ZSCi1nZW8jRlItTSNMb3JyYWluZSNGUgotZ2VvI0ZSLU4jTWlkaS1QeXLDqW7DqWVzI0ZSCi1nZW8jRlItTyNOb3JkLVBhcy1EZS1DYWxhaXMjRlIKLWdlbyNGUi1QI0Jhc3NlLU5vcm1hbmRpZSNGUgotZ2VvI0ZSLVEjSGF1dGUtTm9ybWFuZGllI0ZSCi1nZW8jRlItUiNQYXlzIERlIExhIExvaXJlI0ZSCi1nZW8jRlItUyNQaWNhcmRpZSNGUgotZ2VvI0ZSLVQjUG9pdG91LUNoYXJlbnRlcyNGUgotZ2VvI0ZSLVUjUHJvdmVuY2UtQWxwZXMtQ8O0dGUgRCdBenVyI0ZSCi1nZW8jRlItViNSaMO0bmUtQWxwZXMjRlIKLWdlbyNHQSNHYWJvbiMtLQotZ2VvI0dCI1VuaXRlZCBLaW5nZG9tIy0tCi1nZW8jR0ItQU5UI0FudHJpbSNHQi1OSVIKLWdlbyNHQi1BUkQjQXJkcyNHQi1OSVIKLWdlbyNHQi1BUk0jQXJtYWdoI0dCLU5JUgotZ2VvI0dCLUFWTiNBdm9uI0dCLUVORwotZ2VvI0dCLUJERiNCZWRmb3Jkc2hpcmUjR0ItRU5HCi1nZW8jR0ItQkZTI0JlbGZhc3QjR0ItTklSCi1nZW8jR0ItQktNI0J1Y2tpbmdoYW1zaGlyZSNHQi1FTkcKLWdlbyNHQi1CTEEjQmFsbHltZW5hI0dCLU5JUgotZ2VvI0dCLUJMWSNCYWxseW1vbmV5I0dCLU5JUgotZ2VvI0dCLUJOQiNCYW5icmlkZ2UjR0ItTklSCi1nZW8jR0ItQk9SI0JvcmRlcnMgUmVnaW9uI0dCLVNDVAotZ2VvI0dCLUJSSyNCZXJrc2hpcmUjR0ItRU5HCi1nZW8jR0ItQ0FNI0NhbWJyaWRnZXNoaXJlI0dCLUVORwotZ2VvI0dCLUNFTiNDZW50cmFsIFJlZ2lvbiNHQi1TQ1QKLWdlbyNHQi1DR1YjQ3JhaWdhdm9uI0dCLU5JUgotZ2VvI0dCLUNIQSNDaGFubmVsIElzbGFuZHMjR0IKLWdlbyNHQi1DSFMjQ2hlc2hpcmUjR0ItRU5HCi1nZW8jR0ItQ0tGI0NhcnJpY2tmZXJndXMjR0ItTklSCi1nZW8jR0ItQ0tUI0Nvb2tzdG93biNHQi1OSVIKLWdlbyNHQi1DTFIjQ29sZXJhaW5lI0dCLU5JUgotZ2VvI0dCLUNMViNDbGV2ZWxhbmQjR0ItRU5HCi1nZW8jR0ItQ01BI0N1bWJyaWEjR0ItRU5HCi1nZW8jR0ItQ09OI0Nvcm53YWxsI0dCLUVORwotZ2VvI0dCLUNTUiNDYXN0bGVyZWFnaCNHQi1OSVIKLWdlbyNHQi1DV0QjQ2x3eWQjR0ItV0xTCi1nZW8jR0ItREJZI0RlcmJ5c2hpcmUjR0ItRU5HCi1nZW8jR0ItREZEI0R5ZmVkI0dCLVdMUwotZ2VvI0dCLURHTiNEdW5nYW5ub24jR0ItTklSCi1nZW8jR0ItREdZI0R1bWZyaWVzICYgR2FsbG93YXkgUmVnaW9uI0dCLVNDVAotZ2VvI0dCLURPUiNEb3JzZXQjR0ItRU5HCi1nZW8jR0ItRE9XI0Rvd24jR0ItTklSCi1nZW8jR0ItRFJZI0RlcnJ5I0dCLU5JUgotZ2VvI0dCLURVUiNEdXJoYW0jR0ItRU5HCi1nZW8jR0ItRFZWI0Rldm9uI0dCLUVORwotZ2VvI0dCLUVORyNFbmdsYW5kI0dCCi1nZW8jR0ItRVNTI0Vzc2V4I0dCLUVORwotZ2VvI0dCLUVTWCNFYXN0IFN1c3NleCNHQi1FTkcKLWdlbyNHQi1GRVIjRmVybWFuYWdoI0dCLU5JUgotZ2VvI0dCLUZJRiNGaWZlIFJlZ2lvbiNHQi1TQ1QKLWdlbyNHQi1HTFMjR2xvdWNlc3RlcnNoaXJlI0dCLUVORwotZ2VvI0dCLUdNUCNHcmFtcGlhbiBSZWdpb24jR0ItU0NUCi1nZW8jR0ItR05UI0d3ZW50I0dCLVdMUwotZ2VvI0dCLUdTWSNHdWVybnNleSNHQi1DSEEKLWdlbyNHQi1HVEwjR3JlYXRlciBMb25kb24jR0ItRU5HCi1nZW8jR0ItR1RNI0dyZWF0ZXIgTWFuY2hlc3RlciNHQi1FTkcKLWdlbyNHQi1HV04jR3d5bmVkZCNHQi1XTFMKLWdlbyNHQi1IQU0jSGFtcHNoaXJlI0dCLUVORwotZ2VvI0dCLUhMRCNIaWdobGFuZCBSZWdpb24jR0ItU0NUCi1nZW8jR0ItSFJUI0hlcnRmb3Jkc2hpcmUjR0ItRU5HCi1nZW8jR0ItSFVNI0h1bWJlcnNpZGUjR0ItRU5HCi1nZW8jR0ItSFdSI0hlcmVmb3JkIEFuZCBXb3JjZXN0ZXIjR0ItRU5HCi1nZW8jR0ItSU9NI0lzbGUgT2YgTWFuI0dCCi1nZW8jR0ItSU9TI0lzbGVzIE9mIFNjaWxseSNHQi1FTkcKLWdlbyNHQi1JT1cjSXNsZSBPZiBXaWdodCNHQi1FTkcKLWdlbyNHQi1KU1kjSmVyc2V5I0dCLUNIQQotZ2VvI0dCLUtFTiNLZW50I0dCLUVORwotZ2VvI0dCLUxBTiNMYW5jYXNoaXJlI0dCLUVORwotZ2VvI0dCLUxFQyNMZWljZXN0ZXJzaGlyZSNHQi1FTkcKLWdlbyNHQi1MSU4jTGluY29sbnNoaXJlI0dCLUVORwotZ2VvI0dCLUxNViNMaW1hdmFkeSNHQi1OSVIKLWdlbyNHQi1MUk4jTGFybmUjR0ItTklSCi1nZW8jR0ItTFNCI0xpc2J1cm4jR0ItTklSCi1nZW8jR0ItTFROI0xvdGhpYW4gUmVnaW9uI0dCLVNDVAotZ2VvI0dCLU1GVCNNYWdoZXJhZmVsdCNHQi1OSVIKLWdlbyNHQi1NR00jTWlkIEdsYW1vcmdhbiNHQi1XTFMKLWdlbyNHQi1NU1kjTWVyc2V5c2lkZSNHQi1FTkcKLWdlbyNHQi1NWUwjTW95bGUjR0ItTklSCi1nZW8jR0ItTkJMI05vcnRodW1iZXJsYW5kI0dCLUVORwotZ2VvI0dCLU5ETiNOb3J0aCBEb3duI0dCLU5JUgotZ2VvI0dCLU5GSyNOb3Jmb2xrI0dCLUVORwotZ2VvI0dCLU5JUiNOb3J0aGVybiBJcmVsYW5kI0dCCi1nZW8jR0ItTlRBI05ld3RvbmFiYmV5I0dCLU5JUgotZ2VvI0dCLU5USCNOb3J0aGFtcHRvbnNoaXJlI0dCLUVORwotZ2VvI0dCLU5UVCNOb3R0aW5naGFtc2hpcmUjR0ItRU5HCi1nZW8jR0ItTllLI05vcnRoIFlvcmtzaGlyZSNHQi1FTkcKLWdlbyNHQi1OWU0jTmV3cnkgQW5kIE1vdXJuZSNHQi1OSVIKLWdlbyNHQi1PTUgjT21hZ2gjR0ItTklSCi1nZW8jR0ItT1JLI09ya25leSNHQi1TQ1QKLWdlbyNHQi1PWEYjT3hmb3Jkc2hpcmUjR0ItRU5HCi1nZW8jR0ItUE9XI1Bvd3lzI0dCLVdMUwotZ2VvI0dCLVNDVCNTY290bGFuZCNHQgotZ2VvI0dCLVNGSyNTdWZmb2xrI0dCLUVORwotZ2VvI0dCLVNHTSNTb3V0aCBHbGFtb3JnYW4jR0ItV0xTCi1nZW8jR0ItU0hSI1Nocm9wc2hpcmUjR0ItRU5HCi1nZW8jR0ItU09NI1NvbWVyc2V0I0dCLUVORwotZ2VvI0dCLVNSWSNTdXJyZXkjR0ItRU5HCi1nZW8jR0ItU1RCI1N0cmFiYW5lI0dCLU5JUgotZ2VvI0dCLVNURCNTdHJhdGhjbHlkZSBSZWdpb24jR0ItU0NUCi1nZW8jR0ItU1RTI1N0YWZmb3Jkc2hpcmUjR0ItRU5HCi1nZW8jR0ItU1lLI1NvdXRoIFlvcmtzaGlyZSNHQi1FTkcKLWdlbyNHQi1UQVkjVGF5c2lkZSBSZWdpb24jR0ItU0NUCi1nZW8jR0ItVFdSI1R5bmUgQW5kIFdlYXIjR0ItRU5HCi1nZW8jR0ItV0FSI1dhcndpY2tzaGlyZSNHQi1FTkcKLWdlbyNHQi1XR00jV2VzdCBHbGFtb3JnYW4jR0ItV0xTCi1nZW8jR0ItV0lMI1dpbHRzaGlyZSNHQi1FTkcKLWdlbyNHQi1XSVMjV2VzdGVybiBJc2xlcyNHQi1TQ1QKLWdlbyNHQi1XTFMjV2FsZXMjR0IKLWdlbyNHQi1XTUQjV2VzdCBNaWRsYW5kcyNHQi1FTkcKLWdlbyNHQi1XU1gjV2VzdCBTdXNzZXgjR0ItRU5HCi1nZW8jR0ItV1lLI1dlc3QgWW9ya3NoaXJlI0dCLUVORwotZ2VvI0dCLVpFVCNTaGV0bGFuZCAoWmV0bGFuZCkjR0ItU0NUCi1nZW8jR0QjR3JlbmFkYSMtLQotZ2VvI0dFI0dlb3JnaWEjLS0KLWdlbyNHRiNGcmVuY2ggR3VpYW5hIy0tCi1nZW8jR0gjR2hhbmEjLS0KLWdlbyNHSSNHaWJyYWx0YXIjLS0KLWdlbyNHTCNHcmVlbmxhbmQjLS0KLWdlbyNHTSNHYW1iaWEjLS0KLWdlbyNHTiNHdWluZWEjLS0KLWdlbyNHUCNHdWFkZWxvdXBlIy0tCi1nZW8jR1EjRXF1YXRvcmlhbCBHdWluZWEjLS0KLWdlbyNHUiNHcmVlY2UjLS0KLWdlbyNHUyNHZW9yZ2lhICYgU2FuZHdpY2ggSXNsYW5kcyMtLQotZ2VvI0dUI0d1YXRlbWFsYSMtLQotZ2VvI0dVI0d1YW0jLS0KLWdlbyNHVyNHdWluZWEtQmlzc2F1Iy0tCi1nZW8jR1kjR3V5YW5hIy0tCi1nZW8jSEsjSG9uZyBLb25nIy0tCi1nZW8jSE4jSG9uZHVyYXMjLS0KLWdlbyNIUiNDcm9hdGlhIy0tCi1nZW8jSFQjSGFpdGkjLS0KLWdlbyNIVSNIdW5nYXJ5Iy0tCi1nZW8jSUQjSW5kb25lc2lhIy0tCi1nZW8jSUUjSXJlbGFuZCMtLQotZ2VvI0lMI0lzcmFlbCMtLQotZ2VvI0lOI0luZGlhIy0tCi1nZW8jSU8jSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSMtLQotZ2VvI0lRI0lyYXEjLS0KLWdlbyNJUiMiSXJhbiwgSXNsYW1pYyBSZXB1YmxpYyBvZiIjLS0KLWdlbyNJUyNJY2VsYW5kIy0tCi1nZW8jSVQjSXRhbHkjLS0KLWdlbyNJVC0yMSNQaWVtb250ZSNJVAotZ2VvI0lULUFMI0FsZXNzYW5kcmlhI0lULTIxCi1nZW8jSVQtQVQjQXN0aSNJVC0yMgotZ2VvI0lULUJJI0JpZWxsYSNJVC0yMwotZ2VvI0lULUFPI0Fvc3RhIEFvc3RlIChmcikjSVQtMjMKLWdlbyNJVC1DTiNDdW5lbyNJVC0yNAotZ2VvI0lULU5PI05vdmFyYSNJVC0yNQotZ2VvI0lULUJHI0JlcmdhbW8jSVQtMjUKLWdlbyNJVC1CUyNCcmVzY2lhI0lULTI1Ci1nZW8jSVQtQ08jQ29tbyNJVC0yNQotZ2VvI0lULUNSI0NyZW1vbmEjSVQtMjUKLWdlbyNJVC1MQyNMZWNjbyNJVC0yNQotZ2VvI0lULUxPI0xvZGkjSVQtMjUKLWdlbyNJVC1NTiNNYW50b3ZhI0lULTI1Ci1nZW8jSVQtTUkjTWlsYW5vI0lULTI1Ci1nZW8jSVQtUFYjUGF2aWEjSVQtMjUKLWdlbyNJVC1TTyNTb25kcmlvI0lULTI1Ci1nZW8jSVQtVkEjVmFyZXNlI0lULTI1Ci1nZW8jSVQtVE8jVG9yaW5vI0lULTI2Ci1nZW8jSVQtVkIjVmVyYmFuby1DdXNpby1Pc3NvbGEjSVQtMjcKLWdlbyNJVC1WQyNWZXJjZWxsaSNJVC0yOAotZ2VvI0lULTIzI1ZhbGxlIGQnQW9zdGEjSVQKLWdlbyNJVC0yNSNMb21iYXJkaWEjSVQKLWdlbyNJVC0zMiNUcmVudGluby1BbHRvIEFkaWdlI0lUCi1nZW8jSVQtQlojQm9semFubyBCb3plbiAoZGUpI0lULTMyCi1nZW8jSVQtVE4jVHJlbnRvI0lULTMyCi1nZW8jSVQtMzQjVmVuZXRvI0lUCi1nZW8jSVQtQkwjQmVsbHVubyNJVC0zNAotZ2VvI0lULVBEI1BhZG92YSNJVC0zNAotZ2VvI0lULVJPI1JvdmlnbyNJVC0zNAotZ2VvI0lULVRWI1RyZXZpc28jSVQtMzQKLWdlbyNJVC1WRSNWZW5lemlhI0lULTM0Ci1nZW8jSVQtVlIjVmVyb25hI0lULTM0Ci1nZW8jSVQtVkkjVmljZW56YSNJVC0zNAotZ2VvI0lULTM2I0ZyaXVsaS1WZW5lemlhIEdpdWxpYSNJVAotZ2VvI0lULUdPI0dvcml6aWEjSVQtMzYKLWdlbyNJVC1QTiNQb3JkZW5vbmUjSVQtMzYKLWdlbyNJVC1UUyNUcmllc3RlI0lULTM2Ci1nZW8jSVQtVUQjVWRpbmUjSVQtMzYKLWdlbyNJVC00MiNMaWd1cmlhI0lUCi1nZW8jSVQtR0UjR2Vub3ZhI0lULTQyCi1nZW8jSVQtSU0jSW1wZXJpYSNJVC00MgotZ2VvI0lULVNQI0xhIFNwZXppYSNJVC00MgotZ2VvI0lULVNWI1Nhdm9uYSNJVC00MgotZ2VvI0lULTQ1I0VtaWxpYS1Sb21hZ25hI0lUCi1nZW8jSVQtQk8jQm9sb2duYSNJVC00NQotZ2VvI0lULUZFI0ZlcnJhcmEjSVQtNDUKLWdlbyNJVC1GTyNGb3Jsw6wjSVQtNDUKLWdlbyNJVC1NTyNNb2RlbmEjSVQtNDUKLWdlbyNJVC1QUiNQYXJtYSNJVC00NQotZ2VvI0lULVBDI1BpYWNlbnphI0lULTQ1Ci1nZW8jSVQtUkEjUmF2ZW5uYSNJVC00NQotZ2VvI0lULVJFI1JlZ2dpbyBFbWlsaWEjSVQtNDUKLWdlbyNJVC1STiNSaW1pbmkjSVQtNDUKLWdlbyNJVC01MiNUb3NjYW5hI0lUCi1nZW8jSVQtQVIjQXJlenpvI0lULTUyCi1nZW8jSVQtRkkjRmlyZW56ZSNJVC01MgotZ2VvI0lULUdSI0dyb3NzZXRvI0lULTUyCi1nZW8jSVQtTEkjTGl2b3JubyNJVC01MgotZ2VvI0lULUxVI0x1Y2NhI0lULTUyCi1nZW8jSVQtTVMjTWFzc2EtQ2FycmFyYSNJVC01MgotZ2VvI0lULVBJI1Bpc2EjSVQtNTIKLWdlbyNJVC1QVCNQaXN0b2lhI0lULTUyCi1nZW8jSVQtUE8jUHJhdG8jSVQtNTIKLWdlbyNJVC1TSSNTaWVuYSNJVC01MgotZ2VvI0lULTU1I1VtYnJpYSNJVAotZ2VvI0lULVBHI1BlcnVnaWEjSVQtNTUKLWdlbyNJVC1UUiNUZXJuaSNJVC01NQotZ2VvI0lULTU3I01hcmNoZSNJVAotZ2VvI0lULUFOI0FuY29uYSNJVC01NwotZ2VvI0lULUFQI0FzY29saSBQaWNlbm8jSVQtNTcKLWdlbyNJVC1NQyNNYWNlcmF0YSNJVC01NwotZ2VvI0lULVBTI1Blc2FybyBlIFVyYmlubyNJVC01NwotZ2VvI0lULTYyI0xhemlvI0lUCi1nZW8jSVQtRlIjRnJvc2lub25lI0lULTYyCi1nZW8jSVQtTFQjTGF0aW5hI0lULTYyCi1nZW8jSVQtUkkjUmlldGkjSVQtNjIKLWdlbyNJVC1STSNSb21hI0lULTYyCi1nZW8jSVQtVlQjVml0ZXJibyNJVC02MgotZ2VvI0lULTY1I0FicnV6em8jSVQKLWdlbyNJVC1DSCNDaGlldGkjSVQtNjUKLWdlbyNJVC1BUSNMJ0FxdWlsYSNJVC02NQotZ2VvI0lULVBFI1Blc2NhcmEjSVQtNjUKLWdlbyNJVC1URSNUZXJhbW8jSVQtNjUKLWdlbyNJVC02NyNNb2xpc2UjSVQKLWdlbyNJVC1DQiNDYW1wb2Jhc3NvI0lULTY3Ci1nZW8jSVQtSVMjSXNlcm5pYSNJVC02NwotZ2VvI0lULTcyI0NhbXBhbmlhI0lUCi1nZW8jSVQtQk4jQmVuZXZlbnRvI0lULTcyCi1nZW8jSVQtQ0UjQ2FzZXJ0YSNJVC03MgotZ2VvI0lULU5BI05hcG9saSNJVC03MgotZ2VvI0lULVNBI1NhbGVybm8jSVQtNzIKLWdlbyNJVC1BViNBdmVsbGlubyNJVC03MgotZ2VvI0lULTc1I1B1Z2xpYSNJVAotZ2VvI0lULUJBI0JhcmkjSVQtNzUKLWdlbyNJVC1CUiNCcmluZGlzaSNJVC03NQotZ2VvI0lULUZHI0ZvZ2dpYSNJVC03NQotZ2VvI0lULUxFI0xlY2NlI0lULTc1Ci1nZW8jSVQtVEEjVGFyYW50byNJVC03NQotZ2VvI0lULTc3I0Jhc2lsaWNhdGEjSVQKLWdlbyNJVC1NVCNNYXRlcmEjSVQtNzcKLWdlbyNJVC1QWiNQb3RlbnphI0lULTc3Ci1nZW8jSVQtNzgjQ2FsYWJyaWEjSVQKLWdlbyNJVC1DWiNDYXRhbnphcm8jSVQtNzgKLWdlbyNJVC1DUyNDb3NlbnphI0lULTc4Ci1nZW8jSVQtS1IjQ3JvdG9uZSNJVC03OAotZ2VvI0lULVJDI1JlZ2dpbyBDYWxhYnJpYSNJVC03OAotZ2VvI0lULVZWI1ZpYm8gVmFsZW50aWEjSVQtNzgKLWdlbyNJVC04MiNTaWNpbGlhI0lUCi1nZW8jSVQtQUcjQWdyaWdlbnRvI0lULTgyCi1nZW8jSVQtQ0wjQ2FsdGFuaXNzZXR0YSNJVC04MgotZ2VvI0lULUNUI0NhdGFuaWEjSVQtODIKLWdlbyNJVC1FTiNFbm5hI0lULTgyCi1nZW8jSVQtTUUjTWVzc2luYSNJVC04MgotZ2VvI0lULVBBI1BhbGVybW8jSVQtODIKLWdlbyNJVC1SRyNSYWd1c2EjSVQtODIKLWdlbyNJVC1TUiNTaXJhY3VzYSNJVC04MgotZ2VvI0lULVRQI1RyYXBhbmkjSVQtODIKLWdlbyNJVC04OCNTYXJkZWduYSNJVAotZ2VvI0lULUNBI0NhZ2xpYXJpI0lULTg4Ci1nZW8jSVQtTlUjTnVvcm8jSVQtODgKLWdlbyNJVC1PUiNPcmlzdGFubyNJVC04OAotZ2VvI0lULVNTI1Nhc3NhcmkjSVQtODgKLWdlbyNKTSNKYW1haWNhIy0tCi1nZW8jSk8jSm9yZGFuIy0tCi1nZW8jSlAjSmFwYW4jLS0KLWdlbyNKUC0wMSNIb2trYWlkbyNKUAotZ2VvI0pQLTAyI0FvbW9yaSNKUAotZ2VvI0pQLTAzI0l3YXRlI0pQCi1nZW8jSlAtMDQjTWl5YWdpI0pQCi1nZW8jSlAtMDUjQWtpdGEjSlAKLWdlbyNKUC0wNiNZYW1hZ2F0YSNKUAotZ2VvI0pQLTA3I0h1a3VzaW1hIChGdWt1c2hpbWEpI0pQCi1nZW8jSlAtMDgjSWJhcmFraSNKUAotZ2VvI0pQLTA5I1RvdGlnaSAoVG9jaGlnaSkjSlAKLWdlbyNKUC0xMCNHdW5tYSNKUAotZ2VvI0pQLTExI1NhaXRhbWEjSlAKLWdlbyNKUC0xMiNUaWJhIChDaGliYSkjSlAKLWdlbyNKUC0xMyNUb2t5byNKUAotZ2VvI0pQLTE0I0thbmFnYXdhI0pQCi1nZW8jSlAtMTUjTmlpZ2F0YSNKUAotZ2VvI0pQLTE2I1RveWFtYSNKUAotZ2VvI0pQLTE3I0lzaWthd2EgKElzaGlrYXdhKSNKUAotZ2VvI0pQLTE4I0h1a3VpIChGdWt1aSkjSlAKLWdlbyNKUC0xOSNZYW1hbmFzaSAoWWFtYW5hc2hpKSNKUAotZ2VvI0pQLTIwI05hZ2FubyNKUAotZ2VvI0pQLTIxI0dpaHUgKEdpZnUpI0pQCi1nZW8jSlAtMjIjU2l6dW9rYSAoU2hpenVva2EpI0pQCi1nZW8jSlAtMjMjQWl0aSAoQWljaGkpI0pQCi1nZW8jSlAtMjQjTWllI0pQCi1nZW8jSlAtMjUjU2lnYSAoU2hpZ2EpI0pQCi1nZW8jSlAtMjYjS3lvdG8jSlAKLWdlbyNKUC0yNyNPc2FrYSNKUAotZ2VvI0pQLTI4I0h5b2dvI0pQCi1nZW8jSlAtMjkjTmFyYSNKUAotZ2VvI0pQLTMwI1dha2F5YW1hI0pQCi1nZW8jSlAtMzEjVG90dG9yaSNKUAotZ2VvI0pQLTMyI1NpbWFuZSAoU2hpbWFuZSkjSlAKLWdlbyNKUC0zMyNPa2F5YW1hI0pQCi1nZW8jSlAtMzQjSGlyb3NpbWEgKEhpcm9zaGltYSkjSlAKLWdlbyNKUC0zNSNZYW1hZ3V0aSAoWWFtYWd1Y2hpKSNKUAotZ2VvI0pQLTM2I1Rva3VzaW1hIChUb2t1c2hpbWEpI0pQCi1nZW8jSlAtMzcjS2FnYXdhI0pQCi1nZW8jSlAtMzgjRWhpbWUjSlAKLWdlbyNKUC0zOSNLb3RpIChLb2NoaSkjSlAKLWdlbyNKUC00MCNIdWt1b2thIChGdWt1b2thKSNKUAotZ2VvI0pQLTQxI1NhZ2EjSlAKLWdlbyNKUC00MiNOYWdhc2FraSNKUAotZ2VvI0pQLTQzI0t1bWFtb3RvI0pQCi1nZW8jSlAtNDQjT2l0YSNKUAotZ2VvI0pQLTQ1I01peWF6YWtpI0pQCi1nZW8jSlAtNDYjS2Fnb3NpbWEgKEthZ29zaGltYSkjSlAKLWdlbyNKUC00NyNPa2luYXdhI0pQCi1nZW8jS0UjS2VueWEjLS0KLWdlbyNLRyNLeXJneXpzdGFuIy0tCi1nZW8jS0gjQ2FtYm9kaWEjLS0KLWdlbyNLSSNLaXJpYmF0aSMtLQotZ2VvI0tNI0NvbW9yb3MjLS0KLWdlbyNLTiNTdCBLaXR0cy1OZXZpcyMtLQotZ2VvI0tQIyJLb3JlYSwgRGVtIFBlb3BsZSdzIFJlcHVibGljIiMtLQotZ2VvI0tSIyJLb3JlYSwgUmVwdWJsaWMgb2YiIy0tCi1nZW8jS1ItMTEjU2VvdWwgVGV1Z2J5ZW9sc2kjS1IKLWdlbyNLUi0yNiNCdXNhbiBHd2FuZyd5ZW9nc2kjS1IKLWdlbyNLUi0yNyNEYWVndSBHd2FuZyd5ZW9nc2kjS1IKLWdlbyNLUi0zMCNEYWVqZW9uIEd3YW5nJ3llb2dzaSNLUgotZ2VvI0tSLTI5I0d3YW5nanUgR3dhbmcneWVvZ3NpI0tSCi1nZW8jS1ItMjgjSW5jaGVvbiBHd2FuZyd5ZW9nc2kjS1IKLWdlbyNLUi0zMSNVbHNhbiBHd2FuZyd5ZW9nc2kjS1IKLWdlbyNLUi00MyNDaHVuZ2NoZW9uZ2J1Z2RvI0tSCi1nZW8jS1ItNDQjQ2h1bmdjaGVvbmduYW1kbyNLUgotZ2VvI0tSLTQyI0dhbmcnd2VvbmRvI0tSCi1nZW8jS1ItNDEjR3llb25nZ2lkbyNLUgotZ2VvI0tSLTQ3I0d5ZW9uZ3NhbmdidWdkbyNLUgotZ2VvI0tSLTQ4I0d5ZW9uZ3NhbmduYW1kbyNLUgotZ2VvI0tSLTQ5I0planVkbyNLUgotZ2VvI0tSLTQ1I0plb25yYWJ1Z2RvI0tSCi1nZW8jS1ItNDYjSmVvbnJhbmFtZG8jS1IKLWdlbyNLVyNLdXdhaXQjLS0KLWdlbyNLWSNDYXltYW4gSXNsYW5kcyMtLQotZ2VvI0taI0themFraHN0YW4jLS0KLWdlbyNMQSNMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyMtLQotZ2VvI0xCI0xlYmFub24jLS0KLWdlbyNMQyNTYWludCBMdWNpYSMtLQotZ2VvI0xJI0xpZWNodGVuc3RlaW4jLS0KLWdlbyNMSyNTcmkgTGFua2EjLS0KLWdlbyNMUiNMaWJlcmlhIy0tCi1nZW8jTFMjTGVzb3RobyMtLQotZ2VvI0xUI0xpdGh1YW5pYSMtLQotZ2VvI0xVI0x1eGVtYm91cmcjLS0KLWdlbyNMViNMYXR2aWEjLS0KLWdlbyNMWSNMeWJpYW4gQXJhYiBKYW1haGlyaXlhIy0tCi1nZW8jTUEjTW9yb2NjbyMtLQotZ2VvI01DI01vbmFjbyMtLQotZ2VvI01EI01vbGRvdmEjLS0KLWdlbyNNRyNNYWRhZ2FzY2FyIy0tCi1nZW8jTUgjTWFyc2hhbGwgSXNsYW5kcyMtLQotZ2VvI01LI0Zvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBPZiBNYWNlZG9uaWEjLS0KLWdlbyNNTCNNYWxpIy0tCi1nZW8jTU0jTXlhbm1hciAoRm9ybWVyIEJ1cm1hKSMtLQotZ2VvI01OI01vbmdvbGlhIy0tCi1nZW8jTU8jTWFjYXUjLS0KLWdlbyNNUCNOb3J0aGVybiBNYXJpYW5hcyMtLQotZ2VvI01RI01hcnRpbmlxdWUjLS0KLWdlbyNNUiNNYXVyaXRhbmlhIy0tCi1nZW8jTVMjTW9udHNlcnJhdCMtLQotZ2VvI01UI01hbHRhIy0tCi1nZW8jTVUjTWF1cml0aXVzIy0tCi1nZW8jTVYjTWFsZGl2ZXMjLS0KLWdlbyNNVyNNYWxhd2kjLS0KLWdlbyNNWCNNZXhpY28jLS0KLWdlbyNNWC1BR1UjQWd1YXNjYWxpZW50ZXMjTVgKLWdlbyNNWC1CQ04jQmFqYSBDYWxpZm9ybmlhI01YCi1nZW8jTVgtQkNTI0JhamEgQ2FsaWZvcm5pYSBTdXIjTVgKLWdlbyNNWC1DQU0jQ2FtcGVjaGUjTVgKLWdlbyNNWC1DSEgjQ2hpaHVhaHVhI01YCi1nZW8jTVgtQ0hQI0NoaWFwYXMjTVgKLWdlbyNNWC1DT0EjQ29haHVpbGEjTVgKLWdlbyNNWC1DT0wjQ29saW1hI01YCi1nZW8jTVgtREYjRGlzdHJpdG8gRmVkZXJhbCNNWAotZ2VvI01YLURVUiNEdXJhbmdvI01YCi1nZW8jTVgtR1JPI0d1ZXJyZXJvI01YCi1nZW8jTVgtR1VBI0d1YW5hanVhdG8jTVgKLWdlbyNNWC1ISUQjSGlkYWxnbyNNWAotZ2VvI01YLUpBTCNKYWxpc2NvI01YCi1nZW8jTVgtTUVYI01leGljbyNNWAotZ2VvI01YLU1JQyNNaWNob2FjYW4jTVgKLWdlbyNNWC1NT1IjTW9yZWxvcyNNWAotZ2VvI01YLU5BWSNOYXlhcml0I01YCi1nZW8jTVgtTkxFI051ZXZvIExlb24jTVgKLWdlbyNNWC1PQVgjT2F4YWNhI01YCi1nZW8jTVgtUFVFI1B1ZWJsYSNNWAotZ2VvI01YLVFVRSNRdWVyZXRhcm8jTVgKLWdlbyNNWC1ST08jUXVpbnRhbmEgUm9vI01YCi1nZW8jTVgtU0lOI1NpbmFsb2EjTVgKLWdlbyNNWC1TTFAjU2FuIEx1aXMgUG90b3NpI01YCi1nZW8jTVgtU09OI1Nvbm9yYSNNWAotZ2VvI01YLVRBQiNUYWJhc2NvI01YCi1nZW8jTVgtVEFNI1RhbWF1bGlwYXMjTVgKLWdlbyNNWC1UTEEjVGxheGNhbGEjTVgKLWdlbyNNWC1WRVIjVmVyYWNydXojTVgKLWdlbyNNWC1ZVUMjWXVjYXRhbiNNWAotZ2VvI01YLVpBQyNaYWNhdGVjYXMjTVgKLWdlbyNNWSNNYWxheXNpYSMtLQotZ2VvI01aI01vemFtYmlxdWUjLS0KLWdlbyNOQSNOYW1pYmlhIy0tCi1nZW8jTkMjTmV3IENhbGVkb25pYSMtLQotZ2VvI05FI05pZ2VyIy0tCi1nZW8jTkYjTm9yZm9sayBJc2xhbmQjLS0KLWdlbyNORyNOaWdlcmlhIy0tCi1nZW8jTkctRkMjQWJ1amEgQ2FwaXRhbCBUZXJyaXRvcnkjTkcKLWdlbyNORy1BQiNBYmlhI05HCi1nZW8jTkctQUQjQWRhbWF3YSNORwotZ2VvI05HLUFLI0Frd2EgSWJvbSNORwotZ2VvI05HLUFOI0FuYW1icmEjTkcKLWdlbyNORy1CQSNCYXVjaGkjTkcKLWdlbyNORy1CWSNCYXllbHNhI05HCi1nZW8jTkctQkUjQmVudWUjTkcKLWdlbyNORy1CTyNCb3JubyNORwotZ2VvI05HLUNSI0Nyb3NzIFJpdmVyI05HCi1nZW8jTkctREUjRGVsdGEjTkcKLWdlbyNORy1FQiNFYm9ueWkjTkcKLWdlbyNORy1FRCNFZG8jTkcKLWdlbyNORy1FSyNFa2l0aSNORwotZ2VvI05HLUVOI0VudWd1I05HCi1nZW8jTkctR08jR29tYmUjTkcKLWdlbyNORy1JTSNJbW8jTkcKLWdlbyNORy1KSSNKaWdhd2EjTkcKLWdlbyNORy1LRCNLYWR1bmEjTkcKLWdlbyNORy1LTiNLYW5vI05HCi1nZW8jTkctS1QjS2F0c2luYSNORwotZ2VvI05HLUtFI0tlYmJpI05HCi1nZW8jTkctS08jS29naSNORwotZ2VvI05HLUtXI0t3YXJhI05HCi1nZW8jTkctTEEjTGFnb3MjTkcKLWdlbyNORy1OQSNOYXNzYXJhd2EjTkcKLWdlbyNORy1OSSNOaWdlciNORwotZ2VvI05HLU9HI09ndW4jTkcKLWdlbyNORy1PTiNPbmRvI05HCi1nZW8jTkctT1MjT3N1biNORwotZ2VvI05HLU9ZI095byNORwotZ2VvI05HLVBMI1BsYXRlYXUjTkcKLWdlbyNORy1SSSNSaXZlcnMjTkcKLWdlbyNORy1TTyNTb2tvdG8jTkcKLWdlbyNORy1UQSNUYXJhYmEjTkcKLWdlbyNORy1ZTyNZb2JlI05HCi1nZW8jTkctWkEjWmFtZmFyYSNORwotZ2VvI05JI05pY2FyYWd1YSMtLQotZ2VvI05MI05ldGhlcmxhbmRzIy0tCi1nZW8jTk8jTm9yd2F5Iy0tCi1nZW8jTk8tMDEjw5hzdGZvbGQjTk8KLWdlbyNOTy0wMiNBa2Vyc2h1cyNOTwotZ2VvI05PLTAzI09zbG8jTk8KLWdlbyNOTy0wNCNIZWRtYXJrI05PCi1nZW8jTk8tMDUjT3BwbGFuZCNOTwotZ2VvI05PLTA2I0J1c2tlcnVkI05PCi1nZW8jTk8tMDcjVmVzdGZvbGQjTk8KLWdlbyNOTy0wOCNUZWxlbWFyayNOTwotZ2VvI05PLTA5I0F1c3QtQWdkZXIjTk8KLWdlbyNOTy0xMCNWZXN0LUFnZGVyI05PCi1nZW8jTk8tMTEjUm9nYWxhbmQjTk8KLWdlbyNOTy0xMiNOb3JkYWxhbmQjTk8KLWdlbyNOTy0xNCNTb2duIE9nIEZqb3JkYW5lI05PCi1nZW8jTk8tMTUjTcO4cmUgT2cgUm9tc2RhbCNOTwotZ2VvI05PLTE2I1PDuHItVHLDuG5kZWxhZyNOTwotZ2VvI05PLTE3I05vcmQtVHLDuG5kZWxhZyNOTwotZ2VvI05PLTE4I05vcmRsYW5kI05PCi1nZW8jTk8tMTkjVHJvbXMjTk8KLWdlbyNOTy0yMCNGaW5ubWFyayNOTwotZ2VvI05QI05lcGFsIy0tCi1nZW8jTlIjTmF1cnUjLS0KLWdlbyNOVSNOaXVlIy0tCi1nZW8jTlojTmV3IFplYWxhbmQjLS0KLWdlbyNOWi1BVUsjQXVja2xhbmQjTlotTgotZ2VvI05aLUJPUCNCYXkgT2YgUGxlbnR5I05aLU4KLWdlbyNOWi1DQU4jQ2FudGVyYnVyeSNOWi1TCi1nZW8jTlotR0lTI0dpc2Jvcm5lI05aLU4KLWdlbyNOWi1IS0IjSGF3a2VzJ1MgQmF5I05aLU4KLWdlbyNOWi1NQkgjTWFybGJvcm91Z2gjTlotUwotZ2VvI05aLU1XVCNNYW5hd2F0dS1XYW5nYW51aSNOWi1OCi1nZW8jTlotTiNOb3J0aCBJc2xhbmQjTloKLWdlbyNOWi1OU04jTmVsc29uI05aLVMKLWdlbyNOWi1OVEwjTm9ydGhsYW5kI05aLU4KLWdlbyNOWi1PVEEjT3RhZ28jTlotUwotZ2VvI05aLVMjU291dGggSXNsYW5kI05aCi1nZW8jTlotU1RMI1NvdXRobGFuZCNOWi1TCi1nZW8jTlotVEFTI1Rhc21hbiNOWi1TCi1nZW8jTlotVEtJI1RhcmFuYWtpI05aLU4KLWdlbyNOWi1XR04jV2VsbGluZ3RvbiNOWi1OCi1nZW8jTlotV0tPI1dhaWthdG8jTlotTgotZ2VvI05aLVdUQyNXZXN0IENvYXN0I05aLVMKLWdlbyNPTSNPbWFuIy0tCi1nZW8jUEEjUGFuYW1hIy0tCi1nZW8jUEUjUGVydSMtLQotZ2VvI1BGI0ZyZW5jaCBQb2x5bmVzaWEjLS0KLWdlbyNQRyNQYXB1YSBOZXcgR3VpbmVhIy0tCi1nZW8jUEgjUGhpbGlwcGluZXMjLS0KLWdlbyNQSyNQYWtpc3RhbiMtLQotZ2VvI1BMI1BvbGFuZCMtLQotZ2VvI1BMLURTI0RvbG5vxZtsxIVza2llI1BMCi1nZW8jUEwtS1AjS3VqYXdza28tcG9tb3Jza2llI1BMCi1nZW8jUEwtTFUjTHViZWxza2llI1BMCi1nZW8jUEwtTEIjTHVidXNraWUjUEwKLWdlbyNQTC1MRCPFgcOzZHpraWUjUEwKLWdlbyNQTC1NQSNNYcWCb3BvbHNraWUjUEwKLWdlbyNQTC1NWiNNYXpvd2llY2tpZSNQTAotZ2VvI1BMLU9QI09wb2xza2llI1BMCi1nZW8jUEwtUEsjUG9ka2FycGFja2llI1BMCi1nZW8jUEwtUEQjUG9kbGFza2llI1BMCi1nZW8jUEwtUE0jUG9tb3Jza2llI1BMCi1nZW8jUEwtU0wjxZpsxIVza2llI1BMCi1nZW8jUEwtU0sjxZp3acSZdG9rcnp5c2tpZSNQTAotZ2VvI1BMLVdOI1dhcm1pxYRza28tbWF6dXJza2llI1BMCi1nZW8jUEwtV1AjV2llbGtvcG9sc2tpZSNQTAotZ2VvI1BMLVpQI1phY2hvZG5pb3BvbW9yc2tpZSNQTAotZ2VvI1BNI1N0IFBpZXJyZSBBbmQgTWlxdWVsb24jLS0KLWdlbyNQTiNQaXRjYWlybiMtLQotZ2VvI1BSI1B1ZXJ0byBSaWNvIy0tCi1nZW8jUFMjIlBhbGVzdGluaWFuIFRlcnJpdG9yeSwgT2NjdXBpZWQiIy0tCi1nZW8jUFQjUG9ydHVnYWwjLS0KLWdlbyNQVyNQYWxhdSMtLQotZ2VvI1BZI1BhcmFndWF5Iy0tCi1nZW8jUUEjUWF0YXIjLS0KLWdlbyNSRSNSZXVuaW9uIy0tCi1nZW8jUk8jUm9tYW5pYSMtLQotZ2VvI1JPLUIjQnVjdXJlxZ90aSNSTwotZ2VvI1JPLUFCI0FsYmEjUk8KLWdlbyNSTy1BUiNBcmFkI1JPCi1nZW8jUk8tQUcjQXJnZcWfI1JPCi1nZW8jUk8tQkMjQmFjxIN1I1JPCi1nZW8jUk8tQkgjQmlob3IjUk8KLWdlbyNSTy1CTiNCaXN0cmnFo2EtTsSDc8SDdWQjUk8KLWdlbyNSTy1CVCNCb3RvxZ9hbmkjUk8KLWdlbyNSTy1CViNCcmHFn292I1JPCi1nZW8jUk8tQlIjQnLEg2lsYSNSTwotZ2VvI1JPLUJaI0J1esSDdSNSTwotZ2VvI1JPLUNTI0NhcmHFny1TZXZlcmluI1JPCi1nZW8jUk8tQ0wjQ8SDbMSDcmHFn2kjUk8KLWdlbyNSTy1DSiNDbHVqI1JPCi1nZW8jUk8tQ1QjQ29uc3RhbsWjYSNSTwotZ2VvI1JPLUNWI0NvdmFzbmEjUk8KLWdlbyNSTy1EQiNEw6JtYm92acWjYSNSTwotZ2VvI1JPLURKI0RvbGojUk8KLWdlbyNSTy1HTCNHYWxhxaNpI1JPCi1nZW8jUk8tR1IjR2l1cmdpdSNSTwotZ2VvI1JPLUdKI0dvcmojUk8KLWdlbyNSTy1IUiNIYXJnaGl0YSNSTwotZ2VvI1JPLUhEI0h1bmVkb2FyYSNSTwotZ2VvI1JPLUlMI0lhbG9tacWjYSNSTwotZ2VvI1JPLUlTI0lhxZ9pI1JPCi1nZW8jUk8tTU0jTWFyYW11cmXFnyNSTwotZ2VvI1JPLU1II01laGVkaW7Fo2kjUk8KLWdlbyNSTy1NUyNNdXJlxZ8jUk8KLWdlbyNSTy1OVCNOZWFtxaMjUk8KLWdlbyNSTy1PVCNPbHQjUk8KLWdlbyNSTy1QSCNQcmFob3ZhI1JPCi1nZW8jUk8tU00jU2F0dSBNYXJlI1JPCi1nZW8jUk8tU0ojU8SDbGFqI1JPCi1nZW8jUk8tU0IjU2liaXUjUk8KLWdlbyNSTy1TViNTdWNlYXZhI1JPCi1nZW8jUk8tVFIjVGVsZW9ybWFuI1JPCi1nZW8jUk8tVE0jVGltacWfI1JPCi1nZW8jUk8tVEwjVHVsY2VhI1JPCi1nZW8jUk8tVlMjVmFzbHVpI1JPCi1nZW8jUk8tVkwjVsOibGNlYSNSTwotZ2VvI1JPLVZOI1ZyYW5jZWEjUk8KLWdlbyNSVSNSdXNzaWFuIEZlZGVyYXRpb24jLS0KLWdlbyNSVS1BRCMiQWR5Z2VqYSwgUmVzcHVibGlrYSIjUlUKLWdlbyNSVS1BTCMiQWx0YWosIFJlc3B1Ymxpa2EiI1JVCi1nZW8jUlUtQkEjIkJhxaFrb3J0b3N0YW4sIFJlc3B1Ymxpa2EiI1JVCi1nZW8jUlUtQlUjIkJ1cmphdGlqYSwgUmVzcHVibGlrYSIjUlUKLWdlbyNSVS1DRSPEjGXEjWVuc2thamEgUmVzcHVibGlrYSNSVQotZ2VvI1JVLUNVI8SMdXZhxaFza2FqYSBSZXNwdWJsaWthI1JVCi1nZW8jUlUtREEjIkRhZ2VzdGFuLCBSZXNwdWJsaWthIiNSVQotZ2VvI1JVLUlOI0luZ3XFoXNrYWphIFJlc3B1Ymxpa2EgW1Jlc3B1Ymxpa2EgSW5ndcWhZXRpamFdI1JVCi1nZW8jUlUtS0IjS2FiYXJkaW5vLUJhbGthcnNrYWphIFJlc3B1Ymxpa2EjUlUKLWdlbyNSVS1LTCMiS2FsbXlraWphLCBSZXNwdWJsaWthIiNSVQotZ2VvI1JVLUtDI0thcmHEjWFqZXZvLcSMZXJrZXNza2FqYSBSZXNwdWJsaWthI1JVCi1nZW8jUlUtS1IjIkthcmVsaWphLCBSZXNwdWJsaWthIiNSVQotZ2VvI1JVLUtLIyJIYWthc2lqYSwgUmVzcHVibGlrYSIjUlUKLWdlbyNSVS1LTyMiS29taSwgUmVzcHVibGlrYSIjUlUKLWdlbyNSVS1NRSMiTWFyaWogw4hsLCBSZXNwdWJsaWthIiNSVQotZ2VvI1JVLU1PIyJNb3Jkb3ZpamEsIFJlc3B1Ymxpa2EiI1JVCi1nZW8jUlUtU0EjIlNhaGEsIFJlc3B1Ymxpa2EgW0pha3V0aWphXSIjUlUKLWdlbyNSVS1TRSMiU2V2ZXJuYWphIE9zZXRpamEsIFJlc3B1Ymxpa2EgW0FsYW5pamFdIFtSZXNwdWJsaWthIFNldmVybmFqYSBPc2V0aWphLUFsYW5pamFdIiNSVQotZ2VvI1JVLVRBIyJUYXRhcnN0YW4sIFJlc3B1Ymxpa2EiI1JVCi1nZW8jUlUtVFkjIlR5dmEsIFJlc3B1Ymxpa2EgW1R1dmFdIiNSVQotZ2VvI1JVLVVEI1VkbXVydHNrYWphIFJlc3B1Ymxpa2EjUlUKLWdlbyNSVS1BTFQjQWx0YWpza2lqIGtyYWojUlUKLWdlbyNSVS1LSEEjSGFiYXJvdnNraWoga3JhaiNSVQotZ2VvI1JVLUtEQSNLcmFzbm9kYXJza2lqIGtyYWojUlUKLWdlbyNSVS1LWUEjS3Jhc25vamFyc2tpaiBrcmFqI1JVCi1nZW8jUlUtUFJJI1ByaW1vcnNraWoga3JhaiNSVQotZ2VvI1JVLVNUQSNTdGF2cm9wb2wnc2tpaiBrcmFqI1JVCi1nZW8jUlUtQU1VI0FtdXJza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtQVJLI0FyaGFuZ2VsJ3NrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1BU1QjQXN0cmFoYW5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtQkVMI0JlbGdvcm9kc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUJSWSNCcmphbnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1DSEUjxIxlbGphYmluc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUNISSPEjGl0aW5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtSVJLI0lya3V0c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUlWQSNJdmFub3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS0dEI0thbGluaW5ncmFkc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUtMVSNLYWx1xb5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS0FNI0thbcSNYXRza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS0VNI0tlbWVyb3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS0lSI0tpcm92c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUtPUyNLb3N0cm9tc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUtHTiNLdXJnYW5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS1JTI0t1cnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1MRU4jTGVuaW5ncmFkc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUxJUCNMaXBldHNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1NQUcjTWFnYWRhbnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1NT1MjTW9za292c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLU1VUiNNdXJtYW5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtTklaI05pxb5lZ29yb2Rza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtTkdSI05vdmdvcm9kc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLU5WUyNOb3Zvc2liaXJza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtT01TI09tc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLU9SRSNPcmVuYnVyZ3NrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1PUkwjT3Jsb3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtUE5aI1BlbnplbnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1QRVIjUGVybXNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1QU0sjUHNrb3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtUk9TI1Jvc3RvdnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1SWUEjUmphemFuc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVNBSyNTYWhhbGluc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVNBTSNTYW1hcnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1TQVIjU2FyYXRvdnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1TTU8jU21vbGVuc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVNWRSNTdmVyZGxvdnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1UQU0jVGFtYm92c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVRPTSNUb21za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVFVMI1R1bCdza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVFZFI1R2ZXJza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVFlVI1RqdW1lbnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1VTFkjVWwnamFub3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVkxBI1ZsYWRpbWlyc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVZHRyNWb2xnb2dyYWRza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVkxHI1ZvbG9nb2Rza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVk9SI1Zvcm9uZcW+c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVlBUiNKYXJvc2xhdnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1NT1cjTW9za3ZhI1JVCi1nZW8jUlUtU1BFI1Nhbmt0LVBldGVyYnVyZyNSVQotZ2VvI1JVLVlFViNFdnJlanNrYWphIGF2dG9ub21uYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1BR0IjQWdpbnNraWogQnVyamF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnI1JVCi1nZW8jUlUtQ0hVI8SMdWtvdHNraWogYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLUVWRSPDiHZlbmtpanNraWogYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLUtITSNIYW50eS1NYW5zaWpza2lqIGF2dG9ub21ueWogb2tydWcjUlUKLWdlbyNSVS1LT1AjS29taS1QZXJtamF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnI1JVCi1nZW8jUlUtS09SI0tvcmpha3NraWogYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLU5FTiNOZW5ldHNraWogYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLVRBWSNUYWpteXJza2lqIChEb2xnYW5vLU5lbmV0c2tpaikgYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLVVPQiNVc3QnLU9yZHluc2tpaiBCdXJqYXRza2lqIGF2dG9ub21ueWogb2tydWcjUlUKLWdlbyNSVS1ZQU4jSmFtYWxvLU5lbmV0c2tpaiBhdnRvbm9tbnlqIG9rcnVnI1JVCi1nZW8jUlcjUndhbmRhIy0tCi1nZW8jU0EjU2F1ZGkgQXJhYmlhIy0tCi1nZW8jU0IjU29sb21vbiBJc2xhbmRzIy0tCi1nZW8jU0MjU2V5Y2hlbGxlcyMtLQotZ2VvI1NEI1N1ZGFuIy0tCi1nZW8jU0UjU3dlZGVuIy0tCi1nZW8jU0UtQUIjU3RvY2tob2xtcyBMw6RuI1NFCi1nZW8jU0UtQUMjVsOkc3RlcmJvdHRlbnMgTMOkbiNTRQotZ2VvI1NFLUJEI05vcnJib3R0ZW5zIEzDpG4jU0UKLWdlbyNTRS1DI1VwcHNhbGEgTMOkbiNTRQotZ2VvI1NFLUQjU8O2ZGVybWFubGFuZHMgTMOkbiNTRQotZ2VvI1NFLUUjw5ZzdGVyZ8O2dGxhbmRzIEzDpG4jU0UKLWdlbyNTRS1GI0rDtm5rw7ZwaW5ncyBMw6RuI1NFCi1nZW8jU0UtRyNLcm9ub2JvcmdzIEzDpG4jU0UKLWdlbyNTRS1II0thbG1hciBMw6RuI1NFCi1nZW8jU0UtSSNHb3RsYW5kcyBMw6RuI1NFCi1nZW8jU0UtSyNCbGVraW5nZSBMw6RuI1NFCi1nZW8jU0UtTSNTa8OlbmUgTMOkbiNTRQotZ2VvI1NFLU4jSGFsbGFuZHMgTMOkbiNTRQotZ2VvI1NFLU8jVsOkc3RyYSBHw7Z0YWxhbmRzIEzDpG4jU0UKLWdlbyNTRS1TI1bDpHJtbGFuZHMgTMOkbiNTRQotZ2VvI1NFLVQjw5ZyZWJybyBMw6RuI1NFCi1nZW8jU0UtVSNWw6RzdG1hbmxhbmRzIEzDpG4jU0UKLWdlbyNTRS1XI0RhbGFybmVzIEzDpG4jU0UKLWdlbyNTRS1YI0fDpHZsZWJvcmdzIEzDpG4jU0UKLWdlbyNTRS1ZI1bDpHN0ZXJub3JybGFuZHMgTMOkbiNTRQotZ2VvI1NFLVojSsOkbXRsYW5kcyBMw6RuI1NFCi1nZW8jU0cjU2luZ2Fwb3JlIy0tCi1nZW8jU0gjU3QgSGVsZW5hIy0tCi1nZW8jU0kjU2xvdmVuaWEjLS0KLWdlbyNTSiNTdmFsYmFyZCBBbmQgSmFuIE1heWVuIy0tCi1nZW8jU0sjU2xvdmFraWEjLS0KLWdlbyNTTCNTaWVycmEgTGVvbmUjLS0KLWdlbyNTTSNTYW4gTWFyaW5vIy0tCi1nZW8jU04jU2VuZWdhbCMtLQotZ2VvI1NPI1NvbWFsaWEjLS0KLWdlbyNTUiNTdXJpbmFtZSMtLQotZ2VvI1NUI1NhbyBUb21lIEFuZCBQcmluY2lwZSMtLQotZ2VvI1NWI0VsIFNhbHZhZG9yIy0tCi1nZW8jU1kjU3lyaWFuIEFyYWIgUmVwdWJsaWMjLS0KLWdlbyNTWiNTd2F6aWxhbmQjLS0KLWdlbyNUQyNUdXJrcyBBbmQgQ2FpY29zIElzbGFuZHMjLS0KLWdlbyNURCNDaGFkIy0tCi1nZW8jVEYjRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIy0tCi1nZW8jVEcjVG9nbyMtLQotZ2VvI1RII1RoYWlsYW5kIy0tCi1nZW8jVEojVGFqaWtpc3RhbiMtLQotZ2VvI1RNI1R1cmttZW5pc3RhbiMtLQotZ2VvI1ROI1R1bmlzaWEjLS0KLWdlbyNUTyNUb25nYSMtLQotZ2VvI1RQI0Vhc3QgVGltb3IjLS0KLWdlbyNUUiNUdXJrZXkjLS0KLWdlbyNUUi0wMSNBZGFuYSNUUgotZ2VvI1RSLTAyI0FkxLF5YW1hbiNUUgotZ2VvI1RSLTAzI0FmeW9uI1RSCi1nZW8jVFItMDQjQcSfcsSxI1RSCi1nZW8jVFItMDUjQW1hc3lhI1RSCi1nZW8jVFItMDYjQW5rYXJhI1RSCi1nZW8jVFItMDcjQW50YWx5YSNUUgotZ2VvI1RSLTA4I0FydHZpbiNUUgotZ2VvI1RSLTA5I0F5ZMSxbiNUUgotZ2VvI1RSLTEwI0JhbMSxa2VzaXIjVFIKLWdlbyNUUi0xMSNCaWxlY2lrI1RSCi1nZW8jVFItMTIjQmluZ8O2bCNUUgotZ2VvI1RSLTEzI0JpdGxpcyNUUgotZ2VvI1RSLTE0I0JvbHUjVFIKLWdlbyNUUi0xNSNCdXJkdXIjVFIKLWdlbyNUUi0xNiNCdXJzYSNUUgotZ2VvI1RSLTE3I8OHYW5ha2thbGUjVFIKLWdlbyNUUi0xOCPDh2Fua8SxcsSxI1RSCi1nZW8jVFItMTkjw4dvcnVtI1RSCi1nZW8jVFItMjAjRGVuaXpsaSNUUgotZ2VvI1RSLTIxI0RpeWFyYmFrxLFyI1RSCi1nZW8jVFItMjIjRWRpcm5lI1RSCi1nZW8jVFItMjMjRWxhesSxZyNUUgotZ2VvI1RSLTI0I0VyemluY2FuI1RSCi1nZW8jVFItMjUjRXJ6dXJ1bSNUUgotZ2VvI1RSLTI2I0Vza2nFn2VoaXIjVFIKLWdlbyNUUi0yNyNHYXppYW50ZXAjVFIKLWdlbyNUUi0yOCNHaXJlc3VuI1RSCi1nZW8jVFItMjkjR8O8bcO8xZ9oYW5lI1RSCi1nZW8jVFItMzAjSGFra8OicmkjVFIKLWdlbyNUUi0zMSNIYXRheSNUUgotZ2VvI1RSLTMyI0lzcGFydGEjVFIKLWdlbyNUUi0zMyPEsMOnZWwjVFIKLWdlbyNUUi0zNCPEsHN0YW5idWwjVFIKLWdlbyNUUi0zNSPEsHptaXIjVFIKLWdlbyNUUi0zNiNLYXJzI1RSCi1nZW8jVFItMzcjS2FzdGFtb251I1RSCi1nZW8jVFItMzgjS2F5c2VyaSNUUgotZ2VvI1RSLTM5I0vEsXJrbGFyZWxpI1RSCi1nZW8jVFItNDAjS8SxcsWfZWhpciNUUgotZ2VvI1RSLTQxI0tvY2FlbGkjVFIKLWdlbyNUUi00MiNLb255YSNUUgotZ2VvI1RSLTQzI0vDvHRhaHlhI1RSCi1nZW8jVFItNDQjTWFsYXR5YSNUUgotZ2VvI1RSLTQ1I01hbmlzYSNUUgotZ2VvI1RSLTQ2I0thaHJhbWFubWFyYcWfI1RSCi1nZW8jVFItNDcjTWFyZGluI1RSCi1nZW8jVFItNDgjTXXEn2xhI1RSCi1nZW8jVFItNDkjTXXFnyNUUgotZ2VvI1RSLTUwI05ldsWfZWhpciNUUgotZ2VvI1RSLTUxI05pxJ9kZSNUUgotZ2VvI1RSLTUyI09yZHUjVFIKLWdlbyNUUi01MyNSaXplI1RSCi1nZW8jVFItNTQjU2FrYXJ5YSNUUgotZ2VvI1RSLTU1I1NhbXN1biNUUgotZ2VvI1RSLTU2I1NpaXJ0I1RSCi1nZW8jVFItNTcjU2lub3AjVFIKLWdlbyNUUi01OCNTaXZhcyNUUgotZ2VvI1RSLTU5I1Rla2lyZGHEnyNUUgotZ2VvI1RSLTYwI1Rva2F0I1RSCi1nZW8jVFItNjEjVHJhYnpvbiNUUgotZ2VvI1RSLTYyI1R1bmNlbGkjVFIKLWdlbyNUUi02MyPFnmFubMSxdXJmYSNUUgotZ2VvI1RSLTY0I1XFn2FrI1RSCi1nZW8jVFItNjUjVmFuI1RSCi1nZW8jVFItNjYjWW96Z2F0I1RSCi1nZW8jVFItNjcjWm9uZ3VsZGFrI1RSCi1nZW8jVFItNjgjQWtzYXJheSNUUgotZ2VvI1RSLTY5I0JheWJ1cnQjVFIKLWdlbyNUUi03MCNLYXJhbWFuI1RSCi1nZW8jVFItNzEjS8SxcsSxa2thbGUjVFIKLWdlbyNUUi03MiNCYXRtYW4jVFIKLWdlbyNUUi03MyPFnsSxcm5hayNUUgotZ2VvI1RSLTc0I0JhcnTEsW4jVFIKLWdlbyNUUi03NSNBcmRhaGFuI1RSCi1nZW8jVFItNzYjScSfZMSxciNUUgotZ2VvI1RSLTc3I1lhbG92YSNUUgotZ2VvI1RSLTc4I0thcmFiw7xrI1RSCi1nZW8jVFItNzkjS2lsaXMjVFIKLWdlbyNUUi04MCNPc21hbml5ZSNUUgotZ2VvI1RUI1RyaW5pZGFkIEFuZCBUb2JhZ28jLS0KLWdlbyNUViNUdXZhbHUjLS0KLWdlbyNUVyMiVGFpd2FuLCBQcm92aW5jZSBPZiBDaGluYSIjLS0KLWdlbyNUWiMiVGFuemFuaWEsIFVuaXRlZCBSZXB1YmxpYyBvZiIjLS0KLWdlbyNVQSNVa3JhaW5lIy0tCi1nZW8jVUcjVWdhbmRhIy0tCi1nZW8jVU0jVVMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyMtLQotZ2VvI1VNLTY3I0pvaG5zdG9uIEF0b2xsI1VNCi1nZW8jVU0tNzEjTWlkd2F5IElzbGFuZHMjVU0KLWdlbyNVTS03NiNOYXZhc3NhIElzbGFuZCNVTQotZ2VvI1VNLTc5I1dha2UgSXNsYW5kI1VNCi1nZW8jVU0tODEjQmFrZXIgSXNsYW5kI1VNCi1nZW8jVU0tODQjSG93bGFuZCBJc2xhbmQjVU0KLWdlbyNVTS04NiNKYXJ2aXMgSXNsYW5kI1VNCi1nZW8jVU0tODkjS2luZ21hbiBSZWVmI1VNCi1nZW8jVU0tOTUjUGFsbXlyYSBBdG9sbCNVTQotZ2VvI1VTI1VuaXRlZCBTdGF0ZXMjLS0KLWdlbyNVUy1BSyNBbGFza2EjVVMKLWdlbyNVUy1BTCNBbGFiYW1hI1VTCi1nZW8jVVMtQVIjQXJrYW5zYXMjVVMKLWdlbyNVUy1BUyNBbWVyaWNhbiBTYW1vYSNVUwotZ2VvI1VTLUFaI0FyaXpvbmEjVVMKLWdlbyNVUy1DQSNDYWxpZm9ybmlhI1VTCi1nZW8jVVMtQ08jQ29sb3JhZG8jVVMKLWdlbyNVUy1DVCNDb25uZWN0aWN1dCNVUwotZ2VvI1VTLURDI0Rpc3RyaWN0IE9mIENvbHVtYmlhI1VTCi1nZW8jVVMtREUjRGVsYXdhcmUjVVMKLWdlbyNVUy1GTCNGbG9yaWRhI1VTCi1nZW8jVVMtR0EjR2VvcmdpYSNVUwotZ2VvI1VTLUdVI0d1YW0jVVMKLWdlbyNVUy1ISSNIYXdhaWkjVVMKLWdlbyNVUy1JQSNJb3dhI1VTCi1nZW8jVVMtSUQjSWRhaG8jVVMKLWdlbyNVUy1JTCNJbGxpbm9pcyNVUwotZ2VvI1VTLUlOI0luZGlhbmEjVVMKLWdlbyNVUy1LUyNLYW5zYXMjVVMKLWdlbyNVUy1LWSNLZW50dWNreSNVUwotZ2VvI1VTLUxBI0xvdWlzaWFuYSNVUwotZ2VvI1VTLU1BI01hc3NhY2h1c2V0dHMjVVMKLWdlbyNVUy1NRCNNYXJ5bGFuZCNVUwotZ2VvI1VTLU1FI01haW5lI1VTCi1nZW8jVVMtTUkjTWljaGlnYW4jVVMKLWdlbyNVUy1NTiNNaW5uZXNvdGEjVVMKLWdlbyNVUy1NTyNNaXNzb3VyaSNVUwotZ2VvI1VTLU1QI05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyNVUwotZ2VvI1VTLU1TI01pc3Npc3NpcHBpI1VTCi1nZW8jVVMtTVQjTW9udGFuYSNVUwotZ2VvI1VTLU5DI05vcnRoIENhcm9saW5hI1VTCi1nZW8jVVMtTkQjTm9ydGggRGFrb3RhI1VTCi1nZW8jVVMtTkUjTmVicmFza2EjVVMKLWdlbyNVUy1OSCNOZXcgSGFtcHNoaXJlI1VTCi1nZW8jVVMtTkojTmV3IEplcnNleSNVUwotZ2VvI1VTLU5NI05ldyBNZXhpY28jVVMKLWdlbyNVUy1OViNOZXZhZGEjVVMKLWdlbyNVUy1OWSNOZXcgWW9yayNVUwotZ2VvI1VTLU9II09oaW8jVVMKLWdlbyNVUy1PSyNPa2xhaG9tYSNVUwotZ2VvI1VTLU9SI09yZWdvbiNVUwotZ2VvI1VTLVBBI1Blbm5zeWx2YW5pYSNVUwotZ2VvI1VTLVBSI1B1ZXJ0byBSaWNvI1VTCi1nZW8jVVMtUkkjUmhvZGUgSXNsYW5kI1VTCi1nZW8jVVMtU0MjU291dGggQ2Fyb2xpbmEjVVMKLWdlbyNVUy1TRCNTb3V0aCBEYWtvdGEjVVMKLWdlbyNVUy1UTiNUZW5uZXNzZWUjVVMKLWdlbyNVUy1UWCNUZXhhcyNVUwotZ2VvI1VTLVVNI1UuUy4gTWlub3IgT3V0bHlpbmcgSXNsYW5kcyNVUwotZ2VvI1VTLVVUI1V0YWgjVVMKLWdlbyNVUy1WQSNWaXJnaW5pYSNVUwotZ2VvI1VTLVZJI1ZpcmdpbiBJc2xhbmRzIE9mIFRoZSBVLlMuI1VTCi1nZW8jVVMtVlQjVmVybW9udCNVUwotZ2VvI1VTLVdBI1dhc2hpbmd0b24jVVMKLWdlbyNVUy1XSSNXaXNjb25zaW4jVVMKLWdlbyNVUy1XViNXZXN0IFZpcmdpbmlhI1VTCi1nZW8jVVMtV1kjV3lvbWluZyNVUwotZ2VvI1VZI1VydWd1YXkjLS0KLWdlbyNVWiNVemJla2lzdGFuIy0tCi1nZW8jVkEjVmF0aWNhbiBDaXR5IFN0YXRlIy0tCi1nZW8jVkMjU3QgVmluY2VudCBBbmQgR3JlbmFkaW5lcyMtLQotZ2VvI1ZFI1ZlbmV6dWVsYSMtLQotZ2VvI1ZHIyJWaXJnaW4gSXNsYW5kcywgQnJpdGlzaCIjLS0KLWdlbyNWSSNVbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzIy0tCi1nZW8jVk4jVmlldCBOYW0jLS0KLWdlbyNWTi0wMSNMYWkgQ2hhdSNWTgotZ2VvI1ZOLTAyI0xhbyBDYWkjVk4KLWdlbyNWTi0wMyNIYSBHaWFuZyNWTgotZ2VvI1ZOLTA0I0NhbyBCYW5nI1ZOCi1nZW8jVk4tMDUjU29uIExhI1ZOCi1nZW8jVk4tMDYjWWVuIEJhaSNWTgotZ2VvI1ZOLTA3I1R1eWVuIFF1YW5nI1ZOCi1nZW8jVk4tMDkjTGFuZyBTb24jVk4KLWdlbyNWTi0xMyNRdWFuZyBOaW5oI1ZOCi1nZW8jVk4tMTQjSG9hIEJpbmgjVk4KLWdlbyNWTi0xNSNIYSBUYXkjVk4KLWdlbyNWTi0xOCNOaW5oIEJpbmgjVk4KLWdlbyNWTi0yMCNUaGFpIEJpbmgjVk4KLWdlbyNWTi0yMSNUaGFuaCBIb2EjVk4KLWdlbyNWTi0yMiNOZ2hlIEFuI1ZOCi1nZW8jVk4tMjMjSGEgVGluaCNWTgotZ2VvI1ZOLTI0I1F1YW5nIEJpbmgjVk4KLWdlbyNWTi0yNSNRdWFuZyBUcmkjVk4KLWdlbyNWTi0yNiNUaHVhIFRoaWVuLUh1ZSNWTgotZ2VvI1ZOLTI3I1F1YW5nIE5hbSNWTgotZ2VvI1ZOLTI4I0tvbiBUdW0jVk4KLWdlbyNWTi0yOSNRdWFuZyBOZ2FpI1ZOCi1nZW8jVk4tMzAjR2lhIExhaSNWTgotZ2VvI1ZOLTMxI0JpbmggRGluaCNWTgotZ2VvI1ZOLTMyI1BodSBZZW4jVk4KLWdlbyNWTi0zMyNEYWMgTGFjI1ZOCi1nZW8jVk4tMzQjS2hhbmggSG9hI1ZOCi1nZW8jVk4tMzUjTGFtIERvbmcjVk4KLWdlbyNWTi0zNiNOaW5oIFRodWFuI1ZOCi1nZW8jVk4tMzcjVGF5IE5pbmgjVk4KLWdlbyNWTi0zOSNEb25nIE5haSNWTgotZ2VvI1ZOLTQwI0JpbmggVGh1YW4jVk4KLWdlbyNWTi00MSNMb25nIEFuI1ZOCi1nZW8jVk4tNDMjQmEgUmlhIC0gVnVuZyBUYXUjVk4KLWdlbyNWTi00NCNBbiBHaWFuZyNWTgotZ2VvI1ZOLTQ1I0RvbmcgVGhhcCNWTgotZ2VvI1ZOLTQ2I1RpZW4gR2lhbmcjVk4KLWdlbyNWTi00NyNLaWVuIEdpYW5nI1ZOCi1nZW8jVk4tNDgjQ2FuIFRobyNWTgotZ2VvI1ZOLTQ5I1ZpbmggTG9uZyNWTgotZ2VvI1ZOLTUwI0JlbiBUcmUjVk4KLWdlbyNWTi01MSNUcmEgVmluaCNWTgotZ2VvI1ZOLTUyI1NvYyBUcmFuZyNWTgotZ2VvI1ZOLTUzI0JhYyBDYW4jVk4KLWdlbyNWTi01NCNCYWMgR2lhbmcjVk4KLWdlbyNWTi01NSNCYWMgTGlldSNWTgotZ2VvI1ZOLTU2I0JhYyBOaW5oI1ZOCi1nZW8jVk4tNTcjQmluaCBEdW9uZyNWTgotZ2VvI1ZOLTU4I0JpbmggUGh1b2MjVk4KLWdlbyNWTi01OSNDYSBNYXUjVk4KLWdlbyNWTi02MCMiRGEgTmFuZywgdGhhbmggcGhvIiNWTgotZ2VvI1ZOLTYxI0hhaSBEdW9uZyNWTgotZ2VvI1ZOLTYyIyJIYWkgUGhvbmcsIHRoYW5oIHBobyIjVk4KLWdlbyNWTi02MyNIYSBOYW0jVk4KLWdlbyNWTi02NCMiSGEgTm9pLCB0aHUgZG8iI1ZOCi1nZW8jVk4tNjUjIkhvIENoaSBNaW5oLCB0aGFuaCBwbyBbU2FpIEdvbl0iI1ZOCi1nZW8jVk4tNjYjSHVuZyBZZW4jVk4KLWdlbyNWTi02NyNOYW0gRGluaCNWTgotZ2VvI1ZOLTY4I1BodSBUaG8jVk4KLWdlbyNWTi02OSNUaGFpIE5ndXllbiNWTgotZ2VvI1ZOLTcwI1ZpbmggUGh1YyNWTgotZ2VvI1ZVI1ZhbnVhdHUjLS0KLWdlbyNXRiNXYWxsaXMgQW5kIEZ1dHVuYSBJc2xhbmRzIy0tCi1nZW8jV1MjU2Ftb2EjLS0KLWdlbyNZRSNZZW1lbiMtLQotZ2VvI1lUI01heW90dGUjLS0KLWdlbyNZVSNZdWdvc2xhdmlhIChGZWQgUmVwIE9mKSMtLQotZ2VvI1lVLUNHI0NybmEgR29yYSNZVQotZ2VvI1lVLVNSI1NyYmlqYSNZVQotZ2VvI1lVLUtNI0tvc292by1NZXRvaGlqYSNZVS1TUgotZ2VvI1lVLVZPI1ZvanZvZGluYSNZVS1TUgotZ2VvI1pBI1NvdXRoIEFmcmljYSMtLQotZ2VvI1pNI1phbWJpYSMtLQotZ2VvI1pXI1ppbWJhYndlIy0tCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS9uYWljcy1kYXRhLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL25haWNzLWRhdGEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDZmOTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL25haWNzLWRhdGEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTgxNCArMCwwIEBACi1uYWljcyMxMSNBZ3JpY3VsdHVyZSwgRm9yZXN0cnksIEZpc2hpbmcgYW5kIEh1bnRpbmcjMTEKLW5haWNzIzExMSNDcm9wIFByb2R1Y3Rpb24jMTEKLW5haWNzIzExMTEjT2lsc2VlZCBhbmQgR3JhaW4gRmFybWluZyMxMTEKLW5haWNzIzExMTExI1NveWJlYW4gRmFybWluZyMxMTExCi1uYWljcyMxMTExMiNPaWxzZWVkIChleGNlcHQgU295YmVhbikgRmFybWluZyMxMTExCi1uYWljcyMxMTExMyNEcnkgUGVhIGFuZCBCZWFuIEZhcm1pbmcjMTExMQotbmFpY3MjMTExMTQjV2hlYXQgRmFybWluZyMxMTExCi1uYWljcyMxMTExNSNDb3JuIEZhcm1pbmcjMTExMQotbmFpY3MjMTExMTYjUmljZSBGYXJtaW5nIzExMTEKLW5haWNzIzExMTE5I090aGVyIEdyYWluIEZhcm1pbmcjMTExMQotbmFpY3MjMTExMTkxI09pbHNlZWQgYW5kIEdyYWluIENvbWJpbmF0aW9uIEZhcm1pbmcjMTExMTkKLW5haWNzIzExMTE5OSNBbGwgT3RoZXIgR3JhaW4gRmFybWluZyMxMTExOQotbmFpY3MjMTExMiNWZWdldGFibGUgYW5kIE1lbG9uIEZhcm1pbmcjMTExCi1uYWljcyMxMTEyMSNWZWdldGFibGUgYW5kIE1lbG9uIEZhcm1pbmcjMTExMgotbmFpY3MjMTExMjExI1BvdGF0byBGYXJtaW5nIzExMTIxCi1uYWljcyMxMTEyMTkjT3RoZXIgVmVnZXRhYmxlIChleGNlcHQgUG90YXRvKSBhbmQgTWVsb24gRmFybWluZyMxMTEyMQotbmFpY3MjMTExMyNGcnVpdCBhbmQgVHJlZSBOdXQgRmFybWluZyMxMTEKLW5haWNzIzExMTMxI09yYW5nZSBHcm92ZXMjMTExMwotbmFpY3MjMTExMzIjQ2l0cnVzIChleGNlcHQgT3JhbmdlKSBHcm92ZXMjMTExMwotbmFpY3MjMTExMzMjTm9uY2l0cnVzIEZydWl0IGFuZCBUcmVlIE51dCBGYXJtaW5nIzExMTMKLW5haWNzIzExMTMzMSNBcHBsZSBPcmNoYXJkcyMxMTEzMwotbmFpY3MjMTExMzMyI0dyYXBlIFZpbmV5YXJkcyMxMTEzMwotbmFpY3MjMTExMzMzI1N0cmF3YmVycnkgRmFybWluZyMxMTEzMwotbmFpY3MjMTExMzM0I0JlcnJ5IChleGNlcHQgU3RyYXdiZXJyeSkgRmFybWluZyMxMTEzMwotbmFpY3MjMTExMzM1I1RyZWUgTnV0IEZhcm1pbmcjMTExMzMKLW5haWNzIzExMTMzNiNGcnVpdCBhbmQgVHJlZSBOdXQgQ29tYmluYXRpb24gRmFybWluZyMxMTEzMwotbmFpY3MjMTExMzM5I090aGVyIE5vbmNpdHJ1cyBGcnVpdCBGYXJtaW5nIzExMTMzCi1uYWljcyMxMTE0I0dyZWVuaG91c2UsIE51cnNlcnksIGFuZCBGbG9yaWN1bHR1cmUgUHJvZHVjdGlvbiMxMTEKLW5haWNzIzExMTQxI0Zvb2QgQ3JvcHMgR3Jvd24gVW5kZXIgQ292ZXIjMTExNAotbmFpY3MjMTExNDExI011c2hyb29tIFByb2R1Y3Rpb24jMTExNDEKLW5haWNzIzExMTQxOSNPdGhlciBGb29kIENyb3BzIEdyb3duIFVuZGVyIENvdmVyIzExMTQxCi1uYWljcyMxMTE0MiNOdXJzZXJ5IGFuZCBGbG9yaWN1bHR1cmUgUHJvZHVjdGlvbiMxMTE0Ci1uYWljcyMxMTE0MjEjTnVyc2VyeSBhbmQgVHJlZSBQcm9kdWN0aW9uIzExMTQyCi1uYWljcyMxMTE0MjIjRmxvcmljdWx0dXJlIFByb2R1Y3Rpb24jMTExNDIKLW5haWNzIzExMTkjT3RoZXIgQ3JvcCBGYXJtaW5nIzExMQotbmFpY3MjMTExOTEjVG9iYWNjbyBGYXJtaW5nIzExMTkKLW5haWNzIzExMTkyI0NvdHRvbiBGYXJtaW5nIzExMTkKLW5haWNzIzExMTkzI1N1Z2FyY2FuZSBGYXJtaW5nIzExMTkKLW5haWNzIzExMTk0I0hheSBGYXJtaW5nIzExMTkKLW5haWNzIzExMTk5I0FsbCBPdGhlciBDcm9wIEZhcm1pbmcjMTExOQotbmFpY3MjMTExOTkxI1N1Z2FyIEJlZXQgRmFybWluZyMxMTE5OQotbmFpY3MjMTExOTkyI1BlYW51dCBGYXJtaW5nIzExMTk5Ci1uYWljcyMxMTE5OTgjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgQ3JvcCBGYXJtaW5nIzExMTk5Ci1uYWljcyMxMTIjQW5pbWFsIFByb2R1Y3Rpb24jMTEKLW5haWNzIzExMjEjQ2F0dGxlIFJhbmNoaW5nIGFuZCBGYXJtaW5nIzExMgotbmFpY3MjMTEyMTEjQmVlZiBDYXR0bGUgUmFuY2hpbmcgYW5kIEZhcm1pbmcsIGluY2x1ZGluZyBGZWVkbG90cyMxMTIxCi1uYWljcyMxMTIxMTEjQmVlZiBDYXR0bGUgUmFuY2hpbmcgYW5kIEZhcm1pbmcjMTEyMTEKLW5haWNzIzExMjExMiNDYXR0bGUgRmVlZGxvdHMjMTEyMTEKLW5haWNzIzExMjEyI0RhaXJ5IENhdHRsZSBhbmQgTWlsayBQcm9kdWN0aW9uIzExMjEKLW5haWNzIzExMjEzI0R1YWwgUHVycG9zZSBDYXR0bGUgUmFuY2hpbmcgYW5kIEZhcm1pbmcjMTEyMQotbmFpY3MjMTEyMiNIb2cgYW5kIFBpZyBGYXJtaW5nIzExMgotbmFpY3MjMTEyMjEjSG9nIGFuZCBQaWcgRmFybWluZyMxMTIyCi1uYWljcyMxMTIzI1BvdWx0cnkgYW5kIEVnZyBQcm9kdWN0aW9uIzExMgotbmFpY3MjMTEyMzEjQ2hpY2tlbiBFZ2cgUHJvZHVjdGlvbiMxMTIzCi1uYWljcyMxMTIzMiNCcm9pbGVycyBhbmQgT3RoZXIgTWVhdCBUeXBlIENoaWNrZW4gUHJvZHVjdGlvbiMxMTIzCi1uYWljcyMxMTIzMyNUdXJrZXkgUHJvZHVjdGlvbiMxMTIzCi1uYWljcyMxMTIzNCNQb3VsdHJ5IEhhdGNoZXJpZXMjMTEyMwotbmFpY3MjMTEyMzkjT3RoZXIgUG91bHRyeSBQcm9kdWN0aW9uIzExMjMKLW5haWNzIzExMjQjU2hlZXAgYW5kIEdvYXQgRmFybWluZyMxMTIKLW5haWNzIzExMjQxI1NoZWVwIEZhcm1pbmcjMTEyNAotbmFpY3MjMTEyNDIjR29hdCBGYXJtaW5nIzExMjQKLW5haWNzIzExMjUjQW5pbWFsIEFxdWFjdWx0dXJlIzExMgotbmFpY3MjMTEyNTEjQW5pbWFsIEFxdWFjdWx0dXJlIzExMjUKLW5haWNzIzExMjUxMSNGaW5maXNoIEZhcm1pbmcgYW5kIEZpc2ggSGF0Y2hlcmllcyMxMTI1MQotbmFpY3MjMTEyNTEyI1NoZWxsZmlzaCBGYXJtaW5nIzExMjUxCi1uYWljcyMxMTI1MTkjT3RoZXIgQW5pbWFsIEFxdWFjdWx0dXJlIzExMjUxCi1uYWljcyMxMTI5I090aGVyIEFuaW1hbCBQcm9kdWN0aW9uIzExMgotbmFpY3MjMTEyOTEjQXBpY3VsdHVyZSMxMTI5Ci1uYWljcyMxMTI5MiNIb3JzZSBhbmQgT3RoZXIgRXF1aW5lIFByb2R1Y3Rpb24jMTEyOQotbmFpY3MjMTEyOTMjRnVyLUJlYXJpbmcgQW5pbWFsIGFuZCBSYWJiaXQgUHJvZHVjdGlvbiMxMTI5Ci1uYWljcyMxMTI5OSNBbGwgT3RoZXIgQW5pbWFsIFByb2R1Y3Rpb24jMTEyOQotbmFpY3MjMTEzI0ZvcmVzdHJ5IGFuZCBMb2dnaW5nIzExCi1uYWljcyMxMTMxI1RpbWJlciBUcmFjdCBPcGVyYXRpb25zIzExMwotbmFpY3MjMTEzMTEjVGltYmVyIFRyYWN0IE9wZXJhdGlvbnMjMTEzMQotbmFpY3MjMTEzMiNGb3Jlc3QgTnVyc2VyaWVzIGFuZCBHYXRoZXJpbmcgb2YgRm9yZXN0IFByb2R1Y3RzIzExMwotbmFpY3MjMTEzMjEjRm9yZXN0IE51cnNlcmllcyBhbmQgR2F0aGVyaW5nIG9mIEZvcmVzdCBQcm9kdWN0cyMxMTMyCi1uYWljcyMxMTMzI0xvZ2dpbmcjMTEzCi1uYWljcyMxMTMzMSNMb2dnaW5nIzExMzMKLW5haWNzIzExNCNGaXNoaW5nLCBIdW50aW5nIGFuZCBUcmFwcGluZyMxMQotbmFpY3MjMTE0MSNGaXNoaW5nIzExNAotbmFpY3MjMTE0MTEjRmlzaGluZyMxMTQxCi1uYWljcyMxMTQxMTEjRmluZmlzaCBGaXNoaW5nIzExNDExCi1uYWljcyMxMTQxMTIjU2hlbGxmaXNoIEZpc2hpbmcjMTE0MTEKLW5haWNzIzExNDExOSNPdGhlciBNYXJpbmUgRmlzaGluZyMxMTQxMQotbmFpY3MjMTE0MiNIdW50aW5nIGFuZCBUcmFwcGluZyMxMTQKLW5haWNzIzExNDIxI0h1bnRpbmcgYW5kIFRyYXBwaW5nIzExNDIKLW5haWNzIzExNSNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIEFncmljdWx0dXJlIGFuZCBGb3Jlc3RyeSMxMQotbmFpY3MjMTE1MSNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIENyb3AgUHJvZHVjdGlvbiMxMTUKLW5haWNzIzExNTExI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgQ3JvcCBQcm9kdWN0aW9uIzExNTEKLW5haWNzIzExNTExMSNDb3R0b24gR2lubmluZyMxMTUxMQotbmFpY3MjMTE1MTEyI1NvaWwgUHJlcGFyYXRpb24sIFBsYW50aW5nLCBhbmQgQ3VsdGl2YXRpbmcjMTE1MTEKLW5haWNzIzExNTExMyNDcm9wIEhhcnZlc3RpbmcsIFByaW1hcmlseSBieSBNYWNoaW5lIzExNTExCi1uYWljcyMxMTUxMTQjUG9zdGhhcnZlc3QgQ3JvcCBBY3Rpdml0aWVzIChleGNlcHQgQ290dG9uIEdpbm5pbmcpIzExNTExCi1uYWljcyMxMTUxMTUjRmFybSBMYWJvciBDb250cmFjdG9ycyBhbmQgQ3JldyBMZWFkZXJzIzExNTExCi1uYWljcyMxMTUxMTYjRmFybSBNYW5hZ2VtZW50IFNlcnZpY2VzIzExNTExCi1uYWljcyMxMTUyI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgQW5pbWFsIFByb2R1Y3Rpb24jMTE1Ci1uYWljcyMxMTUyMSNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIEFuaW1hbCBQcm9kdWN0aW9uIzExNTIKLW5haWNzIzExNTMjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBGb3Jlc3RyeSMxMTUKLW5haWNzIzExNTMxI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgRm9yZXN0cnkjMTE1MwotbmFpY3MjMjEjTWluaW5nIzIxCi1uYWljcyMyMTEjT2lsIGFuZCBHYXMgRXh0cmFjdGlvbiMyMQotbmFpY3MjMjExMSNPaWwgYW5kIEdhcyBFeHRyYWN0aW9uIzIxMQotbmFpY3MjMjExMTEjT2lsIGFuZCBHYXMgRXh0cmFjdGlvbiMyMTExCi1uYWljcyMyMTExMTEjQ3J1ZGUgUGV0cm9sZXVtIGFuZCBOYXR1cmFsIEdhcyBFeHRyYWN0aW9uIzIxMTExCi1uYWljcyMyMTExMTIjTmF0dXJhbCBHYXMgTGlxdWlkIEV4dHJhY3Rpb24jMjExMTEKLW5haWNzIzIxMiNNaW5pbmcgKGV4Y2VwdCBPaWwgYW5kIEdhcykjMjEKLW5haWNzIzIxMjEjQ29hbCBNaW5pbmcjMjEyCi1uYWljcyMyMTIxMSNDb2FsIE1pbmluZyMyMTIxCi1uYWljcyMyMTIxMTEjQml0dW1pbm91cyBDb2FsIGFuZCBMaWduaXRlIFN1cmZhY2UgTWluaW5nIzIxMjExCi1uYWljcyMyMTIxMTIjQml0dW1pbm91cyBDb2FsIFVuZGVyZ3JvdW5kIE1pbmluZyMyMTIxMQotbmFpY3MjMjEyMTEzI0FudGhyYWNpdGUgTWluaW5nIzIxMjExCi1uYWljcyMyMTIyI01ldGFsIE9yZSBNaW5pbmcjMjEyCi1uYWljcyMyMTIyMSNJcm9uIE9yZSBNaW5pbmcjMjEyMgotbmFpY3MjMjEyMjIjR29sZCBPcmUgYW5kIFNpbHZlciBPcmUgTWluaW5nIzIxMjIKLW5haWNzIzIxMjIyMSNHb2xkIE9yZSBNaW5pbmcjMjEyMjIKLW5haWNzIzIxMjIyMiNTaWx2ZXIgT3JlIE1pbmluZyMyMTIyMgotbmFpY3MjMjEyMjMjQ29wcGVyLCBOaWNrZWwsIExlYWQsIGFuZCBaaW5jIE1pbmluZyMyMTIyCi1uYWljcyMyMTIyMzEjTGVhZCBPcmUgYW5kIFppbmMgT3JlIE1pbmluZyMyMTIyMwotbmFpY3MjMjEyMjM0I0NvcHBlciBPcmUgYW5kIE5pY2tlbCBPcmUgTWluaW5nIzIxMjIzCi1uYWljcyMyMTIyOSNPdGhlciBNZXRhbCBPcmUgTWluaW5nIzIxMjIKLW5haWNzIzIxMjI5MSNVcmFuaXVtLVJhZGl1bS1WYW5hZGl1bSBPcmUgTWluaW5nIzIxMjI5Ci1uYWljcyMyMTIyOTkjQWxsIE90aGVyIE1ldGFsIE9yZSBNaW5pbmcjMjEyMjkKLW5haWNzIzIxMjMjTm9ubWV0YWxsaWMgTWluZXJhbCBNaW5pbmcgYW5kIFF1YXJyeWluZyMyMTIKLW5haWNzIzIxMjMxI1N0b25lIE1pbmluZyBhbmQgUXVhcnJ5aW5nIzIxMjMKLW5haWNzIzIxMjMxMSNEaW1lbnNpb24gU3RvbmUgTWluaW5nIGFuZCBRdWFycnlpbmcjMjEyMzEKLW5haWNzIzIxMjMxMiNDcnVzaGVkIGFuZCBCcm9rZW4gTGltZXN0b25lIE1pbmluZyBhbmQgUXVhcnJ5aW5nIzIxMjMxCi1uYWljcyMyMTIzMTMjQ3J1c2hlZCBhbmQgQnJva2VuIEdyYW5pdGUgTWluaW5nIGFuZCBRdWFycnlpbmcjMjEyMzEKLW5haWNzIzIxMjMxOSNPdGhlciBDcnVzaGVkIGFuZCBCcm9rZW4gU3RvbmUgTWluaW5nIGFuZCBRdWFycnlpbmcjMjEyMzEKLW5haWNzIzIxMjMyI1NhbmQsIEdyYXZlbCwgQ2xheSwgYW5kIENlcmFtaWMgYW5kIFJlZnJhY3RvcnkgTWluZXJhbHMgTWluaW5nIGFuZCBRdWFycnlpbmcjMjEyMwotbmFpY3MjMjEyMzIxI0NvbnN0cnVjdGlvbiBTYW5kIGFuZCBHcmF2ZWwgTWluaW5nIzIxMjMyCi1uYWljcyMyMTIzMjIjSW5kdXN0cmlhbCBTYW5kIE1pbmluZyMyMTIzMgotbmFpY3MjMjEyMzI0I0thb2xpbiBhbmQgQmFsbCBDbGF5IE1pbmluZyMyMTIzMgotbmFpY3MjMjEyMzI1I0NsYXkgYW5kIENlcmFtaWMgYW5kIFJlZnJhY3RvcnkgTWluZXJhbHMgTWluaW5nIzIxMjMyCi1uYWljcyMyMTIzOSNPdGhlciBOb25tZXRhbGxpYyBNaW5lcmFsIE1pbmluZyBhbmQgUXVhcnJ5aW5nIzIxMjMKLW5haWNzIzIxMjM5MSNQb3Rhc2gsIFNvZGEsIGFuZCBCb3JhdGUgTWluZXJhbCBNaW5pbmcjMjEyMzkKLW5haWNzIzIxMjM5MiNQaG9zcGhhdGUgUm9jayBNaW5pbmcjMjEyMzkKLW5haWNzIzIxMjM5MyNPdGhlciBDaGVtaWNhbCBhbmQgRmVydGlsaXplciBNaW5lcmFsIE1pbmluZyMyMTIzOQotbmFpY3MjMjEyMzk5I0FsbCBPdGhlciBOb25tZXRhbGxpYyBNaW5lcmFsIE1pbmluZyMyMTIzOQotbmFpY3MjMjEzI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgTWluaW5nIzIxCi1uYWljcyMyMTMxI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgTWluaW5nIzIxMwotbmFpY3MjMjEzMTEjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBNaW5pbmcjMjEzMQotbmFpY3MjMjEzMTExI0RyaWxsaW5nIE9pbCBhbmQgR2FzIFdlbGxzIzIxMzExCi1uYWljcyMyMTMxMTIjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBPaWwgYW5kIEdhcyBPcGVyYXRpb25zIzIxMzExCi1uYWljcyMyMTMxMTMjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBDb2FsIE1pbmluZyMyMTMxMQotbmFpY3MjMjEzMTE0I1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgTWV0YWwgTWluaW5nIzIxMzExCi1uYWljcyMyMTMxMTUjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBOb25tZXRhbGxpYyBNaW5lcmFscyAoZXhjZXB0IEZ1ZWxzKSMyMTMxMQotbmFpY3MjMjIjVXRpbGl0aWVzIzIyCi1uYWljcyMyMjEjVXRpbGl0aWVzIzIyCi1uYWljcyMyMjExI0VsZWN0cmljIFBvd2VyIEdlbmVyYXRpb24sIFRyYW5zbWlzc2lvbiBhbmQgRGlzdHJpYnV0aW9uIzIyMQotbmFpY3MjMjIxMTEjRWxlY3RyaWMgUG93ZXIgR2VuZXJhdGlvbiMyMjExCi1uYWljcyMyMjExMTEjSHlkcm9lbGVjdHJpYyBQb3dlciBHZW5lcmF0aW9uIzIyMTExCi1uYWljcyMyMjExMTIjRm9zc2lsIEZ1ZWwgRWxlY3RyaWMgUG93ZXIgR2VuZXJhdGlvbiMyMjExMQotbmFpY3MjMjIxMTEzI051Y2xlYXIgRWxlY3RyaWMgUG93ZXIgR2VuZXJhdGlvbiMyMjExMQotbmFpY3MjMjIxMTE5I090aGVyIEVsZWN0cmljIFBvd2VyIEdlbmVyYXRpb24jMjIxMTEKLW5haWNzIzIyMTEyI0VsZWN0cmljIFBvd2VyIFRyYW5zbWlzc2lvbiwgQ29udHJvbCwgYW5kIERpc3RyaWJ1dGlvbiMyMjExCi1uYWljcyMyMjExMjEjRWxlY3RyaWMgQnVsayBQb3dlciBUcmFuc21pc3Npb24gYW5kIENvbnRyb2wjMjIxMTIKLW5haWNzIzIyMTEyMiNFbGVjdHJpYyBQb3dlciBEaXN0cmlidXRpb24jMjIxMTIKLW5haWNzIzIyMTIjTmF0dXJhbCBHYXMgRGlzdHJpYnV0aW9uIzIyMQotbmFpY3MjMjIxMjEjTmF0dXJhbCBHYXMgRGlzdHJpYnV0aW9uIzIyMTIKLW5haWNzIzIyMTMjV2F0ZXIsIFNld2FnZSBhbmQgT3RoZXIgU3lzdGVtcyMyMjEKLW5haWNzIzIyMTMxI1dhdGVyIFN1cHBseSBhbmQgSXJyaWdhdGlvbiBTeXN0ZW1zIzIyMTMKLW5haWNzIzIyMTMyI1Nld2FnZSBUcmVhdG1lbnQgRmFjaWxpdGllcyMyMjEzCi1uYWljcyMyMjEzMyNTdGVhbSBhbmQgQWlyLUNvbmRpdGlvbmluZyBTdXBwbHkjMjIxMwotbmFpY3MjMjMjQ29uc3RydWN0aW9uIzIzCi1uYWljcyMyMzMjQnVpbGRpbmcsIERldmVsb3BpbmcsIGFuZCBHZW5lcmFsIENvbnRyYWN0aW5nIzIzCi1uYWljcyMyMzMxI0xhbmQgU3ViZGl2aXNpb24gYW5kIExhbmQgRGV2ZWxvcG1lbnQjMjMzCi1uYWljcyMyMzMxMSNMYW5kIFN1YmRpdmlzaW9uIGFuZCBMYW5kIERldmVsb3BtZW50IzIzMzEKLW5haWNzIzIzMzIjUmVzaWRlbnRpYWwgQnVpbGRpbmcgQ29uc3RydWN0aW9uIzIzMwotbmFpY3MjMjMzMjEjU2luZ2xlIEZhbWlseSBIb3VzaW5nIENvbnN0cnVjdGlvbiMyMzMyCi1uYWljcyMyMzMyMiNNdWx0aWZhbWlseSBIb3VzaW5nIENvbnN0cnVjdGlvbiMyMzMyCi1uYWljcyMyMzMzI05vbnJlc2lkZW50aWFsIEJ1aWxkaW5nIENvbnN0cnVjdGlvbiMyMzMKLW5haWNzIzIzMzMxI01hbnVmYWN0dXJpbmcgYW5kIEluZHVzdHJpYWwgQnVpbGRpbmcgQ29uc3RydWN0aW9uIzIzMzMKLW5haWNzIzIzMzMyI0NvbW1lcmNpYWwgYW5kIEluc3RpdHV0aW9uYWwgQnVpbGRpbmcgQ29uc3RydWN0aW9uIzIzMzMKLW5haWNzIzIzNCNIZWF2eSBDb25zdHJ1Y3Rpb24jMjMKLW5haWNzIzIzNDEjSGlnaHdheSwgU3RyZWV0LCBCcmlkZ2UsIGFuZCBUdW5uZWwgQ29uc3RydWN0aW9uIzIzNAotbmFpY3MjMjM0MTEjSGlnaHdheSBhbmQgU3RyZWV0IENvbnN0cnVjdGlvbiMyMzQxCi1uYWljcyMyMzQxMiNCcmlkZ2UgYW5kIFR1bm5lbCBDb25zdHJ1Y3Rpb24jMjM0MQotbmFpY3MjMjM0OSNPdGhlciBIZWF2eSBDb25zdHJ1Y3Rpb24jMjM0Ci1uYWljcyMyMzQ5MSNXYXRlciwgU2V3ZXIsIGFuZCBQaXBlbGluZSBDb25zdHJ1Y3Rpb24jMjM0OQotbmFpY3MjMjM0OTIjUG93ZXIgYW5kIENvbW11bmljYXRpb24gVHJhbnNtaXNzaW9uIExpbmUgQ29uc3RydWN0aW9uIzIzNDkKLW5haWNzIzIzNDkzI0luZHVzdHJpYWwgTm9uYnVpbGRpbmcgU3RydWN0dXJlIENvbnN0cnVjdGlvbiMyMzQ5Ci1uYWljcyMyMzQ5OSNBbGwgT3RoZXIgSGVhdnkgQ29uc3RydWN0aW9uIzIzNDkKLW5haWNzIzIzNSNTcGVjaWFsIFRyYWRlIENvbnRyYWN0b3JzIzIzCi1uYWljcyMyMzUxI1BsdW1iaW5nLCBIZWF0aW5nLCBhbmQgQWlyLUNvbmRpdGlvbmluZyBDb250cmFjdG9ycyMyMzUKLW5haWNzIzIzNTExI1BsdW1iaW5nLCBIZWF0aW5nLCBhbmQgQWlyLUNvbmRpdGlvbmluZyBDb250cmFjdG9ycyMyMzUxCi1uYWljcyMyMzUyI1BhaW50aW5nIGFuZCBXYWxsIENvdmVyaW5nIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1MjEjUGFpbnRpbmcgYW5kIFdhbGwgQ292ZXJpbmcgQ29udHJhY3RvcnMjMjM1MgotbmFpY3MjMjM1MyNFbGVjdHJpY2FsIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1MzEjRWxlY3RyaWNhbCBDb250cmFjdG9ycyMyMzUzCi1uYWljcyMyMzU0I01hc29ucnksIERyeXdhbGwsIEluc3VsYXRpb24sIGFuZCBUaWxlIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1NDEjTWFzb25yeSBhbmQgU3RvbmUgQ29udHJhY3RvcnMjMjM1NAotbmFpY3MjMjM1NDIjRHJ5d2FsbCwgUGxhc3RlcmluZywgQWNvdXN0aWNhbCwgYW5kIEluc3VsYXRpb24gQ29udHJhY3RvcnMjMjM1NAotbmFpY3MjMjM1NDMjVGlsZSwgTWFyYmxlLCBUZXJyYXp6bywgYW5kIE1vc2FpYyBDb250cmFjdG9ycyMyMzU0Ci1uYWljcyMyMzU1I0NhcnBlbnRyeSBhbmQgRmxvb3IgQ29udHJhY3RvcnMjMjM1Ci1uYWljcyMyMzU1MSNDYXJwZW50cnkgQ29udHJhY3RvcnMjMjM1NQotbmFpY3MjMjM1NTIjRmxvb3IgTGF5aW5nIGFuZCBPdGhlciBGbG9vciBDb250cmFjdG9ycyMyMzU1Ci1uYWljcyMyMzU2I1Jvb2ZpbmcsIFNpZGluZywgYW5kIFNoZWV0IE1ldGFsIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1NjEjUm9vZmluZywgU2lkaW5nLCBhbmQgU2hlZXQgTWV0YWwgQ29udHJhY3RvcnMjMjM1NgotbmFpY3MjMjM1NyNDb25jcmV0ZSBDb250cmFjdG9ycyMyMzUKLW5haWNzIzIzNTcxI0NvbmNyZXRlIENvbnRyYWN0b3JzIzIzNTcKLW5haWNzIzIzNTgjV2F0ZXIgV2VsbCBEcmlsbGluZyBDb250cmFjdG9ycyMyMzUKLW5haWNzIzIzNTgxI1dhdGVyIFdlbGwgRHJpbGxpbmcgQ29udHJhY3RvcnMjMjM1OAotbmFpY3MjMjM1OSNPdGhlciBTcGVjaWFsIFRyYWRlIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1OTEjU3RydWN0dXJhbCBTdGVlbCBFcmVjdGlvbiBDb250cmFjdG9ycyMyMzU5Ci1uYWljcyMyMzU5MiNHbGFzcyBhbmQgR2xhemluZyBDb250cmFjdG9ycyMyMzU5Ci1uYWljcyMyMzU5MyNFeGNhdmF0aW9uIENvbnRyYWN0b3JzIzIzNTkKLW5haWNzIzIzNTk0I1dyZWNraW5nIGFuZCBEZW1vbGl0aW9uIENvbnRyYWN0b3JzIzIzNTkKLW5haWNzIzIzNTk1I0J1aWxkaW5nIEVxdWlwbWVudCBhbmQgT3RoZXIgTWFjaGluZXJ5IEluc3RhbGxhdGlvbiBDb250cmFjdG9ycyMyMzU5Ci1uYWljcyMyMzU5OSNBbGwgT3RoZXIgU3BlY2lhbCBUcmFkZSBDb250cmFjdG9ycyMyMzU5Ci1uYWljcyMzMSNNYW51ZmFjdHVyaW5nIzMxCi1uYWljcyMzMTEjRm9vZCBNYW51ZmFjdHVyaW5nIzMxCi1uYWljcyMzMTExI0FuaW1hbCBGb29kIE1hbnVmYWN0dXJpbmcjMzExCi1uYWljcyMzMTExMSNBbmltYWwgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTEKLW5haWNzIzMxMTExMSNEb2cgYW5kIENhdCBGb29kIE1hbnVmYWN0dXJpbmcjMzExMTEKLW5haWNzIzMxMTExOSNPdGhlciBBbmltYWwgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTExCi1uYWljcyMzMTEyI0dyYWluIGFuZCBPaWxzZWVkIE1pbGxpbmcjMzExCi1uYWljcyMzMTEyMSNGbG91ciBNaWxsaW5nIGFuZCBNYWx0IE1hbnVmYWN0dXJpbmcjMzExMgotbmFpY3MjMzExMjExI0Zsb3VyIE1pbGxpbmcjMzExMjEKLW5haWNzIzMxMTIxMiNSaWNlIE1pbGxpbmcjMzExMjEKLW5haWNzIzMxMTIxMyNNYWx0IE1hbnVmYWN0dXJpbmcjMzExMjEKLW5haWNzIzMxMTIyI1N0YXJjaCBhbmQgVmVnZXRhYmxlIEZhdHMgYW5kIE9pbHMgTWFudWZhY3R1cmluZyMzMTEyCi1uYWljcyMzMTEyMjEjV2V0IENvcm4gTWlsbGluZyMzMTEyMgotbmFpY3MjMzExMjIyI1NveWJlYW4gUHJvY2Vzc2luZyMzMTEyMgotbmFpY3MjMzExMjIzI090aGVyIE9pbHNlZWQgUHJvY2Vzc2luZyMzMTEyMgotbmFpY3MjMzExMjI1I0ZhdHMgYW5kIE9pbHMgUmVmaW5pbmcgYW5kIEJsZW5kaW5nIzMxMTIyCi1uYWljcyMzMTEyMyNCcmVha2Zhc3QgQ2VyZWFsIE1hbnVmYWN0dXJpbmcjMzExMgotbmFpY3MjMzExMyNTdWdhciBhbmQgQ29uZmVjdGlvbmVyeSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzExCi1uYWljcyMzMTEzMSNTdWdhciBNYW51ZmFjdHVyaW5nIzMxMTMKLW5haWNzIzMxMTMxMSNTdWdhcmNhbmUgTWlsbHMjMzExMzEKLW5haWNzIzMxMTMxMiNDYW5lIFN1Z2FyIFJlZmluaW5nIzMxMTMxCi1uYWljcyMzMTEzMTMjQmVldCBTdWdhciBNYW51ZmFjdHVyaW5nIzMxMTMxCi1uYWljcyMzMTEzMiNDaG9jb2xhdGUgYW5kIENvbmZlY3Rpb25lcnkgTWFudWZhY3R1cmluZyBmcm9tIENhY2FvIEJlYW5zIzMxMTMKLW5haWNzIzMxMTMzI0NvbmZlY3Rpb25lcnkgTWFudWZhY3R1cmluZyBmcm9tIFB1cmNoYXNlZCBDaG9jb2xhdGUjMzExMwotbmFpY3MjMzExMzQjTm9uY2hvY29sYXRlIENvbmZlY3Rpb25lcnkgTWFudWZhY3R1cmluZyMzMTEzCi1uYWljcyMzMTE0I0ZydWl0IGFuZCBWZWdldGFibGUgUHJlc2VydmluZyBhbmQgU3BlY2lhbHR5IEZvb2QgTWFudWZhY3R1cmluZyMzMTEKLW5haWNzIzMxMTQxI0Zyb3plbiBGb29kIE1hbnVmYWN0dXJpbmcjMzExNAotbmFpY3MjMzExNDExI0Zyb3plbiBGcnVpdCwgSnVpY2UsIGFuZCBWZWdldGFibGUgTWFudWZhY3R1cmluZyMzMTE0MQotbmFpY3MjMzExNDEyI0Zyb3plbiBTcGVjaWFsdHkgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTQxCi1uYWljcyMzMTE0MiNGcnVpdCBhbmQgVmVnZXRhYmxlIENhbm5pbmcsIFBpY2tsaW5nLCBhbmQgRHJ5aW5nIzMxMTQKLW5haWNzIzMxMTQyMSNGcnVpdCBhbmQgVmVnZXRhYmxlIENhbm5pbmcjMzExNDIKLW5haWNzIzMxMTQyMiNTcGVjaWFsdHkgQ2FubmluZyMzMTE0MgotbmFpY3MjMzExNDIzI0RyaWVkIGFuZCBEZWh5ZHJhdGVkIEZvb2QgTWFudWZhY3R1cmluZyMzMTE0MgotbmFpY3MjMzExNSNEYWlyeSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzExCi1uYWljcyMzMTE1MSNEYWlyeSBQcm9kdWN0IChleGNlcHQgRnJvemVuKSBNYW51ZmFjdHVyaW5nIzMxMTUKLW5haWNzIzMxMTUxMSNGbHVpZCBNaWxrIE1hbnVmYWN0dXJpbmcjMzExNTEKLW5haWNzIzMxMTUxMiNDcmVhbWVyeSBCdXR0ZXIgTWFudWZhY3R1cmluZyMzMTE1MQotbmFpY3MjMzExNTEzI0NoZWVzZSBNYW51ZmFjdHVyaW5nIzMxMTUxCi1uYWljcyMzMTE1MTQjRHJ5LCBDb25kZW5zZWQsIGFuZCBFdmFwb3JhdGVkIERhaXJ5IFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMTE1MQotbmFpY3MjMzExNTIjSWNlIENyZWFtIGFuZCBGcm96ZW4gRGVzc2VydCBNYW51ZmFjdHVyaW5nIzMxMTUKLW5haWNzIzMxMTYjQW5pbWFsIFNsYXVnaHRlcmluZyBhbmQgUHJvY2Vzc2luZyMzMTEKLW5haWNzIzMxMTYxI0FuaW1hbCBTbGF1Z2h0ZXJpbmcgYW5kIFByb2Nlc3NpbmcjMzExNgotbmFpY3MjMzExNjExI0FuaW1hbCAoZXhjZXB0IFBvdWx0cnkpIFNsYXVnaHRlcmluZyMzMTE2MQotbmFpY3MjMzExNjEyI01lYXQgUHJvY2Vzc2VkIGZyb20gQ2FyY2Fzc2VzIzMxMTYxCi1uYWljcyMzMTE2MTMjUmVuZGVyaW5nIGFuZCBNZWF0IEJ5cHJvZHVjdCBQcm9jZXNzaW5nIzMxMTYxCi1uYWljcyMzMTE2MTUjUG91bHRyeSBQcm9jZXNzaW5nIzMxMTYxCi1uYWljcyMzMTE3I1NlYWZvb2QgUHJvZHVjdCBQcmVwYXJhdGlvbiBhbmQgUGFja2FnaW5nIzMxMQotbmFpY3MjMzExNzEjU2VhZm9vZCBQcm9kdWN0IFByZXBhcmF0aW9uIGFuZCBQYWNrYWdpbmcjMzExNwotbmFpY3MjMzExNzExI1NlYWZvb2QgQ2FubmluZyMzMTE3MQotbmFpY3MjMzExNzEyI0ZyZXNoIGFuZCBGcm96ZW4gU2VhZm9vZCBQcm9jZXNzaW5nIzMxMTcxCi1uYWljcyMzMTE4I0Jha2VyaWVzIGFuZCBUb3J0aWxsYSBNYW51ZmFjdHVyaW5nIzMxMQotbmFpY3MjMzExODEjQnJlYWQgYW5kIEJha2VyeSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzExOAotbmFpY3MjMzExODExI1JldGFpbCBCYWtlcmllcyMzMTE4MQotbmFpY3MjMzExODEyI0NvbW1lcmNpYWwgQmFrZXJpZXMjMzExODEKLW5haWNzIzMxMTgxMyNGcm96ZW4gQ2FrZXMsIFBpZXMsIGFuZCBPdGhlciBQYXN0cmllcyBNYW51ZmFjdHVyaW5nIzMxMTgxCi1uYWljcyMzMTE4MiNDb29raWUsIENyYWNrZXIsIGFuZCBQYXN0YSBNYW51ZmFjdHVyaW5nIzMxMTgKLW5haWNzIzMxMTgyMSNDb29raWUgYW5kIENyYWNrZXIgTWFudWZhY3R1cmluZyMzMTE4MgotbmFpY3MjMzExODIyI0Zsb3VyIE1peGVzIGFuZCBEb3VnaCBNYW51ZmFjdHVyaW5nIGZyb20gUHVyY2hhc2VkIEZsb3VyIzMxMTgyCi1uYWljcyMzMTE4MjMjRHJ5IFBhc3RhIE1hbnVmYWN0dXJpbmcjMzExODIKLW5haWNzIzMxMTgzI1RvcnRpbGxhIE1hbnVmYWN0dXJpbmcjMzExOAotbmFpY3MjMzExOSNPdGhlciBGb29kIE1hbnVmYWN0dXJpbmcjMzExCi1uYWljcyMzMTE5MSNTbmFjayBGb29kIE1hbnVmYWN0dXJpbmcjMzExOQotbmFpY3MjMzExOTExI1JvYXN0ZWQgTnV0cyBhbmQgUGVhbnV0IEJ1dHRlciBNYW51ZmFjdHVyaW5nIzMxMTkxCi1uYWljcyMzMTE5MTkjT3RoZXIgU25hY2sgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTkxCi1uYWljcyMzMTE5MiNDb2ZmZWUgYW5kIFRlYSBNYW51ZmFjdHVyaW5nIzMxMTkKLW5haWNzIzMxMTkzI0ZsYXZvcmluZyBTeXJ1cCBhbmQgQ29uY2VudHJhdGUgTWFudWZhY3R1cmluZyMzMTE5Ci1uYWljcyMzMTE5NCNTZWFzb25pbmcgYW5kIERyZXNzaW5nIE1hbnVmYWN0dXJpbmcjMzExOQotbmFpY3MjMzExOTQxI01heW9ubmFpc2UsIERyZXNzaW5nLCBhbmQgT3RoZXIgUHJlcGFyZWQgU2F1Y2UgTWFudWZhY3R1cmluZyMzMTE5NAotbmFpY3MjMzExOTQyI1NwaWNlIGFuZCBFeHRyYWN0IE1hbnVmYWN0dXJpbmcjMzExOTQKLW5haWNzIzMxMTk5I0FsbCBPdGhlciBGb29kIE1hbnVmYWN0dXJpbmcjMzExOQotbmFpY3MjMzExOTkxI1BlcmlzaGFibGUgUHJlcGFyZWQgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTk5Ci1uYWljcyMzMTE5OTkjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTk5Ci1uYWljcyMzMTIjQmV2ZXJhZ2UgYW5kIFRvYmFjY28gUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMxCi1uYWljcyMzMTIxI0JldmVyYWdlIE1hbnVmYWN0dXJpbmcjMzEyCi1uYWljcyMzMTIxMSNTb2Z0IERyaW5rIGFuZCBJY2UgTWFudWZhY3R1cmluZyMzMTIxCi1uYWljcyMzMTIxMTEjU29mdCBEcmluayBNYW51ZmFjdHVyaW5nIzMxMjExCi1uYWljcyMzMTIxMTIjQm90dGxlZCBXYXRlciBNYW51ZmFjdHVyaW5nIzMxMjExCi1uYWljcyMzMTIxMTMjSWNlIE1hbnVmYWN0dXJpbmcjMzEyMTEKLW5haWNzIzMxMjEyI0JyZXdlcmllcyMzMTIxCi1uYWljcyMzMTIxMyNXaW5lcmllcyMzMTIxCi1uYWljcyMzMTIxNCNEaXN0aWxsZXJpZXMjMzEyMQotbmFpY3MjMzEyMiNUb2JhY2NvIE1hbnVmYWN0dXJpbmcjMzEyCi1uYWljcyMzMTIyMSNUb2JhY2NvIFN0ZW1taW5nIGFuZCBSZWRyeWluZyMzMTIyCi1uYWljcyMzMTIyMiNUb2JhY2NvIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMTIyCi1uYWljcyMzMTIyMjEjQ2lnYXJldHRlIE1hbnVmYWN0dXJpbmcjMzEyMjIKLW5haWNzIzMxMjIyOSNPdGhlciBUb2JhY2NvIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMTIyMgotbmFpY3MjMzEzI1RleHRpbGUgTWlsbHMjMzEKLW5haWNzIzMxMzEjRmliZXIsIFlhcm4sIGFuZCBUaHJlYWQgTWlsbHMjMzEzCi1uYWljcyMzMTMxMSNGaWJlciwgWWFybiwgYW5kIFRocmVhZCBNaWxscyMzMTMxCi1uYWljcyMzMTMxMTEjWWFybiBTcGlubmluZyBNaWxscyMzMTMxMQotbmFpY3MjMzEzMTEyI1lhcm4gVGV4dHVyaXppbmcsIFRocm93aW5nLCBhbmQgVHdpc3RpbmcgTWlsbHMjMzEzMTEKLW5haWNzIzMxMzExMyNUaHJlYWQgTWlsbHMjMzEzMTEKLW5haWNzIzMxMzIjRmFicmljIE1pbGxzIzMxMwotbmFpY3MjMzEzMjEjQnJvYWR3b3ZlbiBGYWJyaWMgTWlsbHMjMzEzMgotbmFpY3MjMzEzMjIjTmFycm93IEZhYnJpYyBNaWxscyBhbmQgU2NoaWZmbGkgTWFjaGluZSBFbWJyb2lkZXJ5IzMxMzIKLW5haWNzIzMxMzIyMSNOYXJyb3cgRmFicmljIE1pbGxzIzMxMzIyCi1uYWljcyMzMTMyMjIjU2NoaWZmbGkgTWFjaGluZSBFbWJyb2lkZXJ5IzMxMzIyCi1uYWljcyMzMTMyMyNOb253b3ZlbiBGYWJyaWMgTWlsbHMjMzEzMgotbmFpY3MjMzEzMjQjS25pdCBGYWJyaWMgTWlsbHMjMzEzMgotbmFpY3MjMzEzMjQxI1dlZnQgS25pdCBGYWJyaWMgTWlsbHMjMzEzMjQKLW5haWNzIzMxMzI0OSNPdGhlciBLbml0IEZhYnJpYyBhbmQgTGFjZSBNaWxscyMzMTMyNAotbmFpY3MjMzEzMyNUZXh0aWxlIGFuZCBGYWJyaWMgRmluaXNoaW5nIGFuZCBGYWJyaWMgQ29hdGluZyBNaWxscyMzMTMKLW5haWNzIzMxMzMxI1RleHRpbGUgYW5kIEZhYnJpYyBGaW5pc2hpbmcgTWlsbHMjMzEzMwotbmFpY3MjMzEzMzExI0Jyb2Fkd292ZW4gRmFicmljIEZpbmlzaGluZyBNaWxscyMzMTMzMQotbmFpY3MjMzEzMzEyI1RleHRpbGUgYW5kIEZhYnJpYyBGaW5pc2hpbmcgKGV4Y2VwdCBCcm9hZHdvdmVuIEZhYnJpYykgTWlsbHMjMzEzMzEKLW5haWNzIzMxMzMyI0ZhYnJpYyBDb2F0aW5nIE1pbGxzIzMxMzMKLW5haWNzIzMxNCNUZXh0aWxlIFByb2R1Y3QgTWlsbHMjMzEKLW5haWNzIzMxNDEjVGV4dGlsZSBGdXJuaXNoaW5ncyBNaWxscyMzMTQKLW5haWNzIzMxNDExI0NhcnBldCBhbmQgUnVnIE1pbGxzIzMxNDEKLW5haWNzIzMxNDEyI0N1cnRhaW4gYW5kIExpbmVuIE1pbGxzIzMxNDEKLW5haWNzIzMxNDEyMSNDdXJ0YWluIGFuZCBEcmFwZXJ5IE1pbGxzIzMxNDEyCi1uYWljcyMzMTQxMjkjT3RoZXIgSG91c2Vob2xkIFRleHRpbGUgUHJvZHVjdCBNaWxscyMzMTQxMgotbmFpY3MjMzE0OSNPdGhlciBUZXh0aWxlIFByb2R1Y3QgTWlsbHMjMzE0Ci1uYWljcyMzMTQ5MSNUZXh0aWxlIEJhZyBhbmQgQ2FudmFzIE1pbGxzIzMxNDkKLW5haWNzIzMxNDkxMSNUZXh0aWxlIEJhZyBNaWxscyMzMTQ5MQotbmFpY3MjMzE0OTEyI0NhbnZhcyBhbmQgUmVsYXRlZCBQcm9kdWN0IE1pbGxzIzMxNDkxCi1uYWljcyMzMTQ5OSNBbGwgT3RoZXIgVGV4dGlsZSBQcm9kdWN0IE1pbGxzIzMxNDkKLW5haWNzIzMxNDk5MSNSb3BlLCBDb3JkYWdlLCBhbmQgVHdpbmUgTWlsbHMjMzE0OTkKLW5haWNzIzMxNDk5MiNUaXJlIENvcmQgYW5kIFRpcmUgRmFicmljIE1pbGxzIzMxNDk5Ci1uYWljcyMzMTQ5OTkjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgVGV4dGlsZSBQcm9kdWN0IE1pbGxzIzMxNDk5Ci1uYWljcyMzMTUjQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxCi1uYWljcyMzMTUxI0FwcGFyZWwgS25pdHRpbmcgTWlsbHMjMzE1Ci1uYWljcyMzMTUxMSNIb3NpZXJ5IGFuZCBTb2NrIE1pbGxzIzMxNTEKLW5haWNzIzMxNTExMSNTaGVlciBIb3NpZXJ5IE1pbGxzIzMxNTExCi1uYWljcyMzMTUxMTkjT3RoZXIgSG9zaWVyeSBhbmQgU29jayBNaWxscyMzMTUxMQotbmFpY3MjMzE1MTkjT3RoZXIgQXBwYXJlbCBLbml0dGluZyBNaWxscyMzMTUxCi1uYWljcyMzMTUxOTEjT3V0ZXJ3ZWFyIEtuaXR0aW5nIE1pbGxzIzMxNTE5Ci1uYWljcyMzMTUxOTIjVW5kZXJ3ZWFyIGFuZCBOaWdodHdlYXIgS25pdHRpbmcgTWlsbHMjMzE1MTkKLW5haWNzIzMxNTIjQ3V0IGFuZCBTZXcgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNQotbmFpY3MjMzE1MjEjQ3V0IGFuZCBTZXcgQXBwYXJlbCBDb250cmFjdG9ycyMzMTUyCi1uYWljcyMzMTUyMTEjTWVuJ3MgYW5kIEJveXMnIEN1dCBhbmQgU2V3IEFwcGFyZWwgQ29udHJhY3RvcnMjMzE1MjEKLW5haWNzIzMxNTIxMiNXb21lbidzLCBHaXJscycsIGFuZCBJbmZhbnRzJyBDdXQgYW5kIFNldyBBcHBhcmVsIENvbnRyYWN0b3JzIzMxNTIxCi1uYWljcyMzMTUyMiNNZW4ncyBhbmQgQm95cycgQ3V0IGFuZCBTZXcgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNTIKLW5haWNzIzMxNTIyMSNNZW4ncyBhbmQgQm95cycgQ3V0IGFuZCBTZXcgVW5kZXJ3ZWFyIGFuZCBOaWdodHdlYXIgTWFudWZhY3R1cmluZyMzMTUyMgotbmFpY3MjMzE1MjIyI01lbidzIGFuZCBCb3lzJyBDdXQgYW5kIFNldyBTdWl0LCBDb2F0LCBhbmQgT3ZlcmNvYXQgTWFudWZhY3R1cmluZyMzMTUyMgotbmFpY3MjMzE1MjIzI01lbidzIGFuZCBCb3lzJyBDdXQgYW5kIFNldyBTaGlydCAoZXhjZXB0IFdvcmsgU2hpcnQpIE1hbnVmYWN0dXJpbmcjMzE1MjIKLW5haWNzIzMxNTIyNCNNZW4ncyBhbmQgQm95cycgQ3V0IGFuZCBTZXcgVHJvdXNlciwgU2xhY2ssIGFuZCBKZWFuIE1hbnVmYWN0dXJpbmcjMzE1MjIKLW5haWNzIzMxNTIyNSNNZW4ncyBhbmQgQm95cycgQ3V0IGFuZCBTZXcgV29yayBDbG90aGluZyBNYW51ZmFjdHVyaW5nIzMxNTIyCi1uYWljcyMzMTUyMjgjTWVuJ3MgYW5kIEJveXMnIEN1dCBhbmQgU2V3IE90aGVyIE91dGVyd2VhciBNYW51ZmFjdHVyaW5nIzMxNTIyCi1uYWljcyMzMTUyMyNXb21lbidzIGFuZCBHaXJscycgQ3V0IGFuZCBTZXcgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNTIKLW5haWNzIzMxNTIzMSNXb21lbidzIGFuZCBHaXJscycgQ3V0IGFuZCBTZXcgTGluZ2VyaWUsIExvdW5nZXdlYXIsIGFuZCBOaWdodHdlYXIgTWFudWZhY3R1cmluZyMzMTUyMwotbmFpY3MjMzE1MjMyI1dvbWVuJ3MgYW5kIEdpcmxzJyBDdXQgYW5kIFNldyBCbG91c2UgYW5kIFNoaXJ0IE1hbnVmYWN0dXJpbmcjMzE1MjMKLW5haWNzIzMxNTIzMyNXb21lbidzIGFuZCBHaXJscycgQ3V0IGFuZCBTZXcgRHJlc3MgTWFudWZhY3R1cmluZyMzMTUyMwotbmFpY3MjMzE1MjM0I1dvbWVuJ3MgYW5kIEdpcmxzJyBDdXQgYW5kIFNldyBTdWl0LCBDb2F0LCBUYWlsb3JlZCBKYWNrZXQsIGFuZCBTa2lydCBNYW51ZmFjdHVyaW5nIzMxNTIzCi1uYWljcyMzMTUyMzkjV29tZW4ncyBhbmQgR2lybHMnIEN1dCBhbmQgU2V3IE90aGVyIE91dGVyd2VhciBNYW51ZmFjdHVyaW5nIzMxNTIzCi1uYWljcyMzMTUyOSNPdGhlciBDdXQgYW5kIFNldyBBcHBhcmVsIE1hbnVmYWN0dXJpbmcjMzE1MgotbmFpY3MjMzE1MjkxI0luZmFudHMnIEN1dCBhbmQgU2V3IEFwcGFyZWwgTWFudWZhY3R1cmluZyMzMTUyOQotbmFpY3MjMzE1MjkyI0Z1ciBhbmQgTGVhdGhlciBBcHBhcmVsIE1hbnVmYWN0dXJpbmcjMzE1MjkKLW5haWNzIzMxNTI5OSNBbGwgT3RoZXIgQ3V0IGFuZCBTZXcgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNTI5Ci1uYWljcyMzMTU5I0FwcGFyZWwgQWNjZXNzb3JpZXMgYW5kIE90aGVyIEFwcGFyZWwgTWFudWZhY3R1cmluZyMzMTUKLW5haWNzIzMxNTk5I0FwcGFyZWwgQWNjZXNzb3JpZXMgYW5kIE90aGVyIEFwcGFyZWwgTWFudWZhY3R1cmluZyMzMTU5Ci1uYWljcyMzMTU5OTEjSGF0LCBDYXAsIGFuZCBNaWxsaW5lcnkgTWFudWZhY3R1cmluZyMzMTU5OQotbmFpY3MjMzE1OTkyI0dsb3ZlIGFuZCBNaXR0ZW4gTWFudWZhY3R1cmluZyMzMTU5OQotbmFpY3MjMzE1OTkzI01lbidzIGFuZCBCb3lzJyBOZWNrd2VhciBNYW51ZmFjdHVyaW5nIzMxNTk5Ci1uYWljcyMzMTU5OTkjT3RoZXIgQXBwYXJlbCBBY2Nlc3NvcmllcyBhbmQgT3RoZXIgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNTk5Ci1uYWljcyMzMTYjTGVhdGhlciBhbmQgQWxsaWVkIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMQotbmFpY3MjMzE2MSNMZWF0aGVyIGFuZCBIaWRlIFRhbm5pbmcgYW5kIEZpbmlzaGluZyMzMTYKLW5haWNzIzMxNjExI0xlYXRoZXIgYW5kIEhpZGUgVGFubmluZyBhbmQgRmluaXNoaW5nIzMxNjEKLW5haWNzIzMxNjIjRm9vdHdlYXIgTWFudWZhY3R1cmluZyMzMTYKLW5haWNzIzMxNjIxI0Zvb3R3ZWFyIE1hbnVmYWN0dXJpbmcjMzE2MgotbmFpY3MjMzE2MjExI1J1YmJlciBhbmQgUGxhc3RpY3MgRm9vdHdlYXIgTWFudWZhY3R1cmluZyMzMTYyMQotbmFpY3MjMzE2MjEyI0hvdXNlIFNsaXBwZXIgTWFudWZhY3R1cmluZyMzMTYyMQotbmFpY3MjMzE2MjEzI01lbidzIEZvb3R3ZWFyIChleGNlcHQgQXRobGV0aWMpIE1hbnVmYWN0dXJpbmcjMzE2MjEKLW5haWNzIzMxNjIxNCNXb21lbidzIEZvb3R3ZWFyIChleGNlcHQgQXRobGV0aWMpIE1hbnVmYWN0dXJpbmcjMzE2MjEKLW5haWNzIzMxNjIxOSNPdGhlciBGb290d2VhciBNYW51ZmFjdHVyaW5nIzMxNjIxCi1uYWljcyMzMTY5I090aGVyIExlYXRoZXIgYW5kIEFsbGllZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzE2Ci1uYWljcyMzMTY5OSNPdGhlciBMZWF0aGVyIGFuZCBBbGxpZWQgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMxNjkKLW5haWNzIzMxNjk5MSNMdWdnYWdlIE1hbnVmYWN0dXJpbmcjMzE2OTkKLW5haWNzIzMxNjk5MiNXb21lbidzIEhhbmRiYWcgYW5kIFB1cnNlIE1hbnVmYWN0dXJpbmcjMzE2OTkKLW5haWNzIzMxNjk5MyNQZXJzb25hbCBMZWF0aGVyIEdvb2QgKGV4Y2VwdCBXb21lbidzIEhhbmRiYWcgYW5kIFB1cnNlKSBNYW51ZmFjdHVyaW5nIzMxNjk5Ci1uYWljcyMzMTY5OTkjQWxsIE90aGVyIExlYXRoZXIgR29vZCBNYW51ZmFjdHVyaW5nIzMxNjk5Ci1uYWljcyMzMiNNYW51ZmFjdHVyaW5nIzMyCi1uYWljcyMzMjEjV29vZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIKLW5haWNzIzMyMTEjU2F3bWlsbHMgYW5kIFdvb2QgUHJlc2VydmF0aW9uIzMyMQotbmFpY3MjMzIxMTEjU2F3bWlsbHMgYW5kIFdvb2QgUHJlc2VydmF0aW9uIzMyMTEKLW5haWNzIzMyMTExMyNTYXdtaWxscyMzMjExMQotbmFpY3MjMzIxMTE0I1dvb2QgUHJlc2VydmF0aW9uIzMyMTExCi1uYWljcyMzMjEyI1ZlbmVlciwgUGx5d29vZCwgYW5kIEVuZ2luZWVyZWQgV29vZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIxCi1uYWljcyMzMjEyMSNWZW5lZXIsIFBseXdvb2QsIGFuZCBFbmdpbmVlcmVkIFdvb2QgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMTIKLW5haWNzIzMyMTIxMSNIYXJkd29vZCBWZW5lZXIgYW5kIFBseXdvb2QgTWFudWZhY3R1cmluZyMzMjEyMQotbmFpY3MjMzIxMjEyI1NvZnR3b29kIFZlbmVlciBhbmQgUGx5d29vZCBNYW51ZmFjdHVyaW5nIzMyMTIxCi1uYWljcyMzMjEyMTMjRW5naW5lZXJlZCBXb29kIE1lbWJlciAoZXhjZXB0IFRydXNzKSBNYW51ZmFjdHVyaW5nIzMyMTIxCi1uYWljcyMzMjEyMTQjVHJ1c3MgTWFudWZhY3R1cmluZyMzMjEyMQotbmFpY3MjMzIxMjE5I1JlY29uc3RpdHV0ZWQgV29vZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIxMjEKLW5haWNzIzMyMTkjT3RoZXIgV29vZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIxCi1uYWljcyMzMjE5MSNNaWxsd29yayMzMjE5Ci1uYWljcyMzMjE5MTEjV29vZCBXaW5kb3cgYW5kIERvb3IgTWFudWZhY3R1cmluZyMzMjE5MQotbmFpY3MjMzIxOTEyI0N1dCBTdG9jaywgUmVzYXdpbmcgTHVtYmVyLCBhbmQgUGxhbmluZyMzMjE5MQotbmFpY3MjMzIxOTE4I090aGVyIE1pbGx3b3JrIChpbmNsdWRpbmcgRmxvb3JpbmcpIzMyMTkxCi1uYWljcyMzMjE5MiNXb29kIENvbnRhaW5lciBhbmQgUGFsbGV0IE1hbnVmYWN0dXJpbmcjMzIxOQotbmFpY3MjMzIxOTkjQWxsIE90aGVyIFdvb2QgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMTkKLW5haWNzIzMyMTk5MSNNYW51ZmFjdHVyZWQgSG9tZSAoTW9iaWxlIEhvbWUpIE1hbnVmYWN0dXJpbmcjMzIxOTkKLW5haWNzIzMyMTk5MiNQcmVmYWJyaWNhdGVkIFdvb2QgQnVpbGRpbmcgTWFudWZhY3R1cmluZyMzMjE5OQotbmFpY3MjMzIxOTk5I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIFdvb2QgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMTk5Ci1uYWljcyMzMjIjUGFwZXIgTWFudWZhY3R1cmluZyMzMgotbmFpY3MjMzIyMSNQdWxwLCBQYXBlciwgYW5kIFBhcGVyYm9hcmQgTWlsbHMjMzIyCi1uYWljcyMzMjIxMSNQdWxwIE1pbGxzIzMyMjEKLW5haWNzIzMyMjEyI1BhcGVyIE1pbGxzIzMyMjEKLW5haWNzIzMyMjEyMSNQYXBlciAoZXhjZXB0IE5ld3NwcmludCkgTWlsbHMjMzIyMTIKLW5haWNzIzMyMjEyMiNOZXdzcHJpbnQgTWlsbHMjMzIyMTIKLW5haWNzIzMyMjEzI1BhcGVyYm9hcmQgTWlsbHMjMzIyMQotbmFpY3MjMzIyMiNDb252ZXJ0ZWQgUGFwZXIgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMgotbmFpY3MjMzIyMjEjUGFwZXJib2FyZCBDb250YWluZXIgTWFudWZhY3R1cmluZyMzMjIyCi1uYWljcyMzMjIyMTEjQ29ycnVnYXRlZCBhbmQgU29saWQgRmliZXIgQm94IE1hbnVmYWN0dXJpbmcjMzIyMjEKLW5haWNzIzMyMjIxMiNGb2xkaW5nIFBhcGVyYm9hcmQgQm94IE1hbnVmYWN0dXJpbmcjMzIyMjEKLW5haWNzIzMyMjIxMyNTZXR1cCBQYXBlcmJvYXJkIEJveCBNYW51ZmFjdHVyaW5nIzMyMjIxCi1uYWljcyMzMjIyMTQjRmliZXIgQ2FuLCBUdWJlLCBEcnVtLCBhbmQgU2ltaWxhciBQcm9kdWN0cyBNYW51ZmFjdHVyaW5nIzMyMjIxCi1uYWljcyMzMjIyMTUjTm9uZm9sZGluZyBTYW5pdGFyeSBGb29kIENvbnRhaW5lciBNYW51ZmFjdHVyaW5nIzMyMjIxCi1uYWljcyMzMjIyMiNQYXBlciBCYWcgYW5kIENvYXRlZCBhbmQgVHJlYXRlZCBQYXBlciBNYW51ZmFjdHVyaW5nIzMyMjIKLW5haWNzIzMyMjIyMSNDb2F0ZWQgYW5kIExhbWluYXRlZCBQYWNrYWdpbmcgUGFwZXIgYW5kIFBsYXN0aWNzIEZpbG0gTWFudWZhY3R1cmluZyMzMjIyMgotbmFpY3MjMzIyMjIyI0NvYXRlZCBhbmQgTGFtaW5hdGVkIFBhcGVyIE1hbnVmYWN0dXJpbmcjMzIyMjIKLW5haWNzIzMyMjIyMyNQbGFzdGljcywgRm9pbCwgYW5kIENvYXRlZCBQYXBlciBCYWcgTWFudWZhY3R1cmluZyMzMjIyMgotbmFpY3MjMzIyMjI0I1VuY29hdGVkIFBhcGVyIGFuZCBNdWx0aXdhbGwgQmFnIE1hbnVmYWN0dXJpbmcjMzIyMjIKLW5haWNzIzMyMjIyNSNMYW1pbmF0ZWQgQWx1bWludW0gRm9pbCBNYW51ZmFjdHVyaW5nIGZvciBGbGV4aWJsZSBQYWNrYWdpbmcgVXNlcyMzMjIyMgotbmFpY3MjMzIyMjI2I1N1cmZhY2UtQ29hdGVkIFBhcGVyYm9hcmQgTWFudWZhY3R1cmluZyMzMjIyMgotbmFpY3MjMzIyMjMjU3RhdGlvbmVyeSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIyMgotbmFpY3MjMzIyMjMxI0RpZS1DdXQgUGFwZXIgYW5kIFBhcGVyYm9hcmQgT2ZmaWNlIFN1cHBsaWVzIE1hbnVmYWN0dXJpbmcjMzIyMjMKLW5haWNzIzMyMjIzMiNFbnZlbG9wZSBNYW51ZmFjdHVyaW5nIzMyMjIzCi1uYWljcyMzMjIyMzMjU3RhdGlvbmVyeSwgVGFibGV0LCBhbmQgUmVsYXRlZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIyMjMKLW5haWNzIzMyMjI5I090aGVyIENvbnZlcnRlZCBQYXBlciBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIyMgotbmFpY3MjMzIyMjkxI1Nhbml0YXJ5IFBhcGVyIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjIyOQotbmFpY3MjMzIyMjk5I0FsbCBPdGhlciBDb252ZXJ0ZWQgUGFwZXIgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMjI5Ci1uYWljcyMzMjMjUHJpbnRpbmcgYW5kIFJlbGF0ZWQgU3VwcG9ydCBBY3Rpdml0aWVzIzMyCi1uYWljcyMzMjMxI1ByaW50aW5nIGFuZCBSZWxhdGVkIFN1cHBvcnQgQWN0aXZpdGllcyMzMjMKLW5haWNzIzMyMzExI1ByaW50aW5nIzMyMzEKLW5haWNzIzMyMzExMCNDb21tZXJjaWFsIExpdGhvZ3JhcGhpYyBQcmludGluZyMzMjMxMQotbmFpY3MjMzIzMTExI0NvbW1lcmNpYWwgR3JhdnVyZSBQcmludGluZyMzMjMxMQotbmFpY3MjMzIzMTEyI0NvbW1lcmNpYWwgRmxleG9ncmFwaGljIFByaW50aW5nIzMyMzExCi1uYWljcyMzMjMxMTMjQ29tbWVyY2lhbCBTY3JlZW4gUHJpbnRpbmcjMzIzMTEKLW5haWNzIzMyMzExNCNRdWljayBQcmludGluZyMzMjMxMQotbmFpY3MjMzIzMTE1I0RpZ2l0YWwgUHJpbnRpbmcjMzIzMTEKLW5haWNzIzMyMzExNiNNYW5pZm9sZCBCdXNpbmVzcyBGb3JtcyBQcmludGluZyMzMjMxMQotbmFpY3MjMzIzMTE3I0Jvb2tzIFByaW50aW5nIzMyMzExCi1uYWljcyMzMjMxMTgjQmxhbmtib29rLCBMb29zZWxlYWYgQmluZGVycywgYW5kIERldmljZXMgTWFudWZhY3R1cmluZyMzMjMxMQotbmFpY3MjMzIzMTE5I090aGVyIENvbW1lcmNpYWwgUHJpbnRpbmcjMzIzMTEKLW5haWNzIzMyMzEyI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgUHJpbnRpbmcjMzIzMQotbmFpY3MjMzIzMTIxI1RyYWRlYmluZGluZyBhbmQgUmVsYXRlZCBXb3JrIzMyMzEyCi1uYWljcyMzMjMxMjIjUHJlcHJlc3MgU2VydmljZXMjMzIzMTIKLW5haWNzIzMyNCNQZXRyb2xldW0gYW5kIENvYWwgUHJvZHVjdHMgTWFudWZhY3R1cmluZyMzMgotbmFpY3MjMzI0MSNQZXRyb2xldW0gYW5kIENvYWwgUHJvZHVjdHMgTWFudWZhY3R1cmluZyMzMjQKLW5haWNzIzMyNDExI1BldHJvbGV1bSBSZWZpbmVyaWVzIzMyNDEKLW5haWNzIzMyNDEyI0FzcGhhbHQgUGF2aW5nLCBSb29maW5nLCBhbmQgU2F0dXJhdGVkIE1hdGVyaWFscyBNYW51ZmFjdHVyaW5nIzMyNDEKLW5haWNzIzMyNDEyMSNBc3BoYWx0IFBhdmluZyBNaXh0dXJlIGFuZCBCbG9jayBNYW51ZmFjdHVyaW5nIzMyNDEyCi1uYWljcyMzMjQxMjIjQXNwaGFsdCBTaGluZ2xlIGFuZCBDb2F0aW5nIE1hdGVyaWFscyBNYW51ZmFjdHVyaW5nIzMyNDEyCi1uYWljcyMzMjQxOSNPdGhlciBQZXRyb2xldW0gYW5kIENvYWwgUHJvZHVjdHMgTWFudWZhY3R1cmluZyMzMjQxCi1uYWljcyMzMjQxOTEjUGV0cm9sZXVtIEx1YnJpY2F0aW5nIE9pbCBhbmQgR3JlYXNlIE1hbnVmYWN0dXJpbmcjMzI0MTkKLW5haWNzIzMyNDE5OSNBbGwgT3RoZXIgUGV0cm9sZXVtIGFuZCBDb2FsIFByb2R1Y3RzIE1hbnVmYWN0dXJpbmcjMzI0MTkKLW5haWNzIzMyNSNDaGVtaWNhbCBNYW51ZmFjdHVyaW5nIzMyCi1uYWljcyMzMjUxI0Jhc2ljIENoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjUxMSNQZXRyb2NoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1MQotbmFpY3MjMzI1MTIjSW5kdXN0cmlhbCBHYXMgTWFudWZhY3R1cmluZyMzMjUxCi1uYWljcyMzMjUxMyNTeW50aGV0aWMgRHllIGFuZCBQaWdtZW50IE1hbnVmYWN0dXJpbmcjMzI1MQotbmFpY3MjMzI1MTMxI0lub3JnYW5pYyBEeWUgYW5kIFBpZ21lbnQgTWFudWZhY3R1cmluZyMzMjUxMwotbmFpY3MjMzI1MTMyI1N5bnRoZXRpYyBPcmdhbmljIER5ZSBhbmQgUGlnbWVudCBNYW51ZmFjdHVyaW5nIzMyNTEzCi1uYWljcyMzMjUxOCNPdGhlciBCYXNpYyBJbm9yZ2FuaWMgQ2hlbWljYWwgTWFudWZhY3R1cmluZyMzMjUxCi1uYWljcyMzMjUxODEjQWxrYWxpZXMgYW5kIENobG9yaW5lIE1hbnVmYWN0dXJpbmcjMzI1MTgKLW5haWNzIzMyNTE4MiNDYXJib24gQmxhY2sgTWFudWZhY3R1cmluZyMzMjUxOAotbmFpY3MjMzI1MTg4I0FsbCBPdGhlciBCYXNpYyBJbm9yZ2FuaWMgQ2hlbWljYWwgTWFudWZhY3R1cmluZyMzMjUxOAotbmFpY3MjMzI1MTkjT3RoZXIgQmFzaWMgT3JnYW5pYyBDaGVtaWNhbCBNYW51ZmFjdHVyaW5nIzMyNTEKLW5haWNzIzMyNTE5MSNHdW0gYW5kIFdvb2QgQ2hlbWljYWwgTWFudWZhY3R1cmluZyMzMjUxOQotbmFpY3MjMzI1MTkyI0N5Y2xpYyBDcnVkZSBhbmQgSW50ZXJtZWRpYXRlIE1hbnVmYWN0dXJpbmcjMzI1MTkKLW5haWNzIzMyNTE5MyNFdGh5bCBBbGNvaG9sIE1hbnVmYWN0dXJpbmcjMzI1MTkKLW5haWNzIzMyNTE5OSNBbGwgT3RoZXIgQmFzaWMgT3JnYW5pYyBDaGVtaWNhbCBNYW51ZmFjdHVyaW5nIzMyNTE5Ci1uYWljcyMzMjUyI1Jlc2luLCBTeW50aGV0aWMgUnViYmVyLCBhbmQgQXJ0aWZpY2lhbCBhbmQgU3ludGhldGljIEZpYmVycyBhbmQgRmlsYW1lbnRzIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjUyMSNSZXNpbiBhbmQgU3ludGhldGljIFJ1YmJlciBNYW51ZmFjdHVyaW5nIzMyNTIKLW5haWNzIzMyNTIxMSNQbGFzdGljcyBNYXRlcmlhbCBhbmQgUmVzaW4gTWFudWZhY3R1cmluZyMzMjUyMQotbmFpY3MjMzI1MjEyI1N5bnRoZXRpYyBSdWJiZXIgTWFudWZhY3R1cmluZyMzMjUyMQotbmFpY3MjMzI1MjIjQXJ0aWZpY2lhbCBhbmQgU3ludGhldGljIEZpYmVycyBhbmQgRmlsYW1lbnRzIE1hbnVmYWN0dXJpbmcjMzI1MgotbmFpY3MjMzI1MjIxI0NlbGx1bG9zaWMgT3JnYW5pYyBGaWJlciBNYW51ZmFjdHVyaW5nIzMyNTIyCi1uYWljcyMzMjUyMjIjTm9uY2VsbHVsb3NpYyBPcmdhbmljIEZpYmVyIE1hbnVmYWN0dXJpbmcjMzI1MjIKLW5haWNzIzMyNTMjUGVzdGljaWRlLCBGZXJ0aWxpemVyLCBhbmQgT3RoZXIgQWdyaWN1bHR1cmFsIENoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjUzMSNGZXJ0aWxpemVyIE1hbnVmYWN0dXJpbmcjMzI1MwotbmFpY3MjMzI1MzExI05pdHJvZ2Vub3VzIEZlcnRpbGl6ZXIgTWFudWZhY3R1cmluZyMzMjUzMQotbmFpY3MjMzI1MzEyI1Bob3NwaGF0aWMgRmVydGlsaXplciBNYW51ZmFjdHVyaW5nIzMyNTMxCi1uYWljcyMzMjUzMTQjRmVydGlsaXplciAoTWl4aW5nIE9ubHkpIE1hbnVmYWN0dXJpbmcjMzI1MzEKLW5haWNzIzMyNTMyI1Blc3RpY2lkZSBhbmQgT3RoZXIgQWdyaWN1bHR1cmFsIENoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1MwotbmFpY3MjMzI1NCNQaGFybWFjZXV0aWNhbCBhbmQgTWVkaWNpbmUgTWFudWZhY3R1cmluZyMzMjUKLW5haWNzIzMyNTQxI1BoYXJtYWNldXRpY2FsIGFuZCBNZWRpY2luZSBNYW51ZmFjdHVyaW5nIzMyNTQKLW5haWNzIzMyNTQxMSNNZWRpY2luYWwgYW5kIEJvdGFuaWNhbCBNYW51ZmFjdHVyaW5nIzMyNTQxCi1uYWljcyMzMjU0MTIjUGhhcm1hY2V1dGljYWwgUHJlcGFyYXRpb24gTWFudWZhY3R1cmluZyMzMjU0MQotbmFpY3MjMzI1NDEzI0luLVZpdHJvIERpYWdub3N0aWMgU3Vic3RhbmNlIE1hbnVmYWN0dXJpbmcjMzI1NDEKLW5haWNzIzMyNTQxNCNCaW9sb2dpY2FsIFByb2R1Y3QgKGV4Y2VwdCBEaWFnbm9zdGljKSBNYW51ZmFjdHVyaW5nIzMyNTQxCi1uYWljcyMzMjU1I1BhaW50LCBDb2F0aW5nLCBhbmQgQWRoZXNpdmUgTWFudWZhY3R1cmluZyMzMjUKLW5haWNzIzMyNTUxI1BhaW50IGFuZCBDb2F0aW5nIE1hbnVmYWN0dXJpbmcjMzI1NQotbmFpY3MjMzI1NTIjQWRoZXNpdmUgTWFudWZhY3R1cmluZyMzMjU1Ci1uYWljcyMzMjU2I1NvYXAsIENsZWFuaW5nIENvbXBvdW5kLCBhbmQgVG9pbGV0IFByZXBhcmF0aW9uIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjU2MSNTb2FwIGFuZCBDbGVhbmluZyBDb21wb3VuZCBNYW51ZmFjdHVyaW5nIzMyNTYKLW5haWNzIzMyNTYxMSNTb2FwIGFuZCBPdGhlciBEZXRlcmdlbnQgTWFudWZhY3R1cmluZyMzMjU2MQotbmFpY3MjMzI1NjEyI1BvbGlzaCBhbmQgT3RoZXIgU2FuaXRhdGlvbiBHb29kIE1hbnVmYWN0dXJpbmcjMzI1NjEKLW5haWNzIzMyNTYxMyNTdXJmYWNlIEFjdGl2ZSBBZ2VudCBNYW51ZmFjdHVyaW5nIzMyNTYxCi1uYWljcyMzMjU2MiNUb2lsZXQgUHJlcGFyYXRpb24gTWFudWZhY3R1cmluZyMzMjU2Ci1uYWljcyMzMjU5I090aGVyIENoZW1pY2FsIFByb2R1Y3QgYW5kIFByZXBhcmF0aW9uIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjU5MSNQcmludGluZyBJbmsgTWFudWZhY3R1cmluZyMzMjU5Ci1uYWljcyMzMjU5MiNFeHBsb3NpdmVzIE1hbnVmYWN0dXJpbmcjMzI1OQotbmFpY3MjMzI1OTkjQWxsIE90aGVyIENoZW1pY2FsIFByb2R1Y3QgYW5kIFByZXBhcmF0aW9uIE1hbnVmYWN0dXJpbmcjMzI1OQotbmFpY3MjMzI1OTkxI0N1c3RvbSBDb21wb3VuZGluZyBvZiBQdXJjaGFzZWQgUmVzaW5zIzMyNTk5Ci1uYWljcyMzMjU5OTIjUGhvdG9ncmFwaGljIEZpbG0sIFBhcGVyLCBQbGF0ZSwgYW5kIENoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1OTkKLW5haWNzIzMyNTk5OCNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBDaGVtaWNhbCBQcm9kdWN0IGFuZCBQcmVwYXJhdGlvbiBNYW51ZmFjdHVyaW5nIzMyNTk5Ci1uYWljcyMzMjYjUGxhc3RpY3MgYW5kIFJ1YmJlciBQcm9kdWN0cyBNYW51ZmFjdHVyaW5nIzMyCi1uYWljcyMzMjYxI1BsYXN0aWNzIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjYKLW5haWNzIzMyNjExI1Vuc3VwcG9ydGVkIFBsYXN0aWNzIEZpbG0sIFNoZWV0LCBhbmQgQmFnIE1hbnVmYWN0dXJpbmcjMzI2MQotbmFpY3MjMzI2MTExI1Vuc3VwcG9ydGVkIFBsYXN0aWNzIEJhZyBNYW51ZmFjdHVyaW5nIzMyNjExCi1uYWljcyMzMjYxMTIjVW5zdXBwb3J0ZWQgUGxhc3RpY3MgUGFja2FnaW5nIEZpbG0gYW5kIFNoZWV0IE1hbnVmYWN0dXJpbmcjMzI2MTEKLW5haWNzIzMyNjExMyNVbnN1cHBvcnRlZCBQbGFzdGljcyBGaWxtIGFuZCBTaGVldCAoZXhjZXB0IFBhY2thZ2luZykgTWFudWZhY3R1cmluZyMzMjYxMQotbmFpY3MjMzI2MTIjUGxhc3RpY3MgUGlwZSwgUGlwZSBGaXR0aW5nLCBhbmQgVW5zdXBwb3J0ZWQgUHJvZmlsZSBTaGFwZSBNYW51ZmFjdHVyaW5nIzMyNjEKLW5haWNzIzMyNjEyMSNVbnN1cHBvcnRlZCBQbGFzdGljcyBQcm9maWxlIFNoYXBlIE1hbnVmYWN0dXJpbmcjMzI2MTIKLW5haWNzIzMyNjEyMiNQbGFzdGljcyBQaXBlIGFuZCBQaXBlIEZpdHRpbmcgTWFudWZhY3R1cmluZyMzMjYxMgotbmFpY3MjMzI2MTMjTGFtaW5hdGVkIFBsYXN0aWNzIFBsYXRlLCBTaGVldCwgYW5kIFNoYXBlIE1hbnVmYWN0dXJpbmcjMzI2MQotbmFpY3MjMzI2MTQjUG9seXN0eXJlbmUgRm9hbSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI2MQotbmFpY3MjMzI2MTUjVXJldGhhbmUgYW5kIE90aGVyIEZvYW0gUHJvZHVjdCAoZXhjZXB0IFBvbHlzdHlyZW5lKSBNYW51ZmFjdHVyaW5nIzMyNjEKLW5haWNzIzMyNjE2I1BsYXN0aWNzIEJvdHRsZSBNYW51ZmFjdHVyaW5nIzMyNjEKLW5haWNzIzMyNjE5I090aGVyIFBsYXN0aWNzIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjYxCi1uYWljcyMzMjYxOTEjUGxhc3RpY3MgUGx1bWJpbmcgRml4dHVyZSBNYW51ZmFjdHVyaW5nIzMyNjE5Ci1uYWljcyMzMjYxOTIjUmVzaWxpZW50IEZsb29yIENvdmVyaW5nIE1hbnVmYWN0dXJpbmcjMzI2MTkKLW5haWNzIzMyNjE5OSNBbGwgT3RoZXIgUGxhc3RpY3MgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyNjE5Ci1uYWljcyMzMjYyI1J1YmJlciBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI2Ci1uYWljcyMzMjYyMSNUaXJlIE1hbnVmYWN0dXJpbmcjMzI2MgotbmFpY3MjMzI2MjExI1RpcmUgTWFudWZhY3R1cmluZyAoZXhjZXB0IFJldHJlYWRpbmcpIzMyNjIxCi1uYWljcyMzMjYyMTIjVGlyZSBSZXRyZWFkaW5nIzMyNjIxCi1uYWljcyMzMjYyMiNSdWJiZXIgYW5kIFBsYXN0aWNzIEhvc2VzIGFuZCBCZWx0aW5nIE1hbnVmYWN0dXJpbmcjMzI2MgotbmFpY3MjMzI2MjkjT3RoZXIgUnViYmVyIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjYyCi1uYWljcyMzMjYyOTEjUnViYmVyIFByb2R1Y3QgTWFudWZhY3R1cmluZyBmb3IgTWVjaGFuaWNhbCBVc2UjMzI2MjkKLW5haWNzIzMyNjI5OSNBbGwgT3RoZXIgUnViYmVyIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjYyOQotbmFpY3MjMzI3I05vbm1ldGFsbGljIE1pbmVyYWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyCi1uYWljcyMzMjcxI0NsYXkgUHJvZHVjdCBhbmQgUmVmcmFjdG9yeSBNYW51ZmFjdHVyaW5nIzMyNwotbmFpY3MjMzI3MTEjUG90dGVyeSwgQ2VyYW1pY3MsIGFuZCBQbHVtYmluZyBGaXh0dXJlIE1hbnVmYWN0dXJpbmcjMzI3MQotbmFpY3MjMzI3MTExI1ZpdHJlb3VzIENoaW5hIFBsdW1iaW5nIEZpeHR1cmUgYW5kIENoaW5hIGFuZCBFYXJ0aGVud2FyZSBCYXRocm9vbSBBY2Nlc3NvcmllcyBNYW51ZmFjdHVyaW5nIzMyNzExCi1uYWljcyMzMjcxMTIjVml0cmVvdXMgQ2hpbmEsIEZpbmUgRWFydGhlbndhcmUsIGFuZCBPdGhlciBQb3R0ZXJ5IFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjcxMQotbmFpY3MjMzI3MTEzI1BvcmNlbGFpbiBFbGVjdHJpY2FsIFN1cHBseSBNYW51ZmFjdHVyaW5nIzMyNzExCi1uYWljcyMzMjcxMiNDbGF5IEJ1aWxkaW5nIE1hdGVyaWFsIGFuZCBSZWZyYWN0b3JpZXMgTWFudWZhY3R1cmluZyMzMjcxCi1uYWljcyMzMjcxMjEjQnJpY2sgYW5kIFN0cnVjdHVyYWwgQ2xheSBUaWxlIE1hbnVmYWN0dXJpbmcjMzI3MTIKLW5haWNzIzMyNzEyMiNDZXJhbWljIFdhbGwgYW5kIEZsb29yIFRpbGUgTWFudWZhY3R1cmluZyMzMjcxMgotbmFpY3MjMzI3MTIzI090aGVyIFN0cnVjdHVyYWwgQ2xheSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI3MTIKLW5haWNzIzMyNzEyNCNDbGF5IFJlZnJhY3RvcnkgTWFudWZhY3R1cmluZyMzMjcxMgotbmFpY3MjMzI3MTI1I05vbmNsYXkgUmVmcmFjdG9yeSBNYW51ZmFjdHVyaW5nIzMyNzEyCi1uYWljcyMzMjcyI0dsYXNzIGFuZCBHbGFzcyBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI3Ci1uYWljcyMzMjcyMSNHbGFzcyBhbmQgR2xhc3MgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyNzIKLW5haWNzIzMyNzIxMSNGbGF0IEdsYXNzIE1hbnVmYWN0dXJpbmcjMzI3MjEKLW5haWNzIzMyNzIxMiNPdGhlciBQcmVzc2VkIGFuZCBCbG93biBHbGFzcyBhbmQgR2xhc3N3YXJlIE1hbnVmYWN0dXJpbmcjMzI3MjEKLW5haWNzIzMyNzIxMyNHbGFzcyBDb250YWluZXIgTWFudWZhY3R1cmluZyMzMjcyMQotbmFpY3MjMzI3MjE1I0dsYXNzIFByb2R1Y3QgTWFudWZhY3R1cmluZyBNYWRlIG9mIFB1cmNoYXNlZCBHbGFzcyMzMjcyMQotbmFpY3MjMzI3MyNDZW1lbnQgYW5kIENvbmNyZXRlIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjcKLW5haWNzIzMyNzMxI0NlbWVudCBNYW51ZmFjdHVyaW5nIzMyNzMKLW5haWNzIzMyNzMyI1JlYWR5LU1peCBDb25jcmV0ZSBNYW51ZmFjdHVyaW5nIzMyNzMKLW5haWNzIzMyNzMzI0NvbmNyZXRlIFBpcGUsIEJyaWNrLCBhbmQgQmxvY2sgTWFudWZhY3R1cmluZyMzMjczCi1uYWljcyMzMjczMzEjQ29uY3JldGUgQmxvY2sgYW5kIEJyaWNrIE1hbnVmYWN0dXJpbmcjMzI3MzMKLW5haWNzIzMyNzMzMiNDb25jcmV0ZSBQaXBlIE1hbnVmYWN0dXJpbmcjMzI3MzMKLW5haWNzIzMyNzM5I090aGVyIENvbmNyZXRlIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjczCi1uYWljcyMzMjc0I0xpbWUgYW5kIEd5cHN1bSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI3Ci1uYWljcyMzMjc0MSNMaW1lIE1hbnVmYWN0dXJpbmcjMzI3NAotbmFpY3MjMzI3NDIjR3lwc3VtIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjc0Ci1uYWljcyMzMjc5I090aGVyIE5vbm1ldGFsbGljIE1pbmVyYWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyNwotbmFpY3MjMzI3OTEjQWJyYXNpdmUgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyNzkKLW5haWNzIzMyNzk5I0FsbCBPdGhlciBOb25tZXRhbGxpYyBNaW5lcmFsIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjc5Ci1uYWljcyMzMjc5OTEjQ3V0IFN0b25lIGFuZCBTdG9uZSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI3OTkKLW5haWNzIzMyNzk5MiNHcm91bmQgb3IgVHJlYXRlZCBNaW5lcmFsIGFuZCBFYXJ0aCBNYW51ZmFjdHVyaW5nIzMyNzk5Ci1uYWljcyMzMjc5OTMjTWluZXJhbCBXb29sIE1hbnVmYWN0dXJpbmcjMzI3OTkKLW5haWNzIzMyNzk5OSNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBOb25tZXRhbGxpYyBNaW5lcmFsIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjc5OQotbmFpY3MjMzMjTWFudWZhY3R1cmluZyMzMwotbmFpY3MjMzMxI1ByaW1hcnkgTWV0YWwgTWFudWZhY3R1cmluZyMzMwotbmFpY3MjMzMxMSNJcm9uIGFuZCBTdGVlbCBNaWxscyBhbmQgRmVycm9hbGxveSBNYW51ZmFjdHVyaW5nIzMzMQotbmFpY3MjMzMxMTEjSXJvbiBhbmQgU3RlZWwgTWlsbHMgYW5kIEZlcnJvYWxsb3kgTWFudWZhY3R1cmluZyMzMzExCi1uYWljcyMzMzExMTEjSXJvbiBhbmQgU3RlZWwgTWlsbHMjMzMxMTEKLW5haWNzIzMzMTExMiNFbGVjdHJvbWV0YWxsdXJnaWNhbCBGZXJyb2FsbG95IFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMzExMQotbmFpY3MjMzMxMiNTdGVlbCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcgZnJvbSBQdXJjaGFzZWQgU3RlZWwjMzMxCi1uYWljcyMzMzEyMSNJcm9uIGFuZCBTdGVlbCBQaXBlIGFuZCBUdWJlIE1hbnVmYWN0dXJpbmcgZnJvbSBQdXJjaGFzZWQgU3RlZWwjMzMxMgotbmFpY3MjMzMxMjIjUm9sbGluZyBhbmQgRHJhd2luZyBvZiBQdXJjaGFzZWQgU3RlZWwjMzMxMgotbmFpY3MjMzMxMjIxI1JvbGxlZCBTdGVlbCBTaGFwZSBNYW51ZmFjdHVyaW5nIzMzMTIyCi1uYWljcyMzMzEyMjIjU3RlZWwgV2lyZSBEcmF3aW5nIzMzMTIyCi1uYWljcyMzMzEzI0FsdW1pbmEgYW5kIEFsdW1pbnVtIFByb2R1Y3Rpb24gYW5kIFByb2Nlc3NpbmcjMzMxCi1uYWljcyMzMzEzMSNBbHVtaW5hIGFuZCBBbHVtaW51bSBQcm9kdWN0aW9uIGFuZCBQcm9jZXNzaW5nIzMzMTMKLW5haWNzIzMzMTMxMSNBbHVtaW5hIFJlZmluaW5nIzMzMTMxCi1uYWljcyMzMzEzMTIjUHJpbWFyeSBBbHVtaW51bSBQcm9kdWN0aW9uIzMzMTMxCi1uYWljcyMzMzEzMTQjU2Vjb25kYXJ5IFNtZWx0aW5nIGFuZCBBbGxveWluZyBvZiBBbHVtaW51bSMzMzEzMQotbmFpY3MjMzMxMzE1I0FsdW1pbnVtIFNoZWV0LCBQbGF0ZSwgYW5kIEZvaWwgTWFudWZhY3R1cmluZyMzMzEzMQotbmFpY3MjMzMxMzE2I0FsdW1pbnVtIEV4dHJ1ZGVkIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMzEzMQotbmFpY3MjMzMxMzE5I090aGVyIEFsdW1pbnVtIFJvbGxpbmcgYW5kIERyYXdpbmcjMzMxMzEKLW5haWNzIzMzMTQjTm9uZmVycm91cyBNZXRhbCAoZXhjZXB0IEFsdW1pbnVtKSBQcm9kdWN0aW9uIGFuZCBQcm9jZXNzaW5nIzMzMQotbmFpY3MjMzMxNDEjTm9uZmVycm91cyBNZXRhbCAoZXhjZXB0IEFsdW1pbnVtKSBTbWVsdGluZyBhbmQgUmVmaW5pbmcjMzMxNAotbmFpY3MjMzMxNDExI1ByaW1hcnkgU21lbHRpbmcgYW5kIFJlZmluaW5nIG9mIENvcHBlciMzMzE0MQotbmFpY3MjMzMxNDE5I1ByaW1hcnkgU21lbHRpbmcgYW5kIFJlZmluaW5nIG9mIE5vbmZlcnJvdXMgTWV0YWwgKGV4Y2VwdCBDb3BwZXIgYW5kIEFsdW1pbnVtKSMzMzE0MQotbmFpY3MjMzMxNDIjQ29wcGVyIFJvbGxpbmcsIERyYXdpbmcsIEV4dHJ1ZGluZywgYW5kIEFsbG95aW5nIzMzMTQKLW5haWNzIzMzMTQyMSNDb3BwZXIgUm9sbGluZywgRHJhd2luZywgYW5kIEV4dHJ1ZGluZyMzMzE0MgotbmFpY3MjMzMxNDIyI0NvcHBlciBXaXJlIChleGNlcHQgTWVjaGFuaWNhbCkgRHJhd2luZyMzMzE0MgotbmFpY3MjMzMxNDIzI1NlY29uZGFyeSBTbWVsdGluZywgUmVmaW5pbmcsIGFuZCBBbGxveWluZyBvZiBDb3BwZXIjMzMxNDIKLW5haWNzIzMzMTQ5I05vbmZlcnJvdXMgTWV0YWwgKGV4Y2VwdCBDb3BwZXIgYW5kIEFsdW1pbnVtKSBSb2xsaW5nLCBEcmF3aW5nLCBFeHRydWRpbmcsIGFuZCBBbGxveWluZyMzMzE0Ci1uYWljcyMzMzE0OTEjTm9uZmVycm91cyBNZXRhbCAoZXhjZXB0IENvcHBlciBhbmQgQWx1bWludW0pIFJvbGxpbmcsIERyYXdpbmcsIGFuZCBFeHRydWRpbmcjMzMxNDkKLW5haWNzIzMzMTQ5MiNTZWNvbmRhcnkgU21lbHRpbmcsIFJlZmluaW5nLCBhbmQgQWxsb3lpbmcgb2YgTm9uZmVycm91cyBNZXRhbCAoZXhjZXB0IENvcHBlciBhbmQgQWx1bWludW0pIzMzMTQ5Ci1uYWljcyMzMzE1I0ZvdW5kcmllcyMzMzEKLW5haWNzIzMzMTUxI0ZlcnJvdXMgTWV0YWwgRm91bmRyaWVzIzMzMTUKLW5haWNzIzMzMTUxMSNJcm9uIEZvdW5kcmllcyMzMzE1MQotbmFpY3MjMzMxNTEyI1N0ZWVsIEludmVzdG1lbnQgRm91bmRyaWVzIzMzMTUxCi1uYWljcyMzMzE1MTMjU3RlZWwgRm91bmRyaWVzIChleGNlcHQgSW52ZXN0bWVudCkjMzMxNTEKLW5haWNzIzMzMTUyI05vbmZlcnJvdXMgTWV0YWwgRm91bmRyaWVzIzMzMTUKLW5haWNzIzMzMTUyMSNBbHVtaW51bSBEaWUtQ2FzdGluZyBGb3VuZHJpZXMjMzMxNTIKLW5haWNzIzMzMTUyMiNOb25mZXJyb3VzIChleGNlcHQgQWx1bWludW0pIERpZS1DYXN0aW5nIEZvdW5kcmllcyMzMzE1MgotbmFpY3MjMzMxNTI0I0FsdW1pbnVtIEZvdW5kcmllcyAoZXhjZXB0IERpZS1DYXN0aW5nKSMzMzE1MgotbmFpY3MjMzMxNTI1I0NvcHBlciBGb3VuZHJpZXMgKGV4Y2VwdCBEaWUtQ2FzdGluZykjMzMxNTIKLW5haWNzIzMzMTUyOCNPdGhlciBOb25mZXJyb3VzIEZvdW5kcmllcyAoZXhjZXB0IERpZS1DYXN0aW5nKSMzMzE1MgotbmFpY3MjMzMyI0ZhYnJpY2F0ZWQgTWV0YWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzCi1uYWljcyMzMzIxI0ZvcmdpbmcgYW5kIFN0YW1waW5nIzMzMgotbmFpY3MjMzMyMTEjRm9yZ2luZyBhbmQgU3RhbXBpbmcjMzMyMQotbmFpY3MjMzMyMTExI0lyb24gYW5kIFN0ZWVsIEZvcmdpbmcjMzMyMTEKLW5haWNzIzMzMjExMiNOb25mZXJyb3VzIEZvcmdpbmcjMzMyMTEKLW5haWNzIzMzMjExNCNDdXN0b20gUm9sbCBGb3JtaW5nIzMzMjExCi1uYWljcyMzMzIxMTUjQ3Jvd24gYW5kIENsb3N1cmUgTWFudWZhY3R1cmluZyMzMzIxMQotbmFpY3MjMzMyMTE2I01ldGFsIFN0YW1waW5nIzMzMjExCi1uYWljcyMzMzIxMTcjUG93ZGVyIE1ldGFsbHVyZ3kgUGFydCBNYW51ZmFjdHVyaW5nIzMzMjExCi1uYWljcyMzMzIyI0N1dGxlcnkgYW5kIEhhbmR0b29sIE1hbnVmYWN0dXJpbmcjMzMyCi1uYWljcyMzMzIyMSNDdXRsZXJ5IGFuZCBIYW5kdG9vbCBNYW51ZmFjdHVyaW5nIzMzMjIKLW5haWNzIzMzMjIxMSNDdXRsZXJ5IGFuZCBGbGF0d2FyZSAoZXhjZXB0IFByZWNpb3VzKSBNYW51ZmFjdHVyaW5nIzMzMjIxCi1uYWljcyMzMzIyMTIjSGFuZCBhbmQgRWRnZSBUb29sIE1hbnVmYWN0dXJpbmcjMzMyMjEKLW5haWNzIzMzMjIxMyNTYXcgQmxhZGUgYW5kIEhhbmRzYXcgTWFudWZhY3R1cmluZyMzMzIyMQotbmFpY3MjMzMyMjE0I0tpdGNoZW4gVXRlbnNpbCwgUG90LCBhbmQgUGFuIE1hbnVmYWN0dXJpbmcjMzMyMjEKLW5haWNzIzMzMjMjQXJjaGl0ZWN0dXJhbCBhbmQgU3RydWN0dXJhbCBNZXRhbHMgTWFudWZhY3R1cmluZyMzMzIKLW5haWNzIzMzMjMxI1BsYXRlIFdvcmsgYW5kIEZhYnJpY2F0ZWQgU3RydWN0dXJhbCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzMyMwotbmFpY3MjMzMyMzExI1ByZWZhYnJpY2F0ZWQgTWV0YWwgQnVpbGRpbmcgYW5kIENvbXBvbmVudCBNYW51ZmFjdHVyaW5nIzMzMjMxCi1uYWljcyMzMzIzMTIjRmFicmljYXRlZCBTdHJ1Y3R1cmFsIE1ldGFsIE1hbnVmYWN0dXJpbmcjMzMyMzEKLW5haWNzIzMzMjMxMyNQbGF0ZSBXb3JrIE1hbnVmYWN0dXJpbmcjMzMyMzEKLW5haWNzIzMzMjMyI09ybmFtZW50YWwgYW5kIEFyY2hpdGVjdHVyYWwgTWV0YWwgUHJvZHVjdHMgTWFudWZhY3R1cmluZyMzMzIzCi1uYWljcyMzMzIzMjEjTWV0YWwgV2luZG93IGFuZCBEb29yIE1hbnVmYWN0dXJpbmcjMzMyMzIKLW5haWNzIzMzMjMyMiNTaGVldCBNZXRhbCBXb3JrIE1hbnVmYWN0dXJpbmcjMzMyMzIKLW5haWNzIzMzMjMyMyNPcm5hbWVudGFsIGFuZCBBcmNoaXRlY3R1cmFsIE1ldGFsIFdvcmsgTWFudWZhY3R1cmluZyMzMzIzMgotbmFpY3MjMzMyNCNCb2lsZXIsIFRhbmssIGFuZCBTaGlwcGluZyBDb250YWluZXIgTWFudWZhY3R1cmluZyMzMzIKLW5haWNzIzMzMjQxI1Bvd2VyIEJvaWxlciBhbmQgSGVhdCBFeGNoYW5nZXIgTWFudWZhY3R1cmluZyMzMzI0Ci1uYWljcyMzMzI0MiNNZXRhbCBUYW5rIChIZWF2eSBHYXVnZSkgTWFudWZhY3R1cmluZyMzMzI0Ci1uYWljcyMzMzI0MyNNZXRhbCBDYW4sIEJveCwgYW5kIE90aGVyIE1ldGFsIENvbnRhaW5lciAoTGlnaHQgR2F1Z2UpIE1hbnVmYWN0dXJpbmcjMzMyNAotbmFpY3MjMzMyNDMxI01ldGFsIENhbiBNYW51ZmFjdHVyaW5nIzMzMjQzCi1uYWljcyMzMzI0MzkjT3RoZXIgTWV0YWwgQ29udGFpbmVyIE1hbnVmYWN0dXJpbmcjMzMyNDMKLW5haWNzIzMzMjUjSGFyZHdhcmUgTWFudWZhY3R1cmluZyMzMzIKLW5haWNzIzMzMjUxI0hhcmR3YXJlIE1hbnVmYWN0dXJpbmcjMzMyNQotbmFpY3MjMzMyNiNTcHJpbmcgYW5kIFdpcmUgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMgotbmFpY3MjMzMyNjEjU3ByaW5nIGFuZCBXaXJlIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMzI2Ci1uYWljcyMzMzI2MTEjU3ByaW5nIChIZWF2eSBHYXVnZSkgTWFudWZhY3R1cmluZyMzMzI2MQotbmFpY3MjMzMyNjEyI1NwcmluZyAoTGlnaHQgR2F1Z2UpIE1hbnVmYWN0dXJpbmcjMzMyNjEKLW5haWNzIzMzMjYxOCNPdGhlciBGYWJyaWNhdGVkIFdpcmUgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMjYxCi1uYWljcyMzMzI3I01hY2hpbmUgU2hvcHM7IFR1cm5lZCBQcm9kdWN0OyBhbmQgU2NyZXcsIE51dCwgYW5kIEJvbHQgTWFudWZhY3R1cmluZyMzMzIKLW5haWNzIzMzMjcxI01hY2hpbmUgU2hvcHMjMzMyNwotbmFpY3MjMzMyNzIjVHVybmVkIFByb2R1Y3QgYW5kIFNjcmV3LCBOdXQsIGFuZCBCb2x0IE1hbnVmYWN0dXJpbmcjMzMyNwotbmFpY3MjMzMyNzIxI1ByZWNpc2lvbiBUdXJuZWQgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMjcyCi1uYWljcyMzMzI3MjIjQm9sdCwgTnV0LCBTY3JldywgUml2ZXQsIGFuZCBXYXNoZXIgTWFudWZhY3R1cmluZyMzMzI3MgotbmFpY3MjMzMyOCNDb2F0aW5nLCBFbmdyYXZpbmcsIEhlYXQgVHJlYXRpbmcsIGFuZCBBbGxpZWQgQWN0aXZpdGllcyMzMzIKLW5haWNzIzMzMjgxI0NvYXRpbmcsIEVuZ3JhdmluZywgSGVhdCBUcmVhdGluZywgYW5kIEFsbGllZCBBY3Rpdml0aWVzIzMzMjgKLW5haWNzIzMzMjgxMSNNZXRhbCBIZWF0IFRyZWF0aW5nIzMzMjgxCi1uYWljcyMzMzI4MTIjTWV0YWwgQ29hdGluZywgRW5ncmF2aW5nIChleGNlcHQgSmV3ZWxyeSBhbmQgU2lsdmVyd2FyZSksIGFuZCBBbGxpZWQgU2VydmljZXMgdG8gTWFudWZhY3R1cmVycyMzMzI4MQotbmFpY3MjMzMyODEzI0VsZWN0cm9wbGF0aW5nLCBQbGF0aW5nLCBQb2xpc2hpbmcsIEFub2RpemluZywgYW5kIENvbG9yaW5nIzMzMjgxCi1uYWljcyMzMzI5I090aGVyIEZhYnJpY2F0ZWQgTWV0YWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMgotbmFpY3MjMzMyOTEjTWV0YWwgVmFsdmUgTWFudWZhY3R1cmluZyMzMzI5Ci1uYWljcyMzMzI5MTEjSW5kdXN0cmlhbCBWYWx2ZSBNYW51ZmFjdHVyaW5nIzMzMjkxCi1uYWljcyMzMzI5MTIjRmx1aWQgUG93ZXIgVmFsdmUgYW5kIEhvc2UgRml0dGluZyBNYW51ZmFjdHVyaW5nIzMzMjkxCi1uYWljcyMzMzI5MTMjUGx1bWJpbmcgRml4dHVyZSBGaXR0aW5nIGFuZCBUcmltIE1hbnVmYWN0dXJpbmcjMzMyOTEKLW5haWNzIzMzMjkxOSNPdGhlciBNZXRhbCBWYWx2ZSBhbmQgUGlwZSBGaXR0aW5nIE1hbnVmYWN0dXJpbmcjMzMyOTEKLW5haWNzIzMzMjk5I0FsbCBPdGhlciBGYWJyaWNhdGVkIE1ldGFsIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMzI5Ci1uYWljcyMzMzI5OTEjQmFsbCBhbmQgUm9sbGVyIEJlYXJpbmcgTWFudWZhY3R1cmluZyMzMzI5OQotbmFpY3MjMzMyOTkyI1NtYWxsIEFybXMgQW1tdW5pdGlvbiBNYW51ZmFjdHVyaW5nIzMzMjk5Ci1uYWljcyMzMzI5OTMjQW1tdW5pdGlvbiAoZXhjZXB0IFNtYWxsIEFybXMpIE1hbnVmYWN0dXJpbmcjMzMyOTkKLW5haWNzIzMzMjk5NCNTbWFsbCBBcm1zIE1hbnVmYWN0dXJpbmcjMzMyOTkKLW5haWNzIzMzMjk5NSNPdGhlciBPcmRuYW5jZSBhbmQgQWNjZXNzb3JpZXMgTWFudWZhY3R1cmluZyMzMzI5OQotbmFpY3MjMzMyOTk2I0ZhYnJpY2F0ZWQgUGlwZSBhbmQgUGlwZSBGaXR0aW5nIE1hbnVmYWN0dXJpbmcjMzMyOTkKLW5haWNzIzMzMjk5NyNJbmR1c3RyaWFsIFBhdHRlcm4gTWFudWZhY3R1cmluZyMzMzI5OQotbmFpY3MjMzMyOTk4I0VuYW1lbGVkIElyb24gYW5kIE1ldGFsIFNhbml0YXJ5IFdhcmUgTWFudWZhY3R1cmluZyMzMzI5OQotbmFpY3MjMzMyOTk5I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIEZhYnJpY2F0ZWQgTWV0YWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMjk5Ci1uYWljcyMzMzMjTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMKLW5haWNzIzMzMzEjQWdyaWN1bHR1cmUsIENvbnN0cnVjdGlvbiwgYW5kIE1pbmluZyBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMKLW5haWNzIzMzMzExI0FncmljdWx0dXJhbCBJbXBsZW1lbnQgTWFudWZhY3R1cmluZyMzMzMxCi1uYWljcyMzMzMxMTEjRmFybSBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzExCi1uYWljcyMzMzMxMTIjTGF3biBhbmQgR2FyZGVuIFRyYWN0b3IgYW5kIEhvbWUgTGF3biBhbmQgR2FyZGVuIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzExCi1uYWljcyMzMzMxMiNDb25zdHJ1Y3Rpb24gTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMQotbmFpY3MjMzMzMTMjTWluaW5nIGFuZCBPaWwgYW5kIEdhcyBGaWVsZCBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMxCi1uYWljcyMzMzMxMzEjTWluaW5nIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzMzMTMKLW5haWNzIzMzMzEzMiNPaWwgYW5kIEdhcyBGaWVsZCBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzEzCi1uYWljcyMzMzMyI0luZHVzdHJpYWwgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzCi1uYWljcyMzMzMyMSNTYXdtaWxsIGFuZCBXb29kd29ya2luZyBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMyCi1uYWljcyMzMzMyMiNQbGFzdGljcyBhbmQgUnViYmVyIEluZHVzdHJ5IE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzIKLW5haWNzIzMzMzI5I090aGVyIEluZHVzdHJpYWwgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMgotbmFpY3MjMzMzMjkxI1BhcGVyIEluZHVzdHJ5IE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzI5Ci1uYWljcyMzMzMyOTIjVGV4dGlsZSBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMyOQotbmFpY3MjMzMzMjkzI1ByaW50aW5nIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzMzMjkKLW5haWNzIzMzMzI5NCNGb29kIFByb2R1Y3QgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMjkKLW5haWNzIzMzMzI5NSNTZW1pY29uZHVjdG9yIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzI5Ci1uYWljcyMzMzMyOTgjQWxsIE90aGVyIEluZHVzdHJpYWwgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMjkKLW5haWNzIzMzMzMjQ29tbWVyY2lhbCBhbmQgU2VydmljZSBJbmR1c3RyeSBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMKLW5haWNzIzMzMzMxI0NvbW1lcmNpYWwgYW5kIFNlcnZpY2UgSW5kdXN0cnkgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMwotbmFpY3MjMzMzMzExI0F1dG9tYXRpYyBWZW5kaW5nIE1hY2hpbmUgTWFudWZhY3R1cmluZyMzMzMzMQotbmFpY3MjMzMzMzEyI0NvbW1lcmNpYWwgTGF1bmRyeSwgRHJ5Y2xlYW5pbmcsIGFuZCBQcmVzc2luZyBNYWNoaW5lIE1hbnVmYWN0dXJpbmcjMzMzMzEKLW5haWNzIzMzMzMxMyNPZmZpY2UgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMzEKLW5haWNzIzMzMzMxNCNPcHRpY2FsIEluc3RydW1lbnQgYW5kIExlbnMgTWFudWZhY3R1cmluZyMzMzMzMQotbmFpY3MjMzMzMzE1I1Bob3RvZ3JhcGhpYyBhbmQgUGhvdG9jb3B5aW5nIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzMxCi1uYWljcyMzMzMzMTkjT3RoZXIgQ29tbWVyY2lhbCBhbmQgU2VydmljZSBJbmR1c3RyeSBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMzMQotbmFpY3MjMzMzNCNWZW50aWxhdGlvbiwgSGVhdGluZywgQWlyLUNvbmRpdGlvbmluZywgYW5kIENvbW1lcmNpYWwgUmVmcmlnZXJhdGlvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzMKLW5haWNzIzMzMzQxI1ZlbnRpbGF0aW9uLCBIZWF0aW5nLCBBaXItQ29uZGl0aW9uaW5nLCBhbmQgQ29tbWVyY2lhbCBSZWZyaWdlcmF0aW9uIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzQKLW5haWNzIzMzMzQxMSNBaXIgUHVyaWZpY2F0aW9uIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzQxCi1uYWljcyMzMzM0MTIjSW5kdXN0cmlhbCBhbmQgQ29tbWVyY2lhbCBGYW4gYW5kIEJsb3dlciBNYW51ZmFjdHVyaW5nIzMzMzQxCi1uYWljcyMzMzM0MTQjSGVhdGluZyBFcXVpcG1lbnQgKGV4Y2VwdCBXYXJtIEFpciBGdXJuYWNlcykgTWFudWZhY3R1cmluZyMzMzM0MQotbmFpY3MjMzMzNDE1I0Fpci1Db25kaXRpb25pbmcgYW5kIFdhcm0gQWlyIEhlYXRpbmcgRXF1aXBtZW50IGFuZCBDb21tZXJjaWFsIGFuZCBJbmR1c3RyaWFsIFJlZnJpZ2VyYXRpb24gRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzMzNDEKLW5haWNzIzMzMzUjTWV0YWx3b3JraW5nIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMwotbmFpY3MjMzMzNTEjTWV0YWx3b3JraW5nIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzUKLW5haWNzIzMzMzUxMSNJbmR1c3RyaWFsIE1vbGQgTWFudWZhY3R1cmluZyMzMzM1MQotbmFpY3MjMzMzNTEyI01hY2hpbmUgVG9vbCAoTWV0YWwgQ3V0dGluZyBUeXBlcykgTWFudWZhY3R1cmluZyMzMzM1MQotbmFpY3MjMzMzNTEzI01hY2hpbmUgVG9vbCAoTWV0YWwgRm9ybWluZyBUeXBlcykgTWFudWZhY3R1cmluZyMzMzM1MQotbmFpY3MjMzMzNTE0I1NwZWNpYWwgRGllIGFuZCBUb29sLCBEaWUgU2V0LCBKaWcsIGFuZCBGaXh0dXJlIE1hbnVmYWN0dXJpbmcjMzMzNTEKLW5haWNzIzMzMzUxNSNDdXR0aW5nIFRvb2wgYW5kIE1hY2hpbmUgVG9vbCBBY2Nlc3NvcnkgTWFudWZhY3R1cmluZyMzMzM1MQotbmFpY3MjMzMzNTE2I1JvbGxpbmcgTWlsbCBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzUxCi1uYWljcyMzMzM1MTgjT3RoZXIgTWV0YWx3b3JraW5nIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzUxCi1uYWljcyMzMzM2I0VuZ2luZSwgVHVyYmluZSwgYW5kIFBvd2VyIFRyYW5zbWlzc2lvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzMKLW5haWNzIzMzMzYxI0VuZ2luZSwgVHVyYmluZSwgYW5kIFBvd2VyIFRyYW5zbWlzc2lvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM2Ci1uYWljcyMzMzM2MTEjVHVyYmluZSBhbmQgVHVyYmluZSBHZW5lcmF0b3IgU2V0IFVuaXRzIE1hbnVmYWN0dXJpbmcjMzMzNjEKLW5haWNzIzMzMzYxMiNTcGVlZCBDaGFuZ2VyLCBJbmR1c3RyaWFsIEhpZ2gtU3BlZWQgRHJpdmUsIGFuZCBHZWFyIE1hbnVmYWN0dXJpbmcjMzMzNjEKLW5haWNzIzMzMzYxMyNNZWNoYW5pY2FsIFBvd2VyIFRyYW5zbWlzc2lvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM2MQotbmFpY3MjMzMzNjE4I090aGVyIEVuZ2luZSBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM2MQotbmFpY3MjMzMzOSNPdGhlciBHZW5lcmFsIFB1cnBvc2UgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzCi1uYWljcyMzMzM5MSNQdW1wIGFuZCBDb21wcmVzc29yIE1hbnVmYWN0dXJpbmcjMzMzOQotbmFpY3MjMzMzOTExI1B1bXAgYW5kIFB1bXBpbmcgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzMzOTEKLW5haWNzIzMzMzkxMiNBaXIgYW5kIEdhcyBDb21wcmVzc29yIE1hbnVmYWN0dXJpbmcjMzMzOTEKLW5haWNzIzMzMzkxMyNNZWFzdXJpbmcgYW5kIERpc3BlbnNpbmcgUHVtcCBNYW51ZmFjdHVyaW5nIzMzMzkxCi1uYWljcyMzMzM5MiNNYXRlcmlhbCBIYW5kbGluZyBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM5Ci1uYWljcyMzMzM5MjEjRWxldmF0b3IgYW5kIE1vdmluZyBTdGFpcndheSBNYW51ZmFjdHVyaW5nIzMzMzkyCi1uYWljcyMzMzM5MjIjQ29udmV5b3IgYW5kIENvbnZleWluZyBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM5MgotbmFpY3MjMzMzOTIzI092ZXJoZWFkIFRyYXZlbGluZyBDcmFuZSwgSG9pc3QsIGFuZCBNb25vcmFpbCBTeXN0ZW0gTWFudWZhY3R1cmluZyMzMzM5MgotbmFpY3MjMzMzOTI0I0luZHVzdHJpYWwgVHJ1Y2ssIFRyYWN0b3IsIFRyYWlsZXIsIGFuZCBTdGFja2VyIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzkyCi1uYWljcyMzMzM5OSNBbGwgT3RoZXIgR2VuZXJhbCBQdXJwb3NlIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzkKLW5haWNzIzMzMzk5MSNQb3dlci1Ecml2ZW4gSGFuZHRvb2wgTWFudWZhY3R1cmluZyMzMzM5OQotbmFpY3MjMzMzOTkyI1dlbGRpbmcgYW5kIFNvbGRlcmluZyBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM5OQotbmFpY3MjMzMzOTkzI1BhY2thZ2luZyBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzM5OQotbmFpY3MjMzMzOTk0I0luZHVzdHJpYWwgUHJvY2VzcyBGdXJuYWNlIGFuZCBPdmVuIE1hbnVmYWN0dXJpbmcjMzMzOTkKLW5haWNzIzMzMzk5NSNGbHVpZCBQb3dlciBDeWxpbmRlciBhbmQgQWN0dWF0b3IgTWFudWZhY3R1cmluZyMzMzM5OQotbmFpY3MjMzMzOTk2I0ZsdWlkIFBvd2VyIFB1bXAgYW5kIE1vdG9yIE1hbnVmYWN0dXJpbmcjMzMzOTkKLW5haWNzIzMzMzk5NyNTY2FsZSBhbmQgQmFsYW5jZSAoZXhjZXB0IExhYm9yYXRvcnkpIE1hbnVmYWN0dXJpbmcjMzMzOTkKLW5haWNzIzMzMzk5OSNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBHZW5lcmFsIFB1cnBvc2UgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzOTkKLW5haWNzIzMzNCNDb21wdXRlciBhbmQgRWxlY3Ryb25pYyBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzMKLW5haWNzIzMzNDEjQ29tcHV0ZXIgYW5kIFBlcmlwaGVyYWwgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0Ci1uYWljcyMzMzQxMSNDb21wdXRlciBhbmQgUGVyaXBoZXJhbCBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzQxCi1uYWljcyMzMzQxMTEjRWxlY3Ryb25pYyBDb21wdXRlciBNYW51ZmFjdHVyaW5nIzMzNDExCi1uYWljcyMzMzQxMTIjQ29tcHV0ZXIgU3RvcmFnZSBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzQxMQotbmFpY3MjMzM0MTEzI0NvbXB1dGVyIFRlcm1pbmFsIE1hbnVmYWN0dXJpbmcjMzM0MTEKLW5haWNzIzMzNDExOSNPdGhlciBDb21wdXRlciBQZXJpcGhlcmFsIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNDExCi1uYWljcyMzMzQyI0NvbW11bmljYXRpb25zIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNAotbmFpY3MjMzM0MjEjVGVsZXBob25lIEFwcGFyYXR1cyBNYW51ZmFjdHVyaW5nIzMzNDIKLW5haWNzIzMzNDIyI1JhZGlvIGFuZCBUZWxldmlzaW9uIEJyb2FkY2FzdGluZyBhbmQgV2lyZWxlc3MgQ29tbXVuaWNhdGlvbnMgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0MgotbmFpY3MjMzM0MjkjT3RoZXIgQ29tbXVuaWNhdGlvbnMgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0MgotbmFpY3MjMzM0MyNBdWRpbyBhbmQgVmlkZW8gRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0Ci1uYWljcyMzMzQzMSNBdWRpbyBhbmQgVmlkZW8gRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0MwotbmFpY3MjMzM0NCNTZW1pY29uZHVjdG9yIGFuZCBPdGhlciBFbGVjdHJvbmljIENvbXBvbmVudCBNYW51ZmFjdHVyaW5nIzMzNAotbmFpY3MjMzM0NDEjU2VtaWNvbmR1Y3RvciBhbmQgT3RoZXIgRWxlY3Ryb25pYyBDb21wb25lbnQgTWFudWZhY3R1cmluZyMzMzQ0Ci1uYWljcyMzMzQ0MTEjRWxlY3Ryb24gVHViZSBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTIjQmFyZSBQcmludGVkIENpcmN1aXQgQm9hcmQgTWFudWZhY3R1cmluZyMzMzQ0MQotbmFpY3MjMzM0NDEzI1NlbWljb25kdWN0b3IgYW5kIFJlbGF0ZWQgRGV2aWNlIE1hbnVmYWN0dXJpbmcjMzM0NDEKLW5haWNzIzMzNDQxNCNFbGVjdHJvbmljIENhcGFjaXRvciBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTUjRWxlY3Ryb25pYyBSZXNpc3RvciBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTYjRWxlY3Ryb25pYyBDb2lsLCBUcmFuc2Zvcm1lciwgYW5kIE90aGVyIEluZHVjdG9yIE1hbnVmYWN0dXJpbmcjMzM0NDEKLW5haWNzIzMzNDQxNyNFbGVjdHJvbmljIENvbm5lY3RvciBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTgjUHJpbnRlZCBDaXJjdWl0IEFzc2VtYmx5IChFbGVjdHJvbmljIEFzc2VtYmx5KSBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTkjT3RoZXIgRWxlY3Ryb25pYyBDb21wb25lbnQgTWFudWZhY3R1cmluZyMzMzQ0MQotbmFpY3MjMzM0NSNOYXZpZ2F0aW9uYWwsIE1lYXN1cmluZywgRWxlY3Ryb21lZGljYWwsIGFuZCBDb250cm9sIEluc3RydW1lbnRzIE1hbnVmYWN0dXJpbmcjMzM0Ci1uYWljcyMzMzQ1MSNOYXZpZ2F0aW9uYWwsIE1lYXN1cmluZywgRWxlY3Ryb21lZGljYWwsIGFuZCBDb250cm9sIEluc3RydW1lbnRzIE1hbnVmYWN0dXJpbmcjMzM0NQotbmFpY3MjMzM0NTEwI0VsZWN0cm9tZWRpY2FsIGFuZCBFbGVjdHJvdGhlcmFwZXV0aWMgQXBwYXJhdHVzIE1hbnVmYWN0dXJpbmcjMzM0NTEKLW5haWNzIzMzNDUxMSNTZWFyY2gsIERldGVjdGlvbiwgTmF2aWdhdGlvbiwgR3VpZGFuY2UsIEFlcm9uYXV0aWNhbCwgYW5kIE5hdXRpY2FsIFN5c3RlbSBhbmQgSW5zdHJ1bWVudCBNYW51ZmFjdHVyaW5nIzMzNDUxCi1uYWljcyMzMzQ1MTIjQXV0b21hdGljIEVudmlyb25tZW50YWwgQ29udHJvbCBNYW51ZmFjdHVyaW5nIGZvciBSZXNpZGVudGlhbCwgQ29tbWVyY2lhbCwgYW5kIEFwcGxpYW5jZSBVc2UjMzM0NTEKLW5haWNzIzMzNDUxMyNJbnN0cnVtZW50cyBhbmQgUmVsYXRlZCBQcm9kdWN0cyBNYW51ZmFjdHVyaW5nIGZvciBNZWFzdXJpbmcsIERpc3BsYXlpbmcsIGFuZCBDb250cm9sbGluZyBJbmR1c3RyaWFsIFByb2Nlc3MgVmFyaWFibGVzIzMzNDUxCi1uYWljcyMzMzQ1MTQjVG90YWxpemluZyBGbHVpZCBNZXRlciBhbmQgQ291bnRpbmcgRGV2aWNlIE1hbnVmYWN0dXJpbmcjMzM0NTEKLW5haWNzIzMzNDUxNSNJbnN0cnVtZW50IE1hbnVmYWN0dXJpbmcgZm9yIE1lYXN1cmluZyBhbmQgVGVzdGluZyBFbGVjdHJpY2l0eSBhbmQgRWxlY3RyaWNhbCBTaWduYWxzIzMzNDUxCi1uYWljcyMzMzQ1MTYjQW5hbHl0aWNhbCBMYWJvcmF0b3J5IEluc3RydW1lbnQgTWFudWZhY3R1cmluZyMzMzQ1MQotbmFpY3MjMzM0NTE3I0lycmFkaWF0aW9uIEFwcGFyYXR1cyBNYW51ZmFjdHVyaW5nIzMzNDUxCi1uYWljcyMzMzQ1MTgjV2F0Y2gsIENsb2NrLCBhbmQgUGFydCBNYW51ZmFjdHVyaW5nIzMzNDUxCi1uYWljcyMzMzQ1MTkjT3RoZXIgTWVhc3VyaW5nIGFuZCBDb250cm9sbGluZyBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzQ1MQotbmFpY3MjMzM0NiNNYW51ZmFjdHVyaW5nIGFuZCBSZXByb2R1Y2luZyBNYWduZXRpYyBhbmQgT3B0aWNhbCBNZWRpYSMzMzQKLW5haWNzIzMzNDYxI01hbnVmYWN0dXJpbmcgYW5kIFJlcHJvZHVjaW5nIE1hZ25ldGljIGFuZCBPcHRpY2FsIE1lZGlhIzMzNDYKLW5haWNzIzMzNDYxMSNTb2Z0d2FyZSBSZXByb2R1Y2luZyMzMzQ2MQotbmFpY3MjMzM0NjEyI1ByZXJlY29yZGVkIENvbXBhY3QgRGlzYyAoZXhjZXB0IFNvZnR3YXJlKSwgVGFwZSwgYW5kIFJlY29yZCBSZXByb2R1Y2luZyMzMzQ2MQotbmFpY3MjMzM0NjEzI01hZ25ldGljIGFuZCBPcHRpY2FsIFJlY29yZGluZyBNZWRpYSBNYW51ZmFjdHVyaW5nIzMzNDYxCi1uYWljcyMzMzUjRWxlY3RyaWNhbCBFcXVpcG1lbnQsIEFwcGxpYW5jZSwgYW5kIENvbXBvbmVudCBNYW51ZmFjdHVyaW5nIzMzCi1uYWljcyMzMzUxI0VsZWN0cmljIExpZ2h0aW5nIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNQotbmFpY3MjMzM1MTEjRWxlY3RyaWMgTGFtcCBCdWxiIGFuZCBQYXJ0IE1hbnVmYWN0dXJpbmcjMzM1MQotbmFpY3MjMzM1MTIjTGlnaHRpbmcgRml4dHVyZSBNYW51ZmFjdHVyaW5nIzMzNTEKLW5haWNzIzMzNTEyMSNSZXNpZGVudGlhbCBFbGVjdHJpYyBMaWdodGluZyBGaXh0dXJlIE1hbnVmYWN0dXJpbmcjMzM1MTIKLW5haWNzIzMzNTEyMiNDb21tZXJjaWFsLCBJbmR1c3RyaWFsLCBhbmQgSW5zdGl0dXRpb25hbCBFbGVjdHJpYyBMaWdodGluZyBGaXh0dXJlIE1hbnVmYWN0dXJpbmcjMzM1MTIKLW5haWNzIzMzNTEyOSNPdGhlciBMaWdodGluZyBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzUxMgotbmFpY3MjMzM1MiNIb3VzZWhvbGQgQXBwbGlhbmNlIE1hbnVmYWN0dXJpbmcjMzM1Ci1uYWljcyMzMzUyMSNTbWFsbCBFbGVjdHJpY2FsIEFwcGxpYW5jZSBNYW51ZmFjdHVyaW5nIzMzNTIKLW5haWNzIzMzNTIxMSNFbGVjdHJpYyBIb3VzZXdhcmVzIGFuZCBIb3VzZWhvbGQgRmFuIE1hbnVmYWN0dXJpbmcjMzM1MjEKLW5haWNzIzMzNTIxMiNIb3VzZWhvbGQgVmFjdXVtIENsZWFuZXIgTWFudWZhY3R1cmluZyMzMzUyMQotbmFpY3MjMzM1MjIjTWFqb3IgQXBwbGlhbmNlIE1hbnVmYWN0dXJpbmcjMzM1MgotbmFpY3MjMzM1MjIxI0hvdXNlaG9sZCBDb29raW5nIEFwcGxpYW5jZSBNYW51ZmFjdHVyaW5nIzMzNTIyCi1uYWljcyMzMzUyMjIjSG91c2Vob2xkIFJlZnJpZ2VyYXRvciBhbmQgSG9tZSBGcmVlemVyIE1hbnVmYWN0dXJpbmcjMzM1MjIKLW5haWNzIzMzNTIyNCNIb3VzZWhvbGQgTGF1bmRyeSBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzUyMgotbmFpY3MjMzM1MjI4I090aGVyIE1ham9yIEhvdXNlaG9sZCBBcHBsaWFuY2UgTWFudWZhY3R1cmluZyMzMzUyMgotbmFpY3MjMzM1MyNFbGVjdHJpY2FsIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNQotbmFpY3MjMzM1MzEjRWxlY3RyaWNhbCBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzUzCi1uYWljcyMzMzUzMTEjUG93ZXIsIERpc3RyaWJ1dGlvbiwgYW5kIFNwZWNpYWx0eSBUcmFuc2Zvcm1lciBNYW51ZmFjdHVyaW5nIzMzNTMxCi1uYWljcyMzMzUzMTIjTW90b3IgYW5kIEdlbmVyYXRvciBNYW51ZmFjdHVyaW5nIzMzNTMxCi1uYWljcyMzMzUzMTMjU3dpdGNoZ2VhciBhbmQgU3dpdGNoYm9hcmQgQXBwYXJhdHVzIE1hbnVmYWN0dXJpbmcjMzM1MzEKLW5haWNzIzMzNTMxNCNSZWxheSBhbmQgSW5kdXN0cmlhbCBDb250cm9sIE1hbnVmYWN0dXJpbmcjMzM1MzEKLW5haWNzIzMzNTkjT3RoZXIgRWxlY3RyaWNhbCBFcXVpcG1lbnQgYW5kIENvbXBvbmVudCBNYW51ZmFjdHVyaW5nIzMzNQotbmFpY3MjMzM1OTEjQmF0dGVyeSBNYW51ZmFjdHVyaW5nIzMzNTkKLW5haWNzIzMzNTkxMSNTdG9yYWdlIEJhdHRlcnkgTWFudWZhY3R1cmluZyMzMzU5MQotbmFpY3MjMzM1OTEyI1ByaW1hcnkgQmF0dGVyeSBNYW51ZmFjdHVyaW5nIzMzNTkxCi1uYWljcyMzMzU5MiNDb21tdW5pY2F0aW9uIGFuZCBFbmVyZ3kgV2lyZSBhbmQgQ2FibGUgTWFudWZhY3R1cmluZyMzMzU5Ci1uYWljcyMzMzU5MjEjRmliZXIgT3B0aWMgQ2FibGUgTWFudWZhY3R1cmluZyMzMzU5MgotbmFpY3MjMzM1OTI5I090aGVyIENvbW11bmljYXRpb24gYW5kIEVuZXJneSBXaXJlIE1hbnVmYWN0dXJpbmcjMzM1OTIKLW5haWNzIzMzNTkzI1dpcmluZyBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzU5Ci1uYWljcyMzMzU5MzEjQ3VycmVudC1DYXJyeWluZyBXaXJpbmcgRGV2aWNlIE1hbnVmYWN0dXJpbmcjMzM1OTMKLW5haWNzIzMzNTkzMiNOb25jdXJyZW50LUNhcnJ5aW5nIFdpcmluZyBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzU5MwotbmFpY3MjMzM1OTkjQWxsIE90aGVyIEVsZWN0cmljYWwgRXF1aXBtZW50IGFuZCBDb21wb25lbnQgTWFudWZhY3R1cmluZyMzMzU5Ci1uYWljcyMzMzU5OTEjQ2FyYm9uIGFuZCBHcmFwaGl0ZSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzM1OTkKLW5haWNzIzMzNTk5OSNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBFbGVjdHJpY2FsIEVxdWlwbWVudCBhbmQgQ29tcG9uZW50IE1hbnVmYWN0dXJpbmcjMzM1OTkKLW5haWNzIzMzNiNUcmFuc3BvcnRhdGlvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMwotbmFpY3MjMzM2MSNNb3RvciBWZWhpY2xlIE1hbnVmYWN0dXJpbmcjMzM2Ci1uYWljcyMzMzYxMSNBdXRvbW9iaWxlIGFuZCBMaWdodCBEdXR5IE1vdG9yIFZlaGljbGUgTWFudWZhY3R1cmluZyMzMzYxCi1uYWljcyMzMzYxMTEjQXV0b21vYmlsZSBNYW51ZmFjdHVyaW5nIzMzNjExCi1uYWljcyMzMzYxMTIjTGlnaHQgVHJ1Y2sgYW5kIFV0aWxpdHkgVmVoaWNsZSBNYW51ZmFjdHVyaW5nIzMzNjExCi1uYWljcyMzMzYxMiNIZWF2eSBEdXR5IFRydWNrIE1hbnVmYWN0dXJpbmcjMzM2MQotbmFpY3MjMzM2MiNNb3RvciBWZWhpY2xlIEJvZHkgYW5kIFRyYWlsZXIgTWFudWZhY3R1cmluZyMzMzYKLW5haWNzIzMzNjIxI01vdG9yIFZlaGljbGUgQm9keSBhbmQgVHJhaWxlciBNYW51ZmFjdHVyaW5nIzMzNjIKLW5haWNzIzMzNjIxMSNNb3RvciBWZWhpY2xlIEJvZHkgTWFudWZhY3R1cmluZyMzMzYyMQotbmFpY3MjMzM2MjEyI1RydWNrIFRyYWlsZXIgTWFudWZhY3R1cmluZyMzMzYyMQotbmFpY3MjMzM2MjEzI01vdG9yIEhvbWUgTWFudWZhY3R1cmluZyMzMzYyMQotbmFpY3MjMzM2MjE0I1RyYXZlbCBUcmFpbGVyIGFuZCBDYW1wZXIgTWFudWZhY3R1cmluZyMzMzYyMQotbmFpY3MjMzM2MyNNb3RvciBWZWhpY2xlIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2Ci1uYWljcyMzMzYzMSNNb3RvciBWZWhpY2xlIEdhc29saW5lIEVuZ2luZSBhbmQgRW5naW5lIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2MwotbmFpY3MjMzM2MzExI0NhcmJ1cmV0b3IsIFBpc3RvbiwgUGlzdG9uIFJpbmcsIGFuZCBWYWx2ZSBNYW51ZmFjdHVyaW5nIzMzNjMxCi1uYWljcyMzMzYzMTIjR2Fzb2xpbmUgRW5naW5lIGFuZCBFbmdpbmUgUGFydHMgTWFudWZhY3R1cmluZyMzMzYzMQotbmFpY3MjMzM2MzIjTW90b3IgVmVoaWNsZSBFbGVjdHJpY2FsIGFuZCBFbGVjdHJvbmljIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjMyMSNWZWhpY3VsYXIgTGlnaHRpbmcgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM2MzIKLW5haWNzIzMzNjMyMiNPdGhlciBNb3RvciBWZWhpY2xlIEVsZWN0cmljYWwgYW5kIEVsZWN0cm9uaWMgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM2MzIKLW5haWNzIzMzNjMzI01vdG9yIFZlaGljbGUgU3RlZXJpbmcgYW5kIFN1c3BlbnNpb24gQ29tcG9uZW50cyAoZXhjZXB0IFNwcmluZykgTWFudWZhY3R1cmluZyMzMzYzCi1uYWljcyMzMzYzNCNNb3RvciBWZWhpY2xlIEJyYWtlIFN5c3RlbSBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjM1I01vdG9yIFZlaGljbGUgVHJhbnNtaXNzaW9uIGFuZCBQb3dlciBUcmFpbiBQYXJ0cyBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjM2I01vdG9yIFZlaGljbGUgU2VhdGluZyBhbmQgSW50ZXJpb3IgVHJpbSBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjM3I01vdG9yIFZlaGljbGUgTWV0YWwgU3RhbXBpbmcjMzM2MwotbmFpY3MjMzM2MzkjT3RoZXIgTW90b3IgVmVoaWNsZSBQYXJ0cyBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjM5MSNNb3RvciBWZWhpY2xlIEFpci1Db25kaXRpb25pbmcgTWFudWZhY3R1cmluZyMzMzYzOQotbmFpY3MjMzM2Mzk5I0FsbCBPdGhlciBNb3RvciBWZWhpY2xlIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2MzkKLW5haWNzIzMzNjQjQWVyb3NwYWNlIFByb2R1Y3QgYW5kIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2Ci1uYWljcyMzMzY0MSNBZXJvc3BhY2UgUHJvZHVjdCBhbmQgUGFydHMgTWFudWZhY3R1cmluZyMzMzY0Ci1uYWljcyMzMzY0MTEjQWlyY3JhZnQgTWFudWZhY3R1cmluZyMzMzY0MQotbmFpY3MjMzM2NDEyI0FpcmNyYWZ0IEVuZ2luZSBhbmQgRW5naW5lIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2NDEKLW5haWNzIzMzNjQxMyNPdGhlciBBaXJjcmFmdCBQYXJ0cyBhbmQgQXV4aWxpYXJ5IEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNjQxCi1uYWljcyMzMzY0MTQjR3VpZGVkIE1pc3NpbGUgYW5kIFNwYWNlIFZlaGljbGUgTWFudWZhY3R1cmluZyMzMzY0MQotbmFpY3MjMzM2NDE1I0d1aWRlZCBNaXNzaWxlIGFuZCBTcGFjZSBWZWhpY2xlIFByb3B1bHNpb24gVW5pdCBhbmQgUHJvcHVsc2lvbiBVbml0IFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2NDEKLW5haWNzIzMzNjQxOSNPdGhlciBHdWlkZWQgTWlzc2lsZSBhbmQgU3BhY2UgVmVoaWNsZSBQYXJ0cyBhbmQgQXV4aWxpYXJ5IEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNjQxCi1uYWljcyMzMzY1I1JhaWxyb2FkIFJvbGxpbmcgU3RvY2sgTWFudWZhY3R1cmluZyMzMzYKLW5haWNzIzMzNjUxI1JhaWxyb2FkIFJvbGxpbmcgU3RvY2sgTWFudWZhY3R1cmluZyMzMzY1Ci1uYWljcyMzMzY2I1NoaXAgYW5kIEJvYXQgQnVpbGRpbmcjMzM2Ci1uYWljcyMzMzY2MSNTaGlwIGFuZCBCb2F0IEJ1aWxkaW5nIzMzNjYKLW5haWNzIzMzNjYxMSNTaGlwIEJ1aWxkaW5nIGFuZCBSZXBhaXJpbmcjMzM2NjEKLW5haWNzIzMzNjYxMiNCb2F0IEJ1aWxkaW5nIzMzNjYxCi1uYWljcyMzMzY5I090aGVyIFRyYW5zcG9ydGF0aW9uIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNgotbmFpY3MjMzM2OTkjT3RoZXIgVHJhbnNwb3J0YXRpb24gRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM2OQotbmFpY3MjMzM2OTkxI01vdG9yY3ljbGUsIEJpY3ljbGUsIGFuZCBQYXJ0cyBNYW51ZmFjdHVyaW5nIzMzNjk5Ci1uYWljcyMzMzY5OTIjTWlsaXRhcnkgQXJtb3JlZCBWZWhpY2xlLCBUYW5rLCBhbmQgVGFuayBDb21wb25lbnQgTWFudWZhY3R1cmluZyMzMzY5OQotbmFpY3MjMzM2OTk5I0FsbCBPdGhlciBUcmFuc3BvcnRhdGlvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzY5OQotbmFpY3MjMzM3I0Z1cm5pdHVyZSBhbmQgUmVsYXRlZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzMKLW5haWNzIzMzNzEjSG91c2Vob2xkIGFuZCBJbnN0aXR1dGlvbmFsIEZ1cm5pdHVyZSBhbmQgS2l0Y2hlbiBDYWJpbmV0IE1hbnVmYWN0dXJpbmcjMzM3Ci1uYWljcyMzMzcxMSNXb29kIEtpdGNoZW4gQ2FiaW5ldCBhbmQgQ291bnRlcnRvcCBNYW51ZmFjdHVyaW5nIzMzNzEKLW5haWNzIzMzNzEyI0hvdXNlaG9sZCBhbmQgSW5zdGl0dXRpb25hbCBGdXJuaXR1cmUgTWFudWZhY3R1cmluZyMzMzcxCi1uYWljcyMzMzcxMjEjVXBob2xzdGVyZWQgSG91c2Vob2xkIEZ1cm5pdHVyZSBNYW51ZmFjdHVyaW5nIzMzNzEyCi1uYWljcyMzMzcxMjIjTm9udXBob2xzdGVyZWQgV29vZCBIb3VzZWhvbGQgRnVybml0dXJlIE1hbnVmYWN0dXJpbmcjMzM3MTIKLW5haWNzIzMzNzEyNCNNZXRhbCBIb3VzZWhvbGQgRnVybml0dXJlIE1hbnVmYWN0dXJpbmcjMzM3MTIKLW5haWNzIzMzNzEyNSNIb3VzZWhvbGQgRnVybml0dXJlIChleGNlcHQgV29vZCBhbmQgTWV0YWwpIE1hbnVmYWN0dXJpbmcjMzM3MTIKLW5haWNzIzMzNzEyNyNJbnN0aXR1dGlvbmFsIEZ1cm5pdHVyZSBNYW51ZmFjdHVyaW5nIzMzNzEyCi1uYWljcyMzMzcxMjkjV29vZCBUZWxldmlzaW9uLCBSYWRpbywgYW5kIFNld2luZyBNYWNoaW5lIENhYmluZXQgTWFudWZhY3R1cmluZyMzMzcxMgotbmFpY3MjMzM3MiNPZmZpY2UgRnVybml0dXJlIChpbmNsdWRpbmcgRml4dHVyZXMpIE1hbnVmYWN0dXJpbmcjMzM3Ci1uYWljcyMzMzcyMSNPZmZpY2UgRnVybml0dXJlIChpbmNsdWRpbmcgRml4dHVyZXMpIE1hbnVmYWN0dXJpbmcjMzM3MgotbmFpY3MjMzM3MjExI1dvb2QgT2ZmaWNlIEZ1cm5pdHVyZSBNYW51ZmFjdHVyaW5nIzMzNzIxCi1uYWljcyMzMzcyMTIjQ3VzdG9tIEFyY2hpdGVjdHVyYWwgV29vZHdvcmsgYW5kIE1pbGx3b3JrIE1hbnVmYWN0dXJpbmcjMzM3MjEKLW5haWNzIzMzNzIxNCNPZmZpY2UgRnVybml0dXJlIChleGNlcHQgV29vZCkgTWFudWZhY3R1cmluZyMzMzcyMQotbmFpY3MjMzM3MjE1I1Nob3djYXNlLCBQYXJ0aXRpb24sIFNoZWx2aW5nLCBhbmQgTG9ja2VyIE1hbnVmYWN0dXJpbmcjMzM3MjEKLW5haWNzIzMzNzkjT3RoZXIgRnVybml0dXJlIFJlbGF0ZWQgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzNwotbmFpY3MjMzM3OTEjTWF0dHJlc3MgTWFudWZhY3R1cmluZyMzMzc5Ci1uYWljcyMzMzc5MiNCbGluZCBhbmQgU2hhZGUgTWFudWZhY3R1cmluZyMzMzc5Ci1uYWljcyMzMzkjTWlzY2VsbGFuZW91cyBNYW51ZmFjdHVyaW5nIzMzCi1uYWljcyMzMzkxI01lZGljYWwgRXF1aXBtZW50IGFuZCBTdXBwbGllcyBNYW51ZmFjdHVyaW5nIzMzOQotbmFpY3MjMzM5MTEjTWVkaWNhbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIE1hbnVmYWN0dXJpbmcjMzM5MQotbmFpY3MjMzM5MTExI0xhYm9yYXRvcnkgQXBwYXJhdHVzIGFuZCBGdXJuaXR1cmUgTWFudWZhY3R1cmluZyMzMzkxMQotbmFpY3MjMzM5MTEyI1N1cmdpY2FsIGFuZCBNZWRpY2FsIEluc3RydW1lbnQgTWFudWZhY3R1cmluZyMzMzkxMQotbmFpY3MjMzM5MTEzI1N1cmdpY2FsIEFwcGxpYW5jZSBhbmQgU3VwcGxpZXMgTWFudWZhY3R1cmluZyMzMzkxMQotbmFpY3MjMzM5MTE0I0RlbnRhbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIE1hbnVmYWN0dXJpbmcjMzM5MTEKLW5haWNzIzMzOTExNSNPcGh0aGFsbWljIEdvb2RzIE1hbnVmYWN0dXJpbmcjMzM5MTEKLW5haWNzIzMzOTExNiNEZW50YWwgTGFib3JhdG9yaWVzIzMzOTExCi1uYWljcyMzMzk5I090aGVyIE1pc2NlbGxhbmVvdXMgTWFudWZhY3R1cmluZyMzMzkKLW5haWNzIzMzOTkxI0pld2VscnkgYW5kIFNpbHZlcndhcmUgTWFudWZhY3R1cmluZyMzMzk5Ci1uYWljcyMzMzk5MTEjSmV3ZWxyeSAoZXhjZXB0IENvc3R1bWUpIE1hbnVmYWN0dXJpbmcjMzM5OTEKLW5haWNzIzMzOTkxMiNTaWx2ZXJ3YXJlIGFuZCBIb2xsb3d3YXJlIE1hbnVmYWN0dXJpbmcjMzM5OTEKLW5haWNzIzMzOTkxMyNKZXdlbGVycycgTWF0ZXJpYWwgYW5kIExhcGlkYXJ5IFdvcmsgTWFudWZhY3R1cmluZyMzMzk5MQotbmFpY3MjMzM5OTE0I0Nvc3R1bWUgSmV3ZWxyeSBhbmQgTm92ZWx0eSBNYW51ZmFjdHVyaW5nIzMzOTkxCi1uYWljcyMzMzk5MiNTcG9ydGluZyBhbmQgQXRobGV0aWMgR29vZHMgTWFudWZhY3R1cmluZyMzMzk5Ci1uYWljcyMzMzk5MyNEb2xsLCBUb3ksIGFuZCBHYW1lIE1hbnVmYWN0dXJpbmcjMzM5OQotbmFpY3MjMzM5OTMxI0RvbGwgYW5kIFN0dWZmZWQgVG95IE1hbnVmYWN0dXJpbmcjMzM5OTMKLW5haWNzIzMzOTkzMiNHYW1lLCBUb3ksIGFuZCBDaGlsZHJlbidzIFZlaGljbGUgTWFudWZhY3R1cmluZyMzMzk5MwotbmFpY3MjMzM5OTQjT2ZmaWNlIFN1cHBsaWVzIChleGNlcHQgUGFwZXIpIE1hbnVmYWN0dXJpbmcjMzM5OQotbmFpY3MjMzM5OTQxI1BlbiBhbmQgTWVjaGFuaWNhbCBQZW5jaWwgTWFudWZhY3R1cmluZyMzMzk5NAotbmFpY3MjMzM5OTQyI0xlYWQgUGVuY2lsIGFuZCBBcnQgR29vZCBNYW51ZmFjdHVyaW5nIzMzOTk0Ci1uYWljcyMzMzk5NDMjTWFya2luZyBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzk5NAotbmFpY3MjMzM5OTQ0I0NhcmJvbiBQYXBlciBhbmQgSW5rZWQgUmliYm9uIE1hbnVmYWN0dXJpbmcjMzM5OTQKLW5haWNzIzMzOTk1I1NpZ24gTWFudWZhY3R1cmluZyMzMzk5Ci1uYWljcyMzMzk5OSNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBNYW51ZmFjdHVyaW5nIzMzOTkKLW5haWNzIzMzOTk5MSNHYXNrZXQsIFBhY2tpbmcsIGFuZCBTZWFsaW5nIERldmljZSBNYW51ZmFjdHVyaW5nIzMzOTk5Ci1uYWljcyMzMzk5OTIjTXVzaWNhbCBJbnN0cnVtZW50IE1hbnVmYWN0dXJpbmcjMzM5OTkKLW5haWNzIzMzOTk5MyNGYXN0ZW5lciwgQnV0dG9uLCBOZWVkbGUsIGFuZCBQaW4gTWFudWZhY3R1cmluZyMzMzk5OQotbmFpY3MjMzM5OTk0I0Jyb29tLCBCcnVzaCwgYW5kIE1vcCBNYW51ZmFjdHVyaW5nIzMzOTk5Ci1uYWljcyMzMzk5OTUjQnVyaWFsIENhc2tldCBNYW51ZmFjdHVyaW5nIzMzOTk5Ci1uYWljcyMzMzk5OTkjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgTWFudWZhY3R1cmluZyMzMzk5OQotbmFpY3MjNDIjV2hvbGVzYWxlIFRyYWRlIzQyCi1uYWljcyM0MjEjV2hvbGVzYWxlIFRyYWRlLCBEdXJhYmxlIEdvb2RzIzQyCi1uYWljcyM0MjExI01vdG9yIFZlaGljbGUgYW5kIE1vdG9yIFZlaGljbGUgUGFydHMgYW5kIFN1cHBsaWVzIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxMTEjQXV0b21vYmlsZSBhbmQgT3RoZXIgTW90b3IgVmVoaWNsZSBXaG9sZXNhbGVycyM0MjExCi1uYWljcyM0MjExMiNNb3RvciBWZWhpY2xlIFN1cHBsaWVzIGFuZCBOZXcgUGFydHMgV2hvbGVzYWxlcnMjNDIxMQotbmFpY3MjNDIxMTMjVGlyZSBhbmQgVHViZSBXaG9sZXNhbGVycyM0MjExCi1uYWljcyM0MjExNCNNb3RvciBWZWhpY2xlIFBhcnRzIChVc2VkKSBXaG9sZXNhbGVycyM0MjExCi1uYWljcyM0MjEyI0Z1cm5pdHVyZSBhbmQgSG9tZSBGdXJuaXNoaW5nIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxMjEjRnVybml0dXJlIFdob2xlc2FsZXJzIzQyMTIKLW5haWNzIzQyMTIyI0hvbWUgRnVybmlzaGluZyBXaG9sZXNhbGVycyM0MjEyCi1uYWljcyM0MjEzI0x1bWJlciBhbmQgT3RoZXIgQ29uc3RydWN0aW9uIE1hdGVyaWFscyBXaG9sZXNhbGVycyM0MjEKLW5haWNzIzQyMTMxI0x1bWJlciwgUGx5d29vZCwgTWlsbHdvcmssIGFuZCBXb29kIFBhbmVsIFdob2xlc2FsZXJzIzQyMTMKLW5haWNzIzQyMTMyI0JyaWNrLCBTdG9uZSwgYW5kIFJlbGF0ZWQgQ29uc3RydWN0aW9uIE1hdGVyaWFsIFdob2xlc2FsZXJzIzQyMTMKLW5haWNzIzQyMTMzI1Jvb2ZpbmcsIFNpZGluZywgYW5kIEluc3VsYXRpb24gTWF0ZXJpYWwgV2hvbGVzYWxlcnMjNDIxMwotbmFpY3MjNDIxMzkjT3RoZXIgQ29uc3RydWN0aW9uIE1hdGVyaWFsIFdob2xlc2FsZXJzIzQyMTMKLW5haWNzIzQyMTQjUHJvZmVzc2lvbmFsIGFuZCBDb21tZXJjaWFsIEVxdWlwbWVudCBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxCi1uYWljcyM0MjE0MSNQaG90b2dyYXBoaWMgRXF1aXBtZW50IGFuZCBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjE0Ci1uYWljcyM0MjE0MiNPZmZpY2UgRXF1aXBtZW50IFdob2xlc2FsZXJzIzQyMTQKLW5haWNzIzQyMTQzI0NvbXB1dGVyIGFuZCBDb21wdXRlciBQZXJpcGhlcmFsIEVxdWlwbWVudCBhbmQgU29mdHdhcmUgV2hvbGVzYWxlcnMjNDIxNAotbmFpY3MjNDIxNDQjT3RoZXIgQ29tbWVyY2lhbCBFcXVpcG1lbnQgV2hvbGVzYWxlcnMjNDIxNAotbmFpY3MjNDIxNDUjTWVkaWNhbCwgRGVudGFsLCBhbmQgSG9zcGl0YWwgRXF1aXBtZW50IGFuZCBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjE0Ci1uYWljcyM0MjE0NiNPcGh0aGFsbWljIEdvb2RzIFdob2xlc2FsZXJzIzQyMTQKLW5haWNzIzQyMTQ5I090aGVyIFByb2Zlc3Npb25hbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIFdob2xlc2FsZXJzIzQyMTQKLW5haWNzIzQyMTUjTWV0YWwgYW5kIE1pbmVyYWwgKGV4Y2VwdCBQZXRyb2xldW0pIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxNTEjTWV0YWwgU2VydmljZSBDZW50ZXJzIGFuZCBPZmZpY2VzIzQyMTUKLW5haWNzIzQyMTUyI0NvYWwgYW5kIE90aGVyIE1pbmVyYWwgYW5kIE9yZSBXaG9sZXNhbGVycyM0MjE1Ci1uYWljcyM0MjE2I0VsZWN0cmljYWwgR29vZHMgV2hvbGVzYWxlcnMjNDIxCi1uYWljcyM0MjE2MSNFbGVjdHJpY2FsIEFwcGFyYXR1cyBhbmQgRXF1aXBtZW50LCBXaXJpbmcgU3VwcGxpZXMsIGFuZCBDb25zdHJ1Y3Rpb24gTWF0ZXJpYWwgV2hvbGVzYWxlcnMjNDIxNgotbmFpY3MjNDIxNjIjRWxlY3RyaWNhbCBBcHBsaWFuY2UsIFRlbGV2aXNpb24sIGFuZCBSYWRpbyBTZXQgV2hvbGVzYWxlcnMjNDIxNgotbmFpY3MjNDIxNjkjT3RoZXIgRWxlY3Ryb25pYyBQYXJ0cyBhbmQgRXF1aXBtZW50IFdob2xlc2FsZXJzIzQyMTYKLW5haWNzIzQyMTcjSGFyZHdhcmUsIGFuZCBQbHVtYmluZyBhbmQgSGVhdGluZyBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxNzEjSGFyZHdhcmUgV2hvbGVzYWxlcnMjNDIxNwotbmFpY3MjNDIxNzIjUGx1bWJpbmcgYW5kIEhlYXRpbmcgRXF1aXBtZW50IGFuZCBTdXBwbGllcyAoSHlkcm9uaWNzKSBXaG9sZXNhbGVycyM0MjE3Ci1uYWljcyM0MjE3MyNXYXJtIEFpciBIZWF0aW5nIGFuZCBBaXItQ29uZGl0aW9uaW5nIEVxdWlwbWVudCBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxNwotbmFpY3MjNDIxNzQjUmVmcmlnZXJhdGlvbiBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIFdob2xlc2FsZXJzIzQyMTcKLW5haWNzIzQyMTgjTWFjaGluZXJ5LCBFcXVpcG1lbnQsIGFuZCBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjEKLW5haWNzIzQyMTgxI0NvbnN0cnVjdGlvbiBhbmQgTWluaW5nIChleGNlcHQgT2lsIFdlbGwpIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IFdob2xlc2FsZXJzIzQyMTgKLW5haWNzIzQyMTgyI0Zhcm0gYW5kIEdhcmRlbiBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBXaG9sZXNhbGVycyM0MjE4Ci1uYWljcyM0MjE4MyNJbmR1c3RyaWFsIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IFdob2xlc2FsZXJzIzQyMTgKLW5haWNzIzQyMTg0I0luZHVzdHJpYWwgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxOAotbmFpY3MjNDIxODUjU2VydmljZSBFc3RhYmxpc2htZW50IEVxdWlwbWVudCBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxOAotbmFpY3MjNDIxODYjVHJhbnNwb3J0YXRpb24gRXF1aXBtZW50IGFuZCBTdXBwbGllcyAoZXhjZXB0IE1vdG9yIFZlaGljbGUpIFdob2xlc2FsZXJzIzQyMTgKLW5haWNzIzQyMTkjTWlzY2VsbGFuZW91cyBEdXJhYmxlIEdvb2RzIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxOTEjU3BvcnRpbmcgYW5kIFJlY3JlYXRpb25hbCBHb29kcyBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxOQotbmFpY3MjNDIxOTIjVG95IGFuZCBIb2JieSBHb29kcyBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxOQotbmFpY3MjNDIxOTMjUmVjeWNsYWJsZSBNYXRlcmlhbCBXaG9sZXNhbGVycyM0MjE5Ci1uYWljcyM0MjE5NCNKZXdlbHJ5LCBXYXRjaCwgUHJlY2lvdXMgU3RvbmUsIGFuZCBQcmVjaW91cyBNZXRhbCBXaG9sZXNhbGVycyM0MjE5Ci1uYWljcyM0MjE5OSNPdGhlciBNaXNjZWxsYW5lb3VzIER1cmFibGUgR29vZHMgV2hvbGVzYWxlcnMjNDIxOQotbmFpY3MjNDIyI1dob2xlc2FsZSBUcmFkZSwgTm9uZHVyYWJsZSBHb29kcyM0MgotbmFpY3MjNDIyMSNQYXBlciBhbmQgUGFwZXIgUHJvZHVjdCBXaG9sZXNhbGVycyM0MjIKLW5haWNzIzQyMjExI1ByaW50aW5nIGFuZCBXcml0aW5nIFBhcGVyIFdob2xlc2FsZXJzIzQyMjEKLW5haWNzIzQyMjEyI1N0YXRpb25lcnkgYW5kIE9mZmljZSBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjIxCi1uYWljcyM0MjIxMyNJbmR1c3RyaWFsIGFuZCBQZXJzb25hbCBTZXJ2aWNlIFBhcGVyIFdob2xlc2FsZXJzIzQyMjEKLW5haWNzIzQyMjIjRHJ1Z3MgYW5kIERydWdnaXN0cycgU3VuZHJpZXMgV2hvbGVzYWxlcnMjNDIyCi1uYWljcyM0MjIyMSNEcnVncyBhbmQgRHJ1Z2dpc3RzJyBTdW5kcmllcyBXaG9sZXNhbGVycyM0MjIyCi1uYWljcyM0MjIzI0FwcGFyZWwsIFBpZWNlIEdvb2RzLCBhbmQgTm90aW9ucyBXaG9sZXNhbGVycyM0MjIKLW5haWNzIzQyMjMxI1BpZWNlIEdvb2RzLCBOb3Rpb25zLCBhbmQgT3RoZXIgRHJ5IEdvb2RzIFdob2xlc2FsZXJzIzQyMjMKLW5haWNzIzQyMjMyI01lbidzIGFuZCBCb3lzJyBDbG90aGluZyBhbmQgRnVybmlzaGluZ3MgV2hvbGVzYWxlcnMjNDIyMwotbmFpY3MjNDIyMzMjV29tZW4ncywgQ2hpbGRyZW4ncywgYW5kIEluZmFudHMnIENsb3RoaW5nIGFuZCBBY2Nlc3NvcmllcyBXaG9sZXNhbGVycyM0MjIzCi1uYWljcyM0MjIzNCNGb290d2VhciBXaG9sZXNhbGVycyM0MjIzCi1uYWljcyM0MjI0I0dyb2NlcnkgYW5kIFJlbGF0ZWQgUHJvZHVjdCBXaG9sZXNhbGVycyM0MjIKLW5haWNzIzQyMjQxI0dlbmVyYWwgTGluZSBHcm9jZXJ5IFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQyI1BhY2thZ2VkIEZyb3plbiBGb29kIFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQzI0RhaXJ5IFByb2R1Y3QgKGV4Y2VwdCBEcmllZCBvciBDYW5uZWQpIFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQ0I1BvdWx0cnkgYW5kIFBvdWx0cnkgUHJvZHVjdCBXaG9sZXNhbGVycyM0MjI0Ci1uYWljcyM0MjI0NSNDb25mZWN0aW9uZXJ5IFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQ2I0Zpc2ggYW5kIFNlYWZvb2QgV2hvbGVzYWxlcnMjNDIyNAotbmFpY3MjNDIyNDcjTWVhdCBhbmQgTWVhdCBQcm9kdWN0IFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQ4I0ZyZXNoIEZydWl0IGFuZCBWZWdldGFibGUgV2hvbGVzYWxlcnMjNDIyNAotbmFpY3MjNDIyNDkjT3RoZXIgR3JvY2VyeSBhbmQgUmVsYXRlZCBQcm9kdWN0cyBXaG9sZXNhbGVycyM0MjI0Ci1uYWljcyM0MjI1I0Zhcm0gUHJvZHVjdCBSYXcgTWF0ZXJpYWwgV2hvbGVzYWxlcnMjNDIyCi1uYWljcyM0MjI1MSNHcmFpbiBhbmQgRmllbGQgQmVhbiBXaG9sZXNhbGVycyM0MjI1Ci1uYWljcyM0MjI1MiNMaXZlc3RvY2sgV2hvbGVzYWxlcnMjNDIyNQotbmFpY3MjNDIyNTkjT3RoZXIgRmFybSBQcm9kdWN0IFJhdyBNYXRlcmlhbCBXaG9sZXNhbGVycyM0MjI1Ci1uYWljcyM0MjI2I0NoZW1pY2FsIGFuZCBBbGxpZWQgUHJvZHVjdHMgV2hvbGVzYWxlcnMjNDIyCi1uYWljcyM0MjI2MSNQbGFzdGljcyBNYXRlcmlhbHMgYW5kIEJhc2ljIEZvcm1zIGFuZCBTaGFwZXMgV2hvbGVzYWxlcnMjNDIyNgotbmFpY3MjNDIyNjkjT3RoZXIgQ2hlbWljYWwgYW5kIEFsbGllZCBQcm9kdWN0cyBXaG9sZXNhbGVycyM0MjI2Ci1uYWljcyM0MjI3I1BldHJvbGV1bSBhbmQgUGV0cm9sZXVtIFByb2R1Y3RzIFdob2xlc2FsZXJzIzQyMgotbmFpY3MjNDIyNzEjUGV0cm9sZXVtIEJ1bGsgU3RhdGlvbnMgYW5kIFRlcm1pbmFscyM0MjI3Ci1uYWljcyM0MjI3MiNQZXRyb2xldW0gYW5kIFBldHJvbGV1bSBQcm9kdWN0cyBXaG9sZXNhbGVycyAoZXhjZXB0IEJ1bGsgU3RhdGlvbnMgYW5kIFRlcm1pbmFscykjNDIyNwotbmFpY3MjNDIyOCNCZWVyLCBXaW5lLCBhbmQgRGlzdGlsbGVkIEFsY29ob2xpYyBCZXZlcmFnZSBXaG9sZXNhbGVycyM0MjIKLW5haWNzIzQyMjgxI0JlZXIgYW5kIEFsZSBXaG9sZXNhbGVycyM0MjI4Ci1uYWljcyM0MjI4MiNXaW5lIGFuZCBEaXN0aWxsZWQgQWxjb2hvbGljIEJldmVyYWdlIFdob2xlc2FsZXJzIzQyMjgKLW5haWNzIzQyMjkjTWlzY2VsbGFuZW91cyBOb25kdXJhYmxlIEdvb2RzIFdob2xlc2FsZXJzIzQyMgotbmFpY3MjNDIyOTEjRmFybSBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjI5Ci1uYWljcyM0MjI5MiNCb29rLCBQZXJpb2RpY2FsLCBhbmQgTmV3c3BhcGVyIFdob2xlc2FsZXJzIzQyMjkKLW5haWNzIzQyMjkzI0Zsb3dlciwgTnVyc2VyeSBTdG9jaywgYW5kIEZsb3Jpc3RzJyBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjI5Ci1uYWljcyM0MjI5NCNUb2JhY2NvIGFuZCBUb2JhY2NvIFByb2R1Y3QgV2hvbGVzYWxlcnMjNDIyOQotbmFpY3MjNDIyOTUjUGFpbnQsIFZhcm5pc2gsIGFuZCBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjI5Ci1uYWljcyM0MjI5OSNPdGhlciBNaXNjZWxsYW5lb3VzIE5vbmR1cmFibGUgR29vZHMgV2hvbGVzYWxlcnMjNDIyOQotbmFpY3MjNDQjUmV0YWlsIFRyYWRlIzQ0Ci1uYWljcyM0NDEjTW90b3IgVmVoaWNsZSBhbmQgUGFydHMgRGVhbGVycyM0NAotbmFpY3MjNDQxMSNBdXRvbW9iaWxlIERlYWxlcnMjNDQxCi1uYWljcyM0NDExMSNOZXcgQ2FyIERlYWxlcnMjNDQxMQotbmFpY3MjNDQxMTIjVXNlZCBDYXIgRGVhbGVycyM0NDExCi1uYWljcyM0NDEyI090aGVyIE1vdG9yIFZlaGljbGUgRGVhbGVycyM0NDEKLW5haWNzIzQ0MTIxI1JlY3JlYXRpb25hbCBWZWhpY2xlIERlYWxlcnMjNDQxMgotbmFpY3MjNDQxMjIjTW90b3JjeWNsZSwgQm9hdCwgYW5kIE90aGVyIE1vdG9yIFZlaGljbGUgRGVhbGVycyM0NDEyCi1uYWljcyM0NDEyMjEjTW90b3JjeWNsZSBEZWFsZXJzIzQ0MTIyCi1uYWljcyM0NDEyMjIjQm9hdCBEZWFsZXJzIzQ0MTIyCi1uYWljcyM0NDEyMjkjQWxsIE90aGVyIE1vdG9yIFZlaGljbGUgRGVhbGVycyM0NDEyMgotbmFpY3MjNDQxMyNBdXRvbW90aXZlIFBhcnRzLCBBY2Nlc3NvcmllcywgYW5kIFRpcmUgU3RvcmVzIzQ0MQotbmFpY3MjNDQxMzEjQXV0b21vdGl2ZSBQYXJ0cyBhbmQgQWNjZXNzb3JpZXMgU3RvcmVzIzQ0MTMKLW5haWNzIzQ0MTMyI1RpcmUgRGVhbGVycyM0NDEzCi1uYWljcyM0NDIjRnVybml0dXJlIGFuZCBIb21lIEZ1cm5pc2hpbmdzIFN0b3JlcyM0NAotbmFpY3MjNDQyMSNGdXJuaXR1cmUgU3RvcmVzIzQ0MgotbmFpY3MjNDQyMTEjRnVybml0dXJlIFN0b3JlcyM0NDIxCi1uYWljcyM0NDIyI0hvbWUgRnVybmlzaGluZ3MgU3RvcmVzIzQ0MgotbmFpY3MjNDQyMjEjRmxvb3IgQ292ZXJpbmcgU3RvcmVzIzQ0MjIKLW5haWNzIzQ0MjI5I090aGVyIEhvbWUgRnVybmlzaGluZ3MgU3RvcmVzIzQ0MjIKLW5haWNzIzQ0MjI5MSNXaW5kb3cgVHJlYXRtZW50IFN0b3JlcyM0NDIyOQotbmFpY3MjNDQyMjk5I0FsbCBPdGhlciBIb21lIEZ1cm5pc2hpbmdzIFN0b3JlcyM0NDIyOQotbmFpY3MjNDQzI0VsZWN0cm9uaWNzIGFuZCBBcHBsaWFuY2UgU3RvcmVzIzQ0Ci1uYWljcyM0NDMxI0VsZWN0cm9uaWNzIGFuZCBBcHBsaWFuY2UgU3RvcmVzIzQ0MwotbmFpY3MjNDQzMTEjQXBwbGlhbmNlLCBUZWxldmlzaW9uLCBhbmQgT3RoZXIgRWxlY3Ryb25pY3MgU3RvcmVzIzQ0MzEKLW5haWNzIzQ0MzExMSNIb3VzZWhvbGQgQXBwbGlhbmNlIFN0b3JlcyM0NDMxMQotbmFpY3MjNDQzMTEyI1JhZGlvLCBUZWxldmlzaW9uLCBhbmQgT3RoZXIgRWxlY3Ryb25pY3MgU3RvcmVzIzQ0MzExCi1uYWljcyM0NDMxMiNDb21wdXRlciBhbmQgU29mdHdhcmUgU3RvcmVzIzQ0MzEKLW5haWNzIzQ0MzEzI0NhbWVyYSBhbmQgUGhvdG9ncmFwaGljIFN1cHBsaWVzIFN0b3JlcyM0NDMxCi1uYWljcyM0NDQjQnVpbGRpbmcgTWF0ZXJpYWwgYW5kIEdhcmRlbiBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIERlYWxlcnMjNDQKLW5haWNzIzQ0NDEjQnVpbGRpbmcgTWF0ZXJpYWwgYW5kIFN1cHBsaWVzIERlYWxlcnMjNDQ0Ci1uYWljcyM0NDQxMSNIb21lIENlbnRlcnMjNDQ0MQotbmFpY3MjNDQ0MTIjUGFpbnQgYW5kIFdhbGxwYXBlciBTdG9yZXMjNDQ0MQotbmFpY3MjNDQ0MTMjSGFyZHdhcmUgU3RvcmVzIzQ0NDEKLW5haWNzIzQ0NDE5I090aGVyIEJ1aWxkaW5nIE1hdGVyaWFsIERlYWxlcnMjNDQ0MQotbmFpY3MjNDQ0MiNMYXduIGFuZCBHYXJkZW4gRXF1aXBtZW50IGFuZCBTdXBwbGllcyBTdG9yZXMjNDQ0Ci1uYWljcyM0NDQyMSNPdXRkb29yIFBvd2VyIEVxdWlwbWVudCBTdG9yZXMjNDQ0MgotbmFpY3MjNDQ0MjIjTnVyc2VyeSBhbmQgR2FyZGVuIENlbnRlcnMjNDQ0MgotbmFpY3MjNDQ1I0Zvb2QgYW5kIEJldmVyYWdlIFN0b3JlcyM0NAotbmFpY3MjNDQ1MSNHcm9jZXJ5IFN0b3JlcyM0NDUKLW5haWNzIzQ0NTExI1N1cGVybWFya2V0cyBhbmQgT3RoZXIgR3JvY2VyeSAoZXhjZXB0IENvbnZlbmllbmNlKSBTdG9yZXMjNDQ1MQotbmFpY3MjNDQ1MTIjQ29udmVuaWVuY2UgU3RvcmVzIzQ0NTEKLW5haWNzIzQ0NTIjU3BlY2lhbHR5IEZvb2QgU3RvcmVzIzQ0NQotbmFpY3MjNDQ1MjEjTWVhdCBNYXJrZXRzIzQ0NTIKLW5haWNzIzQ0NTIyI0Zpc2ggYW5kIFNlYWZvb2QgTWFya2V0cyM0NDUyCi1uYWljcyM0NDUyMyNGcnVpdCBhbmQgVmVnZXRhYmxlIE1hcmtldHMjNDQ1MgotbmFpY3MjNDQ1MjkjT3RoZXIgU3BlY2lhbHR5IEZvb2QgU3RvcmVzIzQ0NTIKLW5haWNzIzQ0NTI5MSNCYWtlZCBHb29kcyBTdG9yZXMjNDQ1MjkKLW5haWNzIzQ0NTI5MiNDb25mZWN0aW9uZXJ5IGFuZCBOdXQgU3RvcmVzIzQ0NTI5Ci1uYWljcyM0NDUyOTkjQWxsIE90aGVyIFNwZWNpYWx0eSBGb29kIFN0b3JlcyM0NDUyOQotbmFpY3MjNDQ1MyNCZWVyLCBXaW5lLCBhbmQgTGlxdW9yIFN0b3JlcyM0NDUKLW5haWNzIzQ0NTMxI0JlZXIsIFdpbmUsIGFuZCBMaXF1b3IgU3RvcmVzIzQ0NTMKLW5haWNzIzQ0NiNIZWFsdGggYW5kIFBlcnNvbmFsIENhcmUgU3RvcmVzIzQ0Ci1uYWljcyM0NDYxI0hlYWx0aCBhbmQgUGVyc29uYWwgQ2FyZSBTdG9yZXMjNDQ2Ci1uYWljcyM0NDYxMSNQaGFybWFjaWVzIGFuZCBEcnVnIFN0b3JlcyM0NDYxCi1uYWljcyM0NDYxMiNDb3NtZXRpY3MsIEJlYXV0eSBTdXBwbGllcywgYW5kIFBlcmZ1bWUgU3RvcmVzIzQ0NjEKLW5haWNzIzQ0NjEzI09wdGljYWwgR29vZHMgU3RvcmVzIzQ0NjEKLW5haWNzIzQ0NjE5I090aGVyIEhlYWx0aCBhbmQgUGVyc29uYWwgQ2FyZSBTdG9yZXMjNDQ2MQotbmFpY3MjNDQ2MTkxI0Zvb2QgKEhlYWx0aCkgU3VwcGxlbWVudCBTdG9yZXMjNDQ2MTkKLW5haWNzIzQ0NjE5OSNBbGwgT3RoZXIgSGVhbHRoIGFuZCBQZXJzb25hbCBDYXJlIFN0b3JlcyM0NDYxOQotbmFpY3MjNDQ3I0dhc29saW5lIFN0YXRpb25zIzQ0Ci1uYWljcyM0NDcxI0dhc29saW5lIFN0YXRpb25zIzQ0NwotbmFpY3MjNDQ3MTEjR2Fzb2xpbmUgU3RhdGlvbnMgd2l0aCBDb252ZW5pZW5jZSBTdG9yZXMjNDQ3MQotbmFpY3MjNDQ3MTkjT3RoZXIgR2Fzb2xpbmUgU3RhdGlvbnMjNDQ3MQotbmFpY3MjNDQ4I0Nsb3RoaW5nIGFuZCBDbG90aGluZyBBY2Nlc3NvcmllcyBTdG9yZXMjNDQKLW5haWNzIzQ0ODEjQ2xvdGhpbmcgU3RvcmVzIzQ0OAotbmFpY3MjNDQ4MTEjTWVuJ3MgQ2xvdGhpbmcgU3RvcmVzIzQ0ODEKLW5haWNzIzQ0ODEyI1dvbWVuJ3MgQ2xvdGhpbmcgU3RvcmVzIzQ0ODEKLW5haWNzIzQ0ODEzI0NoaWxkcmVuJ3MgYW5kIEluZmFudHMnIENsb3RoaW5nIFN0b3JlcyM0NDgxCi1uYWljcyM0NDgxNCNGYW1pbHkgQ2xvdGhpbmcgU3RvcmVzIzQ0ODEKLW5haWNzIzQ0ODE1I0Nsb3RoaW5nIEFjY2Vzc29yaWVzIFN0b3JlcyM0NDgxCi1uYWljcyM0NDgxOSNPdGhlciBDbG90aGluZyBTdG9yZXMjNDQ4MQotbmFpY3MjNDQ4MiNTaG9lIFN0b3JlcyM0NDgKLW5haWNzIzQ0ODIxI1Nob2UgU3RvcmVzIzQ0ODIKLW5haWNzIzQ0ODMjSmV3ZWxyeSwgTHVnZ2FnZSwgYW5kIExlYXRoZXIgR29vZHMgU3RvcmVzIzQ0OAotbmFpY3MjNDQ4MzEjSmV3ZWxyeSBTdG9yZXMjNDQ4MwotbmFpY3MjNDQ4MzIjTHVnZ2FnZSBhbmQgTGVhdGhlciBHb29kcyBTdG9yZXMjNDQ4MwotbmFpY3MjNDUjUmV0YWlsIFRyYWRlIzQ1Ci1uYWljcyM0NTEjU3BvcnRpbmcgR29vZHMsIEhvYmJ5LCBCb29rLCBhbmQgTXVzaWMgU3RvcmVzIzQ1Ci1uYWljcyM0NTExI1Nwb3J0aW5nIEdvb2RzLCBIb2JieSwgYW5kIE11c2ljYWwgSW5zdHJ1bWVudCBTdG9yZXMjNDUxCi1uYWljcyM0NTExMSNTcG9ydGluZyBHb29kcyBTdG9yZXMjNDUxMQotbmFpY3MjNDUxMTIjSG9iYnksIFRveSwgYW5kIEdhbWUgU3RvcmVzIzQ1MTEKLW5haWNzIzQ1MTEzI1Nld2luZywgTmVlZGxld29yaywgYW5kIFBpZWNlIEdvb2RzIFN0b3JlcyM0NTExCi1uYWljcyM0NTExNCNNdXNpY2FsIEluc3RydW1lbnQgYW5kIFN1cHBsaWVzIFN0b3JlcyM0NTExCi1uYWljcyM0NTEyI0Jvb2ssIFBlcmlvZGljYWwsIGFuZCBNdXNpYyBTdG9yZXMjNDUxCi1uYWljcyM0NTEyMSNCb29rIFN0b3JlcyBhbmQgTmV3cyBEZWFsZXJzIzQ1MTIKLW5haWNzIzQ1MTIxMSNCb29rIFN0b3JlcyM0NTEyMQotbmFpY3MjNDUxMjEyI05ld3MgRGVhbGVycyBhbmQgTmV3c3N0YW5kcyM0NTEyMQotbmFpY3MjNDUxMjIjUHJlcmVjb3JkZWQgVGFwZSwgQ29tcGFjdCBEaXNjLCBhbmQgUmVjb3JkIFN0b3JlcyM0NTEyCi1uYWljcyM0NTIjR2VuZXJhbCBNZXJjaGFuZGlzZSBTdG9yZXMjNDUKLW5haWNzIzQ1MjEjRGVwYXJ0bWVudCBTdG9yZXMjNDUyCi1uYWljcyM0NTIxMSNEZXBhcnRtZW50IFN0b3JlcyM0NTIxCi1uYWljcyM0NTI5I090aGVyIEdlbmVyYWwgTWVyY2hhbmRpc2UgU3RvcmVzIzQ1MgotbmFpY3MjNDUyOTEjV2FyZWhvdXNlIENsdWJzIGFuZCBTdXBlcnN0b3JlcyM0NTI5Ci1uYWljcyM0NTI5OSNBbGwgT3RoZXIgR2VuZXJhbCBNZXJjaGFuZGlzZSBTdG9yZXMjNDUyOQotbmFpY3MjNDUzI01pc2NlbGxhbmVvdXMgU3RvcmUgUmV0YWlsZXJzIzQ1Ci1uYWljcyM0NTMxI0Zsb3Jpc3RzIzQ1MwotbmFpY3MjNDUzMTEjRmxvcmlzdHMjNDUzMQotbmFpY3MjNDUzMiNPZmZpY2UgU3VwcGxpZXMsIFN0YXRpb25lcnksIGFuZCBHaWZ0IFN0b3JlcyM0NTMKLW5haWNzIzQ1MzIxI09mZmljZSBTdXBwbGllcyBhbmQgU3RhdGlvbmVyeSBTdG9yZXMjNDUzMgotbmFpY3MjNDUzMjIjR2lmdCwgTm92ZWx0eSwgYW5kIFNvdXZlbmlyIFN0b3JlcyM0NTMyCi1uYWljcyM0NTMzI1VzZWQgTWVyY2hhbmRpc2UgU3RvcmVzIzQ1MwotbmFpY3MjNDUzMzEjVXNlZCBNZXJjaGFuZGlzZSBTdG9yZXMjNDUzMwotbmFpY3MjNDUzOSNPdGhlciBNaXNjZWxsYW5lb3VzIFN0b3JlIFJldGFpbGVycyM0NTMKLW5haWNzIzQ1MzkxI1BldCBhbmQgUGV0IFN1cHBsaWVzIFN0b3JlcyM0NTM5Ci1uYWljcyM0NTM5MiNBcnQgRGVhbGVycyM0NTM5Ci1uYWljcyM0NTM5MyNNYW51ZmFjdHVyZWQgKE1vYmlsZSkgSG9tZSBEZWFsZXJzIzQ1MzkKLW5haWNzIzQ1Mzk5I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIFN0b3JlIFJldGFpbGVycyM0NTM5Ci1uYWljcyM0NTM5OTEjVG9iYWNjbyBTdG9yZXMjNDUzOTkKLW5haWNzIzQ1Mzk5OCNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBTdG9yZSBSZXRhaWxlcnMgKGV4Y2VwdCBUb2JhY2NvIFN0b3JlcykjNDUzOTkKLW5haWNzIzQ1NCNOb25zdG9yZSBSZXRhaWxlcnMjNDUKLW5haWNzIzQ1NDEjRWxlY3Ryb25pYyBTaG9wcGluZyBhbmQgTWFpbC1PcmRlciBIb3VzZXMjNDU0Ci1uYWljcyM0NTQxMSNFbGVjdHJvbmljIFNob3BwaW5nIGFuZCBNYWlsLU9yZGVyIEhvdXNlcyM0NTQxCi1uYWljcyM0NTQyI1ZlbmRpbmcgTWFjaGluZSBPcGVyYXRvcnMjNDU0Ci1uYWljcyM0NTQyMSNWZW5kaW5nIE1hY2hpbmUgT3BlcmF0b3JzIzQ1NDIKLW5haWNzIzQ1NDMjRGlyZWN0IFNlbGxpbmcgRXN0YWJsaXNobWVudHMjNDU0Ci1uYWljcyM0NTQzMSNGdWVsIERlYWxlcnMjNDU0MwotbmFpY3MjNDU0MzExI0hlYXRpbmcgT2lsIERlYWxlcnMjNDU0MzEKLW5haWNzIzQ1NDMxMiNMaXF1ZWZpZWQgUGV0cm9sZXVtIEdhcyAoQm90dGxlZCBHYXMpIERlYWxlcnMjNDU0MzEKLW5haWNzIzQ1NDMxOSNPdGhlciBGdWVsIERlYWxlcnMjNDU0MzEKLW5haWNzIzQ1NDM5I090aGVyIERpcmVjdCBTZWxsaW5nIEVzdGFibGlzaG1lbnRzIzQ1NDMKLW5haWNzIzQ4I1RyYW5zcG9ydGF0aW9uIGFuZCBXYXJlaG91c2luZyM0OAotbmFpY3MjNDgxI0FpciBUcmFuc3BvcnRhdGlvbiM0OAotbmFpY3MjNDgxMSNTY2hlZHVsZWQgQWlyIFRyYW5zcG9ydGF0aW9uIzQ4MQotbmFpY3MjNDgxMTEjU2NoZWR1bGVkIEFpciBUcmFuc3BvcnRhdGlvbiM0ODExCi1uYWljcyM0ODExMTEjU2NoZWR1bGVkIFBhc3NlbmdlciBBaXIgVHJhbnNwb3J0YXRpb24jNDgxMTEKLW5haWNzIzQ4MTExMiNTY2hlZHVsZWQgRnJlaWdodCBBaXIgVHJhbnNwb3J0YXRpb24jNDgxMTEKLW5haWNzIzQ4MTIjTm9uc2NoZWR1bGVkIEFpciBUcmFuc3BvcnRhdGlvbiM0ODEKLW5haWNzIzQ4MTIxI05vbnNjaGVkdWxlZCBBaXIgVHJhbnNwb3J0YXRpb24jNDgxMgotbmFpY3MjNDgxMjExI05vbnNjaGVkdWxlZCBDaGFydGVyZWQgUGFzc2VuZ2VyIEFpciBUcmFuc3BvcnRhdGlvbiM0ODEyMQotbmFpY3MjNDgxMjEyI05vbnNjaGVkdWxlZCBDaGFydGVyZWQgRnJlaWdodCBBaXIgVHJhbnNwb3J0YXRpb24jNDgxMjEKLW5haWNzIzQ4MTIxOSNPdGhlciBOb25zY2hlZHVsZWQgQWlyIFRyYW5zcG9ydGF0aW9uIzQ4MTIxCi1uYWljcyM0ODIjUmFpbCBUcmFuc3BvcnRhdGlvbiM0OAotbmFpY3MjNDgyMSNSYWlsIFRyYW5zcG9ydGF0aW9uIzQ4MgotbmFpY3MjNDgyMTEjUmFpbCBUcmFuc3BvcnRhdGlvbiM0ODIxCi1uYWljcyM0ODIxMTEjTGluZS1IYXVsIFJhaWxyb2FkcyM0ODIxMQotbmFpY3MjNDgyMTEyI1Nob3J0IExpbmUgUmFpbHJvYWRzIzQ4MjExCi1uYWljcyM0ODMjV2F0ZXIgVHJhbnNwb3J0YXRpb24jNDgKLW5haWNzIzQ4MzEjRGVlcCBTZWEsIENvYXN0YWwsIGFuZCBHcmVhdCBMYWtlcyBXYXRlciBUcmFuc3BvcnRhdGlvbiM0ODMKLW5haWNzIzQ4MzExI0RlZXAgU2VhLCBDb2FzdGFsLCBhbmQgR3JlYXQgTGFrZXMgV2F0ZXIgVHJhbnNwb3J0YXRpb24jNDgzMQotbmFpY3MjNDgzMTExI0RlZXAgU2VhIEZyZWlnaHQgVHJhbnNwb3J0YXRpb24jNDgzMTEKLW5haWNzIzQ4MzExMiNEZWVwIFNlYSBQYXNzZW5nZXIgVHJhbnNwb3J0YXRpb24jNDgzMTEKLW5haWNzIzQ4MzExMyNDb2FzdGFsIGFuZCBHcmVhdCBMYWtlcyBGcmVpZ2h0IFRyYW5zcG9ydGF0aW9uIzQ4MzExCi1uYWljcyM0ODMxMTQjQ29hc3RhbCBhbmQgR3JlYXQgTGFrZXMgUGFzc2VuZ2VyIFRyYW5zcG9ydGF0aW9uIzQ4MzExCi1uYWljcyM0ODMyI0lubGFuZCBXYXRlciBUcmFuc3BvcnRhdGlvbiM0ODMKLW5haWNzIzQ4MzIxI0lubGFuZCBXYXRlciBUcmFuc3BvcnRhdGlvbiM0ODMyCi1uYWljcyM0ODMyMTEjSW5sYW5kIFdhdGVyIEZyZWlnaHQgVHJhbnNwb3J0YXRpb24jNDgzMjEKLW5haWNzIzQ4MzIxMiNJbmxhbmQgV2F0ZXIgUGFzc2VuZ2VyIFRyYW5zcG9ydGF0aW9uIzQ4MzIxCi1uYWljcyM0ODQjVHJ1Y2sgVHJhbnNwb3J0YXRpb24jNDgKLW5haWNzIzQ4NDEjR2VuZXJhbCBGcmVpZ2h0IFRydWNraW5nIzQ4NAotbmFpY3MjNDg0MTEjR2VuZXJhbCBGcmVpZ2h0IFRydWNraW5nLCBMb2NhbCM0ODQxCi1uYWljcyM0ODQxMiNHZW5lcmFsIEZyZWlnaHQgVHJ1Y2tpbmcsIExvbmctRGlzdGFuY2UjNDg0MQotbmFpY3MjNDg0MTIxI0dlbmVyYWwgRnJlaWdodCBUcnVja2luZywgTG9uZy1EaXN0YW5jZSwgVHJ1Y2tsb2FkIzQ4NDEyCi1uYWljcyM0ODQxMjIjR2VuZXJhbCBGcmVpZ2h0IFRydWNraW5nLCBMb25nLURpc3RhbmNlLCBMZXNzIFRoYW4gVHJ1Y2tsb2FkIzQ4NDEyCi1uYWljcyM0ODQyI1NwZWNpYWxpemVkIEZyZWlnaHQgVHJ1Y2tpbmcjNDg0Ci1uYWljcyM0ODQyMSNVc2VkIEhvdXNlaG9sZCBhbmQgT2ZmaWNlIEdvb2RzIE1vdmluZyM0ODQyCi1uYWljcyM0ODQyMiNTcGVjaWFsaXplZCBGcmVpZ2h0IChleGNlcHQgVXNlZCBHb29kcykgVHJ1Y2tpbmcsIExvY2FsIzQ4NDIKLW5haWNzIzQ4NDIzI1NwZWNpYWxpemVkIEZyZWlnaHQgKGV4Y2VwdCBVc2VkIEdvb2RzKSBUcnVja2luZywgTG9uZy1EaXN0YW5jZSM0ODQyCi1uYWljcyM0ODUjVHJhbnNpdCBhbmQgR3JvdW5kIFBhc3NlbmdlciBUcmFuc3BvcnRhdGlvbiM0OAotbmFpY3MjNDg1MSNVcmJhbiBUcmFuc2l0IFN5c3RlbXMjNDg1Ci1uYWljcyM0ODUxMSNVcmJhbiBUcmFuc2l0IFN5c3RlbXMjNDg1MQotbmFpY3MjNDg1MTExI01peGVkIE1vZGUgVHJhbnNpdCBTeXN0ZW1zIzQ4NTExCi1uYWljcyM0ODUxMTIjQ29tbXV0ZXIgUmFpbCBTeXN0ZW1zIzQ4NTExCi1uYWljcyM0ODUxMTMjQnVzIGFuZCBPdGhlciBNb3RvciBWZWhpY2xlIFRyYW5zaXQgU3lzdGVtcyM0ODUxMQotbmFpY3MjNDg1MTE5I090aGVyIFVyYmFuIFRyYW5zaXQgU3lzdGVtcyM0ODUxMQotbmFpY3MjNDg1MiNJbnRlcnVyYmFuIGFuZCBSdXJhbCBCdXMgVHJhbnNwb3J0YXRpb24jNDg1Ci1uYWljcyM0ODUyMSNJbnRlcnVyYmFuIGFuZCBSdXJhbCBCdXMgVHJhbnNwb3J0YXRpb24jNDg1MgotbmFpY3MjNDg1MyNUYXhpIGFuZCBMaW1vdXNpbmUgU2VydmljZSM0ODUKLW5haWNzIzQ4NTMxI1RheGkgU2VydmljZSM0ODUzCi1uYWljcyM0ODUzMiNMaW1vdXNpbmUgU2VydmljZSM0ODUzCi1uYWljcyM0ODU0I1NjaG9vbCBhbmQgRW1wbG95ZWUgQnVzIFRyYW5zcG9ydGF0aW9uIzQ4NQotbmFpY3MjNDg1NDEjU2Nob29sIGFuZCBFbXBsb3llZSBCdXMgVHJhbnNwb3J0YXRpb24jNDg1NAotbmFpY3MjNDg1NSNDaGFydGVyIEJ1cyBJbmR1c3RyeSM0ODUKLW5haWNzIzQ4NTUxI0NoYXJ0ZXIgQnVzIEluZHVzdHJ5IzQ4NTUKLW5haWNzIzQ4NTkjT3RoZXIgVHJhbnNpdCBhbmQgR3JvdW5kIFBhc3NlbmdlciBUcmFuc3BvcnRhdGlvbiM0ODUKLW5haWNzIzQ4NTk5I090aGVyIFRyYW5zaXQgYW5kIEdyb3VuZCBQYXNzZW5nZXIgVHJhbnNwb3J0YXRpb24jNDg1OQotbmFpY3MjNDg1OTkxI1NwZWNpYWwgTmVlZHMgVHJhbnNwb3J0YXRpb24jNDg1OTkKLW5haWNzIzQ4NTk5OSNBbGwgT3RoZXIgVHJhbnNpdCBhbmQgR3JvdW5kIFBhc3NlbmdlciBUcmFuc3BvcnRhdGlvbiM0ODU5OQotbmFpY3MjNDg2I1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIzQ4Ci1uYWljcyM0ODYxI1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIG9mIENydWRlIE9pbCM0ODYKLW5haWNzIzQ4NjExI1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIG9mIENydWRlIE9pbCM0ODYxCi1uYWljcyM0ODYyI1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIG9mIE5hdHVyYWwgR2FzIzQ4NgotbmFpY3MjNDg2MjEjUGlwZWxpbmUgVHJhbnNwb3J0YXRpb24gb2YgTmF0dXJhbCBHYXMjNDg2MgotbmFpY3MjNDg2OSNPdGhlciBQaXBlbGluZSBUcmFuc3BvcnRhdGlvbiM0ODYKLW5haWNzIzQ4NjkxI1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIG9mIFJlZmluZWQgUGV0cm9sZXVtIFByb2R1Y3RzIzQ4NjkKLW5haWNzIzQ4Njk5I0FsbCBPdGhlciBQaXBlbGluZSBUcmFuc3BvcnRhdGlvbiM0ODY5Ci1uYWljcyM0ODcjU2NlbmljIGFuZCBTaWdodHNlZWluZyBUcmFuc3BvcnRhdGlvbiM0OAotbmFpY3MjNDg3MSNTY2VuaWMgYW5kIFNpZ2h0c2VlaW5nIFRyYW5zcG9ydGF0aW9uLCBMYW5kIzQ4NwotbmFpY3MjNDg3MTEjU2NlbmljIGFuZCBTaWdodHNlZWluZyBUcmFuc3BvcnRhdGlvbiwgTGFuZCM0ODcxCi1uYWljcyM0ODcyI1NjZW5pYyBhbmQgU2lnaHRzZWVpbmcgVHJhbnNwb3J0YXRpb24sIFdhdGVyIzQ4NwotbmFpY3MjNDg3MjEjU2NlbmljIGFuZCBTaWdodHNlZWluZyBUcmFuc3BvcnRhdGlvbiwgV2F0ZXIjNDg3MgotbmFpY3MjNDg3OSNTY2VuaWMgYW5kIFNpZ2h0c2VlaW5nIFRyYW5zcG9ydGF0aW9uLCBPdGhlciM0ODcKLW5haWNzIzQ4Nzk5I1NjZW5pYyBhbmQgU2lnaHRzZWVpbmcgVHJhbnNwb3J0YXRpb24sIE90aGVyIzQ4NzkKLW5haWNzIzQ4OCNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIFRyYW5zcG9ydGF0aW9uIzQ4Ci1uYWljcyM0ODgxI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgQWlyIFRyYW5zcG9ydGF0aW9uIzQ4OAotbmFpY3MjNDg4MTEjQWlycG9ydCBPcGVyYXRpb25zIzQ4ODEKLW5haWNzIzQ4ODExMSNBaXIgVHJhZmZpYyBDb250cm9sIzQ4ODExCi1uYWljcyM0ODgxMTkjT3RoZXIgQWlycG9ydCBPcGVyYXRpb25zIzQ4ODExCi1uYWljcyM0ODgxOSNPdGhlciBTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIEFpciBUcmFuc3BvcnRhdGlvbiM0ODgxCi1uYWljcyM0ODgyI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgUmFpbCBUcmFuc3BvcnRhdGlvbiM0ODgKLW5haWNzIzQ4ODIxI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgUmFpbCBUcmFuc3BvcnRhdGlvbiM0ODgyCi1uYWljcyM0ODgzI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgV2F0ZXIgVHJhbnNwb3J0YXRpb24jNDg4Ci1uYWljcyM0ODgzMSNQb3J0IGFuZCBIYXJib3IgT3BlcmF0aW9ucyM0ODgzCi1uYWljcyM0ODgzMiNNYXJpbmUgQ2FyZ28gSGFuZGxpbmcjNDg4MwotbmFpY3MjNDg4MzMjTmF2aWdhdGlvbmFsIFNlcnZpY2VzIHRvIFNoaXBwaW5nIzQ4ODMKLW5haWNzIzQ4ODM5I090aGVyIFN1cHBvcnQgQWN0aXZpdGllcyBmb3IgV2F0ZXIgVHJhbnNwb3J0YXRpb24jNDg4MwotbmFpY3MjNDg4NCNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIFJvYWQgVHJhbnNwb3J0YXRpb24jNDg4Ci1uYWljcyM0ODg0MSNNb3RvciBWZWhpY2xlIFRvd2luZyM0ODg0Ci1uYWljcyM0ODg0OSNPdGhlciBTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIFJvYWQgVHJhbnNwb3J0YXRpb24jNDg4NAotbmFpY3MjNDg4NSNGcmVpZ2h0IFRyYW5zcG9ydGF0aW9uIEFycmFuZ2VtZW50IzQ4OAotbmFpY3MjNDg4NTEjRnJlaWdodCBUcmFuc3BvcnRhdGlvbiBBcnJhbmdlbWVudCM0ODg1Ci1uYWljcyM0ODg5I090aGVyIFN1cHBvcnQgQWN0aXZpdGllcyBmb3IgVHJhbnNwb3J0YXRpb24jNDg4Ci1uYWljcyM0ODg5OSNPdGhlciBTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIFRyYW5zcG9ydGF0aW9uIzQ4ODkKLW5haWNzIzQ4ODk5MSNQYWNraW5nIGFuZCBDcmF0aW5nIzQ4ODk5Ci1uYWljcyM0ODg5OTkjQWxsIE90aGVyIFN1cHBvcnQgQWN0aXZpdGllcyBmb3IgVHJhbnNwb3J0YXRpb24jNDg4OTkKLW5haWNzIzQ5I1RyYW5zcG9ydGF0aW9uIGFuZCBXYXJlaG91c2luZyM0OQotbmFpY3MjNDkxI1Bvc3RhbCBTZXJ2aWNlIzQ5Ci1uYWljcyM0OTExI1Bvc3RhbCBTZXJ2aWNlIzQ5MQotbmFpY3MjNDkxMTEjUG9zdGFsIFNlcnZpY2UjNDkxMQotbmFpY3MjNDkyI0NvdXJpZXJzIGFuZCBNZXNzZW5nZXJzIzQ5Ci1uYWljcyM0OTIxI0NvdXJpZXJzIzQ5MgotbmFpY3MjNDkyMTEjQ291cmllcnMjNDkyMQotbmFpY3MjNDkyMiNMb2NhbCBNZXNzZW5nZXJzIGFuZCBMb2NhbCBEZWxpdmVyeSM0OTIKLW5haWNzIzQ5MjIxI0xvY2FsIE1lc3NlbmdlcnMgYW5kIExvY2FsIERlbGl2ZXJ5IzQ5MjIKLW5haWNzIzQ5MyNXYXJlaG91c2luZyBhbmQgU3RvcmFnZSM0OQotbmFpY3MjNDkzMSNXYXJlaG91c2luZyBhbmQgU3RvcmFnZSM0OTMKLW5haWNzIzQ5MzExI0dlbmVyYWwgV2FyZWhvdXNpbmcgYW5kIFN0b3JhZ2UjNDkzMQotbmFpY3MjNDkzMTIjUmVmcmlnZXJhdGVkIFdhcmVob3VzaW5nIGFuZCBTdG9yYWdlIzQ5MzEKLW5haWNzIzQ5MzEzI0Zhcm0gUHJvZHVjdCBXYXJlaG91c2luZyBhbmQgU3RvcmFnZSM0OTMxCi1uYWljcyM0OTMxOSNPdGhlciBXYXJlaG91c2luZyBhbmQgU3RvcmFnZSM0OTMxCi1uYWljcyM1MSNJbmZvcm1hdGlvbiM1MQotbmFpY3MjNTExI1B1Ymxpc2hpbmcgSW5kdXN0cmllcyM1MQotbmFpY3MjNTExMSNOZXdzcGFwZXIsIFBlcmlvZGljYWwsIEJvb2ssIGFuZCBEYXRhYmFzZSBQdWJsaXNoZXJzIzUxMQotbmFpY3MjNTExMTEjTmV3c3BhcGVyIFB1Ymxpc2hlcnMjNTExMQotbmFpY3MjNTExMTIjUGVyaW9kaWNhbCBQdWJsaXNoZXJzIzUxMTEKLW5haWNzIzUxMTEzI0Jvb2sgUHVibGlzaGVycyM1MTExCi1uYWljcyM1MTExNCNEYXRhYmFzZSBhbmQgRGlyZWN0b3J5IFB1Ymxpc2hlcnMjNTExMQotbmFpY3MjNTExMTkjT3RoZXIgUHVibGlzaGVycyM1MTExCi1uYWljcyM1MTExOTEjR3JlZXRpbmcgQ2FyZCBQdWJsaXNoZXJzIzUxMTE5Ci1uYWljcyM1MTExOTkjQWxsIE90aGVyIFB1Ymxpc2hlcnMjNTExMTkKLW5haWNzIzUxMTIjU29mdHdhcmUgUHVibGlzaGVycyM1MTEKLW5haWNzIzUxMTIxI1NvZnR3YXJlIFB1Ymxpc2hlcnMjNTExMgotbmFpY3MjNTEyI01vdGlvbiBQaWN0dXJlIGFuZCBTb3VuZCBSZWNvcmRpbmcgSW5kdXN0cmllcyM1MQotbmFpY3MjNTEyMSNNb3Rpb24gUGljdHVyZSBhbmQgVmlkZW8gSW5kdXN0cmllcyM1MTIKLW5haWNzIzUxMjExI01vdGlvbiBQaWN0dXJlIGFuZCBWaWRlbyBQcm9kdWN0aW9uIzUxMjEKLW5haWNzIzUxMjEyI01vdGlvbiBQaWN0dXJlIGFuZCBWaWRlbyBEaXN0cmlidXRpb24jNTEyMQotbmFpY3MjNTEyMTMjTW90aW9uIFBpY3R1cmUgYW5kIFZpZGVvIEV4aGliaXRpb24jNTEyMQotbmFpY3MjNTEyMTMxI01vdGlvbiBQaWN0dXJlIFRoZWF0ZXJzIChleGNlcHQgRHJpdmUtSW5zKSM1MTIxMwotbmFpY3MjNTEyMTMyI0RyaXZlLUluIE1vdGlvbiBQaWN0dXJlIFRoZWF0ZXJzIzUxMjEzCi1uYWljcyM1MTIxOSNQb3N0cHJvZHVjdGlvbiBTZXJ2aWNlcyBhbmQgT3RoZXIgTW90aW9uIFBpY3R1cmUgYW5kIFZpZGVvIEluZHVzdHJpZXMjNTEyMQotbmFpY3MjNTEyMTkxI1RlbGVwcm9kdWN0aW9uIGFuZCBPdGhlciBQb3N0cHJvZHVjdGlvbiBTZXJ2aWNlcyM1MTIxOQotbmFpY3MjNTEyMTk5I090aGVyIE1vdGlvbiBQaWN0dXJlIGFuZCBWaWRlbyBJbmR1c3RyaWVzIzUxMjE5Ci1uYWljcyM1MTIyI1NvdW5kIFJlY29yZGluZyBJbmR1c3RyaWVzIzUxMgotbmFpY3MjNTEyMjEjUmVjb3JkIFByb2R1Y3Rpb24jNTEyMgotbmFpY3MjNTEyMjIjSW50ZWdyYXRlZCBSZWNvcmQgUHJvZHVjdGlvbi9EaXN0cmlidXRpb24jNTEyMgotbmFpY3MjNTEyMjMjTXVzaWMgUHVibGlzaGVycyM1MTIyCi1uYWljcyM1MTIyNCNTb3VuZCBSZWNvcmRpbmcgU3R1ZGlvcyM1MTIyCi1uYWljcyM1MTIyOSNPdGhlciBTb3VuZCBSZWNvcmRpbmcgSW5kdXN0cmllcyM1MTIyCi1uYWljcyM1MTMjQnJvYWRjYXN0aW5nIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMjNTEKLW5haWNzIzUxMzEjUmFkaW8gYW5kIFRlbGV2aXNpb24gQnJvYWRjYXN0aW5nIzUxMwotbmFpY3MjNTEzMTEjUmFkaW8gQnJvYWRjYXN0aW5nIzUxMzEKLW5haWNzIzUxMzExMSNSYWRpbyBOZXR3b3JrcyM1MTMxMQotbmFpY3MjNTEzMTEyI1JhZGlvIFN0YXRpb25zIzUxMzExCi1uYWljcyM1MTMxMiNUZWxldmlzaW9uIEJyb2FkY2FzdGluZyM1MTMxCi1uYWljcyM1MTMyI0NhYmxlIE5ldHdvcmtzIGFuZCBQcm9ncmFtIERpc3RyaWJ1dGlvbiM1MTMKLW5haWNzIzUxMzIxI0NhYmxlIE5ldHdvcmtzIzUxMzIKLW5haWNzIzUxMzIyI0NhYmxlIGFuZCBPdGhlciBQcm9ncmFtIERpc3RyaWJ1dGlvbiM1MTMyCi1uYWljcyM1MTMzI1RlbGVjb21tdW5pY2F0aW9ucyM1MTMKLW5haWNzIzUxMzMxI1dpcmVkIFRlbGVjb21tdW5pY2F0aW9ucyBDYXJyaWVycyM1MTMzCi1uYWljcyM1MTMzMiNXaXJlbGVzcyBUZWxlY29tbXVuaWNhdGlvbnMgQ2FycmllcnMgKGV4Y2VwdCBTYXRlbGxpdGUpIzUxMzMKLW5haWNzIzUxMzMyMSNQYWdpbmcjNTEzMzIKLW5haWNzIzUxMzMyMiNDZWxsdWxhciBhbmQgT3RoZXIgV2lyZWxlc3MgVGVsZWNvbW11bmljYXRpb25zIzUxMzMyCi1uYWljcyM1MTMzMyNUZWxlY29tbXVuaWNhdGlvbnMgUmVzZWxsZXJzIzUxMzMKLW5haWNzIzUxMzM0I1NhdGVsbGl0ZSBUZWxlY29tbXVuaWNhdGlvbnMjNTEzMwotbmFpY3MjNTEzMzkjT3RoZXIgVGVsZWNvbW11bmljYXRpb25zIzUxMzMKLW5haWNzIzUxNCNJbmZvcm1hdGlvbiBTZXJ2aWNlcyBhbmQgRGF0YSBQcm9jZXNzaW5nIFNlcnZpY2VzIzUxCi1uYWljcyM1MTQxI0luZm9ybWF0aW9uIFNlcnZpY2VzIzUxNAotbmFpY3MjNTE0MTEjTmV3cyBTeW5kaWNhdGVzIzUxNDEKLW5haWNzIzUxNDEyI0xpYnJhcmllcyBhbmQgQXJjaGl2ZXMjNTE0MQotbmFpY3MjNTE0MTkjT3RoZXIgSW5mb3JtYXRpb24gU2VydmljZXMjNTE0MQotbmFpY3MjNTE0MTkxI09uLUxpbmUgSW5mb3JtYXRpb24gU2VydmljZXMjNTE0MTkKLW5haWNzIzUxNDE5OSNBbGwgT3RoZXIgSW5mb3JtYXRpb24gU2VydmljZXMjNTE0MTkKLW5haWNzIzUxNDIjRGF0YSBQcm9jZXNzaW5nIFNlcnZpY2VzIzUxNAotbmFpY3MjNTE0MjEjRGF0YSBQcm9jZXNzaW5nIFNlcnZpY2VzIzUxNDIKLW5haWNzIzUyI0ZpbmFuY2UgYW5kIEluc3VyYW5jZSM1MgotbmFpY3MjNTIxI01vbmV0YXJ5IEF1dGhvcml0aWVzIC0gQ2VudHJhbCBCYW5rIzUyCi1uYWljcyM1MjExI01vbmV0YXJ5IEF1dGhvcml0aWVzIC0gQ2VudHJhbCBCYW5rIzUyMQotbmFpY3MjNTIxMTEjTW9uZXRhcnkgQXV0aG9yaXRpZXMgLSBDZW50cmFsIEJhbmsjNTIxMQotbmFpY3MjNTIyI0NyZWRpdCBJbnRlcm1lZGlhdGlvbiBhbmQgUmVsYXRlZCBBY3Rpdml0aWVzIzUyCi1uYWljcyM1MjIxI0RlcG9zaXRvcnkgQ3JlZGl0IEludGVybWVkaWF0aW9uIzUyMgotbmFpY3MjNTIyMTEjQ29tbWVyY2lhbCBCYW5raW5nIzUyMjEKLW5haWNzIzUyMjEyI1NhdmluZ3MgSW5zdGl0dXRpb25zIzUyMjEKLW5haWNzIzUyMjEzI0NyZWRpdCBVbmlvbnMjNTIyMQotbmFpY3MjNTIyMTkjT3RoZXIgRGVwb3NpdG9yeSBDcmVkaXQgSW50ZXJtZWRpYXRpb24jNTIyMQotbmFpY3MjNTIyMiNOb25kZXBvc2l0b3J5IENyZWRpdCBJbnRlcm1lZGlhdGlvbiM1MjIKLW5haWNzIzUyMjIxI0NyZWRpdCBDYXJkIElzc3VpbmcjNTIyMgotbmFpY3MjNTIyMjIjU2FsZXMgRmluYW5jaW5nIzUyMjIKLW5haWNzIzUyMjI5I090aGVyIE5vbmRlcG9zaXRvcnkgQ3JlZGl0IEludGVybWVkaWF0aW9uIzUyMjIKLW5haWNzIzUyMjI5MSNDb25zdW1lciBMZW5kaW5nIzUyMjI5Ci1uYWljcyM1MjIyOTIjUmVhbCBFc3RhdGUgQ3JlZGl0IzUyMjI5Ci1uYWljcyM1MjIyOTMjSW50ZXJuYXRpb25hbCBUcmFkZSBGaW5hbmNpbmcjNTIyMjkKLW5haWNzIzUyMjI5NCNTZWNvbmRhcnkgTWFya2V0IEZpbmFuY2luZyM1MjIyOQotbmFpY3MjNTIyMjk4I0FsbCBPdGhlciBOb25kZXBvc2l0b3J5IENyZWRpdCBJbnRlcm1lZGlhdGlvbiM1MjIyOQotbmFpY3MjNTIyMyNBY3Rpdml0aWVzIFJlbGF0ZWQgdG8gQ3JlZGl0IEludGVybWVkaWF0aW9uIzUyMgotbmFpY3MjNTIyMzEjTW9ydGdhZ2UgYW5kIE5vbm1vcnRnYWdlIExvYW4gQnJva2VycyM1MjIzCi1uYWljcyM1MjIzMiNGaW5hbmNpYWwgVHJhbnNhY3Rpb25zIFByb2Nlc3NpbmcsIFJlc2VydmUsIGFuZCBDbGVhcmluZ2hvdXNlIEFjdGl2aXRpZXMjNTIyMwotbmFpY3MjNTIyMzkjT3RoZXIgQWN0aXZpdGllcyBSZWxhdGVkIHRvIENyZWRpdCBJbnRlcm1lZGlhdGlvbiM1MjIzCi1uYWljcyM1MjMjU2VjdXJpdGllcywgQ29tbW9kaXR5IENvbnRyYWN0cywgYW5kIE90aGVyIEZpbmFuY2lhbCBJbnZlc3RtZW50cyBhbmQgUmVsYXRlZCBBY3Rpdml0aWVzIzUyCi1uYWljcyM1MjMxI1NlY3VyaXRpZXMgYW5kIENvbW1vZGl0eSBDb250cmFjdHMgSW50ZXJtZWRpYXRpb24gYW5kIEJyb2tlcmFnZSM1MjMKLW5haWNzIzUyMzExI0ludmVzdG1lbnQgQmFua2luZyBhbmQgU2VjdXJpdGllcyBEZWFsaW5nIzUyMzEKLW5haWNzIzUyMzEyI1NlY3VyaXRpZXMgQnJva2VyYWdlIzUyMzEKLW5haWNzIzUyMzEzI0NvbW1vZGl0eSBDb250cmFjdHMgRGVhbGluZyM1MjMxCi1uYWljcyM1MjMxNCNDb21tb2RpdHkgQ29udHJhY3RzIEJyb2tlcmFnZSM1MjMxCi1uYWljcyM1MjMyI1NlY3VyaXRpZXMgYW5kIENvbW1vZGl0eSBFeGNoYW5nZXMjNTIzCi1uYWljcyM1MjMyMSNTZWN1cml0aWVzIGFuZCBDb21tb2RpdHkgRXhjaGFuZ2VzIzUyMzIKLW5haWNzIzUyMzkjT3RoZXIgRmluYW5jaWFsIEludmVzdG1lbnQgQWN0aXZpdGllcyM1MjMKLW5haWNzIzUyMzkxI01pc2NlbGxhbmVvdXMgSW50ZXJtZWRpYXRpb24jNTIzOQotbmFpY3MjNTIzOTIjUG9ydGZvbGlvIE1hbmFnZW1lbnQjNTIzOQotbmFpY3MjNTIzOTMjSW52ZXN0bWVudCBBZHZpY2UjNTIzOQotbmFpY3MjNTIzOTkjQWxsIE90aGVyIEZpbmFuY2lhbCBJbnZlc3RtZW50IEFjdGl2aXRpZXMjNTIzOQotbmFpY3MjNTIzOTkxI1RydXN0LCBGaWR1Y2lhcnksIGFuZCBDdXN0b2R5IEFjdGl2aXRpZXMjNTIzOTkKLW5haWNzIzUyMzk5OSNNaXNjZWxsYW5lb3VzIEZpbmFuY2lhbCBJbnZlc3RtZW50IEFjdGl2aXRpZXMjNTIzOTkKLW5haWNzIzUyNCNJbnN1cmFuY2UgQ2FycmllcnMgYW5kIFJlbGF0ZWQgQWN0aXZpdGllcyM1MgotbmFpY3MjNTI0MSNJbnN1cmFuY2UgQ2FycmllcnMjNTI0Ci1uYWljcyM1MjQxMSNEaXJlY3QgTGlmZSwgSGVhbHRoLCBhbmQgTWVkaWNhbCBJbnN1cmFuY2UgQ2FycmllcnMjNTI0MQotbmFpY3MjNTI0MTEzI0RpcmVjdCBMaWZlIEluc3VyYW5jZSBDYXJyaWVycyM1MjQxMQotbmFpY3MjNTI0MTE0I0RpcmVjdCBIZWFsdGggYW5kIE1lZGljYWwgSW5zdXJhbmNlIENhcnJpZXJzIzUyNDExCi1uYWljcyM1MjQxMiNEaXJlY3QgSW5zdXJhbmNlIChleGNlcHQgTGlmZSwgSGVhbHRoLCBhbmQgTWVkaWNhbCkgQ2FycmllcnMjNTI0MQotbmFpY3MjNTI0MTI2I0RpcmVjdCBQcm9wZXJ0eSBhbmQgQ2FzdWFsdHkgSW5zdXJhbmNlIENhcnJpZXJzIzUyNDEyCi1uYWljcyM1MjQxMjcjRGlyZWN0IFRpdGxlIEluc3VyYW5jZSBDYXJyaWVycyM1MjQxMgotbmFpY3MjNTI0MTI4I090aGVyIERpcmVjdCBJbnN1cmFuY2UgKGV4Y2VwdCBMaWZlLCBIZWFsdGgsIGFuZCBNZWRpY2FsKSBDYXJyaWVycyM1MjQxMgotbmFpY3MjNTI0MTMjUmVpbnN1cmFuY2UgQ2FycmllcnMjNTI0MQotbmFpY3MjNTI0MiNBZ2VuY2llcywgQnJva2VyYWdlcywgYW5kIE90aGVyIEluc3VyYW5jZSBSZWxhdGVkIEFjdGl2aXRpZXMjNTI0Ci1uYWljcyM1MjQyMSNJbnN1cmFuY2UgQWdlbmNpZXMgYW5kIEJyb2tlcmFnZXMjNTI0MgotbmFpY3MjNTI0MjkjT3RoZXIgSW5zdXJhbmNlIFJlbGF0ZWQgQWN0aXZpdGllcyM1MjQyCi1uYWljcyM1MjQyOTEjQ2xhaW1zIEFkanVzdGluZyM1MjQyOQotbmFpY3MjNTI0MjkyI1RoaXJkIFBhcnR5IEFkbWluaXN0cmF0aW9uIG9mIEluc3VyYW5jZSBhbmQgUGVuc2lvbiBGdW5kcyM1MjQyOQotbmFpY3MjNTI0Mjk4I0FsbCBPdGhlciBJbnN1cmFuY2UgUmVsYXRlZCBBY3Rpdml0aWVzIzUyNDI5Ci1uYWljcyM1MjUjRnVuZHMsIFRydXN0cywgYW5kIE90aGVyIEZpbmFuY2lhbCBWZWhpY2xlcyM1MgotbmFpY3MjNTI1MSNJbnN1cmFuY2UgYW5kIEVtcGxveWVlIEJlbmVmaXQgRnVuZHMjNTI1Ci1uYWljcyM1MjUxMSNQZW5zaW9uIEZ1bmRzIzUyNTEKLW5haWNzIzUyNTEyI0hlYWx0aCBhbmQgV2VsZmFyZSBGdW5kcyM1MjUxCi1uYWljcyM1MjUxOSNPdGhlciBJbnN1cmFuY2UgRnVuZHMjNTI1MQotbmFpY3MjNTI1OSNPdGhlciBJbnZlc3RtZW50IFBvb2xzIGFuZCBGdW5kcyM1MjUKLW5haWNzIzUyNTkxI09wZW4tRW5kIEludmVzdG1lbnQgRnVuZHMjNTI1OQotbmFpY3MjNTI1OTIjVHJ1c3RzLCBFc3RhdGVzLCBhbmQgQWdlbmN5IEFjY291bnRzIzUyNTkKLW5haWNzIzUyNTkzI1JlYWwgRXN0YXRlIEludmVzdG1lbnQgVHJ1c3RzIzUyNTkKLW5haWNzIzUyNTk5I090aGVyIEZpbmFuY2lhbCBWZWhpY2xlcyM1MjU5Ci1uYWljcyM1MyNSZWFsIEVzdGF0ZSBhbmQgUmVudGFsIGFuZCBMZWFzaW5nIzUzCi1uYWljcyM1MzEjUmVhbCBFc3RhdGUjNTMKLW5haWNzIzUzMTEjTGVzc29ycyBvZiBSZWFsIEVzdGF0ZSM1MzEKLW5haWNzIzUzMTExI0xlc3NvcnMgb2YgUmVzaWRlbnRpYWwgQnVpbGRpbmdzIGFuZCBEd2VsbGluZ3MjNTMxMQotbmFpY3MjNTMxMTIjTGVzc29ycyBvZiBOb25yZXNpZGVudGlhbCBCdWlsZGluZ3MgKGV4Y2VwdCBNaW5pd2FyZWhvdXNlcykjNTMxMQotbmFpY3MjNTMxMTMjTGVzc29ycyBvZiBNaW5pd2FyZWhvdXNlcyBhbmQgU2VsZi1TdG9yYWdlIFVuaXRzIzUzMTEKLW5haWNzIzUzMTE5I0xlc3NvcnMgb2YgT3RoZXIgUmVhbCBFc3RhdGUgUHJvcGVydHkjNTMxMQotbmFpY3MjNTMxMiNPZmZpY2VzIG9mIFJlYWwgRXN0YXRlIEFnZW50cyBhbmQgQnJva2VycyM1MzEKLW5haWNzIzUzMTIxI09mZmljZXMgb2YgUmVhbCBFc3RhdGUgQWdlbnRzIGFuZCBCcm9rZXJzIzUzMTIKLW5haWNzIzUzMTMjQWN0aXZpdGllcyBSZWxhdGVkIHRvIFJlYWwgRXN0YXRlIzUzMQotbmFpY3MjNTMxMzEjUmVhbCBFc3RhdGUgUHJvcGVydHkgTWFuYWdlcnMjNTMxMwotbmFpY3MjNTMxMzExI1Jlc2lkZW50aWFsIFByb3BlcnR5IE1hbmFnZXJzIzUzMTMxCi1uYWljcyM1MzEzMTIjTm9ucmVzaWRlbnRpYWwgUHJvcGVydHkgTWFuYWdlcnMjNTMxMzEKLW5haWNzIzUzMTMyI09mZmljZXMgb2YgUmVhbCBFc3RhdGUgQXBwcmFpc2VycyM1MzEzCi1uYWljcyM1MzEzOSNPdGhlciBBY3Rpdml0aWVzIFJlbGF0ZWQgdG8gUmVhbCBFc3RhdGUjNTMxMwotbmFpY3MjNTMyI1JlbnRhbCBhbmQgTGVhc2luZyBTZXJ2aWNlcyM1MwotbmFpY3MjNTMyMSNBdXRvbW90aXZlIEVxdWlwbWVudCBSZW50YWwgYW5kIExlYXNpbmcjNTMyCi1uYWljcyM1MzIxMSNQYXNzZW5nZXIgQ2FyIFJlbnRhbCBhbmQgTGVhc2luZyM1MzIxCi1uYWljcyM1MzIxMTEjUGFzc2VuZ2VyIENhciBSZW50YWwjNTMyMTEKLW5haWNzIzUzMjExMiNQYXNzZW5nZXIgQ2FyIExlYXNpbmcjNTMyMTEKLW5haWNzIzUzMjEyI1RydWNrLCBVdGlsaXR5IFRyYWlsZXIsIGFuZCBSViAoUmVjcmVhdGlvbmFsIFZlaGljbGUpIFJlbnRhbCBhbmQgTGVhc2luZyM1MzIxCi1uYWljcyM1MzIyI0NvbnN1bWVyIEdvb2RzIFJlbnRhbCM1MzIKLW5haWNzIzUzMjIxI0NvbnN1bWVyIEVsZWN0cm9uaWNzIGFuZCBBcHBsaWFuY2VzIFJlbnRhbCM1MzIyCi1uYWljcyM1MzIyMiNGb3JtYWwgV2VhciBhbmQgQ29zdHVtZSBSZW50YWwjNTMyMgotbmFpY3MjNTMyMjMjVmlkZW8gVGFwZSBhbmQgRGlzYyBSZW50YWwjNTMyMgotbmFpY3MjNTMyMjkjT3RoZXIgQ29uc3VtZXIgR29vZHMgUmVudGFsIzUzMjIKLW5haWNzIzUzMjI5MSNIb21lIEhlYWx0aCBFcXVpcG1lbnQgUmVudGFsIzUzMjI5Ci1uYWljcyM1MzIyOTIjUmVjcmVhdGlvbmFsIEdvb2RzIFJlbnRhbCM1MzIyOQotbmFpY3MjNTMyMjk5I0FsbCBPdGhlciBDb25zdW1lciBHb29kcyBSZW50YWwjNTMyMjkKLW5haWNzIzUzMjMjR2VuZXJhbCBSZW50YWwgQ2VudGVycyM1MzIKLW5haWNzIzUzMjMxI0dlbmVyYWwgUmVudGFsIENlbnRlcnMjNTMyMwotbmFpY3MjNTMyNCNDb21tZXJjaWFsIGFuZCBJbmR1c3RyaWFsIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IFJlbnRhbCBhbmQgTGVhc2luZyM1MzIKLW5haWNzIzUzMjQxI0NvbnN0cnVjdGlvbiwgVHJhbnNwb3J0YXRpb24sIE1pbmluZywgYW5kIEZvcmVzdHJ5IE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IFJlbnRhbCBhbmQgTGVhc2luZyM1MzI0Ci1uYWljcyM1MzI0MTEjQ29tbWVyY2lhbCBBaXIsIFJhaWwsIGFuZCBXYXRlciBUcmFuc3BvcnRhdGlvbiBFcXVpcG1lbnQgUmVudGFsIGFuZCBMZWFzaW5nIzUzMjQxCi1uYWljcyM1MzI0MTIjQ29uc3RydWN0aW9uLCBNaW5pbmcsIGFuZCBGb3Jlc3RyeSBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBSZW50YWwgYW5kIExlYXNpbmcjNTMyNDEKLW5haWNzIzUzMjQyI09mZmljZSBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBSZW50YWwgYW5kIExlYXNpbmcjNTMyNAotbmFpY3MjNTMyNDkjT3RoZXIgQ29tbWVyY2lhbCBhbmQgSW5kdXN0cmlhbCBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBSZW50YWwgYW5kIExlYXNpbmcjNTMyNAotbmFpY3MjNTMzI0xlc3NvcnMgb2YgTm9uZmluYW5jaWFsIEludGFuZ2libGUgQXNzZXRzIChleGNlcHQgQ29weXJpZ2h0ZWQgV29ya3MpIzUzCi1uYWljcyM1MzMxI0xlc3NvcnMgb2YgTm9uZmluYW5jaWFsIEludGFuZ2libGUgQXNzZXRzIChleGNlcHQgQ29weXJpZ2h0ZWQgV29ya3MpIzUzMwotbmFpY3MjNTMzMTEjTGVzc29ycyBvZiBOb25maW5hbmNpYWwgSW50YW5naWJsZSBBc3NldHMgKGV4Y2VwdCBDb3B5cmlnaHRlZCBXb3JrcykjNTMzMQotbmFpY3MjNTQjUHJvZmVzc2lvbmFsLCBTY2llbnRpZmljLCBhbmQgVGVjaG5pY2FsIFNlcnZpY2VzIzU0Ci1uYWljcyM1NDEjUHJvZmVzc2lvbmFsLCBTY2llbnRpZmljLCBhbmQgVGVjaG5pY2FsIFNlcnZpY2VzIzU0Ci1uYWljcyM1NDExI0xlZ2FsIFNlcnZpY2VzIzU0MQotbmFpY3MjNTQxMTEjT2ZmaWNlcyBvZiBMYXd5ZXJzIzU0MTEKLW5haWNzIzU0MTEyI09mZmljZXMgb2YgTm90YXJpZXMjNTQxMQotbmFpY3MjNTQxMTkjT3RoZXIgTGVnYWwgU2VydmljZXMjNTQxMQotbmFpY3MjNTQxMTkxI1RpdGxlIEFic3RyYWN0IGFuZCBTZXR0bGVtZW50IE9mZmljZXMjNTQxMTkKLW5haWNzIzU0MTE5OSNBbGwgT3RoZXIgTGVnYWwgU2VydmljZXMjNTQxMTkKLW5haWNzIzU0MTIjQWNjb3VudGluZywgVGF4IFByZXBhcmF0aW9uLCBCb29ra2VlcGluZywgYW5kIFBheXJvbGwgU2VydmljZXMjNTQxCi1uYWljcyM1NDEyMSNBY2NvdW50aW5nLCBUYXggUHJlcGFyYXRpb24sIEJvb2trZWVwaW5nLCBhbmQgUGF5cm9sbCBTZXJ2aWNlcyM1NDEyCi1uYWljcyM1NDEyMTEjT2ZmaWNlcyBvZiBDZXJ0aWZpZWQgUHVibGljIEFjY291bnRhbnRzIzU0MTIxCi1uYWljcyM1NDEyMTMjVGF4IFByZXBhcmF0aW9uIFNlcnZpY2VzIzU0MTIxCi1uYWljcyM1NDEyMTQjUGF5cm9sbCBTZXJ2aWNlcyM1NDEyMQotbmFpY3MjNTQxMjE5I090aGVyIEFjY291bnRpbmcgU2VydmljZXMjNTQxMjEKLW5haWNzIzU0MTMjQXJjaGl0ZWN0dXJhbCwgRW5naW5lZXJpbmcsIGFuZCBSZWxhdGVkIFNlcnZpY2VzIzU0MQotbmFpY3MjNTQxMzEjQXJjaGl0ZWN0dXJhbCBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzMiNMYW5kc2NhcGUgQXJjaGl0ZWN0dXJhbCBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzMyNFbmdpbmVlcmluZyBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzNCNEcmFmdGluZyBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzNSNCdWlsZGluZyBJbnNwZWN0aW9uIFNlcnZpY2VzIzU0MTMKLW5haWNzIzU0MTM2I0dlb3BoeXNpY2FsIFN1cnZleWluZyBhbmQgTWFwcGluZyBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzNyNTdXJ2ZXlpbmcgYW5kIE1hcHBpbmcgKGV4Y2VwdCBHZW9waHlzaWNhbCkgU2VydmljZXMjNTQxMwotbmFpY3MjNTQxMzgjVGVzdGluZyBMYWJvcmF0b3JpZXMjNTQxMwotbmFpY3MjNTQxNCNTcGVjaWFsaXplZCBEZXNpZ24gU2VydmljZXMjNTQxCi1uYWljcyM1NDE0MSNJbnRlcmlvciBEZXNpZ24gU2VydmljZXMjNTQxNAotbmFpY3MjNTQxNDIjSW5kdXN0cmlhbCBEZXNpZ24gU2VydmljZXMjNTQxNAotbmFpY3MjNTQxNDMjR3JhcGhpYyBEZXNpZ24gU2VydmljZXMjNTQxNAotbmFpY3MjNTQxNDkjT3RoZXIgU3BlY2lhbGl6ZWQgRGVzaWduIFNlcnZpY2VzIzU0MTQKLW5haWNzIzU0MTUjQ29tcHV0ZXIgU3lzdGVtcyBEZXNpZ24gYW5kIFJlbGF0ZWQgU2VydmljZXMjNTQxCi1uYWljcyM1NDE1MSNDb21wdXRlciBTeXN0ZW1zIERlc2lnbiBhbmQgUmVsYXRlZCBTZXJ2aWNlcyM1NDE1Ci1uYWljcyM1NDE1MTEjQ3VzdG9tIENvbXB1dGVyIFByb2dyYW1taW5nIFNlcnZpY2VzIzU0MTUxCi1uYWljcyM1NDE1MTIjQ29tcHV0ZXIgU3lzdGVtcyBEZXNpZ24gU2VydmljZXMjNTQxNTEKLW5haWNzIzU0MTUxMyNDb21wdXRlciBGYWNpbGl0aWVzIE1hbmFnZW1lbnQgU2VydmljZXMjNTQxNTEKLW5haWNzIzU0MTUxOSNPdGhlciBDb21wdXRlciBSZWxhdGVkIFNlcnZpY2VzIzU0MTUxCi1uYWljcyM1NDE2I01hbmFnZW1lbnQsIFNjaWVudGlmaWMsIGFuZCBUZWNobmljYWwgQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDEKLW5haWNzIzU0MTYxI01hbmFnZW1lbnQgQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDE2Ci1uYWljcyM1NDE2MTEjQWRtaW5pc3RyYXRpdmUgTWFuYWdlbWVudCBhbmQgR2VuZXJhbCBNYW5hZ2VtZW50IENvbnN1bHRpbmcgU2VydmljZXMjNTQxNjEKLW5haWNzIzU0MTYxMiNIdW1hbiBSZXNvdXJjZXMgYW5kIEV4ZWN1dGl2ZSBTZWFyY2ggQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDE2MQotbmFpY3MjNTQxNjEzI01hcmtldGluZyBDb25zdWx0aW5nIFNlcnZpY2VzIzU0MTYxCi1uYWljcyM1NDE2MTQjUHJvY2VzcywgUGh5c2ljYWwgRGlzdHJpYnV0aW9uLCBhbmQgTG9naXN0aWNzIENvbnN1bHRpbmcgU2VydmljZXMjNTQxNjEKLW5haWNzIzU0MTYxOCNPdGhlciBNYW5hZ2VtZW50IENvbnN1bHRpbmcgU2VydmljZXMjNTQxNjEKLW5haWNzIzU0MTYyI0Vudmlyb25tZW50YWwgQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDE2Ci1uYWljcyM1NDE2OSNPdGhlciBTY2llbnRpZmljIGFuZCBUZWNobmljYWwgQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDE2Ci1uYWljcyM1NDE3I1NjaWVudGlmaWMgUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IFNlcnZpY2VzIzU0MQotbmFpY3MjNTQxNzEjUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IGluIHRoZSBQaHlzaWNhbCwgRW5naW5lZXJpbmcsIGFuZCBMaWZlIFNjaWVuY2VzIzU0MTcKLW5haWNzIzU0MTcyI1Jlc2VhcmNoIGFuZCBEZXZlbG9wbWVudCBpbiB0aGUgU29jaWFsIFNjaWVuY2VzIGFuZCBIdW1hbml0aWVzIzU0MTcKLW5haWNzIzU0MTgjQWR2ZXJ0aXNpbmcgYW5kIFJlbGF0ZWQgU2VydmljZXMjNTQxCi1uYWljcyM1NDE4MSNBZHZlcnRpc2luZyBBZ2VuY2llcyM1NDE4Ci1uYWljcyM1NDE4MiNQdWJsaWMgUmVsYXRpb25zIEFnZW5jaWVzIzU0MTgKLW5haWNzIzU0MTgzI01lZGlhIEJ1eWluZyBBZ2VuY2llcyM1NDE4Ci1uYWljcyM1NDE4NCNNZWRpYSBSZXByZXNlbnRhdGl2ZXMjNTQxOAotbmFpY3MjNTQxODUjRGlzcGxheSBBZHZlcnRpc2luZyM1NDE4Ci1uYWljcyM1NDE4NiNEaXJlY3QgTWFpbCBBZHZlcnRpc2luZyM1NDE4Ci1uYWljcyM1NDE4NyNBZHZlcnRpc2luZyBNYXRlcmlhbCBEaXN0cmlidXRpb24gU2VydmljZXMjNTQxOAotbmFpY3MjNTQxODkjT3RoZXIgU2VydmljZXMgUmVsYXRlZCB0byBBZHZlcnRpc2luZyM1NDE4Ci1uYWljcyM1NDE5I090aGVyIFByb2Zlc3Npb25hbCwgU2NpZW50aWZpYywgYW5kIFRlY2huaWNhbCBTZXJ2aWNlcyM1NDEKLW5haWNzIzU0MTkxI01hcmtldGluZyBSZXNlYXJjaCBhbmQgUHVibGljIE9waW5pb24gUG9sbGluZyM1NDE5Ci1uYWljcyM1NDE5MiNQaG90b2dyYXBoaWMgU2VydmljZXMjNTQxOQotbmFpY3MjNTQxOTIxI1Bob3RvZ3JhcGh5IFN0dWRpb3MsIFBvcnRyYWl0IzU0MTkyCi1uYWljcyM1NDE5MjIjQ29tbWVyY2lhbCBQaG90b2dyYXBoeSM1NDE5MgotbmFpY3MjNTQxOTMjVHJhbnNsYXRpb24gYW5kIEludGVycHJldGF0aW9uIFNlcnZpY2VzIzU0MTkKLW5haWNzIzU0MTk0I1ZldGVyaW5hcnkgU2VydmljZXMjNTQxOQotbmFpY3MjNTQxOTkjQWxsIE90aGVyIFByb2Zlc3Npb25hbCwgU2NpZW50aWZpYywgYW5kIFRlY2huaWNhbCBTZXJ2aWNlcyM1NDE5Ci1uYWljcyM1NSNNYW5hZ2VtZW50IG9mIENvbXBhbmllcyBhbmQgRW50ZXJwcmlzZXMjNTUKLW5haWNzIzU1MSNNYW5hZ2VtZW50IG9mIENvbXBhbmllcyBhbmQgRW50ZXJwcmlzZXMjNTUKLW5haWNzIzU1MTEjTWFuYWdlbWVudCBvZiBDb21wYW5pZXMgYW5kIEVudGVycHJpc2VzIzU1MQotbmFpY3MjNTUxMTEjTWFuYWdlbWVudCBvZiBDb21wYW5pZXMgYW5kIEVudGVycHJpc2VzIzU1MTEKLW5haWNzIzU1MTExMSNPZmZpY2VzIG9mIEJhbmsgSG9sZGluZyBDb21wYW5pZXMjNTUxMTEKLW5haWNzIzU1MTExMiNPZmZpY2VzIG9mIE90aGVyIEhvbGRpbmcgQ29tcGFuaWVzIzU1MTExCi1uYWljcyM1NTExMTQjQ29ycG9yYXRlLCBTdWJzaWRpYXJ5LCBhbmQgUmVnaW9uYWwgTWFuYWdpbmcgT2ZmaWNlcyM1NTExMQotbmFpY3MjNTYjQWRtaW5pc3RyYXRpdmUgYW5kIFN1cHBvcnQgYW5kIFdhc3RlIE1hbmFnZW1lbnQgYW5kIFJlbWVkaWF0aW9uIFNlcnZpY2VzIzU2Ci1uYWljcyM1NjEjQWRtaW5pc3RyYXRpdmUgYW5kIFN1cHBvcnQgU2VydmljZXMjNTYKLW5haWNzIzU2MTEjT2ZmaWNlIEFkbWluaXN0cmF0aXZlIFNlcnZpY2VzIzU2MQotbmFpY3MjNTYxMTEjT2ZmaWNlIEFkbWluaXN0cmF0aXZlIFNlcnZpY2VzIzU2MTEKLW5haWNzIzU2MTIjRmFjaWxpdGllcyBTdXBwb3J0IFNlcnZpY2VzIzU2MQotbmFpY3MjNTYxMjEjRmFjaWxpdGllcyBTdXBwb3J0IFNlcnZpY2VzIzU2MTIKLW5haWNzIzU2MTMjRW1wbG95bWVudCBTZXJ2aWNlcyM1NjEKLW5haWNzIzU2MTMxI0VtcGxveW1lbnQgUGxhY2VtZW50IEFnZW5jaWVzIzU2MTMKLW5haWNzIzU2MTMyI1RlbXBvcmFyeSBIZWxwIFNlcnZpY2VzIzU2MTMKLW5haWNzIzU2MTMzI0VtcGxveWVlIExlYXNpbmcgU2VydmljZXMjNTYxMwotbmFpY3MjNTYxNCNCdXNpbmVzcyBTdXBwb3J0IFNlcnZpY2VzIzU2MQotbmFpY3MjNTYxNDEjRG9jdW1lbnQgUHJlcGFyYXRpb24gU2VydmljZXMjNTYxNAotbmFpY3MjNTYxNDIjVGVsZXBob25lIENhbGwgQ2VudGVycyM1NjE0Ci1uYWljcyM1NjE0MjEjVGVsZXBob25lIEFuc3dlcmluZyBTZXJ2aWNlcyM1NjE0MgotbmFpY3MjNTYxNDIyI1RlbGVtYXJrZXRpbmcgQnVyZWF1cyM1NjE0MgotbmFpY3MjNTYxNDMjQnVzaW5lc3MgU2VydmljZSBDZW50ZXJzIzU2MTQKLW5haWNzIzU2MTQzMSNQcml2YXRlIE1haWwgQ2VudGVycyM1NjE0MwotbmFpY3MjNTYxNDM5I090aGVyIEJ1c2luZXNzIFNlcnZpY2UgQ2VudGVycyAoaW5jbHVkaW5nIENvcHkgU2hvcHMpIzU2MTQzCi1uYWljcyM1NjE0NCNDb2xsZWN0aW9uIEFnZW5jaWVzIzU2MTQKLW5haWNzIzU2MTQ1I0NyZWRpdCBCdXJlYXVzIzU2MTQKLW5haWNzIzU2MTQ5I090aGVyIEJ1c2luZXNzIFN1cHBvcnQgU2VydmljZXMjNTYxNAotbmFpY3MjNTYxNDkxI1JlcG9zc2Vzc2lvbiBTZXJ2aWNlcyM1NjE0OQotbmFpY3MjNTYxNDkyI0NvdXJ0IFJlcG9ydGluZyBhbmQgU3Rlbm90eXBlIFNlcnZpY2VzIzU2MTQ5Ci1uYWljcyM1NjE0OTkjQWxsIE90aGVyIEJ1c2luZXNzIFN1cHBvcnQgU2VydmljZXMjNTYxNDkKLW5haWNzIzU2MTUjVHJhdmVsIEFycmFuZ2VtZW50IGFuZCBSZXNlcnZhdGlvbiBTZXJ2aWNlcyM1NjEKLW5haWNzIzU2MTUxI1RyYXZlbCBBZ2VuY2llcyM1NjE1Ci1uYWljcyM1NjE1MiNUb3VyIE9wZXJhdG9ycyM1NjE1Ci1uYWljcyM1NjE1OSNPdGhlciBUcmF2ZWwgQXJyYW5nZW1lbnQgYW5kIFJlc2VydmF0aW9uIFNlcnZpY2VzIzU2MTUKLW5haWNzIzU2MTU5MSNDb252ZW50aW9uIGFuZCBWaXNpdG9ycyBCdXJlYXVzIzU2MTU5Ci1uYWljcyM1NjE1OTkjQWxsIE90aGVyIFRyYXZlbCBBcnJhbmdlbWVudCBhbmQgUmVzZXJ2YXRpb24gU2VydmljZXMjNTYxNTkKLW5haWNzIzU2MTYjSW52ZXN0aWdhdGlvbiBhbmQgU2VjdXJpdHkgU2VydmljZXMjNTYxCi1uYWljcyM1NjE2MSNJbnZlc3RpZ2F0aW9uLCBHdWFyZCwgYW5kIEFybW9yZWQgQ2FyIFNlcnZpY2VzIzU2MTYKLW5haWNzIzU2MTYxMSNJbnZlc3RpZ2F0aW9uIFNlcnZpY2VzIzU2MTYxCi1uYWljcyM1NjE2MTIjU2VjdXJpdHkgR3VhcmRzIGFuZCBQYXRyb2wgU2VydmljZXMjNTYxNjEKLW5haWNzIzU2MTYxMyNBcm1vcmVkIENhciBTZXJ2aWNlcyM1NjE2MQotbmFpY3MjNTYxNjIjU2VjdXJpdHkgU3lzdGVtcyBTZXJ2aWNlcyM1NjE2Ci1uYWljcyM1NjE2MjEjU2VjdXJpdHkgU3lzdGVtcyBTZXJ2aWNlcyAoZXhjZXB0IExvY2tzbWl0aHMpIzU2MTYyCi1uYWljcyM1NjE2MjIjTG9ja3NtaXRocyM1NjE2MgotbmFpY3MjNTYxNyNTZXJ2aWNlcyB0byBCdWlsZGluZ3MgYW5kIER3ZWxsaW5ncyM1NjEKLW5haWNzIzU2MTcxI0V4dGVybWluYXRpbmcgYW5kIFBlc3QgQ29udHJvbCBTZXJ2aWNlcyM1NjE3Ci1uYWljcyM1NjE3MiNKYW5pdG9yaWFsIFNlcnZpY2VzIzU2MTcKLW5haWNzIzU2MTczI0xhbmRzY2FwaW5nIFNlcnZpY2VzIzU2MTcKLW5haWNzIzU2MTc0I0NhcnBldCBhbmQgVXBob2xzdGVyeSBDbGVhbmluZyBTZXJ2aWNlcyM1NjE3Ci1uYWljcyM1NjE3OSNPdGhlciBTZXJ2aWNlcyB0byBCdWlsZGluZ3MgYW5kIER3ZWxsaW5ncyM1NjE3Ci1uYWljcyM1NjE5I090aGVyIFN1cHBvcnQgU2VydmljZXMjNTYxCi1uYWljcyM1NjE5MSNQYWNrYWdpbmcgYW5kIExhYmVsaW5nIFNlcnZpY2VzIzU2MTkKLW5haWNzIzU2MTkyI0NvbnZlbnRpb24gYW5kIFRyYWRlIFNob3cgT3JnYW5pemVycyM1NjE5Ci1uYWljcyM1NjE5OSNBbGwgT3RoZXIgU3VwcG9ydCBTZXJ2aWNlcyM1NjE5Ci1uYWljcyM1NjIjV2FzdGUgTWFuYWdlbWVudCBhbmQgUmVtZWRpYXRpb24gU2VydmljZXMjNTYKLW5haWNzIzU2MjEjV2FzdGUgQ29sbGVjdGlvbiM1NjIKLW5haWNzIzU2MjExI1dhc3RlIENvbGxlY3Rpb24jNTYyMQotbmFpY3MjNTYyMTExI1NvbGlkIFdhc3RlIENvbGxlY3Rpb24jNTYyMTEKLW5haWNzIzU2MjExMiNIYXphcmRvdXMgV2FzdGUgQ29sbGVjdGlvbiM1NjIxMQotbmFpY3MjNTYyMTE5I090aGVyIFdhc3RlIENvbGxlY3Rpb24jNTYyMTEKLW5haWNzIzU2MjIjV2FzdGUgVHJlYXRtZW50IGFuZCBEaXNwb3NhbCM1NjIKLW5haWNzIzU2MjIxI1dhc3RlIFRyZWF0bWVudCBhbmQgRGlzcG9zYWwjNTYyMgotbmFpY3MjNTYyMjExI0hhemFyZG91cyBXYXN0ZSBUcmVhdG1lbnQgYW5kIERpc3Bvc2FsIzU2MjIxCi1uYWljcyM1NjIyMTIjU29saWQgV2FzdGUgTGFuZGZpbGwjNTYyMjEKLW5haWNzIzU2MjIxMyNTb2xpZCBXYXN0ZSBDb21idXN0b3JzIGFuZCBJbmNpbmVyYXRvcnMjNTYyMjEKLW5haWNzIzU2MjIxOSNPdGhlciBOb25oYXphcmRvdXMgV2FzdGUgVHJlYXRtZW50IGFuZCBEaXNwb3NhbCM1NjIyMQotbmFpY3MjNTYyOSNSZW1lZGlhdGlvbiBhbmQgT3RoZXIgV2FzdGUgTWFuYWdlbWVudCBTZXJ2aWNlcyM1NjIKLW5haWNzIzU2MjkxI1JlbWVkaWF0aW9uIFNlcnZpY2VzIzU2MjkKLW5haWNzIzU2MjkyI01hdGVyaWFscyBSZWNvdmVyeSBGYWNpbGl0aWVzIzU2MjkKLW5haWNzIzU2Mjk5I0FsbCBPdGhlciBXYXN0ZSBNYW5hZ2VtZW50IFNlcnZpY2VzIzU2MjkKLW5haWNzIzU2Mjk5MSNTZXB0aWMgVGFuayBhbmQgUmVsYXRlZCBTZXJ2aWNlcyM1NjI5OQotbmFpY3MjNTYyOTk4I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIFdhc3RlIE1hbmFnZW1lbnQgU2VydmljZXMjNTYyOTkKLW5haWNzIzYxI0VkdWNhdGlvbmFsIFNlcnZpY2VzIzYxCi1uYWljcyM2MTEjRWR1Y2F0aW9uYWwgU2VydmljZXMjNjEKLW5haWNzIzYxMTEjRWxlbWVudGFyeSBhbmQgU2Vjb25kYXJ5IFNjaG9vbHMjNjExCi1uYWljcyM2MTExMSNFbGVtZW50YXJ5IGFuZCBTZWNvbmRhcnkgU2Nob29scyM2MTExCi1uYWljcyM2MTEyI0p1bmlvciBDb2xsZWdlcyM2MTEKLW5haWNzIzYxMTIxI0p1bmlvciBDb2xsZWdlcyM2MTEyCi1uYWljcyM2MTEzI0NvbGxlZ2VzLCBVbml2ZXJzaXRpZXMsIGFuZCBQcm9mZXNzaW9uYWwgU2Nob29scyM2MTEKLW5haWNzIzYxMTMxI0NvbGxlZ2VzLCBVbml2ZXJzaXRpZXMsIGFuZCBQcm9mZXNzaW9uYWwgU2Nob29scyM2MTEzCi1uYWljcyM2MTE0I0J1c2luZXNzIFNjaG9vbHMgYW5kIENvbXB1dGVyIGFuZCBNYW5hZ2VtZW50IFRyYWluaW5nIzYxMQotbmFpY3MjNjExNDEjQnVzaW5lc3MgYW5kIFNlY3JldGFyaWFsIFNjaG9vbHMjNjExNAotbmFpY3MjNjExNDIjQ29tcHV0ZXIgVHJhaW5pbmcjNjExNAotbmFpY3MjNjExNDMjUHJvZmVzc2lvbmFsIGFuZCBNYW5hZ2VtZW50IERldmVsb3BtZW50IFRyYWluaW5nIzYxMTQKLW5haWNzIzYxMTUjVGVjaG5pY2FsIGFuZCBUcmFkZSBTY2hvb2xzIzYxMQotbmFpY3MjNjExNTEjVGVjaG5pY2FsIGFuZCBUcmFkZSBTY2hvb2xzIzYxMTUKLW5haWNzIzYxMTUxMSNDb3NtZXRvbG9neSBhbmQgQmFyYmVyIFNjaG9vbHMjNjExNTEKLW5haWNzIzYxMTUxMiNGbGlnaHQgVHJhaW5pbmcjNjExNTEKLW5haWNzIzYxMTUxMyNBcHByZW50aWNlc2hpcCBUcmFpbmluZyM2MTE1MQotbmFpY3MjNjExNTE5I090aGVyIFRlY2huaWNhbCBhbmQgVHJhZGUgU2Nob29scyM2MTE1MQotbmFpY3MjNjExNiNPdGhlciBTY2hvb2xzIGFuZCBJbnN0cnVjdGlvbiM2MTEKLW5haWNzIzYxMTYxI0ZpbmUgQXJ0cyBTY2hvb2xzIzYxMTYKLW5haWNzIzYxMTYyI1Nwb3J0cyBhbmQgUmVjcmVhdGlvbiBJbnN0cnVjdGlvbiM2MTE2Ci1uYWljcyM2MTE2MyNMYW5ndWFnZSBTY2hvb2xzIzYxMTYKLW5haWNzIzYxMTY5I0FsbCBPdGhlciBTY2hvb2xzIGFuZCBJbnN0cnVjdGlvbiM2MTE2Ci1uYWljcyM2MTE2OTEjRXhhbSBQcmVwYXJhdGlvbiBhbmQgVHV0b3JpbmcjNjExNjkKLW5haWNzIzYxMTY5MiNBdXRvbW9iaWxlIERyaXZpbmcgU2Nob29scyM2MTE2OQotbmFpY3MjNjExNjk5I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIFNjaG9vbHMgYW5kIEluc3RydWN0aW9uIzYxMTY5Ci1uYWljcyM2MTE3I0VkdWNhdGlvbmFsIFN1cHBvcnQgU2VydmljZXMjNjExCi1uYWljcyM2MTE3MSNFZHVjYXRpb25hbCBTdXBwb3J0IFNlcnZpY2VzIzYxMTcKLW5haWNzIzYyI0hlYWx0aCBDYXJlIGFuZCBTb2NpYWwgQXNzaXN0YW5jZSM2MgotbmFpY3MjNjIxI0FtYnVsYXRvcnkgSGVhbHRoIENhcmUgU2VydmljZXMjNjIKLW5haWNzIzYyMTEjT2ZmaWNlcyBvZiBQaHlzaWNpYW5zIzYyMQotbmFpY3MjNjIxMTEjT2ZmaWNlcyBvZiBQaHlzaWNpYW5zIzYyMTEKLW5haWNzIzYyMTExMSNPZmZpY2VzIG9mIFBoeXNpY2lhbnMgKGV4Y2VwdCBNZW50YWwgSGVhbHRoIFNwZWNpYWxpc3RzKSM2MjExMQotbmFpY3MjNjIxMTEyI09mZmljZXMgb2YgUGh5c2ljaWFucywgTWVudGFsIEhlYWx0aCBTcGVjaWFsaXN0cyM2MjExMQotbmFpY3MjNjIxMiNPZmZpY2VzIG9mIERlbnRpc3RzIzYyMQotbmFpY3MjNjIxMjEjT2ZmaWNlcyBvZiBEZW50aXN0cyM2MjEyCi1uYWljcyM2MjEzI09mZmljZXMgb2YgT3RoZXIgSGVhbHRoIFByYWN0aXRpb25lcnMjNjIxCi1uYWljcyM2MjEzMSNPZmZpY2VzIG9mIENoaXJvcHJhY3RvcnMjNjIxMwotbmFpY3MjNjIxMzIjT2ZmaWNlcyBvZiBPcHRvbWV0cmlzdHMjNjIxMwotbmFpY3MjNjIxMzMjT2ZmaWNlcyBvZiBNZW50YWwgSGVhbHRoIFByYWN0aXRpb25lcnMgKGV4Y2VwdCBQaHlzaWNpYW5zKSM2MjEzCi1uYWljcyM2MjEzNCNPZmZpY2VzIG9mIFBoeXNpY2FsLCBPY2N1cGF0aW9uYWwgYW5kIFNwZWVjaCBUaGVyYXBpc3RzLCBhbmQgQXVkaW9sb2dpc3RzIzYyMTMKLW5haWNzIzYyMTM5I09mZmljZXMgb2YgQWxsIE90aGVyIEhlYWx0aCBQcmFjdGl0aW9uZXJzIzYyMTMKLW5haWNzIzYyMTM5MSNPZmZpY2VzIG9mIFBvZGlhdHJpc3RzIzYyMTM5Ci1uYWljcyM2MjEzOTkjT2ZmaWNlcyBvZiBBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBIZWFsdGggUHJhY3RpdGlvbmVycyM2MjEzOQotbmFpY3MjNjIxNCNPdXRwYXRpZW50IENhcmUgQ2VudGVycyM2MjEKLW5haWNzIzYyMTQxI0ZhbWlseSBQbGFubmluZyBDZW50ZXJzIzYyMTQKLW5haWNzIzYyMTQyI091dHBhdGllbnQgTWVudGFsIEhlYWx0aCBhbmQgU3Vic3RhbmNlIEFidXNlIENlbnRlcnMjNjIxNAotbmFpY3MjNjIxNDkjT3RoZXIgT3V0cGF0aWVudCBDYXJlIENlbnRlcnMjNjIxNAotbmFpY3MjNjIxNDkxI0hNTyBNZWRpY2FsIENlbnRlcnMjNjIxNDkKLW5haWNzIzYyMTQ5MiNLaWRuZXkgRGlhbHlzaXMgQ2VudGVycyM2MjE0OQotbmFpY3MjNjIxNDkzI0ZyZWVzdGFuZGluZyBBbWJ1bGF0b3J5IFN1cmdpY2FsIGFuZCBFbWVyZ2VuY3kgQ2VudGVycyM2MjE0OQotbmFpY3MjNjIxNDk4I0FsbCBPdGhlciBPdXRwYXRpZW50IENhcmUgQ2VudGVycyM2MjE0OQotbmFpY3MjNjIxNSNNZWRpY2FsIGFuZCBEaWFnbm9zdGljIExhYm9yYXRvcmllcyM2MjEKLW5haWNzIzYyMTUxI01lZGljYWwgYW5kIERpYWdub3N0aWMgTGFib3JhdG9yaWVzIzYyMTUKLW5haWNzIzYyMTUxMSNNZWRpY2FsIExhYm9yYXRvcmllcyM2MjE1MQotbmFpY3MjNjIxNTEyI0RpYWdub3N0aWMgSW1hZ2luZyBDZW50ZXJzIzYyMTUxCi1uYWljcyM2MjE2I0hvbWUgSGVhbHRoIENhcmUgU2VydmljZXMjNjIxCi1uYWljcyM2MjE2MSNIb21lIEhlYWx0aCBDYXJlIFNlcnZpY2VzIzYyMTYKLW5haWNzIzYyMTkjT3RoZXIgQW1idWxhdG9yeSBIZWFsdGggQ2FyZSBTZXJ2aWNlcyM2MjEKLW5haWNzIzYyMTkxI0FtYnVsYW5jZSBTZXJ2aWNlcyM2MjE5Ci1uYWljcyM2MjE5OSNBbGwgT3RoZXIgQW1idWxhdG9yeSBIZWFsdGggQ2FyZSBTZXJ2aWNlcyM2MjE5Ci1uYWljcyM2MjE5OTEjQmxvb2QgYW5kIE9yZ2FuIEJhbmtzIzYyMTk5Ci1uYWljcyM2MjE5OTkjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgQW1idWxhdG9yeSBIZWFsdGggQ2FyZSBTZXJ2aWNlcyM2MjE5OQotbmFpY3MjNjIyI0hvc3BpdGFscyM2MgotbmFpY3MjNjIyMSNHZW5lcmFsIE1lZGljYWwgYW5kIFN1cmdpY2FsIEhvc3BpdGFscyM2MjIKLW5haWNzIzYyMjExI0dlbmVyYWwgTWVkaWNhbCBhbmQgU3VyZ2ljYWwgSG9zcGl0YWxzIzYyMjEKLW5haWNzIzYyMjIjUHN5Y2hpYXRyaWMgYW5kIFN1YnN0YW5jZSBBYnVzZSBIb3NwaXRhbHMjNjIyCi1uYWljcyM2MjIyMSNQc3ljaGlhdHJpYyBhbmQgU3Vic3RhbmNlIEFidXNlIEhvc3BpdGFscyM2MjIyCi1uYWljcyM2MjIzI1NwZWNpYWx0eSAoZXhjZXB0IFBzeWNoaWF0cmljIGFuZCBTdWJzdGFuY2UgQWJ1c2UpIEhvc3BpdGFscyM2MjIKLW5haWNzIzYyMjMxI1NwZWNpYWx0eSAoZXhjZXB0IFBzeWNoaWF0cmljIGFuZCBTdWJzdGFuY2UgQWJ1c2UpIEhvc3BpdGFscyM2MjIzCi1uYWljcyM2MjMjTnVyc2luZyBhbmQgUmVzaWRlbnRpYWwgQ2FyZSBGYWNpbGl0aWVzIzYyCi1uYWljcyM2MjMxI051cnNpbmcgQ2FyZSBGYWNpbGl0aWVzIzYyMwotbmFpY3MjNjIzMTEjTnVyc2luZyBDYXJlIEZhY2lsaXRpZXMjNjIzMQotbmFpY3MjNjIzMiNSZXNpZGVudGlhbCBNZW50YWwgUmV0YXJkYXRpb24sIE1lbnRhbCBIZWFsdGggYW5kIFN1YnN0YW5jZSBBYnVzZSBGYWNpbGl0aWVzIzYyMwotbmFpY3MjNjIzMjEjUmVzaWRlbnRpYWwgTWVudGFsIFJldGFyZGF0aW9uIEZhY2lsaXRpZXMjNjIzMgotbmFpY3MjNjIzMjIjUmVzaWRlbnRpYWwgTWVudGFsIEhlYWx0aCBhbmQgU3Vic3RhbmNlIEFidXNlIEZhY2lsaXRpZXMjNjIzMgotbmFpY3MjNjIzMyNDb21tdW5pdHkgQ2FyZSBGYWNpbGl0aWVzIGZvciB0aGUgRWxkZXJseSM2MjMKLW5haWNzIzYyMzMxI0NvbW11bml0eSBDYXJlIEZhY2lsaXRpZXMgZm9yIHRoZSBFbGRlcmx5IzYyMzMKLW5haWNzIzYyMzMxMSNDb250aW51aW5nIENhcmUgUmV0aXJlbWVudCBDb21tdW5pdGllcyM2MjMzMQotbmFpY3MjNjIzMzEyI0hvbWVzIGZvciB0aGUgRWxkZXJseSM2MjMzMQotbmFpY3MjNjIzOSNPdGhlciBSZXNpZGVudGlhbCBDYXJlIEZhY2lsaXRpZXMjNjIzCi1uYWljcyM2MjM5OSNPdGhlciBSZXNpZGVudGlhbCBDYXJlIEZhY2lsaXRpZXMjNjIzOQotbmFpY3MjNjI0I1NvY2lhbCBBc3Npc3RhbmNlIzYyCi1uYWljcyM2MjQxI0luZGl2aWR1YWwgYW5kIEZhbWlseSBTZXJ2aWNlcyM2MjQKLW5haWNzIzYyNDExI0NoaWxkIGFuZCBZb3V0aCBTZXJ2aWNlcyM2MjQxCi1uYWljcyM2MjQxMiNTZXJ2aWNlcyBmb3IgdGhlIEVsZGVybHkgYW5kIFBlcnNvbnMgd2l0aCBEaXNhYmlsaXRpZXMjNjI0MQotbmFpY3MjNjI0MTkjT3RoZXIgSW5kaXZpZHVhbCBhbmQgRmFtaWx5IFNlcnZpY2VzIzYyNDEKLW5haWNzIzYyNDIjQ29tbXVuaXR5IEZvb2QgYW5kIEhvdXNpbmcsIGFuZCBFbWVyZ2VuY3kgYW5kIE90aGVyIFJlbGllZiBTZXJ2aWNlcyM2MjQKLW5haWNzIzYyNDIxI0NvbW11bml0eSBGb29kIFNlcnZpY2VzIzYyNDIKLW5haWNzIzYyNDIyI0NvbW11bml0eSBIb3VzaW5nIFNlcnZpY2VzIzYyNDIKLW5haWNzIzYyNDIyMSNUZW1wb3JhcnkgU2hlbHRlcnMjNjI0MjIKLW5haWNzIzYyNDIyOSNPdGhlciBDb21tdW5pdHkgSG91c2luZyBTZXJ2aWNlcyM2MjQyMgotbmFpY3MjNjI0MjMjRW1lcmdlbmN5IGFuZCBPdGhlciBSZWxpZWYgU2VydmljZXMjNjI0MgotbmFpY3MjNjI0MyNWb2NhdGlvbmFsIFJlaGFiaWxpdGF0aW9uIFNlcnZpY2VzIzYyNAotbmFpY3MjNjI0MzEjVm9jYXRpb25hbCBSZWhhYmlsaXRhdGlvbiBTZXJ2aWNlcyM2MjQzCi1uYWljcyM2MjQ0I0NoaWxkIERheSBDYXJlIFNlcnZpY2VzIzYyNAotbmFpY3MjNjI0NDEjQ2hpbGQgRGF5IENhcmUgU2VydmljZXMjNjI0NAotbmFpY3MjNzEjQXJ0cywgRW50ZXJ0YWlubWVudCwgYW5kIFJlY3JlYXRpb24jNzEKLW5haWNzIzcxMSNQZXJmb3JtaW5nIEFydHMsIFNwZWN0YXRvciBTcG9ydHMsIGFuZCBSZWxhdGVkIEluZHVzdHJpZXMjNzEKLW5haWNzIzcxMTEjUGVyZm9ybWluZyBBcnRzIENvbXBhbmllcyM3MTEKLW5haWNzIzcxMTExI1RoZWF0ZXIgQ29tcGFuaWVzIGFuZCBEaW5uZXIgVGhlYXRlcnMjNzExMQotbmFpY3MjNzExMTIjRGFuY2UgQ29tcGFuaWVzIzcxMTEKLW5haWNzIzcxMTEzI011c2ljYWwgR3JvdXBzIGFuZCBBcnRpc3RzIzcxMTEKLW5haWNzIzcxMTE5I090aGVyIFBlcmZvcm1pbmcgQXJ0cyBDb21wYW5pZXMjNzExMQotbmFpY3MjNzExMiNTcGVjdGF0b3IgU3BvcnRzIzcxMQotbmFpY3MjNzExMjEjU3BlY3RhdG9yIFNwb3J0cyM3MTEyCi1uYWljcyM3MTEyMTEjU3BvcnRzIFRlYW1zIGFuZCBDbHVicyM3MTEyMQotbmFpY3MjNzExMjEyI1JhY2V0cmFja3MjNzExMjEKLW5haWNzIzcxMTIxOSNPdGhlciBTcGVjdGF0b3IgU3BvcnRzIzcxMTIxCi1uYWljcyM3MTEzI1Byb21vdGVycyBvZiBQZXJmb3JtaW5nIEFydHMsIFNwb3J0cywgYW5kIFNpbWlsYXIgRXZlbnRzIzcxMQotbmFpY3MjNzExMzEjUHJvbW90ZXJzIG9mIFBlcmZvcm1pbmcgQXJ0cywgU3BvcnRzLCBhbmQgU2ltaWxhciBFdmVudHMgd2l0aCBGYWNpbGl0aWVzIzcxMTMKLW5haWNzIzcxMTMyI1Byb21vdGVycyBvZiBQZXJmb3JtaW5nIEFydHMsIFNwb3J0cywgYW5kIFNpbWlsYXIgRXZlbnRzIHdpdGhvdXQgRmFjaWxpdGllcyM3MTEzCi1uYWljcyM3MTE0I0FnZW50cyBhbmQgTWFuYWdlcnMgZm9yIEFydGlzdHMsIEF0aGxldGVzLCBFbnRlcnRhaW5lcnMsIGFuZCBPdGhlciBQdWJsaWMgRmlndXJlcyM3MTEKLW5haWNzIzcxMTQxI0FnZW50cyBhbmQgTWFuYWdlcnMgZm9yIEFydGlzdHMsIEF0aGxldGVzLCBFbnRlcnRhaW5lcnMsIGFuZCBPdGhlciBQdWJsaWMgRmlndXJlcyM3MTE0Ci1uYWljcyM3MTE1I0luZGVwZW5kZW50IEFydGlzdHMsIFdyaXRlcnMsIGFuZCBQZXJmb3JtZXJzIzcxMQotbmFpY3MjNzExNTEjSW5kZXBlbmRlbnQgQXJ0aXN0cywgV3JpdGVycywgYW5kIFBlcmZvcm1lcnMjNzExNQotbmFpY3MjNzEyI011c2V1bXMsIEhpc3RvcmljYWwgU2l0ZXMsIGFuZCBTaW1pbGFyIEluc3RpdHV0aW9ucyM3MQotbmFpY3MjNzEyMSNNdXNldW1zLCBIaXN0b3JpY2FsIFNpdGVzLCBhbmQgU2ltaWxhciBJbnN0aXR1dGlvbnMjNzEyCi1uYWljcyM3MTIxMSNNdXNldW1zIzcxMjEKLW5haWNzIzcxMjEyI0hpc3RvcmljYWwgU2l0ZXMjNzEyMQotbmFpY3MjNzEyMTMjWm9vcyBhbmQgQm90YW5pY2FsIEdhcmRlbnMjNzEyMQotbmFpY3MjNzEyMTkjTmF0dXJlIFBhcmtzIGFuZCBPdGhlciBTaW1pbGFyIEluc3RpdHV0aW9ucyM3MTIxCi1uYWljcyM3MTMjQW11c2VtZW50LCBHYW1ibGluZywgYW5kIFJlY3JlYXRpb24gSW5kdXN0cmllcyM3MQotbmFpY3MjNzEzMSNBbXVzZW1lbnQgUGFya3MgYW5kIEFyY2FkZXMjNzEzCi1uYWljcyM3MTMxMSNBbXVzZW1lbnQgYW5kIFRoZW1lIFBhcmtzIzcxMzEKLW5haWNzIzcxMzEyI0FtdXNlbWVudCBBcmNhZGVzIzcxMzEKLW5haWNzIzcxMzIjR2FtYmxpbmcgSW5kdXN0cmllcyM3MTMKLW5haWNzIzcxMzIxI0Nhc2lub3MgKGV4Y2VwdCBDYXNpbm8gSG90ZWxzKSM3MTMyCi1uYWljcyM3MTMyOSNPdGhlciBHYW1ibGluZyBJbmR1c3RyaWVzIzcxMzIKLW5haWNzIzcxMzkjT3RoZXIgQW11c2VtZW50IGFuZCBSZWNyZWF0aW9uIEluZHVzdHJpZXMjNzEzCi1uYWljcyM3MTM5MSNHb2xmIENvdXJzZXMgYW5kIENvdW50cnkgQ2x1YnMjNzEzOQotbmFpY3MjNzEzOTIjU2tpaW5nIEZhY2lsaXRpZXMjNzEzOQotbmFpY3MjNzEzOTMjTWFyaW5hcyM3MTM5Ci1uYWljcyM3MTM5NCNGaXRuZXNzIGFuZCBSZWNyZWF0aW9uYWwgU3BvcnRzIENlbnRlcnMjNzEzOQotbmFpY3MjNzEzOTUjQm93bGluZyBDZW50ZXJzIzcxMzkKLW5haWNzIzcxMzk5I0FsbCBPdGhlciBBbXVzZW1lbnQgYW5kIFJlY3JlYXRpb24gSW5kdXN0cmllcyM3MTM5Ci1uYWljcyM3MiNBY2NvbW1vZGF0aW9uIGFuZCBGb29kIFNlcnZpY2VzIzcyCi1uYWljcyM3MjEjQWNjb21tb2RhdGlvbiM3MgotbmFpY3MjNzIxMSNUcmF2ZWxlciBBY2NvbW1vZGF0aW9uIzcyMQotbmFpY3MjNzIxMTEjSG90ZWxzIChleGNlcHQgQ2FzaW5vIEhvdGVscykgYW5kIE1vdGVscyM3MjExCi1uYWljcyM3MjExMiNDYXNpbm8gSG90ZWxzIzcyMTEKLW5haWNzIzcyMTE5I090aGVyIFRyYXZlbGVyIEFjY29tbW9kYXRpb24jNzIxMQotbmFpY3MjNzIxMTkxI0JlZC1hbmQtQnJlYWtmYXN0IElubnMjNzIxMTkKLW5haWNzIzcyMTE5OSNBbGwgT3RoZXIgVHJhdmVsZXIgQWNjb21tb2RhdGlvbiM3MjExOQotbmFpY3MjNzIxMiNSViAoUmVjcmVhdGlvbmFsIFZlaGljbGUpIFBhcmtzIGFuZCBSZWNyZWF0aW9uYWwgQ2FtcHMjNzIxCi1uYWljcyM3MjEyMSNSViAoUmVjcmVhdGlvbmFsIFZlaGljbGUpIFBhcmtzIGFuZCBSZWNyZWF0aW9uYWwgQ2FtcHMjNzIxMgotbmFpY3MjNzIxMjExI1JWIChSZWNyZWF0aW9uYWwgVmVoaWNsZSkgUGFya3MgYW5kIENhbXBncm91bmRzIzcyMTIxCi1uYWljcyM3MjEyMTQjUmVjcmVhdGlvbmFsIGFuZCBWYWNhdGlvbiBDYW1wcyAoZXhjZXB0IENhbXBncm91bmRzKSM3MjEyMQotbmFpY3MjNzIxMyNSb29taW5nIGFuZCBCb2FyZGluZyBIb3VzZXMjNzIxCi1uYWljcyM3MjEzMSNSb29taW5nIGFuZCBCb2FyZGluZyBIb3VzZXMjNzIxMwotbmFpY3MjNzIyI0Zvb2QgU2VydmljZXMgYW5kIERyaW5raW5nIFBsYWNlcyM3MgotbmFpY3MjNzIyMSNGdWxsLVNlcnZpY2UgUmVzdGF1cmFudHMjNzIyCi1uYWljcyM3MjIxMSNGdWxsLVNlcnZpY2UgUmVzdGF1cmFudHMjNzIyMQotbmFpY3MjNzIyMiNMaW1pdGVkLVNlcnZpY2UgRWF0aW5nIFBsYWNlcyM3MjIKLW5haWNzIzcyMjIxI0xpbWl0ZWQtU2VydmljZSBFYXRpbmcgUGxhY2VzIzcyMjIKLW5haWNzIzcyMjIxMSNMaW1pdGVkLVNlcnZpY2UgUmVzdGF1cmFudHMjNzIyMjEKLW5haWNzIzcyMjIxMiNDYWZldGVyaWFzIzcyMjIxCi1uYWljcyM3MjIyMTMjU25hY2sgYW5kIE5vbmFsY29ob2xpYyBCZXZlcmFnZSBCYXJzIzcyMjIxCi1uYWljcyM3MjIzI1NwZWNpYWwgRm9vZCBTZXJ2aWNlcyM3MjIKLW5haWNzIzcyMjMxI0Zvb2QgU2VydmljZSBDb250cmFjdG9ycyM3MjIzCi1uYWljcyM3MjIzMiNDYXRlcmVycyM3MjIzCi1uYWljcyM3MjIzMyNNb2JpbGUgRm9vZCBTZXJ2aWNlcyM3MjIzCi1uYWljcyM3MjI0I0RyaW5raW5nIFBsYWNlcyAoQWxjb2hvbGljIEJldmVyYWdlcykjNzIyCi1uYWljcyM3MjI0MSNEcmlua2luZyBQbGFjZXMgKEFsY29ob2xpYyBCZXZlcmFnZXMpIzcyMjQKLW5haWNzIzgxI090aGVyIFNlcnZpY2VzIChleGNlcHQgUHVibGljIEFkbWluaXN0cmF0aW9uKSM4MQotbmFpY3MjODExI1JlcGFpciBhbmQgTWFpbnRlbmFuY2UjODEKLW5haWNzIzgxMTEjQXV0b21vdGl2ZSBSZXBhaXIgYW5kIE1haW50ZW5hbmNlIzgxMQotbmFpY3MjODExMTEjQXV0b21vdGl2ZSBNZWNoYW5pY2FsIGFuZCBFbGVjdHJpY2FsIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMQotbmFpY3MjODExMTExI0dlbmVyYWwgQXV0b21vdGl2ZSBSZXBhaXIjODExMTEKLW5haWNzIzgxMTExMiNBdXRvbW90aXZlIEV4aGF1c3QgU3lzdGVtIFJlcGFpciM4MTExMQotbmFpY3MjODExMTEzI0F1dG9tb3RpdmUgVHJhbnNtaXNzaW9uIFJlcGFpciM4MTExMQotbmFpY3MjODExMTE4I090aGVyIEF1dG9tb3RpdmUgTWVjaGFuaWNhbCBhbmQgRWxlY3RyaWNhbCBSZXBhaXIgYW5kIE1haW50ZW5hbmNlIzgxMTExCi1uYWljcyM4MTExMiNBdXRvbW90aXZlIEJvZHksIFBhaW50LCBJbnRlcmlvciwgYW5kIEdsYXNzIFJlcGFpciM4MTExCi1uYWljcyM4MTExMjEjQXV0b21vdGl2ZSBCb2R5LCBQYWludCwgYW5kIEludGVyaW9yIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMTIKLW5haWNzIzgxMTEyMiNBdXRvbW90aXZlIEdsYXNzIFJlcGxhY2VtZW50IFNob3BzIzgxMTEyCi1uYWljcyM4MTExOSNPdGhlciBBdXRvbW90aXZlIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMQotbmFpY3MjODExMTkxI0F1dG9tb3RpdmUgT2lsIENoYW5nZSBhbmQgTHVicmljYXRpb24gU2hvcHMjODExMTkKLW5haWNzIzgxMTE5MiNDYXIgV2FzaGVzIzgxMTE5Ci1uYWljcyM4MTExOTgjQWxsIE90aGVyIEF1dG9tb3RpdmUgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTExOQotbmFpY3MjODExMiNFbGVjdHJvbmljIGFuZCBQcmVjaXNpb24gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExCi1uYWljcyM4MTEyMSNFbGVjdHJvbmljIGFuZCBQcmVjaXNpb24gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMgotbmFpY3MjODExMjExI0NvbnN1bWVyIEVsZWN0cm9uaWNzIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMjEKLW5haWNzIzgxMTIxMiNDb21wdXRlciBhbmQgT2ZmaWNlIE1hY2hpbmUgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTEyMQotbmFpY3MjODExMjEzI0NvbW11bmljYXRpb24gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMjEKLW5haWNzIzgxMTIxOSNPdGhlciBFbGVjdHJvbmljIGFuZCBQcmVjaXNpb24gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMjEKLW5haWNzIzgxMTMjQ29tbWVyY2lhbCBhbmQgSW5kdXN0cmlhbCBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCAoZXhjZXB0IEF1dG9tb3RpdmUgYW5kIEVsZWN0cm9uaWMpIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExCi1uYWljcyM4MTEzMSNDb21tZXJjaWFsIGFuZCBJbmR1c3RyaWFsIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IChleGNlcHQgQXV0b21vdGl2ZSBhbmQgRWxlY3Ryb25pYykgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTEzCi1uYWljcyM4MTE0I1BlcnNvbmFsIGFuZCBIb3VzZWhvbGQgR29vZHMgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTEKLW5haWNzIzgxMTQxI0hvbWUgYW5kIEdhcmRlbiBFcXVpcG1lbnQgYW5kIEFwcGxpYW5jZSBSZXBhaXIgYW5kIE1haW50ZW5hbmNlIzgxMTQKLW5haWNzIzgxMTQxMSNIb21lIGFuZCBHYXJkZW4gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExNDEKLW5haWNzIzgxMTQxMiNBcHBsaWFuY2UgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTE0MQotbmFpY3MjODExNDIjUmV1cGhvbHN0ZXJ5IGFuZCBGdXJuaXR1cmUgUmVwYWlyIzgxMTQKLW5haWNzIzgxMTQzI0Zvb3R3ZWFyIGFuZCBMZWF0aGVyIEdvb2RzIFJlcGFpciM4MTE0Ci1uYWljcyM4MTE0OSNPdGhlciBQZXJzb25hbCBhbmQgSG91c2Vob2xkIEdvb2RzIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExNAotbmFpY3MjODEyI1BlcnNvbmFsIGFuZCBMYXVuZHJ5IFNlcnZpY2VzIzgxCi1uYWljcyM4MTIxI1BlcnNvbmFsIENhcmUgU2VydmljZXMjODEyCi1uYWljcyM4MTIxMSNIYWlyLCBOYWlsLCBhbmQgU2tpbiBDYXJlIFNlcnZpY2VzIzgxMjEKLW5haWNzIzgxMjExMSNCYXJiZXIgU2hvcHMjODEyMTEKLW5haWNzIzgxMjExMiNCZWF1dHkgU2Fsb25zIzgxMjExCi1uYWljcyM4MTIxMTMjTmFpbCBTYWxvbnMjODEyMTEKLW5haWNzIzgxMjE5I090aGVyIFBlcnNvbmFsIENhcmUgU2VydmljZXMjODEyMQotbmFpY3MjODEyMTkxI0RpZXQgYW5kIFdlaWdodCBSZWR1Y2luZyBDZW50ZXJzIzgxMjE5Ci1uYWljcyM4MTIxOTkjT3RoZXIgUGVyc29uYWwgQ2FyZSBTZXJ2aWNlcyM4MTIxOQotbmFpY3MjODEyMiNEZWF0aCBDYXJlIFNlcnZpY2VzIzgxMgotbmFpY3MjODEyMjEjRnVuZXJhbCBIb21lcyBhbmQgRnVuZXJhbCBTZXJ2aWNlcyM4MTIyCi1uYWljcyM4MTIyMiNDZW1ldGVyaWVzIGFuZCBDcmVtYXRvcmllcyM4MTIyCi1uYWljcyM4MTIzI0RyeWNsZWFuaW5nIGFuZCBMYXVuZHJ5IFNlcnZpY2VzIzgxMgotbmFpY3MjODEyMzEjQ29pbi1PcGVyYXRlZCBMYXVuZHJpZXMgYW5kIERyeWNsZWFuZXJzIzgxMjMKLW5haWNzIzgxMjMyI0RyeWNsZWFuaW5nIGFuZCBMYXVuZHJ5IFNlcnZpY2VzIChleGNlcHQgQ29pbi1PcGVyYXRlZCkjODEyMwotbmFpY3MjODEyMzMjTGluZW4gYW5kIFVuaWZvcm0gU3VwcGx5IzgxMjMKLW5haWNzIzgxMjMzMSNMaW5lbiBTdXBwbHkjODEyMzMKLW5haWNzIzgxMjMzMiNJbmR1c3RyaWFsIExhdW5kZXJlcnMjODEyMzMKLW5haWNzIzgxMjkjT3RoZXIgUGVyc29uYWwgU2VydmljZXMjODEyCi1uYWljcyM4MTI5MSNQZXQgQ2FyZSAoZXhjZXB0IFZldGVyaW5hcnkpIFNlcnZpY2VzIzgxMjkKLW5haWNzIzgxMjkyI1Bob3RvZmluaXNoaW5nIzgxMjkKLW5haWNzIzgxMjkyMSNQaG90b2ZpbmlzaGluZyBMYWJvcmF0b3JpZXMgKGV4Y2VwdCBPbmUtSG91cikjODEyOTIKLW5haWNzIzgxMjkyMiNPbmUtSG91ciBQaG90b2ZpbmlzaGluZyM4MTI5MgotbmFpY3MjODEyOTMjUGFya2luZyBMb3RzIGFuZCBHYXJhZ2VzIzgxMjkKLW5haWNzIzgxMjk5I0FsbCBPdGhlciBQZXJzb25hbCBTZXJ2aWNlcyM4MTI5Ci1uYWljcyM4MTMjUmVsaWdpb3VzLCBHcmFudG1ha2luZywgQ2l2aWMsIFByb2Zlc3Npb25hbCwgYW5kIFNpbWlsYXIgT3JnYW5pemF0aW9ucyM4MQotbmFpY3MjODEzMSNSZWxpZ2lvdXMgT3JnYW5pemF0aW9ucyM4MTMKLW5haWNzIzgxMzExI1JlbGlnaW91cyBPcmdhbml6YXRpb25zIzgxMzEKLW5haWNzIzgxMzIjR3JhbnRtYWtpbmcgYW5kIEdpdmluZyBTZXJ2aWNlcyM4MTMKLW5haWNzIzgxMzIxI0dyYW50bWFraW5nIGFuZCBHaXZpbmcgU2VydmljZXMjODEzMgotbmFpY3MjODEzMjExI0dyYW50bWFraW5nIEZvdW5kYXRpb25zIzgxMzIxCi1uYWljcyM4MTMyMTIjVm9sdW50YXJ5IEhlYWx0aCBPcmdhbml6YXRpb25zIzgxMzIxCi1uYWljcyM4MTMyMTkjT3RoZXIgR3JhbnRtYWtpbmcgYW5kIEdpdmluZyBTZXJ2aWNlcyM4MTMyMQotbmFpY3MjODEzMyNTb2NpYWwgQWR2b2NhY3kgT3JnYW5pemF0aW9ucyM4MTMKLW5haWNzIzgxMzMxI1NvY2lhbCBBZHZvY2FjeSBPcmdhbml6YXRpb25zIzgxMzMKLW5haWNzIzgxMzMxMSNIdW1hbiBSaWdodHMgT3JnYW5pemF0aW9ucyM4MTMzMQotbmFpY3MjODEzMzEyI0Vudmlyb25tZW50LCBDb25zZXJ2YXRpb24gYW5kIFdpbGRsaWZlIE9yZ2FuaXphdGlvbnMjODEzMzEKLW5haWNzIzgxMzMxOSNPdGhlciBTb2NpYWwgQWR2b2NhY3kgT3JnYW5pemF0aW9ucyM4MTMzMQotbmFpY3MjODEzNCNDaXZpYyBhbmQgU29jaWFsIE9yZ2FuaXphdGlvbnMjODEzCi1uYWljcyM4MTM0MSNDaXZpYyBhbmQgU29jaWFsIE9yZ2FuaXphdGlvbnMjODEzNAotbmFpY3MjODEzOSNCdXNpbmVzcywgUHJvZmVzc2lvbmFsLCBMYWJvciwgUG9saXRpY2FsLCBhbmQgU2ltaWxhciBPcmdhbml6YXRpb25zIzgxMwotbmFpY3MjODEzOTEjQnVzaW5lc3MgQXNzb2NpYXRpb25zIzgxMzkKLW5haWNzIzgxMzkyI1Byb2Zlc3Npb25hbCBPcmdhbml6YXRpb25zIzgxMzkKLW5haWNzIzgxMzkzI0xhYm9yIFVuaW9ucyBhbmQgU2ltaWxhciBMYWJvciBPcmdhbml6YXRpb25zIzgxMzkKLW5haWNzIzgxMzk0I1BvbGl0aWNhbCBPcmdhbml6YXRpb25zIzgxMzkKLW5haWNzIzgxMzk5I090aGVyIFNpbWlsYXIgT3JnYW5pemF0aW9ucyAoZXhjZXB0IEJ1c2luZXNzLCBQcm9mZXNzaW9uYWwsIExhYm9yLCBhbmQgUG9saXRpY2FsIE9yZ2FuaXphdGlvbnMpIzgxMzkKLW5haWNzIzgxNCNQcml2YXRlIEhvdXNlaG9sZHMjODEKLW5haWNzIzgxNDEjUHJpdmF0ZSBIb3VzZWhvbGRzIzgxNAotbmFpY3MjODE0MTEjUHJpdmF0ZSBIb3VzZWhvbGRzIzgxNDEKLW5haWNzIzkyI1B1YmxpYyBBZG1pbmlzdHJhdGlvbiM5MgotbmFpY3MjOTIxI0V4ZWN1dGl2ZSwgTGVnaXNsYXRpdmUsIGFuZCBPdGhlciBHZW5lcmFsIEdvdmVybm1lbnQgU3VwcG9ydCM5MgotbmFpY3MjOTIxMSNFeGVjdXRpdmUsIExlZ2lzbGF0aXZlLCBhbmQgT3RoZXIgR2VuZXJhbCBHb3Zlcm5tZW50IFN1cHBvcnQjOTIxCi1uYWljcyM5MjExMSNFeGVjdXRpdmUgT2ZmaWNlcyM5MjExCi1uYWljcyM5MjExMiNMZWdpc2xhdGl2ZSBCb2RpZXMjOTIxMQotbmFpY3MjOTIxMTMjUHVibGljIEZpbmFuY2UgQWN0aXZpdGllcyM5MjExCi1uYWljcyM5MjExNCNFeGVjdXRpdmUgYW5kIExlZ2lzbGF0aXZlIE9mZmljZXMsIENvbWJpbmVkIzkyMTEKLW5haWNzIzkyMTE1I0FtZXJpY2FuIEluZGlhbiBhbmQgQWxhc2thIE5hdGl2ZSBUcmliYWwgR292ZXJubWVudHMjOTIxMQotbmFpY3MjOTIxMTkjT3RoZXIgR2VuZXJhbCBHb3Zlcm5tZW50IFN1cHBvcnQjOTIxMQotbmFpY3MjOTIyI0p1c3RpY2UsIFB1YmxpYyBPcmRlciwgYW5kIFNhZmV0eSBBY3Rpdml0aWVzIzkyCi1uYWljcyM5MjIxI0p1c3RpY2UsIFB1YmxpYyBPcmRlciwgYW5kIFNhZmV0eSBBY3Rpdml0aWVzIzkyMgotbmFpY3MjOTIyMTEjQ291cnRzIzkyMjEKLW5haWNzIzkyMjEyI1BvbGljZSBQcm90ZWN0aW9uIzkyMjEKLW5haWNzIzkyMjEzI0xlZ2FsIENvdW5zZWwgYW5kIFByb3NlY3V0aW9uIzkyMjEKLW5haWNzIzkyMjE0I0NvcnJlY3Rpb25hbCBJbnN0aXR1dGlvbnMjOTIyMQotbmFpY3MjOTIyMTUjUGFyb2xlIE9mZmljZXMgYW5kIFByb2JhdGlvbiBPZmZpY2VzIzkyMjEKLW5haWNzIzkyMjE2I0ZpcmUgUHJvdGVjdGlvbiM5MjIxCi1uYWljcyM5MjIxOSNPdGhlciBKdXN0aWNlLCBQdWJsaWMgT3JkZXIsIGFuZCBTYWZldHkgQWN0aXZpdGllcyM5MjIxCi1uYWljcyM5MjMjQWRtaW5pc3RyYXRpb24gb2YgSHVtYW4gUmVzb3VyY2UgUHJvZ3JhbXMjOTIKLW5haWNzIzkyMzEjQWRtaW5pc3RyYXRpb24gb2YgSHVtYW4gUmVzb3VyY2UgUHJvZ3JhbXMjOTIzCi1uYWljcyM5MjMxMSNBZG1pbmlzdHJhdGlvbiBvZiBFZHVjYXRpb24gUHJvZ3JhbXMjOTIzMQotbmFpY3MjOTIzMTIjQWRtaW5pc3RyYXRpb24gb2YgUHVibGljIEhlYWx0aCBQcm9ncmFtcyM5MjMxCi1uYWljcyM5MjMxMyNBZG1pbmlzdHJhdGlvbiBvZiBIdW1hbiBSZXNvdXJjZSBQcm9ncmFtcyAoZXhjZXB0IEVkdWNhdGlvbiwgUHVibGljIEhlYWx0aCwgYW5kIFZldGVyYW5zJyBBZmZhaXJzIFByb2dyYW1zKSM5MjMxCi1uYWljcyM5MjMxNCNBZG1pbmlzdHJhdGlvbiBvZiBWZXRlcmFucycgQWZmYWlycyM5MjMxCi1uYWljcyM5MjQjQWRtaW5pc3RyYXRpb24gb2YgRW52aXJvbm1lbnRhbCBRdWFsaXR5IFByb2dyYW1zIzkyCi1uYWljcyM5MjQxI0FkbWluaXN0cmF0aW9uIG9mIEVudmlyb25tZW50YWwgUXVhbGl0eSBQcm9ncmFtcyM5MjQKLW5haWNzIzkyNDExI0FkbWluaXN0cmF0aW9uIG9mIEFpciBhbmQgV2F0ZXIgUmVzb3VyY2UgYW5kIFNvbGlkIFdhc3RlIE1hbmFnZW1lbnQgUHJvZ3JhbXMjOTI0MQotbmFpY3MjOTI0MTIjQWRtaW5pc3RyYXRpb24gb2YgQ29uc2VydmF0aW9uIFByb2dyYW1zIzkyNDEKLW5haWNzIzkyNSNBZG1pbmlzdHJhdGlvbiBvZiBIb3VzaW5nIFByb2dyYW1zLCBVcmJhbiBQbGFubmluZywgYW5kIENvbW11bml0eSBEZXZlbG9wbWVudCM5MgotbmFpY3MjOTI1MSNBZG1pbmlzdHJhdGlvbiBvZiBIb3VzaW5nIFByb2dyYW1zLCBVcmJhbiBQbGFubmluZywgYW5kIENvbW11bml0eSBEZXZlbG9wbWVudCM5MjUKLW5haWNzIzkyNTExI0FkbWluaXN0cmF0aW9uIG9mIEhvdXNpbmcgUHJvZ3JhbXMjOTI1MQotbmFpY3MjOTI1MTIjQWRtaW5pc3RyYXRpb24gb2YgVXJiYW4gUGxhbm5pbmcgYW5kIENvbW11bml0eSBhbmQgUnVyYWwgRGV2ZWxvcG1lbnQjOTI1MQotbmFpY3MjOTI2I0FkbWluaXN0cmF0aW9uIG9mIEVjb25vbWljIFByb2dyYW1zIzkyCi1uYWljcyM5MjYxI0FkbWluaXN0cmF0aW9uIG9mIEVjb25vbWljIFByb2dyYW1zIzkyNgotbmFpY3MjOTI2MTEjQWRtaW5pc3RyYXRpb24gb2YgR2VuZXJhbCBFY29ub21pYyBQcm9ncmFtcyM5MjYxCi1uYWljcyM5MjYxMiNSZWd1bGF0aW9uIGFuZCBBZG1pbmlzdHJhdGlvbiBvZiBUcmFuc3BvcnRhdGlvbiBQcm9ncmFtcyM5MjYxCi1uYWljcyM5MjYxMyNSZWd1bGF0aW9uIGFuZCBBZG1pbmlzdHJhdGlvbiBvZiBDb21tdW5pY2F0aW9ucywgRWxlY3RyaWMsIEdhcywgYW5kIE90aGVyIFV0aWxpdGllcyM5MjYxCi1uYWljcyM5MjYxNCNSZWd1bGF0aW9uIG9mIEFncmljdWx0dXJhbCBNYXJrZXRpbmcgYW5kIENvbW1vZGl0aWVzIzkyNjEKLW5haWNzIzkyNjE1I1JlZ3VsYXRpb24sIExpY2Vuc2luZywgYW5kIEluc3BlY3Rpb24gb2YgTWlzY2VsbGFuZW91cyBDb21tZXJjaWFsIFNlY3RvcnMjOTI2MQotbmFpY3MjOTI3I1NwYWNlIFJlc2VhcmNoIGFuZCBUZWNobm9sb2d5IzkyCi1uYWljcyM5MjcxI1NwYWNlIFJlc2VhcmNoIGFuZCBUZWNobm9sb2d5IzkyNwotbmFpY3MjOTI3MTEjU3BhY2UgUmVzZWFyY2ggYW5kIFRlY2hub2xvZ3kjOTI3MQotbmFpY3MjOTI4I05hdGlvbmFsIFNlY3VyaXR5IGFuZCBJbnRlcm5hdGlvbmFsIEFmZmFpcnMjOTIKLW5haWNzIzkyODEjTmF0aW9uYWwgU2VjdXJpdHkgYW5kIEludGVybmF0aW9uYWwgQWZmYWlycyM5MjgKLW5haWNzIzkyODExI05hdGlvbmFsIFNlY3VyaXR5IzkyODEKLW5haWNzIzkyODEyI0ludGVybmF0aW9uYWwgQWZmYWlycyM5MjgxCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS91bnNwc2MtZGF0YS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS91bnNwc2MtZGF0YS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODM1MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2RhdGEvdW5zcHNjLWRhdGEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTcwNTQgKzAsMCBAQAotdW5zcHNjNyMxMC4wMC4wMC4wMC4wMCNMaXZlIFBsYW50IGFuZCBBbmltYWwgTWF0ZXJpYWwgYW5kIEFjY2Vzc29yaWVzIGFuZCBTdXBwbGllcyMxMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMC4wMC4wMC4wMCNMaXZlIGFuaW1hbHMjMTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMDAuMDAjTGl2ZXN0b2NrIzEwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjAxLjAwI0NhdHMjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMDIuMDAjRG9ncyMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4wNC4wMCNNaW5rIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjA1LjAwI1JhdHMjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMDYuMDAjSG9yc2VzIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjA3LjAwI1NoZWVwIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjA4LjAwI0dvYXRzIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjA5LjAwI0Fzc2VzIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjEwLjAwI01pY2UjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMTEuMDAjU3dpbmUjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMTIuMDAjUmFiYml0cyMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4xMy4wMCNHdWluZWEgcGlncyMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4xNC4wMCNQcmltYXRlcyMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4xNS4wMCNBcm1hZGlsbG9zIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjE2LjAwI0NhdHRsZSMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4xNy4wMCNDYW1lbHMjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTYuMDAuMDAjQmlyZHMgYW5kIGZvd2wjMTAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTYuMDEuMDAjTGl2ZSBjaGlja2VucyMxMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNi4wMi4wMCNMaXZlIGR1Y2tzIzEwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE2LjAzLjAwI0xpdmUgdHVya2V5cyMxMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNi4wNC4wMCNMaXZlIGdlZXNlIzEwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE2LjA1LjAwI0xpdmUgcGhlYXNhbnRzIzEwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE3LjAwLjAwI0xpdmUgZmlzaCMxMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNy4wMS4wMCNMaXZlIHNhbG1vbiMxMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNy4wMi4wMCNMaXZlIHRyb3V0IzEwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE3LjAzLjAwI0xpdmUgdGFsYXBpYSMxMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNy4wNC4wMCNMaXZlIGNhcnAjMTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTcuMDUuMDAjTGl2ZSBlZWxzIzEwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjAwLjAwI1NoZWxsZmlzaCBhbmQgYXF1YXRpYyBpbnZlcnRlYnJhdGVzIzEwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjAxLjAwI0xpdmUgc2hyaW1wIzEwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjAyLjAwI0xpdmUgY2xhbXMjMTAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTguMDMuMDAjTGl2ZSBtdXNzZWxzIzEwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjA0LjAwI0xpdmUgb3lzdGVycyMxMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMC4xOC4wNS4wMCNMaXZlIGNyYWJzIzEwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjA2LjAwI0xpdmUgYWJhbG9uZSMxMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMC4xOC4wNy4wMCNMaXZlIG9jdG9waSMxMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMC4xOC4wOC4wMCNMaXZlIHNxdWlkIzEwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE5LjAwLjAwI0luc2VjdHMjMTAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTkuMDEuMDAjQnV0dGVyZmxpZXMjMTAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTkuMDIuMDAjQmVldGxlcyMxMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xOS4wMy4wMCNCZWVzIzEwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE5LjA0LjAwI1NpbGt3b3JtcyMxMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMxMC4xMC4yMC4wMC4wMCNXaWxkIGFuaW1hbHMjMTAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMjAuMDEuMDAjRWxlcGhhbnRzIzEwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEwLjEwLjIwLjAyLjAwI0xpdmUgZm94ZXMjMTAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMDAuMDAuMDAjRG9tZXN0aWMgcGV0IHByb2R1Y3RzIzEwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjExLjExLjAwLjAwI1BldCBmb29kIGJvd2xzIG9yIGVxdWlwbWVudCMxMC4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMS4xMi4wMC4wMCNNZWRpY2F0ZWQgcGV0IHRyZWF0bWVudHMjMTAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMTMuMDAuMDAjRG9tZXN0aWMgcGV0IHRyZWF0bWVudHMgYW5kIGFjY2Vzc29yaWVzIGFuZCBlcXVpcG1lbnQjMTAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMTMuMDEuMDAjUGV0IHRveXMjMTAuMTEuMTMuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMTMuMDIuMDAjUGV0IGdyb29taW5nIHByb2R1Y3RzIzEwLjExLjEzLjAwLjAwCi11bnNwc2M3IzEwLjExLjEzLjAzLjAwI1BldCBsaXR0ZXIgb3IgZXF1aXBtZW50IGZvciBwZXQgd2FzdGUgbWFuYWdlbWVudCMxMC4xMS4xMy4wMC4wMAotdW5zcHNjNyMxMC4xMS4xMy4wNC4wMCNQZXQgZm9vZCBib3dscyBvciBlcXVpcG1lbnQjMTAuMTEuMTMuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMTMuMDUuMDAjTWVkaWNhdGVkIHBldCB0cmVhdG1lbnRzIzEwLjExLjEzLjAwLjAwCi11bnNwc2M3IzEwLjEyLjAwLjAwLjAwI0FuaW1hbCBmZWVkIzEwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjE1LjAwLjAwI0xpdmVzdG9jayBmZWVkIzEwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjE1LjAxLjAwI1B1cmUgd2hlYXQgYnJhbiMxMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNS4wMi4wMCNGZWVkIG9hdHMjMTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTUuMDMuMDAjRmVlZCBjb3JuIzEwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEyLjE1LjA0LjAwI0ZlZWQgc29yZ2h1bSMxMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNS4wNS4wMCNIYXkjMTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTUuMDYuMDAjT2lsIGNha2UjMTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTYuMDAuMDAjQmlyZCBhbmQgZm93bCBmb29kIzEwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjE2LjAxLjAwI0xpdmUgZm9vZCBmb3IgYmlyZHMjMTAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTYuMDIuMDAjQmlyZCBzZWVkIzEwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEyLjE2LjAzLjAwI0JpcmQgdHJlYXRzIG9yIHNuYWNrcyMxMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNi4wNC4wMCNQb3VsdHJ5IGZvb2QjMTAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTcuMDAuMDAjRmlzaCBmb29kIzEwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjE3LjAxLjAwI0ZyZXNoIG9yIGZyb3plbiBicmluZSMxMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNy4wMi4wMCNGaXNoIGZvb2QgcGVsbGV0cyMxMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNy4wMy4wMCNGaXNoIGZvb2QgZmxha2VzIzEwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzEwLjEyLjE4LjAwLjAwI0RvZyBhbmQgY2F0IGZvb2QjMTAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTguMDEuMDAjRHJ5IGZvb2QgZm9yIGRvZ3MjMTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTguMDIuMDAjTW9pc3QgZm9vZCBmb3IgZG9ncyMxMC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMi4xOC4wMy4wMCNNaWxrIGZvciBkb2dzIG9yIGNhdHMjMTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTguMDQuMDAjRHJ5IGZvb2QgZm9yIGNhdHMjMTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTguMDUuMDAjTW9pc3QgZm9vZCBmb3IgY2F0cyMxMC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMi4xOC4wNi4wMCNUcmVhdHMgb3Igc25hY2tzIGZvciBjYXRzIG9yIGRvZ3MjMTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTkuMDAuMDAjUm9kZW50IGZvb2QjMTAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTkuMDEuMDAjUGVsbGV0aXplZCBmb29kIGZvciByb2RlbnRzIzEwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzEwLjEyLjIwLjAwLjAwI1JlcHRpbGUgZm9vZCMxMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMi4yMC4wMS4wMCNQZWxsZXRpemVkIGZvb2QgZm9yIHJlcHRpbGVzIzEwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjIwLjAyLjAwI01vaXN0IGZvb2QgZm9yIHJlcHRpbGVzIzEwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjIwLjAzLjAwI0xpdmUgZm9vZCBmb3IgcmVwdGlsZXMjMTAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMDAuMDAuMDAjQW5pbWFsIGNvbnRhaW5tZW50IGFuZCBoYWJpdGF0cyMxMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMy4xNS4wMC4wMCNBbmltYWwgc2hlbHRlcnMjMTAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTUuMDYuMDAjTGl2ZXN0b2NrIHN0YWJsZXMjMTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTUuMDcuMDAjRG9tZXN0aWNpemVkIHBldCBob3VzZXMjMTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTUuMDguMDAjUGV0IGJlZHMjMTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTYuMDAuMDAjQW5pbWFsIGNvbnRhaW5tZW50IzEwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEzLjE2LjAxLjAwI0NhZ2VzIzEwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEzLjE2LjAyLjAwI0tlbm5lbHMjMTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTYuMDMuMDAjQW5pbWFsIGNhcnJ5aW5nIGNhc2VzIzEwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEzLjE2LjA0LjAwI0RvZyBydW5zIzEwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEzLjE3LjAwLjAwI0FuaW1hbCBoYWJpdGF0cyMxMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMy4xNy4wMS4wMCNUZXJyYXJpdW1zIzEwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzEwLjEzLjE3LjAyLjAwI0FxdWFyaXVtcyMxMC4xMy4xNy4wMC4wMAotdW5zcHNjNyMxMC4xNC4wMC4wMC4wMCNTYWRkbGVyeSBhbmQgaGFybmVzcyBnb29kcyMxMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNS4wMC4wMCNTYWRkbGVyeSMxMC4xNC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNS4wMS4wMCNTYWRkbGVzIzEwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE1LjAyLjAwI1doaXBzIzEwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE2LjAwLjAwI0hhcm5lc3MgZ29vZHMjMTAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTQuMTYuMDEuMDAjQnJpZGxlcyMxMC4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNi4wMi4wMCNZb2tlcyMxMC4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNi4wMy4wMCNIb3JzZSBiaXRzIzEwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE2LjA0LjAwI1JlaW5zIzEwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE2LjA1LjAwI1N0aXJydXBzIzEwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE2LjA2LjAwI0xlYXNoZXMgb3IgbGVhZHMjMTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTQuMTYuMDcuMDAjQ29sbGFycyMxMC4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNi4wOC4wMCNIYXJuZXNzZXMjMTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTQuMTYuMDkuMDAjUmVzdHJhaW50cyMxMC4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4wMC4wMC4wMCNTZWVkcyBhbmQgYnVsYnMgYW5kIHNlZWRsaW5ncyBhbmQgY3V0dGluZ3MjMTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMDAuMDAjVmVnZXRhYmxlIHNlZWRzIGFuZCBzZWVkbGluZ3MjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMDEuMDAjQmVhbiBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMDIuMDAjQ2Fycm90IHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4wMy4wMCNDZWxlcnkgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjA0LjAwI0NoaWxpIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4wNS4wMCNDb3VyZ2V0dGUgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjA2LjAwI0NvdyBwZWEgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjA3LjAwI0N1Y3VtYmVyIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4wOC4wMCNFZ2dwbGFudCBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMDkuMDAjRW5kaXZlIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4xMC4wMCNHYXJsaWMgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjExLjAwI0xlZWsgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjEyLjAwI0xldHR1Y2Ugc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjEzLjAwI0Nvcm4gc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjE0LjAwI01lbG9uIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4xNS4wMCNPbmlvbiBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMTYuMDAjU295YSBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMTcuMDAjU3BpbmFjaCBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMTguMDAjVG9tYXRvIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4xOS4wMCNUdXJuaXAgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjIwLjAwI0NoYXJkIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4yMS4wMCNTd2VldCBwZXBwZXIgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjIyLjAwI0JlZXQgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjIzLjAwI0NhdWxpZmxvd2VyIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4yNC4wMCNQYXJzZWx5IHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNi4wMC4wMCNDZXJlYWwgc2VlZHMjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDEuMDAjV2hlYXQgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDIuMDAjQ29semEgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDMuMDAjQmFybGV5IHNlZWRzIzEwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE2LjA0LjAwI01pbGxldCBzZWVkcyMxMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNi4wNS4wMCNPYXQgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDYuMDAjU2VzYW1lIHNlZWRzIzEwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE2LjA3LjAwI0xpbnNlZWQgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDguMDAjQ2FzdG9yIG9pbCBzZWVkcyMxMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNi4wOS4wMCNNYWl6ZSBzZWVkcyMxMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNi4xMC4wMCNSeWUgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMTEuMDAjU29yZ2h1bSBzZWVkcyMxMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNy4wMC4wMCNHcmFzcyBhbmQgZm9yYWdlIHNlZWRzIGFuZCBzZWVkbGluZ3MjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTcuMDEuMDAjUmljZSBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTcuMDIuMDAjQ2xvdmVyIHNlZWRzIG9yIHNlZWRsaW5nIzEwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE3LjAzLjAwI0FsZmFsZmEgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE3LjA0LjAwI0dyYXNzIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wMC4wMCNTcGljZSBjcm9wIHNlZWRzIGFuZCBzZWVkbGluZ3MjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTguMDEuMDAjUGVwcGVyIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wMi4wMCNWYW5pbGxhIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wMy4wMCNDaW5uYW1vbiBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTguMDQuMDAjQ2xvdmUgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE4LjA1LjAwI0NvcmlhbmRlciBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTguMDYuMDAjR2luZ2VyIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wNy4wMCNTYWZmcm9uIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wOC4wMCNUaHltZSBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTguMDkuMDAjQ3Vycnkgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE4LjEwLjAwI011c3RhcmQgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE4LjExLjAwI0dpbnNlbmcgcm9vdHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE5LjAwLjAwI0Zsb3dlciBzZWVkcyBhbmQgYnVsYnMgYW5kIHNlZWRsaW5ncyBhbmQgY3V0dGluZ3MjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTkuMDEuMDAjVHVsaXAgc2VlZHMgb3IgYnVsYnMgb3Igc2VlZGxpbmdzIG9yIGN1dHRpbmdzIzEwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE5LjAyLjAwI1Jvc2Ugc2VlZHMgb3Igc2VlZGxpbmdzIG9yIGN1dHRpbmdzIzEwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE5LjAzLjAwI0RhZmZvZGlsIHNlZWRzIG9yIGJ1bGJzIG9yIHNlZWRsaW5ncyBvciBjdXR0aW5ncyMxMC4xNS4xOS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOS4wNC4wMCNTdW5mbG93ZXIgc2VlZHMjMTAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTkuMDUuMDAjSHlhY2ludGggYnVsYnMgb3Igc2hvb3RzIzEwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE5LjA2LjAwI0xpbHkgQnVsYnMjMTAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMjAuMDAuMDAjVHJlZSBhbmQgc2hydWIgc2VlZHMgYW5kIGN1dHRpbmdzIzEwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIwLjAxLjAwI0ZydWl0IHRyZWUgc2VlZHMgb3IgY3V0dGluZ3MjMTAuMTUuMjAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMjAuMDIuMDAjQ29uaWZlciB0cmVlIHNlZWRzIG9yIGN1dHRpbmdzIzEwLjE1LjIwLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIwLjAzLjAwI051dCB0cmVlIHNlZWRzIG9yIGN1dHRpbmdzIzEwLjE1LjIwLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIxLjAwLjAwI1Jlc2lkdWVzIG90aGVyIHRoYW4gYW5pbWFsIGZlZWQjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMjEuMDEuMDAjUmVzaWR1ZXMgYmFib29sIHNlZWQgZXh0cmFjdGlvbiMxMC4xNS4yMS4wMC4wMAotdW5zcHNjNyMxMC4xNS4yMS4wMi4wMCNSZXNpZHVlcyBvZiByYXBlIHNlZWRzIzEwLjE1LjIxLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIxLjAzLjAwI1Jlc2lkdWUgb2YgbGluc2VlZCMxMC4xNS4yMS4wMC4wMAotdW5zcHNjNyMxMC4xNS4yMS4wNC4wMCNPaWwgY2FrZSBvZiBuZWVtIzEwLjE1LjIxLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIyLjAwLjAwI0ZpYnJvdXMgY3JvcCBzZWVkcyBhbmQgc2VlZGxpbmdzIzEwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIyLjAxLjAwI0NvdHRvbiBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMjIuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMDAuMDAuMDAjRmxvcmljdWx0dXJlIGFuZCBzaWx2aWN1bHR1cmUgcHJvZHVjdHMjMTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTUuMDAuMDAjVHJlZXMgYW5kIHNocnVicyMxMC4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNS4wMS4wMCNPbGl2ZSB0cmVlcyMxMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNS4wMi4wMCNDb2ZmZWUgc2hydWJzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjAzLjAwI0NvY29hIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjA0LjAwI0FwcGxlIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjA1LjAwI1BlYWNoIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjA2LjAwI09yYW5nZSB0cmVlcyMxMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNS4wNy4wMCNSaG9kZW5kcm9uIHNocnVicyMxMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNS4wOC4wMCNUZWEgc2hydWJzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjA5LjAwI0NvbmlmZXIgdHJlZXMjMTAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTUuMTAuMDAjU3BydWNlIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjExLjAwI1BpbmUgdHJlZXMjMTAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTUuMTIuMDAjRmlyIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE2LjAwLjAwI0Zsb3JhbCBwbGFudHMjMTAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTYuMDEuMDAjUm9zZSBwbGFudHMjMTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTYuMDIuMDAjUG9pbnNldHRpYXMgcGxhbnRzIzEwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE2LjAzLjAwI09yY2hpZHMgcGxhbnRzIzEwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE2LjA0LjAwI0F6YWxlYXMgcGxhbnRzIzEwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE2LjA1LjAwI0NhY3R1cyBwbGFudHMjMTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTcuMDAuMDAjQ3V0IGZsb3dlcnMjMTAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTcuMDEuMDAjQ3V0IGdsYWRpb2x1cyMxMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNy4wMi4wMCNDdXQgbGlsaWVzIzEwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE3LjAzLjAwI0N1dCBjYXJuYXRpb25zIzEwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE3LjA0LjAwI0N1dCB0dWxpcHMjMTAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTcuMDUuMDAjQ3V0IHJvc2VzIzEwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE4LjAwLjAwI05vbiBmbG93ZXJpbmcgcGxhbnRzIzEwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE2LjE4LjAxLjAwI0Zlcm5zIzEwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE4LjAyLjAwI0l2aWVzIzEwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE4LjAzLjAwI1BoaWxvZGVuZHJvbnMjMTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDAuMDAjRHJpZWQgZmxvcmFsIHByb2R1Y3RzIzEwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE2LjE5LjAxLjAwI0RyaWVkIHBvZHMjMTAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDIuMDAjRHJpZWQgbGVhZnkgZ3JlZW5lcnkjMTAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDMuMDAjRHJpZWQgZmVybiBncmVlbmVyeSMxMC4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xOS4wNC4wMCNEcmllZCBmdWxsIGZsb3dlcnMjMTAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDUuMDAjRHJpZWQgdHdpZ3Mgb3Igc3RpY2tzIzEwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE5LjA2LjAwI0RyaWVkIGdyYXNzIHBsdW1lcyMxMC4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xOS4wNy4wMCNEcmllZCBwcmVzc2VkIGZsb3dlcnMjMTAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDguMDAjRHJpZWQgZmxvd2VyIHBldGFscyMxMC4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMC4xNy4wMC4wMC4wMCNGZXJ0aWxpemVycyBhbmQgcGxhbnQgbnV0cmllbnRzIGFuZCBoZXJiaWNpZGVzIzEwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjE3LjE1LjAwLjAwI09yZ2FuaWMgZmVydGlsaXplcnMgYW5kIHBsYW50IG51dHJpZW50cyMxMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNS4wMS4wMCNNYW51cmUgb3IgZ3Vhbm8jMTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTcuMTUuMDIuMDAjUGxhbnQgaG9ybW9uZXMjMTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTcuMTUuMDMuMDAjRmlzaCBtZWFsIzEwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE3LjE2LjAwLjAwI0NoZW1pY2FsIGZlcnRpbGl6ZXJzIGFuZCBwbGFudCBudXRyaWVudHMjMTAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTcuMTYuMDEuMDAjTml0cm9nZW5vdXMgZmVydGlsaXplciMxMC4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNi4wMi4wMCNQb3Rhc3NpYyBmZXJ0aWxpemVyIzEwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE3LjE2LjAzLjAwI1Bob3NwaGF0aWMgZmVydGlsaXplciMxMC4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNi4wNC4wMCNTdWxwaHVyaWMgZmVydGlsaXplciMxMC4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNi4wNS4wMCNOaXRyb2dlbiBQaG9zcGhvcm91cyBQb3Rhc3NpdW0gTWl4dHVyZXMgKE5QSykjMTAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTcuMTcuMDAuMDAjSGVyYmljaWRlcyMxMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNy4wMS4wMCNXZWVkIGtpbGxlciMxMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNy4wMi4wMCNGdW5naWNpZGVzIzEwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE5LjAwLjAwLjAwI1Blc3QgY29udHJvbCBwcm9kdWN0cyMxMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNS4wMC4wMCNJbnNlY3RpY2lkZXMgYW5kIGluc2VjdCBjb250cm9sIHRyYXBzIzEwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE5LjE1LjAxLjAwI1NwcmF5IGluc2VjdGljaWRlcyMxMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNS4wMi4wMCNCYWl0IGluc2VjdGljaWRlcyMxMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNS4wMy4wMCNTaWxpY2ljIGFjaWQjMTAuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTkuMTUuMDQuMDAjRmx5aW5nIGluc2VjdCBjb250cm9sIHRyYXBzIzEwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE5LjE2LjAwLjAwI1JvZGVudGljaWRlcyMxMC4xOS4wMC4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNi4wMS4wMCNFeHRydWRlZCBiYWl0cyMxMC4xOS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNi4wMi4wMCNNZWFsIG9yIHBlbGxldCBvciBzZWVkIGJhaXRzIzEwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE5LjE2LjAzLjAwI0xpcXVpZCBiYWl0cyMxMC4xOS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNi4wNC4wMCNUcmFja2luZyBwb3dkZXJzIzEwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE5LjE3LjAwLjAwI0FuaW1hbCBjb250cm9sIHRyYXBzIzEwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE5LjE3LjAxLjAwI01vdXNlIG9yIHJhdCB0cmFwcyMxMC4xOS4xNy4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNy4wMi4wMCNXaXJlIGNhZ2UgdHJhcHMjMTAuMTkuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMDAuMDAuMDAuMDAjTWluZXJhbCBhbmQgVGV4dGlsZSBhbmQgSW5lZGlibGUgUGxhbnQgYW5kIEFuaW1hbCBNYXRlcmlhbHMjMTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMDAuMDAuMDAjTWluZXJhbHMgYW5kIG9yZXMgYW5kIG1ldGFscyMxMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wMC4wMCNNaW5lcmFscyMxMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wMS4wMCNNaWNhIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjAyLjAwI0VtZXJ5IzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjAzLjAwI1F1YXJ0eiMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wNC4wMCNQeXJpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMDUuMDAjU3VscGh1ciMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wNi4wMCNDaGFsayMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wNy4wMCNHcmFwaGl0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wOC4wMCNEb2xvbWl0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wOS4wMCNNYWduZXNpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTAuMDAjQXNiZXN0b3MjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTEuMDAjQ2FsY2l1bSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4xMi4wMCNCb3JhdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTMuMDAjQ3J5b2xpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTQuMDAjRmVsZHNwYXIjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTUuMDAjTGV1Y2l0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4xNi4wMCNOZXBoZWxpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTcuMDAjU3RlYXRpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTguMDAjVGFsYyMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4xOS4wMCNEaWFtb25kcyMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4yMC4wMCNHYXJuZXRzIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjIxLjAwI1NpbGljb24gY2FyYmlkZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4yMi4wMCNBY3RpdmF0ZWQgY2FyYm9uIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjIzLjAwI011bGl0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4yNC4wMCNGbG91cm9zcGFyIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjI1LjAwI0tlaXNlcml0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4yNi4wMCNDYXJuYWxsaXRlIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjAwLjAwI09yZXMjMTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMDEuMDAjSXJvbiBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMDIuMDAjVGl0YW5pdW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjAzLjAwI1VyYW5pdW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjA0LjAwI0NvcHBlciBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMDUuMDAjQWx1bWludW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjA2LjAwI05pY2tlbCBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMDcuMDAjU2lsdmVyIG9yZSMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4wOC4wMCNMZWFkIG9yZSMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4wOS4wMCNaaW5jIG9yZSMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4xMC4wMCNUaW4gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjExLjAwI01hbmdhbmVzZSBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMTIuMDAjQ2hyb21pdW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjEzLjAwI1R1bmdzdGVuIG9yIHdvbGZyYW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjE0LjAwI01vbHliZGVudW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjE1LjAwI0NvYmFsdCBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMTYuMDAjR29sZCBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMTcuMDAjVGFudGFsdW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjE4LjAwI1BsYXRpbnVtIG9yZSMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4xOS4wMCNWZXJtaWN1bGl0ZSBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMjAuMDAjVGhvcml1bSBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMjEuMDAjS3lhbml0ZSBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMjIuMDAjQW50aW1vbnkgb3JlcyMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4yMy4wMCNaaXJjb25pdW0gb3JlcyMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wMC4wMCNCYXNlIG1ldGFscyMxMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wMS4wMCNTbGFnIG9yIGFzaCMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wMi4wMCNOYXR1cmFsIGdyYXBoaXRlIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjAzLjAwI1RpdGFuaXVtIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjA0LjAwI1N0ZWVsIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjA1LjAwI0FsdW1pbnVtIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjA2LjAwI05pY2tlbCMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wNy4wMCNNYWduZXNpdW0jMTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTcuMDguMDAjQmlzbXV0aCMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wOS4wMCNBbnRpbW9ueSMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4xMC4wMCNDYWRtaXVtIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjExLjAwI05vbiBmZXJyb3VzIGFsbG95IzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjEyLjAwI0ZlcnJvdXMgYWxsb3kjMTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTcuMTMuMDAjSXJvbiMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4xNC4wMCNMZWFkIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjE1LjAwI0NvcHBlciMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xOC4wMC4wMCNQcmVjaW91cyBtZXRhbHMjMTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTguMDEuMDAjR29sZCMxMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMC4xOC4wMi4wMCNTaWx2ZXIjMTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTguMDMuMDAjUGxhdGludW0jMTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTEuMDAuMDAuMDAjRWFydGggYW5kIHN0b25lIzExLjAwLjAwLjAwLjAwCi11bnNwc2M3IzExLjExLjE1LjAwLjAwI0RpcnQgYW5kIHNvaWwjMTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTUuMDEuMDAjU29pbCMxMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNS4wMi4wMCNGaWxsIGRpcnQjMTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTUuMDMuMDAjVG9wc29pbCMxMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNi4wMC4wMCNTdG9uZSMxMS4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNi4wMS4wMCNHeXBzdW0jMTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTYuMDIuMDAjVHJhdmVydGluZSMxMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNi4wMy4wMCNFY2F1c3NpbmUgb3IgYWxhYmFzdGVyIzExLjExLjE2LjAwLjAwCi11bnNwc2M3IzExLjExLjE2LjA0LjAwI0dyYW5pdGUjMTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTYuMDUuMDAjTWFyYmxlIzExLjExLjE2LjAwLjAwCi11bnNwc2M3IzExLjExLjE2LjA2LjAwI1NsYXRlIzExLjExLjE2LjAwLjAwCi11bnNwc2M3IzExLjExLjE2LjA3LjAwI1NhbmRzdG9uZSMxMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNi4wOC4wMCNMaW1lc3RvbmUjMTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTYuMDkuMDAjQmFzYWx0IzExLjExLjE2LjAwLjAwCi11bnNwc2M3IzExLjExLjE2LjEwLjAwI1B1bWljZSBzdG9uZSMxMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNy4wMC4wMCNTYW5kIzExLjExLjAwLjAwLjAwCi11bnNwc2M3IzExLjExLjE3LjAxLjAwI1NpbGljYSBzYW5kIzExLjExLjE3LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjAwLjAwI0NsYXlzIzExLjExLjAwLjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjAxLjAwI1RlcnJhIGNvdHRhIzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjAyLjAwI0ZpcmVjbGF5IzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjAzLjAwI0thb2xpbiBvciBvdGhlciBrYW9saW5pYyBjbGF5cyMxMS4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMS4xOC4wNC4wMCNCZW50b25pdGUjMTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTguMDUuMDAjQW5kYWx1c2l0ZSMxMS4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMS4xOC4wNi4wMCNNdWxsaXRlIzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjA3LjAwI0NoYW1vdHRlIzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjA4LjAwI0NvbW1vbiBjbGF5IzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjA5LjAwI0JhbGwgY2xheSMxMS4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMS4xOC4xMC4wMCNGdWxsZXJzIGVhcnRoIzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjEyLjAwLjAwLjAwI05vbiBlZGlibGUgcGxhbnQgYW5kIGZvcmVzdHJ5IHByb2R1Y3RzIzExLjAwLjAwLjAwLjAwCi11bnNwc2M3IzExLjEyLjE1LjAwLjAwI1NhcCMxMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNS4wMi4wMCNSb3NpbiMxMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNS4wMy4wMCNMYWMjMTEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTYuMDAuMDAjV29vZCMxMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNi4wMy4wMCNMb2dzIzExLjEyLjE2LjAwLjAwCi11bnNwc2M3IzExLjEyLjE2LjA0LjAwI1NvZnQgdGltYmVyIzExLjEyLjE2LjAwLjAwCi11bnNwc2M3IzExLjEyLjE2LjA1LjAwI1JhdHRhbiMxMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNi4wNi4wMCNDb3JrIzExLjEyLjE2LjAwLjAwCi11bnNwc2M3IzExLjEyLjE2LjA3LjAwI1dvb2QgcHVscCMxMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNi4wOC4wMCNCYW1ib28jMTEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTYuMDkuMDAjUGx5d29vZCMxMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNi4xMC4wMCNIYXJkd29vZHMjMTEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTcuMDAuMDAjRm9yZXN0cnkgYnkgcHJvZHVjdHMjMTEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTcuMDEuMDAjU2F3IGR1c3QjMTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTcuMDIuMDAjV29vZCBjaGlwcyMxMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNy4wMy4wMCNQZWF0IG1vc3MjMTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTcuMDQuMDAjV29vZCBzaGF2aW5ncyMxMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNy4wNS4wMCNCYXJrIzExLjEyLjE3LjAwLjAwCi11bnNwc2M3IzExLjEyLjE3LjA2LjAwI011bGNoIzExLjEyLjE3LjAwLjAwCi11bnNwc2M3IzExLjEyLjE3LjA3LjAwI1dvb2Qgd29vbCMxMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNy4wOC4wMCNXb29kIGZsb3VyIzExLjEyLjE3LjAwLjAwCi11bnNwc2M3IzExLjEyLjE3LjA5LjAwI0JhbHNhbXMjMTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTguMDAuMDAjUGxhbnQgZmliZXJzIzExLjEyLjAwLjAwLjAwCi11bnNwc2M3IzExLjEyLjE4LjAxLjAwI0hlbXAjMTEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTguMDIuMDAjQ290dG9uIzExLjEyLjE4LjAwLjAwCi11bnNwc2M3IzExLjEyLjE4LjAzLjAwI0ZsYXgjMTEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTguMDQuMDAjSnV0ZSMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4wNS4wMCNTaXNhbCMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4wNi4wMCNDb2NvbnV0IGZpYnJlcyBvciBjb2lyIzExLjEyLjE4LjAwLjAwCi11bnNwc2M3IzExLjEyLjE4LjA3LjAwI0FiYWNhIGZpYmVycyMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4wOC4wMCNSYW1pZSMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4wOS4wMCNTdHJhdyMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4xMC4wMCNCcm9vbSBjb3JuIG9yIGlzdGxlIG9yIHBpYXNzYXZhIzExLjEyLjE4LjAwLjAwCi11bnNwc2M3IzExLjEyLjE5LjAwLjAwI1BlcmZ1bWVyeSBwcm9kdWN0cyMxMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOS4wMS4wMCNMaWNvcmljZSByb290cyMxMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMxMS4xMy4wMC4wMC4wMCNOb24gZWRpYmxlIGFuaW1hbCBwcm9kdWN0cyMxMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wMC4wMCNBbmltYWwgaGlkZXMgYW5kIHNraW5zIGFuZCBhbmltYWwgdGV4dGlsZSBtYXRlcmlhbHMjMTEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTUuMDEuMDAjRmVhdGhlcnMjMTEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTUuMDIuMDAjRnVycyMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wMy4wMCNBbmltYWwgaGFpciMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wNC4wMCNIaWRlcyMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wNS4wMCNVbnByb2Nlc3NlZCBtb2hhaXIjMTEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTUuMDYuMDAjVW5wcm9jZXNzZWQgd29vbCMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wNy4wMCNTdWVkZSMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wOC4wMCNGdWxsIGdyYWluIGxlYXRoZXIjMTEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTYuMDAuMDAjT3RoZXIgYW5pbWFsIHByb2R1Y3RzIzExLjEzLjAwLjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjAxLjAwI0l2b3J5IzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjAyLjAwI1NlbWVuIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjAzLjAwI0V4Y3JldGlvbnMjMTEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTYuMDQuMDAjRmlzaCBlZ2dzIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjA1LjAwI0JvbmVzIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjA2LjAwI0FuaW1hbCBob3JucyMxMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNi4wNy4wMCNFbWJyeW9zIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjA4LjAwI1NoZWxsIGFydGljbGVzIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjE0LjAwLjAwLjAwI1NjcmFwIGFuZCB3YXN0ZSBtYXRlcmlhbHMjMTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTUuMDAuMDAjTWV0YWwgd2FzdGUgYW5kIHNjcmFwIzExLjE0LjAwLjAwLjAwCi11bnNwc2M3IzExLjE0LjE1LjAxLjAwI0ZlcnJvdXMgbWV0YWwgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTUuMDIuMDAjTm9uIGZlcnJvdXMgbWV0YWwgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTUuMDMuMDAjQXV0b21vdGl2ZSB3cmVja2luZyBmb3Igd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDAuMDAjTm9uIG1ldGFsbGljIHdhc3RlIGFuZCBzY3JhcCMxMS4xNC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNC4xNi4wMS4wMCNUZXh0aWxlIHdhc3RlIG9yIHNjcmFwIzExLjE0LjE2LjAwLjAwCi11bnNwc2M3IzExLjE0LjE2LjAyLjAwI1BsYXN0aWMgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDMuMDAjT2lsIHdhc3RlcyMxMS4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNC4xNi4wNC4wMCNQYXBlciB3YXN0ZXMjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDUuMDAjR2xhc3Mgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDYuMDAjV29vZCB3YXN0ZSBvciBzY3JhcCMxMS4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNC4xNi4wNy4wMCNSdWJiZXIgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDguMDAjSGF6YXJkb3VzIHdhc3RlIG9yIHNjcmFwIzExLjE0LjE2LjAwLjAwCi11bnNwc2M3IzExLjE0LjE2LjA5LjAwI0NvbXBvc2l0aW9uIGxlYXRoZXIjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMTAuMDAjTGVhdGhlciB3YXN0ZSBhbmQgc2NyYXAjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTcuMDAuMDAjRm9vZCBhbmQgdG9iYWNjbyB3YXN0ZSBhbmQgc2NyYXAjMTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTcuMDEuMDAjRm9vZCB3YXN0ZSBvciBzY3JhcCMxMS4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNC4xNy4wMi4wMCNUb2JhY2NvIHdhc3RlIG9yIHNjcmFwIzExLjE0LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjAwLjAwLjAwI0ZpYmVycyBhbmQgdGhyZWFkcyBhbmQgeWFybnMjMTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTUuMDAuMDAjRmliZXJzIzExLjE1LjAwLjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjAxLjAwI0FjZXRhdGUgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjAyLjAwI055bG9uIGZpYmVycyMxMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNS4wMy4wMCNQb2x5ZXN0ZXIgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA0LjAwI0FjcnlsaWMgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA1LjAwI1Zpc2Nvc2UgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA2LjAwI1JheW9uIGZpYmVycyMxMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNS4wNy4wMCNDb3R0b24gZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA4LjAwI1dvb2wgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA5LjAwI1NpbGsgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjEwLjAwI1ZlZ2V0YWJsZSBmaWJlcnMjMTEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTUuMTEuMDAjUG9seXByb3B5bGVuZSBmaWJlcnMjMTEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTUuMTIuMDAjR2xhc3MgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjEzLjAwI0NlcmFtaWMgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjE0LjAwI1BvbHltZXIgYXJhbWlkIGZpYmVycyMxMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNS4xNS4wMCNBc2Jlc3RvcyBmaWJlcnMjMTEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMDAuMDAjVGhyZWFkcyMxMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNi4wMS4wMCNDb3R0b24gdGhyZWFkIzExLjE1LjE2LjAwLjAwCi11bnNwc2M3IzExLjE1LjE2LjAyLjAwI1NpbGsgdGhyZWFkIzExLjE1LjE2LjAwLjAwCi11bnNwc2M3IzExLjE1LjE2LjAzLjAwI1BvbHllc3RlciB0aHJlYWQjMTEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMDQuMDAjUG9seWFtaWRlIHRocmVhZCMxMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNi4wNS4wMCNCaXNtYWxlbWlkZSB0aHJlYWQjMTEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMDYuMDAjRmliZXJnbGFzcyB0aHJlYWQjMTEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMDcuMDAjR3JhcGhpdGUgdGhyZWFkIzExLjE1LjE2LjAwLjAwCi11bnNwc2M3IzExLjE1LjE2LjA4LjAwI055bG9uIHRocmVhZCMxMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNi4wOS4wMCNSZXNpbiBpbXByZWduYXRlZCB0aHJlYWQjMTEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMTAuMDAjUnViYmVyIG9yIGxhdGV4IHRocmVhZCMxMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNi4xMS4wMCNTcGFuZGV4IHRocmVhZCMxMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4wMC4wMCNZYXJucyMxMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4wMS4wMCNXb29sIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTcuMDIuMDAjQ290dG9uIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTcuMDMuMDAjUG9seWVzdGVyIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTcuMDQuMDAjQWNyeWxpYyB5YXJuIzExLjE1LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjE3LjA1LjAwI1NpbGsgeWFybiMxMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4wNi4wMCNSYW1pZSB5YXJuIzExLjE1LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjE3LjA3LjAwI0ZsYXggeWFybiMxMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4wOC4wMCNBbmltYWwgaGFpciB5YXJuIzExLjE1LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjE3LjA5LjAwI1N5bnRoZXRpYyB5YXJuIzExLjE1LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjE3LjEwLjAwI0p1dGUgeWFybiMxMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4xMS4wMCNDb2lyIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTcuMTIuMDAjUGFwZXIgeWFybiMxMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4xMy4wMCNIZW1wIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMDAuMDAuMDAjRmFicmljcyBhbmQgbGVhdGhlciBtYXRlcmlhbHMjMTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTUuMDAuMDAjU2lsayBmYWJyaWNzIzExLjE2LjAwLjAwLjAwCi11bnNwc2M3IzExLjE2LjE1LjAxLjAwI1BsYWluIHdlYXZlIHNpbGsgZmFicmljcyMxMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMS4xNi4xNS4wMi4wMCNKYWNxdWFyZCB3ZWF2ZSBzaWxrIGZhYnJpY3MjMTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTUuMDMuMDAjS25pdCBzaWxrIGZhYnJpY3MjMTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTUuMDQuMDAjU2lsayB2ZWx2ZXRzIGZhYnJpY3MjMTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTYuMDAuMDAjV29vbCBmYWJyaWNzIzExLjE2LjAwLjAwLjAwCi11bnNwc2M3IzExLjE2LjE2LjAxLjAwI1BsYWluIHdlYXZlIHdvb2wgZmFicmljcyMxMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNi4xNi4wMi4wMCNKYWNxdWFyZCB3ZWF2ZSB3b29sIGZhYnJpY3MjMTEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTYuMDMuMDAjS25pdCB3b29sIGZhYnJpY3MjMTEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDAuMDAjQ290dG9uIGZhYnJpY3MjMTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDEuMDAjUGxhaW4gd2VhdmUgY290dG9uIGZhYnJpY3MjMTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDIuMDAjVHdpbGwgd2VhdmUgY290dG9uIGZhYnJpY3MjMTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDMuMDAjQ290dG9uIG94Zm9yZCBjbG90aHMjMTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDQuMDAjS25pdCBjb3R0b24gZmFicmljcyMxMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNi4xNy4wNS4wMCNDb3R0b24gdmVsdmV0IGZhYnJpY3MjMTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDAuMDAjU3ludGhldGljIGZhYnJpY3MjMTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDEuMDAjUGxhaW4gd2VhdmUgc3ludGhldGljIGZhYnJpY3MjMTEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDIuMDAjSmFjcXVhcmQgd2VhdmUgc3ludGhldGljIGZhYnJpY3MjMTEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDMuMDAjRG9iYnkgd2VhdmUgc3ludGhldGljIGZhYnJpY3MjMTEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDQuMDAjS25pdCBzeW50aGV0aWMgZmFicmljcyMxMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xNi4xOC4wNS4wMCNTeW50aGV0aWMgdmVsdmV0IGZhYnJpY3MjMTEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTkuMDAuMDAjQXJ0aWZpY2lhbCBmYWJyaWNzIzExLjE2LjAwLjAwLjAwCi11bnNwc2M3IzExLjE2LjE5LjAxLjAwI1BsYWluIHdlYXZlIGFydGlmaWNpYWwgZmFicmljcyMxMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMS4xNi4xOS4wMi4wMCNKYWNxdWFyZCB3ZWF2ZSBhcnRpZmljaWFsIGZhYnJpY3MjMTEuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTkuMDMuMDAjRG9iYnkgd2VhdmUgYXJ0aWZpY2lhbCBmYWJyaWNzIzExLjE2LjE5LjAwLjAwCi11bnNwc2M3IzExLjE2LjE5LjA0LjAwI0tuaXQgYXJ0aWZpY2lhbCBmYWJyaWNzIzExLjE2LjE5LjAwLjAwCi11bnNwc2M3IzExLjE2LjE5LjA1LjAwI0FydGlmaWNhbCB2ZWx2ZXQgZmFicmljcyMxMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMC4wMC4wMCNGYWJyaWNzIG9mIHZlZ2V0YWJsZSBtYXRlcmlhbCBvdGhlciB0aGFuIGNvdHRvbiMxMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMC4wMS4wMCNQbGFpbiB3ZWF2ZSBub24gY290dG9uIHZlZ2V0YWJsZSBmaWJlciBmYWJyaWNzIzExLjE2LjIwLjAwLjAwCi11bnNwc2M3IzExLjE2LjIwLjAyLjAwI0tuaXQgbm9uIGNvdHRvbiB2ZWdldGFibGUgZmliZXIgZmFicmljcyMxMS4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMC4wMy4wMCNIZXNzaWFuIG9yIGhlbXAgb3IganV0ZSBjbG90aCMxMS4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wMC4wMCNTcGVjaWFsdHkgZmFicmljcyBvciBjbG90aCMxMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wMS4wMCNDaGVlc2UgY2xvdGggb3IgZmFicmljIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjAyLjAwI0Jpc21hbGVtaWRlIGZhYnJpYyBvciBjbG90aCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wMy4wMCNGaWJlcmdsYXNzIGZhYnJpYyBvciBjbG90aCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wNC4wMCNHcmFwaGl0ZSBmYWJyaWMgb3IgY2xvdGgjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMDUuMDAjR2xhc3MgZmFicmljIG9yIGNsb3RoIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjA3LjAwI1Jlc2luIGltcHJlZ25hdGVkIGZhYnJpYyBvciBjbG90aCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wOC4wMCNXaXJlIG1lc2ggZmFicmljIG9yIGNsb3RoIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjA5LjAwI0xhY2UjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTAuMDAjTmV0dGluZyMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4xMS4wMCNNZXNoIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjEyLjAwI0NvYXRlZCBmYWJyaWNzIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjEzLjAwI1VwaG9sc3RlcnkgZmFicmljcyMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4xNC4wMCNIb29rIGFuZCBsb29wIGZhYnJpY3Mgb3IgdGFwZXMjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTUuMDAjRWxhc3RpYyBicmFpZCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4xNi4wMCNCdXJsYXAgY2xvdGgjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTcuMDAjUnViYmVyIGZhYnJpY3MjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTguMDAjUGFwZXIgeWFybiBmYWJyaWMjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTkuMDAjVHJhY2luZyBjbG90aCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4yMC4wMCNCb2x0aW5nIGNsb3RoIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjIxLjAwI09ybmFtZW50YWwgdHJpbW1pbmdzIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIyLjAwLjAwI05vbndvdmVuIGZhYnJpY3MjMTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjIuMDEuMDAjU3B1bmJvbmRlZCBub253b3ZlbnMjMTEuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjIuMDIuMDAjU3B1bmxhY2VkIG5vbndvdmVucyMxMS4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMy4wMC4wMCNMZWF0aGVycyMxMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMy4wMS4wMCNDaGFtb2lzIGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDIuMDAjR29hdCBsZWF0aGVyIzExLjE2LjIzLjAwLjAwCi11bnNwc2M3IzExLjE2LjIzLjAzLjAwI1NoZWVwIGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDQuMDAjUGF0ZW50IGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDUuMDAjQ293IGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDYuMDAjUGlnIGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDcuMDAjU3ludGhldGljIG9yIGltaXRhdGlvbiBsZWF0aGVyIzExLjE2LjIzLjAwLjAwCi11bnNwc2M3IzExLjE2LjIzLjA4LjAwI0J1ZmZhbG8gbGVhdGhlciMxMS4xNi4yMy4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMy4wOS4wMCNSZXB0aWxlIGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTIuMDAuMDAuMDAuMDAjQ2hlbWljYWxzIGluY2x1ZGluZyBCaW8gQ2hlbWljYWxzIGFuZCBHYXMgTWF0ZXJpYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjAwLjAwLjAwI09yZ2FuaWMgY2hlbWljYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjE1LjAwLjAwI0FsY29ob2wjMTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTUuMDEuMDAjU2F0dXJhdGVkIG1vbm9oeWRyaWMgYWxjb2hvbCMxMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNS4wMi4wMCNJc29wcm9weWwgYWxjb2hvbCMxMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNS4wMy4wMCNVbnNhdHVyYXRlZCBtb25vaHlkcmljIGFsY29ob2wjMTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTUuMDQuMDAjQ3ljbGljIGFsY29ob2wgb3IgdGhlaXIgaGFsb2dlbmF0ZWQgb3Igc3VscGhvbmF0ZWQgb3Igbml0cmF0ZWQgZGVyaXZhdGl2ZXMjMTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTUuMDUuMDAjUGhlbm9sIGFsY29ob2wjMTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTUuMDYuMDAjSGFsb2dlbmF0ZWQgb3Igc3VscGhvbmF0ZWQgb3Igbml0cmF0ZWQgb3Igbml0cm9zYXRlZCBkZXJpdmF0aXZlcyBvZiBwaGVub2xzIzEyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE1LjA3LjAwI01ldGh5bGF0ZWQgc3Bpcml0IzEyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjAwLjAwI0V0aGVycyBhbmQgYWxjb2hvbCBwZXJveGlkZXMgYW5kIGV0aGVyIHBlcm94aWRlcyBhbmQgb3RoZXIgb3JnYW5pYyBjb21wb3VuZHMjMTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMDEuMDAjQWN5Y2xpYyBldGhlcnMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMDIuMDAjQ3ljbG9uaWMgb3IgY3ljbGVuaWMgb3IgY3ljbG90ZXJwZW5pYyBldGhlcnMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMDMuMDAjRXRoZXIgb3IgYXJvbWF0aWMgZXRoZXIjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMDQuMDAjRXRoZXIgYWxjb2hvbCMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4wNS4wMCNFdGhlciBwaGVub2xzIG9yIGV0aGVyIGFsY29ob2wgcGhlbm9scyMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4wNi4wMCNBbGNvaG9sIHBlcm94aWRlcyMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4wNy4wMCNPeGlyYW5lIG9yIGV0aHlsZW5lIG94aWRlIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjA4LjAwI0VwaWNobG9yb2h5ZHJpbiBvciAxIGNobG9ybyAyIG9yIDMgZXBveHlwcm9wYW5lIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjA5LjAwI0Vwb3hpZGVzIG9yIGVwb3h5YWxjb2hvbHMgb3IgZXBveHlwaGVub2xzIG9yIGVwb3h5ZXRoZXJzIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjEwLjAwI0FjZXRhbHMgb3Iga2VtaWFjZXRhbHMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMTEuMDAjQWN5Y2xpYyBhbGRlaHlkZXMgd2l0aG91dCBvdGhlciBveHlnZW4gZnVuY3Rpb24jMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMTIuMDAjQ3ljbGljIGFsZGVoeWRlcyB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4xMy4wMCNBbGNvaG9sIGFsZGVoeWRlIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjE0LjAwI1BhcmFmb3JtYWxkZWh5ZGUjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMTUuMDAjQWxkZWh5ZGVzIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjE2LjAwI0FjeWNsaWMga2V0b25lcyB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4xNy4wMCNDeWNsb25pYyBvciBjeWNsZW5pYyBvciBjeWNsb3RlcnBlbmljIGtldG9uZXMgd2l0aG91dCBvdGhlciBveHlnZW4gZnVuY3Rpb24jMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMTguMDAjS2V0b25lcyBvciBhcm9tYXRpYyB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4xOS4wMCNLZXRvbmUgYWxjb2hvbCBvciBrZXRvbmUgYWxkZWh5ZGVzIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjIwLjAwI0tldG9uZSBwaGVub2xzIG9yIGtldG9uZXMgd2l0aCBvdGhlciBveHlnZW4gZnVuY3Rpb24jMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMjEuMDAjUXVpbm9uZXMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMjIuMDAjUmVubmV0IHRhYmxldHMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMjMuMDAjRW56eW1lcyMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNy4wMC4wMCNNb25vY2FyYm94eWxpYyBmYXR0eSBhY2lkcyBvciBpbmR1c3RyaWFsIGFjaWQgb2lscyBmcm9tIHJlZmluaW5nIzEyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjE3LjAxLjAwI09sZWljIGFjaWQjMTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTcuMDIuMDAjSW5kdXN0cmlhbCBmYXR0eSBhbGNvaG9scyMxMi4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNy4wMy4wMCNTdGVhcmljIGFjaWQjMTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTcuMDQuMDAjVGFsbCBvaWwgZmF0dHkgYWNpZHMjMTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTcuMDUuMDAjQWNpZCBvaWxzIGZyb20gcmVmaW5pbmcjMTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDAuMDAjQ2FyYm94eWxpYyBhY2lkcyBhbmQgdGhlaXIgYW5oeWRyaWRlcyBhbmQgaGFsaWRlcyBhbmQgcGVyb3hpZGVzIGFuZCBwZXJveHlhY2lkcyMxMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4wMS4wMCNGb3JtaWMgYWNpZCBvciBpdHMgc2FsdHMgb3IgZXN0ZXJzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjAyLjAwI0FjZXRpYyBhY2lkIG9yIGl0cyBzYWx0cyBvciAgYWNldGljIGFuaHlkcmlkZSMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4wMy4wMCNFc3RlcnMgb2YgYWNldGljIGFjaWQjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDQuMDAjTW9ubyBvciBkaSB0cmljaGxvcmFjZXRpYyBhY2lkIG9yIHRoZWlyIHNhbHRzIG9yIGVzdGVycyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4wNS4wMCNQcm9waW9uaWMgYWNpZCBvciBpdHMgc2FsdHMgb3IgZXN0ZXJzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjA2LjAwI0J1dHlyaWMgYWNpZHMgb3IgdmFsZXJpYyBhY2lkcyBvciB0aGVpciBzYWx0cyBvciBlc3RlcnMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDcuMDAjUGFsbWl0aWMgYWNpZHMgb3Igc3RlYXJpYyBhY2lkcyBvciB0aGVpciBzYWx0cyBvciBlc3RlcnMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDguMDAjU2F0dXJhdGVkIGFjcnlsaWMgbW9ub2NhcmJveHlsaWMgYWNpZHMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDkuMDAjVW5zYXR1cmF0ZWQgYWN5Y2xpYyBtb25vY2FyYm94eWxpYyBhY2lkcyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xMC4wMCNDeWNsb25pYyBvciBjeWNsZW5pYyBvciBjeWNsb3RlcnBlbmljIG1vbm9jYXJib3h5bGljIGFjaWRzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjExLjAwI0Fyb21hdGljIG1vbm9jYXJib3h5bGljIGFjaWRzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjEyLjAwI0FjeWNsaWMgcG9seWNhcmJveHlsaWMgYWNpZHMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMTMuMDAjQ3ljbG9uaWMgb3IgY3ljbGVuaWMgb3IgY3ljbG90ZXJwZW5pYyBwb2x5Y2FyYm94eWxpYyBhY2lkcyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xNC4wMCNBcm9tYXRpYyBwb2x5Y2FyYm94eWxpYyBhY2lkcyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xNS4wMCNMYWN0aWMgYWNpZCBvciBpdHMgc2FsdHMgb3IgZXN0ZXJzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjE2LjAwI1RhcnRhcmljIGFjaWQgb3IgaXRzIHNhbHRzIG9yIGVzdGVycyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xNy4wMCNBdHJpYyBhY2lkIG9yIHRzIHNhbHRzIG9yIGVzdGVycyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xOC4wMCNHbHVjYXJpYyBhY2lkIG9yIGl0cyBzYWx0cyBvciBlc3RlcnMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMTkuMDAjUGhlbnlsZ2x5b2NvbGljIGFjaWQgb3IgbWFuZGVsaWMgYWNpZCBvciBpdHMgc2FsdHMgb3IgZXN0ZXJzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjIwLjAwI0NhcmJveHlsaWMgYWNpZHMgd2l0aCBhbGNvaG9sIGZ1bmN0aW9uIGJ1dCB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4yMS4wMCNDYXJib3h5bGljIGFjaWRzIHdpdGggcGhlbm9sIGZ1bmN0aW9uIGJ1dCB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4yMi4wMCNDYXJib3h5bGljIGFjaWRzIHdpdGggYWxkZWh5ZGUgb3Iga2V0b25lIGZ1bmN0aW9uIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE5LjAwLjAwI0FtaW5lIGFuZCBveHlnZW4gZnVuY3Rpb24gYW1pbm8gY29tcG91bmRzIGFuZCB1cmVpbmVzIzEyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjE5LjAxLjAwI0dsdXRhbWljIGFjaWQgb3IgaXRzIHNhbHRzIzEyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzEyLjEwLjIwLjAwLjAwI09yZ2FubyBzdWxmdXIgY29tcG91bmRzIGFuZCBvdGhlciBvcmdhbm8gaW5vcmdhbmljIGNvbXBvdW5kcyMxMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wMS4wMCNPcmdhbm8gc3VsZnVyIGNvbXBvdW5kcyMxMi4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wMi4wMCNPdGhlciBvcmdhbm8gaW5vcmdhbmljIGNvbXBvdW5kcyMxMi4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wMy4wMCNDb21wb3VuZHMgY29udGFpbmluZyBhbiB1bmZ1c2VkIGZ1cmFuIHJpbmcgaW4gdGhlIHN0cnVjdHVyZSMxMi4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wNC4wMCNMYWN0aW5lcyMxMi4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wNS4wMCNDb21wb3VuZHMgY29udGFpbmluZyBhbiB1bmZ1c2VkIGltaWRhem9sZSByaW5nIGluIHRoZSBzdHJ1Y3R1cmUjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjAuMDYuMDAjQ29tcG91bmRzIGNvbnRhaW5pbmcgYW4gdW5mdXNlZCBweXJpZGluZSByaW5nIGluIHRoZSBzdHJ1Y3R1cmUjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjAuMDcuMDAjQ29tcG91bmRzIGNvbnRhaW5pbmcgYSBxdWlub2xpbmUgb3IgaXNvcXVpbm9saW5lIHJpbmcgc3lzdGVtIzEyLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjIwLjA4LjAwI0xhY3RhbXMjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjAuMDkuMDAjSGV0ZXJvY3ljbGljIGNvbXBvdW5kcyB3aXRoIG5pdHJvZ2VuIGhldGVybyBhdG9tIG9ubHkjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjAuMTAuMDAjQ29tcG91bmRzIGNvbnRhaW5pbmcgYW4gdW5mdXNlZCB0aGlhem9sZSByaW5nIGluIHRoZSBzdHJ1Y3R1cmUjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDAuMDAjSHlkcm9jYXJib25zIGFuZCB0aGVpciBoYWxvZ2VuYXRlZCBhbmQgc3VscGhvbmF0ZWQgYW5kIG5pdHJvc2F0ZWQgZGVyaXZhdGl2ZXMjMTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDEuMDAjU2F0dXJhdGVkIGFjeWNsaWMgaHlkcm9jYXJib25zIzEyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEyLjEwLjIxLjAyLjAwI1Vuc2F0dXJhdGVkIGFjeWNsaWMgaHlkcm9jYXJib25zIzEyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEyLjEwLjIxLjAzLjAwI0N5Y2xpYyBoeWRyb2NhcmJvbnMjMTIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDQuMDAjSGFsb2dlbnRhdGVkIGRlcml2YXRpdmVzIG9mIGh5ZHJvY2FyYm9ucyMxMi4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMS4wNS4wMCNSZWZyaWdlcmFudHMjMTIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDYuMDAjU3VscGhvbmF0ZWQgb3Igbml0cmF0ZWQgb3Igbml0cm9zYXRlZCBkZXJpdmF0aXZlcyBvZiBoeWRyb2NhcmJvbnMjMTIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDcuMDAjUGFyYWZmaW4jMTIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjIuMDAuMDAjUGhvc3Bob3JpYyBlc3RlcnMgYW5kIHRoZWlyIHNhbHRzIGFuZCBlc3RlcnMgb2Ygb3RoZXIgb3JnYW5pYyBhY2lkcyMxMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMi4wMS4wMCNQaG9zcGhvcmljIGVzdGVycyBvciB0aGVpciBzYWx0cyMxMi4xMC4yMi4wMC4wMAotdW5zcHNjNyMxMi4xMS4wMC4wMC4wMCNJbm9yZ2FuaWMgY2hlbWljYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjAwLjAwI0NoZW1pY2FsIGVsZW1lbnRzIzEyLjExLjAwLjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjAxLjAwI0NobG9yaW5lIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjAyLjAwI0ZsdW9yaW5lIG9yIGJyb21pbmUjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMDMuMDAjQ2hsb3JpbmUgbGlxdWlkIGdhcyMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4wNC4wMCNTdWJsaW1lcyBvciBwcmVjaXBpdGF0ZWQgc3VscGh1ciBvciBjb2xsb2lkYWwgc3VscGh1ciMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4wNS4wMCNCb3JvbiBvciB0ZWxsdXJpdW0jMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMDYuMDAjU2lsaWNvbiMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4wNy4wMCNBbGthbGkgbWV0YWxzIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjA4LjAwI0Fsa2FsaW5lIGVhcnRoIG1ldGFscyMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4wOS4wMCNNZXJjdXJ5IzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjEwLjAwI0h5ZHJvZ2VuIGNobG9yaWRlIG9yIGh5ZHJvY2hsb3JpYyBhY2lkIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjExLjAwI0NobG9yb3N1bGZ1cmljIGFjaWQjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMTIuMDAjU3VscGh1cmljIGFjaWQjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMTMuMDAjUGhvc3Bob3J1cyBwZW50YW94aWRlIG9yIHBob3NwaG9yaWMgYWNpZCBvciBwb2x5cGhvc3Bob3JpYyBhY2lkcyMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4xNC4wMCNPeGlkZXMgb2YgYm9yb24gb3IgYm9yaWMgYWNpZHMjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMTUuMDAjSHlkcm9nZW4gZmx1b3JpZGUgb3IgaHlkcm9mbHVvcmljIGFjaWQjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMTYuMDAjU2lsaWNvbiBkaW94aWRlIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjE3LjAwI1N1bHBodXIgZGlveGlkZSMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4xOC4wMCNIeWRyb2N5YW5pYyBhY2lkIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjE5LjAwI0hhbGlkZXMgb3IgaGFsaWRlIG94aWRlcyBvZiBub24gbWV0YWxzIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjIwLjAwI1N1bHBoaWRlcyBvZiBub24gbWV0YWxzIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjIxLjAwI1NvZGl1bSBvciBwb3Rhc3NpdW0gaHlkcm94aWRlIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjIyLjAwI0h5ZHJveGlkZSBvciBwZXJveGlkZSBvZiBtYWduZXNpdW0gb3Igb3hpZGVzIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjIzLjAwI0FsdW1pbnVtIGh5ZHJveGlkZSMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4yNC4wMCNIeWRyb3hpZGUgb3IgaHlkcm94eWxhbWluZSBvciB0aGVpciBpbm9yZ2FuaWMgc2FsdHMjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMDAuMDAjTWV0YWwgb3hpZGVzIGFuZCBoeWRyb3hpZGVzIGFuZCBwZXJveGlkZXMjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMDEuMDAjWmluYyBveGlkZSBvciB6aW5jIHBlcm94aWRlIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjAyLjAwI0Nocm9taXVtIG94aWRlcyBvciBoeWRyb3hpZGVzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjAzLjAwI01hbmdhbmVzZSBveGlkZXMjMTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMDQuMDAjSXJvbiBveGlkZXMgb3IgaHlkcm94aWRlcyBvciBlYXJ0aCBjb2xvdXJzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjA1LjAwI0NvYmFsdCBveGlkZXMgb3IgaHlkcm94aWRlcyBvciBjb21tZXJjaWFsIGNvYmFsdCBveGlkZXMjMTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMDYuMDAjVGl0YW5pdW0gb3hpZGVzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjA3LjAwI0xlYWQgb3hpZGVzIG9yIHJlZCBsZWFkIG9yIG9yYW5nZSBsZWFkIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjA4LjAwI0xpdGhpdW0gb3hpZGUgb3IgaHlkcm94aWRlIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjA5LjAwI1ZhbmFkaXVtIG94aWRlcyBvciBoeWRyb3hpZGVzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjEwLjAwI05pY2tlbCBveGlkZXMgb3IgaHlkcm94aWRlcyMxMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNy4xMS4wMCNDb3BwZXIgb3hpZGVzIG9yIGh5ZHJveGlkZXMjMTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMTIuMDAjR2VybWFuaXVtIG94aWRlcyBvciB6aXJjb25pdW0gZGlveGlkZSMxMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNy4xMy4wMCNNb2x5YmRlbnVtIG94aWRlcyBvciBoeWRyb3hpZGVzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjE0LjAwI0FudGltb255IG94aWRlcyMxMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wMC4wMCNTYWx0cyBvZiBveG9tZXRhbGxpYyBhbmQgcGVyb3hvbWV0YWxsaWMgYWNpZHMgYW5kIG90aGVyIGlub3JnYW5pYyBhY2lkcyMxMi4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wMS4wMCNBbHVtaW5hdGVzIzEyLjExLjE4LjAwLjAwCi11bnNwc2M3IzEyLjExLjE4LjAyLjAwI1ppbmMgb3IgbGVhZCBjaHJvbWF0ZSMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wMy4wMCNTb2RpdW0gZGljaHJvbWF0ZSMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wNC4wMCNQb3Rhc3NpdW0gZGljaHJvbWF0ZSMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wNS4wMCNPdGhlciBjaHJvbWF0ZSBvciBkaWNocm9tYXRlIG9yIHBlcm94b2Nocm9tYXRlcyMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wNi4wMCNNYW5nYW5pdGVzIG9yIG1hbmdhbmF0ZXMgb3IgcGVybWFuZ2FuYXRlcyMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wNy4wMCNNb2x5YmRhdGVzIzEyLjExLjE4LjAwLjAwCi11bnNwc2M3IzEyLjExLjE4LjA4LjAwI1R1bmdzdGF0ZXMgb3Igd29sZnJhbWF0ZXMjMTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTguMDkuMDAjU2lsdmVyIGNvbXBvdW5kcyMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4xMC4wMCNHb2xkIGNvbXBvdW5kcyMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4xMS4wMCNPdGhlciBjb21wb3VuZHMgb3IgYW1hbGdhbXMjMTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTguMTIuMDAjQW1hbGdhbXMgb3RoZXIgdGhhbiBhbWFsZ2FtcyBvZiBwcmVjaW91cyBtZXRhbHMjMTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDAuMDAjU2FsdHMgYW5kIHBlcm94eXNhbHRzIG9mIGlub3JnYW5pYyBhY2lkcyBhbmQgbWV0YWwjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDEuMDAjRmx1b3JpZGVzIG9yIGZsdW9yb3NpbGljYXRlcyBvciBmbHVvcm9hbHVtaW5hdGVzIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjAyLjAwI0NobG9yaWRlcyMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4wMy4wMCNTb2RpdW0gY2hsb3JpZGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDQuMDAjU2FsIGFtbW9uaWFjIGJsb2NrcyMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4wNS4wMCNQb3Rhc3NpdW0gaW9kaW5hdGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDYuMDAjU3VscGhpZGVzIG9yIHBvbHlzdWxmaWRlcyBvciBkaXRoaW9uaXRlcyBvciAgc3VsZm94eWxhdGVzIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjA3LjAwI1N1bHBoaXRlcyBvciB0aGlvc3VsZmF0ZXMjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDguMDAjQWx1bWludW0gc3VscGhhdGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDkuMDAjQ29sbG9pZGFsIHByZWNpb3VzIG1ldGFscyMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4xMC4wMCNGZXJyb3VzIHN1bHBoYXRlIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjExLjAwI1NpbHZlciBuaXRyYXRlIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjEyLjAwI1NvZGl1bSBkaWh5ZHJvZ2Vybm9ydGhvcGhvc3BoYXRlIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjEzLjAwI1NvZGl1bSBwaG9zcGhhdGUgZGliYXNpYyMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4xNC4wMCNTb2RpdW0gYmljYXJib25hdGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMTUuMDAjVHJpIHNvZGl1bSBjaXRyYXRlIGRpIGh5ZHJhdGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMTYuMDAjU29kaXVtIGNhcmJvbmF0ZSMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4xNy4wMCNNZXRhbGxpYyBzb2RpdW0jMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMTguMDAjU29kaXVtIHNpbGljYXRlIGxpcXVpZHMjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMTkuMDAjU29kaXVtIHNpbGljYXRlIGJpbmRlcnMjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjAuMDAuMDAjSHlkcm9nZW4gcGVyb3hpZGUgYW5kIGh5ZHJpZGVzIGFuZCBuaXRyaWRlcyBhbmQgYXNpZGVzIGFuZCBzaWxpY2lkZXMgYW5kIGJvcmlkZXMjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjAuMDEuMDAjSHlkcm9nZW4gcGVyb3hpZGUjMTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjAuMDIuMDAjUGhvc3BoaWRlcyMxMi4xMS4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMC4wMy4wMCNDYXJiaWRlcyMxMi4xMS4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMC4wNC4wMCNDYWxjaXVtIGNhcmJpZGUjMTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjAuMDUuMDAjQnJvbWlkZXMjMTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDAuMDAjSXNvdG9wZXMgYW5kIHRoZWlyIGNvbXBvdW5kcyBpbm9yZ2FuaWMgYW5kIG9yZ2FuaWMjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDEuMDAjRGV1dGVyaXVtIzEyLjExLjIxLjAwLjAwCi11bnNwc2M3IzEyLjExLjIxLjAyLjAwI0RldXRlcmF0ZWQgc29sdmVudHMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDMuMDAjSGVhdnkgd2F0ZXIjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDQuMDAjQWxwaGEgc291cmNlcyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4wNS4wMCNCZXRhIHNvdXJjZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDYuMDAjQ29iYWx0IHNvdXJjZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDcuMDAjR2FtbWEgc291cmNlcyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4wOC4wMCNOZXV0cm9uIHNvdXJjZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDkuMDAjUmFkaW9pc290b3BlIHNvdXJjZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMTAuMDAjQ2FsaWJyYXRpb24gc291cmNlcyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4xMS4wMCNJbiB2aXZvIHByb2R1Y3RzIzEyLjExLjIxLjAwLjAwCi11bnNwc2M3IzEyLjExLjIxLjEyLjAwI1JhZGlvY2hlbWljYWwgaXNvdG9wZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMTMuMDAjUmFkaW9ncmFwaGljIHNvdXJjZSMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4xNC4wMCNSYWRpb2ltbXVub2Fzc2F5IGlzb3RvcGVzIzEyLjExLjIxLjAwLjAwCi11bnNwc2M3IzEyLjExLjIxLjE1LjAwI1RyaXRpdW0gdGFyZ2V0cyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4xNi4wMCNFeGNpdGF0aW9uIHNvdXJjZSBvciBhbm51bGFyIzEyLjExLjIxLjAwLjAwCi11bnNwc2M3IzEyLjExLjIxLjE3LjAwI1JhZGlvcGhhcm1hY2V1dGljYWwgY29tcG91bmRzIGZvciBsYWJlbGxpbmcjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMTguMDAjQ2hlbWljYWxzIGxhYmVsbGVkIEMxNCMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4xOS4wMCNGaXNzaW9uYWJsZSBpc290b3BlcyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4yMC4wMCNJbiB2aXZvIHJhZGlvYWN0aXZlIGlzb3RvcGUgcHJvZHVjdHMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjIuMDAuMDAjQ3lhbmlkZXMjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjIuMDEuMDAjQ3lhbmlkZXMgb3IgY3lhbmlkZSBveGlkZXMgb2Ygc29kaXVtIzEyLjExLjIyLjAwLjAwCi11bnNwc2M3IzEyLjExLjIyLjAyLjAwI0NvbXBsZXggY3lhbmlkZXMgb3IgdGhpb2N5YW5hdGVzIzEyLjExLjIyLjAwLjAwCi11bnNwc2M3IzEyLjExLjIyLjAzLjAwI0N5YW5pZGVzIG9yIGN5YW5pZGUgb3hpZGVzIzEyLjExLjIyLjAwLjAwCi11bnNwc2M3IzEyLjEyLjAwLjAwLjAwI0dhc2VzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEyLjE1LjAwLjAwI0luZHVzdHJpYWwgZ2FzZXMjMTIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTUuMDEuMDAjTml0cm91cyBveGlkZSBnYXMjMTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTUuMDIuMDAjSGVsaXVtIGdhcyMxMi4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNS4wNC4wMCNDYXJib24gbW9ub3hpZGUjMTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTUuMDUuMDAjSHlkcm9nZW4gZ2FzIzEyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE1LjA2LjAwI0NhcmJvbiBkaW94aWRlIzEyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE1LjA3LjAwI05pdHJvZ2VuIGdhcyMxMi4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNS4wOC4wMCNOZW9uIGdhcyMxMi4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNS4xMC4wMCNPeHlnZW4jMTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTYuMDAuMDAjUmFyZSBnYXNlcyMxMi4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNi4wMS4wMCNYZW5vbiBnYXMjMTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTYuMDIuMDAjUmFkb24gZ2FzIzEyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE2LjAzLjAwI0tyeXB0b24gZ2FzIzEyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE2LjA0LjAwI0FyZ29uIGdhcyMxMi4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNi4wOS4wMCNYZW5vbiBnYXMjMTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTYuMTAuMDAjUmFkb24gZ2FzIzEyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE2LjExLjAwI0tyeXB0b24gZ2FzIzEyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE2LjEyLjAwI0FyZ29uIGdhcyMxMi4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMy4wMC4wMC4wMCNFeHBsb3NpdmUgbWF0ZXJpYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEzLjE1LjAwLjAwI0V4cGxvc2l2ZXMjMTIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTUuMDEuMDAjRHluYW1pdGUjMTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTUuMDIuMDAjRXhwbG9zaXZlIGNhcnRyaWRnZXMjMTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTUuMDMuMDAjUHJvcGVsbGFudCBleHBsb3NpdmVzIzEyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE1LjA0LjAwI0V4cGxvc2l2ZSBjaGFyZ2VzIzEyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE1LjA1LjAwI1BsYXN0aWMgZXhwbG9zaXZlcyMxMi4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMy4xNS4wNi4wMCNBbHVtaW5pemVkIGV4cGxvc2l2ZXMjMTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTUuMDcuMDAjQW1tb25pdW0gbml0cmF0ZSBleHBsb3NpdmVzIzEyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE1LjA4LjAwI05pdHJvZ2x5Y2VyaW4gcG93ZGVyIGV4cGxvc2l2ZXMjMTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTYuMDAuMDAjUHlyb3RlY2huaWNzIzEyLjEzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEzLjE2LjAxLjAwI0ZpcmV3b3JrcyMxMi4xMy4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMy4xNi4wMi4wMCNGb2cgc2lnbmFscyMxMi4xMy4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMy4xNi4wMy4wMCNSYWluIHJvY2tldHMjMTIuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTYuMDQuMDAjRmxhcmVzIzEyLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE2LjA1LjAwI1B5cm90ZWNobmljIG1hdGVyaWFscyBmb3IgdGhlYXRlciBvciB0ZWxldmlzaW9uIzEyLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjAwLjAwI0lnbml0ZXJzIzEyLjEzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjAxLjAwI0JsYXN0aW5nIGNhcHMjMTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTcuMDIuMDAjRGV0b25hdG9ycyMxMi4xMy4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMy4xNy4wMy4wMCNFeHBsb3NpdmVzIGZ1c2VzIzEyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjA0LjAwI0V4cGxvc2l2ZSBpbml0aWF0b3JzIzEyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjA1LjAwI0V4cGxvc2l2ZSBwcmltZXJzIzEyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjA2LjAwI01hdGNoZXMjMTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTcuMDcuMDAjTGlnaHRlcnMjMTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTguMDAuMDAjUHJvcGVsbGFudHMjMTIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTguMDEuMDAjUG93ZGVyIHByb3BlbGxhbnRzIzEyLjEzLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE4LjAyLjAwI1NvbGlkIHByb3BlbGxhbnRzIzEyLjEzLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE4LjAzLjAwI0d1biBwcm9wZWxsYW50cyMxMi4xMy4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMy4xOC4wNC4wMCNIaWdoIGVuZXJneSBwcm9wZWxsYW50cyMxMi4xMy4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMy4xOC4wNS4wMCNHZWxsZWQgcHJvcGVsbGFudHMjMTIuMTMuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTguMDYuMDAjSHlicmlkIHByb3BlbGxhbnRzIzEyLjEzLjE4LjAwLjAwCi11bnNwc2M3IzEyLjE0LjAwLjAwLjAwI0VsZW1lbnRzIGFuZCBnYXNlcyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNS4wMC4wMCNFYXJ0aCBtZXRhbHMjMTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTUuMDEuMDAjQmVyeWxsaXVtIChCZSkjMTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTUuMDIuMDAjTWFnbmVzaXVtIChNZykjMTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTUuMDMuMDAjQ2FsY2l1bSAoQ2EpIzEyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE1LjA0LjAwI1N0cm9udGl1bSAoU3IpIzEyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE1LjA1LjAwI0Jhcml1bSAoQmEpIzEyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE1LjA2LjAwI1JhZGl1bSAoUmEpIzEyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjAwLjAwI1JhcmUgZWFydGggbWV0YWxzIzEyLjE0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjAxLjAwI0Nlcml1bSAoQ2UpIzEyLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjAyLjAwI0R5c3Byb3NpdW0gKER5KSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4wMy4wMCNFcmJpdW0gKEVyKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4wNC4wMCNFdXJvcGl1bSAoRXUpIzEyLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjA1LjAwI0dhZG9saW5pdW0gKEdkKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4wNi4wMCNIb2xtaXVtIChIbykjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMDcuMDAjTGFudGhhbnVtIChMYSkjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMDguMDAjTHV0ZXRpdW0gKEx1KSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4wOS4wMCNOZW9keW1pdW0gKE5kKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4xMC4wMCNQcmFzZW9keW1pdW0gKFByKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4xMS4wMCNQcm9tZXRoaXVtIChQcikjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMTIuMDAjU2FtYXJpdW0gKFNtKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4xMy4wMCNTY2FuZGl1bSAoU2MpIzEyLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjE0LjAwI1RlcmJpdW0gKFRiKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4xNS4wMCNUaHVsaXVtIChUbSkjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMTYuMDAjWXR0ZXJiaXVtIChZYikjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMTcuMDAjWXR0cml1bSAoWSkjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMDAuMDAjVHJhbnNpdGlvbiBtZXRhbHMjMTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMDEuMDAjQWN0aW5pdW0gKEFjKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4wMi4wMCNBbHVtaW51bSAoQWwpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjAzLjAwI0FtZXJpY2l1bSAoQW0pIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjA0LjAwI0FudGltb255IChTYikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMDUuMDAjQmVya2VsaXVtIChCaykjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMDYuMDAjQmlzbXV0aCAoQmkpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjA3LjAwI0NhZG1pdW0gKENhKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4wOC4wMCNDYWxpZm9ybml1bSAoQ2YpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjA5LjAwI0Nocm9taXVtIChDcikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTAuMDAjQ29iYWx0IChDbykjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTEuMDAjQ29wcGVyIChDdSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTIuMDAjQ3VyaXVtIChDbSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTMuMDAjRWluc3RlaW5pdW0gKEVzKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4xNC4wMCNGZXJtaXVtIChGbSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTUuMDAjR2FsbGl1bSAoR2EpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjE2LjAwI0dlcm1hbml1bSAoR2UpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjE3LjAwI0dvbGQgKEF1KSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4xOC4wMCNIYWZuaXVtIChIZikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTkuMDAjSW5kaXVtIChJbikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMjAuMDAjSXJpZGl1bSAoSXIpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjIxLjAwI0lyb24gKEZlKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4yMi4wMCNMYXdyZW5jaXVtIChMcikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMjMuMDAjTGVhZCAoUGIpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjI0LjAwI01hbmdhbmVzZSAoTW4pIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjI1LjAwI01lbmRlbGV2aXVtIChNZCkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMjYuMDAjTWVyY3VyeSAoSGcpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjI3LjAwI01vbHliZGVudW0gKE1vKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4yOC4wMCNOZXB0dW5pdW0gKE5wKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4yOS4wMCNOaWNrZWwgKE5pKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zMC4wMCNOaW9iaXVtIChOYikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMzEuMDAjTm9iZWxpdW0gKE5vKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zMi4wMCNPc21pdW0gKE9zKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zMy4wMCNQYWxsYWRpdW0gKFBkKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zNC4wMCNQbGF0aW51bSAoUHQpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjM1LjAwI1BsdXRvbml1bSAoUHUpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjM2LjAwI1Byb3RhY3Rpbml1bSAoUGEpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjM3LjAwI1JoZW5pdW0gKFJlKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zOC4wMCNSaG9kaXVtIChSaCkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMzkuMDAjUnV0aGVuaXVtIChSdSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDAuMDAjU2lsdmVyIChBZykjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDEuMDAjVGFudGFsdW0gKFRhKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy40Mi4wMCNUZWNobmV0aXVtIChUZSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDMuMDAjVGhhbGxpdW0gKFRsKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy40NC4wMCNUaG9yaXVtIChUaCkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDUuMDAjVGluIChTbikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDYuMDAjVGl0YW5pdW0gKFRpKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy40Ny4wMCNUdW5nc3RlbiAoVykjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDguMDAjVXJhbml1bSAoVSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDkuMDAjVmFuYWRpdW0gKFYpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjUwLjAwI1ppbmMgKFpuKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy41MS4wMCNaaXJjb25pdW0gKFpyKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy41Mi4wMCNCb2hyaXVtIChCaCkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNTMuMDAjRHVibml1bSAoRGIpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjU0LjAwI0hhc3NpdW0gKEhzKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy41NS4wMCNSdXRoZXJmb3JkaXVtIChSZikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNTYuMDAjU2VhYm9yZ2l1bSAoU2cpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjU3LjAwI1VudW5uaWxpdW0gKFV1bSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNTguMDAjVW51bnVuaXVtIChVdXUpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjU5LjAwI1VudW5iaXVtIChVdWIpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjYwLjAwI1BvbG9uaXVtICgoUG8pIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE4LjAwLjAwI0Fsa2FsaSBtZXRhbHMjMTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTguMDEuMDAjQ2VzaXVtIChDcykjMTIuMTQuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTguMDIuMDAjRnJhbmNpdW0gKEZtKSMxMi4xNC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOC4wMy4wMCNMaXRoaXVtIChMaSkjMTIuMTQuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTguMDQuMDAjUG90YXNzaXVtIChLKSMxMi4xNC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOC4wNS4wMCNSdWJpZGl1bSAoUmIpIzEyLjE0LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE4LjA2LjAwI1NvZGl1bSAoTmEpIzEyLjE0LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjAwLjAwI05vbiBtZXRhbHMgYW5kIHB1cmUgYW5kIGVsZW1lbnRhbCBnYXNlcyMxMi4xNC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4wMS4wMCNDaGxvcmluZSAgKENsKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4wMi4wMCNIeWRyb2dlbiAoSCkjMTIuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTkuMDMuMDAjTml0cm9nZW4gIChOKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4wNC4wMCNPeHlnZW4gKE8pIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjA1LjAwI0ZsdW9yaW5lICAoRikjMTIuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTkuMDYuMDAjQXJzZW5pYyAoQXMpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjA3LjAwI0Jvcm9uIChCaCkjMTIuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTkuMDguMDAjQ2FyYm9uIChDKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4wOS4wMCNQaG9zcGhvcnVzIChQKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4xMC4wMCNTZWxlbml1bSAoU2UpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjExLjAwI1NpbGljb24gKFNpKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4xMi4wMCNTdWxmdXIgKFMpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjEzLjAwI1RlbGx1cml1bSAoVGUpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjE0LjAwI0FzdGF0aW5lIChBdCkjMTIuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTkuMTUuMDAjQnJvbWluZSBCciMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4xNi4wMCNJb2RpbmUgKEkpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjIwLjAwLjAwI05vYmxlIGdhc2VzIzEyLjE0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIwLjAxLjAwI1hlbm9uIGdhcyAgKFhlKSMxMi4xNC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4yMC4wMi4wMCNSYWRvbiBnYXMgKFJuKSMxMi4xNC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4yMC4wMy4wMCNLcnlwdG9uIGdhcyAoS3IpIzEyLjE0LjIwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIwLjA0LjAwI0FyZ29uIGdhcyAoQXIpIzEyLjE0LjIwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIwLjA1LjAwI0hlbGl1bSBnYXMgKEhlKSMxMi4xNC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4yMC4wNi4wMCNOZW9uIGdhcyAoTmUpIzEyLjE0LjIwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjAwLjAwI0luZHVzdHJpYWwgdXNlIGdhc2VzIzEyLjE0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjAxLjAwI0h5ZHJvZ2VuIGNvbXBvdW5kIGdhc2VzIzEyLjE0LjIxLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjAyLjAwI0NobG9yaW5hdGVkIG1peGVkIGdhc2VzIzEyLjE0LjIxLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjAzLjAwI0FtbW9uaWEjMTIuMTQuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMjEuMDQuMDAjQ2FyYm9uIGRpb3hpZGUgZ2FzIChDTzIpIzEyLjE0LjIxLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjA1LjAwI0luZHVzdHJpYWwgYWlyIzEyLjE0LjIxLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjA2LjAwI0luZXJ0IGdhcyBtaXh0dXJlcyMxMi4xNC4yMS4wMC4wMAotdW5zcHNjNyMxMi4xNS4wMC4wMC4wMCNBY2lkcyBhbmQgdGhlaXIgc2FsdHMgYW5kIGVzdGVycyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wMC4wMCNDYXJib3h5bGljIGFjaWRzIGFuZCB0aGVpciBzYWx0cyBhbmQgZXN0ZXJzIzEyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjAxLjAwI0FjZXRpYyBhY2lkIG9yIGl0cyBzYWx0cyMxMi4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wMi4wMCNBY3ljbGljIGFjaWRzIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjAzLjAwI0FsZGVoeWRpYyBhY2lkcyMxMi4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wNC4wMCNCdXR5cmljIGFjaWRzIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjA1LjAwI0NhcmJvY3lsaWMgYWNpZHMjMTIuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTUuMDYuMDAjSHlkcm94eSBhY2lkcyMxMi4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wNy4wMCNLZXRvIGFjaWRzIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjA4LjAwI1Byb3Bpb25pYyBhY2lkcyMxMi4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wOS4wMCNBY3J5bGljIGFjaWQgZXN0ZXJzIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjEwLjAwI0VzdGVycyBvZiBtZXRoYWNyeWxpYyBhY2lkIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE2LjAwLjAwI0hldGVyb2N5Y2xpYyBhY2lkcyBhbmQgdGhlaXIgc2FsdHMgYW5kIGVzdGVycyMxMi4xNS4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNi4wMS4wMCNJbmRvbGVhY2V0aWMgYWNpZHMjMTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTYuMDIuMDAjSXNvbmljb3RpbmljIGFjaWRzIzEyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE2LjAzLjAwI0lzb25pcGVjb3RpYyBhY2lkcyMxMi4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNi4wNC4wMCNOaWNvdGluaWMgYWNpZHMjMTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTYuMDUuMDAjTmlwZWNvdGljIGFjaWRzIzEyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE2LjA2LjAwI09yb3RpYyBhY2lkcyMxMi4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNi4wNy4wMCNQaWNvbGluaWMgYWNpZHMjMTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTYuMDguMDAjUGlwZWNvbGljIGFjaWRzIzEyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjAwLjAwI0ZhdHR5IGFjaWRzIGFuZCB0aGVpciBzYWx0cyBhbmQgZXN0ZXJzIzEyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjAxLjAwI0RlY2Fub2ljIGFjaWRzIzEyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjAyLjAwI1Vuc2F0dXJhdGVkIGZhdHR5IGFjaWRzIzEyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjAzLjAwI1ZvbGF0aWxlIGZhdHR5IGFjaWRzIzEyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjA0LjAwI0hlcHRhbm9pYyBhY2lkcyMxMi4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNy4wNS4wMCNMYXVyaWMgYWNpZHMjMTIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTcuMDYuMDAjTXljb2xpYyBhY2lkcyMxMi4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNy4wNy4wMCNNeXJpc3RpYyBhY2lkcyMxMi4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNy4wOC4wMCNQYWxtaXRpYyBhY2lkcyMxMi4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNy4wOS4wMCNTdGVhcmljIGFjaWRzIzEyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE4LjAwLjAwI05vbiBjYXJib3h5bGljIGFjaWRzIGFuZCB0aGVpciBzYWx0cyMxMi4xNS4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wMS4wMCNDYXJib25pYyBhY2lkcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wMi4wMCNOaXRyaWMgYWNpZHMjMTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTguMDMuMDAjUGhvc3Bob3JvdXMgYWNpZHMjMTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTguMDQuMDAjU3VsZnVyIGFjaWRzIzEyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE4LjA1LjAwI0NobG9yaWRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wNi4wMCNIeWRyb2NobG9yaWRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wNy4wMCNOaXRyYXRlcyBvciBuaXRyaXRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wOC4wMCNTaWxpY2F0ZXMjMTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTguMDkuMDAjUGhvc3BoYXRlcyBvciBwaG9zcGhpZGVzIzEyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE4LjEwLjAwI0JpY2FyYm9uYXRlcyBvciBjYXJiaWRlcyBvciBjYXJib25hdGVzIzEyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE4LjExLjAwI0ZsdW9yaWRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4xMi4wMCNCcm9taWRlcyBvciBicm9tYXRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4xMy4wMCNJb2RpZGVzIG9yIGlvZGF0ZXMjMTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTkuMDAuMDAjSW5vcmdhbmljIHN1bGZ1ciBjb21wb3VuZHMjMTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTkuMDEuMDAjSHlkcm9nZW4gc3VsZmlkZSMxMi4xNS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOS4wMi4wMCNTdWxmdXJpYyBBY2lkIzEyLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE5LjAzLjAwI1NvZGl1bSBzdWxmYXRlIzEyLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE2LjAwLjAwLjAwI0FkZGl0aXZlcyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNS4wMC4wMCNJbmRpY2F0b3JzIGFuZCBSZWFnZW50cyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNS4wMS4wMCNBZmZpbml0eSBsYWJlbHMjMTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTUuMDIuMDAjQ3Jvc3MgbGlua2luZyBhZ2VudHMjMTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTUuMDMuMDAjUmVhZ2VudCBraXRzIzEyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE1LjA0LjAwI1N1bGZoeWRyeWwgcmVhZ2VudHMjMTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTUuMDUuMDAjSW50ZXJjYWxhdGluZyBhZ2VudHMjMTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTUuMDYuMDAjRGl2ZXJ0aW5nIGFnZW50cyMxMi4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNi4wMC4wMCNDYXRhbHlzdHMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTYuMDEuMDAjQWNpZCBjYXRhbHlzdHMjMTIuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTYuMDIuMDAjQ29tYnVzdGlvbiBjYXRhbHlzdHMjMTIuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTYuMDMuMDAjQ3VzdG9tIGNhdGFseXN0cyMxMi4xNi4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNi4wNC4wMCNDcmFja2luZyBjYXRhbHlzdHMjMTIuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTcuMDAuMDAjQnVmZmVycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNy4wMS4wMCNBbXBob2x5dGUgbWl4dHVyZXMjMTIuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTcuMDIuMDAjQmljYXJib25hdGUgYnVmZmVycyMxMi4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNy4wMy4wMCNPdGhlciBidWZmZXJzIzEyLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE3LjA0LjAwI0FjaWQgYnVmZmVycyMxMi4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNy4wNS4wMCNCYXNpYyBidWZmZXJzIzEyLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE3LjA2LjAwI05ldXRyYWwgYnVmZmVycyMxMi4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOC4wMC4wMCNDb2xsb2lkcyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOC4wMS4wMCNHZWxzIzEyLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE4LjAyLjAwI1N1c3BlbnNpb25zIzEyLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE4LjAzLjAwI0Flcm9zb2xzIzEyLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE4LjA0LjAwI0VtdWxzaW9ucyMxMi4xNi4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOC4wNS4wMCNOYXR1cmFsIGdlbGxpbmcgYWdlbnRzIzEyLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE4LjA2LjAwI1N5bnRoZXRpYyBnZWxsaW5nIGFnZW50cyMxMi4xNi4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOC4wNy4wMCNHZWwgc3RhYmlsaXplcnMjMTIuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTguMDguMDAjU3VzcGVuZGluZyBhZ2VudHMjMTIuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDAuMDAjU3VyZmFjdGFudHMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDEuMDAjQW50aSBmb2FtaW5nIGFnZW50cyMxMi4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOS4wMi4wMCNEZXRlcmdlbnQgc3VyZmFjdGFudHMjMTIuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDMuMDAjRm9hbWluZyBhZ2VudHMjMTIuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDQuMDAjRGlzcGVyc2luZyBhZ2VudHMjMTIuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDUuMDAjRmx1c2hlcyMxMi4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOS4wNi4wMCNXZXR0aW5nIGFnZW50cyMxMi4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOS4wNy4wMCNXYXRlciBmbG9vZCBhZGRpdGl2ZXMjMTIuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjAuMDAuMDAjUGxhc3RpY2l6ZXJzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjIwLjAxLjAwI1BodGhhbGF0ZXMjMTIuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjAuMDIuMDAjUG9seW1lcmljcyMxMi4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMC4wMy4wMCNBZ3JpY3VsdHVyYWwgb2lscyMxMi4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMC4wNC4wMCNTdWxmb25hbWlkZXMjMTIuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjAuMDUuMDAjR2x1dGFyYXRlcyMxMi4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMS4wMC4wMCNGbGFtZSByZXRhcmRhbnRzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjIxLjAxLjAwI0Jyb21pbmF0ZWQjMTIuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMDAuMDAjQW50aSBveGlkYW50cyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4wMS4wMCNBc2NvcmJpYyBhY2lkIzEyLjE2LjIyLjAwLjAwCi11bnNwc2M3IzEyLjE2LjIyLjAyLjAwI0JldGEgY2Fyb3RlbmUjMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMDMuMDAjQnV0eWxhdGVkIGh5ZHJveHlhbmlzb2xlIzEyLjE2LjIyLjAwLjAwCi11bnNwc2M3IzEyLjE2LjIyLjA0LjAwI0J1dHlsYXRlZCBoeWRyb3h5dG9sdWVuZSMxMi4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4wNS4wMCNDYWxjaXVtIGNpdHJhdGUjMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMDYuMDAjQ2FudGhheGFudGhpbiMxMi4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4wNy4wMCNNZWxhdG9uaW4jMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMDguMDAjTm9yZGloeWRyb2d1YWlhcmV0aWMgYWNpZCMxMi4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4wOS4wMCNQcm9weWwgZ2FsbGF0ZSMxMi4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4xMC4wMCNTaWx5bWFyaW4jMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMTEuMDAjU3VsZnVyIGRpb3hpZGUjMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjMuMDAuMDAjQ3VyaW5nIGFnZW50cyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMy4wMS4wMCNXYXRlcmJvcm5lIGN1cmluZyBhZ2VudHMjMTIuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjMuMDIuMDAjQ2VtZW50IGFjY2VsZXJhdG9ycyMxMi4xNi4yMy4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMy4wMy4wMCNDZW1lbnQgcmV0YXJkZXJzIzEyLjE2LjIzLjAwLjAwCi11bnNwc2M3IzEyLjE2LjI0LjAwLjAwI1BvbHltZXIgYnJlYWtlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjQuMDEuMDAjQWNpZGljIHBvbHltZXIgYnJlYWtlcnMjMTIuMTYuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjQuMDIuMDAjT3JnYW5pYyBwb2x5bWVyIGJyZWFrZXJzIzEyLjE2LjI0LjAwLjAwCi11bnNwc2M3IzEyLjE2LjI1LjAwLjAwI0VtdWxzaW9uIGJyZWFrZXJzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjI1LjAxLjAwI1dhdGVyIGluIG9pbCBlbXVsc2lvbiBicmVha2VycyMxMi4xNi4yNS4wMC4wMAotdW5zcHNjNyMxMi4xNi4yNS4wMi4wMCNPaWwgaW4gd2F0ZXIgZW11bHNpb24gYnJlYWtlcnMjMTIuMTYuMjUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjUuMDMuMDAjRmxvdGF0aW9uIGFpZHMjMTIuMTYuMjUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjYuMDAuMDAjQ2xheSBzdGFiaWxpemVycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yNi4wMS4wMCNJbm9yZ2FuaWMgY2xheSBzdGFiaWxpemVycyMxMi4xNi4yNi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yNi4wMi4wMCNPcmdhbmljIGNsYXkgc3RhYmlsaXplcnMjMTIuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjcuMDAuMDAjRmx1aWQgbG9zcyBhZGRpdGl2ZXMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjcuMDEuMDAjTmF0dXJhbCBwb2x5bWVyIGZsdWlkIGxvc3MgYWRkaXRpdmVzIzEyLjE2LjI3LjAwLjAwCi11bnNwc2M3IzEyLjE2LjI3LjAyLjAwI01vZGlmaWVkIHBvbHltZXIgZmx1aWQgbG9zcyBhZGRpdGl2ZXMjMTIuMTYuMjcuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjguMDAuMDAjRnJpY3Rpb24gcmVkdWNlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjguMDEuMDAjQW5pb25pYyBmcmljdGlvbiByZWR1Y2VycyMxMi4xNi4yOC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yOC4wMi4wMCNDYXRpb25pYyBmcmljdGlvbiByZWR1Y2VycyMxMi4xNi4yOC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yOS4wMC4wMCNQYXJhZmZpbiBhc3BoYWx0ZW5lIGNvbnRyb2wgYWdlbnRzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjI5LjAxLjAwI1NvbHZlbnQgdHlwZSBwYXJhZmZpbiBhc3BoYWx0ZW5lIGNvbnRyb2wgYWdlbnRzIzEyLjE2LjI5LjAwLjAwCi11bnNwc2M3IzEyLjE2LjI5LjAyLjAwI0NyeXN0YWwgbW9kaWZpZWQgcGFyYWZmaW4gYXNwaGFsdGVuZSBjb250cm9sIGFnZW50cyMxMi4xNi4yOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4yOS4wMy4wMCNEaXNwZXJzYW50IHR5cGUgcGFyYWZmaW4gYXNwaGFsdGVuZSBjb250cm9sIGFnZW50cyMxMi4xNi4yOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4zMC4wMC4wMCNNdWQgcmVtb3ZhbCBtaXh0dXJlcyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zMC4wMS4wMCNNdWQgY2xlYW5vdXQgYWdlbnRzIzEyLjE2LjMwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjMxLjAwLjAwI0FudGkgc2x1ZGdlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzEuMDEuMDAjQW50aSBzbHVkZ2UgYWRkaXRpdmVzIzEyLjE2LjMxLjAwLjAwCi11bnNwc2M3IzEyLjE2LjMyLjAwLjAwI0FudGkgZ2FzIG1pZ3JhdGlvbiBhZ2VudHMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzIuMDEuMDAjQW50aSBnYXMgbWlncmF0aW9uIGFkZGl0aXZlcyMxMi4xNi4zMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4zMy4wMC4wMCNFeHBhbmRpbmcgYWdlbnRzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjMzLjAxLjAwI0NlbWVudCBleHBhbmRpbmcgYWdlbnRzIzEyLjE2LjMzLjAwLjAwCi11bnNwc2M3IzEyLjE2LjM0LjAwLjAwI0V4dGVuZGVycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNC4wMS4wMCNDZW1lbnQgZXh0ZW5kZXJzIzEyLjE2LjM0LjAwLjAwCi11bnNwc2M3IzEyLjE2LjM1LjAwLjAwI09pbCB3ZWxsIHNlYWxhbnRzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjM1LjAxLjAwI0NlbWVudGluZyBzZWFsYW50cyMxMi4xNi4zNS4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNi4wMC4wMCNDb3Jyb3Npb24gaW5oaWJpdG9ycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNi4wMS4wMCNPaWwgcHJvZHVjdGlvbiBjb3Jyb3Npb24gaW5oaWJpdG9ycyMxMi4xNi4zNi4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNi4wMi4wMCNHYXMgcHJvZHVjdGlvbiBjb3Jyb3Npb24gaW5oaWJpdG9ycyMxMi4xNi4zNi4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNy4wMC4wMCNHYXMgaHlkcmF0ZSBjb250cm9sbGVycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNy4wMS4wMCNLaW5ldGljIGh5ZHJhdGUgY29udHJvbGxlcnMjMTIuMTYuMzcuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzguMDAuMDAjU2NhdmVuZ2VycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zOC4wMS4wMCNIeWRyb2dlbiBzdWxmaWRlIHNjYXZlbmdlcnMjMTIuMTYuMzguMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzguMDIuMDAjT3h5Z2VuIHNjYXZlbmdlcnMjMTIuMTYuMzguMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzkuMDAuMDAjU2NhbGUgY29udHJvbGxlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzkuMDEuMDAjU2NhbGUgaW5oaWJpdG9yIzEyLjE2LjM5LjAwLjAwCi11bnNwc2M3IzEyLjE2LjM5LjAyLjAwI1NjYWxlIHJlbW92ZXJzIGFuZCBjb252ZXJ0ZXJzIzEyLjE2LjM5LjAwLjAwCi11bnNwc2M3IzEyLjE2LjQwLjAwLjAwI0JhY3RlcmljaWRlcyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi40MC4wMS4wMCNSZWdpc3RlcmVkIG1pY3JvYmlvY2lkZXMjMTIuMTYuNDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuNDEuMDAuMDAjSW4gc2l0dSMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi40MS4wMS4wMCNJbiBzaXR1IGFkZGl0aXZlcyMxMi4xNi40MS4wMC4wMAotdW5zcHNjNyMxMi4xNi40MS4wMi4wMCNBY2lkIGFkZGl0aXZlcyMxMi4xNi40MS4wMC4wMAotdW5zcHNjNyMxMi4xNi40Mi4wMC4wMCNSZXRhcmRlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuNDIuMDEuMDAjQWNpZCBjb3Jyb3Npb24gaW5oaWJpdG9ycyMxMi4xNi40Mi4wMC4wMAotdW5zcHNjNyMxMi4xNi40My4wMC4wMCNJcm9uIGNvbnRyb2xsZXJzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjQzLjAxLjAwI0lyb24gY29udHJvbCBhZGRpdGl2ZXMjMTIuMTYuNDMuMDAuMDAKLXVuc3BzYzcjMTIuMTYuNDQuMDAuMDAjTm9uIGVtdWxzaWZpZXJzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjQ0LjAxLjAwI05vbiBlbXVsc2lmeWluZyBhZGRpdGl2ZXMjMTIuMTYuNDQuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMDAuMDAuMDAjQ29sb3JhbnRzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjE3LjE1LjAwLjAwI0R5ZXMjMTIuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTUuMDEuMDAjRmx1b3Jlc2NlbnQgZHllcyMxMi4xNy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNS4wMi4wMCNQaHRoYWxlaW4gZHllcyMxMi4xNy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNS4wMy4wMCNSb3NhbmlsaW5lIGR5ZXMjMTIuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTUuMDQuMDAjRm9vZCBvciBkcnVnIG9yIGNvc21ldGljIHNhZmUgKEZEQykgZHllcyMxMi4xNy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNS4wNS4wMCNMYWtlZCMxMi4xNy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNS4wNi4wMCNOYXR1cmFsIGR5ZXMjMTIuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTYuMDAuMDAjUGlnbWVudHMjMTIuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTYuMDEuMDAjTmF0dXJhbCBwaWdtZW50cyMxMi4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNi4wMi4wMCNJbm9yZ2FuaWMgbWV0YWwgb3hpZGVzIzEyLjE3LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE3LjE2LjAzLjAwI0NhcmJvbiBibGFjayMxMi4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNi4wNC4wMCNUaXRhbml1bSBkaW94aWRlIzEyLjE3LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE3LjE2LjA1LjAwI09yZ2FuaWMgcGlnbWVudHMjMTIuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTcuMDAuMDAjQ29sb3IgY29tcG91bmRzIGFuZCBkaXNwZXJzaW9ucyMxMi4xNy4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNy4wMS4wMCNQb2x5bWVyIG1hc3RlcmJhdGNoZXMjMTIuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTcuMDIuMDAjUGlnbWVudCBkaXNwZXJzaW9ucyMxMi4xNy4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNy4wMy4wMCNJbmtzIzEyLjE3LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE4LjAwLjAwLjAwI1dheGVzIGFuZCBvaWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjE4LjE1LjAwLjAwI1dheGVzIzEyLjE4LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE4LjE1LjAxLjAwI1N5bnRoZXRpYyB3YXhlcyMxMi4xOC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xOC4xNS4wMi4wMCNOYXR1cmFsIHdheGVzIzEyLjE4LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE4LjE1LjAzLjAwI1BhcmFmZmlucyMxMi4xOC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xOC4xNS4wNC4wMCNQZXRyb2xhdHVtcyMxMi4xOC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xOC4xNi4wMC4wMCNPaWxzIzEyLjE4LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE4LjE2LjAxLjAwI1N5bnRoZXRpYyBvaWxzIzEyLjE4LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE4LjE2LjAyLjAwI05hdHVyYWwgb2lscyMxMi4xOC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xOS4wMC4wMC4wMCNTb2x2ZW50cyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xOS4xNS4wMC4wMCNIeWRyb2NhcmJvbmF0ZWQgc29sdmVudHMjMTIuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTkuMTUuMDEuMDAjQXJvbWF0aWMgc29sdmVudHMjMTIuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTkuMTUuMDIuMDAjQWxpcGhhdGljIHNvbHZlbnRzIzEyLjE5LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE5LjE2LjAwLjAwI094eWdlbmF0ZWQgc29sdmVudHMjMTIuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTkuMTYuMDEuMDAjQWxjb2hvbCBzb2x2ZW50cyMxMi4xOS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xOS4xNi4wMi4wMCNBY3RpdmUgc29sdmVudHMjMTIuMTkuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMDAuMDAuMDAjQ2hlbWljYWwgaW50ZXJtZWRpYXRlcyBhbmQgZml4YXRpdmVzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIwLjE1LjAwLjAwI0ludGVybWVkaWF0ZXMjMTIuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTUuMDEuMDAjRXRoZXIgaW50ZXJtZWRpYXRlcyMxMi4yMC4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMC4xNS4wMi4wMCNLZXRvbmUgaW50ZXJtZWRpYXRlcyMxMi4yMC4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMC4xNS4wMy4wMCNBbGRlaHlkZSBpbnRlcm1lZGlhdGVzIzEyLjIwLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIwLjE1LjA0LjAwI1Blcm94aWRlIGludGVybWVkaWF0ZXMjMTIuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTUuMDUuMDAjQWNyeWxhdGUgb3IgbWV0aGFjcnlsYXRlIGludGVybWVkaWF0ZXMjMTIuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTYuMDAuMDAjRml4YXRpdmVzIzEyLjIwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIwLjE2LjAxLjAwI0Zvcm1hbGRlaHlkZXMjMTIuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTYuMDIuMDAjR2x1dHJhbHMjMTIuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTYuMDMuMDAjVGFubmlucyMxMi4yMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMC4xNy4wMC4wMCNBbWluZXMgYW5kIGFtaWRlcyBhbmQgaW1pbmVzIGFuZCBpbWlkZXMjMTIuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTcuMDEuMDAjUHJpbWFyeSMxMi4yMC4xNy4wMC4wMAotdW5zcHNjNyMxMi4yMC4xNy4wMi4wMCNTZWNvbmRhcnkjMTIuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTcuMDMuMDAjVGVydGlhcnkjMTIuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTcuMDQuMDAjU3BlY2lhbHR5IzEyLjIwLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIwLjE3LjA1LjAwI1N1bHBob25hdGVkIzEyLjIwLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIxLjAwLjAwLjAwI0NhcmJvbiBiYXNlZCBjaGVtaWNhbHMgYW5kIGNvbXBvdW5kZWQgY2hlbWljYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjAwLjAwI0FsY29ob2xzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjAxLjAwI0FtaW5vIGFsY29ob2xzIzEyLjIxLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjAyLjAwI0Jlbnp5bCBhbGNvaG9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4wMy4wMCNDaGxvcm9oeWRyaW5zIzEyLjIxLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjA0LjAwI0V0aGFub2wjMTIuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTUuMDUuMDAjRmF0dHkgYWxjb2hvbHMjMTIuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTUuMDYuMDAjR2x5Y29scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4wNy4wMCNIZXhhbm9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4wOC4wMCNNZXRoYW5vbCMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4wOS4wMCNQb2x5IHZpbnlsIG9yIFBWICBhbGNvaG9sIzEyLjIxLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjEwLjAwI1Byb3Bhbm9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4xMS4wMCNTdWdhciBhbGNvaG9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4xMi4wMCNCdXR5bCBhbGNvaG9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4xMy4wMCNJc29wcm9weWwgYWxjb2hvbCMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNi4wMC4wMCNIeWRyb2NhcmJvbnMjMTIuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTYuMDEuMDAjQWN5Y2xpYyBvciBjeWNsaWMgb3IgcG9seWN5Y2xpYyBoeWRyb2NhcmJvbnMjMTIuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTYuMDIuMDAjSGFsb2dlbmF0ZWQgaHlkcm9jYXJib25zIzEyLjIxLjE2LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE2LjAzLjAwI1N1bHBob25hdGVkIGh5ZHJvY2FyYm9ucyMxMi4yMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNi4wNC4wMCNOaXRyb3NhdGVkIGh5ZHJvY2FyYm9ucyMxMi4yMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNy4wMC4wMCNBbGRlaHlkZXMjMTIuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTcuMDEuMDAjQWNldGFsYWxkZWh5ZXMjMTIuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTcuMDIuMDAjR2x5b3hhbHMjMTIuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTguMDAuMDAjRXRoZXJzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjE4LjAxLjAwI0FjZXRhbCBldGhlcnMjMTIuMjEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTguMDIuMDAjRXRoeWwgZXRoZXJzIzEyLjIxLjE4LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE4LjAzLjAwI01ldGh5bCBldGhlcnMjMTIuMjEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTguMDQuMDAjUGhlbnlsIGV0aGVycyMxMi4yMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMS4xOC4wNS4wMCNNZXRoeWwgdGV0cmEgYnV0eWwgZXRoZXIjMTIuMjEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTkuMDAuMDAjS2V0b25lcyMxMi4yMS4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMS4xOS4wMS4wMCNBY2V0b25lcyMxMi4yMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xOS4wMi4wMCNDYW1waG9ycyMxMi4yMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xOS4wMy4wMCNLZXRvbmUgYm9kaWVzIzEyLjIxLjE5LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE5LjA0LjAwI01hbm5pY2ggYmFzZXMjMTIuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjAuMDAuMDAjUGhlbm9scyMxMi4yMS4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMC4wMS4wMCNCcm9tcGhlbm9sIGJsdWUjMTIuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjAuMDIuMDAjQ3Jlc29scyMxMi4yMS4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMS4wMC4wMCNDYXJib2h5ZHJhdGVzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIxLjAxLjAwI1NpbXBsZSBzdWdhcnMgb3IgaXRzIGRlcml2YXRpdmVzIzEyLjIxLjIxLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIxLjAyLjAwI0d1bSByZXNpbnMjMTIuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjEuMDMuMDAjU3RhcmNoZXMjMTIuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDAuMDAjQ29tcG91bmRzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjAxLjAwI0NoZW1pY2FsIGFsbG95cyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4wMi4wMCNDeWFuaWRlcyBvciBjeWFuYXRlcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4wMy4wMCNBbHVtaW51bSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDQuMDAjQmFyaXVtIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4wNS4wMCNCb3JvbiBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDYuMDAjQnJvbWluZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDcuMDAjQ2FsY2l1bSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDguMDAjQ2FyYm9uIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4wOS4wMCNDaGxvcmluZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTAuMDAjRmx1b3JpbmUgY29tcG91bmRzIzEyLjIxLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjExLjAwI0dvbGQgY29tcG91bmRzIzEyLjIxLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjEyLjAwI0lvZGluZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTMuMDAjSXJvbiBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTQuMDAjTWFnbmVzaXVtIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4xNS4wMCNOaXRyb2dlbiBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTYuMDAjTml0cmlsZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTcuMDAjT3h5Z2VuIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4xOC4wMCNQaG9zcGhvcm91cyBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTkuMDAjUG90YXNzaXVtIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4yMC4wMCNTZWxlbml1bSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMjEuMDAjU2lsaWNvbiBvciBzaWxpY29uZSBvciBzaWxpY2FuZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMjIuMDAjU29kaXVtIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4yMy4wMCNTdWxmdXIgY29tcG91bmRzIzEyLjIxLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjI0LjAwI1RpbiBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMjUuMDAjWmluYyBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMjYuMDAjSGV0ZXJvY3ljbGljIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4yNy4wMCNDb2JhbHQgY29tcG91bmRzIzEyLjIxLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjI4LjAwI0FudGltb255IGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4yOS4wMCNUaXRhbml1bSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjMuMDAuMDAjT3hpZGVzIGluY2x1ZGVzIGFsbCBveGlkZWQgc3Vic3RhbmNlcyMxMi4yMS4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wMS4wMCNBbHVtaW51bSBveGlkZXMjMTIuMjEuMjMuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjMuMDIuMDAjQ2FyYm9uIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wMy4wMCNIeXBvY2hsb3JvdXMgYWNpZCMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wNC4wMCNNYWduZXNpdW0gb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjA1LjAwI05pdHJvZ2VuIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wNi4wMCNPc21pdW0gb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjA3LjAwI1Blcm94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wOC4wMCNTaWxpY29uIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wOS4wMCNTdWxmdXIgb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjEwLjAwI1Rob3JpdW0gb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjExLjAwI1dhdGVyIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4xMi4wMCNaaW5jIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4xMy4wMCNIeWRyb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjE0LjAwI01ldGFsIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4xNS4wMCNOb24gbWV0YWwgb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjE2LjAwI0V0aHlsZW5lIG94aWRlIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjI0LjAwLjAwI0lzb3RvcGVzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjI0LjAxLjAwI0RldXRlcmF0ZWQgc29sdmVudHMjMTIuMjEuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjQuMDIuMDAjSGVhdnkgd2F0ZXIjMTIuMjEuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjQuMDMuMDAjQWxwaGEgc291cmNlcyMxMi4yMS4yNC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yNC4wNC4wMCNCZXRhIHNvdXJjZXMjMTIuMjEuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjQuMDUuMDAjQ29iYWx0IHNvdXJjZXMjMTIuMjEuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjQuMDYuMDAjR2FtbWEgc291cmNlcyMxMi4yMS4yNC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yNC4wNy4wMCNSYWRpb2lzb3RvcGUgc291cmNlcyMxMi4yMS4yNC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yNC4wOC4wMCNDYWxpYnJhdGlvbiBzb3VyY2VzIzEyLjIxLjI0LjAwLjAwCi11bnNwc2M3IzEyLjIyLjAwLjAwLjAwI0JpbyBjaGVtaWNhbHMjMTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDAuMDAjUHJvdGVpbnMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDEuMDAjQWxidW1pbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDIuMDAjQmFjdGVyaWFsIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjAzLjAwI0Jsb29kIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjA0LjAwI0JvbmUgbW9ycGhvZ2VuZXRpYyBwcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4wNS4wMCNDYXJyaWVyIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjA2LjAwI0NvbnRyYWN0aWxlIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjA3LjAwI0RpZXRhcnkgcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDguMDAjRGVveHlyaWJvbnVjbGVpYyBhY2lkIChETkEpIGJpbmRpbmcgcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDkuMDAjRWdnIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjEwLjAwI0dsb2J1bGlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xMS4wMCNHbHljb3Byb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjEyLjAwI0hlbWVwcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xMy4wMCNJbnRlcmZlcm9ucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xNC4wMCNMZWN0aW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjE1LjAwI0xpcG9wcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xNi4wMCNNZW1icmFuZSBwcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xNy4wMCNNZXRhbGxvcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMTguMDAjTmVydmUgdGlzc3VlIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjE5LjAwI05lY3VsZW9wcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4yMC4wMCNQZXB0b25lcyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4yMS4wMCNQbGFudCBwcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4yMi4wMCNQcmlvbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjMuMDAjQ3l0b3BsYXNtaWMgb3IgbnVjbGVhciByZWNlcHRvcnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjQuMDAjUmVjb21iaW5hbnQgcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjUuMDAjU2VycGlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4yNi4wMCNUcmFuc2NyaXB0aW9uIGZhY3RvcnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjcuMDAjVmlyYWwgcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjguMDAjU2NsZXJvcHJvdGVpbiMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wMC4wMCNBbnRpYm9kaWVzIzEyLjIyLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjE2LjAxLjAwI1ZpcmFsIGFudGlib2RpZXMjMTIuMjIuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTYuMDIuMDAjQW50aXRveGlucyMxMi4yMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wMy4wMCNCYWN0ZXJpYWwgYW50aWJvZGllcyMxMi4yMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wNC4wMCNBdXRvYW50aWJvZGllcyMxMi4yMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wNS4wMCNJbW11bmUgc2VyYSMxMi4yMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wNi4wMCNJbW11bm9nbG9idWxpbnMjMTIuMjIuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTcuMDAuMDAjTnV0cmllbnRzIzEyLjIyLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjE3LjAxLjAwI1ZpdGFtaW5zIzEyLjIyLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE4LjAwLjAwI0VuenltZXMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTguMDEuMDAjSHlkcm9sYXNlcyMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOC4wMi4wMCNJc29lbnp5bWVzIzEyLjIyLjE4LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE4LjAzLjAwI0lzb21lcmFzZXMjMTIuMjIuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTguMDQuMDAjTGlnYXNlcyMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOC4wNS4wMCNMeWFzZXMjMTIuMjIuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTguMDYuMDAjTXVsdGllbnp5bWUgY29tcGxleGVzIzEyLjIyLjE4LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE4LjA3LjAwI094aWRvcmVkdWN0YXNlcyMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOC4wOC4wMCNQZXJtZWFzZXMjMTIuMjIuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTguMDkuMDAjVHJhbnNmZXJlYXNlcyMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOC4xMC4wMCNDYXRhbGFzZSMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wMC4wMCNUaXNzdWVzIzEyLjIyLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjE5LjAxLjAwI0Nvbm5lY3RpdmUgdGlzc3VlcyMxMi4yMi4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wMi4wMCNFcGl0aGVsaXVtcyMxMi4yMi4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wMy4wMCNFeG9jcmluZSBnbGFuZHMjMTIuMjIuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTkuMDQuMDAjTHltcGhvaWQgdGlzc3VlcyMxMi4yMi4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wNS4wMCNNZW1icmFuZXMjMTIuMjIuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTkuMDYuMDAjTXVzY2xlcyMxMi4yMi4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wNy4wMCNOZXJ2ZSB0aXNzdWVzIzEyLjIyLjE5LjAwLjAwCi11bnNwc2M3IzEyLjIyLjIwLjAwLjAwI0N1bHR1cmVzIGFuZCBmbHVpZHMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjAuMDEuMDAjQWdhciMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wMi4wMCNCcm90aCMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wMy4wMCNTZXJ1bSBmcmVlIGN1bHR1cmUgbWVkaWEjMTIuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjAuMDQuMDAjQ29uZGl0aW9uZWQgY3VsdHVyZSBtZWRpYSMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wNS4wMCNCYWN0ZXJpYSBjdWx0dXJlcyMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wNi4wMCNCbG9vZCMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wNy4wMCNVcmVhIzEyLjIyLjIwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIwLjA4LjAwI0JpbGUjMTIuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjAuMDkuMDAjUGxhc21hIzEyLjIyLjIwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIwLjEwLjAwI1NlbWVuIGN1bHR1cmVzIzEyLjIyLjIwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIxLjAwLjAwI051Y2xlaWMgYWNpZHMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjEuMDEuMDAjUmlib251Y2xlaWMgYWNpZCAoUk5BKSMxMi4yMi4yMS4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMS4wMi4wMCNEZW94eXJpYm9udWNsZWljIGFjaWQgKEROQSkjMTIuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDAuMDAjQW1pbm8gYWNpZHMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDEuMDAjQnJhbmNoZWQgY2hhaW4gYW1pbm8gYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDIuMDAjQ3ljbGljIGFtaW5vIGFjaWRzIzEyLjIyLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIyLjAzLjAwI0RpYW1pbm8gYW1pbm8gYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDQuMDAjRGljYXJib3h5bGljIGFtaW5vIGFjaWRzIzEyLjIyLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIyLjA1LjAwI0Vzc2VudGlhbCBhbWlubyBhY2lkcyMxMi4yMi4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMi4wNi4wMCNTdWxmdXIgYW1pbm8gYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDcuMDAjQW1pbm9idXR5cmljIGFjaWRzIzEyLjIyLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIyLjA4LjAwI0FtaW5vY2Fwcm9pYyBhY2lkcyMxMi4yMi4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMi4wOS4wMCNPeGFtaWMgYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMTAuMDAjUGhvc3Bob2FtaW5vIGFjaWRzIzEyLjIyLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIyLjExLjAwI1F1aXNxdWFsaWMgYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjMuMDAuMDAjQW1pbmVzIGFuZCBhbWlkZXMgYW5kIGltaW5lcyBhbmQgaW1pZGVzIzEyLjIyLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIzLjAxLjAwI1ByaW1hcnkjMTIuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjMuMDIuMDAjU2Vjb25kYXJ5IzEyLjIyLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIzLjAzLjAwI1RlcnRpYXJ5IzEyLjIyLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIzLjA0LjAwI1NwZWNpYWx0eSMxMi4yMi4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMy4wNS4wMCNTdWxwaG9uYXRlZCMxMi4yMi4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMy4wMC4wMC4wMCNJbm9yZ2FuaWMgY29tcG91bmRzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIzLjEwLjAwLjAwI01pbmVyYWwgYWNpZHMjMTIuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTAuMDEuMDAjSHlkcm9mbG9yaWMgYWNpZCMxMi4yMy4xMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMC4wMi4wMCNIeWRyb2ZsdW9yb3NpbGljaWMgYWNpZCMxMi4yMy4xMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMC4wMy4wMCNIeWRyb2Zsb3VyaWMgYWNpZCMxMi4yMy4xMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMS4wMC4wMCNCYXNlcyMxMi4yMy4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMS4wMS4wMCNTb2RpdW0gaHlkcm94aWRlIzEyLjIzLjExLjAwLjAwCi11bnNwc2M3IzEyLjIzLjExLjAyLjAwI1BvdGFzc2l1bSBoeWRyb3hpZGUjMTIuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTIuMDAuMDAjU2FsdHMjMTIuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTIuMDEuMDAjQW1tb25pdW0gbml0cmF0ZSMxMi4yMy4xMi4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMy4wMC4wMCNTdWxwaGF0ZXMjMTIuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTMuMDEuMDAjRmVycmljIHN1bHBoYXRlIzEyLjIzLjEzLjAwLjAwCi11bnNwc2M3IzEyLjIzLjEzLjAyLjAwI0NvcHBlciBzdWxwaGF0ZSMxMi4yMy4xMy4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMy4wMy4wMCNBbHVtaW5pdW0gc3VscGhhdGUjMTIuMjMuMTMuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTMuMDQuMDAjU29kaXVtIHN1bHBoYXRlIzEyLjIzLjEzLjAwLjAwCi11bnNwc2M3IzEyLjIzLjEzLjA1LjAwI1NvZGl1bSB0aGlvc3VscGhhdGUjMTIuMjMuMTMuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTQuMDAuMDAjQ2hsb3JpZGVzIGNobG9yYXRlcyBhbmQgcGVyY2hsb3JhdGVzIzEyLjIzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIzLjE0LjAxLjAwI1NvZGl1bSBjaGxvcml0ZSMxMi4yMy4xNC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNC4wMi4wMCNGZXJyaWMgQ2hsb3JpZGUjMTIuMjMuMTQuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTQuMDMuMDAjQWx1bWluaXVtIGNobG9yaWRlIzEyLjIzLjE0LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE0LjA0LjAwI1BvbHkgYWx1bWluaXVtIGNobG9yaWRlIzEyLjIzLjE0LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE0LjA1LjAwI0FsdW1pbml1bSBjaGxvcm9oeWRyYXRlIzEyLjIzLjE0LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE0LjA2LjAwI1NvZGl1bSBoeXBvY2hsb3JpdGUjMTIuMjMuMTQuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTUuMDAuMDAjQm9yaWRlcyBhbmQgYm9yYXRlcyMxMi4yMy4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNS4wMS4wMCNTb2RpdW0gYm9yYXRlIzEyLjIzLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE2LjAwLjAwI0h5ZHJpZGVzIzEyLjIzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIzLjE2LjAxLjAwI0FsdW1pbml1bSBoeWRyaXRlIzEyLjIzLjE2LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE2LjAyLjAwI01hZ25lc2l1bSBoeWRyaXRlIzEyLjIzLjE2LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE3LjAwLjAwI1N1bHBoaWRlcyMxMi4yMy4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNy4wMS4wMCNIeWRyb2dlbiBzdWxwaGlkZSMxMi4yMy4xNy4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNy4wMi4wMCNQb2x5IHN1bHBoaWRlIzEyLjIzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE3LjAzLjAwI1NvZGl1bSBzdWxwaGlkZSMxMi4yMy4xNy4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNy4wNC4wMCNJcm9uIHN1bHBoaWRlIzEyLjIzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE4LjAwLjAwI0lub3JnYW5pYyBveGlkaXNpbmcgYWdlbnRzIzEyLjIzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIzLjE4LjAxLjAwI1BvdGFzc2l1bSBwZXJtYW5nYW5hdGUjMTIuMjMuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTguMDIuMDAjUG90YXNzaXVtIGRpY2hyb21hdGUjMTIuMjMuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTguMDMuMDAjTWFuZ2FuZXNlIGRpb3hpZGUjMTIuMjMuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjQuMDAuMDAuMDAjQWxjb2hvbHMjMTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjQuMTAuMDAuMDAjTW9ub2h5ZHJpYyBhbGNvaG9scyMxMi4yNC4wMC4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMC4wMS4wMCNFdGhhbm9sIzEyLjI0LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjEwLjAyLjAwI0lzb3Byb3Bhbm9sIzEyLjI0LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjEwLjAzLjAwI01ldGhhbm9sIzEyLjI0LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjEwLjA0LjAwI1BlbnRhbm9scyMxMi4yNC4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMC4wNS4wMCNPY3Rhbm9scyMxMi4yNC4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMC4wNi4wMCNJbm9zaXRvbHMjMTIuMjQuMTAuMDAuMDAKLXVuc3BzYzcjMTIuMjQuMTAuMDcuMDAjRmF0dHkgYWxjb2hvbHMjMTIuMjQuMTAuMDAuMDAKLXVuc3BzYzcjMTIuMjQuMTAuMDguMDAjQWxseWwgYWxjb2hvbCMxMi4yNC4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMS4wMC4wMCNQb2x5aHlkcmljIGFsY29ob2xzIzEyLjI0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjExLjAxLjAwI0dseWNvbCMxMi4yNC4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMS4wMi4wMCNHbHljZXJvbCMxMi4yNC4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMi4wMC4wMCNUaGlvIGFsY29ob2xzIzEyLjI0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjEyLjAxLjAwI0V0aGFuZSB0aGlvbCMxMi4yNC4xMi4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMi4wMi4wMCNNZXRoYW5lIHRoaW9sIzEyLjI0LjEyLjAwLjAwCi11bnNwc2M3IzEyLjI1LjAwLjAwLjAwI0Fsa2FuZXMgQWxrZW5lcyBBbGt5bmVzIGFuZCBBcm9tYXRpY3MjMTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjUuMTAuMDAuMDAjQWxrYW5lcyMxMi4yNS4wMC4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMC4wMS4wMCNQZW50YW5lIzEyLjI1LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI1LjEwLjAyLjAwI0hleGFuZSMxMi4yNS4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMS4wMC4wMCNDeWNsaWMgaHlkcm9jYXJib25zIzEyLjI1LjAwLjAwLjAwCi11bnNwc2M3IzEyLjI1LjExLjAxLjAwI1RvbHVlbmUjMTIuMjUuMTEuMDAuMDAKLXVuc3BzYzcjMTIuMjUuMTEuMDIuMDAjWHlsZW5lcyMxMi4yNS4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMS4wMy4wMCNCZW56ZW5lIzEyLjI1LjExLjAwLjAwCi11bnNwc2M3IzEyLjI1LjEyLjAwLjAwI0Fsa2VuZXMjMTIuMjUuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjUuMTIuMDEuMDAjUHJvcGVuZSMxMi4yNS4xMi4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMi4wMi4wMCNCdXRlbmUjMTIuMjUuMTIuMDAuMDAKLXVuc3BzYzcjMTIuMjUuMTIuMDMuMDAjU3R5cmVuZSMxMi4yNS4xMi4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMy4wMC4wMCNBbGt5bmVzIzEyLjI1LjAwLjAwLjAwCi11bnNwc2M3IzEyLjI1LjEzLjAxLjAwI0FjeXRlbGVuZSMxMi4yNS4xMy4wMC4wMAotdW5zcHNjNyMxMi4yNi4wMC4wMC4wMCNBcm9tYXRpYyBkZXJpdmF0aXZlcyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMC4wMC4wMCNBcm9tYXRpYyBzdWxwaG9uaWMgYWNpZHMjMTIuMjYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTAuMDEuMDAjQmVuemVuZSBzdWxwaG9uaWMgYWNpZHMjMTIuMjYuMTAuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTAuMDIuMDAjSGFsb2dlbmF0ZWQgc3VscGhvbmljIGFjaWRzIzEyLjI2LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI2LjEwLjAzLjAwI05pdHJvc3VscGhvbmljIGFjaWRzIzEyLjI2LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI2LjEwLjA0LjAwI0FtaW5vIHN1bHBob25pYyBhY2lkcyMxMi4yNi4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMC4wNS4wMCNTdWxwaG9ueWwgY2hsb3JpZGVzIzEyLjI2LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI2LjExLjAwLjAwI0Fyb21hdGljIG5pdHJvIGNvbXBvdW5kcyMxMi4yNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMS4wMS4wMCNOaXRybyBiZW56ZW5lcyMxMi4yNi4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMS4wMi4wMCNOaXRybyB0b2x1ZW5lcyMxMi4yNi4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMS4wMy4wMCNDYXByb2xhY3RhbSMxMi4yNi4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMi4wMC4wMCNDeWNsaWMgYWxjb2hvbHMjMTIuMjYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTIuMDEuMDAjSGV4YW5vbHMjMTIuMjYuMTIuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTIuMDIuMDAjTmFwdGhvbHMjMTIuMjYuMTIuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTIuMDMuMDAjWHlsZW5vbHMjMTIuMjYuMTIuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTIuMDQuMDAjQmVuenlsIGFsY29ob2xzIzEyLjI2LjEyLjAwLjAwCi11bnNwc2M3IzEyLjI2LjEzLjAwLjAwI1BodGhhbGF0ZXMjMTIuMjYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTMuMDEuMDAjRGkgb2N0eWwgUGh0aGFsYXRlIzEyLjI2LjEzLjAwLjAwCi11bnNwc2M3IzEyLjI2LjEzLjAyLjAwI0RpIGV0aHlsIHBodGhhbGF0ZXMjMTIuMjYuMTMuMDAuMDAKLXVuc3BzYzcjMTMuMDAuMDAuMDAuMDAjUmVzaW4gYW5kIFJvc2luIGFuZCBSdWJiZXIgYW5kIEZvYW0gYW5kIEZpbG0gYW5kIEVsYXN0b21lcmljIE1hdGVyaWFscyMxMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4wMC4wMC4wMCNSdWJiZXIgYW5kIGVsYXN0b21lcnMjMTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTUuMDAuMDAjTmF0dXJhbCBydWJiZXIjMTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTUuMDEuMDAjTGF0ZXggcnViYmVyIzEzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE1LjAyLjAwI0NyZXBlIHJ1YmJlciMxMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNS4wMy4wMCNTbW9rZWQgc2hlZXQgcnViYmVyIzEzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE1LjA0LjAwI05hdHVyYWwgZm9hbSBydWJiZXIjMTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTUuMDUuMDAjQmxvY2sgb3IgY3J1bWIgcnViYmVyIzEzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE2LjAwLjAwI1Byb2Nlc3NlZCBhbmQgc3ludGhldGljIHJ1YmJlciMxMy4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNi4wMS4wMCNWdWxjYW5pemVkIHJ1YmJlciMxMy4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNi4wMi4wMCNDaGxvcmluYXRlZCBydWJiZXIjMTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTYuMDMuMDAjSHlkcm9jaGxvcmlkZSBydWJiZXIjMTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTYuMDQuMDAjQ3ljbGl6ZWQgcnViYmVyIzEzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE2LjA1LjAwI0lzb21lcml6ZWQgcnViYmVyIzEzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE2LjA2LjAwI1RoZXJtcGxhc3RpYyBydWJiZXIjMTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTYuMDcuMDAjUnViYmVyIGNvbXBvdW5kIzEzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjAwLjAwI0VsYXN0b21lcnMjMTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDEuMDAjQWNyeWxvbml0cmlsZSBidXRhZGllbmUgKE5CUikjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDIuMDAjSGlnaGx5IHNhdHVyYXRlZCBuaXRyaWxlIChITkJSKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4wMy4wMCNGbHVvcm9jYXJib24gKEZLTSkjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDQuMDAjRXRoeWxlbmUgcHJvcHlsZW5lIChFUCkjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDUuMDAjU3R5cmVuZSBidXRhZGllbmUgKFNCUikjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDYuMDAjQ2hsb3JvcHJlbmUgKENSKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4wNy4wMCNJc29idXR5bGVuZSBpc29wcmVuZSAoSUlSL1hJSVIpIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjA4LjAwI1NpbGljb25lIChWTVEgYW5kIFBNUSBhbmQgUFZNUSkjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDkuMDAjRmx1b3Jvc2lsaWNvbmUgKEZWTVEpIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjEwLjAwI1BvbHlhY3J5bGF0ZSAoQUNNKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xMS4wMCNFdGh5bGVuZSBhY3J5bGljIChBRU0pIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjEyLjAwI0NobG9yb3N1bGZvbmF0ZWQgcG9seWV0aHlsZW5lIChDU00pIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjEzLjAwI0NobG9yb3BvbHlldGh5bGVuZSAoQ00pIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjE0LjAwI0VwaWNobG9yb2h5ZHJpbiAoRUNPKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xNS4wMCNOYXR1cmFsIHBvbHlpc29wcmVuZSAoTlIpIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjE2LjAwI1N5bnRoZXRpYyBwb2x5aXNvcHJlbmUgKElSKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xNy4wMCNQb2x5ZXN0ZXIgdXJldGhhbmUgKEFVKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xOC4wMCNQb2x5ZXRoZXIgdXJldGhhbmUgKEVVKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xOS4wMCNQb2x5YnV0YWRpZW5lIChCUikjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMjAuMDAjUG9seWV0aGVyIGJsb2NrIGFtaWRlIChQRUJBKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4yMS4wMCNTdHlyZW5lIGJsb2NrIGNvcGxveW1lciAoVEVTKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4yMi4wMCNDb3BvbHllc3RlciMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4yMy4wMCNUaGVybW9wbGFzdGljIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjI0LjAwI1BvbHlvbGVuZmluaWMjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTguMDAuMDAjVGhlcm1vcGxhc3RpYyBlbGFzdG9tZXJzIzEzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjE4LjAxLjAwI1BvbHlldGhlciBibG9jayBhbWlkZSAoUEVCQSkjMTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTguMDIuMDAjUG9seW9sZW5maW5pYyAoVFBPKSMxMy4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMy4xMC4xOC4wMy4wMCNFdGhlciBlc3RlciBibG9jayBjb3Bsb3ltZXIgKFRFRUUpIzEzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE4LjA0LjAwI1RoZXJtb3BsYXN0aWMgZWxhc3RvbWVyIHBvbHl1cmV0aGFuZSAoVFBVUikjMTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTguMDUuMDAjU3R5cmVuZSBibG9jayBjb3Bsb3ltZXIgKFRFUykjMTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTkuMDAuMDAjVGhlcm1vc2V0IHBsYXN0aWNzIzEzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjE5LjAxLjAwI0Vwb3h5IChFUCkjMTMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTkuMDIuMDAjUGhlbm9saWMgKFBGKSMxMy4xMC4xOS4wMC4wMAotdW5zcHNjNyMxMy4xMC4xOS4wMy4wMCNVbnNhdHVyYXRlIHBvbHllc3RlciAoVVApIzEzLjEwLjE5LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE5LjA0LjAwI1VyZWEgKFVGKSMxMy4xMC4xOS4wMC4wMAotdW5zcHNjNyMxMy4xMC4xOS4wNS4wMCNNZWxhbWluZSAoTUYpIzEzLjEwLjE5LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE5LjA2LjAwI1RoZXJtb3NldCBwb2x5dXJldGhhbmUgKFBVUikjMTMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMDAuMDAjVGhlcm1vcGxhc3RpYyBwbGFzdGljcyMxMy4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4wMS4wMCNBY3J5bG9uaXRyaWxlIGJ1dGFkaWVuZSBzdHlyZW5lIChBQlMpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjAyLjAwI0Fjcnlsb25pdHJpbGUgYnV0YWRpZW5lIHN0eXJlbmUgKEFCUykgYWxsb3lzIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjAzLjAwI0FjZXRhbCBwb2x5bWVyIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjA0LjAwI0FjcnlsaWMjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMDUuMDAjQWNyeWxvbml0cmlsZSBzdHlyZW5lIGFjcnlsaWMgKEFTQSkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMDYuMDAjQWNyeWxvbml0cmlsZSBzdHlyZW5lIGFjcnlsaWMgKEFTQSkgYWxsb3lzIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjA3LjAwI0NlbGx1bG9zaWNzIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjA4LjAwI0ZsdW9yb3BvbHltZXJzIChQVEZFKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4wOS4wMCNFdGh5bGVuZSB2aW55bCBhY2V0YXRlIChFVkEpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjEwLjAwI0xpcXVpZCBjcnlzdGFsIHBvbHltZXIgKExDUCkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMTEuMDAjUG9seWFtaWRlIG55bG9ucyAoUEEpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjEyLjAwI1BvbHlidXR5bGVuZSB0ZXJlcHRoYWxhdGUgKFBCVCkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMTMuMDAjUG9seWNhcmJvbmF0ZSAoUEMpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjE0LjAwI1BvbHlldGhlcmV0aGVya2V0b25lIChQRUVLKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4xNS4wMCNQb2x5ZXRoZXJpbWlkIChQRUkpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjE2LjAwI1BvbHlldGhlcnN1bGZvbmUgKFBFUykjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMTcuMDAjSGlnaCBkZW5zaXR5IHBvbHlldGh5bGVuZSAoSERQRSkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMTguMDAjTG93IGRlbnNpdHkgcG9seWV0aHlsZW5lIChMRFBFKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4xOS4wMCNNZWRpdW0gZGVuc2l0eSBwb2x5ZXRoeWxlbmUgKE1EUEUpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjIwLjAwI1BvbHlldGh5bGVuZSB0ZXJlcHRoYWxhdGUgKFBFVCkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMjEuMDAjUG9seWltaWRlIChQSSkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMjIuMDAjUG9seXByb3B5bGVuZSAoUFApIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjIzLjAwI1BvbHlwaHRoYWxhbWlkZSAoUFBBKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4yNC4wMCNQb2x5dGhlbnlsZW5lIG94aWRlIChQUE8pIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjI1LjAwI1BvbHlwaGVueWxlbmUgc3VsZmlkZSAoUFBTKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4yNi4wMCNQb2x5c3R5cmVuZSAoUFMpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjI3LjAwI0hpZ2ggaW1wYWN0IHBvbHlzdHlyZW5lIChISVBTKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4yOC4wMCNQb2x5c3VsZm9uZSAoUFNVKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4yOS4wMCNSaWdpZCB0aGVybW9wbGFzdGljIHBvbHl1cmV0aGFuZSAoUlBUVSkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMzAuMDAjUG9seXZpbnlsIGNobG9yaWRlIChQVkMpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjMxLjAwI1N0eXJlbmUgYWNyeWxvbml0cmlsZSAoU0FOKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wMC4wMCNSZXNpbnMjMTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjEuMDEuMDAjUGxhc3RpYyByZXNpbnMjMTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjEuMDIuMDAjSW5kZW5lIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wMy4wMCNVcmVhIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wNC4wMCNQaGVub2xpYyByZXNpbnMjMTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjEuMDUuMDAjVGhlcm1vcGxhc3RpYyByZXNpbnMjMTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjEuMDYuMDAjQWxreWQgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjA3LjAwI01lbGFtaW5lIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wOC4wMCNQb2x5YWNldGFsIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wOS4wMCNQb2x5YW1pZGUgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjEwLjAwI1BvbHljYXJib25hdGUgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjExLjAwI1BvbHlldGh5bGVuZSB0ZXJlcGh0aGFsYXRlIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4xMi4wMCNQb2x5ZXRoZXIgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjEzLjAwI0FsbHlsIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4xNC4wMCNQb2x5dXJldGhhbmUgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjE1LjAwI0Vwb3h5IHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4xNi4wMCNQZXRyb2xldW0gcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIyLjAwLjAwI1BsYXN0aWMgZmlsbXMjMTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjIuMDEuMDAjUG9seXVyZXRoYW5lIGZpbG1zIzEzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIyLjAyLjAwI1NpbGljb25lIGNvYXRlZCBmaWxtcyMxMy4xMC4yMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4wMC4wMC4wMCNSZXNpbnMgYW5kIHJvc2lucyBhbmQgb3RoZXIgcmVzaW4gZGVyaXZlZCBtYXRlcmlhbHMjMTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMDAuMDAjUmVzaW5zIzEzLjExLjAwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjAxLjAwI0Vwb3h5IzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjAyLjAwI1BoZW5vbGljIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjAzLjAwI1Vuc2F0dXJhdGVkIHBvbHllc3RlciMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4wNC4wMCNBY3J5bG9uaXRyaWxlIGJ1dGFkaWVuZSBzdHlyZW5lIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjA1LjAwI0Fjcnlsb25pdHJpbGUgc3R5cmVuZSBhY3J5bGljIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjA2LjAwI0Fjcnlsb25pdHJpbGUgc3R5cmVuZSBhY3J5bGljIGFsbG95cyMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4wNy4wMCNGbHVvcm9wb2x5bWVycyMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4wOC4wMCNFdGh5bGVuZSB2aW55bCBhY2V0YXRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjA5LjAwI0xpcXVpZCBjcnlzdGFsIHBvbHltZXIjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMTAuMDAjTnlsb24jMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMTEuMDAjUG9seWJ1dHlsZW5lIHRlcmVwdGhhdGxhdGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMTIuMDAjUG9seWNhcmJvbmF0ZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4xMy4wMCNQb2x5ZXRoZXJldGhlcmtldG9uZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4xNC4wMCNQb2x5ZXRoZXJpbWlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4xNS4wMCNQb2x5ZXRoZXJzdWxmb25lIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjE2LjAwI1BvbHlldGh5bGVuZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4xNy4wMCNQb2x5ZXRoeWxlbmUgdGVycHRoYWxhdGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMTguMDAjUG9seWltaWRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjE5LjAwI1BvbHlwcm9weWxlbmUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMjAuMDAjUG9seXBodGhhbGFtaWRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjIxLjAwI1BvbHlldGh5bGVuZSBveGlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4yMi4wMCNQb2x5cGhlbnlsZW5lIHN1bGZpZGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMjMuMDAjUG9seXN0eXJlbmUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMjQuMDAjUG9seXN1bGZvbmUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMjUuMDAjUG9seXZpbnlsIGNobG9yaWRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjI2LjAwI1N0eXJlbmUgYWNyeWxvbml0cmlsZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4yNy4wMCNVcmVhIGZvcm1hbGRlaHlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4yOC4wMCNBbGt5ZCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4yOS4wMCNNZWxhbWluZSBmb3JtYWxkZWh5ZGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMzAuMDAjUG9seWFjZXRhbCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4zMS4wMCNQb2x5YW1pZGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMzIuMDAjQWxseWwjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMzMuMDAjRXRoeWxlbmUgYWNyeWxpYyBhY2lkIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjM0LjAwI1BvbHl2aW55bCBjaGxvcmlkZSBjb21wb3VuZCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4zNS4wMCNTb2x1dGlvbiB2aW55bCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4zNi4wMCNQaGVub3h5IzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjM3LjAwI0NvbXBvdW5kZWQgcmVzaW5zIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjM4LjAwI1BvbHl2aW5seSBweXJvbGlkaW5lIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjM5LjAwI1BvbHlldGh5bGVuZSB0ZXJlcGh0aGFsYXRlIG9yIGdseWNvbCBtb2RpZmllZCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC40MC4wMCNIeWRyb2NhcmJvbiB0YWNraWZpZXIjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNDEuMDAjUG9seWNhcmJvbmF0ZSBibGVuZHMjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNDIuMDAjUG9seXZpbnlsIGFsY29ob2wjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNDMuMDAjUG9seXZpbnlsIGJ1dHlyYWwjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNDQuMDAjUG9seWVzdGVyIG1vbGRpbmcgY29tcG91bmRzIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjQ1LjAwI1BvbHl2aW55bCBhY2V0YXRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjQ2LjAwI1BvbHl2aW55bCBldGhlciMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC40Ny4wMCNQb2x5dmlueWwgZm9ybWFsIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjQ4LjAwI1N0eXJlbmUgYWNyeWxpYyMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC40OS4wMCNFdGh5bGVuZSBwcm9weWxlbmUgcG9seW1lcnMjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNTAuMDAjUG9seXByb3B5bGVuZSBveGlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC41MS4wMCNQb2x5cHJvcHlsZW5lIGV0aGVyIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjUyLjAwI1BvbHlwcm9weWxlbmUgc3VsZm9uZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC41My4wMCNQb2x5bWV0aHlsYWNyeWxhdGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNTQuMDAjU3R5cmVuZSBtYWxlaWMgYW5oeWRyaWRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjU1LjAwI1N5bmRpb3RhdGljIHBvbHlzdHlyZW5lIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjU2LjAwI0NobG9yaW5hdGVkIHBvbHl2aW55bCBjaGxvcmlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC41Ny4wMCNUaGVybW9wbGFzdGljIHBvbHllc3RlciMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC41OC4wMCNJbmRlbmUgcmVzaW5zIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjU5LjAwI1BsYXN0aWMgcmVzaW5zIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjYwLjAwI1BldHJvbGV1bSByZXNpbnMjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNjEuMDAjUG9seXVyZXRoYW5lIHJlc2lucyMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC42Mi4wMCNQb2x5ZXRoZXIgcmVzaW5zIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjExLjAwLjAwI1Jvc2lucyMxMy4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMS4wMS4wMCNXb29kIHJvc2luIzEzLjExLjExLjAwLjAwCi11bnNwc2M3IzEzLjExLjExLjAyLjAwI0d1bSByb3NpbiMxMy4xMS4xMS4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMS4wMy4wMCNUYWxsIG9pbCByb3NpbiMxMy4xMS4xMS4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4wMC4wMCNGaWxtcyMxMy4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4wMS4wMCNQb2x5ZXRoeWxlbmUgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMDIuMDAjUG9seXVyZXRoYW5lIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjAzLjAwI0FjZXRhdGUgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMDQuMDAjQWNyeWxpYyBmaWxtcyMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4wNS4wMCNDb2V4dHJ1ZGVkIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjA2LjAwI0Zsb3Vyb3BvbHltZXIgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMDcuMDAjTWV0YWxpemVkIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjA4LjAwI055bG9uIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjA5LjAwI1BvbHljYXJib25hdGUgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMTAuMDAjUG9seWVzdGVyIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjExLjAwI1BvbHlwcm9weWxlbmUgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMTIuMDAjQmlheGlhbGx5IG9yaWVudGF0ZWQgcG9seXByb3B5bGVuZSMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xMy4wMCNQb2x5bWlkZSBmaWxtcyMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xNC4wMCNQb2x5c3R5cmVuZSBmaWxtcyMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xNS4wMCNGbGV4aWJsZSBwb2x5dmlueWwgY2hsb3JpZGUgZmlsbSMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xNi4wMCNSaWdpZCBwb2x5dmlueWwgY2hsb3JpZGUgZmlsbSMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xNy4wMCNFdGh5bGVuZSB2aW55bCBhbGNvaG9sIGZpbG0jMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMTguMDAjUG9seXZpbnlsaWRlbmUgY2hsb3JpZGUjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMTkuMDAjUG9seXZpbnlsIGFsY29ob2wgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTMuMDAuMDAjRm9hbXMjMTMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTMuMDEuMDAjUG9seW9sZWZpbiBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjAyLjAwI1BvbHlldGhlciBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjAzLjAwI1NpbGljb25lIGZvYW0jMTMuMTEuMTMuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTMuMDQuMDAjRXRoeWxlbmUgcHJvcHlsZW5lIHRlcnBvbHltZXIgZm9hbSMxMy4xMS4xMy4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMy4wNS4wMCNOZW9wcmVuZSBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjA2LjAwI1BvbHl2aW55bCBjaGxvcmlkZSBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjA3LjAwI1J1YmJlciBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjA4LjAwI1BvbHlzdHlyZW5lIGZvYW0jMTMuMTEuMTMuMDAuMDAKLXVuc3BzYzcjMTQuMDAuMDAuMDAuMDAjUGFwZXIgTWF0ZXJpYWxzIGFuZCBQcm9kdWN0cyMxNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMC4wMC4wMC4wMCNQYXBlciBtYXRlcmlhbHMjMTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTQuMTAuMTUuMDAuMDAjUmF3IG1hdGVyaWFscyMxNC4xMC4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMC4xNS4wMS4wMCNQYXBlciBwdWxwIzE0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjAwLjAwLjAwI1BhcGVyIHByb2R1Y3RzIzE0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjAwLjAwI1ByaW50aW5nIGFuZCB3cml0aW5nIHBhcGVyIzE0LjExLjAwLjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjAxLjAwI09uaW9uIHNraW4gcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMDIuMDAjVmVsbHVtIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjAzLjAwI1BhcmNobWVudCBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4wNC4wMCNUcmFjdG9yIGZlZWQgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMDUuMDAjTWltZW9ncmFwaCBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4wNi4wMCNDb21wdXRlciBwcmludG91dCBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4wNy4wMCNQcmludGVyIG9yIGNvcGllciBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4wOC4wMCNGYWNzaW1pbGUgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMDkuMDAjU3RhdGlvbmVyeSMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4xMC4wMCNQbG90dGVyIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjExLjAwI1dyaXRpbmcgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTIuMDAjR3JhcGggcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTMuMDAjTGVkZ2VyIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjE0LjAwI1BhcGVyIHBhZHMgb3Igbm90ZWJvb2tzIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjE1LjAwI0NhbGN1bGF0b3Igb3IgY2FzaCByZWdpc3RlciBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4xNi4wMCNOb3RlYm9vayBmaWxsZXIgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTcuMDAjQnVzaW5lc3MgZm9ybXMjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTguMDAjSW5kZXggY2FyZHMjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTkuMDAjQ2FyZHN0b2NrIHBhcGVycyMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4yMC4wMCNCbG90dGVyIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjIxLjAwI0xhc2VyIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjIyLjAwI0lua2pldCBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4yMy4wMCNUcmFjaW5nIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjI0LjAwI0Zvb2xzY2FwIHNoZWV0cyMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4yNS4wMCNNdWx0aXB1cnBvc2UgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMjYuMDAjVGVsZXBob25lIG1lc3NhZ2UgcGFkcyBvciBib29rcyMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4yOC4wMCNNYWduZXQgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMjkuMDAjVGVsZXggcm9sbHMjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMzAuMDAjU2VsZiBhZGhlc2l2ZSBub3RlIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE2LjAwLjAwI05vdmVsdHkgcGFwZXIjMTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTYuMDEuMDAjR2lmdCB3cmFwcGluZyBwYXBlciBvciBiYWdzIG9yIGJveGVzIzE0LjExLjE2LjAwLjAwCi11bnNwc2M3IzE0LjExLjE2LjA0LjAwI0J1c2luZXNzIGNhcmRzIzE0LjExLjE2LjAwLjAwCi11bnNwc2M3IzE0LjExLjE2LjA1LjAwI0dyZWV0aW5nIG9yIG5vdGUgb3IgcG9zdCBjYXJkcyMxNC4xMS4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNi4wNi4wMCNBcnQgb3IgY3JhZnQgcGFwZXIjMTQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTYuMDcuMDAjUG9zdGVyIGJvYXJkcyMxNC4xMS4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNi4wOC4wMCNHaWZ0IGNlcnRpZmljYXRlIzE0LjExLjE2LjAwLjAwCi11bnNwc2M3IzE0LjExLjE2LjA5LjAwI0NvdmVyIHBhcGVyIzE0LjExLjE2LjAwLjAwCi11bnNwc2M3IzE0LjExLjE3LjAwLjAwI1BlcnNvbmFsIHBhcGVyIHByb2R1Y3RzIzE0LjExLjAwLjAwLjAwCi11bnNwc2M3IzE0LjExLjE3LjAxLjAwI0ZhY2lhbCB0aXNzdWVzIzE0LjExLjE3LjAwLjAwCi11bnNwc2M3IzE0LjExLjE3LjAyLjAwI1RvaWxldCBzZWF0IGNvdmVycyMxNC4xMS4xNy4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNy4wMy4wMCNQYXBlciB0b3dlbHMjMTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTcuMDQuMDAjVG9pbGV0IHRpc3N1ZSMxNC4xMS4xNy4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNy4wNS4wMCNQYXBlciBuYXBraW5zIG9yIHNlcnZpZXR0ZXMjMTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTcuMDYuMDAjUGFwZXIgdGFibGUgY2xvdGgjMTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTguMDAuMDAjQnVzaW5lc3MgdXNlIHBhcGVycyMxNC4xMS4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMS4xOC4wMS4wMCNUaWNrZXRzIG9yIHRpY2tldCByb2xscyMxNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMS4xOC4wMi4wMCNSZWNlaXB0cyBvciByZWNlaXB0IGJvb2tzIzE0LjExLjE4LjAwLjAwCi11bnNwc2M3IzE0LjExLjE4LjAzLjAwI1ZvdWNoZXJzIzE0LjExLjE4LjAwLjAwCi11bnNwc2M3IzE0LjExLjE4LjA0LjAwI0JpbGxzIG9yIGJpbGwgYm9va3MjMTQuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTguMDUuMDAjQ2hlY2tzIG9yIGNoZWNrIGJvb2tzIzE0LjExLjE4LjAwLjAwCi11bnNwc2M3IzE0LjEyLjAwLjAwLjAwI0luZHVzdHJpYWwgdXNlIHBhcGVycyMxNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNS4wMC4wMCNQYXBlcmJvYXJkIGFuZCBwYWNrYWdpbmcgcGFwZXJzIzE0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE0LjEyLjE1LjAxLjAwI0JsZWFjaGVkIHBhcGVyYm9hcmQjMTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTUuMDIuMDAjVW5ibGVhY2hlZCBwYXBlcmJvYXJkIzE0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE0LjEyLjE1LjAzLjAwI0NhcmRib2FyZCMxNC4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNS4wNC4wMCNQYWNrYWdpbmcgcGFwZXIjMTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTYuMDAuMDAjVGlzc3VlIHBhcGVycyMxNC4xMi4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wMS4wMCNVbmJsZWFjaGVkIGNyZXBlIHBhcGVycyMxNC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wMi4wMCNTZW1pIGJsZWFjaGVkIGNyZXBlIHBhcGVycyMxNC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wMy4wMCNXZXQgc3RyZW5ndGggdGlzc3VlIHBhcGVycyMxNC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wNC4wMCNBY2lkIGZyZWUgdGlzc3VlIHBhcGVycyMxNC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wNS4wMCNLcmFmdCB0aXNzdWUgcGFwZXIjMTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTcuMDAuMDAjTGFtaW5hdGVkIHBhcGVycyMxNC4xMi4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNy4wMS4wMCNQYXBlcnMgYm9uZGVkIHdpdGggZmlsbSMxNC4xMi4xNy4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNy4wMi4wMCNDeWxpbmRlciBwYXBlcnMgb3IgbXVsdGkgbGF5ZXIgaGVhdnl3ZWlnaHQgcGFwZXIjMTQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMDAuMDAjQ29hdGVkIHBhcGVycyMxNC4xMi4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wMS4wMCNDbGF5IGNvYXRlZCBwYXBlcnMjMTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMDIuMDAjUG9seWV0aHlsZW5lIGNvYXRlZCBwYXBlcnMjMTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMDMuMDAjUG9seWVzdGVyIGNvYXRlZCBwYXBlcnMjMTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMDQuMDAjU2lsaWNvbmUgY29hdGVkIHBhcGVycyMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wNS4wMCNMYXRleCB0cmVhdGVkIGNvYXRlZCBwYXBlciMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wNi4wMCNXYXhlZCBwYXBlciMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wNy4wMCNCdXRjaGVyIHBhcGVycyMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wOC4wMCNGcmVlemVyIHBhcGVyIzE0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzE0LjEyLjE4LjA5LjAwI01hc2tpbmcgcGFwZXIjMTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMTAuMDAjQ2FyYm9uIHBhcGVycyMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOS4wMC4wMCNOZXdzcHJpbnQgYW5kIG9mZnNldCBwYXBlcnMjMTQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTkuMDEuMDAjU3RhbmRhcmQgbmV3c3ByaW50IzE0LjEyLjE5LjAwLjAwCi11bnNwc2M3IzE0LjEyLjE5LjAyLjAwI0NvbG9yZWQgbmV3c3ByaW50IzE0LjEyLjE5LjAwLjAwCi11bnNwc2M3IzE0LjEyLjE5LjAzLjAwI0hpZ2ggYnJpZ2h0bmVzcyBuZXdzcHJpbnQjMTQuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTkuMDQuMDAjT2Zmc2V0IHBhcGVyIzE0LjEyLjE5LjAwLjAwCi11bnNwc2M3IzE0LjEyLjIwLjAwLjAwI1NwZWNpYWx0eSBjb2F0ZWQgcGFwZXJzIzE0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE0LjEyLjIwLjAxLjAwI0J1dGNoZXIgcGFwZXJzIzE0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzE0LjEyLjIwLjAyLjAwI0ZyZWV6ZXIgcGFwZXIjMTQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMjEuMDAuMDAjVW5jb2F0ZWQgYmFzZSBwYXBlcnMjMTQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMjEuMDEuMDAjU3VwZXIgY2FsZW5kYXJlZCBrcmFmdCBwYXBlciMxNC4xMi4yMS4wMC4wMAotdW5zcHNjNyMxNC4xMi4yMS4wMi4wMCNNYWNoaW5lIGZpbmlzaGVkIG9yIGdsYXplZCBrcmFmdCBwYXBlciMxNC4xMi4yMS4wMC4wMAotdW5zcHNjNyMxNC4xMi4yMS4wMy4wMCNOb24gdHJlYXRlZCB1bmNvYXRlZCBwYXBlciMxNC4xMi4yMS4wMC4wMAotdW5zcHNjNyMxNC4xMi4yMS4wNC4wMCNOb24gdHJlYXRlZCBjcmVwZSBwYXBlciMxNC4xMi4yMS4wMC4wMAotdW5zcHNjNyMxNC4xMi4yMS4wNS4wMCNMYXRleCB0cmVhdGVkIGNyZXBlIHBhcGVyIzE0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzE0LjEyLjIxLjA2LjAwI0xhdGV4IHRyZWF0ZWQgdW5jb2F0ZWQgcGFwZXIjMTQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMTUuMDAuMDAuMDAuMDAjRnVlbHMgYW5kIEZ1ZWwgQWRkaXRpdmVzIGFuZCBMdWJyaWNhbnRzIGFuZCBBbnRpIGNvcnJvc2l2ZSBNYXRlcmlhbHMjMTUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMDAuMDAuMDAjRnVlbHMjMTUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTUuMDAuMDAjUGV0cm9sZXVtIGFuZCBkaXN0aWxsYXRlcyMxNS4xMC4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4wMS4wMCNGdWVsIG9pbCMxNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4wMi4wMCNLZXJvc2VuZSMxNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4wMy4wMCNOYXBodGhhIzE1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEwLjE1LjA0LjAwI0F2aWF0aW9uIGZ1ZWwjMTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTUuMDUuMDAjRGllc2VsIGZ1ZWwjMTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTUuMDYuMDAjR2Fzb2xpbmUjMTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTUuMDcuMDAjUGV0cm9sIzE1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEwLjE1LjA4LjAwI0NydWRlIG9pbCMxNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4wOS4wMCNNYXJpbmUgZnVlbCMxNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4xMC4wMCNDb25kZW5zYXRlIzE1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEwLjE2LjAwLjAwI0NvYWwgYW5kIGxpZ25pdGUgYW5kIHBlYXQjMTUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTYuMDEuMDAjQ29hbCMxNS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNi4wMi4wMCNMaWduaXRlIzE1LjEwLjE2LjAwLjAwCi11bnNwc2M3IzE1LjEwLjE2LjAzLjAwI1BlYXQjMTUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTYuMDQuMDAjQ29rZSMxNS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNi4wNS4wMCNDaGFyY29hbCMxNS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMS4wMC4wMC4wMCNHYXNlb3VzIGZ1ZWxzIGFuZCBhZGRpdGl2ZXMjMTUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTEuMTUuMDAuMDAjR2FzZW91cyBmdWVscyMxNS4xMS4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4wMS4wMCNQcm9wYW5lIzE1LjExLjE1LjAwLjAwCi11bnNwc2M3IzE1LjExLjE1LjAyLjAwI01ldGhhbmUjMTUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTEuMTUuMDMuMDAjUHJvcHlsZW5lIzE1LjExLjE1LjAwLjAwCi11bnNwc2M3IzE1LjExLjE1LjA0LjAwI0V0aHlsZW5lIzE1LjExLjE1LjAwLjAwCi11bnNwc2M3IzE1LjExLjE1LjA1LjAwI0J1dGFuZSMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4wNi4wMCNBY2V0eWxlbmUjMTUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTEuMTUuMDcuMDAjV2F0ZXIgZ2FzIG9yIHByb2R1Y2VyIGdhcyMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4wOC4wMCNDb2FsIGdhcyMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4wOS4wMCNMaXF1aWZpZWQgcGV0cm9sZXVtIGdhcyMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4xMC4wMCNGdWVsIGFkZGl0aXZlcyMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNi4wMC4wMCNGdWVsIGFkZGl0aXZlcyMxNS4xMS4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNi4wMS4wMCNFdGhhbm9sIzE1LjExLjE2LjAwLjAwCi11bnNwc2M3IzE1LjExLjE2LjAyLjAwI01ldGhhbm9sIzE1LjExLjE2LjAwLjAwCi11bnNwc2M3IzE1LjEyLjAwLjAwLjAwI0x1YnJpY2FudHMgYW5kIG9pbHMgYW5kIGdyZWFzZXMgYW5kIGFudGkgY29ycm9zaXZlcyMxNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wMC4wMCNMdWJyaWNhdGluZyBwcmVwYXJhdGlvbnMjMTUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTUuMDEuMDAjRW5naW5lIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wMi4wMCNDdXR0aW5nIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wMy4wMCNHZWFyIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wNC4wMCNIeWRyYXVsaWMgb2lsIzE1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE1LjA1LjAwI1RyYW5zZm9ybWVyIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wNy4wMCNMaXRoaXVtIGdyZWFzZSMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wOC4wMCNUcmFuc21pc3Npb24gb2lsIzE1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE1LjA5LjAwI0JyYWtlIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4xMC4wMCNBbnRpZ2FsbGluZyMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4xMS4wMCNBc3NlbWJseSBwYXN0ZXMjMTUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTUuMTIuMDAjQW50aSBhZGhlc2l2ZXMjMTUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTUuMTMuMDAjR3JhcGhpdGUgbHVicmljYW50cyMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4xNC4wMCNTcHJheSBsdWJyaWNhbnRzIzE1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE1LjE1LjAwI0FudGkgc2VpemUgb3IgYW50aSBzdGFpbiBjb21wb3VuZHMjMTUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTUuMTYuMDAjTGVhayBzdG9wIzE1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE2LjAwLjAwI1dheGVzIzE1LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEyLjE2LjAxLjAwI1BhcmFmZmluIHdheCMxNS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNi4wMi4wMCNTZWFsaW5nIHdheCMxNS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNi4wMy4wMCNPbGVmaW4gd2F4IzE1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE3LjAwLjAwI1NwZWNpYWx0eSBsdWJyaWNhbnRzIzE1LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEyLjE3LjAxLjAwI1BldHJvbGF0dW0jMTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTguMDAuMDAjQW50aSBjb3Jyb3NpdmVzIzE1LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEyLjE4LjAxLjAwI01vaXN0dXJlIHJlcGVsbGVudCMxNS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNS4xMi4xOC4wMi4wMCNBbnRpIGNvcnJvc2lvbiBsdWJyaWNhbnQjMTUuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTguMDMuMDAjUnVzdCByZW1vdmVyIzE1LjEyLjE4LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE4LjA0LjAwI1J1c3QgcHJvb2ZpbmcgcHJlcGFyYXRpb24jMTUuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTguMDUuMDAjQW50aSB3ZWxkIHBhc3RlcyMxNS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNS4xMi4xOS4wMC4wMCNHcmVhc2VzIzE1LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEyLjE5LjAxLjAwI1NpbGljb25lIGdyZWFzZSMxNS4xMi4xOS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xOS4wMi4wMCNHcmVhc2UjMTUuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTkuMDMuMDAjVGVmbG9uIGdyZWFzZSMxNS4xMi4xOS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xOS4wNC4wMCNXb29sIGdyZWFzZSMxNS4xMi4xOS4wMC4wMAotdW5zcHNjNyMxNS4xMy4wMC4wMC4wMCNGdWVsIGZvciBudWNsZWFyIHJlYWN0b3JzIzE1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEzLjE1LjAwLjAwI051Y2xlYXIgZnVlbCMxNS4xMy4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMy4xNS4wMi4wMCNEZXBsZXRlZCB1cmFuaXVtIzE1LjEzLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEzLjE1LjAzLjAwI0VucmljaGVkIHVyYW5pdW0jMTUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTMuMTUuMDQuMDAjSXJpZGl1bSMxNS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMy4xNS4wNS4wMCNFbnJpY2hlZCBwbHV0b25pdW0jMTUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTMuMTUuMDYuMDAjRGVwbGV0ZWQgcGx1dG9uaXVtIzE1LjEzLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEzLjE2LjAwLjAwI0Zpc3Npb24gZnVlbCBhc3NlbWJsaWVzIzE1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEzLjE2LjAxLjAwI051Y2xlYXIgZnVlbCByb2QjMTUuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMDAuMDAuMDAuMDAjTWluaW5nIE1hY2hpbmVyeSBhbmQgQWNjZXNzb3JpZXMjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMDAuMDAuMDAjTWluaW5nIGFuZCBxdWFycnlpbmcgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTUuMDAuMDAjQ3V0dGluZyBlcXVpcG1lbnQjMjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTUuMDEuMDAjQ29udGludW91cyBtaW5pbmcgZXF1aXBtZW50IzIwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE1LjAyLjAwI0xvbmd3YWxsIHNoZWFycyMyMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNS4wMy4wMCNDb2FsIGN1dHRlcnMjMjAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTUuMDQuMDAjUm9jayBjdXR0ZXJzIzIwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE2LjAwLjAwI1NjcmVlbnMgYW5kIGZlZWRpbmcgZXF1aXBtZW50IzIwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEwLjE2LjAxLjAwI1NjcmVlbnMjMjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTYuMDIuMDAjRmVlZGVycyMyMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4wMC4wMCNDcnVzaGVycyBhbmQgYnJlYWtlcnMgYW5kIGdyaW5kZXJzIzIwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjAxLjAwI1JvY2sgY3J1c2hlcnMjMjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTcuMDIuMDAjUm9sbCBjcnVzaGVycyMyMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4wMy4wMCNDb25lIGNydXNoZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjA0LjAwI0d5cmF0b3J5IGNydXNoZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjA1LjAwI0ltcGFjdCBjcnVzaGVycyMyMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4wNi4wMCNKYXcgY3J1c2hlcnMjMjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTcuMDcuMDAjQ3J1c2hpbmcgcGxhbnRzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjA4LjAwI1JvZCBtaWxscyMyMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4wOS4wMCNCYWxsIG1pbGxzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjEwLjAwI1B1bHZlcml6aW5nIG1hY2hpbmVyeSMyMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4xMS4wMCNSb2NrIGJyZWFrZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjEyLjAwI0VhcnRoIGdyaW5kZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjEzLjAwI0N5Y2xvbmUgb3Igdm9ydGV4IGdyaW5kZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjExLjAwLjAwLjAwI1dlbGwgZHJpbGxpbmcgYW5kIG9wZXJhdGlvbiBlcXVpcG1lbnQjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTUuMDAuMDAjRHJpbGxpbmcgYW5kIGV4cGxvcmF0aW9uIGVxdWlwbWVudCMyMC4xMS4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNS4wMS4wMCNHYXMgd2VsbCBkcmlsbGluZyBlcXVpcG1lbnQjMjAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTUuMDIuMDAjT2lsIHdlbGwgZHJpbGxpbmcgZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjAzLjAwI1N1YnNlYSBzeXN0ZW0gZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjA0LjAwI1dhdGVyIHdlbGwgZHJpbGxpbmcgZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjA1LjAwI1VyYW5pdW0gZXhwbG9yYXRpb24gZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjA2LjAwI1dlbGxoZWFkIGVxdWlwbWVudCMyMC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNS4wNy4wMCNNdWQgb3Igd29ya292ZXIgZmx1aWQgZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjA4LjAwI1NlaXNtaWMgZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjAwLjAwI0RyaWxsaW5nIGFuZCBvcGVyYXRpb24gbWFjaGluZXJ5IzIwLjExLjAwLjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjAxLjAwI0JvcmluZyBvciBzaW5raW5nIG1hY2hpbmVyeSMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wMi4wMCNEb3duaG9sZSBhc3NlbWJseSBtYWNoaW5lcnkjMjAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTYuMDMuMDAjSGFtbWVyIGRyaWxscyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wNC4wMCNDcmF3bGVyIGRyaWxscyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wNS4wMCNSb2NrIGRyaWxscyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wNi4wMCNQbmV1bWF0aWMgdmlicmF0b3JzIzIwLjExLjE2LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjA3LjAwI1R1bm5lbGluZyBtYWNoaW5lcnkjMjAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTYuMDguMDAjU3RyaWtpbmcgaGFtbWVycyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wOS4wMCNTaW5rZXIgZHJpbGxzIzIwLjExLjE2LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjEwLjAwI1Nld2VyIGluc3BlY3Rpb24gbWFjaGluZXJ5IzIwLjExLjE2LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjExLjAwI1JvdGFyeSBkcmlsbHMjMjAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTYuMTIuMDAjRHJpbGxpbmcgcmlncyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xMy4wMCNMb25nIGhvbGUgZHJpbGxzIzIwLjExLjE2LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjE0LjAwI0luZHVzdHJpYWwgZHJpbGwgYml0cyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xNS4wMCNEcmlmdGVycyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xNi4wMCNEZXJyaWNrcyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xNy4wMCNEcmlsbGluZyBjYXJyaWFnZXMjMjAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTYuMTguMDAjRG93bmhvbGUgZmlzaGluZyBwb2xlcyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xOS4wMCNXZWxsIGRyaWxsaW5nIGJpdCBjb25lcyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNy4wMC4wMCNEcmlsbGluZyBhbmQgb3BlcmF0aW9uIGFjY2Vzc29yaWVzIzIwLjExLjAwLjAwLjAwCi11bnNwc2M3IzIwLjExLjE3LjAxLjAwI0F1ZGlvIHZpc3VhbCBpbnN0cnVtZW50cyBmb3Igd2VsbCBpbnNwZWN0aW9uIzIwLjExLjE3LjAwLjAwCi11bnNwc2M3IzIwLjExLjE3LjAyLjAwI1BhY2tlcnMgb3IgdHViaW5nIGFuY2hvcnMjMjAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTcuMDMuMDAjRHJpbGxpbmcgY2FzaW5ncyMyMC4xMS4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNy4wNC4wMCNEcmlsbGluZyBzY3JlZW5zIzIwLjExLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjAwLjAwLjAwI09pbCBhbmQgZ2FzIGRyaWxsaW5nIGFuZCBleHBsb3JhdGlvbiBlcXVpcG1lbnQjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMDAuMDAjQWNpZGl6aW5nIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMC4wMS4wMCNBY2lkaXppbmcgYmxlbmRpbmcgdW5pdHMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMDIuMDAjQWNpZGl6aW5nIGRlbnNpdHkgc2Vuc29ycyMyMC4xMi4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMC4wMy4wMCNBY2lkaXppbmcgcHVtcGluZyB1bml0cyMyMC4xMi4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMC4wNC4wMCNBY2lkaXppbmcgdW5pdHMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMDUuMDAjQWNpZGl6aW5nIGFpciBwaXBpbmcjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMDYuMDAjQWNpZGl6aW5nIGJhbGwgaW5qZWN0b3JzIzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjA3LjAwI0J1bGsgbGlxdWlkIGFjaWQgZXF1aXBtZW50IzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjA4LjAwI0FjaWRpemluZyBkcm9wIGJveGVzIzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjA5LjAwI0FjaWRpemluZyBmbG93IG1ldGVycyMyMC4xMi4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMC4xMC4wMCNBY2lkaXppbmcganVuY3Rpb24gYm94ZXMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMTEuMDAjQWNpZGl6aW5nIHByZXNzdXJlIHNlbnNvcnMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMTIuMDAjQWNpZGl6aW5nIHByb2Nlc3MgcGlwaW5nIzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjEzLjAwI0FjaWRpemluZyBzdHJhaWdodCBqb2ludHMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMTQuMDAjQWNpZGl6aW5nIHN3aXZlbHMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMTUuMDAjQWNpZGl6aW5nIHRyZWF0aW5nIGlyb25zIzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjE2LjAwI0FjaWRpemluZyB0cmVlIHNhdmVycyMyMC4xMi4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4wMC4wMCNDZW1lbnRpbmcgZXF1aXBtZW50IzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjAxLjAwI0JsZW5kaW5nIHVuaXRzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjAyLjAwI0JyaWRnZSBwbHVncyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4wMy4wMCNCdWxrIGxpcXVpZCBjZW1lbnQgZXF1aXBtZW50IzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjA0LjAwI0NlbWVudCBidWxrIG1hdGVyaWFsIGVxdWlwbWVudCMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4wNS4wMCNDZW1lbnQgZGVuc2l0eSBzZW5zb3JzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjA2LjAwI0NlbWVudCBmbG9hdGluZyBidWxrIHVuaXRzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjA3LjAwI0NlbWVudCBmbG9hdGluZyBlcXVpcG1lbnQgc3RhZ2UgdG9vbHMjMjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTEuMDguMDAjQ2VtZW50IGZsb2F0aW5nIGVxdWlwbWVudCB3aXBlciBwbHVncyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4wOS4wMCNDZW1lbnQgcHVtcGluZyB1bml0cyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4xMC4wMCNDZW1lbnQgcmV0YWluZXJzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjExLjAwI0NlbnRyYWxpemVycyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4xMi4wMCNFeHByZXNzIGxhdGNoIGNvdXBsZXJzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjEzLjAwI0Zsb2F0IGNvbGxhcnMjMjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTEuMTQuMDAjRmxvYXQgc2hvZXMjMjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTEuMTUuMDAjT2lsZmllbGQgY2VtZW50aW5nIHRvb2xzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjE2LjAwI1JldHJpZXZhYmxlIGNlbWVudGluZyBwYWNrZXJzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjE3LjAwI1NhZmV0eSBzbGluZ3MjMjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTEuMTguMDAjU3Vic2VhIGNlbWVudCBoZWFkcyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4xOS4wMCNTdXJmYWNlIGNlbWVudCBoZWFkcyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wMC4wMCNGcmFjdHVyaW5nIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wMS4wMCNCdWxrIGxpcXVpZCBmcmFjdHVyaW5nIGVxdWlwbWVudCMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wMi4wMCNGcmFjdHVyaW5nIGJ1bGsgcHJvcHBhbnQgZXF1aXBtZW50IzIwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEyLjAzLjAwI0ZyYWN0dXJpbmcgY29udHJvbCB1bml0cyMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wNC4wMCNGcmFjdHVyaW5nIGRlbnNpdHkgc2Vuc29ycyMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wNS4wMCNGcmFjdHVyaW5nIG1hbmlmb2xkIHVuaXRzIzIwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEyLjA2LjAwI0ZyYWN0dXJpbmcgcHJvcHBhbnQgY29udmV5aW5nIGVxdWlwbWVudCMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wNy4wMCNGcmFjdHVyaW5nIHB1bXBpbmcgdW5pdHMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMDguMDAjRnJhY3R1cmluZyBzbHVycnkgYmxlbmRpbmcgdW5pdHMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMDkuMDAjR2VsIGJsZW5kaW5nIHVuaXRzIzIwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEyLjEwLjAwI0ZyYWN0dXJpbmcgbWlzc2lsZXMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMTEuMDAjUHVtcCBpbnRlZ3JpdHkgbW9uaXRvcnMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMTIuMDAjRnJhY3R1cmluZyBzZXJ2aWNlIHBhY2tlcnMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMTMuMDAjU3RpbXVsYXRpb24gcHVtcGluZyB1bml0cyMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4wMC4wMCNTYW5kIGNvbnRyb2wgZXF1aXBtZW50IzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjAxLjAwI0JsYW5raW5nIHBsdWdzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjAyLjAwI0Zsb2F0ZXJzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjAzLjAwI0ZyYWMgcGFjayBzeXN0ZW1zIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjA0LjAwI0dyYXZlbCBwYWNrIHN5c3RlbXMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMDUuMDAjR3VpZGUgc2hvZXMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMDYuMDAjSG9vayB1cCBuaXBwbGVzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjA3LjAwI01ha2UgdXAgc3VicyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4wOC4wMCNQcm9kdWN0aW9uIHR1YmluZyBvdmVyc2hvdHMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMDkuMDAjU2FuZCBjb250cm9sIGJsYW5rcyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xMC4wMCNTYW5kIGNvbnRyb2wgYnVsayBsaXF1aWQgZXF1aXBtZW50IzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjExLjAwI1NhbmQgY29udHJvbCBidWxrIHByb3BwYW50IGVxdWlwbWVudCMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xMi4wMCNTYW5kIGNvbnRyb2wgZGVuc2l0eSBzZW5zb3JzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjEzLjAwI1NhbmQgY29udHJvbCBtYW5pZm9sZCB1bml0cyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xNC4wMCNTYW5kIGNvbnRyb2wgcHJvcHBhbnQgY29udmV5aW5nIGVxdWlwbWVudCMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xNS4wMCNTYW5kIGNvbnRyb2wgcHVtcGluZyB1bml0cyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xNi4wMCNTYW5kIGNvbnRyb2wgc2NyZWVucyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xNy4wMCNTYW5kIGNvbnRyb2wgc2x1cnJ5IGJsZW5kaW5nIHVuaXRzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjE4LjAwI1NhbmQgZGV0ZWN0b3JzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjE5LjAwI1NlYWwgYXNzZW1ibHkgbG9jYXRvcnMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMjAuMDAjU2hlYXIgam9pbnRzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjIxLjAwI1NsZWV2ZSBzaGlmdGluZyB0b29scyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4yMi4wMCNTbGlkaW5nIHNsZWV2ZXMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMjMuMDAjVmVsb2NpdHkgc3RyaW5ncyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4wMC4wMCNDb21wbGV0aW9uIHRvb2xzIGFuZCBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMDEuMDAjQmFsbCBjYXRjaGVyIHN1YnMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMDIuMDAjQmxhc3Qgam9pbnRzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjAzLjAwI0JsYXN0IG5pcHBsZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMDQuMDAjQ29tcGxldGlvbiBidWxsIHBsdWdzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjA1LjAwI0NpcmN1bGF0aW9uIHByb2R1Y3Rpb24gZGV2aWNlcyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4wNi4wMCNDb21wbGV0aW9uIHRlc3QgZXF1aXBtZW50IzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjA3LjAwI0NvbnRyb2wgbGluZSBwcm90ZWN0b3JzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjA4LjAwI0RlZmxlY3Rpb24gdG9vbHMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMDkuMDAjQ29tcGxldGlvbiBleHBhbnNpb24gam9pbnRzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjEwLjAwI0Zsb3cgY291cGxpbmdzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjExLjAwI0dhcyBsaWZ0IGVxdWlwbWVudCMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xMi4wMCNIYW5nZXIgbGFuZGluZyB0b29scyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xMy4wMCNDb21wbGV0aW9uIGh5ZHJhdWxpYyBwdW1wcyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xNC4wMCNIeWRyYXVsaWMgc2V0dGluZyB0b29scyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xNS4wMCNJbmplY3Rpb24gc3lzdGVtcyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xNi4wMCNMYW5kaW5nIG5pcHBsZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMTcuMDAjTGluZXIgaGFuZ2VycyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xOC4wMCNQYWNrZXIgcHVsbGluZyB0b29scyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xOS4wMCNQYWNrZXIgcnVubmluZyB0b29scyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4yMC4wMCNQcm9kdWN0aW9uIHBhY2tlcnMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjEuMDAjUHVtcCBkb3duIHRocm91Z2ggZmxvdyBsaW5lIGVxdWlwbWVudCMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4yMi4wMCNDb21wbGV0aW9uIHNhZmV0eSBqb2ludHMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjMuMDAjQ29tcGxldGlvbiBzZWFsIGFzc2VtYmxpZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjQuMDAjU2VhbCBib3JlcyBvciBwb2xpc2hlZCBib3JlcyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4yNS4wMCNTaWRlIHBvY2tldCBtYW5kcmVscyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4yNi4wMCNTbGlkaW5nIHNsZWV2ZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjcuMDAjU3Vic3VyZmFjZSBzYWZldHkgdmFsdmVzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjI4LjAwI1RyYXZlbCBqb2ludHMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjkuMDAjVHViaW5nIGFuY2hvcnMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMzAuMDAjVHdpbiBmbG93IGFzc2VtYmxpZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTUuMDAuMDAjQ29udmVudGlvbmFsIGRyaWxsaW5nIHRvb2xzIzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjAxLjAwI0Jsb3dvdXQgcHJldmVudGVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4wMi4wMCNCbG93b3V0IHByZXZlbnRlciBjb250cm9scyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4wMy4wMCNDYXNpbmcgc2NyYXBlcnMjMjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTUuMDQuMDAjRHJpbGwgY29sbGFycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4wNS4wMCNDb3JpbmcgZXF1aXBtZW50IzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjA2LjAwI0RyaWxsIHBpcGUgdGhyZWFkIHByb3RlY3RvcnMjMjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTUuMDcuMDAjRHJpbGwgcGlwZSB0b29sIGpvaW50cyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4wOC4wMCNEcmlsbCBwaXBlIzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjA5LjAwI0dhdWdlIHJpbmdzIzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjEwLjAwI0hvbGUgb3BlbmVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4xMS4wMCNIb2xlIHJlYW1lcnMjMjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTUuMTIuMDAjRmlzaGluZyBqYXJzIzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjEzLjAwI0Rvd25ob2xlIHNob2NrIGFic29yYmVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4xNC4wMCNEb3duaG9sZSBzdGFiaWxpemVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4xNS4wMCNEcmlsbGluZyBzdWJzIzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjE2LjAwI1RocnVzdGVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNi4wMC4wMCNEcmlsbGluZyBiaXRzIzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjAxLjAwI0ZpeGVkIGN1dHRlciBkcmlsbCBiaXRzIzIwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjAyLjAwI05hdHVyYWwgZGlhbW9uZCBkcmlsbCBiaXRzIzIwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjAzLjAwI05venpsZSBkcmlsbCBiaXRzIzIwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjA0LjAwI1BEQyBiaXRzIzIwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjA1LjAwI1JvbGxlciBjb25lIGJ1dHRvbiBpbnNlcnQgZHJpbGwgYml0cyMyMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNi4wNi4wMCNSb2xsZXIgc3RlZWwgdG9vdGggZHJpbGwgYml0cyMyMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNy4wMC4wMCNGaXNoaW5nIHRvb2xzIzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjE3LjAxLjAwI0J1bXBlciBzdWJzIzIwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE3LjAyLjAwI0Nhc2luZyBwYXRjaGVzIzIwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE3LjAzLjAwI0phciBib29zdGVycyMyMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNy4wNC4wMCNKdW5rIHN1YnMjMjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTcuMDUuMDAjTWlsbHMgb3IgYnVybmluZyBzaG9lcyMyMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNy4wNi4wMCNPdmVyc2hvdHMjMjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTcuMDcuMDAjT2lsZmllbGQgZmlzaGluZyBzcGVhcnMjMjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTcuMDguMDAjVW5zcGVjaWZpZWQgZmlzaGluZyB0b29scyMyMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xOC4wMC4wMCNEaXJlY3Rpb25hbCBkcmlsbGluZyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTguMDEuMDAjR2Vvc3RlZXJpbmcgdG9vbHMjMjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTguMDIuMDAjTXVkIG1vdG9ycyMyMC4xMi4xOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xOC4wMy4wMCNSb3Rhcnkgc3RlZXJhYmxlIHRvb2xzIzIwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE4LjA0LjAwI0RpcmVjdGlvbmFsIGRyaWxsaW5nIHN1cmZhY2UgY29udHJvbCBzeXN0ZW1zIzIwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE4LjA1LjAwI1N0cmFpZ2h0IGhvbGUgZGlyZWN0aW9uYWwgZHJpbGxpbmcgdG9vbHMjMjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDAuMDAjV2VsbCBtZWFzdXJlbWVudCBhbmQgbG9nZ2luZyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDEuMDAjQWNvdXN0aWMgdG9vbHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDIuMDAjRHJpbGxpbmcgb3IgbXVkIGNvbnRyb2wgaW5zdHJ1bWVudHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDMuMDAjRHJpbGxpbmcgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgdG9vbHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDQuMDAjRmxvdyBtZWFzdXJlbWVudCBlcXVpcG1lbnQjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDUuMDAjTnVjbGVhciBtYWduZXRpYyByZXNvbmFuY2UgdG9vbHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDYuMDAjTnVjbGVhciB0b29scyMyMC4xMi4xOS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xOS4wNy4wMCNQcm9kdWN0aW9uIGxvZ2dpbmcgZXF1aXBtZW50IzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE5LjA4LjAwI1Jlc2lzdGl2aXR5IHRvb2xzIzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE5LjA5LjAwI1N1cnZleWluZyBzeXN0ZW1zIzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE5LjEwLjAwI1RlbGVtZXRyeSBzeXN0ZW1zIzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE5LjExLjAwI1VsdHJhc29uaWMgdG9vbHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMTIuMDAjV2VsbCBsb2dnaW5nIGJvdHRvbSBob2xlIHByZXNzdXJlIGVxdWlwbWVudCMyMC4xMi4xOS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xOS4xMy4wMCNXZWxsIGxvZ2dpbmcgZG93bmhvbGUgdGVzdCBlcXVpcG1lbnQjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMTQuMDAjV2VsbCBsb2dnaW5nIHVuaXRzIzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjIwLjAwLjAwI0ZpeHR1cmluZyBhbmQgdGVzdCBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjAuMDEuMDAjRHJpZnQgYmFycyMyMC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMC4wMi4wMCNEcmlmdCBzbGVldmVzIzIwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIwLjAzLjAwI0RyaWZ0IHJhYmJpdHMjMjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjAuMDQuMDAjVGVzdCBmaXh0dXJlcyMyMC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMC4wNS4wMCNUZXN0IG5pcHBsZXMjMjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjAuMDYuMDAjVGVzdCBwbHVncyMyMC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMS4wMC4wMCNQZXJmb3JhdGluZyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMDEuMDAjQ2Fwc3VsZSBndW5zIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjAyLjAwI0Nhc2luZyBndW5zIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjAzLjAwI0RlcGxveW1lbnQgaGVhZHMjMjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMDQuMDAjUGVyZm9yYXRpbmcgZXhwbG9zaXZlcyMyMC4xMi4yMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMS4wNS4wMCNGaXJpbmcgaGVhZHMjMjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMDYuMDAjR3VuIGFkYXB0ZXJzIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjA3LjAwI0hpZ2ggc2hvdCBkZW5zaXR5IGd1bnMjMjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMDguMDAjUGVyZm9yYXRpbmcgYnVsbCBwbHVncyMyMC4xMi4yMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMS4wOS4wMCNQbHVnIHNldHRpbmcgdG9vbHMjMjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMTAuMDAjUGVyZm9yYXRpbmcgcG9zaXRpb25pbmcgZXF1aXBtZW50IzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjExLjAwI1NjYWxsb3BlZCBndW5zIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjEyLjAwI1RhbmRlbSBzdWJzIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjEzLjAwI1Rocm91Z2ggdHViaW5nIHBlcmZvcmF0aW9uIGd1biBhY2Nlc3NvcmllcyMyMC4xMi4yMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMS4xNC4wMCNUaHJvdWdoIHR1YmluZyBwZXJmb3JhdGlvbiBndW5zIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjE1LjAwI1VuZGVyIGJhbGFuY2UgdmVudCBzdWJzIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjAwLjAwI1dlbGwgdGVzdGluZyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMDEuMDAjRmxhcmUgYm9vbXMjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMDIuMDAjRmxhcmUgYnVybmVycyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4wMy4wMCNDYXNlZCBob2xlIHRlc3QgdG9vbHMjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMDQuMDAjQ2hva2UgbWFuaWZvbGRzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjA1LjAwI0RpdmVydGluZyBtYW5pZm9sZHMjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMDYuMDAjRmxvd2hlYWQgYmFza2V0cyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4wNy4wMCNGbG93aGVhZCBzd2l2ZWxzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjA4LjAwI0Zsb3doZWFkcyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4wOS4wMCNGb3JtYXRpb24gc2h1dCBpbiB0b29scyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4xMC4wMCNHYXMgZmxhcmVzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjExLjAwI011ZCBnYXMgYW5hbHl6ZXJzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjEyLjAwI09pbCBzYW1wbGVycyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4xMy4wMCNXZWxsIHRlc3Rpbmcgc2VwYXJhdG9ycyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4xNC4wMCNXZWxsIHRlc3Rpbmcgc3VyZmFjZSBwaXBpbmcjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMTUuMDAjU3VyZ2UgdGFua3MjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMTYuMDAjV2VsbCB0ZXN0aW5nIGRvd25ob2xlIHRvb2xzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjAwLjAwI1NsaWNrbGluZSBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDEuMDAjU2xpY2tsaW5lIGFkYXB0ZXIgaGVhZHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDIuMDAjU2xpY2tsaW5lIGJhY2tvZmZzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjAzLjAwI1NsaWNrbGluZSBiZWxsIGd1aWRlcyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4wNC4wMCNTbGlja2xpbmUgYmxpbmQgYm94ZXMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDUuMDAjU2xpY2tsaW5lIGJvdHRvbSBob2xlIHByZXNzdXJlIGVxdWlwbWVudCMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4wNi4wMCNTbGlja2xpbmUgY2FsaXBlciB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4wNy4wMCNTbGlja2xpbmUgY2VtZW50IGR1bXAgYmFpbGluZyBlcXVpcG1lbnQjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDguMDAjU2xpY2tsaW5lIGNoZW1pY2FsIGN1dHRlcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDkuMDAjU2xpY2tsaW5lIGNsYW1wIG9uIHRvb2wgc3RyaW5nIGNlbnRyYWxpemVycyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4xMC4wMCNTbGlja2xpbmUgY2xhbXAgb24gd2lyZWxpbmUgY2VudHJhbGl6ZXJzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjExLjAwI1NsaWNrbGluZSBjb2xsYXIgbG9jYXRvcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMTIuMDAjU2xpY2tsaW5lIGNvbGxlY3RvcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMTMuMDAjU2xpY2tsaW5lIGNvbGxpZGluZyB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4xNC4wMCNTbGlja2xpbmUgY3Jvc3NvdmVycyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4xNS4wMCNTbGlja2xpbmUgZGVwdGggbWVhc3VyZW1lbnQgZXF1aXBtZW50IzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjE2LjAwI1NsaWNrbGluZSBkZXdhciBmbGFza3MjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMTcuMDAjU2xpY2tsaW5lIGRpcG1ldGVyIHRvb2xzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjE4LjAwI1NsaWNrbGluZSBkaXJlY3Rpb25hbCB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4xOS4wMCNTbGlja2xpbmUgZ28gZGV2aWwgdG9vbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjAuMDAjU2xpY2tsaW5lIGhvbGUgcHVuY2hlcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjEuMDAjU2xpY2tsaW5lIGpldCBjdXR0ZXJzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjIyLjAwI1NsaWNrbGluZSBqdW5rIHNob3RzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjIzLjAwI1NsaWNrbGluZSBraWNrb3ZlciB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4yNC4wMCNTbGlja2xpbmUga251Y2tsZSBqb2ludHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjUuMDAjU2xpY2tsaW5lIGxlYWQgaW1wcmVzc2lvbiBibG9ja3MjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjYuMDAjU2xpY2tsaW5lIGxvY2F0b3IgbWFuZHJlbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjcuMDAjU2xpY2tsaW5lIGxvY2sgbWFuZHJlbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjguMDAjU2xpY2tsaW5lIGx1YnJpY2F0b3JzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjI5LjAwI1NsaWNrbGluZSBtZWNoYW5pY2FsIGJhaWxlcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMzAuMDAjU2xpY2tsaW5lIG1lY2hhbmljYWwgcGx1Z2JhY2tzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjMxLjAwI090aGVyIFNsaWNrbGluZSBUb29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4zMi4wMCNTbGlja2xpbmUgcGFyYWZmaW4gc2NyYXBwZXJzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjMzLjAwI1NsaWNrbGluZSByb3BlIHNvY2tldHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMzQuMDAjU2xpY2tsaW5lIHJ1bm5pbmcgb3IgcHVsbGluZyBwcm9uZ3MjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMzUuMDAjU2xpY2tsaW5lIHNldmVyaW5nIHRvb2xzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjM2LjAwI1NsaWNrbGluZSBzaGVhdmVzIG9yIGZsb29yIGJsb2NrcyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4zNy4wMCNTbGlja2xpbmUgYm90dG9tIGhvbGUgcHJlc3N1cmUgZXF1aXBtZW50IzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjM4LjAwI1NsaWNrbGluZSBwdWxsaW5nIHRvb2wgYWNjZXNzb3JpZXMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMzkuMDAjU2xpY2tsaW5lIHB1bGxpbmcgdG9vbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDAuMDAjU2xpY2tsaW5lIHJ1bm5pbmcgdG9vbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDEuMDAjU2xpY2tsaW5lIHVuaXRzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjQyLjAwI1NsaWNrbGluZSB3aXJlIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjQzLjAwI1NsaWNrbGluZSBzb25pYyB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy40NC4wMCNTbGlja2xpbmUgc3BhY2VyIGJhcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDUuMDAjU2xpY2tsaW5lIHN3YWdlcyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy40Ni4wMCNTbGlja2xpbmUgdGVuc2lvbiBkZXZpY2VzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjQ3LjAwI1NsaWNrbGluZSB0dWJpbmcgcGx1Z3MjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDguMDAjU2xpY2tsaW5lIHVsdHJhc29uaWMgdG9vbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDkuMDAjV2lyZWxpbmUgR3JhYnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNTAuMDAjV2lyZWxpbmUgSmFycyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy41MS4wMCNXaXJlbGluZSBTY3JhcGVycyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy41Mi4wMCNXaXJlbGluZSBTcGVhciMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy41My4wMCNXaXJlbGluZSBTdGVtcyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy41NC4wMCNXaXJlbGluZSBWYWx2ZXMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMDAuMDAjUHJvZHVjdGlvbiBzeXN0ZW1zIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNC4wMS4wMCNDYWJsZSB0aHVtcGVycyMyMC4xMi4yNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNC4wMi4wMCNPaWxmaWVsZCBwcm9kdWN0aW9uIGV2YXBvcmF0b3JzIzIwLjEyLjI0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI0LjAzLjAwI0hpcG90IHRlc3RlcnMjMjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMDQuMDAjT2lsZmllbGQgbGFwcGluZyBtYWNoaW5lcyMyMC4xMi4yNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNC4wNS4wMCNNb3RvciBlbmQgbGlmdHMjMjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMDYuMDAjT2lsIGRpZWxlY3RyaWMgdGVzdGVycyMyMC4xMi4yNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNC4wNy4wMCNPaWwgdmFjdXVtIGZpbGxpbmcgdW5pdHMjMjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMDguMDAjT2lsZmllbGQgcHJvZHVjdGlvbiBzaGFmdCBzdHJhaWdodGVuZXJzIzIwLjEyLjI0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI0LjA5LjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gc3Bvb2xlcnMjMjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMTAuMDAjVmlicmF0aW9uIGFuYWx5emVycyMyMC4xMi4yNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wMC4wMCNDb2lsZWQgdHViaW5nIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wMS4wMCNCbGFzdGVyIHRvb2xzIzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjAyLjAwI0NvaWxlZCB0dWJpbmcgdHJ1Y2sgY3JhbmUgdW5pdHMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMDMuMDAjQ29pbGVkIHR1YmluZyB1bml0cyMyMC4xMi4yNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wNC4wMCNDb2lsZWQgdHViaW5nIGhvc2UgcGFja2FnZXMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMDUuMDAjQ29pbGVkIHR1YmluZyBpbmZsYXRhYmxlIHN5c3RlbXMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMDYuMDAjQ29pbGVkIHR1YmluZyBpbmplY3RvciBoZWFkcyMyMC4xMi4yNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wNy4wMCNDb2lsZWQgdHViaW5nIGxpZnRpbmcgZXF1aXBtZW50IzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjA4LjAwI09wZXJhdG9yIGhvdXNlcyMyMC4xMi4yNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wOS4wMCNDb2lsZWQgdHViaW5nIHBvd2VyIHBhY2tzIzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjEwLjAwI0NvaWxlZCB0dWJpbmcgcmVlbHMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMTEuMDAjQ29pbGVkIHR1YmluZyBzcG9vbGluZyByZWVscyMyMC4xMi4yNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4xMi4wMCNUdWJpbmcgZ3VpZGVzIzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjEzLjAwI1dlbGxoZWFkIGhvb2t1cHMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMTQuMDAjV2VsbGhlYWQgc3VwcG9ydCBzdHJ1Y3R1cmVzIzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjE1LjAwI09pbGZpZWxkIGNvaWxlZCB0dWJpbmcjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMDAuMDAjU2Vpc21pYyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMDEuMDAjU2Vpc21pYyBhbmFsb2cgc2Vuc29ycyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wMi4wMCNTZWlzbWljIGFycmF5cyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wMy4wMCNTZWlzbWljIHN0cmVhbWVyIGNhYmxlIGJpcmRzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjA0LjAwI1NlaXNtaWMgZHJpbGwgdGFua2VycyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wNS4wMCNTZWlzbWljIGdlb3Bob25lcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wNi4wMCNTZWlzbWljIGdyYXZpdHkgc3lzdGVtcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wNy4wMCNTZWlzbWljIGd1biB3aW5jaCBzeXN0ZW1zIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjA4LjAwI1NlaXNtaWMgaHlkcm9waG9uZXMjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMDkuMDAjU2Vpc21pYyBpbXB1bHNlIHNvdXJjZXMjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMTAuMDAjU2Vpc21pYyBtYXJpbmUgc3RyZWFtZXIgY2FibGVzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjExLjAwI1NlaXNtaWMgb2NlYW4gYm90dG9tIGNhYmxlcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4xMi4wMCNTZWlzbWljIG1hZ25ldGljIHN5c3RlbXMjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMTMuMDAjU2Vpc21pYyBwb3NpdGlvbmluZyBlcXVpcG1lbnQjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMTQuMDAjU2Vpc21pYyByYW1zIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjE1LjAwI1NlaXNtaWMgcmVjZWl2ZXJzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjE2LjAwI1NlaXNtaWMgcmVmcmFjdGlvbiBzeXN0ZW1zIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjE3LjAwI1NlaXNtaWMgc291cmNlIGNvbnRyb2xsZXJzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjE4LjAwI1NlaXNtaWMgc3Bvb2xpbmcgZGV2aWNlcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4xOS4wMCNTZWlzbWljIHRvdyBibG9ja3MjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMjAuMDAjU2Vpc21pYyB0b3cgcG9pbnRzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjIxLjAwI1NlaXNtaWMgdmlicmF0b3JzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjIyLjAwI1NlaXNtaWMgcmVjb3JkaW5nIHN5c3RlbXMjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMjMuMDAjU2Vpc21pYyBkYXRhIHByb2Nlc3Npbmcgc3lzdGVtcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNy4wMC4wMCNPaWwgY291bnRyeSB0dWJ1bGFyIGdvb2RzIzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjI3LjAxLjAwI09pbCBjb3VudHJ5IGNhc2luZyMyMC4xMi4yNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNy4wMi4wMCNPaWwgY291bnRyeSBjb3VwbGluZ3MjMjAuMTIuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjcuMDMuMDAjT2lsIGNvdW50cnkgcHVwIGpvaW50cyMyMC4xMi4yNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNy4wNC4wMCNPaWwgY291bnRyeSB0dWJpbmcjMjAuMTIuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjcuMDUuMDAjT2lsIGNvdW50cnkgcGlwZSBjb2F0aW5ncyMyMC4xMi4yNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNy4wNi4wMCNDb25kdWN0b3IgY2FzaW5nIzIwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI3LjA3LjAwI0NvbmR1Y3RvciBjYXNpbmcgcnVubmluZyBlcXVpcG1lbnQjMjAuMTIuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjcuMDguMDAjRHJpbGwgcGlwZSBjcm9zc292ZXJzIzIwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI3LjA5LjAwI09pbCBjb3VudHJ5IHRocmVhZCBwcm90ZWN0b3JzIzIwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjAwLjAwI0RyaWxsaW5nIGFuZCB3b3Jrb3ZlciByaWdzIGFuZCBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMDEuMDAjTXVkIGFnaXRhdG9ycyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4wMi4wMCNNdWQgdGFua3MjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMDMuMDAjQWlyIGRyaWxsaW5nIGVxdWlwbWVudCMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4wNC4wMCNCYXJnZSByaWdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjA1LjAwI0Jsb3cgb3V0IHByZXZlbnRlcnMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMDYuMDAjRmx1aWQgZGl2ZXJ0ZXJzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjA3LjAwI0RyYXd3b3JrcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4wOC4wMCNEcmlsbCBmbG9vciBlcXVpcG1lbnQjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMDkuMDAjRHJpbGwgc3dpdmVscyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4xMC4wMCNEcmlsbGluZyByaWcgc2hpcHMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMTEuMDAjRHJpbGwgcmlnIGVsZXZhdG9ycyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4xMi4wMCNEcmlsbCByaWcgYmFpbHMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMTMuMDAjSHlkcmF1bGljIHdvcmtvdmVyIHVuaXRzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjE0LjAwI0RyaWxsIHJpZyBqYWNraW5nIHN5c3RlbXMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMTUuMDAjSmFja3VwIG1hcmluZSBkcmlsbGluZyByaWdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjE2LjAwI0tlbGx5IGJ1c2hpbmdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjE3LjAwI0tlbGx5IHZhbHZlcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4xOC4wMCNLZWxseSB3aXBlcnMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMTkuMDAjS2VsbHlzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjIwLjAwI0xhbmQgZHJpbGxpbmcgcmlncyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4yMS4wMCNNdWQgY2xlYW5pbmcgZXF1aXBtZW50IzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjIyLjAwI011ZCBtYW5pZm9sZHMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMjMuMDAjTXVkIG1peGVycyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4yNC4wMCNQaXBlIGhhbmRsaW5nIGVxdWlwbWVudCMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4yNS4wMCNQbGF0Zm9ybSBkcmlsbGluZyByaWdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjI2LjAwI1Bvd2VyIHN3aXZlbCBvciB0b3AgZHJpdmVzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjI3LjAwI1JpZyBza2lkcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4yOC4wMCNEcmlsbCByaWcgcmlzZXJzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjI5LjAwI0RyaWxsIHJpZyByb3RhcnkgdGFibGVzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjMwLjAwI1NlbGYgZWxldmF0aW5nIHdvcmtvdmVyIHBsYXRmb3JtcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4zMS4wMCNTZW1pIHN1Ym1lcnNpYmxlIGRyaWxsaW5nIHJpZ3MjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMzIuMDAjRHJpbGwgZmxvb3Igc2xpcHMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMzMuMDAjTWFrZXVwIHRvbmdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjM0LjAwI0lyb24gcm91Z2huZWNrcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4zNS4wMCNUcmF2ZWxpbmcgZXF1aXBtZW50IzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjM2LjAwI1dvcmtvdmVyIGJvYXRzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjM3LjAwI1dvcmtvdmVyIHJpZ3MjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjkuMDAuMDAjU3VyZmFjZSBkYXRhIGxvZ2dpbmcgZXF1aXBtZW50IzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjI5LjAxLjAwI1N1cmZhY2UgZGF0YSBsb2dnaW5nIGNvbmR1aXRzIzIwLjEyLjI5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI5LjAyLjAwI1N1cmZhY2UgZGF0YSBsb2dnaW5nIHNlbnNvcnMjMjAuMTIuMjkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjkuMDMuMDAjU3VyZmFjZSBkYXRhIGxvZ2dpbmcgdW5pdHMjMjAuMTIuMjkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMzAuMDAuMDAjTXVsdGlsYXRlcmFsIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4zMC4wMS4wMCNNdWx0aWxhdGVyYWwgY2FzaW5nIzIwLjEyLjMwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjMwLjAyLjAwI011bHRpbGF0ZXJhbCBqdW5jdGlvbnMjMjAuMTIuMzAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMzAuMDMuMDAjTXVsdGlsYXRlcmFsIHBhY2tlcnMjMjAuMTIuMzAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMDAuMDAuMDAjT2lsIGFuZCBnYXMgZHJpbGxpbmcgYW5kIG9wZXJhdGlvbiBtYXRlcmlhbHMjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTAuMDAuMDAjRHJpbGxpbmcgbXVkIGFuZCBtYXRlcmlhbHMjMjAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTAuMDEuMDAjRmlsdHJhdGlvbiBjb250cm9sIGFnZW50cyMyMC4xMy4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMC4wMi4wMCNGbHVpZCBzcGFjZXJzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjAzLjAwI0xvc3QgY2lyY3VsYXRpb24gYWdlbnRzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjA0LjAwI09pbCBiYXNlZCBtdWRzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjA1LjAwI1JhdGUgb2YgcGVuZXRyYXRpb24gZW5oYW5jZXJzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjA2LjAwI1Nwb3R0aW5nIGZsdWlkcyMyMC4xMy4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMC4wNy4wMCNTeW50aGV0aWMgYmFzZWQgbXVkcyMyMC4xMy4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMC4wOC4wMCNNdWQgdGhpbm5pbmcgYWdlbnRzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjA5LjAwI1dhdGVyIGJhc2VkIG11ZHMjMjAuMTMuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTAuMTAuMDAjTXVkIHdlaWdodGluZyBhZ2VudHMjMjAuMTMuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTEuMDAuMDAjV2VsbCBmcmFjdHVyaW5nIHByb3BwYW50cyMyMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMS4wMS4wMCNDZXJhbWljIHByb3BwYW50cyMyMC4xMy4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMS4wMi4wMCNGcmFjdHVyaW5nIHNhbmRzIzIwLjEzLjExLjAwLjAwCi11bnNwc2M3IzIwLjEzLjExLjAzLjAwI1Jlc2luIGNvYXRlZCBjZXJhbWljIHByb3BwYW50cyMyMC4xMy4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMS4wNC4wMCNSZXNpbiBjb2F0ZWQgZnJhY3R1cmluZyBzYW5kcyMyMC4xMy4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMS4wNS4wMCNSZXNpbiBjb2F0ZWQgc2ludGVyZWQgYmF1eGl0ZXMjMjAuMTMuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTEuMDYuMDAjU2ludGVyZWQgYmF1eGl0ZXMjMjAuMTMuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTIuMDAuMDAjQ29tcGxldGlvbiBmbHVpZHMjMjAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTIuMDEuMDAjRGl2YWxlbnQgYnJpbmVzIzIwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEyLjAyLjAwI01vbm92YWxlbnQgYnJpbmVzIzIwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEzLjAwLjAwI09pbCB3ZWxsIGNlbWVudCMyMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wMS4wMCNPaWwgd2VsbCBidWxrIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wMi4wMCNPaWwgd2VsbCBjbGFzcyBhIHR5cGUgSSBjZW1lbnQjMjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTMuMDMuMDAjT2lsIHdlbGwgY2xhc3MgYiB0eXBlIElJIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wNC4wMCNPaWwgd2VsbCBjbGFzcyBjIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wNS4wMCNPaWwgd2VsbCBjbGFzcyBnIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wNi4wMCNPaWwgd2VsbCBjbGFzcyBoIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wNy4wMCNPaWwgd2VsbCBsaWdodHdlaWdodCBjZW1lbnQjMjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTMuMDguMDAjT2lsIHdlbGwgc3RhbmRhcmQgZmluZSB0eXBlIElJSSBjZW1lbnQjMjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMDAuMDAuMDAjT2lsIGFuZCBnYXMgb3BlcmF0aW5nIGFuZCBwcm9kdWN0aW9uIGVxdWlwbWVudCMyMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wMC4wMCNXZWxsaGVhZCBlcXVpcG1lbnQjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTAuMDEuMDAjV2VsbGhlYWQgYWN0dWF0b3JzIzIwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjEwLjAyLjAwI1dlbGxoZWFkIGJlYW0gcHVtcHMjMjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTAuMDMuMDAjV2VsbGhlYWQgZmxvdyBsaW5lcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wNC4wMCNXZWxsaGVhZCBnYXRlIHZhbHZlcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wNS4wMCNXZWxsaGVhZCBwcm9kdWN0aW9uIGNob2tlcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wNi4wMCNXZWxsaGVhZCBzdWIgc3VyZmFjZSBmbG93IG9yIGNocmlzdG1hcyB0cmVlcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wNy4wMCNXZWxsaGVhZCBzdXJmYWNlIGZsb3cgb3IgY2hyaXN0bWFzIHRyZWVzIzIwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjEwLjA4LjAwI1dlbGxoZWFkIHN1cmZhY2Ugc2FmZXR5IHZhbHZlcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMS4wMC4wMCNDaGVtaWNhbCBpbmplY3Rpb24gc3lzdGVtcyMyMC4xNC4wMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMS4wMS4wMCNQYXJhZmZpbiBpbmplY3Rpb24gc3lzdGVtcyMyMC4xNC4xMS4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMi4wMC4wMCNEZXNhbmRpbmcgZXF1aXBtZW50IzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjEyLjAxLjAwI1Byb2R1Y3Rpb24gZGVzYW5kaW5nIGVxdWlwbWVudCMyMC4xNC4xMi4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMy4wMC4wMCNEb3duaG9sZSBqZXQgcHVtcHMgYW5kIGFuY2hvcnMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTMuMDEuMDAjRG93bmhvbGUgamV0IHB1bXBzIzIwLjE0LjEzLjAwLjAwCi11bnNwc2M3IzIwLjE0LjE0LjAwLjAwI0Rvd25ob2xlIHByb2R1Y3Rpb24gYWNjZXNzb3JpZXMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTQuMDEuMDAjVHViaW5nIHN0b3BzIzIwLjE0LjE0LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE1LjAwLjAwI0Rvd25ob2xlIHB1bXBzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjE1LjAxLjAwI0VsZWN0cmljIGRvd25ob2xlIHB1bXBzIzIwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE2LjAwLjAwI0V4cG9ydCBwdW1wcyMyMC4xNC4wMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xNi4wMS4wMCNQbmV1bWF0aWMgZXhwb3J0IHB1bXBzIzIwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjAwLjAwI09mZnNob3JlIHByb2R1Y3Rpb24gYW5kIHN0b3JhZ2UgcGxhdGZvcm1zIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjAxLjAwI0ZpeGVkIG9mZnNob3JlIHByb2R1Y3Rpb24gcGxhdGZvcm1zIzIwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjAyLjAwI0Zsb2F0aW5nIG9mZnNob3JlIHByb2R1Y3Rpb24gcGxhdGZvcm1zIzIwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjAzLjAwI0Zsb2F0aW5nIG9mZnNob3JlIHN0b3JhZ2UgcGxhdGZvcm1zIzIwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjA0LjAwI0Zsb2F0aW5nIG9mZnNob3JlIHRlbnNpb24gbGVnICBwcm9kdWN0aW9uIHBsYXRmb3JtcyMyMC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xNC4xNy4wNS4wMCNGbG9hdGluZyBvZmZzaG9yZSB0ZW5zaW9uIGxlZyBzdG9yYWdlIHBsYXRmb3JtcyMyMC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xNC4xOC4wMC4wMCNXZWxsIHByb2R1Y3Rpb24gZmxvdyBtZWFzdXJlbWVudCBtZXRlcnMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTguMDEuMDAjV2VsbCBwcm9kdWN0aW9uIGdhcyB0dXJiaW5lIG1ldGVycyMyMC4xNC4xOC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xOS4wMC4wMCNHYXMgdHJlYXRpbmcgZXF1aXBtZW50IzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjE5LjAxLjAwI09pbCB3ZWxsIHByb2R1Y3Rpb24gZ2FzIHRyZWF0aW5nIGVxdWlwbWVudCMyMC4xNC4xOS4wMC4wMAotdW5zcHNjNyMyMC4xNC4yMC4wMC4wMCNHbHljb2wgcmVnZW5lcmF0b3JzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjIwLjAxLjAwI09pbCB3ZWxsIGdseWNvbCByZWdlbmVyYXRvcnMjMjAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjEuMDAuMDAjSGVhdGVyIHRyZWF0ZXJzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjIxLjAxLjAwI09pbCB3ZWxsIGhlYXRlciB0cmVhdGVycyMyMC4xNC4yMS4wMC4wMAotdW5zcHNjNyMyMC4xNC4yMi4wMC4wMCNMaW5lIGhlYXRlcnMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjIuMDEuMDAjRWxlY3RyaWNhbCBsaW5lIGhlYXRlcnMjMjAuMTQuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjMuMDAuMDAjUHJvZHVjdGlvbiBpbmplY3Rpb24gc2tpZHMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjMuMDEuMDAjUG5ldW1hdGljIG1ldGhhbm9sIGluamVjdGlvbnMgc2tpZHMjMjAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjQuMDAuMDAjT2NlYW4gZmxvb3IgZXF1aXBtZW50IzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjI0LjAxLjAwI1N1YnNlYSBwcm9kdWN0aW9uIHdlbGxoZWFkIGVxdWlwbWVudCMyMC4xNC4yNC4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNS4wMC4wMCNQcm9kdWNlZCB3YXRlciB0cmVhdGluZyBlcXVpcG1lbnQjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjUuMDEuMDAjT2lsIGZpZWxkIHdhdGVyIG9pbCBjZW50cmlmdWdlcyMyMC4xNC4yNS4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNi4wMC4wMCNQcm9kdWN0aW9uIGNvbnRyb2wgc3lzdGVtIGluc3RydW1lbnRhdGlvbiMyMC4xNC4wMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNi4wMS4wMCNXaXJlbGVzcyBwcm9kdWN0aW9uIGNvbnRyb2wgc3lzdGVtcyMyMC4xNC4yNi4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNy4wMC4wMCNQdW1waW5nIHVuaXRzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjI3LjAxLjAwI1N1Y2tlciByb2QgcHVtcCBqYWNrcyMyMC4xNC4yNy4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNy4wMi4wMCNSb2QgcHVtcHMjMjAuMTQuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjcuMDMuMDAjTWVjaGFuaWNhbCByb2QgcHVtcHMjMjAuMTQuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjguMDAuMDAjUHJvZHVjdGlvbiBzZXBhcmF0b3JzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjI4LjAxLjAwI09pbCB3YXRlciBzZXBhcmF0b3JzIzIwLjE0LjI4LjAwLjAwCi11bnNwc2M3IzIwLjE0LjI5LjAwLjAwI1N0b3JhZ2UgdmVzc2VscyBhbmQgdGFua3MjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjkuMDEuMDAjT2lsIHN0b3JhZ2UgdGFua3MjMjAuMTQuMjkuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMzAuMDAuMDAjU3Vja2VyIHJvZHMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMzAuMDEuMDAjQWxsb3kgc3RlZWwgc3Vja2VyIHJvZHMjMjAuMTQuMzAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMzAuMDIuMDAjUG9ueSByb2RzIzIwLjE0LjMwLjAwLjAwCi11bnNwc2M3IzIxLjAwLjAwLjAwLjAwI0Zhcm1pbmcgYW5kIEZpc2hpbmcgYW5kIEZvcmVzdHJ5IGFuZCBXaWxkbGlmZSBNYWNoaW5lcnkgYW5kIEFjY2Vzc29yaWVzIzIxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjAwLjAwLjAwI0FncmljdWx0dXJhbCBhbmQgZm9yZXN0cnkgYW5kIGxhbmRzY2FwZSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCMyMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wMC4wMCNBZ3JpY3VsdHVyYWwgbWFjaGluZXJ5IGZvciBzb2lsIHByZXBhcmF0aW9uIzIxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjAxLjAwI1Bsb3VnaHMjMjEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTUuMDIuMDAjSGFycm93cyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wMy4wMCNDdWx0aXZhdG9ycyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wNC4wMCNXZWVkZXJzIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjA1LjAwI0hvZWluZyBtYWNoaW5lcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wNi4wMCNHcmFkZXJzIG9yIGxhbmQgbGV2ZWxlcnMjMjEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTUuMDcuMDAjQWdyaWN1bHR1cmFsIHJvbGxlcnMjMjEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTUuMDguMDAjUm9sbGVycyBmb3IgbGF3biBvciBzcG9ydHMgZ3JvdW5kcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wOS4wMCNUcmVuY2hlciBkcmFpbmFnZSBtYWNoaW5lIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjEwLjAwI0lycmlnYXRpb24gcGlwZXMgb3IgdHViZXMjMjEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTUuMTEuMDAjSXJyaWdhdGlvbiB0cmlja2xlcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4xMi4wMCNJcnJpZ2F0aW9uIG92ZXJoZWFkcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4xMy4wMCNEaXNrcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4xNC4wMCNTdWJzb2lsZXJzIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjE1LjAwI0hlZGdlIGNsaXBwZXJzIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjE2LjAwI0RpYmJsZXJzIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjAwLjAwI0FncmljdWx0dXJhbCBtYWNoaW5lcnkgZm9yIHBsYW50aW5nIGFuZCBzZWVkaW5nIzIxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjAxLjAwI1BsYW50ZXJzIzIxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjAyLjAwI1RyYW5zcGxhbnRlcnMjMjEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTYuMDMuMDAjR3JhaW4gZHJpbGxzIzIxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjA0LjAwI1NlZWQgZHJpbGxzIzIxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjA1LjAwI1NlZWQgdHJlYXRpbmcgZXF1aXBtZW50IzIxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjA2LjAwI0hvbGUgZGlnZ2VycyMyMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNy4wMC4wMCNBZ3JpY3VsdHVyYWwgbWFjaGluZXJ5IGZvciBoYXJ2ZXN0aW5nIzIxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjE3LjAxLjAwI01vd2VycyMyMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNy4wMi4wMCNIYXltYWtpbmcgbWFjaGluZXJ5IzIxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE3LjAzLjAwI0hhcnZlc3RlcnMjMjEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTcuMDQuMDAjQ29tYmluZSBoYXJ2ZXN0ZXJzIzIxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE3LjA1LjAwI1RocmVzaGluZyBtYWNoaW5lcyMyMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOC4wMC4wMCNEaXNwZXJzaW5nIGFuZCBzcHJheWluZyBhcHBsaWFuY2VzIGZvciBhZ3JpY3VsdHVyZSMyMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOC4wMS4wMCNTcHJheWVycyMyMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOC4wMi4wMCNEdXN0ZXJzIzIxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE4LjAzLjAwI1dhdGVyIHNwcmlua2xlcnMjMjEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTguMDQuMDAjRmVydGlsaXplciBzcHJlYWRlcnMgb3IgZGlzdHJpYnV0b3JzIzIxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE4LjA1LjAwI0ZvZyBvciBtaXN0IGdlbmVyYXRvcnMjMjEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTguMDYuMDAjQ29tcG9zdGVyIzIxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE4LjA3LjAwI1BvbGxpbmF0aW9uIGVxdWlwbWVudCBvciBzdXBwbGllcyMyMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOC4wOC4wMCNGcm9zdCBwcm90ZWN0aW9uIGVxdWlwbWVudCMyMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOS4wMC4wMCNQb3VsdHJ5IGFuZCBsaXZlc3RvY2sgZXF1aXBtZW50IzIxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjE5LjAxLjAwI01pbGtpbmcgbWFjaGluZXMjMjEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTkuMDIuMDAjQW5pbWFsIGh1c2JhbmRyeSBlcXVpcG1lbnQjMjEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTkuMDMuMDAjSW5jdWJhdG9ycyBvciBicm9vZGVycyBmb3IgcG91bHRyeSMyMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOS4wNC4wMCNGZWVkIG1peGVycyMyMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOS4wNS4wMCNMaXZlc3RvY2sgaWRlbnRpZmljYXRpb24gZXF1aXBtZW50IzIxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE5LjA2LjAwI0VnZyBpbnNwZWN0aW9uIG9yIGNvbGxlY3RpbmcgZXF1aXBtZW50IzIxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE5LjA3LjAwI0FuaW1hbCB3YXRlcmluZyBtYWNoaW5lcyMyMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOS4wOC4wMCNNaWxrIGNvb2xpbmcgdGFua3MjMjEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTkuMDkuMDAjQW5pbWFsIHNoZWFyaW5nIG9yIGNsaXBwaW5nIGVxdWlwbWVudCMyMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMC4wMC4wMCNBZ3JpY3VsdHVyYWwgbWFjaGluZXJ5IGZvciBjbGVhbmluZyBhbmQgc29ydGluZyBhbmQgZ3JhZGluZyMyMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMC4wMS4wMCNDbGVhbmluZyBtYWNoaW5lcyBmb3Igc2VlZCBvciBncmFpbiBvciBkcmllZCBsZWd1bWlub3VzIHZlZ2V0YWJsZXMjMjEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjAuMDIuMDAjU29ydGluZyBtYWNoaW5lcyBmb3Igc2VlZCBvciBncmFpbiBvciBkcmllZCBsZWd1bWlub3VzIHZlZ2V0YWJsZXMjMjEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjAuMDMuMDAjR3JhZGluZyBtYWNoaW5lcyBmb3Igc2VlZCBvciBncmFpbiBvciBkcmllZCBsZWd1bWlub3VzIHZlZ2V0YWJsZXMjMjEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjAuMDQuMDAjUmljZSBjbGVhbmluZyBvciBodWxsaW5nIGVxdWlwbWVudCMyMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMC4wNS4wMCNHcmluZGluZyBtaWxscyMyMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMC4wNi4wMCNIYW1tZXIgbWlsbHMjMjEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjEuMDAuMDAjQWdyaWN1bHR1cmFsIHByb2Nlc3NpbmcgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjEuMDEuMDAjQWdyaWN1bHR1cmFsIGJyaXF1ZXR0aW5nIG9yIHBlbHRpbmcgbWFjaGluZXMjMjEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjIuMDAuMDAjRm9yZXN0cnkgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjIuMDEuMDAjRGVjb3J0aWNhdG9ycyMyMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMi4wMi4wMCNMdW1iZXJpbmcgZXF1aXBtZW50IzIxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzIxLjEwLjIyLjAzLjAwI1JlZm9yZXN0YXRpb24gZXF1aXBtZW50IzIxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzIxLjEwLjIyLjA0LjAwI0ZvcmVzdHJ5IHNhd3MjMjEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjIuMDUuMDAjRm9yZXN0cnkgc2tpZGRlcnMjMjEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjIuMDYuMDAjRm9yZXN0cnkgaW5jcmVtZW50IGJvcmVycyMyMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMi4wNy4wMCNGb3Jlc3RyeSBpcHNvbWV0ZXIjMjEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjMuMDAuMDAjR3JlZW5ob3VzZSBlcXVpcG1lbnQjMjEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjMuMDEuMDAjR3JlZW5ob3VzZSBpcnJpZ2F0aW9uIGVxdWlwbWVudCMyMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMy4wMi4wMCNHcmVlbmhvdXNlIHBvdHMjMjEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjMuMDMuMDAjR3JlZW5ob3VzZSB2ZW50aWxhdGlvbiBlcXVpcG1lbnQjMjEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjMuMDQuMDAjR3JlZW5ob3VzZSBpc29sYXRpb24gZXF1aXBtZW50IzIxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzIxLjEwLjI0LjAwLjAwI0luc2VjdCBlcXVpcG1lbnQjMjEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjQuMDEuMDAjQmVla2VlcGluZyBlcXVpcG1lbnQjMjEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjQuMDIuMDAjU2lsa3dvcm0gZXF1aXBtZW50IzIxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzIxLjEwLjI0LjAzLjAwI0J1dHRlcmZseSBicmVlZGluZyBlcXVpcG1lbnQjMjEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjQuMDQuMDAjQmVldGxlIGJyZWVkaW5nIGVxdWlwbWVudCMyMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMyMS4xMS4wMC4wMC4wMCNGaXNoaW5nIGFuZCBhcXVhY3VsdHVyZSBlcXVpcG1lbnQjMjEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTEuMTUuMDAuMDAjQ29tbWVyY2lhbCBmaXNoaW5nIGVxdWlwbWVudCMyMS4xMS4wMC4wMC4wMAotdW5zcHNjNyMyMS4xMS4xNS4wMS4wMCNDb21tZXJjaWFsIGZpc2ggaG9va3MjMjEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTEuMTUuMDIuMDAjQ29tbWVyY2lhbCBmaXNoaW5nIHJlZWxzIzIxLjExLjE1LjAwLjAwCi11bnNwc2M3IzIxLjExLjE1LjAzLjAwI0NvbW1lcmNpYWwgZmlzaGluZyBsaW5lIHRhY2tsZSMyMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMS4xNS4wNC4wMCNDb21tZXJjaWFsIGZpc2hpbmcgbmV0cyMyMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMS4xNS4wNi4wMCNDb21tZXJjaWFsIGZpc2hpbmcgZmxvYXRzIzIxLjExLjE1LjAwLjAwCi11bnNwc2M3IzIxLjExLjE1LjA3LjAwI0NvbW1lcmNpYWwgc2lua2VycyBvciB3ZWlnaHRzIzIxLjExLjE1LjAwLjAwCi11bnNwc2M3IzIxLjExLjE1LjA4LjAwI0Zpc2hpbmcgbmV0IGhhdWxlcnMjMjEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTEuMTYuMDAuMDAjQXF1YWN1bHR1cmUgZXF1aXBtZW50IzIxLjExLjAwLjAwLjAwCi11bnNwc2M3IzIxLjExLjE2LjAxLjAwI01hcmluZSBoYXRjaGVyeSBlcXVpcG1lbnQjMjEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjEuMTEuMTYuMDIuMDAjUGlzY2ljdWx0dXJlIHN1cHBsaWVzIzIxLjExLjE2LjAwLjAwCi11bnNwc2M3IzIyLjAwLjAwLjAwLjAwI0J1aWxkaW5nIGFuZCBDb25zdHJ1Y3Rpb24gTWFjaGluZXJ5IGFuZCBBY2Nlc3NvcmllcyMyMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMi4xMC4wMC4wMC4wMCNIZWF2eSBjb25zdHJ1Y3Rpb24gbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDAuMDAjRWFydGggbW92aW5nIG1hY2hpbmVyeSMyMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4wMS4wMCNGcm9udCBlbmQgbG9hZGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4wMi4wMCNHcmFkZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjAzLjAwI0xvYWRlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDQuMDAjUGlsZSBkcml2ZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjA1LjAwI1JvbGxlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDYuMDAjRWFydGhtb3Zpbmcgc2NyYXBlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDcuMDAjVGFtcGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4wOC4wMCNUcmVuY2hpbmcgbWFjaGluZXMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDkuMDAjQmFja2hvZXMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMTAuMDAjQnVsbGRvemVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4xMS4wMCNDb21wYWN0b3JzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjEzLjAwI0RyYWdsaW5lcyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4xNC4wMCNEcmVkZ2VycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4xNS4wMCNFeGNhdmF0b3JzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjE2LjAwI0RpdGNoZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjE3LjAwI0NoZXJyeSBwaWNrZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjE4LjAwI0VsZXZhdGluZyBzY3JhcGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4xOS4wMCNUd2luIGVuZ2luZSBvcGVuIGJvd2wgc2NyYXBlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMjAuMDAjVHdpbiBlbmdpbmUgZWxldmF0aW5nIHNjcmFwZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjIxLjAwI1B1bGxlZCBzY3JhcGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4yMi4wMCNUcmFjayBidWxsZG96ZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjIzLjAwI1doZWVsIGJ1bGxkb3plcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMjQuMDAjTW9iaWxlIGV4Y2F2YXRvcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMjUuMDAjV2hlZWwgZXhjYXZhdG9ycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4yNi4wMCNUcmFjayBleGNhdmF0b3JzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjI3LjAwI0ludGVncmF0ZWQgdG9vbCBjYXJyaWVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4yOC4wMCNXaGVlbCBsb2FkZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjI5LjAwI1NraWQgc3RlZXIgbG9hZGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4zMC4wMCNPcGVuIGJvd2wgc2NyYXBlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMzEuMDAjU25vdyBibG93ZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjMyLjAwI1RyYWNrIGxvYWRlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTYuMDAuMDAjUGF2aW5nIGVxdWlwbWVudCMyMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNi4wMi4wMCNSYW1taW5nIGVxdWlwbWVudCMyMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNi4wMy4wMCNSb2FkIHdpZGVuZXJzIzIyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE2LjA0LjAwI1ZpYnJhdG9yeSBwbGF0ZXMjMjIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTYuMDUuMDAjQXNwaGFsdCBmaW5pc2hlcnMjMjIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTYuMDYuMDAjQ2hpcCBTcHJlYWRlcnMjMjIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTcuMDAuMDAjSGVhdnkgZXF1aXBtZW50IGNvbXBvbmVudHMjMjIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTcuMDEuMDAjRWFydGhtb3Zpbmcgc2hvdmVscyMyMi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNy4wMi4wMCNFYXJ0aG1vdmluZyBidWNrZXRzIzIyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE3LjAzLjAwI0VhcnRobW92aW5nIGJsYWRlcyMyMi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNy4wNC4wMCNTY2FyaWZpZXJzIzIyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE4LjAwLjAwI0FlcmlhbCBsaWZ0cyMyMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMi4xMC4xOC4wMS4wMCNNYW5saWZ0IG9yIHBlcnNvbm5lbCBsaWZ0IzIyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE4LjAyLjAwI1BsYXRmb3JtIGxpZnQjMjIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTguMDMuMDAjQXJ0aWN1bGF0aW5nIGJvb20gbGlmdCMyMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMyMi4xMC4xOC4wNC4wMCNUZWxlc2NvcGluZyBib29tIGxpZnQjMjIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjMuMDAuMDAuMDAuMDAjSW5kdXN0cmlhbCBNYW51ZmFjdHVyaW5nIGFuZCBQcm9jZXNzaW5nIE1hY2hpbmVyeSBhbmQgQWNjZXNzb3JpZXMjMjMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMDAuMDAuMDAjUmF3IG1hdGVyaWFscyBwcm9jZXNzaW5nIG1hY2hpbmVyeSMyMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wMC4wMCNNYWNoaW5lcnkgZm9yIHdvcmtpbmcgd29vZCBhbmQgc3RvbmUgYW5kIGNlcmFtaWMgYW5kIHRoZSBsaWtlIzIzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEwLjE1LjAxLjAwI0NvcGluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wMi4wMCNEcmlsbGluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wMy4wMCNCcm9hY2hpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMDQuMDAjQmVuZGluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wNS4wMCNCb3JpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMDYuMDAjR3JpbmRpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMDcuMDAjTW9sZGluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wOC4wMCNDdXR0aW5nIG1hY2hpbmVzIzIzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEwLjE1LjA5LjAwI1NhbmRpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTAuMDAjUG9saXNoaW5nIG1hY2hpbmVzIzIzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEwLjE1LjExLjAwI1R1cm5pbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTIuMDAjU2F3aW5nIG1hY2hpbmVzIzIzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEwLjE1LjEzLjAwI01pbGxpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTQuMDAjUGxhbmluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4xNS4wMCNFbmdyYXZpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTYuMDAjR2xhc3MgYmVhZCBwZWVuZXIgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTcuMDAjR3JpdCBibGFzdCBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4xOC4wMCNTaG90IHBlZW4gbWFjaGluZSMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4xOS4wMCNSb2JvdCBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4yMC4wMCNSYW0gZWxlY3RybyBkaXNjaGFyZ2UgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMjEuMDAjV2lyZSBjYXRob2RlIGVsZWN0cm9kZSBkaXNjaGFyZ2UgbWFjaGluZSMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4yMi4wMCNDaGlwIGJyZWFrZXIjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTEuMDAuMDAuMDAjUGV0cm9sZXVtIHByb2Nlc3NpbmcgbWFjaGluZXJ5IzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjAwLjAwI1BldHJvbGV1bSBkaXN0aWxsaW5nIGFuZCBwcm9jZXNzaW5nIG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IzIzLjExLjAwLjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjAxLjAwI0Rpc3RpbGxhdGUgaHlkcm9wcm9jZXNzaW5nIGVxdWlwbWVudCMyMy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNS4wMi4wMCNDcnVkZSBkaXN0aWxsaW5nIG1hY2hpbmVyeSMyMy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNS4wMy4wMCNDYXRhbHl0aWMgY3JhY2tpbmcgZXF1aXBtZW50IzIzLjExLjE1LjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjA0LjAwI0h5ZHJvY3JhY2tpbmcgZXF1aXBtZW50IzIzLjExLjE1LjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjA1LjAwI0lzb21lcml6YXRpb24gbWFjaGluZXJ5IzIzLjExLjE1LjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjA2LjAwI0Nva2luZyBtYWNoaW5lcnkjMjMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTEuMTUuMDcuMDAjR2FzIHJlY292ZXJ5IG1hY2hpbmVyeSMyMy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNi4wMC4wMCNIeWRyb3RyZWF0aW5nIG1hY2hpbmVyeSMyMy4xMS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNi4wMS4wMCNOYXB0aGEgaHlkcm90cmVhdGVyIzIzLjExLjE2LjAwLjAwCi11bnNwc2M3IzIzLjExLjE2LjAyLjAwI0Rpc3RpbGxhdGUgaHlkcm90cmVhdGVyIzIzLjExLjE2LjAwLjAwCi11bnNwc2M3IzIzLjExLjE2LjAzLjAwI0NhdGFseXRpYyBmZWVkIGh5ZHJvdHJlYXRlciMyMy4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNi4wNC4wMCNMdWJlIGh5ZHJvdHJlYXRlciMyMy4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNi4wNS4wMCNHYXNvbGluZSBoeWRyb3RyZWF0ZXIjMjMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTEuMTYuMDYuMDAjUmVzaWQgaHlkcm90cmVhdGVyIzIzLjExLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjAwLjAwLjAwI1RleHRpbGUgYW5kIGZhYnJpYyBtYWNoaW5lcnkgYW5kIGFjY2Vzc29yaWVzIzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjAwLjAwI1RleHRpbGUgcHJvY2Vzc2luZyBtYWNoaW5lcnkgYW5kIGFjY2Vzc29yaWVzIzIzLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjAxLjAwI0VtYnJvaWRlcnkgbWFraW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjAyLjAwI0ZlbHRpbmcgbWFjaGluZXMjMjMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTUuMDMuMDAjV2luZGluZyBvciByZWVsaW5nIG9yIHNwb29saW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA0LjAwI1R3aXN0aW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA1LjAwI1N0aXRjaCBib25kaW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA2LjAwI0tuaXR0aW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA3LjAwI1dlYXZpbmcgbWFjaGluZXMjMjMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTUuMDguMDAjRmluaXNoaW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA5LjAwI1NwaW5uaW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjEwLjAwI0xhY2UgbWFraW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjAwLjAwI1RleHRpbGUgd29ya2luZyBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCBhbmQgYWNjZXNzb3JpZXMjMjMuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMDEuMDAjQnV0dG9uIGNvdmVyaW5nIG1hY2hpbmVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjAyLjAwI0J1dHRvbiBzZXdpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMDMuMDAjQnV0dG9uaG9sZSBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4wNC4wMCNDbG90aCBjdXR0aW5nIG1hY2hpbmVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjA1LjAwI0N1c2hpb24gZmlsbGluZyBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4wNi4wMCNGb2xkaW5nIG9yIHJld2luZGluZyBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4wNy4wMCNCbGVhY2hpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMDguMDAjRmFicmljIG9yIGNsb3RoIGZvbGRpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMDkuMDAjUmVlbGluZyBvciB1bnJlZWxpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMTAuMDAjRHllaW5nIG1hY2hpbmVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjExLjAwI0N1dHRpbmcgb3IgcGlua2luZyBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4xMi4wMCNTZXdpbmcgbWFjaGluZSBuZWVkbGVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjEzLjAwI1NpbGsgcHJvY2Vzc2luZyBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4xNC4wMCNTZXdpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMTUuMDAjRmFicmljIGN1dHRpbmcgdGFibGVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEzLjAwLjAwLjAwI0xhcGlkYXJ5IG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEzLjE1LjAwLjAwI0dyaW5kaW5nIGFuZCBzYW5kaW5nIGFuZCBwb2xpc2hpbmcgZXF1aXBtZW50IGFuZCBzdXBwbGllcyMyMy4xMy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4wMS4wMCNBYnJhc2l2ZSBjb21wb3VuZHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDIuMDAjRmVsdCB3aGVlbHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDMuMDAjR3JpbmRpbmcgd2hlZWxzIzIzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE1LjA0LjAwI1BvbGlzaGluZyBjb21wb3VuZHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDUuMDAjUG9saXNoaW5nIGhlYWRzIzIzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE1LjA2LjAwI1BvbGlzaGluZyB3aGVlbHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDcuMDAjU2FuZGluZyBjbG90aHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDguMDAjU2FuZGluZyBkcnVtcyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4wOS4wMCNUdW1ibGVycyBvciBwb2xpc2hlcnMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMTAuMDAjVHVtYmxpbmcgc3VwcGxpZXMgb3IgbWVkaWEjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMTEuMDAjV2F0ZXIgc3dpdmVscyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4xMi4wMCNXYXRlciB0cmF5cyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4xMy4wMCNTYW5kaW5nIGJsb2NrcyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4xNC4wMCNNb3VudGVkIHN0b25lcyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4xNS4wMCNHcmluZGluZyB3aGVlbCBkcmVzc2VycyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNi4wMC4wMCNGYWNldGluZyBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzIzLjEzLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEzLjE2LjAxLjAwI0ZhY2V0aW5nIGFjY2Vzc29yaWVzIzIzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE2LjAyLjAwI0ZhY2V0aW5nIG1hY2hpbmVzIzIzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE2LjAzLjAwI0ZhY2V0aW5nIGxhcHMjMjMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTYuMDQuMDAjRmFjZXRpbmcgc2F3cyMyMy4xMy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNy4wMC4wMCNDYWJiaW5nIGVxdWlwbWVudCMyMy4xMy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNy4wMS4wMCNDYWJiaW5nIGFjY2Vzc29yaWVzIzIzLjEzLjE3LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE3LjAyLjAwI0NhYmJpbmcgYmVsdHMjMjMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTcuMDMuMDAjQ2FiYmluZyBkaXNjcyMyMy4xMy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNy4wNC4wMCNDYWJvY2hvbiBtYWNoaW5lcyMyMy4xMy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNC4wMC4wMC4wMCNMZWF0aGVyd29ya2luZyByZXBhaXJpbmcgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTQuMTYuMDAuMDAjTGVhdGhlciBwcmVwYXJpbmcgbWFjaGluZXJ5IGFuZCBhY2Nlc3NvcmllcyMyMy4xNC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNC4xNi4wMS4wMCNMZWF0aGVyIGZsZXNoaW5nIG1hY2hpbmVzIzIzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE0LjE2LjAyLjAwI0xlYXRoZXIgdGFubmluZyBtYWNoaW5lcyMyMy4xNC4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNC4xNi4wMy4wMCNMZWF0aGVyIGR5ZWluZyBtYWNoaW5lcyMyMy4xNC4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNC4xNi4wNC4wMCNMZWF0aGVyIGRlZ3JlYXNpbmcgbWFjaGluZXMjMjMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTQuMTYuMDUuMDAjTGVhdGhlciBwcmVzc2VzIzIzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE0LjE3LjAwLjAwI0xlYXRoZXIgd29ya2luZyBhbmQgcmVwYWlyaW5nIG1hY2hpbmVyeSBhbmQgYWNjZXNzb3JpZXMjMjMuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTQuMTcuMDEuMDAjTGVhdGhlciBjdXR0aW5nIG1hY2hpbmVzIzIzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE0LjE3LjAyLjAwI0xlYXRoZXIgcml2ZXRpbmcgbWFjaGluZXMjMjMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTQuMTcuMDMuMDAjTGVhdGhlciBuYWlsaW5nIG1hY2hpbmVzIzIzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE0LjE3LjA0LjAwI0xlYXRoZXJ3b3JraW5nIHdvcmtzaG9wIGVxdWlwbWVudCMyMy4xNC4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNS4wMC4wMC4wMCNJbmR1c3RyaWFsIHByb2Nlc3MgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjE1LjAwLjAwI1J1YmJlciBhbmQgcGxhc3RpYyBwcm9jZXNzaW5nIG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IGFuZCBzdXBwbGllcyMyMy4xNS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4wMS4wMCNCbG93IG1vbGRpbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDIuMDAjQ29hdGluZyBtYWNoaW5lcyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4wMy4wMCNFeHRydWRlcnMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDQuMDAjSW5qZWN0aW9uIG1vbGRpbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDUuMDAjUnViYmVyIG9yIHBsYXN0aWMgbWl4ZXJzIzIzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE1LjA2LjAwI1J1YmJlciBvciBwbGFzdGljIHByZXNzZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDcuMDAjVGhlcm1vIGZvcm1pbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDguMDAjVmFjdXVtIG1vbGRpbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDkuMDAjVnVsY2FuaXppbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMTAuMDAjUGxhc3RpYyBjdXR0aW5nIG1hY2hpbmVyeSMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xMS4wMCNQbGFzdGljIGdyaW5kaW5nIG1hY2hpbmVyeSMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xMi4wMCNSdWJiZXIgb3IgcGxhc3RpYyBtaWxscyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xMy4wMCNSdWJiZXIgb3IgcGxhc3RpYyBleHRydXNpb24gZGllcyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xNC4wMCNQbGFzdGljIGluamVjdGlvbiBtb2xkcyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xNS4wMCNUaGVybW9mb3JtaW5nIG1vbGRzIzIzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE1LjE2LjAwI0VqZWN0b3IgcGlucyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNi4wMC4wMCNDZW1lbnQgYW5kIGNlcmFtaWNzIGFuZCBnbGFzcyBpbmR1c3RyeSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTYuMDEuMDAjQmxvd2VycyBvciBkcnllcnMjMjMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTYuMDIuMDAjQ3J1c2hlcnMjMjMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTYuMDMuMDAjRnVzaW9uIHdlbGRpbmcgb3IgZ2xhc3MgZHJhd2luZyBtYWNoaW5lcyMyMy4xNS4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNi4wNC4wMCNHcmluZGluZyBvciBwb2xpc2hpbmcgbWFjaGluZXMjMjMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTYuMDUuMDAjTWl4aW5nIG9yIGtuZWFkaW5nIG1hY2hpbmVzIzIzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE2LjA2LjAwI0NlbWVudCBvciBjZXJhbWljIG9yIGdsYXNzIG9yIHNpbWlsYXIgbWF0ZXJpYWwgbW9sZGluZyBtYWNoaW5lcyMyMy4xNS4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNi4wNy4wMCNQcmVzc2VzIzIzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE2LjA4LjAwI1NpZnRlcnMjMjMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTcuMDAuMDAjT3B0aWNhbCBpbmR1c3RyeSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTcuMDEuMDAjTGVucyBncmluZGluZyBtYWNoaW5lcyMyMy4xNS4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNy4wMi4wMCNMZW5zIG1lYXN1cmluZyBlcXVpcG1lbnQjMjMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTcuMDMuMDAjTGVucyBwb2xpc2hpbmcgZXF1aXBtZW50IzIzLjE1LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE3LjA0LjAwI0xlbnMgdGVzdGluZyBlcXVpcG1lbnQjMjMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTcuMDUuMDAjT3B0aWNhbCB2YWN1dW0gY29hdGluZyBlcXVpcG1lbnQjMjMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMDAuMDAjUGhhcm1hY2V1dGljYWwgaW5kdXN0cnkgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjAxLjAwI0FtcG91bGUgZmlsbGluZyBlcXVpcG1lbnQjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMDIuMDAjQm90dGxlIGNhcHBlcnMgb3IgY290dG9uIGluc2VydGVycyBvciBzYWZldHkgc2VhbCBhcHBsaWNhdG9ycyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4wMy4wMCNDYXBzdWxhdGluZyBtYWNoaW5lcyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4wNC4wMCNSZWFjdG9ycyBvciBmZXJtZW50ZXJzIG9yIGRpZ2VzdGVycyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4wNS4wMCNGaWxsaW5nIG9yIHNlYWxpbmcgYXVnZXIgZG9zZSBtYWNoaW5lcyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4wNi4wMCNQaGFybWFjZXV0aWNhbCBmaWx0ZXJzIG9yIHVsdHJhIGZpbHRlcnMjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMDcuMDAjRnJlZXplZHJ5ZXJzIG9yIGx5b3BoaWx6ZXJzIzIzLjE1LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjA4LjAwI1BoYXJtYWNldXRpY2FsIGdyYW51bGF0b3JzIzIzLjE1LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjA5LjAwI1BoYW1hY2V1dGljYWwgc2lldmUgb3Igc2NyZWVuaW5nIG1hY2hpbmVzIzIzLjE1LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjEwLjAwI1N0ZXJpbGUgb3IgYXNlcHRpYyBwcm9jZXNzaW5nIG9yIGZpbGxpbmcgbWFjaGluZXMjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMTEuMDAjVGFibGV0IG9yIGNhcHN1bGUgdGVzdGluZyBtYWNoaW5lcyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4xMi4wMCNUYWJsZXQgY291bnRlcnMjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMTMuMDAjVGFibGV0dGluZyBtYWNoaW5lcyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4xNC4wMCNWYWNjaW5lIHByb2R1Y3Rpb24gZXF1aXBtZW50IzIzLjE1LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjE1LjAwI1Zlc3NlbCBtaXhlcnMjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTkuMDAuMDAjUGFwZXIgbWFraW5nIGFuZCBwYXBlciBwcm9jZXNzaW5nIG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IGFuZCBzdXBwbGllcyMyMy4xNS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOS4wMS4wMCNDdXR0ZXJzIzIzLjE1LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE5LjAyLjAwI1NsaXR0ZXJzIzIzLjE1LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE5LjAzLjAwI1dhc2hpbmcgb3IgZGV3YXRlcmluZyBtYWNoaW5lcyMyMy4xNS4xOS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOS4wNC4wMCNXaW5kZXJzIzIzLjE1LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE5LjA1LjAwI1dvb2QgcHVscCBvciBkaXNzb2x2ZXIgbWFjaGluZXMjMjMuMTUuMTkuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTkuMDYuMDAjQ2FsZW5kZXJzIGZvciBwYXBlciBvciBjYXJkYm9hcmQgbWFraW5nIzIzLjE1LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjIwLjAwLjAwI1dlYiBoYW5kbGluZyBhbmQgY29udHJvbCBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjAuMDEuMDAjQ29yb25hIHRyZWF0ZXJzIzIzLjE1LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjIwLjAyLjAwI0ZsYW1lIHRyZWF0ZXJzIzIzLjE1LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjIxLjAwLjAwI1NlcGFyYXRpb24gbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjEuMDEuMDAjVmlicmF0b3J5IHNlcGFyYXRpb24gZXF1aXBtZW50IGFuZCBwYXJ0cyBhbmQgc2NyZWVucyMyMy4xNS4yMS4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMS4wMi4wMCNTdGF0aW9uYXJ5IHNlcGFyYXRpb24gZXF1aXBtZW50IGFuZCBwYXJ0cyBhbmQgc2NyZWVucyMyMy4xNS4yMS4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMS4wMy4wMCNBaXIgY2xhc3NpZmljYXRpb24gZXF1aXBtZW50IGFuZCBwYXJ0cyBhbmQgc2NyZWVucyMyMy4xNS4yMS4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMS4wNC4wMCNDZW50aWZ1Z2FsIHNlcGFyYXRpb24gZXF1aXBtZW50IG9yIHBhcnRzIG9yIHNjcmVlbnMjMjMuMTUuMjEuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjIuMDAuMDAjTWFudWZhY3R1cmluZyB0YWJsZXMgYW5kIHN0YW5kcyMyMy4xNS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMi4wMS4wMCNSb3RhcnkgdGFibGVzIzIzLjE1LjIyLjAwLjAwCi11bnNwc2M3IzIzLjE1LjIyLjAyLjAwI1N0YWNrIHN0YW5kcyMyMy4xNS4yMi4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMi4wMy4wMCNFbmdpbmUgYW5kIGNvbXBvbmVudCB0ZXN0IHN0YW5kcyMyMy4xNS4yMi4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMi4wNC4wMCNNYWNoaW5lIGd1YXJkaW5nIzIzLjE1LjIyLjAwLjAwCi11bnNwc2M3IzIzLjE1LjIzLjAwLjAwI1JvdGFyeSB0YWJsZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjQuMDAuMDAjU3RhY2sgc3RhbmRzIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjI1LjAwLjAwI0VuZ2luZSBhbmQgY29tcG9uZW50IHRlc3Qgc3RhbmRzIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjI2LjAwLjAwI01hY2hpbmUgZ3VhcmRpbmcjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjcuMDAuMDAjQWlyIGNsYXNzaWZpY2F0aW9uIGVxdWlwbWVudCBhbmQgcGFydHMgYW5kIHNjcmVlbnMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjguMDAuMDAjQ2VudGlmdWdhbCBzZXBhcmF0aW9uIGVxdWlwbWVudCBvciBwYXJ0cyBvciBzY3JlZW5zIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjI5LjAwLjAwI1BhY2thZ2luZyBtYWNoaW5lcnkjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjkuMDEuMDAjV3JhcHBpbmcgbWFjaGluZXJ5IzIzLjE1LjI5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjI5LjAyLjAwI0Zvcm0gb3IgZmlsbCBvciBzZWFsIG1hY2hpbmVyeSMyMy4xNS4yOS4wMC4wMAotdW5zcHNjNyMyMy4xNS4yOS4wMy4wMCNQYWNrYWdpbmcgdmFjdXVtIzIzLjE1LjI5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjAwLjAwI0hvbGRpbmcgYW5kIHBvc2l0aW9uaW5nIGFuZCBndWlkaW5nIHN5c3RlbXMgYW5kIGRldmljZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMDEuMDAjQ2FsaWJyYXRpb24gamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjAyLjAwI0d1aWRlIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4wMy4wMCNNYXN0ZXIgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjA0LjAwI05lZWRsZSBqaWcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMDUuMDAjU2hhZnQgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjA2LjAwI0NoZWNraW5nIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4wNy4wMCNTZXR0aW5nIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4wOC4wMCNDYW1lcmEgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjA5LjAwI1BpY2t1cCBqaWcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMTAuMDAjUmVtb3ZhbCBqaWcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMTEuMDAjTm96emxlIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4xMi4wMCNTbGlkaW5nIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4xMy4wMCNDZW50ZXJpbmcgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjE0LjAwI0luc3BlY3RpbmcgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjE1LjAwI0ZlZWRlciBqaWcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMTYuMDAjQ2x1dGNoIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4xNy4wMCNBbGlnbm1lbnQgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjE4LjAwI1Bvc2l0aW9uaW5nIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4xOS4wMCNMaWZ0ZXIgcGxhdGUjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMjAuMDAjVGFwZSBndWlkZSMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yMS4wMCNUYXBlIGZlZWQgamF3IzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjIyLjAwI1Bvd2VyIGZlZWRlciMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yMy4wMCNGZWVkZXIgaGFybmVzcyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yNC4wMCNGZWVkIGphdyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yNS4wMCNNZWNoYW5pY2FsIGdyaXBwZXIjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMjYuMDAjSG9sZGVyIGphdyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yNy4wMCNKYXcgYXNzZW1ibHkjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMjguMDAjU3RhdGlvbmFyeSBqYXcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMjkuMDAjSmlnIGJsb2NrIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjMwLjAwI0xpbmVhciBtb3Rpb24gZ3VpZGVzIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjMxLjAwI01lYXN1cmluZyBqaWdzIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjMyLjAwI1JpbmcgamlncyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMS4wMC4wMCNJbmR1c3RyaWFsIG1hY2hpbmVyeSBjb21wb25lbnRzIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMxLjAxLjAwI1BpdGNoIHN0b3BwZXIjMjMuMTUuMzEuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzEuMDIuMDAjUGFwZXIgc3RvcHBlciMyMy4xNS4zMS4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMS4wMy4wMCNTdG9wcGVyIHBhZCMyMy4xNS4zMS4wMC4wMAotdW5zcHNjNyMyMy4xNi4wMC4wMC4wMCNGb3VuZHJ5ICBtYWNoaW5lcyBhbmQgZXF1aXBtZW50IGFuZCBzdXBwbGllcyMyMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wMC4wMCNGb3VuZHJ5IG1hY2hpbmVzIGFuZCBlcXVpcG1lbnQjMjMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMDEuMDAjRm91bmRyeSBibG93ZXJzIzIzLjE2LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE2LjE1LjAyLjAwI0ZvdW5kcnkgYnVybmVycyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wMy4wMCNDb3JlIGRyeWluZyBvdmVucyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wNC4wMCNGb3JnaW5nIHByZXNzZXMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMDUuMDAjSG90IG1ldGFsIG1peGVycyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wNi4wMCNGb3VuZHJ5IGNydWNpYmxlcyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wNy4wMCNGb3VuZHJ5IGNvbnZlcnRlcnMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMDguMDAjT3BlbiBkaWUgZm9yZ2luZyBwcmVzcyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wOS4wMCNGb3JnaW5nIHN0YW1waW5nIG1hY2hpbmVzIzIzLjE2LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE2LjE1LjEwLjAwI0Nhc3RpbmcgbWFjaGluZXMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMTEuMDAjRm9yZ2luZyByb2xscyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4xMi4wMCNSYWRpYWwgZm9yZ2luZyBtYWNoaW5lcyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4xMy4wMCNDb2xkIGZvcm1pbmcgcHJlc3NlcyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4xNC4wMCNTaXppbmcgb3IgZW1ib3NzaW5nIHByZXNzZXMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMTUuMDAjRW5kIGZvcmdpbmcgbWFjaGluZXMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTYuMDAuMDAjRm91bmRyeSBzdXBwbGllcyMyMy4xNi4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wMS4wMCNGb3VuZHJ5IGJlbGxvd3MjMjMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTYuMDIuMDAjRm91bmRyeSBjbGF5cyMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wMy4wMCNGb3VuZHJ5IGZsYXNrcyMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wNC4wMCNGb3VuZHJ5IGZsdXhlcyMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wNS4wMCNGb3VuZHJ5IGxhZGxlcyMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wNi4wMCNGb3VuZHJ5IG1vbGRzIzIzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE2LjE2LjA3LjAwI0ZvdW5kcnkgc2FuZCMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wOC4wMCNGb3VuZHJ5IHNob3ZlbHMjMjMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMDAuMDAuMDAjV29ya3Nob3AgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjAwLjAwI1NvbGRlcmluZyBhbmQgYnJhemluZyBhbmQgd2VsZGluZyBtYWNoaW5lcnkgYW5kIHN1cHBsaWVzIzIzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjAxLjAwI0FudGkgc3BhdHRlciBzcHJheXMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMDIuMDAjR2FzIHdlbGRpbmcgb3IgYnJhemluZyByb2RzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjAzLjAwI0ZpbGxlciBtZXRhbCMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4wNC4wMCNCbG93IHBpcGVzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjA1LjAwI0lyb24gcG93ZGVyIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjA2LjAwI1NvbGRlcmluZyBmbHVpZCMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4wNy4wMCNTb2xkZXJpbmcgaXJvbnMgb3IgZ3VucyMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4wOC4wMCNXZWxkZXJzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjA5LjAwI1NvbGRlciMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4xMC4wMCNXZWxkaW5nIHdpcmUjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMTEuMDAjV2VsZGluZyB0b29scyMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4xMi4wMCNXZWxkaW5nIHJvZHMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMTMuMDAjV2VsZGluZyByZWN0aWZpZXJzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjE0LjAwI1dlbGRpbmcgZ2VuZXJhdG9ycyMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4xNS4wMCNXZWxkaW5nIGVsZWN0cm9kZXMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMTcuMDAjQmxvdyB0b3JjaGVzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjE4LjAwI1BsYXNtYSB3ZWxkaW5nIG1hY2hpbmVyeSMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4xOS4wMCNUdW5nc3RlbiBpbmVydCBnYXMgKFRJRykgd2VsZGluZyBtYWNoaW5lcnkjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMjAuMDAjVWx0cmFzb3VuZCB3ZWxkaW5nIG1hY2hpbmVyeSMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4yMS4wMCNMYXNlciB3ZWxkaW5nIG1hY2hpbmVyeSMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4yMi4wMCNTb2xkZXJpbmcgZmx1eGVzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjIzLjAwI1RlbXBlcmF0dXJlIGluZGljYXRpbmcgc3RpY2tzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjI0LjAwI0JyYXplIHJpbmdzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjI1LjAwI1NvbGRlcmluZyB0aXBzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjI2LjAwI0Rlc29sZGVyaW5nIHRpcHMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMjcuMDAjRGVzb2xkZXJpbmcgYnJhaWQjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMjguMDAjV2VsZGluZyBzY3JlZW5zIG9yIGN1cnRhaW5zIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjI5LjAwI1dlbGRpbmcgb3Igc29sZGVyaW5nIGtpdCMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4zMC4wMCNTb2xkZXJpbmcgb3IgZGVzb2xkZXJpbmcgb3IgY29tYmluZWQgc3RhdGlvbnMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMzEuMDAjRGVzb2xkZXJpbmcgR3VuIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjAwLjAwI01hY2hpbmUgdG9vbHMjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMDEuMDAjQm9yaW5nIHRvb2xzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjAyLjAwI0JhciBvciByb2QgY3V0dGVycyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4wMy4wMCNQaXBlIG9yIHR1YmUgY3V0dGVycyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4wNC4wMCNXaXJlIG9yIGNhYmxlIGN1dHRlcnMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMDUuMDAjRGVidXJyaW5nIGVxdWlwbWVudCMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4wNi4wMCNMYXRoZXMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMDcuMDAjTGF0aGUgdG9vbHMgb3IgZGllcyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4wOC4wMCNMYXNlciBjdXR0aW5nIHRvb2xzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjA5LjAwI1R3aXN0IGRyaWxscyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xMC4wMCNSZWFtZXJzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjExLjAwI0NvdW50ZXJib3JlcyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xMi4wMCNNaWxsaW5nIGN1dHRlcnMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMTMuMDAjSG9icyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xNC4wMCNHZWFyIHNoYXBlcnMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMTUuMDAjU2hhdmluZyBjdXR0ZXJzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjE2LjAwI1dhdGVyIGpldCBjdXR0aW5nIG1hY2hpbmVzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjE3LjAwI0Jyb2FjaGluZyB0b29scyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xOC4wMCNJbmRleGFibGUgaW5zZXJ0cyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xOS4wMCNCb3JpbmcgdG9vbHMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMjAuMDAjQnJvYWNoZXMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMjEuMDAjSW5zZXJ0aW9uIHRvb2xzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjIyLjAwI1dvcmtzaG9wIHByZXNzZXMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTcuMDAuMDAjTWV0YWwgYmVuZGluZyBhbmQgZm9ybWluZyBtYWNoaW5lcnkjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTcuMDEuMDAjVGFuZ2VudCBiZW5kZXJzIzIzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE3LjAyLjAwI1dpbmcgYmVuZGVycyMyMy4xNy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNy4wMy4wMCNUdWJlIGJlbmRpbmcgbWFjaGluZXJ5IzIzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE3LjA0LjAwI1BpcGUgYmVuZGluZyBtYW5kcmVscyMyMy4xNy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNy4wNS4wMCNEaWUgYmVuZHMjMjMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTcuMDYuMDAjU2VxdWVudGlhbCBmb3JtaW5nIG1hY2hpbmVzIzIzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE3LjA3LjAwI1R1YmUgZW5kIGZpbmlzaGVycyMyMy4xNy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNy4wOC4wMCNNYWNoaW5lIG1vdW50aW5nIzIzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE4LjAwLjAwI01ldGFsIGZhYnJpY2F0aW5nIGRpZXMjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDEuMDAjU3RhbXBpbmcgb3IgZm9ybWluZyBkaWVzIzIzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE4LjAyLjAwI0RpZSBjYXN0aW5nIGRpZXMjMjMuMTcuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDMuMDAjTWV0YWwgZXh0cnVzaW9uIGRpZXMjMjMuMTcuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDQuMDAjQ3V0dGluZyBkaWVzIG9yIHRvb2xpbmcjMjMuMTcuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDUuMDAjUm90YXJ5IGRpZXMjMjMuMTcuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDYuMDAjU3RlZWwgcnVsZSBkaWVzIzIzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE5LjAwLjAwI1NwZWNpYWwgdG9vbGluZyBmaXh0dXJlcyMyMy4xNy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4xOS4wMS4wMCNIb2xkaW5nIGZpeHR1cmVzIzIzLjE3LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE5LjAyLjAwI0dhdWdlcyBhbmQgaW5zcGVjdGlvbiBmaXh0dXJlcyMyMy4xNy4xOS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xOS4wMy4wMCNGYWJyaWNhdGVkIHRvb2xpbmcgZml4dHVyZXMjMjMuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTkuMDQuMDAjQ2FzdGluZyB0b29saW5nIzIzLjE3LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE5LjA1LjAwI0ZvcmdpbmcgdG9vbGluZyMyMy4xNy4xOS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xOS4wNi4wMCNBc3NlbWJseSBvciBkaXNhc3NlbWJseSB0b29saW5nIzIzLjE3LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjAwLjAwI01ldGFsIHdvcmtpbmcgbWFjaGluZXJ5IGF0dGFjaG1lbnRzIzIzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjAxLjAwI0J1cnJzIzIzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjAyLjAwI0Zvcm0gUmVsaWVmIzIzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjAzLjAwI01hY2hpbmUgdGhyZWFkaW5nIHRhcHMjMjMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjAuMDQuMDAjTWFjaGluZSB0aHJlYWRpbmcgZGllcyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4wNS4wMCNNYWNoaW5lIGVuZCBtaWxscyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4wNi4wMCNNZXRhbCBzdGFtcHMgb3IgcHVuY2hlcyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4wNy4wMCNNZXRhbCBjdXR0aW5nIGJhbmQgc2F3IGJsYWRlcyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4wOC4wMCNNZXRhbCBjdXR0aW5nIGNpcmN1bGFyIHNhdyBibGFkZXMjMjMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjAuMDkuMDAjQ2FyYmlkZSBpbnNlcnRzIzIzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjEwLjAwI0NlcmFtaWMgaW5zZXJ0cyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4xMS4wMCNTdGVlbCBpbnNlcnRzIzIzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjEyLjAwI0RpYW1vbmQgaW5zZXJ0cyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4xMy4wMCNUaHJlYWRpbmcgbWlsbHMjMjMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjEuMDAuMDAjSG9sZGluZyBmaXh0dXJlcyMyMy4xNy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMi4wMC4wMCNHYXVnZXMgYW5kIGluc3BlY3Rpb24gZml4dHVyZXMjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjMuMDAuMDAjRmFicmljYXRlZCB0b29saW5nIGZpeHR1cmVzIzIzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjI0LjAwLjAwI0Nhc3RpbmcgdG9vbGluZyMyMy4xNy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yNS4wMC4wMCNGb3JnaW5nIHRvb2xpbmcjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjYuMDAuMDAjQXNzZW1ibHkgb3IgZGlzYXNzZW1ibHkgdG9vbGluZyMyMy4xNy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOC4wMC4wMC4wMCNJbmR1c3RyaWFsIGZvb2QgYW5kIGJldmVyYWdlIGVxdWlwbWVudCMyMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wMC4wMCNGb29kIHByZXBhcmF0aW9uIG1hY2hpbmVyeSMyMy4xOC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wMS4wMCNGaWxsaW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wMi4wMCNNaWxsaW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wMy4wMCNNaXhpbmcgbWFjaGluZXJ5IzIzLjE4LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE1LjA0LjAwI1NpZnRpbmcgbWFjaGluZXJ5IzIzLjE4LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE1LjA1LjAwI0RlaHlkcmF0aW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wNi4wMCNXYXNoaW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wNy4wMCNDcnVzaGluZyBtYWNoaW5lcnkjMjMuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTUuMDguMDAjQmxhbmNoaW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wOS4wMCNTb3J0aW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4xMC4wMCNNZWF0IHR5ZXJzIzIzLjE4LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE2LjAwLjAwI0Zvb2QgY3V0dGluZyBtYWNoaW5lcnkjMjMuMTguMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTYuMDEuMDAjRGljaW5nIG1hY2hpbmVyeSMyMy4xOC4xNi4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNi4wMi4wMCNTbGljaW5nIG1hY2hpbmVyeSMyMy4xOC4xNi4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNi4wMy4wMCNDaG9wcGluZyBtYWNoaW5lcnkjMjMuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTYuMDQuMDAjQ3V0dGluZyBtYWNoaW5lcnkjMjMuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTYuMDUuMDAjR3JhdGluZyBtYWNoaW5lcnkjMjMuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTYuMDYuMDAjUGVlbGluZyBtYWNoaW5lcnkjMjMuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTcuMDAuMDAjRm9vZCBjb29raW5nIGFuZCBzbW9raW5nIG1hY2hpbmVyeSMyMy4xOC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNy4wMS4wMCNTbW9raW5nIG1hY2hpbmVyeSMyMy4xOC4xNy4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNy4wMi4wMCNSb2FzdGluZyBtYWNoaW5lcnkjMjMuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTcuMDMuMDAjQ29va2luZyBtYWNoaW5lcnkjMjMuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTcuMDQuMDAjU3RlYW1pbmcgbWFjaGluZXJ5IzIzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE4LjAwLjAwI0luZHVzdHJpYWwgYmV2ZXJhZ2UgcHJvY2Vzc2luZyBtYWNoaW5lcnkjMjMuMTguMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTguMDEuMDAjQ29mZmVlIGJyZXdpbmcgZXF1aXBtZW50IG9yIHN1cHBsaWVzIzIzLjE4LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE4LjAyLjAwI0p1aWNpbmcgbWFjaGluZXJ5IzIzLjE4LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE4LjAzLjAwI0ljZSBtYWtpbmcgbWFjaGluZXMjMjMuMTguMTguMDAuMDAKLXVuc3BzYzcjMjMuMTguMTguMDQuMDAjSWNlIGNyZWFtIG1hY2hpbmVzIzIzLjE4LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE5LjAwLjAwLjAwI01peGVycyBhbmQgdGhlaXIgcGFydHMgYW5kIGFjY2Vzc29yaWVzIzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjE5LjEwLjAwLjAwI0JhdGNoIG1peGVycyMyMy4xOS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOS4xMC4wMS4wMCNDaGFuZ2UgY2FuIG1peGVycyMyMy4xOS4xMC4wMC4wMAotdW5zcHNjNyMyMy4xOS4xMC4wMi4wMCNIZWxpY2FsIGJsYWRlIG1peGVyIzIzLjE5LjEwLjAwLjAwCi11bnNwc2M3IzIzLjE5LjEwLjAzLjAwI0RvdWJsZSBhcm0ga25lYWRpbmcgbWl4ZXJzIzIzLjE5LjEwLjAwLjAwCi11bnNwc2M3IzIzLjE5LjEwLjA0LjAwI0ludGVuc2l2ZSBtaXhlcnMjMjMuMTkuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMTkuMTAuMDUuMDAjUm9sbCBtaXhlcnMjMjMuMTkuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMTkuMTEuMDAuMDAjQ29udGludW91cyBtaXhlcnMjMjMuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTkuMTEuMDEuMDAjU2luZ2xlIHNjcmV3IG1peGVycyMyMy4xOS4xMS4wMC4wMAotdW5zcHNjNyMyMy4xOS4xMS4wMi4wMCNUd2luIHNjcmV3IGV4dHJ1ZGVyIzIzLjE5LjExLjAwLjAwCi11bnNwc2M3IzIzLjIwLjAwLjAwLjAwI01hc3MgdHJhbnNmZXIgZXF1aXBtZW50IzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjIwLjEwLjAwLjAwI0dhcyBsaXF1aWQgY29udGFjdGluZyBzeXN0ZW1zIzIzLjIwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjIwLjEwLjAxLjAwI1BsYXRlIGNvbHVtbnMjMjMuMjAuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMjAuMTAuMDIuMDAjUGFja2VkIGNvbHVtbnMjMjMuMjAuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMjAuMTAuMDMuMDAjTGlxdWlkIGRpc3BlcnNlZCBjb250YWN0b3IjMjMuMjAuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMjAuMTAuMDQuMDAjV2V0dGVkIHdhbGwgY29sdW1uIzIzLjIwLjEwLjAwLjAwCi11bnNwc2M3IzIzLjIwLjEwLjA1LjAwI0J1YmJsZSBjb2x1bW5zIzIzLjIwLjEwLjAwLjAwCi11bnNwc2M3IzIzLjIwLjExLjAwLjAwI0Fkc29ycHRpb24gYW5kIGlvbiBleGNoYW5nZSMyMy4yMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4yMC4xMS4wMS4wMCNBZHNvcmJlciB2ZXNzZWwjMjMuMjAuMTEuMDAuMDAKLXVuc3BzYzcjMjMuMjAuMTEuMDIuMDAjQW1iaWVudCBwcmVzc3VyZSBhZHNvcmJlciB2ZXNzZWwjMjMuMjAuMTEuMDAuMDAKLXVuc3BzYzcjMjMuMjEuMDAuMDAuMDAjRWxlY3Ryb25pYyBtYW51ZmFjdHVyaW5nIG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyMyMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4yMS4xMC4wMC4wMCNFbGVjdHJvbmljIGFzc2VtYmx5IG1hY2hpbmVyeSBhbmQgc3VwcG9ydCBlcXVpcG1lbnQjMjMuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMjEuMTAuMDEuMDAjQ2hpcCBwbGFjZXJzIzIzLjIxLjEwLjAwLjAwCi11bnNwc2M3IzIzLjIxLjEwLjAyLjAwI0dsdWUgZGlzcGVuc2luZyBtYWNoaW5lcnkjMjMuMjEuMTAuMDAuMDAKLXVuc3BzYzcjMjQuMDAuMDAuMDAuMDAjTWF0ZXJpYWwgSGFuZGxpbmcgYW5kIENvbmRpdGlvbmluZyBhbmQgU3RvcmFnZSBNYWNoaW5lcnkgYW5kIHRoZWlyIEFjY2Vzc29yaWVzIGFuZCBTdXBwbGllcyMyNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4wMC4wMC4wMCNNYXRlcmlhbCBoYW5kbGluZyBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCMyNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wMC4wMCNJbmR1c3RyaWFsIHRydWNrcyMyNC4xMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wMS4wMCNDYXJ0cyMyNC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wMi4wMCNCdWxrIHRyYW5zcG9ydGVycyMyNC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wMy4wMCNEb2xsaWVzIzI0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE1LjA0LjAwI0hhbmQgdHJ1Y2tzIG9yIGFjY2Vzc29yaWVzIzI0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE1LjA1LjAwI1BhbGxldCB0cnVja3MjMjQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTUuMDYuMDAjUHVzaGNhcnRzIzI0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE1LjA3LjAwI1doZWVsYmFycm93cyMyNC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wOC4wMCNDcmVlcGVycyMyNC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wOS4wMCNXYWdvbnMjMjQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTUuMTAuMDAjVGlsdCB0cnVja3MjMjQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTUuMTEuMDAjU2hlbGYgdHJvbGxleXMjMjQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMDAuMDAjTGlmdGluZyBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzI0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjAxLjAwI0VsZXZhdG9ycyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4wMi4wMCNIb2lzdHMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMDMuMDAjRm9ya2xpZnRzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA0LjAwI0xpZnRzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA1LjAwI0xvYWRpbmcgZXF1aXBtZW50IzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA2LjAwI1N0YWNrZXJzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA3LjAwI0NyYW5lcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4wOC4wMCNXaW5jaGVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA5LjAwI1RpbHRzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjEwLjAwI01hbmlwdWxhdG9ycyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4xMS4wMCNTbGluZ3MjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTIuMDAjSmFja3MjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTMuMDAjQmxvY2tzIG9yIHB1bGxleXMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTQuMDAjQWlyIGJhZ3MgZm9yIGxvYWRpbmcjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTUuMDAjTG9hZGluZyByYW1wcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4xNi4wMCNCZWxvdyB0aGUgaG9vayBkZXZpY2UjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTcuMDAjU2Npc3NvciBsaWZ0IzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjE4LjAwI1BpcGUgbGF5ZXIjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTkuMDAjQnJpZGdlIGNyYW5lcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4yMC4wMCNUcmFjayBjcmFuZXMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMjEuMDAjQWxsIHRlcnJhaW4gY3JhbmVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjIyLjAwI1JvdWdoIHRlcnJhaW4gY3JhbmVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjIzLjAwI1Rvd2VyIGNyYW5lcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4yNC4wMCNIeWRyYXVsaWMgdHJ1Y2sgY3JhbmVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjI1LjAwI0NvbnZlbnRpb25hbCB0cnVjayBjcmFuZXMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMjYuMDAjRXNjYWxhdG9yIG9yIHdhbGt3YXlzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjI3LjAwI0dpcmRlciB0cm9sbGV5cyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4yOC4wMCNBZGp1c3RhYmxlIGZvcmtzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjI5LjAwI0ZvcmtsaWZ0IGFjY2Vzc29yaWVzIG9yIHN1cHBsaWVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjMwLjAwI1dvcmtzaG9wIGNyYW5lcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4zMS4wMCNTdWN0aW9uIGN1cHMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMzIuMDAjU2lkZSBzaGlmdHMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDAuMDAjQ29udmV5b3JzIGFuZCBhY2Nlc3NvcmllcyMyNC4xMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4wMS4wMCNDb252ZXlvciByb2xsZXIjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDIuMDAjQmFsbCB0cmFuc2ZlciB0YWJsZXMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDMuMDAjUm9jayBiaW5zIzI0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE3LjA0LjAwI0NvbnZleW9yIGZlZWRlcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDUuMDAjQ29udmV5b3Igc2NyZXcjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDYuMDAjVHJvbGxleXMgb3IgYWNjZXNzb3JpZXMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDcuMDAjQ29udmV5b3IgcmFpbHMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDguMDAjRXh0ZW5kYWJsZSBjb252ZXlvcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDkuMDAjUm9sbGVyIGNvbnZleW9ycyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4xMC4wMCNQYWNrYWdlIHN0b3BzIzI0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE3LjExLjAwI1R1cm50YWJsZXMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMTIuMDAjQmVsdCBjb252ZXlvcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMTMuMDAjQnVja2V0IGNvbnZleW9ycyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4xNC4wMCNBaXIgY29udmV5b3JzIzI0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE3LjE1LjAwI0NvbnZleW9yIGJlbHRpbmcjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMTYuMDAjQ29udmV5b3IgcHVsbGV5cyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4xNy4wMCNDb252ZXlvciBpZGxlcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMTguMDAjQ29udmV5b3IgYmVsdCBsYWNpbmcgb3IgZmFzdGVuZXJzIzI0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE3LjE5LjAwI0NvbnZleW9yIGJlbHQgYnJ1c2hlcyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4yMC4wMCNXZWFyIHN0cmlwcyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4yMS4wMCNUcm9sbGV5IGxpZCMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4yMi4wMCNDaGFpbiBjb252ZXlvcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDAuMDAjRG9jayBlcXVpcG1lbnQjMjQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDEuMDAjRG9jayBsZXZlbGVycyMyNC4xMC4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xOC4wMi4wMCNEb2NrIHNlYWxzIzI0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE4LjAzLjAwI0RvY2sgcmFtcHMjMjQuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDQuMDAjU3RyaXAgZG9vcnMjMjQuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDUuMDAjRG9jayBidW1wZXJzIzI0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE4LjA2LjAwI0RvY2sgbGFkZGVycyMyNC4xMC4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xOC4wNy4wMCNEb2NrIHBsYXRlcyMyNC4xMC4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xOC4wOC4wMCNXaGVlbCBjaG9ja3MjMjQuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDkuMDAjRG9jayByYWlscyBhbmQgYWNjZXNzb3JpZXMjMjQuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTkuMDAuMDAjRHJ1bSBoYW5kbGluZyBlcXVpcG1lbnQjMjQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTkuMDEuMDAjRHJ1bSBvcGVuZXJzIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE5LjAyLjAwI0RydW0gZ3JhYnMjMjQuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTkuMDMuMDAjRHJ1bSBsaWZ0ZXJzIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE5LjA0LjAwI0RydW0gY3JhZGxlcyMyNC4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xOS4wNS4wMCNTcGlsbCBkZWNrIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE5LjA2LjAwI0RydW0gcmVjdXBlcmF0b3JzIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE5LjA3LjAwI1NwaWxsIGNvbnRhaW5tZW50IHN1cHBvcnRzIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjIwLjAwLjAwI1NoZWx2aW5nIGFuZCBzdG9yYWdlIzI0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIwLjAxLjAwI1JhY2sgc3lzdGVtcyBmb3IgcmFjayBtb3VudCBlbGVjdHJvbmljIGVxdWlwbWVudCMyNC4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMC4wMi4wMCNCaW4gaGFuZGxlcnMjMjQuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjAuMDMuMDAjUGFsbGV0cyMyNC4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMC4wNC4wMCNTdG9yYWdlIHJhY2tzIG9yIHNoZWx2ZXMjMjQuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjAuMDUuMDAjQXV0b21hdGVkIHN0b3JhZ2Ugb3IgcmV0cmlldmFsIHN5c3RlbXMjMjQuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjAuMDYuMDAjV29yayBiZW5jaGVzIzI0LjEwLjIwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIwLjA3LjAwI1JlZWwgc3RvcmFnZSBzaGVsdmVzIzI0LjEwLjIwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIwLjA4LjAwI1BvcnRhYmxlIHJlZWwgaG9sZGVycyMyNC4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wMC4wMCNXYXJlaG91c2luZyBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzI0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIxLjAxLjAwI0NhcmdvIGhhbmRsaW5nIGVxdWlwbWVudCMyNC4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wMi4wMCNXYXJlaG91c2UgY2Fyb3VzZWxzIzI0LjEwLjIxLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIxLjAzLjAwI1dhcmVob3VzZSBjYXNlcnMjMjQuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjEuMDQuMDAjRGVwYWxsZXRpemVycyMyNC4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wNS4wMCNQYWxsZXRpemVycyMyNC4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wNi4wMCNJbmR1c3RyaWFsIHNocmluayB3cmFwIGVxdWlwbWVudCMyNC4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wNy4wMCNDYXJ0b25pbmcgbWFjaGluZXJ5IzI0LjEwLjIxLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIxLjA4LjAwI1BhY2thZ2luZyBjb21wYWN0b3JzIzI0LjEwLjIxLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIyLjAwLjAwI1BhY2tpbmcgdG9vbHMjMjQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjIuMDEuMDAjU3RyZXRjaCBmaWxtIGRpc3BlbnNlcnMjMjQuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjIuMDIuMDAjQm94IHNlYWxpbmcgdGFwZSBkaXNwZW5zZXJzIzI0LjEwLjIyLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIyLjAzLjAwI0JhZyBzZWFsaW5nIHRvb2xzIGFuZCBlcXVpcG1lbnQjMjQuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjIuMDQuMDAjU3RyYXBwaW5nIGRpc3BlbnNlciMyNC4xMC4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMi4wNS4wMCNTdHJhcHBpbmcgdGVuc2lvbmVycyBvciBzZWFsZXJzIzI0LjEwLjIyLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIyLjA2LjAwI0NhcnRvbiBmb3JtaW5nIG1hY2hpbmVzIzI0LjEwLjIyLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIyLjA3LjAwI1RhcGluZyBtYWNoaW5lcyMyNC4xMC4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMS4wMC4wMC4wMCNDb250YWluZXJzIGFuZCBzdG9yYWdlIzI0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI0LjExLjE1LjAwLjAwI0JhZ3MjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTUuMDEuMDAjQ2FudmFzIGJhZ3MjMjQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTUuMDIuMDAjUGFwZXIgYmFncyMyNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4xNS4wMy4wMCNQbGFzdGljIGJhZ3MjMjQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTUuMDQuMDAjUG91Y2hlcyMyNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4xNS4wNS4wMCNGbGV4aWJsZSBpbnRlcm1lZGlhdGUgYnVsayBjb250YWluZXJzIzI0LjExLjE1LjAwLjAwCi11bnNwc2M3IzI0LjExLjE1LjA2LjAwI0xhdW5kcnkgbmV0cyBvciBiYWdzIzI0LjExLjE1LjAwLjAwCi11bnNwc2M3IzI0LjExLjE1LjA3LjAwI1Rvb2wgYmFncyMyNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4xNS4wOC4wMCNUZW50IGJhZyMyNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4xNi4wMC4wMCNDb3ZlcnMgYW5kIGNhcHMjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTguMDAuMDAjVGFua3MgYW5kIGN5bGluZGVycyBhbmQgdGhlaXIgYWNjZXNzb3JpZXMjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTguMDEuMDAjUmVzZXJ2b2lycyMyNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMS4xOC4wMi4wMCNBaXIgb3IgZ2FzIHRhbmtzIG9yIGN5bGluZGVycyMyNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMS4xOC4wMy4wMCNTdG9yYWdlIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjA0LjAwI0NhbGlicmF0aW5nIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjA1LjAwI0NoZW1pY2FsIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjA2LjAwI0RpcCB0YW5rcyMyNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMS4xOC4wNy4wMCNFeHBhbnNpb24gdGFua3MjMjQuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTguMDguMDAjRnVlbCBzdG9yYWdlIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjA5LjAwI1Byb2Nlc3NpbmcgdGFua3MjMjQuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTguMTAuMDAjV2F0ZXIgc3RvcmFnZSB0YW5rcyMyNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMS4xOC4xMS4wMCNDYXJib3lzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjEyLjAwI0NvbnRhaW5tZW50IGJhc2luIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjEzLjAwI1JpbnNlIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjIwLjAwLjAwI0JpbnMgYW5kIGJhc2tldHMjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjAuMDEuMDAjQmlucyMyNC4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMC4wMi4wMCNCYXNrZXRzIzI0LjExLjIwLjAwLjAwCi11bnNwc2M3IzI0LjExLjIwLjAzLjAwI05vbiBtZXRhbGxpYyBiaW5zIzI0LjExLjIwLjAwLjAwCi11bnNwc2M3IzI0LjExLjIwLjA0LjAwI01ldGFsbGljIGJpbnMjMjQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjAuMDUuMDAjTWV0YWxsaWMgYmFza2V0cyMyNC4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMC4wNi4wMCNOb24gbWV0YWxsaWMgYmFza2V0cyMyNC4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wMC4wMCNDYXNrcyBhbmQgYmFycmVscyBhbmQgZHJ1bXMjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMDEuMDAjQ2Fza3MjMjQuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMDIuMDAjQmFycmVscyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wMy4wMCNTdGFpbmxlc3Mgc3RlZWwgZHJ1bXMjMjQuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMDQuMDAjU3RlZWwgZHJ1bXMjMjQuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMDUuMDAjUG9seWV0aHlsZW5lIGRydW1zIzI0LjExLjIxLjAwLjAwCi11bnNwc2M3IzI0LjExLjIxLjA2LjAwI0NvbXBvc2l0ZSBkcnVtcyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wNy4wMCNGaWJlciBkcnVtcyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wOC4wMCNNZXRhbGxpYyBkcnVtcyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wOS4wMCNOb24gbWV0YWxsaWMgZHJ1bXMjMjQuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMTAuMDAjSW50ZXJtZWRpYXRlIGJ1bGsgY29udGFpbmVycyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4xMS4wMCNTdGFiaWxpemVyIzI0LjExLjIxLjAwLjAwCi11bnNwc2M3IzI0LjExLjIxLjEyLjAwI0RydW0gbGlkIzI0LjExLjIxLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjAwLjAwI0NhbnMgYW5kIHBhaWxzIzI0LjExLjAwLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjAxLjAwI1N0ZWVsIHBhaWxzIzI0LjExLjIyLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjAyLjAwI0dhc29saW5lIGNhbnMjMjQuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjIuMDMuMDAjUGxhc3RpYyBwYWlscyMyNC4xMS4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMi4wNC4wMCNNZXRhbGxpYyBwYWlscyMyNC4xMS4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMi4wNS4wMCNOb24gbWV0YWxsaWMgcGFpbHMjMjQuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjIuMDYuMDAjTWV0YWxsaWMgZmxhbW1hYmxlIGxpcXVpZCBjYW5zIzI0LjExLjIyLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjA3LjAwI05vbiBtZXRhbGxpYyBmbGFtbWFibGUgbGlxdWlkIGNhbnMjMjQuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjIuMDguMDAjU3ByYXkga2l0IzI0LjExLjIyLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjA5LjAwI0plcnJ5Y2FucyMyNC4xMS4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNC4wMC4wMCNTdG9yYWdlIGNoZXN0cyBhbmQgY2FiaW5ldHMgYW5kIHRydW5rcyMyNC4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNC4wMS4wMCNUb29sIGNoZXN0cyBvciBib3hlcyBvciBjYWJpbmV0cyMyNC4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNC4wMi4wMCNIYXphcmRvdXMgbWF0ZXJpYWxzIGNhYmluZXRzIzI0LjExLjI0LjAwLjAwCi11bnNwc2M3IzI0LjExLjI0LjAzLjAwI1Rvb2wgYmVsdHMjMjQuMTEuMjQuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjQuMDQuMDAjQm94IzI0LjExLjI0LjAwLjAwCi11bnNwc2M3IzI0LjExLjI0LjA1LjAwI0RyYXdlcnMjMjQuMTEuMjQuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjQuMDYuMDAjQm94IG9yIHNoZWxmIHBhcnRpdGlvbnMjMjQuMTEuMjQuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjQuMDcuMDAjTWFpbCBib3hlcyMyNC4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNC4wOC4wMCNBbnRpc3RhdGljIGJveGVzIzI0LjExLjI0LjAwLjAwCi11bnNwc2M3IzI0LjExLjI0LjA5LjAwI0JveCBsaWRzIzI0LjExLjI0LjAwLjAwCi11bnNwc2M3IzI0LjExLjI1LjAwLjAwI0NvcnJ1Z2F0ZWQgYW5kIG90aGVyIGJveGVzIGZvciBkaXN0cmlidXRpb24jMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjUuMDEuMDAjU2xvdHRlZCBjb3JydWdhdGVkIGNhcnRvbnMjMjQuMTEuMjUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjUuMDIuMDAjT25lIHBpZWNlIGRpZSBjdXQgc2hpcHBpbmcgY2FydG9ucyMyNC4xMS4yNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNS4wMy4wMCNEaWUgY3V0IGNvcnJ1Z2F0ZWQgc2hpcHBpbmcgY2FydG9ucyB3aXRoIHNlcGFyYXRlIGxpZHMjMjQuMTEuMjUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjUuMDQuMDAjTW9sZGVkIGJveGVzIzI0LjExLjI1LjAwLjAwCi11bnNwc2M3IzI0LjExLjI1LjA1LjAwI1JpZ2lkIGJveGVzIzI0LjExLjI1LjAwLjAwCi11bnNwc2M3IzI0LjExLjI1LjA2LjAwI0ZsZXhpYmxlIGludGVybWVkaWF0ZSBidWxrIGNvbnRhaW5lcnMjMjQuMTEuMjUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjUuMDcuMDAjSW50ZXJtZWRpYXRlIGJ1bGsgY29udGFpbmVycyMyNC4xMS4yNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNi4wMC4wMCNMaXF1aWQgY29udGFpbmVycyMyNC4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNi4wMS4wMCNKdWdzIzI0LjExLjI2LjAwLjAwCi11bnNwc2M3IzI0LjExLjI2LjAyLjAwI0phcnMjMjQuMTEuMjYuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMDAuMDAuMDAjUGFja2FnaW5nIG1hdGVyaWFscyMyNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMi4xNS4wMC4wMCNQYWNrYWdpbmcgYm94ZXMgYW5kIGJhZ3MgYW5kIHBvdWNoZXMjMjQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTUuMDEuMDAjUG9seSBiYWdzIzI0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE1LjAyLjAwI1BhY2thZ2luZyBwb3VjaGVzIG9yIGJhZ3MjMjQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTUuMDMuMDAjUGFja2FnaW5nIGJveGVzIzI0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE1LjA0LjAwI0NhcmRlZCBwYWNrYWdpbmcjMjQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTUuMDUuMDAjVGFycGF1bGlucyMyNC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMi4xNS4wNi4wMCNDb25kdWN0aXZlIGJveGVzIzI0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE1LjA3LjAwI1JpZ2lkIHNldCB1cCBib3hlcyMyNC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMi4xNS4wOC4wMCNFZ2cgdHJheXMjMjQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTguMDAuMDAjUGFja2FnaW5nIGNhbnMjMjQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTguMDEuMDAjQWVyb3NvbCBjYW5zIzI0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE4LjAyLjAwI1BhaW50IG9yIHZhcm5pc2ggY2FucyMyNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMi4xOC4wMy4wMCNCZXZlcmFnZSBjYW5zIzI0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE4LjA0LjAwI0Zvb2QgY2FucyMyNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMi4xOC4wNS4wMCNTdGVlbCBjYW5zIzI0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE4LjA2LjAwI0FsdW1pbnVtIGNhbnMjMjQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTIuMjAuMDAuMDAjQm90dGxlcyMyNC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMi4yMC4wMS4wMCNTcXVlZXplIGJvdHRsZXMjMjQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMjAuMDIuMDAjUGxhc3RpYyBib3R0bGVzIzI0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzI0LjEyLjIwLjAzLjAwI0dsYXNzIGJvdHRsZXMjMjQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMjAuMDQuMDAjQ2FwcyBvciB0b3BzIzI0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzI0LjEyLjIwLjA1LjAwI0FwcGxpY2F0b3IgYm90dGxlcyMyNC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMi4yMC4wNi4wMCNBcHBsaWNhdG9ycyMyNC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMy4wMC4wMC4wMCNJbmR1c3RyaWFsIHJlZnJpZ2VyYXRpb24jMjQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTUuMDAuMDAjSW5kdXN0cmlhbCByZWZyaWdlcmF0b3JzIzI0LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEzLjE1LjAxLjAwI0NvbWJpbmVkIHJlZnJpZ2VyYXRvciBmcmVlemVycyMyNC4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNS4wMi4wMCNMaXF1aWQgbml0cm9nZW4gcmVmcmlnZXJhdG9ycyMyNC4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNS4wMy4wMCNXYWxrIGluIHJlZnJpZ2VyYXRvcnMjMjQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTUuMDQuMDAjUmVmcmlnZXJhdGVkIGNvbnRhaW5lcnMjMjQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTUuMDUuMDAjUmVmcmlnZXJhdGVkIHZlc3NlbHMjMjQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTUuMDYuMDAjUmVmcmlnZXJhdGVkIHRhbmtzIzI0LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEzLjE2LjAwLjAwI0luZHVzdHJpYWwgZnJlZXplcnMjMjQuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTYuMDEuMDAjQ2hlc3QgZnJlZXplcnMjMjQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTYuMDIuMDAjVXByaWdodCBmcmVlemVycyMyNC4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNi4wMy4wMCNMb3cgdGVtcGVyYXR1cmUgZnJlZXplcnMjMjQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTYuMDQuMDAjRnJlZXplIGRyeWluZyBlcXVpcG1lbnQjMjQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTYuMDUuMDAjV2FsayBpbiBmcmVlemVycyMyNC4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNi4wNi4wMCNQbGF0ZSBmcmVlemVycyMyNC4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNi4wNy4wMCNCbGFzdCBmcmVlemVycyMyNC4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMy4xOS4wMC4wMCNJY2UgbWFrZXJzIzI0LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEzLjE5LjAxLjAwI0ljZSBjdWJlIG1ha2VycyMyNC4xMy4xOS4wMC4wMAotdW5zcHNjNyMyNC4xMy4xOS4wMi4wMCNJY2UgYmxvY2sgbWFrZXJzIzI0LjEzLjE5LjAwLjAwCi11bnNwc2M3IzI0LjE0LjAwLjAwLjAwI1BhY2tpbmcgc3VwcGxpZXMjMjQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTUuMDAuMDAjU2VjdXJpbmcgYW5kIHByb3RlY3Rpbmcgc3VwcGxpZXMjMjQuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTUuMDEuMDAjU3RyZXRjaCB3cmFwIGZpbG1zIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjAyLjAwI1NocmluayB3cmFwIGZpbG1zIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjAzLjAwI1BvbHlldGh5bGVuZSBmaWxtcyMyNC4xNC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNS4wNC4wMCNUYW1wZXIgcHJvb2Ygb3Igc2VjdXJpdHkgc2VhbHMjMjQuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTUuMDUuMDAjUG9seWV0aHlsZW5lIGZpbG1zIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjA2LjAwI1RhcnBhdWxpbnMjMjQuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTUuMDcuMDAjQW50aSBzdGF0aWMgcGFja2FnaW5nIGZpbG1zIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjA4LjAwI0NhcnRvbiBjb3JuZXIgc3VwcG9ydCMyNC4xNC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNS4wOS4wMCNSdWJiZXIgY29yZCMyNC4xNC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNS4xMC4wMCNDYWJsZSBwcm90ZWN0b3JzIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjExLjAwI0xvYWQgYmluZGVycyMyNC4xNC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNi4wMC4wMCNDdXNoaW9uaW5nIHN1cHBsaWVzIzI0LjE0LjAwLjAwLjAwCi11bnNwc2M3IzI0LjE0LjE2LjAxLjAwI0J1YmJsZSB3cmFwIzI0LjE0LjE2LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE2LjAyLjAwI1RoZXJtb2Zvcm1pbmcgbWF0ZXJpYWxzIzI0LjE0LjE2LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE2LjAzLjAwI0N1c2hpb25pbmcjMjQuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTYuMDQuMDAjV2FkZGluZyBtYXRlcmlhbHMjMjQuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTYuMDUuMDAjQWlyIGZpbGxlZCBwYWNraW5nIG1hdGVyaWFscyMyNC4xNC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNi4wNi4wMCNQYWNraW5nIHBlYW51dHMjMjQuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTYuMDcuMDAjQ2FyZGJvYXJkIGluc2VydHMjMjQuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTYuMDguMDAjUHJvdGVjdGl2ZSBlbmRzIzI0LjE0LjE2LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE3LjAwLjAwI1BhY2thZ2luZyB0dWJlcyBhbmQgY29yZXMgYW5kIGxhYmVscyBhbmQgYWNjZXNzb3JpZXMjMjQuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTcuMDEuMDAjUGFwZXIgdHViZXMgb3IgY29yZXMjMjQuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTcuMDIuMDAjVHViZSBvciBjb3JlIGVuZCBwbHVncyMyNC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNy4wMy4wMCNQYXBlciBwaWVjZXMjMjQuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTcuMDQuMDAjUHJpbnRlZCBpbnNlcnRzIG9yIGluc3RydWN0aW9ucyMyNC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNy4wNS4wMCNDb2xsYXBzaWJsZSB0dWJlcyMyNC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNy4wNi4wMCNTcG9vbCMyNC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNy4wNy4wMCNSZWVsIzI0LjE0LjE3LjAwLjAwCi11bnNwc2M3IzI1LjAwLjAwLjAwLjAwI0NvbW1lcmNpYWwgYW5kIE1pbGl0YXJ5IGFuZCBQcml2YXRlIFZlaGljbGVzIGFuZCB0aGVpciBBY2Nlc3NvcmllcyBhbmQgQ29tcG9uZW50cyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4wMC4wMC4wMCNNb3RvciB2ZWhpY2xlcyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNS4wMC4wMCNQYXNzZW5nZXIgbW90b3IgdmVoaWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTUuMDEuMDAjTWluaWJ1c2VzIzI1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE1LjAyLjAwI0J1c3NlcyMyNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNS4wMy4wMCNBdXRvbW9iaWxlcyBvciBjYXJzIzI1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE1LjA0LjAwI1N0YXRpb24gd2Fnb25zIzI1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE1LjA1LjAwI01pbml2YW5zIG9yIHZhbnMjMjUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTUuMDYuMDAjTGltb3VzaW5lcyMyNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNS4wNy4wMCNMaWdodCB0cnVja3Mgb3Igc3BvcnQgdXRpbGl0eSB2ZWhpY2xlcyMyNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNi4wMC4wMCNQcm9kdWN0IGFuZCBtYXRlcmlhbCB0cmFuc3BvcnQgdmVoaWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTYuMDEuMDAjRHVtcCB0cnVja3MjMjUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTYuMDIuMDAjVG93IHRydWNrcyMyNS4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNi4wNC4wMCNEZWxpdmVyeSB0cnVja3MjMjUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTYuMDkuMDAjU2x1ZGdlIG9yIHNld2FnZSBoYW5kbGluZyB0cnVja3MjMjUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTcuMDAuMDAjU2FmZXR5IGFuZCByZXNjdWUgdmVoaWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTcuMDEuMDAjRmlyZSBvciByZXNjdWUgdHJ1Y2tzIzI1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE3LjAyLjAwI1BvbGljZSB2ZWhpY2xlcyMyNS4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNy4wMy4wMCNBbWJ1bGFuY2VzIzI1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE4LjAwLjAwI01vdG9yaXplZCBjeWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTguMDEuMDAjTW90b3JjeWNsZXMjMjUuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTguMDIuMDAjU2Nvb3RlcnMjMjUuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTguMDMuMDAjTW9wZWRzIzI1LjEwLjE4LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE5LjAwLjAwI1NwZWNpYWxpemVkIGFuZCByZWNyZWF0aW9uYWwgdmVoaWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTkuMDEuMDAjQWdyaWN1bHR1cmFsIHRyYWN0b3JzIzI1LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE5LjAyLjAwI01vdG9yIGhvbWVzIzI1LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE5LjAzLjAwI1Nub3dtb2JpbGVzIG9yIHNub3cgc2Nvb3RlciMyNS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xOS4wNC4wMCNHb2xmIGNhcnRzIzI1LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE5LjA1LjAwI0FsbCB0ZXJyYWluIHZlaGljbGVzIHRyYWNrZWQgb3Igd2hlZWxlZCMyNS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xOS4wNi4wMCNHbyBjYXJ0IzI1LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEwLjIwLjAwLjAwI1dhciB2ZWhpY2xlcyMyNS4xMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMC4wMS4wMCNUYW5rcyMyNS4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMC4wMi4wMCNBcm1vcmVkIGZpZ2h0aW5nIHZlaGljbGVzIzI1LjEwLjIwLjAwLjAwCi11bnNwc2M3IzI1LjEwLjIwLjAzLjAwI1NlbGYgcHJvcGVsbGVkIGFydGlsbGVyeSMyNS4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMS4wMC4wMCNUcnVjayB0cmFjdG9ycyMyNS4xMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMS4wMS4wMCNMb3cgY2FiIGZvcndhcmQgdHJhY3RvcnMjMjUuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMjEuMDIuMDAjTG9uZyBub3NlIHRyYWN0b3JzIHdpdGggc2xlZXBlciMyNS4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMS4wMy4wMCNMb25nIG5vc2UgdHJhY3RvcnMgd2l0aG91dCBzbGVlcGVyIzI1LjEwLjIxLjAwLjAwCi11bnNwc2M3IzI1LjEwLjIxLjA0LjAwI0NhYiBvdmVyIGVuZ2luZSB0cmFjdG9ycyB3aXRoIHNsZWVwZXIjMjUuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMjEuMDUuMDAjQ2FiIG92ZXIgZW5naW5lIHRyYWN0b3JzIHdpdGhvdXQgc2xlZXBlciMyNS4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4xMS4wMC4wMC4wMCNNYXJpbmUgdHJhbnNwb3J0IzI1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjAwLjAwI0NvbW1lcmNpYWwgbWFyaW5lIGNyYWZ0IzI1LjExLjAwLjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjAxLjAwI1RyYXdsZXJzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjAyLjAwI0Zpc2hpbmcgYm9hdHMjMjUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTUuMDMuMDAjQ2FyZ28gb3IgY29udGFpbmVyIHNoaXBzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjA0LjAwI0RyZWRnaW5nIGNyYWZ0IzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjA1LjAwI1RhbmtlcnMjMjUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTUuMDYuMDAjVHVnIGJvYXRzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjA3LjAwI0JhcmdlcyMyNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNS4wOC4wMCNQYXNzZW5nZXIgb3IgYXV0b21vYmlsZSBmZXJyaWVzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjA5LjAwI0NydWlzZSBzaGlwcyMyNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNS4xMC4wMCNTYWx2YWdlIHNoaXBzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjExLjAwI09pbCBvciBnYXMgY3JldyBib2F0IzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjEyLjAwI09pbCBvciBnYXMgd29ya2JvYXQjMjUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTUuMTMuMDAjU2Vpc21pYyB2ZXNzZWwjMjUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTYuMDAuMDAjU2FmZXR5IGFuZCByZXNjdWUgd2F0ZXIgY3JhZnQjMjUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTYuMDEuMDAjTGlmZWJvYXRzIG9yIGxpZmVyYWZ0cyMyNS4xMS4xNi4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNi4wMi4wMCNGaXJlIGZpZ2h0aW5nIHdhdGVyY3JhZnQjMjUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTYuMDMuMDAjUmVzY3VlIHNoaXBzIG9yIGJvYXRzIzI1LjExLjE2LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjAwLjAwI01pbGl0YXJ5IHdhdGVyY3JhZnQjMjUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMDEuMDAjU3VibWFyaW5lcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wMi4wMCNBaXJjcmFmdCBjYXJyaWVycyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wMy4wMCNBbW11bml0aW9uIHNoaXBzIzI1LjExLjE3LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjA0LjAwI0FtcGhpYmlvdXMgYXNzYXVsdCBzaGlwcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wNS4wMCNBbXBoaWJpb3VzIHRyYW5zcG9ydCBkb2NrcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wNi4wMCNBbXBoaWJpb3VzIGNvbW1hbmQgc2hpcHMjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMDcuMDAjQ29tbWFuZCBzaGlwcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wOC4wMCNDcnVpc2VycyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wOS4wMCNEZXN0cm95ZXJzIzI1LjExLjE3LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjEwLjAwI0RvY2sgbGFuZGluZyBzaGlwcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xMS4wMCNGYXN0IGNvbWJhdCBzdXBwb3J0IHNoaXBzIzI1LjExLjE3LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjEyLjAwI0ZyaWdhdGVzIzI1LjExLjE3LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjEzLjAwI0ZsZWV0IG9pbGVycyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xNC4wMCNVdGlsaXR5IGxhbmRpbmcgd2F0ZXJjcmFmdCMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xNS4wMCNNZWNoYW5pemVkIG9yIHV0aWxpdHkgd2F0ZXJjcmFmdCMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xNi4wMCNNaW5lIGh1bnRpbmcgc2hpcHMjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMTcuMDAjTWluZSBjb3VudGVybWVhc3VyZXMgc2hpcHMjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMTguMDAjQ29hc3RhbCBwYXRyb2wgd2F0ZXJjcmFmdCMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xOS4wMCNTdWJtYXJpbmUgdGVuZGVycyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4yMC4wMCNUYW5rIGxhbmRpbmcgc2hpcHMjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMjEuMDAjQWlyIGN1c2hpb25lZCBsYW5kaW5nIHdhdGVyY3JhZnQjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTguMDAuMDAjUmVjcmVhdGlvbmFsIHdhdGVyY3JhZnQjMjUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTguMDEuMDAjUmVjcmVhdGlvbmFsIHNhaWxib2F0cyMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOC4wMi4wMCNSZWNyZWF0aW9uYWwgbW90b3Jib2F0cyMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOC4wMy4wMCNSZWNyZWF0aW9uYWwgcm93Ym9hdHMjMjUuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTguMDQuMDAjQ2Fub2VzIG9yIGtheWFrcyMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOC4wNS4wMCNQZXJzb25hbCBtb3Rvcml6ZWQgd2F0ZXJjcmFmdCMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOC4wNi4wMCNSYWZ0cyMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wMC4wMCNNYXJpbmUgY3JhZnQgc3lzdGVtcyBhbmQgc3ViYXNzZW1ibGllcyMyNS4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wMS4wMCNNYXJpbmUgY3JhZnQgY29tbXVuaWNhdGlvbnMgc3lzdGVtcyMyNS4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wMi4wMCNNYXJpbmUgcHJvcGVsbGVycyMyNS4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wMy4wMCNTYWlscyMyNS4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wNC4wMCNQYWRkbGVzIzI1LjExLjE5LjAwLjAwCi11bnNwc2M3IzI1LjExLjE5LjA1LjAwI01hcmluZSBiYWxsYXN0IHN5c3RlbXMjMjUuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMDAuMDAuMDAjUmFpbHdheSBhbmQgdHJhbXdheSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNS4wMC4wMCNMb2NvbW90aXZlcyBhbmQgZWxlY3RyaWMgdHJvbGxleXMjMjUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTUuMDEuMDAjRGllc2VsIGZyZWlnaHQgbG9jb21vdGl2ZXMjMjUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTUuMDIuMDAjRWxlY3RyaWMgZnJlaWdodCBsb2NvbW90aXZlcyMyNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNS4wMy4wMCNEaWVzZWwgcGFzc2VuZ2VyIGxvY29tb3RpdmVzIzI1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEyLjE1LjA0LjAwI0VsZWN0cmljIHBhc3NlbmdlciBsb2NvbW90aXZlcyMyNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNi4wMC4wMCNSYWlsd2F5IGFuZCB0cmFtd2F5IGNhcnMjMjUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTYuMDEuMDAjRnJlaWdodCByYWlsIGNhcnMjMjUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTYuMDIuMDAjVGFua2VyIHJhaWwgY2FycyMyNS4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNi4wMy4wMCNQYXNzZW5nZXIgcmFpbCBjYXJzIzI1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI1LjEyLjE2LjA0LjAwI0hvcHBlciByYWlsIGNhcnMjMjUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTYuMDUuMDAjU3RyZWV0Y2FycyBvciB0cmFtd2F5IGNhcnMjMjUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTcuMDAuMDAjUmFpbHJvYWQgc3VwcG9ydCBlcXVpcG1lbnQgYW5kIHN5c3RlbXMjMjUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTcuMDEuMDAjUmFpbCBzd2l0Y2hpbmcgc3lzdGVtcyMyNS4xMi4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNy4wMi4wMCNSYWlsd2F5IHNsZWVwZXJzIzI1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEyLjE3LjAzLjAwI1JhaWx3YXkgdHJhY2tzIzI1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEyLjE3LjA0LjAwI1JhaWx3YXkgZnJvZ3Mgb3IgZmlzaCBwbGF0ZXMjMjUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMDAuMDAuMDAjQWlyY3JhZnQjMjUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTUuMDAuMDAjUG93ZXJlZCBmaXhlZCB3aW5nIGFpcmNyYWZ0IzI1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjE1LjAxLjAwI0ZpeGVkIHdpbmcgYWdyaWN1bHR1cmFsIGFpcmNyYWZ0IzI1LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE1LjAyLjAwI0NhcmdvIHByb3BlbGxlciBhaXJjcmFmdCMyNS4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNS4wMy4wMCNTZWFwbGFuZXMjMjUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTUuMDQuMDAjQ29tbWVyY2lhbCBwYXNzZW5nZXIgcHJvcGVsbGVyIGFpcmNyYWZ0IzI1LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE1LjA1LjAwI0NhcmdvIGpldCBhaXJjcmFmdCMyNS4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNS4wNi4wMCNDb21tZXJjaWFsIHBhc3NlbmdlciBqZXQgYWlyY3JhZnQjMjUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTUuMDcuMDAjUHJpdmF0ZSBvciBidXNpbmVzcyBwcm9wZWxsZXIgYWlyY3JhZnQjMjUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTUuMDguMDAjUHJpdmF0ZSBvciBidXNpbmVzcyBqZXQgYWlyY3JhZnQjMjUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTYuMDAuMDAjQ2l2aWxpYW4gYW5kIGNvbW1lcmNpYWwgcm90YXJ5IHdpbmcgYWlyY3JhZnQjMjUuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTYuMDEuMDAjUGFzc2VuZ2VyIHRyYW5zcG9ydCBoZWxpY29wdGVycyMyNS4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNi4wMi4wMCNDYXJnbyB0cmFuc3BvcnQgaGVsaWNvcHRlcnMjMjUuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTYuMDMuMDAjQWdyaWN1bHR1cmFsIGhlbGljb3B0ZXJzIzI1LjEzLjE2LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE2LjA0LjAwI01lZGljYWwgb3IgcmVzY3VlIGhlbGljb3B0ZXJzIzI1LjEzLjE2LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjAwLjAwI01pbGl0YXJ5IGZpeGVkIHdpbmcgYWlyY3JhZnQjMjUuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTcuMDEuMDAjQm9tYmVyIGFpcmNyYWZ0IzI1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjAyLjAwI0ZpZ2h0ZXIgYm9tYmVyIGFpcmNyYWZ0IzI1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjAzLjAwI0ZpZ2h0ZXIgYWlyY3JhZnQjMjUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTcuMDQuMDAjQXR0YWNrIGFpcmNyYWZ0IzI1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjA1LjAwI1RhcmdldCBvciByZWNvbm5haXNzYW5jZSBkcm9uZXMjMjUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTcuMDYuMDAjTWlsaXRhcnkgc2VhcGxhbmVzIzI1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjA3LjAwI1JlY29ubmFpc3NhbmNlIG9yIHN1cnZlaWxsYW5jZSBhaXJjcmFmdCMyNS4xMy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNy4wOC4wMCNBbnRpIHN1Ym1hcmluZSBhaXJjcmFmdCMyNS4xMy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNy4wOS4wMCNNaWxpdGFyeSB0cmFuc3BvcnQgYWlyY3JhZnQjMjUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTguMDAuMDAjU3BlY2lhbHR5IGFpcmNyYWZ0IzI1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjE4LjAxLjAwI0FpcnNoaXBzIzI1LjEzLjE4LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE5LjAwLjAwI01pbGl0YXJ5IHJvdGFyeSB3aW5nIGFpcmNyYWZ0IzI1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjE5LjAyLjAwI01pbGl0YXJ5IHRyYW5zcG9ydCBoZWxpY29wdGVycyMyNS4xMy4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMy4xOS4wMy4wMCNBdHRhY2sgaGVsaWNvcHRlcnMjMjUuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTkuMDQuMDAjUmVjb25uYWlzc2FuY2UgaGVsaWNvcHRlcnMjMjUuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTkuMDUuMDAjQW50aSBzdWJtYXJpbmUgaGVsaWNvcHRlcnMjMjUuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTkuMDYuMDAjVGlsdCByb3RvciB3aW5nIGFpcmNyYWZ0IzI1LjEzLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEzLjIwLjAwLjAwI1JlY3JlYXRpb25hbCBhaXJjcmFmdCMyNS4xMy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMy4yMC4wMS4wMCNIYW5nIGdsaWRlcnMjMjUuMTMuMjAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMjAuMDIuMDAjSG90IGFpciBiYWxsb29ucyMyNS4xMy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xMy4yMC4wMy4wMCNHbGlkZXJzIzI1LjEzLjIwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjIwLjA0LjAwI1BhcmFnbGlkZXJzIzI1LjEzLjIwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjIwLjA1LjAwI1VsdHJhIGxpZ2h0IGFpcmNyYWZ0IzI1LjEzLjIwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjIxLjAwLjAwI0FpcmNyYWZ0IG1hbmFnZW1lbnQgc2VydmljZXMjMjUuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMjEuMDEuMDAjQWlyY3JhZnQgcGlsb3RzIzI1LjEzLjIxLjAwLjAwCi11bnNwc2M3IzI1LjEzLjIxLjAyLjAwI0FpcmNyYWZ0IG1haW50ZW5hbmNlIG9yIHNlcnZpY2VzIzI1LjEzLjIxLjAwLjAwCi11bnNwc2M3IzI1LjE1LjAwLjAwLjAwI1NwYWNlY3JhZnQjMjUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTUuMDAuMDAjU3BhY2VzaGlwcyMyNS4xNS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNS4xNS4wMS4wMCNNYW5uZWQgc3BhY2VjcmFmdCMyNS4xNS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNS4xNS4wMi4wMCNTcGFjZWNyYWZ0IHN0cnVjdHVyZXMjMjUuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDAuMDAjU2F0ZWxsaXRlcyMyNS4xNS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNS4xNy4wMS4wMCNDb21tdW5pY2F0aW9uIHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDIuMDAjV2VhdGhlciBzYXRlbGxpdGVzIzI1LjE1LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE1LjE3LjAzLjAwI01pbGl0YXJ5IHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDQuMDAjU2NpZW50aWZpYyBvciByZXNlYXJjaCBzYXRlbGxpdGVzIzI1LjE1LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE1LjE3LjA1LjAwI05hdmlnYXRpb24gc2F0ZWxsaXRlcyMyNS4xNS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNS4xNy4wNi4wMCNHZW9zdGF0aW9uYXJ5IHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDcuMDAjTG93IGVhcnRoIG9yYml0IHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDguMDAjU3VuIHN5bmNocm9ub3VzIG9yYml0IHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDkuMDAjR2Vvc3luY2hyb25vdXMgc2F0ZWxsaXRlcyMyNS4xNS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNi4wMC4wMC4wMCNOb24gbW90b3JpemVkIGN5Y2xlcyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNi4xNS4wMC4wMCNQZWRhbCBwb3dlcmVkIHZlaGljbGVzIzI1LjE2LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE2LjE1LjAxLjAwI1RvdXJpbmcgYmljeWNsZXMjMjUuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTYuMTUuMDIuMDAjVW5pY3ljbGVzIzI1LjE2LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE2LjE1LjAzLjAwI1RyaWN5Y2xlcyMyNS4xNi4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNi4xNS4wNC4wMCNUYW5kZW0gYmljeWNsZXMjMjUuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTYuMTUuMDUuMDAjTW91bnRhaW4gYmljeWNsZXMjMjUuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTYuMTUuMDYuMDAjUmFjaW5nIGJpY3ljbGVzIzI1LjE2LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE2LjE1LjA3LjAwI0JpY3ljbGVzIzI1LjE2LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE2LjE1LjA4LjAwI1JlY3VtYmVudCBiaWN5Y2xlcyMyNS4xNi4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNi4xNS4wOS4wMCNDaGlsZHJlbnMgYmljeWNsZXMjMjUuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMDAuMDAuMDAjVHJhbnNwb3J0YXRpb24gY29tcG9uZW50cyBhbmQgc3lzdGVtcyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNS4wMC4wMCNXaW5kc2hpZWxkIHdpcGVycyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNS4wMS4wMCNBaXJjcmFmdCB3aW5kc2hpZWxkIHdpcGVycyMyNS4xNy4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNS4wMi4wMCNBdXRvbW90aXZlIHdpbmRzaGllbGQgd2lwZXJzIzI1LjE3LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE1LjAzLjAwI0xvY29tb3RpdmUgd2luZHNoaWVsZCB3aXBlcnMjMjUuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTUuMDQuMDAjTWFyaW5lIHdpbmRzaGllbGQgd2lwZXJzIzI1LjE3LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE1LjA1LjAwI1RydWNrIHdpbmRzaGllbGQgd2lwZXJzIzI1LjE3LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE1LjA2LjAwI1dpbmRzaGllbGQgd2lwZXIgcHVtcCMyNS4xNy4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNi4wMC4wMCNEZWZyb3N0aW5nIGFuZCBkZWZvZ2dpbmcgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNi4wMS4wMCNBaXJjcmFmdCBvbmJvYXJkIGRlZnJvc3Rpbmcgb3IgZGVmb2dnaW5nIHN5c3RlbXMjMjUuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTYuMDIuMDAjQXV0b21vdGl2ZSBkZWZyb3N0aW5nIG9yIGRlZm9nZ2luZyBzeXN0ZW1zIzI1LjE3LjE2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE2LjAzLjAwI1RyYWluIGRlZnJvc3Rpbmcgb3IgZGVmb2dnaW5nIHN5c3RlbXMjMjUuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMDAuMDAjQnJha2luZyBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjAxLjAwI0FpcmNyYWZ0IGJyYWtpbmcgc3lzdGVtcyMyNS4xNy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNy4wMi4wMCNBdXRvbW90aXZlIGJyYWtpbmcgc3lzdGVtcyMyNS4xNy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNy4wMy4wMCNUcmFpbiBicmFraW5nIHN5c3RlbXMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMDQuMDAjRHJhZyBjaHV0ZXMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMDUuMDAjUm90b3JzIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjA2LjAwI0JyYWtlIGNhbGlwZXJzIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjA3LjAwI0RydW0gYnJha2UjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMDguMDAjRGlzYyBicmFrZSMyNS4xNy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNy4wOS4wMCNMaXF1aWQgY29vbGVkIGJyYWtlIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjEwLjAwI01hc3RlciBjeWxpbmRhcnMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMTEuMDAjU2xhdmUgY3lsaW5kZXJzIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjEyLjAwI0RydW0gYnJha2Ugc2hvZXMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMTMuMDAjRGlzYyBicmFrZSBwYWRzIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjE0LjAwI0JyYWtlIGRydW0jMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMTUuMDAjRGlzYyBicmFrZSByb3RvcnMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMTYuMDAjQnJha2UgbGluZXMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTkuMDAuMDAjV2hlZWxzIGFuZCB3aGVlbCB0cmltcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4xOS4wMS4wMCNBdXRvbW9iaWxlIHJpbXMgb3Igd2hlZWxzIzI1LjE3LjE5LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE5LjAyLjAwI1RyYWluIHdoZWVscyMyNS4xNy4xOS4wMC4wMAotdW5zcHNjNyMyNS4xNy4xOS4wMy4wMCNUcnVjayByaW1zIG9yIHdoZWVscyMyNS4xNy4xOS4wMC4wMAotdW5zcHNjNyMyNS4xNy4xOS4wNC4wMCNBaXJjcmFmdCB3aGVlbHMjMjUuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTkuMDUuMDAjVGlyZSB2YWx2ZXMjMjUuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjAuMDAuMDAjU3VzcGVuc2lvbiBzeXN0ZW0gY29tcG9uZW50cyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wMS4wMCNBdXRvbW9iaWxlIHN1c3BlbnNpb24gc3lzdGVtcyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wMi4wMCNUcnVjayBzdXNwZW5zaW9uIHN5c3RlbXMjMjUuMTcuMjAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjAuMDMuMDAjVHJ1Y2sgc2hvY2sgYWJzb3JiZXJzIzI1LjE3LjIwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIwLjA0LjAwI0F1dG9tb2JpbGUgc2hvY2sgYWJzb3JiZXJzIzI1LjE3LjIwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIwLjA1LjAwI1RyYWluIHN1c3BlbnNpb24gc3lzdGVtcyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wNi4wMCNTdGVlcmluZyBzeXN0ZW1zIzI1LjE3LjIwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIwLjA3LjAwI1N0cnV0cyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wOC4wMCNCYWxsIGpvaW50cyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wOS4wMCNBdXRvbW90aXZlIGJ1c2hpbmdzIzI1LjE3LjIwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIwLjEwLjAwI1N3YXkgYmFycyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4xMS4wMCNTaG9jayBhYnNvcmJlciMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMS4wMC4wMCNWZWhpY2xlIHNhZmV0eSBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIxLjAxLjAwI0FpcmJhZ3MjMjUuMTcuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjEuMDIuMDAjQWlyY3JhZnQgbGFwYmVsdHMjMjUuMTcuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjEuMDMuMDAjQWlyY3JhZnQgaGFybmVzcyByZXN0cmFpbnRzIzI1LjE3LjIxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIxLjA0LjAwI1NlYXRiZWx0cyMyNS4xNy4yMS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMS4wNS4wMCNDb2xsaXNpb24gYXZvaWRhbmNlIHN5c3RlbXMjMjUuMTcuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjEuMDYuMDAjSW1wYWN0IHNlbnNpbmcgc3lzdGVtcyMyNS4xNy4yMS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMS4wNy4wMCNBdXRvbW90aXZlIHNlYXRiZWx0cyMyNS4xNy4yMS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMS4wOC4wMCNIZWFkIHJlc3RyYWludHMjMjUuMTcuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjIuMDAuMDAjVmVoaWNsZSBkb29ycyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMi4wMS4wMCNSZW1vdmFibGUgYXV0b21vdGl2ZSBkb29ycyMyNS4xNy4yMi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMi4wMi4wMCNBaXJjcmFmdCBkb29ycyMyNS4xNy4yMi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMi4wMy4wMCNBdXRvbW90aXZlIGRvb3JzIzI1LjE3LjIyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIyLjA0LjAwI1JvbGwgdXAgdHJ1Y2sgZG9vcnMjMjUuMTcuMjIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjIuMDUuMDAjVGFpbGdhdGVzIG9yIGxpZnRnYXRlcyMyNS4xNy4yMi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMy4wMC4wMCNWZWhpY2xlIHdpbmRvd3MgYW5kIHdpbmRzaGllbGRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIzLjAxLjAwI0F1dG9tb3RpdmUgd2luZHNoaWVsZHMjMjUuMTcuMjMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjMuMDIuMDAjQWlyY3JhZnQgd2luZG93cyMyNS4xNy4yMy4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMy4wMy4wMCNBdXRvbW90aXZlIHdpbmRvd3MjMjUuMTcuMjMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjMuMDQuMDAjQWlyY3JhZnQgd2luZHNoaWVsZHMjMjUuMTcuMjMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjQuMDAuMDAjRnVlbCB0YW5rcyBhbmQgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNC4wMS4wMCNBaXJjcmFmdCBpbnRlcm5hbCBmdWVsIHRhbmtzIzI1LjE3LjI0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI0LjAyLjAwI0FpcmNyYWZ0IGZ1ZWwgZHJvcCB0YW5rcyMyNS4xNy4yNC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNC4wMy4wMCNBaXJjcmFmdCBwcm9wZWxsZW50IHRhbmtzIzI1LjE3LjI0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI0LjA0LjAwI0h5YnJpZCBmdWVsIHN0b3JhZ2Ugc3lzdGVtcyMyNS4xNy4yNC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNC4wNS4wMCNGdWVsIGluamVjdGlvbiBzeXN0ZW1zIzI1LjE3LjI0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI0LjA2LjAwI0Z1ZWwgdGFua3MjMjUuMTcuMjQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjQuMDcuMDAjQnJlYXRoZXIgZWxlbWVudHMjMjUuMTcuMjQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjQuMDguMDAjRnVlbCBvciBvaWwgY2FwcyMyNS4xNy4yNC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNS4wMC4wMCNUaXJlcyBhbmQgdGlyZSB0dWJlcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNS4wMS4wMCNBaXJjcmFmdCB0aXJlcyMyNS4xNy4yNS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNS4wMi4wMCNBdXRvbW9iaWxlIHRpcmUgdHViZXMjMjUuMTcuMjUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjUuMDMuMDAjSGVhdnkgdHJ1Y2sgdGlyZXMjMjUuMTcuMjUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjUuMDQuMDAjQXV0b21vYmlsZSBvciBsaWdodCB0cnVjayB0aXJlcyMyNS4xNy4yNS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNS4wNS4wMCNCaWN5Y2xlIHR1YmVzIzI1LjE3LjI1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI1LjA2LjAwI0JpY3ljbGUgdGlyZXMjMjUuMTcuMjUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjUuMDcuMDAjVGlyZSBjb3JkIzI1LjE3LjI1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI1LjA4LjAwI1RpcmUgdHJlYWRzIzI1LjE3LjI1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI2LjAwLjAwI1ZlaGljbGUgdHJpbSBhbmQgZXh0ZXJpb3IgY292ZXJpbmcjMjUuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjYuMDEuMDAjQXV0b21vdGl2ZSB0cmltIzI1LjE3LjI2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI2LjAyLjAwI0F1dG9tb3RpdmUgZmVuZGVycyMyNS4xNy4yNi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNi4wMy4wMCNWZWhpY2xlIGJ1bXBlcnMjMjUuMTcuMjYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjYuMDQuMDAjVmVoaWNsZSBtaXJyb3JzIzI1LjE3LjI2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI2LjA1LjAwI1ZlaGljbGUgZ3JpbGxlcyMyNS4xNy4yNi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNi4wNi4wMCNWZWhpY2xlIGhvb2RzIzI1LjE3LjI2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI2LjA3LjAwI1ZlaGljbGUgc2lkZSBwYW5lbHMjMjUuMTcuMjYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjYuMDguMDAjRmFzY2lhcyMyNS4xNy4yNi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNy4wMC4wMCNFbnZpcm9ubWVudGFsIGNvbnRyb2wgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNy4wMS4wMCNBaXJjcmFmdCBlbnZpcm9ubWVudGFsIGNvbnRyb2wgc3lzdGVtcyMyNS4xNy4yNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNy4wMi4wMCNTcGFjZSBlbnZpcm9ubWVudGFsIGNvbnRyb2wgc3lzdGVtcyMyNS4xNy4yNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNy4wMy4wMCNNYXJpbmUgZW52aXJvbm1lbnRhbCBjb250cm9sIHN5c3RlbXMjMjUuMTcuMjcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjcuMDQuMDAjVmVoaWNsZSBjbGltYXRlIGNvbnRyb2wgc3lzdGVtcyMyNS4xNy4yNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOC4wMC4wMCNIeWRyYXVsaWMgc3lzdGVtcyBhbmQgY29tcG9uZW50cyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOC4wMS4wMCNBaXJjcmFmdCBoeWRyYXVsaWMgc3lzdGVtcyMyNS4xNy4yOC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOC4wMi4wMCNBdXRvbW90aXZlIGh5ZHJhdWxpYyBzeXN0ZW1zIzI1LjE3LjI4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI4LjAzLjAwI01hcmluZSBoeWRyYXVsaWMgc3lzdGVtcyMyNS4xNy4yOC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOS4wMC4wMCNFeHRlcmlvciB2ZWhpY2xlIGxpZ2h0aW5nIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjI5LjAxLjAwI0V4dGVyaW9yIGF1dG9tb2JpbGUgbGlnaHRpbmcjMjUuMTcuMjkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjkuMDIuMDAjRXh0ZXJpb3IgYWlyY3JhZnQgbGlnaHRpbmcjMjUuMTcuMjkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjkuMDMuMDAjRXh0ZXJpb3IgcmFpbGNhciBsaWdodGluZyMyNS4xNy4yOS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOS4wNC4wMCNFeHRlcmlvciBzaGlwIG9yIGJvYXQgbGlnaHRpbmcjMjUuMTcuMjkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjkuMDUuMDAjSGVhZGxhbXAgd2lwZXIgb3Igd2FzaGVyIHN5c3RlbXMjMjUuMTcuMjkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjkuMDYuMDAjUmVmbGVjdG9ycyMyNS4xNy4yOS4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMC4wMC4wMCNJbnRlcmlvciB2ZWhpY2xlIGxpZ2h0aW5nIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMwLjAxLjAwI0ludGVyaW9yIGF1dG9tb2JpbGUgbGlnaHRpbmcjMjUuMTcuMzAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzAuMDIuMDAjSW50ZXJpb3IgYWlyY3JhZnQgbGlnaHRpbmcjMjUuMTcuMzAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzAuMDMuMDAjSW50ZXJpb3IgcmFpbGNhciBsaWdodGluZyMyNS4xNy4zMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMC4wNC4wMCNJbnRlcmlvciBzaGlwIG9yIGJvYXQgbGlnaHRpbmcjMjUuMTcuMzAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzAuMDUuMDAjTGlnaHQgcGxhdGUgYXNzZW1ibGllcyMyNS4xNy4zMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMS4wMC4wMCNMb2NhdGlvbiBhbmQgbmF2aWdhdGlvbiBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMxLjAxLjAwI0FpcmNyYWZ0IGRpZ2l0YWwgYWx0aXR1ZGUgY29udHJvbCBzeXN0ZW1zIzI1LjE3LjMxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMxLjAyLjAwI0FpcmNyYWZ0IG5hdmlnYXRpb24gYmVhY29ucyMyNS4xNy4zMS4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMS4wMy4wMCNUZXJyYWluIGZvbGxvd2luZyBzeXN0ZW1zIzI1LjE3LjMxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMxLjA0LjAwI0FpcmNyYWZ0IGd1aWRhbmNlIHN5c3RlbXMjMjUuMTcuMzEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzEuMDUuMDAjQWlyY3JhZnQgc3RlZXJpbmcgY29udHJvbHMjMjUuMTcuMzEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzEuMDYuMDAjU3BhY2VjcmFmdCBhdHRpdHVkZSBjb250cm9sIHN5c3RlbXMjMjUuMTcuMzEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzEuMDcuMDAjVmVoaWN1bGFyIGdsb2JhbCBwb3NpdGlvbmluZyBzeXN0ZW1zIzI1LjE3LjMxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMyLjAwLjAwI0NvbW11bmljYXRpb25zIHJlbGF0ZWQgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMi4wMS4wMCNBaXJjcmFmdCBjb21tdW5pY2F0aW9uIHN5c3RlbXMjMjUuMTcuMzIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzIuMDIuMDAjRmxpZ2h0IHJlY29yZGVycyMyNS4xNy4zMi4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMi4wMy4wMCNBaXJjcmFmdCBjb3VudGVybWVhc3VyZXMjMjUuMTcuMzIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzIuMDQuMDAjQWlyY3JhZnQgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHN5c3RlbXMjMjUuMTcuMzIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzIuMDUuMDAjQWlyY3JhZnQgdGVsZW1ldHJ5IHN5c3RlbXMjMjUuMTcuMzIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzIuMDYuMDAjQWlyY3JhZnQgaW50ZXJmYWNlIGVsZWN0cm9uaWNzIzI1LjE3LjMyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMzLjAwLjAwI01hc3RlciBjb250cm9sIHN5c3RlbXMjMjUuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzMuMDEuMDAjRmxpZ2h0IGNvbXB1dGVyIHN5c3RlbXMjMjUuMTcuMzMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzMuMDIuMDAjU3BhY2VjcmFmdCBjb21tYW5kIG1vZHVsZXMjMjUuMTcuMzMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzMuMDMuMDAjQXV0b21vdGl2ZSBjb21wdXRlciBzeXN0ZW1zIzI1LjE3LjMzLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMzLjA0LjAwI0VsZWN0cm9uaWMgaWduaXRpb24gc3lzdGVtcyMyNS4xNy4zMy4wMC4wMAotdW5zcHNjNyMyNS4xNy4zNC4wMC4wMCNWZWhpY2xlIGVtZXJnZW5jeSBzeXN0ZW1zIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjM0LjAxLjAwI0FpcmNyYWZ0IGZpcmUgY29udHJvbCBvciBleHRpbmd1aXNoaW5nIHN5c3RlbXMjMjUuMTcuMzQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzQuMDIuMDAjQWlyY3JhZnQgZXNjYXBlIG9yIGVqZWN0aW9uIHN5c3RlbXMjMjUuMTcuMzQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzQuMDMuMDAjQWlyY3JhZnQgd2FybmluZyBzeXN0ZW1zIzI1LjE3LjM0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM1LjAwLjAwI1ZlaGljbGUgcG93ZXIgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zNS4wMS4wMCNTcGFjZWNyYWZ0IHNvbGFyIGNlbGxzIzI1LjE3LjM1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM1LjAyLjAwI1NwYWNlY3JhZnQgc29sYXIgYXJyYXlzIzI1LjE3LjM1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM2LjAwLjAwI1ZlaGljbGUgaW5zdHJ1bWVudGF0aW9uIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjM2LjAxLjAwI0FpcmNyYWZ0IGNvY2twaXQgZGlzcGxheXMjMjUuMTcuMzYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzcuMDAuMDAjRXhoYXVzdCBhbmQgZW1pc3Npb24gY29udHJvbHMjMjUuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzcuMDEuMDAjQ2F0YWx5dGljIGNvbnZlcnRlcnMjMjUuMTcuMzcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzcuMDIuMDAjTXVmZmxlcnMjMjUuMTcuMzcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzcuMDMuMDAjRXhoYXVzdCBtYW5pZm9sZHMjMjUuMTcuMzcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDAuMDAjRHJpdmV0cmFpbiBzeXN0ZW1zIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjAxLjAwI0RyaXZpbmcgYXhsZXMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDIuMDAjTm9uIGRyaXZpbmcgYXhsZXMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDMuMDAjQXhsZSBob3VzaW5ncyMyNS4xNy4zOC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zOC4wNC4wMCNBeGxlIHNwaW5kbGVzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjA1LjAwI0RpZmZlcmVudGlhbHMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDYuMDAjQ29uc3RhbnQgdmVsb2NpdHkgam9pbnRzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjA3LjAwI0F4bGUgc2hhZnRzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjA4LjAwI0F4bGUgcmVwYWlyIGtpdHMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDkuMDAjQXhsZSBodWJzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjEwLjAwI1VuaXZlcnNhbCBqb2ludHMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMTEuMDAjRHJpdmUgc2hhZnRzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjEyLjAwI01hbnVhbCB0cmFuc21pc3Npb25zIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjEzLjAwI0F1dG9tYXRpYyB0cmFuc21pc3Npb25zIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjE0LjAwI1Bvd2VyIHRha2Ugb2ZmcyMyNS4xNy4zOC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zOC4xNS4wMCNDbHV0Y2ggY2FibGVzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjE2LjAwI0h5ZHJhdWxpYyBjbHV0Y2ggcGFydHMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMTcuMDAjRHJpdmV0cmFpbiBjaGFpbnMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzkuMDAuMDAjRWxlY3RyaWNhbCBjb21wb25lbnRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjM5LjAxLjAwI0lnbml0aW9uIzI1LjE3LjM5LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQwLjAwLjAwI0VuZ2luZSBjb29sYW50IHN5c3RlbSMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy40MC4wMS4wMCNGYW4jMjUuMTcuNDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDAuMDIuMDAjVmVoaWNsZSByYWRpYXRvcnMjMjUuMTcuNDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDAuMDMuMDAjUmFkaWF0b3IgY2FwcyMyNS4xNy40MC4wMC4wMAotdW5zcHNjNyMyNS4xNy40MC4wNC4wMCNFbmdpbmUgY29vbGFudCMyNS4xNy40MC4wMC4wMAotdW5zcHNjNyMyNS4xNy40MS4wMC4wMCNSb29mIHN5c3RlbXMjMjUuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDEuMDEuMDAjRW1lcmdlbmN5IHZlaGljbGUgZXhpdHMjMjUuMTcuNDEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDEuMDIuMDAjUGVybWFuZW50IGNvbnZlcnRpYmxlIHJvb2YgdG9wcyMyNS4xNy40MS4wMC4wMAotdW5zcHNjNyMyNS4xNy40MS4wMy4wMCNSZW1vdmFibGUgaGFyZCByb29mIHRvcHMjMjUuMTcuNDEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDEuMDQuMDAjUmVtb3ZhYmxlIHNvZnQgcm9vZiB0b3BzIzI1LjE3LjQxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQxLjA1LjAwI1Jvb2YgcmFjayBzeXN0ZW1zIzI1LjE3LjQxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQxLjA2LjAwI1N1bnJvb2ZzIG9yIG1vb25yb29mcyMyNS4xNy40MS4wMC4wMAotdW5zcHNjNyMyNS4xNy40MS4wNy4wMCNXaW5kIGRlZmxlY3RvcnMjMjUuMTcuNDEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDAuMDAjU3RlZXJpbmcgc3lzdGVtIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQyLjAxLjAwI1N0ZWVyaW5nIHNhY2tzIzI1LjE3LjQyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQyLjAyLjAwI1N0ZWVyaW5nIHN1c3BlbnNpb24jMjUuMTcuNDIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDMuMDAjQmFsbCBqb2ludCMyNS4xNy40Mi4wMC4wMAotdW5zcHNjNyMyNS4xNy40Mi4wNC4wMCNQb3dlciBzdGVlcmluZyBzeXN0ZW0jMjUuMTcuNDIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDUuMDAjVGllIFJvZHMjMjUuMTcuNDIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDYuMDAjRHJhZyBsaW5rIzI1LjE3LjQyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQyLjA3LjAwI1N0ZWVyaW5nIGxpbmthZ2UjMjUuMTcuNDIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDguMDAjSHVibG9jayMyNS4xNy40Mi4wMC4wMAotdW5zcHNjNyMyNS4xNy40Mi4wOS4wMCNQaW5pb25zIzI1LjE3LjQyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQyLjEwLjAwI1Bvd2VyIHN0ZWVyaW5nIHR1bmluZyBjYWJsZSMyNS4xNy40Mi4wMC4wMAotdW5zcHNjNyMyNS4xNy40My4wMC4wMCNWZWhpY2xlIGV4aGF1c3Qgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy40My4wMS4wMCNDYXRhbHl0aWMgY29udmVydGVycyMyNS4xNy40My4wMC4wMAotdW5zcHNjNyMyNS4xNy40My4wMi4wMCNNdWZmbGVycyBvciByZXNvbmF0b3JzIzI1LjE3LjQzLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ0LjAwLjAwI1ZlaGljbGUgaW50ZXJpb3Igc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy40NC4wMS4wMCNCZXplbHMjMjUuMTcuNDQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDQuMDIuMDAjQ29uc29sZXMjMjUuMTcuNDQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDQuMDMuMDAjRG9vciBwYW5lbHMjMjUuMTcuNDQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDQuMDQuMDAjSGVhZGxpbmVycyMyNS4xNy40NC4wMC4wMAotdW5zcHNjNyMyNS4xNy40NC4wNS4wMCNJbnN0cnVtZW50IGNsdXN0ZXJzIzI1LjE3LjQ0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ0LjA2LjAwI0luc3RydW1lbnQgcGFuZWxzIzI1LjE3LjQ0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ0LjA3LjAwI1BlZGFscyMyNS4xNy40NC4wMC4wMAotdW5zcHNjNyMyNS4xNy40NC4wOC4wMCNQb3dlciBwb3J0cyBvciBsaWdodGVycyMyNS4xNy40NC4wMC4wMAotdW5zcHNjNyMyNS4xNy40NC4wOS4wMCNTdW4gdmlzb3JzIzI1LjE3LjQ0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjAwLjAwI1ZlaGljbGUgc2FmZXR5IGFuZCBzZWN1cml0eSBzeXN0ZW1zIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjAxLjAwI0FpciBiYWcgcHJvcGVsbGFudCBjYW5pc3RlcnMjMjUuMTcuNDUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDUuMDIuMDAjQWlyIGJhZ3MjMjUuMTcuNDUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDUuMDMuMDAjVmVoaWNsZSBob3JucyMyNS4xNy40NS4wMC4wMAotdW5zcHNjNyMyNS4xNy40NS4wNC4wMCNSZW1vdGUgbG9ja2luZyBzeXN0ZW0jMjUuMTcuNDUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDUuMDUuMDAjVmVoaWNsZSBzdGFiaWxpdHkgY29udHJvbCBzeXN0ZW1zIzI1LjE3LjQ1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjA2LjAwI1ZlaGljbGUgdHJhY3Rpb24gY29udHJvbCBzeXN0ZW1zIzI1LjE3LjQ1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjA3LjAwI1ZlaGljbGUgbmF2aWdhdGlvbiBzeXN0ZW1zIzI1LjE3LjQ1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjA4LjAwI1doZWVsIGNsYW1wcyMyNS4xNy40NS4wMC4wMAotdW5zcHNjNyMyNS4xNy40Ni4wMC4wMCNWZWhpY2xlIHNlYXRpbmcgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy40Ni4wMS4wMCNTZWF0IGNvdmVycyMyNS4xNy40Ni4wMC4wMAotdW5zcHNjNyMyNS4xNy40Ni4wMi4wMCNTZWF0IGN1c2hpb25zIG9yIGJvbHN0ZXJzIzI1LjE3LjQ2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ2LjAzLjAwI1NlYXQgZnJhbWVzIzI1LjE3LjQ2LjAwLjAwCi11bnNwc2M3IzI1LjE4LjAwLjAwLjAwI1ZlaGljbGUgYm9kaWVzIGFuZCB0cmFpbGVycyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wMC4wMCNBaXJjcmFmdCBmdXNlbGFnZSBhbmQgY29tcG9uZW50cyMyNS4xOC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wMS4wMCNBaXJjcmFmdCBzcG9pbGVycyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wMi4wMCNBaXJjcmFmdCBmaW5zIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE1LjAzLjAwI0FpcmNyYWZ0IGhvcml6b250YWwgc3RhYmlsaXplcnMjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMDQuMDAjQWlyY3JhZnQgY2FuYXJkcyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wNS4wMCNBaXJjcmFmdCBzbGF0cyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wNi4wMCNBaXJjcmFmdCBmbGFwcyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wNy4wMCNBaXJjcmFmdCBydWRkZXJzIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE1LjA4LjAwI0FpcmNyYWZ0IGVsZXZhdG9ycyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wOS4wMCNBaXJjcmFmdCBhaWxlcm9ucyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4xMC4wMCNBaXJjcmFmdCBwcm9wZWxsZXIjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMTEuMDAjQWlyY3JhZnQgd2luZ3MjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMTIuMDAjQWlyY3JhZnQgZnVzZWxhZ2UjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMTMuMDAjQWlyY3JhZnQgcmFkb21lcyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4xNC4wMCNBaXJjcmFmdCByb3RvcnMjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMTUuMDAjQWlyY3JhZnQgbGlmdCBmYW5zIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE1LjE2LjAwI0FpcmNyYWZ0IGNhbm9waWVzIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE1LjE3LjAwI0FpcmNyYWZ0IGZ1cm5pc2hpbmdzIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE2LjAwLjAwI0F1dG9tb3RpdmUgY2hhc3NpcyMyNS4xOC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNi4wMS4wMCNBdXRvbW9iaWxlIGNoYXNzaXMjMjUuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTYuMDIuMDAjVHJ1Y2sgY2hhc3NpcyMyNS4xOC4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNi4wMy4wMCNNb3RvcmN5Y2xlIGZyYW1lcyMyNS4xOC4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNi4wNC4wMCNUcnVjayBjaGFzc2lzIzI1LjE4LjE2LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjAwLjAwI1Byb2R1Y3QgYW5kIG1hdGVyaWFsIHRyYWlsZXJzIzI1LjE4LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjAxLjAwI0NvbnRhaW5lciB0cmFpbGVycyMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4wMi4wMCNGbGF0YmVkIHRyYWlsZXJzIzI1LjE4LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjAzLjAwI0xpdmVzdG9jayB0cmFpbGVycyMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4wNC4wMCNOb24gdGVtcGVyYXR1cmUgY29udHJvbGxlZCB0YW5rZXIgdHJhaWxlcnMjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTcuMDUuMDAjVGVtcGVyYXR1cmUgY29udHJvbGxlZCB0YW5rZXIgdHJhaWxlcnMjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTcuMDYuMDAjVGVtcGVyYXR1cmUgY29udHJvbGxlZCBjb250YWluZXIgdHJhaWxlcnMjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTcuMDcuMDAjQXV0b21vYmlsZSBjYXJyaWVyIHRyYWlsZXJzIzI1LjE4LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjA4LjAwI1RyYWlsZXIgaGl0Y2hlcyMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4wOS4wMCNTa2lwIGxvYWRlciMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4xMC4wMCNUcmFpbGVyIGVuZCBwbGF0ZXMjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTcuMTEuMDAjU25vd21vYmlsZSB0cmFpbGVyIzI1LjE4LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjEyLjAwI01vdG9yY3ljbGUgdHJhaWxlciMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4xMy4wMCNCb2F0IFRyYWlsZXIjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMDAuMDAuMDAjVHJhbnNwb3J0YXRpb24gc2VydmljZXMgZXF1aXBtZW50IzI1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjE5LjE1LjAwLjAwI0FpciB0cmFuc3BvcnRhdGlvbiBzdXBwb3J0IHN5c3RlbXMgYW5kIGVxdWlwbWVudCMyNS4xOS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNS4wMS4wMCNHcm91bmQgc3VwcG9ydCB0cmFpbmluZyBzeXN0ZW1zIzI1LjE5LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE1LjAyLjAwI0dyb3VuZCBzdXBwb3J0IHRlc3Qgb3IgbWFpbnRlbmFuY2Ugc3lzdGVtcyMyNS4xOS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNS4wMy4wMCNJbnRlZ3JhdGVkIG1haW50ZW5hbmNlIGluZm9ybWF0aW9uIHN5c3RlbXMjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMDQuMDAjQWlyY3JhZnQgZmxpZ2h0IHNpbXVsYXRvcnMgb3IgdHJhaW5lcnMjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMDUuMDAjQWlyY3JhZnQgY2FyZ28gaGFuZGxpbmcgZXF1aXBtZW50IzI1LjE5LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE1LjA2LjAwI0FpcmNyYWZ0IHJlZnVlbGluZyBlcXVpcG1lbnQjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMDcuMDAjQWlyY3JhZnQgZGVpY2luZyBlcXVpcG1lbnQjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMDguMDAjSmV0d2F5cyMyNS4xOS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNS4wOS4wMCNBaXJjcmFmdCBwdXNoYmFjayBvciB0b3cgdHJhY3RvcnMjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMTAuMDAjR3JvdW5kIHBvd2VyIHVuaXRzIGZvciBhaXJjcmFmdCMyNS4xOS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNS4xMS4wMCNMYXZhdG9yeSBzZXJ2aWNlIGVxdWlwbWVudCBmb3IgYWlyY3JhZnQjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMTIuMDAjQWlyc3RhaXJzIG9yIHN0YWlyIHRydWNrcyMyNS4xOS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNi4wMC4wMCNTcGFjZSB0cmFuc3BvcnRhdGlvbiBzdXBwb3J0IHN5c3RlbXMgYW5kIGVxdWlwbWVudCMyNS4xOS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNi4wMS4wMCNTcGFjZWNyYWZ0IGZsaWdodCBzaW11bGF0b3JzIzI1LjE5LjE2LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE2LjAyLjAwI1BheWxvYWQgZGVsaXZlcnkgc3lzdGVtcyBmb3Igc3BhY2VjcmFmdCMyNS4xOS4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNi4wMy4wMCNMaXF1aWQgbGF1bmNoIHZlaGljbGVzIzI1LjE5LjE2LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE2LjA0LjAwI1NvbGlkIGxhdW5jaCB2ZWhpY2xlcyMyNS4xOS4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNi4wNS4wMCNTcGFjZWNyYWZ0IHNlcnZpY2UgbW9kdWxlcyMyNS4xOS4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNy4wMC4wMCNWZWhpY2xlIHNlcnZpY2luZyBlcXVpcG1lbnQjMjUuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTcuMDEuMDAjV2hlZWwgYmFsYW5jaW5nIGVxdWlwbWVudCMyNS4xOS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNy4wMi4wMCNXaGVlbCBhbGlnbm1lbnQgZXF1aXBtZW50IzI1LjE5LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE3LjAzLjAwI1RpcmUgY2hhbmdpbmcgbWFjaGluZXMjMjUuMTkuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTcuMDQuMDAjRW5naW5lIG9yIHZlaGljbGUgc3RhbmRzIzI1LjE5LjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjAwLjAwLjAwI0Flcm9zcGFjZSBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIGFuZCBlcXVpcG1lbnQjMjUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDAuMDAjQWlyY3JhZnQgZnVzZWxhZ2UgYW5kIGNvbXBvbmVudHMjMjUuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDEuMDAjQWlyY3JhZnQgc3BvaWxlcnMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDIuMDAjQWlyY3JhZnQgZmlucyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4wMy4wMCNBaXJjcmFmdCBob3Jpem9udGFsIHN0YWJpbGl6ZXJzIzI1LjIwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE1LjA0LjAwI0FpcmNyYWZ0IGNhbmFyZHMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDUuMDAjQWlyY3JhZnQgc2xhdHMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDYuMDAjQWlyY3JhZnQgZmxhcHMgb3IgZmxhcCBkcml2ZXMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDcuMDAjQWlyY3JhZnQgcnVkZGVycyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4wOC4wMCNBaXJjcmFmdCBlbGV2YXRvcnMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDkuMDAjQWlyY3JhZnQgYWlsZXJvbnMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMTAuMDAjQWlyY3JhZnQgcHJvcGVsbGVycyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4xMS4wMCNBaXJjcmFmdCB3aW5ncyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4xMi4wMCNBaXJjcmFmdCBmdXNlbGFnZXMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMTMuMDAjQWlyY3JhZnQgcmFkb21lcyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4xNC4wMCNBaXJjcmFmdCByb3RvcnMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMTUuMDAjQWlyY3JhZnQgbGlmdCBmYW5zIzI1LjIwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE1LjE2LjAwI0FpcmNyYWZ0IGNhbm9waWVzIzI1LjIwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE1LjE3LjAwI0FpcmNyYWZ0IGZ1cm5pc2hpbmdzIzI1LjIwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE2LjAwLjAwI0Flcm9zcGFjZSBsb2NhdGlvbiBhbmQgbmF2aWdhdGlvbiBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzI1LjIwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjE2LjAxLjAwI0FpcmNyYWZ0IGRpZ2l0YWwgYWx0aXR1ZGUgY29udHJvbCBzeXN0ZW1zIzI1LjIwLjE2LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE2LjAyLjAwI0FpcmNyYWZ0IG5hdmlnYXRpb24gYmVhY29ucyMyNS4yMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNi4wMy4wMCNBaXIgdG8gZ3JvdW5kIHRlcnJhaW4gZm9sbG93aW5nIHN5c3RlbXMjMjUuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTYuMDQuMDAjQWlyY3JhZnQgZ3VpZGFuY2Ugc3lzdGVtcyMyNS4yMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNi4wNS4wMCNBaXJjcmFmdCBzdGVlcmluZyBjb250cm9scyMyNS4yMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNi4wNi4wMCNTcGFjZWNyYWZ0IGFsdGl0dWRlIGNvbnRyb2wgc3lzdGVtcyMyNS4yMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNy4wMC4wMCNGbGlnaHQgY29tbXVuaWNhdGlvbnMgcmVsYXRlZCBzeXN0ZW1zIzI1LjIwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjAxLjAwI0FpcmNyYWZ0IGNvbW11bmljYXRpb24gc3lzdGVtcyMyNS4yMC4xNy4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNy4wMi4wMCNGbGlnaHQgZGF0YSByZWNvcmRlcnMjMjUuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTcuMDMuMDAjQWlyY3JhZnQgY291bnRlcm1lYXN1cmVzIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjA0LjAwI0VuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBzeXN0ZW1zIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjA1LjAwI0FpcmNyYWZ0IHRlbGVtZXRyeSBzeXN0ZW1zIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjA2LjAwI0FpcmNyYWZ0IGludGVyZmFjZSBlbGVjdHJvbmljcyMyNS4yMC4xNy4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNy4wNy4wMCNBaXJjcmFmdCBneXJvcyMyNS4yMC4xNy4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNy4wOC4wMCNBaXJjcmFmdCBjYW1lcmFzIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjA5LjAwI0FpcmNyYWZ0IHByb2JlcyBvciBzZW5zb3JzIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjEwLjAwI0FpcmNyYWZ0IHdhdmVndWlkZXMjMjUuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTguMDAuMDAjQWlyY3JhZnQgbWFzdGVyIGNvbnRyb2wgc3lzdGVtcyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOC4wMS4wMCNGbGlnaHQgY29tcHV0ZXIgc3lzdGVtcyMyNS4yMC4xOC4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOC4wMi4wMCNTcGFjZWNyYWZ0IGNvbW1hbmQgbW9kdWxlcyMyNS4yMC4xOC4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOS4wMC4wMCNBaXJjcmFmdCBlbWVyZ2VuY3kgc3lzdGVtcyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOS4wMS4wMCNBaXJjcmFmdCBmaXJlIGNvbnRyb2wgb3IgZXh0aW5ndWlzaGluZyBzeXN0ZW1zIzI1LjIwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE5LjAyLjAwI0FpcmNyYWZ0IGVzY2FwZSBvciBlamVjdGlvbiBzeXN0ZW1zIzI1LjIwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE5LjAzLjAwI0FpcmNyYWZ0IHdhcm5pbmcgc3lzdGVtcyMyNS4yMC4xOS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOS4wNC4wMCNQYXJhY2h1dGVzIzI1LjIwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjIwLjIwLjAwLjAwI0FpcmNyYWZ0IHBvd2VyIHN5c3RlbXMjMjUuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjAuMDEuMDAjU3BhY2VjcmFmdCBzb2xhciBjZWxscyMyNS4yMC4yMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMC4wMi4wMCNTcGFjZWNyYWZ0IHNvbGFyIGFycmF5cyMyNS4yMC4yMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMC4wMy4wMCNBaXJjcmFmdCBwb3dlciBzdXBwbHkgdW5pdHMjMjUuMjAuMjAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjAuMDQuMDAjQXV4aWxsaWFyeSBwb3dlciB1bml0IHN5c3RlbXMgKEFQVXMpIzI1LjIwLjIwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjIxLjAwLjAwI0ZsaWdodCBpbnN0cnVtZW50YXRpb24jMjUuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjEuMDEuMDAjQWVyb3NwYWNlIGNvY2twaXQgaW5kaWNhdG9ycyMyNS4yMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMS4wMi4wMCNBZXJvc3BhY2UgY29ja3BpdCBnYXVnZXMjMjUuMjAuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjEuMDMuMDAjQWVyb3NwYWNlIGNvY2twaXQgZGlzcGxheSBwYW5lbHMjMjUuMjAuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjEuMDQuMDAjQWVyb3NwYWNlIGNvY2twaXQgc3dpdGNoIHBhbmVscyMyNS4yMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMS4wNS4wMCNBZXJvc3BhY2UgaGVhZCB1cCBkaXNwbGF5IChIVURzKSMyNS4yMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMi4wMC4wMCNBaXJjcmFmdCBsYW5kaW5nIGFuZCBicmFraW5nIHN5c3RlbXMjMjUuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjIuMDEuMDAjQWlyY3JhZnQgYnJha2luZyBzeXN0ZW1zIzI1LjIwLjIyLjAwLjAwCi11bnNwc2M3IzI1LjIwLjIyLjAyLjAwI0FpcmNyYWZ0IGRyYWcgY2h1dGVzIzI1LjIwLjIyLjAwLjAwCi11bnNwc2M3IzI1LjIwLjIyLjAzLjAwI0FpcmNyYWZ0IHdoZWVscyMyNS4yMC4yMi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMi4wNC4wMCNMYW5kaW5nIGdlYXIgYXNzZW1ibGllcyMyNS4yMC4yMi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMi4wNS4wMCNBaXJjcmFmdCB0aXJlcyMyNS4yMC4yMi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMi4wNi4wMCNBaWNyYWZ0IGFudGkgc2tpZCBjb250cm9scyMyNS4yMC4yMi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMy4wMC4wMCNBaXJjcmFmdCBwYXNzZW5nZXIgcmVzdHJhaW50cyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMy4wMS4wMCNBaXJjcmFmdCBsYXBiZWx0cyMyNS4yMC4yMy4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMy4wMi4wMCNBaXJjcmFmdCBoYXJuZXNzIHJlc3RyYWludHMjMjUuMjAuMjMuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjQuMDAuMDAjQWlyY3JhZnQgZnVlbCB0YW5rcyBhbmQgc3lzdGVtcyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNC4wMS4wMCNBaXJjcmFmdCBpbnRlcm5hbCBmdWVsIHRhbmtzIzI1LjIwLjI0LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI0LjAyLjAwI0FpcmNyYWZ0IGZ1ZWwgZHJvcCB0YW5rcyMyNS4yMC4yNC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNC4wMy4wMCNBaXJjcmFmdCBwcm9wZWxsYW50IHRhbmtzIzI1LjIwLjI0LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI0LjA0LjAwI0FpcmNyYWZ0IGh5YnJpZCBmdWVsIHN0b3JhZ2Ugc3lzdGVtcyMyNS4yMC4yNC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNC4wNS4wMCNBaXJjcmFmdCBmdWVsIG1hbmFnZW1lbnQgc3lzdGVtcyMyNS4yMC4yNC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNC4wNi4wMCNQb3N0Ym9vc3RlcnMjMjUuMjAuMjQuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjUuMDAuMDAjQWlyY3JhZnQgZXF1aXBtZW50IzI1LjIwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjAxLjAwI0FpcmNyYWZ0IGh5ZHJhdWxpYyBzeXN0ZW1zIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjAyLjAwI0V4dGVyaW9yIGFpcmNyYWZ0IGxpZ2h0aW5nIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjAzLjAwI0ludGVyaW9yIGFpcmNyYWZ0IGxpZ2h0aW5nIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjA0LjAwI0FpcmNyYWZ0IHdpbmRzaGllbGQgd2lwZXJzIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjA1LjAwI0FpcmNyYWZ0IG9uYm9hcmQgZGVmcm9zdGluZyBvciBkZWZvZ2dpbmcgc3lzdGVtcyMyNS4yMC4yNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNS4wNi4wMCNBaXJjcmFmdCBkb29ycyMyNS4yMC4yNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNS4wNy4wMCNBaXJjcmFmdCB3aW5kb3dzIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjA4LjAwI0FpcmNyYWZ0IHdpbmRzaGllbGRzIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjA5LjAwI0FpcmNyYWZ0IHNob2NrIG1vdW50cyMyNS4yMC4yNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNS4xMC4wMCNBaXJjcmFmdCBzbGlwIHJpbmcgYXNzZW1ibGllcyMyNS4yMC4yNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNi4wMC4wMCNBaXJjcmFmdCBlbnZpcm9ubWVudGFsIGNvbnRyb2wgc3lzdGVtcyBhbmQgY29tcG9uZW50cyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNi4wMS4wMCNBaXJjcmFmdCBlbnZpcm9ubWVudCBjb250cm9sbGVycyMyNS4yMC4yNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNi4wMi4wMCNBaXJjcmFmdCBlbnZpcm9ubWVudCByZWd1bGF0b3JzIzI1LjIwLjI2LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI2LjAzLjAwI0FpcmNyYWZ0IGNvb2xpbmcgdHVyYmluZXMjMjUuMjAuMjYuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjYuMDQuMDAjQWlyY3JhZnQgY29vbGluZyBmYW5zIzI1LjIwLjI2LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI2LjA1LjAwI0FpcmNyYWZ0IGhlYXQgZXhjaGFuZ2VycyMyNS4yMC4yNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNi4wNi4wMCNBaXJjcmFmdCB3YXRlciBzZXBhcmF0b3JzIzI1LjIwLjI2LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI2LjA3LjAwI0FpcmNyYWZ0IG94eWdlbiBlcXVpcG1lbnQjMjUuMjAuMjYuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjcuMDAuMDAjQWlyY3JhZnQgYWNjdW11bGF0b3JzIzI1LjIwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjI3LjAxLjAwI0h5ZHJhdWxpYyBhaXJjcmFmdCBhY2N1bXVsYXRvcnMjMjUuMjAuMjcuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjcuMDIuMDAjUG5ldW1hdGljIGFpcmNyYWZ0IGFjY3VtdWxhdG9ycyMyNS4yMC4yNy4wMC4wMAotdW5zcHNjNyMyNi4wMC4wMC4wMC4wMCNQb3dlciBHZW5lcmF0aW9uIGFuZCBEaXN0cmlidXRpb24gTWFjaGluZXJ5IGFuZCBBY2Nlc3NvcmllcyMyNi4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNi4xMC4wMC4wMC4wMCNQb3dlciBzb3VyY2VzIzI2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEwLjE1LjAwLjAwI0VuZ2luZXMjMjYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDEuMDAjSHlkcmF1bGljIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDIuMDAjUG5ldW1hdGljIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDMuMDAjR2FzIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDQuMDAjRGllc2VsIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDUuMDAjU3RlYW0gZW5naW5lcyMyNi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNS4wNi4wMCNUdXJiaW5lIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDcuMDAjVHVyYm9mYW4gZW5naW5lcyMyNi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNS4wOC4wMCNUaGVybWFsIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDkuMDAjSHlkcm9lbGVjdHJpYyBlbmdpbmVzIzI2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE1LjEwLjAwI1JvdGFyeSBlbmdpbmVzIzI2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE1LjExLjAwI0h5ZHJhdWxpYyB0dXJiaW5lIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMTIuMDAjVHVyYm9wcm9wIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMTMuMDAjRW5naW5lIFJlcGFpciBLaXQjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMDAuMDAjTW90b3JzIzI2LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjAxLjAwI0luZHVjdGlvbiBtb3RvcnMjMjYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMDIuMDAjQWx0ZXJuYXRpbmcgY3VycmVudCAoQUMpIG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4wMy4wMCNEaXJlY3QgY3VycmVudCAoREMpIG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4wNC4wMCNBbHRlcm5hdGluZyBjdXJyZW50IG9yIGRpcmVjdCBjdXJyZW50IChBQy9EQykgbW90b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjA1LjAwI0R5bmFtb3RvcnMjMjYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMDYuMDAjU2Vydm9tb3RvcnMjMjYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMDcuMDAjVG9ycXVlIG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4wOC4wMCNMaXF1aWQgcm9ja2V0IG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4wOS4wMCNTeW5jaHJvbm91cyBtb3RvcnMjMjYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMTAuMDAjU29saWQgcm9ja2V0IG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4xMS4wMCNTaW5nbGUgcGhhc2UgbW90b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjEyLjAwI011bHRpIHBoYXNlIG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4xMy4wMCNIeWRyYXVsaWMgbW90b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjE0LjAwI1N0ZXAgbW90b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjE1LjAwI0FsdGVybmF0b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjE2LjAwI0NhcmJvbiBCcnVzaGVzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjAwLjAwI0VuZ2luZSBjb21wb25lbnRzIzI2LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjAxLjAwI0FpcmNyYWZ0IGJ1cm5lcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMDIuMDAjQWlyY3JhZnQgZW5naW5lIGNvbXByZXNzb3JzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjAzLjAwI0FpcmNyYWZ0IGVuZ2luZSBkaWZmdXNlcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMDQuMDAjRW5naW5lIG1vdW50cyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4wNS4wMCNBaXJjcmFmdCBkcml2ZSBzaGFmdHMgcG93ZXIgdGFrZSBvZmZzIG9yIHNjcmV3IGphY2tzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjA2LjAwI0FpcmNyYWZ0IHRyYW5zbWlzc2lvbiB1bml0cyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4wNy4wMCNCYWxhbmNlIHNoYWZ0cyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4wOC4wMCNDYW0gZm9sbG93ZXJzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjA5LjAwI0NhbXNoYWZ0IGxpZnRlcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMTAuMDAjQ2FyYnVyZXRvcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMTEuMDAjQ29ubmVjdGluZyByb2RzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjEyLjAwI0NyYW5rY2FzZSB2ZW50aWxsYXRpb24gdmFsdmVzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjEzLjAwI0N5bGluZGVyIGhlYWRzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjE0LjAwI0VuZ2luZSBjb29sYW50IHJhZGlhdG9ycyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4xNS4wMCNFbmdpbmUgY292ZXJzIG9yIHBhbnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMTYuMDAjRW5naW5lIGZvcmdpbmdzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjE3LjAwI0VuZ2luZSBoZWF0ZXJzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjE4LjAwI0VuZ2luZSBpZ25pdGlvbiBzeXN0ZW1zIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjE5LjAwI1N1cGVyY2hhcmdlciMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4yMC4wMCNUdXJib2NoYXJnZXIjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMjEuMDAjRW5naW5lIHB1bGxleXMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMjIuMDAjRnVlbCBpbmplY3Rpb24gc3lzdGVtcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4yMy4wMCNGdWVsIHZhcG9yIGNhbmlzdGVyIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjI0LjAwI0dsb3cgcGx1Z3MjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMjUuMDAjT2lsIGRpcCBzdGlja3MgYW5kIHR1YmVzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjI2LjAwI09pbCBzdHJhaW5lcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMjcuMDAjUGlzdG9uIHJpbmdzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjI4LjAwI1B1c2ggcm9kIHR1YmVzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjI5LjAwI1JvY2tlciBhcm0gYmFsbHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzAuMDAjUm9ja2VyIGFybSBzaGFmdHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzEuMDAjUm9ja2VyIGFybXMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzIuMDAjU3BhcmsgcGx1Z3MjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzMuMDAjQ2FyYnVyZXRvciBqZXQjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzQuMDAjQ2FyYnVyZXRvciBkaWFwaHJhZ21zIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjM1LjAwI09pbCBwYW4jMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzYuMDAjUGlzdG9ucyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4zNy4wMCNUaW1pbmcgY2hhaW4jMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzguMDAjSW50YWtlIG1hbmlmb2xkcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4zOS4wMCNFeGhhdXN0IG1hbmlmb2xkcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40MC4wMCNGdWVsIGluamVjdG9ycyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40MS4wMCNFbmdpbmUgc2xlZXZlcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40Mi4wMCNGdWVsIGluamVjdGlvbiBtYW5pZm9sZHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNDMuMDAjRW5naW5lIHZhbHZlcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40NC4wMCNUdXJib2NoYXJnZXIjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNDUuMDAjY2Ftc2hhZnQjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNDYuMDAjQ3lsaW5kZXIgaGVhZCMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40Ny4wMCNQdXNoIHJvZHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNDguMDAjRW5naW5lIGZseXdoZWVsIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjQ5LjAwI0NyYW5rc2hhZnQjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNTAuMDAjVGhyb3R0bGUjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNTEuMDAjRWxlY3Ryb25pYyBlbmdpbmUgY29udHJvbHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNTIuMDAjVmlicmF0aW9uIGRhbXBlcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTguMDAuMDAjTW90b3Igb3IgZ2VuZXJhdG9yIGNvbXBvbmVudHMjMjYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTguMDEuMDAjTW90b3IgYnJ1c2hlcyMyNi4xMC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xMC4xOC4wMi4wMCNBcm1hdHVyZXMjMjYuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTguMDMuMDAjUm90b3JzIG9yIHN0YXRvcnMjMjYuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTguMDQuMDAjTW90b3IgbW91bnRzIG9yIGJhc2VzIzI2LjEwLjE4LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE5LjAwLjAwI0ludGVybmFsIGNvbWJ1c3Rpb24gZW5naW5lIGNvbXBvbmVudHMjMjYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTkuMDEuMDAjQ3Jhbmsgc2hhZnRzIzI2LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE5LjAyLjAwI1NwYXJrIHBsdWdzIzI2LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE5LjAzLjAwI0NhbXNoYWZ0IzI2LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE5LjA0LjAwI0Z1ZWwgaW5qZWN0aW9uIG5venpsZSMyNi4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMC4xOS4wNS4wMCNDeWxpbmRlciBibG9jayMyNi4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4wMC4wMC4wMCNCYXR0ZXJpZXMgYW5kIGdlbmVyYXRvcnMgYW5kIGtpbmV0aWMgcG93ZXIgdHJhbnNtaXNzaW9uIzI2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjAwLjAwI0tpbmV0aWMgcG93ZXIgdHJhbnNtaXNzaW9uIzI2LjExLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjAxLjAwI0NvbW11dGF0b3JzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjAzLjAwI0FkanVzdGFibGUgc3BlZWQgZHJpdmVzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjA0LjAwI0JlbHQgZHJpdmVzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjA1LjAwI0NoYWluIGRyaXZlcyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4wNi4wMCNMaW5lYXIgbW90aW9uIGRldmljZXMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMDcuMDAjQ2x1dGNoZXMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMDguMDAjUG93ZXIgdGFrZSBvZmZzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjA5LjAwI1RyYW5zbWlzc2lvbiB5b2tlcyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4xMC4wMCNUcmFuc21pc3Npb24gc2hhZnRzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjExLjAwI1VuaXZlcnNhbCBqb2ludHMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMTIuMDAjQXhsZXMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMTMuMDAjUG93ZXIgdHJhbnNtaXNzaW9uIGNoYWlucyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4xNC4wMCNLbnVja2xlIGpvaW50cyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4xNS4wMCNTZXJ2byBjb250cm9sbGVyIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjE2LjAwI1N0ZXAgZHJpdmUgb3Igc3RlcHBlciBkcml2ZSBvciBzdGVwIGluZGV4ZXIjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMTcuMDAjUGxhbmV0IGNhcnJpZXIjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMTguMDAjVGVuc2lvbiBzdHJ1dCMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4xOS4wMCNUb3JxdWUgY29udmVydGVycyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4yMC4wMCNUcnVubmlvbnMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMjEuMDAjUHVzaGVyIGhlYWQjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMjIuMDAjUHVzaGVyIGFzc2VtYmx5IzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjIzLjAwI0JhY2tzdG9wcyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNi4wMC4wMCNQb3dlciBnZW5lcmF0b3JzIzI2LjExLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjE2LjAxLjAwI0RpZXNlbCBnZW5lcmF0b3JzIzI2LjExLjE2LjAwLjAwCi11bnNwc2M3IzI2LjExLjE2LjAyLjAwI0h5ZHJvIGVsZWN0cmljIGdlbmVyYXRvcnMjMjYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTYuMDMuMDAjV2luZCBnZW5lcmF0b3JzIzI2LjExLjE2LjAwLjAwCi11bnNwc2M3IzI2LjExLjE2LjA0LjAwI0dhcyBnZW5lcmF0b3JzIzI2LjExLjE2LjAwLjAwCi11bnNwc2M3IzI2LjExLjE2LjA1LjAwI1RoZXJtYWwgZ2VuZXJhdG9ycyMyNi4xMS4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNi4wNi4wMCNIeWRyYXVsaWMgZ2VuZXJhdG9ycyMyNi4xMS4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNi4wNy4wMCNTb2xhciBnZW5lcmF0b3JzIzI2LjExLjE2LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjAwLjAwI0JhdHRlcmllcyBhbmQgYWNjZXNzb3JpZXMjMjYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDEuMDAjUmVjaGFyZ2VhYmxlIGJhdHRlcmllcyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4wMi4wMCNBbGthbGluZSBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDMuMDAjVmVoaWNsZSBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDQuMDAjQmF0dGVyeSBjaGFyZ2VycyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4wNS4wMCNEcnkgY2VsbCBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDYuMDAjRWxlY3Ryb25pYyBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDcuMDAjTGVhZCBhY2lkIGJhdHRlcmllcyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4wOC4wMCNOaWNrZWwgaXJvbiBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDkuMDAjTmlja2VsIGNhZG1pdW0gYmF0dGVyaWVzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjEwLjAwI1Byb2R1Y3Qgc3BlY2lmaWMgYmF0dGVyeSBwYWNrcyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4xMS4wMCNMaXRoaXVtIGJhdHRlcmllcyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4xMi4wMCNOaWNrZWwgaHlkcm9nZW4gYmF0dGVyaWVzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjEzLjAwI1RoZXJtYWwgYmF0dGVyaWVzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjE0LjAwI1p5bmMgYWlyIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjE1LjAwI1ppbmMgY29hbCBiYXR0ZXJ5IzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjE2LjAwI01lcmN1cnkgb3hpZGUgYmF0dGVyeSMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4xNy4wMCNNYW5nYW5lc2UgYmF0dGVyaWVzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjE4LjAwI1NpbHZlciBveGlkZSBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMTkuMDAjQmF0dGVyeSB0ZXN0ZXJzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjAwLjAwI0RyaXZlIGNvbXBvbmVudHMjMjYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTguMDEuMDAjViBiZWx0cyMyNi4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOC4wMi4wMCNHZWFyZWQgdGltaW5nIGJlbHRzIzI2LjExLjE4LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjAzLjAwI1JvdW5kIGJlbHRzIzI2LjExLjE4LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjA0LjAwI0ZsYXQgYmVsdHMjMjYuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTguMDUuMDAjQmVsdCB0ZW5zaW9uZXJzIzI2LjExLjE4LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjA2LjAwI1RyYW5zbWlzc2lvbiBwdWxsZXlzIzI2LjExLjE4LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjA3LjAwI1RpbWluZyBwdWxsZXkjMjYuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTguMDguMDAjVHJhbnRvcnF1ZSMyNi4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOC4wOS4wMCNCZWx0IGd1YXJkcyMyNi4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wMC4wMCNDbHV0Y2hlcyMyNi4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wMS4wMCNQbGF0ZSBjbHV0Y2hlcyMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wMi4wMCNEaWFwaHJhZ20gY2x1dGNoIzI2LjExLjE5LjAwLjAwCi11bnNwc2M3IzI2LjExLjE5LjAzLjAwI0NlbnRyaWZ1Z2FsIGNsdXRjaCMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wNC4wMCNTZW1pIGNlbnRyaWZ1Z2FsIGNsdXRjaCMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wNS4wMCNGcmVlIHdoZWVsIGNsdXRjaCMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wNi4wMCNUb3JxdWUgY29udmVydGVyIzI2LjExLjE5LjAwLjAwCi11bnNwc2M3IzI2LjExLjE5LjA3LjAwI0ZsdWlkIGNvdXBsaW5nIzI2LjExLjE5LjAwLjAwCi11bnNwc2M3IzI2LjExLjE5LjA4LjAwI0NhbSBjbHV0Y2hlcyMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4yMC4wMC4wMCNDbHV0Y2ggcGFydHMgYW5kIGFjY2Vzc29yaWVzIzI2LjExLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjIwLjAxLjAwI1ByZXNzdXJlIHBsYXRlIzI2LjExLjIwLjAwLjAwCi11bnNwc2M3IzI2LjExLjIwLjAyLjAwI0RyaXZlbiBwbGF0ZSMyNi4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNi4xMS4yMC4wMy4wMCNDbHV0Y2ggcGxhdGVzIzI2LjExLjIwLjAwLjAwCi11bnNwc2M3IzI2LjExLjIxLjAwLjAwI0luZHVzdHJpYWwgYnJha2luZyBzeXN0ZW1zIzI2LjExLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjIxLjAxLjAwI0FpciBvciBwbmV1bWF0aWMgYnJha2luZyBzeXN0ZW1zIzI2LjExLjIxLjAwLjAwCi11bnNwc2M3IzI2LjExLjIxLjAyLjAwI0h5ZHJhdWxpYyBicmFraW5nIHN5c3RlbXMjMjYuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMjEuMDMuMDAjTWVjaGFuaWNhbCBicmFraW5nIHN5c3RlbXMjMjYuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMjEuMDQuMDAjQnJha2luZyBjbHV0Y2ggYXNzZW1ibGllcyMyNi4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNi4xMi4wMC4wMC4wMCNFbGVjdHJpY2FsIHdpcmUgYW5kIGNhYmxlIGFuZCBoYXJuZXNzIzI2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjAwLjAwI0VsZWN0cmljYWwgd2lyZSMyNi4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4wMS4wMCNIZWF0aW5nIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMDUuMDAjRml4dHVyZSB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjA3LjAwI1JhZGlvIG9yIHRlbGV2aXNpb24gd2lyZSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4wOC4wMCNBdXRvbW90aXZlIG9yIGFpcmNyYWZ0IHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMDkuMDAjTWFnbmV0IHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMTAuMDAjVHJvbGxleSB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjE0LjAwI1VuZGVyZ3JvdW5kIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMTUuMDAjU2lsaWNvbiBhc2Jlc3RvcyAoU0EpIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMTcuMDAjQ29wcGVyIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMTkuMDAjQ29wcGVyIGNsYWQgYWx1bWludW0gd2lyZSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4yMC4wMCNDb3BwZXIgc3RlZWwgd2lyZSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4yMS4wMCNCcm9uemUgd2lyZSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4yMi4wMCNCYXJlIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMjMuMDAjQ292ZXJlZCBidXQgbm90IGluc3VsYXRlZCB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjI0LjAwI0luc3VsYXRlZCBvciBjb3ZlcmVkIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMzIuMDAjSW50ZXIgY29ubmVjdCB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjMzLjAwI0thcHRhbiB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjM0LjAwI1BvbHltaWRlIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMzUuMDAjRXh0ZW5zaW9uIGNvcmQjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMzYuMDAjRXh0ZW5zaW9uIGNvcmQjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMzcuMDAjV2lyZSBhc3NlbWJseSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4zOC4wMCNXaXJlIGFzc2VtYmx5IzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjAwLjAwI0VsZWN0cmljYWwgY2FibGUjMjYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMDEuMDAjSGVhdGluZyBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4wMi4wMCNTdWJtYXJpbmUgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMDMuMDAjQ29udHJvbCBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4wNC4wMCNTaWduYWwgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMDUuMDAjQXV0b21vdGl2ZSBvciBhaXJjcmFmdCBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4wNi4wMCNDb2F4aWFsIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjA3LjAwI0ZpYmVyIG9wdGljIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjA4LjAwI0FlcmlhbCBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4wOS4wMCNOZXR3b3JrIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjEwLjAwI0Jyb256ZSBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4xMS4wMCNCYXJlIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjEyLjAwI0NvdmVyZWQgYnV0IG5vdCBpbnN1bGF0ZWQgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMTMuMDAjSW5zdWxhdGVkIG9yIGNvdmVyZWQgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMTQuMDAjQnVpbGRpbmcgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMTUuMDAjUG93ZXIgY2FibGUgZm9yIGRpcmVjdCBidXJpYWwjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMTYuMDAjVGVsZWNvbW11bmljYXRpb25zIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjE3LjAwI1RyaWF4aWFsIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjE4LjAwI0Nyb3NzbGlua2VkIHBvbHlrYWVuZSBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4xOS4wMCNGbG9yb3BvbHltZXIgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjAuMDAjSW50ZXIgY29ubmVjdCBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4yMS4wMCNLYXB0YW4gY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjIuMDAjUG9seW1pZGUgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjMuMDAjUmFkaW8gZnJlcXVlbmN5IChSRikgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjQuMDAjUmliYm9uIG9yIGZsYXQgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjUuMDAjQ29wcGVyIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE3LjAwLjAwI1dpcmluZyBoYXJuZXNzIzI2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEyLjE3LjAxLjAwI1BhbmVsIHdpcmluZyBoYXJuZXNzIzI2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE3LjAyLjAwI1RydW5rIHdpcmluZyBoYXJuZXNzIzI2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE3LjAzLjAwI0NvbW11bmljYXRpb24gd2lyaW5nIGhhcm5lc3MjMjYuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTcuMDQuMDAjU3BlY2lhbHR5IHdpcmluZyBoYXJuZXNzIzI2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEzLjAwLjAwLjAwI1Bvd2VyIGdlbmVyYXRpb24jMjYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDAuMDAjUG93ZXIgcGxhbnRzIzI2LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEzLjE1LjAxLjAwI0RpZXNlbCBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDIuMDAjR2VvdGhlcm1hbCBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDMuMDAjSHlkcm8gcG93ZXIgcGxhbnRzIzI2LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEzLjE1LjA0LjAwI0dhcyBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDUuMDAjTWFyaW5lIHBvd2VyIHBsYW50cyMyNi4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMy4xNS4wNi4wMCNQZXRyb2wgcG93ZXIgcGxhbnRzIzI2LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEzLjE1LjA3LjAwI1NvbGFyIHBvd2VyIHBsYW50cyMyNi4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMy4xNS4wOC4wMCNTdGVhbSBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDkuMDAjV2luZCBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMTAuMDAjVGhlcm1hbCBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMDAuMDAuMDAjQXRvbWljIGFuZCBudWNsZWFyIGVuZXJneSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCMyNi4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xNi4wMC4wMCNTdWJjcml0aWNhbCBhc3NlbWJseSBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTYuMDEuMDAjU3ViY3JpdGljYWwgYXNzZW1ibHkgZnVlbCMyNi4xNC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xNC4xNi4wMi4wMCNTdWJjcml0aWNhbCBhc3NlbWJseSBjb21wb25lbnRzIzI2LjE0LjE2LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE2LjAzLjAwI1N1YmNyaXRpY2FsIGFzc2VtYmx5IG1vZGVyYXRvciMyNi4xNC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xNC4xNy4wMC4wMCNEb3NpbWV0cnkgZXF1aXBtZW50IzI2LjE0LjAwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjE3LjAxLjAwI0lvbml6YXRpb24gY2hhbWJlciBkb3NpbWV0ZXJzIzI2LjE0LjE3LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE3LjAyLjAwI0Rvc2ltZXRlcnMjMjYuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTcuMDMuMDAjU2Vjb25kYXJ5IHN0YW5kYXJkIGRvc2ltZXRyeSBzeXN0ZW1zIzI2LjE0LjE3LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE3LjA0LjAwI1BoYW50b20gZG9zaW1ldGVycyMyNi4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOC4wMC4wMCNIb3QgY2VsbCBkZXZpY2VzIzI2LjE0LjAwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjE4LjAxLjAwI0hvdCBjZWxsIHJlbW90ZSBoYW5kbGluZyBlcXVpcG1lbnQjMjYuMTQuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTguMDIuMDAjSG90IGNlbGwgcmVtb3RlIHZpZXdpbmcgZGV2aWNlIzI2LjE0LjE4LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE4LjAzLjAwI0hvdCBjZWxsIHNoaWVsZGluZyBkb29ycyMyNi4xNC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOC4wNC4wMCNIb3QgY2VsbCBzYW1wbGVycyMyNi4xNC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOC4wNS4wMCNIb3QgY2VsbCBzYW1wbGUgcHJvY2Vzc2luZyBlcXVpcG1lbnQjMjYuMTQuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTguMDYuMDAjSG90IGNlbGwgc3BlY2lhbCB0b29scyMyNi4xNC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOC4wNy4wMCNIb3QgY2VsbCBsZWFkIGdsYXNzIHdpbmRvd3MjMjYuMTQuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTguMDguMDAjSG90IGNlbGwgZGVjb250YW1pbmF0aW9uIHN5c3RlbXMjMjYuMTQuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTguMDkuMDAjSG90IGNlbGwgcGVuZXRyYXRpb24gZGV2aWNlcyMyNi4xNC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wMC4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyBpbnN0cnVtZW50cyMyNi4xNC4wMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wMS4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyBhaXJib3JuZSBkdXN0IG1lYXN1cmluZyBzeXN0ZW1zIzI2LjE0LjE5LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE5LjAyLjAwI0JldGEgZ2F1Z2UgbWVhc3VyaW5nIHN5c3RlbXMjMjYuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTkuMDQuMDAjSW5kdXN0cmlhbCBudWNsZW9uaWMgbGlxdWlkIGxldmVsIGdhdWdlcyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wNS4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyBtYXNzIHBlciB1bml0IG9yZSBtZWFzdXJpbmcgc3lzdGVtcyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wNi4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyBtb2lzdHVyZSBtZWFzdXJpbmcgc3lzdGVtcyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wNy4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyB0aGlja25lc3MgbWVhc3VyaW5nIHN5c3RlbXMjMjYuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTkuMDguMDAjSW5kdXN0cmlhbCBudWNsZW9uaWMgZmxvdyBtZWFzdXJpbmcgc3lzdGVtcyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wOS4wMCNJc290b3BlIHNlcGFyYXRvcnMjMjYuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTkuMTAuMDAjSXNvdG9wZSBwcm9kdWN0aW9uIGZhY2lsaXRpZXMjMjYuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTkuMTEuMDAjSXNvdG9wZSBjYWxpYnJhdG9yIGFjdGl2aXR5IG1ldGVycyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMC4wMC4wMCNJcnJhZGlhdGlvbiBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjAuMDEuMDAjSXJyYWRpYXRpb24gZ2FtbWEgc291cmNlcyMyNi4xNC4yMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMC4wMi4wMCNNYWduZXQgc3lzdGVtcyMyNi4xNC4yMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMC4wMy4wMCNOSU0gbnVjbGVhciBlbGVjdHJvbmljIHVuaXRzIzI2LjE0LjIwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIwLjA0LjAwI05ldXRyb24gaXJyYWRpYXRvcnMjMjYuMTQuMjAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjAuMDUuMDAjSXJyYWRpYXRpb24gdGVzdGluZyBjYXBzdWxlcyMyNi4xNC4yMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMC4wNi4wMCNJcnJhZGlhdGlvbiBzYW1wbGUgdHJhbnNmZXIgc3lzdGVtIzI2LjE0LjIwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIwLjA3LjAwI05ldXRyb24gZ2VuZXJhdG9ycyMyNi4xNC4yMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMS4wMC4wMCNOdWNsZWFyIHJlYWN0b3IgZXF1aXBtZW50IzI2LjE0LjAwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIxLjAxLjAwI051Y2xlYXIgcmVhY3RvciBzcGVjaW1lbiBpcnJhZGlhdGlvbiBjb250YWluZXJzIzI2LjE0LjIxLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIxLjA2LjAwI051Y2xlYXIgcmVhY3RvciBjb250cm9sIHJvZCBzeXN0ZW1zIzI2LjE0LjIxLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIxLjA4LjAwI051Y2xlYXIgcmVhY3RvciBpbiBjb3JlIG5ldXRyb24gZmx1eCBpbnN0cnVtZW50YXRpb24jMjYuMTQuMjEuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjEuMTcuMDAjTnVjbGVhciByZWFjdG9yIGVhcnRocXVha2UgaW5zdHJ1bWVudGF0aW9uIzI2LjE0LjIxLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIyLjAwLjAwI051Y2xlYXIgZnVlbCBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjIuMDEuMDAjTnVjbGVhciBmdWVsIGNsYWRkaW5nIHR1YmVzIzI2LjE0LjIyLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIyLjAyLjAwI051Y2xlYXIgZnVlbCBlbGVtZW50IGZhaWx1cmUgZGV0ZWN0aW9uIHN5c3RlbXMjMjYuMTQuMjIuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDAuMDAjUmFkaWF0aW9uIHNoaWVsZGluZyBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDIuMDAjTGVhZCBzY3JlZW5zIzI2LjE0LjIzLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIzLjAzLjAwI0ZpbG0gYmFkZ2VzIzI2LjE0LjIzLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIzLjA0LjAwI1JhZGlvZ3JhcGhpYyBlcXVpcG1lbnQjMjYuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDYuMDAjU2hpZWxkZWQgY29udGFpbmVycyBmb3IgcmFkaWF0aW9uIHByb3RlY3Rpb24jMjYuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDcuMDAjTGVhZCBjaGFtYmVycyBvciBzYWZlcyBmb3IgcmFkaWF0aW9uIHByb3RlY3Rpb24jMjYuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDguMDAjTGVhZCBicmlja3MgZm9yIHJhZGlhdGlvbiBwcm90ZWN0aW9uIzI2LjE0LjIzLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIzLjEwLjAwI0dsb3ZlIGJveGVzIGZvciByYWRpYXRpb24gcHJvdGVjdGlvbiMyNi4xNC4yMy4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMy4xMS4wMCNSYWRpYXRpb24gc2hpZWxkaW5nIHdpbmRvd3MjMjYuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMTIuMDAjTGVhZCBmb3IgcmFkaWF0aW9uIHNoaWVsZGluZyMyNi4xNC4yMy4wMC4wMAotdW5zcHNjNyMyNi4xNC4yNC4wMC4wMCNSYWRpb2FjdGl2ZSB3YXN0ZSBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjQuMDEuMDAjUmFkaW9hY3RpdmUgd2FzdGUgdHJlYXRtZW50IGNvbXBhY3RvcnMgb3IgaW5jaW5lcmF0b3JzIzI2LjE0LjI0LjAwLjAwCi11bnNwc2M3IzI2LjE0LjI0LjAyLjAwI051Y2xlYXIgcmFkaWF0aW9uIGFic29yYmVycyMyNi4xNC4yNC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yNC4wMy4wMCNBdG9taWMgZW5lcmd5IGV2YXBvcmF0b3JzIG9yIGNvbmNlbnRyYXRvcnMgb3IgZHJ5ZXJzIzI2LjE0LjI0LjAwLjAwCi11bnNwc2M3IzI2LjE0LjI0LjA0LjAwI0Rvb3IgaW50ZXJsb2NraW5nIHN5c3RlbXMjMjYuMTQuMjQuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjQuMDUuMDAjUmFkaW9hY3RpdmUgd2FzdGUgZG9zYWdlIHN5c3RlbXMjMjYuMTQuMjQuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjQuMDYuMDAjUmFkaW9hY3RpdmUgd2FzdGUgc29saWRpZmljYXRpb24gc3lzdGVtcyMyNi4xNC4yNC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yNC4wNy4wMCNSYWRpb2FjdGl2ZSB3YXN0ZSBkaXNwb3NhbCBzeXN0ZW1zIzI2LjE0LjI0LjAwLjAwCi11bnNwc2M3IzI2LjE0LjI0LjA4LjAwI1JhZGlvYWN0aXZlIHdhc3RlIHRyZWF0bWVudCBmYWNpbGl0aWVzIzI2LjE0LjI0LjAwLjAwCi11bnNwc2M3IzI3LjAwLjAwLjAwLjAwI1Rvb2xzIGFuZCBHZW5lcmFsIE1hY2hpbmVyeSMyNy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4wMC4wMC4wMCNIYW5kIHRvb2xzIzI3LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjAwLjAwI0N1dHRpbmcgYW5kIGNyaW1waW5nIGFuZCBwdW5jaGluZyB0b29scyMyNy4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4wMS4wMCNLbmlmZSBibGFkZXMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMDIuMDAjUmF6b3Iga25pdmVzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjAzLjAwI1V0aWxpdHkga25pdmVzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjA0LjAwI1BvY2tldCBrbml2ZXMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMDUuMDAjUHVuY2hlcyBvciBuYWlsIHNldHMgb3IgZHJpZnRzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjA2LjAwI1NoZWFycyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4wNy4wMCNNZXRhbCBjdXR0ZXJzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjA4LjAwI1Nhd3MjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMDkuMDAjQXVnZXJzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjEwLjAwI1N0cmlwcGluZyB0b29scyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4xMS4wMCNXaXJlIGN1dHRlcnMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMTIuMDAjQm9sdCBjdXR0ZXJzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjEzLjAwI0hvc2UgY3V0dGVyIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjE0LjAwI0dsYXNzIGN1dHRlcnMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMTUuMDAjSGFuZCBvciBwdXNoIGRyaWxsIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjE2LjAwI1B1bmNoaW5nIHBsaWVycyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4xNy4wMCNLbmlmZSBibGFkZSBzZXRzIG9yIGRpc3BlbnNlcnMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMjAuMDAjTnV0IHNwbGl0dGVycyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4yMS4wMCNOaWJibGVycyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNi4wMC4wMCNGb3JtaW5nIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjE2LjAxLjAwI01hbGxldHMjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTYuMDIuMDAjSGFtbWVycyMyNy4xMS4xNi4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNi4wMy4wMCNBbnZpbHMjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTYuMDQuMDAjSGF0Y2hldHMjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTYuMDUuMDAjUGlja3MjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTYuMDYuMDAjQm9sdCBjdXR0ZXJzIzI3LjExLjE2LjAwLjAwCi11bnNwc2M3IzI3LjExLjE2LjA3LjAwI1N3YWdpbmcgdG9vbHMjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMDAuMDAjV3JlbmNoZXMgYW5kIGRyaXZlcnMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMDEuMDAjU2NyZXdkcml2ZXJzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjAyLjAwI051dCBkcml2ZXJzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjAzLjAwI1NvY2tldCBzZXRzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjA0LjAwI1NvY2tldHMjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMDUuMDAjQm94IGVuZCB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4wNi4wMCNPcGVuIGVuZCB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4wNy4wMCNBZGp1c3RhYmxlIHdyZW5jaGVzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjA4LjAwI1BpcGUgd3JlbmNoZXMjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMDkuMDAjU2NyZXcgZXh0cmFjdG9ycyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xMC4wMCNIZXgga2V5cyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xMS4wMCNSYXRjaGV0cyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xMi4wMCNQdWxsZXJzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjEzLjAwI0NvbWJpbmF0aW9uIHdyZW5jaGVzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjE0LjAwI1NwZWNpYWx0eSB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xNS4wMCNUb3JxdWUgd3JlbmNoZXMjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMTYuMDAjVG9yeCBrZXlzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjE3LjAwI1BpcGUgZXh0cmFjdG9ycyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xOC4wMCNUYXAgZXh0cmFjdG9ycyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xOS4wMCNUb3JxdWUgd3JlbmNoIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjIwLjAwI1QgaGFuZGxlIHRhcCB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4yMS4wMCNDcmFua3MjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMjIuMDAjRGllIHN0b2NrcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4yMy4wMCNUdWJlIHdyZW5jaGVzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjI0LjAwI0hvb2sgd3JlbmNoZXMjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMjUuMDAjT2Zmc2V0IHNvY2tldCB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4yNi4wMCNTcGFubmVyIHdyZW5jaGVzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE4LjAwLjAwI01lYXN1cmluZyBhbmQgbGF5b3V0IHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjE4LjAxLjAwI1RhcGUgbWVhc3VyZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDIuMDAjTGV2ZWxzIzI3LjExLjE4LjAwLjAwCi11bnNwc2M3IzI3LjExLjE4LjAzLjAwI1NxdWFyZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDQuMDAjUGx1bWIgYm9icyMyNy4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOC4wNS4wMCNQcm90cmFjdG9ycyMyNy4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOC4wNi4wMCNOYWlsIG9yIHJvdXRlciBnYXVnZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDcuMDAjU3RyYWlnaHQgZWRnZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDguMDAjUnVsZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDkuMDAjQmV2ZWxzIzI3LjExLjE4LjAwLjAwCi11bnNwc2M3IzI3LjExLjE4LjEwLjAwI1N0dWQgZmluZGVycyMyNy4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOC4xMS4wMCNDYWxpcGVycyMyNy4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOS4wMC4wMCNSb3VnaCBhbmQgZmluaXNoaW5nIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjE5LjAxLjAwI0NvbGQgY2hpc2VscyMyNy4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOS4wMi4wMCNGaWxlcyMyNy4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOS4wMy4wMCNQbGFuZXMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMDQuMDAjUmFzcHMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMDUuMDAjR3JpbmRlcnMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMDYuMDAjV29vZCBjaGlzZWxzIzI3LjExLjE5LjAwLjAwCi11bnNwc2M3IzI3LjExLjE5LjA3LjAwI1dpcmUgYnJ1c2hlcyMyNy4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOS4wOC4wMCNTaGFycGVuaW5nIHRvb2xzIG9yIGtpdHMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMDkuMDAjU3BhdHVsYXMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMTEuMDAjQ3Jvc3MgY3V0IGNoaXNlbHMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMDAuMDAjR2FyZGVuIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjAxLjAwI01hY2hldGVzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjAyLjAwI1NwYWRlcyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4wMy4wMCNSYWtlcyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4wNC4wMCNTaG92ZWxzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjA1LjAwI0F4ZXMjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMDYuMDAjU2N5dGhlcyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4wNy4wMCNTZWNhdGV1cnMgb3IgcHJ1bmluZyBzaGVhcnMjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMDguMDAjSG9lcyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4wOS4wMCNTY3JhcGVycyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4xMC4wMCNHYXJkZW4gZm9ya3MjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMTEuMDAjVG9vbCBoYW5kbGVzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjEyLjAwI0dhcmRlbiByaWRkbGVzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjEzLjAwI1Bvc3QgaG9sZSBkaWdnZXIjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMTQuMDAjTGF3bm1vd2VycyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4xNS4wMCNMYXduIHNjYXJpZmllcnMjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMTYuMDAjSGVkZ2UgY2xpcHBlcnMjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMTcuMDAjRGlnZ2luZyBiYXJzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjAwLjAwI0hvbGRpbmcgYW5kIGNsYW1waW5nIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjAxLjAwI1BpcGUgdmlzZXMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDIuMDAjQmVuY2ggdmlzZXMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDMuMDAjSGFuZCBjbGFtcHMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDQuMDAjVG9uZ3MjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDUuMDAjVHdlZXplcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDYuMDAjTGluZW1hbnMgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjA3LjAwI0FkanVzdGFibGUgd2lkZW1vdXRoIHBsaWVycyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4wOC4wMCNOZWVkbGVub3NlIHBsaWVycyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4wOS4wMCNNYWduZXRpYyB0b29scyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4xMC4wMCNSZXRhaW5pbmcgcmluZyBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTEuMDAjQWxsaWdhdG9yIHBsaWVycyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4xMi4wMCNUb25ndWUgYW5kIGdyb292ZSBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTMuMDAjU2xpcCBvciBncm9vdmUgam9pbnQgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjE0LjAwI0RpYWdvbmFsIGN1dCBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTUuMDAjTG9ja2luZyBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTYuMDAjRmVuY2UgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjE3LjAwI0VuZCBjdXQgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjE4LjAwI1dpcmUgbHVnIGNyaW1waW5nIHRvb2wjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTkuMDAjTGlnaHQgYnVsYiBjaGFuZ2VyIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjIwLjAwI0MgY2xhbXBzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjIxLjAwI0Nvcm5lciBjbGFtcHMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMjIuMDAjU2hlZXQgbWV0YWwgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjIzLjAwI0JlbmNoIGRvZyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4yNC4wMCNUZW5zaW9uZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjI1LjAwI1JvdW5kIG5vc2UgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjI2LjAwI0ZsYXQgbm9zZSBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMjcuMDAjU3RyYXAgd3JlbmNoZXMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjIuMDAuMDAjTWFzb25yeSBhbmQgY29uY3JldGUgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjIuMDEuMDAjVHJvd2VscyMyNy4xMS4yMi4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMi4wMi4wMCNGbG9hdHMjMjcuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjIuMDMuMDAjRWRnZXJzIzI3LjExLjIyLjAwLjAwCi11bnNwc2M3IzI3LjExLjIyLjA0LjAwI0NlbWVudCBtaXhlcnMjMjcuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjMuMDAuMDAjTWFya2luZyB0b29scyMyNy4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMy4wMS4wMCNCcmFuZGVycyMyNy4xMS4yMy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMy4wMi4wMCNBd2xzIzI3LjExLjIzLjAwLjAwCi11bnNwc2M3IzI3LjExLjIzLjAzLjAwI1NjcmliZXJzIzI3LjExLjIzLjAwLjAwCi11bnNwc2M3IzI3LjExLjIzLjA0LjAwI0NoYWxrIGxpbmVzIzI3LjExLjIzLjAwLjAwCi11bnNwc2M3IzI3LjExLjIzLjA1LjAwI01ldGFsIG1hcmtlcnMgb3IgaG9sZGVycyMyNy4xMS4yMy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMy4wNi4wMCNNZXRhbCBzdGFtcHMjMjcuMTEuMjMuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjQuMDAuMDAjRmFzdGVuZXIgc2V0dGluZyB0b29scyMyNy4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNC4wMS4wMCNTdGFwbGUgZ3VucyMyNy4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNC4wMi4wMCNSaXZldCB0b29scyMyNy4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNC4wMy4wMCNCYW5kZXJzIzI3LjExLjI0LjAwLjAwCi11bnNwc2M3IzI3LjExLjI0LjA0LjAwI0FuY2hvciBzZXR0aW5nIHRvb2xzIzI3LjExLjI0LjAwLjAwCi11bnNwc2M3IzI3LjExLjI0LjA1LjAwI0JvbHQgaGVhdGVycyMyNy4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNS4wMC4wMCNQcnlpbmcgYW5kIGJlbmRpbmcgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjUuMDEuMDAjUGlwZSBiZW5kaW5nIHRvb2xzIzI3LjExLjI1LjAwLjAwCi11bnNwc2M3IzI3LjExLjI1LjAyLjAwI1ByeSBiYXJzIzI3LjExLjI1LjAwLjAwCi11bnNwc2M3IzI3LjExLjI1LjAzLjAwI0NvbmR1aXQgYmVuZGVycyMyNy4xMS4yNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNS4wNC4wMCNXZWRnZXMjMjcuMTEuMjUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjUuMDUuMDAjUGFja2luZyBob29rcyMyNy4xMS4yNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNS4wNi4wMCNIaWNrZXlzIzI3LjExLjI1LjAwLjAwCi11bnNwc2M3IzI3LjExLjI2LjAwLjAwI1NlYWxpbmcgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjYuMDEuMDAjUHV0dHkga25pdmVzIzI3LjExLjI2LjAwLjAwCi11bnNwc2M3IzI3LjExLjI2LjAyLjAwI0NhdWxraW5nIHRvb2xzIzI3LjExLjI2LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjAwLjAwI1Bvd2VyIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjAxLjAwI1Bvd2VyIGJsb3dlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMDIuMDAjUG93ZXIgYnVmZmVycyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4wMy4wMCNQb3dlciBkcmlsbHMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMDQuMDAjUG93ZXIgZ3JpbmRlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMDUuMDAjRGVtb2xpdGlvbiBoYW1tZXJzIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjA2LjAwI1Bvd2VyIHBsYW5lcyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4wNy4wMCNQb3dlciByb3V0ZXJzIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjA4LjAwI1Bvd2VyIHNhbmRlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMDkuMDAjUG93ZXIgc2F3cyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4xMC4wMCNQb3dlciBzY3Jld2d1bnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTEuMDAjUG93ZXIgc3RhcGxlIGd1bnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTIuMDAjUG93ZXIgdHJpbW1lcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTMuMDAjSW1wYWN0IHdyZW5jaGVzIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjE0LjAwI1Bvd2VyIGNhdWxraW5nIGd1bnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTUuMDAjUG93ZXIgY2hpcHBlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTYuMDAjUG93ZXIgbmFpbCBndW5zIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjE3LjAwI0hlYXQgZ3VucyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4xOC4wMCNFbmdyYXZlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTkuMDAjR2x1ZSBndW5zIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjIwLjAwI1RvcnF1ZSB0b29scyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4yMS4wMCNCaXNjdWl0IGpvaW50ZXJzIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjAwLjAwI1Rvb2wgYXR0YWNobWVudHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDEuMDAjRHJpbGwgYml0cyMyNy4xMS4yOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yOC4wMi4wMCNTYXcgYmxhZGVzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjAzLjAwI0VuZCBtaWxscyMyNy4xMS4yOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yOC4wNC4wMCNTdGFtcGluZyBkaWVzIG9yIHB1bmNoZXMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDUuMDAjVGhyZWFkaW5nIGRpZXMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDYuMDAjVGhyZWFkaW5nIHRhcHMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDcuMDAjQ2h1Y2tzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjA4LjAwI0NvbGxldHMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDkuMDAjVG9vbCBob2xkZXJzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjEwLjAwI1RocmVhZCByZXBhaXIga2l0cyMyNy4xMS4yOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yOC4xMS4wMCNBcmJvcnMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMTIuMDAjQ291bnRlcnNpbmtzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjEzLjAwI0V4dGVuc2lvbiBwb2xlIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjE0LjAwI1NjcmV3ZHJpdmVyIGJpdHMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMTUuMDAjTnV0IGRyaXZlciBiaXRzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjE2LjAwI0FicmFzaXZlIGRpc2sjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMTcuMDAjSG9sZSBzYXdzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjE4LjAwI1Zpc2UgamF3IGxpbmVycyBvciBjYXBzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjE5LjAwI1NraXZpbmcgdG9vbCBjdXR0ZXIgYmxhZGVzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjIxLjAwI1JvdXRlciBiaXRzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI5LjAwLjAwI0Rpc3BlbnNpbmcgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjkuMDEuMDAjR3JlYXNlIGd1bnMjMjcuMTEuMjkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjkuMDIuMDAjSW5kdXN0cmlhbCBmdW5uZWxzIzI3LjExLjI5LjAwLjAwCi11bnNwc2M3IzI3LjExLjI5LjAzLjAwI0hhbmQgc3ByYXllcnMjMjcuMTEuMjkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjkuMDQuMDAjUmVzaW4gZ3VucyMyNy4xMS4yOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yOS4wNS4wMCNPaWwgY2FuIzI3LjExLjI5LjAwLjAwCi11bnNwc2M3IzI3LjExLjI5LjA2LjAwI0NhdWxraW5nIGd1bnMjMjcuMTEuMjkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjkuMDcuMDAjQnJvYWRjYXN0IHNwcmVhZGVycyMyNy4xMS4yOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4zMC4wMC4wMCNCcnVzaGVzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjMwLjAxLjAwI1NjcmF0Y2ggYnJ1c2hlcyMyNy4xMS4zMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4zMC4wMi4wMCNUdWJlIGJydXNoZXMjMjcuMTEuMzAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzAuMDMuMDAjQXBwbGljYXRvciBicnVzaGVzIzI3LjExLjMwLjAwLjAwCi11bnNwc2M3IzI3LjExLjMxLjAwLjAwI1B1bGxpbmcgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzEuMDEuMDAjRmlzaCB0YXBlIzI3LjExLjMxLjAwLjAwCi11bnNwc2M3IzI3LjExLjMxLjAyLjAwI0Z1c2UgcHVsbGVycyMyNy4xMS4zMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4zMi4wMC4wMCNUb29sIGtpdHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzIuMDEuMDAjR2VuZXJhbCB0b29sIGtpdHMjMjcuMTEuMzIuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzIuMDIuMDAjQmVhcmluZyBmaXR0aW5nIHRvb2wga2l0cyMyNy4xMS4zMi4wMC4wMAotdW5zcHNjNyMyNy4xMS4zMi4wMy4wMCNDb21wdXRlciB0b29sIGtpdHMjMjcuMTEuMzIuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzIuMDQuMDAjRWxlY3RyaWNpYW4ga2l0cyMyNy4xMS4zMi4wMC4wMAotdW5zcHNjNyMyNy4xMi4wMC4wMC4wMCNIeWRyYXVsaWMgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjcuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTUuMDAuMDAjSHlkcmF1bGljIHByZXNzZXMjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTUuMDEuMDAjUHJlc3MgcmV0dXJuIHNwcmluZ3MjMjcuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTYuMDAuMDAjSHlkcmF1bGljIGN5bGluZGVycyBhbmQgcGlzdG9ucyMyNy4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMi4xNi4wMS4wMCNDeWxpbmRlciBwaXN0b25zIzI3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI3LjEyLjE2LjAyLjAwI0h5ZHJhdWxpYyBjeWxpbmRlcnMjMjcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTcuMDAuMDAjSHlkcmF1bGljIGhvc2UgYW5kIHR1YmUgZml0dGluZ3MjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTcuMDEuMDAjSHlkcmF1bGljIHF1aWNrIGNvbm5lY3RvcnMjMjcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTcuMDIuMDAjSHlkcmF1bGljIHRlZXMgb3IgY3Jvc3NlcyMyNy4xMi4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMi4xNy4wMy4wMCNGZXJydWxlcyMyNy4xMi4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMi4xNy4wNC4wMCNIeWRyYXVsaWMgdW5pb25zIzI3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI3LjEyLjE3LjA1LjAwI0h5ZHJhdWxpYyBvciBjb21wcmVzc2lvbiBlbGJvd3MjMjcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTcuMDYuMDAjRmVycnVsZSBudXRzIzI3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI3LjEyLjE3LjA3LjAwI0NyaW1wIGNvbm5lY3RvcnMjMjcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTguMDAuMDAjSHlkcmF1bGljIHF1aWNrIGNvbm5lY3RvcnMjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTkuMDAuMDAjSHlkcmF1bGljIHRlZXMgb3IgY3Jvc3NlcyMyNy4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMi4yMC4wMC4wMCNGZXJydWxlcyMyNy4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMi4zMC4wMC4wMCNIeWRyYXVsaWMgdW5pb25zIzI3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzI3LjEyLjQwLjAwLjAwI0h5ZHJhdWxpYyBvciBjb21wcmVzc2lvbiBlbGJvd3MjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuNTAuMDAuMDAjRmVycnVsZSBudXRzIzI3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzI3LjEyLjYwLjAwLjAwI0NyaW1wIGNvbm5lY3RvcnMjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuNjEuMDAuMDAjSHlkcmF1bGljIHRvb2xzIzI3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzI3LjEyLjYxLjAxLjAwI01hbmhvbGUgY292ZXIgbGlmdGVycyMyNy4xMi42MS4wMC4wMAotdW5zcHNjNyMyNy4xMy4wMC4wMC4wMCNQbmV1bWF0aWMgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjcuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTUuMDAuMDAjUG5ldW1hdGljIHRvb2xzIzI3LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI3LjEzLjE1LjAxLjAwI1BuZXVtYXRpYyBpbXBhY3Qgd3JlbmNoZXMjMjcuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTUuMDIuMDAjQ29tcHJlc3NlZCBhaXIgZ3VuIzI3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE1LjAzLjAwI1BuZXVtYXRpYyBzY3Jld2RyaXZlciMyNy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMy4xNS4wNC4wMCNQbmV1bWF0aWMgaGFtbWVyIzI3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE1LjA1LjAwI1BuZXVtYXRpYyBkcmlsbCMyNy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMy4xNS4wNi4wMCNQbmV1bWF0aWMgbmFpbCBkcml2ZXJzIzI3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE1LjA3LjAwI1BuZXVtYXRpYyBzYW5kaW5nIG1hY2hpbmVzIzI3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE2LjAwLjAwI0FpciBmaXR0aW5ncyBhbmQgY29ubmVjdG9ycyMyNy4xMy4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMy4xNi4wMS4wMCNBaXIgbWFuaWZvbGRzIzI3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE2LjAyLjAwI0ZpbHRlcnMjMjcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTYuMDMuMDAjUmVndWxhdG9yIzI3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE2LjA0LjAwI0x1YnJpY2F0b3IjMjcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTYuMDUuMDAjQWlyIGN1cnRhaW4jMjcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTYuMDYuMDAjQWlyIGNvdXBsaW5nIzI3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzMwLjAwLjAwLjAwLjAwI1N0cnVjdHVyZXMgYW5kIEJ1aWxkaW5nIGFuZCBDb25zdHJ1Y3Rpb24gYW5kIE1hbnVmYWN0dXJpbmcgQ29tcG9uZW50cyBhbmQgU3VwcGxpZXMjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMDAuMDAuMDAjU3RydWN0dXJhbCBtYXRlcmlhbHMgYW5kIGJhc2ljIHNoYXBlcyMzMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4wMC4wMCNBbmdsZXMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMDEuMDAjRmVycm91cyBhbGxveSBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjAzLjAwI0lyb24gYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjA0LjAwI1N0ZWVsIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjA2LjAwI0FsdW1pbnVtIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4wNy4wMCNNYWduZXNpdW0gYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjA4LjAwI1RpdGFuaXVtIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4wOS4wMCNDb3BwZXIgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjEwLjAwI0JyYXNzIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4xMS4wMCNCcm9uemUgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjEyLjAwI1ppbmMgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjEzLjAwI1RpbiBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMTQuMDAjTGVhZCBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMTUuMDAjUGxhc3RpYyBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMTYuMDAjUnViYmVyIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4xNy4wMCNQcmVjaW91cyBtZXRhbCBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMDAuMDAjQmFyIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjAxLjAwI0ZlcnJvdXMgYWxsb3kgYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4wMi4wMCNOb24gZmVycm91cyBhbGxveSBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjAzLjAwI0lyb24gYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4wNC4wMCNTdGVlbCBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjA1LjAwI1N0YWlubGVzcyBzdGVlbCBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjA2LjAwI0FsdW1pbnVtIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMDcuMDAjTWFnbmVzaXVtIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMDguMDAjVGl0YW5pdW0gYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4wOS4wMCNDb3BwZXIgYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4xMC4wMCNCcmFzcyBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjExLjAwI0Jyb256ZSBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjEyLjAwI1ppbmMgYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4xMy4wMCNUaW4gYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4xNC4wMCNMZWFkIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMTUuMDAjUGxhc3RpYyBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjE2LjAwI1ByZWNpb3VzIG1ldGFsIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMTcuMDAjV29vZGVuIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMDAuMDAjQmVhbXMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMDEuMDAjRmVycm91cyBhbGxveSBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4wMi4wMCNOb24gZmVycm91cyBhbGxveSBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4wMy4wMCNJcm9uIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjA0LjAwI1N0ZWVsIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjA1LjAwI1N0YWlubGVzcyBzdGVlbCBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4wNi4wMCNBbHVtaW51bSBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4wNy4wMCNNYWduZXNpdW0gYmVhbXMjMzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMDguMDAjVGl0YW5pdW0gYmVhbXMjMzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMDkuMDAjQ29wcGVyIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjEwLjAwI0JyYXNzIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjExLjAwI0Jyb256ZSBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4xMi4wMCNaaW5jIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjEzLjAwI1RpbiBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4xNC4wMCNMZWFkIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjE1LjAwI1BsYXN0aWMgYmVhbXMjMzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMTYuMDAjUnViYmVyIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjE3LjAwI0NvbmNyZXRlIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjE4LjAwI1ByZWNpb3VzIG1ldGFsIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjAwLjAwI0NoYW5uZWxzIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjAxLjAwI0ZlcnJvdXMgYWxsb3kgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMDMuMDAjSXJvbiBjaGFubmVscyMzMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOC4wNC4wMCNTdGVlbCBjaGFubmVscyMzMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOC4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMDYuMDAjQWx1bWludW0gY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMDcuMDAjTWFnbmVzaXVtIGNoYW5uZWxzIzMwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjA4LjAwI1RpdGFuaXVtIGNoYW5ubmVscyMzMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOC4wOS4wMCNDb3BwZXIgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTAuMDAjQnJhc3MgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTEuMDAjQnJvbnplIGNoYW5uZWxzIzMwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjEyLjAwI1ppbmMgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTMuMDAjVGluIGNoYW5uZWxzIzMwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjE0LjAwI0xlYWQgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTUuMDAjUGxhc3RpYyBjaGFubmVscyMzMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOC4xNi4wMCNSdWJiZXIgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTcuMDAjUHJlY2lvdXMgbWV0YWwgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMDAuMDAjQ29pbCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4wMS4wMCNGZXJyb3VzIGFsbG95IGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4wMy4wMCNJcm9uIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMDQuMDAjU3RlZWwgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4wNi4wMCNBbHVtaW51bSBjb2lsIzMwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE5LjA3LjAwI01hZ25lc2l1bSBjb2lsIzMwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE5LjA4LjAwI1RpdGFuaXVtIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMDkuMDAjQ29wcGVyIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMTAuMDAjQnJhc3MgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xMS4wMCNCcm9uemUgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xMi4wMCNaaW5jIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMTMuMDAjVGluIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMTQuMDAjTGVhZCBjb2lsIzMwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE5LjE1LjAwI1BsYXN0aWMgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xNi4wMCNQcmVjaW91cyBtZXRhbCBjb2lscyMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xNy4wMCNOb24gbWV0YWxsaWMgY29pbHMjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMTguMDAjUGVyZm9yYXRlZCBzdGVlbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xOS4wMCNFbWJvc3NlZCBzdGVlbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4yMC4wMCNDb21wcmVzc2VkIGZpYmVyIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMjEuMDAjRmliZXIgYW5kIHJ1YmJlciBjb2lsIzMwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE5LjIyLjAwI0dyYXBoaXRlIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMDAuMDAjRm9pbCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4wMS4wMCNGZXJyb3VzIGFsbG95IGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4wMy4wMCNJcm9uIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMDQuMDAjU3RlZWwgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4wNi4wMCNBbHVtaW51bSBmb2lsIzMwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIwLjA3LjAwI01hZ25lc2l1bSBmb2lsIzMwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIwLjA4LjAwI1RpdGFuaXVtIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMDkuMDAjQ29wcGVyIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMTAuMDAjQnJhc3MgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4xMS4wMCNCcm9uemUgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4xMi4wMCNaaW5jIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMTMuMDAjVGluIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMTQuMDAjTGVhZCBmb2lsIzMwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIwLjE1LjAwI1BsYXN0aWMgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4wMC4wMCNQaXBlIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjAxLjAwI0ZlcnJvdXMgYWxsb3kgcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4wMi4wMCNOb24gZmVycm91cyBhbGxveSBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjAzLjAwI0lyb24gcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4wNC4wMCNTdGVlbCBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjA1LjAwI1N0YWlubGVzcyBzdGVlbCBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjA2LjAwI0FsdW1pbnVtIHBpcGUjMzAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjEuMDcuMDAjTWFnbmVzaXVtIHBpcGUjMzAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjEuMDguMDAjVGl0YW5pdW0gcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4wOS4wMCNDb3BwZXIgcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4xMC4wMCNCcmFzcyBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjExLjAwI0Jyb256ZSBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjEyLjAwI1ppbmMgcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4xMy4wMCNUaW4gcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4xNC4wMCNMZWFkIHBpcGUjMzAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjEuMTUuMDAjUGxhc3RpYyBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjE2LjAwI1J1YmJlciBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjE3LjAwI0NvbmNyZXRlIHBpcGUjMzAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMDAuMDAjUGxhdGUjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMDEuMDAjRmVycm91cyBhbGxveSBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4wMi4wMCNOb24gZmVycm91cyBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4wMy4wMCNJcm9uIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjA0LjAwI1N0ZWVsIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjA1LjAwI1N0YWlubGVzcyBzdGVlbCBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4wNi4wMCNBbHVtaW51bSBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4wNy4wMCNNYWduZXNpdW0gcGxhdGUjMzAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMDguMDAjVGl0YW5pdW0gcGxhdGUjMzAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMDkuMDAjQ29wcGVyIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjEwLjAwI0JyYXNzIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjExLjAwI0Jyb256ZSBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4xMi4wMCNaaW5jIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjEzLjAwI1RpbiBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4xNC4wMCNMZWFkIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjE1LjAwI1BsYXN0aWMgcGxhdGUjMzAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMTYuMDAjUnViYmVyIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjE3LjAwI0NvbmNyZXRlIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjE4LjAwI1ByZWNpb3VzIG1ldGFsIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjE5LjAwI05vbiBtZXRhbGxpYyBwbGF0ZXMjMzAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMDAuMDAjUHJvZmlsZXMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMDEuMDAjRmVycm91cyBhbGxveSBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4wMi4wMCNOb24gZmVycm91cyBhbGxveSBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4wMy4wMCNJcm9uIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjA0LjAwI1N0ZWVsIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjA1LjAwI1N0YWlubGVzcyBzdGVlbCBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4wNi4wMCNBbHVtaW51bSBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4wNy4wMCNNYWduZXNpdW0gcHJvZmlsZXMjMzAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMDguMDAjVGl0YW5pdW0gcHJvZmlsZXMjMzAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMDkuMDAjQ29wcGVyIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjEwLjAwI0JyYXNzIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjExLjAwI0Jyb256ZSBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4xMi4wMCNaaW5jIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjEzLjAwI1RpbiBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4xNC4wMCNMZWFkIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjE1LjAwI1BsYXN0aWMgcHJvZmlsZXMjMzAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMTYuMDAjUnViYmVyIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjI0LjAwLjAwI1JvZCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4wMS4wMCNGZXJyb3VzIGFsbG95IHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4wMy4wMCNJcm9uIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMDQuMDAjU3RlZWwgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4wNi4wMCNBbHVtaW51bSByb2RzIzMwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI0LjA3LjAwI01hZ25lc2l1bSByb2RzIzMwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI0LjA4LjAwI1RpdGFuaXVtIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMDkuMDAjQ29wcGVyIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMTAuMDAjQnJhc3Mgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4xMS4wMCNCcm9uemUgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4xMi4wMCNaaW5jIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMTMuMDAjVGluIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMTQuMDAjTGVhZCByb2RzIzMwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI0LjE1LjAwI1BsYXN0aWMgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4xNi4wMCNSdWJiZXIgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4wMC4wMCNTaGVldCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4wMS4wMCNGZXJyb3VzIGFsbG95IHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjAyLjAwI05vbiBmZXJyb3VzIGFsbG95IHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjAzLjAwI0lyb24gc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMDQuMDAjU3RlZWwgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMDUuMDAjU3RhaW5sZXNzIHN0ZWVsIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjA2LjAwI0FsdW1pbnVtIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjA3LjAwI01hZ25lc2l1bSBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4wOC4wMCNUaXRhbml1bSBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4wOS4wMCNDb3BwZXIgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTAuMDAjQnJhc3Mgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTEuMDAjQnJvbnplIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjEyLjAwI1ppbmMgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTMuMDAjVGluIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjE0LjAwI0xlYWQgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTUuMDAjUGxhc3RpYyBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4xNi4wMCNSdWJiZXIgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTcuMDAjQXJtb3Igc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTguMDAjQmVyeWxsaXVtIGFsbG95IHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjE5LjAwI0NvbXBvc2l0ZSBtZXRhbCBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4yMC4wMCNOaWNrZWwgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMjEuMDAjRm9hbSBSdWJiZXIgU2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMjIuMDAjQ29yayBhbmQgcnViYmVyIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjIzLjAwI0NvbXByZXNzZWQgZmliZXIgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMjQuMDAjTWV0YWwgaW5zZXJ0ZWQgY29tcHJlc3NlZCBmaWJlciBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4yNS4wMCNGaWJlciBhbmQgcnViYmVyIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjI2LjAwI0FzYmVzdG9zIHNoZWV0cyMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4wMC4wMCNTdHJpcCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4wMS4wMCNGZXJyb3VzIGFsbG95IHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjAyLjAwI05vbiBmZXJyb3VzIGFsbG95IHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjAzLjAwI0lyb24gc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMDQuMDAjU3RlZWwgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMDUuMDAjU3RhaW5sZXNzIHN0ZWVsIHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjA2LjAwI0FsdW1pbnVtIHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjA3LjAwI01hZ25lc2l1bSBzdHJpcCMzMC4xMC4yNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4wOC4wMCNUaXRhbml1bSBzdHJpcCMzMC4xMC4yNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4wOS4wMCNDb3BwZXIgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMTAuMDAjQnJhc3Mgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMTEuMDAjQnJvbnplIHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjEyLjAwI1ppbmMgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMTMuMDAjVGluIHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjE0LjAwI0xlYWQgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMTUuMDAjUGxhc3RpYyBzdHJpcCMzMC4xMC4yNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4xNi4wMCNSdWJiZXIgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDAuMDAjVHViZSBhbmQgdHViaW5nIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjAxLjAwI0ZlcnJvdXMgYWxsb3kgdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjAyLjAwI0NvcHBlciB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDMuMDAjVGl0YW5pdW0gdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjA0LjAwI01hZ25lc2l1bSB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDUuMDAjVGluIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4wNi4wMCNCcmFzcyB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDcuMDAjTGVhZCB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDguMDAjQnJvbnplIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4wOS4wMCNaaW5jIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xMC4wMCNTdGVlbCB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMTEuMDAjSXJvbiB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMTIuMDAjQ2VtZW50IHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xMy4wMCNQbGFzdGljIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xNC4wMCNSdWJiZXIgdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjE1LjAwI0dsYXNzIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xNi4wMCNTdG9uZSB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMTcuMDAjTm9uIGZlcnJvdXMgYWxsb3kgdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjE4LjAwI0FsdW1pbnVtIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xOS4wMCNTdGFpbmxlc3Mgc3RlZWwgdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjIwLjAwI1ByZWNpb3VzIG1ldGFsIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yOC4wMC4wMCNQaWxpbmcjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjguMDEuMDAjQWx1bWludW0gcGlsaW5ncyMzMC4xMC4yOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yOC4wMi4wMCNDb25jcmV0ZSBwaWxpbmdzIzMwLjEwLjI4LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI4LjAzLjAwI1N0ZWVsIHBpbGluZ3MjMzAuMTAuMjguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDAuMDAjUG9zdCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yOS4wMS4wMCNDZW1lbnQgb3IgY29uY3JldGUgcG9zdHMjMzAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDIuMDAjU3RlZWwgcG9zdHMjMzAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDMuMDAjTWV0YWwgcG9zdHMjMzAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDQuMDAjV29vZGVuIHBvc3RzIzMwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI5LjA1LjAwI1BsYXN0aWMgcG9zdHMjMzAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDYuMDAjRmliZXJnbGFzcyBwb3N0cyMzMC4xMC4yOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMC4wMC4wMCNTaGFmdGluZyMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMC4wMS4wMCNTdGVlbCBzaGFmdGluZyMzMC4xMC4zMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMC4wMi4wMCNTdGFpbmxlc3Mgc3RlZWwgc2hhZnRpbmcjMzAuMTAuMzAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzEuMDAuMDAjUmFpbHMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzEuMDEuMDAjU3RlZWwgcmFpbCMzMC4xMC4zMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMS4wMi4wMCNBbHVtaW51bSByYWlsIzMwLjEwLjMxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMxLjAzLjAwI01ldGFsIHJhaWwjMzAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzIuMDAuMDAjR3JhdGluZyMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMi4wMS4wMCNTdGVlbCBncmF0aW5nIzMwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMyLjAyLjAwI1N0YWlubGVzcyBzdGVlbCBncmF0aW5nIzMwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMyLjAzLjAwI0FsdW1pbnVtIGdyYXRpbmcjMzAuMTAuMzIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzIuMDQuMDAjRmliZXJnbGFzcyBncmF0aW5nIzMwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMyLjA1LjAwI0lyb24gZ3JhdGluZyMzMC4xMC4zMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4wMC4wMCNCaWxsZXRzIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMzLjAxLjAwI0FsdW1pbnVtIGJpbGxldCMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4wMi4wMCNCcmFzcyBiaWxsZXQjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMDMuMDAjQnJvbnplIGJpbGxldHMjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMDQuMDAjQ29wcGVyIGJpbGxldHMjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMDUuMDAjTGVhZCBiaWxsZXRzIzMwLjEwLjMzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMzLjA2LjAwI1ppbmMgYmlsbGV0cyMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4wNy4wMCNTdGVlbCBiaWxsZXRzIzMwLjEwLjMzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMzLjA4LjAwI1RpdGFuaXVtIGJpbGxldHMjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMDkuMDAjTWFnbmVzaXVtIGJpbGxldHMjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMTAuMDAjUHJlY2lvdXMgbWV0YWwgYmlsbGV0cyMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4xMS4wMCNOb24gZmVycm91cyBtZXRhbCBiaWxsZXRzIzMwLjEwLjMzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMzLjEyLjAwI0ZlcnJvdXMgbWV0YWwgYmlsbGV0cyMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4xMy4wMCNOb24gbWV0YWxsaWMgYmlsbGV0cyMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wMC4wMCNJbmdvdHMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzQuMDEuMDAjQWx1bWludW0gaW5nb3RzIzMwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM0LjAyLjAwI0JyYXNzIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wMy4wMCNMZWFkIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wNC4wMCNaaW5jIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wNS4wMCNTdGVlbCBpbmdvdHMjMzAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzQuMDYuMDAjTWFnbmVzaXVtIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wNy4wMCNCcm9uemUgaW5nb3RzIzMwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM0LjA4LjAwI0NvcHBlciBpbmdvdHMjMzAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzQuMDkuMDAjVGl0YW5pdW0gaW5nb3RzIzMwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM0LjEwLjAwI1ByZWNpb3VzIG1ldGFsIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4xMS4wMCNGZXJyb3VzIGFsbG95IGV4dHJ1c2lvbiBpbmdvdHMjMzAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzQuMTIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZXh0cnVzaW9uIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4xMy4wMCNOb24gbWV0YWxsaWMgaW5nb3RzIzMwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjAwLjAwI0hvbmV5Y29tYiBjb3JlIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjAxLjAwI0FsdW1pbnVtIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjAyLjAwI01hZ25lc2l1bSBob25leWNvbWIgY29yZSMzMC4xMC4zNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNS4wMy4wMCNGb2FtIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjA0LjAwI1BsYXN0aWMgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMDUuMDAjV29vZGVuIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjA2LjAwI0ZlcnJvdXMgbWV0YWwgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMDcuMDAjQnJvbnplIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjA4LjAwI0NvcHBlciBob25leWNvbWIgY29yZSMzMC4xMC4zNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNS4wOS4wMCNTdGVlbCBob25leWNvbWIgY29yZSMzMC4xMC4zNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNS4xMC4wMCNMZWFkIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjExLjAwI1ppbmMgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMTIuMDAjVGl0YW5pdW0gaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMTMuMDAjQnJhc3MgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMTQuMDAjTm9uIGZlcnJvdXMgbWV0YWwgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMTUuMDAjUHJlY2lvdXMgbWV0YWwgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzYuMDAuMDAjU3RydWN0dXJhbCBwcm9kdWN0cyMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNi4wMS4wMCNXb29kIGJlYW1zIzMwLjEwLjM2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM2LjAyLjAwI1dvb2QgY29tcG9zaXRlIGJlYW1zIzMwLjEwLjM2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM2LjAzLjAwI0ZyYW1pbmcgbHVtYmVyIzMwLjEwLjM2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM2LjA0LjAwI1dvb2Qgc2hlYXRoaW5nIG9yIHNoZWV0cyMzMC4xMC4zNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNi4wNS4wMCNXb29kIHBsYW5rcyMzMC4xMC4zNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNi4wNi4wMCNXb29kIHRydXNzZXMjMzAuMTAuMzYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzYuMDcuMDAjV29vZCBqb2lzdHMjMzAuMTAuMzYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzcuMDAuMDAjQnJhaWQjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzcuMDEuMDAjU3RhaW5sZXNzIHN0ZWVsIGJyYWlkIzMwLjEwLjM3LjAwLjAwCi11bnNwc2M3IzMwLjExLjAwLjAwLjAwI0NvbmNyZXRlIGFuZCBjZW1lbnQgYW5kIHBsYXN0ZXIjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTEuMTUuMDAuMDAjQ29uY3JldGUgYW5kIG1vcnRhcnMjMzAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTEuMTUuMDEuMDAjRm9hbWVkIGNvbmNyZXRlIzMwLjExLjE1LjAwLjAwCi11bnNwc2M3IzMwLjExLjE1LjAyLjAwI0NvbmR1Y3RpdmUgY29uY3JldGUjMzAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTEuMTUuMDMuMDAjSW5zdWxhdGluZyBjb25jcmV0ZSMzMC4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNS4wNC4wMCNNb3J0YXJzIzMwLjExLjE1LjAwLjAwCi11bnNwc2M3IzMwLjExLjE2LjAwLjAwI0NlbWVudCBhbmQgbGltZSMzMC4xMS4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wMS4wMCNDZW1lbnQjMzAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTEuMTYuMDIuMDAjQ2hsb3JpbmF0ZWQgbGltZSMzMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wMy4wMCNIeWRyYXVsaWMgbGltZSMzMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wNC4wMCNIeWRyYXRlZCBsaW1lIzMwLjExLjE2LjAwLjAwCi11bnNwc2M3IzMwLjExLjE2LjA1LjAwI0xlYW4gbGltZSMzMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wNi4wMCNHcm91dCMzMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wNy4wMCNVbnNsYWtlZCBsaW1lIzMwLjExLjE2LjAwLjAwCi11bnNwc2M3IzMwLjExLjE3LjAwLjAwI1BsYXN0ZXJzIzMwLjExLjAwLjAwLjAwCi11bnNwc2M3IzMwLjExLjE3LjAxLjAwI0d5cHN1bSBwbGFzdGVyIzMwLjExLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEyLjAwLjAwLjAwI1JvYWRzIGFuZCBsYW5kc2NhcGUjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTIuMTUuMDAuMDAjQml0dW1pbm91cyBkZXJpdmF0aXZlcyMzMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNS4wMS4wMCNDb2FsIHRhciMzMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNS4wMi4wMCNUYXJzIzMwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEyLjE1LjAzLjAwI0NyZXNvdGUjMzAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTIuMTYuMDAuMDAjQXNwaGFsdHMjMzAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTIuMTYuMDEuMDAjQXNwaGFsdCMzMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNi4wMi4wMCNQaXRjaCMzMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNi4wMy4wMCNHaWxzb25pdGUjMzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTIuMTYuMDQuMDAjQ3V0YmFjayBwcm9kdWN0cyMzMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNi4wNS4wMCNNYW5ob2xlIGZyYW1lcyB3aXRoIGNvdmVycyMzMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMy4wMC4wMC4wMCNTdHJ1Y3R1cmFsIGJ1aWxkaW5nIHByb2R1Y3RzIzMwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEzLjE1LjAwLjAwI0Jsb2NrcyMzMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNS4wMS4wMCNDZW1lbnQgYmxvY2tzIzMwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEzLjE1LjAyLjAwI0NvbmNyZXRlIGJsb2NrcyMzMC4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNS4wMy4wMCNTdG9uZSBibG9ja3MjMzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTUuMDQuMDAjQ2VyYW1pYyBibG9ja3MjMzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTYuMDAuMDAjQnJpY2tzIzMwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEzLjE2LjAxLjAwI0NlbWVudCBicmlja3MjMzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTYuMDIuMDAjQ2VyYW1pYyBicmlja3MjMzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTYuMDMuMDAjQ29uY3JldGUgYnJpY2tzIzMwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEzLjE2LjA0LjAwI1N0b25lIGJyaWNrcyMzMC4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNy4wMC4wMCNUaWxlcyBhbmQgZmxhZ3N0b25lcyMzMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNy4wMS4wMCNDZW1lbnQgdGlsZXMgb3IgZmxhZ3N0b25lcyMzMC4xMy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNy4wMi4wMCNTdG9uZSB0aWxlcyBvciBmbGFnc3RvbmVzIzMwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEzLjE3LjAzLjAwI0NvbmNyZXRlIHRpbGVzIG9yIGZsYWdzdG9uZXMjMzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTcuMDQuMDAjQ2VyYW1pYyB0aWxlcyBvciBmbGFnc3RvbmVzIzMwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEzLjE3LjA1LjAwI0hlYWQgc3RvbmVzIzMwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMwLjE0LjAwLjAwLjAwI0luc3VsYXRpb24jMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMDAuMDAjVGhlcm1hbCBpbnN1bGF0aW9uIzMwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjAxLjAwI1dlYXRoZXIgc3RyaXBwaW5nIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjAyLjAwI0luc3VsYXRpb24gYmxhbmtldHMjMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMDMuMDAjRm9hbSBpbnN1bGF0aW9uIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjA0LjAwI0luc3VsYXRpb24gYmF0dHMjMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMDUuMDAjVGhlcm1hbCBpbnN1bGF0aW9uIHNsZWV2aW5nIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjA2LjAwI0xvb3NlIGZpbGwgaW5zdWxhdGlvbiMzMC4xNC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNC4xNS4wNy4wMCNSaWdpZCBib2FyZCBpbnN1bGF0aW9uIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjA4LjAwI0ZpYmVyIGluc3VsYXRpb24jMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMDkuMDAjUmVmcmFjdG9yaWVzIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjEwLjAwI0Rvb3Igc3dlZXAjMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMTEuMDAjV2luZG93IGZpbG0jMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTYuMDAuMDAjU3BlY2lhbHR5IGluc3VsYXRpb24jMzAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTYuMDEuMDAjQWNvdXN0aWNhbCBpbnN1bGF0aW9uIzMwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE2LjAyLjAwI05vbiB0aGVybWFsIGluc3VsYXRpb24gc2xlZXZpbmcjMzAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTYuMDMuMDAjSGVhdCBTaGllbGRzIzMwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE1LjAwLjAwLjAwI0V4dGVyaW9yIGZpbmlzaGluZyBtYXRlcmlhbHMjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTUuMDAuMDAjUm9vZmluZyBtYXRlcmlhbHMjMzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTUuMDEuMDAjUm9sbCByb29maW5nIzMwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE1LjAyLjAwI1Jvb2YgdmFsbGV5cyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wMy4wMCNSb29maW5nIGZhYnJpY3MjMzAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTUuMDQuMDAjUm9vZmluZyBmZWx0cyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wNS4wMCNSb29maW5nIG1lbWJyYW5lcyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wNi4wMCNSb29maW5nIHRpbGVzIzMwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE1LjA3LjAwI1NoYWtlcyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wOC4wMCNTaGluZ2xlcyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wOS4wMCNUcnVzc2VzIzMwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE1LjEwLjAwI1NsYXRlIHJvb2ZpbmcjMzAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDAuMDAjUm9vZmluZyBhY2Nlc3NvcmllcyMzMC4xNS4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNi4wMS4wMCNSb29mIGZhc2NpYXMjMzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDIuMDAjRmxhc2hpbmdzIzMwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE2LjAzLjAwI0dyYXZlbCBzdG9wcyMzMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNi4wNC4wMCNSb29maW5nIGJydXNoZXMjMzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDUuMDAjUm9vZmluZyBkcmFpbnMjMzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDYuMDAjUm9vZmluZyBtb3BzIzMwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE2LjA3LjAwI1Jvb2ZpbmcgdmVudHMjMzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDguMDAjU29mZml0cyMzMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNi4wOS4wMCNSb29mIGN1cmJzIzMwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE2LjEwLjAwI1Jvb2YgcmlwcGVycyMzMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNy4wMC4wMCNSYWluIGd1dHRlcnMgYW5kIGFjY2Vzc29yaWVzIzMwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE1LjE3LjAxLjAwI0Rvd25zcG91dHMjMzAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTcuMDIuMDAjRHJpcCBjYXBzIzMwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE3LjAzLjAwI0d1dHRlcnMjMzAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTcuMDQuMDAjU3BsYXNoYmxvY2tzIzMwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE4LjAwLjAwI1NpZGluZyBhbmQgZXh0ZXJpb3Igd2FsbCBtYXRlcmlhbHMjMzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTguMDEuMDAjU2h1dHRlcnMjMzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTguMDIuMDAjU2lkaW5nIzMwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE4LjAzLjAwI1NpZGluZyBidXR0IGpvaW50cyMzMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMzMC4xNS4xOC4wNC4wMCNTaWRpbmcgY29ybmVycyMzMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMzMC4xNS4xOC4wNS4wMCNTdHVjY28jMzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTguMDYuMDAjR2xhc3MgY3VydGFpbndhbGxpbmcjMzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTkuMDAuMDAjRmluaXNoaW5nIG1hdGVyaWFscyBhbmQgcHJvZHVjdHMjMzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTkuMDEuMDAjQXduaW5ncyMzMC4xNS4xOS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xOS4wMi4wMCNFeHRlcmlvciB0cmltIG1hdGVyaWFscyMzMC4xNS4xOS4wMC4wMAotdW5zcHNjNyMzMC4xNS4yMC4wMC4wMCNGZW5jaW5nIzMwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE1LjIwLjAxLjAwI01ldGFsIGZlbmNpbmcjMzAuMTUuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMjAuMDIuMDAjV29vZCBmZW5jaW5nIzMwLjE1LjIwLjAwLjAwCi11bnNwc2M3IzMwLjE1LjIxLjAwLjAwI1N1cmZhY2UjMzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMjEuMDEuMDAjU2hvdCBzdGVlbCMzMC4xNS4yMS4wMC4wMAotdW5zcHNjNyMzMC4xNi4wMC4wMC4wMCNJbnRlcmlvciBmaW5pc2hpbmcgbWF0ZXJpYWxzIzMwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjE2LjE1LjAwLjAwI1dhbGwgZmluaXNoaW5nIG1hdGVyaWFscyMzMC4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNS4wMS4wMCNXYWxsYm9hcmQjMzAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTUuMDIuMDAjV2FsbHBhcGVycyMzMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNS4wMy4wMCNEcnl3YWxsIzMwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE1LjA0LjAwI0Nvcm5lciBndWFyZHMjMzAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTUuMDUuMDAjUGFuZWxzIG9yIHBhbmVsbGluZyMzMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNS4wNi4wMCNQbGFzdGVyIzMwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE1LjA3LjAwI0RyeXdhbGwgam9pbnQgY29tcG91bmRzIzMwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE1LjA4LjAwI1dhbGxwYXBlciByb2xsZXIjMzAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTYuMDAuMDAjQ2VpbGluZyBtYXRlcmlhbHMjMzAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTYuMDEuMDAjQWNvdXN0aWMgY2VpbGluZyB0aWxlcyMzMC4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNi4wMi4wMCNDZWlsaW5nIHBhbmVscyMzMC4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNi4wMy4wMCNDb2ZmZXJzIzMwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE2LjA0LjAwI1N1c3BlbmRlZCBjZWlsaW5nIHN5c3RlbXMjMzAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDAuMDAjRmxvb3JpbmcjMzAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDEuMDAjQ2FycGV0aW5nIzMwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE3LjAyLjAwI1dvb2QgZmxvb3JpbmcjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDMuMDAjTGlub2xldW0jMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDUuMDAjUnViYmVyIGZsb29yaW5nIzMwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE3LjA2LjAwI1N0b25lIG9yIHRpbGUgZmxvb3JpbmcjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDcuMDAjVmlueWwgZmxvb3JpbmcjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDguMDAjS25vdHRlZCBjYXJwZXRpbmcjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDkuMDAjVHVmdGVkIGNhcnBldGluZyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNy4xMC4wMCNMYW1pbmF0ZSBmbG9vcmluZyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNy4xMS4wMCNPdXRkb29yIGNhcnBldGluZyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNy4xMi4wMCNGbG9vcmluZyBqb2lzdHMjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMTMuMDAjQ2FycGV0IHBhZHMjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMTQuMDAjQ29yayBmbG9vcmluZyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNy4xNS4wMCNEdWNrYm9hcmRzIzMwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE3LjE2LjAwI1RpbGUgc3BhY2VycyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xOC4wMC4wMCNDYWJpbmV0cnkjMzAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTguMDEuMDAjQ2FiaW5ldHMjMzAuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTguMDIuMDAjQ291bnRlcnRvcHMjMzAuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTkuMDAuMDAjTW9sZGluZyBhbmQgbWlsbHdvcmsjMzAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTkuMDEuMDAjTG91dmVycyMzMC4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMC4xNi4xOS4wMi4wMCNDb2x1bW5zIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjAzLjAwI1dhaW5zY290aW5nIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjA0LjAwI0Nvcm5pY2VzIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjA1LjAwI0Rvb3Igc3Vycm91bmRzIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjA2LjAwI01vbGRpbmcjMzAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTkuMDcuMDAjU3RhaXJzIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjA4LjAwI1N0YWlyIHBhcnRzIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE3LjAwLjAwLjAwI0Rvb3JzIGFuZCB3aW5kb3dzIGFuZCBnbGFzcyMzMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4wMC4wMCNEb29ycyMzMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4wMS4wMCNHbGFzcyBkb29ycyMzMC4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4wMi4wMCNTY3JlZW4gZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDMuMDAjUm9sbGluZyBkb29ycyMzMC4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4wNC4wMCNXb29kZW4gZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDUuMDAjTWV0YWwgZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDYuMDAjU3Rvcm0gZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDcuMDAjRG9vciBmcmFtZXMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDguMDAjUG9ja2V0IGRvb3JzIzMwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE1LjA5LjAwI1Jldm9sdmluZyBkb29ycyMzMC4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4xMC4wMCNBdXRvbWF0aWMgZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMTEuMDAjU3dpbmcgZG9vciMzMC4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4xMi4wMCNEb29yIG9wZW5lcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMDAuMDAjV2luZG93cyMzMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNi4wNC4wMCNEb3VibGUgaHVuZyB3aW5kb3dzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjA1LjAwI1NpbmdsZSBodW5nIHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMDYuMDAjQ2FzZW1lbnQgd2luZG93cyMzMC4xNy4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNi4wNy4wMCNIb3Jpem9udGFsIHNsaWRlciB3aW5kb3dzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjA4LjAwI1RpbHQgb3IgdHJhbnNvbSB3aW5kb3dzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjA5LjAwI0ZpeGVkIHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMTAuMDAjQmF5IHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMTEuMDAjQm93IHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMTIuMDAjUHJvamVjdGVkIHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMTMuMDAjV2luZG93IHdhbGxzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjE0LjAwI1dpbmRvdyBzY3JlZW5zIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjE1LjAwI0ZyZW5jaCB3aW5kb3dzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE3LjAwLjAwI0dsYXNzIHByb2R1Y3RzIzMwLjE3LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE3LjE3LjAxLjAwI1BhdmluZyBibG9ja3MjMzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTcuMDMuMDAjQmV2ZWxlZCBnbGFzcyMzMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNy4wNC4wMCNMZWFkZWQgZ2xhc3MjMzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTcuMDUuMDAjTGFtaW5hdGVkIGdsYXNzIzMwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE3LjA2LjAwI1RlbXBlcmVkIGdsYXNzIzMwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE3LjA3LjAwI1NhZmV0eSBnbGFzcyMzMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNy4wOC4wMCNGbG9hdCBnbGFzcyMzMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNy4wOS4wMCNXaXJlZCBnbGFzcyMzMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNy4xOC4wMC4wMCNTa3lsaWdodHMjMzAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTguMDEuMDAjRml4ZWQgc2t5bGlnaHRzIzMwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE4LjAyLjAwI1ZlbnRlZCBza3lsaWdodHMjMzAuMTcuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTguMDMuMDAjVHViZSBza3lsaWdodHMjMzAuMTcuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTkuMDAuMDAjV2luZG93IGZyYW1lcyMzMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNy4xOS4wMS4wMCNEb3VibGUgaHVuZyB3aW5kb3cgZnJhbWVzIzMwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE5LjAyLjAwI1NpbmdsZSBodW5nIHdpbmRvdyBmcmFtZXMjMzAuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTkuMDMuMDAjQ2FzZW1lbnQgd2luZG93IGZyYW1lcyMzMC4xNy4xOS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xOS4wNC4wMCNIb3Jpem9udGFsIHNsaWRlciB3aW5kb3cgZnJhbWVzIzMwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE5LjA1LjAwI1RpbHQgb3IgdHJhbnNvbSB3aW5kb3cgZnJhbWVzIzMwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE5LjA2LjAwI0ZpeGVkIHdpbmRvdyBmcmFtZXMjMzAuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMjAuMDAuMDAjR2F0ZXMjMzAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMjAuMDEuMDAjU2luZ2xlIGJhciBnYXRlIzMwLjE3LjIwLjAwLjAwCi11bnNwc2M3IzMwLjE3LjIwLjAyLjAwI0RvdWJsZSBiYXIgZ2F0ZSMzMC4xNy4yMC4wMC4wMAotdW5zcHNjNyMzMC4xOC4wMC4wMC4wMCNQbHVtYmluZyBmaXh0dXJlcyMzMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xOC4xNS4wMC4wMCNTYW5pdGFyeSB3YXJlIzMwLjE4LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjAxLjAwI0JhdGh0dWJzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjAyLjAwI0JpZGV0cyMzMC4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOC4xNS4wMy4wMCNTaG93ZXJzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjA0LjAwI1NpbmtzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjA1LjAwI1RvaWxldHMjMzAuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTguMTUuMDYuMDAjVXJpbmFscyMzMC4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOC4xNS4wNy4wMCNCYXRodHViIG9yIHNob3dlciBlbmNsb3N1cmVzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjA4LjAwI1Jlc3Ryb29tIHBhcnRpdGlvbnMjMzAuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTguMTUuMDkuMDAjU29hcCBkaXNoZXMjMzAuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTguMTUuMTAuMDAjTmFwa2luIHJpbmdzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE5LjAwLjAwLjAwI0NvbnN0cnVjdGlvbiBhbmQgbWFpbnRlbmFuY2Ugc3VwcG9ydCBlcXVpcG1lbnQjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTUuMDAuMDAjTGFkZGVycyBhbmQgc2NhZmZvbGRpbmcjMzAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTUuMDEuMDAjTGFkZGVycyMzMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOS4xNS4wMi4wMCNTY2FmZm9sZGluZyMzMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOS4xNS4wMy4wMCNTdGVwIHN0b29sIzMwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE5LjE1LjA0LjAwI1N0ZXAgc3Rvb2wjMzAuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTUuMDUuMDAjU3RlcCBzdG9vbCMzMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOS4xNi4wMC4wMCNMYWRkZXJzIGFuZCBzY2FmZm9sZGluZyBhY2Nlc3NvcmllcyMzMC4xOS4wMC4wMC4wMAotdW5zcHNjNyMzMC4xOS4xNi4wMS4wMCNIYW5kcmFpbHMjMzAuMTkuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTYuMDIuMDAjU2NhZmZvbGRpbmcgc3RhYmlsaXplcnMjMzAuMTkuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTYuMDMuMDAjU2NhZmZvbGRpbmcgZmxvb3JpbmcjMzAuMTkuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjAuMDAuMDAuMDAjUHJlZmFicmljYXRlZCBzdHJ1Y3R1cmVzIzMwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIwLjE1LjAwLjAwI1ByZWZhYnJpY2F0ZWQgZmFybSBzdHJ1Y3R1cmVzIzMwLjIwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIwLjE1LjAxLjAwI1NpbG9zIzMwLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE1LjAyLjAwI0dyZWVuaG91c2VzIzMwLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE2LjAwLjAwI1ByZWZhYnJpY2F0ZWQgcmVzaWRlbnRpYWwgc3RydWN0dXJlcyMzMC4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNi4wMS4wMCNIb3VzZXMjMzAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjAuMTYuMDIuMDAjTW9iaWxlIGhvbWVzIzMwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE2LjAzLjAwI0NhYmlucyMzMC4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNi4wNC4wMCNHYXJhZ2VzIzMwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE2LjA1LjAwI0dhemVibyMzMC4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNy4wMC4wMCNQcmVmYWJyaWNhdGVkIGNvbW1lcmNpYWwgYW5kIGluZHVzdHJpYWwgc3RydWN0dXJlcyMzMC4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNy4wMS4wMCNJbiBwbGFudCBvZmZpY2VzIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjAyLjAwI1NwcmF5IGJvb3RocyMzMC4yMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNy4wMy4wMCNTdG9yYWdlIHNoZWRzIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjA0LjAwI0NsZWFuIHJvb21zIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjA1LjAwI0d1YXJkaG91c2VzIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjA2LjAwI1BvcnRhYmxlIHRvaWxldHRlcyMzMC4yMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNy4wNy4wMCNXYXJlaG91c2VzIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjA4LjAwI0F1ZGl0b3JpdW0jMzAuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjAuMTcuMDkuMDAjQ29uc2VydmF0b3J5IzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjEwLjAwI09mZmljZSBraXRjaGVucyMzMC4yMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOC4wMC4wMCNQcmVmYWJyaWNhdGVkIGVtZXJnZW5jeSByZWxpZWYgc3RydWN0dXJlcyMzMC4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOC4wMS4wMCNTaGVsdGVycyMzMC4yMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOC4wMi4wMCNFbWVyZ2VuY3kgdGVudCBoYWxscyMzMC4yMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOC4wMy4wMCNDb250YWluZXIgdW5pdHMjMzAuMjAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjAuMTkuMDAuMDAjUHJlZmFicmljYXRlZCBtZWRpY2FsIHN0cnVjdHVyZXMjMzAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjAuMTkuMDEuMDAjTWVkaWNhbCB1bml0cyMzMC4yMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOS4wMi4wMCNMYWJvcmF0b3J5IHVuaXRzIzMwLjIwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE5LjAzLjAwI0RlbnRhbCB1bml0cyMzMC4yMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOS4wNC4wMCNTdXJnaWNhbCB1bml0cyMzMC4yMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4wMC4wMC4wMCNFbGVjdHJpY2FsIGVxdWlwbWVudCBhbmQgY29tcG9uZW50cyBhbmQgc3VwcGxpZXMjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMDAuMDAjUG93ZXIgY29udmVyc2lvbiMzMC4yMS4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNS4wMS4wMCNUcmFuc2Zvcm1lcnMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMDIuMDAjUG93ZXIgc3VwcGx5IHVuaXRzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjAzLjAwI1Bvd2VyIGRpc3RyaWJ1dGlvbiB1bml0cyAoUERVcykjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMDQuMDAjUG93ZXIgYWRhcHRlcnMgb3IgaW52ZXJ0ZXJzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjA1LjAwI0ZyZXF1ZW5jeSBjb252ZXJ0ZXJzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjA2LjAwI1NpZ25hbCBjb252ZXJ0ZXJzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjA3LjAwI1RyYW5zZHVjZXJzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjA4LjAwI1JlZ3VsYXRvcnMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMDkuMDAjTWFnbmV0aWMgY29pbHMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMTAuMDAjVW5pbnRlcnJ1cHRpYmxlIHBvd2VyIHN1cHBsaWVzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjExLjAwI1NvbGVub2lkcyMzMC4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNS4xMi4wMCNDaG9rZXMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMTMuMDAjRWxlY3RyaWMgcm90YXJ5IGNvbnZlcnRlcnMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMTQuMDAjQ2FwYWNpdG9yIGJhbmtzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjE1LjAwI1JlYWN0b3JzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE2LjAwLjAwI0NvbmR1aXRzIGFuZCByYWNld2F5cyMzMC4yMS4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNi4wMS4wMCNDYWJsZSB0cmF5cyMzMC4yMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNi4wMi4wMCNFbGVjdHJpY2FsIGNvbmR1aXQjMzAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTYuMDMuMDAjRWxlY3RyaWNhbCByYWNld2F5cyMzMC4yMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNi4wNC4wMCNXaXJpbmcgZHVjdHMjMzAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTYuMDUuMDAjV2lyZXdheXMjMzAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTYuMDYuMDAjV2lyaW5nIHRyb3VnaHMjMzAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDAuMDAjRWxlY3RyaWNhbCBib3hlcyBhbmQgZW5jbG9zdXJlcyBhbmQgZml0dGluZ3MjMzAuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDEuMDAjRWxlY3RyaWNhbCBib3hlcyMzMC4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNy4wMi4wMCNFbGVjdHJpY2FsIGJveCBjb3ZlcnMjMzAuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDMuMDAjV2VhdGhlcnByb29mIGJveGVzIzMwLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE3LjA0LjAwI1N3aXRjaCBib3hlcyMzMC4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNy4wNS4wMCNGbG9vciBib3hlcyMzMC4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNy4wNi4wMCNPdXRsZXQgYm94ZXMjMzAuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDcuMDAjU3BlY2lhbHR5IGVsZWN0cmljYWwgYm94ZXMjMzAuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDguMDAjVXRpbGl0eSBib3hlcyMzMC4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNy4wOS4wMCNFbGVjdHJpY2FsIGZpdHRpbmdzIzMwLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE3LjEwLjAwI0VsZWN0cmljYWwgYnVzaGluZ3MjMzAuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMTEuMDAjQ2VpbGluZyBmbGFuZ2VzIzMwLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjAwLjAwI0x1Z3MgY29ubmVjdG9ycyBhbmQgdGVybWluYWxzIzMwLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjAxLjAwI0VsZWN0cmljYWwgdGVybWluYWxzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjAyLjAwI0VsZWN0cmljYWwgcGx1Z3MjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMDMuMDAjVHdpc3QgbG9jayBwbHVncyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4wNC4wMCNFbGVjdHJpY2FsIHNsZWV2ZXMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMDUuMDAjQ2FibGUgb3Igd2lyZSBsdWdzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjA2LjAwI0VsZWN0cmljYWwgcmVjZXB0YWNsZXMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMDcuMDAjVGVybWluYWwgc3RyaXBzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjA4LjAwI01lY2hhbmljYWwgY29ubmVjdG9ycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4wOS4wMCNSaW5nIG9yIGZsYWcgdGVybWluYWxzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjEwLjAwI1dpcmUgY29ubmVjdG9ycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4xMS4wMCNUZXJtaW5hbCBibG9ja3MjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTIuMDAjRnVzZSBibG9ja3MjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTMuMDAjQmFja3NoZWxsIGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTQuMDAjQ2lyY3VsYXIgY29ubmVjdG9ycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4xNS4wMCNDb2F4aWFsIGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTYuMDAjRmxhdCBjb25uZWN0b3JzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjE3LjAwI0VsZWN0cm9uaWMgY29ubmVjdG9yIGNhcHMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTguMDAjUmFkaW8gZnJlcXVlbmN5IChSRikgY29ubmVjdG9ycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4xOS4wMCNFbGVjdHJpY2FsIG1ldGFsbGljIHR1YmluZyAoRU1UKSBjb25uZWN0b3JzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjIwLjAwI0NvbXByZXNzaW9uIGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjEuMDAjU2V0IHNjcmV3IGNvdXBsaW5ncyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4yMi4wMCNGbGV4IGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjMuMDAjTGlxdWlkIHRpZ2h0IGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjQuMDAjQ29ubmVjdG9yIGFzc2VtYmxpZXMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjUuMDAjTWVjaGFuaWNhbCBjb3VwbGluZ3MjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjYuMDAjU3ByaW5nIGphdyBjb25uZWN0b3JzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjI3LjAwI1Rlcm1pbmFsIGJsb2NrIGNvdmVycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4yOC4wMCNUZXJtaW5hbCBibG9jayBzZXBhcmF0b3IjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjkuMDAjSnVtcGVyIGJhciMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4zMC4wMCNXaXJpbmcgdGFwcyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4zMS4wMCNFbGVjdHJpY2FsIHRhcHMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMzIuMDAjRmliZXIgb3B0aWMgY29ubmVjdG9yIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjAwLjAwI1N3aXRjaGVzIGFuZCBjb250cm9scyBhbmQgcmVsYXlzIzMwLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjAxLjAwI1NhZmV0eSBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4wMi4wMCNEaW1tZXIgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMDMuMDAjRHJ1bSBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4wNC4wMCNUaW1lIHN3aXRjaGVzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjA1LjAwI1NuYXAgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMDYuMDAjTWVjaGFuaWNhbCBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4wNy4wMCNQcmVzc3VyZSBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4wOC4wMCNUb2dnbGUgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMDkuMDAjU2xpZGUgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMTAuMDAjTGltaXQgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMTEuMDAjQ29udHJvbGxlciBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xMi4wMCNWYXJpYWJsZSBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xMy4wMCNQdXNoIGJ1dHRvbiBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xNC4wMCNSb3Rhcnkgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMTUuMDAjUG93ZXIgcmVsYXlzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjE2LjAwI0dlbmVyYWwgcHVycG9zZSByZWxheXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMTcuMDAjU29ja2V0IHJlbGF5cyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xOC4wMCNBbHRlcm5hdGluZyB2b2x0YWdlIHJlbGF5cyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xOS4wMCNNZXJjdXJ5IHJlbGF5cyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4yMC4wMCNUaW1lIHJlbGF5cyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4yMS4wMCNPdmVybG9hZCByZWxheXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMjIuMDAjTW90b3Igc3RhcnRlciBjb250cm9scyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4yMy4wMCNFbGVjdHJpY2FsIGNvbnRhY3RzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjI0LjAwI1RpbWVyIGNvbnRyb2xzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjI1LjAwI1Bob3RvY29udHJvbHMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMjYuMDAjTm9uIGZ1c2libGUgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMjcuMDAjUmFkaW8gZnJlcXVlbmN5IChSRikgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMjguMDAjUHJveGltaXR5IHN3aXRjaGVzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjI5LjAwI0VuY29kZXJzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjMwLjAwI1Bob3RvZWxlY3RyaWMgc2Vuc29ycyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4zMS4wMCNDb250YWN0b3JzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjAwLjAwI0NpcmN1aXQgcHJvdGVjdGlvbiBkZXZpY2VzIGFuZCBhY2Nlc3NvcmllcyMzMC4yMS4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMC4wMS4wMCNDaXJjdWl0IGJyZWFrZXJzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjAyLjAwI01hZ25ldGljIGNpcmN1aXQgYnJlYWtlcnMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjAuMDMuMDAjTWluaWF0dXJlIGNpcmN1aXQgYnJlYWtlcnMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjAuMDQuMDAjVGltZSBkZWxheSBmdXNlcyMzMC4yMS4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMC4wNS4wMCNQbHVnIGZ1c2VzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjA2LjAwI0NhcnRyaWRnZSBmdXNlcyMzMC4yMS4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMC4wNy4wMCNHbGFzcyBib2R5IGZ1c2VzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjA4LjAwI0NsYXNzIHR5cGUgZnVzZXMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjAuMDkuMDAjTWlkZ2V0IGZ1c2VzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjEwLjAwI1N1cmdlIHN1cHByZXNzZXJzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjExLjAwI0NlcmFtaWMgZnVzZXMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjAuMTIuMDAjQmxhZGUgZnVzZXMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDAuMDAjRWxlY3RyaWNhbCBoYXJkd2FyZSBhbmQgc3VwcGxpZXMjMzAuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDEuMDAjRWxlY3RyaWNhbCBoYW5nZXJzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjAyLjAwI0NhYmxlIGNsaXBzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjAzLjAwI0NhYmxlIHRpZXMjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDQuMDAjV2FsbHBsYXRlcyMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMS4wNS4wMCNTd2l0Y2hwbGF0ZXMjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDYuMDAjQ2FibGUgY2xhbXBzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjA3LjAwI1RyYW5zZm9ybWVyIGJ1c2hpbmdzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjA4LjAwI0hhcm5lc3MgYm9hcmQgbmFpbHMjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDkuMDAjRGluIFJhaWwjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTAuMDAjSGFuZGxlIHRpZSMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMS4xMS4wMCNFbGVjdHJpY2FsIHJlY2VwdGFjbGUgbXVsdGlwbGllcnMjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTIuMDAjVHViaW5ncyMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMS4xMy4wMCNFbmQgY2FwcyMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMS4xNC4wMCNTcGlyYWwgd3JhcHBpbmcjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTUuMDAjR3JvbW1ldCBlZGdpbmcjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTYuMDAjQ29ycnVnYXRlZCBsb29tIHR1YmVzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjE3LjAwI0V4cGFuZGFibGUgYnJhaWRlZCBzbGVldmUjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTguMDAjQ2FibGUgdGllIG1vdW50cyMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4wMC4wMC4wMCNQZXJtYW5lbnQgc3RydWN0dXJlcyMzMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4xMC4wMC4wMCNDb21tZXJjaWFsIGFuZCBlbnRlcnRhaW5tZW50IHN0cnVjdHVyZXMjMzAuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMDEuMDAjU2hvcHBpbmcgbWFsbHMjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMDIuMDAjUGFya2luZyBzdHJ1Y3R1cmVzIzMwLjIyLjEwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjEwLjAzLjAwI0NhZmV0ZXJpYSMzMC4yMi4xMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4xMC4wNC4wMCNTaG9wIGJ1aWxkaW5ncyMzMC4yMi4xMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4xMC4wNS4wMCNTaG9wcGluZyBjZW50ZXIjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMDYuMDAjQ2FudGVlbiMzMC4yMi4xMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4xMC4wNy4wMCNUaGVhdGVyIzMwLjIyLjEwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjEwLjA4LjAwI0F1ZGl0b3JpdW0jMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMDkuMDAjTWFya2V0IzMwLjIyLjEwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjEwLjEwLjAwI0NoaWxkcmVucyBwbGF5IGFyZWEjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMTEuMDAjWm9vIzMwLjIyLjEwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjEwLjEyLjAwI0dhcmRlbnMjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMTMuMDAjUGFya3MjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMTQuMDAjV2F0ZXJzaWRlIGxlaXN1cmUgZmFjaWxpdGllcyMzMC4yMi4xMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4wMC4wMCNUcmFuc3BvcnQgc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4wMS4wMCNTdGVlbCBicmlkZ2VzIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjAyLjAwI0RyeSBkb2NrIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjAzLjAwI0J1cyBzdGF0aW9uIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjA0LjAwI0J1cyBnYXJhZ2UjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMDUuMDAjU2VydmljZSBhcmVhIGJ1aWxkaW5nIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjA2LjAwI1JhaWx3YXkgc3RhdGlvbiMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4wNy4wMCNSYWlsd2F5IGRlcG90IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjA4LjAwI1VuZGVyZ3JvdW5kIHJhaWx3YXkgc3RhdGlvbiMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4wOS4wMCNSYWlsIHRlcm1pbmFsIGJ1aWxkaW5nIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjEwLjAwI1RyYW13YXkgZGVwb3QjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMTEuMDAjVHJhbXdheSBwbGF0Zm9ybXMjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMTIuMDAjQWlycG9ydCBidWlsZGluZ3MjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMTMuMDAjQWlycG9ydCBjb250cm9sIHRvd2VyIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjE0LjAwI0FpcmZpZWxkIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjE1LjAwI1J1bndheSMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4xNi4wMCNRdWF5IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjE3LjAwI1BpZXIjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMTguMDAjRG9jayMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4xOS4wMCNXaGFyZiMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4yMC4wMCNNYXJpbmEjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMjEuMDAjWWFjaHQgaGFyYm9yIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjIyLjAwI0JyZWFrd2F0ZXIjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMjMuMDAjU2Vhd2FsbCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4yNC4wMCNGZXJyeSB0ZXJtaW5hbCBidWlsZGluZyMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4yNS4wMCNSbyBybyB0ZXJtaW5hbCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4yNi4wMCNMaWdodGhvdXNlIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjI3LjAwI1JvYWQgYnJpZGdlIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjI4LjAwI1JhaWx3YXkgYnJpZGdlIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjI5LjAwI0Zvb3RicmlkZ2UjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMzAuMDAjUm9hZCB2aWFkdWN0IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjMxLjAwI1JhaWx3YXkgdmlhZHVjdCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4zMi4wMCNVbmRlcnBhc3MjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMzMuMDAjT3ZlcnBhc3MjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMzQuMDAjU3Vid2F5IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM1LjAwI0N1bHZlcnRzIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM2LjAwI1JvYWQgdHVubmVsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM3LjAwI1JhaWx3YXkgdHVubmVsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM4LjAwI1BlZGVzdHJpYW4gdHVubmVsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM5LjAwI0NhbmFsIHR1bm5lbCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40MC4wMCNVbmRlciByaXZlciB0dW5uZWwjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNDEuMDAjVW5kZXJzZWEgdHVubmVsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjQyLjAwI0hpZ2h3YXlzIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjQzLjAwI0Nyb3Nzcm9hZCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40NC4wMCNSaW5nIHJvYWQjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNDUuMDAjVHJ1bmsgcm9hZCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40Ni4wMCNTZWNvbmRhcnkgcm9hZCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40Ny4wMCNBY2Nlc3Mgcm9hZCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40OC4wMCNTbGlwIHJvYWQjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNDkuMDAjRHVhbCBjYXJyaWFnZXdheSMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41MC4wMCNTaW5nbGUgY2FycmlhZ2V3YXkjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNTEuMDAjUm9hZCBqdW5jdGlvbiMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41Mi4wMCNQZWRlc3RyaWFuIHdheXMjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNTMuMDAjUGVkZXN0cmlhbiBvdmVycGFzcyMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41NC4wMCNGb290cGF0aCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41NS4wMCNDeWNsZSBwYXRoIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjU2LjAwI1BpcGVsaW5lIGNhcnJ5aW5nIGJyaWRnZSMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41Ny4wMCNQaXBlbGluZXMjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNTguMDAjUHVtcGluZyBzdGF0aW9uIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjU5LjAwI1Nld2FnZSBwdW1waW5nIHN0YXRpb25zIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjYwLjAwI1Nld2FnZSBvdXRmYWxsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjYxLjAwI1BhcmtpbmcgbG90IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjYyLjAwI1Bhcmtpbmcgc3RydWN0dXJlcyMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC42My4wMCNNb3RvcndheSBzZXJ2aWNlIGFyZWEjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMDAuMDAjUHVibGljIHN0cnVjdHVyZXMjMzAuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMDEuMDAjUG9zdCBvZmZpY2UjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMDIuMDAjQmFuayMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4wMy4wMCNQb2xpY2Ugc3RhdGlvbiMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4wNC4wMCNDb3VydCBidWlsZGluZyMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4wNS4wMCNQcmlzb24gYnVpbGRpbmcjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMDYuMDAjRmlyZSBzdGF0aW9uIzMwLjIyLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIxLjA3LjAwI0FtYnVsYW5jZSBzdGF0aW9uIzMwLjIyLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIxLjA4LjAwI01vdW50YWluIHJlc2N1ZSBidWlsZGluZyMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4wOS4wMCNMaWZlYm9hdCBzdGF0aW9uIzMwLjIyLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIxLjEwLjAwI0NvYXN0Z3VhcmQgYnVpbGRpbmcjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTEuMDAjUmVzY3VlIHNlcnZpY2Ugc3RhdGlvbiMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4xMi4wMCNDaXZpYyBjZW50ZXIjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTMuMDAjQ3JlbWF0b3JpdW0jMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTQuMDAjQXJ0IGdhbGxlcnkjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTUuMDAjUHJlaGlzdG9yaWMgbW9udW1lbnQjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTYuMDAjVGlja2V0IG9mZmljZXMjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjIuMDAuMDAjVXRpbGl0aWVzIHN0cnVjdHVyZXMjMzAuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjIuMDEuMDAjUmFkYXIgc3RhdGlvbiMzMC4yMi4yMi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMi4wMi4wMCNTdWJzdGF0aW9uIzMwLjIyLjIyLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIyLjAzLjAwI051Y2xlYXIgcG93ZXIgc3RhdGlvbiMzMC4yMi4yMi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMi4wNC4wMCNXYXRlciB0b3dlciMzMC4yMi4yMi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMi4wNS4wMCNXZWxscyMzMC4yMi4yMi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMi4wNi4wMCNNb2JpbGUgdGVsZXBob25lIGJhc2Ugc3RhdGlvbnMjMzAuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjIuMDcuMDAjRGFtIzMwLjIyLjIyLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIyLjA4LjAwI09pbCBvciBnYXMgcGxhdGZvcm1zIzMwLjIyLjIyLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIzLjAwLjAwI0VkdWNhdGlvbmFsIGFuZCByZXNlYXJjaCBzdHJ1Y3R1cmVzIzMwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIzLjAxLjAwI1NjaG9vbHMjMzAuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjMuMDIuMDAjUG9seXRlY2huaWMjMzAuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjMuMDMuMDAjVm9jYXRpb25hbCBjb2xsZWdlIzMwLjIyLjIzLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIzLjA0LjAwI0xlY3R1cmUgdGhlYXRlciMzMC4yMi4yMy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMy4wNS4wMCNMaWJyYXJ5IzMwLjIyLjIzLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIzLjA2LjAwI0xhbmd1YWdlIGxhYm9yYXRvcnkjMzAuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjMuMDcuMDAjTGFib3JhdG9yeSBidWlsZGluZyMzMC4yMi4yMy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMy4wOC4wMCNNZXRlb3JvbG9naWNhbCBzdGF0aW9ucyMzMC4yMi4yMy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMy4wOS4wMCNSZXNlYXJjaCBvciB0ZXN0aW5nIGZhY2lsaXRpZXMjMzAuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjQuMDAuMDAjSG9zcGl0YWwgc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNC4wMS4wMCNDbGluaWMjMzAuMjIuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjQuMDIuMDAjTnVyc2luZyBob21lIzMwLjIyLjI0LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI0LjAzLjAwI09wZXJhdGluZyB0aGVhdGVyIzMwLjIyLjI0LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI0LjA0LjAwI0ludGVuc2l2ZSBjYXJlIHVuaXQjMzAuMjIuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjQuMDUuMDAjRGlhZ25vc3RpYyBzY3JlZW5pbmcgcm9vbSMzMC4yMi4yNC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNC4wNi4wMCNTY3JlZW5pbmcgcm9vbXMjMzAuMjIuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjQuMDcuMDAjRmx1b3Jvc2NvcHkgcm9vbSMzMC4yMi4yNC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNC4wOC4wMCNQYXRob2xvZ3kgcm9vbSMzMC4yMi4yNC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNC4wOS4wMCNDYXRoZXRlciByb29tIzMwLjIyLjI0LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI1LjAwLjAwI0FjY29tbW9kYXRpb24gc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wMS4wMCNSZXNpZGVudGlhbCBob21lcyMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wMi4wMCNGbGF0cyMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wMy4wMCNDaGlsZHJlbnMgaG9tZSMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wNC4wMCNEYXljYXJlIGNlbnRlciMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wNS4wMCNSZXRpcmVtZW50IGhvbWUjMzAuMjIuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjUuMDYuMDAjT2xkIHBlb3BsZXMgaG9tZSMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wNy4wMCNIb3N0ZWwjMzAuMjIuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjYuMDAuMDAjU3BvcnRzIGFuZCBoZWFsdGggc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNi4wMS4wMCNTdGFkaXVtIzMwLjIyLjI2LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI2LjAyLjAwI1Nwb3J0cyBncm91bmQjMzAuMjIuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjYuMDMuMDAjUnVubmluZyB0cmFjayMzMC4yMi4yNi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNi4wNC4wMCNTcG9ydHMgaGFsbCMzMC4yMi4yNi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNi4wNS4wMCNTcGEjMzAuMjIuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjYuMDYuMDAjR3ltbmFzaXVtIzMwLjIyLjI2LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI2LjA3LjAwI1N3aW1taW5nIHBvb2wjMzAuMjIuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjYuMDguMDAjV2F0ZXIgc3BvcnRzIGZhY2lsaXRpZXMjMzAuMjIuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjcuMDAuMDAjSW5kdXN0cmlhbCBzdHJ1Y3R1cmVzIzMwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjI3LjAxLjAwI1dvcmtzaG9wcyMzMC4yMi4yNy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNy4wMi4wMCNDb2xkIHN0b3JhZ2UgaW5zdGFsbGF0aW9ucyMzMC4yMi4yNy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNy4wMy4wMCNXYXJlaG91c2Ugc3RvcmVzIzMwLjIyLjI3LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI4LjAwLjAwI0FncmljdWx0dXJhbCBhbmQgZmFybWluZyBhbmQgZmlzaGluZyBzdHJ1Y3R1cmVzIzMwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjI4LjAxLjAwI0Jhcm4jMzAuMjIuMjguMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjguMDIuMDAjQ293c2hlZHMjMzAuMjIuMjguMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjguMDMuMDAjSXJyaWdhdGlvbiBjaGFubmVsIzMwLjIyLjI4LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI5LjAwLjAwI0RlZmVuc2Ugc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yOS4wMS4wMCNNaWxpdGFyeSBidW5rZXIjMzAuMjIuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjkuMDIuMDAjTWlsaXRhcnkgc2hlbHRlciMzMC4yMi4yOS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yOS4wMy4wMCNCYXJyYWNrcyMzMC4yMi4yOS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yOS4wNC4wMCNNaWxpdGFyeSBtZXNzIzMwLjIyLjI5LjAwLjAwCi11bnNwc2M3IzMwLjIyLjMwLjAwLjAwI1JlbGlnaW91cyBzdHJ1Y3R1cmVzIzMwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjMwLjAxLjAwI0NodXJjaGVzIzMwLjIyLjMwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjMwLjAyLjAwI1RlbXBsZXMjMzAuMjIuMzAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMzAuMDMuMDAjTW9zcXVlcyMzMC4yMi4zMC4wMC4wMAotdW5zcHNjNyMzMS4wMC4wMC4wMC4wMCNNYW51ZmFjdHVyaW5nIENvbXBvbmVudHMgYW5kIFN1cHBsaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjAwLjAwLjAwI0Nhc3RpbmdzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjE1LjAwLjAwI0RpZSBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4wMS4wMCNBbHVtaW51bSBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDIuMDAjRmVycm91cyBhbGxveSBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDMuMDAjSXJvbiBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDQuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZGllIGNhc3RpbmdzIzMxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE1LjA1LjAwI1N0YWlubGVzcyBzdGVlbCBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDYuMDAjU3RlZWwgZGllIGNhc3RpbmdzIzMxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE1LjA3LjAwI01hZ25lc2l1bSBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDguMDAjWmluYyBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDkuMDAjVGluIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4xMC4wMCNUaXRhbml1bSBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMTEuMDAjQmVyeWxsaXVtIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4xMi4wMCNQcmVjaW91cyBtZXRhbCBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMTMuMDAjQ29wcGVyIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4xNC4wMCNMZWFkIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4xNS4wMCNCcmFzcyBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMTYuMDAjQnJvbnplIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4wMC4wMCNTYW5kIGNhc3RpbmdzIzMxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDIuMDAjRmVycm91cyBhbGxveSBzYW5kIGNhc3RpbmdzIzMxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjAzLjAwI1N0ZWVsIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDUuMDAjSXJvbiBzYW5kIGNhc3RpbmdzIzMxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjA2LjAwI0FsdW1pbnVtIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDcuMDAjTWFnbmVzaXVtIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDguMDAjVGl0YW5pdW0gc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4wOS4wMCNCZXJ5bGxpdW0gc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4xMC4wMCNDb3BwZXIgc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4xMS4wMCNCcmFzcyBzYW5kIGNhc3RpbmdzIzMxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjEyLjAwI0Jyb256ZSBzYW5kIGNhc3RpbmdzIzMxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjEzLjAwI1ppbmMgc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4xNC4wMCNUaW4gc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4xNS4wMCNMZWFkIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMTYuMDAjUHJlY2lvdXMgbWV0YWwgc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wMC4wMCNQZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wMS4wMCNOb24gZmVycm91cyBhbGxveSBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wMi4wMCNGZXJyb3VzIGFsbG95IHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjAzLjAwI1N0ZWVsIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjA0LjAwI1N0YWlubGVzcyBzdGVlbCBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wNS4wMCNJcm9uIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjA2LjAwI0FsdW1pbnVtIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjA3LjAwI01hZ25lc2l1bSBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wOC4wMCNUaXRhbml1bSBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wOS4wMCNCZXJ5bGxpdW0gcGVybWFuZW50IG1vbGQgY2FzdGluZ3MjMzEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTcuMTAuMDAjQ29wcGVyIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjExLjAwI0JyYXNzIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjEyLjAwI0Jyb256ZSBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4xMy4wMCNaaW5jIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjE0LjAwI1RpbiBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4xNS4wMCNMZWFkIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjE2LjAwI1ByZWNpb3VzIG1ldGFsIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjAwLjAwI1NoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wMi4wMCNGZXJyb3VzIGFsbG95IHNoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMDMuMDAjU3RlZWwgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wNS4wMCNJcm9uIHNoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMDYuMDAjQWx1bWludW0gc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wNy4wMCNNYWduZXNpdW0gc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wOC4wMCNUaXRhbml1bSBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjA5LjAwI0JlcnlsbGl1bSBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjEwLjAwI0NvcHBlciBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjExLjAwI0JyYXNzIHNoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMTIuMDAjQnJvbnplIHNoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMTMuMDAjWmluYyBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjE0LjAwI1RpbiBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjE1LjAwI0xlYWQgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4xNi4wMCNQcmVjaW91cyBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE5LjAwLjAwI0ludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wMi4wMCNGZXJyb3VzIGFsbG95IGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMDMuMDAjU3RlZWwgaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wNS4wMCNJcm9uIGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMDYuMDAjQWx1bWludW0gaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wNy4wMCNNYWduZXNpdW0gaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wOC4wMCNaaW5jIGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMDkuMDAjVGluIGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMTAuMDAjTGVhZCBpbnZlc3RtZW50IGNhc3RpbmdzIzMxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE5LjExLjAwI1ByZWNpb3VzIG1ldGFsIGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMTIuMDAjVGl0YW5pdW0gaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wMC4wMCNDZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wMS4wMCNOb24gZmVycm91cyBhbGxveSBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wMi4wMCNGZXJyb3VzIGFsbG95IGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjAzLjAwI1N0ZWVsIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wNS4wMCNJcm9uIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjA2LjAwI0FsdW1pbnVtIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjA3LjAwI01hZ25lc2l1bSBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wOC4wMCNUaXRhbml1bSBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wOS4wMCNCZXJ5bGxpdW0gY2VudHJpZnVnYWwgY2FzdGluZ3MjMzEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjAuMTAuMDAjQ29wcGVyIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjExLjAwI0JyYXNzIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjEyLjAwI0Jyb256ZSBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4xMy4wMCNaaW5jIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjE0LjAwI1RpbiBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4xNS4wMCNMZWFkIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjE2LjAwI1ByZWNpb3VzIG1ldGFsIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjAwLjAwI0NlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMS4wMS4wMCNOb24gZmVycm91cyBhbGxveSBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDIuMDAjRmVycm91cyBhbGxveSBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDMuMDAjU3RlZWwgY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDUuMDAjSXJvbiBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDYuMDAjQWx1bWludW0gY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjA3LjAwI01hZ25lc2l1bSBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDguMDAjVGl0YW5pdW0gY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjA5LjAwI0JlcnlsbGl1bSBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMTAuMDAjQ29wcGVyIGNlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMS4xMS4wMCNCcmFzcyBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMTIuMDAjQnJvbnplIGNlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMS4xMy4wMCNaaW5jIGNlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMS4xNC4wMCNUaW4gY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjE1LjAwI0xlYWQgY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjE2LjAwI1ByZWNpb3VzIG1ldGFsIGNlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4wMC4wMCNHcmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMDIuMDAjRmVycnJvdXMgYWxsb3kgZ3JhcGhpdGUgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4wMy4wMCNTdGVlbCBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjA1LjAwI0lyb24gZ3JhcGhpdGUgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4wNi4wMCNBbHVtaW51bSBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjA3LjAwI01hZ25lc2l1bSBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjA4LjAwI1RpdGFuaXVtIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMDkuMDAjQmVyeWxsaXVtIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMTAuMDAjQ29wcGVyIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMTEuMDAjQnJhc3MgZ3JhcGhpdGUgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4xMi4wMCNCcm9uemUgZ3JhcGhpdGUgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4xMy4wMCNaaW5jIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMTQuMDAjVGluIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMTUuMDAjTGVhZCBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjE2LjAwI1ByZWNpb3VzIG1ldGFsIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMDAuMDAjUGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIzLjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wMi4wMCNGZXJyb3VzIGFsbG95IHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wMy4wMCNTdGVlbCBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wNS4wMCNJcm9uIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wNi4wMCNBbHVtaW51bSBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMDcuMDAjTWFnbmVzaXVtIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wOC4wMCNUaXRhbml1bSBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMDkuMDAjQmVyeWxsaXVtIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4xMC4wMCNDb3BwZXIgcGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIzLjExLjAwI0JyYXNzIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4xMi4wMCNCcm9uemUgcGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIzLjEzLjAwI1ppbmMgcGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIzLjE0LjAwI1RpbiBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMTUuMDAjTGVhZCBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMTYuMDAjUHJlY2lvdXMgbWV0YWwgcGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjAwLjAwI1YgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yNC4wMS4wMCNOb24gZmVycm91cyBhbGxveSB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDIuMDAjRmVycm91cyBhbGxveSB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDMuMDAjU3RlZWwgdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjA0LjAwI1N0YWlubGVzcyBzdGVlbCB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDUuMDAjSXJvbiB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDYuMDAjQWx1bWludW0gdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjA3LjAwI01hZ25lc2l1bSB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDguMDAjVGl0YW5pdW0gdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjA5LjAwI0JlcnlsbGl1bSB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMTAuMDAjQ29wcGVyIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yNC4xMS4wMCNCcmFzcyB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMTIuMDAjQnJvbnplIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yNC4xMy4wMCNaaW5jIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yNC4xNC4wMCNUaW4gdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjE1LjAwI0xlYWQgdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjE2LjAwI1ByZWNpb3VzIG1ldGFsIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMS4xMS4wMC4wMC4wMCNFeHRydXNpb25zIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjAwLjAwI1Byb2ZpbGUgZXh0cnVzaW9ucyMzMS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNS4wMS4wMCNBbHVtaW51bSBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMDIuMDAjQmVyeWxsaXVtIHByb2ZpbGUgZXh0cnVzaW9ucyMzMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNS4wMy4wMCNCcmFzcyBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMDQuMDAjQnJvbnplIHByb2ZpbGUgZXh0cnVzaW9ucyMzMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNS4wNS4wMCNDb3BwZXIgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjA2LjAwI0ZlcnJvdXMgYWxsb3kgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjA3LjAwI0xlYWQgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjA4LjAwI01hZ25lc2l1bSBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMDkuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjEwLjAwI1BsYXN0aWMgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjExLjAwI1ByZWNpb3VzIG1ldGFsIHByb2ZpbGUgZXh0cnVzaW9ucyMzMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNS4xMi4wMCNSdWJiZXIgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjEzLjAwI1N0YWlubGVzcyBzdGVlbCBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMTQuMDAjU3RlZWwgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjE1LjAwI1RpbiBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMTYuMDAjVGl0YW5pdW0gcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjE3LjAwI1ppbmMgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjAwLjAwI0ltcGFjdCBleHRydXNpb25zIzMxLjExLjAwLjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjAxLjAwI0FsdW1pbnVtIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjAyLjAwI0JlcnlsbGl1bSBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4wMy4wMCNCcmFzcyBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4wNC4wMCNCcm9uemUgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMDUuMDAjQ29wcGVyIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjA2LjAwI0ZlcnJvdXMgYWxsb3kgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMDcuMDAjTGVhZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4wOC4wMCNNYWduZXNpdW0gaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMDkuMDAjTm9uIGZlcnJvdXMgYWxsb3kgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMTAuMDAjUGxhc3RpYyBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4xMS4wMCNQcmVjaW91cyBtZXRhbCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4xMi4wMCNSdWJiZXIgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMTMuMDAjU3RhaW5sZXNzIHN0ZWVsIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjE0LjAwI1N0ZWVsIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjE1LjAwI1RpbiBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4xNi4wMCNUaXRhbml1bSBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4xNy4wMCNaaW5jIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjAwLjAwI0NvbGQgZXh0cnVzaW9ucyMzMS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNy4wMS4wMCNBbHVtaW51bSBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMDIuMDAjQmVyeWxsaXVtIGNvbGQgZXh0cnVzaW9ucyMzMS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNy4wMy4wMCNCcmFzcyBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMDQuMDAjQnJvbnplIGNvbGQgZXh0cnVzaW9ucyMzMS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNy4wNS4wMCNDb3BwZXIgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjA2LjAwI0ZlcnJvdXMgYWxsb3kgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjA3LjAwI0xlYWQgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjA4LjAwI01hZ25lc2l1bSBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMDkuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjEwLjAwI1BsYXN0aWMgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjExLjAwI1ByZWNpb3VzIG1ldGFsIGNvbGQgZXh0cnVzaW9ucyMzMS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNy4xMi4wMCNSdWJiZXIgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjEzLjAwI1N0YWlubGVzcyBzdGVlbCBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMTQuMDAjU3RlZWwgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjE1LjAwI1RpbiBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMTYuMDAjVGl0YW5pdW0gY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjE3LjAwI1ppbmMgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjAwLjAwLjAwI01hY2hpbmVkIGNhc3RpbmdzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjAwLjAwI01hY2hpbmVkIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4wMS4wMCNOb24gZmVycm91cyBhbGxveSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDIuMDAjRmVycm91cyBhbGxveSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDMuMDAjU3RlZWwgdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjA0LjAwI1N0YWlubGVzcyBzdGVlbCB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDUuMDAjSXJvbiB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDYuMDAjQWx1bWludW0gdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjA3LjAwI01hZ25lc2l1bSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDguMDAjVGl0YW5pdW0gdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjA5LjAwI0JlcnlsbGl1bSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMTAuMDAjQ29wcGVyIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4xMS4wMCNCcmFzcyB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMTIuMDAjQnJvbnplIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4xMy4wMCNaaW5jIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4xNC4wMCNUaW4gdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjE1LjAwI0xlYWQgdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjE2LjAwI1ByZWNpb3VzIG1ldGFsIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4xNy4wMCNDb21wb3NpdGUgdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjE4LjAwI05pY2tlbCBhbGxveSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMTkuMDAjTm9uIG1ldGFsbGljIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMS4wMC4wMCNNYWNoaW5lZCBkaWUgY2FzdGluZ3MjMzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMDEuMDAjQWx1bWludW0gZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjAyLjAwI0ZlcnJvdXMgYWxsb3kgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjAzLjAwI0lyb24gZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjA0LjAwI05vbiBmZXJyb3VzIGFsbG95IGRpZSBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMS4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjA2LjAwI1N0ZWVsIGRpZSBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMS4wNy4wMCNNYWduZXNpdW0gZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjA4LjAwI1ppbmMgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjA5LjAwI1RpbiBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTAuMDAjVGl0YW5pdW0gZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjExLjAwI0JlcnlsbGl1bSBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTIuMDAjUHJlY2lvdXMgbWV0YWwgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjEzLjAwI0NvcHBlciBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTQuMDAjTGVhZCBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTUuMDAjQnJhc3MgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjE2LjAwI0Jyb256ZSBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTcuMDAjQ29tcG9zaXRlIGRpZSBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMS4xOC4wMCNOaWNrZWwgQWxsb3kgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjE5LjAwI05vbiBtZXRhbGxpYyBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMDAuMDAjTWFjaGluZWQgc2FuZCBjYXN0aW5ncyMzMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4wMS4wMCNOb24gZmVycm91cyBhbGxveSBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjAyLjAwI0ZlcnJvdXMgYWxsb3kgc2FuZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4wMy4wMCNTdGVlbCBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjA1LjAwI0lyb24gc2FuZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4wNi4wMCNBbHVtaW51bSBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjA3LjAwI01hZ25lc2l1bSBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjA4LjAwI1RpdGFuaXVtIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMDkuMDAjQmVyeWxsaXVtIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTAuMDAjQ29wcGVyIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTEuMDAjQnJhc3Mgc2FuZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4xMi4wMCNCcm9uemUgc2FuZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4xMy4wMCNaaW5jIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTQuMDAjVGluIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTUuMDAjTGVhZCBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjE2LjAwI1ByZWNpb3VzIG1ldGFsIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTcuMDAjQ29tcG9zaXRlIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTguMDAjTmlja2VsIEFsbG95IHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTkuMDAjTm9uIG1ldGFsbGljIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDAuMDAjTWFjaGluZWQgcGVybWFuZW50IG1vbGQgY2FzdGluZ3MjMzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDIuMDAjRmVycm91cyBhbGxveSBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4wMy4wMCNTdGVlbCBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDUuMDAjSXJvbiBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4wNi4wMCNBbHVtaW51bSBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4wNy4wMCNNYWduZXNpdW0gcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDguMDAjVGl0YW5pdW0gcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDkuMDAjQmVyeWxsaXVtIHBlcm1hbmVudCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEzLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEzLjEwLjAwI0NvcHBlciBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xMS4wMCNCcmFzcyBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xMi4wMCNCcm9uemUgcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMTMuMDAjWmluYyBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xNC4wMCNUaW4gcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMTUuMDAjTGVhZCBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xNi4wMCNQcmVjaW91cyBtZXRhbCBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xNy4wMCNDb21wb3NpdGUgcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMTguMDAjTmlja2VsIGFsbG95IHBlcm1hbmVudCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEzLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEzLjE5LjAwI05vbiBtZXRhbGxpYyBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4wMC4wMCNNYWNoaW5lZCBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjAyLjAwI0ZlcnJvdXMgYWxsb3kgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjAzLjAwI1N0ZWVsIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjA1LjAwI0lyb24gcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjA2LjAwI0FsdW1pbnVtIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4wNy4wMCNNYWduZXNpdW0gcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjA4LjAwI1RpdGFuaXVtIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4wOS4wMCNCZXJ5bGxpdW0gcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjEwLjAwI0NvcHBlciBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMTEuMDAjQnJhc3MgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjEyLjAwI0Jyb256ZSBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMTMuMDAjWmluYyBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMTQuMDAjVGluIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4xNS4wMCNMZWFkIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4xNi4wMCNQcmVjaW91cyBtZXRhbCBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMTcuMDAjQ29tcG9zaXRlIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4xOC4wMCNOaWNrZWwgYWxsb3kgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjE5LjAwI05vbiBtZXRhbGxpYyBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMDAuMDAjTWFjaGluZWQgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4wMS4wMCNOb24gZmVycm91cyBhbGxveSBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjAyLjAwI0ZlcnJvdXMgYWxsb3kgc2hlbGwgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4wMy4wMCNTdGVlbCBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjA0LjAwI1N0YWlubGVzcyBzdGVlbCBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjA1LjAwI0lyb24gc2hlbGwgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4wNi4wMCNBbHVtaW51bSBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjA3LjAwI01hZ25lc2l1bSBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjA4LjAwI1RpdGFuaXVtIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMDkuMDAjQmVyeWxsaXVtIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTAuMDAjQ29wcGVyIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTEuMDAjQnJhc3Mgc2hlbGwgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4xMi4wMCNCcm9uemUgc2hlbGwgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4xMy4wMCNaaW5jIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTQuMDAjVGluIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTUuMDAjTGVhZCBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjE2LjAwI1ByZWNpb3VzIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTcuMDAjQ29tcG9zaXRlIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTguMDAjTmlja2VsIGFsbG95IHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTkuMDAjTm9uIG1ldGFsbGljIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTYuMDAuMDAjTWFjaGluZWQgaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4wMS4wMCNOb24gZmVycm91cyBhbGxveSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjAyLjAwI0ZlcnJvdXMgYWxsb3kgaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4wMy4wMCNTdGVlbCBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjA0LjAwI1N0YWlubGVzcyBzdGVlbCBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjA1LjAwI0lyb24gaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4wNi4wMCNBbHVtaW51bSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjA3LjAwI01hZ25lc2l1bSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjA4LjAwI1ppbmMgaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4wOS4wMCNUaW4gaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4xMC4wMCNMZWFkIGludmVzdG1lbnQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTYuMTEuMDAjUHJlY2lvdXMgbWV0YWwgaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4xMi4wMCNUaXRhbml1bSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjEzLjAwI0NvbXBvc2l0ZSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjE0LjAwI05pY2tlbCBhbGxveSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjE1LjAwI05vbiBtZXRhbGxpYyBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjAwLjAwI01hY2hpbmVkIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjAyLjAwI0ZlcnJvdXMgYWxsb3kgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMDMuMDAjU3RlZWwgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjA1LjAwI0lyb24gY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMDYuMDAjQWx1bWludW0gY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMDcuMDAjTWFnbmVzaXVtIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjA4LjAwI1RpdGFuaXVtIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjA5LjAwI0JlcnlsbGl1bSBjZW50cmlmdWdhbCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNy4xMC4wMCNDb3BwZXIgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTEuMDAjQnJhc3MgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTIuMDAjQnJvbnplIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjEzLjAwI1ppbmMgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTQuMDAjVGluIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjE1LjAwI0xlYWQgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTYuMDAjUHJlY2lvdXMgbWV0YWwgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTcuMDAjQ29tcG9zaXRlIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjE4LjAwI05pY2tlbCBhbGxveSBjZW50cmlmdWdhbCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNy4xOS4wMCNOb24gbWV0YWxsaWMgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMDAuMDAjTWFjaGluZWQgY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wMi4wMCNGZXJyb3VzIGFsbG95IGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wMy4wMCNTdGVlbCBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wNS4wMCNJcm9uIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wNi4wMCNBbHVtaW51bSBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMDcuMDAjTWFnbmVzaXVtIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wOC4wMCNUaXRhbml1bSBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMDkuMDAjQmVyeWxsaXVtIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4xMC4wMCNDb3BwZXIgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjExLjAwI0JyYXNzIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4xMi4wMCNCcm9uemUgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjEzLjAwI1ppbmMgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjE0LjAwI1RpbiBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMTUuMDAjTGVhZCBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMTYuMDAjUHJlY2lvdXMgbWV0YWwgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjE3LjAwI0NvbXBvc2l0ZSBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMTguMDAjTmlja2VsIGFsbG95IGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4xOS4wMCNOb24gbWV0YWxsaWMgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjAwLjAwI01hY2hpbmVkIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4wMi4wMCNGZXJycm91cyBhbGxveSBncmFwaGl0ZSBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjAzLjAwI1N0ZWVsIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDUuMDAjSXJvbiBncmFwaGl0ZSBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjA2LjAwI0FsdW1pbnVtIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDcuMDAjTWFnbmVzaXVtIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDguMDAjVGl0YW5pdW0gZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4wOS4wMCNCZXJ5bGxpdW0gZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xMC4wMCNDb3BwZXIgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xMS4wMCNCcmFzcyBncmFwaGl0ZSBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjEyLjAwI0Jyb256ZSBncmFwaGl0ZSBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjEzLjAwI1ppbmMgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xNC4wMCNUaW4gZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xNS4wMCNMZWFkIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMTYuMDAjUHJlY2lvdXMgbWV0YWwgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xNy4wMCNDb21wb3NpdGUgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xOC4wMCNOaWNrZWwgYWxsb3kgbWV0YWwgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xOS4wMCNOb24gbWV0YWxsaWMgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4wMC4wMC4wMCNGb3JnaW5ncyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wMC4wMCNPcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wMS4wMCNOb24gZmVycm91cyBhbGxveSBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wMi4wMCNGZXJyb3VzIGFsbG95IG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjAzLjAwI1N0ZWVsIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjA0LjAwI1N0YWlubGVzcyBzdGVlbCBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wNS4wMCNJcm9uIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjA2LjAwI0FsdW1pbnVtIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjA3LjAwI01hZ25lc2l1bSBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wOC4wMCNUaXRhbml1bSBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wOS4wMCNCZXJ5bGxpdW0gb3BlbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTUuMTAuMDAjQ29wcGVyIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjExLjAwI0JyYXNzIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjEyLjAwI0Jyb256ZSBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4xMy4wMCNaaW5jIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjE0LjAwI1RpbiBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4xNS4wMCNMZWFkIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjE2LjAwI1ByZWNpb3VzIG1ldGFsIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjAwLjAwI0Nsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wMi4wMCNGZXJyb3VzIGFsbG95IGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMDMuMDAjU3RlZWwgY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wNS4wMCNJcm9uIGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMDYuMDAjQWx1bWludW0gY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wNy4wMCNNYWduZXNpdW0gY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wOC4wMCNUaXRhbml1bSBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjA5LjAwI0JlcnlsbGl1bSBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjEwLjAwI0NvcHBlciBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjExLjAwI0JyYXNzIGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMTIuMDAjQnJvbnplIGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMTMuMDAjWmluYyBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjE0LjAwI1RpbiBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjE1LjAwI0xlYWQgY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4xNi4wMCNQcmVjaW91cyBtZXRhbCBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjAwLjAwI0ltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjAyLjAwI0ZlcnJvdXMgYWxsb3kgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMDMuMDAjU3RlZWwgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjA1LjAwI0lyb24gaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMDYuMDAjQWx1bWludW0gaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMDcuMDAjTWFnbmVzaXVtIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjA4LjAwI1RpdGFuaXVtIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjA5LjAwI0JlcnlsbGl1bSBpbXByZXNzaW9uIGRpZSBmb3JnaW5ncyMzMS4xMy4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNy4xMC4wMCNDb3BwZXIgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMTEuMDAjQnJhc3MgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMTIuMDAjQnJvbnplIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjEzLjAwI1ppbmMgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMTQuMDAjVGluIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjE1LjAwI0xlYWQgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMTYuMDAjUHJlY2lvdXMgbWV0YWwgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMDAuMDAjRHJvcCBmb3JnaW5ncyMzMS4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4wMS4wMCNOb24gZmVycm91cyBhbGxveSBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjAyLjAwI1ppbmMgZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4wMy4wMCNGZXJyb3VzIGFsbG95IGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMDQuMDAjVGluIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMDUuMDAjTGVhZCBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjA2LjAwI1N0ZWVsIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMDcuMDAjUHJlY2lvdXMgbWV0YWwgZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4wOC4wMCNTdGFpbmxlc3Mgc3RlZWwgZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4wOS4wMCNJcm9uIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMTAuMDAjQWx1bWludW0gZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4xMS4wMCNNYWduZXNpdW0gZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4xMi4wMCNUaXRhbml1bSBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjEzLjAwI0JlcnlsbGl1bSBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjE0LjAwI0NvcHBlciBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjE1LjAwI0JyYXNzIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMTYuMDAjQnJvbnplIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMTcuMDAjQ29sZCBzdGVlbCBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjE4LjAwI1NlbWkgZmluaXNoZWQgZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4wMC4wMCNSb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4wMS4wMCNBbHVtaW51bSByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4wMi4wMCNCZXJ5bGxpdW0gcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMDMuMDAjQnJhc3Mgcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMDQuMDAjQnJvbnplIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjA1LjAwI0NvcHBlciByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4wNi4wMCNJcm9uIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjA3LjAwI0xlYWQgcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMDguMDAjTWFnbmVzaXVtIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjA5LjAwI1ByZWNpb3VzIG1ldGFsIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjEwLjAwI1N0YWlubGVzcyBzdGVlbCByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4xMS4wMCNUaW4gcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMTIuMDAjVGl0YW5pdW0gcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMTMuMDAjWmluYyByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4xNC4wMCNOb24gZmVycm91cyBhbGxveSByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4xNS4wMCNGZXJyb3VzIGFsbG95IHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjE2LjAwI1N0ZWVsIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjIwLjAwLjAwI1Bvd2RlcmVkIG1ldGFsIGNvbXBvbmVudHMjMzEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMjAuMDEuMDAjRmVycm91cyBwb3dkZXJlZCBtZXRhbCBjb21wb25lbnRzIzMxLjEzLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEzLjIwLjAyLjAwI05vbiBmZXJyb3VzIHBvd2RlcmVkIG1ldGFsIHBhcnRzIzMxLjEzLjIwLjAwLjAwCi11bnNwc2M3IzMxLjE0LjAwLjAwLjAwI01vbGRpbmdzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjE0LjE1LjAwLjAwI0luamVjdGlvbiBtb2xkaW5ncyMzMS4xNC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNS4wMS4wMCNQbGFzdGljIGluamVjdGlvbiBtb2xkaW5ncyMzMS4xNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNS4wMi4wMCNSdWJiZXIgaW5qZWN0aW9uIG1vbGRpbmdzIzMxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE0LjE1LjAzLjAwI0dsYXNzIGluamVjdGlvbiBtb2xkaW5ncyMzMS4xNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNi4wMC4wMCNWYWN1dW0gbW9sZGluZ3MjMzEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTYuMDEuMDAjUGxhc3RpYyB2YWN1dW0gbW9sZGluZ3MjMzEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTYuMDIuMDAjUnViYmVyIHZhY3V1bSBtb2xkaW5ncyMzMS4xNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNi4wMy4wMCNHbGFzcyB2YWN1dW0gbW9sZGluZ3MjMzEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTcuMDAuMDAjQmxvdyBtb2xkaW5ncyMzMS4xNC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNy4wMS4wMCNQbGFzdGljIGJsb3cgbW9sZGluZ3MjMzEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTcuMDIuMDAjUnViYmVyIGJsb3cgbW9sZGluZ3MjMzEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTguMDAuMDAjUmVhY3Rpb24gaW5qZWN0aW9uIG1vbGRpbmdzIChSSU0pIzMxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE0LjE4LjAxLjAwI1BsYXN0aWMgcmVhY3Rpb24gaW5qZWN0aW9uIG1vbGRpbmdzIzMxLjE0LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE0LjE4LjAyLjAwI1J1YmJlciByZWFjdGlvbiBpbmplY3Rpb24gbW9sZGluZ3MjMzEuMTQuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTUuMDAuMDAuMDAjUm9wZSBhbmQgY2hhaW4gYW5kIGNhYmxlIGFuZCB3aXJlIGFuZCBzdHJhcCMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wMC4wMCNSb3BlcyMzMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wMS4wMCNDb3R0b24gcm9wZSMzMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wMi4wMCNQb2x5ZXN0ZXIgcm9wZSMzMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wMy4wMCNQb2x5cHJvcHlsZW5lIHJvcGUjMzEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTUuMDQuMDAjTnlsb24gcm9wZSMzMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wNS4wMCNXaXJlIHJvcGUjMzEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTUuMDYuMDAjSGVtcCByb3BlIzMxLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE1LjA3LjAwI1N0cmluZyBvciB0d2luZSMzMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wOC4wMCNTaXNhbCByb3BlIzMxLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE2LjAwLjAwI0NoYWlucyMzMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wMS4wMCNTYWZldHkgY2hhaW5zIzMxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE2LjAyLjAwI1NraWQgY2hhaW5zIzMxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE2LjAzLjAwI1JvbGxlciBjaGFpbnMjMzEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTYuMDQuMDAjUHJvb2YgY29pbCBjaGFpbnMjMzEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTYuMDUuMDAjU2FzaCBjaGFpbiMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wNi4wMCNKYWNrIGNoYWlucyMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wNy4wMCNDb2lsIGNoYWlucyMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wOC4wMCNCYWxsIGNoYWlucyMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wOS4wMCNDaGFpbiBsaW5rcyMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNy4wMC4wMCNNZWNoYW5pY2FsIGNhYmxlIzMxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE1LjE3LjAxLjAwI01lY2hhbmljYWwgY2FibGVzIzMxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE3LjAyLjAwI05vbiBlbGVjdHJpYyBjb250cm9sIGNhYmxlcyMzMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNy4wMy4wMCNMaWZ0aW5nIGNhYmxlcyMzMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNy4wNC4wMCNUcmFjayBjYWJsZXMjMzEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTcuMDUuMDAjTm9uIGVsZWN0cmljYWwgc3RlZWwgY2FibGVzIzMxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE3LjA2LjAwI05vbiBlbGVjdHJpY2FsIGNvcHBlciBjYWJsZXMjMzEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTcuMDcuMDAjTm9uIGVsZWN0cmljYWwgYWx1bWludW0gY2FibGVzIzMxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE4LjAwLjAwI01lY2hhbmljYWwgd2lyZSMzMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xOC4wMS4wMCNNZWNoYW5pY2FsIHdpcmUjMzEuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTguMDIuMDAjQmFyYmVkIHdpcmUjMzEuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTguMDMuMDAjUGlhbm8gc3RlZWwgd2lyZSMzMS4xNS4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xOS4wMC4wMCNTdHJhcHMjMzEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTkuMDEuMDAjTWV0YWwgc3RyYXBzIzMxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE5LjAyLjAwI0xlYXRoZXIgc3RyYXBzIzMxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE5LjAzLjAwI0ZpYmVyIHN0cmFwcyMzMS4xNS4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xOS4wNC4wMCNQbGFzdGljIHN0cmFwcyMzMS4xNS4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNS4yMC4wMC4wMCNTZWN1cml0eSB3aXJlIzMxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE1LjIwLjAxLjAwI1Jhem9yIHdpcmUjMzEuMTUuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMjAuMDIuMDAjQmFyYmVkIHdpcmUjMzEuMTUuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMjEuMDAuMDAjRWxlY3RyaWNhbCB3aXJlIzMxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE1LjIxLjAxLjAwI1dpcmUgYXNzZW1ibHkjMzEuMTUuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMDAuMDAuMDAjSGFyZHdhcmUjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDAuMDAjU2NyZXdzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjE1LjAxLjAwI0NhcCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDIuMDAjQW5jaG9yIHNjcmV3cyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNS4wMy4wMCNEcml2ZSBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDQuMDAjTWFjaGluZSBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDUuMDAjU2V0IHNjcmV3cyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNS4wNi4wMCNTaGVldCBtZXRhbCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDcuMDAjVGFwcGluZyBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDguMDAjV29vZCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDkuMDAjRHJ5d2FsbCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMTAuMDAjQ2FwdGl2ZSBzY3JldyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNS4xMS4wMCNMb2NraW5nIHNjcmV3cyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNS4xMi4wMCNUaHJlYWQgcm9sbGluZyBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMTMuMDAjRmxhdGhlYWQgc2NyZXdzIzMxLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE1LjE0LjAwI1dlbGQgc2NyZXdzIzMxLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE1LjE1LjAwI0ZsYXQgaGVhZCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMTYuMDAjVGh1bWIgc2NyZXdzIzMxLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE1LjE3LjAwI1Nob3VsZGVyIHNjcmV3cyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4wMC4wMCNCb2x0cyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4wMS4wMCNBbmNob3IgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMDIuMDAjQmxpbmQgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMDMuMDAjQ2FycmlhZ2UgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMDQuMDAjQ2xldmlzIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjA1LjAwI0N5bGluZGVyIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjA2LjAwI0Rvb3IgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMDcuMDAjRXhwYW5zaW9uIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjA4LjAwI0xhZyBib2x0cyMzMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4wOS4wMCNUb2dnbGUgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTAuMDAjRXllIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjExLjAwI0xvY2tpbmcgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTIuMDAjUGluIG9yIGNvbGxhciBib2x0cyMzMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4xMy4wMCNUZW5zaW9uIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjE0LjAwI1N0cnVjdHVyYWwgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTUuMDAjVG9ycXVlIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjE2LjAwI1UgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTcuMDAjV2luZyBib2x0cyMzMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4xOC4wMCNUaHJlYWRlZCByb2QjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTkuMDAjU3R1ZCBib2x0cyMzMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4yMC4wMCNIZXhhZ29uYWwgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMDAuMDAjTnV0cyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wMS4wMCNBbmNob3IgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wMi4wMCNCZWFyaW5nIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMDMuMDAjQmxpbmQgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wNC4wMCNCYXJyZWwgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wNS4wMCNDYXAgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wNi4wMCNDYXB0aXZlIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMDcuMDAjQ2FzdGxlIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMDguMDAjQ2hhbm5lbCBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjA5LjAwI0NsYW1waW5nIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMTAuMDAjRXhwYW5zaW9uIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMTEuMDAjRXllIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMTIuMDAjRmxhbmdlIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMTMuMDAjSG9zZSBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjE0LjAwI0luc2VydCBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjE1LjAwI1NlbGYgbG9ja2luZyBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjE2LjAwI0xvY2tudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjE3LjAwI1dpbmcgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4xOC4wMCNUb2dnbGUgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4xOS4wMCNTd2l2ZWwgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4yMC4wMCNTdG9wIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMjEuMDAjU3ByaW5nIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMjIuMDAjVW5pb24gbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4yMy4wMCNOdXRwbGF0ZSBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjI0LjAwI1ByZXNzIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMjUuMDAjQ2xpcCBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjI2LjAwI0RvbWUgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4yNy4wMCNIZXhhZ29uYWwgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4yOC4wMCNDb3VwbGluZyBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjI5LjAwI0tudXJsZWQgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wMC4wMCNXYXNoZXJzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjAxLjAwI0xvY2tpbmcgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wMi4wMCNCZXZlbCB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjAzLjAwI0JpbmRpbmcgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wNC4wMCNDdXJ2ZWQgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wNS4wMCNFbGVjdHJpY2FsIGluc3VsYXRpbmcgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wNi4wMCNGaW5pc2hpbmcgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wNy4wMCNGbGF0IHdhc2hlcnMjMzEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTguMDguMDAjT3BlbiB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjA5LjAwI1JlZHVjaW5nIHdhc2hlcnMjMzEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTguMTAuMDAjU2hpbSB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjExLjAwI1NwcmluZyB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjEyLjAwI1NxdWFyZSB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjEzLjAwI1N3aXZlbCB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjE0LjAwI1RocnVzdCB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjE1LjAwI1Nob3VsZGVyIHdhc2hlcnMjMzEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTguMTYuMDAjU3BhY2VycyBvciBzdGFuZG9mZnMjMzEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTguMTcuMDAjQ29uaWNhbCB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE5LjAwLjAwI1NwcmluZ3MjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTkuMDEuMDAjSGVsaWNhbCBzcHJpbmdzIzMxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE5LjAyLjAwI0xlYWYgc3ByaW5ncyMzMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOS4wMy4wMCNTcGlyYWwgc3ByaW5ncyMzMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOS4wNC4wMCNDb21wcmVzc2lvbiBzcHJpbmdzIzMxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE5LjA1LjAwI0RpZSBzcHJpbmdzIzMxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE5LjA2LjAwI0Rpc2sgc3ByaW5ncyMzMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOS4wNy4wMCNFeHRlbnNpb24gc3ByaW5ncyMzMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOS4wOC4wMCNUb3JzaW9uIHNwcmluZ3MjMzEuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjAuMDAuMDAjTmFpbHMjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjAuMDEuMDAjQnJhZHMjMzEuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjAuMDIuMDAjQ2FwIG5haWxzIzMxLjE2LjIwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIwLjAzLjAwI0ZpbmlzaGluZyBuYWlscyMzMS4xNi4yMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMC4wNC4wMCNNYXNvbnJ5IG5haWxzIzMxLjE2LjIwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIwLjA1LjAwI1Jvb2ZpbmcgbmFpbHMjMzEuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjAuMDYuMDAjV2lyZSBuYWlscyMzMS4xNi4yMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMC4wNy4wMCNVcGhvbHN0ZXJ5IG5haWxzIzMxLjE2LjIwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIwLjA4LjAwI0RyaXZlIHBpbnMjMzEuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjEuMDAuMDAjQW5jaG9ycyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMS4wMS4wMCNDb25jcmV0ZSBhbmNob3JzIzMxLjE2LjIxLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIxLjAyLjAwI1dlZGdlIGFuY2hvcnMjMzEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjEuMDMuMDAjV2FsbCBhbmNob3JzIzMxLjE2LjIxLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIxLjA0LjAwI1NjcmV3IGFuY2hvcnMjMzEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjEuMDUuMDAjUmVzaW4gYW5jaG9ycyMzMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMS4wNi4wMCNQaXBlIGFuY2hvcnMjMzEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjEuMDcuMDAjTmFpbCBleHBhbnNpb24gYW5jaG9ycyMzMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMS4wOC4wMCNUaWUgZG93biBhbmNob3JzIzMxLjE2LjIxLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjAwLjAwI1JpdmV0cyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMi4wMS4wMCNCbGluZCByaXZldHMjMzEuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjIuMDIuMDAjQ3Jvd25oZWFkIHJpdmV0cyMzMS4xNi4yMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMi4wMy4wMCNGbGF0IGhlYWQgcml2ZXRzIzMxLjE2LjIyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjA0LjAwI0Z1bGwgcml2ZXRzIzMxLjE2LjIyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjA1LjAwI1JhdGNoZXQgcml2ZXRzIzMxLjE2LjIyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjA2LjAwI1Rpbm5lcnMgcml2ZXRzIzMxLjE2LjIyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjA3LjAwI0NvbXByZXNzaW9uIHJpdmV0cyMzMS4xNi4yMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMi4wOC4wMCNDb29wZXJzIHJpdmV0cyMzMS4xNi4yMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMi4wOS4wMCNCdXR0b24gaGVhZCByaXZldHMjMzEuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDAuMDAjTW91bnRpbmcgaGFyZHdhcmUjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDEuMDAjTW91bnRpbmcgcHJvZmlsZXMjMzEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDMuMDAjTW91bnRpbmcgYmFycyMzMS4xNi4yMy4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMy4wNC4wMCNNb3VudGluZyBzdHJpcHMjMzEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDUuMDAjTW91bnRpbmcgY2xpcHMjMzEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDYuMDAjTW91bnRpbmcgaGFuZ2VycyMzMS4xNi4yMy4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMy4wNy4wMCNNb3VudGluZyBwbGF0ZXMjMzEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDguMDAjTW91bnRpbmcgcGFuZWxzIzMxLjE2LjIzLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIzLjA5LjAwI01vdW50aW5nIHJhY2tzIzMxLjE2LjIzLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIzLjEwLjAwI01vdW50aW5nIHN0cmFwcyMzMS4xNi4yMy4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMy4xMS4wMCNXYWxsIGJ1c2hpbmdzIzMxLjE2LjIzLjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjAwLjAwI01pc2NlbGxhbmVvdXMgZmFzdGVuZXJzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjAxLjAwI0dyb21tZXRzIzMxLjE2LjI0LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjAyLjAwI0hhc3BzIzMxLjE2LjI0LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjAzLjAwI0hpbmdlcyMzMS4xNi4yNC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNC4wNC4wMCNIYXJkd2FyZSBzdGFwbGVzIzMxLjE2LjI0LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjA1LjAwI1R1cm5idWNrbGVzIzMxLjE2LjI0LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjA2LjAwI1N0cmFwcGluZyBvciBiYW5kaW5nIGJ1Y2tsZXMjMzEuMTYuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjQuMDcuMDAjTGF0Y2gjMzEuMTYuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjQuMDguMDAjQ290dGVyIHBpbnMjMzEuMTYuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjUuMDAuMDAjQnJhY2tldHMgYW5kIGJyYWNlcyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNS4wMS4wMCNTaGVsZiBicmFja2V0cyMzMS4xNi4yNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNS4wMi4wMCNBbmdsZSBicmFja2V0cyMzMS4xNi4yNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNS4wMy4wMCNCcmFjZXMjMzEuMTYuMjUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjUuMDQuMDAjRWxlY3RyaWNhbCBmaXh0dXJlIGJyYWNrZXRzIzMxLjE2LjI1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI1LjA1LjAwI01hZ25ldGljIG1vdW50aW5nIGJyYWNrZXRzIzMxLjE2LjI1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjAwLjAwI0hvb2tzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjAxLjAwI1N3aXZlbCBob29rcyMzMS4xNi4yNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNi4wMi4wMCNTcHJpbmcgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjYuMDMuMDAjUyBob29rcyMzMS4xNi4yNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNi4wNC4wMCNTYWZldHkgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjYuMDUuMDAjTGlmdGluZyBob29rcyMzMS4xNi4yNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNi4wNi4wMCNKIGhvb2tzIzMxLjE2LjI2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjA3LjAwI0d1eSB3aXJlIGhvb2tzIzMxLjE2LjI2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjA4LjAwI0dyYWIgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjYuMDkuMDAjU2NyZXcgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjYuMTAuMDAjUGVnIGJvYXJkIGhvb2tzIzMxLjE2LjI2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjExLjAwI1NsaXAgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjcuMDAuMDAjUm9sbGluZyBoYXJkd2FyZSMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNy4wMS4wMCNDYXN0ZXJzIzMxLjE2LjI3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI3LjAyLjAwI1doZWVscyMzMS4xNi4yNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNy4wMy4wMCNTbGlkZXJzIzMxLjE2LjI3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI4LjAwLjAwI01pc2NlbGxhbmVvdXMgaGFyZHdhcmUjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjguMDEuMDAjSGFuZGxlcyBvciBrbm9icyMzMS4xNi4yOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yOC4wMi4wMCNJbnNlcnRzIzMxLjE2LjI4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI4LjAzLjAwI1NoYWNrbGVzIzMxLjE2LjI4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI4LjA0LjAwI0Rvb3Igc3RvcHMjMzEuMTYuMjguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjguMDUuMDAjQ2FibGUgdGhpbWJsZSMzMS4xNi4yOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yOC4wNi4wMCNTY3JldyBjb3ZlcnMjMzEuMTYuMjguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjguMDcuMDAjTGV2ZXJzIzMxLjE2LjI4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI4LjA4LjAwI1BhbmljIGJhcnMjMzEuMTYuMjguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjkuMDAuMDAjQ2xhbXBzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjI5LjAxLjAwI0VhciBjbGFtcHMjMzEuMTYuMjkuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjkuMDIuMDAjU3ByaW5nIGNsYW1wcyMzMS4xNi4yOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yOS4wMy4wMCNTY3JldyBjbGFtcHMjMzEuMTYuMjkuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjkuMDQuMDAjV2lyZSByb3BlIGNsYW1wcyMzMS4xNi4yOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yOS4wNS4wMCNCZWFtIGNsYW1wcyMzMS4xNi4yOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMC4wMC4wMCNDb3VwbGluZ3MjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzAuMDEuMDAjRWxhc3RvbWVyaWMgY291cGxpbmdzIzMxLjE2LjMwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMwLjAyLjAwI0dlYXIgY291cGxpbmdzIzMxLjE2LjMwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMwLjAzLjAwI01ldGFsbGljIGNvdXBsaW5ncyMzMS4xNi4zMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMC4wNC4wMCNNaW5pYXR1cmUgY291cGxpbmdzIzMxLjE2LjMwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMxLjAwLjAwI0Nvbm5lY3RvcnMjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzEuMDEuMDAjUXVpY2sgZGlzY29ubmVjdHMjMzEuMTYuMzEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzEuMDIuMDAjRmVycnVsZSMzMS4xNi4zMS4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMS4wMy4wMCNUcmFpbGVyIENvbm5lY3RvciMzMS4xNi4zMS4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMi4wMC4wMCNSZXRhaW5pbmcgaGFyZHdhcmUjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDEuMDAjU3ByaW5nIHBpbnMjMzEuMTYuMzIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDIuMDAjUmV0YWluaW5nIHJpbmdzIzMxLjE2LjMyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMyLjAzLjAwI0Rvd2VsIHBpbiMzMS4xNi4zMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMi4wNC4wMCNDb3R0ZXIgcGluIzMxLjE2LjMyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMyLjA1LjAwI1RhcGVyIHBpbnMjMzEuMTYuMzIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDYuMDAjR3Jvb3ZlZCBwaW5zIzMxLjE2LjMyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMyLjA3LjAwI1NoYWZ0IG9yIHdvb2RydWZmIGtleXMjMzEuMTYuMzIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDguMDAjS2V5c3RvY2sjMzEuMTYuMzIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDkuMDAjQmVhcmluZyBob2xkZXJzIG9yIHJldGFpbmVycyMzMS4xNi4zMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMi4xMC4wMCNSZXRhaW5pbmcgY29sbGFycyMzMS4xNi4zMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMy4wMC4wMCNTcGFjZXIjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzMuMDEuMDAjU2hpbSMzMS4xNi4zMy4wMC4wMAotdW5zcHNjNyMzMS4xNy4wMC4wMC4wMCNCZWFyaW5ncyBhbmQgYnVzaGluZ3MgYW5kIHdoZWVscyBhbmQgZ2VhcnMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDAuMDAjQmVhcmluZ3MjMzEuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDEuMDAjRmxhbmdlZCBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4wMi4wMCNSYWRpYWwgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDMuMDAjV2hlZWwgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDQuMDAjQmFsbCBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4wNS4wMCNSb2xsZXIgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDYuMDAjTGluZWFyIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjA3LjAwI1RocnVzdCBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4wOC4wMCNSb2QgZW5kIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjA5LjAwI1NsZWV2ZSBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4xMC4wMCNTcGhlcmljYWwgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMTEuMDAjUGlsbG93IGJsb2NrIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjEyLjAwI05lZWRsZSBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4xMy4wMCNIYW5nZXIgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMTQuMDAjRG9vciBjbG9zZXJzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjE1LjAwI1BsYWluIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjE2LjAwI1RhcGVyZWQgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMTcuMDAjTmVlZGxlIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjE4LjAwI0JlYXJpbmcgQ2FnZSMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4xOS4wMCNCZWFyaW5nIGJsb2NrcyBvciBob3VzaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4yMC4wMCNCZWFyaW5nIGpvdXJuYWxzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjIxLjAwI0JlYXJpbmcgcm9sbGVycyBvciBiYWxscyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNi4wMC4wMCNCdXNoaW5ncyMzMS4xNy4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNi4wMS4wMCNUcmFuc2Zvcm1lciBidXNoaW5ncyMzMS4xNy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNi4wMi4wMCNXYWxsIGJ1c2hpbmdzIzMxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE2LjAzLjAwI0RyaWxsIGJ1c2hpbmdzIzMxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE2LjA0LjAwI1BpbG90IGJ1c2hpbmdzIzMxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE2LjA1LjAwI1NoYWZ0IGJ1c2hpbmdzIzMxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjAwLjAwI0dlYXJzIzMxLjE3LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjAxLjAwI0dlYXIgYm94ZXMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMDIuMDAjUmFjayBvciBwaW5pb24gZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMDMuMDAjRGlmZmVyZW50aWFsIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjA0LjAwI0ZyaWN0aW9uIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjA1LjAwI0hlbGljYWwgZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMDYuMDAjQ29uaWNhbCBnZWFycyMzMS4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNy4wNy4wMCNTcHVyIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjA4LjAwI0JldmVsIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjA5LjAwI1JhY2sgZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMTAuMDAjUGluaW9uIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjExLjAwI1JpbmcgZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMTIuMDAjV29ybSBnZWFycyMzMS4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNy4xMy4wMCNTaWRlIEdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjE0LjAwI0hlbGljYWwgZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTguMDAuMDAjSW5kdXN0cmlhbCB3aGVlbHMjMzEuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTguMDEuMDAjQ29nIHdoZWVscyMzMS4xNy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNy4xOC4wMi4wMCNJbXBlbGxlciB3aGVlbHMjMzEuMTcuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTguMDMuMDAjRmx5d2hlZWxzIzMxLjE3LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE4LjA0LjAwI1NoZWF2ZXMjMzEuMTcuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTguMDUuMDAjV2hlZWwgYnJ1c2hlcyMzMS4xNy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNy4xOS4wMC4wMCNTcHJvY2tldHMjMzEuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTkuMDEuMDAjUm9sbGVyIGNoYWluIHNwcm9ja2V0cyMzMS4xNy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xOS4wMi4wMCNTcGxpdCBzcHJvY2tldHMjMzEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTguMDAuMDAuMDAjR2Fza2V0cyBhbmQgc2VhbHMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTUuMDAuMDAjR2Fza2V0cyMzMS4xOC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4wMS4wMCNQbGFzdGljIGdhc2tldHMjMzEuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTUuMDIuMDAjUnViYmVyIGdhc2tldHMjMzEuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTUuMDMuMDAjTWV0YWwgZ2Fza2V0cyMzMS4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4wNC4wMCNUZXh0aWxlIGdhc2tldHMjMzEuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTUuMDUuMDAjQ29yayBnYXNrZXRzIzMxLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE1LjA2LjAwI08gcmluZyBnYXNrZXRzIzMxLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE1LjA3LjAwI0VsZWN0cm9tYWduZXRpYyBpbnRlcmZlcmVuY2UgKEVNSSkgZ2Fza2V0cyMzMS4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4wOC4wMCNCb2x0ZWQgZ2Fza2V0cyMzMS4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4wOS4wMCNHYXNrZXQga2l0cyMzMS4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4xMC4wMCNTaWxpY29uZSBnYXNrZXRzIzMxLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE1LjExLjAwI0xpcXVpZCBnYXNrZXRzIzMxLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE2LjAwLjAwI1NlYWxzIzMxLjE4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE4LjE2LjAxLjAwI1BsYXN0aWMgc2VhbHMjMzEuMTguMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTYuMDIuMDAjUnViYmVyIHNlYWxzIzMxLjE4LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE2LjAzLjAwI01ldGFsbGljIHNlYWxzIzMxLjE4LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE2LjA0LjAwI1NlYWwgbWVjaGFuaWNhbCMzMS4xOC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNy4wMC4wMCNQYWNraW5ncyBhbmQgZ2xhbmRzIzMxLjE4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE4LjE3LjAxLjAwI1BhY2tpbmdzIzMxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE3LjAyLjAwI0dsYW5kcyMzMS4xOC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xOS4wMC4wMC4wMCNHcmluZGluZyBhbmQgcG9saXNoaW5nIGFuZCBzbW9vdGhpbmcgbWF0ZXJpYWxzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjAwLjAwI0FicmFzaXZlcyBhbmQgYWJyYXNpdmUgbWVkaWEjMzEuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMDEuMDAjQWJyYXNpdmUgcGFwZXJzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjAyLjAwI0J1ZmZzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjAzLjAwI0FicmFzaXZlIHdoZWVscyMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4wNC4wMCNBYnJhc2l2ZSBjbG90aCMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4wNS4wMCNBYnJhc2l2ZSBwYWRzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjA2LjAwI0FicmFzaXZlIGRpc2NzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjA3LjAwI0FicmFzaXZlIGJlbHRzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjA4LjAwI0JvcnQjMzEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMDkuMDAjQWJyYXNpdmUgcG9saXNoZXJzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjEwLjAwI0FicmFzaXZlIHN0b25lcyMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4xMS4wMCNTdGVlbCB3b29sIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjEyLjAwI1Nob3QgYmxhc3QjMzEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMTMuMDAjR2xhc3MgYmVhZCMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4xNC4wMCNUdW1ibGUgbWVkaWEjMzEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMTUuMDAjQWJyYXNpdmUgbWVzaCMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4xNi4wMCNBYnJhc2l2ZSBjYXJ0cmlkZ2Ugcm9sbHMjMzEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMTcuMDAjRW1lcnkgYm9hcmRzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE2LjAwLjAwI0FicmFzaXZlIHdoZWVscyMzMS4xOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNi4wMS4wMCNBYnJhc2l2ZSBjdWJpYyBib3Jvem9uIG5pdHJhdGUgd2hlZWxzIzMxLjE5LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE2LjAyLjAwI0FicmFzaXZlIGRpYW1vbmQgd2hlZWxzIzMxLjE5LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE2LjAzLjAwI1R1bmdzdGVuIGNhcmJpZGUgYWJyYXNpdmUgd2hlZWxzIzMxLjE5LjE2LjAwLjAwCi11bnNwc2M3IzMxLjIwLjAwLjAwLjAwI0FkaGVzaXZlcyBhbmQgc2VhbGFudHMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDAuMDAjVGFwZSMzMS4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4wMS4wMCNEdWN0IHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDIuMDAjRWxlY3RyaWNhbCBpbnN1bGF0aW5nIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDMuMDAjTWFza2luZyB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjA0LjAwI0NhcnBldCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjA1LjAwI0RvdWJsZSBzaWRlZCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjA2LjAwI0Jpc21hbGVtaWRlIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDcuMDAjRmliZXJnbGFzcyB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjA4LjAwI0dyYXBoaXRlIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDkuMDAjTnlsb24gdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4xMC4wMCNSZXNpbiBpbXByZWduYXRlZCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjExLjAwI1dpcmUgbWVzaCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjEyLjAwI1RyYW5zcGFyZW50IHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMTMuMDAjTm9uIHNraWQgc2FmZXR5IHRhcGVzIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjE0LjAwI1BvbHl0ZXRyYWZsdW9yb2V0aHlsZW5lIChQVEZFKSB0aHJlYWQgc2VhbGluZyB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjE1LjAwI1BhcGVyIHRhcGVzIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjE2LjAwI1JlZmxlY3RpdmUgdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4xNy4wMCNQYWNrYWdpbmcgdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4xOC4wMCNFbGVjdHJpY2FsbHkgY29uZHVjdGl2ZSB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjE5LjAwI1BpcGUgb3IgaG9zZSByZXBhaXIgdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4yMC4wMCNBaXNsZSBtYXJraW5nIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMjEuMDAjRm9pbCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjIyLjAwI0FkaGVzaXZlIHRyYW5zZmVyIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMjMuMDAjQ2xvdGggdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4yNC4wMCNDb2xvciBjb2RpbmcgdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4yNS4wMCNWaW55bCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjI2LjAwI01hZ25ldGljIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDAuMDAjT3RoZXIgYWRoZXNpdmVzIGFuZCBzZWFsYW50cyMzMS4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4wMS4wMCNDaGVtaWNhbCBhZGhlc2l2ZXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDIuMDAjUGFzdGVzIzMxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE2LjAzLjAwI0d1bXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDQuMDAjUnViYmVyIGNlbWVudHMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDUuMDAjUHV0dGllcyMzMS4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4wNi4wMCNDYXVsa3MjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDcuMDAjRXBveHkgYm9uZCMzMS4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4wOC4wMCNGb2FtIGFkaGVzaXZlcyMzMS4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4wOS4wMCNIb3QgbWVsdCBhZGhlc2l2ZXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMTAuMDAjR2x1ZXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMTEuMDAjRmlsbSBhZGhlc2l2ZXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMTIuMDAjVGhyZWFkIHNlYWxhbnRzIzMxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE2LjEzLjAwI1JlIHVzYWJsZSBhZGhlc2l2ZSMzMS4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4xNC4wMCNTZWFsaW5nIHdheGVzIzMxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIxLjAwLjAwLjAwI1BhaW50cyBhbmQgcHJpbWVycyBhbmQgZmluaXNoZXMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTUuMDAuMDAjUGFpbnRzIGFuZCBwcmltZXJzIzMxLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjAxLjAwI0VuYW1lbCBwYWludHMjMzEuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTUuMDIuMDAjV2F0ZXIgYmFzZWQgcGFpbnRzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjAzLjAwI1BpZ21lbnQgcGFpbnRzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjA0LjAwI0NvYXRpbmcgcGFpbnRzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjA1LjAwI09pbCBiYXNlZCBwYWludHMjMzEuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTUuMDYuMDAjTGF0ZXggcGFpbnRzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjA3LjAwI1NwcmF5IHBhaW50cyMzMS4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNS4wOC4wMCNBY3J5bGljIHBhaW50cyMzMS4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNS4wOS4wMCNFbmFtZWwgcHJpbWVycyMzMS4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNS4xMC4wMCNQb2x5dXJldGhhbmUgcHJpbWVycyMzMS4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNS4xMS4wMCNVcmV0aGFuZSBwcmltZXJzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjEyLjAwI0xhdGV4IHByaW1lcnMjMzEuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTYuMDAuMDAjUGFpbnQgYWRkaXRpdmVzIzMxLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIxLjE2LjAxLjAwI0NhbGNpbWluZXMjMzEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTYuMDIuMDAjVGV4dHVyaW5nIG1hdGVyaWFscyMzMS4yMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNi4wMy4wMCNQYWludCBkcmllcnMjMzEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTYuMDQuMDAjUGFpbnQgZXh0ZW5kZXJzIzMxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE2LjA1LjAwI0FudGkgc2xpcCBhZ2VudHMjMzEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTYuMDYuMDAjTGV2ZWxpbmcgYWdlbnRzIzMxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE2LjA3LjAwI0FudGkgZm9hbWluZyBhZ2VudHMjMzEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTcuMDAuMDAjTWlzY2VsbGFuZW91cyBmaW5pc2hlcyMzMS4yMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNy4wMS4wMCNHbGF6ZXMjMzEuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTcuMDIuMDAjTHVzdGVycyMzMS4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNy4wMy4wMCNMYWNxdWVycyMzMS4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNy4wNC4wMCNTZWFsZXJzIzMxLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE3LjA1LjAwI1NoZWxsYWNzIzMxLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE3LjA2LjAwI1N0YWlucyMzMS4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNy4wNy4wMCNWYXJuaXNoZXMjMzEuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTcuMDguMDAjUG93ZGVyIGNvYXQjMzEuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTguMDAuMDAjUGFpbnQgc29sdmVudHMgYW5kIHRoaW5uZXJzIzMxLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIxLjE4LjAxLjAwI1BhaW50IG9yIHZhcm5pc2ggcmVtb3ZlcnMjMzEuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTguMDIuMDAjUGFpbnQgb3IgdmFybmlzaCBzdHJpcHBlcnMjMzEuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTguMDMuMDAjUGFpbnQgb3IgdmFybmlzaCB0aGlubmVycyMzMS4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMS4yMS4xOS4wMC4wMCNQYWludCBhcHBsaWNhdG9ycyBhbmQgcGFpbnRpbmcgYWNjZXNzb3JpZXMjMzEuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDEuMDAjRHJvcCBjbG90aHMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDIuMDAjRWRnaW5nIHRvb2xzIzMxLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE5LjAzLjAwI01hc2tpbmcgZXF1aXBtZW50IzMxLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE5LjA0LjAwI1BhaW50IGJydXNoZXMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDUuMDAjUGFpbnQgbWl4ZXJzIzMxLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE5LjA2LjAwI1BhaW50IHJvbGxlcnMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDguMDAjUGFpbnQgc3ByYXllcnMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDkuMDAjUGFpbnQgdHJheXMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMTAuMDAjUGFpbnQgbWl0dHMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMTIuMDAjVGVsZXNjb3BpbmcgcG9sZXMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMTMuMDAjUGFpbnQgbm96emxlcyMzMS4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xOS4xNC4wMCNBaXIgYnJ1c2hlcyMzMS4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xOS4xNS4wMCNQYWludCBzdHJhaW5lcnMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjIuMDAuMDAuMDAjRHllaW5nIGFuZCB0YW5uaW5nIGV4dHJhY3RzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIyLjE1LjAwLjAwI0R5ZWluZyBwcm9kdWN0cyMzMS4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMi4xNS4wMS4wMCNJbm9yZ2FuaWMgZHllcyMzMS4yMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMi4xNS4wMi4wMCNPcmdhbmljIGR5ZXMgb2YgYW5pbWFsIG9yaWdpbiMzMS4yMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMi4xNS4wMy4wMCNPcmdhbmljIGR5ZXMgb2YgdmVnZXRhYmxlIG9yaWdpbiMzMS4yMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMi4xNi4wMC4wMCNUYW5uaW5nIHByb2R1Y3RzIzMxLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIyLjE2LjAxLjAwI0lub3JnYW5pYyB0YW5uaW5nIGV4dHJhY3RzIzMxLjIyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIyLjE2LjAyLjAwI09yZ2FuaWMgdGFubmluZyBleHRyYWN0cyBvZiBhbmltYWwgb3JpZ2luIzMxLjIyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIyLjE2LjAzLjAwI09yZ2FuaWMgdGFubmluZyBleHRyYWN0cyBvZiB2ZWdldGFibGUgb3JpZ2luIzMxLjIyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIzLjAwLjAwLjAwI01hY2hpbmVkIHJhdyBzdG9jayMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4wMC4wMCNNYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMDEuMDAjQWx1bWludW0gbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjAyLjAwI0JlcnlsbGl1bSBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMDMuMDAjQnJhc3MgbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjA0LjAwI0Jyb256ZSBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMDUuMDAjQ29wcGVyIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4wNi4wMCNJcm9uIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4wNy4wMCNMZWFkIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4wOC4wMCNNYWduZXNpdW0gbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjA5LjAwI1ByZWNpb3VzIG1ldGFsIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4xMC4wMCNTdGFpbmxlc3Mgc3RlZWwgbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjExLjAwI1RpbiBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMTIuMDAjVGl0YW5pdW0gbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjEzLjAwI1ppbmMgbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjE0LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4xNS4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4xNi4wMCNTdGVlbCBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMTcuMDAjQ29tcG9zaXRlIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4xOC4wMCNOaWNrZWwgYWxsb3kgbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjE5LjAwI05vbiBtZXRhbGxpYyBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMDAuMDAjTWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMDEuMDAjQWx1bWludW0gbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMDIuMDAjQmVyeWxsaXVtIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjAzLjAwI0JyYXNzIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjA0LjAwI0Jyb256ZSBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4wNS4wMCNDb3BwZXIgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMDYuMDAjSXJvbiBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4wNy4wMCNMZWFkIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjA4LjAwI01hZ25lc2l1bSBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4wOS4wMCNQcmVjaW91cyBtZXRhbCBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4xMC4wMCNTdGFpbmxlc3Mgc3RlZWwgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMTEuMDAjVGluIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjEyLjAwI1RpdGFuaXVtIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjEzLjAwI1ppbmMgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMTQuMDAjTm9uIGZlcnJvdXMgYWxsb3kgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMTUuMDAjRmVycm91cyBhbGxveSBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4xNi4wMCNTdGVlbCBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4xNy4wMCNDb21wb3NpdGUgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMTguMDAjTmlja2VsIGFsbG95IG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjE5LjAwI05vbiBtZXRhbGxpYyBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMy4wMC4wMCNTaGltIHN0b2NrIzMxLjIzLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEzLjAxLjAwI0JyYXNzIHNoaW0gc3RvY2sjMzEuMjMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTMuMDIuMDAjU3RlZWwgc2hpbSBzdG9jayMzMS4yMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMy4wMy4wMCNTdGFpbmxlc3Mgc3RlZWwgc2hpbSBzdG9jayMzMS4yMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMy4wNC4wMCNBbHVtaW51bSBzaGltIHN0b2NrIzMxLjIzLjEzLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEzLjA1LjAwI0NvcHBlciBzaGltIHN0b2NrIzMxLjIzLjEzLjAwLjAwCi11bnNwc2M3IzMxLjI0LjAwLjAwLjAwI0luZHVzdHJpYWwgb3B0aWNzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjE1LjAwLjAwI0xlbnNlcyBhbmQgcHJpc21zIzMxLjI0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjE1LjAxLjAwI0xlbnNlcyMzMS4yNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xNS4wMi4wMCNQcmlzbXMjMzEuMjQuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDAuMDAjT3B0aWNhbCBibGFua3MjMzEuMjQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDEuMDAjRmlsdGVyIGJsYW5rcyMzMS4yNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yNC4xNi4wMi4wMCNHbGFzcyBkaXNrcyMzMS4yNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yNC4xNi4wMy4wMCNNb2xkZWQgZ2xhc3MjMzEuMjQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDQuMDAjUHJpc20gYmxhbmtzIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE2LjA1LjAwI1NpbGljb24gYmxhbmtzIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE2LjA2LjAwI0dlcm1hbml1bSBibGFua3MjMzEuMjQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDcuMDAjUm91bmQgYmFyIHN0b2NrIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE2LjA4LjAwI1NxdWFyZSBiYXIgc3RvY2sjMzEuMjQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDkuMDAjV2l0bmVzcyBzYW1wbGUgYmxhbmtzIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE2LjEwLjAwI0luZnJhcmVkIG9wdGljYWwgbWF0ZXJpYWwgYmxhbmtzIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE3LjAwLjAwI01pcnJvcnMjMzEuMjQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTcuMDEuMDAjRGlhbW9uZCB0dXJuZWQgbWlycm9ycyMzMS4yNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4yNC4xNy4wMi4wMCNNZXRhbGxpYyBtaXJyb3JzIzMxLjI0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE3LjAzLjAwI1BhcmFib2xpYyBtaXJyb3JzIzMxLjI0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE3LjA0LjAwI1VuY29hdGVkIG1pcnJvcnMjMzEuMjQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTguMDAuMDAjT3B0aWNhbCBmaWx0ZXJzIzMxLjI0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjE4LjAxLjAwI0Jyb2FkIGJhbmQgZmlsdGVycyMzMS4yNC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOC4wMi4wMCNHcmFkaWVudCBmaWx0ZXJzIzMxLjI0LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE4LjAzLjAwI0luZnJhcmVkIGZpbHRlcnMjMzEuMjQuMTguMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTguMDQuMDAjTGFzZXIgZmlsdGVycyMzMS4yNC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOC4wNS4wMCNOYXJyb3cgYmFuZCBmaWx0ZXJzIzMxLjI0LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE4LjA2LjAwI1BlbGljbGUgZmlsdGVycyMzMS4yNC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOC4wNy4wMCNWaXN1YWwgZmlsdGVycyMzMS4yNC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wMC4wMCNPcHRpY2FsIGRvbWVzIzMxLjI0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjE5LjAxLjAwI1NwZWNpYWx0eSBkb21lcyMzMS4yNC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wMi4wMCNEaWFtb25kIHR1cm5lZCBkb21lcyMzMS4yNC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wMy4wMCNNZXRhbGxpYyBkb21lcyMzMS4yNC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wNC4wMCNNb2xkZWQgZ2xhc3MgZG9tZXMjMzEuMjQuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTkuMDUuMDAjTW9sZGVkIHBvbHljYXJib25hdGUgZG9tZXMjMzEuMjQuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTkuMDYuMDAjUmVwbGljYXRlZCBkb21lcyMzMS4yNC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wNy4wMCNTaGFwZWQgZG9tZXMjMzEuMjQuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTkuMDguMDAjRnJhbmdpYmxlIGRvbWVzIzMxLjI0LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI0LjIwLjAwLjAwI0xlbnMgYW5kIGxhc2VyIHdpbmRvd3MjMzEuMjQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMjAuMDEuMDAjRXh0ZXJuYWwgbGVucyBvciBsYXNlciB3aW5kb3dzIzMxLjI0LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjIwLjAyLjAwI0luZnJhcmVkIGxlbnMgb3IgbGFzZXIgd2luZG93cyMzMS4yNC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yNC4yMC4wMy4wMCNWaXN1YWwgbGVucyBvciBsYXNlciB3aW5kb3dzIzMxLjI0LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjIxLjAwLjAwI09wdGljYWwgZGV2aWNlIGFjY2Vzc29yaWVzIzMxLjI0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjIxLjAxLjAwI1ByaXNtIGhvbGRlcnMjMzEuMjQuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMjEuMDIuMDAjTGVucyBob2xkZXJzIzMxLjI0LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI0LjIxLjAzLjAwI09wdGljYWwgc2xpdHMjMzEuMjQuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMDAuMDAuMDAjUG5ldW1hdGljIGFuZCBoeWRyYXVsaWMgYW5kIGVsZWN0cmljIGNvbnRyb2wgc3lzdGVtcyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4wMC4wMCNBY3R1YXRvcnMjMzEuMjUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMTUuMDEuMDAjRWxlY3RyaWMgYWN0dWF0b3JzIzMxLjI1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI1LjE1LjAyLjAwI0VsZWN0cm9uaWMgYWN0dWF0b3JzIzMxLjI1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI1LjE1LjAzLjAwI0h5ZHJhdWxpYyBhY3R1YXRvcnMjMzEuMjUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMTUuMDQuMDAjUG5ldW1hdGljIGFjdHVhdG9ycyMzMS4yNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4wNS4wMCNWYWx2ZSBhY3R1YXRvcnMjMzEuMjUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMTUuMDYuMDAjR2VhciBhY3R1YXRvcnMjMzEuMjUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMTUuMDcuMDAjUm90YXJ5IGFjdHVhdG9ycyMzMS4yNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4wOC4wMCNQaG90b2VsZWN0cmljIGFjdHVhdG9ycyMzMS4yNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4wOS4wMCNFbGVjdHJvbWFnbmV0aWMgYWN0dWF0b3JzIzMxLjI1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI1LjE1LjEwLjAwI1NvbGVub2lkcyMzMS4yNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4xMS4wMCNMaW5lYXIgYWN0dWF0b3JzIzMxLjI1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI2LjAwLjAwLjAwI0hvdXNpbmdzIGFuZCBjYWJpbmV0cyBhbmQgY2FzaW5ncyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNS4wMC4wMCNIb3VzaW5ncyBhbmQgY2FiaW5ldHMjMzEuMjYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjYuMTUuMDEuMDAjUGxhc3RpYyBob3VzaW5ncyBvciBjYWJpbmV0cyMzMS4yNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNS4wMi4wMCNNZXRhbCBob3VzaW5ncyBvciBjYWJpbmV0cyMzMS4yNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNS4wMy4wMCNTdGVlbCBob3VzaW5ncyBvciBjYWJpbmV0cyMzMS4yNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNS4wNC4wMCNHZWFyIGJveGVzIG9yIGhvdXNpbmdzIzMxLjI2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI2LjE2LjAwLjAwI1NoZWxscyBhbmQgY2FzaW5ncyMzMS4yNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNi4wMS4wMCNQbGFzdGljIHNoZWxscyBvciBjYXNpbmdzIzMxLjI2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI2LjE2LjAyLjAwI01ldGFsIHNoZWxscyBvciBjYXNpbmdzIzMxLjI2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI2LjE2LjAzLjAwI1N0ZWVsIHNoZWxscyBvciBjYXNpbmdzIzMxLjI2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI3LjAwLjAwLjAwI01hY2hpbmUgbWFkZSBwYXJ0cyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNy4xNS4wMC4wMCNHZW5lcmFsIG1hY2hpbmUgbWFkZSBwYXJ0cyMzMS4yNy4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNy4xNS4wMS4wMCNNZXRhbCBnZW5lcmFsIG1hY2hpbmUgbWFkZSBwYXJ0cyMzMS4yNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNy4xNS4wMi4wMCNOb24gbWV0YWwgZ2VuZXJhbCBtYWNoaW5lIG1hZGUgcGFydHMjMzEuMjcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjcuMTYuMDAuMDAjU2NyZXcgbWFjaGluZSBtYWRlIHBhcnRzIzMxLjI3LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI3LjE2LjAxLjAwI01ldGFsIHNjcmV3IG1hY2hpbmUgbWFkZSBwYXJ0cyMzMS4yNy4xNi4wMC4wMAotdW5zcHNjNyMzMS4yNy4xNi4wMi4wMCNOb24gbWV0YWwgc2NyZXcgbWFjaGluZSBtYWRlIHBhcnRzIzMxLjI3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI4LjAwLjAwLjAwI1N0YW1waW5ncyBhbmQgc2hlZXQgY29tcG9uZW50cyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wMC4wMCNTdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMDEuMDAjU3RhbXBlZCBtZXRhbCBjb21wb25lbnRzIzMxLjI4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE1LjAyLjAwI0FsdW1pbnVtIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wMy4wMCNGZXJyb3VzIGFsbG95IHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wNC4wMCNJcm9uIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wNS4wMCNOb24gZmVycm91cyBhbGxveSBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMDYuMDAjU3RhaW5sZXNzIHN0ZWVsIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wNy4wMCNDYXJib24gU3RlZWwgc3RhbXBlZCBjb21wb25lbnRzIzMxLjI4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE1LjA4LjAwI01hZ25lc2l1bSBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMDkuMDAjWmluYyBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMTAuMDAjVGluIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xMS4wMCNUaXRhbml1bSBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMTIuMDAjQmVyeWxsaXVtIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xMy4wMCNQcmVjaW91cyBtZXRhbCBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMTQuMDAjQ29wcGVyIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xNS4wMCNMZWFkIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xNi4wMCNCcmFzcyBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMTcuMDAjQnJvbnplIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xOC4wMCNDb21wb3NpdGUgc3RhbXBlZCBjb21wb25lbnRzIzMxLjI4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE1LjE5LjAwI05pY2tlbCBhbGxveSBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMjAuMDAjTm9uIG1ldGFsbGljIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4yMS4wMCNDb2F0ZWQgU3RhbXBpbmdzIzMxLjI4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE2LjAwLjAwI0Zvcm1lZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjE2LjAxLjAwI0Zvcm1lZCBtZXRhbCBjb21wb25lbnRzIzMxLjI4LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE3LjAwLjAwI1dlbGRlZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjE3LjAxLjAwI1dlbGRlZCBtZXRhbCBjb21wb25lbnRzIzMxLjI4LjE3LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjAwLjAwI1B1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4wMS4wMCNBbHVtaW51bSBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDIuMDAjRmVycm91cyBhbGxveSBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDMuMDAjSXJvbiBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDQuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcHVuY2hlZCBjb21wb25lbnRzIzMxLjI4LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjA1LjAwI1N0YWlubGVzcyBzdGVlbCBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDYuMDAjQ2FyYm9uIFN0ZWVsIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4wNy4wMCNDb21wb3NpdGUgcHVuY2hlZCBjb21wb25lbnRzIzMxLjI4LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjA4LjAwI05pY2tlbCBhbGxveSBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDkuMDAjTm9uIG1ldGFsbGljIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xMC4wMCNUaXRhbml1bSBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMTEuMDAjQmVyeWxsaXVtIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xMi4wMCNQcmVjaW91cyBtZXRhbCBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMTMuMDAjQ29wcGVyIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xNC4wMCNMZWFkIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xNS4wMCNCcmFzcyBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMTYuMDAjQnJvbnplIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xNy4wMCNNYWduZXNpdW0gcHVuY2hlZCBjb21wb25lbnRzIzMxLjI4LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjE4LjAwI1ppbmMgcHVuY2hlZCBjb21wb25lbnRzIzMxLjI4LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjE5LjAwI1RpbiBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDAuMDAjRHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4wMS4wMCNBbHVtaW51bSBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjAyLjAwI0JlcnlsbGl1bSBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjAzLjAwI0JyYXNzIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDQuMDAjQnJvbnplIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDUuMDAjQ29tcG9zaXRlIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDYuMDAjQ29wcGVyIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDcuMDAjRmVycm91cyBhbGxveSBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjA4LjAwI0lyb24gZHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4wOS4wMCNMZWFkIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTAuMDAjTWFnbmVzaXVtIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTEuMDAjTmlja2VsIGFsbG95IGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4xMy4wMCNOb24gbWV0YWxsaWMgZHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4xNC4wMCNQcmVjaW91cyBtZXRhbCBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjE1LjAwI1N0YWlubGVzcyBzdGVlbCBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjE2LjAwI1N0ZWVsIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTcuMDAjVGluIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTguMDAjVGl0YW5pdW0gZHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4xOS4wMCNaaW5jIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDAuMDAjSHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDEuMDAjQWx1bWludW0gaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDIuMDAjQmVyeWxsaXVtIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjAzLjAwI0JyYXNzIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjA0LjAwI0Jyb256ZSBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4wNS4wMCNDb21wb3NpdGUgaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDYuMDAjQ29wcGVyIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjA3LjAwI0ZlcnJvdXMgYWxsb3kgaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDguMDAjSXJvbiBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4wOS4wMCNMZWFkIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjEwLjAwI01hZ25lc2l1bSBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4xMS4wMCNOaWNrZWwgYWxsb3kgaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMTIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMTMuMDAjTm9uIG1ldGFsbGljIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjE0LjAwI1ByZWNpb3VzIG1ldGFsIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjE1LjAwI1N0YWlubGVzcyBzdGVlbCBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4xNi4wMCNTdGVlbCBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4xNy4wMCNUaW4gaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMTguMDAjVGl0YW5pdW0gaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMTkuMDAjWmluYyBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wMC4wMCNTcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjAxLjAwI0FsdW1pbnVtIHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMDIuMDAjQmVyeWxsaXVtIHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMDMuMDAjQnJhc3Mgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wNC4wMCNCcm9uemUgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wNS4wMCNDb21wb3NpdGUgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wNi4wMCNDb3BwZXIgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wNy4wMCNGZXJyb3VzIGFsbG95IHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMDguMDAjSXJvbiBzcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjA5LjAwI0xlYWQgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xMC4wMCNNYWduZXNpdW0gc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xMS4wMCNOaWNrZWwgYWxsb3kgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xMi4wMCNOb24gZmVycm91cyBhbGxveSBzcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjEzLjAwI05vbiBtZXRhbGxpYyBzcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjE0LjAwI1ByZWNpb3VzIG1ldGFsIHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMTUuMDAjU3RhaW5sZXNzIHN0ZWVsIHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMTYuMDAjU3RlZWwgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xNy4wMCNUaW4gc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xOC4wMCNUaXRhbml1bSBzcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjE5LjAwI1ppbmMgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wMC4wMCNSb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjAxLjAwI0FsdW1pbnVtIHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMDIuMDAjQmVyeWxsaXVtIHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMDMuMDAjQnJhc3Mgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wNC4wMCNCcm9uemUgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wNS4wMCNDb21wb3NpdGUgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wNi4wMCNDb3BwZXIgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wNy4wMCNGZXJyb3VzIGFsbG95IHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMDguMDAjSXJvbiByb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIyLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjA5LjAwI0xlYWQgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xMC4wMCNNYWduZXNpdW0gcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xMS4wMCNOaWNrZWwgYWxsb3kgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xMi4wMCNOb24gZmVycm91cyBhbGxveSByb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIyLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjEzLjAwI05vbiBtZXRhbGxpYyByb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIyLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjE0LjAwI1ByZWNpb3VzIG1ldGFsIHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMTUuMDAjU3RhaW5sZXNzIHN0ZWVsIHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMTYuMDAjU3RlZWwgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xNy4wMCNUaW4gcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xOC4wMCNUaXRhbml1bSByb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIyLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjE5LjAwI1ppbmMgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wMC4wMCNTdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjAxLjAwI0FsdW1pbnVtIHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMDIuMDAjQmVyeWxsaXVtIHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMDMuMDAjQnJhc3Mgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wNC4wMCNCcm9uemUgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wNS4wMCNDb21wb3NpdGUgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wNi4wMCNDb3BwZXIgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wNy4wMCNGZXJyb3VzIGFsbG95IHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMDguMDAjSXJvbiBzdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIzLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjA5LjAwI0xlYWQgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xMC4wMCNNYWduZXNpdW0gc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xMS4wMCNOaWNrZWwgYWxsb3kgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xMi4wMCNOb24gZmVycm91cyBhbGxveSBzdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIzLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjEzLjAwI05vbiBtZXRhbGxpYyBzdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIzLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjE0LjAwI1ByZWNpb3VzIG1ldGFsIHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMTUuMDAjU3RhaW5sZXNzIHN0ZWVsIHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMTYuMDAjU3RlZWwgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xNy4wMCNUaW4gc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xOC4wMCNUaXRhbml1bSBzdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIzLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjE5LjAwI1ppbmMgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4wMC4wMCNFeHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMDEuMDAjQWx1bWludW0gZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjAyLjAwI0JlcnlsbGl1bSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMDMuMDAjQnJhc3MgZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjA0LjAwI0Jyb256ZSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMDUuMDAjQ29tcG9zaXRlIGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4wNi4wMCNDb3BwZXIgZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjA3LjAwI0ZlcnJvdXMgYWxsb3kgZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjA4LjAwI0lyb24gZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjA5LjAwI0xlYWQgZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjEwLjAwI01hZ25lc2l1bSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTEuMDAjTmlja2VsIGFsbG95IGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4xMi4wMCNOb24gZmVycm91cyBhbGxveSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTMuMDAjTm9uIG1ldGFsbGljIGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4xNC4wMCNQcmVjaW91cyBtZXRhbCBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTUuMDAjU3RhaW5sZXNzIHN0ZWVsIGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4xNi4wMCNTdGVlbCBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTcuMDAjVGluIGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4xOC4wMCNUaXRhbml1bSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTkuMDAjWmluYyBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMDAuMDAuMDAjTWFjaGluZWQgZXh0cnVzaW9ucyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4wMC4wMCNNYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4wMS4wMCNBbHVtaW51bSBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4wMi4wMCNCZXJ5bGxpdW0gbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMDMuMDAjQnJhc3MgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMDQuMDAjQnJvbnplIG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjA1LjAwI0NvcHBlciBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4wNi4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjA3LjAwI0xlYWQgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMDguMDAjTWFnbmVzaXVtIG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjA5LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjEwLjAwI1BsYXN0aWMgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTEuMDAjUHJlY2lvdXMgbWV0YWwgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTIuMDAjUnViYmVyIG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjEzLjAwI1N0YWlubGVzcyBzdGVlbCBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4xNC4wMCNTdGVlbCBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4xNS4wMCNUaW4gbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTYuMDAjVGl0YW5pdW0gbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTcuMDAjWmluYyBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4xOC4wMCNDb21wb3NpdGUgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTkuMDAjTmlja2VsIGFsbG95IG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjIwLjAwI05vbiBtZXRhbGxpYyBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4wMC4wMCNNYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4wMS4wMCNBbHVtaW51bSBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4wMi4wMCNCZXJ5bGxpdW0gbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMDMuMDAjQnJhc3MgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMDQuMDAjQnJvbnplIG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjA1LjAwI0NvcHBlciBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4wNi4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjA3LjAwI0xlYWQgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMDguMDAjTWFnbmVzaXVtIG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjA5LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjEwLjAwI1BsYXN0aWMgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTEuMDAjUHJlY2lvdXMgbWV0YWwgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTIuMDAjUnViYmVyIG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjEzLjAwI1N0YWlubGVzcyBzdGVlbCBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4xNC4wMCNTdGVlbCBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4xNS4wMCNUaW4gbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTYuMDAjVGl0YW5pdW0gbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTcuMDAjWmluYyBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4xOC4wMCNDb21wb3NpdGUgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTkuMDAjTmlja2VsIGFsbG95IG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjIwLjAwI05vbiBtZXRhbGxpYyBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4wMC4wMCNNYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMDEuMDAjQWx1bWludW0gbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjAyLjAwI0JlcnlsbGl1bSBtYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMDMuMDAjQnJhc3MgbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjA0LjAwI0Jyb256ZSBtYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMDUuMDAjQ29wcGVyIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4wNi4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4wNy4wMCNMZWFkIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4wOC4wMCNNYWduZXNpdW0gbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjA5LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xMC4wMCNQbGFzdGljIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xMS4wMCNQcmVjaW91cyBtZXRhbCBtYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMTIuMDAjUnViYmVyIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xMy4wMCNTdGFpbmxlc3Mgc3RlZWwgbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjE0LjAwI1N0ZWVsIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xNS4wMCNUaW4gbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjE2LjAwI1RpdGFuaXVtIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xNy4wMCNaaW5jIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xOC4wMCNDb21wb3NpdGUgbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjE5LjAwI05pY2tlbCBhbGxveSBtYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMjAuMDAjTm9uIG1ldGFsbGljIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4wMC4wMCNNYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4wMS4wMCNBbHVtaW51bSBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4wMi4wMCNCZXJ5bGxpdW0gbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMDMuMDAjQnJhc3MgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMDQuMDAjQnJvbnplIG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjA1LjAwI0NvcHBlciBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4wNi4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjA3LjAwI0xlYWQgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMDguMDAjTWFnbmVzaXVtIG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjA5LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjEwLjAwI1BsYXN0aWMgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTEuMDAjUHJlY2lvdXMgbWV0YWwgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTIuMDAjUnViYmVyIG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjEzLjAwI1N0YWlubGVzcyBzdGVlbCBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4xNC4wMCNTdGVlbCBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4xNS4wMCNUaW4gbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTYuMDAjVGl0YW5pdW0gbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTcuMDAjWmluYyBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4xOC4wMCNDb21wb3NpdGUgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTkuMDAjTmlja2VsIGFsbG95IG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjIwLjAwI05vbiAgIG1ldGFsbGljIG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE1LjAwLjAwI01hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI5LjE2LjAwLjAwI01hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNy4wMC4wMCNNYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xOC4wMC4wMCNNYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4wMC4wMC4wMCNNYWNoaW5lZCBmb3JnaW5ncyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMC4wMC4wMCNNYWNoaW5lZCByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4zMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wMC4wMCNNYWNoaW5lZCBvcGVuIGRpZSBmb3JnaW5ncyMzMS4zMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wMS4wMCNOb24gZmVycm91cyBhbGxveSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wMi4wMCNGZXJyb3VzIGFsbG95IG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjAzLjAwI1N0ZWVsIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wNS4wMCNJcm9uIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjA2LjAwI0FsdW1pbnVtIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjA3LjAwI01hZ25lc2l1bSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wOC4wMCNUaXRhbml1bSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wOS4wMCNCZXJ5bGxpdW0gb3BlbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTEuMTAuMDAjQ29wcGVyIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjExLjAwI0JyYXNzIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjEyLjAwI0Jyb256ZSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4xMy4wMCNaaW5jIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjE0LjAwI1RpbiBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4xNS4wMCNMZWFkIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjE2LjAwI1ByZWNpb3VzIG1ldGFsIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjE3LjAwI0NvbXBvc2l0ZSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4xOC4wMCNOaWNrZWwgYWxsb3kgb3BlbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTEuMTkuMDAjTm9uIG1ldGFsbGljIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjAwLjAwI01hY2hpbmVkIGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMzAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wMi4wMCNGZXJyb3VzIGFsbG95IGNsb3NlZCBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMDMuMDAjU3RlZWwgY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wNS4wMCNJcm9uIGNsb3NlZCBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMDYuMDAjQWx1bWludW0gY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wNy4wMCNNYWduZXNpdW0gY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wOC4wMCNUaXRhbml1bSBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjA5LjAwI0JlcnlsbGl1bSBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjEwLjAwI0NvcHBlciBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjExLjAwI0JyYXNzIGNsb3NlZCBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMTIuMDAjQnJvbnplIGNsb3NlZCBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMTMuMDAjWmluYyBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE0LjAwI1RpbiBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE1LjAwI0xlYWQgY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4xNi4wMCNQcmVjaW91cyBtZXRhbCBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE3LjAwI0NvbXBvc2l0ZSBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE4LjAwI05pY2tlbCBhbGxveSBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE5LjAwI05vbiBtZXRhbGxpYyBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjAwLjAwI01hY2hpbmVkIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjMwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjAyLjAwI0ZlcnJvdXMgYWxsb3kgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMDMuMDAjU3RlZWwgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjA1LjAwI0lyb24gaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMDYuMDAjQWx1bWludW0gaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMDcuMDAjTWFnbmVzaXVtIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjA4LjAwI1RpdGFuaXVtIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjA5LjAwI0JlcnlsbGl1bSBpbXByZXNzaW9uIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMy4xMC4wMCNDb3BwZXIgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTEuMDAjQnJhc3MgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTIuMDAjQnJvbnplIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjEzLjAwI1ppbmMgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTQuMDAjVGluIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjE1LjAwI0xlYWQgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTYuMDAjUHJlY2lvdXMgbWV0YWwgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTcuMDAjQ29tcG9zaXRlIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjE4LjAwI05pY2tlbCBhbGxveSBpbXByZXNzaW9uIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMy4xOS4wMCNOb24gbWV0YWxsaWMgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMDAuMDAjTWFjaGluZWQgZHJvcCBmb3JnaW5ncyMzMS4zMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4wMS4wMCNOb24gZmVycm91cyBhbGxveSBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjAyLjAwI1ppbmMgZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4wMy4wMCNGZXJyb3VzIGFsbG95IGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMDQuMDAjVGluIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMDUuMDAjTGVhZCBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjA2LjAwI1N0ZWVsIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMDcuMDAjUHJlY2lvdXMgbWV0YWwgZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4wOC4wMCNTdGFpbmxlc3Mgc3RlZWwgZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4wOS4wMCNJcm9uIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTAuMDAjQWx1bWludW0gZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4xMS4wMCNNYWduZXNpdW0gZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4xMi4wMCNUaXRhbml1bSBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjEzLjAwI0JlcnlsbGl1bSBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjE0LjAwI0NvcHBlciBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjE1LjAwI0JyYXNzIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTYuMDAjQnJvbnplIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTcuMDAjQ29tcG9zaXRlIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTguMDAjTmlja2VsIGFsbG95IGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTkuMDAjTm9uIG1ldGFsbGljIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMDAuMDAjTWFjaGluZWQgcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMzAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMDEuMDAjQWx1bWludW0gcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMDIuMDAjQmVyeWxsaXVtIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjAzLjAwI0JyYXNzIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjA0LjAwI0Jyb256ZSByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4wNS4wMCNDb3BwZXIgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMDYuMDAjSXJvbiByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4wNy4wMCNMZWFkIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjA4LjAwI01hZ25lc2l1bSByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4wOS4wMCNQcmVjaW91cyBtZXRhbCByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4xMC4wMCNTdGFpbmxlc3Mgc3RlZWwgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMTEuMDAjVGluIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjEyLjAwI1RpdGFuaXVtIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjEzLjAwI1ppbmMgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMTQuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMTUuMDAjRmVycm91cyBhbGxveSByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4xNi4wMCNTdGVlbCByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4xNy4wMCNDb21wb3NpdGUgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMTguMDAjTmlja2VsIGFsbG95IHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjE5LjAwI05vbiBtZXRhbGxpYyByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNi4wMC4wMCNNYWNoaW5lZCBvcGVuIGRpZSBmb3JnaW5ncyMzMS4zMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNy4wMC4wMCNNYWNoaW5lZCBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjMwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMwLjE4LjAwLjAwI01hY2hpbmVkIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjMwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMwLjE5LjAwLjAwI01hY2hpbmVkIGRyb3AgZm9yZ2luZ3MjMzEuMzAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMDAuMDAuMDAjRmFicmljYXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMDAuMDAjU29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjAxLjAwI0FsdW1pbnVtIHNvbHZlbnQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMS4wMi4wMCNDYXJib24gc3RlZWwgc29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjExLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjAzLjAwI0hhc3RhbGxveSBYIHNvbHZlbnQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMS4wNC4wMCNJbmNvbmVsIHNvbHZlbnQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMS4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjExLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjA2LjAwI05vbiBtZXRhbGxpYyBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMDcuMDAjT3RoZXIgZmVycm91cyBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjExLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjA5LjAwI1N0YWlubGVzcyBzdGVlbCBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMTAuMDAjVGl0YW5pdW0gc29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjExLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjExLjAwI1dhc3BhbGxveSBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMTIuMDAjQ29wcGVyIHNvbHZlbnQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMS4xMy4wMCNCcmFzcyBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMDAuMDAjUml2ZXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMDEuMDAjQWx1bWludW0gcml2ZXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMDIuMDAjQ2FyYm9uIHN0ZWVsIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjAzLjAwI0hhc3RhbGxveSBYIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjA0LjAwI0luY29uZWwgcml2ZXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjA2LjAwI05vbiBtZXRhbGxpYyByaXZldGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMi4wNy4wMCNPdGhlciBmZXJyb3VzIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjA5LjAwI1N0YWlubGVzcyBzdGVlbCByaXZldGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMi4xMC4wMCNUaXRhbml1bSByaXZldGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMi4xMS4wMCNXYXNwYWxsb3kgcml2ZXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMTIuMDAjQ29wcGVyIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjEzLjAwI0JyYXNzIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjAwLjAwI0JvbHRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTMuMDEuMDAjQWx1bWludW0gYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wMi4wMCNDYXJib24gc3RlZWwgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wMy4wMCNIYXN0YWxsb3kgWCBib2x0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjA0LjAwI0luY29uZWwgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wNi4wMCNOb24gbWV0YWxsaWMgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbHRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTMuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4xMC4wMCNUaXRhbml1bSBib2x0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjExLjAwI1dhc3BhbGxveSBib2x0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjEyLjAwI0NvcHBlciBib2x0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjEzLjAwI0JyYXNzIGJvbHRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDAuMDAjVWx0cmEgdmlvbGV0IHdlbGRlZCAoVVYpIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNC4wMS4wMCNBbHVtaW51bSB1bHRyYSB2aW9sZXQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNC4wMi4wMCNDYXJib24gc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDMuMDAjSGFzdGFsbG95IFggdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDQuMDAjSW5jb25lbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNC4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDYuMDAjTm9uIG1ldGFsbGljIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE0LjA3LjAwI090aGVyIGZlcnJvdXMgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE0LjEwLjAwI1RpdGFuaXVtIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE0LjExLjAwI1dhc3BhbGxveSB1bHRyYSB2aW9sZXQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNC4xMi4wMCNDb3BwZXIgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMTMuMDAjQnJhc3MgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMDAuMDAjV2VsZGVkIG9yIGJyYXplZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMDEuMDAjQWx1bWludW0gd2VsZGVkIG9yIGJyYXplZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMDIuMDAjQ2FyYm9uIHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjAzLjAwI0hhc3RhbGxveSBYIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjA0LjAwI0luY29uZWwgd2VsZGVkIG9yIGJyYXplZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjA2LjAwI05vbiBtZXRhbGxpYyB3ZWxkZWQgb3IgYnJhemVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNS4wNy4wMCNPdGhlciBmZXJyb3VzIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjA5LjAwI1N0YWlubGVzcyBzdGVlbCB3ZWxkZWQgb3IgYnJhemVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNS4xMC4wMCNUaXRhbml1bSB3ZWxkZWQgb3IgYnJhemVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNS4xMS4wMCNXYXNwYWxsb3kgd2VsZGVkIG9yIGJyYXplZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMTIuMDAjQ29wcGVyIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjEzLjAwI0JyYXNzIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjAwLjAwI1NvbmljIHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTYuMDEuMDAjQWx1bWludW0gc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wMi4wMCNDYXJib24gc3RlZWwgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wMy4wMCNIYXN0YWxsb3kgWCBzb25pYyB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjA0LjAwI0luY29uZWwgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wNi4wMCNOb24gbWV0YWxsaWMgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbmljIHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTYuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4xMC4wMCNUaXRhbml1bSBzb25pYyB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjExLjAwI1dhc3BhbGxveSBzb25pYyB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjEyLjAwI0NvcHBlciBzb25pYyB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjEzLjAwI0JyYXNzIHNvbmljIHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMDAuMDAjQm9uZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNy4wMS4wMCNBbHVtaW51bSBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjAyLjAwI0NhcmJvbiBzdGVlbCBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjAzLjAwI0hhc3RhbGxveSBYIGJvbmRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMDQuMDAjSW5jb25lbCBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjA1LjAwI0xvdyBhbGxveSBzdGVlbCBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjA2LjAwI05vbiBtZXRhbGxpYyBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjA3LjAwI090aGVyIGZlcnJvdXMgYm9uZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNy4wOC4wMCNPdGhlciBub24gZmVycm91cyBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjEwLjAwI1RpdGFuaXVtIGJvbmRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMTEuMDAjV2FzcGFsbG95IGJvbmRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMTIuMDAjQ29wcGVyIGJvbmRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMTMuMDAjQnJhc3MgYm9uZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4wMC4wMC4wMCNGYWJyaWNhdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjAwLjAwI0JvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4wMS4wMCNBbHVtaW51bSBib25kZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTEuMDIuMDAjQ2FyYm9uIHN0ZWVsIGJvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4wMy4wMCNIYXN0YWxsb3kgWCBib25kZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTEuMDQuMDAjSW5jb25lbCBib25kZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTEuMDUuMDAjTG93IGFsbG95IHN0ZWVsIGJvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4wNi4wMCNOb24gbWV0YWxsaWMgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjA3LjAwI090aGVyIGZlcnJvdXMgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIGJvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjEwLjAwI1RpdGFuaXVtIGJvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4xMS4wMCNXYXNwYWxsb3kgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjEyLjAwI0NvcHBlciBib25kZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTEuMTMuMDAjQnJhc3MgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjAwLjAwI1NvbHZlbnQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjAxLjAwI0FsdW1pbnVtIHNvbHZlbnQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjAyLjAwI0NhcmJvbiBzdGVlbCBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wMy4wMCNIYXN0YWxsb3kgWCBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wNC4wMCNJbmNvbmVsIHNvbHZlbnQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjA1LjAwI0xvdyBhbGxveSBzdGVlbCBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wNi4wMCNOb24gbWV0YWxsaWMgc29sdmVudCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTIuMDcuMDAjT3RoZXIgZmVycm91cyBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wOC4wMCNPdGhlciBub24gZmVycm91cyBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29sdmVudCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTIuMTAuMDAjVGl0YW5pdW0gc29sdmVudCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTIuMTEuMDAjV2FzcGFsbG95IHNvbHZlbnQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjEyLjAwI0NvcHBlciBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4xMy4wMCNCcmFzcyBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4wMC4wMCNSaXZldGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEzLjAxLjAwI0FsdW1pbnVtIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDIuMDAjQ2FyYm9uIHN0ZWVsIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDMuMDAjSGFzdGFsbG95IFggcml2ZXRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4wNC4wMCNJbmNvbmVsIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDYuMDAjTm9uIG1ldGFsbGljIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDcuMDAjT3RoZXIgZmVycm91cyByaXZldGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEzLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMTAuMDAjVGl0YW5pdW0gcml2ZXRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4xMS4wMCNXYXNwYWxsb3kgcml2ZXRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4xMi4wMCNDb3BwZXIgcml2ZXRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4xMy4wMCNCcmFzcyByaXZldGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjAwLjAwI1dlbGRlZCBvciBicmF6ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTQuMDEuMDAjQWx1bWludW0gd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wMi4wMCNDYXJib24gc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wMy4wMCNIYXN0YWxsb3kgWCB3ZWxkZWQgb3IgYnJhemVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjA0LjAwI0luY29uZWwgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wNi4wMCNOb24gbWV0YWxsaWMgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wNy4wMCNPdGhlciBmZXJyb3VzIHdlbGRlZCBvciBicmF6ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTQuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4xMC4wMCNUaXRhbml1bSB3ZWxkZWQgb3IgYnJhemVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjExLjAwI1dhc3BhbGxveSB3ZWxkZWQgb3IgYnJhemVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjEyLjAwI0NvcHBlciB3ZWxkZWQgb3IgYnJhemVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjEzLjAwI0JyYXNzIHdlbGRlZCBvciBicmF6ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDAuMDAjVWx0cmEgdmlvbGV0IHdlbGRlZCAoVVYpIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMyLjE1LjAxLjAwI0FsdW1pbnVtIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDIuMDAjQ2FyYm9uIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDMuMDAjSGFzdGFsbG95IFggdWx0cmEgdmlvbGV0IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNS4wNC4wMCNJbmNvbmVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDYuMDAjTm9uIG1ldGFsbGljIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDcuMDAjT3RoZXIgZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE1LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMTAuMDAjVGl0YW5pdW0gdWx0cmEgdmlvbGV0IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNS4xMS4wMCNXYXNwYWxsb3kgdWx0cmEgdmlvbGV0IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNS4xMi4wMCNDb3BwZXIgdWx0cmEgdmlvbGV0IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNS4xMy4wMCNCcmFzcyB1bHRyYSB2aW9sZXQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjAwLjAwI1NvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4wMS4wMCNBbHVtaW51bSBzb25pYyB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTYuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4wMy4wMCNIYXN0YWxsb3kgWCBzb25pYyB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTYuMDQuMDAjSW5jb25lbCBzb25pYyB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTYuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4wNi4wMCNOb24gbWV0YWxsaWMgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjA3LjAwI090aGVyIGZlcnJvdXMgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjEwLjAwI1RpdGFuaXVtIHNvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4xMS4wMCNXYXNwYWxsb3kgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjEyLjAwI0NvcHBlciBzb25pYyB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTYuMTMuMDAjQnJhc3Mgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjAwLjAwI0JvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4wMS4wMCNBbHVtaW51bSBib2x0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTcuMDIuMDAjQ2FyYm9uIHN0ZWVsIGJvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4wMy4wMCNIYXN0YWxsb3kgWCBib2x0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTcuMDQuMDAjSW5jb25lbCBib2x0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTcuMDUuMDAjTG93IGFsbG95IHN0ZWVsIGJvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4wNi4wMCNOb24gbWV0YWxsaWMgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjA3LjAwI090aGVyIGZlcnJvdXMgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIGJvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjEwLjAwI1RpdGFuaXVtIGJvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4xMS4wMCNXYXNwYWxsb3kgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjEyLjAwI0NvcHBlciBib2x0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTcuMTMuMDAjQnJhc3MgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMzLjAwLjAwLjAwI0ZhYnJpY2F0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjAwLjAwI0JvbmRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTEuMDEuMDAjQWx1bWludW0gYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wMi4wMCNDYXJib24gc3RlZWwgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wMy4wMCNIYXN0YWxsb3kgWCBib25kZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjExLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjA0LjAwI0luY29uZWwgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wNi4wMCNOb24gbWV0YWxsaWMgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbmRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTEuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4xMC4wMCNUaXRhbml1bSBib25kZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjExLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjExLjAwI1dhc3BhbGxveSBib25kZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjExLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjEyLjAwI0NvcHBlciBib25kZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjExLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjEzLjAwI0JyYXNzIGJvbmRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMDAuMDAjQm9sdGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMi4wMS4wMCNBbHVtaW51bSBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjAyLjAwI0NhcmJvbiBzdGVlbCBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjAzLjAwI0hhc3RhbGxveSBYIGJvbHRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMDQuMDAjSW5jb25lbCBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjA1LjAwI0xvdyBhbGxveSBzdGVlbCBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjA2LjAwI05vbiBtZXRhbGxpYyBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjA3LjAwI090aGVyIGZlcnJvdXMgYm9sdGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMi4wOC4wMCNPdGhlciBub24gZmVycm91cyBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjEwLjAwI1RpdGFuaXVtIGJvbHRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMTEuMDAjV2FzcGFsbG95IGJvbHRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMTIuMDAjQ29wcGVyIGJvbHRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMTMuMDAjQnJhc3MgYm9sdGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4wMC4wMCNTb25pYyB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEzLjAxLjAwI0FsdW1pbnVtIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDMuMDAjSGFzdGFsbG95IFggc29uaWMgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4wNC4wMCNJbmNvbmVsIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDYuMDAjTm9uIG1ldGFsbGljIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDcuMDAjT3RoZXIgZmVycm91cyBzb25pYyB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEzLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMTAuMDAjVGl0YW5pdW0gc29uaWMgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4xMS4wMCNXYXNwYWxsb3kgc29uaWMgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4xMi4wMCNDb3BwZXIgc29uaWMgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4xMy4wMCNCcmFzcyBzb25pYyB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjAwLjAwI1VsdHJhIHZpb2xldCB3ZWxkZWQgKFVWKSBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTQuMDEuMDAjQWx1bWludW0gdWx0cmEgdmlvbGV0IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTQuMDIuMDAjQ2FyYm9uIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjAzLjAwI0hhc3RhbGxveSBYIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjA0LjAwI0luY29uZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTQuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjA2LjAwI05vbiBtZXRhbGxpYyB1bHRyYSB2aW9sZXQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNC4wNy4wMCNPdGhlciBmZXJyb3VzIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjA5LjAwI1N0YWlubGVzcyBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNC4xMC4wMCNUaXRhbml1bSB1bHRyYSB2aW9sZXQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNC4xMS4wMCNXYXNwYWxsb3kgdWx0cmEgdmlvbGV0IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTQuMTIuMDAjQ29wcGVyIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjEzLjAwI0JyYXNzIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjAwLjAwI1NvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4wMS4wMCNBbHVtaW51bSBzb2x2ZW50IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTUuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4wMy4wMCNIYXN0YWxsb3kgWCBzb2x2ZW50IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTUuMDQuMDAjSW5jb25lbCBzb2x2ZW50IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTUuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4wNi4wMCNOb24gbWV0YWxsaWMgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjA3LjAwI090aGVyIGZlcnJvdXMgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjEwLjAwI1RpdGFuaXVtIHNvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4xMS4wMCNXYXNwYWxsb3kgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjEyLjAwI0NvcHBlciBzb2x2ZW50IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTUuMTMuMDAjQnJhc3Mgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjAwLjAwI1dlbGRlZCBvciBicmF6ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjAxLjAwI0FsdW1pbnVtIHdlbGRlZCBvciBicmF6ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjAyLjAwI0NhcmJvbiBzdGVlbCB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wMy4wMCNIYXN0YWxsb3kgWCB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wNC4wMCNJbmNvbmVsIHdlbGRlZCBvciBicmF6ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjA1LjAwI0xvdyBhbGxveSBzdGVlbCB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wNi4wMCNOb24gbWV0YWxsaWMgd2VsZGVkIG9yIGJyYXplZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTYuMDcuMDAjT3RoZXIgZmVycm91cyB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wOC4wMCNPdGhlciBub24gZmVycm91cyB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTYuMTAuMDAjVGl0YW5pdW0gd2VsZGVkIG9yIGJyYXplZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTYuMTEuMDAjV2FzcGFsbG95IHdlbGRlZCBvciBicmF6ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjEyLjAwI0NvcHBlciB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4xMy4wMCNCcmFzcyB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4wMC4wMCNSaXZldGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4wMS4wMCNBbHVtaW51bSByaXZldGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4wMi4wMCNDYXJib24gc3RlZWwgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDMuMDAjSGFzdGFsbG95IFggcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDQuMDAjSW5jb25lbCByaXZldGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDYuMDAjTm9uIG1ldGFsbGljIHJpdmV0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE3LjA3LjAwI090aGVyIGZlcnJvdXMgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHJpdmV0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE3LjEwLjAwI1RpdGFuaXVtIHJpdmV0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE3LjExLjAwI1dhc3BhbGxveSByaXZldGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4xMi4wMCNDb3BwZXIgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMTMuMDAjQnJhc3Mgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMDAuMDAuMDAjRmFicmljYXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjAwLjAwI1dlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4wMS4wMCNBbHVtaW51bSB3ZWxkZWQgb3IgYnJhemVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTEuMDIuMDAjQ2FyYm9uIHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4wMy4wMCNIYXN0YWxsb3kgWCB3ZWxkZWQgb3IgYnJhemVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTEuMDQuMDAjSW5jb25lbCB3ZWxkZWQgb3IgYnJhemVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTEuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4wNi4wMCNOb24gbWV0YWxsaWMgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjA3LjAwI090aGVyIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHdlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjEwLjAwI1RpdGFuaXVtIHdlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4xMS4wMCNXYXNwYWxsb3kgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjEyLjAwI0NvcHBlciB3ZWxkZWQgb3IgYnJhemVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTEuMTMuMDAjQnJhc3Mgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjAwLjAwI1JpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4wMS4wMCNBbHVtaW51bSByaXZldGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTIuMDIuMDAjQ2FyYm9uIHN0ZWVsIHJpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4wMy4wMCNIYXN0YWxsb3kgWCByaXZldGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTIuMDQuMDAjSW5jb25lbCByaXZldGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTIuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHJpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4wNi4wMCNOb24gbWV0YWxsaWMgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjA3LjAwI090aGVyIGZlcnJvdXMgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHJpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjEwLjAwI1RpdGFuaXVtIHJpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4xMS4wMCNXYXNwYWxsb3kgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjEyLjAwI0NvcHBlciByaXZldGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTIuMTMuMDAjQnJhc3Mgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjAwLjAwI1VsdHJhIHZpb2xldCB3ZWxkZWQgKFVWKSBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjAxLjAwI0FsdW1pbnVtIHVsdHJhIHZpb2xldCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMy4wMi4wMCNDYXJib24gc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjAzLjAwI0hhc3RhbGxveSBYIHVsdHJhIHZpb2xldCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMy4wNC4wMCNJbmNvbmVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjA2LjAwI05vbiBtZXRhbGxpYyB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTMuMDcuMDAjT3RoZXIgZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTMuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgdWx0cmEgdmlvbGV0IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjA5LjAwI1N0YWlubGVzcyBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTMuMTAuMDAjVGl0YW5pdW0gdWx0cmEgdmlvbGV0IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjExLjAwI1dhc3BhbGxveSB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTMuMTIuMDAjQ29wcGVyIHVsdHJhIHZpb2xldCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMy4xMy4wMCNCcmFzcyB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMDAuMDAjU29uaWMgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMDEuMDAjQWx1bWludW0gc29uaWMgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjAzLjAwI0hhc3RhbGxveSBYIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjA0LjAwI0luY29uZWwgc29uaWMgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjA2LjAwI05vbiBtZXRhbGxpYyBzb25pYyB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNC4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjA5LjAwI1N0YWlubGVzcyBzdGVlbCBzb25pYyB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNC4xMC4wMCNUaXRhbml1bSBzb25pYyB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNC4xMS4wMCNXYXNwYWxsb3kgc29uaWMgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMTIuMDAjQ29wcGVyIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjEzLjAwI0JyYXNzIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjAwLjAwI1NvbHZlbnQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTUuMDEuMDAjQWx1bWludW0gc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wMi4wMCNDYXJib24gc3RlZWwgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wMy4wMCNIYXN0YWxsb3kgWCBzb2x2ZW50IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjA0LjAwI0luY29uZWwgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wNi4wMCNOb24gbWV0YWxsaWMgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbHZlbnQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTUuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4xMC4wMCNUaXRhbml1bSBzb2x2ZW50IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjExLjAwI1dhc3BhbGxveSBzb2x2ZW50IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjEyLjAwI0NvcHBlciBzb2x2ZW50IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjEzLjAwI0JyYXNzIHNvbHZlbnQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMDAuMDAjQm9uZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMDEuMDAjQWx1bWludW0gYm9uZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMDIuMDAjQ2FyYm9uIHN0ZWVsIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjAzLjAwI0hhc3RhbGxveSBYIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjA0LjAwI0luY29uZWwgYm9uZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMDUuMDAjTG93IGFsbG95IHN0ZWVsIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjA2LjAwI05vbiBtZXRhbGxpYyBib25kZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNi4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib25kZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNi4xMC4wMCNUaXRhbml1bSBib25kZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNi4xMS4wMCNXYXNwYWxsb3kgYm9uZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMTIuMDAjQ29wcGVyIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjEzLjAwI0JyYXNzIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjAwLjAwI0JvbHRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjAxLjAwI0FsdW1pbnVtIGJvbHRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjAyLjAwI0NhcmJvbiBzdGVlbCBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wMy4wMCNIYXN0YWxsb3kgWCBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wNC4wMCNJbmNvbmVsIGJvbHRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjA1LjAwI0xvdyBhbGxveSBzdGVlbCBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wNi4wMCNOb24gbWV0YWxsaWMgYm9sdGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTcuMDcuMDAjT3RoZXIgZmVycm91cyBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wOC4wMCNPdGhlciBub24gZmVycm91cyBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9sdGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTcuMTAuMDAjVGl0YW5pdW0gYm9sdGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTcuMTEuMDAjV2FzcGFsbG95IGJvbHRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjEyLjAwI0NvcHBlciBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4xMy4wMCNCcmFzcyBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4wMC4wMC4wMCNGYWJyaWNhdGVkIHR1YmUgYXNzZW1ibGllcyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wMC4wMCNVbHRyYSB2aW9sZXQgd2VsZGVkIChVVikgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM1LjExLjAxLjAwI0FsdW1pbnVtIHVsdHJhIHZpb2xldCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjExLjAwLjAwCi11bnNwc2M3IzMxLjM1LjExLjAyLjAwI0NhcmJvbiBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wMy4wMCNIYXN0YWxsb3kgWCB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wNC4wMCNJbmNvbmVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjExLjAwLjAwCi11bnNwc2M3IzMxLjM1LjExLjA1LjAwI0xvdyBhbGxveSBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wNi4wMCNOb24gbWV0YWxsaWMgdWx0cmEgdmlvbGV0IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTEuMDcuMDAjT3RoZXIgZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wOC4wMCNPdGhlciBub24gZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTEuMTAuMDAjVGl0YW5pdW0gdWx0cmEgdmlvbGV0IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTEuMTEuMDAjV2FzcGFsbG95IHVsdHJhIHZpb2xldCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjExLjAwLjAwCi11bnNwc2M3IzMxLjM1LjExLjEyLjAwI0NvcHBlciB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4xMy4wMCNCcmFzcyB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4wMC4wMCNXZWxkZWQgb3IgYnJhemVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4wMS4wMCNBbHVtaW51bSB3ZWxkZWQgb3IgYnJhemVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4wMi4wMCNDYXJib24gc3RlZWwgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDMuMDAjSGFzdGFsbG95IFggd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDQuMDAjSW5jb25lbCB3ZWxkZWQgb3IgYnJhemVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDYuMDAjTm9uIG1ldGFsbGljIHdlbGRlZCBvciBicmF6ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEyLjA3LjAwI090aGVyIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEyLjEwLjAwI1RpdGFuaXVtIHdlbGRlZCBvciBicmF6ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEyLjExLjAwI1dhc3BhbGxveSB3ZWxkZWQgb3IgYnJhemVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4xMi4wMCNDb3BwZXIgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMTMuMDAjQnJhc3Mgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMDAuMDAjUml2ZXRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMDEuMDAjQWx1bWludW0gcml2ZXRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMDIuMDAjQ2FyYm9uIHN0ZWVsIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjAzLjAwI0hhc3RhbGxveSBYIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjA0LjAwI0luY29uZWwgcml2ZXRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjA2LjAwI05vbiBtZXRhbGxpYyByaXZldGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMy4wNy4wMCNPdGhlciBmZXJyb3VzIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjA5LjAwI1N0YWlubGVzcyBzdGVlbCByaXZldGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMy4xMC4wMCNUaXRhbml1bSByaXZldGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMy4xMS4wMCNXYXNwYWxsb3kgcml2ZXRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMTIuMDAjQ29wcGVyIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjEzLjAwI0JyYXNzIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjAwLjAwI0JvbmRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTQuMDEuMDAjQWx1bWludW0gYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wMi4wMCNDYXJib24gc3RlZWwgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wMy4wMCNIYXN0YWxsb3kgWCBib25kZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjA0LjAwI0luY29uZWwgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wNi4wMCNOb24gbWV0YWxsaWMgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbmRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTQuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4xMC4wMCNUaXRhbml1bSBib25kZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjExLjAwI1dhc3BhbGxveSBib25kZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjEyLjAwI0NvcHBlciBib25kZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjEzLjAwI0JyYXNzIGJvbmRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMDAuMDAjQm9sdGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNS4wMS4wMCNBbHVtaW51bSBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjAyLjAwI0NhcmJvbiBzdGVlbCBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjAzLjAwI0hhc3RhbGxveSBYIGJvbHRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMDQuMDAjSW5jb25lbCBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjA1LjAwI0xvdyBhbGxveSBzdGVlbCBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjA2LjAwI05vbiBtZXRhbGxpYyBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjA3LjAwI090aGVyIGZlcnJvdXMgYm9sdGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNS4wOC4wMCNPdGhlciBub24gZmVycm91cyBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjEwLjAwI1RpdGFuaXVtIGJvbHRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMTEuMDAjV2FzcGFsbG95IGJvbHRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMTIuMDAjQ29wcGVyIGJvbHRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMTMuMDAjQnJhc3MgYm9sdGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4wMC4wMCNTb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMDEuMDAjQWx1bWludW0gc29sdmVudCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE2LjAyLjAwI0NhcmJvbiBzdGVlbCBzb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMDMuMDAjSGFzdGFsbG95IFggc29sdmVudCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE2LjA0LjAwI0luY29uZWwgc29sdmVudCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE2LjA1LjAwI0xvdyBhbGxveSBzdGVlbCBzb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMDYuMDAjTm9uIG1ldGFsbGljIHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4wOC4wMCNPdGhlciBub24gZmVycm91cyBzb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4xMC4wMCNUaXRhbml1bSBzb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMTEuMDAjV2FzcGFsbG95IHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4xMi4wMCNDb3BwZXIgc29sdmVudCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE2LjEzLjAwI0JyYXNzIHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4wMC4wMCNTb25pYyB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM1LjE3LjAxLjAwI0FsdW1pbnVtIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDMuMDAjSGFzdGFsbG95IFggc29uaWMgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4wNC4wMCNJbmNvbmVsIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDYuMDAjTm9uIG1ldGFsbGljIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDcuMDAjT3RoZXIgZmVycm91cyBzb25pYyB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE3LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMTAuMDAjVGl0YW5pdW0gc29uaWMgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4xMS4wMCNXYXNwYWxsb3kgc29uaWMgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4xMi4wMCNDb3BwZXIgc29uaWMgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4xMy4wMCNCcmFzcyBzb25pYyB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjAwLjAwLjAwI0ZhYnJpY2F0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4wMC4wMCNCb25kZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4wMS4wMCNBbHVtaW51bSBib25kZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4wMi4wMCNDYXJib24gc3RlZWwgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDMuMDAjSGFzdGFsbG95IFggYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDQuMDAjSW5jb25lbCBib25kZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDYuMDAjTm9uIG1ldGFsbGljIGJvbmRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjExLjAwLjAwCi11bnNwc2M3IzMxLjM2LjExLjA3LjAwI090aGVyIGZlcnJvdXMgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIGJvbmRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjExLjAwLjAwCi11bnNwc2M3IzMxLjM2LjExLjEwLjAwI1RpdGFuaXVtIGJvbmRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjExLjAwLjAwCi11bnNwc2M3IzMxLjM2LjExLjExLjAwI1dhc3BhbGxveSBib25kZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4xMi4wMCNDb3BwZXIgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMTMuMDAjQnJhc3MgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMDAuMDAjQm9sdGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMDEuMDAjQWx1bWludW0gYm9sdGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMDIuMDAjQ2FyYm9uIHN0ZWVsIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjAzLjAwI0hhc3RhbGxveSBYIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjA0LjAwI0luY29uZWwgYm9sdGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMDUuMDAjTG93IGFsbG95IHN0ZWVsIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjA2LjAwI05vbiBtZXRhbGxpYyBib2x0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMi4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib2x0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMi4xMC4wMCNUaXRhbml1bSBib2x0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMi4xMS4wMCNXYXNwYWxsb3kgYm9sdGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMTIuMDAjQ29wcGVyIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjEzLjAwI0JyYXNzIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjAwLjAwI1NvbHZlbnQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTMuMDEuMDAjQWx1bWludW0gc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wMi4wMCNDYXJib24gc3RlZWwgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wMy4wMCNIYXN0YWxsb3kgWCBzb2x2ZW50IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjA0LjAwI0luY29uZWwgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wNi4wMCNOb24gbWV0YWxsaWMgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbHZlbnQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTMuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4xMC4wMCNUaXRhbml1bSBzb2x2ZW50IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjExLjAwI1dhc3BhbGxveSBzb2x2ZW50IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjEyLjAwI0NvcHBlciBzb2x2ZW50IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjEzLjAwI0JyYXNzIHNvbHZlbnQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMDAuMDAjV2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjAxLjAwI0FsdW1pbnVtIHdlbGRlZCBvciBicmF6ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNC4wMi4wMCNDYXJib24gc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjAzLjAwI0hhc3RhbGxveSBYIHdlbGRlZCBvciBicmF6ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNC4wNC4wMCNJbmNvbmVsIHdlbGRlZCBvciBicmF6ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNC4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjA2LjAwI05vbiBtZXRhbGxpYyB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMDcuMDAjT3RoZXIgZmVycm91cyB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjA5LjAwI1N0YWlubGVzcyBzdGVlbCB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMTAuMDAjVGl0YW5pdW0gd2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjExLjAwI1dhc3BhbGxveSB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMTIuMDAjQ29wcGVyIHdlbGRlZCBvciBicmF6ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNC4xMy4wMCNCcmFzcyB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDAuMDAjVWx0cmEgdmlvbGV0IHdlbGRlZCAoVVYpIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDEuMDAjQWx1bWludW0gdWx0cmEgdmlvbGV0IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE1LjAyLjAwI0NhcmJvbiBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDMuMDAjSGFzdGFsbG95IFggdWx0cmEgdmlvbGV0IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE1LjA0LjAwI0luY29uZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE1LjA1LjAwI0xvdyBhbGxveSBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDYuMDAjTm9uIG1ldGFsbGljIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNS4wNy4wMCNPdGhlciBmZXJyb3VzIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNS4wOC4wMCNPdGhlciBub24gZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNS4xMC4wMCNUaXRhbml1bSB1bHRyYSB2aW9sZXQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMTEuMDAjV2FzcGFsbG95IHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNS4xMi4wMCNDb3BwZXIgdWx0cmEgdmlvbGV0IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE1LjEzLjAwI0JyYXNzIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4wMC4wMCNTb25pYyB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4wMS4wMCNBbHVtaW51bSBzb25pYyB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4wMi4wMCNDYXJib24gc3RlZWwgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDMuMDAjSGFzdGFsbG95IFggc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDQuMDAjSW5jb25lbCBzb25pYyB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDYuMDAjTm9uIG1ldGFsbGljIHNvbmljIHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE2LjA3LjAwI090aGVyIGZlcnJvdXMgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHNvbmljIHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE2LjEwLjAwI1RpdGFuaXVtIHNvbmljIHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE2LjExLjAwI1dhc3BhbGxveSBzb25pYyB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4xMi4wMCNDb3BwZXIgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMTMuMDAjQnJhc3Mgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMDAuMDAjUml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjAxLjAwI0FsdW1pbnVtIHJpdmV0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNy4wMi4wMCNDYXJib24gc3RlZWwgcml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjAzLjAwI0hhc3RhbGxveSBYIHJpdmV0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNy4wNC4wMCNJbmNvbmVsIHJpdmV0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgcml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjA2LjAwI05vbiBtZXRhbGxpYyByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMDcuMDAjT3RoZXIgZmVycm91cyByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgcml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjA5LjAwI1N0YWlubGVzcyBzdGVlbCByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMTAuMDAjVGl0YW5pdW0gcml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjExLjAwI1dhc3BhbGxveSByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMTIuMDAjQ29wcGVyIHJpdmV0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNy4xMy4wMCNCcmFzcyByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMDAuMDAuMDAjUmVmcmFjdG9yaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEwLjAwLjAwI0NlcmFtaWMgZmlicmUgcHJvZHVjdHMjMzEuMzcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTAuMDEuMDAjSW5zdWxhdGlvbiBib2FyZHMjMzEuMzcuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTAuMDIuMDAjSW5zdWxhdGluZyB3b29sIzMxLjM3LjEwLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjAwLjAwI1JlZnJhY3RvcnkgYnJpY2tzIzMxLjM3LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjAxLjAwI011bGxpdGUgYnJpY2tzIzMxLjM3LjExLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjAyLjAwI1NpbGxpbWFuaXRlIGJyaWNrcyMzMS4zNy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMS4wMy4wMCNBY2lkIHJlc2lzdGFudCBicmlja3MjMzEuMzcuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTEuMDQuMDAjU2lsaWNhIGJyaWNrcyMzMS4zNy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMS4wNS4wMCNIaWdoIGFsdW1pbmEgYnJpY2tzIzMxLjM3LjExLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjA2LjAwI0NhbGNpdW0gc2lsaWNhdGUgYmxvY2tzIzMxLjM3LjExLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjA3LjAwI1NoYXBlZCBicmlja3MjMzEuMzcuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTIuMDAuMDAjQ2FzdGFibGVzIzMxLjM3LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEyLjAxLjAwI0RlbnNlIGNhc3RhYmxlcyMzMS4zNy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMi4wMi4wMCNJbnN1bGF0aW5nIGNhc3RhYmxlcyMzMS4zNy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMi4wMy4wMCNMb3cgY2VtZW50IGNhc3RhYmxlcyMzMS4zNy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMi4wNC4wMCNBY2lkIG9yIGFsa2FsaSByZXNpc3RhbnQgY2FzdGFibGUjMzEuMzcuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTIuMDUuMDAjQWJyYXNpb24gcmVzaXN0YW50IGNhc3RhYmxlIzMxLjM3LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEyLjA2LjAwI1NpYyBjYXN0YWJsZSMzMS4zNy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMi4wNy4wMCNTZWxmIGZsb3cgY2FzdGFibGUjMzEuMzcuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTIuMDguMDAjVGFidWxhciBhbHVtaW5hIGNhc3RhYmxlIzMxLjM3LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEyLjA5LjAwI0Vyb3Npb24gcmVzaXN0YW50IGNhc3RhYmxlIzMxLjM3LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEzLjAwLjAwI1NoYXBlZCByZWZyYWN0b3JpZXMjMzEuMzcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTMuMDEuMDAjUG9yb3VzIGJsb2NrcyMzMS4zNy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMy4wMi4wMCNaaXJjb24gbm96emxlcyMzMS4zNy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zOC4wMC4wMC4wMCNNYWduZXRzIGFuZCBtYWduZXRpYyBtYXRlcmlhbHMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzguMTAuMDAuMDAjUGVybWFuZW50IG1hZ25ldHMjMzEuMzguMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzguMTAuMDEuMDAjTG9kZSBzdG9uZSMzMS4zOC4xMC4wMC4wMAotdW5zcHNjNyMzMS4zOC4xMC4wMi4wMCNBbG5pY28gbWFnbmV0cyMzMS4zOC4xMC4wMC4wMAotdW5zcHNjNyMzMi4wMC4wMC4wMC4wMCNFbGVjdHJvbmljIENvbXBvbmVudHMgYW5kIFN1cHBsaWVzIzMyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMyLjEwLjAwLjAwLjAwI1ByaW50ZWQgY2lyY3VpdHMgYW5kIGludGVncmF0ZWQgY2lyY3VpdHMgYW5kIG1pY3JvYXNzZW1ibGllcyMzMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNS4wMC4wMCNQcmludGVkIGNpcmN1aXRzIGFuZCBjaXJjdWl0IGNhcmQgYXNzZW1ibGllcyMzMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNS4wMS4wMCNCYXJlIHByaW50ZWQgY2lyY3VpdCBib2FyZHMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTUuMDIuMDAjUHJpbnRlZCBjaXJjdWl0IGFzc2VtYmxpZXMgKFBDQXMpIzMyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE1LjAzLjAwI01peGVkIGNpcmN1aXQgYXNzZW1ibGllcyMzMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNS4wNC4wMCNTdXJmYWNlIG1vdW50IGNpcmN1aXQgYXNzZW1ibGllcyMzMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNS4wNS4wMCNQbGF0ZWQgdGhyb3VnaCBjaXJjdWl0IGFzc2VtYmxpZXMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTUuMDYuMDAjRG91YmxlIHNpZGVkIGNpcmN1aXQgY2FyZHMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTUuMDcuMDAjQmFja3BsYW5lIGNpcmN1aXQgY2FyZHMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTUuMDguMDAjTXVsdGlsYXllciBjaXJjdWl0IGNhcmRzIzMyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE1LjA5LjAwI1NpbmdsZSBzaWRlZCBjaXJjdWl0IGNhcmRzIzMyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE1LjEwLjAwI1ByaW50ZWQgd2lyZSBib2FyZHMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDAuMDAjRWxlY3Ryb25pYyBjb21wb25lbnRzIGZvciBtZW1vcnkgb3Igc21hcnQgY2FyZHMjMzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDEuMDAjUmFuZG9tIGFjY2VzcyBtZW1vcnkgKFJBTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDIuMDAjRHluYW1pYyByYW5kb20gYWNjZXNzIG1lbW9yeSAoRFJBTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDMuMDAjU3RhdGljIHJhbmRvbSBhY2Nlc3MgbWVtb3J5IChTUkFNKSMzMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNi4wNC4wMCNQcm9ncmFtbWFibGUgcmVhZCBvbmx5IG1lbW9yeSAoUFJPTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDUuMDAjRXJhc2VhYmxlIHByb2dyYW1tYWJsZSByZWFkIG9ubHkgbWVtb3J5IChFUFJPTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDYuMDAjRWxlY3Ryb25pY2FsbHkgZXJhc2VhYmxlIHByb2dyYW1tYWJsZSByZWFkIG9ubHkgbWVtb3J5IChFRVBST00pIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjA3LjAwI01vbm9saXRpaGMgbWVtb3J5IGludGVncmF0ZWQgY2lyY3VpdHMgKE1NSUMpIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjA4LjAwI1JlYWQgb25seSBtZW1vcnkgKFJPTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDkuMDAjQXBwbGljYXRpb24gc3BlY2lmaWMgaW50ZWdyYXRlZCBjaXJjdWl0cyAoQVNJQykjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTAuMDAjVGhpbiBxdWFkIGZsYXQgcGFjayAoVFFGUCkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTEuMDAjUHJvZ3JhbW1hYmxlIGFycmF5IGxvZ2ljIChQQUwpIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjEyLjAwI0dhdGUgYXJyYXkgbG9naWMgKEdBTCkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTMuMDAjVHJhbnNpc3RvciB0cmFuc2lzdG9yIGxvZ2ljIChUVEwpIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjE0LjAwI0VtaXR0ZXIgY291cGxlZCBsb2dpYyAoRUNMKSMzMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNi4xNS4wMCNCaXBvbGFyIG9yIG1ldGFsIG94aWRlIHNlbWljb25kdWN0b3IgdGVjaG5vbG9neSAoQklNT1MpIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjE2LjAwI0JpcG9sYXIgY29tcGxlbWVudGFyeSBtZXRhbCBveGlkZSBzZW1pY29uZHVjdG9yIHRlY2hub2xvZ3kgKEJJQ01PUykjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTcuMDAjU21hcnQgY2FyZHMjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTguMDAjVXBzY3JlZW5lZCBpbnRlZ3JhdGVkIGNpcmN1aXRzIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjE5LjAwI0xpbmVhciBpbnRlZ3JhdGVkIGNpcmN1aXRzIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjIwLjAwI0RpZ2l0YWwgaW50ZWdyYXRlZCBjaXJjdWl0cyMzMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNi4yMS4wMCNTeW5jaHJvbm91cyBkeW5hbWljIHJhbmRvbSBhY2Nlc3MgbWVtb3J5IChTRFJBTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMjIuMDAjRmxhc2ggbWVtb3J5IzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjIzLjAwI1JhbWJ1cyBkeW5hbWljIHJhbmRvbSBhY2Nlc3MgbWVtb3J5UkRSQU0jMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMjQuMDAjU3luY2hyb25vdXMgZ3JhcGhpYyByYW5kb20gYWNjZXNzIG1lbW9yeSBTR1JBTSMzMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNy4wMC4wMCNIeWJyaWQgaW50ZWdyYXRlZCBjaXJjdWl0cyMzMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNy4wMS4wMCNNaWNyb3Byb2Nlc3NvcnMjMzIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTcuMDIuMDAjQ2xvY2sgb3NjaWxsYXRvcnMjMzIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTcuMDMuMDAjTWljcm9jb250cm9sbGVycyMzMi4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMC4xOC4wMC4wMCNVbm1vdW50ZWQgaW50ZWdyYXRlZCBjaXJjdWl0cyMzMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xOC4wMS4wMCNVbm1vdW50ZWQgZGllcyMzMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xOC4wMi4wMCNVbm1vdW50ZWQgd2FmZXJzIzMyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE4LjAzLjAwI1VubW91bnRlZCBjaGlwcyMzMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMi4xMS4wMC4wMC4wMCNEaW9kZXMgYW5kIHRyYW5zaXN0b3JzIGFuZCBzZW1pY29uZHVjdG9yIGRldmljZXMjMzIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDAuMDAjRGlvZGVzIzMyLjExLjAwLjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjAxLjAwI01pY3Jvd2F2ZSBkaW9kZXMjMzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDIuMDAjWmVuZXIgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjAzLjAwI0xpZ2h0IGVtaXR0aW5nIGRpb2RlcyAoTEVEcykjMzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDQuMDAjU2Nob3R0a3kgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjA1LjAwI1R1bm5lbCBkaW9kZXMjMzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDYuMDAjUGhvdG9zZW5zaXRpdmUgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjA3LjAwI1ZhcmlhYmxlIGNhcGFjaXRhbmNlIGRpb2RlcyMzMi4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNS4wOC4wMCNTb2xhciBkaW9kZXMjMzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDkuMDAjUG93ZXIgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjEwLjAwI1JhZGlvIGZyZXF1ZW5jeSAoUkYpIGRpb2RlcyMzMi4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNS4xMS4wMCNTbWFsbCBzaWduYWwgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjAwLjAwI1RyYW5zaXN0b3JzIzMyLjExLjAwLjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjAxLjAwI1Bob3RvIHNlbnNpdGl2ZSB0cmFuc2lzdG9ycyMzMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNi4wMi4wMCNGaWVsZCBlZmZlY3QgdHJhbnNpc3RvcnMgKEZFVCkjMzIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTYuMDMuMDAjTWV0YWwgb3hpZGUgc2lsaWNvbmUgZmllbGQgZWZmZWN0IHRyYW5zaXN0b3JzIChNT1NGRVQpIzMyLjExLjE2LjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjA0LjAwI1RyYW5zaXN0b3IgY2hpcHMjMzIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTYuMDUuMDAjVHJhbnNpc3RvciBkaWVzIzMyLjExLjE2LjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjA2LjAwI1RyYW5zaXN0b3Igd2FmZXJzIzMyLjExLjE2LjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjA3LjAwI0JpcG9sYXIgZGFybGluZ3RvbiBvciByYWRpbyBmcmVxdWVuY3kgKFJGKSB0cmFuc2lzdG9ycyMzMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNi4wOC4wMCNVbmlqdW5jdGlvbiB0cmFuc2lzdG9ycyMzMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNi4wOS4wMCNJbnN1bGF0ZWQgZ2F0ZSBiaXBvbGFyIHRyYW5zaXN0b3JzIChJR0JUKSMzMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNi4xMC4wMCNKdW5jdGlvbiBmaWVsZCBlZmZlY3QgdHJhbnNpc3RvcnMgKEpGRVQpIzMyLjExLjE2LjAwLjAwCi11bnNwc2M3IzMyLjExLjE3LjAwLjAwI1NlbWljb25kdWN0b3IgZGV2aWNlcyMzMi4xMS4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNy4wMS4wMCNQaG90b3ZvbHRhaWMgY2VsbHMjMzIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTcuMDIuMDAjVGh5cmlzdG9ycyMzMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNy4wMy4wMCNEaWFjcyMzMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNy4wNC4wMCNUcmlhY3MjMzIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTcuMDUuMDAjT3B0aWNhbCBjb3VwbGVkIGlzb2xhdG9ycyMzMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNy4wNi4wMCNDcnlzdGFsIG9zY2lsbGF0b3JzIzMyLjExLjE3LjAwLjAwCi11bnNwc2M3IzMyLjExLjE4LjAwLjAwI0ludGVncmF0ZWQgY2lyY3VpdCBjb21wb25lbnRzIzMyLjExLjAwLjAwLjAwCi11bnNwc2M3IzMyLjExLjE4LjAxLjAwI0ludGVyZ3JhdGVkIGNpcmN1aXQgbGlkcyMzMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOC4wMi4wMCNJbnRlZ3JhdGVkIGNpcmN1aXQgcGFja2FnZXMjMzIuMTEuMTguMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTguMDMuMDAjU3Vic3RyYXRlcyMzMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4wMC4wMCNSYWRpbyBmcmVxdWVuY3kgKFJGKSBjb21wb25lbnRzIzMyLjExLjAwLjAwLjAwCi11bnNwc2M3IzMyLjExLjE5LjAxLjAwI0FtcGxpZmllcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDIuMDAjQXR0ZW51YXRvcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDMuMDAjQ2lyY3VsYXRvcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDQuMDAjQ291cGxlcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDUuMDAjRGVsYXkgbGluZXMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDYuMDAjRGV0ZWN0b3JzIzMyLjExLjE5LjAwLjAwCi11bnNwc2M3IzMyLjExLjE5LjA3LjAwI0R1bW15IGxvYWRzIzMyLjExLjE5LjAwLjAwCi11bnNwc2M3IzMyLjExLjE5LjA4LjAwI1JhZGlvIGZyZXF1ZW5jeSAoUkYpIGZpbHRlcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDkuMDAjSXNvbGF0b3JzIzMyLjExLjE5LjAwLjAwCi11bnNwc2M3IzMyLjExLjE5LjEwLjAwI01peGVycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4xMS4wMCNQaGFzZSBzaGlmdGVycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4xMi4wMCNQb3dlciBkaXZpZGVycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4xMy4wMCNXYXZlIHR1YmUgYW1wbGlmaWVycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4xNC4wMCNUZXJtaW5hdGlvbnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMTUuMDAjTW9kdWxhdG9ycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMi4wMC4wMC4wMCNQcmludGVkIGNvbXBvbmVudHMjMzIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTUuMDAuMDAjQ2FwYWNpdG9ycyMzMi4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNS4wMS4wMCNGaXhlZCBjYXBhY2l0b3JzIzMyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE1LjAyLjAwI1ZhcmlhYmxlIGNhcGFjaXRvcnMgb3IgdmFyYWN0b3JzIzMyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE1LjAzLjAwI0FkanVzdGFibGUgcHJlIHNldCBjYXBhY2l0b3JzIzMyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE1LjA0LjAwI0NhcGFjaXRvciBuZXR3b3JrcyMzMi4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNi4wMC4wMCNSZXNpc3RvcnMjMzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTYuMDEuMDAjVGhlcm1pc3RvcnMjMzIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTYuMDIuMDAjRnVzaXN0b3JzIzMyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE2LjAzLjAwI1ZhcmlhYmxlIHJlc2lzdG9ycyBvciB2YXJpc3RvcnMjMzIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTYuMDQuMDAjRml4ZWQgY2FyYm9uIHJlc2lzdG9ycyMzMi4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNi4wNS4wMCNGaXhlZCB0aGljayBmaWxtIHJlc2lzdG9ycyMzMi4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNi4wNi4wMCNGaXhlZCB0aGluIGZpbG0gcmVzaXN0b3JzIzMyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE2LjA3LjAwI1Jlc2lzdG9yIG5ldHdvcmtzIzMyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE2LjA4LjAwI1dpcmUgd291bmQgcmVzaXN0b3JzIzMyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE3LjAwLjAwI0Rpc2NyZXRlIGNvbXBvbmVudHMjMzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTcuMDEuMDAjUmVjdGlmaWVycyMzMi4xMi4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNy4wMi4wMCNJbmR1Y3RvcnMjMzIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTcuMDMuMDAjRmVycml0ZXMjMzIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTcuMDQuMDAjU3RhdGljIGNvbnZlcnRlcnMjMzIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTcuMDUuMDAjSW52ZXJ0ZXJzIzMyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE3LjA2LjAwI1Jlc2lzdG9yIG9yIGNhcGFjaXRvciAoUi9DKSBuZXR3b3JrcyMzMi4xMi4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMy4wMC4wMC4wMCNQYXNzaXZlIGNvbXBvbmVudHMjMzIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTMuMTAuMDAuMDAjVGVtcGVyYXR1cmUgY29udHJvbHMjMzIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTMuMTAuMDEuMDAjSGVhdCBzaW5rcyMzMi4xMy4xMC4wMC4wMAotdW5zcHNjNyMzOS4wMC4wMC4wMC4wMCNMaWdodGluZyBhbmQgRWxlY3RyaWNhbCBBY2Nlc3NvcmllcyBhbmQgU3VwcGxpZXMjMzkuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMDAuMDAuMDAjTGFtcHMgYW5kIGxpZ2h0YnVsYnMgYW5kIGxhbXAgY29tcG9uZW50cyMzOS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4wMC4wMCNMYW1wcyMzOS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4wMS4wMCNIYWxvZ2VuIGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjAyLjAwI01lZGljYWwgbGFtcHMjMzkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTYuMDMuMDAjU29sYXIgbGFtcHMjMzkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTYuMDQuMDAjQWxjb2hvbCBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4wNS4wMCNGbHVvcmVzY2VudCBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4wNi4wMCNBcmMgbGFtcHMjMzkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTYuMDguMDAjU2hhZG93bGVzcyBvciBzY2lhbHl0aWMgb3BlcmF0aW9uIGxpZ2h0IzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjA5LjAwI1N0YWdlIG9yIHN0dWRpbyBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4xMC4wMCNGaWxhbWVudCBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4xMS4wMCNIaWdoIGludGVuc2l0eSBkaXNjaGFyZ2UgKEhJRCkgbGFtcHMjMzkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTYuMTIuMDAjSW5jYW5kZXNjZW50IGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjEzLjAwI0luZnJhcmVkIGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjE0LjAwI01ldGFsIGhhbGlkZSBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4xNS4wMCNWYXBvciBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4xNi4wMCNVbHRyYXZpb2xldCAoVVYpIGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjE3LjAwI0hpZ2ggcHJlc3N1cmUgc29kaXVtIGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE3LjAwLjAwI0J1bGIgZ2xhc3MjMzkuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTcuMDEuMDAjRmx1b3Jlc2NlbnQgdHViZXMjMzkuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTguMDAuMDAjTGFtcCBjb21wb25lbnRzIzM5LjEwLjAwLjAwLjAwCi11bnNwc2M3IzM5LjEwLjE4LjAxLjAwI0xhbXAgZmlsYW1lbnQjMzkuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTkuMDAuMDAjTW9iaWxlIGFuZCBmaXhlZCBmbG9vZGxpZ2h0aW5nIzM5LjEwLjAwLjAwLjAwCi11bnNwc2M3IzM5LjEwLjE5LjAxLjAwI0xpZ2h0IHRvd2VyIzM5LjEwLjE5LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE5LjAyLjAwI0xpZ2h0IGNhcnQjMzkuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTkuMDMuMDAjTGlnaHQgc3RhbmQjMzkuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMDAuMDAuMDAjTGlnaHRpbmcgYW5kIGZpeHR1cmVzIGFuZCBhY2Nlc3NvcmllcyMzOS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4wMC4wMCNJbnRlcmlvciBsaWdodGluZyBhbmQgZml4dHVyZXMjMzkuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDEuMDAjRmx1b3Jlc2NlbnQgZml4dHVyZXMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDIuMDAjVmFuaXR5IGxpZ2h0aW5nIzM5LjExLjE1LjAwLjAwCi11bnNwc2M3IzM5LjExLjE1LjAzLjAwI1dhbGwgZml4dHVyZXMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDQuMDAjU3RhZ2Ugb3Igc3R1ZGlvIGxpZ2h0aW5nIHN5c3RlbXMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDUuMDAjUmVjZXNzZWQgbGlnaHRpbmcjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDYuMDAjQ2hhbmRlbGllcnMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDcuMDAjRGVzayBmaXh0dXJlcyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4wOC4wMCNUcmFjayBsaWdodGluZyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4wOS4wMCNGbG9vciB0b3JjaGllcmUjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMTAuMDAjVGFibGUgbGFtcHMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMTEuMDAjRGVjb3JhdGl2ZSBsaWdodGluZyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xMi4wMCNMYWJvcmF0b3J5IGJlbmNoIGxpZ2h0cyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xMy4wMCNJbnRlcmlvciBzb2xhciBsaWdodGluZyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xNC4wMCNUcmVlIGxpZ2h0cyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xNS4wMCNEb3dubGlnaHRpbmcgZml4dHVyZXMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMTYuMDAjVGFzayBsaWdodGluZyBmaXh0dXJlcyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xNy4wMCNXYXggY2FuZGxlcyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xOC4wMCNIYW5kIG9yIGV4dGVuc2lvbiBsaWdodCMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xOS4wMCNDYW5kbGUgaG9sZGVycyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4yMC4wMCNIYWxvZ2VuIGxpZ2h0aW5nIGZpeHR1cmVzIzM5LjExLjE1LjAwLjAwCi11bnNwc2M3IzM5LjExLjE2LjAwLjAwI0V4dGVyaW9yIGxpZ2h0aW5nIGFuZCBmaXh0dXJlcyMzOS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNi4wMy4wMCNSb2Fkd2F5IG9yIGhpZ2h3YXkgbGlnaHRpbmcjMzkuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTYuMDUuMDAjTGFuZHNjYXBlIG9yIGFyZWEgbGlnaHRpbmcjMzkuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTYuMDYuMDAjVW5kZXJ3YXRlciBsaWdodGluZyMzOS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNi4wOC4wMCNSZXNpZGVudGlhbCBzdHJlZXQgbGlnaHRzIzM5LjExLjE2LjAwLjAwCi11bnNwc2M3IzM5LjExLjE2LjA5LjAwI0tlcm9zZW5lIG9yIHByb3BhbmUgb3IgYnV0YW5lIGxhbnRlcm5zIzM5LjExLjE2LjAwLjAwCi11bnNwc2M3IzM5LjExLjE3LjAwLjAwI0VtZXJnZW5jeSBsaWdodGluZyMzOS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNy4wMi4wMCNGbGFzaGxpZ2h0cyMzOS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNy4wMy4wMCNTdG9ybSBsaWdodHMjMzkuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTcuMDQuMDAjRmxvb2QgbGlnaHRzIzM5LjExLjE3LjAwLjAwCi11bnNwc2M3IzM5LjExLjE3LjA1LjAwI0xpZ2h0IHN0aWNrcyMzOS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4wMC4wMCNMaWdodGluZyBhY2Nlc3NvcmllcyMzOS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4wMS4wMCNMYW1wIGJhbGxhc3RzIzM5LjExLjE4LjAwLjAwCi11bnNwc2M3IzM5LjExLjE4LjAyLjAwI0xhbXAgaG91c2luZ3MjMzkuMTEuMTguMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTguMDMuMDAjTGFtcCBzb2NrZXRzIzM5LjExLjE4LjAwLjAwCi11bnNwc2M3IzM5LjExLjE4LjA0LjAwI0xhbXAgYmFzZXMjMzkuMTEuMTguMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTguMDUuMDAjTGFtcCBicmFja2V0cyMzOS4xMS4xOC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4wNi4wMCNMaWdodCBib3hlcyMzOS4xMS4xOC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4wOC4wMCNHcmlsbGVzIzM5LjExLjE4LjAwLjAwCi11bnNwc2M3IzM5LjExLjE4LjA5LjAwI0xpZ2h0IGNvbmRpdGlvbmVyIGZpbHRlcnMjMzkuMTEuMTguMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTguMTAuMDAjTGFtcCBzdGFydGVyIzM5LjExLjE4LjAwLjAwCi11bnNwc2M3IzM5LjExLjE4LjExLjAwI0VsZWN0cmlmaWVkIHRyYWNrcyMzOS4xMS4xOC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4xMi4wMCNMYW1wIGNvdmVycyMzOS4xMS4xOC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOS4wMC4wMCNIYXphcmRvdXMgbG9jYXRpb24gbGlnaHRpbmcgYW5kIGZpeHR1cmVzIzM5LjExLjAwLjAwLjAwCi11bnNwc2M3IzM5LjExLjE5LjAxLjAwI0hhemFyZG91cyBsb2NhdGlvbiBmbG91cmVzY2VudCBmaXh0dXJlcyMzOS4xMS4xOS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOS4wMi4wMCNIYXphcmRvdXMgbG9jYXRpb24gaW5jYW5kZXNjZW50IGZpeHR1cmVzIzM5LjExLjE5LjAwLjAwCi11bnNwc2M3IzQwLjAwLjAwLjAwLjAwI0Rpc3RyaWJ1dGlvbiBhbmQgQ29uZGl0aW9uaW5nIFN5c3RlbXMgYW5kIEVxdWlwbWVudCBhbmQgQ29tcG9uZW50cyM0MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xMC4wMC4wMC4wMCNIZWF0aW5nIGFuZCB2ZW50aWxhdGlvbiBhbmQgYWlyIGNpcmN1bGF0aW9uIzQwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjAwLjAwI1ZlbnRpbGF0aW9uIzQwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjAxLjAwI0FpciBjb2xsZWN0b3JzIzQwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjAyLjAwI0FpciBleGhhdXN0ZXJzIzQwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjAzLjAwI1ZlbnRzIzQwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjA0LjAwI1ZlbnRpbGF0aW9uIGRhbXBlcnMjNDAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTUuMDUuMDAjQWlyIGRpZmZ1c2VycyM0MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNS4wNi4wMCNWZW50aWxhdGlvbiBwaXBlcyM0MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNi4wMC4wMCNBaXIgY2lyY3VsYXRpb24jNDAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTYuMDEuMDAjQmxvd2VycyM0MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNi4wMi4wMCNBaXIgY2lyY3VsYXRvcnMjNDAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTYuMDMuMDAjSW1wZWxsZXJzIzQwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE2LjA0LjAwI0ZhbnMjNDAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTcuMDAuMDAjQ29vbGluZyM0MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNy4wMS4wMCNBaXIgY29uZGl0aW9uZXJzIzQwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE3LjAyLjAwI0Nvb2xpbmcgZXhjaGFuZ2VycyM0MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNy4wMy4wMCNFdmFwb3JhdGl2ZSBjb29sZXJzIzQwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE3LjA0LjAwI0NvbmRlbnNpbmcgdW5pdHMjNDAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMDAuMDAjSGVhdGluZyBlcXVpcG1lbnQjNDAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMDEuMDAjUmFkaWF0b3JzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjAyLjAwI0hlYXQgZXhjaGFuZ2VycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4wMy4wMCNGaXJlcGxhY2VzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjA0LjAwI0hlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMDUuMDAjRnVybmFjZXMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMDYuMDAjSGVhdCBwdW1wcyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4wNy4wMCNTb2xhciBoZWF0aW5nIHVuaXRzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjA4LjAwI0hlYXRpbmcgc3RvdmVzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjA5LjAwI0NpcmN1bGF0aW9uIGhlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMTAuMDAjQ29pbCBkdWN0IGhlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMTEuMDAjQ29udmVjdGlvbiBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjEyLjAwI0RpdmlkZWQgZXhjaGFuZ2VycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4xMy4wMCNEb3VibGUgc3BsaXQgZXhjaGFuZ2VycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4xNC4wMCNGaW5uZWQgdHVidWxhciBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjE1LjAwI0ltbWVyc2lvbiBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjE2LjAwI0tldHRsZSBleGNoYW5nZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjE3LjAwI09uZSBwYXNzIGV4Y2hhbmdlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMTguMDAjUHJvY2VzcyBhaXIgaGVhdGVycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4xOS4wMCNTcGFjZSBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjIwLjAwI1NwbGl0IGV4Y2hhbmdlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMjEuMDAjU3RyaXAgaGVhdGVycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4yMi4wMCNUdWJ1bGFyIGhlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMjMuMDAjVHdvIHBhc3MgZXhjaGFuZ2VycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4yNC4wMCNRdWFydHogaGVhdGVyIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjI1LjAwI0RvbWVzdGljIHdhdGVyIGhlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMjYuMDAjQ29tbWVyY2lhbCB3YXRlciBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE5LjAwLjAwI0h1bWlkaXR5IGNvbnRyb2wjNDAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTkuMDEuMDAjVmFwb3JpemVycyM0MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOS4wMi4wMCNEZWh1bWlkaWZpZXJzIzQwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE5LjAzLjAwI0h1bWlkaWZpZXJzIzQwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQwLjEwLjIwLjAwLjAwI0JvaWxlcnMjNDAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMjAuMDEuMDAjRmlyZSB0dWJlIGJvaWxlcnMjNDAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMjAuMDIuMDAjV2F0ZXIgdHViZSBib2lsZXIjNDAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMjAuMDMuMDAjRWxlY3RyaWMgYm9pbGVycyM0MC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4wMC4wMC4wMCNGbHVpZCBhbmQgZ2FzIGRpc3RyaWJ1dGlvbiM0MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNS4wMC4wMCNGbHVpZCBhbmQgZ2FzIGNvbmR1aXRzIzQwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjE1LjAyLjAwI0R1Y3RzIzQwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE1LjA0LjAwI0hvc2VzIzQwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjAwLjAwI1ZhbHZlcyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4wMS4wMCNDaGVjayB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMDIuMDAjTmVlZGxlIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4wMy4wMCNQbmV1bWF0aWMgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjA0LjAwI1NhZmV0eSB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMDUuMDAjU29sZW5vaWQgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjA2LjAwI1JlbGllZiB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMDcuMDAjQmFsbCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMDguMDAjSHlkcmF1bGljIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4wOS4wMCNDb250cm9sIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4xMC4wMCNGbG9hdCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMTEuMDAjR2xvYmUgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjEyLjAwI0V4cGFuc2lvbiB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMTMuMDAjR2F0ZSB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMTQuMDAjQnV0dGVyZmx5IHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4xNS4wMCNGbGFwIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4xNi4wMCNWYWx2ZSBwYXJ0cyBhbmQgYWNjZXNzb3JpZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMTcuMDAjQW5nbGUgZ2xvYmUgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjE4LjAwI0JhbGwgY2hlY2sgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjE5LjAwI0J1dHRlcmZseSBsdWcgcGF0dGVybiB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMjAuMDAjQnV0dGVyZmx5IHdhZmVyIHBhdHRlcm4gdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjIxLjAwI0RpYXBocmFnbSB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMjIuMDAjSW5saW5lIGNoZWNrIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4yMy4wMCNLbmlmZSBnYXRlIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4yNC4wMCNMdWJyaWNhdGVkIHBsdWcgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjI1LjAwI011ZCBvciBzbHVzaCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMjYuMDAjTm9ubHVicmljYXRlZCBwbHVnIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4yNy4wMCNPcmlmaWNlIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4yOC4wMCNQaWxvdCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMjkuMDAjUGluY2ggdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjMwLjAwI1Bpc3RvbiBjaGVjayB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMzEuMDAjUHVtcCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMzIuMDAjU2VudGluZWwgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjMzLjAwI1NsaWRlciB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMzQuMDAjU3dpbmcgY2hlY2sgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjM1LjAwI1R1cmJpbmUgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjM2LjAwI1ZhbHZlIGtpdHMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMzcuMDAjV2FmZXIgY2hlY2sgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjAwLjAwI0hhcmR3YXJlIGFuZCBmaXR0aW5ncyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wMS4wMCNEcmFpbnMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMDIuMDAjRmF1Y2V0cyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wMy4wMCNTaG93ZXIgaGVhZHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMDQuMDAjU3BpZ290cyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wNS4wMCNTcG91dHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMDYuMDAjUGlwZSBwbHVncyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wNy4wMCNQaXBlIGNsYW1wcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wOC4wMCNMaXF1aWQgdHJhcHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMDkuMDAjU3RlYW0gdHJhcHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMTAuMDAjUGx1bWJpbmcgZmxhbmdlcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4xMS4wMCNNZXRhbCBvciBydWJiZXIgZXhwYW5zaW9uIGpvaW50cyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4xMi4wMCNQaXBlIGNhcHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMTMuMDAjUGx1bWJpbmcgdW5pb25zIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjE0LjAwI1BsdW1iaW5nIGNyb3NzZXMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMTUuMDAjUGx1bWJpbmcgbmlwcGxlcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4xNi4wMCNQIHRyYXBzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjE3LjAwI1BpcGUgYmVuZHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMTguMDAjUGx1bWJpbmcgZWxib3dzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjE5LjAwI1BsdW1iaW5nIGFkYXB0ZXJzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjIwLjAwI1BsdW1iaW5nIGNvbm5lY3RvcnMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMjEuMDAjUGx1bWJpbmcgY291cGxpbmdzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjIyLjAwI0hhbGYgY291cGxpbmdzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjIzLjAwI1JlZHVjaW5nIGNvdXBsaW5ncyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4yNC4wMCNQbHVtYmluZyBidXNoaW5ncyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4yNS4wMCNQbHVtYmluZyBoYW5nZXJzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjI2LjAwI0h5ZHJhbnRzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjI3LjAwI1BsdW1iaW5nIHZlbnRzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjI4LjAwI0ZsdWlkIHJlZ3VsYXRvcnMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMjkuMDAjUGx1bWJpbmcgdGVlcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zMC4wMCNTdHJhaW5lcnMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMzEuMDAjTm96emxlcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zMi4wMCNQbHVtYmluZyBzcGlkZXJzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjMzLjAwI1BpcGUgZml0dGluZyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zNC4wMCNIb3NlIGZpdHRpbmcjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMzUuMDAjRnVubmVscyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zNi4wMCNHcmVhc2UgZml0dGluZyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zNy4wMCNEaWFwaHJhZ21zIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjAwLjAwI1R1YmUgYW5kIHR1YmluZyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4wMS4wMCNGZXJyb3VzIGFsbG95IHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4wMi4wMCNDb3BwZXIgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjAzLjAwI1RpdGFuaXVtIHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4wNC4wMCNNYWduZXNpdW0gdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjA1LjAwI1RpbiB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMDYuMDAjQnJhc3MgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjA3LjAwI0xlYWQgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjA4LjAwI0Jyb256ZSB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMDkuMDAjWmluYyB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTAuMDAjU3RlZWwgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjExLjAwI0lyb24gdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjEyLjAwI0NlbWVudCB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTMuMDAjUGxhc3RpYyB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTQuMDAjUnViYmVyIHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4xNS4wMCNHbGFzcyB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTYuMDAjU3RvbmUgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjE3LjAwI05vbiBmZXJyb3VzIGFsbG95IHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4xOC4wMCNBbHVtaW51bSB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTkuMDAjU3RhaW5sZXNzIHN0ZWVsIHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4yMC4wMCNQcmVjaW91cyBtZXRhbCB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMjEuMDAjTnlsb24gdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE5LjAwLjAwI0R1Y3RzIzQwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjE5LjAxLjAwI0ZsZXhpYmxlIGR1Y3RzIzQwLjE0LjE5LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE5LjAyLjAwI1JpZ2lkIGR1Y3RzIzQwLjE0LjE5LjAwLjAwCi11bnNwc2M3IzQwLjE0LjIwLjAwLjAwI0hvc2VzIzQwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIwLjAxLjAwI0FjaWQgaG9zZXMjNDAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjAuMDIuMDAjQWlyIGhvc2VzIzQwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIwLjAzLjAwI0RyaWxsIGhvc2VzIzQwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIwLjA0LjAwI01hcmluZSBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4wNS4wMCNNYXRlcmlhbCBoYW5kbGluZyBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4wNi4wMCNPaWwgaG9zZXMjNDAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjAuMDcuMDAjU3BlY2lhbCBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4wOC4wMCNXYXRlciBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4wOS4wMCNBaXIgd2F0ZXIgZ2FzIG11bHRpcHVycG9zZSBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4xMC4wMCNUZWZsb24gbGluZWQgaG9zZXMjNDAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjEuMDAuMDAjUGlwZSM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wMS4wMCNDYXJib24gc3RlZWwgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wMi4wMCNEdWN0aWxlIGlyb24gcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wMy4wMCNIaWdoIG5pY2tlbCBhbGxveSBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjA0LjAwI0hpZ2ggeWllbGQgc3RlZWwgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wNS4wMCNGZXJyaXRpYyBhbGxveSBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjA2LjAwI0FsdW1pbnVtIHBpcGUjNDAuMTQuMjEuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjEuMDcuMDAjQnJhc3MgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wOC4wMCNCcm9uemUgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wOS4wMCNDb25jcmV0ZSBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjEwLjAwI0NvcHBlciBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjExLjAwI0Nhc3QgaXJvbiBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjEyLjAwI0xlYWQgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xMy4wMCNNYWduZXNpdW0gcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xNC4wMCNOb24gZmVycm91cyBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjE1LjAwI1BsYXN0aWMgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xNi4wMCNSdWJiZXIgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xNy4wMCNTdGFpbmxlc3Mgc3RlZWwgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xOC4wMCNUaW4gcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xOS4wMCNUaXRhbml1bSBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjIwLjAwI1ppbmMgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4yMS4wMCNIb3NlIHJlZWxzIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIyLjAwLjAwI0ZsdWlkIGFuZCBnYXMgcmVndWxhdG9ycyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMi4wMS4wMCNHYXMgcmVndWxhdG9ycyM0MC4xNC4yMi4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMi4wMi4wMCNGbHVpZCByZWd1bGF0b3JzIzQwLjE0LjIyLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjAwLjAwI1BpcGUgZml0dGluZ3MjNDAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDEuMDAjUGlwZSBhbmdsZSBmYWNlIHJpbmdzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjAyLjAwI1BpcGUgYnJhbmNoIG91dGxldHMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDMuMDAjUGlwZSBsYXRlcmFscyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4wNC4wMCNQaXBlIGluc2VydHMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDUuMDAjUGlwZSByZWR1Y2VycyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4wNi4wMCNQaXBlIHNhZGRsZXMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDcuMDAjUGlwZSBzdHViZW5kcyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4wOC4wMCNQaXBlIHd5ZXMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDkuMDAjUGlwZSBiZW5kcyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xMC4wMCNQaXBlIGNhcHMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMTEuMDAjUGlwZSBoYWxmIGNvdXBsaW5ncyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xMi4wMCNQaXBlIGV4cGFuc2lvbiBqb2ludHMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMTMuMDAjUGlwZSBwbHVncyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xNC4wMCNQaXBlIGJ1c2hpbmdzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjE1LjAwI1BpcGUgY291cGxpbmdzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjE2LjAwI1BpcGUgY3Jvc3NlcyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xNy4wMCNQaXBlIGVsYm93cyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xOC4wMCNQaXBlIG5pcHBsZXMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMTkuMDAjUGlwZSB0ZWVzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjIwLjAwI1BpcGUgdW5pb25zIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjIxLjAwI1BpcGUgcmVkdWNpbmcgY291cGxpbmdzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjIyLjAwI1BpcGUgcmVwYWlyIGNsYW1wcyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4yMy4wMCNSdXB0dXJlIGRpc2sjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjQuMDAuMDAjUGlwZSBmbGFuZ2VzIzQwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjAxLjAwI0FtbW9uaWEgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4wMi4wMCNCYWNrdXAgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4wMy4wMCNCbGluZCBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjA0LjAwI0xhcGpvaW50IGZsYW5nZXMjNDAuMTQuMjQuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjQuMDUuMDAjTG9uZyB3ZWxkbmVjayBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjA2LjAwI09yaWZpY2UgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4wNy4wMCNQbGF0ZSBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjA4LjAwI1NsaXBvbiBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjA5LjAwI1NvY2tldHdlbGQgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4xMC4wMCNTcGVjdGFjbGUgYmxpbmQgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4xMS4wMCNUaHJlYWRlZCBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjEyLjAwI1dlbGRuZWNrIGZsYW5nZXMjNDAuMTQuMjQuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjUuMDAuMDAjVHJhcHMgYW5kIHN0cmFpbmVycyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNS4wMS4wMCNMaXF1aWQgc3RyYWluZXJzIzQwLjE0LjI1LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI1LjAyLjAwI0xpcXVpZCB0cmFwcyM0MC4xNC4yNS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNS4wMy4wMCNTdGVhbSB0cmFwcyM0MC4xNC4yNS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNS4wNC4wMCNTdGVhbSBzdHJhaW5lcnMjNDAuMTQuMjUuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjYuMDAuMDAjVHViZSBmaXR0aW5ncyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNi4wMS4wMCNCcmFzcyB0dWJlIGZpdHRpbmdzIzQwLjE0LjI2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI2LjAyLjAwI0NhcmJvbiBzdGVlbCB0dWJlIGZpdHRpbmdzIzQwLjE0LjI2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI2LjAzLjAwI1N0YWlubGVzcyBzdGVlbCB0dWJlIGZpdHRpbmdzIzQwLjE0LjI2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjAwLjAwLjAwI0luZHVzdHJpYWwgcHVtcHMgYW5kIGNvbXByZXNzb3JzIzQwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjAwLjAwI1B1bXBzIzQwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjAxLjAwI0FpciBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4wMi4wMCNWYWN1dW0gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDMuMDAjQ2VudHJpZnVnYWwgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDQuMDAjQ2lyY3VsYXRpbmcgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDUuMDAjRG9zaW5nIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjA2LjAwI0hhbmQgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDcuMDAjSXJyaWdhdGlvbiBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4wOC4wMCNNdWQgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDkuMDAjUmVjaXByb2NhdGluZyBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4xMC4wMCNXYXRlciBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4xMS4wMCNXZWxsIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjEyLjAwI1N1bXAgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTMuMDAjU3VibWVyc2libGUgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTQuMDAjU3RlYW0gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTUuMDAjU29sZW5vaWQgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTYuMDAjU2hlYXIgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTcuMDAjU2V3YWdlIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjE4LjAwI1NlYWxsZXNzIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjE5LjAwI1Nhbml0YXJ5IHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjIwLjAwI1NhbXBsaW5nIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjIxLjAwI1JvdGFyeSBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4yMi4wMCNSZXZlcnNlIG9zbW9zaXMgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMjMuMDAjUG9zaXRpdmUgZGlzcGxhY2VtZW50IHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjI0LjAwI09pbCBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4yNS4wMCNTbHVkZ2UgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMjYuMDAjVHVyYmluZSBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4yNy4wMCNQbHVuZ2VyIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjI4LjAwI09zY2lsbGF0aW5nIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjI5LjAwI0RydW0gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMzAuMDAjRHJlZGdlIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjMxLjAwI0Rld2F0ZXJpbmcgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMzIuMDAjRnVlbCBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4zMy4wMCNIeWRyYXVsaWMgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMzQuMDAjQ3J5b2dlbmljIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjM1LjAwI1NsdWRnZSBwdW1wIHNwYXJlIHBhcnRzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjM2LjAwI1Nld2FnZSBwdW1wIHNwYXJlIHBhcnRzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjM3LjAwI1N1Ym1lcnNpYmxlIHB1bXAgc3BhcmUgcGFydHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMzguMDAjV2F0ZXIgcHVtcCBzcGFyZSBwYXJ0cyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4zOS4wMCNXZWxsIHB1bXAgc3BhcmUgcGFydHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNDAuMDAjU3VtcCBwdW1wIHNwYXJlIHBhcnRzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjQxLjAwI0Rvc2luZyBwdW1wIHNwYXJlIHBhcnRzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjQyLjAwI0NlbnRyaWZ1Z2FsIHB1bXAgc3BhcmUgcGFydHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNDMuMDAjQ2lyY3VsYXRpb24gcHVtcCBzcGFyZSBwYXJ0cyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40NC4wMCNSb3RhcnkgcHVtcCBzcGFyZSBwYXJ0cyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40NS4wMCNQdW1wIHBhcnRzIGFuZCBhY2Nlc3NvcmllcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40Ni4wMCNBeGlhbCBzcGxpdCBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40Ny4wMCNEZWVwd2VsbCBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40OC4wMCNEaWFwaHJhZ20gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNDkuMDAjRG91YmxlIGRpYXBocmFnbSBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS41MC4wMCNEdXBsZXggcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNTEuMDAjR2VhciBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS41Mi4wMCNNZXRlcmluZyBvciBpbmplY3Rpb24gb3IgcHJvcG9ydGlvbmluZyBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS41My4wMCNQcm9ncmVzc2l2ZSBjYXZpdHkgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNTQuMDAjUmFtIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjU1LjAwI1JvdGFyeSBjYW0gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNTYuMDAjUm90YXJ5IGxvYmUgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNTcuMDAjUm90YXRpbmcgcGlzdG9uIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjU4LjAwI1NjcmV3IFB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjU5LjAwI1NpbXBsZXggcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNjAuMDAjU2xpZGluZyB2YW5lIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjYxLjAwI1RyaXBsZXggcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNjIuMDAjV29ybSBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4wMC4wMCNDb21wcmVzc29ycyM0MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4wMS4wMCNBaXIgY29tcHJlc3NvcnMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTYuMDIuMDAjQXhpYWwgZmxvdyBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4wMy4wMCNEaWFwaHJhZ20gY29tcHJlc3NvcnMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTYuMDQuMDAjR2FzIGNvbXByZXNzb3JzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjA1LjAwI01vdG9yIGNvbXByZXNzb3JzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjA2LjAwI1JlY2lwcm9jYXRpbmcgY29tcHJlc3NvcnMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTYuMDcuMDAjUmVmcmlnZXJhbnQgY29tcHJlc3NvcnMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTYuMDguMDAjUm90YXJ5IGNvbXByZXNzb3JzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjA5LjAwI1NjcmV3IGNvbXByZXNzb3JzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjEwLjAwI0NvbXByZXNzb3IgcGFydHMgYW5kIGFjY2Vzc29yaWVzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjExLjAwI0JhcnJlbCBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xMi4wMCNDZW50cmlmdWdhbCBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xMy4wMCNDb21iaW5hdGlvbiBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xNC4wMCNTZW1pIHJhZGlhbCBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xNS4wMCNUdXJibyBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xNi4wMCNDb21wcmVzc29yIGtpdHMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTcuMDAuMDAjUHVtcCBwYXJ0cyBhbmQgYWNjZXNzb3JpZXMjNDAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTcuMDEuMDAjUHVtcCBjYXNpbmdzIzQwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE3LjAyLjAwI1B1bXAgcGFja2luZ3MjNDAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMDAuMDAuMDAjSW5kdXN0cmlhbCBmaWx0ZXJpbmcgYW5kIHB1cmlmaWNhdGlvbiM0MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNS4wMC4wMCNGaWx0ZXJzIzQwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjAxLjAwI1ZhY3V1bSBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjAyLjAwI1dhdGVyIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMDMuMDAjRHVzdCBjb2xsZWN0b3JzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjA0LjAwI09pbCBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjA1LjAwI0FpciBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjA2LjAwI0ZpbHRlcmluZyBtYWNoaW5lcnkjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMDcuMDAjRmlsdGVyIG1lbWJyYW5lcyM0MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNS4wOC4wMCNCYWcgZmlsdGVycyM0MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNS4wOS4wMCNBYnNvcnB0aW9uIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTAuMDAjQmFnIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTEuMDAjQ29hbGVzY2luZyBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjEyLjAwI0VsZWN0cm9uaWMgZmlsdGVycyM0MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNS4xMy4wMCNGdWVsIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTQuMDAjR2FzIHBpcGVsaW5lIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTUuMDAjSHlkcmF1bGljIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTYuMDAjSW4gbGluZSBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjE3LjAwI0xpZ2h0IGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTguMDAjTWljcm9maWJlciBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjE5LjAwI1BhbmVsIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMjAuMDAjUmFkaWFsIGZpbiBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjIxLjAwI0ZpbHRlciBCYXNlIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjIyLjAwI0ZpbHRlciBGaW5zIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjIzLjAwI0Z1ZWwjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMjQuMDAjUGFpbnQjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTYuMDAuMDAjUHVyaWZpY2F0aW9uIzQwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE2LjE2LjAxLjAwI0FpciBzY3J1YmJlcnMjNDAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTYuMDIuMDAjQWlyIGNsZWFuZXJzIzQwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE3LjAwLjAwI1NlcGFyYXRvcnMjNDAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTcuMDEuMDAjQ2VudHJpZnVnZXMjNDAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTcuMDIuMDAjV2V0IHNjcnViYmVycyM0MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNy4wMy4wMCNNaXN0IGVsaW1pbmF0b3JzIzQwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE4LjAwLjAwI0ZpbHRlciBtZWRpYSM0MC4xNi4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNi4xOC4wMS4wMCNNZXRhbCBmYWJyaWMgbWVkaWEjNDAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTguMDIuMDAjUHJlc3NlZCBmZWx0cyM0MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNi4xOC4wMy4wMCNGaWx0ZXIgcGFwZXJzIzQwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE4LjA1LjAwI0ZpbHRlciBjbG90aCM0MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM0MS4wMC4wMC4wMC4wMCNMYWJvcmF0b3J5IGFuZCBNZWFzdXJpbmcgYW5kIE9ic2VydmluZyBhbmQgVGVzdGluZyBFcXVpcG1lbnQjNDEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMDAuMDAuMDAjTGFib3JhdG9yeSBhbmQgc2NpZW50aWZpYyBlcXVpcG1lbnQjNDEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMDAuMDAjTGFib3JhdG9yeSBibGVuZGluZyBhbmQgZGlzcGVyc2luZyBhbmQgaG9tb2dlbml6aW5nIGFuZCBtaXhpbmcgYW5kIHN0aXJyaW5nIGVxdWlwbWVudCM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wMS4wMCNNaXhlcnMgb3IgYmxlbmRlcnMgb3IgZW11bHNpZmllcnMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMDIuMDAjU3RvbWFjaGVycyM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wMy4wMCNMYWJvcmF0b3J5IHNwcmF5ZXJzIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE1LjA0LjAwI0hvbW9nZW5pc2VycyM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wNS4wMCNGcmVuY2ggcHJlc3N1cmUgY2VsbHMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMDYuMDAjUm9sbGVyIG1peGVycyM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wNy4wMCNSb3RhdG9ycyM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wOC4wMCNWaWJyYXRvcnMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMTAuMDAjTWFnbmV0aWMgc3BpbiBiYXJzIG9yIHJldHJpZXZlcnMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMTEuMDAjU3RpcnJpbmcgdGFibGVzIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE1LjEyLjAwI011bHRpIGJhbmsgb3IgZmxvY2N1bGF0aW9uIGVxdWlwbWVudCM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4xMy4wMCNTaGFrZXJzIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE1LjE0LjAwI0xhYm9yYXRvcnkgY2VudHJpZnVnZXMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMTUuMDAjTGlxdWlkIG1lYXN1cmluZyBjYW5zIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE1LjE2LjAwI0xpcXVpZCBkaXNwZW5zZXJzIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjAwLjAwI0xhYm9yYXRvcnkgZml4dHVyZXMgYW5kIGFjY2Vzc29yaWVzIzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjAzLjAwI0xhYm9yYXRvcnkgc3RhbmRzIG9yIGNsYW1wcyBvciB0b25ncyM0MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNi4wNC4wMCNTbGlkZSBjb250YWluZXJzIzQxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjA1LjAwI1NsaWRlIGRyeWluZyBwbGF0ZXMjNDEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTYuMDcuMDAjTWljcm9zbGlkZSBtYWtpbmcgZXF1aXBtZW50IzQxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjA4LjAwI01pY3Jvc2xpZGUgc3RvcmFnZSBlcXVpcG1lbnQjNDEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTYuMDkuMDAjU3RhdGljIGVsaW1pbmF0b3JzIzQxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjExLjAwI1NsaWRlIHdhcm1lcnMjNDEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTcuMDAuMDAjTGFib3JhdG9yeSBib3JpbmcgYW5kIGdyaW5kaW5nIGFuZCBjdXR0aW5nIGFuZCBjcnVzaGluZyBhbmQgcHJlc3NpbmcgZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjAxLjAwI01pbGxzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjAyLjAwI1Blc3RsZSBvciBtb3J0YXJzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjAzLjAwI1Rpc3N1ZSBncmluZGVycyM0MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNy4wNC4wMCNNaWNyb3RvbWVzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjA1LjAwI0NydXNoZXJzIG9yIHB1bHZlcmlzZXJzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjA2LjAwI0Rpc2ludGVncmF0b3JzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjA3LjAwI0xhYm9yYXRvcnkgcHJlc3NlcyM0MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOC4wMC4wMCNMYWJvcmF0b3J5IGVsZWN0cm9uIGFuZCBzb2xpZCBzdGF0ZSBwaHlzaWNzIGVxdWlwbWVudCM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOC4wMS4wMCNFbGVjdHJvbiBndW5zIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjAyLjAwI1ggcmF5IGdlbmVyYXRvcnMjNDEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTguMDMuMDAjQ291bG9tZXRlcnMjNDEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTguMDQuMDAjRWxlY3Ryb3Njb3BlcyM0MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOC4wNS4wMCNGbHV4bWV0ZXJzIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjA2LjAwI01hZ25ldG9tZXRlcnMjNDEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTguMDcuMDAjRWxlY3Ryb24gZGlmZnJhY3Rpb24gYXBwYXJhdHVzIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjA4LjAwI05ldXRyb24gZGlmZnJhY3Rpb24gYXBwYXJhdHVzIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjA5LjAwI09wdGljYWwgZGlmZnJhY3Rpb24gYXBwYXJhdHVzIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjEwLjAwI0RpZmZyYWN0b21ldGVycyM0MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOS4wMC4wMCNMYWJvcmF0b3J5IGlvbmljIGVxdWlwbWVudCM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOS4wMS4wMCNJb24gc291cmNlcyM0MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOS4wMi4wMCNJb24gZXhjaGFuZ2UgYXBwYXJhdHVzIzQxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE5LjAzLjAwI0lvbiBpbXBsYW50YXRpb24gZXF1aXBtZW50IzQxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjAwLjAwI1NhbXBsaW5nIGFuZCBwdXJpZmljYXRpb24gZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjAxLjAwI1NhbXBsZSBjaGFuZ2VycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4wMi4wMCNTYW1wbGUgb3hpZGlzZXIjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMDMuMDAjU2FtcGxlIHByZXBhcmF0aW9uIGxpbmUjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMDQuMDAjU2FtcGxlIHByZXBhcmF0aW9uIGJvbWJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA1LjAwI1dhdGVyIHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA2LjAwI0FpciBzYW1wbGVycyBvciBjb2xsZWN0b3JzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA3LjAwI1JlYWdlbnQga2l0cyBmb3IgdXNlIHdpdGggYWlyIHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA4LjAwI0ZpbHRlcnMgb3Igb3RoZXIgc3BhcmUgcGFydHMgZm9yIHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA5LjAwI0R1c3QgZmFsbCBob2xkZXJzIG9yIGphcnMjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMTEuMDAjU3VscGh1ciBkaW94aWRlIG9yIHNtb2tlIHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjEyLjAwI1NhbXBsZSBhcHBsaWNhdG9ycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4xMy4wMCNQbGFudCBzYW1wbGVzIGFuYWx5c2lzIGVxdWlwbWVudCM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4xNC4wMCNBaXIgcG9sbHV0YW50IHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjE1LjAwI1dhdGVyIHB1cmlmaWNhdGlvbiByZWFnZW50cyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4xNi4wMCNEZWlvbmlzYXRpb24gb3IgZGVtaW5lcmFsaXNhdGlvbiBlcXVpcG1lbnQjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMTcuMDAjQmFzZSBleGNoYW5nZSBlcXVpcG1lbnQjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMTguMDAjUmV2ZXJzZSBvc21vc2lzIGVxdWlwbWVudCM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4xOS4wMCNVbHRyYSB2aW9sZXQgd2F0ZXIgcHVyaWZpY2F0aW9uIHVuaXRzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjIwLjAwI1VsdHJhIHB1cmUgd2F0ZXIgc3lzdGVtcyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4yMS4wMCNXYXRlciBhbmFseXNpcyBzeXN0ZW1zIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjIyLjAwI0RlaHlkcmF0b3JzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjIzLjAwI0Rlb3hpZGVycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4yNC4wMCNEaXNzb2x2ZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjI1LjAwI1NwZWNpbWVuIGhvbGRlcnMjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMjYuMDAjU3BlY2ltZW4gY29sbGVjdG9ycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4yNy4wMCNTYW1wbGUgaG9sZGVycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4yOC4wMCNMdWJyaWNhbnQgc2FtcGxlcnMjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMDAuMDAjTGFib3JhdG9yeSBmZXJtZW50YXRpb24gYW5kIGluY3ViYXRpbmcgZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjAxLjAwI1N0YW5kYXJkIGZlcm1lbnRhdGlvbiB1bml0cyM0MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMy4wMi4wMCNDb250aW51b3VzIGN1bHR1cmUgYXBwYXJhdHVzIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjAzLjAwI0FuYWVyb2JpYyBqYXJzIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjA0LjAwI0RpZ2VzdGlvbiBzeXN0ZW1zIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjA1LjAwI1dhdGVyIGphY2tldGVkIGluY3ViYXRvcnMjNDEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMDYuMDAjQ08yIGluY3ViYXRvcnMjNDEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMDcuMDAjVGlzc3VlIGN1bHR1cmUgaW5jdWJhdG9ycyM0MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMy4wOC4wMCNJbmN1YmF0b3Igb3ZlbnMjNDEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMDkuMDAjQ29vbGVkIGluY3ViYXRvcnMgKEJPRCkjNDEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMTAuMDAjU2hha2luZyBpbmN1YmF0b3JzIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjExLjAwI0luc3Bpc3NhdG9ycyM0MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMy4xMi4wMCNQbGF0ZSBpbmN1YmF0b3JzIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjEzLjAwI0luIHZpdHJvIGN1bHR1cmUgZXF1aXBtZW50IzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjE0LjAwI0JhY3RlcmlhIGVxdWlwbWVudCM0MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4wMC4wMCNMYWJvcmF0b3J5IGhlYXRpbmcgYW5kIGRyeWluZyBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDEuMDAjR2FzIGJ1cm5lcnMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDIuMDAjU3Bpcml0IGJ1cm5lcnMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDMuMDAjTGFib3JhdG9yeSBpbmNpbmVyYXRvcnMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDQuMDAjTGFib3JhdG9yeSBoZWF0ZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjA1LjAwI01hbnRsZXMgb3IgdGFwZXMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDYuMDAjSG90IHBsYXRlcyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4wNy4wMCNXYXJtaW5nIGNhYmluZXRzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjA4LjAwI0RyeWluZyBvdmVucyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4wOS4wMCNJbmR1Y3Rpb24gZHJ5ZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjEwLjAwI0luZnJhcmVkIGRyeWVycyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4xMS4wMCNTcHJheSBkcnllcnMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMTIuMDAjSG90IGFpciBibG93ZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjEzLjAwI0RyeWluZyBjYWJpbmV0cyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4xNC4wMCNGcmVlemUgZHJ5ZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjE1LjAwI0xhYm9yYXRvcnkgZnVybmFjZXMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMTYuMDAjQWdlaW5nIG92ZW5zIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjE4LjAwI1F1YXJ0eiBvdmVuIHBvdHMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMTkuMDAjTWljcm93YXZlIG9yIHJhZGlhbnQgaGVhdCBvdmVucyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4yMC4wMCNEZXNpY2NhdG9ycyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4yMS4wMCNUZW1wZXJhdHVyZSBjeWNsaW5nIGNoYW1iZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjAwLjAwI0xhYm9yYXRvcnkgZW50b21vbG9naWNhbCBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjAxLjAwI0luc2VjdCBjb250YWluZXJzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjAyLjAwI1JlYXJpbmcgZmFjaWxpdGllcyBmb3IgZW50b21vbG9neSM0MS4xMC4yNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNS4wMy4wMCNGYWJyaWMgb3IgbmV0dGluZyBmb3IgZW50b21vbG9neSM0MS4xMC4yNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNS4wNC4wMCNFbnRvbW9sb2dpY2FsIHBpbm5pbmcgZXF1aXBtZW50IzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjA1LjAwI0VudG9tb2xvZ2ljYWwgbW91bnRpbmcgbWF0ZXJpYWxzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjA2LjAwI0VudG9tb2xvZ2ljYWwgdHJheXMjNDEuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjUuMDcuMDAjRW50b21vbG9naWNhbCBjYXRjaGluZyBlcXVpcG1lbnQjNDEuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjUuMDguMDAjRW50b21vbG9naWNhbCBhc3BpcmF0b3JzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjA5LjAwI0VudG9tb2xvZ2ljYWwgZGlwcGVycyM0MS4xMC4yNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNS4xMC4wMCNFbnRvbW9sb2dpY2FsIG1vbm9jdXBzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjExLjAwI0VudG9tb2xvZ2ljYWwgc3RpY2t5IHRyYXBzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjEyLjAwI0luc2VjdCB0ZXN0IGtpdHMjNDEuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjUuMTMuMDAjRW50b21vbG9naWNhbCBkaXNwbGF5IHVuaXRzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI2LjAwLjAwI0FuaW1hbCBsYWJvcmF0b3J5IGVxdWlwbWVudCBhbmQgYWNjZXNzb3JpZXMjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjYuMDEuMDAjQ2FnZXMgZm9yIHNtYWxsIGFuaW1hbHMjNDEuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjYuMDIuMDAjQXF1YXJpYSBlcXVpcG1lbnQjNDEuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjYuMDMuMDAjQW5pbWFsIGlkZW50aWZpY2F0aW9uIHN1cHBsaWVzIzQxLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI2LjA0LjAwI0FuaW1hbCBjYXRjaGluZyBkZXZpY2VzIzQxLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI2LjA1LjAwI0Zpc2ggYWVyYXRpb24gc3lzdGVtcyM0MS4xMC4yNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNi4wNi4wMCNBbmltYWwgZmVlZGluZyBuZWVkbGVzIzQxLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI3LjAwLjAwI0NyeXN0YWxsb2dyYXBoeSBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjcuMDEuMDAjQ3J5c3RhbCBsYXR0aWNlIG1vZGVscyM0MS4xMC4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNy4wMi4wMCNTY2ludGlsbGF0aW9uIGNyeXN0YWwgYXNzZW1ibGllcyM0MS4xMC4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNy4wMy4wMCNMaWdodCBzY2F0dGVyaW5nIGVxdWlwbWVudCM0MS4xMC4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNy4wNC4wMCNYIHJheSBkaWZmcmFjdGlvbiBlcXVpcG1lbnQjNDEuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjcuMDUuMDAjQ3J5c3RhbGxpc2VycyM0MS4xMC4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNy4wNi4wMCNDcnlzdGFsIGdyb3dpbmcgZXF1aXBtZW50IzQxLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI5LjAwLjAwI0hpc3RvbG9neSBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMDEuMDAjVGlzc3VlIGVtYmVkZGluZyBzdGF0aW9ucyM0MS4xMC4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yOS4wMi4wMCNFbWJlZGRpbmcgbW9sZHMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMDMuMDAjRW1iZWRkaW5nIGNhcHN1bGVzIzQxLjEwLjI5LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI5LjA0LjAwI0VtYmVkZGluZyBjb21wb3VuZHMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMDUuMDAjSGlzdG9sb2dpY2FsIHN0YWluaW5nIGFwcGFyYXR1cyM0MS4xMC4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yOS4wOS4wMCNUaXNzdWUgcHJvY2Vzc29ycyM0MS4xMC4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yOS4xMC4wMCNUaXNzdWUgY3VsdHVyZSBhcHBhcmF0dXMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMTEuMDAjSGlzdG9sb2dpY2FsIGtuaXZlcyBvciBrbmlmZSBob2xkZXJzIzQxLjEwLjI5LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI5LjEyLjAwI0hpc3RvbG9naWNhbCBnbGFzcyBrbmlmZSBtYWtlcnMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMTMuMDAjSGlzdG9sb2dpY2FsIGhvbmVzIG9yIHN0cmFwcyBvciBjb21wb3VuZHMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMTQuMDAjVWx0cmFzb25pYyBkaXNpbnRlZ3JhdG9ycyM0MS4xMC4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wMC4wMCNMYWJvcmF0b3J5IGNvb2xpbmcgZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMwLjAxLjAwI1JlZnJpZ2VyYXRlZCBjb29saW5nIHBsYXRlIHByb2JlcyM0MS4xMC4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wMi4wMCNGcmVlemluZyBzcHJheSBhZXJvc29scyM0MS4xMC4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wMy4wMCNDcnlvc3RhdHMjNDEuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzAuMDQuMDAjRmFuIGNpcmN1bGF0ZWQgb3ZlbnMjNDEuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzAuMDUuMDAjVWx0cmEgY29sZCBjYWJpbmV0cyM0MS4xMC4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wNi4wMCNDcnlvZ2VuaWMgZnJlZXplcnMjNDEuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzAuMDcuMDAjQ2hpbGxpbmcgdW5pdHMgb3IgY29sZCB3YXRlciBjaXJjdWxhdGlvbiM0MS4xMC4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wOC4wMCNSZWZyaWdlcmF0ZWQgY29vbGluZyBtb2R1bGVzIzQxLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMwLjA5LjAwI0NhZGF2ZXIgc3RvcmFnZSByZWZyaWdlcmF0b3JzIzQxLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjAwLjAwI0xhYm9yYXRvcnkgc3VwcGxpZXMjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMDEuMDAjVGVzdCB0dWJlcyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4wMy4wMCNQaXBldHRlcyBvciBhY2Nlc3NvcmllcyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4wNC4wMCNGbGFza3MjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMDUuMDAjQmVha2VycyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4wNi4wMCNTdGlycmluZyByb2RzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjA3LjAwI0xhYm9yYXRvcnkgb3Igc2FtcGxpbmcgc3lyaW5nZXMjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMDguMDAjRGVzaWNjYW50cyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4wOS4wMCNXYXRjaCBnbGFzc2VzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjEwLjAwI0J1cmV0cyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4xMS4wMCNNZWFzdXJpbmcgY3lsaW5kZXIjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMTIuMDAjTGFib3JhdG9yeSBkaXNoZXMjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMTMuMDAjU2xpZGVzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjE0LjAwI1N0b3BwZXJzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjE1LjAwI1R1YmluZyBjb25uZWN0b3JzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjE2LjAwI0xhYm9yYXRvcnkgY2FzZXMjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMTcuMDAjTGFib3JhdG9yeSBzY29vcHMgb3Igc3BhdHVsYXMjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzIuMDAuMDAjTGFib3JhdG9yeSBjbGVhbmluZyBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzIuMDEuMDAjQ2hlbWljYWwgZW5naW5lZXJpbmcgd2FzaGVycyM0MS4xMC4zMi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMi4wMi4wMCNMYWJvcmF0b3J5IHdhc2hpbmcgbWFjaGluZXMjNDEuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzIuMDMuMDAjUGlwZXR0ZSB3YXNoZXJzIzQxLjEwLjMyLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMyLjA0LjAwI1VsdHJhc29uaWMgY2xlYW5lcnMjNDEuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDAuMDAjRmx1aWQgbWVjaGFuaWNzIGVxdWlwbWVudCM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMy4wMS4wMCNMaXF1aWQgc2NpbnRpbGxhdGlvbiBjb3VudGVycyM0MS4xMC4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMy4wMi4wMCNCYXR0ZXJ5IGFjaWQgaHlkcm9tZXRlcnMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDMuMDAjRGVuc2l0b21ldGVycyM0MS4xMC4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMy4wNC4wMCNWYWN1dW0gb3ZlbnMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDUuMDAjSGlnaCB2YWN1dW0gZXF1aXBtZW50IzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjA2LjAwI1BuZXVtYXRpYyB2YWN1dW0gZXF1aXBtZW50IzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjA3LjAwI1ZhY3V1bSBvciBtZXJjdXJ5IHZhcG91ciBlcXVpcG1lbnQjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDguMDAjSGlnaCB2YWN1dW0gY29tYnVzdGlvbiBhcHBhcmF0dXMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDkuMDAjRmxvdyBpbmplY3Rpb24gYW5hbHlzaXMgZXF1aXBtZW50IzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjEwLjAwI0dhcyBvciB2YXBvdXIgY29uY2VudHJhdGlvbiBtZWFzdXJpbmcgaW5zdHJ1bWVudHMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMTEuMDAjTWFub21ldGVycyM0MS4xMC4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMy4xMi4wMCNWaXNjb3NpbWV0ZXJzIzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjEzLjAwI0RlcHRoIGluZGljYXRvcnMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMTQuMDAjTWljcm9zY29waWMgc3RydWN0dXJlIGVzdGltYXRpb24gYXBwYXJhdHVzIzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjE1LjAwI1NvbHV0aW9uIHN0cmVuZ3RoIGVzdGltYXRpb24gYXBwYXJhdHVzIzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjM0LjAwLjAwI0xhYm9yYXRvcnkgZW52aXJvbm1lbnRhbCBjb25kaXRpb25pbmcgZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjM0LjAxLjAwI0NvbnRhbWluYXRpb24gY29udHJvbCBzY3JlZW5zIzQxLjEwLjM0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM0LjAyLjAwI0Vudmlyb25tZW50YWwgY2hhbWJlcnMjNDEuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzQuMDMuMDAjTWljcm9iaW9sb2dpY2FsIGFpcmNvbnRyb2wjNDEuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzQuMDQuMDAjR3Jvd3RoIGNoYW1iZXJzIzQxLjEwLjM0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM0LjA1LjAwI1dhbGsgaW4gY2hhbWJlcnMjNDEuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzQuMDYuMDAjR2xvdmUgYm94ZXMjNDEuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzUuMDAuMDAjTGFib3JhdG9yeSB2ZW50aWxhdGluZyBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzUuMDEuMDAjRWJ1bGlvbWV0ZXIjNDEuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzUuMDIuMDAjRnVtZSBob29kcyM0MS4xMC4zNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNS4wMy4wMCNGdW1lIGN1cGJvYXJkcyM0MS4xMC4zNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNS4wNC4wMCNMYW1pbmFyIGZsb3cgY2FiaW5ldHMgb3Igc3RhdGlvbnMjNDEuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMDAuMDAjTGFib3JhdG9yeSBkZWNhbnRpbmcgYW5kIGRpc3RpbGxpbmcgYW5kIGV2YXBvcmF0aW5nIGFuZCBmaWx0ZXJpbmcgZXF1aXBtZW50IGFuZCBzdXBwbGllcyM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4wMS4wMCNGbGFzayBvciByZXRvcnQgdW5pdHMjNDEuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMDIuMDAjQmkgZGlzdGlsbGF0aW9uIHVuaXRzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjAzLjAwI0V2YXBvcmF0b3JzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjA0LjAwI1ZhY3V1bSBldmFwb3JhdG9ycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4wNS4wMCNFeHRyYWN0aW5nIGVxdWlwbWVudCM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4wNi4wMCNMaW5lIGZpbHRlcnMjNDEuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMDcuMDAjR2VsIGZpbHRyYXRpb24gZXF1aXBtZW50IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjA4LjAwI1VsdHJhIGZpbHRyYXRpb24gZXF1aXBtZW50IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjA5LjAwI1NpbnRlcmVkIGNlbGwgZmlsdGVycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xMC4wMCNUaGluIGNoYW5uZWwgZmlsdHJhdGlvbiBlcXVpcG1lbnQjNDEuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMTEuMDAjUmV2ZXJzZSBvc21vc2lzIGZpbHRyYXRpb24gZXF1aXBtZW50IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjEyLjAwI01vbGVjdWxhciBmaWx0cmF0aW9uIGVxdWlwbWVudCM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xMy4wMCNDYXJ0cmlkZ2UgZWxlbWVudCBmaWx0ZXJzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjE0LjAwI0ZpbHRlciBob2xkZXJzIG9yIGN5Y2xvbmVzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjE1LjAwI011bHRpIHNoZWV0IG9yIHByZXNzIG9yIGZpbHRlciM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xNi4wMCNBaXIgZmlsdHJhdGlvbiBzeXN0ZW1zIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjE3LjAwI0hlcGEgZmlsdGVycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xOC4wMCNGbHVpZCBwcmVzc2VzIGZpbHRlciM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xOS4wMCNTZWRpbWVudG9sb2dpY2FsIGFuYWx5emluZyB1bml0IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjIwLjAwI0xhYm9yYXRvcnkgc2VwYXJhdG9ycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4yMS4wMCNMYWJvcmF0b3J5IHNpZnRpbmcgZXF1aXBtZW50IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjIyLjAwI1Rlc3Qgc2lldmVzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjIzLjAwI0xhYm9yYXRvcnkgc2NydWJiZXJzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjI0LjAwI1RpdHJhdGlvbiBlcXVpcG1lbnQjNDEuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMjUuMDAjTGFib3JhdG9yeSBkaWx1dGVycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4yNi4wMCNGcmFjdGlvbmF0aW9uIGFwcGFyYXR1cyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4yNy4wMCNEaXN0aWxsYXRpb24gcGlwaW5ncyBvciBjb2x1bW5zIG9yIGZpdHRpbmdzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjI4LjAwI1JlZmx1eCBjb21wb25lbnRzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjI5LjAwI0hlYXQgZXhjaGFuZ2UgY29uZGVuc2VycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNy4wMC4wMCNMYWJvcmF0b3J5IGJhdGhzIzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjAxLjAwI0NpcmN1bGF0aW5nIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjAyLjAwI1RoZXJtb3N0YXRpYyBiYXRocyM0MS4xMC4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNy4wMy4wMCNNdWx0aXBsZSBiYXRocyM0MS4xMC4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNy4wNC4wMCNCaW9sb2dpY2FsIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjA1LjAwI09yZ2FuIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjA2LjAwI1dhdGVyIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjA3LjAwI09pbCBiYXRocyM0MS4xMC4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNy4wOC4wMCNTYW5kIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjA5LjAwI1JlZnJpZ2VyYXRlZCBiYXRocyM0MS4xMC4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4wMC4wMC4wMCNNZWFzdXJpbmcgYW5kIG9ic2VydmluZyBhbmQgdGVzdGluZyBpbnN0cnVtZW50cyM0MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNS4wMC4wMCNXZWlnaHQgbWVhc3VyaW5nIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjE1LjAxLjAwI0VsZWN0cm9uaWMgdG9wbG9hZGluZyBiYWxhbmNlcyM0MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNS4wMi4wMCNMYWJvcmF0b3J5IGJhbGFuY2VzIzQxLjExLjE1LjAwLjAwCi11bnNwc2M3IzQxLjExLjE1LjAzLjAwI01lY2hhbmljYWwgYmFsYW5jZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTUuMDQuMDAjUHVsbCBzcHJpbmcgYmFsYW5jZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTUuMDUuMDAjQ2FsaWJyYXRpb24gd2VpZ2h0cyBvciB3ZWlnaHQgc2V0cyM0MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNS4wNi4wMCNBbmltYWwgd2VpZ2hpbmcgc2NhbGVzIzQxLjExLjE1LjAwLjAwCi11bnNwc2M3IzQxLjExLjE1LjA3LjAwI0JlbmNoIHNjYWxlcyM0MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNS4wOC4wMCNCb2R5d2VpZ2h0IG1lYXN1cmluZyBzY2FsZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTUuMDkuMDAjRmxvb3Igb3IgcGxhdGZvcm0gc2NhbGVzIzQxLjExLjE1LjAwLjAwCi11bnNwc2M3IzQxLjExLjE1LjEwLjAwI1Bvc3RhbCBzY2FsZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTUuMTEuMDAjVHJ1Y2sgb3IgcmFpbCBzY2FsZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMDAuMDAjTGVuZ3RoIGFuZCB0aGlja25lc3MgYW5kIGRpc3RhbmNlIG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4wMS4wMCNNaWNyb21ldGVycyM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4wMi4wMCNQZWRvbWV0ZXJzIzQxLjExLjE2LjAwLjAwCi11bnNwc2M3IzQxLjExLjE2LjAzLjAwI1JhbmdlZmluZGVycyM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4wNC4wMCNSdWxlcnMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMDUuMDAjU3RyYWluIGdhdWdlcyM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4wNi4wMCNUZWxsdXJvbWV0ZXJzIzQxLjExLjE2LjAwLjAwCi11bnNwc2M3IzQxLjExLjE2LjA3LjAwI1RocmVhZCBjb3VudGVycyBvciBnYXVnZXMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMDguMDAjQ2FsaXBlcnMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMTMuMDAjRGlzdGFuY2UgbWV0ZXJzIzQxLjExLjE2LjAwLjAwCi11bnNwc2M3IzQxLjExLjE2LjE0LjAwI0hlaWdodCBnYXVnZXMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMTUuMDAjTGFzZXIgbWVhc3VyaW5nIHN5c3RlbXMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMTYuMDAjTWVhc3VyaW5nIHdoZWVscyBmb3IgZGlzdGFuY2UjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMTcuMDAjRmVlbGVyIGdhdWdlcyM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4xOC4wMCNHYWdlIGJsb2NrIHNldCM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4xOS4wMCNHbyBvciBubyBnbyBnYXVnZSM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4yMC4wMCNFdGFsb24gd2VkZ2UjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTcuMDAuMDAjVmlld2luZyBhbmQgb2JzZXJ2aW5nIGluc3RydW1lbnRzIGFuZCBhY2Nlc3NvcmllcyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4wMS4wMCNJb24gbWljcm9zY29wZXMjNDEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTcuMDIuMDAjTW9ub2N1bGFyIG1pY3Jvc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjAzLjAwI1N0ZXJlbyBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4wNC4wMCNJbGx1bWluYXRvcnMgZm9yIG1pY3Jvc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjA1LjAwI09iamVjdGl2ZXMgZm9yIG1pY3Jvc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjA2LjAwI1Bob3RvIGF0dGFjaG1lbnRzIGZvciBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4wNy4wMCNQcm9maWxlIHByb2plY3RvcnMjNDEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTcuMDguMDAjVmlkZW8gYXR0YWNobWVudHMgZm9yIG1pY3Jvc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjA5LjAwI0Jpbm9jdWxhciBtaWNyb3Njb3BlIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjEwLjAwI0NvbWJpbmF0aW9uIGVsZWN0cm9uIGFuZCBsaWdodCBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xMS4wMCNFbGVjdHJvbiBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xMi4wMCNJbnZlcnRlZCBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xMy4wMCNNYWduaWZpZXJzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjE0LjAwI0xvdXBlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xNS4wMCNUZWxlc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjE2LjAwI0JvcmVzY29wZSBpbnNwZWN0aW9uIGVxdWlwbWVudCM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xNy4wMCNCaW5vY3VsYXJzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE4LjAwLjAwI05vbiBkZXN0cnVjdGl2ZSBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTguMDEuMDAjRWRkeSBjdXJyZW50IGV4YW1pbmF0aW9uIGVxdWlwbWVudCM0MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOC4wMi4wMCNMaXF1aWQgcGVuZXRyYW50IGV4YW1pbmF0aW9uIGVxdWlwbWVudCM0MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOC4wMy4wMCNNYWduZXRpYyBwYXJ0aWNsZSBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTguMDQuMDAjVWx0cmFzb25pYyBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTguMDUuMDAjQ08gNjAgcmFkaW9ncmFwaHkgZXhhbWluYXRpb24gZXF1aXBtZW50IzQxLjExLjE4LjAwLjAwCi11bnNwc2M3IzQxLjExLjE4LjA2LjAwI0NTIDEzNyByYWRpb2dyYXBoeSBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTguMDcuMDAjSVIgMTkyIHJhZGlvZ3JhcGh5IGV4YW1pbmF0aW9uIGVxdWlwbWVudCM0MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOC4wOC4wMCNYIHJheSByYWRpb2dyYXBoeSBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDAuMDAjSW5kaWNhdGluZyBhbmQgcmVjb3JkaW5nIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjAxLjAwI0NvdW50ZXJzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjAyLjAwI0VsZWN0cm9uaWMgY291bnRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDMuMDAjTWV0YWwgZGV0ZWN0b3JzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjA0LjAwI0VsZWN0cm9uaWMgY29sdW1ucyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4wNS4wMCNFbGVjdHJvbmljIG1lYXN1cmluZyBwcm9iZXMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDYuMDAjQ2hhcnQgcmVjb3JkZXJzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjA3LjAwI0RpZ2l0YWwgcmVhZG91dCByZWNvcmRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDguMDAjR3JhcGhpYyByZWNvcmRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDkuMDAjTWFnbmV0aWMgdGFwZSByZWNvcmRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMTAuMDAjTXVsdGlwZW4gcmVjb3JkZXJzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjExLjAwI09zY2lsbG9ncmFwaGljIHJlY29yZGVycyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4xMi4wMCNQaHlzaW9sb2dpY2FsIHJlY29yZGVycyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4xMy4wMCNQb2ludCBwbG90dGluZyByZWNvcmRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMTQuMDAjU2Vydm8gcmVjb3JkZXJzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjE1LjAwI0JpIG1ldGFsbGljIHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMTYuMDAjTm9uIGNvbnRhY3Qgc2Vuc29ycyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4xNy4wMCNEaWdpdGFsIHRlc3RlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMTguMDAjR3lyb3Njb3BpYyBpbnN0cnVtZW50cyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4xOS4wMCNEZXRlY3Rpb24gYXBwYXJhdHVzIGZvciBub24gbWV0YWxpYyBvYmplY3RzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjIwLjAwI0Nvb3JkaW5hdGUgbWVhc3VyaW5nIG1hY2hpbmVzIChDTU0pIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjIxLjAwI1NwZWVkIHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMjIuMDAjTGFtcCBmYWlsdXJlIHNlbnNvciM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4yMy4wMCNQcmUgaWduaXRpb24ga25vY2sgc2Vuc29yIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjI0LjAwI094eWdlbiBzZW5zb3JzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjI1LjAwI1NwZWVkIHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMjYuMDAjUHJveGltaXR5IHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMjcuMDAjUHJlc3N1cmUgc2Vuc29ycyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4yOC4wMCNDdXJyZW50IHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMDAuMDAjTGlnaHQgYW5kIHdhdmUgYW5kIHNvdW5kIGdlbmVyYXRpbmcgYW5kICBtZWFzdXJpbmcgZXF1aXBtZW50IzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjAxLjAwI0xpZ2h0IGFic29ycHRpb25tZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMDIuMDAjQWNvdXN0aWMgdGVzdGluZyByb29tcyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4wMy4wMCNBbmVjaG9pYyBjaGFtYmVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4wNC4wMCNGcmVxdWVuY3kgYW5hbHl6ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjA1LjAwI0ZyZXF1ZW5jeSBjb3VudGVycyBvciB0aW1lciBvciBkaXZpZGVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4wNi4wMCNFbGVjdHJpY2FsIGZyZXF1ZW5jeSBtZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMDcuMDAjSW50ZXJmZXJvbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjA4LjAwI0xhc2VycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4wOS4wMCNMaWdodG1ldGVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xMC4wMCNMdXhtZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMTEuMDAjT3B0aWNhbCBjYWxsaWJyYXRpb24gc2V0cyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xMi4wMCNQaG90b21ldGVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xMy4wMCNQb2xhcmltZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMTQuMDAjUG9sYXJpc2NvcGVzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjE1LjAwI1JlZmxlY3RvbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjE2LjAwI1NvbmFycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xNy4wMCNTb25vbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjE4LjAwI1NvdW5kIG1lYXN1cmluZyBhcHBhcmF0dXMgb3IgZGVjaWJlbCBtZXRlciM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xOS4wMCNTcGVjdHJvZmx1b3JpbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjIwLjAwI1NwZWN0cm9ncmFwaHMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMjEuMDAjU3BlY3Ryb21ldGVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4yMi4wMCNNYXNzIHNwZWN0cm9tZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMjMuMDAjUHJvdG9uIHNwZWN0cm9tZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMjQuMDAjU3BlY3Ryb3Bob3RvbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjI1LjAwI1N0cm9ib3Njb3BlcyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4yNi4wMCNTb3VuZCB2ZWxvY2l0eSBhbmFseXplcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMjcuMDAjVGhpY2tuZXNzIG1lYXN1cmluZyBkZXZpY2VzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIxLjAwLjAwI1RyYW5zZHVjZXJzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIxLjAxLjAwI1BpZXpvIGVsZWN0cmljIGNyeXN0YWxzIzQxLjExLjIxLjAwLjAwCi11bnNwc2M3IzQxLjExLjIxLjAyLjAwI1N0cmFpbiBnYXVnZXMjNDEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjEuMDMuMDAjRmliZXIgc2Vuc29ycyM0MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4wMC4wMCNUZW1wZXJhdHVyZSBhbmQgaGVhdCBtZWFzdXJpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjIuMDEuMDAjQ2Fsb3JpbWV0ZXJzIzQxLjExLjIyLjAwLjAwCi11bnNwc2M3IzQxLjExLjIyLjAyLjAwI0hlYXQgdHJhY2luZyBlcXVpcG1lbnQjNDEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjIuMDMuMDAjTWVsdGluZyBwb2ludCByZWNvcmRlcnMjNDEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjIuMDQuMDAjUHlyb21ldGVycyM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4wNS4wMCNUZW1wZXJhdHVyZSByZWd1bGF0b3JzIzQxLjExLjIyLjAwLjAwCi11bnNwc2M3IzQxLjExLjIyLjA2LjAwI1RoZXJtb2NvdXBsZXMjNDEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjIuMDcuMDAjVGhlcm1vZ3JhcGhzIzQxLjExLjIyLjAwLjAwCi11bnNwc2M3IzQxLjExLjIyLjA5LjAwI1RoZXJtb3N0YXRzIzQxLjExLjIyLjAwLjAwCi11bnNwc2M3IzQxLjExLjIyLjEwLjAwI1JlbW90ZSByZWFkaW5nIHRoZXJtb21ldGVycyM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4xMS4wMCNSZXNpc3RhbmNlIHRoZXJtb21ldGVycyM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4xMi4wMCNTdXJmYWNlIHRoZXJtb21ldGVycyM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4xMy4wMCNIYW5kaGVsZCB0aGVybW9tZXRlciM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMy4wMC4wMCNIdW1pZGl0eSBtZWFzdXJpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjMuMDEuMDAjSHlncm9tZXRlcnMjNDEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjMuMDIuMDAjUHN5Y2hyb21ldGVycyM0MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMy4wMy4wMCNUZW1wZXJhdHVyZSBodW1pZGl0eSB0ZXN0ZXJzIzQxLjExLjIzLjAwLjAwCi11bnNwc2M3IzQxLjExLjI0LjAwLjAwI1ByZXNzdXJlIG1lYXN1cmluZyBhbmQgY29udHJvbCBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNC4wMS4wMCNEZXB0aCBnYXVnZXMjNDEuMTEuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjQuMDIuMDAjTWFub3N0YXRzIzQxLjExLjI0LjAwLjAwCi11bnNwc2M3IzQxLjExLjI0LjAzLjAwI1ByZXNzdXJlIHJlYWRpbmcgaW5kaWNhdG9ycyM0MS4xMS4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNC4wNC4wMCNQcmVzc3VyZSByZWd1bGF0b3IjNDEuMTEuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjQuMDUuMDAjUHJlc3N1cmUgb3IgdmFjdXVtIHJlY29yZGVycyM0MS4xMS4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNC4wNi4wMCNWYWN1dW0gZ2F1Z2VzIzQxLjExLjI0LjAwLjAwCi11bnNwc2M3IzQxLjExLjI0LjA3LjAwI0xpcXVpZCBsZXZlbCBjb250cm9scyBvciBpbnN0cnVtZW50cyM0MS4xMS4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNS4wMC4wMCNGbG93IG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNS4wMS4wMCNGbG93bWV0ZXJzIzQxLjExLjI1LjAwLjAwCi11bnNwc2M3IzQxLjExLjI1LjAyLjAwI1JoZW9tZXRlcnMjNDEuMTEuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjUuMDMuMDAjUm90YW1ldGVycyM0MS4xMS4yNS4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNS4wNC4wMCNXYXRlciBtZXRlcnMjNDEuMTEuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjUuMDUuMDAjV2F0ZXIgbWV0ZXIgc3BhcmVzIzQxLjExLjI1LjAwLjAwCi11bnNwc2M3IzQxLjExLjI1LjA2LjAwI1ZlbnR1cmlzIzQxLjExLjI1LjAwLjAwCi11bnNwc2M3IzQxLjExLjI3LjAwLjAwI1NlZWQgYW5kIGZlZWQgZXF1aXBtZW50IzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjI3LjAxLjAwI0dyYWluIGFuYWx5emVycyM0MS4xMS4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNy4wMi4wMCNTZWVkIGNvdW50ZXJzIzQxLjExLjI3LjAwLjAwCi11bnNwc2M3IzQxLjExLjI3LjAzLjAwI0ZpYmVyIGFwcGFyYXR1cyBmb3IgZmVlZCBzYW1wbGUgYW5hbHlzaXMjNDEuMTEuMjcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjguMDAuMDAjVHJhbnNwb3J0YXRpb24gcmVsYXRlZCBlcXVpcG1lbnQgYW5kIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjI4LjAxLjAwI1NwZWVkb21ldGVycyM0MS4xMS4yOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOC4wMi4wMCNUYWNob21ldGVycyM0MS4xMS4yOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOS4wMC4wMCNOYXZpZ2F0aW9uYWwgZXF1aXBtZW50IGFuZCBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOS4wMS4wMCNEaXJlY3Rpb24gZmluZGluZyBjb21wYXNzZXMjNDEuMTEuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjkuMDIuMDAjUmFkaW8gbmF2aWdhdGlvbiBpbnN0cnVtZW50cyM0MS4xMS4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOS4wMy4wMCNTZXh0YW50cyM0MS4xMS4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOS4wNC4wMCNDb21wbGV4IGNvbnRyb2xsaW5nIGRldmljZXMjNDEuMTEuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMDAuMDAjQ2hlbWljYWwgZXZhbHVhdGlvbiBpbnN0cnVtZW50cyBhbmQgc3VwcGxpZXMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMDEuMDAjRGlnaXRhbCBhbmFseXplciBjb250cm9sbGVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4wMi4wMCNDaGVtaWx1bWluZXNjZW5jZSBvciBiaW9sdW1pbmVzY2VuY2UgYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjAzLjAwI0VsZWN0cm9ncmF2aW1ldHJ5IGFuYWx5emVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4wNC4wMCNGbGFtZSBpb25pemF0aW9uIGFuYWx5emVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4wNS4wMCNJb24gYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjA2LjAwI1JhZGlvbWV0cnkgYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjA3LjAwI1JhbmRvbSBhY2Nlc3MgYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjA4LjAwI0NpbnRpZ3JhcGhpYyBhbmFseXplcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMDkuMDAjVGhlcm1hbCBkaWZmZXJlbnRpYWwgYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjEwLjAwI1RoZXJtbyBncmF2aW1ldHJ5IGFuYWx5emVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4xMS4wMCNDaHJvbWF0b2dyYXBoaWMgZGV0ZWN0b3JzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjEyLjAwI0Nocm9tYXRvZ3JhcGhpYyBzY2FubmVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4xMy4wMCNHYXMgY2hyb21hdG9ncmFwaHMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMTQuMDAjSW9uIGNocm9tYXRvZ3JhcGhzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjE1LjAwI0xpcXVpZCBjaHJvbWF0b2dyYXBocyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4xNi4wMCNUaGlubGF5ZXIgY2hyb21hdG9ncmFwaHMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMTguMDAjSGlnaCBwcmVzc3VyZSBsaXF1aWQgY2hyb21hdG9ncmFwaCBjaHJvbWF0b2dyYXBoeSM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4xOS4wMCNIaWdoIHByZXNzdXJlIHRoaW4gbGF5ZXIgY2hyb21hdG9ncmFwaCAoVExDKSM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4yMC4wMCNDb2xvcmltZXRlcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMjEuMDAjQ29uZHVjdGltZXRyaWMgaW5zdHJ1bWVudHMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMjIuMDAjRmx1b3JpbWV0ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjIzLjAwI0dlbCBwYXJ0aXRpb24gZXF1aXBtZW50IzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjI0LjAwI0h5ZHJvbWV0ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjI1LjAwI01vbm9jaHJvbWF0b3JzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjI2LjAwI05lcGhlbG9tZXRlcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMjcuMDAjT3Ntb21ldGVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4yOC4wMCNwSCBtZXRlcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMjkuMDAjUG9sYXJvZ3JhcGhzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjMwLjAwI1JhZGlvY2hyb21hdG9ncmFwaGljIHNjYW5uZXIjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMzEuMDAjU2FjY2hhcm9tZXRlcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMzIuMDAjU2FsaW5pdHkgbWV0ZXIjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMzMuMDAjVm9sdW1ldGVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMS4wMC4wMCNHYXMgYW5hbHl6ZXJzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjAxLjAwI0F1dG9tb3RpdmUgZXhoYXVzdCBlbWlzc2lvbiBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMDIuMDAjQ2F0YWx5dGljIGNvbWJ1c3Rpb24gYW5hbHl6ZXJzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjAzLjAwI0NoZW1pY2FsIGFic29ycHRpb24gZ2FzIGFuYWx5emVycyM0MS4xMS4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMS4wNC4wMCNFeHBsb3NpbWV0ZXJzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjA1LjAwI0h5ZHJvY2FyYm9ucyBhbmFseXplcnMgb3IgZGV0ZWN0b3JzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjA2LjAwI0luZnJhIHJlZCBvciB1bHRyYSB2aW9sZXQgYWJzb3JwdGlvbiBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMDcuMDAjTml0cm9nZW4gYW5hbHl6ZXJzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjA4LjAwI05pdHJvZ2VuIG94aWRlIGFuYWx5emVycyM0MS4xMS4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMS4wOS4wMCNPUlNBVCBlcXVpcG1lbnQjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMTAuMDAjT3h5Z2VuIGdhcyBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMTEuMDAjT3pvbmUgYW5hbHl6ZXJzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjEyLjAwI1BhcmFtYWduZXRpYyBzdXNjZXB0aWJpbGl0eSBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMTMuMDAjU3VsZnVyIGRpb3hpZGUgYW5hbHl6ZXJzIG9yIGRldGVjdG9ycyM0MS4xMS4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMS4xNC4wMCNUaGVybWFsIGNvbmR1Y3Rpdml0eSBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMTUuMDAjUmFkb24gZGV0ZWN0b3JzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjE2LjAwI0dhcyBkZXRlY3RvciB0dWJlcyM0MS4xMS4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4wMC4wMCNMaXF1aWQgYW5kIHNvbGlkIGFuYWx5emVycyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4wMS4wMCNBY2lkIG9yIGJhc2UgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjAyLjAwI0FsYnVtaW5vbWV0ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjAzLjAwI0FtaW5vIGFjaWQgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjA0LjAwI0JhdXhpdGUgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjA1LjAwI0NhbGNpdW0gYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjA2LjAwI0NobG9yaWRlIGFuYWx5emVycyM0MS4xMS4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4wNy4wMCNEaXNzb2x2ZWQgb3h5Z2VuIG1lYXN1cmVtZW50IG1ldGVyIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjA4LjAwI0VsZWN0cm9seXRlIGFuYWx5emVycyM0MS4xMS4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4wOS4wMCNFbnp5bWUgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjEwLjAwI0ZhdHR5IGFjaWQgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjExLjAwI0hhbGlkZSBkZXRlY3RvciBsYW1wIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjEyLjAwI0xhY3RhdGUgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjEzLjAwI01pbmVyYWwgb2lsIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzMuMTQuMDAjT2lsIGNvbnRlbnQgbW9uaXRvcnMgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjE1LjAwI09yZ2FuaWMgY2FyYm9uIGFuYWx5emVycyM0MS4xMS4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4xNi4wMCNQZXRyb2xldW0gdGVzdGluZyBlcXVpcG1lbnQjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzMuMTcuMDAjUHJvdGVpbiBhbmFseXplcnMjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzMuMTguMDAjVXJhbml1bSBhbmFseXplcnMjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzMuMTkuMDAjV2F0ZXIgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjIwLjAwI0x1YnJpY2F0aW5nIG9pbCB0ZXN0aW5nIGtpdCM0MS4xMS4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4yMS4wMCNQYWludCB0ZXN0ZXIjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzQuMDAuMDAjTnVjbGVhciBldmFsdWF0aW9uIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjM0LjAxLjAwI0FscGhhIGNvdW50ZXJzIzQxLjExLjM0LjAwLjAwCi11bnNwc2M3IzQxLjExLjM0LjAyLjAwI0FscGhhIGJldGEgY291bnRlcnMjNDEuMTEuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzQuMDMuMDAjQmV0YSBjb3VudGVycyM0MS4xMS4zNC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNC4wNC4wMCNCZXRhIGdhbW1hIGNvdW50ZXJzIzQxLjExLjM0LjAwLjAwCi11bnNwc2M3IzQxLjExLjM0LjA1LjAwI0dhbW1hIGNvdW50ZXJzIzQxLjExLjM0LjAwLjAwCi11bnNwc2M3IzQxLjExLjM0LjA2LjAwI0tWUCBtZXRlcnMjNDEuMTEuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzQuMDcuMDAjWCByYXkgbWljcm9hbmFseXNlcnMjNDEuMTEuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMDAuMDAjRWxlY3RyaWNhbCBtZWFzdXJpbmcgYW5kIHRlc3RpbmcgZXF1aXBtZW50IzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjAxLjAwI0FtbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjAyLjAwI1BoYXNlbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjAzLjAwI0JyaWRnZXMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMDQuMDAjQ2FwYWNpdGFuY2UgbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjA1LjAwI1RoZXJtb2FuYWx5c2lzIGRlcml2YXRvZ3JhcGhzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjA2LjAwI0ZyZWV6ZSB3YXRjaCBpbmRpY2F0b3JzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjA3LjAwI0hlYXQgc3RyZXNzIG1vbml0b3JzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjA4LjAwI0NvaW5jaWRlbmNlIG9yIGFudGljb2luY2lkZW5jZSBjb3VudGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4wOS4wMCNDb25kdWN0aXZpdHkgY2VsbHMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMTAuMDAjQ29uZHVjdGl2aXR5IG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xMS4wMCNDcm9zcyB0YWxrIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xMi4wMCNFYXJ0aCByZXNpc3RhbmNlIHRlc3RlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMTMuMDAjRWxlY3RyaWNhbCB2YWx1ZSByZWNvcmRlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMTQuMDAjRWxlY3Ryb21hZ25ldGljIGZpZWxkIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xNS4wMCNFbGVjdHJvbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjE2LjAwI0VsZWN0cm9uaWMgbG9hZHMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMTcuMDAjRmllbGQgc3RyZW5ndGggbWVhc3VyaW5nIGVxdWlwbWVudCM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xOC4wMCNHYWluIG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xOS4wMCNHYWx2YW5vbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjIwLjAwI0hpZ2ggdm9sdGFnZSBjYWJsZSBkZXRlY3Rpb24jNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjEuMDAjSW1wZWRhbmNlIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4yMi4wMCNDYWxpYnJhdGVkIGluZHVjdGFuY2UgY29pbHMgb3IgYm94ZXMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjMuMDAjSW5zdWxhdGlvbiByZXNpc3RhbmNlIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4yNC4wMCNJbnN1bGF0aW9uIHRlc3RlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjUuMDAjSW9uaXphdGlvbiBjaGFtYmVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4yNi4wMCNJb25tZXRlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjcuMDAjTGluZSBlYXJ0aCBsb29wIHRlc3RlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjguMDAjTWVnb2htbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjI5LjAwI01pY3Jvd2F2ZSBsZWFrYWdlIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zMC4wMCNNdWx0aW1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zMS4wMCNPaG1tZXRlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMzIuMDAjT3NjaWxsb2dyYXBocyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zMy4wMCNQb3RlbnRpb21ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zNC4wMCNRIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zNS4wMCNDYWxpYnJhdGVkIHJlc2lzdGFuY2UgbWVhc3VyaW5nIGVxdWlwbWVudCM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zNi4wMCNMZXZlbCBnZW5lcmF0b3JzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjM3LjAwI1ZvbHRhZ2Ugb3IgY3VycmVudCBtZXRlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMzguMDAjT3NjaWxsb3Njb3BlcyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zOS4wMCNBY2NlbGVyb21ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi40MC4wMCNXYXR0bWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjQxLjAwI0dGSSBjaXJjdWl0IHRlc3RvcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuNDIuMDAjQ2lyY3VpdCB0ZXN0ZXIjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuNDMuMDAjRGVtYW5kIG1ldGVycyBvciByZWdpc3RlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuNDQuMDAjQ2lyY3VpdCB0cmFjZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjAwLjAwI0VsZWN0cm9uaWMgYW5kIGNvbW11bmljYXRpb24gbWVhc3VyaW5nIGFuZCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjAxLjAwI0NhdGhvZGUgcmF5IHR1YmUgdGVzdGVyIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjAyLjAwI0NvbXBhcmF0b3JzIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjAzLjAwI0RpcmVjdGlvbmFsIGNvdXBsZXIjNDEuMTEuMzcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzcuMDQuMDAjSW50ZWdyYXRlZCBjaXJjdWl0IHRlc3RlcnMjNDEuMTEuMzcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzcuMDUuMDAjTG9naWMgc3RhdGUgdGVzdGVycyM0MS4xMS4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNy4wNi4wMCNTZW1pY29uZHVjdG9yIHRlc3RlcnMjNDEuMTEuMzcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzcuMDcuMDAjVHJhbnNpc3RvciBjaXJjdWl0IHRlc3RlcnMjNDEuMTEuMzcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzcuMDguMDAjUG93ZXIgbWV0ZXJzIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjA5LjAwI01vZHVsYXRpb24gbWV0ZXJzIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjEwLjAwI0xldmVsIG1ldGVyIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjExLjAwI05ldHdvcmsgYW5hbHl6ZXJzIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjEyLjAwI1RhcGUgdGVzdGVycyM0MS4xMS4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNy4xMy4wMCNUYXBlc3BlZWQgdGVzdGVycyM0MS4xMS4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNy4xNC4wMCNEaWZmZXJlbnRpYXRvciM0MS4xMS4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOC4wMC4wMCNHZW9waHlzaWNhbCBhbmQgZ2VvdGVjaG5pY2FsIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjAxLjAwI0dlb2xvZ2ljYWwgY29tcGFzc2VzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjAyLjAwI0dlb2xvZ2ljYWwgcHJvc3BlY3RpbmcgYXBwYXJhdHVzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjAzLjAwI0VsZWN0cm9tYWduZXRpYyBnZW9waHlzaWNhbCBpbnN0cnVtZW50cyM0MS4xMS4zOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOC4wNC4wMCNHcmF2aXR5IGdlb3BoeXNpY2FsIGluc3RydW1lbnRzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjA1LjAwI0luZHVjZWQgcG9sYXJpemF0aW9uIChJUCkgZ2VvcGh5c2ljYWwgaW5zdHJ1bWVudHMjNDEuMTEuMzguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzguMDYuMDAjTWFnbmV0b21ldGVyIGdlb3BoeXNpY2FsIGluc3RydW1lbnRzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjA3LjAwI1Jlc2lzdGl2aXR5IGdlb3BoeXNpY2FsIGluc3RydW1lbnRzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjA4LjAwI0dyYXZpbWV0ZXJzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM5LjAwLjAwI1NvaWwgbWVhc3VyaW5nIGVxdWlwbWVudCM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4wMS4wMCNCb3JlIG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4wMi4wMCNEaXNzb2x1dGlvbiBvciBkaXNpbnRlZ3JhdGlvbiB0ZXN0ZXJzIzQxLjExLjM5LjAwLjAwCi11bnNwc2M3IzQxLjExLjM5LjAzLjAwI1BhcnRpY2xlIHNpemUgbWVhc3VyaW5nIGFwcGFyYXR1cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4wNC4wMCNQZW5ldHJvbWV0ZXJzIzQxLjExLjM5LjAwLjAwCi11bnNwc2M3IzQxLjExLjM5LjA1LjAwI1Blcm1lYWJpbGl0eSB0ZXN0aW5nIGFwcGFyYXR1cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4wNi4wMCNQZXJtZWFiaWxpdHkgb3IgcG9yb3NpdHkgZXN0aW1hdGlvbiBhcHBhcmF0dXMjNDEuMTEuMzkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzkuMDcuMDAjUG9yb3NpbWV0ZXJzIzQxLjExLjM5LjAwLjAwCi11bnNwc2M3IzQxLjExLjM5LjA4LjAwI1NhbmQgdGVzdGluZyBhcHBhcmF0dXMjNDEuMTEuMzkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzkuMDkuMDAjU29pbCBjb3JlIHNhbXBsaW5nIGFwcGFyYXR1cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4xMC4wMCNTb2lsIHRlc3Rpbmcga2l0cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS40MC4wMC4wMCNSb2NrIGFuZCBzdHJhdGEgbWVhc3VyaW5nIGVxdWlwbWVudCM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS40MC4wMS4wMCNDbGlub21ldGVycyM0MS4xMS40MC4wMC4wMAotdW5zcHNjNyM0MS4xMS40MS4wMC4wMCNTZWlzbW9sb2dpY2FsIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjQxLjAyLjAwI0VhcnRocXVha2Ugc2ltdWxhdG9ycyM0MS4xMS40MS4wMC4wMAotdW5zcHNjNyM0MS4xMS40MS4wMy4wMCNTZWlzbWljIGFsYXJtIG1vZHVsZXMjNDEuMTEuNDEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDEuMDQuMDAjU2Vpc21pYyBhbXBsaWZpZXJzIzQxLjExLjQxLjAwLjAwCi11bnNwc2M3IzQxLjExLjQxLjA1LjAwI1BvcnRhYmxlIHNlaXNtaWMgYXBwYXJhdHVzIzQxLjExLjQxLjAwLjAwCi11bnNwc2M3IzQxLjExLjQxLjA2LjAwI1NlaXNtaWMgcmVjb3JkZXJzIG9yIHNlaXNtb2dyYXBocyM0MS4xMS40MS4wMC4wMAotdW5zcHNjNyM0MS4xMS40MS4wNy4wMCNTZWlzbW9tZXRlcnMjNDEuMTEuNDEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDEuMDguMDAjVmlicm9tZXRlcnMjNDEuMTEuNDEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDAuMDAjTGFuZCBzdXJ2ZXlpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDEuMDAjTWVhc3VyaW5nIHRhcGVzIzQxLjExLjQyLjAwLjAwCi11bnNwc2M3IzQxLjExLjQyLjAyLjAwI01lYXN1cmluZyByb2RzIzQxLjExLjQyLjAwLjAwCi11bnNwc2M3IzQxLjExLjQyLjAzLjAwI01lYXN1cmluZyB0YWJsZXMjNDEuMTEuNDIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDQuMDAjVGhlb2RvbGl0ZXMjNDEuMTEuNDIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDUuMDAjTG9jYXRpb24gc3Rha2UjNDEuMTEuNDIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDYuMDAjTG9jYXRpb24gaHViIzQxLjExLjQyLjAwLjAwCi11bnNwc2M3IzQxLjExLjQzLjAwLjAwI0h5ZHJvbG9naWNhbCBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS40My4wMS4wMCNPcGVuIHN0cmVhbSBjdXJyZW50IG1ldGVycyM0MS4xMS40My4wMC4wMAotdW5zcHNjNyM0MS4xMS40My4wMi4wMCNMb2dnaW5nIGluc3RydW1lbnRzIGZvciB3YXRlciB3ZWxscyM0MS4xMS40My4wMC4wMAotdW5zcHNjNyM0MS4xMS40My4wMy4wMCNPcGVuIHN0cmVhbSB3YXRlciBsZXZlbCByZWNvcmRlcnMjNDEuMTEuNDMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDAuMDAjTWV0ZW9yb2xvZ2ljYWwgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDEuMDAjQW5lbW9tZXRlcnMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDIuMDAjQmFyb21ldGVycyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4wMy4wMCNQcmVjaXBpdGF0aW9uIG9yIGV2YXBvcmF0aW9uIHJlY29yZGVycyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4wNC4wMCNSYWRpb3NvbmRlIGFwcGFyYXR1cyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4wNS4wMCNSYWluZmFsbCByZWNvcmRlcnMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDYuMDAjUHJlY2lwaXRhdGlvbiBvciBldmFwb3JhdGlvbiBzdXJmYWNlIG9ic2VydmluZyBhcHBhcmF0dXMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDcuMDAjU29sYXIgcmFkaWF0aW9uIHN1cmZhY2Ugb2JzZXJ2aW5nIGFwcGFyYXR1cyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4wOC4wMCNUZW1wZXJhdHVyZSBvciBodW1pZGl0eSBzdXJmYWNlIG9ic2VydmluZyBhcHBhcmF0dXMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDkuMDAjV2luZCBzdXJmYWNlIG9ic2VydmluZyBhcHBhcmF0dXMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMTAuMDAjV2VhdGhlciBzdGF0aW9ucyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4xMS4wMCNNZXRlb3JvbG9neSBpbnN0cnVtZW50IGFjY2Vzc29yaWVzIzQxLjExLjQ0LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ1LjAwLjAwI01lY2hhbmljYWwgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDUuMDEuMDAjRHluYW1vbWV0ZXJzIzQxLjExLjQ1LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ1LjAyLjAwI0VsYXN0b21ldGVycyM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40NS4wMy4wMCNFeHRlbnNvbWV0ZXJzIzQxLjExLjQ1LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ1LjA0LjAwI1BpdGNoIG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40NS4wNS4wMCNSb3VuZG5lc3MgdGVzdGluZyBpbnN0cnVtZW50cyM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40NS4wNi4wMCNTcGhlcm9tZXRlcnMjNDEuMTEuNDUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDUuMDcuMDAjU3ByaW5nIHRlc3RpbmcgbWFjaGluZXMjNDEuMTEuNDUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDUuMDguMDAjU3VyZmFjZSB0ZXN0ZXJzIzQxLjExLjQ1LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ1LjA5LjAwI1RlbnNpb21ldGVycyM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40NS4xMC4wMCNUb3JxdWUgbGltaXRlciM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4wMC4wMCNNZXRhbHMgYW5kIG1ldGFsbHVyZ3kgYW5kIHN0cnVjdHVyYWwgbWF0ZXJpYWxzIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMDEuMDAjQWJyYXNpb24gdGVzdGVycyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4wMi4wMCNDb21wcmVzc2lvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjAzLjAwI0NvbmNyZXRlIG9yIGNlbWVudCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjA0LjAwI0NvcnJvc2lvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjA1LjAwI0NyYWNrIG9yIGNvcnJvc2lvbiBkZXRlY3RvcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMDYuMDAjQ3JlZXAgdGVzdGVycyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4wNy4wMCNEdWN0aWxpdHkgdGVzdGluZyBtYWNoaW5lcyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4wOC4wMCNGYXRpZ3VlIHRlc3RlcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMDkuMDAjRm9yZ2luZyB0ZXN0aW5nIGFwcGFyYXR1cyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4xMC4wMCNGb3VuZHJ5IHRlc3RpbmcgYXBwYXJhdHVzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjExLjAwI0hhcmRuZXNzIHRlc3RlcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMTIuMDAjSW1wYWN0IHRlc3RlcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMTMuMDAjTG9hZCBmcmFtZSM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4xNC4wMCNNZXRhbCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjE1LjAwI1Bob3RvZWxhc3RpYyB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjE2LjAwI1Byb29mc3RyZXNzIGluZGljYXRvcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMTcuMDAjUmVsYXhhdGlvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjE4LjAwI1JvdWdobmVzcyBtZWFzdXJpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMTkuMDAjU2hlYXIgc3RyZW5ndGggdGVzdGVycyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4yMC4wMCNTaG9jayB0ZXN0aW5nIGFwcGFyYXR1cyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4yMS4wMCNUZW5zaW9uIHRlc3RlcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMjIuMDAjVG9yc2lvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjIzLjAwI0ZsZXh1cmUgb3IgdHJhbnN2ZXJzZSB0ZXN0aW5nIG1hY2hpbmVzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjI0LjAwI1ZpYnJhdGlvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjI1LjAwI1dlYXIgdGVzdGVycyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4yNi4wMCNXZWxkaW5nIHRlc3RpbmcgYXBwYXJhdHVzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ3LjAwLjAwI1BhcGVyIGFuZCB3b29kIGFuZCB0ZXh0aWxlIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDcuMDEuMDAjQ2FyZGJvYXJkIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDcuMDIuMDAjVGV4dGlsZXMgZmFzdG5lc3MgdGVzdGVycyM0MS4xMS40Ny4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ny4wMy4wMCNMZWF0aGVyIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDcuMDQuMDAjUGFwZXIgdGVzdGluZyBpbnN0cnVtZW50cyM0MS4xMS40Ny4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ny4wNS4wMCNUZXh0aWxlIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDcuMDYuMDAjV29vZCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjQ3LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ4LjAwLjAwI0NlcmFtaWNzIGFuZCBnbGFzcyB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjQ4LjAxLjAwI0NlcmFtaWNzIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDguMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDguMDIuMDAjR2xhc3MgdGVzdGluZyBpbnN0cnVtZW50cyM0MS4xMS40OC4wMC4wMAotdW5zcHNjNyM0MS4xMS40OC4wMy4wMCNQb3R0ZXJ5IHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDguMDAuMDAKLXVuc3BzYzcjNDEuMTEuNTEuMDAuMDAjQ29hbCBhbmQgb3JlIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNTEuMDEuMDAjQ29hbCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjUxLjAwLjAwCi11bnNwc2M3IzQxLjExLjUyLjAwLjAwI1JhZGFyIGFuZCBzb25hciBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjUyLjAxLjAwI1JhZGFyYmFzZWQgc3VydmVpbGxhbmNlIHN5c3RlbXMjNDEuMTEuNTIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNTIuMDIuMDAjRmVlZCBob3JucyM0MS4xMS41Mi4wMC4wMAotdW5zcHNjNyM0Mi4wMC4wMC4wMC4wMCNNZWRpY2FsIEVxdWlwbWVudCBhbmQgQWNjZXNzb3JpZXMgYW5kIFN1cHBsaWVzIzQyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjAwLjAwLjAwI0hvc3BpdGFsIGFuZCBtZWRpY2FsIGFuZCBkZW50YWwgZXF1aXBtZW50IzQyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjE1LjAwLjAwI0FuZXN0aGVzaWEgZXF1aXBtZW50IGFuZCBpbnN0cnVtZW50cyBhbmQgYWNjZXNzb3JpZXMjNDIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTUuMDIuMDAjSGVhbHRoY2FyZSBnYXMgbWFjaGluZXMjNDIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTUuMDMuMDAjQW5lc3RoZXNpYSBtYWNoaW5lcyM0Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNS4wNC4wMCNSZWdpb25hbCBhbmFlc3RoZXNpYSBraXRzIG9yIG5lZWRsZXMjNDIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDAuMDAjTWVkaWNhbCBlcXVpcG1lbnQgYW5kIGluc3RydW1lbnRzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjAxLjAwI01lZGljYWwgdGhlcm1vbWV0ZXJzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjAyLjAwI1NwZWN1bHVtcyM0Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNi4wMy4wMCNPdG9zY29wZXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDQuMDAjQXVkaW9tZXRlcnMgb3IgdHltcGFub21ldGVycyM0Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNi4wNS4wMCNTdGV0aG9zY29wZXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDYuMDAjRXJnb25vbWV0ZXJzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjA3LjAwI0VsZWN0cm8gdGhlcmFweSBhcHBhcmF0dXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDguMDAjUGhvdG8gdGhlcmFweSBhcHBhcmF0dXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDkuMDAjSHlkcm90aGVyYXB5IHN1cHBsaWVzIG9yIGFjY2Vzc29yaWVzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjEwLjAwI0FjdXB1bmN0dXJlIHVuaXRzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjExLjAwI1N0ZXRob2dyYXBocyM0Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNi4xMi4wMCNNZWRpY2FsIHB1bXBzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjEzLjAwI01lZGljYWwgdmFsdmVzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjE0LjAwI0VuZG9zY29wZXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDAuMDAjTWVkaWNhbCB0ZXN0aW5nIGFuZCBhbmFseXppbmcgYW5kIGRpYWdub3N0aWMgZXF1aXBtZW50IzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjAxLjAwI1NraW4gdGVzdCBzdHJpcHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDIuMDAjQmxvb2QgYW5hbHl6ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjAzLjAwI0Jsb29kIGNlbGwgY291bnRlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDQuMDAjSGFlbW9nbG9iaW5vbWV0ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjA1LjAwI0JpbGlydWJpbiBtZXRlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDYuMDAjSGFlbWFjeXRvbWV0ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjA3LjAwI0NvbG9ueSBjb3VudGVycyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNy4wOC4wMCNGZXJyaXRpbiB0ZXN0IGtpdHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDkuMDAjRW56eW1lIGxpbmtlZCBpbW11bm9zb3JiZW50IGFzc2F5IChFTElTQSkgdGVzdCBraXQjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTAuMDAjSHVtYW4gaW1tdW5lIGRlZmljaWVuY3kgKEhJVikgdGVzdCBraXRzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjExLjAwI1N5ZmFjYXJkIHN5cGhpbGlzIHRlc3RzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjEyLjAwI1ByZWduYW5jeSB0ZXN0IGtpdHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTMuMDAjUmFkaW8gaW1tdW5vYXNzYXkgKFJJQSkgdGVzdCBraXRzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjE0LjAwI1BvbGlvIGNhc2UgaW52ZXN0aWdhdGlvbiBraXQjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTUuMDAjVXJpbmUgYmxvb2QgdGVzdCBzdHJpcHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTYuMDAjQ2VsbCBzaXplIGFuYWx5emVycyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNy4xNy4wMCNXaG9sZSBib2R5IGNvdW50ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjE4LjAwI0Jpb21lZGljYWwgY291bnRlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTkuMDAjTWVkaWNhbCBtdWx0aXByb2JlIHN5c3RlbSBjb3VudGVycyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNy4yMC4wMCNBbGxlcmd5IG9yIGRpYWdub3N0aWMga2l0cyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNy4yMS4wMCNVcmluYXJ5IHRlc3Qgc2V0IzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjIyLjAwI0RpZmZlcmVudGlhbCBjZWxsIGNvdW50ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjIzLjAwI1BsYXNtYSB2aXNjb3NpdHkgbWVhc3VyZW1lbnQjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjQuMDAjUGxhdGVsZXQgYW5hbHlzaXMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjUuMDAjQmxvb2QgZ2x1Y29zZSBtZXRlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjYuMDAjSGVtb2N1bHR1cmUgdGVzdHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjcuMDAjQm9keWZhdCBhbmFseXNlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjguMDAjU2FtcGxlIGNvbGxlY3Rpb24gc3lzdGVtcyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wMC4wMCNYIHJheSBhbmQgYWxwaGEgYW5kIGJldGEgYW5kIGdhbW1hIHJhZGlhdGlvbiBhcHBhcmF0dXMjNDIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMDEuMDAjRGlhZ25vc3RpYyB4IHJheSBlcXVpcG1lbnQjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMDIuMDAjUmFkaW90aGVyYXB5IHNpbXVsYXRvciM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wMy4wMCNDYWxpYnJhdGlvbiBlcXVpcG1lbnQjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMDQuMDAjQmlvbWVkaWNhbCByZXNlYXJjaCBzdXBwb3J0IHVuaXRzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjA1LjAwI0NvbXB1dGVkIHRvbW9ncmFwaHkgKENUKSBzY2FubmVycyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wNi4wMCNXYXRlciBwaGFudG9tcyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wNy4wMCNSYWRpb2Jpb2xvZ2ljYWwgaW5zdHJ1bWVudHMjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMDguMDAjR2FtbWEgc2NpbnRpbGxhdG9ycyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wOS4wMCNHYW1tYSBjYW1lcmFzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjEwLjAwI0xpbmVhciBhY2NlbGVyYXRvcnMjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMTEuMDAjUmFkaW90aGVyYXB5IGJyYWNoeXRoZXJhcHkgZXF1aXBtZW50IzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjEyLjAwI1JhZGlvdGhlcmFweSB0ZWxldGhlcmFweSBjb2JhbHQgNjAgbWFjaGluZSM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4xMy4wMCNSYWRpb3RoZXJhcHkgdGVsZXRoZXJhcHkgc3VwZXJmaWNpYWwgeCByYXkgbWFjaGluZSM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4xNC4wMCNSYWRpb3RoZXJhcHkgdGVsZXRoZXJhcHkgb3J0aG92b2x0YWdlIHggcmF5IG1hY2hpbmUjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMTUuMDAjUmFkaW90aGVyYXB5IHRlbGV0aGVyYXB5IGxpbmVhciBhY2NlbGVyYXRvcnMjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMTYuMDAjUmFkaW9pc290b3BlIHNjYW5uZXJzIGZvciBtZWRpY2FsIHB1cnBvc2VzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjE3LjAwI0RlbnRhbCB4IHJheSB1bml0cyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4xOC4wMCNBbmdpb2dyYXBoeSBzdXBwbGllcyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4xOS4wMCNBbmdpb2dyYXBoeSBkZXZpY2VzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjIwLjAwI0FuZ2lvcGxhc3R5IHN1cHBsaWVzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjIxLjAwI0FuZ2lvcGxhc3R5IGRldmljZXMjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMDAuMDAjT3h5Z2VuIHRoZXJhcHkgZXF1aXBtZW50IzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjAxLjAwI0luaGFsYXRpb24gZXF1aXBtZW50IzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjAyLjAwI01lZGljYWwgaHVtaWRpZmllcnMjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMDMuMDAjUmVzdXNjaXRhdG9ycyBvciByZXNwaXJhdG9ycyM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4wNC4wMCNBc3BpcmF0b3JzIzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjA1LjAwI0luc3VmZmxhdG9ycyM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4wNi4wMCNSZXN1c2NpdGF0aW9uIGVtZXJnZW5jeSBvdXRmaXRzIzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjA3LjAwI05lYnVsaXplcnMjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMDguMDAjQWVyb3NvbCB0aGVyYXB5IGFwcGFyYXR1cyM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4wOS4wMCNNZWRpY2FsIHZlbnRpbGF0aW9uIHN5c3RlbXMjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTAuMDAjTWFza3Mgb3IgYnJlYXRoaW5nIGJhZ3MjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTEuMDAjSGVhcnQgbHVuZyBhcHBhcmF0dXMjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTIuMDAjQnJlYXRoaW5nIGRldmljZSB3aXRoIGh5Z2llbmljIGJhcnJpZXIjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTMuMDAjT3h5Z2VuIG1hc2tzIzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjE0LjAwI01vYmlsZSBzdWN0aW9uIHVuaXQjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTUuMDAjSHlwZXJiYXJpYyB0cmVhdG1lbnQgY2hhbWJlciM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4xNi4wMCNPeHlnZW5hdG9ycyM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4xNy4wMCNBaXIgb3h5Z2VuIHVuaXRzIzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjIwLjAwLjAwI01lZGljYWwgYW5kIHN1cmdpY2FsIGFuZCBsYWJvcmF0b3J5IHN0ZXJpbGl6ZXJzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIwLjAxLjAwI0F1dG9jbGF2ZXMjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjAuMDIuMDAjU3RlYW0gc3RlcmlsaXplcnMjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjAuMDMuMDAjQm9pbGluZyBkaXNpbmZlY3RvcnMjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjAuMDQuMDAjSG90IGFpciBzdGVyaWxpemVycyM0Mi4xMC4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMC4wNS4wMCNDaGVtaWNhbCBzdGVyaWxpemVycyM0Mi4xMC4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMC4wNi4wMCNMYWJvcmF0b3J5IHN0ZXJpbGl6ZXJzIzQyLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIwLjA3LjAwI1N0ZXJpbGl6YXRpb24gb3ZlbnMjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjAuMDguMDAjR2VybWljaWRhbCBsYW1wcyM0Mi4xMC4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMC4wOS4wMCNTdGVyaWxpemluZyBsYW1wcyM0Mi4xMC4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMC4xMC4wMCNEZWNvbnRhbWluYXRpb24gd2FzaGluZyBlcXVpcG1lbnQjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDAuMDAjU3VyZ2ljYWwgc2V0cyBhbmQgaW5zdHJ1bWVudHMjNDIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDEuMDAjQ3J5byBzdXJnZXJ5IGVxdWlwbWVudCM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4wMi4wMCNBdXRvcHN5IGluc3RydW1lbnRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjAzLjAwI1N1Y3Rpb24gdW5pdHMgb3IgcGFydHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDQuMDAjU3VyZ2ljYWwgbGFzZXJzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjA1LjAwI0VsZWN0cm8gY2F1dGVyeSBzdXJnaWNhbCBlcXVpcG1lbnQjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDYuMDAjRWFyIG9yIG5vc2Ugb3IgdGhyb2F0IChFTlQpIHN1cmdlcnkgaW5zdHJ1bWVudHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDcuMDAjR3luZWNvbG9naWNhbCBzdXJnZXJ5IGluc3RydW1lbnRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjA4LjAwI0NhcmRpb2xvZ3kgc3VyZ2VyeSBpbnN0cnVtZW50cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4wOS4wMCNNaWNybyBzdXJnZXJ5IGluc3RydW1lbnRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjEwLjAwI09ydGhvcGVkaWMgc3VyZ2VyeSBpbnN0cnVtZW50cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4xMS4wMCNTdXR1cmUgY2xpcHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMTIuMDAjRGlzc2VjdGluZyBpbnN0cnVtZW50cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4xMy4wMCNEaXNzZWN0aW5nIHBpbnMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMTQuMDAjSW1wbGFudCBzeXN0ZW1zIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjE1LjAwI0Jsb29kIGxhbmNldHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMTYuMDAjU2NhbHBlbHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMTcuMDAjU3VyZ2ljYWwgYmxhZGVzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjE4LjAwI0NyYW5pb2NsYXN0cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4xOS4wMCNTdXJnaWNhbCBzY2lzc29ycyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yMC4wMCNTdXJnaWNhbCBzaGVhcnMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMjEuMDAjU3VyZ2ljYWwgZHJpbGxzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjIyLjAwI1N1cmdpY2FsIHdpcmUgc2F3cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yMy4wMCNTdXJnaWNhbCBwZXJmb3JhdG9ycyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yNC4wMCNDdXJldHRlcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yNS4wMCNTdXJnaWNhbCBjbGFtcHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMjYuMDAjU3VyZ2ljYWwgaW5zdHJ1bWVudCBob2xkZXJzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjI3LjAwI1N1cmdpY2FsIGVsZXZhdG9ycyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yOC4wMCNSYXNwYXRvcnkgaW5zdHJ1bWVudHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMjkuMDAjRm9yY2VwcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4zMC4wMCNTdXJnaWNhbCByZXRyYWN0b3JzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjMxLjAwI1N1cmdpY2FsIHNwcmVhZGVycyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4zMi4wMCNVdGVyaW5lIHNvdW5kIGluc3RydW1lbnRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjMzLjAwI0RpbGF0b3JzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjM0LjAwI1N1cmdpY2FsIGRpc2hlcyBvciBwb3RzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjM1LjAwI1N1cmdpY2FsIHByb2JlcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4zNi4wMCNTdXJnaWNhbCBtYWxsZXRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjM3LjAwI0RlY2FwaXRhdGlvbiBob29rcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4zOC4wMCNTdXR1cmVzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjM5LjAwI0NhdGd1dCBjaHJvbWljIHN1dHVyZXMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuNDAuMDAjTGFyeW5nb3Njb3BlcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS40MS4wMCNTdXJnaWNhbCBzaGF2aW5nIGtpdHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMDAuMDAjUmVoYWJpbGl0YXRpb24gZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4wMS4wMCNTcGxpbnRzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjAyLjAwI1BzeWNob2xvZ2ljYWwgYXB0aXR1ZGUgdGVzdGluZyBhcHBhcmF0dXMjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMDMuMDAjTWFzc2FnZSBhcHBhcmF0dXMjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMDQuMDAjVHJhY3Rpb24gcHVsbGV5cyBvciBiZWx0cyBvciB3ZWlnaHRzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjA1LjAwI1BoeXNpY2FsIHRoZXJhcHkgcmVoYWJpbGl0YXRpb24gZXF1aXBtZW50IG9yIGFjY2Vzc29yaWVzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjA2LjAwI092ZXJiZWQgZnJhbWVzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjA3LjAwI1JlaGFiaWxpdGF0aW9uIHN0aW11bGF0b3JzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjA4LjAwI1BhdGllbnQgbGlmdGVycyM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4wOS4wMCNTaG9ydCB3YXZlIGRpYXRoZXJteSBlcXVpcG1lbnQjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTAuMDAjTW9pc3QgaGVhdCB0aGVyYXB5IGVxdWlwbWVudCM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xMS4wMCNIZWF0IG9yIGNvbGQgcGFja3MjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTIuMDAjUGh5c2lvbG9naWNhbCBlcXVpcG1lbnQjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTMuMDAjU3RpbXVsYXRvcnMjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTQuMDAjUmVoYWJpbGl0YXRpb24gc3VwcGxpZXMgZm9yIHRoZSBibGluZCM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xNS4wMCNFbGVjdHJvbXlvZ3JhcGgjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTYuMDAjUmVoYWJpbGl0YXRpb24gc3VwcGxpZXMgZm9yIHNwZWVjaCBoYW5kaWNhcHBlZCM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xNy4wMCNFbGVjdHJvIHNsZWVwIGFwcGFyYXR1cyM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xOC4wMCNWaXN1YWwgZXhlcmNpc2UgdHJhaW5pbmcgYWlkcyM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xOS4wMCNPcnRob3BlZGljIGN1c2hpb25zIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjAwLjAwI09waHRoYWxtb2xvZ3kgaW5zdHJ1bWVudHMgYW5kIGFwcGxpYW5jZXMjNDIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDEuMDAjT3B0aGFsbW9sb2dpY2FsIHB1bmNoZXMjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDIuMDAjUGhvdG9jb2FndWxhdG9ycyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMy4wMy4wMCNTbGl0IGxhbXBzIzQyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjA0LjAwI1BlcmltZXRlcnMjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDUuMDAjVG9ub21ldGVycyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMy4wNi4wMCNSZXRpbm9tZXRlcnMjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDcuMDAjRXlld2FzaGVycyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMy4wOC4wMCNPcGh0aGFsbW9tZXRlcnMjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDkuMDAjT3BodGhhbG1vc2NvcGVzIzQyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjEwLjAwI0VtZXJnZW5jeSBleWUgY2FyZSBlcXVpcG1lbnQjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMTEuMDAjS2VyYXRvbWV0ZXJzIzQyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjEyLjAwI1Zpc2lvbiB0ZXN0ZXJzIzQyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjEzLjAwI1N5bm90b3Njb3BlcyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMy4xNC4wMCNPcGh0aGFsbWljIG9wZXJhdGlvbiBpbnN0cnVtZW50cyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wMC4wMCNHeW5lY29sb2dpY2FsIGFuZCBvYnN0ZXRyaWNhbCBpbnN0cnVtZW50cyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wMS4wMCNJbnRyYSB1dGVyaW5lIGRldmljZSAoSVVEKSBpbnNlcnRpb24ga2l0cyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wMi4wMCNUdWJhbCBsaWdhdGlvbiBraXRzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjAzLjAwI1Zhc2VjdG9teSBraXRzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjA0LjAwI0xhcGFyb3Njb3BpYyBlcXVpcG1lbnQjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMDUuMDAjU2lsYXN0aWMgYmFuZHMjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMDYuMDAjTWVuc3RydWF0aW9uIHJlZ3VsYXRpb24ga2l0cyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wNy4wMCNTcGVybW9raW5lc2VtZXRlciM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wOC4wMCNVdGVyaW5lIG9yIGd5bmVjb2xvZ2ljYWwgdGVzdHMjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMDkuMDAjT2JzdGV0cmljYWwgcmV0cmFjdG9ycyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4xMC4wMCNVbWJpbGljYWwgdGFwZXMjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMTEuMDAjQnJlYXN0IHB1bXBzIG9yIGFjY2Vzc29yaWVzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjEyLjAwI01pZHdpZmUgZXF1aXBtZW50IG9yIGtpdHMjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMTMuMDAjSHlzdGVyb3Njb3BpYyBlcXVpcG1lbnQjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMTQuMDAjVmFnaW5vc2NvcGUjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMTUuMDAjVXJldGhyb3Njb3BlIGN5c3RlcnNjb3BlIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjE2LjAwI1VtYmlsaWNhbCBjb3JkIGNsYW1wcyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4xNy4wMCNWYWN1dW0gZXh0cmFjdG9ycyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4xOC4wMCNJbiB2aXRybyBmZXJ0aWxpemF0aW9uIGVxdWlwbWVudCBvciBzdXBwbGllcyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4xOS4wMCNFbmRvbWV0cmlhbCBiaW9wc3kgZXF1aXBtZW50IzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjIwLjAwI0ludHJhdXRlcmluZSBpbnNlbWluYXRpb24gY2F0aGV0ZXJzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjIxLjAwI1BlbHZpbWV0ZXJzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI1LjAwLjAwI0ZpYmVyIG9wdGljIGV4YW1pbmF0aW9uIGluc3RydW1lbnRzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjI1LjAxLjAwI0xpZ2h0IHNvdXJjZXMjNDIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjUuMDIuMDAjRW5kb3Njb3B5IGVxdWlwbWVudCM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wMy4wMCNQcm90b3Njb3BlcyM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wNC4wMCNDdWxkb3Njb3BlcyM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wNS4wMCNHYXN0cm9zY29wZXMjNDIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjUuMDYuMDAjRXNvcGhhZ29zY29wZSM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wNy4wMCNTaWdtb2lkb3Njb3BlIzQyLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI1LjA4LjAwI0Jyb25jaG9zY29wZSM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wOS4wMCNDb2xvbm9zY29wZSM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4xMC4wMCNBcnRocm9zY29wZSM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4wMC4wMCNFbGVjdHJvIGRpYWdub3N0aWMgYXBwYXJhdHVzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjAxLjAwI0VsZWN0cm9jYXJkaW9ncmFwaHMgKEVDR3MpIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjAyLjAwI0NhcmRpb3Njb3BlcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4wMy4wMCNTdGVyZW90YWN0aWMgc3lzdGVtcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4wNC4wMCNBY2hpbGxlYW4gcmVmbGV4b21ldGVyIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA1LjAwI1RoZXNpb21ldGVyIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA2LjAwI1BuZXVtb3RhY2hvZ3JhcGhzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA3LjAwI0Jpb3ZpZGVvZ3JhcGhzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA4LjAwI1BoeXNpb2xvZ2ljYWwgbGV2ZXJzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA5LjAwI05lcnZlIGNoYW1iZXIgZXF1aXBtZW50IzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjEwLjAwI1VsdHJhc29uaWMgZGlhZ25vc3RpYyBlcXVpcG1lbnQjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMTEuMDAjVWx0cmFzb3VuZCBzY2FubmVycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4xMi4wMCNEb3BwbGVyIHVsdHJhc291bmQgZXF1aXBtZW50IzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjEzLjAwI1VsdHJhc29uaWMgc3VyZ2VyeSBlcXVpcG1lbnQgb3IgdWx0cmFzb25pYyBhc3BpcmF0aW9uIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjE0LjAwI1VsdHJhc291bmQgcGh5c2lvdGhlcmFweSBlcXVpcG1lbnQjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMTUuMDAjQ2FyZGlvIHNvbmFycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4xNi4wMCNTaG9ydCB3YXZlIG1lZGljYWwgYXBwYXJhdHVzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjE3LjAwI0Jsb29kIHByZXNzdXJlIG1lYXN1cmluZyBlcXVpcG1lbnQjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMTguMDAjRWxlY3Ryb2VuY2VwaGFsb2dyYXBocyAoRUVHcykjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMTkuMDAjU3Bpcm9tZXRlcnMjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMjAuMDAjR3luZWNvbG9naWNhbCBkaWFnbm9zdGljIGVxdWlwbWVudCM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yMS4wMCNDb2xwb3Njb3BlcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yMi4wMCNBbW5pb3Njb3BlcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yMy4wMCNGZXRhbCBtb25pdG9ycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yNC4wMCNEZWxpdmVyeSBtb25pdG9ycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yNS4wMCNOZW9uYXRhbCBtb25pdG9ycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yNi4wMCNIZWFydCBtb25pdG9yIHN5c3RlbXMjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMjcuMDAjSW50ZW5zaXZlIGNhcmUgbW9uaXRvcnMjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMjguMDAjRWxlY3Ryb21lZGljYWwgdGVzdGluZyBlcXVpcG1lbnQjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMjkuMDAjRGVmaWJyaWxsYXRvciB0ZXN0ZXIjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMzAuMDAjQXVkaW9tZXRlciBjYWxpYnJhdGlvbiB0ZXN0ZXIjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMzEuMDAjRWxlY3Ryb2RlIG9yIGVsZWN0cm9tZWRpY2FsIHRlc3RlciM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4zMi4wMCNWZW50aWxhdG9yIHRlc3QgbWV0ZXJzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjMzLjAwI0VDRyBwYXRpZW50IHNpbXVsYXRvcnMjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMzQuMDAjRWxlY3Ryb3N1cmdpY2FsIGFuYWx5emVycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4zNS4wMCNFbGVjdHJvbWVkaWNhbCBzYWZldHkgYW5hbHl6ZXJzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjM2LjAwI0VsZWN0cm9tZWRpY2FsIHRlc3Qgc3lzdGVtcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4zNy4wMCNFbGVjdHJvbmljIHB1bHNlIG1vbml0b3JzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjM4LjAwI1ZhZ2luYWwgdWx0cmFzb3VuZCBwcm9iZSM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4zOS4wMCNNZWRpY2FsIGNvbmR1Y3RpdmUgZ2VscyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4wMC4wMCNEaWFseXNpcyBlcXVpcG1lbnQgYW5kIGluc3RydW1lbnRzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjAxLjAwI0Jsb29kIGJhZyBzYW1wbGVyIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjAyLjAwI0Jsb29kIHdhcm1lciM0Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4wMy4wMCNEaWFseXNpcyBpbnN0cnVtZW50IHNldHMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMDQuMDAjUGVyaXRvbmVhbCBkaWFseXNpcyB1bml0cyM0Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4wNS4wMCNIYWVtb2RpYWx5c2lzIHVuaXRzIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjA2LjAwI0Jsb29kIGZpbHRlcnMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMDcuMDAjQmxvb2Qgc2VwYXJhdG9yIHN0YW5kIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjA4LjAwI1BsYXNtYXBob3Jlc2lzIGVxdWlwbWVudCM0Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4wOS4wMCNBbmdpb2dyYXBoaWMgaW5qZWN0b3JzIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjEwLjAwI0hlbWFmaWx0ZXJzIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjExLjAwI0RpYWx5c2lzIHR1YmluZyBvciBtZW1icmFuZXMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMTIuMDAjQmxvb2Qgb3h5Z2VuIGRlbWFuZCBhcHBhcmF0dXMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMTMuMDAjQ2xvdCBjb2FndWxhdGlvbiBkZXRlY3Rpb24gc3lzdGVtcyM0Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4xNC4wMCNNZWRpY2FsIGRyYWlucyBvciBkcmFpbmFnZSBraXRzIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjE1LjAwI0t5bW9ncmFwaHMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMTYuMDAjQmxvb2Qgc2FtcGxpbmcgZXF1aXBtZW50IzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjAwLjAwI0RlbnRhbCBpbnN0cnVtZW50cyBhbmQgYXBwbGlhbmNlcyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4wMS4wMCNEZW50YWwgbWl4aW5nIHNsYWJzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjAyLjAwI0JhbmRzIGZvciBkZW50YWwgbWF0cml4IzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjAzLjAwI0RlbnRhbCByZXRhaW5lcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMDQuMDAjRGVudGFsIGhhbmRwaWVjZXMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMDUuMDAjRGVudGFsIGNyeW9zdXJnaWNhbCBpbnN0cnVtZW50YXRpb24jNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMDYuMDAjRGVudGFsIGZvcm1lcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMDcuMDAjUGVyaW9kb250aXVtIGNvbnRyb2wgaW5zdHJ1bWVudHMgb3IgcGVyaW90ZXN0IzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjA4LjAwI0RlbnRhbCB0cmF5cyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4wOS4wMCNEZW50YWwgcHJvYmVzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjEwLjAwI0RlbnRhbCBzY2FsZXMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTEuMDAjRGVudGFsIHNwYXR1bGFzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjEyLjAwI0RlbnRhbCBlbGV2YXRvcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTMuMDAjRGVudGFsIGV4Y2F2YXRvcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTQuMDAjRGVudGFsIGZpbmdlciBwcm90ZWN0b3JzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjE1LjAwI0RlbnRhbCB0d2VlemVycyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4xNi4wMCNEZW50YWwgc2Npc3NvcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTcuMDAjRGVudGFsIGZvcmNlcHMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTguMDAjRGVudGFsIG1pcnJvcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTkuMDAjT3J0aG9kb250aWMgYXBwbGlhbmNlcyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4yMC4wMCNEZW50YWwgaW1wcmVzc2lvbiB0cmF5cyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4yMS4wMCNEZW50YWwgc3lyaW5nZXMgb3IgbmVlZGxlcyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4yMi4wMCNEZW50YWwgZHJpbGxzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjIzLjAwI0VuZG9kb250aWNzIGFjY2Vzc29yaWVzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI5LjAwLjAwI0NhcmRpb2xvZ3kgZXF1aXBtZW50IGFuZCBzdXBwbGllcyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOS4wMS4wMCNIZWFydCB2YWx2ZXMjNDIuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjkuMDIuMDAjSGVhcnQgY2F0aGV0ZXJzIzQyLjEwLjI5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI5LjAzLjAwI0RlZnJpYmlsYXRvcnMjNDIuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjkuMDQuMDAjQW9ydGljIGJhbGxvb24gZXF1aXBtZW50IzQyLjEwLjI5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI5LjA1LjAwI1BhY2VtYWtlcnMjNDIuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMDAuMDAjTWVkaWNhbCBjb25zdW1hYmxlcyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wMS4wMCNCbG9vZCBvciBpbnRyYXZlbm91cyAoSVYpIGJvdHRsZXMgb3IgYmFncyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wMi4wMCNUb25ndWUgZGVwcmVzc29ycyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wMy4wMCNTdXR1cmUgbmVlZGxlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wNC4wMCNCaW9wc3kgbmVlZGxlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wNS4wMCNCaW9wc3kgY2Fwc3VsZXMgb3IgcHVuY2hlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wNi4wMCNEaXNzZWN0aW5nIG5lZWRsZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMDcuMDAjQWN1cHVuY3R1cmUgbmVlZGxlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wOC4wMCNNZWRpY2FsIGRpc3Bvc2FsIGNvbnRhaW5lcnMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMDkuMDAjSGFlbWF0b2NyaXQgdHViZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMTAuMDAjU3dhYnMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMTEuMDAjQmxvb2QgdHJhbnNmdXNpb24gbmVlZGxlcyBvciBjYW5udWxhZSM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xMi4wMCNUcmFuc2ZlciBzd2FicyBvciBhcHBsaWNhdG9ycyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xMy4wMCNVcmluZSBiYWdzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjE0LjAwI1NwZWNpbWVuIGNvbnRhaW5lcnMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMTUuMDAjUGxhc3RlciBvZiBwYXJpcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xNi4wMCNTdGVyaWxlIHN0cmlwcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xNy4wMCNHYXV6ZSBjbG90aCM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xOC4wMCNDb3R0b24gd29vbCM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xOS4wMCNTdGVyaWxlIHN1cmdpY2FsIGNvbXByZXNzZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjAuMDAjQmFuZGFnZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjEuMDAjRmlyc3QgYWlkIGtpdHMgb3Iga2l0IHJlZmlsbHMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjIuMDAjSHlwb2Rlcm1pYyBzeXJpbmdlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4yMy4wMCNDb3R0b24gc3dhYnMgb24gc3RpY2tzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjI0LjAwI0luZnVzaW9uIHNldHMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjUuMDAjTmFzb2dhc3RyaWMgdHViZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjYuMDAjRGVzdHJ1Y3Rpb24gY2xpcHMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjcuMDAjRHJlc3NpbmdzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjI4LjAwI0ltcGxhbnRhYmxlIGRydWcgZGVsaXZlcnkgc3lzdGVtcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4yOS4wMCNBdXRvbWF0aWMgbWFzcyB2YWNjaW5hdG9ycyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4zMC4wMCNQaXBldHRpbmcgc3lyaW5nZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzEuMDAjU2NhbHAgdmVpbiBuZWVkbGVzIG9yIHN0b3Bjb2NrcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4zMi4wMCNIeXBvZGVybWljIG5lZWRsZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzMuMDAjTWVkaWNhbCBqZXQgaW5qZWN0b3JzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjM0LjAwI0xhbmNldHMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzUuMDAjQ2F0aGV0ZXIgZm9yIGluZnVzaW9uIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjM2LjAwI0ludGF2ZW5vdXMgKElWKSBlcXVpcG1lbnQgdHViZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzcuMDAjRXlld2FzaCBzb2x1dGlvbnMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzguMDAjRXhhbWluYXRpb24gZ2xvdmVzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjM5LjAwI1BhdGhvZ2VuIGNsZWFudXAga2l0cyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC40MC4wMCNEaWFiZXRpYyBzeXJpbmdlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC40MS4wMCNEaWFiZXRpYyBwZW4gbmVlZGxlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC40Mi4wMCNMYW5jZXQgZGV2aWNlIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjExLjAwLjAwLjAwI0Fzc2lzdGl2ZSBhbmQgY29ycmVjdGl2ZSBkZXZpY2VzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDAuMDAjUHJvc3RoZXNlcyBhbmQgcGFydHMgdGhlcmVvZiM0Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4wMS4wMCNBbmtsZSBvciBmb290IG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjAyLjAwI0NlcnZpY2FsIG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjAzLjAwI0NlcnZpY28gdGhvcmF0aWMgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDQuMDAjQ2VydmljbyB0aG9yYXRpYyBsdW1ibyBzYWNyYWwgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDUuMDAjRWxib3cgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDYuMDAjRWxib3cgd3Jpc3Qgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDcuMDAjRmluZ2VyIG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjA4LjAwI0Zvb3Qgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDkuMDAjSGFuZCBvcnRob3NlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4xMC4wMCNIaXAgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMTEuMDAjSGlwIGtuZWUgYW5rbGUgZm9vdCBvcnRob3NlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4xMi4wMCNIaXAgb3Iga25lZSBvciBhbmtsZSBvcnRob3NlcyBqb2ludHMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMTMuMDAjU2hvdWxkZXIgb3IgZWxib3cgb3Igd3Jpc3Qgb3J0aG9zZXMgam9pbnRzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjE0LjAwI0tuZWUgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMTUuMDAjS25lZSBhbmtsZSBmb290IG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjE2LjAwI0x1bWJvIG9yIHNhY3JhbCBvcnRob3NlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4xNy4wMCNTYWNybyBpbGlhYyBvcnRob3NlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4xOC4wMCNTaG91bGRlciBvciBlbGJvdyBvciB3cmlzdCBvciBoYW5kIG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjE5LjAwI1Rob3JhY28gb3IgbHVtYm8gb3Igc2FjcmFsIG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjIwLjAwI1dyaXN0IG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjIxLjAwI1dyaXN0IG9yIGhhbmQgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjIuMDAjV3Jpc3Qgb3IgaGFuZCBvciBmaW5nZXIgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjMuMDAjQW5rbGUgZGlzYXJ0aWN1bGF0aW9uIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjQuMDAjQXVyYWwgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4yNS4wMCNDb3NtZXRpYyBvciBza2luIGNvdmVyaW5nIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjYuMDAjRWxib3cgZGlzYXJ0aWN1bGF0aW9uIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjcuMDAjSGlwIGRpc2FydGljdWxhdGlvbiBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjI4LjAwI0hvb2sgb3IgZnVuY3Rpb25hbCB0b29sIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjkuMDAjS25lZSBvciBoaXAgam9pbnQgcHJvc3RoZXNlcyBvciB0b3JxdWUgcmVkdWNlcnMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMzAuMDAjV3Jpc3Qgb3IgZWxib3cgam9pbnQgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4zMS4wMCNLbmVlIGRpc2FydGljdWxhdGlvbiBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjMyLjAwI01hbW1hcnkgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4zMy4wMCNOYXNhbCBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjM0LjAwI09jdWxhciBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjM1LjAwI0JhY2sgZmlsbGVyIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMzYuMDAjUGFsYXRlIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMzcuMDAjUGFydGlhbCBmb290IGluY2x1ZGluZyB0b2UgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4zOC4wMCNQYXJ0aWFsIGhhbmQgaW5jbHVkaW5nIGZpbmdlciBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjM5LjAwI1Nob3VsZGVyIGRpc2FydGljdWxhdGlvbiBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQwLjAwI1NvY2tldCBvciBhbGlnbm1lbnQgdW5pdCBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQxLjAwI1RlbXBvcmFyeSBwcm9zdGhlc2VzIGZvciBlYXJseSBtb2JpbGl6YXRpb24gb2YgbG93ZXIgbGltYiBhbXB1dGVlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS40Mi4wMCNUcmFuc2ZlbW9yYWwgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS40My4wMCNUcmFuc2h1bWVyYWwgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS40NC4wMCNUcmFuc3JhZGlhbCBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQ1LjAwI1RyYW5zdGliaWFsIGluY2x1ZGluZyBhbmtsZSBvciBmb290IGRldmljZSBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQ2LjAwI1dyaXN0IGRpc2FydGljdWxhdGlvbiBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQ3LjAwI1Byb3N0aGV0aWMgaGFuZHMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuNDguMDAjVmFzY3VsYXIgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4wMC4wMCNDb21tdW5pY2F0aW9uIGFuZCBlZHVjYXRpb25hbCBtYXRlcmlhbCBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjAxLjAwI0JyYWlsbGUgd3JpdGluZyBwYXBlciBvciBwbGFzdGljIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjAyLjAwI1N3aXRjaGJvYXJkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjAzLjAwI0NoYXJhY3RlciByZWFkaW5nIG1hY2hpbmVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMDQuMDAjU3ludGhldGljIHNwZWVjaCBkZXZpY2VzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMDUuMDAjVGFjdGlsZSBkaXNwbGF5cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjA2LjAwI0xldHRlciBvciBzeW1ib2wgYm9hcmRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMDcuMDAjRGlhbG9ndWUgdW5pdHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4wOC4wMCNWb2ljZSBnZW5lcmF0b3JzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMDkuMDAjVm9pY2UgYW1wbGlmaWVycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjEwLjAwI0hlYXJpbmcgYWlkcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4xMS4wMCNXcml0aW5nIGZyYW1lcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjEyLjAwI1JhaW4gaW5kaWNhdG9ycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjEzLjAwI0xpZ2h0IGluZGljYXRvcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4xNC4wMCNTb3VuZCBpbmRpY2F0b3JzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMTUuMDAjU3BlZWNoIHRyYWluaW5nIGFpZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4xNi4wMCNMYW5ndWFnZSB0cmFpbmluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMTcuMDAjQnJhaWxsZSBlcXVpcG1lbnQjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMTguMDAjQm9vayBvciBtYW51c2NyaXB0IGhvbGRlcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4xOS4wMCNQYWdlIHR1cm5lcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4yMC4wMCNTaWduYXR1cmUgZ3VpZGVzIG9yIHN0YW1wcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjIxLjAwI0VyZ29ub21pY2FsbHkgZGVzaWduZWQgc3RhdGlvbmVyeSBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDAuMDAjRnVybml0dXJlIGFuZCBhY2Nlc3NvcmllcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjAxLjAwI1ByZXNzdXJlIHNvcmUgcHJldmVudGlvbiBmdXJuaXR1cmUjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDIuMDAjUHJlc3N1cmUgc29yZSBwcmV2ZW50aW9uIG1hdHRyZXNzZXMgb3IgY292ZXJpbmdzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjAzLjAwI0JhY2twYWRzIG9yIGJhY2tyZXN0cyBvciBzaW1pbGFyIGFkYXB0YXRpb25zIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDQuMDAjQXJtIHJlc3RzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDUuMDAjQmVkIGV4dGVuc2lvbnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4wNi4wMCNCZWQgbGlmdHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4wNy4wMCNCZWQgc2hvcnRlbmluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDguMDAjRXJnb25vbWljYWxsIGRlc2lnbmVkIGJlZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4wOS4wMCNCbGFua2V0IHN1cHBvcnRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMTAuMDAjTWVjaGFuaXplZCBjaGFpcnMgdG8gYXNzaXN0IHdpdGggc2l0dGluZyBvciBzdGFuZGluZyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjExLjAwI0NveGl0IG9yIGFydGhyb2Rlc2lzIGNoYWlycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjEyLjAwI0xlZyBleHRlbmRlcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4xMy4wMCNMZWcgc3VwcG9ydHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4xNC4wMCNNb2R1bGFyIG9yIHNwZWNpYWwgc2l0dGluZyBmdXJuaXR1cmUgc3lzdGVtcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjE1LjAwI0hlaWdodCBhZGp1c3RhYmxlIHBsaW50aHMgb3IgYnJhY2tldHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4xNi4wMCNFcmdvbm9taWNhbGx5IGRlc2lnbmVkIHRhYmxlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjAwLjAwI1BlcnNvbmFsIGNhcmUgZGV2aWNlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjAxLjAwI0FpZHMgdG8gYXNzaXN0IGluIGRyZXNzaW5nIG9uZXMgc2VsZiBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjAyLjAwI0FpZHMgZm9yIHdhc2hpbmcgb25lcyBzZWxmIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMDMuMDAjQWlkcyBmb3IgZHJ5aW5nIG9uZXMgc2VsZiBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjA0LjAwI0JhdGhpbmcgc3RyZXRjaGVycyBvciBzaG93ZXIgdGFibGVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMDUuMDAjRGlhcGVyIGNoYW5naW5nIHRhYmxlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjA2LjAwI0JlZHBhbnMgb3IgY29tbW9kZSBjaGFpcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOC4wNy4wMCNCdXR0b25pbmcgb3IgZmFzdGVuaW5nIGRldmljZXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOC4wOC4wMCNFeHRlbmRlZCBoYW5kbGUgY29tYnMgb3IgYnJ1c2hlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjA5LjAwI1RvaWxldCBhdHRhY2hlZCBkb3VjaGVzIG9yIGFpciBkcnllcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOC4xMC4wMCNUb2lsZXQgc2VhdHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOC4xMS4wMCNIYW5kIGdyaXAgdG9vdGhicnVzaGVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMTIuMDAjQm9keSB3b3JuIHVyaW5lIGFic29yYmluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMTMuMDAjVXJpbmUgY29sbGVjdGlvbiBzeXN0ZW1zIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMTQuMDAjSW5jb250aW5lbmNlIGFsYXJtcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjE1LjAwI09zdG9teSBiYWdzIG9yIGFjY2Vzc29yaWVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMDAuMDAjUHJvdGVjdGlvbiBhbmQgbW9iaWxpdHkgZGV2aWNlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjAxLjAwI0NydXRjaGVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjAyLjAwI1RyaXBvZHMgb3IgcXVhZHJvcG9kcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4wMy4wMCNXYWxraW5nIHN0aWNrcyBhY2Nlc3NvcmllcyBvciBwYXJ0cyB0aGVyZW9mIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjA0LjAwI1JvbGxhdG9ycyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4wNS4wMCNXYWxrZXJzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjA2LjAwI1doZWVsY2hhaXJzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjA3LjAwI1doZWVsY2hhaXIgYWNjZXNzb3JpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMDguMDAjU3VwcG9ydCByYWlscyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjA5LjAwI1JvcGUgbGFkZGVycyBvciBsaWZ0aW5nIGJlbHRzIG9yIGhhcm5lc3NlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjEwLjAwI0xpZnRpbmcgb3IgdHVybmluZyBjdXNoaW9ucyBjYXJwZXRzIG9yIHNoZWV0cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjExLjAwI0hvaXN0cyBvciB0cm9sbGV5cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4xMi4wMCNXaGVlbGNoYWlyIHJhbXBzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjEzLjAwI1doZWVsY2hhaXIgbGlmdGluZyBwbGF0Zm9ybXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMTQuMDAjTmF2aWdhdGlvbiBvciBvcmllbnRhdGlvbiBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMTUuMDAjQ2hhaXIgbGlmdHMgb3IgY2hhaXIgdHJhbnNwb3J0ZXJzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMTYuMDAjV2FybmluZyBvciBhbGFybSBkZXZpY2VzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMTcuMDAjQWlyd2F5IHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjE4LjAwI0VhciBvciBoZWFyaW5nIHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjE5LjAwI0ZhY2Ugb3IgZXllIHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjIwLjAwI0hhbmQgb3IgYXJtIG9yIGVsYm93IHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjIxLjAwI0hlYWQgcHJvdGVjdGlvbiBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMjIuMDAjTG93ZXIgZXh0cmVtaXR5IHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjIzLjAwI0JhdGh0dWIgbGVuZ3RoIG9yIHdpZHRoIHJlZHVjdGlvbiBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMjQuMDAjVHJ1bmsgb3Igd2hvbGUgYm9keSBwcm90ZWN0aW9uIGFpZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4yNS4wMCNCb2R5IHN1cHBvcnQgdW5pdHMgZm9yIGhvaXN0cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjI2LjAwI0Rvb3Igd2FybmVycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjI3LjAwI0Zsb2F0YXRpb24gb3Igc3dtbWluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMjguMDAjUmVsaWVmIG1hcHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4yOS4wMCNOb24gY29zbWV0aWMgc2tpbiBjbGVhbmluZyBvciBwcm90ZWN0aXZlIHByb2R1Y3RzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMzAuMDAjU3RhdGlvbmFyeSBob2lzdHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4zMS4wMCNTdG9tYSBzaGllbGRzIG9yIHByb3RlY3RvcnMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMzIuMDAjVGFjdGlsZSBzdGlja3MgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4zMy4wMCNUb2lsZXQgYXJtIG9yIGJhY2tyZXN0cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjAwLjAwI1JlY3JlYXRpb25hbCBhbmQgdHJhaW5pbmcgYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjAxLjAwI0NhbXBpbmcgZXF1aXBtZW50IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMDIuMDAjVGlsdGluZyB0YWJsZXMgZm9yIGJhbGFuY2UgdHJhaW5pbmcgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMC4wMy4wMCNCaW9mZWVkYmFjayBkZXZpY2VzIGZvciBtb3ZlbWVudCBzdHJlbmd0aCBvciBiYWxhbmNlIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMDQuMDAjU3BvcnRzIGV4ZXJjaXNlIGFpZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMC4wNS4wMCNGaXNoaW5nIG9yIGh1bnRpbmcgYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIwLjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjA2LjAwI1BsYXlpbmcgb3IgdHJhaW5pbmcgYmFsbHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMC4wNy4wMCNDaGVzcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIwLjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjA4LjAwI1BsYXlpbmcgY2FyZHMgb3IgaG9sZGVycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIwLjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjA5LjAwI0dhcmRlbmluZyB0b29scyBvciBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMTAuMDAjSGFuZGljcmFmdCB0b29scyBtYXRlcmlhbHMgb3IgZXF1aXBtZW50IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMTEuMDAjUGhvdG9ncmFwaGljIGVxdWlwbWVudCBvciBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMTIuMDAjQ2FyYXZhbm5pbmcgZXF1aXBtZW50IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMTMuMDAjVmlicmF0aW5nIGNoYWlycyBmb3IgdHJhaW5pbmcgZGVhZiBwZW9wbGUjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDAuMDAjU3BlY2lhbGl6ZWQgYWlkcyBmb3IgaG91c2VrZWVwaW5nIGFuZCBoYW5kbGluZyBnb29kcyBhbmQgbWVhc3VyaW5nIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDEuMDAjV2VpZ2hpbmcgb3IgbWVhc3VyaW5nIGFpZHMgb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjAyLjAwI0N1dHRpbmcgb3IgY2hvcHBpbmcgb3IgZGl2aWRpbmcgYWlkcyBvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDMuMDAjQ2xlYW5pbmcgb3IgcGVlbGluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDQuMDAjQmFraW5nIG9yIGNvb2tpbmcgb3IgZnJ5aW5nIGFpZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4wNS4wMCNGb29kIG9yIGRyaW5rIHNlcnZpY2UgYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjA2LjAwI0Zvb2Qgc3RvcHBlcnMgb3IgZnVubmVscyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjA3LjAwI1RhYmxld2FyZSBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjA4LjAwI1B1c2hlciBlZGdlcyBvciBwbGF0ZSBidWZmZXJzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDkuMDAjRmVlZGluZyBhcHBhcmF0dXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4xMC4wMCNGZWVkaW5nIHByb2JlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjExLjAwI1Nob2UgY2xlYW5pbmcgYXBwYXJhdHVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMTIuMDAjU2V3aW5nIG9yIGtuaXR0aW5nIG9yIGNyb2NoZXRpbmcgb3IgZGFybmluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMTMuMDAjQm90dGxlIG9yIGNhbiBvciBjb250YWluZXIgb3BlbmVycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjE0LjAwI1R1YmUgc3F1ZWV6aW5nIGtleXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4xNS4wMCNHcmFzcGluZyBhaWRzIHRvIGFzc2lzdCBvciByZXBsYWNlIGhhbmQgb3IgZmluZ2VyIGZ1bmN0aW9uIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMTYuMDAjR3JpcCBhZGFwdGVycyBvciBhdHRhY2htZW50cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjE3LjAwI0JvZHkgd29ybiBob2xkZXJzIHRvIGFzc2lzdCBoYW5kIG9yIGZpbmdlciBmdW5jdGlvbiBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjE4LjAwI1N0YW5kcyB0byBhc3Npc3QgaGFuZCBvciBmaW5nZXIgZnVuY3Rpb24gZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4xOS4wMCNPcGVyYXRpbmcgc3RpY2tzIHN1Y2ggYXMgaGVhZCBvciBjaGluIG9yIG1vdXRoIHN0aWNrcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjIwLjAwI0V4dGVuZGVycyB3aXRob3V0IGdyaXAgZnVuY3Rpb24gZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4yMS4wMCNGaXhlZCBwb3NpdGlvbmluZyBzeXN0ZW1zIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMjIuMDAjQmFsYW5jZXMgb3IgZXF1aXBtZW50IGZvciBob2lzdGluZyBvciBiYWxhbmNpbmcgb2JqZWN0cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjIzLjAwI01hbmlwdWxhdG9ycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjI0LjAwI1JvYm90cyB0byBhc3Npc3QgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjI1LjAwI0luZGljYXRvcnMgc3VjaCBhcyBzaWduYWwgbGlnaHRzIG9yIGJ1enplcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4yNi4wMCNQb2ludGluZyBsYW1wcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjI3LjAwI01lYXN1cmluZyBhaWRzIG9yIHRvb2xzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMjguMDAjT2JqZWN0IHBvc2l0aW9uaW5nIGxpZnRpbmcgb3IgdGlsdGluZyBzeXN0ZW1zIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMjkuMDAjTWFudWFsIGV4dGVuZGVkIHJlYWNoIGdyaXBwaW5nIHRvbmdzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMDAuMDAuMDAjVmV0ZXJpbmFyeSBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzQyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEyLjE1LjAwLjAwI1ZldGVyaW5hcnkgZXF1aXBtZW50IzQyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEyLjE1LjAxLjAwI1ZldGVyaW5hcnkgYmxvb2QgcHJlc3N1cmUgdGVzdGVycyM0Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMi4xNS4wMi4wMCNWZXRlcmluYXJ5IGt5bW9ncmFwaCB0ZXN0ZXIjNDIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMTUuMDMuMDAjVmV0ZXJpbmFyeSBweXJvZ2VuaWMgdGVzdGVyIzQyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE1LjA0LjAwI1ZldGVyaW5hcnkgc3RlcmVvdG94aWMgZXF1aXBtZW50IzQyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE1LjA1LjAwI1ZldGVyaW5hcnkgZWxlY3Ryb2NhcmRpb2dyYXBoIChFQ0cpIzQyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE2LjAwLjAwI1ZldGVyaW5hcnkgcHJvZHVjdHMjNDIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMTYuMDEuMDAjR2FzdHJvaW50ZXN0aW5hbCB2ZXRlcmluYXJ5IHByb2R1Y3RzIzQyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE2LjAyLjAwI0Jsb29kIG9yIGJsb29kIGZvcm1pbmcgdmV0ZXJpbmFyeSBwcm9kdWN0cyM0Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMi4xNi4wMy4wMCNSZXNwaXJhdG9yeSBzeXN0ZW0gdmV0ZXJpbmFyeSBwcm9kdWN0cyM0Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMi4xNi4wNC4wMCNNdXNjdWxvIHNrZWxldGFsIG9yIG5lcnZvdXMgc3lzdGVtIHZldGVyaW5hcnkgcHJvZHVjdHMjNDIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMTYuMDUuMDAjQ2FyZGlvdmFzY3VsYXIgc3lzdGVtIHZldGVyaW5hcnkgcHJvZHVjdHMjNDIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMTYuMDYuMDAjRGVybWF0b2xvZ2ljYWxzIG9yIGFudGlwcm90b3pvYSB2ZXRlcmluYXJ5IHByb2R1Y3RzIzQyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE2LjA3LjAwI0dlbml0byB1cmluYXJ5IHN5c3RlbSBzZXggb3IgaG9ybW9uZSB2ZXRlcmluYXJ5IHByb2R1Y3RzIzQyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzQzLjAwLjAwLjAwLjAwI0NvbW11bmljYXRpb25zIGFuZCBDb21wdXRlciBFcXVpcG1lbnQgYW5kIFBlcmlwaGVyYWxzIGFuZCBDb21wb25lbnRzIGFuZCBTdXBwbGllcyM0My4wMC4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4wMC4wMC4wMCNTb2Z0d2FyZSM0My4wMC4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4xNS4wMC4wMCNEYXRhYmFzZSBzeXN0ZW1zIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjE1LjAxLjAwI0RhdGFiYXNlIHNvZnR3YXJlIzQzLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE2LjAwLjAwI09wZXJhdGluZyBzeXN0ZW1zIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjE2LjAxLjAwI01haW5mcmFtZSBvcGVyYXRpbmcgc3lzdGVtIHNvZnR3YXJlIzQzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE2LjAyLjAwI1BlcnNvbmFsIGNvbXB1dGVyIChQQykgb3BlcmF0aW5nIHN5c3RlbSBzb2Z0d2FyZSM0My4xNi4xNi4wMC4wMAotdW5zcHNjNyM0My4xNi4xNi4wMy4wMCNPcGVuIHN5c3RlbXMgb3BlcmF0aW5nIHN5c3RlbXMjNDMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTYuMDQuMDAjQ2x1c3RlcmluZyBzb2Z0d2FyZSM0My4xNi4xNi4wMC4wMAotdW5zcHNjNyM0My4xNi4xNy4wMC4wMCNCdXNpbmVzcyB0cmFuc2FjdGlvbiBhbmQgcGVyc29uYWwgYnVzaW5lc3Mgc29mdHdhcmUjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTcuMDEuMDAjSW52ZXN0bWVudCBtYW5hZ2VtZW50IHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjAyLjAwI1RheCBwcmVwYXJhdGlvbiBzb2Z0d2FyZSM0My4xNi4xNy4wMC4wMAotdW5zcHNjNyM0My4xNi4xNy4wMy4wMCNGYWNpbGl0aWVzIG1hbmFnZW1lbnQgc29mdHdhcmUjNDMuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTcuMDQuMDAjU29mdHdhcmUgc3VpdGVzIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjA1LjAwI0ludmVudG9yeSBtYW5hZ2VtZW50IHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjA2LjAwI0ZpbmFuY2lhbCBhbmFseXNpcyBzb2Z0d2FyZSM0My4xNi4xNy4wMC4wMAotdW5zcHNjNyM0My4xNi4xNy4wNy4wMCNBY2NvdW50aW5nIHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjA4LjAwI1RpbWUgYWNjb3VudGluZyBvciBodW1hbiByZXNvdXJjZXMgc29mdHdhcmUjNDMuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTcuMDkuMDAjQW5hbHl0aWNhbCBvciBzY2llbnRpZmljIHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjEwLjAwI01hdGhlbWF0aWNhbCBvciBmb3JlY2FzdGluZyBzb2Z0d2FyZSM0My4xNi4xNy4wMC4wMAotdW5zcHNjNyM0My4xNi4xNy4xMS4wMCNBdWN0aW9uIHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjEyLjAwI1NhbGVzIG9yIG1hcmtldGluZyBzb2Z0d2FyZSM0My4xNi4xNy4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wMC4wMCNEb2N1bWVudCBjcmVhdGlvbiBzb2Z0d2FyZSM0My4xNi4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wMS4wMCNEb2N1bWVudCBtYW5hZ2VtZW50IHNvZnR3YXJlIzQzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE4LjAyLjAwI0VsZWN0cm9uaWMgcHVibGlzaGluZyBzb2Z0d2FyZSM0My4xNi4xOC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wMy4wMCNPcHRpY2FsIGNoYXJhY3RlciByZWFkZXIgKE9DUikgc29mdHdhcmUjNDMuMTYuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTguMDQuMDAjVm9pY2UgcmVjb2duaXRpb24gc29mdHdhcmUjNDMuMTYuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTguMDUuMDAjRGVza3RvcCBwdWJsaXNoaW5nIHNvZnR3YXJlIzQzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE4LjA2LjAwI1ByZXNlbnRhdGlvbiBzb2Z0d2FyZSM0My4xNi4xOC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wNy4wMCNXb3JkIHByb2Nlc3Npbmcgc29mdHdhcmUjNDMuMTYuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTguMDguMDAjU2Nhbm5lciBzb2Z0d2FyZSM0My4xNi4xOC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wOS4wMCNTcGVsbCBjaGVja2VycyM0My4xNi4xOC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOS4wMC4wMCNEcmF3aW5nIGFuZCBpbWFnaW5nIHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjE5LjAxLjAwI0NvbXB1dGVyIGFpZGVkIGRlc2lnbiAoQ0FEKSBzb2Z0d2FyZSM0My4xNi4xOS4wMC4wMAotdW5zcHNjNyM0My4xNi4xOS4wMi4wMCNHcmFwaGljcyBzb2Z0d2FyZSM0My4xNi4xOS4wMC4wMAotdW5zcHNjNyM0My4xNi4xOS4wMy4wMCNFZHVjYXRpb25hbCBzb2Z0d2FyZSM0My4xNi4xOS4wMC4wMAotdW5zcHNjNyM0My4xNi4xOS4wNC4wMCNDb21wdXRlciBhaWRlZCBtYW51ZmFjdHVyaW5nIChDQU0pIHNvZnR3YXJlIzQzLjE2LjE5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE5LjA1LjAwI0NoYXJ0aW5nIHNvZnR3YXJlIzQzLjE2LjE5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE5LjA2LjAwI0Zvcm0gbWFraW5nIHNvZnR3YXJlIzQzLjE2LjE5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE5LjA3LjAwI01hcHBpbmcgc29mdHdhcmUjNDMuMTYuMTkuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjAuMDAuMDAjU2NoZWR1bGluZyBhbmQgcHJvZHVjdGl2aXR5IHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIwLjAxLjAwI1Byb2plY3QgbWFuYWdlbWVudCBzb2Z0d2FyZSM0My4xNi4yMC4wMC4wMAotdW5zcHNjNyM0My4xNi4yMC4wMi4wMCNTY2hlZHVsaW5nIHNvZnR3YXJlIzQzLjE2LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIwLjAzLjAwI0NvbnRhY3QgbWFuYWdlbWVudCBzb2Z0d2FyZSM0My4xNi4yMC4wMC4wMAotdW5zcHNjNyM0My4xNi4yMS4wMC4wMCNTcHJlYWRzaGVldHMgYW5kIGVuaGFuY2VtZW50IHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIxLjAxLjAwI1NwcmVhZHNoZWV0IHNvZnR3YXJlIzQzLjE2LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIyLjAwLjAwI011bHRpbWVkaWEgc29mdHdhcmUjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjIuMDEuMDAjTXVzaWMgb3Igc291bmQgZWRpdGluZyBzb2Z0d2FyZSM0My4xNi4yMi4wMC4wMAotdW5zcHNjNyM0My4xNi4yMy4wMC4wMCNQcmludCBzaG9wIHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIzLjAxLjAwI0FkZHJlc3MgYm9vayBtYWtpbmcgc29mdHdhcmUjNDMuMTYuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjMuMDIuMDAjTGFiZWwgbWFraW5nIHNvZnR3YXJlIzQzLjE2LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE2LjI0LjAwLjAwI1Byb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgdG9vbHMjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjQuMDEuMDAjQ29tcGlsaW5nIHNvZnR3YXJlcyM0My4xNi4yNC4wMC4wMAotdW5zcHNjNyM0My4xNi4yNC4wMi4wMCNDb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgc29mdHdhcmUjNDMuMTYuMjQuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjQuMDMuMDAjRGV2ZWxvcG1lbnQgc29mdHdhcmUjNDMuMTYuMjQuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjQuMDQuMDAjR3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIChHVUkpIHRvb2xzIzQzLjE2LjI0LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI0LjA1LjAwI1Byb2dyYW1taW5nIGxhbmd1YWdlcyM0My4xNi4yNC4wMC4wMAotdW5zcHNjNyM0My4xNi4yNC4wNi4wMCNQcm9ncmFtIHRlc3Rpbmcgc29mdHdhcmUjNDMuMTYuMjQuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjUuMDAuMDAjU29mdHdhcmUgdXRpbGl0aWVzIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjAxLjAwI0JhY2t1cCBvciByZWNvdmVyeSBzb2Z0d2FyZSM0My4xNi4yNS4wMC4wMAotdW5zcHNjNyM0My4xNi4yNS4wMi4wMCNCYXIgY29kaW5nIHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjAzLjAwI0ZpbGUgc2VjdXJpdHkgb3IgZGF0YSBzZWN1cml0eSBzb2Z0d2FyZSM0My4xNi4yNS4wMC4wMAotdW5zcHNjNyM0My4xNi4yNS4wNC4wMCNGb3JlaWduIGxhbmd1YWdlIHRyYW5zbGF0aW9uIHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjA1LjAwI1ByaW50IHV0aWxpdHkgc29mdHdhcmUjNDMuMTYuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjUuMDYuMDAjU3RvcmFnZSBtZWRpYSBsb2FkaW5nIHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjA3LjAwI1ZpcnVzIHByb3RlY3Rpb24gc29mdHdhcmUjNDMuMTYuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjUuMDguMDAjR2VuZXJhbCB1dGlsaXR5IHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjA5LjAwI0NvbXByZXNzaW9uIHV0aWxpdGllcyM0My4xNi4yNS4wMC4wMAotdW5zcHNjNyM0My4xNi4yNS4xMC4wMCNTeXN0ZW0gbWFuYWdlbWVudCBzb2Z0d2FyZSM0My4xNi4yNS4wMC4wMAotdW5zcHNjNyM0My4xNi4yNS4xMS4wMCNTdG9yYWdlIG1hbmFnZW1lbnQgc29mdHdhcmUjNDMuMTYuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjUuMTIuMDAjVmVyc2lvbiBjaGVja2VyIHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjAwLjAwI05ldHdvcmtpbmcgc29mdHdhcmUjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMDEuMDAjUGxhdGZvcm0gaW50ZXJjb25uZWN0aXZpdHkgc29mdHdhcmUjNDMuMTYuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMDIuMDAjT3B0aWNhbCBqdWtlYm94IHNlcnZlciBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4wMy4wMCNPcGVyYXRpbmcgc3lzdGVtIGVuaGFuY2VtZW50IHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjA0LjAwI05ldHdvcmsgb3BlcmF0aW5nIHN5c3RlbSBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4wNS4wMCNOZXR3b3JraW5nIGRldmVsb3BlcnMgc29mdHdhcmUjNDMuMTYuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMDYuMDAjTmV0d29yayBjb25uZWN0aXZpdHkgdGVybWluYWwgZW11bGF0aW9uIHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjA3LjAwI01haW5mcmFtZSB0cmFuc2FjdGlvbiBwcm9jZXNzaW5nIHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjA4LjAwI0xpY2Vuc2UgbWFuYWdlbWVudCBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4wOS4wMCNHYXRld2F5IHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjEwLjAwI0NvbXBhY3QgZGlzYyAoQ0QpIHNlcnZlciBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4xMS4wMCNBZG1pbmlzdHJhdGlvbiBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4xMi4wMCNUcmFuc2FjdGlvbiBzZXJ2ZXIgc29mdHdhcmUjNDMuMTYuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMTMuMDAjU3dpdGNoIG9yIHJvdXRlciBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4xNC4wMCNNdWx0aXBsZXhlciBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4xNS4wMCNDb21tdW5pY2F0aW9ucyBzZXJ2ZXIgc29mdHdhcmUjNDMuMTYuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMTYuMDAjQnJpZGdlIHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI3LjAwLjAwI0NvbW11bmljYXRpb24gU29mdHdhcmUjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDEuMDAjRGVza3RvcCBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSM0My4xNi4yNy4wMC4wMAotdW5zcHNjNyM0My4xNi4yNy4wMi4wMCNTZXJ2ZXIgY29tbXVuaWNhdGlvbnMgc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDMuMDAjSW50ZXJhY3RpdmUgdm9pY2UgcmVzcG9uc2Ugc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDQuMDAjTW9kZW0gc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDUuMDAjUmVtb3RlIGFjY2VzcyBzb2Z0d2FyZSM0My4xNi4yNy4wMC4wMAotdW5zcHNjNyM0My4xNi4yNy4wNi4wMCNWaWRlbyBjb25mZXJlbmNpbmcgc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDcuMDAjRXhjaGFuZ2Ugc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjguMDAuMDAjSW50ZXJuZXQgYW5kIGludHJhbmV0IHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjI4LjAxLjAwI0ludGVybmV0IGJyb3dzaW5nIHNvZnR3YXJlIzQzLjE2LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI4LjAyLjAwI1dlYiBzZXJ2ZXIgc29mdHdhcmUjNDMuMTYuMjguMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjkuMDAuMDAjTWlzY2VsbGFuZW91cyBzb2Z0d2FyZSM0My4xNi4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4yOS4wMS4wMCNDb21wdXRlciBnYW1lIHNvZnR3YXJlIzQzLjE2LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI5LjAyLjAwI1NjcmVlbiBzYXZlcnMjNDMuMTYuMjkuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjkuMDMuMDAjVHJhaW5pbmcgc29mdHdhcmUjNDMuMTYuMjkuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjkuMDQuMDAjRW50ZXJ0YWlubWVudCBzb2Z0d2FyZSM0My4xNi4yOS4wMC4wMAotdW5zcHNjNyM0My4xNi4yOS4wNS4wMCNGYW1pbHkgdGl0bGVzIzQzLjE2LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI5LjA2LjAwI0VkdWNhdGlvbmFsIHNvZnR3YXJlIzQzLjE2LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjMwLjAwLjAwI0luZHVzdHJ5IHNwZWNpZmljIHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjMwLjAxLjAwI1BvaW50IG9mIHNhbGUgKFBPUykgc29mdHdhcmUjNDMuMTYuMzAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMzAuMDIuMDAjRmxpZ2h0IGNvbnRyb2wgc29mdHdhcmUjNDMuMTYuMzAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMzAuMDMuMDAjQXZpYXRpb24gZ3JvdW5kIHN1cHBvcnQgc29mdHdhcmUjNDMuMTYuMzAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMzAuMDQuMDAjQXZpYXRpb24gdGVzdCBzb2Z0d2FyZSM0My4xNi4zMC4wMC4wMAotdW5zcHNjNyM0My4xNi4zMC4wNS4wMCNJbmR1c3RyaWFsIGNvbnRyb2wgc29mdHdhcmUjNDMuMTYuMzAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMzAuMDYuMDAjTGlicmFyeSBzb2Z0d2FyZSM0My4xNi4zMC4wMC4wMAotdW5zcHNjNyM0My4xNi4zMC4wNy4wMCNDb21wbGlhbmNlIHNvZnR3YXJlIzQzLjE2LjMwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjMxLjAwLjAwI0RyaXZlcnMgYW5kIHN5c3RlbSBzb2Z0d2FyZSM0My4xNi4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4zMS4wMS4wMCNFdGhlcm5ldCBkcml2ZXJzIzQzLjE2LjMxLjAwLjAwCi11bnNwc2M3IzQzLjE2LjMxLjAyLjAwI0dyYXBoaWNzIGNhcmQgZHJpdmVycyM0My4xNi4zMS4wMC4wMAotdW5zcHNjNyM0My4xNy4wMC4wMC4wMCNIYXJkd2FyZSBhbmQgYWNjZXNzb3JpZXMjNDMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDAuMDAjVGVsZXBob255IGVxdWlwbWVudCM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4wMS4wMCNFeGNoYW5nZSBjb21wb25lbnRzIChDT0RFQykjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDIuMDAjRXhjaGFuZ2UgZGF0YSBpbnRlcmZhY2UgY2FyZHMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDMuMDAjRXhjaGFuZ2UgZGF0YWNvbSBtb2R1bGVzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjA0LjAwI1Bob25lIGV4Y2hhbmdlIGludGVyZmFjZXMgb3IgY29tcG9uZW50cyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4wNS4wMCNFeGNoYW5nZSB0cnVuayBpbnRlcmZhY2Ugb3IgY2FyZCBjb21wb25lbnRzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjA2LjAwI1ByZW1pc2UgYnJhbmNoIGV4Y2hhbmdlIChQQlgpIHN5c3RlbXMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDcuMDAjVGVsZXBob25lIHN3aXRjaGluZyBlcXVpcG1lbnQjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDguMDAjU3dpdGNoYm9hcmQgZXF1aXBtZW50IzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjA5LjAwI1B1bmNoIGRvd24gYmxvY2tzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjEwLjAwI0FuYWxvZyBvciBkaWdpdGFsIHRlbGVwaG9uZXMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMTEuMDAjQW5hbG9nIG9yIGRpZ2l0YWwgY2VsbHVsYXIgdGVsZXBob25lcyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4xMi4wMCNNb2JpbGUgdGVsZXBob25lcyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4xMy4wMCNDb3JkbGVzcyB0ZWxlcGhvbmVzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjE0LjAwI1BheSB0ZWxlcGhvbmVzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjE1LjAwI0Fuc3dlcmluZyBtYWNoaW5lcyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4xNi4wMCNUZWxlcGhvbmUgaGVhZHNldHMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMTcuMDAjVm9pY2UgbWFpbCBzeXN0ZW1zIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjE4LjAwI0NhbGwgbWFuYWdlbWVudCBzeXN0ZW0jNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMTkuMDAjQ2VsbHVsYXIgdGVsZXBob25lIGFjY2Vzc29yaWVzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjIwLjAwI1RlbGVwaG9uZSByZXN0cyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yMS4wMCNUZWxlcGhvbmUgYWRhcHRlcnMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMjIuMDAjVGVsZXBob25lIGxpbmUgbXVsdGlwbGllcnMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMjMuMDAjVGVsZXBob25lIGxpbmUgbW9kdWxhciBjb3VwbGVycyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yNC4wMCNWaWRlb3Bob25lcyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yNS4wMCNEaWFsZXJzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjI2LjAwI1RlbGVwaG9uZSBhbXBsaWZpZXJzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjI3LjAwI1RlbGVwaG9uZSBzdGFuZHMgb3IgaG9sZGVycyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yOC4wMCNJbnRlZ3JhdGVkIHNlcnZpY2VzIGRpZ2l0YWwgbmV0d29yayBleGNoYW5nZXMgSVNETiM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yOS4wMCNUZWxlcGhvbmUgamFja3MjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDAuMDAjQW50ZW5uYXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDEuMDAjVHJhbnNtaXR0ZXJzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjAyLjAwI1JlY2VpdmVycyM0My4xNy4xNi4wMC4wMAotdW5zcHNjNyM0My4xNy4xNi4wMy4wMCNUdW5lcnMjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDQuMDAjU2hvcnQgd2F2ZSBlcXVpcG1lbnQjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDUuMDAjQWlyY3JhZnQgYW50ZW5uYXMjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDYuMDAjQXV0b21vdGl2ZSBhbnRlbm5hcyM0My4xNy4xNi4wMC4wMAotdW5zcHNjNyM0My4xNy4xNi4wNy4wMCNCcm9hZGNhc3QgYW50ZW5uYXMjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDguMDAjTWljcm93YXZlIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjA5LjAwI1RlbGV2aXNpb24gYW50ZW5uYXMjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMTAuMDAjU2F0ZWxsaXRlIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjExLjAwI1JhZGlvIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjEyLjAwI1JhZGFyIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjEzLjAwI0NvbW11bmljYXRpb25zIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjE0LjAwI0NvbW11bmljYXRpb24gdG93ZXJzIG9yIHN1cHBvcnQjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTcuMDAuMDAjVGVsZWNvbW11bmljYXRpb25zIGVxdWlwbWVudCM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4wMS4wMCNXaXJlbGVzcyBiYXNlIHN0YXRpb25zIzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE3LjAyLjAwI1RlbGVncmFwaCBlcXVpcG1lbnQjNDMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTcuMDMuMDAjVGVsZXR5cGUgZXF1aXBtZW50IzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE3LjA0LjAwI1RlbGVjb25mZXJlbmNpbmcgZXF1aXBtZW50IzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE3LjA1LjAwI1NhdGVsbGl0ZSBjb21tdW5pY2F0aW9uIGVxdWlwbWVudCM0My4xNy4xNy4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4wNi4wMCNQYWdlcnMgb3IgYmVlcGVycyM0My4xNy4xNy4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4wNy4wMCNJbnRlcmNvbW11bmljYXRpb25zIG9yIHBhZ2luZyBzeXN0ZW1zIzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE3LjA4LjAwI1B1YmxpYyBhZGRyZXNzIGVxdWlwbWVudCM0My4xNy4xNy4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4wOS4wMCNFbGVjdHJvbmljIHNvdW5kIGVxdWlwbWVudCM0My4xNy4xNy4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4xMC4wMCNEaWN0YXRpbmcgbWFjaGluZXMjNDMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTcuMTEuMDAjTGluZSBjb25kaXRpb25lcnMjNDMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTcuMTIuMDAjQ2hhbm5lbCBzZXJ2aWNlIHVuaXQgb3IgZGF0YSBzZXJ2aWNlIHVuaXQgKENTVSBvciBEU1UpIzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjAwLjAwI0NvbXB1dGVycyM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4wMS4wMCNOb3RlYm9vayBjb21wdXRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMDIuMDAjRG9ja2luZyBzdGF0aW9ucyM0My4xNy4xOC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4wMy4wMCNXb3Jrc3RhdGlvbnMgb3IgZGVza3RvcCBjb21wdXRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMDQuMDAjUGVyc29uYWwgZGlnaXRhbCBhc3Npc3RhbnRzIChQREFzKSBvciBwZW4gYmFzZWQgY29tcHV0ZXJzIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjA1LjAwI01haW5mcmFtZSBjb21wdXRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMDYuMDAjU2VydmVycyM0My4xNy4xOC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4wNy4wMCNQb3J0IHJlcGxpY2F0b3JzIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjA4LjAwI01pbmljb21wdXRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMDkuMDAjUG9pbnQgb2Ygc2FsZSAoUE9TKSB0ZXJtaW5hbHMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMTAuMDAjUHJvZ3JhbW1hYmxlIGxvZ2ljIGNvbnRyb2xsZXIgKFBMQykjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMTEuMDAjQ29uc29sZSAgbWFpbmZyYW1lIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjEyLjAwI0NvbnNvbGUgY29udHJvbGxlciAgbWFpbmZyYW1lIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjEzLjAwI0NoYW5uZWwgY29udmVydGVyIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjE0LjAwI0NoYW5uZWwgdG8gY2hhbm5lbCBpbnRlcmZhY2UgbWFpbmZyYW1lIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjE1LjAwI0NvbnRyb2wgdW5pdCM0My4xNy4xOC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4xNi4wMCNDb3VwbGVyIGZhY2lsaXR5ICBtYWluZnJhbWUjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMTcuMDAjUG93ZXIgY29vbGVyIHVuaXQgIG1haW5mcmFtZSM0My4xNy4xOC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4xOC4wMCNUaGluIGNsaWVudCBvciBkaXNrbGVzcyB3b3Jrc3RhdGlvbnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMTkuMDAjQ29uc29sZSBleHRlbmRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTkuMDAuMDAjTWVtb3J5IGFuZCBjZW50cmFsIHByb2Nlc3NpbmcgdW5pdHMgQ1BVcyBhbmQgYWNjZXNzb3JpZXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTkuMDEuMDAjQ2FjaGUgbWVtb3J5IG1vZHVsZXMjNDMuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTkuMDIuMDAjQ2VudHJhbCBwcm9jZXNzaW5nIHVuaXQgKENQVSkgcHJvY2Vzc29ycyM0My4xNy4xOS4wMC4wMAotdW5zcHNjNyM0My4xNy4xOS4wMy4wMCNDZW50YWwgcHJvY2Vzc2luZyB1bml0IChDUFUpIG1vdGhlcmJvYXJkcyBvciBkYXVnaHRlcmJvYXJkcyM0My4xNy4xOS4wMC4wMAotdW5zcHNjNyM0My4xNy4xOS4wNC4wMCNNZW1vcnkgbW9kdWxlcyM0My4xNy4xOS4wMC4wMAotdW5zcHNjNyM0My4xNy4xOS4wNS4wMCNDZW50cmFsIHByb2Nlc3NpbmcgdW5pdCBjb29sZXJzIzQzLjE3LjE5LjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjAwLjAwI0NvbXB1dGVyIGNvbnRyb2wgYW5kIGludGVyZmFjZSBib2FyZHMgYW5kIGNhcmRzIGFuZCBjYWJsZXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMDEuMDAjUGFyYWxsZWwgdG8gc21hbGwgY29tcHV0ZXIgc3lzdGVtIGludGVyZmFjZSBjb252ZXJ0ZXJzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjAyLjAwI1BhcmFsbGVsIHRvIHNlcmlhbCBjb252ZXJ0ZXJzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjAzLjAwI1NlcmlhbCBpbmZyYXJlZCBwb3J0cyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4wNC4wMCNWaWRlbyBhY2NlbGVyYXRvciBjYXJkcyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4wNS4wMCNHcmFwaGljIGFjY2VsZXJhdG9yIGNhcmRzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjA2LjAwI05ldHdvcmsgaW50ZXJmYWNlIGNhcmRzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjA3LjAwI0F1ZGlvIGNhcmRzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjA4LjAwI0VtdWxhdGlvbiBhZGFwdGVycyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4wOS4wMCNTZXJpYWwgcG9ydCBjYXJkcyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4xMC4wMCNQYXJhbGxlbCBwb3J0IGNhcmRzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjExLjAwI1NtYWxsIGNvbXB1dGVyIHN5c3RlbSBpbnRlcmZhY2UgKFNDU0kpIGNvbnRyb2xsZXIgY2FyZHMjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTIuMDAjRGVjb2RlciM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4xMy4wMCNQcm9ncmFtbWFibGUgbG9naWMgY29udHJvbGxlciBpbnB1dCBtb2R1bGUjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTQuMDAjUHJvZ3JhbW1hYmxlIGxvZ2ljIGNvbnRyb2xsZXIgY291bnRlciBtb2R1bGUjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTUuMDAjUHJvZ3JhbW1hYmxlIGxvZ2ljIGNvbnRyb2xsZXIgY29tbXVuaWNhdGlvbiBtb2R1bGUjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTYuMDAjV2lyZWxlc3MgbmV0d29yayBpbnRlcmZhY2UgY2FyZHMjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTcuMDAjVGltZWtlZXBpbmcgY2FyZCBtYWNoaW5lIGFuZCBjb21wdXRlciBpbnRlcmZhY2UgZGV2aWNlIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjE4LjAwI1Byb2Nlc3NvciBjYXJkcyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMS4wMC4wMCNBdWRpbyBhbmQgdmlzdWFsIGFjY2Vzc29yaWVzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjAxLjAwI011c2ljYWwgaW5zdHJ1bWVudCBkaWdpdGFsIGludGVyZmFjZSAoTUlESSkgaW50ZXJmYWNlcyBvciBhZGFwdGVycyM0My4xNy4yMS4wMC4wMAotdW5zcHNjNyM0My4xNy4yMS4wMi4wMCNTaWduYWwgcHJvY2Vzc29yIHVwZ3JhZGVzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjAzLjAwI1ZpZGVvIGNhcHR1cmUgYm9hcmRzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjA0LjAwI1RlbGV2aXNpb24gY2FyZHMjNDMuMTcuMjEuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjEuMDUuMDAjUmFkaW8gY2FyZHMjNDMuMTcuMjEuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjEuMDYuMDAjTXVsdGltZWRpYSBraXRzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjA3LjAwI0NvbXB1dGVyIHNwZWFrZXJzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjA4LjAwI0NvbXB1dGVyIGhlYWRzZXQjNDMuMTcuMjEuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjEuMDkuMDAjU2V0IHRvcCBib3hlcyM0My4xNy4yMS4wMC4wMAotdW5zcHNjNyM0My4xNy4yMS4xMC4wMCNWaWRlbyBjYXNzZXR0ZSBjb250YWluZXJzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjAwLjAwI0lucHV0IGRldmljZXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjIuMDEuMDAjQmFyIGNvZGUgcmVhZGVycyM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4wMi4wMCNHcmFwaGljcyB0YWJsZXRzIG9yIGRpZ2l0aXplcnMjNDMuMTcuMjIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjIuMDMuMDAjSm95c3RpY2tzIG9yIGdhbWUgcGFkcyM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4wNC4wMCNLZXlib2FyZHMgb3Iga2V5cGFkcyM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4wNS4wMCNDb21wdXRlciBtb3VzZSM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4wNi4wMCNSZW1vdGUgdXNlciBpbnRlcmZhY2VzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjA3LjAwI1NjYW5uZXJzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjA4LjAwI1RvdWNoIHBhZHMjNDMuMTcuMjIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjIuMDkuMDAjVG91Y2ggc2NyZWVucyM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4xMC4wMCNUcmFja2JhbGxzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjExLjAwI1ZvaWNlIG1pY3JvcGhvbmVzIGZvciBjb21wdXRlcnMjNDMuMTcuMjIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjIuMTIuMDAjUHVuY2ggY2FyZCByZWFkZXJzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjEzLjAwI0xpZ2h0IHBlbiM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4xNC4wMCNTdHlsdXMgcGVuIGZvciBtb2JpbGUgY29tcHV0ZXJzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjE1LjAwI01vdXNlIHBhZCM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4xNi4wMCNQcm9ncmFtbWFibGUgbG9naWMgY29udHJvbGxlciBoYW5kaGVsZCBwcm9ncmFtbWVyIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjE3LjAwI0VHUiAgRWxlY3Ryb25pYyBnYXRlIHJlYWRlciM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4xOC4wMCNEdW1iIHRlcm1pbmFsIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjE5LjAwI1B1bmNoZWQgY2FyZHMjNDMuMTcuMjIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDAuMDAjRWxlY3Ryb25pYyBkYXRhIHN0b3JhZ2UgZXF1aXBtZW50IzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIzLjAxLjAwI1JlYWQgb25seSBjb21wYWN0IGRpc2MgKENEKSBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDIuMDAjQ29tcGFjdCBkaXNjIChDRCkganVrZWJveGVzIG9yIGNoYW5nZXJzIzQzLjE3LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIzLjAzLjAwI0NvbWJpbmF0aW9uIGZsb3BweSBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDQuMDAjRGlzayBhcnJheXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDUuMDAjRmxvcHB5IGRyaXZlcyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4wNi4wMCNIaWdoIGNhcGFjaXR5IHJlbW92YWJsZSBtZWRpYSBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDcuMDAjTXVsdGkgZHJpdmUgaGFyZCBkcml2ZSB0b3dlcnMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDguMDAjUmVjb3JkYWJsZSBjb21wYWN0IGRpc2MgKENEKSBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDkuMDAjUmVlbCB0byByZWVsIHRhcGUgZHJpdmVzIzQzLjE3LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIzLjEwLjAwI1NpbmdsZSBvcHRpY2FsIGRyaXZlcyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4xMS4wMCNUYXBlIGFycmF5cyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4xMi4wMCNUYXBlIGRyaXZlIGF1dG8gbG9hZGVycyBvciBsaWJyYXJpZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMTMuMDAjSGFyZCBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMTQuMDAjQ29tcHV0ZXIgRFZEIGRyaXZlcyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4xNS4wMCNBcnJheSBjb250cm9sbGVyIzQzLjE3LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIzLjE2LjAwI01QMyBwbGF5ZXIjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMTcuMDAjTWVtb3J5IGNhcmQgcmVhZGVycyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4xOC4wMCNQZXJpcGhlcmFsIGNvbXBvbmVudCBtaWNyb2NoYW5uZWwgaW50ZXJjb25uZWN0IGFyY2hpdGVjdHVyZSAgcmVhZGVyIGFuZCB3cml0ZXIgZHJpdmVzIzQzLjE3LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE3LjI0LjAwLjAwI01vbml0b3JzIGFuZCBkaXNwbGF5cyM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yNC4wMS4wMCNNb25pdG9ycyM0My4xNy4yNC4wMC4wMAotdW5zcHNjNyM0My4xNy4yNC4wMi4wMCNGbGF0IHBhbmVsIGRpc3BsYXlzIzQzLjE3LjI0LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI0LjAzLjAwI1RvdWNoIHNjcmVlbiBtb25pdG9ycyM0My4xNy4yNC4wMC4wMAotdW5zcHNjNyM0My4xNy4yNC4wNC4wMCNNb25pdG9yIGFjY2Vzc29yaWVzIzQzLjE3LjI0LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjAwLjAwI1ByaW50ZXJzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjAxLjAwI1Bsb3R0ZXJzIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjAyLjAwI0JhbmQgcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMDMuMDAjRG90IG1hdHJpeCBwcmludGVycyM0My4xNy4yNS4wMC4wMAotdW5zcHNjNyM0My4xNy4yNS4wNC4wMCNMYWJlbCBwcmludGVycyM0My4xNy4yNS4wMC4wMAotdW5zcHNjNyM0My4xNy4yNS4wNS4wMCNMYXJnZSBmb3JtYXQgcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMDYuMDAjTGluZSBtYXRyaXggcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMDcuMDAjUGFnZSBwcmludGVycyM0My4xNy4yNS4wMC4wMAotdW5zcHNjNyM0My4xNy4yNS4wOC4wMCNUaGVybWFsIHRhcGUgcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMDkuMDAjSW5ramV0IHByaW50ZXJzIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjEwLjAwI0xhc2VyIHByaW50ZXJzIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjExLjAwI0J1YmJsZSBqZXQgcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMTIuMDAjQmFnIHRhZyBwcmludGVyIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjEzLjAwI1ByaW50ZXIgc2VwZXJhdG9yIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjE0LjAwI011bHRpIGZ1bmN0aW9uIHByaW50ZXJzIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjE1LjAwI0FUQiBhaXJsaW5lIHRpY2tldCBvciBib2FyZGluZyBwYXNzIHByaW50ZXIjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjYuMDAuMDAjRW5jbG9zdXJlcyBhbmQgZnJhbWVzIGFuZCBiYWNrcGxhbmVzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjAxLjAwI0NoYXNzaXMjNDMuMTcuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjYuMDIuMDAjTmV0d29yayBjaGFzc2lzIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjAzLjAwI0RyaXZlIGNhYmluZXRzIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjA0LjAwI0V4cGFuc2lvbiBzbG90IGV4cGFuZGVyIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjA1LjAwI1JhY2tzIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjA2LjAwI1Byb2dyYW1tYWJsZSBsb2dpYyBjb250cm9sbGVyIHJhY2sgb3IgYmFzZSM0My4xNy4yNi4wMC4wMAotdW5zcHNjNyM0My4xNy4yNi4wNy4wMCNSZW1vdmFibGUgZHJpdmUgZnJhbWVzIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjAwLjAwI05ldHdvcmsgaGFyZHdhcmUgYW5kIGNvbXBvbmVudHMgYW5kIGFjY2Vzc29yaWVzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjAxLjAwI0h1YnMgb3IgY29uY2VudHJhdG9ycyM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wMi4wMCNSb3V0ZXJzIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjAzLjAwI1JlcGVhdGVycyM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wNC4wMCNOZXR3b3JrIGJyaWRnZXMjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMDUuMDAjU3dpdGNoZXMjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMDYuMDAjTWVkaWEgZmlsdGVycyM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wNy4wMCNXaWRlIGFyZWEgbmV0d29yayAoV0FOKSBjYXJkcyM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wOC4wMCNNdWx0aXN0YXRpb24gYWNjZXNzIHVuaXRzIChNQVVzKSM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wOS4wMCNEYXRhIHNlcnZpY2UgdW5pdHMgKERTVXMpIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjEwLjAwI05ldHdvcmsgYWRhcHRlcnMjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMTEuMDAjTG9hZCBiYWxhbmNlciM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xMi4wMCNQcmludGVyICBhY2N1bXVsYXRvciM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xMy4wMCNFbnRlcnByaXNlIFN5c3RlbSBDb25uZWN0aXZpdHkgRVNDT04gRGlyZWN0b3IjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMTQuMDAjTmV0d29yayBtYW5hZ2VtZW50IHN5c3RlbSM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xNS4wMCNGaXJld2FsbCBmaXJld2FsbCBhcHBsaWFuY2UjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMTYuMDAjQ2FibGUgbmV0d29yayB0ZXN0ZXJzIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjE3LjAwI0RhdGEgc3luY2hyb25pemF0aW9uIGRldmljZSM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xOC4wMCNEaWdpdGFsIGNyb3NzIGNvbm5lY3RzIGVxdWlwbWVudCM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xOS4wMCNPcHRpY2FsIGNyb3NzIGNvbm5lY3RzIGVxdWlwbWVudCM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4yMC4wMCNTY3JlZW4gYW1wbGlmaWVyIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjIxLjAwI1RpbWUgZGl2aXNpb25hbCBtdWx0aXBsZXgjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMjIuMDAjQ29ubmVjdGlvbiBwYW5lbHMjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMjMuMDAjVm9pY2UgZWNobyBjYW5jZWxsZXJzIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjI0LjAwI1BhdGNoIHBhbmVsIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI4LjAwLjAwI01vZGVtcyBhbmQgcmVsYXRlZCBoYXJkd2FyZSM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yOC4wMS4wMCNNb2RlbXMgb3IgbmV0d29yayBjb21ibyBjYXJkcyM0My4xNy4yOC4wMC4wMAotdW5zcHNjNyM0My4xNy4yOC4wMi4wMCNNb2RlbXMjNDMuMTcuMjguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjguMDMuMDAjSW50ZWdyYXRlZCBzZXJ2aWNlcyBkaWdpdGFsIG5ldHdvcmsgKElTRE4pIGFkYXB0ZXJzIzQzLjE3LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI4LjA0LjAwI01vZGVtIGJhbmtzIzQzLjE3LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI4LjA1LjAwI01vZGVtIHRlbGVhZGFwdG9ycyM0My4xNy4yOC4wMC4wMAotdW5zcHNjNyM0My4xNy4yOC4wNi4wMCNNdWx0aXBsZXhvciBNVVhzIzQzLjE3LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI4LjA3LjAwI0FkZCBkcm9wIG11bHRpcGxleGVyIzQzLjE3LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI5LjAwLjAwI05ldHdvcmsgc3dpdGNoZXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjkuMDEuMDAjTG9jYWwgYXJlYSBuZXR3b3JrIChMQU4pIHN3aXRjaGVzIzQzLjE3LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI5LjAyLjAwI0FzeW5jaHJvbm91cyB0cmFuc2ZlciBtb2RlIChBVE0pIHN3aXRjaGVzIzQzLjE3LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI5LjAzLjAwI0ZpYmVyIGRpc3RyaWJ1dGVkIGRhdGEgaW50ZXJmYWNlIChGRERJKSAgc3dpdGNoZXMjNDMuMTcuMjkuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjkuMDQuMDAjV2lkZSBhcmVhIG5ldHdvcmsgKFdBTikgc3dpdGNoZXMjNDMuMTcuMjkuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjkuMDUuMDAjSW50ZWxsaWdlbnQgbmV0d29yayBzd2l0Y2hpbmcgc3lzdGVtIzQzLjE3LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE3LjMwLjAwLjAwI05ldHdvcmsgcmVwZWF0ZXJzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMwLjAxLjAwI0F0dGFjaGVkIHJlc291cmNlIGNvbXB1dGVyIG5ldHdvcmsgKEFSQ25ldCkgcmVwZWF0ZXJzIzQzLjE3LjMwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMwLjAyLjAwI0V0aGVybmV0IHJlcGVhdGVycyM0My4xNy4zMC4wMC4wMAotdW5zcHNjNyM0My4xNy4zMC4wMy4wMCNGaWJlciBkaXN0cmlidXRlZCBkYXRhIGludGVyZmFjZSAoRkRESSkgcmVwZWF0ZXJzIzQzLjE3LjMwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMwLjA0LjAwI1Rva2VuIHJpbmcgcmVwZWF0ZXJzIzQzLjE3LjMwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMxLjAwLjAwI1JhZGlvIHN5c3RlbXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzEuMDEuMDAjVHJhbnNtaXR0ZXJzIzQzLjE3LjMxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMxLjAyLjAwI1JlY2VpdmVycyM0My4xNy4zMS4wMC4wMAotdW5zcHNjNyM0My4xNy4zMS4wMy4wMCNUcmFuc2NlaXZlcnMjNDMuMTcuMzEuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzEuMDQuMDAjVHVuZXJzIzQzLjE3LjMxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMxLjA1LjAwI1Nob3J0IHdhdmUgZXF1aXBtZW50IzQzLjE3LjMxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMyLjAwLjAwI0F1dG9tYXRlZCBkYXRhIGNvbGxlY3Rpb24gZXF1aXBtZW50IzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMyLjAxLjAwI0JhciBjb2RlIGVxdWlwbWVudCM0My4xNy4zMi4wMC4wMAotdW5zcHNjNyM0My4xNy4zMi4wMi4wMCNSYWRpbyBmcmVxdWVuY3kgaWRlbnRpZmljYXRpb24gKElEKSBlcXVpcG1lbnQjNDMuMTcuMzIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzIuMDMuMDAjUmFkaW8gZnJlcXVlbmN5IGRhdGEgY29tbXVuaWNhdGlvbiBlcXVpcG1lbnQjNDMuMTcuMzIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzIuMDQuMDAjQ2FtZXJhIGJhc2VkIHZpc2lvbiBzeXN0ZW1zIGZvciBhdXRvbWF0ZWQgZGF0YSBjb2xsZWN0aW9uIzQzLjE3LjMyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMyLjA1LjAwI0N1cnJlbmN5IHJlY29nbml0aW9uIGVxdWlwbWVudCM0My4xNy4zMi4wMC4wMAotdW5zcHNjNyM0My4xNy4zMi4wNi4wMCNNYWduZXRpYyBjYXJkIHJlYWRlcnMjNDMuMTcuMzIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDAuMDAjQ29tcHV0ZXIgZGF0YSBzd2l0Y2hlcyM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4zMy4wMS4wMCNTZXJpYWwgZGF0YSBzd2l0Y2hlcyM0My4xNy4zMy4wMC4wMAotdW5zcHNjNyM0My4xNy4zMy4wMi4wMCNLZXlib2FyZCB2aWRlbyBtb3VzZSAoS1ZNKSBzd2l0Y2ggYm94ZXMjNDMuMTcuMzMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDMuMDAjTWFudWFsIHByaW50ZXIgc3dpdGNoZXMjNDMuMTcuMzMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDQuMDAjQXV0b21hdGljIHByaW50ZXIgc3dpdGNoZXMjNDMuMTcuMzMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDUuMDAjQ29uc29sZSBzd2l0Y2gjNDMuMTcuMzMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDYuMDAjUGFyYWxsZWwgZGF0YSBzd2l0Y2hlcyM0My4xNy4zMy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNC4wMC4wMCNDb21wdXRlciBhY2Nlc3NvcnkgY292ZXJzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjM0LjAxLjAwI0tleSBib2FyZCBza2lucyM0My4xNy4zNC4wMC4wMAotdW5zcHNjNyM0My4xNy4zNC4wMi4wMCNOb3RlYm9vayBvciBwYWxtdG9wIHNraW5zIzQzLjE3LjM0LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM1LjAwLjAwI0tleSBib2FyZCBza2lucyM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4wMC4wMCNDb21wdXRlciBjYWJsZXMgYW5kIGFjY2Vzc29yaWVzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjM2LjAxLjAwI01vdXNlIGFkYXB0ZXIjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMDIuMDAjS2V5Ym9hcmQgZXh0ZW5zaW9uIGNhYmxlcyM0My4xNy4zNi4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4wMy4wMCNNb2RlbSBjYWJsZXMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMDQuMDAjQ29yZCBjb3ZlcnMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMDUuMDAjUGFyYWxsZWwgY2FibGVzIzQzLjE3LjM2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM2LjA2LjAwI1NlcmlhbCBjYWJsZXMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMDcuMDAjVW5pdmVyc2FsIHNlcmlhbCBidXMgVVNCIGNhYmxlcyM0My4xNy4zNi4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4wOC4wMCNOZXR3b3JrIHBhdGNoIGNhYmxlcyM0My4xNy4zNi4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4wOS4wMCNDb21wdXRlciBhdWRpbyBjYWJsZXMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMTAuMDAjQ29tcHV0ZXIgdmlkZW8gY2FibGVzIzQzLjE3LjM2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM2LjExLjAwI0ludGVyIGRldmljZSBsaW5rIGNhYmxlcyM0My4xNy4zNi4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4xMi4wMCNDb21wdXRlciBjYWJsZSBraXRzIzQzLjE3LjM2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM2LjEzLjAwI0NhYmxlIGphY2tzIG9yIGNvbm5lY3RvcnMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzcuMDAuMDAjU3RvcmFnZSBkcml2ZSBjb21wb25lbnRzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjM3LjAxLjAwI0hlYWQgYXNzZW1ibGllcyBvciBwYXJ0cyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wMi4wMCNMZWFkIGFzc2VtYmxpZXMjNDMuMTcuMzcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzcuMDMuMDAjSGVhZCBzdGFjayBhc3NlbWJsaWVzIzQzLjE3LjM3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM3LjA0LjAwI0NvbWIgYXNzZW1ibGllcyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wNS4wMCNDcmFzaCBzdG9wcyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wNi4wMCNQbGF0dGVycyBvciBkaXNrcyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wNy4wMCNIZWFkIG1vdW50aW5nIGFybXMjNDMuMTcuMzcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzcuMDguMDAjUmVhZCB3cml0ZSBoZWFkcyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wOS4wMCNNb3RvciBkcml2ZXMjNDMuMTcuMzcuMDAuMDAKLXVuc3BzYzcjNDMuMTguMDAuMDAuMDAjQ29tbXVuaWNhdGlvbnMgYW5kIGNvbXB1dGVyIHN1cHBsaWVzIzQzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQzLjE4LjE1LjAwLjAwI0F1ZGlvIHJlY29yZGluZyBtZWRpYSM0My4xOC4wMC4wMC4wMAotdW5zcHNjNyM0My4xOC4xNS4wMS4wMCNCbGFuayBhdWRpbyB0YXBlcyM0My4xOC4xNS4wMC4wMAotdW5zcHNjNyM0My4xOC4xNi4wMC4wMCNEYXRhIHN0b3JhZ2UgbWVkaWEjNDMuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTguMTYuMDEuMDAjRmxvcHB5IGRpc2tldHRlcyM0My4xOC4xNi4wMC4wMAotdW5zcHNjNyM0My4xOC4xNi4wMi4wMCNSZWNvcmRhYmxlIGNvbXBhY3QgZGlzY3MgKENEcykjNDMuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTguMTYuMDMuMDAjQmxhbmsgZGF0YSB0YXBlcyM0My4xOC4xNi4wMC4wMAotdW5zcHNjNyM0My4xOC4xNi4wNC4wMCNIaWdoIGRlbnNpdHkgcmVtb3ZhYmxlIG1lZGlhIGJsYW5rIGRpc2tzIzQzLjE4LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE2LjA1LjAwI0JsYW5rIGRpZ2l0YWwgdmlkZW8gZGlzY3MgRFZEIzQzLjE4LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE2LjA2LjAwI0RhdGEgc3RvcmFnZSBjYXJkcyM0My4xOC4xNi4wMC4wMAotdW5zcHNjNyM0My4xOC4xNi4wNy4wMCNNYWduZXRvIG9wdGljYWwgZGlza3MjNDMuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTguMTcuMDAuMDAjTXVsdGltZWRpYSBzdG9yYWdlIzQzLjE4LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE4LjE3LjAxLjAwI011bHRpbWVkaWEgdG93ZXJzIzQzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE3LjAyLjAwI011bHRpbWVkaWEgZHJhd2VycyM0My4xOC4xNy4wMC4wMAotdW5zcHNjNyM0My4xOC4xNy4wMy4wMCNDb21wYWN0IGRpc2MgKENEKSBjYXNlcyM0My4xOC4xNy4wMC4wMAotdW5zcHNjNyM0My4xOC4xNy4wNC4wMCNEaXNrZXR0ZSBob2xkZXJzIzQzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE3LjA1LjAwI0Rpc2tldHRlIHN0b3JhZ2UjNDMuMTguMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTguMTcuMDYuMDAjTXVsdGltZWRpYSB0cmF5cyBvciBvcmdhbml6ZXJzIzQzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE3LjA3LjAwI1ppcCBtYWlsZXJzIzQzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE4LjAwLjAwI01vbml0b3Igc3RhbmRzIG9yIHJpc2VycyM0My4xOC4wMC4wMC4wMAotdW5zcHNjNyM0My4xOC4xOS4wMC4wMCNNb25pdG9yIGFybXMjNDMuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDQuMDAuMDAuMDAuMDAjT2ZmaWNlIEVxdWlwbWVudCBhbmQgQWNjZXNzb3JpZXMgYW5kIFN1cHBsaWVzIzQ0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjAwLjAwLjAwI09mZmljZSBtYWNoaW5lcyBhbmQgdGhlaXIgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzQ0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE1LjAwLjAwI0R1cGxpY2F0aW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE1LjAxLjAwI1Bob3RvY29waWVycyM0NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNS4wMi4wMCNGYWNzaW1pbGUgbWFjaGluZXMjNDQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTUuMDMuMDAjTXVsdGlmdW5jdGlvbiBtYWNoaW5lcyM0NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNi4wMC4wMCNQYXBlciBwcm9jZXNzaW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE2LjAxLjAwI1BhcGVyIGN1dHRpbmcgbWFjaGluZXMjNDQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTYuMDIuMDAjUGFwZXIgcHVuY2hpbmcgb3IgYmluZGluZyBtYWNoaW5lcyM0NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNi4wMy4wMCNQYXBlciBzaHJlZGRpbmcgbWFjaGluZXMgb3IgYWNjZXNzb3JpZXMjNDQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTcuMDAuMDAjUHJpbnRlciBhbmQgcGhvdG9jb3BpZXIgYW5kIGZhY3NpbWlsZSBhY2Nlc3NvcmllcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNy4wMS4wMCNDb2xvciBvcHRpb25zIG9yIHVwZ3JhZGVzIzQ0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE3LjAyLjAwI0R1cGxleGVyIHRyYXlzIzQ0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE3LjAzLjAwI0R1cGxleGVyIHVuaXRzIzQ0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE3LjA0LjAwI0ZhY3NpbWlsZSBoYW5kc2V0cyM0NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNy4wNS4wMCNQcmludGVyIHRyYXlzIG9yIGZlZWRlcnMjNDQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTcuMDYuMDAjUGhvdG9jb25kdWN0b3Igb3IgaW1hZ2luZyB1bml0cyM0NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNy4wNy4wMCNTdGFwbGVyIHVuaXRzIzQ0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE4LjAwLjAwI0NhbGN1bGF0aW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE4LjAxLjAwI0NhbGN1bGF0b3JzIzQ0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE4LjAyLjAwI0FkZGluZyBtYWNoaW5lcyM0NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMC4xOC4wMy4wMCNBY2NvdW50aW5nIG1hY2hpbmVzIzQ0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE4LjA0LjAwI0Nhc2ggcmVnaXN0ZXJzIzQ0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE5LjAwLjAwI0NoZWNrIGVuZG9yc2luZyBhbmQgd3JpdGluZyBtYWNoaW5lcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4xOS4wMS4wMCNDaGVjayBlbmRvcnNpbmcgbWFjaGluZXMjNDQuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTkuMDIuMDAjQ2hlY2sgd3JpdGluZyBtYWNoaW5lcyM0NC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMC4wMC4wMCNMYW1pbmF0aW5nIHN1cHBsaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIwLjAxLjAwI0xhbWluYXRpb24gZmlsbSM0NC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMC4wMi4wMCNMYW1pbmF0b3IgcG91Y2hlcyM0NC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMS4wMC4wMCNNYWlsIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIxLjAxLjAwI0ZyYW5raW5nIG9yIHBvc3RhZ2UgbWFjaGluZXMjNDQuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjEuMDIuMDAjTWFpbCBvcGVuaW5nIG1hY2hpbmVzIzQ0LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIxLjAzLjAwI01haWwgc2VhbGluZyBtYWNoaW5lcyM0NC4xMC4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMS4wNC4wMCNTdGFtcCBjYW5jZWxpbmcgbWFjaGluZXMjNDQuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjEuMDUuMDAjQWRkcmVzc2luZyBtYWNoaW5lcyM0NC4xMC4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMS4wNi4wMCNMZXR0ZXIgZm9sZGVycyM0NC4xMC4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMi4wMC4wMCNTY2FubmVyIGFjY2Vzc29yaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIyLjAxLjAwI0VuZG9yc2VycyM0NC4xMC4yMi4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMy4wMC4wMCNQYWNraW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIzLjAxLjAwI0J1bmRsaW5nIG1hY2hpbmVzIzQ0LjEwLjIzLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIzLjAyLjAwI1BhcmNlbCB3cmFwcGluZyBtYWNoaW5lcyM0NC4xMC4yMy4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMy4wMy4wMCNTZWFsIHByZXNzZXMjNDQuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjMuMDQuMDAjU2VhbGluZyBtYWNoaW5lcyM0NC4xMC4yMy4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMy4wNS4wMCNTdHJhcHBpbmcgdGVuc2lvbmVycyBvciBzZWFsZXJzIzQ0LjEwLjIzLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIzLjA2LjAwI1R5aW5nIG1hY2hpbmVzIzQ0LjEwLjIzLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjAwLjAwI0xhYmVsaW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjAxLjAwI1RhcGUgbGFiZWwgbWFrZXJzIzQ0LjEwLjI0LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjAyLjAwI0RhdGluZyBvciBudW1iZXJpbmcgbWFjaGluZXMjNDQuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjQuMDMuMDAjSWRlbnRpZmljYXRpb24gKElEKSBwcmVzcyBtYWNoaW5lcyM0NC4xMC4yNC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNC4wNC4wMCNMYWJlbCBhcHBseWluZyBtYWNoaW5lcyM0NC4xMC4yNC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNC4wNS4wMCNMYWJlbCBtYWtpbmcgbWFjaGluZXMjNDQuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjQuMDYuMDAjTGV0dGVyaW5nIGVxdWlwbWVudCM0NC4xMC4yNC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNC4wNy4wMCNUYXBlIGVtYm9zc2VyIzQ0LjEwLjI0LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjA4LjAwI0F1dG9tYXRpYyBsYWJlbGluZyBzeXN0ZW1zIzQ0LjEwLjI0LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjA5LjAwI1NlbWkgYXV0b21hdGljIGxhYmVsaW5nIHN5c3RlbXMjNDQuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjQuMTEuMDAjTGFiZWwgZGlzcGVuc2VycyM0NC4xMC4yNC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNS4wMC4wMCNTb3J0aW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI1LjAxLjAwI01vbmV5IGNvdW50aW5nIG1hY2hpbmVzIzQ0LjEwLjI1LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI1LjAyLjAwI1NvcnRlcnMjNDQuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjYuMDAuMDAjVHlwaW5nIG1hY2hpbmVzIGFuZCBhY2Nlc3NvcmllcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNi4wMi4wMCNUeXBld3JpdGVycyM0NC4xMC4yNi4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNi4wMy4wMCNQcmludHdoZWVscyM0NC4xMC4yNi4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNi4wNC4wMCNTdGVub3R5cGUgbWFjaGluZXMjNDQuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjYuMDUuMDAjRGljdGF0aW9uIG1hY2hpbmVzIzQ0LjEwLjI2LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI2LjA2LjAwI1R5cGVyd3JpdGVyIHJpYmJvbnMjNDQuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjYuMDcuMDAjV29yZCBwcm9jZXNzb3JzIzQ0LjEwLjI2LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI2LjA4LjAwI1R5cGV3cml0ZXIgcHJpbnRpbmcgZWxlbWVudHMjNDQuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjguMDAuMDAjQmluZGluZyBhbmQgbGFtaW5hdGlvbiBtYWNoaW5lcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOC4wMS4wMCNMYW1pbmF0b3JzIzQ0LjEwLjI4LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjAwLjAwI09mZmljZSBtYWNoaW5lIGFjY2Vzc29yaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjAxLjAwI1RyYXZlbCBraXRzIGZvciBvZmZpY2UgbWFjaGluZXMjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMDIuMDAjU3RvcmFnZSBhY2Nlc3NvcmllcyBmb3Igb2ZmaWNlIG1hY2hpbmVzIzQ0LjEwLjI5LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjAzLjAwI1RhcGUgY2xlYW5lcnMjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMDQuMDAjQWlyIGNvbXByZXNzZWQgc3ByYXkjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMDUuMDAjU21hbGwgcGFwZXIgYmFncyBvZiB3ZXQgYWJzb3JiaW5nIHNhbHRzIzQ0LjEwLjI5LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjA2LjAwI0NvbXB1dGVyIG9yIG9mZmljZSBlcXVpcG1lbnQgY2xlYW5pbmcga2l0IzQ0LjEwLjI5LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjA3LjAwI0VxdWlwbWVudCBkdXN0IGNvdmVycyM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOS4wOC4wMCNDb21wYWN0IGRpc2MgY2xlYW5lcnMgb3Igc2NyYXRjaCByZW1vdmVycyM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOS4wOS4wMCNDb21wYWN0IGRpc2MgZHJpdmUgY2xlYW5lciM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOS4xMC4wMCNMYW1pbmF0b3IgdHJheXMjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMTEuMDAjQ2xlYW5pbmcgd2lwZXMgZm9yIG9mZmljZSBtYWNoaW5lcyM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOS4xMi4wMCNDbGVhbmluZyBzb2x1dGlvbnMgZm9yIG9mZmljZSBlcXVpcG1lbnQjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMTMuMDAjQ29tcGFjdCBkaXNjIGRlc3Ryb3llciM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMC4wMC4wMCNGdXNlcnMgYW5kIGFjY2Vzc29yaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMwLjAxLjAwI0Z1c2VyIGNsZWFuaW5nIHBhZHMjNDQuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzAuMDIuMDAjRnVzZXIgb2lsIzQ0LjEwLjMwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMwLjAzLjAwI0Z1c2VyIHdpcGVyIzQ0LjEwLjMwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMwLjA0LjAwI0Z1c2VycyM0NC4xMC4zMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4wMC4wMCNQcmludGVyIGFuZCBmYWNzaW1pbGUgYW5kIHBob3RvY29waWVyIHN1cHBsaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMxLjAxLjAwI1ByaW50ZXIgb3IgZmFjc2ltaWxlIG9yIHBob3RvY29waWVyIGJlbHRzIzQ0LjEwLjMxLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMxLjAyLjAwI1ByaW50ZXIgb3IgZmFjc2ltaWxlIG9yIHBob3RvY29waWVyIHJpYmJvbnMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMDMuMDAjVG9uZXIjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMDQuMDAjVHJhbnNmZXIgcm9sbHMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMDUuMDAjSW5rIGNhcnRyaWRnZXMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMDYuMDAjSW5rIHN0aWNrcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4wNy4wMCNQcmludGVyIG9yIGZhY3NpbWlsZSBvciBwaG90b2NvcGllciBjbGVhbmluZyBzdXBwbGllcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4wOC4wMCNEZXZlbG9wZXIgZm9yIHByaW50ZXJzIG9yIHBob3RvY29waWVycyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4wOS4wMCNQcmludGVyIG9yIGZhY3NpbWlsZSBvciBwaG90b2NvcGllciBkcnVtcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4xMC4wMCNQcmludCBoZWFkcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4xMS4wMCNJbmsgcm9sbHMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMTIuMDAjUHJpbnRlciByaWJib24jNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMTMuMDAjUGhhc2VycyBvciBpbmtqZXQga2l0cyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4xNC4wMCNMYXNlcmpldCBjb2F0aW5nIGtpdHMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMTUuMDAjSW1hZ2luZyBmaWxtcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4xNi4wMCNLaXQgZm9yIHByaW50ZXIjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMTcuMDAjRmFjc2ltaWxlIHJpYmJvbnMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzIuMDAuMDAjT2ZmaWNlIHRpbWUgcmVjb3JkaW5nIG1hY2hpbmVzIGFuZCBhY2Nlc3NvcmllcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMi4wMS4wMCNUaW1lIGNhcmQgbWFjaGluZXMjNDQuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzIuMDIuMDAjVGltZSBzdGFtcGluZyBtYWNoaW5lcyM0NC4xMC4zMi4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMi4wMy4wMCNUaW1lIGNhcmQgbWFjaGluZSByZXBsYWNlbWVudCByaWJib24jNDQuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzIuMDQuMDAjVGltZSBjYXJkIHJhY2tzIzQ0LjEwLjMyLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMyLjA1LjAwI1RpbWUgY2FyZHMgb3Igc2hlZXRzIzQ0LjEwLjMyLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMzLjAwLjAwI1RpbWUgY2FyZCBtYWNoaW5lcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4zNC4wMC4wMCNUaW1lIHN0YW1waW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjM1LjAwLjAwI0JpbmRpbmcgbWFjaGluZSBzdXBsaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjM1LjAxLjAwI1dpcmUgYmluZGluZyBlbGVtZW50cyBvciBjb21icyM0NC4xMC4zNS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zNS4wMi4wMCNCaW5kaW5nIGNvdmVycyM0NC4xMC4zNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4wMC4wMC4wMCNPZmZpY2UgYW5kIGRlc2sgYWNjZXNzb3JpZXMjNDQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDAuMDAjT3JnYW5pemVycyBhbmQgYWNjZXNzb3JpZXMjNDQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDEuMDAjTWVzc2FnZSBob2xkZXJzIG9yIGRpc3BlbnNlcnMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDIuMDAjRGVzayBkcmF3ZXIgb3JnYW5pemVycyM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4wMy4wMCNEZXNrdG9wIHRyYXlzIG9yIG9yZ2FuaXplcnMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDQuMDAjRGlza2V0dGUgaG9sZGVycyM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4wNS4wMCNDb3B5IGhvbGRlcnMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDYuMDAjUGFwZXIgb3IgcGFkIGhvbGRlciM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4wNy4wMCNCb29rIGVuZHMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDguMDAjU3RheSBwdXQgcGVuIG9yIGhvbGRlciM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4wOS4wMCNQZW4gb3IgcGVuY2lsIGhvbGRlcnMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMTAuMDAjSGFuZ2luZyBvcmdhbml6ZXJzIG9yIGFjY2Vzc29yaWVzIzQ0LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE1LjExLjAwI0Rpc3BsYXkgcmFja3Mgb3IgYWNjZXNzb3JpZXMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMTIuMDAjTGl0ZXJhdHVyZSByYWNrIzQ0LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE1LjEzLjAwI1N1cHBvcnRzIGZvciBkaWFyaWVzIG9yIGNhbGVuZGFycyM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4xNC4wMCNTdGFtcCByYWNrcyBvciBvcmdhbml6ZXJzIzQ0LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE1LjE1LjAwI0ZpbGUgc3RvcmFnZSBib3hlcyBvciBvcmdhbml6ZXJzIzQ0LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE2LjAwLjAwI0Nhc2ggaGFuZGxpbmcgc3VwcGxpZXMjNDQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTYuMDEuMDAjQ3VycmVuY3kgYmFncyBvciB3YWxsZXRzIzQ0LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE2LjAyLjAwI0NvdW50ZXJmZWl0IGJpbGwgZGV0ZWN0b3IgcGVucyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wMy4wMCNDb2luIHNvcnRlcnMjNDQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTYuMDQuMDAjQ29pbiB3cmFwcGVycyBvciBiaWxsIHN0cmFwcyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wNS4wMCNDYXNoIG9yIHRpY2tldCBib3hlcyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wNi4wMCNDYXNoIGJveCB0cmF5cyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wNy4wMCNDaGVjayBmaWxlcyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wOC4wMCNDb2luIGJhbmtzIzQ0LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE2LjA5LjAwI0NvdW50ZXJmZWl0IGJpbGwgZGV0ZWN0b3JzIG9yIHN1cHBsaWVzIzQ0LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjAwLjAwI0RyYWZ0aW5nIHN1cHBsaWVzIzQ0LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjAxLjAwI1N0ZW5jaWxzIG9yIGxldHRlcmluZyBhaWRzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjAyLjAwI0RyYWZ0aW5nIGZpbG1zIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjAzLjAwI0NvbXBhc3NlcyM0NC4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOC4wNC4wMCNEcmFmdGluZyBwYXBlcnMjNDQuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTguMDUuMDAjQ3VydmVzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjA2LjAwI1Byb3RyYWN0b3JzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjA3LjAwI1NjYWxlcyM0NC4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOC4wOC4wMCNUIHNxdWFyZXMjNDQuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTguMDkuMDAjVGVtcGxhdGVzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjEwLjAwI1RyaWFuZ2xlcyM0NC4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOC4xMS4wMCNDb2xvciBjaGFydHMjNDQuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTguMTIuMDAjRHJhZnRpbmcga2l0cyBvciBzZXRzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjEzLjAwI0RyYWZ0aW5nIGRvdHMgb3IgdGFwZXMjNDQuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTkuMDAuMDAjQm9hcmRzIzQ0LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjE5LjAxLjAwI1BsYW5uaW5nIGJvYXJkcyBvciBhY2Nlc3NvcmllcyM0NC4xMS4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOS4wMi4wMCNFbGVjdHJvbmljIGNvcHlib2FyZHMgb3IgYWNjZXNzb3JpZXMjNDQuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTkuMDMuMDAjRWFzZWxzIG9yIGFjY2Vzc29yaWVzIzQ0LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE5LjA0LjAwI0xldHRlciBib2FyZHMgb3IgYWNjZXNzb3JpZXMjNDQuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTkuMDUuMDAjRHJ5IGVyYXNlIGJvYXJkcyBvciBhY2Nlc3NvcmllcyM0NC4xMS4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOS4wNi4wMCNDaGFsayBib2FyZHMgb3IgYWNjZXNzb3JpZXMjNDQuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTkuMDcuMDAjQnVsbGV0aW4gYm9hcmRzIG9yIGFjY2Vzc29yaWVzIzQ0LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE5LjA4LjAwI01hZ25ldGljIGJvYXJkcyBvciBhY2Nlc3NvcmllcyM0NC4xMS4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOS4wOS4wMCNCb2FyZCBjbGVhbmluZyBraXRzIG9yIGFjY2Vzc29yaWVzIzQ0LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjAwLjAwI1BsYW5uaW5nIHN5c3RlbXMjNDQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMjAuMDEuMDAjQWRkcmVzcyBib29rcyBvciByZWZpbGxzIzQ0LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjAyLjAwI0NhbGVuZGFycyM0NC4xMS4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMS4yMC4wNC4wMCNNZWV0aW5nIHBsYW5uZXJzIzQ0LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjA1LjAwI0FwcG9pbnRtZW50IGJvb2tzIG9yIHJlZmlsbHMjNDQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMjAuMDYuMDAjRGlhcmllcyBvciByZWZpbGxzIzQ0LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjA3LjAwI1N1Z2dlc3Rpb24gYm94IzQ0LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjA4LjAwI1dhbGwgcGxhbm5lcnMgb3IgcmVmaWxscyM0NC4xMS4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4wMC4wMC4wMCNPZmZpY2Ugc3VwcGxpZXMjNDQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMDAuMDAjTWFpbGluZyBzdXBwbGllcyM0NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNS4wMS4wMCNNYWlsZXIgdHViZXMjNDQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMDMuMDAjTWFpbGVycyM0NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNS4wNC4wMCNXaW5kb3cgZW52ZWxvcGVzIzQ0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE1LjA1LjAwI1NwZWNpYWx0eSBlbnZlbG9wZXMjNDQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMDYuMDAjU3RhbmRhcmQgZW52ZWxvcGVzIzQ0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE1LjA3LjAwI0NhdGFsb2cgb3IgY2xhc3AgZW52ZWxvcGVzIzQ0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE1LjA4LjAwI01lc3NhZ2UgZHJvcHBlcnMjNDQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMDkuMDAjTWFpbGluZyBiYWdzIzQ0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE1LjEwLjAwI01haWxpbmcgc2VhbHMjNDQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMTEuMDAjTWFpbGluZyBib3hlcyM0NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4wMC4wMCNEZXNrIHN1cHBsaWVzIzQ0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjA0LjAwI1N0YW1wcyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4wNS4wMCNUYXBlIGRpc3BlbnNlcnMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMDYuMDAjRmluZ2VyIHN0YWxscyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4xMS4wMCNQYXBlciBvciBleWVsZXQgcHVuY2hlcyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4xMi4wMCNQYXBlciBjdXR0ZXJzIG9yIHJlZmlsbHMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMTMuMDAjU3RhcGxlIHJlbW92ZXJzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjE0LjAwI0NhbGwgYmVsbHMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMTUuMDAjU3RhcGxlcnMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMTcuMDAjTWFudWFsIGxldHRlciBvcGVuZXJzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjE4LjAwI1NjaXNzb3JzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjE5LjAwI1BlbmNpbCBzaGFycGVuZXJzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjIwLjAwI0ZpbmdlciBzdGFsbHMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMjEuMDAjRGVzayBwYWRzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjIyLjAwI01vaXN0ZW5lcnMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMjMuMDAjTWVjaGFuaWNhbCBsZXR0ZXIgb3BlbmVyIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjI0LjAwI0VtYm9zc2luZyB0b29scyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4yNS4wMCNQYXBlciB3ZWlnaHRzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjI2LjAwI0FkaGVzaXZlIHJlbW92ZXIjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMjcuMDAjQm9va21hcmtzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjI4LjAwI0NsaXAgaG9sZGVycyBvciBkaXNwZW5zZXJzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjI5LjAwI1BhcGVyIGNsaXAgZGlzcGVuc2VyIG9yIGhvbGRlciM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4zMC4wMCNTdGFwbGVyIGtpdCM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4zMS4wMCNHbHVlIGRpc3BlbnNlcnMgb3IgcmVmaWxscyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4wMC4wMCNXcml0aW5nIGluc3RydW1lbnRzIzQ0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjAxLjAwI1JvbGxlcmJhbGwgcGVucyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4wMi4wMCNQZW4gb3IgcGVuY2lsIHNldHMjNDQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTcuMDMuMDAjRm91bnRhaW4gcGVucyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4wNC4wMCNCYWxsIHBvaW50IHBlbnMjNDQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTcuMDUuMDAjTWVjaGFuaWNhbCBwZW5jaWxzIzQ0LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjA2LjAwI1dvb2RlbiBwZW5jaWxzIzQ0LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjA3LjAwI0NvbG9yZWQgcGVuY2lscyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4wOC4wMCNNYXJrZXJzIzQ0LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjA5LjAwI0NyYXlvbnMjNDQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTcuMTAuMDAjV3JpdGluZyBjaGFsayBvciBhY2Nlc3NvcmllcyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4xMS4wMCNGZWx0IHBlbiM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4xMi4wMCNNYXJrZXIgcmVmaWxscyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4xMy4wMCNQZW4gbmlicyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4xNC4wMCNQZW5jaWwgb3IgcGVuIGdyaXBzIzQ0LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjE1LjAwI0NvbWJpbmF0aW9uIHBlbiBvciBwZW5jaWwjNDQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTguMDAuMDAjQ29ycmVjdGlvbiBtZWRpYSM0NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOC4wMS4wMCNDb3JyZWN0aW9uIGZpbG0gb3IgdGFwZSM0NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOC4wMi4wMCNDb3JyZWN0aW9uIGZsdWlkIzQ0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE4LjA0LjAwI0VyYXNlcnMjNDQuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTguMDUuMDAjQ29ycmVjdGlvbiBwZW5zIzQ0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE4LjA2LjAwI0NvcnJlY3Rpb24gcGVuIHJlZmlsbHMjNDQuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTguMDcuMDAjRXJhc2VyIHJlZmlsbHMjNDQuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTkuMDAuMDAjSW5rIGFuZCBsZWFkIHJlZmlsbHMjNDQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTkuMDEuMDAjSW5kaWEgaW5rIzQ0LjEyLjE5LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE5LjAyLjAwI0xlYWQgcmVmaWxscyM0NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOS4wMy4wMCNQZW4gcmVmaWxscyM0NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOS4wNC4wMCNJbmsgcmVmaWxscyM0NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOS4wNS4wMCNJbmsgb3Igc3RhbXAgcGFkcyM0NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wMC4wMCNGb2xkZXJzIGFuZCBiaW5kZXJzIGFuZCBpbmRleGVzIzQ0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjAxLjAwI0luZGV4IGNhcmQgZmlsZXMjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMDIuMDAjU2hlZXQgcHJvdGVjdG9ycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wMy4wMCNCaW5kZXJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjA0LjAwI0RhdGEgYmluZGVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wNS4wMCNNYWdhemluZSBvciBib29rIGNvdmVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wNi4wMCNIYW5naW5nIGZpbGUgZm9sZGVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wNy4wMCNQcmVzZW50YXRpb24gYmluZGVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wOC4wMCNUYWIgaW5kZXhlcyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wOS4wMCNSb3Rhcnkgb3IgYnVzaW5lc3MgY2FyZCBmaWxlcyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4xMC4wMCNEaXZpZGVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4xMS4wMCNGb2xkZXJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjEyLjAwI0NsaXBib2FyZHMjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMTMuMDAjUmVwb3J0IGNvdmVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4xNC4wMCNTaGVldCBsaWZ0ZXJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjE1LjAwI0ZpbGUgYmFja2VycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4xNi4wMCNEb2N1bWVudCBob2xkZXIjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMTcuMDAjSGFuZ2luZyBmb2xkZXJzIG9yIGFjY2Vzc29yaWVzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjE4LjAwI0ZpbGUgaW5zZXJ0cyBvciB0YWJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjE5LjAwI0ZpbGUgcG9ja2V0cyBvciBhY2Nlc3NvcmllcyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4yMC4wMCNDYXJkIHBvY2tldHMjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMjEuMDAjUG9zdGFnZSBzdGFtcCBhbGJ1bXMjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMjIuMDAjQmluZGluZyBiYXJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjAwLjAwI0Zhc3RlbmluZyBzdXBwbGllcyM0NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4wMS4wMCNSdWJiZXIgYmFuZHMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMDIuMDAjUHJvbmdzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjAzLjAwI0NsYXNwIGZhc3RlbmVycyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4wNC4wMCNQYXBlciBjbGlwcyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4wNS4wMCNCaW5kZXIgb3IgYnVsbGRvZyBjbGlwcyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4wNi4wMCNQaW5zIG9yIHRhY2tzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjA3LjAwI1N0YXBsZXMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMDguMDAjRmlsaW5nIHBvY2tldHMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMDkuMDAjVmVsY3JvIGZhc3RlbmVycyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4xMC4wMCNBZGhlc2l2ZSBtb3VudHMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMTEuMDAjSG9sZSByZWluZm9yY2VtZW50cyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4xMi4wMCNSb3VuZCBoZWFkIGZhc3RlbmVycyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4xMy4wMCNUYWcgZmFzdGVuZXJzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjE0LjAwI1NjcmV3IHBvc3RzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjE1LjAwI0FkaGVzaXZlIGNvcm5lcnMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMTYuMDAjQmFnIGNsaXBzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjE3LjAwI0Jvb2sgcmluZ3MjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDUuMDAuMDAuMDAuMDAjUHJpbnRpbmcgYW5kIFBob3RvZ3JhcGhpYyBhbmQgQXVkaW8gYW5kIFZpc3VhbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIzQ1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjAwLjAwLjAwI1ByaW50aW5nIGFuZCBwdWJsaXNoaW5nIGVxdWlwbWVudCM0NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4wMC4wMCNQcmludGluZyBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCM0NS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4wMS4wMCNIZWxpb2dyYXBoaWMgcHJpbnRlcnMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDIuMDAjT2Zmc2V0IHByaW50aW5nIHByZXNzZXMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDMuMDAjTGV0dGVycHJlc3MgZXF1aXBtZW50IzQ1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE1LjA0LjAwI0xpdGhvZ3JhcGhpYyBlcXVpcG1lbnQjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDUuMDAjUGhvdG9ncmF2dXJlIHByaW50aW5nIG1hY2hpbmVzIzQ1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE1LjA2LjAwI1NpbGsgc2NyZWVuIHByaW50aW5nIG1hY2hpbmVzIzQ1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE1LjA3LjAwI1ByaW50aW5nIHByZXNzZXMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDguMDAjUGVyZm9yYXRpbmcgbWFjaGluZXMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDkuMDAjVWx0cmF2aW9sZXQgKFVWKSByb3RhcnkgcHJpbnRlciM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xMC4wMCNGbGV4b2dyYXBoaWMgcHJpbnRlciM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xMS4wMCNJbmtqZXQgcHJpbnRlciBmb3IgY29tbWVyY2lhbCBwcmludGluZyBhcHBsaWNhdGlvbnMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMTIuMDAjVGhlcm1hbCB0cmFuc2ZlciBwcmludGVyIGZvciBjb21tZXJjaWFsIHByaW50aW5nIGFwcGxpY2F0aW9ucyM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xMy4wMCNIb3Qgc3RhbXAgcHJpbnRlciM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xNC4wMCNQYWQgcHJpbnRlciM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xNS4wMCNDb3JlIHByaW50ZXIjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTYuMDAuMDAjUHJpbnRpbmcgbWFjaGluZXJ5IGFjY2Vzc29yaWVzIzQ1LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE2LjAyLjAwI09mZnNldCBkYXJrcm9vbSBlcXVpcG1lbnQjNDUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTYuMDMuMDAjT2Zmc2V0IHByaW50aW5nIGNvbnN1bWFibGVzIzQ1LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE2LjA0LjAwI09mZnNldCBwcmludGluZyBwbGF0ZSBwcm9jZXNzb3JzIzQ1LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE2LjA1LjAwI09mZnNldCBwbGF0ZXMjNDUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTYuMDYuMDAjT2Zmc2V0IGZpbG0gcHJvY2Vzc29ycyM0NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNi4wNy4wMCNTaWxrIHNjcmVlbiBhcmMgbGFtcHMjNDUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTYuMDguMDAjU2lsayBzY3JlZW4gc2NyZWVucyM0NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNi4wOS4wMCNTaWxrIHNjcmVlbiBwcmludGluZyByYWNrcyM0NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNi4xMC4wMCNTaWxrIHNjcmVlbiB2YWN1dW0gcHJpbnRpbmcgZnJhbWVzIzQ1LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE2LjExLjAwI1NpbGsgc2NyZWVuIHNxdWVlZ2VlcyM0NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNy4wMC4wMCNQcmludGluZyBhY2Nlc3NvcmllcyM0NS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNy4wMS4wMCNQcmludGluZyBhc3NlbWJsZXJzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjAyLjAwI1ByaW50aW5nIGd1aWxsb3RpbmVzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjAzLjAwI1ByaW50aW5nIGNvbGxhdG9ycyBvciBkZWNvbGxhdG9ycyM0NS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNy4wNC4wMCNQcmludGluZyBjdXR0ZXJzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjA1LjAwI1ByaW50aW5nIHRyaW1tZXJzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjA2LjAwI1ByaW50aW5nIHB1bmNoZXMjNDUuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTcuMDcuMDAjUHJpbnRpbmcgcGxhdGVzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjA4LjAwI1ByaW50aW5nIGF3bHMjNDUuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTguMDAuMDAjQm9vayBiaW5kaW5nIGFuZCBzZXdpbmcgbWFjaGluZXJ5IzQ1LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE4LjAxLjAwI0Jvb2sgY3JlYXNpbmcgbWFjaGluZXMjNDUuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTguMDIuMDAjQm9vayBjdXR0aW5nIG1hY2hpbmVzIzQ1LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE4LjAzLjAwI0Jvb2sgcHVuY2hpbmcgbWFjaGluZXMjNDUuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTguMDQuMDAjQm9vayBzdGl0Y2hpbmcgbWFjaGluZXMjNDUuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTguMDUuMDAjQm9vayBqb2dnaW5nIG1hY2hpbmVzIzQ1LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE4LjA2LjAwI0Jvb2sgZ2F0aGVyaW5nIG1hY2hpbmVzIzQ1LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE4LjA3LjAwI0Jvb2sgZm9sZGluZyBtYWNoaW5lcyM0NS4xMC4xOC4wMC4wMAotdW5zcHNjNyM0NS4xMC4xOS4wMC4wMCNQcmludGluZyBsYWJvcmF0b3J5IGVxdWlwbWVudCBhbmQgYWNjZXNzb3JpZXMjNDUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTkuMDEuMDAjQmFuZGluZyBtYWNoaW5lcyM0NS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xOS4wMi4wMCNQbGF0ZW1ha2VycyM0NS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xOS4wMy4wMCNQYXBlciBkcmlsbGluZyBtYWNoaW5lcyM0NS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xOS4wNC4wMCNFbmxhcmdlcnMjNDUuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTkuMDUuMDAjRHJhd2luZyBvciByZXRvdWNoaW5nIGJvYXJkcyM0NS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMC4yMC4wMC4wMCNDb21wb3NpbmcgbWFjaGluZXMgYW5kIGFjY2Vzc29yaWVzIzQ1LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjIwLjAxLjAwI0ludGVydHlwZSBjb21wb3NpbmcgbWFjaGluZXMjNDUuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMjAuMDIuMDAjTGlub3R5cGUgY29tcG9zaW5nIG1hY2hpbmVzIzQ1LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjIwLjAzLjAwI1Bob3RvY29tcG9zaXRpb24gbWF0ZXJpYWxzIzQ1LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjIwLjA0LjAwI01vbm90eXBlIGNvbXBvc2luZyBtYWNoaW5lcyM0NS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0NS4xMC4yMC4wNS4wMCNQaG90b3R5cGVzZXR0aW5nIG1hY2hpbmVzIzQ1LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ1LjExLjAwLjAwLjAwI0F1ZGlvIGFuZCB2aXN1YWwgcHJlc2VudGF0aW9uIGVxdWlwbWVudCM0NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNS4wMC4wMCNMZWN0ZXJucyBhbmQgc291bmQgc3lzdGVtcyBhbmQgYWNjZXNzb3JpZXMjNDUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTUuMDEuMDAjRnJlZSBzdGFuZGluZyBsZWN0ZXJucyM0NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNS4wMi4wMCNUYWJsZSB0b3AgbGVjdGVybnMjNDUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDAuMDAjUHJvamVjdG9ycyBhbmQgc3VwcGxpZXMjNDUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDEuMDAjUG9pbnRlcnMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDIuMDAjUHJvamVjdGlvbiBidWxicyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4wMy4wMCNQcm9qZWN0aW9uIHNjcmVlbnMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDQuMDAjU2xpZGUgcHJvamVjdG9ycyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4wNS4wMCNUcmFuc3BhcmVuY3kgZXF1aXBtZW50IG9yIHN1cHBsaWVzIzQ1LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE2LjA2LjAwI0xpcXVpZCBjcnlzdGFsIGRpc3BsYXkgcHJvamVjdGlvbiBwYW5lbHMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDcuMDAjT3ZlcmhlYWQgcHJvamVjdG9ycyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4wOC4wMCNGaWxtIHByb2plY3RvcnMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDkuMDAjQ29tcHV0ZXIgc2NyZWVuIHByb2plY3RvciM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xMC4wMCNFcGlkaWFzY29wZXMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMTEuMDAjTWljcm9maWNoZSBvciBtaWNyb2ZpbG0gdmlld2VycyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xMi4wMCNEaXNzb2x2ZSBjb250cm9scyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xMy4wMCNDYXRob2RlIHJheSB0dWJlIGRhdGEjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMTQuMDAjTGlxdWlkIGNyeXN0YWwgZGlzcGxheSBkYXRhIG9yIHZpZGVvIHByb2plY3RvciM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xNS4wMCNQcm9qZWN0aW9uIGxlbnNlcyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xNi4wMCNWaWRlbyBwcm9qZWN0b3JzIzQ1LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE2LjE4LjAwI1ByZXNlbnRhdGlvbiBsaWdodCBib3hlcyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNy4wMC4wMCNBdWRpbyBwcmVzZW50YXRpb24gZXF1aXBtZW50IGFuZCBoYXJkd2FyZSBhbmQgY29udHJvbGxlcnMjNDUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTcuMDEuMDAjQXNzaXN0aXZlIGxpc3RlbmluZyBkZXZpY2VzIzQ1LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE3LjAyLjAwI0F1ZGlvIGphY2sgYm94ZXMjNDUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTcuMDMuMDAjTGlzdGVuaW5nIGNlbnRlcnMjNDUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTguMDAuMDAjVmlkZW8gYW5kIGNvbWJpbmF0aW9uIHZpZGVvIGFuZCBhdWRpbyBwcmVzZW50YXRpb24gZXF1aXBtZW50IGFuZCBoYXJkd2FyZSBhbmQgY29udHJvbGxlcnMjNDUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTguMDEuMDAjTWVkaWEgY29udHJvbCBzeXN0ZW1zIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE4LjAyLjAwI1RlbGV2aXNpb24gbW91bnRzIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE4LjAzLjAwI1NjYW4gY29udmVydGVycyM0NS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NS4xMS4xOC4wNC4wMCNMaW5lIGRvdWJsZXJzIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE4LjA1LjAwI1ZpZGVvIGVkaXRvcnMjNDUuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTguMDYuMDAjRGlzdGFuY2UgbGVhcm5pbmcgc3lzdGVtcyM0NS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NS4xMS4xOC4wNy4wMCNJbnRlcmZhY2VzIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE4LjA4LjAwI0xpZ2h0aW5nIGNvbnRyb2xzIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE5LjAwLjAwI1Bob25lIGFuZCB2aWRlbyBjb25mZXJlbmNlIGVxdWlwbWVudCBhbmQgaGFyZHdhcmUgYW5kIGNvbnRyb2xsZXJzIzQ1LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjExLjE5LjAxLjAwI0F1ZGlvY29uZmVyZW5jaW5nIHN5c3RlbXMjNDUuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTkuMDIuMDAjVmlkZW9jb25mZXJlbmNpbmcgc3lzdGVtcyM0NS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMi4wMC4wMC4wMCNQaG90b2dyYXBoaWMgZXF1aXBtZW50IzQ1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjAwLjAwI0NhbWVyYXMjNDUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMDEuMDAjU3RpbGwgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4wMi4wMCNJbnN0YW50IHByaW50IGNhbWVyYXMjNDUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMDMuMDAjRGlzcG9zYWJsZSBjYW1lcmFzIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjA0LjAwI0RpZ2l0YWwgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4wNS4wMCNDaW5lbWF0b2dyYXBoaWMgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4wNi4wMCNWaWRlbyBjb25mZXJlbmNlIGNhbWVyYXMjNDUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMDguMDAjTWljcm9maWxtIGNhbWVyYXMjNDUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMTAuMDAjQWVyaWFsIGNhbWVyYXMjNDUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMTEuMDAjSGlnaCBzcGVlZCBjYW1lcmFzIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjEyLjAwI1VuZGVyd2F0ZXIgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4xMy4wMCNPZmZzZXQgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4xNC4wMCNQaG90b2NvcGllciBjYW1lcmFzIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjE1LjAwI0hhbmQgaGVsZCBjYW1jb3JkZXJzIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjE2LjAwI0RpZ2l0YWwgY2FtY29yZGVyIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjE3LjAwI0RvY3VtZW50IGNhbWVyYSM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4xOC4wMCNDYW1lcmEga2l0cyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4wMC4wMCNDYW1lcmEgYWNjZXNzb3JpZXMjNDUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMDEuMDAjQ2FtZXJhIGZsYXNoZXMgb3IgbGlnaHRpbmcjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMDIuMDAjQ2FtZXJhIHRyaXBvZHMjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMDMuMDAjQ2FtZXJhIGxlbnNlcyBvciBmaWx0ZXJzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjA0LjAwI0NhbWVyYSBzaHV0dGVycyM0NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4wNS4wMCNTY3JlZW4gZnJhbWVzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjA2LjAwI0NhbWVyYSBoYXJuZXNzZXMjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMDcuMDAjQ2FtZXJhIGJsb2NrcyBvciBob2xkZXJzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjA4LjAwI0NhbWVyYSBhc3NlbWJsaWVzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjA5LjAwI0NhbWVyYSBicmFja2V0cyM0NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4xMC4wMCNDYW1lcmEgY2FibGVzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjExLjAwI0xlbnMgY292ZXIjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMTIuMDAjQ2FtZXJhIHRhYmxlcyM0NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4xMy4wMCNDYW1lcmEgZW5jbG9zdXJlcyBvciBjb3ZlcnMjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMTQuMDAjUmV0cm9maXQga2l0cyM0NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4xNS4wMCNDYW1lcmEgcmluZ3MjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMTYuMDAjUGFuIGhlYWRzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE3LjAwLjAwI1Bob3RvZ3JhcGhpYyBwcm9jZXNzaW5nIGVxdWlwbWVudCM0NS4xMi4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNy4wMS4wMCNGaWxtIGRyaWVycyM0NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNy4wMi4wMCNGaWxtIHdhc2hlcnMjNDUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTcuMDMuMDAjRmlsbSBzcGxpY2VycyM0NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNy4wNC4wMCNGaWxtIGVkaXRvcnMjNDUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTcuMDUuMDAjUGhvdG9ncmFwaGljIGVubGFyZ2VycyM0NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NS4xMy4wMC4wMC4wMCNQaG90b2dyYXBoaWMgYW5kIHJlY29yZGluZyBtZWRpYSM0NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wMC4wMCNTdGlsbCBwaWN0dXJlIGZpbG0jNDUuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTMuMTUuMDEuMDAjQ29sb3IgZmlsbSM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wMi4wMCNCbGFjayBhbmQgd2hpdGUgZmlsbSM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wMy4wMCNJbnN0YW50IHBpY3R1cmUgZmlsbSM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wNC4wMCNNaWNyb2ZpbG0jNDUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTMuMTUuMDUuMDAjWCByYXkgZmlsbSM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wNi4wMCNQaG90b2dyYXBoeSBwYXBlciM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNi4wMC4wMCNNb3ZpbmcgcGljdHVyZSBtZWRpYSM0NS4xMy4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNi4wMS4wMCNNb3Rpb24gcGljdHVyZSBjYW1lcmEgZmlsbSM0NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNi4wNC4wMCNCbGFuayB2aWRlbyB0YXBlcyM0NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNy4wMC4wMCNNZWRpYSBzdG9yYWdlIzQ1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEzLjE3LjAxLjAwI1NsaWRlIHRyYXlzIzQ1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjE0LjAwLjAwLjAwI1Bob3RvZ3JhcGhpYyBmaWxtbWFraW5nIHN1cHBsaWVzIzQ1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjE0LjE1LjAwLjAwI1Bob3RvZ3JhcGhpYyBwcm9jZXNzaW5nIGNoZW1pY2FscyM0NS4xNC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xNC4xNS4wMS4wMCNEZXZlbG9wZXIgc29sdXRpb24jNDUuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTQuMTUuMDIuMDAjRml4YXRpdmUjNDUuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTQuMTYuMDAuMDAjRGFya3Jvb20gc3VwcGxpZXMjNDUuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTQuMTYuMDEuMDAjRGV2ZWxvcGluZyB0cmF5cyM0NS4xNC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xNC4xNi4wMi4wMCNEZXZlbG9waW5nIHRhbmtzIzQ1LjE0LjE2LjAwLjAwCi11bnNwc2M3IzQ1LjE0LjE2LjAzLjAwI0RldmVsb3BpbmcgdG9uZ3MjNDUuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMDAuMDAuMDAuMDAjRGVmZW5zZSBhbmQgTGF3IEVuZm9yY2VtZW50IGFuZCBTZWN1cml0eSBhbmQgU2FmZXR5IEVxdWlwbWVudCBhbmQgU3VwcGxpZXMjNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTAuMDAuMDAuMDAjTGlnaHQgd2VhcG9ucyBhbmQgYW1tdW5pdGlvbiM0Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wMC4wMCNGaXJlYXJtcyM0Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wMS4wMCNNYWNoaW5lIGd1bnMjNDYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTAuMTUuMDIuMDAjUG9saWNlIG9yIHNlY3VyaXR5IHNob3RndW5zIzQ2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEwLjE1LjAzLjAwI01pbGl0YXJ5IHJpZmxlcyM0Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wNC4wMCNIYW5kZ3VucyM0Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wNS4wMCNBaXIgcmlmbGVzIG9yIGFpciBoYW5kZ3VucyM0Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wNi4wMCNQYXJ0cyBvZiBndW5zIG9yIHBpc3RvbHMjNDYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTAuMTYuMDAuMDAjQW1tdW5pdGlvbiM0Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNi4wMS4wMCNEZWZlbnNlIG9yIGxhdyBlbmZvcmNlbWVudCBhbW11bml0aW9uIzQ2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEwLjE3LjAwLjAwI0FtbXVuaXRpb24gaGFuZGxpbmcgc3lzdGVtcyM0Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNy4wMS4wMCNUYW5rIGFtbXVuaXRpb24gaGFuZGxpbmcgc3lzdGVtcyM0Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNy4wMi4wMCNBaXJjcmFmdCBhbW11bml0aW9uIGhhbmRsaW5nIHN5c3RlbXMjNDYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDYuMTAuMTguMDAuMDAjQXJtcyBhbmQgYW1tdW5pdGlvbiBhY2Nlc3NvcmllcyM0Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xOC4wMS4wMCNHdW4gY2FzZXMjNDYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDYuMTEuMDAuMDAuMDAjQ29udmVudGlvbmFsIHdhciB3ZWFwb25zIzQ2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ2LjExLjE1LjAwLjAwI0JvbWJzIGFuZCBncmVuYWRlcyM0Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMS4xNS4wMS4wMCNHcmVuYWRlcyM0Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMS4xNS4wMi4wMCNNaW5lcyM0Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMS4xNS4wMy4wMCNNb3J0YXIgYm9tYnMjNDYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTYuMDAuMDAjR3VuIHN5c3RlbXMjNDYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTYuMDEuMDAjQ2hhaW4gZ3VuIHN5c3RlbXMjNDYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTYuMDIuMDAjR2F0bGluZyBndW4gc3lzdGVtcyM0Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xMS4xNy4wMC4wMCNJbmZyYXJlZCAoSVIpIHNlbnNvcnMjNDYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTcuMDEuMDAjSW5mcmFyZWQgKElSKSBjb29sZXJzIzQ2LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ2LjExLjE3LjAyLjAwI0luZnJhcmVkIChJUikgZGV0ZWN0b3JzIzQ2LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ2LjExLjE4LjAwLjAwI05hdmFsIHdlYXBvbnMjNDYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTguMDEuMDAjVG9ycGVkb2VzIzQ2LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjAwLjAwLjAwI01pc3NpbGVzIzQ2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjAwLjAwI0d1aWRlZCBtaXNzaWxlcyM0Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wMS4wMCNBaXIgdG8gYWlyIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjAyLjAwI0FudGlhaXJjcmFmdCBtaXNzaWxlcyM0Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wMy4wMCNBbnRpbWlzc2lsZSBtaXNzaWxlcyM0Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wNC4wMCNBbnRpc2hpcCBtaXNzaWxlcyM0Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wNS4wMCNBbnRpdGFuayBtaXNzaWxlcyM0Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wNi4wMCNCYWxsaXN0aWMgbWlzc2lsZXMjNDYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTIuMTUuMDcuMDAjQ3J1aXNlIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjA4LjAwI1N1cmZhY2UgdG8gYWlyIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjA5LjAwI0FudGliYWxsaXN0aWMgbWlzc2lsZXMjNDYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTIuMTUuMTAuMDAjU3VyZmFjZSB0byBzdXJmYWNlIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjExLjAwI0FpciB0byBzdXJmYWNlIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjEyLjAwI1RyYWluaW5nIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE2LjAwLjAwI01pc3NpbGUgc3Vic3lzdGVtcyM0Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNi4wMS4wMCNFbGVjdHJvbmljIHNhZmUgb3IgYXJtIGRldmljZXMjNDYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTIuMTYuMDIuMDAjU29saWQgbWlzc2lsZSBib29zdGVycyM0Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNi4wMy4wMCNNaXNzaWxlIHdhcmhlYWRzIzQ2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE2LjA0LjAwI1NhZmV0eSBwaW4gcHVsbGVycyM0Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNi4wNS4wMCNKZXQgcmVhY3Rpb24gY29udHJvbCBhc3NlbWJsaWVzIzQ2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjAwLjAwLjAwI1JvY2tldHMgYW5kIHN1YnN5c3RlbXMjNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTMuMTUuMDAuMDAjTGF1bmNoIHZlaGljbGVzIGFuZCByb2NrZXRzIzQ2LjEzLjAwLjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE1LjAxLjAwI011bHRpIHN0YWdlIHJvY2tldHMjNDYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTMuMTUuMDIuMDAjUmV1c2FibGUgcm9ja2V0cyM0Ni4xMy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMy4xNS4wMy4wMCNTaW5nbGUgc3RhZ2Ugcm9ja2V0cyM0Ni4xMy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMy4xNS4wNC4wMCNMaXF1aWQgcm9ja2V0cyM0Ni4xMy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMy4xNS4wNS4wMCNTb2xpZCByb2NrZXRzIzQ2LjEzLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjAwLjAwI0Jvb3N0ZXJzIzQ2LjEzLjAwLjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjAxLjAwI1JldXNhYmxlIGJvb3N0ZXJzIzQ2LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjAyLjAwI1NvbGlkIGJvb3N0ZXJzIzQ2LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjAzLjAwI011bHRpIHN0YWdlIGJvb3N0ZXJzIzQ2LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjA0LjAwI0xpcXVpZCBib29zdGVycyM0Ni4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNC4wMC4wMC4wMCNMYXVuY2hlcnMjNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTQuMTUuMDAuMDAjTWlzc2lsZSBhbmQgcm9ja2V0IGxhdW5jaGVycyM0Ni4xNC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xNC4xNS4wMS4wMCNNaXNzaWxlIGxhdW5jaGVycyM0Ni4xNC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNC4xNS4wMi4wMCNSb2NrZXQgbGF1bmNoZXJzIzQ2LjE0LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE1LjAwLjAwLjAwI0xhdyBlbmZvcmNlbWVudCM0Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xNS4xNS4wMC4wMCNDcm93ZCBjb250cm9sIGVxdWlwbWVudCM0Ni4xNS4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xNS4xNS4wMS4wMCNCYXJyaWNhZGVzIzQ2LjE1LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE1LjE1LjAyLjAwI1Jpb3QgaGVsbWV0cyM0Ni4xNS4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNS4xNS4wMy4wMCNSaW90IHNoaWVsZHMjNDYuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTUuMDQuMDAjQm9keSBhcm1vdXIjNDYuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTUuMDUuMDAjQmFycmllcnMjNDYuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTYuMDAuMDAjU2VjdXJpdHkgYW5kIGNvbnRyb2wgZXF1aXBtZW50IzQ2LjE1LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE1LjE2LjAxLjAwI0hhbmRjdWZmcyM0Ni4xNS4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNS4xNi4wMi4wMCNOaWdodCBzdGlja3MjNDYuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTYuMDMuMDAjRmluZ2VycHJpbnQgZXF1aXBtZW50IzQ2LjE1LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE1LjE2LjA0LjAwI0FsY29ob2wgYW5hbHlzZXJzIzQ2LjE1LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE1LjE2LjA1LjAwI1dlYXBvbnMgb3IgZXhwbG9zaXZlcyBkZXRlY3RvcnMjNDYuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTYuMDYuMDAjTmFyY290aWMgdGVzdCBraXRzIzQ2LjE1LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjAwLjAwLjAwI1B1YmxpYyBzYWZldHkgYW5kIGNvbnRyb2wjNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTUuMDAuMDAjVHJhZmZpYyBjb250cm9sIzQ2LjE2LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE1LjAxLjAwI0FpcnBvcnQgc2lnbmFsaW5nIHN5c3RlbXMjNDYuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTUuMDIuMDAjUmFpbHdheSBzaWduYWxpbmcgc3lzdGVtcyM0Ni4xNi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNS4wMy4wMCNNYXJpbmUgc2lnbmFsaW5nIHN5c3RlbXMjNDYuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTUuMDQuMDAjVHJhZmZpYyBzaWduYWxzIzQ2LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE1LjA1LjAwI1BhcmtpbmcgbWV0ZXJzIzQ2LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE1LjA2LjAwI1Nub3cgb3IgaWNlIG1lbHRlciM0Ni4xNi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNS4wNy4wMCNCYXJyaWVyIHRhcGUjNDYuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTUuMDguMDAjVHJhZmZpYyBvciBmbG9vciBjb25lcyM0Ni4xNi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNS4wOS4wMCNTcGVlZCBzdG9wcGVycyM0Ni4xNi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNi4wMC4wMCNXYXRlciBzYWZldHkjNDYuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTYuMDEuMDAjUm9wZSBmbG9hdCBsaW5lcyM0Ni4xNi4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNi4wMi4wMCNMaWZlIHJpbmdzIzQ2LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE2LjAzLjAwI1Bvb2wgYWxhcm1zIzQ2LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE2LjA0LjAwI0xpZmUgdmVzdHMgb3IgcHJlc2VydmVycyM0Ni4xNi4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4wMC4wMC4wMCNTZWN1cml0eSBzdXJ2ZWlsbGFuY2UgYW5kIGRldGVjdGlvbiM0Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4wMC4wMCNMb2NrcyBhbmQgc2VjdXJpdHkgaGFyZHdhcmUjNDYuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMDEuMDAjUGFkbG9ja3MjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMDIuMDAjQ2FibGUgbG9ja3MjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMDMuMDAjTG9jayBzZXRzIzQ2LjE3LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE1LjA0LjAwI1B1c2hidXR0b24gbG9ja3MjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMDUuMDAjS2V5cyBvciBhY2Nlc3NvcmllcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4wNi4wMCNTYWZlcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4wNy4wMCNTZWN1cml0eSBiYXJzIzQ2LjE3LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE1LjA4LjAwI051bWJlciBsb2NrcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4wOS4wMCNLZXkgY2FiaW5ldHMjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMTAuMDAjVGltZSBsb2NrcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4xMS4wMCNMb2Nrb3V0IGRldmljZXMjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMTIuMDAjSW5zdHJ1bWVudCBsb2NrcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4xMy4wMCNMb2NraW5nIGNhbSM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4xNC4wMCNTZWN1cml0eSBjaGFpbnMgb3IgYWNjZXNzb3JpZXMjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMDAuMDAjU3VydmVpbGxhbmNlIGFuZCBkZXRlY3Rpb24gZXF1aXBtZW50IzQ2LjE3LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjAyLjAwI1NhZmV0eSBob3JucyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4wMy4wMCNDbG9jayB0aW1lcnMjNDYuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMDQuMDAjQWxhcm0gc3lzdGVtcyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4wNS4wMCNEb29yIGNoaW1lcyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4wNi4wMCNTaXJlbnMjNDYuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMDcuMDAjQnV6emVycyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4wOC4wMCNNb3Rpb24gZGV0ZWN0b3JzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjA5LjAwI0NvbnZleCBzZWN1cml0eSBtaXJyb3JzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjEwLjAwI1NlY3VyaXR5IGNhbWVyYXMjNDYuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMTEuMDAjVmlkZW8gaWRlbnRpZmljYXRpb24gc3lzdGVtcyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4xMi4wMCNWaWRlbyBtb25pdG9ycyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4xMy4wMCNHYXMgZGV0ZWN0b3JzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjE0LjAwI1N1cnZlaWxsYW5jZSBjYW1lcmFzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjE1LjAwI0xpZ2h0IGVuaGFuY2luZyBjYW1lcmFzIG9yIHZpc2lvbiBkZXZpY2VzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjE2LjAwI1JhZGFyIGRldGVjdG9ycyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4xNy4wMCNEb29yIGV5ZXMjNDYuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMTguMDAjRG9vciBiZWxscyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4wMC4wMC4wMCNQZXJzb25hbCBzYWZldHkgYW5kIHByb3RlY3Rpb24jNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMDAuMDAjU2FmZXR5IGFwcGFyZWwjNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMDEuMDAjUHJvdGVjdGl2ZSBhcHJvbnMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMDIuMDAjQnVsbGV0IHByb29mIHZlc3RzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjAzLjAwI1Byb3RlY3RpdmUgY292ZXJhbGxzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjA0LjAwI1Byb3RlY3RpdmUgZ2xvdmVzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjA1LjAwI1Byb3RlY3RpdmUga25lZSBwYWRzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjA2LjAwI1Byb3RlY3RpdmUgcG9uY2hvcyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4wNy4wMCNTYWZldHkgdmVzdHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMDguMDAjRmlyZSByZXRhcmRhbnQgYXBwYXJlbCM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4wOS4wMCNIYXphcmRvdXMgbWF0ZXJpYWwgcHJvdGVjdGl2ZSBhcHBhcmVsIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjEwLjAwI0ZpcmUgcmV0YXJkYW50IGdsb3ZlcyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xMS4wMCNIYXphcmRvdXMgbWF0ZXJpYWwgcHJvdGVjdGl2ZSBnb29kcyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xMi4wMCNDbGVhbnJvb20gYXBwYXJlbCM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xMy4wMCNDbGVhbnJvb20gZ2xvdmVzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjE0LjAwI0VsYm93IHByb3RlY3RvcnMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMTUuMDAjSW5zZWN0aWNpZGUgcHJvdGVjdGl2ZSBjbG90aGluZyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xNi4wMCNTYWZldHkgc2xlZXZlcyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xNy4wMCNJbnN1bGF0ZWQgb3IgZmxvdGF0aW9uIHN1aXRzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjE4LjAwI0hlYXQgcmVzaXN0YW50IGNsb3RoaW5nIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjE5LjAwI1NhZmV0eSBoYXJuZXNzZXMgb3IgYmVsdHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjAuMDAjTGVnIHByb3RlY3RvcnMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjEuMDAjUmFkaWF0aW9uIHByb3RlY3Rpb24gY2xvdGhpbmcgb3IgY29hdHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjIuMDAjU2FmZXR5IGhvb2RzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjIzLjAwI0luc3VsYXRlZCBjbG90aGluZyBmb3IgY29sZCBlbnZpcm9ubWVudHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjQuMDAjUGVyc29uYWwgZmxvdGF0aW9uIGRldmljZXMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjUuMDAjUHJvdGVjdGl2ZSByYWlud2VhciBvciB3ZXQgZW52aXJvbm1lbnQgYXBwYXJlbCM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4yNi4wMCNQcm90ZWN0aXZlIHNoaXJ0cyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4yNy4wMCNQcm90ZWN0aXZlIHBhbnRzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjI4LjAwI1Byb3RlY3RpdmUgZnJvY2sjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjkuMDAjSW5zdWxhdGVkIGNsb3RoaW5nIGZvciBjb2xkIGVudmlyb25tZW50cyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4zMC4wMCNQcm90ZWN0aXZlIGZpbmdlciBjb3RzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjMxLjAwI1JlZmxlY3RpdmUgc3VzcGVuZGVycyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4zMi4wMCNMYWIgY29hdHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTYuMDAuMDAjU2FmZXR5IGZvb3R3ZWFyIzQ2LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE2LjAxLjAwI0ZpcmUgcmV0YXJkYW50IGZvb3R3ZWFyIzQ2LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE2LjAyLjAwI0hhemFyZG91cyBtYXRlcmlhbCBwcm90ZWN0aXZlIGZvb3R3ZWFyIzQ2LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE2LjAzLjAwI0NsZWFucm9vbSBmb290d2VhciM0Ni4xOC4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNi4wNC4wMCNTYWZldHkgYm9vdHMjNDYuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTYuMDUuMDAjU2FmZXR5IHNob2VzIzQ2LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE2LjA2LjAwI0Zvb3R3ZWFyIGNvdmVycyM0Ni4xOC4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNy4wMC4wMCNGYWNlIGFuZCBoZWFkIHByb3RlY3Rpb24jNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTcuMDEuMDAjSGFyZCBoYXRzIzQ2LjE4LjE3LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE3LjAyLjAwI0ZhY2lhbCBzaGllbGRzIzQ2LjE4LjE3LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE3LjAzLjAwI1dlbGRpbmcgbWFza3MjNDYuMTguMTcuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTcuMDQuMDAjU2FmZXR5IGhlbG1ldHMjNDYuMTguMTcuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTcuMDUuMDAjTW90b3JjeWNsZSBoZWxtZXRzIzQ2LjE4LjE3LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE3LjA2LjAwI0hlbG1ldCBwYXJ0cyBvciBhY2Nlc3NvcmllcyM0Ni4xOC4xNy4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xOC4wMC4wMCNWaXNpb24gcHJvdGVjdGlvbiBhbmQgYWNjZXNzb3JpZXMjNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTguMDEuMDAjRXlld2VhciBob2xkZXJzIzQ2LjE4LjE4LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE4LjAyLjAwI1NhZmV0eSBnbGFzc2VzIzQ2LjE4LjE4LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE4LjAzLjAwI0V5ZSBzaGllbGRzIzQ2LjE4LjE4LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE4LjA0LjAwI0dvZ2dsZXMjNDYuMTguMTguMDAuMDAKLXVuc3BzYzcjNDYuMTguMTguMDUuMDAjVmlkZW8gZGlzcGxheSBmaWx0ZXJzIzQ2LjE4LjE4LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE4LjA2LjAwI0xlbnMgY2xlYW5lciM0Ni4xOC4xOC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xOS4wMC4wMCNIZWFyaW5nIHByb3RlY3RvcnMjNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTkuMDEuMDAjRWFyIHBsdWdzIzQ2LjE4LjE5LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE5LjAyLjAwI0VhciBtdWZmcyM0Ni4xOC4xOS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMC4wMC4wMCNSZXNwaXJhdG9yeSBwcm90ZWN0aW9uIzQ2LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIwLjAxLjAwI01hc2tzIzQ2LjE4LjIwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIwLjAyLjAwI1Jlc3BpcmF0b3JzIzQ2LjE4LjIwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIwLjAzLjAwI0dhcyBtYXNrcyM0Ni4xOC4yMC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMC4wNC4wMCNSZXNwaXJhdGlvbiBhaXIgc3VwcGx5aW5nIHNlbGYgY29udGFpbmVkIGJyZWF0aGluZyBhcHBhcmF0dXMgKFNDQkEpIzQ2LjE4LjIwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIwLjA1LjAwI01hc2sgZmlsdGVycyM0Ni4xOC4yMC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wMC4wMCNBbnRpIHN0YXRpYyBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzQ2LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIxLjAxLjAwI0FudGlzdGF0aWMgd3Jpc3Qgc3RyYXBzIzQ2LjE4LjIxLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIxLjAyLjAwI0hlZWwgZ3JvdW5kaW5nIHN0cmFwcyM0Ni4xOC4yMS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wMy4wMCNHcm91bmRpbmcgaGFyZHdhcmUjNDYuMTguMjEuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjEuMDQuMDAjQW50aSBzdGF0aWMgZmxvb3IgbWF0cyM0Ni4xOC4yMS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wNS4wMCNBbnRpIHN0YXRpYyB3b3JrdGFibGUgbWF0cyM0Ni4xOC4yMS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wNi4wMCNBbnRpc3RhdGljIGJlbHRzIzQ2LjE4LjIxLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIxLjA3LjAwI0FudGlzdGF0aWMgbWFpbnRlbmFuY2Uga2l0cyM0Ni4xOC4yMS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wOC4wMCNBbnRpc3RhdGljIHRvZSBzdHJhcHMjNDYuMTguMjEuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjIuMDAuMDAjRXJnb25vbWljIHN1cHBvcnQgYWlkcyM0Ni4xOC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMi4wMS4wMCNCYWNrIHN1cHBvcnQgYmVsdHMjNDYuMTguMjIuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjIuMDIuMDAjRWxib3cgc3VwcG9ydHMjNDYuMTguMjIuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjIuMDMuMDAjQmFjayBzdXBwb3J0IHJlc3RzIzQ2LjE4LjIyLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIyLjA0LjAwI1dyaXN0IGJyYWNlcyM0Ni4xOC4yMi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMi4wNS4wMCNGb290IHJlc3RzIzQ2LjE4LjIyLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIyLjA2LjAwI1dyaXN0IHJlc3RzIzQ2LjE4LjIyLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIyLjA3LjAwI0Fua2xlIHN1cHBvcnRzIzQ2LjE4LjIyLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIyLjA4LjAwI1Nob2UgaW5zb2xlcyM0Ni4xOC4yMi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMy4wMC4wMCNGYWxsIHByb3RlY3Rpb24jNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjMuMDEuMDAjTGlmZWxpbmVzIG9yIGxpZmVsaW5lIGVxdWlwbWVudCM0Ni4xOC4yMy4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMy4wMi4wMCNGYWxsIHByb3RlY3Rpb24gbGFueWFyZCM0Ni4xOC4yMy4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMy4wMy4wMCNTYWZldHkgaGFybmVzcyB3aW5kZXJzIzQ2LjE4LjIzLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIzLjA0LjAwI0FuY2hvcmFnZSBjb25uZWN0b3IjNDYuMTguMjMuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjMuMDUuMDAjU2VsZiByZXRyYWN0aW5nIGxhbnlhcmQjNDYuMTguMjMuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjQuMDAuMDAjRGVjb250YW1pbmF0aW9uIGFpZHMjNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjQuMDEuMDAjRGVjb250YW1pbmF0aW9uIHNob3dlciM0Ni4xOC4yNC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yNS4wMC4wMCNQZXJzb25hbCBzYWZldHkgZGV2aWNlcyBvciB3ZWFwb25zIzQ2LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjI1LjAxLjAwI1JlcGVsbGVudHMgZm9yIGNhbmluZSBhdHRhY2tzIzQ2LjE4LjI1LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjAwLjAwLjAwI0ZpcmUgcHJvdGVjdGlvbiM0Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xOS4xNS4wMC4wMCNGaXJlIHByZXZlbnRpb24jNDYuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTUuMDEuMDAjU21va2UgZGV0ZWN0b3JzIzQ2LjE5LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE1LjAyLjAwI0hlYXQgZGV0ZWN0b3JzIzQ2LjE5LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE1LjAzLjAwI0ZpcmUgcmVzaXN0YW50IGNvYXRpbmdzIG9yIHB1dHRpZXMgb3Igc2VhbGFudHMjNDYuMTkuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTYuMDAuMDAjRmlyZSBmaWdodGluZyBlcXVpcG1lbnQjNDYuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTYuMDEuMDAjRmlyZSBleHRpbmd1aXNoZXJzIzQ2LjE5LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE2LjAyLjAwI0ZpcmUgc3ByaW5rbGVyIHN5c3RlbXMjNDYuMTkuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTYuMDMuMDAjRmlyZSBob3NlcyBvciBub3p6bGVzIzQ2LjE5LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE2LjA0LjAwI0ZpcmUgYmxhbmtldHMjNDYuMTkuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTYuMDUuMDAjRmlyZSBzdXBwcmVzc2lvbiBoYW5kIHRvb2xzIzQ2LjE5LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE2LjA2LjAwI0ZpcmUgc3VwcHJlc3Npb24gZm9hbSBvciBzaW1pbGFyIGNvbXBvdW5kcyM0Ni4xOS4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xOS4xNi4wNy4wMCNGaXJlIGJyZWF0aGluZyBhcHBhcmF0dXMjNDYuMTkuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMDAuMDAuMDAuMDAjQ2xlYW5pbmcgRXF1aXBtZW50IGFuZCBTdXBwbGllcyM0Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMC4wMC4wMC4wMCNXYXRlciBhbmQgd2FzdGV3YXRlciB0cmVhdG1lbnQgc3VwcGx5IGFuZCBkaXNwb3NhbCM0Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4wMC4wMCNXYXRlciB0cmVhdG1lbnQgYW5kIHN1cHBseSBlcXVpcG1lbnQjNDcuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMDEuMDAjQWN0aXZhdGVkIGNhcmJvbiBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMDIuMDAjQW1tb25pYSByZW1vdmFsIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4wMy4wMCNDYXJib24gZmlsdHJhdGlvbiBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMDQuMDAjQmFjdGVyaWFsIHJlbW92YWwgZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjA1LjAwI0NobG9yaW5lIGhhbmRsaW5nIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4wNi4wMCNDb3Jyb3Npb24gY29udHJvbCBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMDcuMDAjR3JpdCBjaGFtYmVycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4wOC4wMCNEZXNhbGluYXRpb24gZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjA5LjAwI0ZsdW9yaWRhdGlvbiBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMTAuMDAjSXJvbiByZW1vdmFsIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4xMS4wMCNJb24gZXhjaGFuZ2UgZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjEyLjAwI01peGVycyBvciBhZ2l0YXRvcnMjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMTMuMDAjT3h5Z2VuIGdlbmVyYXRvcnMjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMTQuMDAjV2F0ZXIgcHVyaWZpY2F0aW9uIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4xNi4wMCNUdXJiaWRpbWV0ZXJzIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjE3LjAwI1VsdHJhdmlvbGV0IGRpc2luZmVjdGlvbiBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMTguMDAjV2F0ZXIgY29uZGl0aW9uZXJzIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjE5LjAwI1dhdGVyIHNvZnRlbmluZyBhY2Nlc3NvcmllcyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4yMS4wMCNVbHRyYWZpbHRyYXRpb24gZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjIyLjAwI1BhY2thZ2VkIHdhdGVyIHRyZWF0bWVudCBzeXN0ZW1zIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjIzLjAwI0NvbGxlY3Rpb24gdGFua3MjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMjQuMDAjU2x1ZGdlIG9yIHNld2FnZSBjb21wb3N0aW5nIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4yNS4wMCNEZXdhdGVyaW5nIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4yNi4wMCNTbHVkZ2UgcGVsbGV0aXplcnMjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMjcuMDAjU2x1ZGdlIHNocmVkZGVycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4yOC4wMCNXYXRlciB0cmVhdG1lbnQgZHJ5ZXJzIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjI5LjAwI0luY2luZXJhdG9ycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zMC4wMCNPZG9yIGNvbnRyb2wgZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjMxLjAwI1NlcHRpYyB0YW5rcyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zMi4wMCNTZXR0bGluZyB0YW5rcyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zMy4wMCNMaWZ0IHN0YXRpb25zIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjM0LjAwI1Nld2FnZSBkaXN0cmlidXRvcnMjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMzUuMDAjU2x1ZGdlIGRpc3Bvc2FsIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zNi4wMCNTbHVkZ2UgY29sbGVjdG9ycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zNy4wMCNTbHVkZ2UgY29uZGl0aW9uaW5nIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zOC4wMCNTbHVkZ2Ugb3Igc2V3YWdlIGRpZ2VzdGVycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zOS4wMCNTbHVkZ2Ugb3Igc2V3YWdlIHJlbW92YWwgZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjAwLjAwI1dhdGVyIHRyZWF0bWVudCBjb25zdW1hYmxlcyM0Ny4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wMS4wMCNBbGdhZWNpZGVzIzQ3LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjAyLjAwI0FudGlzY2FsYW50cyM0Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wMy4wMCNEZXNjYWxlcnMjNDcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTYuMDQuMDAjQm9pbGVyIGZlZWQgY2hlbWljYWxzIzQ3LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjA1LjAwI0JhY3RlcmlhbCByZW1vdmFsIGNoZW1pY2FscyM0Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wNi4wMCNDb3Jyb3Npb24gY29udHJvbCBjaGVtaWNhbHMjNDcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTYuMDcuMDAjT2RvciBjb250cm9sIGNoZW1pY2FscyM0Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wOC4wMCNGbG9jY3VsZW50cyM0Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wOS4wMCNNaWNyb2Jpb2NpZGVzIzQ3LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjEwLjAwI1dhdGVyIHNvZnRlbmluZyBjb21wb3VuZHMjNDcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTYuMTEuMDAjRGVtdWxzaWZpZXJzIzQ3LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjEyLjAwI1BvbHllbGVjdHJvbHl0ZXMjNDcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTEuMDAuMDAuMDAjSW5kdXN0cmlhbCBsYXVuZHJ5IGFuZCBkcnkgY2xlYW5pbmcgZXF1aXBtZW50IzQ3LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjExLjE1LjAwLjAwI1dhc2hpbmcgYW5kIGRyeWluZyBlcXVpcG1lbnQjNDcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTEuMTUuMDEuMDAjTGF1bmRyeSB0eXBlIGNvbWJpbmVkIHdhc2hpbmcgb3IgZHJ5aW5nIG1hY2hpbmVzIzQ3LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE1LjAyLjAwI0xhdW5kcnkgdHlwZSB3YXNoaW5nIG1hY2hpbmVzIzQ3LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE1LjAzLjAwI0Nsb3RoZXMgZHJ5ZXJzIzQ3LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE1LjA0LjAwI0xhdW5kcnkgdHlwZSBkcnlpbmcgbWFjaGluZXMjNDcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTEuMTUuMDUuMDAjTGF1bmRyeSBlcXVpcG1lbnQgc3RhbmRzIzQ3LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE2LjAwLjAwI0lyb25pbmcgZXF1aXBtZW50IzQ3LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjExLjE2LjAxLjAwI0lyb25pbmcgbWFjaGluZXMgb3IgcHJlc3NlcyM0Ny4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMS4xNi4wMi4wMCNGb2xkaW5nIG1hY2hpbmVzIzQ3LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE2LjAzLjAwI1N0ZWFtIHByZXNzaW5nIG1hY2hpbmVzIzQ3LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE3LjAwLjAwI0RyeSBjbGVhbmluZyBlcXVpcG1lbnQjNDcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTEuMTcuMDEuMDAjRHJ5IGNsZWFuaW5nIG1hY2hpbmVzIzQ3LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjAwLjAwLjAwI0phbml0b3JpYWwgZXF1aXBtZW50IzQ3LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE1LjAwLjAwI0phbml0b3IgY2FydHMgYW5kIGFjY2Vzc29yaWVzIzQ3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE1LjAxLjAwI0phbml0b3IgY2FydHMjNDcuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTUuMDIuMDAjSmFuaXRvciBjYXJ0IGFjY2Vzc29yaWVzIzQ3LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE2LjAwLjAwI0Zsb29yIG1hY2hpbmVzIGFuZCBhY2Nlc3NvcmllcyM0Ny4xMi4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xNi4wMi4wMCNWYWN1dW0gY2xlYW5lcnMjNDcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTYuMDMuMDAjRmxvb3IgcG9saXNoZXJzIzQ3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE2LjA0LjAwI1dldCBvciBkcnkgY29tYmluYXRpb24gdmFjdXVtIGNsZWFuZXJzIzQ3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE2LjA1LjAwI0Zsb29yIHNjcnViYmVycyM0Ny4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xNi4wNi4wMCNDYXJwZXQgc3dlZXBlcnMjNDcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTYuMDcuMDAjVmFjdXVtIGNsZWFuZXIgc3VwcGxpZXMgb3IgYWNjZXNzb3JpZXMjNDcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTYuMDguMDAjRmxvb3IgbWFjaGluZSBwYWRzIzQ3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE2LjA5LjAwI0NhcnBldCBjbGVhbmluZyBlcXVpcG1lbnQjNDcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTYuMTAuMDAjRmxvb3Igd2FzaGluZyBtYWNoaW5lIzQ3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjAwLjAwI1dhc3RlIGNvbnRhaW5lcnMgYW5kIGFjY2Vzc29yaWVzIzQ3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjAxLjAwI1RyYXNoIGJhZ3MjNDcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTcuMDIuMDAjV2FzdGUgY29udGFpbmVycyBvciByaWdpZCBsaW5lcnMjNDcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTcuMDMuMDAjU21va2luZyB1cm5zIG9yIGFjY2Vzc29yaWVzIzQ3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjA0LjAwI1dhc3RlIGNvbnRhaW5lciBsaWRzIzQ3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjA1LjAwI1VybiBzYW5kIGJhZ3MjNDcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTcuMDYuMDAjQXNoIHRyYXlzIzQ3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjA3LjAwI01vdGlvbiBzaWNrbmVzcyBiYWdzIzQ3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjAwLjAwI0NsZWFuaW5nIGVxdWlwbWVudCM0Ny4xMi4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xOC4wMS4wMCNDbGVhbmluZyBkdXN0ZXJzIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjAyLjAwI0xpbnQgcmVtb3ZlcnMjNDcuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTguMDMuMDAjU3F1ZWVnZXMgb3Igd2FzaGVycyM0Ny4xMi4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xOC4wNC4wMCNDbGVhbmluZyBwYWlscyBvciBidWNrZXRzIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA1LjAwI1ByZXNzdXJlIG9yIHN0ZWFtIGNsZWFuZXJzIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA2LjAwI01vcCB3cmluZ2VyIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA3LjAwI0RyYWluIG9yIHRvaWxldCBwbHVuZ2VyIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA4LjAwI0RyYWluIG9yIHBpcGUgY2xlYW5pbmcgZXF1aXBtZW50IzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA5LjAwI0RlZ3JlYXNpbmcgcGFucyM0Ny4xMi4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xOC4xMC4wMCNDbGVhbmluZyByYWcgZGlzcGVuc2VyIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjExLjAwI0R1Y3QgY2xlYW5pbmcgbWFjaGluZXMjNDcuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMDAuMDAuMDAjQ2xlYW5pbmcgYW5kIGphbml0b3JpYWwgc3VwcGxpZXMjNDcuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTUuMDAuMDAjQ2xlYW5pbmcgcmFncyBhbmQgY2xvdGhzIGFuZCB3aXBlcyM0Ny4xMy4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNS4wMS4wMCNSYWdzIzQ3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE1LjAyLjAwI1dpcGVzIzQ3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE2LjAwLjAwI0Jyb29tcyBhbmQgbW9wcyBhbmQgYnJ1c2hlcyBhbmQgYWNjZXNzb3JpZXMjNDcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTYuMDEuMDAjRHVzdCBicnVzaGVzIG9yIHBhbnMjNDcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTYuMDIuMDAjU2NvdXJpbmcgcGFkcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wMy4wMCNTcG9uZ2VzIzQ3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE2LjA0LjAwI0Jyb29tcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wNS4wMCNDbGVhbmluZyBicnVzaGVzIzQ3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE2LjA2LjAwI0R1c3QgbW9wcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wNy4wMCNXZXQgbW9wcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wOC4wMCNUb2lsZXQgYnJ1c2hlcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wOS4wMCNCcm9vbSBvciBtb3AgaGFuZGxlcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4xMC4wMCNGbG9vciBmaW5pc2ggYXBwbGljYXRvciM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4xMS4wMCNUcmFzaCBwaWNrZXIjNDcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTYuMTIuMDAjUmVwbGFjZW1lbnQgcnViYmVycyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4xMy4wMCNNb3Agb3IgYnJvb20gaG9sZGVyIzQ3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE2LjE0LjAwI0NsZWFuaW5nIGVxdWlwbWVudCBjbGFtcHMjNDcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTcuMDAuMDAjUmVzdHJvb20gc3VwcGxpZXMjNDcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTcuMDEuMDAjUGFwZXIgdG93ZWwgZGlzcGVuc2VycyM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNy4wMi4wMCNTYW5pdGFyeSBnb29kcyBkaXNwZW5zZXJzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjAzLjAwI1Nhbml0YXJ5IHdhc3RlIHJlY2VwdGFjbGVzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjA0LjAwI0luc3RpdHV0aW9uYWwgc29hcCBvciBsb3Rpb24gZGlzcGVuc2VycyM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNy4wNS4wMCNVcmluYWwgb3IgdG9pbGV0IGFjY2Vzc29yaWVzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjA2LjAwI0FpciBmcmVzaGVuZXIgZGlzcGVuc2VycyM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNy4wNy4wMCNJbnN0aXR1dGlvbmFsIGhhbmQgZHJ5ZXJzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjA4LjAwI0JhdGhyb29tIHRpc3N1ZSBkaXNwZW5zZXIjNDcuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTcuMDkuMDAjRmFjaWFsIHRpc3N1ZSBkaXNwZW5zZXJzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjEwLjAwI1RvaWxldCB0aXNzdWUgZGlzcGVuc2VycyM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNy4xMS4wMCNDbGVhbmVyIGRpc3BlbnNlciM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wMC4wMCNDbGVhbmluZyBhbmQgZGlzaW5mZWN0aW5nIHNvbHV0aW9ucyM0Ny4xMy4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wMS4wMCNGbG9vciBjbGVhbmVycyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wMi4wMCNGbG9vciB3YXhlcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wMy4wMCNIb3VzZWhvbGQgZGlzaW5mZWN0YW50cyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wNC4wMCNBbW1vbmlhcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wNS4wMCNHZW5lcmFsIHB1cnBvc2UgY2xlYW5lcnMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMDYuMDAjRnVybml0dXJlIHBvbGlzaCBvciB3YXhlcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wNy4wMCNCbGVhY2hlcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wOC4wMCNEcnkgZ2VybWljaWRhbCM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wOS4wMCNTaG9lIGNsZWFuaW5nIG9yIHBvbGlzaGluZyBwcm9kdWN0cyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xMC4wMCNEaXNod2FzaGluZyBwcm9kdWN0cyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xMS4wMCNMYXVuZHJ5IHByb2R1Y3RzIzQ3LjEzLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE4LjEyLjAwI0FpciBmcmVzaGVuZXIjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMTMuMDAjU2NyZWVuIGNsZWFuZXIjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMTQuMDAjTWV0YWwgY2xlYW5lcnMgb3IgcG9saXNoZXMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMTUuMDAjRHJhaW4gY2xlYW5lciM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xNi4wMCNEZW9kb3JpemVycyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xNy4wMCNIb3VzZWhvbGQgb3IgYXV0b21vdGl2ZSBwcm90ZWN0YW50cyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xOC4wMCNBaXIgc2FuaXRpemVyIzQ3LjEzLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE4LjE5LjAwI0NhdXN0aWMgY2xlYW5lcnMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMjAuMDAjUGV0cm9sZXVtIGRlcml2YXRpdmUgY2xlYW5lcnMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMjEuMDAjRGVncmVhc2luZyBjb21wb3VuZHMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMjIuMDAjQ2FyYm9uIHJlbW92aW5nIGNvbXBvdW5kcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4yMy4wMCNEZWljZXJzIGFuZCBkZWZyb3N0ZXJzIzQ3LjEzLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE4LjI0LjAwI0dsYXNzIG9yIHdpbmRvdyBjbGVhbmVycyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4yNS4wMCNDb250YWN0IHN1cmZhY2UgY2xlYW5lcnMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTkuMDAuMDAjQWJzb3JiZW50cyM0Ny4xMy4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wMS4wMCNNYXRzIzQ3LjEzLjE5LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE5LjAyLjAwI0dyYW51bGFyIGFic29yYmVudCM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wMy4wMCNQbHVnZ2luZyBjb21wb3VuZCM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wNC4wMCNBYnNvcmJlbnQgc29ja3MjNDcuMTMuMTkuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTkuMDUuMDAjU3BpbGwga2l0cyM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wNi4wMCNQYW5zIzQ3LjEzLjE5LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE5LjA3LjAwI0Fic29yYmVudCBib29tcyM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wOC4wMCNBYnNvcmJlbnQgcGlsbG93cyM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4yMC4wMC4wMCNNYXRzIzQ3LjEzLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjEzLjIxLjAwLjAwI0NsZWFuaW5nIGtpdHMjNDcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMjEuMDEuMDAjSW5kdXN0cmlhbCBjbGVhbmluZyBraXRzIzQ3LjEzLjIxLjAwLjAwCi11bnNwc2M3IzQ3LjEzLjIxLjAyLjAwI0dlbmVyYWwgcHVycG9zZSBjbGVhbmluZyBraXRzIzQ3LjEzLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjAwLjAwLjAwLjAwI1NlcnZpY2UgSW5kdXN0cnkgTWFjaGluZXJ5IGFuZCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIzQ4LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjAwLjAwLjAwI0luc3RpdHV0aW9uYWwgZm9vZCBzZXJ2aWNlcyBlcXVpcG1lbnQjNDguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDAuMDAjQ29va2luZyBhbmQgd2FybWluZyBlcXVpcG1lbnQjNDguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDEuMDAjQ29tbWVyY2lhbCB1c2UgYmFpbiBtYXJpZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDIuMDAjQ29tbWVyY2lhbCB1c2UgYmFyYmVxdWUgb3ZlbnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDMuMDAjQ29tbWVyY2lhbCB1c2UgYnJvaWxlcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDQuMDAjQ29tbWVyY2lhbCB1c2UgY2hhcmNvYWwgZ3JpbGxzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjA1LjAwI0NvbW1lcmNpYWwgdXNlIGNvZmZlZSBvciBpY2VkIHRlYSBtYWtlcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDYuMDAjQ29tbWVyY2lhbCB1c2UgY29mZmVlIHdhcm1lcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDcuMDAjQ29tbWVyY2lhbCB1c2UgY29udmVjdGlvbiBvdmVucyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4wOC4wMCNDb21tZXJjaWFsIHVzZSBjb252ZXllciB0b2FzdGVycyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4wOS4wMCNDb21tZXJjaWFsIHVzZSBkZWVwIGZyeWVycyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4xMC4wMCNDb21tZXJjaWFsIHVzZSBmb29kIHdhcm1lcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTEuMDAjQ29tbWVyY2lhbCB1c2UgZ3JpZGRsZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTIuMDAjQ29tbWVyY2lhbCB1c2UgZ3JpbGxzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjEzLjAwI0NvbW1lcmNpYWwgdXNlIGhlYXQgbGFtcHMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTQuMDAjQ29tbWVyY2lhbCB1c2UgaGlnaCBwcmVzc3VyZSBzdGVhbWVycyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4xNS4wMCNDb21tZXJjaWFsIHVzZSBob3QgZG9nIGdyaWxscyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4xNi4wMCNDb21tZXJjaWFsIHVzZSBtaWNyb3dhdmUgb3ZlbnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTcuMDAjQ29tbWVyY2lhbCB1c2Ugb3ZlbnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTguMDAjQ29tbWVyY2lhbCB1c2UgcGFzdGEgY29va2VycyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4xOS4wMCNDb21tZXJjaWFsIHVzZSBwaXp6YSBvdmVucyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4yMC4wMCNDb21tZXJjaWFsIHVzZSBwb3Bjb3JuIG1hY2hpbmVzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjIxLjAwI0NvbW1lcmNpYWwgdXNlIHJhbmdlcyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4yMi4wMCNDb21tZXJjaWFsIHVzZSByb3Rpc3NlcmllcyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4yMy4wMCNDb21tZXJjaWFsIHVzZSBzbW9rZXJzIG9yIHNtb2tlIG92ZW5zIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjI0LjAwI0NvbW1lcmNpYWwgdXNlIHN0ZWFtZXJzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjI1LjAwI0NvbW1lcmNpYWwgdXNlIHRvYXN0ZXJzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjI2LjAwI0NvbW1lcmNpYWwgdXNlIHdhZmZsZSBpcm9ucyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4yNy4wMCNCYXJiZWN1ZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMjguMDAjQ29tbWVyY2lhbCB1c2UgY3JlcGUgbWFjaGluZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMjkuMDAjUHJlc3N1cmUgY29va2VycyBvciBwcmVzc3VyZSBmcnllcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMzAuMDAjQ29tbWVyY2lhbCB1c2UgcmljZSBjb29rZXJzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjMxLjAwI0NvbW1lcmNpYWwgc2FsbW9uIHBvYWNoZXJzIG9yIGtldHRsZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDAuMDAjRm9vZCBwcmVwYXJhdGlvbiBlcXVpcG1lbnQjNDguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDEuMDAjQ29tbWVyY2lhbCB1c2UgYmxlbmRlcnMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDIuMDAjQ29tbWVyY2lhbCB1c2UgZWxlY3RyaWMgY2FuIG9wZW5lcnMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDMuMDAjQ29tbWVyY2lhbCB1c2UgZm9vZCBjaG9wcGVycyBvciBjdWJlcnMgb3IgZGljZXJzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjA0LjAwI0NvbW1lcmNpYWwgdXNlIGNvZmZlZSBncmluZGVycyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4wNS4wMCNDb21tZXJjaWFsIHVzZSBmb29kIGdyaW5kZXJzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjA2LjAwI0NvbW1lcmNpYWwgdXNlIGdyYXRlcnMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDcuMDAjQ29tbWVyY2lhbCB1c2UganVpY2VycyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4wOC4wMCNDb21tZXJjaWFsIHVzZSBtaXhlcnMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDkuMDAjQ29tbWVyY2lhbCB1c2UgcGFzdGEgbWFjaGluZXMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMTAuMDAjQ29tbWVyY2lhbCB1c2UgcGVlbGVycyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4xMS4wMCNDb21tZXJjaWFsIHVzZSBzY2FsZXMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMTIuMDAjQ29tbWVyY2lhbCB1c2UgZm9vZCBwcm9jZXNzb3JzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjEzLjAwI0NvbW1lcmNpYWwgdXNlIGRvdWdoIG1hY2hpbmVzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjE0LjAwI0NvbW1lcmNpYWwgdXNlIGljaW5nIHNldHMgb3IgYmFncyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4xNS4wMCNDb21tZXJjaWFsIHVzZSBkaXNod2FzaGVycyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4xNi4wMCNDb21tZXJjaWFsIHVzZSBicmVhZCBzbGljZXJzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjE3LjAwI0NvbW1lcmNpYWwgdXNlIHBsYXN0aWMgc2hvdmVscyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNy4wMC4wMCNGb29kIGFuZCBiZXZlcmFnZSBkaXNwZW5zaW5nIGVxdWlwbWVudCM0OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNy4wMS4wMCNDYXJib25hdGVkIGJldmVyYWdlIGRpc3BlbnNlciM0OC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNy4wMi4wMCNOb24gY2FyYm9uYXRlZCBiZXZlcmFnZSBkaXNwZW5zZXIjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMDMuMDAjTWlsayBkaXNwZW5zZXJzIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjA0LjAwI1N5cnVwIHB1bXBzIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjA1LjAwI0NhcHB1Y2Npbm8gb3IgZXNwcmVzc28gbWFjaGluZXMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMDYuMDAjTWlsa3NoYWtlIG1hY2hpbmVzIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjA3LjAwI1NvZnQgc2VydmUgbWFjaGluZXMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMDguMDAjU2x1c2ggbWFjaGluZXMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMDkuMDAjSWNlIGRpc3BlbnNlcnMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMTAuMDAjRHJpbmtpbmcgZm91bnRhaW5zIG9yIGJ1YmJsZXJzIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjExLjAwI0JvdHRsZWQgd2F0ZXIgZGlzcGVuc2VycyBvciBhY2Nlc3NvcmllcyM0OC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNy4xMi4wMCNDdXAgZGlzcGVuc2VyIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjEzLjAwI0NvY2t0YWlsIHNoYWtlcnMgb3IgYWNjZXNzb3JpZXMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMTQuMDAjSG90IHdhdGVyIGRpc3BlbnNlciM0OC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wMC4wMCNDb29rd2FyZSBhbmQga2l0Y2hlbiB0b29scyM0OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wMS4wMCNDb21tZXJjaWFsIHVzZSBjdXRsZXJ5IzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjAyLjAwI0NvbW1lcmNpYWwgdXNlIG1vbGRzIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjAzLjAwI0NvbW1lcmNpYWwgdXNlIHNjb29wcyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wNC4wMCNDb21tZXJjaWFsIHVzZSBtZWFzdXJpbmcgY3VwcyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wNS4wMCNDb21tZXJjaWFsIHVzZSBtaXhpbmcgYm93bHMjNDguMTAuMTguMDAuMDAKLXVuc3BzYzcjNDguMTAuMTguMDYuMDAjQ29tbWVyY2lhbCB1c2UgY2FrZSBvciBwaWUgcGFucyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wNy4wMCNDb21tZXJjaWFsIHVzZSBwaXp6YSBwYW5zIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjA4LjAwI0NvbW1lcmNpYWwgdXNlIHNhdWNlIG9yIHNhdXRlIHBhbnMjNDguMTAuMTguMDAuMDAKLXVuc3BzYzcjNDguMTAuMTguMDkuMDAjQ29tbWVyY2lhbCB1c2Ugc3RvY2sgb3Igc2F1Y2UgcG90cyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4xMC4wMCNDb21tZXJjaWFsIHVzZSBwb3Qgb3IgcGFuIGNvdmVycyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4xMS4wMCNDb21tZXJjaWFsIHVzZSByb2xsaW5nIHBpbnMjNDguMTAuMTguMDAuMDAKLXVuc3BzYzcjNDguMTAuMTguMTIuMDAjQ29tbWVyY2lhbCB1c2Ugc3RyYWluZXJzIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjEzLjAwI0NvbW1lcmNpYWwgdXNlIHdoaXNrcyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4xNC4wMCNDb21tZXJjaWFsIHVzZSB3b2tzIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjE1LjAwI0NvbW1lcmNpYWwgdXNlIGxhZGxlcyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4xNi4wMCNDb21tZXJjaWFsIHVzZSBjdXRsZXJ5IHBvdWNoIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjE3LjAwI0Nha2UgZGVjb3JhdGluZyBlcXVpcG1lbnQgb3IgbW91bGRzIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE5LjAwLjAwI1RhYmxldG9wIGFuZCBzZXJ2aW5nIGVxdWlwbWVudCM0OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4wMS4wMCNGb29kIHNlcnZpY2UgZGlubmVyd2FyZSM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4wMi4wMCNGb29kIHNlcnZpY2UgZmxhdHdhcmUjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDMuMDAjRm9vZCBzZXJ2aWNlIGdsYXNzZXMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDQuMDAjRm9vZCBzZXJ2aWNlIHN0ZW13YXJlIzQ4LjEwLjE5LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE5LjA1LjAwI0Zvb2Qgc2VydmljZSBjdXBzIG9yIG11Z3MjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDYuMDAjRm9vZCBzZXJ2aWNlIHNlcnZpbmcgYmFza2V0cyM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4wNy4wMCNGb29kIHNlcnZpY2UgcGl0Y2hlcnMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDguMDAjRm9vZCBzZXJ2aWNlIGNoYWZlcnMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDkuMDAjRm9vZCBzZXJ2aWNlIGNvZmZlZSBvciB0ZWEgcG90cyM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4xMC4wMCNGb29kIHNlcnZpY2Ugc291cCBjcm9ja3MjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMTEuMDAjRm9vZCBzZXJ2aWNlIGljZSBidWNrZXRzIG9yIHdpbmUgY29vbGVycyM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4xMi4wMCNGb29kIHNlcnZpY2UgY29uZGltZW50IGRpc3BlbnNlcnMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMTMuMDAjRm9vZCBzZXJ2aWNlIHB1bmNoIGJvd2xzIzQ4LjEwLjE5LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE5LjE0LjAwI0Zvb2Qgc2VydmljZSB3aW5lIGNhcmFmZXMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMTUuMDAjRm9vZCBzZXJ2aWNlIHRyYXlzIzQ4LjEwLjE5LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE5LjE2LjAwI0Zvb2Qgc2VydmljZSBuYXBraW4gZGlzcGVuc2VycyM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4xNy4wMCNGb29kIHNlcnZpY2UgZm9uZHVlIHBvdHMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMjAuMDAuMDAjUmVzdGF1cmFudCBmdXJuaXR1cmUjNDguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMjAuMDEuMDAjUmVzdGF1cmFudCBjaGFpcnMjNDguMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMjAuMDIuMDAjQm9vdGhzIzQ4LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIwLjAzLjAwI1NhbGFkIGJhcnMjNDguMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMjAuMDQuMDAjVGFibGV0b3BzIzQ4LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIwLjA1LjAwI1Jlc3RhdXJhbnQgb3IgYmFyIHN0b29scyM0OC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4yMC4wNi4wMCNQZXJtYW5lbnQgYmFycyM0OC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4yMC4wNy4wMCNQb3J0YWJsZSBiYXJzIzQ4LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjAwLjAwI1N0b3JhZ2UgYW5kIGhhbmRsaW5nIGVxdWlwbWVudCM0OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4yMS4wMS4wMCNEaXNwbGF5IGNhc2VzIzQ4LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjAyLjAwI0hlYXRlZCBkaXNwbGF5IGNhc2VzIzQ4LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjAzLjAwI1JlZnJpZ2VyYXRlZCBkaXNwbGF5IGNhc2VzIzQ4LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjA0LjAwI0ljZSBjcmVhbSBkaXNwbGF5IGNhc2VzIzQ4LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjA1LjAwI0dsYXNzIGNoaWxsaW5nIGVxdWlwbWVudCM0OC4xMC4yMS4wMC4wMAotdW5zcHNjNyM0OC4xMC4yMS4wNi4wMCNDb29sIGNvbnRhaW5lcnMjNDguMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDguMTEuMDAuMDAuMDAjVmVuZGluZyBtYWNoaW5lcyM0OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMC4wMC4wMCNMaXF1aWQgdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMC4wMS4wMCNNYWNoaW5lcyBkaXNwZW5zaW5nIHNpbmdsZSBzZXJ2aW5ncyB3aXRoIGN1cHMjNDguMTEuMTAuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTAuMDIuMDAjTWFjaGluZXMgZGlzcGVuc2luZyBidWxrIHF1YW50aXRpZXMjNDguMTEuMTAuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTEuMDAuMDAjUGllY2UgYW5kIHBhcnQgdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMS4wMS4wMCNCb3R0bGUgb3IgY2FuIHZlbmRpbmcgbWFjaGluZXMjNDguMTEuMTEuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTEuMDIuMDAjR3VtYmFsbCBjYW5keSBvciBjaGlsZHJlbnMgbm92ZWx0aWVzIG1hY2hpbmVzIzQ4LjExLjExLjAwLjAwCi11bnNwc2M3IzQ4LjExLjExLjAzLjAwI1NuYWNrIG9yIHNtYWxsIHBhY2thZ2UgZ29vZHMgZGlzcGxheSBtYWNoaW5lcyM0OC4xMS4xMS4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMS4wNC4wMCNBIGxhIGNhcnRlIGZvb2RzIHZlbmRpbmcgbWFjaGluZXMjNDguMTEuMTEuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTEuMDUuMDAjRnJvemVuIGNvbmZlY3Rpb25zIG1hY2hpbmVzIzQ4LjExLjExLjAwLjAwCi11bnNwc2M3IzQ4LjExLjExLjA2LjAwI1BlcnNvbmFsIGFjY29tbW9kYXRpb24gaXRlbSBkaXNwZW5zZXJzIzQ4LjExLjExLjAwLjAwCi11bnNwc2M3IzQ4LjExLjExLjA3LjAwI0NpZ2FyZXR0ZSBtYWNoaW5lcyM0OC4xMS4xMS4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMi4wMC4wMCNQcmVwYXJlZCB0byBvcmRlciBmb29kIHZlbmRpbmcgbWFjaGluZXMjNDguMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTIuMDEuMDAjRnJlbmNoIGZyeSB2ZW5kaW5nIG1hY2hpbmVzIzQ4LjExLjEyLjAwLjAwCi11bnNwc2M3IzQ4LjExLjEyLjAyLjAwI1BvcGNvcm4gdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4xMi4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMy4wMC4wMCNTZXJ2aWNlIGFuZCB0aWNrZXQgdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMy4wMS4wMCNUaWNrZXQgZGlzcGVuc2luZyBtYWNoaW5lcyM0OC4xMS4xMy4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMy4wMi4wMCNJbnN1cmFuY2UgcG9saWN5IHZlbmRpbmcgbWFjaGluZXMjNDguMTEuMTMuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTMuMDMuMDAjU3RhbXAgbWFjaGluZXMjNDguMTEuMTMuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTQuMDAuMDAjQ3VycmVuY3kgdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xNC4wMS4wMCNBdXRvbWF0aWMgdGVsbGVyIG1hY2hpbmVzIChBVE1zKSM0OC4xMS4xNC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xNC4wMi4wMCNCaWxsIHRvIGNvaW4gY2hhbmdlcnMjNDguMTEuMTQuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTQuMDMuMDAjRm9yZWlnbiBjdXJyZW5jeSBleGNoYW5nZSBtYWNoaW5lcyM0OC4xMS4xNC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xNC4wNC4wMCNFbGVjdHJvbmljIGZ1bmRzIHRyYW5zZmVyIHBvaW50IG9mIHNhbGUgZXF1aXBtZW50IzQ4LjExLjE0LjAwLjAwCi11bnNwc2M3IzQ4LjEyLjAwLjAwLjAwI0dhbWJsaW5nIG9yIHdhZ2VyaW5nIGVxdWlwbWVudCM0OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMi4xMS4wMC4wMCNDb2luIG9wZXJhdGVkIGdhbWJsaW5nIG1hY2hpbmVzIzQ4LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ4LjEyLjExLjAxLjAwI1Bva2VyIG9yIHNsb3QgbWFjaGluZXMjNDguMTIuMTEuMDAuMDAKLXVuc3BzYzcjNDguMTIuMTIuMDAuMDAjR2FtYmxpbmcgdGFibGVzIGFuZCBnYW1lcyM0OC4xMi4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMi4xMi4wMS4wMCNSb3VsZXR0ZSB3aGVlbHMjNDguMTIuMTIuMDAuMDAKLXVuc3BzYzcjNDguMTIuMTIuMDIuMDAjQ2FyZCB0YWJsZXMjNDguMTIuMTIuMDAuMDAKLXVuc3BzYzcjNDguMTIuMTMuMDAuMDAjR2FtYmxpbmcgbWFuYWdlbWVudCBhbmQgbmV0d29ya2VkIHdhZ2VyaW5nIHN5c3RlbXMjNDguMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTIuMTMuMDEuMDAjVGFibGUgZ2FtYmxpbmcgbWFuYWdlbWVudCBzeXN0ZW1zIzQ4LjEyLjEzLjAwLjAwCi11bnNwc2M3IzQ4LjEyLjEzLjAyLjAwI05ldHdvcmtlZCB3YWdlcmluZyBnYW1lcyM0OC4xMi4xMy4wMC4wMAotdW5zcHNjNyM0OS4wMC4wMC4wMC4wMCNTcG9ydHMgYW5kIFJlY3JlYXRpb25hbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIGFuZCBBY2Nlc3NvcmllcyM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMC4wMC4wMC4wMCNDb2xsZWN0aWJsZXMgYW5kIGF3YXJkcyM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNS4wMC4wMCNBcnQjNDkuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMDEuMDAjUGFpbnRpbmdzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjAyLjAwI1NjdWxwdHVyZXMjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMDMuMDAjU3RhdHVhcnkjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMDQuMDAjUG9ydHJhaXRzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjA1LjAwI0RyYXdpbmdzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjA2LjAwI1BpY3R1cmVzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjA3LjAwI0xpdGhvZ3JhcGhzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjA4LjAwI1Bvc3RlcnMjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMDkuMDAjRGVjb3JhdGl2ZSBwb3QjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMTAuMDAjU2Nyb2xscyM0OS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNS4xMS4wMCNQaG90b2dyYXBocyM0OS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNS4xMi4wMCNGbG93ZXIgdmFzZXMjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMDAuMDAjQ29sbGVjdGlibGVzIzQ5LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjAxLjAwI0FudGlxdWVzIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjAyLjAwI1NvdXZlbmlycyM0OS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNi4wMy4wMCNNaW50IGNvaW4gY29sbGVjdGlvbnMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMDQuMDAjU3RhbXAgY29sbGVjdGlvbnMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMDUuMDAjQW50aXF1ZSBydWdzIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjA2LjAwI0RpZ2dpbmdzIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjA3LjAwI0NvbWljIGJvb2sgY29sbGVjdGlvbnMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMDguMDAjQW50aXF1ZSBtdXNpY2FsIGluc3RydW1lbnRzIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjA5LjAwI09ybmFtZW50cyBvciBkZWNvcmF0aW9ucyM0OS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNi4xMC4wMCNLZXkgY2hhaW5zIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjExLjAwI0NoYXJtcyM0OS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNi4xMi4wMCNIb2xvZ3JhbXMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMTMuMDAjR2xhc3MgY3J5c3RhbHMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTcuMDAuMDAjQXdhcmRzIzQ5LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjAxLjAwI01lZGFscyM0OS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNy4wMi4wMCNUcm9waGllcyM0OS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNy4wMy4wMCNNZWRhbGxpb25zIzQ5LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjA0LjAwI1BsYXF1ZXMjNDkuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTcuMDUuMDAjQ2VydGlmaWNhdGVzIzQ5LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjA2LjAwI1Bob3RvIGF3YXJkIzQ5LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjA3LjAwI0FjaGlldmVtZW50IGNlcnRpZmljYXRlIzQ5LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjA4LjAwI0Nyb3ducyM0OS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMS4wMC4wMC4wMCNNdXNpY2FsIGluc3RydW1lbnRzIzQ5LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE1LjAwLjAwI0tleWJvYXJkIGluc3RydW1lbnRzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE1LjAxLjAwI011c2ljYWwgb3JnYW5zIzQ5LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE1LjAyLjAwI0FjY29yZGlvbnMjNDkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTUuMDMuMDAjUGlhbm9zIzQ5LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE2LjAwLjAwI0JyYXNzIGluc3RydW1lbnRzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE2LjAxLjAwI1RydW1wZXRzIzQ5LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE2LjAyLjAwI1Ryb21ib25lcyM0OS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMS4xNi4wMy4wMCNTb3VzYXBob25lcyM0OS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMS4xNi4wNC4wMCNTYXhvcGhvbmVzIzQ5LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE2LjA1LjAwI1doaXN0bGUjNDkuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTcuMDAuMDAjV29vZHdpbmQgaW5zdHJ1bWVudHMjNDkuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTcuMDEuMDAjQ2xhcmluZXRzIzQ5LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE3LjAyLjAwI09ib2VzIzQ5LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE3LjAzLjAwI011c2ljYWwgZmx1dGVzIzQ5LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE3LjA0LjAwI1BpY2NvbG9lcyM0OS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMS4xNy4wNS4wMCNNdXNpY2FsIGNvcm5ldHMjNDkuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTcuMDYuMDAjQmFncGlwZXMjNDkuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTcuMDcuMDAjSGFybW9uaWNhcyM0OS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMS4xNy4wOC4wMCNLYXpvb3MjNDkuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTguMDAuMDAjU3RyaW5nIGluc3RydW1lbnRzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE4LjAxLjAwI0hhcnBzaWNob3JkcyM0OS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4xMS4xOC4wMi4wMCNDbGF2aWNob3JkcyM0OS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4xMS4xOC4wMy4wMCNHdWl0YXJzIzQ5LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE4LjA0LjAwI1Zpb2xpbnMjNDkuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTguMDUuMDAjSGFycHMjNDkuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTguMDYuMDAjQmFuam9lcyM0OS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4xMS4xOS4wMC4wMCNQZXJjdXNzaW9uIGluc3RydW1lbnRzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE5LjAxLjAwI0N5bWJhbHMjNDkuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTkuMDIuMDAjQmVsbHMjNDkuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTkuMDMuMDAjVGFtYm91cmluZXMjNDkuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTkuMDQuMDAjQ2FzdGFuZXRzIzQ5LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE5LjA1LjAwI0RydW1zIzQ5LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE5LjA2LjAwI1h5bG9waG9uZXMjNDkuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTkuMDcuMDAjQm9kaHJhbiM0OS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0OS4xMS4yMC4wMC4wMCNNdXNpY2FsIGluc3RydW1lbnQgcGFydHMgYW5kIGFjY2Vzc29yaWVzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjIwLjAxLjAwI01ldHJvbm9tZXMjNDkuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMjAuMDIuMDAjUmVlZHMjNDkuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMjAuMDMuMDAjSW5zdHJ1bWVudCBzdHJpbmdzIG9yIHBpY2tzIzQ5LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjIwLjA0LjAwI1R1bmluZyBwaW5zIzQ5LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjIwLjA1LjAwI011c2ljYWwgaW5zdHJ1bWVudCBzdGFuZHMgb3Igc2hlZXQgaG9sZGVycyM0OS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0OS4xMS4yMC4wNi4wMCNBY2Nlc3NvcmllcyBmb3Igc3RyaW5nZWQgaW5zdHJ1bWVudHMjNDkuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMjAuMDcuMDAjUGVyY3Vzc2lvbiBpbnN0cnVtZW50IGFjY2Vzc29yeSM0OS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0OS4xMS4yMC4wOC4wMCNNdXNpYyBib3hlcyBvciBtZWNoYW5pc21zIzQ5LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ5LjEyLjAwLjAwLjAwI0NhbXBpbmcgYW5kIG91dGRvb3IgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMi4xNS4wMC4wMCNDYW1waW5nIGFuZCBvdXRkb29yIGVxdWlwbWVudCM0OS4xMi4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMi4xNS4wMS4wMCNUYXJwYXVsaW5zIzQ5LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE1LjAyLjAwI1NsZWVwaW5nIHBhZHMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTUuMDMuMDAjVGVudHMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTUuMDQuMDAjU2xlZXBpbmcgYmFncyM0OS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMi4xNS4wNS4wMCNJY2UgY2hlc3RzIzQ5LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE1LjA2LjAwI1RlbnQgcmVwYWlyIGtpdHMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTUuMDcuMDAjUG5ldW1hdGljIG1hdHRyZXNzZXMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTUuMDguMDAjTW9zcXVpdG8gbmV0cyM0OS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMi4xNS4wOS4wMCNDYW1waW5nIG9yIG91dGRvb3Igc3RvdmVzIzQ5LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE1LjEwLjAwI0RyaW5rIGNvb2xlcnMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTYuMDAuMDAjQ2FtcGluZyBmdXJuaXR1cmUjNDkuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTYuMDEuMDAjQ2FtcGluZyBjaGFpcnMgb3Igc3Rvb2xzIzQ5LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE2LjAyLjAwI0NhbXBpbmcgdGFibGVzIzQ5LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE2LjAzLjAwI0NhbXBpbmcgY290cyM0OS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMy4wMC4wMC4wMCNGaXNoaW5nIGFuZCBodW50aW5nIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNS4wMC4wMCNGaXNoaW5nIHRhY2tsZSM0OS4xMy4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNS4wMS4wMCNGaXNoaW5nIHJvZHMjNDkuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTUuMDIuMDAjRmlzaGluZyBsaW5lIzQ5LjEzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE1LjAzLjAwI0Zpc2hpbmcgcmVlbHMjNDkuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTUuMDQuMDAjRmlzaGluZyBsdXJlcyM0OS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNS4wNS4wMCNGaXNoaW5nIGJhaXQjNDkuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTUuMDYuMDAjRmlzaGluZyB3ZWlnaHRzIG9yIHNpbmtlcnMjNDkuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTYuMDAuMDAjSHVudGluZyBwcm9kdWN0cyM0OS4xMy4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNi4wMS4wMCNBbmltYWwgY2FsbHMjNDkuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTYuMDIuMDAjU3BvcnRpbmcgZGVjb3lzIzQ5LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE2LjAzLjAwI1Nwb3J0aW5nIHRyYXBzIzQ5LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE2LjA0LjAwI1Nwb3J0aW5nIHNob3RndW5zIzQ5LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE2LjA1LjAwI1Nwb3J0aW5nIHJpZmxlcyM0OS4xMy4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNi4wNi4wMCNTcG9ydGluZyBhbW11bml0aW9uIzQ5LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE2LjA3LjAwI0d1biBiYXJyZWwjNDkuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMDAuMDAuMDAjV2F0ZXJzcG9ydHMgZXF1aXBtZW50IzQ5LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE1LjAwLjAwI1NjdWJhIGFuZCBzbm9ya2VsaW5nIGdlYXIjNDkuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTUuMDEuMDAjQm91eWFuY3kgY29tcGVuc2F0b3JzIzQ5LjE0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE1LjAyLjAwI1NjdWJhIHRhbmtzIzQ5LjE0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE1LjAzLjAwI1NjdWJhIHJlZ3VsYXRvcnMjNDkuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTUuMDQuMDAjRGl2aW5nIGluc3RydW1lbnRzIG9yIGFjY2Vzc29yaWVzIzQ5LjE0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE1LjA1LjAwI01hc2tzIG9yIGZpbnMgb3Igc25vcmtlbHMjNDkuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTUuMDYuMDAjV2V0c3VpdHMjNDkuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTUuMDcuMDAjRHJ5c3VpdHMjNDkuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTYuMDAuMDAjU3VyZiBhbmQgc3dpbSBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzQ5LjE0LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE2LjAyLjAwI1dha2Vib2FyZHMgb3Iga25lZWJvYXJkcyBvciBib29naWVib2FyZHMjNDkuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTYuMDMuMDAjV2F0ZXIgc2tpcyBvciBhY2Nlc3NvcmllcyM0OS4xNC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNC4xNi4wNC4wMCNXaW5kc3VyZmluZyBlcXVpcG1lbnQjNDkuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTYuMDUuMDAjU3VyZmJvYXJkcyM0OS4xNC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNC4xNi4wNi4wMCNTd2ltIGdvZ2dsZXMgb3Igc3dpbSBmaW5zIzQ5LjE0LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE2LjA3LjAwI1BhcmFzYWlsaW5nIGVxdWlwbWVudCM0OS4xNC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNS4wMC4wMC4wMCNXaW50ZXIgc3BvcnRzIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNS4xNS4wMC4wMCNTa2lpbmcgYW5kIHNub3dib2FyZGluZyBlcXVpcG1lbnQjNDkuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTUuMDEuMDAjU2tpIGJvb3RzIzQ5LjE1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE1LjE1LjAyLjAwI1NraXMjNDkuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTUuMDMuMDAjU2tpIHBvbGVzIzQ5LjE1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE1LjE1LjA0LjAwI0JpbmRpbmdzIzQ5LjE1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE1LjE1LjA1LjAwI1Nub3dib2FyZHMjNDkuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTYuMDAuMDAjU2thdGluZyBhbmQgaWNlIGhvY2tleSBlcXVpcG1lbnQjNDkuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTYuMDEuMDAjSG9ja2V5IHB1Y2tzIzQ5LjE1LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE1LjE2LjAyLjAwI0ljZSBza2F0ZXMjNDkuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTYuMDMuMDAjSG9ja2V5IHN0aWNrcyM0OS4xNS4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4wMC4wMC4wMCNGaWVsZCBhbmQgY291cnQgc3BvcnRzIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4wMC4wMCNGaWVsZCBzcG9ydHMgZXF1aXBtZW50IzQ5LjE2LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjAxLjAwI0Zvb3RiYWxsIGJsb2NraW5nIHNsZWRzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjAyLjAwI0Jhc2ViYWxsIGdsb3ZlcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4wMy4wMCNCYXNlYmFsbHMjNDkuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTUuMDQuMDAjRm9vdGJhbGxzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjA1LjAwI1NvY2NlciBiYWxscyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4wNi4wMCNCYXNlYmFsbCBiYXRzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjA3LjAwI0Jhc2ViYWxsIGJhc2VzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjA4LjAwI1BpdGNoaW5nIG1hY2hpbmVzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjA5LjAwI1NvZnRiYWxscyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xMC4wMCNGb290YmFsbCB0YWNrbGluZyBkdW1taWVzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjExLjAwI0xhY3Jvc3NlIHN0aWNrcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xMi4wMCNMYWNyb3NzZSBiYWxscyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xMy4wMCNGaWVsZCBob2NrZXkgc3RpY2tzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjE0LjAwI0ZpZWxkIGhvY2tleSBiYWxscyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xNS4wMCNUZWFtIGhhbmRiYWxsIGJhbGxzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjE2LjAwI1RlYW0gaGFuZGJhbGwgc2Nob29sIHNldHMjNDkuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTUuMTcuMDAjQmFzZWJhbGwgb3Igc29mdGJhbGwgcHJvdGVjdGl2ZSBnZWFyIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjE4LjAwI0Jhc2ViYWxsIGJhdHRpbmcgYWlkcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xOS4wMCNCYXNlYmFsbCBiYWNrc3RvcHMgb3IgZmVuY2VzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjIwLjAwI1NvZnRiYWxsIGJhdHMjNDkuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTUuMjEuMDAjU29mdGJhbGwgZ2xvdmVzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjIyLjAwI0Zvb3RiYWxsIGtpY2tpbmcgdGVlcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4yMy4wMCNGbGFnIGZvb3RiYWxsIGdlYXIjNDkuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTUuMjQuMDAjU29jY2VyIGZpZWxkIG1hcmtpbmcgZXF1aXBtZW50IzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjI1LjAwI1NvY2NlciBwcm90ZWN0aXZlIGVxdWlwbWVudCM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4yNi4wMCNTb2NjZXIgdHJhaW5pbmcgYWlkcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4wMC4wMCNSYWNxdWV0IGFuZCBjb3VydCBzcG9ydHMgZXF1aXBtZW50IzQ5LjE2LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjAxLjAwI1JhY3F1ZXRiYWxsIHJhY2tldHMjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMDIuMDAjQmFkbWludG9uIHJhY2tldHMjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMDMuMDAjQmFza2V0YmFsbHMjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMDQuMDAjVGVubmlzIGJhbGxzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjA1LjAwI1JhY3F1ZXQgYmFsbHMjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMDYuMDAjU3F1YXNoIGJhbGxzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjA3LjAwI1Rlbm5pcyByYWNxdWV0cyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4wOC4wMCNWb2xsZXliYWxscyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4wOS4wMCNCYWRtaW50b24gYmlyZGllcyBvciBzaHV0dGxlY29ja3MjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMTAuMDAjU3F1YXNoIHJhY3F1ZXRzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjExLjAwI1Rlbm5pcyB0cmFpbmluZyBhaWRzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjEyLjAwI1Rlbm5pcyBjb3VydCBlcXVpcG1lbnQjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMTMuMDAjVm9sbGV5YmFsbCBzdG9yYWdlIGZvciBiYWxscyBvciBuZXRzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjE0LjAwI1ZvbGxleWJhbGwgZ3ltbmFzaXVtIHN0YW5kYXJkcyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4xNS4wMCNCYXNrZXRiYWxsIGNvbXBsZXRlIGdhbWUgc3lzdGVtcyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4xNi4wMCNGbG9vciBob2NrZXkgcHJvdGVjdGl2ZSBlcXVpcG1lbnQjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMTcuMDAjVGV0aGVyIHBvbGVzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjE4LjAwI1RldGhlciBiYWxscyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNy4wMC4wMCNUcmFjayBzcG9ydHMgZXF1aXBtZW50IzQ5LjE2LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE3LjAxLjAwI0phdmVsaW5zIzQ5LjE2LjE3LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE3LjAyLjAwI0p1bXBpbmcgYmFycyM0OS4xNi4xNy4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNy4wMy4wMCNEaXNjdXMjNDkuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTcuMDQuMDAjU2hvdHB1dHMjNDkuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTcuMDUuMDAjVmF1bHRpbmcgcG9sZXMjNDkuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTcuMDYuMDAjSHVyZGxlcyM0OS4xNi4xNy4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNy4wNy4wMCNCYXRvbnMjNDkuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMDAuMDAuMDAjR3ltbmFzdGljcyBhbmQgYm94aW5nIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNS4wMC4wMCNHeW1uYXN0aWNzIGVxdWlwbWVudCM0OS4xNy4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNS4wMS4wMCNHeW1uYXN0aWMgYmFycyBvciBiZWFtcyM0OS4xNy4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNS4wMi4wMCNHeW1uYXN0aWMgcm9wZXMgb3IgcmluZ3Mgb3IgY2xpbWJpbmcgYWNjZXNzb3JpZXMjNDkuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMTUuMDMuMDAjR3ltbmFzdGljIHZhdWx0aW5nIGVxdWlwbWVudCM0OS4xNy4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNS4wNC4wMCNHeW1uYXN0aWMgdHJhbXBvbGluZXMjNDkuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMTUuMDUuMDAjQmFsYW5jZSBlcXVpcG1lbnQjNDkuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMTYuMDAuMDAjQm94aW5nIGVxdWlwbWVudCM0OS4xNy4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNi4wMS4wMCNCb3hpbmcgcmluZ3MjNDkuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMTYuMDIuMDAjUHVuY2hpbmcgYmFncyM0OS4xNy4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNi4wMy4wMCNCb3hpbmcgZ2xvdmVzIzQ5LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjAwLjAwLjAwI1RhcmdldCBhbmQgdGFibGUgZ2FtZXMgYW5kIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4wMC4wMCNUYWJsZSBnYW1lcyBhbmQgZXF1aXBtZW50IzQ5LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjAxLjAwI0JpbGxpYXJkIHRhYmxlcyM0OS4xOC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4wMi4wMCNQb29sIGN1ZXMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMDMuMDAjU2h1ZmZsZWJvYXJkIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjA0LjAwI1BpbmJhbGwgZ2FtZXMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMDUuMDAjQmlsbGlhcmQgYmFsbHMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMDYuMDAjQWlyIGhvY2tleSB0YWJsZXMgb3IgYWNjZXNzb3JpZXMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMDcuMDAjVGVubmlzIHRhYmxlcyM0OS4xOC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4wOC4wMCNUYWJsZSB0ZW5uaXMgcGFkZGxlcyM0OS4xOC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4wOS4wMCNUYWJsZSB0ZW5uaXMgYmFsbHMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMTAuMDAjRm9vc2JhbGwgdGFibGVzIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjExLjAwI0Zvb3NiYWxscyM0OS4xOC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4xMi4wMCNGb29zYmFsbCByZXBsYWNlbWVudCBwbGF5ZXJzIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjEzLjAwI0JpbGxpYXJkIGN1ZSB0aXBzIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjE0LjAwI0JpbGxpYXJkIGNoYWxrIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjE1LjAwI0JpbGxpYXJkIHJhY2tzIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE2LjAwLjAwI1RhcmdldCBnYW1lcyBhbmQgZXF1aXBtZW50IzQ5LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE2LjAxLjAwI0FyY2hlcnkgdGFyZ2V0cyM0OS4xOC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNi4wMi4wMCNBcmNoZXJ5IGJvd3MjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDMuMDAjQXJjaGVyeSBhcnJvd3MjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDQuMDAjRGFydHMjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDUuMDAjRGFydCBib2FyZHMjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDYuMDAjVHJhcHNob290aW5nIGVxdWlwbWVudCM0OS4xOC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNi4wNy4wMCNUaHJvd2luZyB0YXJnZXRzIzQ5LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE2LjA4LjAwI0FyY2hlcnkgYm93IHN0cmluZ3MjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDkuMDAjQXJjaGVyeSBnbG92ZXMjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMTAuMDAjQXJjaGVyeSBhcm0gZ3VhcmRzIzQ5LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE2LjExLjAwI0FyY2hlcnkgdGFyZ2V0IHN0YW5kcyM0OS4xOC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNi4xMi4wMCNBcmNoZXJ5IGJhY2tzdG9wcyM0OS4xOC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMC4wMC4wMC4wMCNGaXRuZXNzIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNS4wMC4wMCNBZXJvYmljIHRyYWluaW5nIGVxdWlwbWVudCM0OS4yMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNS4wMS4wMCNUcmVhZG1pbGxzIzQ5LjIwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE1LjAyLjAwI1N0YWlyIGNsaW1iZXJzIzQ5LjIwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE1LjAzLjAwI1N0YXRpb25hcnkgYmljeWNsZXMjNDkuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTUuMDQuMDAjUm93aW5nIG1hY2hpbmVzIzQ5LjIwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE1LjEyLjAwI0p1bXAgcm9wZXMjNDkuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTUuMTMuMDAjRXhlcmNpc2UgdHJhbXBvbGluZXMjNDkuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTUuMTQuMDAjRXhlcmNpc2UgYmFsbHMjNDkuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTUuMTUuMDAjU3RlcCBhZXJvYmljIGVxdWlwbWVudCM0OS4yMC4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNi4wMC4wMCNXZWlnaHQgYW5kIHJlc2lzdGFuY2UgdHJhaW5pbmcgZXF1aXBtZW50IzQ5LjIwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE2LjAxLjAwI0R1bWJiZWxscyM0OS4yMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNi4wMi4wMCNCYXJiZWxscyM0OS4yMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNi4wMy4wMCNMb3dlciBib2R5IHJlc2lzdGFuY2UgbWFjaGluZXMjNDkuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTYuMDQuMDAjV2VpZ2h0IGJlbmNoZXMgb3IgcmFja3MjNDkuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTYuMDUuMDAjVXBwZXIgYm9keSByZXNpc3RhbmNlIG1hY2hpbmVzIzQ5LjIwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE2LjA2LjAwI0ZpdG5lc3Mgd2VpZ2h0cyM0OS4yMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNi4wNy4wMCNQaWxhdGVzIG1hY2hpbmVzIzQ5LjIwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE2LjA4LjAwI0dyaXAgc3RyZW5ndGhlbmVyIzQ5LjIwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE2LjA5LjAwI1Jlc2lzdGFuY2UgYmFuZHMjNDkuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTYuMTAuMDAjUmVzaXN0YW5jZSB0dWJlcyM0OS4yMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMS4wMC4wMC4wMCNPdGhlciBzcG9ydHMjNDkuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTYuMDAuMDAjR29sZiBlcXVpcG1lbnQjNDkuMjEuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTYuMDEuMDAjR29sZiBiYWdzIzQ5LjIxLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE2LjAyLjAwI0dvbGYgYmFsbHMjNDkuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTYuMDMuMDAjR29sZiBjbHVicyM0OS4yMS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMS4xNi4wNC4wMCNHb2xmIHRlZXMjNDkuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTYuMDUuMDAjR29sZiBjbHViIGhlYWQgY292ZXJzIzQ5LjIxLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE2LjA2LjAwI0dvbGYgZ2xvdmVzIzQ5LjIxLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE2LjA3LjAwI0Rpdm90IGZpeGVycyM0OS4yMS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMS4xNy4wMC4wMCNCb3dsaW5nIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzQ5LjIxLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE3LjAxLjAwI0Jvd2xpbmcgZXF1aXBtZW50IzQ5LjIxLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE3LjAyLjAwI0Jvd2xpbmcgc3VwcGxpZXMjNDkuMjEuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTcuMDMuMDAjQm93bGluZyBhY2Nlc3NvcmllcyM0OS4yMS4xNy4wMC4wMAotdW5zcHNjNyM0OS4yMS4xOC4wMC4wMCNQaHlzaWNhbCBlZHVjYXRpb24gY2xhc3Nyb29tIGVxdWlwbWVudCM0OS4yMS4wMC4wMC4wMAotdW5zcHNjNyM0OS4yMS4xOC4wMS4wMCNQYXJhY2h1dGUgZXF1aXBtZW50IzQ5LjIxLjE4LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE4LjAyLjAwI0h1bGEgaG9vcHMgb3IgaG9vcCBlcXVpcG1lbnQjNDkuMjEuMTguMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTguMDMuMDAjT3JpZW50ZWVyaW5nIGVxdWlwbWVudCM0OS4yMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4yMS4xOC4wNC4wMCNUZWFtIGlkZW50aWZpY2F0aW9uIG1hdGVyaWFscyBvciBtYXJrZXJzIzQ5LjIxLjE4LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE4LjA1LjAwI0xhbnlhcmRzIzQ5LjIxLjE4LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE4LjA2LjAwI1BoeXNpY2FsIGVkdWNhdGlvbiBlcXVpcG1lbnQgc3RvcmFnZSM0OS4yMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4yMS4xOC4wNy4wMCNQaHlzaWNhbCBlZHVjYXRpb24gYXNzZXNzbWVudCB0b29scyM0OS4yMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4yMi4wMC4wMC4wMCNTcG9ydHMgYWNjZXNzb3JpZXMjNDkuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDAuMDAjU3BvcnQgYWNjZXNzb3JpZXMjNDkuMjIuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDEuMDAjU3BvcnQgc2NvcmVib2FyZHMjNDkuMjIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDIuMDAjU3BvcnQgZ29hbHMjNDkuMjIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDMuMDAjU3BvcnQgc2FmZXR5IGVxdWlwbWVudCBvdGhlciB0aGFuIGhlYWRnZWFyIzQ5LjIyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIyLjE1LjA0LjAwI1Nwb3J0IHNhZmV0eSBoZWFkZ2VhciM0OS4yMi4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMi4xNS4wNS4wMCNTcG9ydCBuZXRzIG9yIG5ldHRpbmcjNDkuMjIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDYuMDAjU3BvcnQgbWF0cyBvciBwYWRkaW5nIzQ5LjIyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIyLjE1LjA3LjAwI0Jhc2tldGJhbGwgYmFja2JvYXJkcyM0OS4yMi4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMi4xNS4wOC4wMCNCYXNrZXRiYWxsIGhvb3AjNDkuMjIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDkuMDAjUm9sbGVyIHNrYXRlcyBvciByb2xsZXIgYmxhZGVzIzQ5LjIyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjAwLjAwLjAwI1RveXMgYW5kIGdhbWVzIzQ5LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjAwLjAwI1RveXMjNDkuMjMuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMDEuMDAjTXVzaWNhbCB0b3lzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjAyLjAwI0VkdWNhdGlvbmFsIHRveXMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMDMuMDAjVG95IGJhbGxvb25zIG9yIGJhbGxzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA0LjAwI0RvbGxzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA1LjAwI0RvbGwgaG91c2VzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA2LjAwI1N0dWZmZWQgYW5pbWFscyBvciBwdXBwZXRzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA3LjAwI1BsYXlob3VzZXMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMDguMDAjQnVpbGRpbmcgYmxvY2tzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA5LjAwI1JpZGluZyB0b3lzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjEwLjAwI1B1bGwgdG95cyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xMS4wMCNDaGlsZHJlbnMgc2NpZW5jZSBraXRzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjEyLjAwI1RveSB2ZWhpY2xlcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xMy4wMCNUb3kgdHJhaW5zIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjE0LjAwI0luZmxhdGFibGUgdG95cyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xNS4wMCNEb2xsIHBhcnRzIG9yIGFjY2Vzc29yaWVzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjE2LjAwI1lvIHlvcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xNy4wMCNLaXRlcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xOC4wMCNQb2dzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjE5LjAwI0thbGVpZG9zY29wZXMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMjAuMDAjUG9tIHBvbXMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMjEuMDAjUGluYXRhcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4yMi4wMCNCb29tZXJhbmdzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjIzLjAwI0ZseWluZyBkaXNjcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4yNC4wMCNUb3kgcGFpbHMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTYuMDAuMDAjR2FtZXMjNDkuMjMuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTYuMDEuMDAjRWR1Y2F0aW9uYWwgZ2FtZXMjNDkuMjMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTYuMDIuMDAjQm9hcmQgZ2FtZXMjNDkuMjMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTYuMDMuMDAjUGxheWluZyBjYXJkcyM0OS4yMy4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNi4wNC4wMCNWaWRlbyBnYW1lcyM0OS4yMy4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNi4wNS4wMCNQdXp6bGVzIzQ5LjIzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE2LjA2LjAwI0RpY2UjNDkuMjMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMDAuMDAuMDAjUmVjcmVhdGlvbiBhbmQgcGxheWdyb3VuZCBhbmQgc3dpbW1pbmcgYW5kIHNwYSBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzQ5LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjAwLjAwI1BsYXlncm91bmQgZXF1aXBtZW50IzQ5LjI0LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjAxLjAwI1BsYXlncm91bmQgc3dpbmdzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjAyLjAwI1BsYXlncm91bmQgY2xpbWJpbmcgYXBwYXJhdHVzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjAzLjAwI1BsYXlncm91bmQgbWVycnkgZ28gcm91bmRzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA0LjAwI1BsYXlncm91bmQgc2xpZGVzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA1LjAwI1BsYXlncm91bmQgc2VlIHNhd3MjNDkuMjQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTUuMDYuMDAjUGxheWdyb3VuZCB0dW5uZWxzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA3LjAwI1BsYXlncm91bmQgc2FuZGJveGVzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA4LjAwI1BsYXlncm91bmQgYmxlYWNoZXJzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA5LjAwI1dhbGwgY2xpbWJpbmcgZXF1aXBtZW50IzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjEwLjAwI1JvcGUgY2xpbWJpbmcgZXF1aXBtZW50IzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE2LjAwLjAwI1JlY3JlYXRpb25hbCBlcXVpcG1lbnQjNDkuMjQuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTYuMDEuMDAjQ3JvcXVldCBzZXRzIzQ5LjI0LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE2LjAyLjAwI0xhd24gYm93bGluZyBlcXVpcG1lbnQjNDkuMjQuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTYuMDMuMDAjSG9yc2VzaG9lIGVxdWlwbWVudCM0OS4yNC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yNC4xNi4wNC4wMCNMYXduIGRhcnRzIzQ5LjI0LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE3LjAwLjAwI1N3aW1taW5nIHBvb2wgYW5kIHNwYSBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzQ5LjI0LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE3LjAxLjAwI0RpdmluZyBib2FyZHMjNDkuMjQuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTcuMDIuMDAjUG9vbCBzbGlkZXMjNDkuMjQuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTcuMDMuMDAjU3BhIGJsb3dlciM0OS4yNC4xNy4wMC4wMAotdW5zcHNjNyM0OS4yNC4xNy4wNC4wMCNXYXRlciB0ZXN0IGtpdCBvciBzb2x1dGlvbnMjNDkuMjQuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTcuMDUuMDAjQXV0b21hdGljIHBvb2wgY2xlYW5lciM0OS4yNC4xNy4wMC4wMAotdW5zcHNjNyM0OS4yNC4xNy4wNi4wMCNTb2xhciBibGFua2V0IzQ5LjI0LjE3LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE3LjA3LjAwI1Bvb2wgb3Igc3BhIGhlYXRlciM0OS4yNC4xNy4wMC4wMAotdW5zcHNjNyM0OS4yNC4xNy4wOC4wMCNPem9uZSBnZW5lcmF0b3IjNDkuMjQuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTcuMDkuMDAjU29sYXIgYmxhbmtldCByZWVscyM0OS4yNC4xNy4wMC4wMAotdW5zcHNjNyM0OS4yNS4wMC4wMC4wMCNBcnRzIGFuZCBjcmFmdHMgc3VwcGxpZXMjNDkuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTUuMDAuMDAjQXJ0IHN1cHBsaWVzIzQ5LjI1LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjAxLjAwI0FydCBwYWludHMjNDkuMjUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTUuMDIuMDAjTW9kZWxpbmcgY2xheSM0OS4yNS4xNS4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNS4wMy4wMCNBcnQgcGFpbnRicnVzaGVzIzQ5LjI1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjA0LjAwI1BpY3R1cmUgb3IgcG9zdGVyIGZyYW1lcyM0OS4yNS4xNS4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNS4wNS4wMCNQaWN0dXJlIGFsYnVtcyBvciBvcmdhbml6ZXJzIzQ5LjI1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjA2LjAwI0N1dHRpbmcgbWF0cyM0OS4yNS4xNS4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNS4wNy4wMCNDYXJ2aW5nIGJvYXJkIzQ5LjI1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjA4LjAwI1BhbGV0dGVzIzQ5LjI1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjA5LjAwI0dsaXR0ZXIjNDkuMjUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTUuMTAuMDAjQmVhZHMjNDkuMjUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTUuMTEuMDAjRGVjb3JhdGl2ZSB0YXBlcyBvciB0d2lzdHMjNDkuMjUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTYuMDAuMDAjQ3JhZnQgc3VwcGxpZXMjNDkuMjUuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTYuMDEuMDAjTW9kZWwga2l0cyM0OS4yNS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNi4wMi4wMCNQb3R0ZXJzIHdoZWVscyM0OS4yNS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNi4wMy4wMCNEZWNvcmF0aXZlIGJ1dHRvbnMjNDkuMjUuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTYuMDQuMDAjRGVjb3JhdGl2ZSBzaGFwZXMgb3Igc3RyaW5ncyM0OS4yNS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNi4wNS4wMCNDcmFmdCBraXRzIzQ5LjI1LjE2LjAwLjAwCi11bnNwc2M3IzUwLjAwLjAwLjAwLjAwI0Zvb2QgQmV2ZXJhZ2UgYW5kIFRvYmFjY28gUHJvZHVjdHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMDAuMDAuMDAjRnJ1aXRzIGFuZCB2ZWdldGFibGVzIGFuZCBudXRzIGFuZCBzZWVkcyM1MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4wMC4wMCNWZWdldGFibGVzIzUwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjAxLjAwI0JlYW5zIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjAyLjAwI1NwaW5hY2gjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMDMuMDAjUG90YXRvZXMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMDQuMDAjUGVhcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4wNS4wMCNPbmlvbnMgb3Igb3RoZXIgYWxsaWFjZW91cyB2ZWdldGFibGVzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjA2LjAwI0xldHR1Y2UjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMDcuMDAjQ2FiYmFnZSM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4wOC4wMCNTcXVhc2hlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4wOS4wMCNZYW1zIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjEwLjAwI0NhcnJvdHMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMTEuMDAjUnV0YWJhZ2FzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjEyLjAwI0VnZ3BsYW50cyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4xMy4wMCNQZXBwZXJzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjE0LjAwI1JodWJhcmIjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMTUuMDAjRW5kaXZlIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjE2LjAwI0FzcGFyYWd1cyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4xNy4wMCNBcnRpY2hva2VzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjE4LjAwI1BhcnNuaXBzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjE5LjAwI0NlbGVyeSM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4yMC4wMCNSYWRpc2hlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4yMS4wMCNNdXNocm9vbXMgb3Igb3RoZXIgZWRpYmxlIGZ1bmdpIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjIyLjAwI0hvcnNlcmFkaXNoIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjIzLjAwI1R1cm5pcHMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMjQuMDAjTXVzdGFyZCBncmVlbnMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMjUuMDAjS2FsZSM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4yNi4wMCNDb2xsYXJkcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4yNy4wMCNCcnVzc2VsIHNwcm91dHMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMjguMDAjQnJvY2NvbGkjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMjkuMDAjQ2F1bGlmbG93ZXJzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjMwLjAwI09rcmEjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMzEuMDAjQ3VjdW1iZXJzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjMyLjAwI1RvbWF0b2VzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjMzLjAwI0JlZXRzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjM0LjAwI01hbmlvYyByb290cyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4zNS4wMCNMZW50aWxzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjM2LjAwI0Nvcm4jNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMzcuMDAjUHVtcGtpbnMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMzguMDAjRnJlc2ggdmVnZXRhYmxlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4zOS4wMCNGcm96ZW4gdmVnZXRhYmxlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS40MC4wMCNTaGVsZiBzdGFibGUgdmVnZXRhYmxlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4wMC4wMCNGcnVpdHMjNTAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMDEuMDAjTGltZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMDIuMDAjTWFuZ29lcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4wMy4wMCNHdWF2YXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMDQuMDAjR3JhcGVzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjA1LjAwI0RhdGVzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjA2LjAwI0Fwcmljb3RzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjA3LjAwI0JlcnJpZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMDguMDAjUGVhY2hlcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4wOS4wMCNDaGVycmllcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xMC4wMCNCYW5hbmFzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjExLjAwI01lbG9ucyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xMi4wMCNQb21lZ3JhbmF0ZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMTMuMDAjUGFwYXlhcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xNC4wMCNLaXdpcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xNS4wMCNMaWNoZWVzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjE2LjAwI1BlYXJzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjE3LjAwI1BsdW1zIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjE4LjAwI0FwcGxlcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xOS4wMCNQYXNzaW9uIGZydWl0IzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjIwLjAwI05lY3RhcmluZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMjEuMDAjUGluZWFwcGxlcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4yMi4wMCNGaWdzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjIzLjAwI1RhbmdlbG9zIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjI0LjAwI01hbmRhcmlucyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4yNS4wMCNPcmFuZ2VzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjI2LjAwI1RhbmdlcmluZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMjcuMDAjR3JhcGVmcnVpdCM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4yOC4wMCNMZW1vbnMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMjkuMDAjRHVyaWFucyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zMC4wMCNDb2NvbnV0cyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zMS4wMCNBdm9jYWRvcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zMi4wMCNRdWluY2VzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjMzLjAwI09saXZlcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zNC4wMCNGcmVzaCBmcnVpdCM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zNS4wMCNGcm96ZW4gZnJ1aXQjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMzYuMDAjU2hlbGYgc3RhYmxlIGZydWl0IzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjAwLjAwI051dHMgYW5kIHNlZWRzIzUwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjAxLjAwI0NoZXN0bnV0cyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4wMy4wMCNQZWNhbnMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMDQuMDAjQnJhemlsIG51dHMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMDUuMDAjQ2FzaGV3cyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4wNi4wMCNBbG1vbmRzIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjA3LjAwI01hY2FkYW1pYSBudXRzIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjA4LjAwI0hhemVsbnV0cyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4wOS4wMCNQaW5lIG51dHMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMTAuMDAjUGlzdGFjaGlvcyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4xMS4wMCNXYWxudXRzIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjEyLjAwI0JldGVsIG51dHMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMTMuMDAjUGVhbnV0cyBvciBncm91bmRudXRzIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjE0LjAwI01peGVkIG51dHMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMTUuMDAjTnV0IG1lYXQjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMTYuMDAjV2hvbGUgbnV0cyBvciBzZWVkcyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4xNy4wMCNTaGVsbGVkIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjExLjAwLjAwLjAwI01lYXQgYW5kIHBvdWx0cnkgcHJvZHVjdHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDAuMDAjTWVhdCBhbmQgcG91bHRyeSM1MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNS4wMS4wMCNDaGlja2VuIzUwLjExLjE1LjAwLjAwCi11bnNwc2M3IzUwLjExLjE1LjAyLjAwI1R1cmtleSM1MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNS4wMy4wMCNEdWNrIzUwLjExLjE1LjAwLjAwCi11bnNwc2M3IzUwLjExLjE1LjA0LjAwI09zdHJpY2gjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDUuMDAjUGFydHJpZGdlIzUwLjExLjE1LjAwLjAwCi11bnNwc2M3IzUwLjExLjE1LjA2LjAwI0RvdmUjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDcuMDAjUGhlYXNhbnQjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDguMDAjUXVhaWwjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDkuMDAjR29vc2UjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMTAuMDAjRnJlc2ggbWVhdCBhbmQgcG91bHRyeSM1MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNS4xMS4wMCNGcm96ZW4gbWVhdCBhbmQgcG91bHRyeSM1MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNS4xMi4wMCNTaGVsZiBzdGFibGUgbWVhdCBhbmQgcG91bHRyeSM1MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNi4wMC4wMCNGcmVzaCBhbmQgZnJvemVuIHJlZCBtZWF0IGFuZCBieXByb2R1Y3RzIzUwLjExLjAwLjAwLjAwCi11bnNwc2M3IzUwLjExLjE2LjAxLjAwI0JlZWYjNTAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTYuMDIuMDAjVmVhbCM1MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNi4wMy4wMCNNdXR0b24jNTAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTYuMDQuMDAjTGFtYiM1MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNi4wNS4wMCNCdWZmYWxvIzUwLjExLjE2LjAwLjAwCi11bnNwc2M3IzUwLjExLjE2LjA2LjAwI0hvcnNlbWVhdCM1MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNi4wNy4wMCNBc3Mgb3IgbXVsZSBvciBoaW5ueSBtZWF0IzUwLjExLjE2LjAwLjAwCi11bnNwc2M3IzUwLjExLjE3LjAwLjAwI0ZyZXNoIGFuZCBmcm96ZW4gcG9yayBhbmQgYnlwcm9kdWN0cyM1MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNy4wMS4wMCNQb3JrIzUwLjExLjE3LjAwLjAwCi11bnNwc2M3IzUwLjExLjE4LjAwLjAwI0ZyZXNoIGFuZCBmcm96ZW4gb3JnYW4gbWVhdCBhbmQgYnlwcm9kdWN0cyM1MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMS4xOC4wMS4wMCNPcmdhbiBtZWF0IzUwLjExLjE4LjAwLjAwCi11bnNwc2M3IzUwLjExLjE4LjAyLjAwI0xpdmVyIzUwLjExLjE4LjAwLjAwCi11bnNwc2M3IzUwLjExLjE4LjAzLjAwI0dpenphcmQjNTAuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTguMDQuMDAjVHJpcGUjNTAuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTguMDUuMDAjU3RvbWFjaCM1MC4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MC4xMS4xOC4wNi4wMCNLaWRuZXkjNTAuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTguMDcuMDAjQnJhaW5zIzUwLjExLjE4LjAwLjAwCi11bnNwc2M3IzUwLjExLjE5LjAwLjAwI0RlbGljYXRlc3NlbiBtZWF0IHByb2R1Y3RzIzUwLjExLjAwLjAwLjAwCi11bnNwc2M3IzUwLjExLjE5LjAxLjAwI1NhbGFtaSM1MC4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xOS4wMi4wMCNLYWJhbmEjNTAuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTkuMDMuMDAjUGFzdHJhbWkjNTAuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTkuMDQuMDAjUm9hc3QgYmVlZiM1MC4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xOS4wNS4wMCNDb3JuZWQgYmVlZiBvciBzaWx2ZXJzaWRlIzUwLjExLjE5LjAwLjAwCi11bnNwc2M3IzUwLjExLjE5LjA2LjAwI0ZyYW5rZnVydCBvciBob3QgZG9nIzUwLjExLjE5LjAwLjAwCi11bnNwc2M3IzUwLjExLjIwLjAwLjAwI1Byb2Nlc3NlZCBhbmQgcHJlcGFyZWQgbWVhdHMjNTAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMjAuMDEuMDAjRnJlc2ggcHJvY2Vzc2VkIG9yIHByZXBhcmVkIG1lYXRzIzUwLjExLjIwLjAwLjAwCi11bnNwc2M3IzUwLjExLjIwLjAyLjAwI0Zyb3plbiBwcm9jZXNzZWQgb3IgcHJlcGFyZWQgbWVhdHMjNTAuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMjAuMDMuMDAjU2hlbGYgc3RhYmxlIHByb2Nlc3NlZCBvciBwcmVwYXJlZCBtZWF0cyM1MC4xMS4yMC4wMC4wMAotdW5zcHNjNyM1MC4xMi4wMC4wMC4wMCNTZWFmb29kIzUwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjAwLjAwI0Zpc2gjNTAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMDEuMDAjTGVtb25maXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjAyLjAwI0RvZ2Zpc2gjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMDMuMDAjR3JvdXBlciM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4wNC4wMCNNYWhpIG1haGkjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMDUuMDAjTW9ua2Zpc2gjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMDYuMDAjUG9tcGFubyM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4wNy4wMCNCYXNzIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjA4LjAwI1NoYXJrIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjA5LjAwI1RpbGFwaWEjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMTAuMDAjU3dvcmRmaXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjExLjAwI0FuY2hvdmllcyM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4xMi4wMCNDYXJwIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjEzLjAwI0NhdGZpc2gjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMTQuMDAjRWVsIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjE1LjAwI1N0dXJnZW9uIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjE2LjAwI1R1bmEjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMTcuMDAjQ29kIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjE4LjAwI0hhbGlidXQjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMTkuMDAjSGFkZG9jayM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4yMC4wMCNPY2VhbiBwZXJjaCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4yMS4wMCNPcmFuZ2Ugcm91Z2h5IzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjIyLjAwI1BhcnJvdCBmaXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjIzLjAwI1Bpa2UjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMjQuMDAjUmVkIHNuYXBwZXIjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMjUuMDAjUm9ja2Zpc2gjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMjYuMDAjU21lbHQjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMjcuMDAjU29sZSM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4yOC4wMCNXaGl0aW5nIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjI5LjAwI1NhbG1vbiM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zMC4wMCNNYWNrZXJlbCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zMS4wMCNTYXJkaW5lcyM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zMi4wMCNUcm91dCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zMy4wMCNTdXJpbWkjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMzQuMDAjQmxhY2tmaXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjM1LjAwI0hlcnJpbmcjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMzYuMDAjRnJlc2ggZmlzaCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zNy4wMCNGcm96ZW4gZmlzaCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zOC4wMCNTaGVsZiBzdGFibGUgZmlzaCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zOS4wMCNGcmVzaCBmaXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjAwLjAwI1NoZWxsZmlzaCM1MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNi4wMS4wMCNBYmFsb25lIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjAyLjAwI1NjYWxsb3BzIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjAzLjAwI0NsYW1zIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjA0LjAwI0NyYWJzIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjA1LjAwI0NvbmNoIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjA2LjAwI0NyYXlmaXNoIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjA3LjAwI0xvYnN0ZXIjNTAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTYuMDguMDAjTXVzc2VscyM1MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNi4wOS4wMCNPeXN0ZXJzIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjEwLjAwI1NocmltcCM1MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNi4xMS4wMCNGcmVzaCBzaGVsbGZpc2gjNTAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTYuMTIuMDAjRnJvemVuIHNoZWxsZmlzaCM1MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNi4xMy4wMCNTaGVsZiBzdGFibGUgc2hlbGxmaXNoIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE3LjAwLjAwI0FxdWF0aWMgaW52ZXJ0ZWJyYXRlcyM1MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNy4wMS4wMCNTcXVpZCM1MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNy4wMi4wMCNPY3RvcHVzIzUwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE3LjAzLjAwI0FuZW1vbmVzIzUwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE3LjA0LjAwI1NlYSBjdWN1bWJlcnMjNTAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTcuMDUuMDAjRnJlc2ggYXF1YXRpYyBpbnZlcnRlYnJhdGVzIzUwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE3LjA2LjAwI0Zyb3plbiBhcXVhdGljIGludmVydGVicmF0ZXMjNTAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTcuMDcuMDAjU2hlbGYgc3RhYmxlIGFxdWF0aWMgaW52ZXJ0ZWJyYXRlcyM1MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMi4xOC4wMC4wMCNBcXVhdGljIHBsYW50cyM1MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xOC4wMS4wMCNTZWF3ZWVkcyM1MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xOC4wMi4wMCNGcmVzaCBhcXVhdGljIHBsYW50cyM1MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xOC4wMy4wMCNGcm96ZW4gYXF1YXRpYyBwbGFudHMjNTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTguMDQuMDAjU2hlbGYgc3RhYmxlIGFxdWF0aWMgcGxhbnRzIzUwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzUwLjEzLjAwLjAwLjAwI0RhaXJ5IHByb2R1Y3RzIGFuZCBlZ2dzIzUwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjAwLjAwI0RhaXJ5IHByb2R1Y3RzIGFuZCBkYWlyeSBzdWJzdGl0dXRlcyM1MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wMS4wMCNDb2ZmZWUgY3JlYW1lciM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wMi4wMCNCdXR0ZXIjNTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTUuMDMuMDAjTWlsayM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wNC4wMCNTb2Z0IGNoZWVzZXMjNTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTUuMDUuMDAjWW9ndXJ0cyM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wNi4wMCNJY2UgY3JlYW1zIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjA3LjAwI1NvdXIgY3JlYW1zIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjA4LjAwI0hhcmQgY2hlZXNlcyM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wOS4wMCNCdXR0ZXJtaWxrIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjEwLjAwI0luZmFudCBmb3JtdWxhIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjExLjAwI0N1c3RhcmQjNTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTUuMTIuMDAjRXZhcG9yYXRlZCBtaWxrIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjEzLjAwI1N3ZWV0ZW5lZCBjb25kZW5zZWQgbWlsayM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4xNC4wMCNQb3dkZXJlZCBtaWxrIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjE1LjAwI0NyZWFtIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjE2LjAwI0xvbmcgbGlmZSBtaWxrIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjAwLjAwI0VnZ3MgYW5kIGVnZyBzdWJzdGl0dXRlcyM1MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNi4wMS4wMCNFZ2dzIzUwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjAyLjAwI0VnZyBzdWJzdGl0dXRlcyM1MC4xMy4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNi4wMy4wMCNNZXJpbmd1ZSBwb3dkZXJzIzUwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjA0LjAwI0VnZyB3aGl0ZXMjNTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTYuMDUuMDAjRWdnIHlvbGtzIzUwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjA2LjAwI0ZyZXNoIGVnZ3MjNTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTYuMDcuMDAjRWdnIHN1YnN0aXR1dGVzIzUwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjA4LjAwI0VnZyB3aGl0ZXMgb3IgeW9sa3MjNTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTYuMDkuMDAjUHJlcGFyZWQgZWdncyM1MC4xMy4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNy4wMC4wMCNNaWxrIGFuZCBidXR0ZXIgcHJvZHVjdHMjNTAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTcuMDEuMDAjRnJlc2ggbWlsayBhbmQgYnV0dGVyIHByb2R1Y3RzIzUwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE3LjAyLjAwI1NoZWxmIHN0YWJsZSBtaWxrIGFuZCBidXR0ZXIgcHJvZHVjdHMjNTAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTguMDAuMDAjQ2hlZXNlIzUwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEzLjE4LjAxLjAwI05hdHVyYWwgY2hlZXNlIzUwLjEzLjE4LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE4LjAyLjAwI1Byb2Nlc3NlZCBjaGVlc2UjNTAuMTMuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTguMDMuMDAjSW1pdGF0aW9uIGNoZWVzZSM1MC4xMy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNC4wMC4wMC4wMCNHcmFpbnMgYW5kIGNlcmVhbHMgYW5kIHRoZWlyIGZsb3VycyM1MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNS4wMC4wMCNHcmFpbnMgYW5kIGNlcmVhbHMjNTAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTUuMDEuMDAjTWlsbGV0IzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjAyLjAwI0hvcHMjNTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTUuMDMuMDAjQnVja3doZWF0IzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjA0LjAwI1J5ZSM1MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNS4wNS4wMCNDb3JuIGNlcmVhbHMjNTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTUuMDYuMDAjU29yZ2h1bSM1MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNS4wNy4wMCNPYXRzIzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjA4LjAwI1JpY2UjNTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTUuMDkuMDAjQmFybGV5IzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjEwLjAwI1doZWF0IzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjExLjAwI1Bhc3RhIG9yIG5vb2RsZSM1MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNS4xMi4wMCNCcmFuIzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjEzLjAwI3Nob3J0IGdyYWluIHJpY2UjNTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTYuMDAuMDAjRmxvdXJzIzUwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjAxLjAwI01pbGxldCBmbG91ciM1MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNi4wMi4wMCNPYXQgZmxvdXIjNTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTYuMDMuMDAjQmFybGV5IGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjA0LjAwI1JpY2UgZmxvdXIjNTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTYuMDUuMDAjQnVja3doZWF0IGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjA2LjAwI1J5ZSBmbG91ciM1MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNi4wNy4wMCNDb3JuIGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjA4LjAwI1doZWF0IGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjA5LjAwI1NlbGYgcmlzaW5nIGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjEwLjAwI0xvbmcgR3JhaW4gUmljZSM1MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNS4wMC4wMC4wMCNFZGlibGUgb2lscyBhbmQgZmF0cyM1MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4wMC4wMCNFZGlibGUgdmVnZXRhYmxlIGFuZCBwbGFudCBvaWxzIGFuZCBmYXRzIzUwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjAxLjAwI1NveWJlYW4gb2lsIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjAyLjAwI0Nvcm4gb2lsIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjAzLjAwI0Nhbm9sYSBvaWwjNTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTUuMDQuMDAjU2VzYW1lIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4wNS4wMCNQZWFudXQgb2lsIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjA2LjAwI09saXZlIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4wNy4wMCNQYWxtIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4wOC4wMCNTYWZmbG93ZXIgb2lsIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjA5LjAwI0Nhc3RvciBvaWwjNTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTUuMTAuMDAjU3VuZmxvd2VyIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4xMS4wMCNDb3R0b25zZWVkIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4xMi4wMCNDb2x6YSBvaWwjNTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTUuMTMuMDAjRWRpYmxlIHZlZ2V0YWJsZSBvciBwbGFudCBvaWxzIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjE0LjAwI0VkaWJsZSB2ZWdldGFibGUgb3IgcGxhbnQgZmF0cyM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNi4wMC4wMCNFZGlibGUgYW5pbWFsIG9pbHMgYW5kIGZhdHMjNTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTYuMDEuMDAjTGFyZCM1MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNi4wMi4wMCNUYWxsb3cjNTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTYuMDMuMDAjQ29kIGxpdmVyIG9pbCM1MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNi4wNC4wMCNFZGlibGUgYW5pbWFsIG9pbHMjNTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTYuMDUuMDAjRWRpYmxlIGFuaW1hbCBmYXRzIzUwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE3LjAwLjAwI09pbHMgYW5kIGZhdHMgYW5kIG90aGVyIzUwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE1LjE3LjAxLjAwI1Nob3J0ZW5pbmdzIzUwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE3LjAyLjAwI01hcmdhcmluZSM1MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNy4wMy4wMCNMaW5zZWVkIG9pbCM1MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNy4wNC4wMCNDb2NvYSBidXR0ZXIjNTAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTcuMDUuMDAjSG9wIE9pbCM1MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNy4wNi4wMCNNYWNhZGFtaWEgb2lsIzUwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE2LjAwLjAwLjAwI0Nob2NvbGF0ZSBhbmQgc3VnYXJzIGFuZCBzd2VldGVuZXJzIGFuZCBjb25mZWN0aW9uYXJ5IHByb2R1Y3RzIzUwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjAwLjAwI0Nob2NvbGF0ZSBhbmQgc3VnYXJzIGFuZCBzd2VldGVuaW5nIHByb2R1Y3RzIzUwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjAxLjAwI0Jyb3duIHN1Z2FyIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjAyLjAwI1doaXRlIHN1Z2FycyM1MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNS4wMy4wMCNTdWdhciBjYW5lIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjA0LjAwI0ZydWN0b3NlIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjA1LjAwI1BhbG0gc3VnYXIjNTAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTUuMDYuMDAjR2x1Y29zZSM1MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNS4wNy4wMCNCZWV0IHN1Z2FyIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjA4LjAwI1JhdyBzdWdhciM1MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNS4wOS4wMCNOYXR1cmFsIHN1Z2FycyBhbmQgc3dlZXRlbmluZyBwcm9kdWN0cyM1MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNS4xMC4wMCNBcnRpZmljaWFsIHN3ZWV0ZW5pbmcgYWdlbnRzIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjExLjAwI0Nob2NvbGF0ZSBhbmQgY2hvY29sYXRlIHN1YnN0aXR1dGUjNTAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTUuMTIuMDAjU3lydXBzIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE2LjAwLjAwI1N5cnVwcyBhbmQgb3RoZXIgc3dlZXRlbmVycyM1MC4xNi4wMC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNi4wMS4wMCNNb2xhc3NlcyM1MC4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNi4wMi4wMCNIb25leSM1MC4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNi4wMy4wMCNCbGFjayB0cmVhY2xlIzUwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE2LjA0LjAwI0Nvcm4gc3lydXAjNTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTYuMDUuMDAjQXNwZXJ0YW1lIzUwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE2LjA2LjAwI1NhY2NoYXJyaW4jNTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTYuMDcuMDAjTWFwbGUgc3lydXAjNTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTcuMDAuMDAjQ2hvY29sYXRlIGFuZCBjYXJvYiBhbmQgY2hvY29sYXRlIHN1YnN0aXR1dGVzIzUwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE2LjE3LjAxLjAwI0Nob2NvbGF0ZSM1MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNy4wMi4wMCNDYXJvYiM1MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNy4wMy4wMCNDb2NvYSM1MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4wMC4wMCNDb25mZWN0aW9uYXJ5IHByb2R1Y3RzIzUwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE2LjE4LjA0LjAwI0NoZXdpbmcgZ3VtcyM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4wNS4wMCNDYW5keSM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4wNi4wMCNMaWNvcmljZSM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4wNy4wMCNqZWxsaWVkIGNvbmZlY3Rpb25hcnkjNTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTguMDguMDAjRnVkZ2UjNTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTguMDkuMDAjTWVkaWNhdGVkIGNvbmZlY3Rpb25lcnkgb3IgbG96ZW5nZXMjNTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTguMTAuMDAjU3VnYXIgZnJlZSBjb25mZWN0aW9uYXJ5IzUwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE4LjExLjAwI01hcnNobWFsbG93IzUwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE4LjEyLjAwI05vdWdhdCM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4xMy4wMCNDaG9jb2xhdGUgb3IgY2hvY29sYXRlIHN1YnN0aXR1dGUgY2FuZHkjNTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTguMTQuMDAjU3VnYXIgb3Igc3VnYXIgc3Vic3RpdHV0ZSBjYW5keSM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4xNS4wMCNDaGV3aW5nIGd1bSM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4wMC4wMC4wMCNTZWFzb25pbmdzIGFuZCBwcmVzZXJ2YXRpdmVzIzUwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjAwLjAwI0hlcmJzIGFuZCBzcGljZXMgYW5kIGV4dHJhY3RzIzUwLjE3LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjAxLjAwI1NhbHQjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMDMuMDAjTnV0bWVnIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjA0LjAwI0JheSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4wNS4wMCNBbmlzZSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4wNi4wMCNTYWZmcm9uIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjA3LjAwI0Jhc2lsIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjA4LjAwI0dpbmdlciM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4wOS4wMCNMYXZlbmRlciM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4xMC4wMCNNYWNlIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjExLjAwI1BhcHJpa2EjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMTIuMDAjQ2hpY29yeSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4xMy4wMCNHYXJsaWMjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMTQuMDAjQ3VtaW4jNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMTUuMDAjQ2xvdmVzIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjE2LjAwI0Npbm5hbW9uIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjE3LjAwI0NpbGFudHJvIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjE4LjAwI0FsbHNwaWNlIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjE5LjAwI01hcmpvcmFtIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjIwLjAwI1lhcnJvdyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yMS4wMCNUaHltZSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yMi4wMCNUYXJyYWdvbiM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yMy4wMCNTZXNhbWUjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMjQuMDAjU2FnZSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yNS4wMCNSb3NlbWFyeSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yNi4wMCNQYXJzbGV5IzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjI3LjAwI0NoYW1vbWlsZSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yOC4wMCNNaW50cyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yOS4wMCNDYXJhd2F5IzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjMwLjAwI0xlbW9uZ3Jhc3MjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMzEuMDAjTGVtb24gYmFsbSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4zMi4wMCNEaWxsIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjMzLjAwI0Zlbm5lbCM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4zNC4wMCNDdXJyeSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4zNS4wMCNDb21mcmV5IzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjM2LjAwI0NoaXZlcyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4zNy4wMCNDaGVydmlsIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjM4LjAwI09yZWdhbm8jNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMzkuMDAjUGVwcGVyY29ybnMjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDAuMDAjQ2FyZGFtb20jNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDEuMDAjQ29yaWFuZGVyIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjQyLjAwI0ZsYXZvcmluZyBleHRyYWN0cyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS40My4wMCNDaGlsaSBwb3dkZXIjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDQuMDAjUG9wcHkgc2VlZHMjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDUuMDAjTWl4ZWQgaGVyYnMjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDYuMDAjVmFuaWxsYSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS40Ny4wMCNTZWFzb25pbmcgbWl4IzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjQ4LjAwI0ZyZXNoIGhlcmJzIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjQ5LjAwI0RyaWVkIGhlcmJzIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjUwLjAwI1NwaWNlcyBvciBleHRyYWN0cyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNi4wMC4wMCNQcmVzZXJ2YXRpdmVzIGFuZCBhZGRpdGl2ZXMjNTAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTYuMDEuMDAjUGVjdGluIzUwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE2LjAyLjAwI0Zvb2QgY29sb3JpbmdzIzUwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE2LjAzLjAwI01vbm9zb2RpdW0gZ2x1dGFtYXRlIChNU0cpIzUwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE3LjAwLjAwI1ZpbmVnYXJzIGFuZCBjb29raW5nIHdpbmVzIzUwLjE3LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE3LjE3LjAxLjAwI0NpZGVyIHZpbmVhZ2FyIzUwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE3LjAyLjAwI0JhbHNhbWljIHZpbmVnYXIjNTAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTcuMDMuMDAjRGlzdGlsbGVkIHZpbmVnYXIjNTAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTcuMDQuMDAjUmljZSB2aW5lZ2FyIzUwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE3LjA1LjAwI1dpbmUgdmluZWdhciM1MC4xNy4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNy4wNi4wMCNJbmZ1c2VkIHZpbmVnYXIjNTAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTcuMDcuMDAjVmluZWdhcnMjNTAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTcuMDguMDAjQ29va2luZyB3aW5lcyM1MC4xNy4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4wMC4wMCNTYXVjZXMgYW5kIHNwcmVhZHMgYW5kIGNvbmRpbWVudHMjNTAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMDEuMDAjTXVzdGFyZHMjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMDIuMDAjQ2F0c3VwIG9yIGtldGNodXAgb3IgdG9tYXRvIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjAzLjAwI0JhcmJlY3VlIHNhdWNlcyM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4wNC4wMCNNYXJpbmFkZXMjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMDUuMDAjSG90IHNhdWNlcyM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4wNi4wMCNNYXlvbm5haXNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjA3LjAwI1NveSBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4wOC4wMCNTYWxhZCBkcmVzc2luZ3MjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMDkuMDAjV29yY2hlc3RlcnNoaXJlIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjEwLjAwI1NhbHNhIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjExLjAwI1JlbGlzaGVzIG9yIGNodXRuZXlzIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjEyLjAwI0NvbnNlcnZlIG9yIGphbSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4xMy4wMCNEaXAgb3IgY2hpbGxlZCBkaXBwaW5nIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjE0LjAwI1N3ZWV0IGFuZCBzb3VyIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjE1LjAwI1RhcnRhcmUgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMTYuMDAjTWludCBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4xNy4wMCNHcmF2eSBzYXVjZSBvciBwb3dkZXIjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMTguMDAjTm9vZGxlIG9yIHBhc3RhIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjE5LjAwI0Zvb2Qgc3ByZWFkcyBvciBwYXN0ZXMjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjAuMDAjVG9tYXRvIHBhc3RlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjIxLjAwI0JsYWNrIGJlYW4gc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjIuMDAjU2F0YXkgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjMuMDAjVGVyaXlha2kgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjQuMDAjU2VhZm9vZCBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4yNS4wMCNQZXN0byM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4yNi4wMCNTdGVhayBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4yNy4wMCNPeXN0ZXIgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjguMDAjUGx1bSBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4yOS4wMCNXaGl0ZSBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4zMC4wMCNEaXBwaW5nIHNhdWNlcyBvciBjb25kaW1lbnRzIG9yIHNwcmVhZHMgb3IgbWFyaW5hZGVzIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjMxLjAwI0Nvb2tpbmcgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMzIuMDAjU2FsYWQgZHJlc3Npbmcgb3IgZGlwcyM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4zMy4wMCNTYXZvcnkgc3ByZWFkIG9yIHBhdGUjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTkuMDAuMDAjUGlja2xlcyBhbmQgcmVsaXNoIGFuZCBvbGl2ZXMjNTAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTkuMDEuMDAjUGlja2xlcyM1MC4xNy4xOS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOS4wMi4wMCNSZWxpc2gjNTAuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTkuMDMuMDAjT2xpdmVzIzUwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE5LjA0LjAwI0NodXRuZXlzIzUwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE4LjAwLjAwLjAwI0JyZWFkIGFuZCBiYWtlcnkgcHJvZHVjdHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTUuMDAuMDAjTGVhdmVuaW5nIGFnZW50cyM1MC4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNS4wMS4wMCNZZWFzdCM1MC4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNS4wMi4wMCNCYWtpbmcgcG93ZGVyIzUwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE1LjAzLjAwI0Jha2luZyBzb2RhIzUwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE1LjA0LjAwI0Jha2VycyBhbW1vbmlhIzUwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE2LjAwLjAwI1RoaWNrZW5lcnMjNTAuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTYuMDEuMDAjR2VsYXRpbnMjNTAuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTYuMDIuMDAjRm9vZCBncmFkZSBzdGFyY2hlcyM1MC4xOC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNi4wMy4wMCNUYXBpb2NhIzUwLjE4LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE2LjA0LjAwI0Fycm93cm9vdCM1MC4xOC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNi4wNS4wMCNGb29kIGdyYWRlIGFnYXIjNTAuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTcuMDAuMDAjQmFraW5nIG1peGVzIGFuZCBzdXBwbGllcyM1MC4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wMS4wMCNGb29kIGdsYXplcyM1MC4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wMi4wMCNJY2luZ3MjNTAuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTcuMDMuMDAjQ2FrZSBkZWNvcmF0aW9ucyM1MC4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wNC4wMCNDYWtlIG9yIHB1ZGRpbmcgbWl4dHVyZXMjNTAuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTcuMDUuMDAjUGllIGZpbGxpbmdzIzUwLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE3LjA2LjAwI0Jha2luZyBtaXhlcyM1MC4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wNy4wMCNDb2F0aW5nIG1peCBvciBicmVhZGNydW1icyM1MC4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wOC4wMCNCYWtpbmcgbWl4ZXMjNTAuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTcuMDkuMDAjQmFraW5nIHN1cHBsaWVzIzUwLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE4LjAwLjAwI0Jha2VkIGdvb2RzIzUwLjE4LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE4LjE4LjAxLjAwI1Bhc3RyeSBzaGVsbHMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDIuMDAjQ3JhY2tlcnMgb3IgZHJ5IG9yIHNhdm91cnkgYmlzY3VpdHMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDMuMDAjQnJlYWQjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDQuMDAjUGFzdHJpZXMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDUuMDAjQ2FrZXMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDYuMDAjQ29va2llIG9yIHN3ZWV0IGJpc2N1aXQjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDcuMDAjQmlzY3VpdHMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDguMDAjVW5sZWF2ZW5lZCBicmVhZCM1MC4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOC4wOS4wMCNNdWZmaW5zIzUwLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE4LjEwLjAwI0RvbnV0cyM1MC4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOC4xMS4wMCNQaXp6YSBvciBwaXp6YSBiYXNlcyM1MC4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOC4xMi4wMCNDb3JuZXRzIG9yIGNvbmVzIG9yIHdhZmZsZXMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTkuMDAuMDAjQnJlYWQgYW5kIGJpc2N1aXRzIGFuZCBjb29raWVzIzUwLjE4LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE4LjE5LjAxLjAwI0ZyZXNoIGJyZWFkIzUwLjE4LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE5LjAyLjAwI0Zyb3plbiBicmVhZCM1MC4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOS4wMy4wMCNQbGFpbiBzYXZvcnkgYmlzY3VpdHMjNTAuMTguMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTkuMDQuMDAjRHJpZWQgYnJlYWRzIG9yIGJyZWFkIHNoZWxscyBvciBjcm91dG9ucyM1MC4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOS4wNS4wMCNTd2VldCBiaXNjdWl0cyBvciBjb29raWVzIzUwLjE4LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE4LjIwLjAwLjAwI0Nha2VzIGFuZCBwaWVzIGFuZCBwYXN0cmllcyM1MC4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOC4yMC4wMS4wMCNGcmVzaCBjYWtlcyBvciBwaWVzIG9yIHBhc3RyaWVzIzUwLjE4LjIwLjAwLjAwCi11bnNwc2M3IzUwLjE4LjIwLjAyLjAwI0Zyb3plbiBjYWtlcyBvciBwaWVzIG9yIHBhc3RyaWVzIzUwLjE4LjIwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjAwLjAwLjAwI1ByZXBhcmVkIGFuZCBwcmVzZXJ2ZWQgZm9vZHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTUuMDAuMDAjUHJlcGFyZWQgc291cHMgYW5kIHN0ZXdzIzUwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjAxLjAwI1N0ZXdzIzUwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjAyLjAwI1NvdXBzIzUwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjAzLjAwI1N0b2NrIG9yIHN0b2NrIGN1YmVzIzUwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjA0LjAwI1N0ZXcgb3IgY2Fzc2Vyb2xlIGJhc2UjNTAuMTkuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTUuMDUuMDAjRnJlc2ggcHJlcGFyZWQgc291cHMgb3Igc3Rld3MjNTAuMTkuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTUuMDYuMDAjRnJvemVuIHByZXBhcmVkIHNvdXBzIG9yIHN0ZXdzIzUwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjA3LjAwI1NoZWxmIHN0YWJsZSBwcmVwYXJlZCBzb3VwcyBvciBzdGV3cyM1MC4xOS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4wMC4wMCNGcm96ZW4gZm9vZHMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTYuMDEuMDAjRnJvemVuIGRlc3NlcnRzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE2LjAyLjAwI0Zyb3plbiBtZWF0cyM1MC4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4wMy4wMCNGcm96ZW4gZnJ1aXRzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE2LjA0LjAwI0Zyb3plbiB2ZWdldGFibGVzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE2LjA1LjAwI0Zyb3plbiBwcmVwYXJlZCBtZWFscyM1MC4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4wNi4wMCNGcm96ZW4gZmlzaCM1MC4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4wNy4wMCNGcm96ZW4gY3J1c3RhY2VhbnMjNTAuMTkuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTYuMDguMDAjRnJvemVuIG1vbGx1c2tzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE2LjA5LjAwI0Zyb3plbiBwcmVwYXJlZCBwYXN0cnkgdW5iYWtlZCM1MC4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4xMC4wMCNGcm96ZW4gc2F2b3VyaWVzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE3LjAwLjAwI0Nhbm5lZCBmb29kcyBhbmQgYm90dGxlZCBldGMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTcuMDEuMDAjQ2FubmVkIGZydWl0cyM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wMi4wMCNDYW5uZWQgdmVnZXRhYmxlcyM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wMy4wMCNDYW5uZWQgZmlzaCM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wNC4wMCNDYW5uZWQgbWVhdCM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wNS4wMCNDYW5uZWQgSW5mYW50IGZvb2RzIzUwLjE5LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE3LjA2LjAwI0ZydWl0IGphbXMjNTAuMTkuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTcuMDcuMDAjTWFybWFsYWRlIzUwLjE5LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE3LjA4LjAwI0Nhbm5lZCBwcmVwYXJlZCBtZWFscyM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wOS4wMCNDYW5uZWQgZGVzc2VydHMjNTAuMTkuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTguMDAuMDAjRHJpZWQgZm9vZHMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTguMDEuMDAjRHJpZWQgZmlzaCM1MC4xOS4xOC4wMC4wMAotdW5zcHNjNyM1MC4xOS4xOC4wMi4wMCNEcmllZCBtZWF0IzUwLjE5LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE4LjAzLjAwI0RyaWVkIHZlZ2V0YWJsZXMjNTAuMTkuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTguMDQuMDAjRHJpZWQgZnJ1aXRzIzUwLjE5LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE5LjAwLjAwI1NhbHRlZCBhbmQgc21va2VkIGZvb2RzIzUwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjE5LjAxLjAwI1NhbHRlZCBvciBzbW9rZWQgZmlzaCM1MC4xOS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4xOS4wMi4wMCNTYWx0ZWQgb3Igc21va2VkIG1lYXRzIzUwLjE5LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE5LjAzLjAwI1NhbHRlZCBvciBzbW9rZWQgc2hlbGxmaXNoIG9yIGNydXN0YWNlYW5zIG9yIHJvZSM1MC4xOS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4xOS4wNC4wMCNTYWx0ZWQgb3Igc21va2VkIGZydWl0cyM1MC4xOS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4xOS4wNS4wMCNTYWx0ZWQgb3Igc21va2VkIG51dHMjNTAuMTkuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjAuMDAuMDAjUGlja2xlZCBmb29kcyM1MC4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMC4wMS4wMCNQaWNrbGVkIGZpc2gjNTAuMTkuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjAuMDIuMDAjUGlja2xlZCBjcnVzdGFjZWFucyM1MC4xOS4yMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMC4wMy4wMCNQaWNrbGVkIG1lYXRzIzUwLjE5LjIwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjIwLjA0LjAwI1BpY2tsZWQgdmVnZXRhYmxlcyM1MC4xOS4yMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMC4wNS4wMCNQaWNrbGVkIGVnZ3MjNTAuMTkuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDAuMDAjU25hY2sgZm9vZHMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDEuMDAjUHJldHplbHMjNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDIuMDAjQ29ybiBjaGlwcyM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4wMy4wMCNQb3RhdG8gY2hpcHMjNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDQuMDAjUG9wY29ybiM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4wNS4wMCNGaXNoIGZpbmdlcnMjNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDYuMDAjRnJ1aXQgc25hY2tzIzUwLjE5LjIxLjAwLjAwCi11bnNwc2M3IzUwLjE5LjIxLjA3LjAwI090aGVyIGZsYXZvdXJlZCBzbmFjayBmb29kcyM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4wOC4wMCNGcnVpdCBvciBudXQgbWl4IzUwLjE5LjIxLjAwLjAwCi11bnNwc2M3IzUwLjE5LjIxLjA5LjAwI0NyaXNwcyBvciBjaGlwcyBvciBwcmV0emVscyBvciBtaXhlcyM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4xMC4wMCNOdXRzIG9yIGRyaWVkIGZydWl0cyM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4xMS4wMCNEcmllZCBvciBwcm9jZXNzZWQgbWVhdHMjNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMTIuMDAjUG9wcGVkIGNvcm4jNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjIuMDAuMDAjU3ByZWFkcyBhbmQgY29uc2VydmVzIzUwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjIyLjAxLjAwI1BlYW51dCBidXR0ZXIjNTAuMTkuMjIuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjIuMDIuMDAjWWVhc3Qgb3IgdmVnZXRhYmxlIGV4dHJhY3Qgc3ByZWFkcyM1MC4xOS4yMi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMi4wMy4wMCNKYW1zIG9yIGplbGxpZXMgb3IgcXVpbmNlcyM1MC4xOS4yMi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMy4wMC4wMCNEZXNlcnRzIGFuZCBkZXNlcnQgdG9wcGluZ3MjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjMuMDEuMDAjUHJlcGFyZWQgZGVzZXJ0cyM1MC4xOS4yMy4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMy4wMi4wMCNEZXNlcnQgdG9wcGluZ3MjNTAuMTkuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjMuMDMuMDAjRmxhdm9yZWQgaWNlcyBvciBpY2UgY3JlYW0gb3IgaWNlIGNyZWFtIGRlc2VydHMgb3IgZnJvemVuIHlvZ3VydHMjNTAuMTkuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjQuMDAuMDAjSmFtcyBhbmQgamVsbGllcyBhbmQgbnV0IGFuZCBzd2VldCBzcHJlYWRzIGFuZCBmcnVpdCBjb25zZXJ2ZXMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjQuMDEuMDAjSmFtcyBvciBqZWxsaWVzIG9yIGZydWl0IHByZXNlcnZlcyM1MC4xOS4yNC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNC4wMi4wMCNOdXQgb3IgbWl4ZWQgc3ByZWFkcyM1MC4xOS4yNC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNC4wMy4wMCNIb25leSM1MC4xOS4yNC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNS4wMC4wMCNTYW5kd2ljaGVzIGFuZCBmaWxsZWQgcm9sbHMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjUuMDEuMDAjRnJlc2ggc2FuZHdpY2hlcyBvciBmaWxsZWQgcm9sbHMjNTAuMTkuMjUuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjUuMDIuMDAjRnJvemVuIHNhbmR3aWNoZXMgb3IgZmlsbGVkIHJvbGxzIzUwLjE5LjI1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjI2LjAwLjAwI1ByZXBhcmVkIHBvdGF0b2VzIGFuZCByaWNlIGFuZCBwYXN0YSBhbmQgc3R1ZmZpbmcjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjYuMDEuMDAjRnJlc2ggcHJlcGFyZWQgcG90YXRvZXMgb3IgcmljZSBvciBwYXN0YSBvciBzdHVmZmluZyM1MC4xOS4yNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNi4wMi4wMCNGcm96ZW4gcHJlcGFyZWQgcG90YXRvZXMgb3IgcmljZSBvciBwYXN0YSBvciBzdHVmZmluZyM1MC4xOS4yNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNi4wMy4wMCNTaGVsZiBzdGFibGUgcHJlcGFyZWQgcG90YXRvZXMgb3IgcmljZSBvciBwYXN0YSBvciBzdHVmZmluZyM1MC4xOS4yNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNy4wMC4wMCNQYWNrYWdlZCBjb21iaW5hdGlvbiBtZWFscyM1MC4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNy4wMS4wMCNGcmVzaCBjb21iaW5hdGlvbiBtZWFscyM1MC4xOS4yNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNy4wMi4wMCNGcm96ZW4gY29tYmluYXRpb24gbWVhbHMjNTAuMTkuMjcuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjcuMDMuMDAjU2hlbGYgc3RhYmxlIGNvbWJpbmF0aW9uIG1lYWxzIzUwLjE5LjI3LjAwLjAwCi11bnNwc2M3IzUwLjE5LjI4LjAwLjAwI1Nhdm9yeSBwaWVzIGFuZCBxdWljaGVzIGFuZCBwYXN0aWVzIzUwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjI4LjAxLjAwI0ZyZXNoIHNhdm9yeSBwaWVzIG9yIHF1aWNoZXMgb3IgcGFzdGllcyM1MC4xOS4yOC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yOC4wMi4wMCNGcm96ZW4gc2F2b3J5IHBpZXMgb3IgcXVpY2hlcyBvciBwYXN0aWVzIzUwLjE5LjI4LjAwLjAwCi11bnNwc2M3IzUwLjE5LjI4LjAzLjAwI1NoZWxmIHN0YWJsZSBzYXZvcnkgcGllcyBvciBxdWljaGVzIG9yIHBhc3RpZXMjNTAuMTkuMjguMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjkuMDAuMDAjUGxhaW4gcGFzdGEgYW5kIG5vb2RsZXMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjkuMDEuMDAjRnJlc2ggcGxhaW4gcGFzdGEgb3Igbm9vZGxlcyM1MC4xOS4yOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yOS4wMi4wMCNTaGVsZiBzdGFibGUgcGxhaW4gcGFzdGEgb3Igbm9vZGxlcyM1MC4xOS4yOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4zMC4wMC4wMCNJbmZhbnQgZm9vZHMgYW5kIGJldmVyYWdlcyM1MC4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4zMC4wMS4wMCNJbmZhbnQgZm9vZHMjNTAuMTkuMzAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMzAuMDIuMDAjSW5mYW50IGJldmVyYWdlcyM1MC4xOS4zMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4wMC4wMC4wMCNCZXZlcmFnZXMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTUuMDAuMDAjV2F0ZXIjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTUuMDEuMDAjU3BhcmtsaW5nIHdhdGVyIzUwLjIwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE1LjAyLjAwI1NwcmluZyB3YXRlciM1MC4yMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNS4wMy4wMCNNaW5lcmFsIHdhdGVyIzUwLjIwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE1LjA0LjAwI0Rpc3RpbGxlZCBvciBwdXJpZmllZCB3YXRlciM1MC4yMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNi4wMC4wMCNKdWljZXMjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMDEuMDAjQmxlbmRlZCBqdWljZXMjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMDIuMDAjR3VhdmEganVpY2UjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMDMuMDAjUHJ1bmUganVpY2UjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMDQuMDAjVG9tYXRvIGp1aWNlIzUwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE2LjA1LjAwI0NyYW5iZXJyeSBqdWljZSM1MC4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNi4wNi4wMCNHcmFwZWZydWl0IGp1aWNlIzUwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE2LjA3LjAwI0dyYXBlIGp1aWNlIzUwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE2LjA4LjAwI1BpbmVhcHBsZSBqdWljZSM1MC4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNi4wOS4wMCNPcmFuZ2UganVpY2UjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMTAuMDAjQXBwbGUganVpY2UjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMTEuMDAjTGVtb24ganVpY2VzIG9yIGxlbW9uYWRlIzUwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE2LjEyLjAwI0luZmFudCBqdWljZSM1MC4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wMC4wMCNDb2ZmZWUgYW5kIHRlYSM1MC4yMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wMS4wMCNJbnN0YW50IGNvZmZlZSM1MC4yMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wMi4wMCNHcm91bmQgY29mZmVlIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjAzLjAwI1dob2xlIGJlYW4gY29mZmVlIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjA0LjAwI0dyZWVuIGNvZmZlZSM1MC4yMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wNS4wMCNDb2ZmZWUgc3Vic3RpdHV0ZXMjNTAuMjAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTcuMDYuMDAjQ29mZmVlIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjA3LjAwI0NvZmZlZSBzdWJzdGl0dXRlcyM1MC4yMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wOC4wMCNDb2ZmZWUgZHJpbmtzIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjA5LjAwI0luc3RhbnQgY29mZmVlIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjEwLjAwI0xlYWYgdGVhIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjExLjAwI0luc3RhbnQgdGVhIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjEyLjAwI1RlYSBkcmlua3MjNTAuMjAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTcuMTMuMDAjVGVhIGJhZ3MjNTAuMjAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTguMDAuMDAjVGVhIzUwLjIwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjIwLjE4LjAxLjAwI0dyZWVuIHRlYSM1MC4yMC4xOC4wMC4wMAotdW5zcHNjNyM1MC4yMC4xOC4wMi4wMCNCbGFjayB0ZWEjNTAuMjAuMTguMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTguMDMuMDAjSGVyYmFsIHRlYSM1MC4yMC4xOC4wMC4wMAotdW5zcHNjNyM1MC4yMC4xOC4wNC4wMCNQb3dkZXJlZCB0ZWEjNTAuMjAuMTguMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTguMDUuMDAjVGVhIGJhZ3MjNTAuMjAuMTguMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTkuMDAuMDAjU29mdCBkcmlua3MjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTkuMDEuMDAjTm9uIGNhcmJvbmF0ZWQgc29mdCBkcmlua3MjNTAuMjAuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTkuMDIuMDAjQ2FyYm9uYXRlZCBzb2Z0IGRyaW5rcyM1MC4yMC4xOS4wMC4wMAotdW5zcHNjNyM1MC4yMC4xOS4wMy4wMCNDb3JkaWFscyBvciBjb2xvdXJpbmdzIzUwLjIwLjE5LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE5LjA0LjAwI1Nwb3J0cyBvciBoaWdoIGVuZXJneSBkcmlua3MjNTAuMjAuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTkuMDUuMDAjU295IGJldmVyYWdlIzUwLjIwLjE5LjAwLjAwCi11bnNwc2M3IzUwLjIwLjIwLjAwLjAwI0JlZXIgYW5kIHdpbmUjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDEuMDAjQ2hhbXBhZ25lIzUwLjIwLjIwLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIwLjAyLjAwI0JlZXIjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDMuMDAjV2luZSM1MC4yMC4yMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMC4wNC4wMCNTcGFya2xpbmcgd2luZXMjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDUuMDAjRm9ydGlmaWVkIHdpbmUjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDYuMDAjUG9ydCM1MC4yMC4yMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMC4wNy4wMCNTaGVycnkjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDguMDAjV2luZSBjb29sZXIgYmV2ZXJhZ2UjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDAuMDAjU3Bpcml0cyBhbmQgbGlxdW9ycyM1MC4yMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMS4wMS4wMCNCcmFuZHkjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDIuMDAjQ29nbmFjIG9yIGFybWFnbmFjIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjAzLjAwI1doaXNrZXkjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDQuMDAjVm9ka2EjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDUuMDAjVGVxdWlsYSM1MC4yMC4yMS4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMS4wNi4wMCNHaW4jNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDcuMDAjTGlxdWV1cnMjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDguMDAjUnVtIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjA5LjAwI0JvdXJib24jNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMTAuMDAjU2NvdGNoIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjExLjAwI0NpZGVyIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjEyLjAwI1NjaG5hcHBzIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjEzLjAwI091em8jNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMTQuMDAjQXBlcml0aWZzIG9yIGJpdHRlcnMjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMTUuMDAjVmVybW91dGgjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMTYuMDAjU2FtYnVjYSM1MC4yMC4yMS4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMS4xNy4wMCNTYWtlIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjE4LjAwI011c2NhdCBvciBtYWRlaXJhIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIyLjAwLjAwI0FsY29ob2xpYyBiZXZlcmFnZXMjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjIuMDEuMDAjQmVlciM1MC4yMC4yMi4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMi4wMi4wMCNDaWRlciBvciBwZXJyeSM1MC4yMC4yMi4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMi4wMy4wMCNXaW5lIzUwLjIwLjIyLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIyLjA0LjAwI0ZvcnRpZmllZCB3aW5lIzUwLjIwLjIyLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIyLjA1LjAwI1NwYXJrbGluZyB3aW5lIzUwLjIwLjIyLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIyLjA2LjAwI1NwaXJpdHMgb3IgbGlxdW9ycyM1MC4yMC4yMi4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMi4wNy4wMCNBbGNvaG9sIGNvY2t0YWlscyBvciBkcmluayBtaXhlcyM1MC4yMC4yMi4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wMC4wMCNOb24gYWxjb2hvbGljIGJldmVyYWdlcyM1MC4yMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wMS4wMCNXYXRlciM1MC4yMC4yMy4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wMi4wMCNJY2UjNTAuMjAuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjMuMDMuMDAjRnJvemVuIGp1aWNlcyM1MC4yMC4yMy4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wNC4wMCNTaGVsZiBzdGFibGUganVpY2UjNTAuMjAuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjMuMDUuMDAjRnJlc2gganVpY2UjNTAuMjAuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjMuMDYuMDAjU29mdCBkcmlua3MjNTAuMjAuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjMuMDcuMDAjQ2hvY29sYXRlIG9yIG1hbHQgb3Igb3RoZXIgaG90IGJldmVyYWdlcyM1MC4yMC4yMy4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wOC4wMCNBbGNvaG9sIGZyZWUgY29ja3RhaWxzIG9yIGRyaW5rIG1peGVzIzUwLjIwLjIzLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIzLjA5LjAwI1Nwb3J0IGRyaW5rIG1peGVzIzUwLjIwLjIzLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIzLjEwLjAwI1NwcmluZyB3YXRlciM1MC4yMC4yMy4wMC4wMAotdW5zcHNjNyM1MC4yMS4wMC4wMC4wMCNUb2JhY2NvIGFuZCBzbW9raW5nIHByb2R1Y3RzIGFuZCBzdWJzdGl0dXRlcyM1MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNS4wMC4wMCNUb2JhY2NvIGFuZCBzdWJzdGl0dXRlcyM1MC4yMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNS4wMS4wMCNUb2JhY2NvIGxlYWYjNTAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTUuMDIuMDAjQ2lnYXJldHRlcyBvciBjaWdhcnMjNTAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTUuMDMuMDAjUGlwZSB0b2JhY2NvIG9yIGxlYWYgdG9iYWNjbyM1MC4yMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNS4wNC4wMCNDaGV3aW5nIHRvYmFjY28jNTAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTUuMDUuMDAjSGVyYmFsIGNpZ2FyZXR0ZXMjNTAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDAuMDAjVG9iYWNjbyBwcm9kdWN0IGFjY2Vzc29yaWVzIGFuZCBzdXBwbGllcyM1MC4yMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNi4wMS4wMCNQaXBlIHRvYmFjY28jNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDIuMDAjQ2lnYXJzIzUwLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIxLjE2LjAzLjAwI0NpZ2FyZXR0ZXMjNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDQuMDAjU21va2VsZXNzIHRvYmFjY28jNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDUuMDAjUmVhZHkgcnViYmVkIHRvYmFjY28jNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDYuMDAjQ2lnYXJldHRlIHBhcGVycyM1MC4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNi4wNy4wMCNDaWdhcmV0dGUgcGFwZXJzIG9yIGZpbHRlcnMjNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDguMDAjQ2lnYXJldHRlIGxpZ2h0ZXJzIG9yIGZsaW50cyM1MC4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNi4wOS4wMCNTbW9raW5nIHBpcGVzIzUwLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIyLjAwLjAwLjAwI0NlcmVhbCBhbmQgcHVsc2UgcHJvZHVjdHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjIuMTAuMDAuMDAjUHVsc2VzIzUwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzUwLjIyLjEwLjAxLjAwI1B1bHNlIGdyYWlucyM1MC4yMi4xMC4wMC4wMAotdW5zcHNjNyM1MC4yMi4xMC4wMi4wMCNQdWxzZSBmbG91ciM1MC4yMi4xMC4wMC4wMAotdW5zcHNjNyM1MC4yMi4xMS4wMC4wMCNDZXJlYWxzIzUwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzUwLjIyLjExLjAxLjAwI0NlcmVhbCBncmFpbnMjNTAuMjIuMTEuMDAuMDAKLXVuc3BzYzcjNTAuMjIuMTEuMDIuMDAjQ2VyZWFsIGZsb3VyIzUwLjIyLjExLjAwLjAwCi11bnNwc2M3IzUwLjIyLjEyLjAwLjAwI1Byb2Nlc3NlZCBjZXJlYWxzIzUwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzUwLjIyLjEyLjAxLjAwI1JlYWR5IHRvIGVhdCBvciBob3QgY2VyZWFscyM1MC4yMi4xMi4wMC4wMAotdW5zcHNjNyM1MC4yMi4xMi4wMi4wMCNIZWFsdGggb3IgYnJlYWtmYXN0IGJhcnMjNTAuMjIuMTIuMDAuMDAKLXVuc3BzYzcjNTEuMDAuMDAuMDAuMDAjRHJ1Z3MgYW5kIFBoYXJtYWNldXRpY2FsIFByb2R1Y3RzIzUxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjAwLjAwLjAwI0FudGkgaW5mZWN0aXZlIGRydWdzIzUxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjE1LjAwLjAwI0FudGliaW90aWNzIzUxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjE1LjAxLjAwI0FtaW5vZ2x5Y29zaWRlcyM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wMi4wMCNDZXBoYWxvc3BvcmlucyM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wMy4wMCNDaGxvcmFtcGhlbmljb2wjNTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTUuMDQuMDAjQ2xpbmRhbXljaW4gb3IgbGluY29teWNpbiM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wNS4wMCNGbHVvcm9xdWlub2xvbmVzIzUxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE1LjA2LjAwI01hY3JvbGlkZSM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wNy4wMCNQZW5pY2lsbGlucyM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wOC4wMCNBbnRpYmlvdGljIHN1bGZvbmFtaWRlcyM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wOS4wMCNUZXRyYWN5Y2xpbmVzIzUxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE2LjAwLjAwI0FtZWJpY2lkZXMgYW5kIFRyaWNob21vbmFjaWRlcyBhbmQgQW50aXByb3Rvem9hbHMjNTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTYuMDEuMDAjQXRvdmFxdW9uZSM1MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNi4wMi4wMCNFZmxvcm5pdGhpbmUgaHlkcm9jaGxvcmlkZSM1MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNi4wMy4wMCNNZXRyb25pZGF6b2xlIzUxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE3LjAwLjAwI0FudGhlbG1pbnRpY3MjNTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTcuMDEuMDAjQWxiZW5kYWRvbGUjNTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTcuMDIuMDAjTWViZW5kYXpvbGUjNTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTcuMDMuMDAjT3hhbW5pcXVpbmUjNTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTcuMDQuMDAjUGlwZXJhemluZSBjaXRyYXRlIzUxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE3LjA1LjAwI1ByYXppcXVhbnRlbCM1MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNy4wNi4wMCNQeXJhbnRlbCBwYW1vYXRlIzUxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE3LjA3LjAwI1RoaWFiZW5kYXpvbGUjNTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMDAuMDAjQW50aWZ1bmdhbCBkcnVncyM1MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wMS4wMCNBbXBob3RlcmljaW4gYiM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wMi4wMCNCdXRlbmFmaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMDMuMDAjQnV0b2NvbmF6b2xlIG5pdHJhdGUjNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMDQuMDAjQ2ljbG9waXJveCBvbGFtaW5lIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjA1LjAwI0Nsb3RyaW1hem9sZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wNi4wMCNFY29uYXpvbGUgbml0cmF0ZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wNy4wMCNGbHVjb25hem9sZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wOC4wMCNGbHVjeXRvc2luZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wOS4wMCNHcmlzZW9mdWx2aW4jNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMTAuMDAjSXRyYWNvbmF6b2xlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjExLjAwI0tldG9jb25hem9sZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4xMi4wMCNNaWNvbmF6b2xlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjEzLjAwI05hZnRpZmluZSBoeWRyb2NobG9yaWRlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjE0LjAwI05hdGFteWNpbiM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4xNS4wMCNOeXN0YXRpbiM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4xNi4wMCNPeGljb25hem9sZSBuaXRyYXRlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjE3LjAwI1N1bGNvbmF6b2xlIG5pdHJhdGUjNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMTguMDAjVGVyYmluYWZpbmUgaHlkcm9jaGxvcmlkZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4xOS4wMCNUZXJjb25hem9sZSBuaXRyYXRlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjIwLjAwI1Rpb2NvbmF6b2xlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjIxLjAwI1RvbG5hZnRhdGUjNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTkuMDAuMDAjQW50aW1hbGFyaWFsIGRydWdzIzUxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjE5LjAxLjAwI0FtaW5vcXVpbm9saW5lcyM1MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOS4wMi4wMCNNZWZsb3F1aW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTkuMDMuMDAjUHJpbWFxdWluZSBwaG9zcGhhdGUjNTEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTkuMDQuMDAjUXVpbmluZSBzdWxmYXRlIzUxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE5LjA1LjAwI0NobG9yb3F1aW5lIzUxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE5LjA2LjAwI1Byb2d1YW5pbCM1MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOS4wNy4wMCNQeXJpbWV0aGFtaW5lIzUxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEwLjIwLjAwLjAwI0FudGl0dWJlcmN1bGFyIGRydWdzIzUxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIwLjAxLjAwI0N5Y2xvc2VyaW5lIzUxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIwLjAyLjAwI0V0aGFtYnV0b2wgaHlkcm9jaGxvcmlkZSM1MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMC4wMy4wMCNJc29uaWF6aWQjNTEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjAuMDQuMDAjUmlmdWJ1dGluIzUxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIwLjA1LjAwI1JpZmFtcGluIzUxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIxLjAwLjAwI0xlcHJvc3RhdGljcyM1MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMS4wMS4wMCNDbG9mYXppbWluZSM1MS4xMC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMS4wMi4wMCNEYXBzb25lIzUxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjAwLjAwI1VyaW5hcnkgYW50aSBpbmZlY3RpdmVzIGFuZCBhbmFsZ2VzaWNzIzUxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjAxLjAwI0Npbm94YWNpbiM1MS4xMC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMi4wMi4wMCNGbGF2b3hhdGUgaHlkcm9jaGxvcmlkZSM1MS4xMC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMi4wMy4wMCNNZXRoZW5hbWluZSBoaXBwdXJhdGUjNTEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjIuMDQuMDAjTWV0aGVuYW1pbmUgbWFuZGVsYXRlIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjA1LjAwI05hbGlkaXhpYyBhY2lkIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjA2LjAwI05pdHJvZnVyYW50b2luIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjA3LjAwI094eWJ1dHluaW4gY2hsb3JpZGUjNTEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjIuMDguMDAjUGVudG9zYW4gcG9seXN1bGZhdGUgc29kaXVtIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjA5LjAwI1BoZW5hem9weXJpZGluZSBoeWRyb2NobG9yaWRlIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjEwLjAwI0FudGlzZXB0aWMgc29sdXRpb25zIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjAwLjAwI0FudGl2aXJhbCBkcnVncyM1MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4wMS4wMCNBY3ljbG92aXIjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMDIuMDAjQW1hbnRhZGluZSBoeWRyb2NobG9yaWRlIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjAzLjAwI0N5ZG9mb3ZpciM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4wNC4wMCNEaWRhbm9zaW5lIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjA1LjAwI0ZhbWNpY2xvdmlyIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjA2LjAwI0Zvc2Nhcm5ldCBzb2RpdW0jNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMDcuMDAjR2FuY2ljbG92aXIgc29kaXVtIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjA4LjAwI0lkb3h1cmlkaW5lIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjA5LjAwI0luZGluYXZpciBzdWxmYXRlIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjEwLjAwI0xhbWl2dWRpbmUjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMTEuMDAjTmV2aXJhcGluZSM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4xMi4wMCNSaWJhdmlyaW4jNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMTMuMDAjUmltYW50YWRpbmUgaHlkcm9jaGxvcmlkZSM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4xNC4wMCNSaXRvbmF2aXIjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMTUuMDAjU2FxdWluYXZpciBtZXN5bGF0ZSM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4xNi4wMCNTdGF2aWRpbmUjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMTcuMDAjVHJpZmx1cmFkaW5lIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjE4LjAwI1ZhbGFjeWNsb3ZpciBoeWRyb2NobG9yaWRlIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjE5LjAwI1ZpZGFyYWJpbmUjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMjAuMDAjWmFsY2l0YWJpbmUjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMjEuMDAjWmlkb3Z1ZGluZSM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMS4wMC4wMC4wMCNBbnRpbmVvcGxhc3RpYyBhZ2VudHMjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMDAuMDAjQWxreWxhdGluZyBhZ2VudHMjNTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMDEuMDAjQW1pZm9zdGluZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wMi4wMCNCdXN1bGZhbiM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wMy4wMCNDYXJib3BsYXRpbiM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wNC4wMCNDYXJtdXN0aW5lIzUxLjExLjE1LjAwLjAwCi11bnNwc2M3IzUxLjExLjE1LjA1LjAwI0NobG9yYW1idWNpbCM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wNi4wMCNDaXNwbGF0aW4jNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMDcuMDAjQ3ljbG9waG9zcGhhbWlkZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wOC4wMCNEYWNhcmJhemluZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wOS4wMCNJZm9zZmFtaWRlIzUxLjExLjE1LjAwLjAwCi11bnNwc2M3IzUxLjExLjE1LjEwLjAwI0xvbXVzdGluZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4xMS4wMCNNZWNobG9yZXRoYW1pbmUgaHlkcm9jaGxvcmlkZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4xMi4wMCNNZWxwaGFsYW4jNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMTMuMDAjTWVzbmEjNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMTQuMDAjUGlwb2Jyb21hbiM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4xNS4wMCNTdHJlcHRvem9jaW4jNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMTYuMDAjVGhpb3RlcGEjNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMTcuMDAjVXJhY2lsIG11c3RhcmQjNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMDAuMDAjQW50aW1ldGFib2xpdGVzIzUxLjExLjAwLjAwLjAwCi11bnNwc2M3IzUxLjExLjE2LjAxLjAwI0NsYWRyaWJpbmUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMDIuMDAjQ3l0YXJhYmluZSM1MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNi4wMy4wMCNGbG94dXJpZGluZSM1MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNi4wNC4wMCNGbHVkYXJhYmluZSBwaG9zcGhhdGUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMDUuMDAjRmx1b3JvdXJhY2lsIzUxLjExLjE2LjAwLjAwCi11bnNwc2M3IzUxLjExLjE2LjA2LjAwI0h5ZHJveHl1cmVhIzUxLjExLjE2LjAwLjAwCi11bnNwc2M3IzUxLjExLjE2LjA3LjAwI0lkYXJ1YmljaW4gaHlkcm9jaGxvcmlkZSM1MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNi4wOC4wMCNMZXZhbWlzb2xlIGh5ZHJvY2hsb3JpZGUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMDkuMDAjTWVyY2FwdG9wdXJpbmUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMTAuMDAjTWV0aG90cmV4YXRlIzUxLjExLjE2LjAwLjAwCi11bnNwc2M3IzUxLjExLjE2LjExLjAwI1Rlbmlwb3NpZGUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMTIuMDAjVGhpb2d1YW5pbmUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTcuMDAuMDAjQW50aW5lb3BsYXN0aWMgYW50aWJpb3RpY3MjNTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTcuMDEuMDAjQmxlb215Y2luIHN1bGZhdGUjNTEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTcuMDIuMDAjRGFjdGlub215Y2luIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjAzLjAwI0RhdW5vcnViaWNpbnMjNTEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTcuMDQuMDAjTWl0b215Y2luIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjA1LjAwI01pdG90YW5lIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjA2LjAwI01pdG94YW50cm9uZSBoeWRyb2NobG9yaWRlIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjA3LjAwI1BlbnRvc3RhdGluIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjA4LjAwI1BsaWNhbXljaW4jNTEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMDAuMDAjSG9ybW9uZXMgYW5kIGFudGlob3Jtb25lcyM1MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4wMS4wMCNBbmFzdHJvem9sZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4wMi4wMCNCaWNhbHV0YW1pZGUjNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMDMuMDAjRXN0cmFtdXN0aW5lIHBob3NwaGF0ZSBzb2RpdW0jNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMDQuMDAjRmx1dGFtaWRlIzUxLjExLjE4LjAwLjAwCi11bnNwc2M3IzUxLjExLjE4LjA1LjAwI0dvc2VyZWxpbiBhY2V0YXRlIzUxLjExLjE4LjAwLjAwCi11bnNwc2M3IzUxLjExLjE4LjA2LjAwI0lyaW5vdGVjYW4gaHlkcm9jaGxvcmlkZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4wNy4wMCNMZXVwcm9saWRlIGFjZXRhdGUjNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMDguMDAjTmlsdXRhbWlkZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4wOS4wMCNUYW1veGlmZW4jNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMTAuMDAjVGVzdG9sYWN0b25lIzUxLjExLjE4LjAwLjAwCi11bnNwc2M3IzUxLjExLjE4LjExLjAwI1RvcG90ZWNhbiBoeWRyb2NobG9yaWRlIzUxLjExLjE4LjAwLjAwCi11bnNwc2M3IzUxLjExLjE4LjEyLjAwI1ZpbmJsYXN0aW5lIHN1bGZhdGUjNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMTMuMDAjVmluY3Jpc3RpbmUgc3VsZmF0ZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4xNC4wMCNWaW5vcmVsYmluZSB0YXJ0cmF0ZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOS4wMC4wMCNOYXR1cmFsIGFudGluZW9wbGFzdGljIHByb2R1Y3RzIzUxLjExLjAwLjAwLjAwCi11bnNwc2M3IzUxLjExLjE5LjAxLjAwI0FzcGFyYWdpbmFzZSM1MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOS4wMi4wMCNEb2NldGF4ZWwjNTEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTkuMDMuMDAjSW50ZXJmZXJvbiM1MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOS4wNC4wMCNQYWNsaXRheGVsIzUxLjExLjE5LjAwLjAwCi11bnNwc2M3IzUxLjExLjE5LjA1LjAwI1BvcmZpbWVyIHNvZGl1bSM1MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMi4wMC4wMC4wMCNDYXJkaW92YXNjdWxhciBkcnVncyM1MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNS4wMC4wMCNBbnRpYXJyeXRobWljIGFnZW50cyM1MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNS4wMS4wMCNBZGVub3NpbmUjNTEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTUuMDIuMDAjRGlnb3hpbiM1MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNS4wMy4wMCNRdWluaWRpbmUgZ2x1Y29uYXRlIzUxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE2LjAwLjAwI0FudGlhbmdpbmFsIGRydWdzIzUxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEyLjE2LjAxLjAwI0FteWwgbml0cmF0ZSM1MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNi4wMi4wMCNJc29zb3JiaWRlIGRpbml0cmF0ZSM1MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNi4wMy4wMCNOaXRyb2dseWNlcmluIzUxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE2LjA0LjAwI1BlbnRhZXJ5dGhyaXRvbCB0ZXRyYW5pdHJhdGUjNTEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTcuMDAuMDAjQW50aWh5cGVydGVuc2l2ZSBkcnVncyM1MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4wMS4wMCNEaWF6b3hpZGUjNTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTcuMDIuMDAjVGVyYXpvc2luIzUxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE3LjAzLjAwI0NhcHRvcHJpbCM1MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4wNC4wMCNMaXNpbm9wcmlsIzUxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE3LjA1LjAwI0ZlbG9kaXBpbmUjNTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTcuMDYuMDAjSXNyYWRpcGluZSM1MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4wNy4wMCNWZXJhcGFtaWwjNTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTcuMDguMDAjTWV0aHlsZG9wYSM1MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4wOS4wMCNDYXJ2ZWRpbG9sIzUxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE3LjEwLjAwI0xvc2FydGFuIHBvdGFzc2l1bSM1MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4xMS4wMCNNaW5veGlkaWwjNTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTguMDAuMDAjQW50aWh5cGVybGlwaWRlbWljIGFuZCBoeXBvY2hvbGVzdGVyb2xlbWljIGFnZW50cyM1MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xOC4wMS4wMCNGbHV2YXN0YXRpbiBzb2RpdW0jNTEuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTguMDIuMDAjTG92YXN0YXRpbiM1MS4xMi4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xOC4wMy4wMCNTaW12YXN0YXRpbiM1MS4xMi4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xOC4wNC4wMCNDbG9maWJyYXRlIzUxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE4LjA1LjAwI0dlbWZpYnJvemlsIzUxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE5LjAwLjAwI0RydWdzIHVzZWQgZm9yIGNvbmdlc3RpdmUgaGVhcnQgZmFpbHVyZSM1MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xOS4wMS4wMCNBbXJpbm9uZSBsYWN0YXRlIzUxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE5LjAyLjAwI01pbHJpbm9uZSBsYWN0YXRlIzUxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE5LjAzLjAwI0RpZ2l0b3hpbiM1MS4xMi4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMy4wMC4wMC4wMCNIZW1hdG9saWMgZHJ1Z3MjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTMuMTUuMDAuMDAjQW50aWFuZW1pYyBkcnVncyM1MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNS4wMS4wMCNGZXJyb3VzIGZ1bWFyYXRlIzUxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE1LjAyLjAwI0ZlcnJvdXMgZ2x1Y29uYXRlIzUxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE1LjAzLjAwI0ZlcnJvdXMgc3VsZmF0ZSM1MS4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNi4wMC4wMCNBbnRpY29hZ3VsYW50cyM1MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNi4wMS4wMCNBcHJvdGluaW4jNTEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTMuMTYuMDIuMDAjSGVwYXJpbiBjYWxjaXVtIzUxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE2LjAzLjAwI0hlcGFyaW4gc29kaXVtIzUxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE2LjA0LjAwI1dhcmZhcmluIHNvZGl1bSM1MS4xMy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNy4wMC4wMCNUaHJvbWJvbHl0aWMgZHJ1Z3MgYW5kIHBsYXRlbGV0IGFnZ3JlZ2F0aW9uIGluaGliaXRvcnMjNTEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTMuMTcuMDEuMDAjQWJjaXhpbWFiIzUxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE3LjAyLjAwI0FsdGVwbGFzZSM1MS4xMy4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNy4wMy4wMCNTdHJlcHRva2luYXNlIzUxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE3LjA0LjAwI1Vyb2tpbmFzZSM1MS4xMy4xNy4wMC4wMAotdW5zcHNjNyM1MS4xNC4wMC4wMC4wMCNDZW50cmFsIG5lcnZvdXMgc3lzdGVtIGRydWdzIzUxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjAwLjAwI0FudGljb252dWxzYW50cyM1MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4xNS4wMS4wMCNBY2V0YXpvbGFtaWRlIzUxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjAyLjAwI0Nsb25hemVwYW0jNTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTUuMDMuMDAjRmVsYmFtYXRlIzUxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjA0LjAwI0xhbW90cmlnaW5lIzUxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjA1LjAwI1BoZW5vYmFyYml0YWwjNTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTUuMDYuMDAjUGhlbm9iYXJiaXRhbCBzb2RpdW0jNTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTUuMDcuMDAjUGhlbnl0b2luIzUxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjA4LjAwI0V0aG9zdXhpbWlkZSM1MS4xNC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNC4xNi4wMC4wMCNBbnRpZGVwcmVzc2FudHMjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTYuMDEuMDAjQW1pdHJpcHR5bGluZSBoeWRyb2NobG9yaWRlIzUxLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE2LjAyLjAwI0RveGVwaW4gaHlkcm9jaGxvcmlkZSM1MS4xNC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNC4xNi4wMy4wMCNJbWlwcmFtaW5lIHBhbW9hdGUjNTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTYuMDQuMDAjTWlydGF6YXBpbmUjNTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTYuMDUuMDAjUGFyb3hldGluZSBoeWRyb2NobG9yaWRlIzUxLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE2LjA2LjAwI1RyYXpvZG9uZSBoeWRyb2NobG9yaWRlIzUxLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE3LjAwLjAwI0FudGlwc3ljaG90aWMgYWdlbnRzIzUxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjE3LjAxLjAwI1BoZW5vdGhpYXppbmVzIzUxLjE0LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE3LjAyLjAwI0hhbG9wZXJpZG9sIzUxLjE0LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE3LjAzLjAwI09sYW56YXBpbmUjNTEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTcuMDQuMDAjUmlzcGVyaWRvbmUjNTEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTguMDAuMDAjSHlwbm90aWNzIzUxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjE4LjAxLjAwI1BlbnRvYmFyYml0YWwjNTEuMTQuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTguMDIuMDAjU2Vjb2JhcmJpdGFsIHNvZGl1bSM1MS4xNC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOC4wMy4wMCNDaGxvcmFsIGh5ZHJhdGUjNTEuMTQuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTguMDQuMDAjRXN0YXpvbGFtIzUxLjE0LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE4LjA1LjAwI1RyaWF6b2xhbSM1MS4xNC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOS4wMC4wMCNUcmFucXVpbGl6ZXJzIGFuZCBhbnRpbWFuaWMgZHJ1Z3MjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTkuMDEuMDAjQWxwcmF6b2xhbSM1MS4xNC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOS4wMi4wMCNEaWF6ZXBhbSM1MS4xNC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOS4wMy4wMCNMaXRoaXVtIGNhcmJvbmF0ZSM1MS4xNC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOS4wNC4wMCNMaXRoaXVtIGNpdHJhdGUjNTEuMTQuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTkuMDUuMDAjTWlkYXpvbGFtIGh5ZHJvY2hsb3JpZGUjNTEuMTQuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTkuMDYuMDAjVGVtYXplcGFtIzUxLjE0LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE0LjIwLjAwLjAwI05vbiBuYXJjb3RpYyBhbmFsZ2VzaWNzIGFuZCBhbnRpcHlyZXRpY3MjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjAuMDEuMDAjQWNldGFtaW5vcGhlbiM1MS4xNC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMC4wMi4wMCNBY2V0eWxzYWxpY3lsaWMgYWNpZCM1MS4xNC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMC4wMy4wMCNNZXNhbGFtaW5lIzUxLjE0LjIwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIwLjA0LjAwI01lcHJvYnJvbWF0ZSM1MS4xNC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMS4wMC4wMCNOb25zdGVyb2lkYWwgYW50aSBpbmZsYW1tYXRvcnkgZHJ1Z3MgKE5TQUlEcykjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjEuMDEuMDAjQXVyYW5vZmluIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjAyLjAwI0NhcnBvZmVuIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjAzLjAwI0RpY2xvZmVuYWMgcG90YXNzaXVtIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjA0LjAwI0RpY2xvZmVuYWMgc29kaXVtIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjA1LjAwI0ZsdXJiaXByb2ZlbiM1MS4xNC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMS4wNi4wMCNJYnVwcm9mZW4jNTEuMTQuMjEuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjEuMDcuMDAjSW5kb21ldGhhY2luIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjA4LjAwI0tldG9wcm9mZW4jNTEuMTQuMjEuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjEuMDkuMDAjTmFwcm94ZW4jNTEuMTQuMjEuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjEuMTAuMDAjTmFwcm94ZW4gc29kaXVtIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjExLjAwI094YXByb3ppbiM1MS4xNC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMS4xMi4wMCNTdWxpbmRhYyM1MS4xNC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMS4xMy4wMCNTdXByb2ZlbiM1MS4xNC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMi4wMC4wMCNOYXJjb3RpYyBhbmFsZ2VzaWNzIzUxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIyLjAxLjAwI0J1dG9ycGhhbm9sIHRhcnRyYXRlIzUxLjE0LjIyLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIyLjAyLjAwI0NvZGVpbmUgcGhvc3BoYXRlIzUxLjE0LjIyLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIyLjAzLjAwI0NvZGVpbmUgc3VsZmF0ZSM1MS4xNC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMi4wNS4wMCNNZXBlcmlkaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTQuMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjIuMDYuMDAjTW9ycGhpbmUgc3VsZmF0ZSM1MS4xNC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMi4wNy4wMCNPeHljb2RvbmUjNTEuMTQuMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjIuMDguMDAjU3VmZW50YW5pbCM1MS4xNC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMy4wMC4wMCNOYXJjb3RpYyBhbnRhZ29uaXN0cyM1MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMy4wMS4wMCNOYWxtZWZlbmUgaHlkcm9jaGxvcmlkZSM1MS4xNC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMy4wMi4wMCNOYWxveG9uZSBoeWRyb2NobG9yaWRlIzUxLjE0LjIzLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIzLjAzLjAwI05hbHRyZXhvbmUjNTEuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjQuMDAuMDAjRHJ1Z3MgdXNlZCBmb3IgdmFzY3VsYXIgYW5kIG1pZ3JhaW5lIGhlYWRhY2hlcyM1MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNC4wMS4wMCNNZXRoeXNlcmdpZGUgbWFsZWF0ZSM1MS4xNC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNC4wMi4wMCNTdW1hdHJpcHRhbiBzdWNjaW5hdGUjNTEuMTQuMjQuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjUuMDAuMDAjQW50aXBhcmtpbnNvbiBkcnVncyM1MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNS4wMS4wMCNCcm9tb2NyaXB0aW5lIG1lc3lsYXRlIzUxLjE0LjI1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjI1LjAyLjAwI0NhcmJpZG9wYSM1MS4xNC4yNS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNS4wMy4wMCNMZXZvZG9wYSM1MS4xNC4yNS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNS4wNC4wMCNTZWxlZ2lsaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTQuMjUuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDAuMDAjU3RpbXVsYW50cyBhbmQgYW5vcmV4aWFudHMjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDEuMDAjQW1waGV0YW1pbmUgc3VsZmF0ZSM1MS4xNC4yNi4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNi4wMi4wMCNGZW5mbHVyYW1pbmUjNTEuMTQuMjYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDMuMDAjTWF6aW5kb2wjNTEuMTQuMjYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDQuMDAjUGVtb2xpbmUjNTEuMTQuMjYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDUuMDAjUGhlbmRpbWV0cmF6aW5lIHRhcnRyYXRlIzUxLjE0LjI2LjAwLjAwCi11bnNwc2M3IzUxLjE1LjAwLjAwLjAwI0F1dG9ub21pYyBuZXJ2b3VzIHN5c3RlbSBkcnVncyM1MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNS4wMC4wMCNDaG9saW5lcmdpYyBkcnVncyBhbmQgY2hvbGluZXN0ZXJhc2UgaW5oaWJpdG9ycyM1MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNS4wMS4wMCNCZXRoYW5lY2hvbCBjaGxvcmlkZSM1MS4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNS4wMi4wMCNFZHJvcGhvbml1bSBjaGxvcmlkZSM1MS4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNS4wMy4wMCNQaHlzb3N0aWdtaW5lIHNhbGljeWxhdGUjNTEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTUuMDQuMDAjUGlsb2NhcnBpbmUgbml0cmF0ZSM1MS4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNi4wMC4wMCNDaG9saW5lcmdpYyBibG9ja2luZyBhZ2VudHMjNTEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTYuMDEuMDAjQXRyb3BpbmUgc3VsZmF0ZSM1MS4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNi4wMi4wMCNCZW56dHJvcGluZSBtZXN5bGF0ZSM1MS4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNi4wMy4wMCNQcm9jeWNsaWRpbmUgaHlkcm9jaGxvcmlkZSM1MS4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNi4wNC4wMCNUcmloZXh5cGhlbmlkeWwgaHlkcm9jaGxvcmlkZSM1MS4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNy4wMC4wMCNTeW1wYXRob21pbWV0aWMgb3IgYWRyZW5lcmdpYyBkcnVncyM1MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNy4wMS4wMCNBbGJ1dGVyb2wjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDIuMDAjQnJpbW9uaWRpbmUgdGFydHJhdGUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDMuMDAjRXBpbmVwaHJpbmUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDQuMDAjRXBpbmVwaHJpbmUgYm9yYXRlIzUxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE3LjA1LjAwI0VwaW5lcGhyaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDYuMDAjSXNvcHJvdGVyZW5vbCM1MS4xNS4xNy4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNy4wNy4wMCNJc29wcm90ZXJlbm9sIHN1bGZhdGUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDguMDAjTGV2YXJ0ZXJlbm9sIGJpdGFydHJhdGUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDkuMDAjUGhlbnlscHJvcGFub2xhbWluZSBoeWRyb2NobG9yaWRlIzUxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjAwLjAwI0FkcmVuZXJnaWMgYmxvY2tpbmcgYWdlbnRzIzUxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjAxLjAwI0F0ZW5vbG9sIzUxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjAyLjAwI0VzbW9sb2wgaHlkcm9jaGxvcmlkZSM1MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xOC4wMy4wMCNOYWRvbG9sIzUxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjA0LjAwI1BpbmRvbG9sIzUxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjA1LjAwI1RpbW9sb2wgbWFsZWF0ZSM1MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xOC4xMC4wMCNQaGVudG9sYW1pbmUgbWVzeWxhdGUjNTEuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTkuMDAuMDAjU2tlbGV0YWwgbXVzY2xlIHJlbGF4YW50cyBhbmQgY2VudHJhbGx5IGFjdGluZyM1MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xOS4wMS4wMCNCYWNsb2ZlbiM1MS4xNS4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNS4xOS4wMi4wMCNDaGxvcnpveGF6b25lIzUxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE5LjAzLjAwI0RhbnRyb2xlbmUgc29kaXVtIzUxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE5LjA0LjAwI01ldGhvY2FyYmFtb2wjNTEuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTkuMDUuMDAjQ2FyaXNvcHJvZG9sIzUxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE1LjIwLjAwLjAwI05ldXJvbXVzY3VsYXIgYmxvY2tpbmcgYWdlbnRzIzUxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE1LjIwLjAxLjAwI0F0cmFjdXJpdW0gYmVzeWxhdGUjNTEuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMjAuMDIuMDAjTWl2YWN1cml1bSBjaHlsb3JpZGUjNTEuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMjAuMDMuMDAjUm9jdXJvbml1bSBicm9taWRlIzUxLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUxLjE1LjIwLjA0LjAwI1ZlY3Vyb25pdW0gYnJvbWlkZSM1MS4xNS4yMC4wMC4wMAotdW5zcHNjNyM1MS4xNi4wMC4wMC4wMCNEcnVncyBhZmZlY3RpbmcgdGhlIHJlc3BpcmF0b3J5IHRyYWN0IzUxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjE2LjE1LjAwLjAwI0FudGlhc3RobWF0aWMgZHJ1Z3MjNTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTUuMDEuMDAjQml0b2x0ZXJvbCBtZXN5bGF0ZSM1MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNS4wMi4wMCNOZWRvY3JvbWlsIHNvZGl1bSM1MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNS4wMy4wMCNQaXJidXRlcm9sIGFjZXRhdGUjNTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTUuMDQuMDAjQW1pbm9waHlsbGluZSM1MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNS4wNS4wMCNUaGVvcGh5bGxpbmUjNTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTYuMDAuMDAjQW50aWhpc3RhbWluZXMgb3IgSDEgYmxvY2tlcnMjNTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTYuMDEuMDAjQXN0ZW1pem9sZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNi4wMi4wMCNDbGVtYXN0aW5lIGZ1bWFyYXRlIzUxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE2LjAzLjAwI0RleGNobG9ycGhlbmlyYW1pbmUgbWFsZWF0ZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNi4wNC4wMCNEaW1lbmh5ZHJpbmF0ZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNi4wNS4wMCNMZXZvY2FiYXN0aW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTYuMDYuMDAjTG9yYXRpZGluZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNi4wNy4wMCNUZXJmZW5hZGluZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNy4wMC4wMCNEcnVncyB1c2VkIGZvciByZXNwaXJhdG9yeSB0cmFjdCBkaXNvcmRlcnMjNTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTcuMDEuMDAjQWNldHlsY3lzdGVpbmUjNTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTcuMDIuMDAjQmVyYWN0YW50IzUxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE3LjAzLjAwI0J1ZGVzb25pZGUjNTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTcuMDQuMDAjQ29sZm9zY2VyaWwgcGFsbWl0YXRlIzUxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE3LjA1LjAwI0lwcmF0cm9waXVtIGJyb21pZGUjNTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTguMDAuMDAjQ291Z2ggYW5kIGNvbGQgYW5kIGFudGlhbGxlcmd5IHByb2R1Y3RzIzUxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE2LjE4LjAxLjAwI0JlbnpvbmF0YXRlIzUxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE4LjAyLjAwI0d1YWlmZW5lc2luIzUxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE5LjAwLjAwI05hc2FsIGRlY29uZ2VzdGFudHMjNTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTkuMDEuMDAjT3h5bWV0YXpvbGluZSBoeWRyb2NobG9yaWRlIzUxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE5LjAyLjAwI1BzZXVkb2VwaGVkcmluZSBoeWRyb2NobG9yaWRlIzUxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE5LjAzLjAwI1h5bG9tZXRhem9saW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTYuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMDAuMDAuMDAjRHJ1Z3MgYWZmZWN0aW5nIHRoZSBnYXN0cm9pbnRlc3RpbmFsIHN5c3RlbSM1MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNS4wMC4wMCNBbnRhY2lkcyM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNS4wMS4wMCNDYWxjaXVtIGNhcmJvbmF0ZSM1MS4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNS4wMi4wMCNNYWdhbGRyYXRlIzUxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE1LjAzLjAwI01hZ25lc2l1bSBoeWRyb3hpZGUjNTEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTUuMDQuMDAjU29kaXVtIGJpY2FyYm9uYXRlIGFudGFjaWRzIzUxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE2LjAwLjAwI0xheGF0aXZlcyM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNi4wMS4wMCNDYXNjYXJhIHNhZ3JhZGEjNTEuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTYuMDIuMDAjRG9jdXNhdGUgY2FsY2l1bSM1MS4xNy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNi4wMy4wMCNEb2N1c2F0ZSBwb3Rhc3NpdW0jNTEuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTYuMDQuMDAjRG9jdXNhdGUgc29kaXVtIzUxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE2LjA1LjAwI0xhY3R1bG9zZSM1MS4xNy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNi4wNi4wMCNNYWduZXNpdW0gc3VsZmF0ZSM1MS4xNy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNi4wNy4wMCNQc3lsbGl1bSBoeWRyb3BoaWxpYyBtdWNpbG9pZCM1MS4xNy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNy4wMC4wMCNBbnRpZGlhcnJoZWFscyM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNy4wMS4wMCNEaWZlbm94aW4gaHlkcm9jaGxvcmlkZSM1MS4xNy4xNy4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNy4wMi4wMCNMb3BlcmFtaWRlIGh5ZHJvY2hsb3JpZGUjNTEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTcuMDMuMDAjUGFyZWdvcmljIzUxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE4LjAwLjAwI0FudGllbWV0aWNzIGFuZCBhbnRpbmF1c2VhbnRzIzUxLjE3LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE3LjE4LjAxLjAwI0Ryb25hYmlub2wjNTEuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTguMDIuMDAjR3JhbmlzZXRyb24gaHlkcm9jaGxvcmlkZSM1MS4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOC4wMy4wMCNNZWNsaXppbmUgaHlkcm9jaGxvcmlkZSM1MS4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOC4wNC4wMCNPbmRhbnNldHJvbiBoeWRyb2NobG9yaWRlIzUxLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE4LjA1LjAwI1RyaW1ldGhvYmVuemFtaWRlIGh5ZHJvY2hsb3JpZGUjNTEuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTkuMDAuMDAjQW50aXVsY2VyIGFuZCByZWxhdGVkIGdhc3Ryb2ludGVzdGluYWwgKEdJKSBkcnVncyM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOS4wMS4wMCNDaW1ldGlkaW5lIzUxLjE3LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE5LjAyLjAwI0ZhbW90aWRpbmUjNTEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTkuMDMuMDAjTml6YXRpZGluZSM1MS4xNy4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOS4wNC4wMCNSYW5pdGlkaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTkuMDUuMDAjQ2lzYXByaWRlIzUxLjE3LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE5LjA2LjAwI0xhbnNvcHJhem9sZSM1MS4xNy4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOS4wNy4wMCNMaWJyYXgjNTEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTkuMDguMDAjTWlzb3Byb3N0b2wjNTEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMjAuMDAuMDAjRHJ1Z3MgdXNlZCBmb3IgZ2FsbGJsYWRkZXIgZGlzZWFzZSM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4yMC4wMS4wMCNDaGVub2Rpb2wjNTEuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMjAuMDIuMDAjTW9ub2N0YW5vaW4jNTEuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMjAuMDMuMDAjVXJzb2Rpb2wjNTEuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMDAuMDAuMDAjSG9ybW9uZXMgYW5kIGhvcm1vbmUgYW50YWdvbmlzdHMjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTUuMDAuMDAjQW50aWRpYWJldGljIGFnZW50cyBhbmQgaHlwZXJnbHljZW1pYyBhZ2VudHMjNTEuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTUuMDEuMDAjQWNhcmJvc2UjNTEuMTguMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTUuMDIuMDAjQWNldG9oZXhhbWlkZSM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNS4wMy4wMCNDaGxvcnByb3BhbWlkZSM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNS4wNC4wMCNHbGltZXBpcmlkZSM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNS4wNS4wMCNHbGlwaXppZGUjNTEuMTguMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTUuMDYuMDAjSW5zdWxpbiM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNS4wOC4wMCNHbHVjYWdvbiM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNi4wMC4wMCNUaHlyb2lkIGFuZCBhbnRpdGh5cm9pZCBkcnVncyM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNi4wMS4wMCNMZXZvdGh5cm94aW5lIHNvZGl1bSM1MS4xOC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNi4wMi4wMCNMaW90aHlyb25pbmUgc29kaXVtIzUxLjE4LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE2LjAzLjAwI0xpb3RyaXgjNTEuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTYuMDQuMDAjVGh5cm90cm9waW4jNTEuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTYuMDUuMDAjTWV0aGltYXpvbGUjNTEuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTYuMDYuMDAjUHJvcHlsdGhpb3VyYWNpbCM1MS4xOC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNy4wMC4wMCNDb3J0aWNvc3Rlcm9pZHMjNTEuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTcuMDEuMDAjQmV0YW1ldGhhc29uZSM1MS4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNy4wMi4wMCNDb3J0aWNvdHJvcGluIzUxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE3LjAzLjAwI0Nvc3ludHJvcGluIzUxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE3LjA0LjAwI0RleGFtZXRoYXNvbmUjNTEuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTcuMDUuMDAjRmx1bmlzb2xpZGUjNTEuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTcuMDYuMDAjSHlkcm9jb3J0aXNvbmUjNTEuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTcuMDcuMDAjTWV0aHlscHJlZG5pc29sb25lIzUxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE3LjA4LjAwI1ByZWRuaXNvbG9uZSM1MS4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNy4wOS4wMCNUcmlhbWNpbm9sb25lIzUxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjAwLjAwI0VzdHJvZ2VucyBhbmQgcHJvZ2VzdGlucyBhbmQgaW50ZXJuYWwgY29udHJhY2VwdGl2ZXMjNTEuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTguMDEuMDAjQ2hsb3JvdHJpYW5pc2VuZSM1MS4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOC4wMi4wMCNFc3Ryb25lIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjAzLjAwI0VzdHJvZ2VucyBjb25qdWdhdGVkIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA0LjAwI0VzdHJvcGlwYXRlIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA1LjAwI0xldm9ub3JnZXN0cmVsIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA2LjAwI01lZ2VzdHJvbCBhY2V0YXRlIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA3LjAwI0V0aGlueWwgZXN0cmFkaW9sIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA4LjAwI01lc3RyYW5vbCM1MS4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wMC4wMCNHb25hZG90cm9waWMgaG9ybW9uZXMgYW5kIG92YXJpYW4gc3RpbXVsYW50cyBhbmQgaW5oaWJpdG9ycyM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wMS4wMCNDaG9yaW9uaWMgZ29uYWRvdHJvcGluIzUxLjE4LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE5LjAyLjAwI0RhbmF6b2wjNTEuMTguMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTkuMDMuMDAjR29uYWRvcmVsaW4gYWNldGF0ZSM1MS4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wNC4wMCNIaXN0cmVsaW4gYWNldGF0ZSM1MS4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wNS4wMCNNZW5vdHJvcGlucyM1MS4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wNi4wMCNVcm9mb2xsaXRyb3BpbiM1MS4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMC4wMC4wMCNBbmRyb2dlbnMgYW5kIGFuZHJvZ2VuIGluaGliaXRvcnMjNTEuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjAuMDEuMDAjRmluYXN0ZXJpZGUjNTEuMTguMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjAuMDIuMDAjVGVzdG9zdGVyb25lIzUxLjE4LjIwLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIwLjAzLjAwI1Rlc3Rvc3Rlcm9uZSBjeXBpb25hdGUjNTEuMTguMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjAuMDQuMDAjVGVzdG9zdGVyb25lIGVuYW50aGF0ZSM1MS4xOC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMC4wNS4wMCNUZXN0b3N0ZXJvbmUgcHJvcGlvbmF0ZSM1MS4xOC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMS4wMC4wMCNQb3N0ZXJpb3IgcGl0dWl0YXJ5IGhvcm1vbmVzIzUxLjE4LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIxLjAxLjAwI0Rlc21vcHJlc3NpbiBhY2V0YXRlIzUxLjE4LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIxLjAyLjAwI1Zhc29wcmVzc2luIzUxLjE4LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIyLjAwLjAwI0RydWdzIGZvciBpbmR1Y2luZyBsYWJvciM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMi4wMS4wMCNEaW5vcHJvc3RvbmUjNTEuMTguMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjIuMDIuMDAjTWV0aHlsZXJnb25vdmluZSBtYWxlYXRlIzUxLjE4LjIyLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIyLjAzLjAwI094eXRvY2luIzUxLjE4LjIyLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIzLjAwLjAwI0dyb3d0aCBob3Jtb25lcyM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMy4wMS4wMCNTb21hdHJlbSM1MS4xOC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMy4wMi4wMCNTb21hdHJvcGluIzUxLjE4LjIzLjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjAwLjAwI0NhbGNpdW0gc2FsdHMgYW5kIGNhbGNpdW0gcmVndWxhdG9ycyM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yNC4wMS4wMCNDYWxjaXVtIGNobG9yaWRlIzUxLjE4LjI0LjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjAyLjAwI0NhbGNpdW0gY2l0cmF0ZSM1MS4xOC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yNC4wMy4wMCNDYWxjaXVtIGdsdWNvbmF0ZSM1MS4xOC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yNC4wNC4wMCNDYWxjaXVtIGxhY3RhdGUjNTEuMTguMjQuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjQuMDUuMDAjRGliYXNlIGNhbGNpdW0gcGhvc3BoYXRlIzUxLjE4LjI0LjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjA2LjAwI0FsZW5kcm9uYXRlIHNvZGl1bSM1MS4xOC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yNC4wNy4wMCNDYWxjaXRvbmluIzUxLjE4LjI0LjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjA4LjAwI0NlbGx1bG9zZSBzb2RpdW0gcGhvc3BoYXRlIzUxLjE4LjI0LjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjA5LjAwI0dhbGxpdW0gbml0cmF0ZSM1MS4xOC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xOS4wMC4wMC4wMCNBZ2VudHMgYWZmZWN0aW5nIHdhdGVyIGFuZCBlbGVjdHJvbHl0ZXMjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTkuMTUuMDAuMDAjRGl1cmV0aWNzIzUxLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjAxLjAwI0NobG9yb3RoaWF6aWRlIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjAyLjAwI0NobG9ydGhhbGlkb25lIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjAzLjAwI01lbnRvbGF6b25lIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA0LjAwI0J1bWV0YW5pZGUjNTEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTkuMTUuMDUuMDAjRXRoYWNyeW5hdGUgc29kaXVtIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA2LjAwI0FtaWxvcmlkZSBoeWRyb2NobG9yaWRlIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA3LjAwI1NwaXJvbm9sYWN0b25lIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA4LjAwI1RyaWFtdGVyZW5lIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA5LjAwI01hbm5pdG9sIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE2LjAwLjAwI0VsZWN0cm9seXRlcyM1MS4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOS4xNi4wMS4wMCNEZXh0cm9zZSM1MS4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xOS4xNi4wMi4wMCNTb2RpdW0gY2hsb3JpZGUgZWxlY3Ryb2x5dGVzIzUxLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE3LjAwLjAwI0Fsa2FsaW5pemluZyBhZ2VudHMjNTEuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTkuMTcuMDEuMDAjVHJvbWV0aGFtaW5lIzUxLjE5LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE4LjAwLjAwI1BvdGFzc2l1bSBzYWx0cyM1MS4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOS4xOC4wMS4wMCNQb3Rhc3NpdW0gYmljYXJib25hdGUjNTEuMTkuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTkuMTguMDIuMDAjUG90YXNzaXVtIGNobG9yaWRlIzUxLjE5LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE4LjAzLjAwI1BvdGFzc2l1bSBnbHVjb25hdGUjNTEuMTkuMTguMDAuMDAKLXVuc3BzYzcjNTEuMjAuMDAuMDAuMDAjSW1tdW5vbW9kdWxhdGluZyBkcnVncyM1MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNS4wMC4wMCNJbW11bm9zdXBwcmVzc2FudHMjNTEuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTUuMDEuMDAjQXphdGhpb3ByaW5lIzUxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE1LjAyLjAwI0N5Y2xvc3BvcmluZSM1MS4yMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNS4wMy4wMCNNeWNvcGhlbm9sYXRlIG1vZmV0aWwjNTEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTUuMDQuMDAjVGFjcm9saW11cyM1MS4yMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wMC4wMCNWYWNjaW5lcyM1MS4yMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wMS4wMCNBbnRocmF4IGFudGlnZW4jNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMDIuMDAjQnJ1Y2VsbGEgYW50aWdlbiM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wMy4wMCNDaG9sZXJhIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjA0LjAwI0RpcGh0ZXJpYSM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wNS4wMCNFbmNlcGhhbGl0aXMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMDYuMDAjSGVtb3BoaWx1cyBpbmZsdWVuemFlIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjA3LjAwI0hlcGF0aXRpcyBiIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjA4LjAwI0luZmx1ZW56YSM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wOS4wMCNNZWFzbGVzIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjEwLjAwI01lbmluZ29jb2NjdXMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTEuMDAjTW9yYmlsbGkjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTIuMDAjTXVtcHMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTMuMDAjUGFyb3RpdGlzIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjE0LjAwI1BlcnR1c3NpcyM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4xNS4wMCNQbmV1bW9jb2NjdXMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTYuMDAjUG9saW9teWVsaXRpcyM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4xNy4wMCNSYWJpZXMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTguMDAjUm90YSB2aXJ1cyM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4xOS4wMCNSdWJlbGxhIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjIwLjAwI1NtYWxscG94IzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjIxLjAwI1RldGFudXMgdG94b2lkIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjIyLjAwI1R1YmVyY3Vsb3NpcyM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4yMy4wMCNUeXBob2lkIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjI0LjAwI1ZhcmljZWxsYSM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4yNS4wMCNZZWxsb3cgZmV2ZXIjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMjYuMDAjSGVwYXRpdGlzIGEjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMDAuMDAuMDAjTWlzY2VsbGFuZW91cyBkcnVnIGNhdGVnb3JpZXMjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTUuMDAuMDAjQW50aWdvdXQgZHJ1Z3MjNTEuMjEuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTUuMDEuMDAjQWxsb3B1cmlub2wjNTEuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTUuMDIuMDAjQ29sY2hpY2luZSM1MS4yMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNS4wMy4wMCNQcm9iZW5lY2lkIzUxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE1LjA0LjAwI1N1bGZpbnB5cmF6b25lIzUxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE2LjAwLjAwI0FudGlkb3RlcyM1MS4yMS4wMC4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNi4wMS4wMCNEZWZlcm94YW1pbmUgbWVzeWxhdGUjNTEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTYuMDIuMDAjRGV4cmF6b3hhbmUjNTEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTYuMDMuMDAjRGlnb3hpbiBpbW11bmUgZmFiIzUxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE2LjA0LjAwI0RpbWVyY2Fwcm9sIzUxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE2LjA1LjAwI0VkZXRhdGUgZGlzb2RpdW0jNTEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTYuMDYuMDAjRmx1bWF6ZW5pbCM1MS4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNi4wNy4wMCNJcGVjYWMjNTEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTYuMDguMDAjUGVuaWNpbGxhbWluZSM1MS4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNi4wOS4wMCNQcm90YW1pbmUgc3VsZmF0ZSM1MS4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNi4xMC4wMCNTb2RpdW0gcG9seXN0eXJlbmUgc3VsZm9uYXRlIzUxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE2LjExLjAwI1RyaWVudGluZSM1MS4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNy4wMC4wMCNOdXRyaXRpb3VzIGZvb2QjNTEuMjEuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTcuMDEuMDAjUmVzaWR1ZSBvZiBtYWl6ZSBnZXJtIzUxLjIxLjE3LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE4LjAwLjAwI0FuYWVzdGhldGljIGRydWdzIzUxLjIxLjAwLjAwLjAwCi11bnNwc2M3IzUxLjIxLjE4LjAxLjAwI0NobG9yb2Zvcm0jNTEuMjEuMTguMDAuMDAKLXVuc3BzYzcjNTIuMDAuMDAuMDAuMDAjRG9tZXN0aWMgQXBwbGlhbmNlcyBhbmQgU3VwcGxpZXMgYW5kIENvbnN1bWVyIEVsZWN0cm9uaWMgUHJvZHVjdHMjNTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMDAuMDAuMDAjRmxvb3IgY292ZXJpbmdzIzUyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjAwLjAwI1J1Z3MgYW5kIG1hdHMjNTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMTUuMDEuMDAjT3JpZW50YWwgcnVncyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4wMi4wMCNBcmVhIHJ1Z3MjNTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMTUuMDMuMDAjV29vbCBydWdzIzUyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjA0LjAwI0NvdHRvbiBydWdzIzUyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjA1LjAwI1N5bnRoZXRpYyBydWdzIzUyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjA2LjAwI0JyYWlkZWQgcnVncyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4wNy4wMCNCYXRoIG1hdHMjNTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMTUuMDguMDAjRG9vciBtYXRzIzUyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjA5LjAwI0RlY29yYXRpdmUgbWF0cyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4xMC4wMCNBbnRpIGZhdGlndWUgbWF0cyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4xMS4wMCNSdWJiZXIgb3IgdmlueWwgbWF0cyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4xMi4wMCNDaGFpciBtYXQjNTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMTUuMTMuMDAjQ2FycGV0IHByb3RlY3RvciM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4wMC4wMC4wMCNBY2NvbW1vZGF0aW9uIGZ1cm5pdHVyZSM1Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4wMC4wMCNGdXJuaXR1cmUjNTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMDEuMDAjU29mYXMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMDIuMDAjU3RhbmRzIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjAzLjAwI0Jvb2tjYXNlcyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4wNC4wMCNFbnRlcnRhaW5tZW50IGNlbnRlcnMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMDUuMDAjRnV0b25zIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjA2LjAwI0NoYWlycyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4wNy4wMCNDb2F0IHJhY2tzIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjA4LjAwI1dhbGwgcmFja3MjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMDkuMDAjTWF0dHJlc3NlcyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4xMC4wMCNDb3RzIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjExLjAwI0JlZHMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMTIuMDAjRm9vdCBzdG9vbHMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMTMuMDAjVGFibGVzIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjE0LjAwI0NoZXN0cyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4xNS4wMCNTdG9vbHMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMTYuMDAjRHJlc3NlcnMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMTcuMDAjUGFydGl0aW9ucyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNi4wMC4wMCNPdXRkb29yIGZ1cm5pdHVyZSM1Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNi4wMS4wMCNPdXRkb29yIGNoYWlycyM1Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNi4wMi4wMCNPdXRkb29yIHRhYmxlcyBvciBwaWNuaWMgdGFibGVzIzUyLjExLjE2LjAwLjAwCi11bnNwc2M3IzUyLjExLjE2LjAzLjAwI091dGRvb3Igc3dpbmdzIzUyLjExLjE2LjAwLjAwCi11bnNwc2M3IzUyLjExLjE2LjA0LjAwI091dGRvb3IgYmVuY2hlcyM1Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNi4wNS4wMCNPdXRkb29yIHVtYnJlbGxhcyM1Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNy4wMC4wMCNPZmZpY2UgZnVybml0dXJlIzUyLjExLjAwLjAwLjAwCi11bnNwc2M3IzUyLjExLjE3LjAxLjAwI0NyZWRlbnphcyM1Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNy4wMy4wMCNEZXNrcyM1Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Mi4xMi4wMC4wMC4wMCNCZWRjbG90aGVzIGFuZCB0YWJsZSBhbmQga2l0Y2hlbiBsaW5lbiBhbmQgdG93ZWxzIzUyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjAwLjAwI0JlZGNsb3RoZXMjNTIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTUuMDEuMDAjUXVpbHRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjAyLjAwI0NvbWZvcnRlcnMjNTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTUuMDMuMDAjQ29tZm9ydGVyIGNvdmVycyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNS4wNC4wMCNNYXR0cmVzcyBjb3ZlcnMjNTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTUuMDUuMDAjUGlsbG93cyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNS4wNi4wMCNNYXR0cmVzcyBwYWRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjA3LjAwI0ZlYXRoZXJiZWRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjA4LjAwI0JsYW5rZXRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjA5LjAwI1NoZWV0cyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNS4xMC4wMCNEdXN0IHJ1ZmZsZXMjNTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTUuMTEuMDAjRHV2ZXRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjEyLjAwI1BpbGxvdyBjYXNlcyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNS4xMy4wMCNCZWQgc3ByZWFkcyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNi4wMC4wMCNUYWJsZSBhbmQga2l0Y2hlbiBsaW5lbiM1Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNi4wMS4wMCNEaXNoIHRvd2VscyM1Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNi4wMi4wMCNOYXBraW5zIzUyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE2LjAzLjAwI1RhYmxlIHJ1bm5lcnMjNTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTYuMDQuMDAjVGFibGUgY2xvdGhzIzUyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE2LjA1LjAwI0RvbWVzdGljIG92ZW4gbWl0cyBvciBwb3QgaG9sZGVycyM1Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNi4wNi4wMCNQbGFjZSBtYXRzIzUyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE2LjA3LjAwI1RhYmxlIHNraXJ0cyM1Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNy4wMC4wMCNUb3dlbHMjNTIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTcuMDEuMDAjQmF0aCB0b3dlbHMjNTIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTcuMDIuMDAjQmVhY2ggdG93ZWxzIzUyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE3LjAzLjAwI1dhc2ggY2xvdGhzIzUyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE3LjA0LjAwI0hhbmQgdG93ZWxzIzUyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEzLjAwLjAwLjAwI1dpbmRvdyB0cmVhdG1lbnRzIzUyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUyLjEzLjE1LjAwLjAwI0N1cnRhaW5zIGFuZCBkcmFwZXJpZXMjNTIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTUuMDEuMDAjQ3VydGFpbnMjNTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTUuMDMuMDAjRHJhcGVyaWVzIzUyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEzLjE2LjAwLjAwI0JsaW5kcyBhbmQgc2hhZGVzIzUyLjEzLjAwLjAwLjAwCi11bnNwc2M3IzUyLjEzLjE2LjAxLjAwI1ZlbmV0aWFuIGJsaW5kcyM1Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMy4xNi4wMi4wMCNSb2xsIHVwIHNoYWRlcyM1Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMy4xNi4wMy4wMCNJbnRlcmlvciBzaHV0dGVycyM1Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMy4xNi4wNC4wMCNWZXJ0aWNhbCBibGluZHMjNTIuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTcuMDAuMDAjV2luZG93IHRyZWF0bWVudCBhY2Nlc3NvcmllcyBhbmQgaGFyZHdhcmUjNTIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTcuMDEuMDAjVmFsYW5jZXMjNTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTcuMDIuMDAjQ3VydGFpbiByb2RzIzUyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEzLjE3LjAzLjAwI1JvZCBmaW5pYWxzIzUyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEzLjE3LjA0LjAwI0N1cnRhaW4gcmluZ3Mgb3IgY2xpcHMjNTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMDAuMDAuMDAjRG9tZXN0aWMgYXBwbGlhbmNlcyM1Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4wMC4wMCNEb21lc3RpYyBraXRjaGVuIGFwcGxpYW5jZXMjNTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMDEuMDAjRG9tZXN0aWMgcmVmcmlnZXJhdG9ycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4wMi4wMCNEb21lc3RpYyBtaWNyb3dhdmUgb3ZlbnMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMDMuMDAjRG9tZXN0aWMgZ2FyYmFnZSBkaXNwb3NhbHMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMDQuMDAjRG9tZXN0aWMgcmFuZ2VzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjA1LjAwI0RvbWVzdGljIGRpc2ggd2FzaGVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4wNi4wMCNEb21lc3RpYyBmcmVlemVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4wNy4wMCNEb21lc3RpYyB1cHJpZ2h0IGZyZWV6ZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjA4LjAwI0RvbWVzdGljIGNoZXN0IGZyZWV6ZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjA5LjAwI0RvbWVzdGljIGNvbWJpbmF0aW9uIHJlZnJpZ2VyYXRvciBmcmVlemVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4xMC4wMCNEb21lc3RpYyBwb3J0YWJsZSBhaXIgY29uZGl0aW9uZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjExLjAwI0RvbWVzdGljIGp1aWNlcnMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMTIuMDAjRG9tZXN0aWMgd2FmZmxlIGlyb25zIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjEzLjAwI0RvbWVzdGljIGVsZWN0cmljIGNhbiBvcGVuZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjE0LjAwI0RvbWVzdGljIGZvb2QgcHJvY2Vzc29ycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4xNS4wMCNEb21lc3RpYyB0cmFzaCBjb21wYWN0b3JzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjE2LjAwI0RvbWVzdGljIGRlZXAgZnJ5ZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjE3LjAwI0RvbWVzdGljIHBvcGNvcm4gcG9wcGVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4xOC4wMCNEb21lc3RpYyBicmVhZCBtYWtpbmcgbWFjaGluZXMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMTkuMDAjRG9tZXN0aWMgY29udmVjdGlvbmFsIG92ZW5zIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjIwLjAwI0RvbWVzdGljIG1peGVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4yMS4wMCNEb21lc3RpYyB0b2FzdGVyIG92ZW5zIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjIyLjAwI0RvbWVzdGljIHRvYXN0ZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjIzLjAwI0RvbWVzdGljIGVsZWN0cmljYWwga2V0dGxlcyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4yNC4wMCNEb21lc3RpYyBibGVuZGVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4yNS4wMCNEb21lc3RpYyBob3QgcGxhdGVzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjI2LjAwI0RvbWVzdGljIGNvZmZlZSBtYWtlcnMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMjcuMDAjRG9tZXN0aWMgZWxlY3RyaWMga25pdmVzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjI4LjAwI0RvbWVzdGljIGVsZWN0cmljIHdva3MjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMjkuMDAjRG9tZXN0aWMgY29mZmVlIGdyaW5kZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjMwLjAwI1BhcnRzIG9mIGRpc2h3YXNoaW5nIG1hY2hpbmVzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjMxLjAwI0RvbWVzdGljIGZvb2QgY2hvcHBlcnMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMzIuMDAjRG9tZXN0aWMgZWxlY3RyaWMgc2tpbGxldHMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMzMuMDAjRG9tZXN0aWMgZWxlY3RyaWMgZ3JpZGRsZXMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMzQuMDAjRG9tZXN0aWMgZWxlY3RyaWMgc2FuZHdpY2ggbWFrZXIjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMzUuMDAjRG9tZXN0aWMgaW5kb29yIGVsZWN0cmljIGdyaWxscyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4zNi4wMCNEb21lc3RpYyBwaXplbGxlIG9yIGNvb2tpZSBtYWtlciM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4zNy4wMCNEb21lc3RpYyBjcm9jayBwb3QjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTYuMDAuMDAjRG9tZXN0aWMgbGF1bmRyeSBhcHBsaWFuY2VzIGFuZCBzdXBwbGllcyM1Mi4xNC4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNi4wMS4wMCNEb21lc3RpYyBjbG90aGVzIHdhc2hlcnMjNTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTYuMDIuMDAjRG9tZXN0aWMgdHVtYmxlIGRyeWVycyM1Mi4xNC4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNi4wMy4wMCNEb21lc3RpYyBjbG90aGluZyBpcm9ucyM1Mi4xNC4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNi4wNC4wMCNGb290d2VhciBkcnllcnMjNTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTYuMDUuMDAjTGF1bmRyeSBoYW1wZXJzIzUyLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE2LjA2LjAwI0xhdW5kcnkgYmFza2V0cyM1Mi4xNC4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNy4wMC4wMCNEb21lc3RpYyBiYXRoIGFwcGxpYW5jZXMjNTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTcuMDEuMDAjRG9tZXN0aWMgZWxlY3RyaWMgdG9vdGhicnVzaGVzIzUyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE3LjAzLjAwI0RvbWVzdGljIGhhaXIgZHJ5ZXJzIzUyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE3LjA0LjAwI0RvbWVzdGljIGVsZWN0cmljIHJhem9ycyM1Mi4xNC4xNy4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNy4wNS4wMCNQYXJ0cyBvZiBzaGF2ZXJzIG9yIGhhaXIgcmVtb3ZlcnMjNTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTcuMDYuMDAjTmFpbCBkcnllcnMjNTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTguMDAuMDAjT3RoZXIgZG9tZXN0aWMgaG91c2Vob2xkIGFwcGxpYW5jZXMjNTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTguMDEuMDAjRG9tZXN0aWMgc2V3aW5nIG1hY2hpbmVzIzUyLjE0LjE4LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE4LjAyLjAwI0RvbWVzdGljIHNwYWNlIGhlYXRlcnMjNTIuMTQuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTguMDMuMDAjRG9tZXN0aWMgZWxlY3RyaWMgYmxhbmtldHMjNTIuMTQuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMDAuMDAuMDAjRG9tZXN0aWMga2l0Y2hlbndhcmUjNTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTUuMDAuMDAjRG9tZXN0aWMgZGlzcG9zYWJsZSBraXRjaGVud2FyZSM1Mi4xNS4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNS4wMS4wMCNEb21lc3RpYyBkaXNwb3NhYmxlIGNvb2t3YXJlIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE1LjAyLjAwI0RvbWVzdGljIGRpc3Bvc2FibGUgZGlzaGVzIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE1LjAzLjAwI0RvbWVzdGljIGRpc3Bvc2FibGUgZmxhdHdhcmUjNTIuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTUuMDQuMDAjRG9tZXN0aWMgZGlzcG9zYWJsZSBjdXBzIG9yIGdsYXNzZXMgb3IgbGlkcyM1Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNS4wNS4wMCNEb21lc3RpYyBkaXNwb3NhYmxlIHN0aXJyZXJzIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE1LjA2LjAwI0RvbWVzdGljIGRpc3Bvc2FibGUgZm9vZCBjb250YWluZXJzIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE1LjA3LjAwI0RvbWVzdGljIGRpc3Bvc2FibGUgZHJpbmtpbmcgc3RyYXdzIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjAwLjAwI0RvbWVzdGljIGtpdGNoZW4gdG9vbHMgYW5kIHV0ZW5zaWxzIzUyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjAxLjAwI0RvbWVzdGljIHJvbGxpbmcgcGlucyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wMi4wMCNEb21lc3RpYyBtaXhpbmcgYm93bHMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMDMuMDAjRG9tZXN0aWMgZ3JhdGVycyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wNC4wMCNEb21lc3RpYyBzdHJhaW5lcnMgb3IgY29sYW5kZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjA1LjAwI0RvbWVzdGljIGNhbiBvciBib3R0bGUgb3BlbmVycyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wNi4wMCNEb21lc3RpYyBjdXR0aW5nIGJvYXJkcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wNy4wMCNEb21lc3RpYyBtZWFzdXJpbmcgY3VwcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wOC4wMCNCYXN0ZXJzIG9yIGJhc3RpbmcgYnJ1c2hlcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wOS4wMCNWZWdldGFibGUgcGVlbGVyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjEwLjAwI0Nvb2tpZSBjdXR0ZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjExLjAwI0RvbWVzdGljIGtpdGNoZW4gdG9uZ3MjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMTIuMDAjRG9tZXN0aWMga2l0Y2hlbiB3aXJlIHdoaXBzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjEzLjAwI0RvbWVzdGljIGZvb2Qgc2NyYXBlcnMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMTQuMDAjRG9tZXN0aWMgY29vbGluZyByYWNrcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4xNS4wMCNEb21lc3RpYyBwaXp6YSBjdXR0ZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjE2LjAwI0RvbWVzdGljIGtpdGNoZW4gc3BhdHVsYXMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMTcuMDAjRG9tZXN0aWMgd29vZGVuIHNwb29ucyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4xOC4wMCNEb21lc3RpYyB3b29kZW4gb3ZlbiBwYWRkbGUjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMTkuMDAjRG9tZXN0aWMgcGFzdHJ5IGJsZW5kZXIjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMjAuMDAjRG9tZXN0aWMgc2lmdGVyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjIxLjAwI0RvbWVzdGljIGNvb2tpZSBzdGFtcGVycyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4yMi4wMCNEb21lc3RpYyBwYXN0cnkgZGVjb3JhdGluZyBndW4jNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMjMuMDAjRG9tZXN0aWMgY29va2llIHByZXNzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjI0LjAwI0RvbWVzdGljIGtuaWZlIHNoYXJwZW5lcnMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMjUuMDAjRG9tZXN0aWMgYmlzY3VpdCBjdXR0ZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjI2LjAwI0RvbWVzdGljIG1hbmRvbGluIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjI3LjAwI0RvbWVzdGljIGdhcmxpYyBwcmVzcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4yOC4wMCNEb21lc3RpYyBlZ2cgc2xpY2VyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjI5LjAwI0RvbWVzdGljIGVnZyBzZXBhcmF0b3IjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzAuMDAjRG9tZXN0aWMgY2hlZXNlIHNsaWNlciM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4zMS4wMCNEb21lc3RpYyBmb29kIG1pbGwjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzIuMDAjRG9tZXN0aWMga2l0Y2hlbiBmdW5uZWxzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjMzLjAwI0RvbWVzdGljIGdhcm5pc2hpbmcgdG9vbHMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzQuMDAjRG9tZXN0aWMgYXBwbGUgY29yZXIjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzUuMDAjRG9tZXN0aWMgbWVsb24gb3IgYnV0dGVyIGJhbGxlciM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4zNi4wMCNEb21lc3RpYyBmb29kIHNjb29wcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4zNy4wMCNEb21lc3RpYyBwdW1wa2luIGNhcnZlciM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4zOC4wMCNEb21lc3RpYyB2ZWdldGFibGUgYnJ1c2gjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzkuMDAjRG9tZXN0aWMgZWdnIGJlYXRlciM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi40MC4wMCNEb21lc3RpYyBwYXN0YSBkcnlpbmcgcmFjayM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi40MS4wMCNEb21lc3RpYyB3aGlwcGVkIGNyZWFtIG1ha2VyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQyLjAwI0RvbWVzdGljIGRvdWdoIHByZXNzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQzLjAwI0RvbWVzdGljIHJhdmlvbGkgbWFrZXIjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuNDQuMDAjRG9tZXN0aWMgbWlzdCBzcHJheWVyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQ1LjAwI0RvbWVzdGljIHBhc3RyeSBicnVzaCM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi40Ni4wMCNEb21lc3RpYyBraXRjaGVuIG9yIGRpZXQgc2NhbGVzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQ3LjAwI0RvbWVzdGljIGtpdGNoZW4gdGltZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQ4LjAwI0RvbWVzdGljIGtpdGNoZW4gb3IgZm9vZCB0aGVybW9tZXRlcnMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuNDkuMDAjRG9tZXN0aWMgYnJlYWQgc2xpY2luZyBndWlkZSM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi41MC4wMCNEb21lc3RpYyBkcmFpbiBib2FyZHMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTcuMDAuMDAjRG9tZXN0aWMgZmxhdHdhcmUgYW5kIGN1dGxlcnkjNTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTcuMDEuMDAjRG9tZXN0aWMgc2VydmluZyB1dGVuc2lscyM1Mi4xNS4xNy4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNy4wMi4wMCNEb21lc3RpYyBrbml2ZXMjNTIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTcuMDMuMDAjRG9tZXN0aWMgZm9ya3MjNTIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTcuMDQuMDAjRG9tZXN0aWMgc3Bvb25zIzUyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE3LjA1LjAwI1Nwb29uIHJlc3RzIzUyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE3LjA2LjAwI0Nob3BzdGlja3MjNTIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDAuMDAjRG9tZXN0aWMgY29va3dhcmUjNTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDEuMDAjRG9tZXN0aWMgZHV0Y2ggb3ZlbnMjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDIuMDAjRG9tZXN0aWMgZnJ5aW5nIHBhbnMjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDMuMDAjRG9tZXN0aWMgc2F1Y2VwYW5zIzUyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE4LjA0LjAwI0RvbWVzdGljIGtldHRsZXMjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDUuMDAjRG9tZXN0aWMgd29rcyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4wNi4wMCNEb21lc3RpYyBzdGVhbWVycyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4wNy4wMCNEb21lc3RpYyBzdG9jayBwb3RzIzUyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE4LjA4LjAwI0RvbWVzdGljIHByZXNzdXJlIGNvb2tlcnMjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDkuMDAjRG9tZXN0aWMgc2F1dGUgcGFucyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4xMC4wMCNEb21lc3RpYyBjaGFmaW5nIGRpc2hlcyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4xMS4wMCNEb21lc3RpYyBncmlkZGxlcyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4xMi4wMCNEb21lc3RpYyBkb3VibGUgYm9pbGVycyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4xMy4wMCNEb21lc3RpYyBzcGxhdHRlciBzaGllbGQjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDAuMDAjRG9tZXN0aWMgYmFrZXdhcmUjNTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDEuMDAjRG9tZXN0aWMgbXVmZmluIHBhbnMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDIuMDAjRG9tZXN0aWMgYmFraW5nIHBhbnMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDMuMDAjRG9tZXN0aWMgY2FrZSBvciBwaWUgcGFucyM1Mi4xNS4xOS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOS4wNC4wMCNEb21lc3RpYyByb2FzdGluZyBwYW5zIzUyLjE1LjE5LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE5LjA1LjAwI0RvbWVzdGljIGJha2luZyBzaGVldHMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDYuMDAjRG9tZXN0aWMgYnJvaWxpbmcgcGFucyM1Mi4xNS4xOS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOS4wNy4wMCNEb21lc3RpYyBiYWtpbmcgbW9sZHMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDguMDAjRG9tZXN0aWMgcGl6emEgcGFucyM1Mi4xNS4xOS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOS4wOS4wMCNEb21lc3RpYyB0b3J0aWxsYSBiYWtlcnMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMDAuMDAjRG9tZXN0aWMgZGlzaGVzIGFuZCBzZXJ2aW5nd2FyZSBhbmQgc3RvcmFnZSBjb250YWluZXJzIzUyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjAxLjAwI0RvbWVzdGljIHBpdGNoZXJzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjAyLjAwI0RvbWVzdGljIGZvb2Qgc3RvcmFnZSBjb250YWluZXJzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjAzLjAwI0RvbWVzdGljIHB1bmNoIGJvd2xzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjA0LjAwI0RvbWVzdGljIHBsYXRlcyM1Mi4xNS4yMC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMC4wNS4wMCNEb21lc3RpYyBzYXVjZXJzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjA2LjAwI0RvbWVzdGljIHRyYXlzIG9yIHBsYXR0ZXJzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjA3LjAwI0RvbWVzdGljIHNlcnZpbmcgYm93bHMjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMDguMDAjRG9tZXN0aWMgdGVhIG9yIGNvZmZlZSBwb3RzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjA5LjAwI0RvbWVzdGljIHNvdXAgb3Igc2FsYWQgYm93bHMjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMTAuMDAjRG9tZXN0aWMgdmFjdXVtIGZsYXNrcyM1Mi4xNS4yMC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMC4xMS4wMCNJbm5lcnMgZm9yIHZhY2N1bSBmbGFza3MjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMTIuMDAjSWNlIHRyYXlzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjEzLjAwI1NwaWNlIG9yIHNhbHQgb3IgcGVwcGVyIHNoYWtlcnMjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMTQuMDAjQ2FyYWZlIHNldHMjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMTUuMDAjRG9tZXN0aWMgY2FrZSBwbGF0ZSB3aXRoIGRvbWUjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjEuMDAuMDAjRG9tZXN0aWMgZHJpbmtpbmcgdXRlbnNpbHMjNTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjEuMDEuMDAjRG9tZXN0aWMgY29mZmVlIG9yIHRlYSBjdXBzIzUyLjE1LjIxLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIxLjAyLjAwI0RvbWVzdGljIGRyaW5raW5nIGdsYXNzZXMjNTIuMTUuMjEuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjEuMDMuMDAjRG9tZXN0aWMgbXVncyM1Mi4xNS4yMS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMS4wNC4wMCNEb21lc3RpYyBzdGVtd2FyZSM1Mi4xNS4yMS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMi4wMC4wMCNEaXNod2FzaGluZyBhbmQgZGlzaCBzdG9yYWdlIGFjY2Vzc29yaWVzIzUyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIyLjAxLjAwI1NoZWxmIGxpbmVyIzUyLjE1LjIyLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIyLjAyLjAwI0Rpc2ggZHJhaW5lciM1Mi4xNS4yMi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMi4wMy4wMCNTb2FwIGRpc3BlbnNpbmcgYnJ1c2gjNTIuMTUuMjIuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMDAuMDAuMDAjQ29uc3VtZXIgZWxlY3Ryb25pY3MjNTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDAuMDAjQXVkaW8gYW5kIHZpc3VhbCBlcXVpcG1lbnQjNTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDEuMDAjQ29tcGFjdCBkaXNjIHBsYXllcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDIuMDAjQ2Fzc2V0dGUgcGxheWVycyBvciByZWNvcmRlcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDMuMDAjRGlnaXRhbCB2aWRlbyBkaXNjIHBsYXllcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDQuMDAjVmlkZW8gY2Fzc2V0dGUgcmVjb3JkZXJzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjA1LjAwI1RlbGV2aXNpb25zIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjA2LjAwI0hlYWRwaG9uZXMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDcuMDAjQ2xvY2sgcmFkaW9zIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjA4LjAwI0xhc2VyIGRpc2MgcGxheWVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4wOS4wMCNQb3J0YWJsZSBzdGVyZW8gc3lzdGVtcyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xMC4wMCNIb21lIHN0ZXJlbyBzeXN0ZW1zIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjExLjAwI1JhZGlvcyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xMi4wMCNTcGVha2VycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xMy4wMCNDb21iaW5hdGlvbiB0ZWxldmlzaW9uIHZpZGVvIGNhc3NldHRlIHJlY29yZGVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xNC4wMCNIZWFkcGhvbmVzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjE1LjAwI0NvbXBhY3QgZGlzayBwbGF5ZXJzIG9yIHJlY29yZGVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xNi4wMCNEaWdpdGFsIHZpZGVvIGRpc2sgcGxheWVycyBvciByZWNvcmRlcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMTcuMDAjRXF1YWxpemVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xOC4wMCNHbG9iYWwgcG9zaXRpb25pbmcgc3lzdGVtIHJlY2VpdmVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xOS4wMCNIZWFkcGhvbmVzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjIwLjAwI01pY3JvcGhvbmVzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjIxLjAwI011bHRpbWVkaWEgcmVjZWl2ZXJzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjIyLjAwI1JhZGlvIGZyZXF1ZW5jeSBzY2FubmVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4yMy4wMCNSYWRpbyBmcmVxdWVuY3kgdHJhbnNtaXR0ZXJzcmVjZWl2ZXJzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjI0LjAwI1JhZGlvIHJlY2VpdmVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4yNS4wMCNSZW1vdGUgY29udHJvbCM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4yNi4wMCNTYXRlbGxpdGUgcmVjZWl2ZXJzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjI3LjAwI1N1Yndvb2ZlcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMjguMDAjVGVsZXZpc2lvbnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMjkuMDAjVmlkZW8gY2Fzc2V0dGUgcGxheWVycyBvciByZWNvcmRlcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMzAuMDAjVmlkZW8gbW9uaXRvcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMzEuMDAjUmFkaW8gcGhvbm9ncmFwaHMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMzIuMDAjS2FyYW9rZSBzeXN0ZW1zIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjMzLjAwI01lZ2FwaG9uZXMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMzQuMDAjSW50ZWdyYXRlZCBjaXJjdXQgSUMgY2hpcCByZWNvcmRlciM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4zNS4wMCNEaWdpdGFsIHZvaWNlIHJlY29yZGVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4zNi4wMCNNaW5pZGlzYyBwbGF5ZXJzIG9yIHJlY29yZGVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNi4wMC4wMCNBdWRpbyB2aXN1YWwgZXF1aXBtZW50IGFjY2Vzc29yaWVzIzUyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE2LjE2LjAxLjAwI0Nhc3NldHRlIHN0b3JhZ2UjNTIuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTYuMDIuMDAjQXVkaW8gb3IgdmlkZW8gaGVhZCBjbGVhbmVycyM1Mi4xNi4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNy4wMC4wMC4wMCNEb21lc3RpYyB3YWxsIHRyZWF0bWVudHMjNTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTcuMTAuMDAuMDAjQmF0aHJvb20gd2FsbCB0cmVhdG1lbnRzIzUyLjE3LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE3LjEwLjAxLjAwI0hhbmdpbmcgdG9pbGV0cnkgb3JnYW5pemVyIG9yIHNoZWxmIzUyLjE3LjEwLjAwLjAwCi11bnNwc2M3IzUzLjAwLjAwLjAwLjAwI0FwcGFyZWwgYW5kIEx1Z2dhZ2UgYW5kIFBlcnNvbmFsIENhcmUgUHJvZHVjdHMjNTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMDAuMDAuMDAjQ2xvdGhpbmcjNTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTUuMDAuMDAjU2xhY2tzIGFuZCB0cm91c2VycyBhbmQgc2hvcnRzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjE1LjAxLjAwI0JveXMgc2xhY2tzIG9yIHRyb3VzZXJzIG9yIHNob3J0cyM1My4xMC4xNS4wMC4wMAotdW5zcHNjNyM1My4xMC4xNS4wMi4wMCNNZW5zIHNsYWNrcyBvciB0cm91c2VycyBvciBzaG9ydHMjNTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTUuMDMuMDAjR2lybHMgc2xhY2tzIG9yIHRyb3VzZXJzIG9yIHNob3J0cyM1My4xMC4xNS4wMC4wMAotdW5zcHNjNyM1My4xMC4xNS4wNC4wMCNXb21lbnMgc2xhY2tzIG9yIHRyb3VzZXJzIG9yIHNob3J0cyM1My4xMC4xNS4wMC4wMAotdW5zcHNjNyM1My4xMC4xNS4wNS4wMCNJbmZhbnRzIHNsYWNrcyBvciB0cm91c2VycyBvciBzaG9ydHMjNTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTYuMDAuMDAjU2hpcnRzIGFuZCBibG91c2VzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjE2LjAxLjAwI0JveXMgc2hpcnRzIzUzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE2LjAyLjAwI01lbnMgc2hpcnRzIzUzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE2LjAzLjAwI0dpcmxzIHNoaXJ0cyBvciBibG91c2VzIzUzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE2LjA0LjAwI1dvbWVucyBzaGlydHMgb3IgYmxvdXNlcyM1My4xMC4xNi4wMC4wMAotdW5zcHNjNyM1My4xMC4xNi4wNS4wMCNJbmZhbnRzIHNoaXJ0cyBvciBibG91c2VzIzUzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE3LjAwLjAwI1N3ZWF0ZXJzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjE3LjAxLjAwI0JveXMgc3dlYXRlcnMjNTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTcuMDIuMDAjTWVucyBzd2VhdGVycyM1My4xMC4xNy4wMC4wMAotdW5zcHNjNyM1My4xMC4xNy4wMy4wMCNHaXJscyBzd2VhdGVycyM1My4xMC4xNy4wMC4wMAotdW5zcHNjNyM1My4xMC4xNy4wNC4wMCNXb21lbnMgc3dlYXRlcnMjNTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTcuMDUuMDAjSW5mYW50cyBzd2VhdGVycyM1My4xMC4xNy4wMC4wMAotdW5zcHNjNyM1My4xMC4xOC4wMC4wMCNDb2F0cyBhbmQgamFja2V0cyM1My4xMC4wMC4wMC4wMAotdW5zcHNjNyM1My4xMC4xOC4wMS4wMCNCb3lzIGNvYXRzIG9yIGphY2tldHMjNTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTguMDIuMDAjTWVucyBjb2F0cyBvciBqYWNrZXRzIzUzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE4LjAzLjAwI0dpcmxzIGNvYXRzIG9yIGphY2tldHMjNTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTguMDQuMDAjV29tZW5zIGNvYXRzIG9yIGphY2tldHMjNTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTguMDUuMDAjSW5mYW50cyBjb2F0cyBvciBqYWNrZXRzIzUzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE5LjAwLjAwI1N1aXRzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjE5LjAxLjAwI0JveXMgc3VpdHMjNTMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTkuMDIuMDAjTWVucyBzdWl0cyM1My4xMC4xOS4wMC4wMAotdW5zcHNjNyM1My4xMC4xOS4wMy4wMCNHaXJscyBzdWl0cyM1My4xMC4xOS4wMC4wMAotdW5zcHNjNyM1My4xMC4xOS4wNC4wMCNXb21lbnMgc3VpdHMjNTMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTkuMDUuMDAjSW5mYW50cyBzdWl0cyM1My4xMC4xOS4wMC4wMAotdW5zcHNjNyM1My4xMC4yMC4wMC4wMCNEcmVzc2VzIGFuZCBza2lydHMgYW5kIHNhcmlzIGFuZCBraW1vbm9zIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIwLjAxLjAwI0dpcmxzIGRyZXNzZXMgb3Igc2tpcnRzIG9yIHNhcmlzIG9yIGtpbW9ub3MjNTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjAuMDIuMDAjV29tZW5zIGRyZXNzZXMgb3Igc2tpcnRzIG9yIHNhcmlzIG9yIGtpbW9ub3MjNTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjAuMDMuMDAjSW5mYW50cyBkcmVzc2VzIG9yIHNraXJ0cyBvciBzYXJpcyBvciBraW1vbm9zIzUzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIxLjAwLjAwI092ZXJhbGxzIGFuZCBjb3ZlcmFsbHMjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjEuMDEuMDAjQm95cyBvdmVyYWxscyBvciBjb3ZlcmFsbHMjNTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjEuMDIuMDAjTWVucyBvdmVyYWxscyBvciBjb3ZlcmFsbHMjNTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjEuMDMuMDAjR2lybHMgb3ZlcmFsbHMgb3IgY292ZXJhbGxzIzUzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIxLjA0LjAwI1dvbWVucyBvdmVyYWxscyBvciBjb3ZlcmFsbHMjNTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjEuMDUuMDAjSW5mYW50cyBvdmVyYWxscyBvciBjb3ZlcmFsbHMjNTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjIuMDAuMDAjRm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIyLjAxLjAwI0JveXMgZm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIyLjAyLjAwI01lbnMgZm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIyLjAzLjAwI0dpcmxzIGZvbGtsb3JpYyBjbG90aGluZyM1My4xMC4yMi4wMC4wMAotdW5zcHNjNyM1My4xMC4yMi4wNC4wMCNXb21lbnMgZm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIyLjA1LjAwI0luZmFudHMgZm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIzLjAwLjAwI1VuZGVyZ2FybWVudHMjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjMuMDEuMDAjVW5kZXJzaGlydHMjNTMuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjMuMDIuMDAjU2xpcHMjNTMuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjMuMDMuMDAjVW5kZXJwYW50cyM1My4xMC4yMy4wMC4wMAotdW5zcHNjNyM1My4xMC4yMy4wNC4wMCNCcmFzc2llcmVzIzUzLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIzLjA1LjAwI0luZmFudCBkaWFwZXJzIzUzLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIzLjA2LjAwI0FkdWx0IGRpYXBlcnMjNTMuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjMuMDcuMDAjQm9keSBzaGFwaW5nIGdhcm1lbnRzIzUzLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUzLjEwLjI0LjAwLjAwI0hvc2llcnkjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjQuMDEuMDAjU3RvY2tpbmdzIzUzLjEwLjI0LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI0LjAyLjAwI1NvY2tzIzUzLjEwLjI0LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI0LjAzLjAwI1BhbnR5IGhvc2UjNTMuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjQuMDQuMDAjVGlnaHRzIzUzLjEwLjI0LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjAwLjAwI0Nsb3RoaW5nIGFjY2Vzc29yaWVzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjAxLjAwI0JlbHRzIG9yIHN1c3BlbmRlcnMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDIuMDAjVGllcyBvciBzY2FydmVzIG9yIG11ZmZsZXJzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjAzLjAwI0hhdHMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDQuMDAjR2xvdmVzIG9yIG1pdHRlbnMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDUuMDAjVW1icmVsbGFzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjA2LjAwI1N3ZWF0IGJhbmRzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjA3LjAwI0Nsb3RoaW5nIGhhbmdlcnMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDguMDAjQXJtYmFuZHMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDkuMDAjR2FydGVycyM1My4xMC4yNS4wMC4wMAotdW5zcHNjNyM1My4xMC4yNS4xMC4wMCNUYXNzbGVzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjExLjAwI0JhbmRhbm5hcyM1My4xMC4yNS4wMC4wMAotdW5zcHNjNyM1My4xMC4yNS4xMi4wMCNIYW5ka2VyY2hpZWZzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjEzLjAwI0hlYWRiYW5kcyM1My4xMC4yNS4wMC4wMAotdW5zcHNjNyM1My4xMC4yNS4xNC4wMCNQb2NrZXQgcHJvdGVjdG9ycyM1My4xMC4yNS4wMC4wMAotdW5zcHNjNyM1My4xMC4yNS4xNS4wMCNCdXR0b24gY292ZXJzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI2LjAwLjAwI05pZ2h0d2VhciM1My4xMC4wMC4wMC4wMAotdW5zcHNjNyM1My4xMC4yNi4wMS4wMCNCb3lzIHBhamFtYXMgb3IgbmlnaHRzaGlydHMjNTMuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjYuMDIuMDAjTWVucyBwYWphbWFzIG9yIG5pZ2h0c2hpcnRzIzUzLjEwLjI2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI2LjAzLjAwI0dpcmxzIHBhamFtYXMgb3IgbmlnaHRzaGlydHMjNTMuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjYuMDQuMDAjV29tZW5zIHBhamFtYXMgb3IgbmlnaHRzaGlydHMjNTMuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjYuMDUuMDAjSW5mYW50cyBwYWphbWFzIG9yIG5pZ2h0c2hpcnRzIzUzLjEwLjI2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI2LjA2LjAwI0JhdGggcm9iZXMjNTMuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjcuMDAuMDAjVW5pZm9ybXMjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjcuMDEuMDAjTWlsaXRhcnkgdW5pZm9ybXMjNTMuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjcuMDIuMDAjQ3VzdG9tcyB1bmlmb3JtcyM1My4xMC4yNy4wMC4wMAotdW5zcHNjNyM1My4xMC4yNy4wMy4wMCNQb2xpY2UgdW5pZm9ybXMjNTMuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjguMDAuMDAjU3dpbXdlYXIjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjguMDEuMDAjTWVucyBzd2ltd2VhciM1My4xMC4yOC4wMC4wMAotdW5zcHNjNyM1My4xMC4yOC4wMi4wMCNXb21lbnMgc3dpbXdlYXIjNTMuMTAuMjguMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjguMDMuMDAjQm95cyBzd2ltd2VhciM1My4xMC4yOC4wMC4wMAotdW5zcHNjNyM1My4xMC4yOC4wNC4wMCNHaXJscyBzd2ltd2VhciM1My4xMC4yOC4wMC4wMAotdW5zcHNjNyM1My4xMC4yOC4wNS4wMCNJbmZhbnRzIHN3aW13ZWFyIzUzLjEwLjI4LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI5LjAwLjAwI0F0aGxldGljIHdlYXIjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjkuMDEuMDAjV29tZW5zIGF0aGxldGljIHdlYXIjNTMuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjkuMDIuMDAjTWVucyBhdGhsZXRpYyB3ZWFyIzUzLjEwLjI5LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI5LjAzLjAwI0JveXMgYXRobGV0aWMgd2VhciM1My4xMC4yOS4wMC4wMAotdW5zcHNjNyM1My4xMC4yOS4wNC4wMCNHaXJscyBhdGhsZXRpYyB3ZWFyIzUzLjEwLjI5LjAwLjAwCi11bnNwc2M3IzUzLjExLjAwLjAwLjAwI0Zvb3R3ZWFyIzUzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjExLjE1LjAwLjAwI0Jvb3RzIzUzLjExLjAwLjAwLjAwCi11bnNwc2M3IzUzLjExLjE1LjAxLjAwI01lbnMgYm9vdHMjNTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTUuMDIuMDAjV29tZW5zIGJvb3RzIzUzLjExLjE1LjAwLjAwCi11bnNwc2M3IzUzLjExLjE1LjAzLjAwI0JveXMgYm9vdHMjNTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTUuMDQuMDAjR2lybHMgYm9vdHMjNTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTUuMDUuMDAjSW5mYW50cyBib290cyM1My4xMS4xNS4wMC4wMAotdW5zcHNjNyM1My4xMS4xNi4wMC4wMCNTaG9lcyM1My4xMS4wMC4wMC4wMAotdW5zcHNjNyM1My4xMS4xNi4wMS4wMCNNZW5zIHNob2VzIzUzLjExLjE2LjAwLjAwCi11bnNwc2M3IzUzLjExLjE2LjAyLjAwI1dvbWVucyBzaG9lcyM1My4xMS4xNi4wMC4wMAotdW5zcHNjNyM1My4xMS4xNi4wMy4wMCNCb3lzIHNob2VzIzUzLjExLjE2LjAwLjAwCi11bnNwc2M3IzUzLjExLjE2LjA0LjAwI0dpcmxzIHNob2VzIzUzLjExLjE2LjAwLjAwCi11bnNwc2M3IzUzLjExLjE2LjA1LjAwI0luZmFudHMgc2hvZXMjNTMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTcuMDAuMDAjU2xpcHBlcnMjNTMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTcuMDEuMDAjTWVucyBzbGlwcGVycyM1My4xMS4xNy4wMC4wMAotdW5zcHNjNyM1My4xMS4xNy4wMi4wMCNXb21lbnMgc2xpcHBlcnMjNTMuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTcuMDMuMDAjQm95cyBzbGlwcGVycyM1My4xMS4xNy4wMC4wMAotdW5zcHNjNyM1My4xMS4xNy4wNC4wMCNHaXJscyBzbGlwcGVycyM1My4xMS4xNy4wMC4wMAotdW5zcHNjNyM1My4xMS4xNy4wNS4wMCNJbmZhbnRzIHNsaXBwZXJzIzUzLjExLjE3LjAwLjAwCi11bnNwc2M3IzUzLjExLjE4LjAwLjAwI1NhbmRhbHMjNTMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTguMDEuMDAjTWVucyBzYW5kYWxzIzUzLjExLjE4LjAwLjAwCi11bnNwc2M3IzUzLjExLjE4LjAyLjAwI1dvbWVucyBzYW5kYWxzIzUzLjExLjE4LjAwLjAwCi11bnNwc2M3IzUzLjExLjE4LjAzLjAwI0JveXMgc2FuZGFscyM1My4xMS4xOC4wMC4wMAotdW5zcHNjNyM1My4xMS4xOC4wNC4wMCNHaXJscyBzYW5kYWxzIzUzLjExLjE4LjAwLjAwCi11bnNwc2M3IzUzLjExLjE4LjA1LjAwI0luZmFudHMgc2FuZGFscyM1My4xMS4xOC4wMC4wMAotdW5zcHNjNyM1My4xMS4xOS4wMC4wMCNBdGhsZXRpYyBmb290d2VhciM1My4xMS4wMC4wMC4wMAotdW5zcHNjNyM1My4xMS4xOS4wMS4wMCNNZW5zIGF0aGxldGljIGZvb3R3ZWFyIzUzLjExLjE5LjAwLjAwCi11bnNwc2M3IzUzLjExLjE5LjAyLjAwI1dvbWVucyBhdGhsZXRpYyBmb290d2VhciM1My4xMS4xOS4wMC4wMAotdW5zcHNjNyM1My4xMS4xOS4wMy4wMCNCb3lzIGF0aGxldGljIGZvb3R3ZWFyIzUzLjExLjE5LjAwLjAwCi11bnNwc2M3IzUzLjExLjE5LjA0LjAwI0dpcmxzIGF0aGxldGljIGZvb3R3ZWFyIzUzLjExLjE5LjAwLjAwCi11bnNwc2M3IzUzLjExLjE5LjA1LjAwI0luZmFudHMgYXRobGV0aWMgZm9vdHdlYXIjNTMuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMjAuMDAuMDAjU2hvZSBhY2Nlc3NvcmllcyM1My4xMS4wMC4wMC4wMAotdW5zcHNjNyM1My4xMS4yMC4wMS4wMCNTaG9laG9ybnMjNTMuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMjAuMDIuMDAjU2hvZWxhY2VzIzUzLjExLjIwLjAwLjAwCi11bnNwc2M3IzUzLjEyLjAwLjAwLjAwI0x1Z2dhZ2UgYW5kIGhhbmRiYWdzIGFuZCBwYWNrcyBhbmQgY2FzZXMjNTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTUuMDAuMDAjTHVnZ2FnZSM1My4xMi4wMC4wMC4wMAotdW5zcHNjNyM1My4xMi4xNS4wMS4wMCNHYXJtZW50IGJhZ3MjNTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTUuMDIuMDAjTHVnZ2FnZSBzZXRzIzUzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE1LjAzLjAwI0luZGl2aWR1YWwgbHVnZ2FnZSBwaWVjZXMjNTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTYuMDAuMDAjUHVyc2VzIGFuZCBoYW5kYmFncyBhbmQgYmFncyM1My4xMi4wMC4wMC4wMAotdW5zcHNjNyM1My4xMi4xNi4wMS4wMCNIYW5kYmFncyBvciBwdXJzZXMjNTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTYuMDIuMDAjRHVmZmxlIGJhZ3MjNTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTYuMDMuMDAjQmFja3BhY2tzIzUzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE2LjA0LjAwI0V5ZWdsYXNzIGNhc2VzIzUzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE2LjA1LjAwI0NvaW4gcHVyc2VzIzUzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE2LjA2LjAwI0xpcHN0aWNrIGNhc2VzIzUzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE2LjA3LjAwI0NpZ2FyIGNhc2UjNTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTcuMDAuMDAjQnVzaW5lc3MgY2FzZXMjNTMuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTcuMDEuMDAjQnJpZWZjYXNlcyM1My4xMi4xNy4wMC4wMAotdW5zcHNjNyM1My4xMi4xNy4wMi4wMCNBdHRhY2hlcyM1My4xMi4xNy4wMC4wMAotdW5zcHNjNyM1My4xMi4xNy4wNC4wMCNQb3J0Zm9saW9zIzUzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE3LjA1LjAwI0VxdWlwbWVudCBjYXNlcyM1My4xMi4xNy4wMC4wMAotdW5zcHNjNyM1My4xMi4xNy4wNi4wMCNDb21wdXRlciBiYWdzIzUzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE4LjAwLjAwI1RyYXZlbCBraXRzIGFuZCBhY2Nlc3NvcmllcyM1My4xMi4wMC4wMC4wMAotdW5zcHNjNyM1My4xMi4xOC4wMS4wMCNUcmF2ZWwga2l0cyM1My4xMi4xOC4wMC4wMAotdW5zcHNjNyM1My4xMi4xOC4wMi4wMCNUcmF2ZWwgY2FydHMjNTMuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTguMDMuMDAjR2FybWVudCBicnVzaGVzIzUzLjEyLjE4LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE4LjA0LjAwI01ha2V1cCBvciBtYW5pY3VyZSBjYXNlcyM1My4xMi4xOC4wMC4wMAotdW5zcHNjNyM1My4xMy4wMC4wMC4wMCNQZXJzb25hbCBjYXJlIHByb2R1Y3RzIzUzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEzLjE1LjAwLjAwI0RlbnRhbCM1My4xMy4wMC4wMC4wMAotdW5zcHNjNyM1My4xMy4xNS4wMS4wMCNNb3V0aHdhc2gjNTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTUuMDIuMDAjVG9vdGhwYXN0ZSM1My4xMy4xNS4wMC4wMAotdW5zcHNjNyM1My4xMy4xNS4wMy4wMCNUb290aGJydXNoZXMjNTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTUuMDQuMDAjRGVudGFsIGZsb3NzIzUzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE1LjA1LjAwI0luZmFudCBzb290aGVyIG9yIHBhY2lmaWVyIG9yIGR1bW15IzUzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE1LjA2LjAwI0RlbnRhbCBraXRzIzUzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE1LjA3LjAwI1Rvb3RocGlja3MjNTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTUuMDguMDAjRGVudHVyZSBjbGVhbmluZyB0YWJsZXRzIzUzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjAwLjAwI0JhdGggYW5kIGJvZHkjNTMuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMDEuMDAjU2hvd2VyIGNhcHMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMDIuMDAjSGFpciBjYXJlIHN1cHBsaWVzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjAzLjAwI1Jhem9ycyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4wNC4wMCNIYWlyIGNvbWJzIG9yIGJydXNoZXMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMDUuMDAjVmFuaXR5IGtpdHMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMDYuMDAjRGVvZG9yYW50cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4wNy4wMCNIYW5kIG9yIGJvZHkgbG90aW9ucyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4wOC4wMCNTb2FwcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4wOS4wMCNTdW4gcHJvdGVjdGlvbiBwcm9kdWN0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xMC4wMCNFeWUgY2FyZSBzdXBwbGllcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xMS4wMCNTaGF2aW5nIGNyZWFtcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xMi4wMCNCYXRoIGdlbHMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMTMuMDAjU2tpbiBjYXJlIHByb2R1Y3RzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjE0LjAwI0Zvb3QgY2FyZSBwcm9kdWN0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xNS4wMCNGZW1pbmluZSBoeWdpZW5lIHByb2R1Y3RzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjE2LjAwI1BhcmEgcGhhcm1hY2V1dGljYWwgY3JlYW1zIG9yIGxvdGlvbnMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMTcuMDAjTWFuaWN1cmUgaW1wbGVtZW50cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xOC4wMCNQZWRpY3VyZSBpbXBsZW1lbnRzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjE5LjAwI0Nvc21ldGljcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yMC4wMCNQZXJmdW1lcyBvciBjb2xvZ25lcyBvciBmcmFncmFuY2VzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjIxLjAwI05haWwgY2xpcHBlcnMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMjIuMDAjQ29uZG9tcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yMy4wMCNIYWlyIHJlbW92YWwgb3IgZGVwaWxhdG9yeSBwcm9kdWN0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yNC4wMCNEaXNwb3NhYmxlIHBlcnNvbmFsIHdpcGVzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjI1LjAwI0hhaXIgb3IgYmVhcmQgbmV0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yNi4wMCNIYW5kIHNhbml0aXplciM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yNy4wMCNIYW5kIGNsZWFuZXIjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMjguMDAjU2hhbXBvb3MjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMjkuMDAjTWFrZXVwIGtpdHMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMzAuMDAjTGlwIGJhbG0jNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMzEuMDAjVGF0dG9vcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4zMi4wMCNIb3Qgcm9sbGVycyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4zMy4wMCNCYXJyZXR0ZXMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMzQuMDAjQ2hlbWljYWwgcHJvdGVjdGlvbiBwcm9kdWN0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4zNS4wMCNTaGF2aW5nIGJydXNoZXMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTcuMDAuMDAjRXlld2VhciM1My4xMy4wMC4wMC4wMAotdW5zcHNjNyM1My4xMy4xNy4wMS4wMCNPcHRpY2FsIGdsYXNzZXMgb3Igc3BlY3RhY2xlcyM1My4xMy4xNy4wMC4wMAotdW5zcHNjNyM1My4xMy4xNy4wMi4wMCNDb250YWN0IGxlbnNlcyM1My4xMy4xNy4wMC4wMAotdW5zcHNjNyM1My4xMy4xNy4wMy4wMCNTdW5nbGFzc2VzIzUzLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUzLjE0LjAwLjAwLjAwI1Nld2luZyBzdXBwbGllcyBhbmQgYWNjZXNzb3JpZXMjNTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTUuMDAuMDAjU2V3aW5nIGZhc3RlbmVycyM1My4xNC4wMC4wMC4wMAotdW5zcHNjNyM1My4xNC4xNS4wMS4wMCNTdHJhaWdodCBwaW5zIzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE1LjAyLjAwI1NhZmV0eSBwaW5zIzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE1LjAzLjAwI1ppcHBlcnMjNTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTUuMDQuMDAjQnVja2xlcyM1My4xNC4xNS4wMC4wMAotdW5zcHNjNyM1My4xNC4xNS4wNS4wMCNCdXR0b25zIzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE1LjA2LjAwI1NuYXBzIzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE1LjA3LjAwI0NsYXNwcyM1My4xNC4xNS4wMC4wMAotdW5zcHNjNyM1My4xNC4xNS4wOC4wMCNHYXJtZW50IHJpdmV0IzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjAwLjAwI01pc2NlbGxhbmVvdXMgc2V3aW5nIHN1cHBsaWVzIzUzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjAxLjAwI1BpbiBjdXNoaW9ucyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wMi4wMCNTZXdpbmcga2l0cyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wMy4wMCNUaGltYmxlcyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wNC4wMCNTZXdpbmcgcGF0dGVybnMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMDUuMDAjU2V3aW5nIG5lZWRsZXMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMDYuMDAjQm9iYmlucyBvciBib2JiaW4gaG9sZGVycyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wNy4wMCNTZWFtIGdhdWdlIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjA4LjAwI0JvZGtpbiM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wOS4wMCNMb29wIHR1cm5lciM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4xMC4wMCNGYWJyaWMgb3IgdGFpbG9ycyBjaGFsayBob2xkZXJzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjExLjAwI0ZhYnJpYyBtYXJrZXJzIG9yIGZhYnJpYyBwZW5jaWxzIG9yIGZhYnJpYyBjaGFsayM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4xMi4wMCNTZXJyYXRlZCBwYXR0ZXJuIHRyYWNpbmcgd2hlZWwjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMTMuMDAjVHJhbnNmZXIgcGFwZXIjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMTQuMDAjVGFwZXN0cnkgbmVlZGxlcyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4xNS4wMCNXZWF2aW5nIG5lZWRsZXMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMTYuMDAjTG9vcGVyIGxvb21zIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjE3LjAwI0NvdHRvbiBqZXJzZXkgbG9vcHMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMTguMDAjTmVlZGxlcG9pbnQgY2FudmFzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjE5LjAwI01hZ25ldCB3YW5kcyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4yMC4wMCNTZWFtIHJpcHBlciM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4yMS4wMCNOZWVkbGUgdGhyZWFkZXIjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMjIuMDAjRHJlc3NtYWtlcnMgcnVsZXIjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMjMuMDAjTGlxdWlkIHRocmVhZCBsb2NrIG9yIHJlaW5mb3JjZXIjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMjQuMDAjQ3Jvc3Mgc3RpdGNoIGZhYnJpYyBvciBuZWVkbGVzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjI1LjAwI0Nyb3NzIHN0aXRjaCBkZXNpZ25zIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjI2LjAwI0VtYnJvaWRlcnkgaG9vcHMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMjcuMDAjQ3JvY2hldCBob29rcyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4yOC4wMCNRdWlsdGVycyBiYXN0aW5nIHRvb2xzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjI5LjAwI1F1aWx0ZXJzIHBpbnMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMzAuMDAjUGF0dGVybiBjdXR0aW5nIG1hdHMgb3IgYm9hcmRzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzU0LjAwLjAwLjAwLjAwI1RpbWVwaWVjZXMgYW5kIEpld2VscnkgYW5kIEdlbXN0b25lIFByb2R1Y3RzIzU0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzU0LjEwLjAwLjAwLjAwI0pld2VscnkjNTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTUuMDAuMDAjRmluZSBqZXdlbHJ5IzU0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzU0LjEwLjE1LjAxLjAwI0dvbGQgb3Igc2lsdmVyIG9yIHBsYXRpbnVtIGNoYWlucyM1NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNS4wMi4wMCNGaW5lIGpld2VscnkgbmVja2xhY2VzIzU0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU0LjEwLjE1LjAzLjAwI0ZpbmUgamV3ZWxyeSByaW5ncyM1NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNS4wNC4wMCNGaW5lIGpld2VscnkgZWFycmluZ3MjNTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTUuMDUuMDAjRmluZSBib2R5IGpld2VscnkjNTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTUuMDYuMDAjRmluZSBqZXdlbHJ5IGJyYWNlbGV0cyM1NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNS4wNy4wMCNUaWFyYXMjNTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTYuMDAuMDAjSW1pdGF0aW9uIGpld2VscnkjNTQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTYuMDEuMDAjQnJhY2VsZXRzIzU0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzU0LjEwLjE2LjAyLjAwI05lY2tsYWNlcyM1NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNi4wMy4wMCNSaW5ncyM1NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNi4wNC4wMCNFYXJyaW5ncyM1NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNi4wNS4wMCNCb2R5IGpld2VscnkjNTQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMDAuMDAuMDAjVGltZXBpZWNlcyM1NC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1NC4xMS4xNS4wMC4wMCNXYXRjaGVzIzU0LjExLjAwLjAwLjAwCi11bnNwc2M3IzU0LjExLjE1LjAxLjAwI1dyaXN0IHdhdGNoZXMjNTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTUuMDIuMDAjUG9ja2V0IHdhdGNoZXMjNTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTYuMDAuMDAjQ2xvY2tzIzU0LjExLjAwLjAwLjAwCi11bnNwc2M3IzU0LjExLjE2LjAxLjAwI1dhbGwgY2xvY2tzIzU0LjExLjE2LjAwLjAwCi11bnNwc2M3IzU0LjExLjE2LjAyLjAwI01hbnRlbCBvciB0YWJsZSBjbG9ja3MjNTQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTYuMDMuMDAjRnJlZSBzdGFuZGluZyBjbG9ja3MjNTQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTYuMDQuMDAjSG91cmdsYXNzZXMjNTQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDAuMDAjV2F0Y2ggb3IgY2xvY2sgcGFydHMjNTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDEuMDAjV2F0Y2ggb3IgY2xvY2sgZGlhbHMjNTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDIuMDAjV2F0Y2ggb3IgY2xvY2sgY3J5c3RhbHMjNTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDMuMDAjV2F0Y2ggb3IgY2xvY2sgcGxhdGVzIG9yIGJyaWRnZXMjNTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDQuMDAjV2F0Y2ggc3RyYXBzIG9yIGJhbmRzIG9yIGJyYWNlbGV0cyBvciBmb2JzIzU0LjExLjE3LjAwLjAwCi11bnNwc2M3IzU0LjEyLjAwLjAwLjAwI0dlbXN0b25lcyM1NC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1NC4xMi4xNS4wMC4wMCNQcmVjaW91cyBzdG9uZXMjNTQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTUuMDEuMDAjRGlhbW9uZCBnZW1zdG9uZXMjNTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTUuMDIuMDAjRW1lcmFsZCBnZW1zdG9uZXMjNTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTUuMDMuMDAjUnVieSBnZW1zdG9uZXMjNTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTUuMDQuMDAjU2FwcGhpcmUgZ2Vtc3RvbmVzIzU0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU0LjEyLjE2LjAwLjAwI1NlbWkgcHJlY2lvdXMgc3RvbmVzIzU0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU0LjEyLjE2LjAxLjAwI0dhcm5ldCBnZW1zdG9uZXMjNTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTYuMDIuMDAjSmFkZSBnZW1zdG9uZXMjNTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTYuMDMuMDAjT3BhbCBnZW1zdG9uZXMjNTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTcuMDAuMDAjUGVhcmxzIzU0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU0LjEyLjE3LjAxLjAwI0N1bHR1cmVkIHBlYXJscyM1NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NC4xMi4xNy4wMi4wMCNOYXR1cmFsIHBlYXJscyM1NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NC4xMi4xOC4wMC4wMCNJbmR1c3RyaWFsIHByZWNpb3VzIGFuZCBzZW1pIHByZWNpb3VzIHN0b25lcyM1NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM1NC4xMi4xOC4wMS4wMCNJbmR1c3RyaWFsIGRpYW1vbmRzIzU0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzU0LjEyLjE4LjAyLjAwI0luZHVzdHJpYWwgZ2FybmV0cyM1NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM1NS4wMC4wMC4wMC4wMCNQdWJsaXNoZWQgUHJvZHVjdHMjNTUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMDAuMDAuMDAjUHJpbnRlZCBtZWRpYSM1NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4wMC4wMCNQcmludGVkIHB1YmxpY2F0aW9ucyM1NS4xMC4wMC4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4wMS4wMCNDaGFydHMgb3IgbWFwcyBvciBhdGxhc2VzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjAyLjAwI0RpcmVjdG9yaWVzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjAzLjAwI0NhdGFsb2dzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjA0LjAwI05ld3NwYXBlcnMjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMDUuMDAjQ29taWMgYm9va3MjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMDYuMDAjTWFnYXppbmVzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjA3LjAwI1BpY3R1cmUgb3IgZHJhd2luZyBvciBjb2xvcmluZyBib29rcyBmb3IgY2hpbGRyZW4jNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMDguMDAjRW5jeWNsb3BlZGlhcyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4wOS4wMCNFZHVjYXRpb25hbCBvciB2b2NhdGlvbmFsIHRleHRib29rcyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4xMC4wMCNMZWlzdXJlIHJlYWRpbmcgYm9va3MjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMTEuMDAjUmVmZXJlbmNlIGJvb2tzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjEyLjAwI0RpY3Rpb25hcmllcyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4xMy4wMCNUcmFkaW5nIGNhcmRzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjE0LjAwI1NoZWV0IG11c2ljIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjE1LjAwI1Byb21vdGlvbmFsIG1hdGVyaWFsIG9yIGFubnVhbCByZXBvcnRzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjE2LjAwI09wZXJhdGlvbiBhbmQgaW5zdHJ1Y3Rpb24gbWFudWFscyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4xNy4wMCNDbGVhcmFuY2UgYW5kIGRpbWVuc2lvbmFsIGRyYXdpbmdzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjE4LjAwI1RlY2huaWNhbCBkaWFncmFtcyBvciBkcmF3aW5ncyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4xOS4wMCNQZXJpb2RpY2FscyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4yMC4wMCNJbnN0cnVjdGlvbiBzaGVldHMgb3IgYm9va2xldHMjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMjEuMDAjT3duZXIgb3IgdXNlciBtYW51YWxzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjIyLjAwI1RlcnJlc3RyaWFsIG9yIGNlbGVzdGlhbCBnbG9iZXMjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMjMuMDAjRXhlcmNpc2UgYm9va3MjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMjQuMDAjUmVmZXJlbmNlIGJvb2tzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjI1LjAwI0VuY3ljbG9wZWRpYXMjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMjYuMDAjRGljdGlvbmFyaWVzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjAwLjAwLjAwI0VsZWN0cm9uaWMgcmVmZXJlbmNlIG1hdGVyaWFsIzU1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjAwLjAwI0VsZWN0cm9uaWMgcHVibGljYXRpb25zIGFuZCBtdXNpYyM1NS4xMS4wMC4wMC4wMAotdW5zcHNjNyM1NS4xMS4xNS4wMS4wMCNFbGVjdHJvbmljIGRpcmVjdG9yaWVzIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjAyLjAwI0VsZWN0cm9uaWMgZGljdGlvbmFyaWVzIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjAzLjAwI0VsZWN0cm9uaWMgZW5jeWNsb3BlZGlhcyM1NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMS4xNS4wNC4wMCNFbGVjdHJvbmljIGNhdGFsb2dzIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjA1LjAwI0Jvb2tzIG9uIHRhcGUgb3IgY29tcGFjdCBkaXNjIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjA2LjAwI0VsZWN0cm9uaWMgbWFnYXppbmVzIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjA3LjAwI0VsZWN0cm9uaWMgbmV3c3BhcGVycyM1NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMS4xNS4wOC4wMCNFbGVjdHJvbmljIGNoYXJ0cyBvciBtYXBzIG9yIGF0bGFzZXMjNTUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTEuMTUuMDkuMDAjQmFja2dyb3VuZCBtdXNpYyM1NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMS4xNS4xMC4wMCNNb3Rpb24gcGljdHVyZXMgb24gY2VsbHVsb2lkIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjExLjAwI01vdGlvbiBwaWN0dXJlcyBvbiB2aWRlbyB0YXBlIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjEyLjAwI011c2ljIG9uIHRhcGUgb3IgY29tcGFjdCBkaXNjIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE2LjAwLjAwI0VsZWN0cm9uaWMgU29mdHdhcmUgcmVmZXJlbmNlIG1hdGVyaWFsIzU1LjExLjAwLjAwLjAwCi11bnNwc2M3IzU1LjExLjE2LjAxLjAwI0VsZWN0cm9uaWMgU29mdHdhcmUgRG9jdW1lbnRhdGlvbiBhbmQgVXNlciBNYW51YWxzIzU1LjExLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjAwLjAwLjAwI1NpZ25hZ2UgYW5kIGFjY2Vzc29yaWVzIzU1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzU1LjEyLjE1LjAwLjAwI1RhZ3MjNTUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTUuMDEuMDAjTHVnZ2FnZSB0YWdzIzU1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE1LjAyLjAwI1NlY3VyaXR5IHRhZ3MjNTUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTUuMDMuMDAjSWRlbnRpZmljYXRpb24gdGFncyM1NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wMC4wMCNMYWJlbHMjNTUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMDEuMDAjTGFiZWwgcmVtb3Zpbmcga2l0cyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wMi4wMCNDbG90aGluZyBsYWJlbHMjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMDMuMDAjUHJlc3N1cmUgc2Vuc2l0aXZlIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wNC4wMCNDYW5uaW5nIG9yIGJvdHRsaW5nIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wNS4wMCNBZGRyZXNzaW5nIG9yIG1haWxpbmcgbGFiZWxzIzU1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE2LjA2LjAwI1NlbGYgYWRoZXNpdmUgbGFiZWxzIzU1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE2LjA3LjAwI0RlY2FscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wOC4wMCNCYXIgY29kZSBsYWJlbHMjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMDkuMDAjUGFja2FnaW5nIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4xMC4wMCNDb25zZWN1dGl2ZWx5IG51bWJlcmVkIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4xMS4wMCNMYWJlbCBtYWtpbmcgdGFwZXMjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMTIuMDAjUHJpbnRlciBsYWJlbHMjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMTMuMDAjQ29sb3IgY29kaW5nIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4xNC4wMCNSZW1vdmFibGUgbGFiZWxzIzU1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE2LjE1LjAwI0FkaGVzaXZlIGRvdHMgb3IgYXJyb3dzIzU1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE2LjE2LjAwI1NlbGYgYWRoZXNpdmUgZmxhZ3MjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMDAuMDAjU2lnbmFnZSM1NS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4wMS4wMCNNZXRhbGxpYyBuYW1lcGxhdGVzIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjAyLjAwI05vbiBtZXRhbGxpYyBuYW1lcGxhdGVzIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjAzLjAwI0lsbHVtaW5hdGVkIHNpZ25zIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjA0LjAwI1NhZmV0eSBzaWducyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4wNS4wMCNTZWxmIGFkaGVzaXZlIHNpZ25zIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjA2LjAwI0Jhbm5lcnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMDcuMDAjTWFnbmV0aWMgc2lnbnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMDguMDAjTmVvbiBzaWducyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4wOS4wMCNNb3ZpbmcgbWVzc2FnZSBzaWducyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4xMC4wMCNUcmFmZmljIHNpZ25zIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjExLjAwI0JpbGxib2FyZHMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTIuMDAjRGlyZWN0aW9uYWwgc2lnbnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTMuMDAjUG9pbnQgb2YgcHVyY2hhc2Ugc2lnbnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTQuMDAjUGVubmFudHMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTUuMDAjRmxhZ3MjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTYuMDAjV29vZGVuIHNpZ25zIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjE3LjAwI01hcmtlciBwbGF0ZXMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTguMDAjSW5mb3JtYXRpb25hbCBzaWducyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4xOS4wMCNTaWduYWxsaW5nIGNvbXBvbmVudHMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMjAuMDAjRW1ibGVtcyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4yMS4wMCNWaW55bCBsZXR0ZXJzIG9yIG51bWJlcnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMjIuMDAjRmxhZ3BvbGVzIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjIzLjAwI1NpZ24gaG9sZGVycyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xOC4wMC4wMCNJZGVudGlmaWNhdGlvbiBkb2N1bWVudHMjNTUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTguMDEuMDAjQ2FyIHRheCBkaXNjcyM1NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM1NS4xMi4xOC4wMi4wMCNJZGVudGlmaWNhdGlvbiBjYXJkcyM1NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM1NS4xMi4xOC4wMy4wMCNQYXNzcG9ydHMjNTUuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTguMDQuMDAjQmFkZ2VzIG9yIGJhZGdlIGhvbGRlcnMjNTUuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTYuMDAuMDAuMDAuMDAjRnVybml0dXJlIGFuZCBGdXJuaXNoaW5ncyM1Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4wMC4wMC4wMCNBY2NvbW1vZGF0aW9uIGZ1cm5pdHVyZSM1Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4wMC4wMCNGdXJuaXR1cmUjNTYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMDEuMDAjU3RhbmRzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjAyLjAwI1NvZmFzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjAzLjAwI0NvYXQgcmFja3MjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMDQuMDAjQ2hhaXJzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjA1LjAwI0VudGVydGFpbm1lbnQgY2VudGVycyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4wNi4wMCNGdXRvbnMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMDcuMDAjQm9va2Nhc2VzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjA4LjAwI01hdHRyZXNzZXMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMDkuMDAjRHJlc3NlcnMgb3IgYXJtb2lyZXMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMTAuMDAjUGFydGl0aW9ucyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4xMi4wMCNTdG9vbHMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMTMuMDAjQ290cyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4xNC4wMCNGb290IHN0b29scyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4xNS4wMCNCZWRzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjE2LjAwI0NoZXN0cyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4xOC4wMCNXYWxsIHJhY2tzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjE5LjAwI1RhYmxlcyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4yMC4wMCNMb2NrZXJzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjIxLjAwI0JlZCBoZWFkYm9hcmQgb3IgZm9vdGJvYXJkIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjIyLjAwI0FybSBjaGFpciM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4yMy4wMCNVbWJyZWxsYSBzdGFuZHMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjQuMDAjSXJvbmluZyBib2FyZHMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjUuMDAjSXJvbmluZyBib2FyZCBjb3ZlcnMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjYuMDAjRnJpZGdlIGJhciM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4yNy4wMCNIb3VzZWhvbGQgdHlwZSBsaW5lbiBkcmllcnMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjguMDAjQXJ0aWZpY2lhbCBwbGFudHMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjkuMDAjTWFnYXppbmUgcmFja3MjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDAuMDAjT3V0ZG9vciBmdXJuaXR1cmUjNTYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDEuMDAjT3V0ZG9vciB1bWJyZWxsYXMjNTYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDIuMDAjT3V0ZG9vciBjaGFpcnMjNTYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDMuMDAjT3V0ZG9vciB0YWJsZXMgb3IgcGljbmljIHRhYmxlcyM1Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNi4wNC4wMCNPdXRkb29yIHN3aW5ncyM1Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNi4wNS4wMCNPdXRkb29yIGJlbmNoZXMjNTYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDYuMDAjRmxvd2VyIHN0YW5kcyM1Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNi4wNy4wMCNPdXRzaWRlIGNsb3RoZXMgZHJ5ZXIjNTYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDAuMDAjT2ZmaWNlIGZ1cm5pdHVyZSM1Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNy4wMS4wMCNDcmVkZW56YXMjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDIuMDAjRmlsaW5nIGNhYmluZXRzIG9yIGFjY2Vzb3JpZXMjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDMuMDAjRGVza3MjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDQuMDAjVGFibGUgYmFzZSM1Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNy4wNS4wMCNTaG93Y2FzZXMjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDYuMDAjQ29uZmVyZW5jaW5nIHRhYmxlcyM1Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNy4wNy4wMCNEcmFmdGluZyB0YWJsZXMjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDguMDAjTW9iaWxlIGZpbGVzIG9yIGVxdWlwbWVudCBjYXJ0cyM1Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNy4wOS4wMCNUYWJsZSB0b3BzIzU2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE4LjAwLjAwI0JhYnkgYW5kIHRvZGRsZXIgZnVybml0dXJlIGFuZCBhY2Nlc3NvcmllcyM1Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xOC4wMy4wMCNDYXJyaWFnZXMgb3IgcGVyYW1idWxhdG9ycyBvciBzdHJvbGxlcnMjNTYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTguMDQuMDAjQ3JpYnMgb3IgcGxheXBlbnMjNTYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTguMDUuMDAjQ2FyIHNlYXRzIzU2LjEwLjE4LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE4LjA2LjAwI0hpZ2ggY2hhaXJzIG9yIGFjY2Vzc29yaWVzIzU2LjEwLjE4LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE4LjA3LjAwI0JvdW5jZXIgc2VhdHMgb3IganVtcGVycyM1Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xOC4wOC4wMCNTd2luZ3Mgb3IganVtcGVycyBvciBhY2Nlc3NvcmllcyM1Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xOC4wOS4wMCNQb3R0eSBzZWF0cyM1Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xOC4xMC4wMCNCYWJ5IGJhdGhzIG9yIHR1YnMjNTYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTguMTEuMDAjQmFzc2luZXRzIG9yIGNyYWRsZXMjNTYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTguMTIuMDAjQ2hhbmdpbmcgdGFibGVzIG9yIGFjY2Vzc29yaWVzIzU2LjEwLjE4LjAwLjAwCi11bnNwc2M3IzU2LjExLjAwLjAwLjAwI0NvbW1lcmNpYWwgYW5kIGluZHVzdHJpYWwgZnVybml0dXJlIzU2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjAwLjAwI1dvcmtzdGF0aW9ucyBhbmQgb2ZmaWNlIHBhY2thZ2VzIzU2LjExLjAwLjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjAxLjAwI01vZHVsYXIgcmVjZXB0aW9uIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wMi4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBleGVjdXRpdmUgb2ZmaWNlIHBhY2thZ2VzIzU2LjExLjE1LjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjAzLjAwI01vZHVsYXIgZXhlY3V0aXZlIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wNC4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBtYW5hZ2VyaWFsIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wNS4wMCNNb2R1bGFyIG1hbmFnZXJpYWwgb2ZmaWNlIHBhY2thZ2VzIzU2LjExLjE1LjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjA2LjAwI0Nhc2Vnb29kIG9yIG5vbiBtb2R1bGFyIHN0YWZmIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wNy4wMCNNb2R1bGFyIHN0YWZmIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wOC4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciB0ZWNobmljYWwgb2ZmaWNlIHBhY2thZ2VzIzU2LjExLjE1LjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjA5LjAwI01vZHVsYXIgdGVjaG5pY2FsIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4xMC4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBjbGVyaWNhbCBvZmZpY2UgcGFja2FnZXMjNTYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTUuMTEuMDAjTW9kdWxhciBjbGVyaWNhbCBvZmZpY2UgcGFja2FnZXMjNTYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTUuMTIuMDAjQ2FzZWdvb2Qgb3Igbm9uIG1vZHVsYXIgcmVjZXB0aW9uIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4xMy4wMCNDb25mZXJlbmNlIG9yIG5vbiBtb2R1bGFyIHJvb20gcGFja2FnZXMjNTYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTYuMDAuMDAjUGFuZWwgc3lzdGVtcyM1Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNi4wMS4wMCNTY3JlZW5zIGZvciBwYW5lbCBzeXN0ZW1zIzU2LjExLjE2LjAwLjAwCi11bnNwc2M3IzU2LjExLjE2LjAyLjAwI1N0b3JhZ2UgZm9yIHBhbmVsIHN5c3RlbXMjNTYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTYuMDMuMDAjT3JnYW5pemF0aW9uIGZvciBwYW5lbCBzeXN0ZW1zIzU2LjExLjE2LjAwLjAwCi11bnNwc2M3IzU2LjExLjE2LjA0LjAwI1dvcmsgc3VyZmFjZXMgZm9yIHBhbmVsIHN5c3RlbXMjNTYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTYuMDUuMDAjTGlnaHRpbmcgb3IgcG93ZXIgb3IgZGF0YSBjb21wb25ldHMgZm9yIHBhbmVsIHN5c3RlbXMjNTYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTYuMDYuMDAjUGFydHMgb3IgYWNjZXNzb3JpZXMgcGFuZWwgc3lzdGVtcyM1Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wMC4wMCNDYXNlZ29vZCBhbmQgbm9uIG1vZHVsYXIgc3lzdGVtcyM1Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wMS4wMCNDYXNlZ29vZCAgb3Igbm9uIG1vZHVsYXIgZGVzayM1Ni4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wMi4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBjcmVkZW56YSM1Ni4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wMy4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBzdG9yYWdlIzU2LjExLjE3LjAwLjAwCi11bnNwc2M3IzU2LjExLjE3LjA0LjAwI0Nhc2Vnb29kIG9yIG5vbiBtb2R1bGFyIG9yZ2FuaXphdGlvbiM1Ni4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wNS4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBsaWdodGluZyBvciBwb3dlciBvciBkYXRhIGNvbXBvbmVudHMjNTYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTcuMDYuMDAjQ2FzZWdvb2Qgb3Igbm9uIG1vZHVsYXIgcGFydHMgb3IgYWNjZXNzb3JpZXMjNTYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTguMDAuMDAjRnJlZXN0YW5kaW5nIGZ1cm5pdHVyZSM1Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xOC4wMS4wMCNGcmVlc3RhbmRpbmcgbGlnaHRpbmcgb3IgcG93ZXIgb3IgZGF0YSBjb21wb25lbnRzIzU2LjExLjE4LjAwLjAwCi11bnNwc2M3IzU2LjExLjE4LjAyLjAwI0ZyZWVzdGFuZGluZyB0YWJsZXMjNTYuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTguMDMuMDAjRnJlZXN0YW5kaW5nIHN0b3JhZ2UjNTYuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTguMDQuMDAjRnJlZXN0YW5kaW5nIG9yZ2FuaXphdGlvbiM1Ni4xMS4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xOC4wNS4wMCNGcmVlc3RhbmRpbmcgcGFydHMgb3IgYWNjZXNzb3JpZXMjNTYuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTkuMDAuMDAjSW5kdXN0cmlhbCBmdXJuaXR1cmUjNTYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTkuMDEuMDAjSW5kdXN0cmlhbCBsaWdodGluZyBvciBwb3dlciBvciBkYXRhIGNvbXBvbmVudHMjNTYuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTkuMDIuMDAjSW5kdXN0cmlhbCB3b3JrIHN1cmZhY2VzIzU2LjExLjE5LjAwLjAwCi11bnNwc2M3IzU2LjExLjE5LjAzLjAwI0luZHVzdHJpYWwgc3RvcmFnZSB1bml0cyM1Ni4xMS4xOS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xOS4wNC4wMCNJbmR1c3RyaWFsIG9yZ2FuaXphdGlvbiM1Ni4xMS4xOS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xOS4wNS4wMCNJbmR1c3RyaWFsIHBhcnRzIG9yIGFjY2Vzc29yaWVzIzU2LjExLjE5LjAwLjAwCi11bnNwc2M3IzU2LjExLjIwLjAwLjAwI0NvbXB1dGVyIHN1cHBvcnQgZnVybml0dXJlIzU2LjExLjAwLjAwLjAwCi11bnNwc2M3IzU2LjExLjIwLjAxLjAwI0NvbXB1dGVyIHN1cHBvcnQgbGlnaHRpbmcgb3IgcG93ZXIgb3IgZGF0YSBjb21wb25lbnRzIzU2LjExLjIwLjAwLjAwCi11bnNwc2M3IzU2LjExLjIwLjAyLjAwI0NvbXB1dGVyIHN1cHBvcnQgd29yayBzdXJmYWNlcyM1Ni4xMS4yMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4yMC4wMy4wMCNDb21wdXRlciBzdXBwb3J0IHN0b3JhZ2UgYWNjZXNzb3JpZXMjNTYuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMjAuMDQuMDAjQ29tcHV0ZXIgc3VwcG9ydCBvcmdhbml6YXRpb24jNTYuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMjAuMDUuMDAjQ29tcHV0ZXIgc3VwcG9ydCBwYXJ0cyBvciBhY2Nlc3NvcmllcyM1Ni4xMS4yMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4yMS4wMC4wMCNTZWF0aW5nIzU2LjExLjAwLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjAxLjAwI0F1ZGl0b3JpdW0gb3Igc3RhZGl1bSBvciBzcGVjaWFsIHVzZSBzZWF0aW5nIzU2LjExLjIxLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjAyLjAwI1Rhc2sgc2VhdGluZyM1Ni4xMS4yMS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4yMS4wMy4wMCNHdWVzdCBzZWF0aW5nIzU2LjExLjIxLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjA0LjAwI0V4ZWN1dGl2ZSBzZWF0aW5nIzU2LjExLjIxLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjA1LjAwI0xvdW5nZSBzZWF0aW5nIzU2LjExLjIxLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjA2LjAwI1N0b29sIHNlYXRpbmcjNTYuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMjEuMDcuMDAjU2VhdGluZyBwYXJ0cyBvciBhY2Nlc3NvcmllcyM1Ni4xMS4yMS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4yMS4wOC4wMCNDb21iaW5hdGlvbiBjaGFpciB3aXRoIGRlc2sjNTYuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMjEuMDkuMDAjQmVuY2hlcyM1Ni4xMS4yMS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4wMC4wMC4wMCNDbGFzc3Jvb20gYW5kIGluc3RydWN0aW9uYWwgYW5kIGluc3RpdHV0aW9uYWwgZnVybml0dXJlIGFuZCBmaXh0dXJlcyM1Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4wMC4wMCNMaWJyYXJ5IGZ1cm5pc2hpbmdzIzU2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEwLjAxLjAwI0Jvb2sgY2FydHMgb3IgYm9vayB0cnVja3MjNTYuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTAuMDIuMDAjQ2lyY3VsYXRpb24gb3IgbGlicmFyaWFuIGRlc2tzIG9yIGNvbXBvbmVudHMjNTYuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTAuMDMuMDAjQm9vayByZXR1cm5zIzU2LjEyLjEwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEwLjA0LjAwI0NhcmQgY2F0YWxvZyB1bml0cyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4wNS4wMCNEaWN0aW9uYXJ5IHN0YW5kcyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4wNi4wMCNVcGhvbHN0ZXJlZCBiZW5jaGVzIzU2LjEyLjEwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEwLjA3LjAwI1B1YmxpYyBhY2Nlc3MgdGFibGVzIzU2LjEyLjEwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEwLjA4LjAwI0Jvb2sgYnJvd3NlciB1bml0cyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4wOS4wMCNTbG9wZWQgcmVhZGluZyB0YWJsZXMjNTYuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTAuMTAuMDAjQm9vayBraW9za3MjNTYuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTAuMTEuMDAjTGlicmFyeSBjb21wYWN0IGRpc2Mgb3IgYXVkaW8gY2Fzc2V0dGUgZGlzcGxheWVycyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4xMi4wMCNSb3RhcnkgaXNsYW5kIHN0YW5kcyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4xNC4wMCNIYW5nIHVwIGJhZyByYWNrcyBvciBiYWdzIzU2LjEyLjEwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjExLjAwLjAwI0FydCBjbGFzc3Jvb20gZnVybmlzaGluZ3MjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTEuMDEuMDAjQXJ0IGhvcnNlIzU2LjEyLjExLjAwLjAwCi11bnNwc2M3IzU2LjEyLjExLjAyLjAwI0FydCBzdHVkZW50IGJlbmNoIzU2LjEyLjExLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEyLjAwLjAwI0ZpcnN0IGFpZCByb29tIGZ1cm5pc2hpbmdzIzU2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEyLjAxLjAwI0ZpcnN0IGFpZCBjb3VjaGVzIzU2LjEyLjEyLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEzLjAwLjAwI0dlbmVyYWwgZWR1Y2F0aW9uYWwgZmFjaWxpdHkgZml4dHVyZXMjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTMuMDEuMDAjU3RhbmRpbmcgcmlzZXJzIzU2LjEyLjEzLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEzLjAyLjAwI1RhYmxlIG9yIGNoYWlyIG1vdmVycyBvciBjYWRkeXMjNTYuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTMuMDMuMDAjUnViYmVyIGJydXNoIGZsb29yIG1hdHRpbmcjNTYuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTMuMDQuMDAjUGxhbm5pbmcgdGFibGVzIzU2LjEyLjEzLjAwLjAwCi11bnNwc2M3IzU2LjEyLjE0LjAwLjAwI0NhZmV0ZXJpYSBhbmQgbHVuY2hyb29tIGZ1cm5pc2hpbmdzIzU2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjE0LjAxLjAwI01vYmlsZSBiZW5jaCB0YWJsZXMjNTYuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTQuMDIuMDAjTW9iaWxlIHN0b29sIHRhYmxlcyM1Ni4xMi4xNC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNC4wMy4wMCNNb2JpbGUgdGFibGVzIzU2LjEyLjE0LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjAwLjAwI0dlbmVyYWwgY2xhc3Nyb29tIGZ1cm5pc2hpbmdzIzU2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjAxLjAwI0FjdGl2aXR5IHRhYmxlcyM1Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNS4wMi4wMCNDbGFzc3Jvb20gY2hhaXJzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjAzLjAwI0NsYXNzcm9vbSBiZW5jaGVzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjA0LjAwI0NsYXNyb29tIHN0b29scyM1Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNS4wNS4wMCNDbGFzc3Jvb20gdGFibGVzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjA2LjAwI1N0dWRlbnQgZGVza3MjNTYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTUuMDcuMDAjU3R1ZHkgY2FycmVscyM1Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNS4wOC4wMCNTdHVkZW50IGNvbXB1dGVyIGRlc2tzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjA5LjAwI1N0dWRlbnQgY29tcHV0ZXIgdGFibGVzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE2LjAwLjAwI0NyZWF0aXZlIHBsYXkgYW5kIHJlc3QgdGltZSBmdXJuaXNoaW5ncyBmb3IgZGF5Y2FyZSBhbmQgZWFybHkgY2hpbGRob29kIGZhY2lsaXRpZXMjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTYuMDEuMDAjVG9kZGxlciBvciBjaGlsZCBzaXplIGxpdmluZyByb29tIHNldHMjNTYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTYuMDIuMDAjVG9kZGxlciBvciBjaGlsZCBzaXplIHNvZmFzIzU2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE2LjAzLjAwI1RvZGRsZXIgb3IgY2hpbGQgc2l6ZSBlYXN5IGNoYWlycyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNi4wNC4wMCNUb2RkbGVyIG9yIGNoaWxkIHNpemUgYmVhbiBiYWcgY2hhaXJzIzU2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE2LjA1LjAwI0xvdyByaXNlIHJvb20gZGl2aWRlcnMgb3IgcGxheSBwYW5lbHMjNTYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTYuMDYuMDAjQ2hpbGRzIHJlc3QgbWF0cyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNi4wNy4wMCNDaGlsZHMgcmVzdCBtYXQgcmFja3Mgb3IgaG9sZGVycyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNi4wOC4wMCNDaGlsZHJlbnMgY290cyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNi4wOS4wMCNDaGlsZHJlbnMgY290IGNhcnJpZXJzIzU2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE2LjEwLjAwI0NoaWxkcmVucyBjb3QgYWN0aXZpdHkgc3lzdGVtcyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNy4wMC4wMCNCb29rIGFuZCBnZW5lcmFsIHN0b3JhZ2UgdW5pdHMgZm9yIGNsYXNzcm9vbXMjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTcuMDEuMDAjR2VuZXJhbCBzdG9yYWdlIHVuaXRzIzU2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE3LjAyLjAwI0Jvb2sgc3RvcmFnZSB1bml0cyM1Ni4xMi4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNy4wMy4wMCNDdWJiaWUgdW5pdHMjNTYuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTcuMDQuMDAjSW5zdGl0dXRpb25hbCBTdG9yYWdlIENhYmluZXRzIzU2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE4LjAwLjAwI1ZvY2F0aW9uYWwgY2xhc3Nyb29tIGZ1cm5pc2hpbmdzIGFuZCBmaXh0dXJlcyM1Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xOC4wMS4wMCNUZWNobmljYWwgZWR1Y2F0aW9uIHRvb2wgc3RvcmFnZSBjYWJpbmV0cyBvciBjYWJpbmV0cyB3aXRoIHRvb2xzIzU2LjEyLjE4LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE4LjAyLjAwI0dlbmVyYWwgc2hvcCB0b29sIHN0b3JhZ2UgY2FiaW5ldHMgb3IgY2FiaW5ldHMgd2l0aCB0b29scyM1Ni4xMi4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xOC4wMy4wMCNXb3Jkd29ya2luZyB0b29sIHN0b3JhZ2UgY2FiaW5ldHMgb3IgY2FiaW5ldHMgd2l0aCB0b29scyM1Ni4xMi4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xOC4wNC4wMCNJbnN0cnVjdG9ycyB0ZWNobmljYWwgZGVzayM1Ni4xMi4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xOC4wNS4wMCNGbGF0IGZpbGVzIzU2LjEyLjE4LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE5LjAwLjAwI0RlbW9uc3RyYXRpb24gZnVybmlzaGluZ3MjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTkuMDEuMDAjU2V3aW5nIG1hY2hpbmUgZGVtb25zdHJhdG9yIHRhYmxlcyM1Ni4xMi4xOS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4yMC4wMC4wMCNMYWJvcmF0b3J5IGZ1cm5pdHVyZSM1Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4yMC4wMS4wMCNMYWJvcmF0b3J5IGJlbmNoZXMjNTYuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMjAuMDIuMDAjTGFib3JhdG9yeSBzdG9yYWdlIHVuaXRzIG9yIGFjY2Vzc29yaWVzIzU2LjEyLjIwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjIwLjAzLjAwI0xhYm9yYXRvcnkgd29ya3N0YXRpb25zIzU2LjEyLjIwLjAwLjAwCi11bnNwc2M3IzYwLjAwLjAwLjAwLjAwI011c2ljYWwgSW5zdHJ1bWVudHMgYW5kIEdhbWVzIGFuZCBUb3lzIGFuZCBBcnRzIGFuZCBDcmFmdHMgYW5kIEVkdWNhdGlvbmFsIEVxdWlwbWVudCBhbmQgTWF0ZXJpYWxzIGFuZCBBY2Nlc3NvcmllcyBhbmQgU3VwcGxpZXMjNjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMDAuMDAuMDAjRGV2ZWxvcG1lbnRhbCBhbmQgcHJvZmVzc2lvbmFsIHRlYWNoaW5nIGFpZHMgYW5kIG1hdGVyaWFscyBhbmQgYWNjZXNzb3JpZXMgYW5kIHN1cHBsaWVzIzYwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEwLjAwLjAwI01hdGgga2l0cyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMC4wMS4wMCNBZGRpdGlvbiBtYXRoIGtpdHMjNjAuMTAuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTAuMDIuMDAjRGl2aXNpb24gbWF0aCBraXRzIzYwLjEwLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEwLjAzLjAwI0ZyYWN0aW9uIG1hdGgga2l0cyM2MC4xMC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMC4wNC4wMCNNaWRkbGUgU2Nob29sIG1hdGgga2l0cyM2MC4xMC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMC4wNS4wMCNFYXJseSBjaGlsZGhvb2QgbWF0aCBraXRzIzYwLjEwLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEwLjA2LjAwI01lYXN1cmVtZW50IG1hdGgga2l0cyM2MC4xMC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMC4wNy4wMCNNdWx0aXBsaWNhdGlvbiBtYXRoIGtpdHMjNjAuMTAuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTAuMDguMDAjRWxlbWVudGFyeSBtYXRoIGtpdHMjNjAuMTAuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTAuMDkuMDAjU3VidHJhY3Rpb24gbWF0aCBraXRzIzYwLjEwLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEwLjEwLjAwI0hpZ2ggc2Nob29sIG1hdGgga2l0cyM2MC4xMC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMS4wMC4wMCNFbGVjdHJvbmljIGxlYXJuaW5nIGFpZHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTEuMDEuMDAjRWxlY3Ryb25pYyBjYXJkIHJlYWRlcnMjNjAuMTAuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTEuMDIuMDAjQ3VycmljdWx1bSBiYXNlZCBlbGVjdHJvbmljIGxlYXJuaW5nIGFpZHMjNjAuMTAuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTEuMDMuMDAjRWxlY3Ryb25pYyBnbG9iZXMjNjAuMTAuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTEuMDQuMDAjRWxlY3Ryb25pYyBxdWl6IG1hY2hpbmVzIzYwLjEwLjExLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEyLjAwLjAwI0VkdWNhdGlvbmFsIGluY2VudGl2ZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTIuMDEuMDAjQmlibGUgYmFzZWQgY2hhcnQgc3RpY2tlcnMjNjAuMTAuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTIuMDIuMDAjQmlibGUgYmFzZWQgaW5jZW50aXZlIGNoYXJ0cyM2MC4xMC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMi4wMy4wMCNJbmNlbnRpdmUgY2hhcnQgc3RpY2tlcnMjNjAuMTAuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTIuMDQuMDAjSW5jZW50aXZlIGNoYXJ0cyM2MC4xMC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMi4wNS4wMCNJbmNlbnRpdmUgcHVuY2hjYXJkcyM2MC4xMC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4wMC4wMCNFZHVjYXRpb25hbCBzdGlja2VycyBhbmQgc3VwcGxpZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDEuMDAjQmlibGUgYmFzZWQgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDIuMDAjR2lhbnQgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDMuMDAjTm90YXJ5IHNlYWwgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDQuMDAjUGhvdG8gc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDUuMDAjUmV3YXJkIHN0aWNrZXJzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjA2LjAwI1NjZW50ZWQgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDcuMDAjU2hhcGUgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDguMDAjU3BhcmtsZSBzdGlja2VycyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4wOS4wMCNSZXdhcmQgc3RhciBzdGlja2VycyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4xMC4wMCNTdGlja2VyIGFzc29ydG1lbnRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjExLjAwI1N0aWNrZXIgYm9va3MjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMTIuMDAjU3RpY2tlciBib3hlcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4xMy4wMCNUYXR0b28gc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMTQuMDAjQWRkaXRpb24gZmxhc2ggY2FyZHMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMTUuMDAjQWxsIGZhY3RzIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjE2LjAwI0JsYW5rIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjE3LjAwI0RpdmlzaW9uIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjE4LjAwI0VsZWN0cm9uaWMgZmxhc2ggY2FyZHMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMTkuMDAjRXF1aXZhbGVudCBmbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4yMC4wMCNGcmFjdGlvbiBmbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4yMS4wMCNHcmVhdGVyIHRoYW4gb3IgbGVzcyB0aGFuIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjIyLjAwI011bHRpcGxpY2F0aW9uIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjIzLjAwI1N1YnRyYWN0aW9uIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjI0LjAwI0FscGhhYmV0IGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjI1LjAwI1dvcmQgYnVpbGRpbmcgZmxhc2ggY2FyZHMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMjYuMDAjUGhvbmljcyBmbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4yNy4wMCNIYW5kd3JpdGluZyBvciB3cml0aW5nIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjI4LjAwI051bWJlciBjbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4yOS4wMCNNb25leSBmbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4zMC4wMCNUaW1lIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjMxLjAwI1N0YXRlIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjE0LjAwLjAwI0NsYXNzcm9vbSBhd2FyZHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTQuMDEuMDAjQmFkZ2VzIzYwLjEwLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE0LjAyLjAwI0F3YXJkIGJ1dHRvbnMjNjAuMTAuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTQuMDMuMDAjQ2VsZWJyYXRpb24gY3Jvd25zIzYwLjEwLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE0LjA0LjAwI1Jld2FyZCBqZXdsZXJ5IzYwLjEwLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE0LjA1LjAwI0NsYXNzcm9vbSByaWJib25zIG9yIHJvc2V0dGVzIzYwLjEwLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE2LjAwLjAwI0VkdWNhdGlvbmFsIGNlcnRpZmljYXRlcyBvciBkaXBsb21hcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNi4wMS4wMCNCaWJsZSBiYXNlZCBjZXJ0aWZpY2F0ZXMjNjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTYuMDIuMDAjQmxhbmsgY2VydGlmaWNhdGVzIzYwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE2LjAzLjAwI0NlcnRpZmljYXRlIGZyYW1lcyM2MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNi4wNC4wMCNDZXJ0aWZpY2F0ZSBob2xkZXJzIzYwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE2LjA1LjAwI0NlcnRpZmljYXRlIHJpYmJvbnMjNjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTYuMDYuMDAjRGlwbG9tYXMjNjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTYuMDcuMDAjRm9yZWlnbiBsYW5ndWFnZSBjZXJ0aWZpY2F0ZXMjNjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTYuMDguMDAjR2VuZXJhbCBwcmFpc2UgY2VydGlmaWNhdGVzIzYwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE2LjA5LjAwI0dyYWRlIHNwZWNpZmljIGNlcnRpZmljYXRlcyM2MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNi4xMC4wMCNTdWJqZWN0IHNwZWNpZmljIGNlcnRpZmljYXRlcyM2MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4wMC4wMCNUZWFjaGVyIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4wMS4wMCNBc3Nlc3NtZW50IHJlc291cmNlIGJvb2tzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjAyLjAwI0NhbGVuZGFycyBvciBjdXQgb3V0cyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4wMy4wMCNDaGFyYWN0ZXIgZWR1Y2F0aW9uIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4wNC4wMCNDbGFzc3Jvb20gYWN0aXZpdHkgYm9va3MjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMDUuMDAjQ3JpdGljYWwgdGhpbmtpbmcgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjA2LjAwI0Nyb3NzIGN1cnJpY3VsdW0gZ3VpZGVzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjA3LjAwI0N1cnJpY3VsdW0gZ3VpZGVzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjA4LjAwI0ZhYnJpYyBjaGFydHMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMDkuMDAjRmxhbm5lbCBib2FyZCBhaWRzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjEwLjAwI0VkdWNhdG9yIGdpZnRzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjExLjAwI0dyYWRpbmcgc3RhbXBzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjEyLjAwI0hhbGwgcGFzc2VzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjEzLjAwI0hvbWUgZWR1Y2F0aW9uIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4xNC4wMCNIb21ld29yayBhc3NpZ25tZW50IHJlc291cmNlcyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4xNS4wMCNJZGVhIGJvb2tzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjE2LjAwI01hZ25ldGljIGJvYXJkIGFpZHMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMTcuMDAjTmFtZSBwbGF0ZXMgb3IgdGFncyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4xOC4wMCNUZWFjaGVyIHBsYW4gYm9va3MjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMTkuMDAjUG9ja2V0IGNoYXJ0cyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4yMC4wMCNUZWFjaGVyIGNvbW11bmljYXRpb24gcG9zdGNhcmRzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjIxLjAwI1Byb2Zlc3Npb25hbCB0ZWFjaGVyIHJlc291cmNlIGJvb2tzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjIyLjAwI1RlYWNoZXIgY2xhc3Nyb29tIGdyYWRpbmcgYm9va3MjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMjMuMDAjQ2xhc3Nyb29tIHN0dWRlbnQgc2VhdGluZyBjaGFydHMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMjQuMDAjU3Vic3RpdHV0ZSB0ZWFjaGVyIGZvbGRlcnMgb3IgZm9ybXMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMjUuMDAjVGVjaG5vbG9neSBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4yNi4wMCNUZWNobm9sb2d5IHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMjcuMDAjVGVzdCB0YWtpbmcgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjI4LjAwI1RoZW1lIHVuaXQgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjI5LjAwI01pZGRsZSBvciBqdW5pb3Igc2Nob29sIHRlYWNoaW5nIGtpdHMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMzAuMDAjTGFib3JhdG9yeSBtYW51YWxzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE4LjAwLjAwI0NodXJjaCBzY2hvb2wgZWR1Y2F0aW9uYWwgcmVzb3VyY2VzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjE4LjAxLjAwI0JpYmxlIHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTguMDIuMDAjQmlibGUgYmFzZWQgZHJhbWFzIzYwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE4LjAzLjAwI0JpYmxlIGJhc2VkIHJlc291cmNlIG9yIGFjdGl2aXR5IGJvb2tzIzYwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE4LjA0LjAwI1N1bmRheSBzY2hvb2wgYWN0aXZpdHkgcmVzb3VyY2UgYm9va3MjNjAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTguMDUuMDAjVmFjYXRpb24gYmlibGUgc2Nob29sIHJlc291cmNlcyM2MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wMC4wMCNBbHBoYWJldCBza2lsbHMgbWF0ZXJpYWxzIGFuZCByZXNvdXJjZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMDEuMDAjQWxwaGFiZXQgYWN0aXZpdHkgYm9va3MjNjAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMDIuMDAjQWxwaGFiZXQgY3ViZXMjNjAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMDMuMDAjQWxwaGFiZXQgZGVzayB0YXBlcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wNC4wMCNBbHBoYWJldCBraXRzIzYwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE5LjA1LjAwI0FscGhhYmV0IGxldHRlciB0aWxlcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wNi4wMCNBbHBoYWJldCBwb3N0ZXIgY2FyZHMjNjAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMDcuMDAjQWxwaGFiZXQgcmVmZXJlbmNlIGd1aWRlcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wOC4wMCNBbHBoYWJldCByZXNvdXJjZSBib29rcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wOS4wMCNBbHBoYWJldCBzdGFtcHMjNjAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMTAuMDAjQWxwaGFiZXQgd2FsbCBjYXJkcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4xMS4wMCNUYWN0aWxlIGFscGhhYmV0cyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMC4wMC4wMCNXb3JkIGJ1aWxkaW5nIHJlc291cmNlIG1hdGVyaWFscyBhbmQgYWNjZXNzb3JpZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjAuMDEuMDAjU3BlZWNoIG1pcnJvciM2MC4xMC4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMC4wMi4wMCNTcGVsbGluZyByZXNvdXJjZSBtYXRlcmlhbHMjNjAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjAuMDMuMDAjV29yZCBidWlsZGluZyBhY3Rpdml0eSBib29rcyM2MC4xMC4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMC4wNC4wMCNXb3JkIGJ1aWxkaW5nIGtpdHMjNjAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjAuMDUuMDAjV29yZCBidWlsZGluZyByZXNvdXJjZSBib29rcyM2MC4xMC4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMC4wNi4wMCNXb3JkIGJ1aWxkaW5nIHRpbGVzIzYwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIwLjA3LjAwI1dvcmQgd2FsbHMjNjAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjEuMDAuMDAjTGFuZ3VhZ2UgYXJ0cyByZXNvdXJjZSBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjEuMDEuMDAjQWRqZWN0aXZlIHJlc291cmNlIGJvb2tzIzYwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIxLjAyLjAwI0FkdmVyYiByZXNvdXJjZSBib29rcyM2MC4xMC4yMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMS4wMy4wMCNHcmFtbWFyIHJlc291cmNlIGJvb2tzIzYwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIxLjA0LjAwI05vdW4gcmVzb3VyY2UgYm9va3MjNjAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjEuMDUuMDAjUHVuY3R1dGF0aW9uIHJlc291cmNlIGJvb2tzIzYwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIxLjA2LjAwI1ZlcmIgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjIuMDAuMDAjUGhvbmljcyByZXNvdXJjZSBtYXRlcmlhbHMgYW5kIGFjY2Vzc29yaWVzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIyLjAxLjAwI1Bob25pY3MgYWN0aXZpdHkgYm9va3MjNjAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjIuMDIuMDAjUGhvbmljcyBkcmlsbCBjYXJkcyM2MC4xMC4yMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMi4wMy4wMCNQaG9uaWNzIGtpdCM2MC4xMC4yMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMi4wNC4wMCNQaG9uaWNzIHBpY3R1cmUgY2FyZHMjNjAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjIuMDUuMDAjUGhvbmljcyByZXNvdXJjZSBib29rcyM2MC4xMC4yMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMi4wNi4wMCNQaG9uaWNzIHRpbGVzIzYwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjAwLjAwI1JlYWRpbmcgYm9va3MgYW5kIHJlc291cmNlcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMy4wMS4wMCNSZWFkaW5nIGFjdGl2aXR5IGJvb2tzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjAyLjAwI0JlZ2lubmluZyByZWFkaW5nIGJvb2tzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjAzLjAwI0JpYmxlIGJhc2VkIGNoaWxkcmVucyBsaXRlcmF0dXJlIGJvb2tzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA0LjAwI0NoaWxkcmVucyBsaXRlcmF0dXJlIGJvb2tzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA1LjAwI0NyaXRpY2FsIHJlYWRpbmcgc2tpbGxzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA2LjAwI0ZsYW5uZWwgYm9hcmRzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA3LjAwI1BvZXRyeSByZXNvdXJjZSBib29rcyM2MC4xMC4yMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMy4wOC4wMCNSZWFkaW5nIGNvbXByZWhlbnNpb24gbWF0ZXJpYWxzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA5LjAwI1JlYWRpbmcgZGV2ZWxvcG1lbnQgbWF0ZXJpYWxzIG9yIGtpdHMjNjAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjMuMTAuMDAjUmVhZGluZyByZXNvdXJjZSBib29rcyM2MC4xMC4yMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMy4xMS4wMCNSZWFkaW5nIHRoZW1hdGljIHVuaXRzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjEyLjAwI1ZvY2FidWxhcnkgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMDAuMDAjRWFybHkgbGVhcm5pbmcgbWF0aCBhbmQgY291bnRpbmcgcmVzb3VyY2VzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNC4wMS4wMCNBYmFjdXMgb3IgY291bnRpbmcgZnJhbWVzIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjAyLjAwI0FjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIGZvciB3b3JraW5nIHdpdGggZWFybHkgbWF0aCBtYW5pcHVsYXRpdmVzIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjAzLjAwI0FjdGl2aXR5IGNhcmRzIGZvciB3b3JraW5nIHdpdGggZWFybHkgbWF0aCBtYW5pcHVsYXRpdmVzIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjA0LjAwI0JlYWRzIG9yIGJlYWQgYWN0aXZpdHkgc2V0cyBmb3IgZWFybHkgbWF0aCM2MC4xMC4yNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNC4wNS4wMCNDb3VudGVycyBvciBjb3VudGVyIGFjdGl2aXR5IHNldHMgZm9yIGVhcmx5IG1hdGgjNjAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMDYuMDAjQ291bnRpbmcgb3Igc29ydGluZyB0cmF5cyBvciBib3dscyBmb3IgZWFybHkgbWF0aCM2MC4xMC4yNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNC4wNy4wMCNMYWNlcyBvciBsYWNpbmcgc2V0cyBmb3IgZWFybHkgbWF0aCM2MC4xMC4yNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNC4wOC4wMCNMaW5raW5nIG1hbmlwdWxhdGl2ZXMgb3IgbGlua2luZyBhY3Rpdml0eSBzZXRzIGZvciBlYXJseSBtYXRoIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjA5LjAwI01hdGggZ2FtZSBjaGlwcyBvciB0b2tlbnMjNjAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMTAuMDAjTnVtYmVyIGNhcmRzIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjExLjAwI051bWJlciBmb3JtcyBtb2RlbHMgb3IgYWNjZXNzb3JpZXMjNjAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMTIuMDAjUGVnYm9hcmRzIGZvciBlYXJseSBtYXRoIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjEzLjAwI1BlZ3MgZm9yIGVhcmx5IG1hdGgjNjAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMTQuMDAjU29ydGluZyBtYW5pcHVsYXRpdmVzIG9yIHNvcnRpbmcgYWN0aXZpdHkgc2V0cyBmb3IgZWFybHkgbWF0aCM2MC4xMC4yNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNS4wMC4wMCNCYXNpYyBtYXRoIG9wZXJhdGlvbnMgYW5kIG51bWVyYXRpb24gcmVzb3VyY2VzIGFuZCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjUuMDEuMDAjQWRkaXRpb24gYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjUuMDIuMDAjQmFzaWMgb3BlcmF0aW9ucyBtb2RlbHMjNjAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjUuMDMuMDAjQmFzaWMgb3BlcmF0aW9ucyByZWZlcmVuY2UgZ3VpZGVzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA0LjAwI0RpdmlzaW9uIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA1LjAwI011bHRpcGxpY2F0aW9uIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA2LjAwI1N1YnRyYWN0aW9uIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA3LjAwI051bWJlciBkZXNrIHRhcGVzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA4LjAwI0h1bmRyZWRzIGNoYXJ0cyBvciBib2FyZHMjNjAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjUuMDkuMDAjSHVuZHJlZHMgbnVtYmVyIHRpbGVzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjEwLjAwI051bWJlciBraXRzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjExLjAwI051bWJlciBsaW5lcyM2MC4xMC4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNS4xMi4wMCNOdW1iZXJhdGlvbiBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNS4xMy4wMCNEb21pbm9lcyM2MC4xMC4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wMC4wMCNQcm9iYWJpbGl0eSBvciBjaGFuY2Ugb3IgZGF0YSBvciBwcm9ibGVtIHNvbHZpbmcgdGVhY2hlciByZXNvdXJjZSBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMDEuMDAjVHdvIHNpZGVkIGNvdW50ZXJzIG9yIHRva2VucyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wMi4wMCNTcGlubmVycyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wMy4wMCNEaWNlIHNldHMjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMDQuMDAjUHJvYmFiaWxpdHkgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMDUuMDAjTG9naWMgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMDYuMDAjQXR0cmlidXRlIGJsb2NrcyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wNy4wMCNBdHRyaWJ1dGUgYmxvY2tzIGFjdGl2aXR5IGNhcmRzIzYwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI2LjA4LjAwI0F0dHJpYnV0ZSBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wOS4wMCNHcmFwaGluZyBtYXQjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMTAuMDAjR3JhcGhpbmcgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMTEuMDAjTG9naWMgZ2FtZXMjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMTIuMDAjQXR0cmlidXRlIHNldHMgb3Iga2l0cyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4xMy4wMCNQcm9ibGVtIHNvbHZpbmcgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMTQuMDAjUHJvYmxlbSBzb2x2aW5nIGFjdGl2aXR5IGNhcmRzIzYwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjAwLjAwI1BhdHRlcm5pbmcgb3IgbWF0Y2hpbmcgb3Igc3BhdGlhbCBwZXJjZXB0aW9uIG9yIGxvZ2ljYWwgdGhpbmtpbmcgdGVhY2hlciByZXNvdXJjZSBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMDEuMDAjUGF0dGVybiBibG9ja3Mgb3IgcGFycXVldHJ5IGJsb2NrcyBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4wMi4wMCNQYXR0ZXJuIGJsb2NrcyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4wMy4wMCNQYXR0ZXJuIGJsb2NrIGFjdGl2aXR5IG9yIHBhdHRlcm4gY2FyZHMjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMDQuMDAjUGF0dGVybiBibG9jayBnYW1lcyBvciBhY3Rpdml0eSBzZXRzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjA1LjAwI1BhdHRlcm4gYmxvY2sgc3RpY2tlcnMjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMDYuMDAjUGF0dGVybiBibG9ja3MgbWlycm9yIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjA3LjAwI1BhdHRlcm4gYmxvY2tzIGNoYXJ0cyBvciBwb3N0ZXJzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjA4LjAwI1BhcnF1ZXRyeSBibG9ja3MjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMDkuMDAjUGFycXVldHJ5IGJsb2NrcyBhY3Rpdml0eSBvciBwYXR0ZXJuIGNhcmRzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjEwLjAwI1BhcnF1ZXRyeSBibG9ja3MgYWN0aXZpdHkgc2V0cyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4xMS4wMCNUYW5ncmFtcyBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4xMi4wMCNUYW5ncmFtIGFjdGl2aXR5IG9yIHBhdHRlcm4gY2FyZHMjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMTMuMDAjVGFuZ3JhbSBwdXp6bGUgYWN0aXZpdHkgc2V0cyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4xNC4wMCNUYW5ncmFtcyBwdXp6bGVzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjE1LjAwI1BlbnRvbWlub2VzIGFjdGl2aXR5IGFuZCByZXNvdXJjZSBib29rcyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4xNi4wMCNQZW50b21pbm9lcyBhY3Rpdml0eSBvciBwYXR0ZXJuIGNhcmRzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjE3LjAwI1BlbnRvbWlub2VzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjE4LjAwI1BlbnRvbWlub2VzIGFjdGl2aXR5IHNldHMjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjguMDAuMDAjQmFzZSB0ZW4gYW5kIHBsYWNlIHZhbHVlIHRlYWNoZXIgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjI4LjAxLjAwI0Jhc2UgdGVuIGJsb2NrcyM2MC4xMC4yOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOC4wMi4wMCNCYXNlIHRlbiBvciBwbGFjZSB2YWx1ZSBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOC4wMy4wMCNCYXNlIHRlbiBvciBwbGFjZSB2YWx1ZSBhY3Rpdml0eSBjYXJkcyM2MC4xMC4yOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOC4wNC4wMCNCYXNlIHRlbiBydWJiZXIgc3RhbXBzIzYwLjEwLjI4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI4LjA1LjAwI1BsYWNlIHZhbHVlIGdyaWRzIzYwLjEwLjI4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI4LjA2LjAwI1BsYWNlIHZhbHVlIGdhbWVzIG9yIGFjdGl2aXR5IHNldHMjNjAuMTAuMjguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjguMDcuMDAjUGxhY2UgdmFsdWUgbW9kZWxzIG9yIGFjY2Vzc29yaWVzIzYwLjEwLjI4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjAwLjAwI01vbmV5IGFuZCB0aW1lIHRlYWNoZXIgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjAxLjAwI01vbmV5IGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjAyLjAwI0J1bGsgYmlsbHMgZm9yIHRoZSBjbGFzc3Jvb20jNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDMuMDAjQnVsayBjb2lucyBmb3IgdGhlIGNsYXNzcm9vbSM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4wNC4wMCNDb2luIGN1YmVzIG9yIGRpY2UjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDUuMDAjTWFnbmV0aWMgbW9uZXkjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDYuMDAjT3ZlcmhlYWQgYmlsbHMjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDcuMDAjT3ZlcmhlYWQgY29pbnMjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDguMDAjTW9uZXkgcHV6emxlcyM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4wOS4wMCNNb25leSBydWJiZXIgc3RhbXBzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjEwLjAwI0NvaW4gYmFuayM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4xMS4wMCNNb25leSBnYW1lcyBvciBraXRzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjEyLjAwI1BsYXkgY2FzaCByZWdpc3RlcnMjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMTMuMDAjTW9uZXkgcmVmZXJlbmNlIGd1aWRlcyM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4xNC4wMCNUaW1lIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjE1LjAwI1RpbWUgcnViYmVyIHN0YW1wcyM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4xNi4wMCNUaW1lIGtpdHMjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMTcuMDAjVGltZSByZWZlcmVuY2UgZ3VpZGVzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjAwLjAwI0ZyYWN0aW9ucyBhbmQgcGVudG9taW5vZXMgYW5kIGRlY2ltYWxzIHRlYWNoaW5nIGFpZHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzAuMDEuMDAjRnJhY3Rpb24gY2lyY2xlcyBvciBzcXVhcmVzIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjAyLjAwI0RlY2ltYWwgc3F1YXJlcyM2MC4xMC4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMC4wMy4wMCNGcmFjdGlvbiBhY3Rpdml0eSBib29rcyM2MC4xMC4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMC4wNC4wMCNGcmFjdGlvbiBiYXJzIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjA1LjAwI0ZyYWN0aW9uIGNoYXJ0cyM2MC4xMC4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMC4wNi4wMCNGcmFjdGlvbiBkaWNlIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjA3LjAwI0ZyYWN0aW9uIGdhbWVzIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjA4LjAwI0ZyYWN0aW9uIGtpdHMjNjAuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzAuMDkuMDAjRnJhY3Rpb24gdGlsZXMjNjAuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzAuMTAuMDAjRnJhY3Rpb25zIGRpc2NzIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjEyLjAwI1BlbnRvbWlub2VzIGFjdGl2aXR5IGJvb2sjNjAuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzAuMTMuMDAjUGVudG9taW5vZXMgcGF0dGVybiBjYXJkcyM2MC4xMC4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wMC4wMCNHZW9tZXRyeSB0ZWFjaGVyIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wMS4wMCNHZW9tZXRyeSBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wMi4wMCNHZW9tZXRyeSBjaGFydHMgb3IgcG9zdGVycyM2MC4xMC4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wMy4wMCNHZW9ib2FyZHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMDQuMDAjR2VvbWV0cmljIGNvbnN0cnVjdGlvbiBzZXRzIzYwLjEwLjMxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMxLjA1LjAwI0RvdWJsZSBzaWRlZCBnZW9ib2FyZHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMDYuMDAjR2VvYm9hcmQgZ2FtZXMgb3IgYWN0aXZpdHkga2l0cyM2MC4xMC4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wNy4wMCNHZW9ib2FyZCBydWJiZXIgYmFuZHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMDguMDAjR2VvYm9hcmRzIGFjdGl2aXR5IGNhcmRzIzYwLjEwLjMxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMxLjA5LjAwI0dlb21ldHJpYyBjaGFsa2JvYXJkIGRyYXdpbmcgaW5zdHJ1bWVudHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMTAuMDAjR2VvbWV0cnkgcmVmZXJlbmNlIGd1aWRlcyM2MC4xMC4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4xMS4wMCNHZW9NaXJyb3IjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMTIuMDAjR2VvbWV0cmljIHNvbGlkcyBtb2RlbHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzIuMDAuMDAjQWxnZWJyYSB0ZWFjaGVyIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMi4wMS4wMCNBbGdlYnJhIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMyLjAyLjAwI0NlbnRpbWV0ZXIgY3ViZXMjNjAuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzIuMDMuMDAjQWxnZWJyYSBvciBwcmUgYWxnZWJyYSByZWZlcmVuY2UgZ3VpZGVzIzYwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMyLjA0LjAwI0FsZ2VicmEgbW9kZWxzIG9yIGFjY2Vzc29yaWVzIzYwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMzLjAwLjAwI1ByZWNhbGN1bHVzIGFuZCBjYWxjdWx1cyB0ZWFjaGVyIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMy4wMS4wMCNDYWxjdWx1cyBhY3Rpdml0eSBvciByZXNvdXJjZXMgYm9va3MjNjAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzMuMDIuMDAjUHJlY2FsY3VsdXMgb3IgY2FsY3VsdXMgcmVmZXJlbmNlIGd1aWRlcyM2MC4xMC4zMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMy4wMy4wMCNQcmVjYWxjdWx1cyBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4zMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNC4wMC4wMCNHZW9ncmFwaHkgYW5kIG1hcCBza2lsbHMgcmVzb3VyY2VzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNC4wMS4wMCNHb2VncmFwaHkgY2hhcnRzIG9yIHBvc3RlcnMjNjAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzQuMDIuMDAjQ29udGluZW50cyBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4zNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNC4wMy4wMCNFbGVjdHJvbmljIHNvY2lhbCBzdHVkaWVzIGxlYXJuaW5nIGFpZHMjNjAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzQuMDQuMDAjR2VvZ3JhcGh5IHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzQuMDUuMDAjTWFwIHJhY2tzIzYwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM0LjA2LjAwI01hcCBzdGVuY2lsIGtpdHMjNjAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzQuMDcuMDAjUG9ydGFibGUgd2FsbCBtYXBzIzYwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM0LjA4LjAwI0dlb2dyYXBoeSByZXNvdXJjZSBvciBhY3Rpdml0eSBib29rcyM2MC4xMC4zNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNS4wMC4wMCNQb2xpdGljYWwgc2NpZW5jZSM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNS4wMS4wMCNFY29ub21pY3MgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzUuMDIuMDAjR292ZXJubWVudCBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4zNS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNS4wMy4wMCNHb3Zlcm5tZW50IHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzUuMDQuMDAjU3RhdGUgdGhlbWUgdW5pdHMjNjAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzYuMDAuMDAjTXVsdGljdWx0dXJhbCBhY3Rpdml0aWVzIGFuZCByZXNvdXJjZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzYuMDEuMDAjQW5jaWVudCBjaXZpbGl6YXRpb25zIHJlc291cmNlcyM2MC4xMC4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNi4wMi4wMCNDdXN0b21zIG9yIHJpdHVhbHMgb3IgdHJhZGl0aW9ucyByZXNvdXJjZXMjNjAuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzYuMDMuMDAjRXRobmljIGRpdmVyc2l0eSByZXNvdXJjZXMjNjAuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzYuMDQuMDAjR2VuZWFsb2d5IHJlc291cmNlcyM2MC4xMC4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNi4wNS4wMCNNdWx0aWN1bHR1cmFsIGhvbGlkYXlzIHJlc291cmNlcyM2MC4xMC4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNi4wNi4wMCNNdWx0aWN1bHR1cmFsIHRoZW1lIHVuaXRzIzYwLjEwLjM2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM3LjAwLjAwI0ZvcmVpZ24gbGFuZ3VhZ2VzIHJlc291cmNlcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNy4wMS4wMCNSZXNvdXJjZXMgZm9yIExlYXJuaW5nIHRvIHNwZWFrIHNwYW5pc2gjNjAuMTAuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzcuMDIuMDAjUmVzb3VyY2VzIGZvciBMZWFybmluZyB0byBzcGVhayBmcmVuY2gjNjAuMTAuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzcuMDMuMDAjUmVzb3VyY2VzIGZvciBMZWFybmluZyB0byBzcGVhayBnZXJtYW4jNjAuMTAuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzcuMDQuMDAjUmVzb3VyY2VzIGZvciBMZWFybmluZyB0byBzcGVhayBlbmdsaXNoIzYwLjEwLjM3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM3LjA1LjAwI1Jlc291cmNlcyBmb3IgTGVhcm5pbmcgdG8gc3BlYWsgbGF0aW4jNjAuMTAuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzcuMDYuMDAjUmVzb3VyY2VzIGZvciBMZWFybmluZyB0byBzcGVhayBpdGFsaWFuIzYwLjEwLjM3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjAwLjAwI0hpc3RvcnkgdGVhY2hpbmcgcmVzb3VyY2VzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjAxLjAwI0FmcmljYW4gaGlzdG9yeSByZXNvdXJjZSBib29rcyM2MC4xMC4zOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOC4wMi4wMCNIaXN0b3J5IGNoYXJ0cyBvciBwb3N0ZXJzIzYwLjEwLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjAzLjAwI0V1cm9wZWFuIGhpc3RvcnkgcmVzb3VyY2UgYm9va3MjNjAuMTAuMzguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzguMDQuMDAjSGlzdG9yaWNhbCBtYXBzIzYwLjEwLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjA1LjAwI0hpc3RvcnkgdGhlbWUgdW5pdHMjNjAuMTAuMzguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzguMDYuMDAjSGlzdG9yeSBwaG90byBjYXJkcyM2MC4xMC4zOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOC4wNy4wMCNIaXN0b3J5IHJlc291cmNlIGJvb2tzIzYwLjEwLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjA4LjAwI1dvbWFucyBoaXN0b3J5IHJlc291cmNlcyM2MC4xMC4zOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOC4wOS4wMCNXb3JsZCBoaXN0b3J5IHJlc291cmNlcyM2MC4xMC4zOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wMC4wMCNMaXZpbmcgb3JnYW5pc21zIGFuZCBwcmVzZXJ2ZWQgc3BlY2ltZW5zIGFuZCByZWxhdGVkIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wMS4wMCNMaXZlIGFtcGhpYmlhIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjAyLjAwI1ByZXNlcnZlZCBhbXBoaWJpYSM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wMy4wMCNBbXBoaWJpYSBtb2RlbHMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMDQuMDAjRnVuZ2kgY3VsdHVyZXMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMDUuMDAjQ3VsdHVyZSBraXRzIG9yIHN1cHBsaWVzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjA2LjAwI1Byb3Rvem9hbiBjdWx0dXJlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wNy4wMCNBcXVhcmlhIHBsYW50cyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wOC4wMCNUZXJyYXJpdW0gcGxhbnRzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjA5LjAwI0xpdmUgaW52ZXJ0ZWJyYXRlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xMC4wMCNQcmVzZXJ2ZWQgaW52ZXJ0ZWJyYXRlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xMS4wMCNMaXZlIHZlcnRlYnJhdGVzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjEyLjAwI1ByZXNlcnZlZCB2ZXJ0ZWJyYXRlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xMy4wMCNMaXZlIHJlcHRpbGlhIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjE0LjAwI1ByZXNlcnZlZCByZXB0aWxsYSM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xNS4wMCNEaXNzZWN0aW9uIGtpdHMgb3Igc3VwcGxpZXMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMTguMDAjQmlvc3BoZXJlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xOS4wMCNCaW9sb2d5IGV4cGVyaW1lbnQga2l0cyBvciBzdXBwbGllcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yMC4wMCNTdGFpbmluZyBraXRzIG9yIHN1cHBsaWVzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjIxLjAwI1ByZXNlcnZlZCBsaWZlIGN5Y2xlIHNwZWNpbWVucyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yMi4wMCNCaW9sb2d5IHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMjMuMDAjU2tlbGV0b24gb3IgYm9uZSBvciBzaGVsbCBzcGVjaW1lbiM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yNC4wMCNCaW9sb2d5IHJlc291cmNlIG9yIGFjdGl2aXR5IGJvb2tzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjI1LjAwI0Jpb2xvZ3kgc3R1ZHkgb3IgYWN0aXZpdHkga2l0cyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yNi4wMCNCaW9sb2d5IGNoYXJ0cyBvciBwb3N0ZXJzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjI3LjAwI1ByZXNlcnZlZCBwbGFudCBib2R5IG9yIG9yZ2FuIHNwZWNpbWVucyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yOC4wMCNCaW9sb2d5IGFjdGl2aXR5IG9yIHBob3RvIGNhcmRzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjI5LjAwI1BsYW50IGxpZmUgY3ljbGUgc3BlY2ltZW5zIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjMwLjAwI0NvbWJpbmF0aW9uIG9yZ2FuaXNtIHNwZWNpbWVucyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4zMS4wMCNBbmltYWwgYm9keSBvciBib2R5IHBhcnQgb3Igb3JnYW4gc3BlY2ltZW5zIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjMyLjAwI0Vjb3N5c3RlbSBkaXNwbGF5cyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4zMy4wMCNIdW1hbiBib2R5IG9yIGJvZHkgcGFydCBvciBvcmdhbiBzcGVjaW1lbnMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMzQuMDAjVGlzc3VlIGN1bHR1cmVzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjAwLjAwI0Jpb3RlY2hub2xvZ3kgYW5kIGJpbyBjaGVtaXN0cnkgYW5kIGdlbmV0aWNzIGFuZCBtaWNyb2Jpb2xvZ3kgYW5kIHJlbGF0ZWQgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjAxLjAwI0Rlb3h5cmlib251Y2xlaWMgYWNpZCBETkEgbW9kZWxzIzYwLjEwLjQwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjAyLjAwI0Rlb3h5cmlib251Y2xlaWMgYWNpZCBETkEgZXhwZXJpbWVudCBraXRzIzYwLjEwLjQwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjAzLjAwI0dlbmV0aWMgYm9va3MjNjAuMTAuNDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDAuMDQuMDAjR2VuZXRpYyBraXRzIzYwLjEwLjQwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjA1LjAwI0JhY3RlcmlhIHRlYWNoaW5nIGtpdHMjNjAuMTAuNDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDAuMDYuMDAjQmFjdGVyaWEgdGVzdGluZyBzdXBwbGllcyM2MC4xMC40MC4wMC4wMAotdW5zcHNjNyM2MC4xMC40MC4wNy4wMCNFbnp5bW9sb2d5IGtpdHMgb3Igc3VwcGxpZXMjNjAuMTAuNDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDAuMDguMDAjUHJvdGVpbiB0ZXN0aW5nIGtpdHMgb3Igc3VwcGxpZXMjNjAuMTAuNDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDEuMDAuMDAjQm9keSBzeXN0ZW1zIGFuZCByZWxhdGVkIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC40MS4wMS4wMCNCb2R5IG1vZGVscyM2MC4xMC40MS4wMC4wMAotdW5zcHNjNyM2MC4xMC40MS4wMi4wMCNDZWxsIG1vZGVscyM2MC4xMC40MS4wMC4wMAotdW5zcHNjNyM2MC4xMC40MS4wMy4wMCNDZWxsIHRlYWNoaW5nIGtpdHMjNjAuMTAuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDEuMDQuMDAjQm9keSBzeXN0ZW1zIHRlYWNoaW5nIGtpdHMjNjAuMTAuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDEuMDUuMDAjQm9keSBzeXN0ZW1zIHRlYWNoaW5nIGFpZHMjNjAuMTAuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDIuMDAuMDAjV2F0ZXIgdGVzdGluZyBhbmQgY29uc2VydmF0aW9uIGFuZCBlY29sb2d5IzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQyLjAxLjAwI1dhdGVyIHRlc3RpbmcgY2hlbWljYWxzIzYwLjEwLjQyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQyLjAyLjAwI1dhdGVyIHRlc3RpbmcgYW5kIHNhbXBsaW5nIGtpdHMjNjAuMTAuNDIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDIuMDMuMDAjV2F0ZXIgbW9kZWxzIzYwLjEwLjQyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQyLjA0LjAwI1dhdGVyIGVjb2xvZ3kgc3VwcGxpZXMjNjAuMTAuNDIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDMuMDAuMDAjQXN0cm9ub215IzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQzLjAxLjAwI0FzdHJvbm9teSBtb2RlbHMjNjAuMTAuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDMuMDIuMDAjQXN0cm9ub215IGNoYXJ0cyM2MC4xMC40My4wMC4wMAotdW5zcHNjNyM2MC4xMC40My4wMy4wMCNBc3Ryb25vbXkgc3R1ZHkga2l0cyM2MC4xMC40My4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wMC4wMCNHZW9sb2d5IGFuZCBlYXJ0aCBzY2llbmNlIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ0LjAxLjAwI1JvY2sgc3BlY2ltZW4gc2V0cyM2MC4xMC40NC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wMi4wMCNSb2NrIHNwZWNpbWVucyM2MC4xMC40NC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wMy4wMCNGb3NzaWxzIzYwLjEwLjQ0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ0LjA0LjAwI0xhbmRmb3JtIG1vZGVscyM2MC4xMC40NC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wNS4wMCNGb3NzaWwgbW9kZWxzIzYwLjEwLjQ0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ0LjA2LjAwI0dlb2xvZ3kgdG9vbHMgb3IgZmllbGQjNjAuMTAuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDQuMDcuMDAjU3RyZWFtIHRhYmxlcyM2MC4xMC40NC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wOC4wMCNHZW9sb2d5IHN0dWR5IGtpdHMjNjAuMTAuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDUuMDAuMDAjQ2hlbWlzdHJ5IGFuZCBlbGVjdHJvY2hlbWlzdHJ5IGFuZCBtaWNyb2NoZW1pc3RyeSM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NS4wMS4wMCNQZXJpb2RpYyB0YWJsZSBwb3N0ZXJzIG9yIGJvYXJkcyM2MC4xMC40NS4wMC4wMAotdW5zcHNjNyM2MC4xMC40NS4wMi4wMCNDb25zdW1lciBhbmFseXNpcyBraXRzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjAzLjAwI0NoZW1pc3RyeSBjbGFzcyBraXRzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjA0LjAwI0NoZW1pc3RyeSBkZW1vbnN0cmF0aW9uIGtpdHMjNjAuMTAuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDUuMDUuMDAjQXRvbWljIG1vZGVscyM2MC4xMC40NS4wMC4wMAotdW5zcHNjNyM2MC4xMC40NS4wNi4wMCNNb2xlY3VsYXIgbW9kZWxzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjA3LjAwI0VsZWN0cm9jaGVtaWNhbCBkZW1vbnN0cmF0aW9uIHRvb2xzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjA4LjAwI0VsZWN0cm9jaGVtaWNhbCBraXRzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjA5LjAwI0Z1ZWwgY2VsbHMjNjAuMTAuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDUuMTAuMDAjTWljcm9jaGVtaXN0cnkga2l0cyM2MC4xMC40NS4wMC4wMAotdW5zcHNjNyM2MC4xMC40NS4xMS4wMCNNaWNyb2NoZW1pc3RyeSB0b29scyM2MC4xMC40NS4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ni4wMC4wMCNNZWNoYW5pY2FsIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ2LjAxLjAwI0ZvcmNlIHRhYmxlcyM2MC4xMC40Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ni4wMi4wMCNHcmF2aXR5IG1vZGVscyBvciBtb2RlbCBzZXRzIzYwLjEwLjQ2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ2LjA0LjAwI0luY2xpbmVkIHBsYW5lcyM2MC4xMC40Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ni4wNS4wMCNGcmljdGlvbiBhcHBhcmF0dXMjNjAuMTAuNDYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDYuMDYuMDAjUGh5c2ljIGNhcnMjNjAuMTAuNDYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDYuMDcuMDAjUGVuZHVsdW0gYXBwYXJhdHVzIzYwLjEwLjQ2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ2LjA4LjAwI1RvcnF1ZSBhcHBhcmF0dXMjNjAuMTAuNDYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDYuMDkuMDAjUHJvamVjdGlsZSBhcHBhcmF0dXMjNjAuMTAuNDYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDYuMTAuMDAjQWlyIHRhYmxlcyM2MC4xMC40Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ni4xMS4wMCNBaXIgYXBwYXJhdHVzIzYwLjEwLjQ2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ2LjEyLjAwI0xpZ2h0IG9yIHBob3RvIGFwcGFyYXR1cyM2MC4xMC40Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ny4wMC4wMCNFbmVyZ3kgYW5kIHBvd2VyIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ3LjAxLjAwI1NvbGFyIGNvbGxlY3RpbmcgZGV2aWNlcyM2MC4xMC40Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ny4wMi4wMCNTb2xhciBraXRzIzYwLjEwLjQ3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ3LjAzLjAwI0VuZXJneSBkZW1vbnN0cmF0aW9uIGtpdHMjNjAuMTAuNDcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDcuMDQuMDAjRW5lcmd5IGNsYXNzIGtpdHMjNjAuMTAuNDcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDcuMDUuMDAjTWF0dGVyIGRlbW9uc3RyYXRpb24ga2l0cyM2MC4xMC40Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ny4wNi4wMCNNYXR0ZXIgY2xhc3Mga2l0cyM2MC4xMC40Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ny4wNy4wMCNNb25vbWV0ZXJzIzYwLjEwLjQ3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ3LjA4LjAwI0dhcyBkaWZmdXNpb24gYXBwYXJhdHVzIzYwLjEwLjQ3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjAwLjAwI1dhdmUgYW5kIHNvdW5kIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjAxLjAwI1dhdmUgZ2VuZXJhdG9ycyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4wMi4wMCNXYXZlIHRhbmtzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjAzLjAwI1dhdmUgc3ByaW5ncyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4wNC4wMCNXYXZlIGRlbW9uc3RyYXRpb24gc2V0cyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4wNS4wMCNUdW5pbmcgZm9ya3MjNjAuMTAuNDguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDguMDYuMDAjRG9wcGxlciBkZW1vbnN0cmF0b3JzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjA3LjAwI1Jlc29uYW5jZSBhcHBhcmF0dXMjNjAuMTAuNDguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDguMDguMDAjU291bmQgbWV0ZXJzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjA5LjAwI1dhdmUgYXBwYXJhdHVzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjEwLjAwI1NwZWN0cm9zY29wZXMjNjAuMTAuNDguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDguMTEuMDAjU3BlY3RydW0gY2hhcnRzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjEyLjAwI0xpZ2h0IGRlbW9uc3RyYXRpb24ga2l0cyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4xMy4wMCNDb2xvciBjaGFydHMgb3Igc2FtcGxlcyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4xNC4wMCNSYWRpb21ldGVyIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjE1LjAwI1JlZmxlY3Rpb24gb3IgcmVmcmFjdGlvbiBhcHBhcmF0dXMjNjAuMTAuNDguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDguMTYuMDAjT3B0aWNzIHNldHMgb3Iga2l0cyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OS4wMC4wMCNFbGVjdHJpY2FsIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ5LjAxLjAwI1ZhbiBkZWdyYWZmIGdlbmVyYXRvcnMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDIuMDAjRWxlY3Ryb3N0YXRpYyBhcHBhcmF0dXMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDMuMDAjRWxlY3Ryb3N0YXRpYyBraXRzIzYwLjEwLjQ5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ5LjA0LjAwI0VsZWN0cmljaXR5IGtpdHMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDUuMDAjRWxlY3RyaWNpdHkgZGVtb25zdHJhdGlvbiBib2FyZHMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDYuMDAjQmF0dGVyeSBraXRzIzYwLjEwLjQ5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ5LjA3LjAwI0hhbmQgaGVsZCBnZW5lcmF0b3JzIzYwLjEwLjQ5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ5LjA4LjAwI0VsZWN0cm9tYWduZXRpYyBhcHBhcmF0dXMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDkuMDAjTWFnbmV0aXNtIGFwcGFyYXR1cyM2MC4xMC40OS4wMC4wMAotdW5zcHNjNyM2MC4xMC40OS4xMC4wMCNFbGVjdHJvbWFnbmV0cyM2MC4xMC40OS4wMC4wMAotdW5zcHNjNyM2MC4xMC40OS4xMS4wMCNFbGVjdHJpYyBiZWxscyM2MC4xMC40OS4wMC4wMAotdW5zcHNjNyM2MC4xMC40OS4xMi4wMCNFbGVjdHJpYyBsZWFkIHdpcmVzIG9yIGNhYmxlcyM2MC4xMC40OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41MC4wMC4wMCNOdWNsZWFyIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUwLjAxLjAwI1JhZGlvYWN0aXZpdHkgc2V0cyM2MC4xMC41MC4wMC4wMAotdW5zcHNjNyM2MC4xMC41MC4wMi4wMCNHZWlnZXIgY291bnRlcnMjNjAuMTAuNTAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTAuMDMuMDAjRWxlY3Ryb24gYXBwYXJhdHVzIzYwLjEwLjUwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUwLjA0LjAwI1JhZGlhdGlvbiB3YXJuaW5nIHNpZ25zIzYwLjEwLjUwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUwLjA1LjAwI051Y2xlYXIgcGh5c2ljcyB0cmFuc3BhcmVuY2llcyM2MC4xMC41MC4wMC4wMAotdW5zcHNjNyM2MC4xMC41MC4wNi4wMCNOdWNsZWFyIHBoeXNpY3MgY2hhcnRzIzYwLjEwLjUwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUxLjAwLjAwI1JvY2tldHJ5IGFuZCBmbGlnaHQgbWF0ZXJpYWxzIGFuZCBzdXBwbGllcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC41MS4wMS4wMCNSb2NrZXQgc2V0cyM2MC4xMC41MS4wMC4wMAotdW5zcHNjNyM2MC4xMC41MS4wMi4wMCNMYXVuY2hpbmcgYXBwYXJhdHVzIzYwLjEwLjUxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUxLjAzLjAwI0FsdGl0dWRlIG1lYXN1cmluZyBkZXZpY2VzIzYwLjEwLjUxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUxLjA0LjAwI0FpcnBsYW5lIGtpdHMjNjAuMTAuNTEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTIuMDAuMDAjTGlmZSBza2lsbHMgcmVzb3VyY2VzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUyLjAxLjAwI0J1aWxkaW5nIGxpc3RlbmluZyBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTIuMDIuMDAjU3R1ZHkgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjUyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUyLjAzLjAwI1Rlc3QgcHJlcGFyYXRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTMuMDAuMDAjQ2FyZWVyIGVkdWNhdGlvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wMS4wMCNDYXJlZXIgZWR1Y2F0aW9uIG9yIHBsYW5uaW5nIG9yIGRlY2lzaW9uIG1ha2luZyBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTMuMDIuMDAjQmFzaWMgam9iIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wMy4wMCNKb2Igc2VhcmNoIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wNC4wMCNUaW1lIG1hbmFnZW1lbnQgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjUzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUzLjA1LjAwI0ludGVydmlldyBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTMuMDYuMDAjUmVzdW1lIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wNy4wMCNXb3JrIGV0aGljcyBvciBhdHRpdHVkZSB0cmFpbmluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wOC4wMCNUZWFtIGJ1aWxkaW5nIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wOS4wMCNCdXNpbmVzcyBldGlxdWV0dGUgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMDAuMDAjQ29uc3VtZXIgZWNvbm9taWNzIGFuZCBtb25leSBtYW5hZ2VtZW50IGFuZCBpbmRlcGVuZGVudCBsaXZpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMDEuMDAjUGVyc29uYWwgZmluYW5jZSBvciBtb25leSBtYW5hZ2VtZW50IGVkdWNhdGlvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4wMi4wMCNTaG9wcGluZyBvciBjb25zdW1lciBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMDMuMDAjSW5kZXBlbmRlbnQgbGl2aW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjA0LjAwI1VuZGVyc3RhbmRpbmcgY29uc3VtZXIgY3JlZGl0IG9yIGxvYW5zIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjA1LjAwI0luc3VyYW5jZSBjb3ZlcmFnZSBvciBpbnN1cmFuY2UgY29tcGFyaXNvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4wNi4wMCNIb21lIGJ1eWluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4wNy4wMCNBcGFydG1lbnQgcmVudGFsIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjA4LjAwI0NhciBidXlpbmcgZWR1Y2F0aW9uYWwgYWlkcyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4wOS4wMCNCcmFuZCBtYXJrZXRpbmcgb3IgYWR2ZXJ0aXNpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMTAuMDAjUmVsYXRpb25zaGlwIGJ1aWxkaW5nIG9yIGZhbWlseSBsaWZlIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4xMS4wMCNEZXZlbG9waW5nIHNlbGYgY29uY2VwdCBhbmQgc2VsZiBlc3RlZW0gaW5zdHVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4xMi4wMCNWaW9sZW5jZSBhdm9pZGFuY2UgZWR1Y2F0aW9uIG9yIHZpb2xlbmNlIHByZXZlbnRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMTMuMDAjQW5nZXIgcmVzb2x1dGlvbiB0cmFpbmluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4xNC4wMCNUZWFjaGluZyBwYXRpZW5jZSBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMTUuMDAjVG9sZXJhbmNlIHRyYWluaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjE2LjAwI1BlcnNvbmFsIHNhZmV0eSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4xNy4wMCNQZXJzb25hbCBjb25mbGljdCByZXNvbHV0aW9uIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjE4LjAwI1ByYWN0aWNhbCB0ZWVuIGFkdmljZSBndWlkZXMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMTkuMDAjRGV2ZWxvcGluZyBzb2NpYWwgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjIwLjAwI01hbm5lcnMgb3IgZXRpcXVldHRlIG9yIGNvdXJ0ZXN5IGluc3RydWN0aW9uYWwgYWlkcyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4yMS4wMCNVbmRlcnN0YW5kaW5nIG9yIGRlYWxpbmcgd2l0aCBjdWx0dXJhbCBkaXZlcnNpdHkgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMjIuMDAjSG93IHRvIHJlYWQgYm9keSBsYW5ndWFnZSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4yMy4wMCNEZXZlbG9waW5nIHJlc2lsaWVuY3kgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMjQuMDAjVW5kZXJzdGFuZGluZyBjb21tdW5pdHkgc2VydmljZSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4yNS4wMCNEZXZlbG9waW5nIHJlZnVzYWwgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjI2LjAwI1Jlc3BvbnNpYmlsaXR5IG9yIERkZWNpc2lvbiBtYWtpbmcgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjI3LjAwI1VuZGVyc3RhbmRpbmcgdGVlbnMgbGVnYWwgcmlnaHRzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjI4LjAwI1JlcGVyY3Vzc2lvbnMgb2YgZHJvcHBpbmcgb3V0IG9mIHNjaG9vbCBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4yOS4wMCNSYWNlIHJlbGF0aW9ucyB2aWRlb3MjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTUuMDAuMDAjSG9tZSBhbmQgaW50ZXJpb3IgZGVzaWduIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjU1LjAxLjAwI0Zlbmcgc2h1aSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NS4wMC4wMAotdW5zcHNjNyM2MC4xMC41NS4wMi4wMCNJbnN0cnVjdGlvbmFsIG1hdGVyaWFscyBmb3IgdXNpbmcgY29sb3Igb3IgcGFpbnQgZm9yIGhvbWUgZGVjb3JhdGlvbiM2MC4xMC41NS4wMC4wMAotdW5zcHNjNyM2MC4xMC41NS4wMy4wMCNJbnN0cnVjdGlvbmFsIG1hdGVyaWFscyBmb3IgaG9tZSBwbGFubmluZyBvciBkZXNpZ24jNjAuMTAuNTUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTUuMDQuMDAjTGFuZHNjYXBpbmcgZGVzaWduIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU1LjA1LjAwI0luc3RydWN0aW9uYWwgbWF0ZXJpYWxzIGZvciBob21lIGRlY29yYXRpbmcgb3IgZnVybmlzaGluZyM2MC4xMC41NS4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wMC4wMCNIZWFsdGggZWR1Y2F0aW9uIGFuZCBudXRyaXRpb24gYW5kIGZvb2QgcHJlcGFyYXRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMDEuMDAjRGlldGFyeSBndWlkZWxpbmVzIG9yIGJhbGFuY2VkIGRpZXRzIGVkdWNhdGlvbmFsIHJlc291cmNlcyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wMi4wMCNOdXRyaXRpb25hbCBjdXJyaWN1bHVtIG1lbnUgcGxhbm5pbmcgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjAzLjAwI1VuZGVyc3RhbmRpbmcgbnV0cml0aW9uIGxhYmVsaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjA0LjAwI0Zvb2Qgc2hvcHBpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMDUuMDAjSGVhbHRoeSBmb29kIGNob2ljZXMgZGVtb25zdHJhdGlvbiB1bml0cyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wNi4wMCNVbmRlcnN0YW5kaW5nIHRoZSBlZmZlY3RzIG9mIGRpZXRhcnkgZmF0IGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjA3LjAwI1VuZGVyc3RhbmRpbmcgdmVnZXRhcmlhbmlzbSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wOC4wMCNSZWNpcGUgYm9va3Mgb3IgY29vayBib29rcyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wOS4wMCNFYXRpbmcgZGlzb3JkZXJzIGVkdWNhdGlvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4xMC4wMCNXZWlnaHQgY29udHJvbCBvciBleGVyY2lzZSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4xMS4wMCNLaXRjaGVuIG1lYXN1cmVtZW50cyBvZiBzb2xpZHMgb3IgbGlxdWlkcyBpbnN0cnVjdGlvbmFsIGFpZHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTIuMDAjS2l0Y2hlbiBlcXVpdmFsYW50cyBvciBraXRjaGVuIG1hdGggaW5zdHJ1Y3Rpb25hbCBhaWRzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjEzLjAwI0tpdGNoZW4gdXRlbnNpbHMgaW5zdHJ1Y3Rpb25hbCBhaWRzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjE0LjAwI0tpdGNoZW4gc2FmZXR5IG9yIHNhbml0YXRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTUuMDAjRm9vZCBzYWZldHkgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTYuMDAjRm9vZCBzY2llbmNlIGFjdGl2aXRpZXMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTcuMDAjQ29va2luZyBza2lsbHMgaW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTguMDAjVGFibGUgbWFubmVycyBvciBlYXRpbmcgZXRpcXVldHRlIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjE5LjAwI1RhYmxlIHNldHRpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMjAuMDAjRm9vZCBzZXJ2aWNlIHRyYWluaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjIxLjAwI0RydWcgb3IgdG9iYWNjbyBvciBhbGNvaG9sIGFidXNlIGVkdWNhdGlvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4yMi4wMCNTbW9raW5nIFNpbXVsYXRvcnMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMjMuMDAjVW5kZXJzdGFuZGluZyBhZGRpY3Rpb24gb3IgYWRkaWN0aW9uIGF2b2lkYW5jZSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4yNC4wMCNUZWVuIGRlcHJlc3Npb24gc3ltcHRvbXMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMjUuMDAjVGVlbiBzdWljaWRlIGF2b2lkYW5jZSB0cmFpbmluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4yNi4wMCNDb3Bpbmcgd2l0aCBzdHJlc3MgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTcuMDAuMDAjTWVtb3J5IGJvb2tzIGFuZCBzdXBwbGllcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ny4wMS4wMCNNZW1vcnkgYm9va3MjNjAuMTAuNTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTcuMDIuMDAjTWVtb3J5IGJvb2sgcG9zdHMgb3IgZXh0ZW5kZXJzIzYwLjEwLjU3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU3LjAzLjAwI01lbW9yeSBib29rIHBhcGVyIzYwLjEwLjU3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU3LjA0LjAwI0FjaWQgZnJlZSBtZW1vcnkgYm9vayBnbHVlIHN0aWNrcyM2MC4xMC41Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ny4wNS4wMCNBY2lkIGZyZWUgbWVtb3J5IGJvb2sgdGFwZSM2MC4xMC41Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC41OC4wMC4wMCNDbG90aGluZyBhbmQgdGV4dGlsZSBkZXNpZ24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDEuMDAjU2V3aW5nIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OC4wMC4wMAotdW5zcHNjNyM2MC4xMC41OC4wMi4wMCNTZXdpbmcgcHJvamVjdCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDMuMDAjVW5kZXJzdGFuZGluZyBjbG90aGluZyBjb25zdHJ1Y3Rpb24gb3Igd29ya21hbnNoaXAgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDQuMDAjQ2xvdGhpbmcgZGVzaWduIG9yIGZhc2hpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDUuMDAjUGVyc29uYWwgY29sb3IgYW5hbHlzaXMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDYuMDAjRmFzaGlvbiBtZXJjaGFuZGlzaW5nIG9yIHJldGFpbCBmdW5kYW1lbnRhbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDcuMDAjU2NpZW5jZSBvZiBmYWJyaWNzIG9yIGZpYmVycyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OC4wMC4wMAotdW5zcHNjNyM2MC4xMC41OC4wOC4wMCNDbG90aGluZyBjYXJlIG9yIG1haW50ZW5hbmNlIG9yIGxhdW5kZXJpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDkuMDAjTWF0ZXJpYWxzIGZvciB0ZWFjaGluZyB0aGUgYXJ0IG9mIGRlc2lnbiBjb2xvciBvbiBmYWJyaWMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMTAuMDAjRmFicmljIGR5ZXMgb3IgcGFpbnRzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU4LjExLjAwI1F1aWx0aW5nIHByb2plY3RzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjAwLjAwI0RhdGluZyBhbmQgc2V4IGFuZCB0ZWVuIHByZWduYW5jeSBhbmQgcGFyZW50aW5nIHNraWxscyBhbmQgY2hpbGQgZGV2ZWxvcG1lbnQgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDEuMDAjU2V4IGVkdWNhdGlvbiBvciBzZXh1YWxseSB0cmFuc21pdHRlZCBkaXNlYXNlIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjAyLjAwI1ByZW5hdGFsIG51dHJpdGlvbiByZXNvdXJjZXMgb3IgZmV0YWwgYWJ1c2UgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDMuMDAjUGFyZW50aW5nIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41OS4wNC4wMCNDaGlsZCBkZXZlbG9wbWVudCBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41OS4wNS4wMCNVbmRlcnN0YW5kaW5nIGRhdGUgcmFwZSBvciBkYXRpbmcgc2tpbGxzIG9yIGhhcmFzc21lbnQgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDYuMDAjQ2hpbGRiaXJ0aCBlZHVjYXRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDcuMDAjUHJlZ25hbmN5IGZyb20gY29uY2VwdGlvbiB0aHJvdWdoIGJpcnRoIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjA4LjAwI1VuZGVyc3RhbmRpbmcgdGhlIHJpc2tzIG9mIGJpcnRoIGRlZmVjdHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDkuMDAjUHJlZ25hbmN5IHNpbXVsYXRvcnMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMTAuMDAjSW5mYW50IHNpbXVsYXRvcnMgYW5kIGFjY2Vzc29yaWVzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjExLjAwI0luZmFudCBjYXJlIHRyYWluaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjEyLjAwI1VuZGVyc3RhbmRpbmcgcGh5c2ljYWwgb3IgZW1vdGlvbmFsIGNoaWxkIGFidXNlIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjEzLjAwI0Rpc2NpcGxpbmUgc2tpbGwgZWR1Y2F0aW9uIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIGZvciBwYXJlbnRzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjE0LjAwI0hvbWUgc2FmZXR5IG9yIGNoaWxkcHJvb2ZpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMTUuMDAjQ2FyZGlvIHB1bG1vbmFyeSByZXN1c2l0YXRpb24gb3IgIGJhc2ljIGxpZmUgc3VwcG9ydCBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41OS4xNi4wMCNVbmRlcnN0YW5kaW5nIGNoaWxkaG9vZCBpbGxuZXNzZXMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMTcuMDAjVW5kZXJzdGFuZGluZyBhdHRlbnRpb24gZGVmaWNpdCBoeXBlcmFjdGl2aXR5IGRpc29yZGVyIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjE4LjAwI0NoaWxkIGNhcmVnaXZlciBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41OS4xOS4wMCNCYWJ5c2l0dGluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC42MC4wMC4wMCNDdXJyaWN1bHVtIGd1aWRlcyBhbmQgcHJvamVjdHMgYW5kIGFjdGl2aXRpZXMgYW5kIGxlc3NvbnMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjAuMDEuMDAjTWlkZGxlIHNjaG9vbCBjdXJyaWN1bHVtIHJlc291cmNlIG9yIGlkZWEgYm9va3MjNjAuMTAuNjAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjAuMDIuMDAjSGlnaCBTY2hvb2wgY3VycmljdWx1bSByZXNvdXJjZSBvciBpZGVhIGJvb2tzIzYwLjEwLjYwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYwLjAzLjAwI0hvbWUgZWNvbm9taWNzIGluZGVwZW5kZW50IHN0dWR5IHByb2plY3RzIzYwLjEwLjYwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYwLjA0LjAwI0hvbWUgZWNvbm9taWNzIHByb2plY3RzIG9yIGFjdGl2aXRpZXMgcmVzb3VyY2VzIG9yIGd1aWRlcyM2MC4xMC42MC4wMC4wMAotdW5zcHNjNyM2MC4xMC42MS4wMC4wMCNWb2NhdGlvbmFsIHRlYWNoaW5nIGFpZHMgYW5kIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC42MS4wMS4wMCNBdXRvbW90aXZlIHRlYWNoaW5nIGFpZHMgb3IgbWF0ZXJpYWxzIzYwLjEwLjYxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYxLjAyLjAwI0NvbnN0cnVjdGlvbiB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42MS4wMC4wMAotdW5zcHNjNyM2MC4xMC42MS4wMy4wMCNEcmFmdGluZyBvciBkZXNpZ24gdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjEuMDQuMDAjRWxlY3Ryb25pY3Mgb3IgZWxlY3RyaWNpdHkgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjEuMDUuMDAjR3JhcGhpYyBhcnRzIG9yIHBob3RvZ3JhcGh5IHRlYWNoaW5nIGFpZHMgb3IgbWF0ZXJpYWxzIzYwLjEwLjYxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYxLjA2LjAwI0hvcnRpY3VsdHVyZSB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42MS4wMC4wMAotdW5zcHNjNyM2MC4xMC42MS4wNy4wMCNNYW51ZmFjdHVyaW5nIHRlYWNoaW5nIGFpZHMgb3IgbWF0ZXJpYWxzIzYwLjEwLjYxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYyLjAwLjAwI1RlY2hub2xvZ3kgdGVhY2hpbmcgYWlkcyBhbmQgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYyLjAxLjAwI0FncmljdWx0dXJlIHRlYWNoaW5nIGFpZHMgb3IgbWF0ZXJpYWxzIzYwLjEwLjYyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYyLjAyLjAwI0Jpb3RlY2hub2xvZ3kgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjIuMDMuMDAjQ29tbXVuaWNhdGlvbnMgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjIuMDQuMDAjQ29tcHV0ZXIgc2NpZW5jZSB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42Mi4wMC4wMAotdW5zcHNjNyM2MC4xMC42Mi4wNS4wMCNFbmVyZ3kgb3IgcG93ZXIgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjIuMDYuMDAjRW52aXJvbm1lbnRhbCB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42Mi4wMC4wMAotdW5zcHNjNyM2MC4xMC42Mi4wNy4wMCNNYXRlcmlhbHMgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjIuMDguMDAjTWVkaWNhbCB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42Mi4wMC4wMAotdW5zcHNjNyM2MC4xMC42Mi4wOS4wMCNUcmFuc3BvcnRhdGlvbiB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42Mi4wMC4wMAotdW5zcHNjNyM2MC4xMC42My4wMC4wMCNGb3JlbnNpYyBzY2llbmNlIHRlYWNoaW5nIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjMuMDEuMDAjRm9yZW5zaWMgc2NpZW5jZSBraXRzIzYwLjEwLjYzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjY0LjAwLjAwI0VsZWN0cm9uaWNzIHRlYWNoaW5nIHN1cHBsaWVzIGFuZCBlcXVpcG1lbnQjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjQuMDEuMDAjRWxlY3Ryb25pY3Mga2l0cyM2MC4xMC42NC4wMC4wMAotdW5zcHNjNyM2MC4xMC42NC4wMi4wMCNFbGVjdHJvbmljcyB0ZWFjaGluZyBzdXBwbGllcyM2MC4xMC42NC4wMC4wMAotdW5zcHNjNyM2MC4xMC42NC4wMy4wMCNGb3JlbnNpYyBzY2llbmNlIHRlYWNoaW5nIHN1cHBsaWVzIzYwLjEwLjY0LjAwLjAwCi11bnNwc2M3IzYwLjExLjAwLjAwLjAwI0NsYXNzcm9vbSBkZWNvcmF0aXZlcyBhbmQgc3VwcGxpZXMjNjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTAuMDAuMDAjQ2xhc3Nyb29tIENoYXJ0cyBvciBjbGFzc3Jvb20gcG9zdGVycyM2MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMC4wMS4wMCNDaGFydCBwYWNrcyM2MC4xMS4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMC4wMi4wMCNDbGFzc3Jvb20gY2hhcnRzIzYwLjExLjEwLjAwLjAwCi11bnNwc2M3IzYwLjExLjEwLjAzLjAwI0NsYXNzcm9vbSBwb3N0ZXJzIG9yIHNldHMjNjAuMTEuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTAuMDQuMDAjRG8gaXQgeW91cnNlbGYgcG9zdGVycyM2MC4xMS4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMS4wMC4wMCNCdWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjAwLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjAxLjAwI0JpZyBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjAyLjAwI0NhbGVuZGFyIGJ1bGxldGluZyBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjAzLjAwI0Vhcmx5IGNoaWxkaG9vZCBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjA0LjAwI0xhbmd1YWdlIGJ1bGxldGluIGJvYXJkIHNldHMjNjAuMTEuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTEuMDUuMDAjTWF0aCBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjA2LjAwI011bHRpcHVycG9zZSBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjA3LjAwI1NjaWVuY2UgYnVsbGV0aW4gYm9hcmQgc2V0cyM2MC4xMS4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMS4wOC4wMCNTZWFzb25hbCBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjA5LjAwI1NvY2lhbCBzdHVkaWVzIGJ1bGxldGluIGJvYXJkIHNldHMjNjAuMTEuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDAuMDAjQnVsbGV0aW4gYm9hcmQgYm9yZGVycyBhbmQgdHJpbW1lcnMjNjAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDEuMDAjQ2xhc3Nyb29tIGJhbm5lcnMjNjAuMTEuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDIuMDAjQm9yZGVyIHBhY2tzIzYwLjExLjEyLjAwLjAwCi11bnNwc2M3IzYwLjExLjEyLjAzLjAwI0NsYXNzcm9vbSBoZWFkZXJzIzYwLjExLjEyLjAwLjAwCi11bnNwc2M3IzYwLjExLjEyLjA0LjAwI0NvcnJpZ3VhdGVkIGJvcmRlcnMgb3IgdHJpbW1lcnMjNjAuMTEuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDUuMDAjRGllIGN1dCBzaGFwZWQgc2NhbGxvcGVkIGJvcmRlcnMgb3IgdHJpbW1lcnMjNjAuMTEuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDYuMDAjU3BhcmtsZSBib3JkZXJzIG9yIHRyaW1tZXJzIzYwLjExLjEyLjAwLjAwCi11bnNwc2M3IzYwLjExLjEyLjA3LjAwI1N0cmFpZ2h0IGJvcmRlcnMgb3IgdHJpbW1lcnMjNjAuMTEuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDguMDAjQm9yZGVyIG9yIFRyaW1tZXIgc3RvcmFnZSM2MC4xMS4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMy4wMC4wMCNEZWNvcmF0aXZlIGxldHRlcnMgYW5kIG51bWJlcnMjNjAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTMuMDEuMDAjTGV0dGVyZWQgb3IgbnVtYmVyZWQgYmxvY2tzIzYwLjExLjEzLjAwLjAwCi11bnNwc2M3IzYwLjExLjEzLjAyLjAwI0Nhc3VhbCBsZXR0ZXJzIG9yIG51bWJlcnMjNjAuMTEuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTMuMDMuMDAjSXRhbGljIGxldHRlcnMgb3IgbnVtYmVycyM2MC4xMS4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMy4wNC4wMCNTZWxmIGFkaGVzaXZlIGxldHRlcnMgb3IgbnVtYmVycyM2MC4xMS4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMy4wNS4wMCNTcGFya2xlIGxldHRlcnMgb3IgbnVtYmVycyM2MC4xMS4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMy4wNi4wMCNUcmFjaW5nIGxldHRlcnMgb3IgbnVtYmVycyM2MC4xMS4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wMC4wMCNTcGVjaWFsdHkgZGVjb3JhdGl2ZXMgZm9yIHRoZSBjbGFzc3Jvb20gYW5kIGRlY29yYXRpdmUgYWNjZXNzb3JpZXMjNjAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTQuMDEuMDAjQ2xhc3Nyb29tIGRlY29yYXRpdmUga2l0cyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wMi4wMCNEb29yIGRlY29yYXRpb25zIzYwLjExLjE0LjAwLjAwCi11bnNwc2M3IzYwLjExLjE0LjAzLjAwI01vYmlsZXMjNjAuMTEuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTQuMDQuMDAjVHdvIHNpZGVkIGRlY29yYXRpb25zIzYwLjExLjE0LjAwLjAwCi11bnNwc2M3IzYwLjExLjE0LjA1LjAwI1dpbmRvdyBjbGluZyBkZWNvcmF0aW9ucyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wNy4wMCNEZWNvcmF0aXZlIFN0b3JhZ2UgU3lzdGVtcyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wOC4wMCNEZWNvcmF0aXZlIHRhcGVzIG9yIHR3aXN0cyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wOS4wMCNEZWNvcmF0aXZlIGJ1dHRvbnMjNjAuMTEuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTQuMTAuMDAjRGVjb3JhdGl2ZSBzaGFwZXMgb3Igc3RyaW5ncyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4wMC4wMC4wMCNBcnRzIGFuZCBjcmFmdHMgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyBhbmQgc3VwcGxpZXMjNjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTAuMDAuMDAjQXJ0IzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjAxLjAwI1BhaW50aW5ncyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wMi4wMCNTY3VscHR1cmVzIzYwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjAzLjAwI1N0YXR1YXJ5IzYwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjA0LjAwI1BvcnRyYWl0cyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wNS4wMCNEcmF3aW5ncyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wNi4wMCNQaWN0dXJlcyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wNy4wMCNMaXRob2dyYXBocyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wOC4wMCNQb3N0ZXJzIzYwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjA5LjAwI0RlY29yYXRpdmUgcG90IzYwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjEwLjAwI1Njcm9sbHMjNjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTAuMTEuMDAjUGhvdG9ncmFwaHMjNjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMDAuMDAjQ2FudmFzZXMgYW5kIGZpbG1zIGFuZCBib2FyZHMgYW5kIGFydGlzdHMgcGFwZXJzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjAxLjAwI1N1bHBoaXRlIGRyYXdpbmcgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMDIuMDAjR3JvdW5kd29vZCBkcmF3aW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjAzLjAwI1RyYWNpbmcgb3IgdmVsbHVtIGRyYXdpbmcgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMDQuMDAjQm9uZCBkcmF3aW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjA1LjAwI0NoYXJjb2FsIG9yIHBhc3RlbCBkcmF3aW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjA2LjAwI0JyaXN0b2wgZHJhd2luZyBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4wNy4wMCNXYXRlcmNvbG9yIHBhcGVyIHNoZWV0cyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4wOC4wMCNXYXRlcmNvbG9yIHBhcGVyIHBhZHMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMDkuMDAjV2F0ZXJjb2xvciBwYXBlciBibG9ja3MjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMTAuMDAjRmluZ2VyIHBhaW50IHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjExLjAwI1N1bHBoaXRlIGNvbnN0cnVjdGlvbiBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4xMi4wMCNHcm91bmR3b29kIGNvbnN0cnVjdGlvbiBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4xMy4wMCNGb2lsIGNvbnN0cnVjdGlvbiBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4xNC4wMCNPcmlnYW1pIGNyYWZ0IHBhcGVycyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4xNS4wMCNQYXBlciBvciBwbGFzdGljIENvbmZldHRpIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjE2LjAwI0NyZXBlIHBhcGVyIGZvciBjcmFmdHMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMTcuMDAjQ3JhZnQgdGlzc3VlIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjE4LjAwI0NvcnJ1Z2F0ZWQgY3JhZnQgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMTkuMDAjUGF0dGVybiBwcmludGVkIGNyYWZ0IHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjIwLjAwI1NlbGYgYWRoZXNpdmUgY3JhZnQgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMjEuMDAjR2xvdyBpbiB0aGUgZGFyayBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4yMy4wMCNIYW5kIG1hZGUgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMjQuMDAjS3JhZnQgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMjUuMDAjQ2FudmFzIHBhbmVscyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4yNi4wMCNQcmVzdHJldGNoZWQgY2FudmFzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjI3LjAwI1ByaW1lZCBjYW52YXMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMjguMDAjVW5wcmltZWQgY2FudmFzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjI5LjAwI01hc29uaXRlIHBhbmVscyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4zMC4wMCNDYW52YXMgbGlrZSBwYXBlciBwYWRzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjMxLjAwI0phcGFuZXNlIHByaW50bWFraW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjMyLjAwI0xpdGhvZ3JhcGh5IG9yIGludGFnbGlvIHByaW50bWFraW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjMzLjAwI0Jsb2NrcHJpbnRpbmcgcHJpbnRtYWtpbmcgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMzQuMDAjRm9pbCBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4zNS4wMCNBY2V0YXRlIG9yIHZpbnlsIG9yIHBvbHllc3RlciBmaWxtcyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4zNi4wMCNDZWxsb3BoYW5lIGZpbG1zIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjM3LjAwI0FjcnlsaWMgc2hlZXRzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjM4LjAwI0lsbHVzdHJhdGlvbiBib2FyZHMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMzkuMDAjTWF0IGJvYXJkcyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS40MC4wMCNNb3VudGluZyBib2FyZCM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS40MS4wMCNGb2FtIGNvcmUgbW91bnRpbmcgYm9hcmQjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuNDIuMDAjVGFnYm9hcmQgb3IgcmFpbHJvYWQgYm9hcmQjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuNDMuMDAjRGlzcGxheSBib2FyZCM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS40NC4wMCNTY3JhdGNoIGFydCBwYXBlcnMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuNDUuMDAjU2NyYXRjaCBhcnQgYm9hcmRzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjQ2LjAwI1NjcmF0Y2ggYXJ0IGFjY2Vzc29yaWVzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjAwLjAwI0NsYXNzcm9vbSBhbmQgZmluZSBhcnQgcGFpbnQgYW5kIG1lZGl1bXMgYW5kIGFwcGxpY2F0b3JzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wMS4wMCNUcmFkaXRpb25hbCBsaXF1aWQgdGVtcGVyYSBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wMi4wMCNDb250ZW1wb3JhcnkgbGlxdWlkIHRlbXBlcmEgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMDMuMDAjUG93ZGVyZWQgdGVtcGVyYSBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wNC4wMCNXYXNoYWJsZSB0ZW1wZXJhIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjA1LjAwI1RlbXBlcmEgY2FrZXMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMDYuMDAjTGlxdWlkIGZhY2Ugb3IgYm9keSBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wNy4wMCNDYWtlIGZhY2Ugb3IgYm9keSBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wOC4wMCNNYXJrZXIgZmFjZSBvciBib2R5IHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjA5LjAwI1RlbXBvcmFyeSB0YXR0b28gcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMTAuMDAjV2FzaGFibGUgZmluZ2VyIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjExLjAwI1NjaG9vbCBzdHlsZSBhY3J5bGljIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjEyLjAwI0FjcnlsaWMgYWlyYnJ1c2ggcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMTMuMDAjU3ludGhldGljIGhlYXQgdHJlYXRlZCBvaWwgcGFpbnQgb3IgbWVkaXVtcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4xNC4wMCNXYXRlciBzb2x1YmxlIG9pbCBwYWludCBvciBtZWRpdW1zIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjE1LjAwI0xvdyB2aXNjb3NpdHkgcmVtb3ZhYmxlIGdsYXNzIG9yIGNlcmFtaWMgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMTYuMDAjTG93IHZpc2Nvc2l0eSBwZXJtYW5lbnQgZ2xhc3Mgb3IgY2VyYW1pYyBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4xNy4wMCNIaWdoIHZpc2Nvc2l0eSBHZWwgcmVtb3ZhYmxlIGdsYXNzIG9yIGNlcmFtaWMgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMTguMDAjSGlnaCB2aXNjb3NpdHkgR2VsIHBlcm1hbmVudCBnbGFzcyBvciBjZXJhbWljIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjE5LjAwI092ZW4gYmFrZWQgZ2xhc3Mgb3IgY2VyYW1pYyBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4yMC4wMCNNYXJrZXIgZGVsaXZlcnkgc3lzdGVtIGdsYXNzIG9yIGNlcmFtaWMgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMjEuMDAjUGFuIHdhdGVyY29sb3IgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMjIuMDAjVHViZSB3YXRlcmNvbG9yIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjIzLjAwI0xpcXVpZCB3YXRlcmNvbG9yIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjI0LjAwI0xpcXVpZCB3YXRlcmNvbG9yIGZyaXNrZXQgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMjUuMDAjV2F0ZXJjb2xvciBwYWludGluZyBtZWRpdW1zIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjI2LjAwI1dhdGVyY29sb3IgYnJ1c2hlcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4yNy4wMCNPcmllbnRhbCBicnVzaGVzIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjI4LjAwI1V0aWxpdHkgYnJ1c2hlcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4yOS4wMCNTcGVjaWFsdHkgYnJ1c2hlcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zMC4wMCNFYXNlbCBicnVzaGVzIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjMxLjAwI1BhbGV0dGUga25pdmVzIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjMyLjAwI0JyYXllcnMgZm9yIGhhbmQgcHJpbnRpbmcjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMzMuMDAjU3BvbmdlIHN0YW1wcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zNC4wMCNTY3JhcGVycyBmb3IgcGFpbnQgYXBwbGljYXRpb24jNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMzUuMDAjUGlwZXR0ZXMgZm9yIHBhaW50IG9yIGR5ZSBtaXhpbmcjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMzYuMDAjQ29tYnMgb3IgdG9vbHMgZm9yIHBhaW50IG9yIGluayBhcHBsaWNhdGlvbiM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zNy4wMCNQYWxldHRlcyBmb3IgcGFpbnQgb3IgaW5rIG1peGluZyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zOC4wMCNQYWludCBwb3RzIGZvciBwYWludCBzdG9yYWdlIG9yIG1peGluZyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zOS4wMCNQYWludCBjdXBzIG9yIGJvdHRsZXMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDEuMDAjQnJ1c2ggb3IgdG9vbCBjbGVhbmVycyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi40Mi4wMCNQYWludCBhcHJvbnMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDMuMDAjQXJ0aXN0cyBTbW9ja3MjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDQuMDAjU3RyZXRjaGVyIHN0cmlwcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi40NS4wMCNDYW52YXMgc3RyZXRjaGVycyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi40Ni4wMCNNZXRhbCBlYXNlbHMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDcuMDAjV29vZCBlYXNlbHMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDguMDAjVGFibGUgdG9wIGVhc2VscyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi40OS4wMCNQcmVzZW50YXRpb24gZWFzZWxzIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEzLjAwLjAwI0FydCBhbmQgY3JhZnQgY3V0dGluZyBwcm9kdWN0cyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMy4wMS4wMCNHdWlsbG90aW5lIHBhcGVyIHRyaW1tZXJzIzYwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEzLjAyLjAwI01hdCBjdXR0ZXIjNjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTMuMDMuMDAjTWF0IGtuaXZlcyM2MC4xMi4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMy4wNC4wMCNBcnRpc3Qga25pdmVzIzYwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEzLjA1LjAwI1JvdGFyeSBwYXBlciBvciBmYWJyaWMgY3V0dGVyIzYwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEzLjA2LjAwI0NpcmNsZSBvciBvdmFsIHBhcGVyIGN1dHRlcnMjNjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMDAuMDAjUGljdHVyZSBGcmFtaW5nIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjE0LjAxLjAwI1ByZSBhc3NlbWJsZWQgd29vZCBwaWN0dXJlIGZyYW1lcyM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wMi4wMCNXb29kIHNlY3Rpb24gcGljdHVyZSBmcmFtZXMjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMDMuMDAjUHJlIGFzc2VtYmxlZCBtZXRhbCBwaWN0dXJlIGZyYW1lcyM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wNC4wMCNNZXRhbCBzZWN0aW9uIHBpY3R1cmUgZnJhbWVzIzYwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE0LjA1LjAwI0FkanVzdGFibGUgcGljdHVyZSBmcmFtZXMjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMDYuMDAjUGxhc3RpYyBwaWN0dXJlIGZyYW1lcyM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wNy4wMCNDbGVhciBib3ggcGljdHVyZSBmcmFtZSM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wOC4wMCNQb2ludCBkcml2ZXJzIG9yIGFjY2Vzc29yaWVzIGZvciBwaWN0dXJlIGZyYW1lcyM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wOS4wMCNNaXRyZSBib3gjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMTAuMDAjUGljdHVyZSBIYW5naW5nIGRldmljZXMjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMTEuMDAjQWNyeWxpYyBwYW5lbHMgZm9yIHBpY3R1cmUgZnJhbWVzIzYwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE0LjEyLjAwI0dsYXNzIHBhbmVscyBmb3IgcGljdHVyZSBmcmFtZXMjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMDAuMDAjRHJhd2luZyB0b29scyBhbmQgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjAxLjAwI1dhdGVyIGJhc2VkIG1hcmtlcnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMDIuMDAjU29sdmVudCBiYXNlZCBtYXJrZXJzIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjAzLjAwI1dhc2hhYmxlIG1hcmtlcnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMDQuMDAjQ2FsbGlncmFwaHkgbWFya2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4wNS4wMCNGYWJyaWMgbWFya2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4wNi4wMCNNZXRhbGxpYyBtYXJrZXJzIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjA3LjAwI1RlbXBlcmEgb3IgY2hhbGsgd2luZG93IG1hcmtlcnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMDguMDAjUGFpbnQgbWFya2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4wOS4wMCNXYXggYmFzZWQgY3JheW9ucyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xMC4wMCNTb3kgYmFzZWQgY3JheW9ucyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xMS4wMCNTcGVjaWFsdHkgY3JheW9ucyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xMi4wMCNXYXRlcmNvbG9yIGNyYXlvbnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMTMuMDAjRHJ5IHBhc3RlbCM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xNC4wMCNDaGFsayBwYXN0ZWwjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMTUuMDAjT2lsIGJhc2VkIHBhc3RlbCM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xNi4wMCNDb21wcmVzc2VkIGNoYXJjb2FsIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjE3LjAwI1ZpbmUgY2hhcmNvYWwjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMTguMDAjR3JhcGhpdGUgcGVuY2lscyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xOS4wMCNXYXggYmFzZWQgY29sb3JlZCBkcmF3aW5nIHBlbmNpbHMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMjAuMDAjQ2hhcmNvYWwgcGVuY2lscyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4yMS4wMCNXYXRlcmNvbG9yIHBlbmNpbHMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMjIuMDAjV2F0ZXJiYXNlZCBwZW5zIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjIzLjAwI1Blcm1hbmVudCBwZW5zIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjI0LjAwI0dlbCBwZW5zIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjI1LjAwI1RlY2huaWNhbCBwZW5zIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjI2LjAwI0NhbGxpZ3JhcGh5IHBlbnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMjguMDAjV2F0ZXIgYmFzZWQgZHJhd2luZyBpbmsjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMjkuMDAjU29sdmVudCBiYXNlZCBkcmF3aW5nIGluayM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4zMC4wMCNDYWxsaWdyYXBoeSBkcmF3aW5nIGluayM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4zMS4wMCNQaW5rIHBlbmNpbCBlcmFzZXJzIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjMyLjAwI0tuZWFkZWQgZXJhc2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4zMy4wMCNWaW55bCBlcmFzZXJzIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjM0LjAwI1BsYXN0aWMgZXJhc2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4zNS4wMCNHdW0gZXJhc2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNi4wMC4wMCNTdHVkaW8gYWlkcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNi4wMS4wMCNXb29kIE1hbm5lcXVpbnMjNjAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTYuMDIuMDAjQ2xlYXIgYWNyeWxpYyBtaXJyb3JzIG9yIHBhbmVscyM2MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNi4wMy4wMCNQbGFzdGljIFJ1YmJpbmcgcGxhdGVzIzYwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE2LjA0LjAwI1N0dWRpbyBhaWQgYWNjZXNzb3JpZXMjNjAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTYuMDUuMDAjQW5hdG9taWNhbCBtb2RlbHMjNjAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDAuMDAjUHJpbnRtYWtpbmcgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjAxLjAwI1J1YmJlciBzdGFtcGluZyBzdGFtcHMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDIuMDAjUnViYmVyIHN0YW1waW5nIHN0YW1wIHBhZHMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDMuMDAjUnViYmVyIHN0YW1waW5nIGFjY2Vzc29yaWVzIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjA0LjAwI0xpbm9sZXVtIGZvciBibG9jayBwcmludGluZyM2MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNy4wNS4wMCNXb29kIGJsb2NrcyBmb3IgcHJpbnRpbmcjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDYuMDAjU3ludGhldGljIGJsb2NrcyBmb3IgcHJpbnRpbmcjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDcuMDAjQmxvY2sgcHJpbnRpbmcgYWNjZXNzb3JpZXMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDguMDAjSW50YWdsaW8gb3IgbGl0aG9ncmFwaHkgcGxhdGVzIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjA5LjAwI0ludGFnbGlvIG9yIGxpdGhvZ3JhcGh5IGJsYW5rZXRzIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjEwLjAwI0ludGFnbGlvIG9yIGxpdGhvZ3JhcGh5IHdpcGVzIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjExLjAwI0ludGFnbGlvIG9yIGxpdGhvZ3JhcGh5IGhvdCBwbGF0ZXMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMTIuMDAjSW50YWdsaW8gb3IgbGl0aG9ncmFwaHkgcHJpbnRpbmcgcHJlc3NlcyM2MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNy4xMy4wMCNQcmludGluZyBCYXJlbnMgYW5kIEJyYXllcnMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMTQuMDAjSW50YWdsaW8gRXRjaGluZyBvciBlbmdyYXZpbmcgdG9vbHMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMTUuMDAjU2lsa3NjcmVlbiBzY3JlZW5zIG9yIHByaW50aW5nIHN0YXRpb25zIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjE2LjAwI1NpbGtzY3JlZW4gYWNjZXNzb3JpZXMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMDAuMDAjUHJpbnRpbmcgYW5kIGRyYXdpbmcgaW5rcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wMS4wMCNXYXRlciBiYXNlZCBwb3N0ZXIgaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wMi4wMCNXYXRlciBiYXNlZCBhY3J5bGljIGlua3MjNjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMDMuMDAjT2lsIGJhc2VkIHNpbGtzY3JlZW4gaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wNC4wMCNXYXRlciBiYXNlZCBUZXh0aWxlIGlua3MjNjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMDUuMDAjT2lsIGJhc2VkIHRleHRpbGUgaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wNi4wMCNQcmludG1ha2luZyBzdWJsaW1hdGlvbiBpbmtzIzYwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE4LjA3LjAwI09pbCBiYXNlZCBpbnRhZ2xpbyBvciBsaXRob2dyYXBoeSBpbmtzIzYwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE4LjA4LjAwI09pbCBiYXNlZCBtb25vcHJpbnQgaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wOS4wMCNXYXRlciBiYXNlZCBtb25vcHJpbnQgaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4xMC4wMCNXYXRlciBiYXNlZCBkcmF3aW5nIGlua3MjNjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMTEuMDAjU29sdmVudCBiYXNlZCBkcmF3aW5nIGlua3MjNjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMTIuMDAjQ2FsbGlncmFwaHkgZHJhd2luZyBpbmtzIzYwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE4LjEzLjAwI1NpbGtzY3JlZW4gaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOS4wMC4wMCNBcnQgZmFicmljIGFuZCBmYWJyaWMgZGVjb3JhdGlvbiBtYXRlcmlhbHMgYW5kIHN1cHBsaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjE5LjAxLjAwI011c2xpbiM2MC4xMi4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOS4wMi4wMCNGZWx0IzYwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE5LjAzLjAwI0NyYWZ0IGZ1ciM2MC4xMi4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOS4wNC4wMCNDb3R0b24gYmxlbmRzIzYwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE5LjA1LjAwI0NhbnZhcyBpbXByaW50YWJsZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMDYuMDAjUHJlIHNlbnNpdGl6ZWQgaW1wcmludGFibGVzIzYwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE5LjA3LjAwI0NvdHRvbiBpbXByaW50YWJsZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMDguMDAjQmxlbmRlZCBpbXByaW50YWJsZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMDkuMDAjQmF0aWsgd2F4ZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMTAuMDAjQmF0aWsgYWNjZXNzb3JpZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMTEuMDAjQmF0aWsgZmFicmljIzYwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjIwLjAwLjAwI1Nld2luZyBhbmQgc3RpdGNoZXJ5IGFuZCB3ZWF2aW5nIGVxdWlwbWVudCBhbmQgYWNjZXNzb3JpZXMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjAuMDEuMDAjV2VhdmluZyBvciB0YXBlc3RyeSBuZWVkbGVzIzYwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIwLjAyLjAwI1dlYXZpbmcgYWNjZXNzb3JpZXMjNjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjAuMDMuMDAjSGFuZCBzZXdpbmcgbmVlZGxlcyM2MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMC4wNC4wMCNTdHJpbmcgYXJ0IGtpdHMjNjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjAuMDUuMDAjSGFuZCBsb29tcyM2MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMC4wNi4wMCNUYWJsZSBsb29tcyM2MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMC4wNy4wMCNGbG9vciBsb29tcyM2MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMC4wOC4wMCNSZXhsYWNlIzYwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIwLjA5LjAwI0xhY2luZyBvciBzdHJpbmdpbmcgYWNjZXNzb3JpZXMjNjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjEuMDAuMDAjQ2FuZGxlbWFraW5nIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIxLjAxLjAwI0NhbmRsZW1ha2luZyB3aWNrcyM2MC4xMi4yMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMS4wMi4wMCNDYW5kbGVtYWtpbmcgZm9ybXMjNjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjEuMDMuMDAjQ2FuZGxlbWFraW5nIGFjY2Vzc29yaWVzIzYwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIyLjAwLjAwI1dvb2QgY3JhZnRzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIyLjAxLjAwI1dvb2QgY3JhZnQgbWF0ZXJpYWxzIzYwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIyLjAyLjAwI0ZpbmlzaGluZyBtYXRlcmlhbHMjNjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjIuMDMuMDAjV29vZCBidXJuaW5nIHRvb2xzIzYwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIyLjA0LjAwI0NhcnZpbmcgdG9vbHMjNjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjMuMDAuMDAjQmFza2V0cnkgbWFraW5nIHN1cHBsaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIzLjAxLjAwI0Jhc2tldHJ5IHJlZWQjNjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjMuMDIuMDAjQmFza2V0cnkgcHJvamVjdCBraXRzIzYwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjI0LjAwLjAwI1N0YWluZWQgZ2xhc3MgbWFraW5nIHN1cHBsaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjI0LjAxLjAwI1N0YWluZWQgR2xhc3MgZnJhZ21lbnRzIzYwLjEyLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI0LjAyLjAwI1N0YWluZWQgZ2xhc3MgdG9vbHMgb3IgYWNjZXNzb3JpZXMjNjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDAuMDAjUGFwZXIgY3JhZnRzIGFuZCBoYW5kIG1hZGUgcGFwZXJtYWtpbmcjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDEuMDAjUGFwZXIgc2hhcGluZyB0b29scyM2MC4xMi4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNS4wMi4wMCNQYXBlciBwaWN0dXJlIGZyYW1lcyM2MC4xMi4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNS4wMy4wMCNQYXBlciBwbGF0ZXMgb3IgdHJheXMjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDQuMDAjUGFwZXIgZmlsdGVycyM2MC4xMi4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNS4wNS4wMCNDb3JydWdhdGVkIGNhcmRib2FyZCBzaGFwZXMjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDYuMDAjUGFwZXIgRG9pbGllcyM2MC4xMi4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNS4wNy4wMCNEZWNrbGVzIG9yIG1vbGRzIGZvciBoYW5kIG1hZGUgcGFwZXIjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDguMDAjQ291Y2ggc2hlZXRzIG9yIGZlbHRzIGZvciBoYW5kIG1hZGUgcGFwZXIjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDkuMDAjUHVscCBvciByYXcgbWF0ZXJpYWxzIGZvciBoYW5kIG1hZGUgcGFwZXIjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjYuMDAuMDAjTW9zYWljcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNi4wMS4wMCNNb3NhaWMgdGlsZXMjNjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjYuMDIuMDAjTW9zYWljIG1vbGRzIzYwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI2LjAzLjAwI01vc2FpYyB0b29scyM2MC4xMi4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNi4wNC4wMCNNb3NhaWMgYWNjZXNzb3JpZXMjNjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjcuMDAuMDAjRW5hbWVsaW5nIHBhaW50cyBhbmQgYWNjZXNzb3JpZXMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjcuMDEuMDAjRW5hbWVsaW5nIHBhaW50cyBvciBtZWRpdW1zIzYwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI3LjAyLjAwI0NvcHBlciBzaGFwZXMjNjAuMTIuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjcuMDMuMDAjRW5hbWVsaW5nIGFjY2Vzc29yaWVzIzYwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI3LjA0LjAwI0VuYW1lbGluZyBLaWxucyM2MC4xMi4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMi4yOC4wMC4wMCNNYXNrbWFraW5nIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjI4LjAxLjAwI01hc2ttYWtpbmcgZm9ybXMjNjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjkuMDAuMDAjQmVhZHMgb3IgYmVhZGluZyBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yOS4wMS4wMCNTZWVkIGJlYWRzIzYwLjEyLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI5LjAyLjAwI1BvbnkgYmVhZHMjNjAuMTIuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjkuMDMuMDAjV29vZCBiZWFkcyM2MC4xMi4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yOS4wNC4wMCNTdHJhdyBiZWFkcyM2MC4xMi4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yOS4wNS4wMCNDZXJhbWljIGJlYWRzIzYwLjEyLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI5LjA2LjAwI0dsYXNzIGJlYWRzIzYwLjEyLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI5LjA3LjAwI0Fzc29ydGVkIG9yIGRlY29yYXRpdmUgYmVhZHMjNjAuMTIuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjkuMDguMDAjQmVhZCBhY2Nlc3NvcmllcyM2MC4xMi4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMC4wMC4wMCNGb2FtIGNyYWZ0cyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMC4wMS4wMCNTdHlyb2ZvYW0gc2hhcGVzIzYwLjEyLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjMwLjAyLjAwI1Rvb2xzIGZvciBmb2FtIGNyYWZ0cyM2MC4xMi4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMS4wMC4wMCNDaGVuaWxsZSBzdGVtIGNyYWZ0cyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMS4wMS4wMCNKdW1ibyBjaGVuaWxsZSBzdGVtcyM2MC4xMi4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMS4wMi4wMCNDb3R0b24gY2hlbmlsbGUgc3RlbXMjNjAuMTIuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzEuMDMuMDAjQnVtcHMgY2hlbmlsbGUgc3RlbXMjNjAuMTIuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzIuMDAuMDAjUmliYm9uIG1ha2luZyBtYXRlcmlhbHMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzIuMDEuMDAjUGFwZXIgcmliYm9ucyM2MC4xMi4zMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMi4wMi4wMCNTaWxrIHJpYmJvbnMjNjAuMTIuMzIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzIuMDMuMDAjU3ludGhldGljIHJpYmJvbnMjNjAuMTIuMzIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzIuMDQuMDAjRGVjb3JhdGl2ZSByaWJib25zIzYwLjEyLjMyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjMzLjAwLjAwI0NyYWZ0IFBvbXMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzMuMDEuMDAjQWNyeWxpYyBjcmFmdCBwb21zIzYwLjEyLjMzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjMzLjAyLjAwI0dsaXR0ZXIgY3JhZnQgcG9tcyM2MC4xMi4zMy4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMy4wMy4wMCNDcmFmdCBwb20gYmVhZHojNjAuMTIuMzMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzQuMDAuMDAjV2lnZ2xlIGV5ZXMgbWF0ZXJpYWxzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjM0LjAxLjAwI05vbiBzZWxmIGFkaGVzaXZlIHdpZ2dsZSBleWVzIzYwLjEyLjM0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM0LjAyLjAwI1NlbGYgYWRoZXNpdmUgd2lnZ2xlIGV5ZXMjNjAuMTIuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzQuMDMuMDAjRGVjb3JhdGl2ZSB3aWdnbGUgZXllcyM2MC4xMi4zNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNS4wMC4wMCNMZWF0aGVyIGNyYWZ0IG1hdGVyaWFscyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNS4wMS4wMCNMZWF0aGVyIG9yIGxlYXRoZXIgbGFjaW5nIG1hdGVyaWFscyM2MC4xMi4zNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNS4wMi4wMCNMZWF0aGVyIGFjY2Vzc29yaWVzIzYwLjEyLjM1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM2LjAwLjAwI0dsaXR0ZXIjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzYuMDEuMDAjR2xpdHRlciBnbHVlIzYwLjEyLjM2LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM2LjAyLjAwI0dsaXR0ZXIgZG90cyM2MC4xMi4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNi4wMy4wMCNHbGl0dGVyIGpld2VscyM2MC4xMi4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNi4wNC4wMCNQbGFzdGljIGdsaXR0ZXIjNjAuMTIuMzYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzYuMDUuMDAjSXJyaWRlc2NlbnQgZ2xpdHRlciM2MC4xMi4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNi4wNi4wMCNNZXRhbGxpYyBnbGl0dGVyIzYwLjEyLjM2LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM3LjAwLjAwI01hY3JhbWUgY3JhZnQgbWF0ZXJpYWxzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNy4wMS4wMCNNYWNyYW1lIGNvcmQjNjAuMTIuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzcuMDIuMDAjTWFjcmFtZSBiZWFkcyM2MC4xMi4zNy4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNy4wMy4wMCNNYWNyYW1lIGFjY2Vzc29yaWVzIzYwLjEyLjM3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM4LjAwLjAwI01hcmJsaW5nIHN1cHBsaWVzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zOC4wMS4wMCNNYXJibGluZyBpbmtzIzYwLjEyLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM4LjAyLjAwI01hcmJsaW5nIGFjY2Vzc29yaWVzIzYwLjEyLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM5LjAwLjAwI1NlcXVpbnMgYW5kIHRyaW1zIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjM5LjAxLjAwI0RlY29yYXRpdmUgc2VxdWlucyBvciB0cmltcyM2MC4xMi4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMi40MC4wMC4wMCNDb3JrIGNyYWZ0IHN1cHBsaWVzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi40MC4wMS4wMCNDb3JrIHNoZWV0cyM2MC4xMi40MC4wMC4wMAotdW5zcHNjNyM2MC4xMi40MC4wMi4wMCNDb3JrIHN0b3BwZXJzIzYwLjEyLjQwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQxLjAwLjAwI011bHRpY3VsdHVyYWwgcHJvamVjdCBtYXRlcmlhbHMgYW5kIGFjY2Vzc29yaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQxLjAxLjAwI011bHRpY3VsdHVyYWwgcGFpbnRpbmcgcHJvZHVjdHMjNjAuMTIuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDEuMDIuMDAjTXVsdGljdWx0dXJhbCBjcmFmdHMgcHJvZHVjdHMjNjAuMTIuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDIuMDAuMDAjQ3Jvc3MgY3VycmljdWxhciBwcm9qZWN0cyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi40Mi4wMS4wMCNNeWxhciBzY3VscHR1cmVzIzYwLjEyLjQyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjAwLjAwI0NsYXkgYW5kIG1vZGVsaW5nIGNvbXBvdW5kcyBhbmQgY2VyYW1pY3MgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4wMS4wMCNNb2lzdCBraWxuIGZpcmVkIGNsYXkjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMDIuMDAjRHJ5IGtpbG4gZmlyZWQgY2xheSM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4wMy4wMCNLaWxuIGZ1cm5pdHVyZSM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4wNC4wMCNLaWxucyBmb3IgZmlyaW5nIGNlcmFtaWNzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjA1LjAwI0tpbG4gYWNjZXNzb3JpZXMgZm9yIGZpcmluZyBjZXJhbWljcyM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4wNi4wMCNQb3R0ZXJzIHdoZWVscyBmb3IgaGFuZCBtYWRlIGNlcmFtaWNzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjA3LjAwI0V4dHJ1ZGVycyBmb3IgbW9kZWxpbmcgbWF0ZXJpYWxzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjA4LjAwI0NvbmVzIGZvciBmaXJpbmcga2lsbnMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMDkuMDAjUG90dGVyeSBCYXR0cyM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4xMC4wMCNEZWNvcmF0aW5nIHdoZWVscyBmb3IgcG90dGVyeSM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4xMS4wMCNDbGF5IG9yIG1vZGVsaW5nIHRvb2xzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjEyLjAwI0ZpcmVkIGNlcmFtaWMgdGlsZXMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMTMuMDAjQ2xheSBzdG9yYWdlIGNvbnRhaW5lcnMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMTQuMDAjUGxhc2ljaXplZCBub24gaGFyZGVuaW5nIG1vZGVsaW5nIGNvbXBvdW5kcyM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4xNS4wMCNPaWxiYXNlZCBub25oYXJkZW5pbmcgbW9kZWxpbmcgY29tcG91bmRzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjE2LjAwI0FpciBkcnkgY2xheSBvciBtb2RlbGluZyBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMTcuMDAjTW9kZWxpbmcgZG91Z2gjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMTguMDAjUGFwaWVyIE1hY2hlIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjE5LjAwI1NwZWNpYWx0eSBtb2RlbGluZyBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMjAuMDAjUGxhc3RlciBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMjEuMDAjT3ZlbiBoYXJkZW5pbmcgY2xheSBvciBtb2RlbGluZyBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMjIuMDAjUGxhc3RpYyBtb2RlbGluZyBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMjMuMDAjQ2FzdHMgb3IgbW9sZHMgZm9yIHNoYXBpbmcgbW9kZWxpbmcgY29tcG91bmRzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ0LjAwLjAwI0FydCBtZXRhbHMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDQuMDEuMDAjQ29wcGVyIHRvb2xpbmcgZm9pbCM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wMi4wMCNBbHVtaW51bSB0b29saW5nIGZvaWwjNjAuMTIuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDQuMDMuMDAjQWx1bWludW0gd2lyZSM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wNC4wMCNCcmFzcyB0b29saW5nIGZvaWwjNjAuMTIuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDQuMDUuMDAjQnJhc3Mgd2lyZSM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wNi4wMCNTaWx2ZXIgc2hlZXRzIG9yIHBsYXRlcyM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wNy4wMCNTaWx2ZXIgd2lyZSM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wOC4wMCNQZXd0ZXIgcGVsbGV0cyBvciBzaG90cyM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wOS4wMCNQZXd0ZXIgaW5nb3RzIzYwLjEyLjQ0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ0LjEwLjAwI051IGdvbGQgc2hlZXRzIHBsYXRlcyM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4xMS4wMCNOdSBnb2xkIHdpcmUjNjAuMTIuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDQuMTIuMDAjR2FsdmFuaXplZCBzdG92ZXBpcGUgd2lyZSM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4wMC4wMCNTY3VscHR1cmUgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ1LjAxLjAwI1BsYXN0ZXIgd3JhcCM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4wMi4wMCNDYXN0aW5nIHJlc2lucyM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4wMy4wMCNTY3VscHR1cmUgYWNjZXNzb3JpZXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMDQuMDAjUHV6emxlIHJhY2tzIzYwLjEyLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ1LjA1LjAwI0J1YmJsZXMgb3IgYWNjZXNzb3JpZXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMDYuMDAjUGxhc3RpYyBzYW5kIG9yIHdhdGVyIHRvb2xzIG9yIG1vbGRzIG9yIHRveXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMDcuMDAjUGxheSBzYW5kIzYwLjEyLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ1LjA4LjAwI1NhbmQgb3Igd2F0ZXIgdGFibGVzIG9yIGFjdGl2aXR5IGNlbnRlcnMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMDkuMDAjVmVoaWNsZSBzZXRzIzYwLjEyLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ1LjEwLjAwI1dhdGVyd2F5IHNldHMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMTEuMDAjUGxheSB0b29scyBvciBwbGF5IHRvb2wga2l0cyM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4xMi4wMCNTY29vdGVyIGJvYXJkcyM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4xMy4wMCNCZWFuYmFncyM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4xNC4wMCNUYWN0aWxlIHRveXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMTUuMDAjQ29nbml0aXZlIHRveXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMDAuMDAuMDAjTXVzaWNhbCBJbnN0cnVtZW50cyBhbmQgcGFydHMgYW5kIGFjY2Vzc29yaWVzIzYwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEwLjAwLjAwI0tleWJvYXJkIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEwLjAxLjAwI1BpYW5vcyM2MC4xMy4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMC4wMi4wMCNBY2NvcmRpb25zIzYwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEwLjAzLjAwI011c2ljYWwgb3JnYW5zIzYwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjExLjAwLjAwI0JyYXNzIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjExLjAxLjAwI1RydW1wZXRzIzYwLjEzLjExLjAwLjAwCi11bnNwc2M3IzYwLjEzLjExLjAyLjAwI1Ryb21ib25lcyM2MC4xMy4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMS4wMy4wMCNTb3VzYXBob25lcyM2MC4xMy4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMS4wNC4wMCNTYXhvcGhvbmVzIzYwLjEzLjExLjAwLjAwCi11bnNwc2M3IzYwLjEzLjExLjA1LjAwI1doaXN0bGUjNjAuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTIuMDAuMDAjV29vZHdpbmQgaW5zdHJ1bWVudHMjNjAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTIuMDEuMDAjQ2xhcmluZXRzIzYwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEyLjAyLjAwI09ib2VzIzYwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEyLjAzLjAwI011c2ljYWwgZmx1dGVzIzYwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEyLjA0LjAwI1BpY2NvbG9lcyM2MC4xMy4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMi4wNS4wMCNNdXNpY2FsIGNvcm5ldHMjNjAuMTMuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTIuMDYuMDAjQmFncGlwZXMjNjAuMTMuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTIuMDcuMDAjSGFybW9uaWNhcyM2MC4xMy4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMi4wOC4wMCNLYXpvb3MjNjAuMTMuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTMuMDAuMDAjU3RyaW5nIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEzLjAxLjAwI0hhcnBzaWNob3JkcyM2MC4xMy4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMy4wMi4wMCNDbGF2aWNob3JkcyM2MC4xMy4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMy4wMy4wMCNHdWl0YXJzIzYwLjEzLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEzLjA0LjAwI1Zpb2xpbnMjNjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTMuMDUuMDAjSGFycHMjNjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTMuMDYuMDAjQmFuam9lcyM2MC4xMy4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNC4wMC4wMCNQZXJjdXNzaW9uIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjE0LjAxLjAwI0N5bWJhbHMjNjAuMTMuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTQuMDIuMDAjQmVsbHMjNjAuMTMuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTQuMDMuMDAjVGFtYm91cmluZXMjNjAuMTMuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTQuMDQuMDAjQ2FzdGFuZXRzIzYwLjEzLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE0LjA1LjAwI0RydW1zIzYwLjEzLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE0LjA2LjAwI1h5bG9waG9uZXMjNjAuMTMuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTUuMDAuMDAjTXVzaWNhbCBpbnN0cnVtZW50IHBhcnRzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNS4wMS4wMCNNZXRyb25vbWVzIzYwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE1LjAyLjAwI1JlZWRzIzYwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE1LjAzLjAwI0luc3RydW1lbnQgc3RyaW5ncyBvciBwaWNrcyM2MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNS4wNC4wMCNUdW5pbmcgcGlucyM2MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNS4wNS4wMCNNdXNpY2FsIGluc3RydW1lbnQgc3RhbmRzIG9yIHNoZWV0IGhvbGRlcnMjNjAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTUuMDYuMDAjQWNjZXNzb3JpZXMgZm9yIHN0cmluZ2VkIGluc3RydW1lbnRzIzYwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE1LjA3LjAwI1BlcmN1c3Npb24gaW5zdHJ1bWVudCBhY2Nlc3NvcnkjNjAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTUuMDguMDAjTXVzaWMgYm94ZXMgb3IgbWVjaGFuaXNtcyM2MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNi4wMC4wMCNNdXNpY2FsIGluc3RydW1lbnQgc2V0cyM2MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNi4wMS4wMCNSaHl0aG0gYmFuZCBzZXRzIzYwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE3LjAwLjAwI0FsdGVybmF0aXZlIHNvdW5kcyBtdXNpY2FsIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjE3LjAxLjAwI0Jvb213aGFja2VycyM2MC4xMy4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNy4wMi4wMCNEaXNjbyB0YXBzIzYwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE4LjAwLjAwI011c2ljIGFuZCBkYW5jZSBhY2Nlc3NvcmllcyM2MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMy4xOC4wMS4wMCNEYW5jaW5nIHNjYXJ2ZXMjNjAuMTMuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTguMDIuMDAjUmh5dGhtIHN0aWNrcyBvciBsdW1taSBzdGlja3MjNjAuMTMuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTguMDMuMDAjUmh5dGhtIHdhbmRzIG9yIGhvb3BzIzYwLjEzLjE4LjAwLjAwCi11bnNwc2M3IzYwLjE0LjAwLjAwLjAwI1RveXMgYW5kIGdhbWVzIzYwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjAwLjAwI1RveXMjNjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTAuMDEuMDAjVG95IGJhbGxvb25zIG9yIGJhbGxzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjAyLjAwI0RvbGxzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjAzLjAwI0RvbGwgaG91c2VzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjA0LjAwI1N0dWZmZWQgYW5pbWFscyBvciBwdXBwZXRzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjA1LjAwI1BsYXlob3VzZXMjNjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTAuMDYuMDAjQnVpbGRpbmcgYmxvY2tzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjA3LjAwI1JpZGluZyB0b3lzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjA4LjAwI1B1bGwgdG95cyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4wOS4wMCNDaGlsZHJlbnMgc2NpZW5jZSBraXRzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjEwLjAwI1RveSB2ZWhpY2xlcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4xMS4wMCNUb3kgdHJhaW5zIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjEyLjAwI0luZmxhdGFibGUgdG95cyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4xMy4wMCNEb2xsIHBhcnRzIG9yIGFjY2Vzc29yaWVzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjE0LjAwI1lvIHlvcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4xNS4wMCNLaXRlcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4xNi4wMCNQb2dzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjE3LjAwI0thbGVpZG9zY29wZXMjNjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTAuMTguMDAjUG9tIHBvbXMjNjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTAuMTkuMDAjUGluYXRhcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4yMC4wMCNCb29tZXJhbmdzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjIxLjAwI0ZseWluZyBkaXNjcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4yMi4wMCNUb3kgcGFpbHMjNjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDAuMDAjR2FtZXMjNjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDEuMDAjRWR1Y2F0aW9uYWwgZ2FtZXMjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDIuMDAjQm9hcmQgZ2FtZXMjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDMuMDAjUGxheWluZyBjYXJkcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4wNC4wMCNWaWRlbyBnYW1lcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4wNS4wMCNQdXp6bGVzIzYwLjE0LjExLjAwLjAwCi11bnNwc2M3IzYwLjE0LjExLjA2LjAwI0RpY2UjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDcuMDAjQmluZ28jNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDguMDAjQ2xhc3NpYyBnYW1lcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4wOS4wMCNDb2xsYWJvcmF0aXZlIGdhbWVzIzYwLjE0LjExLjAwLjAwCi11bnNwc2M3IzYwLjE0LjExLjEwLjAwI1N0cmF0ZWd5IGdhbWVzIzYwLjE0LjExLjAwLjAwCi11bnNwc2M3IzYwLjE0LjExLjExLjAwI0dhbWUgYWNjZXNzb3JpZXMjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMTIuMDAjR2FtZSBib29rcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4xMy4wMCNMb3R0byBnYW1lcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4xNC4wMCNNZW1vcnkgZ2FtZXMjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTIuMDAuMDAjQWN0aXZlIFBsYXkgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyM2MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMi4wMS4wMCNCYWxhbmNlIG9yIGdyb3NzIG1vdG9yIGVxdWlwbWVudCM2MC4xNC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMi4wMi4wMCNCYWxsIHBvb2xzIG9yIGFjY2Vzc29yaWVzIzYwLjE0LjEyLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEyLjAzLjAwI1BsYXkgaG91c2VzIG9yIGh1dHMjNjAuMTQuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTIuMDQuMDAjVHJpa2VzIG9yIHdhZ29ucyM2MC4xNC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMi4wNS4wMCNTb2Z0IHBsYXkgY2VudGVycyM2MC4xNC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMy4wMC4wMCNDaGlsZHJlbnMgYmxvY2tzIGFuZCBidWlsZGluZyBzeXN0ZW1zIzYwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEzLjAyLjAwI0NvbnN0cnVjdGlvbiBzZXRzIzYwLjE0LjEzLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEzLjAzLjAwI1BsYXltYXRzIzYwLjE0LjEzLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEzLjA0LjAwI1JhaWxwbGF5IHN5c3RlbXMgb3IgYWNjZXNzb3JpZXMjNjAuMTQuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTMuMDUuMDAjVW5pdCBibG9ja3MjNjAuMTQuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTMuMDYuMDAjUGxheSB2ZWhpY2xlcyM2MC4xNC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMy4wNy4wMCNQbGF5IGFuaW1hbHMjNjAuMTQuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTQuMDAuMDAjRHJhbWF0aWMgcGxheSBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzYwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjE0LjAxLjAwI0Nvc3R1bWVzIG9yIGFjY2Vzc29yaWVzIzYwLjE0LjE0LjAwLjAwCi11bnNwc2M3IzYwLjE0LjE0LjAyLjAwI0RyZXNzIHVwIENlbnRlcnMjNjAuMTQuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTQuMDMuMDAjSG91c2VrZWVwaW5nIHVuaXRzIG9yIGFjY2Vzc29yaWVzIzYwLjE0LjE0LjAwLjAwCi11bnNwc2M3IzYwLjE0LjE0LjA0LjAwI1BsYXkgZm9vZCBkaXNoZXMgb3IgYWNjZXNzb3JpZXMjNjAuMTQuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTQuMDUuMDAjUHJldGVuZCBwbGF5IGtpdHMgb3Igc3VwcGxpZXMjNjAuMTQuMTQuMDAuMDAKLXVuc3BzYzcjNzAuMDAuMDAuMDAuMDAjRmFybWluZyBhbmQgRmlzaGluZyBhbmQgRm9yZXN0cnkgYW5kIFdpbGRsaWZlIENvbnRyYWN0aW5nIFNlcnZpY2VzIzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEwLjAwLjAwLjAwI0Zpc2hlcmllcyBhbmQgYXF1YWN1bHR1cmUjNzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDAuMDAjRmlzaGVyaWVzIG9wZXJhdGlvbnMjNzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDEuMDAjQ29tbWVyY2lhbCBmaXNoaW5nIG9wZXJhdGlvbnMjNzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDIuMDAjRmlzaGluZyBwb3J0IHNlcnZpY2VzIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE1LjAzLjAwI0Zpc2hpbmcgb25zaG9yZSBmYWNpbGl0aWVzIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE1LjA0LjAwI0RlZXAgc2VhIGZpc2hpbmcgb3BlcmF0aW9ucyM3MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNS4wNS4wMCNTb25hciBmaXNoaW5nIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE1LjA2LjAwI1doYWxpbmcjNzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDcuMDAjVHJhd2xpbmcjNzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDguMDAjTGluZSBmaXNoaW5nIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE1LjA5LjAwI1NlaW5lIG9wZXJhdGlvbnMjNzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMTAuMDAjRmlzaGluZyBuZXRzIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE2LjAwLjAwI0Zpc2hlcmllcyBvdmVyc2lnaHQjNzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTYuMDEuMDAjRmlzaGVyeSBpbmZvcm1hdGlvbiBvciBkb2N1bWVudGF0aW9uIHNlcnZpY2VzIzcwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE2LjAyLjAwI0Zpc2hlcnkgcmVzZWFyY2ggb3IgZXhwZXJpbWVudGF0aW9uIHNlcnZpY2VzIzcwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE2LjAzLjAwI0Zpc2hlcnkgZGF0YSBjb2xsZWN0aW9uIG9yIGRpc3RyaWJ1dGlvbiM3MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNi4wNC4wMCNGaXNoZXJ5IGNvbW1lcmNpYWwgbWFuYWdlbWVudCM3MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNi4wNS4wMCNGaXNoaW5nIGZsZWV0IG1hbmFnZW1lbnQjNzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTYuMDYuMDAjRmlzaGluZyBjb29wZXJhdGl2ZXMjNzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTYuMDcuMDAjRmlzaGVyeSByZXNvdXJjZXMgcHJvdGVjdGlvbiBvciBjb25zZXJ2YXRpb24jNzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTcuMDAuMDAjRmlzaGVyeSBpbmR1c3RyeSBhbmQgdGVjaG5vbG9neSM3MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNy4wMS4wMCNGaXNoaW5nIHRlY2hub2xvZ3kgc2VydmljZXMjNzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTcuMDIuMDAjRmlzaGVyeSBieSBwcm9kdWN0cyBwcm9kdWN0aW9uIHNlcnZpY2VzIzcwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE3LjAzLjAwI0Zpc2ggcHJvZHVjdGlvbiM3MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNy4wNC4wMCNGaXNoIHN0b3JhZ2UjNzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTguMDAuMDAjRmlzaGVyaWVzIHJlc291cmNlcyM3MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOC4wMS4wMCNJbmxhbmQgd2F0ZXIgZmlzaGVyeSByZXNvdXJjZXMjNzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTguMDIuMDAjRmlzaCBwb25kIHJlc291cmNlcyM3MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOC4wMy4wMCNGaXNoIGhhdGNoZXJpZXMjNzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTguMDQuMDAjRmlzaCByYW5jaGVzIzcwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE4LjA1LjAwI0Zpc2hlcnkgYnkgcHJvZHVjdCByZXNvdXJjZXMjNzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTguMDYuMDAjRmlzaGVyaWVzIHJlc291cmNlIGV2YWx1YXRpb24jNzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTkuMDAuMDAjQXF1YWN1bHR1cmUjNzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTkuMDEuMDAjTWFyaWN1bHR1cmUjNzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTkuMDIuMDAjT3N0cmVpY3VsdHVyZSM3MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOS4wMy4wMCNTaGVsbGZpc2ggY3VsdHVyZSM3MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOS4wNC4wMCNTaHJpbXAgZmFybWluZyM3MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOS4wNS4wMCNGaXNoIGZhcm1pbmcjNzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMDAuMDAuMDAjSG9ydGljdWx0dXJlIzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjExLjE1LjAwLjAwI1BsYW50cyBhbmQgb3JuYW1lbnRhbCB0cmVlcyM3MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNS4wMS4wMCNQbGFudGluZyBzZXJ2aWNlcyBvciBvcm5hbWVudGFsIHBsYW50IG9yIGJ1c2ggb3IgdHJlZSM3MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNS4wMi4wMCNQcnVuaW5nIHNlcnZpY2VzIG9yIG9ybmFtZW50YWwgcGxhbnQgb3IgYnVzaCM3MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNS4wMy4wMCNUcmVlIHRyaW1taW5nIHNlcnZpY2VzIzcwLjExLjE1LjAwLjAwCi11bnNwc2M3IzcwLjExLjE1LjA0LjAwI0JyYWNpbmcgc2VydmljZXMjNzAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTUuMDUuMDAjVHJlZSBzdXJnZXJ5IHNlcnZpY2VzIzcwLjExLjE1LjAwLjAwCi11bnNwc2M3IzcwLjExLjE1LjA2LjAwI0FyYm9yaXN0IHNlcnZpY2VzIzcwLjExLjE1LjAwLjAwCi11bnNwc2M3IzcwLjExLjE1LjA3LjAwI1JlbW92YWwgc2VydmljZXMgb3Igb3JuYW1lbnRhbCBwbGFudCBvciBidXNoIG9yIHRyZWUjNzAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTUuMDguMDAjUGxhbnRzIG9yIG9ybmFtZW50YWwgdHJlZSBzcHJheWluZyBzZXJ2aWNlcyM3MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNi4wMC4wMCNGbG93ZXJpbmcgcGxhbnRzIzcwLjExLjAwLjAwLjAwCi11bnNwc2M3IzcwLjExLjE2LjAxLjAwI1BsYW50aW5nIHNlcnZpY2VzIzcwLjExLjE2LjAwLjAwCi11bnNwc2M3IzcwLjExLjE2LjAyLjAwI051cnNlcnkgc2VydmljZXMjNzAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTYuMDMuMDAjRmxvcmljdWx0dXJlIHNlcnZpY2VzIzcwLjExLjE2LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjAwLjAwI1BhcmtzIGFuZCBnYXJkZW5zIGFuZCBvcmNoYXJkcyM3MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNy4wMS4wMCNPcmNoYXJkIG1hbmFnZW1lbnQgb3IgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTcuMDIuMDAjVmluZXlhcmQgbWFuYWdlbWVudCBvciBtYWludGVuYW5jZSBzZXJ2aWNlcyM3MC4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNy4wMy4wMCNHYXJkZW4gcGxhbnRpbmcgb3IgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTcuMDQuMDAjSG9ydGljdWx0dXJhbCBjb3Vuc2VsaW5nIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjA1LjAwI0NlbWV0ZXJ5IHVwa2VlcCBzZXJ2aWNlcyM3MC4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNy4wNi4wMCNMYXduIGNhcmUgc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTcuMDcuMDAjSGlnaHdheSBsYXduIG1haW50ZW5hbmNlIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjA4LjAwI011bGNoaW5nIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjA5LjAwI1NlZWRpbmcgc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTcuMTAuMDAjTW93aW5nIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjExLjAwI1NwcmlnZ2luZyBzZXJ2aWNlcyM3MC4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNy4xMi4wMCNQYXJrcyBvciBnYXJkZW5zIHNwcmF5aW5nIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjEzLjAwI1BhcmtzIG1hbmFnZW1lbnQgb3IgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMDAuMDAuMDAjTGl2ZXN0b2NrIHNlcnZpY2VzIzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjE1LjAwLjAwI0RhaXJ5aW5nIzcwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjE1LjAxLjAwI0RhaXJ5IGhlcmQgbWFuYWdlbWVudCM3MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNS4wMi4wMCNEYWlyeSBpbmR1c3RyeSBkZXZlbG9wbWVudCM3MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNS4wMy4wMCNEYWlyeSB0ZWNobm9sb2d5IzcwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE1LjA0LjAwI0RhaXJ5IGxhYm9yYXRvcmllcyBzZXJ2aWNlcyM3MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNS4wNS4wMCNEYWlyeSBmYXJtIGluIGhvdXNlIHByb2Nlc3NpbmcjNzAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTYuMDAuMDAjTGl2ZXN0b2NrIGluZHVzdHJ5IzcwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjE2LjAxLjAwI0xpdmVzdG9jayBicmVlZGluZyM3MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNi4wMi4wMCNMaXZlc3RvY2sgZ2VuZXRpY3Mgc2VydmljZXMjNzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTYuMDMuMDAjU2VyaWN1bHR1cmUjNzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTYuMDQuMDAjQW5pbWFsIGh1c2JhbmRyeSM3MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNi4wNS4wMCNGYXJtIHJlYXJpbmcgc3lzdGVtcyM3MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNi4wNi4wMCNQb3VsdHJ5IHByb2R1Y3Rpb24gc2VydmljZXMjNzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTYuMDcuMDAjU21hbGwgYW5pbWFsIGJyZWVkaW5nIHNlcnZpY2VzIzcwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE2LjA4LjAwI0JvdmluZSBwcm9kdWN0aW9uIHNlcnZpY2VzIzcwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE2LjEwLjAwI0FwaWN1bHR1cmUjNzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTcuMDAuMDAjTGl2ZXN0b2NrIG1hbmFnZW1lbnQjNzAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTcuMDEuMDAjTGl2ZXN0b2NrIHNlbGVjdGlvbiM3MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNy4wMi4wMCNMaXZlc3RvY2sgc2hvd2luZyBzZXJ2aWNlcyM3MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNy4wMy4wMCNMaXZlc3RvY2sgc2xhdWdodGVyaW5nIHNlcnZpY2VzIzcwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE3LjA0LjAwI0hlcmQgbWFuYWdlbWVudCM3MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNy4wNS4wMCNMaXZlc3RvY2sgYnJlZWRpbmcgb3IgZ3Jvb21pbmcgc2VydmljZXMjNzAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTguMDAuMDAjUGV0cyBpbmR1c3RyeSM3MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMi4xOC4wMS4wMCNQZXQgYnJlZWRpbmcgc2VydmljZXMjNzAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTguMDIuMDAjUGV0IGdyb29taW5nIHNlcnZpY2VzIzcwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE4LjAzLjAwI0tlbm5lbHMgc2VydmljZXMjNzAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTkuMDAuMDAjUGFzdHVyZSBhbmQgcmFuZ2Ugc2VydmljZXMjNzAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTkuMDEuMDAjUGFzdHVyZSBpbXByb3ZlbWVudCM3MC4xMi4xOS4wMC4wMAotdW5zcHNjNyM3MC4xMi4xOS4wMi4wMCNSYW5nZSBtYW5hZ2VtZW50IzcwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE5LjAzLjAwI1JhbmdlIHJlc2VhcmNoIzcwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjAwLjAwI0FuaW1hbCBoZWFsdGgjNzAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMjAuMDEuMDAjQW5pbWFsIG51dHJpdGlvbiM3MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM3MC4xMi4yMC4wMi4wMCNBbmltYWwgZGlzZWFzZSBjb250cm9sIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjAzLjAwI0FuaW1hbCB0cnlwYW5vc29taWFzaXMjNzAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMjAuMDQuMDAjRm9vdCBvciBtb3V0aCBjb250cm9sIHNlcnZpY2VzIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjA1LjAwI0FuaW1hbCBoZWFsdGggcHJldmVudGl2ZSBtZWRpY2F0aW9uIHNlcnZpY2VzIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjA2LjAwI0FuaW1hbCB2YWNjaW5hdGlvbiBzZXJ2aWNlcyM3MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM3MC4xMi4yMC4wNy4wMCNWZXRlcmluYXJ5IGFkbWluaXN0cmF0aW9uIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjA4LjAwI1ZldGVyaW5hcnkgbGFib3JhdG9yeSB0ZWNobm9sb2d5IzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjA5LjAwI0FuaW1hbCBob3NwaXRhbCBzZXJ2aWNlcyM3MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM3MC4xMi4yMC4xMC4wMCNBbmltYWwgaGVhbHRoIGluZm9ybWF0aW9uIHNlcnZpY2VzIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEzLjAwLjAwLjAwI0xhbmQgYW5kIHNvaWwgcHJlcGFyYXRpb24gYW5kIG1hbmFnZW1lbnQgYW5kIHByb3RlY3Rpb24jNzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTUuMDAuMDAjTGFuZCBhbmQgc29pbCBwcm90ZWN0aW9uIzcwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEzLjE1LjAxLjAwI0Rlc2VydGlmaWNhdGlvbiBhc3Nlc3NtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjNzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTUuMDIuMDAjU29pbCBjb25zZXJ2YXRpb24gb3IgcHJvdGVjdGlvbiBzZXJ2aWNlcyM3MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMy4xNS4wMy4wMCNFcm9zaW9uIGNvbnRyb2wgc2VydmljZXMjNzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTUuMDQuMDAjU2FuZCBkdW5lIGZpeGF0aW9uIzcwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE1LjA1LjAwI1NvaWwgY29uZGl0aW9uaW5nIzcwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE1LjA2LjAwI1NvaWwgaW1wcm92ZW1lbnQjNzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTYuMDAuMDAjTGFuZCBhbmQgc29pbCBwcmVwYXJhdGlvbiM3MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMy4xNi4wMS4wMCNGZXJ0aWxpemVyIGFwcGxpY2F0aW9uIHNlcnZpY2VzIzcwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE2LjAyLjAwI0xpbWUgc3ByZWFkaW5nIHNlcnZpY2VzIzcwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE2LjAzLjAwI1Bsb3dpbmcgc2VydmljZXMjNzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTYuMDQuMDAjU2VlZCBiZWQgcHJlcGFyYXRpb24gc2VydmljZXMjNzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTYuMDUuMDAjU29pbCBjaGVtaWNhbCB0cmVhdG1lbnQgc2VydmljZXMjNzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTcuMDAuMDAjTGFuZCBhbmQgc29pbCBtYW5hZ2VtZW50IzcwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEzLjE3LjAxLjAwI0xhbmQgdXNlIHBsYW5uaW5nIzcwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE3LjAyLjAwI0xhbmQgZXZhbHVhdGlvbiM3MC4xMy4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMy4xNy4wMy4wMCNMYW5kIHJlY2xhbWF0aW9uIzcwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE3LjA0LjAwI0Fncm8gZWNvbG9naWNhbCB6b25lcyBhc3Nlc3NtZW50IG9yIHBsYW5uaW5nIzcwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE3LjA1LjAwI1NvaWwgY2xhc3NpZmljYXRpb24jNzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTcuMDYuMDAjV2F0ZXJzaGVkIG1hbmFnZW1lbnQjNzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTcuMDcuMDAjU29pbCBmZXJ0aWxpdHkgYW5hbHlzaXMjNzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTcuMDguMDAjUGVkb2xvZ3kjNzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMDAuMDAuMDAjQ3JvcCBwcm9kdWN0aW9uIGFuZCBtYW5hZ2VtZW50IGFuZCBwcm90ZWN0aW9uIzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjAwLjAwI0Nyb3AgcHJvZHVjdGlvbiM3MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4wMS4wMCNTZWVkIHByb2R1Y3Rpb24gc2VydmljZXMjNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMDIuMDAjSHlkcm9wb25pY3MjNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMDMuMDAjR3Jhc3Mgb3IgZm9kZGVyIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMDQuMDAjQXJvbWF0aWMgcGxhbnRzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMDUuMDAjQmV2ZXJhZ2UgY3JvcHMgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4wNi4wMCNDb2NvYSBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjA3LjAwI1N1Z2FyYmVldCBvciBzdWdhcmNhbmUgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4wOC4wMCNOdXQgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4wOS4wMCNFc3NlbnRpYWwgb2lsIGNyb3BzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMTAuMDAjRmliZXIgY3JvcHMgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4xMS4wMCNGcnVpdCBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjEyLjAwI0dyYWluIG9yIGxlZ3VtZSBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjEzLjAwI0luc2VjdGljaWRhbCBwbGFudHMgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4xNC4wMCNNZWRpY2luYWwgcGxhbnRzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMTUuMDAjUm9vdHMgb3IgdHViZXJzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMTYuMDAjQ2VyZWFscyBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjE3LjAwI1J1YmJlciBwbGFudCBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjE4LjAwI1NwaWNlIGNyb3BzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMTkuMDAjVG9iYWNjbyBjcm9wIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMjAuMDAjVmVnZXRhYmxlIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTYuMDAuMDAjQ3JvcCBwcm90ZWN0aW9uIzcwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjE2LjAxLjAwI0Nyb3Agc3ByYXlpbmcgc2VydmljZXMjNzAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTYuMDIuMDAjQmlvbG9naWNhbCBjb250cm9sIHNlcnZpY2VzIzcwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE2LjAzLjAwI1dlZWQgY29udHJvbCBzZXJ2aWNlcyM3MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNi4wNC4wMCNIZXJiaWNpZGUgc2VydmljZXMjNzAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTYuMDUuMDAjSW50ZWdyYXRlZCBwZXN0IG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTYuMDYuMDAjUGxhbnQgcGF0aG9sb2d5IzcwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE2LjA3LjAwI0xvY3VzdCBjb250cm9sIzcwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE3LjAwLjAwI0Nyb3AgbWFuYWdlbWVudCM3MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNy4wMS4wMCNHcmVlbmhvdXNlIHNlcnZpY2VzIzcwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE3LjAyLjAwI0ZlcnRpbGl6ZXIgc2VydmljZXMjNzAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTcuMDMuMDAjQ3JvcCBhZG1pbmlzdHJhdGlvbiM3MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNy4wNC4wMCNDcm9wIHN1YnN0aXR1dGlvbiM3MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNy4wNS4wMCNFeHRlbnNpb24gc2VydmljZXMjNzAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTcuMDYuMDAjQ3JvcCBzcGVjaWFsaXphdGlvbiM3MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNy4wNy4wMCNDdWx0aXZhdGlvbiBmYXJtaW5nIHN5c3RlbSBtYW5hZ2VtZW50IzcwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE3LjA4LjAwI0Nyb3Agcm90YXRpb24gb3IgZGl2ZXJzaWZpY2F0aW9uIGNvdW5zZWxpbmcgc2VydmljZXMjNzAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTcuMDkuMDAjUGxhbnQgdGF4b25vbXkgc2VydmljZXMjNzAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTcuMTAuMDAjRmllbGQgY3JvcCBlbnRvbW9sb2d5IzcwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE4LjAwLjAwI0Nyb3AgcGxhbnRpbmcgYW5kIGN1bHRpdmF0aW9uIzcwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjE4LjAxLjAwI09yY2hhcmQgdHJlZSBvciB2aW5lIHBsYW50aW5nIHNlcnZpY2VzIzcwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE4LjAyLjAwI1Nwcm91dCBvciB0d2lnIHNlcnZpY2VzIzcwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE4LjAzLjAwI0Nyb3AgY3VsdGl2YXRpbmcgc2VydmljZXMjNzAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTguMDQuMDAjQ3JvcCBwbGFudGluZyBzZXJ2aWNlcyM3MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNC4xOS4wMC4wMCNDcm9wIGhhcnZlc3RpbmcjNzAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTkuMDEuMDAjQ2FzaCBncmFpbnMgaGFydmVzdGluZyBzZXJ2aWNlcyM3MC4xNC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xOS4wMi4wMCNGcnVpdCBvciB0cmVlIG51dHMgaGFydmVzdGluZyBzZXJ2aWNlcyM3MC4xNC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xOS4wMy4wMCNGaWVsZCBjcm9wIGhhcnZlc3Rpbmcgc2VydmljZXMjNzAuMTQuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTkuMDQuMDAjU2VlZCBoYXJ2ZXN0aW5nIHNlcnZpY2VzIzcwLjE0LjE5LjAwLjAwCi11bnNwc2M3IzcwLjE0LjIwLjAwLjAwI1Bvc3QgaGFydmVzdGluZyBjcm9wIHByb2Nlc3NpbmcjNzAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMjAuMDEuMDAjU2lsb3MgcmVsYXRlZCBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4wMi4wMCNHcmFpbiBkcnllcnMgc2VydmljZXMjNzAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMjAuMDMuMDAjQ3JvcCBwcm9jZXNzaW5nIHNlcnZpY2VzIzcwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjIwLjA0LjAwI0ZpZWxkIGNyb3BzIG1hcmtldCBwcmVwYXJhdGlvbiBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4wNS4wMCNDYXNoIGdyYWluIGNyb3BzIG1hcmtldCBwcmVwYXJhdGlvbiBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4wNi4wMCNWZWdldGFibGUgY3JvcHMgbWFya2V0IHByZXBhcmF0aW9uIHNlcnZpY2VzIzcwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjIwLjA3LjAwI0ZydWl0IGNyb3BzIG1hcmtldCBwcmVwYXJhdGlvbiBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4wOC4wMCNUcmVlIG51dCBjcm9wcyBtYXJrZXQgcHJlcGFyYXRpb24gc2VydmljZXMjNzAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMjAuMDkuMDAjR2lubmluZyBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4xMC4wMCNDcm9wIGNsZWFuaW5nIHNlcnZpY2VzIzcwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjIwLjExLjAwI0Nvb2xpbmcgb3IgcmVmcmlnZXJhdGlvbiBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4xMi4wMCNTcHJheWluZyBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNS4wMC4wMC4wMCNGb3Jlc3RyeSM3MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNS4wMC4wMCNGb3Jlc3RyeSBtYW5hZ2VtZW50IzcwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjAxLjAwI0ZvcmVzdCByZXNvdXJjZXMgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNS4wMi4wMCNGb3Jlc3QgcGVzdCBjb250cm9sIzcwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjAzLjAwI0ZvcmVzdCBvcmdhbml6YXRpb25zIG9yIGFzc29jaWF0aW9ucyBvciBjb29wZXJhdGl2ZXMjNzAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTUuMDQuMDAjRm9yZXN0IGFkbWluaXN0cmF0aW9uIHNlcnZpY2VzIzcwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjA1LjAwI0ZvcmVzdCBpbnZlbnRvcnkjNzAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTUuMDYuMDAjRm9yZXN0IG1vbml0b3Jpbmcgb3IgZXZhbHVhdGlvbiM3MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNS4wNy4wMCNBZmZvcmVzdGF0aW9uIHNlcnZpY2VzIzcwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjA4LjAwI0ZvcmVzdHJ5IGV4dGVuc2lvbiBzZXJ2aWNlcyM3MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNS4wOS4wMCNGb3Jlc3QgbnVyc2VyeSBtYW5hZ2VtZW50IzcwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjEwLjAwI0ZvcmVzdCBzZWN0b3JhbCBwbGFubmluZyM3MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNi4wMC4wMCNGb3Jlc3RyeSBpbmR1c3RyeSM3MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNi4wMS4wMCNOb253b29kIHByb2R1Y3Rpb24gc2VydmljZXMjNzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTYuMDIuMDAjRXNzZW50aWFsIG9pbHMgcHJvZHVjdGlvbiM3MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNi4wMy4wMCNUaW1iZXIgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNi4wNC4wMCNEeWVzIHByb2R1Y3Rpb24jNzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTYuMDUuMDAjRWRpYmxlIGZvcmVzdHJ5IHByb2R1Y3Rpb24jNzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTYuMDYuMDAjV29vZCB0ZXN0aW5nIHNlcnZpY2VzIzcwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE2LjA3LjAwI1RpbWJlciBwcm9kdWN0aW9uIzcwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjAwLjAwI0ZvcmVzdHJ5IGhhcnZlc3RpbmcjNzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTcuMDEuMDAjTG9nZ2luZyBvciBmZWxsaW5nIzcwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjAyLjAwI0ZvcmVzdCBoYXJ2ZXN0aW5nIG1vdW50YWlub3VzIGFyZWFzIzcwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjAzLjAwI0ZvcmVzdCBoYXJ2ZXN0aW5nIHNwZWNpYWxpemVkIG9wZXJhdGlvbnMjNzAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTcuMDQuMDAjUGxhbnRhdGlvbiBoYXJ2ZXN0aW5nIzcwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjA1LjAwI1N3YW1wIG9yIG1hbmdyb3ZlIGZvcmVzdCBoYXJ2ZXN0aW5nIzcwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjA2LjAwI1RlbXBlcmF0ZSBmb3Jlc3QgaGFydmVzdGluZyM3MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNy4wNy4wMCNUcm9waWNhbCBoaWdoIGZvcmVzdHMgaGFydmVzdGluZyM3MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOC4wMC4wMCNGb3Jlc3RyeSBjb25zZXJ2YXRpb24gc2VydmljZXMjNzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTguMDEuMDAjQ29uc2VydmF0aW9uIG9mIGZvcmVzdCBnZW5ldGljIHJlc291cmNlcyM3MC4xNS4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOC4wMi4wMCNGb3Jlc3QgcHJvdGVjdGlvbiBzZXJ2aWNlcyM3MC4xNS4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOC4wMy4wMCNGb3Jlc3QgYXJpZCBsYW5kIHJlaGFiaWxpdGF0aW9uIzcwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE4LjA0LjAwI0ZvcmVzdCB3aW5kIGJyZWFrcyBvciBzaGVsdGVyIGJlbHRzIzcwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE4LjA1LjAwI0ZvcmVzdCByZXNlcnZlcyBvciBwYXJrcyBjb25zZXJ2YXRpb24gc2VydmljZXMjNzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTguMDYuMDAjRm9yZXN0cnkgd2F0ZXJzaGVkIG1hbmFnZW1lbnQjNzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTguMDcuMDAjRm9yZXN0cnkgdG9ycmVudCBjb250cm9sIzcwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE5LjAwLjAwI0ZvcmVzdHJ5IHJlc291cmNlcyM3MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4wMS4wMCNGb3Jlc3QgcmVzb3VyY2VzIGRldmVsb3BtZW50IzcwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE5LjAyLjAwI0Fncm9mb3Jlc3RyeSByZXNvdXJjZXMjNzAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTkuMDMuMDAjRnVlbCB3b29kIHJlc291cmNlcyM3MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4wNC4wMCNTaWx2aWN1bHR1cmUjNzAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTkuMDUuMDAjQXJpZCByYWluZmVkIHBsYW50YXRpb24gcmVzb3VyY2VzIzcwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE5LjA2LjAwI0Jyb2FkIGxlYWZlZCBwbGFudGF0aW9uIHJlc291cmNlcyM3MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4wNy4wMCNDb25pZmVycyBwbGFudGF0aW9ucyM3MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4wOS4wMCNUcm9waWNhbCByYWluIGZvcmVzdCBwbGFudGF0aW9ucyM3MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4xMC4wMCNNYW5ncm92ZSBzd2FtcHMgcmVzb3VyY2VzIzcwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzcwLjE2LjAwLjAwLjAwI1dpbGRsaWZlIGFuZCBmbG9yYSM3MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNi4xNS4wMC4wMCNGYXVuYSM3MC4xNi4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNi4xNS4wMS4wMCNGYXVuYSBwcm90ZWN0aW9uIzcwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE2LjE2LjAwLjAwI0Zsb3JhIzcwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE2LjE2LjAxLjAwI0Zsb3JhIHByb3RlY3Rpb24jNzAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTYuMTcuMDAuMDAjRWNvc3lzdGVtcyM3MC4xNi4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNi4xNy4wMS4wMCNFY29kZXZlbG9wbWVudCBzZXJ2aWNlcyM3MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNi4xNy4wMi4wMCNNYXJpbmUgZWNvc3lzdGVtIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTYuMTcuMDMuMDAjVGVycmVzdHJpYWwgZWNvc3lzdGVtIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTYuMTcuMDQuMDAjRWNvc3lzdGVtcyBwcm90ZWN0aW9uIHNlcnZpY2VzIzcwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE3LjAwLjAwLjAwI1dhdGVyIHJlc291cmNlcyBkZXZlbG9wbWVudCBhbmQgb3ZlcnNpZ2h0IzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjAwLjAwI0RldmVsb3BtZW50IzcwLjE3LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjAxLjAwI1dhdGVyIHF1YWxpdHkgYXNzZXNzbWVudCBzZXJ2aWNlcyM3MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNS4wMi4wMCNXYXRlciByZXNvdXJjZXMgcGxhbm5pbmcgc2VydmljZXMjNzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTUuMDMuMDAjR3JvdW5kIG9yIHN1cmZhY2Ugd2F0ZXIgc3VydmV5aW5nIzcwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjA0LjAwI1dhdGVyIHJlc291cmNlcyBtYXBwaW5nIHNlcnZpY2VzIzcwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjA1LjAwI1JpdmVyIGJhc2luIGRldmVsb3BtZW50IzcwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjA2LjAwI0dyb3VuZCBvciBzdXJmYWNlIHdhdGVyIG1vZGVsaW5nIHNlcnZpY2VzIzcwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE2LjAwLjAwI092ZXJzaWdodCM3MC4xNy4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNi4wMS4wMCNXYXRlciBxdWFsaXR5IG1hbmFnZW1lbnQjNzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTYuMDIuMDAjV2F0ZXIgdGVzdGluZyBzZXJ2aWNlcyM3MC4xNy4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNi4wMy4wMCNGbG9vZHBsYWluIG1hbmFnZW1lbnQjNzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTYuMDQuMDAjV2F0ZXIgY29uc2VydmF0aW9uIGFkdmlzb3J5IHNlcnZpY2VzIzcwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE2LjA1LjAwI1dhdGVyIHJpZ2h0cyBhZHZpc29yeSBzZXJ2aWNlcyM3MC4xNy4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNi4wNi4wMCNXYXRlciByZXNvdXJjZSByZWNvdmVyeSBzZXJ2aWNlcyM3MC4xNy4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNi4wNy4wMCNXYXRlciBwcmljaW5nIHNlcnZpY2VzIzcwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE3LjAwLjAwI0lycmlnYXRpb24jNzAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDEuMDAjQ2FuYWwgbWFpbnRlbmFuY2Ugb3IgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MC4xNy4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNy4wMi4wMCNEYW0gbWFpbnRlbmFuY2Ugb3IgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MC4xNy4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNy4wMy4wMCNSZXNlcnZvaXJzIG1haW50ZW5hbmNlIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDQuMDAjUHVtcGluZyBzdGF0aW9uIG1haW50ZW5hbmNlIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDUuMDAjUGlwZWxpbmVzIG1haW50ZW5hbmNlIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDYuMDAjRGlrZSBvciBlbWJhbmttZW50IG1haW50ZW5hbmNlIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDcuMDAjV2F0ZXIgd2VsbCBtYWludGVuYW5jZSBvciBtYW5hZ2VtZW50IHNlcnZpY2VzIzcwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE3LjA4LjAwI0lycmlnYXRpb24gYWR2aXNvcnkgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDkuMDAjSXJyaWdhdGlvbiBzeXN0ZW1zIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTguMDAuMDAjRHJhaW5hZ2Ugc2VydmljZXMjNzAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTguMDEuMDAjTGFuZCBkcmFpbmFnZSBzZXJ2aWNlcyM3MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNy4xOC4wMi4wMCNTdG9ybSB3YXRlciBkcmFpbmFnZSM3MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNy4xOC4wMy4wMCNGbG9vZCBwcm90ZWN0aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjNzAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNzEuMDAuMDAuMDAuMDAjTWluaW5nIGFuZCBPaWwgYW5kIEdhcyBTZXJ2aWNlcyM3MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMC4wMC4wMC4wMCNNaW5pbmcgc2VydmljZXMjNzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTUuMDAuMDAjTWluZSBleHBsb3JhdGlvbiM3MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNS4wMS4wMCNNaW5lIGRldmVsb3BtZW50IzcxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE1LjAyLjAwI1Rlc3QgYm9yaW5nIG9yIGNvcmUgZHJpbGxpbmcjNzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTYuMDAuMDAjTWluZSBkcmlsbGluZyBhbmQgYmxhc3Rpbmcgc2VydmljZXMjNzEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTYuMDEuMDAjU2hhZnQgc2lua2luZyM3MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNi4wMi4wMCNNaW5lIGJsYXN0aW5nIHNlcnZpY2VzIzcxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE3LjAwLjAwI0V4dHJhY3Rpb24jNzEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTcuMDEuMDAjU2hhZnQgbWluaW5nIHNlcnZpY2VzIzcxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE3LjAyLjAwI09wZW4gcGl0IG1pbmluZyBzZXJ2aWNlcyM3MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNy4wMy4wMCNTdHJpcCBtaW5pbmcgc2VydmljZXMjNzEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTcuMDQuMDAjSW4gc2l0dSBsZWFjaGluZyAoSVNMKSBzZXJ2aWNlcyM3MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNy4wNS4wMCNQdW1waW5nIG9yIGRyYWluaW5nIzcxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE3LjA2LjAwI092ZXJidXJkZW4gcmVtb3ZhbCM3MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNy4wNy4wMCNJbXBvdW5kbWVudCBvciBzdG9yYWdlIG9mIHdhdGVyIHNlcnZpY2VzIzcxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE3LjA4LjAwI1NvaWwgZmx1c2hpbmcgc2VydmljZXMjNzEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTcuMDkuMDAjTWluZSBmaWxsaW5nIHNlcnZpY2VzIzcxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcxLjExLjAwLjAwLjAwI09pbCBhbmQgZ2FzIGV4cGxvcmF0aW9uIHNlcnZpY2VzIzcxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjE1LjAwLjAwI09pbCBhbmQgZ2FzIGV4cGxvcmF0aW9uIzcxLjExLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjE1LjAxLjAwI1NlaXNtb2dyYXBoaWMgc3VydmV5cyM3MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNS4wMi4wMCNPZmZzaG9yZSBleHBsb3JhdGlvbiM3MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNS4wMy4wMCNXZWxsIHN1cnZleWluZyM3MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wMC4wMCNXZWxsIGRyaWxsaW5nIGFuZCBtYWludGVuYW5jZSM3MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wMS4wMCNEaXJlY3Rpb25hbCBkcmlsbGluZyM3MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wMi4wMCNPaWwgd2VsbCBkcmlsbGluZyM3MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wMy4wMCNEcmlsbGluZyBvZiB3YXRlciBpbnRha2Ugd2VsbHMjNzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTYuMDQuMDAjUmVkcmlsbGluZyBvciByZXdvcmtpbmcgb2Ygd2VsbHMjNzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTYuMDUuMDAjQWNpZGl6aW5nIG9yIGNoZW1pY2FsIHRyZWF0aW5nIG9mIHdlbGxzIzcxLjExLjE2LjAwLjAwCi11bnNwc2M3IzcxLjExLjE2LjA2LjAwI1Rvb2wgZmlzaGluZyBzZXJ2aWNlcyM3MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wNy4wMCNPaWwgd2VsbCBwbGF0Zm9ybSBtYWludGVuYW5jZSBzZXJ2aWNlcyM3MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNy4wMC4wMCNFeHRyYWN0aW9uIHNlcnZpY2VzIzcxLjExLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjE3LjAxLjAwI0Zsb3cgcmF0ZSBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNy4wMi4wMCNPaWwgc2FtcGxpbmcgc2VydmljZXMjNzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTcuMDMuMDAjT2lsIGZpZWxkIGRyaWxsaW5nIG9yIG11ZCBzZXJ2aWNlcyM3MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNy4wNC4wMCNJbXBvdW5kIG9yIHN0b3JhZ2Ugb2Ygd2F0ZXIjNzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTguMDAuMDAjV2VsbCByZXN0b3JhdGlvbiBhbmQgcmVjbGFtYXRpb24jNzEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTguMDEuMDAjQ2xlYW5pbmcgb3Igc3dhYmJpbmcgb2Ygd2VsbHMjNzEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTguMDIuMDAjU29pbCBmbHVzaGluZyBzZXJ2aWNlcyM3MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xOC4wMy4wMCNNaW5lIGZpbGxpbmcgc2VydmljZXMjNzEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTguMDQuMDAjV2VsbCBwbHVnZ2luZyBvciBhYmFuZG9ubWVudCBzZXJ2aWNlcyM3MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xOC4wNS4wMCNDZW1lbnRpbmcgc2VydmljZXMgZm9yIHdlbGwgY2FzaW5ncyM3MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xOS4wMC4wMCNXZWxsIGVtZXJnZW5jeSBzZXJ2aWNlcyM3MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xOS4wMS4wMCNXZWxsIGZpcmUgZmlnaHRpbmcgc2VydmljZXMjNzEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTkuMDIuMDAjV2VsbCBjYXBwaW5nIHNlcnZpY2VzIzcxLjExLjE5LjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjAwLjAwI0Nhc2VkIGhvbGUgd2VsbCBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjAxLjAwI0Nhc2VkIGhvbGUgZm9ybWF0aW9uIHNhbXBsaW5nIHRlc3Rpbmcgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMDIuMDAjQ2FzaW5nIHRoaWNrbmVzcyBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4wMy4wMCNDaGVtaWNhbCBjdXR0ZXJzIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjA0LjAwI0VsZWN0cm9tYWduZXRpYyBwaXBlIHJlY292ZXJ5IHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjA1LjAwI1dlbGwgZmxvdyBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4wNi4wMCNXZWxsIGZsdWlkIGRlbnNpdHkgbWVhc3VyZW1lbnQgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMDcuMDAjV2VsbCBmbHVpZCB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4wOC4wMCNGcmVlIHBvaW50IHRvb2wgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMDkuMDAjR2FtbWEgcmF5IHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjEwLjAwI0pldCBjdXR0ZXIgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMTEuMDAjTWVhc3VyZW1lbnQgd2hpbGUgcGVyZm9yYXRpbmcgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMTIuMDAjTmV1dHJvbiBwb3Jvc2l0eSBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4xMy4wMCNOdWNsZWFyIHNwZWN0cm9zY29weSBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4xNC4wMCNXZWxsIHBhY2tlciBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4xNS4wMCNQZXJtYW5lbnQgbWFnbmV0cyBwaXBlIHJlY292ZXJ5IHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjE2LjAwI1dlbGwgcGx1Z2dpbmcgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMTcuMDAjV2VsbCBwcmVzc3VyZSBtZWFzdXJlbWVudCBjb250cm9sIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjE4LjAwI1Byb2R1Y3Rpb24gbG9nZ2luZyBib3JlaG9sZSBmbHVpZCBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4xOS4wMCNQcm9kdWN0aW9uIGxvZ2dpbmcgZGVuc2l0eSBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4yMC4wMCNQcm9kdWN0aW9uIGxvZ2dpbmcgZG93bmhvbGUgdmlkZW8gc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMjEuMDAjUHJvZHVjdGlvbiBsb2dnaW5nIGZsb3cgbWVhc3VyZW1lbnQgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMjIuMDAjUHJvZHVjdGlvbiBsb2dnaW5nIHByZXNzdXJlIG1lYXN1cmVtZW50IHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjIzLjAwI090aGVyIHByb2R1Y3Rpb24gbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4yNC4wMCNQcm9kdWN0aW9uIGxvZ2dpbmcgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMjUuMDAjU2V2ZXJpbmcgY29sbGlkaW5nIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjI2LjAwI1dlbGwgbG9nZ2luZyBzb25pYyBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4yNy4wMCNTdHVjayBwb2ludCB0b29sIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjI4LjAwI1RoZXJtYWwgZGVjYXkgd2VsbCBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjI5LjAwI1dlbGwgdHVidWxhciBjb3Jyb3Npb24gZXZhbHVhdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4zMC4wMCNXZWxsIHBlcmZvcm1hbmNlIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjMxLjAwI1dlbGwgdHVidWxhciBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4wMC4wMCNPcGVuIGhvbGUgd2VsbCBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjAxLjAwI0RpZ2l0YWwgc29uaWMgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4wMi4wMCNCb3JlaG9sZSBnZW9tZXRyeSBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjAzLjAwI0RlbnNpdHkgbGl0aG9sb2d5IG51Y2xlYXIgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4wNC4wMCNEaXBtZXRlciBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjA1LjAwI0RpcG9sZSBzb25pYyBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjA2LjAwI0RpcmVjdGlvbmFsIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMDcuMDAjRGlyZWN0aW9uYWwgc3VydmV5IHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjA4LjAwI0VsZWN0cm9tYWduZXRpYyBwcm9wYWdhdGlvbiBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjA5LjAwI0Zvcm1hdGlvbiB0ZXN0aW5nIHNhbXBsaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjEwLjAwI0ZyYWN0dXJlIGlkZW50aWZpY2F0aW9uIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTEuMDAjR2FtbWEgcmF5IGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTIuMDAjR2FtbWEgcmF5IHNwZWN0cm9zY29weSBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjEzLjAwI0dlb2NoZW1pY2FsIG51Y2xlYXIgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4xNC4wMCNXZWxsIGltYWdpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTUuMDAjTWFnbmV0aWMgcmVzb25hbmNlIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTYuMDAjTWljcm9yZXNpc3Rpdml0eSBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjE3LjAwI05ldXRyb24gcG9yb3NpdHkgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4xOC4wMCNQZXRyb3BoeXNpY3Mgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTkuMDAjUmVzaXN0aXZpdHkgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4yMC4wMCNTbGltIGFjY2VzcyBzb25pYyBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjIxLjAwI1NvbmljIGNlbWVudCBib25kIHJhdGlvIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMjIuMDAjV2VsbCBzb25pYyBpbWFnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIyLjAwLjAwI090aGVyIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjIuMDEuMDAjTG9nZ2luZyB3aXRoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjIuMDIuMDAjTG9nZ2luZyB3aGlsZSBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMi4wMy4wMCNMb2dnaW5nIGR1cmluZyBmaXNoaW5nIHNlcnZpY2VzIzcxLjExLjIyLjAwLjAwCi11bnNwc2M3IzcxLjExLjIyLjA0LjAwI0xvZ2dpbmcgd2hpbGUgcGVyZm9yYXRpbmcgc2VydmljZXMjNzEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjIuMDUuMDAjRHJpbGwgcGlwZSBjb252ZXllZCB3ZWxsIHNlcnZpY2VzIzcxLjExLjIyLjAwLjAwCi11bnNwc2M3IzcxLjExLjIyLjA2LjAwI0dlbmVyYWwgd2VsbCBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIyLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjAwLjAwI1NlaXNtaWMgc2VydmljZXMjNzEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMDEuMDAjVHdvIGRpbWVuc2lvbmFsIGxhbmQgc2Vpc21pYyBhY3F1aXNpdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wMi4wMCNUd28gZGltZW5zaW9uYWwgbWFyaW5lIHNlaXNtaWMgYWNxdWlzaXRpb24gc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMDMuMDAjVHdvIGRpbWVuc2lvbmFsIHNlaXNtaWMgZGF0YSBwcm9jZXNzaW5nIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjA0LjAwI1RocmVlIGRpbWVuc2lvbmFsIGxhbmQgc2Vpc21pYyBhY3F1aXNpdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wNS4wMCNUaHJlZSBkaW1lbnNpb25hbCBtYXJpbmUgc2Vpc21pYyBhY3F1aXNpdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wNi4wMCNUaHJlZSBkaW1lbnNpb25hbCBzZWlzbWljIGRhdGEgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wNy4wMCNGb3VyIGRpbWVuc2lvbmFsIGxhbmQgc2Vpc21pYyBhY3F1aXNpdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wOC4wMCNGb3VyIGRpbWVuc2lvbmFsIG1hcmluZSBzZWlzbWljIGFjcXVpc2l0aW9uIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjA5LjAwI0ZvdXIgZGltZW5zaW9uYWwgc2Vpc21pYyBkYXRhIHByb2Nlc3Npbmcgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTAuMDAjQ2hlY2tzaG90IHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTEuMDAjQ3Jvc3Mgd2VsbCBzZWlzbWljIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjEyLjAwI0RldmlhdGVkIHdlbGwgc2Vpc21pYyBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4xMy4wMCNHZW9waHlzaWNzIHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTQuMDAjT2Zmc2V0IHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTUuMDAjUXVpY2tzaG90IHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTYuMDAjU2Vpc21pYyBkYXRhIGFjcXVpc2l0aW9uIHdoaWxlIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjE3LjAwI1NsaW0gaG9sZSBzZWlzbWljIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjE4LjAwI1NlaXNtaWMgc3VydmV5IGV2YWx1YXRpb24gb3IgZGVzaWduIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjE5LjAwI1ZlcnRpY2FsIHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMjAuMDAjV2Fsa2F3YXkgc2Vpc21pYyBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4yMS4wMCNHZW9sb2dpY2FsIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjEyLjAwLjAwLjAwI1dlbGwgZHJpbGxpbmcgY29uc3RydWN0aW9uIGFuZCBtYWludGVuYW5jZSBzZXJ2aWNlcyM3MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wMC4wMCNDZW1lbnQgcHVtcGluZyBzZXJ2aWNlcyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wMS4wMCNPaWxmaWVsZCBjYXNpbmcgaGFyZHdhcmUgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMDIuMDAjT2lsZmllbGQgY2VtZW50IGxhYiB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjAzLjAwI0Rvd25ob2xlIG9pbGZpZWxkIHRvb2xzIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjA0LjAwI09pbGZpZWxkIGZpbHRlcmluZyBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wNS4wMCNGb2FtIGNlbWVudGluZyBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wNi4wMCNHZW90aGVybWFsIHdlbGwgY2VtZW50aW5nIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjA3LjAwI0xpbmVyIGNlbWVudGluZyBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wOC4wMCNPaWx3ZWxsIGxvc3QgY2lyY3VsYXRpb24gc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMDkuMDAjT2lsZmllbGQgbXVkIHJlbW92YWwgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTAuMDAjUGx1ZyBjZW1lbnRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTEuMDAjV2VsbCBzaXRlIHByZXNzdXJlIHB1bXBpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTIuMDAjT2lsZmllbGQgcHJlc3N1cmUgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4xMy4wMCNTdXJmYWNlIGNhc2luZyBjZW1lbnRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTQuMDAjSW50ZXJtZWRpYXRlIGNhc2luZyBjZW1lbnRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTUuMDAjUHJvZHVjdGlvbiBzdHJpbmcgY2VtZW50aW5nIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjE2LjAwI1NxdWVlemUgd2VsbCBjZW1lbnRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTcuMDAjV2VsbCB3YXRlciBjb250cm9sIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjE4LjAwI1dlbGwgY2VtZW50IGV2YWx1YXRpb24gc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTkuMDAjV2VsbCBjZW1lbnQgZ3JvdXRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMjAuMDAjV2VsbCBjZW1lbnRpbmcgYWRkaXRpdmVzIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjIxLjAwI1dlbGwgY2VtZW50aW5nIGRlc2lnbiBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4yMi4wMCNXZWxsIGNsZWFuaW5nIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjIzLjAwI1dlbGwgcmVwYWlyIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjAwLjAwI0NvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMDEuMDAjQWNpZGl6aW5nIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4wMi4wMCNDYWJsZSBpbnN0YWxsYXRpb24gdGhyb3VnaCBjb2lsZWQgdHViaW5nIHNlcnZpY2VzIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjAzLjAwI0NlbWVudGluZyB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMDQuMDAjQ2hlbWljYWwgY3V0dGluZyB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMDUuMDAjQ2xlYW4gb3V0IHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4wNi4wMCNDb21wbGV0aW9uIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4wNy4wMCNDb252ZXlpbmcgaW5mbGF0YWJsZXMgdGhyb3VnaCBjb2lsZWQgdHViaW5nIHNlcnZpY2VzIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjA4LjAwI0NvcmluZyB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMDkuMDAjRXh0ZW5kZWQgcmVhY2ggd2VsbCBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4xMC4wMCNGaXNoaW5nIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4xMS4wMCNGcmFjdHVyaW5nIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4xMi4wMCNIaWdoIHByZXNzdXJlIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTMuMDAjSG9yaXpvbnRhbCBpc29sYXRpb24gb2lsZmllbGQgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTQuMDAjTG9nZ2luZyB3aXRoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTUuMDAjTWlsbGluZyB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTYuMDAjTml0cm9nZW4gcmVsYXRlZCBhcHBsaWNhdGlvbnMgdGhyb3VnaCBjb2lsZWQgdHViaW5nIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjE3LjAwI1BlcmZvcmF0aW5nIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4xOC4wMCNQaXBlbGluZSBvciBmbG93bGluZSBsYXlpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTkuMDAjUGlwZWxpbmUgaW50ZXJ2ZW50aW9uIHNlcnZpY2VzIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjIwLjAwI1NhbmQgY29udHJvbCB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMjEuMDAjQWJyYXNpdmUgdHVidWxhciBjbGVhbmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4yMi4wMCNXZWxsIGtpbGwgdGhyb3VnaCBjb2lsZWQgdHViaW5nIHNlcnZpY2VzIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjIzLjAwI0Nhc2luZyBleGl0IHdpdGggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wMC4wMCNDb3Jpbmcgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTIuMDEuMDAjQ29udmVudGlvbmFsIGNvcmluZyBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wMi4wMCNDb3JlIGlzb2xhdGlvbiBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wMy4wMCNDb3JlIHByZXNlcnZhdGlvbiBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wNC4wMCNIb3Jpem9udGFsIGNvcmluZyBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wNS4wMCNPcmllbnRlZCBjb3Jpbmcgc2VydmljZXMjNzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTIuMDYuMDAjUmlnIHNpdGUgY29yZSBhbmFseXNpcyBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wNy4wMCNTcG9uZ2UgY29yaW5nIHNlcnZpY2VzIzcxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEyLjA4LjAwI1dpcmVsaW5lIHJldHJpZXZhYmxlIGNvcmluZyBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMy4wMC4wMCNEb3duaG9sZSB0b29sIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEzLjAxLjAwI0Rvd25ob2xlIHZpYnJhdGlvbiBjb250cm9sIHNlcnZpY2VzIzcxLjEyLjEzLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEzLjAyLjAwI0Rvd25ob2xlIGhvbGUgb3BlbmluZyBzZXJ2aWNlcyM3MS4xMi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMy4wMy4wMCNSZWFtaW5nIHdoaWxlIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjEzLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEzLjA0LjAwI0Rvd25ob2xlIHRvcnF1ZSBvciBkcmFnIHJlZHVjdGlvbiBzZXJ2aWNlcyM3MS4xMi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMy4wNS4wMCNEb3duaG9sZSB1bmRlcnJlYW1pbmcgc2VydmljZXMjNzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDAuMDAjT2lsZmllbGQgZHJpbGxpbmcgYml0IHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjE0LjAxLjAwI09pbGZpZWxkIGRyaWxsaW5nIGJpdCBkZXNpZ24gc2VydmljZXMjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDIuMDAjT2lsZmllbGQgZHJpbGxpbmcgYml0IGh5ZHJhdWxpYyBvcHRpbWl6YXRpb24gc2VydmljZXMjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDMuMDAjT2lsZmllbGQgZHJpbGxpbmcgYml0IHBsYW5uaW5nIHNlcnZpY2VzIzcxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE0LjA0LjAwI09pbGZpZWxkIGRyaWxsaW5nIGJpdCByZWNvcmRpbmcgc2VydmljZXMjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDUuMDAjT2lsZmllbGQgZHJpbGxpbmcgYml0IHJlcGFpciBzZXJ2aWNlcyM3MS4xMi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNC4wNi4wMCNPaWxmaWVsZCBkcmlsbGluZyBiaXQgZm9vdGFnZSBjb250cmFjdHMjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDcuMDAjV2VsbCBzaXRlIGRyaWxsaW5nIG9wdGltaXphdGlvbiBhc3Npc3RhbmNlIHNlcnZpY2UjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDAuMDAjRHJpbGxpbmcgbWVhc3VyZW1lbnQgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDEuMDAjQWNvdXN0aWMgbWVhc3VyZW1lbnQgd2hlbiBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNS4wMi4wMCNBY291c3RpYyB0ZWxlbWV0cnkgd2hlbiBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNS4wMy4wMCNDYWxpcGVyIG1lYXN1cmVtZW50IHdoZW4gZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDQuMDAjRGVuc2l0eSBtZWFzdXJlbWVudCB3aGVuIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE1LjA1LjAwI09pbGZpZWxkIGRyaWxsaW5nIHBlcmZvcm1hbmNlIHNlcnZpY2VzIzcxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE1LjA2LjAwI0VsZWN0cm9tYWduZXRpYyB0ZWxlbWV0cnkgd2hlbiBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNS4wNy4wMCNGb3JtYXRpb24gZGlwIG1lYXN1cmVtZW50IHdoZW4gZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDguMDAjRm9ybWF0aW9uIHByZXNzdXJlIG1lYXN1cmVtZW50IHdoZW4gZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDkuMDAjR2VvbG9naWNhbGx5IHN0ZWVyZWQgd2VsbHMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTAuMDAjR2Vvc3RvcHBpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTEuMDAjTXVkIGxvZ2dpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTIuMDAjTnVjbGVhciBtYWduZXRpYyByZXNvbmFuY2Ugc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTMuMDAjUG9yb3NpdHkgbWVhc3VyZW1lbnQgd2hlbiBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNS4xNC4wMCNSZXNpc3Rpdml0eSBtZWFzdXJlbWVudCB3aGVuIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE1LjE1LjAwI1dlbGwgc3VydmV5aW5nIG1hbmFnZW1lbnQgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTYuMDAjU3VydmV5aW5nIHdpcmVsaW5lIHNlcnZpY2VzIzcxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjAwLjAwI09pbCB3ZWxsIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjAxLjAwI1dlbGwgY2FzaW5nIGNyZXcgc2VydmljZSM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4wMi4wMCNXZWxsIGNhc2luZyBwbGFubmluZyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4wMy4wMCNXZWxsIGNhc2luZyBtaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjA0LjAwI0NvaWxlZCB0dWJpbmcgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMDUuMDAjV2VsbCBjb21wbGV0aW9uIHBsYW5uaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjA2LjAwI0NvbnZlbnRpb25hbCB3ZWxsIGRpcmVjdGlvbmFsIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjA3LjAwI1dlbGwgZGlyZWN0aW9uYWwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMDguMDAjV2VsbCBkcmlsbGluZyBjb250cmFjdCBkZXZlbG9wbWVudCBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4wOS4wMCNXZWxsIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjEwLjAwI1dlbGwgZHJpbGxpbmcgZW5naW5lZXJpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTEuMDAjV2VsbCBkcmlsbGluZyBtdWQgb3IgZmx1aWQgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTIuMDAjV2VsbCBkcmlsbGluZyBvZiB3YXRlciBpbnRha2Ugd2VsbCBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4xMy4wMCNXZWxsIGRyaWxsaW5nIHJpZyBtb25pdG9yIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjE0LjAwI1dlbGwgZHJpbGxpbmcgc29saWRzIGNvbnRyb2wjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTUuMDAjV2VsbCBkcmlsbGluZyBzdGFiaWxpemluZyBvciBob2xlIG9wZW5pbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTYuMDAjV2VsbCBkcmlsbGluZyBzdXBlcnZpc2lvbiM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4xNy4wMCNXZWxsIGRyaWxsaW5nIGNvbnRyb2wgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTguMDAjV2VsbCBkcmlsbGluZyBvdGhlciBnZW5lcmFsIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjE5LjAwI0V4dGVuZGVkIHJlYWNoIGRpcmVjdGlvbmFsIHdlbGwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjAuMDAjTXVsdGlsYXRlcmFsIGRpcmVjdGlvbmFsIHdlbGwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjEuMDAjT2lsIGNvdW50cnkgdHVidWxhciBtb2RpZmljYXRpb24gb3IgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4yMi4wMCNXZWxsIGRyaWxsaW5nIHBpY2t1cCBvciBsYXlkb3duIHNlcnZpY2UjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjMuMDAjV2VsbCBkcmlsbGluZyBwaXBlIHN0b3JhZ2UjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjQuMDAjV2VsbCBkcmlsbGluZyBwaXBlIHRocmVhZGluZyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4yNS4wMCNSYXRob2xlIHdlbGwgZHJpbGxpbmcgc2VydmljZSM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4yNi4wMCNTaG9ydCByYWRpdXMgZGlyZWN0aW9uYWwgd2VsbCBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4yNy4wMCNTdGVlcmFibGUgdW5kZXJyZWFtaW5nIHdoaWxlIHdlbGwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjguMDAjVWx0cmEgc2hvcnQgcmFkaXVzIGRpcmVjdGlvbmFsIHdlbGwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjkuMDAjVW5kZXJiYWxhbmNlZCB3ZWxsIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjMwLjAwI1dlbGwgcGxhbm5pbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMzEuMDAjV2VsbCByZWRyaWxsaW5nIG9yIHJld29ya2luZyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4zMi4wMCNXZWxsIGRyaWxsaW5nIGRldmlhdGlvbiBjb250cm9sIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjMzLjAwI09pbGZpZWxkIGdyYXZlbCBwYWNraW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjM0LjAwI09pbGZpZWxkIGh1bGwgc3lzdGVtcyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4zNS4wMCNSaWcgd2VsbCBwdWxsaW5nIGNyZXcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMzYuMDAjV2VsbGhlYWQgZXF1aXBtZW50IHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjM3LjAwI1NpZGV0cmFja2luZyB3aXRoIHdoaXBzdG9jayBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNy4wMC4wMCNPaWxmaWVsZCBmaXNoaW5nIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjE3LjAxLjAwI09pbGZpZWxkIGZpc2hpbmcgc2VydmljZSBkZXNpZ24gc2VydmljZXMjNzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTcuMDIuMDAjT2lsZmllbGQgZmlzaGluZyBzZXJ2aWNlIGVjb25vbWljIGV2YWx1YXRpb24gc2VydmljZXMjNzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTcuMDMuMDAjT2lsZmllbGQgZmlzaGluZyBzZXJ2aWNlIG9wZXJhdGlvbiBzZXJ2aWNlcyM3MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNy4wNC4wMCNPaWxmaWVsZCBqdW5rIHJlY292ZXJ5IHNlcnZpY2VzIzcxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE3LjA1LjAwI09pbGZpZWxkIHBpcGUgcmVjb3Zlcnkgc2VydmljZSM3MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNy4wNi4wMCNPaWxmaWVsZCBmaXNoaW5nIG9yIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE4LjAwLjAwI0dhcyBsaWZ0IHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjE4LjAxLjAwI0NvaWxlZCB0dWJpbmcgZ2FzIGxpZnQgc2VydmljZXMjNzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTguMDIuMDAjR2FzIGxpZnQgZml4aW5nIG9yIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTguMDMuMDAjR2FzIGxpZnQga2lja292ZXIgc2VydmljZXMjNzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTguMDQuMDAjR2FzIGxpZnQgc2FuZCBjb250YWlubWVudCBzZXJ2aWNlcyM3MS4xMi4xOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xOS4wMC4wMCNEb3duIGhvbGUgZmx1aWQgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTkuMDEuMDAjRG93biBob2xlIGZsdWlkIGV2YWx1YXRpb24gc2VydmljZXMjNzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTkuMDIuMDAjRG93biBob2xlIGZsdWlkIGxhYm9yYXRvcnkgc2VydmljZXMjNzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTkuMDMuMDAjRG93biBob2xlIGZsdWlkIHNhbXBsaW5nIHNlcnZpY2VzIzcxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzcxLjEyLjIwLjAwLjAwI1dlbGwgcGVyZm9yYXRpbmcgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjAuMDEuMDAjQ29pbGVkIHR1YmluZyB3ZWxsIHBlcmZvcmF0aW5nIHNlcnZpY2VzIzcxLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIwLjAyLjAwI1NsaWNrbGluZSB3ZWxsIHBlcmZvcmF0aW5nIHNlcnZpY2VzIzcxLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIwLjAzLjAwI1Rocm91Z2ggdHViaW5nIHdlbGwgcGVyZm9yYXRpb24gc2VydmljZXMjNzEuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjAuMDQuMDAjVHViaW5nIGNvbnZleWVkIHdlbGwgcGVyZm9yYXRpbmcgc2VydmljZXMjNzEuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjAuMDUuMDAjV2lyZWxpbmUgd2VsbCBwZXJmb3JhdGluZyBzZXJ2aWNlcyM3MS4xMi4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMC4wNi4wMCNXZWxsIHR1YmluZyBwdW5jaGVyIHNlcnZpY2VzIzcxLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjAwLjAwI09pbGZpZWxkIHNhbmQgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4wMS4wMCNBY2lkIHNhbmQgY29udHJvbCBwdW1waW5nIHNlcnZpY2VzIzcxLjEyLjIxLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjAyLjAwI1NhbmQgY29udHJvbCBibGVuZGluZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4wMy4wMCNDbGVhbmluZyBmbHVpZCBzYW5kIGNvbnRyb2wgc2VydmljZXMjNzEuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjEuMDQuMDAjQ29tcGxldGlvbiBmbHVpZCBzYW5kIGNvbnRyb2wgc2VydmljZXMjNzEuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjEuMDUuMDAjV2VsbCBjb25zb2xpZGF0aW9uIHNlcnZpY2VzIzcxLjEyLjIxLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjA2LjAwI09pbGZpZWxkIGZpbHRlcmluZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4wNy4wMCNGcmFjdHVyaW5nIGZsdWlkIHNhbmQgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4wOC4wMCNGcmFjdHVyaW5nIHByZSBmcmFjIGRlc2lnbiB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjIxLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjA5LjAwI0dlbmVyYWwgc2FuZCBjb250cm9sIHNlcnZpY2VzIzcxLjEyLjIxLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjEwLjAwI0dyYXZlbCBjYXJyaWVyIGZsdWlkIHNhbmQgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xMS4wMCNTYW5kIGNvbnRyb2wgbGFiIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjEuMTIuMDAjTXVsdGl6b25lIHNhbmQgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xMy4wMCNTYW5kIGNvbnRyb2wgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xNC4wMCNTYW5kIGNvbnRyb2wgdGVtcG9yYXJ5IGlzb2xhdGlvbiBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xNS4wMCNXZWxsIHRvb2wgcmVkcmVzc2luZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xNi4wMCNOb24gZnJhY3R1cmluZyBzYW5kIGNvbnRyb2wgcHVtcGluZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMi4wMC4wMCNTbGlja2xpbmUgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjIuMDEuMDAjU2xpY2tsaW5lIGZpc2hpbmcgc2VydmljZXMjNzEuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjIuMDIuMDAjU2xpY2tsaW5lIGxpZnRpbmcgc2VydmljZXMjNzEuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjIuMDMuMDAjU2xpY2tsaW5lIG1hbmlwdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMi4yMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMy4wMC4wMCNTdWJzZWEgd2VsbCBzZXJ2aWNlcyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMy4wMS4wMCNTdWJzZWEgd2VsbCBkaXZpbmcgc2VydmljZXMjNzEuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjMuMDIuMDAjU3Vic2VhIHdlbGwgcmVtb3RlIG9wZXJhdGlvbiB2ZWhpY2xlIHJvdiBzZXJ2aWNlcyM3MS4xMi4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMy4wMy4wMCNTdWJzZWEgd2VsbCBmaXh0dXJpbmcgb3IgdGVzdCBlcXVpcG1lbnQgc2VydmljZXMjNzEuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjMuMDQuMDAjU3Vic2VhIHdlbGwgaW50ZXJ2ZW50aW9uIG9yIGNvbXBsZXRpb24gc2VydmljZXMjNzEuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjMuMDUuMDAjU3Vic2VhIHdlbGwgc2FmZXR5IHRlc3QgdHJlZSBzZXJ2aWNlcyM3MS4xMi4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMy4wNi4wMCNTdWJzZWEgd2VsbCBlcXVpcG1lbnQgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzEuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjQuMDAuMDAjV2VsbCB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjI0LjAxLjAwI0RyaWxsIHN0ZW0gZmxvdyBtZXRlcmluZyBzZXJ2aWNlcyM3MS4xMi4yNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNC4wMi4wMCNEcmlsbCBzdGVtIHN1cmZhY2UgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4yNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNC4wMy4wMCNEcmlsbCBzdGVtIHRlc3RpbmcgcGFja2VyIHNlcnZpY2VzIzcxLjEyLjI0LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI0LjA0LjAwI0RyaWxsIHN0ZW0gdGVzdGluZyBwcmVzc3VyZSBjb250cm9sIHRlc3Qgc2VydmljZXMjNzEuMTIuMjQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjQuMDUuMDAjRHJpbGwgc3RlbSB0ZXN0aW5nIHB1bHNlIG9wZXJhdGVkIHRlc3Qgc2VydmljZXMjNzEuMTIuMjQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjQuMDYuMDAjRHJpbGwgc3RlbSB0ZXN0aW5nIGZvciB1bHRyYSBoaWdoIHByZXNzIGhpZ2ggdGVtcCBlbnZpcm9ubWVudCBzZXJ2aWNlcyM3MS4xMi4yNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNC4wNy4wMCNEcmlsbCBzdGVtIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMjQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjQuMDguMDAjUGVyaW9kaWMgd2VsbCB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjI0LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI0LjA5LjAwI1N1cmZhY2Ugd2VsbCB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjI0LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI0LjEwLjAwI1VuZGVyYmFsYW5jZWQgdGVzdGluZyB3aGlsZSBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4yNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNS4wMC4wMCNXYXRlciBvciBnYXMgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNS4wMS4wMCNXYXRlciBvciBnYXMgY29udHJvbCBkZXNpZ24gc2VydmljZXMjNzEuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjUuMDIuMDAjV2F0ZXIgb3IgZ2FzIGNvbnRyb2wgZXZhbHVhdGlvbiBzZXJ2aWNlcyM3MS4xMi4yNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNS4wMy4wMCNXYXRlciBvciBnYXMgY29udHJvbCBpc29sYXRpb24gc2VydmljZXMjNzEuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjUuMDQuMDAjV2F0ZXIgb3IgZ2FzIGNvbnRyb2wgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4yNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNS4wNS4wMCNXYXRlciBvciBnYXMgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4yNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4wMC4wMCNXZWxsIGNvbXBsZXRpb24gc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjYuMDEuMDAjV2VsbCBjYXNpbmcgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4wMi4wMCNXZWxsIGNvbXBsZXRpb24gZmx1aWRzIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI2LjAzLjAwI0dhcyBsaWZ0IHdlbGwgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4wNC4wMCNIb3Jpem9udGFsIGNhc2VkIGhvbGUgc2VydmljZXMjNzEuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjYuMDUuMDAjSG9yaXpvbnRhbCBvcGVuIGhvbGUgc2VydmljZXMjNzEuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjYuMDYuMDAjSW50ZWxsaWdlbnQgd2VsbCBjb21wbGV0aW9uIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI2LjA3LjAwI0xpbmVyIHdlbGwgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4wOC4wMCNNdWx0aWxhdGVyYWwgd2VsbCBjb21wbGV0aW9uIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI2LjA5LjAwI1Blcm1hbmVudCB3ZWxsIGNvbXBsZXRpb24gc2VydmljZXMjNzEuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjYuMTAuMDAjU2FuZCBjb250cm9sIHdlbGwgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4xMS4wMCNUZW1wb3JhcnkgZHJpbGwgc3RlbSB0ZXN0aW5nIHdlbGwgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4xMi4wMCNUdWJpbmcgd2VsbCBjb21wbGV0aW9uIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI2LjEzLjAwI1VuZGVyYmFsYW5jZWQgd2VsbCBjb21wbGV0aW9uIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI3LjAwLjAwI1dlbGwgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjcuMDEuMDAjT2lsIHdlbGwgcGxhdGZvcm0gbWFpbnRlbmFuY2Ugc2VydmljZXMjNzEuMTIuMjcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjcuMDIuMDAjT2lsZmllbGQgcHVtcGluZyB1bml0IG1haW50ZW5hbmNlIHNlcnZpY2VzIzcxLjEyLjI3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI3LjAzLjAwI09pbGZpZWxkIHJvZCBwdW1wIHJlcGFpciBzZXJ2aWNlcyM3MS4xMi4yNy4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNy4wNC4wMCNPaWxmaWVsZCBzbnViYmluZyBzZXJ2aWNlIzcxLjEyLjI3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI3LjA1LjAwI09pbGZpZWxkIHN1Y2tlciByb2QgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzEuMTIuMjcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjcuMDYuMDAjV2VsbCBzd2FiYmluZyBzZXJ2aWNlcyM3MS4xMi4yNy4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNy4wNy4wMCNPaWxmaWVsZCB0dWJpbmcgYW5jaG9yIHNlcnZpY2VzIzcxLjEyLjI3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI3LjA4LjAwI09pbGZpZWxkIHB1bXAgbWVjaGFuaWMgc2VydmljZXMjNzEuMTIuMjcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjguMDAuMDAjV2VsbCBtb25pdG9yaW5nIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjI4LjAxLjAwI0Rvd25ob2xlIHJlY29yZGluZyBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wMi4wMCNXZWxsIGZsb3cgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wMy4wMCNPaWwgb3IgZ2FzIHdlbGwgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wNC4wMCNXZWxsIHNpdGUgcGhhc2UgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wNS4wMCNXZWxsIHNpdGUgcHVtcCBtb25pdG9yaW5nIHNlcnZpY2VzIzcxLjEyLjI4LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI4LjA2LjAwI1dlbGwgc2l0ZSBzdXJmYWNlIGRhdGEgYWNxdWlzaXRpb24gc2VydmljZXMjNzEuMTIuMjguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjguMDcuMDAjV2VsbCBzaXRlIHN1cmZhY2UgcmVhZG91dCBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wOC4wMCNXZWxsIHNpdGUgc3VyZmFjZSByZWNvcmRpbmcgc2VydmljZXMjNzEuMTIuMjguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjguMDkuMDAjU3VyZmFjZSB3ZWxsIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMjguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjguMTAuMDAjU3Vic3VyZmFjZSB3ZWxsIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMjguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjkuMDAuMDAjT2lsZmllbGQgcmlncyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOS4wMS4wMCNEZWVwd2F0ZXIgb2lsZmllbGQgcmlnIHNlcnZpY2VzIzcxLjEyLjI5LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI5LjAyLjAwI0phY2t1cCBvaWxmaWVsZCByaWcgc2VydmljZXMjNzEuMTIuMjkuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjkuMDMuMDAjQmFyZ2Ugb2lsZmllbGQgcmlnIHNlcnZpY2VzIzcxLjEyLjI5LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI5LjA0LjAwI0xhbmQgb2lsZmllbGQgcmlnIHNlcnZpY2VzIzcxLjEyLjI5LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI5LjA1LjAwI1BsYXRmb3JtIG9pbGZpZWxkIHJpZyBzZXJ2aWNlcyM3MS4xMi4yOS4wMC4wMAotdW5zcHNjNyM3MS4xMy4wMC4wMC4wMCNPaWwgYW5kIGdhcyBleHRyYWN0aW9uIGFuZCBwcm9kdWN0aW9uIGVuaGFuY2VtZW50IHNlcnZpY2VzIzcxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEwLjAwLjAwI1dlbGwgZnJhY3R1cmluZyBzZXJ2aWNlcyM3MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wMS4wMCNBY2lkIGJhc2VkIGZsdWlkIHdlbGwgZnJhY3R1cmluZyBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wMi4wMCNFbXVsc2lvbiBiYXNlZCBmbHVpZCB3ZWxsIGZyYWN0dXJpbmcgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMDMuMDAjRm9hbSBiYXNlZCBmbHVpZCB3ZWxsIGZyYWN0dXJpbmcgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMDQuMDAjT2lsIHdlbGwgZnJhY3R1cmluZyBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wNS4wMCNPaWwgd2VsbCBzY2FsZSBjb250cm9sIHNlcnZpY2VzIzcxLjEzLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEwLjA2LjAwI1dlbGwgZnJhY3R1cmUgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wNy4wMCNXZWxsIGZyYWN0dXJpbmcgZG93bmhvbGUgZXZhbHVhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wOC4wMCNXZWxsIGZyYWN0dXJpbmcgaGVpZ2h0IGNvbnRyb2wgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMDkuMDAjV2VsbCBmcmFjdHVyaW5nIG1vbml0b3Jpbmcgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMTAuMDAjV2VsbCBmcmFjdHVyaW5nIHNlcnZpY2UgZGVzaWduIHNlcnZpY2VzIzcxLjEzLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEwLjExLjAwI1dlbGwgZnJhY3R1cmluZyBzZXJ2aWNlIGV2YWx1YXRpb24gc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMTIuMDAjV2VsbCBmcmFjdHVyaW5nIHN1cmZhY2UgZXZhbHVhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4xMy4wMCNXZWxsIGZyYWN0dXJpbmcgdHJlYXRtZW50IHF1YWxpdHkgY29udHJvbCBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4xNC4wMCNPaWwgYmFzZWQgZmx1aWQgd2VsbCBmcmFjdHVyaW5nIHNlcnZpY2VzIzcxLjEzLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEwLjE1LjAwI090aGVyIHdlbGwgZnJhY3R1cmluZyBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4xNi4wMCNXZWxsIGZyYWN0dXJpbmcgc3RyZXNzIG1hbmFnZW1lbnQgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMTcuMDAjV2F0ZXIgYmFzZWQgZmx1aWQgd2VsbCBmcmFjdHVyaW5nIHNlcnZpY2VzIzcxLjEzLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjExLjAwLjAwI01hdHJpeCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMS4wMS4wMCNBY2lkIGJhc2VkIG1hdHJpeCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMS4wMi4wMCNGb3JtYXRpb24gc2VhbGVyIG1hdHJpeCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMS4wMy4wMCNNYXRyaXggb3JnYW5pYyBjbGVhbnVwIHNlcnZpY2VzIzcxLjEzLjExLjAwLjAwCi11bnNwc2M3IzcxLjEzLjExLjA0LjAwI01hdHJpeCBvcmdhbmljIGluaGliaXRpb24gc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDUuMDAjTWF0cml4IHNjYWxlIGNsZWFudXAgc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDYuMDAjTWF0cml4IHNjYWxlIGluaGliaXRpb24gc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDcuMDAjTWF0cml4IHRyZWF0bWVudCBkZXNpZ24gc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDguMDAjTWF0cml4IHRyZWF0bWVudCBkaXZlcnNpb24gc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDkuMDAjTWF0cml4IHRyZWF0bWVudCBldmFsdWF0aW9uIHNlcnZpY2VzIzcxLjEzLjExLjAwLjAwCi11bnNwc2M3IzcxLjEzLjExLjEwLjAwI01hdHJpeCB0cmVhdG1lbnQgcXVhbGl0eSBjb250cm9sIHNlcnZpY2VzIzcxLjEzLjExLjAwLjAwCi11bnNwc2M3IzcxLjEzLjExLjExLjAwI05vbiBhY2lkIGJhc2VkIG1hdHJpeCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMi4wMC4wMCNPaWxmaWVsZCBuaXRyb2dlbiBzZXJ2aWNlcyM3MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMi4wMS4wMCNOaXRyb2dlbiB3ZWxsIHNlcnZpY2VzIzcxLjEzLjEyLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEzLjAwLjAwI090aGVyIG9pbGZpZWxkIHB1bXBpbmcgc2VydmljZXMjNzEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDEuMDAjQm90dG9tIGludGFrZSBvaWxmaWVsZCBwdW1waW5nIHNlcnZpY2VzIzcxLjEzLjEzLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEzLjAyLjAwI0NhYmxlIGRlcGxveWVkIG9pbGZpZWxkIHB1bXBpbmcgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDMuMDAjQ28yIG9pbGZpZWxkIHB1bXBpbmcgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDQuMDAjQ29pbGVkIHR1YmluZyBkZXBsb3llZCBvaWxmaWVsZCBwdW1waW5nIHNlcnZpY2VzIzcxLjEzLjEzLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEzLjA1LjAwI0Rvd25ob2xlIHB1bXBpbmcgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDYuMDAjRHVhbCBjb21wbGV0aW9uIHdlbGwgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDcuMDAjSG9yaXpvbnRhbCBwdW1waW5nIHdlbGwgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDguMDAjT2lsZmllbGQgcHVtcGluZyBpbnN0YWxsYXRpb24gcHVsbCBvciBvcGVyYXRpb24gc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDkuMDAjV2VsbCBwcm9maWxlIG1vZGlmaWNhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMy4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMy4xMC4wMCNPaWxmaWVsZCBzcG9vbGluZyBzZXJ2aWNlcyM3MS4xMy4xMy4wMC4wMAotdW5zcHNjNyM3MS4xMy4xNC4wMC4wMCNXZWxsIHByb2R1Y3Rpb24gc2VydmljZXMjNzEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTQuMDEuMDAjT2lsZmllbGQgZmxhcmUgc3lzdGVtIHNlcnZpY2VzIzcxLjEzLjE0LjAwLjAwCi11bnNwc2M3IzcxLjEzLjE0LjAyLjAwI09pbGZpZWxkIGhvdCBvaWwgb3Igd2F0ZXIgc2VydmljZSM3MS4xMy4xNC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xNC4wMy4wMCNPaWxmaWVsZCBzdGVhbWluZyBzZXJ2aWNlcyM3MS4xMy4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNC4wMC4wMC4wMCNPaWwgYW5kIGdhcyByZXN0b3JhdGlvbiBhbmQgcmVjbGFtYXRpb24gc2VydmljZXMjNzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTQuMTAuMDAuMDAjRW1lcmdlbmN5IHdlbGwgY29udHJvbCBzZXJ2aWNlcyM3MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNC4xMC4wMS4wMCNXZWxsIHByZXNzdXJlIGNvbnRyb2wgc2VydmljZXMjNzEuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTQuMTAuMDIuMDAjV2VsbCBjYXBwaW5nIHNlcnZpY2VzIzcxLjE0LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE0LjEwLjAzLjAwI1dlbGwgZmlyZSBmaWdodGluZyBzZXJ2aWNlcyM3MS4xNC4xMC4wMC4wMAotdW5zcHNjNyM3MS4xNC4xMC4wNC4wMCNXaWxkIHdlbGwgY29udHJvbCBzZXJ2aWNlcyM3MS4xNC4xMC4wMC4wMAotdW5zcHNjNyM3MS4xNC4xMS4wMC4wMCNXZWxsIHBsdWdnaW5nIGFuZCBhYmFuZG9ubWVudCBzZXJ2aWNlcyM3MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNC4xMS4wMS4wMCNXZWxsIGFiYW5kb25tZW50IHNlcnZpY2VzIzcxLjE0LjExLjAwLjAwCi11bnNwc2M3IzcxLjE0LjExLjAyLjAwI1dlbGwgcGx1Z2dpbmcgc2VydmljZXMjNzEuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTQuMTIuMDAuMDAjV2VsbCBzaXRlIHJlc3RvcmF0aW9uIzcxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE0LjEyLjAxLjAwI1dlbGwgY2xlYW5pbmcgb3Igc3dhYmJpbmcgc2VydmljZXMjNzEuMTQuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTQuMTIuMDIuMDAjV2VsbCBzaXRlIHJlc3RvcmF0aW9uIHNlcnZpY2VzIzcxLjE0LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE1LjAwLjAwLjAwI09pbCBhbmQgZ2FzIGRhdGEgbWFuYWdlbWVudCBhbmQgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMC4wMC4wMCNPaWxmaWVsZCBkYXRhIGNvbW11bmljYXRpb24gc2VydmljZXMjNzEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTAuMDEuMDAjTG9nIGRhdGEgdHJhbnNtaXNzaW9uIHNlcnZpY2VzIzcxLjE1LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEwLjAyLjAwI0xvZyBncmFwaGljcyB0cmFuc21pc3Npb24gc2VydmljZXMjNzEuMTUuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTAuMDMuMDAjUmVhbCB0aW1lIHdlbGwgZGF0YSBtb25pdG9yaW5nIHNlcnZpY2VzIzcxLjE1LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEwLjA0LjAwI1NhdGVsbGl0ZSB3ZWxsIGRhdGEgdHJhbnNtaXNzaW9uIHNlcnZpY2VzIzcxLjE1LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEwLjA1LjAwI1dlbGwgZGF0YSB0cmFuc21pc3Npb24gc2VydmljZXMjNzEuMTUuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTEuMDAuMDAjT2lsZmllbGQgZGF0YSBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjExLjAxLjAwI09pbGZpZWxkIGFzc2V0IGRhdGEgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MS4xNS4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMS4wMi4wMCNPaWxmaWVsZCBkYXRhIG1pbmluZyBzZXJ2aWNlcyM3MS4xNS4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMS4wMy4wMCNMb2cgZGF0YSBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE1LjExLjAwLjAwCi11bnNwc2M3IzcxLjE1LjExLjA0LjAwI09pbGZpZWxkIG1hcHBpbmcgZGF0YSBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE1LjExLjAwLjAwCi11bnNwc2M3IzcxLjE1LjExLjA1LjAwI1NlaXNtaWMgZGF0YSBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE1LjExLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEyLjAwLjAwI09pbGZpZWxkIGVjb25vbWljIGFuZCByaXNrIG1vZGVsIHNlcnZpY2VzIzcxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEyLjAxLjAwI09pbGZpZWxkIGJ1ZGdldGluZyBzZXJ2aWNlcyM3MS4xNS4xMi4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMi4wMi4wMCNPaWxmaWVsZCBjYXBpdGFsIHBsYW5uaW5nIHNlcnZpY2VzIzcxLjE1LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEyLjAzLjAwI09pbGZpZWxkIGRlY2lzaW9uIHRyZWUgc2VydmljZXMjNzEuMTUuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMDAuMDAjT2lsZmllbGQgaW50ZXJwcmV0YXRpb24gc2VydmljZXMjNzEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMDEuMDAjT2lsZmllbGQgYnViYmxlIG1hcCBzZXJ2aWNlcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4wMi4wMCNPaWxmaWVsZCBjYXNlIHN0dWRpZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMDMuMDAjT2lsZmllbGQgZGVjbGluZSBhbmFseXNpcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4wNC4wMCNPaWxmaWVsZCBmaWVsZCBzdHVkaWVzIzcxLjE1LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEzLjA1LjAwI09pbGZpZWxkIGZyYWN0dXJpbmcgaW50ZXJwcmV0YXRpb24gc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMDYuMDAjR2VvbG9neSBzZXJ2aWNlcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4wNy4wMCNHZW9waHlzaWNzIHNlcnZpY2VzIzcxLjE1LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEzLjA4LjAwI0dyYXZlbCBwYWNrIGludGVycHJldGF0aW9uIHNlcnZpY2VzIzcxLjE1LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEzLjA5LjAwI09pbGZpZWxkIGdyaWQgbWFwcGluZyBzZXJ2aWNlcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4xMC4wMCNPaWxmaWVsZCBtYXBwaW5nIG9yIHZpc3VhbGl6YXRpb24gc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMTEuMDAjUGV0cm9waHlzaWNzIHNlcnZpY2VzIzcxLjE1LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEzLjEyLjAwI1Jlc2Vydm9pciBlbmdpbmVlcmluZyBzZXJ2aWNlcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4xMy4wMCNSZXNlcnZvaXIgbW9kZWxpbmcgc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMTQuMDAjUmVzZXJ2b2lyIHNpbXVsYXRpb24gc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMTUuMDAjUm9jayBtZWNoYW5pY3Mgc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTQuMDAuMDAjV2VsbCBzZXJ2aWNlIGVuZ2luZWVyaW5nIzcxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjE0LjAxLjAwI1dlbGwgY2VtZW50aW5nIGpvYiBkZXNpZ24gc2VydmljZXMjNzEuMTUuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTQuMDIuMDAjQ29pbGVkIHR1YmluZyBqb2IgZGVzaWduIHNlcnZpY2VzIzcxLjE1LjE0LjAwLjAwCi11bnNwc2M3IzcxLjE1LjE0LjAzLjAwI1dlbGwgZHJpbGxpbmcgam9iIGRlc2lnbiBzZXJ2aWNlcyM3MS4xNS4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNS4xNC4wNC4wMCNXZWxsIGZyYWN0dXJpbmcgam9iIGRlc2lnbiBzZXJ2aWNlcyM3MS4xNS4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNS4xNC4wNS4wMCNNYXRyaXggc3RpbXVsYXRpb24gam9iIGRlc2lnbiBzZXJ2aWNlcyM3MS4xNS4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNS4xNC4wNi4wMCNXZWxsIHNhbmQgY29udHJvbCBqb2IgZGVzaWduIHNlcnZpY2VzIzcxLjE1LjE0LjAwLjAwCi11bnNwc2M3IzcxLjE2LjAwLjAwLjAwI09pbCBhbmQgZ2FzIHdlbGwgcHJvamVjdCBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjAwLjAwI09pbGZpZWxkIE1vZGVsaW5nIFNlcnZpY2VzIzcxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjAxLjAwI09pbGZpZWxkIGNvbXBsZXRpb24gbW9kZWxzIzcxLjE2LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjAyLjAwI09pbGZpZWxkIGRyaWxsaW5nIG1vZGVscyM3MS4xNi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMC4wMy4wMCNPaWxmaWVsZCBlY29ub21pYyBtb2RlbHMjNzEuMTYuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTAuMDQuMDAjT2lsZmllbGQgZmllbGQgZGV2ZWxvcG1lbnQgbW9kZWxzIzcxLjE2LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjA1LjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gbW9kZWxzIzcxLjE2LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjA2LjAwI09pbGZpZWxkIHJpc2sgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MS4xNi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wMC4wMCNPaWxmaWVsZCBwcm9kdWN0aW9uIGVuZ2luZWVyaW5nIG1hbmFnZW1lbnQjNzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTEuMDEuMDAjT2lsZmllbGQgYXJ0aWZpY2lhbCBsaWZ0IHNlcnZpY2VzIzcxLjE2LjExLjAwLjAwCi11bnNwc2M3IzcxLjE2LjExLjAyLjAwI0VuaGFuY2VkIG9pbCByZWNvdmVyeSBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wMy4wMCNXZWxsIGluamVjdGlvbiBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wNC4wMCNPaWxmaWVsZCBub2RhbCBhbmFseXNpcyBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wNS4wMCNXZWxsIHBlcmZvcmF0aW9uIHNlcnZpY2VzIzcxLjE2LjExLjAwLjAwCi11bnNwc2M3IzcxLjE2LjExLjA2LjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gY2hlbWlzdHJ5IHNlcnZpY2VzIzcxLjE2LjExLjAwLjAwCi11bnNwc2M3IzcxLjE2LjExLjA3LjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wOC4wMCNPaWxmaWVsZCBzYW5kIGNvbnRyb2wgc2VydmljZXMjNzEuMTYuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTEuMDkuMDAjV2VsbCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4xMC4wMCNVbmRlcmdyb3VuZCBnYXMgc3RvcmFnZSBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4xMS4wMCNPaWxmaWVsZCB3YXRlciBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE2LjExLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjAwLjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gb3BlcmF0aW9ucyBtYW5hZ2VtZW50IzcxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjAxLjAwI09pbGZpZWxkIGhvdCBvaWxpbmcgc2VydmljZSM3MS4xNi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMi4wMi4wMCNPaWxmaWVsZCBsZWFzZSBvcGVyYXRpb25zIzcxLjE2LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjAzLjAwI09pbGZpZWxkIGxvZ2dpbmcgc2VydmljZXMjNzEuMTYuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTIuMDQuMDAjT2lsZmllbGQgcGFyYWZmaW4gY3V0dGluZyBzZXJ2aWNlIzcxLjE2LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjA1LjAwI09pbGZpZWxkIHBsYW5uaW5nIHNlcnZpY2VzIzcxLjE2LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjA2LjAwI09pbGZpZWxkIHByb2Nlc3Npbmcgc2VydmljZXMjNzEuMTYuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTIuMDcuMDAjV2VsbCB0ZXN0aW5nIHNlcnZpY2VzIzcxLjE2LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEzLjAwLjAwI09pbGZpZWxkIHByb2plY3QgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MS4xNi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMy4wMS4wMCNPaWxmaWVsZCBhdWRpdHMgb3IgaW5zcGVjdGlvbiBzZXJ2aWNlcyM3MS4xNi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMy4wMi4wMCNPaWxmaWVsZCBlbWVyZ2VuY3kgcmVzcG9uc2UgcGxhbm5pbmcgc2VydmljZXMjNzEuMTYuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTMuMDMuMDAjT2lsZmllbGQgZmllbGQgZGV2ZWxvcG1lbnQgc2VydmljZXMjNzEuMTYuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTMuMDQuMDAjT2lsZmllbGQgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xNi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMy4wNS4wMCNPaWxmaWVsZCByZXBvcnRpbmcgc2VydmljZXMjNzEuMTYuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTMuMDYuMDAjT2lsZmllbGQgc3VjY2Vzc2lvbiBwbGFuIG9yIGhhbmRvdmVyIHNlcnZpY2VzIzcxLjE2LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEzLjA3LjAwI09pbGZpZWxkIHRyYWluaW5nIG1hdHJpeCBzZXJ2aWNlcyM3MS4xNi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMy4wOC4wMCNXZWxsIHNpdGUgbG9naXN0aWNzIG9yIHByb2N1cmVtZW50IHNlcnZpY2VzIzcxLjE2LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE2LjE0LjAwLjAwI1dlbGwgY29uc3RydWN0aW9uIG1hbmFnZW1lbnQgc2VydmljZXMjNzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMDEuMDAjQ29pbGVkIHR1YmluZyBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wMi4wMCNXZWxsIGNvbXBsZXRpb24gZW5naW5lZXJpbmcgc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMDMuMDAjRGVhZG1hbiBhbmNob3Igc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMDQuMDAjV2VsbCBkcmlsbGluZyBlbmdpbmVlcmluZyBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wNS4wMCNXZWxsIHNpdGUgcGl0IGxpbmluZyBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wNi4wMCNXZWxsIHBsdWcgb3IgYWJhbmRvbm1lbnQgc2VydmljZSM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wNy4wMCNXZWxsIHB1bGxpbmcgdW5pdCBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wOC4wMCNTaG9yZWJhc2Ugc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMDkuMDAjVGVzdCBwaXQgbGluaW5nIHNlcnZpY2VzIzcxLjE2LjE0LjAwLjAwCi11bnNwc2M3IzcxLjE2LjE0LjEwLjAwI1dlbGwgc2l0ZSB2YWN1dW0gdHJ1Y2sgc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMTEuMDAjVW5kZXJiYWxhbmNlZCBhcHBsaWNhdGlvbnMgZW5naW5lZXJpbmcgc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMTIuMDAjV2VsbCB3b3Jrb3ZlciBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4xMy4wMCNXZWxsIGZhYnJpY2F0aW9uIG9yIGNvbnN0cnVjdGlvbiBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNS4wMC4wMCNXZWxsIHNpdGUgb3BlcmF0aW9ucyBzZXJ2aWNlcyM3MS4xNi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNS4wMS4wMCNXZWxsIHNpdGUgZWxlY3RyaWNhbCBvciBpbnN0cnVtZW50YXRpb24gc2VydmljZXMjNzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTUuMDIuMDAjV2VsbCBzaXRlIGhlYXZ5IGVxdWlwbWVudCBvciBjcmFuZSBzZXJ2aWNlcyM3MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNS4wMy4wMCNXZWxsIHNpdGUgaW5zcGVjdGlvbiBvciBlcXVpcG1lbnQgdGVzdGluZyBzZXJ2aWNlcyM3MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNS4wNC4wMCNXZWxsIHNpdGUgaW5zdHJ1bWVudCBhbmQgbWV0ZXIgc2VydmljZXMjNzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTUuMDUuMDAjV2VsbCBzaXRlIHZhbHZlIG9yIHZhbHZlIHBhcnQgc2VydmljZXMjNzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMDAuMDAuMDAuMDAjQnVpbGRpbmcgYW5kIENvbnN0cnVjdGlvbiBhbmQgTWFpbnRlbmFuY2UgU2VydmljZXMjNzIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMDAuMDAuMDAjQnVpbGRpbmcgY29uc3RydWN0aW9uIGFuZCBzdXBwb3J0IGFuZCBtYWludGVuYW5jZSBhbmQgcmVwYWlyIHNlcnZpY2VzIzcyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjE1LjAwLjAwI0J1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTUuMDEuMDAjSGFuZHltYW4gc2VydmljZXMjNzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTUuMDIuMDAjU2NhZmZvbGRpbmcgc2VydmljZXMjNzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTUuMDMuMDAjUmlnZ2luZyBzZXJ2aWNlcyM3Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xNS4wNC4wMCNEaXNhc3RlciBwcm9vZmluZyBvciBjb250aW5nZW5jeSBzZXJ2aWNlcyM3Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xNS4wNS4wMCNMb2Nrc21pdGggc2VydmljZXMjNzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTYuMDAuMDAjUm9vZmluZyBhbmQgc2lkaW5nIGFuZCBzaGVldCBtZXRhbCB3b3JrIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjE2LjAxLjAwI1Jvb2ZpbmcgaW5zdGFsbGF0aW9uIG9yIHJlcGFpciM3Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xNi4wMi4wMCNTa3lsaWdodCBpbnN0YWxsYXRpb24jNzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTYuMDMuMDAjR3V0dGVyIG9yIGRvd25zcG91dCBzZXJ2aWNlcyM3Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xNi4wNC4wMCNBcmNoaXRlY3R1cmFsIHNoZWV0IG1ldGFsIHdvcmsjNzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTYuMDUuMDAjQ2VpbGluZyBlcmVjdGlvbiBvciByZXBhaXIjNzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTYuMDYuMDAjQ2h1dGUgaW5zdGFsbGF0aW9uIzcyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE2LjA3LjAwI1NpZGluZyBpbnN0YWxsYXRpb24gb3IgcmVwYWlyIzcyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE3LjAwLjAwI0NvbmNyZXRlIHdvcmsjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTcuMDEuMDAjRXh0ZXJpb3IgY29uY3JldGUgb3Igc3R1Y2NvIHNlcnZpY2VzIzcyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE3LjAyLjAwI0dyb3V0aW5nIHNlcnZpY2VzIzcyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE3LjAzLjAwI1NpZGV3YWxrIG9yIGN1cmIgY29uc3RydWN0aW9uIzcyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE3LjA0LjAwI0ZvdW5kYXRpb24gb3Igc2xhYiB3b3JrIzcyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE4LjAwLjAwI0V4dGVyaW9yIGNsZWFuaW5nIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjE4LjAxLjAwI1NhbmRibGFzdGluZyM3Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xOC4wMi4wMCNIaWdoIHByZXNzdXJlIHdhdGVyIGJsYXN0aW5nIzcyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE4LjAzLjAwI1N0ZWFtIGNsZWFuaW5nIzcyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE5LjAwLjAwI0ludGVyaW9yIGZpbmlzaGluZyM3Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xOS4wMS4wMCNJbnRlcmlvciBkZXNpZ24gb3IgZGVjb3JhdGluZyM3Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xOS4wMi4wMCNQbGFzdGVyaW5nIG9yIGRyeXdhbGwjNzIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTkuMDMuMDAjRmluaXNoIGNhcnBlbnRyeSBvciBjYWJpbmV0cnkjNzIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDAuMDAjQ29hdGluZyBhbmQgY2F1bGtpbmcgYW5kIHdlYXRoZXIgYW5kIHdhdGVyIGFuZCBmaXJlcHJvb2ZpbmcjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDEuMDAjQ2F1bGtpbmcjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDIuMDAjUGxhc3RpYyBlbmNhc2VtZW50IG9yIGNvYXRpbmcgb2Ygc3RydWN0dXJhbCBtYXRlcmlhbHMjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDMuMDAjQ29hdGluZyBvciBnbGF6aW5nIG9mIG1ldGFsIG9yIHdvb2Qgb3IgY29uY3JldGUgc3RydWN0dXJhbCBtYXRlcmlhbHMjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDQuMDAjRGFtcHByb29maW5nIzcyLjEwLjIwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIwLjA1LjAwI0ZpcmVwcm9vZmluZyBvZiBidWlsZGluZ3MjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDYuMDAjV3JhcHBpbmcgb2YgcGlwZXMjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjEuMDAuMDAjUGVzdCBjb250cm9sIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIxLjAxLjAwI0JpcmQgcHJvb2Zpbmcgc2VydmljZXMjNzIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjEuMDIuMDAjVGVybWl0ZSBjb250cm9sIHNlcnZpY2VzIzcyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIxLjAzLjAwI0V4dGVybWluYXRpb24gb3IgZnVtaWdhdGlvbiBzZXJ2aWNlcyM3Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMS4wNC4wMCNTdHJ1Y3R1cmFsIHBlc3QgY29udHJvbCM3Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMS4wNS4wMCNBbmltYWwgdHJhcHBpbmcjNzIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjEuMDYuMDAjUm9kZW50IGNvbnRyb2wjNzIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjIuMDAuMDAjRWxlY3RyaWNhbCBzZXJ2aWNlcyM3Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMi4wMS4wMCNFbGVjdHJpYyBwb3dlciBzeXN0ZW1zIGluc3RhbGxhdGlvbiBvciBzZXJ2aWNlIzcyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIyLjAyLjAwI0VsZWN0cm9uaWMgY29udHJvbHMgaW5zdGFsbGF0aW9uIzcyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIyLjAzLjAwI0NvbW11bmljYXRpb24gZXF1aXBtZW50IGluc3RhbGxhdGlvbiM3Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMi4wNC4wMCNTYWZldHkgb3Igc2VjdXJpdHkgc3lzdGVtcyBpbnN0YWxsYXRpb24jNzIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjIuMDUuMDAjQ2FibGluZyBzZXJ2aWNlIzcyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIzLjAwLjAwI1BsdW1iaW5nIGFuZCBoZWF0aW5nIGFuZCBhaXIgY29uZGl0aW9uaW5nIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIzLjAxLjAwI0JvaWxlciBpbnN0YWxsYXRpb24gb3IgYWRqdXN0bWVudCBvciBtYWludGVuYW5jZSBvciByZXBhaXIgc2VydmljZXMjNzIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjMuMDIuMDAjSGVhdGluZyBzeXN0ZW1zIGluc3RhbGxhdGlvbiByZXBhaXIgb3IgbWFpbnRlbmFuY2UjNzIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjMuMDMuMDAjUGx1bWJpbmcgc3lzdGVtIGNvbnN0cnVjdGlvbiM3Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMy4wNC4wMCNQbHVtYmluZyBzeXN0ZW0gbWFpbnRlbmFuY2Ugb3IgcmVwYWlyIzcyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIzLjA1LjAwI0FpciBjb25kaXRpb25pbmcgaW5zdGFsbGF0aW9uIG9yIG1haW50ZW5hbmNlIG9yIHJlcGFpciBzZXJ2aWNlcyM3Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNC4wMC4wMCNQYWludGluZyBhbmQgcGFwZXIgaGFuZ2luZyM3Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNC4wMS4wMCNFeHRlcmlvciBwYWludGluZyBzZXJ2aWNlcyM3Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNC4wMi4wMCNJbnRlcmlvciBwYWludGluZyBzZXJ2aWNlcyM3Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNC4wMy4wMCNXYWxsY292ZXJpbmcgc2VydmljZXMjNzIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjQuMDQuMDAjSW5kdXN0cmlhbCBvciBzcGVjaWFsaXplZCBwYWludCBhcHBsaWNhdGlvbiBmb3IgYWlyY3JhZnQgb3Igc2hpcCBvciBicmlkZ2UjNzIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjQuMDUuMDAjUGF2ZW1lbnQgbWFya2luZyBzZXJ2aWNlcyM3Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNS4wMC4wMCNNYXNvbnJ5IGFuZCBzdG9uZXdvcmsgYW5kIHRpbGUgc2V0dGluZyM3Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNS4wMS4wMCNCcmlja2xheWluZyM3Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNS4wMi4wMCNDaGltbmV5IGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNS4wMy4wMCNNYXJibGUgb3Igc3RvbmUgb3IgdGlsZSBpbnN0YWxsYXRpb24jNzIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjUuMDQuMDAjUmV0YWluaW5nIHdhbGwgY29uc3RydWN0aW9uIzcyLjEwLjI1LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI1LjA1LjAwI0ZyZXNjbyB3b3JrIzcyLjEwLjI1LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI1LjA2LjAwI0Fjb3VzdGljYWwjNzIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjUuMDcuMDAjSW5zdWxhdGluZyBtYXRlcmlhbCBpbnN0YWxsYXRpb24jNzIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjUuMDguMDAjUmVzdG9yYXRpb24gb2YgbWFzb25yeSBvciBzdG9uZXdvcmsgb3IgdGlsZSM3Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNi4wMC4wMCNDYXJwZW50cnkjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjYuMDEuMDAjUm91Z2ggY2FycGVudHJ5IzcyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI2LjAyLjAwI1dpbmRvd3Mgb3IgZG9vciBvciBmaXh0dXJlIGluc3RhbGxhdGlvbiM3Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNi4wMy4wMCNGdXJuaXR1cmUgaW5zdGFsbGF0aW9uIzcyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI3LjAwLjAwI0Zsb29yaW5nIHNlcnZpY2UjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjcuMDEuMDAjRmxvb3Igc2hlYXRoaW5nIG9yIGxheWluZyBvciBpbnN0YWxsYXRpb24gb3IgZmluaXNoaW5nIzcyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI3LjAyLjAwI0Zsb29yIGNvdmVyaW5nIGluc3RhbGxhdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNy4wMy4wMCNGbG9vciBjbGVhbmluZyBzZXJ2aWNlcyM3Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yOC4wMC4wMCNSZWZ1cmJpc2hpbmcgc2VydmljZXMjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjguMDEuMDAjUmVub3ZhdGlvbiBvZiBidWlsZGluZ3Mgb3IgbGFuZG1hcmtzIG9yIG1vbnVtZW50cyM3Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yOC4wMi4wMCNSZXN0b3JhdGlvbiBvZiBidWlsZGluZ3Mgb3IgbGFuZG1hcmtzIG9yIG1vbnVtZW50cyM3Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yOS4wMC4wMCNHcm91bmRzIG1haW50ZW5hbmNlIHNlcnZpY2VzIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjI5LjAxLjAwI1Nub3cgUmVtb3ZhbCBTZXJ2aWNlcyM3Mi4xMC4yOS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yOS4wMi4wMCNMYW5kc2NhcGluZyBzZXJ2aWNlcyM3Mi4xMC4yOS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4zMC4wMC4wMCNTaXRlIHByZXBhcmF0aW9uIHNlcnZpY2VzIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjMwLjAxLjAwI0xhbmQgY2xlYXJpbmcgc2VydmljZXMjNzIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMzAuMDIuMDAjTGFuZCBsZXZlbGxpbmcgc2VydmljZXMjNzIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMzAuMDMuMDAjRGVtb2xpdGlvbiBzZXJ2aWNlcyM3Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4zMC4wNC4wMCNEaWdnaW5nIHNlcnZpY2VzIzcyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzcyLjExLjAwLjAwLjAwI0dlbmVyYWwgYnVpbGRpbmcgY29uc3RydWN0aW9uIzcyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjExLjE1LjAwLjAwI1ByaXZhdGUgaG91c2luZyM3Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMS4xNS4wMS4wMCNTaW5nbGUgZmFtaWx5IGhvdXNpbmcgY29uc3RydWN0aW9uIG9yIHJlbW9kZWxpbmcgb3IgcmVwYWlyIzcyLjExLjE1LjAwLjAwCi11bnNwc2M3IzcyLjExLjE1LjAyLjAwI1Jlc2lkZW50aWFsIG11bHRpIHRlbmFudCBjb25zdHJ1Y3Rpb24gb3IgcmVtb2RlbGluZyBvciByZXBhaXIjNzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTYuMDAuMDAjSW5kdXN0cmlhbCBwbGFudHMjNzIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTYuMDEuMDAjQ29tbWVyY2lhbCBvZmZpY2UgYnVpbGRpbmcgY29uc3RydWN0aW9uIG9yIHJlbW9kZWxpbmcgb3IgcmVub3ZhdGlvbiBvciByZXBhaXIjNzIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTYuMDIuMDAjSW5kdXN0cmlhbCBidWlsZGluZ3Mgb3Igd2FyZWhvdXNlIGNvbnN0cnVjdGlvbiBvciByZW1vZGVsaW5nIG9yIHJlbm92YXRpb24gb3IgcmVwYWlyIzcyLjExLjE2LjAwLjAwCi11bnNwc2M3IzcyLjExLjE3LjAwLjAwI1B1YmxpYyB1c2UgYnVpbGRpbmdzIzcyLjExLjAwLjAwLjAwCi11bnNwc2M3IzcyLjExLjE3LjAxLjAwI1NwZWNpYWxpemVkIHB1YmxpYyB1c2UgYnVpbGRpbmcgY29uc3RydWN0aW9uIzcyLjExLjE3LjAwLjAwCi11bnNwc2M3IzcyLjExLjE3LjAyLjAwI05vbiByZXNpZGVudGlhbCBhZ3JpY3VsdHVyYWwgYnVpbGRpbmcgY29uc3RydWN0aW9uIzcyLjExLjE3LjAwLjAwCi11bnNwc2M3IzcyLjExLjE3LjAzLjAwI1NlcnZpY2Ugc3RhdGlvbiBvciBzZXJ2aWNlIGdhcmFnZSBjb25zdHJ1Y3Rpb24jNzIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTcuMDQuMDAjQ29tbWVyY2lhbCBidWlsZGluZyBjb25zdHJ1Y3Rpb24gb3IgZXJlY3Rpb24gb3IgcmVub3ZhdGlvbiBvciByZXBhaXIjNzIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTguMDAuMDAjQ29tbWVyY2lhbCBidWlsZGluZ3MjNzIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTguMDEuMDAjUmVzdGF1cmFudCBjb25zdHJ1Y3Rpb24gb3IgcmVub3ZhdGlvbiBvciByZXBhaXIgb3IgbWFpbnRlbmFuY2UjNzIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTguMDIuMDAjU2hvcHBpbmcgY2VudGVyIG9yIHN0b3JlIGNvbnN0cnVjdGlvbiBvciByZW5vdmF0aW9uIG9yIHJlcGFpciBvciBtYWludGVuYW5jZSM3Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM3Mi4xMS4xOC4wMy4wMCNPZmZpY2UgYnVpbGRpbmcgY29uc3RydWN0aW9uIG9yIHJlbm92YXRpb24gb3IgcmVwYWlyIG9yIG1haW50ZW5hbmNlIzcyLjExLjE4LjAwLjAwCi11bnNwc2M3IzcyLjExLjE4LjA0LjAwI0JhdGhyb29tIHJlbm92YXRpb24jNzIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTkuMDAuMDAjTGFuZCBhbmQgYnVpbGRpbmcgc2l0ZSBwcmVwYXJhdGlvbiM3Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMS4xOS4wMS4wMCNMYW5kIGNsZWFyaW5nIzcyLjExLjE5LjAwLjAwCi11bnNwc2M3IzcyLjExLjE5LjAyLjAwI0xhbmQgbGV2ZWxpbmcjNzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTkuMDMuMDAjQnVpbGRpbmcgZGVtb2xpdGlvbiM3Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM3Mi4xMi4wMC4wMC4wMCNJbmZyYXN0cnVjdHVyZSBjb25zdHJ1Y3Rpb24gYW5kIG1haW50ZW5hbmNlIzcyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjE1LjAwLjAwI0hpZ2h3YXlzIGFuZCBzdHJlZXRzIzcyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjE1LjAxLjAwI0hpZ2h3YXkgb3Igc3RyZWV0IG9yIHJvYWQgY29uc3RydWN0aW9uIzcyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE1LjAyLjAwI0hpZ2h3YXkgb3Igc3RyZWV0IG9yIHJvYWQgc3VyZmFjaW5nIG9yIHBhdmluZyBvciBtYWludGVuYW5jZSM3Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNS4wMy4wMCNIaWdod2F5IG9yIHN0cmVldCBndWFyZHJhaWwgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE1LjA0LjAwI0hpZ2h3YXkgb3Igc3RyZWV0IHNpZ24gb3IgdHJhZmZpYyBzaWduYWwgaW5zdGFsbGF0aW9uIzcyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE2LjAwLjAwI1dhdGVyIGFuZCBzZXdlciBhbmQgdXRpbGl0eSBsaW5lcyM3Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNi4wMS4wMCNFbGVjdHJpYyBwb3dlciBsaW5lIGNvbnN0cnVjdGlvbiBvciBpbnN0YWxsYXRpb24jNzIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMTYuMDIuMDAjQ2FibGUgbGF5aW5nIzcyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE2LjAzLjAwI0FxdWVkdWN0IGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNi4wNC4wMCNTZXdlciBsaW5lIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNi4wNS4wMCNXYXRlciBtYWluIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNi4wNi4wMCNWb2ljZSBvciBkYXRhIGxpbmUgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE2LjA3LjAwI1dhdGVyIGluZHVzdHJpYWwgcGxhbnQgY29uc3RydWN0aW9uIzcyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE3LjAwLjAwI0RhbXMgYW5kIG1hcmluZSBjb25zdHJ1Y3Rpb24jNzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMTcuMDEuMDAjRGFtIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNy4wMi4wMCNQaWVyIG9yIGRvY2sgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE3LjAzLjAwI0hhcmJvciBvciBicmVha3dhdGVyIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNy4wNC4wMCNEeWtlIG9yIGxldmVlIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNy4wNS4wMCNEcmVkZ2luZyBvciBjYWlzc29uIGRyaWxsaW5nIzcyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE3LjA2LjAwI0NhbmFsIG9yIGRyYWluYWdlIG9yIGlycmlnYXRpb24gc3lzdGVtIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNy4wNy4wMCNQb25kIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xOC4wMC4wMCNSYWlscm9hZHMgYW5kIHN1YndheXMgYW5kIHRyYW13YXlzIzcyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjE4LjAxLjAwI0N1dHRpbmcgb2YgcmlnaHQgb2Ygd2F5IzcyLjEyLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE4LjAyLjAwI1JhaWxyb2FkIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xOC4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xOC4wMy4wMCNTdWJ3YXkgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE4LjA0LjAwI1RyYW0gY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE5LjAwLjAwI0FpcnBvcnRzIGFuZCBhdmlhdGlvbiM3Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xOS4wMS4wMCNBaXJwb3J0IHJ1bndheSBjb25zdHJ1Y3Rpb24jNzIuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMTkuMDIuMDAjQWlycG9ydCB0ZXJtaW5hbCBjb25zdHJ1Y3Rpb24jNzIuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMTkuMDMuMDAjSGVsaXBhZCBjb25zdHJ1Y3Rpb24jNzIuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjAuMDAuMDAjQnJpZGdlcyBhbmQgdHVubmVscyBhbmQgdmlhZHVjdHMjNzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjAuMDEuMDAjQnJpZGdlIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4yMC4wMC4wMAotdW5zcHNjNyM3Mi4xMi4yMC4wMi4wMCNUdW5uZWwgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjIwLjAzLjAwI1ZpYWR1Y3QgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjIxLjAwLjAwI0NvbnN0cnVjdGlvbiBxdWFudGl0eSBzdXJ2ZXlvcnMjNzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjEuMDEuMDAjV2F0ZXIgb3Igd2FzdGV3YXRlciBxdWFudGl0eSBzdXJ2ZXlvcnMjNzIuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjIuMDAuMDAjQ29uc3RydWN0aW9uIGNvbnN1bHRhbmN5IHNlcnZpY2VzIzcyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjIyLjAxLjAwI1NpdGUgc3VwZXJ2aXNpb24jNzIuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjIuMDIuMDAjSW5kdXN0cmlhbCBwbGFudCBkZXNpZ24jNzIuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNzMuMDAuMDAuMDAuMDAjSW5kdXN0cmlhbCBQcm9kdWN0aW9uIGFuZCBNYW51ZmFjdHVyaW5nIFNlcnZpY2VzIzczLjAwLjAwLjAwLjAwCi11bnNwc2M3IzczLjEwLjAwLjAwLjAwI1BsYXN0aWMgYW5kIGNoZW1pY2FsIGluZHVzdHJpZXMjNzMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTUuMDAuMDAjUGV0cm9jaGVtaWNhbCBhbmQgcGxhc3RpYyBwcm9kdWN0aW9uIzczLjEwLjAwLjAwLjAwCi11bnNwc2M3IzczLjEwLjE1LjAxLjAwI1BldHJvbGV1bSByZWZpbmluZyBzZXJ2aWNlcyM3My4xMC4xNS4wMC4wMAotdW5zcHNjNyM3My4xMC4xNS4wMi4wMCNOYXR1cmFsIGdhcyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE1LjAwLjAwCi11bnNwc2M3IzczLjEwLjE1LjAzLjAwI09pbHMgb3IgZ3JlYXNlcyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE1LjAwLjAwCi11bnNwc2M3IzczLjEwLjE1LjA0LjAwI0NvYWwgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNS4wMC4wMAotdW5zcHNjNyM3My4xMC4xNS4wNS4wMCNQbGFzdGljcyBvciByZXNpbnMgb3IgZmliZXJzIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTUuMDYuMDAjQ3JlZGl0IGNhcmQgcHJvZHVjdGlvbiBvciBlbWJvc3Npbmcgc2VydmljZXMjNzMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMDAuMDAjQ2hlbWljYWxzIGFuZCBmZXJ0aWxpemVycyBwcm9kdWN0aW9uIzczLjEwLjAwLjAwLjAwCi11bnNwc2M3IzczLjEwLjE2LjAxLjAwI0lub3JnYW5pYyBjaGVtaWNhbHMgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wMi4wMCNTb2RhIGFzaCBvciBjaGxvcmluZSBvciBjYXVzdGljIHNvZGEgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wMy4wMCNJbm9yZ2FuaWMgYWNpZHMgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wNC4wMCNPcmdhbmljIGNoZW1pY2FsIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMDUuMDAjQWNldHlsZW5lIG9yIGRlcml2YXRpdmVzIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMDYuMDAjRXRoeWxlbmUgb3IgZGVyaXZhdGl2ZXMgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wNy4wMCNFdGhhbm9sIG9yIG1ldGhhbm9sIG9yIGRlcml2YXRpdmVzIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMDguMDAjRmVydGlsaXplcnMgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wOS4wMCNQb3Rhc2ggbWluaW5nIG9yIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMTAuMDAjUGVzdGljaWRlIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMTEuMDAjUGFpbnRzIG9yIHZhcm5pc2hlcyBvciBsYWNxdWVycyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE2LjAwLjAwCi11bnNwc2M3IzczLjEwLjE2LjEyLjAwI1NvYXAgb3IgY2xlYW5pbmcgcHJlcGFyYXRpb25zIG9yIHBlcmZ1bWVzIG9yIGNvc21ldGljcyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE2LjAwLjAwCi11bnNwc2M3IzczLjEwLjE2LjEzLjAwI1NvbHZlbnRzIG9yIGdseWNvbHMgb3IgZGV0ZXJnZW50cyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE2LjAwLjAwCi11bnNwc2M3IzczLjEwLjE2LjE0LjAwI0Zlcm1lbnRzIG9yIGVuenltZXMgc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTcuMDAuMDAjUGhhcm1hY2V1dGljYWwgcHJvZHVjdGlvbiM3My4xMC4wMC4wMC4wMAotdW5zcHNjNyM3My4xMC4xNy4wMS4wMCNEcnVncyBvciBtZWRpY2luZSBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE3LjAwLjAwCi11bnNwc2M3IzczLjEwLjE3LjAyLjAwI1ZhY2NpbmVzIG9yIHNlcmEgb3IgYW50aWJpb3RpY3MgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNy4wMC4wMAotdW5zcHNjNyM3My4xMC4xNy4wMy4wMCNQYXJhcGhhcm1hY2V1dGljYWwgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNy4wMC4wMAotdW5zcHNjNyM3My4xMC4xOC4wMC4wMCNCaW9jaGVtaWNhbCBhbmQgYmlvdGVjaG5vbG9neSBwcm9kdWN0aW9uIzczLjEwLjAwLjAwLjAwCi11bnNwc2M3IzczLjEwLjE4LjAxLjAwI0Jpb21hc3MgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xOC4wMC4wMAotdW5zcHNjNyM3My4xMC4xOC4wMi4wMCNCaW9wcm90ZWluIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTkuMDAuMDAjUnViYmVyIHByb2R1Y3Rpb24jNzMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTkuMDEuMDAjUnViYmVyIG1pbGxpbmcgc2VydmljZXMjNzMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTkuMDIuMDAjUnViYmVyIHRpcmVzIG9yIHR1YmVzIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTkuMDMuMDAjUnViYmVyIG9yIHBsYXN0aWMgZm9vdHdlYXIgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xOS4wMC4wMAotdW5zcHNjNyM3My4xMS4wMC4wMC4wMCNXb29kIGFuZCBwYXBlciBpbmR1c3RyaWVzIzczLjAwLjAwLjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjAwLjAwI1dvb2QgcHJvY2Vzc2luZyM3My4xMS4wMC4wMC4wMAotdW5zcHNjNyM3My4xMS4xNS4wMS4wMCNTYXdtaWxsaW5nIHNlcnZpY2VzIzczLjExLjE1LjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjAyLjAwI1ZlbmVlciBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjExLjE1LjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjAzLjAwI1dvb2QgYmFzZSBwYW5lbHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xMS4xNS4wMC4wMAotdW5zcHNjNyM3My4xMS4xNS4wNC4wMCNXb29kZW4gY29udGFpbmVycyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjExLjE1LjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjA1LjAwI0Z1cm5pdHVyZSBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjExLjE1LjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjA2LjAwI0NvcmsgcHJvZHVjdHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xMS4xNS4wMC4wMAotdW5zcHNjNyM3My4xMS4xNS4wNy4wMCNDYW5lIG9yIHdpY2tlcndhcmUgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMS4xNS4wMC4wMAotdW5zcHNjNyM3My4xMS4xNi4wMC4wMCNQdWxwIGFuZCBwYXBlciBwcm9jZXNzaW5nIzczLjExLjAwLjAwLjAwCi11bnNwc2M3IzczLjExLjE2LjAxLjAwI1B1bHAgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMS4xNi4wMC4wMAotdW5zcHNjNyM3My4xMS4xNi4wMi4wMCNQYXBlciBvciBwYXBlciBib2FyZCBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjExLjE2LjAwLjAwCi11bnNwc2M3IzczLjExLjE2LjAzLjAwI0hhcmRib2FyZCBvciBmaWJlcmJvYXJkIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTEuMTYuMDQuMDAjUGFwZXIgcHJvZHVjdGlvbiBvciByZWN5Y2xpbmcgc2VydmljZXMjNzMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMDAuMDAuMDAjTWV0YWwgYW5kIG1pbmVyYWwgaW5kdXN0cmllcyM3My4wMC4wMC4wMC4wMAotdW5zcHNjNyM3My4xMi4xNS4wMC4wMCNNZXRhbCBzbWVsdGluZyBhbmQgcmVmaW5pbmcgYW5kIGZvcm1pbmcgcHJvY2Vzc2VzIzczLjEyLjAwLjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjAxLjAwI0ZlcnJvdXMgYWxsb3kgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMi4xNS4wMC4wMAotdW5zcHNjNyM3My4xMi4xNS4wMi4wMCNCYXNpYyBtZXRhbCBjb21iaW5hdGlvbiBwcm9jZXNzZXMgc2VydmljZXMjNzMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTUuMDMuMDAjUmVmcmFjdG9ycyBzZXJ2aWNlcyBmb3IgaXJvbiBvciBzdGVlbCBwcm9kdWN0aW9uIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA0LjAwI0lyb24gb3Igc3RlZWwgbWFraW5nIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA1LjAwI0lyb24gb3Igc3RlZWwgZm9yZ2luZyBzZXJ2aWNlcyM3My4xMi4xNS4wMC4wMAotdW5zcHNjNyM3My4xMi4xNS4wNi4wMCNQcmUgZmluaXNoaW5nIGlyb24gb3Igc3RlZWwgcHJvY2Vzc2VzIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA3LjAwI0ZpbmlzaGluZyBtZXRhbCBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA4LjAwI1NtZWx0aW5nIG1ldGFsIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA5LjAwI1JlZmluaW5nIG1ldGFsIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjAwLjAwI01ldGFsIGZpbmlzaGluZyM3My4xMi4wMC4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wMS4wMCNNZXRhbCBjdXR0aW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjAyLjAwI0JsYWNrc21pdGggc2VydmljZXMjNzMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTYuMDMuMDAjTWV0YWwgaGVhdGluZyBzZXJ2aWNlcyM3My4xMi4xNi4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wNC4wMCNNZXRhbCBwbGF0aW5nIG9yIHJlcGxhdGluZyBzZXJ2aWNlcyM3My4xMi4xNi4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wNS4wMCNNZXRhbCByb2xsaW5nIG9wZXJhdGlvbnMjNzMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTYuMDYuMDAjTWV0YWwgZm9yZ2luZyBzZXJ2aWNlcyM3My4xMi4xNi4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wNy4wMCNNZXRhbCBkcmF3aW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjA4LjAwI01ldGFsIGV4dHJ1ZGluZyBzZXJ2aWNlcyM3My4xMi4xNi4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wOS4wMCNTdXJmYWNlIG1ldGFsIGZpbmlzaGluZyBvciB0cmVhdG1lbnQgc2VydmljZXMjNzMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTYuMTAuMDAjSG9yc2VzaG9laW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjExLjAwI1RpbnNtaXRoaW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjEyLjAwI1JlYmFiYml0aW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjEzLjAwI01ldGFsIGNhc3Rpbmcgc2VydmljZXMjNzMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTcuMDAuMDAjV2VsZGluZyBhbmQgYnJhemluZyBhbmQgc29sZGVyaW5nIzczLjEyLjAwLjAwLjAwCi11bnNwc2M3IzczLjEyLjE3LjAxLjAwI1dlbGRpbmcgc2VydmljZXMjNzMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTcuMDIuMDAjQnJhemluZyBzZXJ2aWNlcyM3My4xMi4xNy4wMC4wMAotdW5zcHNjNyM3My4xMi4xNy4wMy4wMCNTb2xkZXJpbmcgc2VydmljZXMjNzMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTcuMDQuMDAjQ2FzdGluZyBzZXJ2aWNlcyM3My4xMi4xNy4wMC4wMAotdW5zcHNjNyM3My4xMi4xOC4wMC4wMCNOb24gbWV0YWxsaWMgbWluZXJhbCBwcm9kdWN0cyBpbmR1c3RyeSBzZXJ2aWNlcyM3My4xMi4wMC4wMC4wMAotdW5zcHNjNyM3My4xMi4xOC4wMS4wMCNQb3R0ZXJ5IG9yIGNoaW5hIG9yIGVhcnRoZW53YXJlIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTguMDIuMDAjR2xhc3Mgb3IgZ2xhc3MgcHJvZHVjdHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xMi4xOC4wMC4wMAotdW5zcHNjNyM3My4xMi4xOC4wMy4wMCNTdHJ1Y3R1cmFsIGNsYXkgcHJvZHVjdHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xMi4xOC4wMC4wMAotdW5zcHNjNyM3My4xMi4xOC4wNC4wMCNDZW1lbnQgb3IgbGltZSBvciBwbGFzdGVyIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTguMDUuMDAjQ29uY3JldGUgb3IgYWdncmVnYXRlcyBvciBzdG9uZSBwcm9kdWN0cyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjEyLjE4LjAwLjAwCi11bnNwc2M3IzczLjEyLjE4LjA2LjAwI0FicmFzaXZlcyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjEyLjE4LjAwLjAwCi11bnNwc2M3IzczLjEyLjE4LjA3LjAwI0FzYmVzdG9zIHByb2R1Y3RzIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTMuMDAuMDAuMDAjRm9vZCBhbmQgYmV2ZXJhZ2UgaW5kdXN0cmllcyM3My4wMC4wMC4wMC4wMAotdW5zcHNjNyM3My4xMy4xNS4wMC4wMCNCZXZlcmFnZSBwcm9jZXNzaW5nIzczLjEzLjAwLjAwLjAwCi11bnNwc2M3IzczLjEzLjE1LjAxLjAwI1NwaXJpdHMgZGlzdGlsbGluZyBvciBibGVuZGluZyBzZXJ2aWNlcyM3My4xMy4xNS4wMC4wMAotdW5zcHNjNyM3My4xMy4xNS4wMi4wMCNXaW5lIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTUuMDMuMDAjQnJld2VyeSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE1LjAwLjAwCi11bnNwc2M3IzczLjEzLjE1LjA0LjAwI05vbiBhbGNvaG9saWMgZnJ1aXQgYmFzZWQgYmV2ZXJhZ2UgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xNS4wMC4wMAotdW5zcHNjNyM3My4xMy4xNS4wNS4wMCNXYXRlciBiZXZlcmFnZXMgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xNS4wMC4wMAotdW5zcHNjNyM3My4xMy4xNS4wNi4wMCNJbmZ1c2VkIGJldmVyYWdlcyBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE1LjAwLjAwCi11bnNwc2M3IzczLjEzLjE1LjA3LjAwI0NvZmZlZSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE1LjAwLjAwCi11bnNwc2M3IzczLjEzLjE1LjA4LjAwI1RlYSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE1LjAwLjAwCi11bnNwc2M3IzczLjEzLjE2LjAwLjAwI01lYXQgYW5kIHBvdWx0cnkgYW5kIHNlYWZvb2QgcHJvY2Vzc2luZyM3My4xMy4wMC4wMC4wMAotdW5zcHNjNyM3My4xMy4xNi4wMS4wMCNNZWF0IHByb2R1Y3RzIG9yIGJ5IHByb2R1Y3RzIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTYuMDIuMDAjRmlzaCBvciBmaXNoIHByb2R1Y3RzIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTYuMDMuMDAjUG91bHRyeSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE2LjAwLjAwCi11bnNwc2M3IzczLjEzLjE2LjA0LjAwI01lYXQgaHlnaWVuZSBvciBpbnNwZWN0aW9uIHNlcnZpY2VzIzczLjEzLjE2LjAwLjAwCi11bnNwc2M3IzczLjEzLjE2LjA1LjAwI01lYXQgcGxhbnQgb3BlcmF0aW9uIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTYuMDYuMDAjU2xhdWdodGVyIGhvdXNlcyBzZXJ2aWNlcyM3My4xMy4xNi4wMC4wMAotdW5zcHNjNyM3My4xMy4xNi4wNy4wMCNCdXRjaGVyIHNlcnZpY2VzIzczLjEzLjE2LjAwLjAwCi11bnNwc2M3IzczLjEzLjE2LjA4LjAwI0NvbGQgc3RvcmFnZSBzZXJ2aWNlcyM3My4xMy4xNi4wMC4wMAotdW5zcHNjNyM3My4xMy4xNy4wMC4wMCNGcnVpdHMgYW5kIHZlZ2V0YWJsZXMgcHJvY2Vzc2luZyM3My4xMy4wMC4wMC4wMAotdW5zcHNjNyM3My4xMy4xNy4wMS4wMCNGcnVpdCBvciB2ZWdldGFibGUgY2xlYW5pbmcgc2VydmljZXMjNzMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTcuMDIuMDAjRnJ1aXQgb3IgdmVnZXRhYmxlIHNwcmF5aW5nIHNlcnZpY2VzIzczLjEzLjE3LjAwLjAwCi11bnNwc2M3IzczLjEzLjE3LjAzLjAwI0ZydWl0IG9yIHZlZ2V0YWJsZSBwYWNraW5nIHNlcnZpY2VzIzczLjEzLjE3LjAwLjAwCi11bnNwc2M3IzczLjEzLjE4LjAwLjAwI0RhaXJ5IGFuZCBlZ2dzIHByb2Nlc3NpbmcjNzMuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTguMDEuMDAjTWlsayBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE4LjAwLjAwCi11bnNwc2M3IzczLjEzLjE4LjAyLjAwI0VnZyBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE4LjAwLjAwCi11bnNwc2M3IzczLjEzLjE4LjAzLjAwI0NoZWVzZSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE4LjAwLjAwCi11bnNwc2M3IzczLjEzLjE4LjA0LjAwI0J1dHRlciBvciBjcmVhbSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE4LjAwLjAwCi11bnNwc2M3IzczLjEzLjE5LjAwLjAwI0dyYWlucyBhbmQgc3VnYXIgYW5kIG9pbHMgYW5kIGZhdCBwcm9jZXNzaW5nIzczLjEzLjAwLjAwLjAwCi11bnNwc2M3IzczLjEzLjE5LjAxLjAwI01pbGxpbmcgc2VydmljZXMjNzMuMTMuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTkuMDIuMDAjQ2VyZWFsIHByb2R1Y3RzIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTkuMDMuMDAjU3VnYXIgb3Igc3VnYXIgcHJvZHVjdHMgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xOS4wMC4wMAotdW5zcHNjNyM3My4xMy4xOS4wNC4wMCNWZWdldGFibGUgb2lscyBvciBmYXRzIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTkuMDUuMDAjU3BpY2UgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xOS4wMC4wMAotdW5zcHNjNyM3My4xMy4xOS4wNi4wMCNCYWtlcnkgcHJvZHVjdHMgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xOS4wMC4wMAotdW5zcHNjNyM3My4xNC4wMC4wMC4wMCNGaWJlcnMgYW5kIHRleHRpbGVzIGFuZCBmYWJyaWMgaW5kdXN0cmllcyM3My4wMC4wMC4wMC4wMAotdW5zcHNjNyM3My4xNC4xNS4wMC4wMCNGaWJlciBwcm9kdWN0aW9uIzczLjE0LjAwLjAwLjAwCi11bnNwc2M3IzczLjE0LjE1LjAxLjAwI1JheW9uIG9yIGFjZXRhdGUgZmliZXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNS4wMC4wMAotdW5zcHNjNyM3My4xNC4xNS4wMi4wMCNHbGFzcyBmaWJlciBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE0LjE1LjAwLjAwCi11bnNwc2M3IzczLjE0LjE1LjAzLjAwI1NpbGsgZmliZXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNS4wMC4wMAotdW5zcHNjNyM3My4xNC4xNS4wNC4wMCNDb3R0b24gZmliZXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNS4wMC4wMAotdW5zcHNjNyM3My4xNC4xNS4wNS4wMCNXb29sIGZpYmVyIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTUuMDYuMDAjUG9seWVzdGVyIGZpYmVyIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTUuMDcuMDAjUG9seWFtaWRlIGZpYmVyIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTUuMDguMDAjQWNyeWxpYyBmaWJlciBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE0LjE1LjAwLjAwCi11bnNwc2M3IzczLjE0LjE2LjAwLjAwI1RocmVhZCBhbmQgeWFybiBwcm9jZXNzaW5nIzczLjE0LjAwLjAwLjAwCi11bnNwc2M3IzczLjE0LjE2LjAxLjAwI1RocmVhZCBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjE0LjE2LjAwLjAwCi11bnNwc2M3IzczLjE0LjE2LjAyLjAwI1lhcm4gcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xNC4xNi4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wMC4wMCNGYWJyaWNzIGFuZCBsZWF0aGVyIHByb2R1Y3Rpb24jNzMuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMDEuMDAjQnJvYWQgd292ZW4gZmFicmljcyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE0LjE3LjAwLjAwCi11bnNwc2M3IzczLjE0LjE3LjAyLjAwI05hcnJvdyB3b3ZlbiBmYWJyaWNzIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMDMuMDAjS25pdHdlYXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wNC4wMCNDYXJwZXQgb3IgcnVnIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMDUuMDAjQ29yZGFnZSBvciByb3BlIG9yIHR3aW5lIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMDYuMDAjRHllaW5nIG9yIHByaW50aW5nIG9yIGZpbmlzaGluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wNy4wMCNXb3ZlbiBzdWl0cyBvciBjb2F0cyBvciBvdmVyY29hdHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wOC4wMCNXb3ZlbiBvdXRlcndlYXIgY2xvdGhpbmcgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wOS4wMCNGdXIgZHJlc3Npbmcgb3IgZHllaW5nIHNlcnZpY2VzIzczLjE0LjE3LjAwLjAwCi11bnNwc2M3IzczLjE0LjE3LjEwLjAwI0xlYXRoZXIgZm9vdHdlYXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4xMS4wMCNMZWF0aGVyIGx1Z2dhZ2Ugb3IgaGFuZGJhZ3MgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4xMi4wMCNMZWF0aGVyIHRhbm5pbmcgb3IgZmluaXNoaW5nIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMTMuMDAjTm9ud292ZW4gZmFicmljIHNlcnZpY2VzIzczLjE0LjE3LjAwLjAwCi11bnNwc2M3IzczLjE0LjE3LjE0LjAwI0JyYWlkZWQgeWFybiBvciBmYWJyaWMgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMTUuMDAjSW5kdXN0cmlhbCBzZXdpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMDAuMDAuMDAjTWFudWZhY3R1cmluZyBzdXBwb3J0IHNlcnZpY2VzIzczLjAwLjAwLjAwLjAwCi11bnNwc2M3IzczLjE1LjE1LjAwLjAwI0Fzc2VtYmx5IHNlcnZpY2VzIzczLjE1LjAwLjAwLjAwCi11bnNwc2M3IzczLjE1LjE1LjAxLjAwI0Fzc2VtYmx5IGxpbmUgd29yayM3My4xNS4xNS4wMC4wMAotdW5zcHNjNyM3My4xNS4xNS4wMi4wMCNKb2ludCBzZWFsaW5nIHNlcnZpY2VzIzczLjE1LjE1LjAwLjAwCi11bnNwc2M3IzczLjE1LjE2LjAwLjAwI1BhY2thZ2luZyBzZXJ2aWNlcyM3My4xNS4wMC4wMC4wMAotdW5zcHNjNyM3My4xNS4xNi4wMS4wMCNDYW5uaW5nIHBsYW50cyBzZXJ2aWNlcyM3My4xNS4xNi4wMC4wMAotdW5zcHNjNyM3My4xNS4xNi4wMi4wMCNQYWNrYWdpbmcgb2YgYWdyaWN1bHR1cmFsIGJ5IHByb2R1Y3RzIHNlcnZpY2VzIzczLjE1LjE2LjAwLjAwCi11bnNwc2M3IzczLjE1LjE2LjAzLjAwI1BhY2thZ2luZyBvZiBub24gZm9vZCBwcm9kdWN0cyBzZXJ2aWNlcyM3My4xNS4xNi4wMC4wMAotdW5zcHNjNyM3My4xNS4xNi4wNC4wMCNQYWNrYWdpbmcgb2YgcGhhcm1hY2V1dGljYWxzIHNlcnZpY2VzIzczLjE1LjE2LjAwLjAwCi11bnNwc2M3IzczLjE1LjE2LjA1LjAwI1BvaW50IG9mIHB1cmNoYXNlIGRpc3BsYXkgcGFja2FnaW5nIHNlcnZpY2VzIzczLjE1LjE2LjAwLjAwCi11bnNwc2M3IzczLjE1LjE2LjA2LjAwI01hbnVhbCBoYW5kIHBhY2thZ2luZyBzZXJ2aWNlcyM3My4xNS4xNi4wMC4wMAotdW5zcHNjNyM3My4xNS4xNi4wNy4wMCNNYWNoaW5lIGFzc2lzdGVkIHBhY2thZ2luZyBzZXJ2aWNlcyM3My4xNS4xNi4wMC4wMAotdW5zcHNjNyM3My4xNS4xNy4wMC4wMCNNYXRlcmlhbCB0cmVhdG1lbnQjNzMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMTcuMDEuMDAjV2F0ZXIgcHJvb2ZpbmcgbWF0ZXJpYWwgdHJlYXRtZW50IHNlcnZpY2VzIzczLjE1LjE3LjAwLjAwCi11bnNwc2M3IzczLjE1LjE3LjAyLjAwI0ZpcmUgcHJvdGVjdGlvbiBtYXRlcmlhbCB0cmVhdG1lbnQgc2VydmljZXMjNzMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMTcuMDMuMDAjQW50aWNvcnJvc2lvbiBtYXRlcmlhbCB0cmVhdG1lbnQgc2VydmljZXMjNzMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMTguMDAuMDAjQ29udmVydGluZyBzZXJ2aWNlcyM3My4xNS4wMC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOC4wMS4wMCNTaGVldGluZyBzZXJ2aWNlcyM3My4xNS4xOC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOC4wMi4wMCNTbGl0dGluZyBzZXJ2aWNlcyM3My4xNS4xOC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOC4wMy4wMCNEaWUgY3V0dGluZyBzZXJ2aWNlcyM3My4xNS4xOC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOC4wNC4wMCNGb2xkaW5nIHNlcnZpY2VzIzczLjE1LjE4LjAwLjAwCi11bnNwc2M3IzczLjE1LjE4LjA1LjAwI0xhbWluYXRpbmcgc2VydmljZXMjNzMuMTUuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTUuMTkuMDAuMDAjSW5kdXN0cmlhbCBwcmludGluZyBzZXJ2aWNlcyM3My4xNS4wMC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOS4wMS4wMCNGbGV4b2dyYXBoaWMgaW5kdXN0cmlhbCBwcmludGluZyBzZXJ2aWNlcyM3My4xNS4xOS4wMC4wMAotdW5zcHNjNyM3My4xNS4xOS4wMi4wMCNSb3RvZ3JhdnVyZSBpbmR1c3RyaWFsIHByaW50aW5nIHNlcnZpY2VzIzczLjE1LjE5LjAwLjAwCi11bnNwc2M3IzczLjE1LjE5LjAzLjAwI1NjcmVlbiBpbmR1c3RyaWFsIHByaW50aW5nIHNlcnZpY2VzIzczLjE1LjE5LjAwLjAwCi11bnNwc2M3IzczLjE1LjE5LjA0LjAwI09mZnNldCBpbmR1c3RyaWFsIHByaW50aW5nIHNlcnZpY2VzIzczLjE1LjE5LjAwLjAwCi11bnNwc2M3IzczLjE1LjE5LjA1LjAwI0RpZ2l0YWwgaW5kdXN0cmlhbCBwcmludGluZyBzZXJ2aWNlcyM3My4xNS4xOS4wMC4wMAotdW5zcHNjNyM3My4xNS4xOS4wNi4wMCNUaGVybWFsIHRyYW5zZmVyIGluZHVzdHJpYWwgcHJpbnRpbmcgc2VydmljZXMjNzMuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMjAuMDAuMDAjRmlsbGluZyBTZXJ2aWNlcyM3My4xNS4wMC4wMC4wMAotdW5zcHNjNyM3My4xNS4yMC4wMS4wMCNMaXF1aWQgZmlsbGluZyBzZXJ2aWNlcyM3My4xNS4yMC4wMC4wMAotdW5zcHNjNyM3My4xNS4yMC4wMi4wMCNBZXJvc29sIGZpbGxpbmcgc2VydmljZXMjNzMuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMjAuMDMuMDAjUGFzdGUgZmlsbGluZyBzZXJ2aWNlcyM3My4xNS4yMC4wMC4wMAotdW5zcHNjNyM3My4xNS4yMC4wNC4wMCNQb3dkZXIgZmlsbGluZyBzZXJ2aWNlcyM3My4xNS4yMC4wMC4wMAotdW5zcHNjNyM3My4xNS4yMS4wMC4wMCNNYW51ZmFjdHVyaW5nIGVxdWlwbWVudCBtYWludGVuYW5jZSBhbmQgcmVwYWlyIHNlcnZpY2VzIzczLjE1LjAwLjAwLjAwCi11bnNwc2M3IzczLjE1LjIxLjAxLjAwI01hbnVmYWN0dXJpbmcgZXF1aXBtZW50IG1haW50ZW5hbmNlIHNlcnZpY2VzIzczLjE1LjIxLjAwLjAwCi11bnNwc2M3IzczLjE1LjIxLjAyLjAwI01hbnVmYWN0dXJpbmcgZXF1aXBtZW50IHJlcGFpciBzZXJ2aWNlcyM3My4xNS4yMS4wMC4wMAotdW5zcHNjNyM3My4xNi4wMC4wMC4wMCNNYWNoaW5lcnkgYW5kIHRyYW5zcG9ydCBlcXVpcG1lbnQgbWFudWZhY3R1cmUjNzMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMDAuMDAjTWFudWZhY3R1cmUgb2YgbWFjaGluZXJ5IzczLjE2LjAwLjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjAxLjAwI0VuZ2luZSBvciB0dXJiaW5lIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMDIuMDAjQWdyaWN1bHR1cmFsIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNi4xNS4wMC4wMAotdW5zcHNjNyM3My4xNi4xNS4wMy4wMCNNYWNoaW5lIHRvb2xzIG9yIG1ldGFsIG9yIHdvb2Qgd29ya2luZyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjA0LjAwI1NwZWNpYWwgaW5kdXN0cmlhbCBwbGFudHMgb3IgbWFjaGluZXJ5IG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMDUuMDAjQ29uc3RydWN0aW9uIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNi4xNS4wMC4wMAotdW5zcHNjNyM3My4xNi4xNS4wNi4wMCNNaW5pbmcgbWFjaGluZXJ5IG9yIGVxdWlwbWVudCBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjA3LjAwI0Zvb2QgcHJvZHVjdHMgbWFjaGluZXJ5IG9yIGVxdWlwbWVudCBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjA4LjAwI1BhcGVyIHByaW50aW5nIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMDkuMDAjTWV0YWxsdXJnaWNhbCBtYWNoaW5lcnkgb3IgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjEwLjAwI0NoZW1pY2FsIG9yIHBoYXJtYWNldXRpY2FsIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTEuMDAjQ2VtZW50IHBsYW50IG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTIuMDAjVGV4dGlsZSBtYWNoaW5lcnkgb3IgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjEzLjAwI1Bvd2VyIHBsYW50IGJvaWxlcnMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTQuMDAjRnVybmFjZXMgb3Igb3ZlbnMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTUuMDAjT2ZmaWNlIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTYuMDAjTGlmdGluZyBvciBob2lzdGluZyBvciBjb252ZXlpbmcgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjE3LjAwI0FpciBjb25kaXRpb25pbmcgb3IgdmVudGlsYXRpbmcgb3IgcmVmcmlnZXJhdGlvbiBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTguMDAjRG9tZXN0aWMgYXBwbGlhbmNlcyBvciBtYWNoaW5lcyBleGNlcHQgZWxlY3RyaWNhbCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNS4wMC4wMAotdW5zcHNjNyM3My4xNi4xNS4xOS4wMCNQdW1wcyBvciBjb21wcmVzc29ycyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNS4wMC4wMAotdW5zcHNjNyM3My4xNi4xNi4wMC4wMCNNYW51ZmFjdHVyZSBvZiB0cmFuc3BvcnQgZXF1aXBtZW50IzczLjE2LjAwLjAwLjAwCi11bnNwc2M3IzczLjE2LjE2LjAxLjAwI0Zpc2hpbmcgc2hpcCBvciBib2F0IGJ1aWxkaW5nIHNlcnZpY2VzIzczLjE2LjE2LjAwLjAwCi11bnNwc2M3IzczLjE2LjE2LjAyLjAwI1JhaWxyb2FkIHJvbGxpbmcgc3RvY2sgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTYuMDMuMDAjTG9jb21vdGl2ZSBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNi4wMC4wMAotdW5zcHNjNyM3My4xNi4xNi4wNC4wMCNNb3RvciB2ZWhpY2xlcyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNi4wMC4wMAotdW5zcHNjNyM3My4xNi4xNi4wNS4wMCNNb3RvciB2ZWhpY2xlcyBwYXJ0cyBvciBhY2Nlc3NvcmllcyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNi4wMC4wMAotdW5zcHNjNyM3My4xNi4xNi4wNi4wMCNNb3RvcmN5Y2xlIG9yIGJpY3ljbGUgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTYuMDcuMDAjQWlyIG9yIHNwYWNlY3JhZnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMDAuMDAuMDAjTWFudWZhY3R1cmUgb2YgZWxlY3RyaWNhbCBnb29kcyBhbmQgcHJlY2lzaW9uIGluc3RydW1lbnRzIzczLjAwLjAwLjAwLjAwCi11bnNwc2M3IzczLjE3LjE1LjAwLjAwI01hbnVmYWN0dXJlIG9mIGVsZWN0cmljYWwgZ29vZHMjNzMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTUuMDEuMDAjUG93ZXIgZ2VuZXJhdGlvbiBvciB0cmFuc21pc3Npb24gb3IgZGlzdHJpYnV0aW9uIGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4wMi4wMCNEcnkgb3Igc3RvcmFnZSBiYXR0ZXJ5IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE1LjAwLjAwCi11bnNwc2M3IzczLjE3LjE1LjAzLjAwI0VsZWN0cmljYWwgdG9vbHMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTUuMDQuMDAjTWVhc3VyaW5nIG9yIHRlc3RpbmcgaW5zdHJ1bWVudHMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTUuMDUuMDAjUmFkaW8gb3IgdGVsZXZpc2lvbiBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4wNi4wMCNDb21tdW5pY2F0aW9uIGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4wNy4wMCNFbGVjdHJpY2FsIGhvdXNlaG9sZCBhcHBsaWFuY2VzIG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE1LjAwLjAwCi11bnNwc2M3IzczLjE3LjE1LjA4LjAwI0luc3VsYXRlZCB3aXJlIG9yIGNhYmxlIG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE1LjAwLjAwCi11bnNwc2M3IzczLjE3LjE1LjA5LjAwI0VsZWN0cmljYWwgYWNjZXNzb3JpZXMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTUuMTAuMDAjRWxlY3RyaWNhbCBhY2Nlc3NvcmllcyBvciBzdXBwbGllcyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4xMS4wMCNFbGVjdHJvbmljIGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4xMi4wMCNFbGVjdHJvbmljIGNvbXB1dGVycyBvciBkYXRhIHByb2Nlc3NpbmcgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE1LjAwLjAwCi11bnNwc2M3IzczLjE3LjE2LjAwLjAwI01hbnVmYWN0dXJlIG9mIHByZWNpc2lvbiBpbnN0cnVtZW50cyM3My4xNy4wMC4wMC4wMAotdW5zcHNjNyM3My4xNy4xNi4wMS4wMCNTY2llbnRpZmljIGluc3RydW1lbnRzIG9yIG1lYXN1cmluZyBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTYuMDIuMDAjTWVkaWNhbCBvciBkZW50YWwgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE2LjAwLjAwCi11bnNwc2M3IzczLjE3LjE2LjAzLjAwI1Bob3RvZ3JhcGhpYyBvciBvcHRpY2FsIGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNi4wMC4wMAotdW5zcHNjNyM3My4xNy4xNi4wNC4wMCNXYXRjaGVzIG9yIGNsb2NrcyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNi4wMC4wMAotdW5zcHNjNyM3My4xNy4xNi4wNS4wMCNMYWJvcmF0b3J5IGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNi4wMC4wMAotdW5zcHNjNyM3My4xOC4wMC4wMC4wMCNNYWNoaW5pbmcgYW5kIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMDAuMDAjTWFjaGluaW5nIHNlcnZpY2VzIzczLjE4LjAwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjAxLjAwI1R1cm5pbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMDIuMDAjRWxlY3RybyBkaXNjaGFyZ2UgbWFjaGluaW5nIChFRE0pIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjAzLjAwI0VsZWN0cm8gY2hlbWljYWwgbWFjaGluaW5nIChFQ00pIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjA0LjAwI0NoZW0gbWlsbGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4wNS4wMCNQdW5jaGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4wNi4wMCNTdGFtcGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4wNy4wMCNCb3Jpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMDguMDAjRHJpbGxpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMDkuMDAjVGFwcGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xMC4wMCNMYXNlciBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xMS4wMCNCZW5kaW5nIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjEyLjAwI0dyaW5kaW5nIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjEzLjAwI1Nob3QgYmxhc3Rpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMTQuMDAjUG9saXNoaW5nIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjE1LjAwI0ZsYW1lIGN1dHRpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMTYuMDAjTGFzZXIgY3V0dGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xNy4wMCNQbGFzbWEgY3V0dGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xOC4wMCNXYXRlciBqZXQgY3V0dGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xOS4wMCNSb2xsaW5nIFNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjIwLjAwI1N1cmZhY2UgdHJlYXRtZW50IHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjIxLjAwI01pbGxpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMjIuMDAjU3ByYXlpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMjMuMDAjU2hhcnBlbmluZyBzZXJ2aWNlIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjExLjAwLjAwI0NvYXRpbmcgc2VydmljZXMjNzMuMTguMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDEuMDAjRWxlY3RybyBjb2F0aW5nIHNlcnZpY2VzIzczLjE4LjExLjAwLjAwCi11bnNwc2M3IzczLjE4LjExLjAyLjAwI0RpcHBpbmcgc2VydmljZXMjNzMuMTguMTEuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDMuMDAjV3JhcHBpbmcgc2VydmljZXMjNzMuMTguMTEuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDQuMDAjUGFpbnRpbmcgc2VydmljZXMjNzMuMTguMTEuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDUuMDAjV2ViIGNvYXRpbmcgc2VydmljZXMjNzMuMTguMTEuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDYuMDAjUGxhdGluZyBzZXJ2aWNlcyM3My4xOC4xMS4wMC4wMAotdW5zcHNjNyM3My4xOC4xMi4wMC4wMCNGb3JtaW5nIHNlcnZpY2VzIzczLjE4LjAwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEyLjAxLjAwI0RyYXcgZm9ybWluZyBzZXJ2aWNlcyM3My4xOC4xMi4wMC4wMAotdW5zcHNjNyM3My4xOC4xMi4wMi4wMCNIeWRybyBmb3JtaW5nIHNlcnZpY2VzIzczLjE4LjEyLjAwLjAwCi11bnNwc2M3IzczLjE4LjEyLjAzLjAwI1JvbGwgZm9ybWluZyBzZXJ2aWNlcyM3My4xOC4xMi4wMC4wMAotdW5zcHNjNyM3My4xOC4xMi4wNC4wMCNTdHJldGNoIGZvcm1pbmcgc2VydmljZXMjNzMuMTguMTIuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTIuMDUuMDAjU3BpbiBmb3JtaW5nIHNlcnZpY2VzIzczLjE4LjEyLjAwLjAwCi11bnNwc2M3IzczLjE4LjEyLjA2LjAwI0V4cGxvc2l2ZSBmb3JtaW5nIHNlcnZpY2VzIzczLjE4LjEyLjAwLjAwCi11bnNwc2M3IzczLjE4LjEzLjAwLjAwI0hlYXQgdHJlYXRtZW50IHNlcnZpY2VzIzczLjE4LjAwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEzLjAxLjAwI1F1ZW5jaCBhbmQgdGVtcGVyIHNlcnZpY2VzIzczLjE4LjEzLjAwLjAwCi11bnNwc2M3IzczLjE4LjEzLjAyLjAwI0FubmVhbGluZyBzZXJ2aWNlcyM3My4xOC4xMy4wMC4wMAotdW5zcHNjNyM3My4xOC4xMy4wMy4wMCNOb3JtYWxpemluZyBzZXJ2aWNlcyM3My4xOC4xMy4wMC4wMAotdW5zcHNjNyM3My4xOC4xMy4wNC4wMCNBZ2luZyBvciBzdGFiaWxpemluZyBzZXJ2aWNlcyM3My4xOC4xMy4wMC4wMAotdW5zcHNjNyM3My4xOC4xOS4wMC4wMCNXZWxkaW5nIGFuZCBicmF6aW5nIGFuZCBzb2xkZXJpbmcgc2VydmljZXMjNzMuMTguMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDEuMDAjQXJjIHdlbGRpbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDIuMDAjTWV0YWwgaW5lcnQgZ2FzIChNSUcpIHdlbGRpbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDMuMDAjVHVuZ3N0ZW4gaW5lcnQgZ2FzIChUSUcpIHdlbGRpbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDQuMDAjTGFzZXIgd2VsZGluZyBzZXJ2aWNlcyM3My4xOC4xOS4wMC4wMAotdW5zcHNjNyM3My4xOC4xOS4wNS4wMCNTcG90IHdlbGRpbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDYuMDAjUHJvamVjdGlvbiB3ZWxkaW5nIHNlcnZpY2VzIzczLjE4LjE5LjAwLjAwCi11bnNwc2M3IzczLjE4LjE5LjA3LjAwI0JyYXppbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDguMDAjU29sZGVyaW5nIHNlcnZpY2VzIzczLjE4LjE5LjAwLjAwCi11bnNwc2M3Izc2LjAwLjAwLjAwLjAwI0luZHVzdHJpYWwgQ2xlYW5pbmcgU2VydmljZXMjNzYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTAuMDAuMDAuMDAjRGVjb250YW1pbmF0aW9uIHNlcnZpY2VzIzc2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc2LjEwLjE1LjAwLjAwI0Rpc2luZmVjdGlvbiM3Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMC4xNS4wMS4wMCNXYXNocm9vbSBzYW5pdGF0aW9uIHNlcnZpY2VzIzc2LjEwLjE1LjAwLjAwCi11bnNwc2M3Izc2LjEwLjE1LjAyLjAwI1Jlc3Qgcm9vbSBjbGVhbmluZyBzZXJ2aWNlcyM3Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM3Ni4xMC4xNS4wMy4wMCNEaXNpbmZlY3Rpb24gb3IgZGVvZG9yaXppbmcgc2VydmljZXMjNzYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzYuMTAuMTYuMDAuMDAjSGF6YXJkb3VzIG1hdGVyaWFsIGRlY29udGFtaW5hdGlvbiM3Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMC4xNi4wMS4wMCNSYWRpb2FjdGl2ZSBkZWNvbnRhbWluYXRpb24gc2VydmljZXMjNzYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzYuMTAuMTYuMDIuMDAjQXNiZXN0b3MgZGVjb250YW1pbmF0aW9uIG9yIHJlbW92YWwjNzYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzYuMTEuMDAuMDAuMDAjQ2xlYW5pbmcgYW5kIGphbml0b3JpYWwgc2VydmljZXMjNzYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTEuMTUuMDAuMDAjR2VuZXJhbCBidWlsZGluZyBhbmQgb2ZmaWNlIGNsZWFuaW5nIHNlcnZpY2VzIzc2LjExLjAwLjAwLjAwCi11bnNwc2M3Izc2LjExLjE1LjAxLjAwI0J1aWxkaW5nIGNsZWFuaW5nIHNlcnZpY2VzIzc2LjExLjE1LjAwLjAwCi11bnNwc2M3Izc2LjExLjE1LjAyLjAwI0J1aWxkaW5nIG1haW50ZW5hbmNlIG9yIHJlcGFpciBzZXJ2aWNlcyM3Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNS4wMy4wMCNMaWdodGluZyBtYWludGVuYW5jZSBzZXJ2aWNlcyM3Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNS4wNC4wMCNXaW5kb3cgb3Igd2luZG93IGJsaW5kIGNsZWFuaW5nIHNlcnZpY2VzIzc2LjExLjE1LjAwLjAwCi11bnNwc2M3Izc2LjExLjE2LjAwLjAwI0J1aWxkaW5nIGNvbXBvbmVudCBjbGVhbmluZyBzZXJ2aWNlcyM3Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNi4wMS4wMCNBY291c3RpY2FsIHRpbGUgb3IgY2VpbGluZyBjbGVhbmluZyBzZXJ2aWNlcyM3Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNi4wMi4wMCNBaXIgZHVjdCBjbGVhbmluZyM3Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNi4wMy4wMCNDaGltbmV5IGNsZWFuaW5nIzc2LjExLjE2LjAwLjAwCi11bnNwc2M3Izc2LjExLjE2LjA0LjAwI0Zsb29yIHdheGluZyBvciBjYXJwZXQgY2xlYW5pbmcjNzYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzYuMTEuMTYuMDUuMDAjRXhoYXVzdCBob29kIG9yIGZhbiBjbGVhcmluZyM3Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNy4wMC4wMCNCdWlsZGluZyBzaXRlIGNsZWFuIHVwIzc2LjExLjAwLjAwLjAwCi11bnNwc2M3Izc2LjExLjE3LjAxLjAwI0NvbnN0cnVjdGlvbiBzaXRlIGNsZWFuIHVwIHNlcnZpY2VzIzc2LjExLjE3LjAwLjAwCi11bnNwc2M3Izc2LjExLjE3LjAyLjAwI0NvbnN0cnVjdGlvbiBzaXRlIGhhdWwgYXdheSBzZXJ2aWNlcyM3Ni4xMS4xNy4wMC4wMAotdW5zcHNjNyM3Ni4xMi4wMC4wMC4wMCNSZWZ1c2UgZGlzcG9zYWwgYW5kIHRyZWF0bWVudCM3Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNS4wMC4wMCNSZWZ1c2UgY29sbGVjdGlvbiBhbmQgZGlzcG9zYWwjNzYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTUuMDEuMDAjR2FyYmFnZSBjb2xsZWN0aW9uIG9yIGRlc3RydWN0aW9uIG9yIHByb2Nlc3Npbmcgb3IgZGlzcG9zYWwjNzYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTUuMDIuMDAjTGlxdWlkIHdhc3RlIGNvbGxlY3Rpb24gb3IgcHJvY2Vzc2luZyBvciBkaXNwb3NhbCM3Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNS4wMy4wMCNTdHJlZXQgY2xlYW5pbmcgc2VydmljZXMjNzYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTYuMDAuMDAjTm9uaGF6YXJkb3VzIHdhc3RlIGRpc3Bvc2FsIzc2LjEyLjAwLjAwLjAwCi11bnNwc2M3Izc2LjEyLjE2LjAxLjAwI0dhcmJhZ2UgZHVtcCM3Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNi4wMi4wMCNTYW5pdGFyeSBsYW5kZmlsbCBvcGVyYXRpb25zIzc2LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc2LjEyLjE2LjAzLjAwI1NsdWRnZSBkaXNwb3NhbCM3Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNi4wNC4wMCNEZWFkIGFuaW1hbCBkaXNwb3NhbCBzZXJ2aWNlcyM3Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNy4wMC4wMCNMaXF1aWQgd2FzdGUgdHJlYXRtZW50Izc2LjEyLjAwLjAwLjAwCi11bnNwc2M3Izc2LjEyLjE3LjAxLjAwI1Nld2FnZSB0cmVhdG1lbnQgc2VydmljZXMjNzYuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTcuMDIuMDAjQ2hlbWljYWwgdHJlYXRtZW50IHNlcnZpY2VzIzc2LjEyLjE3LjAwLjAwCi11bnNwc2M3Izc2LjEyLjE4LjAwLjAwI1JlZnVzZSB0cmVhdG1lbnQjNzYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTguMDEuMDAjUmVjeWNsaW5nIHNlcnZpY2VzIzc2LjEyLjE4LjAwLjAwCi11bnNwc2M3Izc2LjEyLjE5LjAwLjAwI0hhemFyZG91cyB3YXN0ZSBkaXNwb3NhbCM3Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xOS4wMS4wMCNNZWRpY2FsIHdhc3RlIGRpc3Bvc2FsIzc2LjEyLjE5LjAwLjAwCi11bnNwc2M3Izc2LjEyLjE5LjAyLjAwI0FjaWQgd2FzdGUgY29sbGVjdGlvbiBvciBkaXNwb3NhbCM3Ni4xMi4xOS4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xOS4wMy4wMCNDaGVtaWNhbCBkZXRveGlmaWNhdGlvbiM3Ni4xMi4xOS4wMC4wMAotdW5zcHNjNyM3Ni4xMy4wMC4wMC4wMCNUb3hpYyBhbmQgaGF6YXJkb3VzIHdhc3RlIGNsZWFudXAjNzYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTUuMDAuMDAjTnVjbGVhciB3YXN0ZSB0cmVhdG1lbnQjNzYuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTUuMDEuMDAjUmFkaW9hY3RpdmUgd2FzdGUgbWF0ZXJpYWwgdHJlYXRtZW50Izc2LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc2LjEzLjE1LjAyLjAwI1JhZGlvYWN0aXZlIGNvbnRhaW5tZW50IHNlcnZpY2VzIzc2LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc2LjEzLjE2LjAwLjAwI1RveGljIHNwaWxsIGNsZWFudXAjNzYuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTYuMDEuMDAjVG94aWMgc3BpbGwgY29udGFpbm1lbnQjNzYuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTYuMDIuMDAjVG94aWMgc3Vic3RhbmNlcyBzcGlsbCBjbGVhbnVwIzc2LjEzLjE2LjAwLjAwCi11bnNwc2M3Izc2LjEzLjE3LjAwLjAwI09pbCBzcGlsbCBjbGVhbnVwIzc2LjEzLjAwLjAwLjAwCi11bnNwc2M3Izc2LjEzLjE3LjAxLjAwI09pbCByZXNpZHVlIGRpc3Bvc2FsIG9yIGNvbnRyb2wgc2VydmljZXMjNzYuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTcuMDIuMDAjT2lsIHNwaWxsIHRyZWF0bWVudCBzZXJ2aWNlcyM3Ni4xMy4xNy4wMC4wMAotdW5zcHNjNyM3Ny4wMC4wMC4wMC4wMCNFbnZpcm9ubWVudGFsIFNlcnZpY2VzIzc3LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEwLjAwLjAwLjAwI0Vudmlyb25tZW50YWwgbWFuYWdlbWVudCM3Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNS4wMC4wMCNFbnZpcm9ubWVudGFsIGltcGFjdCBhc3Nlc3NtZW50Izc3LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEwLjE1LjAxLjAwI1Jpc2sgb3IgaGF6YXJkIGFzc2Vzc21lbnQjNzcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTUuMDIuMDAjRW52aXJvbm1lbnRhbCBzdGFuZGFyZHMjNzcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTUuMDMuMDAjRW52aXJvbm1lbnRhbCBpbmRpY2F0b3JzIGFuYWx5c2lzIzc3LjEwLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE1LjA0LjAwI0Vudmlyb25tZW50YWwgaW1wYWN0IGFzc2Vzc21lbnQgIChFSUEpIHNlcnZpY2VzIzc3LjEwLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE1LjA1LjAwI0Vudmlyb25tZW50YWwgbW9uaXRvcmluZyM3Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNi4wMC4wMCNFbnZpcm9ubWVudGFsIHBsYW5uaW5nIzc3LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEwLjE2LjAxLjAwI1VyYmFuIGVudmlyb25tZW50YWwgZGV2ZWxvcG1lbnQgcGxhbm5pbmcjNzcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTYuMDIuMDAjRm9yZXN0IGNvbnNlcnZhdGlvbiBzdHJhdGVneSBwbGFubmluZyM3Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNi4wMy4wMCNNYXJpbmUgY29uc2VydmF0aW9uIHN0cmF0ZWd5IHBsYW5uaW5nIzc3LjEwLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE2LjA0LjAwI05hdHVyYWwgcmVzb3VyY2VzIG1hbmFnZW1lbnQgb3IgY29uc2VydmF0aW9uIHN0cmF0ZWd5IHBsYW5uaW5nIHNlcnZpY2VzIzc3LjEwLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE2LjA1LjAwI0Vudmlyb25tZW50YWwgaW5zdGl0dXRpb24gYnVpbGRpbmcgb3IgcGxhbm5pbmcjNzcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTcuMDAuMDAjRW52aXJvbm1lbnRhbCBhZHZpc29yeSBzZXJ2aWNlcyM3Ny4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNy4wMS4wMCNFbnZpcm9ubWVudGFsIHNjaWVuY2VzIGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE3LjAyLjAwI0Vudmlyb25tZW50YWwgY2hlbWlzdHJ5IGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE3LjAzLjAwI0Vudmlyb25tZW50YWwgZXRoaWNzIGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE3LjA0LjAwI0Vudmlyb25tZW50YWwgdGVjaG5vbG9neSBhZHZpc29yeSBzZXJ2aWNlcyM3Ny4xMC4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNy4wNS4wMCNFbnZpcm9ubWVudGFsIGVjb25vbWljcyBhZHZpc29yeSBzZXJ2aWNlcyM3Ny4xMC4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNy4wNi4wMCNFbnZpcm9ubWVudGFsIGxhdyBhZHZpc29yeSBzZXJ2aWNlcyM3Ny4xMC4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNy4wNy4wMCNFY29sb2d5IGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE4LjAwLjAwI0Vudmlyb25tZW50YWwgYXVkaXRpbmcjNzcuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTguMDEuMDAjRW52aXJvbm1lbnRhbCBpbmZvcm1hdGlvbiBzeXN0ZW1zIzc3LjEwLjE4LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE4LjAyLjAwI0NvcnBvcmF0ZSBlbnZpcm9ubWVudGFsIGF1ZGl0aW5nIHNlcnZpY2VzIzc3LjEwLjE4LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE4LjAzLjAwI1NlY3RvcmFsIGVudmlyb25tZW50YWwgYXVkaXRpbmcgc2VydmljZXMjNzcuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTguMDQuMDAjQWN0aXZpdHkgc3BlY2lmaWMgZW52aXJvbm1lbnRhbCBhdWRpdGluZyBzZXJ2aWNlcyM3Ny4xMC4xOC4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xOC4wNS4wMCNFbnZpcm9ubWVudGFsIHF1YWxpdHkgY29udHJvbCBzZXJ2aWNlcyM3Ny4xMC4xOC4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xOC4wNi4wMCNFbnZpcm9ubWVudGFsIHNlY3VyaXR5IGNvbnRyb2wgc2VydmljZXMjNzcuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDAuMDAjUG9sbHV0aW9uIGludmVzdGlnYXRpb24gc2VydmljZXMjNzcuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDEuMDAjSW5kdXN0cmlhbCBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDIuMDAjSW5kdXN0cmlhbCB3YXN0ZSBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDMuMDAjR2Fzd29ya3Mgc2l0ZSBpbnZlc3RpZ2F0aW9uIzc3LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE5LjA0LjAwI0NoZW1pY2FsIHdvcmtzIG9yIG9pbCByZWZpbmVyeSB3YXN0ZSBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDUuMDAjV29vZCB0cmVhdG1lbnQgcGxhbnQgc2l0ZSBpbnZlc3RpZ2F0aW9uIzc3LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE5LjA2LjAwI09pbCBkZXBvdCBvciB0ZXJtaW5hbCBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDcuMDAjRHJ5IGNsZWFuaW5nIHBsYW50cyBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDguMDAjRm91bmRyeSBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDkuMDAjUmVjeWNsaW5nIHBsYW50IHNpdGUgaW52ZXN0aWdhdGlvbiM3Ny4xMC4xOS4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xOS4xMC4wMCNGb29kIHByb2Nlc3NpbmcgcGxhbnQgc2l0ZSBpbnZlc3RpZ2F0aW9uIzc3LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc3LjExLjAwLjAwLjAwI0Vudmlyb25tZW50YWwgcHJvdGVjdGlvbiM3Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNS4wMC4wMCNFbnZpcm9ubWVudGFsIHNhZmV0eSBzZXJ2aWNlcyM3Ny4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNS4wMS4wMCNMYW5kc2NhcGUgcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMS4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNS4wMi4wMCNPem9uZSBwcm90ZWN0aW9uIHNlcnZpY2VzIzc3LjExLjE1LjAwLjAwCi11bnNwc2M3Izc3LjExLjE1LjAzLjAwI0Zvb2Qgb3IgZmVlZCBjb250YW1pbmF0aW9uIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTUuMDQuMDAjR2VuZXRpYyByZXNvdXJjZXMgcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMS4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNS4wNS4wMCNUb3hpYyBzdWJzdGFuY2VzIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTUuMDYuMDAjUmFkaWF0aW9uIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTUuMDcuMDAjRW5kYW5nZXJlZCBzcGVjaWVzIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTUuMDguMDAjTmF0dXJhbCByaXNrcyBvciBoYXphcmRzIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTYuMDAuMDAjRW52aXJvbm1lbnRhbCByZWhhYmlsaXRhdGlvbiM3Ny4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNi4wMS4wMCNJbmR1c3RyaWFsIHNpdGUgcmVoYWJpbGl0YXRpb24jNzcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTYuMDIuMDAjRW52aXJvbm1lbnRhbCBkZWNvbnRhbWluYXRpb24gc2VydmljZXMjNzcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTYuMDMuMDAjTGFuZCByZWNsYW1hdGlvbiBzZXJ2aWNlcyM3Ny4xMS4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMi4wMC4wMC4wMCNQb2xsdXRpb24gdHJhY2tpbmcgYW5kIG1vbml0b3JpbmcgYW5kIHJlaGFiaWxpdGF0aW9uIzc3LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEyLjE1LjAwLjAwI0FpciBwb2xsdXRpb24jNzcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTUuMDEuMDAjQWlyIHF1YWxpdHkgbWFuYWdlbWVudCM3Ny4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNS4wMi4wMCNUcmFuc2JvdW5kYXJ5IGFpciBwb2xsdXRpb24gbWFuYWdlbWVudCBvciBjb250cm9sIHNlcnZpY2VzIzc3LjEyLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE1LjAzLjAwI0FpciBwb2xsdXRpb24gcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNS4wNC4wMCNBaXIgcG9sbHV0aW9uIG1vbml0b3Jpbmcgb3IgbWVhc3VyZW1lbnQgc2VydmljZXMjNzcuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTUuMDUuMDAjVG94aWMgZ2FzIGRldGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNS4wNi4wMCNNZXRoYW5lIG1vbml0b3JpbmcjNzcuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTUuMDcuMDAjQ2FyYm9uIGRpb3hpZGUgbW9uaXRvcmluZyBzZXJ2aWNlcyM3Ny4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNS4wOC4wMCNBaXJib3JuZSBwYXJ0aWNsZSBtb25pdG9yaW5nIzc3LjEyLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE1LjA5LjAwI096b25lIGRlcGxldGlvbiBtb25pdG9yaW5nIHNlcnZpY2VzIzc3LjEyLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjAwLjAwI1NvaWwgcG9sbHV0aW9uIzc3LjEyLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjAxLjAwI1NvaWwgcG9sbHV0aW9uIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTYuMDIuMDAjUG9sbHV0ZWQgc29pbCByZW1vdmFsIHNlcnZpY2VzIzc3LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjAzLjAwI1BvbGx1dGVkIHNvaWwgdHJlYXRtZW50IG9yIHJlaGFiaWxpdGF0aW9uIzc3LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjA0LjAwI1NvaWwgcG9sbHV0aW9uIGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjA1LjAwI1NvaWwgcG9sbHV0aW9uIG1hcHBpbmcjNzcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTYuMDYuMDAjU29pbCBwb2xsdXRpb24gbWVhc3VyZW1lbnQgb3IgbW9uaXRvcmluZyM3Ny4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNi4wNy4wMCNPcmdhbmljIGZlcnRpbGl6ZXIgcG9sbHV0aW9uIGFzc2Vzc21lbnQjNzcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTYuMDguMDAjUGVzdGljaWRlcyBwb2xsdXRpb24gYXNzZXNzbWVudCM3Ny4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNi4wOS4wMCNOaXRyYXRlcyBwb2xsdXRpb24gYXNzZXNzbWVudCM3Ny4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNi4xMC4wMCNQaG9zcGhhdGVzIHBvbGx1dGlvbiBhc3Nlc3NtZW50Izc3LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE3LjAwLjAwI1dhdGVyIHBvbGx1dGlvbiM3Ny4xMi4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wMS4wMCNTdXJmYWNlIHdhdGVyIHBvbGx1dGlvbiBtb25pdG9yaW5nIG9yIGNvbnRyb2wgc2VydmljZXMjNzcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTcuMDIuMDAjU3VyZmFjZSB3YXRlciBwb2xsdXRpb24gcmVoYWJpbGl0YXRpb24gc2VydmljZXMjNzcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTcuMDMuMDAjU3VyZmFjZSB3YXRlciBwb2xsdXRpb24gcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wNC4wMCNTdXJmYWNlIHdhdGVyIHRyZWF0bWVudCBzZXJ2aWNlcyM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wNS4wMCNTdXJmYWNlIHdhdGVyIHBvbGx1dGlvbiBkcmFpbmFnZSBzZXJ2aWNlcyM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wNi4wMCNUcmFuc2JvdW5kYXJ5IHdhdGVyIHBvbGx1dGlvbiBtYW5hZ2VtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjNzcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTcuMDcuMDAjR3JvdW5kd2F0ZXIgcG9sbHV0aW9uIG1vbml0b3Jpbmcgb3IgY29udHJvbCBzZXJ2aWNlcyM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wOC4wMCNHcm91bmR3YXRlciBwb2xsdXRpb24gZHJhaW5hZ2Ugc2VydmljZXMjNzcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTcuMDkuMDAjR3JvdW5kd2F0ZXIgcG9sbHV0aW9uIHRyZWF0bWVudCBvciByZWhhYmlsaXRhdGlvbiM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMy4wMC4wMC4wMCNQb2xsdXRhbnRzIHRyYWNraW5nIGFuZCBtb25pdG9yaW5nIGFuZCByZWhhYmlsaXRhdGlvbiBzZXJ2aWNlcyM3Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNS4wMC4wMCNPaWwgcG9sbHV0aW9uIzc3LjEzLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEzLjE1LjAxLjAwI09pbCBzcGlsbGFnZSBtb25pdG9yaW5nIHNlcnZpY2VzIzc3LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEzLjE1LjAyLjAwI09pbCBzcGlsbGFnZSBjb250cm9sIHNlcnZpY2VzIzc3LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEzLjE1LjAzLjAwI09pbCBzcGlsbGFnZSByZWhhYmlsaXRhdGlvbiBzZXJ2aWNlcyM3Ny4xMy4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNi4wMC4wMCNOb2lzZSBwb2xsdXRpb24jNzcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTMuMTYuMDEuMDAjTm9pc2UgY29udHJvbCBzZXJ2aWNlcyM3Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNi4wMi4wMCNOb2lzZSBwb2xsdXRpb24gcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNi4wMy4wMCNOb2lzZSBwb2xsdXRpb24gbW9uaXRvcmluZyBzZXJ2aWNlcyM3Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNi4wNC4wMCNOb2lzZSBwb2xsdXRpb24gYWR2aXNvcnkgc2VydmljZXMjNzcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTMuMTcuMDAuMDAjVG94aWMgc3Vic3RhbmNlcyBwb2xsdXRpb24jNzcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTMuMTcuMDEuMDAjVG94aWMgc3Vic3RhbmNlcyBtb25pdG9yaW5nIHNlcnZpY2VzIzc3LjEzLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEzLjE3LjAyLjAwI1RveGljIHN1YnN0YW5jZXMgcmVoYWJpbGl0YXRpb24gc2VydmljZXMjNzcuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzguMDAuMDAuMDAuMDAjVHJhbnNwb3J0YXRpb24gYW5kIFN0b3JhZ2UgYW5kIE1haWwgU2VydmljZXMjNzguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMDAuMDAuMDAjTWFpbCBhbmQgY2FyZ28gdHJhbnNwb3J0Izc4LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEwLjE1LjAwLjAwI0FpciBjYXJnbyB0cmFuc3BvcnQjNzguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTUuMDEuMDAjRG9tZXN0aWMgYWlyIGNhcmdvIHRyYW5wb3NydCM3OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM3OC4xMC4xNS4wMi4wMCNJbnRlcm5hdGlvbmFsIGFpciBjYXJnbyB0cmFuc3BvcnQjNzguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTUuMDMuMDAjQXJtb3JlZCBhaXIgdHJhbnNwb3J0Izc4LjEwLjE1LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE2LjAwLjAwI1JhaWwgY2FyZ28gdHJhbnNwb3J0Izc4LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEwLjE2LjAxLjAwI0JveGNhciB0cmFuc3BvcnQgc2VydmljZXMjNzguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTYuMDIuMDAjQnVsayBjYXJnbyByYWlsIHRyYXNucG9ydCBzZXJ2aWNlcyM3OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM3OC4xMC4xNi4wMy4wMCNMaXZlc3RvY2sgcmFpbCB0cmFuc3BvcnQjNzguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTYuMDQuMDAjVmVoaWNsZSB0cmFuc3BvcnQgc2VydmljZXMjNzguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTcuMDAuMDAjTWFyaW5lIGNhcmdvIHRyYW5zcG9ydCM3OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMC4xNy4wMS4wMCNEb21lc3RpYyB2ZXNzZWwgdHJhbnNwb3J0IHNlcnZpY2VzIzc4LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE3LjAyLjAwI0ludGVybmF0aW9uYWwgdmVzc2VsIHRyYW5zcG9ydCBzZXJ2aWNlcyM3OC4xMC4xNy4wMC4wMAotdW5zcHNjNyM3OC4xMC4xNy4wMy4wMCNEb21lc3RpYyBiYXJnZSB0cmFuc3BvcnQgc2VydmljZXMjNzguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTcuMDQuMDAjSW50ZXJuYXRpb25hbCBiYXJnZSB0cmFuc3BvcnQgc2VydmljZXMjNzguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTcuMDUuMDAjQXJtb3JlZCBtYXJpbmUgdHJhbnNwb3J0Izc4LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE4LjAwLjAwI1JvYWQgY2FyZ28gdHJhbnNwb3J0Izc4LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEwLjE4LjAxLjAwI0xvY2FsIGFyZWEgdHJ1Y2tpbmcgc2VydmljZXMjNzguMTAuMTguMDAuMDAKLXVuc3BzYzcjNzguMTAuMTguMDIuMDAjUmVnaW9uYWwgb3IgbmF0aW9uYWwgdHJ1Y2tpbmcgc2VydmljZXMjNzguMTAuMTguMDAuMDAKLXVuc3BzYzcjNzguMTAuMTguMDMuMDAjVmVoaWNsZSBjYXJyaWVyIHNlcnZpY2VzIzc4LjEwLjE4LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE4LjA0LjAwI1JlbG9jYXRpb24gc2VydmljZXMjNzguMTAuMTguMDAuMDAKLXVuc3BzYzcjNzguMTAuMTkuMDAuMDAjSW50ZXJtb2RhbCBjYXJnbyB0cmFuc3BvcnQjNzguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTkuMDEuMDAjQWlyIHRvIG9jZWFuIHRyYW5zcG9ydGF0aW9uIzc4LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE5LjAyLjAwI09jZWFuIHRvIHJhaWwgdHJhbnNwb3J0YXRpb24jNzguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTkuMDMuMDAjT2NlYW4gdG8gdHJ1Y2sgdHJhbnNwb3J0YXRpb24jNzguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTkuMDQuMDAjQWlyIHRvIHRydWNrIHRyYW5zcG9ydCM3OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM3OC4xMC4xOS4wNS4wMCNSYWlsIHRydWNrIHRyYW5zcG9ydGF0aW9uIzc4LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc4LjEwLjIwLjAwLjAwI1NwYWNlY3JhZnQgY2FyZ28gdHJhbnNwb3J0Izc4LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEwLjIwLjAxLjAwI1NhdGVsbGl0ZSBsYXVuY2ggc2VydmljZXMjNzguMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjAuMDIuMDAjRXhwZXJpbWVudGFsIHBheWxvYWQgc2VydmljZXMjNzguMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjEuMDAuMDAjUGlwZWxpbmUgc2VydmljZXMjNzguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjEuMDEuMDAjUGV0cm9sZXVtIHByb2R1Y3RzIHRyYW5zcG9ydCM3OC4xMC4yMS4wMC4wMAotdW5zcHNjNyM3OC4xMC4yMS4wMi4wMCNXYXRlciB0cmFuc3BvcnQjNzguMTAuMjEuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjIuMDAuMDAjUG9zdGFsIGFuZCBzbWFsbCBwYXJjZWwgYW5kIGNvdXJpZXIgc2VydmljZXMjNzguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjIuMDEuMDAjTmF0aW9uYWwgcG9zdGFsIGRlbGl2ZXJ5IHNlcnZpY2VzIzc4LjEwLjIyLjAwLjAwCi11bnNwc2M3Izc4LjEwLjIyLjAyLjAwI1Bvc3Qgb2ZmaWNlIGJveCBzZXJ2aWNlcyM3OC4xMC4yMi4wMC4wMAotdW5zcHNjNyM3OC4xMC4yMi4wMy4wMCNNYWlsaW5nIG9yIG1haWwgcGljayB1cCBvciBkZWxpdmVyeSBzZXJ2aWNlcyM3OC4xMC4yMi4wMC4wMAotdW5zcHNjNyM3OC4xMC4yMi4wNC4wMCNMZXR0ZXIgb3Igc21hbGwgcGFyY2VsIHdvcmxkd2lkZSBkZWxpdmVyeSBzZXJ2aWNlcyM3OC4xMC4yMi4wMC4wMAotdW5zcHNjNyM3OC4xMC4yMi4wNS4wMCNMZXR0ZXIgb3Igc21hbGwgcGFyY2VsIGxvY2FsIGRlbGl2ZXJ5IHNlcnZpY2VzIzc4LjEwLjIyLjAwLjAwCi11bnNwc2M3Izc4LjEwLjIyLjA2LjAwI0JpY3ljbGUgb3Igc2Nvb3RlciBtZXNzZW5nZXIgc2VydmNpZXMjNzguMTAuMjIuMDAuMDAKLXVuc3BzYzcjNzguMTEuMDAuMDAuMDAjUGFzc2VuZ2VyIHRyYW5zcG9ydCM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMS4xNS4wMC4wMCNBaXIgdHJhbnNwb3J0YXRpb24jNzguMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTUuMDEuMDAjSGVsaWNvcHRlciBzZXJ2aWNlcyM3OC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3OC4xMS4xNS4wMi4wMCNDb21tZXJjaWFsIGFpcnBsYW5lIHRyYXZlbCM3OC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3OC4xMS4xNS4wMy4wMCNDaGFydGVyZWQgYWlycGxhbmUgdHJhdmVsIzc4LjExLjE1LjAwLjAwCi11bnNwc2M3Izc4LjExLjE2LjAwLjAwI1JhaWx3YXkgdHJhbnNwb3J0YXRpb24jNzguMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTYuMDEuMDAjTGlnaHQgcmFpbCB2ZWhpY2xlIHRyYW5zcG9ydCAoTFJWKSBzZXJ2aWNlcyM3OC4xMS4xNi4wMC4wMAotdW5zcHNjNyM3OC4xMS4xNi4wMi4wMCNTdWJ3YXkgdHJhbnNwb3J0Izc4LjExLjE2LjAwLjAwCi11bnNwc2M3Izc4LjExLjE2LjAzLjAwI0NvbnRpbmVudGFsIG9yIGludGVyIGNvbnRpbmVudGFsIHJhaWwgc2VydmljZXMjNzguMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTcuMDAuMDAjTWFyaW5lIHRyYW5zcG9ydGF0aW9uIzc4LjExLjAwLjAwLjAwCi11bnNwc2M3Izc4LjExLjE3LjAxLjAwI1dhdGVyIHRheGlzIzc4LjExLjE3LjAwLjAwCi11bnNwc2M3Izc4LjExLjE3LjAyLjAwI092ZXJuaWdodCBzaGlwIGNydWlzZXMjNzguMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTcuMDMuMDAjU2lnaHRzZWVpbmcgYm9hdCBleGN1cnNpb25zIzc4LjExLjE3LjAwLjAwCi11bnNwc2M3Izc4LjExLjE4LjAwLjAwI1JvYWQgdHJhbnNwb3J0YXRpb24jNzguMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTguMDEuMDAjQ2FyIHJlbnRhbCBzZXJ2aWNlcyM3OC4xMS4xOC4wMC4wMAotdW5zcHNjNyM3OC4xMS4xOC4wMi4wMCNTY2hlZHVsZWQgYnVzIHNlcnZpY2VzIzc4LjExLjE4LjAwLjAwCi11bnNwc2M3Izc4LjExLjE4LjAzLjAwI0NoYXJ0ZXJlZCBidXMgc2VydmljZXMjNzguMTEuMTguMDAuMDAKLXVuc3BzYzcjNzguMTEuMTguMDQuMDAjVGF4aWNhYiBzZXJ2aWNlcyM3OC4xMS4xOC4wMC4wMAotdW5zcHNjNyM3OC4xMS4xOC4wNS4wMCNUcmFuc3BvcnRhdGlvbiBtYWludGVuYW5jZSM3OC4xMS4xOC4wMC4wMAotdW5zcHNjNyM3OC4xMS4xOC4wNi4wMCNWZWhpY2xlIHJlbnRhbCBvciBsZWFzaW5nIzc4LjExLjE4LjAwLjAwCi11bnNwc2M3Izc4LjExLjE5LjAwLjAwI1NwYWNlIHRyYW5zcG9ydGF0aW9uIzc4LjExLjAwLjAwLjAwCi11bnNwc2M3Izc4LjExLjE5LjAxLjAwI0V4cGVyaW1lbnRhbCBvciBlZHVjYXRpb25hbCBtaXNzaW9ucyM3OC4xMS4xOS4wMC4wMAotdW5zcHNjNyM3OC4xMi4wMC4wMC4wMCNNYXRlcmlhbCBwYWNraW5nIGFuZCBoYW5kbGluZyM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMi4xNS4wMC4wMCNQYWNraW5nIzc4LjEyLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEyLjE1LjAxLjAwI0NvbnRhaW5lcml6YXRpb24gb2YgZ29vZHMjNzguMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzguMTIuMTUuMDIuMDAjQ3JhdGluZyBzZXJ2aWNlcyM3OC4xMi4xNS4wMC4wMAotdW5zcHNjNyM3OC4xMi4xNi4wMC4wMCNNYXRlcmlhbCBoYW5kbGluZyBzZXJ2aWNlcyM3OC4xMi4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMi4xNi4wMS4wMCNGcmVpZ2h0IGxvYWRpbmcgb3IgdW5sb2FkaW5nIzc4LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc4LjEyLjE2LjAyLjAwI1dlaWdoaW5nIHNlcnZpY2VzIzc4LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc4LjEzLjAwLjAwLjAwI1N0b3JhZ2UjNzguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTMuMTUuMDAuMDAjRmFybSBwcm9kdWN0cyB3YXJlaG91c2luZyM3OC4xMy4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMy4xNS4wMS4wMCNTaWxvIHNlcnZpY2VzIzc4LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE1LjAyLjAwI0dyYWluIGVsZXZhdG9yIHNlcnZpY2VzIzc4LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE2LjAwLjAwI0dlbmVyYWwgZ29vZHMgc3RvcmFnZSM3OC4xMy4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMy4xNi4wMS4wMCNQYWxsZXRpemVkIGNhcmdvIHN0b3JhZ2UjNzguMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTMuMTYuMDIuMDAjRmlsZSBhcmNoaXZlIHN0b3JhZ2UjNzguMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTMuMTcuMDAuMDAjQnVsayBzdG9yYWdlIzc4LjEzLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEzLjE3LjAxLjAwI0luIGdyb3VuZCBzdG9yYWdlIHNlcnZpY2VzIzc4LjEzLjE3LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE4LjAwLjAwI1NwZWNpYWxpemVkIHdhcmVob3VzaW5nIGFuZCBzdG9yYWdlIzc4LjEzLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEzLjE4LjAxLjAwI1JlZnJpZ2VyYXRlZCBzdG9yYWdlIzc4LjEzLjE4LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE4LjAyLjAwI0N1c3RvbXMgYm9uZGVkIHN0b3JhZ2Ugc2VydmljZXMjNzguMTMuMTguMDAuMDAKLXVuc3BzYzcjNzguMTMuMTguMDMuMDAjSGF6YXJkb3VzIG1hdGVyaWFscyBzdG9yYWdlIzc4LjEzLjE4LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE4LjA0LjAwI0RvY3VtZW50IHN0b3JhZ2Ugc2VydmljZXMjNzguMTMuMTguMDAuMDAKLXVuc3BzYzcjNzguMTQuMDAuMDAuMDAjVHJhbnNwb3J0IG9wZXJhdGlvbnMjNzguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTQuMTUuMDAuMDAjVHJhbnNwb3J0IGFycmFuZ2VtZW50cyM3OC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xNS4wMS4wMCNGcmVpZ2h0IGZvcndhcmRlcnMgc2VydmljZXMjNzguMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzguMTQuMTUuMDIuMDAjQ3VzdG9tcyBicm9rZXJhZ2Ugc2VydmljZXMjNzguMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzguMTQuMTUuMDMuMDAjVHJhbnNwb3J0YXRpb24gaW5kdXN0cnkgdGFyaWZmIGNvbXBhcmlzb24gb3IgZnJlaWdodCBhdWRpdCBzZXJ2aWNlcyM3OC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3OC4xNC4xNi4wMC4wMCNJbnNwZWN0aW9uIzc4LjE0LjAwLjAwLjAwCi11bnNwc2M3Izc4LjE0LjE2LjAxLjAwI1BhY2tpbmcgaW5zcGVjdGlvbiBzZXJ2aWNlcyM3OC4xNC4xNi4wMC4wMAotdW5zcHNjNyM3OC4xNC4xNi4wMi4wMCNDYXJnbyBzdXJ2ZXkgc2VydmljZXMjNzguMTQuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTQuMTYuMDMuMDAjUGVzdCBjb250cm9sIGluc3BlY3Rpb25zIzc4LjE0LjE2LjAwLjAwCi11bnNwc2M3Izc4LjE0LjE3LjAwLjAwI05hdmlnYXRpb25hbCBzZXJ2aWNlcyM3OC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xNy4wMS4wMCNUdWdib2F0IHNlcnZpY2VzIzc4LjE0LjE3LjAwLjAwCi11bnNwc2M3Izc4LjE0LjE3LjAyLjAwI0RyYXdicmlkZ2Ugb3BlcmF0aW9ucyM3OC4xNC4xNy4wMC4wMAotdW5zcHNjNyM3OC4xNC4xOC4wMC4wMCNUZXJtaW5hbCBzZXJ2aWNlcyM3OC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xOC4wMS4wMCNTdGV2ZWRvcmluZyBzZXJ2aWNlcyM3OC4xNC4xOC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xOC4wMi4wMCNWZXNzZWwgZG9ja2luZyBzZXJ2aWNlcyM3OC4xNC4xOC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xOC4wMy4wMCNWZXNzZWwgc3RvcmVzIHNlcnZpY2VzIzc4LjE0LjE4LjAwLjAwCi11bnNwc2M3Izc4LjE0LjE4LjA0LjAwI1Bhcmtpbmcgc3RydWN0dXJlcyM3OC4xNC4xOC4wMC4wMAotdW5zcHNjNyM3OC4xNS4wMC4wMC4wMCNUcmFuc3BvcnQgaW5kdXN0cnkgc3VwcG9ydCBhbmQgbWFpbnRlbmFuY2UgYW5kIHJlcGFpciBzZXJ2aWNlcyM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xNS4wMS4wMC4wMCNQYW5lbCBhbmQgcGFpbnQgc2VydmljZXMjNzguMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTUuMDEuMDEuMDAjUGFuZWxiZWF0aW5nIHNlcnZpY2VzIzc4LjE1LjAxLjAwLjAwCi11bnNwc2M3Izc4LjE1LjAyLjAwLjAwI1RyYW5zcG9ydCBmdWVsbGluZyBhbmQgdmVoaWNsZSBzdG9yYWdlIGFuZCBzdXBwb3J0IHNlcnZpY2VzIzc4LjE1LjAwLjAwLjAwCi11bnNwc2M3Izc4LjE1LjAyLjAxLjAwI0Z1ZWxsaW5nIG9mIHZlaGljbGVzIzc4LjE1LjAyLjAwLjAwCi11bnNwc2M3Izc4LjE1LjAyLjAyLjAwI1RyYW5zcG9ydGF0aW9uIHN0b3JhZ2UjNzguMTUuMDIuMDAuMDAKLXVuc3BzYzcjNzguMTYuMDAuMDAuMDAjUGFuZWwgYW5kIHBhaW50IHNlcnZpY2VzIzc4LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjE3LjAwLjAwLjAwI1BhbmVsYmVhdGluZyBzZXJ2aWNlcyM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xOC4wMC4wMC4wMCNUcmFuc3BvcnRhdGlvbiBvciB2ZWhpY2xlIHJlcGFpciBzZXJ2aWNlcyM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xOC4wMS4wMC4wMCNWZWhpY2xlIHJlcGFpciBzZXJ2aWNlcyM3OC4xOC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xOC4wMS4wMS4wMCNWZWhpY2xlIGJvZHkgcmVwYWlyIG9yIHBhaW50aW5nIHNlcnZpY2VzIzc4LjE4LjAxLjAwLjAwCi11bnNwc2M3Izc4LjE4LjAxLjAyLjAwI1RyYW5zbWlzc2lvbiByZXBhaXIjNzguMTguMDEuMDAuMDAKLXVuc3BzYzcjNzguMTkuMDAuMDAuMDAjVmVoaWNsZSByZXBhaXIgc2VydmljZXMjNzguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTkuMTEuMDAuMDAjVmVoaWNsZSBib2R5IHJlcGFpciBvciBwYWludGluZyBzZXJ2aWNlcyM3OC4xOS4wMC4wMC4wMAotdW5zcHNjNyM3OC4xOS4xMi4wMC4wMCNUcmFuc21pc3Npb24gcmVwYWlyIzc4LjE5LjAwLjAwLjAwCi11bnNwc2M3IzgwLjAwLjAwLjAwLjAwI01hbmFnZW1lbnQgYW5kIEJ1c2luZXNzIFByb2Zlc3Npb25hbHMgYW5kIEFkbWluaXN0cmF0aXZlIFNlcnZpY2VzIzgwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEwLjAwLjAwLjAwI01hbmFnZW1lbnQgYWR2aXNvcnkgc2VydmljZXMjODAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTUuMDAuMDAjQnVzaW5lc3MgYW5kIGNvcnBvcmF0ZSBtYW5hZ2VtZW50IzgwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEwLjE1LjAxLjAwI05ldyBidXNpbmVzcyBzdGFydCB1cCBjb25zdWx0YXRpb24gc2VydmljZXMjODAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTUuMDIuMDAjQ29ycG9yYXRlIG1lcmdlcnMgY29uc3VsdGF0aW9uIHNlcnZpY2VzIzgwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgwLjEwLjE1LjAzLjAwI0NvcnBvcmF0ZSBkaXZlc3RpdHVyZSBjb25zdWx0YXRpb24gc2VydmljZXMjODAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTUuMDQuMDAjU3RyYXRlZ2ljIHBsYW5uaW5nIGNvbnN1bHRhdGlvbiBzZXJ2aWNlcyM4MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNS4wNS4wMCNDb3Jwb3JhdGUgb2JqZWN0aXZlcyBvciBwb2xpY3kgZGV2ZWxvcG1lbnQjODAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTUuMDYuMDAjT3JnYW5pemF0aW9uYWwgc3RydWN0dXJlIGNvbnN1bHRhdGlvbiM4MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNS4wNy4wMCNJbmZvcm1hdGlvbiB0ZWNobm9sb2d5IGNvbnN1bHRhdGlvbiBzZXJ2aWNlcyM4MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNi4wMC4wMCNQcm9qZWN0IG1hbmFnZW1lbnQjODAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTYuMDEuMDAjRmVhc2liaWxpdHkgc3R1ZGllcyBvciBzY3JlZW5pbmcgb2YgcHJvamVjdCBpZGVhcyM4MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNi4wMi4wMCNSZWdpb25hbCBvciBsb2NhdGlvbiBzdHVkaWVzIGZvciBwcm9qZWN0cyM4MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNi4wMy4wMCNFY29ub21pYyBvciBmaW5hbmNpYWwgZXZhbHVhdGlvbiBvZiBwcm9qZWN0cyM4MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNi4wNC4wMCNQcm9qZWN0IGFkbWluaXN0cmF0aW9uIG9yIHBsYW5uaW5nIzgwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEwLjE3LjAwLjAwI0luZHVzdHJpYWwgbWFuYWdlbWVudCM4MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNy4wMS4wMCNGYWN0b3J5IG1hbmFnZW1lbnQgc2VydmljZXMjODAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTcuMDIuMDAjUHJvZHVjdGl2aXR5IG9yIGVmZmljaWVuY3kgc3R1ZGllcyBvciBpbXBsZW1lbnRhdGlvbiM4MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNy4wMy4wMCNTcGVjaWZpY2F0aW9uIHN0YW5kYXJkaXphdGlvbiBzZXJ2aWNlcyM4MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNy4wNC4wMCNTdXBwbHkgY2hhaW4gYW5hbHlzaXMgb3IgcmUgZW5naW5lZXJpbmcgc2VydmljZXMjODAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTcuMDUuMDAjQ28gb3BlcmF0aXZlIG9yIGNvbnNvcnRpdW0gc2VydmljZXMjODAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTcuMDYuMDAjUHJvZmVzc2lvbmFsIHByb2N1cmVtZW50IHNlcnZpY2VzIzgwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzgwLjExLjAwLjAwLjAwI0h1bWFuIHJlc291cmNlcyBzZXJ2aWNlcyM4MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNS4wMC4wMCNIdW1hbiByZXNvdXJjZSBkZXZlbG9wbWVudCM4MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNS4wMS4wMCNNYW5hZ2VtZW50IGRldmVsb3BtZW50IzgwLjExLjE1LjAwLjAwCi11bnNwc2M3IzgwLjExLjE1LjAyLjAwI0NvbXBlbnNhdGlvbiBvciBiZW5lZml0cyBwbGFubmluZyM4MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNS4wMy4wMCNMYWJvciBvciB1bmlvbiByZWxhdGlvbnMjODAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTUuMDQuMDAjTGFib3IgdHJhaW5pbmcgb3IgZGV2ZWxvcG1lbnQjODAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTUuMDUuMDAjSHVtYW4gcmVzb3VyY2VzIHByb2R1Y3Rpdml0eSBhdWRpdHMjODAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTUuMDYuMDAjUGVyc29ubmVsIHJlbG9jYXRpb24jODAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDAuMDAjVGVtcG9yYXJ5IHBlcnNvbm5lbCBzZXJ2aWNlcyM4MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4wMS4wMCNUZW1wb3JhcnkgY2xlcmljYWwgb3IgYWRtaW5zdHJhdGl2ZSBhc3Npc3RhbmNlIzgwLjExLjE2LjAwLjAwCi11bnNwc2M3IzgwLjExLjE2LjAyLjAwI1RlbXBvcmFyeSBtYXJrZXRpbmcgc3RhZmYgbmVlZHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDMuMDAjVGVtcG9yYXJ5IHByb2R1Y3Rpb24gc3RhZmZpbmcgbmVlZHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDQuMDAjVGVtcG9yYXJ5IHRlY2huaWNpYW4gc3RhZmZpbmcgbmVlZHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDUuMDAjVGVtcG9yYXJ5IGZpbmFuY2lhbCBzdGFmZmluZyBuZWVkcyM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4wNi4wMCNUZW1wb3JhcnkgbWVkaWNhbCBzdGFmZmluZyBuZWVkcyM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4wNy4wMCNUZW1wb3JhcnkgbGVnYWwgc3RhZmZpbmcgbmVlZHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDguMDAjVGVtcG9yYXJ5IGluZm9ybWF0aW9uIHRlY2hub2xvZ3kgc29mdHdhcmUgZGV2ZWxvcGVycyM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4wOS4wMCNUZW1wb3JhcnkgaW5mb3JtYXRpb24gdGVjaG5vbG9neSBzeXN0ZW1zIG9yIGRhdGFiYXNlIGFkbWluaXN0cmF0b3JzIzgwLjExLjE2LjAwLjAwCi11bnNwc2M3IzgwLjExLjE2LjEwLjAwI1RlbXBvcmFyeSBpbmZvcm1hdGlvbiB0ZWNobm9sb2d5IG5ldHdvcmtpbmcgc3BlY2lhbGlzdHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMTEuMDAjVGVtcG9yYXJ5IHdhcmVob3VzZSBzdGFmZiM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4xMi4wMCNUZW1wb3JhcnkgZHJpdmVycyM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4xMy4wMCNUZW1wb3JhcnkgbWFudWFsIGxhYm9yIzgwLjExLjE2LjAwLjAwCi11bnNwc2M3IzgwLjExLjE2LjE0LjAwI1RlbXBvcmFyeSBwcm9mZXNzaW9uYWwgc3RhZmYjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMTUuMDAjVGVtcG9yYXJ5IG1hY2hpbmlzdCBwZXJzb25uZWwjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTcuMDAuMDAjUGVyc29ubmVsIHJlY3J1aXRtZW50IzgwLjExLjAwLjAwLjAwCi11bnNwc2M3IzgwLjExLjE3LjAxLjAwI1N0YWZmIHJlY3J1aXRpbmcgc2VydmljZXMjODAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTcuMDIuMDAjUmVmZXJlbmNlIG9yIGJhY2tncm91bmQgY2hlY2sgc2VydmljZXMjODAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTcuMDMuMDAjUmVzdW1lIG9yIGN1cnJpY3VsdW0gdml0YWUgc2NyZWVuaW5nIHNlcnZpY2VzIzgwLjExLjE3LjAwLjAwCi11bnNwc2M3IzgwLjExLjE4LjAwLjAwI0luZm9ybWF0aW9uIHRlY2hub2xvZ3kgY29udHJhY3RvcnMjODAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTguMDEuMDAjVGVtcG9yYXJ5IGluZm9ybWF0aW9uIHRlY2hub2xvZ3kgY29udHJhY3RvcnMjODAuMTEuMTguMDAuMDAKLXVuc3BzYzcjODAuMTIuMDAuMDAuMDAjTGVnYWwgc2VydmljZXMjODAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTUuMDAuMDAjQ3JpbWluYWwgbGF3IHNlcnZpY2VzIzgwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEyLjE1LjAxLjAwI0p1dmVuaWxlIGp1c3RpY2UgbGF3IHNlcnZpY2VzIzgwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE1LjAyLjAwI0FwcGVsbGF0ZSBwcm9jZWR1cmUgc2VydmljZXMjODAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTUuMDMuMDAjRGVmZW5zZSBvciBjcmltaW5hbCBsYXcgc2VydmljZXMjODAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTYuMDAuMDAjQnVzaW5lc3MgbGF3IHNlcnZpY2VzIzgwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEyLjE2LjAxLjAwI0dvdmVybm1lbnQgYW50aXRydXN0IG9yIHJlZ3VsYXRpb25zIGxhdyBzZXJ2aWNlcyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4wMi4wMCNCYW5rcnVwdGN5IGxhdyBzZXJ2aWNlcyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4wMy4wMCNQYXJ0bmVyc2hpcCBsYXcjODAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTYuMDQuMDAjUGF0ZW50IG9yIHRyYWRlbWFyayBvciBjb3B5cmlnaHQgbGF3IzgwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE2LjA1LjAwI0xpcXVpZGF0aW9uIGxhdyBzZXJ2aWNlcyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4wNi4wMCNSZWFsIGVzdGF0ZSBsYXcjODAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTYuMDcuMDAjVGF4YXRpb24gbGF3IzgwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE2LjA4LjAwI01lcmdlcnMgb3IgYWNxdWlzaXRpb25zIGxhdyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4wOS4wMCNMZWdhbCByZXNlYXJjaCBzZXJ2aWNlcyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4xMC4wMCNEZWJ0IGNvbGxlY3Rpb24gbGF3IHNlcnZpY2VzIzgwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE3LjAwLjAwI0NpdmlsIGxpYWJpbGl0eSBzZXJ2aWNlcyM4MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNy4wMS4wMCNNYWxwcmFjdGljZSBvciBuZWdsaWdlbmNlIGxhdyBzZXJ2aWNlcyM4MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNy4wMi4wMCNQZXJzb25hbCBpbmp1cnkgbGF3IHNlcnZpY2VzIzgwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE3LjAzLjAwI1Byb3BlcnR5IGxhdyBzZXJ2aWNlcyM4MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNy4wNC4wMCNDb250cmFjdCBsYXcgc2VydmljZXMjODAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTguMDAuMDAjRmFtaWx5IGxhdyBzZXJ2aWNlcyM4MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMi4xOC4wMS4wMCNEaXZvcmNlIGxhdyBzZXJ2aWNlcyM4MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4MC4xMi4xOC4wMi4wMCNBZG9wdGlvbiBsYXcgc2VydmljZXMjODAuMTIuMTguMDAuMDAKLXVuc3BzYzcjODAuMTIuMTguMDMuMDAjSW1taWdyYXRpb24gb3IgbmF0dXJhbGl6YXRpb24gbGF3IzgwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE4LjA0LjAwI0d1YXJkaWFuc2hpcCBvciBjdXN0b2R5IGxhdyBzZXJ2aWNlcyM4MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4MC4xMy4wMC4wMC4wMCNSZWFsIGVzdGF0ZSBzZXJ2aWNlcyM4MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMy4xNS4wMC4wMCNMZWFzZSBhbmQgcmVudGFsIG9mIHByb3BlcnR5IG9yIGJ1aWxkaW5nIzgwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEzLjE1LjAxLjAwI1Jlc2lkZW50aWFsIHJlbnRhbCM4MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMy4xNS4wMi4wMCNDb21tZXJjaWFsIG9yIGluZHVzdHJpYWwgZmFjaWxpdHkgcmVudGFsIzgwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE1LjAzLjAwI0xhbmQgbGVhc2VzIzgwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE2LjAwLjAwI1NhbGUgb2YgcHJvcGVydHkgYW5kIGJ1aWxkaW5nIzgwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEzLjE2LjAxLjAwI1JlYWwgZXN0YXRlIGJyb2tlcnMgb3IgYWdlbnRzIzgwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE2LjAyLjAwI1JlYWwgZXN0YXRlIGF1Y3Rpb24jODAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTMuMTYuMDMuMDAjU2FsZSBvZiByZXNpZGVudGlhbCBsYW5kIzgwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE2LjA0LjAwI1NhbGUgb2YgY29tbWVyY2lhbCBvciBpbmR1c3RyaWFsIGxhbmQjODAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTMuMTYuMDUuMDAjU2FsZSBvZiBjb21tZXJjaWFsIGJ1aWxkaW5nIzgwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE3LjAwLjAwI0VzY3JvdyBhbmQgdGl0bGUgc2VydmljZXMjODAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTMuMTcuMDEuMDAjVGl0bGUgcmVjb252ZXlhbmNlIHNlcnZpY2VzIzgwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE3LjAyLjAwI1RpdGxlIHNlYXJjaCBzZXJ2aWNlcyM4MC4xMy4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMy4xNy4wMy4wMCNFc2Nyb3cgYWNjb3VudCBzZXJ2aWNlcyM4MC4xMy4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMy4xOC4wMC4wMCNSZWFsIGVzdGF0ZSBtYW5hZ2VtZW50IHNlcnZpY2VzIzgwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEzLjE4LjAxLjAwI1Byb3BlcnR5IG1hbmFnZW1lbnQjODAuMTMuMTguMDAuMDAKLXVuc3BzYzcjODAuMTMuMTguMDIuMDAjUmVhbCBlc3RhdGUgYXBwcmFpc2FsIHNlcnZpY2VzIzgwLjEzLjE4LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE4LjAzLjAwI1JlYWwgZXN0YXRlIGxpc3Rpbmcgc2VydmljZXMjODAuMTMuMTguMDAuMDAKLXVuc3BzYzcjODAuMTQuMDAuMDAuMDAjTWFya2V0aW5nIGFuZCBkaXN0cmlidXRpb24jODAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTUuMDAuMDAjTWFya2V0IHJlc2VhcmNoIzgwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE0LjE1LjAxLjAwI01hcmtldGluZyBhbmFseXNpcyM4MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNS4wMi4wMCNEaXN0cmlidXRpdmUgb3Igc2VydmljZSB0cmFkZSBzdGF0aXN0aWNzIzgwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE1LjAzLjAwI0NvbW1vZGl0eSBwcmljZSBmb3JlY2FzdGluZyM4MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNS4wNC4wMCNQcmVwYXJhdGlvbiBvZiBjb21tb2RpdHkgbWFya2V0IHN1cnZleXMjODAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTUuMDUuMDAjTWFya2V0aW5nIHBsYW5zIzgwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE1LjA2LjAwI0ludGVybmV0IGJhc2VkIG1hcmtldCByZXNlYXJjaCM4MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNi4wMC4wMCNTYWxlcyBhbmQgYnVzaW5lc3MgcHJvbW90aW9uIGFjdGl2aXRpZXMjODAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTYuMDEuMDAjU2FsZXMgcHJvbW90aW9uIHNlcnZpY2VzIzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjAyLjAwI1B1YmxpYyByZWxhdGlvbiBzZXJ2aWNlcyM4MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNi4wMy4wMCNUZWxlbWFya2V0aW5nIzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjA0LjAwI0JyYW5kaW5nIG9mIHByb2R1Y3QgbmFtaW5nIHNlcnZpY2VzIzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjA1LjAwI1Byb21vdGlvbmFsIG1lcmNoYW5kaXNlIzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjA2LjAwI0RpcmVjdCBtYXJrZXRpbmcgZnVsZmlsbG1lbnQjODAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTYuMDcuMDAjRXZlbnRzIG1hbmFnZW1lbnQjODAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTYuMDguMDAjTGV0dGVyIHNob3Agc2VydmljZXMjODAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTYuMDkuMDAjU3BvbnNvcnNoaXAgb2YgZXZlbnQgb3IgY2VsZWJyaXR5IzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjEwLjAwI0Nsb3NlIG91dHMjODAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTcuMDAuMDAjRGlzdHJpYnV0aW9uIzgwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE0LjE3LjAxLjAwI0RpcmVjdCBzYWxlcyBzZXJ2aWNlcyM4MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNy4wMi4wMCNXaG9sZXNhbGUgZGlzdHJpYnV0aW9uIHNlcnZpY2VzIzgwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE3LjAzLjAwI1JldGFpbCBkaXN0cmlidXRpb24gc2VydmljZXMjODAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTcuMDQuMDAjRnJhbmNoaXNlIG9wZXJhdGlvbnMjODAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTcuMDUuMDAjQXVjdGlvbiBzZXJ2aWNlcyM4MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM4MC4xNC4xOC4wMC4wMCNNYWlsaW5nIHNlcnZpY2VzIzgwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE0LjE4LjAxLjAwI01haWxpbmcgbGlzdCBjb21waWxhdGlvbiBzZXJ2aWNlcyM4MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM4MC4xNC4xOC4wMi4wMCNNYWlsaW5nIGxpc3QgbWFuYWdlbWVudCBzZXJ2aWNlIzgwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE4LjAzLjAwI0FkZHJlc3Npbmcgc2VydmljZSM4MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM4MC4xNS4wMC4wMC4wMCNUcmFkZSBwb2xpY3kgYW5kIHNlcnZpY2VzIzgwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgwLjE1LjE1LjAwLjAwI1RyYWRlIGZhY2lsaXRhdGlvbiM4MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNS4wMS4wMCNDb21tb2RpdHkgcG9saWN5IG9yIHByb2plY3Rpb25zIHNlcnZpY2VzIzgwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE1LjE1LjAyLjAwI1RyYWRlIGV4cGFuc2lvbiM4MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNS4wMy4wMCNUcmFkZSBpbmZvcm1hdGlvbiBzZXJ2aWNlcyM4MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNS4wNC4wMCNUcmFkZSBwcm9tb3Rpb24gc2VydmljZXMjODAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTUuMTUuMDUuMDAjTXVsdGluYXRpb25hbCBtYXJrZXRpbmcgZW50ZXJwcmlzZXMjODAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTUuMTYuMDAuMDAjSW50ZXJuYXRpb25hbCB0cmFkZSBzZXJ2aWNlcyM4MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNi4wMS4wMCNFeHBvcnQgZGV2ZWxvcG1lbnQjODAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTUuMTYuMDIuMDAjSW1wb3J0IHBsYW5uaW5nIzgwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE1LjE2LjAzLjAwI0V4cG9ydCBwcm9qZWN0aW9ucyM4MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNi4wNC4wMCNJbXBvcnQgcHJvY3VyZW1lbnQgc2VydmljZXMjODAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTYuMDAuMDAuMDAjQnVzaW5lc3MgYWRtaW5pc3RyYXRpb24gc2VydmljZXMjODAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTYuMTUuMDAuMDAjTWFuYWdlbWVudCBzdXBwb3J0IHNlcnZpY2VzIzgwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE2LjE1LjAxLjAwI09mZmljZSBhZG1pbmlzdHJhdGlvbiBvciBzZWNyZXRhcmlhbCBzZXJ2aWNlcyM4MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNi4xNS4wMi4wMCNNZWV0aW5nIHBsYW5uaW5nIHNlcnZpY2VzIzgwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE2LjE1LjAzLjAwI0tleWJvYXJkIGVudHJ5IHNlcnZpY2VzIzgwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE2LjE1LjA0LjAwI0NsZXJpY2FsIHNlcnZpY2VzIzgwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE2LjE1LjA1LjAwI0ZsZWV0IG1hbmFnZW1lbnQgc2VydmljZXMjODAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTYuMTUuMDYuMDAjRGF0YSBhcmNoaXZpbmcgc2VydmljZXMjODAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTYuMTUuMDcuMDAjQXVkaW8gdmlzdWFsIHNlcnZpY2VzIzgwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE2LjE2LjAwLjAwI0J1c2luZXNzIGZhY2lsaXRpZXMgb3ZlcnNpZ2h0IzgwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE2LjE2LjAxLjAwI1Byb3BlcnR5IG1hbmFnbWVudCBzZXJ2aWNlcyM4MC4xNi4xNi4wMC4wMAotdW5zcHNjNyM4MS4wMC4wMC4wMC4wMCNFbmdpbmVlcmluZyBhbmQgUmVzZWFyY2ggYW5kIFRlY2hub2xvZ3kgQmFzZWQgU2VydmljZXMjODEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMDAuMDAuMDAjUHJvZmVzc2lvbmFsIGVuZ2luZWVyaW5nIHNlcnZpY2VzIzgxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjAwLjAwI0NpdmlsIGVuZ2luZWVyaW5nIzgxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjAxLjAwI1dlbGwgZW5naW5lZXJpbmcjODEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTUuMDIuMDAjVGVjaG5pY2FsIGRyYXdpbmcjODEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTUuMDMuMDAjSGFyYm9yIG9yIHdhdGVyIHBvcnRzIGVuZ2luZWVyaW5nIzgxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjA1LjAwI1N0cnVjdHVyYWwgZW5naW5lZXJpbmcjODEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTUuMDYuMDAjTmF2YWwgYXJjaGl0ZWN0dXJlIzgxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjA3LjAwI0RhbSBlbmdpbmVlcmluZyM4MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMC4xNS4wOC4wMCNBcmNoaXRlY3R1cmFsIGVuZ2luZWVyaW5nIzgxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjA5LjAwI0FpcnBvcnQgZW5naW5lZXJpbmcjODEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTUuMTAuMDAjSGlnaHdheSBlbmdpbmVlcmluZyM4MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMC4xNS4xMS4wMCNSYWlsd2F5IGVuZ2luZWVyaW5nIzgxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE2LjAwLjAwI01lY2hhbmljYWwgZW5naW5lZXJpbmcjODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTYuMDEuMDAjTWVjaGFuaWNhbCBkcmF3aW5nIzgxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE2LjAyLjAwI01lY2hhbmljYWwgcHJvZHVjdCBlbmNsb3N1cmVzIGRlc2lnbiM4MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMC4xNi4wMy4wMCNNYWNoaW5lIHRvb2wgZGVzaWduIzgxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE2LjA0LjAwI1Bvd2VyIHRyYW5zbWlzc2lvbiBkZXNpZ24jODEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTcuMDAuMDAjRWxlY3RyaWNhbCBhbmQgZWxlY3Ryb25pYyBlbmdpbmVlcmluZyM4MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMC4xNy4wMS4wMCNFbGVjdHJpY2FsIGVuZ2luZWVyaW5nIHNlcnZpY2VzIzgxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE3LjAyLjAwI0VsZWN0cm9uaWMgY2lyY3VpdCBkZXNpZ24jODEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTguMDAuMDAjQ2hlbWljYWwgZW5naW5lZXJpbmcjODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTguMDEuMDAjUGxhc3RpY3MgZW5naW5lZXJpbmcjODEuMTAuMTguMDAuMDAKLXVuc3BzYzcjODEuMTAuMTkuMDAuMDAjT2lsIGFuZCBnYXMgZW5naW5lZXJpbmcjODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTkuMDEuMDAjRHJpbGxpbmcgZW5naW5lZXJpbmcgZm9yIG9pbCBvciBnYXMjODEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTkuMDIuMDAjUHJvZHVjdGlvbiBlbmdpbmVlcmluZyBmb3Igb2lsIG9yIGdhcyM4MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM4MS4xMC4xOS4wMy4wMCNSZXNlcnZvaXIgZW5naW5lZXJpbmcgZm9yIG9pbCBvciBnYXMjODEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjODEuMTAuMjAuMDAuMDAjTWluaW5nIGVuZ2luZWVyaW5nIzgxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEwLjIwLjAxLjAwI0h5ZHJhdWxpYyBtaW5pbmcjODEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMjEuMDAuMDAjT2NlYW4gZW5naW5lZXJpbmcjODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMjEuMDEuMDAjQ29hc3RhbCBlbmdpbmVlcmluZyM4MS4xMC4yMS4wMC4wMAotdW5zcHNjNyM4MS4xMC4yMi4wMC4wMCNUcmFuc3BvcnRhdGlvbiBlbmdpbmVlcmluZyM4MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMC4yMi4wMS4wMCNUcmFmZmljIGVuZ2luZWVyaW5nIzgxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzgxLjEwLjIyLjAyLjAwI1VyYmFuIHRyYW5zcG9ydCBuZXR3b3JrIzgxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzgxLjEwLjIyLjAzLjAwI0lubGFuZCB3YXRlcndheXMjODEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjODEuMTAuMjMuMDAuMDAjQWVyb25hdXRpY2FsIGVuZ2luZWVyaW5nIzgxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEwLjIzLjAxLjAwI0F2aW9uaWNzIGRlc2lnbiM4MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM4MS4xMC4yNC4wMC4wMCNBdmlvbmljcyBkZXNpZ24jODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMDAuMDAuMDAjQ29tcHV0ZXIgc2VydmljZXMjODEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDAuMDAjU29mdHdhcmUgb3IgaGFyZHdhcmUgZW5naW5lZXJpbmcjODEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDEuMDAjTWFpbmZyYW1lIHNvZnR3YXJlIGFwcGxpY2F0aW9ucyBkZXNpZ24jODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDIuMDAjUGVyc29uYWwgY29tcHV0ZXIgKFBDKSBhcHBsaWNhdGlvbiBkZXNpZ24jODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDMuMDAjU3lzdGVtcyBpbnRlZ3JhdGlvbiBkZXNpZ24jODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDQuMDAjQXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgc2VydmljZXMjODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDUuMDAjT3BlcmF0aW5nIHN5c3RlbSBwcm9ncmFtbWluZyBzZXJ2aWNlcyM4MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNS4wNi4wMCNDbGllbnQgb3Igc2VydmVyIHByb2dyYW1taW5nIHNlcnZpY2VzIzgxLjExLjE1LjAwLjAwCi11bnNwc2M3IzgxLjExLjE1LjA3LjAwI0VSUCBvciBkYXRhYmFzZSBhcHBsaWNhdGlvbnMgcHJvZ3JhbW1pbmcgc2VydmljZXMjODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDguMDAjQXBwbGljYXRpb24gaW1wbGVtZW50YXRpb24gc2VydmljZXMjODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDkuMDAjSW50ZXJuZXQgb3IgaW50cmFuZXQgY2xpZW50IGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHNlcnZpY2VzIzgxLjExLjE1LjAwLjAwCi11bnNwc2M3IzgxLjExLjE1LjEwLjAwI0ludGVybmV0IG9yIGludHJhbmV0IHNlcnZlciBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCBzZXJ2aWNlcyM4MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNS4xMS4wMCNIdW1hbiByZXNvdXJjZXMgcHJvZHVjdGl2aXR5IGF1ZGl0cyM4MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNi4wMC4wMCNDb21wdXRlciBwcm9ncmFtbWVycyM4MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNi4wMS4wMCNQcm9ncmFtbWluZyBmb3IgVmlzdWFsIEJhc2ljIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjAyLjAwI1Byb2dyYW1taW5nIGZvciBKYXZhIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjAzLjAwI1Byb2dyYW1taW5nIGZvciBIVE1MIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjA0LjAwI1Byb2dyYW1taW5nIGZvciBBTEdPTCM4MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNi4wNS4wMCNQcm9ncmFtbWluZyBmb3IgQXNzZW1ibGVyIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjA2LjAwI1Byb2dyYW1taW5nIGZvciBCYXNpYyM4MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNi4wNy4wMCNQcm9ncmFtbWluZyBmb3IgQyBvciBDKysjODEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTYuMDguMDAjUHJvZ3JhbW1pbmcgZm9yIENPQk9MIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjA5LjAwI1Byb2dyYW1taW5nIGZvciBGT1JUUkFOIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjEwLjAwI1Byb2dyYW1taW5nIGZvciBQYXNjYWwjODEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTYuMTEuMDAjUHJvZ3JhbW1pbmcgZm9yIFBMLzEjODEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTYuMTIuMDAjUHJvZ3JhbW1pbmcgb3IgUHJvcHJpZXRhcnkgTGFuZ3VhZ2VzIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE3LjAwLjAwI01hbmFnZW1lbnQgaW5mb3JtYXRpb24gc3lzdGVtcyAoTUlTKSM4MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNy4wMS4wMCNXaWRlIGFyZWEgbmV0d29yayBjb21tdW5pY2F0aW9ucyBkZXNpZ24jODEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTcuMDIuMDAjTG9jYWwgYXJlYSBuZXR3b3JrIGNvbW11bmljYXRpb25zIGRlc2lnbiM4MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNy4wMy4wMCNFbGVjdHJvbmljIGRhdGEgaW50ZXJjaGFuZ2UgKEVESSkgZGVzaWduIzgxLjExLjE3LjAwLjAwCi11bnNwc2M3IzgxLjExLjE3LjA0LjAwI0RhdGFiYXNlIGRlc2lnbiM4MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNy4wNS4wMCNTeXN0ZW1zIGFyY2hpdGVjdHVyZSM4MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4wMC4wMCNTeXN0ZW0gYWRtaW5pc3RyYXRvcnMjODEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDEuMDAjQ29tcHV0ZXIgb3IgbmV0d29yayBvciBpbnRlcm5ldCBzZWN1cml0eSM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4wMi4wMCNNYWluZnJhbWUgYWRtaW5pc3RyYXRpb24gc2VydmljZXMjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDMuMDAjTG9jYWwgYXJlYSBuZXR3b3JrIChMQU4pIG1haW50ZW5hbmNlIG9yIHN1cHBvcnQjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDQuMDAjV2lkZSBhcmVhIG5ldHdvcmsgKFdBTikgbWFpbnRlbmFuY2Ugb3Igc3VwcG9ydCM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4wNS4wMCNQcm9wcmlldGFyeSBvciBsaWNlbnNlZCBzeXN0ZW1zIG1haW50ZW5hbmNlIG9yIHN1cHBvcnQjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDYuMDAjRGF0YWJhc2UgYW5hbHlzaXMjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDcuMDAjRGF0YSBzdG9yYWdlIzgxLjExLjE4LjAwLjAwCi11bnNwc2M3IzgxLjExLjE4LjA4LjAwI1N5c3RlbXMgYW5hbHlzaXMjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDkuMDAjU3lzdGVtIGluc3RhbGxhdGlvbiM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4xMC4wMCNTb2Z0d2FyZSBjb2RpbmcjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMTEuMDAjVGVjaG5pY2FsIHN1cHBvcnQgb3IgaGVscCBkZXNrIHNlcnZpY2VzIzgxLjExLjE4LjAwLjAwCi11bnNwc2M3IzgxLjExLjE4LjEyLjAwI0NvbXB1dGVyIGhhcmR3YXJlIG1haW50ZW5hbmNlIG9yIHN1cHBvcnQjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMTMuMDAjQ29tcHV0ZXIgc29mdHdhcmUgbWFpbnRlbmFuY2Ugb3Igc3VwcG9ydCM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4xNC4wMCNDbyBsb2NhdGlvbiBzZXJ2aWNlIzgxLjExLjE4LjAwLjAwCi11bnNwc2M3IzgxLjExLjE4LjE1LjAwI1ByaW50ZXIgbWFpbnRlbmFuY2UgYW5kIHN1cHBvcnQgc2VydmljZXMjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMTYuMDAjTWFpbmZyYW1lIGNvbXB1dGVyIG1haW50ZW5hbmNlIG9yIHN1cHBvcnQjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMTcuMDAjVGVsZWNvbSBlcXVpcG1lbnQgbWFpbnRlbmFuY2Ugb3Igc3VwcG9ydCM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOS4wMC4wMCNJbmZvcm1hdGlvbiByZXRyaWV2YWwgc3lzdGVtcyM4MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOS4wMS4wMCNEYXRhYmFzZSBpbmZvcm1hdGlvbiByZXRyaWV2YWwjODEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTkuMDIuMDAjT24gbGluZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiByZXRyaWV2YWwjODEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTkuMDMuMDAjUmVtb3RlIGRhdGFiYXNlIGluZm9ybWF0aW9uIHJldHJpZXZhbCM4MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMC4wMC4wMCNEYXRhIHNlcnZpY2VzIzgxLjExLjAwLjAwLjAwCi11bnNwc2M3IzgxLjExLjIwLjAxLjAwI09uIGxpbmUgZGF0YSBwcm9jZXNzaW5nIzgxLjExLjIwLjAwLjAwCi11bnNwc2M3IzgxLjExLjIwLjAyLjAwI0RhdGEgcHJvY2Vzc2luZyBvciBwcmVwYXJhdGlvbiBzZXJ2aWNlcyM4MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMC4wMy4wMCNEYXRhIGNlbnRlciBzZXJ2aWNlcyM4MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMC4wNC4wMCNEaXNhc3RlciByZWNvdmVyeSBzZXJ2aWNlcyM4MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMC4wNS4wMCNEb2N1bWVudCBzY2FubmluZyBzZXJ2aWNlIzgxLjExLjIwLjAwLjAwCi11bnNwc2M3IzgxLjExLjIwLjA2LjAwI0RhdGEgc3RvcmFnZSBzZXJ2aWNlIzgxLjExLjIwLjAwLjAwCi11bnNwc2M3IzgxLjExLjIwLjA3LjAwI0NvbnRlbnQgb3IgZGF0YSBzdGFuZGFyZGl6YXRpb24gc2VydmljZXMjODEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDAuMDAjSW50ZXJuZXQgc2VydmljZXMjODEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDEuMDAjSW50ZXJuZXQgc2VydmljZSBwcm92aWRlcnMgKElTUCkjODEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDIuMDAjRWxlY3Ryb25pYyBtYWlsIHNlcnZpY2UgcHJvdmlkZXIjODEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDMuMDAjV29ybGQgd2lkZSB3ZWIgKFdXVykgc2l0ZSBkZXNpZ24gc2VydmljZXMjODEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDQuMDAjV2ViIHNlYXJjaCBlbmdpbmUgcHJvdmlkZXJzIzgxLjExLjIxLjAwLjAwCi11bnNwc2M3IzgxLjExLjIxLjA1LjAwI1dvcmxkIHdpZGUgd2ViIChXV1cpIHNpdGUgb3BlcmF0aW9uIChob3N0KSBzZXJ2aWNlcyM4MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMS4wNi4wMCNBcHBsaWNhdGlvbiBzZXJ2aWNlIHByb3ZpZGVycyM4MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMS4wNy4wMCNJbnRlcm5ldCBkb21haW4gbmFtZXMjODEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjIuMDAuMDAjU29mdHdhcmUgbWFpbnRlbmFuY2UgYW5kIHN1cHBvcnQjODEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjIuMDEuMDAjTWFpbnRlbmFuY2UgYW5kIHN1cHBvcnQgZmVlcyM4MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMi4wMi4wMCNTb2Z0d2FyZSBwYXRjaGVzIG9yIHVwZ3JhZGVzIzgxLjExLjIyLjAwLjAwCi11bnNwc2M3IzgxLjEyLjAwLjAwLjAwI0Vjb25vbWljcyM4MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNS4wMC4wMCNFY29ub21pYyBhbmFseXNpcyM4MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNS4wMS4wMCNNYWNybyBlY29ub21pYyBhbmFseXNpcyM4MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNS4wMi4wMCNNaWNybyBlY29ub21pYyBhbmFseXNpcyM4MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNS4wMy4wMCNFY29ub21ldHJpY3MjODEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTIuMTUuMDQuMDAjRWNvbm9taWMgZm9yZWNhc3RzIzgxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEyLjE2LjAwLjAwI01vbmV0YXJ5IHN5c3RlbXMgYW5kIGlzc3VlcyM4MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNi4wMS4wMCNNb25ldGFyeSBwb2xpY3kjODEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTIuMTYuMDIuMDAjTW9uZXRhcnkgc3lzdGVtcyM4MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNi4wMy4wMCNNb25ldGFyeSBhbmFseXNpcyM4MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNi4wNC4wMCNNb25ldGFyeSBsaXF1aWRpdHkjODEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTIuMTYuMDUuMDAjUHJlY2lvdXMgbWV0YWxzIHJlc2VydmVzIzgxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgxLjEyLjE2LjA2LjAwI0ZvcmVpZ24gZXhjaGFuZ2UgY29udHJvbCM4MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNi4wNy4wMCNDdXJyZW5jeSBleGNoYW5nZSBtYXJrZXRzIzgxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgxLjEzLjAwLjAwLjAwI1N0YXRpc3RpY3MjODEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTMuMTUuMDAuMDAjTWV0aG9kb2xvZ3kgYW5kIGFuYWx5c2lzIzgxLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEzLjE1LjAxLjAwI0ZhY3RvciBhbmFseXNpcyM4MS4xMy4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMy4xNS4wMi4wMCNNdWx0aXZhcmlhdGUgYW5hbHlzaXMjODEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTMuMTUuMDMuMDAjUmVncmVzc2lvbiBhbmFseXNpcyM4MS4xMy4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMy4xNS4wNC4wMCNTYW1wbGluZyBzdXJ2ZXlzIzgxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEzLjE1LjA1LjAwI1RpbWUgc2VyaWVzIGFuYWx5c2lzIzgxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjAwLjAwLjAwI01hbnVmYWN0dXJpbmcgdGVjaG5vbG9naWVzIzgxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjAwLjAwI1F1YWxpdHkgY29udHJvbCM4MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNS4wMS4wMCNNYXRlcmlhbHMgdGVzdGluZyM4MS4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNS4wMi4wMCNNYXRlcmlhbHMgc3ludGhlc2lzIzgxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjAzLjAwI01hdGVyaWFscyBpbnNwZWN0aW9uIzgxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjA0LjAwI0VxdWlwbWVudCB0ZXN0IG9yIGNhbGlicmF0aW9uIzgxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjA1LjAwI1Byb2R1Y3Rpb24gc3RhbmRhcmRzIGRldmVsb3BtZW50IzgxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjA2LjAwI1Byb2R1Y3QgdGVzdGluZyM4MS4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNi4wMC4wMCNTdXBwbHkgY2hhaW4gbWFuYWdlbWVudCM4MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNi4wMS4wMCNMb2dpc3RpY3MjODEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTYuMDIuMDAjVHJhbnNpdCBhbmFseXNpcyM4MS4xNC4xNi4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNi4wMy4wMCNUcmFuc3BvcnQgZmluYW5jZSBvciBlY29ub21pY3MjODEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTYuMDQuMDAjVHJhbnNwb3J0IGZhY2lsaXRhdGlvbiM4MS4xNC4xNi4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNi4wNS4wMCNUcmFuc3BvcnQgaW5mcmFzdHJ1Y3R1cmUjODEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTYuMDYuMDAjVHJhbnNwb3J0IHBsYW5uaW5nIzgxLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE3LjAwLjAwI1Byb2R1Y3Rpb24gcGxhbm5pbmcgYW5kIGNvbnRyb2wjODEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTcuMDEuMDAjUHJvZHVjdGlvbiBwbGFubmluZyM4MS4xNC4xNy4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNy4wMi4wMCNQcm9kdWN0aW9uIGNvbnRyb2wjODEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTcuMDMuMDAjUHJvZHVjdGlvbiBzY2hlZHVsaW5nIzgxLjE0LjE3LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE3LjA0LjAwI1Byb2R1Y3Rpb24gc3RhdGlzdGljcyBjb2xsZWN0aW9uIG9yIGFuYWx5c2lzIHNlcnZpY2VzIzgxLjE0LjE3LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE4LjAwLjAwI0ZhY2lsaXRpZXMgbWFuYWdlbWVudCM4MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xOC4wMS4wMCNTYWZldHkgb3IgcmlzayBhbmFseXNpcyM4MS4xNC4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xOC4wMi4wMCNJbmR1c3RyaWFsIGh5Z2llbmUgb3IgdmVudGlsYXRpb24jODEuMTQuMTguMDAuMDAKLXVuc3BzYzcjODEuMTQuMTguMDMuMDAjQWNvdXN0aWNzIG9yIG5vaXNlIGNvbnRyb2wjODEuMTQuMTguMDAuMDAKLXVuc3BzYzcjODEuMTQuMTguMDQuMDAjRXF1aXBtZW50IGluc3BlY3Rpb24gc2VydmljZSM4MS4xNC4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xOC4wNS4wMCNCdWlsZGluZyBpbnNwZWN0aW9uIHNlcnZpY2UjODEuMTQuMTguMDAuMDAKLXVuc3BzYzcjODEuMTQuMTguMDYuMDAjUG93ZXIgbGluZSBpbnNwZWN0aW9uIHNlcnZpY2UjODEuMTQuMTguMDAuMDAKLXVuc3BzYzcjODEuMTQuMTguMDcuMDAjUGx1bWJpbmcgb3Igc2V3ZXIgaW5zcGVjdGlvbiBzZXJ2aWNlIzgxLjE0LjE4LjAwLjAwCi11bnNwc2M3IzgxLjE1LjAwLjAwLjAwI0VhcnRoIHNjaWVuY2Ugc2VydmljZXMjODEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTUuMDAuMDAjTWV0ZW9yb2xvZ3kjODEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTUuMDEuMDAjQ2xpbWF0b2xvZ3kjODEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTUuMDIuMDAjTWV0ZW9yb2xvZ2ljYWwgc2VydmljZXMjODEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTUuMDMuMDAjSHlkcm9tZXRlb3JvbG9neSM4MS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4MS4xNS4xNi4wMC4wMCNDYXJ0b2dyYXBoeSM4MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xNi4wMS4wMCNNYXBwaW5nIzgxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE2LjAyLjAwI01hcCBwcm9kdWN0aW9uIzgxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE2LjAzLjAwI1Bob3RvZ3JhbW1ldHJ5IzgxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE2LjA0LjAwI0xhbmQgc3VydmV5aW5nIzgxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE3LjAwLjAwI0dlb2xvZ3kjODEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTcuMDEuMDAjUGhvdG9nZW9sb2d5IzgxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE3LjAyLjAwI1N0cmF0aWdyYXBoaWMgZ2VvbG9neSM4MS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xNS4xNy4wMy4wMCNHZW9sb2dpY2FsIHN1cnZleXMjODEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTcuMDQuMDAjR2VvbG9naWNhbCBleHBsb3JhdGlvbiM4MS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xNS4xNy4wNS4wMCNBcmNoYWVvbG9naWNhbCBzZXJ2aWNlcyM4MS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wMC4wMCNPY2Vhbm9ncmFwaHkgYW5kIGh5ZHJvbG9neSM4MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wMS4wMCNPY2Vhbm9ncmFwaGljIHN1cnZleSM4MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wMi4wMCNFc3R1YXJpbmUgb2NlYW5vZ3JhcGh5IzgxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE4LjAzLjAwI1BoeXNpY2FsIG9jZWFub2dyYXBoeSM4MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wNC4wMCNIeWRyb2xvZ2ljYWwgc3VydmV5cyM4MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wNS4wMCNCYXRoeW1ldHJpYyBzdXJ2ZXlzIzgxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE4LjA2LjAwI1VuZGVyd2F0ZXIgZXhwbG9yYXRpb24jODEuMTUuMTguMDAuMDAKLXVuc3BzYzcjODEuMTUuMTkuMDAuMDAjR2VvcGh5c2ljcyM4MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOS4wMS4wMCNHZW9waHlzaWNhbCBzdXJ2ZXlzIzgxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE5LjAyLjAwI0dlb3BoeXNpY2FsIGV4cGxvcmF0aW9uIzgxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE5LjAzLjAwI0dlb3BoeXNpY2FsIHBob3RvIGludGVycHJldGF0aW9uIzgxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE5LjA0LjAwI0Flcm8gbWFnbmV0aWMgZ2VvcGh5c2ljcyM4MS4xNS4xOS4wMC4wMAotdW5zcHNjNyM4Mi4wMC4wMC4wMC4wMCNFZGl0b3JpYWwgYW5kIERlc2lnbiBhbmQgR3JhcGhpYyBhbmQgRmluZSBBcnQgU2VydmljZXMjODIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTAuMDAuMDAuMDAjQWR2ZXJ0aXNpbmcjODIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTUuMDAuMDAjUHJpbnQgYWR2ZXJ0aXNpbmcjODIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTUuMDEuMDAjQmlsbGJvYXJkIGFkdmVydGlzaW5nIzgyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE1LjAyLjAwI1Bvc3RlciBhZHZlcnRpc2luZyM4Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNS4wMy4wMCNNYWdhemluZSBhZHZlcnRpc2luZyM4Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNS4wNC4wMCNOZXdzcGFwZXIgYWR2ZXJ0aXNpbmcjODIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTUuMDUuMDAjSGFuZGJpbGwgb3IgY291cG9uIGFkdmVydGlzaW5nIzgyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE1LjA2LjAwI1RyYW5zaXQgYWR2ZXJ0aXNpbmcgc2VydmljZXMjODIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTUuMDcuMDAjU2hvcHBpbmcgbmV3cyBvciBhZHZlcnRpc2luZyBvciBkaXN0cmlidXRpb24gc2VydmljZSM4Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNS4wOC4wMCNZZWxsb3cgIHBhZ2VzIGFkdmVydGlzaW5nIzgyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE2LjAwLjAwI0Jyb2FkY2FzdCBhZHZlcnRpc2luZyM4Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNi4wMS4wMCNSYWRpbyBhZHZlcnRpc2luZyM4Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNi4wMi4wMCNUZWxldmlzaW9uIGFkdmVydGlzaW5nIzgyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE2LjAzLjAwI0ludGVybmV0IGFkdmVydGlzaW5nIzgyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE3LjAwLjAwI0FlcmlhbCBhZHZlcnRpc2luZyM4Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNy4wMS4wMCNCYW5uZXIgYWR2ZXJ0aXNpbmcgc2VydmljZXMjODIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTcuMDIuMDAjU2t5d3JpdGluZyBhZHZlcnRpc2luZyBzZXJ2aWNlcyM4Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xOC4wMC4wMCNBZHZlcnRpc2luZyBhZ2VuY3kgc2VydmljZXMjODIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTguMDEuMDAjQWR2ZXJ0aXNpbmcgY2FtcGFpZ24gc2VydmljZXMjODIuMTAuMTguMDAuMDAKLXVuc3BzYzcjODIuMTEuMDAuMDAuMDAjV3JpdGluZyBhbmQgdHJhbnNsYXRpb25zIzgyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgyLjExLjE1LjAwLjAwI1RlY2huaWNhbCB3cml0aW5nIzgyLjExLjAwLjAwLjAwCi11bnNwc2M3IzgyLjExLjE1LjAxLjAwI0luc3RydWN0aW9uIHdyaXRpbmcgc2VydmljZXMjODIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTUuMDIuMDAjTWFudWFsIHdyaXRpbmcgc2VydmljZXMjODIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTUuMDMuMDAjQWNhZGVtaWMgb3Igc2NpZW50aWZpYyBhcnRpY2xlIHdyaXRpbmcjODIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTYuMDAuMDAjTm9uIHRlY2huaWNhbCB3cml0aW5nIzgyLjExLjAwLjAwLjAwCi11bnNwc2M3IzgyLjExLjE2LjAxLjAwI0xldHRlciB3cml0aW5nIHNlcnZpY2VzIzgyLjExLjE2LjAwLjAwCi11bnNwc2M3IzgyLjExLjE2LjAyLjAwI1Jlc3VtZSB3cml0aW5nIHNlcnZpY2VzIzgyLjExLjE2LjAwLjAwCi11bnNwc2M3IzgyLjExLjE2LjAzLjAwI0NvdXJ0IHJlcG9ydGluZyBzZXJ2aWNlcyM4Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMS4xNi4wNC4wMCNUcmFuc2NyaWJpbmcgc2VydmljZXMjODIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTcuMDAuMDAjQ3JlYXRpdmUgd3JpdGluZyM4Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMS4xNy4wMS4wMCNBcnRpY2xlIHdyaXRlcnMgc2VydmljZXMjODIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTcuMDIuMDAjQm9vayBhdXRob3JzIHNlcnZpY2VzIzgyLjExLjE3LjAwLjAwCi11bnNwc2M3IzgyLjExLjE3LjAzLjAwI1BvZXRyeSBhdXRob3JzIHNlcnZpY2VzIzgyLjExLjE3LjAwLjAwCi11bnNwc2M3IzgyLjExLjE3LjA0LjAwI0NvcHl3cml0aW5nIzgyLjExLjE3LjAwLjAwCi11bnNwc2M3IzgyLjExLjE3LjA1LjAwI1NwZWVjaCB3cml0aW5nIzgyLjExLjE3LjAwLjAwCi11bnNwc2M3IzgyLjExLjE4LjAwLjAwI0VkaXRvcmlhbCBhbmQgc3VwcG9ydCBzZXJ2aWNlcyM4Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMS4xOC4wMS4wMCNFZGl0aW5nIHNlcnZpY2VzIzgyLjExLjE4LjAwLjAwCi11bnNwc2M3IzgyLjExLjE4LjAyLjAwI0ZhY3QgY2hlY2tpbmcgc2VydmljZXMjODIuMTEuMTguMDAuMDAKLXVuc3BzYzcjODIuMTEuMTguMDMuMDAjUHJvb2ZyZWFkaW5nIHNlcnZpY2VzIzgyLjExLjE4LjAwLjAwCi11bnNwc2M3IzgyLjExLjE4LjA0LjAwI1dyaXR0ZW4gdHJhbnNsYXRpb24gc2VydmljZXMjODIuMTEuMTguMDAuMDAKLXVuc3BzYzcjODIuMTEuMTkuMDAuMDAjTmV3cyBhbmQgcHVibGljaXR5IHNlcnZpY2VzIzgyLjExLjAwLjAwLjAwCi11bnNwc2M3IzgyLjExLjE5LjAxLjAwI1ByZXNzIHJlbGVhc2Ugc2VydmljZXMjODIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTkuMDIuMDAjU3BlY2lhbCBpbnRlcmVzdCBuZXdzbGV0dGVyIHNlcnZpY2VzIzgyLjExLjE5LjAwLjAwCi11bnNwc2M3IzgyLjExLjE5LjAzLjAwI05ld3MgYWdlbmN5IHdpcmUgc2VydmljZXMjODIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTkuMDQuMDAjTmV3c3BhcGVyIG9yIGFkdmVydGlzaW5nIG1hdGVyaWFsIGRlbGl2ZXJ5IHNlcnZpY2VzIzgyLjExLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEyLjAwLjAwLjAwI1JlcHJvZHVjdGlvbiBzZXJ2aWNlcyM4Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4wMC4wMCNQcmludGluZyM4Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4wMS4wMCNQbGFubmluZyBvciBsYXlvdXQgb2YgZ3JhcGhpYyBwcm9kdWN0aW9uIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjAyLjAwI1R5cGVzZXR0aW5nIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjAzLjAwI0RpZ2l0YWwgcHJpbnRpbmcjODIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTUuMDQuMDAjTGV0dGVycHJlc3Mgb3Igc2NyZWVuIHByaW50aW5nIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjA1LjAwI1Byb21vdGlvbmFsIG9yIGFkdmVydGlzaW5nIHByaW50aW5nIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjA2LjAwI1B1YmxpY2F0aW9uIHByaW50aW5nIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjA3LjAwI1N0YXRpb25lcnkgb3IgYnVzaW5lc3MgZm9ybSBwcmludGluZyM4Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4wOC4wMCNXcmFwIG9yIHRhZyBvciBsYWJlbCBvciBzZWFsIG9yIGJhZyBwcmludGluZyM4Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4wOS4wMCNTZWN1cml0eSBvciBmaW5hbmNpYWwgaW5zdHJ1bWVudHMgcHJpbnRpbmcjODIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTUuMTAuMDAjVGV4dGlsZSBwcmludGluZyM4Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4xMS4wMCNUZWNobmljYWwgbWFudWFsIGFuZCBpbnN0cnVjdGlvbiBzaGVldCBwcmludGluZyM4Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4xMi4wMCNFbWJvc3NpbmcjODIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTYuMDAuMDAjRW5ncmF2aW5nIzgyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzgyLjEyLjE2LjAxLjAwI0N1cnJlbmN5IGVuZ3JhdmluZyM4Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNi4wMi4wMCNFbmdyYXZlZCByb2xsIHByaW50aW5nIzgyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE2LjAzLjAwI01ldGFsIHBsYXRlIGVuZ3JhdmluZyM4Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNy4wMC4wMCNQaG90b2NvcHlpbmcjODIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTcuMDEuMDAjQmxhY2sgYW5kIHdoaXRlIGNvcHkgb3IgY29sbGF0aW5nIHNlcnZpY2VzIzgyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE3LjAyLjAwI0NvbG9yIGNvcHkgb3IgY29sbGF0aW5nIHNlcnZpY2VzIzgyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE4LjAwLjAwI1B1Ymxpc2hpbmcjODIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTguMDEuMDAjVGV4dGJvb2sgb3IgcmVzZWFyY2ggcHVibGlzaGluZyM4Mi4xMi4xOC4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xOC4wMi4wMCNBdXRob3IgZnVuZGVkIHB1Ymxpc2hpbmcgc2VydmljZXMjODIuMTIuMTguMDAuMDAKLXVuc3BzYzcjODIuMTIuMTkuMDAuMDAjQm9va2JpbmRpbmcjODIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTkuMDEuMDAjVGhyZWFkIHN0aXRjaCBib29rYmluZGluZyM4Mi4xMi4xOS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xOS4wMi4wMCNTcGlyYWwgYmluZGluZyM4Mi4xMi4xOS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xOS4wMy4wMCNHbHVlZCBiaW5kaW5nIzgyLjEyLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE5LjA0LjAwI0NvbWIgb3IgY2xhbXAgdHlwZSBiaW5kaW5nIzgyLjEyLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE5LjA1LjAwI0JpbmRpbmcgcmVzdG9yYXRpb24gb3IgcmVwYWlyIzgyLjEyLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE5LjA2LjAwI0Jyb256aW5nIG9yIGdpbGRpbmcgb3IgZWRnaW5nIG9yIGRlY2tsaW5nIzgyLjEyLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEzLjAwLjAwLjAwI1Bob3RvZ3JhcGhpYyBzZXJ2aWNlcyM4Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNS4wMC4wMCNGaWxtIHByb2Nlc3Npbmcgc2VydmljZXMjODIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTMuMTUuMDEuMDAjU3RpbGwgZmlsbSBwcm9jZXNzaW5nIG9yIHJlcHJvZHVjdGlvbiM4Mi4xMy4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNS4wMi4wMCNNb3Rpb24gcGljdHVyZSBmaWxtIHByb2Nlc3Npbmcgb3IgcmVwcm9kdWN0aW9uIzgyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEzLjE1LjAzLjAwI01pY3JvZmljaGUgc2VydmljZXMjODIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTMuMTUuMDQuMDAjQ29sb3Igc2VwYXJhdGlvbiM4Mi4xMy4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNi4wMC4wMCNQaG90b2dyYXBoZXJzIGFuZCBjaW5lbWF0b2dyYXBoZXJzIzgyLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgyLjEzLjE2LjAxLjAwI0FlcmlhbCBwaG90b2dyYXBoeSBzZXJ2aWNlcyM4Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNi4wMi4wMCNNb3Rpb24gcGljdHVyZSBjaW5lbWF0b2dyYXBoeSM4Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNi4wMy4wMCNWaWRlbyBwcm9kdWN0aW9uIHNlcnZpY2VzIzgyLjEzLjE2LjAwLjAwCi11bnNwc2M3IzgyLjEzLjE2LjA0LjAwI1N0dWRpbyBwaG90b2dyYXBoeSBzZXJ2aWNlcyBvciBzdGlsbCBwaG90b2dyYXBocyM4Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xNC4wMC4wMC4wMCNHcmFwaGljIGRlc2lnbiM4Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNS4wMC4wMCNBcnQgZGVzaWduIHNlcnZpY2VzIzgyLjE0LjAwLjAwLjAwCi11bnNwc2M3IzgyLjE0LjE1LjAxLjAwI0xheW91dCBvciBncmFwaGljcyBlZGl0aW5nIHNlcnZpY2VzIzgyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgyLjE0LjE1LjAyLjAwI0FydCBkZXNpZ24gb3IgZ3JhcGhpY3MjODIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTQuMTUuMDMuMDAjUGhvdG9jb21wb3NpdGlvbiM4Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNS4wNC4wMCNDaGFydCBvciBncmFwaCBkZXNpZ24gc2VydmljZXMjODIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTQuMTUuMDUuMDAjQ29tcHV0ZXIgZ2VuZXJhdGVkIGRlc2lnbiBzZXJ2aWNlcyM4Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNS4wNi4wMCNQYWNrYWdlIGRlc2lnbiBzZXJ2aWNlcyM4Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNS4wNy4wMCNTaWxrc2NyZWVuIGRlc2lnbiBzZXJ2aWNlcyM4Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNi4wMC4wMCNHcmFwaGljIGRpc3BsYXkgc2VydmljZXMjODIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTQuMTYuMDEuMDAjUGhvdG9ncmFwaGljIG9yIHBpY3R1cmUgbW91bnRpbmcgb3IgZnJhbWluZyBzZXJ2aWNlcyM4Mi4xNC4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNi4wMi4wMCNBcnRpY2xlIGRpc3BsYXkgYXJyYW5nZW1lbnQjODIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODIuMTUuMDAuMDAuMDAjUHJvZmVzc2lvbmFsIGFydGlzdHMgYW5kIHBlcmZvcm1lcnMjODIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTUuMDAuMDAjVmlzdWFsIGFydCBzZXJ2aWNlcyM4Mi4xNS4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wMS4wMCNQYWludGVycyBzZXJ2aWNlcyM4Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wMi4wMCNMaXRob2dyYXBoZXJzIHNlcnZpY2VzIzgyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE1LjAzLjAwI0NhcnRvb25pc3RzIHNlcnZpY2VzIzgyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE1LjA0LjAwI1NjdWxwdG9ycyBzZXJ2aWNlcyM4Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wNS4wMCNDZXJhbWljcyBtYWtlcnMgc2VydmljZXMjODIuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTUuMDYuMDAjR2xhc3MgYmxvd2VycyBzZXJ2aWNlcyM4Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wNy4wMCNUZXh0aWxlIHNwaW5uZXJzIG9yIGxvb21lcnMgb3Igd2VhdmVycyBzZXJ2aWNlcyM4Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wOC4wMCNUYXhpZGVybXkgc2VydmljZXMjODIuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTYuMDAuMDAjQ2lyY3VzIHBlcmZvcm1lcnMjODIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTYuMDEuMDAjQW5pbWFsIHRyYWluZXJzIHNlcnZpY2VzIzgyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE2LjAyLjAwI0Fjcm9iYXRzIHNlcnZpY2VzIzgyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE2LjAzLjAwI01hZ2ljaWFucyBzZXJ2aWNlcyM4Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNi4wNC4wMCNDbG93bnMgc2VydmljZXMjODIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTcuMDAuMDAjUGVyZm9ybWluZyBhcnRzIHByb2Zlc3Npb25hbHMjODIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTcuMDEuMDAjQWN0aW5nIHNlcnZpY2VzIzgyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE3LjAyLjAwI0NvbWVkaWFucyBzZXJ2aWNlcyM4Mi4xNS4xNy4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNy4wMy4wMCNEYW5jZXJzIHNlcnZpY2VzIzgyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE3LjA0LjAwI011c2ljaWFucyBzZXJ2aWNlcyM4Mi4xNS4xNy4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNy4wNS4wMCNWb2NhbGlzdHMgc2VydmljZXMjODIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTcuMDYuMDAjQ2hvcmVvZ3JhcGhpYyBzZXJ2aWNlcyM4Mi4xNS4xNy4wMC4wMAotdW5zcHNjNyM4My4wMC4wMC4wMC4wMCNQdWJsaWMgVXRpbGl0aWVzIGFuZCBQdWJsaWMgU2VjdG9yIFJlbGF0ZWQgU2VydmljZXMjODMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTAuMDAuMDAuMDAjVXRpbGl0aWVzIzgzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEwLjE1LjAwLjAwI1dhdGVyIGFuZCBzZXdlciB1dGlsaXRpZXMjODMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDEuMDAjU3VwcGx5IG9mIHdhdGVyIzgzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE1LjAyLjAwI1dhdGVyIHJlc291cmNlIG1hbmFnZW1lbnQjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDMuMDAjV2F0ZXIgcXVhbGl0eSBjb250cm9sIG1hbmFnZW1lbnQjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDQuMDAjV2F0ZXIgZGlzdHJpYnV0aW9uIG1hbmFnZW1lbnQjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDUuMDAjV2F0ZXIgcG9saWN5IGFkdmlzb3J5IHNlcnZpY2VzIzgzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE1LjA2LjAwI1dhdGVyIHRyZWF0bWVudCBzZXJ2aWNlcyM4My4xMC4xNS4wMC4wMAotdW5zcHNjNyM4My4xMC4xNS4wNy4wMCNEZXNhbGluYXRpb24gc2VydmljZXMjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDguMDAjVG93biB3YXRlciM4My4xMC4xNS4wMC4wMAotdW5zcHNjNyM4My4xMC4xNS4wOS4wMCNTZXJ2aWNlIHdhdGVyIzgzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE1LjEwLjAwI0NoaWxsZWQgd2F0ZXIjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTYuMDAuMDAjT2lsIGFuZCBnYXMgdXRpbGl0aWVzIzgzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEwLjE2LjAxLjAwI1N1cHBseSBvZiBuYXR1cmFsIGdhcyM4My4xMC4xNi4wMC4wMAotdW5zcHNjNyM4My4xMC4xNi4wMi4wMCNTdXBwbHkgb2YgZnVlbCBvaWwjODMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTYuMDMuMDAjT2lsIHBpcGVsaW5lIHNlcnZpY2VzIzgzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE2LjA0LjAwI0dhcyBwaXBlbGluZSBzZXJ2aWNlcyM4My4xMC4xNi4wMC4wMAotdW5zcHNjNyM4My4xMC4xNi4wNS4wMCNHYXMgZmFjaWxpdHkgY2hhcmdlIzgzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE4LjAwLjAwI0VsZWN0cmljIHV0aWxpdGllcyM4My4xMC4wMC4wMC4wMAotdW5zcHNjNyM4My4xMC4xOC4wMS4wMCNTdXBwbHkgb2Ygc2luZ2xlIHBoYXNlIGVsZWN0cmljaXR5IzgzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE4LjAyLjAwI1N1cHBseSBvZiB0d28gcGhhc2UgZWxlY3RyaWNpdHkjODMuMTAuMTguMDAuMDAKLXVuc3BzYzcjODMuMTAuMTguMDMuMDAjU3VwcGx5IG9mIHRocmVlIHBoYXNlIGVsZWN0cmljaXR5IzgzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE4LjA0LjAwI0VsZWN0cmljIHBvd2VyIHRyYW5zbWlzc2lvbiBzZXJ2aWNlcyM4My4xMC4xOC4wMC4wMAotdW5zcHNjNyM4My4xMC4xOC4wNS4wMCNJbmR1c3RyaWFsIGVsZWN0cmljIHBvd2VyIGRpc3RyaWJ1dGlvbiM4My4xMC4xOC4wMC4wMAotdW5zcHNjNyM4My4xMC4xOC4wNi4wMCNSdXJhbCBlbGVjdHJpY2FsIHBvd2VyIGRpc3RyaWJ1dGlvbiM4My4xMC4xOC4wMC4wMAotdW5zcHNjNyM4My4xMC4xOC4wNy4wMCNNdW5pY2lwYWwgZWxlY3RyaWMgcG93ZXIgZGlzdHJpYnV0aW9uIzgzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE5LjAwLjAwI0VuZXJneSBjb25zZXJ2YXRpb24jODMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTkuMDEuMDAjRW5lcmd5IGNvbnNlcnZhdGlvbiBwcm9ncmFtcyM4My4xMC4xOS4wMC4wMAotdW5zcHNjNyM4My4xMC4xOS4wMi4wMCNFbmVyZ3kgdXNlIHJlZHVjdGlvbiBtZWFzdXJlcyM4My4xMC4xOS4wMC4wMAotdW5zcHNjNyM4My4xMC4yMC4wMC4wMCNGdW5lcmFsIHNlcnZpY2VzIzgzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEwLjIwLjAxLjAwI0dyYXZlIGRpZ2dpbmcjODMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMDAuMDAuMDAjVGVsZWNvbW11bmljYXRpb25zIG1lZGlhIHNlcnZpY2VzIzgzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjExLjE1LjAwLjAwI0xvY2FsIGFuZCBsb25nIGRpc3RhbmNlIHRlbGVwaG9uZSBjb21tdW5pY2F0aW9ucyM4My4xMS4wMC4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wMS4wMCNMb2NhbCB0ZWxlcGhvbmUgc2VydmljZSM4My4xMS4xNS4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wMi4wMCNMb25nIGRpc3RhbmNlIHRlbGVwaG9uZSBzZXJ2aWNlcyM4My4xMS4xNS4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wMy4wMCNQYXkgcGhvbmUgcHJvdmlkZXIgc2VydmljZXMjODMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTUuMDQuMDAjUHJlIHBhaWQgcGhvbmUgY2FyZCBzZXJ2aWNlcyM4My4xMS4xNS4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wNS4wMCNEaXJlY3RvcnkgYXNzaXN0YW5jZSBzZXJ2aWNlcyM4My4xMS4xNS4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wNi4wMCNDb25mZXJlbmNlIGNhbGxpbmcgc2VydmljZXMjODMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTUuMDcuMDAjQ2FsbCBjZW50cmUgYnVyZWF1IHNlcnZpY2VzIzgzLjExLjE1LjAwLjAwCi11bnNwc2M3IzgzLjExLjE1LjA4LjAwI1RvbGwgZnJlZSBpbmJvdW5kIHRlbGVwaG9uZSBzZXJ2aWNlIzgzLjExLjE1LjAwLjAwCi11bnNwc2M3IzgzLjExLjE1LjA5LjAwI1RlbGVwaG9uZSBlcXVpcG1lbnQgcmVwYWlyIHNlcnZpY2VzIzgzLjExLjE1LjAwLjAwCi11bnNwc2M3IzgzLjExLjE2LjAwLjAwI01vYmlsZSBjb21tdW5pY2F0aW9ucyBzZXJ2aWNlcyM4My4xMS4wMC4wMC4wMAotdW5zcHNjNyM4My4xMS4xNi4wMS4wMCNUZWxlY29tbXVuaWNhdGlvbiBzaWduYWwgZW5oYW5jZW1lbnQgbmV0d29yayBzZXJ2aWNlcyM4My4xMS4xNi4wMC4wMAotdW5zcHNjNyM4My4xMS4xNi4wMi4wMCNTYXRlbGxpdGUgb3IgZWFydGggY29tbXVuaWNhdGlvbiBzeXN0ZW1zIHNlcnZpY2VzIzgzLjExLjE2LjAwLjAwCi11bnNwc2M3IzgzLjExLjE2LjAzLjAwI0NlbGx1bGFyIHRlbGVwaG9uZSBzZXJ2aWNlcyM4My4xMS4xNi4wMC4wMAotdW5zcHNjNyM4My4xMS4xNi4wNC4wMCNQYWdpbmcgc2VydmljZXMjODMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTcuMDAuMDAjRmFjc2ltaWxlIGFuZCB0ZWxlZ3JhcGggc2VydmljZXMjODMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTcuMDEuMDAjRmFjc2ltaWxlIHRyYW5zbWlzc2lvbiBzZXJ2aWNlcyM4My4xMS4xNy4wMC4wMAotdW5zcHNjNyM4My4xMS4xNy4wMi4wMCNUZWxlZ3JhcGggdHJhbnNtaXNzaW9uIHNlcnZpY2VzIzgzLjExLjE3LjAwLjAwCi11bnNwc2M3IzgzLjExLjE3LjAzLjAwI1RlbGV4IHRyYW5zbWlzc2lvbiBzZXJ2aWNlcyM4My4xMS4xNy4wMC4wMAotdW5zcHNjNyM4My4xMS4xOC4wMC4wMCNUZWxldmlzaW9uIHNlcnZpY2VzIzgzLjExLjAwLjAwLjAwCi11bnNwc2M3IzgzLjExLjE4LjAxLjAwI0NhYmxlIHRlbGV2aXNpb24gc2VydmljZXMjODMuMTEuMTguMDAuMDAKLXVuc3BzYzcjODMuMTEuMTguMDIuMDAjQ2xvc2VkIGNpcmN1aXQgdGVsZXZpc2lvbiBzZXJ2aWNlcyM4My4xMS4xOC4wMC4wMAotdW5zcHNjNyM4My4xMS4xOC4wMy4wMCNUZWxldmlzaW9uIGFudGVubmEgY29uc3RydWN0aW9uIG9yIHJlbnRhbCBzZXJ2aWNlcyM4My4xMS4xOC4wMC4wMAotdW5zcHNjNyM4My4xMS4xOC4wNC4wMCNUZWxldmlzaW9uIGJyb2FkY2FzdGluZyBzdGF0aW9uIG1hbmFnZW1lbnQjODMuMTEuMTguMDAuMDAKLXVuc3BzYzcjODMuMTEuMTkuMDAuMDAjUmFkaW8gc2VydmljZXMjODMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTkuMDEuMDAjUmFkaW8gYnJvYWRjYXN0aW5nIHN0YXRpb24gbWFuYWdlbWVudCM4My4xMS4xOS4wMC4wMAotdW5zcHNjNyM4My4xMS4xOS4wMi4wMCNBbWF0ZXVyIHJhZGlvIG5ldHdvcmtzIG9yIHNlcnZpY2VzIzgzLjExLjE5LjAwLjAwCi11bnNwc2M3IzgzLjExLjE5LjAzLjAwI1NtYWxsIHNjYWxlIHJhZGlvIHN5c3RlbXMjODMuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTkuMDQuMDAjUmFkaW8gc3R1ZGlvIG9yIGVxdWlwbWVudCBzZXJ2aWNlcyM4My4xMS4xOS4wMC4wMAotdW5zcHNjNyM4My4xMS4yMC4wMC4wMCNGaWJlciB0ZWxlY29tbXVuaWNhdGlvbnMgc2VydmljZXMjODMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjAuMDEuMDAjRGFyayBmaWJlciM4My4xMS4yMC4wMC4wMAotdW5zcHNjNyM4My4xMS4yMC4wMi4wMCNEZW5zZSB3YXZlbGVuZ3RoIGRpdmlzaW9uIG11bHRpcGxleGluZyBEV0RNIzgzLjExLjIwLjAwLjAwCi11bnNwc2M3IzgzLjExLjIwLjAzLjAwI1dhdmUgZGl2aXNpb24gbXVsdGlwbGV4aW5nIFdETSM4My4xMS4yMC4wMC4wMAotdW5zcHNjNyM4My4xMS4yMC4wNC4wMCNPY3ggb3B0aWNhbCBjYXJyaWVyIHNlcnZpY2UjODMuMTEuMjAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjEuMDAuMDAjU3dpdGNoZWQgZGlhbCB1cCBhbmQgbGVhc2VkIGRlZGljYXRlZCBsaW5lIGNpcmN1aXQgdGVsZWNvbW11bmljYXRpb25zIHNlcnZpY2VzIzgzLjExLjAwLjAwLjAwCi11bnNwc2M3IzgzLjExLjIxLjAxLjAwI0hpZ2ggc3BlZWQgY2lyY3VpdCBzd2l0Y2hlZCBkaWFsIHVwIHNlcnZpY2VzIzgzLjExLjIxLjAwLjAwCi11bnNwc2M3IzgzLjExLjIxLjAyLjAwI0lTRE4gaW50ZWdyYXRlZCBzZXJ2aWNlcyBkaWdpdGFsIG5ldHdvcmsgc2VydmljZXMjODMuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjEuMDMuMDAjUG9pbnQgdG8gcG9pbnQgZGlnaXRhbCB0ZWxlY29tbXVuaWNhdGlvbnMgY2lyY3VpdCM4My4xMS4yMS4wMC4wMAotdW5zcHNjNyM4My4xMS4yMS4wNC4wMCNNdWx0aSBwb2ludCBhbmFsb2cgdGVsZWNvbW11bmljYXRpb25zIGNpcmN1aXQjODMuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjEuMDUuMDAjUG9pbnQgdG8gcG9pbnQgYW5hbG9nIHRlbGVjb21tdW5pY2F0aW9ucyBjaXJjdWl0IzgzLjExLjIxLjAwLjAwCi11bnNwc2M3IzgzLjExLjIxLjA2LjAwI3hEU0wgZGlnaXRhbCBzdWJzY3JpYmVyIGxpbmUjODMuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjIuMDAuMDAjRW5oYW5jZWQgdGVsZWNvbW11bmljYXRpb25zIHNlcnZpY2VzIzgzLjExLjAwLjAwLjAwCi11bnNwc2M3IzgzLjExLjIyLjAxLjAwI0FUTSBhc3luY3Jvbm91cyB0cmFuc2ZlciBtb2RlIG1hbmFnZWQgbmV0d29yayBzZXJ2aWNlcyM4My4xMS4yMi4wMC4wMAotdW5zcHNjNyM4My4xMS4yMi4wMi4wMCNGcmFtZSByZWxheSBwdWJsaWMgbWFuYWdlZCBuZXR3b3JrIHNlcnZpY2VzIzgzLjExLjIyLjAwLjAwCi11bnNwc2M3IzgzLjExLjIyLjAzLjAwI1ZQTiB2aXJ0dWFsIHByaXZhdGUgbmV0d29yayBtYW5hZ2VkIG5ldHdvcmsgc2VydmljZXMjODMuMTEuMjIuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjIuMDQuMDAjWDc1IG1hbmFnZWQgbmV0d29yayBzZXJ2aWNlcyM4My4xMS4yMi4wMC4wMAotdW5zcHNjNyM4My4xMS4yMi4wNS4wMCNYMjUgbWFuYWdlZCBuZXR3b3JrIHNlcnZpY2VzIzgzLjExLjIyLjAwLjAwCi11bnNwc2M3IzgzLjEyLjAwLjAwLjAwI0luZm9ybWF0aW9uIHNlcnZpY2VzIzgzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEyLjE1LjAwLjAwI0xpYnJhcmllcyM4My4xMi4wMC4wMC4wMAotdW5zcHNjNyM4My4xMi4xNS4wMS4wMCNHZW5lcmFsIG11bmljaXBhbCBwdWJsaWMgdXNlIGxpYnJhcmllcyM4My4xMi4xNS4wMC4wMAotdW5zcHNjNyM4My4xMi4xNS4wMi4wMCNDb2xsZWdlIG9yIHVuaXZlcnNpdHkgbGlicmFyaWVzIzgzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE1LjAzLjAwI1ByaXZhdGVseSBvd25lZCBsaWJyYXJpZXMjODMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTIuMTUuMDQuMDAjTmF0aW9uYWwgZ292ZXJubWVudCBvciBtaWxpdGFyeSBwb3N0IGxpYnJhcmllcyM4My4xMi4xNS4wMC4wMAotdW5zcHNjNyM4My4xMi4xNi4wMC4wMCNJbmZvcm1hdGlvbiBjZW50ZXJzIzgzLjEyLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEyLjE2LjAxLjAwI0NoYW1iZXJzIG9mIGNvbW1lcmNlIzgzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE2LjAyLjAwI1RvdXJpc20gYm9hcmQgc2VydmljZXMjODMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODMuMTIuMTYuMDMuMDAjQ29tcHV0ZXJpemVkIGluZm9ybWF0aW9uIHJldHJpZXZhbCBzeXN0ZW1zIzgzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE2LjA0LjAwI09ubGluZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiByZXRyaWV2YWwgc3lzdGVtcyM4My4xMi4xNi4wMC4wMAotdW5zcHNjNyM4My4xMi4xNi4wNS4wMCNSZW1vdGUgZGF0YWJhc2UgaW5mb3JtYXRpb24gcmV0cmlldmFsIHNlcnZpY2VzIzgzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE2LjA2LjAwI1NraXAgdHJhY2luZyM4My4xMi4xNi4wMC4wMAotdW5zcHNjNyM4My4xMi4xNy4wMC4wMCNNYXNzIGNvbW11bmljYXRpb24gc2VydmljZXMjODMuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTIuMTcuMDEuMDAjVGVsZXZpc2lvbiByZWxhdGVkIHNlcnZpY2VzIzgzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE3LjAyLjAwI1JhZGlvIHJlbGF0ZWQgc2VydmljZXMjODMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODMuMTIuMTcuMDMuMDAjSW50ZXJuZXQgcmVsYXRlZCBzZXJ2aWNlcyM4My4xMi4xNy4wMC4wMAotdW5zcHNjNyM4My4xMi4xNy4wNC4wMCNDaXRpemVuIHdhcm5pbmcgc3lzdGVtcyM4My4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NC4wMC4wMC4wMC4wMCNGaW5hbmNpYWwgYW5kIEluc3VyYW5jZSBTZXJ2aWNlcyM4NC4wMC4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMC4wMC4wMC4wMCNEZXZlbG9wbWVudCBmaW5hbmNlIzg0LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEwLjE1LjAwLjAwI0RldmVsb3BtZW50IGFzc2lzdGFuY2UjODQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTUuMDEuMDAjRmluYW5jaWFsIGFzc2lzdGFuY2UjODQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTUuMDIuMDAjU2F2aW5ncyBtb2JpbGl6YXRpb24gcHJvZ3JhbXMjODQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTUuMDMuMDAjR3VhcmFudGVlIGFncmVlbWVudHMjODQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTYuMDAuMDAjQWlkIGZpbmFuY2luZyM4NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNi4wMS4wMCNDbyBmaW5hbmNpbmcjODQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTYuMDIuMDAjQmkgbGF0ZXJhbCBvciBtdWx0aSBsYXRlcmFsIGFpZCM4NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNi4wMy4wMCNOb24gZ292ZXJubWVudGFsIGFpZCM4NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNi4wNC4wMCNHb3Zlcm5tZW50IGFpZCM4NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNy4wMC4wMCNEZWJ0IG1hbmFnZW1lbnQjODQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTcuMDEuMDAjRGVidCBuZWdvdGlhdGlvbiM4NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNy4wMi4wMCNEZWJ0IHJlb3JnYW5pemF0aW9uIzg0LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg0LjEwLjE3LjAzLjAwI0RlYnQgc2VydmljaW5nIzg0LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg0LjEwLjE3LjA0LjAwI0RlYnQgY29sbGVjdGlvbiBzZXJ2aWNlcyM4NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNy4wNS4wMCNSZXBvc3Nlc3Npb24gc2VydmljZXMjODQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTEuMDAuMDAuMDAjQWNjb3VudGluZyBhbmQgYXVkaXRpbmcjODQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDAuMDAjQWNjb3VudGluZyBzZXJ2aWNlcyM4NC4xMS4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMS4xNS4wMS4wMCNDb3N0IGFjY291bnRpbmcjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDIuMDAjRmluYW5jaWFsIGFjY291bnRpbmcjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDMuMDAjVGF4IGFjY291bnRpbmcjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDQuMDAjQm9va2tlZXBpbmcgc2VydmljZXMjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDUuMDAjUGF5cm9sbCBhY2NvdW50aW5nIHNlcnZpY2VzIzg0LjExLjE1LjAwLjAwCi11bnNwc2M3Izg0LjExLjE1LjA2LjAwI0JpbGxpbmcgc2VydmljZXMjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDcuMDAjSW52ZW50b3J5IGFjY291bnRpbmcjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTYuMDAuMDAjQXVkaXQgc2VydmljZXMjODQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTYuMDEuMDAjWWVhciBlbmQgYXVkaXRzIzg0LjExLjE2LjAwLjAwCi11bnNwc2M3Izg0LjExLjE2LjAyLjAwI1F1YXJ0ZXJseSByZXZpZXdzIzg0LjExLjE2LjAwLjAwCi11bnNwc2M3Izg0LjExLjE2LjAzLjAwI0ludGVybmFsIGF1ZGl0cyM4NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMS4xNy4wMC4wMCNDb3Jwb3JhdGUgZmluYW5jZSM4NC4xMS4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMS4xNy4wMS4wMCNUcmVhc3VyeSBzZXJ2aWNlcyM4NC4xMS4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMS4xNy4wMi4wMCNJbnZlc3RvciByZWxhdGlvbnMgc2VydmljZXMgb3IgcHJvZ3JhbXMjODQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTcuMDMuMDAjQnVkZ2V0IHByZXBhcmF0aW9uIG9yIHJldmlldyBzZXJ2aWNlcyM4NC4xMS4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMS4xOC4wMC4wMCNUYXhhdGlvbiBpc3N1ZXMgYW5kIHByZXBhcmF0aW9uIzg0LjExLjAwLjAwLjAwCi11bnNwc2M3Izg0LjExLjE4LjAxLjAwI1RheCBwcmVwYXJlcnMjODQuMTEuMTguMDAuMDAKLXVuc3BzYzcjODQuMTEuMTguMDIuMDAjVGF4IGFkdmlzb3J5IHNlcnZpY2VzIzg0LjExLjE4LjAwLjAwCi11bnNwc2M3Izg0LjEyLjAwLjAwLjAwI0JhbmtpbmcgYW5kIGludmVzdG1lbnQjODQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTUuMDAuMDAjQmFua2luZyBpbnN0aXR1dGlvbnMjODQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTUuMDEuMDAjUHJpdmF0ZWx5IG93bmVkIGJhbmtzIzg0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE1LjAyLjAwI1B1YmxpY2x5IG93bmVkIGJhbmtzIzg0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE1LjAzLjAwI0NyZWRpdCB1bmlvbnMjODQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTUuMDQuMDAjRGV2ZWxvcG1lbnQgZmluYW5jZSBpbnN0aXR1dGlvbnMjODQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDAuMDAjRnVuZHMgdHJhbnNmZXIgYW5kIGNsZWFyYW5jZSBhbmQgZXhjaGFuZ2Ugc2VydmljZXMjODQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDEuMDAjRnVuZHMgY2xlYXJhbmNlIHNlcnZpY2VzIzg0LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE2LjAyLjAwI0xldHRlciBvZiBjcmVkaXQgc2VydmljZXMjODQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDMuMDAjQ3VycmVuY3kgZXhjaGFuZ2Ugc2VydmljZXMjODQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDQuMDAjU3BvdCBleGNoYW5nZSB0cmFuc2FjdGlvbiBzZXJ2aWNlcyM4NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMi4xNi4wNS4wMCNDdXJyZW5jeSBjb252ZXJzaW9uIHNlcnZpY2UjODQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDYuMDAjUmVtaXR0YW5jZSBwcm9jZXNzaW5nIHNlcnZpY2VzIzg0LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE3LjAwLjAwI0ludmVzdG1lbnQgYWR2aWNlIzg0LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEyLjE3LjAxLjAwI0ludmVzdG1lbnQgYWR2aXNlcnMjODQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTcuMDIuMDAjSW52ZXN0bWVudCBwb2xpY3kjODQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTcuMDMuMDAjSW52ZXN0bWVudCBhbmFseXNpcyM4NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMi4xNy4wNC4wMCNJbnZlc3RtZW50IGFncmVlbWVudHMjODQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTcuMDUuMDAjTWFya2V0IGRhdGEjODQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTguMDAuMDAjU2VjdXJpdGllcyBhbmQgY29tbW9kaXRpZXMgbWFya2V0cyBzZXJ2aWNlcyM4NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOC4wMS4wMCNTdG9jayBtYXJrZXQgdHJhZGluZyBzZXJ2aWNlcyM4NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOC4wMi4wMCNDb21tb2RpdGllcyBvciBmdXR1cmVzIG1hcmtldCBzZXJ2aWNlcyM4NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOC4wMy4wMCNHb3Zlcm5tZW50IGJvbmRzIzg0LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE4LjA0LjAwI1ByaXZhdGVseSBpc3N1ZWQgYm9uZHMjODQuMTIuMTguMDAuMDAKLXVuc3BzYzcjODQuMTIuMTguMDUuMDAjUHJlY2lvdXMgbWV0YWxzIG1hcmtldCBzZXJ2aWNlcyM4NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOS4wMC4wMCNNb3J0Z2FnZSBiYW5raW5nIzg0LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEyLjE5LjAxLjAwI0hvdXNpbmcgZmluYW5jZSM4NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOS4wMi4wMCNSZSBmaW5hbmNpbmcgc2VydmljZXMjODQuMTIuMTkuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTkuMDMuMDAjQ29tbWVyY2lhbCBtb3J0Z2FnZSBmaW5hbmNlIzg0LjEyLjE5LjAwLjAwCi11bnNwc2M3Izg0LjEyLjIwLjAwLjAwI0Nhc2ggdmF1bHQgc2VydmljZXMjODQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTIuMjAuMDEuMDAjRGVwb3NpdCB2ZXJpZmljYXRpb24gc2VydmljZXMjODQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjODQuMTMuMDAuMDAuMDAjSW5zdXJhbmNlIGFuZCByZXRpcmVtZW50IHNlcnZpY2VzIzg0LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEzLjE1LjAwLjAwI0luc3VyYW5jZSBzZXJ2aWNlcyBmb3Igc3RydWN0dXJlcyBhbmQgcHJvcGVydHkgYW5kIHBvc3Nlc3Npb25zIzg0LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEzLjE1LjAxLjAwI0J1aWxkaW5nIG9yIGJ1aWxkaW5nIGNvbnRlbnRzIGluc3VyYW5jZSM4NC4xMy4xNS4wMC4wMAotdW5zcHNjNyM4NC4xMy4xNS4wMi4wMCNIb21lb3duZXJzIG9yIHJlbnRlcnMgaW5zdXJhbmNlIzg0LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE1LjAzLjAwI0NhciBvciB0cnVjayBpbnN1cmFuY2UjODQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTUuMDQuMDAjQ2FyZ28gaW5zdXJhbmNlIzg0LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE1LjA1LjAwI01hcmluZSBpbnN1cmFuY2UjODQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTUuMDYuMDAjUmVpbnN1cmFuY2Ugc2VydmljZXMjODQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTYuMDAuMDAjTGlmZSBhbmQgaGVhbHRoIGFuZCBhY2NpZGVudCBpbnN1cmFuY2UjODQuMTMuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTYuMDEuMDAjTGlmZSBpbnN1cmFuY2UjODQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTYuMDIuMDAjSGVhbHRoIG9yIGhvc3BpdGFsaXphdGlvbiBpbnN1cmFuY2UjODQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTYuMDMuMDAjQWNjaWRlbnRhbCBpbmp1cnkgaW5zdXJhbmNlIzg0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE2LjA0LjAwI0Rpc2FiaWxpdHkgaW5zdXJhbmNlIzg0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE2LjA1LjAwI1dvcmttZW5zIGluc3VyYW5jZSM4NC4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMy4xNi4wNi4wMCNVbmVtcGxveW1lbnQgaW5zdXJhbmNlIzg0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE2LjA3LjAwI0xpYWJpbGl0eSBpbnN1cmFuY2UjODQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTcuMDAuMDAjUGVuc2lvbiBmdW5kcyM4NC4xMy4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMy4xNy4wMS4wMCNFbXBsb3llciBhZG1pbmlzdGVyZWQgcGVuc2lvbiBmdW5kcyM4NC4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMy4xNy4wMi4wMCNVbmlvbiBvciBndWlsZCBhZG1pbmlzdGVyZWQgcGVuc2lvbiBmdW5kcyM4NC4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMy4xOC4wMC4wMCNSZXRpcmVtZW50IGZ1bmRzIzg0LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEzLjE4LjAxLjAwI1NlbGYgZGlyZWN0ZWQgb3IgZW1wbG95ZXIgc3BvbnNvcmVkIHJldGlyZW1lbnQgZnVuZHMjODQuMTMuMTguMDAuMDAKLXVuc3BzYzcjODQuMTMuMTguMDIuMDAjU2VsZiBkaXJlY3RlZCBvciBzZWxmIGluaXRpYXRlZCByZXRpcmVtZW50IHBsYW5zIzg0LjEzLjE4LjAwLjAwCi11bnNwc2M3Izg0LjE0LjAwLjAwLjAwI0NyZWRpdCBhZ2VuY2llcyM4NC4wMC4wMC4wMC4wMAotdW5zcHNjNyM4NC4xNC4xNS4wMC4wMCNHb3Zlcm5tZW50YWwgY3JlZGl0IGFnZW5jaWVzIzg0LjE0LjAwLjAwLjAwCi11bnNwc2M3Izg0LjE0LjE1LjAxLjAwI0Zhcm0gY3JlZGl0IHNlcnZpY2VzIzg0LjE0LjE1LjAwLjAwCi11bnNwc2M3Izg0LjE0LjE1LjAyLjAwI1NtYWxsIGJ1c2luZXNzIGxvYW4gYWdlbmNpZXMjODQuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTQuMTUuMDMuMDAjTWlub3JpdHkgb3duZWQgYnVzaW5lc3MgcHJvZ3JhbXMjODQuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTQuMTYuMDAuMDAjUGVyc29uYWwgY3JlZGl0IGFnZW5jaWVzIzg0LjE0LjAwLjAwLjAwCi11bnNwc2M3Izg0LjE0LjE2LjAxLjAwI0NvbnN1bWVyIGNyZWRpdCBnYXRoZXJpbmcgb3IgcmVwb3J0aW5nIHNlcnZpY2VzIzg0LjE0LjE2LjAwLjAwCi11bnNwc2M3Izg0LjE0LjE2LjAyLjAwI0NyZWRpdCBjYXJkIHNlcnZpY2UgcHJvdmlkZXJzIzg0LjE0LjE2LjAwLjAwCi11bnNwc2M3Izg0LjE0LjE3LjAwLjAwI0J1c2luZXNzIGNyZWRpdCBhZ2VuY2llcyM4NC4xNC4wMC4wMC4wMAotdW5zcHNjNyM4NC4xNC4xNy4wMS4wMCNCdXNpbmVzcyBjcmVkaXQgZ2F0aGVyaW5nIG9yIHJlcG9ydGluZyBzZXJ2aWNlcyM4NC4xNC4xNy4wMC4wMAotdW5zcHNjNyM4NC4xNC4xNy4wMi4wMCNWYWx1ZSBhZGRlZCBuZXR3b3JrIChWQU4pIHNlcnZpY2VzIzg0LjE0LjE3LjAwLjAwCi11bnNwc2M3Izg1LjAwLjAwLjAwLjAwI0hlYWx0aGNhcmUgU2VydmljZXMjODUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTAuMDAuMDAuMDAjQ29tcHJlaGVuc2l2ZSBoZWFsdGggc2VydmljZXMjODUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTUuMDAuMDAjSGVhbHRoY2FyZSBjZW50ZXJzIzg1LjEwLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEwLjE1LjAxLjAwI0VtZXJnZW5jeSBvciBzdXJnaWNhbCBob3NwaXRhbCBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wMi4wMCNQcml2YXRlIHNwZWNpYWxpemVkIGNsaW5pYyBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wMy4wMCNNZWRpY2FsIG9mZmljZSBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wNC4wMCNQc3ljaGlhdHJpYyBob3NwaXRhbCBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wNS4wMCNSZXNwaXJhdG9yeSBob3NwaXRhbCBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wNi4wMCNTdWJzdGFuY2UgYWJ1c2UgaG9zcGl0YWwgc2VydmljZXMjODUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTUuMDcuMDAjVXJnZW50IGNhcmUgY2VudGVycyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wOC4wMCNNb2JpbGUgaGVhbHRoY2FyZSBjZW50ZXJzIG9yIHNlcnZpY2VzIzg1LjEwLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEwLjE1LjA5LjAwI0d5bmVjb2xvZ2ljYWwgb3Igb2JzdGV0cmljYWwgaG9zcGl0YWwgc2VydmljZXMjODUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTYuMDAuMDAjSGVhbHRoY2FyZSBwcm92aWRlciBzdXBwb3J0IHBlcnNvbnMjODUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTYuMDEuMDAjTnVyc2luZyBzZXJ2aWNlcyM4NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNi4wMi4wMCNNaWR3aWZlcnkgb3IgY2hpbGQgYmlydGggcHJlcGFyYXRpb24gc2VydmljZXMjODUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTYuMDMuMDAjUGVyc29uYWwgY2FyZSBzZXJ2aWNlcyBpbiBzcGVjaWFsaXplZCBpbnN0aXR1dGlvbnMjODUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTYuMDQuMDAjUGh5c2ljaWFucyBwZXJzb25uZWwgYXNzaXN0YW5jZSBzZXJ2aWNlcyM4NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNi4wNS4wMCNIb21lIGhlYWx0aCBhc3Npc3RhbnRzIzg1LjEwLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEwLjE3LjAwLjAwI0hlYWx0aCBhZG1pbmlzdHJhdGlvbiBzZXJ2aWNlcyM4NS4xMC4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNy4wMS4wMCNIZWFsdGggcG9saWN5Izg1LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEwLjE3LjAyLjAwI0hlYWx0aCBsZWdpc2xhdGlvbiBvciByZWd1bGF0aW9ucyM4NS4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNy4wMy4wMCNIZWFsdGggc2VydmljZSBwbGFubmluZyM4NS4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNy4wNC4wMCNIZWFsdGggZWNvbm9taWNzIzg1LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEwLjE3LjA1LjAwI1B1YmxpYyBoZWFsdGggYWRtaW5pc3RyYXRpb24jODUuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTcuMDYuMDAjVHJhZGl0aW9uYWwgaGVhbHRoY2FyZSBzZXJ2aWNlcyM4NS4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNy4wNy4wMCNIZWFsdGggc3lzdGVtcyBldmFsdWF0aW9uIHNlcnZpY2VzIzg1LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg1LjExLjAwLjAwLjAwI0Rpc2Vhc2UgcHJldmVudGlvbiBhbmQgY29udHJvbCM4NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wMC4wMCNDb250YWdpb3VzIGRpc2Vhc2UgcHJldmVudGlvbiBhbmQgY29udHJvbCM4NS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wMS4wMCNBaWRzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wMi4wMCNQYXJhc2l0aWMgZGlzZWFzZSBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTUuMDMuMDAjRnVuZ2FsIGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wNC4wMCNUdWJlcmN1bG9zaXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjA1LjAwI0xlcHJvc3kgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjA2LjAwI0JhY3RlcmlhbCBkaXNlYXNlIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wNy4wMCNTZXh1YWxseSB0cmFuc21pdHRlZCBkaXNlYXNlcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTUuMDguMDAjVmlyYWwgZGlzZWFzZXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjA5LjAwI1pvb25vdGljIGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4xMC4wMCNWYWNjaW5hdGlvbiBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4xMS4wMCNRdWFyYW50aW5lIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjEyLjAwI0ltbXVuaXphdGlvbiBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4xMy4wMCNEaXNpbnNlY3RpemF0aW9uIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjE0LjAwI0VwaWRlbWljcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDAuMDAjTm9uIGNvbnRhZ2lvdXMgZGlzZWFzZSBwcmV2ZW50aW9uIGFuZCBjb250cm9sIzg1LjExLjAwLjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjAxLjAwI0JvbmUgZGlzZWFzZXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjAyLjAwI0NhbmNlciBvciBsZXVrZW1pYSBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDMuMDAjRW5kb2NyaW5lIGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNi4wNC4wMCNIZWFydCBkaXNlYXNlcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDUuMDAjSW1tdW5vbG9naWMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjA2LjAwI0FsbGVyZ2llcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDcuMDAjTmV1cm9sb2dpY2FsIGRpc29yZGVycyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDguMDAjTnV0cml0aW9uYWwgZGlzZWFzZXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjA5LjAwI1JhZGlhdGlvbiBzaWNrbmVzcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMTAuMDAjRGlnZXN0aXZlIHN5c3RlbSBkaXNlYXNlcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMTEuMDAjRXllIGRpc2Vhc2UgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjEyLjAwI1Jlc3BpcmF0b3J5IGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNi4xMy4wMCNUcm9waWNhbCBkaXNlYXNlcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMTQuMDAjQ2hpbGRob29kIGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNi4xNS4wMCNEaWFycmhlYWwgZGlzZWFzZXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjE2LjAwI0FsY29ob2xpc20gcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjE3LjAwI0RydWcgYWRkaWN0aW9uIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNy4wMC4wMCNEaXNlYXNlIHZlY3RvcnMgbWFuYWdlbWVudCBhbmQgY29udHJvbCM4NS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNy4wMS4wMCNUaWNrcyBtYW5hZ2VtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTcuMDIuMDAjVHNldHNlIGZsaWVzIG1hbmFnZW1lbnQgb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNy4wMy4wMCNCYWN0ZXJpYSBtYW5hZ2VtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTcuMDQuMDAjTW9zcXVpdG8gbWFuYWdlbWVudCBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEyLjAwLjAwLjAwI01lZGljYWwgcHJhY3RpY2UjODUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTUuMDAuMDAjUHJpbWFyeSBjYXJlIHByYWN0aXRpb25lcnMgc2VydmljZXMjODUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTUuMDEuMDAjUHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMgaG9tZSB2aXNpdHMgc2VydmljZXMjODUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTUuMDIuMDAjUHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMgY29uc3VsdGF0aW9uIHNlcnZpY2VzIzg1LjEyLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE1LjAzLjAwI1ByaW1hcnkgY2FyZSBwaHlzaWNpYW5zIGNvbnRyb2wgc2VydmljZXMjODUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTUuMDQuMDAjUHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMgZW1lcmdlbmN5IG1lZGljYWwgc2VydmljZXMjODUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMDAuMDAjTWVkaWNhbCBkb2N0b3JzIHNwZWNpYWxpc3Qgc2VydmljZXMjODUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMDEuMDAjR3luZWNvbG9naWMgb3Igb2JzdGV0cmljIHNlcnZpY2VzIzg1LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE2LjAyLjAwI05lcGhyb2xvZ3kgc2VydmljZXMjODUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMDMuMDAjQ2FyZGlvbG9neSBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4wNC4wMCNQdWxvbW9uYXJ5IHNwZWNpYWxpc3RzIHNlcnZpY2VzIzg1LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE2LjA1LjAwI0dhc3Ryb2VudGVyb2xvZ2lzdHMgc2VydmljZXMjODUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMDYuMDAjR2VyaWF0cmljIHNlcnZpY2VzIzg1LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE2LjA3LjAwI1BzeWNoaWF0cmlzdCBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4wOC4wMCNQc3ljaG9sb2dpc3RzIHNlcnZpY2VzIzg1LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE2LjA5LjAwI1N1cmdlcnkgc2VydmljZXMjODUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMTAuMDAjT3BodGhhbG1vbG9naXN0cyBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4xMS4wMCNEZXJtYXRvbG9neSBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4xMi4wMCNPcnRob3BlZGljcyBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4xMy4wMCNQZWRpYXRyaWMgc2VydmljZXMjODUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMTQuMDAjTmVydm91cyBzeXN0ZW0gc3BlY2lhbGlzdCBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNy4wMC4wMCNIZWFsdGhjYXJlIHByb3ZpZGVycyBzcGVjaWFsaXN0cyBzZXJ2aWNlcyM4NS4xMi4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNy4wMS4wMCNQc3ljaG90aGVyYXBpc3RzIHNlcnZpY2VzIzg1LjEyLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE3LjAyLjAwI09wdG9tZXRyaXN0cyBzZXJ2aWNlcyM4NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNy4wMy4wMCNQb2RpYXRyaXN0cyBzZXJ2aWNlcyM4NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNy4wNC4wMCNTcGVlY2ggc3BlY2lhbGlzdHMgc2VydmljZXMjODUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTcuMDUuMDAjQWN1cHVuY3R1cmlzdHMgc2VydmljZXMjODUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTcuMDYuMDAjQ2hpcm9wcmFjdG9ycyBzZXJ2aWNlcyM4NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4wMC4wMCNNZWRpY2FsIGxhYm9yYXRvcmllcyM4NS4xMi4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4wMS4wMCNCbG9vZCBhbmFseXNpcyBsYWJvcmF0b3J5IHNlcnZpY2VzIzg1LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE4LjAyLjAwI0JhY3RlcmlvbG9naWNhbCBsYWJvcmF0b3J5IHNlcnZpY2VzIzg1LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE4LjAzLjAwI0Jpb2xvZ2ljYWwgbGFib3JhdG9yeSBzZXJ2aWNlcyM4NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4wNC4wMCNQYXRob2xvZ2ljYWwgbGFib3JhdG9yeSBzZXJ2aWNlcyM4NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4wNS4wMCNVcmluYWx5c2lzIGxhYm9yYXRvcnkgc2VydmljZXMjODUuMTIuMTguMDAuMDAKLXVuc3BzYzcjODUuMTIuMTguMDYuMDAjTmV1cm9sb2dpY2FsIGxhYm9yYXRvcnkgc2VydmljZXMjODUuMTIuMTguMDAuMDAKLXVuc3BzYzcjODUuMTIuMTguMDcuMDAjVWx0cmFzb3VuZCBsYWJvcmF0b3J5IHNlcnZpY2VzIzg1LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE4LjA4LjAwI1ggcmF5IGxhYm9yYXRvcnkgc2VydmljZXMjODUuMTIuMTguMDAuMDAKLXVuc3BzYzcjODUuMTIuMTguMDkuMDAjQmxvb2Qgb3Igc3Blcm0gb3IgdHJhbnNwbGFudCBvcmdhbiBiYW5rcyBzZXJ2aWNlcyM4NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4xMC4wMCNEcnVnIG9yIGFsY29ob2wgc2NyZWVuaW5nIzg1LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE5LjAwLjAwI1BoYXJtYWNpc3RzIzg1LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjE5LjAxLjAwI1BoYXJtYWNldXRpY2FsIHByZXBhcmF0aW9uIHNlcnZpY2VzIzg1LjEyLjE5LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE5LjAyLjAwI0NvbW1lcmNpYWwgcGhhcm1hY2V1dGljYWwgc2VydmljZXMjODUuMTIuMTkuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjAuMDAuMDAjRGVudGFsIHNlcnZpY2VzIzg1LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIwLjAxLjAwI0RlbnRpc3RzIHNlcnZpY2VzIzg1LjEyLjIwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIwLjAyLjAwI0RlbnRhbCBoeWdpZW5pc3RzIHNlcnZpY2VzIzg1LjEyLjIwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIwLjAzLjAwI0RlbnRpc3Qgc3VwcG9ydCBzdGFmZiBzZXJ2aWNlcyM4NS4xMi4yMC4wMC4wMAotdW5zcHNjNyM4NS4xMi4yMC4wNC4wMCNPcmFsIHN1cmdlb25zIHNlcnZpY2VzIzg1LjEyLjIwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIwLjA1LjAwI09ydGhvZG9udGljIHNlcnZpY2VzIzg1LjEyLjIwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIxLjAwLjAwI1JlaGFiaWxpdGF0aW9uIHNlcnZpY2VzIzg1LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIxLjAxLjAwI1BoeXNpY2FsIHRoZXJhcHkgc2VydmljZXMjODUuMTIuMjEuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjEuMDIuMDAjT2NjdXBhdGlvbmFsIHRoZXJhcHkgc2VydmljZXMjODUuMTIuMjEuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjEuMDMuMDAjUmVoYWJpbGl0YXRpb24gc2VydmljZXMgZm9yIHN1YnN0YW5jZSBhYnVzZSM4NS4xMi4yMS4wMC4wMAotdW5zcHNjNyM4NS4xMi4yMS4wNC4wMCNBdGhsZXRpYyByZWhhYmlsaXRhdGlvbiBzZXJ2aWNlcyM4NS4xMi4yMS4wMC4wMAotdW5zcHNjNyM4NS4xMi4yMS4wNS4wMCNFYXRpbmcgZGlzb3JkZXJzIHNlcnZpY2VzIzg1LjEyLjIxLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIxLjA2LjAwI0JyYWluIG9yIHNwaW5hbCBjb3JkIGluanVyeSBzZXJ2aWNlcyM4NS4xMi4yMS4wMC4wMAotdW5zcHNjNyM4NS4xMi4yMS4wNy4wMCNCbGluZCBvciB2aXNpb24gaW1wYWlyZWQgcmVoYWJpbGl0YXRpb24gc2VydmljZXMjODUuMTIuMjEuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjEuMDguMDAjU3BlZWNoIG9yIGxhbmd1YWdlIHRoZXJhcHkjODUuMTIuMjEuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjEuMDkuMDAjUmVoYWJpbGl0YXRpb24gc2VydmljZXMgZm9yIHBlb3BsZSB3aXRoIGNocm9uaWMgZGlzYWJpbGl0aWVzIzg1LjEyLjIxLjAwLjAwCi11bnNwc2M3Izg1LjEzLjAwLjAwLjAwI01lZGljYWwgc2NpZW5jZSByZXNlYXJjaCBhbmQgZXhwZXJpbWVudGF0aW9uIzg1LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEzLjE1LjAwLjAwI0V4cGVyaW1lbnRhbCBtZWRpY2luZSBzZXJ2aWNlcyM4NS4xMy4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNS4wMS4wMCNPcmdhbiB0cmFuc3BsYW50IHNlcnZpY2VzIzg1LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE1LjAyLjAwI0NsaW5pY2FsIGh1bWFuIGRydWcgdHJpYWxzIzg1LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE1LjAzLjAwI0FuaW1hbCBleHBlcmltZW50YXRpb24jODUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTUuMDQuMDAjSHVtYW4gZXhwZXJpbWVudGF0aW9uIzg1LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE1LjA1LjAwI1NwYWNlIGV4cGVyaW1lbnRhdGlvbiM4NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wMC4wMCNNZWRpY2FsIGV0aGljcyM4NS4xMy4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wMS4wMCNFdXRoYW5hc2lhIGlzc3VlcyM4NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wMi4wMCNNZWRpY2FsIGNvZGUgb2YgY29uZHVjdCM4NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wMy4wMCNNZWRpY2FsIHNvY2lldGllcyM4NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wNC4wMCNJbnRlcm5hdGlvbmFsIGRydWcgbW9uaXRvcmluZyBzZXJ2aWNlcyM4NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4wMC4wMCNNZWRpY2FsIHNjaWVuY2UgYW5kIHJlc2VhcmNoIzg1LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEzLjE3LjAxLjAwI1BoYXJtYWNldXRpY2FsIHJlc2VhcmNoIHNlcnZpY2VzIzg1LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE3LjAyLjAwI0JhY3RlcmlvbG9neSByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4wMy4wMCNCaW9tZWRpY2FsIHJlc2VhcmNoIHNlcnZpY2VzIzg1LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE3LjA0LjAwI0NhcmRpb2xvZ3kgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMDUuMDAjQW5hdG9teSByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4wNi4wMCNQYXRob2xvZ3kgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMDcuMDAjRW1icnlvbG9neSByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4wOC4wMCNFcGlkZW1pb2xvZ3kgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMDkuMDAjR2VuZXRpY3MgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMTAuMDAjSW1tdW5vbG9neSByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4xMS4wMCNQaHlzaW9sb2d5IHJlc2VhcmNoIHNlcnZpY2VzIzg1LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE3LjEyLjAwI1RveGljb2xvZ3kgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMTMuMDAjTmV1cm9sb2d5IHJlc2VhcmNoIHNlcnZpY2VzIzg1LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg1LjE0LjAwLjAwLjAwI0FsdGVybmF0aXZlIGFuZCBob2xpc3RpYyBtZWRpY2luZSM4NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNS4wMC4wMCNGYWl0aCBoZWFsZXJzIzg1LjE0LjAwLjAwLjAwCi11bnNwc2M3Izg1LjE0LjE1LjAxLjAwI1dpdGNoIGRvY3RvcnMgb3Igdm9vZG9vIHNlcnZpY2VzIzg1LjE0LjE1LjAwLjAwCi11bnNwc2M3Izg1LjE0LjE1LjAyLjAwI0ZhaXRoIGhlYWxlcnMgc2VydmljZXMjODUuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTQuMTUuMDMuMDAjU2hhbWFucyM4NS4xNC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNS4wNC4wMCNFbmVyZ3kgd29yayM4NS4xNC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNi4wMC4wMCNIZXJiYWwgdHJlYXRtZW50cyM4NS4xNC4wMC4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNi4wMS4wMCNIZXJiYWwgbWVkaWNpbmUgb3IgaGVyYmFsaXN0cyBzZXJ2aWNlcyM4NS4xNC4xNi4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNi4wMi4wMCNBbGdhZSBvciBzZWEgd2VlZCBtZWRpY2FsIGN1cmVzIzg1LjE0LjE2LjAwLjAwCi11bnNwc2M3Izg1LjE0LjE2LjAzLjAwI0hvdCBzcHJpbmdzIGN1cmUgc2VydmljZXMjODUuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTQuMTcuMDAuMDAjSG9tZW9wYXRoaWMgcHJhY3RpY2UjODUuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTQuMTcuMDEuMDAjSW5pdGlhbCBkaWFnbm9zdGljIGFzc2Vzc21lbnQjODUuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTQuMTcuMDIuMDAjUmVtZWR5IGNvbnN1bHRhdGlvbnMjODUuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTUuMDAuMDAuMDAjRm9vZCBhbmQgbnV0cml0aW9uIHNlcnZpY2VzIzg1LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg1LjE1LjE1LjAwLjAwI0Zvb2QgdGVjaG5vbG9neSM4NS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wMS4wMCNGb29kIGh5Z2llbmUgY29udHJvbCBzZXJ2aWNlcyM4NS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wMi4wMCNGb29kIGNvbnRhbWluYXRpb24gY29udHJvbCBzZXJ2aWNlcyM4NS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wMy4wMCNGb29kIHByZXNlcnZhdGlvbiBtYW5hZ2VtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTUuMDQuMDAjRm9vZCBwcmVwYXJhdGlvbiBjb3Vuc2VsaW5nIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTUuMDUuMDAjRm9vZCByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wNi4wMCNTdHVkaWVzIG9uIGZvb2RzIG9yIGZvb2QgaGFiaXRzIzg1LjE1LjE1LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE1LjA3LjAwI0Zvb2QgYWRkaXRpdmUgb3IgcXVhbGl0eSBzdGFuZGFyZHMgc2VydmljZXMjODUuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTUuMDguMDAjRm9vZCBhbmFseXNpcyBzZXJ2aWNlcyM4NS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wOS4wMCNGb29kIGxlZ2lzbGF0aW9uIHNlcnZpY2VzIzg1LjE1LjE1LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE2LjAwLjAwI051dHJpdGlvbiBpc3N1ZXMjODUuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTYuMDEuMDAjTnV0cml0aW9uIHByb2dyYW1taW5nIHNlcnZpY2VzIzg1LjE1LjE2LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE2LjAyLjAwI0JyZWFzdCBvciBib3R0bGUgZmVlZGluZyBwb2xpY3kjODUuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTYuMDMuMDAjTnV0cml0aW9uYWwgcmVoYWJpbGl0YXRpb24gc2VydmljZXMjODUuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTYuMDQuMDAjTnV0cml0aW9uIHByb2plY3QgZXZhbHVhdGlvbiM4NS4xNS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNi4wNS4wMCNGb29kIG9yIG51dHJpdGlvbiBkZXZlbG9wbWVudCBzdHJhdGVnaWVzIzg1LjE1LjE2LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE2LjA2LjAwI051dHJpZW50IGRlZmljaWVuY3kgY29udHJvbCBwcm9ncmFtcyM4NS4xNS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNi4wNy4wMCNEaWV0IGNvbnRyb2wgb3IgcHJvZ3JhbXMjODUuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTcuMDAuMDAjRm9vZCBwb2xpY3kgcGxhbm5pbmcgYW5kIGFpZCM4NS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNy4wMS4wMCNGb29kIHN0YW5kYXJkcyM4NS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNy4wMi4wMCNGb29kIGFpZCBnbG9iYWwgaW5mb3JtYXRpb24gb3IgZWFybHkgd2FybmluZyBzeXN0ZW1zIHNlcnZpY2VzIzg1LjE1LjE3LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE3LjAzLjAwI0Fzc2Vzc21lbnQgb2YgZW1lcmdlbmN5IGZvb2QgcmVxdWlyZW1lbnRzIzg1LjE1LjE3LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE3LjA0LjAwI05hdGlvbmFsIGZvb2QgaW50ZXJ2ZW50aW9uIHBvbGljeSBvciBwcm9ncmFtcyM4NS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNy4wNS4wMCNFdmFsdWF0aW9uIG9mIGZvb2QgYWlkIG51dHJpdGlvbmFsIGltcGFjdCM4NS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4Ni4wMC4wMC4wMC4wMCNFZHVjYXRpb24gYW5kIFRyYWluaW5nIFNlcnZpY2VzIzg2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEwLjAwLjAwLjAwI1ZvY2F0aW9uYWwgdHJhaW5pbmcjODYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDAuMDAjQWdyaWN1bHR1cmUgYW5kIGZvcmVzdHJ5IGFuZCBvdGhlciBuYXR1cmFsIHJlc291cmNlcyB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNS4wMS4wMCNBZ3JvIGluZHVzdHJ5IHZvY2F0aW9uYWwgdHJhaW5pbmcjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDIuMDAjRGFpcnkgaW5kdXN0cnkgdm9jYXRpb25hbCB0cmFpbmluZyM4Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNS4wMy4wMCNNZWF0IGluZHVzdHJ5IHZvY2F0aW9uYWwgdHJhaW5pbmcjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDQuMDAjQWdyaWN1bHR1cmUgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNS4wNS4wMCNSdXJhbCB5b3V0aCBvciBmYXJtZXJzIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDYuMDAjRm9yZXN0cnkgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNS4wNy4wMCNGaXNoZXJ5IHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDguMDAjRW52aXJvbm1lbnRhbCB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE1LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE1LjA5LjAwI05hdHVyYWwgcmVzb3VyY2VzIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDAuMDAjU2NpZW50aWZpYyB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEwLjE2LjAxLjAwI0NvbXB1dGVyIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDIuMDAjRW5lcmd5IHJlbGF0ZWQgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNi4wMy4wMCNDaGVtaXN0cnkgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNi4wNC4wMCNCaW9sb2d5IHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDUuMDAjTWVkaWNhbCB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE2LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE2LjA2LjAwI0VsZWN0cm9uaWNzIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDcuMDAjVGVsZWNvbW11bmljYXRpb25zIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDguMDAjSHlkcmF1bGljcyB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE2LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE2LjA5LjAwI0luZHVzdHJpYWwgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNi4xMC4wMCNFbmdpbmVlcmluZyB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE2LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE3LjAwLjAwI05vbiBzY2llbnRpZmljIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTcuMDEuMDAjQ29tbXVuaWNhdGlvbnMgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wMi4wMCNUb3VyaXNtIHJlbGF0ZWQgdHJhaW5pbmcjODYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTcuMDMuMDAjTGlicmFyeSBvciBkb2N1bWVudGF0aW9uIHRyYWluaW5nIzg2LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE3LjA0LjAwI1Byb2N1cmVtZW50IG9yIHN1cHBseSBjaGFpbiB0cmFpbmluZyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wNS4wMCNDbGVyaWNhbCB0cmFpbmluZyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wNi4wMCNIZWFsdGggYXNzaXN0YW5jZSB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE3LjA3LjAwI1BlcnNvbmFsIGNhcmUgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wOC4wMCNMaXRlcmFjeSBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wOS4wMCNTYWZldHkgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTcuMTAuMDAjVGVhY2hlciB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xMS4wMCNGaXJlIGZpZ2h0aW5nIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE3LjEyLjAwI0hhbmRjcmFmdHMgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xMy4wMCNMYXcgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xNC4wMCNMYXcgZW5mb3JjZW1lbnQgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xNS4wMCNSb2FkIG9yIHJhaWwgdHJhbnNwb3J0YXRpb24gdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xNi4wMCNTaGlwcGluZyB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjAwLjAwI0luIHNlcnZpY2UgdHJhaW5pbmcgYW5kIG1hbnBvd2VyIGRldmVsb3BtZW50Izg2LjEwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjAxLjAwI0Jhbmsgb3IgZmluYW5jZSBzZWN0b3IgbWFucG93ZXIgZGV2ZWxvcG1lbnQjODYuMTAuMTguMDAuMDAKLXVuc3BzYzcjODYuMTAuMTguMDIuMDAjUmUgdHJhaW5pbmcgb3IgcmVmcmVzaGluZyB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xOC4wMy4wMCNWb2NhdGlvbmFsIHJlaGFiaWxpdGF0aW9uIHNlcnZpY2VzIzg2LjEwLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjA0LjAwI0NvbW1lcmNpYWwgc2VjdG9yIG1hbnBvd2VyIGRldmVsb3BtZW50Izg2LjEwLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjA1LjAwI0luZHVzdHJpYWwgc2VjdG9yIG1hbnBvd2VyIGRldmVsb3BtZW50Izg2LjEwLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjA2LjAwI0hlYWx0aCBzZWN0b3IgbWFucG93ZXIgZGV2ZWxvcG1lbnQjODYuMTAuMTguMDAuMDAKLXVuc3BzYzcjODYuMTAuMTguMDcuMDAjTWFuYWdlbWVudCBzZWN0b3IgbWFucG93ZXIgZGV2ZWxvcG1lbnQjODYuMTAuMTguMDAuMDAKLXVuc3BzYzcjODYuMTAuMTguMDguMDAjUHVibGljIHNlY3RvciBtYW5wb3dlciBkZXZlbG9wbWVudCBzZXJ2aWNlcyM4Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xOC4wOS4wMCNNZXJjaGFudCBtYXJpbmUgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMS4wMC4wMC4wMCNBbHRlcm5hdGl2ZSBlZHVjYXRpb25hbCBzeXN0ZW1zIzg2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjAwLjAwI0Rpc3RhbmNlIGxlYXJuaW5nIHNlcnZpY2VzIzg2LjExLjAwLjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjAxLjAwI0Rpc3RhbmNlIGxlYXJuaW5nIGd1aWRhbmNlIHNlcnZpY2VzIzg2LjExLjE1LjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjAyLjAwI0Rpc3RhbmNlIHRlYWNoaW5nIHNlcnZpY2VzIzg2LjExLjE1LjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjAzLjAwI0NlcnRpZmljYXRlZCBkaXN0YW5jZSBsZWFybmluZyBzZXJ2aWNlcyM4Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMS4xNS4wNC4wMCNOb24gY2VydGlmaWNhdGVkIGRpc3RhbmNlIGxlYXJuaW5nIHNlcnZpY2VzIzg2LjExLjE1LjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjA1LjAwI0Rpc3RhbmNlIGxlYXJuaW5nIGFzc2Vzc21lbnQgc2VydmljZXMjODYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTEuMTYuMDAuMDAjQWR1bHQgZWR1Y2F0aW9uIzg2LjExLjAwLjAwLjAwCi11bnNwc2M3Izg2LjExLjE2LjAxLjAwI0V2ZW5pbmcgY291cnNlcyM4Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMS4xNi4wMi4wMCNQYXJ0IHRpbWUgYWR1bHQgZWR1Y2F0aW9uIHNlcnZpY2VzIzg2LjExLjE2LjAwLjAwCi11bnNwc2M3Izg2LjExLjE2LjAzLjAwI1BhcmVudCBlZHVjYXRpb24jODYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTEuMTYuMDQuMDAjRW1wbG95ZWUgRWR1Y2F0aW9uIzg2LjExLjE2LjAwLjAwCi11bnNwc2M3Izg2LjExLjE3LjAwLjAwI0xhbmd1YWdlIHNjaG9vbGluZyM4Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMS4xNy4wMS4wMCNDb252ZXJzYXRpb25hbCBmb3JlaWduIGxhbmd1YWdlIGluc3RydWN0aW9uIzg2LjExLjE3LjAwLjAwCi11bnNwc2M3Izg2LjExLjE3LjAyLjAwI0ZvcmVpZ24gbGFuZ3VhZ2UgaW1tZXJzaW9uIGluc3RydWN0aW9uIzg2LjExLjE3LjAwLjAwCi11bnNwc2M3Izg2LjExLjE4LjAwLjAwI0VkdWNhdGlvbmFsIGV4Y2hhbmdlcyM4Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMS4xOC4wMS4wMCNFZHVjYXRpb25hbCBleGNoYW5nZXMgYmV0d2VlbiB1bml2ZXJzaXRpZXMjODYuMTEuMTguMDAuMDAKLXVuc3BzYzcjODYuMTEuMTguMDIuMDAjRWR1Y2F0aW9uYWwgZXhjaGFuZ2VzIGJldHdlZW4gc2Nob29scyM4Ni4xMS4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMi4wMC4wMC4wMCNFZHVjYXRpb25hbCBpbnN0aXR1dGlvbnMjODYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTIuMTUuMDAuMDAjRWxlbWVudGFyeSBhbmQgc2Vjb25kYXJ5IHNjaG9vbHMjODYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTIuMTUuMDEuMDAjUHJlIHNjaG9vbCBlZHVjYXRpb25hbCBzZXJ2aWNlcyM4Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNS4wMi4wMCNSZWxpZ2lvdXMgZWxlbWVudGFyeSBvciBzZWNvbmRhcnkgc2Nob29scyM4Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNS4wMy4wMCNQcml2YXRlIGVsZW1lbnRhcnkgb3Igc2Vjb25kYXJ5IHNjaG9vbHMjODYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTIuMTUuMDQuMDAjUHVibGljIGVsZW1lbnRhcnkgb3Igc2Vjb25kYXJ5IHNjaG9vbHMjODYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTIuMTYuMDAuMDAjSnVuaW9yIGNvbGxlZ2VzIzg2LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEyLjE2LjAxLjAwI0NvbW11bml0eSBjb2xsZWdlcyM4Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNi4wMi4wMCNUZWNobmljYWwgaW5zdGl0dXRlcyM4Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNy4wMC4wMCNVbml2ZXJzaXR5IGFuZCBjb2xsZWdlcyM4Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNy4wMS4wMCNVbmRlcmdyYWR1YXRlIHByb2dyYW1zIzg2LjEyLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEyLjE3LjAyLjAwI1Bvc3RncmFkdWF0ZSBwcm9ncmFtcyM4Ni4xMi4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xOC4wMC4wMCNQcm9mZXNzaW9uYWwgc2Nob29scyM4Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xOC4wMi4wMCNUaGVvbG9naWNhbCBzZW1pbmFyaWVzIzg2LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEyLjE4LjAzLjAwI1RlY2huaWNhbCBwcm9mZXNzaW9uYWwgc2Nob29scyM4Ni4xMi4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xOC4wNC4wMCNOb24gdGVjaG5pY2FsIHByb2Zlc3Npb25hbCBzY2hvb2xzIzg2LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEzLjAwLjAwLjAwI1NwZWNpYWxpemVkIGVkdWNhdGlvbmFsIHNlcnZpY2VzIzg2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEzLjE1LjAwLjAwI0ZpbmUgYXJ0cyM4Ni4xMy4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMy4xNS4wMS4wMCNUaGVhdGVyIHN0dWRpZXMjODYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTUuMDIuMDAjUGFpbnRpbmcjODYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTUuMDMuMDAjU2N1bHB0dXJlIzg2LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE1LjA0LjAwI01lZGlhIHN0dWRpZXMjODYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTYuMDAuMDAjTXVzaWMgYW5kIGRyYW1hIzg2LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEzLjE2LjAxLjAwI011c2ljIHNjaG9vbHMjODYuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTYuMDIuMDAjRGFuY2UgZWR1Y2F0aW9uIzg2LjEzLjE2LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE2LjAzLjAwI0RyYW1hIHN0dWRpZXMjODYuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTcuMDAuMDAjRHJpdmluZyBhbmQgZmx5aW5nIGFuZCBzYWlsaW5nIzg2LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEzLjE3LjAxLjAwI1ZlaGljbGUgZHJpdmluZyBzY2hvb2xzIHNlcnZpY2VzIzg2LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE3LjAyLjAwI0ZsaWdodCBzY2hvb2wgc2VydmljZXMjODYuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTcuMDMuMDAjWWFjaHRpbmcgb3IgYm9hdGluZyBzY2hvb2wgc2VydmljZXMjODYuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTguMDAuMDAjTWlsaXRhcnkgZWR1Y2F0aW9uIzg2LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEzLjE4LjAxLjAwI1NlcnZpY2UgYWNhZGVtaWVzIzg2LjEzLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE4LjAyLjAwI1BpbG90IHNjaG9vbHMjODYuMTMuMTguMDAuMDAKLXVuc3BzYzcjODYuMTMuMTguMDMuMDAjTWlsaXRhcnkgcG9saWNlIHRyYWluaW5nIzg2LjEzLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE4LjA0LjAwI1dhciBjb2xsZWdlIzg2LjEzLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE5LjAwLjAwI1NjaG9vbHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM4Ni4xMy4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMy4xOS4wMS4wMCNQcmltYXJ5IHNjaG9vbGluZyBzZXJ2aWNlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzg2LjEzLjE5LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE5LjAyLjAwI1NlY29uZGFyeSBzY2hvb2xpbmcgc2VydmljZXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM4Ni4xMy4xOS4wMC4wMAotdW5zcHNjNyM4Ni4xMy4xOS4wMy4wMCNTcGVjaWFsaXplZCBzY2hvb2xzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjODYuMTMuMTkuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTkuMDQuMDAjU3BlY2lhbGl6ZWQgcmVoYWJpbGl0YXRpb24gc2VydmljZXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM4Ni4xMy4xOS4wMC4wMAotdW5zcHNjNyM4Ni4xNC4wMC4wMC4wMCNFZHVjYXRpb25hbCBmYWNpbGl0aWVzIzg2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjE0LjE1LjAwLjAwI0VkdWNhdGlvbmFsIGd1aWRhbmNlIHNlcnZpY2VzIzg2LjE0LjAwLjAwLjAwCi11bnNwc2M3Izg2LjE0LjE1LjAxLjAwI0VkdWNhdGlvbmFsIGFkdmlzb3J5IHNlcnZpY2VzIzg2LjE0LjE1LjAwLjAwCi11bnNwc2M3Izg2LjE0LjE1LjAyLjAwI1VuaXZlcnNpdGllcyBjb29wZXJhdGlvbiBndWlkYW5jZSBzZXJ2aWNlcyM4Ni4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xNC4xNS4wMy4wMCNTdHVkeSBhYnJvYWQgYWR2aXNvcnkgc2VydmljZXMjODYuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTQuMTYuMDAuMDAjU3R1ZGVudHMgb3JnYW5pemF0aW9ucyM4Ni4xNC4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xNC4xNi4wMS4wMCNTdHVkZW50cyBob2JieSBjbHVicyM4Ni4xNC4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xNC4xNi4wMi4wMCNTdHVkZW50cyB1bmlvbnMjODYuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTQuMTYuMDMuMDAjU3R1ZGVudHMgdHJhdmVsbGluZyBvcmdhbml6YXRpb25zIzg2LjE0LjE2LjAwLjAwCi11bnNwc2M3Izg2LjE0LjE3LjAwLjAwI0VkdWNhdGlvbmFsIHRlY2hub2xvZ3kjODYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTQuMTcuMDEuMDAjTGFuZ3VhZ2UgbGFib3JhdG9yaWVzIzg2LjE0LjE3LjAwLjAwCi11bnNwc2M3Izg2LjE0LjE3LjAyLjAwI0F1ZGlvIHZpc3VhbCB0ZWNobm9sb2d5Izg2LjE0LjE3LjAwLjAwCi11bnNwc2M3Izg2LjE0LjE3LjAzLjAwI0NvbXB1dGVyIHByb2dyYW1tZWQgaW5zdHJ1Y3Rpb24jODYuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTQuMTcuMDQuMDAjTGlicmFyeSBvciBkb2N1bWVudGF0aW9uIHNlcnZpY2VzIzg2LjE0LjE3LjAwLjAwCi11bnNwc2M3IzkwLjAwLjAwLjAwLjAwI1RyYXZlbCBhbmQgRm9vZCBhbmQgTG9kZ2luZyBhbmQgRW50ZXJ0YWlubWVudCBTZXJ2aWNlcyM5MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMC4wMC4wMC4wMCNSZXN0YXVyYW50cyBhbmQgY2F0ZXJpbmcjOTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTAuMTUuMDAuMDAjRWF0aW5nIGFuZCBkcmlua2luZyBlc3RhYmxpc2htZW50cyM5MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMC4xNS4wMS4wMCNSZXN0YXVyYW50cyM5MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMC4xNS4wMi4wMCNCYXJzIzkwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE1LjAzLjAwI0Zhc3QgZm9vZCBlc3RhYmxpc2htZW50cyM5MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMC4xNS4wNC4wMCNPbiBzdHJlZXQgZm9vZCB2ZW5kb3JzIzkwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE2LjAwLjAwI0JhbnF1ZXQgYW5kIGNhdGVyaW5nIHNlcnZpY2VzIzkwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkwLjEwLjE2LjAxLjAwI0JhbnF1ZXQgZmFjaWxpdGllcyM5MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5MC4xMC4xNi4wMi4wMCNQYXJ0eSB0ZW50IHNlcnZpY2VzIzkwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE2LjAzLjAwI0NhdGVyaW5nIHNlcnZpY2VzIzkwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE2LjA0LjAwI0NvbnN0cnVjdGlvbiBvciB3b3JrIHNpdGUgY2F0ZXJpbmcgc2VydmljZXMjOTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTAuMTcuMDAuMDAjQ2FmZXRlcmlhIHNlcnZpY2VzIzkwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkwLjEwLjE3LjAxLjAwI09uIHNpdGUgY2FmZXRlcmlhIG1hbmFnZW1lbnQjOTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTAuMTAuMTguMDAuMDAjQ2FycnlvdXQgYW5kIHRha2Vhd2F5IHNlcnZpY2VzIzkwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkwLjEwLjE4LjAxLjAwI1Byb2Zlc3Npb25hbGx5IHByZXBhcmVkIGNhcnJ5b3V0IG1lYWxzIzkwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE4LjAyLjAwI0RlbGl2ZXJlZCBtZWFscyBzZXJ2aWNlcyM5MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5MC4xMS4wMC4wMC4wMCNIb3RlbHMgYW5kIGxvZGdpbmcgYW5kIG1lZXRpbmcgZmFjaWxpdGllcyM5MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNS4wMC4wMCNIb3RlbHMgYW5kIG1vdGVscyBhbmQgaW5ucyM5MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNS4wMS4wMCNIb3RlbHMjOTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTUuMDIuMDAjTG9kZ2VzIG9yIHJlc29ydHMjOTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTUuMDMuMDAjQmVkIGFuZCBicmVha2Zhc3QgaW5ucyM5MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNS4wNC4wMCNDb3R0YWdlIHJlbnRhbCBzZXJ2aWNlcyM5MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNi4wMC4wMCNNZWV0aW5nIGZhY2lsaXRpZXMjOTAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTYuMDEuMDAjQ29uZmVyZW5jZSBjZW50ZXJzIzkwLjExLjE2LjAwLjAwCi11bnNwc2M3IzkwLjExLjE2LjAyLjAwI1ZpZGVvY29uZmVyZW5jaW5nIGZhY2lsaXRpZXMjOTAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTYuMDMuMDAjTWVldGluZyBvciBiYW5xdWV0IHJvb21zIzkwLjExLjE2LjAwLjAwCi11bnNwc2M3IzkwLjExLjE3LjAwLjAwI0NhbXBpbmcgYW5kIHdpbGRlcm5lc3MgZmFjaWxpdGllcyM5MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNy4wMS4wMCNDYW1wc2l0ZXMjOTAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTcuMDIuMDAjR292ZXJubWVudCBvd25lZCBwYXJrcyM5MC4xMS4xNy4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNy4wMy4wMCNSZWNyZWF0aW9uYWwgdmVoaWNsZSBjYW1wc2l0ZSBmYWNpbGl0aWVzIzkwLjExLjE3LjAwLjAwCi11bnNwc2M3IzkwLjEyLjAwLjAwLjAwI1RyYXZlbCBmYWNpbGl0YXRpb24jOTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTIuMTUuMDAuMDAjVHJhdmVsIGFnZW50cyM5MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMi4xNS4wMS4wMCNUb3VyIGFycmFuZ2VtZW50IHNlcnZpY2VzIzkwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEyLjE1LjAyLjAwI1RyYXZlbCBhZ2VuY2llcyM5MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMi4xNS4wMy4wMCNDaGFydGVyaW5nIHNlcnZpY2VzIzkwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEyLjE2LjAwLjAwI1RyYXZlbCBkb2N1bWVudCBhc3Npc3RhbmNlIzkwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzkwLjEyLjE2LjAxLjAwI1Bhc3Nwb3J0IHNlcnZpY2VzIzkwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkwLjEyLjE2LjAyLjAwI1Zpc2Egb3IgYXV4aWxsaWFyeSBkb2N1bWVudCBzZXJ2aWNlcyM5MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5MC4xMi4xNy4wMC4wMCNHdWlkZXMgYW5kIGludGVycHJldGVycyM5MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMi4xNy4wMS4wMCNBcmVhIG9yIHRvdXIgZ3VpZGVzIzkwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzkwLjEyLjE3LjAyLjAwI0ludGVycHJldGVycyM5MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM5MC4xMy4wMC4wMC4wMCNQZXJmb3JtaW5nIGFydHMjOTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTMuMTUuMDAuMDAjTGl2ZSBwZXJmb3JtYW5jZXMjOTAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTMuMTUuMDEuMDAjVGhlYXRyaWNhbCBwZXJmb3JtYW5jZXMgb3IgcGxheXMjOTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTMuMTUuMDIuMDAjRGFuY2UgcGVyZm9ybWFuY2VzIzkwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEzLjE1LjAzLjAwI09wZXJhIzkwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEzLjE1LjA0LjAwI0NvbmNlcnRzIzkwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEzLjE2LjAwLjAwI1RhcGVkIG9yIG1vdGlvbiBwaWN0dXJlIHBlcmZvcm1hbmNlcyM5MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMy4xNi4wMS4wMCNNb3Rpb24gcGljdHVyZXMjOTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTMuMTYuMDIuMDAjVmlkZW90YXBlZCBlbnRlcnRhaW5tZW50IzkwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzkwLjE0LjAwLjAwLjAwI0NvbW1lcmNpYWwgc3BvcnRzIzkwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkwLjE0LjE1LjAwLjAwI1Byb2Zlc3Npb25hbCBzcG9ydGluZyBldmVudHMjOTAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTQuMTUuMDEuMDAjTGVhZ3VlIHBsYXkjOTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTQuMTUuMDIuMDAjQ29tcGV0aXRpdmUgZXZlbnRzIzkwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzkwLjE0LjE1LjAzLjAwI0V4aGliaXRpb25zIzkwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzkwLjE0LjE2LjAwLjAwI1Nwb3J0cyBldmVudCBwcm9tb3Rpb24gYW5kIHNwb25zb3JzaGlwIzkwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE0LjE2LjAxLjAwI0NvbXBhbnkgc3BvbnNvcmVkIHByb2Zlc3Npb25hbCBzcG9ydHMgZXZlbnRzIzkwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkwLjE0LjE2LjAyLjAwI0NvbXBhbnkgc3BvbnNvcmVkIGFtYXRldXIgc3BvcnRzIGV2ZW50cyM5MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM5MC4xNC4xNi4wMy4wMCNTcG9ydGluZyBldmVudCBwcm9tb3Rpb24gc2VydmljZXMjOTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTQuMTcuMDAuMDAjQW1hdGV1ciBhbmQgcmVjcmVhdGlvbmFsIHNwb3J0cyM5MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xNC4xNy4wMS4wMCNZb3V0aCBjb21wZXRpdGl2ZSBzcG9ydHMgbGVhZ3VlcyM5MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM5MC4xNC4xNy4wMi4wMCNBZHVsdCBzcG9ydHMgbGVhZ3VlcyM5MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM5MC4xNC4xNy4wMy4wMCNZb3V0aCBzcG9ydHMjOTAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMDAuMDAuMDAjRW50ZXJ0YWlubWVudCBzZXJ2aWNlcyM5MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNS4wMC4wMCNUb3VyaXN0IGF0dHJhY3Rpb25zIzkwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE1LjE1LjAxLjAwI011c2V1bXMjOTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTUuMDIuMDAjSGlzdG9yaWNhbCBvciBjdWx0dXJhbCBzaXRlcyM5MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNS4wMy4wMCNab29sb2dpY2FsIGdhcmRlbnMjOTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTYuMDAuMDAjVHJhdmVsbGluZyBzaG93cyM5MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNi4wMS4wMCNDaXJjdXNlcyM5MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNi4wMi4wMCNUb3VyaW5nIGNvbXBhbmllcyM5MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNi4wMy4wMCNBcnQgZXhoaWJpdGlvbnMjOTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTcuMDAuMDAjQW11c2VtZW50IHBhcmtzIzkwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE1LjE3LjAxLjAwI1RoZW1lIHBhcmtzIzkwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzkwLjE1LjE3LjAyLjAwI1dhdGVyIHBhcmtzIzkwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzkwLjE1LjE3LjAzLjAwI01pbmlhdHVyZSBnb2xmIGNvdXJzZXMjOTAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTguMDAuMDAjQ2Fybml2YWxzIGFuZCBmYWlycyM5MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM5MC4xNS4xOC4wMS4wMCNUcmF2ZWxsaW5nIGNhcm5pdmFscyM5MC4xNS4xOC4wMC4wMAotdW5zcHNjNyM5MC4xNS4xOC4wMi4wMCNGYWlyIG9yZ2FuaXphdGlvbiBvciBtYW5hZ2VtZW50IHNlcnZpY2VzIzkwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzkwLjE1LjE5LjAwLjAwI0dhbWJsaW5nIGFuZCBiZXR0aW5nIGVzdGFibGlzaG1lbnRzIzkwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE1LjE5LjAxLjAwI0Nhc2lub3MjOTAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTkuMDIuMDAjQ2FyZCBjbHVicyM5MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM5MC4xNS4xOS4wMy4wMCNSYWNldHJhY2tzIzkwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzkwLjE1LjIwLjAwLjAwI05pZ2h0Y2x1YnMgYW5kIGRhbmNlIGhhbGxzIzkwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE1LjIwLjAxLjAwI05pZ2h0Y2x1YnMjOTAuMTUuMjAuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMjAuMDIuMDAjRGFuY2UgaGFsbHMjOTAuMTUuMjAuMDAuMDAKLXVuc3BzYzcjOTEuMDAuMDAuMDAuMDAjUGVyc29uYWwgYW5kIERvbWVzdGljIFNlcnZpY2VzIzkxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkxLjEwLjAwLjAwLjAwI1BlcnNvbmFsIGFwcGVhcmFuY2UjOTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTUuMDAuMDAjU3BhIGFuZCB3b3Jrb3V0IGFuZCByZWp1dmVuYXRpb24gZmFjaWxpdGllcyM5MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNS4wMS4wMCNIZWFsdGggb3IgZml0bmVzcyBjbHVicyM5MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNS4wMi4wMCNTcGFzIzkxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE1LjAzLjAwI01hc3NhZ2Ugc2VydmljZXMjOTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTUuMDQuMDAjQWVyb2JpY3Mgb3IgZXhlcmNpc2UgY2xhc3NlcyM5MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNS4wNS4wMCNUdXJraXNoIG9yIHN0ZWFtIG9yIHJpdHVhbCBiYXRocyM5MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNi4wMC4wMCNGYWNlIGFuZCBib2R5IGNhcmUgYW5kIGFkb3JubWVudCM5MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNi4wMS4wMCNGYWNpYWwgb3IgYm9keSB0cmVhdG1lbnRzIzkxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE2LjAyLjAwI01ha2UgdXAgY29uc3VsdGF0aW9uIzkxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE2LjAzLjAwI1RhdHRvbyBzZXJ2aWNlcyM5MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNi4wNC4wMCNCb2R5IHBpZXJjaW5nIHNlcnZpY2VzIzkxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE2LjA1LjAwI0VsZWN0cm9seXNpcyM5MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNy4wMC4wMCNIYWlyIGNhcmUjOTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTcuMDEuMDAjSGFpciBjdXR0aW5nIG9yIGNvbG9yIHNlcnZpY2VzIzkxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE3LjAyLjAwI0hhaXIgd2VhdmluZyBvciByZXBsYWNlbWVudCBzZXJ2aWNlcyM5MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM5MS4xMC4xOC4wMC4wMCNDbG90aGluZyByZW50YWwjOTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTguMDEuMDAjVHV4ZWRvIG9yIGZvcm1hbHdlYXIgcmVudGFsIzkxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE4LjAyLjAwI0V2ZW5pbmcgb3IgYnJpZGFsIGdvd24gb3IgZHJlc3MgcmVudGFsIzkxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE4LjAzLjAwI0Nvc3R1bWUgcmVudGFsIzkxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE5LjAwLjAwI0Zhc2hpb24gY29uc3VsdGFudHMjOTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTkuMDEuMDAjQ29sb3IgY29uc3VsdGFudCM5MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM5MS4xMC4xOS4wMi4wMCNGYXNoaW9uIHN0eWxpc3QjOTEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTkuMDMuMDAjV2FyZHJvYmUgY29uc3VsdGFudCM5MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM5MS4xMS4wMC4wMC4wMCNEb21lc3RpYyBhbmQgcGVyc29uYWwgYXNzaXN0YW5jZSM5MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM5MS4xMS4xNS4wMC4wMCNMYXVuZGVyaW5nIHNlcnZpY2VzIzkxLjExLjAwLjAwLjAwCi11bnNwc2M3IzkxLjExLjE1LjAxLjAwI1VuaWZvcm0gcmVudGFsIzkxLjExLjE1LjAwLjAwCi11bnNwc2M3IzkxLjExLjE1LjAyLjAwI0xhdW5kcnkgc2VydmljZXMjOTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTUuMDMuMDAjRHJ5IGNsZWFuaW5nIzkxLjExLjE1LjAwLjAwCi11bnNwc2M3IzkxLjExLjE1LjA0LjAwI0NvaW4gb3BlcmF0ZWQgc2VsZiBzZXJ2aWNlIGxhdW5kcmllcyM5MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM5MS4xMS4xNi4wMC4wMCNIb3VzZWhvbGQgYXNzaXN0YW5jZSBhbmQgY2FyZSM5MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM5MS4xMS4xNi4wMS4wMCNIb3VzZWtlZXBpbmcgc2VydmljZXMjOTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTYuMDIuMDAjWWFyZCBvciBwb29sIGNhcmUgc2VydmljZXMjOTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTYuMDMuMDAjQ29va2luZyBvciBmb29kIHByZXBhcmF0aW9uIHNlcnZpY2VzIzkxLjExLjE2LjAwLjAwCi11bnNwc2M3IzkxLjExLjE3LjAwLjAwI0NvbnN1bWVyIGJ1eWluZyBhbmQgYmFydGVyaW5nIHNlcnZpY2VzIzkxLjExLjAwLjAwLjAwCi11bnNwc2M3IzkxLjExLjE3LjAxLjAwI1VzZWQgY2xvdGhpbmcgY29uc2lnbm1lbnQgc2VydmljZXMjOTEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTcuMDIuMDAjQmFydGVyIGNsdWJzIG9yIGNvbnNvcnRpdW1zIzkxLjExLjE3LjAwLjAwCi11bnNwc2M3IzkxLjExLjE3LjAzLjAwI1dhcmRyb2JlIGJ1eWluZyBzZXJ2aWNlcyM5MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM5MS4xMS4xOC4wMC4wMCNQZXJzb25hbCBpdGVtIGNhcmUgYW5kIHN0b3JhZ2UjOTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTguMDEuMDAjVmFsZXQgc2VydmljZXMjOTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTguMDIuMDAjQ2hlY2sgcm9vbSBjb25jZXNzaW9ucyM5MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM5MS4xMS4xOC4wMy4wMCNMb2NrZXIgcmVudGFsIzkxLjExLjE4LjAwLjAwCi11bnNwc2M3IzkxLjExLjE4LjA0LjAwI0Z1ciBzdG9yYWdlIzkxLjExLjE4LjAwLjAwCi11bnNwc2M3IzkxLjExLjE5LjAwLjAwI1BlcnNvbmFsIGNhcmUgc2VydmljZXMjOTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTkuMDEuMDAjSW5mYW50IG9yIGNoaWxkIGRheWNhcmUgc2VydmljZXMjOTEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTkuMDIuMDAjTmFubnkgb3IgYmFieXNpdHRpbmcgc2VydmljZXMjOTEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTkuMDMuMDAjRWxkZXJseSBkYXljYXJlIHNlcnZpY2VzIzkxLjExLjE5LjAwLjAwCi11bnNwc2M3IzkxLjExLjE5LjA0LjAwI0Fzc2lzdGVkIGxpdmluZyBzZXJ2aWNlcyM5MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM5Mi4wMC4wMC4wMC4wMCNOYXRpb25hbCBEZWZlbnNlIGFuZCBQdWJsaWMgT3JkZXIgYW5kIFNlY3VyaXR5IGFuZCBTYWZldHkgU2VydmljZXMjOTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMDAuMDAuMDAjUHVibGljIG9yZGVyIGFuZCBzYWZldHkjOTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTUuMDAuMDAjUG9saWNlIHNlcnZpY2VzIzkyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkyLjEwLjE1LjAxLjAwI1BvbGljaW5nIHNlcnZpY2VzIzkyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkyLjEwLjE1LjAyLjAwI1NwZWNpYWwgd2VhcG9ucyBhbmQgdGFjdGljcyAoU1dBVCkgb3IgcmlvdCB0ZWFtcyM5Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xNS4wMy4wMCNDb21tdW5pdHkgb3V0cmVhY2ggcHJvZ3JhbXMjOTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTUuMDQuMDAjQ3JpbWUgZGV0ZXJyZW5jZSBwcm9ncmFtcyM5Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xNi4wMC4wMCNGaXJlIHNlcnZpY2VzIzkyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkyLjEwLjE2LjAxLjAwI011bmljaXBhbCBvciBuYXRpb25hbCBmaXJlZmlnaHRpbmcgc2VydmljZXMjOTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTYuMDIuMDAjVm9sdW50ZWVyIGZpcmUgZGVwYXJ0bWVudCBzZXJ2aWNlcyM5Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xNi4wMy4wMCNGaXJlIHByZXZlbnRpb24gc2VydmljZXMjOTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTYuMDQuMDAjRm9yZXN0IG9yIHdpbGRlcm5lc3MgZmlyZWZpZ2h0aW5nIHNlcnZpY2VzIzkyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkyLjEwLjE3LjAwLjAwI0phaWwgYW5kIHByaXNvbiBzeXN0ZW0jOTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTcuMDEuMDAjSmFpbCBvciBwcmlzb24gb3IgcGVuaXRlbnRpYXJ5IHNlcnZpY2VzIzkyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkyLjEwLjE3LjAyLjAwI1lvdXRoIGNhbXBzIG9yIGZhY2lsaXRpZXMgc2VydmljZXMjOTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTcuMDMuMDAjSGFsZiB3YXkgaG91c2Ugc2VydmljZXMjOTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTcuMDQuMDAjTWVudGFsbHkgaW1wYWlyZWQgY3JpbWluYWwgZmFjaWxpdGllcyM5Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xOC4wMC4wMCNDb3VydCBzeXN0ZW0jOTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTguMDEuMDAjU2hlcmlmZnMgc2VydmljZXMjOTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTguMDIuMDAjUGxlYSBiYXJnYWluIGFncmVlbWVudHMjOTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTguMDMuMDAjQ2l2aWwgY2FzZSBjb3VydCBleHBlbnNlcyM5Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xOC4wNC4wMCNDcmltaW5hbCBjYXNlIGZlZXMgb3IgZmluZXMjOTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTguMDUuMDAjQXBwZWFscyBwcm9jZXNzIG9yIGp1ZGljaWFsIHJldmlldyM5Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xOS4wMC4wMCNSZXNjdWUgc2VydmljZXMjOTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTkuMDEuMDAjU2VhcmNoIGFuZCByZXNjdWUgdGVhbXMjOTIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTkuMDIuMDAjQW1idWxhbmNlIHNlcnZpY2VzIzkyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzkyLjEwLjE5LjAzLjAwI0xpZmUgc2F2aW5nIGhlbGljb3B0ZXIgc2VydmljZXMjOTIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTkuMDQuMDAjTGlmZWd1YXJkIHNlcnZpY2VzIGZvciBwb29sIG9yIGJlYWNoIzkyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzkyLjExLjAwLjAwLjAwI01pbGl0YXJ5IHNlcnZpY2VzIGFuZCBuYXRpb25hbCBkZWZlbnNlIzkyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjE1LjAwLjAwI01haW50ZW5hbmNlIG9mIGludGVybmF0aW9uYWwgcGVhY2UgYW5kIHNlY3VyaXR5IzkyLjExLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjE1LjAxLjAwI0Rpc3B1dGUgbWVkaWF0aW9uIG9yIGNvbmNpbGlhdGlvbiBvciBuZWdvdGlhdGlvbiBvciBzZXR0bGVtZW50IzkyLjExLjE1LjAwLjAwCi11bnNwc2M3IzkyLjExLjE1LjAyLjAwI1BlYWNlIGtlZXBpbmcgb3BlcmF0aW9ucyM5Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNS4wMy4wMCNDZWFzZSBmaXJlIGFncmVlbWVudHMgb3IgdHJ1Y2Ugc3VwZXJ2aXNpb24jOTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTUuMDQuMDAjRmFjdCBmaW5kaW5nIG1pc3Npb25zIzkyLjExLjE1LjAwLjAwCi11bnNwc2M3IzkyLjExLjE1LjA1LjAwI1dhciBwcmV2ZW50aW9uIHN0cmF0ZWdpZXMjOTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTUuMDYuMDAjQ291bnRlcnRlcnJvcmlzbSM5Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNS4wNy4wMCNFbWJhcmdvZXMjOTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTYuMDAuMDAjRGlzYXJtYW1lbnQjOTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTYuMDEuMDAjQXJtcyBsaW1pdGF0aW9ucyM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNi4wMi4wMCNDb252ZW50aW9uYWwgYXJtcyBkaXNhcm1hbWVudCM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNi4wMy4wMCNOdWNsZWFyIGZyZWV6ZXMgb3IgZGlzYXJtYW1lbnQjOTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTYuMDQuMDAjV2VhcG9ucyBkZXN0cnVjdGlvbiM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNi4wNS4wMCNEaXNhcm1hbWVudCBuZWdvdGlhdGlvbnMgb3IgYWdyZWVtZW50cyM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNi4wNi4wMCNNdXR1YWwgb3IgYmFsYW5jZWQgZm9yY2UgcmVkdWN0aW9ucyM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNy4wMC4wMCNNaWxpdGFyeSBzY2llbmNlIGFuZCByZXNlYXJjaCM5Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNy4wMS4wMCNNaWxpdGFyeSBoaXN0b3J5IzkyLjExLjE3LjAwLjAwCi11bnNwc2M3IzkyLjExLjE3LjAyLjAwI0NvbnZlbnRpb25hbCB3ZWFwb25zIHVzYWdlIzkyLjExLjE3LjAwLjAwCi11bnNwc2M3IzkyLjExLjE3LjAzLjAwI0NoZW1pY2FsIHdlYXBvbnMgdXNhZ2UjOTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTcuMDQuMDAjR3VlcmlsbGEgd2FyZmFyZSM5Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNy4wNS4wMCNNaWxpdGFyeSBzdHJhdGVneSM5Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNy4wNi4wMCNBZXJpYWwgbWFuZXV2ZXJzIzkyLjExLjE3LjAwLjAwCi11bnNwc2M3IzkyLjExLjE3LjA3LjAwI05hdmFsIG9yIHN1Ym1hcmluZSBtYW5ldXZlcnMjOTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTcuMDguMDAjTGFuZCBtYW5ldXZlcnMjOTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDAuMDAjTWlsaXRhcnkgcGVyc29ubmVsIGFuZCBkaXNjaXBsaW5lIzkyLjExLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjE4LjAxLjAwI0NpdmlsIGRlZmVuc2UjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDIuMDAjQ29tcHVsc29yeSBtaWxpdGFyeSBzZXJ2aWNlcyM5Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xOC4wMy4wMCNWb2x1bnRhcnkgbWlsaXRhcnkgc2VydmljZXMjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDQuMDAjTWlsaXRhcnkgcmVzZXJ2aXN0cyM5Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xOC4wNS4wMCNHdWVyaWxsYXMjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDYuMDAjTWVyY2VuYXJpZXMjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDcuMDAjVmV0ZXJhbnMjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDguMDAjTWlsaXRhcnkgY291cnRzIzkyLjExLjE4LjAwLjAwCi11bnNwc2M3IzkyLjExLjE4LjA5LjAwI01pbGl0YXJ5IG9mZmVuc2VzIzkyLjExLjE4LjAwLjAwCi11bnNwc2M3IzkyLjExLjE4LjEwLjAwI01pbGl0YXJ5IHBlcnNvbm5lbCM5Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xOS4wMC4wMCNNaWxpdGFyeSBwb2xpY3kjOTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTkuMDEuMDAjTmF0aW9uYWwgc2VjdXJpdHkjOTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTkuMDIuMDAjRGVmZW5zZSBjb250cmFjdHMjOTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTkuMDMuMDAjTm9uIGZpcnN0IHVzZSBwb2xpY3kjOTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTkuMDQuMDAjQXJtcyByYWNlIzkyLjExLjE5LjAwLjAwCi11bnNwc2M3IzkyLjExLjE5LjA1LjAwI01pbGl0YXJ5IHJlbGF0aW9ucyM5Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMC4wMC4wMCNNaWxpdGFyeSB6b25lcyM5Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMC4wMS4wMCNEZW1pbGl0YXJpemVkIHpvbmVzIzkyLjExLjIwLjAwLjAwCi11bnNwc2M3IzkyLjExLjIwLjAyLjAwI051Y2xlYXIgb3IgY2hlbWljYWwgd2VhcG9uIGZyZWUgem9uZXMjOTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjAuMDMuMDAjUGVhY2Ugem9uZXMjOTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjAuMDQuMDAjTm8gZmx5IHpvbmVzIzkyLjExLjIwLjAwLjAwCi11bnNwc2M3IzkyLjExLjIxLjAwLjAwI051Y2xlYXIgd2FyZmFyZSM5Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMS4wMS4wMCNOdWNsZWFyIHNhZmVndWFyZHMjOTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjEuMDIuMDAjTnVjbGVhciB3ZWFwb24gdGVzdHMjOTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjEuMDMuMDAjTnVjbGVhciBub24gcHJvbGlmZXJhdGlvbiM5Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMi4wMC4wMCNNaWxpdGFyeSB0YWN0aWNzIzkyLjExLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjIyLjAxLjAwI1dlYXBvbnMgZGVwbG95bWVudCM5Mi4xMS4yMi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMi4wMi4wMCNNaWxpdGFyeSByZWNvbm5haXNzYW5jZSM5Mi4xMS4yMi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMi4wMy4wMCNBcm1zIHRyYW5zZmVycyM5Mi4xMS4yMi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMi4wNC4wMCNNaWxpdGFyeSBhc3Npc3RhbmNlIzkyLjExLjIyLjAwLjAwCi11bnNwc2M3IzkyLjExLjIyLjA1LjAwI1Ryb29wIHdpdGhkcmF3YWxzIzkyLjExLjIyLjAwLjAwCi11bnNwc2M3IzkyLjExLjIyLjA2LjAwI1JhcGlkIGRlcGxveW1lbnQgZm9yY2VzIzkyLjExLjIyLjAwLjAwCi11bnNwc2M3IzkyLjExLjIyLjA3LjAwI0Vudmlyb25tZW50YWwgd2FyZmFyZSM5Mi4xMS4yMi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMy4wMC4wMCNNaWxpdGFyeSBiYXNlcyM5Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMy4wMS4wMCNEb21lc3RpYyBtaWxpdGFyeSBiYXNlcyM5Mi4xMS4yMy4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMy4wMi4wMCNGb3JlaWduIG1pbGl0YXJ5IGJhc2VzIzkyLjExLjIzLjAwLjAwCi11bnNwc2M3IzkyLjExLjIzLjAzLjAwI05hdmFsIGJhc2VzIzkyLjExLjIzLjAwLjAwCi11bnNwc2M3IzkyLjExLjI0LjAwLjAwI0FybWVkIGNvbmZsaWN0cyBhbmQgaW5jaWRlbnRzIzkyLjExLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjI0LjAxLjAwI0JvcmRlciBpbmNpZGVudHMjOTIuMTEuMjQuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjQuMDIuMDAjTGltaXRlZCB3YXIjOTIuMTEuMjQuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjQuMDMuMDAjTnVjbGVhciB3YXIjOTIuMTEuMjQuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjQuMDQuMDAjU3BhY2UgYmFzZWQgd2FyIzkyLjExLjI0LjAwLjAwCi11bnNwc2M3IzkyLjExLjI0LjA1LjAwI1Jlc3BvbnNlIHRvIHRlcnJvcmlzdCBhdHRhY2tzIzkyLjExLjI0LjAwLjAwCi11bnNwc2M3IzkyLjEyLjAwLjAwLjAwI1NlY3VyaXR5IGFuZCBwZXJzb25hbCBzYWZldHkjOTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTUuMDAuMDAjR3VhcmQgc2VydmljZXMjOTIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTUuMDEuMDAjQXJtb3JlZCBjYXIgc2VydmljZXMjOTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTUuMDIuMDAjQnVyZ2xhcnkgcHJvdGVjdGlvbiBzZXJ2aWNlcyM5Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNS4wMy4wMCNHdWFyZCBkb2cgcmVudGFsIzkyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkyLjEyLjE1LjA0LjAwI1NlY3VyaXR5IGd1YXJkIHNlcnZpY2VzIzkyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkyLjEyLjE2LjAwLjAwI0RldGVjdGl2ZSBzZXJ2aWNlcyM5Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNi4wMS4wMCNEZXRlY3RpdmUgYWdlbmNpZXMjOTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTYuMDIuMDAjRmluZ2VycHJpbnQgc2VydmljZXMjOTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTYuMDMuMDAjTGllIGRldGVjdGlvbiBzZXJ2aWNlcyM5Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNi4wNC4wMCNQcml2YXRlIGludmVzdGlnYXRpb24gc2VydmljZXMjOTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTcuMDAuMDAjU2VjdXJpdHkgc3lzdGVtcyBzZXJ2aWNlcyM5Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNy4wMS4wMCNTdXJ2ZWlsbGFuY2Ugb3IgYWxhcm0gbWFpbnRlbmFuY2Ugb3IgbW9uaXRvcmluZyM5Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNy4wMi4wMCNGaXJlIGFsYXJtIG1haW50ZW5hbmNlIG9yIG1vbml0b3JpbmcjOTIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTcuMDMuMDAjU3RvcmUgb3IgYnVzaW5lc3MgYW50aSB0aGVmdCBzZXJ2aWNlcyM5Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNy4wNC4wMCNDb25maW5lbWVudCBzdXJ2ZWlsbGFuY2Ugc3lzdGVtcyBtYWludGVuYW5jZSBvciBtb25pdG9yaW5nIzkyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzkzLjAwLjAwLjAwLjAwI1BvbGl0aWNzIGFuZCBDaXZpYyBBZmZhaXJzIFNlcnZpY2VzIzkzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkzLjEwLjAwLjAwLjAwI1BvbGl0aWNhbCBzeXN0ZW1zIGFuZCBpbnN0aXR1dGlvbnMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTUuMDAuMDAjUG9saXRpY2FsIGJvZGllcyM5My4xMC4wMC4wMC4wMAotdW5zcHNjNyM5My4xMC4xNS4wMS4wMCNQb2xpdGljYWwgcGFydGllcyByZXByZXNlbnRhdGlvbiBzZXJ2aWNlcyM5My4xMC4xNS4wMC4wMAotdW5zcHNjNyM5My4xMC4xNS4wMi4wMCNQb2xpdGljYWwgcGFydGllcyBmdW5kIHJhaXNpbmcgc2VydmljZXMjOTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTUuMDMuMDAjUG9saXRpY2FsIHBhcnRpZXMgcHVibGljIGFwcGVhcmFuY2Ugc2VydmljZXMjOTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTUuMDQuMDAjUG9saXRpY2FsIGxlZ2lzbGF0dXJlIHNlcnZpY2VzIzkzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE1LjA1LjAwI1BvbGl0aWNhbCBqdWRpY2lhbCBwb3dlciBvciBzZXJ2aWNlcyM5My4xMC4xNS4wMC4wMAotdW5zcHNjNyM5My4xMC4xNS4wNi4wMCNQb2xpdGljYWwgZXhlY3V0aXZlIHBvd2VyIG9yIHNlcnZpY2VzIzkzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE2LjAwLjAwI1BvbGl0aWNhbCBvZmZpY2lhbHMjOTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTYuMDEuMDAjQ2FiaW5ldCBvZmZpY2VycyBzZXJ2aWNlcyM5My4xMC4xNi4wMC4wMAotdW5zcHNjNyM5My4xMC4xNi4wMi4wMCNHb3Zlcm5vcnMgc2VydmljZXMjOTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTYuMDMuMDAjSGVhZHMgb2Ygc3RhdGVzIHNlcnZpY2VzIzkzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE2LjA0LjAwI1ByZXNpZGVudGlhbCBzZXJ2aWNlcyM5My4xMC4xNi4wMC4wMAotdW5zcHNjNyM5My4xMC4xNi4wNS4wMCNQcmltZSBtaW5pc3RlcnMgc2VydmljZXMjOTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTYuMDYuMDAjTW9uYXJjaCBzZXJ2aWNlcyM5My4xMC4xNi4wMC4wMAotdW5zcHNjNyM5My4xMC4xNi4wNy4wMCNTdGF0ZXNtZW4gc2VydmljZXMjOTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTYuMDguMDAjUGFybGlhbWVudCBtZW1iZXJzIHNlcnZpY2VzIzkzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE3LjAwLjAwI0xlZ2lzbGF0aXZlIGJvZGllcyBhbmQgcHJhY3RpY2UjOTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTcuMDEuMDAjTmF0aW9uYWwgY291bmNpbCBzZXJ2aWNlcyM5My4xMC4xNy4wMC4wMAotdW5zcHNjNyM5My4xMC4xNy4wMi4wMCNDb3Jwb3JhdGUgc3RhdGVzIzkzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE3LjAzLjAwI0JpbGwgZHJhZnRpbmcgc2VydmljZXMjOTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTcuMDQuMDAjTGVnaXNsYXRpdmUgaGVhcmluZ3Mgc2VydmljZXMjOTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTcuMDUuMDAjSW50ZWxsaWdlbmNlIHNlcnZpY2VzIzkzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE3LjA2LjAwI0xlZ2lzbGF0b3JzIHNlcnZpY2VzIzkzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE3LjA3LjAwI1BhcmxpYW1lbnRhcnkgcHJhY3RpY2Ugc2VydmljZXMjOTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMDAuMDAuMDAjU29jaW8gcG9saXRpY2FsIGNvbmRpdGlvbnMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTUuMDAuMDAjUG9saXRpY2FsIG1vdmVtZW50cyM5My4xMS4wMC4wMC4wMAotdW5zcHNjNyM5My4xMS4xNS4wMS4wMCNFeHRyZW1pc3QgbW92ZW1lbnRzIzkzLjExLjE1LjAwLjAwCi11bnNwc2M3IzkzLjExLjE1LjAyLjAwI1BlYWNlIG1vdmVtZW50cyM5My4xMS4xNS4wMC4wMAotdW5zcHNjNyM5My4xMS4xNS4wMy4wMCNQcm90ZXN0IG1vdmVtZW50cyM5My4xMS4xNS4wMC4wMAotdW5zcHNjNyM5My4xMS4xNS4wNC4wMCNVbmRlcmdyb3VuZCBtb3ZlbWVudHMjOTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTUuMDUuMDAjU3R1ZGVudCBtb3ZlbWVudHMjOTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTUuMDYuMDAjUGVhc2FudCBtb3ZlbWVudHMjOTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTUuMDcuMDAjT3Bwb3NpdGlvbiBtb3ZlbWVudHMjOTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTYuMDAuMDAjUG9saXRpY2FsIHJlcHJlc2VudGF0aW9uIGFuZCBwYXJ0aWNpcGF0aW9uIzkzLjExLjAwLjAwLjAwCi11bnNwc2M3IzkzLjExLjE2LjAxLjAwI1BvbGl0aWNhbCByZXByZXNlbnRhdGlvbiM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wMi4wMCNQb2xpdGljYWwgcGFydGljaXBhdGlvbiM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wMy4wMCNQcm9wb3J0aW9uYWwgcmVwcmVzZW50YXRpb24jOTMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTYuMDQuMDAjVm90ZSBjYXRjaGVyIHNlcnZpY2VzIzkzLjExLjE2LjAwLjAwCi11bnNwc2M3IzkzLjExLjE2LjA1LjAwI1ZvdGVyIHJlZ2lzdHJhdGlvbiBvciBjb3VudGluZyBvciBhbmFseXNpcyBvciBzY3J1dGlueSBzZXJ2aWNlcyM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wNi4wMCNQcmVzc3VyZSBncm91cHMgcmVwcmVzZW50YXRpb24gb3IgcGFydGljaXBhdGlvbiBzZXJ2aWNlcyM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wNy4wMCNFbGVjdGlvbiBhbmFseXNpcyBzZXJ2aWNlcyM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wOC4wMCNFbGVjdGlvbiBvcmdhbml6YXRpb24gc2VydmljZXMjOTMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMDAuMDAuMDAjSW50ZXJuYXRpb25hbCByZWxhdGlvbnMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDAuMDAjRGlwbG9tYWN5IzkzLjEyLjAwLjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjAxLjAwI0RpcGxvbWF0aWMgc2VydmljZXMjOTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDIuMDAjQ29uc3VsYXIgc2VydmljZXMjOTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDMuMDAjRGlwbG9tYXRzIHNlY3VyaXR5IHNlcnZpY2VzIzkzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjA0LjAwI0RpcGxvbWF0aWMgcHJpdmlsZWdlcyBvciBpbW11bml0aWVzIHNlcnZpY2VzIzkzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjA1LjAwI1N0YXRlIGltbXVuaXRpZXMgc2VydmljZXMjOTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDYuMDAjRW1iYXNzaWVzIG9yIGFtYmFzc2Fkb3JzIHNlcnZpY2VzIzkzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjA3LjAwI1N0YXRlIHZpc2l0cyBvcmdhbml6YXRpb24gc2VydmljZXMjOTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDguMDAjSW50ZXJuYXRpb25hbCBsYXcgcHJlc2NyaXB0aW9uIHNlcnZpY2VzIzkzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjA5LjAwI0ludGVybmF0aW9uYWwgbGF3IHByb21vdGlvbiBvciByZWNvZ25pdGlvbiBzZXJ2aWNlcyM5My4xMi4xNS4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4wMC4wMCNJbnRlcm5hdGlvbmFsIHJlbGF0aW9ucyBhbmQgY29vcGVyYXRpb24jOTMuMTIuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTYuMDEuMDAjTXVsdGlsYXRlcmFsIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjAyLjAwI01pbGl0YXJ5IGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjAzLjAwI1BvbGl0aWNhbCBjb29wZXJhdGlvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4wNC4wMCNJbnRlcm5hdGlvbmFsIGVjb25vbWljIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjA1LjAwI05vcnRoIHNvdXRoIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjA2LjAwI0Vhc3Qgd2VzdCBjb29wZXJhdGlvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4wNy4wMCNJbnRlcm5hdGlvbmFsIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjA4LjAwI05vbiBnb3Zlcm5tZW50YWwgbGlhaXNvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4wOS4wMCNOb24gYWxpZ25lZCBjb3VudHJpZXMgY29vcGVyYXRpb24jOTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTYuMTAuMDAjQWxpZ25lZCBjb3VudHJpZXMgY29vcGVyYXRpb24jOTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTYuMTEuMDAjUG9saXRpY2FsIGNyaW1lcyBjb29wZXJhdGlvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4xMi4wMCNQZWFjZSB0cmVhdGllcyBjb29wZXJhdGlvbiM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4xMy4wMCNUcmVhdHkgc2lnbmF0dXJlIG9yIGFjY2Vzc2lvbnMgb3IgcmVjdGlmaWNhdGlvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4xNC4wMCNJbnRlcm5hdGlvbmFsIHdhdGVyY291cnNlIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjE1LjAwI1RlcnJpdG9yaWFsIGNsYWltcyBvciBuZWdvdGlhdGlvbnMgdGhpcmQgcGFydHkgc2VydmljZXMjOTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDAuMDAjSW50ZXJuYXRpb25hbCBvcmdhbml6YXRpb25zIzkzLjEyLjAwLjAwLjAwCi11bnNwc2M3IzkzLjEyLjE3LjAxLjAwI1N5c3RlbSBvZiBvcmdhbml6YXRpb25zIHNlcnZpY2VzIzkzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE3LjAyLjAwI1NlY3VyaXR5IGNvdW5jaWwgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDMuMDAjRWNvbm9taWMgb3Igc29jaWFsIGNvdW5jaWwgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDQuMDAjU2VjcmV0YXJpYXQgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDUuMDAjVHJ1c3RzaGlwIGNvdW5jaWwgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDYuMDAjR2VuZXJhbCBhc3NlbWJseSBzZXJ2aWNlcyM5My4xMi4xNy4wMC4wMAotdW5zcHNjNyM5My4xMi4xNy4wNy4wMCNJbnRlcm5hdGlvbmFsIGNvdXJ0IG9mIGp1c3RpY2Ugc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDguMDAjSW50ZXJuYXRpb25hbCBwb2xpdGljYWwgb3JnYW5pemF0aW9ucyBzZXJ2aWNlcyM5My4xMi4xNy4wMC4wMAotdW5zcHNjNyM5My4xMi4xNy4wOS4wMCNJbnRlcm5hdGlvbmFsIGNoYXJpdHkgb3JnYW5pemF0aW9ucyBzZXJ2aWNlcyM5My4xMi4xNy4wMC4wMAotdW5zcHNjNyM5My4xMi4xNy4xMC4wMCNJbnRlcm5hdGlvbmFsIGh1bWFuIHJlbGllZiBvcmdhbml6YXRpb25zIHNlcnZpY2VzIzkzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE3LjExLjAwI0ludGVybmF0aW9uYWwgaGVhbHRoIG9yZ2FuaXphdGlvbnMgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMDAuMDAuMDAjSHVtYW5pdGFyaWFuIGFpZCBhbmQgcmVsaWVmIzkzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkzLjEzLjE1LjAwLjAwI1JlZnVnZWUgcHJvZ3JhbXMjOTMuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTUuMDEuMDAjUHJvdGVjdGlvbiBvZiBodW1hbiByaWdodHMgc2VydmljZXMjOTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTUuMDIuMDAjUHJvbW90aW9uIG9mIGh1bWFuIHJpZ2h0cyBzZXJ2aWNlcyM5My4xMy4xNS4wMC4wMAotdW5zcHNjNyM5My4xMy4xNS4wMy4wMCNIdW1hbiByaWdodHMgZWR1Y2F0aW9uIG9yIGluZm9ybWF0aW9uIGRpc3NlbWluYXRpb24gc2VydmljZXMjOTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTUuMDQuMDAjUmVmdWdlZSBlbWVyZ2VuY3kgYXNzaXN0YW5jZSBzZXJ2aWNlcyM5My4xMy4xNS4wMC4wMAotdW5zcHNjNyM5My4xMy4xNS4wNS4wMCNSZWZ1Z2VlIGNhbXBzIHNlcnZpY2VzIzkzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE1LjA2LjAwI1JlZnVnZWUgcmVzZXR0bGVtZW50cyBvciByZXBhdHJpYXRpb24gc2VydmljZXMjOTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTUuMDcuMDAjRGlzcGxhY2VkIHBlcnNvbnMgYXNzaXN0YW5jZSBzZXJ2aWNlcyM5My4xMy4xNS4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4wMC4wMCNGb29kIGFuZCBudXRyaXRpb24gcG9saWN5IHBsYW5uaW5nIGFuZCBwcm9ncmFtcyM5My4xMy4wMC4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4wMS4wMCNIdW5nZXIgZXJhZGljYXRpb24gcHJvZ3JhbXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDIuMDAjRW1lcmdlbmN5IGZvb2Qgc3VwcGx5IHNlcnZpY2VzIzkzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE2LjAzLjAwI1dvcmxkIGZvb2QgcHJvZ3JhbSBzZXJ2aWNlcyM5My4xMy4xNi4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4wNC4wMCNGb29kIG9yIGFncmljdWx0dXJlIG9yZ2FuaXphdGlvbiBzZXJ2aWNlcyM5My4xMy4xNi4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4wNS4wMCNDb21tb24gZnVuZCBmb3IgY29tbW9kaXRpZXMgc2VydmljZXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDYuMDAjSW50ZXJuYXRpb25hbCBmdW5kIGZvciBhZ3JpY3VsdHVyYWwgZGV2ZWxvcG1lbnQgc2VydmljZXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDcuMDAjRm9vZCBkaXN0cmlidXRpb24gc2VydmljZXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDguMDAjRm9vZCBzdXBwbHkgc2VydmljZXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDkuMDAjRm9vZCBhaWQgcG9saWNpZXMgb3IgcHJvZ3JhbXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMTAuMDAjRm9vZCBwbGFubmluZyBzZXJ2aWNlcyM5My4xMy4xNi4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4xMS4wMCNGb29kIHNlY3VyaXR5IHNlcnZpY2VzIzkzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE2LjEyLjAwI0Zvb2QgcmVzZXJ2ZXMgbWFuYWdlbWVudCM5My4xMy4xNi4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4xMy4wMCNGb29kIHNob3J0YWdlIG9yIHN1cnBsdXMgbWFuYWdlbWVudCBvciBjb250cm9sIHNlcnZpY2VzIzkzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE3LjAwLjAwI0hlYWx0aCBwcm9ncmFtcyM5My4xMy4wMC4wMC4wMAotdW5zcHNjNyM5My4xMy4xNy4wMS4wMCNBbnRpIHRvYmFjY28gY2FtcGFpZ25zIzkzLjEzLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE3LjAyLjAwI1Nhbml0YXRpb24gcHJvZ3JhbXMjOTMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTcuMDMuMDAjUmVzZWFyY2ggcHJvZ3JhbXMjOTMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTcuMDQuMDAjRGlzZWFzZSBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjOTMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTcuMDUuMDAjRHJ1ZyBhYnVzZSBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgcHJvZ3JhbXMjOTMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTguMDAuMDAjRGlzYXN0ZXIgcHJlcGFyZWRuZXNzIGFuZCByZWxpZWYjOTMuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTguMDEuMDAjRGlzYXN0ZXIgd2FybmluZyBzZXJ2aWNlcyM5My4xMy4xOC4wMC4wMAotdW5zcHNjNyM5My4xMy4xOC4wMi4wMCNEaXNhc3RlciBwcmVwYXJlZG5lc3MgcmVzcG9uc2Ugc2VydmljZXMjOTMuMTMuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTguMDMuMDAjRW1lcmdlbmN5IGhvdXNpbmcgc2VydmljZXMjOTMuMTMuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMDAuMDAuMDAjQ29tbXVuaXR5IGFuZCBzb2NpYWwgc2VydmljZXMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDAuMDAjU29jaWFsIGRldmVsb3BtZW50IGFuZCBzZXJ2aWNlcyM5My4xNC4wMC4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4wMS4wMCNTb2NpYWwgcG9saWN5IHNlcnZpY2VzIzkzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE1LjAyLjAwI1NvY2lhbCBzZWN1cml0eSBsZWdpc2xhdGlvbiBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4wMy4wMCNTb2NpYWwgcGxhbm5pbmcgc2VydmljZXMjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDQuMDAjRm9zdGVyIGhvbWUgY2FyZSBzZXJ2aWNlcyBvciBvcnBoYW5hZ2UjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDUuMDAjQWRvcHRpb24gc2VydmljZXMjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDYuMDAjU29jaWFsIHdlbGZhcmUgc2VydmljZXMjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDcuMDAjU29jaWFsIHdvcmsgYWRtaW5pc3RyYXRpb24gc2VydmljZXMjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDguMDAjVm9sdW50YXJ5IHNlcnZpY2UgbWFuYWdlbWVudCM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4wOS4wMCNTb2NpYWwgcHJvYmxlbXMgYW5hbHlzaXMgb3IgbWFuYWdlbWVudCBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xMC4wMCNTb2NpYWwgc3RydWN0dXJlIHN0dWRpZXMgb3IgcmVsYXRlZCBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xMS4wMCNTb2NpYWwgZ3JvdXBzIHN0dWRpZXMgb3IgcmVsYXRlZCBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xMi4wMCNZb3V0aCBtb3ZlbWVudHMgb3Igb3JnYW5pemF0aW9ucyBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xMy4wMCNTb2NpYWwganVzdGljZSBvciBsZWdpc2xhdGlvbiBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xNC4wMCNTb2NpbyBjdWx0dXJhbCBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNi4wMC4wMCNQb3B1bGF0aW9uIzkzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjAxLjAwI1BvcHVsYXRpb24gY2Vuc3VzIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjAyLjAwI1BvcHVsYXRpb24gc2FtcGxlIHN1cnZleXMgc2VydmljZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMDMuMDAjQmlydGggcmVwb3J0aW5nIG9yIGNvbnRyb2wgc2VydmljZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMDQuMDAjUG9wdWxhdGlvbiBjb250cm9sIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjA1LjAwI1BvcHVsYXRpb24gdHJlbmRzIG9yIHByb2plY3Rpb25zIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjA2LjAwI0JpcnRoIHN0YXRpc3RpY3Mgc2VydmljZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMDcuMDAjTWFycmlhZ2UgcmVzZWFyY2ggb3Igc3RhdGlzdGljcyBzZXJ2aWNlcyM5My4xNC4xNi4wMC4wMAotdW5zcHNjNyM5My4xNC4xNi4wOC4wMCNQb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvciBhbmFseXNpcyBzZXJ2aWNlcyM5My4xNC4xNi4wMC4wMAotdW5zcHNjNyM5My4xNC4xNi4wOS4wMCNQb3B1bGF0aW9uIGNvbXBvc2l0aW9uIGFuYWx5c2lzIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjEwLjAwI0RlbW9ncmFwaGljIHN0dWRpZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMTEuMDAjSW1taWdyYXRpb24gYW5hbHlzaXMgb3Igc2VydmljZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMTIuMDAjRmFtaWx5IHBsYW5uaW5nIHByb2dyYW1zIG9yIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjEzLjAwI0h1bWFuIHJlcHJvZHVjdGlvbiBhbmFseXNpcyM5My4xNC4xNi4wMC4wMAotdW5zcHNjNyM5My4xNC4xNy4wMC4wMCNDdWx0dXJlIzkzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjAxLjAwI0N1bHR1cmFsIGV2ZW50cyBvcmdhbml6YXRpb25zIzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjAyLjAwI0N1bHR1cmUgcHJvbW90aW9uYWwgc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMDMuMDAjQXJ0IHJlbGF0ZWQgc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMDQuMDAjU29uZyB3cml0aW5nIHNlcnZpY2VzIzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjA1LjAwI0xpdGVyYXJ5IHdyaXRpbmcgc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMDYuMDAjTWlub3JpdGllcyBwcm90ZWN0aW9uIHNlcnZpY2VzIzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjA3LjAwI0N1bHR1cmFsIGhlcml0YWdlIHByZXNlcnZhdGlvbiBvciBwcm9tb3Rpb24gc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMDguMDAjTXVzZXVtIHNlcnZpY2VzIzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjA5LjAwI0N1bHR1cmFsIHBvbGljeSBzZXJ2aWNlcyM5My4xNC4xNy4wMC4wMAotdW5zcHNjNyM5My4xNC4xNy4xMC4wMCNBcmNoYWljIG9yIGluZGlnZW5vdXMgbGFuZ3VhZ2Ugc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMTEuMDAjVHJhZGl0aW9uYWwgaGFuZGNyYWZ0cyBwcm9tb3Rpb24gc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMTIuMDAjUHJvdGVjdGlvbiBvZiBpbnRlbGxlY3R1YWwgb3IgY3VsdHVyYWwgcHJvcGVydHkgc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMTMuMDAjSGlzdG9yaWMgc2l0ZXMgb3IgbW9udW1lbnRzIHByb3RlY3Rpb24gc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMTQuMDAjTXl0aG9sb2d5IzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjAwLjAwI0VtcGxveW1lbnQjOTMuMTQuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDEuMDAjRW1wbG95bWVudCBwcm9tb3Rpb24gb3IgcGxhbm5pbmcgc2VydmljZXMjOTMuMTQuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDIuMDAjUmVjcnVpdG1lbnQgc2VydmljZXMjOTMuMTQuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDMuMDAjSW50ZXJuYXRpb25hbCBsYWJvciBzdGFuZGFyZHMgc2VydmljZXMjOTMuMTQuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDQuMDAjSW50ZXJuYXRpb25hbCBsYWJvciByZWdpc3RyYXRpb24gc2VydmljZXMjOTMuMTQuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDUuMDAjVW5lbXBsb3ltZW50IHNlcnZpY2VzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjA2LjAwI0VtcGxveW1lbnQgc3RhdGlzdGljcyBvciBmb3JlY2FzdGluZyBzZXJ2aWNlcyM5My4xNC4xOC4wMC4wMAotdW5zcHNjNyM5My4xNC4xOC4wNy4wMCNXb3JrIHRpbWUgYXJyYW5nZW1lbnRzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjA4LjAwI09jY3VwYXRpb25hbCBoZWFsdGggb3Igc2FmZXR5IHNlcnZpY2VzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjEwLjAwI0NhcmVlciBkZXZlbG9wbWVudCBzZXJ2aWNlcyM5My4xNC4xOC4wMC4wMAotdW5zcHNjNyM5My4xNC4xOC4xMS4wMCNQcm9tb3Rpb25hbCBzZXJ2aWNlcyM5My4xNC4xOC4wMC4wMAotdW5zcHNjNyM5My4xNC4xOC4xMi4wMCNMYWJvciBpbnNwZWN0aW9uIHNlcnZpY2VzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjEzLjAwI1dvcmsgY291bmNpbCBzZXJ2aWNlcyM5My4xNC4xOC4wMC4wMAotdW5zcHNjNyM5My4xNC4xOC4xNC4wMCNJbnRlcm5hdGlvbmFsIGxhYm9yIHNlcnZpY2VzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjAwLjAwI1J1cmFsIGRldmVsb3BtZW50IzkzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjAxLjAwI0FncmljdWx0dXJhbCBjb21tZXJjaWFsIGJhbmtpbmcgc2VydmljZXMjOTMuMTQuMTkuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTkuMDIuMDAjUnVyYWwgaW52ZXN0bWVudCBzZXJ2aWNlcyM5My4xNC4xOS4wMC4wMAotdW5zcHNjNyM5My4xNC4xOS4wMy4wMCNBZ3JpY3VsdHVyYWwgaW5zdGl0dXRpb25zIG9yZ2FuaXphdGlvbiBvciBtYW5hZ2VtZW50IHNlcnZpY2VzIzkzLjE0LjE5LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjA0LjAwI0FncmljdWx0dXJhbCBvciBydXJhbCBjb29wZXJhdGl2ZXMgc2VydmljZXMjOTMuMTQuMTkuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTkuMDUuMDAjQWdyaWN1bHR1cmFsIHJlc2VhcmNoIHNlcnZpY2VzIzkzLjE0LjE5LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjA2LjAwI0Zhcm1lcnMgb3IgcGVhc2FudHMgb3JnYW5pemF0aW9ucyBzZXJ2aWNlcyM5My4xNC4xOS4wMC4wMAotdW5zcHNjNyM5My4xNC4xOS4wNy4wMCNXb21lbnMgc2VydmljZXMgaW4gYWdyaWN1bHR1cmFsIHByb2R1Y3Rpb24gb3IgcnVyYWwgZGV2ZWxvcG1lbnQjOTMuMTQuMTkuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTkuMDguMDAjQWdyYXJpYW4gcmVmb3JtIG9yIGxhbmQgc2V0dGxlbWVudCBzZXJ2aWNlcyM5My4xNC4xOS4wMC4wMAotdW5zcHNjNyM5My4xNC4xOS4wOS4wMCNMYW5kIGFkbWluaXN0cmF0aW9uIHNlcnZpY2VzIzkzLjE0LjE5LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjEwLjAwI0lzbGFuZCBkZXZlbG9wbWVudCBzZXJ2aWNlcyM5My4xNC4xOS4wMC4wMAotdW5zcHNjNyM5My4xNC4yMC4wMC4wMCNVcmJhbiBkZXZlbG9wbWVudCM5My4xNC4wMC4wMC4wMAotdW5zcHNjNyM5My4xNC4yMC4wMS4wMCNVcmJhbiBkZXZlbG9wbWVudCBwbGFubmluZyBzZXJ2aWNlcyM5My4xNC4yMC4wMC4wMAotdW5zcHNjNyM5My4xNC4yMC4wMi4wMCNVcmJhbiBsYW5kIGFkbWluaXN0cmF0aW9uIHNlcnZpY2VzIzkzLjE0LjIwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIwLjAzLjAwI1VyYmFuIGludmVzdG1lbnQgcHJvZ3JhbW1pbmcgc2VydmljZXMjOTMuMTQuMjAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMjAuMDQuMDAjU2x1bSByZWRldmxvcG1lbnQgc2VydmljZXMjOTMuMTQuMjAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMjAuMDUuMDAjVXJiYW4gbGlnaHRpbmcgc2VydmljZXMjOTMuMTQuMjAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMjAuMDYuMDAjVXJiYW4gZGV2ZWxvcG1lbnQgY29udHJvbCBvciByZWd1bGF0aW9ucyBzZXJ2aWNlcyM5My4xNC4yMC4wMC4wMAotdW5zcHNjNyM5My4xNC4yMC4wNy4wMCNVcmJhbiBidWlsZGluZyBzdGFuZGFyZHMgb3IgcmVndWxhdGlvbnMgc2VydmljZXMjOTMuMTQuMjAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMjAuMDguMDAjVXJiYW4gY29tbXVuaXR5IHNlcnZpY2VzIzkzLjE0LjIwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIwLjA5LjAwI1VyYmFuIHByb2plY3Qgb3IgcHJvZ3JhbSBhZG1pbmlzdHJhdGlvbiBvciBtYW5hZ2VtZW50IHNlcnZpY2VzIzkzLjE0LjIwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIxLjAwLjAwI1JlZ2lvbmFsIGRldmVsb3BtZW50IzkzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIxLjAxLjAwI1JlZ2lvbmFsIGRldmVsb3BtZW50IHBsYW5uaW5nIHNlcnZpY2VzIzkzLjE0LjIxLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIxLjAyLjAwI0Vjb25vbWljIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjE0LjIxLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIxLjAzLjAwI1RlY2huaWNhbCBjb29wZXJhdGlvbiBzZXJ2aWNlcyM5My4xNC4yMS4wMC4wMAotdW5zcHNjNyM5My4xNC4yMS4wNC4wMCNTZWN0b3JhbCBwbGFubmluZyBzZXJ2aWNlcyM5My4xNC4yMS4wMC4wMAotdW5zcHNjNyM5My4xNS4wMC4wMC4wMCNQdWJsaWMgYWRtaW5pc3RyYXRpb24gYW5kIGZpbmFuY2Ugc2VydmljZXMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMDAuMDAjUHVibGljIGFkbWluaXN0cmF0aW9uIzkzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjAxLjAwI1B1YmxpYyBlbnRlcnByaXNlcyBtYW5hZ2VtZW50IG9yIGZpbmFuY2lhbCBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4wMi4wMCNQdWJsaWMgZW50ZXJwcmlzZXMgaW5mb3JtYXRpb24gb3IgY29udHJvbCBzeXN0ZW1zIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjAzLjAwI1ByaXZhdGl6YXRpb24gcHJvZ3JhbXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMDQuMDAjQWRtaW5pc3RyYXRpdmUgcmVmb3JtIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjA1LjAwI0FkbWluaXN0cmF0aXZlIGFnZW5jaWVzIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjA2LjAwI0FkbWluaXN0cmF0aXZlIGVjb25vbWljIGNvdW5jaWwgc2VydmljZXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMDcuMDAjQWRtaW5pc3RyYXRpdmUgcHJvY2VkdXJlcyBvciBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4wOC4wMCNHb3Zlcm5tZW50IGRlcGFydG1lbnRzIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjA5LjAwI0dvdmVybm1lbnQgaW5mb3JtYXRpb24gc2VydmljZXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMTAuMDAjQWRtaW5pc3RyYXRpdmUgZmVlcyBvciB0YXggY29sbGVjdGlvbiBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4xMS4wMCNBZG1pbmlzdHJhdGl2ZSBhY3RzIHJhdGlmaWNhdGlvbiBvciBpbXBsZW1lbnRhdGlvbiBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4xMi4wMCNQdWJsaWMgaW5zdGl0dXRpb25zIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjEzLjAwI011bHRpbmF0aW9uYWwgcHVibGljIGNvcnBvcmF0aW9ucyBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4xNC4wMCNPbWJ1ZHNtYW4gc2VydmljZXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMTUuMDAjTmF0aW9uYWwgcGxhbm5pbmcgc2VydmljZXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDAuMDAjUHVibGljIGZpbmFuY2UjOTMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDEuMDAjUHJvZ3JhbSBidWRnZXRpbmcgc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDIuMDAjR292ZXJubWVudCBidWRnZXRpbmcgc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDMuMDAjQnVkZ2V0IG9yIHB1YmxpYyBpbnZlc3RtZW50IG1hbmFnZW1lbnQjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDQuMDAjTWlsaXRhcnkgZXhwZW5kaXR1cmVzIGJ1ZGdldGluZyBzZXJ2aWNlcyM5My4xNS4xNi4wMC4wMAotdW5zcHNjNyM5My4xNS4xNi4wNS4wMCNHb3Zlcm5tZW50IGZpbmFuY2Ugc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDYuMDAjR292ZXJubWVudCBhY2NvdW50aW5nIHNlcnZpY2VzIzkzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE2LjA3LjAwI0dvdmVybm1lbnQgYXVkaXRpbmcgc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDguMDAjR292ZXJubWVudCBvciBjZW50cmFsIGJhbmsgc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDkuMDAjTG90dGVyaWVzIHNlcnZpY2VzIzkzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE2LjEwLjAwI1RheCBjb2xsZWN0aW9uIHNlcnZpY2VzIzkzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE2LjExLjAwI1N1YnNpZGllcyM5My4xNS4xNi4wMC4wMAotdW5zcHNjNyM5My4xNS4xNy4wMC4wMCNDdXJyZW5jeSM5My4xNS4wMC4wMC4wMAotdW5zcHNjNyM5My4xNS4xNy4wMS4wMCNDdXJyZW5jaWVzIG9yIGNvaW5hZ2UjOTMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTcuMDIuMDAjTmF0aW9uYWwgYmFuayBub3RlcyM5My4xNS4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4wMC4wMC4wMCNUYXhhdGlvbiM5My4wMC4wMC4wMC4wMAotdW5zcHNjNyM5My4xNi4xNS4wMC4wMCNJbmNvbWUgdGF4IzkzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE2LjE1LjAxLjAwI05hdGlvbmFsIGluY29tZSB0YXgjOTMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTUuMDIuMDAjTXVuaWNpcGFsIGluY29tZSB0YXgjOTMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTUuMDMuMDAjQ2FwaXRhbCBnYWlucyB0YXgjOTMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTUuMDQuMDAjRXhjZXNzIHByb2ZpdHMgdGF4IzkzLjE2LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE2LjAwLjAwI1RheGVzIG90aGVyIHRoYW4gaW5jb21lIHRheCM5My4xNi4wMC4wMC4wMAotdW5zcHNjNyM5My4xNi4xNi4wMS4wMCNQcm9wZXJ0eSB0YXgjOTMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTYuMDIuMDAjTGFuZCB0YXgjOTMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTYuMDMuMDAjVmFsdWUgYWRkZWQgdGF4IChWQVQpIzkzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE2LjA0LjAwI1BheXJvbGwgdGF4IzkzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE2LjA1LjAwI1NhbGVzIHRheCM5My4xNi4xNi4wMC4wMAotdW5zcHNjNyM5My4xNi4xNi4wNi4wMCNTb2NpYWwgc2VjdXJpdHkgdGF4IzkzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE2LjA3LjAwI0luaGVyaXRhbmNlIG9yIHRyYW5zZmVyIHRheCM5My4xNi4xNi4wMC4wMAotdW5zcHNjNyM5My4xNi4xNy4wMC4wMCNUYXggYWRtaW5pc3RyYXRpb24jOTMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTcuMDEuMDAjVGF4IGNvbGxhdGlvbiM5My4xNi4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4xNy4wMi4wMCNUYXggaW5jZW50aXZlcyM5My4xNi4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4xNy4wMy4wMCNUYXggc3lzdGVtcyM5My4xNi4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4xNy4wNC4wMCNUYXggcmV2ZW51ZSBhZG1pbmlzdHJhdGlvbiM5My4xNi4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wMC4wMCNUYXhhdGlvbiBpc3N1ZXMjOTMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTguMDEuMDAjVGF4IHJlZm9ybSM5My4xNi4xOC4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wMi4wMCNUYXhhdGlvbiBwb2xpY3kjOTMuMTYuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTguMDMuMDAjVGF4IHJlc2VhcmNoIzkzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE4LjA0LjAwI0ludmVzdG1lbnQgdGF4IGNyZWRpdCM5My4xNi4xOC4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wNS4wMCNUYXggZGVkdWN0aW9ucyM5My4xNi4xOC4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wNi4wMCNUYXggZXZhc2lvbiM5My4xNi4xOC4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wNy4wMCNUYXggc2hlbHRlcnMgb3IgaGF2ZW5zIzkzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE4LjA4LjAwI1RheCByZXR1cm5zIzkzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE3LjAwLjAwLjAwI1RyYWRlIHBvbGljeSBhbmQgcmVndWxhdGlvbiM5My4wMC4wMC4wMC4wMAotdW5zcHNjNyM5My4xNy4xNS4wMC4wMCNUcmFkZSBwb2xpY3kjOTMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTUuMDEuMDAjVHJhZGUgYWdyZWVtZW50cyM5My4xNy4xNS4wMC4wMAotdW5zcHNjNyM5My4xNy4xNS4wMi4wMCNUcmFkZSBuZWdvdGlhdGlvbnMjOTMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTUuMDMuMDAjRm9ybXVsYXRpb24gb2YgbmF0aW9uYWwgY29tbW9kaXR5IHBvbGljaWVzIzkzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE3LjE1LjA0LjAwI0RldmVsb3BtZW50IG9mIHNtYWxsIHNjYWxlIGluZHVzdHJpZXMjOTMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTYuMDAuMDAjSW50ZXJuYXRpb25hbCB0cmFkZSM5My4xNy4wMC4wMC4wMAotdW5zcHNjNyM5My4xNy4xNi4wMS4wMCNJbnRlcm5hdGlvbmFsIGNvbW1vZGl0eSBhZ3JlZW1lbnRzIzkzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE3LjE2LjAyLjAwI0V4cG9ydCBwb2xpY3kjOTMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTYuMDMuMDAjR2xvYmFsIHRyYWRlIHBvbGljaWVzIG9yIHByb2NlZHVyZXMjOTMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTYuMDQuMDAjQmlsYXRlcmFsIHRyYWRlIGFncmVlbWVudHMjOTMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTcuMDAuMDAjQ3VzdG9tcyBhZG1pbmlzdHJhdGlvbiBhbmQgY29tcGxpYW5jZSM5My4xNy4wMC4wMC4wMAotdW5zcHNjNyM5My4xNy4xNy4wMS4wMCNDdXN0b21zIGNvbnZlbnRpb25zIzkzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE3LjE3LjAyLjAwI0N1c3RvbXMgZm9ybWFsaXRpZXMjOTMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTcuMDMuMDAjQ3VzdG9tcyBvZmZlbmNlcyM5My4xNy4xNy4wMC4wMAotdW5zcHNjNyM5My4xNy4xOC4wMC4wMCNUcmFkZSBhbmFseXNpcyM5My4xNy4wMC4wMC4wMAotdW5zcHNjNyM5My4xNy4xOC4wMS4wMCNUcmFkZSBwcm9qZWN0aW9ucyM5My4xNy4xOC4wMC4wMAotdW5zcHNjNyM5My4xNy4xOC4wMi4wMCNCYWxhbmNlIG9mIHRyYWRlIHByb2plY3Rpb25zIzkzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE3LjE4LjAzLjAwI1RyYWRlIHN0YXRpc3RpY3MjOTMuMTcuMTguMDAuMDAKLXVuc3BzYzcjOTQuMDAuMDAuMDAuMDAjT3JnYW5pemF0aW9ucyBhbmQgQ2x1YnMjOTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMDAuMDAuMDAjV29yayByZWxhdGVkIG9yZ2FuaXphdGlvbnMjOTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTUuMDAuMDAjQnVzaW5lc3MgYXNzb2NpYXRpb25zIzk0LjEwLjAwLjAwLjAwCi11bnNwc2M3Izk0LjEwLjE1LjAxLjAwI0FncmljdWx0dXJhbCBpbmR1c3RyeSBhc3NvY2lhdGlvbnMjOTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTUuMDIuMDAjUmVndWxhdG9yeSBhc3NvY2lhdGlvbnMjOTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTUuMDMuMDAjU2VjdG9yYWwgYnVzaW5lc3MgYXNzb2NpYXRpb25zIzk0LjEwLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE1LjA0LjAwI0ludGVybmF0aW9uYWwgYnVzaW5lc3MgYXNzb2NpYXRpb25zIzk0LjEwLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE1LjA1LjAwI0VtcGxveWVycyBhc3NvY2lhdGlvbnMjOTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTYuMDAuMDAjUHJvZmVzc2lvbmFsIGFzc29jaWF0aW9ucyM5NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNi4wMS4wMCNEZW50YWwgYXNzb2NpYXRpb25zIzk0LjEwLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE2LjAyLjAwI01lZGljYWwgaGVhbHRoIGFzc29jaWF0aW9ucyM5NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNi4wMy4wMCNOdXJzaW5nIGFzc29jaWF0aW9ucyM5NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNi4wNC4wMCNBY2NvdW50aW5nIGFzc29jaWF0aW9ucyM5NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNi4wNS4wMCNBcmNoaXRlY3QgYXNzb2NpYXRpb25zIzk0LjEwLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE2LjA2LjAwI0JhciBhc3NvY2lhdGlvbnMjOTQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTYuMDcuMDAjRWR1Y2F0aW9uYWwgb3IgdGVhY2hlciBhc3NvY2lhdGlvbnMjOTQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTYuMDguMDAjRW5naW5lZXJpbmcgYXNzb2NpYXRpb25zIzk0LjEwLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE2LjA5LjAwI1NjaWVudGlmaWMgYXNzb2NpYXRpb25zIzk0LjEwLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE2LjEwLjAwI1Byb2Zlc3Npb25hbCBzdGFuZGFyZHMgcmV2aWV3IGJvYXJkcyM5NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNy4wMC4wMCNTdGFmZiBhc3NvY2lhdGlvbnMjOTQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTcuMDEuMDAjU3RhZmYgaG9iYnkgY2x1YnMjOTQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTcuMDIuMDAjU3RhZmYgc3BvcnRzIGFzc29jaWF0aW9ucyM5NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNy4wMy4wMCNXb21lbiBzdGFmZiBhc3NvY2lhdGlvbnMjOTQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTcuMDQuMDAjUGVuc2lvbm5pc3Qgc3RhZmYgYXNzb2NpYXRpb25zIzk0LjEwLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE3LjA1LjAwI01hbmFnZW1lbnQgc3RhZmYgYXNzb2NpYXRpb25zIzk0LjEwLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE4LjAwLjAwI1RyYWRlIHVuaW9ucyM5NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wMS4wMCNMYWJvciBvciBnZW5lcmFsIHdvcmtlcnMgdHJhZGUgdW5pb25zIzk0LjEwLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE4LjAyLjAwI1RyYWRlIHVuaW9uIGFjdGl2aXN0cyBzZXJ2aWNlcyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wMy4wMCNUcmFkZSB1bmlvbiBpbmZvcm1hdGlvbiBzZXJ2aWNlcyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wNC4wMCNUcmFuc3BvcnQgdW5pb25zIzk0LjEwLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE4LjA1LjAwI1RlYWNoZXJzIHVuaW9ucyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wNi4wMCNNZWRpY2FsIHBlcnNvbm5lbCB1bmlvbnMjOTQuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTguMDcuMDAjRW1wbG95ZXJzIHVuaW9ucyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wOC4wMCNDaXZpbCBzZXJ2YW50cyB1bmlvbnMjOTQuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTguMDkuMDAjUGVyc29uYWwgYXNzaXN0YW5jZSBzZXJ2aWNlcyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4xMC4wMCNBdmlhdGlvbiB1bmlvbnMjOTQuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTEuMDAuMDAuMDAjUmVsaWdpb3VzIG9yZ2FuaXphdGlvbnMjOTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTcuMDAuMDAjUmVsaWdpb3VzIHJlc2lkZW5jZXMjOTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTcuMDEuMDAjUHJpdmF0ZSByZWxpZ2lvdXMgaG9tZSByZXNpZGVuY2VzIzk0LjExLjE3LjAwLjAwCi11bnNwc2M3Izk0LjExLjE3LjAyLjAwI0NvbW11bml0eSByZWxpZ2lvdXMgaG9tZSByZXNpZGVuY2VzIzk0LjExLjE3LjAwLjAwCi11bnNwc2M3Izk0LjExLjE3LjAzLjAwI1JlbGlnaW91cyByZXRyZWF0IHJlc2lkZW5jZXMjOTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTcuMDQuMDAjVGVtcG9yYXJ5IHJlbGlnaW91cyBob21lIHJlc2lkZW5jZXMjOTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTguMDAuMDAjUGlsZ3JpbWFnZSBvcmdhbml6YXRpb25zIGFuZCBzZXJ2aWNlcyM5NC4xMS4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMS4xOC4wMS4wMCNNZWNjYSBwaWxncmltYWdlIG9yZ2FuaXphdGlvbnMgb3Igc2VydmljZXMjOTQuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTguMDIuMDAjVmF0aWNhbiBwaWxncmltYWdlIG9yZ2FuaXphdGlvbnMgb3Igc2VydmljZXMjOTQuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTguMDMuMDAjUGlsZ3JpbWFnZSB0cmF2ZWwgYXNzaXN0YW5jZSBzZXJ2aWNlcyM5NC4xMS4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMS4xOC4wNC4wMCNQaWxncmltYWdlIHRvdXIgb3BlcmF0b3JzIHNlcnZpY2VzIzk0LjExLjE4LjAwLjAwCi11bnNwc2M3Izk0LjExLjE5LjAwLjAwI01pc3Npb25hcnkgc2VydmljZXMjOTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTkuMDEuMDAjUmVsaWdpb3VzIG9yZGVycyBzZXJ2aWNlcyM5NC4xMS4xOS4wMC4wMAotdW5zcHNjNyM5NC4xMS4xOS4wMi4wMCNFdmFuZ2VsaWNhbCBtaXNzaW9uYXJ5IHNlcnZpY2VzIzk0LjExLjE5LjAwLjAwCi11bnNwc2M3Izk0LjExLjE5LjAzLjAwI0VkdWNhdGlvbmFsIG1pc3Npb25hcnkgc2VydmljZXMjOTQuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMjAuMDAuMDAjRGVub21pbmF0aW9uYWwgc2VydmljZXMjOTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMjAuMDEuMDAjSGluZHVpc20gc2VydmljZXMjOTQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMjAuMDIuMDAjQnVkZGhpc20gc2VydmljZXMjOTQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMjAuMDMuMDAjQ2hyaXN0aWFuIHNlcnZpY2VzIzk0LjExLjIwLjAwLjAwCi11bnNwc2M3Izk0LjExLjIwLjA0LjAwI0lzbGFtIHNlcnZpY2VzIzk0LjExLjIwLjAwLjAwCi11bnNwc2M3Izk0LjExLjIwLjA1LjAwI0p1ZGFpc20gc2VydmljZXMjOTQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMDAuMDAuMDAjQ2x1YnMjOTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDAuMDAjU3BvcnQgY2x1YnMjOTQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDEuMDAjSWNlIHNwb3J0cyBjbHVicyM5NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNS4wMi4wMCNCb2F0aW5nIG9yIHN3aW1taW5nIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjAzLjAwI0d1biBvciBodW50aW5nIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjA0LjAwI091dGRvb3IgZmllbGQgc3BvcnQgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDUuMDAjSW5kb29yIG9yIG91dGRvb3IgY291cnQgc3BvcnQgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDYuMDAjV2ludGVyIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjA3LjAwI0JlYWNoIG9yIHdhdGVyIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjA4LjAwI0N5Y2xpbmcgc3BvcnQgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDkuMDAjTW91bnRhaW5lZXJpbmcgc3BvcnQgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMTAuMDAjUmFjaW5nIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjExLjAwI0ZseWluZyBzcG9ydCBjbHVicyM5NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNS4xMi4wMCNQcm9mZXNzaW9uYWwgb3Igc2VtaXByb2Zlc3Npb25hbCBzcG9ydHMgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMTMuMDAjU3RhZGl1bSBldmVudCBvcGVyYXRvciBzZXJ2aWNlcyM5NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNS4xNC4wMCNTcG9ydCBjbHViIG1hbmFnZXJzIG9yIHByb21vdGVycyBzZXJ2aWNlcyM5NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wMC4wMCNIb2JieSBjbHVicyM5NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wMS4wMCNQbGF5aW5nIGNhcmQgaG9iYnkgY2x1YnMjOTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTYuMDIuMDAjSGFuZGNyYWZ0cyBjbHVicyM5NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wMy4wMCNQb2V0cnkgb3IgbGl0ZXJhdHVyZSBob2JieSBjbHVicyM5NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wNC4wMCNDb29raW5nIGhvYmJ5IGNsdWJzIzk0LjEyLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE2LjA1LjAwI0dhcmRlbmluZyBob2JieSBjbHVicyM5NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wNi4wMCNDb2xsZWN0b3IgaG9iYnkgY2x1YiM5NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wNy4wMCNTY291dGluZyBjbHViIzk0LjEyLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE3LjAwLjAwI0FtYXRldXJzIGNsdWJzIzk0LjEyLjAwLjAwLjAwCi11bnNwc2M3Izk0LjEyLjE3LjAxLjAwI0FtYXRldXIgZHJhbWEgY2x1YnMgb3Igc2VydmljZXMjOTQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTcuMDIuMDAjQW1hdGV1ciBtdXNpYyBjbHVicyBvciBzZXJ2aWNlcyM5NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNy4wMy4wMCNBbWF0ZXVyIGRhbmNlIGNsdWJzIG9yIHNlcnZpY2VzIzk0LjEyLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE3LjA0LjAwI0FtYXRldXIgZmluZSBhcnRzIGNsdWJzIG9yIHNlcnZpY2VzIzk0LjEyLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE4LjAwLjAwI1NvY2lhbCBjbHVicyM5NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xOC4wMS4wMCNZb3V0aCBjbHVicyM5NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xOC4wMi4wMCNTZW5pb3IgY2l0aXplbnMgY2x1YnMjOTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTguMDMuMDAjU29jaWFsIGdhdGhlcmluZyBjbHVicyM5NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xOC4wNC4wMCNTb2NpYWwgY2x1YnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM5NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xOC4wNS4wMCNXYXIgdmV0ZXJhbnMgc29jaWFsIGNsdWJzIzk0LjEyLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEzLjAwLjAwLjAwI0NpdmljIG9yZ2FuaXphdGlvbnMgYW5kIGFzc29jaWF0aW9ucyBhbmQgbW92ZW1lbnRzIzk0LjAwLjAwLjAwLjAwCi11bnNwc2M3Izk0LjEzLjE1LjAwLjAwI05vbiBnb3Zlcm5tZW50YWwgb3JnYW5pemF0aW9ucyM5NC4xMy4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xNS4wMS4wMCNFbnZpcm9ubWVudGFsIG5vbiBnb3Zlcm5tZW50YWwgc2VydmljZXMjOTQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTUuMDIuMDAjRW1lcmdlbmN5IHJlbGllZiBub24gZ292ZXJubWVudGFsIHNlcnZpY2VzIzk0LjEzLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE1LjAzLjAwI1RlY2huaWNhbCBhc3Npc3RhbmNlIG5vbiBnb3Zlcm5tZW50YWwgc2VydmljZXMjOTQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTUuMDQuMDAjRGV2ZWxvcG1lbnQgYWlkIG5vbiBnb3Zlcm5lbW50YWwgc2VydmljZXMjOTQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTYuMDAuMDAjQ2hhcml0eSBvcmdhbml6YXRpb25zIzk0LjEzLjAwLjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjAxLjAwI0NoYXJpdHkgb3JnYW5pemF0aW9ucyBzaGVsdGVyIHNlcnZpY2VzIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjAyLjAwI0Zvb2QgcmVsaWVmIHNlcnZpY2VzIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjAzLjAwI0xlZ2FsIGFzc2lzdGFuY2Ugc2VydmljZXMjOTQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTYuMDQuMDAjUmVzb3VyY2UgbW9iaWxpemF0aW9uIHNlcnZpY2VzIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjA1LjAwI0ludGVybmF0aW9uYWwgYWlkIGFzc2lzdGFuY2Ugc2VydmljZXMjOTQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTYuMDYuMDAjT3JwaGFuYWdlIG9yIGFkb3B0aW9uIHNlcnZpY2VzIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjA3LjAwI0VkZXJseSBhc3Npc3RhbmNlIG9yZ2FuaXphdGlvbnMjOTQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTYuMDguMDAjUHJpc29uZXIgYXNzaXN0YW5jZSBvcmdhbml6YXRpb25zIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE3LjAwLjAwI0dyZWVuIGFzc29jaWF0aW9ucyM5NC4xMy4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xNy4wMS4wMCNSYWRpY2FsIGdyZWVuIGFzc29jaWF0aW9ucyM5NC4xMy4xNy4wMC4wMAotdW5zcHNjNyM5NC4xMy4xNy4wMi4wMCNFY29mZW1pbmlzdHMgYXNzb2NpYXRpb25zIzk0LjEzLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE3LjAzLjAwI0Vjb2xvZ2ljYWwgcG9saXRpY2FsIG9yZ2FuaXphdGlvbnMjOTQuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTcuMDQuMDAjR3JlZW4gYWN0aXZpc3RzIG1vdmVtZW50cyBvciBzZXJ2aWNlcyM5NC4xMy4xNy4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOC4wMC4wMCNNb3ZlbWVudHMjOTQuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTguMDEuMDAjR2F5IG9yIGxlc2JpYW4gb3IgYmlzZXh1YWwgb3IgdHJhbnNnZW5kZXIgbW92ZW1lbnRzIzk0LjEzLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE4LjAyLjAwI0FudGkgcmFjaXNtIG1vdmVtZW50cyM5NC4xMy4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOC4wMy4wMCNXb21lbiBsaWJlcmF0aW9uIG1vdmVtZW50cyM5NC4xMy4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOC4wNC4wMCNGcmF0ZXJuYWwgYXNzb2NpYXRpb25zIzk0LjEzLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE4LjA1LjAwI0V0aG5pYyBtaW5vcml0aWVzIGN1bHR1cmFsIHByZXNlcnZhdGlvbiBzZXJ2aWNlcyM5NC4xMy4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOS4wMC4wMCNBbmltYWwgcHJvdGVjdGlvbiBhc3NvY2lhdGlvbnMjOTQuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTkuMDEuMDAjQW5pbWFsIGxpYmVyYXRpb24gbW92ZW1lbnRzIzk0LjEzLjE5LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE5LjAyLjAwI0VuZGFuZ2VyZWQgc3BlY2llcyBwcm90ZWN0aW9uIGFzc29jaWF0aW9ucyM5NC4xMy4xOS4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOS4wMy4wMCNUaHJlYXRlbmVkIGFuaW1hbHMgcHJvdGVjdGlvbiBhc3NvY2lhdGlvbnMjOTQuMTMuMTkuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMjAuMDAuMDAjSHVtYW4gcmlnaHRzIGFkdm9jYWN5IGFuZCBkZWZlbnNlIGFzc29jaWF0aW9ucyM5NC4xMy4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wMS4wMCNDaGlsZHJlbiByaWdodHMgZGVmZW5zZSBzZXJ2aWNlcyM5NC4xMy4yMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wMi4wMCNQcmlzb25lcnMgZGVmZW5zZSBzZXJ2aWNlcyM5NC4xMy4yMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wMy4wMCNQaHlzaWNhbCBvciBtZW50YWwgdG9ydHVyZSBkZWZlbnNlIGFzc29jaWF0aW9ucyM5NC4xMy4yMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wNC4wMCNGcmVlZG9tIG9mIHNwZWVjaCBkZWZlbnNlIGFzc29jaWF0aW9ucyM5NC4xMy4yMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wNS4wMCNWb3RpbmcgcmlnaHRzIGRlZmVuc2UgYXNzb2NpYXRpb25zIzk0LjEzLjIwLjAwLjAwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9CdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGU5ZjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9CdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHByb2Nlc3NQdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlIiwiPCU9VURESUFjdGlvbklucHV0cy5OT0RFSURfU0VSVklDRV9JTlRFUkZBQ0UlPiIsZm9ybSxmYWxzZSk7Ci0gICAgICBwcm9jZXNzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWREZXNjcmlwdGlvbnMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0NhdGVnb3J5VGFibGUoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRDYXRlZ29yaWVzIixmb3JtLGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLTwvc2NyaXB0PgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSk7Ci0lPgotPGRpdiBpZD0icHVibGlzaFNlcnZpY2VBZHZhbmNlZCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0J1c1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0FkdmFuY2VkRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3ViUXVlcnlHZXQiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTk9ERUlEX0JVU0lORVNTJT4iIHZhbHVlPSI8JT1zZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCklPiI+ICAKLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X2J1c2luZXNzX3B1Ymxpc2hfc2VydmljZV9hZHZhbmNlX3dzZGxfdXJsIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9VUkwiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCkpCi0gICB7Ci0lPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgbm93cmFwIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuV1NETEJyb3dzZXIoJ3B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQnLDwlPUFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRSU+KSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIiklPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2Vfd3NkbF91cmwiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+IiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBib29sZWFuIHRhYmxlSGFzRXJyb3JzID0gIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgU3RyaW5nW10gc2VydmljZUludGVyZmFjZVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVMiLChuZXcgQm9vbGVhbih0YWJsZUhhc0Vycm9ycykpLnRvU3RyaW5nKCksU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyksInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVN9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkU2VydmljZUludGVyZmFjZSIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKHNlcnZpY2VJbnRlcmZhY2VTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXMiKTsKLSAgIFN0cmluZ1tdIG5hbWVTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfTkFNRVMiLCJGT1JNX0xBQkVMX05BTUUiLFN0cmluZy52YWx1ZU9mKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMobmFtZVNwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUykpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhkZXNjU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQ2F0ZWdvcmllcyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9CdXNQdWJsaXNoU2VydmljZUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzEyMWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9CdXNQdWJsaXNoU2VydmljZUZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLkxpc3RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIHNlbGVjdGVkTm9kZSBtdXN0IGJlIGEgYnVzaW5lc3Mgbm9kZS4KLSAgIE5vZGUgYnVzTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoYnVzTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0lPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgc3ViUXVlcnlLZXlQcm9wZXJ0eS5zZXRTdWJRdWVyeUtleShzdWJRdWVyeUtleSk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTwlCi0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotICAgLy8gYnVzaW5lc3MgcGFyZW50IG5vZGUgbWF5IGJlIGVpdGhlciB0aGUgcHVibGlzaGVkIGl0ZW1zIGZvbGRlciBvciBhIHF1ZXJ5IG5vZGUuCi0gICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSluYXZpZ2F0b3JNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICBOb2RlIHJlZ05vZGUgPSB1ZGRpTWFpbk5vZGUuZ2V0UmVnaXN0cnlOb2RlKGJ1c05vZGUpOwotICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0UiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGl0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciBzZWN0aW9uSWRzID0gWyJwdWJsaXNoU2VydmljZVNpbXBsZSIsInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiXTsKLSAgdmFyIHN0eWxlRm9ybSA9ICJwdWJsaXNoU2VydmljZVN0eWxlIjsKLSAgCi0gIGZ1bmN0aW9uIHByb2Nlc3NBZHZhbmNlZEZvcm0oZm9ybSkKLSAgewotICAgIGlmIChoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgewotICAgICAgcHJvY2Vzc1Jlc3VsdFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkU2VydmljZUludGVyZmFjZSIsIjwlPVVERElBY3Rpb25JbnB1dHMuTk9ERUlEX1NFUlZJQ0VfSU5URVJGQUNFJT4iLGZvcm0sZmFsc2UpOwotICAgICAgcHJvY2Vzc0xhbmd1YWdlSW5wdXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUlPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTiU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NDYXRlZ29yeVRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQ2F0ZWdvcmllcyIsZm9ybSxmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhmb3JtKQotICB7Ci08JQotICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSU+Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHB1Ymxpc2hVUkwpJT4iOwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodXNlcklkKSU+IjsKLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocGFzc3dvcmQpJT4iOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLTwlCi0gICBTdHJpbmcgcHVibGlzaFNlcnZpY2VTdHlsZUluZGV4ID0gKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1tzdHlsZUZvcm1dLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMlPls8JT1wdWJsaXNoU2VydmljZVN0eWxlSW5kZXglPl0uY2hlY2tlZCA9IHRydWU7Ci0gICAgCi0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlU2ltcGxlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUlPl0pOwotICAgIHZhciBwdWJsaXNoU2VydmljZVNpbXBsZUZvcm0gPSBwdWJsaXNoU2VydmljZVNpbXBsZVNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKHB1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybSk7Ci0gICAgcHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9XU0RMX1VSTCkpJT4iOwotICAgIHB1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSkpJT4iOwotICAgIHB1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OKSklPiI7Ci0gICAgCi0gICAgLy8gQWR2YW5jZWQgZm9ybSBkZXRhaWxzLgotICAgIHZhciBwdWJsaXNoU2VydmljZUFkdmFuY2VkU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+XSk7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtID0gcHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtKTsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzVGFibGUgPSBnZXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIik7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWREZXNjcmlwdGlvbnNUYWJsZSA9IGdldFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zIik7Ci0gICAgcHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpKSU+IjsKLTwlCi0gICBWZWN0b3Igc2VydmljZUludGVyZmFjZXMgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICBWZWN0b3Igc2VydmljZUludGVyZmFjZXNDb3B5ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSk7Ci0gICBpZiAoc2VydmljZUludGVyZmFjZXMgIT0gbnVsbCkKLSAgIHsKLSAgICAgaWYgKHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9PSBudWxsKQotICAgICAgIHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZWxzZQotICAgICAgIHNlcnZpY2VJbnRlcmZhY2VzQ29weS5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlSW50ZXJmYWNlcy5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZUludGVyZmFjZXMuZWxlbWVudEF0KGkpOwotICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0VG9vbElkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0VG9vbElkKCk7Ci0gICAgICAgaW50IHRhcmdldFZpZXdJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpOwotICAgICAgIFN0cmluZyB1cmwgPSBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCxzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyxpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMsZmFsc2UpOwotICAgICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIHNlcnZpY2VJbnRlcmZhY2VzQ29weS5hZGRFbGVtZW50KHNlcnZpY2VJbnRlcmZhY2VzLmVsZW1lbnRBdChpKSk7Ci0lPgotICAgIGFkZFJlc3VsdFJvdygicHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2UiLDwlPXRhcmdldE5vZGVJZCU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh0TW9kZWwuZ2V0TmFtZVN0cmluZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHRNb2RlbC5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKSklPiIpOwotPCUKLSAgICAgfQotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSxzZXJ2aWNlSW50ZXJmYWNlc0NvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBzZXJ2aWNlSW50ZXJmYWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgc2VydmljZUludGVyZmFjZXNDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMsc2VydmljZUludGVyZmFjZXMpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSxzZXJ2aWNlSW50ZXJmYWNlc0NvcHkpOwotICAgfQotJT4KLTwlCi0gICBWZWN0b3Igc2VydmljZU5hbWVWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgIGlmIChzZXJ2aWNlTmFtZVZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlTmFtZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTmFtZSBuYW1lID0gKE5hbWUpc2VydmljZU5hbWVWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRMYW5ndWFnZUlucHV0Um93KCJwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiKSklPiIpOwotICAgIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lLmdldExhbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoIWZvcm1Ub29sUEkuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxpKSkKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRyb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIFZlY3RvciBzZXJ2aWNlRGVzY3JpcHRpb25WZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0gICBpZiAoc2VydmljZURlc2NyaXB0aW9uVmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VEZXNjcmlwdGlvblZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pc2VydmljZURlc2NyaXB0aW9uVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkTGFuZ3VhZ2VJbnB1dFJvdygicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0RFU0NSSVBUSU9OX1RFWFRfVkFMVUUiKSklPiIpOwotICAgIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24uZ2V0TGFuZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoIWZvcm1Ub29sUEkuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsaSkpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3cocHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9uc1RhYmxlLnJvd3NbPCU9aSU+K251bWJlck9mSGVhZGVyUm93c10sImVycmFudHJvdyIpOwotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgQ2F0ZWdvcnlCYWcgc2VydmljZUNhdEJhZyA9IChDYXRlZ29yeUJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLSAgIGlmIChzZXJ2aWNlQ2F0QmFnICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBrZXllZFJlZmVyZW5jZVZlY3RvciA9IHNlcnZpY2VDYXRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8a2V5ZWRSZWZlcmVuY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWtleWVkUmVmZXJlbmNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkQ2F0ZWdvcnlSb3coInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0gICAgc2V0Q2F0ZWdvcnlSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VBZHZhbmNlZENhdGVnb3JpZXMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0gICAKLSAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICB7Ci0lPgotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwdWJsaXNoU2VydmljZVNpbXBsZUF1dGhlbnRpY2F0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci08JQotICAgfQotJT4KLSAgICBzaG93UHVibGlzaEZvcm0oPCU9cHVibGlzaFNlcnZpY2VTdHlsZUluZGV4JT4pOyAgICAKLSAgfQotICAKLSAgZnVuY3Rpb24gc2hvd1B1Ymxpc2hGb3JtKHN0eWxlKQotICB7Ci0gICAgY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCk7Ci0gICAgZm9yICh2YXIgaT0wO2k8c2VjdGlvbklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChpID09IHN0eWxlKQotICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWN0aW9uSWRzW2ldKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgICBlbHNlCi0gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlY3Rpb25JZHNbaV0pLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgfQotICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgbG9hZFNjcmVlblRhYmxlLmRlbGV0ZVJvdygwKTsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsgICAgCi0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iIG9uVW5sb2FkPSJjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKSI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAidWRkaS9pbWFnZXMvcHVibGlzaF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1BVQkxJU0hfU0VSVklDRSIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICAgIDxmb3JtIG5hbWU9InB1Ymxpc2hTZXJ2aWNlU3R5bGUiIHN0eWxlPSJtYXJnaW4tdG9wOjA7Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfRk9STSIpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4gICAgICAgIAotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTJT4iIG9uQ2xpY2s9InNob3dQdWJsaXNoRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+KSI+PGxhYmVsIGZvcj0icmFkaW9fYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU0lNUExFIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9InJhZGlvX2J1c2luZXNzX3B1Ymxpc2hfc2VydmljZV9hZHZhbmNlIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMlPiIgb25DbGljaz0ic2hvd1B1Ymxpc2hGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQlPikiPjxsYWJlbCBmb3I9InJhZGlvX2J1c2luZXNzX3B1Ymxpc2hfc2VydmljZV9hZHZhbmNlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19BRFZBTkNFRCIpJT48L2xhYmVsPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9mb3JtPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL0J1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvZGl2PgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotPC9zY3JpcHQ+ICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9CdXNQdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0J1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTRkOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0J1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJwdWJsaXNoU2VydmljZVNpbXBsZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0J1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIGhhbmRsZVN1Ym1pdCh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5OT0RFSURfQlVTSU5FU1MlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZVNpbXBsZUF1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgbm93cmFwIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZV93c2RsX3VybCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvbGFiZWw+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1dTRExfVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBub3dyYXAgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5XU0RMQnJvd3NlcigncHVibGlzaFNlcnZpY2VTaW1wbGUnLDwlPUFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRSU+KSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIiklPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZV93c2RsX3VybCIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49MyBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9idXNpbmVzc19wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlX25hbWUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgICAgICA8L3RkPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X2J1c2luZXNzX3B1Ymxpc2hfc2VydmljZV9zaW1wbGVfbmFtZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49MyBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9idXNpbmVzc19wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlX2Rlc2MiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X2J1c2luZXNzX3B1Ymxpc2hfc2VydmljZV9zaW1wbGVfZGVzYyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9ERVNDUklQVElPTiU+IiBjbGFzcz0idGV4dGVudGVyIj4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzaW5lc3NEZXRhaWxzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzaW5lc3NEZXRhaWxzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjcwNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0J1c2luZXNzRGV0YWlsc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKGN1cnJlbnRUb29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSluYXZpZ2F0b3JNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IHVkZGlNYWluTm9kZS5nZXRSZWdpc3RyeU5vZGUoc2VsZWN0ZWROb2RlKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfQlVTSU5FU1NfREVUQUlMUyIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Jlc3VtZXByb3h5bG9hZHBhZ2UuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL2RldGFpbHN0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHNldERlZmF1bHRzKCkKLSAgewotICAgIHZhciBidXNpbmVzc0RldGFpbHNEaXNjb3ZlcnlVUkxzVGFibGUgPSBnZXRUYWJsZSgiYnVzaW5lc3NEZXRhaWxzRGlzY292ZXJ5VVJMcyIpOwotICAgIHZhciBidXNpbmVzc0RldGFpbHNOYW1lc1RhYmxlID0gZ2V0VGFibGUoImJ1c2luZXNzRGV0YWlsc05hbWVzIik7Ci0gICAgdmFyIGJ1c2luZXNzRGV0YWlsc0Rlc2NyaXB0aW9uc1RhYmxlID0gZ2V0VGFibGUoImJ1c2luZXNzRGV0YWlsc0Rlc2NyaXB0aW9ucyIpOwotICAgIHZhciBidXNpbmVzc0RldGFpbHNJZGVudGlmaWVyc1RhYmxlID0gZ2V0VGFibGUoImJ1c2luZXNzRGV0YWlsc0lkZW50aWZpZXJzIik7Ci08JQotICAgVmVjdG9yIGRpc2NvdmVyeVVSTFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLSAgIGlmIChkaXNjb3ZlcnlVUkxWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8ZGlzY292ZXJ5VVJMVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClkaXNjb3ZlcnlVUkxWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgIERpc2NvdmVyeVVSTCBkaXNjb3ZlcnlVUkwgPSAoRGlzY292ZXJ5VVJMKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGJvb2xlYW4gaXNFcnJvciA9ICFmb3JtVG9vbC5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTLGkpOwotICAgICAgIGJvb2xlYW4gaXNOZXdJdGVtID0gKGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0lPgotICAgIGFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3coImJ1c2luZXNzRGV0YWlsc0Rpc2NvdmVyeVVSTHMiLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzRGlzY292ZXJ5VVJMUm93KCJidXNpbmVzc0RldGFpbHNEaXNjb3ZlcnlVUkxzIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRpc2NvdmVyeVVSTC5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKGlzRXJyb3IpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3coYnVzaW5lc3NEZXRhaWxzRGlzY292ZXJ5VVJMc1RhYmxlLnJvd3NbPCU9aSU+K251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgVmVjdG9yIG5hbWVJbmRleFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyk7Ci0gICBpZiAobmFtZUluZGV4VmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPG5hbWVJbmRleFZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpbmFtZUluZGV4VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBib29sZWFuIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsaSk7Ci0gICAgICAgYm9vbGVhbiBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3coImJ1c2luZXNzRGV0YWlsc05hbWVzIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFIikpJT4iLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygiYnVzaW5lc3NEZXRhaWxzTmFtZXMiLDwlPWklPiw8JT1saXN0RWxlbWVudC5nZXRWaWV3SWQoKSU+LCI8JT1uYW1lLmdldExhbmcoKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUuZ2V0VGV4dCgpKSU+Iik7Ci08JQotICAgICAgIGlmIChpc0Vycm9yKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KGJ1c2luZXNzRGV0YWlsc05hbWVzVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50Um93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBWZWN0b3IgZGVzY3JpcHRpb25JbmRleFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpOwotICAgaWYgKGRlc2NyaXB0aW9uSW5kZXhWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25JbmRleFZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZGVzY3JpcHRpb25JbmRleFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgYm9vbGVhbiBpc0Vycm9yID0gIWZvcm1Ub29sLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICBib29sZWFuIGlzTmV3SXRlbSA9IChsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotJT4KLSAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygiYnVzaW5lc3NEZXRhaWxzRGVzY3JpcHRpb25zIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfREVTQ1JJUFRJT05fVEVYVF9WQUxVRSIpKSU+Iiw8JT1pc0Vycm9yfHxpc05ld0l0ZW0lPik7Ci0gICAgc2V0RGV0YWlsc0xhbmd1YWdlSW5wdXRSb3coImJ1c2luZXNzRGV0YWlsc0Rlc2NyaXB0aW9ucyIsPCU9aSU+LDwlPWxpc3RFbGVtZW50LmdldFZpZXdJZCgpJT4sIjwlPWRlc2NyaXB0aW9uLmdldExhbmcoKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoaXNFcnJvcikKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhidXNpbmVzc0RldGFpbHNEZXNjcmlwdGlvbnNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRSb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIFZlY3RvciBpZFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyk7Ci0gICBpZiAoaWRWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8aWRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWlkVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBib29sZWFuIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMsaSk7Ci0gICAgICAgYm9vbGVhbiBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0lkZW50aWZpZXJSb3coImJ1c2luZXNzRGV0YWlsc0lkZW50aWZpZXJzIiw8JT1pc0Vycm9yfHxpc05ld0l0ZW0lPik7Ci0gICAgc2V0RGV0YWlsc0lkZW50aWZpZXJSb3coImJ1c2luZXNzRGV0YWlsc0lkZW50aWZpZXJzIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICAgIGlmIChpc0Vycm9yKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KGJ1c2luZXNzRGV0YWlsc0lkZW50aWZpZXJzVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50Um93Iik7Ci08JSAgICAgICAKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgVmVjdG9yIGNhdFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19DQVRFR09SSUVTKTsKLSAgIGlmIChjYXRWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCljYXRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGJvb2xlYW4gaXNFcnJvciA9ICFmb3JtVG9vbC5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19DQVRFR09SSUVTLGkpOwotICAgICAgIGJvb2xlYW4gaXNOZXdJdGVtID0gKGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0lPgotICAgIGFkZERldGFpbHNDYXRlZ29yeVJvdygiYnVzaW5lc3NEZXRhaWxzQ2F0ZWdvcmllcyIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNDYXRlZ29yeVJvdygiYnVzaW5lc3NEZXRhaWxzQ2F0ZWdvcmllcyIsPCU9aSU+LDwlPWxpc3RFbGVtZW50LmdldFZpZXdJZCgpJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgICBpZiAoaXNFcnJvcikKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhidXNpbmVzc0RldGFpbHNDYXRlZ29yaWVzVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50Um93Iik7Ci08JQotICAgICAgIH0gICAgICAgCi0gICAgIH0KLSAgIH0KLQotICAgLy8gQXV0aGVudGljYXRpb24uCi0gICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHB1Ymxpc2hVUkwpJT4iOwotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJJZCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwYXNzd29yZCklPiI7Ci0gICAgaWYgKDwlPSFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSU+KQotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1c2luZXNzRGV0YWlsc0F1dGhlbnRpY2F0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotCi0gICAgc2hvd01haW5Gb3JtKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93TWFpbkZvcm0oKQotICB7Ci0gICAgY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCk7Ci0gICAgdmFyIGxvYWRTY3JlZW5UYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkU2NyZWVuIik7Ci0gICAgaWYgKGxvYWRTY3JlZW5UYWJsZS5yb3dzLmxlbmd0aCA+IDApCi0gICAgICBsb2FkU2NyZWVuVGFibGUuZGVsZXRlUm93KDApOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluU2NyZWVuIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc0Zvcm0oZm9ybSkKLSAgewotICAgIGlmIChoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgewotICAgICAgcHJvY2Vzc0RldGFpbHNEaXNjb3ZlcnlVUkxUYWJsZSgiYnVzaW5lc3NEZXRhaWxzRGlzY292ZXJ5VVJMcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuRElTQ09WRVJZVVJMX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLkRJU0NPVkVSWVVSTF9WSUVXSUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRElTQ09WRVJZVVJMJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0RldGFpbHNMYW5ndWFnZUlucHV0VGFibGUoImJ1c2luZXNzRGV0YWlsc05hbWVzIiwiPCU9VURESUFjdGlvbklucHV0cy5OQU1FX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5BTUVfVklFV0lEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NEZXRhaWxzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJidXNpbmVzc0RldGFpbHNEZXNjcmlwdGlvbnMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLkRFU0NSSVBUSU9OX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLkRFU0NSSVBUSU9OX1ZJRVdJRCU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTiU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NEZXRhaWxzSWRlbnRpZmllclRhYmxlKCJidXNpbmVzc0RldGFpbHNJZGVudGlmaWVycyIsZm9ybSk7Ci0gICAgICBwcm9jZXNzRGV0YWlsc0NhdGVnb3J5VGFibGUoImJ1c2luZXNzRGV0YWlsc0NhdGVnb3JpZXMiLGZvcm0pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvVXBkYXRlQnVzaW5lc3NBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPgotICAgICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8ZGl2IGlkPSJtYWluU2NyZWVuIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0JVU0lORVNTX0RFVEFJTFMiKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVklPiIgdmFsdWU9IjwlPWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpJT4iPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVRBSUxTX0VESVRBQkxFIixzZWxlY3RlZE5vZGUuZ2V0Tm9kZU5hbWUoKSklPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JVU0lORVNTX0tFWSIpJT4KLSAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICA8JT1mb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJidXNpbmVzc0RldGFpbHNOYW1lcyIpOwotICAgU3RyaW5nW10gbmFtZVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9OQU1FUyIsIkZPUk1fTEFCRUxfTkFNRSIsU3RyaW5nLnZhbHVlT2YoIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKSl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG5hbWVTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzTGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJidXNpbmVzc0RldGFpbHNEZXNjcmlwdGlvbnMiKTsKLSAgIFN0cmluZ1tdIGRlc2NTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfREVTQ1JJUFRJT05TIiwiRk9STV9MQUJFTF9ERVNDUklQVElPTiIsU3RyaW5nLnZhbHVlT2YoIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUykpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhkZXNjU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiYnVzaW5lc3NEZXRhaWxzSWRlbnRpZmllcnMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0lkZW50aWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImJ1c2luZXNzRGV0YWlsc0NhdGVnb3JpZXMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiYnVzaW5lc3NEZXRhaWxzRGlzY292ZXJ5VVJMcyIpOwotICAgQm9vbGVhbiBkaXNjb3ZlcnlVUkxTcGVjaWZpY0luZm8gPSBuZXcgQm9vbGVhbighZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUykpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKGRpc2NvdmVyeVVSTFNwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2RldGFpbHNEaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImJ1c2luZXNzRGV0YWlsc0F1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Zvcm0+Ci0gIDwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci0gIHJlc3VtZVByb3h5TG9hZFBhZ2UoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0dldEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0dldEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzcyZjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9HZXRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlUcmFuc2ZlclRhcmdldEhvbGRlciIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXkpOwotICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIFN0cmluZyBwYXJlbnRRdWVyeUtleTsKLSAgIGludCBsYXN0U2VwYXJhdG9yUG9zID0gc3ViUXVlcnlLZXkubGFzdEluZGV4T2YoJzonKTsKLSAgIGlmIChsYXN0U2VwYXJhdG9yUG9zID09IC0xKQotICAgICBwYXJlbnRRdWVyeUtleSA9ICIiOwotICAgZWxzZQotICAgICBwYXJlbnRRdWVyeUtleSA9IHN1YlF1ZXJ5S2V5LnN1YnN0cmluZygwLGxhc3RTZXBhcmF0b3JQb3MpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHBhcmVudEZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMocGFyZW50UXVlcnlLZXkpOwotICAgT2JqZWN0IHF1ZXJ5SXRlbVByb3BlcnR5ID0gcGFyZW50Rm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0pOwotICAgT2JqZWN0IHF1ZXJ5U3R5bGVCdXMgPSBwYXJlbnRGb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyk7Ci0gICBPYmplY3QgcXVlcnlTdHlsZVNlciA9IHBhcmVudEZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyk7Ci0gICBPYmplY3QgcXVlcnlTdHlsZVNlckludCA9IHBhcmVudEZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgSGFzaHRhYmxlIHBhcmVudFF1ZXJ5RGF0YSA9IG5ldyBIYXNodGFibGUoKTsKLSAgIGlmIChxdWVyeUl0ZW1Qcm9wZXJ0eSAhPSBudWxsKQotICAgICBwYXJlbnRRdWVyeURhdGEucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSwgcXVlcnlJdGVtUHJvcGVydHkpOwotICAgaWYgKHF1ZXJ5U3R5bGVCdXMgIT0gbnVsbCkKLSAgICAgcGFyZW50UXVlcnlEYXRhLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMsIHF1ZXJ5U3R5bGVCdXMpOwotICAgaWYgKHF1ZXJ5U3R5bGVTZXIgIT0gbnVsbCkKLSAgICAgcGFyZW50UXVlcnlEYXRhLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLCBxdWVyeVN0eWxlU2VyKTsKLSAgIGlmIChxdWVyeVN0eWxlU2VySW50ICE9IG51bGwpCi0gICAgIHBhcmVudFF1ZXJ5RGF0YS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMsIHF1ZXJ5U3R5bGVTZXJJbnQpOwotICAgU3ViUXVlcnlUcmFuc2ZlclRhcmdldCBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0ID0gbmV3IFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQoc2VsZWN0ZWROb2RlLHN1YlF1ZXJ5S2V5LHBhcmVudFF1ZXJ5RGF0YSk7Ci0gICB0cmVlRWxlbWVudC5zZXRQcm9wZXJ0eUFzT2JqZWN0KFVERElNb2RlbENvbnN0YW50cy5TVUJRVUVSWV9UUkFOU0ZFUl9UQVJHRVQsc3ViUXVlcnlUcmFuc2ZlclRhcmdldCk7Ci0gICBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyLmFkZEVsZW1lbnQoc3ViUXVlcnlUcmFuc2ZlclRhcmdldCk7Ci0gICBib29sZWFuIGhhc1RhcmdldCA9IHRydWU7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfR0VUX0ZPUk0iKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvcmVzdWx0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci08JQotICAgaW50IHF1ZXJ5SXRlbSA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSkpOwotICAgSGFzaHRhYmxlIGFsbFVuaXF1ZU5vZGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgVmVjdG9yIGFsbE5vZGVzID0gbmV3IFZlY3RvcigpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShzZWxlY3RlZE5vZGUpOwotICAgc3dpdGNoIChxdWVyeUl0ZW0pCi0gICB7Ci0gICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVM6Ci0gICAgICAgcmVnTm9kZS5nZXRBbGxCdXNpbmVzc05vZGVzKGFsbE5vZGVzKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgcmVnTm9kZS5nZXRBbGxTZXJ2aWNlTm9kZXMoYWxsTm9kZXMpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgcmVnTm9kZS5nZXRBbGxTZXJ2aWNlSW50ZXJmYWNlTm9kZXMoYWxsTm9kZXMpOwotICAgfQotICAgCi0gICBmb3IgKGludCBpPTA7aTxhbGxOb2Rlcy5zaXplKCk7aSsrKQotICAgewotICAgICBOb2RlIG5vZGUgPSAoTm9kZSlhbGxOb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgIGFsbFVuaXF1ZU5vZGVzLnB1dChub2RlLmdldFRyZWVFbGVtZW50KCkuZ2V0S2V5KCksbm9kZSk7Ci0gICB9Ci0KLSAgIGlmICghYWxsVW5pcXVlTm9kZXMuaXNFbXB0eSgpKQotICAgewotICAgICBPYmplY3RbXSBpdGVtTm9kZXMgPSBhbGxVbmlxdWVOb2Rlcy52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgIFF1aWNrU29ydC5zb3J0KGl0ZW1Ob2RlcywwLGl0ZW1Ob2Rlcy5sZW5ndGgtMSk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGl0ZW1Ob2Rlcy5sZW5ndGg7aSsrKQotICAgICB7Ci0gICAgICAgTm9kZSBpdGVtTm9kZSA9IChOb2RlKWl0ZW1Ob2Rlc1tpXTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKGl0ZW1Ob2RlLmdldE5vZGVJZCgpLGZhbHNlKTsKLSAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICBpZiAoaXRlbU5vZGUgaW5zdGFuY2VvZiBCdXNpbmVzc05vZGUpCi0gICAgICAgewotICAgICAgICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KWl0ZW1Ob2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICBCdXNpbmVzc0VudGl0eSBiZSA9IGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKTsKLSAgICAgICAgIG5hbWUgPSBiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgICAgZGVzY3JpcHRpb24gPSBiZS5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAoaXRlbU5vZGUgaW5zdGFuY2VvZiBTZXJ2aWNlTm9kZSkKLSAgICAgICB7Ci0gICAgICAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudClpdGVtTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gc2VydmljZUVsZW1lbnQuZ2V0QnVzaW5lc3NTZXJ2aWNlKCk7Ci0gICAgICAgICBuYW1lID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICAgIGRlc2NyaXB0aW9uID0gYnMuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgICAgfQotICAgICAgIGVsc2UgaWYgKGl0ZW1Ob2RlIGluc3RhbmNlb2YgU2VydmljZUludGVyZmFjZU5vZGUpCi0gICAgICAgewotICAgICAgICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KWl0ZW1Ob2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICBUTW9kZWwgdE1vZGVsID0gc2lFbGVtZW50LmdldFRNb2RlbCgpOwotICAgICAgICAgbmFtZSA9IHRNb2RlbC5nZXROYW1lU3RyaW5nKCk7Ci0gICAgICAgICBkZXNjcmlwdGlvbiA9IHRNb2RlbC5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSAgICAgICB9Ci0lPgotICAgIGFkZFJlc3VsdFJvdygiR2V0Iiw8JT1pdGVtTm9kZS5nZXROb2RlSWQoKSU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uKSU+Iik7Ci08JQotICAgICB9Ci0lPgotICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgbG9hZFNjcmVlblRhYmxlLmRlbGV0ZVJvdygwKTsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFRyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uLmdldEFjdGlvbkxpbmtGb3JSZXR1cm4oKSkpJT4iOwotPCUKLSAgIH0KLSU+Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08ZGl2IGlkPSJjb250ZW50Ij4KLSAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLTwlCi0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0dFVCIpOwotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gInVkZGkvaW1hZ2VzL2ZpbmRfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9mb3Jtcy9yZXN1bHRzZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPGZvcm0gdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDsiPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBTdHJpbmcgdGFibGVUaXRsZTsKLSAgIHN3aXRjaCAocXVlcnlJdGVtKQotICAgewotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTOgotICAgICAgIHRhYmxlVGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQlVTSU5FU1NFUyIpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICB0YWJsZVRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VTIik7Ci0gICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUzoKLSAgICAgZGVmYXVsdDoKLSAgICAgICB0YWJsZVRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUyIpOwotICAgfQotICAgU3RyaW5nW10gb3RoZXJQcm9wZXJ0aWVzID0ge3RhYmxlVGl0bGUsIiJ9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoIkdldCIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG90aGVyUHJvcGVydGllcyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3Jlc3VsdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9UUkFOU0ZFUiIpJT4iIG9uQ2xpY2s9InRyYW5zZmVyU2VsZWN0aW9ucygnR2V0Jyx0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fUkVGUkVTSCIpJT4iIG9uQ2xpY2s9InJlZnJlc2hTZWxlY3Rpb25zKCdHZXQnLHRoaXMuZm9ybSkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0FERF9UT19GQVZPUklURVMiKSU+IiBvbkNsaWNrPSJhZGRTZWxlY3Rpb25zVG9GYXZvcml0ZXMoJ0dldCcsdGhpcy5mb3JtKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgaGVpZ2h0PTQwIGFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fQ0xFQVIiKSU+IiBvbkNsaWNrPSJjbGVhclNlbGVjdGlvbnMoJ0dldCcsdGhpcy5mb3JtKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZm9ybT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9JdGVtc1N1bW1hcnlGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9JdGVtc1N1bW1hcnlGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiM2I2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvSXRlbXNTdW1tYXJ5Rm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIGludCBxdWVyeUl0ZW0gPSBJbnRlZ2VyLnBhcnNlSW50KHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSkpOwotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSlub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIFRvb2wgc2VsZWN0ZWRUb29sID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgUmVnaXN0cnlOb2RlIHJlZ05vZGUgPSB1ZGRpTWFpbk5vZGUuZ2V0UmVnaXN0cnlOb2RlKHNlbGVjdGVkTm9kZSk7Ci0gICBUcmVlRWxlbWVudCB0cmVlRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgVmVjdG9yIHN1bW1hcnlOb2RlcyA9IG5ldyBWZWN0b3IoKTsKLSAgIGlmICh0cmVlRWxlbWVudCBpbnN0YW5jZW9mIFF1ZXJ5UGFyZW50RWxlbWVudCkKLSAgICAgcmVnTm9kZS5nZXREaXNjb3ZlcmVkTm9kZXMoc3VtbWFyeU5vZGVzLHF1ZXJ5SXRlbSk7Ci0gICBlbHNlIGlmICh0cmVlRWxlbWVudCBpbnN0YW5jZW9mIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCkKLSAgIHsKLSAgICAgc3dpdGNoIChxdWVyeUl0ZW0pCi0gICAgIHsKLSAgICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTOgotICAgICAgICAgcmVnTm9kZS5nZXRQdWJsaXNoZWRCdXNpbmVzc05vZGVzKHN1bW1hcnlOb2Rlcyk7Ci0gICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICAgIHJlZ05vZGUuZ2V0UHVibGlzaGVkU2VydmljZU5vZGVzKHN1bW1hcnlOb2Rlcyk7Ci0gICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgICAgZGVmYXVsdDoKLSAgICAgICAgIHJlZ05vZGUuZ2V0UHVibGlzaGVkU2VydmljZUludGVyZmFjZU5vZGVzKHN1bW1hcnlOb2Rlcyk7Ci0gICAgIH0KLSAgIH0KLSAgIGJvb2xlYW4gaGFzVGFyZ2V0ID0gZmFsc2U7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfSVRFTVNfU1VNTUFSWSIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Jlc3VtZXByb3h5bG9hZHBhZ2UuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy9yZXN1bHRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLTwlICAgCi0gICBIYXNodGFibGUgYWxsVW5pcXVlTm9kZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICBmb3IgKGludCBpPTA7aTxzdW1tYXJ5Tm9kZXMuc2l6ZSgpO2krKykKLSAgIHsKLSAgICAgTm9kZSBzdW1tYXJ5Tm9kZSA9IChOb2RlKXN1bW1hcnlOb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgIGFsbFVuaXF1ZU5vZGVzLnB1dChzdW1tYXJ5Tm9kZS5nZXRUcmVlRWxlbWVudCgpLmdldEtleSgpLHN1bW1hcnlOb2RlKTsKLSAgIH0KLSAgIAotICAgaWYgKCFhbGxVbmlxdWVOb2Rlcy5pc0VtcHR5KCkpCi0gICB7Ci0gICAgIE9iamVjdFtdIGl0ZW1Ob2RlcyA9IGFsbFVuaXF1ZU5vZGVzLnZhbHVlcygpLnRvQXJyYXkoKTsKLSAgICAgUXVpY2tTb3J0LnNvcnQoaXRlbU5vZGVzLDAsaXRlbU5vZGVzLmxlbmd0aC0xKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8aXRlbU5vZGVzLmxlbmd0aDtpKyspCi0gICAgIHsKLSAgICAgICBOb2RlIGl0ZW1Ob2RlID0gKE5vZGUpaXRlbU5vZGVzW2ldOwotICAgICAgIFN0cmluZyB1cmwgPSBTZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoaXRlbU5vZGUuZ2V0Tm9kZUlkKCksZmFsc2UpOwotICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgIGlmIChpdGVtTm9kZSBpbnN0YW5jZW9mIFF1ZXJ5Tm9kZSkKLSAgICAgICB7Ci0gICAgICAgICBRdWVyeUVsZW1lbnQgcXVlcnlFbGVtZW50ID0gKFF1ZXJ5RWxlbWVudClpdGVtTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgbmFtZSA9IHF1ZXJ5RWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICBTdHJpbmcgbnVtYmVyT2ZDaGlsZE5vZGVzU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YoaXRlbU5vZGUuZ2V0Q2hpbGROb2RlcygpLnNpemUoKSk7Ci0gICAgICAgICBzd2l0Y2ggKHF1ZXJ5RWxlbWVudC5nZXRRdWVyeVR5cGUoKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19CVVNJTkVTU0VTX0ZPVU5EIixudW1iZXJPZkNoaWxkTm9kZXNTdHJpbmcpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFU19GT1VORCIsbnVtYmVyT2ZDaGlsZE5vZGVzU3RyaW5nKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORCIsbnVtYmVyT2ZDaGlsZE5vZGVzU3RyaW5nKTsKLSAgICAgICAgIH0gICAgICAgICAgICAgCi0gICAgICAgfQotICAgICAgIGVsc2UgaWYgKGl0ZW1Ob2RlIGluc3RhbmNlb2YgQnVzaW5lc3NOb2RlKQotICAgICAgIHsKLSAgICAgICAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClpdGVtTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCk7Ci0gICAgICAgICBuYW1lID0gYmUuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICAgIGRlc2NyaXB0aW9uID0gYmUuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgICAgfQotICAgICAgIGVsc2UgaWYgKGl0ZW1Ob2RlIGluc3RhbmNlb2YgU2VydmljZU5vZGUpCi0gICAgICAgewotICAgICAgICAgU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoU2VydmljZUVsZW1lbnQpaXRlbU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IHNlcnZpY2VFbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpOwotICAgICAgICAgbmFtZSA9IGJzLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgICAgICBkZXNjcmlwdGlvbiA9IGJzLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotICAgICAgIH0KLSAgICAgICBlbHNlIGlmIChpdGVtTm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VOb2RlKQotICAgICAgIHsKLSAgICAgICAgIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNpRWxlbWVudCA9IChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudClpdGVtTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgVE1vZGVsIHRNb2RlbCA9IHNpRWxlbWVudC5nZXRUTW9kZWwoKTsKLSAgICAgICAgIG5hbWUgPSB0TW9kZWwuZ2V0TmFtZVN0cmluZygpOwotICAgICAgICAgZGVzY3JpcHRpb24gPSB0TW9kZWwuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgICAgfQotJT4KLSAgICBhZGRSZXN1bHRSb3coIlN1bW1hcnkiLDwlPWl0ZW1Ob2RlLmdldE5vZGVJZCgpJT4sIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24pJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci0gICAgdmFyIGxvYWRTY3JlZW5UYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkU2NyZWVuIik7Ci0gICAgaWYgKGxvYWRTY3JlZW5UYWJsZS5yb3dzLmxlbmd0aCA+IDApCi0gICAgICBsb2FkU2NyZWVuVGFibGUuZGVsZXRlUm93KDApOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluU2NyZWVuIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotPGRpdiBpZD0iY29udGVudCI+Ci0gIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8ZGl2IGlkPSJtYWluU2NyZWVuIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci08JQotICAgU3RyaW5nIHRpdGxlID0gc2VsZWN0ZWRUb29sLmdldEFsdFRleHQoKTsKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9IHNlbGVjdGVkVG9vbC5nZXRIaWdobGlnaHRlZEltYWdlTGluaygpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2Zvcm1zL3Jlc3VsdHNmb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8Zm9ybSB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyI+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIFN0cmluZyB0YWJsZVRpdGxlOwotICAgc3dpdGNoIChxdWVyeUl0ZW0pCi0gICB7Ci0gICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1FVRVJJRVM6Ci0gICAgICAgdGFibGVUaXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1FVRVJJRVMiKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICB0YWJsZVRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTRVMiKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgdGFibGVUaXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFUyIpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgdGFibGVUaXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVMiKTsKLSAgIH0KLSAgIFN0cmluZ1tdIG90aGVyUHJvcGVydGllcyA9IHt0YWJsZVRpdGxlLCIifTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJTdW1tYXJ5Iik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMob3RoZXJQcm9wZXJ0aWVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvcmVzdWx0c190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9SRUZSRVNIIiklPiIgb25DbGljaz0icmVmcmVzaFNlbGVjdGlvbnMoJ1N1bW1hcnknLHRoaXMuZm9ybSkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgIDwvdGQ+Ci08JQotICAgaWYgKHF1ZXJ5SXRlbSAhPSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fUVVFUklFUykKLSAgIHsKLSU+ICAgICAgICAgICAgIAotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9BRERfVE9fRkFWT1JJVEVTIiklPiIgb25DbGljaz0iYWRkU2VsZWN0aW9uc1RvRmF2b3JpdGVzKCdTdW1tYXJ5Jyx0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICA8L3RkPgotPCUKLSAgIH0KLSU+ICAgICAgICAgICAgIAotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9DTEVBUiIpJT4iIG9uQ2xpY2s9ImNsZWFyU2VsZWN0aW9ucygnU3VtbWFyeScsdGhpcy5mb3JtKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZm9ybT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci0gIHJlc3VtZVByb3h5TG9hZFBhZ2UoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0xvZ2luVWRkaUZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0xvZ2luVWRkaUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWU5Y2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9Mb2dpblVkZGlGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTM2NDQ5IGJydW5zc2VuQHVzLmlibS5jb20gLSBWaW5jZSBCcnVuc3NlbiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIHNlbGVjdGVkTm9kZSBtdXN0IGJlIGEgcmVnaXN0cnkgbm9kZS4KLSAgIE5vZGUgcmVnTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICByZWdOb2RlLmdldFRvb2xNYW5hZ2VyKCkuc2V0U2VsZWN0ZWRUb29sSWQoMSk7Ci0gICBMaXN0IHRvb2xzID0gcmVnTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRUb29scygpOwotICAgSXRlcmF0b3IgaXRlciA9IHRvb2xzLml0ZXJhdG9yKCk7Ci0gICBUb29sIHQgPSBudWxsOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHJlZ05vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT5OZXcgTG9naW4gRm9ybTwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHNob3dNYWluRm9ybShwdWJsaXNoVmFsdWUpCi0gIHsKLSAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICBpZiAobG9hZFNjcmVlblRhYmxlLnJvd3MubGVuZ3RoID4gMCkKLSAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gIH0KLQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotICA8ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8dGFibGUgaWQ9ImxvYWRTY3JlZW4iPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfTE9BRF9JTl9QUk9HUkVTUyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8ZGl2IGlkPSJtYWluU2NyZWVuIiA+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gInVkZGkvaW1hZ2VzL3B1Ymxpc2hfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgIFN0cmluZyB0aXRsZSA9ICJMb2dpbiI7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwvZGl2PgotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvTG9naW5BZHZhbmNlZEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xvZ2luX2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgc2hvd01haW5Gb3JtKDApOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc0Zvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL01hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3Zjc4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnJlc3BvbnNlLkNvbXBsZXRpb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBTdHJpbmcgcHViQXNzZXJ0aW9uRm9ybSA9ICJzaG93UHVibGlzaGVyQXNzZXJ0aW9uc0Zvcm0iOwotICAgU3RyaW5nIHB1Ymxpc2hlckFzc2VydGlvbnNCdXNpbmVzcyA9ICJwdWJsaXNoZXJBc3NlcnRpb25zQnVzaW5lc3MiOwotCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7ICAgCi0gICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IHVkZGlNYWluTm9kZS5nZXRSZWdpc3RyeU5vZGUoc2VsZWN0ZWROb2RlKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLQotICAgU3RyaW5nIGRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlID0gImRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlIjsKLSAgIFN0cmluZyB4ZGl2UHVibGlzaGVyQXNzZXJ0aW9uVGFibGUgPSAieGRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlIjsKLSU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgIHN1YlF1ZXJ5S2V5UHJvcGVydHkuc2V0U3ViUXVlcnlLZXkoc3ViUXVlcnlLZXkpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08JQotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUyIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLQotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9yZXN1bWVwcm94eWxvYWRwYWdlLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGl0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3Jlc3VsdHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHNldERlZmF1bHRzKCkKLSAgewotICAgIGNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpOwotPCUKLSAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICB7Ci0gICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHB1Ymxpc2hVUkwpJT4iOwotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJJZCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwYXNzd29yZCklPiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIjwlPXB1YkFzc2VydGlvbkZvcm0lPiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0gICAKLSAgIFZlY3RvciBidXNpbmVzcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OUyk7Ci0gICBMaXN0TWFuYWdlciBidXNpbmVzc0NvcHkgPSAoTGlzdE1hbmFnZXIpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OU19DT1BZKTsKLSAgIGlmIChidXNpbmVzcyAhPSBudWxsKQotICAgewotICAgICBpZiAoYnVzaW5lc3NDb3B5ID09IG51bGwpCi0gICAgICAgYnVzaW5lc3NDb3B5ID0gbmV3IExpc3RNYW5hZ2VyKCk7Ci0gICAgIGVsc2UKLSAgICAgICBidXNpbmVzc0NvcHkuY2xlYXIoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8YnVzaW5lc3Muc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWJ1c2luZXNzLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TLGksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMsZmFsc2UpOwotICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGJ1c2luZXNzQ29weS5hZGQobGlzdEVsZW1lbnQpOwotJT4KLSAgICBhZGRQdWJsaXNoZXJBc3NlcnRpb25SZXN1bHRSb3coIjwlPXB1Ymxpc2hlckFzc2VydGlvbnNCdXNpbmVzcyU+Iiw8JT1saXN0RWxlbWVudC5nZXRWaWV3SWQoKSU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGJlLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpKSU+Iik7Ci08JQotICAgICB9Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRERfUFVCTElTSEVSX0FTU0VSVElPTlNfQ09QWSxidXNpbmVzc0NvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBidXNpbmVzcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgYnVzaW5lc3NDb3B5ID0gbmV3IExpc3RNYW5hZ2VyKCk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRERfUFVCTElTSEVSX0FTU0VSVElPTlMsYnVzaW5lc3MpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TX0NPUFksYnVzaW5lc3NDb3B5KTsKLSAgIH0KLSU+Ci0gIH0KLQotICBmdW5jdGlvbiBwb3B1bGF0ZUFzc2VydGlvblRhYmxlKCkgewotPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgQnVzaW5lc3NFbGVtZW50KQotICAgIHsKLSAgICAgIExpc3RNYW5hZ2VyIHB1YkFzc2VydGlvbnMgPSAoKEJ1c2luZXNzRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldFB1Ymxpc2hlckFzc2VydGlvbnMoKTsKLSAgICAgIGlmIChwdWJBc3NlcnRpb25zID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGFjdGlvbiA9IG5ldyBTaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihjb250cm9sbGVyKTsKLSAgICAgICAgYWN0aW9uLnJ1bigpOwotJT4KLSAgICAgICAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPCUKLSAgICAgICAgcHViQXNzZXJ0aW9ucyA9ICgoQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0UHVibGlzaGVyQXNzZXJ0aW9ucygpOwotICAgICAgfQotCi0gICAgICBwdWJBc3NlcnRpb25zID0gKChCdXNpbmVzc0VsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRQdWJsaXNoZXJBc3NlcnRpb25zKCk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gKChwdWJBc3NlcnRpb25zICE9IG51bGwpID8gcHViQXNzZXJ0aW9ucy5nZXRMaXN0RWxlbWVudHMoKSA6IG51bGwpOwotICAgICAgd2hpbGUgKGUgIT0gbnVsbCAmJiBlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBMaXN0RWxlbWVudCBsZSA9IChMaXN0RWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQgcHViQXNzZXJ0aW9uRWxlbWVudCA9IChQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgICAgICBpbnQgdmlld0lkID0gbGUuZ2V0Vmlld0lkKCk7Ci0gICAgICAgIFN0cmluZyBkaXJlY3Rpb247Ci0gICAgICAgIGlmICgoKEJ1c2luZXNzRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKS5lcXVhbHMocHViQXNzZXJ0aW9uRWxlbWVudC5nZXRGcm9tS2V5KCkpKQotICAgICAgICAgIGRpcmVjdGlvbiA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX0ZST00iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpcmVjdGlvbiA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX1RPIik7Ci0gICAgICAgIExpc3RFbGVtZW50IHNwID0gKExpc3RFbGVtZW50KXB1YkFzc2VydGlvbkVsZW1lbnQuZ2V0U2VydmljZVByb3ZpZGVyKCk7Ci0gICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBzcC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICAgaW50IHRhcmdldFRvb2xJZCA9IHNwLmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgICBpbnQgdGFyZ2V0Vmlld0lkID0gc3AuZ2V0VGFyZ2V0Vmlld0lkKCk7Ci0gICAgICAgIGludCBzdWJRdWVyeUl0ZW1JZCA9IHB1YkFzc2VydGlvbkVsZW1lbnQuZ2V0U3ViUXVlcnlJdGVtSWQoKTsKLSAgICAgICAgU3RyaW5nIHVybCA9IFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHRhcmdldE5vZGVJZCx0YXJnZXRUb29sSWQsdGFyZ2V0Vmlld0lkLHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0VYSVNUSU5HX1BVQkxJU0hFUl9BU1NFUlRJT05TLHN1YlF1ZXJ5SXRlbUlkLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTLGZhbHNlKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoKEJ1c2luZXNzRW50aXR5KXNwLmdldE9iamVjdCgpKS5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgICBTdHJpbmcgZGVzYyA9ICgoQnVzaW5lc3NFbnRpdHkpc3AuZ2V0T2JqZWN0KCkpLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotICAgICAgICBTdHJpbmcgc3RhdHVzID0gcHViQXNzZXJ0aW9uRWxlbWVudC5nZXRTdGF0dXMoKTsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBwdWJBc3NlcnRpb25FbGVtZW50LmdldEtleWVkUmVmKCkuZ2V0S2V5VmFsdWUoKTsKLSU+Ci0gICAgICBhZGRBc3NlcnRpb24oIjwlPWRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlJT4iLDwlPXZpZXdJZCU+LCI8JT1kaXJlY3Rpb24lPiIsIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzYyklPiIsIjwlPXN0YXR1cyU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHR5cGUpJT4iKTsKLTwlCi0gICAgICB9Ci0gICAgfQotJT4KLSAgfQotCi0gIGZ1bmN0aW9uIGFkZEFzc2VydGlvbih0YWJsZUNvbnRhaW5lcklkLHZpZXdJZCxkaXJlY3Rpb24sdXJsLG5hbWUsZGVzYyxzdGF0dXMsdHlwZSkKLSAgewotICAgIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW41ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uNiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIHJvd0NoZWNrYm94Lm5hbWUgPSAiPCU9VURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19WSUVXSUQlPiI7Ci0gICAgcm93Q2hlY2tib3gudmFsdWUgPSB2aWV3SWQ7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9USElTX0JVU0lORVNTIiklPiIpKTsKLQotICAgIGNvbHVtbjIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGlyZWN0aW9uKSk7Ci0KLSAgICB2YXIgbmFtZURldGFpbHNMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIG5hbWVEZXRhaWxzTGluay5ocmVmID0gdXJsOwotICAgIG5hbWVEZXRhaWxzTGluay50YXJnZXQgPSAiPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IjsKLSAgICBuYW1lRGV0YWlsc0xpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSkpOwotICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQobmFtZURldGFpbHNMaW5rKTsKLQotICAgIGNvbHVtbjQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZ2V0RGVmYXVsdERpc3BsYXlTdHJpbmcoZGVzYykpKTsKLQotICAgIGNvbHVtbjUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3RhdHVzKSk7Ci0KLSAgICBjb2x1bW42LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHR5cGUpKTsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjMuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjQuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjUuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjYuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4zKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uNCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjUpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW42KTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLQotICB9Ci0KLSAgZnVuY3Rpb24gYWRkUHVibGlzaGVyQXNzZXJ0aW9uUmVzdWx0Um93KHRhYmxlQ29udGFpbmVySWQsbm9kZUlkLHVybCxuYW1lLGRlc2NyaXB0aW9uKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsbm9kZUlkKSk7Ci0KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9USElTX0JVU0lORVNTIiklPiIpKTsKLQotICAgIHZhciBkaXJlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICBkaXJlY3Rpb24uaWQgPSAibGFiZWxfcHVibGlzaGVyX2Fzc2VydGlvbl9kaXJlY3Rpb24iOwotICAgIGRpcmVjdGlvbi5uYW1lID0gIjwlPVVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfRElSRUNUSU9OJT4iOwotICAgIGRpcmVjdGlvbi5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCI7Ci0gICAgZGlyZWN0aW9uLm9wdGlvbnNbMF0gPSBuZXcgT3B0aW9uKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9GUk9NIiklPiIsICI8JT1TdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLkRJUkVDVElPTl9GUk9NKSU+Iik7Ci0gICAgZGlyZWN0aW9uLm9wdGlvbnNbMV0gPSBuZXcgT3B0aW9uKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9UTyIpJT4iLCAiPCU9U3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5ESVJFQ1RJT05fVE8pJT4iKTsKLSAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGRpcmVjdGlvbik7Ci0KLSAgICB2YXIgbmFtZURldGFpbHNMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIG5hbWVEZXRhaWxzTGluay5ocmVmID0gdXJsOwotICAgIG5hbWVEZXRhaWxzTGluay50YXJnZXQgPSAiPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IjsKLSAgICBuYW1lRGV0YWlsc0xpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSkpOwotICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQobmFtZURldGFpbHNMaW5rKTsKLQotICAgIGNvbHVtbjQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZ2V0RGVmYXVsdERpc3BsYXlTdHJpbmcoZGVzY3JpcHRpb24pKSk7Ci0KLSAgICB2YXIgYXNzZXJ0aW9uVHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIGFzc2VydGlvblR5cGUuaWQgPSAibGFiZWxfcHVibGlzaGVyX2Fzc2VydGlvbl90eXBlIjsKLSAgICBhc3NlcnRpb25UeXBlLm5hbWUgPSAiPCU9VURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19UWVBFJT4iOwotICAgIGFzc2VydGlvblR5cGUuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgIGFzc2VydGlvblR5cGUub3B0aW9uc1swXSA9IG5ldyBPcHRpb24oIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QQVJFTlRfQ0hJTEQiKSU+IiwgIjwlPVN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfVFlQRV9QQVJFTlRfQ0hJTEQpJT4iKTsKLSAgICBhc3NlcnRpb25UeXBlLm9wdGlvbnNbMV0gPSBuZXcgT3B0aW9uKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEVFUl9UT19QRUVSIiklPiIsICI8JT1TdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1RZUEVfUEVFUl9UT19QRUVSKSU+Iik7Ci0gICAgYXNzZXJ0aW9uVHlwZS5vcHRpb25zWzJdID0gbmV3IE9wdGlvbigiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX0lERU5USVRZIiklPiIsICI8JT1TdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1RZUEVfSURFTlRJVFkpJT4iKTsKLSAgICBjb2x1bW41LmFwcGVuZENoaWxkKGFzc2VydGlvblR5cGUpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMy5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uNC5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uNS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMik7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjMpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW40KTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uNSk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoZm9ybSxsb2NhdGlvbikKLSAgewotICAgIGZvcm0uYWN0aW9uID0gbG9jYXRpb247Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoIjwlPXB1Ymxpc2hlckFzc2VydGlvbnNCdXNpbmVzcyU+IiwgIjwlPVVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lEJT4iLCBmb3JtLCBmYWxzZSk7Ci0gICAgICBmb3JtLnN1Ym1pdCgpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIGNoZWNrVGFibGVFbnRyaWVzQW5kU3VibWl0KHRhYmxlQ29udGFpbmVySWQsZm9ybSxsb2NhdGlvbikKLSAgewotICAgIGlmIChnZXROdW1iZXJPZlNlbGVjdGlvbnModGFibGVDb250YWluZXJJZCkgPiAwKSB7Ci0gICAgICBzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoZm9ybSxsb2NhdGlvbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGFsZXJ0KCI8JT1jb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPiIpOwotICB9Ci0KLSAgZnVuY3Rpb24gY2hlY2tUYWJsZVNpemVBbmRTdWJtaXQodGFibGVDb250YWluZXJJZCxmb3JtLGxvY2F0aW9uKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgaWYgKHRhYmxlLnJvd3MubGVuZ3RoID4gbnVtYmVyT2ZIZWFkZXJSb3dzKSB7Ci0gICAgICBzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoZm9ybSxsb2NhdGlvbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGFsZXJ0KCI8JT1jb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPiIpOwotICB9Ci0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iIG9uVW5sb2FkPSJjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKSI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDxkaXYgaWQ9InB1Ymxpc2hlckFzc2VydGlvbnMiPgotICAgICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9TaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VUJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0lPiI+Ci0KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAidWRkaS9pbWFnZXMvcHVibGlzaGVyX2Fzc2VydGlvbnNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgIFN0cmluZyB0aXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TIik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgICAgICA8dGFibGUgd2lkdGg9IjkwJSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TX0RFU0MiKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1kaXZQdWJsaXNoZXJBc3NlcnRpb25UYWJsZSU+JywnPCU9eGRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlJT4nKSI+PGltZyBuYW1lPSI8JT14ZGl2UHVibGlzaGVyQXNzZXJ0aW9uVGFibGUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICA8c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfQVNTRVJUSU9OUyIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZQdWJsaXNoZXJBc3NlcnRpb25UYWJsZSU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9KChCdXNpbmVzc0VsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRCdXNpbmVzc0VudGl0eSgpLmdldERlZmF1bHROYW1lU3RyaW5nKCklPjwvdGg+Ci0gICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjxsYWJlbCBmb3I9ImxhYmVsX3B1Ymxpc2hlcl9hc3NlcnRpb25fZGlyZWN0aW9uIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ESVJFQ1RJT04iKSU+PC9sYWJlbD48L3RoPgotICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CVVNJTkVTUyIpJT48L3RoPgotICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVNDUklQVElPTiIpJT48L3RoPgotICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TVEFUVVMiKSU+PC90aD4KLSAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PGxhYmVsIGZvcj0ibGFiZWxfcHVibGlzaGVyX2Fzc2VydGlvbl90eXBlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BU1NFUlRJT05fVFlQRSIpJT48L2xhYmVsPjwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTkNPTVBMRVRFX0FTU0VSVElPTlNfVklTSUJJTElUWV9ERVNDIiklPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLQotPCUKLSAgIGJvb2xlYW4gdGFibGVIYXNFcnJvcnMgPSAhZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRERfUFVCTElTSEVSX0FTU0VSVElPTlMpOwotICAgU3RyaW5nW10gYnVzU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX0JVU0lORVNTRVMiLChuZXcgQm9vbGVhbih0YWJsZUhhc0Vycm9ycykpLnRvU3RyaW5nKCksU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpLCJwdWJsaXNoZXJBc3NlcnRpb25zIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OU307Ci0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQocHVibGlzaGVyQXNzZXJ0aW9uc0J1c2luZXNzKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhidXNTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c1B1Ymxpc2hlckFzc2VydGlvbnNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKHB1YkFzc2VydGlvbkZvcm0pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJhdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9TSE9XX0FMTF9QVUJMSVNIRVJfQVNTRVJUSU9OUyIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCh0aGlzLmZvcm0sJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1Nob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcCIpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9DT01QTEVURV9QVUJMSVNIRVJfQVNTRVJUSU9OUyIpJT4iIG9uQ2xpY2s9ImNoZWNrVGFibGVFbnRyaWVzQW5kU3VibWl0KCc8JT1kaXZQdWJsaXNoZXJBc3NlcnRpb25UYWJsZSU+Jyx0aGlzLmZvcm0sJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0NvbXBsZXRlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AiKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TIiklPiIgb25DbGljaz0iY2hlY2tUYWJsZVNpemVBbmRTdWJtaXQoJzwlPXB1Ymxpc2hlckFzc2VydGlvbnNCdXNpbmVzcyU+Jyx0aGlzLmZvcm0sJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0FkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwIikpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX1JFTU9WRV9QVUJMSVNIRVJfQVNTRVJUSU9OUyIpJT4iIG9uQ2xpY2s9ImNoZWNrVGFibGVFbnRyaWVzQW5kU3VibWl0KCc8JT1kaXZQdWJsaXNoZXJBc3NlcnRpb25UYWJsZSU+Jyx0aGlzLmZvcm0sJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlbW92ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwIikpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Zvcm0+Ci0KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcG9wdWxhdGVBc3NlcnRpb25UYWJsZSgpOwotICBzZXREZWZhdWx0cygpOwotICByZXN1bWVQcm94eUxvYWRQYWdlKCk7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmZGEzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgUmVnaXN0cnlOb2RlIHJlZ05vZGUgPSB1ZGRpTWFpbk5vZGUuZ2V0UmVnaXN0cnlOb2RlKHNlbGVjdGVkTm9kZSk7Ci0gICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBTdHJpbmcgc2sgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgIHN1YlF1ZXJ5S2V5UHJvcGVydHkuc2V0U3ViUXVlcnlLZXkoc2spOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08aHRtbD4KLTxoZWFkPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVMiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy9yZXN1bHRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLTwlCi0gICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgewotICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSU+Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwdWJsaXNoVVJMKSU+IjsKLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1c2VySWQpJT4iOwotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocGFzc3dvcmQpJT4iOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBdXRoZW50aWNhdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0gICBTdHJpbmcgc3ViUXVlcnlLZXkgPSBzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleSk7Ci0gICBWZWN0b3IgcmVmZXJlbmNlZFNlcnZpY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfUkVGRVJFTkNFRF9TRVJWSUNFUyk7Ci0gICBpZiAocmVmZXJlbmNlZFNlcnZpY2VzID09IG51bGwpCi0gICB7Ci0gICAgIHJlZmVyZW5jZWRTZXJ2aWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgQnVzaW5lc3NFbnRpdHkgYnVzaW5lc3NFbnRpdHkgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCk7Ci0gICAgIFN0cmluZyBidXNpbmVzc0tleSA9IGJ1c2luZXNzRW50aXR5LmdldEJ1c2luZXNzS2V5KCk7Ci0gICAgIEJ1c2luZXNzU2VydmljZXMgYnVzaW5lc3NTdmNzID0gYnVzaW5lc3NFbnRpdHkuZ2V0QnVzaW5lc3NTZXJ2aWNlcygpOwotICAgICBpZiAoYnVzaW5lc3NTdmNzICE9IG51bGwpCi0gICAgIHsKLSAgICAgICBWZWN0b3IgYnVzaW5lc3NTdmNWZWN0b3IgPSBidXNpbmVzc1N2Y3MuZ2V0QnVzaW5lc3NTZXJ2aWNlVmVjdG9yKCk7Ci0gICAgICAgZm9yIChpbnQgaT0wO2k8YnVzaW5lc3NTdmNWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICB7Ci0gICAgICAgICBCdXNpbmVzc1NlcnZpY2UgYnVzU2VydmljZSA9IChCdXNpbmVzc1NlcnZpY2UpYnVzaW5lc3NTdmNWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgaWYgKCFidXNTZXJ2aWNlLmdldEJ1c2luZXNzS2V5KCkuZXF1YWxzKGJ1c2luZXNzS2V5KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQoYnVzU2VydmljZSk7Ci0gICAgICAgICAgIHJlZmVyZW5jZWRTZXJ2aWNlcy5hZGRFbGVtZW50KGxpc3RFbGVtZW50KTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1JFRkVSRU5DRURfU0VSVklDRVMscmVmZXJlbmNlZFNlcnZpY2VzKTsKLSAgIH0KLQotICAgZm9yIChpbnQgaT0wO2k8cmVmZXJlbmNlZFNlcnZpY2VzLnNpemUoKTtpKyspCi0gICB7Ci0gICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXJlZmVyZW5jZWRTZXJ2aWNlcy5lbGVtZW50QXQoaSk7Ci0gICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICBpbnQgdGFyZ2V0Vmlld0lkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCk7Ci0gICAgIFN0cmluZyB1cmwgPSBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCxzdWJRdWVyeUtleSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1JFRkVSRU5DRURfU0VSVklDRVMsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMsZmFsc2UpOwotICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSAoQnVzaW5lc3NTZXJ2aWNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICBTdHJpbmcgbmFtZSA9IGJzLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGJzLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotJT4KLSAgICBhZGRSZXN1bHRSb3coIm1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1JlZmVyZW5jZXMiLDwlPXRhcmdldE5vZGVJZCU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uKSU+Iik7Ci08JQotICAgfQotCi0gICBWZWN0b3Igc2VydmljZXMgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TRVJWSUNFUyk7Ci0gICBpZiAoc2VydmljZXMgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZXMuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TRVJWSUNFUyxpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyxmYWxzZSk7Ci0gICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBTdHJpbmcgbmFtZSA9IGJzLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gYnMuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0lPgotICAgIGFkZFJlc3VsdFJvdygibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzU2VydmljZXMiLDwlPXRhcmdldE5vZGVJZCU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0lPgotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc1JlZmVyZW5jZVRhYmxlKHRhYmxlQ29udGFpbmVySWQsaW5wdXROYW1lLGZvcm0pCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgaW5wdXRzID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudChpbnB1dE5hbWUsaW5wdXRzLml0ZW0oMCkuY2hlY2tlZCkpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NSZWZlcmVuY2VUYWJsZSgibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzUmVmZXJlbmNlcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuUkVGRVJFTkNFRF9TRVJWSUNFX1NFTEVDVF9TVEFURSU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NSZXN1bHRUYWJsZSgibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzU2VydmljZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFJT4iLGZvcm0sZmFsc2UpOwotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzQWRkU2VydmljZXMoZm9ybSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKCJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNTZXJ2aWNlcyIpOwotICAgIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PSBudW1iZXJPZkhlYWRlclJvd3MpCi0gICAgICBhbGVydCgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fU0VSVklDRVMiKSklPiIpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OJT4udmFsdWUgPSAiPCU9VURESUFjdGlvbklucHV0cy5NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19PUEVSQVRJT05fQUREJT4iOwotICAgICAgcHJvY2Vzc0Zvcm0oZm9ybSk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc1JlbW92ZVJlZmVyZW5jZXMoZm9ybSkKLSAgewotICAgIHZhciBudW1iZXJPZlNlbGVjdGlvbnMgPSBnZXROdW1iZXJPZlNlbGVjdGlvbnMoIm1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1JlZmVyZW5jZXMiKTsKLSAgICBpZiAoZ2V0TnVtYmVyT2ZTZWxlY3Rpb25zKCJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNSZWZlcmVuY2VzIikgPT0gMCkKLSAgICAgIGFsZXJ0KCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19SRUZFUkVOQ0VfU0VMRUNURUQiKSklPiIpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OJT4udmFsdWUgPSAiPCU9VURESUFjdGlvbklucHV0cy5NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19PUEVSQVRJT05fUkVNT1ZFJT4iOwotICAgICAgcHJvY2Vzc0Zvcm0oZm9ybSk7Ci0gICAgfQotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPGRpdiBpZD0ibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzIj4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAidWRkaS9pbWFnZXMvcmVmZXJlbmNlZF9zZXJ2aWNlc19oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFUyIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBzdHlsZT0ibWFyZ2luLXRvcDowOyI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfSU5JVElBVEVEJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9RVUVSWV9JVEVNJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTiU+Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX0RFU0MiKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08JQotICAgU3RyaW5nW10gcHJvamVjdGlvbnNTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfUkVGRVJFTkNFRF9TRVJWSUNFUyIsQm9vbGVhbi5GQUxTRS50b1N0cmluZygpLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyksIm1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlcyIsVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9SRUZFUkVOQ0VEX1NFUlZJQ0VTfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzUmVmZXJlbmNlcyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKHByb2plY3Rpb25zU3BlY2lmaWNJbmZvKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmVuYWJsZUR5bmFtaWMoZmFsc2UpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgU3RyaW5nW10gc2VydmljZXNTcGVjaWZpY0luZm8gPSB7IkZPUk1fT1BUSU9OX1NFUlZJQ0VTIixCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCksU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSwibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NFUlZJQ0VTfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzU2VydmljZXMiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhzZXJ2aWNlc1NwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoIm1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0F1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0FERF9TRVJWSUNFUyIpJT4iIG9uQ2xpY2s9InByb2Nlc3NBZGRTZXJ2aWNlcyh0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX1JFTU9WRV9SRUZFUkVOQ0VTIiklPiIgb25DbGljaz0icHJvY2Vzc1JlbW92ZVJlZmVyZW5jZXModGhpcy5mb3JtKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Zvcm0+Ci0gICAgPC9kaXY+Ci0gIDwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9PcGVuUmVnaXN0cnlGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9PcGVuUmVnaXN0cnlGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwYmMzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvT3BlblJlZ2lzdHJ5Rm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MTUgICAxMzUzMDcgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci1Ob2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLVVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLU9wZW5SZWdpc3RyeVRvb2wgb3BlblJlZ2lzdHJ5VG9vbCA9IChPcGVuUmVnaXN0cnlUb29sKSh1ZGRpTWFpbk5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotRW51bWVyYXRpb24gZmF2b3JpdGVSZWdpc3RyeUVsZW1lbnRzID0gb3BlblJlZ2lzdHJ5VG9vbC5nZXRGYXZvcml0ZVJlZ2lzdHJ5RWxlbWVudHMoKTsKLVZlY3RvciBmYXZvcml0ZVJlZ2lzdHJ5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLXdoaWxlIChmYXZvcml0ZVJlZ2lzdHJ5RWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gIGZhdm9yaXRlUmVnaXN0cnlMaXN0LmFkZEVsZW1lbnQoZmF2b3JpdGVSZWdpc3RyeUVsZW1lbnRzLm5leHRFbGVtZW50KCkpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX09QRU5fUkVHSVNUUlkiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm11dGlscy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGZ1bmN0aW9uIGZpbGxGYXZvcml0ZUluZm8oZmF2b3JpdGVSZWdpc3RyeVNlbGVjdCkKLSAgICB7Ci0gICAgICB2YXIgc2VsZWN0ZWRGYXZvcml0ZVJlZ2lzdHJ5SW5kZXggPSBmYXZvcml0ZVJlZ2lzdHJ5U2VsZWN0LnNlbGVjdGVkSW5kZXgtMTsKLSAgICAgIGlmIChzZWxlY3RlZEZhdm9yaXRlUmVnaXN0cnlJbmRleCA+PSAwKQotICAgICAgewotICAgICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvcGVuUmVnaXN0cnlGb3JtIik7Ci0gICAgICAgIHN3aXRjaCAoc2VsZWN0ZWRGYXZvcml0ZVJlZ2lzdHJ5SW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICA8JQotICAgICAgICAgIGZvciAoaW50IGk9MDtpPGZhdm9yaXRlUmVnaXN0cnlMaXN0LnNpemUoKTtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZSZWdFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZmF2b3JpdGVSZWdpc3RyeUxpc3QuZWxlbWVudEF0KGkpOwotICAgICAgICAgICU+Ci0gICAgICAgICAgICBjYXNlIDwlPWklPjoKLSAgICAgICAgICAgICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZmF2UmVnRWxlbWVudC5nZXROYW1lKCkpJT4iOwotICAgICAgICAgICAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuSU5RVUlSWV9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZmF2UmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCkpJT4iOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICA8JQotICAgICAgICAgIH0KLSAgICAgICAgICAlPgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICAgIHsKLSAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm9wZW5SZWdpc3RyeUZvcm0iKTsKLSAgICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5SRUdJU1RSWV9OQU1FJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpb3BlblJlZ2lzdHJ5VG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUpKSU+IjsKLSAgICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKW9wZW5SZWdpc3RyeVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCkpJT4iOwotICAgICAgc2hvd01haW5Gb3JtKCk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2hvd01haW5Gb3JtKCkKLSAgICB7Ci0gICAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgICBsb2FkU2NyZWVuVGFibGUuZGVsZXRlUm93KDApOwotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgfQotCi0gICAKLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICAgIDwlCi0gICAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAidWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYiOwotICAgICAgU3RyaW5nIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9PUEVOX1JFR0lTVFJZIik7Ci0gICAgICAlPgotICAgICAgPCVAIGluY2x1ZGUgZmlsZT0iL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgICAgPHRhYmxlPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfT1BFTl9SRUdJU1RSWV9ERVNDIiklPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgICAgCi0gICAgICA8Zm9ybSBpZD0ib3BlblJlZ2lzdHJ5Rm9ybSIgYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9PcGVuUmVnaXN0cnlBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gaGFuZGxlU3VibWl0KHRoaXMpIj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgdmFsaWduPSJib3R0b20iIG5vd3JhcCBoZWlnaHQ9MjU+Ci0gICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImZhdm9yaXRlUmVnaXN0cnkiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1JFR0lTVFJZIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImZhdm9yaXRlUmVnaXN0cnkiIG9uQ2hhbmdlPSJmaWxsRmF2b3JpdGVJbmZvKHRoaXMpIiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIiBzZWxlY3RlZD4KLSAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPGZhdm9yaXRlUmVnaXN0cnlMaXN0LnNpemUoKTtpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZSZWdFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZmF2b3JpdGVSZWdpc3RyeUxpc3QuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1mYXZSZWdFbGVtZW50LmdldE5hbWUoKSU+Ij48JT1mYXZSZWdFbGVtZW50LmdldE5hbWUoKSU+Ci0gICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3JlZ2lzdHJ5X25hbWUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1JFR0lTVFJZX05BTUUiKSU+PC9sYWJlbD4KLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgaWYgKCFvcGVuUmVnaXN0cnlUb29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X3JlZ2lzdHJ5X25hbWUiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSU+IiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfaW5xdWlyeV91cmwiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lOUVVJUllfVVJMIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgIGlmICghb3BlblJlZ2lzdHJ5VG9vbC5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfaW5xdWlyeV91cmwiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuSU5RVUlSWV9VUkwlPiIgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwvZm9ybT4KLSAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICBzZXREZWZhdWx0cygpOwotICAgICAgPC9zY3JpcHQ+Ci0gICAgICAKLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUHJvY2Vzc1VERElGcmFtZXNldHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9Qcm9jZXNzVURESUZyYW1lc2V0c0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjNlZGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9Qcm9jZXNzVURESUZyYW1lc2V0c0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoZm9ybUFjdGlvbi50b1N0cmluZygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjAiPgotICA8aW5wdXQgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLkZSQU1FX05BTUUlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9Zm9ybUZyYW1lTmFtZSU+Ij4KLSAgPGlucHV0IG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UJT4iIHR5cGU9ImhpZGRlbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSU+Ij4KLSAgPGlucHV0IG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUiU+IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iPgotPC9mb3JtPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0RldGFpbHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdEZXRhaWxzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmEyMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0RldGFpbHNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDkxMiAgIDE0MTc5NiBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIFRoZSBzZWxlY3RlZCBub2RlIG11c3QgYmUgYSByZWdpc3RyeSBub2RlLgotICAgTm9kZSByZWdpc3RyeU5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gcmVnaXN0cnlOb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKGN1cnJlbnRUb29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKSk7ICAgCi0gICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICByZWdFbGVtZW50LnJlZnJlc2hNZXRhKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfUkVHSVNUUllfREVUQUlMUyIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL2RldGFpbHN0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHNldERlZmF1bHRzKCkKLSAgewotICAgIHZhciByZWdpc3RyeURldGFpbHNOYW1lVGFibGUgPSBnZXRUYWJsZSgicmVnaXN0cnlEZXRhaWxzTmFtZSIpOwotPCUKLSAgIFN0cmluZyBuYW1lID0gcmVnRWxlbWVudC5nZXROYW1lKCk7Ci0gICBib29sZWFuIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUkVHSVNUUllfTkFNRSk7ICAgCi0lPgotICAgIGFkZERldGFpbHNTaW5nbGVJdGVtUm93KCJyZWdpc3RyeURldGFpbHNOYW1lIixmYWxzZSk7Ci0gICAgc2V0RGV0YWlsc05hbWVTaW5nbGVJdGVtUm93KCJyZWdpc3RyeURldGFpbHNOYW1lIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUpJT4iKTsKLTwlCi0gICBpZiAoaXNFcnJvcikKLSAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHJlZ2lzdHJ5RGV0YWlsc05hbWVUYWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUKLSAgIH0KLSAgIAotICAgRW51bWVyYXRpb24gdXNlckRlZmluZWRDYXRlZ29yaWVzID0gcmVnRWxlbWVudC5nZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoKTsKLSAgIGJvb2xlYW4gY29udGFpbnNVc2VyRGVmaW5lZENhdGVnb3JpZXM7Ci0gICBpZiAodXNlckRlZmluZWRDYXRlZ29yaWVzICE9IG51bGwgJiYgdXNlckRlZmluZWRDYXRlZ29yaWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgewotJT4KLSAgICB2YXIgcmVnaXN0cnlDYXRlZ29yaWVzVGFibGUgPSBnZXRUYWJsZSgicmVnaXN0cnlVc2VyRGVmaW5lZENhdGVnb3JpZXMiKTsKLTwlICAgCi0gICAgIGNvbnRhaW5zVXNlckRlZmluZWRDYXRlZ29yaWVzID0gdHJ1ZTsKLSAgICAgQXJyYXlMaXN0IHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIGRvCi0gICAgIHsKLSAgICAgICB1c2VyRGVmaW5lZENhdGVnb3JpZXNMaXN0LmFkZCh1c2VyRGVmaW5lZENhdGVnb3JpZXMubmV4dEVsZW1lbnQoKSk7Ci0gICAgIH0gd2hpbGUgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcy5oYXNNb3JlRWxlbWVudHMoKSk7Ci0gICAgIENhdGVnb3J5TW9kZWxbXSB1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheSA9IG5ldyBDYXRlZ29yeU1vZGVsW3VzZXJEZWZpbmVkQ2F0ZWdvcmllc0xpc3Quc2l6ZSgpXTsKLSAgICAgdXNlckRlZmluZWRDYXRlZ29yaWVzTGlzdC50b0FycmF5KHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0FycmF5KTsKLSAgICAgUXVpY2tTb3J0LnNvcnQodXNlckRlZmluZWRDYXRlZ29yaWVzQXJyYXksMCx1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheS5sZW5ndGgtMSk7Ci0gICAgIFN0cmluZ0J1ZmZlciBmaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8dXNlckRlZmluZWRDYXRlZ29yaWVzQXJyYXkubGVuZ3RoO2krKykKLSAgICAgewotICAgICAgIG5hbWUgPSB1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheVtpXS5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgIFN0cmluZyB0TW9kZWxLZXkgPSB1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheVtpXS5nZXRUTW9kZWxLZXkoKTsKLSAgICAgICBib29sZWFuIGNoZWNrZWQgPSB1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheVtpXS5pc0NoZWNrZWQoKTsKLSAgICAgICBmaWxlTmFtZS5zZXRMZW5ndGgoMCk7Ci0gICAgICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0FycmF5W2ldLmlzRGF0YUxvYWRlZCgpKQotICAgICAgICAgZmlsZU5hbWUuYXBwZW5kKHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0FycmF5W2ldLmdldENhdGVnb3J5S2V5KCkpLmFwcGVuZCgiLnR4dCIpOwotICAgICAgIGVsc2UKLSAgICAgICAgIGZpbGVOYW1lLmFwcGVuZChjb250cm9sbGVyLmdldE1lc3NhZ2UoIlRBQkxFX0JMQU5LX1BMQUNFSE9MREVSIikpOwotICAgICAgIGJvb2xlYW4gaGFzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMsdE1vZGVsS2V5KTsKLSU+Ci0gICAgYWRkRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3coInJlZ2lzdHJ5VXNlckRlZmluZWRDYXRlZ29yaWVzIiwiPCU9dE1vZGVsS2V5JT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZSklPiIsPCU9Y2hlY2tlZCU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZmlsZU5hbWUudG9TdHJpbmcoKSklPiIsPCU9aGFzRXJyb3IlPik7Ci08JQotICAgICAgIGlmIChoYXNFcnJvcikKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhyZWdpc3RyeUNhdGVnb3JpZXNUYWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93cys8JT1pJT5dLCJlcnJhbnRSb3ciKTsKLTwlICAgICAgIAotICAgICAgIH0KLSAgICAgfQotICAgfQotICAgZWxzZQotICAgICBjb250YWluc1VzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IGZhbHNlOyAgIAotJT4gICAgICAgCi0gICAgc2hvd01haW5Gb3JtKCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNob3dNYWluRm9ybSgpCi0gIHsKLSAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICBpZiAobG9hZFNjcmVlblRhYmxlLnJvd3MubGVuZ3RoID4gMCkKLSAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHByb2Nlc3NGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NEZXRhaWxzU2luZ2xlSXRlbVRhYmxlKCJyZWdpc3RyeURldGFpbHNOYW1lIiwiPCU9VURESUFjdGlvbklucHV0cy5OQU1FX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1JFR0lTVFJZX05BTUUlPiIsZm9ybSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9VcGRhdGVSZWdpc3RyeUFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzRm9ybSh0aGlzKSI+Ci0gICAgICA8dGFibGUgaWQ9ImxvYWRTY3JlZW4iPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfTE9BRF9JTl9QUk9HUkVTUyIpJT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICAgIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgIFN0cmluZyB0aXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfUkVHSVNUUllfREVUQUlMUyIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVUQUlMU19FRElUQUJMRSIscmVnaXN0cnlOb2RlLmdldE5vZGVOYW1lKCkpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInJlZ2lzdHJ5RGV0YWlsc05hbWUiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FIikpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzU2luZ2xlSXRlbV90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lOUVVJUllfVVJMIiklPgotICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgIDwlPXJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgaWYgKFZhbGlkYXRvci52YWxpZGF0ZVVSTChwdWJsaXNoVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfVVJMIiklPgotICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgIDwlPXJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICB9Ci0gICAKLSAgIGlmIChjb250YWluc1VzZXJEZWZpbmVkQ2F0ZWdvcmllcykKLSAgIHsKLSAgICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInJlZ2lzdHJ5VXNlckRlZmluZWRDYXRlZ29yaWVzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3VkX2NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIH0KLSAgIGlmIChyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgIHsKLSU+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VTRVJJRCIpJT4KLSAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICA8JT1yZWdFbGVtZW50LmdldFVzZXJJZCgpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICB9Ci0gICAKLSAgIFN0cmluZyByZWdpc3RyYXRpb25VUkwgPSByZWdFbGVtZW50LmdldFJlZ2lzdHJhdGlvblVSTCgpOwotICAgaWYgKFZhbGlkYXRvci52YWxpZGF0ZVVSTChyZWdpc3RyYXRpb25VUkwpKQotICAgewotJT4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SRUdJU1RSWV9VUkwiLHJlZ2lzdHJhdGlvblVSTCklPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPCUKLSAgIH0KLSU+Ci08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPC9kaXY+ICAgICAgCi0gICAgPC9mb3JtPgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotICByZXN1bWVQcm94eUxvYWRQYWdlKCk7ICAKLTwvc2NyaXB0PiAgICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTA3ZDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGRpdiBpZD0iZmluZEJ1c2luZXNzZXNBZHZhbmNlZCI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzRmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0odGhpcykiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VUJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX0lOSVRJQVRFRCU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9RVUVSWV9JVEVNJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9IjkwJSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GSU5EX0FEVkFOQ0VEX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGhlaWdodD0zNSB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iaW5wdXRfZmluZF9idXNpbmVzc2VzX2FkdmFuY2Vfb3duZWQiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfT1dORUQlPiIgb25DbGljaz0idG9nZ2xlQWR2YW5jZWRBdXRoZW50aWNhdGlvblNlY3Rpb24oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPix0aGlzLmNoZWNrZWQpIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9maW5kX2J1c2luZXNzZXNfYWR2YW5jZV9vd25lZCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfT1dORUQiKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkTmFtZXMiKTsKLSAgIFN0cmluZ1tdIG5hbWVTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfTkFNRVMiLCJGT1JNX0xBQkVMX05BTUUiLEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMobmFtZVNwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZEJ1c2luZXNzZXNBZHZhbmNlZElkZW50aWZpZXJzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2lkZW50aWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIFN0cmluZ1tdIHNpU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFUyIsQm9vbGVhbi5GQUxTRS50b1N0cmluZygpLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMpLCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFU307Ci0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlcyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKHNpU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZEJ1c2luZXNzZXNBZHZhbmNlZERpc2NvdmVyeVVSTHMiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhuZXcgQm9vbGVhbihmYWxzZSkpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRGaW5kUXVhbGlmaWVycyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9maW5kUXVhbGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQ29tbW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2FkdmFuY2VkQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTE0ODM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxkaXYgaWQ9ImZpbmRCdXNpbmVzc2VzIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIG5hbWU9ImZpbmRCdXNpbmVzc2VzU3R5bGUiPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRUFSQ0hfVFlQRSIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19maW5kX2J1c2luZXNzX3NpbXBsZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMlPiIgb25DbGljaz0ic2hvd0ZpbmRGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUlPikiPjxsYWJlbCBmb3I9InJhZGlvX2ZpbmRfYnVzaW5lc3Nfc2ltcGxlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19TSU1QTEUiKSU+PC9sYWJlbD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19maW5kX2J1c2luZXNzX2FkdmFuY2UiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTJT4iIG9uQ2xpY2s9InNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQlPikiPjxsYWJlbCBmb3I9InJhZGlvX2ZpbmRfYnVzaW5lc3NfYWR2YW5jZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fQURWQU5DRUQiKSU+PC9sYWJlbD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19maW5kX2J1c2luZXNzX3V1aWQiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTJT4iIG9uQ2xpY2s9InNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfVVVJRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fZmluZF9idXNpbmVzc191dWlkIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19VVUlEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZm9ybT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZEJ1c2luZXNzVVVJRCIpOwotICAgU3RyaW5nW10gb3RoZXJQcm9wZXJ0aWVzID0geyJ1ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbkpTUC5qc3AiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVksIkZPUk1fTEFCRUxfRklORF9CVVNJTkVTU19VVUlEX0RFU0MifTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhvdGhlclByb3BlcnRpZXMpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kVVVJREZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdlMzRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIHNlbGVjdGVkTm9kZSBjb3VsZCBiZSB0aGUgcmVnaXN0cnkgb3IgcXVlcnkgbm9kZXMuCi0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSk7Ci0lPgotPGRpdiBpZD0iZmluZEJ1c2luZXNzZXNTaW1wbGUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVklPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NFU19TSU1QTEVfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X2ZpbmRfYnVzaW5lc3Nlc19zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X2ZpbmRfYnVzaW5lc3Nlc19zaW1wbGVfbmFtZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSU+IiBjbGFzcz0idGV4dGVudGVyIj4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViMWY5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzA4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTI3NDQzIGplc3BlckBzZWxza2FiZXQub3JnIC0gSmVzcGVyIFMgTW9sbGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgLy8gc2VsZWN0ZWROb2RlIGNvdWxkIGJlIHRoZSByZWdpc3RyeSBvciBxdWVyeSBub2Rlcy4KLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotJT4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgIHN1YlF1ZXJ5S2V5UHJvcGVydHkuc2V0U3ViUXVlcnlLZXkoc3ViUXVlcnlLZXkpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08JQotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIE5vZGUgcmVnTm9kZSA9IHVkZGlNYWluTm9kZS5nZXRSZWdpc3RyeU5vZGUoc2VsZWN0ZWROb2RlKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9SRUdJU1RSWV9GSU5EIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgc2VjdGlvbklkcyA9IFsiZmluZEJ1c2luZXNzZXMiLCJmaW5kU2VydmljZXMiLCJmaW5kU2VydmljZUludGVyZmFjZXMiXTsKLSAgdmFyIGZpbmRCdXNpbmVzc2VzU2VjdGlvbklkcyA9IFsiZmluZEJ1c2luZXNzZXNTaW1wbGUiLCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkIiwiZmluZEJ1c2luZXNzVVVJRCJdOwotICB2YXIgZmluZFNlcnZpY2VzU2VjdGlvbklkcyA9IFsiZmluZFNlcnZpY2VzU2ltcGxlIiwiZmluZFNlcnZpY2VzQWR2YW5jZWQiLCJmaW5kU2VydmljZVVVSUQiXTsKLSAgdmFyIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NlY3Rpb25JZHMgPSBbImZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZSIsImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkIiwiZmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEIl07Ci0gIHZhciBzdHlsZUZvcm1zID0gWyJmaW5kQnVzaW5lc3Nlc1N0eWxlIiwiZmluZFNlcnZpY2VzU3R5bGUiLCJmaW5kU2VydmljZUludGVyZmFjZXNTdHlsZSJdOwotICB2YXIgYXV0aGVudGljYXRpb25TZWN0aW9uSWRzID0gWyJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQXV0aGVudGljYXRpb24iLCJmaW5kU2VydmljZXNBZHZhbmNlZEF1dGhlbnRpY2F0aW9uIiwiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBdXRoZW50aWNhdGlvbiJdOwotCi0gIGZ1bmN0aW9uIHZhbGlkYXRlUXVlcnlOYW1lKCkKLSAgewotPCUKLSAgIFN0cmluZyBzdWJRdWVyeUtleVZhbHVlID0gc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpOwotICAgYm9vbGVhbiBpc1N1YlF1ZXJ5ID0gKHN1YlF1ZXJ5S2V5VmFsdWUgIT0gbnVsbCAmJiBzdWJRdWVyeUtleVZhbHVlLmxlbmd0aCgpID4gMCk7Ci0lPiAgIAotICAgIGlmICg8JT1pc1N1YlF1ZXJ5JT4pCi0gICAgewotICAgICAgLy8gU3VicXVlcmllcyBtdXN0IGhhdmUgYSBuYW1lIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoYXQgb2YgdGhlIGN1cnJlbnQgcXVlcnkgb3IgdGhlIGNsb3Nlc3QgcXVlcnkgZW5jbG9zaW5nIHRoaXMgb2JqZWN0LgotPCUKLSAgIFN0cmluZyBjdXJyZW50UXVlcnlOYW1lID0gIiI7Ci0gICBpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgUXVlcnlOb2RlKQotICAgICBjdXJyZW50UXVlcnlOYW1lID0gc2VsZWN0ZWROb2RlLmdldE5vZGVOYW1lKCk7Ci0gICBlbHNlIGlmIChzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBCdXNpbmVzc05vZGUpCi0gICB7Ci0gICAgIE5vZGUgcGFyZW50Tm9kZSA9IHNlbGVjdGVkTm9kZS5nZXRQYXJlbnQoKTsKLSAgICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBRdWVyeU5vZGUpCi0gICAgICAgY3VycmVudFF1ZXJ5TmFtZSA9IHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgIH0KLSU+ICAgIAotICAgICAgdmFyIHF1ZXJ5TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxdWVyeU5hbWUiKS52YWx1ZTsKLSAgICAgIGlmIChxdWVyeU5hbWUgPT0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjdXJyZW50UXVlcnlOYW1lKSU+IikKLSAgICAgIHsKLSAgICAgICAgYWxlcnQoIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUVVFUllfTkFNRV9DT05GTElDVCIpJT4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgZnVuY3Rpb24gcHJvY2Vzc0Zvcm0oZm9ybSkKLSAgewotICAgIGlmICghaGFuZGxlU3VibWl0KGZvcm0pKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghdmFsaWRhdGVRdWVyeU5hbWUoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4udmFsdWUgPSAiPCU9c3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpJT4iOwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FJT4udmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVlcnlOYW1lIikudmFsdWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0oZm9ybSkKLSAgewotICAgIGlmIChwcm9jZXNzRm9ybShmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkTmFtZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NOYW1lRmluZFF1YWxpZmllcnMoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWROYW1lcyIsZm9ybSk7Ci0gICAgICBwcm9jZXNzSWRlbnRpZmllclRhYmxlKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkSWRlbnRpZmllcnMiLGZvcm0pOwotICAgICAgcHJvY2Vzc0NhdGVnb3J5VGFibGUoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRDYXRlZ29yaWVzIixmb3JtLHRydWUpOwotICAgICAgcHJvY2Vzc1Jlc3VsdFRhYmxlKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkU2VydmljZUludGVyZmFjZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFX0lOVEVSRkFDRSU+Iixmb3JtLGZhbHNlKTsKLSAgICAgIHByb2Nlc3NEaXNjb3ZlcnlVUkxUYWJsZSgiZmluZEJ1c2luZXNzZXNBZHZhbmNlZERpc2NvdmVyeVVSTHMiLGZvcm0pOwotICAgICAgcHJvY2Vzc0ZpbmRRdWFsaWZpZXJUYWJsZSgiZmluZEJ1c2luZXNzZXNBZHZhbmNlZEZpbmRRdWFsaWZpZXJzIixmb3JtKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRmluZFNlcnZpY2VzQWR2YW5jZWRGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAocHJvY2Vzc0Zvcm0oZm9ybSkpCi0gICAgewotICAgICAgcHJvY2Vzc1Jlc3VsdFRhYmxlKCJmaW5kU2VydmljZXNBZHZhbmNlZEJ1c2luZXNzIiwiPCU9VURESUFjdGlvbklucHV0cy5OT0RFSURfQlVTSU5FU1MlPiIsZm9ybSxmYWxzZSk7Ci0gICAgICBwcm9jZXNzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJmaW5kU2VydmljZXNBZHZhbmNlZE5hbWVzIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUlPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzTmFtZUZpbmRRdWFsaWZpZXJzKCJmaW5kU2VydmljZXNBZHZhbmNlZE5hbWVzIixmb3JtKTsKLSAgICAgIHByb2Nlc3NDYXRlZ29yeVRhYmxlKCJmaW5kU2VydmljZXNBZHZhbmNlZENhdGVnb3JpZXMiLGZvcm0sZmFsc2UpOwotICAgICAgcHJvY2Vzc1Jlc3VsdFRhYmxlKCJmaW5kU2VydmljZXNBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VzIiwiPCU9VURESUFjdGlvbklucHV0cy5OT0RFSURfU0VSVklDRV9JTlRFUkZBQ0UlPiIsZm9ybSxmYWxzZSk7Ci0gICAgICBwcm9jZXNzRmluZFF1YWxpZmllclRhYmxlKCJmaW5kU2VydmljZXNBZHZhbmNlZEZpbmRRdWFsaWZpZXJzIixmb3JtKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAocHJvY2Vzc0Zvcm0oZm9ybSkpCi0gICAgewotICAgICAgcHJvY2Vzc1Jlc3VsdFRhYmxlKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZFNlcnZpY2UiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFJT4iLGZvcm0sZmFsc2UpOwotICAgICAgcHJvY2Vzc05hbWVGaW5kUXVhbGlmaWVycygiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWROYW1lIixmb3JtKTsKLSAgICAgIHByb2Nlc3NJZGVudGlmaWVyVGFibGUoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkSWRlbnRpZmllcnMiLGZvcm0pOwotICAgICAgcHJvY2Vzc0NhdGVnb3J5VGFibGUoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIsZm9ybSxmYWxzZSk7Ci0gICAgICBwcm9jZXNzRmluZFF1YWxpZmllclRhYmxlKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZpbmRRdWFsaWZpZXJzIixmb3JtKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLSAgICAvLyBTZXQgdGhlIHF1ZXJ5IG5hbWUKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVlcnlOYW1lIikudmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUpKSU+IjsKLSAgICB2YXIgc2VhcmNoRm9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlYXJjaEZvciIpOwotICAgIHNlYXJjaEZvci5zZWxlY3RlZEluZGV4ID0gPCU9Zm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0pJT47Ci0gICAgc2V0RGVmYXVsdHNGb3JGaW5kQnVzaW5lc3Nlc0Zvcm1zKCk7Ci0gICAgc2V0RGVmYXVsdHNGb3JGaW5kU2VydmljZXNGb3JtcygpOwotICAgIHNldERlZmF1bHRzRm9yRmluZFNlcnZpY2VJbnRlcmZhY2VzRm9ybXMoKTsKLSAgICBzaG93TWFpbkZvcm0oc2VhcmNoRm9yLnZhbHVlKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKGFkdmFuY2VkRm9ybSxxdWVyeUl0ZW1JbmRleCxpc093bmVkQ2hlY2tlZCkKLSAgewotPCUKLSAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0lPgotICAgIGFkdmFuY2VkRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEJT4uY2hlY2tlZCA9IGlzT3duZWRDaGVja2VkOwotICAgIGFkdmFuY2VkRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHB1Ymxpc2hVUkwpJT4iOwotICAgIGFkdmFuY2VkRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1c2VySWQpJT4iOwotICAgIGFkdmFuY2VkRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHBhc3N3b3JkKSU+IjsKLSAgICB0b2dnbGVBZHZhbmNlZEF1dGhlbnRpY2F0aW9uU2VjdGlvbihxdWVyeUl0ZW1JbmRleCxpc093bmVkQ2hlY2tlZCk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRBZHZhbmNlZENvbW1vblNlY3Rpb25EZWZhdWx0cyhmb3JtLG1heFNlYXJjaFNldCxtYXhSZXN1bHRzKQotICB7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9TRUFSQ0hfU0VUJT4udmFsdWUgPSBtYXhTZWFyY2hTZXQ7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9SRVNVTFRTJT4udmFsdWUgPSBtYXhSZXN1bHRzOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHNGb3JGaW5kQnVzaW5lc3Nlc0Zvcm1zKCkKLSAgewotICAgIC8vIEluaXRpYWxpemUgdGhlIGZpbmRCdXNpbmVzc2VzIGZvcm0uCi08JQotICAgU3RyaW5nIGZpbmRCdXNpbmVzc2VzU3R5bGVJbmRleCA9IChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1tzdHlsZUZvcm1zWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT5dXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMlPls8JT1maW5kQnVzaW5lc3Nlc1N0eWxlSW5kZXglPl0uY2hlY2tlZCA9IHRydWU7Ci0gICAgdmFyIGZpbmRCdXNpbmVzc2VzU2ltcGxlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbmRCdXNpbmVzc2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+XSk7Ci0gICAgdmFyIGZpbmRCdXNpbmVzc2VzU2ltcGxlRm9ybSA9IGZpbmRCdXNpbmVzc2VzU2ltcGxlU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgZmluZEJ1c2luZXNzZXNTaW1wbGVGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUpKSU+IjsKLQotICAgIC8vIEFkdmFuY2VkIGZvcm0gZGV0YWlscy4KLSAgICB2YXIgZmluZEJ1c2luZXNzZXNBZHZhbmNlZFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaW5kQnVzaW5lc3Nlc1NlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+XSk7Ci0gICAgdmFyIGZpbmRCdXNpbmVzc2VzQWR2YW5jZWRGb3JtID0gZmluZEJ1c2luZXNzZXNBZHZhbmNlZFNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHZhciBpc093bmVkQ2hlY2tlZCA9IDwlPShmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfT1dORUQpICE9IG51bGwpJT47Ci0gICAgc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMoZmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPixpc093bmVkQ2hlY2tlZCk7Ci08JQotICAgVmVjdG9yIGJ1c05hbWVWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyk7Ci0gICBpZiAoYnVzTmFtZVZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxidXNOYW1lVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlidXNOYW1lVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkTGFuZ3VhZ2VJbnB1dFJvdygiZmluZEJ1c2luZXNzZXNBZHZhbmNlZE5hbWVzIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFIikpJT4iKTsKLSAgICBzZXRMYW5ndWFnZUlucHV0Um93U2V0dGluZ3MoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWROYW1lcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRMYW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLQotICAgSWRlbnRpZmllckJhZyBidXNJZEJhZyA9IChJZGVudGlmaWVyQmFnKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyk7Ci0gICBpZiAoYnVzSWRCYWcgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGtleWVkUmVmZXJlbmNlVmVjdG9yID0gYnVzSWRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8a2V5ZWRSZWZlcmVuY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWtleWVkUmVmZXJlbmNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkSWRlbnRpZmllclJvdygiZmluZEJ1c2luZXNzZXNBZHZhbmNlZElkZW50aWZpZXJzIik7Ci0gICAgc2V0SWRlbnRpZmllclJvd1NldHRpbmdzKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkSWRlbnRpZmllcnMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0KLSAgIENhdGVnb3J5QmFnIGJ1c0NhdEJhZyA9IChDYXRlZ29yeUJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7Ci0gICBpZiAoYnVzQ2F0QmFnICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBrZXllZFJlZmVyZW5jZVZlY3RvciA9IGJ1c0NhdEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxrZXllZFJlZmVyZW5jZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2Upa2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRDYXRlZ29yeVJvdygiZmluZEJ1c2luZXNzZXNBZHZhbmNlZENhdGVnb3JpZXMiKTsKLSAgICBzZXRDYXRlZ29yeVJvd1NldHRpbmdzKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQ2F0ZWdvcmllcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0VE1vZGVsS2V5KCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5TmFtZSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleVZhbHVlKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLQotICAgVmVjdG9yIGJ1c1NlcnZpY2VJbnRlcmZhY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgIFZlY3RvciBidXNTZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSk7Ci0gICBpZiAoYnVzU2VydmljZUludGVyZmFjZXMgIT0gbnVsbCkKLSAgIHsKLSAgICAgaWYgKGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weSA9PSBudWxsKQotICAgICAgIGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZWxzZQotICAgICAgIGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weS5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICBmb3IgKGludCBpPTA7aTxidXNTZXJ2aWNlSW50ZXJmYWNlcy5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpYnVzU2VydmljZUludGVyZmFjZXMuZWxlbWVudEF0KGkpOwotICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0VG9vbElkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0VG9vbElkKCk7Ci0gICAgICAgaW50IHRhcmdldFZpZXdJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpOwotICAgICAgIFN0cmluZyB1cmwgPSBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCxzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVMsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTLGZhbHNlKTsKLSAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBidXNTZXJ2aWNlSW50ZXJmYWNlc0NvcHkuYWRkRWxlbWVudChidXNTZXJ2aWNlSW50ZXJmYWNlcy5lbGVtZW50QXQoaSkpOwotJT4KLSAgICBhZGRSZXN1bHRSb3coImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlcyIsPCU9dGFyZ2V0Tm9kZUlkJT4sIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHRNb2RlbC5nZXROYW1lU3RyaW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodE1vZGVsLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpKSU+Iik7Ci08JQotICAgICB9Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSxidXNTZXJ2aWNlSW50ZXJmYWNlc0NvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBidXNTZXJ2aWNlSW50ZXJmYWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgYnVzU2VydmljZUludGVyZmFjZXNDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfU0VSVklDRV9JTlRFUkZBQ0VTLGJ1c1NlcnZpY2VJbnRlcmZhY2VzKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZLGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weSk7Ci0gICB9Ci0KLSAgIERpc2NvdmVyeVVSTHMgYnVzRGlzY292ZXJ5VVJMcyA9IChEaXNjb3ZlcnlVUkxzKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLSAgIGlmIChidXNEaXNjb3ZlcnlVUkxzICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBkaXNjb3ZlcnlVUkxWZWN0b3IgPSBidXNEaXNjb3ZlcnlVUkxzLmdldERpc2NvdmVyeVVSTFZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxkaXNjb3ZlcnlVUkxWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIERpc2NvdmVyeVVSTCBkaXNjb3ZlcnlVUkwgPSAoRGlzY292ZXJ5VVJMKWRpc2NvdmVyeVVSTFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZERpc2NvdmVyeVVSTFJvdygiZmluZEJ1c2luZXNzZXNBZHZhbmNlZERpc2NvdmVyeVVSTHMiKTsKLSAgICBzZXREaXNjb3ZlcnlVUkxSb3dTZXR0aW5ncygiZmluZEJ1c2luZXNzZXNBZHZhbmNlZERpc2NvdmVyeVVSTHMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRpc2NvdmVyeVVSTC5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLQotICAgRmluZFF1YWxpZmllcnMgYnVzRmluZFF1YWxpZmllcnMgPSAoRmluZFF1YWxpZmllcnMpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0ZJTkRRVUFMSUZJRVJTKTsKLSAgIGlmIChidXNGaW5kUXVhbGlmaWVycyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3IgZmluZFF1YWxpZmllclZlY3RvciA9IGJ1c0ZpbmRRdWFsaWZpZXJzLmdldEZpbmRRdWFsaWZpZXJWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8ZmluZFF1YWxpZmllclZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgRmluZFF1YWxpZmllciBmaW5kUXVhbGlmaWVyID0gKEZpbmRRdWFsaWZpZXIpZmluZFF1YWxpZmllclZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIHNldEZpbmRRdWFsaWZpZXIoIjwlPUhUTUxVdGlscy5KU01hbmdsZShmaW5kUXVhbGlmaWVyLmdldFRleHQoKSklPiIsImZpbmRCdXNpbmVzc2VzQWR2YW5jZWROYW1lcyIsImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRDYXRlZ29yaWVzIiwiZmluZEJ1c2luZXNzZXNBZHZhbmNlZEZpbmRRdWFsaWZpZXJzIik7Ci08JQotICAgICB9Ci0gICB9Ci0lPgotICAgIHNldEFkdmFuY2VkQ29tbW9uU2VjdGlvbkRlZmF1bHRzKGZpbmRCdXNpbmVzc2VzQWR2YW5jZWRGb3JtLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1NFQVJDSF9TRVQpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9SRVNVTFRTKSklPiIpOwotCi0gICAgLy8gVVVJRCBmb3JtIGRldGFpbHMuCi0gICAgdmFyIGZpbmRCdXNpbmVzc2VzVVVJRFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaW5kQnVzaW5lc3Nlc1NlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9VVUlEJT5dKTsKLSAgICB2YXIgZmluZEJ1c2luZXNzZXNVVUlERm9ybSA9IGZpbmRCdXNpbmVzc2VzVVVJRFNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIGZpbmRCdXNpbmVzc2VzVVVJREZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0tFWSU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSkpJT4iOwotCi0gICAgc2hvd0ZpbmRGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT4sPCU9ZmluZEJ1c2luZXNzZXNTdHlsZUluZGV4JT4pOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHNGb3JGaW5kU2VydmljZXNGb3JtcygpCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBmaW5kU2VydmljZXMgZm9ybS4KLTwlCi0gICBTdHJpbmcgZmluZFNlcnZpY2VzU3R5bGVJbmRleCA9IChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTKTsKLSU+Ci0gICAgZG9jdW1lbnQuZm9ybXNbc3R5bGVGb3Jtc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPl1dLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMlPls8JT1maW5kU2VydmljZXNTdHlsZUluZGV4JT5dLmNoZWNrZWQgPSB0cnVlOwotICAgIHZhciBmaW5kU2VydmljZXNTaW1wbGVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZFNlcnZpY2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+XSk7Ci0gICAgdmFyIGZpbmRTZXJ2aWNlc1NpbXBsZUZvcm0gPSBmaW5kU2VydmljZXNTaW1wbGVTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBmaW5kU2VydmljZXNTaW1wbGVGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FKSklPiI7Ci0KLSAgICAvLyBBZHZhbmNlZCBmb3JtIGRldGFpbHMuCi0gICAgdmFyIGZpbmRTZXJ2aWNlc0FkdmFuY2VkU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbmRTZXJ2aWNlc1NlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+XSk7Ci0gICAgdmFyIGZpbmRTZXJ2aWNlc0FkdmFuY2VkRm9ybSA9IGZpbmRTZXJ2aWNlc0FkdmFuY2VkU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgdmFyIGlzT3duZWRDaGVja2VkID0gPCU9KGZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX09XTkVEKSAhPSBudWxsKSU+OwotICAgIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKGZpbmRTZXJ2aWNlc0FkdmFuY2VkRm9ybSw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPixpc093bmVkQ2hlY2tlZCk7Ci08JQotICAgVmVjdG9yIHNlcnZpY2VCdXNpbmVzcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1MpOwotICAgVmVjdG9yIHNlcnZpY2VCdXNpbmVzc0NvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTX0NPUFkpOwotICAgaWYgKHNlcnZpY2VCdXNpbmVzcyAhPSBudWxsKQotICAgewotICAgICBpZiAoc2VydmljZUJ1c2luZXNzQ29weSA9PSBudWxsKQotICAgICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGVsc2UKLSAgICAgICBzZXJ2aWNlQnVzaW5lc3NDb3B5LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VCdXNpbmVzcy5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZUJ1c2luZXNzLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyxpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTLGZhbHNlKTsKLSAgICAgICBCdXNpbmVzc0VudGl0eSBiZSA9IChCdXNpbmVzc0VudGl0eSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBzZXJ2aWNlQnVzaW5lc3NDb3B5LmFkZEVsZW1lbnQoc2VydmljZUJ1c2luZXNzLmVsZW1lbnRBdChpKSk7Ci0lPgotICAgIGFkZFJlc3VsdFJvdygiZmluZFNlcnZpY2VzQWR2YW5jZWRCdXNpbmVzcyIsPCU9dGFyZ2V0Tm9kZUlkJT4sIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGJlLmdldERlZmF1bHROYW1lU3RyaW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoYmUuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSxzZXJ2aWNlQnVzaW5lc3NDb3B5KTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgc2VydmljZUJ1c2luZXNzID0gbmV3IFZlY3RvcigpOwotICAgICBzZXJ2aWNlQnVzaW5lc3NDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyxzZXJ2aWNlQnVzaW5lc3MpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU19DT1BZLHNlcnZpY2VCdXNpbmVzc0NvcHkpOwotICAgfQotCi0gICBWZWN0b3Igc2VydmljZU5hbWVWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgIGlmIChzZXJ2aWNlTmFtZVZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlTmFtZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTmFtZSBuYW1lID0gKE5hbWUpc2VydmljZU5hbWVWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRMYW5ndWFnZUlucHV0Um93KCJmaW5kU2VydmljZXNBZHZhbmNlZE5hbWVzIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFIikpJT4iKTsKLSAgICBzZXRMYW5ndWFnZUlucHV0Um93U2V0dGluZ3MoImZpbmRTZXJ2aWNlc0FkdmFuY2VkTmFtZXMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUuZ2V0TGFuZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUuZ2V0VGV4dCgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0KLSAgIENhdGVnb3J5QmFnIHNlcnZpY2VDYXRCYWcgPSAoQ2F0ZWdvcnlCYWcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0gICBpZiAoc2VydmljZUNhdEJhZyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBzZXJ2aWNlQ2F0QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGtleWVkUmVmZXJlbmNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlrZXllZFJlZmVyZW5jZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZENhdGVnb3J5Um93KCJmaW5kU2VydmljZXNBZHZhbmNlZENhdGVnb3JpZXMiKTsKLSAgICBzZXRDYXRlZ29yeVJvd1NldHRpbmdzKCJmaW5kU2VydmljZXNBZHZhbmNlZENhdGVnb3JpZXMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0KLSAgIFZlY3RvciBzZXJ2aWNlU2VydmljZUludGVyZmFjZXMgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICBWZWN0b3Igc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFkpOwotICAgaWYgKHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcyAhPSBudWxsKQotICAgewotICAgICBpZiAoc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzQ29weSA9PSBudWxsKQotICAgICAgIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGVsc2UKLSAgICAgICBzZXJ2aWNlU2VydmljZUludGVyZmFjZXNDb3B5LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcy5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTLGZhbHNlKTsKLSAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBzZXJ2aWNlU2VydmljZUludGVyZmFjZXNDb3B5LmFkZEVsZW1lbnQoc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzLmVsZW1lbnRBdChpKSk7Ci0lPgotICAgIGFkZFJlc3VsdFJvdygiZmluZFNlcnZpY2VzQWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlcyIsPCU9dGFyZ2V0Tm9kZUlkJT4sIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHRNb2RlbC5nZXROYW1lU3RyaW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodE1vZGVsLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpKSU+Iik7Ci08JQotICAgICB9Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZLHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBzZXJ2aWNlU2VydmljZUludGVyZmFjZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyxzZXJ2aWNlU2VydmljZUludGVyZmFjZXMpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSxzZXJ2aWNlU2VydmljZUludGVyZmFjZXNDb3B5KTsKLSAgIH0KLQotICAgRmluZFF1YWxpZmllcnMgc2VydmljZUZpbmRRdWFsaWZpZXJzID0gKEZpbmRRdWFsaWZpZXJzKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0ZJTkRRVUFMSUZJRVJTKTsKLSAgIGlmIChzZXJ2aWNlRmluZFF1YWxpZmllcnMgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGZpbmRRdWFsaWZpZXJWZWN0b3IgPSBzZXJ2aWNlRmluZFF1YWxpZmllcnMuZ2V0RmluZFF1YWxpZmllclZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxmaW5kUXVhbGlmaWVyVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBGaW5kUXVhbGlmaWVyIGZpbmRRdWFsaWZpZXIgPSAoRmluZFF1YWxpZmllcilmaW5kUXVhbGlmaWVyVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgc2V0RmluZFF1YWxpZmllcigiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGZpbmRRdWFsaWZpZXIuZ2V0VGV4dCgpKSU+IiwiZmluZFNlcnZpY2VzQWR2YW5jZWROYW1lcyIsImZpbmRTZXJ2aWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIsImZpbmRTZXJ2aWNlc0FkdmFuY2VkRmluZFF1YWxpZmllcnMiKTsKLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci0gICAgc2V0QWR2YW5jZWRDb21tb25TZWN0aW9uRGVmYXVsdHMoZmluZFNlcnZpY2VzQWR2YW5jZWRGb3JtLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfU0VBUkNIX1NFVCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfUkVTVUxUUykpJT4iKTsKLQotICAgIC8vIFVVSUQgZm9ybSBkZXRhaWxzLgotICAgIHZhciBmaW5kU2VydmljZXNVVUlEU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbmRTZXJ2aWNlc1NlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9VVUlEJT5dKTsKLSAgICB2YXIgZmluZFNlcnZpY2VzVVVJREZvcm0gPSBmaW5kU2VydmljZXNVVUlEU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgZmluZFNlcnZpY2VzVVVJREZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0tFWSU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZKSklPiI7Ci0KLSAgICBzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT4sPCU9ZmluZFNlcnZpY2VzU3R5bGVJbmRleCU+KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldERlZmF1bHRzRm9yRmluZFNlcnZpY2VJbnRlcmZhY2VzRm9ybXMoKQotICB7Ci0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmluZFNlcnZpY2VJbnRlcmZhY2VzIGZvcm0uCi08JQotICAgU3RyaW5nIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1N0eWxlSW5kZXggPSAoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1tzdHlsZUZvcm1zWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPl1dLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTJT5bPCU9ZmluZFNlcnZpY2VJbnRlcmZhY2VzU3R5bGVJbmRleCU+XS5jaGVja2VkID0gdHJ1ZTsKLSAgICB2YXIgZmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUlPl0pOwotICAgIHZhciBmaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVGb3JtID0gZmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgZmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKSklPiI7Ci0KLSAgICAvLyBBZHZhbmNlZCBmb3JtIGRldGFpbHMuCi0gICAgdmFyIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+XSk7Ci0gICAgdmFyIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRm9ybSA9IGZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0KLSAgICB2YXIgaXNPd25lZENoZWNrZWQgPSA8JT0oZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX09XTkVEKSAhPSBudWxsKSU+OwotICAgIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKGZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRm9ybSw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4saXNPd25lZENoZWNrZWQpOwotICAgIHZhciBpc1VzZVNlcnZpY2VDaGVja2VkID0gPCU9KGZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9VU0VfU0VSVklDRSkgIT0gbnVsbCklPjsKLSAgICBmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9VU0VfU0VSVklDRSU+LmNoZWNrZWQgPSBpc1VzZVNlcnZpY2VDaGVja2VkOwotICAgIHRvZ2dsZUZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VydmljZVBhcmFtZXRlcnMoZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtKTsKLSAgICBmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpKSU+IjsKLQotPCUKLSAgIFZlY3RvciBzaVNlcnZpY2UgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFKTsKLSAgIFZlY3RvciBzaVNlcnZpY2VDb3B5ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRV9DT1BZKTsKLSAgIGlmIChzaVNlcnZpY2UgIT0gbnVsbCkKLSAgIHsKLSAgICAgaWYgKHNpU2VydmljZUNvcHkgPT0gbnVsbCkKLSAgICAgICBzaVNlcnZpY2VDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBlbHNlCi0gICAgICAgc2lTZXJ2aWNlQ29weS5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICBmb3IgKGludCBpPTA7aTxzaVNlcnZpY2Uuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNpU2VydmljZS5lbGVtZW50QXQoaSk7Ci0gICAgICAgaW50IHRhcmdldE5vZGVJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpOwotICAgICAgIGludCB0YXJnZXRUb29sSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRUb29sSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0Vmlld0lkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCk7Ci0gICAgICAgU3RyaW5nIHVybCA9IFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHRhcmdldE5vZGVJZCx0YXJnZXRUb29sSWQsdGFyZ2V0Vmlld0lkLHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0UsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMsZmFsc2UpOwotICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgc2lTZXJ2aWNlQ29weS5hZGRFbGVtZW50KHNpU2VydmljZS5lbGVtZW50QXQoaSkpOwotJT4KLSAgICBhZGRSZXN1bHRSb3coImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VydmljZSIsPCU9dGFyZ2V0Tm9kZUlkJT4sIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGJzLmdldERlZmF1bHROYW1lU3RyaW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoYnMuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0VfQ09QWSxzaVNlcnZpY2VDb3B5KTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgc2lTZXJ2aWNlID0gbmV3IFZlY3RvcigpOwotICAgICBzaVNlcnZpY2VDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRSxzaVNlcnZpY2UpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRV9DT1BZLHNpU2VydmljZUNvcHkpOwotICAgfQotCi0gICBJZGVudGlmaWVyQmFnIHNpSWRCYWcgPSAoSWRlbnRpZmllckJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMpOwotICAgaWYgKHNpSWRCYWcgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGtleWVkUmVmZXJlbmNlVmVjdG9yID0gc2lJZEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxrZXllZFJlZmVyZW5jZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2Upa2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRJZGVudGlmaWVyUm93KCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZElkZW50aWZpZXJzIik7Ci0gICAgc2V0SWRlbnRpZmllclJvd1NldHRpbmdzKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZElkZW50aWZpZXJzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotCi0gICBDYXRlZ29yeUJhZyBzaUNhdEJhZyA9IChDYXRlZ29yeUJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyk7Ci0gICBpZiAoc2lDYXRCYWcgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGtleWVkUmVmZXJlbmNlVmVjdG9yID0gc2lDYXRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8a2V5ZWRSZWZlcmVuY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWtleWVkUmVmZXJlbmNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkQ2F0ZWdvcnlSb3coImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIpOwotICAgIHNldENhdGVnb3J5Um93U2V0dGluZ3MoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0VE1vZGVsS2V5KCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5TmFtZSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleVZhbHVlKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLQotICAgRmluZFF1YWxpZmllcnMgc2lGaW5kUXVhbGlmaWVycyA9IChGaW5kUXVhbGlmaWVycylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfRklORFFVQUxJRklFUlMpOwotICAgaWYgKHNpRmluZFF1YWxpZmllcnMgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGZpbmRRdWFsaWZpZXJWZWN0b3IgPSBzaUZpbmRRdWFsaWZpZXJzLmdldEZpbmRRdWFsaWZpZXJWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8ZmluZFF1YWxpZmllclZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgRmluZFF1YWxpZmllciBmaW5kUXVhbGlmaWVyID0gKEZpbmRRdWFsaWZpZXIpZmluZFF1YWxpZmllclZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIHNldEZpbmRRdWFsaWZpZXIoIjwlPUhUTUxVdGlscy5KU01hbmdsZShmaW5kUXVhbGlmaWVyLmdldFRleHQoKSklPiIsImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkTmFtZSIsImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIsImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRmluZFF1YWxpZmllcnMiKTsKLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci0gICAgc2V0QWR2YW5jZWRDb21tb25TZWN0aW9uRGVmYXVsdHMoZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1NFQVJDSF9TRVQpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9SRVNVTFRTKSklPiIpOwotCi0gICAgLy8gVVVJRCBmb3JtIGRldGFpbHMuCi0gICAgdmFyIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1VVSURTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZFNlcnZpY2VJbnRlcmZhY2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1VVSUQlPl0pOwotICAgIHZhciBmaW5kU2VydmljZUludGVyZmFjZXNVVUlERm9ybSA9IGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1VVSURTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBmaW5kU2VydmljZUludGVyZmFjZXNVVUlERm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfS0VZJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZKSklPiI7Ci0KLSAgICBzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+LDwlPWZpbmRTZXJ2aWNlSW50ZXJmYWNlc1N0eWxlSW5kZXglPik7Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93TWFpbkZvcm0oc2VhcmNoRm9yVmFsdWVTdHJpbmcpCi0gIHsKLSAgICBjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKTsKLSAgICB2YXIgcXVlcnlJbmZvSXRlbUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVlcnlJbmZvSXRlbUxpc3QiKTsKLSAgICB2YXIgc2VhcmNoRm9ySW5kZXggPSBwYXJzZUludChzZWFyY2hGb3JWYWx1ZVN0cmluZyk7Ci0gICAgZm9yICh2YXIgaT0wO2k8c2VjdGlvbklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChpID09IHNlYXJjaEZvckluZGV4KQotICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWN0aW9uSWRzW2ldKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgICBlbHNlCi0gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlY3Rpb25JZHNbaV0pLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgfQotPCUKLSAgIGlmIChzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkubGVuZ3RoKCkgPCAxKQotICAgewotJT4KLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVlcnlJbmZvSXRlbUxpc3QiKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci08JQotICAgfQotJT4KLSAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICBpZiAobG9hZFNjcmVlblRhYmxlLnJvd3MubGVuZ3RoID4gMCkKLSAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93RmluZEZvcm0ocXVlcnlJdGVtSW5kZXgsc3R5bGUpCi0gIHsKLSAgICBjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKTsKLSAgICB2YXIgZmluZFNlY3Rpb25JZHM7Ci0gICAgc3dpdGNoIChxdWVyeUl0ZW1JbmRleCkKLSAgICB7Ci0gICAgICBjYXNlIDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT46Ci0gICAgICAgIGZpbmRTZWN0aW9uSWRzID0gZmluZEJ1c2luZXNzZXNTZWN0aW9uSWRzOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT46Ci0gICAgICAgIGZpbmRTZWN0aW9uSWRzID0gZmluZFNlcnZpY2VzU2VjdGlvbklkczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPjoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZpbmRTZWN0aW9uSWRzID0gZmluZFNlcnZpY2VJbnRlcmZhY2VzU2VjdGlvbklkczsKLSAgICB9Ci0gICAgZm9yICh2YXIgaT0wO2k8ZmluZFNlY3Rpb25JZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAoaSA9PSBzdHlsZSkKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZFNlY3Rpb25JZHNbaV0pLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIGVsc2UKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZFNlY3Rpb25JZHNbaV0pLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gdG9nZ2xlQWR2YW5jZWRBdXRoZW50aWNhdGlvblNlY3Rpb24ocXVlcnlJdGVtSW5kZXgsaXNDaGVja2VkKQotICB7Ci0gICAgaWYgKGlzQ2hlY2tlZCAmJiA8JT0hcmVnRWxlbWVudC5pc0xvZ2dlZEluKCklPikKLSAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGF1dGhlbnRpY2F0aW9uU2VjdGlvbklkc1txdWVyeUl0ZW1JbmRleF0pLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICBlbHNlCi0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhdXRoZW50aWNhdGlvblNlY3Rpb25JZHNbcXVlcnlJdGVtSW5kZXhdKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICB9Ci0KLSAgZnVuY3Rpb24gdG9nZ2xlRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZXJ2aWNlUGFyYW1ldGVycyhmb3JtKQotICB7Ci0gICAgdmFyIGlzVXNlU2VydmljZUNoZWNrZWQgPSBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfVVNFX1NFUlZJQ0UlPi5jaGVja2VkOwotICAgIHZhciBpc093bmVkQ2hlY2tlZCA9IGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9PV05FRCU+LmNoZWNrZWQ7Ci0gICAgaWYgKGlzVXNlU2VydmljZUNoZWNrZWQpCi0gICAgewotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VydmljZVNlY3Rpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRPd25lZCIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICB0b2dnbGVBZHZhbmNlZEF1dGhlbnRpY2F0aW9uU2VjdGlvbig8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4sZmFsc2UpOwotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkTmFtZUZpbmRRdWFsaWZpZXJzU2VjdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGaW5kUXVhbGlmaWVyc1NlY3Rpb24iKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VydmljZVNlY3Rpb24iKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkT3duZWQiKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgICB0b2dnbGVBZHZhbmNlZEF1dGhlbnRpY2F0aW9uU2VjdGlvbig8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4saXNPd25lZENoZWNrZWQpOwotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkTmFtZUZpbmRRdWFsaWZpZXJzU2VjdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZpbmRRdWFsaWZpZXJzU2VjdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICB9Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iIG9uVW5sb2FkPSJjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKSI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAidWRkaS9pbWFnZXMvZmluZF9oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlOwotICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpOwotICAgaWYgKHN1YlF1ZXJ5S2V5ICE9IG51bGwgJiYgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPiAwKQotICAgewotICAgICBpbnQgcXVlcnlJdGVtID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNKSk7Ci0gICAgIHN3aXRjaCAocXVlcnlJdGVtKQotICAgICB7Ci0gICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVUJRVUVSWSIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTRVMiKSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICAgIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVUJRVUVSWSIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VTIikpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICB0aXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1VCUVVFUlkiLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVMiKSk7Ci0gICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgICAgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZJTkQiKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9mb3Jtcy9maW5kZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICA8bGFiZWwgZm9yPSJxdWVyeU5hbWUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1FVRVJZX05BTUUiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4gPGlucHV0IGlkPSJxdWVyeU5hbWUiIHR5cGU9InRleHQiIHZhbHVlPSI8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJERUZBVUxUX1FVRVJZX05BTUUiKSklPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgICAgPGRpdiBpZD0icXVlcnlJbmZvSXRlbUxpc3QiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgdmFsaWduPSJtaWRkbGUiIG5vd3JhcCBoZWlnaHQ9NDA+Ci0gICAgICAgICAgICAgIDxsYWJlbCBmb3I9InNlYXJjaEZvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0VBUkNIX0ZPUiIpJT48L2xhYmVsPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgbm93cmFwIGhlaWdodD00MD4KLSAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ic2VhcmNoRm9yIiBvbkNoYW5nZT0ic2hvd01haW5Gb3JtKHRoaXMudmFsdWUpIiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTRVMiKSU+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFUyIpJT4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVMiKSU+Ci0gICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCB3aWR0aD0iOTAlIiBoZWlnaHQ9NDA+Jm5ic3A7PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgc2V0RGVmYXVsdHMoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiYWQyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIHNlbGVjdGVkTm9kZSBjb3VsZCBiZSB0aGUgcmVnaXN0cnkgb3IgcXVlcnkgbm9kZXMuCi0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSk7Ci0lPgotPGRpdiBpZD0iZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWQiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtKHRoaXMpIj4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCU+Ij4gICAgCi0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfSU5JVElBVEVEJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0lPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iPiA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GSU5EX0FEVkFOQ0VEX0RFU0MiKSU+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJpbnB1dF9maW5kX3NlcnZpY2VfaW50ZXJmYWNlX2FkdmFuY2VfdXNlX3NlcnZpY2UiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfVVNFX1NFUlZJQ0UlPiIgb25DbGljaz0idG9nZ2xlRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZXJ2aWNlUGFyYW1ldGVycyh0aGlzLmZvcm0pIj48bGFiZWwgZm9yPSJpbnB1dF9maW5kX3NlcnZpY2VfaW50ZXJmYWNlX2FkdmFuY2VfdXNlX3NlcnZpY2UiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VTRV9TRVJWSUNFIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgU3RyaW5nW10gc2VydmljZVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9TRVJWSUNFIixCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCksU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSwiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWQiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VydmljZSIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKHNlcnZpY2VTcGVjaWZpY0luZm8pOwotJT4KLTxkaXYgaWQ9ImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VydmljZVNlY3Rpb24iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgotICAgIDxkaXYgaWQ9ImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkT3duZWQiPgotICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9MzUgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iaW5wdXRfZmluZF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlX293bmVkIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEJT4iIG9uQ2xpY2s9InRvZ2dsZUFkdmFuY2VkQXV0aGVudGljYXRpb25TZWN0aW9uKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPix0aGlzLmNoZWNrZWQpIj4KLSAgICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X2ZpbmRfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZV9vd25lZCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfT1dORUQiKSU+PC9sYWJlbD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L2Rpdj4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDxkaXYgaWQ9ImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkTmFtZSI+Ci0gICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9maW5kX3NlcnZpY2VfaW50ZXJmYWNlX2FkdmFuY2VkX25hbWUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X2ZpbmRfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZWRfbmFtZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotPGRpdiBpZD0iZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWROYW1lRmluZFF1YWxpZmllcnNTZWN0aW9uIj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9uYW1lc19maW5kUXVhbGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Rpdj4KLSAgICA8L2Rpdj4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkSWRlbnRpZmllcnMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvaWRlbnRpZmllcnNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGaW5kUXVhbGlmaWVycyIpOwotJT4KLTxkaXYgaWQ9ImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRmluZFF1YWxpZmllcnNTZWN0aW9uIj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9maW5kUXVhbGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Rpdj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hZHZhbmNlZENvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0Zvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWVkOWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08ZGl2IGlkPSJmaW5kU2VydmljZUludGVyZmFjZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gbmFtZT0iZmluZFNlcnZpY2VJbnRlcmZhY2VzU3R5bGUiPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPiA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRUFSQ0hfVFlQRSIpJT4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19maW5kX3NlcnZpY2VfaW50ZXJmYWNlX3NpbXBsZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMlPiIgb25DbGljaz0ic2hvd0ZpbmRGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+KSI+PGxhYmVsIGZvcj0icmFkaW9fZmluZF9zZXJ2aWNlX2ludGVyZmFjZV9zaW1wbGUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX1NJTVBMRSIpJT48L2xhYmVsPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9InJhZGlvX2ZpbmRfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMlPiIgb25DbGljaz0ic2hvd0ZpbmRGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEJT4pIj48bGFiZWwgZm9yPSJyYWRpb19maW5kX3NlcnZpY2VfaW50ZXJmYWNlX2FkdmFuY2UiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX0FEVkFOQ0VEIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fZmluZF9zZXJ2aWNlX2ludGVyZmFjZV91dWlkIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyU+IiBvbkNsaWNrPSJzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfVVVJRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fZmluZF9zZXJ2aWNlX2ludGVyZmFjZV91dWlkIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19VVUlEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZm9ybT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZUludGVyZmFjZVVVSUQiKTsKLSAgIFN0cmluZ1tdIG90aGVyUHJvcGVydGllcyA9IHsidWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbkpTUC5qc3AiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVksIkZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRV9VVUlEX0RFU0MifTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhvdGhlclByb3BlcnRpZXMpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kVVVJREZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTkzNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZUZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIHNlbGVjdGVkTm9kZSBjb3VsZCBiZSB0aGUgcmVnaXN0cnkgb3IgcXVlcnkgbm9kZXMuCi0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSk7Ci0lPgotPGRpdiBpZD0iZmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIHByb2Nlc3NGb3JtKHRoaXMpIj4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUlPiI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRVNfU0lNUExFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9maW5kX3NlcnZpY2VfaW50ZXJmYWNlc19zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X2ZpbmRfc2VydmljZV9pbnRlcmZhY2VzX3NpbXBsZV9uYW1lIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNBZHZhbmNlZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTc2YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGRpdiBpZD0iZmluZFNlcnZpY2VzQWR2YW5jZWQiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIHByb2Nlc3NGaW5kU2VydmljZXNBZHZhbmNlZEZvcm0odGhpcykiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VUJT4iPiAgICAKLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUlPiI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRklORF9BRFZBTkNFRF9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9MzUgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImlucHV0X2ZpbmRfc2VydmljZXNfYWR2YW5jZV9vd25lZCIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9PV05FRCU+IiBvbkNsaWNrPSJ0b2dnbGVBZHZhbmNlZEF1dGhlbnRpY2F0aW9uU2VjdGlvbig8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPix0aGlzLmNoZWNrZWQpIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9maW5kX3NlcnZpY2VzX2FkdmFuY2Vfb3duZWQiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX09XTkVEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZXNBZHZhbmNlZEF1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBTdHJpbmdbXSBidXNTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfQlVTSU5FU1MiLEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyksImZpbmRTZXJ2aWNlc0FkdmFuY2VkIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1N9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZXNBZHZhbmNlZEJ1c2luZXNzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoYnVzU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VzQWR2YW5jZWROYW1lcyIpOwotICAgU3RyaW5nW10gbmFtZVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9OQU1FUyIsIkZPUk1fTEFCRUxfTkFNRSIsQm9vbGVhbi5GQUxTRS50b1N0cmluZygpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhuYW1lU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZXNBZHZhbmNlZENhdGVnb3JpZXMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvY2F0ZWdvcmllc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgU3RyaW5nW10gc2lTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VTIixCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCksU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyksImZpbmRTZXJ2aWNlc0FkdmFuY2VkIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VzQWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlcyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKHNpU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VzQWR2YW5jZWRGaW5kUXVhbGlmaWVycyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9maW5kUXVhbGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYWR2YW5jZWRDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0ZjM5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGRpdiBpZD0iZmluZFNlcnZpY2VzIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIG5hbWU9ImZpbmRTZXJ2aWNlc1N0eWxlIj4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0VBUkNIX1RZUEUiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fZmluZF9zZXJ2aWNlX3NpbXBsZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTJT4iIG9uQ2xpY2s9InNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+KSI+PGxhYmVsIGZvcj0icmFkaW9fZmluZF9zZXJ2aWNlX3NpbXBsZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU0lNUExFIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fZmluZF9zZXJ2aWNlX2FkdmFuY2UiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyU+IiBvbkNsaWNrPSJzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fZmluZF9zZXJ2aWNlX2FkdmFuY2UiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX0FEVkFOQ0VEIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fZmluZF9zZXJ2aWNlX3V1aWQiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyU+IiBvbkNsaWNrPSJzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9VVUlEJT4pIj48bGFiZWwgZm9yPSJyYWRpb19maW5kX3NlcnZpY2VfdXVpZCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fVVVJRCIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Zvcm0+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VzU2ltcGxlRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VVVUlEIik7Ci0gICBTdHJpbmdbXSBvdGhlclByb3BlcnRpZXMgPSB7InVkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZVVVSURBY3Rpb25KU1AuanNwIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVksIkZPUk1fTEFCRUxfRklORF9TRVJWSUNFX1VVSURfREVTQyJ9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG90aGVyUHJvcGVydGllcyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ0ZpbmRVVUlERm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNTaW1wbGVGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNTaW1wbGVGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiNzI4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VzU2ltcGxlRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgLy8gc2VsZWN0ZWROb2RlIGNvdWxkIGJlIHRoZSByZWdpc3RyeSBvciBxdWVyeSBub2Rlcy4KLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJmaW5kU2VydmljZXNTaW1wbGUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VTX1NJTVBMRV9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfZmluZF9zZXJ2aWNlc19zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfZmluZF9zZXJ2aWNlc19zaW1wbGVfbmFtZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kVVVJREZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRVVUlERm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzlkYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRVVUlERm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIHNlbGVjdGVkTm9kZSBjb3VsZCBiZSB0aGUgcmVnaXN0cnkgb3IgcXVlcnkgbm9kZXMuCi0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSk7Ci0gICAKLSAgIFN0cmluZyBmb3JtQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nW10gb3RoZXJQcm9wZXJ0aWVzID0gKFN0cmluZ1tdKShzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKSk7Ci0gICBTdHJpbmcgYWN0aW9uTGluayA9IChTdHJpbmcpb3RoZXJQcm9wZXJ0aWVzWzBdOwotICAgU3RyaW5nIHV1aWRFbnRyeUtleSA9IChTdHJpbmcpb3RoZXJQcm9wZXJ0aWVzWzFdOwotICAgU3RyaW5nIGRlc2NyaXB0aW9uS2V5ID0gKFN0cmluZylvdGhlclByb3BlcnRpZXNbMl07Ci0lPgotPGRpdiBpZD0iPCU9Zm9ybUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uTGluaykpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZShkZXNjcmlwdGlvbktleSklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iPCU9KGZvcm1Db250YWluZXJJZCsiX2lucHV0X3V1aWRfa2V5IiklPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVVVJRF9LRVkiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKHV1aWRFbnRyeUtleSkpCi0gICB7Ci0lPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IjwlPShmb3JtQ29udGFpbmVySWQrIl9pbnB1dF91dWlkX2tleSIpJT4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9LRVklPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlMWE5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRm9ybSh0aGlzKSI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUFVCTElTSF9CVVNJTkVTU19BRFZBTkNFRF9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaEJ1c2luZXNzQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZE5hbWVzIik7Ci0gICBTdHJpbmdbXSBuYW1lU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX05BTUVTIiwiRk9STV9MQUJFTF9OQU1FIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUykpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhuYW1lU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoZGVzY1NwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaEJ1c2luZXNzQWR2YW5jZWRJZGVudGlmaWVycyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9pZGVudGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZENhdGVnb3JpZXMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvY2F0ZWdvcmllc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERpc2NvdmVyeVVSTHMiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhuZXcgQm9vbGVhbighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKSkpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4gICAKLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjMwYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hCdXNpbmVzc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hCdXNpbmVzcyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBuYW1lPSJwdWJsaXNoQnVzaW5lc3NTdHlsZSI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfRk9STSIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19wdWJsaXNoX2J1c2luZXNzX3NpbXBsZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMlPiIgb25DbGljaz0ic2hvd1B1Ymxpc2hGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUlPikiPjxsYWJlbCBmb3I9InJhZGlvX3B1Ymxpc2hfYnVzaW5lc3Nfc2ltcGxlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19TSU1QTEUiKSU+PC9sYWJlbD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19wdWJsaXNoX2J1c2luZXNzX2FkdmFuY2UiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTJT4iIG9uQ2xpY2s9InNob3dQdWJsaXNoRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQlPikiPjxsYWJlbCBmb3I9InJhZGlvX3B1Ymxpc2hfYnVzaW5lc3NfYWR2YW5jZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fQURWQU5DRUQiKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9mb3JtPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxOTNkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJwdWJsaXNoQnVzaW5lc3NTaW1wbGUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gaGFuZGxlU3VibWl0KHRoaXMpIj4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX1NJTVBMRV9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaEJ1c2luZXNzU2ltcGxlQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfYnVzaW5lc3Nfc2ltcGxlX25hbWUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4gPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9wdWJsaXNoX2J1c2luZXNzX3NpbXBsZV9uYW1lIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfYnVzaW5lc3Nfc2ltcGxlX2Rlc2MiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9idXNpbmVzc19zaW1wbGVfZGVzYyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfREVTQ1JJUFRJT04lPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZjFjMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIHNlbGVjdGVkTm9kZSBtdXN0IGJlIGEgcmVnaXN0cnkgbm9kZS4KLSAgIE5vZGUgcmVnTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkocmVnTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0lPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgc3ViUXVlcnlLZXlQcm9wZXJ0eS5zZXRTdWJRdWVyeUtleShzdWJRdWVyeUtleSk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTwlCi0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9SRUdJU1RSWV9QVUJMSVNIIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXRhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIHNlY3Rpb25JZHMgPSBbInB1Ymxpc2hCdXNpbmVzcyIsInB1Ymxpc2hTZXJ2aWNlIiwicHVibGlzaFNlcnZpY2VJbnRlcmZhY2UiXTsKLSAgdmFyIHB1Ymxpc2hCdXNpbmVzc1NlY3Rpb25JZHMgPSBbInB1Ymxpc2hCdXNpbmVzc1NpbXBsZSIsInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkIl07Ci0gIHZhciBwdWJsaXNoU2VydmljZVNlY3Rpb25JZHMgPSBbInB1Ymxpc2hTZXJ2aWNlU2ltcGxlIiwicHVibGlzaFNlcnZpY2VBZHZhbmNlZCJdOwotICB2YXIgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTZWN0aW9uSWRzID0gWyJwdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZSIsInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWQiXTsKLSAgdmFyIHN0eWxlRm9ybXMgPSBbInB1Ymxpc2hCdXNpbmVzc1N0eWxlIiwicHVibGlzaFNlcnZpY2VTdHlsZSIsInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU3R5bGUiXTsKLQotICBmdW5jdGlvbiBwcm9jZXNzUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkTmFtZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGVzY3JpcHRpb25zIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTiU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NJZGVudGlmaWVyVGFibGUoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkSWRlbnRpZmllcnMiLGZvcm0pOwotICAgICAgcHJvY2Vzc0NhdGVnb3J5VGFibGUoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQ2F0ZWdvcmllcyIsZm9ybSxmYWxzZSk7Ci0gICAgICBwcm9jZXNzRGlzY292ZXJ5VVJMVGFibGUoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGlzY292ZXJ5VVJMcyIsZm9ybSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc1B1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoInB1Ymxpc2hTZXJ2aWNlU2ltcGxlQnVzaW5lc3MiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9CVVNJTkVTUyU+Iixmb3JtLGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0oZm9ybSkKLSAgewotICAgIGlmIChoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgewotICAgICAgcHJvY2Vzc1Jlc3VsdFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQnVzaW5lc3MiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9CVVNJTkVTUyU+Iixmb3JtLGZhbHNlKTsKLSAgICAgIHByb2Nlc3NSZXN1bHRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2UiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFX0lOVEVSRkFDRSU+Iixmb3JtLGZhbHNlKTsKLSAgICAgIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0xhbmd1YWdlSW5wdXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT05fTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04lPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzQ2F0ZWdvcnlUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZENhdGVnb3JpZXMiLGZvcm0sZmFsc2UpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRGVzY3JpcHRpb25zIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTiU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NJZGVudGlmaWVyVGFibGUoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRJZGVudGlmaWVycyIsZm9ybSk7Ci0gICAgICBwcm9jZXNzQ2F0ZWdvcnlUYWJsZSgicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZENhdGVnb3JpZXMiLGZvcm0sZmFsc2UpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldERlZmF1bHRzKCkKLSAgewotICAgIHZhciBwdWJsaXNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB1Ymxpc2giKTsKLSAgICBwdWJsaXNoLnNlbGVjdGVkSW5kZXggPSA8JT1mb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSklPjsKLSAgICBzZXREZWZhdWx0c0ZvclB1Ymxpc2hCdXNpbmVzc0Zvcm1zKCk7Ci0gICAgc2V0RGVmYXVsdHNGb3JQdWJsaXNoU2VydmljZUZvcm1zKCk7Ci0gICAgc2V0RGVmYXVsdHNGb3JQdWJsaXNoU2VydmljZUludGVyZmFjZUZvcm1zKCk7Ci08JQotICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgIHsKLSU+Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB1Ymxpc2hCdXNpbmVzc1NpbXBsZUF1dGhlbnRpY2F0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEF1dGhlbnRpY2F0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwdWJsaXNoU2VydmljZVNpbXBsZUF1dGhlbnRpY2F0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0lPgotICAgIHNob3dNYWluRm9ybShwdWJsaXNoLnZhbHVlKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKGZvcm0pCi0gIHsKLTwlCi0gICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotJT4KLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocHVibGlzaFVSTCklPiI7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1c2VySWQpJT4iOwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwYXNzd29yZCklPiI7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXREZWZhdWx0c0ZvclB1Ymxpc2hCdXNpbmVzc0Zvcm1zKCkKLSAgewotICAgIC8vIEluaXRpYWxpemUgdGhlIHB1Ymxpc2hCdXNpbmVzcyBmb3JtLgotPCUKLSAgIFN0cmluZyBwdWJsaXNoQnVzaW5lc3NTdHlsZUluZGV4ID0gKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zW3N0eWxlRm9ybXNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPl1dLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyU+WzwlPXB1Ymxpc2hCdXNpbmVzc1N0eWxlSW5kZXglPl0uY2hlY2tlZCA9IHRydWU7Ci0gICAgdmFyIHB1Ymxpc2hCdXNpbmVzc1NpbXBsZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwdWJsaXNoQnVzaW5lc3NTZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT5dKTsKLSAgICB2YXIgcHVibGlzaEJ1c2luZXNzU2ltcGxlRm9ybSA9IHB1Ymxpc2hCdXNpbmVzc1NpbXBsZVNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKHB1Ymxpc2hCdXNpbmVzc1NpbXBsZUZvcm0pOwotICAgIHB1Ymxpc2hCdXNpbmVzc1NpbXBsZUZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSkpJT4iOwotICAgIHB1Ymxpc2hCdXNpbmVzc1NpbXBsZUZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfREVTQ1JJUFRJT04lPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX0RFU0NSSVBUSU9OKSklPiI7Ci0KLSAgICAvLyBBZHZhbmNlZCBmb3JtIGRldGFpbHMuCi0gICAgdmFyIHB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHB1Ymxpc2hCdXNpbmVzc1NlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+XSk7Ci0gICAgdmFyIHB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRm9ybSA9IHB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMocHVibGlzaEJ1c2luZXNzQWR2YW5jZWRGb3JtKTsKLSAgICB2YXIgcHVibGlzaEJ1c2luZXNzQWR2YW5jZWROYW1lc1RhYmxlID0gZ2V0VGFibGUoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkTmFtZXMiKTsKLSAgICB2YXIgcHVibGlzaEJ1c2luZXNzQWR2YW5jZWREZXNjcmlwdGlvbnNUYWJsZSA9IGdldFRhYmxlKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotICAgIHZhciBwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERpc2NvdmVyeVVSTHNUYWJsZSA9IGdldFRhYmxlKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERpc2NvdmVyeVVSTHMiKTsKLTwlCi0gICBWZWN0b3IgYnVzTmFtZVZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgIGlmIChidXNOYW1lVmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPGJ1c05hbWVWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKWJ1c05hbWVWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRMYW5ndWFnZUlucHV0Um93KCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZE5hbWVzIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFIikpJT4iKTsKLSAgICBzZXRMYW5ndWFnZUlucHV0Um93U2V0dGluZ3MoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkTmFtZXMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUuZ2V0TGFuZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUuZ2V0VGV4dCgpKSU+Iik7Ci08JQotICAgICAgIGlmICghZm9ybVRvb2xQSS5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyxpKSkKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZE5hbWVzVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50cm93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBWZWN0b3IgYnVzRGVzY3JpcHRpb25WZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpOwotICAgaWYgKGJ1c0Rlc2NyaXB0aW9uVmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPGJ1c0Rlc2NyaXB0aW9uVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilidXNEZXNjcmlwdGlvblZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZExhbmd1YWdlSW5wdXRSb3coInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGVzY3JpcHRpb25zIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfREVTQ1JJUFRJT05fVEVYVF9WQUxVRSIpKSU+Iik7Ci0gICAgc2V0TGFuZ3VhZ2VJbnB1dFJvd1NldHRpbmdzKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERlc2NyaXB0aW9ucyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24uZ2V0TGFuZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoIWZvcm1Ub29sUEkuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGkpKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGVzY3JpcHRpb25zVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50cm93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBJZGVudGlmaWVyQmFnIGJ1c0lkQmFnID0gKElkZW50aWZpZXJCYWcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLSAgIGlmIChidXNJZEJhZyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBidXNJZEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxrZXllZFJlZmVyZW5jZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2Upa2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRJZGVudGlmaWVyUm93KCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZElkZW50aWZpZXJzIik7Ci0gICAgc2V0SWRlbnRpZmllclJvd1NldHRpbmdzKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZElkZW50aWZpZXJzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotCi0gICBDYXRlZ29yeUJhZyBidXNDYXRCYWcgPSAoQ2F0ZWdvcnlCYWcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMpOwotICAgaWYgKGJ1c0NhdEJhZyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBidXNDYXRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8a2V5ZWRSZWZlcmVuY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWtleWVkUmVmZXJlbmNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkQ2F0ZWdvcnlSb3coInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQ2F0ZWdvcmllcyIpOwotICAgIHNldENhdGVnb3J5Um93U2V0dGluZ3MoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQ2F0ZWdvcmllcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0VE1vZGVsS2V5KCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5TmFtZSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleVZhbHVlKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLSAgCi0gICBEaXNjb3ZlcnlVUkxzIGRpc2NvdmVyeVVSTHMgPSAoRGlzY292ZXJ5VVJMcylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyk7Ci0gICBpZiAoZGlzY292ZXJ5VVJMcyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3IgZGlzY292ZXJ5VVJMVmVjdG9yID0gZGlzY292ZXJ5VVJMcy5nZXREaXNjb3ZlcnlVUkxWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8ZGlzY292ZXJ5VVJMVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBEaXNjb3ZlcnlVUkwgZGlzY292ZXJ5VVJMID0gKERpc2NvdmVyeVVSTClkaXNjb3ZlcnlVUkxWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGREaXNjb3ZlcnlVUkxSb3coInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGlzY292ZXJ5VVJMcyIpOwotICAgIHNldERpc2NvdmVyeVVSTFJvd1NldHRpbmdzKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERpc2NvdmVyeVVSTHMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRpc2NvdmVyeVVSTC5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKCFmb3JtVG9vbFBJLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMsaSkpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3cocHVibGlzaEJ1c2luZXNzQWR2YW5jZWREaXNjb3ZlcnlVUkxzVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50cm93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotJT4gICAgICAgCi0gICAgc2hvd1B1Ymxpc2hGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT4sPCU9cHVibGlzaEJ1c2luZXNzU3R5bGVJbmRleCU+KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldERlZmF1bHRzRm9yUHVibGlzaFNlcnZpY2VGb3JtcygpCi0gIHsKLTwlCi0gICBTdHJpbmcgcHVibGlzaFNlcnZpY2VTdHlsZUluZGV4ID0gKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1tzdHlsZUZvcm1zWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyU+XV0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyU+WzwlPXB1Ymxpc2hTZXJ2aWNlU3R5bGVJbmRleCU+XS5jaGVja2VkID0gdHJ1ZTsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VTaW1wbGVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHVibGlzaFNlcnZpY2VTZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT5dKTsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtID0gcHVibGlzaFNlcnZpY2VTaW1wbGVTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhwdWJsaXNoU2VydmljZVNpbXBsZUZvcm0pOwotPCUKLSAgIFZlY3RvciBzZXJ2aWNlQnVzaW5lc3MgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICBWZWN0b3Igc2VydmljZUJ1c2luZXNzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTX0NPUFkpOwotICAgaWYgKHNlcnZpY2VCdXNpbmVzcyAhPSBudWxsKQotICAgewotICAgICBpZiAoc2VydmljZUJ1c2luZXNzQ29weSA9PSBudWxsKQotICAgICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGVsc2UKLSAgICAgICBzZXJ2aWNlQnVzaW5lc3NDb3B5LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VCdXNpbmVzcy5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZUJ1c2luZXNzLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1MsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyxmYWxzZSk7Ci0gICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgc2VydmljZUJ1c2luZXNzQ29weS5hZGRFbGVtZW50KHNlcnZpY2VCdXNpbmVzcy5lbGVtZW50QXQoaSkpOwotJT4KLSAgICBhZGRSZXN1bHRSb3coInB1Ymxpc2hTZXJ2aWNlU2ltcGxlQnVzaW5lc3MiLDwlPXRhcmdldE5vZGVJZCU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGJlLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpKSU+Iik7Ci08JQotICAgICB9Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTU19DT1BZLHNlcnZpY2VCdXNpbmVzc0NvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBzZXJ2aWNlQnVzaW5lc3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUyxzZXJ2aWNlQnVzaW5lc3MpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSxzZXJ2aWNlQnVzaW5lc3NDb3B5KTsKLSAgIH0KLSU+Ci08JQotICAgVmVjdG9yIHNlcnZpY2VJbnRlcmZhY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgVmVjdG9yIHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFkpOwotICAgaWYgKHNlcnZpY2VJbnRlcmZhY2VzICE9IG51bGwpCi0gICB7Ci0gICAgIGlmIChzZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPT0gbnVsbCkKLSAgICAgICBzZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGVsc2UKLSAgICAgICBzZXJ2aWNlSW50ZXJmYWNlc0NvcHkucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZUludGVyZmFjZXMuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VJbnRlcmZhY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTLGZhbHNlKTsKLSAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBzZXJ2aWNlSW50ZXJmYWNlc0NvcHkuYWRkRWxlbWVudChzZXJ2aWNlSW50ZXJmYWNlcy5lbGVtZW50QXQoaSkpOwotJT4KLSAgICBhZGRSZXN1bHRSb3coInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlIiw8JT10YXJnZXROb2RlSWQlPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodE1vZGVsLmdldE5hbWVTdHJpbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh0TW9kZWwuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFksc2VydmljZUludGVyZmFjZXNDb3B5KTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgc2VydmljZUludGVyZmFjZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTLHNlcnZpY2VJbnRlcmZhY2VzKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFksc2VydmljZUludGVyZmFjZXNDb3B5KTsKLSAgIH0KLSU+Ci0gICAgcHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9XU0RMX1VSTCkpJT4iOwotICAgIHB1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSkpJT4iOwotICAgIHB1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OKSklPiI7Ci0KLSAgICAvLyBBZHZhbmNlZCBmb3JtIGRldGFpbHMuCi0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHVibGlzaFNlcnZpY2VTZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQlPl0pOwotICAgIHZhciBwdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybSA9IHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhwdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybSk7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lc1RhYmxlID0gZ2V0VGFibGUoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lcyIpOwotICAgIHZhciBwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zVGFibGUgPSBnZXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotPCUKLSAgIHNlcnZpY2VCdXNpbmVzcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1MpOwotICAgc2VydmljZUJ1c2luZXNzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSk7Ci0gICBpZiAoc2VydmljZUJ1c2luZXNzICE9IG51bGwpCi0gICB7Ci0gICAgIGlmIChzZXJ2aWNlQnVzaW5lc3NDb3B5ID09IG51bGwpCi0gICAgICAgc2VydmljZUJ1c2luZXNzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZWxzZQotICAgICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZUJ1c2luZXNzLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzZXJ2aWNlQnVzaW5lc3MuZWxlbWVudEF0KGkpOwotICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0VG9vbElkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0VG9vbElkKCk7Ci0gICAgICAgaW50IHRhcmdldFZpZXdJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpOwotICAgICAgIFN0cmluZyB1cmwgPSBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCxzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTLGksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMsZmFsc2UpOwotICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkuYWRkRWxlbWVudChzZXJ2aWNlQnVzaW5lc3MuZWxlbWVudEF0KGkpKTsKLSU+Ci0gICAgYWRkUmVzdWx0Um93KCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQnVzaW5lc3MiLDwlPXRhcmdldE5vZGVJZCU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGJlLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpKSU+Iik7Ci08JQotICAgICB9Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTX0NPUFksc2VydmljZUJ1c2luZXNzQ29weSk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIHNlcnZpY2VCdXNpbmVzcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgc2VydmljZUJ1c2luZXNzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1Msc2VydmljZUJ1c2luZXNzKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSxzZXJ2aWNlQnVzaW5lc3NDb3B5KTsKLSAgIH0KLSU+Ci0gICAgcHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpKSU+IjsKLTwlCi0gICBWZWN0b3Igc2VydmljZU5hbWVWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgIGlmIChzZXJ2aWNlTmFtZVZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlTmFtZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTmFtZSBuYW1lID0gKE5hbWUpc2VydmljZU5hbWVWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRMYW5ndWFnZUlucHV0Um93KCJwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiKSklPiIpOwotICAgIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lLmdldExhbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoIWZvcm1Ub29sUEkuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxpKSkKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRyb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIFZlY3RvciBzZXJ2aWNlRGVzY3JpcHRpb25WZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0gICBpZiAoc2VydmljZURlc2NyaXB0aW9uVmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VEZXNjcmlwdGlvblZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pc2VydmljZURlc2NyaXB0aW9uVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkTGFuZ3VhZ2VJbnB1dFJvdygicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0RFU0NSSVBUSU9OX1RFWFRfVkFMVUUiKSklPiIpOwotICAgIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24uZ2V0TGFuZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoIWZvcm1Ub29sUEkuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsaSkpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3cocHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9uc1RhYmxlLnJvd3NbPCU9aSU+K251bWJlck9mSGVhZGVyUm93c10sImVycmFudHJvdyIpOwotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgQ2F0ZWdvcnlCYWcgc2VydmljZUNhdEJhZyA9IChDYXRlZ29yeUJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLSAgIGlmIChzZXJ2aWNlQ2F0QmFnICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBrZXllZFJlZmVyZW5jZVZlY3RvciA9IHNlcnZpY2VDYXRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8a2V5ZWRSZWZlcmVuY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWtleWVkUmVmZXJlbmNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkQ2F0ZWdvcnlSb3coInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0gICAgc2V0Q2F0ZWdvcnlSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VBZHZhbmNlZENhdGVnb3JpZXMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0lPgotICAgIHNob3dQdWJsaXNoRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiw8JT1wdWJsaXNoU2VydmljZVN0eWxlSW5kZXglPik7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXREZWZhdWx0c0ZvclB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlRm9ybXMoKQotICB7Ci08JQotICAgU3RyaW5nIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU3R5bGVJbmRleCA9IChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zW3N0eWxlRm9ybXNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+XV0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMlPls8JT1wdWJsaXNoU2VydmljZUludGVyZmFjZVN0eWxlSW5kZXglPl0uY2hlY2tlZCA9IHRydWU7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+XSk7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlRm9ybSA9IHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMocHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVGb3JtKTsKLSAgICBwdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUZvcm0uPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCkpJT4iOwotICAgIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKSklPiI7Ci0gICAgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTikpJT4iOwotCi0gICAgLy8gQWR2YW5jZWQgZm9ybSBkZXRhaWxzLgotICAgIHZhciBwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEJT5dKTsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEZvcm0gPSBwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMocHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEZvcm0pOwotICAgIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRGb3JtLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCkpJT4iOwotICAgIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKSklPiI7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWREZXNjcmlwdGlvbnNUYWJsZSA9IGdldFRhYmxlKCJwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRGVzY3JpcHRpb25zIik7Ci08JQotICAgVmVjdG9yIHNpRGVzY3JpcHRpb25WZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMpOwotICAgaWYgKHNpRGVzY3JpcHRpb25WZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2lEZXNjcmlwdGlvblZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pc2lEZXNjcmlwdGlvblZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZExhbmd1YWdlSW5wdXRSb3coInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWREZXNjcmlwdGlvbnMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFIikpJT4iKTsKLSAgICBzZXRMYW5ndWFnZUlucHV0Um93U2V0dGluZ3MoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWREZXNjcmlwdGlvbnMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uLmdldExhbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbi5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKCFmb3JtVG9vbFBJLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyxpKSkKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRGVzY3JpcHRpb25zVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50cm93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBJZGVudGlmaWVyQmFnIHNpSWRCYWcgPSAoSWRlbnRpZmllckJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMpOwotICAgaWYgKHNpSWRCYWcgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGtleWVkUmVmZXJlbmNlVmVjdG9yID0gc2lJZEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxrZXllZFJlZmVyZW5jZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2Upa2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRJZGVudGlmaWVyUm93KCJwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkSWRlbnRpZmllcnMiKTsKLSAgICBzZXRJZGVudGlmaWVyUm93U2V0dGluZ3MoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRJZGVudGlmaWVycyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0VE1vZGVsS2V5KCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5TmFtZSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleVZhbHVlKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLQotICAgQ2F0ZWdvcnlCYWcgc2lDYXRCYWcgPSAoQ2F0ZWdvcnlCYWcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMpOwotICAgaWYgKHNpQ2F0QmFnICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBrZXllZFJlZmVyZW5jZVZlY3RvciA9IHNpQ2F0QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGtleWVkUmVmZXJlbmNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlrZXllZFJlZmVyZW5jZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZENhdGVnb3J5Um93KCJwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQ2F0ZWdvcmllcyIpOwotICAgIHNldENhdGVnb3J5Um93U2V0dGluZ3MoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRDYXRlZ29yaWVzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotJT4KLSAgICBzaG93UHVibGlzaEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+LDwlPXB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU3R5bGVJbmRleCU+KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dNYWluRm9ybShwdWJsaXNoVmFsdWUpCi0gIHsKLSAgICBjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKTsKLSAgICB2YXIgcHVibGlzaCA9IHBhcnNlSW50KHB1Ymxpc2hWYWx1ZSk7Ci0gICAgZm9yICh2YXIgaT0wO2k8c2VjdGlvbklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChpID09IHB1Ymxpc2gpCi0gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlY3Rpb25JZHNbaV0pLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIGVsc2UKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VjdGlvbklkc1tpXSkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICB9Ci0gICAgdmFyIGxvYWRTY3JlZW5UYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkU2NyZWVuIik7Ci0gICAgaWYgKGxvYWRTY3JlZW5UYWJsZS5yb3dzLmxlbmd0aCA+IDApCi0gICAgICBsb2FkU2NyZWVuVGFibGUuZGVsZXRlUm93KDApOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluU2NyZWVuIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1B1Ymxpc2hGb3JtKHF1ZXJ5SXRlbUluZGV4LHN0eWxlKQotICB7Ci0gICAgY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCk7Ci0gICAgdmFyIHB1Ymxpc2hTZWN0aW9uSWRzOwotICAgIHN3aXRjaCAocXVlcnlJdGVtSW5kZXgpCi0gICAgewotICAgICAgY2FzZSA8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+OgotICAgICAgICBwdWJsaXNoU2VjdGlvbklkcyA9IHB1Ymxpc2hCdXNpbmVzc1NlY3Rpb25JZHM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPjoKLSAgICAgICAgcHVibGlzaFNlY3Rpb25JZHMgPSBwdWJsaXNoU2VydmljZVNlY3Rpb25JZHM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT46Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBwdWJsaXNoU2VjdGlvbklkcyA9IHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2VjdGlvbklkczsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGZvciAodmFyIGk9MDtpPHB1Ymxpc2hTZWN0aW9uSWRzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKGkgPT0gc3R5bGUpCi0gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHB1Ymxpc2hTZWN0aW9uSWRzW2ldKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgICBlbHNlCi0gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHB1Ymxpc2hTZWN0aW9uSWRzW2ldKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgIH0KLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiIgb25VbmxvYWQ9ImNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPGRpdiBpZD0ibWFpblNjcmVlbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotPCUKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ1ZGRpL2ltYWdlcy9wdWJsaXNoX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1BVQkxJU0giKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIHZhbGlnbj0ibWlkZGxlIiBub3dyYXA+Ci0gICAgICAgICAgICA8bGFiZWwgZm9yPSJwdWJsaXNoIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIG5vd3JhcD4KLSAgICAgICAgICAgIDxzZWxlY3QgaWQ9InB1Ymxpc2giIG9uQ2hhbmdlPSJzaG93TWFpbkZvcm0odGhpcy52YWx1ZSkiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTIiklPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0UiKSU+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFIiklPgotICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9kaXY+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNmMwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIHByb2Nlc3NQdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQlPiI+ICAKLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+ICAgIAotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0lPiI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIGJvb2xlYW4gdGFibGVIYXNFcnJvcnMgPSAhZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTKTsKLSAgIFN0cmluZ1tdIGJ1c1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9CVVNJTkVTUyIsKG5ldyBCb29sZWFuKHRhYmxlSGFzRXJyb3JzKSkudG9TdHJpbmcoKSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyksInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU307Ci0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRCdXNpbmVzcyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKGJ1c1NwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgbm93cmFwIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2Vfd3NkbF91cmwiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX1VSTCIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBub3dyYXAgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5XU0RMQnJvd3NlcigncHVibGlzaFNlcnZpY2VBZHZhbmNlZCcsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFJT4pIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19CUk9XU0UiKSU+PC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9wdWJsaXNoX3NlcnZpY2VfYWR2YW5jZV93c2RsX3VybCIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPCUKLSAgIHRhYmxlSGFzRXJyb3JzID0gIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgU3RyaW5nW10gc2VydmljZUludGVyZmFjZVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVMiLChuZXcgQm9vbGVhbih0YWJsZUhhc0Vycm9ycykpLnRvU3RyaW5nKCksU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyksInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVN9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkU2VydmljZUludGVyZmFjZSIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKHNlcnZpY2VJbnRlcmZhY2VTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXMiKTsKLSAgIFN0cmluZ1tdIG5hbWVTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfTkFNRVMiLCJGT1JNX0xBQkVMX05BTUUiLFN0cmluZy52YWx1ZU9mKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMobmFtZVNwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUykpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhkZXNjU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQ2F0ZWdvcmllcyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEzZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hTZXJ2aWNlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIG5hbWU9InB1Ymxpc2hTZXJ2aWNlU3R5bGUiPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX0ZPUk0iKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX3NpbXBsZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTJT4iIG9uQ2xpY2s9InNob3dQdWJsaXNoRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+KSI+PGxhYmVsIGZvcj0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX3NpbXBsZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU0lNUExFIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2UiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyU+IiBvbkNsaWNrPSJzaG93UHVibGlzaEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2UiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX0FEVkFOQ0VEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZm9ybT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZWNhNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEZvcm0odGhpcykiPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0VfQURWQU5DRURfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZV93c2RsX3VybCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvbGFiZWw+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBub3dyYXAgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5XU0RMQnJvd3NlcigncHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZCcsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSU+KSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIiklPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlX3dzZGxfdXJsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPiIgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZV9uYW1lIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvbGFiZWw+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49Mz4gPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX2FkdmFuY2VfbmFtZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoZGVzY1NwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZElkZW50aWZpZXJzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2lkZW50aWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTgyY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGRpdiBpZD0icHVibGlzaFNlcnZpY2VJbnRlcmZhY2UiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gbmFtZT0icHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTdHlsZSI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfRk9STSIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX3NpbXBsZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyU+IiBvbkNsaWNrPSJzaG93UHVibGlzaEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT4pIj48bGFiZWwgZm9yPSJyYWRpb19wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX3NpbXBsZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU0lNUExFIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTJT4iIG9uQ2xpY2s9InNob3dQdWJsaXNoRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19BRFZBTkNFRCIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Zvcm0+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjA2ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJwdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIGhhbmRsZVN1Ym1pdCh0aGlzKSI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9TSU1QTEVfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQXV0aGVudGljYXRpb24iKTsKLSU+ICAgICAgCi08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgCi0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlX3dzZGxfdXJsIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9VUkwiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIG5vd3JhcCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbldTRExCcm93c2VyKCdwdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZScsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSU+KSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIiklPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9zaW1wbGVfd3NkbF91cmwiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+IiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTMgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgICAgICA8L3RkPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlX25hbWUiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlX2Rlc2MiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlX2Rlc2MiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4gICAgICAgICAgCi0gICAgPC90YWJsZT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNhZjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hTZXJ2aWNlU2ltcGxlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc1B1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQlPiI+ICAKLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZVNpbXBsZUF1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBib29sZWFuIHRhYmxlSGFzRXJyb3JzID0gIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1MpOwotICAgU3RyaW5nW10gYnVzU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX0JVU0lORVNTIiwobmV3IEJvb2xlYW4odGFibGVIYXNFcnJvcnMpKS50b1N0cmluZygpLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSwicHVibGlzaFNlcnZpY2VTaW1wbGUiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1N9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZVNpbXBsZUJ1c2luZXNzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoYnVzU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBub3dyYXAgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlX3dzZGxfdXJsIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9VUkwiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfV1NETF9VUkwpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIG5vd3JhcCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbldTRExCcm93c2VyKCdwdWJsaXNoU2VydmljZVNpbXBsZScsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFJT4pIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19CUk9XU0UiKSU+PC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlX3dzZGxfdXJsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPiIgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZV9uYW1lIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9zaW1wbGVfZGVzYyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZV9kZXNjIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZXN1bHRzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVzdWx0c0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGYwMjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZXN1bHRzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXRIb2xkZXIiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgc3ViUXVlcnlUcmFuc2ZlclRhcmdldEhvbGRlci5yZW1vdmVBbGxFbGVtZW50cygpOwotJT4KLTwvanNwOnVzZUJlYW4+ICAgCi08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgc3ViUXVlcnlUcmFuc2ZlclRhcmdldCA9IG51bGw7Ci0gICBib29sZWFuIGhhc1RhcmdldCA9IGZhbHNlOwotICAgaWYgKHRyZWVFbGVtZW50IGluc3RhbmNlb2YgUXVlcnlFbGVtZW50KQotICAgewotICAgICBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0ID0gKFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQpdHJlZUVsZW1lbnQuZ2V0UHJvcGVydHlBc09iamVjdChVRERJTW9kZWxDb25zdGFudHMuU1VCUVVFUllfVFJBTlNGRVJfVEFSR0VUKTsKLSAgICAgaWYgKHN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgIT0gbnVsbCAmJiBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0LmdldFRhcmdldEZvcm1Ub29sKCkgIT0gbnVsbCkKLSAgICAgewotICAgICAgIHN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXRIb2xkZXIucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgICBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyLmFkZEVsZW1lbnQoc3ViUXVlcnlUcmFuc2ZlclRhcmdldCk7Ci0gICAgICAgaGFzVGFyZ2V0ID0gdHJ1ZTsKLSAgICAgfQotICAgfQotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1JFU1VMVFMiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9yZXN1bWVwcm94eWxvYWRwYWdlLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy9yZXN1bHRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLTwlCi0gICBWZWN0b3IgY2hpbGROb2RlcyA9IHNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICBmb3IgKGludCBpPTA7aTxjaGlsZE5vZGVzLnNpemUoKTtpKyspCi0gICB7Ci0gICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpY2hpbGROb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgIFN0cmluZyB1cmwgPSBTZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoY2hpbGROb2RlLmdldE5vZGVJZCgpLGZhbHNlKTsKLSAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotICAgICBpZiAoY2hpbGROb2RlIGluc3RhbmNlb2YgQnVzaW5lc3NOb2RlKQotICAgICB7Ci0gICAgICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KWNoaWxkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpOwotICAgICAgIG5hbWUgPSBiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgIGRlc2NyaXB0aW9uID0gYmUuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgIH0KLSAgICAgZWxzZSBpZiAoY2hpbGROb2RlIGluc3RhbmNlb2YgU2VydmljZU5vZGUpCi0gICAgIHsKLSAgICAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudCljaGlsZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICAgICBuYW1lID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICBkZXNjcmlwdGlvbiA9IGJzLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotICAgICB9Ci0gICAgIGVsc2UgaWYgKGNoaWxkTm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VOb2RlKQotICAgICB7Ci0gICAgICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KWNoaWxkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgIFRNb2RlbCB0TW9kZWwgPSBzaUVsZW1lbnQuZ2V0VE1vZGVsKCk7Ci0gICAgICAgbmFtZSA9IHRNb2RlbC5nZXROYW1lU3RyaW5nKCk7Ci0gICAgICAgZGVzY3JpcHRpb24gPSB0TW9kZWwuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgIH0KLSU+Ci0gICAgYWRkUmVzdWx0Um93KCJSZXN1bHRzIiw8JT1jaGlsZE5vZGUuZ2V0Tm9kZUlkKCklPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbiklPiIpOwotPCUKLSAgIH0KLSU+Ci0gICAgdmFyIGxvYWRTY3JlZW5UYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkU2NyZWVuIik7Ci0gICAgaWYgKGxvYWRTY3JlZW5UYWJsZS5yb3dzLmxlbmd0aCA+IDApCi0gICAgICBsb2FkU2NyZWVuVGFibGUuZGVsZXRlUm93KDApOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluU2NyZWVuIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotPGRpdiBpZD0iY29udGVudCI+Ci0gIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8ZGl2IGlkPSJtYWluU2NyZWVuIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci08JQotICAgU3RyaW5nIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9RVUVSWV9SRVNVTFRTIik7Ci0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9mb3Jtcy9yZXN1bHRzZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPGZvcm0gdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDsiPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBTdHJpbmcgdGFibGVUaXRsZTsKLSAgIGludCBpdGVtVHlwZSA9IEludGVnZXIucGFyc2VJbnQodHJlZUVsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhVRERJTW9kZWxDb25zdGFudHMuUVVFUllfVFlQRSkpOyAgIAotICAgc3dpdGNoIChpdGVtVHlwZSkKLSAgIHsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICB0YWJsZVRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTRVMiKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgdGFibGVUaXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFUyIpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgdGFibGVUaXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVMiKTsKLSAgIH0KLSAgIFN0cmluZ1tdIG90aGVyUHJvcGVydGllcyA9IHt0YWJsZVRpdGxlLCIifTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJSZXN1bHRzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMob3RoZXJQcm9wZXJ0aWVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvcmVzdWx0c190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci08JQotICAgaWYgKGhhc1RhcmdldCkKLSAgIHsKLSU+Ci0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX1RSQU5TRkVSIiklPiIgb25DbGljaz0idHJhbnNmZXJTZWxlY3Rpb25zKCdSZXN1bHRzJyx0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICA8L3RkPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9SRUZSRVNIIiklPiIgb25DbGljaz0icmVmcmVzaFNlbGVjdGlvbnMoJ1Jlc3VsdHMnLHRoaXMuZm9ybSkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0FERF9UT19GQVZPUklURVMiKSU+IiBvbkNsaWNrPSJhZGRTZWxlY3Rpb25zVG9GYXZvcml0ZXMoJ1Jlc3VsdHMnLHRoaXMuZm9ybSkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0NMRUFSIiklPiIgb25DbGljaz0iY2xlYXJTZWxlY3Rpb25zKCdSZXN1bHRzJyx0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9mb3JtPgotICA8L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgc2V0RGVmYXVsdHMoKTsKLSAgcmVzdW1lUHJveHlMb2FkUGFnZSgpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvU2VydmljZURldGFpbHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9TZXJ2aWNlRGV0YWlsc0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZjNTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9TZXJ2aWNlRGV0YWlsc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShjdXJyZW50VG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoU2VydmljZUVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSluYXZpZ2F0b3JNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IHVkZGlNYWluTm9kZS5nZXRSZWdpc3RyeU5vZGUoc2VsZWN0ZWROb2RlKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfU0VSVklDRV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvZGV0YWlsc3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci0gICAgdmFyIHNlcnZpY2VEZXRhaWxzV1NETFVSTFRhYmxlID0gZ2V0VGFibGUoInNlcnZpY2VEZXRhaWxzV1NETFVSTCIpOwotICAgIHZhciBzZXJ2aWNlRGV0YWlsc05hbWVzVGFibGUgPSBnZXRUYWJsZSgic2VydmljZURldGFpbHNOYW1lcyIpOwotICAgIHZhciBzZXJ2aWNlRGV0YWlsc0Rlc2NyaXB0aW9uc1RhYmxlID0gZ2V0VGFibGUoInNlcnZpY2VEZXRhaWxzRGVzY3JpcHRpb25zIik7Ci08JQotICAgTGlzdEVsZW1lbnQgd3NkbFVSTExpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICBTdHJpbmcgd3NkbFVSTCA9IG51bGw7Ci0gICBpZiAod3NkbFVSTExpc3RFbGVtZW50ID09IG51bGwpCi0gICB7Ci0gICAgIHRyeQotICAgICB7Ci0gICAgICAgVWRkaTRqSGVscGVyIHVkZGk0akhlbHBlciA9IG5ldyBVZGRpNGpIZWxwZXIoKTsKLSAgICAgICB3c2RsVVJMID0gdWRkaTRqSGVscGVyLmdldFdTREwoc2VydmljZUVsZW1lbnQuZ2V0QnVzaW5lc3NTZXJ2aWNlKCksIHNlcnZpY2VFbGVtZW50LmdldFJlZ2lzdHJ5RWxlbWVudCgpLmdldFByb3h5KCkpOwotICAgICAgIHVkZGk0akhlbHBlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICBpZiAod3NkbFVSTCA9PSBudWxsKQotICAgICAgICAgd3NkbFVSTCA9ICJ0ZW1wLndzZGwiOwotICAgICB9Ci0gICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgewotICAgICAgIHdzZGxVUkwgPSAiIjsKLSAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKTsKLSAgICAgfQotICAgICB3c2RsVVJMTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQod3NkbFVSTCk7Ci0gICAgIHdzZGxVUkxMaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8oLTEsLTEsMCk7Ci0gICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCx3c2RsVVJMTGlzdEVsZW1lbnQpOwotICAgfQotICAgZWxzZQotICAgICB3c2RsVVJMID0gKFN0cmluZyl3c2RsVVJMTGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICBib29sZWFuIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICBib29sZWFuIGlzTmV3SXRlbSA9ICh3c2RsVVJMTGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc1NpbmdsZUl0ZW1Sb3coInNlcnZpY2VEZXRhaWxzV1NETFVSTCIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvdygic2VydmljZURldGFpbHNXU0RMVVJMIiw8JT1VRERJQWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZSh3c2RsVVJMKSU+Iik7Ci08JQotICAgaWYgKGlzRXJyb3IpCi0gICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhzZXJ2aWNlRGV0YWlsc1dTRExVUkxUYWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUKLSAgIH0KLQotICAgVmVjdG9yIG5hbWVJbmRleFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgIGlmIChuYW1lSW5kZXhWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8bmFtZUluZGV4VmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCluYW1lSW5kZXhWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxpKTsKLSAgICAgICBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3coInNlcnZpY2VEZXRhaWxzTmFtZXMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiKSklPiIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNMYW5ndWFnZUlucHV0Um93KCJzZXJ2aWNlRGV0YWlsc05hbWVzIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9bmFtZS5nZXRMYW5nKCklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoaXNFcnJvcikKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhzZXJ2aWNlRGV0YWlsc05hbWVzVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50Um93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBWZWN0b3IgZGVzY3JpcHRpb25JbmRleFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0gICBpZiAoZGVzY3JpcHRpb25JbmRleFZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbkluZGV4VmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClkZXNjcmlwdGlvbkluZGV4VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBpc0Vycm9yID0gIWZvcm1Ub29sLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgIGlzTmV3SXRlbSA9IChsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotJT4KLSAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygic2VydmljZURldGFpbHNEZXNjcmlwdGlvbnMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFIikpJT4iLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygic2VydmljZURldGFpbHNEZXNjcmlwdGlvbnMiLDwlPWklPiw8JT1saXN0RWxlbWVudC5nZXRWaWV3SWQoKSU+LCI8JT1kZXNjcmlwdGlvbi5nZXRMYW5nKCklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbi5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKGlzRXJyb3IpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3coc2VydmljZURldGFpbHNEZXNjcmlwdGlvbnNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRSb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIFZlY3RvciBjYXRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLSAgIGlmIChjYXRWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCljYXRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTLGkpOwotICAgICAgIGlzTmV3SXRlbSA9IChsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotJT4KLSAgICBhZGREZXRhaWxzQ2F0ZWdvcnlSb3coInNlcnZpY2VEZXRhaWxzQ2F0ZWdvcmllcyIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNDYXRlZ29yeVJvdygic2VydmljZURldGFpbHNDYXRlZ29yaWVzIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0KLSAgIC8vIEF1dGhlbnRpY2F0aW9uLgotICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgIHsKLSAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocHVibGlzaFVSTCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodXNlcklkKSU+IjsKLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHBhc3N3b3JkKSU+IjsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VydmljZURldGFpbHNBdXRoZW50aWNhdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0lPgotCi0gICAgc2hvd01haW5Gb3JtKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93TWFpbkZvcm0oKQotICB7Ci0gICAgY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCk7Ci0gICAgdmFyIGxvYWRTY3JlZW5UYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkU2NyZWVuIik7Ci0gICAgaWYgKGxvYWRTY3JlZW5UYWJsZS5yb3dzLmxlbmd0aCA+IDApCi0gICAgICBsb2FkU2NyZWVuVGFibGUuZGVsZXRlUm93KDApOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluU2NyZWVuIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc0Zvcm0oZm9ybSkKLSAgewotICAgIGlmIChoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgewotICAgICAgcHJvY2Vzc0RldGFpbHNTaW5nbGVJdGVtVGFibGUoInNlcnZpY2VEZXRhaWxzV1NETFVSTCIsIjwlPVVERElBY3Rpb25JbnB1dHMuV1NETF9VUkxfTU9ESUZJRUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NEZXRhaWxzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJzZXJ2aWNlRGV0YWlsc05hbWVzIiwiPCU9VURESUFjdGlvbklucHV0cy5OQU1FX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5BTUVfVklFV0lEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NEZXRhaWxzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJzZXJ2aWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIsIjwlPVVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fTU9ESUZJRUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fVklFV0lEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0RldGFpbHNDYXRlZ29yeVRhYmxlKCJzZXJ2aWNlRGV0YWlsc0NhdGVnb3JpZXMiLGZvcm0pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiIgb25VbmxvYWQ9ImNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIHByb2Nlc3NGb3JtKHRoaXMpIj4KLSAgICAgIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgICAgPGRpdiBpZD0ibWFpblNjcmVlbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotPCUKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TRVJWSUNFX0RFVEFJTFMiKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVklPiIgdmFsdWU9IjwlPWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVklPiIgdmFsdWU9IjwlPWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSklPiI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFVEFJTFNfRURJVEFCTEUiLHNlbGVjdGVkTm9kZS5nZXROb2RlTmFtZSgpKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0VSVklDRV9LRVkiKSU+Ci0gICAgICAgICAgICA8L3RoPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgPCU9Zm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlRGV0YWlsc1dTRExVUkwiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9VUkwiKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2RldGFpbHNTaW5nbGVJdGVtX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInNlcnZpY2VEZXRhaWxzTmFtZXMiKTsKLSAgIFN0cmluZ1tdIG5hbWVTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfTkFNRVMiLCJGT1JNX0xBQkVMX05BTUUiLFN0cmluZy52YWx1ZU9mKCFmb3JtVG9vbC5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKSl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG5hbWVTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzTGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoZGVzY1NwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2RldGFpbHNMYW5ndWFnZUlucHV0X3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInNlcnZpY2VEZXRhaWxzQ2F0ZWdvcmllcyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzQ2F0ZWdvcmllc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlRGV0YWlsc0F1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Zvcm0+Ci0gIDwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci0gIHJlc3VtZVByb3h5TG9hZFBhZ2UoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1NlcnZpY2VJbnRlcmZhY2VEZXRhaWxzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvU2VydmljZUludGVyZmFjZURldGFpbHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlMzhjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvU2VydmljZUludGVyZmFjZURldGFpbHNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoY3VycmVudFRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNpRWxlbWVudCA9IChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsgICAKLSAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShzZWxlY3RlZE5vZGUpOwotICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvZGV0YWlsc3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci0gICAgdmFyIHNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzV1NETFVSTFRhYmxlID0gZ2V0VGFibGUoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzV1NETFVSTCIpOwotICAgIHZhciBzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc05hbWVUYWJsZSA9IGdldFRhYmxlKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc05hbWUiKTsKLSAgICB2YXIgc2VydmljZUludGVyZmFjZURldGFpbHNEZXNjcmlwdGlvbnNUYWJsZSA9IGdldFRhYmxlKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIpOwotICAgIHZhciBzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0lkZW50aWZpZXJzVGFibGUgPSBnZXRUYWJsZSgic2VydmljZUludGVyZmFjZURldGFpbHNJZGVudGlmaWVycyIpOwotICAgIHZhciBzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0NhdGVnb3JpZXNUYWJsZSA9IGdldFRhYmxlKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0NhdGVnb3JpZXMiKTsKLTwlCi0gICBMaXN0RWxlbWVudCB3c2RsVVJMTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICBTdHJpbmcgd3NkbFVSTCA9IG51bGw7Ci0gICBpZiAod3NkbFVSTExpc3RFbGVtZW50ID09IG51bGwpCi0gICB7Ci0gICAgIHRyeQotICAgICB7Ci0gICAgICAgVWRkaTRqSGVscGVyIHVkZGk0akhlbHBlciA9IG5ldyBVZGRpNGpIZWxwZXIoKTsKLSAgICAgICB3c2RsVVJMID0gdWRkaTRqSGVscGVyLmdldFdTREwoc2lFbGVtZW50LmdldFRNb2RlbCgpKTsKLSAgICAgICB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgICAgaWYgKHdzZGxVUkwgPT0gbnVsbCkKLSAgICAgICAgIHdzZGxVUkwgPSAidGVtcC53c2RsIjsKLSAgICAgfQotICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgIHsKLSAgICAgICB3c2RsVVJMID0gIiI7Ci0gICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwpOwotICAgICB9Ci0gICAgIHdzZGxVUkxMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudCh3c2RsVVJMKTsKLSAgICAgd3NkbFVSTExpc3RFbGVtZW50LnNldFRhcmdldFZpZXdUb29sSW5mbygtMSwtMSwwKTsKLSAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCx3c2RsVVJMTGlzdEVsZW1lbnQpOwotICAgfQotICAgZWxzZQotICAgICB3c2RsVVJMID0gKFN0cmluZyl3c2RsVVJMTGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICBib29sZWFuIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwpOwotICAgYm9vbGVhbiBpc05ld0l0ZW0gPSAod3NkbFVSTExpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0lPgotICAgIGFkZERldGFpbHNTaW5nbGVJdGVtUm93KCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1dTRExVUkwiLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3coInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzV1NETFVSTCIsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUod3NkbFVSTCklPiIpOwotPCUKLSAgIGlmIChpc0Vycm9yKQotICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3coc2VydmljZUludGVyZmFjZURldGFpbHNXU0RMVVJMVGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRSb3ciKTsKLTwlICAgCi0gICB9Ci0KLSAgIExpc3RFbGVtZW50IG5hbWVMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICBpc05ld0l0ZW0gPSAobmFtZUxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0lPgotICAgIGFkZERldGFpbHNTaW5nbGVJdGVtUm93KCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc05hbWUiLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzTmFtZVNpbmdsZUl0ZW1Sb3coInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzTmFtZSIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lKSU+Iik7Ci08JQotICAgaWYgKGlzRXJyb3IpCi0gICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc05hbWVUYWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUKLSAgIH0KLSAgIAotICAgVmVjdG9yIGRlc2NyaXB0aW9uSW5kZXhWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TKTsKLSAgIGlmIChkZXNjcmlwdGlvbkluZGV4VmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPGRlc2NyaXB0aW9uSW5kZXhWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWRlc2NyaXB0aW9uSW5kZXhWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgIGlzTmV3SXRlbSA9IChsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotJT4KLSAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygic2VydmljZUludGVyZmFjZURldGFpbHNEZXNjcmlwdGlvbnMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFIikpJT4iLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygic2VydmljZUludGVyZmFjZURldGFpbHNEZXNjcmlwdGlvbnMiLDwlPWklPiw8JT1saXN0RWxlbWVudC5nZXRWaWV3SWQoKSU+LCI8JT1kZXNjcmlwdGlvbi5nZXRMYW5nKCklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbi5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKGlzRXJyb3IpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3coc2VydmljZUludGVyZmFjZURldGFpbHNEZXNjcmlwdGlvbnNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRSb3ciKTsKLTwlICAgICAgIAotICAgICAgIH0KLSAgICAgfQotICAgfQotICAgCi0gICBWZWN0b3IgaWRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMpOwotICAgaWYgKGlkVmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPGlkVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClpZFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgaXNFcnJvciA9ICFmb3JtVG9vbC5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyxpKTsKLSAgICAgICBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0lkZW50aWZpZXJSb3coInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzSWRlbnRpZmllcnMiLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzSWRlbnRpZmllclJvdygic2VydmljZUludGVyZmFjZURldGFpbHNJZGVudGlmaWVycyIsPCU9aSU+LDwlPWxpc3RFbGVtZW50LmdldFZpZXdJZCgpJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUgICAgICAgCi0gICAgIH0KLSAgIH0KLSAgIAotICAgVmVjdG9yIGNhdFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTKTsKLSAgIGlmIChjYXRWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCljYXRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyxpKTsKLSAgICAgICBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93KCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0NhdGVnb3JpZXMiLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzQ2F0ZWdvcnlSb3coInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQ2F0ZWdvcmllcyIsPCU9aSU+LDwlPWxpc3RFbGVtZW50LmdldFZpZXdJZCgpJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotICAgCi0gICAvLyBBdXRoZW50aWNhdGlvbi4KLSAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICB7Ci0gICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotJT4gICAKLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHB1Ymxpc2hVUkwpJT4iOwotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJJZCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwYXNzd29yZCklPiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci08JQotICAgfQotJT4gIAotICAgIHNob3dNYWluRm9ybSgpOwotICB9Ci0gIAotICBmdW5jdGlvbiBzaG93TWFpbkZvcm0oKQotICB7Ci0gICAgY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCk7Ci0gICAgdmFyIGxvYWRTY3JlZW5UYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkU2NyZWVuIik7Ci0gICAgaWYgKGxvYWRTY3JlZW5UYWJsZS5yb3dzLmxlbmd0aCA+IDApCi0gICAgICBsb2FkU2NyZWVuVGFibGUuZGVsZXRlUm93KDApOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluU2NyZWVuIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICB9Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzRGV0YWlsc1NpbmdsZUl0ZW1UYWJsZSgic2VydmljZUludGVyZmFjZURldGFpbHNXU0RMVVJMIiwiPCU9VURESUFjdGlvbklucHV0cy5XU0RMX1VSTF9NT0RJRklFRCU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NEZXRhaWxzU2luZ2xlSXRlbVRhYmxlKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc05hbWUiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5BTUVfTU9ESUZJRUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NEZXRhaWxzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIsIjwlPVVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fTU9ESUZJRUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fVklFV0lEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0RldGFpbHNJZGVudGlmaWVyVGFibGUoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzSWRlbnRpZmllcnMiLGZvcm0pOwotICAgICAgcHJvY2Vzc0RldGFpbHNDYXRlZ29yeVRhYmxlKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0NhdGVnb3JpZXMiLGZvcm0pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgIAotPC9zY3JpcHQ+ICAKLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIiBvblVubG9hZD0iY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCkiPgotICA8ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPiAgCi0gICAgICA8dGFibGUgaWQ9ImxvYWRTY3JlZW4iPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfTE9BRF9JTl9QUk9HUkVTUyIpJT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICAgIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgIFN0cmluZyB0aXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUyIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4gICAgICAKLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSU+IiB2YWx1ZT0iPCU9Zm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSklPiI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFVEFJTFNfRURJVEFCTEUiLHNlbGVjdGVkTm9kZS5nZXROb2RlTmFtZSgpKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+ICAgICAgICAKLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVkiKSU+Ci0gICAgICAgICAgICA8L3RoPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgPCU9Zm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSklPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgic2VydmljZUludGVyZmFjZURldGFpbHNXU0RMVVJMIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIikpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzU2luZ2xlSXRlbV90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc05hbWUiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIikpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzU2luZ2xlSXRlbV90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgCi08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TKSl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKGRlc2NTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzTGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0lkZW50aWZpZXJzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2RldGFpbHNJZGVudGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0NhdGVnb3JpZXMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgIAotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgic2VydmljZUludGVyZmFjZURldGFpbHNBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPC9kaXY+Ci0gICAgPC9mb3JtPgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotICByZXN1bWVQcm94eUxvYWRQYWdlKCk7ICAKLTwvc2NyaXB0PiAgICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDIyOGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtUHJvcGVydGllcyIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgU3RyaW5nIHdzZGxVUkw7Ci0gICAvLyBzZWxlY3RlZE5vZGUgc2hvdWxkIGJlIGVpdGhlciBhIHNlcnZpY2Ugb3IgYSBzZXJ2aWNlIGludGVyZmFjZSBub2RlLgotICAgaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VOb2RlKQotICAgewotICAgICBTZXJ2aWNlTm9kZSBzZXJ2aWNlTm9kZSA9IChTZXJ2aWNlTm9kZSlzZWxlY3RlZE5vZGU7Ci0gICAgIHdzZGxVUkwgPSBzZXJ2aWNlTm9kZS5nZXRXU0RMVVJMRnJvbURldGFpbHNUb29sKCk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIFNlcnZpY2VJbnRlcmZhY2VOb2RlIHNpTm9kZSA9IChTZXJ2aWNlSW50ZXJmYWNlTm9kZSlzZWxlY3RlZE5vZGU7Ci0gICAgIHdzZGxVUkwgPSBzaU5vZGUuZ2V0V1NETFVSTEZyb21EZXRhaWxzVG9vbCgpOwotICAgfQotICAgZm9ybVByb3BlcnRpZXMucHV0KCJmb3JtQWN0aW9uTGluayIsInVkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcCIpOwotICAgZm9ybVByb3BlcnRpZXMucHV0KCJ3c2RsVVJMIix3c2RsVVJMKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9JbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1VERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmYTI1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uTGluayIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtQWN0aW9uTGluay5hcHBlbmQoInVkZGkvYWN0aW9ucy9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AiKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVW5wdWJsaXNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVW5wdWJsaXNoRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMWRiMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1VucHVibGlzaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAKLSAgIEZvcm1Ub29sIHVucHVibGlzaFRvb2wgPSAoRm9ybVRvb2wpKG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotJT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfVU5QVUJMSVNIIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXRhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLTwlCi0gICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgewotJT4KLSAgICB2YXIgYXV0aGVudGljYXRpb25TZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVucHVibGlzaEF1dGhlbnRpY2F0aW9uIik7Ci0gICAgYXV0aGVudGljYXRpb25TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmZvcm1zWzBdOwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKXVucHVibGlzaFRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCkpJT4iOwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZyl1bnB1Ymxpc2hUb29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKSklPiI7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpdW5wdWJsaXNoVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKSklPiI7ICAgIAotPCUKLSAgIH0KLSU+Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iIG9uVW5sb2FkPSJjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKSI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvVW5wdWJsaXNoQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIGhhbmRsZVN1Ym1pdCh0aGlzKSI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gdW5wdWJsaXNoVG9vbC5nZXRIaWdobGlnaHRlZEltYWdlTGluaygpOwotICAgU3RyaW5nIHRpdGxlID0gdW5wdWJsaXNoVG9vbC5nZXRBbHRUZXh0KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VOUFVCTElTSF9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgidW5wdWJsaXNoQXV0aGVudGljYXRpb24iKTsKLSU+ICAgICAgIAotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgc2V0RGVmYXVsdHMoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2FkdmFuY2VkQ29tbW9uX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9hZHZhbmNlZENvbW1vbl90YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTg1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2FkdmFuY2VkQ29tbW9uX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgY29sc3Bhbj0zIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTUFYX1NFQVJDSF9TRVQiKSU+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9TRUFSQ0hfU0VUKSkKLSAgIHsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICA8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGNvbHNwYW49Mz4KLSAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9TRUFSQ0hfU0VUJT4iIGNsYXNzPSJzbXRleHRlbnRlciI+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBjb2xzcGFuPTMgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NQVhfUkVTVUxUUyIpJT4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1JFU1VMVFMpKQotICAgewotJT4KLSAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY29sc3Bhbj0zPgotICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1JFU1VMVFMlPiIgY2xhc3M9InNtdGV4dGVudGVyIj4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjg2ZjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNyAgIDEyNzQ0MyBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkFic3RyYWN0VURESUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLVVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci1UcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKLVN0cmluZyBwYXNzd29yZCA9IG51bGw7Ci1pZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RVRERJRWxlbWVudCkKLXsKLSAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoKEFic3RyYWN0VURESUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRSZWdpc3RyeUVsZW1lbnQoKTsKLSAgdXNlcm5hbWUgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotfQotaWYgKHVzZXJuYW1lID09IG51bGwpCi0gIHVzZXJuYW1lID0gIiI7Ci1pZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgcGFzc3dvcmQgPSAiIjsKLSU+Ci08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgPGxhYmVsIGZvcj0iPCU9dGFibGVDb250YWluZXJJZCsiX2lucHV0X3B1Ymxpc2hfdXJsIiU+Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX1VSTCIpJT48L2xhYmVsPgotICAgICAgICA8JQotICAgICAgICBpZiAoIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKSkKLSAgICAgICAgewotICAgICAgICAlPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQrIl9pbnB1dF9wdWJsaXNoX3VybCIlPiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCU+IiBjbGFzcz0idGV4dGVudGVyIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgIDxsYWJlbCBmb3I9IjwlPXRhYmxlQ29udGFpbmVySWQrIl9pbnB1dF91c2VyX2lkIiU+Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VU0VSSUQiKSU+PC9sYWJlbD4KLSAgICAgICAgPCUKLSAgICAgICAgaWYgKCFmb3JtVG9vbC5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpKQotICAgICAgICB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iPCU9dGFibGVDb250YWluZXJJZCsiX2lucHV0X3VzZXJfaWQiJT4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4iIHZhbHVlPSI8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHVzZXJuYW1lKSU+IiBjbGFzcz0idGV4dGVudGVyIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+PGxhYmVsIGZvcj0iPCU9dGFibGVDb250YWluZXJJZCsiX2lucHV0X3Bhc3N3b3JkIiU+Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QQVNTV09SRCIpJT48L3RkPjwvbGFiZWw+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBpZD0iPCU9dGFibGVDb250YWluZXJJZCsiX2lucHV0X3Bhc3N3b3JkIiU+IiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4iIHZhbHVlPSI8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHBhc3N3b3JkKSU+IiBjbGFzcz0idGV4dGVudGVyIj48L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmYmVlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvY2F0ZWdvcmllc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsKLSU+Ci08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4gCi0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxzdHJvbmc+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ0FURUdPUklFUyIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZENhdGVnb3J5Um93KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWRDYXRlZ29yeVJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+ICAKLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ0FURUdPUllfVFlQRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfS0VZX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0tFWV9WQUxVRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FDVElPTlMiKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUKLSAgIGlmICh0YWJsZUNvbnRhaW5lcklkLnN0YXJ0c1dpdGgoImZpbmRCdXNpbmVzc2VzIikpCi0gICB7Ly8gY29uZGl0aW9uIHRvIHR1cm4gb2ZmIGZvciBldmVyeXRoaW5nIG90aGVyIHRoYW4gZmluZCBieSBidXNpbmVzcyBzZWFyY2hlcy4KLSU+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQgaGVpZ2h0PTMwIHZhbGlnbj0iY2VudGVyIj4KLSAgICAgICAgPGxhYmVsIGZvcj0iYnVzaW5lc3NfY2F0ZWdvcmllcyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQlVTSU5FU1NfQ0FURUdPUklFUyIpJT48L2xhYmVsPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBoZWlnaHQ9MzAgdmFsaWduPSJjZW50ZXIiPgotICAgICAgICA8c2VsZWN0IGlkPSJidXNpbmVzc19jYXRlZ29yaWVzIiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci0gICAgICAgICAgPG9wdGlvbj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQlVTSU5FU1NFU19PTkxZIiklPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPUZpbmRRdWFsaWZpZXIuc2VydmljZVN1YnNldCU+Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fU0VSVklDRVNfT05MWSIpJT4KLSAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1GaW5kUXVhbGlmaWVyLmNvbWJpbmVDYXRlZ29yeUJhZ3MlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JPVEgiKSU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUgICAKLSAgIH0KLSU+ICAgICAKLTwvZGl2PiAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0NhdGVnb3JpZXNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNDYXRlZ29yaWVzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhOTMyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0NhdGVnb3JpZXNfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsKLSU+Ci08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9DQVRFR09SSUVTIiklPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6YWRkRGV0YWlsc0NhdGVnb3J5Um93KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRydWUpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW1vdmVTZWxlY3RlZERldGFpbHNDYXRlZ29yeVJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDplZGl0U2VsZWN0ZWREZXRhaWxzQ2F0ZWdvcnlSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19FRElUIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNhbmNlbFNlbGVjdGVkRGV0YWlsc0NhdGVnb3J5Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIiklPjwvYT4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NBVEVHT1JZX1RZUEUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0tFWV9OQU1FIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9LRVlfVkFMVUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BQ1RJT05TIiklPjwvdGg+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNEaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kZXRhaWxzRGlzY292ZXJ5VVJMc190YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjAyZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNEaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICBib29sZWFuIGhhc0Vycm9ycyA9ICgoQm9vbGVhbilzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKSkuYm9vbGVhblZhbHVlKCk7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7Ci0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+ICAKLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ESVNDT1ZFUllVUkxTIiklPjwvc3Ryb25nPgotPCUKLSAgIGlmIChoYXNFcnJvcnMpCi0gICB7Ci0lPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+ICAgICAgCi0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGREZXRhaWxzRGlzY292ZXJ5VVJMUm93KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRydWUpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW1vdmVTZWxlY3RlZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdFNlbGVjdGVkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2FuY2VsU2VsZWN0ZWREZXRhaWxzRGlzY292ZXJ5VVJMUm93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIiklPjwvYT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ESVNDT1ZFUllVUkwiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BQ1RJT05TIiklPjwvdGg+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNJZGVudGlmaWVyc190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0lkZW50aWZpZXJzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0lkZW50aWZpZXJzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7Ci0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxzdHJvbmc+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSURFTlRJRklFUlMiKSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGREZXRhaWxzSWRlbnRpZmllclJvdygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0cnVlKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWREZXRhaWxzSWRlbnRpZmllclJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDplZGl0U2VsZWN0ZWREZXRhaWxzSWRlbnRpZmllclJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2FuY2VsU2VsZWN0ZWREZXRhaWxzSWRlbnRpZmllclJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0NBTkNFTCIpJT48L2E+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JREVOVElGSUVSX1RZUEUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0tFWV9OQU1FIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9LRVlfVkFMVUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BQ1RJT05TIiklPjwvdGg+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNMYW5ndWFnZUlucHV0X3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kZXRhaWxzTGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NGYyYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNMYW5ndWFnZUlucHV0X3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdbXSBvdGhlclByb3BlcnRpZXMgPSAoU3RyaW5nW10pc2VjdGlvbkhlYWRlckluZm8uZ2V0T3RoZXJQcm9wZXJ0aWVzKCk7Ci0gICBTdHJpbmdbXSB0aXRsZUtleXMgPSB7b3RoZXJQcm9wZXJ0aWVzWzBdLG90aGVyUHJvcGVydGllc1sxXX07Ci0gICBib29sZWFuIGhhc0Vycm9ycyA9IG90aGVyUHJvcGVydGllc1syXS5lcXVhbHMoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHRpdGxlS2V5c1swXSklPjwvc3Ryb25nPgotPCUKLSAgIGlmIChoYXNFcnJvcnMpCi0gICB7Ci0lPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+ICAgICAgCi0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotPCUKLSAgIFN0cmluZyB0ZXh0Q29udHJvbFRpdGxlS2V5OwotICAgaWYgKHRpdGxlS2V5c1swXS5lcXVhbHMoIkZPUk1fTEFCRUxfTkFNRVMiKSkKLSAgICAgdGV4dENvbnRyb2xUaXRsZUtleSA9ICJGT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFIjsKLSAgIGVsc2UKLSAgICAgdGV4dENvbnRyb2xUaXRsZUtleSA9ICJGT1JNX0NPTlRST0xfVElUTEVfREVTQ1JJUFRJT05fVEVYVF9WQUxVRSI7Ci0lPiAgICAgICAgIAotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHRleHRDb250cm9sVGl0bGVLZXkpKSU+Jyx0cnVlKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDplZGl0U2VsZWN0ZWREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2FuY2VsU2VsZWN0ZWREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0NBTkNFTCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xBTkdVQUdFIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSh0aXRsZUtleXNbMV0pJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FDVElPTlMiKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc1NpbmdsZUl0ZW1fdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNTaW5nbGVJdGVtX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjN2NmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc1NpbmdsZUl0ZW1fdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZyBpdGVtSGVhZGVyID0gKFN0cmluZylzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKTsKLSU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWl0ZW1IZWFkZXIlPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUNUSU9OUyIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlZWJjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGlzY292ZXJ5VVJMc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgYm9vbGVhbiBoYXNFcnJvcnMgPSAoKEJvb2xlYW4pc2VjdGlvbkhlYWRlckluZm8uZ2V0T3RoZXJQcm9wZXJ0aWVzKCkpLmJvb2xlYW5WYWx1ZSgpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPiAgCi0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxzdHJvbmc+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRElTQ09WRVJZVVJMUyIpJT48L3N0cm9uZz4KLTwlCi0gICBpZiAoaGFzRXJyb3JzKQotICAgewotJT4KLSAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPiAgICAgICAgICAgICAgICAgIAotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6YWRkRGlzY292ZXJ5VVJMUm93KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ESVNDT1ZFUllVUkwiKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZmluZFF1YWxpZmllcnNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2ZpbmRRdWFsaWZpZXJzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2NmNhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZmluZFF1YWxpZmllcnNfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOyAgIAotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+PHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GSU5EUVVBTElGSUVSUyIpJT48L3N0cm9uZz48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkPjxsYWJlbCBmb3I9ImNvbWJpbmVfa2V5cyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ09NQklORV9LRVlTIiklPjwvbGFiZWw+PC90ZD4KLSAgICAgIDx0ZD4KLSAgICAgICAgPHNlbGVjdCBpZD0iY29tYmluZV9rZXlzIiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci0gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9RmluZFF1YWxpZmllci5hbmRBbGxLZXlzJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9BTkRBTExLRVlTIiklPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPUZpbmRRdWFsaWZpZXIub3JBbGxLZXlzJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9PUkFMTEtFWVMiKSU+Ci0gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9RmluZFF1YWxpZmllci5vckxpa2VLZXlzJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9PUkxJS0VLRVlTIiklPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU09SVF9CWV9OQU1FIiklPjwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9ImFkdmFuY2Vfc29ydF9ieV9uYW1lX2FzYyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TT1JUX0JZX05BTUUlPiIgdmFsdWU9IjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5TmFtZUFzYyU+IiBjaGVja2VkPjxsYWJlbCBmb3I9ImFkdmFuY2Vfc29ydF9ieV9uYW1lX2FzYyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU09SVF9BU0MiKSU+PC9sYWJlbD4KLSAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0iYWR2YW5jZV9zb3J0X2J5X25hbWVfZGVzYyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TT1JUX0JZX05BTUUlPiIgdmFsdWU9IjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5TmFtZURlc2MlPiI+PGxhYmVsIGZvcj0iYWR2YW5jZV9zb3J0X2J5X25hbWVfZGVzYyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU09SVF9ERVNDIiklPjwvbGFiZWw+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NPUlRfQllfREFURSIpJT48L3RkPgotICAgICAgPHRkPgotICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJhZHZhbmNlX3NvcnRfYnlfZGF0ZV9hc2MiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU09SVF9CWV9EQVRFJT4iIHZhbHVlPSI8JT1GaW5kUXVhbGlmaWVyLnNvcnRCeURhdGVBc2MlPiIgY2hlY2tlZD48bGFiZWwgZm9yPSJhZHZhbmNlX3NvcnRfYnlfZGF0ZV9hc2MiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX1NPUlRfQVNDIiklPjwvbGFiZWw+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9ImFkdmFuY2Vfc29ydF9ieV9kYXRlX2Rlc2MiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU09SVF9CWV9EQVRFJT4iIHZhbHVlPSI8JT1GaW5kUXVhbGlmaWVyLnNvcnRCeURhdGVEZXNjJT4iPjxsYWJlbCBmb3I9ImFkdmFuY2Vfc29ydF9ieV9kYXRlX2Rlc2MiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX1NPUlRfREVTQyIpJT48L2xhYmVsPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZmluZGZvcm1oZWFkZXIuaW5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2ZpbmRmb3JtaGVhZGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmOTAxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZmluZGZvcm1oZWFkZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh0aXRsZUltYWdlUGF0aCkpJT4iPgotICAgICAgPHN0cm9uZz48JT10aXRsZSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgd2lkdGg9IioiPiZuYnNwOzwvdGQ+Ci08JQotICAgaW50IGNvbHNwYW4gPSAyOwotICAgaWYgKHN1YlF1ZXJ5S2V5ICE9IG51bGwgJiYgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPiAwKQotICAgewotICAgICBpbnQgbm9kZUlkID0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpOwotICAgICBpbnQgdG9vbElkID0gZm9ybVRvb2wuZ2V0VG9vbElkKCk7Ci0gICAgIGludCB2aWV3SWQgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCk7Ci0gICAgIGludCB2aWV3VG9vbElkID0gc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKTsKLSAgICAgaW50IGNvdW50ID0gMTsKLSU+Ci0gICAgPHRkIGFsaWduPSJyaWdodCI+Ci0gICAgICA8YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0RmluZFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLCIiLGZhbHNlKSkpJT4iPjwlPWNvdW50JT48L2E+Ci0gICAgPC90ZD4KLTwlCi0gICAgIFN0cmluZyBjdXJyZW50U3ViUXVlcnlLZXkgPSBzdWJRdWVyeUtleTsKLSAgICAgaW50IHNlcGFyYXRvclBvcyA9IC0xOwotICAgICB3aGlsZSAoKHNlcGFyYXRvclBvcyA9IGN1cnJlbnRTdWJRdWVyeUtleS5pbmRleE9mKCc6JykpICE9IC0xKQotICAgICB7Ci0gICAgICAgY291bnQrKzsKLSU+Ci0gICAgPHRkIGFsaWduPSJyaWdodCI+Ci0gICAgICA8YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0RmluZFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLGN1cnJlbnRTdWJRdWVyeUtleS5zdWJzdHJpbmcoMCxzZXBhcmF0b3JQb3MpLGZhbHNlKSkpJT4iPjwlPWNvdW50JT48L2E+Ci0gICAgPC90ZD4gICAgICAKLTwlICAgCi0gICAgICAgY3VycmVudFN1YlF1ZXJ5S2V5ID0gY3VycmVudFN1YlF1ZXJ5S2V5LnN1YnN0cmluZyhzZXBhcmF0b3JQb3MrMSxjdXJyZW50U3ViUXVlcnlLZXkubGVuZ3RoKCkpOwotICAgICB9Ci0gICAgIGNvbHNwYW4gKz0gY291bnQ7Ci0gICB9Ci0lPiAgICAKLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjAgY29sc3Bhbj08JT1jb2xzcGFuJT4+IDxpbWcgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiIGFsaWduPSJ0b3AiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiI+IDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2lkZW50aWZpZXJzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9pZGVudGlmaWVyc190YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTk1ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2lkZW50aWZpZXJzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7ICAgCi0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxzdHJvbmc+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSURFTlRJRklFUlMiKSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGRJZGVudGlmaWVyUm93KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPiAgCi0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLSAgICAKLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JREVOVElGSUVSX1RZUEUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0tFWV9OQU1FIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9LRVlfVkFMVUUiKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTMyMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ1tdIG90aGVyUHJvcGVydGllcyA9IChTdHJpbmdbXSlzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKTsKLSAgIFN0cmluZ1tdIHRpdGxlS2V5cyA9IHtvdGhlclByb3BlcnRpZXNbMF0sb3RoZXJQcm9wZXJ0aWVzWzFdfTsKLSAgIGJvb2xlYW4gaGFzRXJyb3JzID0gb3RoZXJQcm9wZXJ0aWVzWzJdLmVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0gICBib29sZWFuIGlzRmluZCA9IHRhYmxlQ29udGFpbmVySWQuc3RhcnRzV2l0aCgiZmluZCIpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHRpdGxlS2V5c1swXSklPjwvc3Ryb25nPgotPCUKLSAgIGlmIChoYXNFcnJvcnMpCi0gICB7Ci0lPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotPCUKLSAgIFN0cmluZyB0ZXh0Q29udHJvbFRpdGxlS2V5OwotICAgaWYgKHRpdGxlS2V5c1swXS5lcXVhbHMoIkZPUk1fTEFCRUxfTkFNRVMiKSkKLSAgICAgdGV4dENvbnRyb2xUaXRsZUtleSA9ICJGT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFIjsKLSAgIGVsc2UKLSAgICAgdGV4dENvbnRyb2xUaXRsZUtleSA9ICJGT1JNX0NPTlRST0xfVElUTEVfREVTQ1JJUFRJT05fVEVYVF9WQUxVRSI7Ci0lPiAgICAgICAKLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6YWRkTGFuZ3VhZ2VJbnB1dFJvdygnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHRleHRDb250cm9sVGl0bGVLZXkpKSU+JykiPgotICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT4KLSAgICAgIDwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEFOR1VBR0UiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHRpdGxlS2V5c1sxXSklPjwvdGg+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwlIAotICAgaWYgKGlzRmluZCkKLSAgIHsvLyBjb25kaXRpb24gdG8gdHVybiBvZmYgd2hlbiBwdWJsaXNoaW5nIHRvIGNvbWUuCi0lPiAgICAgCi08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvbmFtZXNfZmluZFF1YWxpZmllcnNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIH0KLSU+ICAgICAKLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2xvZ2luX2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9sb2dpbl9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYThjNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2xvZ2luX2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTM2NDQ5IGJydW5zc2VuQHVzLmlibS5jb20gLSBWaW5jZSBCcnVuc3NlbiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQWJzdHJhY3RVRERJRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi1VRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLU5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0KLVJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKChBYnN0cmFjdFVERElFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0UmVnaXN0cnlFbGVtZW50KCk7Ci1TdHJpbmcgdXNlcm5hbWUgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotU3RyaW5nIHBhc3N3b3JkID0gcmVnRWxlbWVudC5nZXRDcmVkKCk7Ci1TdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotCi1pZiAodXNlcm5hbWUgPT0gbnVsbCkgewotCXVzZXJuYW1lID0gIiI7Ci19Ci0KLWlmIChwYXNzd29yZCA9PSBudWxsKSB7Ci0JcGFzc3dvcmQgPSAiIjsKLX0KLQotaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkgewotCXB1Ymxpc2hVUkwgPSAiIjsKLX0KLQotJT4KLSAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9PV05FRCU+IiB2YWx1ZT0idHJ1ZSIvPgotICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUlPiIgdmFsdWU9IlF1ZXJ5IFJlc3VsdHMiLz4KLSAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfU0VBUkNIX1NFVCU+IiB2YWx1ZT0iMTAwIi8+Ci0gIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1JFU1VMVFMlPiIgdmFsdWU9IjEwIi8+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICA8bGFiZWw+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUFVCTElTSF9VUkwiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgPHRkPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4iIHZhbHVlPSI8JT1wdWJsaXNoVVJMJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiLz4KLSAgICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgIDxsYWJlbD48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VU0VSSUQiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8JT11c2VybmFtZSU+IiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCU+IiBjbGFzcz0idGV4dGVudGVyIi8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPjxsYWJlbD48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QQVNTV09SRCIpJT48L2xhYmVsPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGlucHV0IHR5cGU9InBhc3N3b3JkIiB2YWx1ZSA9IjwlPXBhc3N3b3JkJT4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQlPiIgY2xhc3M9InRleHRlbnRlciIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9uYW1lc19maW5kUXVhbGlmaWVyc190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvbmFtZXNfZmluZFF1YWxpZmllcnNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2VlNjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9uYW1lc19maW5kUXVhbGlmaWVyc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLnVkZGk0ai51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImZpbmRfcXVhbGlmaWVyX2V4YWN0X25hbWVfbWF0Y2giIHZhbHVlPSI8JT1GaW5kUXVhbGlmaWVyLmV4YWN0TmFtZU1hdGNoJT4iPjxsYWJlbCBmb3I9ImZpbmRfcXVhbGlmaWVyX2V4YWN0X25hbWVfbWF0Y2giPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0VYQUNUX05BTUVfTUFUQ0giKSU+PC9sYWJlbD4KLSAgICA8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iZmluZF9xdWFsaWZpZXJfY2FzZV9zZW5zaXRpdmVfbWF0Y2giIHZhbHVlPSI8JT1GaW5kUXVhbGlmaWVyLmNhc2VTZW5zaXRpdmVNYXRjaCU+Ij48bGFiZWwgZm9yPSJmaW5kX3F1YWxpZmllcl9jYXNlX3NlbnNpdGl2ZV9tYXRjaCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ0FTRV9TRU5TSVRJVkVfTUFUQ0giKSU+PC9sYWJlbD4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9yZXN1bHRzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9yZXN1bHRzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNzgyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvcmVzdWx0c190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nW10gc3BlY2lmaWNJbmZvID0gKFN0cmluZ1tdKXNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpOwotICAgU3RyaW5nIHRpdGxlID0gc3BlY2lmaWNJbmZvWzBdOwotICAgU3RyaW5nIHBhcmVudENvbnRhaW5lcklkID0gc3BlY2lmaWNJbmZvWzFdOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXRpdGxlJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvcmVzdWx0c2Zvcm1oZWFkZXIuaW5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3Jlc3VsdHNmb3JtaGVhZGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzNzBlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvcmVzdWx0c2Zvcm1oZWFkZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRpdGxlSW1hZ2VQYXRoKSklPiI+Ci0gICAgICA8c3Ryb25nPjwlPXRpdGxlJT48L3N0cm9uZz4KLSAgICA8L3RkPgotPCUKLSAgIGludCBjb2xzcGFuID0gMTsKLSAgIGlmIChoYXNUYXJnZXQpCi0gICB7Ci0gICAgIFN0cmluZyByZXR1cm5MaW5rID0gVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb24uZ2V0QWN0aW9uTGlua0ZvclJldHVybigpOwotJT4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSIqIj4mbmJzcDs8L3RkPgotICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChyZXR1cm5MaW5rKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfVEFSR0VUIiklPjwvYT4KLSAgICA8L3RkPgotPCUKLSAgICAgY29sc3BhbiArPSAyOwotICAgfQotJT4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjAgY29sc3Bhbj08JT1jb2xzcGFuJT4+IDxpbWcgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiIGFsaWduPSJ0b3AiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiI+IDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY29sc3Bhbj08JT1jb2xzcGFuJT4+Ci08JQotICAgaWYgKGhhc1RhcmdldCkKLSAgIHsKLSU+Ci08JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TVUJRVUVSWSIpJT4KLTwlCi0gICB9Ci0lPgotPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUVVFUlkiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvdWRfY2F0ZWdvcmllc190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvdWRfY2F0ZWdvcmllc190YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzFhN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3VkX2NhdGVnb3JpZXNfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7Ci0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+IAotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTIiklPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gICAgPCEtLQotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRTZWxlY3RlZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRURJVCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjYW5jZWxTZWxlY3RlZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIiklPjwvYT4KLSAgICA8L3RkPgotICAgIC0tPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5OicnOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8IS0tCi0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIC0tPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgd2lkdGg9IjE1JSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3RoPgotICAgICAgPCEtLQotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgd2lkdGg9IjEwJSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ0hFQ0tFRCIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgd2lkdGg9IjcwJSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRklMRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgd2lkdGg9IioiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BQ1RJT05TIiklPjwvdGg+Ci0gICAgICAtLT4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c1B1Ymxpc2hlckFzc2VydGlvbnNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzUHVibGlzaGVyQXNzZXJ0aW9uc190YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZWZmZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzUHVibGlzaGVyQXNzZXJ0aW9uc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkJ1c2luZXNzRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nW10gc3BlY2lmaWNJbmZvID0gKFN0cmluZ1tdKXNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpOwotICAgU3RyaW5nIHRhYmxlVGl0bGVLZXkgPSBzcGVjaWZpY0luZm9bMF07Ci0gICBib29sZWFuIGhhc0Vycm9ycyA9IHNwZWNpZmljSW5mb1sxXS5lcXVhbHMoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotICAgU3RyaW5nIHF1ZXJ5SXRlbVN0cmluZyA9IHNwZWNpZmljSW5mb1syXTsKLSAgIFN0cmluZyBwYXJlbnRDb250YWluZXJJZCA9IHNwZWNpZmljSW5mb1szXTsKLSAgIFN0cmluZyB0cmFuc2ZlclRhcmdldEtleSA9IHNwZWNpZmljSW5mb1s0XTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSh0YWJsZVRpdGxlS2V5KSU+PC9zdHJvbmc+Ci08JQotICAgaWYgKGhhc0Vycm9ycykKLSAgIHsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4gICAgICAgICAKLSAgICA8L3RkPgotPCUKLSAgIGlmIChzZWN0aW9uSGVhZGVySW5mby5pc0R5bmFtaWMoKSkKLSAgIHsKLSU+ICAgICAgIAotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmluaXRpYXRlU3ViUXVlcnkoJzwlPXBhcmVudENvbnRhaW5lcklkJT4nLCc8JT10cmFuc2ZlclRhcmdldEtleSU+Jyw8JT1xdWVyeUl0ZW1TdHJpbmclPix0cnVlKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19HRVQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aW5pdGlhdGVTdWJRdWVyeSgnPCU9cGFyZW50Q29udGFpbmVySWQlPicsJzwlPXRyYW5zZmVyVGFyZ2V0S2V5JT4nLDwlPXF1ZXJ5SXRlbVN0cmluZyU+LGZhbHNlKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19GSU5EIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotPCUKLSAgIH0KLSU+ICAgICAgIAotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9KChCdXNpbmVzc0VsZW1lbnQpdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKS5nZXRCdXNpbmVzc0VudGl0eSgpLmdldERlZmF1bHROYW1lU3RyaW5nKCklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ESVJFQ1RJT04iKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BU1NFUlRJT05fVFlQRSIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGEwNjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nW10gc3BlY2lmaWNJbmZvID0gKFN0cmluZ1tdKXNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpOwotICAgU3RyaW5nIHRhYmxlVGl0bGVLZXkgPSBzcGVjaWZpY0luZm9bMF07Ci0gICBib29sZWFuIGhhc0Vycm9ycyA9IHNwZWNpZmljSW5mb1sxXS5lcXVhbHMoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotICAgU3RyaW5nIHF1ZXJ5SXRlbVN0cmluZyA9IHNwZWNpZmljSW5mb1syXTsKLSAgIFN0cmluZyBwYXJlbnRDb250YWluZXJJZCA9IHNwZWNpZmljSW5mb1szXTsKLSAgIFN0cmluZyB0cmFuc2ZlclRhcmdldEtleSA9IHNwZWNpZmljSW5mb1s0XTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSh0YWJsZVRpdGxlS2V5KSU+PC9zdHJvbmc+Ci08JQotICAgaWYgKGhhc0Vycm9ycykKLSAgIHsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4gICAgICAgICAKLSAgICA8L3RkPgotPCUKLSAgIGlmIChzZWN0aW9uSGVhZGVySW5mby5pc0R5bmFtaWMoKSkKLSAgIHsKLSU+ICAgICAgIAotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmluaXRpYXRlU3ViUXVlcnkoJzwlPXBhcmVudENvbnRhaW5lcklkJT4nLCc8JT10cmFuc2ZlclRhcmdldEtleSU+Jyw8JT1xdWVyeUl0ZW1TdHJpbmclPix0cnVlKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19HRVQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aW5pdGlhdGVTdWJRdWVyeSgnPCU9cGFyZW50Q29udGFpbmVySWQlPicsJzwlPXRyYW5zZmVyVGFyZ2V0S2V5JT4nLDwlPXF1ZXJ5SXRlbVN0cmluZyU+LGZhbHNlKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19GSU5EIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotPCUKLSAgIH0KLSU+ICAgICAgIAotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3NfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2J1c2luZXNzX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZkOTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3NfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q2YTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3Nlc19jbG9zZWRfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NWMwOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3Nlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzA0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2J1c2luZXNzZXNfb3Blbl9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2J1c2luZXNzZXNfb3Blbl9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDdjZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX29wZW5faGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9jYXRlZ29yeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2NhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxNGQ3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2NhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvZmluZF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvZmluZF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxOGQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2ZpbmRfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2ZpbmRfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9maW5kX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0MGEwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2ZpbmRfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9vcGVuX3JlZ2lzdHJ5X2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9vcGVuX3JlZ2lzdHJ5X2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzUwNjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL29wZW5fcmVnaXN0cnlfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU2OTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3B1Ymxpc2hfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3B1Ymxpc2hfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDI2M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcHVibGlzaF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyY2VmMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcHVibGlzaF9zZXJ2aWNlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX3NlcnZpY2VfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODk0ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX3NlcnZpY2VfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3B1Ymxpc2hfc2VydmljZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3B1Ymxpc2hfc2VydmljZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWVhNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoZXJfYXNzZXJ0aW9uc19lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcHVibGlzaGVyX2Fzc2VydGlvbnNfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmY4NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoZXJfYXNzZXJ0aW9uc19lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcHVibGlzaGVyX2Fzc2VydGlvbnNfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoZXJfYXNzZXJ0aW9uc19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTk5MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoZXJfYXNzZXJ0aW9uc19oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9xdWVyaWVzX2Nsb3NlZF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczN2Q3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9xdWVyaWVzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1NTAwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcXVlcmllc19vcGVuX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcXVlcmllc19vcGVuX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjYTE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfb3Blbl9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcXVlcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA3NjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcXVlcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9yZWZlcmVuY2VkX3NlcnZpY2VzX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9yZWZlcmVuY2VkX3NlcnZpY2VzX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWQ3OTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVmZXJlbmNlZF9zZXJ2aWNlc19lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVmZXJlbmNlZF9zZXJ2aWNlc19oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3JlZmVyZW5jZWRfc2VydmljZXNfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDE1MDZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVmZXJlbmNlZF9zZXJ2aWNlc19oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3JlZ2lzdHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVnaXN0cnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQzY2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVnaXN0cnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9yZWdzdHJ5Y2F0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3JlZ3N0cnljYXRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ZDU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3JlZ3N0cnljYXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTY3MTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMyNWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlX2ludGVyZmFjZXNfY2xvc2VkX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlX2ludGVyZmFjZXNfY2xvc2VkX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU0YTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ5ODIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19vcGVuX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX29wZW5faGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjYzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX29wZW5faGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlc19jbG9zZWRfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5OGY2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2NTQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX29wZW5fZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX29wZW5fZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MmI0YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlc19vcGVuX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlc19vcGVuX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZXNfb3Blbl9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODYwNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlc19vcGVuX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MjJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9idXNfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9idXNfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTQxNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy91bnB1Ymxpc2hfYnVzX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy91bnB1Ymxpc2hfYnVzX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX2J1c19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzBiMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy91bnB1Ymxpc2hfYnVzX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRkZDNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGJkODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy91bnB1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2VfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYjE5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3MTNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOGZiYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL25hdmlnYXRvcl9jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuTkFWSUdBVE9SX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL25hdmlnYXRvcl90b29sYmFyLmpzcCIpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEVOVCU+IiB0aXRsZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvbmF2aWdhdG9yX2NvbnRlbnQuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL25hdmlnYXRvcl9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3Mjk1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3RyZWV2aWV3LmNzcyIpKSU+Ij4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci0gIDwvc2NyaXB0PgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90cmVldmlldy5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08JQotICAgU3RyaW5nIHNlbGVjdGVkQW5jaG9yTmFtZSA9ICIiOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBpbnQgZm9jdXNlZE5vZGVJZCA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0Rm9jdXNlZE5vZGVJZCgpOwotICAgU3RyaW5nIGZvY3VzZWRBbmNob3JOYW1lID0gU3RyaW5nLnZhbHVlT2YoZm9jdXNlZE5vZGVJZCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpCi0gICB7Ci0gICAgIHNlbGVjdGVkQW5jaG9yTmFtZSA9IHNlbGVjdGVkTm9kZS5nZXRBbmNob3JOYW1lKCk7Ci0gICAgIGlmIChmb2N1c2VkTm9kZUlkID09IHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSkKLSAgICAgICBmb2N1c2VkQW5jaG9yTmFtZSA9IHNlbGVjdGVkQW5jaG9yTmFtZTsKLSAgIH0KLSU+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIG9uTG9hZD0ic2VsZi5sb2NhdGlvbi5oYXNoPScjPCU9Zm9jdXNlZEFuY2hvck5hbWUlPic7c2V0U2VsZWN0ZWRBbmNob3JOYW1lKCc8JT1zZWxlY3RlZEFuY2hvck5hbWUlPicpIiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0idHJlZWNvbnRlbnRib3JkZXIiPgotPCU9bmF2aWdhdG9yTWFuYWdlci5yZW5kZXJUcmVlVmlldyhyZXNwb25zZSklPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL25hdmlnYXRvcl90b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NzRiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgidWRkaS9hY3Rpb25zL1Jlc2l6ZVVERElGcmFtZXNBY3Rpb25KU1AuanNwIik7Ci0lPiAgCi08L2pzcDp1c2VCZWFuPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1GcmFtZU5hbWUuYXBwZW5kKFVERElGcmFtZU5hbWVzLk5BVklHQVRPUl9DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUHJvY2Vzc1VERElGcmFtZXNldHNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0yNSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9uYXZpZ2F0b3IuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmICh1ZGRpUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKTsKLSAgIGVsc2UKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9OQVZJR0FUT1IiKSU+PC90ZD4KLTwlCi0gICBTdHJpbmcgYWx0UmVmcmVzaCA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1JFRlJFU0giKTsKLSAgIFN0cmluZyBhbHRDbGVhciA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0NMRUFSIik7Ci0lPiAgIAotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVBY3Rpb25KU1AuanNwIikpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTYgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRSZWZyZXNoJT4iIHRpdGxlPSI8JT1hbHRSZWZyZXNoJT4iPjwvYT48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIikpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2IG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcykiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIiBhbHQ9IjwlPWFsdENsZWFyJT4iIHRpdGxlPSI8JT1hbHRDbGVhciU+Ij48L2E+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvcHJvcGVydGllc19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmZiYjU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuUFJPUEVSVElFU19UT09MQkFSJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc190b29sYmFyLmpzcCIpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5QUk9QRVJUSUVTX0NPTlRFTlQlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDIzNzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTwlCi0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROYXZpZ2F0b3JOb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIGlmIChzZWxlY3RlZE5hdmlnYXRvck5vZGUgIT0gbnVsbCkKLSAgIHsKLSAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXI7Ci0gICAgIGlmIChzZWxlY3RlZE5hdmlnYXRvck5vZGUuZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROYXZpZ2F0b3JOb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgIGVsc2UKLSAgICAgICB0b29sTWFuYWdlciA9IHNlbGVjdGVkTmF2aWdhdG9yTm9kZS5nZXRWaWV3VG9vbE1hbmFnZXIoKTsKLSAgICAgVG9vbCBzZWxlY3RlZFRvb2wgPSB0b29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgaWYgKHNlbGVjdGVkVG9vbCAhPSBudWxsICYmIHNlbGVjdGVkVG9vbC5nZXRUb29sVHlwZSgpICE9IFRvb2xUeXBlcy5BQ1RJT04pCi0gICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgbG9jYXRpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChzZWxlY3RlZFRvb2wuZ2V0Rm9ybUxpbmsoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0FDVElPTl9TRUxFQ1RFRCIpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi0gICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19OT0RFX1NFTEVDVEVEIiklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3Byb3BlcnRpZXNfdG9vbGJhci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MzlhZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3Byb3BlcnRpZXNfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgidWRkaS9hY3Rpb25zL1Jlc2l6ZVVERElGcmFtZXNBY3Rpb25KU1AuanNwIik7Ci0lPiAgCi08L2pzcDp1c2VCZWFuPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1GcmFtZU5hbWUuYXBwZW5kKFVERElGcmFtZU5hbWVzLlBST1BFUlRJRVNfQ09OVEFJTkVSKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1Byb2Nlc3NVRERJRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvYWN0aW9ucy5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci08JQotICAgU3RyaW5nIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBudWxsOwotICAgaWYgKHVkZGlQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgewotICAgICBpZiAodWRkaVBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKS5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19SRVNUT1JFIik7Ci0gICB9Ci0gICBpZiAoZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9PSBudWxsKQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFIik7Ci0lPiAgICAgICAgCi0gICAgICAgIDx0ZCBpZD0iZG91YmxlY2xpY2tjb2x1bW4iIHRpdGxlPSI8JT1kb3VibGVDbGlja0NvbHVtblRpdGxlJT4iIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0FDVElPTlMiKSU+PC90ZD4KLTwlCi0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROYXZpZ2F0b3JOb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIGlmIChzZWxlY3RlZE5hdmlnYXRvck5vZGUgIT0gbnVsbCkKLSAgIHsKLSAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXI7Ci0gICAgIGlmIChzZWxlY3RlZE5hdmlnYXRvck5vZGUuZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROYXZpZ2F0b3JOb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgIGVsc2UKLSAgICAgICB0b29sTWFuYWdlciA9IHNlbGVjdGVkTmF2aWdhdG9yTm9kZS5nZXRWaWV3VG9vbE1hbmFnZXIoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8dG9vbE1hbmFnZXIuZ2V0TnVtYmVyT2ZUb29scygpO2krKykKLSAgICAgewotICAgICAgIFRvb2wgdG9vbCA9IChUb29sKXRvb2xNYW5hZ2VyLmdldFRvb2woaSk7Ci0lPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48JT10b29sLnJlbmRlclRvb2wocmVzcG9uc2UsY29udHJvbGxlciklPjwvdGQ+Ci08JQotICAgICB9Ci0gICB9Ci0lPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy9jYnBhbmVzLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL2NicGFuZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzI3MTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL2NicGFuZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qIiAlPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIGNhdGVnb3J5QnJvd3NlcldpbmRvdyA9IHRvcDsKLSAgdmFyIGNhdGVnb3J5QnJvd3NlcldpbmRvd1dvcmtBcmVhID0gdG9wLmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuQ0FURUdPUklFU19XT1JLQVJFQSU+Il07Ci0gIHZhciBjYXRlZ29yeUJyb3dzZXJXaW5kb3dUb29sYmFyID0gY2F0ZWdvcnlCcm93c2VyV2luZG93LmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuQ0FURUdPUklFU19UT09MQkFSJT4iXTsKLSAgdmFyIGNhdGVnb3J5QnJvd3NlcldpbmRvd0NvbnRlbnQgPSBjYXRlZ29yeUJyb3dzZXJXaW5kb3cuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5DQVRFR09SSUVTX0NPTlRFTlQlPiJdOwotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy9kZXRhaWxzdGFibGVzLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL2RldGFpbHN0YWJsZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmRlMzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL2RldGFpbHN0YWJsZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTU1MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3codGFibGVDb250YWluZXJJZCx0ZXh0Q29udHJvbFRpdGxlLGhhc0Vycm9yKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIud2lkdGggPSAiNzAlIjsKLSAgICBjb2x1bW4zLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLQotICAgIHZhciByb3dDaGVja2JveCA9IGNyZWF0ZVJvd0NoZWNrYm94KCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIjwlPUFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCU+IikpOyA8JS8vIHZpZXdJZCU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLCIiKSk7IDwlLy8gb3JpZ2luYWwgbGFuZ3VhZ2UlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiIikpOyA8JS8vIG9yaWdpbmFsIHRleHQlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIix0ZXh0Q29udHJvbFRpdGxlKSk7IDwlLy8gY29udHJvbCB0aXRsZSU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLGhhc0Vycm9yKSk7IDwlLy8gbW9kZSU+Ci0gICAgaWYgKGhhc0Vycm9yKQotICAgIHsKLSAgICAgIHZhciBsYW5ndWFnZVNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgICAgbGFuZ3VhZ2VTZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgICAgcG9wdWxhdGVMYW5ndWFnZVNlbGVjdChsYW5ndWFnZVNlbGVjdCk7Ci0gICAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGxhbmd1YWdlU2VsZWN0KTsKLSAgICAgIAotICAgICAgdmFyIHRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICB0ZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICAgIHRleHRJbnB1dC50aXRsZSA9IHRleHRDb250cm9sVGl0bGU7Ci0gICAgICBjb2x1bW4yLmFwcGVuZENoaWxkKHRleHRJbnB1dCk7Ci0gICAgICAKLSAgICAgIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjMsdGFibGUucm93cy5sZW5ndGgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29sdW1uMS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOwotICAgICAgY29sdW1uMi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOwotICAgICAgYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjMsdGFibGUucm93cy5sZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4yKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMyk7Ci0gICAgCi0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4pCi0gIHsKLSAgICBmb3IgKHZhciBpPTA7aTxjb2x1bW4uY2hpbGROb2Rlcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGNvbHVtbi5yZW1vdmVDaGlsZChjb2x1bW4uY2hpbGROb2Rlc1tpXSk7Ci0gICAgICBpLS07Ci0gICAgfQotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd1JlbW92ZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgcmVtb3ZlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQocmVtb3ZlTGluaywicmVtb3ZlRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3ciLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIHJlbW92ZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChyZW1vdmVMaW5rKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgZWRpdExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgc2V0SlNMaW5rUm93VGFyZ2V0KGVkaXRMaW5rLCJlZGl0RGV0YWlsc0xhbmd1YWdlSW5wdXRSb3ciLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGVkaXRMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19FRElUIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGVkaXRMaW5rKTsgIAotICB9ICAKLSAgCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciBjYW5jZWxMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChjYW5jZWxMaW5rLCJjYW5jZWxEZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd0VkaXQiLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGNhbmNlbExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0NBTkNFTCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChjYW5jZWxMaW5rKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gZWRpdERldGFpbHNMYW5ndWFnZUlucHV0Um93KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tyb3dJbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgCi0gICAgdmFyIGxhbmdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZTsKLSAgICB2YXIgaW5wdXRWYWx1ZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZTsKLSAgICB2YXIgdGV4dENvbnRyb2xUaXRsZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXS52YWx1ZTsKLSAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID09ICJ0cnVlIikKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICByZXR1cm47Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID0gdHJ1ZTsKLSAgICB2YXIgY29sdW1uMUNvbnRyb2wgPSBjb2x1bW4xLmNoaWxkTm9kZXNbNV07Ci0gICAgCi0gICAgdmFyIGxhbmd1YWdlU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgcG9wdWxhdGVMYW5ndWFnZVNlbGVjdChsYW5ndWFnZVNlbGVjdCk7Ci0gICAgY29sdW1uMS5yZXBsYWNlQ2hpbGQobGFuZ3VhZ2VTZWxlY3QsY29sdW1uMUNvbnRyb2wpOwotICAgIGxhbmd1YWdlU2VsZWN0LmNsYXNzTmFtZSA9ICJzZWxlY3RsaXN0IjsKLSAgICBzZXRMYW5ndWFnZVNlbGVjdChsYW5ndWFnZVNlbGVjdCxsYW5nSWQpOwotICAgIAotICAgIHZhciBjb2x1bW4yQ29udHJvbCA9IGNvbHVtbjIuY2hpbGROb2Rlc1swXTsKLSAgICB2YXIgdGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4yLnJlcGxhY2VDaGlsZCh0ZXh0SW5wdXQsY29sdW1uMkNvbnRyb2wpOwotICAgIHRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIHRleHRJbnB1dC50aXRsZSA9IHRleHRDb250cm9sVGl0bGU7Ci0gICAgdGV4dElucHV0LnZhbHVlID0gaW5wdXRWYWx1ZTsKLQotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjMpOwotICAgIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjMscm93SW5kZXgpOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdyh0YWJsZUNvbnRhaW5lcklkLGluZGV4LHZpZXdJZCxsYW5nSWQsaW5wdXRWYWx1ZSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93cytpbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlID0gdmlld0lkOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZSA9IGxhbmdJZDsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWUgPSBpbnB1dFZhbHVlOwotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPT0gInRydWUiKTsKLSAgICB2YXIgY29sdW1uMUNvbnRyb2wgPSBjb2x1bW4xLmNoaWxkTm9kZXNbNV07Ci0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgc2V0TGFuZ3VhZ2VTZWxlY3QoY29sdW1uMUNvbnRyb2wsbGFuZ0lkKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgdmFyIHRlbXBTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICAgIHBvcHVsYXRlTGFuZ3VhZ2VTZWxlY3QodGVtcFNlbGVjdCk7Ci0gICAgICB2YXIgbGFuZ3VhZ2UgPSBzZXRMYW5ndWFnZVNlbGVjdCh0ZW1wU2VsZWN0LGxhbmdJZCk7Ci0gICAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShnZXREZWZhdWx0RGlzcGxheVN0cmluZyhsYW5ndWFnZSkpLGNvbHVtbjFDb250cm9sKTsKLSAgICB9Ci0gICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIGNvbHVtbjJDb250cm9sLnZhbHVlID0gaW5wdXRWYWx1ZTsKLSAgICBlbHNlCi0gICAgICBjb2x1bW4yLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShnZXREZWZhdWx0RGlzcGxheVN0cmluZyhpbnB1dFZhbHVlKSksY29sdW1uMkNvbnRyb2wpCi0gIH0KLSAgCi0gIGZ1bmN0aW9uIHJlbW92ZURldGFpbHNMYW5ndWFnZUlucHV0Um93KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB0YWJsZS5kZWxldGVSb3cocm93SW5kZXgpOwotICAgIGZpeERldGFpbHNMYW5ndWFnZUlucHV0Um93TGlua3ModGFibGVDb250YWluZXJJZCk7Ci0gIH0KLSAgICAKLSAgZnVuY3Rpb24gY2FuY2VsRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dFZGl0KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tyb3dJbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgCi0gICAgdmFyIHZpZXdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICB2YXIgbGFuZ0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgIHZhciBpbnB1dFZhbHVlID0gY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlOwotICAgIHZhciByb3dBY3Rpb25MaW5rSHJlZiA9IGNvbHVtbjMuY2hpbGROb2Rlc1tjb2x1bW4zLmNoaWxkTm9kZXMubGVuZ3RoLTFdLmhyZWY7Ci0gICAgaWYgKHJvd0FjdGlvbkxpbmtIcmVmLmluZGV4T2YoImphdmFzY3JpcHQ6Y2FuY2VsIikgIT0gMCkKLSAgICAgIHJldHVybjsKLSAgICAgIAotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9IGZhbHNlOwotICAgIAotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XTsKLSAgICB2YXIgdGVtcFNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIHBvcHVsYXRlTGFuZ3VhZ2VTZWxlY3QodGVtcFNlbGVjdCk7Ci0gICAgdmFyIGxhbmd1YWdlID0gc2V0TGFuZ3VhZ2VTZWxlY3QodGVtcFNlbGVjdCxsYW5nSWQpOwotICAgIGNvbHVtbjEucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGdldERlZmF1bHREaXNwbGF5U3RyaW5nKGxhbmd1YWdlKSksY29sdW1uMUNvbnRyb2wpOwotICAgIAotICAgIHZhciBjb2x1bW4yQ29udHJvbCA9IGNvbHVtbjIuY2hpbGROb2Rlc1swXTsKLSAgICBjb2x1bW4yLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShnZXREZWZhdWx0RGlzcGxheVN0cmluZyhpbnB1dFZhbHVlKSksY29sdW1uMkNvbnRyb2wpOwotCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uMyk7Ci0gICAgYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjMscm93SW5kZXgpOwotICB9Ci0KLSAgZnVuY3Rpb24gcmVtb3ZlU2VsZWN0ZWREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHJlbW92ZVNlbGVjdGVkUm93cyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmaXhEZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd0xpbmtzKHRhYmxlQ29udGFpbmVySWQpOwotICB9Ci0gIAotICBmdW5jdGlvbiBmaXhEZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd0xpbmtzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICA8JS8vIEZpeCB0aGUgbGlua3MlPgotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW2ldOwotICAgICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSBjb2x1bW5zLml0ZW0oMCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIAotICAgICAgZm9yICh2YXIgaj0xO2o8Y29sdW1ucy5sZW5ndGg7aisrKQotICAgICAgewotICAgICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgICBjb2x1bW5zLml0ZW0oaikuY2xhc3NOYW1lID0gInJvd2NvbG9yIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGNvbHVtbnMuaXRlbShqKS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgICB2YXIgbGluayA9IGNvbHVtbjMuY2hpbGROb2Rlc1tjb2x1bW4zLmNoaWxkTm9kZXMubGVuZ3RoLTFdOwotICAgICAgdmFyIHJlbW92ZUxpbms7Ci0gICAgICBpZiAobGluay5ocmVmLmluZGV4T2YoImphdmFzY3JpcHQ6cmVtb3ZlIikgPT0gMCkKLSAgICAgICAgcmVtb3ZlTGluayA9IHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlbW92ZUxpbmsgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4zKTsgICAgICAgICAgICAKLSAgICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPT0gInRydWUiKTsKLSAgICAgIGlmIChsaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpyZW1vdmUiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd1JlbW92ZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4zLGkpOwotICAgICAgZWxzZSBpZiAobGluay5ocmVmLmluZGV4T2YoImphdmFzY3JpcHQ6Y2FuY2VsIikgPT0gMCkKLSAgICAgICAgYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dDYW5jZWxBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMyxpKTsKLSAgICAgIGVsc2UgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmVkaXQiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMyxpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGVkaXRTZWxlY3RlZERldGFpbHNMYW5ndWFnZUlucHV0Um93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGVkaXREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdyh0YWJsZUNvbnRhaW5lcklkLGkpOwotICAgIH0KLSAgfQotICAgIAotICBmdW5jdGlvbiBjYW5jZWxTZWxlY3RlZERldGFpbHNMYW5ndWFnZUlucHV0Um93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGNhbmNlbERldGFpbHNMYW5ndWFnZUlucHV0Um93RWRpdCh0YWJsZUNvbnRhaW5lcklkLGkpOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0lkZW50aWZpZXJSb3codGFibGVDb250YWluZXJJZCxoYXNFcnJvcikKLSAgewotICAgIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIAotICAgIHZhciByb3dDaGVja2JveCA9IGNyZWF0ZVJvd0NoZWNrYm94KCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0gICAgCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMS53aWR0aCA9ICIxMCUiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIud2lkdGggPSAiNDAlIjsKLSAgICBjb2x1bW4zLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4zLndpZHRoID0gIjQwJSI7Ci0gICAgY29sdW1uNC5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIjwlPUFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCU+IikpOyA8JS8vIHZpZXdJZCU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLCIiKSk7IDwlLy8gb3JpZ2luYWwga2V5IHR5cGUlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiIikpOyA8JS8vIG9yaWdpbmFsIGtleSBuYW1lJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIiIpKTsgPCUvLyBvcmlnaW5hbCBrZXkgdmFsdWUlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIixoYXNFcnJvcikpOyA8JS8vIG1vZGUlPgotICAgIAotICAgIHZhciBpZGVudGlmaWVyVHlwZVNlbGVjdDsKLSAgICB2YXIga2V5TmFtZVRleHRJbnB1dDsKLSAgICBpZiAoaGFzRXJyb3IpCi0gICAgewotICAgICAgaWRlbnRpZmllclR5cGVTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICAgIGlkZW50aWZpZXJUeXBlU2VsZWN0Lm9uY2hhbmdlID0gaGFuZGxlSWRlbnRpZmllckNoYW5nZTsKLSAgICAgIHBvcHVsYXRlSWRlbnRpZmllclR5cGVTZWxlY3QoaWRlbnRpZmllclR5cGVTZWxlY3QpOwotICAgICAgaWRlbnRpZmllclR5cGVTZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgICAgY29sdW1uMS5hcHBlbmRDaGlsZChpZGVudGlmaWVyVHlwZVNlbGVjdCk7ICAgIAotICAgIAotICAgICAga2V5TmFtZVRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICBrZXlOYW1lVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgICBrZXlOYW1lVGV4dElucHV0LnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfTkFNRSIpJT4iOwotICAgICAgY29sdW1uMi5hcHBlbmRDaGlsZChrZXlOYW1lVGV4dElucHV0KTsKLQotICAgICAgdmFyIGtleVZhbHVlVGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgIGtleVZhbHVlVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgICBrZXlWYWx1ZVRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX1ZBTFVFIiklPiI7Ci0gICAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGtleVZhbHVlVGV4dElucHV0KTsgICAgICAKLSAgICAgIGFkZERldGFpbHNJZGVudGlmaWVyUm93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsdGFibGUucm93cy5sZW5ndGgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29sdW1uMS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOwotICAgICAgY29sdW1uMi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOwotICAgICAgY29sdW1uMy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOwotICAgICAgYWRkRGV0YWlsc0lkZW50aWZpZXJSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsdGFibGUucm93cy5sZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4yKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMyk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjQpOwotICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChuZXdSb3cpOwotICAgIGlmIChoYXNFcnJvcikKLSAgICAgIGtleU5hbWVUZXh0SW5wdXQudmFsdWUgPSBpZGVudGlmaWVyVHlwZVNlbGVjdC5vcHRpb25zWzBdLnRleHQ7Ci0gIH0KLQotICBmdW5jdGlvbiBhZGREZXRhaWxzSWRlbnRpZmllclJvd1JlbW92ZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgcmVtb3ZlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQocmVtb3ZlTGluaywicmVtb3ZlRGV0YWlsc0lkZW50aWZpZXJSb3ciLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIHJlbW92ZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChyZW1vdmVMaW5rKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0lkZW50aWZpZXJSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciBlZGl0TGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQoZWRpdExpbmssImVkaXREZXRhaWxzSWRlbnRpZmllclJvdyIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgZWRpdExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZWRpdExpbmspOwotICB9ICAKLQotICBmdW5jdGlvbiBhZGREZXRhaWxzSWRlbnRpZmllclJvd0NhbmNlbEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgY2FuY2VsTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQoY2FuY2VsTGluaywiY2FuY2VsRGV0YWlsc0lkZW50aWZpZXJSb3dFZGl0Iix0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KTsKLSAgICBjYW5jZWxMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19DQU5DRUwiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoY2FuY2VsTGluayk7ICAKLSAgfQotCi0gIGZ1bmN0aW9uIGVkaXREZXRhaWxzSWRlbnRpZmllclJvdyh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3Nbcm93SW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIAotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgIHZhciBjb2x1bW4zID0gY29sdW1ucy5pdGVtKDMpOwotICAgIHZhciBjb2x1bW40ID0gY29sdW1ucy5pdGVtKDQpOwotICAgIAotICAgIHZhciB0TW9kZWxLZXkgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWUgICAgIAotICAgIHZhciBrZXlOYW1lID0gY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlOwotICAgIHZhciBrZXlWYWx1ZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXS52YWx1ZTsKLSAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID09ICJ0cnVlIikKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICByZXR1cm47Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID0gdHJ1ZTsKLSAgICAKLSAgICB2YXIgY29sdW1uMUNvbnRyb2wgPSBjb2x1bW4xLmNoaWxkTm9kZXNbNV07Ci0gICAgdmFyIGlkZW50aWZpZXJUeXBlU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgaWRlbnRpZmllclR5cGVTZWxlY3Qub25jaGFuZ2UgPSBoYW5kbGVJZGVudGlmaWVyQ2hhbmdlOwotICAgIHBvcHVsYXRlSWRlbnRpZmllclR5cGVTZWxlY3QoaWRlbnRpZmllclR5cGVTZWxlY3QpOwotICAgIGNvbHVtbjEucmVwbGFjZUNoaWxkKGlkZW50aWZpZXJUeXBlU2VsZWN0LGNvbHVtbjFDb250cm9sKTsKLSAgICBpZGVudGlmaWVyVHlwZVNlbGVjdC5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCI7Ci0gICAgc2V0VE1vZGVsS2V5U2VsZWN0KGlkZW50aWZpZXJUeXBlU2VsZWN0LHRNb2RlbEtleSk7ICAgIAotICAgIAotICAgIHZhciBjb2x1bW4yQ29udHJvbCA9IGNvbHVtbjIuY2hpbGROb2Rlc1swXTsKLSAgICB2YXIga2V5TmFtZVRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgY29sdW1uMi5yZXBsYWNlQ2hpbGQoa2V5TmFtZVRleHRJbnB1dCxjb2x1bW4yQ29udHJvbCk7Ci0gICAga2V5TmFtZVRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIGtleU5hbWVUZXh0SW5wdXQudGl0bGUgPSAiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FIiklPiI7Ci0gICAga2V5TmFtZVRleHRJbnB1dC52YWx1ZSA9IGtleU5hbWU7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjNDb250cm9sID0gY29sdW1uMy5jaGlsZE5vZGVzWzBdOwotICAgIHZhciBrZXlWYWx1ZVRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgY29sdW1uMy5yZXBsYWNlQ2hpbGQoa2V5VmFsdWVUZXh0SW5wdXQsY29sdW1uM0NvbnRyb2wpOwotICAgIGtleVZhbHVlVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAga2V5VmFsdWVUZXh0SW5wdXQudGl0bGUgPSAiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9WQUxVRSIpJT4iOwotICAgIGtleVZhbHVlVGV4dElucHV0LnZhbHVlID0ga2V5VmFsdWU7Ci0gICAKLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW40KTsKLSAgICAKLSAgICBhZGREZXRhaWxzSWRlbnRpZmllclJvd0NhbmNlbEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW40LHJvd0luZGV4KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldERldGFpbHNJZGVudGlmaWVyUm93KHRhYmxlQ29udGFpbmVySWQsaW5kZXgsdmlld0lkLHRNb2RlbEtleSxrZXlOYW1lLGtleVZhbHVlKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3NbbnVtYmVyT2ZIZWFkZXJSb3dzK2luZGV4XTsKLSAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMF0udmFsdWUgPSB2aWV3SWQ7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlID0gdE1vZGVsS2V5OwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZSA9IGtleU5hbWU7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzNdLnZhbHVlID0ga2V5VmFsdWU7Ci0gICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XTsKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICBzZXRUTW9kZWxLZXlTZWxlY3QoY29sdW1uMUNvbnRyb2wsdE1vZGVsS2V5KTsKLSAgICBlbHNlCi0gICAgewotICAgICAgdmFyIHRlbXBTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICAgIHBvcHVsYXRlSWRlbnRpZmllclR5cGVTZWxlY3QodGVtcFNlbGVjdCk7Ci0gICAgICB2YXIgdE1vZGVsS2V5VmFsdWUgPSBzZXRUTW9kZWxLZXlTZWxlY3QodGVtcFNlbGVjdCx0TW9kZWxLZXkpOwotICAgICAgY29sdW1uMS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodE1vZGVsS2V5VmFsdWUpLGNvbHVtbjFDb250cm9sKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHZhciBjb2x1bW4yQ29udHJvbCA9IGNvbHVtbjIuY2hpbGROb2Rlc1swXTsKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICBjb2x1bW4yQ29udHJvbC52YWx1ZSA9IGtleU5hbWU7Ci0gICAgZWxzZQotICAgICAgY29sdW1uMi5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoa2V5TmFtZSksY29sdW1uMkNvbnRyb2wpOwotICAgICAgCi0gICAgdmFyIGNvbHVtbjNDb250cm9sID0gY29sdW1uMy5jaGlsZE5vZGVzWzBdOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIGNvbHVtbjNDb250cm9sLnZhbHVlID0ga2V5VmFsdWU7Ci0gICAgZWxzZQotICAgICAgY29sdW1uMy5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoa2V5VmFsdWUpLGNvbHVtbjNDb250cm9sKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHJlbW92ZURldGFpbHNJZGVudGlmaWVyUm93KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB0YWJsZS5kZWxldGVSb3cocm93SW5kZXgpOwotICAgIGZpeERldGFpbHNJZGVudGlmaWVyUm93TGlua3ModGFibGVDb250YWluZXJJZCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbERldGFpbHNJZGVudGlmaWVyUm93RWRpdCh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3Nbcm93SW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgIHZhciBjb2x1bW4zID0gY29sdW1ucy5pdGVtKDMpOwotICAgIHZhciBjb2x1bW40ID0gY29sdW1ucy5pdGVtKDQpOwotICAgIAotICAgIHZhciB2aWV3SWQgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgdmFyIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZTsKLSAgICB2YXIga2V5TmFtZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZTsKLSAgICB2YXIga2V5VmFsdWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbM10udmFsdWU7Ci0gICAgdmFyIHJvd0FjdGlvbkxpbmtIcmVmID0gY29sdW1uNC5jaGlsZE5vZGVzW2NvbHVtbjQuY2hpbGROb2Rlcy5sZW5ndGgtMV0uaHJlZjsKLSAgICBpZiAocm93QWN0aW9uTGlua0hyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpjYW5jZWwiKSAhPSAwKQotICAgICAgcmV0dXJuOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9IGZhbHNlOwotICAgIAotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XTsKLSAgICB2YXIgdGVtcFNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIHBvcHVsYXRlSWRlbnRpZmllclR5cGVTZWxlY3QodGVtcFNlbGVjdCk7Ci0gICAgdmFyIHRNb2RlbEtleVZhbHVlID0gc2V0VE1vZGVsS2V5U2VsZWN0KHRlbXBTZWxlY3QsdE1vZGVsS2V5KTsKLSAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0TW9kZWxLZXlWYWx1ZSksY29sdW1uMUNvbnRyb2wpOwotICAgIAotICAgIHZhciBjb2x1bW4yQ29udHJvbCA9IGNvbHVtbjIuY2hpbGROb2Rlc1swXTsKLSAgICBjb2x1bW4yLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShrZXlOYW1lKSxjb2x1bW4yQ29udHJvbCk7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjNDb250cm9sID0gY29sdW1uMy5jaGlsZE5vZGVzWzBdOwotICAgIGNvbHVtbjMucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleVZhbHVlKSxjb2x1bW4zQ29udHJvbCk7Ci0KLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW40KTsKLSAgICBhZGREZXRhaWxzSWRlbnRpZmllclJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCxyb3dJbmRleCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHJlbW92ZVNlbGVjdGVkRGV0YWlsc0lkZW50aWZpZXJSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICByZW1vdmVTZWxlY3RlZFJvd3ModGFibGVDb250YWluZXJJZCk7Ci0gICAgPCUvLyBGaXggdGhlIGxpbmtzJT4KLSAgICBmaXhEZXRhaWxzSWRlbnRpZmllclJvd0xpbmtzKHRhYmxlQ29udGFpbmVySWQpOwotICB9Ci0gIAotICBmdW5jdGlvbiBmaXhEZXRhaWxzSWRlbnRpZmllclJvd0xpbmtzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93ID0gdGFibGUucm93c1tpXTsKLSAgICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gY29sdW1ucy5pdGVtKDApLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBmb3IgKHZhciBqPTE7ajxjb2x1bW5zLmxlbmd0aDtqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICAgIGNvbHVtbnMuaXRlbShqKS5jbGFzc05hbWUgPSAicm93Y29sb3IiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgY29sdW1ucy5pdGVtKGopLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAgIH0KLSAgICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgICAgdmFyIHZpZXdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICAgIHZhciBjb2x1bW40ID0gY29sdW1ucy5pdGVtKDQpOwotICAgICAgdmFyIGxpbmsgPSBjb2x1bW40LmNoaWxkTm9kZXNbY29sdW1uNC5jaGlsZE5vZGVzLmxlbmd0aC0xXTsKLSAgICAgIHZhciByZW1vdmVMaW5rOwotICAgICAgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OnJlbW92ZSIpID09IDApCi0gICAgICAgIHJlbW92ZUxpbmsgPSB0cnVlOwotICAgICAgZWxzZQotICAgICAgICByZW1vdmVMaW5rID0gZmFsc2U7ICAgICAgCi0gICAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW40KTsKLSAgICAgIAotICAgICAgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OnJlbW92ZSIpID09IDApCi0gICAgICAgIGFkZERldGFpbHNJZGVudGlmaWVyUm93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsaSk7Ci0gICAgICBlbHNlIGlmIChsaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDplZGl0IikgPT0gMCkKLSAgICAgICAgYWRkRGV0YWlsc0lkZW50aWZpZXJSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsaSk7Ci0gICAgICBlbHNlIGlmIChsaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpjYW5jZWwiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzSWRlbnRpZmllclJvd0NhbmNlbEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW40LGkpOwotICAgIH0gIAotICB9Ci0gIAotICBmdW5jdGlvbiBlZGl0U2VsZWN0ZWREZXRhaWxzSWRlbnRpZmllclJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBlZGl0RGV0YWlsc0lkZW50aWZpZXJSb3codGFibGVDb250YWluZXJJZCxpKTsKLSAgICB9ICAKLSAgfQotICAKLSAgZnVuY3Rpb24gY2FuY2VsU2VsZWN0ZWREZXRhaWxzSWRlbnRpZmllclJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBjYW5jZWxEZXRhaWxzSWRlbnRpZmllclJvd0VkaXQodGFibGVDb250YWluZXJJZCxpKTsKLSAgICB9ICAKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0NhdGVnb3J5Um93KHRhYmxlQ29udGFpbmVySWQsaGFzRXJyb3IpCi0gIHsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW40ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICAKLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotICAgIAotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjEud2lkdGggPSAiNSUiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIud2lkdGggPSAiNTUlIjsKLSAgICBjb2x1bW4zLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4zLndpZHRoID0gIjI1JSI7Ci0gICAgY29sdW1uNC5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIjwlPUFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCU+IikpOyA8JS8vIHZpZXdJZCU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLCIiKSk7IDwlLy8gb3JpZ2luYWwga2V5IHR5cGUlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiIikpOyA8JS8vIG9yaWdpbmFsIGtleSBuYW1lJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIiIpKTsgPCUvLyBvcmlnaW5hbCBrZXkgdmFsdWUlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIixoYXNFcnJvcikpOyA8JS8vIG1vZGUlPgotICAgIAotICAgIGlmIChoYXNFcnJvcikKLSAgICB7Ci0gICAgICB2YXIgY2F0ZWdvcnlUeXBlU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgICBwb3B1bGF0ZUNhdGVnb3J5VHlwZVNlbGVjdChjYXRlZ29yeVR5cGVTZWxlY3QpOwotICAgICAgY2F0ZWdvcnlUeXBlU2VsZWN0LmNsYXNzTmFtZSA9ICJzZWxlY3RsaXN0IjsKLSAgICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY2F0ZWdvcnlUeXBlU2VsZWN0KTsKLSAgICAgIAotICAgICAgdmFyIGtleU5hbWVUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAga2V5TmFtZVRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgICAga2V5TmFtZVRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FIiklPiI7Ci0gICAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGtleU5hbWVUZXh0SW5wdXQpOwotICAgICAgCi0gICAgICB2YXIga2V5VmFsdWVUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAga2V5VmFsdWVUZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICAgIGtleVZhbHVlVGV4dElucHV0LnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfS0VZX1ZBTFVFIiklPiI7Ci0gICAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGtleVZhbHVlVGV4dElucHV0KTsKLSAgICAgIGFkZENhdGVnb3J5Um93QnJvd3NlTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsdGFibGUucm93cy5sZW5ndGgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29sdW1uMS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOwotICAgICAgY29sdW1uMi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOwotICAgICAgY29sdW1uMy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOwotICAgICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW40LHRhYmxlLnJvd3MubGVuZ3RoKTsKLSAgICB9Ci0gICAgICAKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4yKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMyk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjQpOwotICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChuZXdSb3cpOyAgICAgIAotICB9Ci0KLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0NhdGVnb3J5Um93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciBjYW5jZWxMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChjYW5jZWxMaW5rLCJjYW5jZWxEZXRhaWxzQ2F0ZWdvcnlSb3dFZGl0Iix0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KTsKLSAgICBjYW5jZWxMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19DQU5DRUwiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoY2FuY2VsTGluayk7ICAKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNDYXRlZ29yeVJvd0Jyb3dzZUNhbmNlbEFjdGlvbkxpbmtzKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgYWRkQ2F0ZWdvcnlSb3dCcm93c2VMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSk7Ci0gICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCk7Ci0gIH0KLQotICBmdW5jdGlvbiBhZGREZXRhaWxzQ2F0ZWdvcnlSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciBlZGl0TGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQoZWRpdExpbmssImVkaXREZXRhaWxzQ2F0ZWdvcnlSb3ciLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGVkaXRMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19FRElUIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGVkaXRMaW5rKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNDYXRlZ29yeVJvd1JlbW92ZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgcmVtb3ZlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQocmVtb3ZlTGluaywicmVtb3ZlRGV0YWlsc0NhdGVnb3J5Um93Iix0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KTsKLSAgICByZW1vdmVMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQocmVtb3ZlTGluayk7ICAKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNDYXRlZ29yeVJvd0Jyb3dzZVJlbW92ZUFjdGlvbkxpbmtzKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgYWRkQ2F0ZWdvcnlSb3dCcm93c2VMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSk7Ci0gICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCk7Ci0gIH0KLQotICBmdW5jdGlvbiBlZGl0RGV0YWlsc0NhdGVnb3J5Um93KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tyb3dJbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgdmFyIGNvbHVtbjQgPSBjb2x1bW5zLml0ZW0oNCk7Ci0gICAgCi0gICAgdmFyIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZQotICAgIHZhciBrZXlOYW1lID0gY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlOwotICAgIHZhciBrZXlWYWx1ZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXS52YWx1ZTsKLSAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID09ICJ0cnVlIikKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICByZXR1cm47Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID0gdHJ1ZTsKLSAgICAKLSAgICB2YXIgY29sdW1uMUNvbnRyb2wgPSBjb2x1bW4xLmNoaWxkTm9kZXNbNV07Ci0gICAgdmFyIGNhdGVnb3J5VHlwZVNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIHBvcHVsYXRlQ2F0ZWdvcnlUeXBlU2VsZWN0KGNhdGVnb3J5VHlwZVNlbGVjdCk7Ci0gICAgY29sdW1uMS5yZXBsYWNlQ2hpbGQoY2F0ZWdvcnlUeXBlU2VsZWN0LGNvbHVtbjFDb250cm9sKTsKLSAgICBjYXRlZ29yeVR5cGVTZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgIHNldFRNb2RlbEtleVNlbGVjdChjYXRlZ29yeVR5cGVTZWxlY3QsdE1vZGVsS2V5KTsgICAgCi0gICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIHZhciBrZXlOYW1lVGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4yLnJlcGxhY2VDaGlsZChrZXlOYW1lVGV4dElucHV0LGNvbHVtbjJDb250cm9sKTsKLSAgICBrZXlOYW1lVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAga2V5TmFtZVRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FIiklPiI7Ci0gICAga2V5TmFtZVRleHRJbnB1dC52YWx1ZSA9IGtleU5hbWU7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjNDb250cm9sID0gY29sdW1uMy5jaGlsZE5vZGVzWzBdOwotICAgIHZhciBrZXlWYWx1ZVRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgY29sdW1uMy5yZXBsYWNlQ2hpbGQoa2V5VmFsdWVUZXh0SW5wdXQsY29sdW1uM0NvbnRyb2wpOwotICAgIGtleVZhbHVlVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAga2V5VmFsdWVUZXh0SW5wdXQudGl0bGUgPSAiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfVkFMVUUiKSU+IjsKLSAgICBrZXlWYWx1ZVRleHRJbnB1dC52YWx1ZSA9IGtleVZhbHVlOwotICAgIAotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjQpOwotICAgIAotICAgIGFkZERldGFpbHNDYXRlZ29yeVJvd0Jyb3dzZUNhbmNlbEFjdGlvbkxpbmtzKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCxyb3dJbmRleCk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXREZXRhaWxzQ2F0ZWdvcnlSb3codGFibGVDb250YWluZXJJZCxpbmRleCx2aWV3SWQsdE1vZGVsS2V5LGtleU5hbWUsa2V5VmFsdWUpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3MraW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgIHZhciBjb2x1bW4zID0gY29sdW1ucy5pdGVtKDMpOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZSA9IHZpZXdJZDsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWUgPSB0TW9kZWxLZXk7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlID0ga2V5TmFtZTsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbM10udmFsdWUgPSBrZXlWYWx1ZTsKLSAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID09ICJ0cnVlIik7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjFDb250cm9sID0gY29sdW1uMS5jaGlsZE5vZGVzWzVdOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIHNldFRNb2RlbEtleVNlbGVjdChjb2x1bW4xQ29udHJvbCx0TW9kZWxLZXkpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YXIgdGVtcFNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgICAgcG9wdWxhdGVDYXRlZ29yeVR5cGVTZWxlY3QodGVtcFNlbGVjdCk7Ci0gICAgICB2YXIgdE1vZGVsS2V5VmFsdWUgPSBzZXRUTW9kZWxLZXlTZWxlY3QodGVtcFNlbGVjdCx0TW9kZWxLZXkpOwotICAgICAgY29sdW1uMS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodE1vZGVsS2V5VmFsdWUpLGNvbHVtbjFDb250cm9sKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHZhciBjb2x1bW4yQ29udHJvbCA9IGNvbHVtbjIuY2hpbGROb2Rlc1swXTsKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICBjb2x1bW4yQ29udHJvbC52YWx1ZSA9IGtleU5hbWU7Ci0gICAgZWxzZQotICAgICAgY29sdW1uMi5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoa2V5TmFtZSksY29sdW1uMkNvbnRyb2wpOwotICAgICAgCi0gICAgdmFyIGNvbHVtbjNDb250cm9sID0gY29sdW1uMy5jaGlsZE5vZGVzWzBdOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIGNvbHVtbjNDb250cm9sLnZhbHVlID0ga2V5VmFsdWU7Ci0gICAgZWxzZQotICAgICAgY29sdW1uMy5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoa2V5VmFsdWUpLGNvbHVtbjNDb250cm9sKTsgCi0gIH0KLQotICBmdW5jdGlvbiByZW1vdmVEZXRhaWxzQ2F0ZWdvcnlSb3codGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleCk7Ci0gICAgZml4RGV0YWlsc0NhdGVnb3J5Um93TGlua3ModGFibGVDb250YWluZXJJZCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbERldGFpbHNDYXRlZ29yeVJvd0VkaXQodGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW3Jvd0luZGV4XTsKLSAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICB2YXIgY29sdW1uNCA9IGNvbHVtbnMuaXRlbSg0KTsKLSAgICAKLSAgICB2YXIgdmlld0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgIHZhciB0TW9kZWxLZXkgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWU7Ci0gICAgdmFyIGtleU5hbWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWU7Ci0gICAgdmFyIGtleVZhbHVlID0gY29sdW1uMS5jaGlsZE5vZGVzWzNdLnZhbHVlOwotICAgIHZhciByb3dBY3Rpb25MaW5rSHJlZiA9IGNvbHVtbjQuY2hpbGROb2Rlc1tjb2x1bW40LmNoaWxkTm9kZXMubGVuZ3RoLTFdLmhyZWY7Ci0gICAgaWYgKHJvd0FjdGlvbkxpbmtIcmVmLmluZGV4T2YoImphdmFzY3JpcHQ6Y2FuY2VsIikgIT0gMCkKLSAgICAgIHJldHVybjsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPSBmYWxzZTsKLSAgICAKLSAgICB2YXIgY29sdW1uMUNvbnRyb2wgPSBjb2x1bW4xLmNoaWxkTm9kZXNbNV07Ci0gICAgdmFyIHRlbXBTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICBwb3B1bGF0ZUNhdGVnb3J5VHlwZVNlbGVjdCh0ZW1wU2VsZWN0KTsKLSAgICB2YXIgdE1vZGVsS2V5VmFsdWUgPSBzZXRUTW9kZWxLZXlTZWxlY3QodGVtcFNlbGVjdCx0TW9kZWxLZXkpOwotICAgIGNvbHVtbjEucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRNb2RlbEtleVZhbHVlKSxjb2x1bW4xQ29udHJvbCk7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIGNvbHVtbjIucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleU5hbWUpLGNvbHVtbjJDb250cm9sKTsKLSAgICAKLSAgICB2YXIgY29sdW1uM0NvbnRyb2wgPSBjb2x1bW4zLmNoaWxkTm9kZXNbMF07Ci0gICAgY29sdW1uMy5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoa2V5VmFsdWUpLGNvbHVtbjNDb250cm9sKTsKLQotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjQpOyAgICAKLSAgICBhZGREZXRhaWxzQ2F0ZWdvcnlSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQscm93SW5kZXgpOwotICAgIGlmIChyb3dJbmRleCA9PSB0YXJnZXRDYXRlZ29yeVJvdykKLSAgICAgIGNsb3NlQ2F0ZWdvcnlCcm93c2VyKCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHJlbW92ZVNlbGVjdGVkRGV0YWlsc0NhdGVnb3J5Um93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgcmVtb3ZlU2VsZWN0ZWRSb3dzKHRhYmxlQ29udGFpbmVySWQpOwotICAgIDwlLy8gRml4IHRoZSBsaW5rcyU+Ci0gICAgZml4RGV0YWlsc0NhdGVnb3J5Um93TGlua3ModGFibGVDb250YWluZXJJZCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGZpeERldGFpbHNDYXRlZ29yeVJvd0xpbmtzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93ID0gdGFibGUucm93c1tpXTsKLSAgICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gY29sdW1ucy5pdGVtKDApLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBmb3IgKHZhciBqPTE7ajxjb2x1bW5zLmxlbmd0aDtqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICAgIGNvbHVtbnMuaXRlbShqKS5jbGFzc05hbWUgPSAicm93Y29sb3IiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgY29sdW1ucy5pdGVtKGopLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAgIH0KLSAgICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgICAgdmFyIHZpZXdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICAgIHZhciBjb2x1bW40ID0gY29sdW1ucy5pdGVtKDQpOwotPCUgICAgICAKLSAgICAgIC8vIEJyb3dzZSwgUmVtb3ZlCi0gICAgICAvLyBCcm93c2UsIENhbmNlbAotICAgICAgLy8gRWRpdAotICAgICAgLy8gQnJvd3NlCi0lPiAgICAgIAotICAgICAgdmFyIGxhc3RMaW5rID0gY29sdW1uNC5jaGlsZE5vZGVzW2NvbHVtbjQuY2hpbGROb2Rlcy5sZW5ndGgtMV07Ci0gICAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW40KTsKLSAgICAgIGlmIChsYXN0TGluay5ocmVmLmluZGV4T2YoImphdmFzY3JpcHQ6cmVtb3ZlIikgPT0gMCkKLSAgICAgICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93QnJvd3NlUmVtb3ZlQWN0aW9uTGlua3ModGFibGVDb250YWluZXJJZCxjb2x1bW40LGkpOwotICAgICAgZWxzZSBpZiAobGFzdExpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmNhbmNlbCIpID09IDApCi0gICAgICAgIGFkZERldGFpbHNDYXRlZ29yeVJvd0Jyb3dzZUNhbmNlbEFjdGlvbkxpbmtzKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCxpKTsKLSAgICAgIGVsc2UgaWYgKGxhc3RMaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDplZGl0IikgPT0gMCkKLSAgICAgICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW40LGkpOwotICAgICAgZWxzZSBpZiAobGFzdExpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0Om9wZW4iKSA9PSAwKQotICAgICAgICBhZGRDYXRlZ29yeVJvd0Jyb3dzZUxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW40LGkpOwotICAgIH0gIAotICB9Ci0gIAotICBmdW5jdGlvbiBlZGl0U2VsZWN0ZWREZXRhaWxzQ2F0ZWdvcnlSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgZWRpdERldGFpbHNDYXRlZ29yeVJvdyh0YWJsZUNvbnRhaW5lcklkLGkpOwotICAgIH0gIAotICB9Ci0gIAotICBmdW5jdGlvbiBjYW5jZWxTZWxlY3RlZERldGFpbHNDYXRlZ29yeVJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBjYW5jZWxEZXRhaWxzQ2F0ZWdvcnlSb3dFZGl0KHRhYmxlQ29udGFpbmVySWQsaSk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93KHRhYmxlQ29udGFpbmVySWQsdE1vZGVsS2V5LGNhdGVnb3J5TmFtZSxpc0NoZWNrZWQsZmlsZU5hbWUsaGFzRXJyb3IpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICAvL3ZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgLy92YXIgY29sdW1uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgLy92YXIgY29sdW1uMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgLy92YXIgY29sdW1uNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgCi0gICAgLy9jb2x1bW4wLmNsYXNzTmFtZSA9ICJjaGVja2JveGNlbGxzIjsKLSAgICBjb2x1bW4xLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4xLndpZHRoID0gIjE1JSI7Ci0gICAgLy9jb2x1bW4yLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAvL2NvbHVtbjIud2lkdGggPSAiMTAlIjsKLSAgICAvL2NvbHVtbjMuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIC8vY29sdW1uMy53aWR0aCA9ICI3MCUiOwotICAgIC8vY29sdW1uNC5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgCi0gICAgLy92YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIC8vY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0gICAgCi0gICAgLy9jb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsZmlsZU5hbWUpKTsgIDwlLy8gb3JpZ2luYWwgZmlsZSBuYW1lJT4KLSAgICAvL2NvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIixoYXNFcnJvcikpOyAgPCUvLyBtb2RlJT4KLSAgICAvL2NvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIix0TW9kZWxLZXkpKTsgPCUvLyB0TW9kZWxLZXklPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2F0ZWdvcnlOYW1lKSk7Ci0gICAgCi0gICAgLy9jb2x1bW4yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGlzQ2hlY2tlZCkpOwotICAgIAotICAgIC8vaWYgKGhhc0Vycm9yKQotICAgIC8vewotICAgIC8vICBjb2x1bW4zLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVE1PREVMX0tFWSU+Iix0TW9kZWxLZXkpKTsKLSAgICAvLyAgdmFyIGZpbGVJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgLy8gIGZpbGVJbnB1dC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCI8JT1VRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX0ZJTEVOQU1FJT4iKTsKLSAgICAvLyAgZmlsZUlucHV0LnNldEF0dHJpYnV0ZSgidHlwZSIsImZpbGUiKTsKLSAgICAvLyAgZmlsZUlucHV0LnRpdGxlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0ZJTEUiKSklPiI7Ci0gICAgLy8gIGZpbGVJbnB1dC5jbGFzc05hbWUgPSAidGFibGVmaWxlYnJvd3NlIjsKLSAgICAvLyAgY29sdW1uMy5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOwotICAgIC8vICBhZGREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd0NhbmNlbExpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW40LHRhYmxlLnJvd3MubGVuZ3RoKTsKLSAgICAvL30KLSAgICAvL2Vsc2UKLSAgICAvL3sKLSAgICAvLyAgY29sdW1uMy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShmaWxlTmFtZSkpOwotICAgIC8vICBhZGREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd0VkaXRMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgLy99Ci0gICAgCi0gICAgLy9uZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIC8vbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIC8vbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjMpOwotICAgIC8vbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjQpOwotICAgIAotICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChuZXdSb3cpOwotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd0VkaXRMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIGVkaXRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChlZGl0TGluaywiZWRpdERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93Iix0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KTsKLSAgICBlZGl0TGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRURJVCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChlZGl0TGluayk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGVkaXREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvdyh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3Nbcm93SW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIAotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOyAgICAKLSAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICB2YXIgY29sdW1uNCA9IGNvbHVtbnMuaXRlbSg0KTsKLSAgICAKLSAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlID09ICJ0cnVlIik7Ci0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgcmV0dXJuOwotICAgIHZhciB0TW9kZWxLZXkgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWU7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlID0gdHJ1ZTsKLSAgICAKLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4zKTsKLSAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVE1PREVMX0tFWSU+Iix0TW9kZWxLZXkpKTsKLSAgICB2YXIgZmlsZUlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBmaWxlSW5wdXQuc2V0QXR0cmlidXRlKCJuYW1lIiwiPCU9VURESUFjdGlvbklucHV0cy5DQVRFR09SWV9GSUxFTkFNRSU+Iik7Ci0gICAgZmlsZUlucHV0LnNldEF0dHJpYnV0ZSgidHlwZSIsImZpbGUiKTsKLSAgICBmaWxlSW5wdXQudGl0bGUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfRklMRSIpKSU+IjsKLSAgICBmaWxlSW5wdXQuY2xhc3NOYW1lID0gInRhYmxlZmlsZWJyb3dzZSI7Ci0gICAgY29sdW1uMy5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOwotICAgIAotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjQpOwotICAgIAotICAgIGFkZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93Q2FuY2VsTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQscm93SW5kZXgpOwotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd0NhbmNlbExpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgY2FuY2VsTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQoY2FuY2VsTGluaywiY2FuY2VsRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3dFZGl0Iix0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KTsKLSAgICBjYW5jZWxMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19DQU5DRUwiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoY2FuY2VsTGluayk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93RWRpdCh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3Nbcm93SW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIAotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBjb2x1bW4zID0gY29sdW1ucy5pdGVtKDMpOwotICAgIHZhciBjb2x1bW40ID0gY29sdW1ucy5pdGVtKDQpOwotICAgIAotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWUgPT0gInRydWUiKTsKLSAgICBpZiAoIWVkaXRhYmxlKQotICAgICAgcmV0dXJuOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZSA9IGZhbHNlOwotICAgIAotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjMpOwotICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlKSk7Ci0gICAgCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uNCk7Ci0gICAgCi0gICAgYWRkRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3dFZGl0TGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQscm93SW5kZXgpOwotICB9Ci0gIAotICBmdW5jdGlvbiBlZGl0U2VsZWN0ZWREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBlZGl0RGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3codGFibGVDb250YWluZXJJZCxpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbFNlbGVjdGVkRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgY2FuY2VsRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3dFZGl0KHRhYmxlQ29udGFpbmVySWQsaSk7Ci0gICAgfQotICB9ICAKLSAgCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3codGFibGVDb250YWluZXJJZCxoYXNFcnJvcikKLSAgewotICAgIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjEud2lkdGggPSAiODUlIjsKLSAgICBjb2x1bW4yLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAKLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotICAgIAotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiPCU9QWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUJT4iKSk7IDwlLy8gdmlld0lkJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIiIpKTsgPCUvLyBvcmlnaW5hbCBEaXNjb3ZlcnkgVVJMJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsaGFzRXJyb3IpKTsgPCUvLyBtb2RlJT4KLSAgICBpZiAoaGFzRXJyb3IpCi0gICAgewotICAgICAgdmFyIHRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICB0ZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICAgIHRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkwiKSU+IjsKLSAgICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQodGV4dElucHV0KTsKLSAgICAgIGFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dSZW1vdmVBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMix0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBhZGREZXRhaWxzRGlzY292ZXJ5VVJMUm93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4yLHRhYmxlLnJvd3MubGVuZ3RoKTsKLSAgICB9Ci0gICAgCi0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMik7Ci0gICAgCi0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dSZW1vdmVBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHJlbW92ZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgc2V0SlNMaW5rUm93VGFyZ2V0KHJlbW92ZUxpbmssInJlbW92ZURldGFpbHNEaXNjb3ZlcnlVUkxSb3ciLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIHJlbW92ZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChyZW1vdmVMaW5rKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIGVkaXRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChlZGl0TGluaywiZWRpdERldGFpbHNEaXNjb3ZlcnlVUkxSb3ciLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGVkaXRMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19FRElUIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGVkaXRMaW5rKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0NhbmNlbEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgY2FuY2VsTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQoY2FuY2VsTGluaywiY2FuY2VsRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0VkaXQiLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGNhbmNlbExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0NBTkNFTCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChjYW5jZWxMaW5rKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gZWRpdERldGFpbHNEaXNjb3ZlcnlVUkxSb3codGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW3Jvd0luZGV4XTsKLSAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICAKLSAgICB2YXIgZGlzY292ZXJ5VVJMID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWUgPT0gInRydWUiKQotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIHJldHVybjsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWUgPSB0cnVlOwotICAgIAotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXTsKLSAgICB2YXIgdGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZCh0ZXh0SW5wdXQsY29sdW1uMUNvbnRyb2wpOwotICAgIHRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIHRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkwiKSU+IjsKLSAgICB0ZXh0SW5wdXQudmFsdWUgPSBkaXNjb3ZlcnlVUkw7Ci0gICAgCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uMik7Ci0gICAgYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0NhbmNlbEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4yLHJvd0luZGV4KTsKLSAgfQotICAKLSAgZnVuY3Rpb24gc2V0RGV0YWlsc0Rpc2NvdmVyeVVSTFJvdyh0YWJsZUNvbnRhaW5lcklkLGluZGV4LHZpZXdJZCxkaXNjb3ZlcnlVUkwpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3MraW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZSA9IHZpZXdJZDsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWUgPSBkaXNjb3ZlcnlVUkw7Ci0gICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXTsKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICBjb2x1bW4xQ29udHJvbC52YWx1ZSA9IGRpc2NvdmVyeVVSTDsKLSAgICBlbHNlCi0gICAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShnZXREZWZhdWx0RGlzcGxheVN0cmluZyhkaXNjb3ZlcnlVUkwpKSxjb2x1bW4xQ29udHJvbCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHJlbW92ZURldGFpbHNEaXNjb3ZlcnlVUkxSb3codGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleCk7Ci0gICAgZml4RGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0xpbmtzKHRhYmxlQ29udGFpbmVySWQpOwotICB9Ci0gIAotICBmdW5jdGlvbiBjYW5jZWxEZXRhaWxzRGlzY292ZXJ5VVJMUm93RWRpdCh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3Nbcm93SW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgIAotICAgIHZhciB2aWV3SWQgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgdmFyIGRpc2NvdmVyeVVSTCA9IGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZTsKLSAgICB2YXIgcm93QWN0aW9uTGlua0hyZWYgPSBjb2x1bW4yLmNoaWxkTm9kZXNbY29sdW1uMi5jaGlsZE5vZGVzLmxlbmd0aC0xXS5ocmVmOwotICAgIGlmIChyb3dBY3Rpb25MaW5rSHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmNhbmNlbCIpICE9IDApCi0gICAgICByZXR1cm47Ci0gICAgICAKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWUgPSBmYWxzZTsKLSAgICAKLSAgICB2YXIgY29sdW1uMUNvbnRyb2wgPSBjb2x1bW4xLmNoaWxkTm9kZXNbM107Ci0gICAgY29sdW1uMS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZ2V0RGVmYXVsdERpc3BsYXlTdHJpbmcoZGlzY292ZXJ5VVJMKSksY29sdW1uMUNvbnRyb2wpOwotICAgIAotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjIpOwotICAgIGFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjIscm93SW5kZXgpOwotICB9Ci0gIAotICBmdW5jdGlvbiByZW1vdmVTZWxlY3RlZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICByZW1vdmVTZWxlY3RlZFJvd3ModGFibGVDb250YWluZXJJZCk7Ci0gICAgZml4RGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0xpbmtzKHRhYmxlQ29udGFpbmVySWQpOwotICB9Ci0gIAotICBmdW5jdGlvbiBmaXhEZXRhaWxzRGlzY292ZXJ5VVJMUm93TGlua3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIDwlLy8gRml4IHRoZSBsaW5rcyU+Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvdyA9IHRhYmxlLnJvd3NbaV07Ci0gICAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IGNvbHVtbnMuaXRlbSgwKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgCi0gICAgICBmb3IgKHZhciBqPTE7ajxjb2x1bW5zLmxlbmd0aDtqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICAgIGNvbHVtbnMuaXRlbShqKS5jbGFzc05hbWUgPSAicm93Y29sb3IiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgY29sdW1ucy5pdGVtKGopLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICAgIHZhciBsaW5rID0gY29sdW1uMi5jaGlsZE5vZGVzW2NvbHVtbjIuY2hpbGROb2Rlcy5sZW5ndGgtMV07Ci0gICAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4yKTsKLSAgICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWUgPT0gInRydWUiKTsKLSAgICAgIGlmIChsaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpyZW1vdmUiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzRGlzY292ZXJ5VVJMUm93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjIsaSk7Ci0gICAgICBlbHNlIGlmIChsaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpjYW5jZWwiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzRGlzY292ZXJ5VVJMUm93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjIsaSk7Ci0gICAgICBlbHNlIGlmIChsaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDplZGl0IikgPT0gMCkKLSAgICAgICAgYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMixpKTsgCi0gICAgfQotICB9Ci0gIAotICBmdW5jdGlvbiBlZGl0U2VsZWN0ZWREZXRhaWxzRGlzY292ZXJ5VVJMUm93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGVkaXREZXRhaWxzRGlzY292ZXJ5VVJMUm93KHRhYmxlQ29udGFpbmVySWQsaSk7Ci0gICAgfQotICB9Ci0gIAotICBmdW5jdGlvbiBjYW5jZWxTZWxlY3RlZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgY2FuY2VsRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0VkaXQodGFibGVDb250YWluZXJJZCxpKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBhZGREZXRhaWxzU2luZ2xlSXRlbVJvdyh0YWJsZUNvbnRhaW5lcklkLGhhc0Vycm9yKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICAKLSAgICBjb2x1bW4wLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4wLndpZHRoID0gIjkwJSI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgCi0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLCIiKSk7IDwlLy8gaXRlbSB2YWx1ZSU+Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLGhhc0Vycm9yKSk7IDwlLy8gbW9kZSU+Ci0gICAgCi0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICAKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiBhZGREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dCcm93c2VBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsd3NkbFR5cGUsY29sdW1uKQotICB7Ci0gICAgdmFyIGJyb3dzZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgYnJvd3NlTGluay5ocmVmID0gImphdmFzY3JpcHQ6b3BlbldTRExCcm93c2VyKCdjb250ZW50Ym9yZGVyJywiK3dzZGxUeXBlKyIpIjsKLSAgICBicm93c2VMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGJyb3dzZUxpbmspOyAgICAKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc1dTRExVUkxTaW5nbGVJdGVtUm93QnJvd3NlQ2FuY2VsQWN0aW9uTGlua3ModGFibGVDb250YWluZXJJZCx3c2RsVHlwZSxjb2x1bW4pCi0gIHsKLSAgICBhZGREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dCcm93c2VBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsd3NkbFR5cGUsY29sdW1uKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSk7Ci0gICAgdmFyIGNhbmNlbExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgY2FuY2VsTGluay5ocmVmID0gImphdmFzY3JpcHQ6Y2FuY2VsRGV0YWlsc1dTRExVUkxTaW5nbGVJdGVtUm93RWRpdCgnIit0YWJsZUNvbnRhaW5lcklkKyInKSI7Ci0gICAgY2FuY2VsTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGNhbmNlbExpbmspOwotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbikKLSAgewotICAgIHZhciBlZGl0TGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBlZGl0TGluay5ocmVmID0gImphdmFzY3JpcHQ6ZWRpdERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvdygnIit0YWJsZUNvbnRhaW5lcklkKyInKSI7Ci0gICAgZWRpdExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZWRpdExpbmspOwotICB9Ci0gIAotICBmdW5jdGlvbiBjYW5jZWxEZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dFZGl0KHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgY29sdW1ucyA9IHRhYmxlLnJvd3NbbnVtYmVyT2ZIZWFkZXJSb3dzXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY29sdW1uMCA9IGNvbHVtbnMuaXRlbSgwKTsKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICAKLSAgICBjb2x1bW4wLmNoaWxkTm9kZXNbMl0udmFsdWUgPSBmYWxzZTsKLSAgICAKLSAgICB2YXIgY29sdW1uMENvbnRyb2wgPSBjb2x1bW4wLmNoaWxkTm9kZXNbY29sdW1uMC5jaGlsZE5vZGVzLmxlbmd0aC0xXTsKLSAgICBjb2x1bW4wLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShnZXRXU0RMVVJMRGlzcGxheShjb2x1bW4wLmNoaWxkTm9kZXNbMF0udmFsdWUpKSxjb2x1bW4wQ29udHJvbCk7Ci0gICAgCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uMSk7Ci0gICAgCi0gICAgYWRkRGV0YWlsc1dTRExVUkxTaW5nbGVJdGVtUm93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4xKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gZWRpdERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvdyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBjb2x1bW5zLml0ZW0oMCk7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgCi0gICAgdmFyIHdzZGxUeXBlID0gY29sdW1uMC5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgIGNvbHVtbjAuY2hpbGROb2Rlc1syXS52YWx1ZSA9IHRydWU7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjBDb250cm9sID0gY29sdW1uMC5jaGlsZE5vZGVzW2NvbHVtbjAuY2hpbGROb2Rlcy5sZW5ndGgtMV07Ci0gICAgdmFyIHdzZGxVUkxFZGl0Q29udHJvbCA9IGNyZWF0ZVdTRExVUkxFZGl0Q29udHJvbCgpOwotICAgIGNvbHVtbjAucmVwbGFjZUNoaWxkKHdzZGxVUkxFZGl0Q29udHJvbCxjb2x1bW4wQ29udHJvbCk7Ci0gICAgd3NkbFVSTEVkaXRDb250cm9sLmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgd3NkbFVSTEVkaXRDb250cm9sLnZhbHVlID0gZ2V0V1NETFVSTERpc3BsYXkoY29sdW1uMC5jaGlsZE5vZGVzWzBdLnZhbHVlKTsKLSAgICAKLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4xKTsKLSAgICAKLSAgICBhZGREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dCcm93c2VDYW5jZWxBY3Rpb25MaW5rcyh0YWJsZUNvbnRhaW5lcklkLHdzZGxUeXBlLGNvbHVtbjEpOwotICB9Ci0gIAotICBmdW5jdGlvbiBjcmVhdGVXU0RMVVJMRWRpdENvbnRyb2woKQotICB7Ci0gICAgdmFyIGNvbnRyb2w7Ci0gICAgaWYgKGlzTWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcigpKQotICAgICAgY29udHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIjxpbnB1dCBuYW1lPSc8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPic+Iik7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRyb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPiIpOwotICAgIH0KLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotICAKLSAgZnVuY3Rpb24gZ2V0V1NETFVSTERpc3BsYXkod3NkbFVSTCkKLSAgewotICAgIGlmICh3c2RsVVJMLmxlbmd0aCA8IDEpCi0gICAgICB3c2RsVVJMRGlzcGxheSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1NETF9VUkxfSVNfVU5SRUFDSEFCTEUiKSklPiI7Ci0gICAgZWxzZQotICAgICAgd3NkbFVSTERpc3BsYXkgPSB3c2RsVVJMOwotICAgIHJldHVybiB3c2RsVVJMRGlzcGxheTsKLSAgfQotICAKLSAgZnVuY3Rpb24gc2V0RGV0YWlsc1dTRExVUkxTaW5nbGVJdGVtUm93KHRhYmxlQ29udGFpbmVySWQsd3NkbFR5cGUsd3NkbFVSTCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3NdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4wID0gY29sdW1ucy5pdGVtKDApOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotCi0gICAgY29sdW1uMC5pbnNlcnRCZWZvcmUoY3JlYXRlSGlkZGVuRWxlbWVudCgiIix3c2RsVHlwZSksY29sdW1uMC5jaGlsZE5vZGVzWzFdKTsKLSAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMC5jaGlsZE5vZGVzWzJdLnZhbHVlID09ICJ0cnVlIik7Ci0gICAgdmFyIHdzZGxVUkxEaXNwbGF5ID0gZ2V0V1NETFVSTERpc3BsYXkod3NkbFVSTCk7Ci0gICAgY29sdW1uMC5jaGlsZE5vZGVzWzBdLnZhbHVlID0gd3NkbFVSTDsKLSAgICAKLSAgICB2YXIgY29sdW1uMENvbnRyb2w7ICAgIAotICAgIGlmIChlZGl0YWJsZSkKLSAgICB7Ci0gICAgICBjb2x1bW4wQ29udHJvbCA9IGNyZWF0ZVdTRExVUkxFZGl0Q29udHJvbCgpOwotICAgICAgY29sdW1uMENvbnRyb2wuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICAgIGFkZERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvd0Jyb3dzZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCx3c2RsVHlwZSxjb2x1bW4xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbHVtbjBDb250cm9sID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod3NkbFVSTERpc3BsYXkpOwotICAgICAgYWRkRGV0YWlsc1dTRExVUkxTaW5nbGVJdGVtUm93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4xKTsKLSAgICB9Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChjb2x1bW4wQ29udHJvbCk7Ci0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgY29sdW1uMENvbnRyb2wudmFsdWUgPSB3c2RsVVJMRGlzcGxheTsKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc05hbWVTaW5nbGVJdGVtUm93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbikKLSAgewotICAgIHZhciBjYW5jZWxMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIGNhbmNlbExpbmsuaHJlZiA9ICJqYXZhc2NyaXB0OmNhbmNlbERldGFpbHNOYW1lU2luZ2xlSXRlbVJvd0VkaXQoJyIrdGFibGVDb250YWluZXJJZCsiJykiOwotICAgIGNhbmNlbExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0NBTkNFTCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChjYW5jZWxMaW5rKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNOYW1lU2luZ2xlSXRlbVJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uKSAgCi0gIHsKLSAgICB2YXIgZWRpdExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgZWRpdExpbmsuaHJlZiA9ICJqYXZhc2NyaXB0OmVkaXREZXRhaWxzTmFtZVNpbmdsZUl0ZW1Sb3coJyIrdGFibGVDb250YWluZXJJZCsiJykiOwotICAgIGVkaXRMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19FRElUIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGVkaXRMaW5rKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gZWRpdERldGFpbHNOYW1lU2luZ2xlSXRlbVJvdyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBjb2x1bW5zLml0ZW0oMCk7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgCi0gICAgY29sdW1uMC5jaGlsZE5vZGVzWzFdLnZhbHVlID0gdHJ1ZTsKLSAgICAKLSAgICB2YXIgY29sdW1uMENvbnRyb2wgPSBjb2x1bW4wLmNoaWxkTm9kZXNbY29sdW1uMC5jaGlsZE5vZGVzLmxlbmd0aC0xXTsKLSAgICB2YXIgdGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4wLnJlcGxhY2VDaGlsZCh0ZXh0SW5wdXQsY29sdW1uMENvbnRyb2wpOwotICAgIHRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIHRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0lOUFVUX1RFWFRfVkFMVUUiKSU+IjsKLSAgICB0ZXh0SW5wdXQudmFsdWUgPSBjb2x1bW4wLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0KLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4xKTsKLSAgICAKLSAgICBhZGREZXRhaWxzTmFtZVNpbmdsZUl0ZW1Sb3dDYW5jZWxBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMSk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbERldGFpbHNOYW1lU2luZ2xlSXRlbVJvd0VkaXQodGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3NdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4wID0gY29sdW1ucy5pdGVtKDApOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIAotICAgIGNvbHVtbjAuY2hpbGROb2Rlc1sxXS52YWx1ZSA9IGZhbHNlOwotICAgIAotICAgIHZhciBjb2x1bW4wQ29udHJvbCA9IGNvbHVtbjAuY2hpbGROb2Rlc1tjb2x1bW4wLmNoaWxkTm9kZXMubGVuZ3RoLTFdOwotICAgIGNvbHVtbjAucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbHVtbjAuY2hpbGROb2Rlc1swXS52YWx1ZSksY29sdW1uMENvbnRyb2wpOwotICAgIAotICAgIGZvciAodmFyIGk9MDtpPGNvbHVtbjEuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGNvbHVtbjEucmVtb3ZlQ2hpbGQoY29sdW1uMS5jaGlsZE5vZGVzW2ldKTsKLSAgICAgIGktLTsKLSAgICB9Ci0gICAgYWRkRGV0YWlsc05hbWVTaW5nbGVJdGVtUm93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4xKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gc2V0RGV0YWlsc05hbWVTaW5nbGVJdGVtUm93KHRhYmxlQ29udGFpbmVySWQsbmFtZSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3NdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4wID0gY29sdW1ucy5pdGVtKDApOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIAotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4wLmNoaWxkTm9kZXNbMV0udmFsdWUgPT0gInRydWUiKTsKLSAgICBjb2x1bW4wLmNoaWxkTm9kZXNbMF0udmFsdWUgPSBuYW1lOwotICAgIAotICAgIHZhciBjb2x1bW4wQ29udHJvbDsKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgewotICAgICAgY29sdW1uMENvbnRyb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgY29sdW1uMENvbnRyb2wuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICAgIGNvbHVtbjBDb250cm9sLnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfSU5QVVRfVEVYVF9WQUxVRSIpJT4iOwotICAgICAgY29sdW1uMENvbnRyb2wudmFsdWUgPSBuYW1lOwotICAgICAgY29sdW1uMS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUNUSU9OU19OT05FIiklPiIpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbHVtbjBDb250cm9sID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSk7Ci0gICAgICBhZGREZXRhaWxzTmFtZVNpbmdsZUl0ZW1Sb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjEpOwotICAgIH0KLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKGNvbHVtbjBDb250cm9sKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gcHJvY2Vzc0RldGFpbHNEaXNjb3ZlcnlVUkxUYWJsZSh0YWJsZUNvbnRhaW5lcklkLG1vZGlmaWVkTmFtZSx2aWV3SWROYW1lLGRpc2NvdmVyeVVSTE5hbWUsZm9ybSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgICAgdmFyIHZpZXdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWUgPT0gInRydWUiKTsKLSAgICAgIHZhciBkaXNjb3ZlcnlVUkw7Ci0gICAgICBpZiAoZWRpdGFibGUpCi0gICAgICAgIGRpc2NvdmVyeVVSTCA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXS52YWx1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgZGlzY292ZXJ5VVJMID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KHZpZXdJZE5hbWUsdmlld0lkKSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoZGlzY292ZXJ5VVJMTmFtZSxkaXNjb3ZlcnlVUkwpKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudChtb2RpZmllZE5hbWUsZWRpdGFibGUpKTsgICAgICAgIAotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gcHJvY2Vzc0RldGFpbHNMYW5ndWFnZUlucHV0VGFibGUodGFibGVDb250YWluZXJJZCxtb2RpZmllZE5hbWUsdmlld0lkTmFtZSxsYW5nSWROYW1lLGlucHV0TmFtZSxmb3JtKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgICB2YXIgdmlld0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgICAgdmFyIGxhbmdJZCxpbnB1dFRleHQ7Ci0gICAgICBpZiAoZWRpdGFibGUpCi0gICAgICB7Ci0gICAgICAgIGxhbmdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XS52YWx1ZTsKLSAgICAgICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgICAgIGlucHV0VGV4dCA9IGNvbHVtbjIuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGFuZ0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgICAgICBpbnB1dFRleHQgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWU7Ci0gICAgICB9Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQodmlld0lkTmFtZSx2aWV3SWQpKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudChsYW5nSWROYW1lLGxhbmdJZCkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KGlucHV0TmFtZSxpbnB1dFRleHQpKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudChtb2RpZmllZE5hbWUsZWRpdGFibGUpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHByb2Nlc3NEZXRhaWxzSWRlbnRpZmllclRhYmxlKHRhYmxlQ29udGFpbmVySWQsZm9ybSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgICAgdmFyIHZpZXdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPT0gInRydWUiKTsKLSAgICAgIHZhciB0TW9kZWxLZXksaWRLZXlOYW1lLGlkS2V5VmFsdWU7Ci0gICAgICBpZiAoZWRpdGFibGUpCi0gICAgICB7Ci0gICAgICAgIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XS52YWx1ZTsKLSAgICAgICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgICAgIGlkS2V5TmFtZSA9IGNvbHVtbjIuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICAgICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgICAgIGlkS2V5VmFsdWUgPSBjb2x1bW4zLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZTsKLSAgICAgICAgaWRLZXlOYW1lID0gY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlOwotICAgICAgICBpZEtleVZhbHVlID0gY29sdW1uMS5jaGlsZE5vZGVzWzNdLnZhbHVlOwotICAgICAgfQotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLklERU5USUZJRVJfVklFV0lEJT4iLHZpZXdJZCkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfVFlQRSU+Iix0TW9kZWxLZXkpKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9OQU1FJT4iLGlkS2V5TmFtZSkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX1ZBTFVFJT4iLGlkS2V5VmFsdWUpKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5JREVOVElGSUVSX01PRElGSUVEJT4iLGVkaXRhYmxlKSk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzRGV0YWlsc0NhdGVnb3J5VGFibGUodGFibGVDb250YWluZXJJZCxmb3JtKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgICB2YXIgdmlld0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgICAgdmFyIHRNb2RlbEtleSxjYXRLZXlOYW1lLGNhdEtleVZhbHVlOwotICAgICAgaWYgKGVkaXRhYmxlKQotICAgICAgewotICAgICAgICB0TW9kZWxLZXkgPSBjb2x1bW4xLmNoaWxkTm9kZXNbNV0udmFsdWU7Ci0gICAgICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgICAgICBjYXRLZXlOYW1lID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICAgICAgY2F0S2V5VmFsdWUgPSBjb2x1bW4zLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZTsKLSAgICAgICAgY2F0S2V5TmFtZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZTsKLSAgICAgICAgY2F0S2V5VmFsdWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbM10udmFsdWU7Ci0gICAgICB9Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVklFV0lEJT4iLHZpZXdJZCkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX1RZUEUlPiIsdE1vZGVsS2V5KSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUlPiIsY2F0S2V5TmFtZSkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSU+IixjYXRLZXlWYWx1ZSkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX01PRElGSUVEJT4iLGVkaXRhYmxlKSk7Ci0gICAgfQotICB9Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzRGV0YWlsc1NpbmdsZUl0ZW1UYWJsZSh0YWJsZUNvbnRhaW5lcklkLG1vZGlmaWVkTmFtZSxpbnB1dE5hbWUsZm9ybSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3NdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4wID0gY29sdW1ucy5pdGVtKDApOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4wLmNoaWxkTm9kZXNbY29sdW1uMC5jaGlsZE5vZGVzLmxlbmd0aC0yXS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgIHZhciBpbnB1dFZhbHVlOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIGlucHV0VmFsdWUgPSBjb2x1bW4wLmNoaWxkTm9kZXNbY29sdW1uMC5jaGlsZE5vZGVzLmxlbmd0aC0xXS52YWx1ZTsKLSAgICBlbHNlCi0gICAgICBpbnB1dFZhbHVlID0gY29sdW1uMC5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudChpbnB1dE5hbWUsaW5wdXRWYWx1ZSkpOwotICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudChtb2RpZmllZE5hbWUsZWRpdGFibGUpKTsgICAgCi0gIH0KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvcmVzdWx0cy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy9yZXN1bHRzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNjY3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy9yZXN1bHRzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBnZXROdW1iZXJPZlNlbGVjdGlvbnModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciBudW1iZXJTZWxlY3RlZCA9IDA7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIG51bWJlclNlbGVjdGVkKys7Ci0gICAgfQotICAgIHJldHVybiBudW1iZXJTZWxlY3RlZDsKLSAgfQotICAKLSAgZnVuY3Rpb24gcHJvY2Vzc1Jlc3VsdEZvcm0odGFibGVDb250YWluZXJJZCxmb3JtKQotICB7Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUodGFibGVDb250YWluZXJJZCwiPCU9QWN0aW9uSW5wdXRzLk5PREVJRCU+Iixmb3JtLHRydWUpOwotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9ucyh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICBmb3JtLmFjdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVzQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgICAvLyBFbnN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgaXRlbSBpcyBzZWxlY3RlZC4KLSAgICB2YXIgbnVtYmVyU2VsZWN0ZWQgPSBnZXROdW1iZXJPZlNlbGVjdGlvbnModGFibGVDb250YWluZXJJZCk7Ci0gICAgaWYgKG51bWJlclNlbGVjdGVkID4gMCkKLSAgICAgIHByb2Nlc3NSZXN1bHRGb3JtKHRhYmxlQ29udGFpbmVySWQsZm9ybSk7Ci0gICAgZWxzZQotICAgICAgYWxlcnQoIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRCIpJT4iKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gcmVmcmVzaFNlbGVjdGlvbnModGFibGVDb250YWluZXJJZCxmb3JtKQotICB7Ci0gICAgZm9ybS5hY3Rpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2Rlc0FjdGlvbkpTUC5qc3AiKSklPiI7Ci0gICAgLy8gRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gaXMgc2VsZWN0ZWQuCi0gICAgdmFyIG51bWJlclNlbGVjdGVkID0gZ2V0TnVtYmVyT2ZTZWxlY3Rpb25zKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGlmIChudW1iZXJTZWxlY3RlZCA+IDApCi0gICAgICBwcm9jZXNzUmVzdWx0Rm9ybSh0YWJsZUNvbnRhaW5lcklkLGZvcm0pOwotICAgIGVsc2UKLSAgICAgIGFsZXJ0KCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQiKSU+Iik7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGFkZFNlbGVjdGlvbnNUb0Zhdm9yaXRlcyh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICBmb3JtLmFjdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9BZGRJdGVtc1RvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgICAvLyBFbnN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgaXRlbSBpcyBzZWxlY3RlZC4KLSAgICB2YXIgbnVtYmVyU2VsZWN0ZWQgPSBnZXROdW1iZXJPZlNlbGVjdGlvbnModGFibGVDb250YWluZXJJZCk7Ci0gICAgaWYgKG51bWJlclNlbGVjdGVkID4gMCkKLSAgICAgIHByb2Nlc3NSZXN1bHRGb3JtKHRhYmxlQ29udGFpbmVySWQsZm9ybSk7Ci0gICAgZWxzZQotICAgICAgYWxlcnQoIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRCIpJT4iKTsKLSAgfQotICAKLTwlCi0gICBpZiAoc3ViUXVlcnlUcmFuc2ZlclRhcmdldEhvbGRlci5zaXplKCkgPiAwKQotICAgewotICAgICBTdWJRdWVyeVRyYW5zZmVyVGFyZ2V0IHN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgPSAoU3ViUXVlcnlUcmFuc2ZlclRhcmdldClzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyLmVsZW1lbnRBdCgwKTsKLSAgICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gc3ViUXVlcnlUcmFuc2ZlclRhcmdldC5nZXRTdWJRdWVyeUtleSgpOwotICAgICBpbnQgbGFzdFNlcGFyYXRvclBvcyA9IHN1YlF1ZXJ5S2V5Lmxhc3RJbmRleE9mKCc6Jyk7Ci0gICAgIFN0cmluZyB0YXJnZXRRdWVyeUtleTsKLSAgICAgaWYgKGxhc3RTZXBhcmF0b3JQb3MgPT0gLTEpCi0gICAgICAgdGFyZ2V0UXVlcnlLZXkgPSAiIjsKLSAgICAgZWxzZQotICAgICAgIHRhcmdldFF1ZXJ5S2V5ID0gc3ViUXVlcnlLZXkuc3Vic3RyaW5nKDAsbGFzdFNlcGFyYXRvclBvcyk7Ci0gICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSA9IHN1YlF1ZXJ5S2V5LnN1YnN0cmluZyhsYXN0U2VwYXJhdG9yUG9zKzEsc3ViUXVlcnlLZXkubGVuZ3RoKCkpOwotJT4gICAgIAotICBmdW5jdGlvbiB0cmFuc2ZlclNlbGVjdGlvbnModGFibGVDb250YWluZXJJZCxmb3JtKQotICB7Ci0gICAgZm9ybS5hY3Rpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb25KU1AuanNwIikpJT4iOwotICAgIC8vIEVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBpdGVtIGlzIHNlbGVjdGVkLgotICAgIHZhciBudW1iZXJTZWxlY3RlZCA9IGdldE51bWJlck9mU2VsZWN0aW9ucyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBpZiAobnVtYmVyU2VsZWN0ZWQgPiAwKQotICAgIHsKLTwlCi0gICAgIGlmICh0YXJnZXRQcm9wZXJ0eS5lcXVhbHMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTKSB8fCB0YXJnZXRQcm9wZXJ0eS5lcXVhbHMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUykgfHwgdGFyZ2V0UHJvcGVydHkuZXF1YWxzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRSkpCi0gICAgIHsKLSU+Ci0gICAgICBpZiAobnVtYmVyU2VsZWN0ZWQgIT0gMSkKLSAgICAgIHsKLSAgICAgICAgYWxlcnQoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NJTkdMRV9JVEVNIikpJT4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi08JQotICAgICAgIEZvcm1Ub29sIHRhcmdldEZvcm1Ub29sID0gc3ViUXVlcnlUcmFuc2ZlclRhcmdldC5nZXRUYXJnZXRGb3JtVG9vbCgpOwotICAgICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSB0YXJnZXRGb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSl0YXJnZXRGb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHRhcmdldFF1ZXJ5S2V5KTsKLSAgICAgICBWZWN0b3Igc2VydmljZUJ1c2luZXNzID0gKFZlY3Rvcil0YXJnZXRGb3JtVG9vbFBJLmdldFByb3BlcnR5KHRhcmdldFByb3BlcnR5KTsKLSAgICAgICBpZiAoc2VydmljZUJ1c2luZXNzICE9IG51bGwgJiYgc2VydmljZUJ1c2luZXNzLnNpemUoKSA+IDApCi0gICAgICAgewotJT4KLSAgICAgIGlmICghY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfUVVFU1RJT05fSVRFTV9SRVBMQUNFTUVOVCIpKSU+IikpCi0gICAgICAgIHJldHVybjsKLTwlCi0gICAgICAgfQotICAgICB9Ci0lPgotICAgICAgcHJvY2Vzc1Jlc3VsdEZvcm0odGFibGVDb250YWluZXJJZCxmb3JtKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYWxlcnQoIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRCIpJT4iKTsKLSAgfQotPCUKLSAgIH0KLSU+ICAgICAgIAotPC9zY3JpcHQ+ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL3VkZGlmcmFtZXNldHMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvdWRkaWZyYW1lc2V0cy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjRhZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvdWRkaWZyYW1lc2V0cy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKQotICB7Ci0gICAgcmV0dXJuIHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPVVERElGcmFtZU5hbWVzLkFDVElPTlNfQ09OVEFJTkVSJT4iXS5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZnJhbWVzZXQiKS5pdGVtKDApOwotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZnJhbWVzZXRTaXplc0Zvcm0pCi0gIHsKLSAgICB0b2dnbGVEb3VibGVDbGlja0NvbHVtblRpdGxlKCk7Ci0gICAgdmFyIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0ID0gZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQoKTsKLSAgICB2YXIgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0ID0gZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0KCk7Ci0gICAgZnJhbWVzZXRTaXplc0Zvcm0uPCU9VURESUFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQlPi52YWx1ZSA9IHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0LmNvbHM7Ci0gICAgZnJhbWVzZXRTaXplc0Zvcm0uPCU9VURESUFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSJT4udmFsdWUgPSBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQucm93czsKLSAgICBmcmFtZXNldFNpemVzRm9ybS5zdWJtaXQoKTsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4NjRjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciBuYXZpZ2F0b3JDb250YWluZXIgPSBwZXJzcGVjdGl2ZUNvbnRlbnQuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIG5hdmlnYXRvclRvb2xiYXIgPSBuYXZpZ2F0b3JDb250YWluZXIuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5OQVZJR0FUT1JfVE9PTEJBUiU+Il07Ci0gIHZhciBuYXZpZ2F0b3JDb250ZW50ID0gbmF2aWdhdG9yQ29udGFpbmVyLmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRFTlQlPiJdOwotICB2YXIgYWN0aW9uc0NvbnRhaW5lciA9IHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPVVERElGcmFtZU5hbWVzLkFDVElPTlNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHByb3BlcnRpZXNDb250YWluZXIgPSBhY3Rpb25zQ29udGFpbmVyLmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05UQUlORVIlPiJdOwotICB2YXIgcHJvcGVydGllc1Rvb2xiYXIgPSBwcm9wZXJ0aWVzQ29udGFpbmVyLmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuUFJPUEVSVElFU19UT09MQkFSJT4iXTsKLSAgdmFyIHByb3BlcnRpZXNDb250ZW50ID0gcHJvcGVydGllc0NvbnRhaW5lci5mcmFtZXNbIjwlPVVERElGcmFtZU5hbWVzLlBST1BFUlRJRVNfQ09OVEVOVCU+Il07Ci0gIHZhciBzdGF0dXNDb250YWluZXIgPSBhY3Rpb25zQ29udGFpbmVyLmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuU1RBVFVTX0NPTlRBSU5FUiU+Il07Ci0gIHZhciBzdGF0dXNUb29sYmFyID0gc3RhdHVzQ29udGFpbmVyLmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuU1RBVFVTX1RPT0xCQVIlPiJdOwotICB2YXIgc3RhdHVzQ29udGVudCA9IHN0YXR1c0NvbnRhaW5lci5mcmFtZXNbIjwlPVVERElGcmFtZU5hbWVzLlNUQVRVU19DT05URU5UJT4iXTsKLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvdWRkaXRhYmxlcy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy91ZGRpdGFibGVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiMjc4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy91ZGRpdGFibGVzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg5NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvd3NkbGJyb3dzZXIuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gc2Vzc2lvbi5nZXRJZCgpOwotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGpzcDp1c2VCZWFuIGlkPSJjb21tb25DYXRlZ29yeU1vZGVscyIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJhcHBsaWNhdGlvbiIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIC8vIFJlcXVpcmVzIGJyb3dzZXJkZXRlY3QuanMsIHRhYmxlcy5qc3AgKGV4cGxvcmVyKQotICB2YXIgcm93Q2hlY2tib3hOYW1lID0gInJvd0NoZWNrYm94TmFtZSI7Ci0gIHZhciBjYXRlZ29yeVdpbmRvdzsKLSAgdmFyIGNhdGVnb3J5V2luZG93Q2xvc2VkID0gdHJ1ZTsKLSAgdmFyIHRhcmdldENhdGVnb3J5Um93ID0gLTE7Ci0gIHZhciB0YXJnZXRDYXRlZ29yeUtleU5hbWVFbGVtZW50OwotICB2YXIgdGFyZ2V0Q2F0ZWdvcnlLZXlWYWx1ZUVsZW1lbnQ7Ci0gIHZhciBsYW5ndWFnZUFycmF5ID0gbmV3IEFycmF5KCk7Ci0gIHZhciBjYXRlZ29yeUFycmF5ID0gbmV3IEFycmF5KCk7Ci0gIHZhciB3aWxkY2FyZENhdGVnb3J5QnJvd3NlclVSTFJlID0gLyglKS87Ci0KLSAgZnVuY3Rpb24gY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCkKLSAgewotICAgIGNsb3NlQ2F0ZWdvcnlCcm93c2VyKCk7Ci0gICAgY2xvc2VXU0RMQnJvd3NlcigpOwotICB9Ci0KLSAgZnVuY3Rpb24gTGFuZ3VhZ2UoZGlzcGxheU5hbWUsbGFuZ0lkKQotICB7Ci0gICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgIHRoaXMubGFuZ0lkID0gbGFuZ0lkOwotICB9Ci0KLSAgZnVuY3Rpb24gY29tcGFyZUxhbmd1YWdlRGlzcGxheU5hbWVzKGEsYikKLSAgewotICAgIHZhciByZXN1bHQgPSBhLmRpc3BsYXlOYW1lLmxvY2FsZUNvbXBhcmUoYi5kaXNwbGF5TmFtZSk7Ci0gICAgaWYgKHJlc3VsdCA8IDApCi0gICAgICByZXR1cm4gLTE7Ci0gICAgZWxzZSBpZiAocmVzdWx0ID4gMCkKLSAgICAgIHJldHVybiAxOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0VE1vZGVsS2V5U2VsZWN0KGl0ZW1TZWxlY3QsdE1vZGVsS2V5KQotICB7Ci0gICAgZm9yICh2YXIgaT0wO2k8aXRlbVNlbGVjdC5vcHRpb25zLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKGl0ZW1TZWxlY3Qub3B0aW9uc1tpXS52YWx1ZS50b0xvd2VyQ2FzZSgpID09IHRNb2RlbEtleS50b0xvd2VyQ2FzZSgpKQotICAgICAgewotICAgICAgICBpdGVtU2VsZWN0Lm9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gaXRlbVNlbGVjdC5vcHRpb25zW2ldLnRleHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2V0TGFuZ3VhZ2VTZWxlY3QobGFuZ3VhZ2VTZWxlY3QsbGFuZ3VhZ2VWYWx1ZSkKLSAgewotICAgIHZhciBzdGFydDsKLTwlCi0gICAvLyBDb21wYXJlIHdpdGggdGhlIGVtcHR5IHN0cmluZyBvbmx5IGlmIHRoZSBsYW5ndWFnZVZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcuCi0lPgotICAgIGlmIChsYW5ndWFnZVZhbHVlLmxlbmd0aCA8IDEpCi0gICAgICBzdGFydCA9IDA7Ci0gICAgZWxzZQotICAgICAgc3RhcnQgPSAxOwotICAgIGZvciAodmFyIGk9c3RhcnQ7aTxsYW5ndWFnZVNlbGVjdC5vcHRpb25zLmxlbmd0aDtpKyspCi0gICAgewotPCUKLSAgIC8vIFVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBsYW5ndWFnZVZhbHVlIGJlZ2lucyB3aXRoIGEga2V5IHdob3NlIGl0ZW0gaXMgaW4gdGhlIHBpY2sgbGlzdC4gVGhpcyBlbmFibGVzICJFbmdsaXNoIiB0byBiZSBzZWxlY3RlZAotICAgLy8gZm9yIGVuLXh4eCAoZGlhbGVjdHMpLgotJT4KLSAgICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKCJeIitsYW5ndWFnZVNlbGVjdC5vcHRpb25zW2ldLnZhbHVlLCJpIik7Ci0gICAgICBpZiAocmVnRXhwLnRlc3QobGFuZ3VhZ2VWYWx1ZSkpCi0gICAgICB7Ci0gICAgICAgIGxhbmd1YWdlU2VsZWN0Lm9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gbGFuZ3VhZ2VTZWxlY3Qub3B0aW9uc1tpXS50ZXh0OwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHBvcHVsYXRlTGFuZ3VhZ2VTZWxlY3QobGFuZ3VhZ2VTZWxlY3QpCi0gIHsKLSAgICBpZiAobGFuZ3VhZ2VBcnJheS5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiIiwiIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9FTiIpKSU+IiwiZW4iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0FBIikpJT4iLCJhYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQUIiKSklPiIsImFiIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9BRiIpKSU+IiwiYWYiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0FNIikpJT4iLCJhbSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQVIiKSklPiIsImFyIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9BUyIpKSU+IiwiYXMiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0FZIikpJT4iLCJheSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQVoiKSklPiIsImF6Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9CQSIpKSU+IiwiYmEiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0JFIikpJT4iLCJiZSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQkciKSklPiIsImJnIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9CSCIpKSU+IiwiYmgiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0JJIikpJT4iLCJiaSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQk4iKSklPiIsImJuIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9CTyIpKSU+IiwiYm8iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0JSIikpJT4iLCJiciIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQ0EiKSklPiIsImNhIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9DTyIpKSU+IiwiY28iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0NaIikpJT4iLCJjeiIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQ1kiKSklPiIsImN5Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9EQSIpKSU+IiwiZGEiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0RFIikpJT4iLCJkZSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfRFoiKSklPiIsImR6Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9FTCIpKSU+IiwiZWwiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0VPIikpJT4iLCJlbyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfRVMiKSklPiIsImVzIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9FVCIpKSU+IiwiZXQiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0VVIikpJT4iLCJldSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfRkEiKSklPiIsImZhIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9GSSIpKSU+IiwiZmkiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZKIikpJT4iLCJmaiIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfRk8iKSklPiIsImZvIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9GUiIpKSU+IiwiZnIiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZZIikpJT4iLCJmeSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfR0EiKSklPiIsImdhIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9HRCIpKSU+IiwiZ2QiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0dMIikpJT4iLCJnbCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfR04iKSklPiIsImduIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9HVSIpKSU+IiwiZ3UiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0hBIikpJT4iLCJoYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSEkiKSklPiIsImhpIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9IUiIpKSU+IiwiaHIiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0hVIikpJT4iLCJodSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSFkiKSklPiIsImh5Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9JQSIpKSU+IiwiaWEiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0lFIikpJT4iLCJpZSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSUsiKSklPiIsImlrIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9JTiIpKSU+IiwiaW4iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0lTIikpJT4iLCJpcyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSVQiKSklPiIsIml0Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9JVyIpKSU+IiwiaXciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0pBIikpJT4iLCJqYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSkkiKSklPiIsImppIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9KVyIpKSU+IiwianciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0tBIikpJT4iLCJrYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfS0siKSklPiIsImtrIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9LTCIpKSU+Iiwia2wiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0tNIikpJT4iLCJrbSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfS04iKSklPiIsImtuIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9LTyIpKSU+Iiwia28iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0tTIikpJT4iLCJrcyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfS1UiKSklPiIsImt1Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9LWSIpKSU+Iiwia3kiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0xBIikpJT4iLCJsYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTE4iKSklPiIsImxuIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9MTyIpKSU+IiwibG8iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0xUIikpJT4iLCJsdCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTFYiKSklPiIsImx2Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9NRyIpKSU+IiwibWciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX01JIikpJT4iLCJtaSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTUsiKSklPiIsIm1rIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9NTCIpKSU+IiwibWwiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX01OIikpJT4iLCJtbiIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTU8iKSklPiIsIm1vIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9NUiIpKSU+IiwibXIiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX01TIikpJT4iLCJtcyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTVQiKSklPiIsIm10Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9NWSIpKSU+IiwibXkiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX05BIikpJT4iLCJuYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTkUiKSklPiIsIm5lIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9OTCIpKSU+IiwibmwiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX05PIikpJT4iLCJubyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfT0MiKSklPiIsIm9jIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9PTSIpKSU+Iiwib20iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX09SIikpJT4iLCJvciIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfUEEiKSklPiIsInBhIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9QTCIpKSU+IiwicGwiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1BTIikpJT4iLCJwcyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfUFQiKSklPiIsInB0Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9RVSIpKSU+IiwicXUiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1JNIikpJT4iLCJybSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfUk4iKSklPiIsInJuIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9STyIpKSU+Iiwicm8iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1JVIikpJT4iLCJydSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfUlciKSklPiIsInJ3Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TQSIpKSU+Iiwic2EiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NEIikpJT4iLCJzZCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU0ciKSklPiIsInNnIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TSCIpKSU+Iiwic2giKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NJIikpJT4iLCJzaSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU0siKSklPiIsInNrIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TTCIpKSU+Iiwic2wiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NNIikpJT4iLCJzbSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU04iKSklPiIsInNuIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TTyIpKSU+Iiwic28iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NRIikpJT4iLCJzcSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU1IiKSklPiIsInNyIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TUyIpKSU+Iiwic3MiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NUIikpJT4iLCJzdCIpCi0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TVSIpKSU+Iiwic3UiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NWIikpJT4iLCJzdiIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU1ciKSklPiIsInN3Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9UQSIpKSU+IiwidGEiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1RFIikpJT4iLCJ0ZSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVEciKSklPiIsInRnIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9USCIpKSU+IiwidGgiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1RJIikpJT4iLCJ0aSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVEsiKSklPiIsInRrIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9UTCIpKSU+IiwidGwiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1ROIikpJT4iLCJ0biIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVE8iKSklPiIsInRvIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9UUiIpKSU+IiwidHIiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1RTIikpJT4iLCJ0cyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVFQiKSklPiIsInR0Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9UVyIpKSU+IiwidHciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1VLIikpJT4iLCJ1ayIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVVIiKSklPiIsInVyIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9VWiIpKSU+IiwidXoiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1ZJIikpJT4iLCJ2aSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVk8iKSklPiIsInZvIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9XTyIpKSU+Iiwid28iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1hIIikpJT4iLCJ4aCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfWU8iKSklPiIsInlvIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9aSCIpKSU+IiwiemgiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1pVIikpJT4iLCJ6dSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheS5zb3J0KGNvbXBhcmVMYW5ndWFnZURpc3BsYXlOYW1lcyk7Ci0gICAgfQotCi0gICAgZm9yICh2YXIgaT0wO2k8bGFuZ3VhZ2VBcnJheS5sZW5ndGg7aSsrKQotICAgICAgbGFuZ3VhZ2VTZWxlY3Qub3B0aW9uc1tpXSA9IG5ldyBPcHRpb24obGFuZ3VhZ2VBcnJheVtpXS5kaXNwbGF5TmFtZSxsYW5ndWFnZUFycmF5W2ldLmxhbmdJZCk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRMYW5ndWFnZUlucHV0Um93U2V0dGluZ3ModGFibGVDb250YWluZXJJZCxuYW1lSW5kZXgsbGFuZ3VhZ2VWYWx1ZSxuYW1lVGV4dFZhbHVlKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3NbbnVtYmVyT2ZIZWFkZXJSb3dzK25hbWVJbmRleF07Ci0gICAgdmFyIGxhbmd1YWdlU2VsZWN0ID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKS5pdGVtKDApOwotICAgIHZhciBuYW1lVGV4dCA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDEpOwotICAgIHNldExhbmd1YWdlU2VsZWN0KGxhbmd1YWdlU2VsZWN0LGxhbmd1YWdlVmFsdWUpOwotICAgIG5hbWVUZXh0LnZhbHVlID0gbmFtZVRleHRWYWx1ZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHJlbW92ZVNlbGVjdGVkQ2F0ZWdvcnlSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICAvLyBDaGVjayBpZiBhbnkgcm93cyBhYm92ZSBhbmQgaW5jbHVkaW5nIHRoZSB0YXJnZXRDYXRlZ29yeVJvdyBhcmUgc2VsZWN0ZWQuCi0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIG5ld1RhcmdldENhdGVnb3J5Um93ID0gdGFyZ2V0Q2F0ZWdvcnlSb3c7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTw9dGFyZ2V0Q2F0ZWdvcnlSb3c7aSsrKQotICAgIHsKLSAgICAgIHZhciB0YWJsZVJvdyA9IHRhYmxlLnJvd3NbaV07Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZVJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChpID09IHRhcmdldENhdGVnb3J5Um93KQotICAgICAgICAgIG5ld1RhcmdldENhdGVnb3J5Um93ID0gLTE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuZXdUYXJnZXRDYXRlZ29yeVJvdy0tOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobmV3VGFyZ2V0Q2F0ZWdvcnlSb3cgPT0gLTEpCi0gICAgICBjbG9zZUNhdGVnb3J5QnJvd3NlcigpOwotICAgIHRhcmdldENhdGVnb3J5Um93ID0gbmV3VGFyZ2V0Q2F0ZWdvcnlSb3c7Ci0gICAgcmVtb3ZlU2VsZWN0ZWRSb3dzKHRhYmxlQ29udGFpbmVySWQpOwotICAgIC8vIEZpeCB0aGUgYnJvd3NlLi4uIGxpbmtzLgotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciB0YWJsZVJvdyA9IHRhYmxlLnJvd3NbaV07Ci0gICAgICB2YXIgYnJvd3NlTGluayA9IHRhYmxlUm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIikuaXRlbSgwKTsKLSAgICAgIHNldEpTTGlua1Jvd1RhcmdldChicm93c2VMaW5rLCJvcGVuQ2F0ZWdvcnlCcm93c2VyIix0YWJsZUNvbnRhaW5lcklkLGkpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIGFkZExhbmd1YWdlSW5wdXRSb3codGFibGVDb250YWluZXJJZCx0ZXh0Q29udHJvbFRpdGxlKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLQotICAgIHZhciBsYW5ndWFnZVNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIHBvcHVsYXRlTGFuZ3VhZ2VTZWxlY3QobGFuZ3VhZ2VTZWxlY3QpOwotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQobGFuZ3VhZ2VTZWxlY3QpOwotCi0gICAgdmFyIHRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgY29sdW1uMi5hcHBlbmRDaGlsZCh0ZXh0SW5wdXQpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgbGFuZ3VhZ2VTZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIHRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIHRleHRJbnB1dC50aXRsZSA9IHRleHRDb250cm9sVGl0bGU7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi53aWR0aCA9ICI5MCUiOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChuZXdSb3cpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0SWRlbnRpZmllclJvd1NldHRpbmdzKHRhYmxlQ29udGFpbmVySWQsaWRlbnRpZmllckluZGV4LHRNb2RlbEtleSxrZXlOYW1lLGtleVZhbHVlKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3NbbnVtYmVyT2ZIZWFkZXJSb3dzK2lkZW50aWZpZXJJbmRleF07Ci0gICAgdmFyIGlkZW50aWZpZXJUeXBlU2VsZWN0ID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKS5pdGVtKDApOwotICAgIHZhciByb3dFbGVtZW50Q29sbGVjdGlvbiA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICB2YXIga2V5TmFtZVRleHQgPSByb3dFbGVtZW50Q29sbGVjdGlvbi5pdGVtKDEpOwotICAgIHZhciBrZXlWYWx1ZVRleHQgPSByb3dFbGVtZW50Q29sbGVjdGlvbi5pdGVtKDIpOwotICAgIHNldFRNb2RlbEtleVNlbGVjdChpZGVudGlmaWVyVHlwZVNlbGVjdCx0TW9kZWxLZXkpOwotICAgIGtleU5hbWVUZXh0LnZhbHVlID0ga2V5TmFtZTsKLSAgICBrZXlWYWx1ZVRleHQudmFsdWUgPSBrZXlWYWx1ZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHBvcHVsYXRlSWRlbnRpZmllclR5cGVTZWxlY3QoaWRlbnRpZmllclR5cGVTZWxlY3QpCi0gIHsKLSAgICB2YXIgY291bnRlciA9IDA7Ci0gICAgaWRlbnRpZmllclR5cGVTZWxlY3Qub3B0aW9uc1tjb3VudGVyKytdID0gbmV3IE9wdGlvbigiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9JREVOVElGSUVSX0RVTlMiKSklPiIsIjwlPVRNb2RlbC5EX1VfTl9TX1RNT0RFTF9LRVklPiIpOwotICAgIGlkZW50aWZpZXJUeXBlU2VsZWN0Lm9wdGlvbnNbY291bnRlcisrXSA9IG5ldyBPcHRpb24oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fSURFTlRJRklFUl9USE9NQVNfUkVHSVNUUlkiKSklPiIsIjwlPVRNb2RlbC5USE9NQVNfUkVHSVNURVJfVE1PREVMX0tFWSU+Iik7Ci0gIH0KLQotICBmdW5jdGlvbiBoYW5kbGVJZGVudGlmaWVyQ2hhbmdlKGUpCi0gIHsKLSAgICB2YXIgaWRlbnRpZmllclNlbGVjdDsKLSAgICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gICAgICBpZGVudGlmaWVyU2VsZWN0ID0gZXZlbnQuc3JjRWxlbWVudDsKLSAgICBlbHNlCi0gICAgICBpZGVudGlmaWVyU2VsZWN0ID0gZS50YXJnZXQ7Ci0gICAgdmFyIGNlbGwgPSBpZGVudGlmaWVyU2VsZWN0LnBhcmVudE5vZGU7Ci0gICAgdmFyIHJvdyA9IGNlbGwucGFyZW50Tm9kZTsKLSAgICB2YXIgaW5wdXRFbGVtZW50cyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICBmb3IgKHZhciBpPTA7aTxpbnB1dEVsZW1lbnRzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKGlucHV0RWxlbWVudHMuaXRlbShpKS50eXBlID09ICJ0ZXh0IikKLSAgICAgIHsKLSAgICAgICAgaW5wdXRFbGVtZW50cy5pdGVtKGkpLnZhbHVlID0gaWRlbnRpZmllclNlbGVjdC5vcHRpb25zW2lkZW50aWZpZXJTZWxlY3Quc2VsZWN0ZWRJbmRleF0udGV4dDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gYWRkSWRlbnRpZmllclJvdyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLQotICAgIHZhciByb3dDaGVja2JveCA9IGNyZWF0ZVJvd0NoZWNrYm94KCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0KLSAgICB2YXIga2V5VHlwZVNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIGtleVR5cGVTZWxlY3Qub25jaGFuZ2UgPSBoYW5kbGVJZGVudGlmaWVyQ2hhbmdlOwotICAgIHBvcHVsYXRlSWRlbnRpZmllclR5cGVTZWxlY3Qoa2V5VHlwZVNlbGVjdCk7Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChrZXlUeXBlU2VsZWN0KTsKLQotICAgIHZhciBrZXlOYW1lVGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGtleU5hbWVUZXh0SW5wdXQpOwotCi0gICAgdmFyIGtleVZhbHVlVGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGtleVZhbHVlVGV4dElucHV0KTsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGtleVR5cGVTZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiCi0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMS53aWR0aCA9ICI1JSI7Ci0gICAga2V5TmFtZVRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIGtleU5hbWVUZXh0SW5wdXQudGl0bGUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfTkFNRSIpKSU+IjsKLSAgICBjb2x1bW4yLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4yLndpZHRoID0gIjQwJSI7Ci0gICAga2V5VmFsdWVUZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICBrZXlWYWx1ZVRleHRJbnB1dC50aXRsZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9WQUxVRSIpKSU+IjsKLSAgICBjb2x1bW4zLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4zLndpZHRoID0gIjU1JSI7Ci0KLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4yKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMyk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gICAga2V5TmFtZVRleHRJbnB1dC52YWx1ZSA9IGtleVR5cGVTZWxlY3Qub3B0aW9uc1swXS50ZXh0OwotICB9Ci0gIAotICBmdW5jdGlvbiBDYXRlZ29yeShkaXNwbGF5TmFtZSx0TW9kZWxLZXkpCi0gIHsKLSAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgdGhpcy50TW9kZWxLZXkgPSB0TW9kZWxLZXk7Ci0gIH0KLQotICBmdW5jdGlvbiBjb21wYXJlQ2F0ZWdvcnlEaXNwbGF5TmFtZXMoYSxiKQotICB7Ci0gICAgdmFyIHJlc3VsdCA9IGEuZGlzcGxheU5hbWUubG9jYWxlQ29tcGFyZShiLmRpc3BsYXlOYW1lKTsKLSAgICBpZiAocmVzdWx0IDwgMCkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlIGlmIChyZXN1bHQgPiAwKQotICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0gIAotCi0gIGZ1bmN0aW9uIHBvcHVsYXRlQ2F0ZWdvcnlUeXBlU2VsZWN0KGNhdGVnb3J5VHlwZVNlbGVjdCkKLSAgewotICAgIGlmIChjYXRlZ29yeUFycmF5Lmxlbmd0aCA9PSAwKQotICAgIHsKLTwlCi0gICBFbnVtZXJhdGlvbiBjb21tb25DYXRlZ29yaWVzID0gY29tbW9uQ2F0ZWdvcnlNb2RlbHMuZWxlbWVudHMoKTsKLSAgIHdoaWxlIChjb21tb25DYXRlZ29yaWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgewotICAgICBDYXRlZ29yeU1vZGVsIGNvbW1vbkNhdGVnb3J5TW9kZWwgPSAoQ2F0ZWdvcnlNb2RlbCljb21tb25DYXRlZ29yaWVzLm5leHRFbGVtZW50KCk7Ci0lPgotICAgICAgY2F0ZWdvcnlBcnJheVtjYXRlZ29yeUFycmF5Lmxlbmd0aF0gPSBuZXcgQ2F0ZWdvcnkoIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb21tb25DYXRlZ29yeU1vZGVsLmdldERpc3BsYXlOYW1lKCkpJT4iLCI8JT1jb21tb25DYXRlZ29yeU1vZGVsLmdldFRNb2RlbEtleSgpJT4iKTsKLTwlCi0gICB9Ci0gICBFbnVtZXJhdGlvbiB1c2VyRGVmaW5lZENhdGVnb3JpZXMgPSByZWdFbGVtZW50LmdldFVzZXJEZWZpbmVkQ2F0ZWdvcmllcygpOwotICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyAhPSBudWxsKQotICAgewotICAgICB3aGlsZSAodXNlckRlZmluZWRDYXRlZ29yaWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgICB7Ci0gICAgICAgQ2F0ZWdvcnlNb2RlbCB1c2VyRGVmaW5lZENhdGVnb3J5ID0gKENhdGVnb3J5TW9kZWwpdXNlckRlZmluZWRDYXRlZ29yaWVzLm5leHRFbGVtZW50KCk7Ci0lPgotICAgICAgY2F0ZWdvcnlBcnJheVtjYXRlZ29yeUFycmF5Lmxlbmd0aF0gPSBuZXcgQ2F0ZWdvcnkoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1c2VyRGVmaW5lZENhdGVnb3J5LmdldERpc3BsYXlOYW1lKCkpJT4iLCI8JT11c2VyRGVmaW5lZENhdGVnb3J5LmdldFRNb2RlbEtleSgpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci0gICAgICBjYXRlZ29yeUFycmF5LnNvcnQoY29tcGFyZUNhdGVnb3J5RGlzcGxheU5hbWVzKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yICh2YXIgaT0wO2k8Y2F0ZWdvcnlBcnJheS5sZW5ndGg7aSsrKQotICAgICAgY2F0ZWdvcnlUeXBlU2VsZWN0Lm9wdGlvbnNbaV0gPSBuZXcgT3B0aW9uKGNhdGVnb3J5QXJyYXlbaV0uZGlzcGxheU5hbWUsY2F0ZWdvcnlBcnJheVtpXS50TW9kZWxLZXkpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0SlNMaW5rUm93VGFyZ2V0KGxpbmssanNGdW5jdGlvbix0YWJsZUNvbnRhaW5lcklkLHJvdykKLSAgewotICAgIGxpbmsuaHJlZiA9ICJqYXZhc2NyaXB0OiIranNGdW5jdGlvbisiKCciK3RhYmxlQ29udGFpbmVySWQrIicsIityb3crIikiOwotICB9Ci0KLSAgZnVuY3Rpb24gb3BlbkNhdGVnb3J5QnJvd3Nlcih0YWJsZUNvbnRhaW5lcklkLHJvdykKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBjYXRlZ29yeVNlbGVjdCA9IHRhYmxlLnJvd3Nbcm93XS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0IikuaXRlbSgwKTsKLSAgICB2YXIgc2VsZWN0ZWRDYXRlZ29yeU9wdGlvbiA9IGNhdGVnb3J5U2VsZWN0Lm9wdGlvbnNbY2F0ZWdvcnlTZWxlY3Qub3B0aW9ucy5zZWxlY3RlZEluZGV4XTsKLSAgICB2YXIgY2F0ZWdvcnlUeXBlID0gdGFibGUucm93c1tyb3ddLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKS5pdGVtKDApLm9wdGlvbnMuc2VsZWN0ZWRJbmRleDsKLSAgICB2YXIgY29sdW1ucyA9IHRhYmxlLnJvd3Nbcm93XS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB0YXJnZXRDYXRlZ29yeVJvdyA9IHJvdzsKLSAgICB0YXJnZXRDYXRlZ29yeUtleU5hbWVFbGVtZW50ID0gY29sdW1ucy5pdGVtKDIpLmNoaWxkTm9kZXNbMF07Ci0gICAgdGFyZ2V0Q2F0ZWdvcnlLZXlWYWx1ZUVsZW1lbnQgPSBjb2x1bW5zLml0ZW0oMykuY2hpbGROb2Rlc1swXTsKLSAgICB2YXIgbGluayA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlbkNhdGVnb3J5QnJvd3NlckFjdGlvbi5nZXRXaWxkQ2FyZEFjdGlvbkxpbmsoc2Vzc2lvbklkKSkpJT4iOwotICAgIGNhdGVnb3J5V2luZG93ID0gd2luZG93Lm9wZW4obGluay5yZXBsYWNlKHdpbGRjYXJkQ2F0ZWdvcnlCcm93c2VyVVJMUmUsc2VsZWN0ZWRDYXRlZ29yeU9wdGlvbi52YWx1ZSksImNhdGVnb3J5V2luZG93IiwiaGVpZ2h0PTMwMCx3aWR0aD0zMDAsc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzIik7Ci0gICAgaWYgKGNhdGVnb3J5V2luZG93LmZvY3VzKQotICAgICAgY2F0ZWdvcnlXaW5kb3cuZm9jdXMoKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGNsb3NlQ2F0ZWdvcnlCcm93c2VyKCkKLSAgewotICAgIGlmICghY2F0ZWdvcnlXaW5kb3dDbG9zZWQpCi0gICAgICBjYXRlZ29yeVdpbmRvdy5jbG9zZSgpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0Q2F0ZWdvcnlSb3dTZXR0aW5ncyh0YWJsZUNvbnRhaW5lcklkLGNhdGVnb3J5SW5kZXgsdE1vZGVsS2V5LGtleU5hbWUsa2V5VmFsdWUpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3MrY2F0ZWdvcnlJbmRleF07Ci0gICAgdmFyIGNhdGVnb3J5VHlwZVNlbGVjdCA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0IikuaXRlbSgwKTsKLSAgICB2YXIgcm93RWxlbWVudENvbGxlY3Rpb24gPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgdmFyIGtleU5hbWVUZXh0ID0gcm93RWxlbWVudENvbGxlY3Rpb24uaXRlbSgxKTsKLSAgICB2YXIga2V5VmFsdWVUZXh0ID0gcm93RWxlbWVudENvbGxlY3Rpb24uaXRlbSgyKTsKLSAgICBzZXRUTW9kZWxLZXlTZWxlY3QoY2F0ZWdvcnlUeXBlU2VsZWN0LHRNb2RlbEtleSk7Ci0gICAga2V5TmFtZVRleHQudmFsdWUgPSBrZXlOYW1lOwotICAgIGtleVZhbHVlVGV4dC52YWx1ZSA9IGtleVZhbHVlOwotICB9Ci0KLSAgZnVuY3Rpb24gYWRkQ2F0ZWdvcnlSb3dCcm93c2VMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIGJyb3dzZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgc2V0SlNMaW5rUm93VGFyZ2V0KGJyb3dzZUxpbmssIm9wZW5DYXRlZ29yeUJyb3dzZXIiLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGJyb3dzZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19CUk9XU0UiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoYnJvd3NlTGluayk7Ci0gIH0KLQotICBmdW5jdGlvbiBhZGRDYXRlZ29yeVJvdyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotCi0gICAgdmFyIGNhdGVnb3J5VHlwZVNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIHBvcHVsYXRlQ2F0ZWdvcnlUeXBlU2VsZWN0KGNhdGVnb3J5VHlwZVNlbGVjdCk7Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjYXRlZ29yeVR5cGVTZWxlY3QpOwotCi0gICAgdmFyIGtleU5hbWVUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjIuYXBwZW5kQ2hpbGQoa2V5TmFtZVRleHRJbnB1dCk7Ci0KLSAgICB2YXIga2V5VmFsdWVUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQoa2V5VmFsdWVUZXh0SW5wdXQpOwotCi0gICAgYWRkQ2F0ZWdvcnlSb3dCcm93c2VMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0KLSAgICBjb2x1bW4wLmNsYXNzTmFtZSA9ICJjaGVja2JveGNlbGxzIjsKLSAgICBjYXRlZ29yeVR5cGVTZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjEud2lkdGggPSAiNSUiOwotICAgIGtleU5hbWVUZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICBrZXlOYW1lVGV4dElucHV0LnRpdGxlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FIikpJT4iOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIud2lkdGggPSAiNTUlIjsKLSAgICBrZXlWYWx1ZVRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIGtleVZhbHVlVGV4dElucHV0LnRpdGxlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRSIpKSU+IjsKLSAgICBjb2x1bW4zLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4zLndpZHRoID0gIjI1JSI7Ci0gICAgY29sdW1uNC5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0KLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4yKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMyk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjQpOwotICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChuZXdSb3cpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGlzY292ZXJ5VVJMUm93U2V0dGluZ3ModGFibGVDb250YWluZXJJZCxkaXNjb3ZlcnlVUkxJbmRleCxkaXNjb3ZlcnlVUkwpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3MrZGlzY292ZXJ5VVJMSW5kZXhdOwotICAgIHZhciByb3dFbGVtZW50Q29sbGVjdGlvbiA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICB2YXIgZGlzY292ZXJ5VVJMVGV4dElucHV0ID0gcm93RWxlbWVudENvbGxlY3Rpb24uaXRlbSgxKTsKLSAgICBkaXNjb3ZlcnlVUkxUZXh0SW5wdXQudmFsdWUgPSBkaXNjb3ZlcnlVUkw7Ci0gIH0KLQotICBmdW5jdGlvbiBhZGREaXNjb3ZlcnlVUkxSb3codGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLQotICAgIHZhciBkaXNjb3ZlcnlVUkxUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoZGlzY292ZXJ5VVJMVGV4dElucHV0KTsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGRpc2NvdmVyeVVSTFRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIGRpc2NvdmVyeVVSTFRleHRJbnB1dC50aXRsZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9ESVNDT1ZFUllfVVJMIikpJT4iOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjEud2lkdGggPSAiOTUlIjsKLQotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiBhZGRSZXN1bHRSb3codGFibGVDb250YWluZXJJZCxub2RlSWQsdXJsLG5hbWUsZGVzY3JpcHRpb24pCi0gIHsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIixub2RlSWQpKTsKLQotICAgIHZhciBuYW1lRGV0YWlsc0xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgbmFtZURldGFpbHNMaW5rLmhyZWYgPSB1cmw7Ci0gICAgbmFtZURldGFpbHNMaW5rLnRhcmdldCA9ICI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iOwotICAgIG5hbWVEZXRhaWxzTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuYW1lKSk7Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChuYW1lRGV0YWlsc0xpbmspOwotCi0gICAgY29sdW1uMi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShnZXREZWZhdWx0RGlzcGxheVN0cmluZyhkZXNjcmlwdGlvbikpKTsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjEud2lkdGggPSAiNDglIjsKLSAgICBjb2x1bW4yLndpZHRoID0gIjQ4JSI7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMik7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiBnZXRGaW5kUXVhbGlmaWVyVGFibGUoY29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpOwotICAgIHJldHVybiBjb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRhYmxlIikuaXRlbSgxKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldEZpbmRRdWFsaWZpZXIoZmluZFF1YWxpZmllcixuYW1lVGFibGVDb250YWluZXJJZCxjYXRlZ29yeVRhYmxlQ29udGFpbmVySWQsZmluZFF1YWxpZmllcnNUYWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHR3aXN0T3Blbk5hbWVzID0gZmFsc2U7Ci0gICAgdmFyIHR3aXN0T3BlbkNhdGVnb3JpZXMgPSBmYWxzZTsKLSAgICB2YXIgdHdpc3RPcGVuRmluZFF1YWxpZmllcnMgPSBmYWxzZTsKLQotICAgIGlmIChmaW5kUXVhbGlmaWVyID09ICI8JT1GaW5kUXVhbGlmaWVyLmV4YWN0TmFtZU1hdGNoJT4iKQotICAgIHsKLSAgICAgIHZhciBmcVRhYmxlID0gZ2V0RmluZFF1YWxpZmllclRhYmxlKG5hbWVUYWJsZUNvbnRhaW5lcklkKTsKLSAgICAgIHZhciBleGFjdE5hbWVNYXRjaENoZWNrYm94ID0gZnFUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgZXhhY3ROYW1lTWF0Y2hDaGVja2JveC5jaGVja2VkID0gdHJ1ZTsKLSAgICAgIHR3aXN0T3Blbk5hbWVzID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZmluZFF1YWxpZmllciA9PSAiPCU9RmluZFF1YWxpZmllci5jYXNlU2Vuc2l0aXZlTWF0Y2glPiIpCi0gICAgewotICAgICAgdmFyIGZxVGFibGUgPSBnZXRGaW5kUXVhbGlmaWVyVGFibGUobmFtZVRhYmxlQ29udGFpbmVySWQpOwotICAgICAgdmFyIGNhc2VTZW5zaXRpdmVNYXRjaENoZWNrYm94ID0gZnFUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDEpOwotICAgICAgY2FzZVNlbnNpdGl2ZU1hdGNoQ2hlY2tib3guY2hlY2tlZCA9IHRydWU7Ci0gICAgICB0d2lzdE9wZW5OYW1lcyA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIuc2VydmljZVN1YnNldCU+IiB8fCBmaW5kUXVhbGlmaWVyID09ICI8JT1GaW5kUXVhbGlmaWVyLmNvbWJpbmVDYXRlZ29yeUJhZ3MlPiIpCi0gICAgewotICAgICAgdmFyIGZxVGFibGUgPSBnZXRGaW5kUXVhbGlmaWVyVGFibGUoY2F0ZWdvcnlUYWJsZUNvbnRhaW5lcklkKTsKLSAgICAgIHZhciBjYXRlZ29yeVNlbGVjdCA9IGZxVGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlbGVjdCIpLml0ZW0oMCk7Ci0gICAgICBzZXRTZWxlY3QoY2F0ZWdvcnlTZWxlY3QsZmluZFF1YWxpZmllcik7Ci0gICAgICB0d2lzdE9wZW5DYXRlZ29yaWVzID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZmluZFF1YWxpZmllciA9PSAiPCU9RmluZFF1YWxpZmllci5hbmRBbGxLZXlzJT4iIHx8IGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIub3JBbGxLZXlzJT4iIHx8IGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIub3JMaWtlS2V5cyU+IikKLSAgICB7Ci0gICAgICB2YXIgZnFUYWJsZSA9IGdldFRhYmxlKGZpbmRRdWFsaWZpZXJzVGFibGVDb250YWluZXJJZCk7Ci0gICAgICB2YXIga2V5U2VsZWN0ID0gZnFUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0IikuaXRlbSgwKTsKLSAgICAgIHNldFNlbGVjdChrZXlTZWxlY3QsZmluZFF1YWxpZmllcik7Ci0gICAgICBpZiAoZmluZFF1YWxpZmllciAhPSAiPCU9RmluZFF1YWxpZmllci5hbmRBbGxLZXlzJT4iKQotICAgICAgICB0d2lzdE9wZW5GaW5kUXVhbGlmaWVycyA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5TmFtZUFzYyU+IiB8fCBmaW5kUXVhbGlmaWVyID09ICI8JT1GaW5kUXVhbGlmaWVyLnNvcnRCeU5hbWVEZXNjJT4iIHx8IGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5RGF0ZUFzYyU+IiB8fCBmaW5kUXVhbGlmaWVyID09ICI8JT1GaW5kUXVhbGlmaWVyLnNvcnRCeURhdGVEZXNjJT4iKQotICAgIHsKLSAgICAgIHZhciBmcVRhYmxlID0gZ2V0VGFibGUoZmluZFF1YWxpZmllcnNUYWJsZUNvbnRhaW5lcklkKTsKLSAgICAgIHZhciBzb3J0Q29sbGVjdGlvbiA9IGZxVGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgICBmb3IgKHZhciBpPTA7aTxzb3J0Q29sbGVjdGlvbi5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBpZiAoc29ydENvbGxlY3Rpb24uaXRlbShpKS52YWx1ZSA9PSBmaW5kUXVhbGlmaWVyKQotICAgICAgICAgIHNvcnRDb2xsZWN0aW9uLml0ZW0oaSkuY2hlY2tlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoZmluZFF1YWxpZmllciAhPSAiPCU9RmluZFF1YWxpZmllci5zb3J0QnlOYW1lQXNjJT4iICYmIGZpbmRRdWFsaWZpZXIgIT0gIjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5RGF0ZUFzYyU+IikKLSAgICAgICAgdHdpc3RPcGVuRmluZFF1YWxpZmllcnMgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICh0d2lzdE9wZW5OYW1lcykKLSAgICAgIHR3aXN0T3BlbihuYW1lVGFibGVDb250YWluZXJJZCk7Ci0gICAgaWYgKHR3aXN0T3BlbkNhdGVnb3JpZXMpCi0gICAgICB0d2lzdE9wZW4oY2F0ZWdvcnlUYWJsZUNvbnRhaW5lcklkKTsKLSAgICBpZiAodHdpc3RPcGVuRmluZFF1YWxpZmllcnMpCi0gICAgICB0d2lzdE9wZW4oZmluZFF1YWxpZmllcnNUYWJsZUNvbnRhaW5lcklkKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUodGFibGVDb250YWluZXJJZCxsYW5nVmFyLHRleHRWYXIsZm9ybSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBsYW5ndWFnZVNlbGVjdHMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0Iik7Ci0gICAgdmFyIHRleHRJbnB1dHMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICBmb3IgKHZhciBpPTA7aTxsYW5ndWFnZVNlbGVjdHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgaGlkZGVuTGFuZ3VhZ2VTZWxlY3QgPSBjcmVhdGVIaWRkZW5FbGVtZW50KGxhbmdWYXIsbGFuZ3VhZ2VTZWxlY3RzW2ldLnZhbHVlKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuTGFuZ3VhZ2VTZWxlY3QpOwotICAgIH0KLQotICAgIGZvciAodmFyIGk9MDtpPHRleHRJbnB1dHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAodGV4dElucHV0c1tpXS50eXBlID09ICJ0ZXh0IikKLSAgICAgIHsKLSAgICAgICAgdmFyIGhpZGRlblRleHRJbnB1dCA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQodGV4dFZhcix0ZXh0SW5wdXRzW2ldLnZhbHVlKTsKLSAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5UZXh0SW5wdXQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NOYW1lRmluZFF1YWxpZmllcnModGFibGVDb250YWluZXJJZCxmb3JtKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0RmluZFF1YWxpZmllclRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBuYW1lRmluZFF1YWxpZmllckNoZWNrYm94ZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICBmb3IgKHZhciBpPTA7aTxuYW1lRmluZFF1YWxpZmllckNoZWNrYm94ZXMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgaXRlbSA9IG5hbWVGaW5kUXVhbGlmaWVyQ2hlY2tib3hlcy5pdGVtKGkpOwotICAgICAgaWYgKGl0ZW0uY2hlY2tlZCkKLSAgICAgIHsKLSAgICAgICAgdmFyIGhpZGRlbkZpbmRRdWFsaWZpZXIgPSBjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0ZJTkRRVUFMSUZJRVIlPiIsaXRlbS52YWx1ZSk7Ci0gICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuRmluZFF1YWxpZmllcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc0lkZW50aWZpZXJUYWJsZSh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgaWRlbnRpZmllclR5cGVTZWxlY3RzID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlbGVjdCIpOwotICAgIHZhciB0ZXh0SW5wdXRzID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgZm9yICh2YXIgaT0wO2k8aWRlbnRpZmllclR5cGVTZWxlY3RzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIGhpZGRlbklkZW50aWZpZXJUeXBlU2VsZWN0ID0gY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX1RZUEUlPiIsaWRlbnRpZmllclR5cGVTZWxlY3RzW2ldLnZhbHVlKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuSWRlbnRpZmllclR5cGVTZWxlY3QpOwotICAgIH0KLQotICAgIHZhciBpc0tleU5hbWUgPSB0cnVlOwotICAgIGZvciAodmFyIGk9MDtpPHRleHRJbnB1dHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAodGV4dElucHV0c1tpXS50eXBlID09ICJ0ZXh0IikKLSAgICAgIHsKLSAgICAgICAgdmFyIG5hbWU7Ci0gICAgICAgIGlmIChpc0tleU5hbWUpCi0gICAgICAgICAgbmFtZSA9ICI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX05BTUUlPiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuYW1lID0gIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfVkFMVUUlPiI7Ci0gICAgICAgIHZhciBoaWRkZW5UZXh0SW5wdXQgPSBjcmVhdGVIaWRkZW5FbGVtZW50KG5hbWUsdGV4dElucHV0c1tpXS52YWx1ZSk7Ci0gICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dElucHV0KTsKLSAgICAgICAgaXNLZXlOYW1lID0gIWlzS2V5TmFtZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzQ2F0ZWdvcnlUYWJsZSh0YWJsZUNvbnRhaW5lcklkLGZvcm0saXNGaW5kQnVzaW5lc3MpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgY2F0ZWdvcnlUeXBlU2VsZWN0cyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKTsKLSAgICB2YXIgdGV4dElucHV0cyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOwotICAgIGZvciAodmFyIGk9MDtpPGNhdGVnb3J5VHlwZVNlbGVjdHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgaGlkZGVuQ2F0ZWdvcnlUeXBlU2VsZWN0ID0gY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFJT4iLGNhdGVnb3J5VHlwZVNlbGVjdHNbaV0udmFsdWUpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5DYXRlZ29yeVR5cGVTZWxlY3QpOwotICAgIH0KLQotICAgIHZhciBpc0tleU5hbWUgPSB0cnVlOwotICAgIGZvciAodmFyIGk9MDtpPHRleHRJbnB1dHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAodGV4dElucHV0c1tpXS50eXBlID09ICJ0ZXh0IikKLSAgICAgIHsKLSAgICAgICAgdmFyIG5hbWU7Ci0gICAgICAgIGlmIChpc0tleU5hbWUpCi0gICAgICAgICAgbmFtZSA9ICI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9OQU1FJT4iOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmFtZSA9ICI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSU+IjsKLSAgICAgICAgdmFyIGhpZGRlblRleHRJbnB1dCA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQobmFtZSx0ZXh0SW5wdXRzW2ldLnZhbHVlKTsKLSAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5UZXh0SW5wdXQpOwotICAgICAgICBpc0tleU5hbWUgPSAhaXNLZXlOYW1lOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc0ZpbmRCdXNpbmVzcykKLSAgICB7Ci0gICAgICB0YWJsZSA9IGdldEZpbmRRdWFsaWZpZXJUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICAgIHZhciBjYXRlZ29yeUZpbmRRdWFsaWZpZXIgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0IikuaXRlbSgwKTsKLSAgICAgIGlmIChjYXRlZ29yeUZpbmRRdWFsaWZpZXIuc2VsZWN0ZWRJbmRleCAhPSAwKQotICAgICAgewotICAgICAgICB2YXIgaGlkZGVuRmluZFF1YWxpZmllciA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRklORFFVQUxJRklFUiU+IixjYXRlZ29yeUZpbmRRdWFsaWZpZXIudmFsdWUpOwotICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGhpZGRlbkZpbmRRdWFsaWZpZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NEaXNjb3ZlcnlVUkxUYWJsZSh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGV4dElucHV0cyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOwotICAgIGZvciAodmFyIGk9MDtpPHRleHRJbnB1dHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAodGV4dElucHV0c1tpXS50eXBlID09ICJ0ZXh0IikKLSAgICAgIHsKLSAgICAgICAgdmFyIGhpZGRlblRleHRJbnB1dCA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRElTQ09WRVJZVVJMJT4iLHRleHRJbnB1dHNbaV0udmFsdWUpOwotICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGhpZGRlblRleHRJbnB1dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc0ZpbmRRdWFsaWZpZXJUYWJsZSh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgZmluZFF1YWxpZmllclNlbGVjdHMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0Iik7Ci0gICAgZm9yICh2YXIgaT0wO2k8ZmluZFF1YWxpZmllclNlbGVjdHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgZmluZFF1YWxpZmllclNlbGVjdCA9IGZpbmRRdWFsaWZpZXJTZWxlY3RzLml0ZW0oaSk7Ci0gICAgICB2YXIgaGlkZGVuRmluZFF1YWxpZmllciA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRklORFFVQUxJRklFUiU+IixmaW5kUXVhbGlmaWVyU2VsZWN0LnZhbHVlKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuRmluZFF1YWxpZmllcik7Ci0gICAgfQotCi0gICAgdmFyIGZpbmRRdWFsaWZpZXJTb3J0UmFkaW9zID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgZm9yICh2YXIgaT0wO2k8ZmluZFF1YWxpZmllclNvcnRSYWRpb3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAoZmluZFF1YWxpZmllclNvcnRSYWRpb3MuaXRlbShpKS5jaGVja2VkKQotICAgICAgewotICAgICAgICB2YXIgaGlkZGVuU29ydEVsZW1lbnQgPSBjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0ZJTkRRVUFMSUZJRVIlPiIsZmluZFF1YWxpZmllclNvcnRSYWRpb3MuaXRlbShpKS52YWx1ZSk7Ci0gICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuU29ydEVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NSZXN1bHRUYWJsZSh0YWJsZUNvbnRhaW5lcklkLGlucHV0TmFtZSxmb3JtLHNlbGVjdGVkT25seSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBpbnB1dHMgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOwotICAgICAgaWYgKHNlbGVjdGVkT25seSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlucHV0cy5pdGVtKDApLmNoZWNrZWQpCi0gICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KGlucHV0TmFtZSxpbnB1dHMuaXRlbSgxKS52YWx1ZSkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoaW5wdXROYW1lLGlucHV0cy5pdGVtKDEpLnZhbHVlKSk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gaW5pdGlhdGVTdWJRdWVyeShmb3JtQ29udGFpbmVySWQsbmV3U3ViUXVlcnlLZXkscXVlcnlJdGVtLGlzR2V0KQotICB7Ci0gICAgaWYgKGlzR2V0KQotICAgIHsKLSAgICAgIHZhciBoYXNHZXRJdGVtcyA9IGZhbHNlOwotICAgICAgc3dpdGNoIChxdWVyeUl0ZW0pCi0gICAgICB7Ci0gICAgICAgIGNhc2UgPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPjoKLSAgICAgICAgICBoYXNHZXRJdGVtcyA9IDwlPXJlZ05vZGUuaGFzQnVzaW5lc3MoKSU+OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyU+OgotICAgICAgICAgIGhhc0dldEl0ZW1zID0gPCU9cmVnTm9kZS5oYXNTZXJ2aWNlKCklPjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT46Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaGFzR2V0SXRlbXMgPSA8JT1yZWdOb2RlLmhhc1NlcnZpY2VJbnRlcmZhY2UoKSU+OwotICAgICAgfQotICAgICAgaWYgKCFoYXNHZXRJdGVtcykKLSAgICAgIHsKLSAgICAgICAgYWxlcnQoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0lURU1TX1RPX0dFVCIpKSU+Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgdmFyIGZvcm1Db250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtQ29udGFpbmVySWQpOwotICAgIHZhciBmb3JtID0gZm9ybUNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCU+LnZhbHVlID0gaXNHZXQ7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPi52YWx1ZSA9IG5ld1N1YlF1ZXJ5S2V5OwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSU+LnZhbHVlID0gcXVlcnlJdGVtOwotICAgIHZhciBva1RvU3VibWl0ID0gZmFsc2U7Ci0gICAgaWYgKGZvcm1Db250YWluZXJJZCA9PSAiZmluZEJ1c2luZXNzZXNBZHZhbmNlZCIpCi0gICAgICBva1RvU3VibWl0ID0gcHJvY2Vzc0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRGb3JtKGZvcm0pOwotICAgIGVsc2UgaWYgKGZvcm1Db250YWluZXJJZCA9PSAiZmluZFNlcnZpY2VzQWR2YW5jZWQiKQotICAgICAgb2tUb1N1Ym1pdCA9IHByb2Nlc3NGaW5kU2VydmljZXNBZHZhbmNlZEZvcm0oZm9ybSk7Ci0gICAgZWxzZSBpZiAoZm9ybUNvbnRhaW5lcklkID09ICJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZCIpCi0gICAgICBva1RvU3VibWl0ID0gcHJvY2Vzc0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRm9ybShmb3JtKTsKLSAgICBlbHNlIGlmIChmb3JtQ29udGFpbmVySWQgPT0gInB1Ymxpc2hTZXJ2aWNlU2ltcGxlIikKLSAgICAgIG9rVG9TdWJtaXQgPSBwcm9jZXNzUHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtKGZvcm0pOwotICAgIGVsc2UgaWYgKGZvcm1Db250YWluZXJJZCA9PSAicHVibGlzaFNlcnZpY2VBZHZhbmNlZCIpCi0gICAgICBva1RvU3VibWl0ID0gcHJvY2Vzc1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtKGZvcm0pOwotICAgIGVsc2UgaWYgKGZvcm1Db250YWluZXJJZCA9PSAicHVibGlzaGVyQXNzZXJ0aW9ucyIpCi0gICAgICBva1RvU3VibWl0ID0gaGFuZGxlU3VibWl0KGZvcm0pOwotICAgIGVsc2UgaWYgKGZvcm1Db250YWluZXJJZCA9PSAibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzIikKLSAgICAgIG9rVG9TdWJtaXQgPSBwcm9jZXNzRm9ybShmb3JtKTsKLSAgICBpZiAob2tUb1N1Ym1pdCkKLSAgICAgIGZvcm0uc3VibWl0KCk7Ci0gIH0KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3N0YXR1c19jb250YWluZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3N0YXR1c19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjg4ODgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zdGF0dXNfY29udGFpbmVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVIiKSU+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPVVERElGcmFtZU5hbWVzLlNUQVRVU19UT09MQkFSJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfdG9vbGJhci5qc3AiKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuU1RBVFVTX0NPTlRFTlQlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3N0YXR1c19jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zdGF0dXNfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNjI2ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3N0YXR1c19jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTI3NDQzIGplc3BlckBzZWxza2FiZXQub3JnIC0gSmVzcGVyIFMgTW9sbGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0Jb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxwcmU+Ci08JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5nZXRNZXNzYWdlc0Zyb21MaXN0KCkpJT4KLSAgICAgICAgPC9wcmU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zdGF0dXNfdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc3RhdHVzX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzgzZjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zdGF0dXNfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPiAgCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90b29sYmFyLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJ1ZGRpL2FjdGlvbnMvUmVzaXplVURESUZyYW1lc0FjdGlvbkpTUC5qc3AiKTsKLSU+ICAKLTwvanNwOnVzZUJlYW4+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUZyYW1lTmFtZS5hcHBlbmQoVURESUZyYW1lTmFtZXMuU1RBVFVTX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9Qcm9jZXNzVURESUZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3N0YXR1cy5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci08JQotICAgU3RyaW5nIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBudWxsOwotICAgaWYgKHVkZGlQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgewotICAgICBpZiAodWRkaVBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgfQotICAgaWYgKGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPT0gbnVsbCkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9TVEFUVVMiKSU+PC90ZD4KLTwlCi0gICBTdHJpbmcgYWx0Q2xlYXIgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9DTEVBUiIpOwotJT4gICAgICAgICAgIAotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iIHRhcmdldD0iPCU9VURESUZyYW1lTmFtZXMuU1RBVFVTX0NPTlRFTlQlPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRDbGVhciU+IiB0aXRsZT0iPCU9YWx0Q2xlYXIlPiI+PC9hPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvdWRkaV9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS91ZGRpX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjYxYmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS91ZGRpX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfVURESV9QRVJTUEVDVElWRV9DT05URU5UIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgY29scz0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpJT4iIGJnY29sb3I9I0VDRTlEOD4KLSAgPCUKLSAgaWYgKG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmlzUlRMKCkpCi0gIHsKLSAgJT4KLSAgPGZyYW1lIG5hbWU9IjwlPVVERElGcmFtZU5hbWVzLkFDVElPTlNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zX2NvbnRhaW5lci5qc3AiKSklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9uYXZpZ2F0b3JfY29udGFpbmVyLmpzcCIpKSU+IiBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTE+Ci0gIDwlCi0gIH0KLSAgZWxzZQotICB7Ci0gICU+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL25hdmlnYXRvcl9jb250YWluZXIuanNwIikpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPGZyYW1lIG5hbWU9IjwlPVVERElGcmFtZU5hbWVzLkFDVElPTlNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zX2NvbnRhaW5lci5qc3AiKSklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotICA8JQotICB9Ci0gICU+Ci08L2ZyYW1lc2V0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0NsZWFyV1NETEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9DbGVhcldTRExBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjc1OGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0NsZWFyV1NETEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLkNsZWFyV1NETEFjdGlvbiIlPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotQ2xlYXJXU0RMQWN0aW9uIGFjdGlvbiA9IG5ldyBDbGVhcldTRExBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvQ2xlYXJOb2RlQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0NyZWF0ZUluc3RhbmNlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0NyZWF0ZUluc3RhbmNlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4ZWViMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9DcmVhdGVJbnN0YW5jZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExGcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5DcmVhdGVJbnN0YW5jZUFjdGlvbiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotICA8JQotICBDcmVhdGVJbnN0YW5jZUFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlSW5zdGFuY2VBY3Rpb24oY29udHJvbGxlcik7Ci0gIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0gIGFjdGlvbi5leGVjdXRlKCk7Ci0gICU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICA8L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cEdldE9wZXJhdGlvbkZvcm1BY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDljOWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgPCUKLSAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICBJbnZva2VXU0RMSHR0cEdldE9wZXJhdGlvbkZvcm1BY3Rpb24gYWN0aW9uID0gbmV3IEludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbihjb250cm9sbGVyKTsKLQotICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgaWYgKGlucHV0c1ZhbGlkKQotICB7Ci0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotICB9Ci0gICU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgd3NkbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvSW52b2tlV1NETEh0dHBQb3N0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cFBvc3RPcGVyYXRpb25Gb3JtQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmNGU1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cFBvc3RPcGVyYXRpb25Gb3JtQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotICA8JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIEludm9rZVdTRExIdHRwUG9zdE9wZXJhdGlvbkZvcm1BY3Rpb24gYWN0aW9uID0gbmV3IEludm9rZVdTRExIdHRwUG9zdE9wZXJhdGlvbkZvcm1BY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gIGlmIChpbnB1dHNWYWxpZCkKLSAgewotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgfQotICAlPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvbkZvcm1BY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRmZTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETEFjdGlvbklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQuSFRUUEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudHJhbnNwb3J0LkhUVFBUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5taXNjLkJBU0U2NERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLUludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbiBhY3Rpb24gPSBuZXcgSW52b2tlV1NETFNPQVBPcGVyYXRpb25Gb3JtQWN0aW9uKGNvbnRyb2xsZXIpOwotU3RyaW5nIGh0dHBCYXNpY0F1dGhEYXRhID0gcmVxdWVzdC5nZXRIZWFkZXIoSFRUUFRyYW5zcG9ydC5IVFRQX0hFQURFUl9BVVRIKTsKLWlmIChodHRwQmFzaWNBdXRoRGF0YSAhPSBudWxsICYmIGh0dHBCYXNpY0F1dGhEYXRhLmxlbmd0aCgpID4gMCkKLXsKLSAgaW50IGJhc2ljSW5kZXggPSBodHRwQmFzaWNBdXRoRGF0YS5pbmRleE9mKEhUVFBUcmFuc3BvcnQuQkFTSUMpOwotICBpZiAoYmFzaWNJbmRleCAhPSAtMSkKLSAgewotICAgIEJBU0U2NERlY29kZXIgZGVjb2RlciA9IG5ldyBCQVNFNjREZWNvZGVyKCk7Ci0gICAgaHR0cEJhc2ljQXV0aERhdGEgPSBuZXcgU3RyaW5nKGRlY29kZXIuZGVjb2RlQnVmZmVyKGh0dHBCYXNpY0F1dGhEYXRhLnN1YnN0cmluZyhiYXNpY0luZGV4ICsgSFRUUFRyYW5zcG9ydC5CQVNJQy5sZW5ndGgoKSArIDEpKSk7Ci0gICAgaW50IGNvbG9uSW5kZXggPSBodHRwQmFzaWNBdXRoRGF0YS5pbmRleE9mKEhUVFBUcmFuc3BvcnQuQ09MT04pOwotICAgIGlmIChjb2xvbkluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGFjdGlvbi5hZGRQcm9wZXJ0eShXU0RMQWN0aW9uSW5wdXRzLkhUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRSwgaHR0cEJhc2ljQXV0aERhdGEuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpKTsKLSAgICAgIGFjdGlvbi5hZGRQcm9wZXJ0eShXU0RMQWN0aW9uSW5wdXRzLkhUVFBfQkFTSUNfQVVUSF9QQVNTV09SRCwgaHR0cEJhc2ljQXV0aERhdGEuc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxLCBodHRwQmFzaWNBdXRoRGF0YS5sZW5ndGgoKSkpOwotICAgIH0KLSAgfQotfQotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotaWYgKCFpbnB1dHNWYWxpZCkKLXsKLSU+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDxodG1sPgotICAgIDxoZWFkPgotICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij48L3NjcmlwdD4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgPC9zY3JpcHQ+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08JQotfQotZWxzZQotewotICB0cnkKLSAgewotICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+PC9zY3JpcHQ+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICB3c2RsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgICAgPCUKLSAgICAgICAgICBpZiAoYWN0aW9uUmVzdWx0KQotICAgICAgICAgIHsKLSAgICAgICAgICAlPgotICAgICAgICAgICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcmVzdWx0X2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICAgIDwlCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgJT4KLSAgICAgICAgICAgIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICA8JQotICAgICAgICAgIH0KLSAgICAgICAgICAlPgotICAgICAgICA8L3NjcmlwdD4KLSAgICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci08JQotICB9Ci0gIGNhdGNoIChIVFRQRXhjZXB0aW9uIGh0dHBlKQotICB7Ci0gICAgaW50IGNvZGUgPSBodHRwZS5nZXRTdGF0dXNDb2RlKCk7Ci0gICAgaWYgKGNvZGUgPT0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQpCi0gICAgewotICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKGNvZGUpOwotICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKEhUVFBUcmFuc3BvcnQuSFRUUF9IRUFERVJfQ09OVEVOVF9MRU5HVEgsIFN0cmluZy52YWx1ZU9mKDApKTsKLSAgICAgIFN0cmluZyB3d3dBdXRoRGF0YSA9IGh0dHBlLmdldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX1dXV19BVVRILnRvTG93ZXJDYXNlKCkpOwotICAgICAgaWYgKHd3d0F1dGhEYXRhID09IG51bGwpCi0gICAgICAgIHd3d0F1dGhEYXRhID0gaHR0cGUuZ2V0SGVhZGVyKEhUVFBUcmFuc3BvcnQuSFRUUF9IRUFERVJfV1dXX0FVVEgpOwotICAgICAgaWYgKHd3d0F1dGhEYXRhID09IG51bGwpCi0gICAgICAgIHd3d0F1dGhEYXRhID0gSFRUUFRyYW5zcG9ydC5CQVNJQzsKLSAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX1dXV19BVVRILCB3d3dBdXRoRGF0YSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoU3RyaW5nLnZhbHVlT2YoY29kZSkpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoaHR0cGUuZ2V0U3RhdHVzTWVzc2FnZSgpKTsKLSAgICAgICU+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDxodG1sPgotICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij48L3NjcmlwdD4KLSAgICAgICAgICA8L2hlYWQ+Ci0gICAgICAgICAgPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgICAgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICAgICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgICAgPC9ib2R5PgotICAgICAgICA8L2h0bWw+Ci0gICAgICA8JQotICAgIH0KLSAgfQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwNzY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvblNvdXJjZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMQWN0aW9uSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQuSFRUUEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudHJhbnNwb3J0LkhUVFBUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5taXNjLkJBU0U2NERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLioiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotSW52b2tlV1NETFNPQVBPcGVyYXRpb25Tb3VyY2VBY3Rpb24gYWN0aW9uID0gbmV3IEludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotICAKLWlmIChhY3Rpb24ud2FzU2F2ZUFzU2VsZWN0ZWQoKSkKLXsKLSAgLy8gd3JpdGUgdG8gZmlsZSBzeXN0ZW0KLSAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCJhdHRhY2htZW50O2ZpbGVuYW1lPSIrYWN0aW9uLmdldERlZmF1bHRTYXZlQXNGaWxlTmFtZSgpKTsKLSAgYWN0aW9uLndyaXRlU291cmNlQ29udGVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7ICAgIAotfQotZWxzZQotewotICBpZiAoIWlucHV0c1ZhbGlkKQotICB7Ci0gICU+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+PC9zY3JpcHQ+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgIDwvc2NyaXB0PgotICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLSAgPCUKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpZiAoYWN0aW9uLndhc05ld0ZpbGVTZWxlY3RlZCgpKQotICAgIHsgICAgIAotICAlPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij48L3NjcmlwdD4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotICAgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgd3NkbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwvYm9keT4KLSAgICAgIDwvaHRtbD4KLSAgICA8JSAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBodHRwQmFzaWNBdXRoRGF0YSA9IHJlcXVlc3QuZ2V0SGVhZGVyKEhUVFBUcmFuc3BvcnQuSFRUUF9IRUFERVJfQVVUSCk7Ci0gICAgICBpZiAoaHR0cEJhc2ljQXV0aERhdGEgIT0gbnVsbCAmJiBodHRwQmFzaWNBdXRoRGF0YS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGludCBiYXNpY0luZGV4ID0gaHR0cEJhc2ljQXV0aERhdGEuaW5kZXhPZihIVFRQVHJhbnNwb3J0LkJBU0lDKTsKLSAgICAgICAgaWYgKGJhc2ljSW5kZXggIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBCQVNFNjREZWNvZGVyIGRlY29kZXIgPSBuZXcgQkFTRTY0RGVjb2RlcigpOwotICAgICAgICAgIGh0dHBCYXNpY0F1dGhEYXRhID0gbmV3IFN0cmluZyhkZWNvZGVyLmRlY29kZUJ1ZmZlcihodHRwQmFzaWNBdXRoRGF0YS5zdWJzdHJpbmcoYmFzaWNJbmRleCArIEhUVFBUcmFuc3BvcnQuQkFTSUMubGVuZ3RoKCkgKyAxKSkpOwotICAgICAgICAgIGludCBjb2xvbkluZGV4ID0gaHR0cEJhc2ljQXV0aERhdGEuaW5kZXhPZihIVFRQVHJhbnNwb3J0LkNPTE9OKTsKLSAgICAgICAgICBpZiAoY29sb25JbmRleCAhPSAtMSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhY3Rpb24uYWRkUHJvcGVydHkoV1NETEFjdGlvbklucHV0cy5IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUsIGh0dHBCYXNpY0F1dGhEYXRhLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KSk7Ci0gICAgICAgICAgICBhY3Rpb24uYWRkUHJvcGVydHkoV1NETEFjdGlvbklucHV0cy5IVFRQX0JBU0lDX0FVVEhfUEFTU1dPUkQsIGh0dHBCYXNpY0F1dGhEYXRhLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMSwgaHR0cEJhc2ljQXV0aERhdGEubGVuZ3RoKCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgICAgICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotICAgICU+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDxodG1sPgotICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij48L3NjcmlwdD4KLSAgICAgICAgICA8L2hlYWQ+Ci0gICAgICAgICAgPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgICAgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgICB3c2RsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgIGlmIChhY3Rpb25SZXN1bHQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9yZXN1bHRfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICA8L3NjcmlwdD4KLSAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgIDwvaHRtbD4KLTwlCi0gICAgICB9Ci0gICAgICBjYXRjaCAoSFRUUEV4Y2VwdGlvbiBodHRwZSkKLSAgICAgIHsKLSAgICAgICAgaW50IGNvZGUgPSBodHRwZS5nZXRTdGF0dXNDb2RlKCk7Ci0gICAgICAgIGlmIChjb2RlID09IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKGNvZGUpOwotICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX0NPTlRFTlRfTEVOR1RILCBTdHJpbmcudmFsdWVPZigwKSk7Ci0gICAgICAgICAgU3RyaW5nIHd3d0F1dGhEYXRhID0gaHR0cGUuZ2V0SGVhZGVyKEhUVFBUcmFuc3BvcnQuSFRUUF9IRUFERVJfV1dXX0FVVEgudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgaWYgKHd3d0F1dGhEYXRhID09IG51bGwpCi0gICAgICAgICAgICB3d3dBdXRoRGF0YSA9IGh0dHBlLmdldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX1dXV19BVVRIKTsKLSAgICAgICAgICBpZiAod3d3QXV0aERhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHd3d0F1dGhEYXRhID0gSFRUUFRyYW5zcG9ydC5CQVNJQzsKLSAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoSFRUUFRyYW5zcG9ydC5IVFRQX0hFQURFUl9XV1dfQVVUSCwgd3d3QXV0aERhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgICAgICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShTdHJpbmcudmFsdWVPZihjb2RlKSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoaHR0cGUuZ2V0U3RhdHVzTWVzc2FnZSgpKTsKLSAgICAgICAgICAlPgotICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgICAgPGh0bWw+Ci0gICAgICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgICAgICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPjwvc2NyaXB0PgotICAgICAgICAgICAgPC9oZWFkPgotICAgICAgICAgICAgPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICAgICAgd3NkbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICAgICAgICAgIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgICAgPC9odG1sPgotICAgICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9PcGVuV1NETEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9PcGVuV1NETEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2FkNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvT3BlbldTRExBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5GcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLk9wZW5XU0RMQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICBPcGVuV1NETEFjdGlvbiBhY3Rpb24gPSBuZXcgT3BlbldTRExBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotICBpZiAoIWlucHV0c1ZhbGlkKSB7Ci0lPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gIDwvc2NyaXB0PgotPCUKLSAgfQotICBlbHNlIHsKLSAgICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0lPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkgewotICAgICAgd3NkbE5hdmlnYXRvckNvbnRlbnQubG9jYXRpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIHdzZGxQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICAgIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiI7Ci0gICAgfQotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1JlZnJlc2hXU0RMQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1JlZnJlc2hXU0RMQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmYzdmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9SZWZyZXNoV1NETEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5SZWZyZXNoV1NETEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5DbGVhcldTRExBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLVJlZnJlc2hXU0RMQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWZyZXNoV1NETEFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gVGhlIGFjdGlvbiBtYXkgYmUgZXhlY3V0ZWQgdmlhIHByb2dyYW0gbGluay4KLWJvb2xlYW4gcGFyYW1zVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotaWYgKHBhcmFtc1ZhbGlkKSB7Ci0gIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKS5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgTm9kZSB3c2RsTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgCi0gIC8vIFJ1biB0aGUgYWN0aW9uLgotICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gIAotICBpZiAoYWN0aW9uUmVzdWx0KSB7Ci0gICU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkgewotICAgICAgd3NkbE5hdmlnYXRvckNvbnRlbnQubG9jYXRpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIHdzZGxQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICAgIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiI7Ci0gICAgfQotICA8L3NjcmlwdD4KLSAgPCUKLSAgfQotICBlbHNlIHsKLSAgJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1JFTU9WRV9XU0RMX05PREUiLCB3c2RsTm9kZS5nZXROb2RlTmFtZSgpKSklPiIpKQotICAgICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQ2xlYXJXU0RMQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlEKSkpJT4iOwotICAgIGVsc2UgewotICAgICAgd3NkbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgIH0KLSAgPC9zY3JpcHQ+Ci0gIDwlCi0gIH0KLX0KLSU+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvUmVzaXplV1NETEZyYW1lc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9SZXNpemVXU0RMRnJhbWVzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiYWY1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9SZXNpemVXU0RMRnJhbWVzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIENyZWF0ZSB0aGUgYWN0aW9uLgotICAgUmVzaXplV1NETEZyYW1lc0FjdGlvbiBhY3Rpb24gPSBuZXcgUmVzaXplV1NETEZyYW1lc0FjdGlvbihjb250cm9sbGVyKTsKLSAgIAotICAgLy8gUG9wdWxhdGUgdGhlIGFjdGlvbiB3aXRoIHRoZSByZXF1ZXN0IHByb3BlcnRpZXMuCi0gICBib29sZWFuIHJlc3VsdCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbGZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIGlmIChyZXN1bHQpCi0gICB7Ci0gICAgIGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLSAgICAgCi0gICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsgIAotICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0LnNldEF0dHJpYnV0ZSgiY29scyIsIjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSU+Iik7Ci0gICAgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0LnNldEF0dHJpYnV0ZSgicm93cyIsIjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCklPiIpOwotICB9Ci0gIGVsc2UKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjE0NDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1NlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5TZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb24gYWN0aW9uID0gbmV3IFNlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLS8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0vLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLWJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvU2VsZWN0Tm9kZUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NjQxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLlNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0RMQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDFjNzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbgotU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbiBhY3Rpb24gPSBuZXcgU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbihjb250cm9sbGVyKTsKLSAgIAotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotICAgCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgIAotLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi1ib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9zd2l0Y2hwZXJzcGVjdGl2ZS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Td2l0Y2hSZWFkT25seUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU3dpdGNoUmVhZE9ubHlGcmFnbWVudFZpZXdzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNjRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Td2l0Y2hSZWFkT25seUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZSIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLWlmICh3c2RsUGVyc3BlY3RpdmUuZ2V0U3RhdHVzQ29udGVudFR5cGUoKSA9PSBXU0RMUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX0ZPUk0pCi0gIHdzZGxQZXJzcGVjdGl2ZS5zZXRTdGF0dXNDb250ZW50VHlwZShXU0RMUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX1NPVVJDRSk7Ci1lbHNlCi0gIHdzZGxQZXJzcGVjdGl2ZS5zZXRTdGF0dXNDb250ZW50VHlwZShXU0RMUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX0ZPUk0pOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9yZXN1bHRfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N3aXRjaFdTRExEZXRhaWxzVmlld3NBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU3dpdGNoV1NETERldGFpbHNWaWV3c0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTM4YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU3dpdGNoV1NETERldGFpbHNWaWV3c0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5GcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETEZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMRGV0YWlsc1Rvb2wiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHdzZGxOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci1XU0RMRGV0YWlsc1Rvb2wgd3NkbERldGFpbHNUb29sID0gKFdTRExEZXRhaWxzVG9vbCl3c2RsTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotd3NkbERldGFpbHNUb29sLnRvZ2dsZVZpZXdJZCgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLTwvc2NyaXB0PgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N5bmNocm9uaXplRnJhZ21lbnRWaWV3c0FjdGlvbkFib3J0SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N5bmNocm9uaXplRnJhZ21lbnRWaWV3c0FjdGlvbkFib3J0SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxMWNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb25BYm9ydEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5GcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExGcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuSW52b2tlV1NETE9wZXJhdGlvblRvb2wiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08JQotSW52b2tlV1NETE9wZXJhdGlvblRvb2wgaW52b2tlV1NETE9wZXJhdGlvblRvb2wgPSAoSW52b2tlV1NETE9wZXJhdGlvblRvb2wpY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotaWYgKGludm9rZVdTRExPcGVyYXRpb25Ub29sLmdldEZyYWdtZW50Vmlld0lEKCkuZXF1YWxzKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNKSkKLSAgaW52b2tlV1NETE9wZXJhdGlvblRvb2wuc2V0RnJhZ21lbnRWaWV3SUQoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfRk9STV9UT19TT1VSQ0UpOwotZWxzZQotICBpbnZva2VXU0RMT3BlcmF0aW9uVG9vbC5zZXRGcmFnbWVudFZpZXdJRChGcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX1NXSVRDSF9TT1VSQ0VfVE9fRk9STSk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhNjhmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExGcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPCUKLVN5bmNocm9uaXplRnJhZ21lbnRWaWV3c0FjdGlvbiBhY3Rpb24gPSBuZXcgU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uKGNvbnRyb2xsZXIpOwotYm9vbGVhbiBwYXJhbVZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLVN0cmluZyB2aWV3SUQgPSAoU3RyaW5nKWFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkuZ2V0KEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfSUQpOwotYm9vbGVhbiBzb3VyY2VUb0Zvcm0gPSB2aWV3SUQuZXF1YWxzKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNKTsKLWlmIChzb3VyY2VUb0Zvcm0pIHsKLSAgaWYgKHBhcmFtVmFsaWQpIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBpZiAoIWNvbmZpcm0oIjwlPWNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1NZTkNfVklFV1MiKSU+IikpCi0gICAgICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uQWJvcnRKU1AuanNwIikpJT4iOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBpZiAoIWNvbmZpcm0oIjwlPWNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1NZTkNfVklFV1NfREVTUElURV9JTlZBTElEX1NPVVJDRV9DT05URU5UIiklPiIpKQotICAgICAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC9hY3Rpb25zL1N5bmNocm9uaXplRnJhZ21lbnRWaWV3c0FjdGlvbkFib3J0SlNQLmpzcCIpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLX0KLWFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Ub2dnbGVXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Ub2dnbGVXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTg2ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLVRvZ2dsZVdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBUb2dnbGVXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi1ib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1RvZ2dsZU5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvVXBkYXRlV1NETEJpbmRpbmdBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvVXBkYXRlV1NETEJpbmRpbmdBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWIxYTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1VwZGF0ZVdTRExCaW5kaW5nQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETEZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5VcGRhdGVXU0RMQmluZGluZ0FjdGlvbiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24gYWN0aW9uID0gbmV3IFVwZGF0ZVdTRExCaW5kaW5nQWN0aW9uKGNvbnRyb2xsZXIpOwotICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotICBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgd3NkbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICA8L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1dTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjhjOGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1dTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5XU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24iJT4KLQotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uIGFjdGlvbiA9IG5ldyBXU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzI1OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETENoZWNrRmF2b3JpdGVFeGlzdHNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC9hY3Rpb25zL1dTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+Ci08JQotRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLXdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gIFN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKXBhcmFtTmFtZXMubmV4dEVsZW1lbnQoKTsKLSAgU3RyaW5nW10gcGFyYW1WYWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbU5hbWUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0lPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPXBhcmFtTmFtZSU+IiB2YWx1ZT0iPCU9cGFyYW1WYWx1ZXNbaV0lPiI+Ci08JQotICB9Ci19Ci0lPgotPC9mb3JtPgotPC9ib2R5PgotPC9odG1sPgotCi08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uIGFjdGlvbiA9IG5ldyBXU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24oY29udHJvbGxlcik7Ci0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci1pZiAoYWN0aW9uLmZhdm9yaXRlRXhpc3RzKCkpIHsKLSU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlKCJNU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUyIpKSU+IikpCi0gICAgICBkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKTsKLSAgPC9zY3JpcHQ+Ci08JQotfQotZWxzZSB7Ci0lPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKTsKLSAgPC9zY3JpcHQ+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1dTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1dTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMDJkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLVdTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBXU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyMzgyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLldTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODc2MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24iICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLVdTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIGFjdGlvbiA9IG5ldyBXU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL0ZyYWdtZW50c0Zvcm1WaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9GcmFnbWVudHNGb3JtVmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmQyZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL0ZyYWdtZW50c0Zvcm1WaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwueHNkLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpOwotbm9kZUlELmRlbGV0ZSgwLCBub2RlSUQubGVuZ3RoKCkpOwotbm9kZUlELmFwcGVuZChzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCkpOwotSW52b2tlV1NETE9wZXJhdGlvblRvb2wgaW52b2tlV1NETE9wZXJhdGlvblRvb2wgPSAoSW52b2tlV1NETE9wZXJhdGlvblRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUl0ZXJhdG9yIGl0ID0gb3BlckVsZW1lbnQuZ2V0T3JkZXJlZEJvZHlQYXJ0cygpLml0ZXJhdG9yKCk7Ci13aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gIFBhcnQgcGFydCA9IChQYXJ0KWl0Lm5leHQoKTsKLSAgSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudChwYXJ0KTsKLSAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICBmcmFnSUQuYXBwZW5kKGZyYWcuZ2V0SUQoKSk7Ci0gICU+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1mcmFnLmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICA8JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9GcmFnbWVudHNTb2FwVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvRnJhZ21lbnRzU29hcFZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNhYTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9GcmFnbWVudHNTb2FwVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjIgICAxMjc0NDMgamVzcGVyQHNlbHNrYWJldC5vcmcgLSBKZXNwZXIgUyBNb2xsZXIKLSAqIDIwMDYwNzI2ICAgMTQ0ODI0IG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KSh3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKTsKLSAgIE9wZXJhdGlvbiBvcGVyID0gb3BlckVsZW1lbnQuZ2V0T3BlcmF0aW9uKCk7Ci0gICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgU3RyaW5nQnVmZmVyIHNvdXJjZUNvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICBTdHJpbmcgY2FjaGVkU291cmNlQ29udGVudCA9IG9wZXJFbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlQpOwotICAgSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgU29hcEhlbHBlci5hZGREZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlcyhzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSk7Ci0gICBpZiAoY2FjaGVkU291cmNlQ29udGVudCAhPSBudWxsKQotICAgewotICAgICBzb3VyY2VDb250ZW50LmFwcGVuZChjYWNoZWRTb3VyY2VDb250ZW50KTsKLSAgICAgU3RyaW5nW10gbnNEZWNsYXJhdGlvbnMgPSAoU3RyaW5nW10pb3BlckVsZW1lbnQuZ2V0UHJvcGVydHlBc09iamVjdChXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9TT1VSQ0VfQ09OVEVOVF9OQU1FU1BBQ0UpOwotICAgICBpZiAobnNEZWNsYXJhdGlvbnMgIT0gbnVsbCkKLSAgICAgewotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNEZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgewotICAgICAgICAgU3RyaW5nW10gcHJlZml4X25zID0gU29hcEhlbHBlci5kZWNvZGVOYW1lc3BhY2VEZWNsYXJhdGlvbihuc0RlY2xhcmF0aW9uc1tpXSk7Ci0gICAgICAgICBpZiAoIXNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLmNvbnRhaW5zKHByZWZpeF9uc1sxXSkpCi0gICAgICAgICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChwcmVmaXhfbnNbMV0sIHByZWZpeF9uc1swXSk7Ci0gICAgICAgfQotICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgIHsKLSAgICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdC5uZXh0KCk7Ci0gICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudChwYXJ0KTsKLSAgICAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBmcmFnLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyghb3BlckVsZW1lbnQuaXNVc2VMaXRlcmFsKCksIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLCBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKSk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICB7Ci0gICAgCSBTdHJpbmcgc2VyaWFsaXplZEZyYWdtZW50ID0gWE1MVXRpbHMuc2VyaWFsaXplKGluc3RhbmNlRG9jdW1lbnRzW2ldLCB0cnVlKTsKLQkJIGlmIChzZXJpYWxpemVkRnJhZ21lbnQgPT0gbnVsbCkKLQkJIHsKLQkJCSAvLyBPbiBTb21lIEpSRSdzIChTdW4gamF2YSA1KSBlbGVtZW50cyB3aXRoIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSB4c2kKLQkJCSAvLyBwcmVmaXggZG8gbm90IHNlcmlhbGl6ZSBwcm9wZXJseSBiZWNhdXNlIHRoZSBuYW1lc3BhY2UgY2FuIG5vdAotCQkJIC8vIGJlIGZvdW5kIHNvIHRoZSBzdHJpbmcgcmV0dXJuZWQgY29tZXMgYmFjayBhcyBudWxsLiBUbyB3b3JrYXJvdW5kCi0JCQkgLy8gdGhpcyBwcm9ibGVtIHRyeSBhZGRpbmcgaW4gdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUKLQkJCSAvLyBhbmQgcmV0cnkgdGhlIHNlcmlhbGl6YXRpb24gKGJ1ZyAxNDQ4MjQpCQkJIAotCQkJIGluc3RhbmNlRG9jdW1lbnRzW2ldLnNldEF0dHJpYnV0ZSgieG1sbnM6eHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKTsKLQkJCSBzZXJpYWxpemVkRnJhZ21lbnQgPSBYTUxVdGlscy5zZXJpYWxpemUoaW5zdGFuY2VEb2N1bWVudHNbaV0sIHRydWUpOwotCQkgfQotICAgIAkgCi0gICAgCSBzb3VyY2VDb250ZW50LmFwcGVuZChzZXJpYWxpemVkRnJhZ21lbnQpOwotICAgICAgICAgc291cmNlQ29udGVudC5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKTsKLSAgICAgICB9ICAgICAKLSAgICAgfQotICAgfQotCi0gICBFbnVtZXJhdGlvbiBlbm0gPSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5rZXlzKCk7Ci0gICB3aGlsZSAoZW5tLmhhc01vcmVFbGVtZW50cygpKQotICAgewotICAgICBTdHJpbmcgdXJpID0gKFN0cmluZyllbm0ubmV4dEVsZW1lbnQoKTsKLSAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUuZ2V0KHVyaSk7Ci0gICAgIFN0cmluZyB2YWx1ZSA9IFNvYXBIZWxwZXIuZW5jb2RlTmFtZXNwYWNlRGVjbGFyYXRpb24ocHJlZml4LCB1cmkpOwotICAgICAlPgotICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVF9OQU1FU1BBQ0UlPiIgdmFsdWU9IjwlPXZhbHVlJT4iPgotICAgICA8JQotICAgfQotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj4KLTwlCi0gICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMuY3JlYXRlTmV3RG9jdW1lbnQobnVsbCk7Ci0gICAgRWxlbWVudCBzb2FwRW52ZWxvcGVFbGVtZW50ID0gU29hcEhlbHBlci5jcmVhdGVTb2FwRW52ZWxvcGVFbGVtZW50KGRvYyxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSk7Ci0gICAgU3RyaW5nQnVmZmVyIGhlYWRlciA9IG5ldyBTdHJpbmdCdWZmZXIoIjwiKTsKLSAgICBoZWFkZXIuYXBwZW5kKHNvYXBFbnZlbG9wZUVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLSAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IHNvYXBFbnZlbG9wZUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgIGludCBudW1iZXJPZkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgIGlmIChudW1iZXJPZkF0dHJpYnV0ZXMgPT0gMCkKLSAgICAgIGhlYWRlci5hcHBlbmQoJz4nKTsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KGhlYWRlci50b1N0cmluZygpKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgIGZvciAoaW50IGk9MDtpPG51bWJlck9mQXR0cmlidXRlcztpKyspCi0gICAgewotICAgICAgaGVhZGVyLnNldExlbmd0aCgwKTsKLSAgICAgIE5vZGUgYXR0ck5vZGUgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0gICAgICBoZWFkZXIuYXBwZW5kKGF0dHJOb2RlLmdldE5vZGVOYW1lKCkpLmFwcGVuZCgiPVwiIikuYXBwZW5kKGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKS5hcHBlbmQoJ1wiJyk7Ci0gICAgICBpZiAoaSA9PSBudW1iZXJPZkF0dHJpYnV0ZXMtMSkKLSAgICAgICAgaGVhZGVyLmFwcGVuZCgnPicpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgd2lkdGg9OD4KLSAgICAgIDxpbWcgd2lkdGg9OCBoZWlnaHQ9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJib3R0b20iIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPCU9SFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhoZWFkZXIudG9TdHJpbmcoKSklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgICB9Ci0KLSAgICBFbGVtZW50IHNvYXBCb2R5RWxlbWVudCA9IFNvYXBIZWxwZXIuY3JlYXRlU29hcEJvZHlFbGVtZW50KGRvYyk7Ci0gICAgaGVhZGVyLnNldExlbmd0aCgwKTsKLSAgICBoZWFkZXIuYXBwZW5kKCc8JykuYXBwZW5kKHNvYXBCb2R5RWxlbWVudC5nZXRUYWdOYW1lKCkpOwotICAgIGF0dHJpYnV0ZXMgPSBzb2FwQm9keUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgIG51bWJlck9mQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG51bWJlck9mQXR0cmlidXRlcyA9PSAwKQotICAgICAgaGVhZGVyLmFwcGVuZCgnPicpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgd2lkdGg9OD4KLSAgICAgIDxpbWcgd2lkdGg9OCBoZWlnaHQ9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJib3R0b20iIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPCU9SFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhoZWFkZXIudG9TdHJpbmcoKSklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgICBmb3IgKGludCBpPTA7aTxudW1iZXJPZkF0dHJpYnV0ZXM7aSsrKQotICAgIHsKLSAgICAgIGhlYWRlci5zZXRMZW5ndGgoMCk7Ci0gICAgICBOb2RlIGF0dHJOb2RlID0gYXR0cmlidXRlcy5pdGVtKGkpOwotICAgICAgaGVhZGVyLmFwcGVuZChhdHRyTm9kZS5nZXROb2RlTmFtZSgpKS5hcHBlbmQoIj1cIiIpLmFwcGVuZChhdHRyTm9kZS5nZXROb2RlVmFsdWUoKSkuYXBwZW5kKCdcIicpOwotICAgICAgaWYgKGkgPT0gbnVtYmVyT2ZBdHRyaWJ1dGVzLTEpCi0gICAgICAgIGhlYWRlci5hcHBlbmQoJz4nKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHdpZHRoPTE2PgotICAgICAgPGltZyB3aWR0aD0xNiBoZWlnaHQ9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJib3R0b20iIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPCU9SFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhoZWFkZXIudG9TdHJpbmcoKSklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHRhYmxlPgotPCUKLSAgICB9Ci0KLSAgICBFbGVtZW50IHdyYXBwZXJFbGVtZW50ID0gbnVsbDsKLSAgICBpZiAoIW9wZXJFbGVtZW50LmlzRG9jdW1lbnRTdHlsZSgpKQotICAgIHsKLSAgICAgIC8vIE11c3QgYmUgUlBDIHN0eWxlLgotICAgICAgU3RyaW5nIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgIC8qCi0gICAgICAgKiBXUy1JOiBJbiBhIHJwYy1saXRlcmFsIFNPQVAgYmluZGluZywgdGhlIHNlcmlhbGl6ZWQgY2hpbGQgZWxlbWVudCBvZiB0aGUgCi0gICAgICAgKiBzb2FwOkJvZHkgZWxlbWVudCBjb25zaXN0cyBvZiBhIHdyYXBwZXIgZWxlbWVudCwgd2hvc2UgbmFtZXNwYWNlIGlzIHRoZSB2YWx1ZSAKLSAgICAgICAqIG9mIHRoZSBuYW1lc3BhY2UgYXR0cmlidXRlIG9mIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQgYW5kIHdob3NlIGxvY2FsIG5hbWUgaXMgCi0gICAgICAgKiBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiBvciB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHN1ZmZpeGVkIAotICAgICAgICogd2l0aCAiUmVzcG9uc2UiLiBUaGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgYXMgb3Bwb3NlZCB0byBiZWluZyAKLSAgICAgICAqIG9wdGlvbmFsLCB0byBlbnN1cmUgdGhhdCB0aGUgY2hpbGRyZW4gb2YgdGhlIHNvYXA6Qm9keSBlbGVtZW50IGFyZSBuYW1lc3BhY2UtCi0gICAgICAgKiBxdWFsaWZpZWQuCi0gICAgICAgKi8KLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG9wZXJFbGVtZW50LmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBpZiAoYmluZGluZ0lucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IGV4dEVsZW1lbnRzID0gYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgZXh0RWxlbWVudHNJdCA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IGV4dEVsZW1lbnRzSXQuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1lbnRzSXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZW5jb2RpbmdOYW1lc3BhY2VVUkkgPSAoKFNPQVBCb2R5KWV4dEVsZW1lbnQpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIElmIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHNvYXBiaW5kOmJvZHkgZWxlbWVudCBpcyBub3Qgc2V0LCBnZXQgaXQgZnJvbSB0aGUgb3BlcmF0aW9uIGVsZW1lbnQKLSAgICAgIGlmIChlbmNvZGluZ05hbWVzcGFjZVVSSSA9PSBudWxsKQotICAgICAgICBlbmNvZGluZ05hbWVzcGFjZVVSSSA9IG9wZXJFbGVtZW50LmdldEVuY29kaW5nTmFtZXNwYWNlKCk7Ci0gICAgICAvLyBJZiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBvcGVyYXRpb24gZWxlbWVudCBpcyBub3Qgc2V0LCBnZXQgaXQgZnJvbSB0aGUgZGVmaW5pdGlvbiBlbGVtZW50Ci0gICAgICBpZiAoZW5jb2RpbmdOYW1lc3BhY2VVUkkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgV1NETEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50ID0gKFdTRExCaW5kaW5nRWxlbWVudClvcGVyRWxlbWVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpYmluZGluZ0VsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudClzZXJ2aWNlRWxlbWVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxFbGVtZW50LmdldERlZmluaXRpb24oKTsKLSAgICAgICAgZW5jb2RpbmdOYW1lc3BhY2VVUkkgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgfQotICAgICAgLy8gR2VuZXJhdGUgYW4gUlBDIHN0eWxlIHdyYXBwZXIgZWxlbWVudC4KLSAgICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlID0gKG9wZXJFbGVtZW50LmlzVXNlTGl0ZXJhbCgpID8gbnVsbCA6IG9wZXJFbGVtZW50LmdldEVuY29kaW5nU3R5bGUoKSk7Ci0gICAgICB3cmFwcGVyRWxlbWVudCA9IFNvYXBIZWxwZXIuY3JlYXRlUlBDV3JhcHBlckVsZW1lbnQoZG9jLHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLGVuY29kaW5nTmFtZXNwYWNlVVJJLG9wZXIuZ2V0TmFtZSgpLGVuY29kaW5nU3R5bGUpOwotICAgICAgaGVhZGVyLnNldExlbmd0aCgwKTsKLSAgICAgIGhlYWRlci5hcHBlbmQoJzwnKS5hcHBlbmQod3JhcHBlckVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLSAgICAgIGF0dHJpYnV0ZXMgPSB3cmFwcGVyRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBudW1iZXJPZkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgaWYgKG51bWJlck9mQXR0cmlidXRlcyA9PSAwKQotICAgICAgICBoZWFkZXIuYXBwZW5kKCc+Jyk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgIDxpbWcgd2lkdGg9MTYgaGVpZ2h0PTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXMoaGVhZGVyLnRvU3RyaW5nKCkpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi0gICAgICBmb3IgKGludCBpPTA7aTxudW1iZXJPZkF0dHJpYnV0ZXM7aSsrKQotICAgICAgewotICAgICAgICBoZWFkZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICBOb2RlIGF0dHJOb2RlID0gYXR0cmlidXRlcy5pdGVtKGkpOwotICAgICAgICBoZWFkZXIuYXBwZW5kKGF0dHJOb2RlLmdldE5vZGVOYW1lKCkpLmFwcGVuZCgiPVwiIikuYXBwZW5kKGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKS5hcHBlbmQoJ1wiJyk7Ci0gICAgICAgIGlmIChpID09IG51bWJlck9mQXR0cmlidXRlcy0xKQotICAgICAgICAgIGhlYWRlci5hcHBlbmQoJz4nKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHdpZHRoPTI0PgotICAgICAgPGltZyB3aWR0aD0yNCBoZWlnaHQ9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJib3R0b20iIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPCU9SFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhoZWFkZXIudG9TdHJpbmcoKSklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgc291cmNlQ29udGVudEluZGVudGF0aW9uSW1hZ2VXaWR0aCA9IDE2OwotICAgIGlmICh3cmFwcGVyRWxlbWVudCAhPSBudWxsKQotICAgICAgc291cmNlQ29udGVudEluZGVudGF0aW9uSW1hZ2VXaWR0aCArPSA4OwotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTM+Ci0gIDx0cj4KLSAgICA8dGQgd2lkdGg9PCU9c291cmNlQ29udGVudEluZGVudGF0aW9uSW1hZ2VXaWR0aCU+PgotICAgICAgPGltZyB3aWR0aD08JT1zb3VyY2VDb250ZW50SW5kZW50YXRpb25JbWFnZVdpZHRoJT4gaGVpZ2h0PTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgIDwvdGQ+ICAgIAotICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSI8JT1XU0RMQWN0aW9uSW5wdXRzLlNFTEVDVEVEX0ZJTEUlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU09BUF9GSUxFIiklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnNob3dOZXdGaWxlQ29udGVudHMoKSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkJVVFRPTl9MQUJFTF9MT0FEIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2F2ZVNvdXJjZUNvbnRlbnQoKSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkJVVFRPTl9MQUJFTF9TQVZFX0FTIiklPjwvYT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTM+Ci0gIDx0cj4KLSAgICA8dGQgd2lkdGg9PCU9c291cmNlQ29udGVudEluZGVudGF0aW9uSW1hZ2VXaWR0aCU+PgotICAgICAgPGltZyB3aWR0aD08JT1zb3VyY2VDb250ZW50SW5kZW50YXRpb25JbWFnZVdpZHRoJT4gaGVpZ2h0PTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0ZXh0YXJlYSBpZD0ic29hcF9ib2R5X2NvbnRlbnQiIG5hbWU9IjwlPUZyYWdtZW50Q29uc3RhbnRzLlNPVVJDRV9DT05URU5UJT4iIGNsYXNzPSJiaWd0ZXh0YXJlYWVudGVyIj48JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHNvdXJjZUNvbnRlbnQudG9TdHJpbmcoKSklPjwvdGV4dGFyZWE+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgaWYgKHdyYXBwZXJFbGVtZW50ICE9IG51bGwpCi0gICB7Ci0gICAgIGhlYWRlci5zZXRMZW5ndGgoMCk7Ci0gICAgIGhlYWRlci5hcHBlbmQoIjwvIikuYXBwZW5kKHdyYXBwZXJFbGVtZW50LmdldFRhZ05hbWUoKSkuYXBwZW5kKCc+Jyk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgIDxpbWcgd2lkdGg9MTYgaGVpZ2h0PTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXMoaGVhZGVyLnRvU3RyaW5nKCkpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi0gICB9Ci0KLSAgIGhlYWRlci5zZXRMZW5ndGgoMCk7Ci0gICBoZWFkZXIuYXBwZW5kKCI8LyIpLmFwcGVuZChzb2FwQm9keUVsZW1lbnQuZ2V0VGFnTmFtZSgpKS5hcHBlbmQoJz4nKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MSBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHdpZHRoPTg+Ci0gICAgICA8aW1nIHdpZHRoPTggaGVpZ2h0PTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXMoaGVhZGVyLnRvU3RyaW5nKCkpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi0gICBoZWFkZXIuc2V0TGVuZ3RoKDApOwotICAgaGVhZGVyLmFwcGVuZCgiPC8iKS5hcHBlbmQoc29hcEVudmVsb3BlRWxlbWVudC5nZXRUYWdOYW1lKCkpLmFwcGVuZCgnPicpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0xIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJib3R0b20iIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPCU9SFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhoZWFkZXIudG9TdHJpbmcoKSklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL0ludm9rZVdTRExPcGVyYXRpb25Gb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9JbnZva2VXU0RMT3BlcmF0aW9uRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWU3ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL0ludm9rZVdTRExPcGVyYXRpb25Gb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUxMiAgIDEyMTIxMCBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLSAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gIE5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gIEludm9rZVdTRExPcGVyYXRpb25Ub29sIGludm9rZVdTRExPcGVyYXRpb25Ub29sID0gKEludm9rZVdTRExPcGVyYXRpb25Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgU3RyaW5nIGZyYWdtZW50Vmlld0lEID0gaW52b2tlV1NETE9wZXJhdGlvblRvb2wuZ2V0RnJhZ21lbnRWaWV3SUQoKTsKLSAgaW50IG9wZXJhdGlvblR5cGUgPSBvcGVyRWxlbWVudC5nZXRPcGVyYXRpb25UeXBlKCk7Ci0gIFN0cmluZyBpbnZva2VXU0RMT3BlcmF0aW9uVVJMID0gcmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGludm9rZVdTRExPcGVyYXRpb25Ub29sLmdldEZvcm1BY3Rpb25MaW5rKG9wZXJhdGlvblR5cGUsZnJhZ21lbnRWaWV3SUQpKSk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfSU5WT0tFX1dTRExfT1BFUkFUSU9OIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvZnJhZ21lbnR0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzaG93TmV3RmlsZUNvbnRlbnRzKCkKLSAgewotICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZm9ybXNbMF07Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBmb3JtLjwlPVdTRExBY3Rpb25JbnB1dHMuU1VCTUlTU0lPTl9BQ1RJT04lPi52YWx1ZSA9ICI8JT1XU0RMQWN0aW9uSW5wdXRzLlNVQk1JU1NJT05fQUNUSU9OX0JST1dTRV9GSUxFJT4iOwotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICAgIGZvcm0uPCU9V1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTiU+LnZhbHVlID0gIjwlPWludm9rZVdTRExPcGVyYXRpb25VUkwlPiI7Ci0gICAgICByZXNldFN1Ym1pc3Npb24oKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBzYXZlU291cmNlQ29udGVudCgpCi0gIHsKLSAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmZvcm1zWzBdOwotICAgIGlmIChoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgewotICAgICAgZm9ybS48JT1XU0RMQWN0aW9uSW5wdXRzLlNVQk1JU1NJT05fQUNUSU9OJT4udmFsdWUgPSAiPCU9V1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTl9TQVZFX0FTJT4iOwotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICAgIGZvcm0uPCU9V1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTiU+LnZhbHVlID0gIjwlPWludm9rZVdTRExPcGVyYXRpb25VUkwlPiI7Ci0gICAgICByZXNldFN1Ym1pc3Npb24oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNsb3NlQ2hpbGRXaW5kb3dzKCkKLSAgewotICAgIGNsb3NlWFNESW5mb0RpYWxvZygpOwotICAgIGNsb3NlQ2FsZW5kYXJCcm93c2VyKCk7Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iIG9uVW5sb2FkPSJjbG9zZUNoaWxkV2luZG93cygpIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8Zm9ybSBhY3Rpb249IjwlPWludm9rZVdTRExPcGVyYXRpb25VUkwlPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9V1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTiU+IiB2YWx1ZT0iPCU9V1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTl9GT1JNJT4iPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzZGwvaW1hZ2VzL2ludm9rZV93c2RsX29wZXJhdGlvbl9oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfSU5WT0tFX1dTRExfT1BFUkFUSU9OIik7Ci0gICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gV1NETE9wZXJhdGlvbkVsZW1lbnQuT1BFUkFUSU9OX1RZUEVfU09BUCkKLSAgICB7Ci0gICAgJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRpdGxlSW1hZ2VQYXRoKSklPiIgYWx0PSIiPgotICAgICAgPHN0cm9uZz48JT10aXRsZSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgd2lkdGg9IioiPiZuYnNwOzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJyaWdodCIgY2xhc3M9ImxhYmVscyI+Ci08JQotICAgaWYgKGZyYWdtZW50Vmlld0lELmVxdWFscyhGcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX1NXSVRDSF9GT1JNX1RPX1NPVVJDRSkpCi0gICB7Ci0lPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzeW5jaHJvbml6ZUZyYWdtZW50Vmlld3MoJzwlPUZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNJT4nKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1dJVENIX1RPX0ZPUk1fVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRk9STSIpJT48L2E+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6c3luY2hyb25pemVGcmFnbWVudFZpZXdzKCc8JT1GcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX1NXSVRDSF9GT1JNX1RPX1NPVVJDRSU+JykiIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NXSVRDSF9UT19TT1VSQ0VfVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfU09VUkNFIiklPjwvYT4KLTwlCi0gICB9Ci0lPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIGNvbHNwYW49Mz48aW1nIGhlaWdodD0yIHdpZHRoPSIxMDAlIiBhbGlnbj0idG9wIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotICAgIDwlCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIH0KLSAgICAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotCi0gICAgICAgIDwlICAgICAgICAgICAKLQkJLy9oZXJlIHdlIGRldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IGlucHV0IHBhcmFtZXRlcnMgZm9yIHRoaXMgb3BlcmF0aW9uCi0JCWJvb2xlYW4gaGFzSW5wdXQgPSB0cnVlOwotCQlzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKTsgIAotCQlJdGVyYXRvciBpdGVyID0gb3BlckVsZW1lbnQuZ2V0T3JkZXJlZEJvZHlQYXJ0cygpLml0ZXJhdG9yKCk7ICAgICAgICAKLQkJU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyRWxlbWVudC5nZXROYW1lKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotCQl7Ci0JCQlQYXJ0IHBhcnQgPSAoUGFydClpdGVyLm5leHQoKTsgCi0JCQlJWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOyAgCi0JCQlvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb24gZGVmID0gZnJhZy5nZXRYU0RUeXBlRGVmaW5pdGlvbigpOwotCQkJLy93ZSBjaGVjayB0aGUgdHlwZSBvZiB0aGUgb3BlcmF0aW9uJ3MgaW5wdXQgbWVzc2FnZQotCQkJaWYgKGRlZiA9PSBudWxsKQotCQkJewotCQkJCS8vdGhpcyBpcyB0aGUgcGF0dGVybiA8ZWxlbWVudCBuYW1lPSJmb28iPjwvZWxlbWVudD4KLQkJCQloYXNJbnB1dCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCW9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbWVudCA9IGRlZi5nZXRFbGVtZW50KCk7CQkJCQotCQkJCWlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscygiY29tcGxleFR5cGUiKSAmJiAhZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0JCQkJewkvL3RoaXMgaXMgdGhlIHBhdHRlcm4gIDxlbGVtZW50IG5hbWU9ImZvbyI+PGNvbXBsZXhUeXBlLz48L2VsZW1lbnQ+Ci0JCQkJCS8vdGhlcmUgY291bGQgYmUgb3RoZXIgcGF0dGVybnMgd2l0aCBubyBpbnB1dCBidXQgdGhleSBhcmUgdW5jb21tb24KLQkJCQkJaGFzSW5wdXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9IAotICAgICAgCX0KLQkJaWYgKGhhc0lucHV0KQotCQl7Ci0JCQlvdXQucHJpbnQod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5WT0tFX1dTRExfT1BFUkFUSU9OX0RFU0MiKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlvdXQucHJpbnQod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5WT0tFX1dTRExfT1BFUkFUSU9OX0RFU0NfTk9fSU5QVVQiLCBvcGVyYXRpb25OYW1lICkpOwotCQl9Ci0gICAgICAgICU+Ci0gICAgICAgICAKLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJrZXlsaW5lZmllbGRzZXQiPgotICAgICAgICAgICAgPGxlZ2VuZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iPCU9V1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQlPiI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRU5EX1BPSU5UUyIpJT48L2xhYmVsPgotICAgICAgICAgICAgPC9sZWdlbmQ+Ci0gICAgICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9IjwlPVdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UJT4iIG5hbWU9IjwlPVdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UJT4iIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgV1NETEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50ID0gKFdTRExCaW5kaW5nRWxlbWVudClvcGVyRWxlbWVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGVuZFBvaW50cyA9IGJpbmRpbmdFbGVtZW50LmdldEVuZFBvaW50cygpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VyckVuZFBvaW50ID0gaW52b2tlV1NETE9wZXJhdGlvblRvb2wuZ2V0RW5kUG9pbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRQb2ludHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1lbmRQb2ludHNbaV0lPiIgPCVpZiAoZW5kUG9pbnRzW2ldLmVxdWFscyhjdXJyRW5kUG9pbnQpKSB7JT5zZWxlY3RlZDwlfSU+PjwlPWVuZFBvaW50c1tpXSU+Ci0gICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgIDwvZmllbGRzZXQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPCUKLSAgICBpZiAoZnJhZ21lbnRWaWV3SUQuZXF1YWxzKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX0ZPUk1fVE9fU09VUkNFKSkKLSAgICB7Ci0gICAgJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9mb3Jtcy9GcmFnbWVudHNTb2FwVmlldy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPCUKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL2Zvcm1zL0ZyYWdtZW50c0Zvcm1WaWV3LmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8JQotICAgIH0KLSAgICAlPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvT3BlbldTRExGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9PcGVuV1NETEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWFlNTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9PcGVuV1NETEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA0MjcgICAxMjc0NDMgamVzcGVyQHNlbHNrYWJldC5vcmcgLSBKZXNwZXIgUyBNb2xsZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCl3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX09QRU5fV1NETCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy93c2RsYnJvd3Nlci5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiIgb25VbmxvYWQ9ImNsb3NlV1NETEJyb3dzZXIoKSI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvYWN0aW9ucy9PcGVuV1NETEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBoYW5kbGVTdWJtaXQodGhpcykiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzZGwvaW1hZ2VzL29wZW5fd3NkbF9oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfT1BFTl9XU0RMIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICAgIDx0YWJsZT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX09QRU5fV1NETF9ERVNDIiklPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPiAgICAgICAgCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF93c2RsX3VybCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgIGlmICghZm9ybVRvb2wuaXNJbnB1dFZhbGlkKEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCkpIHsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFN0cmluZyB3c2RsVXJsID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwpOwotICAgICAgICAgICAgICBpZiAod3NkbFVybCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHdzZGxVcmwgPSAiIjsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbldTRExCcm93c2VyKCdjb250ZW50Ym9yZGVyJyw8JT1BY3Rpb25JbnB1dHMuV1NETF9UWVBFX1NFUlZJQ0UlPikiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0JST1dTRSIpJT48L2E+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY29sc3Bhbj0zPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X3dzZGxfdXJsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPiIgdmFsdWU9IjwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3Qod3NkbFVybCklPiIgc2l6ZT0iNTAiIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvZm9ybT4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGNsb3NlV1NETEJyb3dzZXIoKTsKLTwvc2NyaXB0PiAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvUHJvY2Vzc1dTRExGcmFtZXNldHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9Qcm9jZXNzV1NETEZyYW1lc2V0c0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTUyZjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9Qcm9jZXNzV1NETEZyYW1lc2V0c0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoZm9ybUFjdGlvbi50b1N0cmluZygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjAiPgotICA8aW5wdXQgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLkZSQU1FX05BTUUlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9Zm9ybUZyYW1lTmFtZSU+Ij4KLSAgPGlucHV0IG5hbWU9IjwlPVdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UJT4iIHR5cGU9ImhpZGRlbiIgdmFsdWU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSU+Ij4KLSAgPGlucHV0IG5hbWU9IjwlPVdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUiU+IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iPgotPC9mb3JtPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1JlYWRPbmx5RnJhZ21lbnRzRm9ybVZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1JlYWRPbmx5RnJhZ21lbnRzRm9ybVZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGE4YzQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9SZWFkT25seUZyYWdtZW50c0Zvcm1WaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlIQotcHJpdmF0ZSBFbGVtZW50IHNvYXBSZXNwb25zZV8gPSBudWxsOwotCi1wcml2YXRlIEVsZW1lbnRbXSBwYXJzZVNPQVBSZXNwb25zZShTT0FQTWVzc2FnZVF1ZXVlIHNvYXBNZXNzYWdlUXVldWUsIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50KQotewotICBTdHJpbmcgbWVzc2FnZXMgPSBzb2FwTWVzc2FnZVF1ZXVlLmdldE1lc3NhZ2VzRnJvbUxpc3QoKTsKLSAgdHJ5Ci0gIHsKLSAgICBzb2FwUmVzcG9uc2VfID0gWE1MVXRpbHMuc3RyaW5nVG9FbGVtZW50KG1lc3NhZ2VzLCB0cnVlKTsKLSAgICBOb2RlTGlzdCBubCA9IHNvYXBSZXNwb25zZV8uZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhGcmFnbWVudENvbnN0YW50cy5VUklfU09BUF9FTlYsIEZyYWdtZW50Q29uc3RhbnRzLlFOQU1FX0xPQ0FMX05BTUVfQk9EWSk7Ci0gICAgaWYgKG5sLmdldExlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHNvYXBCb2R5ID0gKEVsZW1lbnQpbmwuaXRlbSgwKTsKLSAgICAgIE5vZGVMaXN0IHNvYXBGYXVsdCA9IHNvYXBCb2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoRnJhZ21lbnRDb25zdGFudHMuVVJJX1NPQVBfRU5WLCBGcmFnbWVudENvbnN0YW50cy5RTkFNRV9MT0NBTF9OQU1FX0ZBVUxUKTsKLSAgICAgIGlmIChzb2FwRmF1bHQuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRbMF07Ci0gICAgICBOb2RlTGlzdCBpbnN0YW5jZUxpc3Q7Ci0gICAgICBpZiAob3BlckVsZW1lbnQuaXNEb2N1bWVudFN0eWxlKCkpCi0gICAgICAgIGluc3RhbmNlTGlzdCA9IHNvYXBCb2R5LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgTm9kZUxpc3QgcnBjV3JhcHBlciA9IHNvYXBCb2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCBvcGVyRWxlbWVudC5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiBIQUNLIC0gU29tZSBvZiB0aGUgd2ViIHNlcnZpY2VzIG91dCBvbiB0aGUgaW50ZXJuZXQgZG8gbm90Ci0gICAgICAgICogc2V0IHRoZWlyIFJQQyB3cmFwcGVyIHByb3Blcmx5LiAgSXQgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0Ci0gICAgICAgICogbWVzc2FnZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBvcGVyYXRpb24uICBUaGUgaGFjayBpcyB0bwotICAgICAgICAqIGFzc3VtZSB0aGUgZmlyc3QgZWxlbWVudCBpbnNpZGUgdGhlIGJvZHkgZWxlbWVudCBpcyB0aGUKLSAgICAgICAgKiBSUEMgd3JhcHBlci4KLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHJwY1dyYXBwZXIuZ2V0TGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICBycGNXcmFwcGVyID0gc29hcEJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiKiIsICIqIik7Ci0KLSAgICAgICAgaWYgKHJwY1dyYXBwZXIuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICAgIGluc3RhbmNlTGlzdCA9IHJwY1dyYXBwZXIuaXRlbSgwKS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmaXhTT0FQUmVzcG9uc2UoaW5zdGFuY2VMaXN0LCBvcGVyRWxlbWVudCk7Ci0gICAgfQotICB9Ci0gIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgIHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gIH0KLSAgcmV0dXJuIG51bGw7Ci19Ci0KLS8qCi0qIEhBQ0sgLSBUaGUgcm9vdCBlbGVtZW50IHRhZyBuYW1lIG9mIHRoZSBpbnN0YW5jZSBkb2N1bWVudAotKiBpcyBhbWJpZ3VvdXMuICBJdCBsYW5kcyBvbiBhIHZlcnkgZ3JleSBhcmVhIGJldHdlZW4gdGhlIFNPQVAKLSogc3BlYyBhbmQgdGhlIFdTREwgc3BlYy4gIFRoZSB0d28gc3BlY3MgZG8gbm90IGV4cGxpY2l0bHkgZGVmaW5lCi0qIHRoYXQgdGhlIHJvb3QgZWxlbWVudCB0YWcgbmFtZSBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIHRoZQotKiBXU0RMIHBhcnQuICBUaGUgaGFjayBpcyB0byB0cmVhdCBlbGVtZW50cyB3aXRoIGRpZmZlcmVudCB0YWcgbmFtZXMKLSogYXMgaW5zdGFuY2VzIG9mIHRoZSBXU0RMIHBhcnQuCi0qLwotcHJpdmF0ZSBFbGVtZW50W10gZml4U09BUFJlc3BvbnNlKE5vZGVMaXN0IGluc3RhbmNlTGlzdCwgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQpCi17Ci0gIFZlY3RvciBpbnN0YW5jZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBpbnN0YW5jZUxpc3QuaXRlbShpKTsKLSAgICBpZiAob2JqZWN0ICE9IG51bGwgJiYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpKQotICAgICAgaW5zdGFuY2VWZWN0b3IuYWRkKG9iamVjdCk7Ci0gIH0KLSAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbaW5zdGFuY2VWZWN0b3Iuc2l6ZSgpXTsKLSAgT3BlcmF0aW9uIG9wZXIgPSBvcGVyRWxlbWVudC5nZXRPcGVyYXRpb24oKTsKLSAgTWFwIHBhcnRzTWFwID0gb3Blci5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkuZ2V0UGFydHMoKTsKLSAgaWYgKHBhcnRzTWFwLnNpemUoKSA9PSAxKQotICB7Ci0gICAgSXRlcmF0b3IgaXQgPSBwYXJ0c01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQoKFBhcnQpaXQubmV4dCgpLCBmYWxzZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZVZlY3Rvci5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClpbnN0YW5jZVZlY3Rvci5nZXQoaSk7Ci0gICAgICBpZiAoIWVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFscyhmcmFnLmdldE5hbWUoKSkpCi0gICAgICB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoZnJhZy5nZXROYW1lKCkpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hpbGRyZW4uaXRlbShqKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRyZW4uaXRlbShqKSk7Ci0gICAgICAgICAgICAvLyBXaGVuIHlvdSBhcHBlbmQgYSBub2RlIGZyb20gb25lIGVsZW1lbnQgdG8gYW5vdGhlciwKLSAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBlbGVtZW50IHdpbGwgbG9zZSBpdHMgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSwKLSAgICAgICAgICAgIC8vIHRoZXJlZm9yZSwgdGhlIHNpemUgb2YgdGhlIG5vZGUgbGlzdCB3aWxsIGRlY3JlYXNlIGJ5IDEuCi0gICAgICAgICAgICBqLS07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGF0dHIgPSBhdHRyaWJ1dGVzLml0ZW0oaik7Ci0gICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiAoYXR0ciBpbnN0YW5jZW9mIEF0dHIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHIgYXR0cmlidXRlID0gKEF0dHIpYXR0cjsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5nZXROYW1lKCksIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2ldID0gZWxlbWVudDsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICAgIGluc3RhbmNlVmVjdG9yLmNvcHlJbnRvKGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotfQotJT4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotd3NkbFBlcnNwZWN0aXZlLnNldFN0YXR1c0NvbnRlbnRUeXBlKFdTRExQZXJzcGVjdGl2ZS5TVEFUVVNfQ09OVEVOVF9SRVNVTFRfRk9STSk7Ci1Ob2RlIG9wZXJOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE9wZXJhdGlvbk5vZGUoKTsKLW5vZGVJRC5kZWxldGUoMCwgbm9kZUlELmxlbmd0aCgpKTsKLW5vZGVJRC5hcHBlbmQob3Blck5vZGUuZ2V0Tm9kZUlkKCkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLU9wZXJhdGlvbiBvcGVyID0gb3BlckVsZW1lbnQuZ2V0T3BlcmF0aW9uKCk7Ci1pZiAob3Blci5nZXRPdXRwdXQoKSA9PSBudWxsKQotewotJT4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05PVEhJTkdfVE9fRElTUExBWV9JTl9GT1JNX1ZJRVciKSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotfQotZWxzZQotewotICBib29sZWFuIGNhY2hlZCA9ICgoQm9vbGVhbilvcGVyRWxlbWVudC5nZXRQcm9wZXJ0eUFzT2JqZWN0KFdTRExBY3Rpb25JbnB1dHMuU09BUF9SRVNQT05TRV9DQUNIRUQpKS5ib29sZWFuVmFsdWUoKTsKLSAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbnVsbDsKLSAgaWYgKCFjYWNoZWQpCi0gIHsKLSAgICBTT0FQTWVzc2FnZVF1ZXVlIHNvYXBNZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0U09BUFJlc3BvbnNlUXVldWUoKTsKLSAgICBpbnN0YW5jZURvY3VtZW50cyA9IHBhcnNlU09BUFJlc3BvbnNlKHNvYXBNZXNzYWdlUXVldWUsIG9wZXJFbGVtZW50KTsKLSAgfQotICBpZiAoIWNhY2hlZCAmJiBpbnN0YW5jZURvY3VtZW50cyA9PSBudWxsKQotICB7Ci0gICU+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRkFJTEVEX1ZBTElEQVRJT05fSU5fRk9STV9WSUVXIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8JQotICB9Ci0gIGVsc2UgaWYgKCFjYWNoZWQgJiYgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoIDw9IDApCi0gIHsKLSAgJT4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTk9USElOR19UT19ESVNQTEFZX0lOX0ZPUk1fVklFVyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPCUKLSAgfQotICBlbHNlCi0gIHsKLSAgICBNYXAgcGFydHNNYXAgPSBvcGVyLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKS5nZXRQYXJ0cygpOwotICAgIEl0ZXJhdG9yIGl0ID0gcGFydHNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICBIYXNodGFibGUgdXJpUmVmZXJlbmNlcyA9IG51bGw7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJWFNERnJhZ21lbnQgZnJhZ21lbnQgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudCgoUGFydClpdC5uZXh0KCksIGZhbHNlKTsKLSAgICAgIGlmICghY2FjaGVkKQotICAgICAgewotICAgICAgICBpZiAoIW9wZXJFbGVtZW50LmlzVXNlTGl0ZXJhbCgpICYmIChmcmFnbWVudCBpbnN0YW5jZW9mIElTT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHVyaVJlZmVyZW5jZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHVyaVJlZmVyZW5jZXMgPSBTT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQucGFyc2VVUklSZWZlcmVuY2VzKHNvYXBSZXNwb25zZV8sIHRydWUpOwotICAgICAgICAgICgoSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudClmcmFnbWVudCkuc2V0VVJJUmVmZXJlbmNlcyh1cmlSZWZlcmVuY2VzKTsKLSAgICAgICAgfQotICAgICAgICBmcmFnbWVudC5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoaW5zdGFuY2VEb2N1bWVudHMpOwotICAgICAgfQotICAgICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgICAgZnJhZ0lELmFwcGVuZChmcmFnbWVudC5nZXRJRCgpKTsKLSAgICAgICU+Ci0gICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9ZnJhZ21lbnQuZ2V0UmVhZEZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwlCi0gICAgfQotICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNPYmplY3QoV1NETEFjdGlvbklucHV0cy5TT0FQX1JFU1BPTlNFX0NBQ0hFRCwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotICB9Ci19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1JlYWRPbmx5RnJhZ21lbnRzU29hcFZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1JlYWRPbmx5RnJhZ21lbnRzU29hcFZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTMxZWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9SZWFkT25seUZyYWdtZW50c1NvYXBWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUwOSAgIDEwMzA3MiBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24KLSAqIDIwMDYwNTE1ICAgMTQwNjA3IG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMT3BlcmF0aW9uRWxlbWVudCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLXdzZGxQZXJzcGVjdGl2ZS5zZXRTdGF0dXNDb250ZW50VHlwZShXU0RMUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX1NPVVJDRSk7Ci1Ob2RlIG9wZXJOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE9wZXJhdGlvbk5vZGUoKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1TdHJpbmcgc29hcFJlcXVlc3RUYWJsZUNvbnRhaW5lcklkID0gIlNPQVBSZXF1ZXN0IjsKLVN0cmluZ0J1ZmZlciBzb2FwUmVxdWVzdFR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotc29hcFJlcXVlc3RUd2lzdEltYWdlTmFtZS5hcHBlbmQoc29hcFJlcXVlc3RUYWJsZUNvbnRhaW5lcklkKTsKLVN0cmluZyBzb2FwUmVzcG9uc2VUYWJsZUNvbnRhaW5lcklkID0gIlNPQVBSZXNwb25zZSI7Ci1TdHJpbmdCdWZmZXIgc29hcFJlc3BvbnNlVHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci1zb2FwUmVzcG9uc2VUd2lzdEltYWdlTmFtZS5hcHBlbmQoc29hcFJlc3BvbnNlVGFibGVDb250YWluZXJJZCk7Ci0lPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIHNlY3Rpb25JZHMgPSBbIjwlPXNvYXBSZXF1ZXN0VGFibGVDb250YWluZXJJZCU+IiwiPCU9c29hcFJlc3BvbnNlVGFibGVDb250YWluZXJJZCU+Il07Ci0gIGZ1bmN0aW9uIHRvZ2dsZVNPQVBFbnZlbG9wZShzb2FwRW52ZWxvcGVUeXBlLHR3aXN0SW1hZ2VOYW1lKQotICB7Ci08JQotICAgIC8vIElmIGJvdGggZW52ZWxvcGVzIGFyZSBleHBhbmRlZCwgZWFjaCBzaG91bGQgaGF2ZSA1MCUgaGVpZ2h0LiBPdGhlcndpc2UsIHRoZSByZW1haW5pbmcgZGlzcGxheWVkIGVudmVsb3BlIHNob3VsZCBiZSByZXNldCB0byAxMDAlIGhlaWdodC4KLSU+Ci0gICAgdmFyIHNvYXBTZWN0aW9uSWQgPSBzZWN0aW9uSWRzW3NvYXBFbnZlbG9wZVR5cGVdOwotICAgIHZhciBzb2FwU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNvYXBTZWN0aW9uSWQpOwotICAgIHZhciBzb2FwU2VjdGlvblRhYmxlID0gZ2V0VGFibGUoc29hcFNlY3Rpb25JZCk7Ci0gICAgdmFyIG90aGVyU29hcFNlY3Rpb25JZCA9IHNlY3Rpb25JZHNbMS1zb2FwRW52ZWxvcGVUeXBlXTsKLSAgICB2YXIgb3RoZXJTb2FwU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG90aGVyU29hcFNlY3Rpb25JZCk7Ci0gICAgdmFyIG90aGVyU29hcFNlY3Rpb25UYWJsZSA9IGdldFRhYmxlKG90aGVyU29hcFNlY3Rpb25JZCk7Ci0gICAgaWYgKHNvYXBTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKQotICAgIHsKLSAgICAgIGlmIChvdGhlclNvYXBTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPT0gIiIpCi0gICAgICB7Ci0gICAgICAgIHNvYXBTZWN0aW9uVGFibGUuaGVpZ2h0ID0gIjUwJSI7Ci0gICAgICAgIG90aGVyU29hcFNlY3Rpb25UYWJsZS5oZWlnaHQgPSAiNTAlIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgc29hcFNlY3Rpb25UYWJsZS5oZWlnaHQgPSAiMTAwJSI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3RoZXJTb2FwU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID09ICIiKQotICAgICAgICBvdGhlclNvYXBTZWN0aW9uVGFibGUuaGVpZ2h0ID0gIjEwMCUiOwotICAgIH0KLSAgICB0d2lzdChzb2FwU2VjdGlvbklkLHR3aXN0SW1hZ2VOYW1lKTsKLSAgfQotPC9zY3JpcHQ+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dG9nZ2xlU09BUEVudmVsb3BlKDwlPVdTRExBY3Rpb25JbnB1dHMuU09BUF9FTlZFTE9QRV9UWVBFX1JFUVVFU1QlPiwnPCU9c29hcFJlcXVlc3RUd2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT1zb2FwUmVxdWVzdFR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NPQVBfUkVRVUVTVF9FTlZFTE9QRSIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08ZGl2IGlkPSI8JT1zb2FwUmVxdWVzdFRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBoZWlnaHQ9IjUwJSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxscGFkZGluZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGlmcmFtZSBuYW1lPSJyZXF1ZXN0RW52ZWxvcGVGcmFtZSIgZnJhbWVib3JkZXI9MCBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh3c2RsUGVyc3BlY3RpdmUuZ2V0U09BUEVudmVsb3BlWE1MTGluayhXU0RMQWN0aW9uSW5wdXRzLlNPQVBfRU5WRUxPUEVfVFlQRV9SRVFVRVNUKSkpJT4iIHdpZHRoPSI5NSUiIGhlaWdodD0iMTAwJSI+PC9pZnJhbWU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0d2lzdCgiPCU9c29hcFJlcXVlc3RUYWJsZUNvbnRhaW5lcklkJT4iLCI8JT1zb2FwUmVxdWVzdFR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIpOwotPC9zY3JpcHQ+Ci0KLTwlCi1pZiAob3BlckVsZW1lbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkgIT0gbnVsbCkKLXsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnRvZ2dsZVNPQVBFbnZlbG9wZSg8JT1XU0RMQWN0aW9uSW5wdXRzLlNPQVBfRU5WRUxPUEVfVFlQRV9SRVNQT05TRSU+LCc8JT1zb2FwUmVzcG9uc2VUd2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT1zb2FwUmVzcG9uc2VUd2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TT0FQX1JFU1BPTlNFX0VOVkVMT1BFIiklPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxkaXYgaWQ9IjwlPXNvYXBSZXNwb25zZVRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBoZWlnaHQ9IjUwJSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxscGFkZGluZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgIAk8IS0tIHRoZSBvbmxvYWQgY2FsbCBpcyB0byBmaXggYnVnIDE0MDYwNyBpbiBidWd6aWxsYSAtLT4KLSAgICAgICAgPGlmcmFtZSBvbmxvYWQ9ImphdmFzY3JpcHQ6cmVxdWVzdEVudmVsb3BlRnJhbWUuZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKCkiIGZyYW1lYm9yZGVyPTAgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQod3NkbFBlcnNwZWN0aXZlLmdldFNPQVBFbnZlbG9wZVhNTExpbmsoV1NETEFjdGlvbklucHV0cy5TT0FQX0VOVkVMT1BFX1RZUEVfUkVTUE9OU0UpKSklPiIgd2lkdGg9Ijk1JSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHR3aXN0KCI8JT1zb2FwUmVzcG9uc2VUYWJsZUNvbnRhaW5lcklkJT4iLCI8JT1zb2FwUmVzcG9uc2VUd2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iKTsKLTwvc2NyaXB0PgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETEJpbmRpbmdEZXRhaWxzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETEJpbmRpbmdEZXRhaWxzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NDcxOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExCaW5kaW5nRGV0YWlsc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgTm9kZSBiaW5kaW5nTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTRExfQklORElOR19ERVRBSUxTIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciByb3dDaGVja2JveE5hbWUgPSAicm93Q2hlY2tib3hOYW1lIjsKLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvYWN0aW9ucy9VcGRhdGVXU0RMQmluZGluZ0FjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBoYW5kbGVTdWJtaXQodGhpcykiPgotPCUKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ3c2RsL2ltYWdlcy9vcGVuX3dzZGxfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgIFN0cmluZyB0aXRsZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NETF9CSU5ESU5HX0RFVEFJTFMiKTsKLSAgIFdTRExCaW5kaW5nRWxlbWVudCB3c2RsQmluZGluZ0VsZW1lbnQgPSAoV1NETEJpbmRpbmdFbGVtZW50KWJpbmRpbmdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICBWZWN0b3Igb3BlcmF0aW9uTm9kZXMgPSBiaW5kaW5nTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci08aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuTk9ERUlEJT4iIHZhbHVlPSI8JT1iaW5kaW5nTm9kZS5nZXROb2RlSWQoKSU+Ij4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CSU5ESU5HX0RFVEFJTFNfREVTQyIsd3NkbFBlcnNwZWN0aXZlLmdldEJpbmRpbmdUeXBlU3RyaW5nKHdzZGxCaW5kaW5nRWxlbWVudC5nZXRCaW5kaW5nVHlwZSgpKSklPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgIFN0cmluZyBkb2N1bWVudGF0aW9uID0gd3NkbEJpbmRpbmdFbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfRE9DVU1FTlRBVElPTik7Ci0gICBpZiAoZG9jdW1lbnRhdGlvbi5sZW5ndGgoKSA+IDApCi0gICB7Ci0lPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+PCU9ZG9jdW1lbnRhdGlvbiU+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MTA+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgfQotCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoIk9wZXJhdGlvbnMiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhvcGVyYXRpb25Ob2Rlcyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL2Zvcm1zL29wZXJhdGlvbnNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIGlmIChvcGVyYXRpb25Ob2Rlcy5zaXplKCkgPiAwKQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0d2lzdCgiT3BlcmF0aW9ucyIsInhPcGVyYXRpb25zIik7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0KLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiRW5kcG9pbnRzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMod3NkbEJpbmRpbmdFbGVtZW50KTsKLSU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL2Zvcm1zL2VuZHBvaW50X3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gIGlmICh3c2RsQmluZGluZ0VsZW1lbnQuZ2V0RW5kUG9pbnRzKCkubGVuZ3RoID4gMCkKLSAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0d2lzdE9wZW4oIkVuZHBvaW50cyIpOwotPC9zY3JpcHQ+Ci08JQotICB9Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9XU0RMRGV0YWlsc0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWFkMDc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9XU0RMRGV0YWlsc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gIE5vZGUgd3NkbE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gd3NkbE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gIFdTRExEZXRhaWxzVG9vbCB3c2RsRGV0YWlsc1Rvb2wgPSAoV1NETERldGFpbHNUb29sKWN1cnJlbnRUb29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9XU0RMX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc3dpdGNoV1NETERldGFpbHNWaWV3KCkgewotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL2FjdGlvbnMvU3dpdGNoV1NETERldGFpbHNWaWV3c0FjdGlvbkpTUC5qc3AiKSklPiI7Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzZGwvaW1hZ2VzL29wZW5fd3NkbF9oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0RFVEFJTFMiKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh0aXRsZUltYWdlUGF0aCkpJT4iIGFsdD0iIj4KLSAgICAgIDxzdHJvbmc+PCU9dGl0bGUlPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIqIj4mbmJzcDs8L3RkPgotICAgIDx0ZCBhbGlnbj0icmlnaHQiIGNsYXNzPSJsYWJlbHMiPgotPCUKLSAgIGlmICh3c2RsRGV0YWlsc1Rvb2wuZ2V0Vmlld0lkKCkgPT0gV1NETERldGFpbHNUb29sLlNPVVJDRV9WSUVXX0lEKQotICAgeyAgICAgCi0lPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzd2l0Y2hXU0RMRGV0YWlsc1ZpZXcoKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1dJVENIX1RPX0ZPUk1fVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRk9STSIpJT48L2E+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6c3dpdGNoV1NETERldGFpbHNWaWV3KCkiIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NXSVRDSF9UT19TT1VSQ0VfVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfU09VUkNFIiklPjwvYT4KLTwlCi0gICB9Ci0lPiAgIAotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIGNvbHNwYW49Mz48aW1nIGhlaWdodD0yIHdpZHRoPSIxMDAlIiBhbGlnbj0idG9wIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgaWYgKHdzZGxEZXRhaWxzVG9vbC5nZXRWaWV3SWQoKSA9PSBXU0RMRGV0YWlsc1Rvb2wuRk9STV9WSUVXX0lEKQotICB7Ci0lPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9mb3Jtcy9XU0RMRGV0YWlsc0Zvcm1WaWV3LmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gIH0KLSAgZWxzZQotICB7Ci0lPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBoZWlnaHQ9IjEwMCUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHBhZGRpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxpZnJhbWUgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIi93c2RsL2Zvcm1zL1dTRExEZXRhaWxzU291cmNlVmlldy5qc3AiKSklPiIgd2lkdGg9Ijk1JSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gIH0KLSU+Ci08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNGb3JtVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNGb3JtVmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MjVjNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExEZXRhaWxzRm9ybVZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX0RFVEFJTFNfREVTQyIpJT48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi1Ob2RlIHdzZGxOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci1XU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCl3c2RsTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotU3RyaW5nIGRvY3VtZW50YXRpb24gPSB3c2RsRWxlbWVudC5nZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX0RPQ1VNRU5UQVRJT04pOwotaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCAmJiBkb2N1bWVudGF0aW9uLmxlbmd0aCgpID4gMCkKLXsKLSU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj48JT1kb2N1bWVudGF0aW9uJT48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi19Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvdGg+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjwlPXdzZGxFbGVtZW50LmdldFdzZGxVcmwoKSU+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTEwPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUgICAKLXNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci1zZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiU2VydmljZXMiKTsKLVZlY3RvciBzZXJ2aWNlTm9kZXMgPSB3c2RsTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci1zZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoc2VydmljZU5vZGVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvc2VydmljZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0xMD4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlICAgCi1WZWN0b3IgYmluZGluZ05vZGVzID0gbmV3IFZlY3RvcigpOwotZm9yIChpbnQgaT0wO2k8c2VydmljZU5vZGVzLnNpemUoKTtpKyspCi17Ci0gIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KGkpOwotICBWZWN0b3Igc2VydmljZUJpbmRpbmdOb2RlcyA9IHNlcnZpY2VOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgZm9yIChpbnQgaj0wO2o8c2VydmljZUJpbmRpbmdOb2Rlcy5zaXplKCk7aisrKQotICB7Ci0gICAgTm9kZSBzZXJ2aWNlQmluZGluZ05vZGUgPSAoTm9kZSlzZXJ2aWNlQmluZGluZ05vZGVzLmVsZW1lbnRBdChqKTsKLSAgICBiaW5kaW5nTm9kZXMuYWRkRWxlbWVudChzZXJ2aWNlQmluZGluZ05vZGUpOwotICB9Ci19Ci1zZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoIkJpbmRpbmdzIik7Ci1zZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoYmluZGluZ05vZGVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvYmluZGluZ3NfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci08JQotaWYgKHNlcnZpY2VOb2Rlcy5zaXplKCkgPiAwKQotewotJT4KLSAgdHdpc3QoIlNlcnZpY2VzIiwieFNlcnZpY2VzIik7Ci08JQotfQotaWYgKGJpbmRpbmdOb2Rlcy5zaXplKCkgPiAwKQotewotJT4KLSAgdHdpc3QoIkJpbmRpbmdzIiwieEJpbmRpbmdzIik7Ci08JQotfQotJT4KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExEZXRhaWxzU291cmNlVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNTb3VyY2VWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwYTRiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNTb3VyY2VWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQveG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC54bWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLmZhY3RvcnkuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLVdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NkbEVsZW1lbnQuZ2V0RGVmaW5pdGlvbigpOwotV1NETEZhY3Rvcnkgd3NkbEZhY3RvcnkgPSBuZXcgV1NETEZhY3RvcnlJbXBsKCk7Ci1XU0RMV3JpdGVyIHdzZGxXcml0ZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMV3JpdGVyKCk7Ci1TdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotdHJ5Ci17Ci0gIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIHN0cmluZ1dyaXRlcik7Ci0gICU+Ci0gIDwlPXN0cmluZ1dyaXRlci50b1N0cmluZygpJT4KLSAgPCUKLX0KLWNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKQotewotICAlPgotICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLSAgPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkOWQ1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1Qcm9wZXJ0aWVzIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBTdHJpbmcgd3NkbFVybCA9ICgoV1NETEVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCkpLmdldFdzZGxVcmwoKTsKLSAgIGZvcm1Qcm9wZXJ0aWVzLnB1dCgiZm9ybUFjdGlvbkxpbmsiLCJ3c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AiKTsKLSAgIGZvcm1Qcm9wZXJ0aWVzLnB1dCgid3NkbFVSTCIsd3NkbFVybCk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvSW1wb3J0V1NETEFuZFdTSUxUb1dvcmtiZW5jaEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzZDgwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uTGluayIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi1mb3JtQWN0aW9uTGluay5hcHBlbmQoIndzZGwvYWN0aW9ucy9XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AiKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETFNlcnZpY2VEZXRhaWxzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETFNlcnZpY2VEZXRhaWxzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMjRjYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExTZXJ2aWNlRGV0YWlsc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgTm9kZSBzZXJ2aWNlTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAid3NkbC9pbWFnZXMvb3Blbl93c2RsX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1dTRExfU0VSVklDRV9ERVRBSUxTIik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0VSVklDRV9ERVRBSUxTX0RFU0MiKSU+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgV1NETFNlcnZpY2VFbGVtZW50IHdzZGxTZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpc2VydmljZU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIFN0cmluZyBkb2N1bWVudGF0aW9uID0gd3NkbFNlcnZpY2VFbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfRE9DVU1FTlRBVElPTik7Ci0gICBpZiAoZG9jdW1lbnRhdGlvbi5sZW5ndGgoKSA+IDApCi0gICB7Ci0lPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+PCU9ZG9jdW1lbnRhdGlvbiU+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MTA+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgfQotICAgVmVjdG9yIGJpbmRpbmdOb2RlcyA9IHNlcnZpY2VOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiQmluZGluZ3MiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhiaW5kaW5nTm9kZXMpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9mb3Jtcy9iaW5kaW5nc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Rpdj4KLTwlCi0gICBpZiAoYmluZGluZ05vZGVzLnNpemUoKSA+IDApCi0gICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHR3aXN0KCJCaW5kaW5ncyIsInhCaW5kaW5ncyIpOwotPC9zY3JpcHQ+Ci08JQotICAgfQotJT4KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL2JpbmRpbmdzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9iaW5kaW5nc190YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMGNhMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL2JpbmRpbmdzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsKLSU+Ci08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPjxzdHJvbmc+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQklORElOR1MiKSU+PC9zdHJvbmc+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIyMCUiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIyMCUiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JJTkRJTkdfVFlQRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRE9DVU1FTlRBVElPTiIpJT48L3RoPgotICAgIDwvdHI+Ci08JQotICAgVmVjdG9yIGJpbmRpbmdOb2RlcyA9IChWZWN0b3Ipc2VjdGlvbkhlYWRlckluZm8uZ2V0T3RoZXJQcm9wZXJ0aWVzKCk7Ci0gICBmb3IgKGludCBpPTA7aTxiaW5kaW5nTm9kZXMuc2l6ZSgpO2krKykKLSAgIHsKLSAgICAgTm9kZSBiaW5kaW5nTm9kZSA9IChOb2RlKWJpbmRpbmdOb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgIFdTRExCaW5kaW5nRWxlbWVudCB3c2RsQmluZGluZ0VsZW1lbnQgPSAoV1NETEJpbmRpbmdFbGVtZW50KWJpbmRpbmdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgIEJpbmRpbmcgYmluZGluZyA9IHdzZGxCaW5kaW5nRWxlbWVudC5nZXRCaW5kaW5nKCk7Ci0lPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoYmluZGluZ05vZGUuZ2V0Tm9kZUlkKCksZmFsc2UpKSklPiI+PCU9YmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpJT48L3RkPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0QmluZGluZ1R5cGVTdHJpbmcod3NkbEJpbmRpbmdFbGVtZW50LmdldEJpbmRpbmdUeXBlKCkpJT48L3RkPgotPCUKLSAgICAgV1NETFNlcnZpY2VFbGVtZW50IHdzZGxTZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpd3NkbEJpbmRpbmdFbGVtZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgU3RyaW5nIGRvY3VtZW50YXRpb24gPSB3c2RsU2VydmljZUVsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9ET0NVTUVOVEFUSU9OKTsKLSAgICAgaWYgKGRvY3VtZW50YXRpb24ubGVuZ3RoKCkgPCAxKQotICAgICAgIGRvY3VtZW50YXRpb24gPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIlRBQkxFX0JMQU5LX1BMQUNFSE9MREVSIik7ICAgICAKLSU+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjwlPWRvY3VtZW50YXRpb24lPjwvdGQ+Ci0gICAgPC90cj4KLTwlCi0gICB9Ci0lPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvZW5kcG9pbnRfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL2VuZHBvaW50X3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlYzZkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvZW5kcG9pbnRfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBhZGRFbmRwb2ludCh0YWJsZUNvbnRhaW5lcklELCBpZCwgbmFtZSwgdmFsdWUsIGlzUmVtb3ZhYmxlKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGlmICghaXNSZW1vdmFibGUpCi0gICAgewotICAgICAgcm93Q2hlY2tib3guZGlzYWJsZWQgPSB0cnVlOwotICAgIH0KLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLQotICAgIHZhciBlbmRQb2ludDsKLSAgICBpZiAoaXNSZW1vdmFibGUpCi0gICAgewotICAgICAgZW5kUG9pbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgZW5kUG9pbnQudHlwZSA9ICJ0ZXh0IjsKLSAgICAgIGVuZFBvaW50LmlkID0gaWQ7Ci0gICAgICBlbmRQb2ludC5uYW1lID0gbmFtZTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICBlbmRQb2ludC52YWx1ZSA9IHZhbHVlOwotICAgICAgZW5kUG9pbnQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZW5kUG9pbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChlbmRQb2ludCk7Ci0KLSAgICBjb2x1bW4wLmNsYXNzTmFtZSA9ICJjaGVja2JveGNlbGxzIjsKLSAgICBjb2x1bW4xLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChuZXdSb3cpOwotICB9Ci0KLSAgZnVuY3Rpb24gaGFuZGxlRW5kcG9pbnRDaGVja0FsbENsaWNrKHRhYmxlQ29udGFpbmVySWQsY2hlY2tBbGxDaGVja2JveCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveENlbGwgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLml0ZW0oMCk7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSByb3dDaGVja2JveENlbGwuY2hpbGROb2Rlc1swXTsKLSAgICAgIGlmICghcm93Q2hlY2tib3guZGlzYWJsZWQpCi0gICAgICB7Ci0gICAgICAgIHJvd0NoZWNrYm94LmNoZWNrZWQgPSBjaGVja0FsbENoZWNrYm94LmNoZWNrZWQ7Ci0gICAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICAgIGhpZ2hsaWdodFJvdyh0YWJsZS5yb3dzW2ldLCJyb3djb2xvciIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaGlnaGxpZ2h0Um93KHRhYmxlLnJvd3NbaV0sInRhYmxlY2VsbHMiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLTwvc2NyaXB0PgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpOyAgIAotICAgV1NETEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50ID0gKFdTRExCaW5kaW5nRWxlbWVudClzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKTsKLSAgIFN0cmluZ1tdIGVuZHBvaW50cyA9IGJpbmRpbmdFbGVtZW50LmdldEVuZFBvaW50cygpOwotICAgU3RyaW5nIGFkZHJlc3NMb2NhdGlvbiA9ICgoV1NETFNlcnZpY2VFbGVtZW50KWJpbmRpbmdFbGVtZW50LmdldFBhcmVudEVsZW1lbnQoKSkuZ2V0QWRkcmVzc0xvY2F0aW9uKGJpbmRpbmdFbGVtZW50LmdldEJpbmRpbmcoKSk7ICAgCi0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9FTkRfUE9JTlRTIiklPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6YWRkRW5kcG9pbnQoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsICc8JT1XU0RMQWN0aW9uSW5wdXRzLkVORF9QT0lOVCU+JywgJzwlPVdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UJT4nLCAnPCU9YWRkcmVzc0xvY2F0aW9uJT4nLCB0cnVlKSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nKSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlRW5kcG9pbnRDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRU5EX1BPSU5UUyIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotPCUKLSAgYm9vbGVhbiBpc0RlZmF1bHRBZGRlZCA9IGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgaSA8IGVuZHBvaW50cy5sZW5ndGg7IGkrKykKLSAgewotICAgIGlmIChlbmRwb2ludHNbaV0uZXF1YWxzKGFkZHJlc3NMb2NhdGlvbikgJiYgIWlzRGVmYXVsdEFkZGVkKQotICAgIHsKLSU+Ci0gICAgYWRkRW5kcG9pbnQoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsICc8JT1XU0RMQWN0aW9uSW5wdXRzLkVORF9QT0lOVCU+JywgIiIsICc8JT1lbmRwb2ludHNbaV0lPicsIGZhbHNlKTsKLSAgICAKLTwlCi0gICAgICBpc0RlZmF1bHRBZGRlZCA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0lPgotICAgIGFkZEVuZHBvaW50KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9V1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQlPicsICc8JT1XU0RMQWN0aW9uSW5wdXRzLkVORF9QT0lOVCU+JywgJzwlPWVuZHBvaW50c1tpXSU+JywgdHJ1ZSk7Ci08JQotICAgIH0KLSAgfQotJT4KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL29wZXJhdGlvbnNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL29wZXJhdGlvbnNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIxOWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9vcGVyYXRpb25zX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7ICAgCi0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj48c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX09QRVJBVElPTlMiKSU+PC9zdHJvbmc+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIyMCUiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RPQ1VNRU5UQVRJT04iKSU+PC90aD4KLSAgICA8L3RyPgotPCUKLSAgIFZlY3RvciBvcGVyYXRpb25Ob2RlcyA9IChWZWN0b3Ipc2VjdGlvbkhlYWRlckluZm8uZ2V0T3RoZXJQcm9wZXJ0aWVzKCk7Ci0gICBmb3IgKGludCBpPTA7aTxvcGVyYXRpb25Ob2Rlcy5zaXplKCk7aSsrKQotICAgewotICAgICBOb2RlIG9wZXJhdGlvbk5vZGUgPSAoTm9kZSlvcGVyYXRpb25Ob2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgIFdTRExPcGVyYXRpb25FbGVtZW50IHdzZGxPcGVyYXRpb25FbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJhdGlvbk5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhvcGVyYXRpb25Ob2RlLmdldE5vZGVJZCgpLGZhbHNlKSkpJT4iPjwlPXdzZGxPcGVyYXRpb25FbGVtZW50LmdldE9wZXJhdGlvbigpLmdldE5hbWUoKSU+PC9hPjwvdGQ+Ci08JSAgICAgCi0gICAgIFN0cmluZyBkb2N1bWVudGF0aW9uID0gd3NkbE9wZXJhdGlvbkVsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9ET0NVTUVOVEFUSU9OKTsKLSAgICAgaWYgKGRvY3VtZW50YXRpb24ubGVuZ3RoKCkgPCAxKQotICAgICAgIGRvY3VtZW50YXRpb24gPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIlRBQkxFX0JMQU5LX1BMQUNFSE9MREVSIik7Ci0lPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT1kb2N1bWVudGF0aW9uJT48L3RkPgotICAgIDwvdHI+Ci08JSAgIAotICAgfSAgIAotJT4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL3NlcnZpY2VzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9zZXJ2aWNlc190YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4Yzk5MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL3NlcnZpY2VzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7ICAgCi0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj48c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NFUlZJQ0VTIiklPjwvc3Ryb25nPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiB3aWR0aD0iMjAlIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ET0NVTUVOVEFUSU9OIiklPjwvdGg+Ci0gICAgPC90cj4KLTwlCi0gICBWZWN0b3Igc2VydmljZU5vZGVzID0gKFZlY3RvcilzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKTsKLSAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VOb2Rlcy5zaXplKCk7aSsrKQotICAgewotICAgICBOb2RlIHNlcnZpY2VOb2RlID0gKE5vZGUpc2VydmljZU5vZGVzLmVsZW1lbnRBdChpKTsKLSAgICAgV1NETFNlcnZpY2VFbGVtZW50IHdzZGxTZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpc2VydmljZU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXJ2aWNlTm9kZS5nZXROb2RlSWQoKSxmYWxzZSkpKSU+Ij48JT13c2RsU2VydmljZUVsZW1lbnQuZ2V0U2VydmljZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPjwvYT48L3RkPgotPCUgICAgIAotICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IHdzZGxTZXJ2aWNlRWxlbWVudC5nZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX0RPQ1VNRU5UQVRJT04pOwotICAgICBpZiAoZG9jdW1lbnRhdGlvbi5sZW5ndGgoKSA8IDEpCi0gICAgICAgZG9jdW1lbnRhdGlvbiA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiVEFCTEVfQkxBTktfUExBQ0VIT0xERVIiKTsKLSU+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjwlPWRvY3VtZW50YXRpb24lPjwvdGQ+Ci0gICAgPC90cj4KLTwlICAgCi0gICB9ICAgCi0lPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9TT0FQRW5jQXJyYXlGaXhXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheUZpeFdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODAyYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheUZpeFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVNPQVBFbmNBcnJheUZyYWdtZW50IGZyYWcgPSAoSVNPQVBFbmNBcnJheUZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKS50b1N0cmluZygpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUlPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGQgd2lkdGg9MTY+Ci0gICAgICA8aW1nIHdpZHRoPTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL2ZyYWdtZW50L1hTREdyb3VwU2VxRml4V0ZyYWdtZW50SlNQLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9TT0FQRW5jQXJyYXlSRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheVJGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwODQxNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheVJGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgb3Blck5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JU09BUEVuY0FycmF5RnJhZ21lbnQgZnJhZyA9IChJU09BUEVuY0FycmF5RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEQmFzZSA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZUJhc2UgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJREJhc2UpLnRvU3RyaW5nKCk7Ci1TdHJpbmdbXSBncm91cElEcyA9IGZyYWcuZ2V0R3JvdXBJRHMoKTsKLWZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJRHMubGVuZ3RoOyBpKyspIHsKLSU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9aSArIHRhYmxlQ29udGFpbmVySURCYXNlJT4nLCc8JT1pICsgdHdpc3RJbWFnZU5hbWVCYXNlJT4nKSI+PGltZyBuYW1lPSI8JT1pICsgdHdpc3RJbWFnZU5hbWVCYXNlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgICAgPCU9ZnJhZy5nZXROYW1lKCklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8c3BhbiBpZD0iPCU9aSArIHRhYmxlQ29udGFpbmVySURCYXNlJT4iPgotICA8dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci08JQotICAgIElYU0RGcmFnbWVudFtdIGNoaWxkRnJhZ21lbnRzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEc1tpXSk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZEZyYWdtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgICAgZnJhZ0lELmFwcGVuZChjaGlsZEZyYWdtZW50c1tqXS5nZXRJRCgpKTsKLSU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgICAgICA8aW1nIHdpZHRoPTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNoaWxkRnJhZ21lbnRzW2pdLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotPCUKLSAgICB9Ci0lPgotICA8L3RhYmxlPgotICA8L3NwYW4+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9TT0FQRW5jQXJyYXlSYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvU09BUEVuY0FycmF5UmFuZ2VXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDJhNjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9TT0FQRW5jQXJyYXlSYW5nZVdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREdyb3VwU2VxRnJhZ21lbnQgZnJhZyA9IChJWFNER3JvdXBTZXFGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJRCkudG9TdHJpbmcoKTsKLVN0cmluZyBuYW1lQW5jaG9ySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5OQU1FX0FOQ0hPUl9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0lPgotPGEgbmFtZT0iPCU9bmFtZUFuY2hvcklEJT4iLz4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUlPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVJbnN0YW5jZSgnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4sICc8JT1mcmFnSUQlPicsICc8JT1uYW1lQW5jaG9ySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1pbk9jY3VycygpJT4pIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJyYW5nZWZyYWd0YWJsZSIgOiAiaW5uZXJyYW5nZWZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySUQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU09BUF9FTkNfQVJSQVlTIiklPjwvdGg+Ci0gIDwvdHI+Ci0gIDwlCi0gIFN0cmluZ1tdIGdyb3VwSURzID0gZnJhZy5nZXRHcm91cElEcygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwSURzLmxlbmd0aCB8fCBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSAgICBTdHJpbmcgZ3JvdXBJRDsKLSAgICBpZiAoaSA8IGdyb3VwSURzLmxlbmd0aCkKLSAgICAgIGdyb3VwSUQgPSBncm91cElEc1tpXTsKLSAgICBlbHNlCi0gICAgICBncm91cElEID0gZnJhZy5jcmVhdGVHcm91cFNlcUluc3RhbmNlKCk7Ci0gICAgSVhTREZyYWdtZW50W10gZ3JvdXBNZW1iZXJGcmFnbWVudHMgPSBmcmFnLmdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGdyb3VwSUQpOwotICAlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD4KLSAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlUm93Q2hlY2tib3hDbGljaygpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWdyb3VwSUQlPiI+Ci0gICAgICA8JQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgICAgICAgIGZyYWdJRC5hcHBlbmQoZ3JvdXBNZW1iZXJGcmFnbWVudHNbal0uZ2V0SUQoKSk7Ci0gICAgICAlPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWdyb3VwTWVtYmVyRnJhZ21lbnRzW2pdLmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPCUKLSAgICAgICAgfQotICAgICAgJT4KLSAgICA8L3RkPgotICA8L3RyPgotICA8JQotICB9Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhGaXhXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhGaXhXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Y3MzEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4Rml4V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZWxlbWVudElEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYXR0cmlidXRlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTRENvbXBsZXhGcmFnbWVudCBmcmFnID0gKElYU0RDb21wbGV4RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLUlYU0RFbGVtZW50RnJhZ21lbnQgZWxlbWVudEZyYWdtZW50ID0gKElYU0RFbGVtZW50RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGVsZW1lbnRJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT4KLSAgICA8L3RkPgotICAgIAotICAgIDwlIAotICAgICAgaWYoZWxlbWVudEZyYWdtZW50ICE9IG51bGwgJiYgZWxlbWVudEZyYWdtZW50LmlzTmlsbGFibGUoKSl7Ci0gICAgICAgIGlmKGVsZW1lbnRGcmFnbWVudC5pc05pbCgpKXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgY2hlY2tlZD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9IAotICAgICAgICBlbHNlewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJT4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDwlCi0gIElYU0RGcmFnbWVudFtdIGNoaWxkRnJhZ3MgPSBmcmFnLmdldEFsbEZyYWdtZW50cygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsgaSsrKSB7Ci0gICAgSVhTREZyYWdtZW50IGNoaWxkRnJhZzsKLSAgICBTdHJpbmcgY2hpbGRGcmFnSUQ7Ci0gICAgaWYgKGkgPCBjaGlsZEZyYWdzLmxlbmd0aCkgewotICAgICAgY2hpbGRGcmFnID0gY2hpbGRGcmFnc1tpXTsKLSAgICAgIGNoaWxkRnJhZ0lEID0gY2hpbGRGcmFnLmdldElEKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY2hpbGRGcmFnSUQgPSBmcmFnLmNyZWF0ZUNvbXBsZXhJbnN0YW5jZSgpOwotICAgICAgY2hpbGRGcmFnID0gZnJhZy5nZXRGcmFnbWVudChjaGlsZEZyYWdJRCk7Ci0gICAgfQotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ0lEKTsKLSAgICBhdHRyaWJ1dGUuZGVsZXRlKDAsIGF0dHJpYnV0ZS5sZW5ndGgoKSk7Ci0gICAgYXR0cmlidXRlLmFwcGVuZCgiZmFsc2UiKTsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWNoaWxkRnJhZ0lEJT4iPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNoaWxkRnJhZy5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotICA8JQotICB9Ci0gCi0gIElYU0RBdHRyaWJ1dGVGcmFnbWVudFtdIGF0dHJpYnV0ZUZyYWdtZW50cyA9IGZyYWcuZ2V0QWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gIElYU0RBdHRyaWJ1dGVGcmFnbWVudCBhdHRyaWJ1dGVGcmFnbWVudDsKLSAgZm9yKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZUZyYWdtZW50cy5sZW5ndGg7IGorKyl7Ci0gICAgYXR0cmlidXRlRnJhZ21lbnQgPSBhdHRyaWJ1dGVGcmFnbWVudHNbal07Ci0gICAgSVhTREZyYWdtZW50IGRlbGVnYXRpb25GcmFnbWVudCA9IGF0dHJpYnV0ZUZyYWdtZW50LmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGRlbGVnYXRpb25GcmFnbWVudC5nZXRJRCgpKTsKLSAgICBhdHRyaWJ1dGUuZGVsZXRlKDAsIGF0dHJpYnV0ZS5sZW5ndGgoKSk7Ci0gICAgYXR0cmlidXRlLmFwcGVuZCgidHJ1ZSIpOwotICAgICAgJT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHdpZHRoPTE2PgotICAgICAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWF0dHJpYnV0ZUZyYWdtZW50LmdldElEKCklPiI+Ci0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWRlbGVnYXRpb25GcmFnbWVudC5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwvdGQ+Ci0gICAgIDwvdHI+Ci0gICAgCi0gICAgPCUKLSAgCi0gIAotICB9Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNlOTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4UkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZWxlbWVudElEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYXR0cmlidXRlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RDb21wbGV4RnJhZ21lbnQgZnJhZyA9IChJWFNEQ29tcGxleEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJREJhc2UgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWVCYXNlID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySURCYXNlKS50b1N0cmluZygpOwotSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGZyYWcuZ2V0QWxsRnJhZ21lbnRzKCk7Ci1mb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRnJhZ3MubGVuZ3RoOyBpKyspIHsKLSAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ3NbaV0uZ2V0SUQoKSk7Ci0lPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+JywnPCU9aSArIHR3aXN0SW1hZ2VOYW1lQmFzZSU+JykiPjxpbWcgbmFtZT0iPCU9aSArIHR3aXN0SW1hZ2VOYW1lQmFzZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgIDwlPWZyYWcuZ2V0TmFtZSgpJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPHNwYW4gaWQ9IjwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+Ij4KLSAgPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICAgIDx0cj4KLSAgICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgICAgPGltZyB3aWR0aD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaGlsZEZyYWdzW2ldLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwlCi19Ci0gIElYU0RBdHRyaWJ1dGVGcmFnbWVudFtdIGF0dHJpYnV0ZUZyYWdtZW50cyA9IGZyYWcuZ2V0QWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gIElYU0RBdHRyaWJ1dGVGcmFnbWVudCBhdHRyaWJ1dGVGcmFnbWVudDsKLSAgZm9yKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZUZyYWdtZW50cy5sZW5ndGg7IGorKyl7Ci0gICAgYXR0cmlidXRlRnJhZ21lbnQgPSBhdHRyaWJ1dGVGcmFnbWVudHNbal07Ci0gICAgSVhTREZyYWdtZW50IGRlbGVnYXRpb25GcmFnbWVudCA9IGF0dHJpYnV0ZUZyYWdtZW50LmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGRlbGVnYXRpb25GcmFnbWVudC5nZXRJRCgpKTsKLSAgICBhdHRyaWJ1dGUuZGVsZXRlKDAsIGF0dHJpYnV0ZS5sZW5ndGgoKSk7Ci0gICAgYXR0cmlidXRlLmFwcGVuZCgidHJ1ZSIpOwotICAgICAgJT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHdpZHRoPTE2PgotICAgICAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWF0dHJpYnV0ZUZyYWdtZW50LmdldElEKCklPiI+Ci0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWRlbGVnYXRpb25GcmFnbWVudC5nZXRSZWFkRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPC90ZD4KLSAgICAgPC90cj4KLSAgICA8JQotICAKLSAgCi0gIH0KLSAgJT4KLSAgCi0gIDwvdGFibGU+Ci0gIDwvc3Bhbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4UmFuZ2VXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSYW5nZVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTdkMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSYW5nZVdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImVsZW1lbnRJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImF0dHJpYnV0ZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RDb21wbGV4RnJhZ21lbnQgZnJhZyA9IChJWFNEQ29tcGxleEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChlbGVtZW50SUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKS50b1N0cmluZygpOwotU3RyaW5nIG5hbWVBbmNob3JJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLk5BTUVfQU5DSE9SX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLSU+Ci08YSBuYW1lPSI8JT1uYW1lQW5jaG9ySUQlPiIvPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT4KLSAgICA8L3RkPgotICAgIDwlIAotICAgICAgaWYoZWxlbWVudEZyYWdtZW50ICE9IG51bGwgJiYgZWxlbWVudEZyYWdtZW50LmlzTmlsbGFibGUoKSl7Ci0gICAgICAgIGlmKGVsZW1lbnRGcmFnbWVudC5pc05pbCgpKXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgY2hlY2tlZD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9IAotICAgICAgICBlbHNlewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgfQotICAgICU+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlSW5zdGFuY2UoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+LCAnPCU9ZnJhZ0lEJT4nLCAnPCU9bmFtZUFuY2hvcklEJT4nKSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2hlY2tNaW5PY2N1cnNBbmRSZW1vdmVTZWxlY3RlZFJvd3NBdHRyaWJ1dGUoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSU+KSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT10YWJsZUNvbnRhaW5lcklEJT4iPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAicmFuZ2VmcmFndGFibGUiIDogImlubmVycmFuZ2VmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NPTlRFTlQiKSU+PC90aD4KLSAgPC90cj4KLSAgPCUKLSAgSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGZyYWcuZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRGcmFncy5sZW5ndGggfHwgaSA8IHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKTsgaSsrKSB7Ci0gICAgSVhTREZyYWdtZW50IGNoaWxkRnJhZzsKLSAgICBTdHJpbmcgY2hpbGRGcmFnSUQ7Ci0gICAgaWYgKGkgPCBjaGlsZEZyYWdzLmxlbmd0aCkgewotICAgICAgY2hpbGRGcmFnID0gY2hpbGRGcmFnc1tpXTsKLSAgICAgIGNoaWxkRnJhZ0lEID0gY2hpbGRGcmFnLmdldElEKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY2hpbGRGcmFnSUQgPSBmcmFnLmNyZWF0ZUNvbXBsZXhJbnN0YW5jZSgpOwotICAgICAgY2hpbGRGcmFnID0gZnJhZy5nZXRGcmFnbWVudChjaGlsZEZyYWdJRCk7Ci0gICAgfQotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ0lEKTsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+Ci0gICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZVJvd0NoZWNrYm94Q2xpY2soKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1jaGlsZEZyYWdJRCU+Ij4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaGlsZEZyYWcuZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPCUKLSAgCi0gIElYU0RBdHRyaWJ1dGVGcmFnbWVudFtdIGF0dHJpYnV0ZUZyYWdtZW50cyA9IGZyYWcuZ2V0QWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gIElYU0RBdHRyaWJ1dGVGcmFnbWVudCBhdHRyaWJ1dGVGcmFnbWVudDsKLSAgZm9yKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZUZyYWdtZW50cy5sZW5ndGg7IGorKyl7Ci0gICAgYXR0cmlidXRlRnJhZ21lbnQgPSBhdHRyaWJ1dGVGcmFnbWVudHNbal07Ci0gICAgCi0gICAgaWYoYXR0cmlidXRlRnJhZ21lbnQuZ2V0SUQoKS5zdGFydHNXaXRoKGNoaWxkRnJhZ0lEKSl7Ci0gICAgICBJWFNERnJhZ21lbnQgZGVsZWdhdGlvbkZyYWdtZW50ID0gYXR0cmlidXRlRnJhZ21lbnQuZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCk7Ci0gICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICBmcmFnSUQuYXBwZW5kKGRlbGVnYXRpb25GcmFnbWVudC5nZXRJRCgpKTsKLSAgICAgIGF0dHJpYnV0ZS5kZWxldGUoMCwgYXR0cmlidXRlLmxlbmd0aCgpKTsKLSAgICAgIGF0dHJpYnV0ZS5hcHBlbmQoInRydWUiKTsKLSAgICAgICAlPgotICAgICAgCi0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgd2lkdGg9MTA+Ci0gICAgICAgICAgCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1hdHRyaWJ1dGVGcmFnbWVudC5nZXRJRCgpJT4iPgotICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1kZWxlZ2F0aW9uRnJhZ21lbnQuZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgIDwvdHI+Ci0gICAgIDwlCi0gICAgCi0gICAgCi0gICAgfSAgCi0gIH0KLX0KLSU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhTaW1wbGVDb250ZW50Rml4V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4U2ltcGxlQ29udGVudEZpeFdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTYzODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhTaW1wbGVDb250ZW50Rml4V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08JQotLyoqCi0qIDxjb3B5cmlnaHQ+Ci0qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKgotKiA8L2NvcHlyaWdodD4KLSoKLSogRmlsZSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhGaXhXRnJhZ21lbnRKU1AuanNwLCB3c2EuZXRvb2xzLndzLmV4cGxvcmVyLCBsdW5hci01LjEuMiAyCi0qIFZlcnNpb24gMS4yIDA1LzA1LzI2IDE2OjE4OjIzCi0qLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZWxlbWVudElEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYXR0cmlidXRlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTRENvbXBsZXhGcmFnbWVudCBmcmFnID0gKElYU0RDb21wbGV4RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLUlYU0RFbGVtZW50RnJhZ21lbnQgZWxlbWVudEZyYWdtZW50ID0gKElYU0RFbGVtZW50RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGVsZW1lbnRJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT4KLSAgICA8L3RkPgotICAgIAotICAgIDwlIAotICAgICAgaWYoZWxlbWVudEZyYWdtZW50ICE9IG51bGwgJiYgZWxlbWVudEZyYWdtZW50LmlzTmlsbGFibGUoKSl7Ci0gICAgICAgIGlmKGVsZW1lbnRGcmFnbWVudC5pc05pbCgpKXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgY2hlY2tlZD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9IAotICAgICAgICBlbHNlewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJT4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDwlCi0gIAotICAKLSAgCi0gICAgCi0gIElYU0RGcmFnbWVudFtdIGNoaWxkRnJhZ3MgPSBmcmFnLmdldEFsbEZyYWdtZW50cygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsgaSsrKSB7Ci0gICAgSVhTREZyYWdtZW50IGNoaWxkRnJhZzsKLSAgICBTdHJpbmcgY2hpbGRGcmFnSUQ7Ci0gICAgaWYgKGkgPCBjaGlsZEZyYWdzLmxlbmd0aCkgewotICAgICAgY2hpbGRGcmFnID0gY2hpbGRGcmFnc1tpXTsKLSAgICAgIGNoaWxkRnJhZ0lEID0gY2hpbGRGcmFnLmdldElEKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY2hpbGRGcmFnSUQgPSBmcmFnLmNyZWF0ZUNvbXBsZXhJbnN0YW5jZSgpOwotICAgICAgY2hpbGRGcmFnID0gZnJhZy5nZXRGcmFnbWVudChjaGlsZEZyYWdJRCk7Ci0gICAgfQotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ0lEKTsKLSAgICBhdHRyaWJ1dGUuZGVsZXRlKDAsIGF0dHJpYnV0ZS5sZW5ndGgoKSk7Ci0gICAgYXR0cmlidXRlLmFwcGVuZCgiZmFsc2UiKTsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWNoaWxkRnJhZ0lEJT4iPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNoaWxkRnJhZy5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotICA8JQotICAKLSAgCi0gCi0gIElYU0RBdHRyaWJ1dGVGcmFnbWVudFtdIGF0dHJpYnV0ZUZyYWdtZW50cyA9IGZyYWcuZ2V0QWxsQXR0cmlidXRlRnJhZ21lbnRzKCk7Ci0gIElYU0RBdHRyaWJ1dGVGcmFnbWVudCBhdHRyaWJ1dGVGcmFnbWVudDsKLSAgZm9yKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZUZyYWdtZW50cy5sZW5ndGg7IGorKyl7Ci0gICAgYXR0cmlidXRlRnJhZ21lbnQgPSBhdHRyaWJ1dGVGcmFnbWVudHNbal07Ci0gICAgaWYoYXR0cmlidXRlRnJhZ21lbnQuZ2V0SUQoKS5zdGFydHNXaXRoKGNoaWxkRnJhZ0lEKSl7Ci0gICAgSVhTREZyYWdtZW50IGRlbGVnYXRpb25GcmFnbWVudCA9IGF0dHJpYnV0ZUZyYWdtZW50LmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGRlbGVnYXRpb25GcmFnbWVudC5nZXRJRCgpKTsKLSAgICBhdHRyaWJ1dGUuZGVsZXRlKDAsIGF0dHJpYnV0ZS5sZW5ndGgoKSk7Ci0gICAgYXR0cmlidXRlLmFwcGVuZCgidHJ1ZSIpOwotICAgICAgJT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHdpZHRoPTE2PgotICAgICAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWF0dHJpYnV0ZUZyYWdtZW50LmdldElEKCklPiI+Ci0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWRlbGVnYXRpb25GcmFnbWVudC5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwvdGQ+Ci0gICAgIDwvdHI+Ci0gICAgCi0gICAgPCUKLSAgICB9Ci0gIH0gICAgCi19Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhTaW1wbGVDb250ZW50UkZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4U2ltcGxlQ29udGVudFJGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTQ5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhTaW1wbGVDb250ZW50UkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTwlCi0vKioKLSogPGNvcHlyaWdodD4KLSoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qCi0qIDwvY29weXJpZ2h0PgotKgotKiBGaWxlIHBsdWdpbnMvY29tLmlibS5ldG9vbHMud2Vic2VydmljZS5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFJGcmFnbWVudEpTUC5qc3AsIHdzYS5ldG9vbHMud3MuZXhwbG9yZXIsIGx1bmFyLTUuMS4yIDEKLSogVmVyc2lvbiAxLjEgMDMvMDIvMjggMTU6MzM6NTcKLSovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZWxlbWVudElEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYXR0cmlidXRlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RDb21wbGV4RnJhZ21lbnQgZnJhZyA9IChJWFNEQ29tcGxleEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJREJhc2UgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWVCYXNlID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySURCYXNlKS50b1N0cmluZygpOwotSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGZyYWcuZ2V0QWxsRnJhZ21lbnRzKCk7Ci1mb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRnJhZ3MubGVuZ3RoOyBpKyspIHsKLSAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ3NbaV0uZ2V0SUQoKSk7Ci0lPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+JywnPCU9aSArIHR3aXN0SW1hZ2VOYW1lQmFzZSU+JykiPjxpbWcgbmFtZT0iPCU9aSArIHR3aXN0SW1hZ2VOYW1lQmFzZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgIDwlPWZyYWcuZ2V0TmFtZSgpJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPHNwYW4gaWQ9IjwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+Ij4KLSAgPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICAgIDx0cj4KLSAgICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgICAgPGltZyB3aWR0aD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaGlsZEZyYWdzW2ldLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwlCi0KLSAgSVhTREF0dHJpYnV0ZUZyYWdtZW50W10gYXR0cmlidXRlRnJhZ21lbnRzID0gZnJhZy5nZXRBbGxBdHRyaWJ1dGVGcmFnbWVudHMoKTsKLSAgSVhTREF0dHJpYnV0ZUZyYWdtZW50IGF0dHJpYnV0ZUZyYWdtZW50OwotICBmb3IoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlRnJhZ21lbnRzLmxlbmd0aDsgaisrKXsKLSAgICBhdHRyaWJ1dGVGcmFnbWVudCA9IGF0dHJpYnV0ZUZyYWdtZW50c1tqXTsKLSAgICAKLSAgICBpZihhdHRyaWJ1dGVGcmFnbWVudC5nZXRJRCgpLnN0YXJ0c1dpdGgoY2hpbGRGcmFnc1tpXS5nZXRJRCgpKSl7Ci0gICAgICBJWFNERnJhZ21lbnQgZGVsZWdhdGlvbkZyYWdtZW50ID0gYXR0cmlidXRlRnJhZ21lbnQuZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCk7Ci0gICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICBmcmFnSUQuYXBwZW5kKGRlbGVnYXRpb25GcmFnbWVudC5nZXRJRCgpKTsKLSAgICAgIGF0dHJpYnV0ZS5kZWxldGUoMCwgYXR0cmlidXRlLmxlbmd0aCgpKTsKLSAgICAgIGF0dHJpYnV0ZS5hcHBlbmQoInRydWUiKTsKLSAgICAKLSAgICAgIAotICAgICAgJT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHdpZHRoPTE2PgotICAgICAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWF0dHJpYnV0ZUZyYWdtZW50LmdldElEKCklPiI+Ci0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWRlbGVnYXRpb25GcmFnbWVudC5nZXRSZWFkRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPC90ZD4KLSAgICAgPC90cj4KLSAgICA8JQotICAgIAotICAgIAotICAgIH0gIAotICB9Ci19Ci0gICU+Ci0gIAotICA8L3RhYmxlPgotICA8L3NwYW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRSYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFNpbXBsZUNvbnRlbnRSYW5nZVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDJmMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhTaW1wbGVDb250ZW50UmFuZ2VXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTwlCi0vKioKLSogPGNvcHlyaWdodD4KLSoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qCi0qIDwvY29weXJpZ2h0PgotKgotKiBGaWxlIHBsdWdpbnMvY29tLmlibS5ldG9vbHMud2Vic2VydmljZS5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFJhbmdlV0ZyYWdtZW50SlNQLmpzcCwgd3NhLmV0b29scy53cy5leHBsb3JlciwgbHVuYXItNS4xLjIgMgotKiBWZXJzaW9uIDEuMiAwNS8wNS8yNiAxNjoxODoyNAotKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImVsZW1lbnRJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImF0dHJpYnV0ZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RDb21wbGV4RnJhZ21lbnQgZnJhZyA9IChJWFNEQ29tcGxleEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChlbGVtZW50SUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKS50b1N0cmluZygpOwotU3RyaW5nIG5hbWVBbmNob3JJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLk5BTUVfQU5DSE9SX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLSU+Ci08YSBuYW1lPSI8JT1uYW1lQW5jaG9ySUQlPiIvPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT4KLSAgICA8L3RkPgotICAgIDwlIAotICAgICAgaWYoZWxlbWVudEZyYWdtZW50ICE9IG51bGwgJiYgZWxlbWVudEZyYWdtZW50LmlzTmlsbGFibGUoKSl7Ci0gICAgICAgIGlmKGVsZW1lbnRGcmFnbWVudC5pc05pbCgpKXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgY2hlY2tlZD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9IAotICAgICAgICBlbHNlewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgfQotICAgICU+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlSW5zdGFuY2UoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+LCAnPCU9ZnJhZ0lEJT4nLCAnPCU9bmFtZUFuY2hvcklEJT4nKSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2hlY2tNaW5PY2N1cnNBbmRSZW1vdmVTZWxlY3RlZFJvd3NBdHRyaWJ1dGUoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSU+KSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT10YWJsZUNvbnRhaW5lcklEJT4iPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAicmFuZ2VmcmFndGFibGUiIDogImlubmVycmFuZ2VmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NPTlRFTlQiKSU+PC90aD4KLSAgPC90cj4KLSAgPCUKLSAKLSAgSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGZyYWcuZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRGcmFncy5sZW5ndGggfHwgaSA8IHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKTsgaSsrKSB7Ci0gICAgSVhTREZyYWdtZW50IGNoaWxkRnJhZzsKLSAgICBTdHJpbmcgY2hpbGRGcmFnSUQ7Ci0gICAgaWYgKGkgPCBjaGlsZEZyYWdzLmxlbmd0aCkgewotICAgICAgY2hpbGRGcmFnID0gY2hpbGRGcmFnc1tpXTsKLSAgICAgIGNoaWxkRnJhZ0lEID0gY2hpbGRGcmFnLmdldElEKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY2hpbGRGcmFnSUQgPSBmcmFnLmNyZWF0ZUNvbXBsZXhJbnN0YW5jZSgpOwotICAgICAgY2hpbGRGcmFnID0gZnJhZy5nZXRGcmFnbWVudChjaGlsZEZyYWdJRCk7Ci0gICAgfQotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ0lEKTsKLSAgJT4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPgotICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVSb3dDaGVja2JveENsaWNrKCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9Y2hpbGRGcmFnSUQlPiI+Ci0gICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9Y2hpbGRGcmFnLmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIAotICA8JQotICBJWFNEQXR0cmlidXRlRnJhZ21lbnRbXSBhdHRyaWJ1dGVGcmFnbWVudHMgPSBmcmFnLmdldEFsbEF0dHJpYnV0ZUZyYWdtZW50cygpOwotICBJWFNEQXR0cmlidXRlRnJhZ21lbnQgYXR0cmlidXRlRnJhZ21lbnQ7Ci0gIGZvcihpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVGcmFnbWVudHMubGVuZ3RoOyBqKyspewotICAgIGF0dHJpYnV0ZUZyYWdtZW50ID0gYXR0cmlidXRlRnJhZ21lbnRzW2pdOwotICAgIAotICAgIGlmKGF0dHJpYnV0ZUZyYWdtZW50LmdldElEKCkuc3RhcnRzV2l0aChjaGlsZEZyYWdJRCkpewotICAgICAgSVhTREZyYWdtZW50IGRlbGVnYXRpb25GcmFnbWVudCA9IGF0dHJpYnV0ZUZyYWdtZW50LmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgICAgZnJhZ0lELmFwcGVuZChkZWxlZ2F0aW9uRnJhZ21lbnQuZ2V0SUQoKSk7Ci0gICAgICBhdHRyaWJ1dGUuZGVsZXRlKDAsIGF0dHJpYnV0ZS5sZW5ndGgoKSk7Ci0gICAgICBhdHRyaWJ1dGUuYXBwZW5kKCJ0cnVlIik7Ci0gICAgICAgJT4KLSAgICAgIAotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIHdpZHRoPTEwPgotICAgICAgICAgIAotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9YXR0cmlidXRlRnJhZ21lbnQuZ2V0SUQoKSU+Ij4KLSAgICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9ZGVsZWdhdGlvbkZyYWdtZW50LmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICA8L3RkPgotICAgICA8L3RyPgotICAgICA8JQotICAgIAotICAgIAotICAgIH0gIAotICB9Ci19Ci0lPgotPC90YWJsZT4KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4YWQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZUxpc3QiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0ic2Vzc2lvbklEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUhCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfTEFORyA9ICJ4bWw6bGFuZyI7Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9YTUxOU19MQU5HID0gImVuLVVTIjsKLSU+Ci0KLTwlCi1IdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklELnRvU3RyaW5nKCkpOwotQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRENvbXBvbmVudCB4c2RDb21wb25lbnQgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCkuZ2V0WFNEQ29tcG9uZW50KCk7Ci1YU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSBudWxsOwotRUxpc3QgYXBwSW5mb0xpc3QgPSBudWxsOwotRUxpc3QgZG9jTGlzdCA9IG51bGw7Ci1pZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gIGFubm90YXRpb24gPSAoKFhTRFR5cGVEZWZpbml0aW9uKXhzZENvbXBvbmVudCkuZ2V0QW5ub3RhdGlvbigpOwotZWxzZSBpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICBhbm5vdGF0aW9uID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24peHNkQ29tcG9uZW50KS5nZXRBbm5vdGF0aW9uKCk7Ci1pZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gIGFwcEluZm9MaXN0ID0gYW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCk7Ci0gIGRvY0xpc3QgPSBhbm5vdGF0aW9uLmdldFVzZXJJbmZvcm1hdGlvbigpOwotfQotU3RyaW5nIGFwcEluZm9Db250YWluZXJJRCA9ICI6OmFwcEluZm8iOwotU3RyaW5nIHhhcHBJbmZvQ29udGFpbmVySUQgPSAieDo6YXBwSW5mbyI7Ci1TdHJpbmcgZG9jdW1lbnRhdGlvbkNvbnRhaW5lcklEID0gIjo6ZG9jdW1lbnRhdGlvbiI7Ci1TdHJpbmcgeGRvY3VtZW50YXRpb25Db250YWluZXJJRCA9ICJ4Ojpkb2N1bWVudGF0aW9uIjsKLSU+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiB0d2lzdCh0YWJsZUNvbnRhaW5lcklkLHR3aXN0SW1hZ2VOYW1lKQotICB7Ci0gICAgdmFyIHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHR3aXN0SW1hZ2UgPSBkb2N1bWVudC5pbWFnZXNbdHdpc3RJbWFnZU5hbWVdOwotICAgIGlmICh0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09ICJub25lIikKLSAgICB7Ci0gICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgICB0d2lzdEltYWdlLnNyYyA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiI7Ci0gICAgICB0d2lzdEltYWdlLmFsdCA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIikpJT4iOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgIHR3aXN0SW1hZ2Uuc3JjID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IjsKLSAgICAgIHR3aXN0SW1hZ2UuYWx0ID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSklPiI7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gdHdpc3RDbG9zZSh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlQ29udGFpbmVySWQpLnN0eWxlLmRpc3BsYXkgPT0gIiIpCi0gICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklkLCJ4Iit0YWJsZUNvbnRhaW5lcklkKTsKLSAgfQotPC9zY3JpcHQ+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9YXBwSW5mb0NvbnRhaW5lcklEJT4nLCc8JT14YXBwSW5mb0NvbnRhaW5lcklEJT4nKSI+PGltZyBuYW1lPSI8JT14YXBwSW5mb0NvbnRhaW5lcklEJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICA8c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1hTRF9BUFBMSUNBVElPTl9JTkZPUk1BVElPTiIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT1hcHBJbmZvQ29udGFpbmVySUQlPiI+Ci08dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MQU5HVUFHRSIpJT48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9YU0RfQVBQTElDQVRJT05fSU5GT1JNQVRJT04iKSU+PC90aD4KLSAgPC90cj4KLSAgPCUKLSAgYm9vbGVhbiBvcGVuQXBwSW5mb1RhYmxlID0gZmFsc2U7Ci0gIGlmIChhcHBJbmZvTGlzdCAhPSBudWxsKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBJbmZvTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgRWxlbWVudCBlID0gKEVsZW1lbnQpYXBwSW5mb0xpc3QuZ2V0KGkpOwotICAgICAgU3RyaW5nIGFwcEluZm9MYW5nID0gZS5nZXRBdHRyaWJ1dGUoWE1MTlNfTEFORyk7Ci0gICAgICBTdHJpbmcgYXBwSW5mb1RleHQgPSBudWxsOwotICAgICAgTm9kZUxpc3QgbmwgPSBlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbmwuZ2V0TGVuZ3RoKCk7IGorKykgewotICAgICAgICBpZiAobmwuaXRlbShqKS5nZXROb2RlVHlwZSgpID09IG9yZy53M2MuZG9tLk5vZGUuVEVYVF9OT0RFKSB7Ci0gICAgICAgICAgYXBwSW5mb1RleHQgPSBubC5pdGVtKGopLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoYXBwSW5mb1RleHQgIT0gbnVsbCkKLSAgICAgIHsgCi0gICAgICAgIG9wZW5BcHBJbmZvVGFibGUgPSB0cnVlOwotICAgICAgICBpZiAoYXBwSW5mb1RleHQudHJpbSgpLmxlbmd0aCgpIDwgMSkKLSAgICAgICAgICBhcHBJbmZvVGV4dCA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiVEFCTEVfQkxBTktfUExBQ0VIT0xERVIiKTsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PCU9KChhcHBJbmZvTGFuZyAhPSBudWxsICYmIGFwcEluZm9MYW5nLmxlbmd0aCgpID4gMCkgPyBhcHBJbmZvTGFuZyA6IERFRkFVTFRfWE1MTlNfTEFORyklPjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT1hcHBJbmZvVGV4dCU+PC90ZD4KLSAgPC90cj4KLSAgPCUKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgJT4KLTwvdGFibGU+Ci08L3NwYW4+Ci08JQotaWYgKCFvcGVuQXBwSW5mb1RhYmxlKSB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHR3aXN0Q2xvc2UoJzwlPWFwcEluZm9Db250YWluZXJJRCU+Jyk7Ci08L3NjcmlwdD4KLTwlCi19Ci0lPgotCi08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRvY3VtZW50YXRpb25Db250YWluZXJJRCU+JywnPCU9eGRvY3VtZW50YXRpb25Db250YWluZXJJRCU+JykiPjxpbWcgbmFtZT0iPCU9eGRvY3VtZW50YXRpb25Db250YWluZXJJRCU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgPHN0cm9uZz48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9YU0RfRE9DVU1FTlRBVElPTiIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT1kb2N1bWVudGF0aW9uQ29udGFpbmVySUQlPiI+Ci08dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MQU5HVUFHRSIpJT48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9YU0RfRE9DVU1FTlRBVElPTiIpJT48L3RoPgotICA8L3RyPgotICA8JQotICBib29sZWFuIG9wZW5Eb2NUYWJsZSA9IGZhbHNlOwotICBpZiAoZG9jTGlzdCAhPSBudWxsKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICBFbGVtZW50IGUgPSAoRWxlbWVudClkb2NMaXN0LmdldChpKTsKLSAgICAgIFN0cmluZyBkb2NMYW5nID0gZS5nZXRBdHRyaWJ1dGUoWE1MTlNfTEFORyk7Ci0gICAgICBTdHJpbmcgZG9jVGV4dCA9IG51bGw7Ci0gICAgICBOb2RlTGlzdCBubCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBubC5nZXRMZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgIGlmIChubC5pdGVtKGopLmdldE5vZGVUeXBlKCkgPT0gb3JnLnczYy5kb20uTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICBkb2NUZXh0ID0gbmwuaXRlbShqKS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAgICAgIAotICAgICAgaWYgKGRvY1RleHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3BlbkRvY1RhYmxlID0gdHJ1ZTsKLSAgICAgICAgaWYgKGRvY1RleHQudHJpbSgpLmxlbmd0aCgpIDwgMSkKLSAgICAgICAgICBkb2NUZXh0ID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJUQUJMRV9CTEFOS19QTEFDRUhPTERFUiIpOwotICAlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT0oKGRvY0xhbmcgIT0gbnVsbCAmJiBkb2NMYW5nLmxlbmd0aCgpID4gMCkgPyBkb2NMYW5nIDogREVGQVVMVF9YTUxOU19MQU5HKSU+PC90ZD4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjwlPWRvY1RleHQlPjwvdGQ+Ci0gIDwvdHI+Ci0gIDwlCi0gICAgICB9Ci0gICAgfQotICB9Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgotPCUKLWlmICghb3BlbkRvY1RhYmxlKSB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHR3aXN0Q2xvc2UoJzwlPWRvY3VtZW50YXRpb25Db250YWluZXJJRCU+Jyk7Ci08L3NjcmlwdD4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzljOWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0UkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIyICAgMTI3NDQzIGplc3BlckBzZWxza2FiZXQub3JnIC0gSmVzcGVyIFMgTW9sbGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnJwYy5OYW1lc3BhY2VDb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5IYXNodGFibGUiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIG9wZXJOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClvcGVyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotLy8gVE9ETzogUmVwbGFjZSAiU09BUC1FTlYiIGJ5IE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFICg9InNvYXBlbnYiKQotc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KE5hbWVzcGFjZUNvbnN0YW50cy5OU1VSSV9TT0FQX0VOVkVMT1BFLCJTT0FQLUVOViIpOwotc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KE5hbWVzcGFjZUNvbnN0YW50cy5OU1VSSV9TQ0hFTUFfWFNJLE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TQ0hFTUFfWFNJKTsKLXNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChOYW1lc3BhY2VDb25zdGFudHMuTlNVUklfU0NIRU1BX1hTRCxOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU0NIRU1BX1hTRCk7Ci1FbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBmcmFnLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyghb3BlckVsZW1lbnQuaXNVc2VMaXRlcmFsKCksIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLCBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKSk7Ci1TdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci1mb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gIGlmIChpbnN0YW5jZURvY3VtZW50c1tpXSA9PSBudWxsKQotICAgIGNvbnRpbnVlOwotICBzYi5hcHBlbmQoWE1MVXRpbHMuc2VyaWFsaXplKGluc3RhbmNlRG9jdW1lbnRzW2ldLCB0cnVlKSk7Ci0gIHNiLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotfQotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGxhYmVsIGZvcj0iPCU9ZnJhZy5nZXRJRCgpJT4iPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2xhYmVsPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPHRleHRhcmVhIGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJ0ZXh0YXJlYWVudGVyIiByZWFkb25seT48JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHNiLnRvU3RyaW5nKCkpJT48L3RleHRhcmVhPgotPCUKLSAgICAgIC8qCi0gICAgICBTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgdXJsLmFwcGVuZChyZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRYTUwuanNwPyIpKSk7Ci0gICAgICB1cmwuYXBwZW5kKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpLmFwcGVuZCgiPSIpLmFwcGVuZChmcmFnSUQpLmFwcGVuZCgiJiIpOwotICAgICAgdXJsLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoIj0iKS5hcHBlbmQobm9kZUlEKS5hcHBlbmQoIiYiKTsKLSAgICAgIHVybC5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCI9IikuYXBwZW5kKHNlc3Npb24uZ2V0SWQoKSk7Ci0gICAgICAqLwotJT4KLSAgICAgIDwhLS0KLSAgICAgIDxpZnJhbWUgc3JjPSIiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjE1MHB4Ij48L2lmcmFtZT4KLSAgICAgIC0tPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRYTUwuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRYTUwuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUwMzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0UkZyYWdtZW50WE1MLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMiAgIDEyNzQ0MyBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQveG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy54bWwuc2F4LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy54bWwuc2F4LmhlbHBlcnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnJwYy5OYW1lc3BhY2VDb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci08JQotU3RyaW5nIGZyYWdJRCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpOwotU3RyaW5nIG5vZGVJRCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpOwotU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci1Db250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotLy8gVE9ETzogUmVwbGFjZSAiU09BUC1FTlYiIGJ5IE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFICg9InNvYXBlbnYiKQotc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KE5hbWVzcGFjZUNvbnN0YW50cy5OU1VSSV9TT0FQX0VOVkVMT1BFLCJTT0FQLUVOViIpOwotc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KE5hbWVzcGFjZUNvbnN0YW50cy5OU1VSSV9TQ0hFTUFfWFNJLE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TQ0hFTUFfWFNJKTsKLXNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChOYW1lc3BhY2VDb25zdGFudHMuTlNVUklfU0NIRU1BX1hTRCxOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU0NIRU1BX1hTRCk7Ci1FbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFswXTsKLVN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci10cnkKLXsKLSAgaW5zdGFuY2VEb2N1bWVudHMgPSBmcmFnLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyghb3BlckVsZW1lbnQuaXNVc2VMaXRlcmFsKCksIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLCBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKSk7Ci0gIGlmIChpbnN0YW5jZURvY3VtZW50cy5sZW5ndGggPT0gMSkKLSAgewotICAgIGJ5dGVbXSBiID0gWE1MVXRpbHMuc2VyaWFsaXplKGluc3RhbmNlRG9jdW1lbnRzWzBdLCB0cnVlKS5nZXRCeXRlcyhIVE1MVXRpbHMuVVRGOF9FTkNPRElORyk7Ci0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKTsKLSAgICBTQVhQYXJzZXJGYWN0b3J5IHNheEZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgc2F4RmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOwotICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgIHNheFBhcnNlci5wYXJzZShiYWlzLAotICAgICAgbmV3IERlZmF1bHRIYW5kbGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICBiYWlzLmNsb3NlKCk7Ci0gICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG5ldyBTdHJpbmcoYikpOwotICB9Ci19Ci1jYXRjaCAoVGhyb3dhYmxlIHQpCi17Ci19Ci1pZiAoc2IgPT0gbnVsbCkKLXsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mcmFnLmdldE5hbWUoKSU+PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzW2ldID09IG51bGwpCi0gICAgICBjb250aW51ZTsKLSAgICBzYi5hcHBlbmQoSFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllc1N0cmljdChYTUxVdGlscy5zZXJpYWxpemUoaW5zdGFuY2VEb2N1bWVudHNbaV0sIHRydWUpKSk7Ci0gIH0KLSU+Ci08JT1zYi50b1N0cmluZygpJT4KLTwvYm9keT4KLTwvaHRtbD4KLTwlCi19Ci1lbHNlCi17Ci0lPgotPCU9c2IudG9TdHJpbmcoKSU+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0V0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4NTIwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMiAgIDEyNzQ0MyBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImVsZW1lbnRJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLUlYU0RFbGVtZW50RnJhZ21lbnQgZWxlbWVudEZyYWdtZW50ID0gKElYU0RFbGVtZW50RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGVsZW1lbnRJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyBwYXJhbSA9IGZyYWcuZ2V0UGFyYW1ldGVyVmFsdWUoZnJhZy5nZXRJRCgpLCAwKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxsYWJlbCBmb3I9IjwlPWZyYWcuZ2V0SUQoKSU+Ij48YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT48L2xhYmVsPgotICAgIDwvdGQ+Ci0gICAgPCUgCi0gICAgICBpZihlbGVtZW50RnJhZ21lbnQgIT0gbnVsbCAmJiBlbGVtZW50RnJhZ21lbnQuaXNOaWxsYWJsZSgpKXsKLSAgICAgICAgaWYoZWxlbWVudEZyYWdtZW50LmlzTmlsKCkpewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiBjaGVja2VkPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0gCi0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iID48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgJT4KLSAgICA8dGQ+Ci0gICAgICA8JQotICAgICAgaWYgKCFmcmFnLnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkpIHsKLSAgICAgICU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICA8JQotICAgICAgfQotICAgICAgJT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8dGV4dGFyZWEgaWQ9IjwlPWZyYWcuZ2V0SUQoKSU+IiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgY2xhc3M9InRleHRhcmVhZW50ZXIiPjwlPSgocGFyYW0gIT0gbnVsbCkgPyBIVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHBhcmFtKSA6ICIiKSU+PC90ZXh0YXJlYT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWxlZ2F0aW9uUkZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWxlZ2F0aW9uUkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5MzFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvblJGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0REZWxlZ2F0aW9uRnJhZ21lbnQgd3JhcHBlckZyYWdtZW50ID0gKElYU0REZWxlZ2F0aW9uRnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLUlYU0RGcmFnbWVudCBkZWxlZ2F0aW9uRnJhZ21lbnQgPSB3cmFwcGVyRnJhZ21lbnQuZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSB3cmFwcGVyRnJhZ21lbnQuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLWZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLWZyYWdJRC5hcHBlbmQoZGVsZWdhdGlvbkZyYWdtZW50LmdldElEKCkpOwotJT4KLTx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1kZWxlZ2F0aW9uRnJhZ21lbnQuZ2V0UmVhZEZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWxlZ2F0aW9uV0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWxlZ2F0aW9uV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0NjA3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvbldGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTRERlbGVnYXRpb25GcmFnbWVudCB3cmFwcGVyRnJhZ21lbnQgPSAoSVhTRERlbGVnYXRpb25GcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotSVhTREZyYWdtZW50IGRlbGVnYXRpb25GcmFnbWVudCA9IHdyYXBwZXJGcmFnbWVudC5nZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IHdyYXBwZXJGcmFnbWVudC5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotZnJhZ0lELmFwcGVuZChkZWxlZ2F0aW9uRnJhZ21lbnQuZ2V0SUQoKSk7Ci0lPgotPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWRlbGVnYXRpb25GcmFnbWVudC5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RFbGVtZW50UkZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RFbGVtZW50UkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjMjYyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERWxlbWVudFJGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08JQotLyoqCi0qIDxjb3B5cmlnaHQ+Ci0qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKgotKiA8L2NvcHlyaWdodD4KLSoKLSogRmlsZSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlbGVnYXRpb25XRnJhZ21lbnRKU1AuanNwLCB3c2EuZXRvb2xzLndzLmV4cGxvcmVyLCBsdW5hci01LjEuMiwgMjAwMzEyMzFhIDEKLSogVmVyc2lvbiAxLjEgMDMvMDIvMjggMTU6MzQ6MDQKLSovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJlbGVtZW50SUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERnJhZ21lbnQgZGVsZWdhdGlvbkZyYWdtZW50ID0gZWxlbWVudEZyYWdtZW50LmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZWxlbWVudEZyYWdtZW50LmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1mcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci1mcmFnSUQuYXBwZW5kKGRlbGVnYXRpb25GcmFnbWVudC5nZXRJRCgpKTsKLWVsZW1lbnRJRC5kZWxldGUoMCwgZWxlbWVudElELmxlbmd0aCgpKTsKLWVsZW1lbnRJRC5hcHBlbmQoZWxlbWVudEZyYWdtZW50LmdldElEKCkpOwotJT4KLQotIAotCi08dGFibGUgIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KCJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWRlbGVnYXRpb25GcmFnbWVudC5nZXRSZWFkRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi0gCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RFbGVtZW50V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RFbGVtZW50V0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2NGRkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERWxlbWVudFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08JQotLyoqCi0qIDxjb3B5cmlnaHQ+Ci0qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKgotKiA8L2NvcHlyaWdodD4KLSoKLSogRmlsZSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlbGVnYXRpb25XRnJhZ21lbnRKU1AuanNwLCB3c2EuZXRvb2xzLndzLmV4cGxvcmVyLCBsdW5hci01LjEuMiwgMjAwMzEyMzFhIDEKLSogVmVyc2lvbiAxLjEgMDMvMDIvMjggMTU6MzQ6MDQKLSovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJlbGVtZW50SUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERnJhZ21lbnQgZGVsZWdhdGlvbkZyYWdtZW50ID0gZWxlbWVudEZyYWdtZW50LmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZWxlbWVudEZyYWdtZW50LmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1mcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci1mcmFnSUQuYXBwZW5kKGRlbGVnYXRpb25GcmFnbWVudC5nZXRJRCgpKTsKLWVsZW1lbnRJRC5kZWxldGUoMCwgZWxlbWVudElELmxlbmd0aCgpKTsKLWVsZW1lbnRJRC5hcHBlbmQoZWxlbWVudEZyYWdtZW50LmdldElEKCkpOwotJT4KLQotIAotCi08dGFibGUgIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KCJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWRlbGVnYXRpb25GcmFnbWVudC5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotIAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERW1wdHlSRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREVtcHR5UkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzY2VlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERW1wdHlSRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREVtcHR5V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RFbXB0eVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTQ5NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREVtcHR5V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1pbnQgbWluT2NjdXJzID0geHNkQ29uZmlnLmdldE1pbk9jY3VycygpOwotaW50IG1heE9jY3VycyA9IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsKLWlmIChtaW5PY2N1cnMgPT0gbWF4T2NjdXJzKSB7Ci0lPgotPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1tYXhPY2N1cnMlPiIvPgotPCUKLX0gZWxzZSB7Ci0gIFN0cmluZ1tdIHBhcmFtcyA9IGZyYWcuZ2V0UGFyYW1ldGVyVmFsdWVzKGZyYWcuZ2V0SUQoKSk7Ci0lPgotICA8dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8bGFiZWwgZm9yPSI8JT1mcmFnLmdldElEKCklPiI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfT0NDVVJBTkNFIiklPiZuYnNwOzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlblhTREluZm9EaWFsb2coJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb24uZ2V0SWQoKSxzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksZnJhZ0lELnRvU3RyaW5nKCkpKSklPicpIj48JT1mcmFnLmdldE5hbWUoKSU+PC9hPjwvbGFiZWw+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgPCUKLSAgICAgIGlmIChtYXhPY2N1cnMgIT0gRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEKSB7Ci0gICAgICAlPgotICAgICAgICA8c2VsZWN0IGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgPCUKLSAgICAgICAgZm9yIChpbnQgaSA9IG1pbk9jY3VyczsgaSA8PSBtYXhPY2N1cnM7IGkrKykgewotICAgICAgICAlPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPWklPiIgPCUgaWYgKHBhcmFtcyAhPSBudWxsICYmIGkgPT0gcGFyYW1zLmxlbmd0aCkgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT1pJT4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwlCi0gICAgICB9IGVsc2UgewotICAgICAgJT4KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT0oKHBhcmFtcyAhPSBudWxsKSA/IFN0cmluZy52YWx1ZU9mKHBhcmFtcy5sZW5ndGgpIDogIiIpJT4iIGNsYXNzPSJ0YWJsZXRleHRlbnRlciI+Ci0gICAgICA8JQotICAgICAgICBpZiAoIWZyYWcudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKSkgewotICAgICAgICAlPgotICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cEFsbFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBBbGxXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkwMjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cEFsbFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNER3JvdXBBbGxGcmFnbWVudCBmcmFnID0gKElYU0RHcm91cEFsbEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1ib29sZWFuIGVuYWJsZUdyb3VwID0gKHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSA+IDAgfHwgZnJhZy5nZXRHcm91cElEcygpLmxlbmd0aCA+IDApOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJRCkudG9TdHJpbmcoKTsKLVN0cmluZyBncm91cElEID0gZnJhZy5nZXRHcm91cEFsbEluc3RhbmNlKCk7Ci1TdHJpbmcgZ3JvdXBDaGVja2JveElEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuWFNEX0FMTF9HUk9VUF9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgZ3JvdXBNZW1iZXJSYWRpb0lEID0gKG5ldyBTdHJpbmdCdWZmZXIoZ3JvdXBDaGVja2JveElEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gaW5pdEdyb3VwQWxsKHRhYmxlQ29udGFpbmVySUQsIHR3aXN0SW1hZ2VOYW1lLCBmcmFnSUQsIGdyb3VwSUQsIGdyb3VwQ2hlY2tib3hJRCwgZW5hYmxlKSB7Ci0gICAgdmFyIGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ3JvdXBDaGVja2JveElEKTsKLSAgICBjaGVja2JveC5jaGVja2VkID0gZW5hYmxlOwotICAgIGVuYWJsZUdyb3VwQWxsKHRhYmxlQ29udGFpbmVySUQsIHR3aXN0SW1hZ2VOYW1lLCBmcmFnSUQsIGdyb3VwSUQsIGNoZWNrYm94KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGVuYWJsZUdyb3VwQWxsKHRhYmxlQ29udGFpbmVySUQsIHR3aXN0SW1hZ2VOYW1lLCBmcmFnSUQsIGdyb3VwSUQsIGNoZWNrYm94KSB7Ci0gICAgdmFyIHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIGNoZWNrYm94VGFibGUgPSBjaGVja2JveC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKLSAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkgewotICAgICAgaWYgKHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKQotICAgICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklELCB0d2lzdEltYWdlTmFtZSk7Ci0gICAgICBjaGVja2JveC5uYW1lID0gZnJhZ0lEOwotICAgICAgY2hlY2tib3gudmFsdWUgPSBncm91cElEOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmICh0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09ICIiKQotICAgICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklELCB0d2lzdEltYWdlTmFtZSk7Ci0gICAgICBjaGVja2JveC5uYW1lID0gIiI7Ci0gICAgICBjaGVja2JveC52YWx1ZSA9ICIiOwotICAgIH0KLSAgICB2YXIgdGRzID0gY2hlY2tib3hUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY2hlY2tib3hDZWxsSW5kZXggPSBjaGVja2JveC5wYXJlbnROb2RlLmNlbGxJbmRleDsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRkcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKGkgPT0gY2hlY2tib3hDZWxsSW5kZXggfHwgY2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgdGRzLml0ZW0oaSkuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgZWxzZQotICAgICAgICB0ZHMuaXRlbShpKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIGdyb3VwQWxsT3JkZXJpbmdNb3ZlVXAodGFibGVDb250YWluZXJJRCkgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIGlmICh0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10uY2VsbHNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKS5jaGVja2VkKSB7Ci0gICAgICBhbGVydCgnPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTU9WRV9GSVJTVF9FTEVNRU5UX1VQIiklPicpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKHZhciBpID0gbnVtYmVyT2ZIZWFkZXJSb3dzICsgMTsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmICh0YWJsZS5yb3dzW2ldLmNlbGxzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCkuY2hlY2tlZCkgewotICAgICAgICBzd2FwUm93cyh0YWJsZSwgaS0xLCBpKTsKLSAgICAgICAgdGFibGUucm93c1tpLTFdLmNlbGxzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCkuY2hlY2tlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgYWxlcnQoJzwlPWNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQiKSU+Jyk7Ci0gIH0KLQotICBmdW5jdGlvbiBncm91cEFsbE9yZGVyaW5nTW92ZURvd24odGFibGVDb250YWluZXJJRCkgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIGlmICh0YWJsZS5yb3dzW3RhYmxlLnJvd3MubGVuZ3RoIC0gMV0uY2VsbHNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKS5jaGVja2VkKSB7Ci0gICAgICBhbGVydCgnPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTU9WRV9MQVNUX0VMRU1FTlRfRE9XTiIpJT4nKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yICh2YXIgaSA9IG51bWJlck9mSGVhZGVyUm93czsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoIC0gMTsgaSsrKSB7Ci0gICAgICBpZiAodGFibGUucm93c1tpXS5jZWxsc1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApLmNoZWNrZWQpIHsKLSAgICAgICAgc3dhcFJvd3ModGFibGUsIGksIGkrMSk7Ci0gICAgICAgIHRhYmxlLnJvd3NbaSsxXS5jZWxsc1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApLmNoZWNrZWQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGFsZXJ0KCc8JT1jb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPicpOwotICB9Ci0KLSAgPCUKLSAgLy8gcm93SW5kZXgxIG11c3QgYmUgc21hbGxlciB0aGFuIHJvd0luZGV4MiBpbiBvcmRlciB0byB3b3JrCi0gICU+Ci0gIGZ1bmN0aW9uIHN3YXBSb3dzKHRhYmxlLCByb3dJbmRleDEsIHJvd0luZGV4MikgewotICAgIHZhciByb3cxQ2hpbGROb2RlcyA9IGNsb25lQXJyYXkodGFibGUucm93c1tyb3dJbmRleDFdLmNoaWxkTm9kZXMpOwotICAgIHZhciByb3cyQ2hpbGROb2RlcyA9IGNsb25lQXJyYXkodGFibGUucm93c1tyb3dJbmRleDJdLmNoaWxkTm9kZXMpOwotICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleDIpOwotICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleDEpOwotICAgIHZhciByb3cxID0gdGFibGUuaW5zZXJ0Um93KHJvd0luZGV4MSk7Ci0gICAgdmFyIHJvdzIgPSB0YWJsZS5pbnNlcnRSb3cocm93SW5kZXgyKTsKLSAgICBhcHBlbmRUb1Jvdyhyb3cxLCByb3cyQ2hpbGROb2Rlcyk7Ci0gICAgYXBwZW5kVG9Sb3cocm93Miwgcm93MUNoaWxkTm9kZXMpOwotICB9Ci0KLSAgZnVuY3Rpb24gY2xvbmVBcnJheShvbGRBcnJheSkgewotICAgIHZhciBhcnJheUNsb25lID0gbmV3IEFycmF5KCk7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgYXJyYXlDbG9uZVtpXSA9IG9sZEFycmF5W2ldLmNsb25lTm9kZSh0cnVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5Q2xvbmU7Ci0gIH0KLQotICBmdW5jdGlvbiBhcHBlbmRUb1Jvdyhyb3csIG5vZGVzQXJyYXkpIHsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgIHJvdy5hcHBlbmRDaGlsZChub2Rlc0FycmF5W2ldKTsKLSAgICB9Ci0gIH0KLTwvc2NyaXB0PgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDwlCi0gICAgaWYgKHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSA+IDApIHsKLSAgICAlPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9Z3JvdXBJRCU+Ij4KLSAgICA8JQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAlPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSI8JT1ncm91cENoZWNrYm94SUQlPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1ncm91cElEJT4iIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0VOQUJMRV9ESVNBQkxFX0dST1VQIiklPiIgb25DbGljaz0iamF2YXNjcmlwdDplbmFibGVHcm91cEFsbCgnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPXR3aXN0SW1hZ2VOYW1lJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCAnPCU9Z3JvdXBJRCU+JywgdGhpcykiIGNoZWNrZWQ+PGxhYmVsIGZvcj0iPCU9Z3JvdXBDaGVja2JveElEJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0VOQUJMRV9ESVNBQkxFX0dST1VQIiklPjwvbGFiZWw+Ci0gICAgPC90ZD4KLSAgICA8JQotICAgIH0KLSAgICAlPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Omdyb3VwQWxsT3JkZXJpbmdNb3ZlVXAoJzwlPXRhYmxlQ29udGFpbmVySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9VUCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpncm91cEFsbE9yZGVyaW5nTW92ZURvd24oJzwlPXRhYmxlQ29udGFpbmVySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9ET1dOIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiB3aWR0aD0xMD48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0VMRU1FTlRTIiklPjwvdGg+Ci0gIDwvdHI+Ci0gIDwlCi0gIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGdyb3VwTWVtYmVyRnJhZ21lbnRzW2ldLmdldElEKCkpOwotICAlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1ncm91cE1lbWJlclJhZGlvSUQlPiIgdmFsdWU9IjwlPWZyYWdJRC50b1N0cmluZygpJT4iIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9FTEVNRU5UX0lOX0dST1VQIiklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWdyb3VwSUQlPiIgdmFsdWU9IjwlPWZyYWdJRC50b1N0cmluZygpJT4iPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWdyb3VwTWVtYmVyRnJhZ21lbnRzW2ldLmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+Ci08L3NwYW4+Ci08JQotaWYgKCFlbmFibGVHcm91cCkgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgaW5pdEdyb3VwQWxsKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9dHdpc3RJbWFnZU5hbWUlPicsICc8JT1mcmFnLmdldElEKCklPicsICc8JT1ncm91cElEJT4nLCAnPCU9Z3JvdXBDaGVja2JveElEJT4nLCA8JT1lbmFibGVHcm91cCU+KTsKLSAgPC9zY3JpcHQ+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZUZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBDaG9pY2VGaXhXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzIzZGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZUZpeFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gY2hvb3NlKHNlbGVjdCkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciB0YWJsZUNvbnRhaW5lcklEID0gJzwlPUZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEJT4nOwotICAgICAgdGFibGVDb250YWluZXJJRCArPSBzZWxlY3Qub3B0aW9ucyhpKS52YWx1ZTsKLSAgICAgIHNob3dUYWJsZSh0YWJsZUNvbnRhaW5lcklELCBzZWxlY3Qub3B0aW9ucyhpKS5zZWxlY3RlZCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1RhYmxlKHRhYmxlQ29udGFpbmVySUQsIHNob3cpIHsKLSAgICB2YXIgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICBpZiAoc2hvdykKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICBlbHNlCi0gICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICB9Ci08L3NjcmlwdD4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREdyb3VwQ2hvaWNlRnJhZ21lbnQgZnJhZyA9IChJWFNER3JvdXBDaG9pY2VGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotJT4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ0hPSUNFUyIpJT48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRUxFTUVOVFMiKSU+PC90aD4KLSAgPC90cj4KLTwlCi0gIFhTRFBhcnRpY2xlW10gY2hvaWNlcyA9IGZyYWcuZ2V0Q2hvaWNlcygpOwotICBTdHJpbmdbXSBncm91cElEcyA9IGZyYWcuZ2V0R3JvdXBJRHMoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RDb25maWcuZ2V0TWF4T2NjdXJzKCk7IGkrKykgewotICAgIFN0cmluZyBncm91cElEOwotICAgIGludCBjaG9pY2VJbmRleDsKLSAgICBpZiAoaSA8IGdyb3VwSURzLmxlbmd0aCkgewotICAgICAgZ3JvdXBJRCA9IGdyb3VwSURzW2ldOwotICAgICAgY2hvaWNlSW5kZXggPSBmcmFnLmdldENob2ljZUluZGV4KGdyb3VwSUQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGdyb3VwSUQgPSBmcmFnLmNyZWF0ZUdyb3VwQ2hvaWNlSW5zdGFuY2UoMCk7Ci0gICAgICBjaG9pY2VJbmRleCA9IDA7Ci0gICAgfQotICAgIElYU0RGcmFnbWVudFtdIGNob2ljZUZyYWdzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSU+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1ncm91cElEJT4iPgotICAgICAgICA8c2VsZWN0IGlkPSI8JT1ncm91cElEJT4iIG5hbWU9IjwlPWdyb3VwSUQlPiIgb25DaGFuZ2U9ImphdmFzY3JpcHQ6Y2hvb3NlKHRoaXMpIiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQ0hPSUNFUyIpJT4iPgotPCUKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNob2ljZUZyYWdzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICBYU0RDb21wb25lbnQgeHNkQ29tcG9uZW50ID0gY2hvaWNlRnJhZ3Nbal0uZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgICAgICAgICBpZih4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgICAgICAgIG5hbWUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbil4c2RDb21wb25lbnQpLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIG5hbWUgPSB4c2RDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldFRhZ05hbWUoKTsgIAotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChqID09IGNob2ljZUluZGV4KSB7Ci0lPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1jaG9pY2VGcmFnc1tqXS5nZXRJRCgpJT4iIHNlbGVjdGVkPjwlPW5hbWUlPgotPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotJT4KLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9Y2hvaWNlRnJhZ3Nbal0uZ2V0SUQoKSU+Ij48JT1uYW1lJT4KLTwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotJT4KLSAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLTwlCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hvaWNlRnJhZ3MubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICAgICAgZnJhZ0lELmFwcGVuZChjaG9pY2VGcmFnc1tqXS5nZXRJRCgpKTsKLSAgICAgICAgICBTdHJpbmcgY2hvaWNlRnJhZ1RhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChjaG9pY2VGcmFnc1tqXS5nZXRJRCgpKS50b1N0cmluZygpOwotJT4KLSAgICAgICAgICA8c3BhbiBpZD0iPCU9Y2hvaWNlRnJhZ1RhYmxlQ29udGFpbmVySUQlPiI+Ci0gICAgICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9Y2hvaWNlRnJhZ3Nbal0uZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgICAgPC9zcGFuPgotICAgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgc2hvd1RhYmxlKCc8JT1jaG9pY2VGcmFnVGFibGVDb250YWluZXJJRCU+JywgPCU9KGogPT0gY2hvaWNlSW5kZXgpJT4pOwotICAgICAgICAgIDwvc2NyaXB0PgotPCUKLSAgICAgICAgfQotJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwlCi0gIH0KLSU+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwQ2hvaWNlUkZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NGNjMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwQ2hvaWNlUkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RHcm91cENob2ljZUZyYWdtZW50IGZyYWcgPSAoSVhTREdyb3VwQ2hvaWNlRnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEQmFzZSA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZUJhc2UgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJREJhc2UpLnRvU3RyaW5nKCk7Ci1TdHJpbmdbXSBncm91cElEcyA9IGZyYWcuZ2V0R3JvdXBJRHMoKTsKLWlmIChncm91cElEcy5sZW5ndGggPT0gMSkgewotICBpbnQgY2hvaWNlSW5kZXggPSBmcmFnLmdldENob2ljZUluZGV4KGdyb3VwSURzWzBdKTsKLSAgSVhTREZyYWdtZW50IGNob2ljZUZyYWcgPSBmcmFnLmdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGdyb3VwSURzWzBdKVtjaG9pY2VJbmRleF07Ci0gIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgZnJhZ0lELmFwcGVuZChjaG9pY2VGcmFnLmdldElEKCkpOwotJT4KLSAgPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNob2ljZUZyYWcuZ2V0UmVhZEZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwlCi19Ci1lbHNlIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cElEcy5sZW5ndGg7IGkrKykgewotICAgIGludCBjaG9pY2VJbmRleCA9IGZyYWcuZ2V0Q2hvaWNlSW5kZXgoZ3JvdXBJRHNbaV0pOwotICAgIElYU0RGcmFnbWVudCBjaG9pY2VGcmFnID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEc1tpXSlbY2hvaWNlSW5kZXhdOwotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGNob2ljZUZyYWcuZ2V0SUQoKSk7Ci0lPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9aSArIHRhYmxlQ29udGFpbmVySURCYXNlJT4nLCc8JT1pICsgdHdpc3RJbWFnZU5hbWVCYXNlJT4nKSI+PGltZyBuYW1lPSI8JT1pICsgdHdpc3RJbWFnZU5hbWVCYXNlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfR1JPVVBfTlVNQkVSIiwgU3RyaW5nLnZhbHVlT2YoaSArIDEpKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHNwYW4gaWQ9IjwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+Ij4KLSAgICA8dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgICAgICA8aW1nIHdpZHRoPTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNob2ljZUZyYWcuZ2V0UmVhZEZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8L3NwYW4+Ci08JQotICB9Ci19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwQ2hvaWNlUmFuZ2VXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwQ2hvaWNlUmFuZ2VXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDkxYjdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJhbmdlV0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImVsZW1lbnRJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBjaG9vc2Uoc2VsZWN0KSB7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIHRhYmxlQ29udGFpbmVySUQgPSAnPCU9RnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQlPic7Ci0gICAgICB0YWJsZUNvbnRhaW5lcklEICs9IHNlbGVjdC5vcHRpb25zKGkpLnZhbHVlOwotICAgICAgc2hvd1RhYmxlKHRhYmxlQ29udGFpbmVySUQsIHNlbGVjdC5vcHRpb25zKGkpLnNlbGVjdGVkKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93VGFibGUodGFibGVDb250YWluZXJJRCwgc2hvdykgewotICAgIHZhciB0YWJsZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlQ29udGFpbmVySUQpOwotICAgIGlmIChzaG93KQotICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIGVsc2UKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gIH0KLTwvc2NyaXB0PgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNER3JvdXBDaG9pY2VGcmFnbWVudCBmcmFnID0gKElYU0RHcm91cENob2ljZUZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChlbGVtZW50SUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKS50b1N0cmluZygpOwotU3RyaW5nIG5hbWVBbmNob3JJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLk5BTUVfQU5DSE9SX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLSU+Ci08YSBuYW1lPSI8JT1uYW1lQW5jaG9ySUQlPiIvPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZUluc3RhbmNlKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPiwgJzwlPWZyYWdJRCU+JywgJzwlPW5hbWVBbmNob3JJRCU+JykiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDwlIAotICAgICAgaWYoZWxlbWVudEZyYWdtZW50ICE9IG51bGwgJiYgZWxlbWVudEZyYWdtZW50LmlzTmlsbGFibGUoKSl7Ci0gICAgICAgIGlmKGVsZW1lbnRGcmFnbWVudC5pc05pbCgpKXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgY2hlY2tlZD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9IAotICAgICAgICBlbHNlewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgfQotICAgICU+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2hlY2tNaW5PY2N1cnNBbmRSZW1vdmVTZWxlY3RlZFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSU+KSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT10YWJsZUNvbnRhaW5lcklEJT4iPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAicmFuZ2VmcmFndGFibGUiIDogImlubmVycmFuZ2VmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIG5vd3JhcD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9DSE9JQ0VTIiklPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgd2lkdGg9IjEwMCUiIG5vd3JhcD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9FTEVNRU5UUyIpJT48L3RoPgotICA8L3RyPgotPCUKLSAgWFNEUGFydGljbGVbXSBjaG9pY2VzID0gZnJhZy5nZXRDaG9pY2VzKCk7Ci0gIFN0cmluZ1tdIGdyb3VwSURzID0gZnJhZy5nZXRHcm91cElEcygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwSURzLmxlbmd0aCB8fCBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSAgICBTdHJpbmcgZ3JvdXBJRDsKLSAgICBpbnQgY2hvaWNlSW5kZXg7Ci0gICAgaWYgKGkgPCBncm91cElEcy5sZW5ndGgpIHsKLSAgICAgIGdyb3VwSUQgPSBncm91cElEc1tpXTsKLSAgICAgIGNob2ljZUluZGV4ID0gZnJhZy5nZXRDaG9pY2VJbmRleChncm91cElEKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBncm91cElEID0gZnJhZy5jcmVhdGVHcm91cENob2ljZUluc3RhbmNlKDApOwotICAgICAgY2hvaWNlSW5kZXggPSAwOwotICAgIH0KLSAgICBJWFNERnJhZ21lbnRbXSBjaG9pY2VGcmFncyA9IGZyYWcuZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRCk7Ci0lPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlUm93Q2hlY2tib3hDbGljaygpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWdyb3VwSUQlPiI+Ci0gICAgICAgIDxzZWxlY3QgaWQ9IjwlPWdyb3VwSUQlPiIgbmFtZT0iPCU9Z3JvdXBJRCU+IiBvbkNoYW5nZT0iamF2YXNjcmlwdDpjaG9vc2UodGhpcykiIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9DSE9JQ0VTIiklPiI+Ci08JQotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hvaWNlRnJhZ3MubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbiljaG9pY2VGcmFnc1tqXS5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpLmdldFhTRENvbXBvbmVudCgpOwotICAgICAgICAgICAgaWYgKGogPT0gY2hvaWNlSW5kZXgpIHsKLSU+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPWNob2ljZUZyYWdzW2pdLmdldElEKCklPiIgc2VsZWN0ZWQ+PCU9eHNkRWxlbWVudC5nZXRRTmFtZSgpJT4KLTwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSU+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPWNob2ljZUZyYWdzW2pdLmdldElEKCklPiI+PCU9eHNkRWxlbWVudC5nZXRRTmFtZSgpJT4KLTwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotJT4KLSAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLTwlCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hvaWNlRnJhZ3MubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICAgICAgZnJhZ0lELmFwcGVuZChjaG9pY2VGcmFnc1tqXS5nZXRJRCgpKTsKLSAgICAgICAgICBTdHJpbmcgY2hvaWNlRnJhZ1RhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChjaG9pY2VGcmFnc1tqXS5nZXRJRCgpKS50b1N0cmluZygpOwotJT4KLSAgICAgICAgICA8c3BhbiBpZD0iPCU9Y2hvaWNlRnJhZ1RhYmxlQ29udGFpbmVySUQlPiI+Ci0gICAgICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9Y2hvaWNlRnJhZ3Nbal0uZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgICAgPC9zcGFuPgotICAgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgc2hvd1RhYmxlKCc8JT1jaG9pY2VGcmFnVGFibGVDb250YWluZXJJRCU+JywgPCU9KGogPT0gY2hvaWNlSW5kZXgpJT4pOwotICAgICAgICAgIDwvc2NyaXB0PgotPCUKLSAgICAgICAgfQotJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwlCi0gIH0KLSU+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwUkZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cFJGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDdkYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwUkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RHcm91cEZyYWdtZW50IGZyYWcgPSAoSVhTREdyb3VwRnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEQmFzZSA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZUJhc2UgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJREJhc2UpLnRvU3RyaW5nKCk7Ci1TdHJpbmdbXSBncm91cElEcyA9IGZyYWcuZ2V0R3JvdXBJRHMoKTsKLWlmIChncm91cElEcy5sZW5ndGggPT0gMSkgewotICBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdtZW50cyA9IGZyYWcuZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbMF0pOwotJT4KLSAgPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotPCUKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGdyb3VwTWVtYmVyRnJhZ21lbnRzW2ldLmdldElEKCkpOwotJT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1ncm91cE1lbWJlckZyYWdtZW50c1tpXS5nZXRSZWFkRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotPCUKLSAgfQotJT4KLSAgPC90YWJsZT4KLTwlCi19Ci1lbHNlIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cElEcy5sZW5ndGg7IGkrKykgewotICAgIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEc1tpXSk7Ci0lPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9aSArIHRhYmxlQ29udGFpbmVySURCYXNlJT4nLCc8JT1pICsgdHdpc3RJbWFnZU5hbWVCYXNlJT4nKSI+PGltZyBuYW1lPSI8JT1pICsgdHdpc3RJbWFnZU5hbWVCYXNlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfR1JPVVBfTlVNQkVSIiwgU3RyaW5nLnZhbHVlT2YoaSArIDEpKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHNwYW4gaWQ9IjwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+Ij4KLSAgICA8dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci08JQotICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3JvdXBNZW1iZXJGcmFnbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICAgIGZyYWdJRC5hcHBlbmQoZ3JvdXBNZW1iZXJGcmFnbWVudHNbal0uZ2V0SUQoKSk7Ci0lPgotICAgICAgPHRyPgotICAgICAgICA8dGQgd2lkdGg9MTY+Ci0gICAgICAgICAgPGltZyB3aWR0aD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1ncm91cE1lbWJlckZyYWdtZW50c1tqXS5nZXRSZWFkRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLTwlCi0gICAgfQotJT4KLSAgICA8L3RhYmxlPgotICAgIDwvc3Bhbj4KLTwlCi0gIH0KLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBTZXFGaXhXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwU2VxRml4V0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkODFjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBTZXFGaXhXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RHcm91cFNlcUZyYWdtZW50IGZyYWcgPSAoSVhTREdyb3VwU2VxRnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZ1tdIGdyb3VwSURzID0gZnJhZy5nZXRHcm91cElEcygpOwotZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RDb25maWcuZ2V0TWF4T2NjdXJzKCk7IGkrKykgewotICBTdHJpbmcgZ3JvdXBJRDsKLSAgaWYgKGkgPCBncm91cElEcy5sZW5ndGgpCi0gICAgZ3JvdXBJRCA9IGdyb3VwSURzW2ldOwotICBlbHNlCi0gICAgZ3JvdXBJRCA9IGZyYWcuY3JlYXRlR3JvdXBTZXFJbnN0YW5jZSgpOwotICBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdtZW50cyA9IGZyYWcuZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRCk7Ci0lPgotICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWdyb3VwSUQlPiI+Ci0gIDx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLTwlCi0gIGZvciAoaW50IGogPSAwOyBqIDwgZ3JvdXBNZW1iZXJGcmFnbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgZnJhZ0lELmFwcGVuZChncm91cE1lbWJlckZyYWdtZW50c1tqXS5nZXRJRCgpKTsKLSU+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9Z3JvdXBNZW1iZXJGcmFnbWVudHNbal0uZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci08JQotICB9Ci0lPgotICA8L3RhYmxlPgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBTZXFSYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBTZXFSYW5nZVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYzQxZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwU2VxUmFuZ2VXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZWxlbWVudElEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREdyb3VwU2VxRnJhZ21lbnQgZnJhZyA9IChJWFNER3JvdXBTZXFGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotSVhTREVsZW1lbnRGcmFnbWVudCBlbGVtZW50RnJhZ21lbnQgPSAoSVhTREVsZW1lbnRGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZWxlbWVudElELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJRCkudG9TdHJpbmcoKTsKLVN0cmluZyBuYW1lQW5jaG9ySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5OQU1FX0FOQ0hPUl9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0lPgotPGEgbmFtZT0iPCU9bmFtZUFuY2hvcklEJT4iLz4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUlPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVJbnN0YW5jZSgnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4sICc8JT1mcmFnSUQlPicsICc8JT1uYW1lQW5jaG9ySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8JSAKLSAgICAgIGlmKGVsZW1lbnRGcmFnbWVudCAhPSBudWxsICYmIGVsZW1lbnRGcmFnbWVudC5pc05pbGxhYmxlKCkpewotICAgICAgICBpZihlbGVtZW50RnJhZ21lbnQuaXNOaWwoKSl7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iIGNoZWNrZWQ+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAlPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNoZWNrTWluT2NjdXJzQW5kUmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWluT2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJRCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9FTEVNRU5UUyIpJT48L3RoPgotICA8L3RyPgotICA8JQotICBTdHJpbmdbXSBncm91cElEcyA9IGZyYWcuZ2V0R3JvdXBJRHMoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cElEcy5sZW5ndGggfHwgaSA8IHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKTsgaSsrKSB7Ci0gICAgU3RyaW5nIGdyb3VwSUQ7Ci0gICAgaWYgKGkgPCBncm91cElEcy5sZW5ndGgpCi0gICAgICBncm91cElEID0gZ3JvdXBJRHNbaV07Ci0gICAgZWxzZQotICAgICAgZ3JvdXBJRCA9IGZyYWcuY3JlYXRlR3JvdXBTZXFJbnN0YW5jZSgpOwotICAgIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+Ci0gICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZVJvd0NoZWNrYm94Q2xpY2soKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1ncm91cElEJT4iPgotICAgICAgPCUKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICAgICAgICBmcmFnSUQuYXBwZW5kKGdyb3VwTWVtYmVyRnJhZ21lbnRzW2pdLmdldElEKCkpOwotICAgICAgJT4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1ncm91cE1lbWJlckZyYWdtZW50c1tqXS5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPCUKLSAgfQotICAlPgotPC90YWJsZT4KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RJbmZvRGlhbG9nLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RJbmZvRGlhbG9nLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjODZlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNESW5mb0RpYWxvZy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgbm9kZUlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICBTdHJpbmcgZnJhZ21lbnRJZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPgotICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJUSVRMRV9YU0RfSU5GT1JNQVRJT05fRElBTE9HIiklPgotICA8L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBsaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NkbC9mcmFnbWVudC9YU0RJbmZvX3Rvb2xiYXIuanNwPyIpOwotICAgbGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCk7Ci0gICBsaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgIGxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpLmFwcGVuZCgnPScpLmFwcGVuZChmcmFnbWVudElkKTsKLSU+Ci0gIDxmcmFtZSBuYW1lPSI8JT1XU0RMRnJhbWVOYW1lcy5YU0RfSU5GT19UT09MQkFSJT4iIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQobGluay50b1N0cmluZygpKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPCUgICAgICAKLSAgIGxpbmsuc2V0TGVuZ3RoKDApOwotICAgbGluay5hcHBlbmQoIndzZGwvZnJhZ21lbnQvWFNESW5mb19jb250ZW50LmpzcD8iKTsKLSAgIGxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotICAgbGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICBsaW5rLmFwcGVuZCgnJicpLmFwcGVuZChXU0RMQWN0aW9uSW5wdXRzLkZSQUdNRU5UX0lEKS5hcHBlbmQoJz0nKS5hcHBlbmQoZnJhZ21lbnRJZCk7Ci0lPiAgCi0gIDxmcmFtZSBuYW1lPSI8JT1XU0RMRnJhbWVOYW1lcy5YU0RfSU5GT19DT05URU5UJT4iIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQobGluay50b1N0cmluZygpKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RJbmZvX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREluZm9fY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWQyYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREluZm9fY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJzZXNzaW9uSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIHNlc3Npb25JRC5hcHBlbmQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkpOwotICAgZnJhZ0lELmFwcGVuZChyZXF1ZXN0LmdldFBhcmFtZXRlcihXU0RMQWN0aW9uSW5wdXRzLkZSQUdNRU5UX0lEKSk7Ci0KLSAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSUQudG9TdHJpbmcoKSk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgbm9kZUlELmFwcGVuZChyZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICBJWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9ZnJhZy5nZXRJbmZvcm1hdGlvbkZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREluZm9fdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNESW5mb190b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhMDA4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNESW5mb190b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpKSk7Ci0gICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpKTsgICAKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIG9uVW5sb2FkPSJ0b3Aub3BlbmVyLnhzZEluZm9EaWFsb2dDbG9zZWQ9dHJ1ZSIgY2xhc3M9InRvb2xiYXJib2R5bWFyZ2luIj4KLTxkaXYgaWQ9InRvb2xiYXJib3JkZXIiPgotICA8ZGl2IGlkPSJ0b29sYmFyIj4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0yNSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy93c2RsLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHRvcC5vcGVuZXIueHNkSW5mb0RpYWxvZ0Nsb3NlZCA9IGZhbHNlOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVGaXhXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4V0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjNGQzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVGaXhXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjIgICAxMjc0NDMgamVzcGVyQHNlbHNrYWJldC5vcmcgLSBKZXNwZXIgUyBNb2xsZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImVsZW1lbnRJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLVN0cmluZyBmcmFnSURTdHJpbmcgPSBmcmFnSUQudG9TdHJpbmcoKTsKLUlYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLUlYU0RFbGVtZW50RnJhZ21lbnQgZWxlbWVudEZyYWdtZW50ID0gKElYU0RFbGVtZW50RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGVsZW1lbnRJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZnJhZy5nZXRYU0RUeXBlRGVmaW5pdGlvbigpOwotWFNEVHlwZURlZmluaXRpb24geHNkQnVpbHRJblR5cGUgPSBYU0RUeXBlRGVmaW5pdGlvblV0aWwucmVzb2x2ZVRvWFNEQnVpbHRJblR5cGVEZWZpbml0aW9uKHNpbXBsZVR5cGUpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGxhYmVsIGZvcj0iPCU9ZnJhZ0lEU3RyaW5nJT4iPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlblhTREluZm9EaWFsb2coJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb24uZ2V0SWQoKSxzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksZnJhZ0lELnRvU3RyaW5nKCkpKSklPicpIj48JT1mcmFnLmdldE5hbWUoKSU+PC9hPjwvbGFiZWw+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPCU9KHhzZEJ1aWx0SW5UeXBlICE9IG51bGwgPyB4c2RCdWlsdEluVHlwZS5nZXROYW1lKCkgOiBzaW1wbGVUeXBlLmdldE5hbWUoKSklPgotICAgIDwvdGQ+Ci0gICAgPCUgCi0gICAgICBpZihlbGVtZW50RnJhZ21lbnQgIT0gbnVsbCAmJiBlbGVtZW50RnJhZ21lbnQuaXNOaWxsYWJsZSgpKXsKLSAgICAgICAgaWYoZWxlbWVudEZyYWdtZW50LmlzTmlsKCkpewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiBjaGVja2VkPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0gCi0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iID48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgJT4KLSAgICA8dGQ+Ci0gICAgICA8JQotICAgICAgaWYgKCFmcmFnLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKGZyYWdJRFN0cmluZykpIHsKLSAgICAgICU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICA8JQotICAgICAgfQotICAgICAgJT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDwlCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkQ29uZmlnLmdldE1heE9jY3VycygpOyBpKyspIHsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0iNjAlIj4KLSAgICAgIDwlCi0gICAgICBTdHJpbmcgdmFsdWUgPSBmcmFnLmdldFBhcmFtZXRlclZhbHVlKGZyYWcuZ2V0SUQoKSwgaSk7Ci0gICAgICAlPgotICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZ0lEU3RyaW5nJT4iIHZhbHVlPSI8JT0oKHZhbHVlICE9IG51bGwpID8gSFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllc1N0cmljdCh2YWx1ZSkgOiAiIiklPiIgc2l6ZT0iNTAiIGNsYXNzPSJ0YWJsZXRleHRlbnRlciI+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5DYWxlbmRhckJyb3dzZXIoPCU9cmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEUpJT4sJ2NvbnRlbnRib3JkZXInLCc8JT1mcmFnSURTdHJpbmclPicsPCU9aSU+KSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjMwJSI+Jm5ic3A7PC90ZD4gICAgCi0gIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVSYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVSYW5nZVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NTIzZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lUmFuZ2VXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImVsZW1lbnRJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChlbGVtZW50SUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLVhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci1pbnQgY2FsZW5kYXJUeXBlID0gSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRSkpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUlPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGxhYmVsIGZvcj0iPCU9ZnJhZy5nZXRJRCgpJT4iPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlblhTREluZm9EaWFsb2coJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb24uZ2V0SWQoKSxzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksZnJhZ0lELnRvU3RyaW5nKCkpKSklPicpIj48JT1mcmFnLmdldE5hbWUoKSU+PC9hPjwvbGFiZWw+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPCU9KHhzZEJ1aWx0SW5UeXBlICE9IG51bGwgPyB4c2RCdWlsdEluVHlwZS5nZXROYW1lKCkgOiBzaW1wbGVUeXBlLmdldE5hbWUoKSklPgotICAgIDwvdGQ+Ci0gICAgPCUgCi0gICAgICBpZihlbGVtZW50RnJhZ21lbnQgIT0gbnVsbCAmJiBlbGVtZW50RnJhZ21lbnQuaXNOaWxsYWJsZSgpKXsKLSAgICAgICAgaWYoZWxlbWVudEZyYWdtZW50LmlzTmlsKCkpewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiBjaGVja2VkPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0gCi0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iID48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICU+Ci0gICAgCi0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6YWRkU2ltcGxlQXRvbWljRGF0ZVRpbWVSb3dzKDwlPWNhbGVuZGFyVHlwZSU+LCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCBudWxsLCA8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNoZWNrTWluT2NjdXJzQW5kUmVtb3ZlU2VsZWN0ZWREYXRlVGltZVJvd3MoPCU9Y2FsZW5kYXJUeXBlJT4sJzwlPXRhYmxlQ29udGFpbmVySUQlPicsPCU9eHNkQ29uZmlnLmdldE1pbk9jY3VycygpJT4pIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8JQotICAgICAgaWYgKCFmcmFnLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKGZyYWcuZ2V0SUQoKSkpIHsKLSAgICAgICU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICA8JQotICAgICAgfQotICAgICAgJT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJRCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICA8dGggd2lkdGg9IjkwJSIgY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9WQUxVRVMiKSU+PC90aD4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUNUSU9OUyIpJT48L3RoPgotICA8L3RyPgotPC90YWJsZT4KLTwvc3Bhbj4KLTwlCi1TdHJpbmdbXSB2YWx1ZXMgPSBmcmFnLmdldFBhcmFtZXRlclZhbHVlcyhmcmFnLmdldElEKCkpOwotaW50IGkgPSAwOwotaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gIGZvciAoIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIGFkZFNpbXBsZUF0b21pY0RhdGVUaW1lUm93cyg8JT1jYWxlbmRhclR5cGUlPiwiPCU9dGFibGVDb250YWluZXJJRCU+IiwiPCU9ZnJhZy5nZXRJRCgpJT4iLCI8JT1mcmFnLmdldElEKCklPiIsIjwlPXZhbHVlc1tpXSU+Iiw8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPik7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci19Ci1mb3IgKCA7IGkgPCB4c2RDb25maWcuZ2V0TWluT2NjdXJzKCk7IGkrKykgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgYWRkU2ltcGxlQXRvbWljRGF0ZVRpbWVSb3dzKDwlPWNhbGVuZGFyVHlwZSU+LCI8JT10YWJsZUNvbnRhaW5lcklEJT4iLCI8JT1mcmFnLmdldElEKCklPiIsIjwlPWZyYWcuZ2V0SUQoKSU+IixudWxsLDwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+KTsKLSAgPC9zY3JpcHQ+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNFbnVtRml4V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNFbnVtRml4V0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlOWVjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRW51bUZpeFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJlbGVtZW50SUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLSAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50IGZyYWcgPSAoWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci0gICBJWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChlbGVtZW50SUQudG9TdHJpbmcoKSk7Ci0gICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgIFhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxsYWJlbCBmb3I9IjwlPWZyYWcuZ2V0SUQoKSU+Ij48YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT48L2xhYmVsPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDwlPSh4c2RCdWlsdEluVHlwZSAhPSBudWxsID8geHNkQnVpbHRJblR5cGUuZ2V0TmFtZSgpIDogc2ltcGxlVHlwZS5nZXROYW1lKCkpJT4KLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgIDwlIAotICAgICAgaWYoZWxlbWVudEZyYWdtZW50ICE9IG51bGwgJiYgZWxlbWVudEZyYWdtZW50LmlzTmlsbGFibGUoKSl7Ci0gICAgICAgIGlmKGVsZW1lbnRGcmFnbWVudC5pc05pbCgpKXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgY2hlY2tlZD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9IAotICAgICAgICBlbHNlewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJT4KLQotPCUKLSAgIGlmICghZnJhZy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhmcmFnLmdldElEKCkpKQotICAgewotJT4KLSAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLTwlCi0gICBPcHRpb25WZWN0b3Igb3B0aW9uVmVjdG9yID0gZnJhZy5nZXRPcHRpb25WZWN0b3IoKTsKLSAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkQ29uZmlnLmdldE1heE9jY3VycygpOyBpKyspCi0gICB7Ci0lPgotICA8dHI+Ci0gICAgPHRkPgotPCUKLSAgICAgU3RyaW5nIHNlbGVjdGVkVmFsdWUgPSBmcmFnLmdldFBhcmFtZXRlclZhbHVlKGZyYWcuZ2V0SUQoKSwgaSk7Ci0lPgotICAgICAgPHNlbGVjdCBpZD0iPCU9ZnJhZy5nZXRJRCgpJT4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci08JSAgICAgICAgICAgICAgCi0gICAgIGZvciAoaW50IGogPSAwOyBqIDwgb3B0aW9uVmVjdG9yLnNpemUoKTsgaisrKQotICAgICB7Ci0gICAgICAgU3RyaW5nIGRpc3BsYXlWYWx1ZSA9IG9wdGlvblZlY3Rvci5nZXREaXNwbGF5VmFsdWUoaik7Ci0gICAgICAgU3RyaW5nIHZhbHVlID0gb3B0aW9uVmVjdG9yLmdldFZhbHVlKGopOwotICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoc2VsZWN0ZWRWYWx1ZSkpCi0gICAgICAgewotJT4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9dmFsdWUlPiIgc2VsZWN0ZWQ+PCU9ZGlzcGxheVZhbHVlJT4KLTwlCi0gICAgICAgfQotICAgICAgIGVsc2UKLSAgICAgICB7Ci0lPgotICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT12YWx1ZSU+Ij48JT1kaXNwbGF5VmFsdWUlPgotPCUKLSAgICAgICB9Ci0gICAgIH0KLSU+Ci0gICAgICA8L3NlbGVjdD4KLSAgICA8L3RkPgotICA8L3RyPgotPCUKLSAgIH0KLSAgJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlV0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdhOWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnhzZC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZWxlbWVudElEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLSAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50IGZyYWcgPSAoWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci0gICBJWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChlbGVtZW50SUQudG9TdHJpbmcoKSk7Ci0gICBPcHRpb25WZWN0b3Igb3B0aW9uVmVjdG9yID0gZnJhZy5nZXRPcHRpb25WZWN0b3IoKTsKLSAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZnJhZy5nZXRYU0RUeXBlRGVmaW5pdGlvbigpOwotICAgWFNEVHlwZURlZmluaXRpb24geHNkQnVpbHRJblR5cGUgPSBYU0RUeXBlRGVmaW5pdGlvblV0aWwucmVzb2x2ZVRvWFNEQnVpbHRJblR5cGVEZWZpbml0aW9uKHNpbXBsZVR5cGUpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0gICBTdHJpbmcgdHdpc3RJbWFnZU5hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJRCkudG9TdHJpbmcoKTsKLSAgIFN0cmluZyBvcHRpb25zQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5YU0RfQVRPTUlDX0VOVU1fSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotJT4KLTxzcGFuIGlkPSI8JT1vcHRpb25zQ29udGFpbmVySUQlPiI+Ci08JQotICAgZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25WZWN0b3Iuc2l6ZSgpOyBqKyspIHsKLSU+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9b3B0aW9uc0NvbnRhaW5lcklEJT4iIHZhbHVlPSI8JT1vcHRpb25WZWN0b3IuZ2V0RGlzcGxheVZhbHVlKGopJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPW9wdGlvbnNDb250YWluZXJJRCU+IiB2YWx1ZT0iPCU9b3B0aW9uVmVjdG9yLmdldFZhbHVlKGopJT4iPgotPCUKLSAgIH0KLSU+Ci08L3NwYW4+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gYWRkU2ltcGxlQXRvbWljRW51bVJvd3ModGFibGVDb250YWluZXJJRCwgb3B0aW9uc0NvbnRhaW5lcklELCBpZCwgbmFtZSwgdmFsdWUsIG1heE9jY3VycykgewotICAgIGlmIChjaGVja01heE9jY3Vyc1JlYWNoZWQodGFibGVDb250YWluZXJJRCwgbWF4T2NjdXJzKSkKLSAgICAgIHJldHVybjsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLQotICAgIHZhciByb3dDaGVja2JveCA9IGNyZWF0ZVJvd0NoZWNrYm94KCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0KLSAgICB2YXIgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChzZWxlY3QpOwotICAgIHNlbGVjdC5pZCA9IGlkOwotICAgIHNlbGVjdC5uYW1lID0gbmFtZTsKLSAgICBzZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgIHZhciBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25zQ29udGFpbmVySUQpOwotICAgIHZhciBpbmRleCA9IDA7Ci0gICAgZm9yICh2YXIgayA9IDA7IGsgPCBvcHRpb25zLmxlbmd0aDsgayArPSAyKSB7Ci0gICAgICBzZWxlY3Qub3B0aW9uc1tpbmRleF0gPSBuZXcgT3B0aW9uKG9wdGlvbnNba10udmFsdWUsb3B0aW9uc1trKzFdLnZhbHVlKTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlID09IG9wdGlvbnNbaysxXS52YWx1ZSkKLSAgICAgICAgc2VsZWN0Lm9wdGlvbnNbaW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldE9wdGlvbnMob3B0aW9uc0NvbnRhaW5lcklEKSB7Ci0gICAgdmFyIG9wdGlvbnNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHRpb25zQ29udGFpbmVySUQpOwotICAgIHZhciBvcHRpb25zID0gb3B0aW9uc0NvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICByZXR1cm4gb3B0aW9uczsKLSAgfQotPC9zY3JpcHQ+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxsYWJlbCBmb3I9IjwlPWZyYWcuZ2V0SUQoKSU+Ij48YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT48L2xhYmVsPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDwlPSh4c2RCdWlsdEluVHlwZSAhPSBudWxsID8geHNkQnVpbHRJblR5cGUuZ2V0TmFtZSgpIDogc2ltcGxlVHlwZS5nZXROYW1lKCkpJT4KLSAgICA8L3RkPgotICAgICAgPCUgCi0gICAgICBpZihlbGVtZW50RnJhZ21lbnQgIT0gbnVsbCAmJiBlbGVtZW50RnJhZ21lbnQuaXNOaWxsYWJsZSgpKXsKLSAgICAgICAgaWYoZWxlbWVudEZyYWdtZW50LmlzTmlsKCkpewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiBjaGVja2VkPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0gCi0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iID48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAlPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZFNpbXBsZUF0b21pY0VudW1Sb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9b3B0aW9uc0NvbnRhaW5lcklEJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCBudWxsLCA8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNoZWNrTWluT2NjdXJzQW5kUmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWluT2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgIDwlCi0gICAgICBpZiAoIWZyYWcudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKSkgewotICAgICAgJT4KLSAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLSAgICAgIDwlCi0gICAgICB9Ci0gICAgICAlPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT10YWJsZUNvbnRhaW5lcklEJT4iPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAicmFuZ2VmcmFndGFibGUiIDogImlubmVycmFuZ2VmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1ZBTFVFUyIpJT48L3RoPgotICA8L3RyPgotPC90YWJsZT4KLTwvc3Bhbj4KLTwlCi1TdHJpbmdbXSB2YWx1ZXMgPSBmcmFnLmdldFBhcmFtZXRlclZhbHVlcyhmcmFnLmdldElEKCkpOwotaW50IGkgPSAwOwotaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gIGZvciAoIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIGFkZFNpbXBsZUF0b21pY0VudW1Sb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9b3B0aW9uc0NvbnRhaW5lcklEJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCAnPCU9dmFsdWVzW2ldJT4nLCAnPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4nKTsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLX0KLWZvciAoIDsgaSA8IHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKTsgaSsrKSB7Ci0lPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBhZGRTaW1wbGVBdG9taWNFbnVtUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPW9wdGlvbnNDb250YWluZXJJRCU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgbnVsbCwgJzwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+Jyk7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRml4V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNGaXhXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjZhZDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNGaXhXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjIgICAxMjc0NDMgamVzcGVyQHNlbHNrYWJldC5vcmcgLSBKZXNwZXIgUyBNb2xsZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJlbGVtZW50SUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJhdHRyaWJ1dGUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChlbGVtZW50SUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLVhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLWJvb2xlYW4gYXR0cmlidXRlQm9vbCA9IEJvb2xlYW4udmFsdWVPZihhdHRyaWJ1dGUudG9TdHJpbmcoKSkuYm9vbGVhblZhbHVlKCkgOwotCi0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8bGFiZWwgZm9yPSI8JT1mcmFnLmdldElEKCklPiI+PGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+PC9sYWJlbD4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8JT0oeHNkQnVpbHRJblR5cGUgIT0gbnVsbCA/IHhzZEJ1aWx0SW5UeXBlLmdldE5hbWUoKSA6IHNpbXBsZVR5cGUuZ2V0TmFtZSgpKSU+Ci0gICAgPC90ZD4KLSAgICA8JSAKLSAgICAgIGlmKGVsZW1lbnRGcmFnbWVudCAhPSBudWxsICYmIGVsZW1lbnRGcmFnbWVudC5pc05pbGxhYmxlKCkgJiYgIShhdHRyaWJ1dGVCb29sKSApewotICAgICAgICBpZihlbGVtZW50RnJhZ21lbnQuaXNOaWwoKSl7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iIGNoZWNrZWQ+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICU+Ci0gICAgCi0gICAgPHRkPgotICAgICAgPCUKLSAgICAgIGlmICghZnJhZy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhmcmFnLmdldElEKCkpKSB7Ci0gICAgICAlPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgPCUKLSAgICAgIH0KLSAgICAgICU+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICA8JQotICBmb3IgKGludCBpID0gMDsgaSA8IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsgaSsrKSB7Ci0gICU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8JQotICAgICAgU3RyaW5nIHZhbHVlID0gZnJhZy5nZXRQYXJhbWV0ZXJWYWx1ZShmcmFnLmdldElEKCksIGkpOwotICAgICAgJT4KLSAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iPCU9ZnJhZy5nZXRJRCgpJT4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9KCh2YWx1ZSAhPSBudWxsKSA/IEhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3QodmFsdWUpIDogIiIpJT4iIHNpemU9IjUwIiBjbGFzcz0idGFibGV0ZXh0ZW50ZXIiPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljSW5mb0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmNlZmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0ic2Vzc2lvbklEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi1IdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklELnRvU3RyaW5nKCkpOwotQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpLmdldFhTRENvbXBvbmVudCgpOwotCi1pbnQgbWluTGVuZ3RoID0gLTE7Ci1pbnQgbWF4TGVuZ3RoID0gLTE7Ci1WZWN0b3IgcGF0dGVyblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLVN0cmluZyB3aGl0ZVNwYWNlID0gbnVsbDsKLWJvb2xlYW4gbWluRXhjbHVzaXZlID0gdHJ1ZTsKLU9iamVjdCBtaW4gPSBudWxsOwotYm9vbGVhbiBtYXhFeGNsdXNpdmUgPSB0cnVlOwotT2JqZWN0IG1heCA9IG51bGw7Ci1pbnQgdG90YWxEaWdpdHMgPSAtMTsKLWludCBmcmFjdGlvbkRpZ2l0cyA9IC0xOwotCi1YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjdXJyVHlwZSA9IHNpbXBsZVR5cGU7Ci13aGlsZSAoIVhTRFR5cGVEZWZpbml0aW9uVXRpbC5pc1Jvb3RUeXBlRGVmaW5pdGlvbihjdXJyVHlwZSkpIHsKLSAgLy8gbWluTGVuZ3RoCi0gIGlmIChtaW5MZW5ndGggPCAwKSB7Ci0gICAgWFNETGVuZ3RoRmFjZXQgeHNkTGVuZ3RoRmFjZXQgPSBjdXJyVHlwZS5nZXRMZW5ndGhGYWNldCgpOwotICAgIFhTRE1pbkxlbmd0aEZhY2V0IHhzZE1pbkxlbmd0aEZhY2V0ID0gY3VyclR5cGUuZ2V0TWluTGVuZ3RoRmFjZXQoKTsKLSAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgIGlmICh4c2RMZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgbWluTGVuZ3RoID0geHNkTGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICBlbHNlIGlmICh4c2RNaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgbWluTGVuZ3RoID0geHNkTWluTGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgfQotICAvLyBtYXhMZW5ndGgKLSAgaWYgKG1heExlbmd0aCA8IDApIHsKLSAgICBYU0RMZW5ndGhGYWNldCB4c2RMZW5ndGhGYWNldCA9IGN1cnJUeXBlLmdldExlbmd0aEZhY2V0KCk7Ci0gICAgWFNETWF4TGVuZ3RoRmFjZXQgeHNkTWF4TGVuZ3RoRmFjZXQgPSBjdXJyVHlwZS5nZXRNYXhMZW5ndGhGYWNldCgpOwotICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgaWYgKHhzZExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICBtYXhMZW5ndGggPSB4c2RMZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICAgIGVsc2UgaWYgKHhzZE1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICBtYXhMZW5ndGggPSB4c2RNYXhMZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICB9Ci0gIC8vIHBhdHRlcm5WZWN0b3IKLSAgRUxpc3QgeHNkUGF0dGVybkZhY2V0cyA9IGN1cnJUeXBlLmdldFBhdHRlcm5GYWNldHMoKTsKLSAgaWYgKHhzZFBhdHRlcm5GYWNldHMgIT0gbnVsbCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkUGF0dGVybkZhY2V0cy5zaXplKCk7IGkrKykgewotICAgICAgWFNEUGF0dGVybkZhY2V0IHhzZFBhdHRlcm5GYWNldCA9IChYU0RQYXR0ZXJuRmFjZXQpeHNkUGF0dGVybkZhY2V0cy5nZXQoaSk7Ci0gICAgICBFTGlzdCBwYXR0ZXJucyA9IHhzZFBhdHRlcm5GYWNldC5nZXRWYWx1ZSgpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXR0ZXJucy5zaXplKCk7IGorKykgewotICAgICAgICBwYXR0ZXJuVmVjdG9yLmFkZChwYXR0ZXJucy5nZXQoaikpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyB3aGl0ZVNwYWNlCi0gIGlmICh3aGl0ZVNwYWNlID09IG51bGwpIHsKLSAgICBYU0RXaGl0ZVNwYWNlRmFjZXQgeHNkV2hpdGVTcGFjZUZhY2V0ID0gY3VyclR5cGUuZ2V0V2hpdGVTcGFjZUZhY2V0KCk7Ci0gICAgLy8gcG9ydCB0byBvcmcuZWNsaXBzZS54c2QKLSAgICBpZiAoeHNkV2hpdGVTcGFjZUZhY2V0ICE9IG51bGwpCi0gICAgICB3aGl0ZVNwYWNlID0geHNkV2hpdGVTcGFjZUZhY2V0LmdldFZhbHVlKCkuZ2V0TmFtZSgpOwotICB9Ci0gIC8vIG1pbiBpbi9leGNsdXNpdmUKLSAgaWYgKG1pbiA9PSBudWxsICkgewotICAgIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0ID0gY3VyclR5cGUuZ2V0TWluRXhjbHVzaXZlRmFjZXQoKTsKLSAgICBYU0RNaW5JbmNsdXNpdmVGYWNldCB4c2RNaW5JbmNsdXNpdmVGYWNldCA9IGN1cnJUeXBlLmdldE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgaWYgKHhzZE1pbkV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwpIHsKLSAgICAgIG1pbiA9IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICBtaW5FeGNsdXNpdmUgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlIGlmICh4c2RNaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsKSB7Ci0gICAgICBtaW4gPSB4c2RNaW5JbmNsdXNpdmVGYWNldC5nZXRWYWx1ZSgpOwotICAgICAgbWluRXhjbHVzaXZlID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIC8vIG1heCBpbi9leGNsdXNpdmUKLSAgaWYgKG1heCA9PSBudWxsKSB7Ci0gICAgWFNETWF4RXhjbHVzaXZlRmFjZXQgeHNkTWF4RXhjbHVzaXZlRmFjZXQgPSBjdXJyVHlwZS5nZXRNYXhFeGNsdXNpdmVGYWNldCgpOwotICAgIFhTRE1heEluY2x1c2l2ZUZhY2V0IHhzZE1heEluY2x1c2l2ZUZhY2V0ID0gY3VyclR5cGUuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKTsKLSAgICBpZiAoeHNkTWF4RXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkgewotICAgICAgbWF4ID0geHNkTWF4RXhjbHVzaXZlRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgIG1heEV4Y2x1c2l2ZSA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKHhzZE1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpIHsKLSAgICAgIG1heCA9IHhzZE1heEluY2x1c2l2ZUZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICBtYXhFeGNsdXNpdmUgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgLy8gdG90YWxEaWdpdHMKLSAgaWYgKHRvdGFsRGlnaXRzIDwgMCkgewotICAgIFhTRFRvdGFsRGlnaXRzRmFjZXQgeHNkVG90YWxEaWdpdHNGYWNldCA9IGN1cnJUeXBlLmdldFRvdGFsRGlnaXRzRmFjZXQoKTsKLSAgICBpZiAoeHNkVG90YWxEaWdpdHNGYWNldCAhPSBudWxsKQotICAgICAgdG90YWxEaWdpdHMgPSB4c2RUb3RhbERpZ2l0c0ZhY2V0LmdldFZhbHVlKCk7Ci0gIH0KLSAgLy8gZnJhY3Rpb25EaWdpdHMKLSAgaWYgKGZyYWN0aW9uRGlnaXRzIDwgMCkgewotICAgIFhTREZyYWN0aW9uRGlnaXRzRmFjZXQgeHNkRnJhY3Rpb25EaWdpdHNGYWNldCA9IGN1cnJUeXBlLmdldEZyYWN0aW9uRGlnaXRzRmFjZXQoKTsKLSAgICBpZiAoeHNkRnJhY3Rpb25EaWdpdHNGYWNldCAhPSBudWxsKQotICAgICAgZnJhY3Rpb25EaWdpdHMgPSB4c2RGcmFjdGlvbkRpZ2l0c0ZhY2V0LmdldFZhbHVlKCk7Ci0gIH0KLSAgLy8gd2FsayB0byBiYXNlIHR5cGUKLSAgY3VyclR5cGUgPSBjdXJyVHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLX0KLSU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQkFTRV9UWVBFIiklPgotICAgIDwvdGg+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgPCU9WFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKS5nZXROYW1lKCklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08JQotU3RyaW5nIG1pbkxlbmd0aFN0cmluZyA9IChtaW5MZW5ndGggPCAwKSA/IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VOQk9VTkRFRCIpIDogU3RyaW5nLnZhbHVlT2YobWluTGVuZ3RoKTsKLVN0cmluZyBtYXhMZW5ndGhTdHJpbmcgPSAobWF4TGVuZ3RoIDwgMCkgPyB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VTkJPVU5ERUQiKSA6IFN0cmluZy52YWx1ZU9mKG1heExlbmd0aCk7Ci1TdHJpbmdbXSBsZW5ndGhWYWx1ZXMgPSB7bWluTGVuZ3RoU3RyaW5nLCBtYXhMZW5ndGhTdHJpbmd9OwotaWYgKG1pbkxlbmd0aCA+PSAwIHx8IG1heExlbmd0aCA+PSAwKSB7Ci0lPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEVOR1RIIiklPgotICAgICAgPC90aD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xFTkdUSF9WQUxVRSIsIGxlbmd0aFZhbHVlcyklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUKLX0KLSU+Ci0KLTwlCi1pZiAocGF0dGVyblZlY3Rvci5zaXplKCkgPiAwKSB7Ci0gIFN0cmluZyBwYXR0ZXJuQ29udGFpbmVySUQgPSAiOjpwYXR0ZXJuIjsKLSAgU3RyaW5nIHhwYXR0ZXJuQ29udGFpbmVySUQgPSAieDo6cGF0dGVybiI7Ci0lPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9cGF0dGVybkNvbnRhaW5lcklEJT4nLCc8JT14cGF0dGVybkNvbnRhaW5lcklEJT4nKSI+PGltZyBuYW1lPSI8JT14cGF0dGVybkNvbnRhaW5lcklEJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgICA8c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BBVFRFUk4iKSU+PC9zdHJvbmc+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxzcGFuIGlkPSI8JT1wYXR0ZXJuQ29udGFpbmVySUQlPiI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUEFUVEVSTiIpJT4KLSAgICAgIDwvdGg+Ci0gICAgPC90cj4KLSAgICA8JQotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcGF0dGVyblZlY3Rvci5zaXplKCk7IGsrKykgewotICAgICU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgPCU9KFN0cmluZylwYXR0ZXJuVmVjdG9yLmdldChrKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwlCi0gICAgfQotICAgICU+Ci0gIDwvdGFibGU+Ci0gIDwvc3Bhbj4KLTwlCi19Ci0lPgotCi08JQotaWYgKHdoaXRlU3BhY2UgIT0gbnVsbCkgewotJT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dISVRFU1BBQ0UiKSU+Ci0gICAgICA8L3RoPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgPCU9d2hpdGVTcGFjZSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotfQotJT4KLQotPCUKLVN0cmluZyBsb3dlckJvdW5kOwotaWYgKG1pbkV4Y2x1c2l2ZSkKLSAgbG93ZXJCb3VuZCA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01JTl9FWENMVVNJVkUiLCAobWluID09IG51bGwpID8gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5CT1VOREVEIikgOiBtaW4udG9TdHJpbmcoKSk7Ci1lbHNlCi0gIGxvd2VyQm91bmQgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NSU5fSU5DTFVTSVZFIiwgKG1pbiA9PSBudWxsKSA/IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VOQk9VTkRFRCIpIDogbWluLnRvU3RyaW5nKCkpOwotU3RyaW5nIHVwcGVyQm91bmQ7Ci1pZiAobWF4RXhjbHVzaXZlKQotICB1cHBlckJvdW5kID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTUFYX0VYQ0xVU0lWRSIsIChtYXggPT0gbnVsbCkgPyB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VTkJPVU5ERUQiKSA6IG1heC50b1N0cmluZygpKTsKLWVsc2UKLSAgdXBwZXJCb3VuZCA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01BWF9JTkNMVVNJVkUiLCAobWF4ID09IG51bGwpID8gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5CT1VOREVEIikgOiBtYXgudG9TdHJpbmcoKSk7Ci1pZiAobWluICE9IG51bGwgfHwgbWF4ICE9IG51bGwpIHsKLSU+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICA8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SQU5HRV9PRl9WQUxVRVMiKSU+Ci0gICAgICA8L3RoPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgPCU9bG93ZXJCb3VuZCArIHVwcGVyQm91bmQlPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUKLX0KLSU+Ci0KLTwlCi1pZiAodG90YWxEaWdpdHMgPj0gMCkgewotJT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1RPVEFMX0RJR0lUUyIpJT4KLSAgICAgIDwvdGg+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICA8JT10b3RhbERpZ2l0cyU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotfQotJT4KLQotPCUKLWlmIChmcmFjdGlvbkRpZ2l0cyA+PSAwKSB7Ci0lPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRlJBQ1RJT05fRElHSVRTIiklPgotICAgICAgPC90aD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgIDwlPWZyYWN0aW9uRGlnaXRzJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY1JGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkZDRiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgb3Blck5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLVhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLVN0cmluZ1tdIGxhYmVsQXJncyA9IHtmcmFnLmdldE5hbWUoKSwgKHhzZEJ1aWx0SW5UeXBlICE9IG51bGwgPyB4c2RCdWlsdEluVHlwZS5nZXROYW1lKCkgOiBzaW1wbGVUeXBlLmdldE5hbWUoKSl9OwotU3RyaW5nW10gcGFyYW1zID0gZnJhZy5nZXRQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKTsKLSU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggaWQ9IjwlPWZyYWcuZ2V0SUQoKSU+IiBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BVE9NSUNfTkFNRV9UWVBFIiwgbGFiZWxBcmdzKSU+Ci0gICAgPC90aD4KLSAgICA8dGQgaGVhZGVycz0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB3aWR0aD0iMTAwJSIgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8JT0oKHBhcmFtcyAhPSBudWxsICYmIHBhcmFtcy5sZW5ndGggPiAwKSA/IEhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXMocGFyYW1zWzBdKSA6IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05VTEwiKSklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDwlCi0gIGlmIChwYXJhbXMgIT0gbnVsbCkgewotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgJT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD48L3RkPgotICAgICAgICA8dGQgaGVhZGVycz0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB3aWR0aD0iMTAwJSIgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhwYXJhbXNbaV0pJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPCUKLSAgICB9Ci0gIH0KLSAgJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUmFuZ2VXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY1JhbmdlV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2OGQ3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUmFuZ2VXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJlbGVtZW50SUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERWxlbWVudEZyYWdtZW50IGVsZW1lbnRGcmFnbWVudCA9IChJWFNERWxlbWVudEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChlbGVtZW50SUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLVhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGFkZFNpbXBsZUF0b21pY1Jvd3ModGFibGVDb250YWluZXJJRCwgaWQsIG5hbWUsIHZhbHVlLCBtYXhPY2N1cnMpIHsKLSAgICBpZiAoY2hlY2tNYXhPY2N1cnNSZWFjaGVkKHRhYmxlQ29udGFpbmVySUQsIG1heE9jY3VycykpCi0gICAgICByZXR1cm47Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotCi0gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGlucHV0KTsKLSAgICBpbnB1dC50eXBlID0gInRleHQiOwotICAgIGlucHV0LmlkID0gaWQ7Ci0gICAgaW5wdXQubmFtZSA9IG5hbWU7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoID4gMCkKLSAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7Ci0gICAgaW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLTwvc2NyaXB0PgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8bGFiZWwgZm9yPSI8JT1mcmFnLmdldElEKCklPiI+PGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+PC9sYWJlbD4KLSAgICA8L3RkPgotICAgIDwlIAotICAgICAgaWYoZWxlbWVudEZyYWdtZW50ICE9IG51bGwgJiYgZWxlbWVudEZyYWdtZW50LmlzTmlsbGFibGUoKSl7Ci0gICAgICAgIGlmKGVsZW1lbnRGcmFnbWVudC5pc05pbCgpKXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgY2hlY2tlZD48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9IAotICAgICAgICBlbHNlewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgfQotICAgICU+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDwlPSh4c2RCdWlsdEluVHlwZSAhPSBudWxsID8geHNkQnVpbHRJblR5cGUuZ2V0TmFtZSgpIDogc2ltcGxlVHlwZS5nZXROYW1lKCkpJT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZFNpbXBsZUF0b21pY1Jvd3MoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsICc8JT1mcmFnLmdldElEKCklPicsICc8JT1mcmFnLmdldElEKCklPicsIG51bGwsIDwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+KSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2hlY2tNaW5PY2N1cnNBbmRSZW1vdmVTZWxlY3RlZFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSU+KSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgPCUKLSAgICAgIGlmICghZnJhZy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhmcmFnLmdldElEKCkpKSB7Ci0gICAgICAlPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgPCUKLSAgICAgIH0KLSAgICAgICU+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJyYW5nZWZyYWd0YWJsZSIgOiAiaW5uZXJyYW5nZWZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySUQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVkFMVUVTIiklPjwvdGg+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPC9zcGFuPgotPCUKLVN0cmluZ1tdIHZhbHVlcyA9IGZyYWcuZ2V0UGFyYW1ldGVyVmFsdWVzKGZyYWcuZ2V0SUQoKSk7Ci1pbnQgaSA9IDA7Ci1pZiAodmFsdWVzICE9IG51bGwpIHsKLSAgZm9yICggOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0lPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgYWRkU2ltcGxlQXRvbWljUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgJzwlPXZhbHVlc1tpXSU+JywgJzwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+Jyk7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci19Ci1mb3IgKCA7IGkgPCB4c2RDb25maWcuZ2V0TWluT2NjdXJzKCk7IGkrKykgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgYWRkU2ltcGxlQXRvbWljUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgbnVsbCwgJzwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+Jyk7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdEZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdEZpeFdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YzIzMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RGaXhXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RTaW1wbGVMaXN0RnJhZ21lbnQgZnJhZyA9IChJWFNEU2ltcGxlTGlzdEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1JWFNERnJhZ21lbnRbXSBjaGlsZEZyYWdzID0gZnJhZy5nZXRBbGxGcmFnbWVudHMoKTsKLSU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci08JQotZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RDb25maWcuZ2V0TWF4T2NjdXJzKCk7IGkrKykgewotICBJWFNERnJhZ21lbnQgY2hpbGRGcmFnOwotICBTdHJpbmcgY2hpbGRGcmFnSUQ7Ci0gIGlmIChpIDwgY2hpbGRGcmFncy5sZW5ndGgpIHsKLSAgICBjaGlsZEZyYWcgPSBjaGlsZEZyYWdzW2ldOwotICAgIGNoaWxkRnJhZ0lEID0gY2hpbGRGcmFnLmdldElEKCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2hpbGRGcmFnSUQgPSBmcmFnLmNyZWF0ZUxpc3RJbnN0YW5jZSgpOwotICAgIGNoaWxkRnJhZyA9IGZyYWcuZ2V0RnJhZ21lbnQoY2hpbGRGcmFnSUQpOwotICB9Ci0gIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgZnJhZ0lELmFwcGVuZChjaGlsZEZyYWdJRCk7Ci0lPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1jaGlsZEZyYWdJRCU+Ij4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaGlsZEZyYWcuZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwlCi19Ci0lPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVMaXN0UkZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVMaXN0UkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyODYxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdFJGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIG9wZXJOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClvcGVyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTRFNpbXBsZUxpc3RGcmFnbWVudCBmcmFnID0gKElYU0RTaW1wbGVMaXN0RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLUlYU0RGcmFnbWVudFtdIGNoaWxkRnJhZ3MgPSBmcmFnLmdldEFsbEZyYWdtZW50cygpOwotJT4KLTx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLTwlCi1mb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRnJhZ3MubGVuZ3RoOyBpKyspIHsKLSAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ3NbaV0uZ2V0SUQoKSk7Ci0lPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNoaWxkRnJhZ3NbaV0uZ2V0UmVhZEZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotPCUKLX0KLSU+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RSYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdFJhbmdlV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdlYmJhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdFJhbmdlV0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZWxlbWVudElEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTRFNpbXBsZUxpc3RGcmFnbWVudCBmcmFnID0gKElYU0RTaW1wbGVMaXN0RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLUlYU0RFbGVtZW50RnJhZ21lbnQgZWxlbWVudEZyYWdtZW50ID0gKElYU0RFbGVtZW50RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGVsZW1lbnRJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgbmFtZUFuY2hvcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuTkFNRV9BTkNIT1JfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotJT4KLTxhIG5hbWU9IjwlPW5hbWVBbmNob3JJRCU+Ii8+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlblhTREluZm9EaWFsb2coJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb24uZ2V0SWQoKSxzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksZnJhZ0lELnRvU3RyaW5nKCkpKSklPicpIj48JT1mcmFnLmdldE5hbWUoKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPCUgCi0gICAgICBpZihlbGVtZW50RnJhZ21lbnQgIT0gbnVsbCAmJiBlbGVtZW50RnJhZ21lbnQuaXNOaWxsYWJsZSgpKXsKLSAgICAgICAgaWYoZWxlbWVudEZyYWdtZW50LmlzTmlsKCkpewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiBjaGVja2VkPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0gCi0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iID48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgJT4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVJbnN0YW5jZSgnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4sICc8JT1mcmFnSUQlPicsICc8JT1uYW1lQW5jaG9ySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1pbk9jY3VycygpJT4pIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJyYW5nZWZyYWd0YWJsZSIgOiAiaW5uZXJyYW5nZWZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySUQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTElTVF9JVEVNUyIpJT48L3RoPgotICA8L3RyPgotICA8JQotICBJWFNERnJhZ21lbnRbXSBjaGlsZEZyYWdzID0gZnJhZy5nZXRBbGxGcmFnbWVudHMoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEZyYWdzLmxlbmd0aCB8fCBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSAgICBJWFNERnJhZ21lbnQgY2hpbGRGcmFnOwotICAgIFN0cmluZyBjaGlsZEZyYWdJRDsKLSAgICBpZiAoaSA8IGNoaWxkRnJhZ3MubGVuZ3RoKSB7Ci0gICAgICBjaGlsZEZyYWcgPSBjaGlsZEZyYWdzW2ldOwotICAgICAgY2hpbGRGcmFnSUQgPSBjaGlsZEZyYWcuZ2V0SUQoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjaGlsZEZyYWdJRCA9IGZyYWcuY3JlYXRlTGlzdEluc3RhbmNlKCk7Ci0gICAgICBjaGlsZEZyYWcgPSBmcmFnLmdldEZyYWdtZW50KGNoaWxkRnJhZ0lEKTsKLSAgICB9Ci0gICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgIGZyYWdJRC5hcHBlbmQoY2hpbGRGcmFnSUQpOwotICAlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD4KLSAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlUm93Q2hlY2tib3hDbGljaygpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWNoaWxkRnJhZ0lEJT4iPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNoaWxkRnJhZy5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotICA8JQotICB9Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uRml4V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvbkZpeFdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDgzNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uRml4V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImVsZW1lbnRJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RTaW1wbGVVbmlvbkZyYWdtZW50IGZyYWcgPSAoSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLUlYU0RFbGVtZW50RnJhZ21lbnQgZWxlbWVudEZyYWdtZW50ID0gKElYU0RFbGVtZW50RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGVsZW1lbnRJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGNoYW5nZVVuaW9uTWVtYmVyVHlwZShzZWxlY3QpIHsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgdGFibGVDb250YWluZXJJRCA9ICc8JT1GcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCU+JzsKLSAgICAgIHRhYmxlQ29udGFpbmVySUQgKz0gc2VsZWN0Lm9wdGlvbnMoaSkudmFsdWU7Ci0gICAgICBzaG93VGFibGUodGFibGVDb250YWluZXJJRCwgc2VsZWN0Lm9wdGlvbnMoaSkuc2VsZWN0ZWQpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dUYWJsZSh0YWJsZUNvbnRhaW5lcklELCBzaG93KSB7Ci0gICAgdmFyIHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJRCk7Ci0gICAgaWYgKHNob3cpCi0gICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgZWxzZQotICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgfQotPC9zY3JpcHQ+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlblhTREluZm9EaWFsb2coJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb24uZ2V0SWQoKSxzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksZnJhZ0lELnRvU3RyaW5nKCkpKSklPicpIj48JT1mcmFnLmdldE5hbWUoKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPCUgCi0gICAgICBpZihlbGVtZW50RnJhZ21lbnQgIT0gbnVsbCAmJiBlbGVtZW50RnJhZ21lbnQuaXNOaWxsYWJsZSgpKXsKLSAgICAgICAgaWYoZWxlbWVudEZyYWdtZW50LmlzTmlsKCkpewotICAgICAgICAgICU+ICAKLSAgICAgICAgICA8dGQgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8JT0oKElYU0RFbGVtZW50RnJhZ21lbnQpZWxlbWVudEZyYWdtZW50KS5nZXROaWxJRCgpJT4iIHZhbHVlPSI8JT1JWFNERWxlbWVudEZyYWdtZW50Lk5JTF9WQUxVRSU+IiBjaGVja2VkPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0gCi0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iID48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX05JTCIpJT48L3RkPiAKLSAgICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgJT4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJyYW5nZWZyYWd0YWJsZSIgOiAiaW5uZXJyYW5nZWZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgbm93cmFwPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VOSU9OX1RZUEUiKSU+PC90aD4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiB3aWR0aD0iMTAwJSIgbm93cmFwPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VOSU9OX01FTUJFUlMiKSU+PC90aD4KLSAgPC90cj4KLSAgPCUKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb25bXSBtZW1iZXJUeXBlcyA9IGZyYWcuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gIElYU0RGcmFnbWVudFtdIG1lbWJlckZyYWdzID0gZnJhZy5nZXRBbGxGcmFnbWVudHMoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RDb25maWcuZ2V0TWF4T2NjdXJzKCk7IGkrKykgewotICAgIGludCB0eXBlU2VsZWN0aW9uSW5kZXggPSAwOwotICAgIFN0cmluZ1tdIG5ld01lbWJlckZyYWdJRHMgPSBuZXcgU3RyaW5nW21lbWJlclR5cGVzLmxlbmd0aF07Ci0gICAgSVhTREZyYWdtZW50W10gbmV3TWVtYmVyRnJhZ3MgPSBuZXcgSVhTREZyYWdtZW50W21lbWJlclR5cGVzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBtZW1iZXJUeXBlcy5sZW5ndGg7IGorKykgewotICAgICAgaWYgKGkgPCBtZW1iZXJGcmFncy5sZW5ndGggJiYgbWVtYmVyRnJhZ3NbaV0uZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRRTmFtZSgpLmVxdWFscyhtZW1iZXJUeXBlc1tqXS5nZXRRTmFtZSgpKSkgewotICAgICAgICBuZXdNZW1iZXJGcmFnSURzW2pdID0gbWVtYmVyRnJhZ3NbaV0uZ2V0SUQoKTsKLSAgICAgICAgbmV3TWVtYmVyRnJhZ3Nbal0gPSBtZW1iZXJGcmFnc1tpXTsKLSAgICAgICAgdHlwZVNlbGVjdGlvbkluZGV4ID0gajsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBuZXdNZW1iZXJGcmFnSURzW2pdID0gZnJhZy5jcmVhdGVVbmlvbkluc3RhbmNlKGopOwotICAgICAgICBuZXdNZW1iZXJGcmFnc1tqXSA9IGZyYWcuZ2V0RnJhZ21lbnQobmV3TWVtYmVyRnJhZ0lEc1tqXSk7Ci0gICAgICB9Ci0gICAgfQotICAgICU+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgPHNlbGVjdCBpZD0iPCU9ZnJhZy5nZXRJRCgpJT4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiBvbkNoYW5nZT0iamF2YXNjcmlwdDpjaGFuZ2VVbmlvbk1lbWJlclR5cGUodGhpcykiIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9VTklPTl9UWVBFIiklPiI+Ci0gICAgICAgICAgPCUKLSAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG1lbWJlclR5cGVzLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICBpZiAoayA9PSB0eXBlU2VsZWN0aW9uSW5kZXgpIHsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9bmV3TWVtYmVyRnJhZ0lEc1trXSU+IiBzZWxlY3RlZD48JT1tZW1iZXJUeXBlc1trXS5nZXRRTmFtZSgpJT4KLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1uZXdNZW1iZXJGcmFnSURzW2tdJT4iPjwlPW1lbWJlclR5cGVzW2tdLmdldFFOYW1lKCklPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAlPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICA8JQotICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IG1lbWJlclR5cGVzLmxlbmd0aDsgbCsrKSB7Ci0gICAgICAgICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgICAgICAgIGZyYWdJRC5hcHBlbmQobmV3TWVtYmVyRnJhZ0lEc1tsXSk7Ci0gICAgICAgICAgU3RyaW5nIG1lbWJlclRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChuZXdNZW1iZXJGcmFnc1tsXS5nZXRJRCgpKS50b1N0cmluZygpOwotICAgICAgICAlPgotICAgICAgICA8c3BhbiBpZD0iPCU9bWVtYmVyVGFibGVDb250YWluZXJJRCU+Ij4KLSAgICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9bmV3TWVtYmVyRnJhZ3NbbF0uZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDwvc3Bhbj4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgc2hvd1RhYmxlKCc8JT1tZW1iZXJUYWJsZUNvbnRhaW5lcklEJT4nLCA8JT0obCA9PSB0eXBlU2VsZWN0aW9uSW5kZXgpJT4pOwotICAgICAgICA8L3NjcmlwdD4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8JQotICB9Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uUkZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvblJGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjFmZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uUkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIG9wZXJOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClvcGVyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQgZnJhZyA9IChJWFNEU2ltcGxlVW5pb25GcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGZyYWcuZ2V0QWxsRnJhZ21lbnRzKCk7Ci0lPgotPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotPCUKLWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRGcmFncy5sZW5ndGg7IGkrKykgewotICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gIGZyYWdJRC5hcHBlbmQoY2hpbGRGcmFnc1tpXS5nZXRJRCgpKTsKLSU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9Y2hpbGRGcmFnc1tpXS5nZXRSZWFkRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08JQotfQotJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVW5pb25SYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVW5pb25SYW5nZVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjExMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uUmFuZ2VXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImVsZW1lbnRJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RTaW1wbGVVbmlvbkZyYWdtZW50IGZyYWcgPSAoSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLUlYU0RFbGVtZW50RnJhZ21lbnQgZWxlbWVudEZyYWdtZW50ID0gKElYU0RFbGVtZW50RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGVsZW1lbnRJRC50b1N0cmluZygpKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgbmFtZUFuY2hvcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuTkFNRV9BTkNIT1JfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBjaGFuZ2VVbmlvbk1lbWJlclR5cGUoc2VsZWN0KSB7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIHRhYmxlQ29udGFpbmVySUQgPSAnPCU9RnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQlPic7Ci0gICAgICB0YWJsZUNvbnRhaW5lcklEICs9IHNlbGVjdC5vcHRpb25zKGkpLnZhbHVlOwotICAgICAgc2hvd1RhYmxlKHRhYmxlQ29udGFpbmVySUQsIHNlbGVjdC5vcHRpb25zKGkpLnNlbGVjdGVkKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93VGFibGUodGFibGVDb250YWluZXJJRCwgc2hvdykgewotICAgIHZhciB0YWJsZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlQ29udGFpbmVySUQpOwotICAgIGlmIChzaG93KQotICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIGVsc2UKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gIH0KLTwvc2NyaXB0PgotPGEgbmFtZT0iPCU9bmFtZUFuY2hvcklEJT4iLz4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUlPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8JSAKLSAgICAgIGlmKGVsZW1lbnRGcmFnbWVudCAhPSBudWxsICYmIGVsZW1lbnRGcmFnbWVudC5pc05pbGxhYmxlKCkpewotICAgICAgICBpZihlbGVtZW50RnJhZ21lbnQuaXNOaWwoKSl7Ci0gICAgICAgICAgJT4gIAotICAgICAgICAgIDx0ZCB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IjwlPSgoSVhTREVsZW1lbnRGcmFnbWVudCllbGVtZW50RnJhZ21lbnQpLmdldE5pbElEKCklPiIgdmFsdWU9IjwlPUlYU0RFbGVtZW50RnJhZ21lbnQuTklMX1ZBTFVFJT4iIGNoZWNrZWQ+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9OSUwiKSU+PC90ZD4gCi0gICAgICAgICAgPCUKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAlPiAgCi0gICAgICAgICAgPHRkIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPCU9KChJWFNERWxlbWVudEZyYWdtZW50KWVsZW1lbnRGcmFnbWVudCkuZ2V0TmlsSUQoKSU+IiB2YWx1ZT0iPCU9SVhTREVsZW1lbnRGcmFnbWVudC5OSUxfVkFMVUUlPiIgPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTklMIiklPjwvdGQ+IAotICAgICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAlPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZUluc3RhbmNlKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPiwgJzwlPWZyYWdJRCU+JywgJzwlPW5hbWVBbmNob3JJRCU+JykiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNoZWNrTWluT2NjdXJzQW5kUmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWluT2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJRCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5JT05fVFlQRSIpJT48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5JT05fTUVNQkVSUyIpJT48L3RoPgotICA8L3RyPgotICA8JQotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbltdIG1lbWJlclR5cGVzID0gZnJhZy5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgSVhTREZyYWdtZW50W10gbWVtYmVyRnJhZ3MgPSBmcmFnLmdldEFsbEZyYWdtZW50cygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlckZyYWdzLmxlbmd0aCB8fCBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSAgICBpbnQgdHlwZVNlbGVjdGlvbkluZGV4ID0gMDsKLSAgICBTdHJpbmdbXSBuZXdNZW1iZXJGcmFnSURzID0gbmV3IFN0cmluZ1ttZW1iZXJUeXBlcy5sZW5ndGhdOwotICAgIElYU0RGcmFnbWVudFtdIG5ld01lbWJlckZyYWdzID0gbmV3IElYU0RGcmFnbWVudFttZW1iZXJUeXBlcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgIGlmIChpIDwgbWVtYmVyRnJhZ3MubGVuZ3RoICYmIG1lbWJlckZyYWdzW2ldLmdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0UU5hbWUoKS5lcXVhbHMobWVtYmVyVHlwZXNbal0uZ2V0UU5hbWUoKSkpIHsKLSAgICAgICAgbmV3TWVtYmVyRnJhZ0lEc1tqXSA9IG1lbWJlckZyYWdzW2ldLmdldElEKCk7Ci0gICAgICAgIG5ld01lbWJlckZyYWdzW2pdID0gbWVtYmVyRnJhZ3NbaV07Ci0gICAgICAgIHR5cGVTZWxlY3Rpb25JbmRleCA9IGo7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbmV3TWVtYmVyRnJhZ0lEc1tqXSA9IGZyYWcuY3JlYXRlVW5pb25JbnN0YW5jZShqKTsKLSAgICAgICAgbmV3TWVtYmVyRnJhZ3Nbal0gPSBmcmFnLmdldEZyYWdtZW50KG5ld01lbWJlckZyYWdJRHNbal0pOwotICAgICAgfQotICAgIH0KLSAgICAlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlUm93Q2hlY2tib3hDbGljaygpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICA8c2VsZWN0IGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIG9uQ2hhbmdlPSJqYXZhc2NyaXB0OmNoYW5nZVVuaW9uTWVtYmVyVHlwZSh0aGlzKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1VOSU9OX1RZUEUiKSU+Ij4KLSAgICAgICAgICA8JQotICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgIGlmIChrID09IHR5cGVTZWxlY3Rpb25JbmRleCkgewotICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1uZXdNZW1iZXJGcmFnSURzW2tdJT4iIHNlbGVjdGVkPjwlPW1lbWJlclR5cGVzW2tdLmdldFFOYW1lKCklPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPW5ld01lbWJlckZyYWdJRHNba10lPiI+PCU9bWVtYmVyVHlwZXNba10uZ2V0UU5hbWUoKSU+Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgICU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgIDwlCi0gICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBsKyspIHsKLSAgICAgICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICAgICAgZnJhZ0lELmFwcGVuZChuZXdNZW1iZXJGcmFnSURzW2xdKTsKLSAgICAgICAgICBTdHJpbmcgbWVtYmVyVGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKG5ld01lbWJlckZyYWdzW2xdLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICU+Ci0gICAgICAgIDxzcGFuIGlkPSI8JT1tZW1iZXJUYWJsZUNvbnRhaW5lcklEJT4iPgotICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1uZXdNZW1iZXJGcmFnc1tsXS5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgICAgPC9zcGFuPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICBzaG93VGFibGUoJzwlPW1lbWJlclRhYmxlQ29udGFpbmVySUQlPicsIDwlPShsID09IHR5cGVTZWxlY3Rpb25JbmRleCklPik7Ci0gICAgICAgIDwvc2NyaXB0PgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+Ci08L3NwYW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvaW52b2tlX3dzZGxfb3BlcmF0aW9uX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9pbnZva2Vfd3NkbF9vcGVyYXRpb25fZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDU1OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9pbnZva2Vfd3NkbF9vcGVyYXRpb25fZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL2ludm9rZV93c2RsX29wZXJhdGlvbl9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL2ludm9rZV93c2RsX29wZXJhdGlvbl9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmM0MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9pbnZva2Vfd3NkbF9vcGVyYXRpb25faGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9vcGVuX3dzZGxfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL29wZW5fd3NkbF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmYTgxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL29wZW5fd3NkbF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvb3Blbl93c2RsX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvb3Blbl93c2RsX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1NWJhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL29wZW5fd3NkbF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL3dzZGxfYmluZGluZ19ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvd3NkbF9iaW5kaW5nX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTM4NmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvd3NkbF9iaW5kaW5nX25vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy93c2RsX29wZXJhdGlvbl9ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvd3NkbF9vcGVyYXRpb25fbm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTFiYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy93c2RsX29wZXJhdGlvbl9ub2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvd3NkbF9zZXJ2aWNlX25vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy93c2RsX3NlcnZpY2Vfbm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDA4YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy93c2RsX3NlcnZpY2Vfbm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3NjcmlwdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmphdmEKLSouY2xhc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zY3JpcHRzL2ZyYWdtZW50dGFibGVzLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zY3JpcHRzL2ZyYWdtZW50dGFibGVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwY2RjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy9mcmFnbWVudHRhYmxlcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2NhbGVuZGFyYnJvd3Nlci5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci0KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSU+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgeHNkSW5mb0RpYWxvZzsKLSAgdmFyIHhzZEluZm9EaWFsb2dDbG9zZWQgPSB0cnVlOwotICB2YXIgcm93Q2hlY2tib3hOYW1lID0gInJvd0NoZWNrYm94TmFtZSI7Ci0gIHZhciB1bmJvdW5kZWQgPSA8JT1GcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQlPjsKLQotICBmdW5jdGlvbiBjaGVja01heE9jY3Vyc1JlYWNoZWQodGFibGVDb250YWluZXJJRCwgbWF4T2NjdXJzKSB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJRCk7Ci0gICAgaWYgKG1heE9jY3VycyAhPSB1bmJvdW5kZWQgJiYgKHRhYmxlLnJvd3MubGVuZ3RoIC0gbnVtYmVyT2ZIZWFkZXJSb3dzKSA+PSBtYXhPY2N1cnMpIHsKLSAgICAgIGFsZXJ0KCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQVhfT0NDVVJTX1ZJT0xBVElPTiIpKSU+Iik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZnVuY3Rpb24gY2hlY2tNaW5PY2N1cnNBbmRSZW1vdmVTZWxlY3RlZFJvd3ModGFibGVDb250YWluZXJJRCwgbWluT2NjdXJzKSB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIHJvd3NMZW5ndGggPSB0YWJsZS5yb3dzLmxlbmd0aCAtIG51bWJlck9mSGVhZGVyUm93czsKLSAgICB2YXIgY2hlY2tlZFJvd3MgPSAwOwotICAgIGZvciAodmFyIGkgPSBudW1iZXJPZkhlYWRlclJvd3M7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgdGFibGVSb3cgPSB0YWJsZS5yb3dzW2ldOwotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGVSb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBjaGVja2VkUm93cysrOwotICAgIH0KLSAgICBpZiAoY2hlY2tlZFJvd3MgPT0gMCkKLSAgICAgIGFsZXJ0KCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIikpJT4iKTsKLSAgICBlbHNlIGlmICgocm93c0xlbmd0aCAtIGNoZWNrZWRSb3dzKSA8IG1pbk9jY3VycykKLSAgICAgIGFsZXJ0KCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NSU5fT0NDVVJTX1ZJT0xBVElPTiIpKSU+Iik7Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlU2VsZWN0ZWRSb3dzKHRhYmxlQ29udGFpbmVySUQpOwotICB9Ci0gIAotICBmdW5jdGlvbiBjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkUm93c0F0dHJpYnV0ZSh0YWJsZUNvbnRhaW5lcklELCBtaW5PY2N1cnMpIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICB2YXIgcm93c0xlbmd0aCA9IHRhYmxlLnJvd3MubGVuZ3RoIC0gbnVtYmVyT2ZIZWFkZXJSb3dzOwotICAgIHZhciBjaGVja2VkUm93cyA9IDA7Ci0gICAgZm9yICh2YXIgaSA9IG51bWJlck9mSGVhZGVyUm93czsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciB0YWJsZVJvdyA9IHRhYmxlLnJvd3NbaV07Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZVJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGNoZWNrZWRSb3dzKys7Ci0gICAgfQotICAgIGlmIChjaGVja2VkUm93cyA9PSAwKQotICAgICAgYWxlcnQoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQiKSklPiIpOwotICAgIGVsc2UgaWYgKChyb3dzTGVuZ3RoIC0gY2hlY2tlZFJvd3MpIDwgbWluT2NjdXJzKQotICAgICAgYWxlcnQoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX01JTl9PQ0NVUlNfVklPTEFUSU9OIikpJT4iKTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVTZWxlY3RlZFJvd3NBdHRyaWJ1dGUodGFibGVDb250YWluZXJJRCk7Ci0gIH0KLSAgCi0gIAotICBmdW5jdGlvbiBjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkRGF0ZVRpbWVSb3dzKGNhbGVuZGFyVHlwZSx0YWJsZUNvbnRhaW5lcklELG1pbk9jY3VycykKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciBuZXdDYWxlbmRhclRhcmdldFJvdyA9IGNhbGVuZGFyVGFyZ2V0Um93OwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IGNvbHVtbnMuaXRlbSgwKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChpLW51bWJlck9mSGVhZGVyUm93cyA9PSBjYWxlbmRhclRhcmdldFJvdykKLSAgICAgICAgICBuZXdDYWxlbmRhclRhcmdldFJvdyA9IC0xOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3Q2FsZW5kYXJUYXJnZXRSb3ctLTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5ld0NhbGVuZGFyVGFyZ2V0Um93ID09IC0xKQotICAgICAgY2xvc2VDYWxlbmRhckJyb3dzZXIoKTsKLSAgICBjYWxlbmRhclRhcmdldFJvdyA9IG5ld0NhbGVuZGFyVGFyZ2V0Um93OwotICAgICAgCi0gICAgY2hlY2tNaW5PY2N1cnNBbmRSZW1vdmVTZWxlY3RlZFJvd3ModGFibGVDb250YWluZXJJRCxtaW5PY2N1cnMpOwotPCUKLSAgIC8vIEZpeCB0aGUgYnJvd3NlLi4uIGxpbmtzLgotJT4KLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgY29sdW1ucyA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgICB2YXIgZGF0ZVRpbWVUZXh0RmllbGQgPSBjb2x1bW5zLml0ZW0oMSkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIHNldERhdGVUaW1lQnJvd3NlTGlua0hyZWYoY29sdW1ucy5pdGVtKDIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIikuaXRlbSgwKSxjYWxlbmRhclR5cGUsZGF0ZVRpbWVUZXh0RmllbGQubmFtZSxpLW51bWJlck9mSGVhZGVyUm93cyk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodGFibGVDb250YWluZXJJRCwgbWF4T2NjdXJzLCBmcmFnbWVudElELCBuYW1lQW5jaG9ySUQpIHsKLSAgICBpZiAoY2hlY2tNYXhPY2N1cnNSZWFjaGVkKHRhYmxlQ29udGFpbmVySUQsIG1heE9jY3VycykpCi0gICAgICByZXR1cm47Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBuZXdDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIG5ld0NvbHVtbi5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1GcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9JRCU+IiwgZnJhZ21lbnRJRCkpOwotICAgIG5ld0NvbHVtbi5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1GcmFnbWVudENvbnN0YW50cy5OQU1FX0FOQ0hPUl9JRCU+IiwgbmFtZUFuY2hvcklEKSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKG5ld0NvbHVtbik7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gICAgdmFyIGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpOwotICAgIGZvcm1bMF0uYWN0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC9hY3Rpb25zL0NyZWF0ZUluc3RhbmNlQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgICBmb3JtWzBdLnN1Ym1pdCgpOwotICB9Ci0KLSAgZnVuY3Rpb24gb3BlblhTREluZm9EaWFsb2cobGluaykgewotICAgIHhzZEluZm9EaWFsb2cgPSB3aW5kb3cub3BlbihsaW5rLCAiWFNESW5mb3JtYXRpb25EaWFsb2ciLCAiaGVpZ2h0PTUwMCx3aWR0aD01MDAsc2Nyb2xsYmFycz1ubyxyZXNpemFibGU9eWVzIik7Ci0gICAgaWYgKHhzZEluZm9EaWFsb2cuZm9jdXMpCi0gICAgICB4c2RJbmZvRGlhbG9nLmZvY3VzKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBjbG9zZVhTREluZm9EaWFsb2coKQotICB7Ci0gICAgaWYgKCF4c2RJbmZvRGlhbG9nQ2xvc2VkKQotICAgICAgeHNkSW5mb0RpYWxvZy5jbG9zZSgpOwotICB9Ci0KLSAgZnVuY3Rpb24gc3luY2hyb25pemVGcmFnbWVudFZpZXdzKHZpZXdJRCkgewotICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKTsKLSAgICBpZiAodmlld0lEID09ICI8JT1GcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX1NXSVRDSF9GT1JNX1RPX1NPVVJDRSU+IikKLSAgICAgIGZvcm1bMF0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9RnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19JRCU+IiwiPCU9RnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfRk9STV9UT19TT1VSQ0UlPiIpKTsKLSAgICBlbHNlCi0gICAgICBmb3JtWzBdLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPUZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfSUQlPiIsIjwlPUZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNJT4iKSk7Ci0gICAgZm9ybVswXS5hY3Rpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgICBmb3JtWzBdLnN1Ym1pdCgpOwotICB9Ci0gIAotICBmdW5jdGlvbiBhZGRTaW1wbGVBdG9taWNEYXRlVGltZVJvd3MoY2FsZW5kYXJUeXBlLHRhYmxlQ29udGFpbmVySUQsaWQsbmFtZSx2YWx1ZSxtYXhPY2N1cnMpIHsKLSAgICBpZiAoY2hlY2tNYXhPY2N1cnNSZWFjaGVkKHRhYmxlQ29udGFpbmVySUQsIG1heE9jY3VycykpCi0gICAgICByZXR1cm47Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLQotICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgaW5wdXQudHlwZSA9ICJ0ZXh0IjsKLSAgICBpbnB1dC5pZCA9IGlkOwotICAgIGlucHV0Lm5hbWUgPSBuYW1lOwotICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCA+IDApCi0gICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlOwotICAgIGlucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChpbnB1dCk7Ci0gICAgCi0gICAgY29sdW1uMi5hcHBlbmRDaGlsZChjcmVhdGVEYXRlVGltZUJyb3dzZUxpbmsoY2FsZW5kYXJUeXBlLG5hbWUsdGFibGUucm93cy5sZW5ndGgtMSkpOwotICAgIGNvbHVtbjIud2lkdGggPSAiOTAlIjsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChuZXdSb3cpOwotICB9ICAKLSAgCi0gIGZ1bmN0aW9uIGNyZWF0ZURhdGVUaW1lQnJvd3NlTGluayhjYWxlbmRhclR5cGUsbmFtZSxwb3NpdGlvbikKLSAgewotICAgIHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldERhdGVUaW1lQnJvd3NlTGlua0hyZWYobGluayxjYWxlbmRhclR5cGUsbmFtZSxwb3NpdGlvbik7Ci0gICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0JST1dTRSIpKSU+IikpOwotICAgIHJldHVybiBsaW5rOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXREYXRlVGltZUJyb3dzZUxpbmtIcmVmKGxpbmssY2FsZW5kYXJUeXBlLG5hbWUscG9zaXRpb24pCi0gIHsKLSAgICBsaW5rLmhyZWYgPSAiamF2YXNjcmlwdDpvcGVuQ2FsZW5kYXJCcm93c2VyKCIrY2FsZW5kYXJUeXBlKyIsJ2NvbnRlbnRib3JkZXInLCciK25hbWUrIicsIitwb3NpdGlvbisiKSI7Ci0gICAgcmV0dXJuIGxpbms7Ci0gIH0KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3NjcmlwdHMvd3NkbGZyYW1lc2V0cy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy93c2RsZnJhbWVzZXRzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjMzg0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy93c2RsZnJhbWVzZXRzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldCgpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50LmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9BQ1RJT05TX0NPTlRBSU5FUiU+Il0uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZyYW1lc2V0IikuaXRlbSgwKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gcHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZnJhbWVzZXRTaXplc0Zvcm0pCi0gIHsKLSAgICB0b2dnbGVEb3VibGVDbGlja0NvbHVtblRpdGxlKCk7Ci0gICAgdmFyIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0ID0gZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQoKTsKLSAgICB2YXIgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0ID0gZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0KCk7Ci0gICAgZnJhbWVzZXRTaXplc0Zvcm0uPCU9V1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQlPi52YWx1ZSA9IHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0LmNvbHM7Ci0gICAgZnJhbWVzZXRTaXplc0Zvcm0uPCU9V1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSJT4udmFsdWUgPSBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQucm93czsKLSAgICBmcmFtZXNldFNpemVzRm9ybS5zdWJtaXQoKTsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1MDljMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIHdzZGxOYXZpZ2F0b3JDb250YWluZXIgPSBwZXJzcGVjdGl2ZUNvbnRlbnQuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX05BVklHQVRPUl9DT05UQUlORVIlPiJdOwotICB2YXIgd3NkbE5hdmlnYXRvclRvb2xiYXIgPSB3c2RsTmF2aWdhdG9yQ29udGFpbmVyLmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9OQVZJR0FUT1JfVE9PTEJBUiU+Il07Ci0gIHZhciB3c2RsTmF2aWdhdG9yQ29udGVudCA9IHdzZGxOYXZpZ2F0b3JDb250YWluZXIuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX05BVklHQVRPUl9DT05URU5UJT4iXTsKLSAgdmFyIHdzZGxBY3Rpb25zQ29udGFpbmVyID0gcGVyc3BlY3RpdmVDb250ZW50LmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9BQ1RJT05TX0NPTlRBSU5FUiU+Il07Ci0gIHZhciB3c2RsUHJvcGVydGllc0NvbnRhaW5lciA9IHdzZGxBY3Rpb25zQ29udGFpbmVyLmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX0NPTlRBSU5FUiU+Il07Ci0gIHZhciB3c2RsUHJvcGVydGllc1Rvb2xiYXIgPSB3c2RsUHJvcGVydGllc0NvbnRhaW5lci5mcmFtZXNbIjwlPVdTRExGcmFtZU5hbWVzLldTRExfUFJPUEVSVElFU19UT09MQkFSJT4iXTsKLSAgdmFyIHdzZGxQcm9wZXJ0aWVzQ29udGVudCA9IHdzZGxQcm9wZXJ0aWVzQ29udGFpbmVyLmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX0NPTlRFTlQlPiJdOwotICB2YXIgd3NkbFN0YXR1c0NvbnRhaW5lciA9IHdzZGxBY3Rpb25zQ29udGFpbmVyLmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHdzZGxTdGF0dXNUb29sYmFyID0gd3NkbFN0YXR1c0NvbnRhaW5lci5mcmFtZXNbIjwlPVdTRExGcmFtZU5hbWVzLldTRExfU1RBVFVTX1RPT0xCQVIlPiJdOwotICB2YXIgd3NkbFN0YXR1c0NvbnRlbnQgPSB3c2RsU3RhdHVzQ29udGFpbmVyLmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfQ09OVEVOVCU+Il07Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zb2FwX2VudmVsb3BlX3htbC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc29hcF9lbnZlbG9wZV94bWwuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWEwYjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zb2FwX2VudmVsb3BlX3htbC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT48JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC94bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiIgJT48anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz48JQotaW50IHNvYXBFbnZlbG9wZVR5cGUgPSBJbnRlZ2VyLnBhcnNlSW50KHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuU09BUF9FTlZFTE9QRV9UWVBFKSk7Ci1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLVNPQVBNZXNzYWdlUXVldWUgc29hcE1lc3NhZ2VRdWV1ZTsKLXN3aXRjaCAoc29hcEVudmVsb3BlVHlwZSkKLXsKLSAgY2FzZSBXU0RMQWN0aW9uSW5wdXRzLlNPQVBfRU5WRUxPUEVfVFlQRV9SRVFVRVNUOgotICAgIHNvYXBNZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0U09BUFJlcXVlc3RRdWV1ZSgpOwotICAgIGJyZWFrOwotICBjYXNlIFdTRExBY3Rpb25JbnB1dHMuU09BUF9FTlZFTE9QRV9UWVBFX1JFU1BPTlNFOgotICBkZWZhdWx0OgotICAgIHNvYXBNZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0U09BUFJlc3BvbnNlUXVldWUoKTsKLSAgICBicmVhazsKLX0KLVN0cmluZyBtZXNzYWdlcyA9IHNvYXBNZXNzYWdlUXVldWUuZ2V0TWVzc2FnZXNGcm9tTGlzdCgpOwotJT48JT1tZXNzYWdlcyU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzNkMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfYWN0aW9uc19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzZGxfcHJvcGVydGllc19jb250YWluZXIuanNwIiklPiIgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MSBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX3N0YXR1c19jb250YWluZXIuanNwIiklPiIgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MSBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX25hdmlnYXRvcl9jb250YWluZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjBkZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX25hdmlnYXRvcl90b29sYmFyLmpzcCIpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX0NPTlRFTlQlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCIpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9uYXZpZ2F0b3JfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9uYXZpZ2F0b3JfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDdlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfbmF2aWdhdG9yX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0lPiAgICAgIAotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3RyZWV2aWV3LmNzcyIpKSU+Ij4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3RyZWV2aWV3LmpzIikpJT4iPgotICAgIDwvc2NyaXB0PgotPC9oZWFkPgotPCUKLSAgICBTdHJpbmcgc2VsZWN0ZWRBbmNob3JOYW1lID0gIiI7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgaW50IGZvY3VzZWROb2RlSWQgPSBub2RlTWFuYWdlci5nZXRGb2N1c2VkTm9kZUlkKCk7Ci0gICAgU3RyaW5nIGZvY3VzZWRBbmNob3JOYW1lID0gU3RyaW5nLnZhbHVlT2YoZm9jdXNlZE5vZGVJZCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLSAgICAgICAgc2VsZWN0ZWRBbmNob3JOYW1lID0gc2VsZWN0ZWROb2RlLmdldEFuY2hvck5hbWUoKTsKLSAgICAgICAgaWYgKGZvY3VzZWROb2RlSWQgPT0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKQotICAgICAgICAgICAgZm9jdXNlZEFuY2hvck5hbWUgPSBzZWxlY3RlZEFuY2hvck5hbWU7Ci0gICAgfQotJT4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgb25Mb2FkPSJzZWxmLmxvY2F0aW9uLmhhc2g9JyM8JT1mb2N1c2VkQW5jaG9yTmFtZSU+JztzZXRTZWxlY3RlZEFuY2hvck5hbWUoJzwlPXNlbGVjdGVkQW5jaG9yTmFtZSU+JykiIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci0gICAgPGRpdiBpZD0idHJlZWNvbnRlbnRib3JkZXIiPgotICAgICAgICA8JT1ub2RlTWFuYWdlci5yZW5kZXJUcmVlVmlldyhyZXNwb25zZSklPgotICAgIDwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfbmF2aWdhdG9yX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfbmF2aWdhdG9yX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmM1MjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX25hdmlnYXRvcl90b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RsZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4gIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PiAgCi08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJ3c2RsL2FjdGlvbnMvUmVzaXplV1NETEZyYW1lc0FjdGlvbkpTUC5qc3AiKTsKLSU+ICAKLTwvanNwOnVzZUJlYW4+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUZyYW1lTmFtZS5hcHBlbmQoV1NETEZyYW1lTmFtZXMuV1NETF9OQVZJR0FUT1JfQ09OVEFJTkVSKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL2Zvcm1zL1Byb2Nlc3NXU0RMRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvbmF2aWdhdG9yLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLTwlCi0gICBTdHJpbmcgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IG51bGw7Ci0gICBpZiAod3NkbFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19SRVNUT1JFIik7Ci0gICBlbHNlCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkUiKTsKLSU+ICAgICAgICAKLSAgICAgICAgPHRkIGlkPSJkb3VibGVjbGlja2NvbHVtbiIgdGl0bGU9IjwlPWRvdWJsZUNsaWNrQ29sdW1uVGl0bGUlPiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTkFWSUdBVE9SIiklPjwvdGQ+Ci08JQotICAgU3RyaW5nIGFsdFJlZnJlc2ggPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9SRUZSRVNIIik7Ci0gICBTdHJpbmcgYWx0Q2xlYXIgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9DTEVBUiIpOwotJT4gICAgICAgICAgIAotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvYWN0aW9ucy9SZWZyZXNoV1NETEFjdGlvbkpTUC5qc3AiKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcykiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIiBhbHQ9IjwlPWFsdFJlZnJlc2glPiIgdGl0bGU9IjwlPWFsdFJlZnJlc2glPiI+PC9hPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC9hY3Rpb25zL0NsZWFyV1NETEFjdGlvbkpTUC5qc3AiKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTYgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKSIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiIGFsdD0iPCU9YWx0Q2xlYXIlPiIgdGl0bGU9IjwlPWFsdENsZWFyJT4iPjwvYT48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiODZjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGZyYW1lc2V0IGNvbHM9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSU+IiBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPCUKLSAgaWYgKG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmlzUlRMKCkpCi0gIHsKLSAgJT4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLldTRExfQUNUSU9OU19DT05UQUlORVIlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX2FjdGlvbnNfY29udGFpbmVyLmpzcCIpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NkbF9uYXZpZ2F0b3JfY29udGFpbmVyLmpzcCIpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPCUKLSAgfQotICBlbHNlCi0gIHsKLSAgJT4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NkbF9uYXZpZ2F0b3JfY29udGFpbmVyLmpzcCIpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLldTRExfQUNUSU9OU19DT05UQUlORVIlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX2FjdGlvbnNfY29udGFpbmVyLmpzcCIpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MT4KLSAgPCUKLSAgfQotICAlPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4ZTIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NkbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX0NPTlRFTlQlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzZlMzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotPCUKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXI7Ci0gICAgICAgIGlmIChzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZFRvb2wgIT0gbnVsbCAmJiBzZWxlY3RlZFRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKSB7Ci0gICAgICAgICU+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgbG9jYXRpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChzZWxlY3RlZFRvb2wuZ2V0Rm9ybUxpbmsoKSkpJT4iOwotICAgICAgICA8L3NjcmlwdD4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0FDVElPTl9TRUxFQ1RFRCIpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAlPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fTk9ERV9TRUxFQ1RFRCIpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLSAgICA8JQotICAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODgyYzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RsZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4gIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgid3NkbC9hY3Rpb25zL1Jlc2l6ZVdTRExGcmFtZXNBY3Rpb25KU1AuanNwIik7Ci0lPiAgCi08L2pzcDp1c2VCZWFuPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1GcmFtZU5hbWUuYXBwZW5kKFdTRExGcmFtZU5hbWVzLldTRExfUFJPUEVSVElFU19DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvUHJvY2Vzc1dTRExGcmFtZXNldHNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0yNSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9hY3Rpb25zLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLTwlCi0gICBTdHJpbmcgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IG51bGw7Ci0gICBpZiAod3NkbFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpLmVuZHNXaXRoKCIxMDAlIikpCi0gICB7Ci0gICAgIGlmICh3c2RsUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKTsKLSAgIH0KLSAgIGlmIChkb3VibGVDbGlja0NvbHVtblRpdGxlID09IG51bGwpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkUiKTsKLSU+ICAgICAgICAKLSAgICAgICAgPHRkIGlkPSJkb3VibGVjbGlja2NvbHVtbiIgdGl0bGU9IjwlPWRvdWJsZUNsaWNrQ29sdW1uVGl0bGUlPiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfQUNUSU9OUyIpJT48L3RkPgotPCUKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyOwotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sTWFuYWdlcigpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTx0b29sTWFuYWdlci5nZXROdW1iZXJPZlRvb2xzKCk7IGkrKykgewotICAgICAgICAgICAgVG9vbCB0b29sID0gKFRvb2wpdG9vbE1hbmFnZXIuZ2V0VG9vbChpKTsKLSAgICAgICAgICAgICU+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjwlPXRvb2wucmVuZGVyVG9vbChyZXNwb25zZSxjb250cm9sbGVyKSU+PC90ZD4KLSAgICAgICAgICAgIDwlCi0gICAgICAgIH0KLSAgICB9Ci0lPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfcmVzdWx0X2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfcmVzdWx0X2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGU3OWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Jlc3VsdF9jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICBpbnQgdmlld0lEID0gd3NkbFBlcnNwZWN0aXZlLmdldFN0YXR1c0NvbnRlbnRUeXBlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHN3aXRjaFJlYWRPbmx5RnJhZ21lbnRzVmlldygpIHsKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC9hY3Rpb25zL1N3aXRjaFJlYWRPbmx5RnJhZ21lbnRWaWV3c0FjdGlvbkpTUC5qc3AiKSklPiI7Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGFsaWduPSJyaWdodCIgY2xhc3M9ImxhYmVscyI+Ci08JQotICAgICAgICBpZiAodmlld0lEID09IHdzZGxQZXJzcGVjdGl2ZS5TVEFUVVNfQ09OVEVOVF9SRVNVTFRfU09VUkNFKQotICAgICAgICB7ICAgICAKLSU+Ci0gICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzd2l0Y2hSZWFkT25seUZyYWdtZW50c1ZpZXcoKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1dJVENIX1RPX0ZPUk1fVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRk9STSIpJT48L2E+Ci08JQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotJT4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnN3aXRjaFJlYWRPbmx5RnJhZ21lbnRzVmlldygpIiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TV0lUQ0hfVE9fU09VUkNFX1ZJRVciKSU+Ij48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1NPVVJDRSIpJT48L2E+Ci08JQotICAgICAgICB9Ci0lPiAgIAotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUKLSAgaWYgKHZpZXdJRCA9PSB3c2RsUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX1NPVVJDRSkKLSAgewotJT4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvUmVhZE9ubHlGcmFnbWVudHNTb2FwVmlldy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICB9Ci0gIGVsc2UKLSAgewotJT4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvUmVhZE9ubHlGcmFnbWVudHNGb3JtVmlldy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9zdGF0dXNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDNhY2VmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyBzdGF0dXNDb250ZW50U3JjID0gIndzZGxfc3RhdHVzX2NvbnRlbnQuanNwIjsKLSAgIHN3aXRjaCAod3NkbFBlcnNwZWN0aXZlLmdldFN0YXR1c0NvbnRlbnRUeXBlKCkpCi0gICB7Ci0gICAgIGNhc2UgV1NETFBlcnNwZWN0aXZlLlNUQVRVU19DT05URU5UX1JFU1VMVF9GT1JNOgotICAgICAgIHN0YXR1c0NvbnRlbnRTcmMgPSAid3NkbF9yZXN1bHRfY29udGVudC5qc3AiOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFdTRExQZXJzcGVjdGl2ZS5TVEFUVVNfQ09OVEVOVF9SRVNVTFRfU09VUkNFOgotICAgICAJc3RhdHVzQ29udGVudFNyYyA9ICJ3c2RsX3Jlc3VsdF9jb250ZW50LmpzcCI7Ci0gICAgIAlicmVhazsKLSAgIH0KLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfVE9PTEJBUiU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzZGxfc3RhdHVzX3Rvb2xiYXIuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfQ09OVEVOVCU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoc3RhdHVzQ29udGVudFNyYyklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzZWIyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNyAgIDEyNzQ0MyBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotCW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgd3NkbFBlcnNwZWN0aXZlLnNldFN0YXR1c0NvbnRlbnRUeXBlKFdTRExQZXJzcGVjdGl2ZS5TVEFUVVNfQ09OVEVOVF9ERUZBVUxUKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPHByZT4KLTwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3Qod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmdldE1lc3NhZ2VzRnJvbUxpc3QoKSklPgotICAgICAgICA8L3ByZT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfc3RhdHVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfc3RhdHVzX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTE2NGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c190b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgid3NkbC9hY3Rpb25zL1Jlc2l6ZVdTRExGcmFtZXNBY3Rpb25KU1AuanNwIik7Ci0lPiAgCi08L2pzcDp1c2VCZWFuPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1GcmFtZU5hbWUuYXBwZW5kKFdTRExGcmFtZU5hbWVzLldTRExfU1RBVFVTX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9mb3Jtcy9Qcm9jZXNzV1NETEZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3N0YXR1cy5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci08JQotICAgU3RyaW5nIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBudWxsOwotICAgaWYgKHdzZGxQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgewotICAgICBpZiAod3NkbFBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgfQotICAgaWYgKGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPT0gbnVsbCkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9TVEFUVVMiKSU+PC90ZD4KLTwlCi0gICBTdHJpbmcgYWx0Q2xlYXIgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9DTEVBUiIpOwotJT4gICAgICAgICAgIAotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiIgdGFyZ2V0PSI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX1NUQVRVU19DT05URU5UJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTYgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKSIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiIGFsdD0iPCU9YWx0Q2xlYXIlPiIgdGl0bGU9IjwlPWFsdENsZWFyJT4iPjwvYT48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsX2Jyb3dzZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsX2Jyb3dzZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzZiZjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbF9icm93c2VyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC4qIiAlPgotCi08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIFN0cmluZyB3c2RsVHlwZVN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5XU0RMX1RZUEUpOwotICAgaW50IHdzZGxUeXBlID0gQWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRTsKLSAgIHRyeQotICAgewotICAgICB3c2RsVHlwZSA9IEludGVnZXIucGFyc2VJbnQod3NkbFR5cGVTdHJpbmcpOwotICAgfQotICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgewotICAgfQotICAgY29udHJvbGxlci5zZXRXU0RMVHlwZSh3c2RsVHlwZSk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+Ci08JQotICAgU3RyaW5nIHdzZGxTb3VyY2U7Ci0gICBpZiAod3NkbFR5cGUgPT0gQWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSkKLSAgICAgd3NkbFNvdXJjZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiV1NETF9UWVBFX1NFUlZJQ0VfSU5URVJGQUNFUyIpOwotICAgZWxzZQotICAgICB3c2RsU291cmNlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJXU0RMX1RZUEVfU0VSVklDRVMiKTsKLSAgICAgCi0gICBTdHJpbmdCdWZmZXIgc2Vzc2lvbklkUGFyYW0gPSBuZXcgU3RyaW5nQnVmZmVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgc2Vzc2lvbklkUGFyYW0uYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCk7Ci0gICAKLSAgIFN0cmluZ0J1ZmZlciB0b29sYmFyTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGxfdG9vbGJhci5qc3A/Iik7Ci0gICB0b29sYmFyTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCk7Ci0lPgotICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiVElUTEVfV1NETF9CUk9XU0VSIix3c2RsU291cmNlKSU+Ci0gIDwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgcm93cz0iMzMsKiIgYm9yZGVyPTAgYmdjb2xvcj0iI0VDRTlEOCI+Ci0gIDxmcmFtZSBuYW1lPSI8JT1GcmFtZU5hbWVzLldTRExfVE9PTEJBUiU+IiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9XU0RMX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh0b29sYmFyTGluay50b1N0cmluZygpKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9RnJhbWVOYW1lcy5XU0RMX0NPTlRFTlQlPiIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfV1NETF9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUHJveHlMb2FkUGFnZUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb25JZCwid3NkbF9jb250ZW50LmpzcCIpKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbF9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbF9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyNmZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGxfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTcgICAxMjc0NTYgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqIDIwMDYwNTI0ICAgMTQyNDk5IGplZmZsaXVAY2EuaWJtLmNvbSAtIEplZmZyZXkgTGl1Ci0gKiAyMDA3MDEwOSAgIDE2OTU1MyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1hawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyLldlYlNlcnZpY2VGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2ZpbmRlci5XZWJTZXJ2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuZXh0ZW5zaW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC4qIiAlPgotCi08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIGludCB3c2RsVHlwZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFR5cGUoKTsKLSAgIAotICAgVmVjdG9yIHdzSW5mb0NhY2hlID0gbmV3IFZlY3RvcigpOwotICAgaW50IHdvcmtzcGFjZVN0YXJ0ID0gLTE7Ci0gICBpbnQgd29ya3NwYWNlRW5kICAgPSAtMTsKLSAgIAotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfV1NETF9DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcyIpKSU+Ij4KLTwvc2NyaXB0PiAgCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgCi0gIAotICBmdW5jdGlvbiBmaWxsQ2F0ZWdvcmllcygpCi0gIHsKLSAgICB2YXIgeSA9IDA7Ci0gICAgdmFyIHggPSAwOwotICAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuQ0FURUdPUlklPi5vcHRpb25zW3grK10gPSBuZXcgT3B0aW9uKCI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9BbGwiKSU+IiwiPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfQWxsIiklPiIpOwotICAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuQ0FURUdPUlklPi5vcHRpb25zW3grK10gPSBuZXcgT3B0aW9uKCI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfRkFWT1JJVEVTIiklPiIsIjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVMiKSU+Iik7Ci08JQotICAgewotICAgICBXZWJTZXJ2aWNlQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gV2ViU2VydmljZUZpbmRlci5pbnN0YW5jZSgpLmdldFdlYlNlcnZpY2VDYXRlZ29yaWVzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGNhdGVnb3JpZXMubGVuZ3RoO2krKykKLSAgICAgewotICAgICAgIFN0cmluZyBsYWJlbCA9IEhUTUxVdGlscy5KU01hbmdsZShjYXRlZ29yaWVzW2ldLmdldExhYmVsKCkpOwotICAgICAgIGlmKGNhdGVnb3JpZXNbaV0uZ2V0SWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2ZpbmRlci5jYXRlZ29yeS53b3Jrc3BhY2UiKSl7Ci0lPgotICAgIHZhciB5ID0geDsKLTwlICAgIAotICAgICAgIH0gICAgCi0lPiAgICAKLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuQ0FURUdPUlklPi5vcHRpb25zW3grK10gPSBuZXcgT3B0aW9uKCI8JT1sYWJlbCU+IiwiPCU9bGFiZWwlPiIpOwotPCUgICAgICAgCi0gICAgIH0KLSAgIH0gCi0lPgotICAgIGlmIChkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuQ0FURUdPUlklPi5vcHRpb25zLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9QWN0aW9uSW5wdXRzLkNBVEVHT1JZJT4ub3B0aW9uc1t5XS5zZWxlY3RlZCA9IHRydWU7Ci0gICAgICBmaWxsV1NETEZpbGVzQnlDYXRlZ29yeShkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuQ0FURUdPUlklPi5vcHRpb25zW3ldLnZhbHVlKTsKLSAgICB9Ci0gIAotICB9ICAgIAotICAKLSAgZnVuY3Rpb24gZmlsbFdlYlByb2plY3RzKCkKLSAgewotICAgIHZhciB4ID0gMDsKLTwlCi0gICB7Ci0gICAgIElXb3Jrc3BhY2VSb290IGlXb3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IGlXb3Jrc3BhY2VSb290LmdldFByb2plY3RzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHByb2plY3RzLmxlbmd0aDtpKyspCi0gICAgIHsKLSAgICAgICBpZiAoIXByb2plY3RzW2ldLmlzT3BlbigpKQotICAgICAgICAgY29udGludWU7Ci0gICAgICAgU3RyaW5nIG5hbWUgPSBIVE1MVXRpbHMuSlNNYW5nbGUocHJvamVjdHNbaV0uZ2V0TmFtZSgpKTsKLSU+Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9QWN0aW9uSW5wdXRzLlBST0pFQ1QlPi5vcHRpb25zW3grK10gPSBuZXcgT3B0aW9uKCI8JT1uYW1lJT4iLCI8JT1uYW1lJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci0gICAgaWYgKGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5QUk9KRUNUJT4ub3B0aW9ucy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5QUk9KRUNUJT4ub3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7Ci0gICAgICBmaWxsV1NETEZpbGVzKGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5QUk9KRUNUJT4ub3B0aW9uc1swXS52YWx1ZSk7Ci0gICAgfQotICB9Ci0KLTwlISBwcml2YXRlIFZlY3RvciB3c2RsVVJMc18gPSBuZXcgVmVjdG9yKCk7ICU+Ci0KLSAgIGZ1bmN0aW9uIGZpbGxXU0RMRmlsZXNCeUNhdGVnb3J5KHdlYlNlcnZpY2VGaW5kZXJMYWJlbCkKLSAgIHsKLSAgICB2YXIgY3VycmVudE51bWJlck9mT3B0aW9ucyA9IGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4ub3B0aW9ucy5sZW5ndGg7Ci0gICAgZm9yICh2YXIgaT0wO2k8Y3VycmVudE51bWJlck9mT3B0aW9ucztpKyspCi0gICAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCU+Lm9wdGlvbnNbMF0gPSBudWxsOwotICAgIGlmICh3ZWJTZXJ2aWNlRmluZGVyTGFiZWwgPT0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9BbGwiKSklPiIpewotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2plY3RzIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsgCi0gICAgICBmaWxsQWxsV1NETEZpbGVzKCk7Ci0gICAgfQotICAgIGlmICh3ZWJTZXJ2aWNlRmluZGVyTGFiZWwgPT0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfRkFWT1JJVEVTIikpJT4iKXsKLSAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9qZWN0cyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7IAotICAgICAgZmlsbEZhdm9yaXRlV1NETEZpbGVzKCk7Ci0gICAgfQotICAgIAotPCUKLSAgIHsKLSAgICAgICAgIAotICAgICBXZWJTZXJ2aWNlRmluZGVyIGZpbmRlciA9IFdlYlNlcnZpY2VGaW5kZXIuaW5zdGFuY2UoKTsKLSAgICAgV2ViU2VydmljZUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IGZpbmRlci5nZXRXZWJTZXJ2aWNlQ2F0ZWdvcmllcygpOwotICAgICBmb3IgKGludCBpPTA7aTxjYXRlZ29yaWVzLmxlbmd0aDtpKyspCi0gICAgIHsKLSAgICAgICBXZWJTZXJ2aWNlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzW2ldOwotJT4KLSAgICBpZiAod2ViU2VydmljZUZpbmRlckxhYmVsID09ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY2F0ZWdvcnkuZ2V0TGFiZWwoKSklPiIpCi0gICAgewotICAgIHZhciB4ID0gMDsKLSAgICAgICAgCi08JQotICAgICAgIEl0ZXJhdG9yIGl0ID0gZmluZGVyLmdldFdlYlNlcnZpY2VzQnlDYXRlZ29yeShjYXRlZ29yeSxudWxsKTsKLSAgICAgICBpZihjYXRlZ29yeS5nZXRJZCgpLmVxdWFscygib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyLmNhdGVnb3J5LndvcmtzcGFjZSIpKXsKLQotICAgIAkgICB3b3Jrc3BhY2VTdGFydCA9IHdzSW5mb0NhY2hlLnNpemUoKTsKLSAgICAJICAgd29ya3NwYWNlRW5kICAgPSB3b3Jrc3BhY2VTdGFydDsKLSAgICAJICAgCi0gICAgCSAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgCSAgIHdzSW5mb0NhY2hlLmFkZChpdC5uZXh0KCkpOwotICAgICAgICAJICAgd29ya3NwYWNlRW5kKys7Ci0gICAgCSAgIH0KLSU+Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvamVjdHMiKS5zdHlsZS5kaXNwbGF5ID0gIiI7IAotICAgICAgZmlsbFdlYlByb2plY3RzKCk7Ci08JQotICAgICAgIH0KLSAgICAgICBlbHNlewotJT4KLSAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9qZWN0cyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICAKLTwlICAKLSAgICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgV2ViU2VydmljZUluZm8gd3NpID0gKFdlYlNlcnZpY2VJbmZvKWl0Lm5leHQoKTsKLSAgICAgICAgICAgU3RyaW5nIHdzZGwgPSBIVE1MVXRpbHMuSlNNYW5nbGUod3NpLmdldFdzZGxVUkwoKSk7Ci0lPgotICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dFQlBST0pFQ1RfV1NETF9VUkwlPi5vcHRpb25zW3grK10gPSBuZXcgT3B0aW9uKCI8JT13c2RsJT4iLCAiPCU9d3NkbCU+Iik7IAotPCUKLSAgICAgICAgICAgd3NJbmZvQ2FjaGUuYWRkKHdzaSk7Ci0gICAgICAgICB9Ci0gICAgICAgfQotJT4KLSAgICB9Ci08JQotICAgICB9Ci0gICB9Ci0lPgotICB9Ci0gIAotICBmdW5jdGlvbiBmaWxsQWxsV1NETEZpbGVzKCkKLSAgewotICAgIHZhciB4ID0gMDsKLSAgICB2YXIgY3VycmVudE51bWJlck9mT3B0aW9ucyA9IGRvY3VtZW50LmZvcm1zWzBdLndlYlByb2plY3RXU0RMVVJMLm9wdGlvbnMubGVuZ3RoOwotICAgIGZvciAodmFyIGk9MDtpPGN1cnJlbnROdW1iZXJPZk9wdGlvbnM7aSsrKQotICAgICAgZG9jdW1lbnQuZm9ybXNbMF0ud2ViUHJvamVjdFdTRExVUkwub3B0aW9uc1swXSA9IG51bGw7Ci08JQotICAgICBUcmVlU2V0IHVybHMgPSBuZXcgVHJlZVNldCgpOwotICAgICBJdGVyYXRvciB3c0l0ZXJhdG9yID0gd3NJbmZvQ2FjaGUuaXRlcmF0b3IoKTsKLSAgICAgd2hpbGUgKHdzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICB7Ci0gICAgICAgV2ViU2VydmljZUluZm8gd3NJbmZvID0gKFdlYlNlcnZpY2VJbmZvKXdzSXRlcmF0b3IubmV4dCgpOwotICAgICAgIFN0cmluZyB3c2RsID0gSFRNTFV0aWxzLkpTTWFuZ2xlKHdzSW5mby5nZXRXc2RsVVJMKCkpOwotICAgICAgIHVybHMuYWRkKHdzZGwpOwotICAgICB9Ci0gICAgIAotICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZvcml0ZXNQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgTm9kZU1hbmFnZXIgZmF2b3JpdGVzTm9kZU1hbmFnZXIgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICBUcmVlRWxlbWVudCBmYXZvcml0ZXNNYWluRWxlbWVudCA9IGZhdm9yaXRlc05vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgVHJlZUVsZW1lbnQgZmF2b3JpdGVXU0RMU2VydmljZXNFbGVtZW50ID0gKFRyZWVFbGVtZW50KShmYXZvcml0ZXNNYWluRWxlbWVudC5nZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFKS5uZXh0RWxlbWVudCgpKTsKLSAgICAgRW51bWVyYXRpb24gZmF2b3JpdGVXU0RMU2VydmljZUVsZW1lbnRzID0gZmF2b3JpdGVXU0RMU2VydmljZXNFbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfTk9ERSk7Ci0gICAgIHdoaWxlIChmYXZvcml0ZVdTRExTZXJ2aWNlRWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgIHsKLSAgICAgICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgZmF2b3JpdGVXU0RMU2VydmljZUVsZW1lbnQgPSAoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KWZhdm9yaXRlV1NETFNlcnZpY2VFbGVtZW50cy5uZXh0RWxlbWVudCgpOwotICAgICAgIFN0cmluZyB3c2RsID0gSFRNTFV0aWxzLkpTTWFuZ2xlKChmYXZvcml0ZVdTRExTZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlKCkuZ2V0RGVzY3JpcHRpb25zKCkpWzBdLmdldExvY2F0aW9uKCkpOwotICAgICAgIHVybHMuYWRkKHdzZGwpOwotICAgICB9Ci0gICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdXJscy5pdGVyYXRvcigpOwotICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotICAgICAgIFN0cmluZyB3c2RsID0gSFRNTFV0aWxzLkpTTWFuZ2xlKGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpKTsKLSU+Ci0gICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4ub3B0aW9uc1t4KytdID0gbmV3IE9wdGlvbigiPCU9d3NkbCU+IiwgIjwlPXdzZGwlPiIpOyAKLTwlCi0KLSAgICAgfQotICAgCi0lPiAgICAgIAotICB9Ci0gIAotICBmdW5jdGlvbiBmaWxsV1NETEZpbGVzKHNlbGVjdGVkV2ViUHJvamVjdE5hbWUpCi0gIHsKLSAgICB2YXIgY3VycmVudE51bWJlck9mT3B0aW9ucyA9IGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4ub3B0aW9ucy5sZW5ndGg7Ci0gICAgZm9yICh2YXIgaT0wO2k8Y3VycmVudE51bWJlck9mT3B0aW9ucztpKyspCi0gICAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCU+Lm9wdGlvbnNbMF0gPSBudWxsOwotPCUKLSAgIHsKLQotICAgICBJV29ya3NwYWNlUm9vdCBpV29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBpV29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0cygpOwotICAgICAgIAotICAgICBmb3IgKGludCBpPTA7aTxwcm9qZWN0cy5sZW5ndGg7aSsrKQotICAgICB7Ci0gICAgICAgaWYgKCFwcm9qZWN0c1tpXS5pc09wZW4oKSkKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgIHsKLSU+Ci0gICAgaWYgKHNlbGVjdGVkV2ViUHJvamVjdE5hbWUgPT0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwcm9qZWN0c1tpXS5nZXROYW1lKCkpJT4iKQotICAgIHsKLSAgICAgIHZhciB4PTA7Ci08JQotICAgICAgICAgU3RyaW5nIHBsYXRmb3JtUHJvdG9jb2wgPSAicGxhdGZvcm06L3Jlc291cmNlIjsKLSAgICAgICAgIFN0cmluZyBodHRwUHJvdG9jb2wgPSAiaHR0cDovLyI7Ci0gICAgICAgICBTdHJpbmcgaHR0cHNQcm90b2NvbCA9ICJodHRwczovLyI7Ci0gICAgICAgICB3c2RsVVJMc18ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQotCQkgSXRlcmF0b3Igd3MgPSB3c0luZm9DYWNoZS5zdWJMaXN0KHdvcmtzcGFjZVN0YXJ0LCB3b3Jrc3BhY2VFbmQpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgIHdoaWxlICh3cy5oYXNOZXh0KCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBXZWJTZXJ2aWNlSW5mbyB3c0luZm8gPSAoV2ViU2VydmljZUluZm8pd3MubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHVybCA9IHdzSW5mby5nZXRXc2RsVVJMKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAvLyBmaWx0ZXIgd3NkbCBVUkxzIHdpdGggc2FtZSBwcm9qZWN0IG5hbWUgYXMgc2VsZWN0ZWQgcHJvamVjdAotICAgICAgICAgIC8vIG9ubHkgbG9vayBhdCB3b3Jrc3BhY2UgVVJMcyByZXR1cm5lZCBmcm9tIHRoZSB3ZWIgc2VydmljZSBmaW5kZXIKLSAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgocGxhdGZvcm1Qcm90b2NvbCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgIC8vc3RyaXAgb2ZmIHBsYXRmb3JtUHJvdG9jb2wgdG8gbG9vayBhdCB0aGUgd29ya3NwYWNlIHBhdGgKLSAgICAgICAgICAgICBQYXRoIHdzZGxQYXRoID0gbmV3IFBhdGgodXJsLnN1YnN0cmluZyhwbGF0Zm9ybVByb3RvY29sLmxlbmd0aCgpKzEpKTsKLSAgICAgICAgICAgICBTdHJpbmcgcGF0aFByb2pOYW1lID0gd3NkbFBhdGguc2VnbWVudCgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgaWYgKHBhdGhQcm9qTmFtZS5lcXVhbHMocHJvamVjdHNbaV0uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB3c2RsVVJMc18uYWRkKHVybCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBhbHNvIGFkZCBhbnkgaHR0cCBvciBodHRwcyBVUkxzIHJldHVybmVkCi0gICAgICAgICAgZWxzZSBpZiAodXJsLnN0YXJ0c1dpdGgoaHR0cFByb3RvY29sKSB8fCB1cmwuc3RhcnRzV2l0aChodHRwc1Byb3RvY29sKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB3c2RsVVJMc18uYWRkKHVybCk7Ci0gICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKHdzZGxUeXBlID09IEFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0UpCi0gICAgICAgICB7Ci0gICAgICAgICAKLSAgICAgICAgIH0KLQotICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHdzZGxVUkxzXy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgewotICAgICAgICAgICAgIFN0cmluZyB3c2RsID0gSFRNTFV0aWxzLkpTTWFuZ2xlKGl0Lm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCU+Lm9wdGlvbnNbeCsrXSA9IG5ldyBPcHRpb24oIjwlPXdzZGwlPiIsICI8JT13c2RsJT4iKTsgCi0gICAgICAgICAgICAgPCUKLSAgICAgICAgIH0KLSU+Ci0gICAgfQotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLSU+Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGZpbGxGYXZvcml0ZVdTRExGaWxlcygpCi0gIHsKLSAgICB2YXIgY3VycmVudE51bWJlck9mT3B0aW9ucyA9IGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4ub3B0aW9ucy5sZW5ndGg7Ci0gICAgZm9yICh2YXIgaT0wO2k8Y3VycmVudE51bWJlck9mT3B0aW9ucztpKyspCi0gICAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCU+Lm9wdGlvbnNbMF0gPSBudWxsOwotICAgIHZhciB4ID0gMDsKLTwlCi0gICBFbnVtZXJhdGlvbiBmYXZvcml0ZVdTRExTZXJ2aWNlRWxlbWVudHMyID0gZmF2b3JpdGVXU0RMU2VydmljZXNFbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfTk9ERSk7Ci0gICB3aGlsZSAoZmF2b3JpdGVXU0RMU2VydmljZUVsZW1lbnRzMi5oYXNNb3JlRWxlbWVudHMoKSkKLSAgIHsKLSAgICAgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IGZhdm9yaXRlV1NETFNlcnZpY2VFbGVtZW50ID0gKEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudClmYXZvcml0ZVdTRExTZXJ2aWNlRWxlbWVudHMyLm5leHRFbGVtZW50KCk7Ci0gICAgIFN0cmluZyB1cmwgPSBIVE1MVXRpbHMuSlNNYW5nbGUoKGZhdm9yaXRlV1NETFNlcnZpY2VFbGVtZW50LmdldFNlcnZpY2UoKS5nZXREZXNjcmlwdGlvbnMoKSlbMF0uZ2V0TG9jYXRpb24oKSk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4ub3B0aW9uc1t4KytdID0gbmV3IE9wdGlvbigiPCU9dXJsJT4iLCI8JT11cmwlPiIpOwotPCUgICAgIAotICAgfQotJT4gIAotICAKLSAgfQotICAKLSAgCi0gIAotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLSAgICBmaWxsQ2F0ZWdvcmllcygpOwotICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgbG9hZFNjcmVlblRhYmxlLmRlbGV0ZVJvdygwKTsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsgICAgICAKLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPGRpdiBpZD0ibWFpblNjcmVlbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICAgICAgPGZvcm0gc3R5bGU9Im1hcmdpbi10b3A6MCI+Ci0KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4gPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfU09VUkNFIiklPiA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDxkaXYgaWQ9IndvcmtiZW5jaCIgPgotICAgICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iIGNsYXNzPSJsYWJlbHMiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX0NBVEVHT1JZIiklPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgbm93cmFwPgotICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLkNBVEVHT1JZJT4iIG9uQ2hhbmdlPSJmaWxsV1NETEZpbGVzQnlDYXRlZ29yeSh0aGlzLnZhbHVlKSIgY2xhc3M9InNlbGVjdGxpc3QiPgotICAgICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX1JFRlJFU0giKSU+IiBvbkNsaWNrPSJkb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQoKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+ICAgIAotICAgICAgICAgIDxkaXYgaWQ9InByb2plY3RzIiBzdHlsZT0iZGlzcGxheTpub25lOyI+ICAgICAgICAgIAotICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfU09VUkNFX1dFQlBST0pFQ1RTIiklPjwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgbm93cmFwPgotICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJwcm9qZWN0IiBvbkNoYW5nZT0iZmlsbFdTRExGaWxlcyh0aGlzLnZhbHVlKSIgY2xhc3M9InNlbGVjdGxpc3QiPgotICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9SRUZSRVNIIiklPiIgb25DbGljaz0iZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKCkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDx0YWJsZT4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCU+IiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci0gICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgbm93cmFwIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9HTyIpJT4iIG9uQ2xpY2s9InRvcC5vcGVuZXIudGFyZ2V0V1NETFVSTEVsZW1lbnQudmFsdWU9dGhpcy5mb3JtLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4udmFsdWU7dG9wLmNsb3NlKCkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIiBub3dyYXAgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0NBTkNFTCIpJT4iIG9uQ2xpY2s9InRvcC5jbG9zZSgpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLSAgIAotICAgICAgPC9mb3JtPgotICAgIDwvZGl2PgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotICByZXN1bWVQcm94eUxvYWRQYWdlKCk7Ci08L3NjcmlwdD4gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M4MzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbF90b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1dTRExfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgb25VbmxvYWQ9InRvcC5vcGVuZXIud3NkbFdpbmRvd0Nsb3NlZD10cnVlIiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3dzZGwuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfV1NETF9CUk9XU0VSIiklPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdG9wLm9wZW5lci53c2RsV2luZG93Q2xvc2VkID0gZmFsc2U7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NleHBsb3Jlci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZXhwbG9yZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBhYThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NleHBsb3Jlci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uKiIlPgotCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGZ1bmN0aW9uIGluaXRXaW5kb3dOYW1lKG5hbWUpCi0gICAgewotICAgICAgd2luZG93Lm5hbWUgPSBuYW1lOwotICAgIH0KLSAgPC9zY3JpcHQ+Ci0gIDwlCi0gIFN0cmluZyBzZXNzaW9uSWQgPSBzZXNzaW9uLmdldElkKCk7Ci0gICU+Ci0gIDxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiI+Ci0gICAgPCUKLSAgICAvLyBBZGQgdGhlIHNlc3Npb24gdG8gdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGFsbG93cyB1cyB0byByZXN1cnJlY3QgdGhlIHNlc3Npb24gZXZlbiBpZiB0aGUgYnJvd3NlciBjaG9vc2VzIG5vdCB0byBwYXJ0aWNpcGF0ZS4KLSAgICBhcHBsaWNhdGlvbi5zZXRBdHRyaWJ1dGUoc2Vzc2lvbklkLHNlc3Npb24pOwotCi0gICAgaWYgKHNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpID4gMCkKLSAgICAgIHNlc3Npb24uc2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgtMSk7Ci0KLSAgICAvLyBMYXVuY2hPcHRpb25NYW5hZ2VyIChiZWxvdykgaGFuZGxlcyBtb3N0IG9wdGlvbnMsCi0gICAgLy8gYnV0IG5lZWQgdG8gZ2V0IHN0YXRlIGFuZCBpbnN0YWxsIGxvY2F0aW9ucyBlYXJsaWVyLAotICAgIC8vIHNwZWNpZmljYWxseSBiZWZvcmUgY29udHJvbGxlci5pbml0KCkuCi0gICAgRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICB3aGlsZSAocGFyYW1OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZylwYXJhbU5hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbVZhbHVlcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtTmFtZSk7Ci0gICAgICBpZiAocGFyYW1WYWx1ZXMgIT0gbnVsbCAmJiBwYXJhbVZhbHVlcy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBTdHJpbmcgZGVjb2RlZFBhcmFtTmFtZSA9IFVSTFV0aWxzLmRlY29kZShwYXJhbU5hbWUpOwotICAgICAgICBpZiAoZGVjb2RlZFBhcmFtTmFtZS5lcXVhbHMoTGF1bmNoT3B0aW9ucy5ERUZBVUxUX0ZBVk9SSVRFU19MT0NBVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250cm9sbGVyLnNldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbihwYXJhbVZhbHVlc1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZGVjb2RlZFBhcmFtTmFtZS5lcXVhbHMoTGF1bmNoT3B0aW9ucy5TVEFURV9MT0NBVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250cm9sbGVyLnNldFN0YXRlTG9jYXRpb24ocGFyYW1WYWx1ZXNbMF0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gY29udHJvbGxlci5pbml0KCkKLSAgICBjb250cm9sbGVyLmluaXQoc2Vzc2lvbklkLGFwcGxpY2F0aW9uLHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSk7Ci0gICAgJT4KLSAgPC9qc3A6dXNlQmVhbj4KLSAgPCUKLSAgLy8gcHJlbG9hZCBmcm9tIExhdW5jaE9wdGlvbk1hbmFnZXIKLSAgU3RyaW5nIGtleSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVSTFV0aWxzLmVuY29kZShXU0V4cGxvcmVyQ29udGV4dC5JRCkpOwotICBpZiAoa2V5ICE9IG51bGwgJiYga2V5Lmxlbmd0aCgpID4gMCkKLSAgewotICAgIExhdW5jaE9wdGlvbnNNYW5hZ2VyIG1hbmFnZXIgPSBMYXVuY2hPcHRpb25zTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotICAgIG1hbmFnZXIubWFuYWdlKGtleSwgc2Vzc2lvbklkLCBhcHBsaWNhdGlvbik7Ci0gIH0KLSAgJT4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9hY3Rpb25lbmdpbmUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8dGl0bGU+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJUSVRMRV9XU0VYUExPUkVSIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08JQotLy8gcmVzZXQgcGVyc3BlY3RpdmUgY29udGVudCB0byBibGFuawotY29udHJvbGxlci5lbmFibGVQZXJzcGVjdGl2ZUNvbnRlbnRCbGFuayh0cnVlKTsKLSU+Ci08ZnJhbWVzZXQgcm93cz0iMCwzNSwqIiBib3JkZXI9MCBvbmxvYWQ9ImphdmFzY3JpcHQ6aW5pdFdpbmRvd05hbWUoJzwlPUZyYW1lTmFtZXMuV0lORE9XX05BTUVfV1NFWFBMT1JFUl9KU1AlPicpIj4KLSAgPGZyYW1lIG5hbWU9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfV09SS0FSRUEiKSU+IiBmcmFtZWJvcmRlcj0wIG5vcmVzaXplPgotICA8ZnJhbWUgbmFtZT0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9UT09MQkFSJT4iIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgicGVyc3BlY3RpdmVfdG9vbGJhci5qc3AiKSklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG5vcmVzaXplPgotICA8ZnJhbWUgbmFtZT0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9DT05URU5UJT4iIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX0NPTlRFTlQiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgicGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotKi5qYXZhCi0qLmNsYXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9DbGVhck5vZGVDb25maXJtSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL0NsZWFyTm9kZUNvbmZpcm1KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmUzMmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL0NsZWFyTm9kZUNvbmZpcm1KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA5MDYgMTU1NDM0ICAgbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIEJhY2sgU2xhc2ggJ1wnIG5vdCBhcHBlYXJpbmcgaW4gIldTSUwgbm8gbG9uZ2VyIHJlc29sdmFibGUiIGVycm9yIG1lc3NhZ2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLldzaWxGcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5DbGVhcldTSUxBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19DT05GSVJNX1JFTU9WRV9OT0RFIiwgY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldE5vZGVOYW1lKCkpKSU+IikpIHsKLSAgICAgICAgICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KENsZWFyV1NJTEFjdGlvbi5nZXRBY3Rpb25MaW5rKGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXROb2RlSWQoKSkpKSU+IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHdzaWxQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICAgICAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgfQotICAgIDwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL0NsZWFyV1NJTEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmIxM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQ2xlYXJXU0lMQWN0aW9uIiU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgIENsZWFyV1NJTEFjdGlvbiBhY3Rpb24gPSBuZXcgQ2xlYXJXU0lMQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvQ2xlYXJOb2RlQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL0ltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NWI5NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uKiIgJT4KLQotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiBhY3Rpb24gPSBuZXcgSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvSW1wb3J0V1NJTFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVkY2Q4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby4qIiAlPgotCi0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICBJbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBJbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9PcGVuV1NJTEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9PcGVuV1NJTEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYTRjNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvT3BlbldTSUxBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsUGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotICA8L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotT3BlbldTSUxBY3Rpb24gYWN0aW9uID0gbmV3IE9wZW5XU0lMQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotaWYgKCFpbnB1dHNWYWxpZCkgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgd3NpbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgd3NpbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICA8L3NjcmlwdD4KLTwlCi19Ci1lbHNlIHsKLSAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgaWYgKGFjdGlvblJlc3VsdCkgewotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkgewotICAgICAgICB3c2lsTmF2aWdhdG9yQ29udGVudC5sb2NhdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICB3c2lsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICB3c2lsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLX0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9PcGVuV1NJTExpbmtBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvT3BlbldTSUxMaW5rQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhNzVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9PcGVuV1NJTExpbmtBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuT3BlbldTSUxMaW5rQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLU9wZW5XU0lMTGlua0FjdGlvbiBhY3Rpb24gPSBuZXcgT3BlbldTSUxMaW5rQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotaWYgKCFpbnB1dHNWYWxpZCkgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgd3NpbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgd3NpbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICA8L3NjcmlwdD4KLTwlCi19Ci1lbHNlIHsKLSAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgaWYgKGFjdGlvblJlc3VsdCkgewotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkgewotICAgICAgICB3c2lsTmF2aWdhdG9yQ29udGVudC5sb2NhdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICB3c2lsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICB3c2lsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLX0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1JlZnJlc2hBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWYzZTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1JlZnJlc2hBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuKiIlPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsUGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgICBBY3Rpb24gYWN0aW9uID0gUmVmcmVzaEFjdGlvbi5uZXdBY3Rpb24ocmVxdWVzdCwgY29udHJvbGxlcik7Ci0KLSAgICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiI+Ci0gICAgPCUKLSAgICBpZiAoIWFjdGlvblJlc3VsdCkgewotICAgICAgICBpZiAoYWN0aW9uIGluc3RhbmNlb2YgUmVmcmVzaFdTSUxBY3Rpb24pIHsKLSAgICAgICAgJT4KLSAgICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9hY3Rpb25zL0NsZWFyTm9kZUNvbmZpcm1KU1AuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAlPgotICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICAgICAgd3NpbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICAgICAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICAgIDwvc2NyaXB0PgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgPCUKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgJT4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICB3c2lsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgICAgICB3c2lsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgIDwvc2NyaXB0PgotICAgIDwlCi0gICAgfQotICAgICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9SZXNpemVXU0lMRnJhbWVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1Jlc2l6ZVdTSUxGcmFtZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWUzNzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1Jlc2l6ZVdTSUxGcmFtZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIENyZWF0ZSB0aGUgYWN0aW9uLgotICAgUmVzaXplV1NJTEZyYW1lc0FjdGlvbiBhY3Rpb24gPSBuZXcgUmVzaXplV1NJTEZyYW1lc0FjdGlvbihjb250cm9sbGVyKTsKLSAgIAotICAgLy8gUG9wdWxhdGUgdGhlIGFjdGlvbiB3aXRoIHRoZSByZXF1ZXN0IHByb3BlcnRpZXMuCi0gICBib29sZWFuIHJlc3VsdCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbGZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotPCUKLSAgIGlmIChyZXN1bHQpCi0gICB7Ci0gICAgIGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLSAgICAgCi0gICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldC5zZXRBdHRyaWJ1dGUoImNvbHMiLCI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiIpOwotICAgIGFjdGlvbnNDb250YWluZXJGcmFtZXNldC5zZXRBdHRyaWJ1dGUoInJvd3MiLCI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iKTsKLSAgfQotICBlbHNlCi0gICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxOb2RlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5NGM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9TZWxlY3RXU0lMTm9kZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxOb2RlQWN0aW9uIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgIFNlbGVjdFdTSUxOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RXU0lMTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLSAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLSAgICBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1NlbGVjdE5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTFRvb2xBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTFRvb2xBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhkZmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxUb29sQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb24iICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICAgU2VsZWN0V1NJTFRvb2xBY3Rpb24gYWN0aW9uID0gbmV3IFNlbGVjdFdTSUxUb29sQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgIC8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotICAgIGJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvU2VsZWN0Tm9kZVRvb2xBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0lMQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMDdiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0lMQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24KLSAgIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTSUxBY3Rpb24gYWN0aW9uID0gbmV3IFN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTSUxBY3Rpb24oY29udHJvbGxlcik7Ci0gICAKLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIAotICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gICAKLSAgIC8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotICAgYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvc3dpdGNocGVyc3BlY3RpdmUuanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9XU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1MzEzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9XU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEFkZFRvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4MzY4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5GcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uIiU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1BZGRUb0Zhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBBZGRUb0Zhdm9yaXRlc0FjdGlvbi5uZXdBY3Rpb24ocmVxdWVzdCwgY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24KLWFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgd3NpbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhMzdiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iPgotICA8JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIEFjdGlvbiBhY3Rpb24gPSBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5uZXdBY3Rpb24ocmVxdWVzdCwgY29udHJvbGxlcik7Ci0KLSAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICBpZiAoYWN0aW9uUmVzdWx0KQotICB7Ci0gICAgY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLSAgJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNob3dQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLGZhbHNlKSkpJT4iOwotICAgIDwvc2NyaXB0PgotICA8JQotICB9Ci0gIGVsc2UKLSAgewotICAlPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgd3NpbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgd3NpbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgIDwvc2NyaXB0PgotICA8JQotICB9Ci0gICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmNDlkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2hvd1BlcnNwZWN0aXZlQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbEZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uIiU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24gYWN0aW9uID0gbmV3IFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotaWYgKGFjdGlvblJlc3VsdCkgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwsZmFsc2UpKSklPiI7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLWVsc2UgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgd3NpbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgPC9zY3JpcHQ+Ci08JQotfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxDaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxDaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhOTkwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkVudW1lcmF0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvYWN0aW9ucy9Xc2lsQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPgotPCUKLSAgICBFbnVtZXJhdGlvbiBwYXJhbU5hbWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgIHdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZylwYXJhbU5hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbVZhbHVlcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtTmFtZSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0lPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1wYXJhbU5hbWUlPiIgdmFsdWU9IjwlPXBhcmFtVmFsdWVzW2ldJT4iPgotPCUKLSAgICAgIH0KLSAgICB9Ci0lPgotICA8L2Zvcm0+Ci08L2JvZHk+Ci08L2h0bWw+Ci08JQotaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFdzaWxBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04pID09IG51bGwpIHsKLSAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICBBZGRUb0Zhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBBZGRUb0Zhdm9yaXRlc0FjdGlvbi5uZXdBY3Rpb24ocmVxdWVzdCwgY29udHJvbGxlcik7Ci0gIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotICBpZiAoYWN0aW9uLmZhdm9yaXRlRXhpc3RzKCkpIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVMiKSklPiIpKQotICAgICAgICBkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKTsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLSAgZWxzZSB7Ci0lPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci19Ci1lbHNlIHsKLSU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOwotICA8L3NjcmlwdD4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhYWM2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGM4MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gYWN0aW9uID0gbmV3IFdzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbFRvZ2dsZU5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbFRvZ2dsZU5vZGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODJjZGIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxUb2dnbGVOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1Xc2lsVG9nZ2xlTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgV3NpbFRvZ2dsZU5vZGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL09wZW5XU0lMRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvT3BlbldTSUxGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5MTUwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvT3BlbldTSUxGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQyNyAgIDEyNzQ0MyBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBTIE1vbGxlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkhUTUxVdGlscyIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci1Gb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCl3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX09QRU5fV1NJTCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC9hY3Rpb25zL09wZW5XU0lMQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIGhhbmRsZVN1Ym1pdCh0aGlzKSI+Ci0gIDwlCi0gIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ3c2lsL2ltYWdlcy9vcGVuX3dzaWxfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgU3RyaW5nIHRpdGxlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9PUEVOX1dTSUwiKTsKLSAgJT4KLSAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgIDwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX09QRU5fV1NJTF9ERVNDIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPiAgICAgICAgCi0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3dzaWxfdXJsIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiV1NJTF9VUkwiKSU+PC9sYWJlbD4KLSAgICAgICAgPCUKLSAgICAgICAgaWYgKCFmb3JtVG9vbC5pc0lucHV0VmFsaWQoV3NpbEFjdGlvbklucHV0cy5XU0lMX1VSTCkpIHsKLSAgICAgICAgJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHdzaWxVUkwgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9VUkwpOwotICAgICAgICBpZiAod3NpbFVSTCA9PSBudWxsKQotICAgICAgICAgIHdzaWxVUkwgPSAiIjsKLSAgICAgICAgJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfd3NpbF91cmwiIG5hbWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuV1NJTF9VUkwlPiIgdmFsdWU9IjwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3Qod3NpbFVSTCklPiIgc2l6ZT0iNTAiIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8JQotICBTdHJpbmcgaW5zcGVjdGlvblR5cGVTdHJpbmcgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9JTlNQRUNUSU9OX1RZUEUpOwotICBpbnQgaW5zcGVjdGlvblR5cGUgPSBXc2lsQWN0aW9uSW5wdXRzLldTSUxfREVUQUlMUzsKLSAgaWYgKGluc3BlY3Rpb25UeXBlU3RyaW5nICE9IG51bGwpCi0gICAgaW5zcGVjdGlvblR5cGUgPSBJbnRlZ2VyLnBhcnNlSW50KGluc3BlY3Rpb25UeXBlU3RyaW5nKTsKLSAgJT4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgPGxhYmVsIGZvcj0iaW5zcGVjdGlvbl90eXBlIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9DSE9PU0VfV1NJTF9JTlNQRUNUSU9OX1RZUEUiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJib3R0b20iPgotICAgICAgICA8c2VsZWN0IGlkPSJpbnNwZWN0aW9uX3R5cGUiIG5hbWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuV1NJTF9JTlNQRUNUSU9OX1RZUEUlPiIgY2xhc3M9InNlbGVjdGxpc3QiPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuV1NJTF9ERVRBSUxTJT4iIDwlIGlmIChpbnNwZWN0aW9uVHlwZSA9PSBXc2lsQWN0aW9uSW5wdXRzLldTSUxfREVUQUlMUykgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0lMIiklPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuV1NETF9TRVJWSUNFUyU+IiA8JSBpZiAoaW5zcGVjdGlvblR5cGUgPT0gV3NpbEFjdGlvbklucHV0cy5XU0RMX1NFUlZJQ0VTKSB7ICU+c2VsZWN0ZWQ8JSB9ICU+PjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfU0VSVklDRSIpJT4KLSAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLlVERElfU0VSVklDRVMlPiIgPCUgaWYgKGluc3BlY3Rpb25UeXBlID09IFdzaWxBY3Rpb25JbnB1dHMuVURESV9TRVJWSUNFUykgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VRERJX1NFUlZJQ0UiKSU+Ci0gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9V3NpbEFjdGlvbklucHV0cy5VRERJX0JVU0lORVNTRVMlPiIgPCUgaWYgKGluc3BlY3Rpb25UeXBlID09IFdzaWxBY3Rpb25JbnB1dHMuVURESV9CVVNJTkVTU0VTKSB7ICU+c2VsZWN0ZWQ8JSB9ICU+PjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VERElfQlVTSU5FU1MiKSU+Ci0gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9V3NpbEFjdGlvbklucHV0cy5XU0lMX0xJTktTJT4iIDwlIGlmIChpbnNwZWN0aW9uVHlwZSA9PSBXc2lsQWN0aW9uSW5wdXRzLldTSUxfTElOS1MpIHsgJT5zZWxlY3RlZDwlIH0gJT4+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NJTF9MSU5LUyIpJT4KLSAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1Byb2Nlc3NXU0lMRnJhbWVzZXRzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvUHJvY2Vzc1dTSUxGcmFtZXNldHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyZTZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvUHJvY2Vzc1dTSUxGcmFtZXNldHNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGZvcm1BY3Rpb24udG9TdHJpbmcoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowIj4KLSAgPGlucHV0IG5hbWU9IjwlPUFjdGlvbklucHV0cy5GUkFNRV9OQU1FJT4iIHR5cGU9ImhpZGRlbiIgdmFsdWU9IjwlPWZvcm1GcmFtZU5hbWUlPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCU+IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+Ij4KLTwvZm9ybT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9VZGRpQnVzaW5lc3NEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvVWRkaUJ1c2luZXNzRGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI4YmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9VZGRpQnVzaW5lc3NEZXRhaWxzUGFnZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5SZWZyZXNoQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iYWJzdHJhY3RMYW5ncyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0cyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgaW50IHZpZXdJRCA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IG51bGw7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gbnVsbDsKLSAgICBTdHJpbmcgZGlzY292ZXJ5VVJMID0gbnVsbDsKLSAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCBsaW5rID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsVURESUxpbmtzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgbGluayA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgewotICAgICAgICAgICAgYWJzdHJhY3RzLmFkZEFsbChsaW5rLmdldExpbmtBYnN0cmFjdHMoKSk7Ci0gICAgICAgICAgICBhYnN0cmFjdExhbmdzLmFkZEFsbChsaW5rLmdldExpbmtBYnN0cmFjdExhbmdzKCkpOwotICAgICAgICAgICAgaW5xdWlyeUFQSSA9IGxpbmsuZ2V0VURESUxpbmtJbnF1aXJ5QVBJKCk7Ci0gICAgICAgICAgICBidXNpbmVzc0tleSA9IGxpbmsuZ2V0VURESUxpbmtCdXNpbmVzc0tleSgpOwotICAgICAgICAgICAgZGlzY292ZXJ5VVJMID0gbGluay5nZXRVRERJTGlua0Rpc2NvdmVyeVVSTCgpOwotICAgICAgICB9Ci0gICAgfQotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9VRERJX0JVU0lORVNTX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfVURESV9MSU5LX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50ICYmIGxpbmsgIT0gbnVsbCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IiB2YWx1ZT0iPCU9dmlld0lEJT4iPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5RVUlSWV9BUEkiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9KChpbnF1aXJ5QVBJICE9IG51bGwpID8gaW5xdWlyeUFQSSA6IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BIikpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPSgoYnVzaW5lc3NLZXkgIT0gbnVsbCkgPyBidXNpbmVzc0tleSA6IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BIikpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRElTQ09WRVJZX1VSTCIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT0oKGRpc2NvdmVyeVVSTCAhPSBudWxsKSA/IGRpc2NvdmVyeVVSTCA6IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BIikpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsQWJzdHJhY3RUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9VZGRpU2VydmljZURldGFpbHNQYWdlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9VZGRpU2VydmljZURldGFpbHNQYWdlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxZTM5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvVWRkaVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5SZWZyZXNoQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ibmFtZUxhbmdzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibmFtZXMiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJhYnN0cmFjdExhbmdzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYWJzdHJhY3RzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgICBpbnQgdmlld0lEID0gc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gbnVsbDsKLSAgICBTdHJpbmcgc2VydmljZUtleSA9IG51bGw7Ci0gICAgU3RyaW5nIGRpc2NvdmVyeVVSTCA9IG51bGw7Ci0gICAgV3NpbFNlcnZpY2VFbGVtZW50IHNlcnZpY2UgPSBudWxsOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICAgICBMaXN0RWxlbWVudCBsZSA9ICgoV3NpbEVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxVRERJU2VydmljZXMoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpOwotICAgICAgICBzZXJ2aWNlID0gKFdzaWxTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbmFtZXMuYWRkQWxsKHNlcnZpY2UuZ2V0U2VydmljZU5hbWVzKCkpOwotICAgICAgICAgICAgbmFtZUxhbmdzLmFkZEFsbChzZXJ2aWNlLmdldFNlcnZpY2VOYW1lTGFuZ3MoKSk7Ci0gICAgICAgICAgICBhYnN0cmFjdHMuYWRkQWxsKHNlcnZpY2UuZ2V0U2VydmljZUFic3RyYWN0cygpKTsKLSAgICAgICAgICAgIGFic3RyYWN0TGFuZ3MuYWRkQWxsKHNlcnZpY2UuZ2V0U2VydmljZUFic3RyYWN0TGFuZ3MoKSk7Ci0gICAgICAgICAgICBpbnF1aXJ5QVBJID0gKChXc2lsVWRkaVNlcnZpY2VFbGVtZW50KXNlcnZpY2UpLmdldFVERElTZXJ2aWNlSW5xdWlyeUFQSSgpOwotICAgICAgICAgICAgc2VydmljZUtleSA9ICgoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClzZXJ2aWNlKS5nZXRVRERJU2VydmljZUtleSgpOwotICAgICAgICAgICAgZGlzY292ZXJ5VVJMID0gKChXc2lsVWRkaVNlcnZpY2VFbGVtZW50KXNlcnZpY2UpLmdldFVERElTZXJ2aWNlRGlzY292ZXJ5VVJMKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPgotCi0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1dTSUxfU0VSVklDRV9ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCAmJiBzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuTk9ERUlEJT4iIHZhbHVlPSI8JT1zZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCklPiI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5WSUVXSUQlPiIgdmFsdWU9IjwlPXZpZXdJRCU+Ij4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5RVUlSWV9BUEkiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9KChpbnF1aXJ5QVBJICE9IG51bGwpID8gaW5xdWlyeUFQSSA6IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BIikpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVJWSUNFX0tFWSIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT0oKHNlcnZpY2VLZXkgIT0gbnVsbCkgPyBzZXJ2aWNlS2V5IDogd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkEiKSklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RJU0NPVkVSWV9VUkwiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9KChkaXNjb3ZlcnlVUkwgIT0gbnVsbCkgPyBkaXNjb3ZlcnlVUkwgOiB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQSIpKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbE5hbWVUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLSAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEFic3RyYWN0VGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi0gICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4YjI4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTI3NDQzIGplc3BlckBzZWxza2FiZXQub3JnIC0gSmVzcGVyIFMgTW9sbGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi1XU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLU5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9JTVBPUlRfVE9fV09SS0JFTkNIIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL2FjdGlvbnMvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0gIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRfRklMRSU+IiB2YWx1ZT0iPCU9QWN0aW9uSW5wdXRzLklNUE9SVF9GSUxFJT4iPgotICA8JQotICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgU3RyaW5nIHRpdGxlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFUTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0giKTsKLSAgJT4KLSAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSF9ERVNDIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD00MCB2YWxpZ249ImNlbnRlciI+Ci0gICAgICAgIDxsYWJlbCBmb3I9InNlbGVjdF93b3JrYmVuY2hfcHJvamVjdF9uYW1lIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIldPUktCRU5DSF9QUk9KRUNUX05BTUUiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTQwIHZhbGlnbj0iY2VudGVyIiBub3dyYXA+Ci0gICAgICAgIDwlCi0gICAgICAgIElXb3Jrc3BhY2VSb290IGlXb3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IGlXb3Jrc3BhY2VSb290LmdldFByb2plY3RzKCk7Ci0gICAgICAgICU+Ci0gICAgICAgIDxzZWxlY3QgaWQ9InNlbGVjdF93b3JrYmVuY2hfcHJvamVjdF9uYW1lIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuV09SS0JFTkNIX1BST0pFQ1RfTkFNRSU+IiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci0gICAgICAgIDwlCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXByb2plY3RzW2ldLmlzT3BlbigpKQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3RzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgJT4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9cHJvamVjdE5hbWUlPiI+PCU9cHJvamVjdE5hbWUlPgotICAgICAgICA8JQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIH0KLSAgICAgICAgJT4KLSAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9pbXBvcnRlZF93c2lsX2ZpbGVfbmFtZSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJXU0lMX0ZJTEVfTkFNRSIpJT48L2xhYmVsPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iIHdpZHRoPSI2MCUiPgotPCUKLSBTdHJpbmcgd3NpbEZpbGVOYW1lID0gInRlbXAud3NpbCI7Ci0gU3RyaW5nIHdzaWxVUkwgPSB3c2lsRWxlbWVudC5nZXRXc2lsVXJsKCk7Ci0gaWYgKHdzaWxVUkwuZW5kc1dpdGgoIi53c2lsIikpCi0gewotICAgaW50IGxhc3RTZXBhcmF0b3JQb3MgPSBNYXRoLm1heCh3c2lsVVJMLmxhc3RJbmRleE9mKCIvIiksIHdzaWxVUkwubGFzdEluZGV4T2YoIlxcIikpOwotICAgaWYgKGxhc3RTZXBhcmF0b3JQb3MgPiAwKQotICAgICB3c2lsRmlsZU5hbWUgPSB3c2lsVVJMLnN1YnN0cmluZyhsYXN0U2VwYXJhdG9yUG9zKzEsIHdzaWxVUkwubGVuZ3RoKCkpOwotIH0KLSU+ICAgCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfaW1wb3J0ZWRfd3NpbF9maWxlX25hbWUiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRFRF9GSUxFX05BTUUlPiIgdmFsdWU9IjwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXNTdHJpY3Qod3NpbEZpbGVOYW1lKSU+IiBzaXplPTUwIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgICAKLSAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV3NkbFNlcnZpY2VEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV3NkbFNlcnZpY2VEZXRhaWxzUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5N2U2ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzZGxTZXJ2aWNlRGV0YWlsc1BhZ2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS53c2lsLlFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9Im5hbWVMYW5ncyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5hbWVzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYWJzdHJhY3RMYW5ncyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0cyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgIFN0cmluZyBiaW5kaW5nVGFibGUgPSAiYmluZGluZ1RhYmxlIjsKLSAgICBTdHJpbmcgeGJpbmRpbmdUYWJsZSA9ICJ4YmluZGluZ1RhYmxlIjsKLQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPWNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgICBpbnQgdmlld0lEID0gc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdzaWxTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlID0gbnVsbDsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IG51bGw7Ci0gICAgVmVjdG9yIHdzZGxCaW5kaW5ncyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsV1NETFNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgc2VydmljZSA9IChXc2lsU2VydmljZUVsZW1lbnQpbGUuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5hbWVzLmFkZEFsbChzZXJ2aWNlLmdldFNlcnZpY2VOYW1lcygpKTsKLSAgICAgICAgICAgIG5hbWVMYW5ncy5hZGRBbGwoc2VydmljZS5nZXRTZXJ2aWNlTmFtZUxhbmdzKCkpOwotICAgICAgICAgICAgYWJzdHJhY3RzLmFkZEFsbChzZXJ2aWNlLmdldFNlcnZpY2VBYnN0cmFjdHMoKSk7Ci0gICAgICAgICAgICBhYnN0cmFjdExhbmdzLmFkZEFsbChzZXJ2aWNlLmdldFNlcnZpY2VBYnN0cmFjdExhbmdzKCkpOwotICAgICAgICAgICAgd3NkbFVSTCA9ICgoV3NpbFdzZGxTZXJ2aWNlRWxlbWVudClzZXJ2aWNlKS5nZXRXU0RMU2VydmljZVVSTCgpOwotICAgICAgICAgICAgd3NkbEJpbmRpbmdzID0gKChXc2lsV3NkbFNlcnZpY2VFbGVtZW50KXNlcnZpY2UpLmdldFdTRExCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFRhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50ICYmIHNlcnZpY2UgIT0gbnVsbCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IiB2YWx1ZT0iPCU9dmlld0lEJT4iPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VUkwiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9d3NkbFVSTCU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbE5hbWVUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLSAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEFic3RyYWN0VGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9YmluZGluZ1RhYmxlJT4nLCc8JT14YmluZGluZ1RhYmxlJT4nKSI+PGltZyBuYW1lPSI8JT14YmluZGluZ1RhYmxlJT4iIHNyYz0iL3dzZXhwbG9yZXIvaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfQklORElOR1MiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iL3dzZXhwbG9yZXIvaW1hZ2VzL2tleWxpbmUuZ2lmIiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9YmluZGluZ1RhYmxlJT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRVNQQUNFX1VSSSIpJT48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xPQ0FMX05BTUUiKSU+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8JQotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHdzZGxCaW5kaW5ncy5lbGVtZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSA9IChRTmFtZSllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48JT1xbmFtZS5nZXROYW1lc3BhY2VVUkkoKSU+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PCU9cW5hbWUuZ2V0TG9jYWxOYW1lKCklPjwvdGQ+Ci0gICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9YmluZGluZ1RhYmxlJT4nLCc8JT14YmluZGluZ1RhYmxlJT4nKTsKLSAgICAgICAgPC9zY3JpcHQ+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLSAgICAgICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV3NpbERldGFpbHNQYWdlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9Xc2lsRGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzcwMDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9Xc2lsRGV0YWlsc1BhZ2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5BZGRUb0Zhdm9yaXRlc0FjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0TGFuZ3MiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJhYnN0cmFjdHMiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID1jb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSBudWxsOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICAgICB3c2lsRWxlbWVudCA9IChXc2lsRWxlbWVudClzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgICAgIGFic3RyYWN0cy5hZGRBbGwod3NpbEVsZW1lbnQuZ2V0V1NJTEFic3RyYWN0cygpKTsKLSAgICAgICAgYWJzdHJhY3RMYW5ncy5hZGRBbGwod3NpbEVsZW1lbnQuZ2V0V1NJTEFic3RyYWN0TGFuZ3MoKSk7Ci0gICAgfQotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9XU0lMX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NJTF9ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IiB2YWx1ZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUJT4iPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VUkwiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9d3NpbEVsZW1lbnQuZ2V0V3NpbFVybCgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsQWJzdHJhY3RUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLSAgICA8JQotICAgIH0KLSAgICAlPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhZmY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qIiAlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgVG9vbCBzZWxlY3RlZFRvb2wgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSU+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1Qcm9wZXJ0aWVzIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RXU0RMU2VydmljZXNUb29sKQotICB7Ci0gICAgaW50IHZpZXdJZCA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKTsKLSAgICBXc2lsRWxlbWVudCB3c2lsRWxlbWVudCA9IChXc2lsRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBMaXN0RWxlbWVudCBsZSA9IHdzaWxFbGVtZW50LmdldEFsbFdTRExTZXJ2aWNlcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJZCk7Ci0gICAgV3NpbFdzZGxTZXJ2aWNlRWxlbWVudCB3c2lsV3NkbFNlcnZpY2VFbGVtZW50ID0gKFdzaWxXc2RsU2VydmljZUVsZW1lbnQpbGUuZ2V0T2JqZWN0KCk7Ci0gICAgZm9ybVByb3BlcnRpZXMucHV0KCJ3c2RsVVJMIix3c2lsV3NkbFNlcnZpY2VFbGVtZW50LmdldFdTRExTZXJ2aWNlVVJMKCkpOwotICB9Ci0gIGZvcm1Qcm9wZXJ0aWVzLnB1dCgiZm9ybUFjdGlvbkxpbmsiLCJ3c2lsL2FjdGlvbnMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AiKTsKLSU+ICAgCi08L2pzcDp1c2VCZWFuPgotPCUKLSAgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RXU0RMU2VydmljZXNUb29sKQotICB7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9JbXBvcnRXU0RMQW5kV1NJTFRvV29ya2JlbmNoRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICB9Ci0gIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJU2VydmljZXNUb29sKQotICB7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9JbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9Xc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OTE5NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbkxpbmsiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUFjdGlvbkxpbmsuYXBwZW5kKCJ3c2lsL2FjdGlvbnMvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwIik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxMaW5rRGV0YWlsc1BhZ2UuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxMaW5rRGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGMxZjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9Xc2lsTGlua0RldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJhYnN0cmFjdExhbmdzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYWJzdHJhY3RzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9Y29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgIGludCB2aWV3SUQgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgV3NpbFdzaWxMaW5rRWxlbWVudCBsaW5rID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsV1NJTExpbmtzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgbGluayA9IChXc2lsV3NpbExpbmtFbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgICAgICBpZiAobGluayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhYnN0cmFjdExhbmdzLmFkZEFsbChsaW5rLmdldExpbmtBYnN0cmFjdExhbmdzKCkpOwotICAgICAgICAgICAgYWJzdHJhY3RzLmFkZEFsbChsaW5rLmdldExpbmtBYnN0cmFjdHMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTSUxfTElOS19ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NJTF9MSU5LX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50ICYmIGxpbmsgIT0gbnVsbCkgewotICAgICU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VUkwiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9bGluay5nZXRXU0lMTGlua0xvY2F0aW9uKCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxBYnN0cmFjdFRhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgICAgICAKLQotICAgIDwlCi0gICAgfQotICAgICU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvYWRkX3RvX1VERElfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NWQxOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvYWRkX3RvX1VERElfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTNkZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfVURESV9zZXJ2aWNlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1VERElfc2VydmljZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1MWRhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfVURESV9zZXJ2aWNlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1VERElfc2VydmljZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfVURESV9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlMTMzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfVURESV9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfV1NETF9zZXJ2aWNlX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGMwMjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfV1NETF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhjOGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1dTSUxfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfV1NJTF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhMDk4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfV1NJTF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0YmJlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfV1NJTF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWUzN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X2J1c2luZXNzX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9idXNpbmVzc19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MWI5NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvb3Blbl93c2lsX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9vcGVuX3dzaWxfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OWNjNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9vcGVuX3dzaWxfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL29wZW5fd3NpbF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL29wZW5fd3NpbF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTc3NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9vcGVuX3dzaWxfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy93c2lsX25vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy93c2lsX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzU5MTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvd3NpbF9ub2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvc2NyaXB0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM4ZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbEFic3RyYWN0VGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbEFic3RyYWN0VGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgzMjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxBYnN0cmFjdFRhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkhUTUxVdGlscyIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0TGFuZ3MiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJhYnN0cmFjdHMiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08JQotU3RyaW5nIGFic3RyYWN0VGFibGUgPSAiYWJzdHJhY3RUYWJsZSI7Ci1TdHJpbmcgeGFic3RyYWN0VGFibGUgPSAieGFic3RyYWN0VGFibGUiOwotU3RyaW5nIHNob3dBbGxBYnN0cmFjdElEID0gInNob3dBbGxBYnN0cmFjdElEIjsKLVdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPWNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBmdW5jdGlvbiBzaG93QWJzdHJhY3QodGFibGVDb250YWluZXJJRCkgewotICAgICAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICAgICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgICAgIHZhciBoaWRkZW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCc8JT1zaG93QWxsQWJzdHJhY3RJRCU+Jyk7Ci0gICAgICAgIDwlCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWJzdHJhY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgIGFkZFJvd1RvQWJzdHJhY3RUYWJsZSh0YWJsZUJvZHksCi0gICAgICAgICAgICAgICAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpYWJzdHJhY3RMYW5ncy5lbGVtZW50QXQoaSkpJT4iLAotICAgICAgICAgICAgICAgIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWFic3RyYWN0cy5lbGVtZW50QXQoaSkpJT4iKTsKLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotICAgIH0KLQotICAgIGZ1bmN0aW9uIGFkZFJvd1RvQWJzdHJhY3RUYWJsZSh0YWJsZUJvZHksIGxhbmcsIGFic3QpIHsKLSAgICAgICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgICAgIGFkZEtleVZhbHVlVG9Sb3cobmV3Um93LCBsYW5nLCBhYnN0KTsKLSAgICAgICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gICAgfQotPC9zY3JpcHQ+Ci0KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9YWJzdHJhY3RUYWJsZSU+JywnPCU9eGFic3RyYWN0VGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhhYnN0cmFjdFRhYmxlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FCU1RSQUNUIiklPjwvc3Ryb25nPgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT1hYnN0cmFjdFRhYmxlJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEFOR1VBR0UiKSU+PC90aD4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BQlNUUkFDVCIpJT48L3RoPgotICAgICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08L2Rpdj4KLQotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgc2hvd0Fic3RyYWN0KCc8JT1hYnN0cmFjdFRhYmxlJT4nKTsKLSAgICB0d2lzdEluaXQoJzwlPWFic3RyYWN0VGFibGUlPicsJzwlPXhhYnN0cmFjdFRhYmxlJT4nKTsKLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI1ZjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxGb3JtU3VibWl0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgZnVuY3Rpb24gaXNTb21ldGhpbmdTZWxlY3RlZCh0YWJsZUNvbnRhaW5lcklkKSB7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93czsgaTx0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgcm93Q2hlY2tib3hDZWxsID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKS5pdGVtKDApOwotICAgICAgICAgICAgdmFyIHJvd0NoZWNrYm94ID0gcm93Q2hlY2tib3hDZWxsLmNoaWxkTm9kZXNbMF07Ci0gICAgICAgICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhbGVydCgiPCU9Y29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRCIpJT4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCh0YWJsZUNvbnRhaW5lcklkLCBmb3JtLCBsb2NhdGlvbikgewotICAgICAgICBpZiAoaXNTb21ldGhpbmdTZWxlY3RlZCh0YWJsZUNvbnRhaW5lcklkKSkKLSAgICAgICAgICAgIHNldExvY2F0aW9uQW5kU3VibWl0KGZvcm0sIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBzZXRMb2NhdGlvbkFuZFN1Ym1pdChmb3JtLCBsb2NhdGlvbikgewotICAgICAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgICAgICB7Ci0gICAgICAgICAgZm9ybS5hY3Rpb24gPSBsb2NhdGlvbjsKLSAgICAgICAgICBmb3JtLnN1Ym1pdCgpOwotICAgICAgICB9Ci0gICAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvc2NyaXB0cy93c2lsTmFtZVRhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxOYW1lVGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjI4ODdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxOYW1lVGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ibmFtZUxhbmdzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibmFtZXMiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08JQotU3RyaW5nIG5hbWVUYWJsZSA9ICJuYW1lVGFibGUiOwotU3RyaW5nIHhuYW1lVGFibGUgPSAieG5hbWVUYWJsZSI7Ci1TdHJpbmcgc2hvd0FsbE5hbWVJRCA9ICJzaG93QWxsTmFtZUlEIjsKLVdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPWNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBmdW5jdGlvbiBzaG93TmFtZSh0YWJsZUNvbnRhaW5lcklEKSB7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgICAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICAgICAgdmFyIGhpZGRlbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzwlPXNob3dBbGxOYW1lSUQlPicpOwotICAgICAgICA8JQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgIGFkZFJvd1RvTmFtZVRhYmxlKHRhYmxlQm9keSwKLSAgICAgICAgICAgICAgICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZyluYW1lTGFuZ3MuZWxlbWVudEF0KGkpKSU+IiwKLSAgICAgICAgICAgICAgICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZyluYW1lcy5lbGVtZW50QXQoaSkpJT4iKTsKLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotICAgIH0KLQotICAgIGZ1bmN0aW9uIGFkZFJvd1RvTmFtZVRhYmxlKHRhYmxlQm9keSwgbGFuZywgbmFtZSkgewotICAgICAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICAgICAgYWRkS2V5VmFsdWVUb1JvdyhuZXdSb3csIGxhbmcsIG5hbWUpOwotICAgICAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgICB9Ci08L3NjcmlwdD4KLQotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1uYW1lVGFibGUlPicsJzwlPXhuYW1lVGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhuYW1lVGFibGUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgIDxzdHJvbmc+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3N0cm9uZz4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9bmFtZVRhYmxlJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEFOR1VBR0UiKSU+PC90aD4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwvZGl2PgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBzaG93TmFtZSgnPCU9bmFtZVRhYmxlJT4nKTsKLSAgICB0d2lzdEluaXQoJzwlPW5hbWVUYWJsZSU+JywnPCU9eG5hbWVUYWJsZSU+Jyk7Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvc2NyaXB0cy93c2lsUGFuZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2M1YjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgd3NpbE5hdmlnYXRvckNvbnRhaW5lciA9IHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfTkFWSUdBVE9SX0NPTlRBSU5FUiU+Il07Ci0gIHZhciB3c2lsTmF2aWdhdG9yVG9vbGJhciA9IHdzaWxOYXZpZ2F0b3JDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX05BVklHQVRPUl9UT09MQkFSJT4iXTsKLSAgdmFyIHdzaWxOYXZpZ2F0b3JDb250ZW50ID0gd3NpbE5hdmlnYXRvckNvbnRhaW5lci5mcmFtZXNbIjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfTkFWSUdBVE9SX0NPTlRFTlQlPiJdOwotICB2YXIgd3NpbEFjdGlvbnNDb250YWluZXIgPSBwZXJzcGVjdGl2ZUNvbnRlbnQuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX0FDVElPTlNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHdzaWxQcm9wZXJ0aWVzQ29udGFpbmVyID0gd3NpbEFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1BST1BFUlRJRVNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHdzaWxQcm9wZXJ0aWVzVG9vbGJhciA9IHdzaWxQcm9wZXJ0aWVzQ29udGFpbmVyLmZyYW1lc1siPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9QUk9QRVJUSUVTX1RPT0xCQVIlPiJdOwotICB2YXIgd3NpbFByb3BlcnRpZXNDb250ZW50ID0gd3NpbFByb3BlcnRpZXNDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1BST1BFUlRJRVNfQ09OVEVOVCU+Il07Ci0gIHZhciB3c2lsU3RhdHVzQ29udGFpbmVyID0gd3NpbEFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1NUQVRVU19DT05UQUlORVIlPiJdOwotICB2YXIgd3NpbFN0YXR1c1Rvb2xiYXIgPSB3c2lsU3RhdHVzQ29udGFpbmVyLmZyYW1lc1siPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9TVEFUVVNfVE9PTEJBUiU+Il07Ci0gIHZhciB3c2lsU3RhdHVzQ29udGVudCA9IHdzaWxTdGF0dXNDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1NUQVRVU19DT05URU5UJT4iXTsKLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbFRhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxUYWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTEyNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbFRhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy90YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0KLSAgICBmdW5jdGlvbiB3c2lsSGFuZGxlQ2hlY2tBbGxDbGljayh0YWJsZUNvbnRhaW5lcklkLCBjaGVja0FsbENoZWNrYm94KSB7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93czsgaTx0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgcm93Q2hlY2tib3hDZWxsID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKS5pdGVtKDApOwotICAgICAgICAgICAgdmFyIHJvd0NoZWNrYm94ID0gcm93Q2hlY2tib3hDZWxsLmNoaWxkTm9kZXNbMF07Ci0gICAgICAgICAgICByb3dDaGVja2JveC5jaGVja2VkID0gY2hlY2tBbGxDaGVja2JveC5jaGVja2VkOwotICAgICAgICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRSb3codGFibGUucm93c1tpXSwicm93Y29sb3IiKTsKLSAgICAgICAgICAgICAgICByb3dDaGVja2JveC5uYW1lID0gIjwlPUFjdGlvbklucHV0cy5WSUVXSUQlPiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRSb3codGFibGUucm93c1tpXSwidGFibGVjZWxscyIpOwotICAgICAgICAgICAgICAgIHJvd0NoZWNrYm94Lm5hbWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIHZhbGlkYXRlQ2hlY2tCb3hJbnB1dChjaGVja2JveCwgaXNDaGVja2VkKSB7Ci0gICAgICAgIGlmIChpc0NoZWNrZWQpIHsKLSAgICAgICAgICAgIGNoZWNrYm94Lm5hbWUgPSAiPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNoZWNrYm94Lm5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVSb3dDaGVja2JveENsaWNrKCk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gdHdpc3RJbml0KHRhYmxlQ29udGFpbmVySWQsdHdpc3RJbWFnZU5hbWUpIHsKLSAgICAgICAgdmFyIHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJZCk7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICBpZiAodGFibGUucm93cy5sZW5ndGggPiBudW1iZXJPZkhlYWRlclJvd3MpIHsKLSAgICAgICAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICAgICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklkLCB0d2lzdEltYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgICAgICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklkLCB0d2lzdEltYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBhZGRLZXlWYWx1ZVRvUm93KHJvdywga2V5LCB2YWx1ZSkgewotICAgICAgICB2YXIga2V5VGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleSk7Ci0gICAgICAgIHZhciB2YWx1ZVRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0gICAgICAgIHZhciBuZXdDb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgICAgICB2YXIgbmV3Q29sMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgICAgIG5ld0NvbC5hcHBlbmRDaGlsZChrZXlUZXh0KTsKLSAgICAgICAgbmV3Q29sLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAgICAgbmV3Q29sMi5hcHBlbmRDaGlsZCh2YWx1ZVRleHQpOwotICAgICAgICBuZXdDb2wyLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAgICAgcm93LmFwcGVuZENoaWxkKG5ld0NvbCk7Ci0gICAgICAgIHJvdy5hcHBlbmRDaGlsZChuZXdDb2wyKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBjbGVhclRhYmxlKHRhYmxlQm9keSwgbnVtSGVhZGVyKSB7Ci0gICAgICAgIGZvcih2YXIgaSA9IG51bUhlYWRlcjsgaSA8IHRhYmxlQm9keS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0YWJsZUJvZHkuZGVsZXRlUm93KGkpOwotICAgICAgICAgICAgaS0tOwotICAgICAgICB9Ci0gICAgfQotCi08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxmcmFtZXNldHMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbGZyYW1lc2V0cy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjY3M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbGZyYW1lc2V0cy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKQotICB7Ci0gICAgcmV0dXJuIHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfQUNUSU9OU19DT05UQUlORVIlPiJdLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFtZXNldCIpLml0ZW0oMCk7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzZXRTaXplcyhmcmFtZXNldFNpemVzRm9ybSkKLSAgewotICAgIHRvZ2dsZURvdWJsZUNsaWNrQ29sdW1uVGl0bGUoKTsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1Xc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCU+LnZhbHVlID0gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQuY29sczsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1Xc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPi52YWx1ZSA9IGFjdGlvbnNDb250YWluZXJGcmFtZXNldC5yb3dzOwotICAgIGZyYW1lc2V0U2l6ZXNGb3JtLnN1Ym1pdCgpOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzhmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouamF2YQotKi5jbGFzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1VkZGlCdXNpbmVzc1ZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1VkZGlCdXNpbmVzc1ZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTdmYWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9VZGRpQnVzaW5lc3NWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0iamF2YS51dGlsLlZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlF1aWNrU29ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5BZGRUb0Zhdm9yaXRlc0FjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgU3RyaW5nIGRpdlVERElCdXNpbmVzc0xpc3QgPSAiZGl2VURESUJ1c2luZXNzTGlzdCI7Ci0gICAgU3RyaW5nIHhkaXZVRERJQnVzaW5lc3NMaXN0ID0gInhkaXZVRERJQnVzaW5lc3NMaXN0IjsKLQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlZJRVdfVElUTEVfVURESV9CVVNJTkVTU0VTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcyIpKSU+Ij4KLSAgICA8L3NjcmlwdD4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxGb3JtU3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzaWwvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfVURESV9MSU5LUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTElTVF9VRERJX0JVU0lORVNTRVNfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4gICAgCi0gICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9V3NpbEFjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiU+IiB2YWx1ZT0iMSI+Ci0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2VURESUJ1c2luZXNzTGlzdCU+JywnPCU9eGRpdlVERElCdXNpbmVzc0xpc3QlPicpIj48aW1nIG5hbWU9IjwlPXhkaXZVRERJQnVzaW5lc3NMaXN0JT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VERElfQlVTSU5FU1MiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdlVERElCdXNpbmVzc0xpc3QlPiI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0id3NpbEhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPWRpdlVERElCdXNpbmVzc0xpc3QlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSVRFTV9OVU1CRVIiKSU+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VRERJX0JVU0lORVNTX05BTUUiKSU+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIExpc3RNYW5hZ2VyIHVkZGlMaW5rcyA9ICgoV3NpbEVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxVRERJTGlua3MoKTsKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gdWRkaUxpbmtzLmdldExpc3RFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIGludCBpdGVtTnVtID0gMTsKLSAgICAgICAgICAgICAgICBWZWN0b3Igc29ydGVkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgCXNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgUXVpY2tTb3J0LnNvcnQoc29ydGVkVmVjdG9yKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvcnRlZFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBMaXN0RWxlbWVudCBsZSA9IChMaXN0RWxlbWVudClzb3J0ZWRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCB1ZGRpTGluayA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB1ZGRpTGluay5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IiB2YWx1ZT0iPCU9bGUuZ2V0Vmlld0lkKCklPiIgb25DbGljaz0idmFsaWRhdGVDaGVja0JveElucHV0KHRoaXMsIHRoaXMuY2hlY2tlZCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgJT4KLQkgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgbGUuZ2V0Vmlld0lkKCksIDAsIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1TdHJpbmcudmFsdWVPZihpdGVtTnVtKSU+PC9hPjwvdGQ+Ci0gICAgICAgCSAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgbGUuZ2V0Vmlld0lkKCksIDAsIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1uYW1lJT48L2E+PC90ZD4KLSAgICAgICAJICAgICAgICAgIDwlCi0gICAgICAgCSAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICU+Ci0JICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48JT1TdHJpbmcudmFsdWVPZihpdGVtTnVtKSU+PC90ZD4KLSAgICAgICAJICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9CVVNJTkVTUyIpJT4mbmJzcDs8JT11ZGRpTGluay5nZXRVRERJTGlua0J1c2luZXNzS2V5KCklPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgaXRlbU51bSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2VURESUJ1c2luZXNzTGlzdCU+JywnPCU9eGRpdlVERElCdXNpbmVzc0xpc3QlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdlVERElCdXNpbmVzc0xpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BRERfVE9fRkFWT1JJVEVTIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZVRERJQnVzaW5lc3NMaXN0JT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1JFRlJFU0giKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdlVERElCdXNpbmVzc0xpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZWZyZXNoQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLTwvZGl2PgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICByZXN1bWVQcm94eUxvYWRQYWdlKCk7Ci08L3NjcmlwdD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1VkZGlTZXJ2aWNlc1ZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1VkZGlTZXJ2aWNlc1ZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2IwNDQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9VZGRpU2VydmljZXNWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0iamF2YS51dGlsLlZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlF1aWNrU29ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICBTdHJpbmcgZGl2VURESVNlcnZpY2VMaXN0ID0gImRpdlVERElTZXJ2aWNlTGlzdCI7Ci0gICAgU3RyaW5nIHhkaXZVRERJU2VydmljZUxpc3QgPSAieGRpdlVERElTZXJ2aWNlTGlzdCI7Ci0KLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VERElfU0VSVklDRVMiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9yZXN1bWVwcm94eWxvYWRwYWdlLmpzIikpJT4iPgotICAgIDwvc2NyaXB0PgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAid3NpbC9pbWFnZXMvbGlzdF9VRERJX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfVURESV9TRVJWSUNFUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTElTVF9VRERJX1NFUlZJQ0VTX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+ICAgIAotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyI+Ci0KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9V3NpbEFjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiU+IiB2YWx1ZT0iMSI+Ci0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2VURESVNlcnZpY2VMaXN0JT4nLCc8JT14ZGl2VURESVNlcnZpY2VMaXN0JT4nKSI+PGltZyBuYW1lPSI8JT14ZGl2VURESVNlcnZpY2VMaXN0JT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VERElfU0VSVklDRSIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9ZGl2VURESVNlcnZpY2VMaXN0JT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9IndzaWxIYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZVRERJU2VydmljZUxpc3QlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSVRFTV9OVU1CRVIiKSU+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VRERJX1NFUlZJQ0VfTkFNRSIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgTGlzdE1hbmFnZXIgdWRkaVNlcnZpY2VzID0gKChXc2lsRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFVERElTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB1ZGRpU2VydmljZXMuZ2V0TGlzdEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGl0ZW1OdW0gPSAxOwotICAgICAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAJc29ydGVkVmVjdG9yLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgICBRdWlja1NvcnQuc29ydChzb3J0ZWRWZWN0b3IpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3RFbGVtZW50IGxlID0gKExpc3RFbGVtZW50KXNvcnRlZFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgdWRkaVNlcnZpY2UgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB1ZGRpU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IiB2YWx1ZT0iPCU9bGUuZ2V0Vmlld0lkKCklPiIgb25DbGljaz0idmFsaWRhdGVDaGVja0JveElucHV0KHRoaXMsIHRoaXMuY2hlY2tlZCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIGxlLmdldFZpZXdJZCgpLCAwLCBmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PCU9U3RyaW5nLnZhbHVlT2YoaXRlbU51bSklPjwvYT48L3RkPgotCSAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgbGUuZ2V0Vmlld0lkKCksIDAsIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1uYW1lJT48L2E+PC90ZD4KLQkgICAgICAgICAgICAgICAgIDwlCi0JICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAJPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PCU9U3RyaW5nLnZhbHVlT2YoaXRlbU51bSklPjwvdGQ+Ci0JCQkJPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9TRVJWSUNFIiklPiZuYnNwOzwlPXVkZGlTZXJ2aWNlLmdldFVERElTZXJ2aWNlS2V5KCklPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgaXRlbU51bSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2VURESVNlcnZpY2VMaXN0JT4nLCc8JT14ZGl2VURESVNlcnZpY2VMaXN0JT4nKTsKLSAgICAgICAgPC9zY3JpcHQ+Ci0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FERF9UT19VRERJX1BFUlNQRUNUSVZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZVRERJU2VydmljZUxpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FERF9UT19GQVZPUklURVMiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdlVERElTZXJ2aWNlTGlzdCU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SRUZSRVNIIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZVRERJU2VydmljZUxpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZWZyZXNoQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLTwvZGl2PgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICByZXN1bWVQcm94eUxvYWRQYWdlKCk7Ci08L3NjcmlwdD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1dzZGxTZXJ2aWNlc1ZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1dzZGxTZXJ2aWNlc1ZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ2OWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9Xc2RsU2VydmljZXNWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0iamF2YS51dGlsLlZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlF1aWNrU29ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLldzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICBTdHJpbmcgZGl2V1NETExpc3QgPSAiZGl2V1NETExpc3QiOwotICAgIFN0cmluZyB4ZGl2V1NETExpc3QgPSAieGRpdldTRExMaXN0IjsKLQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlZJRVdfVElUTEVfV1NETF9TRVJWSUNFUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAid3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfV1NETF9TRVJWSUNFUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTElTVF9XU0RMX1NFUlZJQ0VTX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+ICAgIAotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyI+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuTk9ERUlEJT4iIHZhbHVlPSI8JT1zZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCklPiI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdldTRExMaXN0JT4nLCc8JT14ZGl2V1NETExpc3QlPicpIj48aW1nIG5hbWU9IjwlPXhkaXZXU0RMTGlzdCU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX1NFUlZJQ0UiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdldTRExMaXN0JT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9IndzaWxIYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZXU0RMTGlzdCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JVEVNX05VTUJFUiIpJT48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VSTCIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgTGlzdE1hbmFnZXIgd3NkbFNlcnZpY2VzID0gKChXc2lsRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFdTRExTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB3c2RsU2VydmljZXMuZ2V0TGlzdEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGl0ZW1OdW0gPSAxOwotICAgICAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAJc29ydGVkVmVjdG9yLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgICBRdWlja1NvcnQuc29ydChzb3J0ZWRWZWN0b3IpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3RFbGVtZW50IGxlID0gKExpc3RFbGVtZW50KXNvcnRlZFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFdzaWxXc2RsU2VydmljZUVsZW1lbnQgd3NkbFNlcnZpY2UgPSAoV3NpbFdzZGxTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxVUkwgPSB3c2RsU2VydmljZS5nZXRXU0RMU2VydmljZVVSTCgpOwotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgIG5hbWU9IjwlPUFjdGlvbklucHV0cy5WSUVXSUQlPiIgdmFsdWU9IjwlPWxlLmdldFZpZXdJZCgpJT4iIG9uQ2xpY2s9InZhbGlkYXRlQ2hlY2tCb3hJbnB1dCh0aGlzLCB0aGlzLmNoZWNrZWQpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBsZS5nZXRWaWV3SWQoKSwgMCwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPVN0cmluZy52YWx1ZU9mKGl0ZW1OdW0pJT48L2E+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjwlPXdzZGxVUkwlPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgICAgIGl0ZW1OdW0rKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAlPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICB0d2lzdEluaXQoJzwlPWRpdldTRExMaXN0JT4nLCc8JT14ZGl2V1NETExpc3QlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdldTRExMaXN0JT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BRERfVE9fRkFWT1JJVEVTIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZXU0RMTGlzdCU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1dzaWxMaW5rc1ZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1dzaWxMaW5rc1ZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk3ZGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9Xc2lsTGlua3NWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0iamF2YS51dGlsLlZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlF1aWNrU29ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5PcGVuV1NJTExpbmtBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZXU0lMTGlzdCA9ICJkaXZXU0lMTGlzdCI7Ci0gICAgU3RyaW5nIHhkaXZXU0lMTGlzdCA9ICJ4ZGl2V1NJTExpc3QiOwotCi0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiVklFV19USVRMRV9XU0lMX0xJTktTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFRhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ3c2lsL2ltYWdlcy9saXN0X1dTSUxfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfV1NJTF9MSU5LUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTElTVF9XU0lMX0xJTktTIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuV1NJTExpbmtBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9V3NpbEFjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiU+IiB2YWx1ZT0iMSI+Ci0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2V1NJTExpc3QlPicsJzwlPXhkaXZXU0lMTGlzdCU+JykiPjxpbWcgbmFtZT0iPCU9eGRpdldTSUxMaXN0JT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTSUxfTElOS1MiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdldTSUxMaXN0JT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9IndzaWxIYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZXU0lMTGlzdCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JVEVNX05VTUJFUiIpJT48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VSTCIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgTGlzdE1hbmFnZXIgd3NpbExpbmtzID0gKChXc2lsRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFdTSUxMaW5rcygpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB3c2lsTGlua3MuZ2V0TGlzdEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGl0ZW1OdW0gPSAxOwotICAgICAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAJc29ydGVkVmVjdG9yLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgICBRdWlja1NvcnQuc29ydChzb3J0ZWRWZWN0b3IpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3RFbGVtZW50IGxlID0gKExpc3RFbGVtZW50KXNvcnRlZFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFdzaWxXc2lsTGlua0VsZW1lbnQgd3NpbExpbmsgPSAoV3NpbFdzaWxMaW5rRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IHdzaWxMaW5rLmdldFdTSUxMaW5rTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giICBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuVklFV0lEJT4iIHZhbHVlPSI8JT1sZS5nZXRWaWV3SWQoKSU+IiBvbkNsaWNrPSJ2YWxpZGF0ZUNoZWNrQm94SW5wdXQodGhpcywgdGhpcy5jaGVja2VkKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgbGUuZ2V0Vmlld0lkKCksIDAsIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1TdHJpbmcudmFsdWVPZihpdGVtTnVtKSU+PC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48JT11cmwlPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgICAgIGl0ZW1OdW0rKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAlPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICB0d2lzdEluaXQoJzwlPWRpdldTSUxMaXN0JT4nLCc8JT14ZGl2V1NJTExpc3QlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUREX1RPX05BVklHQVRPUiIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2V1NJTExpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuV1NJTExpbmtBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhY2VjYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfYWN0aW9uc19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9QUk9QRVJUSUVTX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIiklPiIgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MSBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9TVEFUVVNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2lsX3N0YXR1c19jb250YWluZXIuanNwIiklPiIgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MSBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX25hdmlnYXRvcl9jb250YWluZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYmEyNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfTkFWSUdBVE9SX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2lsX25hdmlnYXRvcl90b29sYmFyLmpzcCIpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfTkFWSUdBVE9SX0NPTlRFTlQlPiIgdGl0bGU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2lsX25hdmlnYXRvcl9jb250ZW50LmpzcCIpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9uYXZpZ2F0b3JfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9uYXZpZ2F0b3JfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2M0YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPiAgICAgIAotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3RyZWV2aWV3LmNzcyIpKSU+Ij4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3RyZWV2aWV3LmpzIikpJT4iPgotICAgIDwvc2NyaXB0PgotPC9oZWFkPgotPCUKLSAgICBTdHJpbmcgc2VsZWN0ZWRBbmNob3JOYW1lID0gIiI7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgaW50IGZvY3VzZWROb2RlSWQgPSBub2RlTWFuYWdlci5nZXRGb2N1c2VkTm9kZUlkKCk7Ci0gICAgU3RyaW5nIGZvY3VzZWRBbmNob3JOYW1lID0gU3RyaW5nLnZhbHVlT2YoZm9jdXNlZE5vZGVJZCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLSAgICAgICAgc2VsZWN0ZWRBbmNob3JOYW1lID0gc2VsZWN0ZWROb2RlLmdldEFuY2hvck5hbWUoKTsKLSAgICAgICAgaWYgKGZvY3VzZWROb2RlSWQgPT0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKQotICAgICAgICAgICAgZm9jdXNlZEFuY2hvck5hbWUgPSBzZWxlY3RlZEFuY2hvck5hbWU7Ci0gICAgfQotJT4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgb25Mb2FkPSJzZWxmLmxvY2F0aW9uLmhhc2g9JyM8JT1mb2N1c2VkQW5jaG9yTmFtZSU+JztzZXRTZWxlY3RlZEFuY2hvck5hbWUoJzwlPXNlbGVjdGVkQW5jaG9yTmFtZSU+JykiIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci0gICAgPGRpdiBpZD0idHJlZWNvbnRlbnRib3JkZXIiPgotICAgICAgICA8JT1ub2RlTWFuYWdlci5yZW5kZXJUcmVlVmlldyhyZXNwb25zZSklPgotICAgIDwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfbmF2aWdhdG9yX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfbmF2aWdhdG9yX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQyMjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX25hdmlnYXRvcl90b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4gIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PiAgCi08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJ3c2lsL2FjdGlvbnMvUmVzaXplV1NJTEZyYW1lc0FjdGlvbkpTUC5qc3AiKTsKLSU+ICAKLTwvanNwOnVzZUJlYW4+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUZyYW1lTmFtZS5hcHBlbmQoV3NpbEZyYW1lTmFtZXMuV1NJTF9OQVZJR0FUT1JfQ09OVEFJTkVSKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL2Zvcm1zL1Byb2Nlc3NXU0lMRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvbmF2aWdhdG9yLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLTwlCi0gICBTdHJpbmcgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IG51bGw7Ci0gICBpZiAod3NpbFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19SRVNUT1JFIik7Ci0gICBlbHNlCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkUiKTsKLSU+ICAgICAgICAKLSAgICAgICAgPHRkIGlkPSJkb3VibGVjbGlja2NvbHVtbiIgdGl0bGU9IjwlPWRvdWJsZUNsaWNrQ29sdW1uVGl0bGUlPiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTkFWSUdBVE9SIiklPjwvdGQ+Ci08JQotICAgU3RyaW5nIGFsdFJlZnJlc2ggPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1JFRlJFU0hfV1NJTCIpOwotICAgU3RyaW5nIGFsdENsZWFyID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9DTEVBUl9XU0lMIik7Ci0lPiAgICAgICAgICAgCi0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC9hY3Rpb25zL1JlZnJlc2hBY3Rpb25KU1AuanNwIikpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTYgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRSZWZyZXNoJT4iIHRpdGxlPSI8JT1hbHRSZWZyZXNoJT4iPjwvYT48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvYWN0aW9ucy9DbGVhcldTSUxBY3Rpb25KU1AuanNwIikpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2IG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcykiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIiBhbHQ9IjwlPWFsdENsZWFyJT4iIHRpdGxlPSI8JT1hbHRDbGVhciU+Ij48L2E+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZGVkNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxmcmFtZXNldCBjb2xzPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiIgYmdjb2xvcj0iI0VDRTlEOCI+Ci0gIDwlCi0gIGlmIChvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5pc1JUTCgpKQotICB7Ci0gICU+Ci0gIDxmcmFtZSBuYW1lPSI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX0FDVElPTlNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NpbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AiKSU+IiBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTE+Ci0gIDxmcmFtZSBuYW1lPSI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX05BVklHQVRPUl9DT05UQUlORVIlPiIgdGl0bGU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AiKSU+IiBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTE+Ci0gIDwlCi0gIH0KLSAgZWxzZQotICB7Ci0gICU+Ci0gIDxmcmFtZSBuYW1lPSI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX05BVklHQVRPUl9DT05UQUlORVIlPiIgdGl0bGU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AiKSU+IiBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTE+Ci0gIDxmcmFtZSBuYW1lPSI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX0FDVElPTlNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NpbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AiKSU+IiBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTE+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMzZlNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVIiKSU+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfUFJPUEVSVElFU19UT09MQkFSJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfcHJvcGVydGllc190b29sYmFyLmpzcCIpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfUFJPUEVSVElFU19DT05URU5UJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfcHJvcGVydGllc19jb250ZW50LmpzcCIpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfcHJvcGVydGllc19jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyY2M3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTwlCi0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyOwotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sTWFuYWdlcigpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRUb29sICE9IG51bGwgJiYgc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikgewotICAgICAgICAlPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIGxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoc2VsZWN0ZWRUb29sLmdldEZvcm1MaW5rKCkpKSU+IjsKLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19BQ1RJT05fU0VMRUNURUQiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0gICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfcHJvcGVydGllc190b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhYTUwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3Rvb2xiYXIuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbGZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGRpcj0iPCU9b3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuRGlyVXRpbHMuZ2V0RGlyKCklPiIgY2xhc3M9InRvb2xiYXJib2R5bWFyZ2luIj4KLTxkaXYgaWQ9InRvb2xiYXJib3JkZXIiPgotICA8ZGl2IGlkPSJ0b29sYmFyIiBvbmRibGNsaWNrPSJwcm9jZXNzRnJhbWVzZXRTaXplcyhkb2N1bWVudC5mb3Jtc1swXSkiPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgZm9ybUFjdGlvbi5hcHBlbmQoIndzaWwvYWN0aW9ucy9SZXNpemVXU0lMRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChXc2lsRnJhbWVOYW1lcy5XU0lMX1BST1BFUlRJRVNfQ09OVEFJTkVSKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL2Zvcm1zL1Byb2Nlc3NXU0lMRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvYWN0aW9ucy5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci08JQotICAgU3RyaW5nIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBudWxsOwotICAgaWYgKHdzaWxQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgewotICAgICBpZiAod3NpbFBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKS5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19SRVNUT1JFIik7Ci0gICB9Ci0gICBpZiAoZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9PSBudWxsKQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFIik7Ci0lPiAgICAgICAgCi0gICAgICAgIDx0ZCBpZD0iZG91YmxlY2xpY2tjb2x1bW4iIHRpdGxlPSI8JT1kb3VibGVDbGlja0NvbHVtblRpdGxlJT4iIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0FDVElPTlMiKSU+PC90ZD4KLTwlCi0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkgewotICAgICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlcjsKLSAgICAgICAgaWYgKHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgICAgICAgICB0b29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0b29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8dG9vbE1hbmFnZXIuZ2V0TnVtYmVyT2ZUb29scygpOyBpKyspIHsKLSAgICAgICAgICAgIFRvb2wgdG9vbCA9IChUb29sKXRvb2xNYW5hZ2VyLmdldFRvb2woaSk7Ci0gICAgICAgICAgICAlPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48JT10b29sLnJlbmRlclRvb2wocmVzcG9uc2UsY29udHJvbGxlciklPjwvdGQ+Ci0gICAgICAgICAgICA8JQotICAgICAgICB9Ci0gICAgfQotJT4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3N0YXR1c19jb250YWluZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfc3RhdHVzX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODM0YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfc3RhdHVzX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgcm93cz0iMzMsKiIgYm9yZGVyPTAgYmdjb2xvcj0iI0VDRTlEOCI+Ci0gIDxmcmFtZSBuYW1lPSI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1NUQVRVU19UT09MQkFSJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NpbF9zdGF0dXNfdG9vbGJhci5qc3AiKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci0gIDxmcmFtZSBuYW1lPSI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1NUQVRVU19DT05URU5UJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NpbF9zdGF0dXNfY29udGVudC5qc3AiKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTE0NGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDI3ICAgMTI3NDQzIGplc3BlckBzZWxza2FiZXQub3JnIC0gSmVzcGVyIFMgTW9sbGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0Jb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPC9oZWFkPgotPGJvZHkgZGlyPSI8JT1vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5EaXJVdGlscy5nZXREaXIoKSU+IiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxwcmU+Ci08JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzU3RyaWN0KHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5nZXRNZXNzYWdlc0Zyb21MaXN0KCkpJT4KLSAgICAgICAgPC9wcmU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3N0YXR1c190b29sYmFyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3N0YXR1c190b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0ZjMwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9zdGF0dXNfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPiAgCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90b29sYmFyLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBkaXI9IjwlPW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkRpclV0aWxzLmdldERpcigpJT4iIGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJ3c2lsL2FjdGlvbnMvUmVzaXplV1NJTEZyYW1lc0FjdGlvbkpTUC5qc3AiKTsKLSU+ICAKLTwvanNwOnVzZUJlYW4+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUZyYW1lTmFtZS5hcHBlbmQoV3NpbEZyYW1lTmFtZXMuV1NJTF9TVEFUVVNfQ09OVEFJTkVSKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL2Zvcm1zL1Byb2Nlc3NXU0lMRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3RhdHVzLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLTwlCi0gICBTdHJpbmcgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IG51bGw7Ci0gICBpZiAod3NpbFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpLmVuZHNXaXRoKCIxMDAlIikpCi0gICB7Ci0gICAgIGlmICh3c2lsUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19SRVNUT1JFIik7Ci0gICB9Ci0gICBpZiAoZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9PSBudWxsKQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFIik7Ci0lPiAgICAgICAgCi0gICAgICAgIDx0ZCBpZD0iZG91YmxlY2xpY2tjb2x1bW4iIHRpdGxlPSI8JT1kb3VibGVDbGlja0NvbHVtblRpdGxlJT4iIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1NUQVRVUyIpJT48L3RkPgotPCUKLSAgIFN0cmluZyBhbHRDbGVhciA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0NMRUFSIik7Ci0lPiAgICAgICAgICAgCi0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IiB0YXJnZXQ9IjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfU1RBVFVTX0NPTlRFTlQlPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRDbGVhciU+IiB0aXRsZT0iPCU9YWx0Q2xlYXIlPiI+PC9hPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiOWIyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi0uY2R0cHJvamVjdAotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotcGFyc2VyLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWI2NjQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjEyMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjM4OjA4IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWIwYjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6Mzk6NTkgRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTY2MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIucGx1Z2luLlBhcnNlclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3Qud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcud3NkbDRqO2J1bmRsZS12ZXJzaW9uPSJbMS40LjAsMS41LjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5hcGFjaGUud3NpbDRqO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcudWRkaTRqO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjQsMi4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjZjY2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1YWM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIFBhcnNlcgotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZGlzY28vRElTQ09Db250cmFjdFJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Rpc2NvL0RJU0NPQ29udHJhY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2ZGFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZGlzY28vRElTQ09Db250cmFjdFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvOwotCi1wdWJsaWMgY2xhc3MgRElTQ09Db250cmFjdFJlZmVyZW5jZSBleHRlbmRzIERJU0NPUmVmZXJlbmNlCi17Ci0gIHByaXZhdGUgU3RyaW5nIGRvY1JlZl87Ci0gIAotICBwdWJsaWMgRElTQ09Db250cmFjdFJlZmVyZW5jZShTdHJpbmcgcmVmLFN0cmluZyBkb2NSZWYpCi0gIHsKLSAgICBzdXBlcihyZWYpOwotICAgIGRvY1JlZl8gPSBkb2NSZWY7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RG9jUmVmKCkKLSAgewotICAgIHJldHVybiBkb2NSZWZfOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Rpc2NvL0RJU0NPUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZGlzY28vRElTQ09QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwOTQ0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZGlzY28vRElTQ09QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY287Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL21zZG5tYWcvaXNzdWVzLzAyLzAyL3htbC9kZWZhdWx0LmFzcHggZm9yIG1vcmUKLSAqIGRldGFpbHMgb24gRElTQ08uCi0gKi8KLXB1YmxpYyBjbGFzcyBESVNDT1BhcnNlcgotewotICBwcml2YXRlIERvY3VtZW50QnVpbGRlciBwYXJzZXJfOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBOU19ESVNDTyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9kaXNjby8iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBESVNDT1ZFUlkgPSAiZGlzY292ZXJ5IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRElTQ09WRVJZX1JFRiA9ICJkaXNjb3ZlcnlSZWYiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBOU19DT05UUkFDVF9SRUYgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvZGlzY28vc2NsLyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIENPTlRSQUNUX1JFRiA9ICJjb250cmFjdFJlZiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJFRiA9ICJyZWYiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBET0NfUkVGID0gImRvY1JlZiI7Ci0KLSAgcHVibGljIERJU0NPUGFyc2VyKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jQnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBkb2NCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIHBhcnNlcl8gPSBkb2NCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKQotICAgIHsKLSAgICAgIHBhcnNlcl8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBESVNDT1JlZmVyZW5jZVtdIHBhcnNlKFN0cmluZyBkaXNjb1VSSSwgSW5wdXRTb3VyY2Ugc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAocGFyc2VyXyAhPSBudWxsKQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvYyA9IHBhcnNlcl8ucGFyc2Uoc291cmNlKTsKLSAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAvLyBSb290IGVsZW1lbnQgbXVzdCBieSA8ZGlzY286ZGlzY292ZXJ5Ci0gICAgICAvLyB4bWxuczpkaXNjbz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvZGlzY28vIj4KLSAgICAgIGlmIChyb290RWxlbWVudCAhPSBudWxsICYmIHJvb3RFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhOU19ESVNDTykgJiYgcm9vdEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKERJU0NPVkVSWSkpCi0gICAgICB7Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSByb290RWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIFZlY3RvciBkaXNjb1JlZmVyZW5jZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0gICAgICAgICAgaWYgKGNoaWxkTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpY2hpbGROb2RlOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbnNVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5zVVJJLmVxdWFscyhOU19ESVNDTykgJiYgbG9jYWxOYW1lLmVxdWFscyhESVNDT1ZFUllfUkVGKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gRElTQ08gbGluay4KLSAgICAgICAgICAgICAgU3RyaW5nIHJlZiA9IGNvbnZlcnRUb0Fic29sdXRlVVJJKGRpc2NvVVJJLCBlbGVtZW50LmdldEF0dHJpYnV0ZShSRUYpKTsKLSAgICAgICAgICAgICAgZGlzY29SZWZlcmVuY2VzLmFkZEVsZW1lbnQobmV3IERJU0NPUmVmZXJlbmNlKHJlZikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobnNVUkkuZXF1YWxzKE5TX0NPTlRSQUNUX1JFRikgJiYgbG9jYWxOYW1lLmVxdWFscyhDT05UUkFDVF9SRUYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBXU0RMIGxpbmsuCi0gICAgICAgICAgICAgIFN0cmluZyByZWYgPSBjb252ZXJ0VG9BYnNvbHV0ZVVSSShkaXNjb1VSSSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoUkVGKSk7Ci0gICAgICAgICAgICAgIFN0cmluZyBkb2NSZWYgPSBjb252ZXJ0VG9BYnNvbHV0ZVVSSShkaXNjb1VSSSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoRE9DX1JFRikpOwotICAgICAgICAgICAgICBkaXNjb1JlZmVyZW5jZXMuYWRkRWxlbWVudChuZXcgRElTQ09Db250cmFjdFJlZmVyZW5jZShyZWYsIGRvY1JlZikpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgbnVtYmVyT2ZESVNDT1JlZmVyZW5jZXMgPSBkaXNjb1JlZmVyZW5jZXMuc2l6ZSgpOwotICAgICAgICBpZiAobnVtYmVyT2ZESVNDT1JlZmVyZW5jZXMgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgRElTQ09SZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IERJU0NPUmVmZXJlbmNlW251bWJlck9mRElTQ09SZWZlcmVuY2VzXTsKLSAgICAgICAgICBkaXNjb1JlZmVyZW5jZXMuY29weUludG8ocmVmZXJlbmNlcyk7Ci0gICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlIGRvY3VtZW50IGlzIG5vdCBhIHZhbGlkIERJU0NPIGRvY3VtZW50LgotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvQWJzb2x1dGVVUkkoU3RyaW5nIGRpc2NvVVJJLCBTdHJpbmcgcmVmVVJJKQotICB7Ci0gICAgaWYgKHJlZlVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChyZWZVUkkuaW5kZXhPZigiOi8vIikgPiAtMSkKLSAgICAgIHsKLSAgICAgICAgLy8gcmVmVVJJIGlzIGFscmVhZHkgYWJzb2x1dGUuCi0gICAgICAgIHJldHVybiByZWZVUkk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhYnNvbHV0ZVVSSSA9IG5ldyBTdHJpbmdCdWZmZXIoZGlzY29VUkkuc3Vic3RyaW5nKDAsIE1hdGgubWF4KGRpc2NvVVJJLmxhc3RJbmRleE9mKCdcXCcpLCBkaXNjb1VSSS5sYXN0SW5kZXhPZignLycpICsgMSkpKTsKLSAgICAgICAgYWJzb2x1dGVVUkkuYXBwZW5kKHJlZlVSSSk7Ci0gICAgICAgIHJldHVybiBhYnNvbHV0ZVVSSS50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9kaXNjby9ESVNDT1JlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Rpc2NvL0RJU0NPUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjE3NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Rpc2NvL0RJU0NPUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY287Ci0KLXB1YmxpYyBjbGFzcyBESVNDT1JlZmVyZW5jZQotewotICBwcml2YXRlIFN0cmluZyByZWZfOwotICAKLSAgcHVibGljIERJU0NPUmVmZXJlbmNlKFN0cmluZyByZWYpCi0gIHsKLSAgICByZWZfID0gcmVmOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlZigpCi0gIHsKLSAgICByZXR1cm4gcmVmXzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9kaXNjb3ZlcnkvTmV0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9kaXNjb3ZlcnkvTmV0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3YTQ4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZGlzY292ZXJ5L05ldFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotaW1wb3J0IHN1bi5taXNjLkJBU0U2NEVuY29kZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBOZXRVdGlscwotewotCi0gIC8qKgotICAgKiBHZXQgdGhlIGphdmEubmV0LlVSTENvbm5lY3Rpb24gZ2l2ZW4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwuIFRoaXMgY2xhc3MgZW5zdXJlcwotICAgKiB0aGF0IHByb3h5IHNldHRpbmdzIGluIFdTQUQgYXJlIHJlc3BlY3RlZC4KLSAgICogQHBhcmFtIHVybFN0cmluZyBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwuCi0gICAqIEByZXR1cm4gamF2YS5uZXQuVVJMQ0Rvbm5lY3Rpb24gVVJMQ29ubmVjdGlvbiB0byB0aGUgVVJMLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBVUkxDb25uZWN0aW9uIGdldFVSTENvbm5lY3Rpb24oU3RyaW5nIHVybFN0cmluZykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB1cmwgPSBjcmVhdGVVUkwodXJsU3RyaW5nKTsKLSAgICAgIFVSTENvbm5lY3Rpb24gdWMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgIFN0cmluZyBwcm94eVVzZXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5VXNlck5hbWUiKTsKLSAgICAgIFN0cmluZyBwcm94eVBhc3N3b3JkID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5UGFzc3dvcmQiKTsKLSAgICAgIGlmIChwcm94eVVzZXJOYW1lICE9IG51bGwgJiYgcHJveHlQYXNzd29yZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgdXNlck5hbWVQYXNzd29yZCA9IG5ldyBTdHJpbmdCdWZmZXIocHJveHlVc2VyTmFtZSk7Ci0gICAgICAgIHVzZXJOYW1lUGFzc3dvcmQuYXBwZW5kKCc6JykuYXBwZW5kKHByb3h5UGFzc3dvcmQpOwotICAgICAgICBCQVNFNjRFbmNvZGVyIGVuY29kZXIgPSBuZXcgQkFTRTY0RW5jb2RlcigpOwotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBlbmNvZGVyLmVuY29kZSh1c2VyTmFtZVBhc3N3b3JkLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHVzZXJOYW1lUGFzc3dvcmQuc2V0TGVuZ3RoKDApOwotICAgICAgICB1c2VyTmFtZVBhc3N3b3JkLmFwcGVuZCgiQmFzaWMgIikuYXBwZW5kKGVuY29kaW5nKTsKLSAgICAgICAgdWMuc2V0UmVxdWVzdFByb3BlcnR5KCJQcm94eS1hdXRob3JpemF0aW9uIix1c2VyTmFtZVBhc3N3b3JkLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHVjOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBqYXZhLmlvLklucHV0U3RyZWFtIGZvciBhIFVSTCBnaXZlbiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTC4gVGhpcyBjbGFzcwotICAgKiBlbnN1cmVzIHRoYXQgcHJveHkgc2V0dGluZ3MgaW4gV1NBRCBhcmUgcmVzcGVjdGVkLgotICAgKiBAcGFyYW0gdXJsU3RyaW5nIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTC4KLSAgICogQHJldHVybiBqYXZhLmlvLklucHV0U3RyZWFtIElucHV0U3RyZWFtIGZvciByZWFkaW5nIHRoZSBVUkwgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnB1dFN0cmVhbSBnZXRVUkxJbnB1dFN0cmVhbShTdHJpbmcgdXJsU3RyaW5nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMQ29ubmVjdGlvbiB1YyA9IGdldFVSTENvbm5lY3Rpb24odXJsU3RyaW5nKTsKLSAgICAgIGlmICh1YyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVjLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgIHJldHVybiBpczsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBVUkwgZnJvbSBhIHN0cmluZy4KLSAgICogQHBhcmFtIHVybFN0cmluZyBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwuCi0gICAqIEByZXR1cm4gVVJMIGphdmEubGFuZy5VUkwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSTC4KLSAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVVJMIGNyZWF0ZVVSTChTdHJpbmcgdXJsU3RyaW5nKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gIHsKLSAgCXJldHVybiBuZXcgVVJMKHVybFN0cmluZyk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZGlzY292ZXJ5L1dlYlNlcnZpY2VzUGFyc2VyRXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZGlzY292ZXJ5L1dlYlNlcnZpY2VzUGFyc2VyRXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTA3NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Rpc2NvdmVyeS9XZWJTZXJ2aWNlc1BhcnNlckV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc1BhcnNlckV4dCBleHRlbmRzIFdlYlNlcnZpY2VzUGFyc2VyIHsKLQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXJFeHQoU3RyaW5nIHVyaSkgewotICAgICAgICBzdXBlcih1cmkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBVUkwgY3JlYXRlVVJMKFN0cmluZyB1cmwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gTmV0VXRpbHMuY3JlYXRlVVJMKHVybCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjJlOTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNDb25zdGFudHMKLXsKLSAgLy8gTmFtZXNwYWNlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9XU0RMID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VERElfVjEgPSAidXJuOnVkZGktb3JnOmFwaSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VRERJX1YyID0gInVybjp1ZGRpLW9yZzphcGlfdjIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVURESV9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDEvMTAvaW5zcGVjdGlvbi91ZGRpLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9XU0lMX0lOU1BFQ1RJT04gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMS8xMC9pbnNwZWN0aW9uLyI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc0xpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGM5MTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkxpbms7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNMaW5rCi17Ci0gIHByb3RlY3RlZCBMaW5rIGxpbmtfOwotCi0gIHB1YmxpYyBGYXZvcml0ZXNMaW5rKCkKLSAgewotICAgIGxpbmtfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBMaW5rIGdldExpbmsoKQotICB7Ci0gICAgcmV0dXJuIGxpbmtfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGluayhMaW5rIGxpbmspCi0gIHsKLSAgICBsaW5rXyA9IGxpbms7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2N2ZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1JlZ2lzdHJ5VHlwZUFic3RyYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuQWJzdHJhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5JbnNwZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5CdXNpbmVzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmltcGwuQWJzdHJhY3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5pbXBsLkRlc2NyaXB0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5MaW5rSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5TZXJ2aWNlTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmltcGwuZXh0ZW5zaW9uLnVkZGkuQnVzaW5lc3NEZXNjcmlwdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmltcGwuZXh0ZW5zaW9uLnVkZGkuU2VydmljZURlc2NyaXB0aW9uSW1wbDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQnVzaW5lc3NLZXk7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLlNlcnZpY2VLZXk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYXZvcml0ZXNSZWdpc3RyeVR5cGVBYnN0cmFjdCBpbXBsZW1lbnRzIElGYXZvcml0ZXNSZWdpc3RyeVR5cGUKLXsKLSAgcHVibGljIEZhdm9yaXRlc1JlZ2lzdHJ5VHlwZUFic3RyYWN0KCkKLSAgewotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZWFkTG9jYXRpb24oKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRXcml0ZUxvY2F0aW9uKCk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBXU0lMRG9jdW1lbnQgZ2V0V1NJTERvY3VtZW50KCk7Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBXU0lMRG9jdW1lbnQgbG9hZFdTSUxEb2N1bWVudChTdHJpbmcgcGF0aCwgYm9vbGVhbiBmb3JjZSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gV1NJTERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0gICAgICB3c2lsRG9jLnJlYWQobmV3IEZpbGVSZWFkZXIobmV3IEZpbGUocGF0aCkpKTsKLSAgICAgIHJldHVybiB3c2lsRG9jOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgaWYgKGZvcmNlKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBXU0lMRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQyKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGYXZvcml0ZXNWZXJzaW9uKCkKLSAgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBpbnNwZWN0aW9uLmdldEFic3RyYWN0cygpOwotICAgIGlmIChhYnN0cmFjdHMubGVuZ3RoID4gMCkKLSAgICAgIHJldHVybiBhYnN0cmFjdHNbMF0uZ2V0VGV4dCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmF2b3JpdGVzVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgQWJzdHJhY3QgYWJzdCA9IG5ldyBBYnN0cmFjdEltcGwoKTsKLSAgICBhYnN0LnNldFRleHQodmVyc2lvbik7Ci0gICAgaW5zcGVjdGlvbi5yZW1vdmVBYnN0cmFjdHMoKTsKLSAgICBpbnNwZWN0aW9uLmFkZEFic3RyYWN0KGFic3QpOwotICB9Ci0KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNhdmUoKSB0aHJvd3MgV1NJTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgaWYgKHdzaWxEb2MgIT0gbnVsbCkKLSAgICAgIHdzaWxEb2Mud3JpdGUoZ2V0V3JpdGVMb2NhdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5W10gZ2V0RmF2b3JpdGVzVURESVJlZ2lzdHJpZXMoKQotICB7Ci0gICAgTGlua1tdIGxpbmtzID0gbG9hZFVERElSZWdpc3RyaWVzKCk7Ci0gICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5W10gcmVnaXN0cmllcyA9IG5ldyBGYXZvcml0ZXNVRERJUmVnaXN0cnlbbGlua3MubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlZ2lzdHJpZXNbaV0gPSBuZXcgRmF2b3JpdGVzVURESVJlZ2lzdHJ5KCk7Ci0gICAgICByZWdpc3RyaWVzW2ldLnNldExpbmsobGlua3NbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcmVnaXN0cmllczsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESUJ1c2luZXNzW10gZ2V0RmF2b3JpdGVzVURESUJ1c2luZXNzZXMoKQotICB7Ci0gICAgTGlua1tdIGxpbmtzID0gbG9hZFVERElCdXNpbmVzc2VzKCk7Ci0gICAgRmF2b3JpdGVzVURESUJ1c2luZXNzW10gYnVzaW5lc3NlcyA9IG5ldyBGYXZvcml0ZXNVRERJQnVzaW5lc3NbbGlua3MubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGJ1c2luZXNzZXNbaV0gPSBuZXcgRmF2b3JpdGVzVURESUJ1c2luZXNzKCk7Ci0gICAgICBidXNpbmVzc2VzW2ldLnNldExpbmsobGlua3NbaV0pOwotICAgIH0KLSAgICByZXR1cm4gYnVzaW5lc3NlczsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVNlcnZpY2VbXSBnZXRGYXZvcml0ZXNVRERJU2VydmljZXMoKQotICB7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gbG9hZFVERElTZXJ2aWNlcygpOwotICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlW10gdWRkaVNlcnZpY2VzID0gbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlW3NlcnZpY2VzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB1ZGRpU2VydmljZXNbaV0gPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2UoKTsKLSAgICAgIHVkZGlTZXJ2aWNlc1tpXS5zZXRTZXJ2aWNlKHNlcnZpY2VzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVkZGlTZXJ2aWNlczsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VbXSBnZXRGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZXMoKQotICB7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gbG9hZFVERElTZXJ2aWNlSW50ZXJmYWNlcygpOwotICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlW10gc2VySW50cyA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZVtzZXJ2aWNlcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgc2VySW50c1tpXSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSgpOwotICAgICAgc2VySW50c1tpXS5zZXRTZXJ2aWNlKHNlcnZpY2VzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlckludHM7Ci0gIH0KLQotICBwdWJsaWMgSUZhdm9yaXRlc1dTRExbXSBnZXRGYXZvcml0ZXNXU0RMcygpCi0gIHsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBsb2FkV1NETFNlcnZpY2VzKCk7Ci0gICAgRmF2b3JpdGVzV1NETFtdIHdzZGxzID0gbmV3IEZhdm9yaXRlc1dTRExbc2VydmljZXMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHdzZGxzW2ldID0gbmV3IEZhdm9yaXRlc1dTREwoKTsKLSAgICAgIHdzZGxzW2ldLnNldFNlcnZpY2Uoc2VydmljZXNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gd3NkbHM7Ci0gIH0KLQotICBwdWJsaWMgSUZhdm9yaXRlc1dTSUxbXSBnZXRGYXZvcml0ZXNXU0lMcygpCi0gIHsKLSAgICBMaW5rW10gbGlua3MgPSBsb2FkV1NJTHMoKTsKLSAgICBGYXZvcml0ZXNXU0lMW10gd3NpbHMgPSBuZXcgRmF2b3JpdGVzV1NJTFtsaW5rcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgd3NpbHNbaV0gPSBuZXcgRmF2b3JpdGVzV1NJTCgpOwotICAgICAgd3NpbHNbaV0uc2V0TGluayhsaW5rc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiB3c2lsczsKLSAgfQotCi0gIHB1YmxpYyBMaW5rW10gbG9hZFVERElSZWdpc3RyaWVzKCkgewotICAgIHJldHVybiBsb2FkTGlua3NCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjEpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBMaW5rW10gbG9hZFVERElCdXNpbmVzc2VzKCkgewotICAgIHJldHVybiBsb2FkTGlua3NCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjIpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2VbXSBsb2FkVURESVNlcnZpY2VzKCkgewotICAgIHJldHVybiBsb2FkU2VydmljZXNCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjIpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2VbXSBsb2FkVURESVNlcnZpY2VJbnRlcmZhY2VzKCkgewotICAgIHJldHVybiBsb2FkU2VydmljZXNCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjEpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2VbXSBsb2FkV1NETFNlcnZpY2VzKCkgewotICAgIHJldHVybiBsb2FkU2VydmljZXNCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1dTREwpOwotICB9Ci0KLSAgcHVibGljIExpbmtbXSBsb2FkV1NJTHMoKSB7Ci0gICAgcmV0dXJuIGxvYWRMaW5rc0J5TmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfV1NJTF9JTlNQRUNUSU9OKTsKLSAgfQotCi0gIHByaXZhdGUgU2VydmljZVtdIGxvYWRTZXJ2aWNlc0J5TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICBWZWN0b3Igc2VydmljZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIGlmICh3c2lsRG9jICE9IG51bGwpCi0gICAgewotICAgICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBpbnNwZWN0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICAgRGVzY3JpcHRpb25bXSBkZXNjID0gc2VydmljZXNbaV0uZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICBpZiAoZGVzY1swXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgIHNlcnZpY2VWZWN0b3IuYWRkKHNlcnZpY2VzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gbmV3IFNlcnZpY2Vbc2VydmljZVZlY3Rvci5zaXplKCldOwotICAgIHNlcnZpY2VWZWN0b3IuY29weUludG8oc2VydmljZXMpOwotICAgIHJldHVybiBzZXJ2aWNlczsKLSAgfQotCi0gIHByaXZhdGUgTGlua1tdIGxvYWRMaW5rc0J5TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICBWZWN0b3IgbGlua1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIGlmICh3c2lsRG9jICE9IG51bGwpCi0gICAgewotICAgICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgICBMaW5rW10gbGlua3MgPSBpbnNwZWN0aW9uLmdldExpbmtzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAobGlua3NbaV0uZ2V0UmVmZXJlbmNlZE5hbWVzcGFjZSgpLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICAgIGxpbmtWZWN0b3IuYWRkKGxpbmtzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlua1tdIGxpbmtzID0gbmV3IExpbmtbbGlua1ZlY3Rvci5zaXplKCldOwotICAgIGxpbmtWZWN0b3IuY29weUludG8obGlua3MpOwotICAgIHJldHVybiBsaW5rczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElSZWdpc3RyeShJRmF2b3JpdGVzVURESVJlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gICAgYWRkVURESVJlZ2lzdHJ5KHJlZ2lzdHJ5LmdldE5hbWUoKSwgcmVnaXN0cnkuZ2V0SW5xdWlyeVVSTCgpLCByZWdpc3RyeS5nZXRQdWJsaXNoVVJMKCksIHJlZ2lzdHJ5LmdldFJlZ2lzdHJhdGlvblVSTCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElCdXNpbmVzcyhJRmF2b3JpdGVzVURESUJ1c2luZXNzIGJ1c2luZXNzKQotICB7Ci0gICAgYWRkVURESUJ1c2luZXNzKGJ1c2luZXNzLmdldE5hbWUoKSwgYnVzaW5lc3MuZ2V0SW5xdWlyeVVSTCgpLCBidXNpbmVzcy5nZXRCdXNpbmVzc0tleSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElTZXJ2aWNlKElGYXZvcml0ZXNVRERJU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgYWRkVURESVNlcnZpY2Uoc2VydmljZS5nZXROYW1lKCksIHNlcnZpY2UuZ2V0SW5xdWlyeVVSTCgpLCBzZXJ2aWNlLmdldFNlcnZpY2VLZXkoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZShJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2Ugc2VydmljZUludGVyZmFjZSkKLSAgewotICAgIGFkZFVERElTZXJ2aWNlSW50ZXJmYWNlKHNlcnZpY2VJbnRlcmZhY2UuZ2V0TmFtZSgpLCBzZXJ2aWNlSW50ZXJmYWNlLmdldElucXVpcnlVUkwoKSwgc2VydmljZUludGVyZmFjZS5nZXRTZXJ2aWNlSW50ZXJmYWNlS2V5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzV1NETChJRmF2b3JpdGVzV1NETCB3c2RsKQotICB7Ci0gICAgYWRkV1NETFNlcnZpY2Uod3NkbC5nZXRXc2RsVXJsKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzV1NJTChJRmF2b3JpdGVzV1NJTCB3c2lsKQotICB7Ci0gICAgYWRkV1NJTExpbmsod3NpbC5nZXRXc2lsVXJsKCkpOwotICB9Ci0KLSAgcHVibGljIExpbmsgYWRkVURESVJlZ2lzdHJ5KFN0cmluZyByZWdpc3RyeU5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgcHVibGlzaEFQSSwgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgTGluayBsaW5rID0gbmV3IExpbmtJbXBsKCk7Ci0gICAgLy8gcmVnaXN0cnkgbmFtZQotICAgIEFic3RyYWN0IGFic3QgPSBuZXcgQWJzdHJhY3RJbXBsKCk7Ci0gICAgYWJzdC5zZXRUZXh0KHJlZ2lzdHJ5TmFtZSk7Ci0gICAgbGluay5hZGRBYnN0cmFjdChhYnN0KTsKLSAgICAvLyBpbnF1aXJ5IFVSTAotICAgIEFic3RyYWN0IGFic3QyID0gbmV3IEFic3RyYWN0SW1wbCgpOwotICAgIGFic3QyLnNldFRleHQoaW5xdWlyeUFQSSk7Ci0gICAgbGluay5hZGRBYnN0cmFjdChhYnN0Mik7Ci0gICAgLy8gcHVibGlzaCBVUkwKLSAgICBBYnN0cmFjdCBhYnN0MyA9IG5ldyBBYnN0cmFjdEltcGwoKTsKLSAgICBpZiAocHVibGlzaEFQSSAhPSBudWxsKQotICAgICAgYWJzdDMuc2V0VGV4dChwdWJsaXNoQVBJKTsKLSAgICBlbHNlCi0gICAgICBhYnN0My5zZXRUZXh0KCIiKTsKLSAgICBsaW5rLmFkZEFic3RyYWN0KGFic3QzKTsKLSAgICAvLyByZWdpc3RyYXRpb24gVVJMCi0gICAgQWJzdHJhY3QgYWJzdDQgPSBuZXcgQWJzdHJhY3RJbXBsKCk7Ci0gICAgaWYgKHJlZ2lzdHJhdGlvblVSTCAhPSBudWxsKQotICAgICAgYWJzdDQuc2V0VGV4dChyZWdpc3RyYXRpb25VUkwpOwotICAgIGVsc2UKLSAgICAgIGFic3Q0LnNldFRleHQoIiIpOwotICAgIGxpbmsuYWRkQWJzdHJhY3QoYWJzdDQpOwotICAgIC8vIGFkZCBuYW1lc3BhY2UKLSAgICBsaW5rLnNldFJlZmVyZW5jZWROYW1lc3BhY2UoRmF2b3JpdGVzQ29uc3RhbnRzLk5BTUVTUEFDRV9VRERJX1YxKTsKLSAgICBpbnNwZWN0aW9uLmFkZExpbmsobGluayk7Ci0gICAgcmV0dXJuIGxpbms7Ci0gIH0KLQotICBwdWJsaWMgTGluayBhZGRVRERJQnVzaW5lc3MoU3RyaW5nIGJ1c2luZXNzTmFtZSwgU3RyaW5nIGlucXVpcnlBUEksIFN0cmluZyBidXNpbmVzc0tleSkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgTGluayBsaW5rID0gbmV3IExpbmtJbXBsKCk7Ci0gICAgQWJzdHJhY3QgYWJzdCA9IG5ldyBBYnN0cmFjdEltcGwoKTsKLSAgICBhYnN0LnNldFRleHQoYnVzaW5lc3NOYW1lKTsKLSAgICBsaW5rLmFkZEFic3RyYWN0KGFic3QpOwotICAgIGxpbmsuc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjIpOwotICAgIEJ1c2luZXNzRGVzY3JpcHRpb24gYmQgPSBuZXcgQnVzaW5lc3NEZXNjcmlwdGlvbkltcGwoKTsKLSAgICBiZC5zZXRMb2NhdGlvbihpbnF1aXJ5QVBJKTsKLSAgICBCdXNpbmVzc0tleSBrZXkgPSBuZXcgQnVzaW5lc3NLZXkoYnVzaW5lc3NLZXkpOwotICAgIGJkLnNldEJ1c2luZXNzS2V5KGtleSk7Ci0gICAgbGluay5zZXRFeHRlbnNpb25FbGVtZW50KGJkKTsKLSAgICBpbnNwZWN0aW9uLmFkZExpbmsobGluayk7Ci0gICAgcmV0dXJuIGxpbms7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBhZGRVRERJU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgc2VydmljZUtleSkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2VJbXBsKCk7Ci0gICAgU2VydmljZU5hbWUgbmFtZSA9IG5ldyBTZXJ2aWNlTmFtZUltcGwoKTsKLSAgICBuYW1lLnNldFRleHQoc2VydmljZU5hbWUpOwotICAgIHNlcnZpY2UuYWRkU2VydmljZU5hbWUobmFtZSk7Ci0gICAgRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKLSAgICBkZXNjLnNldFJlZmVyZW5jZWROYW1lc3BhY2UoRmF2b3JpdGVzQ29uc3RhbnRzLk5BTUVTUEFDRV9VRERJX1YyKTsKLSAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbCgpOwotICAgIHNkLnNldExvY2F0aW9uKGlucXVpcnlBUEkpOwotICAgIFNlcnZpY2VLZXkga2V5ID0gbmV3IFNlcnZpY2VLZXkoc2VydmljZUtleSk7Ci0gICAgc2Quc2V0U2VydmljZUtleShrZXkpOwotICAgIGRlc2Muc2V0RXh0ZW5zaW9uRWxlbWVudChzZCk7Ci0gICAgc2VydmljZS5hZGREZXNjcmlwdGlvbihkZXNjKTsKLSAgICBpbnNwZWN0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBhZGRVRERJU2VydmljZUludGVyZmFjZShTdHJpbmcgc2VySW50TmFtZSwgU3RyaW5nIGlucXVpcnlBUEksIFN0cmluZyBzZXJJbnRLZXkpIHsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlSW1wbCgpOwotICAgIFNlcnZpY2VOYW1lIG5hbWUgPSBuZXcgU2VydmljZU5hbWVJbXBsKCk7Ci0gICAgbmFtZS5zZXRUZXh0KHNlckludE5hbWUpOwotICAgIHNlcnZpY2UuYWRkU2VydmljZU5hbWUobmFtZSk7Ci0gICAgRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKLSAgICBkZXNjLnNldFJlZmVyZW5jZWROYW1lc3BhY2UoRmF2b3JpdGVzQ29uc3RhbnRzLk5BTUVTUEFDRV9VRERJX1YxKTsKLSAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbCgpOwotICAgIHNkLnNldExvY2F0aW9uKGlucXVpcnlBUEkpOwotICAgIFNlcnZpY2VLZXkga2V5ID0gbmV3IFNlcnZpY2VLZXkoc2VySW50S2V5KTsKLSAgICBzZC5zZXRTZXJ2aWNlS2V5KGtleSk7Ci0gICAgZGVzYy5zZXRFeHRlbnNpb25FbGVtZW50KHNkKTsKLSAgICBzZXJ2aWNlLmFkZERlc2NyaXB0aW9uKGRlc2MpOwotICAgIGluc3BlY3Rpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlIGFkZFdTRExTZXJ2aWNlKFN0cmluZyB1cmwpIHsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlSW1wbCgpOwotICAgIERlc2NyaXB0aW9uIGRlc2MgPSBuZXcgRGVzY3JpcHRpb25JbXBsKCk7Ci0gICAgZGVzYy5zZXRMb2NhdGlvbih1cmwpOwotICAgIGRlc2Muc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1dTREwpOwotICAgIHNlcnZpY2UuYWRkRGVzY3JpcHRpb24oZGVzYyk7Ci0gICAgaW5zcGVjdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIExpbmsgYWRkV1NJTExpbmsoU3RyaW5nIHVybCkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgTGluayBsaW5rID0gbmV3IExpbmtJbXBsKCk7Ci0gICAgbGluay5zZXRMb2NhdGlvbih1cmwpOwotICAgIGxpbmsuc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1dTSUxfSU5TUEVDVElPTik7Ci0gICAgaW5zcGVjdGlvbi5hZGRMaW5rKGxpbmspOwotICAgIHJldHVybiBsaW5rOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESVJlZ2lzdHJ5KElGYXZvcml0ZXNVRERJUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICBpZiAocmVnaXN0cnkgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJUmVnaXN0cnkpCi0gICAgICByZW1vdmVMaW5rKCgoRmF2b3JpdGVzVURESVJlZ2lzdHJ5KXJlZ2lzdHJ5KS5nZXRMaW5rKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESUJ1c2luZXNzKElGYXZvcml0ZXNVRERJQnVzaW5lc3MgYnVzaW5lc3MpCi0gIHsKLSAgICBpZiAoYnVzaW5lc3MgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJQnVzaW5lc3MpCi0gICAgICByZW1vdmVMaW5rKCgoRmF2b3JpdGVzVURESUJ1c2luZXNzKWJ1c2luZXNzKS5nZXRMaW5rKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESVNlcnZpY2UoSUZhdm9yaXRlc1VERElTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElTZXJ2aWNlKQotICAgICAgcmVtb3ZlU2VydmljZSgoKEZhdm9yaXRlc1VERElTZXJ2aWNlKXNlcnZpY2UpLmdldFNlcnZpY2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZShJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2Ugc2VydmljZUludGVyZmFjZSkKLSAgewotICAgIGlmIChzZXJ2aWNlSW50ZXJmYWNlIGluc3RhbmNlb2YgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UpCi0gICAgICByZW1vdmVTZXJ2aWNlKCgoRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2Upc2VydmljZUludGVyZmFjZSkuZ2V0U2VydmljZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZhdm9yaXRlc1dTREwoSUZhdm9yaXRlc1dTREwgd3NkbCkKLSAgewotICAgIGlmICh3c2RsIGluc3RhbmNlb2YgRmF2b3JpdGVzV1NETCkKLSAgICAgIHJlbW92ZVNlcnZpY2UoKChGYXZvcml0ZXNXU0RMKXdzZGwpLmdldFNlcnZpY2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNXU0lMKElGYXZvcml0ZXNXU0lMIHdzaWwpCi0gIHsKLSAgICBpZiAod3NpbCBpbnN0YW5jZW9mIEZhdm9yaXRlc1dTSUwpCi0gICAgICByZW1vdmVMaW5rKCgoRmF2b3JpdGVzV1NJTCl3c2lsKS5nZXRMaW5rKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIGluc3BlY3Rpb24ucmVtb3ZlU2VydmljZShzZXJ2aWNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpbmsoTGluayBsaW5rKQotICB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICBpbnNwZWN0aW9uLnJlbW92ZUxpbmsobGluayk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MjBmOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1NlcnZpY2UKLXsKLSAgcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZV87Ci0KLSAgcHVibGljIEZhdm9yaXRlc1NlcnZpY2UoKQotICB7Ci0gICAgc2VydmljZV8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIHNlcnZpY2VfID0gc2VydmljZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESUJ1c2luZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Mzg4M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5CdXNpbmVzc0Rlc2NyaXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESUJ1c2luZXNzIGV4dGVuZHMgRmF2b3JpdGVzTGluayBpbXBsZW1lbnRzIElGYXZvcml0ZXNVRERJQnVzaW5lc3MKLXsKLSAgcHVibGljIEZhdm9yaXRlc1VERElCdXNpbmVzcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAobGlua18uZ2V0QWJzdHJhY3RzKCkpWzBdLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpCi0gIHsKLSAgICByZXR1cm4gKChCdXNpbmVzc0Rlc2NyaXB0aW9uKWxpbmtfLmdldEV4dGVuc2lvbkVsZW1lbnQoKSkuZ2V0TG9jYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QnVzaW5lc3NLZXkoKQotICB7Ci0gICAgcmV0dXJuICgoQnVzaW5lc3NEZXNjcmlwdGlvbilsaW5rXy5nZXRFeHRlbnNpb25FbGVtZW50KCkpLmdldEJ1c2luZXNzS2V5KCkuZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QnVzaW5lc3NLZXkoU3RyaW5nIGtleSkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjODA3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkFic3RyYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIucGx1Z2luLlBhcnNlclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElSZWdpc3RyeSBleHRlbmRzIEZhdm9yaXRlc0xpbmsgaW1wbGVtZW50cyBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5Ci17Ci0gIHB1YmxpYyBGYXZvcml0ZXNVRERJUmVnaXN0cnkoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IChsaW5rXy5nZXRBYnN0cmFjdHMoKSlbMF0uZ2V0VGV4dCgpOwotICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdHJhbnNsYXRlZE5hbWUgPSBQYXJzZXJQbHVnaW4uZ2V0TWVzc2FnZShuYW1lKTsKLSAgICAgIGlmICh0cmFuc2xhdGVkTmFtZSAhPSBudWxsKQotICAgICAgICBuYW1lID0gdHJhbnNsYXRlZE5hbWU7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIHJldHVybiAobGlua18uZ2V0QWJzdHJhY3RzKCkpWzFdLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpCi0gIHsKLSAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IGxpbmtfLmdldEFic3RyYWN0cygpOwotICAgIGlmIChhYnN0cmFjdHMubGVuZ3RoID4gMikKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IGFic3RyYWN0c1syXS5nZXRUZXh0KCk7Ci0gICAgICBpZiAocHVibGlzaFVSTCAhPSBudWxsICYmIHB1Ymxpc2hVUkwubGVuZ3RoKCkgPiAwKQotICAgICAgICByZXR1cm4gcHVibGlzaFVSTDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpCi0gIHsKLSAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IGxpbmtfLmdldEFic3RyYWN0cygpOwotICAgIGlmIChhYnN0cmFjdHMubGVuZ3RoID4gMykKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVnaXN0cmF0aW9uVVJMID0gYWJzdHJhY3RzWzNdLmdldFRleHQoKTsKLSAgICAgIGlmIChyZWdpc3RyYXRpb25VUkwgIT0gbnVsbCAmJiByZWdpc3RyYXRpb25VUkwubGVuZ3RoKCkgPiAwKQotICAgICAgICByZXR1cm4gcmVnaXN0cmF0aW9uVVJMOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAobGlua18uZ2V0QWJzdHJhY3RzKCkpWzBdLnNldFRleHQobmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gICAgKGxpbmtfLmdldEFic3RyYWN0cygpKVsxXS5zZXRUZXh0KGlucXVpcnlVUkwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFVSTChTdHJpbmcgcHVibGlzaFVSTCkKLSAgewotICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gbGlua18uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgaWYgKGFic3RyYWN0cy5sZW5ndGggPiAyKQotICAgICAgYWJzdHJhY3RzWzJdLnNldFRleHQocHVibGlzaFVSTCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWdpc3RyYXRpb25VUkwoU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCkKLSAgewotICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gbGlua18uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgaWYgKGFic3RyYWN0cy5sZW5ndGggPiAzKQotICAgICAgYWJzdHJhY3RzWzNdLnNldFRleHQocmVnaXN0cmF0aW9uVVJMKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTU0ZjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5TZXJ2aWNlRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZSBleHRlbmRzIEZhdm9yaXRlc1NlcnZpY2UgaW1wbGVtZW50cyBJRmF2b3JpdGVzVURESVNlcnZpY2UKLXsKLSAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIChzZXJ2aWNlXy5nZXRTZXJ2aWNlTmFtZXMoKSlbMF0uZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IChTZXJ2aWNlRGVzY3JpcHRpb24pKHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpKVswXS5nZXRFeHRlbnNpb25FbGVtZW50KCk7Ci0gICAgcmV0dXJuIHNkLmdldExvY2F0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VLZXkoKQotICB7Ci0gICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gKFNlcnZpY2VEZXNjcmlwdGlvbikoc2VydmljZV8uZ2V0RGVzY3JpcHRpb25zKCkpWzBdLmdldEV4dGVuc2lvbkVsZW1lbnQoKTsKLSAgICByZXR1cm4gc2QuZ2V0U2VydmljZUtleSgpLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VLZXkoU3RyaW5nIGtleSkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWM2NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLlNlcnZpY2VEZXNjcmlwdGlvbjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlIGV4dGVuZHMgRmF2b3JpdGVzU2VydmljZSBpbXBsZW1lbnRzIElGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZQotewotICBwdWJsaWMgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gKHNlcnZpY2VfLmdldFNlcnZpY2VOYW1lcygpKVswXS5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKQotICB7Ci0gICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gKFNlcnZpY2VEZXNjcmlwdGlvbikoc2VydmljZV8uZ2V0RGVzY3JpcHRpb25zKCkpWzBdLmdldEV4dGVuc2lvbkVsZW1lbnQoKTsKLSAgICByZXR1cm4gc2QuZ2V0TG9jYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUludGVyZmFjZUtleSgpCi0gIHsKLSAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSAoU2VydmljZURlc2NyaXB0aW9uKShzZXJ2aWNlXy5nZXREZXNjcmlwdGlvbnMoKSlbMF0uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgIHJldHVybiBzZC5nZXRTZXJ2aWNlS2V5KCkuZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUludGVyZmFjZUtleShTdHJpbmcga2V5KQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzV1NETC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNXU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzQwZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNXU0RMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0RMIGV4dGVuZHMgRmF2b3JpdGVzU2VydmljZSBpbXBsZW1lbnRzIElGYXZvcml0ZXNXU0RMCi17Ci0gIHB1YmxpYyBGYXZvcml0ZXNXU0RMKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldFdzZGxVcmwoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVybCgpCi0gIHsKLSAgICByZXR1cm4gKHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpKVswXS5nZXRMb2NhdGlvbigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVybChTdHJpbmcgd3NkbFVSTCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1dTSUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzV1NJTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjIyYzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzV1NJTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzV1NJTCBleHRlbmRzIEZhdm9yaXRlc0xpbmsgaW1wbGVtZW50cyBJRmF2b3JpdGVzV1NJTAotewotICBwdWJsaWMgRmF2b3JpdGVzV1NJTCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRXc2lsVXJsKCk7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NpbFVybCgpCi0gIHsKLSAgICByZXR1cm4gbGlua18uZ2V0TG9jYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzaWxVcmwoU3RyaW5nIHdzaWxVUkwpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNSZWdpc3RyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjOTZjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNSZWdpc3RyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGludGVyZmFjZSBJRmF2b3JpdGVzUmVnaXN0cnlUeXBlCi17Ci0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5W10gZ2V0RmF2b3JpdGVzVURESVJlZ2lzdHJpZXMoKTsKLSAgcHVibGljIElGYXZvcml0ZXNVRERJQnVzaW5lc3NbXSBnZXRGYXZvcml0ZXNVRERJQnVzaW5lc3NlcygpOwotICBwdWJsaWMgSUZhdm9yaXRlc1VERElTZXJ2aWNlW10gZ2V0RmF2b3JpdGVzVURESVNlcnZpY2VzKCk7Ci0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VbXSBnZXRGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZXMoKTsKLSAgcHVibGljIElGYXZvcml0ZXNXU0RMW10gZ2V0RmF2b3JpdGVzV1NETHMoKTsKLSAgcHVibGljIElGYXZvcml0ZXNXU0lMW10gZ2V0RmF2b3JpdGVzV1NJTHMoKTsKLQotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNVRERJUmVnaXN0cnkoSUZhdm9yaXRlc1VERElSZWdpc3RyeSByZWdpc3RyeSk7Ci0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElCdXNpbmVzcyhJRmF2b3JpdGVzVURESUJ1c2luZXNzIGJ1c2luZXNzKTsKLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzVURESVNlcnZpY2UoSUZhdm9yaXRlc1VERElTZXJ2aWNlIHNlcnZpY2UpOwotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZShJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2Ugc2VydmljZUludGVyZmFjZSk7Ci0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1dTREwoSUZhdm9yaXRlc1dTREwgd3NkbCk7Ci0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1dTSUwoSUZhdm9yaXRlc1dTSUwgd3NpbCk7Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESVJlZ2lzdHJ5KElGYXZvcml0ZXNVRERJUmVnaXN0cnkgcmVnaXN0cnkpOwotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNVRERJQnVzaW5lc3MoSUZhdm9yaXRlc1VERElCdXNpbmVzcyBidXNpbmVzcyk7Ci0gIHB1YmxpYyB2b2lkIHJlbW92ZUZhdm9yaXRlc1VERElTZXJ2aWNlKElGYXZvcml0ZXNVRERJU2VydmljZSBzZXJ2aWNlKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UoSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpOwotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNXU0RMKElGYXZvcml0ZXNXU0RMIHdzZGwpOwotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNXU0lMKElGYXZvcml0ZXNXU0lMIHdzaWwpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElCdXNpbmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDJkMmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElCdXNpbmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYXZvcml0ZXNVRERJQnVzaW5lc3MKLXsKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpOwotICBwdWJsaWMgU3RyaW5nIGdldEJ1c2luZXNzS2V5KCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpOwotICBwdWJsaWMgdm9pZCBzZXRCdXNpbmVzc0tleShTdHJpbmcga2V5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDM1ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhdm9yaXRlc1VERElSZWdpc3RyeQotewotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpOwotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKTsKLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFVSTChTdHJpbmcgcHVibGlzaFVSTCk7Ci0gIHB1YmxpYyB2b2lkIHNldFJlZ2lzdHJhdGlvblVSTChTdHJpbmcgcmVnaXN0cmF0aW9uVVJMKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODYzNzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhdm9yaXRlc1VERElTZXJ2aWNlCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKTsKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlS2V5KCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpOwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlS2V5KFN0cmluZyBrZXkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDI2Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGludGVyZmFjZSBJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UKLXsKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnRlcmZhY2VLZXkoKTsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCk7Ci0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2VLZXkoU3RyaW5nIGtleSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNXU0RMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNXU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OWY4MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYXZvcml0ZXNXU0RMCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVcmwoKTsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVybChTdHJpbmcgd3NkbFVSTCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNXU0lMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNXU0lMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTI5ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzV1NJTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYXZvcml0ZXNXU0lMCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFdzaWxVcmwoKTsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLSAgcHVibGljIHZvaWQgc2V0V3NpbFVybChTdHJpbmcgd3NpbFVSTCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvcGx1Z2luL1BhcnNlclBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL3BsdWdpbi9QYXJzZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkYzZkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvcGx1Z2luL1BhcnNlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFBhcnNlclBsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFBhcnNlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlICAgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuUGFyc2VyUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQYXJzZXJQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFBhcnNlclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkgLyoqCi0JICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0JICAqIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotCSAgKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotCSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotCSAgKiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0JICAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0JICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotCSAgKi8KLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLQkgIHsKLQkgICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIucGx1Z2luIiwgcGx1Z2luICk7Ci0JICAgIAotCSAgICBpZigga2V5LnN0YXJ0c1dpdGgoIiUiKSkKLQkgICAgewotCSAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoIDEsIGtleS5sZW5ndGgoKSApOwotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gbXNnVXRpbHMuZ2V0TWVzc2FnZShrZXkpOwotCSAgfQotCi0JICAvKioKLQkgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLQkgICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0JICAqIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nCi0JICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0JICAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBmb3IKLQkgICogZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLQkgICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLQkgICogVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIKLQkgICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotCSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotCSAgKiBAcGFyYW0gYXJncyBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UKLQkgICogYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4gcGx1Z2luLnByb3BlcnRpZXMgYW5kCi0JICAqIGJ5IHRoZSBydWxlcyBvZiBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC4KLQkgICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JICAqLwotCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotCSAgewotCSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLGFyZ3MpOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL3dzaWwvSFRNTEhlYWRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9IVE1MSGVhZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzYzYwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9IVE1MSGVhZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MTcgICAxNDIzMjQgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MSGVhZEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotewotICBwcml2YXRlIGZpbmFsIGNoYXIgU1RBUlRfVEFHID0gJzwnOwotICBwcml2YXRlIGZpbmFsIGNoYXIgRU5EX1RBRyA9ICc+JzsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSEVBRF9TVEFSVF9UQUcgPSAiPGhlYWQ+IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSEVBRF9FTkRfVEFHID0gIjwvaGVhZD4iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBST09UX1NUQVJUX1RBRyA9ICI8cm9vdD4iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBST09UX0VORF9UQUcgPSAiPC9yb290PiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFVURjggPSAiVVRGLTgiOwotICAKLSAgLy9IVE1MIE1FVEEgdGFnIGluZm9ybWF0aW9uIHVzZWQgdG8gZGV0ZWN0IHRoZSBjaGFyc2V0LgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVE1MX0NPTlRFTlQgPSAiY29udGVudCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfRVFVSVYgPSAiaHR0cC1lcXVpdiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfRVFVSVZfQ09OVEVOVF9UWVBFID0gIkNvbnRlbnQtVHlwZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIENIQVJTRVQgPSAiY2hhcnNldCI7Ci0gIAotICAvLyBXU0lMIHRhZyBpbmZvcm1hdGlvbi4KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTUVUQSA9ICJtZXRhIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlNQRUNUSU9OID0gInNlcnZpY2VJbnNwZWN0aW9uIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09OVEVOVCA9ICJjb250ZW50IjsKLSAgCi0gIC8vIERJU0NPIHRhZyBpbmZvcm1hdGlvbi4KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTElOSyA9ICJsaW5rIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEVYVF9YTUwgPSAidGV4dC94bWwiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSRUwgPSAicmVsIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQUxURVJOQVRFID0gImFsdGVybmF0ZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhSRUYgPSAiaHJlZiI7Ci0gICAgCi0gIHByaXZhdGUgU3RyaW5nIGJhc2VVUklfOwotICBwcml2YXRlIFZlY3RvciB3c2lsc187Ci0gIHByaXZhdGUgVmVjdG9yIGRpc2Nvc187Ci0gIHByaXZhdGUgU3RyaW5nIGJ5dGVFbmNvZGluZyA9IFVURjg7IC8vRGVmYXVsdCB0byBVVEYtOC4KLSAgCi0gIHB1YmxpYyBIVE1MSGVhZEhhbmRsZXIoU3RyaW5nIGJhc2VVUkkpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGJhc2VVUklfID0gYmFzZVVSSTsKLSAgICB3c2lsc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgZGlzY29zXyA9IG5ldyBWZWN0b3IoKTsKLSAgfQotIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0V3NpbHMoKQotICB7Ci0gICAgU3RyaW5nW10gd3NpbHMgPSBuZXcgU3RyaW5nW3dzaWxzXy5zaXplKCldOwotICAgIHdzaWxzXy5jb3B5SW50byh3c2lscyk7Ci0gICAgcmV0dXJuIHdzaWxzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0RGlzY29zKCkKLSAgewotICAgIFN0cmluZ1tdIGRpc2NvcyA9IG5ldyBTdHJpbmdbZGlzY29zXy5zaXplKCldOwotICAgIGRpc2Nvc18uY29weUludG8oZGlzY29zKTsKLSAgICByZXR1cm4gZGlzY29zOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBxTmFtZUxDID0gcU5hbWUudG9Mb3dlckNhc2UoKTsKLSAgICBpZiAocU5hbWVMQy5lcXVhbHMoTUVUQSkpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoTkFNRSk7Ci0gICAgICBpZiAoU0VSVklDRV9JTlNQRUNUSU9OLmVxdWFscyhuYW1lVmFsdWUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgd3NpbFVSSSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ09OVEVOVCk7Ci0gICAgICAgIGlmIChiYXNlVVJJXyAhPSBudWxsICYmIHdzaWxVUkkuaW5kZXhPZigiOi8iKSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBzYi5hcHBlbmQoYmFzZVVSSV8uc3Vic3RyaW5nKDAsIGJhc2VVUklfLmxhc3RJbmRleE9mKCIvIikrMSkpOwotICAgICAgICAgIHNiLmFwcGVuZCh3c2lsVVJJKTsKLSAgICAgICAgICB3c2lsVVJJID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXdzaWxzXy5jb250YWlucyh3c2lsVVJJKSkKLSAgICAgICAgICB3c2lsc18uYWRkKHdzaWxVUkkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChxTmFtZUxDLmVxdWFscyhMSU5LKSkKLSAgICB7Ci0gICAgICAvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9tc2RubWFnL2lzc3Vlcy8wMi8wMi94bWwvZGVmYXVsdC5hc3B4IGZvciBtb3JlIGRldGFpbHMgb24gRElTQ08uCi0gICAgICBTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoVFlQRSk7Ci0gICAgICBTdHJpbmcgcmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZShSRUwpOwotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEhSRUYpOwotICAgICAgaWYgKFRFWFRfWE1MLmVxdWFscyh0eXBlKSAmJiBBTFRFUk5BVEUuZXF1YWxzKHJlbCkgJiYgaHJlZiAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgZGlzY29VUkkgPSBocmVmOwotICAgICAgICBpZiAoZGlzY29VUkkuaW5kZXhPZigiOi8iKSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBzYi5hcHBlbmQoYmFzZVVSSV8uc3Vic3RyaW5nKDAsYmFzZVVSSV8ubGFzdEluZGV4T2YoIi8iKSsxKSk7Ci0gICAgICAgICAgc2IuYXBwZW5kKGRpc2NvVVJJKTsKLSAgICAgICAgICBkaXNjb1VSSSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkaXNjb3NfLmNvbnRhaW5zKGRpc2NvVVJJKSkKLSAgICAgICAgICBkaXNjb3NfLmFkZChkaXNjb1VSSSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBwcm92aWRlZCB0YWcgaW4gdGhlIHByb3ZpZGVkIGRvY3VtZW50IHRvIHRoZSBwcm92aWRlZCBTdHJpbmdCdWZmZXIuCi0gICAqIEBwYXJhbSB0YXJnZXQKLSAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAqIEBwYXJhbSB0YWcKLSAgICogQHBhcmFtIGVuY29kaW5nCi0gICAqIEByZXR1cm4gYm9vbGVhbiBmYWxzZSBpZiB0aGUgdmFsdWUgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlciBtYXRjaGVkIHRoZSBkZXRlY3RlZCBjaGFyc2V0IG9yIGlmIG5vIGNoYXJzZXQgd2FzIGRldGVjdGVkLgotICAgKiBSZXR1cm5zIHRydWUgaWYgYSBjaGFyc2V0IHdhcyBkZXRlY3RlZCBhbmQgaXQgZGlkIG5vdCBlcXVhbCB0aGUgZW5jb2RpbmcgcGFyYW1ldGVyLiBJZiB0cnVlIGlzIHJldHVybmVkCi0gICAqIHRoZSBoYXJ2ZXN0aW5nIG9mIHRoZSB0YWdzIHdvdWxkIGhhdmUgc3RvcHBlZCBhdCB0aGUgcG9pbnQgdGhlIGNoYXJzZXQgd2FzIGRldGVjdGVkLiBUaGUgY2FsbGVyCi0gICAqIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGFnYWluIHdpdGggdGhlIGNvcnJlY3QgZW5jb2RpbmcuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaGFydmVzdFRhZ3MoU3RyaW5nQnVmZmVyIHRhcmdldCxTdHJpbmcgZG9jdW1lbnQsU3RyaW5nIHRhZywgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0JYm9vbGVhbiBjaGFuZ2VFbmNvZGluZyA9IGZhbHNlOwotICAgIGludCBpbmRleCA9IGRvY3VtZW50LmluZGV4T2YoU1RBUlRfVEFHKTsKLSAgICBpbnQgZG9jdW1lbnRMZW5ndGggPSBkb2N1bWVudC5sZW5ndGgoKTsKLSAgICBpbnQgdGFnTGVuZ3RoID0gdGFnLmxlbmd0aCgpOwotICAgIHdoaWxlIChpbmRleCAhPSAtMSAmJiAoaW5kZXgrMSt0YWdMZW5ndGgpPGRvY3VtZW50TGVuZ3RoKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBkb2N1bWVudC5zdWJzdHJpbmcoaW5kZXgrMSxpbmRleCsxK3RhZ0xlbmd0aCk7Ci0gICAgICBpZiAoc3RyLnRvTG93ZXJDYXNlKCkuZXF1YWxzKHRhZykpCi0gICAgICB7Ci0gICAgICAgIHN0ciA9IGRvY3VtZW50LnN1YnN0cmluZyhpbmRleCxkb2N1bWVudC5pbmRleE9mKEVORF9UQUcsaW5kZXgrMSkrMSk7Ci0gICAgICAgIHRhcmdldC5hcHBlbmQoc3RyKTsKLSAgICAgICAgaW5kZXggKz0gc3RyLmxlbmd0aCgpOwotICAgICAgICAKLSAgICAgICAgLy9JZiB0YWcgaXMgTUVUQSBhbmQgZGVjbGFyZXMgdGhlIGNoYXJzZXQsIGZpbmQgb3V0IHdoYXQgaXQgaXMKLSAgICAgICAgLy9hbmQgaWYgaXQgbWF0Y2hlcyB3aGF0IHdhcyBwYXNzZWQgaW4uIElmIGl0IG1hdGNoZXMsIGNvbnRpbnVlIAotICAgICAgICAvL3dpdGggdGhlIHBhcnNpbmcgYW5kIHJldHVybiBmYWxzZSB3aGVuIGNvbXBsZXRlLiAKLSAgICAgICAgLy9JZiB0aGUgZGV0ZWN0ZWQgY2hhcnNldCBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IHdhcyBwYXNzZWQgaW4sIAotICAgICAgICAvLy0gY2hhbmdlIGJ5dGVFbmNvZGluZyB0byBlcXVhbCB0aGUgZGV0ZWN0ZWQgY2hhcnNldC4KLSAgICAgICAgLy8tIHN0b3AgcGFyc2luZy4KLSAgICAgICAgLy8tIHJldHVybiB0cnVlLgotICAgICAgICBpZiAodGFnLmVxdWFscyhNRVRBKSkKLSAgICAgICAgewotICAgICAgICAgIGludCBpZHhPZkNvbnRlbnQgPSBzdHIuaW5kZXhPZihIVE1MX0NPTlRFTlQpOwotICAgICAgICAgIGludCBpZHhPZkhUVFBFUVVJViA9IHN0ci5pbmRleE9mKEhUVFBfRVFVSVYpOwotICAgICAgICAgIGlmIChpZHhPZkhUVFBFUVVJViE9IC0xICYmIGlkeE9mQ29udGVudCAhPSAtMSkKLSAgICAgICAgICB7Ci0gICAgICAgIAkvL0NoZWNrIGlmIHRoZSBodHRwLWVxdWl2IGF0dHJpYnV0ZSBpcyBzZXQgdG8gQ29udGVudC1UeXBlLgotICAgICAgICAgIAlpbnQgaWR4T2ZIVFRQRVFVSVZPcGVuUXVvdGUgPSBzdHIuaW5kZXhPZigiXCIiLCBpZHhPZkhUVFBFUVVJVisxKTsKLSAgICAgICAgCWludCBpZHhPZkhUVFBFUVVJVkNsb3NpbmdRdW90ZSA9IHN0ci5pbmRleE9mKCJcIiIsIGlkeE9mSFRUUEVRVUlWT3BlblF1b3RlKzEpOwotICAgICAgICAJU3RyaW5nIGhUVFBFUVVJVlZhbHVlVW50cmltbWVkID0gc3RyLnN1YnN0cmluZyhpZHhPZkhUVFBFUVVJVk9wZW5RdW90ZSsxLCBpZHhPZkhUVFBFUVVJVkNsb3NpbmdRdW90ZSk7Ci0gICAgICAgIAlpZiAoaFRUUEVRVUlWVmFsdWVVbnRyaW1tZWQudHJpbSgpLmVxdWFscyhIVFRQX0VRVUlWX0NPTlRFTlRfVFlQRSkpCi0gICAgICAgIAl7Ci0gICAgICAgIAkgIC8vVGhpcyBNRVRBIHRhZyBjb250YWlucyB0aGUgY2hhcnNldC4gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29udGVudCBhdHRyaWJ1dGUKLSAgICAgICAgCSAgaW50IGlkeE9mT3BlblF1b3RlID0gc3RyLmluZGV4T2YoIlwiIiwgaWR4T2ZDb250ZW50KzEpOwotICAgICAgICAJICBpbnQgaWR4T2ZDbG9zaW5nUXVvdGUgPSBzdHIuaW5kZXhPZigiXCIiLCBpZHhPZk9wZW5RdW90ZSsxKTsKLSAgICAgICAgCSAgU3RyaW5nIGNvbnRlbnRWYWx1ZSA9IHN0ci5zdWJzdHJpbmcoaWR4T2ZPcGVuUXVvdGUrMSwgaWR4T2ZDbG9zaW5nUXVvdGUpOwotICAgICAgICAJICAKLSAgICAgICAgCSAgLy9HZXQgdGhlIGNoYXJzZXQKLSAgICAgICAgCSAgaW50IGlkeE9mQ2hhclNldCA9IGNvbnRlbnRWYWx1ZS5pbmRleE9mKENIQVJTRVQpOwotICAgICAgICAJICBpbnQgaWR4T2ZFcXVhbHMgPSBjb250ZW50VmFsdWUuaW5kZXhPZigiPSIsIGlkeE9mQ2hhclNldCtDSEFSU0VULmxlbmd0aCgpKTsKLSAgICAgICAgCSAgU3RyaW5nIGRldGVjdGVkRW5jb2RpbmdWYWx1ZVVudHJpbW1lZCA9IGNvbnRlbnRWYWx1ZS5zdWJzdHJpbmcoaWR4T2ZFcXVhbHMrMSk7Ci0gICAgICAgIAkgIFN0cmluZyBkZXRlY3RlZEVuY29kaW5nVmFsdWUgPSBkZXRlY3RlZEVuY29kaW5nVmFsdWVVbnRyaW1tZWQudHJpbSgpOwotICAgICAgICAJICBpZiAoIWRldGVjdGVkRW5jb2RpbmdWYWx1ZS5lcXVhbHMoZW5jb2RpbmcpKQotICAgICAgICAJICB7Ci0gICAgICAgIAkgICAgYnl0ZUVuY29kaW5nID0gZGV0ZWN0ZWRFbmNvZGluZ1ZhbHVlOwotICAgICAgICAJICAgIGNoYW5nZUVuY29kaW5nID0gdHJ1ZTsKLSAgICAgICAgCSAgICBicmVhazsKLSAgICAgICAgCSAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBpbmRleCsrOwotICAgICAgaW5kZXggPSBkb2N1bWVudC5pbmRleE9mKFNUQVJUX1RBRyxpbmRleCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjaGFuZ2VFbmNvZGluZzsKLSAgfQotICAKLQotICAvKioKLSAgICogSWYgdGhlIHByb3ZpZGVkIGJ5dGUgYXJyYXkgcmVwZXJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIGFuIEhUTUwKLSAgICogZG9jdW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgYnl0ZSBhcnJheSBpbiB3aGljaAotICAgKiA8dWw+Ci0gICAqIDxsaT50aGUgb3BlbmluZyBhbmQgY2xvc2luZyBIRUFEIHRhZ3MgYXJlIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggCi0gICAqIG9wZW5pbmcgYW5kIGNsb3NpbmcgPHJvb3Q+IHRhZ3M8L2xpPgotICAgKiA8bGk+b25seSB0aGUgTUVUQSBhbmQgTElOSyBlbGVtZW50cyBhcmUgaW4gdGhlIEhUTUwgZG9jdW1lbnQKLSAgICogYXJlIGluY2x1ZGVkIGluIHRoZSBjb250ZW50cyBiZXR3ZWVuIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nCi0gICAqIDxyb290PiB0YWdzLgotICAgKiA8L3VsPgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGJ5dGVFbmNvZGluZyBTdHJpbmcKLSAgICogYXR0cmlidXRlIG9uIHRoaXMgY2xhc3MgaWYgaXQgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4KLSAgICogVVRGLTguIENhbGxlcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgZ2V0Qnl0ZUVuY29kaW5nKCkKLSAgICogYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBpZiB0aGV5IG5lZWQgdG8ga25vdyB0aGUgY2hhcnNldAotICAgKiB2YWx1ZSB1c2VkIGJ5IHRoaXMgbWV0aG9kIHRvIGRlY29kZS9lbmRjb2RlIHRoZSBieXRlIGFycmF5LgotICAgKiBAcGFyYW0gYgotICAgKiBAcmV0dXJuIGJ5dGVbXQotICAgKi8KLSAgcHVibGljIGJ5dGVbXSBoYXJ2ZXN0SGVhZFRhZ3MoYnl0ZVtdIGIpCi0gIHsKLSAgICBTdHJpbmcgczsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgCS8vQXNzdW1lIHRoZSBkZWZhdWx0IGJ5dGUgZW5jb2Rpbmcgb2YgVVRGLTggZm9yIG5vdy4KLSAgICAJcyA9IG5ldyBTdHJpbmcoYiwgYnl0ZUVuY29kaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQotICAgIHsKLSAgICAgIHMgPSBuZXcgU3RyaW5nKGIpOwotICAgIH0KLSAgICBTdHJpbmcgaGVhZCA9IHMudG9Mb3dlckNhc2UoKTsKLSAgICBpbnQgaGVhZFN0YXJ0SW5kZXggPSBoZWFkLmluZGV4T2YoSEVBRF9TVEFSVF9UQUcpOwotICAgIGludCBoZWFkRW5kSW5kZXggPSBoZWFkLmluZGV4T2YoSEVBRF9FTkRfVEFHKTsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2IuYXBwZW5kKFJPT1RfU1RBUlRfVEFHKTsKLSAgICBpZiAoaGVhZFN0YXJ0SW5kZXggIT0gLTEgJiYgaGVhZEVuZEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGhlYWQgPSBzLnN1YnN0cmluZyhoZWFkU3RhcnRJbmRleCwgaGVhZEVuZEluZGV4K0hFQURfRU5EX1RBRy5sZW5ndGgoKSk7Ci0gICAgICBib29sZWFuIGVuY29kaW5nQ2hhbmdlZCA9IGhhcnZlc3RUYWdzKHNiLGhlYWQsTUVUQSwgYnl0ZUVuY29kaW5nKTsKLSAgICAgIGlmIChlbmNvZGluZ0NoYW5nZWQpCi0gICAgICB7Ci0gICAgCSAgLy9UaGUgaGFydmVzdFRhZ3MgbWV0aG9kIGRldGVjdGVkIGEgZGlmZmVyZW50IGNoYXJzZXQKLSAgICAJICAvL3RoYW4gdGhlIG9uZSB0aGF0IHdhcyBwYXNzZWQgaW4uIFN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZwotICAgIAkgIC8vd2l0aCB0aGUgY29ycmVjdCBjaGFyc2V0LgotICAgIAkgICAgU3RyaW5nIHMyOwotICAgIAkgICAgdHJ5Ci0gICAgCSAgICB7Ci0gICAgCSAgICAJczIgPSBuZXcgU3RyaW5nKGIsIGJ5dGVFbmNvZGluZyk7Ci0gICAgCSAgICB9Ci0gICAgCSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgCSAgICB7Ci0gICAgCSAgICAgIHMyID0gbmV3IFN0cmluZyhiKTsKLSAgICAJICAgIH0KLSAgICAJICAgIFN0cmluZyBoZWFkMiA9IHMyLnRvTG93ZXJDYXNlKCk7Ci0gICAgCSAgICBpbnQgaGVhZDJTdGFydEluZGV4ID0gaGVhZDIuaW5kZXhPZihIRUFEX1NUQVJUX1RBRyk7Ci0gICAgCSAgICBpbnQgaGVhZDJFbmRJbmRleCA9IGhlYWQyLmluZGV4T2YoSEVBRF9FTkRfVEFHKTsKLSAgICAJICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIAkgICAgc2IuYXBwZW5kKFJPT1RfU1RBUlRfVEFHKTsKLSAgICAJICAgIGlmIChoZWFkMlN0YXJ0SW5kZXggIT0gLTEgJiYgaGVhZDJFbmRJbmRleCAhPSAtMSkKLSAgICAJICAgIHsKLSAgICAJICAgICAgaGVhZDIgPSBzMi5zdWJzdHJpbmcoaGVhZDJTdGFydEluZGV4LCBoZWFkMkVuZEluZGV4K0hFQURfRU5EX1RBRy5sZW5ndGgoKSk7Ci0gICAgCSAgICAgIGhhcnZlc3RUYWdzKHNiLGhlYWQyLE1FVEEsIGJ5dGVFbmNvZGluZyk7Ci0gICAgCSAgICAgIGhhcnZlc3RUYWdzKHNiLGhlYWQyLExJTkssYnl0ZUVuY29kaW5nKTsKLSAgICAJICAgIH0gICAgCSAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhhcnZlc3RUYWdzKHNiLGhlYWQsTElOSyxieXRlRW5jb2RpbmcpOwotICAgICAgfQotICAgIH0KLSAgICBzYi5hcHBlbmQoUk9PVF9FTkRfVEFHKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgCXJldHVybiBzYi50b1N0cmluZygpLmdldEJ5dGVzKGJ5dGVFbmNvZGluZyk7ICAgICAgCi0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgewotICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICB9ICAgIAotICAgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEJ5dGVFbmNvZGluZygpCi0gIHsKLQkgIHJldHVybiBieXRlRW5jb2Rpbmc7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL0lsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL0lsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0MmRjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9JbGxlZ2FsQXJndW1lbnRzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbDsKLQotcHVibGljIGNsYXNzIElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI1MzM5ODExNzYyODU1NjEyMzRMOwotCi0gIHB1YmxpYyBJbGxlZ2FsQXJndW1lbnRzRXhjZXB0aW9uKFN0cmluZyBhcmcpCi0gIHsKLSAgICBzdXBlcihhcmcpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9VRERJVVJJSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9VRERJVVJJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMDA3YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL3dzaWwvVURESVVSSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBVRERJVVJJSGVscGVyCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWVNFUlZJQ0VfVVJJX1RFTVBMQVRFID0gInVkZGlzZXJ2aWNlOnF1ZXJ5OnswfTpxdWVyeTp7MX0iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRUtFWV9VUklfVEVNUExBVEUgPSAidWRkaXNlcnZpY2U6c2VydmljZUtleTp7MH06c2VydmljZUtleTp7MX0iOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UXVlcnlTZXJ2aWNlVVJJKFN0cmluZyBxdWVyeSxTdHJpbmcgaW5xdWlyeVVSTCkKLSAgewotICAgIFN0cmluZ1tdIHVyaVBhcmFtcyA9IHtxdWVyeSxpbnF1aXJ5VVJMfTsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUVVFUllTRVJWSUNFX1VSSV9URU1QTEFURSx1cmlQYXJhbXMpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRTZXJ2aWNlS2V5VVJJKFN0cmluZyBzZXJ2aWNlS2V5LFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gICAgU3RyaW5nW10gdXJpUGFyYW1zID0ge3NlcnZpY2VLZXksaW5xdWlyeVVSTH07Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNFUlZJQ0VLRVlfVVJJX1RFTVBMQVRFLHVyaVBhcmFtcyk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHBhcnNlVVJJKFN0cmluZyBwYXR0ZXJuLFN0cmluZyB1cmkpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQocGF0dGVybik7Ci0gICAgICBPYmplY3RbXSBwYXJzZWRSZXN1bHRzID0gbWYucGFyc2UodXJpKTsKLSAgICAgIGlmIChwYXJzZWRSZXN1bHRzICE9IG51bGwgJiYgcGFyc2VkUmVzdWx0cy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSByZXN1bHRzID0gbmV3IFN0cmluZ1twYXJzZWRSZXN1bHRzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHBhcnNlZFJlc3VsdHMubGVuZ3RoO2krKykKLSAgICAgICAgICByZXN1bHRzW2ldID0gKFN0cmluZylwYXJzZWRSZXN1bHRzW2ldOwotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHBhcnNlU2VydmljZUtleVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIHBhcnNlVVJJKFNFUlZJQ0VLRVlfVVJJX1RFTVBMQVRFLHVyaSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gcGFyc2VRdWVyeVNlcnZpY2VVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiBwYXJzZVVSSShRVUVSWVNFUlZJQ0VfVVJJX1RFTVBMQVRFLHVyaSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9XU0lMTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL1dTSUxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjg2YmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL1dTSUxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgV1NJTE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwud3NpbCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHN0YXRpYwotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV1NJTE1lc3NhZ2VzLmNsYXNzKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9JTlZBTElEX0FSR1VNRU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlRTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSSTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9VUkk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9VTlJFU09MVkFCTEVfV1NETDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfTUFMRk9STUVEX1dTREw7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9XUklURV9XU0lMOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL1dXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2NmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL1dXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDkxODIxMTAyMTYyMDMxNjA0OUw7Ci0KLSAgcHJpdmF0ZSBJT0V4Y2VwdGlvbiBpb2VfOwotICBwcml2YXRlIFN0cmluZyB3d3dBdXRoTXNnXzsKLSAgcHJpdmF0ZSBTdHJpbmcgdXJsXzsKLQotICBwdWJsaWMgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24oSU9FeGNlcHRpb24gaW9lLCBTdHJpbmcgd3d3QXV0aE1zZywgU3RyaW5nIHVybCkKLSAgewotICAgIHN1cGVyKGlvZS5nZXRNZXNzYWdlKCkpOwotICAgIGlvZV8gPSBpb2U7Ci0gICAgd3d3QXV0aE1zZ18gPSB3d3dBdXRoTXNnOwotICAgIHVybF8gPSB1cmw7Ci0gIH0KLQotICBwdWJsaWMgSU9FeGNlcHRpb24gZ2V0SU9FeGNlcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIGlvZV87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdXV0F1dGhlbnRpY2F0aW9uTXNnKCkKLSAgewotICAgIHJldHVybiB3d3dBdXRoTXNnXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkKLSAgewotICAgIHJldHVybiB1cmxfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9XV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL1dXV0F1dGhlbnRpY2F0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E4Y2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL1dXV0F1dGhlbnRpY2F0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1dXQXV0aGVudGljYXRpb25IYW5kbGVyCi17Ci0gIHB1YmxpYyB2b2lkIGhhbmRsZVdXV0F1dGhlbnRpY2F0aW9uKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlKTsKLSAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9XZWJTZXJ2aWNlRW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9XZWJTZXJ2aWNlRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZTM4YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGFyc2VyL3dzaWwvV2ViU2VydmljZUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VFbnRpdHkKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTktOT1dOID0gLTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSFRNTCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfV1NJTCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfV1NETCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVURESV9TRVJWSUNFID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ESVNDTyA9IDQ7Ci0KLSAgcHJpdmF0ZSBPYmplY3QgcGFyZW50XzsKLSAgcHJpdmF0ZSBMaXN0IGNoaWxkcmVuXzsKLSAgcHJpdmF0ZSBpbnQgdHlwZV87Ci0gIHByaXZhdGUgU3RyaW5nIHVyaV87Ci0gIHByaXZhdGUgYnl0ZVtdIGJ5dGVzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFBhc3N3b3JkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZG9jdW1lbnRhdGlvbl87Ci0gIHByaXZhdGUgT2JqZWN0IG1vZGVsXzsKLQotICBwdWJsaWMgV2ViU2VydmljZUVudGl0eSgpCi0gIHsKLSAgICBwYXJlbnRfID0gbnVsbDsKLSAgICBjaGlsZHJlbl8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdHlwZV8gPSBUWVBFX1VOS05PV047Ci0gICAgdXJpXyA9IG51bGw7Ci0gICAgYnl0ZXNfID0gbnVsbDsKLSAgICBodHRwVXNlcm5hbWVfID0gbnVsbDsKLSAgICBodHRwUGFzc3dvcmRfID0gbnVsbDsKLSAgICBkb2N1bWVudGF0aW9uXyA9IG51bGw7Ci0gICAgbW9kZWxfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkKLSAgewotICAgIHJldHVybiBwYXJlbnRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpCi0gIHsKLSAgICBwYXJlbnRfID0gcGFyZW50OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIGNoaWxkcmVuXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZENoaWxkKE9iamVjdCBjaGlsZCkKLSAgewotICAgIGNoaWxkcmVuXy5hZGQoY2hpbGQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoT2JqZWN0IGNoaWxkKQotICB7Ci0gICAgY2hpbGRyZW5fLnJlbW92ZShjaGlsZCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkKLSAgewotICAgIHR5cGVfID0gdHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICB1cmlfID0gdXJpOwotICB9Ci0KLSAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpCi0gIHsKLSAgICByZXR1cm4gYnl0ZXNfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Qnl0ZXMoYnl0ZVtdIGJ5dGVzKQotICB7Ci0gICAgYnl0ZXNfID0gYnl0ZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEhUVFBVc2VybmFtZSgpCi0gIHsKLSAgICByZXR1cm4gaHR0cFVzZXJuYW1lXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhUVFBVc2VybmFtZShTdHJpbmcgaHR0cFVzZXJuYW1lKQotICB7Ci0gICAgaHR0cFVzZXJuYW1lXyA9IGh0dHBVc2VybmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUFBhc3N3b3JkKCkKLSAgewotICAgIHJldHVybiBodHRwUGFzc3dvcmRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SFRUUFBhc3N3b3JkKFN0cmluZyBodHRwUGFzc3dvcmQpCi0gIHsKLSAgICBodHRwUGFzc3dvcmRfID0gaHR0cFBhc3N3b3JkOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50YXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50YXRpb25fOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uKFN0cmluZyBkb2N1bWVudGF0aW9uKQotICB7Ci0gICAgZG9jdW1lbnRhdGlvbl8gPSBkb2N1bWVudGF0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLSAgewotICAgIG1vZGVsXyA9IG1vZGVsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNFbnRpdHlSZXNvbHZlZCgpCi0gIHsKLSAgICByZXR1cm4gKGJ5dGVzXyAhPSBudWxsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL1dlYlNlcnZpY2VzUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC9XZWJTZXJ2aWNlc1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODNhZDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL1dlYlNlcnZpY2VzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTA0ICAgMTE5Mjk2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDYwNTE3ICAgMTQyMzI0IHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA3MTEgICAxNTAzMDEgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNjA4MTggICAxNTQzOTMgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICogMjAwNjA5MDYgICAxNTY0MjAgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkFic3RyYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuSW5zcGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24uRXh0ZW5zaW9uRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGkuU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5VRERJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjby5ESVNDT0NvbnRyYWN0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY28uRElTQ09QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjby5ESVNDT1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBzdW4ubWlzYy5CQVNFNjRFbmNvZGVyOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNQYXJzZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfTk9ORSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1dTSUwgPSAxPDwwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJTRV9XU0RMID0gMTw8MTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfTElOS1MgPSAxPDwyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJTRV9ESVNDTyA9IDE8PDM7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgdXJpXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgdXJpVG9FbnRpdHlUYWJsZV87Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkXzsKLQotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgdGhpcyhudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlcihTdHJpbmcgdXJpKQotICB7Ci0gICAgdXJpXyA9IHVyaTsKLSAgICB1cmlUb0VudGl0eVRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBodHRwQmFzaWNBdXRoVXNlcm5hbWVfID0gbnVsbDsKLSAgICBodHRwQmFzaWNBdXRoUGFzc3dvcmRfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICB1cmlfID0gdXJpOwotICB9Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VFbnRpdHkgZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgICByZXR1cm4gKFdlYlNlcnZpY2VFbnRpdHkpdXJpVG9FbnRpdHlUYWJsZV8uZ2V0KHVyaSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSB3c2lsVVJJCi0gICAqIEByZXR1cm4KLSAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCBnZXRXU0lMRG9jdW1lbnRWZXJib3NlKFN0cmluZywgU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFdTSUxEb2N1bWVudCBnZXRXU0lMRG9jdW1lbnQoU3RyaW5nIHdzaWxVUkkgKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIGdldFdTSUxEb2N1bWVudFZlcmJvc2Uod3NpbFVSSSwgIlVURi04IiApOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gd3NpbFVSSQotICAgKiBAcmV0dXJuCi0gICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICogQHRocm93cyBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICAgKiBAdGhyb3dzIFdTSUxFeGNlcHRpb24KLSAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCBnZXRXU0lMRG9jdW1lbnRWZXJib3NlKFN0cmluZywgU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFdTSUxEb2N1bWVudCBnZXRXU0lMRG9jdW1lbnRWZXJib3NlKFN0cmluZyB3c2lsVVJJICkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLCBXU0lMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gZ2V0V1NJTERvY3VtZW50VmVyYm9zZSggd3NpbFVSSSwgIlVURi04IiApOwotICB9Ci0gIAotICBwdWJsaWMgV1NJTERvY3VtZW50IGdldFdTSUxEb2N1bWVudFZlcmJvc2UoU3RyaW5nIHdzaWxVUkksIFN0cmluZyBieXRlRW5jb2RpbmcgKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24sIFdTSUxFeGNlcHRpb24KLSAgewotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NFbnRpdHkgPSBnZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod3NpbFVSSSk7Ci0gICAgCi0gICAgaWYgKHdzRW50aXR5ID09IG51bGwpCi0gICAgewotICAgICAgd3NFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgd3NFbnRpdHkuc2V0VVJJKHdzaWxVUkkpOwotICAgICAgdXJpVG9FbnRpdHlUYWJsZV8ucHV0KHdzaWxVUkksIHdzRW50aXR5KTsKLSAgICB9Ci0gICAgCi0gICAgV1NJTERvY3VtZW50IHdzaWxEb2N1bWVudCA9IChXU0lMRG9jdW1lbnQpd3NFbnRpdHkuZ2V0TW9kZWwoKTsKLSAgICAKLSAgICBpZiAod3NpbERvY3VtZW50ID09IG51bGwpCi0gICAgewotICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIFdTREw0SiBpcyBub3QgcmVhZGluZyB0aGUgY29udGVudCB0eXBlIHByb3Blcmx5IGZvciBwbGF0Zm9ybSByZXNvdXJjZXMuICBUaGVyZWZvcmUsIHdlIHdpbGwgZ2V0Ci0gICAgICAvLyB0aGUgc3RyZWFtIGRpcmVjdGx5IGZyb20gRWNsaXBzZSBpZiB3ZSBmaW5kIGEgcGxhdGZvcm0gcHJvdG9jb2wgc3BlY2lmaWVkIGluIHRoZSBVUkwuCi0gICAgICBpZiggd3NpbFVSSS5zdGFydHNXaXRoKCAicGxhdGZvcm06L3Jlc291cmNlIiApICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nICAgIHBhdGggICAgID0gd3NpbFVSSS5zdWJzdHJpbmcoMTgpOwotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoIHBhdGggKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCByZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGaWxlICAgICAgICAgICAgIGZpbGUgICA9IChJRmlsZSlyZXNvdXJjZTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtICAgICAgIHN0cmVhbSA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggc3RyZWFtLCBmaWxlLmdldENoYXJzZXQoKSApOwotICAgICAgICAgIAotICAgICAgICAgICAgd3NpbERvY3VtZW50ID0gV1NJTERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB3c2lsRG9jdW1lbnQucmVhZCggcmVhZGVyICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApe30KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBUT0RPIHRoZSBmb2xsb3dpbmcgMyBsaW5lcyBvZiBjb2RlIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkLCBzaW5jZQotICAgICAgICAvLyB0aGUgV1NETDRKIHBhcnNlciBkb2VzIG5vdCBuZWVkIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIGJ5dGVbXSBiID0gZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheSh3c2lsVVJJKTsKLSAgICAgICAgd3NFbnRpdHkuc2V0Qnl0ZXMoYik7Ci0gICAgICAgIHNldEhUVFBTZXR0aW5ncyh3c0VudGl0eSk7Ci0gICAgICAKLSAgICAgICAgLy8gVGhpcyBwYXJzZXIgb25seSBjaGVja3MgdGhlIGhlYWRlciBvZiBIVE1MIGZvciBhIHBhcnRpY3VsYXIgZW5jb2RpbmcuCi0gICAgICAgIC8vIEl0IGRvZXNuJ3QgY2hlY2sgdGhlIGVuY29kaW5nIGZvciBnZW5lcmFsIFhNTCBkb2N1bWVudHMgbGlrZSBXU0RMIGFuZCBXU0lMLgotICAgICAgICAvLyBUaGlzIGNhdXNpbmcgdGhpcyBwYXJzZXIgdG8gYWx3YXkgdXNlIFVURi04IGFzIHRoZSBlbmNvZGluZy4gIFRoZXJlZm9yZSwKLSAgICAgICAgLy8gc2luY2Ugd2UgY2FuIG5vdCB0cnVzdCB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIHdlIHdpbGwgbm90IHVzZSBpdC4gIEluc3RlYWQsCi0gICAgICAgIC8vIHdlIHdpbGwganVzdCBsZXQgdGhlIFdTSUwgcGFyc2VyIGZpZ3VyZSBvdXQgd2hhdCBlbmNvZGluZyB0byB1c2UuCi0gICAgICAKLSAgICAgICAgLy9JbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpLCBieXRlRW5jb2RpbmcgKTsKLSAgICAgICAgd3NpbERvY3VtZW50ID0gV1NJTERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIHdzaWxEb2N1bWVudC5yZWFkKHdzaWxVUkkpOwotICAgICAgfQotICAgICAgCi0gICAgICB3c0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0lMKTsKLSAgICAgIHdzRW50aXR5LnNldE1vZGVsKHdzaWxEb2N1bWVudCk7Ci0gICAgfQotICAgIHJldHVybiB3c2lsRG9jdW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRXU0RMRGVmaW5pdGlvbihTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBnZXRXU0RMRGVmaW5pdGlvblZlcmJvc2Uod3NkbFVSSSk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIERlZmluaXRpb24gZ2V0V1NETERlZmluaXRpb25WZXJib3NlKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24sIFdTRExFeGNlcHRpb24KLSAgewotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NFbnRpdHkgPSBnZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod3NkbFVSSSk7Ci0gICAgaWYgKHdzRW50aXR5ID09IG51bGwpCi0gICAgewotICAgICAgd3NFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgd3NFbnRpdHkuc2V0VVJJKHdzZGxVUkkpOwotICAgICAgdXJpVG9FbnRpdHlUYWJsZV8ucHV0KHdzZGxVUkksIHdzRW50aXR5KTsKLSAgICB9Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pd3NFbnRpdHkuZ2V0TW9kZWwoKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIGJ5dGVbXSBiID0gZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheSh3c2RsVVJJKTsKLSAgICAgIHdzRW50aXR5LnNldEJ5dGVzKGIpOwotICAgICAgc2V0SFRUUFNldHRpbmdzKHdzRW50aXR5KTsKLSAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYik7Ci0gICAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETFBsdWdpbi5JTlNUQU5DRS5jcmVhdGVXU0RMNEpGYWN0b3J5KCk7Ci0gICAgICBXU0RMUmVhZGVyIHdzZGxSZWFkZXIgPSBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgIGRlZmluaXRpb24gPSB3c2RsUmVhZGVyLnJlYWRXU0RMKHdzZGxVUkksIG5ldyBJbnB1dFNvdXJjZShiYWlzKSk7Ci0gICAgICB3c0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMKTsKLSAgICAgIHdzRW50aXR5LnNldE1vZGVsKGRlZmluaXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIHBhcnNlVVJMKFBBUlNFX1dTSUwgfCBQQVJTRV9XU0RMIHwgUEFSU0VfTElOS1MgfCBQQVJTRV9ESVNDTyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZShpbnQgcGFyc2VPcHRpb24pIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBwYXJzZVVSTChwYXJzZU9wdGlvbik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcGFyc2VVUkwoaW50IHBhcnNlT3B0aW9uKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgCi0gICAgLy8gVGhpcyB2YXJpYWJsZSBtYWtlcyB0aGlzIG9iamVjdCBhIGxpdHRsZSBtb3JlIHRocmVhZCBzYWZlIHRoYW4gaXQgd2FzCi0gICAgLy8gYmVmb3JlLCBhbHRob3VnaCB0aGlzIG9iamVjdCBpcyBub3QgY29tcGxldGVseSB0aHJlYWQgc2FmZS4gIFRoZSBzY2VuYXJpbwotICAgIC8vIHRoYXQgd2UgYXJlIHRyeWluZyB0byBhdm9pZCBpcyB3aGVyZSBvbmUgY2FsbCB0byB0aGlzIG1ldGhvZCBnZXRzIGJsb2NrZWQKLSAgICAvLyBhdCB0aGUgZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheSBjYWxsLiAgVGhlbiBhIHNlY29uZCBjYWxsIHRvIHRoZSBtZXRob2QKLSAgICAvLyBpcyBtYWRlIHRoYXQgY2hhbmdlcyB0aGUgdXJpXyBnbG9iYWwgdmFyaWFibGUuICBXaGVuIHRoZSBmaXJzdCBjYWxsCi0gICAgLy8gY29tcGxldGVzIGl0IHdvdWxkIHVzZSB1cmlfIHZhbHVlIGZyb20gdGhlIHNlY29uZCBpbnZvY2F0aW9uIGluc3RlYWQKLSAgICAvLyBvZiB0aGUgdmFsdWUgZnJvbSB0aGUgZmlyc3QuICBTdG9yaW5nIHRoZSB1cmlfIGludG8gdGhpcyB2YXJpYWJsZSBoZWxwcyAKLSAgICAvLyBhdm9pZCB0aGlzIGJhZCBzY2VuYXJpby4KLSAgICBTdHJpbmcgdGhlVXJpID0gdXJpXzsKLSAgICAKLSAgICB3c0VudGl0eS5zZXRVUkkodGhlVXJpKTsKLSAgICBieXRlW10gYiA9IGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkodGhlVXJpKTsKLSAgICB3c0VudGl0eS5zZXRCeXRlcyhiKTsKLSAgICBzZXRIVFRQU2V0dGluZ3Mod3NFbnRpdHkpOwotICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dCh0aGVVcmksIHdzRW50aXR5KTsKLSAgICAvLyBwYXJzZSB1cmlfIGFzIGEgSFRNTCBkb2N1bWVudAotICAgIEhUTUxIZWFkSGFuZGxlciBoZWFkSGFuZGxlciA9IG5ldyBIVE1MSGVhZEhhbmRsZXIodGhlVXJpKTsKLSAgICBieXRlW10gaGVhZCA9IGhlYWRIYW5kbGVyLmhhcnZlc3RIZWFkVGFncyhiKTsKLSAgICBTdHJpbmcgYnl0ZUVuY29kaW5nID0gaGVhZEhhbmRsZXIuZ2V0Qnl0ZUVuY29kaW5nKCk7Ci0gICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoZmFsc2UpOwotICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShoZWFkKTsKLSAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihiYWlzLCBieXRlRW5jb2RpbmcpOwotICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoaXNyKTsKLSAgICAgIHBhcnNlci5wYXJzZShpcywgaGVhZEhhbmRsZXIpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgIH0KLSAgICBTdHJpbmdbXSB3c2lsVVJJcyA9IGhlYWRIYW5kbGVyLmdldFdzaWxzKCk7Ci0gICAgU3RyaW5nW10gZGlzY29VUklzID0gaGVhZEhhbmRsZXIuZ2V0RGlzY29zKCk7Ci0gICAgLy8gdHJ1ZSBpZiB1cmlfIGlzIGEgSFRNTCBkb2N1bWVudAotICAgIGlmICh3c2lsVVJJcy5sZW5ndGggPiAwIHx8IGRpc2NvVVJJcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIHdzRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX0hUTUwpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2lsVVJJcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGFic29sdXRlVVJJID0gY29udmVydFRvQWJzb2x1dGVVUkkodGhlVXJpLCB3c2lsVVJJc1tpXSk7Ci0gICAgICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NpbEVudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICAgIHdzaWxFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCk7Ci0gICAgICAgIHdzaWxFbnRpdHkuc2V0VVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAgYXNzb2NpYXRlKHdzRW50aXR5LCB3c2lsRW50aXR5KTsKLSAgICAgICAgdXJpVG9FbnRpdHlUYWJsZV8ucHV0KGFic29sdXRlVVJJLCB3c2lsRW50aXR5KTsKLSAgICAgICAgaWYgKChwYXJzZU9wdGlvbiB8IFBBUlNFX1dTSUwpID09IHBhcnNlT3B0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcGFyc2VXU0lMKGFic29sdXRlVVJJLCBwYXJzZU9wdGlvbiwgYnl0ZUVuY29kaW5nICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpPTA7aTxkaXNjb1VSSXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgV2ViU2VydmljZUVudGl0eSBkaXNjb0VudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICAgIGRpc2NvRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX0RJU0NPKTsKLSAgICAgICAgZGlzY29FbnRpdHkuc2V0VVJJKGRpc2NvVVJJc1tpXSk7Ci0gICAgICAgIGFzc29jaWF0ZSh3c0VudGl0eSxkaXNjb0VudGl0eSk7Ci0gICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChkaXNjb1VSSXNbaV0sZGlzY29FbnRpdHkpOwotICAgICAgICBpZiAoKHBhcnNlT3B0aW9uIHwgUEFSU0VfRElTQ08pID09IHBhcnNlT3B0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcGFyc2VESVNDTyhkaXNjb1VSSXNbaV0scGFyc2VPcHRpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBmYWxzZSBpZiB1cmlfIGlzIG5vdCBhIEhUTUwgZG9jdW1lbnQKLSAgICAvLyB0aGVuIHBhcnNlIHVyaV8gYXMgYSBXU0lMIGRvY3VtZW50Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBwYXJzZVdTSUwodGhlVXJpLCBwYXJzZU9wdGlvbiwgYnl0ZUVuY29kaW5nICk7Ci0gICAgICAgIC8vIG5vIGV4Y2VwdGlvbiB0aHJvd24gaWYgdXJpXyBpcyBhIFdTSUwgZG9jdW1lbnQKLSAgICAgICAgd3NFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICAgIC8vIGV4Y2VwdGlvbiB0aHJvd24gaWYgdXJpXyBpcyBub3QgYSBXU0lMIGRvY3VtZW50Ci0gICAgICAgIC8vIHRoZW4gcGFyc2UgdXJpXyBhcyBhIERJU0NPIGRvY3VtZW50LgotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHBhcnNlRElTQ08odGhlVXJpLCBwYXJzZU9wdGlvbik7Ci0gICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHRocm93biBpZiB1cmlfIGlzIGEgRElTQ08gZG9jdW1lbnQKLSAgICAgICAgICB3c0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9ESVNDTyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0MikKLSAgICAgICAgewotICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aHJvd24gaWYgdXJpXyBpcyBub3QgYSBESVNDTyBkb2N1bWVudAotICAgICAgICAgIC8vIHRoZW4gcGFyc2UgdXJpXyBhcyBhIFdTREwgZG9jdW1lbnQKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJzZVdTREwodGhlVXJpKTsKLSAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiB0aHJvd24gaWYgdXJpXyBpcyBhIFdTREwgZG9jdW1lbnQKLSAgICAgICAgICAgIHdzRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aHJvd24gaWYgdXJpXyBpcyBub3QgYSBXU0RMIGRvY3VtZW50Ci0gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmcKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcGFyc2VXU0lMKFN0cmluZyB3c2lsVVJJLCBpbnQgcGFyc2VPcHRpb24sIFN0cmluZyBieXRlRW5jb2RpbmcgKSB0aHJvd3MgV1NJTEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NpbEVudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c2lsVVJJKTsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IChXU0lMRG9jdW1lbnQpd3NpbEVudGl0eS5nZXRNb2RlbCgpOwotICAgIGlmICh3c2lsRG9jICE9IG51bGwpCi0gICAgewotICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wcyBmcm9tIG9jY3VycmluZyB3aGVuIGEgV1NJTCBjeWNsZXMgb2NjdXIuCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnRWZXJib3NlKHdzaWxVUkksIGJ5dGVFbmNvZGluZyApOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IGluc3BlY3Rpb24uZ2V0U2VydmljZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIERlc2NyaXB0aW9uW10gZGVzY3MgPSBzZXJ2aWNlc1tpXS5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICAgIC8vIFNldCB0aGUgZG9jdW1lbnRhdGlvbiB0byB0aGUgPHNlcnZpY2U+IGVsZW1lbnQncyBmaXJzdCBhYnN0cmFjdC4KLSAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uID0gbnVsbDsKLSAgICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gc2VydmljZXNbaV0uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgICBpZiAoYWJzdHJhY3RzICE9IG51bGwgJiYgYWJzdHJhY3RzLmxlbmd0aCA+IDApCi0gICAgICAgIGRvY3VtZW50YXRpb24gPSBhYnN0cmFjdHNbMF0uZ2V0VGV4dCgpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgIAlTdHJpbmcgcmVmZXJlbmNlZE5TID0gZGVzY3Nbal0uZ2V0UmVmZXJlbmNlZE5hbWVzcGFjZSgpOwotICAgICAgCS8vIElmIGEgPGRlc2NyaXB0aW9uPiBlbGVtZW50IGNvbnRhaW5zIGFuIGFic3RyYWN0LCB1c2UgaXQgdG8gb3ZlcnJpZGUgdGhlIHNlcnZpY2UgZG9jdW1lbnRhdGlvbi4gICAgICAJCi0gICAgICAJYWJzdHJhY3RzID0gZGVzY3Nbal0uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgICAJaWYgKGFic3RyYWN0cyAhPSBudWxsICYmIGFic3RyYWN0cy5sZW5ndGggPiAwKQotICAgICAgCSAgZG9jdW1lbnRhdGlvbiA9IGFic3RyYWN0c1swXS5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0RMLmVxdWFscyhyZWZlcmVuY2VkTlMpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZGVzY3Nbal0uZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbi5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlVVJJID0gY29udmVydFRvQWJzb2x1dGVVUkkod3NpbFVSSSwgbG9jYXRpb24pOwotICAgICAgICAgICAgV2ViU2VydmljZUVudGl0eSB3c2RsRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgICAgICAgIHdzZGxFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NETCk7Ci0gICAgICAgICAgICB3c2RsRW50aXR5LnNldFVSSShhYnNvbHV0ZVVSSSk7Ci0gICAgICAgICAgICB3c2RsRW50aXR5LnNldERvY3VtZW50YXRpb24oZG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgICBhc3NvY2lhdGUod3NpbEVudGl0eSwgd3NkbEVudGl0eSk7Ci0gICAgICAgICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQoYWJzb2x1dGVVUkksIHdzZGxFbnRpdHkpOwotICAgICAgICAgICAgaWYgKChwYXJzZU9wdGlvbiB8IFBBUlNFX1dTREwpID09IHBhcnNlT3B0aW9uKQotICAgICAgICAgICAgICBwYXJzZVdTREwoYWJzb2x1dGVVUkkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChVRERJQ29uc3RhbnRzLk5TX1VSSV9VRERJX1YyLmVxdWFscyhyZWZlcmVuY2VkTlMpKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaW9uRWxlbWVudCBlZSA9IGRlc2NzW2pdLmdldEV4dGVuc2lvbkVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZWUgaW5zdGFuY2VvZiBTZXJ2aWNlRGVzY3JpcHRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gKFNlcnZpY2VEZXNjcmlwdGlvbillZTsKLSAgICAgICAgICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gc2QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlS2V5ID0gc2QuZ2V0U2VydmljZUtleSgpLmdldFRleHQoKTsKLSAgICAgICAgICAgIFdlYlNlcnZpY2VFbnRpdHkgdWRkaVNlcnZpY2VFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgICAgICAgdWRkaVNlcnZpY2VFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfVURESV9TRVJWSUNFKTsKLSAgICAgICAgICAgIFN0cmluZyB1ZGRpU2VydmljZUtleVVSSSA9IFVERElVUklIZWxwZXIuZ2V0U2VydmljZUtleVVSSShzZXJ2aWNlS2V5LGlucXVpcnlVUkwpOwotICAgICAgICAgICAgdWRkaVNlcnZpY2VFbnRpdHkuc2V0VVJJKHVkZGlTZXJ2aWNlS2V5VVJJKTsKLSAgICAgICAgICAgIHVkZGlTZXJ2aWNlRW50aXR5LnNldERvY3VtZW50YXRpb24oZG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgICBhc3NvY2lhdGUod3NpbEVudGl0eSx1ZGRpU2VydmljZUVudGl0eSk7Ci0gICAgICAgICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQodWRkaVNlcnZpY2VLZXlVUkksdWRkaVNlcnZpY2VFbnRpdHkpOwotICAgICAgICAgICAgLy8gVE9ETzogcGFyc2UgV1NETCBpZiBuZWNlc3NhcnkuLi4KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgTGlua1tdIGxpbmtzID0gaW5zcGVjdGlvbi5nZXRMaW5rcygpOyAgICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChXU0lMQ29uc3RhbnRzLk5TX1VSSV9XU0lMLmVxdWFscyhsaW5rc1tpXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCkpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IG51bGw7Ci0gICAgICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gbGlua3NbaV0uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgICAgIGlmIChhYnN0cmFjdHMgIT0gbnVsbCAmJiBhYnN0cmFjdHMubGVuZ3RoID4gMCkKLSAgICAgICAgICBkb2N1bWVudGF0aW9uID0gYWJzdHJhY3RzWzBdLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIGxpbmtMb2NhdGlvbiA9IGxpbmtzW2ldLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhYnNvbHV0ZVVSSSA9IGNvbnZlcnRUb0Fic29sdXRlVVJJKHdzaWxVUkksIGxpbmtMb2NhdGlvbik7Ci0gICAgICAgIC8vIFByZXZlbnQgY3ljbGVzLgotICAgICAgICBXZWJTZXJ2aWNlRW50aXR5IHdzaWxMaW5rRW50aXR5ID0gZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAgaWYgKHdzaWxMaW5rRW50aXR5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2lsTGlua0VudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICAgICAgd3NpbExpbmtFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCk7Ci0gICAgICAgICAgd3NpbExpbmtFbnRpdHkuc2V0VVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAgICB3c2lsTGlua0VudGl0eS5zZXREb2N1bWVudGF0aW9uKGRvY3VtZW50YXRpb24pOwotICAgICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChhYnNvbHV0ZVVSSSwgd3NpbExpbmtFbnRpdHkpOwotICAgICAgICAgIGlmICgocGFyc2VPcHRpb24gfCBQQVJTRV9MSU5LUykgPT0gcGFyc2VPcHRpb24pCi0gICAgICAgICAgICBwYXJzZVdTSUwoYWJzb2x1dGVVUkksIHBhcnNlT3B0aW9uLCBieXRlRW5jb2RpbmcgKTsKLSAgICAgICAgfQotICAgICAgICBhc3NvY2lhdGUod3NpbEVudGl0eSx3c2lsTGlua0VudGl0eSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcGFyc2VESVNDTyhTdHJpbmcgZGlzY29VUkksIGludCBwYXJzZU9wdGlvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24sIEV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZUVudGl0eSBkaXNjb0VudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSShkaXNjb1VSSSk7Ci0gICAgYnl0ZVtdIGIgPSBnZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KGRpc2NvVVJJKTsKLSAgICBkaXNjb0VudGl0eS5zZXRCeXRlcyhiKTsKLSAgICBzZXRIVFRQU2V0dGluZ3MoZGlzY29FbnRpdHkpOwotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYik7Ci0gICAgRElTQ09QYXJzZXIgcGFyc2VyID0gbmV3IERJU0NPUGFyc2VyKCk7Ci0gICAgRElTQ09SZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gcGFyc2VyLnBhcnNlKGRpc2NvVVJJLG5ldyBJbnB1dFNvdXJjZShiYWlzKSk7Ci0gICAgaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiByZWZlcmVuY2VzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wO2k8cmVmZXJlbmNlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBpZiAocmVmZXJlbmNlc1tpXSBpbnN0YW5jZW9mIERJU0NPQ29udHJhY3RSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjb250cmFjdFJlZgotICAgICAgICAgIERJU0NPQ29udHJhY3RSZWZlcmVuY2UgcmVmZXJlbmNlID0gKERJU0NPQ29udHJhY3RSZWZlcmVuY2UpcmVmZXJlbmNlc1tpXTsKLSAgICAgICAgICBTdHJpbmcgcmVmID0gcmVmZXJlbmNlLmdldFJlZigpOwotICAgICAgICAgIFN0cmluZyBkb2NSZWYgPSByZWZlcmVuY2UuZ2V0RG9jUmVmKCk7Ci0gICAgICAgICAgV2ViU2VydmljZUVudGl0eSB3c2RsRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgICAgICB3c2RsRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpOwotICAgICAgICAgIHdzZGxFbnRpdHkuc2V0VVJJKHJlZik7Ci0gICAgICAgICAgd3NkbEVudGl0eS5zZXREb2N1bWVudGF0aW9uKGRvY1JlZik7Ci0gICAgICAgICAgYXNzb2NpYXRlKGRpc2NvRW50aXR5LHdzZGxFbnRpdHkpOwotICAgICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChyZWYsd3NkbEVudGl0eSk7Ci0gICAgICAgICAgaWYgKChwYXJzZU9wdGlvbiB8IFBBUlNFX1dTREwpID09IHBhcnNlT3B0aW9uKQotICAgICAgICAgICAgcGFyc2VXU0RMKHJlZik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZGlzY292ZXJ5UmVmCi0gICAgICAgICAgU3RyaW5nIHJlZiA9IHJlZmVyZW5jZXNbaV0uZ2V0UmVmKCk7Ci0gICAgICAgICAgLy8gUHJldmVudCBjeWNsZXMuCi0gICAgICAgICAgV2ViU2VydmljZUVudGl0eSBkaXNjb0xpbmtFbnRpdHkgPSBnZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkocmVmKTsKLSAgICAgICAgICBpZiAoZGlzY29MaW5rRW50aXR5ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZGlzY29MaW5rRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgICAgICAgIGRpc2NvTGlua0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9ESVNDTyk7Ci0gICAgICAgICAgICBkaXNjb0xpbmtFbnRpdHkuc2V0VVJJKHJlZik7Ci0gICAgICAgICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQocmVmLGRpc2NvTGlua0VudGl0eSk7Ci0gICAgICAgICAgICBpZiAoKHBhcnNlT3B0aW9uIHwgUEFSU0VfTElOS1MpID09IHBhcnNlT3B0aW9uKQotICAgICAgICAgICAgICBwYXJzZURJU0NPKHJlZixwYXJzZU9wdGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGFzc29jaWF0ZShkaXNjb0VudGl0eSxkaXNjb0xpbmtFbnRpdHkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBEZWZpbml0aW9uIHBhcnNlV1NETChTdHJpbmcgd3NkbFVSSSkgdGhyb3dzIFdTRExFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gZ2V0V1NETERlZmluaXRpb25WZXJib3NlKHdzZGxVUkkpOwotICB9Ci0KLSAgcHJpdmF0ZSBieXRlW10gZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheShTdHJpbmcgdXJpU3RyaW5nKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIC8vIFRyeSB0byBnZXQgYSBjYWNoZWQgY29weSBvZiB0aGUgYnl0ZVtdCi0gICAgV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh1cmlTdHJpbmcpOwotICAgIGlmICh3c0VudGl0eSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJ5dGVbXSBieXRlcyA9IHdzRW50aXR5LmdldEJ5dGVzKCk7Ci0gICAgICBpZiAoYnl0ZXMgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLSAgICAvLyBHZXQgdGhlIGJ5dGVbXSBieSBvcGVuaW5nIGEgc3RyZWFtIHRvIHRoZSBVUkkKLSAgICBVUkwgdXJsID0gY3JlYXRlVVJMKHVyaVN0cmluZyk7Ci0gICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgLy8gcHJveHkgc2VydmVyIHNldHRpbmcKLSAgICBTdHJpbmcgcHJveHlVc2VyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVVzZXJOYW1lIik7Ci0gICAgU3RyaW5nIHByb3h5UGFzc3dvcmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAucHJveHlQYXNzd29yZCIpOwotICAgIGlmIChwcm94eVVzZXJOYW1lICE9IG51bGwgJiYgcHJveHlQYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciB1c2VyTmFtZVBhc3N3b3JkID0gbmV3IFN0cmluZ0J1ZmZlcihwcm94eVVzZXJOYW1lKTsKLSAgICAgIHVzZXJOYW1lUGFzc3dvcmQuYXBwZW5kKCc6JykuYXBwZW5kKHByb3h5UGFzc3dvcmQpOwotICAgICAgQkFTRTY0RW5jb2RlciBlbmNvZGVyID0gbmV3IEJBU0U2NEVuY29kZXIoKTsKLSAgICAgIFN0cmluZyBlbmNvZGluZyA9IGVuY29kZXIuZW5jb2RlKHVzZXJOYW1lUGFzc3dvcmQudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgIHVzZXJOYW1lUGFzc3dvcmQuc2V0TGVuZ3RoKDApOwotICAgICAgdXNlck5hbWVQYXNzd29yZC5hcHBlbmQoIkJhc2ljICIpLmFwcGVuZChlbmNvZGluZyk7Ci0gICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiUHJveHktYXV0aG9yaXphdGlvbiIsIHVzZXJOYW1lUGFzc3dvcmQudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gc2V0dGluZwotICAgIGlmIChodHRwQmFzaWNBdXRoVXNlcm5hbWVfICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aFBhc3N3b3JkXyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaHR0cEJhc2ljQXV0aFVzZXJuYW1lXyk7Ci0gICAgICBzYi5hcHBlbmQoJzonKS5hcHBlbmQoaHR0cEJhc2ljQXV0aFBhc3N3b3JkXyk7Ci0gICAgICBCQVNFNjRFbmNvZGVyIGVuY29kZXIgPSBuZXcgQkFTRTY0RW5jb2RlcigpOwotICAgICAgU3RyaW5nIGVuY29kaW5nID0gZW5jb2Rlci5lbmNvZGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgIHNiLnNldExlbmd0aCgwKTsKLSAgICAgIHNiLmFwcGVuZCgiQmFzaWMgIikuYXBwZW5kKGVuY29kaW5nKTsKLSAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIFN0cmluZyB3d3dBdXRoTXNnID0gY29ubi5nZXRIZWFkZXJGaWVsZCgiV1dXLUF1dGhlbnRpY2F0ZSIpOwotICAgICAgaWYgKHd3d0F1dGhNc2cgIT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKG5ldyBJT0V4Y2VwdGlvbigpLCB3d3dBdXRoTXNnLCB1cmlTdHJpbmcpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIFN0cmluZyB3d3dBdXRoTXNnID0gY29ubi5nZXRIZWFkZXJGaWVsZCgiV1dXLUF1dGhlbnRpY2F0ZSIpOwotICAgICAgaWYgKHd3d0F1dGhNc2cgIT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKGlvZSwgd3d3QXV0aE1zZywgdXJpU3RyaW5nKTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgaW9lOwotICAgIH0KLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBieXRlW10gYiA9IG5ldyBieXRlWzEwMjRdOwotICAgIGludCBieXRlUmVhZCA9IGlzLnJlYWQoYik7Ci0gICAgd2hpbGUgKGJ5dGVSZWFkICE9IC0xKQotICAgIHsKLSAgICAgIGJhb3Mud3JpdGUoYiwgMCwgYnl0ZVJlYWQpOwotICAgICAgYnl0ZVJlYWQgPSBpcy5yZWFkKGIpOwotICAgIH0KLSAgICBpcy5jbG9zZSgpOwotICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgVVJMIGNyZWF0ZVVSTChTdHJpbmcgdXJsKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IFVSTCh1cmwpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc29jaWF0ZShXZWJTZXJ2aWNlRW50aXR5IHBhcmVudCwgV2ViU2VydmljZUVudGl0eSBjaGlsZCkKLSAgewotICAgIHBhcmVudC5hZGRDaGlsZChjaGlsZCk7Ci0gICAgY2hpbGQuc2V0UGFyZW50KHBhcmVudCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBjb252ZXJ0VG9BYnNvbHV0ZVVSSShTdHJpbmcgYmFzZVVSSSxTdHJpbmcgcmVmVVJJKQotICB7Ci0gICAgaWYgKHJlZlVSSSAhPSBudWxsICYmIHJlZlVSSS5pbmRleE9mKCI6IikgPCAwKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBhYnNvbHV0ZVVSSSA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZVVSSS5zdWJzdHJpbmcoMCxNYXRoLm1heChiYXNlVVJJLmxhc3RJbmRleE9mKCdcXCcpLGJhc2VVUkkubGFzdEluZGV4T2YoJy8nKSsxKSkpOwotICAgICAgYWJzb2x1dGVVUkkuYXBwZW5kKHJlZlVSSSk7Ci0gICAgICByZXR1cm4gYWJzb2x1dGVVUkkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZlVSSTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRIVFRQU2V0dGluZ3MoV2ViU2VydmljZUVudGl0eSBlbnRpdHkpCi0gIHsKLSAgICBpZiAoaHR0cEJhc2ljQXV0aFVzZXJuYW1lXyAhPSBudWxsICYmIGh0dHBCYXNpY0F1dGhQYXNzd29yZF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbnRpdHkuc2V0SFRUUFVzZXJuYW1lKGh0dHBCYXNpY0F1dGhVc2VybmFtZV8pOwotICAgICAgZW50aXR5LnNldEhUVFBQYXNzd29yZChodHRwQmFzaWNBdXRoUGFzc3dvcmRfKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEhUVFBCYXNpY0F1dGhVc2VybmFtZSgpCi0gIHsKLSAgICByZXR1cm4gaHR0cEJhc2ljQXV0aFVzZXJuYW1lXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpCi0gIHsKLSAgICBodHRwQmFzaWNBdXRoVXNlcm5hbWVfID0gdXNlcm5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEhUVFBCYXNpY0F1dGhQYXNzd29yZCgpCi0gIHsKLSAgICByZXR1cm4gaHR0cEJhc2ljQXV0aFBhc3N3b3JkXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhUVFBCYXNpY0F1dGhQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCi0gIHsKLSAgICBodHRwQmFzaWNBdXRoUGFzc3dvcmRfID0gcGFzc3dvcmQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL3dzaWwucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BhcnNlci93c2lsL3dzaWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2MGMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wYXJzZXIvd3NpbC93c2lsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgQWRkV1NETFRvV1NJTENvbW1hbmQKLSMKLU1TR19FUlJPUl9JTlZBTElEX0FSR1VNRU5UUz1JV0FCMDA1NUUgSW52YWxpZCBjb21tYW5kIGFyZ3VtZW50cy4KLU1TR19FUlJPUl9JTExFR0FMX0FSR1VNRU5UUz1JV0FCMDEwNUUgSWxsZWdhbCBhcmd1bWVudC4KLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJJPUlXQUIwMTg1RSBJbnZhbGlkIFdTREwgVVJJLgotTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9VUkk9SVdBQjAyMDZFIEludmFsaWQgV1NJTCBVUkkuCi1NU0dfRVJST1JfVU5SRVNPTFZBQkxFX1dTREw9SVdBQjA0MDVFIFdTREwgaXMgdW5yZXNvbHZhYmxlLgotTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OPUlXQUIwNDUxRSBBbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZC4KLU1TR19FUlJPUl9NQUxGT1JNRURfV1NETD1JV0FCMDQ1MkUgV1NETCBpcyBtYWxmb3JtZWQsIGVycm9yIHBhcnNpbmcgV1NETC4KLU1TR19FUlJPUl9XUklURV9XU0lMPUlXQUIwNDUzRSBFcnJvciB3cml0aW5nIFdTSUwuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvUGx1Z2luTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9QbHVnaW5NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzliMGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9QbHVnaW5NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFBsdWdpbk1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLnBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHN0YXRpYwotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUGx1Z2luTWVzc2FnZXMuY2xhc3MpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUF9URVNUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfWE1FVEhPRFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9OVFRDT01NOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4MGU0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotIwotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUD1TQVAgVURESSBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUF9URVNUPVNBUCBVRERJIFRlc3QgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9YTUVUSE9EUz1YTWV0aG9kcyBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX05UVENPTU09TlRUIENvbW11bmljYXRpb25zIFJlZ2lzdHJ5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDg2N2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLXdzdWkuamFyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDg3ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3MudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjY1NGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjM4OjE1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5NjkwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6Mzk6NDYgRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIyYzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud3MudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDMucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5jb21tYW5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS51dGlscywKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzcnQ7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3ZWNkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWI4MzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIFVJCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotUFJFRkVSRU5DRV9DQVRFR09SWV9XU0k9UHJvZmlsZSBDb21wbGlhbmNlIGFuZCBWYWxpZGF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDQ2MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9XU0kiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5XU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5XU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPC9wYWdlPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCi0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfV1NJIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJvcGVydGllcy5XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJvcGVydGllcy5XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlIj4KLSAgICAgIDwvcGFnZT4KLQotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvV3N0V1NVSVBsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9Xc3RXU1VJUGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWZhZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9Xc3RXU1VJUGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNjA4MTYgICAxNTE2MzIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4sIFJlbW92ZWQgdW51c2VkIHByb3BlcnRpZXMgZm9yICJXYWl0IGZvciB3aXphcmQgV1NETCB2YWxpZGF0aW9uIgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgVUkKLVBMVUdJTl9WRU5ET1I9RWNsaXBzZS5vcmcKLVBMVUdJTl9ERVNDPVwKLVRoZSBXZWIgc2VydmljZXMgR1VJIHBsdWdpbiBkZWxpdmVycyB0aGUgZ3JhcGhpY2FsIFwKLXVzZXIgaW50ZXJmYWNlIHRvIHRoZSBXZWIgc2VydmljZXMgZnVuY3Rpb24gaW4gdGhlIFdTVCBzdWJwcm9qZWN0LgotCi1QTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi0KLQotIwotIyAgV1MtSSBQcmVmZXJlbmNlIHBhZ2VzCi0jCi0jIFdTLUkgQ29tcGxpYW5jZSBQYWdlCi0jCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1dTST1XUy1JIENvbXBsaWFuY2UKLVNUT1BfTk9OX1dTST1SZXF1aXJlIGNvbXBsaWFuY2UKLVdBUk5fTk9OX1dTST1TdWdnZXN0IGNvbXBsaWFuY2UKLUlHTk9SRV9OT05fV1NJPUlnbm9yZSBjb21wbGlhbmNlCi1GT0xMT1dfV1NJX1BSRUZFUkVOQ0U9Rm9sbG93IFByZWZlcmVuY2UKLQotVE9PTFRJUF9QV1NJX1BBR0U9V2ViIFNlcnZpY2VzIEludGVyb3BlcmFiaWxpdHkKLVRPT0xUSVBfUFdTSV9SQURJT19TVE9QX05PTl9XU0k9U3RvcCBhbmQgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGlmIHlvdSBtYWtlIGEgY2hvaWNlIHRoYXQgZG9lcyBub3QgY29tcGx5IHdpdGggV1MtSS4KLVRPT0xUSVBfUFdTSV9SQURJT19XQVJOSU5HX05PTl9XU0k9UHJvZHVjZSBhIHdhcm5pbmcgbWVzc2FnZSBpZiB5b3UgbWFrZSBhIGNob2ljZSB0aGF0IGRvZXMgbm90IGNvbXBseSB3aXRoIFdTLUkuCi1UT09MVElQX1BXU0lfUkFESU9fSUdOT1JFX05PTl9XU0k9U2lsZW50bHkgYWxsb3cgY2hvaWNlcyB0aGF0IGRvIG5vdCBjb21wbHkgd2l0aCBXUy1JLgotVE9PTFRJUF9QV1NJX1JBRElPX0ZPTExPV19XU0lfUFJFRkVSRU5DRT1Qcm9qZWN0IHdvdWxkIHVzZSBXUy1JIGNvbXBsaWFuY2UgbGV2ZWwgc2V0IGluIFdvcmtzcGFjZSBQcmVmZXJlbmNlLgotCi1MQUJFTF9XU0lfU1NCUD1XUy1JIFMmU0JQIGNvbXBsaWFuY2UgbGV2ZWwKLVRPT0xUSVBfUFdTSV9TU0JQX0xBQkVMPVdTLUkgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlIGNvbXBsaWFuY2UgbGV2ZWwKLVRPT0xUSVBfUFdTSV9TU0JQX0NPTUJPPUNob29zZSB0aGUgV1MtSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUgY29tcGxpYW5jZSBsZXZlbAotCi1MQUJFTF9XU0lfQVA9V1MtSSBBJlAgY29tcGxpYW5jZSBsZXZlbAotVE9PTFRJUF9QV1NJX0FQX0xBQkVMPVdTLUkgQXR0YWNobWVudCBQcm9maWxlIGNvbXBsaWFuY2UgbGV2ZWwKLVRPT0xUSVBfUFdTSV9BUF9DT01CTz1DaG9vc2UgdGhlIFdTLUkgQXR0YWNobWVudCBQcm9maWxlIGNvbXBsaWFuY2UgbGV2ZWwKLQotIwotIwlXU0RMIFZhbGlkYXRpb24KLSMKLUxBQkVMX1dTRExWQUw9U2VsZWN0IHdoZXRoZXIgV1NETCB2YWxpZGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgb24gd2l6YXJkcyB0aGF0IGNvbnN1bWUgV1NETCBmaWxlcwotTEFCRUxfV1NETFZBTF9OT05FPSZObyB3aXphcmQgV1NETCB2YWxpZGF0aW9uCi1MQUJFTF9XU0RMVkFMX1JFTU9URT1XaXphcmQgV1NETCB2YWxpZGF0aW9uIGZvciAmcmVtb3RlIGZpbGVzIG9ubHkKLUxBQkVMX1dTRExWQUxfQUxMPVdpemFyZCBXU0RMIHZhbGlkYXRpb24gZm9yICZhbGwgV1NETCBmaWxlcwotVE9PTFRJUF9QV1NJX1JBRElPX1dTRExWQUxfTk9ORT1EbyBub3QgcGVyZm9ybSBXU0RMIHZhbGlkYXRpb24gb24gdGhlIFdTREwgZmlsZSBvciBVUkwgaW5wdXQgdG8gdGhlIFdlYiBTZXJ2aWNlcyB3aXphcmQKLVRPT0xUSVBfUFdTSV9SQURJT19XU0RMVkFMX1JFTU9URT1Pbmx5IHBlcmZvcm0gV1NETCB2YWxpZGF0aW9uIG9uIHJlbW90ZSBXU0RMIGZpbGUgb3IgVVJMIGlucHV0IHRvIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkCi1UT09MVElQX1BXU0lfUkFESU9fV1NETFZBTF9BTEw9UGVyZm9ybSBXU0RMIHZhbGlkYXRpb24gb24gYWxsIFdTREwgZmlsZSBvciBVUkwgaW5wdXQgdG8gdGhlIFdlYiBTZXJ2aWNlcyB3aXphcmQKLVRPT0xUSVBfUFdTSV9XU0RMVkFMX0xBQkVMPVNlbGVjdCB3aGV0aGVyIFdTREwgdmFsaWRhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIHdpemFyZHMgdGhhdCBjb25zdW1lIFdTREwgZmlsZXMsIFxuZm9yIGV4YW1wbGUsIFdlYiBTZXJ2aWNlIHdpemFyZCBpbiBza2VsZXRvbiBzY2VuYXJpbyBhbmQgV2ViIFNlcnZpY2UgQ2xpZW50IHdpemFyZC4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9Xc3RXU1VJUGx1Z2luTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzFkYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9Xc3RXU1VJUGx1Z2luTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDcyOCAgIDE1MTYzMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXc3RXU1VJUGx1Z2luTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5Xc3RXU1VJUGx1Z2luIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdzdFdTVUlQbHVnaW5NZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX1ZFTkRPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRkVSRU5DRV9DQVRFR09SWV9XU0k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1RPUF9OT05fV1NJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5fTk9OX1dTSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJR05PUkVfTk9OX1dTSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGT0xMT1dfV1NJX1BSRUZFUkVOQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NJX1BBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NJX1JBRElPX1NUT1BfTk9OX1dTSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXU0lfUkFESU9fV0FSTklOR19OT05fV1NJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTSV9SQURJT19JR05PUkVfTk9OX1dTSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXU0lfUkFESU9fRk9MTE9XX1dTSV9QUkVGRVJFTkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1dTSV9TU0JQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTSV9TU0JQX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTSV9TU0JQX0NPTUJPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1dTSV9BUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXU0lfQVBfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NJX0FQX0NPTUJPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1dTRExWQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV1NETFZBTF9OT05FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1dTRExWQUxfUkVNT1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1dTRExWQUxfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTSV9SQURJT19XU0RMVkFMX05PTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVE9PTFRJUF9QV1NJX1JBRElPX1dTRExWQUxfUkVNT1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRPT0xUSVBfUFdTSV9SQURJT19XU0RMVkFMX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUT09MVElQX1BXU0lfV1NETFZBTF9MQUJFTDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvY29tbWFuZC9PcGVuRWRpdG9yQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9jb21tYW5kL09wZW5FZGl0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmFhZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9jb21tYW5kL09wZW5FZGl0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwODEwICAgMTM1Mzk1IG1ha2FuZHJlQGNhLmlibS5jb20gLSBBbmRyZXcgTWFrLCBFbmFibGUgV1RQIFdlYiBzZXJ2aWNlIGZyYW1ld29yayBvcGVuaW5nIEphdmEgZWRpdG9yCi0gKiAyMDA2MTAyNSAgIDE2MjI4OCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgd29ya3NwYWNlIHBhdGhzIHdpdGggc3BhY2VzIGJyZWFrIEphdmEgRWRpdG9yIExhdW5jaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotLyoqCi0gKiBBIGNvbW1hbmQgd2hpY2gsIHdoZW4gZ2l2ZW4gYW4gYXJyYXkgb2YgaW1wbGVtZW50YXRpb24gVVJMcywgd2lsbAotICogb3BlbiB0aGVtIHdpdGhpbiBFY2xpcHNlIHVzaW5nIHRoZSBlZGl0b3IgcmVnaXN0ZXJlZCB3aXRoIHRoZQotICogZmlsZSBleHRlbnNpb25zLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkVkaXRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9QUk9UT0NPTCAgICAgPSAiZmlsZTovIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExBVEZPUk1fUkVTT1VSQ0UgPSAicGxhdGZvcm06L3Jlc291cmNlLyI7Ci0JCi0JcHJpdmF0ZSBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlOwotCXByaXZhdGUgSUNvbnRleHQJY29udGV4dDsKLSAKLQkvKioKLQkgKiBTZXR0ZXIgZm9yIHRoZSBJV2ViU2VydmljZQotCSAqIAotCSAqIEBwYXJhbSB3ZWJTZXJ2aWNlIFRoZSBJV2ViU2VydmljZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSkgewotCQl0aGlzLndlYlNlcnZpY2UgPSB3ZWJTZXJ2aWNlOyAgCi0JfQotCSAgCi0JLyoqCi0JICogU2V0dGVyIGZvciB0aGUgSUNvbnRleHQKLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dCBUaGUgSUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0IChJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCi0JCWlmIChjb250ZXh0LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSAhPSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJU3RyaW5nW10gaW1wbFVSTHMgPSB3ZWJTZXJ2aWNlLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0SW1wbFVSTHMoKTsKLQkJCQotCQkvLyBub3RoaW5nIHRvIG9wZW4KLQkJaWYgKGltcGxVUkxzID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCUlGaWxlIGZpbGU7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcGxVUkxzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgeyAgICAJCQkJCQkKLQkJCQlTdHJpbmcgaW1wbFVSTCA9IGltcGxVUkxzW2ldOwotCQkJCWZpbGUgPSBudWxsOwotCQkJCQotCQkJCS8vIGxvY2FsIGZpbGVzeXN0ZW0gcGF0aAotCQkJCWlmIChpbXBsVVJMLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQkJaW1wbFVSTCA9IGltcGxVUkwuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpOwkJCQkKLQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGltcGxVUkwpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7CQotCQkJCQkvLyBwbGF0Zm9ybSBwYXRoCi0JCQkJCWlmIChpbXBsVVJMLnN0YXJ0c1dpdGgoUExBVEZPUk1fUkVTT1VSQ0UpKQotCQkJCQkJaW1wbFVSTCA9IGltcGxVUkwuc3Vic3RyaW5nKFBMQVRGT1JNX1JFU09VUkNFLmxlbmd0aCgpKTsKLQkJCQkKLQkJCQkJaWYgKGltcGxVUkwuaW5kZXhPZignOicpICE9IC0xKQotCQkJCQkJY29udGludWU7Ci0JCQkJCQotCQkJCQlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGltcGxVUkwpKTsKLQkJCQl9Ci0JCQkJCQkKLQkJCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCi0JCQkJaWYgKHBhZ2UgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJCQkJCQotCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9UT0RPOiBmb3IgV1RQIDIuMCwgcmV0dXJuIHByb3BlciBzdGF0dXMgKHdpdGggTkxTKQotCQkJCVdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coCi0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdTVUlQbHVnaW4uSUQsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3BsdWdpbi9XU1VJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3BsdWdpbi9XU1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDk5MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wbHVnaW4vV1NVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV1NVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQotIC8qKgotICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAqLwotIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53cy51aSI7Ci0KLSAvKioKLSAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAqLwotIHByaXZhdGUgc3RhdGljIFdTVUlQbHVnaW4gaW5zdGFuY2VfOwotIAotIC8qKgotICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAqLwotIHB1YmxpYyBXU1VJUGx1Z2luKCkgewotCXN1cGVyKCk7Ci0JaW5zdGFuY2VfID0gdGhpczsKLSB9Ci0KLSAvKioKLSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0gKiAoV1NVSVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLndzdC53cy51aSIpOwotICogQHJldHVybiBUaGUgV1NVSVBsdWdpbiBzaW5nbGV0b24uCi0gKi8KLSBzdGF0aWMgcHVibGljIFdTVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0gICByZXR1cm4gaW5zdGFuY2VfOwotIH0KLQotIC8qKgotICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgcmVzb3VyY2UKLSAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJVVJMIGluc3RhbGxVUkwgPSBpbnN0YW5jZV8uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJCVVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgbmFtZSk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICByZXR1cm4gbnVsbDsKLSAgIH0KLSB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9XZWJTZXJ2aWNlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZWU2YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9XZWJTZXJ2aWNlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBUaGUgV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotLyoqCi0gKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBTV1QgY29udHJvbCBmb3IgdGhlIGN1c3RvbWl6ZWQgYm9keSAKLSAqIG9mIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotICogPHA+Ci0gKiBUaGlzIGZyYW1ld29yayBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZQotICogc3ViY2xhc3Nlcy4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotICovCi1wcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JcmV0dXJuIG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci19Ci0vKioKLSAqIERvIGFueSBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBieSB0aGUgZGVza3RvcC4gQnkgZGVmYXVsdCBkbyBub3RoaW5nLgotICovCi1wdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggZGVza3RvcCkge30KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS91dGlscy9BZGFwdGVyVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvdXRpbHMvQWRhcHRlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZTgxNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS91dGlscy9BZGFwdGVyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDMyNyAgIDE3MjMzOSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS51dGlsczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBUaGUgQWRhcHRlclV0aWxzIGNsYXNzIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyB0byBnZXQgb2JqZWN0cyBmcm9tIHRoZSBQbGF0Zm9ybSdzIGFkYXB0ZXIgZXh0ZW5zaW9uLgotICoKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJVdGlscyB7CQotCQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QgT2JqZWN0IHRvIGFkYXB0Ci0JICogQHJldHVybiBUaGUgYWRhcHRlZCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG9yIFN0cmluZyBpZiBhbiBhZGFwdGVyIGlzIGZvdW5kLiAKLQkgKiAgICAgICAgIFJldHVybnMgbnVsbCBpZiBhbiBhZGFwdGVyIGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVkT2JqZWN0IChPYmplY3Qgb2JqZWN0KSB7IAotCQlPYmplY3QgYWRhcHRlZE9iamVjdCA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIob2JqZWN0LCAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiKTsKLQkJaWYgKGFkYXB0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJYWRhcHRlZE9iamVjdCA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIob2JqZWN0LCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVkT2JqZWN0OwotCX0KLQkKLQkvKioKLQkgICAqIEBwYXJhbSBvYmplY3QgTG9vayB1cCBhbiBhZGFwdGVyIG1hcHBpbmcgdGhlIG9iamVjdCB0byBJRmlsZSBvciBTdHJpbmcuCi0JICAgKiBAcmV0dXJuIFRoZSBXU0RMIHVyaSByZXR1cm5lZCBieSB0aGUgYWRhcHRlciBvciBudWxsIGlmIG5vIGFkYXB0ZXIgaXMgZm91bmQuCi0JICAgKi8KLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFkYXB0ZWRXU0RMIChPYmplY3Qgb2JqZWN0KSB7Ci0JCSAgU3RyaW5nIHdzZGxVUkkgPSBudWxsOwotCQkgIE9iamVjdCBhZGFwdGVkT2JqZWN0ID0gQWRhcHRlclV0aWxzLmdldEFkYXB0ZWRPYmplY3Qob2JqZWN0KTsKLQkJICBpZiAoIGFkYXB0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJICBpZiAoYWRhcHRlZE9iamVjdCBpbnN0YW5jZW9mIElGaWxlKQotCQkJICB7Ci0JCQkJICBVUkkgdXJpID0gKChJRmlsZSlhZGFwdGVkT2JqZWN0KS5nZXRMb2NhdGlvblVSSSgpOwotCQkJCSAgaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCSAgd3NkbFVSSSA9IHVyaS50b1N0cmluZygpOwotCQkJCSAgfQotCQkJCSAgCi0JCQkgIH0gZWxzZSBpZiAoYWRhcHRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCSAgd3NkbFVSSSA9IChTdHJpbmcpIGFkYXB0ZWRPYmplY3Q7Ci0JCQkgIH0KLQkJICB9Ci0JCSAgcmV0dXJuIHdzZGxVUkk7Ci0JICB9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9XU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjE4MmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDMxMCAgIDEzMTM1MiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA2MDcyOCAgIDE1MTYzMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkuV3N0V1NVSVBsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBXU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIsIExpc3RlbmVyCi0KLXsKLQkgIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDEgZm9yIHRoZSBXUy1JIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9QQUdFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDAiOwotICAvLwotCi0gIHByaXZhdGUgTGFiZWwgd3NpX3NzYnBfTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHdzaV9zc2JwX1R5cGVzXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNCBmb3IgdGhlIFdTLUkgU1NCUCB0eXBlIGNvbWJvIGJveCBvbiB0aGUgUHJvZmlsZSBDb21wbGlhbmNlIGFuZCBWYWxpZGF0aW9uIHBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19UWVBFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDQiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDggZm9yIHRoZSBXUy1JIEFQIHR5cGUgY29tYm8gYm94IG9uIHRoZSBQcm9maWxlIENvbXBsaWFuY2UgYW5kIFZhbGlkYXRpb24gcGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19UWVBFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDgiOwotICAgICAgCi0gIHByaXZhdGUgTGFiZWwgd3NpX2FwX0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21ibyB3c2lfYXBfVHlwZXNfOwotICAKLSAgcHJpdmF0ZSBpbnQgc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsKLSAgCi0gIHByaXZhdGUgR3JvdXAgdmFsaWRhdGlvblNlbGVjdGlvbkdyb3VwXzsKLSAgCi0gIHByaXZhdGUgVGV4dCB3c2RsVmFsaWRhdGlvbkxhYmVsXzsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA5IGZvciB0aGUgTm8gV2l6YXJkIFdTREwgdmFsaWRhdGlvbiBidXR0b24gb24gdGhlIFByb2ZpbGUgQ29tcGxpYW5jZSBhbmQgVmFsaWRhdGlvbiBwYWdlKi8KLSAgcHJpdmF0ZSBCdXR0b24gdmFsaWRhdGVOb1dzZGxCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDEwIGZvciB0aGUgV2l6YXJkIFdTREwgdmFsaWRhdGlvbiBmb3IgcmVtb3RlIGZpbGVzIG9ubHkgYnV0dG9uIG9uIHRoZSBQcm9maWxlIENvbXBsaWFuY2UgYW5kIFZhbGlkYXRpb24gcGFnZSovCi0gIHByaXZhdGUgQnV0dG9uIHZhbGlkYXRlUmVtb3RlV3NkbEJ1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMTEgZm9yIHRoZSBXaXphcmQgV1NETCB2YWxpZGF0aW9uIGZvciBhbGwgZmlsZXMgYnV0dG9uIG9uIHRoZSBQcm9maWxlIENvbXBsaWFuY2UgYW5kIFZhbGlkYXRpb24gcGFnZSovCi0gIHByaXZhdGUgQnV0dG9uIHZhbGlkYXRlQWxsV3NkbEJ1dHRvbl87Ci0gIAotCi0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDkgZm9yIHRoZSBubyB3c2RsIHZhbGlkYXRpb24gcmFkaW8gYnV0dG9uIG9mIHRoZSBwcm9maWxlIHZhbGlkYXRpb24gcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfUkFESU9fV1NETFZBTF9OT05FID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDkiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDEwIGZvciB0aGUgd3NkbCB2YWxpZGF0aW9uIG9uIHJlbW90ZSBkb2N1bWVudCByYWRpbyBidXR0b24gb2YgdGhlIHByb2ZpbGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9SQURJT19XU0RMVkFMX1JFTU9URSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAxMCI7Ci0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMTEgZm9yIHRoZSB3c2RsIHZhbGlkYXRpb24gb24gYWxsIGRvY3VtZW50IHJhZGlvIGJ1dHRvbiBvZiB0aGUgcHJvZmlsZSB2YWxpZGF0aW9uIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1JBRElPX1dTRExWQUxfQUxMID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMTEiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDEyIGZvciB0aGUgd3NkbCB2YWxpZGF0aW9uIGxhYmVsIG9mIHRoZSBwcm9maWxlIHZhbGlkYXRpb24gcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfV1NETFZBTF9MQUJFTCA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDEyIjsKLQotIC8qKgotICAgKiBDcmVhdGVzIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyBvbiBkZW1hbmQuCi0gICAqICAgQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHN1cGVycGFyZW50KQotICB7Ci0gICAKLSAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBwYXJlbnQuc2V0VG9vbFRpcFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFdTSV9QQUdFKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LElORk9QT1BfUFdTSV9QQUdFKTsKLQotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAxOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgQ29tcG9zaXRlIHdzaV9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB3c2lfQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgd3NpX0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgCi0gICAgd3NpX2FwX0xhYmVsXyA9IG5ldyBMYWJlbCh3c2lfQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgd3NpX2FwX0xhYmVsXy5zZXRUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5MQUJFTF9XU0lfQVApOwotICAgIHdzaV9hcF9MYWJlbF8uc2V0VG9vbFRpcFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFdTSV9BUF9MQUJFTCk7Ci0gICAgd3NpX2FwX1R5cGVzXyA9IG5ldyBDb21ibyh3c2lfQ29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZXRUb29sVGlwVGV4dChXc3RXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9QV1NJX0FQX0NPTUJPKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAod3NpX2FwX1R5cGVzXyxJTkZPUE9QX1BXU0lfQVBfQ09NQk9fVFlQRSk7Ci0gICAgCi0gICAgd3NpX2FwX1R5cGVzXy5hZGQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLlNUT1BfTk9OX1dTSSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5hZGQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLldBUk5fTk9OX1dTSSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5hZGQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLklHTk9SRV9OT05fV1NJKTsKLSAgICAKLSAgICB3c2lfYXBfVHlwZXNfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIHdzaV9zc2JwX0xhYmVsXyA9IG5ldyBMYWJlbCh3c2lfQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgd3NpX3NzYnBfTGFiZWxfLnNldFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX1dTSV9TU0JQKTsKLSAgICB3c2lfc3NicF9MYWJlbF8uc2V0VG9vbFRpcFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFdTSV9TU0JQX0xBQkVMKTsKLSAgICB3c2lfc3NicF9UeXBlc18gPSBuZXcgQ29tYm8od3NpX0NvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNldFRvb2xUaXBUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BXU0lfU1NCUF9DT01CTyk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaV9zc2JwX1R5cGVzXyxJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19UWVBFKTsKLSAgICAKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5TVE9QX05PTl9XU0kpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLldBUk5fTk9OX1dTSSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChXc3RXU1VJUGx1Z2luTWVzc2FnZXMuSUdOT1JFX05PTl9XU0kpOwotICAKLSAgICAvLyBXU0RMIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLSAgICB2YWxpZGF0aW9uU2VsZWN0aW9uR3JvdXBfID0gbmV3IEdyb3VwKHdzaV9Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgdmFsaWRhdGlvblNlbGVjdGlvbkdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgdmFsaWRhdGlvblNlbGVjdGlvbkdyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAKLSAgICB3c2RsVmFsaWRhdGlvbkxhYmVsXyA9IG5ldyBUZXh0KHZhbGlkYXRpb25TZWxlY3Rpb25Hcm91cF8sIFNXVC5SRUFEX09OTFkpOwotICAgIHdzZGxWYWxpZGF0aW9uTGFiZWxfLnNldFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX1dTRExWQUwpOwotICAgIHdzZGxWYWxpZGF0aW9uTGFiZWxfLnNldFRvb2xUaXBUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BXU0lfV1NETFZBTF9MQUJFTCk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzZGxWYWxpZGF0aW9uTGFiZWxfLCBJTkZPUE9QX1BXU0lfV1NETFZBTF9MQUJFTCk7Ci0gICAgCi0gICAgdmFsaWRhdGVOb1dzZGxCdXR0b25fID0gbmV3IEJ1dHRvbih2YWxpZGF0aW9uU2VsZWN0aW9uR3JvdXBfLCBTV1QuUkFESU8pOwotICAgIHZhbGlkYXRlTm9Xc2RsQnV0dG9uXy5zZXRUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5MQUJFTF9XU0RMVkFMX05PTkUpOwotICAgIHZhbGlkYXRlTm9Xc2RsQnV0dG9uXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICB2YWxpZGF0ZU5vV3NkbEJ1dHRvbl8uc2V0VG9vbFRpcFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFdTSV9SQURJT19XU0RMVkFMX05PTkUpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh2YWxpZGF0ZU5vV3NkbEJ1dHRvbl8sIElORk9QT1BfUFdTSV9SQURJT19XU0RMVkFMX05PTkUpOwotICAgIAotICAgIHZhbGlkYXRlUmVtb3RlV3NkbEJ1dHRvbl8gPSBuZXcgQnV0dG9uKHZhbGlkYXRpb25TZWxlY3Rpb25Hcm91cF8sIFNXVC5SQURJTyk7Ci0gICAgdmFsaWRhdGVSZW1vdGVXc2RsQnV0dG9uXy5zZXRUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5MQUJFTF9XU0RMVkFMX1JFTU9URSk7Ci0gICAgdmFsaWRhdGVSZW1vdGVXc2RsQnV0dG9uXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICB2YWxpZGF0ZVJlbW90ZVdzZGxCdXR0b25fLnNldFRvb2xUaXBUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BXU0lfUkFESU9fV1NETFZBTF9SRU1PVEUpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh2YWxpZGF0ZVJlbW90ZVdzZGxCdXR0b25fLCBJTkZPUE9QX1BXU0lfUkFESU9fV1NETFZBTF9SRU1PVEUpOwotICAgIAotICAgIHZhbGlkYXRlQWxsV3NkbEJ1dHRvbl8gPSBuZXcgQnV0dG9uKHZhbGlkYXRpb25TZWxlY3Rpb25Hcm91cF8sIFNXVC5SQURJTyk7Ci0gICAgdmFsaWRhdGVBbGxXc2RsQnV0dG9uXy5zZXRUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5MQUJFTF9XU0RMVkFMX0FMTCk7Ci0gICAgdmFsaWRhdGVBbGxXc2RsQnV0dG9uXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICB2YWxpZGF0ZUFsbFdzZGxCdXR0b25fLnNldFRvb2xUaXBUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BXU0lfUkFESU9fV1NETFZBTF9BTEwpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh2YWxpZGF0ZUFsbFdzZGxCdXR0b25fLCBJTkZPUE9QX1BXU0lfUkFESU9fV1NETFZBTF9BTEwpOwotICAgIAotICAgIG5ldyBMYWJlbCh2YWxpZGF0aW9uU2VsZWN0aW9uR3JvdXBfLCBTV1QuTk9ORSk7OwotICAgICAgICAKLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsgICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgIHsgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzCi0gICAqIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpCi0gIHsKLSAgICAvLyBmb3JjZSBXU0kgY29tcGxpYW5jZSBieSBkZWZhdWx0Ci0gICAgCi0gICAgd3NpX3NzYnBfVHlwZXNfLnNlbGVjdCh3c2lfc3NicF9UeXBlc18uaW5kZXhPZihXc3RXU1VJUGx1Z2luTWVzc2FnZXMuV0FSTl9OT05fV1NJKSk7Ci0gICAgaW50IGFwU2VsZWN0aW9uID0gd3NpX2FwX1R5cGVzXy5pbmRleE9mKFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5XQVJOX05PTl9XU0kpOwotICAgIHdzaV9hcF9UeXBlc18uc2VsZWN0KGFwU2VsZWN0aW9uKTsKLSAgICBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOyAgLy8gZG8gbm90IHJlc3RvcmUgc2F2ZWQgU1NCUCBzZXR0aW5nCi0gICAgcHJvY2Vzc0FQU2VsZWN0aW9uKGFwU2VsZWN0aW9uKTsKLQotICAgIFBlcnNpc3RlbnRXU0RMVmFsaWRhdGlvbkNvbnRleHQgd3NkbFZhbGlkYXRpb25Db250ZXh0ID0gV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVmFsaWRhdGlvbkNvbnRleHQoKTsKLSAgICBTdHJpbmcgdmFsaWRhdGlvblNlbGVjdGlvbiA9IHdzZGxWYWxpZGF0aW9uQ29udGV4dC5nZXREZWZhdWx0KCk7Ci0gICAgd3NkbFZhbGlkYXRpb25Db250ZXh0LnVwZGF0ZVdTRExWYWxpZGF0aW9uKHZhbGlkYXRpb25TZWxlY3Rpb24pOwotICAgIHZhbGlkYXRlTm9Xc2RsQnV0dG9uXy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIHZhbGlkYXRlUmVtb3RlV3NkbEJ1dHRvbl8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB2YWxpZGF0ZUFsbFdzZGxCdXR0b25fLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgcHJvY2Vzc1dTRExWYWxpZGF0aW9uU2VsZWN0aW9uKHZhbGlkYXRpb25TZWxlY3Rpb24pOwotICAgIAotICAgIFdTUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V2FpdEZvcldTRExWYWxpZGF0aW9uQ29udGV4dCgpLnNldFdhaXRGb3JXU0RMVmFsaWRhdGlvbihXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdhaXRGb3JXU0RMVmFsaWRhdGlvbkNvbnRleHQoKS5nZXREZWZhdWx0KCkpOwotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLSAgewotICAgIAotCVN0cmluZyBXU0lUZXh0ID0gZ2V0V1NJU2VsZWN0aW9uKFdTUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNlbGVjdCh3c2lfc3NicF9UeXBlc18uaW5kZXhPZihXU0lUZXh0KSk7Ci0gICAgCi0gICAgaW50IGFwU2VsZWN0aW9uID0gd3NpX2FwX1R5cGVzXy5pbmRleE9mKGdldFdTSVNlbGVjdGlvbihXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZWxlY3QoYXBTZWxlY3Rpb24pOwotICAgIHNhdmVkU1NCUFNldHRpbmdfID0gLTE7ICAvLyBkbyBub3QgcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcKLSAgICBwcm9jZXNzQVBTZWxlY3Rpb24oYXBTZWxlY3Rpb24pOwotICAgIAotICAgIFN0cmluZyB2YWxpZGF0aW9uU2VsZWN0aW9uID0gV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVmFsaWRhdGlvbkNvbnRleHQoKS5nZXRQZXJzaXN0ZW50V1NETFZhbGlkYXRpb24oKTsKLSAgICBwcm9jZXNzV1NETFZhbGlkYXRpb25TZWxlY3Rpb24odmFsaWRhdGlvblNlbGVjdGlvbik7Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1dTRExWYWxpZGF0aW9uU2VsZWN0aW9uKFN0cmluZyB2YWxpZGF0aW9uU2VsZWN0aW9uKSB7Ci0KLQkJaWYgKFBlcnNpc3RlbnRXU0RMVmFsaWRhdGlvbkNvbnRleHQuVkFMSURBVEVfTk9fV1NETC5lcXVhbHModmFsaWRhdGlvblNlbGVjdGlvbikpIHsKLQkJCXZhbGlkYXRlTm9Xc2RsQnV0dG9uXy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoUGVyc2lzdGVudFdTRExWYWxpZGF0aW9uQ29udGV4dC5WQUxJREFURV9SRU1PVEVfV1NETC5lcXVhbHModmFsaWRhdGlvblNlbGVjdGlvbikpIHsKLQkJCXZhbGlkYXRlUmVtb3RlV3NkbEJ1dHRvbl8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9IGVsc2UgaWYgKFBlcnNpc3RlbnRXU0RMVmFsaWRhdGlvbkNvbnRleHQuVkFMSURBVEVfQUxMX1dTREwuZXF1YWxzKHZhbGlkYXRpb25TZWxlY3Rpb24pKSB7Ci0JCQl2YWxpZGF0ZUFsbFdzZGxCdXR0b25fLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JfQotCi1wcml2YXRlIFN0cmluZyBnZXRXU0lTZWxlY3Rpb24oUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkKLSAgewotICAgIAotICAgIFN0cmluZyBXU0l2YWx1ZSA9IGNvbnRleHQuZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKTsKLSAgICBTdHJpbmcgV1NJVGV4dCA9IFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5XQVJOX05PTl9XU0k7Ci0gICAgaWYgKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSS5lcXVhbHMoV1NJdmFsdWUpKSB7Ci0JCVdTSVRleHQgPSBXc3RXU1VJUGx1Z2luTWVzc2FnZXMuU1RPUF9OT05fV1NJOwotCX0gZWxzZSBpZiAoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kuZXF1YWxzKFdTSXZhbHVlKSkgewotCQlXU0lUZXh0ID0gV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLklHTk9SRV9OT05fV1NJOwotCX0KLQlyZXR1cm4gV1NJVGV4dDsKLSAgfQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gIAl1cGRhdGVXU0lDb250ZXh0KHdzaV9zc2JwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpLCBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCkpOwotICAJdXBkYXRlV1NJQ29udGV4dCh3c2lfYXBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCksIFdTUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJQVBDb250ZXh0KCkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlV1NJQ29udGV4dChpbnQgc2VsZWN0aW9uSW5kZXgsIFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICAvLyBnZXQgdGhlIHBlcnNpc3RlbnQgY29udGV4dCBmcm9tIHRoZSBwbHVnaW4KLSAgICAKLSAgICBTdHJpbmcgdmFsdWU9bnVsbDsKLSAgICBzd2l0Y2ggKHNlbGVjdGlvbkluZGV4KSB7Ci0gICAgCWNhc2UgMDoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJOwotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMToKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuV0FSTl9OT05fV1NJOwotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMjoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0k7CQkKLSAgICAJCWJyZWFrOwotICAgIH0KLSAgICBjb250ZXh0LnVwZGF0ZVdTSUNvbXBsaWFuY2VzKHZhbHVlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAJCi0gIAlwcm9jZXNzQVBTZWxlY3Rpb24oIHdzaV9hcF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3NBUFNlbGVjdGlvbihpbnQgc2VsZWN0aW9uKSB7Ci0gIAlpZiAoc2VsZWN0aW9uID09IDIpIHsgLy8gcmVzZXQgU1NCUCB0byBkZWZhdWx0IGlmIEFQIGlzIGlnbm9yZQotICAJCXdzaV9zc2JwX1R5cGVzXy5zZXRFbmFibGVkKHRydWUpOwotICAJCWlmIChzYXZlZFNTQlBTZXR0aW5nXyAhPSAtMSkgIHsKLSAgCQkJLy8gcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcsIGlmIGFueQotICAJCQl3c2lfc3NicF9UeXBlc18uc2VsZWN0KHNhdmVkU1NCUFNldHRpbmdfKTsKLSAgCQkJc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsKLSAgCQl9Ci0gIAl9IGVsc2UgeyAvLyBzZXQgU1NCUCB0byBmb2xsb3cgQVAgc2V0dGluZyBpZiBTVE9QIG9yIFdBUk4gY2hvc2VuCi0gIAkJaWYgKHNhdmVkU1NCUFNldHRpbmdfID09IC0xKSAgeyAgLy8gU1NCUCBzZXR0aW5nIG5vdCBzYXZlZAotICAJCQlzYXZlZFNTQlBTZXR0aW5nXyA9IHdzaV9zc2JwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAJCX0KLSAgCQl3c2lfc3NicF9UeXBlc18uc2VsZWN0KHNlbGVjdGlvbik7Ci0gIAkJd3NpX3NzYnBfVHlwZXNfLnNldEVuYWJsZWQoZmFsc2UpOwotICAJCQotICAJfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkKLSAgfQotICAKLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIGFuIGV2ZW50IG9jY3VycyBvbiB0aGUgcGFnZS4gSGFuZGxlcyB0aGUgZXZlbnQgYW5kIHJldmFsaWRhdGVzIHRoZSBwYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGV2ZW50Ci0gICAqICAgICAgICAgIFRoZSBldmVudCB0aGF0IG9jY3VyZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCSAgCi0JICBTdHJpbmcgd3NkbFZhbGRhdGlvblNlbGVjdGlvbiA9IG51bGw7Ci0JICBpZiAodmFsaWRhdGVOb1dzZGxCdXR0b25fID09IGV2ZW50LndpZGdldCkgewotCQkgIHdzZGxWYWxkYXRpb25TZWxlY3Rpb24gPSBQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0LlZBTElEQVRFX05PX1dTREw7Ci0JICB9Ci0JICBlbHNlIGlmICh2YWxpZGF0ZVJlbW90ZVdzZGxCdXR0b25fID09IGV2ZW50LndpZGdldCkgewotCQkgIHdzZGxWYWxkYXRpb25TZWxlY3Rpb24gPSBQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0LlZBTElEQVRFX1JFTU9URV9XU0RMOwotCSAgfQotCSAgZWxzZSBpZiAodmFsaWRhdGVBbGxXc2RsQnV0dG9uXyA9PSBldmVudC53aWRnZXQpIHsKLQkJICB3c2RsVmFsZGF0aW9uU2VsZWN0aW9uID0gUGVyc2lzdGVudFdTRExWYWxpZGF0aW9uQ29udGV4dC5WQUxJREFURV9BTExfV1NETDsKLQkgIH0KLQkgIFdTUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETFZhbGlkYXRpb25Db250ZXh0KCkudXBkYXRlV1NETFZhbGlkYXRpb24od3NkbFZhbGRhdGlvblNlbGVjdGlvbik7Ci0JICAKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3Byb3BlcnRpZXMvV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJvcGVydGllcy9XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmMyMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJvcGVydGllcy9XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNjA3ICAgMTQ0OTc4IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5Xc3RXU1VJUGx1Z2luTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBXU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0lEPSAib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzLldTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCi0gIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDEgZm9yIHRoZSBXUy1JIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9QQUdFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDAiOwotICAvLwotCi0gIHByaXZhdGUgTGFiZWwgd3NpX3NzYnBfTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHdzaV9zc2JwX1R5cGVzXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNCBmb3IgdGhlIFdTLUkgU1NCUCB0eXBlIGNvbWJvIGJveCBvbiB0aGUgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19UWVBFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDQiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDggZm9yIHRoZSBXUy1JIEFQIHR5cGUgY29tYm8gYm94IG9uIHRoZSBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19UWVBFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDgiOwotCi0gIHByaXZhdGUgTGFiZWwgd3NpX2FwX0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21ibyB3c2lfYXBfVHlwZXNfOwotICBwcml2YXRlIGludCBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOwotICAKLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotCQotICAgIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgICAKLSAgICBDb21wb3NpdGUgICBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKCBzdXBlcnBhcmVudCwgU1dULk5PTkUgKTsJCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0KCBsYXlvdXQgKTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChXc3RXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9QV1NJX1BBR0UpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChwYXJlbnQsIElORk9QT1BfUFdTSV9QQUdFKTsKLQotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgQ29tcG9zaXRlIHdzaV9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB3c2lfQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgd3NpX0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgICAgIAotICAgIHdzaV9hcF9MYWJlbF8gPSBuZXcgTGFiZWwod3NpX0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHdzaV9hcF9MYWJlbF8uc2V0VGV4dChXc3RXU1VJUGx1Z2luTWVzc2FnZXMuTEFCRUxfV1NJX0FQKTsKLSAgICB3c2lfYXBfTGFiZWxfLnNldFRvb2xUaXBUZXh0KFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5UT09MVElQX1BXU0lfQVBfTEFCRUwpOwotICAgIHdzaV9hcF9UeXBlc18gPSBuZXcgQ29tYm8od3NpX0NvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHdzaV9hcF9UeXBlc18uc2V0VG9vbFRpcFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFdTSV9BUF9DT01CTyk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaV9hcF9UeXBlc18sSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1RZUEUpOwotICAgIAotICAgIHdzaV9hcF9UeXBlc18uYWRkKFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5TVE9QX05PTl9XU0kpOwotICAgIHdzaV9hcF9UeXBlc18uYWRkKFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5XQVJOX05PTl9XU0kpOwotICAgIHdzaV9hcF9UeXBlc18uYWRkKFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5JR05PUkVfTk9OX1dTSSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5hZGQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLkZPTExPV19XU0lfUFJFRkVSRU5DRSk7Ci0KLSAgICB3c2lfYXBfVHlwZXNfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIHdzaV9zc2JwX0xhYmVsXyA9IG5ldyBMYWJlbCh3c2lfQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgd3NpX3NzYnBfTGFiZWxfLnNldFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLkxBQkVMX1dTSV9TU0JQKTsKLSAgICB3c2lfc3NicF9MYWJlbF8uc2V0VG9vbFRpcFRleHQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLlRPT0xUSVBfUFdTSV9TU0JQX0xBQkVMKTsKLSAgICB3c2lfc3NicF9UeXBlc18gPSBuZXcgQ29tYm8od3NpX0NvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZXRUb29sVGlwVGV4dChXc3RXU1VJUGx1Z2luTWVzc2FnZXMuVE9PTFRJUF9QV1NJX1NTQlBfQ09NQk8pOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaV9zc2JwX1R5cGVzXyxJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19UWVBFKTsKLSAgICAKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKFdzdFdTVUlQbHVnaW5NZXNzYWdlcy5TVE9QX05PTl9XU0kpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLldBUk5fTk9OX1dTSSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChXc3RXU1VJUGx1Z2luTWVzc2FnZXMuSUdOT1JFX05PTl9XU0kpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLkZPTExPV19XU0lfUFJFRkVSRU5DRSk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsgICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIHdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qod3NpX3NzYnBfVHlwZXNfLmluZGV4T2YoV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLkZPTExPV19XU0lfUFJFRkVSRU5DRSkpOwotICAgIGludCBhcFNlbGVjdGlvbiA9IHdzaV9hcF9UeXBlc18uaW5kZXhPZihXc3RXU1VJUGx1Z2luTWVzc2FnZXMuRk9MTE9XX1dTSV9QUkVGRVJFTkNFKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNlbGVjdChhcFNlbGVjdGlvbik7Ci0gICAgc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsgIC8vIGRvIG5vdCByZXN0b3JlIHNhdmVkIFNTQlAgc2V0dGluZwotICAgIHByb2Nlc3NBUFNlbGVjdGlvbihhcFNlbGVjdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0gIAlTdHJpbmcgV1NJVGV4dCA9IGdldFdTSVNlbGVjdGlvbihXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCkpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qod3NpX3NzYnBfVHlwZXNfLmluZGV4T2YoV1NJVGV4dCkpOwotICAgIAotICAgIGludCBhcFNlbGVjdGlvbiA9IHdzaV9hcF9UeXBlc18uaW5kZXhPZihnZXRXU0lTZWxlY3Rpb24oV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lBUENvbnRleHQoKSkpOwotICAgIHdzaV9hcF9UeXBlc18uc2VsZWN0KGFwU2VsZWN0aW9uKTsKLSAgICBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOyAgLy8gZG8gbm90IHJlc3RvcmUgc2F2ZWQgU1NCUCBzZXR0aW5nCi0gICAgcHJvY2Vzc0FQU2VsZWN0aW9uKGFwU2VsZWN0aW9uKTsKLQl9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0V1NJU2VsZWN0aW9uKFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICAKLSAgCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldEVsZW1lbnQoKTsKLSAgCVN0cmluZyBXU0l2YWx1ZSA9IGNvbnRleHQuZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UocHJvamVjdCk7Ci0JU3RyaW5nIFdTSVRleHQgPSBXc3RXU1VJUGx1Z2luTWVzc2FnZXMuRk9MTE9XX1dTSV9QUkVGRVJFTkNFOwotCWlmIChQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kuZXF1YWxzKFdTSXZhbHVlKSkgewotCQlXU0lUZXh0ID0gV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLlNUT1BfTk9OX1dTSTsKLQl9IGVsc2UgaWYgKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSS5lcXVhbHMoV1NJdmFsdWUpKSB7Ci0JCVdTSVRleHQgPSBXc3RXU1VJUGx1Z2luTWVzc2FnZXMuV0FSTl9OT05fV1NJOwotCX0gZWxzZSBpZiAoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kuZXF1YWxzKFdTSXZhbHVlKSkgewotCQlXU0lUZXh0ID0gV3N0V1NVSVBsdWdpbk1lc3NhZ2VzLklHTk9SRV9OT05fV1NJOwotCX0KLQlyZXR1cm4gV1NJVGV4dDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAJdXBkYXRlV1NJQ29udGV4dCh3c2lfc3NicF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSwgV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpKTsKLSAgCXVwZGF0ZVdTSUNvbnRleHQod3NpX2FwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpLCBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdTSUNvbnRleHQoaW50IHNlbGVjdGlvbkluZGV4LCBQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KQotICB7ICAgIAotICAJU3RyaW5nIHZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuRk9MTE9XX1dTSV9QUkVGRVJFTkNFOwotICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBzd2l0Y2ggKHNlbGVjdGlvbkluZGV4KSB7Ci0gICAgCWNhc2UgMDoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJOwotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMToKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuV0FSTl9OT05fV1NJOwotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMjoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0k7CQkKLSAgICAJCWJyZWFrOwotICAgIAljYXNlIDM6Ci0gICAgCQl2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LkZPTExPV19XU0lfUFJFRkVSRU5DRTsJCQotICAgIAkJYnJlYWs7Ci0gICAgfQotICAgIGNvbnRleHQudXBkYXRlUHJvamVjdFdTSUNvbXBsaWFuY2VzKHByb2plY3QsIHZhbHVlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAJCi0gIAlwcm9jZXNzQVBTZWxlY3Rpb24oIHdzaV9hcF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3NBUFNlbGVjdGlvbihpbnQgc2VsZWN0aW9uKSB7Ci0gIAlpZiAoc2VsZWN0aW9uID09IDIpIHsgLy8gcmVzZXQgU1NCUCB0byBkZWZhdWx0IGlmIEFQIGlzIGlnbm9yZQotICAJCXdzaV9zc2JwX1R5cGVzXy5zZXRFbmFibGVkKHRydWUpOwotICAJCWlmIChzYXZlZFNTQlBTZXR0aW5nXyAhPSAtMSkgIHsKLSAgCQkJLy8gcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcsIGlmIGFueQotICAJCQl3c2lfc3NicF9UeXBlc18uc2VsZWN0KHNhdmVkU1NCUFNldHRpbmdfKTsKLSAgCQkJc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsKLSAgCQl9Ci0gIAl9IGVsc2UgaWYgKHNlbGVjdGlvbiA9PSAwIHx8IHNlbGVjdGlvbiA9PSAxKSB7IC8vIHNldCBTU0JQIHRvIGZvbGxvdyBBUCBzZXR0aW5nIGlmIFNUT1Agb3IgV0FSTiBjaG9zZW4KLSAgCQlpZiAoc2F2ZWRTU0JQU2V0dGluZ18gPT0gLTEpICB7ICAvLyBTU0JQIHNldHRpbmcgbm90IHNhdmVkCi0gIAkJCXNhdmVkU1NCUFNldHRpbmdfID0gd3NpX3NzYnBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gIAkJfQotICAJCXdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qoc2VsZWN0aW9uKTsKLSAgCQl3c2lfc3NicF9UeXBlc18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gIAkJCi0gIAl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NydC9JT2JqZWN0U2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NydC9JT2JqZWN0U2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5ZTY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzcnQvSU9iamVjdFNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RTZWxlY3RvciB7Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbCk7Ci0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCk7Ci0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCk7Ci0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwpOwotCXB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTE4OGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd3MuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDk0ZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwMjMzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIEphbiAzMCAxMDozNzo0OSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTU2ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjQwOjEyIEVTVCAyMDA2Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxZDk2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAyLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmNvbW1vbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXg7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9uaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0O3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLndzZGw0ajtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDEuNS4wKSIsCi0gb3JnLmFwYWNoZS53c2lsNGo7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW47YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvUlQuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9SVC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhYTRmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9SVC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9SZWdpc3RyeU1vZGVsMi9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL1JlZ2lzdHJ5TW9kZWwyLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9SZWdpc3RyeU1vZGVsMi5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9IlJlZ2lzdHJ5TW9kZWwyIiBydW50aW1lSmFyPSJ0cnVlIiBtb2RlbE5hbWU9IlJUIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5wcm92aWRlci5SVEVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5wcmVzZW50YXRpb24uUlRFZGl0b3JQbHVnaW4iCi0gICAgcnVudGltZUNvbXBhdGliaWxpdHk9ImZhbHNlIj4KLSAgPGZvcmVpZ25Nb2RlbD5JbmRleC54c2Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5SZWdpc3RyeS54c2Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5VRERJUmVnaXN0cnkueHNkPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+VGF4b25vbXkueHNkPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlJUSW5kZXgiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwIgotICAgICAgcmVzb3VyY2U9IlhNTCIgZWNvcmVQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0Rlc2NyaXB0aW9uL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vRGVzY3JpcHRpb24vbGFuZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguZWNvcmUjLy9Eb2N1bWVudFJvb3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vRG9jdW1lbnRSb290L21peGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vRG9jdW1lbnRSb290L3hNTE5TUHJlZml4TWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vRG9jdW1lbnRSb290L3hTSVNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vRG9jdW1lbnRSb290L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vRG9jdW1lbnRSb290L2luZGV4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vRG9jdW1lbnRSb290L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vSW5kZXgiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguZWNvcmUjLy9JbmRleC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0luZGV4L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0luZGV4L3JlZ2lzdHJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0luZGV4L3RheG9ub215Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL05hbWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL05hbWUvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguZWNvcmUjLy9OYW1lL2xhbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlRheG9ub215IiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMCIKLSAgICAgIHJlc291cmNlPSJYTUwiIGVjb3JlUGFja2FnZT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vQ2F0ZWdvcnkvbmxuYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9DYXRlZ29yeS9jYXRlZ29yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9DYXRlZ29yeS9jb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0NhdGVnb3J5L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0RvY3VtZW50Um9vdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vRG9jdW1lbnRSb290L21peGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0RvY3VtZW50Um9vdC94TUxOU1ByZWZpeE1hcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9Eb2N1bWVudFJvb3QveFNJU2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vRG9jdW1lbnRSb290L2NhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0RvY3VtZW50Um9vdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0RvY3VtZW50Um9vdC90YXhvbm9teSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vTmFtZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL05hbWUvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vTmFtZS9sYW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9UYXhvbm9teSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9UYXhvbm9teS9ubG5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215L2NhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215L2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215L2xvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vVGF4b25vbXkvcmVmIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215L3Rtb2RlbEtleSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iUmVnaXN0cnkiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwIgotICAgICAgcmVzb3VyY2U9IlhNTCIgZWNvcmVQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9EZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0Rlc2NyaXB0aW9uL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0Rlc2NyaXB0aW9uL2xhbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vRG9jdW1lbnRSb290L21peGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC94TUxOU1ByZWZpeE1hcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9Eb2N1bWVudFJvb3QveFNJU2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vRG9jdW1lbnRSb290L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC9yZWdpc3RyeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vTmFtZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL05hbWUvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vTmFtZS9sYW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9SZWdpc3RyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9SZWdpc3RyeS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9SZWdpc3RyeS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9SZWdpc3RyeS9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9SZWdpc3RyeS9sb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9SZWdpc3RyeS9yZWYiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVERElSZWdpc3RyeSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAiCi0gICAgICByZXNvdXJjZT0iWE1MIiBlY29yZVBhY2thZ2U9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmVjb3JlIy8vRG9jdW1lbnRSb290Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmVjb3JlIy8vRG9jdW1lbnRSb290L21peGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9Eb2N1bWVudFJvb3QveE1MTlNQcmVmaXhNYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC94U0lTY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmVjb3JlIy8vRG9jdW1lbnRSb290L3RheG9ub21pZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC91ZGRpUmVnaXN0cnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9UYXhvbm9taWVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9UYXhvbm9taWVzL3RheG9ub215Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmVjb3JlIy8vVURESVJlZ2lzdHJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvL1VERElSZWdpc3RyeS92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvZGlzY292ZXJ5VVJMIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvcHVibGljYXRpb25VUkwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvL1VERElSZWdpc3RyeS9zZWN1cmVkRGlzY292ZXJ5VVJMIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvc2VjdXJlZFB1YmxpY2F0aW9uVVJMIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvZGVmYXVsdExvZ2luIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvZGVmYXVsdFBhc3N3b3JkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmVjb3JlIy8vVURESVJlZ2lzdHJ5L3RheG9ub21pZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvUlQueHNkMmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvUlQueHNkMmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmRhZTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL1JULnhzZDJlY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgotPHhzZDJlY29yZTpYU0QyRWNvcmVNYXBwaW5nUm9vdCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNkMmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL1hTRDJFY29yZSIgaW5wdXRzPSJJbmRleC54c2QjLyBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QjLyBUYXhvbm9teS54c2QjLyBSZWdpc3RyeS54c2QjLyBVRERJUmVnaXN0cnkueHNkIy8iCi0gICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLyBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguZWNvcmUjLyBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvIgotICAgIHRvcFRvQm90dG9tPSJ0cnVlIj4KLSAgPG5lc3RlZCBpbnB1dHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCMvL2Jhc2U7WFNEQXR0cmlidXRlRGVjbGFyYXRpb249MiIKLSAgICAgIG91dHB1dHM9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSMvL1hNTE5hbWVzcGFjZURvY3VtZW50Um9vdC9iYXNlIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QjLy9pZDtYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbj0zIiBvdXRwdXRzPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UjLy9YTUxOYW1lc3BhY2VEb2N1bWVudFJvb3QvaWQiLz4KLSAgPG5lc3RlZCBpbnB1dHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCMvL2xhbmc7WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIG91dHB1dHM9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSMvL1hNTE5hbWVzcGFjZURvY3VtZW50Um9vdC9sYW5nIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QjLy9sYW5nO1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uL1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotICAgICAgb3V0cHV0cz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vTGFuZ3VhZ2UiLz4KLSAgPG5lc3RlZCBpbnB1dHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCMvL3NwYWNlO1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uPTEiCi0gICAgICBvdXRwdXRzPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UjLy9YTUxOYW1lc3BhY2VEb2N1bWVudFJvb3Qvc3BhY2UiLz4KLSAgPG5lc3RlZCBpbnB1dHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCMvL3NwYWNlO1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uPTEvWFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0gICAgICBvdXRwdXRzPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UjLy9TcGFjZVR5cGUiLz4KLSAgPG5lc3RlZCBpbnB1dHM9ImJ1bmRsZWVudHJ5Oi8vMTgzOS9jYWNoZS93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLnhzZCMvL3N0cmluZztYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbj03IgotICAgICAgb3V0cHV0cz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJUYXhvbm9teS54c2QjLy9OYW1lO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0yIiBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vTmFtZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlRheG9ub215LnhzZCMvL05hbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTIvWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vTmFtZS9sYW5nIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iVGF4b25vbXkueHNkIy8vQ2F0ZWdvcnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEiIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9DYXRlZ29yeSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlRheG9ub215LnhzZCMvL0NhdGVnb3J5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9DYXRlZ29yeS9ubG5hbWUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iVGF4b25vbXkueHNkIy8vQ2F0ZWdvcnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vQ2F0ZWdvcnkvY2F0ZWdvcnkiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iVGF4b25vbXkueHNkIy8vQ2F0ZWdvcnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlPTEiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9DYXRlZ29yeS9jb2RlIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlRheG9ub215LnhzZCMvL0NhdGVnb3J5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xL1hTREF0dHJpYnV0ZVVzZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0NhdGVnb3J5L25hbWUiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJUYXhvbm9teS54c2QjLy9jYXRlZ29yeTtYU0RFbGVtZW50RGVjbGFyYXRpb249MSIgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0RvY3VtZW50Um9vdC9jYXRlZ29yeSIvPgotICA8bmVzdGVkIGlucHV0cz0iUmVnaXN0cnkueHNkIy8vRGVzY3JpcHRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTIiIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9EZXNjcmlwdGlvbiI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlJlZ2lzdHJ5LnhzZCMvL0Rlc2NyaXB0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0yL1hTREF0dHJpYnV0ZVVzZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0Rlc2NyaXB0aW9uL2xhbmciLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJSZWdpc3RyeS54c2QjLy9kZXNjcmlwdGlvbjtYU0RFbGVtZW50RGVjbGFyYXRpb249MiIgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC9kZXNjcmlwdGlvbiIvPgotICA8bmVzdGVkIGlucHV0cz0iSW5kZXgueHNkIy8vRGVzY3JpcHRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTIiIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0Rlc2NyaXB0aW9uIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iSW5kZXgueHNkIy8vRGVzY3JpcHRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTIvWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguZWNvcmUjLy9EZXNjcmlwdGlvbi9sYW5nIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iSW5kZXgueHNkIy8vZGVzY3JpcHRpb247WFNERWxlbWVudERlY2xhcmF0aW9uPTIiIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0RvY3VtZW50Um9vdC9kZXNjcmlwdGlvbiIvPgotICA8bmVzdGVkIGlucHV0cz0iSW5kZXgueHNkIy8vTmFtZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MSIgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vTmFtZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IkluZGV4LnhzZCMvL05hbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlIiBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguZWNvcmUjLy9OYW1lL2xhbmciLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJSZWdpc3RyeS54c2QjLy9OYW1lO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xIiBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vTmFtZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlJlZ2lzdHJ5LnhzZCMvL05hbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vTmFtZS9sYW5nIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iYnVuZGxlZW50cnk6Ly8xODM5L2NhY2hlL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEueHNkIy8vYW55VVJJO1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uPTIzIgotICAgICAgb3V0cHV0cz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQW55VVJJIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJSZWdpc3RyeS54c2QjLy9SZWdpc3RyeTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9SZWdpc3RyeSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlJlZ2lzdHJ5LnhzZCMvL1JlZ2lzdHJ5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vUmVnaXN0cnkvbmFtZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJSZWdpc3RyeS54c2QjLy9SZWdpc3RyeTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vUmVnaXN0cnkvZGVzY3JpcHRpb24iLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iUmVnaXN0cnkueHNkIy8vUmVnaXN0cnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTREF0dHJpYnV0ZVVzZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL1JlZ2lzdHJ5L2lkIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlJlZ2lzdHJ5LnhzZCMvL1JlZ2lzdHJ5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2U9MiIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL1JlZ2lzdHJ5L2xvY2F0aW9uIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlJlZ2lzdHJ5LnhzZCMvL1JlZ2lzdHJ5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2U9MSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL1JlZ2lzdHJ5L3JlZiIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9IlRheG9ub215LnhzZCMvL1RheG9ub215O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215Ij4KLSAgICA8bmVzdGVkIGlucHV0cz0iVGF4b25vbXkueHNkIy8vVGF4b25vbXk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9UYXhvbm9teS9ubG5hbWUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iVGF4b25vbXkueHNkIy8vVGF4b25vbXk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215L2NhdGVnb3J5Ii8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlRheG9ub215LnhzZCMvL1RheG9ub215O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9UYXhvbm9teS9pZCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJUYXhvbm9teS54c2QjLy9UYXhvbm9teTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlPTIiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9UYXhvbm9teS9sb2NhdGlvbiIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJUYXhvbm9teS54c2QjLy9UYXhvbm9teTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlPTMiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9UYXhvbm9teS9uYW1lIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlRheG9ub215LnhzZCMvL1RheG9ub215O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2U9MSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215L3JlZiIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJUYXhvbm9teS54c2QjLy9UYXhvbm9teTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlPTQiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUjLy9UYXhvbm9teS90bW9kZWxLZXkiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJJbmRleC54c2QjLy9JbmRleDtYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0luZGV4Ij4KLSAgICA8bmVzdGVkIGlucHV0cz0iSW5kZXgueHNkIy8vSW5kZXg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0luZGV4L25hbWUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iSW5kZXgueHNkIy8vSW5kZXg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vSW5kZXgvZGVzY3JpcHRpb24iLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iSW5kZXgueHNkIy8vSW5kZXg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MiIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vSW5kZXgvcmVnaXN0cnkiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iSW5kZXgueHNkIy8vSW5kZXg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MyIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIy8vSW5kZXgvdGF4b25vbXkiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJJbmRleC54c2QjLy9pbmRleDtYU0RFbGVtZW50RGVjbGFyYXRpb24iIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZSMvL0RvY3VtZW50Um9vdC9pbmRleCIvPgotICA8bmVzdGVkIGlucHV0cz0iUmVnaXN0cnkueHNkIy8vbmFtZTtYU0RFbGVtZW50RGVjbGFyYXRpb249MSIgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC9uYW1lIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJJbmRleC54c2QjLy9uYW1lO1hTREVsZW1lbnREZWNsYXJhdGlvbj0xIiBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguZWNvcmUjLy9Eb2N1bWVudFJvb3QvbmFtZSIvPgotICA8bmVzdGVkIGlucHV0cz0iVGF4b25vbXkueHNkIy8vbmFtZTtYU0RFbGVtZW50RGVjbGFyYXRpb249MiIgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0RvY3VtZW50Um9vdC9uYW1lIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJSZWdpc3RyeS54c2QjLy9yZWdpc3RyeTtYU0RFbGVtZW50RGVjbGFyYXRpb24iIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUjLy9Eb2N1bWVudFJvb3QvcmVnaXN0cnkiLz4KLSAgPG5lc3RlZCBpbnB1dHM9IlRheG9ub215LnhzZCMvL3RheG9ub215O1hTREVsZW1lbnREZWNsYXJhdGlvbiIgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL0RvY3VtZW50Um9vdC90YXhvbm9teSIvPgotICA8bmVzdGVkIGlucHV0cz0iVURESVJlZ2lzdHJ5LnhzZCMvL1RheG9ub21pZXM7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEiIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmVjb3JlIy8vVGF4b25vbWllcyI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy9UYXhvbm9taWVzO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmVjb3JlIy8vVGF4b25vbWllcy90YXhvbm9teSIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy90YXhvbm9taWVzO1hTREVsZW1lbnREZWNsYXJhdGlvbj0xIiBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC90YXhvbm9taWVzIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJVRERJUmVnaXN0cnkueHNkIy8vVURESVJlZ2lzdHJ5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJVRERJUmVnaXN0cnkueHNkIy8vVURESVJlZ2lzdHJ5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvL1VERElSZWdpc3RyeS92ZXJzaW9uIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy9VRERJUmVnaXN0cnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvZGlzY292ZXJ5VVJMIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy9VRERJUmVnaXN0cnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MiIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvcHVibGljYXRpb25VUkwiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iVURESVJlZ2lzdHJ5LnhzZCMvL1VERElSZWdpc3RyeTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvL1VERElSZWdpc3RyeS9zZWN1cmVkRGlzY292ZXJ5VVJMIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy9VRERJUmVnaXN0cnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9NCIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvc2VjdXJlZFB1YmxpY2F0aW9uVVJMIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy9VRERJUmVnaXN0cnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9NSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvZGVmYXVsdExvZ2luIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy9VRERJUmVnaXN0cnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9NiIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvZGVmYXVsdFBhc3N3b3JkIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy9VRERJUmVnaXN0cnk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9NyIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUjLy9VRERJUmVnaXN0cnkvdGF4b25vbWllcyIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9IlVERElSZWdpc3RyeS54c2QjLy91ZGRpUmVnaXN0cnk7WFNERWxlbWVudERlY2xhcmF0aW9uIiBvdXRwdXRzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZSMvL0RvY3VtZW50Um9vdC91ZGRpUmVnaXN0cnkiLz4KLTwveHNkMmVjb3JlOlhTRDJFY29yZU1hcHBpbmdSb290PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWFjNTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgam1lcmdlci8KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2UzNWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3MiPgotICAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+Ci0gICA8L2NvbXBvbmVudC1kZXBlbmRzPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmF4aXMiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS53c2lsNGoiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLnVkZGk0aiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2ptZXJnZXIvbWVyZ2UueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvam1lcmdlci9tZXJnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDMyYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvam1lcmdlci9tZXJnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBNZXJnZSBydWxlcyB1c2VkIGJ5IEpNZXJnZXIgLS0+Ci08bWVyZ2U6b3B0aW9ucyAKLQl4bWxuczptZXJnZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZWNsaXBzZS9lbWYvY29kZWdlbi9qbWVyZ2UvT3B0aW9ucyI+Ci0JPG1lcmdlOnB1bGwgCi0JCXNvdXJjZUdldD0iTWV0aG9kL2dldFJldHVyblR5cGUiIAotCQl0YXJnZXRQdXQ9Ik1ldGhvZC9zZXRSZXR1cm5UeXBlIi8+Ci0JPG1lcmdlOnB1bGwgCi0JCXNvdXJjZUdldD0iTWV0aG9kL2dldEV4Y2VwdGlvbnMiIAotCQl0YXJnZXRQdXQ9Ik1ldGhvZC9hZGRFeGNlcHRpb24iLz4KLTwvbWVyZ2U6b3B0aW9ucz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL21vZGVsL0luZGV4LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL21vZGVsL0luZGV4LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjZjU0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9tb2RlbC9JbmRleC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEKLXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi14bWxuczpydGk9Imh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgiCi14bWxuczpyZWc9Imh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5IgoteG1sbnM6dGF4PSJodHRwOi8vZWNsaXBzZS5vcmcvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teSIKLXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleCI+Ci0KLQk8eHNkOmltcG9ydAotCW5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotCXNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KLQotCTx4c2Q6aW1wb3J0Ci0JbmFtZXNwYWNlPSJodHRwOi8vZWNsaXBzZS5vcmcvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeSIKLQlzY2hlbWFMb2NhdGlvbj0iLi9SZWdpc3RyeS54c2QiLz4KLQotCTx4c2Q6aW1wb3J0Ci0JbmFtZXNwYWNlPSJodHRwOi8vZWNsaXBzZS5vcmcvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teSIKLQlzY2hlbWFMb2NhdGlvbj0iLi9UYXhvbm9teS54c2QiLz4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbmRleCIgdHlwZT0icnRpOkluZGV4Ii8+Ci0JCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJbmRleCI+Ci0JCTx4c2Q6c2VxdWVuY2U+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0icnRpOk5hbWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0icnRpOkRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgcmVmPSJyZWc6cmVnaXN0cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCByZWY9InRheDp0YXhvbm9teSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJydGk6TmFtZSIvPgotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lIj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJydGk6RGVzY3JpcHRpb24iLz4KLQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRpb24iPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9tb2RlbC9SZWdpc3RyeS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9tb2RlbC9SZWdpc3RyeS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZTE5NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvbW9kZWwvUmVnaXN0cnkueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hCi14bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgoteG1sbnM6cmVnPSJodHRwOi8vZWNsaXBzZS5vcmcvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeSIKLXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkiPgotCi0JPHhzZDppbXBvcnQKLQluYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLQlzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0icmVnaXN0cnkiIHR5cGU9InJlZzpSZWdpc3RyeSIvPgotCQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVnaXN0cnkiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InJlZzpOYW1lIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InJlZzpEZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDphbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmIiB0eXBlPSJ4c2Q6YW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJ4c2Q6YW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0icmVnOk5hbWUiLz4KLQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSI+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0icmVnOkRlc2NyaXB0aW9uIi8+Ci0KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0aW9uIj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvbW9kZWwvVGF4b25vbXkueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvbW9kZWwvVGF4b25vbXkueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjU2YWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL21vZGVsL1RheG9ub215LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYQoteG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLXhtbG5zOnRheD0iaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkiCi10YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215Ij4KLQotCTx4c2Q6aW1wb3J0Ci0JbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0Jc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi0JPHhzZDplbGVtZW50IG5hbWU9InRheG9ub215IiB0eXBlPSJ0YXg6VGF4b25vbXkiLz4KLQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGF4b25vbXkiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Im5sbmFtZSIgdHlwZT0idGF4Ok5hbWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSIgdHlwZT0idGF4OkNhdGVnb3J5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmFueVVSSSIgdXNlPSJvcHRpb25hbCIvPgotCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzZDphbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9InhzZDphbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0bW9kZWxLZXkiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSIgdHlwZT0idGF4OkNhdGVnb3J5Ii8+Ci0KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhdGVnb3J5Ij4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJubG5hbWUiIHR5cGU9InRheDpOYW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InRheDpDYXRlZ29yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0idGF4Ok5hbWUiLz4KLQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSI+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL21vZGVsL1VERElSZWdpc3RyeS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9tb2RlbC9VRERJUmVnaXN0cnkueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzM2MjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL21vZGVsL1VERElSZWdpc3RyeS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEKLXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi14bWxuczp1cmc9Imh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeSIKLXhtbG5zOnJlZz0iaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkiCi14bWxuczp0YXg9Imh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215IgotdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZWNsaXBzZS5vcmcvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkiPgotCi0JPHhzZDppbXBvcnQKLQluYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLQlzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0JCi0JPHhzZDppbXBvcnQKLQluYW1lc3BhY2U9Imh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5IgotCXNjaGVtYUxvY2F0aW9uPSIuL1JlZ2lzdHJ5LnhzZCIvPgotCi0JPHhzZDppbXBvcnQKLQluYW1lc3BhY2U9Imh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215IgotCXNjaGVtYUxvY2F0aW9uPSIuL1RheG9ub215LnhzZCIvPgotCi0JPHhzZDplbGVtZW50IG5hbWU9InVkZGlSZWdpc3RyeSIgdHlwZT0idXJnOlVERElSZWdpc3RyeSIvPgotCQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVURESVJlZ2lzdHJ5Ij4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlZzpSZWdpc3RyeSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY292ZXJ5VVJMIiB0eXBlPSJ4c2Q6YW55VVJJIiBtaW5PY2N1cnM9IjEiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InB1YmxpY2F0aW9uVVJMIiB0eXBlPSJ4c2Q6YW55VVJJIiBtaW5PY2N1cnM9IjEiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InNlY3VyZWREaXNjb3ZlcnlVUkwiIHR5cGU9InhzZDphbnlVUkkiIG1pbk9jY3Vycz0iMSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJlZFB1YmxpY2F0aW9uVVJMIiB0eXBlPSJ4c2Q6YW55VVJJIiBtaW5PY2N1cnM9IjEiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHRMb2dpbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIxIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0UGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idGF4b25vbWllcyIgdHlwZT0idXJnOlRheG9ub21pZXMiIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQkKLQk8eHNkOmVsZW1lbnQgbmFtZT0idGF4b25vbWllcyIgdHlwZT0idXJnOlRheG9ub21pZXMiLz4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRheG9ub21pZXMiPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDplbGVtZW50IHJlZj0idGF4OnRheG9ub215IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL29yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDQyZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJyZWdpc3RyeSIKLSAgICBuc1VSST0iaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkiIG5zUHJlZml4PSJyZWdpc3RyeSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7ICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybSYjeEQ7JiN4QTsgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkJiN4RDsmI3hBOyAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUmI3hEOyYjeEE7ICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZCYjeEQ7JiN4QTsgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsJiN4RDsmI3hBOyAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlJiN4RDsmI3hBOyAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkmI3hEOyYjeEE7ICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQmI3hEOyYjeEE7ICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCYjeEQ7JiN4QTsgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4mI3hEOyYjeEE7ICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sJiN4RDsmI3hBOyAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uJiN4RDsmI3hBOyAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQmI3hEOyYjeEE7ICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mJiN4RDsmI3hBOyAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkJiN4RDsmI3hBOyAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyAgJiN4RDsmI3hBOyAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSYjeEQ7JiN4QTsgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZyYjeEQ7JiN4QTsgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzJiN4RDsmI3hBOyAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzJiN4RDsmI3hBOyAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAmI3hEOyYjeEE7ICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5ICYjeEQ7JiN4QTsgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kICYjeEQ7JiN4QTsgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24mI3hEOyYjeEE7ICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMCYjeEQ7JiN4QTsgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZSYjeEQ7JiN4QTsgICAgICAgICAgICAgeG1sOkZhdGhlciYjeEQ7JiN4QTsgICYjeEQ7JiN4QTtUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cCYjeEQ7JiN4QTsgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkmI3hEOyYjeEE7ICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nLCB4bWw6c3BhY2Ugb3IgeG1sOmlkJiN4RDsmI3hBOyAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEmI3hEOyYjeEE7ICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czomI3hEOyYjeEE7ICAgICAgICAmYW1wO2x0O3NjaGVtYSAuIC4gLiZhbXA7Z3Q7JiN4RDsmI3hBOyAgICAgICAgIC4gLiAuJiN4RDsmI3hBOyAgICAgICAgICZhbXA7bHQ7aW1wb3J0IG5hbWVzcGFjZT0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UmcXVvdDsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QmcXVvdDsvJmFtcDtndDsmI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcyYjeEQ7JiN4QTsgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmFtcDtsdDt0eXBlIC4gLiAuJmFtcDtndDsmI3hEOyYjeEE7ICAgICAgICAgLiAuIC4mI3hEOyYjeEE7ICAgICAgICAgJmFtcDtsdDthdHRyaWJ1dGVHcm91cCByZWY9JnF1b3Q7eG1sOnNwZWNpYWxBdHRycyZxdW90Oy8mYW1wO2d0OyYjeEQ7JiN4QTsgJiN4RDsmI3hBOyAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZSYjeEQ7JiN4QTsgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMmI3hEOyYjeEE7SW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZyYjeEQ7JiN4QTsgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuJiN4RDsmI3hBOyAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0JiN4RDsmI3hBOyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4mI3hEOyYjeEE7ICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwmI3hEOyYjeEE7ICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYSYjeEQ7JiN4QTsgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwmI3hEOyYjeEE7ICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UmI3hEOyYjeEE7ICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0JiN4RDsmI3hBOyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuJiN4RDsmI3hBOyAgIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6MCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFuZyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9MYW5ndWFnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxhbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9jdW1lbnRSb290Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0ibWl4ZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWl4ZWQiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50V2lsZGNhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iOm1peGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhNTE5TUHJlZml4TWFwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhtbG5zOnByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4U0lTY2hlbWFMb2NhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4c2k6c2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lIiB1cHBlckJvdW5kPSItMiIgZVR5cGU9IiMvL05hbWUiCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZ2lzdHJ5IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL1JlZ2lzdHJ5IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InJlZ2lzdHJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6MCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFuZyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9MYW5ndWFnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxhbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVnaXN0cnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVnaXN0cnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTmFtZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0FueVVSSSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0FueVVSSSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxvY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZiIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9BbnlVUkkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJyZWYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA5NWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL29yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJydGluZGV4IgotICAgIG5zVVJJPSJodHRwOi8vZWNsaXBzZS5vcmcvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4IiBuc1ByZWZpeD0icnRpbmRleCI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7ICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybSYjeEQ7JiN4QTsgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkJiN4RDsmI3hBOyAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUmI3hEOyYjeEE7ICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZCYjeEQ7JiN4QTsgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsJiN4RDsmI3hBOyAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlJiN4RDsmI3hBOyAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkmI3hEOyYjeEE7ICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQmI3hEOyYjeEE7ICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCYjeEQ7JiN4QTsgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4mI3hEOyYjeEE7ICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sJiN4RDsmI3hBOyAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uJiN4RDsmI3hBOyAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQmI3hEOyYjeEE7ICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mJiN4RDsmI3hBOyAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkJiN4RDsmI3hBOyAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyAgJiN4RDsmI3hBOyAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSYjeEQ7JiN4QTsgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZyYjeEQ7JiN4QTsgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzJiN4RDsmI3hBOyAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzJiN4RDsmI3hBOyAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAmI3hEOyYjeEE7ICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5ICYjeEQ7JiN4QTsgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kICYjeEQ7JiN4QTsgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24mI3hEOyYjeEE7ICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMCYjeEQ7JiN4QTsgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZSYjeEQ7JiN4QTsgICAgICAgICAgICAgeG1sOkZhdGhlciYjeEQ7JiN4QTsgICYjeEQ7JiN4QTtUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cCYjeEQ7JiN4QTsgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkmI3hEOyYjeEE7ICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nLCB4bWw6c3BhY2Ugb3IgeG1sOmlkJiN4RDsmI3hBOyAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEmI3hEOyYjeEE7ICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czomI3hEOyYjeEE7ICAgICAgICAmYW1wO2x0O3NjaGVtYSAuIC4gLiZhbXA7Z3Q7JiN4RDsmI3hBOyAgICAgICAgIC4gLiAuJiN4RDsmI3hBOyAgICAgICAgICZhbXA7bHQ7aW1wb3J0IG5hbWVzcGFjZT0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UmcXVvdDsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QmcXVvdDsvJmFtcDtndDsmI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcyYjeEQ7JiN4QTsgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmFtcDtsdDt0eXBlIC4gLiAuJmFtcDtndDsmI3hEOyYjeEE7ICAgICAgICAgLiAuIC4mI3hEOyYjeEE7ICAgICAgICAgJmFtcDtsdDthdHRyaWJ1dGVHcm91cCByZWY9JnF1b3Q7eG1sOnNwZWNpYWxBdHRycyZxdW90Oy8mYW1wO2d0OyYjeEQ7JiN4QTsgJiN4RDsmI3hBOyAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZSYjeEQ7JiN4QTsgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMmI3hEOyYjeEE7SW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZyYjeEQ7JiN4QTsgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuJiN4RDsmI3hBOyAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0JiN4RDsmI3hBOyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4mI3hEOyYjeEE7ICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwmI3hEOyYjeEE7ICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYSYjeEQ7JiN4QTsgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwmI3hEOyYjeEE7ICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UmI3hEOyYjeEE7ICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0JiN4RDsmI3hBOyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuJiN4RDsmI3hBOyAgIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6MCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFuZyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9MYW5ndWFnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxhbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9jdW1lbnRSb290Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0ibWl4ZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWl4ZWQiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50V2lsZGNhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iOm1peGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhNTE5TUHJlZml4TWFwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhtbG5zOnByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4U0lTY2hlbWFMb2NhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4c2k6c2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleCIgdXBwZXJCb3VuZD0iLTIiCi0gICAgICAgIGVUeXBlPSIjLy9JbmRleCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpbmRleCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWUiIHVwcGVyQm91bmQ9Ii0yIiBlVHlwZT0iIy8vTmFtZSIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5kZXgiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5kZXgiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTmFtZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZ2lzdHJ5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vUmVnaXN0cnkiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icmVnaXN0cnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSJodHRwOi8vZWNsaXBzZS5vcmcvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXhvbm9teSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSMvL1RheG9ub215IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InRheG9ub215Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6MCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFuZyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9MYW5ndWFnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxhbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL29yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODg5YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ0YXhvbm9teSIKLSAgICBuc1VSST0iaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkiIG5zUHJlZml4PSJ0YXhvbm9teSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7ICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybSYjeEQ7JiN4QTsgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkJiN4RDsmI3hBOyAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUmI3hEOyYjeEE7ICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZCYjeEQ7JiN4QTsgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsJiN4RDsmI3hBOyAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlJiN4RDsmI3hBOyAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkmI3hEOyYjeEE7ICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQmI3hEOyYjeEE7ICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCYjeEQ7JiN4QTsgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4mI3hEOyYjeEE7ICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sJiN4RDsmI3hBOyAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uJiN4RDsmI3hBOyAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQmI3hEOyYjeEE7ICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mJiN4RDsmI3hBOyAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkJiN4RDsmI3hBOyAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyAgJiN4RDsmI3hBOyAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSYjeEQ7JiN4QTsgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZyYjeEQ7JiN4QTsgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzJiN4RDsmI3hBOyAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzJiN4RDsmI3hBOyAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAmI3hEOyYjeEE7ICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5ICYjeEQ7JiN4QTsgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kICYjeEQ7JiN4QTsgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24mI3hEOyYjeEE7ICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMCYjeEQ7JiN4QTsgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZSYjeEQ7JiN4QTsgICAgICAgICAgICAgeG1sOkZhdGhlciYjeEQ7JiN4QTsgICYjeEQ7JiN4QTtUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cCYjeEQ7JiN4QTsgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkmI3hEOyYjeEE7ICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nLCB4bWw6c3BhY2Ugb3IgeG1sOmlkJiN4RDsmI3hBOyAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEmI3hEOyYjeEE7ICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czomI3hEOyYjeEE7ICAgICAgICAmYW1wO2x0O3NjaGVtYSAuIC4gLiZhbXA7Z3Q7JiN4RDsmI3hBOyAgICAgICAgIC4gLiAuJiN4RDsmI3hBOyAgICAgICAgICZhbXA7bHQ7aW1wb3J0IG5hbWVzcGFjZT0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UmcXVvdDsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QmcXVvdDsvJmFtcDtndDsmI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcyYjeEQ7JiN4QTsgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmFtcDtsdDt0eXBlIC4gLiAuJmFtcDtndDsmI3hEOyYjeEE7ICAgICAgICAgLiAuIC4mI3hEOyYjeEE7ICAgICAgICAgJmFtcDtsdDthdHRyaWJ1dGVHcm91cCByZWY9JnF1b3Q7eG1sOnNwZWNpYWxBdHRycyZxdW90Oy8mYW1wO2d0OyYjeEQ7JiN4QTsgJiN4RDsmI3hBOyAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZSYjeEQ7JiN4QTsgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMmI3hEOyYjeEE7SW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZyYjeEQ7JiN4QTsgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuJiN4RDsmI3hBOyAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0JiN4RDsmI3hBOyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4mI3hEOyYjeEE7ICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwmI3hEOyYjeEE7ICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYSYjeEQ7JiN4QTsgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwmI3hEOyYjeEE7ICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UmI3hEOyYjeEE7ICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0JiN4RDsmI3hBOyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuJiN4RDsmI3hBOyAgIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3J5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJubG5hbWUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTmFtZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJubG5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2F0ZWdvcnkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ2F0ZWdvcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2F0ZWdvcnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29kZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjb2RlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYXRlZ29yeSIgdXBwZXJCb3VuZD0iLTIiCi0gICAgICAgIGVUeXBlPSIjLy9DYXRlZ29yeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWUiIHVwcGVyQm91bmQ9Ii0yIiBlVHlwZT0iIy8vTmFtZSIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGF4b25vbXkiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vVGF4b25vbXkiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idGF4b25vbXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjowIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYW5nIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0xhbmd1YWdlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibGFuZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXhvbm9teSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmxuYW1lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL05hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmxuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3J5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NhdGVnb3J5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNhdGVnb3J5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0FueVVSSSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0FueVVSSSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxvY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWYiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQW55VVJJIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icmVmIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRtb2RlbEtleSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ0bW9kZWxLZXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuZWNvcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjZTYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9vcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ1ZGRpcmVnaXN0cnkiCi0gICAgbnNVUkk9Imh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeSIgbnNQcmVmaXg9InVkZGlyZWdpc3RyeSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7ICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybSYjeEQ7JiN4QTsgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkJiN4RDsmI3hBOyAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUmI3hEOyYjeEE7ICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZCYjeEQ7JiN4QTsgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsJiN4RDsmI3hBOyAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlJiN4RDsmI3hBOyAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkmI3hEOyYjeEE7ICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQmI3hEOyYjeEE7ICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCYjeEQ7JiN4QTsgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4mI3hEOyYjeEE7ICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sJiN4RDsmI3hBOyAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uJiN4RDsmI3hBOyAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQmI3hEOyYjeEE7ICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mJiN4RDsmI3hBOyAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkJiN4RDsmI3hBOyAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyAgJiN4RDsmI3hBOyAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSYjeEQ7JiN4QTsgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZyYjeEQ7JiN4QTsgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzJiN4RDsmI3hBOyAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzJiN4RDsmI3hBOyAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAmI3hEOyYjeEE7ICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5ICYjeEQ7JiN4QTsgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kICYjeEQ7JiN4QTsgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24mI3hEOyYjeEE7ICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMCYjeEQ7JiN4QTsgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZSYjeEQ7JiN4QTsgICAgICAgICAgICAgeG1sOkZhdGhlciYjeEQ7JiN4QTsgICYjeEQ7JiN4QTtUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cCYjeEQ7JiN4QTsgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkmI3hEOyYjeEE7ICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nLCB4bWw6c3BhY2Ugb3IgeG1sOmlkJiN4RDsmI3hBOyAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEmI3hEOyYjeEE7ICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czomI3hEOyYjeEE7ICAgICAgICAmYW1wO2x0O3NjaGVtYSAuIC4gLiZhbXA7Z3Q7JiN4RDsmI3hBOyAgICAgICAgIC4gLiAuJiN4RDsmI3hBOyAgICAgICAgICZhbXA7bHQ7aW1wb3J0IG5hbWVzcGFjZT0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UmcXVvdDsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QmcXVvdDsvJmFtcDtndDsmI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcyYjeEQ7JiN4QTsgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmFtcDtsdDt0eXBlIC4gLiAuJmFtcDtndDsmI3hEOyYjeEE7ICAgICAgICAgLiAuIC4mI3hEOyYjeEE7ICAgICAgICAgJmFtcDtsdDthdHRyaWJ1dGVHcm91cCByZWY9JnF1b3Q7eG1sOnNwZWNpYWxBdHRycyZxdW90Oy8mYW1wO2d0OyYjeEQ7JiN4QTsgJiN4RDsmI3hBOyAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZSYjeEQ7JiN4QTsgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMmI3hEOyYjeEE7SW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZyYjeEQ7JiN4QTsgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuJiN4RDsmI3hBOyAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0JiN4RDsmI3hBOyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4mI3hEOyYjeEE7ICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwmI3hEOyYjeEE7ICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYSYjeEQ7JiN4QTsgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwmI3hEOyYjeEE7ICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdCYjeEQ7JiN4QTsgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UmI3hEOyYjeEE7ICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0JiN4RDsmI3hBOyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuJiN4RDsmI3hBOyAgIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvY3VtZW50Um9vdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Im1peGVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1peGVkIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudFdpbGRjYXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjptaXhlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4TUxOU1ByZWZpeE1hcCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4bWxuczpwcmVmaXgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieFNJU2NoZW1hTG9jYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieHNpOnNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRheG9ub21pZXMiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vVGF4b25vbWllcyIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ0YXhvbm9taWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idWRkaVJlZ2lzdHJ5IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL1VERElSZWdpc3RyeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ1ZGRpUmVnaXN0cnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXhvbm9taWVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRheG9ub21pZXMiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRheG9ub215IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmVjb3JlIy8vVGF4b25vbXkiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idGF4b25vbXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSJodHRwOi8vZWNsaXBzZS5vcmcvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVRERJUmVnaXN0cnkiIGVTdXBlclR5cGVzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmVjb3JlIy8vUmVnaXN0cnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVURESVJlZ2lzdHJ5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2ZXJzaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NvdmVyeVVSTCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9BbnlVUkkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZGlzY292ZXJ5VVJMIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1YmxpY2F0aW9uVVJMIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0FueVVSSSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwdWJsaWNhdGlvblVSTCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN1cmVkRGlzY292ZXJ5VVJMIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0FueVVSSSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzZWN1cmVkRGlzY292ZXJ5VVJMIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3VyZWRQdWJsaWNhdGlvblVSTCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9BbnlVUkkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic2VjdXJlZFB1YmxpY2F0aW9uVVJMIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRMb2dpbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZGVmYXVsdExvZ2luIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRQYXNzd29yZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZGVmYXVsdFBhc3N3b3JkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRheG9ub21pZXMiIGVUeXBlPSIjLy9UYXhvbm9taWVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InRheG9ub21pZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlMWE3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcwotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLSMgRXh0ZW5zaW9uIHBvaW50IG5hbWVzCi1YUF9XRUJfU0VSVklDRV9MT0NBVE9SPVdlYiBTZXJ2aWNlIExvY2F0b3IKLVhfV0VCX1NFUlZJQ0VfTE9DQVRPUl9XT1JLU1BBQ0U9V29ya3NwYWNlIFdlYiBTZXJ2aWNlIExvY2F0b3IKLVhfV0VCX1NFUlZJQ0VfTE9DQVRPUl9DQVRFR09SWV9XT1JLU1BBQ0U9V29ya3NwYWNlIFdTREwgZG9jdW1lbnRzCi1YX1dTSUxfQ09OVEVOVF9UWVBFPVdlYiBTZXJ2aWNlcyBJbnNwZWN0aW9uIExhbmd1YWdlIERvY3VtZW50Ci0KLU1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUj1JV0FCMDAwMUUgVW5hYmxlIHRvIG1vbml0b3IgcG9ydCB7MH0gb2YgezF9LgotCi0jIEN1cnJlbnRseSBrbm93biBwdWJsaWMgVURESSByZWdpc3RyaWVzCi1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQPVNBUCBVRERJIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1Q9U0FQIFVEREkgVGVzdCBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1hNRVRIT0RTPVhNZXRob2RzIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTlRUQ09NTT1OVFQgQ29tbXVuaWNhdGlvbnMgUmVnaXN0cnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY4NmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICA8IS0tIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsLCB0aG91Z2ggbGlrZWx5IHRvIGJlIHByb21vdGVkIGZvciBwdWJsaWMgdXNlLCBwb3NzaWJseSB3aXRoIGNoYW5nZXMsIGluIGEgZnV0dXJlIHJlbGVhc2UuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibG9jYXRvciIgbmFtZT0iJVhQX1dFQl9TRVJWSUNFX0xPQ0FUT1IiIHNjaGVtYT0ic2NoZW1hL3dlYlNlcnZpY2VMb2NhdG9yLmV4c2QiLz4KLQotICAgPCEtLSBFeHRlbnNpb24gcHJvdmlkaW5nIHdvcmtzcGFjZSBXU0RMIGRpc2NvdmVyeSAtLT4gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3MubG9jYXRvciI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlTG9jYXRvckNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyLmNhdGVnb3J5LndvcmtzcGFjZSIKLSAgICAgICAgICAgIGxhYmVsPSIlWF9XRUJfU0VSVklDRV9MT0NBVE9SX0NBVEVHT1JZX1dPUktTUEFDRSIvPgotCi0gICAgICA8d2ViU2VydmljZUxvY2F0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXIuV29ya3NwYWNlV1NETExvY2F0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyLldvcmtzcGFjZVdTRExMb2NhdG9yIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2ZpbmRlci5jYXRlZ29yeS53b3Jrc3BhY2UiCi0gICAgICAgICAgICBsYWJlbD0iJVhfV0VCX1NFUlZJQ0VfTE9DQVRPUl9XT1JLU1BBQ0UiPgotICAgICAgPC93ZWJTZXJ2aWNlTG9jYXRvcj4KLQotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gRXh0ZW5zaW9uIHRvIGJpbmQgYSBmaWxlIHR5cGUgdG8gV1NJTCBmaWxlcyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgICAgIGV4dGVuc2lvbj0id3NpbCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gRXh0ZW5zaW9uIHRvIGRlZmluZSBhIGNvbnRlbnQgdHlwZSBmb3IgV1NJTCBmaWxlcyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotICAgICAgPGNvbnRlbnQtdHlwZQotICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2giCi0gICAgICAgICAgICBuYW1lPSIlWF9XU0lMX0NPTlRFTlRfVFlQRSIKLSAgICAgICAgICAgIGlkPSJ3c2lsc291cmNlIgotICAgICAgICAgICAgYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotICAgICAgICAgICAgZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCIKLSAgICAgICAgICAgIGZpbGUtZXh0ZW5zaW9ucz0id3NpbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NjaGVtYS93ZWJTZXJ2aWNlTG9jYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc2NoZW1hL3dlYlNlcnZpY2VMb2NhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTdkMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc2NoZW1hL3dlYlNlcnZpY2VMb2NhdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MiIGlkPSJ3ZWJTZXJ2aWNlTG9jYXRvciIgbmFtZT0iV2ViIFNlcnZpY2UgTG9jYXRvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwcm92aWRlZCB0byByZWdpc3RlciBsb2NhdG9ycyB0aGF0IGV4dGVuZCBBYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yLgotICAgICAgICAgVGhlc2UgbG9jYXRvcnMgYXJlIHVzZWQgYnkgV2ViU2VydmljZUZpbmRlciB0byBsb2NhdGUgV2ViIHNlcnZpY2VzIGZvciB0aGUgcHVycG9zZSBvZiBXZWIgc2VydmljZSBkaXNjb3ZlcnkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YWxsPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlTG9jYXRvciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlTG9jYXRvckNhdGVnb3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L2FsbD4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZUxvY2F0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgV2ViIFNlcnZpY2UgTG9jYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBsb2NhdG9yIGNsYXNzIHdoaWNoIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHNob3J0IGxhYmVsIHRvIGlkZW50aWZ5IHRoZSBXZWIgU2VydmljZSBMb2NhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWxseSwgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHVycG9zZSBvZiB0aGUgV2ViIFNlcnZpY2UgTG9jYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWxseSwgYW4gaWNvbiB0aGF0IHJlcHJlc2VudHMgdGhlIFdlYiBTZXJ2aWNlIExvY2F0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWxseSwgYSBjYXRlZ29yeSB0byB3aGljaCB0aGUgV2ViIFNlcnZpY2UgTG9jYXRvciBzaG91bGQgYmVsb25nLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlTG9jYXRvckNhdGVnb3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNhdGVnb3J5IG9mIFdlYiBTZXJ2aWNlIExvY2F0b3JzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc2hvcnQgbGFiZWwgZm9yIHRoZSBjYXRlZ29yeSBvZiBXZWIgU2VydmljZSBMb2NhdG9ycy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsbHksIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNhdGVnb3J5IG9mIFdlYiBTZXJ2aWNlIExvY2F0b3JzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbGx5LCBhbiBpY29uIHRoYXQgcmVwcmVzZW50cyB0aGUgY2F0ZWdvcnkgb2YgV2ViIFNlcnZpY2UgTG9jYXRvcnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWxseSwgYSBwYXJlbnQgY2F0ZWdvcnkgdW5kZXIgd2hpY2ggdGhlIFdlYiBTZXJ2aWNlIExvY2F0b3IKLSAgICAgICAgICAgICAgICAgIGNhdGVnb3J5IHNob3VsZCBiZSBncm91cGVkLiBJZiBhYnNlbnQsIHRoZSBjYXRlZ29yeSBpcyBjb25zaWRlcmVkCi0gICAgICAgICAgICAgICAgICB0byBiZSBhIHJvb3QgY2F0ZWdvcnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbmRlcnMgc2hvdWxkIGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXIuQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvciZsdDsvY29kZSZndDsuICBUaGUgV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeSB1c2VzIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHRvIHJldHJpZXZlIGFsbCBsb2NhdG9ycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvV3N0V1NQbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvV3N0V1NQbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1YzU1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL1dzdFdTUGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNjA0MjAgICAxMjA3MTQga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBHZXRNb25pdG9yQ29tbWFuZAotIwotTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SPUlXQUIwMDAxRSBVbmFibGUgdG8gbW9uaXRvciBwb3J0IHswfSBvZiB7MX0uCi0KLSMKLSMgV1NETFV0aWxpdHkKLSMKLU1TR19VTkFCTEVfVE9fUkVTT0xWRV9IVFRQPUNvdWxkIG5vdCByZXNvbHZlIHNlcnZpY2UgZGVmaW5pdGlvbiBodHRwOi8vezB9LiAgU2VydmljZSBtYXkgbm90IGJlIHJ1bm5pbmcgb24gdGhlIHNlcnZlci4KLU1TR19VTkFCTEVfVE9fUkVTT0xWRV9QTEFURk9STV9VUkk9Q291bGQgbm90IHBhcnNlIHBsYXRmb3JtOi9yZXNvdXJjZXswfS4KLQotIwotIyBXU0lDb21wbGlhbmNlVXRpbHMKLSMKLUlHTk9SRV9MQUJFTD1JZ25vcmUKLUlHTk9SRV9ERVNDUklQVElPTj1JZ25vcmUgdGhlIFdTLUkgbm9uLWNvbXBsaWFuY2UgYW5kIGNvbnRpbnVlCi1JR05PUkVfQUxMX0xBQkVMPUlnbm9yZSBBbGwKLUlHTk9SRV9BTExfREVTQ1JJUFRJT049QWx3YXlzIGlnbm9yZSB0aGUgV1MtSSBub24tY29tcGxpYW5jZSBhbmQgY29udGludWUKLUNBTkNFTF9MQUJFTD1DYW5jZWwKLUNBTkNFTF9ERVNDUklQVElPTj1DYW5jZWwKLQotIwotIwlXUy1JIENvbXBsaWFuY2UgTWVzc2FnZXMKLSMKLVdTSV9TU0JQX0VSUk9SPVlvdSBoYXZlIG1hZGUgYSBjaG9pY2UgdGhhdCBtYXkgcmVzdWx0IGluIGEgV2ViIHNlcnZpY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUuIFlvdXIgY3VycmVudCBXZWIgc2VydmljZXMgcHJlZmVyZW5jZSBpcyBzZXQgdG8gcmVxdWlyZSBjb21wbGlhbmNlIHdpdGggV1MtSSBTU0JQLgotV1NJX1NTQlBfV0FSTklORz1Zb3UgaGF2ZSBtYWRlIGEgY2hvaWNlIHRoYXQgbWF5IHJlc3VsdCBpbiBhIFdlYiBzZXJ2aWNlIHRoYXQgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlLiBEbyB5b3Ugd2lzaCB0byBpZ25vcmUgdGhpcyB3YXJuaW5nIGFuZCBjb250aW51ZT8KLVdTSV9TU0JQX0lOQ09NUExJQU5UX1JVTlRJTUU9VGhlIHNlbGVjdGVkIFdlYiBTZXJ2aWNlIHJ1bnRpbWUgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlLgotV1NJX0FQX0VSUk9SPVlvdSBoYXZlIG1hZGUgYSBjaG9pY2UgdGhhdCBtYXkgcmVzdWx0IGluIGEgV2ViIHNlcnZpY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBBdHRhY2htZW50IFByb2ZpbGUuIFlvdXIgY3VycmVudCBXZWIgc2VydmljZXMgcHJlZmVyZW5jZSBpcyBzZXQgdG8gcmVxdWlyZSBjb21wbGlhbmNlIHdpdGggV1MtSSBBUC4KLVdTSV9BUF9XQVJOSU5HPVlvdSBoYXZlIG1hZGUgYSBjaG9pY2UgdGhhdCBtYXkgcmVzdWx0IGluIGEgV2ViIHNlcnZpY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBBdHRhY2htZW50IFByb2ZpbGUuIERvIHlvdSB3aXNoIHRvIGlnbm9yZSB0aGlzIHdhcm5pbmcgYW5kIGNvbnRpbnVlPwotV1NJX0FQX0lOQ09NUExJQU5UX1JVTlRJTUU9VGhlIHNlbGVjdGVkIFdlYiBTZXJ2aWNlIHJ1bnRpbWUgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgQXR0YWNobWVudCBQcm9maWxlLgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL1dzdFdTUGx1Z2luTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvV3N0V1NQbHVnaW5NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE5ZjEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvV3N0V1NQbHVnaW5NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDIwICAgMTIwNzE0IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFdzdFdTUGx1Z2luTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5Xc3RXU1BsdWdpbiI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXc3RXU1BsdWdpbk1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1VOQUJMRV9UT19SRVNPTFZFX1BMQVRGT1JNX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfVU5BQkxFX1RPX1JFU09MVkVfSFRUUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJR05PUkVfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUdOT1JFX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElHTk9SRV9BTExfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUdOT1JFX0FMTF9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDQU5DRUxfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0FOQ0VMX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSV9TU0JQX0VSUk9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSV9TU0JQX1dBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NJX1NTQlBfSU5DT01QTElBTlRfUlVOVElNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0lfQVBfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NJX0FQX1dBUk5JTkc7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTSV9BUF9JTkNPTVBMSUFOVF9SVU5USU1FOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV3N0V1NQbHVnaW5NZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9jb21tb24vQnVuZGxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvY29tbW9uL0J1bmRsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZWNhNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9jb21tb24vQnVuZGxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVVdGlscwotewotICBzdGF0aWMgcHVibGljIFVSTCBnZXRVUkxGcm9tQnVuZGxlKCBTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBwYXRoICkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICB7Ci0gICAgQnVuZGxlICAgICAgYnVuZGxlICAgICA9IFBsYXRmb3JtLmdldEJ1bmRsZSggYnVuZGxlSWQgKTsKLSAgICBVUkwgICAgICAgICBpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7Ci0gICAgVVJMICAgICAgICAgZmlsZVVSTCAgICA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgcGF0aCApOwotICAgIAotICAgIHJldHVybiBmaWxlVVJMOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2NvbW1vbi9IVFRQVXRpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9jb21tb24vSFRUUFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1MTEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2NvbW1vbi9IVFRQVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTI0ICAgMTY3NDg3IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotcHVibGljIGNsYXNzIEhUVFBVdGlsaXR5IHsKLQotCXB1YmxpYyBTdHJpbmcgaGFuZGxlUmVkaXJlY3QoU3RyaW5nIHVybFN0cmluZyl7Ci0JCVVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JCVN0cmluZyB1cmxSZWRpcmVjdCA9IHVybFN0cmluZzsKLQkJaW50IHRpbWUgPSAwOwotCQl3aGlsZSh1cmxSZWRpcmVjdCE9IG51bGwpewotCQkJaWYgKHRpbWUgPT0gNikgcmV0dXJuIHVybFJlZGlyZWN0OwotCQkJdHJ5ewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVybFJlZGlyZWN0KTsKLQkJCQljb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQl9Y2F0Y2goRXhjZXB0aW9uIGV4Yyl7Ci0JCQkJcmV0dXJuIHVybFJlZGlyZWN0OwotCQkJfQotCQkJaWYgKGNvbm4gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikKLQkJCQl7Ci0JCQkJSHR0cFVSTENvbm5lY3Rpb24gaHR0cCA9IChIdHRwVVJMQ29ubmVjdGlvbikgY29ubjsKLQkJCQlodHRwLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKLQkgICAgICAgICAKLQkJCQl0cnl7Ci0JCQkJCWludCBjb2RlID0gaHR0cC5nZXRSZXNwb25zZUNvZGUoKTsKLQkJCQkJaWYgKGNvZGUgPj0gMzAwICYmIGNvZGUgPD0gMzA3ICYmIGNvZGUgIT0gMzA2ICYmCi0JICAgICAgICAJCQkgY29kZSAhPSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX05PVF9NT0RJRklFRCkKLQkJCQkJewotCQkJCQkJU3RyaW5nIHVybFJlZGlyZWN0MiA9IGNoYW5nZVNsYXNoKGh0dHAuZ2V0SGVhZGVyRmllbGQoIkxvY2F0aW9uIikpOwotCSAgICAgICAgICAgCSAJCWlmICh1cmxSZWRpcmVjdDIgPT0gbnVsbCB8fCB1cmxSZWRpcmVjdC5lcXVhbHModXJsUmVkaXJlY3QyKSkgcmV0dXJuIHVybFJlZGlyZWN0OwotCSAgICAgICAgICAJIAkJZWxzZSB1cmxSZWRpcmVjdCA9IHVybFJlZGlyZWN0MjsKLQkJCQkJfWVsc2UgcmV0dXJuIHVybFJlZGlyZWN0OwotCQkJCQotCQkJCQotCQkJCX1jYXRjaChJT0V4Y2VwdGlvbiBleGMpewotCQkJCQlyZXR1cm4gdXJsUmVkaXJlY3Q7IAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgcmV0dXJuIHVybFJlZGlyZWN0OwotCQkJdGltZSsrOwotCQl9Ci0JCXJldHVybiB1cmxTdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjaGFuZ2VTbGFzaChTdHJpbmcgdXJsKXsKLQkJU3RyaW5nIHRlbXAgPSAiIjsKLQkJdHJ5ewotCQkJdGVtcCA9IHVybC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCX1jYXRjaChFeGNlcHRpb24gZXhjKXsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQkJcmV0dXJuIHRlbXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9jb21tb24vTGl2ZVdTRExGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvY29tbW9uL0xpdmVXU0RMRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmIwNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9jb21tb24vTGl2ZVdTRExGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTGl2ZVdTRExGaWx0ZXIgZXh0ZW5kcyBUaHJlYWQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTF87Ci0gIHByaXZhdGUgYm9vbGVhbiBmaW5pc2hfOwotICBwcml2YXRlIGJvb2xlYW4gbGl2ZV87Ci0KLSAgcHVibGljIExpdmVXU0RMRmlsdGVyKFN0cmluZyB3c2RsVVJMKQotICB7Ci0gICAgd3NkbFVSTF8gPSB3c2RsVVJMOwotICAgIGZpbmlzaF8gPSBmYWxzZTsKLSAgICBsaXZlXyA9IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMVVJMKCkKLSAgewotICAgIHJldHVybiB3c2RsVVJMXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRmluaXNoKCkKLSAgewotICAgIHJldHVybiBmaW5pc2hfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNXU0RMTGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gbGl2ZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbGl2ZV8gPSB2YWxpZGF0ZVdTREwoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAJU3lzdGVtLm91dC5wcmludGxuKCJUaHJvd2luZyBleGNlcHRpb24gIiArIHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIGxpdmVfID0gZmFsc2U7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBmaW5pc2hfID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVXU0RMKCkgdGhyb3dzIFdTRExFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgCVdlYlNlcnZpY2VzUGFyc2VyRXh0IHBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcGFyc2VyLmdldFdTRExEZWZpbml0aW9uVmVyYm9zZSh3c2RsVVJMXyk7Ci0gIAlTeXN0ZW0ub3V0LnByaW50bG4oIndzZGxVUkxfICIgKyB3c2RsVVJMXy50b1N0cmluZygpKTsKLSAgICBNYXAgc2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgSXRlcmF0b3Igc2VydmljZUl0ZXJhdG9yID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNlcnZpY2VJdGVyYXRvciAiICsgc2VydmljZUl0ZXJhdG9yLnRvU3RyaW5nKCkpOwotICAgIHdoaWxlIChzZXJ2aWNlSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXNlcnZpY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICBJdGVyYXRvciBwb3J0SXRlcmF0b3IgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKHBvcnRJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KXBvcnRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgSXRlcmF0b3IgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzSXRlcmF0b3IgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGV4dGVuc2liaWxpdHlFbGVtZW50c0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dGVuc2liaWxpdHlFbGVtZW50c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICBpZiAoKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHx8IChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9jb21tb24vTWVyZ2VVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9jb21tb24vTWVyZ2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmYyZDk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvY29tbW9uL01lcmdlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMzAgMTI4ODI3ICAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDYwNDAzIDEyODgyNyAgIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5tZXJnZS5qYXZhLkpDb250cm9sTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4ubWVyZ2UuamF2YS5KTWVyZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLm1lcmdlLmphdmEuZmFjYWRlLkZhY2FkZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi51dGlsLkNvZGVHZW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRNZXJnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIE1lcmdlVXRpbHMgewotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBNZXJnZU1vZGVsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU1RfV1MgPSAib3JnLmVjbGlwc2Uud3N0LndzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfWE1MID0gIm1lcmdlLnhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpNRVJHRVIgPSAiam1lcmdlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgSkNvbnRyb2xNb2RlbCBqTWVyZ2VDb250cm9sTW9kZWwgPSBudWxsOwotCi0JCi0JLyoqCi0JICogU3RvcmVzIHRoZSBKTWVyZ2UgbW9kZWwgb2YgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhlIFVSTCBzdHJpbmdzCi0JICogQHBhcmFtIHVybFN0cmluZ3MgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkwgZm9yIHRoZSBmaWxlCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHN0b3JlTWVyZ2VNb2RlbHMgKFN0cmluZyBbXSB1cmxTdHJpbmdzKSB7Ci0JCWlmICh1cmxTdHJpbmdzICE9IG51bGwpIHsKLQkJCVBlcnNpc3RlbnRNZXJnZUNvbnRleHQgbWVyZ2VDb250ZXh0ID0gV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRNZXJnZUNvbnRleHQoKTsKLQkJCWlmIChtZXJnZUNvbnRleHQuaXNTa2VsZXRvbk1lcmdlRW5hYmxlZCgpKSB7Ci0JCQkJaW5pdGlhbGl6ZSgpOwotCQkJCWlmIChqTWVyZ2VDb250cm9sTW9kZWwgIT0gbnVsbCkgewotCQkJCQlNZXJnZU1vZGVsID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJCQlTdHJpbmcgZmlsZW5hbWU7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJZmlsZW5hbWUgPSBnZXRGaWxlRnJvbVVSTCh1cmxTdHJpbmdzW2ldKTsKLQkJCQkJCWlmIChmaWxlbmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJc3RvcmVNb2RlbChmaWxlbmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIEpNZXJnZSBtb2RlbCBvZiB0aGUgZmlsZSB1c2luZyB0aGUgZmlsZW5hbWUgYXMga2V5Ci0JICogQHBhcmFtIGZpbGVuYW1lIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmlsZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBzdG9yZU1vZGVsIChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQlKTWVyZ2VyIGpNZXJnZXI7Ci0JCUZpbGUgYUZpbGU7Ci0JCXRyeSB7Ci0JCQlpZiAoak1lcmdlQ29udHJvbE1vZGVsICE9IG51bGwpIHsKLQkJCQlhRmlsZSA9IG5ldyBGaWxlIChmaWxlbmFtZSk7Ci0JCQkJaWYgKGFGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhRmlsZSk7Ci0JCQkJCWpNZXJnZXIgPSBuZXcgSk1lcmdlcihqTWVyZ2VDb250cm9sTW9kZWwpOwotCQkJCQlqTWVyZ2VyLnNldFRhcmdldENvbXBpbGF0aW9uVW5pdChqTWVyZ2VyLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZvcklucHV0U3RyZWFtKGluU3RyZWFtKSk7Ci0JCQkJCU1lcmdlTW9kZWwucHV0KGZpbGVuYW1lLCBqTWVyZ2VyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBGaWxlIG5vdCBmb3VuZCwganVzdCBpZ25vcmUuICBOb3RoaW5nIHRvIG1lcmdlLgotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIEpNZXJnZSBtb2RlbAotCSAqIEZpbGUgbWVyZ2UueG1sIGluIFdlYlNlcnZpY2VQbHVnaW4gY29udGFpbnMgdGhlIHJ1bGVzIGZvciB0aGUgbWVyZ2UuCi0JICogSWYgdGhlIG1lcmdlLnhtbCBmaWxlIGlzIG5vdCBmb3VuZCwgak1lcmdlQ29udHJvbE1vZGVsIGlzIGxlYXZlIGFzIG51bGwuCi0JICovCi0Jc3RhdGljIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoak1lcmdlQ29udHJvbE1vZGVsID09IG51bGwpIHsKLQkJCUZhY2FkZUhlbHBlciBmYWNhZGVIZWxwZXIgPSBDb2RlR2VuVXRpbC5pbnN0YW50aWF0ZUZhY2FkZUhlbHBlcihKTWVyZ2VyLkRFRkFVTFRfRkFDQURFX0hFTFBFUl9DTEFTUyk7Ci0JCQlqTWVyZ2VDb250cm9sTW9kZWwgPSBuZXcgSkNvbnRyb2xNb2RlbCgpOwotCi0JCQlCdW5kbGUgICAgICAgIHdzQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFdTVF9XUyk7Ci0JCQlJUGF0aCAgICAgICAgIG1lcmdlUGF0aCAgICAgID0gbmV3IFBhdGgoIEpNRVJHRVIgKS5hcHBlbmQoIE1FUkdFX1hNTCApOwotCQkJVVJMICAgICAgICAgICBmaWxlVVJMICAgICAgICA9IEZpbGVMb2NhdG9yLmZpbmQoIHdzQnVuZGxlLCBtZXJnZVBhdGgsIG51bGwpOwotCQkJak1lcmdlQ29udHJvbE1vZGVsLmluaXRpYWxpemUoZmFjYWRlSGVscGVyLCBmaWxlVVJMLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JCi0JLyoqCi0JICogTG9vayB1cCB0aGUgbW9kZWwgb2YgdGhpcyBmaWxlIHN0b3JlZCBlYXJsaWVyIHVzaW5nIHRoZSBmaWxlbmFtZSBhcyBrZXkuCi0JICogTWVyZ2UgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIHdpdGggdGhlIGVhcmxpZXIgbW9kZWwuCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXJnZWQgY29udGVudC4gCi0JICogUmV0dXJucyBudWxsIGlmIGFuIGVhcmxpZXIgbW9kZWwgZm9yIHRoaXMgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgbmV3IGZpbGUgZG9lcyBub3QgZXhpc3QuCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybiBtZXJnZSBjb250ZW50Ci0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgbWVyZ2VGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotCQlKTWVyZ2VyIGpNZXJnZXIgPSAoSk1lcmdlcikgTWVyZ2VNb2RlbC5nZXQoZmlsZW5hbWUpOwotCQlTdHJpbmcgbWVyZ2VkQ29udGVudCA9IG51bGw7Ci0JCWlmIChqTWVyZ2VyICE9IG51bGwpIHsgIAotCQkJLy8gYSBKTWVyZ2VyIG1vZGVsIG9mIHRoZSBmaWxlIGV4aXN0cywgbWVyZ2UgdGhlIGNvbnRlbnRzCi0JCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZSAoZmlsZW5hbWUpKTsKLQkJCQlqTWVyZ2VyLnNldFNvdXJjZUNvbXBpbGF0aW9uVW5pdChqTWVyZ2VyLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZvcklucHV0U3RyZWFtKGluU3RyZWFtKSk7Ci0JCQkJak1lcmdlci5tZXJnZSgpOwotCQkJCW1lcmdlZENvbnRlbnQgPSBqTWVyZ2VyLmdldFRhcmdldENvbXBpbGF0aW9uVW5pdENvbnRlbnRzKCk7CQkJCi0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIEZpbGUgbm90IGZvdW5kLCBqdXN0IGlnbm9yZS4gIE5vdGhpbmcgdG8gbWVyZ2UuCi0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWVyZ2VkQ29udGVudDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZmlsZSBuYW1lIG9mIHRoaXMgVVJMCi0JICogQHBhcmFtIHVybFN0cmluZyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSTAotCSAqIEByZXR1cm4gZmlsZSBuYW1lIHN0cmluZwotCSAqLwotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEZpbGVGcm9tVVJMKFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwgKHVybFN0cmluZyk7Ci0JCQlmaWxlU3RyaW5nID0gdXJsLmdldEZpbGUoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmlsZVN0cmluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvY29tbW9uL1dTRExVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2NvbW1vbi9XU0RMVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjI5MjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvY29tbW9uL1dTRExVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5Xc3RXU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotLyoqCi0gKiBVdGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBhIHdvcmtzcGFjZSBXU0RMIGZpbGUgcmVzb3VyY2UuCi0gKiAKLSAqIEBhdXRob3Igam9hbgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgV1NETFV0aWxpdHkgewotCi0JcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbl8gPSBudWxsOwotCXByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2VfID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lXyA9ICIiOwotCXByb3RlY3RlZCBVUkwgdXJsXyA9IG51bGw7Ci0JCi0JcHVibGljIFdTRExVdGlsaXR5KElSZXNvdXJjZSByZXMpCi0JewotIAkJc3VwZXIoKTsKLQkJcmVzb3VyY2VfID0gcmVzOwotCQlidWlsZERlZmluaXRpb24oKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmluaXRpb24oKQotCXsJCQotCQlpZiAocmVzb3VyY2VfLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkgICAgeyAgICAgICAgCi0JICAgICAgICBTdHJpbmcgZXh0ID0gcmVzb3VyY2VfLmdldEZpbGVFeHRlbnNpb24oKTsKLQkgICAgICAgIFN0cmluZyByZXNQYXRoID0gcmVzb3VyY2VfLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkgICAgICAgIGlmIChleHQgIT0gbnVsbCkKLQkgICAgICAgIHsKLQkJICAgICAgCQotCQkgICAgICAgIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlcigpOwotCQkgICAgICAJCQkgICAgICAJCi0JCSAgICAgIAl0cnkgewotCQkgICAgICAJCWRlZmluaXRpb25fID0gcGFyc2VyLmdldFdTRExEZWZpbml0aW9uKCJwbGF0Zm9ybToiICsgcmVzUGF0aCk7Ci0JCSAgICAgIAkgICBpZiAoZGVmaW5pdGlvbl8gPT0gbnVsbCl7CQkgICAgICAJCSAgIAotCQkgICAgICAJCSB0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKFdzdFdTUGx1Z2luTWVzc2FnZXMuTVNHX1VOQUJMRV9UT19SRVNPTFZFX1BMQVRGT1JNX1VSSSwgcmVzUGF0aCkpOwkJICAgICAgCQkgCi0JCSAgICAgIAkgICB9Ci0JCSAgICAgIAl9Ci0JCSAgICAgIAljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkgICAgICAJCXJldHVybiBmYWxzZTsKLQkJICAgICAgCX0KLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYgKHJlc1BhdGguaW5kZXhPZignPycpID4gMCkgIC8vZGVwbG95ZWQgcmVzb3VyY2UKLQkgICAgICAgIHsKLQkgICAgICAgIAlXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXIoKTsKLQkJICAgICAgCQkJICAgICAgCQotCQkgICAgICAJdHJ5IHsKLQkJICAgICAgCQlkZWZpbml0aW9uXyA9IHBhcnNlci5nZXRXU0RMRGVmaW5pdGlvbigiaHR0cDoiICsgcmVzUGF0aCk7Ci0JCSAgICAgIAkgICBpZiAoZGVmaW5pdGlvbl8gPT0gbnVsbCl7Ci0JCSAgICAgIAkJIHRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoV3N0V1NQbHVnaW5NZXNzYWdlcy5NU0dfVU5BQkxFX1RPX1JFU09MVkVfSFRUUCwgcmVzUGF0aCkpOwkJICAgICAgCQkKLQotCQkgICAgICAJICAgfQotCQkgICAgICAJfQotCQkgICAgICAJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJICAgICAgCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIAl9Ci0JICAgICAgICB9Ci0JICAgIH0KLQkJc2VydmljZU5hbWVfID0gIiI7CQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgZGVmaW5lZCBpbiB0aGUgV1NETCBmaWxlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIFRoZSB3b3Jrc3BhY2UgcmVzb3VyY2UgZm9yIHRoZSBXU0RMIGZpbGUKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgYXR0cmlidXRlIG9mIHRoZSBzZXJ2aWNlIGVsZW1lbnQgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpCi0JewotCQlpZiAoc2VydmljZU5hbWVfLmVxdWFscygiIikpCi0JCXsKLQkJCWlmIChkZWZpbml0aW9uXyAhPSBudWxsKQotCQkJewotCQkJCSAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb25fLmdldFNlcnZpY2VzKCk7ICAvL2p2aCAtIG5lZWQgdG8gaGFuZGxlIG51bGwgZGVmaW5pdGlvbiBoZXJlLi4uLgotCQkJICAJICAgT2JqZWN0W10gc2VydmljZXMgPSBzZXJ2aWNlc01hcC52YWx1ZXMoKS50b0FycmF5KCk7Ci0JCQkgIAkgICAKLQkJCSAgCSAgIC8vIFRPRE86IGhlcmUgY2FuIGRldGVjdCBpZiBubyBzZXJ2aWNlIHRhZyAtIHNlbmQgYXBwcm9wcmlhdGUgbWVzc2FnZQotCQkJICAJICAgLy8gVE9ETzogd2hhdCBpZiA+IDEgc2VydmljZSBkZWZpbmVkIGluIHRoZSBXU0RMPwotCQkJICAJICAgLy8gZm9yIG5vdyByZXR1cm4gdGhlIGZpcnN0IHNlcnZpY2UgbmFtZSBmb3VuZC4uLgotCQkJICAJICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkgICBTZXJ2aWNlIHMgPSAoU2VydmljZSlzZXJ2aWNlc1tpXTsKLQkJCQkJICAgU3RyaW5nIHFTdHJpbmcgPSBzLmdldFFOYW1lKCkudG9TdHJpbmcoKTsKLQkJCQkJICAgCi0JCQkJCSAgIC8vZ2V0IG5hbWUgb25seSBmcm9tIHF1YWxpZmllZCBzdHJpbmcKLQkJCQkJICAgaW50IGluZGV4MSA9IHFTdHJpbmcuaW5kZXhPZigifSIpKzE7ICAvLyROT04tTkxTLTEkCi0JCQkJCSAgIGludCBpbmRleDIgPSBxU3RyaW5nLmxlbmd0aCgpOwotCQkJCQkgICAKLQkJCQkJICAgc2VydmljZU5hbWVfID0gcVN0cmluZy5zdWJzdHJpbmcoaW5kZXgxLCBpbmRleDIpOwkJCQkgICAKLQkJCSAgCSAgIH0gIAkKLQkJCX0JCQkJICAKLQkJfQotCSAgCXJldHVybiBzZXJ2aWNlTmFtZV87Ci0JfQotCQotCXB1YmxpYyBVUkwgZ2V0V1NETEFkZHJlc3MoKSAKLSAgICB7Ci0JICAgaWYgKHVybF8gPT0gbnVsbCkKLQkgICB7CSAgIAotCSAgICAgICBTdHJpbmcgbG9jYXRpb25VUkkgPSBudWxsOwotCSAgICAgICBpZiAoZGVmaW5pdGlvbl8gIT0gbnVsbCkKLQkgICAgICAgewotCSAgICAJICAgTWFwIHNlcnZpY2VzTWFwID0gZGVmaW5pdGlvbl8uZ2V0U2VydmljZXMoKTsKLQkJICAJICAgT2JqZWN0W10gc2VydmljZXMgPSBzZXJ2aWNlc01hcC52YWx1ZXMoKS50b0FycmF5KCk7Ci0JCSAgCSAgIAotCQkgIAkgICAvLyBUT0RPOiBoZXJlIGNhbiBkZXRlY3QgaWYgbm8gc2VydmljZSB0YWcgLSBzZW5kIGFwcHJvcHJpYXRlIG1lc3NhZ2UKLQkJICAJICAgLy8gVE9ETzogd2hhdCBpZiA+IDEgc2VydmljZSBkZWZpbmVkIGluIHRoZSBXU0RMPwotCQkgIAkgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJICAgU2VydmljZSBzID0gKFNlcnZpY2Upc2VydmljZXNbaV07Ci0JCQkJICAgTWFwIHBvcnRzTWFwID0gcy5nZXRQb3J0cygpOwotCQkJCSAgIE9iamVjdFtdIHBvcnRzID0gcG9ydHNNYXAudmFsdWVzKCkudG9BcnJheSgpOwotCQkKLQkJCQkgICAvLyBUT0RPOiBoZXJlIGNhbiBkZXRlY3QgaWYgPiAxIHBvcnQgZm9yIHRoZSBzZXJ2aWNlIC0gZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUKLQkJCQkgICBmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlQb3J0IHAgPSAoUG9ydClwb3J0c1tqXTsKLQkJCQkJCUxpc3QgZXh0TGlzdCA9IHAuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCQkJCQkKLQkJCQkJCWZvciAoaW50IGsgPSAwOyBqIDwgZXh0TGlzdC5zaXplKCk7IGorKyl7Ci0JCQkJCQkgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dExpc3QuZ2V0KGspOwotCQkJCQkJICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLQkJCQkJCSAgICAgIHsgIAotCQkJCQkJICAgICAgICBsb2NhdGlvblVSSSA9ICgoU09BUEFkZHJlc3MpZXh0RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCSAgICAgIH0KLQkJCQkJCSAgICAgIGVsc2UgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykKLQkJCQkJCSAgICAgICB7Ci0JCQkJCQkgICAgICAgIGxvY2F0aW9uVVJJID0gKChIVFRQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwkJCQkJCSAgICAgICAgCi0JCQkJCQkgICAgICB9Ci0JCQkJCQkgICAgICBlbHNlCi0JCQkJCQkgICAgICB7Ci0JCQkJCQkgICAgCSAgLy9UT0RPOiBpZiBub3QgU09BUCBvciBIVFRQIC0gaG93IGRvIHdlIHdhbnQgdG8gaGFuZGxlIGl0Li4uIAotCQkJCQkJICAgICAgfQotCQkJCQkJIH0JCQkJCQotCQkJCSAgIH0KLQkJICAJICAgfSAgCQkgICAgCQotCQkgIAkgCi0JCQkgICAgdHJ5IHsKLQkJCSAgICAgICAgIHVybF8gPSBuZXcgVVJMKGxvY2F0aW9uVVJJICsgIj8iICsgcmVzb3VyY2VfLmdldEZpbGVFeHRlbnNpb24oKSk7CSAgICAgICAgIAotCQkJICAgIH0KLQkJCSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1hbEV4Yyl7fQotICAgICAgICAgICAgfQkgIAkJICAgICAgCi0JICAgIH0KLQkgICByZXR1cm4gdXJsXzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGEvTGFiZWxzQW5kSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGEvTGFiZWxzQW5kSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDZiMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhL0xhYmVsc0FuZElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBMYWJlbHNBbmRJZHMKLXsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBsYWJlbHNfOwotICBwcml2YXRlIFN0cmluZ1tdIGlkc187Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZHNfLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldElkc18oKQotICB7Ci0gICAgcmV0dXJuIGlkc187Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBpZHNfIFRoZSBpZHNfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElkc18oU3RyaW5nW10gaWRzXykKLSAgewotICAgIHRoaXMuaWRzXyA9IGlkc187Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFiZWxzXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRMYWJlbHNfKCkKLSAgewotICAgIHJldHVybiBsYWJlbHNfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gbGFiZWxzXyBUaGUgbGFiZWxzXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMYWJlbHNfKFN0cmluZ1tdIGxhYmVsc18pCi0gIHsKLSAgICB0aGlzLmxhYmVsc18gPSBsYWJlbHNfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY0Nvbm5lY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzhjYWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY0Nvbm5lY3Rpb24gaW1wbGVtZW50cyBDb25uZWN0aW9uCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBSZWwgZlJlbDsKLSAgcHJpdmF0ZSBFbGVtZW50IGZFbGVtZW50OwotICBwcml2YXRlIENvbm5lY3Rpb24gZk9wcG9zaW5nQ29ubmVjdGlvbjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRCT1VORCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQk9VTkQgPSAxOwotCi0gIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGlvbltdIGNyZWF0ZVBhaXIgKCBSZWwgb3V0Ym91bmRSZWwsIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgUmVsIGluYm91bmRSZWwsIEVsZW1lbnQgc291cmNlRWxlbWVudCApCi0gIHsKLSAgICBCYXNpY0Nvbm5lY3Rpb24gb3V0Ym91bmRDb25uZWN0aW9uID0gbmV3IEJhc2ljQ29ubmVjdGlvbihvdXRib3VuZFJlbCx0YXJnZXRFbGVtZW50KTsKLSAgICBCYXNpY0Nvbm5lY3Rpb24gaW5ib3VuZENvbm5lY3Rpb24gPSBuZXcgQmFzaWNDb25uZWN0aW9uKGluYm91bmRSZWwsc291cmNlRWxlbWVudCk7Ci0gICAgb3V0Ym91bmRDb25uZWN0aW9uLmZPcHBvc2luZ0Nvbm5lY3Rpb24gPSBpbmJvdW5kQ29ubmVjdGlvbjsKLSAgICBpbmJvdW5kQ29ubmVjdGlvbi5mT3Bwb3NpbmdDb25uZWN0aW9uID0gb3V0Ym91bmRDb25uZWN0aW9uOwotICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbltdIHtvdXRib3VuZENvbm5lY3Rpb24saW5ib3VuZENvbm5lY3Rpb259OwotICB9Ci0KLSAgcHVibGljIEJhc2ljQ29ubmVjdGlvbiAoIFJlbCByZWwsIEVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICBmUmVsID0gcmVsOwotICAgIGZFbGVtZW50ID0gZWxlbWVudDsKLSAgICBmT3Bwb3NpbmdDb25uZWN0aW9uID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBSZWwgZ2V0UmVsICgpCi0gIHsKLSAgICByZXR1cm4gZlJlbDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBDb25uZWN0aW9uIGdldE9wcG9zaW5nQ29ubmVjdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIGZPcHBvc2luZ0Nvbm5lY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnQuZ2V0TmFtZSgpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZDA4ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNFbGVtZW50IGltcGxlbWVudHMgRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIFN0cmluZyBmTVVJRDsKLSAgcHJpdmF0ZSBNb2RlbCBmTW9kZWw7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGZSZWxzOwotICBwcml2YXRlIEhhc2h0YWJsZSBmUHJvcGVydGllczsKLSAgcHJpdmF0ZSBWZWN0b3IgZkxpc3RlbmVyczsKLQotICBwdWJsaWMgQmFzaWNFbGVtZW50ICggU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBzZXRNVUlEKG1vZGVsLm1ha2VNVUlEKG5hbWUpKTsKLSAgICBtb2RlbC5hZGRFbGVtZW50KHRoaXMpOwotICAgIGZNb2RlbCA9IG1vZGVsOwotICAgIGZSZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZMaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZlByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZlByb3BlcnRpZXMucHV0KFByb3BlcnR5Lk5BTUUsbmV3IEJhc2ljUHJvcGVydHkoUHJvcGVydHkuTkFNRSxmTmFtZSkpOwotICB9Ci0KLSAgcHVibGljIEJhc2ljRWxlbWVudCAoIFN0cmluZyBuYW1lLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUsIFN0cmluZyBpbmJvdW5kUmVsTmFtZSApCi0gIHsKLSAgICB0aGlzKG5hbWUsZWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICBjb25uZWN0KGVsZW1lbnQsb3V0Ym91bmRSZWxOYW1lLGluYm91bmRSZWxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICogb2YgdGhlIHNhbWUgY2xhc3MgYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbW9kZWwsCi0gICogYnV0IHdpdGggbm8gUHJvcGVydGllcywgUmVscyBvciBMaXN0ZW5lcnMgZXhjZXB0IGZvcgotICAqIHRoZSB7QGxpbmsgUHJvcGVydHkjTkFNRSBOQU1FfSBwcm9wZXJ0eS4KLSAgKiBAcmV0dXJuIE9iamVjdCBBIG5ldyBFbGVtZW50LgotICAqLwotICBwdWJsaWMgRWxlbWVudCBzaGFsbG93Q2xvbmUgKCkKLSAgewotICAgIHJldHVybiBuZXcgQmFzaWNFbGVtZW50KGZOYW1lLGZNb2RlbCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyA8Y29kZT5FbGVtZW50PC9jb2RlPgotICAqIG9mIHRoZSBzYW1lIGNsYXNzIGFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIG1vZGVsCi0gICogYW5kIHdpdGggYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBFbGVtZW50J3MgUHJvcGVydGllcy4KLSAgKiBUaGUgUmVscyBhbmQgTGlzdGVuZXJzIGFyZSBub3QgY2xvbmVkLgotICAqIEByZXR1cm4gRWxlbWVudCBBIG5ldyBFbGVtZW50LgotICAqLwotICBwdWJsaWMgZmluYWwgRWxlbWVudCBkZWVwQ2xvbmUgKCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IHNoYWxsb3dDbG9uZSgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRQcm9wZXJ0aWVzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpZS5uZXh0RWxlbWVudCgpOwotICAgICAgUHJvcGVydHkgbmV3UHJvcGVydHkgPSAoUHJvcGVydHkpcHJvcGVydHkuc2hhbGxvd0Nsb25lKCk7Ci0gICAgICBuZXdFbGVtZW50LnNldFByb3BlcnR5KG5ld1Byb3BlcnR5KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgKiBNb2RlbC1WaWV3LUNvbnRyb2xsZXI6IEFsbCBwcm9wZXJ0eSBjaGFuZ2VzIHRvIHRoZSBtb2RlbAotICAqIChzdWNoIGFzIHRob3NlIG1hZGUgYnkgYSB3aXphcmQgaW4gdGhlIHJvbGUgb2YgYSBDb250cm9sbGVyKQotICAqIHNob3VsZCB5aWVsZCBldmVudHMgdG8gd2hpY2ggYW4gaW50ZXJlc3RlZCBwYXJ0eSBjYW4gbGlzdGVuCi0gICogKHN1Y2ggYXMgYSB3aXphcmQgaW4gdGhlIHJvbGUgb2YgYSBWaWV3ZXIpLgotICAqIEBwYXJhbSB0bWwgVGhlIGxpc3RlbmVyIHRvIGFkZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIgKCBFbGVtZW50TGlzdGVuZXIgbGlzdGVuZXIgKQotICB7Ci0gICAgZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIE1vZGVsIGdldE1vZGVsICgpCi0gIHsKLSAgICByZXR1cm4gZk1vZGVsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCAoKQotICB7Ci0gICAgcmV0dXJuIChmTW9kZWwgIT0gbnVsbCAmJiBmTW9kZWwuY29udGFpbnNFbGVtZW50KHRoaXMpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZSAoKQotICB7Ci0gICAgcmV0dXJuIGZNb2RlbC5yZW1vdmVFbGVtZW50KHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmUHJvcGVydGllcy5wdXQoUHJvcGVydHkuTkFNRSxuZXcgQmFzaWNQcm9wZXJ0eShQcm9wZXJ0eS5OQU1FLGZOYW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0gIC8qCi0gICogVGhlIGdldHRlciBmb3IgdGhlIE1VSUQKLSAgKiBUaGUgTVVJRCBpcyB0aGUgTW9kZWwgVW5pcXVlIElkZW50aWZpZXIsIG1hZGUgZnJvbSB0aGUgbmFtZSBhbmQgYW4KLSAgKiBhcHBlbmRlZCB1bmlxdWUgbnVtYmVyIAotICAqIEByZXR1cm4gU3RyaW5nIGEgdW5pcXVlIGlkIGZvciB0aGlzIGVsZW1lbnQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBtb2RlbCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNVUlEKCkKLSAgewotICAgIHJldHVybiBmTVVJRDsKLSAgfQotCi0gIC8qCi0gICoKLSAgKgotICAqLwotICBwdWJsaWMgaW50IGdldE51bWJlcklEKCkKLSAgewotICAgIFN0cmluZyBudW1iZXIgPSBnZXRNVUlEKCkuc3Vic3RyaW5nKGdldE5hbWUoKS5sZW5ndGgoKSk7ICAKLSAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChudW1iZXIpOwotICB9Ci0KLSAgLyoKLSAgKiBTZXQgdGhlIE1VSUQgd2hpY2ggd2FzIG1hZGUgYnkgdGhlIG1vZGVsCi0gICogU2hvdWxkIG9ubHkgYmUgc2V0dGFibGUgd2l0aGluIHRoaXMgZWxlbWVudAotICAqIFNldCBvbmNlIHVwb24gY3JlYXRpb24sIHlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lCi0gICogYnV0IHRoZSBpZCB3aWxsIHJlbWFpbiBjb25zdGFudC4KLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldE1VSUQoU3RyaW5nIE1VSUQpCi0gIHsKLSAgICBmTVVJRCA9IE1VSUQ7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkgKCBQcm9wZXJ0eSBwcm9wZXJ0eSApCi0gIHsKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpOwotICAgIFByb3BlcnR5IG9sZFByb3BlcnR5ID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICBmUHJvcGVydGllcy5wdXQocHJvcGVydHlOYW1lLHByb3BlcnR5KTsKLSAgICBpZiAob2xkUHJvcGVydHkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUFkZEV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5QWRkRXZlbnQodGhpcyxwcm9wZXJ0eSk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gZkxpc3RlbmVycy5lbGVtZW50cygpOwotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgICgoRWxlbWVudExpc3RlbmVyKWUubmV4dEVsZW1lbnQoKSkucHJvcGVydHlBZGRlZChldmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBPYmplY3Qgb2xkVmFsdWUgPSBvbGRQcm9wZXJ0eS5nZXRWYWx1ZSgpOwotICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLSAgICAgIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKG9sZFZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT0gbnVsbCB8fCAoIW9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMscHJvcGVydHksb2xkUHJvcGVydHkpOwotICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBmTGlzdGVuZXJzLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChFbGVtZW50TGlzdGVuZXIpZS5uZXh0RWxlbWVudCgpKS5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wZXJ0eS5OQU1FKSkgZk5hbWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUFzT2JqZWN0ICggU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSApCi0gIHsKLSAgICBzZXRQcm9wZXJ0eShuZXcgQmFzaWNQcm9wZXJ0eShuYW1lLHZhbHVlKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUFzU3RyaW5nICggU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gIHsKLSAgICBzZXRQcm9wZXJ0eShuZXcgQmFzaWNQcm9wZXJ0eShuYW1lLHZhbHVlKSk7Ci0gIH0KLQotICBwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICByZXR1cm4gKFByb3BlcnR5KWZQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlBc09iamVjdCAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIFByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eSA9PSBudWxsID8gbnVsbCA6IHByb3BlcnR5LmdldFZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUFzU3RyaW5nICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShuYW1lKTsKLSAgICByZXR1cm4gKHByb3BlcnR5ID09IG51bGwgPyBudWxsIDogcHJvcGVydHkuZ2V0VmFsdWVBc1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0aWVzICgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnRpZXMuZWxlbWVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNvbm5lY3QgKCBFbGVtZW50IHRhcmdldEVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUsIFN0cmluZyBpbmJvdW5kUmVsTmFtZSApCi0gIHsKLSAgICBpZiAoZk1vZGVsID09IG51bGwgfHwgZk1vZGVsICE9IHRhcmdldEVsZW1lbnQuZ2V0TW9kZWwoKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgRWxlbWVudCBzb3VyY2VFbGVtZW50ID0gdGhpczsKLSAgICBSZWwgb3V0Ym91bmRSZWwgPSBzb3VyY2VFbGVtZW50LmdldFJlbChvdXRib3VuZFJlbE5hbWUpOwotICAgIFJlbCBpbmJvdW5kUmVsID0gdGFyZ2V0RWxlbWVudC5nZXRSZWwoaW5ib3VuZFJlbE5hbWUpOwotICAgIENvbm5lY3Rpb25bXSBwYWlyID0gQmFzaWNDb25uZWN0aW9uLmNyZWF0ZVBhaXIob3V0Ym91bmRSZWwsdGFyZ2V0RWxlbWVudCxpbmJvdW5kUmVsLHNvdXJjZUVsZW1lbnQpOwotICAgIG91dGJvdW5kUmVsLmFkZENvbm5lY3Rpb24ocGFpcltCYXNpY0Nvbm5lY3Rpb24uT1VUQk9VTkRdKTsKLSAgICBpbmJvdW5kUmVsLmFkZENvbm5lY3Rpb24ocGFpcltCYXNpY0Nvbm5lY3Rpb24uSU5CT1VORF0pOwotICAgIFJlbEFkZEV2ZW50IGV2ZW50ID0gbmV3IFJlbEFkZEV2ZW50KHBhaXIpOwotICAgIEVudW1lcmF0aW9uIGVTb3VyY2UgPSBnZXRMaXN0ZW5lcnMoKTsKLSAgICBFbnVtZXJhdGlvbiBlVGFyZ2V0ID0gdGFyZ2V0RWxlbWVudC5nZXRMaXN0ZW5lcnMoKTsKLSAgICB3aGlsZSAoZVNvdXJjZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICAoKEVsZW1lbnRMaXN0ZW5lcillU291cmNlLm5leHRFbGVtZW50KCkpLnJlbEFkZGVkKGV2ZW50KTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoZVRhcmdldC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICAoKEVsZW1lbnRMaXN0ZW5lcillVGFyZ2V0Lm5leHRFbGVtZW50KCkpLnJlbEFkZGVkKGV2ZW50KTsKLSAgICB9Ci0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCAoIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgU3RyaW5nIG91dGJvdW5kUmVsTmFtZSApCi0gIHsKLSAgICByZXR1cm4gZGlzY29ubmVjdCh0YXJnZXRFbGVtZW50LGdldFJlbChvdXRib3VuZFJlbE5hbWUpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RSZWwgKCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lICkKLSAgewotICAgIHJldHVybiBkaXNjb25uZWN0UmVsKGdldFJlbChvdXRib3VuZFJlbE5hbWUpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RBbGwgKCkKLSAgewotICAgIGlmIChmTW9kZWwgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIEVudW1lcmF0aW9uIGUgPSBmUmVscy5lbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFJlbCByZWwgPSAoUmVsKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGRpc2Nvbm5lY3RSZWwocmVsKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RWxlbWVudHMgKCBTdHJpbmcgcmVsTmFtZSApCi0gIHsKLSAgICByZXR1cm4gZ2V0UmVsKHJlbE5hbWUpLmdldFRhcmdldEVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mRWxlbWVudHMgKCBTdHJpbmcgcmVsTmFtZSApCi0gIHsKLSAgICByZXR1cm4gZ2V0UmVsKHJlbE5hbWUpLmdldE51bWJlck9mVGFyZ2V0RWxlbWVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBSZWwgZ2V0UmVsICggU3RyaW5nIHJlbE5hbWUgKQotICB7Ci0gICAgUmVsIHJlbCA9IChSZWwpZlJlbHMuZ2V0KHJlbE5hbWUpOwotICAgIGlmIChyZWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWwgPSBuZXcgQmFzaWNSZWwocmVsTmFtZSx0aGlzKTsKLSAgICAgIGZSZWxzLnB1dChyZWxOYW1lLHJlbCk7Ci0gICAgfQotICAgIHJldHVybiByZWw7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UmVscyAoKQotICB7Ci0gICAgcmV0dXJuIGZSZWxzLmVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TGlzdGVuZXJzKCkKLSAgewotICAgIHJldHVybiBmTGlzdGVuZXJzLmVsZW1lbnRzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjb25uZWN0ICggRWxlbWVudCB0YXJnZXRFbGVtZW50LCBSZWwgb3V0Ym91bmRSZWwgKQotICB7Ci0gICAgaWYgKGZNb2RlbCA9PSBudWxsIHx8IGZNb2RlbCAhPSB0YXJnZXRFbGVtZW50LmdldE1vZGVsKCkgfHwgb3V0Ym91bmRSZWwgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIENvbm5lY3Rpb24gb3V0Ym91bmRDb25uZWN0aW9uID0gb3V0Ym91bmRSZWwuZ2V0Q29ubmVjdGlvblRvKHRhcmdldEVsZW1lbnQpOwotICAgIGlmIChvdXRib3VuZENvbm5lY3Rpb24gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIENvbm5lY3Rpb24gaW5ib3VuZENvbm5lY3Rpb24gPSBvdXRib3VuZENvbm5lY3Rpb24uZ2V0T3Bwb3NpbmdDb25uZWN0aW9uKCk7Ci0gICAgUmVsUmVtb3ZlRXZlbnQgZXZlbnQgPSBuZXcgUmVsUmVtb3ZlRXZlbnQobmV3IENvbm5lY3Rpb24gW10ge291dGJvdW5kQ29ubmVjdGlvbixpbmJvdW5kQ29ubmVjdGlvbn0pOwotICAgICAgRW51bWVyYXRpb24gZSA9IGZMaXN0ZW5lcnMuZWxlbWVudHMoKTsKLSAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICAoKEVsZW1lbnRMaXN0ZW5lcillLm5leHRFbGVtZW50KCkpLnJlbFJlbW92ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgRW51bWVyYXRpb24gZVRhcmdldCA9IHRhcmdldEVsZW1lbnQuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgd2hpbGUgKGVUYXJnZXQuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgKChFbGVtZW50TGlzdGVuZXIpZVRhcmdldC5uZXh0RWxlbWVudCgpKS5yZWxSZW1vdmVkKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBSZWwgaW5ib3VuZFJlbCA9IGluYm91bmRDb25uZWN0aW9uLmdldFJlbCgpOwotICAgIGJvb2xlYW4gZG9uZSA9IG91dGJvdW5kUmVsLnJlbW92ZUNvbm5lY3Rpb24ob3V0Ym91bmRDb25uZWN0aW9uKTsKLSAgICBpbmJvdW5kUmVsLnJlbW92ZUNvbm5lY3Rpb24oaW5ib3VuZENvbm5lY3Rpb24pOwotICAgIHJldHVybiBkb25lOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzY29ubmVjdFJlbCAoIFJlbCBvdXRib3VuZFJlbCApCi0gIHsKLSAgICBpZiAoZk1vZGVsID09IG51bGwgfHwgb3V0Ym91bmRSZWwgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIEVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBFbGVtZW50W291dGJvdW5kUmVsLmdldE51bWJlck9mVGFyZ2V0RWxlbWVudHMoKV07Ci0gICAgaW50IGkgPSAwOwotICAgIEVudW1lcmF0aW9uIGUgPSBvdXRib3VuZFJlbC5nZXRUYXJnZXRFbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIGVsZW1lbnRzW2krK10gPSAoRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgfQotICAgIHdoaWxlIChpLS0gPiAwKQotICAgIHsKLSAgICAgIGRpc2Nvbm5lY3QoZWxlbWVudHNbaV0sb3V0Ym91bmRSZWwpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkKLSAgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjNiNDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY01vZGVsIGltcGxlbWVudHMgTW9kZWwKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIFN0cmluZyBmTmFtZTsKLSAgcHJpdmF0ZSBIYXNodGFibGUgZkVsZW1lbnRzOwotICBwcml2YXRlIEVsZW1lbnQgZlJvb3Q7Ci0gIC8vVGhpcyBpcyB1c2VkIGJ5IHRoZSBNVUlECi0gIHByaXZhdGUgaW50IGZVbmlxdWVOdW1iZXJDb3VudGVyOwotCi0gIHB1YmxpYyBCYXNpY01vZGVsICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICAgIGZFbGVtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmUm9vdCA9IG51bGw7Ci0gICAgZlVuaXF1ZU51bWJlckNvdW50ZXIgPSAwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIGZOYW1lOwotICB9Ci0KLQotICAvKgotICAqIHNpbXBsZSBjb3VudGVyIHRoYXQgaW5jcmVtZW50cyBlYWNoIGNhbGwgCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0VW5pcXVlTnVtYmVyKCkKLSAgewotICAgIGZVbmlxdWVOdW1iZXJDb3VudGVyKys7Ci0gICAgcmV0dXJuIGZVbmlxdWVOdW1iZXJDb3VudGVyOwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIHdpbGwgdXNlIGEgdW5pcXVlIG51bWJlciBhbmQgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIG5hbWUgCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIG9mIHRoZSBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgTVVJRAotICAqLwotICBwdWJsaWMgU3RyaW5nIG1ha2VNVUlEKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIG51bSA9IFN0cmluZy52YWx1ZU9mKGdldFVuaXF1ZU51bWJlcigpKTsKLSAgICBTdHJpbmcgbXVpZCA9IG5hbWUgKyBudW07Ci0gICAgcmV0dXJuIG11aWQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIHNldFJvb3RFbGVtZW50ICggRWxlbWVudCByb290ICkKLSAgewotICAgIGlmIChyb290LmdldE1vZGVsKCkgPT0gbnVsbCkKLSAgICAgIGFkZEVsZW1lbnQocm9vdCk7Ci0gICAgZWxzZSBpZiAocm9vdC5nZXRNb2RlbCgpICE9IHRoaXMpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZlJvb3QgPSByb290OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQgKCkKLSAgewotICAgIGlmIChmUm9vdCA9PSBudWxsKSBmUm9vdCA9IGdldEZpcnN0RWxlbWVudCgpOwotICAgIHJldHVybiBmUm9vdDsKLSAgfQotCi0KLSAgLyoqCi0gICogR2V0IHRoZSBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBuYW1lCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IAotICAqIEByZXR1cm4gVmVjdG9yIGEgdmVjdG9yIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGlzIG5hbWUKLSAgKiBUaGVzZSBlbGVtZW50cyBtYXkgYmUgb2YgZGlmZmVyZW50IHR5cGVzCi0gICoqLwotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0RWxlbWVudHNCeU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIEVudW1lcmF0aW9uIGUgPSBmRWxlbWVudHMua2V5cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgdmVjdG9yLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiB2ZWN0b3I7Ci0gIH0KLQotIAotCi0gIHB1YmxpYyBib29sZWFuIGFkZEVsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TW9kZWwoKSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgZkVsZW1lbnRzLnB1dChlbGVtZW50LGVsZW1lbnQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXRNb2RlbCgpICE9IHRoaXMpIHJldHVybiBmYWxzZTsKLSAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICBpZiAoZlJvb3QgPT0gZWxlbWVudCkgZlJvb3QgPSBudWxsOwotICAgIHJldHVybiAoZkVsZW1lbnRzLnJlbW92ZShlbGVtZW50KSA9PSBlbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50cy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnRzLnNpemUoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpOwotICB9Ci0KLSAgcHJpdmF0ZSBFbGVtZW50IGdldEZpcnN0RWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKCk7Ci0gICAgcmV0dXJuIChlLmhhc01vcmVFbGVtZW50cygpID8gKEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2MWE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotcHVibGljIGNsYXNzIEJhc2ljUHJvcGVydHkgaW1wbGVtZW50cyBQcm9wZXJ0eQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIE9iamVjdCBmVmFsdWU7Ci0KLSAgcHVibGljIEJhc2ljUHJvcGVydHkgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBmTmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgQmFzaWNQcm9wZXJ0eSAoIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUgKQotICB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICAgIGZWYWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhpcyA8Y29kZT5Qcm9wZXJ0eTwvY29kZT4uCi0gICogUHJvcGVydHkga2V5IGFuZCB2YWx1ZSByZWZlcmVuY2VzIGFyZSBjbG9uZWQsCi0gICogYnV0IHRoZSB2YWx1ZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCi0gICogQHJldHVybiBQcm9wZXJ0eSBBIG5ldyBQcm9wZXJ0eS4KLSAgKi8KLSAgcHVibGljIFByb3BlcnR5IHNoYWxsb3dDbG9uZSAoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCYXNpY1Byb3BlcnR5KGZOYW1lLGZWYWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlICggT2JqZWN0IHZhbHVlICkKLSAgewotICAgIGZWYWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSAoKQotICB7Ci0gICAgcmV0dXJuIGZWYWx1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlQXNTdHJpbmcgKCBTdHJpbmcgdmFsdWUgKQotICB7Ci0gICAgZlZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcgKCkKLSAgewotICAgIHJldHVybiAoZlZhbHVlICE9IG51bGwgPyBmVmFsdWUudG9TdHJpbmcoKSA6IG51bGwpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljUmVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1JlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTMzNmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljUmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEJhc2ljUmVsIGltcGxlbWVudHMgUmVsCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0gIHByaXZhdGUgRWxlbWVudCBmU291cmNlRWxlbWVudDsKLSAgcHJpdmF0ZSBWZWN0b3IgZkNvbm5lY3Rpb25zOwotCi0gIHB1YmxpYyBCYXNpY1JlbCAoIFN0cmluZyBuYW1lLCBFbGVtZW50IHNvdXJjZUVsZW1lbnQgKQotICB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICAgIGZTb3VyY2VFbGVtZW50ID0gc291cmNlRWxlbWVudDsKLSAgICBmQ29ubmVjdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldFNvdXJjZUVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmU291cmNlRWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRUYXJnZXRFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBFbGVtZW50RW51bWVyYXRpb24oZkNvbm5lY3Rpb25zLmVsZW1lbnRzKCkpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlRhcmdldEVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZkNvbm5lY3Rpb25zLnNpemUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZENvbm5lY3Rpb24gKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24gKQotICB7Ci0gICAgZkNvbm5lY3Rpb25zLmFkZEVsZW1lbnQoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25uZWN0aW9uICggQ29ubmVjdGlvbiBjb25uZWN0aW9uICkKLSAgewotICAgIHJldHVybiBmQ29ubmVjdGlvbnMucmVtb3ZlRWxlbWVudChjb25uZWN0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb25UbyAoIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCApCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZkNvbm5lY3Rpb25zLmVsZW1lbnRzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgQ29ubmVjdGlvbiBjID0gKENvbm5lY3Rpb24pZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKGMuZ2V0RWxlbWVudCgpID09IHRhcmdldEVsZW1lbnQpIHJldHVybiBjOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkKLSAgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIEVsZW1lbnRFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uCi0gIHsKLSAgICBwcml2YXRlIEVudW1lcmF0aW9uIGZDb25uZWN0aW9uRW51bWVyYXRpb247Ci0KLSAgICBwdWJsaWMgRWxlbWVudEVudW1lcmF0aW9uICggRW51bWVyYXRpb24gY29ubmVjdGlvbkVudW1lcmF0aW9uICkKLSAgICB7Ci0gICAgICBmQ29ubmVjdGlvbkVudW1lcmF0aW9uID0gY29ubmVjdGlvbkVudW1lcmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cyAoKQotICAgIHsKLSAgICAgIHJldHVybiBmQ29ubmVjdGlvbkVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQgKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChDb25uZWN0aW9uKWZDb25uZWN0aW9uRW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Db25uZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Db25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjI3MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBjb25uZWN0aW9uIHRoYXQgdGllcyBhIFJlbCB0byBhIE5vZGUuCi0qIE5vcm1hbGx5IENvbm5lY3Rpb24gb2JqZWN0cyBhcmUgbWFudWZhY3R1cmVkIGFuZCBtYW5hZ2VkIHdpdGhpbiB0aGUKLSogZGVyaXZlZCBjbGFzc2VzIG9mIHRoZSBNb2RlbCBmcmFtZXdvcmssIGFuZCBhcmUgbm90IG1hbmlwdWxhdGVkIGJ5Ci0qIHRoZSBjYWxsZXIgZGlyZWN0bHkuCi0qLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgUmVsIHRoYXQgb3ducyB0aGlzIGNvbm5lY3Rpb24uCi0gICogQHJldHVybiBSZWwgVGhlIFJlbCB0aGF0IG93bnMgdGhpcyBjb25uZWN0aW9uLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCwgdGhhdCBpcywgYSBDb25uZWN0aW9uCi0gICogY2Fubm90IGV4aXN0IHdpdGhvdXQgYSBSZWwgdG8gb3duIGl0LgotICAqLwotICBwdWJsaWMgUmVsIGdldFJlbCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBOb2RlIHRoYXQgdGhpcyBjb25uZWN0aW9uIHBvaW50cyB0by4KLSAgKiBAcmV0dXJuIE5vZGUgVGhlIE5vZGUgdGhpcyBjb25uZWN0aW9uIHBvaW50cyB0by4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsIHRoYXQgaXMsIGEgQ29ubmVjdGlvbgotICAqIGNhbm5vdCBleGlzdCB3aXRob3V0IGEgTm9kZSB0byBwb2ludCB0by4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBvcHBvc2luZyBjb25uZWN0aW9uIHRvIHRoaXMgY29ubmVjdGlvbi4KLSAgKiBDb25uZWN0aW9uIG9iamVjdHMgYWx3YXlzIGV4aXN0IGluIHBhaXJzLCB0aGF0IGlzLAotICAqIGlmIG5vZGUgIlBhcmVudCIgaGFzIGEgcmVsYXRpb25zaGlwIG5hbWVkICJDaGlsZHJlbiIKLSAgKiBjb250YWluaW5nIGEgY29ubmVjdGlvbiB0byBub2RlICJDaGlsZCIsIHRoZW4gdGhlcmUKLSAgKiBtdXN0IGV4aXN0IGFuIG9wcG9zaW5nIGNvbm5lY3Rpb24gZnJvbSAiQ2hpbGQiIHRvCi0gICogIlBhcmVudCIgaW4gc29tZSByZWxhdGlvbnNoaXAgb2YgIkNoaWxkIiAoZm9yIGV4YW1wbGUsCi0gICogaW4gYSByZWxhdGlvbnNoaXAgY2FsbGVkICJQYXJlbnRzIikuCi0gICogQHJldHVybiBDb25uZWN0aW9uIFRoZSBvcHBvc2luZyBjb25uZWN0aW9uLgotICAqIEFzIGEgZ2VuZXJhbCBydWxlLCB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwuCi0gICogSXQgbWF5IG9ubHkgcmV0dXJuIG51bGwgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUgcGFpcgotICAqIG9mIGNvbm5lY3Rpb25zLgotICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRPcHBvc2luZ0Nvbm5lY3Rpb24gKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzNzIxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gYmUgbWFuYWdlZCBieSBhIE1vZGVsLgotKiBFdmVyeSBlbGVtZW50IGhhcyBhIG5hbWUsIGEgc2V0IG9mIHByb3BlcnRpZXMsIGFuZCBhIHNldCBvZiByZWxhdGlvbnNoaXBzCi0qIHRvIG90aGVyIGVsZW1lbnRzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICogb2YgdGhlIHNhbWUgY2xhc3MgYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbW9kZWwsCi0gICogYnV0IHdpdGggbm8gUHJvcGVydGllcywgUmVscyBvciBMaXN0ZW5lcnMgZXhjZXB0IGZvcgotICAqIHRoZSB7QGxpbmsgUHJvcGVydHkjTkFNRSBOQU1FfSBwcm9wZXJ0eS4KLSAgKiBAcmV0dXJuIE9iamVjdCBBIG5ldyBFbGVtZW50LgotICAqLwotICBwdWJsaWMgRWxlbWVudCBzaGFsbG93Q2xvbmUgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgPGNvZGU+RWxlbWVudDwvY29kZT4KLSAgKiBvZiB0aGUgc2FtZSBjbGFzcyBhbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBtb2RlbAotICAqIGFuZCB3aXRoIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRWxlbWVudCdzIFByb3BlcnRpZXMuCi0gICogVGhlIFJlbHMgYW5kIExpc3RlbmVycyBhcmUgbm90IGNsb25lZC4KLSAgKiBAcmV0dXJuIEVsZW1lbnQgQSBuZXcgRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgZGVlcENsb25lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1vZGVsIHRoaXMgZWxlbWVudCBiZWxvbmdzIHRvLCBvciBudWxsIGlmIHRoZSBlbGVtZW50Ci0gICogaGFzIG5vdCBiZWVuIGFkZGVkIHRvIGEgbW9kZWwuIFNlZSBhbHNvIHtAbGluayAjaXNWYWxpZCBpc1ZhbGlkKCl9LgotICAqIEByZXR1cm4gTW9kZWwgVGhlIG1vZGVsIHRoaXMgZWxlbWVudCBiZWxvbmdzIHRvLCBvciBudWxsIGlmIG5vbmUuCi0gICovCi0gIHB1YmxpYyBNb2RlbCBnZXRNb2RlbCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBlbGVtZW50IGJlbG9uZ3MgdG8gYSBtb2RlbC4KLSAgKiBTZWUgYWxzbyB7QGxpbmsgI2dldE1vZGVsIGdldE1vZGVsKCl9LgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgZWxlbWVudCBiZWxvbmdzIHRvIGEgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCk7Ci0KLSAgLyoqCi0gICogUmVtb3ZlcyB0aGlzIGVsZW1lbnQgZnJvbSB0aGUgbW9kZWwgdG8gd2hpY2ggaXQgY3VycmVudGx5IGJlbG9uZ3MuCi0gICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwge0BsaW5rICNnZXRNb2RlbCBnZXRNb2RlbCgpfSB3aWxsIHJldHVybgotICAqIG51bGwgYW5kIHtAbGluayAjaXNWYWxpZCBpc1ZhbGlkKCl9IHdpbGwgcmV0dXJuIGZhbHNlLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBlbGVtZW50IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tCi0gICogaXRzIG1vZGVsLiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGJlbG9uZwotICAqIHRvIGFueSBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlICgpOwotCi0gIC8qKgotICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50IGFuZCB1cGRhdGVzIHRoZSAibmFtZSIgcHJvcGVydHkuCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byBzZXROYW1lKCkuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lICggU3RyaW5nIG5hbWUgKTsKLQotICAvKioKLSAgKgotICAqLwotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciAoIEVsZW1lbnRMaXN0ZW5lciBsaXN0ZW5lciApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIEFkZHMgb3Igc2V0cyBhIHByb3BlcnR5IG9mIHRoaXMgZWxlbWVudC4KLSAgKiBQcm9wZXJ0aWVzIHNldCB1c2luZyB0aGlzIG1ldGhvZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIGVpdGhlcgotICAqIHtAbGluayAjZ2V0UHJvcGVydHkgZ2V0UHJvcGVydHkoKX0gb3IKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5QXNPYmplY3QgZ2V0UHJvcGVydHlBc09iamVjdCgpfS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEFueSBwcmV2aW91cyBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgcmVwbGFjZWQuCi0gICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBzZXQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5ICggUHJvcGVydHkgcHJvcGVydHkgKTsKLQotICAvKioKLSAgKiBBZGRzIG9yIHNldHMgYSBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQuCi0gICogUHJvcGVydGllcyBzZXQgdXNpbmcgdGhpcyBtZXRob2QgY2FuIGJlIHJldHJpZXZlZCB1c2luZyBlaXRoZXIKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5IGdldFByb3BlcnR5KCl9IG9yCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eUFzT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QoKX0uCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfS4KLSAgKiBBbnkgcHJldmlvdXMgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIHJlcGxhY2VkLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCi0gICogQHBhcmFtIHZhbHVlIFRoZSBPYmplY3QgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlBc09iamVjdCAoIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUgKTsKLQotICAvKioKLSAgKiBBZGRzIG9yIHNldHMgYSBTdHJpbmcgcHJvcGVydHkgb2YgdGhpcyBlbGVtZW50LgotICAqIFByb3BlcnRpZXMgc2V0IHVzaW5nIHRoaXMgbWV0aG9kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgZWl0aGVyCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eSBnZXRQcm9wZXJ0eSgpfSwKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5QXNPYmplY3QgZ2V0UHJvcGVydHlBc09iamVjdCgpfSBvcgotICAqIHtAbGluayAjZ2V0UHJvcGVydHlBc1N0cmluZyBnZXRQcm9wZXJ0eUFzU3RyaW5nKCl9LgotICAqIEV2ZXJ5IGVsZW1lbnQgaW5jbHVkZXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIChzZWUgUHJvcGVydHkuTkFNRSkKLSAgKiB3aG9zZSB2YWx1ZSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgcGFzc2VkIGludG8ge0BsaW5rICNzZXROYW1lIHNldE5hbWUoKX0uCi0gICogQW55IHByZXZpb3VzIHByb3BlcnR5IHdpdGggdGhlIHNhbWUgbmFtZSBpcyByZXBsYWNlZC4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgotICAqIEBwYXJhbSB2YWx1ZSBUaGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5QXNTdHJpbmcgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXR1cm4uCi0gICogQHJldHVybiBQcm9wZXJ0eSBUaGUgcHJvcGVydHksIG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5ICggU3RyaW5nIG5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBPYmplY3QgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsCi0gICogaWYgdGhlcmUgaXMgbm9uZS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXR1cm4uCi0gICogQHJldHVybiBPYmplY3QgVGhlIHByb3BlcnR5IHZhbHVlIGFzIGFuIE9iamVjdCwgb3IgbnVsbCBpZiBub25lLgotICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QgKCBTdHJpbmcgbmFtZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwKLSAgKiBpZiB0aGVyZSBpcyBub25lLgotICAqIEV2ZXJ5IGVsZW1lbnQgaW5jbHVkZXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIChzZWUgUHJvcGVydHkuTkFNRSkKLSAgKiB3aG9zZSB2YWx1ZSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgcGFzc2VkIGludG8ge0BsaW5rICNzZXROYW1lIHNldE5hbWUoKX0uCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHVybi4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgcHJvcGVydHkgdmFsdWUgYXMgYSBTdHJpbmcsIG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUFzU3RyaW5nICggU3RyaW5nIG5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgZWxlbWVudC4KLSAgKiBUaGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIHByb3BlcnR5IHRoYXQgY2FycmllcyB0aGUKLSAgKiBuYW1lIG9mIHRoaXMgZWxlbWVudCAoc2VlIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9KS4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgZWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFByb3BlcnRpZXMgKCk7Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBlbGVtZW50IGFuZCBhbm90aGVyLgotICAqIEJvdGggcmVsYXRpb25zaGlwcyBhcmUgaWRlbnRpZmllZCBieSBuYW1lcy4gVGhlIG5hbWVzIG9mIGFsbCB0aGUKLSAgKiBvdXRib3VuZCByZWxhdGlvbnNoaXBzIG9mIGEgZWxlbWVudCBtdXN0IGJlIG11dHVhbGx5IHVuaXF1ZS4KLSAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjb25uZWN0IHRvLgotICAqIEBwYXJhbSBvdXRib3VuZFJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCB0byBjb250YWluIHRoZQotICAqIGNvbm5lY3Rpb24gdG8gdGhlIGVsZW1lbnQuCi0gICogQHBhcmFtIGluYm91bmRSZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgdG8gY29udGFpbiB0aGUKLSAgKiBpbnZlcnNlIGNvbm5lY3Rpb24gYmFjayB0byB0aGlzIGVsZW1lbnQuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCi0gICogQm90aCBlbGVtZW50cyBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBtb2RlbCwgb3RoZXIgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGNvbm5lY3QgKCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUsIFN0cmluZyBpbmJvdW5kUmVsTmFtZSApOwotCi0gIC8qKgotICAqIERpc21hbnRsZXMgdGhlIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBlbGVtZW50IGluIGEgZ2l2ZW4gcmVsYXRpb25zaGlwLgotICAqIFRoZSBpbnZlcnNlIGNvbm5lY3Rpb24gaXMgYWxzbyBhdXRvbWF0aWNhbGx5IGRpc21hbnRsZWQuCi0gICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gZGlzY29ubmVjdCBmcm9tLgotICAqIEBwYXJhbSBvdXRib3VuZFJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCBjb250YWluaW5nCi0gICogdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGVsZW1lbnQuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCi0gICogQm90aCBlbGVtZW50cyBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBtb2RlbCwgb3RoZXIgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICogSWYgdGhlIGVsZW1lbnRzIGFyZSBub3QgY29ubmVjdGVkIHRocm91Z2ggdGhlIGdpdmVuIHJlbGF0aW9uc2hpcCwgdGhlbgotICAqIGZhbHNlIGlzIHJldHVybmVkLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0ICggRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lICk7Ci0KLSAgLyoqCi0gICogRGlzbWFudGxlcyB0aGUgY29ubmVjdGlvbiB0byBhbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIHJlbGF0aW9uc2hpcC4KLSAgKiBUaGUgaW52ZXJzZSBjb25uZWN0aW9ucyBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IGRpc21hbnRsZWQuCi0gICogQHBhcmFtIG91dGJvdW5kUmVsTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFsbCBjb25uZWN0aW9ucyBhcmUgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCi0gICogVGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBiZWxvbmcgdG8gYSBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdFJlbCAoIFN0cmluZyBvdXRib3VuZFJlbE5hbWUgKTsKLQotICAvKioKLSAgKiBEaXNtYW50bGVzIGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoaXMgZWxlbWVudC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBhbGwgY29ubmVjdGlvbnMgYXJlIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgYmVsb25nIHRvIGEgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RBbGwgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgZWxlbWVudHMKLSAgKiBjb25uZWN0ZWQgdGhydSB0aGUgZ2l2ZW4gcmVsYXRpb25zaGlwLgotICAqIEBwYXJhbSByZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBUaGUgZWxlbWVudHMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbGVtZW50cyAoIFN0cmluZyByZWxOYW1lICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBnaXZlbiByZWxhdGlvbnNoaXAuCi0gICogQHBhcmFtIHJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlLgotICAqLwotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRMaXN0ZW5lcnMoKTsKLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mRWxlbWVudHMgKCBTdHJpbmcgcmVsTmFtZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHJlbGF0aW9uc2hpcCBvYmplY3Qgb2YgdGhlIGdpdmVuIG5hbWUuCi0gICogQHBhcmFtIHJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAgKiBAcmV0dXJuIGludCBUaGUgcmVsYXRpb25zaGlwLiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwuCi0gICogSW4gb3RoZXIgd29yZHMsIGFueSByZWZlcmVuY2UgdG8gYSByZWxhdGlvbnNoaXAgbmFtZSBhdXRvbWF0aWNhbGx5Ci0gICogYnJpbmdzIGEgY29ycmVzcG9uZGluZyBSZWwgb2JqZWN0IGludG8gZXhpc3RlbmNlLiBDYXJlbGVzcyBuYW1pbmcKLSAgKiBtYXkgcmVzdWx0IGluIHRoZSB7QGxpbmsgI2dldFJlbHMgZ2V0UmVscygpfSBtZXRob2QgcmV0dXJuaW5nIGFuIGVudW1lcmF0aW9uIG9mCi0gICogbW9yZSByZWxhdGlvbnNoaXBzIHRoYW4gd291bGQgYmUgbWVhbmluZ2Z1bCwgZWZmaWNpZW50IG9yIHVzZWZ1bC4KLSAgKi8KLSAgcHVibGljIFJlbCBnZXRSZWwgKCBTdHJpbmcgcmVsTmFtZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIGtub3duIHJlbGF0aW9uc2hpcHMuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBUaGUgb3V0Ym91bmQgcmVsYXRpb25zaGlwcyBvZiB0aGUgZWxlbWVudC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRSZWxzICgpOwotCi0KLSAgLyoKLSAgKiBUaGVyZSBpcyBhIG5lZWQgc29tZXRpbWVzIGZvciBlYWNoIGVsZW1lbnQgaW4gYSBtb2RlbCB0byBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIuCi0gICogTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBsZWZ0IHRvIGEgbmFtZSwgYnV0IHNpbmNlIHRoZSBlbGVtZW50IG1ha2VyIGdpdmVzIGl0IGl0cyBuYW1lCi0gICogdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBhIG1vZGVsIGNvdWxkIGhhdmUgdHdvIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZS4gSWYgdGhleSAKLSAgKiBhcmUgdGhlIHNhbWUgZWxlbWVudCB0eXBlIHRoZW4gdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIGRpZmZlcmVuY2lhdGUgYmV0d2VlbiB0aGUgdHdvLgotICAqIFRoZSBmb2xsb3dpbmcgZ2V0dGVyIGFuZCBzZXR0ZXIgd2lsbCBwcm92aWRlIGEgdW5pcXVlIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciB3aWxsIGJlIGtub3duIAotICAqIGFzIHRoZSBtdWlkIG9yIE1vZGVsIFVuaXF1ZSBJZGVudGlmaWVyLiBVbmxpa2UgYSB1dWlkIGl0IHdpbGwgb25seSBiZSBhc3N1cmVkIHVuaXF1ZW5lc3MgCi0gICogd2l0aGluIGl0cyBvd24gbW9kZWwuIFRoZSBpbnRlbnRpb24gaXMgdG8gdXNlIGEgdW5pcXVlIG51bWJlciBhcHBlbmRlZCB0byB0aGUgZW5kIAotICAqIG9mIHRoZSBuYW1lLgotICAqIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGdldHRlcgotICAqIEByZXR1cm4gU3RyaW5nIHRoZSB1bmlxdWUgaWRlbnRpZmllcgotICAqLwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TVVJRCgpOwotICAKLSAgCi0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwY2ZkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBUaGlzIGlzIHdoZXJlIHdlIHN0b3JlIGFsbCB0aGUgc3RhdGUgZGF0YSB0aGF0IHZhcmlvdXMgVUlzCi0qIChzdWNoIGFzIHRoZSBOZXdXU0RMQ3JlYXRpb25XaXphcmQpIGNhcHR1cmUgZnJvbSB0aGUgdXNlcgotKiBhbmQgdGhlbiBuZWVkIHRvIHByb2Nlc3MuCi0qLwotcHVibGljIGNsYXNzIEVsZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgRWxlbWVudExpc3RlbmVyCi17Ci0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlBZGRlZCAoIFByb3BlcnR5QWRkRXZlbnQgZXZlbnQgKQotICB7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGluIHRoZSBtb2RlbCBjaGFuZ2VzLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5LCBvbGQgdmFsdWUKLSAgKiBhbmQgbmV3IHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQgKCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpbiB0aGUgbW9kZWwgaXMgcmVtb3ZlZC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgb2xkIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQgKCBQcm9wZXJ0eVJlbW92ZUV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCByZWxBZGRlZCAoIFJlbEFkZEV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkICggUmVsUmVtb3ZlRXZlbnQgZXZlbnQgKQotICB7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4MTllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB3aGVyZSB3ZSBzdG9yZSBhbGwgdGhlIHN0YXRlIGRhdGEgdGhhdCB2YXJpb3VzIFVJcwotKiAoc3VjaCBhcyB0aGUgTmV3V1NETENyZWF0aW9uV2l6YXJkKSBjYXB0dXJlIGZyb20gdGhlIHVzZXIKLSogYW5kIHRoZW4gbmVlZCB0byBwcm9jZXNzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudExpc3RlbmVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUFkZGVkICggUHJvcGVydHlBZGRFdmVudCBldmVudCApOwotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaW4gdGhlIG1vZGVsIGNoYW5nZXMuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHksIG9sZCB2YWx1ZQotICAqIGFuZCBuZXcgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZCAoIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgKTsKLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGluIHRoZSBtb2RlbCBpcyByZW1vdmVkLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCBvbGQgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZCAoIFByb3BlcnR5UmVtb3ZlRXZlbnQgZXZlbnQgKTsKLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHJlbEFkZGVkICggUmVsQWRkRXZlbnQgZXZlbnQgKTsKLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQgKCBSZWxSZW1vdmVFdmVudCBldmVudCApOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Nb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMjk3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBzaW1wbGUgZGF0YSBtb2RlbCBjb25zaXN0aW5nIG9mCi0qIGEgbmV0d29yayBvZiBuYW1lZCBub2RlcyAoY2xhc3MgTm9kZSkuIEV2ZXJ5IG5vZGUgY2FycmllcyBhIHNldAotKiBvZiBuYW1lZCBwcm9wZXJ0aWVzIChjbGFzcyBQcm9wZXJ0eSkuIE5vZGVzIGFyZSBpbnRlcnJlbGF0ZWQgYnkKLSogcmVsYXRpb25zaGlwcyAoY2xhc3MgUmVsKSBhbmQgY29ubmVjdGlvbnMgKGNsYXNzIENvbm5lY3Rpb24pLgotKiBFYWNoIE1vZGVsIGtlZXBzIGEgcmVnaXN0cnkgb2YgYWxsIG9mIGl0cyBub2RlcywgYW5kIGtlZXBzIGEKLSogcmVmZXJlbmNlIHRvIG9uZSAicm9vdCIgbm9kZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnRpbmcKLSogcG9pbnQgZm9yIG5hdmlnYXRpb24uCi0qLwotcHVibGljIGludGVyZmFjZSBNb2RlbAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG1vZGVsLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2RlbC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICk7Ci0KLSAgLyoqCi0gICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgbW9kZWwuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIG5hbWUgb2YgdGhlIG1vZGVsLiBUaGlzIG11c3Qgbm90IGJlIG51bGwuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotICAvKioKLSAgKiBTZXRzIGEgbm9kZSBhcyB0aGUgcm9vdCBvZiB0aGUgbW9kZWwuIElmIHRoZSBub2RlIGRvZXMgbm90Ci0gICogYmVsb25nIHRvIGEgbW9kZWwsIHRoZW4gaXQgaXMgYWRkZWQgYXV0b21hdGljYWxseS4gSWYgdGhlCi0gICogbm9kZSBhbHJlYWR5IGJlbG9uZ3MgdG8gYW5vdGhlciBtb2RlbCwgdGhlbiB0aGUgcm9vdCBub2RlCi0gICogaXMgbm90IHNldCBhbmQgbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICogQHBhcmFtIHJvb3QgVGhlIG5vZGUgdG8gc2V0IGFzIHRoZSByb290LiBUaGUgbm9kZSBtdXN0Ci0gICogYmVsb25nIGVpdGhlciB0byB0aGlzIG1vZGVsIG9yIHRvIG5vIG1vZGVsLiBUaGlzIG11c3QKLSAgKiBub3QgYmUgbnVsbC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgbm9kZSB3YXMgc2V0IGFzIHRoZSByb290LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIG5vZGUgYWxyZWFkeSBiZWxvbmdzCi0gICogdG8gYW5vdGhlciBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0Um9vdEVsZW1lbnQgKCBFbGVtZW50IHJvb3QgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSByb290IG5vZGUuIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGEgbm9kZQotICAqIGV4Y2VwdCBvbiBhbiBlbXB0eSBNb2RlbC4gSWYgc2V0Um9vdE5vZGUoKSBoYXMgbm90IGJlZW4KLSAgKiBjYWxsZWQsIG9yIGlmIHRoZSBsYXN0IHJvb3Qgbm9kZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbCwKLSAgKiB0aGVuIHRoZSBtZXRob2Qgd2lsbCBzZWxlY3QgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgbm9kZSBhcwotICAqIHRoZSByb290LiBUaGlzIG1ldGhvZCB3aWxsIGNvbnNpc3RlbnRseSByZXR1cm4gdGhlIHNhbWUgbm9kZQotICAqIHVudGlsIGVpdGhlcgotICAqIChhKSBzZXRSb290Tm9kZSgpIGlzIGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IG5vZGUgb3IKLSAgKiAoYikgcmVtb3ZlTm9kZSgpIGlzIGNhbGxlZCB0byByZW1vdmUgdGhlIG5vZGUgZnJvbSB0aGUgbW9kZWwuCi0gICogQHJldHVybiBOb2RlIFRoZSBjdXJyZW50IHJvb3Qgbm9kZSwgb3IgbnVsbCBpZiB0aGUgbW9kZWwgaXMgZW1wdHkuCi0gICovCi0KLSAgcHVibGljIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQgKCk7Ci0KLSAgLyoqCi0gICogR2V0IHRoZSBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBuYW1lCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IAotICAqIEByZXR1cm4gVmVjdG9yIGEgdmVjdG9yIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGlzIG5hbWUKLSAgKiBUaGVzZSBlbGVtZW50cyBtYXkgYmUgb2YgZGlmZmVyZW50IHR5cGVzCi0gICoqLwotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0RWxlbWVudHNCeU5hbWUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIEFkZHMgYSBub2RlIHRvIHRoZSBtb2RlbC4gSWYgdGhlIG5vZGUgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIKLSAgKiBtb2RlbCB0aGVuIGl0IHdpbGwgbm90IGJlIGFkZGVkLgotICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGFkZC4gVGhpcyBtdXN0IG5vdCBiZSBudWxsLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBub2RlIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkuCi0gICogVGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgZ2l2ZW4gbm9kZSBhbHJlYWR5IGJlbG9uZ3MgdG8KLSAgKiB0aGUgY3VycmVudCBtb2RlbCBvciB0byBhbm90aGVyIG1vZGVsLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhZGRFbGVtZW50ICggRWxlbWVudCBlbGVtZW50ICk7Ci0KLSAgLyoqCi0gICogUmVtb3ZlcyBhIG5vZGUgZnJvbSB0aGUgbW9kZWwuCi0gICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlLiBUaGlzIG11c3Qgbm90IGJlIG51bGwuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIG5vZGUgd2FzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIG5vZGUgZG9lcyBub3QgYmVsb25nCi0gICogdG8gdGhpcyBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApOwotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIG5vZGVzIGluIHRoZSBtb2RlbCBhbmQgaW4gbm8KLSAgKiBwYXJ0aWN1bGFyIG9yZGVyLAotICAqIEByZXR1cm4gRW51bWVyYXRpb24gQW4gZW51bWVyYXRpb24gb2YgYWxsIG5vZGVzIGluIHRoZSBtb2RlbC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbGVtZW50cyAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIG1vZGVsLgotICAqIEByZXR1cm4gaW50IFRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIG1vZGVsLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkVsZW1lbnRzICgpOwotCi0gIC8qKgotICAqIERldGVybWluZXMgaWYgdGhpcyBtb2RlbCBjb250YWlucyB0aGUgZ2l2ZW4gbm9kZS4KLSAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjaGVjayBmb3IuIFRoaXMgbXVzdCBub3QgYmUgbnVsbC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgbW9kZWwgY29udGFpbnMgdGhlIG5vZGUuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApOwotCi0gIC8qCi0gICogVGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBxdWV1ZSBmb3IgdGhlIE1VSUQKLSAgKgotICAqLwotICBwdWJsaWMgaW50IGdldFVuaXF1ZU51bWJlcigpOwotCi0gIC8qCi0gICogaGVyZXMgd2hhdCB3ZSBjYWxsIGZyb20gdGhlIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBtYWtlTVVJRChTdHJpbmcgbmFtZSk7Ci0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3OTNiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgcHJvcGVydGllcyBvZiBhIE5vZGUuCi0qIEV2ZXJ5IHByb3BlcnR5IGhhcyBhbiBpbW11dGFibGUgbmFtZSBhbmQgYSB2YWx1ZSBvZiB0eXBlIE9iamVjdC4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogRXZlcnkgTm9kZSBoYXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIHRoYXQgaXMgZXF1aXZhbGVudAotICAqIHRvIGFuZCBrZXB0IHN5bmNocm9uaXplZCB3aXRoIE5vZGUuZ2V0TmFtZSgpIGFuZCBOb2RlLnNldE5hbWUoKS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGlzIDxjb2RlPlByb3BlcnR5PC9jb2RlPi4KLSAgKiBQcm9wZXJ0eSBrZXkgYW5kIHZhbHVlIHJlZmVyZW5jZXMgYXJlIGNsb25lZCwKLSAgKiBidXQgdGhlIHZhbHVlIG9iamVjdHMgdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLSAgKiBAcmV0dXJuIFByb3BlcnR5IEEgbmV3IFByb3BlcnR5LgotICAqLwotICBwdWJsaWMgUHJvcGVydHkgc2hhbGxvd0Nsb25lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBub2RlLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkuCi0gICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuIEFueSBwcmV2aW91cyB2YWx1ZSBpcyByZXBsYWNlZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsdWUgKCBPYmplY3QgdmFsdWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgotICAqIEByZXR1cm4gT2JqZWN0IFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlICgpOwotCi0gIC8qKgotICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYXMgYSBzdHJpbmcuCi0gICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdG8gc2V0LiBBbnkgcHJldmlvdXMgdmFsdWUgaXMgcmVwbGFjZWQuCi0gICogVGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzIHZhbHVlLCBpZiBhbnksIGlzIG9mIG5vIGNvbnNlcXVlbmNlLgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUFzU3RyaW5nICggU3RyaW5nIHZhbHVlICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBhcyBhIHN0cmluZy4KLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBhcyBhIHN0cmluZywgcG9zc2libHkgbnVsbC4KLSAgKiBJZiB0aGUgc2V0IHZhbHVlIGlzIGFuIGFyYml0cmFyeSBPYmplY3QsIHRoZW4gT2JqZWN0LnRvU3RyaW5nKCkgaXMKLSAgKiByZXR1cm5lZC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nICgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlBZGRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmZjMDU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5QWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogQ2FycmllcyBkYXRhIHJlbGV2YW50IHRvIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0qLwotcHVibGljIGNsYXNzIFByb3BlcnR5QWRkRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBCYXNpY0VsZW1lbnQgZkVsZW1lbnQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydHkncyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eUFkZEV2ZW50ICggQmFzaWNFbGVtZW50IGVsZW1lbnQsIFByb3BlcnR5IHByb3BlcnR5KQotICB7Ci0gICAgZkVsZW1lbnQgPSBlbGVtZW50OwotICAgIGZQcm9wZXJ0eSA9IHByb3BlcnR5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHRoYXQgY2hhbmdlZCAodGhhdCBwcm9kdWNlZCB0aGlzIGV2ZW50KS4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIG1vZGVsIHRoYXQgY2hhbmdlZC4KLSAgICovCi0gIHB1YmxpYyBCYXNpY0VsZW1lbnQgZ2V0RWxlbWVudCAoKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkgKCkKLSAgewotICAgIHJldHVybiBmUHJvcGVydHk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWRlN2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogQ2FycmllcyBkYXRhIHJlbGV2YW50IHRvIHdoZW4gYSBwcm9wZXJ0eSBpcyBjaGFuZ2VkIGluIHRoZSBtb2RlbC4KLSovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VFdmVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIEJhc2ljRWxlbWVudCBmRWxlbWVudDsKLQotICAvKioKLSAgKiBUaGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZS4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZPbGRQcm9wZXJ0eTsKLQotICAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRoYXQgY2hhbmdlZC4KLSAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBvbGRWYWx1ZSBUaGUgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgcHJvcGVydHkncyBuZXcgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudCAoIEJhc2ljRWxlbWVudCBlbGVtZW50ICwgUHJvcGVydHkgcHJvcGVydHksIFByb3BlcnR5IG9sZFByb3BlcnR5ICkKLSAgewotICAgIGZFbGVtZW50ID0gZWxlbWVudDsKLSAgICBmUHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICBmT2xkUHJvcGVydHkgPSBvbGRQcm9wZXJ0eTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQgKHRoYXQgcHJvZHVjZWQgdGhpcyBldmVudCkuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgQmFzaWNFbGVtZW50IGdldEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkgKCkKLSAgewotICAgIHJldHVybiBmUHJvcGVydHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eSBnZXRPbGRQcm9wZXJ0eSAoKQotICB7Ci0gICAgcmV0dXJuIGZPbGRQcm9wZXJ0eTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eVJlbW92ZUV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eVJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDY4ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBDYXJyaWVzIGRhdGEgcmVsZXZhbnQgdG8gd2hlbiBhIHByb3BlcnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwuCi0qLwotcHVibGljIGNsYXNzIFByb3BlcnR5UmVtb3ZlRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBCYXNpY0VsZW1lbnQgZkVsZW1lbnQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgd2FzIHJlbW92ZWQuCi0gICovCi0gIHByb3RlY3RlZCBQcm9wZXJ0eSBmUHJvcGVydHk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRoYXQgY2hhbmdlZC4KLSAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyByZW1vdmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlSZW1vdmVFdmVudCAoIEJhc2ljRWxlbWVudCBlbGVtZW50LCBQcm9wZXJ0eSBwcm9wZXJ0eSkKLSAgewotICAgIGZFbGVtZW50ID0gZWxlbWVudDsKLSAgICBmUHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQgKHRoYXQgcHJvZHVjZWQgdGhpcyBldmVudCkuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgQmFzaWNFbGVtZW50IGdldEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBwcm9wZXJ0eSB0aGF0IHdhcyByZW1vdmVkLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkgdGhhdCB3YXMgcmVtb3ZlZC4KLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eSAoKQotICB7Ci0gICAgcmV0dXJuIGZQcm9wZXJ0eTsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MWE2ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGFic3RyYWN0IGNsYXNzIGZvciByZWxhdGlvbnNoaXBzIGluIGEgTW9kZWwuCi0qLwotcHVibGljIGludGVyZmFjZSBSZWwKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcmVsYXRpb25zaGlwLiBSZWxhdGlvbnNoaXAgbmFtZXMKLSAgKiBjYW5ub3QgYmUgY2hhbmdlZC4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbm9kZSB0aGF0IG93bnMgdGhpcyByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBOb2RlIFRoZSBub2RlIHRoYXQgb3ducyB0aGlzIHJlbGF0aW9uc2hpcC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsIHRoYXQgaXMsIHJlbGF0aW9uc2hpcHMKLSAgKiBjYW5ub3QgZXhpc3QgaW4gdGhlIGFic2VuY2Ugb2YgYSBub2RlLgotICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXRTb3VyY2VFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgbm9kZXMgaW4gdGhpcyByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBUaGUgbm9kZXMgaW4gdGhpcyByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VGFyZ2V0RWxlbWVudHMgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gaW50IFRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhpcyByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlLgotICAqLwotICBwdWJsaWMgaW50IGdldE51bWJlck9mVGFyZ2V0RWxlbWVudHMgKCk7Ci0KLSAgLyoqCi0gICogQWRkcyBhIGNvbm5lY3Rpb24gdG8gdGhpcyByZWxhdGlvbnNoaXAuIFRoaXMgbWV0aG9kIGlzCi0gICogaW50ZW5kZWQgZm9yIHVzZSBieSBkZXJpdmF0aW9ucyBvZiB0aGUgTW9kZWwgZnJhbWV3b3JrLAotICAqIG5vdCBieSB1c2VycyBvZiB0aGUgZnJhbWV3b3JrLiBDb25uZWN0aW9uIG9iamVjdHMgc2hvdWxkCi0gICogb25seSBiZSBjb25zdHJ1Y3RlZCwgYWRkZWQsIHJlbW92ZWQgYW5kIHJldHJpZXZlZCBieQotICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgTm9kZSBhbmQgUmVsIGludGVyZmFjZXMuCi0gICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gYWRkLgotICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uICggQ29ubmVjdGlvbiBjb25uZWN0aW9uICk7Ci0KLSAgLyoqCi0gICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24gZnJvbSB0aGlzIHJlbGF0aW9uc2hpcC4gVGhpcyBtZXRob2QgaXMKLSAgKiBpbnRlbmRlZCBmb3IgdXNlIGJ5IGRlcml2YXRpb25zIG9mIHRoZSBNb2RlbCBmcmFtZXdvcmssCi0gICogbm90IGJ5IHVzZXJzIG9mIHRoZSBmcmFtZXdvcmsuIENvbm5lY3Rpb24gb2JqZWN0cyBzaG91bGQKLSAgKiBvbmx5IGJlIGNvbnN0cnVjdGVkLCBhZGRlZCwgcmVtb3ZlZCBhbmQgcmV0cmlldmVkIGJ5Ci0gICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBOb2RlIGFuZCBSZWwgaW50ZXJmYWNlcy4KLSAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byByZW1vdmUuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGZvdW5kIGFuZCByZW1vdmVkLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25uZWN0aW9uICggQ29ubmVjdGlvbiBjb25uZWN0aW9uICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgQ29ubmVjdGlvbiBvYmplY3QgZm9yIHRoZSBnaXZlbiB0YXJnZXQgbm9kZS4KLSAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGRlcml2YXRpb25zIG9mIHRoZSBNb2RlbAotICAqIGZyYW1ld29yaywgbm90IGJ5IHVzZXJzIG9mIHRoZSBmcmFtZXdvcmsuIENvbm5lY3Rpb24gb2JqZWN0cwotICAqIHNob3VsZCBvbmx5IGJlIGNvbnN0cnVjdGVkLCBhZGRlZCwgcmVtb3ZlZCBhbmQgcmV0cmlldmVkIGJ5Ci0gICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBOb2RlIGFuZCBSZWwgaW50ZXJmYWNlcy4KLSAgKiBAcGFyYW0gdGFyZ2V0Tm9kZSBUaGUgbm9kZSB0byBmaW5kIHRoZSBDb25uZWN0aW9uIHRvLgotICAqIEByZXR1cm4gQ29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiwgb3IgbnVsbCBpZiBub25lLgotICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uVG8gKCBFbGVtZW50IHRhcmdldEVsZW1lbnQgKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsQWRkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbEFkZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYTEwZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsQWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIENhcnJpZXMgZGF0YSByZWxldmFudCB0byB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotKi8KLXB1YmxpYyBjbGFzcyBSZWxBZGRFdmVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZk91dEJvdW5kOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZkluQm91bmQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydHkncyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBSZWxBZGRFdmVudCAoQ29ubmVjdGlvbltdIHBhaXIpCi0gIHsKLSAgICAgZk91dEJvdW5kID0gcGFpcltCYXNpY0Nvbm5lY3Rpb24uT1VUQk9VTkRdOwotICAgICBmSW5Cb3VuZCA9IHBhaXJbQmFzaWNDb25uZWN0aW9uLklOQk9VTkRdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG91dGJvdW5kIGNvbm5lY3Rpb24gdGhhdCBjaGFuZ2VkIAotICAqKi8KLSAgcHVibGljIENvbm5lY3Rpb24gZ2V0T3V0Qm91bmRDb25uZWN0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsIG5hbWUgCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dEJvdW5kUmVsTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldFJlbCgpLmdldE5hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbAotICAqKi8KLSAgcHVibGljIFJlbCBnZXRPdXRCb3VuZFJlbCgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldFJlbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsIG5hbWUgCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIGdldEluQm91bmRSZWxOYW1lKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRSZWwoKS5nZXROYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwKLSAgKiovCi0gIHB1YmxpYyBSZWwgZ2V0SW5Cb3VuZFJlbCgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQuZ2V0UmVsKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb3V0Ym91bmQgZWxlbWVudCB0aGF0IGNoYW5nZWQgCi0gICoqLwotICBwdWJsaWMgRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldEVsZW1lbnQoKTsKLSAgfQotCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5ib3VuZCBjb25uZWN0aW9uIHRoYXQgY2hhbmdlZCAKLSAgKiovCi0gIHB1YmxpYyBFbGVtZW50IGdldENoaWxkRWxlbWVudCAoKQotICB7Ci0gICAgcmV0dXJuIGZJbkJvdW5kLmdldEVsZW1lbnQoKTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9SZWxSZW1vdmVFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsUmVtb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmYTRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9SZWxSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIENhcnJpZXMgZGF0YSByZWxldmFudCB0byB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotKi8KLXB1YmxpYyBjbGFzcyBSZWxSZW1vdmVFdmVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZk91dEJvdW5kOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZkluQm91bmQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydHkncyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBSZWxSZW1vdmVFdmVudCAoQ29ubmVjdGlvbltdIHBhaXIpCi0gIHsKLSAgICAgZk91dEJvdW5kID0gcGFpcltCYXNpY0Nvbm5lY3Rpb24uT1VUQk9VTkRdOwotICAgICBmSW5Cb3VuZCA9IHBhaXJbQmFzaWNDb25uZWN0aW9uLklOQk9VTkRdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHRoYXQgY2hhbmdlZCAodGhhdCBwcm9kdWNlZCB0aGlzIGV2ZW50KS4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIG1vZGVsIHRoYXQgY2hhbmdlZC4KLSAgICovCi0gIHB1YmxpYyBDb25uZWN0aW9uIGdldE91dEJvdW5kICgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRJbkJvdW5kICgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwgbmFtZSAKLSAgKiovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3V0Qm91bmRSZWxOYW1lKCkKLSAgewotICAgIHJldHVybiBmT3V0Qm91bmQuZ2V0UmVsKCkuZ2V0TmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsCi0gICoqLwotICBwdWJsaWMgUmVsIGdldE91dEJvdW5kUmVsKCkKLSAgewotICAgIHJldHVybiBmT3V0Qm91bmQuZ2V0UmVsKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwgbmFtZSAKLSAgKiovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5Cb3VuZFJlbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZJbkJvdW5kLmdldFJlbCgpLmdldE5hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbAotICAqKi8KLSAgcHVibGljIFJlbCBnZXRJbkJvdW5kUmVsKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRSZWwoKTsKLSAgfQotICAKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb3V0Ym91bmQgZWxlbWVudCB0aGF0IGNoYW5nZWQgCi0gICoqLwotICBwdWJsaWMgRWxlbWVudCBnZXRPdXRCb3VuZEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmT3V0Qm91bmQuZ2V0RWxlbWVudCgpOwotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmJvdW5kIGNvbm5lY3Rpb24gdGhhdCBjaGFuZ2VkIAotICAqKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0SW5ib3VuZEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRFbGVtZW50KCk7Ci0gIH0KLSAgCi0KLSAgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4ZWN1dGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeGVjdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NzdiYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0qIEFsbCBFeHRlbnNpb25zIHdpdGggZXhlY3R1dGFibGUgZXh0ZW5zaW9ucyBzaG91bGQgaW1wbGVtZW50IHRoaXMgCi0qIHRvIGZpdCBvdXIgZnJhbWV3b3JrCi0qLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlRXhlY3V0YWJsZQotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgLyoqCi0gICpSZXR1cm5zIGEgd2l6YXJkIGZyYWdtZW50IGZvciB0aGlzIGV4ZW50aW9uIHR5cGUgCi0gICoKLSAgKi8KLSAgcHVibGljIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIGdldEZpbmlzaENvbW1hbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5MzJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUV4dGVuc2lvbgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgb3IgYSBmcmFnbWVudCBhZGRlZAotICAqIEByZXR1cm4gV2ViU2VydmljZUV4ZWN1dGFibGUgdGhpcyBpbnRlcmZhY2UgaG9sZHMgZXhlY3V0YWJsZSBjb2RlIGFuZCBhIAotICAqIGZyYWdtZW50Ci0gICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24oKTsKLQotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBjb25maWcgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBleHRlbnNpb24gaW5mbwotICAqIEBwYXJhbSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgRXh0ZW5zaW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29uZmlnRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCk7Ci0gCi0gIC8qKgotICAqIElmIHRoZSBleHRlbnNpb24gaGFzIGNvZGUgdGhhdCAKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uRWxlbWVudCBFeHRlbnNpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ0VsZW1lbnQoKTsKLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMGM4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci0KLQotCi0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeHRlbnNpb24KLXsKLQotCXByaXZhdGUgSUxvZwlsb2dfOwotCQotICAvKgotICAqIFRoZSBDb25maWdFbGVtZW50IHRoYXQgaG9sZHMgZXh0ZW5zaW9uIGluZm8KLSAgKi8KLSAgcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50XzsKLQotICAvKgotICAqIFRoZSBleHRlbnNpb24gZXhlY3V0YWJsZSAKLSAgKi8KLSAgcHJvdGVjdGVkIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHdlYlNlcnZpY2VFeGVjdXRhYmxlXzsKLSAgCi0KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb25JbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgY29uZmlnRWxlbWVudF8gPSBjb25maWdFbGVtZW50OwotICAgIGxvZ18gPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUxvZygpOwotICB9Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogSWYgdGhlIGV4dGVuc2lvbiBoYXMgY29kZSB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIG9yIGEgZnJhZ21lbnQgYWRkZWQKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHRoaXMgaW50ZXJmYWNlIGhvbGRzIGV4ZWN1dGFibGUgY29kZSBhbmQgYSAKLSAgKiBmcmFnbWVudAotICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uKCkKLSAgewotICAgIGlmKHdlYlNlcnZpY2VFeGVjdXRhYmxlXyAhPSBudWxsKSByZXR1cm4gd2ViU2VydmljZUV4ZWN1dGFibGVfOwotCi0gICAgdHJ5ewotICAgICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRfLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgfWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotICAgICAgbG9nXy5sb2coSUxvZy5FUlJPUiwgNTAyOSwgdGhpcywgImdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uIixlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIGNvbmZpZyBlbGVtZW50IHRoYXQgaG9sZHMgdGhlIGV4dGVuc2lvbiBpbmZvCi0gICogQHBhcmFtIElDb25maWd1cmF0aW9uRWxlbWVudCBFeHRlbnNpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb25maWdFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgY29uZmlnRWxlbWVudF8gPSBjb25maWdFbGVtZW50OwotICB9CQotCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIGNvbmZpZyBlbGVtZW50IHRoYXQgaG9sZHMgdGhlIGV4dGVuc2lvbiBpbmZvCi0gICogQHJldHVybiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgRXh0ZW5zaW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWdFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBjb25maWdFbGVtZW50XzsKLSAgfQotICAKLSAgLyoqCi0gICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBiZWluZyB1c2VkCi0gICogQHJldHVybiBTdHJpbmcgbmFtZSBvZiB0aGlzIGV4dGVuc2lvbgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOwotICB9Ci0KLQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMTliY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dDsKLQotCi0vKioKLSogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGV4dGVuc2lvbnMgZm9yIGEgZ2l2ZW4gZXh0ZW5zaW9uLXBvaW50IAotKiBhbHNvIHJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3RzIAotKgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zCi0gICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucy4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VFeHRlbnNpb25OYW1lcyAoKTsKLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3Qgb2YgdGhlIGdpdmVuIG5hbWUKLSAgKkByZXR1cm4gV2ViU2VydmljZUV4dGVuc2lvbiBvYmplY3QKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb24gZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUoIFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIEFsbCBleHRlbnRpb24gb2JqZWN0cyBpbiB0aGlzIHJlZ2lzdHJ5Ci0gICpAcmV0dXJuIFdlYlNlcnZpY2VFeHRlbnNpb24gb2JqZWN0cwotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbltdIGdldFdlYlNlcnZpY2VFeHRlbnNpb25zKCk7Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3YzdkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBnZW5lcmljIHJlZ2lzdHJ5IHdoaWNoIHNldHMgdXAgZ2VuZXJhbCBjb2RlIGluIGhhbmRsaW5nICAgCi0qIElDb25maWdFbGVtZW50cyBmb3IgYW4gZXh0ZW5zaW9uCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIAotICBwcml2YXRlIEhhc2h0YWJsZSBuYW1lRXh0ZW5zaW9uVGFibGVfOwotICBwcml2YXRlIFZlY3RvciBpZF87Ci0gIHByaXZhdGUgVmVjdG9yIGxhYmVsXzsKLSAgcHJpdmF0ZSBMYWJlbHNBbmRJZHMgbGFiZWxzYW5kaWRzXzsKLSAgICAKLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwoKQotICB7Ci0gICAgbmFtZUV4dGVuc2lvblRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBsYWJlbF8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWRfID0gbmV3IFZlY3RvcigpOwotICAgIGxvYWRFeHRlbnNpb25zKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIENoaWxkcmVuIHJlZ2lzdHJpZXMgd2lsbCBoYXZlIGRpZmZlcmVudCBleHRlbnNpb24gdHlwZXMgCi0gICogQHJldHVybiBXZWJzZXJ2aWNlRXh0ZW5zaW9uIGhvbGRzIGEgY29uZmlnIGVsZW0KLSAgKiBmb3IgdGhhdCBleHRlbnNpb24gY2FwYWJsZSBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IFdlYlNlcnZpY2VFeHRlbnNpb24gY3JlYXRlV2ViU2VydmljZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCk7Ci0KLSAgLyoqCi0gICogQ2hpbGRyZW4gbXVzdCBpbXBsZW1lbnQgaG93IHRoZXkgZ2V0IHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSAKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGFuIGFycmF5IG9mIGVsZW1lbnRzIHBhcnRpY3VsYXIgdG8gdGhhdAotICAqIGV4dGVuc2lvbgotICAqLwotICBwdWJsaWMgYWJzdHJhY3QgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29uZmlnRWxlbWVudHMoKTsKLQotICAvKgotICAqIExvYWRzIFdlYlNlcnZpY2VFeHRlbnNpb25zIGZvciBXZWJTZXJ2aWNlQ2xpZW50VGVzdCBpbnRvIHRoaXMgcmVnaXN0cnkuCi0gICogVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gICogdGhhdCBleHRlbmQgd2ViU2VydmljZUNsaWVudFRlc3QgIAotICAqLwotICBwcml2YXRlIHZvaWQgbG9hZEV4dGVuc2lvbnMgKCkKLSAgeyAgICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSBnZXRDb25maWdFbGVtZW50cygpOwotCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotICAgICAgU3RyaW5nIGxhYmVsID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJsYWJlbCIgKTsKLSAgICAgIFN0cmluZyBpZCA9ICAgZWxlbS5nZXRBdHRyaWJ1dGUoICJpZCIgKTsgICAgICAKLSAgICAgIFdlYlNlcnZpY2VFeHRlbnNpb24gd2ViU2VydmljZUV4dGVuc2lvbiA9IGNyZWF0ZVdlYlNlcnZpY2VFeHRlbnNpb24oZWxlbSk7CQotICAgICAgbmFtZUV4dGVuc2lvblRhYmxlXy5wdXQobGFiZWwsd2ViU2VydmljZUV4dGVuc2lvbik7Ci0gICAgICBsYWJlbF8uYWRkKGxhYmVsKTsKLSAgICAgIGlkXy5hZGQoaWQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIGV4dGVuc2lvbnMKLSAgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbk5hbWVzICgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKW5hbWVFeHRlbnNpb25UYWJsZV8ua2V5U2V0KCkudG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbmFtZXMgYW5kIElkcyAKLSAgICovCi0gIHB1YmxpYyBMYWJlbHNBbmRJZHMgZ2V0TGFiZWxzQW5kSURzKCkKLSAgewotICAJbGFiZWxzYW5kaWRzXyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgCWxhYmVsc2FuZGlkc18uc2V0TGFiZWxzXygoU3RyaW5nW10pbGFiZWxfLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKSk7Ci0gIAlsYWJlbHNhbmRpZHNfLnNldElkc18oKFN0cmluZ1tdKWlkXy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICkpOwotICAJcmV0dXJuIGxhYmVsc2FuZGlkc187Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3Qgb2YgdGhlIGdpdmVuIG5hbWUKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeHRlbnNpb24gb2JqZWN0Ci0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uIGdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAoV2ViU2VydmljZUV4dGVuc2lvbiluYW1lRXh0ZW5zaW9uVGFibGVfLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgQWxsIGV4dGVudGlvbiBvYmplY3RzIGluIHRoaXMgcmVnaXN0cnkKLSAgKkByZXR1cm4gV2ViU2VydmljZUV4dGVuc2lvbiBvYmplY3RzCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbnMoKQotICB7Ci0gICAgcmV0dXJuIChXZWJTZXJ2aWNlRXh0ZW5zaW9uW10pbmFtZUV4dGVuc2lvblRhYmxlXy52YWx1ZXMoKS50b0FycmF5KCBuZXcgV2ViU2VydmljZUV4dGVuc2lvblswXSApOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fic3RyYWN0Q2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9BYnN0cmFjdENsaWVudEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMjc3ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fic3RyYWN0Q2xpZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGYWN0b3J5RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgZXh0ZW5kcyBDb21tYW5kRmFjdG9yeUZyYWdtZW50Ci17Ci0gIHByb3RlY3RlZCBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50XzsKLSAgcHJvdGVjdGVkIElFbnZpcm9ubWVudCAgICAgICBlbnZpcm9ubWVudF87Ci0gIHByb3RlY3RlZCBJQ29udGV4dCAgICAgICAgICBjb250ZXh0XzsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gICAgICAgIHNlbGVjdGlvbl87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICAgICAgICBwcm9qZWN0XzsKLSAgcHJvdGVjdGVkIFN0cmluZyAgICAgICAgICAgIG1vZHVsZV87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICAgICAgICBlYXJQcm9qZWN0XzsKLSAgcHJvdGVjdGVkIFN0cmluZyAgICAgICAgICAgIGVhcl87Ci0gICAgCi0gIHB1YmxpYyBBYnN0cmFjdENsaWVudEZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgQWJzdHJhY3RDbGllbnRGcmFnbWVudCggQWJzdHJhY3RDbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgCi0JCi0Jd2ViU2VydmljZUNsaWVudF8gPSBmcmFnbWVudC53ZWJTZXJ2aWNlQ2xpZW50XzsKLQllbnZpcm9ubWVudF8gICAgICA9IGZyYWdtZW50LmVudmlyb25tZW50XzsKLQljb250ZXh0XyAgICAgICAgICA9IGZyYWdtZW50LmNvbnRleHRfOwotCXNlbGVjdGlvbl8gICAgICAgID0gZnJhZ21lbnQuc2VsZWN0aW9uXzsKLQltb2R1bGVfICAgICAgICAgICA9IGZyYWdtZW50Lm1vZHVsZV87Ci0JZWFyXyAgICAgICAgICAgICAgPSBmcmFnbWVudC5lYXJfOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlQ2xpZW50IHdlYlNlcnZpY2UgKQotICB7Ci0Jd2ViU2VydmljZUNsaWVudF8gPSB3ZWJTZXJ2aWNlOyAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudCggSUVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotCWVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KCBJQ29udGV4dCBjb250ZXh0ICkKLSAgewkgIAotCWNvbnRleHRfID0gY29udGV4dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKCBJU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLQlzZWxlY3Rpb25fID0gc2VsZWN0aW9uOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0KQotICB7Ci0gICAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotICB7Ci0JbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdChTdHJpbmcgZWFyUHJvamVjdCkKLSAgewotICAgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JZWFyXyA9IGVhcjsgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9BYnN0cmFjdFNlcnZpY2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Y2ZDdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9BYnN0cmFjdFNlcnZpY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZhY3RvcnlGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgZXh0ZW5kcyBDb21tYW5kRmFjdG9yeUZyYWdtZW50Ci17Ci0gIHByb3RlY3RlZCBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlXzsKLSAgcHJvdGVjdGVkIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudF87Ci0gIHByb3RlY3RlZCBJQ29udGV4dCAgICBjb250ZXh0XzsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gIHNlbGVjdGlvbl87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICBwcm9qZWN0XzsKLSAgcHJvdGVjdGVkIFN0cmluZyAgICAgIG1vZHVsZV87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICBlYXJQcm9qZWN0XzsKLSAgcHJvdGVjdGVkIFN0cmluZyAgICAgIGVhcl87Ci0gICAgCi0gIHB1YmxpYyBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFic3RyYWN0U2VydmljZUZyYWdtZW50KCBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgCi0JCi0Jd2ViU2VydmljZV8gID0gZnJhZ21lbnQud2ViU2VydmljZV87Ci0JZW52aXJvbm1lbnRfID0gZnJhZ21lbnQuZW52aXJvbm1lbnRfOwotCWNvbnRleHRfICAgICA9IGZyYWdtZW50LmNvbnRleHRfOwotCXNlbGVjdGlvbl8gICA9IGZyYWdtZW50LnNlbGVjdGlvbl87Ci0JbW9kdWxlXyAgICAgID0gZnJhZ21lbnQubW9kdWxlXzsKLQllYXJfICAgICAgICAgPSBmcmFnbWVudC5lYXJfOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgKQotICB7Ci0Jd2ViU2VydmljZV8gPSB3ZWJTZXJ2aWNlOyAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudCggSUVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotCWVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KCBJQ29udGV4dCBjb250ZXh0ICkKLSAgewkgIAotCWNvbnRleHRfID0gY29udGV4dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKCBJU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLQlzZWxlY3Rpb25fID0gc2VsZWN0aW9uOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0KQotICB7Ci0gICAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotICB7Ci0JbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdChTdHJpbmcgZWFyUHJvamVjdCkKLSAgewotICAgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JZWFyXyA9IGVhcjsgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQXNzZW1ibGVDbGllbnRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fzc2VtYmxlQ2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyYjUzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQXNzZW1ibGVDbGllbnRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBc3NlbWJsZUNsaWVudEZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDbGllbnRGcmFnbWVudCAKLXsKLSAgcHVibGljIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBc3NlbWJsZUNsaWVudEZyYWdtZW50KCBBc3NlbWJsZUNsaWVudEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotCXJldHVybiBuZXcgQXNzZW1ibGVDbGllbnRGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZUNsaWVudF8gPT0gbnVsbCB8fCBjb250ZXh0XyA9PSBudWxsIHx8ICFjb250ZXh0Xy5nZXRBc3NlbWJsZSgpKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLmFzc2VtYmxlKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBwcm9qZWN0XywgZWFyUHJvamVjdF8pOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Bc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fzc2VtYmxlU2VydmljZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzlkODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fzc2VtYmxlU2VydmljZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFzc2VtYmxlU2VydmljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFzc2VtYmxlU2VydmljZUZyYWdtZW50KCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IEFzc2VtYmxlU2VydmljZUZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlXyA9PSBudWxsIHx8IGNvbnRleHRfID09IG51bGwgfHwgIWNvbnRleHRfLmdldEFzc2VtYmxlKCkpCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8uYXNzZW1ibGUoIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIHByb2plY3RfLCBlYXJQcm9qZWN0Xyk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RlcGxveUNsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95Q2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlZmMyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95Q2xpZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMSAgIDExOTExMSByc2luaGFAY2EuaWJtLmNvbSAtIFJ1cGFtIEt1ZWhuZXIKLSAqIDIwMDYwNTI5ICAgMTQxNDIyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEZXBsb3lDbGllbnRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBEZXBsb3lDbGllbnRGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlcGxveUNsaWVudEZyYWdtZW50KCBEZXBsb3lDbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IERlcGxveUNsaWVudEZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlQ2xpZW50XyA9PSBudWxsIHx8IGNvbnRleHRfID09IG51bGwgfHwgIWNvbnRleHRfLmdldERlcGxveSgpKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLmRlcGxveSggZW52aXJvbm1lbnRfLCBjb250ZXh0Xywgc2VsZWN0aW9uXywgcHJvamVjdF8sIGVhclByb2plY3RfKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95U2VydmljZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95U2VydmljZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YmU5OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RlcGxveVNlcnZpY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIxICAgMTE5MTExIHJzaW5oYUBjYS5pYm0uY29tIC0gUnVwYW0gS3VlaG5lcgotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERlcGxveVNlcnZpY2VGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0U2VydmljZUZyYWdtZW50IAotewotICBwdWJsaWMgRGVwbG95U2VydmljZUZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGVwbG95U2VydmljZUZyYWdtZW50KCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0Jc3VwZXIoIGZyYWdtZW50ICk7ICAKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBjbG9uZSgpIAotICB7Ci0JcmV0dXJuIG5ldyBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VfID09IG51bGwgfHwgY29udGV4dF8gPT0gbnVsbCB8fCAhY29udGV4dF8uZ2V0RGVwbG95KCkpCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8uZGVwbG95KCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBwcm9qZWN0XywgZWFyUHJvamVjdF8pOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXZlbG9wQ2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXZlbG9wQ2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOGUyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGV2ZWxvcENsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERldmVsb3BDbGllbnRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBEZXZlbG9wQ2xpZW50RnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQoIERldmVsb3BDbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IERldmVsb3BDbGllbnRGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZUNsaWVudF8gPT0gbnVsbCB8fCBjb250ZXh0XyA9PSBudWxsIHx8ICFjb250ZXh0Xy5nZXREZXZlbG9wKCkgKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLmRldmVsb3AoIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIHByb2plY3RfLCBlYXJQcm9qZWN0Xyk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RldmVsb3BTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXZlbG9wU2VydmljZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTM4NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RldmVsb3BTZXJ2aWNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0U2VydmljZUZyYWdtZW50IAotewotICBwdWJsaWMgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQoIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0Jc3VwZXIoIGZyYWdtZW50ICk7ICAKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBjbG9uZSgpIAotICB7Ci0JcmV0dXJuIG5ldyBEZXZlbG9wU2VydmljZUZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlXyA9PSBudWxsIHx8IGNvbnRleHRfID09IG51bGwgfHwgIWNvbnRleHRfLmdldERldmVsb3AoKSkKLQl7Ci0JICBmYWN0b3J5ID0gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBuZXcgVmVjdG9yKCkgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZhY3RvcnkgPSB3ZWJTZXJ2aWNlXy5kZXZlbG9wKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBwcm9qZWN0XywgZWFyUHJvamVjdF8pOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnN0YWxsQ2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnN0YWxsQ2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2MzdlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvSW5zdGFsbENsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEluc3RhbGxDbGllbnRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgCi17Ci0JcHJpdmF0ZSBJQ29udGV4dCBjb250ZXh0XzsKLQkKLSAgcHVibGljIEluc3RhbGxDbGllbnRGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEluc3RhbGxDbGllbnRGcmFnbWVudCggSW5zdGFsbENsaWVudEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotCXJldHVybiBuZXcgSW5zdGFsbENsaWVudEZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlQ2xpZW50XyA9PSBudWxsIHx8IGNvbnRleHRfID09IG51bGwgfHwgIWNvbnRleHRfLmdldEluc3RhbGwoKSkKLQl7Ci0JICBmYWN0b3J5ID0gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBuZXcgVmVjdG9yKCkgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZhY3RvcnkgPSB3ZWJTZXJ2aWNlQ2xpZW50Xy5pbnN0YWxsKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBwcm9qZWN0XywgZWFyUHJvamVjdF8pOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbnRleHQoSUNvbnRleHQgY29udGV4dCkKLSAgewotCSAgY29udGV4dF89Y29udGV4dDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0luc3RhbGxTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnN0YWxsU2VydmljZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2U2NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0luc3RhbGxTZXJ2aWNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbFNlcnZpY2VGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0U2VydmljZUZyYWdtZW50IAotewotCXByaXZhdGUgSUNvbnRleHQgY29udGV4dF87Ci0JCi0gIHB1YmxpYyBJbnN0YWxsU2VydmljZUZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgSW5zdGFsbFNlcnZpY2VGcmFnbWVudCggSW5zdGFsbFNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VfID09IG51bGwgfHwgY29udGV4dF8gPT0gbnVsbCB8fCAhY29udGV4dF8uZ2V0SW5zdGFsbCgpKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VfLmluc3RhbGwoIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIHByb2plY3RfLCBlYXJQcm9qZWN0Xyk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dChJQ29udGV4dCBjb250ZXh0KQotICB7Ci0JICBjb250ZXh0Xz1jb250ZXh0OwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL1J1bkNsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvUnVuQ2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxOWI2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvUnVuQ2xpZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDUyOSAgIDE0MTQyMiBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgUnVuQ2xpZW50RnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENsaWVudEZyYWdtZW50IAotewotCXByaXZhdGUgSUNvbnRleHQgY29udGV4dF87Ci0JCi0gIHB1YmxpYyBSdW5DbGllbnRGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFJ1bkNsaWVudEZyYWdtZW50KCBSdW5DbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IFJ1bkNsaWVudEZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlQ2xpZW50XyA9PSBudWxsIHx8IGNvbnRleHRfID09IG51bGwgfHwgIWNvbnRleHRfLmdldFJ1bigpKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLnJ1biggZW52aXJvbm1lbnRfLCBjb250ZXh0Xywgc2VsZWN0aW9uXywgcHJvamVjdF8sIGVhclByb2plY3RfKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KElDb250ZXh0IGNvbnRleHQpCi0gIHsKLQkgIGNvbnRleHRfPWNvbnRleHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9SdW5TZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9SdW5TZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmZTg5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvUnVuU2VydmljZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MjkgICAxNDE0MjIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFJ1blNlcnZpY2VGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0U2VydmljZUZyYWdtZW50IAotewotCQotCXByaXZhdGUgSUNvbnRleHQgY29udGV4dF87Ci0JCi0gIHB1YmxpYyBSdW5TZXJ2aWNlRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBSdW5TZXJ2aWNlRnJhZ21lbnQoIFJ1blNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IFJ1blNlcnZpY2VGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZV8gPT0gbnVsbCB8fCBjb250ZXh0XyA9PSBudWxsIHx8ICFjb250ZXh0Xy5nZXRSdW4oKSkKLQl7Ci0JICBmYWN0b3J5ID0gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBuZXcgVmVjdG9yKCkgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZhY3RvcnkgPSB3ZWJTZXJ2aWNlXy5ydW4oIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIHByb2plY3RfLCBlYXJQcm9qZWN0Xyk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dChJQ29udGV4dCBjb250ZXh0KQotICB7Ci0JICBjb250ZXh0Xz1jb250ZXh0OwkgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9EZXNjcmlwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4MDc0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDkgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRGVzY3JpcHRpb24jZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlI2dldERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdGlvbiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0RGVzY3JpcHRpb25fVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRlc2NyaXB0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlI2dldERlc2NyaXB0aW9uX0xhbmcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkxhbmd1YWdlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFuZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5EZXNjcmlwdGlvbiNnZXRMYW5nIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L0RvY3VtZW50Um9vdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvRG9jdW1lbnRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDg4MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvRG9jdW1lbnRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3QuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ5IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFJlZ2lzdHJ5IDxlbT5SZWdpc3RyeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFJvb3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlI2dldERvY3VtZW50Um9vdF9NaXhlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5UGFja2FnZSNnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlI2dldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIga2V5VHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWVUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oRGVzY3JpcHRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5UGFja2FnZSNnZXREb2N1bWVudFJvb3RfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKERlc2NyaXB0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TmFtZShOYW1lKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X05hbWUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlOYW1lIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoTmFtZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWdpc3RyeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVnaXN0cnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVnaXN0cnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlZ2lzdHJ5KFJlZ2lzdHJ5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1JlZ2lzdHJ5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFJlZ2lzdHJ5IDxlbT5SZWdpc3RyeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVnaXN0cnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlZ2lzdHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWdpc3RyeShSZWdpc3RyeSB2YWx1ZSk7Ci0KLX0gLy8gRG9jdW1lbnRSb290CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9OYW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2RkMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOYW1lLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OSBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0TmFtZV8oKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlI2dldE5hbWVfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0TmFtZV9MYW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5MYW5ndWFnZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExhbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuTmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTmFtZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTJkYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlZ2lzdHJ5LmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OSBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVnaXN0cnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5I2dldFJlZiA8ZW0+UmVmPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5UGFja2FnZSNnZXRSZWdpc3RyeSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVnaXN0cnkgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5OYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0UmVnaXN0cnlfTmFtZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuTmFtZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0UmVnaXN0cnlfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2UjZ2V0UmVnaXN0cnlfSWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVVSSSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2NhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5UGFja2FnZSNnZXRSZWdpc3RyeV9Mb2NhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VVJJIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5UGFja2FnZSNnZXRSZWdpc3RyeV9SZWYoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVVSSSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeSNnZXRSZWYgPGVtPlJlZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFJlZ2lzdHJ5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9SZWdpc3RyeUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L1JlZ2lzdHJ5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI0MTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L1JlZ2lzdHJ5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZWdpc3RyeUZhY3RvcnkuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ5IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdHJ5RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlZ2lzdHJ5RmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsLlJlZ2lzdHJ5RmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb2N1bWVudFJvb3QgY3JlYXRlRG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWUgY3JlYXRlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWdpc3RyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVnaXN0cnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlZ2lzdHJ5IGNyZWF0ZVJlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlZ2lzdHJ5UGFja2FnZSBnZXRSZWdpc3RyeVBhY2thZ2UoKTsKLQotfSAvL1JlZ2lzdHJ5RmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvUmVnaXN0cnlQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9SZWdpc3RyeVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4ZjFlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9SZWdpc3RyeVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlZ2lzdHJ5UGFja2FnZS5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDkgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAgICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gKiAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAgIAotICogICAgIHNwYWNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlCi0gKiAgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZwotICogICAgICAgICAgZGlzY2lwbGluZSBpcyBpbnRlbmRlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQ7IGl0cwotICogICAgICAgICAgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IHZpcnR1ZSBvZiBpdHMKLSAqICAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgRmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpOiBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAotICogICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAotICogICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKLSAqICAgICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgotICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKLSAqICAgCi0gKiBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICogICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gKiAgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcsIHhtbDpzcGFjZSBvciB4bWw6aWQKLSAqICAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLSAqIAotICogICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICogICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAqICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICogICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7Ci0gKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0gKiAKLSAqICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OwotICogIAotICogICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gKiAgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMKLSAqIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAqICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuCi0gKiAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICogICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAqICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAqICAgIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTAotICogICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gKiAgICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCi0gKiAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5RmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdHJ5UGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJyZWdpc3RyeSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gInJlZ2lzdHJ5IjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVnaXN0cnlQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbC5SZWdpc3RyeVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsLkRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuUmVnaXN0cnlQYWNrYWdlSW1wbCNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklQVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9fTEFORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbC5Eb2N1bWVudFJvb3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuUmVnaXN0cnlQYWNrYWdlSW1wbCNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01JWEVEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fREVTQ1JJUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19OQU1FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWdpc3RyeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1JFR0lTVFJZID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuTmFtZUltcGwgPGVtPk5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuTmFtZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbC5SZWdpc3RyeVBhY2thZ2VJbXBsI2dldE5hbWVfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRV9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FX19MQU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuUmVnaXN0cnlJbXBsIDxlbT5SZWdpc3RyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbC5SZWdpc3RyeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbC5SZWdpc3RyeVBhY2thZ2VJbXBsI2dldFJlZ2lzdHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFR0lTVFJZID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUdJU1RSWV9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFR0lTVFJZX19ERVNDUklQVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUdJU1RSWV9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVHSVNUUllfX0xPQ0FUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUdJU1RSWV9fUkVGID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVnaXN0cnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVHSVNUUllfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRGVzY3JpcHRpb24jZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdGlvbl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5EZXNjcmlwdGlvbiNnZXRMYW5nKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRpb25fTGFuZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1peGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFJlZ2lzdHJ5IDxlbT5SZWdpc3RyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlZ2lzdHJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0UmVnaXN0cnkoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1JlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuTmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZV8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5OYW1lI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5OYW1lI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXROYW1lXygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWUjZ2V0TGFuZygpCi0JICogQHNlZSAjZ2V0TmFtZV8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE5hbWVfTGFuZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeSA8ZW0+UmVnaXN0cnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVnaXN0cnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UmVnaXN0cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlZ2lzdHJ5X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5I2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRSZWdpc3RyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVnaXN0cnlfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFJlZ2lzdHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWdpc3RyeV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5I2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeSNnZXRMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0UmVnaXN0cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlZ2lzdHJ5X0xvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkjZ2V0UmVmIDxlbT5SZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5I2dldFJlZigpCi0JICogQHNlZSAjZ2V0UmVnaXN0cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlZ2lzdHJ5X1JlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVnaXN0cnlGYWN0b3J5IGdldFJlZ2lzdHJ5RmFjdG9yeSgpOwotCi19IC8vUmVnaXN0cnlQYWNrYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvaW1wbC9EZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExZDk0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0NyBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuRGVzY3JpcHRpb25JbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsLkRlc2NyaXB0aW9uSW1wbCNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsYW5nID0gTEFOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVnaXN0cnlQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5nKCkgewotCQlyZXR1cm4gbGFuZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5nKFN0cmluZyBuZXdMYW5nKSB7Ci0JCVN0cmluZyBvbGRMYW5nID0gbGFuZzsKLQkJbGFuZyA9IG5ld0xhbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlZ2lzdHJ5UGFja2FnZS5ERVNDUklQVElPTl9fTEFORywgb2xkTGFuZywgbGFuZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXJldHVybiBnZXRMYW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXJldHVybiBMQU5HX0VERUZBVUxUID09IG51bGwgPyBsYW5nICE9IG51bGwgOiAhTEFOR19FREVGQVVMVC5lcXVhbHMobGFuZyk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzJlMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3RJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0NyBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRSZWdpc3RyeSA8ZW0+UmVnaXN0cnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJvb3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEb2N1bWVudFJvb3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1peGVkKCkgPGVtPk1peGVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeE1MTlNQcmVmaXhNYXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhTSVNjaGVtYUxvY2F0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFJvb3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQl9Ci0JCXJldHVybiB4TUxOU1ByZWZpeE1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRGVzY3JpcHRpb24pZ2V0TWl4ZWQoKS5nZXQoUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfRGVzY3JpcHRpb24oKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGVzY3JpcHRpb24oRGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9EZXNjcmlwdGlvbigpLCBuZXdEZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oRGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24pIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9EZXNjcmlwdGlvbigpLCBuZXdEZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIChOYW1lKWdldE1peGVkKCkuZ2V0KFJlZ2lzdHJ5UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X05hbWUoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TmFtZShOYW1lIG5ld05hbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9OYW1lKCksIG5ld05hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoTmFtZSBuZXdOYW1lKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfTmFtZSgpLCBuZXdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiAoUmVnaXN0cnkpZ2V0TWl4ZWQoKS5nZXQoUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfUmVnaXN0cnkoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVnaXN0cnkoUmVnaXN0cnkgbmV3UmVnaXN0cnksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9SZWdpc3RyeSgpLCBuZXdSZWdpc3RyeSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaXN0cnkoUmVnaXN0cnkgbmV3UmVnaXN0cnkpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9SZWdpc3RyeSgpLCBuZXdSZWdpc3RyeSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX0RFU0NSSVBUSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXREZXNjcmlwdGlvbihudWxsLCBtc2dzKTsKLQkJCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19OQU1FOgotCQkJCQlyZXR1cm4gYmFzaWNTZXROYW1lKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1JFR0lTVFJZOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZWdpc3RyeShudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiBnZXRNaXhlZCgpOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1JFR0lTVFJZOgotCQkJCXJldHVybiBnZXRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlnZXRNaXhlZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoRGVzY3JpcHRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX05BTUU6Ci0JCQkJc2V0TmFtZSgoTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUkVHSVNUUlk6Ci0JCQkJc2V0UmVnaXN0cnkoKFJlZ2lzdHJ5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChEZXNjcmlwdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19OQU1FOgotCQkJCXNldE5hbWUoKE5hbWUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUkVHSVNUUlk6Ci0JCQkJc2V0UmVnaXN0cnkoKFJlZ2lzdHJ5KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpICE9IG51bGw7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCkgIT0gbnVsbDsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1JFR0lTVFJZOgotCQkJCXJldHVybiBnZXRSZWdpc3RyeSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL05hbWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL05hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjY2VmNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvaW1wbC9OYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZUltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ3IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuTmFtZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuTmFtZUltcGwjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBOYW1lIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhbmcgPSBMQU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lXygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlZ2lzdHJ5UGFja2FnZS5OQU1FX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5nKCkgewotCQlyZXR1cm4gbGFuZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5nKFN0cmluZyBuZXdMYW5nKSB7Ci0JCVN0cmluZyBvbGRMYW5nID0gbGFuZzsKLQkJbGFuZyA9IG5ld0xhbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlZ2lzdHJ5UGFja2FnZS5OQU1FX19MQU5HLCBvbGRMYW5nLCBsYW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuTkFNRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5OQU1FX19MQU5HOgotCQkJCXJldHVybiBnZXRMYW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuTkFNRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuTkFNRV9fTEFORzoKLQkJCQlzZXRMYW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5OQU1FX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuTkFNRV9fTEFORzoKLQkJCQlzZXRMYW5nKExBTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuTkFNRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5OQU1FX19MQU5HOgotCQkJCXJldHVybiBMQU5HX0VERUZBVUxUID09IG51bGwgPyBsYW5nICE9IG51bGwgOiAhTEFOR19FREVGQVVMVC5lcXVhbHMobGFuZyk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9OYW1lSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvaW1wbC9SZWdpc3RyeUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL1JlZ2lzdHJ5RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmMmMxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL1JlZ2lzdHJ5RmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlZ2lzdHJ5RmFjdG9yeUltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ3IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgUmVnaXN0cnlGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuREVTQ1JJUFRJT046IHJldHVybiBjcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuTkFNRTogcmV0dXJuIGNyZWF0ZU5hbWUoKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZOiByZXR1cm4gY3JlYXRlUmVnaXN0cnkoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRpb25JbXBsIGRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKSB7Ci0JCURvY3VtZW50Um9vdEltcGwgZG9jdW1lbnRSb290ID0gbmV3IERvY3VtZW50Um9vdEltcGwoKTsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZSBjcmVhdGVOYW1lKCkgewotCQlOYW1lSW1wbCBuYW1lID0gbmV3IE5hbWVJbXBsKCk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeSBjcmVhdGVSZWdpc3RyeSgpIHsKLQkJUmVnaXN0cnlJbXBsIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5SW1wbCgpOwotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5UGFja2FnZSBnZXRSZWdpc3RyeVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoUmVnaXN0cnlQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlZ2lzdHJ5UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9SZWdpc3RyeUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL1JlZ2lzdHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvaW1wbC9SZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3MWU3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL1JlZ2lzdHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVnaXN0cnlJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0NyBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVnaXN0cnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbC5SZWdpc3RyeUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsLlJlZ2lzdHJ5SW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuaW1wbC5SZWdpc3RyeUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuUmVnaXN0cnlJbXBsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsLlJlZ2lzdHJ5SW1wbCNnZXRSZWYgPGVtPlJlZjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lzdHJ5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVnaXN0cnkgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uID0gTE9DQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmKCkgPGVtPlJlZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmKCkgPGVtPlJlZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZiA9IFJFRl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWdpc3RyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE5hbWUoKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTmFtZS5jbGFzcywgdGhpcywgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19OQU1FKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19ERVNDUklQVElPTik7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbmV3TG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0JCWxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fTE9DQVRJT04sIG9sZExvY2F0aW9uLCBsb2NhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmKCkgewotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZihTdHJpbmcgbmV3UmVmKSB7Ci0JCVN0cmluZyBvbGRSZWYgPSByZWY7Ci0JCXJlZiA9IG5ld1JlZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19SRUYsIG9sZFJlZiwgcmVmKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuUkVHSVNUUllfX05BTUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TmFtZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuUkVHSVNUUllfX0RFU0NSSVBUSU9OOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fUkVGOgotCQkJCXJldHVybiBnZXRSZWYoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fTkFNRToKLQkJCQlnZXROYW1lKCkuY2xlYXIoKTsKLQkJCQlnZXROYW1lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fREVTQ1JJUFRJT046Ci0JCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuUkVHSVNUUllfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19SRUY6Ci0JCQkJc2V0UmVmKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fTkFNRToKLQkJCQlnZXROYW1lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fREVTQ1JJUFRJT046Ci0JCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuUkVHSVNUUllfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKExPQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fUkVGOgotCQkJCXNldFJlZihSRUZfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuUkVHSVNUUllfX05BTUU6Ci0JCQkJcmV0dXJuIG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5pc0VtcHR5KCk7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9uICE9IG51bGwgJiYgIWRlc2NyaXB0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKLQkJCWNhc2UgUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19SRUY6Ci0JCQkJcmV0dXJuIFJFRl9FREVGQVVMVCA9PSBudWxsID8gcmVmICE9IG51bGwgOiAhUkVGX0VERUZBVUxULmVxdWFscyhyZWYpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlZjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVnaXN0cnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS9pbXBsL1JlZ2lzdHJ5UGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L2ltcGwvUmVnaXN0cnlQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y5YmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L2ltcGwvUmVnaXN0cnlQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVnaXN0cnlQYWNrYWdlSW1wbC5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDcgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuUlRJbmRleFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuVGF4b25vbXlQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5pbXBsLlVERElSZWdpc3RyeVBhY2thZ2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lzdHJ5UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBSZWdpc3RyeVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvY3VtZW50Um9vdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlZ2lzdHJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZWdpc3RyeVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBSZWdpc3RyeUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVnaXN0cnlQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChSZWdpc3RyeVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUmVnaXN0cnlQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJUmVnaXN0cnlQYWNrYWdlSW1wbCB0aGVSZWdpc3RyeVBhY2thZ2UgPSAoUmVnaXN0cnlQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBSZWdpc3RyeVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgUmVnaXN0cnlQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTFR5cGVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJUlRJbmRleFBhY2thZ2VJbXBsIHRoZVJUSW5kZXhQYWNrYWdlID0gKFJUSW5kZXhQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUlRJbmRleFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBSVEluZGV4UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSVEluZGV4UGFja2FnZS5lTlNfVVJJKSA6IFJUSW5kZXhQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCQlUYXhvbm9teVBhY2thZ2VJbXBsIHRoZVRheG9ub215UGFja2FnZSA9IChUYXhvbm9teVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYXhvbm9teVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYXhvbm9teVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGF4b25vbXlQYWNrYWdlLmVOU19VUkkpIDogVGF4b25vbXlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCQlVRERJUmVnaXN0cnlQYWNrYWdlSW1wbCB0aGVVRERJUmVnaXN0cnlQYWNrYWdlID0gKFVERElSZWdpc3RyeVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVRERJUmVnaXN0cnlQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVURESVJlZ2lzdHJ5UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVRERJUmVnaXN0cnlQYWNrYWdlLmVOU19VUkkpIDogVURESVJlZ2lzdHJ5UGFja2FnZUltcGwuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVSZWdpc3RyeVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVJUSW5kZXhQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYXhvbm9teVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVVERElSZWdpc3RyeVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVSZWdpc3RyeVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVSVEluZGV4UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRheG9ub215UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVVERElSZWdpc3RyeVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlUmVnaXN0cnlQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVSZWdpc3RyeVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdGlvbl9MYW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvY3VtZW50Um9vdCgpIHsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTmFtZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZV8oKSB7Ci0JCXJldHVybiBuYW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSluYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZV9MYW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiByZWdpc3RyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWdpc3RyeV9OYW1lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVnaXN0cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWdpc3RyeV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlZ2lzdHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVnaXN0cnlfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZWdpc3RyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZ2lzdHJ5X0xvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVnaXN0cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWdpc3RyeV9SZWYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZWdpc3RyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeUZhY3RvcnkgZ2V0UmVnaXN0cnlGYWN0b3J5KCkgewotCQlyZXR1cm4gKFJlZ2lzdHJ5RmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlkZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUSU9OX19WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUSU9OX19MQU5HKTsKLQotCQlkb2N1bWVudFJvb3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRE9DVU1FTlRfUk9PVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NSVhFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19SRUdJU1RSWSk7Ci0KLQkJbmFtZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lRUNsYXNzLCBOQU1FX19WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZUVDbGFzcywgTkFNRV9fTEFORyk7Ci0KLQkJcmVnaXN0cnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVHSVNUUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZ2lzdHJ5RUNsYXNzLCBSRUdJU1RSWV9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVnaXN0cnlFQ2xhc3MsIFJFR0lTVFJZX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVnaXN0cnlFQ2xhc3MsIFJFR0lTVFJZX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVnaXN0cnlFQ2xhc3MsIFJFR0lTVFJZX19MT0NBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVnaXN0cnlFQ2xhc3MsIFJFR0lTVFJZX19SRUYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlYTUxUeXBlUGFja2FnZUltcGwgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uRUNsYXNzLCBEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdGlvbl9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdGlvbl9MYW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldExhbmd1YWdlKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZG9jdW1lbnRSb290RUNsYXNzLCBEb2N1bWVudFJvb3QuY2xhc3MsICJEb2N1bWVudFJvb3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERvY3VtZW50Um9vdF9NaXhlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAibWl4ZWQiLCBudWxsLCAwLCAtMSwgbnVsbCwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9EZXNjcmlwdGlvbigpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfTmFtZSgpLCB0aGlzLmdldE5hbWVfKCksIG51bGwsICJuYW1lIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9SZWdpc3RyeSgpLCB0aGlzLmdldFJlZ2lzdHJ5KCksIG51bGwsICJyZWdpc3RyeSIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobmFtZUVDbGFzcywgTmFtZS5jbGFzcywgIk5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE5hbWVfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lX0xhbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0TGFuZ3VhZ2UoKSwgImxhbmciLCBudWxsLCAwLCAxLCBOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlZ2lzdHJ5RUNsYXNzLCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5LmNsYXNzLCAiUmVnaXN0cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlZ2lzdHJ5X05hbWUoKSwgdGhpcy5nZXROYW1lXygpLCBudWxsLCAibmFtZSIsIG51bGwsIDEsIC0xLCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZWdpc3RyeV9EZXNjcmlwdGlvbigpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDEsIC0xLCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZWdpc3RyeV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRBbnlVUkkoKSwgImlkIiwgbnVsbCwgMCwgMSwgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlZ2lzdHJ5X0xvY2F0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEFueVVSSSgpLCAibG9jYXRpb24iLCBudWxsLCAwLCAxLCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVnaXN0cnlfUmVmKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEFueVVSSSgpLCAicmVmIiwgbnVsbCwgMCwgMSwgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0aW9uX1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIjowIiwKLQkJCSAia2luZCIsICJzaW1wbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRpb25fTGFuZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImxhbmciLAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRvY3VtZW50Um9vdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiIiwKLQkJCSAia2luZCIsICJtaXhlZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudFdpbGRjYXJkIiwKLQkJCSAibmFtZSIsICI6bWl4ZWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAieG1sbnM6cHJlZml4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInhzaTpzY2hlbWFMb2NhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAibmFtZSIsCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfUmVnaXN0cnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAicmVnaXN0cnkiLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobmFtZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTmFtZSIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE5hbWVfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiOjAiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXROYW1lX0xhbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJsYW5nIiwKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZWdpc3RyeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUmVnaXN0cnkiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlZ2lzdHJ5X05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZWdpc3RyeV9EZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZWdpc3RyeV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlZ2lzdHJ5X0xvY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibG9jYXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVnaXN0cnlfUmVmKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAicmVmIgotCQkgICB9KTsKLQl9Ci0KLX0gLy9SZWdpc3RyeVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS91dGlsL1JlZ2lzdHJ5QWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L3V0aWwvUmVnaXN0cnlBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWIyMDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L3V0aWwvUmVnaXN0cnlBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVnaXN0cnlBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NTEgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBSZWdpc3RyeVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFJlZ2lzdHJ5UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVnaXN0cnlTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgUmVnaXN0cnlTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lKE5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWdpc3RyeShSZWdpc3RyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVnaXN0cnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5EZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5OYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkgPGVtPlJlZ2lzdHJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVnaXN0cnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vUmVnaXN0cnlBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvdXRpbC9SZWdpc3RyeVJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L3V0aWwvUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzg3MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvdXRpbC9SZWdpc3RyeVJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo1MSBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkudXRpbC5SZWdpc3RyeVJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkTWV0YURhdGEgZXh0ZW5kZWRNZXRhRGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5UmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZXh0ZW5kZWRNZXRhRGF0YSA9IEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IFJlZ2lzdHJ5UmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgZXh0ZW5kZWRNZXRhRGF0YSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgZXh0ZW5kZWRNZXRhRGF0YSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9SZWdpc3RyeVJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L3V0aWwvUmVnaXN0cnlSZXNvdXJjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3JlZ2lzdHJ5L3V0aWwvUmVnaXN0cnlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViZmMwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS91dGlsL1JlZ2lzdHJ5UmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlZ2lzdHJ5UmVzb3VyY2VJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo1MSBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS51dGlsLlJlZ2lzdHJ5UmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVnaXN0cnlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCi19IC8vUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS91dGlsL1JlZ2lzdHJ5U3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9yZWdpc3RyeS91dGlsL1JlZ2lzdHJ5U3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTM3MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkvdXRpbC9SZWdpc3RyeVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVnaXN0cnlTd2l0Y2guamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjUxIGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBSZWdpc3RyeVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5ERVNDUklQVElPTjogewotCQkJCURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogewotCQkJCURvY3VtZW50Um9vdCBkb2N1bWVudFJvb3QgPSAoRG9jdW1lbnRSb290KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEb2N1bWVudFJvb3QoZG9jdW1lbnRSb290KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFJlZ2lzdHJ5UGFja2FnZS5OQU1FOiB7Ci0JCQkJTmFtZSBuYW1lID0gKE5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU5hbWUobmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBSZWdpc3RyeVBhY2thZ2UuUkVHSVNUUlk6IHsKLQkJCQlSZWdpc3RyeSByZWdpc3RyeSA9IChSZWdpc3RyeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVnaXN0cnkocmVnaXN0cnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU5hbWUoTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZ2lzdHJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZ2lzdHJ5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWdpc3RyeShSZWdpc3RyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vUmVnaXN0cnlTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvRGVzY3JpcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3NzYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRGVzY3JpcHRpb24jZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRGVzY3JpcHRpb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlI2dldERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdGlvbiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlI2dldERlc2NyaXB0aW9uX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRlc2NyaXB0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZSNnZXREZXNjcmlwdGlvbl9MYW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5MYW5ndWFnZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExhbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbiNnZXRMYW5nIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvRG9jdW1lbnRSb290LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L0RvY3VtZW50Um9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMzODhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvRG9jdW1lbnRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3QuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ4IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290I2dldEluZGV4IDxlbT5JbmRleDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFJvb3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWl4ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlI2dldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpCi0JICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIga2V5VHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWVUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlI2dldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIga2V5VHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWVUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oRGVzY3JpcHRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKERlc2NyaXB0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5kZXgoSW5kZXgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X0luZGV4KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5kZXggZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluZGV4KEluZGV4IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TmFtZShOYW1lKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlI2dldERvY3VtZW50Um9vdF9OYW1lKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTmFtZSBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoTmFtZSB2YWx1ZSk7Ci0KLX0gLy8gRG9jdW1lbnRSb290CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L0luZGV4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L0luZGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWE0YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9JbmRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJbmRleC5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDggY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkluZGV4I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleCNnZXRSZWdpc3RyeSA8ZW0+UmVnaXN0cnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleCNnZXRUYXhvbm9teSA8ZW0+VGF4b25vbXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZSNnZXRJbmRleCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5kZXggZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4Lk5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2UjZ2V0SW5kZXhfTmFtZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5OYW1lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZSNnZXRJbmRleF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWdpc3RyeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVnaXN0cnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWdpc3RyeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZSNnZXRJbmRleF9SZWdpc3RyeSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXhvbm9teTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGF4b25vbXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXhvbm9teTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZSNnZXRJbmRleF9UYXhvbm9teSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRheG9ub215KCk7Ci0KLX0gLy8gSW5kZXgKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvTmFtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDVmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE5hbWUuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ4IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4Lk5hbWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguTmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2UjZ2V0TmFtZV8oKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZSNnZXROYW1lX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4Lk5hbWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlI2dldE5hbWVfTGFuZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuTGFuZ3VhZ2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguTmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTmFtZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9SVEluZGV4RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9SVEluZGV4RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRiNzA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvUlRJbmRleEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUlRJbmRleEZhY3RvcnkuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ4IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJUSW5kZXhGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUlRJbmRleEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLlJUSW5kZXhGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5kZXg8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluZGV4PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmRleCBjcmVhdGVJbmRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlOYW1lIGNyZWF0ZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUlRJbmRleFBhY2thZ2UgZ2V0UlRJbmRleFBhY2thZ2UoKTsKLQotfSAvL1JUSW5kZXhGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L1JUSW5kZXhQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L1JUSW5kZXhQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDJiZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9SVEluZGV4UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUlRJbmRleFBhY2thZ2UuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ4IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAgICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gKiAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAgIAotICogICAgIHNwYWNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlCi0gKiAgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZwotICogICAgICAgICAgZGlzY2lwbGluZSBpcyBpbnRlbmRlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQ7IGl0cwotICogICAgICAgICAgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IHZpcnR1ZSBvZiBpdHMKLSAqICAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgRmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpOiBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAotICogICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAotICogICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKLSAqICAgICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgotICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKLSAqICAgCi0gKiBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICogICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gKiAgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcsIHhtbDpzcGFjZSBvciB4bWw6aWQKLSAqICAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLSAqIAotICogICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICogICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAqICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICogICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7Ci0gKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0gKiAKLSAqICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OwotICogIAotICogICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gKiAgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMKLSAqIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAqICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuCi0gKiAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICogICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAqICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAqICAgIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTAotICogICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gKiAgICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCi0gKiAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSVEluZGV4UGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJydGluZGV4IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleCI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJydGluZGV4IjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUlRJbmRleFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuUlRJbmRleFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLkRlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuUlRJbmRleFBhY2thZ2VJbXBsI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX19MQU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5Eb2N1bWVudFJvb3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5SVEluZGV4UGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NSVhFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX0RFU0NSSVBUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX0lOREVYID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTkFNRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuSW5kZXhJbXBsIDxlbT5JbmRleDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLkluZGV4SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuUlRJbmRleFBhY2thZ2VJbXBsI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOREVYID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTkRFWF9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYX19ERVNDUklQVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVnaXN0cnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYX19SRUdJU1RSWSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGF4b25vbXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYX19UQVhPTk9NWSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5OYW1lSW1wbCA8ZW0+TmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLk5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5SVEluZGV4UGFja2FnZUltcGwjZ2V0TmFtZV8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FX19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVfX0xBTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5OYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbiNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbiNnZXRMYW5nIDxlbT5MYW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFuZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbiNnZXRMYW5nKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRpb25fTGFuZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1peGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290I2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290I2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCNnZXRJbmRleCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfSW5kZXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkluZGV4IDxlbT5JbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguSW5kZXgjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW5kZXhfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkluZGV4I2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW5kZXhfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguSW5kZXgjZ2V0UmVnaXN0cnkgPGVtPlJlZ2lzdHJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZWdpc3RyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleCNnZXRSZWdpc3RyeSgpCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEluZGV4X1JlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkluZGV4I2dldFRheG9ub215IDxlbT5UYXhvbm9teTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGF4b25vbXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguSW5kZXgjZ2V0VGF4b25vbXkoKQotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbmRleF9UYXhvbm9teSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4Lk5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5OYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROYW1lXygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguTmFtZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5OYW1lI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXROYW1lXygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguTmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFuZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5OYW1lI2dldExhbmcoKQotCSAqIEBzZWUgI2dldE5hbWVfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROYW1lX0xhbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJUSW5kZXhGYWN0b3J5IGdldFJUSW5kZXhGYWN0b3J5KCk7Ci0KLX0gLy9SVEluZGV4UGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjhjYjUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvaW1wbC9EZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDggY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5EZXNjcmlwdGlvbkltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5EZXNjcmlwdGlvbkltcGwjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFuZyA9IExBTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gUlRJbmRleFBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUlRJbmRleFBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBsYW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIG5ld0xhbmcpIHsKLQkJU3RyaW5nIG9sZExhbmcgPSBsYW5nOwotCQlsYW5nID0gbmV3TGFuZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUlRJbmRleFBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkcsIG9sZExhbmcsIGxhbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJcmV0dXJuIGdldExhbmcoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXNldExhbmcoTEFOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFuZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFuZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGRiYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERvY3VtZW50Um9vdEltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ4IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4Lk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9jdW1lbnQgUm9vdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRSb290SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRSb290IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhNTE5TUHJlZml4TWFwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRSb290SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFJUSW5kZXhQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRCk7Ci0JCX0KLQkJcmV0dXJuIG1peGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwIGdldFhNTE5TUHJlZml4TWFwKCkgewotCQlpZiAoeE1MTlNQcmVmaXhNYXAgPT0gbnVsbCkgewotCQkJeE1MTlNQcmVmaXhNYXAgPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJfQotCQlyZXR1cm4geE1MTlNQcmVmaXhNYXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRGVzY3JpcHRpb24pZ2V0TWl4ZWQoKS5nZXQoUlRJbmRleFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9EZXNjcmlwdGlvbigpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFJUSW5kZXhQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfRGVzY3JpcHRpb24oKSwgbmV3RGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoUlRJbmRleFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9EZXNjcmlwdGlvbigpLCBuZXdEZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluZGV4IGdldEluZGV4KCkgewotCQlyZXR1cm4gKEluZGV4KWdldE1peGVkKCkuZ2V0KFJUSW5kZXhQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfSW5kZXgoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5kZXgoSW5kZXggbmV3SW5kZXgsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChSVEluZGV4UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X0luZGV4KCksIG5ld0luZGV4LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChJbmRleCBuZXdJbmRleCkgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFJUSW5kZXhQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfSW5kZXgoKSwgbmV3SW5kZXgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoTmFtZSlnZXRNaXhlZCgpLmdldChSVEluZGV4UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X05hbWUoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TmFtZShOYW1lIG5ld05hbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChSVEluZGV4UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X05hbWUoKSwgbmV3TmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShOYW1lIG5ld05hbWUpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChSVEluZGV4UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X05hbWUoKSwgbmV3TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFhNTE5TUHJlZml4TWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fREVTQ1JJUFRJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldERlc2NyaXB0aW9uKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fSU5ERVg6Ci0JCQkJCXJldHVybiBiYXNpY1NldEluZGV4KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTkFNRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0TmFtZShudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIGdldE1peGVkKCk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19JTkRFWDoKLQkJCQlyZXR1cm4gZ2V0SW5kZXgoKTsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCWdldE1peGVkKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChEZXNjcmlwdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19JTkRFWDoKLQkJCQlzZXRJbmRleCgoSW5kZXgpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTkFNRToKLQkJCQlzZXROYW1lKChOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKERlc2NyaXB0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKEluZGV4KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTkFNRToKLQkJCQlzZXROYW1lKChOYW1lKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCkgIT0gbnVsbDsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fSU5ERVg6Ci0JCQkJcmV0dXJuIGdldEluZGV4KCkgIT0gbnVsbDsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L2ltcGwvSW5kZXhJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L2ltcGwvSW5kZXhJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZGMwOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL0luZGV4SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSW5kZXhJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4Lk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluZGV4PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5JbmRleEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuSW5kZXhJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuSW5kZXhJbXBsI2dldFJlZ2lzdHJ5IDxlbT5SZWdpc3RyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LmltcGwuSW5kZXhJbXBsI2dldFRheG9ub215IDxlbT5UYXhvbm9teTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluZGV4SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSW5kZXggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ2lzdHJ5KCkgPGVtPlJlZ2lzdHJ5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ2lzdHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVnaXN0cnkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGF4b25vbXkoKSA8ZW0+VGF4b25vbXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGF4b25vbXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YXhvbm9teSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5kZXhJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gUlRJbmRleFBhY2thZ2UuZUlOU1RBTkNFLmdldEluZGV4KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE5hbWUoKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTmFtZS5jbGFzcywgdGhpcywgUlRJbmRleFBhY2thZ2UuSU5ERVhfX05BTUUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBSVEluZGV4UGFja2FnZS5JTkRFWF9fREVTQ1JJUFRJT04pOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVnaXN0cnkoKSB7Ci0JCWlmIChyZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlyZWdpc3RyeSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZWdpc3RyeS5jbGFzcywgdGhpcywgUlRJbmRleFBhY2thZ2UuSU5ERVhfX1JFR0lTVFJZKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRheG9ub215KCkgewotCQlpZiAodGF4b25vbXkgPT0gbnVsbCkgewotCQkJdGF4b25vbXkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGF4b25vbXkuY2xhc3MsIHRoaXMsIFJUSW5kZXhQYWNrYWdlLklOREVYX19UQVhPTk9NWSk7Ci0JCX0KLQkJcmV0dXJuIHRheG9ub215OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuSU5ERVhfX05BTUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TmFtZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBSVEluZGV4UGFja2FnZS5JTkRFWF9fREVTQ1JJUFRJT046Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuSU5ERVhfX1JFR0lTVFJZOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlZ2lzdHJ5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFJUSW5kZXhQYWNrYWdlLklOREVYX19UQVhPTk9NWToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYXhvbm9teSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLklOREVYX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLklOREVYX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuSU5ERVhfX1JFR0lTVFJZOgotCQkJCXJldHVybiBnZXRSZWdpc3RyeSgpOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5JTkRFWF9fVEFYT05PTVk6Ci0JCQkJcmV0dXJuIGdldFRheG9ub215KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5JTkRFWF9fTkFNRToKLQkJCQlnZXROYW1lKCkuY2xlYXIoKTsKLQkJCQlnZXROYW1lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLklOREVYX19ERVNDUklQVElPTjoKLQkJCQlnZXREZXNjcmlwdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuSU5ERVhfX1JFR0lTVFJZOgotCQkJCWdldFJlZ2lzdHJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRSZWdpc3RyeSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5JTkRFWF9fVEFYT05PTVk6Ci0JCQkJZ2V0VGF4b25vbXkoKS5jbGVhcigpOwotCQkJCWdldFRheG9ub215KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5JTkRFWF9fTkFNRToKLQkJCQlnZXROYW1lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLklOREVYX19ERVNDUklQVElPTjoKLQkJCQlnZXREZXNjcmlwdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5JTkRFWF9fUkVHSVNUUlk6Ci0JCQkJZ2V0UmVnaXN0cnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuSU5ERVhfX1RBWE9OT01ZOgotCQkJCWdldFRheG9ub215KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuSU5ERVhfX05BTUU6Ci0JCQkJcmV0dXJuIG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5pc0VtcHR5KCk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLklOREVYX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb24gIT0gbnVsbCAmJiAhZGVzY3JpcHRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5JTkRFWF9fUkVHSVNUUlk6Ci0JCQkJcmV0dXJuIHJlZ2lzdHJ5ICE9IG51bGwgJiYgIXJlZ2lzdHJ5LmlzRW1wdHkoKTsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuSU5ERVhfX1RBWE9OT01ZOgotCQkJCXJldHVybiB0YXhvbm9teSAhPSBudWxsICYmICF0YXhvbm9teS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0luZGV4SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL05hbWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L2ltcGwvTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2ODUyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L2ltcGwvTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE5hbWVJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5OYW1lSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLk5hbWVJbXBsI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTmFtZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsYW5nID0gTEFOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFJUSW5kZXhQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lXygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJUSW5kZXhQYWNrYWdlLk5BTUVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBsYW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIG5ld0xhbmcpIHsKLQkJU3RyaW5nIG9sZExhbmcgPSBsYW5nOwotCQlsYW5nID0gbmV3TGFuZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUlRJbmRleFBhY2thZ2UuTkFNRV9fTEFORywgb2xkTGFuZywgbGFuZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuTkFNRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLk5BTUVfX0xBTkc6Ci0JCQkJcmV0dXJuIGdldExhbmcoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLk5BTUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuTkFNRV9fTEFORzoKLQkJCQlzZXRMYW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLk5BTUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLk5BTUVfX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuTkFNRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLk5BTUVfX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFuZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFuZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL05hbWVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L2ltcGwvUlRJbmRleEZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L2ltcGwvUlRJbmRleEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmEzM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL1JUSW5kZXhGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUlRJbmRleEZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJUSW5kZXhGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFJUSW5kZXhGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUlRJbmRleEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLkRFU0NSSVBUSU9OOiByZXR1cm4gY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5JTkRFWDogcmV0dXJuIGNyZWF0ZUluZGV4KCk7Ci0JCQljYXNlIFJUSW5kZXhQYWNrYWdlLk5BTUU6IHJldHVybiBjcmVhdGVOYW1lKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oKSB7Ci0JCURlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb2N1bWVudFJvb3QgY3JlYXRlRG9jdW1lbnRSb290KCkgewotCQlEb2N1bWVudFJvb3RJbXBsIGRvY3VtZW50Um9vdCA9IG5ldyBEb2N1bWVudFJvb3RJbXBsKCk7Ci0JCXJldHVybiBkb2N1bWVudFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluZGV4IGNyZWF0ZUluZGV4KCkgewotCQlJbmRleEltcGwgaW5kZXggPSBuZXcgSW5kZXhJbXBsKCk7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZSBjcmVhdGVOYW1lKCkgewotCQlOYW1lSW1wbCBuYW1lID0gbmV3IE5hbWVJbXBsKCk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSVEluZGV4UGFja2FnZSBnZXRSVEluZGV4UGFja2FnZSgpIHsKLQkJcmV0dXJuIChSVEluZGV4UGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSVEluZGV4UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gUlRJbmRleFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL1JUSW5kZXhGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL1JUSW5kZXhQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC9pbXBsL1JUSW5kZXhQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTk3NTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvaW1wbC9SVEluZGV4UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJUSW5kZXhQYWNrYWdlSW1wbC5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDggY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuUmVnaXN0cnlQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuVGF4b25vbXlQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5pbXBsLlVERElSZWdpc3RyeVBhY2thZ2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJUSW5kZXhQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFJUSW5kZXhQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb2N1bWVudFJvb3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW5kZXhFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJUSW5kZXhQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgUlRJbmRleEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUlRJbmRleFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFJUSW5kZXhQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJUSW5kZXhQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJUlRJbmRleFBhY2thZ2VJbXBsIHRoZVJUSW5kZXhQYWNrYWdlID0gKFJUSW5kZXhQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBSVEluZGV4UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBSVEluZGV4UGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVRheG9ub215UGFja2FnZUltcGwgdGhlVGF4b25vbXlQYWNrYWdlID0gKFRheG9ub215UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRheG9ub215UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRheG9ub215UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYXhvbm9teVBhY2thZ2UuZU5TX1VSSSkgOiBUYXhvbm9teVBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7Ci0JCVJlZ2lzdHJ5UGFja2FnZUltcGwgdGhlUmVnaXN0cnlQYWNrYWdlID0gKFJlZ2lzdHJ5UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJlZ2lzdHJ5UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFJlZ2lzdHJ5UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZWdpc3RyeVBhY2thZ2UuZU5TX1VSSSkgOiBSZWdpc3RyeVBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7Ci0JCVVERElSZWdpc3RyeVBhY2thZ2VJbXBsIHRoZVVERElSZWdpc3RyeVBhY2thZ2UgPSAoVURESVJlZ2lzdHJ5UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFVERElSZWdpc3RyeVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBVRERJUmVnaXN0cnlQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFVERElSZWdpc3RyeVBhY2thZ2UuZU5TX1VSSSkgOiBVRERJUmVnaXN0cnlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVJUSW5kZXhQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYXhvbm9teVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVJlZ2lzdHJ5UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVURESVJlZ2lzdHJ5UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVJUSW5kZXhQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGF4b25vbXlQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUmVnaXN0cnlQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVURESVJlZ2lzdHJ5UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVSVEluZGV4UGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlUlRJbmRleFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdGlvbl9MYW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvY3VtZW50Um9vdCgpIHsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfSW5kZXgoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTmFtZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbmRleF9OYW1lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5kZXhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbmRleF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluZGV4RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5kZXhfUmVnaXN0cnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbmRleEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluZGV4X1RheG9ub215KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5kZXhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVfKCkgewotCQlyZXR1cm4gbmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVfTGFuZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUlRJbmRleEZhY3RvcnkgZ2V0UlRJbmRleEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoUlRJbmRleEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJZGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVElPTl9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVElPTl9fTEFORyk7Ci0KLQkJZG9jdW1lbnRSb290RUNsYXNzID0gY3JlYXRlRUNsYXNzKERPQ1VNRU5UX1JPT1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX0lOREVYKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX05BTUUpOwotCi0JCWluZGV4RUNsYXNzID0gY3JlYXRlRUNsYXNzKElOREVYKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbmRleEVDbGFzcywgSU5ERVhfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGluZGV4RUNsYXNzLCBJTkRFWF9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGluZGV4RUNsYXNzLCBJTkRFWF9fUkVHSVNUUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGluZGV4RUNsYXNzLCBJTkRFWF9fVEFYT05PTVkpOwotCi0JCW5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZUVDbGFzcywgTkFNRV9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG5hbWVFQ2xhc3MsIE5BTUVfX0xBTkcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlYTUxUeXBlUGFja2FnZUltcGwgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCQlSZWdpc3RyeVBhY2thZ2VJbXBsIHRoZVJlZ2lzdHJ5UGFja2FnZSA9IChSZWdpc3RyeVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJlZ2lzdHJ5UGFja2FnZS5lTlNfVVJJKTsKLQkJVGF4b25vbXlQYWNrYWdlSW1wbCB0aGVUYXhvbm9teVBhY2thZ2UgPSAoVGF4b25vbXlQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYXhvbm9teVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRpb25FQ2xhc3MsIERlc2NyaXB0aW9uLmNsYXNzLCAiRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX0xhbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0TGFuZ3VhZ2UoKSwgImxhbmciLCBudWxsLCAwLCAxLCBEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkb2N1bWVudFJvb3RFQ2xhc3MsIERvY3VtZW50Um9vdC5jbGFzcywgIkRvY3VtZW50Um9vdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieFNJU2NoZW1hTG9jYXRpb24iLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X0Rlc2NyaXB0aW9uKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9JbmRleCgpLCB0aGlzLmdldEluZGV4KCksIG51bGwsICJpbmRleCIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfTmFtZSgpLCB0aGlzLmdldE5hbWVfKCksIG51bGwsICJuYW1lIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpbmRleEVDbGFzcywgSW5kZXguY2xhc3MsICJJbmRleCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5kZXhfTmFtZSgpLCB0aGlzLmdldE5hbWVfKCksIG51bGwsICJuYW1lIiwgbnVsbCwgMSwgLTEsIEluZGV4LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbmRleF9EZXNjcmlwdGlvbigpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDEsIC0xLCBJbmRleC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5kZXhfUmVnaXN0cnkoKSwgdGhlUmVnaXN0cnlQYWNrYWdlLmdldFJlZ2lzdHJ5KCksIG51bGwsICJyZWdpc3RyeSIsIG51bGwsIDAsIC0xLCBJbmRleC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5kZXhfVGF4b25vbXkoKSwgdGhlVGF4b25vbXlQYWNrYWdlLmdldFRheG9ub215KCksIG51bGwsICJ0YXhvbm9teSIsIG51bGwsIDAsIC0xLCBJbmRleC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG5hbWVFQ2xhc3MsIE5hbWUuY2xhc3MsICJOYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZV9MYW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldExhbmd1YWdlKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0aW9uX1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIjowIiwKLQkJCSAia2luZCIsICJzaW1wbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRpb25fTGFuZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImxhbmciLAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRvY3VtZW50Um9vdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiIiwKLQkJCSAia2luZCIsICJtaXhlZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudFdpbGRjYXJkIiwKLQkJCSAibmFtZSIsICI6bWl4ZWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAieG1sbnM6cHJlZml4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInhzaTpzY2hlbWFMb2NhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X0luZGV4KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImluZGV4IiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIm5hbWUiLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaW5kZXhFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkluZGV4IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbmRleF9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIm5hbWUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW5kZXhfRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW5kZXhfUmVnaXN0cnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAicmVnaXN0cnkiLAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcmVnaXN0cnkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW5kZXhfVGF4b25vbXkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAidGF4b25vbXkiLAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobmFtZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTmFtZSIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE5hbWVfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiOjAiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXROYW1lX0xhbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJsYW5nIiwKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLQkJICAgfSk7Ci0JfQotCi19IC8vUlRJbmRleFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L3V0aWwvUlRJbmRleEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC9ydGluZGV4L3V0aWwvUlRJbmRleEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZGU0MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC91dGlsL1JUSW5kZXhBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUlRJbmRleEFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0NyBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUlRJbmRleEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBSVEluZGV4UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJUSW5kZXhBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBSVEluZGV4UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUlRJbmRleFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBSVEluZGV4U3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW5kZXgoSW5kZXggb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUluZGV4QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTmFtZShOYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5EZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguSW5kZXggPGVtPkluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5JbmRleAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbmRleEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4Lk5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4Lk5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9SVEluZGV4QWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvdXRpbC9SVEluZGV4UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC91dGlsL1JUSW5kZXhSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDlmY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC91dGlsL1JUSW5kZXhSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJUSW5kZXhSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0NyBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlRmFjdG9yeUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LnV0aWwuUlRJbmRleFJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUlRJbmRleFJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRNZXRhRGF0YSBleHRlbmRlZE1ldGFEYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUlRJbmRleFJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWV4dGVuZGVkTWV0YURhdGEgPSBFeHRlbmRlZE1ldGFEYXRhLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBSVEluZGV4UmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgZXh0ZW5kZWRNZXRhRGF0YSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgZXh0ZW5kZWRNZXRhRGF0YSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9SVEluZGV4UmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC91dGlsL1JUSW5kZXhSZXNvdXJjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvdXRpbC9SVEluZGV4UmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzE2NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC91dGlsL1JUSW5kZXhSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUlRJbmRleFJlc291cmNlSW1wbC5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDcgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXgudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LnV0aWwuUlRJbmRleFJlc291cmNlRmFjdG9yeUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJUSW5kZXhSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSVEluZGV4UmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLX0gLy9SVEluZGV4UmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC91dGlsL1JUSW5kZXhTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3J0aW5kZXgvdXRpbC9SVEluZGV4U3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODViZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvcnRpbmRleC91dGlsL1JUSW5kZXhTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJUSW5kZXhTd2l0Y2guamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ3IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJUSW5kZXhTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgUlRJbmRleFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSVEluZGV4U3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFJUSW5kZXhQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ERVNDUklQVElPTjogewotCQkJCURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBSVEluZGV4UGFja2FnZS5ET0NVTUVOVF9ST09UOiB7Ci0JCQkJRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCA9IChEb2N1bWVudFJvb3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURvY3VtZW50Um9vdChkb2N1bWVudFJvb3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuSU5ERVg6IHsKLQkJCQlJbmRleCBpbmRleCA9IChJbmRleCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW5kZXgoaW5kZXgpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgUlRJbmRleFBhY2thZ2UuTkFNRTogewotCQkJCU5hbWUgbmFtZSA9IChOYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VOYW1lKG5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbmRleDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbmRleDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5kZXgoSW5kZXggb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU5hbWUoTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vUlRJbmRleFN3aXRjaApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvQ2F0ZWdvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L0NhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1M2Q5NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhdGVnb3J5LmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OSBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeSNnZXRObG5hbWUgPGVtPk5sbmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeSNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnkjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215UGFja2FnZSNnZXRDYXRlZ29yeSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2F0ZWdvcnkgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5ObG5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215Lk5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmxuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmxuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2UjZ2V0Q2F0ZWdvcnlfTmxuYW1lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRObG5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRlZ29yeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2UjZ2V0Q2F0ZWdvcnlfQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkNhdGVnb3J5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb2RlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldENhdGVnb3J5X0NvZGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnkjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldENhdGVnb3J5X05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIENhdGVnb3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9Eb2N1bWVudFJvb3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L0RvY3VtZW50Um9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzAyNGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L0RvY3VtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290LmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OSBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9jdW1lbnQgUm9vdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXRUYXhvbm9teSA8ZW0+VGF4b25vbXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldERvY3VtZW50Um9vdCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRSb290IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215UGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWl4ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215UGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhdGVnb3J5KENhdGVnb3J5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X0NhdGVnb3J5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuRG9jdW1lbnRSb290I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXRlZ29yeShDYXRlZ29yeSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE5hbWUoTmFtZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldERvY3VtZW50Um9vdF9OYW1lKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTmFtZSBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKE5hbWUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGF4b25vbXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRheG9ub215PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRheG9ub215PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUYXhvbm9teShUYXhvbm9teSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldERvY3VtZW50Um9vdF9UYXhvbm9teSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRheG9ub215IGdldFRheG9ub215KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXRUYXhvbm9teSA8ZW0+VGF4b25vbXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRheG9ub215PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYXhvbm9teSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGF4b25vbXkoVGF4b25vbXkgdmFsdWUpOwotCi19IC8vIERvY3VtZW50Um9vdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvTmFtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDFlY2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZS5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDkgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldE5hbWVfKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215UGFja2FnZSNnZXROYW1lX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldE5hbWVfTGFuZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuTGFuZ3VhZ2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215Lk5hbWUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFuZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L1RheG9ub215LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9UYXhvbm9teS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTRiZTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L1RheG9ub215LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXhvbm9teS5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDkgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRheG9ub215PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0TmxuYW1lIDxlbT5ObG5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSNnZXRSZWYgPGVtPlJlZjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSNnZXRUbW9kZWxLZXkgPGVtPlRtb2RlbCBLZXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldFRheG9ub215KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXhvbm9teSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5sbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuTmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ObG5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ObG5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215UGFja2FnZSNnZXRUYXhvbm9teV9ObG5hbWUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215Lk5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE5sbmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkNhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215UGFja2FnZSNnZXRUYXhvbm9teV9DYXRlZ29yeSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldFRheG9ub215X0lkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlVUkkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2UjZ2V0VGF4b25vbXlfTG9jYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVVSSSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215I2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldFRheG9ub215X05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWY8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWYoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2UjZ2V0VGF4b25vbXlfUmVmKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlVUkkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWYoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0UmVmIDxlbT5SZWY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWYoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRtb2RlbCBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRtb2RlbCBLZXk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG1vZGVsIEtleTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG1vZGVsS2V5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlI2dldFRheG9ub215X1Rtb2RlbEtleSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRtb2RlbEtleSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSNnZXRUbW9kZWxLZXkgPGVtPlRtb2RlbCBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRtb2RlbCBLZXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRtb2RlbEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VG1vZGVsS2V5KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGF4b25vbXkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L1RheG9ub215RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvVGF4b25vbXlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNmZkYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvVGF4b25vbXlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRheG9ub215RmFjdG9yeS5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDkgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGF4b25vbXlGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGF4b25vbXlGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuVGF4b25vbXlGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2F0ZWdvcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhdGVnb3J5IGNyZWF0ZUNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTmFtZSBjcmVhdGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRheG9ub215PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXhvbm9teTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGF4b25vbXkgY3JlYXRlVGF4b25vbXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGF4b25vbXlQYWNrYWdlIGdldFRheG9ub215UGFja2FnZSgpOwotCi19IC8vVGF4b25vbXlGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9UYXhvbm9teVBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L1RheG9ub215UGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmQ5NmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L1RheG9ub215UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGF4b25vbXlQYWNrYWdlLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OSBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgotICogCi0gKiAgICAgVGhpcyBzY2hlbWEgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBYTUwgbmFtZXNwYWNlLCBpbiBhIGZvcm0KLSAqICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuICAKLSAqIAotICogICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUgZGVmaW5lZAotICogICAgIG9ubHkgYnkgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gb3IgaXRzIHN1Ymdyb3Vwcy4gIFRoZQotICogICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZAotICogICAgIG5vdCBiZSB1c2VkIHdpdGggY29uZmxpY3Rpbmcgc2VtYW50aWNzIGJ5IGFueSBXb3JraW5nIEdyb3VwLAotICogICAgIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlOgotICogCi0gKiAgICAgYmFzZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgcHJvdmlkZXMgYSBVUkkgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgaW50ZXJwcmV0aW5nIGFueQotICogICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQKLSAqICAgICAgICAgIGFwcGVhcnM7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIEJhc2Ugc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIGlkICAgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBpZiBkZWNsYXJlZCB0byBiZSBvZiB0eXBlIElELgotICogICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sCi0gKiAgICAgICAgICBidXQgdGhpcyBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgaGVyZSB0byBmYWNpbGl0YXRlIGV4cGVyaW1lbnRhdGlvbgotICogICAgICAgICAgd2l0aCB0aGUgbWVjaGFuaXNtcyBpdCBwcm9wb3Nlcy4gIE5vdGUgdGhhdCBpdCBpcyBfbm90XyBpbmNsdWRlZAotICogICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuCi0gKiAKLSAqICAgICBsYW5nIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mCi0gKiAgICAgICAgICBhbnkgZWxlbWVudDsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqICAgCi0gKiAgICAgc3BhY2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UKLSAqICAgICAgICAgIHZhbHVlIGlzIGEga2V5d29yZCBpbmRpY2F0aW5nIHdoYXQgd2hpdGVzcGFjZSBwcm9jZXNzaW5nCi0gKiAgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzCi0gKiAgICAgICAgICB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgdmlydHVlIG9mIGl0cwotICogICAgICAgICAgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBGYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk6IGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCi0gKiAgICAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCi0gKiAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAotICogICAgICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6Ci0gKiAKLSAqICAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24KLSAqICAgICAgICAgICAgICB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YgRmVicnVhcnksIDIwMDAKLSAqICAgICAgICAgICAgICByZXNlcnZlcyBmb3IgSm9uIEJvc2FrIGluIHBlcnBldHVpdHkgdGhlIFhNTCBuYW1lCi0gKiAgICAgICAgICAgICAgeG1sOkZhdGhlcgotICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKLSAqIAotICogICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gKiAgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLSAqIAotICogICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8mZ3Q7Ci0gKiAgCi0gKiAgICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAqICAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcwotICogSW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICogICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZC4KLSAqICAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gKiAgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICogICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICogICAgaXRzZWxmLCBvciB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MCi0gKiAgICBTY2hlbWEgb3IgWE1MIG5hbWVzcGFjZXMgY2hhbmdlLCB0aGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAqICAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAqICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGF4b25vbXlQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gInRheG9ub215IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAidGF4b25vbXkiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXhvbm9teVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLlRheG9ub215UGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuQ2F0ZWdvcnlJbXBsIDxlbT5DYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5DYXRlZ29yeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5UYXhvbm9teVBhY2thZ2VJbXBsI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBVEVHT1JZID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ObG5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBVEVHT1JZX19OTE5BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVRFR09SWV9fQ0FURUdPUlkgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVRFR09SWV9fQ09ERSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBVEVHT1JZX19OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FURUdPUllfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5Eb2N1bWVudFJvb3RJbXBsIDxlbT5Eb2N1bWVudCBSb290PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5UYXhvbm9teVBhY2thZ2VJbXBsI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19DQVRFR09SWSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX05BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRheG9ub215PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fVEFYT05PTVkgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5OYW1lSW1wbCA8ZW0+TmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5OYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLlRheG9ub215UGFja2FnZUltcGwjZ2V0TmFtZV8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FX19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVfX0xBTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5OYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5UYXhvbm9teUltcGwgPGVtPlRheG9ub215PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLlRheG9ub215SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLlRheG9ub215UGFja2FnZUltcGwjZ2V0VGF4b25vbXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFYT05PTVkgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5sbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFYT05PTVlfX05MTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBWE9OT01ZX19DQVRFR09SWSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVhPTk9NWV9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFYT05PTVlfX0xPQ0FUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFYT05PTVlfX05BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBWE9OT01ZX19SRUYgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRtb2RlbCBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVhPTk9NWV9fVE1PREVMX0tFWSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRheG9ub215PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBWE9OT01ZX0ZFQVRVUkVfQ09VTlQgPSA3OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkNhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeSNnZXRObG5hbWUgPGVtPk5sbmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmxuYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeSNnZXRObG5hbWUoKQotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDYXRlZ29yeV9ObG5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkNhdGVnb3J5I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkNhdGVnb3J5I2dldENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q2F0ZWdvcnlfQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeSNnZXRDb2RlIDxlbT5Db2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnkjZ2V0Q29kZSgpCi0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhdGVnb3J5X0NvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnkjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhdGVnb3J5X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuRG9jdW1lbnRSb290I2dldE1peGVkKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERvY3VtZW50Um9vdF9NaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuRG9jdW1lbnRSb290I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X0NhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuRG9jdW1lbnRSb290I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCNnZXRUYXhvbm9teSA8ZW0+VGF4b25vbXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UYXhvbm9teTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuRG9jdW1lbnRSb290I2dldFRheG9ub215KCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9UYXhvbm9teSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215Lk5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5hbWVfKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuTmFtZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuTmFtZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0TmFtZV8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE5hbWVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lI2dldExhbmcoKQotCSAqIEBzZWUgI2dldE5hbWVfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROYW1lX0xhbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkgPGVtPlRheG9ub215PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRheG9ub215PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGF4b25vbXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215I2dldE5sbmFtZSA8ZW0+TmxuYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5ObG5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215I2dldE5sbmFtZSgpCi0JICogQHNlZSAjZ2V0VGF4b25vbXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRheG9ub215X05sbmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldFRheG9ub215KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXhvbm9teV9DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0VGF4b25vbXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRheG9ub215X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215I2dldExvY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRUYXhvbm9teSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGF4b25vbXlfTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0VGF4b25vbXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRheG9ub215X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSNnZXRSZWYgPGVtPlJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0UmVmKCkKLQkgKiBAc2VlICNnZXRUYXhvbm9teSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGF4b25vbXlfUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0VG1vZGVsS2V5IDxlbT5UbW9kZWwgS2V5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG1vZGVsIEtleTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkjZ2V0VG1vZGVsS2V5KCkKLQkgKiBAc2VlICNnZXRUYXhvbm9teSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGF4b25vbXlfVG1vZGVsS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXhvbm9teUZhY3RvcnkgZ2V0VGF4b25vbXlGYWN0b3J5KCk7Ci0KLX0gLy9UYXhvbm9teVBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L2ltcGwvQ2F0ZWdvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9pbXBsL0NhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWIyZTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L2ltcGwvQ2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYXRlZ29yeUltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ4IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5DYXRlZ29yeUltcGwjZ2V0TmxuYW1lIDxlbT5ObG5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5DYXRlZ29yeUltcGwjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuQ2F0ZWdvcnlJbXBsI2dldENvZGUgPGVtPkNvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5DYXRlZ29yeUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3J5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ2F0ZWdvcnkgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5sbmFtZSgpIDxlbT5ObG5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmxuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbmxuYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGVnb3J5KCkgPGVtPkNhdGVnb3J5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY2F0ZWdvcnkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvZGUoKSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2RlKCkgPGVtPkNvZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29kZSA9IENPREVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYXhvbm9teVBhY2thZ2UuZUlOU1RBTkNFLmdldENhdGVnb3J5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE5sbmFtZSgpIHsKLQkJaWYgKG5sbmFtZSA9PSBudWxsKSB7Ci0JCQlubG5hbWUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTmFtZS5jbGFzcywgdGhpcywgVGF4b25vbXlQYWNrYWdlLkNBVEVHT1JZX19OTE5BTUUpOwotCQl9Ci0JCXJldHVybiBubG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENhdGVnb3J5KCkgewotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJY2F0ZWdvcnkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQ2F0ZWdvcnkuY2xhc3MsIHRoaXMsIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvZGUoKSB7Ci0JCXJldHVybiBjb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvZGUoU3RyaW5nIG5ld0NvZGUpIHsKLQkJU3RyaW5nIG9sZENvZGUgPSBjb2RlOwotCQljb2RlID0gbmV3Q29kZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGF4b25vbXlQYWNrYWdlLkNBVEVHT1JZX19DT0RFLCBvbGRDb2RlLCBjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkNBVEVHT1JZX19OTE5BTUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TmxuYW1lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fQ0FURUdPUlk6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q2F0ZWdvcnkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuQ0FURUdPUllfX05MTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmxuYW1lKCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fQ09ERToKLQkJCQlyZXR1cm4gZ2V0Q29kZSgpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuQ0FURUdPUllfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fTkxOQU1FOgotCQkJCWdldE5sbmFtZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0TmxuYW1lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fQ0FURUdPUlk6Ci0JCQkJZ2V0Q2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCWdldENhdGVnb3J5KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fQ09ERToKLQkJCQlzZXRDb2RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkNBVEVHT1JZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkNBVEVHT1JZX19OTE5BTUU6Ci0JCQkJZ2V0TmxuYW1lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fQ0FURUdPUlk6Ci0JCQkJZ2V0Q2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkNBVEVHT1JZX19DT0RFOgotCQkJCXNldENvZGUoQ09ERV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuQ0FURUdPUllfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkNBVEVHT1JZX19OTE5BTUU6Ci0JCQkJcmV0dXJuIG5sbmFtZSAhPSBudWxsICYmICFubG5hbWUuaXNFbXB0eSgpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuQ0FURUdPUllfX0NBVEVHT1JZOgotCQkJCXJldHVybiBjYXRlZ29yeSAhPSBudWxsICYmICFjYXRlZ29yeS5pc0VtcHR5KCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWV9fQ09ERToKLQkJCQlyZXR1cm4gQ09ERV9FREVGQVVMVCA9PSBudWxsID8gY29kZSAhPSBudWxsIDogIUNPREVfRURFRkFVTFQuZXF1YWxzKGNvZGUpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuQ0FURUdPUllfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvZGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DYXRlZ29yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Nzg3NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3RJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRUYXhvbm9teSA8ZW0+VGF4b25vbXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJvb3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEb2N1bWVudFJvb3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1peGVkKCkgPGVtPk1peGVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeE1MTlNQcmVmaXhNYXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhTSVNjaGVtYUxvY2F0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFJvb3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGF4b25vbXlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQl9Ci0JCXJldHVybiB4TUxOU1ByZWZpeE1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoQ2F0ZWdvcnkpZ2V0TWl4ZWQoKS5nZXQoVGF4b25vbXlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfQ2F0ZWdvcnkoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2F0ZWdvcnkoQ2F0ZWdvcnkgbmV3Q2F0ZWdvcnksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChUYXhvbm9teVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9DYXRlZ29yeSgpLCBuZXdDYXRlZ29yeSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnkoQ2F0ZWdvcnkgbmV3Q2F0ZWdvcnkpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChUYXhvbm9teVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9DYXRlZ29yeSgpLCBuZXdDYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIChOYW1lKWdldE1peGVkKCkuZ2V0KFRheG9ub215UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X05hbWUoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TmFtZShOYW1lIG5ld05hbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChUYXhvbm9teVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9OYW1lKCksIG5ld05hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoTmFtZSBuZXdOYW1lKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoVGF4b25vbXlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfTmFtZSgpLCBuZXdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGF4b25vbXkgZ2V0VGF4b25vbXkoKSB7Ci0JCXJldHVybiAoVGF4b25vbXkpZ2V0TWl4ZWQoKS5nZXQoVGF4b25vbXlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfVGF4b25vbXkoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGF4b25vbXkoVGF4b25vbXkgbmV3VGF4b25vbXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChUYXhvbm9teVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9UYXhvbm9teSgpLCBuZXdUYXhvbm9teSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGF4b25vbXkoVGF4b25vbXkgbmV3VGF4b25vbXkpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChUYXhvbm9teVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9UYXhvbm9teSgpLCBuZXdUYXhvbm9teSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX0NBVEVHT1JZOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDYXRlZ29yeShudWxsLCBtc2dzKTsKLQkJCQljYXNlIFRheG9ub215UGFja2FnZS5ET0NVTUVOVF9ST09UX19OQU1FOgotCQkJCQlyZXR1cm4gYmFzaWNTZXROYW1lKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1RBWE9OT01ZOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUYXhvbm9teShudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiBnZXRNaXhlZCgpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5ET0NVTUVOVF9ST09UX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1RBWE9OT01ZOgotCQkJCXJldHVybiBnZXRUYXhvbm9teSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlnZXRNaXhlZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5ET0NVTUVOVF9ST09UX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoQ2F0ZWdvcnkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX05BTUU6Ci0JCQkJc2V0TmFtZSgoTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fVEFYT05PTVk6Ci0JCQkJc2V0VGF4b25vbXkoKFRheG9ub215KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KChDYXRlZ29yeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5ET0NVTUVOVF9ST09UX19OQU1FOgotCQkJCXNldE5hbWUoKE5hbWUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fVEFYT05PTVk6Ci0JCQkJc2V0VGF4b25vbXkoKFRheG9ub215KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRDYXRlZ29yeSgpICE9IG51bGw7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5ET0NVTUVOVF9ST09UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCkgIT0gbnVsbDsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1RBWE9OT01ZOgotCQkJCXJldHVybiBnZXRUYXhvbm9teSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9pbXBsL05hbWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9pbXBsL05hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNTViZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvaW1wbC9OYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZUltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ4IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215Lk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuTmFtZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuTmFtZUltcGwjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBOYW1lIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhbmcgPSBMQU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGF4b25vbXlQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lXygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRheG9ub215UGFja2FnZS5OQU1FX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5nKCkgewotCQlyZXR1cm4gbGFuZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5nKFN0cmluZyBuZXdMYW5nKSB7Ci0JCVN0cmluZyBvbGRMYW5nID0gbGFuZzsKLQkJbGFuZyA9IG5ld0xhbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRheG9ub215UGFja2FnZS5OQU1FX19MQU5HLCBvbGRMYW5nLCBsYW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuTkFNRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5OQU1FX19MQU5HOgotCQkJCXJldHVybiBnZXRMYW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuTkFNRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuTkFNRV9fTEFORzoKLQkJCQlzZXRMYW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5OQU1FX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuTkFNRV9fTEFORzoKLQkJCQlzZXRMYW5nKExBTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuTkFNRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5OQU1FX19MQU5HOgotCQkJCXJldHVybiBMQU5HX0VERUZBVUxUID09IG51bGwgPyBsYW5nICE9IG51bGwgOiAhTEFOR19FREVGQVVMVC5lcXVhbHMobGFuZyk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9OYW1lSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvaW1wbC9UYXhvbm9teUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9pbXBsL1RheG9ub215RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1YjU0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9pbXBsL1RheG9ub215RmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRheG9ub215RmFjdG9yeUltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ4IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXhvbm9teUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgVGF4b25vbXlGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGF4b25vbXlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuQ0FURUdPUlk6IHJldHVybiBjcmVhdGVDYXRlZ29yeSgpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuTkFNRTogcmV0dXJuIGNyZWF0ZU5hbWUoKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZOiByZXR1cm4gY3JlYXRlVGF4b25vbXkoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXRlZ29yeSBjcmVhdGVDYXRlZ29yeSgpIHsKLQkJQ2F0ZWdvcnlJbXBsIGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKSB7Ci0JCURvY3VtZW50Um9vdEltcGwgZG9jdW1lbnRSb290ID0gbmV3IERvY3VtZW50Um9vdEltcGwoKTsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZSBjcmVhdGVOYW1lKCkgewotCQlOYW1lSW1wbCBuYW1lID0gbmV3IE5hbWVJbXBsKCk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXhvbm9teSBjcmVhdGVUYXhvbm9teSgpIHsKLQkJVGF4b25vbXlJbXBsIHRheG9ub215ID0gbmV3IFRheG9ub215SW1wbCgpOwotCQlyZXR1cm4gdGF4b25vbXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRheG9ub215UGFja2FnZSBnZXRUYXhvbm9teVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoVGF4b25vbXlQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRheG9ub215UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gVGF4b25vbXlQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9UYXhvbm9teUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9pbXBsL1RheG9ub215SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvaW1wbC9UYXhvbm9teUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3ODk1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9pbXBsL1RheG9ub215SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGF4b25vbXlJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo0OCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGF4b25vbXk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5UYXhvbm9teUltcGwjZ2V0TmxuYW1lIDxlbT5ObG5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5UYXhvbm9teUltcGwjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGwuVGF4b25vbXlJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLlRheG9ub215SW1wbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuaW1wbC5UYXhvbm9teUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLlRheG9ub215SW1wbCNnZXRSZWYgPGVtPlJlZjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLlRheG9ub215SW1wbCNnZXRUbW9kZWxLZXkgPGVtPlRtb2RlbCBLZXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXhvbm9teUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRheG9ub215IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRObG5hbWUoKSA8ZW0+TmxuYW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5sbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG5sbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNhdGVnb3J5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uID0gTE9DQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWYoKSA8ZW0+UmVmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWYoKSA8ZW0+UmVmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVmID0gUkVGX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRtb2RlbEtleSgpIDxlbT5UbW9kZWwgS2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUbW9kZWxLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRNT0RFTF9LRVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG1vZGVsS2V5KCkgPGVtPlRtb2RlbCBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRtb2RlbEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0bW9kZWxLZXkgPSBUTU9ERUxfS0VZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRheG9ub215SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFRheG9ub215UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGF4b25vbXkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TmxuYW1lKCkgewotCQlpZiAobmxuYW1lID09IG51bGwpIHsKLQkJCW5sbmFtZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChOYW1lLmNsYXNzLCB0aGlzLCBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX05MTkFNRSk7Ci0JCX0KLQkJcmV0dXJuIG5sbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCWlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQljYXRlZ29yeSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDYXRlZ29yeS5jbGFzcywgdGhpcywgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbmV3TG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0JCWxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fTE9DQVRJT04sIG9sZExvY2F0aW9uLCBsb2NhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZigpIHsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWYoU3RyaW5nIG5ld1JlZikgewotCQlTdHJpbmcgb2xkUmVmID0gcmVmOwotCQlyZWYgPSBuZXdSZWY7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fUkVGLCBvbGRSZWYsIHJlZikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG1vZGVsS2V5KCkgewotCQlyZXR1cm4gdG1vZGVsS2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRtb2RlbEtleShTdHJpbmcgbmV3VG1vZGVsS2V5KSB7Ci0JCVN0cmluZyBvbGRUbW9kZWxLZXkgPSB0bW9kZWxLZXk7Ci0JCXRtb2RlbEtleSA9IG5ld1Rtb2RlbEtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19UTU9ERUxfS0VZLCBvbGRUbW9kZWxLZXksIHRtb2RlbEtleSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19OTE5BTUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TmxuYW1lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fQ0FURUdPUlk6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q2F0ZWdvcnkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX05MTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmxuYW1lKCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX1JFRjoKLQkJCQlyZXR1cm4gZ2V0UmVmKCk7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fVE1PREVMX0tFWToKLQkJCQlyZXR1cm4gZ2V0VG1vZGVsS2V5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX05MTkFNRToKLQkJCQlnZXRObG5hbWUoKS5jbGVhcigpOwotCQkJCWdldE5sbmFtZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX0NBVEVHT1JZOgotCQkJCWdldENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19SRUY6Ci0JCQkJc2V0UmVmKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19UTU9ERUxfS0VZOgotCQkJCXNldFRtb2RlbEtleSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX05MTkFNRToKLQkJCQlnZXRObG5hbWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19DQVRFR09SWToKLQkJCQlnZXRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX1JFRjoKLQkJCQlzZXRSZWYoUkVGX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fVE1PREVMX0tFWToKLQkJCQlzZXRUbW9kZWxLZXkoVE1PREVMX0tFWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5UQVhPTk9NWV9fTkxOQU1FOgotCQkJCXJldHVybiBubG5hbWUgIT0gbnVsbCAmJiAhbmxuYW1lLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19DQVRFR09SWToKLQkJCQlyZXR1cm4gY2F0ZWdvcnkgIT0gbnVsbCAmJiAhY2F0ZWdvcnkuaXNFbXB0eSgpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgVGF4b25vbXlQYWNrYWdlLlRBWE9OT01ZX19SRUY6Ci0JCQkJcmV0dXJuIFJFRl9FREVGQVVMVCA9PSBudWxsID8gcmVmICE9IG51bGwgOiAhUkVGX0VERUZBVUxULmVxdWFscyhyZWYpOwotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVlfX1RNT0RFTF9LRVk6Ci0JCQkJcmV0dXJuIFRNT0RFTF9LRVlfRURFRkFVTFQgPT0gbnVsbCA/IHRtb2RlbEtleSAhPSBudWxsIDogIVRNT0RFTF9LRVlfRURFRkFVTFQuZXF1YWxzKHRtb2RlbEtleSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvY2F0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2NhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVmOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWYpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRtb2RlbEtleTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG1vZGVsS2V5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGF4b25vbXlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS9pbXBsL1RheG9ub215UGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L2ltcGwvVGF4b25vbXlQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY3ZGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L2ltcGwvVGF4b25vbXlQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGF4b25vbXlQYWNrYWdlSW1wbC5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDggY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5pbXBsLlJlZ2lzdHJ5UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguaW1wbC5SVEluZGV4UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuVURESVJlZ2lzdHJ5UGFja2FnZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGF4b25vbXlQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFRheG9ub215UGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZG9jdW1lbnRSb290RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5hbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGF4b25vbXlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRheG9ub215UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFRheG9ub215RmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUYXhvbm9teVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFRheG9ub215UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYXhvbm9teVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlUYXhvbm9teVBhY2thZ2VJbXBsIHRoZVRheG9ub215UGFja2FnZSA9IChUYXhvbm9teVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFRheG9ub215UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBUYXhvbm9teVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJWE1MVHlwZVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlSVEluZGV4UGFja2FnZUltcGwgdGhlUlRJbmRleFBhY2thZ2UgPSAoUlRJbmRleFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSVEluZGV4UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFJUSW5kZXhQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJUSW5kZXhQYWNrYWdlLmVOU19VUkkpIDogUlRJbmRleFBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7Ci0JCVJlZ2lzdHJ5UGFja2FnZUltcGwgdGhlUmVnaXN0cnlQYWNrYWdlID0gKFJlZ2lzdHJ5UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJlZ2lzdHJ5UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFJlZ2lzdHJ5UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZWdpc3RyeVBhY2thZ2UuZU5TX1VSSSkgOiBSZWdpc3RyeVBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7Ci0JCVVERElSZWdpc3RyeVBhY2thZ2VJbXBsIHRoZVVERElSZWdpc3RyeVBhY2thZ2UgPSAoVURESVJlZ2lzdHJ5UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFVERElSZWdpc3RyeVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBVRERJUmVnaXN0cnlQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFVERElSZWdpc3RyeVBhY2thZ2UuZU5TX1VSSSkgOiBVRERJUmVnaXN0cnlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVRheG9ub215UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUlRJbmRleFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVJlZ2lzdHJ5UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVURESVJlZ2lzdHJ5UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVRheG9ub215UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVJUSW5kZXhQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUmVnaXN0cnlQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVURESVJlZ2lzdHJ5UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVUYXhvbm9teVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVRheG9ub215UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2F0ZWdvcnlfTmxuYW1lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY2F0ZWdvcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYXRlZ29yeV9DYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2F0ZWdvcnlfQ29kZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2F0ZWdvcnlfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREb2N1bWVudFJvb3QoKSB7Ci0JCXJldHVybiBkb2N1bWVudFJvb3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X0NhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X05hbWUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfVGF4b25vbXkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVfKCkgewotCQlyZXR1cm4gbmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVfTGFuZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRheG9ub215KCkgewotCQlyZXR1cm4gdGF4b25vbXlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGF4b25vbXlfTmxuYW1lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGF4b25vbXlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXhvbm9teV9DYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRheG9ub215RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGF4b25vbXlfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXhvbm9teUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRheG9ub215X0xvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGF4b25vbXlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXhvbm9teV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGF4b25vbXlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXhvbm9teV9SZWYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXhvbm9teUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRheG9ub215X1Rtb2RlbEtleSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRheG9ub215RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRheG9ub215RmFjdG9yeSBnZXRUYXhvbm9teUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoVGF4b25vbXlGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWNhdGVnb3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENBVEVHT1JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjYXRlZ29yeUVDbGFzcywgQ0FURUdPUllfX05MTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY2F0ZWdvcnlFQ2xhc3MsIENBVEVHT1JZX19DQVRFR09SWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY2F0ZWdvcnlFQ2xhc3MsIENBVEVHT1JZX19DT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjYXRlZ29yeUVDbGFzcywgQ0FURUdPUllfX05BTUUpOwotCi0JCWRvY3VtZW50Um9vdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET0NVTUVOVF9ST09UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19DQVRFR09SWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX1RBWE9OT01ZKTsKLQotCQluYW1lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE5BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG5hbWVFQ2xhc3MsIE5BTUVfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lRUNsYXNzLCBOQU1FX19MQU5HKTsKLQotCQl0YXhvbm9teUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVhPTk9NWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGF4b25vbXlFQ2xhc3MsIFRBWE9OT01ZX19OTE5BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRheG9ub215RUNsYXNzLCBUQVhPTk9NWV9fQ0FURUdPUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRheG9ub215RUNsYXNzLCBUQVhPTk9NWV9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRheG9ub215RUNsYXNzLCBUQVhPTk9NWV9fTE9DQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRheG9ub215RUNsYXNzLCBUQVhPTk9NWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGF4b25vbXlFQ2xhc3MsIFRBWE9OT01ZX19SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKHRheG9ub215RUNsYXNzLCBUQVhPTk9NWV9fVE1PREVMX0tFWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlSW1wbCB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoY2F0ZWdvcnlFQ2xhc3MsIENhdGVnb3J5LmNsYXNzLCAiQ2F0ZWdvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENhdGVnb3J5X05sbmFtZSgpLCB0aGlzLmdldE5hbWVfKCksIG51bGwsICJubG5hbWUiLCBudWxsLCAwLCAtMSwgQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENhdGVnb3J5X0NhdGVnb3J5KCksIHRoaXMuZ2V0Q2F0ZWdvcnkoKSwgbnVsbCwgImNhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIENhdGVnb3J5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDYXRlZ29yeV9Db2RlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29kZSIsIG51bGwsIDAsIDEsIENhdGVnb3J5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2F0ZWdvcnlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBDYXRlZ29yeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkb2N1bWVudFJvb3RFQ2xhc3MsIERvY3VtZW50Um9vdC5jbGFzcywgIkRvY3VtZW50Um9vdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieFNJU2NoZW1hTG9jYXRpb24iLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X0NhdGVnb3J5KCksIHRoaXMuZ2V0Q2F0ZWdvcnkoKSwgbnVsbCwgImNhdGVnb3J5IiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9OYW1lKCksIHRoaXMuZ2V0TmFtZV8oKSwgbnVsbCwgIm5hbWUiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1RheG9ub215KCksIHRoaXMuZ2V0VGF4b25vbXkoKSwgbnVsbCwgInRheG9ub215IiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhuYW1lRUNsYXNzLCBOYW1lLmNsYXNzLCAiTmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE5hbWVfTGFuZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRMYW5ndWFnZSgpLCAibGFuZyIsIG51bGwsIDAsIDEsIE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGF4b25vbXlFQ2xhc3MsIFRheG9ub215LmNsYXNzLCAiVGF4b25vbXkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRheG9ub215X05sbmFtZSgpLCB0aGlzLmdldE5hbWVfKCksIG51bGwsICJubG5hbWUiLCBudWxsLCAwLCAtMSwgVGF4b25vbXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRheG9ub215X0NhdGVnb3J5KCksIHRoaXMuZ2V0Q2F0ZWdvcnkoKSwgbnVsbCwgImNhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIFRheG9ub215LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXhvbm9teV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRBbnlVUkkoKSwgImlkIiwgbnVsbCwgMCwgMSwgVGF4b25vbXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXhvbm9teV9Mb2NhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRBbnlVUkkoKSwgImxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgVGF4b25vbXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXhvbm9teV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFRheG9ub215LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGF4b25vbXlfUmVmKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEFueVVSSSgpLCAicmVmIiwgbnVsbCwgMCwgMSwgVGF4b25vbXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXhvbm9teV9UbW9kZWxLZXkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0bW9kZWxLZXkiLCBudWxsLCAxLCAxLCBUYXhvbm9teS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNhdGVnb3J5RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDYXRlZ29yeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q2F0ZWdvcnlfTmxuYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIm5sbmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDYXRlZ29yeV9DYXRlZ29yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJjYXRlZ29yeSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDYXRlZ29yeV9Db2RlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY29kZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDYXRlZ29yeV9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkb2N1bWVudFJvb3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsCi0JCQkgImtpbmQiLCAibWl4ZWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsCi0JCQkgIm5hbWUiLCAiOm1peGVkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInhtbG5zOnByZWZpeCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X0NhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImNhdGVnb3J5IiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIm5hbWUiLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X1RheG9ub215KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInRheG9ub215IiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG5hbWVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk5hbWUiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXROYW1lX1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIjowIiwKLQkJCSAia2luZCIsICJzaW1wbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TmFtZV9MYW5nKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibGFuZyIsCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGF4b25vbXlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRheG9ub215IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXhvbm9teV9ObG5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAibmxuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRheG9ub215X0NhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImNhdGVnb3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRheG9ub215X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGF4b25vbXlfTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJsb2NhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXhvbm9teV9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXhvbm9teV9SZWYoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJyZWYiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGF4b25vbXlfVG1vZGVsS2V5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidG1vZGVsS2V5IgotCQkgICB9KTsKLQl9Ci0KLX0gLy9UYXhvbm9teVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS91dGlsL1RheG9ub215QWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L3V0aWwvVGF4b25vbXlBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzJiNzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L3V0aWwvVGF4b25vbXlBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGF4b25vbXlBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NTAgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXhvbm9teUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYXhvbm9teVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXhvbm9teUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFRheG9ub215UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGF4b25vbXlTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgVGF4b25vbXlTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDYXRlZ29yeShDYXRlZ29yeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lKE5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXhvbm9teShUYXhvbm9teSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGF4b25vbXlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5DYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215Lk5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5OYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkgPGVtPlRheG9ub215PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGF4b25vbXlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVGF4b25vbXlBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvdXRpbC9UYXhvbm9teVJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L3V0aWwvVGF4b25vbXlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDVjYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvdXRpbC9UYXhvbm9teVJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGF4b25vbXlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo1MCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkudXRpbC5UYXhvbm9teVJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGF4b25vbXlSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkTWV0YURhdGEgZXh0ZW5kZWRNZXRhRGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRheG9ub215UmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZXh0ZW5kZWRNZXRhRGF0YSA9IEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IFRheG9ub215UmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgZXh0ZW5kZWRNZXRhRGF0YSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgZXh0ZW5kZWRNZXRhRGF0YSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9UYXhvbm9teVJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L3V0aWwvVGF4b25vbXlSZXNvdXJjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215L3V0aWwvVGF4b25vbXlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiZWQ5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS91dGlsL1RheG9ub215UmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRheG9ub215UmVzb3VyY2VJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo1MCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS51dGlsLlRheG9ub215UmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGF4b25vbXlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXhvbm9teVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCi19IC8vVGF4b25vbXlSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS91dGlsL1RheG9ub215U3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC90YXhvbm9teS91dGlsL1RheG9ub215U3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZGRjNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdGF4b25vbXkvdXRpbC9UYXhvbm9teVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGF4b25vbXlTd2l0Y2guamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjUwIGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXhvbm9teVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYXhvbm9teVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXhvbm9teVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBUYXhvbm9teVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5DQVRFR09SWTogewotCQkJCUNhdGVnb3J5IGNhdGVnb3J5ID0gKENhdGVnb3J5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDYXRlZ29yeShjYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogewotCQkJCURvY3VtZW50Um9vdCBkb2N1bWVudFJvb3QgPSAoRG9jdW1lbnRSb290KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEb2N1bWVudFJvb3QoZG9jdW1lbnRSb290KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRheG9ub215UGFja2FnZS5OQU1FOiB7Ci0JCQkJTmFtZSBuYW1lID0gKE5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU5hbWUobmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBUYXhvbm9teVBhY2thZ2UuVEFYT05PTVk6IHsKLQkJCQlUYXhvbm9teSB0YXhvbm9teSA9IChUYXhvbm9teSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGF4b25vbXkodGF4b25vbXkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2F0ZWdvcnkoQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU5hbWUoTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRheG9ub215PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRheG9ub215PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYXhvbm9teShUYXhvbm9teSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVGF4b25vbXlTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9Eb2N1bWVudFJvb3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9Eb2N1bWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4ZGNiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvRG9jdW1lbnRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3QuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ5IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9jdW1lbnQgUm9vdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFRheG9ub21pZXMgPGVtPlRheG9ub21pZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRVZGRpUmVnaXN0cnkgPGVtPlVkZGkgUmVnaXN0cnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFJvb3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01peGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldE1peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlQYWNrYWdlI2dldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIga2V5VHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWVUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRheG9ub21pZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRheG9ub21pZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGF4b25vbWllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGF4b25vbWllcyhUYXhvbm9taWVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZSNnZXREb2N1bWVudFJvb3RfVGF4b25vbWllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRheG9ub21pZXMgZ2V0VGF4b25vbWllcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFRheG9ub21pZXMgPGVtPlRheG9ub21pZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRheG9ub21pZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRheG9ub21pZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRheG9ub21pZXMoVGF4b25vbWllcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VZGRpIFJlZ2lzdHJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VZGRpIFJlZ2lzdHJ5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVkZGkgUmVnaXN0cnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVkZGlSZWdpc3RyeShVRERJUmVnaXN0cnkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlQYWNrYWdlI2dldERvY3VtZW50Um9vdF9VZGRpUmVnaXN0cnkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVRERJUmVnaXN0cnkgZ2V0VWRkaVJlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0VWRkaVJlZ2lzdHJ5IDxlbT5VZGRpIFJlZ2lzdHJ5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VZGRpIFJlZ2lzdHJ5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRVZGRpUmVnaXN0cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVkZGlSZWdpc3RyeShVRERJUmVnaXN0cnkgdmFsdWUpOwotCi19IC8vIERvY3VtZW50Um9vdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L1RheG9ub21pZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9UYXhvbm9taWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjN2ViY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L1RheG9ub21pZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGF4b25vbWllcy5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDkgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXhvbm9taWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlRheG9ub21pZXMjZ2V0VGF4b25vbXkgPGVtPlRheG9ub215PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlQYWNrYWdlI2dldFRheG9ub21pZXMoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRheG9ub21pZXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXhvbm9teTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGF4b25vbXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXhvbm9teTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UjZ2V0VGF4b25vbWllc19UYXhvbm9teSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRheG9ub215KCk7Ci0KLX0gLy8gVGF4b25vbWllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L1VERElSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L1VERElSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2YyMTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9VRERJUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVERElSZWdpc3RyeS5qYXZhLHYgMS4yIDIwMDUvMTIvMDMgMDQ6MDY6NDkgY2JyZWFsZXkgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVERElSZWdpc3RyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldERpc2NvdmVyeVVSTCA8ZW0+RGlzY292ZXJ5IFVSTDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldFB1YmxpY2F0aW9uVVJMIDxlbT5QdWJsaWNhdGlvbiBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXRTZWN1cmVkRGlzY292ZXJ5VVJMIDxlbT5TZWN1cmVkIERpc2NvdmVyeSBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXRTZWN1cmVkUHVibGljYXRpb25VUkwgPGVtPlNlY3VyZWQgUHVibGljYXRpb24gVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0RGVmYXVsdExvZ2luIDxlbT5EZWZhdWx0IExvZ2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0RGVmYXVsdFBhc3N3b3JkIDxlbT5EZWZhdWx0IFBhc3N3b3JkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0VGF4b25vbWllcyA8ZW0+VGF4b25vbWllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZSNnZXRVRERJUmVnaXN0cnkoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVERElSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZSNnZXRVRERJUmVnaXN0cnlfVmVyc2lvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjb3ZlcnkgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjb3ZlcnkgVVJMPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NvdmVyeSBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc2NvdmVyeVVSTChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlQYWNrYWdlI2dldFVERElSZWdpc3RyeV9EaXNjb3ZlcnlVUkwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVVSSSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREaXNjb3ZlcnlVUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXREaXNjb3ZlcnlVUkwgPGVtPkRpc2NvdmVyeSBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NvdmVyeSBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc2NvdmVyeVVSTCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlzY292ZXJ5VVJMKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaWNhdGlvbiBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1YmxpY2F0aW9uIFVSTDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWNhdGlvbiBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1YmxpY2F0aW9uVVJMKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UjZ2V0VURESVJlZ2lzdHJ5X1B1YmxpY2F0aW9uVVJMKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlVUkkiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVibGljYXRpb25VUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXRQdWJsaWNhdGlvblVSTCA8ZW0+UHVibGljYXRpb24gVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWNhdGlvbiBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1YmxpY2F0aW9uVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNhdGlvblVSTChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJlZCBEaXNjb3ZlcnkgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cmVkIERpc2NvdmVyeSBVUkw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJlZCBEaXNjb3ZlcnkgVVJMPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZWN1cmVkRGlzY292ZXJ5VVJMKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UjZ2V0VURESVJlZ2lzdHJ5X1NlY3VyZWREaXNjb3ZlcnlVUkwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVVSSSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZWN1cmVkRGlzY292ZXJ5VVJMKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0U2VjdXJlZERpc2NvdmVyeVVSTCA8ZW0+U2VjdXJlZCBEaXNjb3ZlcnkgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cmVkIERpc2NvdmVyeSBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlY3VyZWREaXNjb3ZlcnlVUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlY3VyZWREaXNjb3ZlcnlVUkwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyZWQgUHVibGljYXRpb24gVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cmVkIFB1YmxpY2F0aW9uIFVSTDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cmVkIFB1YmxpY2F0aW9uIFVSTDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VjdXJlZFB1YmxpY2F0aW9uVVJMKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UjZ2V0VURESVJlZ2lzdHJ5X1NlY3VyZWRQdWJsaWNhdGlvblVSTCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VVJJIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlY3VyZWRQdWJsaWNhdGlvblVSTCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldFNlY3VyZWRQdWJsaWNhdGlvblVSTCA8ZW0+U2VjdXJlZCBQdWJsaWNhdGlvbiBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyZWQgUHVibGljYXRpb24gVVJMPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZWN1cmVkUHVibGljYXRpb25VUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlY3VyZWRQdWJsaWNhdGlvblVSTChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBMb2dpbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBMb2dpbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IExvZ2luPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0TG9naW4oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZSNnZXRVRERJUmVnaXN0cnlfRGVmYXVsdExvZ2luKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdExvZ2luKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0RGVmYXVsdExvZ2luIDxlbT5EZWZhdWx0IExvZ2luPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IExvZ2luPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0TG9naW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRMb2dpbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBQYXNzd29yZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBQYXNzd29yZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFBhc3N3b3JkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0UGFzc3dvcmQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZSNnZXRVRERJUmVnaXN0cnlfRGVmYXVsdFBhc3N3b3JkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFBhc3N3b3JkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0RGVmYXVsdFBhc3N3b3JkIDxlbT5EZWZhdWx0IFBhc3N3b3JkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFBhc3N3b3JkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0UGFzc3dvcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRQYXNzd29yZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGF4b25vbWllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGF4b25vbWllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXhvbm9taWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUYXhvbm9taWVzKFRheG9ub21pZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlQYWNrYWdlI2dldFVERElSZWdpc3RyeV9UYXhvbm9taWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGF4b25vbWllcyBnZXRUYXhvbm9taWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0VGF4b25vbWllcyA8ZW0+VGF4b25vbWllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGF4b25vbWllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGF4b25vbWllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGF4b25vbWllcyhUYXhvbm9taWVzIHZhbHVlKTsKLQotfSAvLyBVRERJUmVnaXN0cnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9VRERJUmVnaXN0cnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvVURESVJlZ2lzdHJ5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjEwYzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9VRERJUmVnaXN0cnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVERElSZWdpc3RyeUZhY3RvcnkuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ5IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVERElSZWdpc3RyeUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVRERJUmVnaXN0cnlGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5pbXBsLlVERElSZWdpc3RyeUZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGF4b25vbWllczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGF4b25vbWllczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGF4b25vbWllcyBjcmVhdGVUYXhvbm9taWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVERElSZWdpc3RyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VURESVJlZ2lzdHJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVRERJUmVnaXN0cnkgY3JlYXRlVURESVJlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVERElSZWdpc3RyeVBhY2thZ2UgZ2V0VURESVJlZ2lzdHJ5UGFja2FnZSgpOwotCi19IC8vVURESVJlZ2lzdHJ5RmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L1VERElSZWdpc3RyeVBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9VRERJUmVnaXN0cnlQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTVhZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L1VERElSZWdpc3RyeVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVERElSZWdpc3RyeVBhY2thZ2UuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjQ5IGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnlQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAotICogICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCi0gKiAKLSAqICAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybQotICogICAgIHN1aXRhYmxlIGZvciBpbXBvcnQgYnkgb3RoZXIgc2NoZW1hIGRvY3VtZW50cy4gIAotICogCi0gKiAgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkCi0gKiAgICAgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLiAgVGhlCi0gKiAgICAgZm9sbG93aW5nIG5hbWVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGlzIG5hbWVzcGFjZSBhbmQgc2hvdWxkCi0gKiAgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsCi0gKiAgICAgc3BlY2lmaWNhdGlvbiwgb3IgZG9jdW1lbnQgaW5zdGFuY2U6Ci0gKiAKLSAqICAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBwcm92aWRlcyBhIFVSSSB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIGZvciBpbnRlcnByZXRpbmcgYW55Ci0gKiAgICAgICAgICByZWxhdGl2ZSBVUklzIGluIHRoZSBzY29wZSBvZiB0aGUgZWxlbWVudCBvbiB3aGljaCBpdAotICogICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgQmFzZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGlmIGRlY2xhcmVkIHRvIGJlIG9mIHR5cGUgSUQuCi0gKiAgICAgICAgICBUaGUgeG1sOmlkIHNwZWNpZmljYXRpb24gaXMgbm90IHlldCBhIFczQyBSZWNvbW1lbmRhdGlvbiwKLSAqICAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uCi0gKiAgICAgICAgICB3aXRoIHRoZSBtZWNoYW5pc21zIGl0IHByb3Bvc2VzLiAgTm90ZSB0aGF0IGl0IGlzIF9ub3RfIGluY2x1ZGVkCi0gKiAgICAgICAgICBpbiB0aGUgc3BlY2lhbEF0dHJzIGF0dHJpYnV0ZSBncm91cC4KLSAqIAotICogICAgIGxhbmcgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIGlzIGEgbGFuZ3VhZ2UgY29kZSBmb3IgdGhlIG5hdHVyYWwgbGFuZ3VhZ2Ugb2YgdGhlIGNvbnRlbnQgb2YKLSAqICAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogICAKLSAqICAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZQotICogICAgICAgICAgdmFsdWUgaXMgYSBrZXl3b3JkIGluZGljYXRpbmcgd2hhdCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGRpc2NpcGxpbmUgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OyBpdHMKLSAqICAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzCi0gKiAgICAgICAgICBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKLSAqICAgICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKLSAqICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCi0gKiAgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKLSAqIAotICogICAgICAgICAgICAgIEluIGFwcHJlY2lhdGlvbiBmb3IgaGlzIHZpc2lvbiwgbGVhZGVyc2hpcCBhbmQgZGVkaWNhdGlvbgotICogICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMAotICogICAgICAgICAgICAgIHJlc2VydmVzIGZvciBKb24gQm9zYWsgaW4gcGVycGV0dWl0eSB0aGUgWE1MIG5hbWUKLSAqICAgICAgICAgICAgICB4bWw6RmF0aGVyCi0gKiAgIAotICogVGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKLSAqICAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQotICogICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nLCB4bWw6c3BhY2Ugb3IgeG1sOmlkCi0gKiAgICAgICAgIGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0gKiAKLSAqICAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAqICAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gKiAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAqICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OwotICogCi0gKiAgICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAqICAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotICogCi0gKiAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKLSAqICAKLSAqICAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICogICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzCi0gKiBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gKiAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkLgotICogICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAqICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gKiAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gKiAgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwKLSAqICAgIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICogICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgotICogICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5RmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVERElSZWdpc3RyeVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAidWRkaXJlZ2lzdHJ5IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2VjbGlwc2Uub3JnL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gInVkZGlyZWdpc3RyeSI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVVERElSZWdpc3RyeVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5VRERJUmVnaXN0cnlQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5VRERJUmVnaXN0cnlQYWNrYWdlSW1wbCNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01JWEVEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRheG9ub21pZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19UQVhPTk9NSUVTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VZGRpIFJlZ2lzdHJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fVURESV9SRUdJU1RSWSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5UYXhvbm9taWVzSW1wbCA8ZW0+VGF4b25vbWllczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuVGF4b25vbWllc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuVURESVJlZ2lzdHJ5UGFja2FnZUltcGwjZ2V0VGF4b25vbWllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVhPTk9NSUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXhvbm9teTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFYT05PTUlFU19fVEFYT05PTVkgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UYXhvbm9taWVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBWE9OT01JRVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuVURESVJlZ2lzdHJ5SW1wbCA8ZW0+VURESVJlZ2lzdHJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5VRERJUmVnaXN0cnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5pbXBsLlVERElSZWdpc3RyeVBhY2thZ2VJbXBsI2dldFVERElSZWdpc3RyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVRERJX1JFR0lTVFJZID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVRERJX1JFR0lTVFJZX19OQU1FID0gUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVRERJX1JFR0lTVFJZX19ERVNDUklQVElPTiA9IFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVRERJX1JFR0lTVFJZX19JRCA9IFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVRERJX1JFR0lTVFJZX19MT0NBVElPTiA9IFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVURESV9SRUdJU1RSWV9fUkVGID0gUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX19SRUY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVERElfUkVHSVNUUllfX1ZFUlNJT04gPSBSZWdpc3RyeVBhY2thZ2UuUkVHSVNUUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY292ZXJ5IFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVERElfUkVHSVNUUllfX0RJU0NPVkVSWV9VUkwgPSBSZWdpc3RyeVBhY2thZ2UuUkVHSVNUUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGljYXRpb24gVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVURESV9SRUdJU1RSWV9fUFVCTElDQVRJT05fVVJMID0gUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyZWQgRGlzY292ZXJ5IFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVERElfUkVHSVNUUllfX1NFQ1VSRURfRElTQ09WRVJZX1VSTCA9IFJlZ2lzdHJ5UGFja2FnZS5SRUdJU1RSWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cmVkIFB1YmxpY2F0aW9uIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVERElfUkVHSVNUUllfX1NFQ1VSRURfUFVCTElDQVRJT05fVVJMID0gUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgTG9naW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVRERJX1JFR0lTVFJZX19ERUZBVUxUX0xPR0lOID0gUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUGFzc3dvcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVRERJX1JFR0lTVFJZX19ERUZBVUxUX1BBU1NXT1JEID0gUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRheG9ub21pZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVRERJX1JFR0lTVFJZX19UQVhPTk9NSUVTID0gUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5VRERJUmVnaXN0cnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVURESV9SRUdJU1RSWV9GRUFUVVJFX0NPVU5UID0gUmVnaXN0cnlQYWNrYWdlLlJFR0lTVFJZX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRUYXhvbm9taWVzIDxlbT5UYXhvbm9taWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGF4b25vbWllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRUYXhvbm9taWVzKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9UYXhvbm9taWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdCNnZXRVZGRpUmVnaXN0cnkgPGVtPlVkZGkgUmVnaXN0cnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5VZGRpIFJlZ2lzdHJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuRG9jdW1lbnRSb290I2dldFVkZGlSZWdpc3RyeSgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfVWRkaVJlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5UYXhvbm9taWVzIDxlbT5UYXhvbm9taWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRheG9ub21pZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5UYXhvbm9taWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXhvbm9taWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVGF4b25vbWllcyNnZXRUYXhvbm9teSA8ZW0+VGF4b25vbXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRheG9ub215PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVGF4b25vbWllcyNnZXRUYXhvbm9teSgpCi0JICogQHNlZSAjZ2V0VGF4b25vbWllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGF4b25vbWllc19UYXhvbm9teSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5IDxlbT5VRERJUmVnaXN0cnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VURESVJlZ2lzdHJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRVRERJUmVnaXN0cnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFVERElSZWdpc3RyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VURESVJlZ2lzdHJ5X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldERpc2NvdmVyeVVSTCA8ZW0+RGlzY292ZXJ5IFVSTDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc2NvdmVyeSBVUkw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0RGlzY292ZXJ5VVJMKCkKLQkgKiBAc2VlICNnZXRVRERJUmVnaXN0cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFVERElSZWdpc3RyeV9EaXNjb3ZlcnlVUkwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldFB1YmxpY2F0aW9uVVJMIDxlbT5QdWJsaWNhdGlvbiBVUkw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaWNhdGlvbiBVUkw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0UHVibGljYXRpb25VUkwoKQotCSAqIEBzZWUgI2dldFVERElSZWdpc3RyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VURESVJlZ2lzdHJ5X1B1YmxpY2F0aW9uVVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXRTZWN1cmVkRGlzY292ZXJ5VVJMIDxlbT5TZWN1cmVkIERpc2NvdmVyeSBVUkw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWN1cmVkIERpc2NvdmVyeSBVUkw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0U2VjdXJlZERpc2NvdmVyeVVSTCgpCi0JICogQHNlZSAjZ2V0VURESVJlZ2lzdHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVRERJUmVnaXN0cnlfU2VjdXJlZERpc2NvdmVyeVVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkjZ2V0U2VjdXJlZFB1YmxpY2F0aW9uVVJMIDxlbT5TZWN1cmVkIFB1YmxpY2F0aW9uIFVSTDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3VyZWQgUHVibGljYXRpb24gVVJMPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldFNlY3VyZWRQdWJsaWNhdGlvblVSTCgpCi0JICogQHNlZSAjZ2V0VURESVJlZ2lzdHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVRERJUmVnaXN0cnlfU2VjdXJlZFB1YmxpY2F0aW9uVVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXREZWZhdWx0TG9naW4gPGVtPkRlZmF1bHQgTG9naW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IExvZ2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldERlZmF1bHRMb2dpbigpCi0JICogQHNlZSAjZ2V0VURESVJlZ2lzdHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVRERJUmVnaXN0cnlfRGVmYXVsdExvZ2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXREZWZhdWx0UGFzc3dvcmQgPGVtPkRlZmF1bHQgUGFzc3dvcmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFBhc3N3b3JkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5I2dldERlZmF1bHRQYXNzd29yZCgpCi0JICogQHNlZSAjZ2V0VURESVJlZ2lzdHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVRERJUmVnaXN0cnlfRGVmYXVsdFBhc3N3b3JkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXRUYXhvbm9taWVzIDxlbT5UYXhvbm9taWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGF4b25vbWllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeSNnZXRUYXhvbm9taWVzKCkKLQkgKiBAc2VlICNnZXRVRERJUmVnaXN0cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFVERElSZWdpc3RyeV9UYXhvbm9taWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVRERJUmVnaXN0cnlGYWN0b3J5IGdldFVERElSZWdpc3RyeUZhY3RvcnkoKTsKLQotfSAvL1VERElSZWdpc3RyeVBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwMmQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3RJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo1MCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVGF4b25vbWllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0VGF4b25vbWllcyA8ZW0+VGF4b25vbWllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFVkZGlSZWdpc3RyeSA8ZW0+VWRkaSBSZWdpc3RyeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50Um9vdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERvY3VtZW50Um9vdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeFNJU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50Um9vdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVRERJUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGF4b25vbWllcyBnZXRUYXhvbm9taWVzKCkgewotCQlyZXR1cm4gKFRheG9ub21pZXMpZ2V0TWl4ZWQoKS5nZXQoVURESVJlZ2lzdHJ5UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1RheG9ub21pZXMoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGF4b25vbWllcyhUYXhvbm9taWVzIG5ld1RheG9ub21pZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChVRERJUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfVGF4b25vbWllcygpLCBuZXdUYXhvbm9taWVzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXhvbm9taWVzKFRheG9ub21pZXMgbmV3VGF4b25vbWllcykgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFVERElSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9UYXhvbm9taWVzKCksIG5ld1RheG9ub21pZXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVRERJUmVnaXN0cnkgZ2V0VWRkaVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gKFVERElSZWdpc3RyeSlnZXRNaXhlZCgpLmdldChVRERJUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfVWRkaVJlZ2lzdHJ5KCksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFVkZGlSZWdpc3RyeShVRERJUmVnaXN0cnkgbmV3VWRkaVJlZ2lzdHJ5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoVURESVJlZ2lzdHJ5UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1VkZGlSZWdpc3RyeSgpLCBuZXdVZGRpUmVnaXN0cnksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVkZGlSZWdpc3RyeShVRERJUmVnaXN0cnkgbmV3VWRkaVJlZ2lzdHJ5KSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoVURESVJlZ2lzdHJ5UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1VkZGlSZWdpc3RyeSgpLCBuZXdVZGRpUmVnaXN0cnkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fVEFYT05PTUlFUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0VGF4b25vbWllcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fVURESV9SRUdJU1RSWToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0VWRkaVJlZ2lzdHJ5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiBnZXRNaXhlZCgpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19UQVhPTk9NSUVTOgotCQkJCXJldHVybiBnZXRUYXhvbm9taWVzKCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fVURESV9SRUdJU1RSWToKLQkJCQlyZXR1cm4gZ2V0VWRkaVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlnZXRNaXhlZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19UQVhPTk9NSUVTOgotCQkJCXNldFRheG9ub21pZXMoKFRheG9ub21pZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19VRERJX1JFR0lTVFJZOgotCQkJCXNldFVkZGlSZWdpc3RyeSgoVURESVJlZ2lzdHJ5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19UQVhPTk9NSUVTOgotCQkJCXNldFRheG9ub21pZXMoKFRheG9ub21pZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1VERElfUkVHSVNUUlk6Ci0JCQkJc2V0VWRkaVJlZ2lzdHJ5KChVRERJUmVnaXN0cnkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1RBWE9OT01JRVM6Ci0JCQkJcmV0dXJuIGdldFRheG9ub21pZXMoKSAhPSBudWxsOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1VERElfUkVHSVNUUlk6Ci0JCQkJcmV0dXJuIGdldFVkZGlSZWdpc3RyeSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvaW1wbC9UYXhvbm9taWVzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L2ltcGwvVGF4b25vbWllc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3NWJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvaW1wbC9UYXhvbm9taWVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGF4b25vbWllc0ltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjUwIGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5UYXhvbm9taWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXhvbm9taWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5pbXBsLlRheG9ub21pZXNJbXBsI2dldFRheG9ub215IDxlbT5UYXhvbm9teTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRheG9ub21pZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXhvbm9taWVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXhvbm9teSgpIDxlbT5UYXhvbm9teTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXhvbm9teSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRheG9ub215ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXhvbm9taWVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVERElSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFLmdldFRheG9ub21pZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGF4b25vbXkoKSB7Ci0JCWlmICh0YXhvbm9teSA9PSBudWxsKSB7Ci0JCQl0YXhvbm9teSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUYXhvbm9teS5jbGFzcywgdGhpcywgVURESVJlZ2lzdHJ5UGFja2FnZS5UQVhPTk9NSUVTX19UQVhPTk9NWSk7Ci0JCX0KLQkJcmV0dXJuIHRheG9ub215OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5UQVhPTk9NSUVTX19UQVhPTk9NWToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYXhvbm9teSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVEFYT05PTUlFU19fVEFYT05PTVk6Ci0JCQkJcmV0dXJuIGdldFRheG9ub215KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlRBWE9OT01JRVNfX1RBWE9OT01ZOgotCQkJCWdldFRheG9ub215KCkuY2xlYXIoKTsKLQkJCQlnZXRUYXhvbm9teSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5UQVhPTk9NSUVTX19UQVhPTk9NWToKLQkJCQlnZXRUYXhvbm9teSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVEFYT05PTUlFU19fVEFYT05PTVk6Ci0JCQkJcmV0dXJuIHRheG9ub215ICE9IG51bGwgJiYgIXRheG9ub215LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vVGF4b25vbWllc0ltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9pbXBsL1VERElSZWdpc3RyeUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvaW1wbC9VRERJUmVnaXN0cnlGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTgwMzNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9pbXBsL1VERElSZWdpc3RyeUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVERElSZWdpc3RyeUZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo1MCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVRERJUmVnaXN0cnlGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFVERElSZWdpc3RyeUZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVRERJUmVnaXN0cnlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6IHJldHVybiBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5UQVhPTk9NSUVTOiByZXR1cm4gY3JlYXRlVGF4b25vbWllcygpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUlk6IHJldHVybiBjcmVhdGVVRERJUmVnaXN0cnkoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb2N1bWVudFJvb3QgY3JlYXRlRG9jdW1lbnRSb290KCkgewotCQlEb2N1bWVudFJvb3RJbXBsIGRvY3VtZW50Um9vdCA9IG5ldyBEb2N1bWVudFJvb3RJbXBsKCk7Ci0JCXJldHVybiBkb2N1bWVudFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRheG9ub21pZXMgY3JlYXRlVGF4b25vbWllcygpIHsKLQkJVGF4b25vbWllc0ltcGwgdGF4b25vbWllcyA9IG5ldyBUYXhvbm9taWVzSW1wbCgpOwotCQlyZXR1cm4gdGF4b25vbWllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVURESVJlZ2lzdHJ5IGNyZWF0ZVVERElSZWdpc3RyeSgpIHsKLQkJVURESVJlZ2lzdHJ5SW1wbCB1ZGRpUmVnaXN0cnkgPSBuZXcgVURESVJlZ2lzdHJ5SW1wbCgpOwotCQlyZXR1cm4gdWRkaVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVRERJUmVnaXN0cnlQYWNrYWdlIGdldFVERElSZWdpc3RyeVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoVURESVJlZ2lzdHJ5UGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVRERJUmVnaXN0cnlQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBVRERJUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9VRERJUmVnaXN0cnlGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L2ltcGwvVURESVJlZ2lzdHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L2ltcGwvVURESVJlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGUzOGIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS9pbXBsL1VERElSZWdpc3RyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVERElSZWdpc3RyeUltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjUwIGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuUmVnaXN0cnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVGF4b25vbWllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVERElSZWdpc3RyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5VRERJUmVnaXN0cnlJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuVURESVJlZ2lzdHJ5SW1wbCNnZXREaXNjb3ZlcnlVUkwgPGVtPkRpc2NvdmVyeSBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LmltcGwuVURESVJlZ2lzdHJ5SW1wbCNnZXRQdWJsaWNhdGlvblVSTCA8ZW0+UHVibGljYXRpb24gVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5pbXBsLlVERElSZWdpc3RyeUltcGwjZ2V0U2VjdXJlZERpc2NvdmVyeVVSTCA8ZW0+U2VjdXJlZCBEaXNjb3ZlcnkgVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5pbXBsLlVERElSZWdpc3RyeUltcGwjZ2V0U2VjdXJlZFB1YmxpY2F0aW9uVVJMIDxlbT5TZWN1cmVkIFB1YmxpY2F0aW9uIFVSTDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5VRERJUmVnaXN0cnlJbXBsI2dldERlZmF1bHRMb2dpbiA8ZW0+RGVmYXVsdCBMb2dpbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5VRERJUmVnaXN0cnlJbXBsI2dldERlZmF1bHRQYXNzd29yZCA8ZW0+RGVmYXVsdCBQYXNzd29yZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbC5VRERJUmVnaXN0cnlJbXBsI2dldFRheG9ub21pZXMgPGVtPlRheG9ub21pZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVRERJUmVnaXN0cnlJbXBsIGV4dGVuZHMgUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgVURESVJlZ2lzdHJ5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjb3ZlcnlVUkwoKSA8ZW0+RGlzY292ZXJ5IFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzY292ZXJ5VVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDT1ZFUllfVVJMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2NvdmVyeVVSTCgpIDxlbT5EaXNjb3ZlcnkgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjb3ZlcnlVUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGlzY292ZXJ5VVJMID0gRElTQ09WRVJZX1VSTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaWNhdGlvblVSTCgpIDxlbT5QdWJsaWNhdGlvbiBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1YmxpY2F0aW9uVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNBVElPTl9VUkxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGljYXRpb25VUkwoKSA8ZW0+UHVibGljYXRpb24gVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdWJsaWNhdGlvblVSTCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNhdGlvblVSTCA9IFBVQkxJQ0FUSU9OX1VSTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cmVkRGlzY292ZXJ5VVJMKCkgPGVtPlNlY3VyZWQgRGlzY292ZXJ5IFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdXJlZERpc2NvdmVyeVVSTCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVVJFRF9ESVNDT1ZFUllfVVJMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyZWREaXNjb3ZlcnlVUkwoKSA8ZW0+U2VjdXJlZCBEaXNjb3ZlcnkgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cmVkRGlzY292ZXJ5VVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3VyZWREaXNjb3ZlcnlVUkwgPSBTRUNVUkVEX0RJU0NPVkVSWV9VUkxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdXJlZFB1YmxpY2F0aW9uVVJMKCkgPGVtPlNlY3VyZWQgUHVibGljYXRpb24gVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cmVkUHVibGljYXRpb25VUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1VSRURfUFVCTElDQVRJT05fVVJMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyZWRQdWJsaWNhdGlvblVSTCgpIDxlbT5TZWN1cmVkIFB1YmxpY2F0aW9uIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdXJlZFB1YmxpY2F0aW9uVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3VyZWRQdWJsaWNhdGlvblVSTCA9IFNFQ1VSRURfUFVCTElDQVRJT05fVVJMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRMb2dpbigpIDxlbT5EZWZhdWx0IExvZ2luPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0TG9naW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HSU5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdExvZ2luKCkgPGVtPkRlZmF1bHQgTG9naW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRMb2dpbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TG9naW4gPSBERUZBVUxUX0xPR0lOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRQYXNzd29yZCgpIDxlbT5EZWZhdWx0IFBhc3N3b3JkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0UGFzc3dvcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFTU1dPUkRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFBhc3N3b3JkKCkgPGVtPkRlZmF1bHQgUGFzc3dvcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRQYXNzd29yZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UGFzc3dvcmQgPSBERUZBVUxUX1BBU1NXT1JEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGF4b25vbWllcygpIDxlbT5UYXhvbm9taWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXhvbm9taWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGF4b25vbWllcyB0YXhvbm9taWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVRERJUmVnaXN0cnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVURESVJlZ2lzdHJ5UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VURESVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzY292ZXJ5VVJMKCkgewotCQlyZXR1cm4gZGlzY292ZXJ5VVJMOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2NvdmVyeVVSTChTdHJpbmcgbmV3RGlzY292ZXJ5VVJMKSB7Ci0JCVN0cmluZyBvbGREaXNjb3ZlcnlVUkwgPSBkaXNjb3ZlcnlVUkw7Ci0JCWRpc2NvdmVyeVVSTCA9IG5ld0Rpc2NvdmVyeVVSTDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19ESVNDT1ZFUllfVVJMLCBvbGREaXNjb3ZlcnlVUkwsIGRpc2NvdmVyeVVSTCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljYXRpb25VUkwoKSB7Ci0JCXJldHVybiBwdWJsaWNhdGlvblVSTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNhdGlvblVSTChTdHJpbmcgbmV3UHVibGljYXRpb25VUkwpIHsKLQkJU3RyaW5nIG9sZFB1YmxpY2F0aW9uVVJMID0gcHVibGljYXRpb25VUkw7Ci0JCXB1YmxpY2F0aW9uVVJMID0gbmV3UHVibGljYXRpb25VUkw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fUFVCTElDQVRJT05fVVJMLCBvbGRQdWJsaWNhdGlvblVSTCwgcHVibGljYXRpb25VUkwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlY3VyZWREaXNjb3ZlcnlVUkwoKSB7Ci0JCXJldHVybiBzZWN1cmVkRGlzY292ZXJ5VVJMOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3VyZWREaXNjb3ZlcnlVUkwoU3RyaW5nIG5ld1NlY3VyZWREaXNjb3ZlcnlVUkwpIHsKLQkJU3RyaW5nIG9sZFNlY3VyZWREaXNjb3ZlcnlVUkwgPSBzZWN1cmVkRGlzY292ZXJ5VVJMOwotCQlzZWN1cmVkRGlzY292ZXJ5VVJMID0gbmV3U2VjdXJlZERpc2NvdmVyeVVSTDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19TRUNVUkVEX0RJU0NPVkVSWV9VUkwsIG9sZFNlY3VyZWREaXNjb3ZlcnlVUkwsIHNlY3VyZWREaXNjb3ZlcnlVUkwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlY3VyZWRQdWJsaWNhdGlvblVSTCgpIHsKLQkJcmV0dXJuIHNlY3VyZWRQdWJsaWNhdGlvblVSTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN1cmVkUHVibGljYXRpb25VUkwoU3RyaW5nIG5ld1NlY3VyZWRQdWJsaWNhdGlvblVSTCkgewotCQlTdHJpbmcgb2xkU2VjdXJlZFB1YmxpY2F0aW9uVVJMID0gc2VjdXJlZFB1YmxpY2F0aW9uVVJMOwotCQlzZWN1cmVkUHVibGljYXRpb25VUkwgPSBuZXdTZWN1cmVkUHVibGljYXRpb25VUkw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fU0VDVVJFRF9QVUJMSUNBVElPTl9VUkwsIG9sZFNlY3VyZWRQdWJsaWNhdGlvblVSTCwgc2VjdXJlZFB1YmxpY2F0aW9uVVJMKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TG9naW4oKSB7Ci0JCXJldHVybiBkZWZhdWx0TG9naW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdExvZ2luKFN0cmluZyBuZXdEZWZhdWx0TG9naW4pIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRMb2dpbiA9IGRlZmF1bHRMb2dpbjsKLQkJZGVmYXVsdExvZ2luID0gbmV3RGVmYXVsdExvZ2luOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0RFRkFVTFRfTE9HSU4sIG9sZERlZmF1bHRMb2dpbiwgZGVmYXVsdExvZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFzc3dvcmQoKSB7Ci0JCXJldHVybiBkZWZhdWx0UGFzc3dvcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFBhc3N3b3JkKFN0cmluZyBuZXdEZWZhdWx0UGFzc3dvcmQpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRQYXNzd29yZCA9IGRlZmF1bHRQYXNzd29yZDsKLQkJZGVmYXVsdFBhc3N3b3JkID0gbmV3RGVmYXVsdFBhc3N3b3JkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0RFRkFVTFRfUEFTU1dPUkQsIG9sZERlZmF1bHRQYXNzd29yZCwgZGVmYXVsdFBhc3N3b3JkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRheG9ub21pZXMgZ2V0VGF4b25vbWllcygpIHsKLQkJcmV0dXJuIHRheG9ub21pZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGF4b25vbWllcyhUYXhvbm9taWVzIG5ld1RheG9ub21pZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVGF4b25vbWllcyBvbGRUYXhvbm9taWVzID0gdGF4b25vbWllczsKLQkJdGF4b25vbWllcyA9IG5ld1RheG9ub21pZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fVEFYT05PTUlFUywgb2xkVGF4b25vbWllcywgbmV3VGF4b25vbWllcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGF4b25vbWllcyhUYXhvbm9taWVzIG5ld1RheG9ub21pZXMpIHsKLQkJaWYgKG5ld1RheG9ub21pZXMgIT0gdGF4b25vbWllcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGF4b25vbWllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXhvbm9taWVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19UQVhPTk9NSUVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUYXhvbm9taWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RheG9ub21pZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1RBWE9OT01JRVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGF4b25vbWllcyhuZXdUYXhvbm9taWVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fVEFYT05PTUlFUywgbmV3VGF4b25vbWllcywgbmV3VGF4b25vbWllcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19OQU1FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE5hbWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19ERVNDUklQVElPTjoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1RBWE9OT01JRVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldFRheG9ub21pZXMobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1JFRjoKLQkJCQlyZXR1cm4gZ2V0UmVmKCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0RJU0NPVkVSWV9VUkw6Ci0JCQkJcmV0dXJuIGdldERpc2NvdmVyeVVSTCgpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1BVQkxJQ0FUSU9OX1VSTDoKLQkJCQlyZXR1cm4gZ2V0UHVibGljYXRpb25VUkwoKTsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19TRUNVUkVEX0RJU0NPVkVSWV9VUkw6Ci0JCQkJcmV0dXJuIGdldFNlY3VyZWREaXNjb3ZlcnlVUkwoKTsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19TRUNVUkVEX1BVQkxJQ0FUSU9OX1VSTDoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJlZFB1YmxpY2F0aW9uVVJMKCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fREVGQVVMVF9MT0dJTjoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdExvZ2luKCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fREVGQVVMVF9QQVNTV09SRDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFBhc3N3b3JkKCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fVEFYT05PTUlFUzoKLQkJCQlyZXR1cm4gZ2V0VGF4b25vbWllcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19OQU1FOgotCQkJCWdldE5hbWUoKS5jbGVhcigpOwotCQkJCWdldE5hbWUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19ERVNDUklQVElPTjoKLQkJCQlnZXREZXNjcmlwdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1JFRjoKLQkJCQlzZXRSZWYoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fRElTQ09WRVJZX1VSTDoKLQkJCQlzZXREaXNjb3ZlcnlVUkwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1BVQkxJQ0FUSU9OX1VSTDoKLQkJCQlzZXRQdWJsaWNhdGlvblVSTCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fU0VDVVJFRF9ESVNDT1ZFUllfVVJMOgotCQkJCXNldFNlY3VyZWREaXNjb3ZlcnlVUkwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1NFQ1VSRURfUFVCTElDQVRJT05fVVJMOgotCQkJCXNldFNlY3VyZWRQdWJsaWNhdGlvblVSTCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fREVGQVVMVF9MT0dJTjoKLQkJCQlzZXREZWZhdWx0TG9naW4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0RFRkFVTFRfUEFTU1dPUkQ6Ci0JCQkJc2V0RGVmYXVsdFBhc3N3b3JkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19UQVhPTk9NSUVTOgotCQkJCXNldFRheG9ub21pZXMoKFRheG9ub21pZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fTkFNRToKLQkJCQlnZXROYW1lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fREVTQ1JJUFRJT046Ci0JCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKExPQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fUkVGOgotCQkJCXNldFJlZihSRUZfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0RJU0NPVkVSWV9VUkw6Ci0JCQkJc2V0RGlzY292ZXJ5VVJMKERJU0NPVkVSWV9VUkxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19QVUJMSUNBVElPTl9VUkw6Ci0JCQkJc2V0UHVibGljYXRpb25VUkwoUFVCTElDQVRJT05fVVJMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fU0VDVVJFRF9ESVNDT1ZFUllfVVJMOgotCQkJCXNldFNlY3VyZWREaXNjb3ZlcnlVUkwoU0VDVVJFRF9ESVNDT1ZFUllfVVJMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fU0VDVVJFRF9QVUJMSUNBVElPTl9VUkw6Ci0JCQkJc2V0U2VjdXJlZFB1YmxpY2F0aW9uVVJMKFNFQ1VSRURfUFVCTElDQVRJT05fVVJMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fREVGQVVMVF9MT0dJTjoKLQkJCQlzZXREZWZhdWx0TG9naW4oREVGQVVMVF9MT0dJTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0RFRkFVTFRfUEFTU1dPUkQ6Ci0JCQkJc2V0RGVmYXVsdFBhc3N3b3JkKERFRkFVTFRfUEFTU1dPUkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19UQVhPTk9NSUVTOgotCQkJCXNldFRheG9ub21pZXMoKFRheG9ub21pZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fTkFNRToKLQkJCQlyZXR1cm4gbmFtZSAhPSBudWxsICYmICFuYW1lLmlzRW1wdHkoKTsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb24gIT0gbnVsbCAmJiAhZGVzY3JpcHRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1JFRjoKLQkJCQlyZXR1cm4gUkVGX0VERUZBVUxUID09IG51bGwgPyByZWYgIT0gbnVsbCA6ICFSRUZfRURFRkFVTFQuZXF1YWxzKHJlZik7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX0RJU0NPVkVSWV9VUkw6Ci0JCQkJcmV0dXJuIERJU0NPVkVSWV9VUkxfRURFRkFVTFQgPT0gbnVsbCA/IGRpc2NvdmVyeVVSTCAhPSBudWxsIDogIURJU0NPVkVSWV9VUkxfRURFRkFVTFQuZXF1YWxzKGRpc2NvdmVyeVVSTCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fUFVCTElDQVRJT05fVVJMOgotCQkJCXJldHVybiBQVUJMSUNBVElPTl9VUkxfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY2F0aW9uVVJMICE9IG51bGwgOiAhUFVCTElDQVRJT05fVVJMX0VERUZBVUxULmVxdWFscyhwdWJsaWNhdGlvblVSTCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fU0VDVVJFRF9ESVNDT1ZFUllfVVJMOgotCQkJCXJldHVybiBTRUNVUkVEX0RJU0NPVkVSWV9VUkxfRURFRkFVTFQgPT0gbnVsbCA/IHNlY3VyZWREaXNjb3ZlcnlVUkwgIT0gbnVsbCA6ICFTRUNVUkVEX0RJU0NPVkVSWV9VUkxfRURFRkFVTFQuZXF1YWxzKHNlY3VyZWREaXNjb3ZlcnlVUkwpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1NFQ1VSRURfUFVCTElDQVRJT05fVVJMOgotCQkJCXJldHVybiBTRUNVUkVEX1BVQkxJQ0FUSU9OX1VSTF9FREVGQVVMVCA9PSBudWxsID8gc2VjdXJlZFB1YmxpY2F0aW9uVVJMICE9IG51bGwgOiAhU0VDVVJFRF9QVUJMSUNBVElPTl9VUkxfRURFRkFVTFQuZXF1YWxzKHNlY3VyZWRQdWJsaWNhdGlvblVSTCk7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVURESV9SRUdJU1RSWV9fREVGQVVMVF9MT0dJTjoKLQkJCQlyZXR1cm4gREVGQVVMVF9MT0dJTl9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdExvZ2luICE9IG51bGwgOiAhREVGQVVMVF9MT0dJTl9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdExvZ2luKTsKLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZX19ERUZBVUxUX1BBU1NXT1JEOgotCQkJCXJldHVybiBERUZBVUxUX1BBU1NXT1JEX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0UGFzc3dvcmQgIT0gbnVsbCA6ICFERUZBVUxUX1BBU1NXT1JEX0VERUZBVUxULmVxdWFscyhkZWZhdWx0UGFzc3dvcmQpOwotCQkJY2FzZSBVRERJUmVnaXN0cnlQYWNrYWdlLlVERElfUkVHSVNUUllfX1RBWE9OT01JRVM6Ci0JCQkJcmV0dXJuIHRheG9ub21pZXMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpc2NvdmVyeVVSTDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzY292ZXJ5VVJMKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdWJsaWNhdGlvblVSTDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVibGljYXRpb25VUkwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlY3VyZWREaXNjb3ZlcnlVUkw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlY3VyZWREaXNjb3ZlcnlVUkwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlY3VyZWRQdWJsaWNhdGlvblVSTDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VjdXJlZFB1YmxpY2F0aW9uVVJMKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0TG9naW46ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRMb2dpbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFBhc3N3b3JkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0UGFzc3dvcmQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9VRERJUmVnaXN0cnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvaW1wbC9VRERJUmVnaXN0cnlQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L2ltcGwvVURESVJlZ2lzdHJ5UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NTI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvaW1wbC9VRERJUmVnaXN0cnlQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVURESVJlZ2lzdHJ5UGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjUwIGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LmltcGwuUmVnaXN0cnlQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5SVEluZGV4UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucnRpbmRleC5pbXBsLlJUSW5kZXhQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXlQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5pbXBsLlRheG9ub215UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVGF4b25vbWllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVERElSZWdpc3RyeVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgVURESVJlZ2lzdHJ5UGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZG9jdW1lbnRSb290RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRheG9ub21pZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdWRkaVJlZ2lzdHJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVERElSZWdpc3RyeVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBVRERJUmVnaXN0cnlGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVERElSZWdpc3RyeVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFVERElSZWdpc3RyeVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVURESVJlZ2lzdHJ5UGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVVERElSZWdpc3RyeVBhY2thZ2VJbXBsIHRoZVVERElSZWdpc3RyeVBhY2thZ2UgPSAoVURESVJlZ2lzdHJ5UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgVURESVJlZ2lzdHJ5UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBVRERJUmVnaXN0cnlQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTFR5cGVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJUlRJbmRleFBhY2thZ2VJbXBsIHRoZVJUSW5kZXhQYWNrYWdlID0gKFJUSW5kZXhQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUlRJbmRleFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBSVEluZGV4UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSVEluZGV4UGFja2FnZS5lTlNfVVJJKSA6IFJUSW5kZXhQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCQlUYXhvbm9teVBhY2thZ2VJbXBsIHRoZVRheG9ub215UGFja2FnZSA9IChUYXhvbm9teVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYXhvbm9teVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYXhvbm9teVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGF4b25vbXlQYWNrYWdlLmVOU19VUkkpIDogVGF4b25vbXlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCQlSZWdpc3RyeVBhY2thZ2VJbXBsIHRoZVJlZ2lzdHJ5UGFja2FnZSA9IChSZWdpc3RyeVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZWdpc3RyeVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBSZWdpc3RyeVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUmVnaXN0cnlQYWNrYWdlLmVOU19VUkkpIDogUmVnaXN0cnlQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVVERElSZWdpc3RyeVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVJUSW5kZXhQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYXhvbm9teVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVJlZ2lzdHJ5UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVVERElSZWdpc3RyeVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVSVEluZGV4UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRheG9ub215UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVJlZ2lzdHJ5UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVVRERJUmVnaXN0cnlQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVVRERJUmVnaXN0cnlQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCkgewotCQlyZXR1cm4gZG9jdW1lbnRSb290RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERvY3VtZW50Um9vdF9NaXhlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9UYXhvbm9taWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1VkZGlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGF4b25vbWllcygpIHsKLQkJcmV0dXJuIHRheG9ub21pZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGF4b25vbWllc19UYXhvbm9teSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRheG9ub21pZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFVERElSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIHVkZGlSZWdpc3RyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVRERJUmVnaXN0cnlfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVkZGlSZWdpc3RyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFVERElSZWdpc3RyeV9EaXNjb3ZlcnlVUkwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl1ZGRpUmVnaXN0cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVRERJUmVnaXN0cnlfUHVibGljYXRpb25VUkwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl1ZGRpUmVnaXN0cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVRERJUmVnaXN0cnlfU2VjdXJlZERpc2NvdmVyeVVSTCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVkZGlSZWdpc3RyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFVERElSZWdpc3RyeV9TZWN1cmVkUHVibGljYXRpb25VUkwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl1ZGRpUmVnaXN0cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVRERJUmVnaXN0cnlfRGVmYXVsdExvZ2luKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdWRkaVJlZ2lzdHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VURESVJlZ2lzdHJ5X0RlZmF1bHRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVkZGlSZWdpc3RyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVERElSZWdpc3RyeV9UYXhvbm9taWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdWRkaVJlZ2lzdHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVERElSZWdpc3RyeUZhY3RvcnkgZ2V0VURESVJlZ2lzdHJ5RmFjdG9yeSgpIHsKLQkJcmV0dXJuIChVRERJUmVnaXN0cnlGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWRvY3VtZW50Um9vdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET0NVTUVOVF9ST09UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19UQVhPTk9NSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX1VERElfUkVHSVNUUlkpOwotCi0JCXRheG9ub21pZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFYT05PTUlFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGF4b25vbWllc0VDbGFzcywgVEFYT05PTUlFU19fVEFYT05PTVkpOwotCi0JCXVkZGlSZWdpc3RyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVRERJX1JFR0lTVFJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1ZGRpUmVnaXN0cnlFQ2xhc3MsIFVERElfUkVHSVNUUllfX1ZFUlNJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHVkZGlSZWdpc3RyeUVDbGFzcywgVURESV9SRUdJU1RSWV9fRElTQ09WRVJZX1VSTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodWRkaVJlZ2lzdHJ5RUNsYXNzLCBVRERJX1JFR0lTVFJZX19QVUJMSUNBVElPTl9VUkwpOwotCQljcmVhdGVFQXR0cmlidXRlKHVkZGlSZWdpc3RyeUVDbGFzcywgVURESV9SRUdJU1RSWV9fU0VDVVJFRF9ESVNDT1ZFUllfVVJMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1ZGRpUmVnaXN0cnlFQ2xhc3MsIFVERElfUkVHSVNUUllfX1NFQ1VSRURfUFVCTElDQVRJT05fVVJMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1ZGRpUmVnaXN0cnlFQ2xhc3MsIFVERElfUkVHSVNUUllfX0RFRkFVTFRfTE9HSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHVkZGlSZWdpc3RyeUVDbGFzcywgVURESV9SRUdJU1RSWV9fREVGQVVMVF9QQVNTV09SRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodWRkaVJlZ2lzdHJ5RUNsYXNzLCBVRERJX1JFR0lTVFJZX19UQVhPTk9NSUVTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJVGF4b25vbXlQYWNrYWdlSW1wbCB0aGVUYXhvbm9teVBhY2thZ2UgPSAoVGF4b25vbXlQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYXhvbm9teVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVJlZ2lzdHJ5UGFja2FnZUltcGwgdGhlUmVnaXN0cnlQYWNrYWdlID0gKFJlZ2lzdHJ5UGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUmVnaXN0cnlQYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZUltcGwgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJdWRkaVJlZ2lzdHJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVJlZ2lzdHJ5UGFja2FnZS5nZXRSZWdpc3RyeSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGRvY3VtZW50Um9vdEVDbGFzcywgRG9jdW1lbnRSb290LmNsYXNzLCAiRG9jdW1lbnRSb290IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4TUxOU1ByZWZpeE1hcCIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4U0lTY2hlbWFMb2NhdGlvbiIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfVGF4b25vbWllcygpLCB0aGlzLmdldFRheG9ub21pZXMoKSwgbnVsbCwgInRheG9ub21pZXMiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1VkZGlSZWdpc3RyeSgpLCB0aGlzLmdldFVERElSZWdpc3RyeSgpLCBudWxsLCAidWRkaVJlZ2lzdHJ5IiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YXhvbm9taWVzRUNsYXNzLCBUYXhvbm9taWVzLmNsYXNzLCAiVGF4b25vbWllcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGF4b25vbWllc19UYXhvbm9teSgpLCB0aGVUYXhvbm9teVBhY2thZ2UuZ2V0VGF4b25vbXkoKSwgbnVsbCwgInRheG9ub215IiwgbnVsbCwgMCwgLTEsIFRheG9ub21pZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh1ZGRpUmVnaXN0cnlFQ2xhc3MsIFVERElSZWdpc3RyeS5jbGFzcywgIlVERElSZWdpc3RyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VURESVJlZ2lzdHJ5X1ZlcnNpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMSwgMSwgVURESVJlZ2lzdHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VURESVJlZ2lzdHJ5X0Rpc2NvdmVyeVVSTCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRBbnlVUkkoKSwgImRpc2NvdmVyeVVSTCIsIG51bGwsIDEsIDEsIFVERElSZWdpc3RyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFVERElSZWdpc3RyeV9QdWJsaWNhdGlvblVSTCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRBbnlVUkkoKSwgInB1YmxpY2F0aW9uVVJMIiwgbnVsbCwgMSwgMSwgVURESVJlZ2lzdHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VURESVJlZ2lzdHJ5X1NlY3VyZWREaXNjb3ZlcnlVUkwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0QW55VVJJKCksICJzZWN1cmVkRGlzY292ZXJ5VVJMIiwgbnVsbCwgMSwgMSwgVURESVJlZ2lzdHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VURESVJlZ2lzdHJ5X1NlY3VyZWRQdWJsaWNhdGlvblVSTCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRBbnlVUkkoKSwgInNlY3VyZWRQdWJsaWNhdGlvblVSTCIsIG51bGwsIDEsIDEsIFVERElSZWdpc3RyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFVERElSZWdpc3RyeV9EZWZhdWx0TG9naW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWZhdWx0TG9naW4iLCBudWxsLCAxLCAxLCBVRERJUmVnaXN0cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRVRERJUmVnaXN0cnlfRGVmYXVsdFBhc3N3b3JkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVmYXVsdFBhc3N3b3JkIiwgbnVsbCwgMSwgMSwgVURESVJlZ2lzdHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VURESVJlZ2lzdHJ5X1RheG9ub21pZXMoKSwgdGhpcy5nZXRUYXhvbm9taWVzKCksIG51bGwsICJ0YXhvbm9taWVzIiwgbnVsbCwgMCwgMSwgVURESVJlZ2lzdHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKLQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCi0JCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkb2N1bWVudFJvb3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsCi0JCQkgImtpbmQiLCAibWl4ZWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsCi0JCQkgIm5hbWUiLCAiOm1peGVkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInhtbG5zOnByZWZpeCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X1RheG9ub21pZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAidGF4b25vbWllcyIsCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfVWRkaVJlZ2lzdHJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInVkZGlSZWdpc3RyeSIsCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0YXhvbm9taWVzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUYXhvbm9taWVzIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXhvbm9taWVzX1RheG9ub215KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInRheG9ub215IiwKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9lY2xpcHNlLm9yZy93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3RheG9ub215IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHVkZGlSZWdpc3RyeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVURESVJlZ2lzdHJ5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRVRERJUmVnaXN0cnlfVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ2ZXJzaW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVERElSZWdpc3RyeV9EaXNjb3ZlcnlVUkwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGlzY292ZXJ5VVJMIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVERElSZWdpc3RyeV9QdWJsaWNhdGlvblVSTCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJwdWJsaWNhdGlvblVSTCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRVRERJUmVnaXN0cnlfU2VjdXJlZERpc2NvdmVyeVVSTCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJzZWN1cmVkRGlzY292ZXJ5VVJMIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVERElSZWdpc3RyeV9TZWN1cmVkUHVibGljYXRpb25VUkwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAic2VjdXJlZFB1YmxpY2F0aW9uVVJMIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVERElSZWdpc3RyeV9EZWZhdWx0TG9naW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGVmYXVsdExvZ2luIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVERElSZWdpc3RyeV9EZWZhdWx0UGFzc3dvcmQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGVmYXVsdFBhc3N3b3JkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVERElSZWdpc3RyeV9UYXhvbm9taWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInRheG9ub21pZXMiCi0JCSAgIH0pOwotCX0KLQotfSAvL1VERElSZWdpc3RyeVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvdXRpbC9VRERJUmVnaXN0cnlBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L3V0aWwvVURESVJlZ2lzdHJ5QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4ZTBjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvdXRpbC9VRERJUmVnaXN0cnlBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVURESVJlZ2lzdHJ5QWRhcHRlckZhY3RvcnkuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjUwIGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5Lio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVRERJUmVnaXN0cnlBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVURESVJlZ2lzdHJ5UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVERElSZWdpc3RyeUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVERElSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVERElSZWdpc3RyeVN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBVRERJUmVnaXN0cnlTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXhvbm9taWVzKFRheG9ub21pZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRheG9ub21pZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VVRERJUmVnaXN0cnkoVURESVJlZ2lzdHJ5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVVRERJUmVnaXN0cnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWdpc3RyeShSZWdpc3RyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVnaXN0cnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlRheG9ub21pZXMgPGVtPlRheG9ub21pZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVGF4b25vbWllcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXhvbm9taWVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkgPGVtPlVERElSZWdpc3RyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVURESVJlZ2lzdHJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5IDxlbT5SZWdpc3RyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlZ2lzdHJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1VERElSZWdpc3RyeUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvdXRpbC9VRERJUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvdXRpbC9VRERJUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMzE1YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L3V0aWwvVURESVJlZ2lzdHJ5UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVRERJUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAwNS8xMi8wMyAwNDowNjo1MCBjYnJlYWxleSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRXh0ZW5kZWRNZXRhRGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS51dGlsLlVERElSZWdpc3RyeVJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVURESVJlZ2lzdHJ5UmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFhNTFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZE1ldGFEYXRhIGV4dGVuZGVkTWV0YURhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVRERJUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCQlleHRlbmRlZE1ldGFEYXRhID0gRXh0ZW5kZWRNZXRhRGF0YS5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgVURESVJlZ2lzdHJ5UmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgZXh0ZW5kZWRNZXRhRGF0YSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgZXh0ZW5kZWRNZXRhRGF0YSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9VRERJUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vZGVsL3YxMC91ZGRpcmVnaXN0cnkvdXRpbC9VRERJUmVnaXN0cnlSZXNvdXJjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS91dGlsL1VERElSZWdpc3RyeVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAyOWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS91dGlsL1VERElSZWdpc3RyeVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVRERJUmVnaXN0cnlSZXNvdXJjZUltcGwuamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjUwIGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkudXRpbC5VRERJUmVnaXN0cnlSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVRERJUmVnaXN0cnlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVRERJUmVnaXN0cnlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotfSAvL1VERElSZWdpc3RyeVJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9kZWwvdjEwL3VkZGlyZWdpc3RyeS91dGlsL1VERElSZWdpc3RyeVN3aXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L3V0aWwvVURESVJlZ2lzdHJ5U3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2Q4YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb2RlbC92MTAvdWRkaXJlZ2lzdHJ5L3V0aWwvVURESVJlZ2lzdHJ5U3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVRERJUmVnaXN0cnlTd2l0Y2guamF2YSx2IDEuMiAyMDA1LzEyLzAzIDA0OjA2OjUwIGNicmVhbGV5IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVERElSZWdpc3RyeVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVRERJUmVnaXN0cnlQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVURESVJlZ2lzdHJ5U3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVERElSZWdpc3RyeVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogewotCQkJCURvY3VtZW50Um9vdCBkb2N1bWVudFJvb3QgPSAoRG9jdW1lbnRSb290KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEb2N1bWVudFJvb3QoZG9jdW1lbnRSb290KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVERElSZWdpc3RyeVBhY2thZ2UuVEFYT05PTUlFUzogewotCQkJCVRheG9ub21pZXMgdGF4b25vbWllcyA9IChUYXhvbm9taWVzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXhvbm9taWVzKHRheG9ub21pZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVURESVJlZ2lzdHJ5UGFja2FnZS5VRERJX1JFR0lTVFJZOiB7Ci0JCQkJVURESVJlZ2lzdHJ5IHVkZGlSZWdpc3RyeSA9IChVRERJUmVnaXN0cnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVERElSZWdpc3RyeSh1ZGRpUmVnaXN0cnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlZ2lzdHJ5KHVkZGlSZWdpc3RyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRheG9ub21pZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGF4b25vbWllczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGF4b25vbWllcyhUYXhvbm9taWVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VURESVJlZ2lzdHJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVERElSZWdpc3RyeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVURESVJlZ2lzdHJ5KFVERElSZWdpc3RyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZ2lzdHJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZ2lzdHJ5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWdpc3RyeShSZWdpc3RyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVURESVJlZ2lzdHJ5U3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vbml0b3IvR2V0TW9uaXRvckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9uaXRvci9HZXRNb25pdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmY1YzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9uaXRvci9HZXRNb25pdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vbml0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Nb25pdG9yQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5Xc3RXU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIEdldE1vbml0b3JDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0JcHJpdmF0ZSBib29sZWFuIG1vbml0b3JTZXJ2aWNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZTsKLQotCXByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotCi0JcHJpdmF0ZSBMaXN0IGVuZHBvaW50czsKLQotCXB1YmxpYyBHZXRNb25pdG9yQ29tbWFuZCgpIHsKLQkJbW9uaXRvclNlcnZpY2UgPSB0cnVlOwotCQljcmVhdGUgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKSAKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIAotCQllbmRwb2ludHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChtb25pdG9yU2VydmljZSAmJiB3ZWJTZXJ2aWNlc1BhcnNlciAhPSBudWxsICYmIHdzZGxVUkkgIT0gbnVsbAotCQkJCSYmIHdzZGxVUkkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3ZWJTZXJ2aWNlc1BhcnNlcgotCQkJCQkuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0JCQlpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQkJTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotCQkJCWZvciAoSXRlcmF0b3Igc2VydmljZXNJdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHNlcnZpY2VzSXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlc0l0Lm5leHQoKTsKLQkJCQkJTWFwIHBvcnRzID0gc2VydmljZS5nZXRQb3J0cygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIHBvcnRzSXQgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBwb3J0c0l0Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVBvcnQgd3NkbFBvcnQgPSAoUG9ydCkgcG9ydHNJdC5uZXh0KCk7Ci0JCQkJCQlMaXN0IGV4dEVsZW1lbnRzID0gd3NkbFBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGV4dEVsZW1lbnRzSXQgPSBleHRFbGVtZW50cy5pdGVyYXRvcigpOyBleHRFbGVtZW50c0l0Ci0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbWVudHNJdAotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlTdHJpbmcgZW5kcG9pbnQgPSBudWxsOwotCQkJCQkJCVVSTCBlbmRwb2ludFVSTCA9IG51bGw7Ci0JCQkJCQkJaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLQkJCQkJCQkJZW5kcG9pbnQgPSAoKFNPQVBBZGRyZXNzKSBleHRFbGVtZW50KQotCQkJCQkJCQkJCS5nZXRMb2NhdGlvblVSSSgpOwotCQkJCQkJCWVsc2UgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykKLQkJCQkJCQkJZW5kcG9pbnQgPSAoKEhUVFBBZGRyZXNzKSBleHRFbGVtZW50KQotCQkJCQkJCQkJCS5nZXRMb2NhdGlvblVSSSgpOwotCQkJCQkJCWlmIChlbmRwb2ludCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQllbmRwb2ludFVSTCA9IG5ldyBVUkwoZW5kcG9pbnQpOwotCQkJCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZW5kcG9pbnRVUkwgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgcHJvdG9jb2wgPSBlbmRwb2ludFVSTC5nZXRQcm90b2NvbCgpOwotCQkJCQkJCQlTdHJpbmcgaG9zdCA9IGVuZHBvaW50VVJMLmdldEhvc3QoKTsKLQkJCQkJCQkJaW50IHBvcnQgPSBlbmRwb2ludFVSTC5nZXRQb3J0KCk7Ci0JCQkJCQkJCWlmIChwb3J0ID09IC0xKSB7Ci0JCQkJCQkJCQlpZiAoImh0dHAiLmVxdWFsc0lnbm9yZUNhc2UocHJvdG9jb2wpKQotCQkJCQkJCQkJCXBvcnQgPSA4MDsKLQkJCQkJCQkJCWVsc2UgaWYgKCJodHRwcyIuZXF1YWxzSWdub3JlQ2FzZShwcm90b2NvbCkpCi0JCQkJCQkJCQkJcG9ydCA9IDQ0MzsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAocHJvdG9jb2wgIT0gbnVsbAotCQkJCQkJCQkJCSYmIHByb3RvY29sLnN0YXJ0c1dpdGgoImh0dHAiKQotCQkJCQkJCQkJCSYmIGhvc3QgIT0gbnVsbCAmJiBob3N0Lmxlbmd0aCgpID4gMAotCQkJCQkJCQkJCSYmIHBvcnQgIT0gLTEpIHsKLQkJCQkJCQkJCUlNb25pdG9yIG0gPSBudWxsOwotCQkJCQkJCQkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlCi0JCQkJCQkJCQkJCS5nZXRNb25pdG9ycygpOwotCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCWlmIChob3N0LmVxdWFsc0lnbm9yZUNhc2UobW9uaXRvcnNbaV0KLQkJCQkJCQkJCQkJCS5nZXRSZW1vdGVIb3N0KCkpCi0JCQkJCQkJCQkJCQkmJiBwb3J0ID09IG1vbml0b3JzW2ldCi0JCQkJCQkJCQkJCQkJCS5nZXRSZW1vdGVQb3J0KCkpIHsKLQkJCQkJCQkJCQkJbSA9IG1vbml0b3JzW2ldOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAobSA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJCQkJCQkJCWludCBtb25pdG9yZWRQb3J0ID0gU29ja2V0VXRpbAotCQkJCQkJCQkJCQkJLmZpbmRVbnVzZWRQb3J0KDUwMDAsIDE1MDAwKTsKLQkJCQkJCQkJCQlJTW9uaXRvcldvcmtpbmdDb3B5IG1vbml0b3JXb3JraW5nQ29weSA9IE1vbml0b3JDb3JlCi0JCQkJCQkJCQkJCQkuY3JlYXRlTW9uaXRvcigpOwotCQkJCQkJCQkJCW1vbml0b3JXb3JraW5nQ29weQotCQkJCQkJCQkJCQkJLnNldExvY2FsUG9ydChtb25pdG9yZWRQb3J0KTsKLQkJCQkJCQkJCQltb25pdG9yV29ya2luZ0NvcHkuc2V0UmVtb3RlSG9zdChob3N0KTsKLQkJCQkJCQkJCQltb25pdG9yV29ya2luZ0NvcHkuc2V0UmVtb3RlUG9ydChwb3J0KTsKLQkJCQkJCQkJCQltb25pdG9yV29ya2luZ0NvcHkuc2V0UHJvdG9jb2woIkhUVFAiKTsKLQkJCQkJCQkJCQl0cnkgCi0gICAgICAgICAgICAgICAgICAgIHsKLQkJCQkJCQkJCQkJbSA9IG1vbml0b3JXb3JraW5nQ29weS5zYXZlKCk7Ci0JCQkJCQkJCQkJfSAKLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSAKLSAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJCQkJCQlJU3RhdHVzIHdhcm5pbmcgPSBTdGF0dXNVdGlscy53YXJuaW5nU3RhdHVzKAotCQkJCQkJCQkJCQkJCU5MUy5iaW5kKFdzdFdTUGx1Z2luTWVzc2FnZXMuTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SLAotCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7U3RyaW5nLnZhbHVlT2YocG9ydCksCWVuZHBvaW50IH0pLCB0ICk7Ci0JCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCQlpZiAoZW52ICE9IG51bGwpCi0JCQkJCQkJCQkJCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKQotCQkJCQkJCQkJCQkJCQkJLnJlcG9ydCh3YXJuaW5nKTsKLQkJCQkJCQkJCQkJfSBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKSB7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAobSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJaWYgKCFtLmlzUnVubmluZygpKQotCQkJCQkJCQkJCQkJbS5zdGFydCgpOwotCQkJCQkJCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCQkJCQkJCQkJCWVuZHBvaW50VVJMLmdldFByb3RvY29sKCkpOwotCQkJCQkJCQkJCQlzYi5hcHBlbmQoIjovL2xvY2FsaG9zdDoiKTsKLQkJCQkJCQkJCQkJc2IuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG0KLQkJCQkJCQkJCQkJCQkuZ2V0TG9jYWxQb3J0KCkpKTsKLQkJCQkJCQkJCQkJc2IuYXBwZW5kKGVuZHBvaW50VVJMLmdldEZpbGUoKSk7Ci0JCQkJCQkJCQkJCWVuZHBvaW50cy5hZGQoc2IudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQkJfSAKLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSAKLSAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJCQkJCQlJU3RhdHVzIHdhcm5pbmcgPSBTdGF0dXNVdGlscy53YXJuaW5nU3RhdHVzKAotCQkJCQkJCQkJCQkJCU5MUy5iaW5kKFdzdFdTUGx1Z2luTWVzc2FnZXMuTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SLAotCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7U3RyaW5nLnZhbHVlT2YocG9ydCksIGVuZHBvaW50IH0pLCB0ICk7Ci0JCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCQlpZiAoZW52ICE9IG51bGwpCi0JCQkJCQkJCQkJCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKQotCQkJCQkJCQkJCQkJCQkJLnJlcG9ydCh3YXJuaW5nKTsKLQkJCQkJCQkJCQkJfSBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKSB7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoYm9vbGVhbiBtb25pdG9yU2VydmljZSkgewotCQl0aGlzLm1vbml0b3JTZXJ2aWNlID0gbW9uaXRvclNlcnZpY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotCQl0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkgewotCQl0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENyZWF0ZShib29sZWFuIGNyZWF0ZSkgewotCQl0aGlzLmNyZWF0ZSA9IGNyZWF0ZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFbmRwb2ludHMoKSB7Ci0JCXJldHVybiBlbmRwb2ludHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dTUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3BsdWdpbi9XU1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVmMjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dTUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDAzIDEyODgyNyAgIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDQyNCAgIDExNTY5MCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50TWVyZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQVBDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V2FpdEZvcldTRExWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdTUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgV1NQbHVnaW4gcGx1Z2luOwotCQotCXByaXZhdGUgUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0IHdzaVNTQlBDb250ZXh0XzsKLQlwcml2YXRlIFBlcnNpc3RlbnRXU0lBUENvbnRleHQgd3NpQVBDb250ZXh0XzsKLQlwcml2YXRlIFBlcnNpc3RlbnRXU0RMVmFsaWRhdGlvbkNvbnRleHQgd3NkbFZhbGlkYXRpb25Db250ZXh0XzsKLQlwcml2YXRlIFBlcnNpc3RlbnRXYWl0Rm9yV1NETFZhbGlkYXRpb25Db250ZXh0IHdhaXRGb3JXc2RsVmFsaWRhdGlvbkNvbnRleHRfOwotCXByaXZhdGUgUGVyc2lzdGVudE1lcmdlQ29udGV4dCBtZXJnZUNvbnRleHRfOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzIjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFdTUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0JICogKFdTUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2Uud3N0LndzIik7Ci0JICogQHJldHVybiBUaGUgV1NQbHVnaW4gc2luZ2xldG9uLgotCSAqLwotCSBzdGF0aWMgcHVibGljIFdTUGx1Z2luIGdldEluc3RhbmNlKCkgewotCSAgIHJldHVybiBwbHVnaW47Ci0JIH0KLQkgCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXU1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCi0JLyoqCi0JICogR2V0IFdTSSBDb250ZXh0Ci0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFdTSVNTQlBDb250ZXh0IG9yIGdldFdTSUFQQ29udGV4dCBpbnN0ZWFkCi0JICogCi0JICovIAotIHB1YmxpYyBQZXJzaXN0ZW50V1NJQ29udGV4dCBnZXRXU0lDb250ZXh0KCkgCi0gCXsgLy8gZGVmYXVsdGluZyB0byBnZXQgV1NJIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZSBjb250ZXh0Ci0gCSAgcmV0dXJuIGdldFdTSVNTQlBDb250ZXh0KCk7Ci0gCX0KLSAKLSAvKioKLQkgKiBHZXQgV1NJIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZSBDb250ZXh0Ci0JICogCi0JICovIAotIHB1YmxpYyBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgZ2V0V1NJU1NCUENvbnRleHQoKSAKLQl7Ci0JICBpZiAod3NpU1NCUENvbnRleHRfID09IG51bGwpCi0JICAJewotCSAgCQl3c2lTU0JQQ29udGV4dF8gPSBuZXcgUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0KCk7Ci0JICAJCXdzaVNTQlBDb250ZXh0Xy5sb2FkKCk7Ci0JICAJfQotCSAgcmV0dXJuIHdzaVNTQlBDb250ZXh0XzsKLQl9Ci0gCi0gLyoqCi0JICogR2V0IFdTSSBBdHRhY2htZW50IFByb2ZpbGUgQ29udGV4dAotCSAqIAotCSAqLyAKLSBwdWJsaWMgUGVyc2lzdGVudFdTSUFQQ29udGV4dCBnZXRXU0lBUENvbnRleHQoKSAKLQl7Ci0JICBpZiAod3NpQVBDb250ZXh0XyA9PSBudWxsKQotCSAgCXsKLQkgIAkJd3NpQVBDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50V1NJQVBDb250ZXh0KCk7Ci0JICAJCXdzaUFQQ29udGV4dF8ubG9hZCgpOwotCSAgCX0KLQkgIHJldHVybiB3c2lBUENvbnRleHRfOwotCX0KLQotCSAvKioKLQkgKiBHZXQgV1NETCBWYWxpYXRpb24gQ29udGV4dAotCSAqIAotCSAqLyAKLQotCXB1YmxpYyBQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0IGdldFdTRExWYWxpZGF0aW9uQ29udGV4dCgpIHsKLQkJaWYgKHdzZGxWYWxpZGF0aW9uQ29udGV4dF8gPT0gbnVsbCkgewotCQkJd3NkbFZhbGlkYXRpb25Db250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0KCk7Ci0JCQl3c2RsVmFsaWRhdGlvbkNvbnRleHRfLmxvYWQoKTsKLQkJfQotCQlyZXR1cm4gd3NkbFZhbGlkYXRpb25Db250ZXh0XzsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IFdhaXQgZm9yIFdTREwgVmFsaWF0aW9uIENvbnRleHQKLQkgKiAKLQkgKi8gCi0KLQlwdWJsaWMgUGVyc2lzdGVudFdhaXRGb3JXU0RMVmFsaWRhdGlvbkNvbnRleHQgZ2V0V2FpdEZvcldTRExWYWxpZGF0aW9uQ29udGV4dCgpIHsKLQkJaWYgKHdhaXRGb3JXc2RsVmFsaWRhdGlvbkNvbnRleHRfID09IG51bGwpIHsKLQkJCXdhaXRGb3JXc2RsVmFsaWRhdGlvbkNvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRXYWl0Rm9yV1NETFZhbGlkYXRpb25Db250ZXh0KCk7Ci0JCQl3YWl0Rm9yV3NkbFZhbGlkYXRpb25Db250ZXh0Xy5sb2FkKCk7Ci0JCX0KLQkJcmV0dXJuIHdhaXRGb3JXc2RsVmFsaWRhdGlvbkNvbnRleHRfOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgU2tlbGV0b24gTWVyZ2UgQ29udGV4dAotCSAqIAotCSAqLyAKLSBwdWJsaWMgUGVyc2lzdGVudE1lcmdlQ29udGV4dCBnZXRNZXJnZUNvbnRleHQoKSAKLQl7Ci0JICBpZiAobWVyZ2VDb250ZXh0XyA9PSBudWxsKQotCSAgCXsKLQkJICBtZXJnZUNvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRNZXJnZUNvbnRleHQoKTsKLQkJICBtZXJnZUNvbnRleHRfLmxvYWQoKTsKLQkgIAl9Ci0JICByZXR1cm4gbWVyZ2VDb250ZXh0XzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3ByZWZlcmVuY2VzL01lcmdlRGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWVyZ2VEZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzY0YThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWVyZ2VEZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNDAzICAgMTI4ODI3IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgTWVyZ2VEZWZhdWx0cwotewotIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFRkVSRU5DRV9TS0VMRVRPTl9NRVJHRV9ERUZBVUxUID0gZmFsc2U7Ci0gCi0gLyoqCi0gICogCi0gICogQHJldHVybiByZXR1cm5zIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHNrZWxldG9uIG1lcmdlLgotICAqLwotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTa2VsZXRvbk1lcmdlRGVmYXVsdCgpCi0gewotCXJldHVybiBQUkVGRVJFTkNFX1NLRUxFVE9OX01FUkdFX0RFRkFVTFQ7Ci0gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50TWVyZ2VDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRNZXJnZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjMDdjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRNZXJnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDQwMyAgIDEyODgyNyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRNZXJnZUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dAotewotCSAvKioKLQkgICogVGhpcyBjb25zdGFudCBzdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIGVuYWJsZSBza2VsZXRvbiBtZXJnZSBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbQotCSAgKiB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLQkqKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1NLRUxFVE9OX01FUkdFID0gInNrZWxldG9uTWVyZ2UiOwotCQotICBwcml2YXRlIHN0YXRpYyBQZXJzaXN0ZW50TWVyZ2VDb250ZXh0IGNvbnRleHRfID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgUGVyc2lzdGVudE1lcmdlQ29udGV4dCBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiggY29udGV4dF8gPT0gbnVsbCApCi0gICAgewotICAgICAgY29udGV4dF8gPSBuZXcgUGVyc2lzdGVudE1lcmdlQ29udGV4dCgpOwotICAgICAgY29udGV4dF8ubG9hZCgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY29udGV4dF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBQZXJzaXN0ZW50TWVyZ2VDb250ZXh0KCkKLSAgewotCSAgc3VwZXIoV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2FkKCkKLSAgewotICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9TS0VMRVRPTl9NRVJHRSwgTWVyZ2VEZWZhdWx0cy5nZXRTa2VsZXRvbk1lcmdlRGVmYXVsdCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNrZWxldG9uTWVyZ2VFbmFibGVkKGJvb2xlYW4gZW5hYmxlKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9TS0VMRVRPTl9NRVJHRSwgZW5hYmxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzU2tlbGV0b25NZXJnZUVuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfU0tFTEVUT05fTUVSR0UpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTRExWYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMWMwNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9OT19XU0RMID0gIjAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX1JFTU9URV9XU0RMID0gIjEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0FMTF9XU0RMID0gIjIiOwotCi0JcHJpdmF0ZSBTdHJpbmcgd3NkbF92YWxpZGF0aW9uID0gIldTRExfVkFMSURBVElPTiI7Ci0KLXB1YmxpYyBQZXJzaXN0ZW50V1NETFZhbGlkYXRpb25Db250ZXh0ICgpIAotewotCXN1cGVyKCAgV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIGxvYWQoKSAKLXsKLQlzZXREZWZhdWx0KHdzZGxfdmFsaWRhdGlvbiwgVkFMSURBVEVfTk9fV1NETCk7Ci19Ci0KLS8vIHRvIGJlIHVzZWQgb25seSBieSB0aGUgcHJlZmVyZW5jZSBwYWdlCi1wdWJsaWMgdm9pZCB1cGRhdGVXU0RMVmFsaWRhdGlvbiAoIFN0cmluZyB2YWx1ZSkKLXsKLSAJCXNldFZhbHVlKCB3c2RsX3ZhbGlkYXRpb24sIHZhbHVlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRQZXJzaXN0ZW50V1NETFZhbGlkYXRpb24gKCkKLXsKLQlTdHJpbmcgcHJvcGVydHkgPSBnZXRWYWx1ZUFzU3RyaW5nKHdzZGxfdmFsaWRhdGlvbik7Ci0vLwkgZGVmYXVsdCB0byBJZ25vcmUgaWYgbm8gaW5pdCBoYXMgYmVlbiBkb25lIGZyb20gaW5pIGZpbGUKLQlpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5lcXVhbHMoIiIpKSB7Ci0JCXNldFZhbHVlKCB3c2RsX3ZhbGlkYXRpb24sIFZBTElEQVRFX05PX1dTREwpOwotCQlyZXR1cm4gVkFMSURBVEVfTk9fV1NETDsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gcHJvcGVydHk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpCi17Ci0JcmV0dXJuIGdldERlZmF1bHRTdHJpbmcod3NkbF92YWxpZGF0aW9uKTsKLX0KLQotcHVibGljIGJvb2xlYW4gVmFsaWRhdGVOb1dTREwoKQotewotCSByZXR1cm4gVkFMSURBVEVfTk9fV1NETC5lcXVhbHMoZ2V0UGVyc2lzdGVudFdTRExWYWxpZGF0aW9uKCkpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBXYXJuTm9uV1NJQ29tcGxpYW5jZXMoKQotewotCSByZXR1cm4gVkFMSURBVEVfUkVNT1RFX1dTREwuZXF1YWxzKGdldFBlcnNpc3RlbnRXU0RMVmFsaWRhdGlvbigpKTsKLX0KLQotcHVibGljIGJvb2xlYW4gSWdub3JlTm9uV1NJQ29tcGxpYW5jZXMoKQotewotCSByZXR1cm4gVkFMSURBVEVfQUxMX1dTREwuZXF1YWxzKGdldFBlcnNpc3RlbnRXU0RMVmFsaWRhdGlvbigpKTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lBUENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUFQQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjVkODk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUFQQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5Xc3RXU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFdTSUFQQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRXU0lDb250ZXh0Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9XU0lfQVBfQ09NUExJQU5DRSA9ICJub25XU0lBUENvbXBsaWFuY2UiOwotCi1wdWJsaWMgUGVyc2lzdGVudFdTSUFQQ29udGV4dCAoKSAKLXsKLQlzdXBlcigpOwotCW5vbl93c2lfY29tcGxpYW5jZSA9IE5PTl9XU0lfQVBfQ09NUExJQU5DRTsKLQluYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoV1NQbHVnaW4uSUQgLCBub25fd3NpX2NvbXBsaWFuY2UpOwotCXdzaVdhcm5pbmdfID0gV3N0V1NQbHVnaW5NZXNzYWdlcy5XU0lfQVBfV0FSTklORzsKLQl3c2lFcnJvcl8gPSBXc3RXU1BsdWdpbk1lc3NhZ2VzLldTSV9BUF9FUlJPUjsKLX0KLQotcHVibGljIFN0cmluZyBnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSAoKQotewotCVN0cmluZyBwcm9wZXJ0eSA9IGdldFZhbHVlQXNTdHJpbmcobm9uX3dzaV9jb21wbGlhbmNlKTsKLQkvLyBkZWZhdWx0IHRvIFdhcm5pbmcgaWYgbm8gaW5pdCBoYXMgYmVlbiBkb25lIGZyb20gaW5pIGZpbGUKLQlpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5lcXVhbHMoIiIpKSB7Ci0JCXNldFZhbHVlKCBub25fd3NpX2NvbXBsaWFuY2UsIFdBUk5fTk9OX1dTSSk7Ci0JCXJldHVybiBXQVJOX05PTl9XU0k7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIHByb3BlcnR5OwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjRmZDBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5Xc3RXU1BsdWdpbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFdTSUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dAotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfTk9OX1dTSSA9ICIwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOX05PTl9XU0kgPSAiMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX05PTl9XU0kgPSAiMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MTE9XX1dTSV9QUkVGRVJFTkNFID0gIjMiOwotCi0JcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgbmFtZSA9IG51bGw7IC8vIHNldCBpbiBzdWJjbGFzcwotCXByb3RlY3RlZCBTdHJpbmcgbm9uX3dzaV9jb21wbGlhbmNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fV1NJX1NTQlBfQ09NUExJQU5DRSA9ICJub25XU0lTU0JQQ29tcGxpYW5jZSI7Ci0JcHJvdGVjdGVkIFN0cmluZyB3c2lXYXJuaW5nXzsgLy8gc2V0IGluIHN1YmNsYXNzCi0JcHJvdGVjdGVkIFN0cmluZyB3c2lFcnJvcl87IC8vIHNldCBpbiBzdWJjbGFzcwotCi1wdWJsaWMgUGVyc2lzdGVudFdTSUNvbnRleHQgKCkgCi17Ci0Jc3VwZXIoICBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLQkKLS8vICBOT1RFOiAgbmFtZSwgd3NpV2FybmluZ18gYW5kIHdzaUVycm9yXyBzaG91bGQgYmUgc2V0IGluIHRoZSBzdWJjbGFzc2VzLiAgVGhpcyBpcyBwcm92aWRpbmcgZGVmYXVsdGluZyBvbmx5LgotCW5vbl93c2lfY29tcGxpYW5jZSA9IE5PTl9XU0lfU1NCUF9DT01QTElBTkNFOwotCW5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShXU1BsdWdpbi5JRCAsIG5vbl93c2lfY29tcGxpYW5jZSk7Ci0Jd3NpV2FybmluZ18gPSBXc3RXU1BsdWdpbk1lc3NhZ2VzLldTSV9TU0JQX1dBUk5JTkc7Ci0Jd3NpRXJyb3JfID0gV3N0V1NQbHVnaW5NZXNzYWdlcy5XU0lfU1NCUF9FUlJPUjsKLX0KLQotcHVibGljIHZvaWQgbG9hZCgpIAotewotCS8vIGxldCB0aGUgZGVmYXVsdCBiZSByZWFkIGZyb20gcGx1Z2luX2Nvc3RvbWl6YXRpb24uaW5pIGZpbGUKLQkvLyBzZXREZWZhdWx0KG5vbl93c2lfY29tcGxpYW5jZSwgV0FSTl9OT05fV1NJKTsKLX0KLQotLy8gdG8gYmUgdXNlZCBvbmx5IGJ5IHRoZSBwcmVmZXJlbmNlIHBhZ2UKLXB1YmxpYyB2b2lkIHVwZGF0ZVdTSUNvbXBsaWFuY2VzICggU3RyaW5nIHZhbHVlKQotewotIAkJc2V0VmFsdWUoIG5vbl93c2lfY29tcGxpYW5jZSwgdmFsdWUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlICgpCi17Ci0JU3RyaW5nIHByb3BlcnR5ID0gZ2V0VmFsdWVBc1N0cmluZyhub25fd3NpX2NvbXBsaWFuY2UpOwotLy8JIGRlZmF1bHQgdG8gV2FybmluZyBpZiBubyBpbml0IGhhcyBiZWVuIGRvbmUgZnJvbSBpbmkgZmlsZQotCWlmIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5LmVxdWFscygiIikpIHsKLQkJc2V0VmFsdWUoIG5vbl93c2lfY29tcGxpYW5jZSwgV0FSTl9OT05fV1NJKTsKLQkJcmV0dXJuIFdBUk5fTk9OX1dTSTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gcHJvcGVydHk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIFN0b3BOb25XU0lDb21wbGlhbmNlcygpCi17Ci0JIHJldHVybiBTVE9QX05PTl9XU0kuZXF1YWxzKGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCkpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBXYXJuTm9uV1NJQ29tcGxpYW5jZXMoKQotewotCSByZXR1cm4gV0FSTl9OT05fV1NJLmVxdWFscyhnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpKTsKLX0KLQotcHVibGljIGJvb2xlYW4gSWdub3JlTm9uV1NJQ29tcGxpYW5jZXMoKQotewotCSByZXR1cm4gSUdOT1JFX05PTl9XU0kuZXF1YWxzKGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCkpOwotfQotCi0vLyB0byBiZSB1c2VkIG9ubHkgYnkgdGhlIHByb3BlcnR5IHBhZ2UKLXB1YmxpYyB2b2lkIHVwZGF0ZVByb2plY3RXU0lDb21wbGlhbmNlcyAoIElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YWx1ZSkKLXsKLSAgICB0cnkgewotCQlwcm9qZWN0LnNldFBlcnNpc3RlbnRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gc3VjaCBQcm9qZWN0Iik7Ci0gICAgCUlMb2cgbG9nID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VMb2coKTsKLSAgICAJbG9nLmxvZyhJTG9nLklORk8sIDUwODQsIHRoaXMsICJ1cGRhdGVQcm9qZWN0V1NJQ29tcGxpYW5jZXMiLCAiTm8gc3VjaCBQcm9qZWN0ICIrcHJvamVjdCk7Ci0gICAgfQotfQotCi1wdWJsaWMgYm9vbGVhbiBwcm9qZWN0U3RvcE5vbldTSUNvbXBsaWFuY2VzKElQcm9qZWN0IHByb2plY3QpCi17Ci0gCXJldHVybiBTVE9QX05PTl9XU0kuZXF1YWxzKGdldFByb2plY3RQZXJzaXN0ZW50UHJvcGVydHkocHJvamVjdCkpOyAgICAKLX0KLQotcHVibGljIGJvb2xlYW4gcHJvamVjdFdhcm5Ob25XU0lDb21wbGlhbmNlcyhJUHJvamVjdCBwcm9qZWN0KQotewotIAlyZXR1cm4gV0FSTl9OT05fV1NJLmVxdWFscyhnZXRQcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5KHByb2plY3QpKTsgICAgCi19Ci0KLXB1YmxpYyBib29sZWFuIHByb2plY3RJZ25vcmVOb25XU0lDb21wbGlhbmNlcyhJUHJvamVjdCBwcm9qZWN0KQotewotIAlyZXR1cm4gSUdOT1JFX05PTl9XU0kuZXF1YWxzKGdldFByb2plY3RQZXJzaXN0ZW50UHJvcGVydHkocHJvamVjdCkpOyAgICAKLX0KLQotCi0vLyB0byBiZSB1c2VkIG9ubHkgYnkgdGhlIHByb3BlcnR5IHBhZ2UKLXB1YmxpYyBib29sZWFuIHByb2plY3RGb2xsb3dXU0lQcmVmZXJhbmNlKElQcm9qZWN0IHByb2plY3QpCi17Ci0gICAgdHJ5IHsKLSAJU3RyaW5nIHByb3BlcnR5ID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmFtZSk7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5LmVxdWFscygiIikgfHwgcHJvcGVydHkuZXF1YWxzKEZPTExPV19XU0lfUFJFRkVSRU5DRSkpOwotICAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgICAgIHsKLSAgICAJcmV0dXJuIHRydWU7Ci0gICAgIH0gICAgIAotfQotCi1wcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5KElQcm9qZWN0IHByb2plY3QpCi17Ci0JU3RyaW5nIHByb3BlcnR5ID0gZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UocHJvamVjdCk7Ci0JaWYgKHByb3BlcnR5LmVxdWFscyhGT0xMT1dfV1NJX1BSRUZFUkVOQ0UpKSB7Ci0JCXByb3BlcnR5ID0gZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKTsKLQl9Ci0JcmV0dXJuIHByb3BlcnR5OwotIH0KLQotcHVibGljIFN0cmluZyBnZXRQcm9qZWN0V1NJQ29tcGxpYW5jZShJUHJvamVjdCBwcm9qZWN0KQotewotICB0cnkgewotICAgICAJU3RyaW5nIHByb3BlcnR5ID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmFtZSk7Ci0gICAgIAlpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5lcXVhbHMoIiIpKQotICAgICAJewotICAgICAJCXByb3BlcnR5ID0gRk9MTE9XX1dTSV9QUkVGRVJFTkNFOwotICAgICAJfQotICAgICAJcmV0dXJuIHByb3BlcnR5OwotICAgICB9Ci0gICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpICAgICB7Ci0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gc3VjaCBQcm9qZWN0Iik7Ci0gICAgCXJldHVybiBnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpOwotICAgICB9ICAgICAKLX0KLQotcHVibGljIFN0cmluZyBnZXRXYXJuaW5nKCkKLXsKLQlyZXR1cm4gd3NpV2FybmluZ187Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKQotewotCXJldHVybiB3c2lFcnJvcl87Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lTU0JQQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRhN2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLldzdFdTUGx1Z2luTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50V1NJQ29udGV4dAotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fV1NJX1NTQlBfQ09NUExJQU5DRSA9ICJub25XU0lTU0JQQ29tcGxpYW5jZSI7Ci0KLXB1YmxpYyBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgKCkgCi17Ci0Jc3VwZXIoKTsKLQlub25fd3NpX2NvbXBsaWFuY2UgPSBOT05fV1NJX1NTQlBfQ09NUExJQU5DRTsKLQluYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoV1NQbHVnaW4uSUQgLCBub25fd3NpX2NvbXBsaWFuY2UpOwotCXdzaVdhcm5pbmdfID0gV3N0V1NQbHVnaW5NZXNzYWdlcy5XU0lfU1NCUF9XQVJOSU5HOwotCXdzaUVycm9yXyA9IFdzdFdTUGx1Z2luTWVzc2FnZXMuV1NJX1NTQlBfRVJST1I7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdhaXRGb3JXU0RMVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdhaXRGb3JXU0RMVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlZDIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXYWl0Rm9yV1NETFZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50V2FpdEZvcldTRExWYWxpZGF0aW9uQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0Ci17Ci0KLQlwcml2YXRlIFN0cmluZyB3YWl0X2Zvcl93c2RsX3ZhbGlkYXRpb24gPSAiV0FJVF9GT1JfV1NETF9WQUxJREFUSU9OIjsKLQotcHVibGljIFBlcnNpc3RlbnRXYWl0Rm9yV1NETFZhbGlkYXRpb25Db250ZXh0ICgpIAotewotCXN1cGVyKCAgV1NQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIGxvYWQoKSAKLXsKLQlzZXREZWZhdWx0KHdhaXRfZm9yX3dzZGxfdmFsaWRhdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8vIHRvIGJlIHVzZWQgb25seSBieSB0aGUgcHJlZmVyZW5jZSBwYWdlCi1wdWJsaWMgdm9pZCBzZXRXYWl0Rm9yV1NETFZhbGlkYXRpb24gKCBib29sZWFuIHZhbHVlKQotewotIAkJc2V0VmFsdWUoIHdhaXRfZm9yX3dzZGxfdmFsaWRhdGlvbiwgdmFsdWUpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBnZXRQZXJzaXN0ZW50V2FpdEZvcldTRExWYWxpZGF0aW9uICgpCi17Ci0JcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKHdhaXRfZm9yX3dzZGxfdmFsaWRhdGlvbik7Ci0KLX0KLQotcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdCgpCi17Ci0JcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKHdhaXRfZm9yX3dzZGxfdmFsaWRhdGlvbik7Ci19Ci0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvV1NJQ29tcGxpYW5jZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTcxMzgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJlZmVyZW5jZXMvV1NJQ29tcGxpYW5jZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuV3N0V1NQbHVnaW5NZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgV1NJQ29tcGxpYW5jZVV0aWxzCi17Ci0KLS8qKgotICogQHBhcmFtIHByb2plY3QKLSAqIEBwYXJhbSBjb250ZXh0Ci0gKiBAcmV0dXJuCi0gKi8KLXB1YmxpYyBzdGF0aWMgaW50IGdldFdTSVNldmVyaXR5IChJUHJvamVjdCBwcm9qZWN0LCBQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KQotewotCWlmIChjb250ZXh0LnByb2plY3RTdG9wTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0JCXJldHVybiBTdGF0dXMuRVJST1I7Ci0JZWxzZSBpZiAoY29udGV4dC5wcm9qZWN0V2Fybk5vbldTSUNvbXBsaWFuY2VzKHByb2plY3QpKQotCQlyZXR1cm4gU3RhdHVzLldBUk5JTkc7Ci0JZWxzZQotCQlyZXR1cm4gU3RhdHVzLklORk87Ci19Ci0KLS8qKgotICogQHBhcmFtIG1vbml0b3IgSVN0YXR1c0hhbmRsZXIKLSAqIEBwYXJhbSBzdGF0dXMgU3RhdHVzW10KLSAqIEBwYXJhbSBwcm9qZWN0IElQcm9qZWN0Ci0gKiBAcGFyYW0gY29udGV4dCBQZXJzaXN0ZW50V1NJQ29udGV4dAotICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdG8gY29udGludWUKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrV1NJQ29tcGxpYW5jZSAoIElTdGF0dXNIYW5kbGVyIG1vbml0b3IsIFN0YXR1c1tdIHN0YXR1cywgSVByb2plY3QgcHJvamVjdCwgUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkKLXsKLSAgCWlmIChjb250ZXh0LnByb2plY3RTdG9wTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0gIAkJewotICAgICAgCi0gIAkJCS8vIGVtaXQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIGZhbHNlCi0gIAkJCUlTdGF0dXMgc3RhdHVzXyA9IFN0YXR1c1V0aWxzLm11bHRpU3RhdHVzKCBjb250ZXh0LmdldEVycm9yKCksIHN0YXR1cyApOwotCQkJbW9uaXRvci5yZXBvcnRFcnJvcihzdGF0dXNfKTsKLSAgCQkJcmV0dXJuIGZhbHNlOwotICAJCX0KLSAgCWVsc2UgaWYgKGNvbnRleHQucHJvamVjdFdhcm5Ob25XU0lDb21wbGlhbmNlcyhwcm9qZWN0KSkKLSAgCQl7Ci0gIAkJCS8vIGdpdmUgYSB3YXJuaW5nIG1lc3NhZ2Ugd2l0aCB0aGUgb3B0aW9ucyB0byBzdG9wLCBpZ25vcmUgdGhpcyBvbmUsIG9yIGlnbm9yZSBhbGwgY29taW5nIG1lc3NhZ2VzCi0gIAkJCUlTdGF0dXMgc3RhdHVzXyA9IFN0YXR1c1V0aWxzLm11bHRpU3RhdHVzKCBjb250ZXh0LmdldFdhcm5pbmcoKSwgc3RhdHVzKTsKLQotICAJCQlDaG9pY2UgaWdub3JlQ2hvaWNlID0gbmV3IENob2ljZSgnSScsIFdzdFdTUGx1Z2luTWVzc2FnZXMuSUdOT1JFX0xBQkVMLCBXc3RXU1BsdWdpbk1lc3NhZ2VzLklHTk9SRV9ERVNDUklQVElPTik7Ci0gIAkJCUNob2ljZSBpZ25vcmVBbGxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdBJywgV3N0V1NQbHVnaW5NZXNzYWdlcy5JR05PUkVfQUxMX0xBQkVMLCBXc3RXU1BsdWdpbk1lc3NhZ2VzLklHTk9SRV9BTExfREVTQ1JJUFRJT04pOwotICAJCQlDaG9pY2UgY2FuY2VsQ2hvaWNlID0gbmV3IENob2ljZSgnQycsIFdzdFdTUGx1Z2luTWVzc2FnZXMuQ0FOQ0VMX0xBQkVMLCBXc3RXU1BsdWdpbk1lc3NhZ2VzLkNBTkNFTF9ERVNDUklQVElPTik7Ci0gIAkJCUNob2ljZSByZXN1bHQgPSBtb25pdG9yLnJlcG9ydChzdGF0dXNfLCBuZXcgQ2hvaWNlW117aWdub3JlQ2hvaWNlLCBpZ25vcmVBbGxDaG9pY2UsIGNhbmNlbENob2ljZX0pOwotICAJCQkKLSAgCQkJLy8gaWYgdGhlIHVzZXIgY2xvc2VzIHRoZSBtZXNzYWdlIGJveCBvciBzZWxlY3RzIGlnbm9yZSBjb250aW51ZQotICAJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhpZ25vcmVDaG9pY2UuZ2V0TGFiZWwoKSkpKQotICAgICAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQkJLy8gaWYgdGhlIHVzZXIgc2VsZWN0cyBpZ25vcmUgYWxsLCBjaGFuZ2UgdGhlIHByZWZlcmVuY2UKLQkgICAgICAgIGVsc2UgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoaWdub3JlQWxsQ2hvaWNlLmdldExhYmVsKCkpKQotCSAgICAgICAgCXsKLQkgICAgICAgIAkJY29udGV4dC51cGRhdGVQcm9qZWN0V1NJQ29tcGxpYW5jZXMocHJvamVjdCwgUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotCSAgICAgICAgCQlyZXR1cm4gdHJ1ZTsKLQkgICAgICAgIAl9Ci0JCQkvLyBpZiB0aGUgdXNlciBzZWxlY3RzIHRvIGNhbmNlbCAsIGRvIG5vdCBjb250aW51ZSB3aXRoIHRoZSBjb21tYW5kCi0gICAgICAgIAllbHNlIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoY2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotICAJCX0KLSAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9HZW5lcmljUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3JlZ2lzdHJ5L0dlbmVyaWNSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzNmQwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3JlZ2lzdHJ5L0dlbmVyaWNSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiBQYXR0ZXJuZWQgYWZ0ZXIgdGhlIFJlc291cmNlRmFjdG9yeSBjbGFzc2VzIGdlbmVyYXRlZAotICogYnkgdGhlIEVNRiB0b29scywgdGhpcyBnZW5lcmljIGZhY3RvcnkgaGFuZGxlcyBjcmVhdGlvbgotICogb2YgRU1GIHJlc291cmNlcyBmb3IgWE1MIGRvY3VtZW50cyBpbiBnZW5lcmFsLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Jlc291cmNlRmFjdG9yeSBleHRlbmRzIFhNTFJlc291cmNlRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBIb2xkcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5FeHRlbmRlZE1ldGFEYXRhPC9jb2RlPgotCSAqIGZvciBhc3NvY2lhdGluZyBleHRlbmRlZCBtZXRhZGF0YSB3aXRoIHRoZQotCSAqIDxjb2RlPlJlc291cmNlPC9jb2RlPiByZXR1cm5lZCBieSA8Y29kZT5jcmVhdGVSZXNvdXJjZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkTWV0YURhdGEgZXh0ZW5kZWRNZXRhRGF0YTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+R2VuZXJpY1Jlc291cmNlRmFjdG9yeTwvY29kZT4uCi0JICovCi0JcHVibGljIEdlbmVyaWNSZXNvdXJjZUZhY3RvcnkoKQotCXsKLQkJc3VwZXIoKTsKLQkJZXh0ZW5kZWRNZXRhRGF0YSA9IEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlJEZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkKLQl7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBYTUxSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBleHRlbmRlZE1ldGFEYXRhKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBleHRlbmRlZE1ldGFEYXRhKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9JUmVnaXN0cnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3JlZ2lzdHJ5L0lSZWdpc3RyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiNzkwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3JlZ2lzdHJ5L0lSZWdpc3RyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwOTA2ICAgMTQxNzk2IGdpbGJlcnRhQGNhLmlibS5jb20gLSBHaWxiZXJ0IEFuZHJld3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci0KLS8qKgotICogQW4gSVJlZ2lzdHJ5TWFuYWdlciBtYW5hZ2VzIGEgZmFtaWx5IG9mIDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPgotICogYW5kIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbHMgcGVyc2lzdGVkIHdpdGhpbiBzb21lCi0gKiBhZGRyZXNzYWJsZSBsb2NhdGlvbiBzdWNoIGFzIHVuZGVyIGEgZGlyZWN0b3J5IGluIHRoZQotICogZmlsZXN5c3RlbSBvciB1bmRlciBhIGZvbGRlciBpbiB0aGUgRWNsaXBzZSB3b3Jrc3BhY2UsCi0gKiBhbmQgcmVmZXJlbmNlZCBmcm9tIGFuIGluZGV4IGRvY3VtZW50IGF0IHRoZSBzYW1lIGxvY2F0aW9uLiAKLSAqIDxwPgotICogQ2FsbCA8Y29kZT5SZWdpc3RlcnlTZXJ2aWNlLmdldERlZmF1bHRSZWdpc3RyeU1hbmFnZXIoKTwvY29kZT4KLSAqIG9yIDxjb2RlPlJlZ2lzdGVyeVNlcnZpY2UuZ2V0UmVnaXN0cnlNYW5hZ2VyKFVSTCk8L2NvZGU+IHRvCi0gKiBnZXQgYSBuZXcgSVJlZ2lzdHJ5TWFuYWdlci4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuUmVnaXN0cnlTZXJ2aWNlI2luc3RhbmNlKCkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215Ci0gKiBAYXV0aG9yIGNicmVhbGV5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZ2lzdHJ5TWFuYWdlcgotewotCS8qKgotCSAqIEEgY29uc3RhbnQgZm9yIHVzZSBpbiB0aGUgPGNvZGU+cmVtb3ZlUmVnaXN0cnkoLi4uKTwvY29kZT4KLQkgKiBhbmQgPGNvZGU+cmVtb3ZlVGF4b25vbXkoLi4uKTwvY29kZT4gbWV0aG9kcyB0aGF0IHdpbGwKLQkgKiBjYXVzZSB0aGUgZ2l2ZW4gcmVnaXN0cnkgb3IgdGF4b25vbXkgZG9jdW1lbnQgdG8gYmUgcmVtb3ZlZAotCSAqIGZyb20gdGhlIGluZGV4LCBidXQgbm90IGRlbGV0ZWQuCi0JICogCi0JICogQHNlZSAjcmVtb3ZlUmVnaXN0cnkoU3RyaW5nLCBib29sZWFuKQotCSAqIEBzZWUgI3JlbW92ZVRheG9ub215KFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBLRUVQX0RPQ1VNRU5UID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IGZvciB1c2UgaW4gdGhlIDxjb2RlPnJlbW92ZVJlZ2lzdHJ5KC4uLik8L2NvZGU+Ci0JICogYW5kIDxjb2RlPnJlbW92ZVRheG9ub215KC4uLik8L2NvZGU+IG1ldGhvZHMgdGhhdCB3aWxsCi0JICogY2F1c2UgdGhlIGdpdmVuIHJlZ2lzdHJ5IG9yIHRheG9ub215IGRvY3VtZW50IHRvIGJlIHJlbW92ZWQKLQkgKiBmcm9tIHRoZSBpbmRleCBhbmQgZGVsZXRlZC4KLQkgKiAKLQkgKiBAc2VlICNyZW1vdmVSZWdpc3RyeShTdHJpbmcsIGJvb2xlYW4pCi0JICogQHNlZSAjcmVtb3ZlVGF4b25vbXkoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBib29sZWFuIERFTEVURV9ET0NVTUVOVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhlIFhNTCBpbmRleCBkb2N1bWVudCB0aGF0IHJlZmVyZW5jZXMKLQkgKiB0aGUgWE1MIHJlZ2lzdHJ5IGFuZCB0YXhvbm9teSBtb2RlbHMgbWFuYWdlZCBieSB0aGlzCi0JICogUmVnaXN0cnkgTWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBVUkwgb2YgdGhlIG1hbmFnaW5nIGRvY3VtZW50LgotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIElmIGEgVVJMIHRvIHRoZSBtYW5hZ2luZwotCSAqIGRvY3VtZW50IGNhbm5vdCBiZSBkZXRlcm1pbmVkIG9yIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwgKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFkZHMgYW4gPGNvZGU+SVRheG9ub215RmluZGVyPC9jb2RlPiB0aGF0IHRoZQotCSAqIDxjb2RlPklSZWdpc3RyeU1hbmFnZXI8L2NvZGU+IGNhbiB1c2UgdG8gZmluZAotCSAqIHRoZSBzZXQgb2YgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscyB1c2VkCi0JICogYnkgYSBnaXZlbiA8Y29kZT5SZWdpc3RyeTwvY29kZT4gbW9kZWwuCi0JICogPGNvZGU+SVJlZ2lzdHJ5TWFuYWdlci5zYXZlKHJlZ2lzdHJ5KTwvY29kZT4gbmVlZHMgaGVscCBmaW5kaW5nCi0JICogdGhlIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbHMgdXNlZCBieSBhIDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPiwKLQkgKiBpZiBhbnkuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgY29uY3JldGUgPGNvZGU+UmVnaXN0cnk8Y29kZT4KLQkgKiBjbGFzcyBmb3Igd2hpY2ggdGhlIDxjb2RlPklUYXhvbm9teUZpbmRlcjwvY29kZT4gaXMgYmVpbmcgYWRkZWQuCi0JICogQHBhcmFtIHRheG9ub215RmluZGVyIEFuIDxjb2RlPklUYXhvbm9teUZpbmRlcjwvY29kZT4gdGhhdCBrbm93cwotCSAqIGhvdyB0byBkZXRlcm1pbmUgdGhlIHNldCBvZiA8Y29kZT5UYXhvbm9teTwvY29kZT4gbW9kZWxzIGEgZ2l2ZW4KLQkgKiBjb25jcmV0ZSA8Y29kZT5SZWdpc3RyeTwvY29kZT4gbW9kZWwgaXMgdXNpbmcuCi0JICogQHNlZSBJVGF4b25vbXlGaW5kZXIKLQkgKiBAc2VlICNzYXZlUmVnaXN0cnkoUmVnaXN0cnkpCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGF4b25vbXlGaW5kZXIgKCBTdHJpbmcgY2xhc3NOYW1lLCBJVGF4b25vbXlGaW5kZXIgdGF4b25vbXlGaW5kZXIgKTsKLQotICAgIC8qKgotICAgICAqIERlc3Ryb3lzIHRoZSBpbmRleCBvZiByZWdpc3RyaWVzIGFuZCB0YXhvbm9taWVzIGluIG1lbW9yeS4KLSAgICAgKiBTdWJzZXF1ZW50IGNhbGxzIHRvIDxjb2RlPmdldEluZGV4KCk8L2NvZGU+IGFuZCBvdGhlciBtZXRob2RzCi0gICAgICogb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBjYXVzZSB0aGUgaW5kZXggdG8gYmUgcmVsb2FkZWQuCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhbnl0aW1lIHRoZSBjYWxsZXIgc3VzcGVjdHMgdGhlCi0gICAgICogcGVyc2lzdGVudCBpbmRleCBoYXMgY2hhbmdlZCBhbmQgd2lzaGVzIHRvIGxvYWQgdGhlIGNoYW5nZXMKLSAgICAgKiBpbnRvIHRoZSBjdXJyZW50IDxjb2RlPklSZWdpc3RyeU1hbmFnZXI8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hNYW5hZ2VyICgpOwotCi0JLyoqCi0JICogU2F2ZXMgYSA8Y29kZT5UYXhvbm9teTwvY29kZT4gbW9kZWwgdG8gYW4gWE1MIGRvY3VtZW50Ci0JICogbG9jYXRlZCByZWxhdGl2ZSB0byB0aGUgaW5kZXggWE1MIGRvY3VtZW50IGFzIGlkZW50aWZpZWQgYnkKLQkgKiA8Y29kZT5nZXRVUkwoKTwvY29kZT4sIGFuZCB1cGRhdGVzIHRoZSBpbmRleCBYTUwgZG9jdW1lbnQKLQkgKiB3aXRoIHJlZmVyZW5jZXMgdG8gdGhlIHNhdmVkIHRheG9ub215IGRvY3VtZW50LgotCSAqIFRoZSByZWxhdGl2ZSBwYXRobmFtZSB0byB0aGUgdGF4b25vbXkgWE1MIGRvY3VtZW50IGlzCi0JICogY29tcHV0ZWQgYnkgdGhlIDxjb2RlPklSZWdpc3RyeU1hbmFnZXI8L2NvZGU+IGFuZCBjYW5ub3QKLQkgKiBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBjYWxsZXIuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSA8Y29kZT5SZWdpc3RyeTwvY29kZT4gbW9kZWwgKGFuZAotCSAqIHJlZmVyZW5jZWQgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscykgdG8gc2F2ZS4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+UmVnaXN0cnk8L2NvZGU+IHJlZmVyZW5jZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhlIG9wZXJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwKLQkgKiBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIG1hbGZvcm1lZCBsb2NhdGlvbiBVUklzIGluIHRoZQotCSAqIGluZGV4IG9yIGdlbmVyYWwgaW5wdXQvb3V0cHV0IGVycm9yIGNvbmRpdGlvbnMuCi0JICogQHNlZSBSZWdpc3RyeQotCSAqIEBzZWUgI2FkZFRheG9ub215RmluZGVyKFN0cmluZywgSVRheG9ub215RmluZGVyKQotCSAqLwotCXB1YmxpYyBSZWdpc3RyeSBzYXZlUmVnaXN0cnkgKCBSZWdpc3RyeSByZWdpc3RyeSApIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTG9hZHMgYXMgbmVjZXNzYXJ5IGFuZCByZXR1cm5zIGEgZnVsbCA8Y29kZT5SZWdpc3RyeTwvY29kZT4KLQkgKiBtb2RlbCBhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBVUkkgYW5kIHJlZmVyZW5jZWQgZnJvbQotCSAqIHRoZSBpbmRleCBYTUwgZG9jdW1lbnQgbG9jYXRlZCBhdCA8Y29kZT5nZXRVUkwoKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIGlkZW50aWZpZXIgb2YgdGhlIHJlZ2lzdHJ5LgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPiBtb2RlbAotCSAqIG9yIG51bGwgaWYgbm8gc3VjaCBtb2RlbCBjYW4gYmUgZm91bmQuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIElmIHRoZSBvcGVyYXRpb24gZmFpbHMgZm9yIGFueSByZWFzb24sCi0JICogaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBtYWxmb3JtZWQgbG9jYXRpb24gVVJJcyBpbiB0aGUKLQkgKiBpbmRleCBvciBnZW5lcmFsIGlucHV0L291dHB1dCBlcnJvciBjb25kaXRpb25zLgotCSAqIEBzZWUgUmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnkgbG9hZFJlZ2lzdHJ5ICggU3RyaW5nIHVyaSApIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTG9hZHMgYXMgbmVjZXNzYXJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGZ1bGwgPGNvZGU+UmVnaXN0cnk8L2NvZGU+Ci0JICogbW9kZWxzIGFzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIFVSSXMgYW5kIHJlZmVyZW5jZWQgZnJvbQotCSAqIHRoZSBpbmRleCBYTUwgZG9jdW1lbnQgbG9jYXRlZCBhdCA8Y29kZT5nZXRVUkwoKTwvY29kZT4uCi0JICogVXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggPGNvZGU+Z2V0UmVnaXN0cnlVUklzKCk8L2NvZGU+LgotCSAqIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBhcnJheSBtYXkgYmUgbGVzcyB0aGFuCi0JICogdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgb2YgVVJJcyBpbiBjYXNlcyB3aGVyZSBvbmUgb3IgbW9yZQotCSAqIFVSSXMgZmFpbCB0byByZXNvbHZlIHRvIGEgbG9hZGFibGUgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIHVyaXMgVGhlIFVSSSBpZGVudGlmaWVycyBvZiB0aGUgcmVnaXN0cmllcy4KLQkgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiA8Y29kZT5SZWdpc3RyeTwvY29kZT4gbW9kZWxzLAotCSAqIG5ldmVyIG51bGwsIGJ1dCBwb3NzaWJseSBlbXB0eS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhlIG9wZXJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwKLQkgKiBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIG1hbGZvcm1lZCBsb2NhdGlvbiBVUklzIGluIHRoZQotCSAqIGluZGV4IG9yIGdlbmVyYWwgaW5wdXQvb3V0cHV0IGVycm9yIGNvbmRpdGlvbnMuCi0JICogQHNlZSBSZWdpc3RyeQotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVtdIGxvYWRSZWdpc3RyaWVzICggU3RyaW5nW10gdXJpcyApIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBVUkkgaWRlbnRpZmllcnMgdG8gPGNvZGU+UmVnaXN0cnk8L2NvZGU+Ci0JICogbW9kZWxzIGluIHRoZSBpbmRleCBtYW5hZ2VkIGJ5IHRoaXMgPGNvZGU+SVJlZ2lzdHJ5TWFuYWdlcjwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBVUkkgaWRlbnRpZmllcnMsIHBvc3NpYmx5IGVtcHR5IGJ1dCBuZXZlciBudWxsLAotCSAqIHRvIHJlZ2lzdGVyZWQgPGNvZGU+UmVnaXN0cnk8L2NvZGU+IG1vZGVscy4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhlIG9wZXJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwKLQkgKiBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIG1hbGZvcm1lZCBsb2NhdGlvbiBVUklzIGluIHRoZQotCSAqIGluZGV4IG9yIGdlbmVyYWwgaW5wdXQvb3V0cHV0IGVycm9yIGNvbmRpdGlvbnMuCi0JICogQHNlZSBSZWdpc3RyeQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSZWdpc3RyeVVSSXMgKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSA8Y29kZT5SZWdpc3RyeTwvY29kZT4gbW9kZWwgaWRlbnRpZmllZCBieSB0aGUKLQkgKiBnaXZlbiA8Y29kZT51cmk8L2NvZGU+IGZyb20gdGhlIGluZGV4IGFuZCBlaXRoZXIga2VlcHMgb3IKLQkgKiBkZWxldGVzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPiBkb2N1bWVudAotCSAqIGJhc2VkIG9uIHRoZSB2YWx1ZSBnaXZlbiBmb3IgPGNvZGU+ZGVsZXRlRG9jdW1lbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgVGhlIFVSSSBpZGVudGlmaWVyIG9mIHRoZSBtb2RlbCB0byBkZWxldGUuCi0JICogQHBhcmFtIGRlbGV0ZURvY3VtZW50IEVpdGhlciA8Y29kZT5LRUVQX0RPQ1VNRU5UPC9jb2RlPgotCSAqIG9yIDxjb2RlPkRFTEVURV9ET0NVTUVOVDwvY29kZT4gZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCi0JICogbW9kZWwgZG9jdW1lbnQgc2hvdWxkIGJlIGtlcHQgb3IgZGVsZXRlZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhlIG9wZXJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwKLQkgKiBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIG1hbGZvcm1lZCBsb2NhdGlvbiBVUklzIGluIHRoZQotCSAqIGluZGV4IG9yIGdlbmVyYWwgaW5wdXQvb3V0cHV0IGVycm9yIGNvbmRpdGlvbnMuCi0JICogQHNlZSBSZWdpc3RyeQotCSAqIEBzZWUgI0tFRVBfRE9DVU1FTlQKLQkgKiBAc2VlICNERUxFVEVfRE9DVU1FTlQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWdpc3RyeSAoIFN0cmluZyB1cmksIGJvb2xlYW4gZGVsZXRlRG9jdW1lbnQgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmVzIGEgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVsIHRvIGFuIFhNTCBkb2N1bWVudAotCSAqIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlIGluZGV4IFhNTCBkb2N1bWVudCBhcyBpZGVudGlmaWVkIGJ5Ci0JICogPGNvZGU+Z2V0VVJMKCk8L2NvZGU+LCBhbmQgdXBkYXRlcyB0aGUgaW5kZXggWE1MIGRvY3VtZW50Ci0JICogd2l0aCByZWZlcmVuY2VzIHRvIHRoZSBzYXZlZCB0YXhvbm9teSBkb2N1bWVudC4KLQkgKiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgdG8gdGhlIHRheG9ub215IFhNTCBkb2N1bWVudCBpcwotCSAqIGNvbXB1dGVkIGJ5IHRoZSA8Y29kZT5JUmVnaXN0cnlNYW5hZ2VyPC9jb2RlPiBhbmQgY2Fubm90Ci0JICogYmUgaW5mbHVlbmNlZCBieSB0aGUgY2FsbGVyLgotCSAqIAotCSAqIEBwYXJhbSB0YXhvbm9teSBUaGUgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVsIHRvIHNhdmUuCi0JICogQHJldHVybiBBIDxjb2RlPlRheG9ub215PC9jb2RlPiByZWZlcmVuY2UuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIElmIHRoZSBvcGVyYXRpb24gZmFpbHMgZm9yIGFueSByZWFzb24sCi0JICogaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBtYWxmb3JtZWQgbG9jYXRpb24gVVJJcyBpbiB0aGUKLQkgKiBpbmRleCBvciBnZW5lcmFsIGlucHV0L291dHB1dCBlcnJvciBjb25kaXRpb25zLgotCSAqIEBzZWUgVGF4b25vbXkKLQkgKi8KLQlwdWJsaWMgVGF4b25vbXkgc2F2ZVRheG9ub215ICggVGF4b25vbXkgdGF4b25vbXkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIExvYWRzIGFzIG5lY2Vzc2FyeSBhbmQgcmV0dXJucyBhIGZ1bGwgPGNvZGU+VGF4b25vbXk8L2NvZGU+Ci0JICogbW9kZWwgYXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gVVJJIGFuZCByZWZlcmVuY2VkIGZyb20KLQkgKiB0aGUgaW5kZXggWE1MIGRvY3VtZW50IGxvY2F0ZWQgYXQgPGNvZGU+Z2V0VVJMKCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgVGhlIFVSSSBpZGVudGlmaWVyIG9mIHRoZSB0YXhvbm9teS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5UYXhvbm9teTwvY29kZT4gbW9kZWwKLQkgKiBvciBudWxsIGlmIG5vIHN1Y2ggbW9kZWwgY2FuIGJlIGZvdW5kLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLAotCSAqIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gbWFsZm9ybWVkIGxvY2F0aW9uIFVSSXMgaW4gdGhlCi0JICogaW5kZXggb3IgZ2VuZXJhbCBpbnB1dC9vdXRwdXQgZXJyb3IgY29uZGl0aW9ucy4KLQkgKiBAc2VlIFRheG9ub215Ci0JICovCi0JcHVibGljIFRheG9ub215IGxvYWRUYXhvbm9teSAoIFN0cmluZyB1cmkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIExvYWRzIGFzIG5lY2Vzc2FyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBmdWxsIDxjb2RlPlRheG9ub215PC9jb2RlPgotCSAqIG1vZGVscyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBVUklzIGFuZCByZWZlcmVuY2VkIGZyb20KLQkgKiB0aGUgaW5kZXggWE1MIGRvY3VtZW50IGxvY2F0ZWQgYXQgPGNvZGU+Z2V0VVJMKCk8L2NvZGU+LgotCSAqIFVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIDxjb2RlPmdldFRheG9ub215VVJJcygpPC9jb2RlPi4KLQkgKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgbWF5IGJlIGxlc3MgdGhhbgotCSAqIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IG9mIFVSSXMgaW4gY2FzZXMgd2hlcmUgb25lIG9yIG1vcmUKLQkgKiBVUklzIGZhaWwgdG8gcmVzb2x2ZSB0byBhIGxvYWRhYmxlIG1vZGVsLiAKLQkgKiAKLQkgKiBAcGFyYW0gdXJpcyBUaGUgVVJJIGlkZW50aWZpZXJzIG9mIHRoZSB0YXhvbm9taWVzLgotCSAqIEByZXR1cm4gVGhlIGFycmF5IG9mIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbHMsCi0JICogbmV2ZXIgbnVsbCwgYnV0IHBvc3NpYmx5IGVtcHR5LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLAotCSAqIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gbWFsZm9ybWVkIGxvY2F0aW9uIFVSSXMgaW4gdGhlCi0JICogaW5kZXggb3IgZ2VuZXJhbCBpbnB1dC9vdXRwdXQgZXJyb3IgY29uZGl0aW9ucy4KLQkgKiBAc2VlIFJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIFRheG9ub215W10gbG9hZFRheG9ub21pZXMgKCBTdHJpbmdbXSB1cmlzICkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFVSSSBpZGVudGlmaWVycyB0byA8Y29kZT5UYXhvbm9teTwvY29kZT4KLQkgKiBtb2RlbHMgaW4gdGhlIGluZGV4IG1hbmFnZWQgYnkgdGhpcyA8Y29kZT5JUmVnaXN0cnlNYW5hZ2VyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFVSSSBpZGVudGlmaWVycywgcG9zc2libHkgZW1wdHkgYnV0IG5ldmVyIG51bGwsCi0JICogdG8gcmVnaXN0ZXJlZCA8Y29kZT5UYXhvbm9teTwvY29kZT4gbW9kZWxzLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLAotCSAqIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gbWFsZm9ybWVkIGxvY2F0aW9uIFVSSXMgaW4gdGhlCi0JICogaW5kZXggb3IgZ2VuZXJhbCBpbnB1dC9vdXRwdXQgZXJyb3IgY29uZGl0aW9ucy4KLQkgKiBAc2VlIFRheG9ub215Ci0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFRheG9ub215VVJJcyAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbCBpZGVudGlmaWVkIGJ5IHRoZQotCSAqIGdpdmVuIDxjb2RlPnVyaTwvY29kZT4gZnJvbSB0aGUgaW5kZXggYW5kIGVpdGhlciBrZWVwcyBvcgotCSAqIGRlbGV0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+VGF4b25vbXk8L2NvZGU+IGRvY3VtZW50Ci0JICogYmFzZWQgb24gdGhlIHZhbHVlIGdpdmVuIGZvciA8Y29kZT5kZWxldGVEb2N1bWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIGlkZW50aWZpZXIgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS4KLQkgKiBAcGFyYW0gZGVsZXRlRG9jdW1lbnQgRWl0aGVyIDxjb2RlPktFRVBfRE9DVU1FTlQ8L2NvZGU+Ci0JICogb3IgPGNvZGU+REVMRVRFX0RPQ1VNRU5UPC9jb2RlPiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKLQkgKiBtb2RlbCBkb2N1bWVudCBzaG91bGQgYmUga2VwdCBvciBkZWxldGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLAotCSAqIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gbWFsZm9ybWVkIGxvY2F0aW9uIFVSSXMgaW4gdGhlCi0JICogaW5kZXggb3IgZ2VuZXJhbCBpbnB1dC9vdXRwdXQgZXJyb3IgY29uZGl0aW9ucy4KLQkgKiBAc2VlIFRheG9ub215Ci0JICogQHNlZSAjS0VFUF9ET0NVTUVOVAotCSAqIEBzZWUgI0RFTEVURV9ET0NVTUVOVAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRheG9ub215ICggU3RyaW5nIHVyaSwgYm9vbGVhbiBkZWxldGVEb2N1bWVudCApIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9JVGF4b25vbXlGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcmVnaXN0cnkvSVRheG9ub215RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OGZjYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9JVGF4b25vbXlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci0KLS8qKgotICogQW4gPGNvZGU+SVRheG9ub215RmluZGVyPC9jb2RlPiBjb21wdXRlcyB0aGUgc2V0IG9mCi0gKiA8Y29kZT5UYXhvbm9teTwvY29kZT4gbW9kZWxzIHJlZmVyZW5jZWQgb3IgdXNlZCBieSBhCi0gKiA8Y29kZT5SZWdpc3RyeTwvY29kZT4uCi0gKiBAYXV0aG9yIGdpbGJlcnRhQGNhLmlibS5jb20KLSAqIEBzZWUgSVJlZ2lzdHJ5TWFuYWdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYXhvbm9teUZpbmRlcgotewotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgdGF4b25vbWllcyB1c2VkIGJ5IHRoZSBnaXZlbgotCSAqIDxjb2RlPnJlZ2lzdHJ5PC9jb2RlPi4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotCSAqCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSA8Y29kZT5SZWdpc3RyeTwvY29kZT4gZm9yIHdoaWNoCi0JICogYSBzZXQgb2YgdGF4b25vbWllcyBtaWdodCBiZSBmb3VuZC4KLQkgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiB0YXhvbm9taWVzLCBwb3NzaWJseSBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgVGF4b25vbXlbXSB0YXhvbm9taWVzICggUmVnaXN0cnkgcmVnaXN0cnkgKTsJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9SZWdpc3RyeU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4M2NjZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9SZWdpc3RyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTE3ICAgMTMxNTgyIG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbgotICogMjAwNjA5MDYgICAxNDE3OTYgZ2lsYmVydGFAY2EuaWJtLmNvbSAtIEdpbGJlcnQgQW5kcmV3cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LlJUSW5kZXhGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVJlZ2lzdHJ5TWFuYWdlcjwvY29kZT4uCi0gKiBAYXV0aG9yIGNicmVhbGV5Ci0gKiBAc2VlIElSZWdpc3RyeU1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lzdHJ5TWFuYWdlciBpbXBsZW1lbnRzIElSZWdpc3RyeU1hbmFnZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVHSVNUUlkgPSAiUmVnaXN0cnkiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQVhPTk9NWSA9ICJUYXhvbm9teSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTCA9ICJ4bWwiOwotCXByaXZhdGUgSGFzaHRhYmxlIHRheG9ub215RmluZGVyc187Ci0JcHJpdmF0ZSBJbmRleCBpbmRleF87Ci0JcHJpdmF0ZSBHZW5lcmljUmVzb3VyY2VGYWN0b3J5IHJlc291cmNlRmFjdG9yeV8gPSBuZXcgR2VuZXJpY1Jlc291cmNlRmFjdG9yeSgpOwotCXByaXZhdGUgVVJMIHJlZ2lzdHJ5VVJMXz0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyByZWdpc3RyeVBhdGhuYW1lXyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlZ2lzdHJ5TWFuYWdlciBmb3IgdGhlIGluZGV4IFhNTCBmaWxlCi0JICogYXQgdGhlIGdpdmVuIDxjb2RlPnVybDwvY29kZT4uCi0JICogQHBhcmFtIHVybCBUaGUgVVJMIHRvIHRoZSBpbmRleCBYTUwgZmlsZS4KLQkgKi8KLQlSZWdpc3RyeU1hbmFnZXIgKCBVUkwgdXJsICkKLQl7Ci0JCXJlZ2lzdHJ5VVJMXyA9IHVybDsKLQkJdGF4b25vbXlGaW5kZXJzXyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlZ2lzdHJ5TWFuYWdlciBmb3IgdGhlIGluZGV4IFhNTCBmaWxlCi0JICogYXQgdGhlIGdpdmVuIDxjb2RlPnBhdGhuYW1lPC9jb2RlPi4KLQkgKiBAcGFyYW0gcGF0aG5hbWUgVGhlIHBhdGhuYW1lIHRvIHRoZSBpbmRleCBYTUwgZmlsZS4KLQkgKi8KLQlSZWdpc3RyeU1hbmFnZXIgKCBTdHJpbmcgcGF0aG5hbWUgKQotCXsKLQkJcmVnaXN0cnlQYXRobmFtZV8gPSBwYXRobmFtZTsKLQkJdGF4b25vbXlGaW5kZXJzXyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlciNnZXRVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMICgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQl7Ci0JCWlmIChyZWdpc3RyeVVSTF8gPT0gbnVsbCkKLQkJewotCQkJcmVnaXN0cnlVUkxfID0gbmV3IEZpbGUocmVnaXN0cnlQYXRobmFtZV8pLnRvVVJMKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJ5VVJMXzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFic29sdXRlIFVSTCBjb21wdXRlZCBmcm9tIHRoZSBhYnNvbHV0ZSBVUkwgb2YgdGhlCi0JICogaW5kZXggWE1MIGRvY3VtZW50IG1hbmFnZWQgYnkgdGhpcyA8Y29kZT5SZWdpc3RyeU1hbmFnZXI8L2NvZGU+Ci0JICogYW5kIHRoZSBnaXZlbiA8Y29kZT5pZDwvY29kZT4uIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCi0JICogYSByZWFzb25hYmxlIGxvY2F0aW9uIFVSTCBmb3IgcmVnaXN0cnkgYW5kIHRheG9ub215IGRvY3VtZW50cwotCSAqIHdoZW4gcmVmZXJlbmNlcyB0byB0aGVtIGFyZSBmaXJzdCB0byBiZSBhZGRlZCB0byB0aGUgaW5kZXggWE1MCi0JICogZG9jdW1lbnQuIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQgaW5zb2ZhciBhcyBpdCB3aWxsIGFsd2F5cwotCSAqIGNvbXB1dGUgdGhlIHNhbWUgVVJMIGZvciBhIGdpdmVuIDxjb2RlPlJlZ2lzdHJ5TWFuYWdlcjwvY29kZT4KLQkgKiBhbmQgYSBnaXZlbiA8Y29kZT5pZDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgcmVmZXJlbmNlZCByZWdpc3RyeSBvciB0YXhvbm9teSBkb2N1bWVudC4gCi0JICogQHJldHVybiBUaGUgYWJzb2x1dGUgVVJMIHRvIHRoZSByZWZlcmVuY2VkIGRvY3VtZW50LgotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIElmIGEgdmlhYmxlIGFic29sdXRlIFVSTCBjYW5ub3QKLQkgKiBiZSBjb21wdXRlZC4KLQkgKi8KLQlwcml2YXRlIFVSTCBnZXRVUkwgKCBTdHJpbmcgaWQgKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgYmFzZVVybCA9ICIiOyAKLQkJVVJMIGluZGV4VXJsID0gZ2V0VVJMKCk7Ci0JCVN0cmluZyBpbmRleFN0cmluZyA9IGluZGV4VXJsLnRvU3RyaW5nKCk7Ci0JCWludCBpbmRleCA9IGluZGV4U3RyaW5nLmxhc3RJbmRleE9mKCIvIik7IAotCQliYXNlVXJsID0gaW5kZXhTdHJpbmcuc3Vic3RyaW5nKDAsaW5kZXggKyAxKTsKLQkJU3RyaW5nIHVybFN0cmluZyA9IGJhc2VVcmwgKyBpZCArICIuIiArIFhNTDsKLQkJcmV0dXJuIG5ldyBVUkwodXJsU3RyaW5nKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlciNyZWZyZXNoTWFuYWdlcigpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE1hbmFnZXIgKCkKLQl7Ci0JCWluZGV4XyA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENhY2hlcyBhbmQgcmV0dXJucyB0aGUgaW5kZXggbW9kZWwuIE9uIGZpcnN0IGNhbGwsCi0JICogaWYgYW4gaW5kZXggZG9jdW1lbnQgZXhpc3RzLCB0aGUgaW5kZXggaXMgbG9hZGVkCi0JICogZnJvbSBpdCwgb3RoZXJ3aXNlLCBhIG5ldyBpbmRleCBpcyByZXR1cm5lZC4KLQkgKiBAcmV0dXJuIFRoZSBpbmRleC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhlIGluZGV4IGNhbm5vdCBiZSBsb2FkZWQgZm9yIGFueSByZWFzb24uCi0JICovCi0JcHJpdmF0ZSBJbmRleCBnZXRJbmRleCAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKGluZGV4XyA9PSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlVUkwgaW5kZXhVUkwgPSBnZXRVUkwoKTsKLQkJCQlpZiAoUmVnaXN0cnlTZXJ2aWNlLmV4aXN0cyhpbmRleFVSTCkpCi0JCQkJewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRmFjdG9yeV8uY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54bWwiKSk7Ci0JCQkJCXJlc291cmNlLmxvYWQoUmVnaXN0cnlTZXJ2aWNlLmdldElucHV0U3RyZWFtRm9yKGluZGV4VVJMKSxudWxsKTsKLQkJCQkJb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCBkb2N1bWVudCA9IChvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguRG9jdW1lbnRSb290KXJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCQlpbmRleF8gPSBkb2N1bWVudC5nZXRJbmRleCgpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpbmRleF8gPSBSVEluZGV4RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5kZXgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkvL1RPRE86IE5lZWQgYSBtZXNzYWdlIGZvciB0aGlzIFN0YXR1cy4KLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV1NQbHVnaW4uSUQsMCwiIixlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGV4XzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgaW5kZXggbW9kZWwgdG8gYW4gWE1MIGRvY3VtZW50LgkKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhlIHNhdmUgZmFpbHMgZm9yIGFueSByZWFzb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVJbmRleCAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5ydGluZGV4LkRvY3VtZW50Um9vdCBkb2N1bWVudCA9IFJUSW5kZXhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb2N1bWVudFJvb3QoKTsKLQkJZG9jdW1lbnQuc2V0SW5kZXgoZ2V0SW5kZXgoKSk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VGYWN0b3J5Xy5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLnhtbCIpKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZG9jdW1lbnQpOwotCQl0cnkKLQkJewotCQkJcmVzb3VyY2Uuc2F2ZShSZWdpc3RyeVNlcnZpY2UuZ2V0T3V0cHV0U3RyZWFtRm9yKGdldFVSTCgpKSxudWxsKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJLy9UT0RPOiBOZWVkIGEgbWVzc2FnZSBmb3IgdGhpcyBTdGF0dXMuCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV1NQbHVnaW4uSUQsMCwiIixlKSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnJlZ2lzdHJ5LklSZWdpc3RyeU1hbmFnZXIjYWRkVGF4b25vbXlGaW5kZXIoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnJlZ2lzdHJ5LklUYXhvbm9teUZpbmRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXhvbm9teUZpbmRlcihTdHJpbmcgY2xhc3NOYW1lLCBJVGF4b25vbXlGaW5kZXIgdGF4b25vbXlGaW5kZXIpCi0JewotCQl0YXhvbm9teUZpbmRlcnNfLnB1dChjbGFzc05hbWUsdGF4b25vbXlGaW5kZXIpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiA8Y29kZT5yZWdpc3RyeTwvY29kZT4gYXMtaXMsIHdoZXRoZXIgZnVsbCBtb2RlbAotCSAqIG9yIHJlZmVyZW5jZSwgdG8gdGhlIGluZGV4IG9ubHkgaWYgYSByZWdpc3RyeSB3aXRoIHRoZSBzYW1lIElECi0JICogb3IgcmVmZXJlbmNlIGlzIG5vdCBhbHJlYWR5IHN0b3JlZCB0aGVyZS4KLQkgKiBAcGFyYW0gcmVnaXN0cnkgVGhlIHJlZ2lzdHJ5IHRvIGFkZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUmVnaXN0cnlUb0luZGV4KFJlZ2lzdHJ5IHJlZ2lzdHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIGlkID0gcmVnaXN0cnkuZ2V0SWQoKTsKLQkJaWYgKGlkID09IG51bGwpIGlkID0gcmVnaXN0cnkuZ2V0UmVmKCk7Ci0JCWlmIChpZCAhPSBudWxsICYmIGdldFJlZ2lzdHJ5KGlkKSA9PSBudWxsKQotCQl7Ci0JCQlnZXRJbmRleCgpLmdldFJlZ2lzdHJ5KCkuYWRkKHJlZ2lzdHJ5KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiA8Y29kZT50YXhvbm9teTwvY29kZT4gYXMtaXMsIHdoZXRoZXIgZnVsbCBtb2RlbAotCSAqIG9yIHJlZmVyZW5jZSwgdG8gdGhlIGluZGV4IG9ubHkgaWYgYSB0YXhvbm9teSB3aXRoIHRoZSBzYW1lIElECi0JICogb3IgcmVmZXJlbmNlIGlzIG5vdCBhbHJlYWR5IHN0b3JlZCB0aGVyZS4KLQkgKiBAcGFyYW0gdGF4b25vbXkgVGhlIHRheG9ub215IHRvIGFkZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGF4b25vbXlUb0luZGV4KFRheG9ub215IHRheG9ub215KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIGlkID0gdGF4b25vbXkuZ2V0SWQoKTsKLQkJaWYgKGlkID09IG51bGwpIGlkID0gdGF4b25vbXkuZ2V0UmVmKCk7Ci0JCWlmIChpZCAhPSBudWxsICYmIGdldFRheG9ub215KGlkKSA9PSBudWxsKQotCQl7Ci0JCSAJZ2V0SW5kZXgoKS5nZXRUYXhvbm9teSgpLmFkZCh0YXhvbm9teSk7CQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5JUmVnaXN0cnlNYW5hZ2VyI3NhdmVSZWdpc3RyeShvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5KQotCSAqLwotCXB1YmxpYyBSZWdpc3RyeSBzYXZlUmVnaXN0cnkgKCBSZWdpc3RyeSByZWdpc3RyeSApIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlSZWdpc3RyeVNlcnZpY2UgcmVnaXN0cnlTZXJ2aWNlID0gUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk7Ci0JCVJlZ2lzdHJ5IHJlZ2lzdHJ5UmVmID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBnZXRVUkwoUkVHSVNUUlkgKyByZWdpc3RyeS5nZXRJZCgpKTsKLQkJCXJlZ2lzdHJ5U2VydmljZS5zYXZlUmVnaXN0cnkodXJsLHJlZ2lzdHJ5KTsKLQkJCXJlZ2lzdHJ5UmVmID0gcmVnaXN0cnlTZXJ2aWNlLm5ld1JlZ2lzdHJ5UmVmZXJlbmNlKHJlZ2lzdHJ5KTsKLQkJCXJlZ2lzdHJ5UmVmLnNldExvY2F0aW9uKHVybC50b1N0cmluZygpKTsKLQkJCWFkZFJlZ2lzdHJ5VG9JbmRleChyZWdpc3RyeVJlZik7Ci0JCQlzYXZlSW5kZXgoKTsKLQkJCS8qCi0JCQkgKiBUT0RPOiBUaGUgZm9sbG93aW5nIHBpbGUgb2YgY29kZSBpcyBjb21tZW50ZWQgb3V0Ci0JCQkgKiBzaW5jZSB0aGVyZSBpc24ndCBhIHJlbGlhYmxlIHdheSB1bmRlciB0aGUgY3VycmVudAotCQkJICogZGVzaWduIHRvIHNhdmUgdGF4b25vbXkgbW9kZWxzIGhlbGQgaW4gYSByZWdpc3RyeSBtb2RlbAotCQkJICogCi0JCQlJVGF4b25vbXlGaW5kZXIgZmluZGVyID0gKElUYXhvbm9teUZpbmRlcil0YXhvbm9teUZpbmRlcnNfLmdldChyZWdpc3RyeS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQlpZiAoZmluZGVyICE9IG51bGwpCi0JCQl7Ci0JCQkJVGF4b25vbXlbXSB0YXhvbm9taWVzID0gZmluZGVyLnRheG9ub21pZXMocmVnaXN0cnkpOwotCQkJCWZvciAoaW50IGk9MDsgaTx0YXhvbm9taWVzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJU3RyaW5nIGlkID0gdGF4b25vbWllc1tpXS5nZXRJZCgpOwotCQkJCQlTdHJpbmcgcmVmID0gdGF4b25vbWllc1tpXS5nZXRSZWYoKTsKLQkJCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCVVSTCB0YXhvbm9teVVSTCA9IGdldFVSTChUQVhPTk9NWSArIGlkKTsKLQkJCQkJCXJlZ2lzdHJ5U2VydmljZS5zYXZlVGF4b25vbXkodGF4b25vbXlVUkwsdGF4b25vbWllc1tpXSk7Ci0JCQkJCQlUYXhvbm9teSB0YXhvbm9teVJlZiA9IHJlZ2lzdHJ5U2VydmljZS5uZXdUYXhvbm9teVJlZmVyZW5jZSh0YXhvbm9taWVzW2ldKTsKLQkJCQkJCXRheG9ub215UmVmLnNldExvY2F0aW9uKHRheG9ub215VVJMLnRvU3RyaW5nKCkpOwotCQkJCQkJYWRkVGF4b25vbXlUb0luZGV4KHRheG9ub215UmVmKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChyZWYgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJaWYgKHRheG9ub21pZXNbaV0uZ2V0TG9jYXRpb24oKSA9PSBudWxsKQotCQkJCQkJewotCQkJCQkJCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCQkJCQkJVGF4b25vbXkgdGF4b25vbXkgPSBnZXRUYXhvbm9teShyZWYpOwotCQkJCQkJCWlmICh0YXhvbm9teSAhPSBudWxsKSBsb2NhdGlvbiA9IHRheG9ub215LmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJaWYgKGxvY2F0aW9uID09IG51bGwpIGxvY2F0aW9uID0gZ2V0VVJMKFRBWE9OT01ZICsgcmVmKS50b1N0cmluZygpOwotCQkJCQkJCXRheG9ub21pZXNbaV0uc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJCQkJCWlmICh0YXhvbm9teSA9PSBudWxsKQotCQkJCQkJCXsKLQkJCQkJCQkJYWRkVGF4b25vbXlUb0luZGV4KHJlZ2lzdHJ5U2VydmljZS5uZXdUYXhvbm9teVJlZmVyZW5jZSh0YXhvbm9taWVzW2ldKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkgICAgKi8KLQkJfQotCQljYXRjaCAoIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSApCi0JCXsKLQkJCS8vVE9ETzogTWVzc2FnZSB0ZXh0IHJlcXVpcmVkLgotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdTUGx1Z2luLklELDAsIiIsbWUpKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cnlTZXJ2aWNlLm5ld1JlZ2lzdHJ5UmVmZXJlbmNlKHJlZ2lzdHJ5UmVmKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlciNsb2FkUmVnaXN0cnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnkgbG9hZFJlZ2lzdHJ5ICggU3RyaW5nIHVyaSApIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlSZWdpc3RyeVNlcnZpY2UgcmVnaXN0cnlTZXJ2aWNlID0gUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk7Ci0JCXRyeQotCQl7Ci0JCQlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KHVyaSk7Ci0JCQlpZiAocmVnaXN0cnkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLQkJCS8vIElmIHRoZSBSZWdpc3RyeSBoYXMgYW4gSUQsIGl0J3MgYSBmdWxsIG1vZGVsCi0JCQkvLyBpbmxpbmVkIHdpdGhpbiB0aGUgSW5kZXggYW5kIGlzIHJldHVybmVkIGFzLWlzLgotCQkJaWYgKHJlZ2lzdHJ5LmdldElkKCkgIT0gbnVsbCkgcmV0dXJuIHJlZ2lzdHJ5OwotCi0JCQkvLyBPdGhlcndpc2UgaXQncyBhIHJlZmVyZW5jZSB0byBhIGZ1bGwgbW9kZWwKLQkJCS8vIHdoaWNoIHdlIGxvYWQgZnJvbSB0aGUgcmVmZXJlbmNlJ3MgbG9jYXRpb24uCi0JCQlTdHJpbmcgdXJsU3RyaW5nID0gcmVnaXN0cnkuZ2V0TG9jYXRpb24oKTsKLQkJCWlmICh1cmxTdHJpbmcgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQkJcmV0dXJuIHJlZ2lzdHJ5U2VydmljZS5sb2FkUmVnaXN0cnkodXJsKTsKLQkJfQotCQljYXRjaCAoIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSApCi0JCXsKLQkJCS8vVE9ETzogTWVzc2FnZSB0ZXh0IHJlcXVpcmVkLgotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdTUGx1Z2luLklELDAsIiIsbWUpKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlciNsb2FkUmVnaXN0cmllcyhqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5W10gbG9hZFJlZ2lzdHJpZXMgKCBTdHJpbmdbXSB1cmlzICkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QodXJpcy5sZW5ndGgpOwotCQlmb3IgKGludCBpPTA7IGk8dXJpcy5sZW5ndGg7IGkrKykKLQkJewotCQkJUmVnaXN0cnkgcmVnaXN0cnkgPSBsb2FkUmVnaXN0cnkodXJpc1tpXSk7Ci0JCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlsaXN0LmFkZChyZWdpc3RyeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChSZWdpc3RyeVtdKWxpc3QudG9BcnJheShuZXcgUmVnaXN0cnlbMF0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5JUmVnaXN0cnlNYW5hZ2VyI2dldFJlZ2lzdHJ5VVJJcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJlZ2lzdHJ5VVJJcyAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJRUxpc3QgbGlzdCA9IGdldEluZGV4KCkuZ2V0UmVnaXN0cnkoKTsKLQkJTGlzdCByZWdpc3RyeVVSSXMgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJewotCQkJLy8gRWFjaCBSZWdpc3RyeSBmb3VuZCBpbiB0aGUgaW5kZXggbWF5IGJlCi0JCQkvLyBlaXRoZXIgYSBmdWxsIG1vZGVsIG9yIGEgcmVmZXJlbmNlIHRvIG9uZS4KLQkJCVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFJlZ2lzdHJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChyZWdpc3RyeS5nZXRJZCgpICE9IG51bGwpCi0JCQl7Ci0JCQkJcmVnaXN0cnlVUklzLmFkZChyZWdpc3RyeS5nZXRJZCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lzdHJ5LmdldFJlZigpICE9IG51bGwpCi0JCQl7Ci0JCQkJcmVnaXN0cnlVUklzLmFkZChyZWdpc3RyeS5nZXRSZWYoKSk7Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiAoU3RyaW5nW10pcmVnaXN0cnlVUklzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnJlZ2lzdHJ5LklSZWdpc3RyeU1hbmFnZXIjcmVtb3ZlUmVnaXN0cnkoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWdpc3RyeSAoIFN0cmluZyB1cmksIGJvb2xlYW4gZGVsZXRlRG9jdW1lbnQgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJRUxpc3QgbGlzdCA9IGdldEluZGV4KCkuZ2V0UmVnaXN0cnkoKTsKLQkJUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRSZWdpc3RyeSh1cmkpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJewotCQkJbGlzdC5yZW1vdmUocmVnaXN0cnkpOwotCQkJc2F2ZUluZGV4KCk7Ci0JCQkvLyBUaGUgaWRlbnRpZmllZCBSZWdpc3RyeSBtYXkgYmUgZWl0aGVyIGEgZnVsbCBtb2RlbAotCQkJLy8gKGllLiBpbmxpbmVkIGluIHRoZSBJbmRleCkgb3IgYSByZWZlcmVuY2UgdG8gb25lLgotCQkJLy8gT25seSBpbiB0aGUgbGF0dGVyIGNhc2UgaXMgdGhlcmUgYSBmaWxlIHRvIGRlbGV0ZS4KLQkJCWlmIChkZWxldGVEb2N1bWVudCAmJiByZWdpc3RyeS5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQl7Ci0JCQkJLy9UT0RPOiBJbXBsZW1lbnQgbWUuCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlciNzYXZlVGF4b25vbXkob3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teSkKLQkgKi8KLQlwdWJsaWMgVGF4b25vbXkgc2F2ZVRheG9ub215ICggVGF4b25vbXkgdGF4b25vbXkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJUmVnaXN0cnlTZXJ2aWNlIHJlZ2lzdHJ5U2VydmljZSA9IFJlZ2lzdHJ5U2VydmljZS5pbnN0YW5jZSgpOwotCQlUYXhvbm9teSB0YXhvbm9teVJlZiA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlVUkwJdXJsID0gZ2V0VVJMKFRBWE9OT01ZICsgdGF4b25vbXkuZ2V0SWQoKSk7Ci0JCSAgICByZWdpc3RyeVNlcnZpY2Uuc2F2ZVRheG9ub215KHVybCx0YXhvbm9teSk7Ci0JCQl0YXhvbm9teVJlZiA9IHJlZ2lzdHJ5U2VydmljZS5uZXdUYXhvbm9teVJlZmVyZW5jZSh0YXhvbm9teSk7Ci0JCQl0YXhvbm9teVJlZi5zZXRMb2NhdGlvbih1cmwudG9TdHJpbmcoKSk7Ci0JCQlhZGRUYXhvbm9teVRvSW5kZXgodGF4b25vbXlSZWYpOwotCQkJc2F2ZUluZGV4KCk7Ci0JCX0KLQkJY2F0Y2ggKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUgKQotCQl7Ci0JCQkvL1RPRE86IE1lc3NhZ2UgdGV4dCByZXF1aXJlZC4KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXU1BsdWdpbi5JRCwwLCIiLG1lKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJ5U2VydmljZS5uZXdUYXhvbm9teVJlZmVyZW5jZSh0YXhvbm9teVJlZik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5JUmVnaXN0cnlNYW5hZ2VyI2xvYWRUYXhvbm9teShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBUYXhvbm9teSBsb2FkVGF4b25vbXkgKCBTdHJpbmcgdXJpICkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVJlZ2lzdHJ5U2VydmljZSByZWdpc3RyeVNlcnZpY2UgPSBSZWdpc3RyeVNlcnZpY2UuaW5zdGFuY2UoKTsKLQkJdHJ5Ci0JCXsKLQkJCVRheG9ub215IHRheG9ub215ID0gZ2V0VGF4b25vbXkodXJpKTsKLQkJCWlmICh0YXhvbm9teSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotCQkJLy8gSWYgdGhlIFRheG9ub215IGhhcyBhbiBJRCwgaXQncyBhIGZ1bGwgbW9kZWwKLQkJCS8vIGlubGluZWQgd2l0aGluIHRoZSBJbmRleCBhbmQgaXMgcmV0dXJuZWQgYXMtaXMuCi0JCQlpZiAodGF4b25vbXkuZ2V0SWQoKSAhPSBudWxsKSByZXR1cm4gdGF4b25vbXk7Ci0KLQkJCS8vIE90aGVyd2lzZSBpdCdzIGEgcmVmZXJlbmNlIHRvIGEgZnVsbCBtb2RlbAotCQkJLy8gd2hpY2ggd2UgbG9hZCBmcm9tIHRoZSByZWZlcmVuY2UncyBsb2NhdGlvbi4KLQkJCVN0cmluZyB1cmxTdHJpbmcgPSB0YXhvbm9teS5nZXRMb2NhdGlvbigpOwotCQkJaWYgKHVybFN0cmluZyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0JCQlyZXR1cm4gcmVnaXN0cnlTZXJ2aWNlLmxvYWRUYXhvbm9teSh1cmwpOwotCQl9Ci0JCWNhdGNoICggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lICkKLQkJewotCQkJLy9UT0RPOiBNZXNzYWdlIHRleHQgcmVxdWlyZWQuCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV1NQbHVnaW4uSUQsMCwiIixtZSkpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5JUmVnaXN0cnlNYW5hZ2VyI2xvYWRUYXhvbm9taWVzKGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgVGF4b25vbXlbXSBsb2FkVGF4b25vbWllcyAoIFN0cmluZ1tdIHVyaXMgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCh1cmlzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGk9MDsgaTx1cmlzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlUYXhvbm9teSB0YXhvbm9teSA9IGxvYWRUYXhvbm9teSh1cmlzW2ldKTsKLQkJCWlmICh0YXhvbm9teSAhPSBudWxsKQotCQkJewotCQkJCWxpc3QuYWRkKHRheG9ub215KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFRheG9ub215W10pbGlzdC50b0FycmF5KG5ldyBUYXhvbm9teVswXSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnJlZ2lzdHJ5LklSZWdpc3RyeU1hbmFnZXIjZ2V0VGF4b25vbXlVUklzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VGF4b25vbXlVUklzICgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlFTGlzdCBsaXN0ID0gZ2V0SW5kZXgoKS5nZXRUYXhvbm9teSgpOwotCQlMaXN0IHRheG9ub215VVJJcyA9IG5ldyBBcnJheUxpc3QobGlzdC5zaXplKCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQl7Ci0JCQkvLyBFYWNoIFRheG9ub215IGZvdW5kIGluIHRoZSBpbmRleCBtYXkgYmUKLQkJCS8vIGVpdGhlciBhIGZ1bGwgbW9kZWwgb3IgYSByZWZlcmVuY2UgdG8gb25lLgotCQkJVGF4b25vbXkgdGF4b25vbXkgPSAoVGF4b25vbXkpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRheG9ub215LmdldElkKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQl0YXhvbm9teVVSSXMuYWRkKHRheG9ub215LmdldElkKCkpOwotCQkJfQotCQkJZWxzZSBpZiAodGF4b25vbXkuZ2V0UmVmKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQl0YXhvbm9teVVSSXMuYWRkKHRheG9ub215LmdldFJlZigpKTsKLQkJCX0KLQkJfQkKLQkJcmV0dXJuIChTdHJpbmdbXSl0YXhvbm9teVVSSXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlciNyZW1vdmVUYXhvbm9teShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRheG9ub215ICggU3RyaW5nIHVyaSwgYm9vbGVhbiBkZWxldGVEb2N1bWVudCApIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlFTGlzdCBsaXN0ID0gZ2V0SW5kZXgoKS5nZXRUYXhvbm9teSgpOwotCQlUYXhvbm9teSB0YXhvbm9teSA9IGdldFRheG9ub215KHVyaSk7Ci0JCWlmICh0YXhvbm9teSAhPSBudWxsKQotCQl7Ci0JCQlsaXN0LnJlbW92ZSh0YXhvbm9teSk7Ci0JCQlzYXZlSW5kZXgoKTsKLQkJCS8vIFRoZSBpZGVudGlmaWVkIFRheG9ub215IG1heSBiZSBlaXRoZXIgYSBmdWxsIG1vZGVsCi0JCQkvLyAoaWUuIGlubGluZWQgaW4gdGhlIEluZGV4KSBvciBhIHJlZmVyZW5jZSB0byBvbmUuCi0JCQkvLyBPbmx5IGluIHRoZSBsYXR0ZXIgY2FzZSBpcyB0aGVyZSBhIGZpbGUgdG8gZGVsZXRlLgotCQkJaWYgKGRlbGV0ZURvY3VtZW50ICYmIHRheG9ub215LmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQkvL1RPRE86IEltcGxlbWVudCBtZS4KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFJlZ2lzdHJ5IGZyb20gdGhlIGluZGV4IHdob3NlIElEIG9yIFJlZmVyZW5jZQotCSAqIG1hdGNoZXMgdGhlIGdpdmVuIFVSSS4gQXMgc3VjaCwgdGhpcyBtZXRob2QgbWF5IHJldHVybiBhCi0JICogZnVsbCBtb2RlbCBvciBhIHJlZmVyZW5jZSB0byBhIGZ1bGwgbW9kZWwuCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIGlkZW50aWZpZXIgb2YgdGhlIFJlZ2lzdHJ5Ci0JICogQHJldHVybiBUaGUgPGNvZGU+UmVnaXN0cnk8L2NvZGU+IG9iamVjdCB3aG9zZSBJRCBvciByZWZlcmVuY2UKLQkgKiBtYXRjaGVzIHRoZSBnaXZlbiA8Y29kZT51cmk8L2NvZGU+LCBvciBudWxsIGlmIG5vbmUgbWF0Y2guCi0JICovCi0gICAgcHJpdmF0ZSBSZWdpc3RyeSBnZXRSZWdpc3RyeSAoIFN0cmluZyB1cmkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIHsKLQkJRUxpc3QgbGlzdCA9IGdldEluZGV4KCkuZ2V0UmVnaXN0cnkoKTsJCi0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKXsKLQkJCVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFJlZ2lzdHJ5KWl0Lm5leHQoKTsKLQkJCWlmICh1cmkuZXF1YWxzKHJlZ2lzdHJ5LmdldElkKCkpIHx8IHVyaS5lcXVhbHMocmVnaXN0cnkuZ2V0UmVmKCkpKXsKLQkJCQlyZXR1cm4gcmVnaXN0cnk7ICAKLQkJCX0KLQkJfQkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFRheG9ub215IGZyb20gdGhlIGluZGV4IHdob3NlIElEIG9yIFJlZmVyZW5jZQotCSAqIG1hdGNoZXMgdGhlIGdpdmVuIFVSSS4gQXMgc3VjaCwgdGhpcyBtZXRob2QgbWF5IHJldHVybiBhCi0JICogZnVsbCBtb2RlbCBvciBhIHJlZmVyZW5jZSB0byBhIGZ1bGwgbW9kZWwuCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIGlkZW50aWZpZXIgb2YgdGhlIFRheG9ub215Ci0JICogQHJldHVybiBUaGUgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG9iamVjdCB3aG9zZSBJRCBvciByZWZlcmVuY2UKLQkgKiBtYXRjaGVzIHRoZSBnaXZlbiA8Y29kZT51cmk8L2NvZGU+LCBvciBudWxsIGlmIG5vbmUgbWF0Y2guCi0JICovCi0gICAgcHJpdmF0ZSBUYXhvbm9teSBnZXRUYXhvbm9teSAoIFN0cmluZyB1cmkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIHsKLQkJRUxpc3QgbGlzdCA9IGdldEluZGV4KCkuZ2V0VGF4b25vbXkoKTsJCi0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKXsKLQkJCVRheG9ub215IHRheG9ub215ID0gKFRheG9ub215KWl0Lm5leHQoKTsKLQkJCWlmICh1cmkuZXF1YWxzKHRheG9ub215LmdldElkKCkpIHx8IHVyaS5lcXVhbHModGF4b25vbXkuZ2V0UmVmKCkpKXsKLQkJCQlyZXR1cm4gdGF4b25vbXk7Ci0JCQl9Ci0JCX0JCi0gICAgICAgIHJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3JlZ2lzdHJ5L1JlZ2lzdHJ5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZThjODE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJ0aW5kZXguUlRJbmRleFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotCi0vKioKLSAqIFJlZ2lzdHJ5U2VydmljZSBpcyB0aGUgc3RhcnRpbmcgY2xhc3Mgb2YgdGhlIFdlYiBzZXJ2aWNlIHJlZ2lzdHJ5Ci0gKiBwcm9ncmFtbWluZyBtb2RlbC4gQ2FsbCB0aGUgPGNvZGU+UmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk8L2NvZGU+Ci0gKiBzdGF0aWMgbWV0aG9kIHRvIGdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gKiA8cD4KLSAqIFJlZ2lzdHJ5U2VydmljZSBwcm92aWRlcyBmYWN0b3J5IG1ldGhvZHMgZm9yIGdldHRpbmcgbmV3Ci0gKiBpbnN0YW5jZXMgb2YgPGNvZGU+SVJlZ2lzdHJ5TWFuYWdlcjwvY29kZT4gb2JqZWN0cyB3aGljaCwKLSAqIGluIHR1cm4sIHByb3ZpZGUgdGhlIG1lYW5zIGZvciByZWdpc3RlcmluZyBhbmQgdW5yZWdpc3RlcmluZwotICogZ3JvdXBzIG9mIDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPiBhbmQgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscwotICogYXQgVVJMIGFkZHJlc3NhYmxlIGxvY2F0aW9ucyBpbiB0aGUgZmlsZXN5c3RlbSBvciBlbHNld2hlcmUuCi0gKiA8cD4KLSAqIFJlZ2lzdHJ5U2VydmljZSBwcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgdG8gZWFzZSB0aGUgY3JlYXRpb24sCi0gKiBsb2FkaW5nIGFuZCBzYXZpbmcgcmF3IGluc3RhbmNlcyBvZiB0aGUgPGNvZGU+UmVnaXN0cnk8L2NvZGU+Ci0gKiBhbmQgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscywgYW5kIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mCi0gKiBjb21wb3NpbmcgYW5kIGZpbmRpbmcgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscyBpbgotICogPGNvZGU+UmVnaXN0cnk8L2NvZGU+IG1vZGVscy4KLSAqIDxwPgotICogQSB0eXBpY2FsIHVzZSBvZiA8Y29kZT5SZWdpc3RyeVNlcnZpY2U8L2NvZGU+IGFuZCBpdHMgcmVsYXRlZAotICogY2xhc3NlcyB0byBjcmVhdGUgYW5kIHNhdmUgYSBuZXcgZmFtaWx5IG9mIG1vZGVscyBpczoKLSAqIDxibG9ja3F1b3RlPgotICogPGNvZGU+Ci0gKiBSZWdpc3RyeVNlcnZpY2UgcmVnaXN0cnlTZXJ2aWNlID0gUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk7Ci0gKiBNeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTXlSZWdpc3RyeUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU15UmVnaXN0cnkoKTsKLSAqIC8vIGJ1aWxkIHVwIHlvdXIgcmVnaXN0cnkgbW9kZWwgaGVyZQotICogVGF4b25vbXkgdGF4b25vbXkgPSByZWdpc3RyeVNlcnZpY2UubmV3VGF4b25vbXkoKTsKLSAqIC8vIGJ1aWxkIHVwIHlvdXIgdGF4b25vbXkgbW9kZWwgaGVyZQotICogcmVnaXN0cnlTZXJ2aWNlLmFkZFRheG9ub215KHJlZ2lzdHJ5LHRheG9ub215KTsKLSAqIElSZWdpc3RyeU1hbmFnZXIgcmVnaXN0cnlNYW5hZ2VyID0gcmVnaXN0cnlTZXJ2aWNlLmdldERlZmF1bHRSZWdpc3RyeU1hbmFnZXIoKTsKLSAqIHJlZ2lzdHJ5TWFuYWdlci5zYXZlUmVnaXN0cnkocmVnaXN0cnkpOwotICogPC9jb2RlPgotICogPC9ibG9ja3F1b3RlPgotICogQHNlZSAjaW5zdGFuY2UoKQotICogQHNlZSBJUmVnaXN0cnlNYW5hZ2VyCi0gKiBAc2VlIFJlZ2lzdHJ5Ci0gKiBAc2VlIFRheG9ub215Ci0gKiBAYXV0aG9yIGNicmVhbGV5Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeVNlcnZpY2UKLXsKLQlwcml2YXRlIHN0YXRpYyBSZWdpc3RyeVNlcnZpY2UgaW5zdGFuY2VfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOREVYX1hNTF9GSUxFID0gIkRlZmF1bHRJbmRleC54bWwiOwotCXByaXZhdGUgSGFzaHRhYmxlIHJlZ2lzdHJ5TWFuYWdlcnNfID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSVJlZ2lzdHJ5TWFuYWdlciBkZWZhdWx0UmVnaXN0cnlNYW5hZ2VyXyA9IG51bGw7Ci0JcHJpdmF0ZSBHZW5lcmljUmVzb3VyY2VGYWN0b3J5IHJlc291cmNlRmFjdG9yeV8gPSBuZXcgR2VuZXJpY1Jlc291cmNlRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQSBSZWdpc3RyeVNlcnZpY2UgY2Fubm90IGJlIGRpcmVjdGx5IGNvbnN0cnVjdGVkLgotCSAqIFVzZSBAbGluayAjaW5zdGFuY2UoKSB0byBnZXQgdGhlIHNpbmdsZXRvbiBvZiB0aGlzIGNsYXNzLgotCSAqLwotCXByaXZhdGUgUmVnaXN0cnlTZXJ2aWNlICgpCi0JewotCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieG1sIixyZXNvdXJjZUZhY3RvcnlfKTsKLQkJUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzcygpOwotCQlUYXhvbm9teVBhY2thZ2UuZUlOU1RBTkNFLmdldENsYXNzKCk7Ci0JCVJUSW5kZXhQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBvZiB0aGlzIGNsYXNzLgotCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBvZiB0aGlzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVnaXN0cnlTZXJ2aWNlIGluc3RhbmNlICgpCi0JewotCQlpZiAoaW5zdGFuY2VfID09IG51bGwpCi0JCXsKLQkJCWluc3RhbmNlXyA9IG5ldyBSZWdpc3RyeVNlcnZpY2UoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2VfOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCA8Y29kZT5JUmVnaXN0cnlNYW5hZ2VyPC9jb2RlPiBmb3IgdGhlIHN5c3RlbS4KLQkgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IDxjb2RlPklSZWdpc3RyeU1hbmFnZXI8L2NvZGU+IGZvciB0aGUgc3lzdGVtLgotCSAqIEBzZWUgSVJlZ2lzdHJ5TWFuYWdlcgotCSAqLwotCXB1YmxpYyBJUmVnaXN0cnlNYW5hZ2VyIGdldERlZmF1bHRSZWdpc3RyeU1hbmFnZXIgKCkKLQl7Ci0JCWlmIChkZWZhdWx0UmVnaXN0cnlNYW5hZ2VyXyA9PSBudWxsKQotCQl7Ci0JCQlTdHJpbmcgaW5kZXhGaWxlbmFtZSA9IFdTUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKERFRkFVTFRfSU5ERVhfWE1MX0ZJTEUpLnRvU3RyaW5nKCk7Ci0JCQlkZWZhdWx0UmVnaXN0cnlNYW5hZ2VyXyA9IG5ldyBSZWdpc3RyeU1hbmFnZXIoaW5kZXhGaWxlbmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRSZWdpc3RyeU1hbmFnZXJfOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3IgZXhpc3RpbmcgPGNvZGU+SVJlZ2lzdHJ5TWFuYWdlcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBVUkwuCi0JICogQHBhcmFtIHVybCBBIFVSTCB0byB0aGUgWE1MIGRvY3VtZW50IHRoYXQgcGVyc2lzdHMKLQkgKiB0aGUgc2V0IG9mIHJlZ2lzdHJpZXMgbWFuYWdlZCBieSB0aGlzIDxjb2RlPklSZWdpc3RyeU1hbmFnZXI8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIG5ldyBvciBleGlzdGluZyA8Y29kZT5SZWdpc3RyeU1hbmFnZXI8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gVVJMLgotCSAqIEBzZWUgSVJlZ2lzdHJ5TWFuYWdlcgotCSAqLwotCXB1YmxpYyBJUmVnaXN0cnlNYW5hZ2VyIGdldFJlZ2lzdHJ5TWFuYWdlciAoIFVSTCB1cmwgKQotCXsKLQkJSVJlZ2lzdHJ5TWFuYWdlciByZWdpc3RyeU1hbmFnZXIgPSAoSVJlZ2lzdHJ5TWFuYWdlcilyZWdpc3RyeU1hbmFnZXJzXy5nZXQodXJsKTsKLQkJaWYgKHJlZ2lzdHJ5TWFuYWdlciA9PSBudWxsKQotCQl7Ci0JCQlyZWdpc3RyeU1hbmFnZXIgPSBuZXcgUmVnaXN0cnlNYW5hZ2VyKHVybCk7Ci0JCQlyZWdpc3RyeU1hbmFnZXJzXy5wdXQodXJsLHJlZ2lzdHJ5TWFuYWdlcik7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJ5TWFuYWdlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgPGNvZGU+SVJlZ2lzdHJ5TWFuYWdlcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBVUkwuCi0JICogTm8gcGh5c2ljYWwgcmVzb3VyY2VzIGFyZSBkZWxldGVkLgotCSAqIEBwYXJhbSB1cmwgQSBVUkwgdG8gdGhlIFhNTCBkb2N1bWVudCB0aGF0IHBlcnNpc3RzCi0JICogdGhlIHNldCBvZiByZWdpc3RyaWVzIG1hbmFnZWQgYnkgdGhpcyA8Y29kZT5JUmVnaXN0cnlNYW5hZ2VyPC9jb2RlPi4KLQkgKiBAc2VlIElSZWdpc3RyeU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWdpc3RyeU1hbmFnZXIgKCBVUkwgdXJsICkKLQl7Ci0JCXJlZ2lzdHJ5TWFuYWdlcnNfLnJlbW92ZSh1cmwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+UmVnaXN0cnk8L2NvZGU+IG1vZGVsLgotCSAqIEFzIGEgZ2VuZXJhbCBydWxlLCB0aGlzIG1ldGhvZCBoYXMgbGl0dGxlIGFjdHVhbCB2YWx1ZSBhcwotCSAqIG1vc3QgY29uY3JldGUgcmVnaXN0cnkgbW9kZWxzIHdpbGwgYmUgb2YgdHlwZXMgdGhhdCBleHRlbmQKLQkgKiB0aGUgYmFzZSBSZWdpc3RyeSBtb2RlbCwgc3VjaCBhcyA8Y29kZT5VRERJUmVnaXN0cnk8L2NvZGU+LgotCSAqIEZvciBleGFtcGxlLCA8Y29kZT5VRERJUmVnaXN0cnlTZXJ2aWNlLm5ld1VERElSZWdpc3RyeSgpPC9jb2RlPgotCSAqIHJldHVybnMgYSBuZXcgPGNvZGU+VURESVJlZ2lzdHJ5PC9jb2RlPi4gUHJvdmlkZXJzIG9mIG90aGVyCi0JICogY29uY3JldGUgdHlwZXMgb2YgcmVnaXN0cmllcyBtYXkgcHJvdmlkZSBzaW1pbGFyIGZhY2lsaXRpZXMuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5SZWdpc3RyeTwvY29kZT4gbW9kZWwuIE5ldmVyIHJldHVybnMgbnVsbC4KLQkgKiBAc2VlIFJlZ2lzdHJ5Ci0JICogQHNlZSBVRERJUmVnaXN0cnlTZXJ2aWNlI25ld1VERElSZWdpc3RyeSgpCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5IG5ld1JlZ2lzdHJ5ICgpCi0JewotCQlyZXR1cm4gUmVnaXN0cnlGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZWdpc3RyeSgpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgPGNvZGU+UmVnaXN0cnk8L2NvZGU+IG1vZGVsIGZyb20gYW4gWE1MIGRvY3VtZW50LgotCSAqIElmIGxvYWRpbmcgdGhlIG1vZGVsIG9mIGEgcmVnaXN0cnkgdGhhdCBleHRlbmRzIHRoZSBiYXNlCi0JICogUmVnaXN0cnkgaW50ZXJmYWNlIGFuZCBTY2hlbWEsIHlvdSBtdXN0IGluaXRpYWxpemUgdGhlIEVNRgotCSAqIGVDb3JlIHBhY2thZ2UgKGVnLiA8Y29kZT5NeVJlZ2lzdHJ5UGFja2FnZS5lSU5TVEFOQ0U8L2NvZGU+Ci0JICogZm9yIHlvdXIgbW9kZWwgYmVmb3JlIGNhbGxpbmcgdGhpcyBsb2FkIG1ldGhvZC4KLQkgKiBGb3IgVURESSBSZWdpc3RyeSBtb2RlbHMsIHRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5Ci0JICogY2FsbGluZyA8Y29kZT5VRERJUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk8L2NvZGU+LgotCSAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0byB0aGUgWE1MIGRvY3VtZW50IHRvIGxvYWQuCi0JICogQHJldHVybiBUaGUgPGNvZGU+UmVnaXN0cnk8L2NvZGU+IG1vZGVsLgotCSAqIEB0aHJvd3MgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gSWYgdGhlIG1vZGVsIGNhbm5vdCBiZSBsb2FkZWQuCi0JICogQHNlZSBSZWdpc3RyeQotCSAqIEBzZWUgVURESVJlZ2lzdHJ5U2VydmljZSNpbnN0YW5jZSgpCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5IGxvYWRSZWdpc3RyeSAoIFVSTCB1cmwgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZUZhY3RvcnlfLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioueG1sIikpOwotCQl0cnkKLQkJewotCQkJcmVzb3VyY2UubG9hZChnZXRJbnB1dFN0cmVhbUZvcih1cmwpLG51bGwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV1NQbHVnaW4uSUQsMCwiIixlKSk7Ci0JCX0KLQkJb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QgZG9jdW1lbnQgPSAob3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5Eb2N1bWVudFJvb3QpcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCXJldHVybiBkb2N1bWVudC5nZXRSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSA8Y29kZT5SZWdpc3RyeTwvY29kZT4gbW9kZWwgdG8gYW4gWE1MIGRvY3VtZW50LgotCSAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0byB0aGUgWE1MIGRvY3VtZW50IHRvIHNhdmUuCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSA8Y29kZT5SZWdpc3RyeTwvY29kZT4gbW9kZWwgdG8gc2F2ZS4KLQkgKiBAdGhyb3dzIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IElmIHRoZSBtb2RlbCBjYW5ub3QgYmUgc2F2ZWQuCi0JICogQHNlZSBSZWdpc3RyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVSZWdpc3RyeSAoIFVSTCB1cmwsIFJlZ2lzdHJ5IHJlZ2lzdHJ5ICkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCW9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuRG9jdW1lbnRSb290IGRvY3VtZW50ID0gUmVnaXN0cnlGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb2N1bWVudFJvb3QoKTsKLQkJZG9jdW1lbnQuc2V0UmVnaXN0cnkocmVnaXN0cnkpOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRmFjdG9yeV8uY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54bWwiKSk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRvY3VtZW50KTsKLQkJdHJ5Ci0JCXsKLQkJCXJlc291cmNlLnNhdmUoZ2V0T3V0cHV0U3RyZWFtRm9yKHVybCksbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXU1BsdWdpbi5JRCwwLCIiLGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVsLiBOZXZlciByZXR1cm5zIG51bGwuCi0JICogQHNlZSBUYXhvbm9teQotCSAqLwotCXB1YmxpYyBUYXhvbm9teSBuZXdUYXhvbm9teSAoKQotCXsKLQkJcmV0dXJuIFRheG9ub215RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGF4b25vbXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgdGhlIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbCBmcm9tIGFuIFhNTCBkb2N1bWVudC4KLQkgKiBAcGFyYW0gdXJsIFRoZSBVUkwgdG8gdGhlIFhNTCBkb2N1bWVudCB0byBsb2FkLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbC4KLQkgKiBAdGhyb3dzIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IElmIHRoZSBtb2RlbCBjYW5ub3QgYmUgbG9hZGVkLgotCSAqIEBzZWUgVGF4b25vbXkKLQkgKi8KLQlwdWJsaWMgVGF4b25vbXkgbG9hZFRheG9ub215ICggVVJMIHVybCApIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRmFjdG9yeV8uY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54bWwiKSk7Ci0JCXRyeQotCQl7Ci0JCQlyZXNvdXJjZS5sb2FkKGdldElucHV0U3RyZWFtRm9yKHVybCksbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXU1BsdWdpbi5JRCwwLCIiLGUpKTsKLQkJfQotCQlvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdCBkb2N1bWVudCA9IChvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkRvY3VtZW50Um9vdClyZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJcmV0dXJuIGRvY3VtZW50LmdldFRheG9ub215KCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbCB0byBhbiBYTUwgZG9jdW1lbnQuCi0JICogQHBhcmFtIHVybCBUaGUgVVJMIHRvIHRoZSBYTUwgZG9jdW1lbnQgdG8gc2F2ZS4KLQkgKiBAcGFyYW0gdGF4b25vbXkgVGhlIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbCB0byBzYXZlLgotCSAqIEB0aHJvd3MgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gSWYgdGhlIG1vZGVsIGNhbm5vdCBiZSBzYXZlZC4KLQkgKiBAc2VlIFRheG9ub215Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRheG9ub215ICggVVJMIHVybCwgVGF4b25vbXkgdGF4b25vbXkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5Eb2N1bWVudFJvb3QgZG9jdW1lbnQgPSBUYXhvbm9teUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQlkb2N1bWVudC5zZXRUYXhvbm9teSh0YXhvbm9teSk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VGYWN0b3J5Xy5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLnhtbCIpKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZG9jdW1lbnQpOwotCQl0cnkKLQkJewotCQkJcmVzb3VyY2Uuc2F2ZShnZXRPdXRwdXRTdHJlYW1Gb3IodXJsKSxudWxsKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdTUGx1Z2luLklELDAsIiIsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhIG5ldyBSZWdpc3RyeSBtb2RlbCBjb25maWd1cmVkCi0JICogdG8gcmVmZXJlbmNlIHRoZSBnaXZlbiA8Y29kZT5yZWdpc3RyeTwvY29kZT4uCi0JICogPHA+Ci0JICogVGhlIGdpdmVuIDxjb2RlPnJlZ2lzdHJ5PC9jb2RlPiBjYW4gYmUgZWl0aGVyIGEgZnVsbAotCSAqIG1vZGVsIGFzIHNpZ25pZmllZCBieSBoYXZpbmcgYSBub24tbnVsbCwgbm9uLWVtcHR5Ci0JICogaWRlbnRpZmllciAoPGNvZGU+cmVnaXN0cnkuZ2V0SWQoKTwvY29kZT4pLCBvciBhCi0JICogcmVmZXJlbmNlIGl0c2VsZiBhcyBzaWduaWZpZWQgYnkgaGF2aW5nIGEgbm9uLW51bGwsCi0JICogbm9uLWVtcHR5IHJlZmVyZW5jZSAoPGNvZGU+cmVnaXN0cnkuZ2V0UmVmKCk8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgZ2l2ZW4gPGNvZGU+cmVnaXN0cnk8L2NvZGU+IGlzIGEgZnVsbCBtb2RlbCwKLQkgKiB0aGVuIGEgbmV3IDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPiBpcyByZXR1cm5lZCBzdWNoIHRoYXQKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPmdldFJlZigpPC9jb2RlPiBlcXVhbHMgPGNvZGU+cmVnaXN0cnkuZ2V0SWQoKTwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT5nZXRMb2NhdGlvbigpPC9jb2RlPiBpcyBudWxsPC9saT4KLQkgKiA8bGk+PGNvZGU+Z2V0SWQoKTwvY29kZT4gaXMgbnVsbDwvbGk+Ci0JICogPC91bD4KLQkgKiA8cD4KLQkgKiBJbiB0aGUgZ2l2ZW4gPGNvZGU+cmVnaXN0cnk8L2NvZGU+IGlzIGl0c2VsZiBhIHJlZmVyZW5jZSwKLQkgKiB0aGVuIGEgbmV3IDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPiBpcyByZXR1cm5lZCBzdWNoIHRoYXQKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPmdldFJlZigpPC9jb2RlPiBlcXVhbHMgPGNvZGU+cmVnaXN0cnkuZ2V0UmVmKCk8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+Z2V0TG9jYXRpb24oKTwvY29kZT4gZXF1YWxzIDxjb2RlPnJlZ2lzdHJ5LmdldExvY2F0aW9uKCk8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+Z2V0SWQoKTwvY29kZT4gaXMgbnVsbDwvbGk+Ci0JICogPC91bD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkgVGhlIDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPiBtb2RlbCB0byBjbG9uZSBvcgotCSAqIHJlZmVyIHRvIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBnaXZlbiA8Y29kZT5yZWdpc3RyeTwvY29kZT4KLQkgKiBpcyBhIGZ1bGwgbW9kZWwgb3IgYSByZWZlcmVuY2UuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5SZWdpc3RyeTwvY29kZT4sIGd1YXJhbnRlZWQgdG8gYmUgYSByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5IG5ld1JlZ2lzdHJ5UmVmZXJlbmNlICggUmVnaXN0cnkgcmVnaXN0cnkgKQotCXsKLQkJU3RyaW5nIGlkID0gcmVnaXN0cnkuZ2V0SWQoKTsKLQkJU3RyaW5nIHJlZiA9IHJlZ2lzdHJ5LmdldFJlZigpOwotCQlSZWdpc3RyeSByZWdpc3RyeVJlZiA9IG5ld1JlZ2lzdHJ5KCk7Ci0JCWlmIChyZWYgPT0gbnVsbCB8fCAiIi5lcXVhbHMocmVmKSkKLQkJewotCQkJcmVnaXN0cnlSZWYuc2V0UmVmKGlkKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJlZ2lzdHJ5UmVmLnNldFJlZihyZWYpOwotCQkJcmVnaXN0cnlSZWYuc2V0TG9jYXRpb24ocmVnaXN0cnkuZ2V0TG9jYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJ5UmVmOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYSBuZXcgVGF4b25vbXkgbW9kZWwgY29uZmlndXJlZAotCSAqIHRvIHJlZmVyZW5jZSB0aGUgZ2l2ZW4gPGNvZGU+dGF4b25vbXk8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSBnaXZlbiA8Y29kZT50YXhvbm9teTwvY29kZT4gY2FuIGJlIGVpdGhlciBhIGZ1bGwKLQkgKiBtb2RlbCBhcyBzaWduaWZpZWQgYnkgaGF2aW5nIGEgbm9uLW51bGwsIG5vbi1lbXB0eQotCSAqIGlkZW50aWZpZXIgKDxjb2RlPnRheG9ub215LmdldElkKCk8L2NvZGU+KSwgb3IgYQotCSAqIHJlZmVyZW5jZSBpdHNlbGYgYXMgc2lnbmlmaWVkIGJ5IGhhdmluZyBhIG5vbi1udWxsLAotCSAqIG5vbi1lbXB0eSByZWZlcmVuY2UgKDxjb2RlPnRheG9ub215LmdldFJlZigpPC9jb2RlPikuCi0JICogPHA+Ci0JICogSWYgdGhlIGdpdmVuIDxjb2RlPnRheG9ub215PC9jb2RlPiBpcyBhIGZ1bGwgbW9kZWwsCi0JICogdGhlbiBhIG5ldyA8Y29kZT5UYXhvbm9teTwvY29kZT4gaXMgcmV0dXJuZWQgc3VjaCB0aGF0Ci0JICogPHVsPgotCSAqIDxsaT48Y29kZT5nZXRSZWYoKTwvY29kZT4gZXF1YWxzIDxjb2RlPnRheG9ub215LmdldElkKCk8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+Z2V0TG9jYXRpb24oKTwvY29kZT4gaXMgbnVsbDwvbGk+Ci0JICogPGxpPjxjb2RlPmdldElkKCk8L2NvZGU+IGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogPHA+Ci0JICogSW4gdGhlIGdpdmVuIDxjb2RlPnRheG9ub215PC9jb2RlPiBpcyBpdHNlbGYgYSByZWZlcmVuY2UsCi0JICogdGhlbiBhIG5ldyA8Y29kZT5UYXhvbm9teTwvY29kZT4gaXMgcmV0dXJuZWQgc3VjaCB0aGF0Ci0JICogPHVsPgotCSAqIDxsaT48Y29kZT5nZXRSZWYoKTwvY29kZT4gZXF1YWxzIDxjb2RlPnRheG9ub215LmdldFJlZigpPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPmdldExvY2F0aW9uKCk8L2NvZGU+IGVxdWFscyA8Y29kZT50YXhvbm9teS5nZXRMb2NhdGlvbigpPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPmdldElkKCk8L2NvZGU+IGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogCi0JICogQHBhcmFtIHRheG9ub215IFRoZSA8Y29kZT5UYXhvbm9teTwvY29kZT4gbW9kZWwgdG8gY2xvbmUgb3IKLQkgKiByZWZlciB0byBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZ2l2ZW4gPGNvZGU+dGF4b25vbXk8L2NvZGU+Ci0JICogaXMgYSBmdWxsIG1vZGVsIG9yIGEgcmVmZXJlbmNlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGF4b25vbXk8L2NvZGU+LCBndWFyYW50ZWVkIHRvIGJlIGEgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBUYXhvbm9teSBuZXdUYXhvbm9teVJlZmVyZW5jZSAoIFRheG9ub215IHRheG9ub215ICkKLQl7Ci0JCVN0cmluZyBpZCA9IHRheG9ub215LmdldElkKCk7Ci0JCVN0cmluZyByZWYgPSB0YXhvbm9teS5nZXRSZWYoKTsKLQkJVGF4b25vbXkgdGF4b25vbXlSZWYgPSBuZXdUYXhvbm9teSgpOwotCQlpZiAocmVmID09IG51bGwgfHwgIiIuZXF1YWxzKHJlZikpCi0JCXsKLQkJCXRheG9ub215UmVmLnNldFJlZihpZCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl0YXhvbm9teVJlZi5zZXRSZWYocmVmKTsKLQkJCXRheG9ub215UmVmLnNldExvY2F0aW9uKHRheG9ub215LmdldExvY2F0aW9uKCkpOwotCQl9Ci0JCXJldHVybiB0YXhvbm9teVJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGdpdmVuIFVSTCBpZGVudGlmaWVzCi0JICogYSByZXNvdXJjZSB0aGF0IGV4aXN0cyBhbmQgaXMgYSBmaWxlLgotCSAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZS4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFVSTCByZXNvdXJjZSBleGlzdHMgYW5kIGlzIGEgZmlsZSwKLQkgKiBvciBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gZXhpc3RzICggVVJMIHVybCApCi0JewotCQlpZiAoInBsYXRmb3JtIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKQotCQl7Ci0JCQlTdHJpbmcgdXJsRmlsZSA9IHVybC5nZXRGaWxlKCkudHJpbSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVybEZpbGUpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA8PSAxKQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUlQYXRoIG9zUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRMb2NhdGlvbigpOwotCQkJaWYgKG9zUGF0aCA9PSBudWxsKQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG9zUGF0aC50b1N0cmluZygpKTsKLQkJCXJldHVybiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5pc0RpcmVjdG9yeSgpKTsKLQkJfQotCQllbHNlIGlmICgiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkKLQkJewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKS50cmltKCkpOwotCQkJcmV0dXJuIChmaWxlLmV4aXN0cygpICYmICFmaWxlLmlzRGlyZWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+IGZvciB3cml0aW5nIHRvCi0JICogdGhlIGdpdmVuIDxjb2RlPnVybDwvY29kZT4uCi0JICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byB3cml0ZS4KLQkgKiBAcmV0dXJuIEFuIE91cHR1dFN0cmVhbSB0byB3cml0ZSB0by4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZSBzdHJlYW0gY291bGQgbm90IGJlIG9wZW5lZC4KLQkgKi8KLQlzdGF0aWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvciAoIFVSTCB1cmwgKSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQlpZiAoInBsYXRmb3JtIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKQotCQl7Ci0JCQlTdHJpbmcgdXJsRmlsZSA9IHVybC5nZXRGaWxlKCkudHJpbSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVybEZpbGUpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA8PSAxKQotCQkJewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIFBsYXRmb3JtIFVSTCB7MH0gaXMgbm90IGJvdW5kIHRvIGEgbG9jYWwsIHdyaXRhYmxlIGZpbGUuIik7Ci0JCQl9Ci0JCQlJUGF0aCBvc1BhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChvc1BhdGggPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBQbGF0Zm9ybSBVUkwgezB9IGlzIG5vdCBib3VuZCB0byBhIGxvY2FsLCB3cml0YWJsZSBmaWxlLiIpOwotCQkJfQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUob3NQYXRoLnRvU3RyaW5nKCkpOwotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBQbGF0Zm9ybSBVUkwgezB9IGlzIGJvdW5kIHRvIGEgZm9sZGVyLiIpOwotCQkJfQotCQkJb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCX0KLQkJZWxzZSBpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpCi0JCXsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkudHJpbSgpKTsKLQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGUgRmlsZSBVUkwgezB9IGlzIGJvdW5kIHRvIGEgZGlyZWN0b3J5LiIpOwotCQkJfQotCQkJb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCWNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7Ci0JCQlvdXRwdXRTdHJlYW0gPSBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOwotCQl9Ci0JCXJldHVybiBvdXRwdXRTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGZvciByZWFkaW5nIGZyb20KLQkgKiB0aGUgZ2l2ZW4gPGNvZGU+dXJsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIHJlYWQuCi0JICogQHJldHVybiBBbiBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGUgc3RyZWFtIGNvdWxkIG5vdCBiZSBvcGVuZWQuCi0JICovCi0Jc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtRm9yICggVVJMIHVybCApIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIHVybC5vcGVuU3RyZWFtKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9VRERJUmVnaXN0cnlTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3JlZ2lzdHJ5L1VERElSZWdpc3RyeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzY2ExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3JlZ2lzdHJ5L1VERElSZWdpc3RyeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVGF4b25vbWllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci0KLS8qKgotICogVURESVJlZ2lzdHJ5U2VydmljZSBpcyBhbiBhZGp1bmN0IHRvIDxjb2RlPlJlZ2lzdHJ5U2VydmljZTwvY29kZT4uCi0gKiBDYWxsIHRoZSA8Y29kZT5SZWdpc3RyeVNlcnZpY2UuaW5zdGFuY2UoKTwvY29kZT4gc3RhdGljIG1ldGhvZCB0bwotICogZ2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAqIDxwPgotICogVURESVJlZ2lzdHJ5U2VydmljZSBwcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgdG8gZWFzZSB0aGUgY3JlYXRpb24KLSAqIG9mIG5ldyA8Y29kZT5VRERJUmVnaXN0cnk8L2NvZGU+IG1vZGVscyBhbmQgdGhlIG1hbmFnZW1lbnQgb2YgdGhlaXIKLSAqIHJlbGF0aW9uc2hpcHMgdG8gPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscy4KLSAqIDxwPgotICogVXRpbGl0eSBtZXRob2RzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgPGNvZGU+UmVnaXN0cnk8L2NvZGU+IGFuZAotICogPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscyBhcmUgb24gPGNvZGU+UmVnaXN0cnlTZXJ2aWNlPC9jb2RlPi4KLSAqIE1ldGhvZHMgZm9yIG1hbmFnaW5nIGFuIGluZGV4ZWQgZmFtaWx5IG9mIDxjb2RlPlJlZ2lzdHJ5PC9jb2RlPiBhbmQKLSAqIDxjb2RlPlRheG9ub215PC9jb2RlPiBtb2RlbHMgYXJlIG9uIDxjb2RlPklSZWdpc3RyeU1hbmFnZXI8L2NvZGU+LgotICogPHA+Ci0gKiBBIHR5cGljYWwgdXNlIG9mIDxjb2RlPlVERElSZWdpc3RyeVNlcnZpY2U8L2NvZGU+IGFuZCBpdHMgcmVsYXRlZAotICogY2xhc3NlcyB0byBjcmVhdGUgYW5kIHNhdmUgYSBuZXcgZmFtaWx5IG9mIG1vZGVscyBpczoKLSAqIDxibG9ja3F1b3RlPgotICogPGNvZGU+Ci0gKiBSZWdpc3RyeVNlcnZpY2UgcmVnaXN0cnlTZXJ2aWNlID0gUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk7Ci0gKiBVRERJUmVnaXN0cnlTZXJ2aWNlIHVkZGlSZWdpc3RyeVNlcnZpY2UgPSBVRERJUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk7Ci0gKiBVRERJUmVnaXN0cnkgdWRkaVJlZ2lzdHJ5ID0gdWRkaVJlZ2lzdHJ5U2VydmljZS5uZXdVRERJUmVnaXN0cnkoKTsKLSAqIC8vIGJ1aWxkIHVwIHlvdXIgcmVnaXN0cnkgbW9kZWwgaGVyZQotICogVGF4b25vbXkgdGF4b25vbXkgPSByZWdpc3RyeVNlcnZpY2UubmV3VGF4b25vbXkoKTsKLSAqIC8vIGJ1aWxkIHVwIHlvdXIgdGF4b25vbXkgbW9kZWwgaGVyZQotICogdWRkaVJlZ2lzdHJ5U2VydmljZS5hZGRUYXhvbm9teSh1ZGRpUmVnaXN0cnksdGF4b25vbXkpOwotICogSVJlZ2lzdHJ5TWFuYWdlciByZWdpc3RyeU1hbmFnZXIgPSByZWdpc3RyeVNlcnZpY2UuZ2V0RGVmYXVsdFJlZ2lzdHJ5TWFuYWdlcigpOwotICogcmVnaXN0cnlNYW5hZ2VyLnNhdmVSZWdpc3RyeSh1ZGRpUmVnaXN0cnkpOwotICogPC9jb2RlPgotICogPC9ibG9ja3F1b3RlPgotICogQHNlZSAjaW5zdGFuY2UoKQotICogQHNlZSBSZWdpc3RyeVNlcnZpY2UKLSAqIEBzZWUgSVJlZ2lzdHJ5TWFuYWdlcgotICogQHNlZSBVRERJUmVnaXN0cnkKLSAqIEBzZWUgVGF4b25vbXkKLSAqIEBhdXRob3IgY2JyZWFsZXkKLSAqLwotcHVibGljIGNsYXNzIFVERElSZWdpc3RyeVNlcnZpY2UKLXsKLQlwcml2YXRlIHN0YXRpYyBVRERJUmVnaXN0cnlTZXJ2aWNlIGluc3RhbmNlXzsKLQotCS8qKgotCSAqIEEgVURESVJlZ2lzdHJ5U2VydmljZSBjYW5ub3QgYmUgZGlyZWN0bHkgY29uc3RydWN0ZWQuCi0JICogVXNlIEBsaW5rICNpbnN0YW5jZSgpIHRvIGdldCB0aGUgc2luZ2xldG9uIG9mIHRoaXMgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBVRERJUmVnaXN0cnlTZXJ2aWNlICgpCi0JewotCQlVRERJUmVnaXN0cnlQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBvZiB0aGlzIGNsYXNzLgotCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBvZiB0aGlzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVURESVJlZ2lzdHJ5U2VydmljZSBpbnN0YW5jZSAoKQotCXsKLQkJaWYgKGluc3RhbmNlXyA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YW5jZV8gPSBuZXcgVURESVJlZ2lzdHJ5U2VydmljZSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZV87Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgYSByZWZlcmVuY2UgZnJvbSB0aGUgZ2l2ZW4gPGNvZGU+VURESVJlZ2lzdHJ5PC9jb2RlPgotCSAqIHRvIHRoZSBnaXZlbiA8Y29kZT5UYXhvbm9teTwvY29kZT4gb2JqZWN0LgotCSAqIEBwYXJhbSB1ZGRpUmVnaXN0cnkgVGhlIDxjb2RlPlVERElSZWdpc3RyeTwvY29kZT4gdG8gd2hpY2ggdGhlIHJlZmVyZW5jZQotCSAqIHRvIHRoZSBnaXZlbiA8Y29kZT5UYXhvbm9teTwvY29kZT4gb2JqZWN0IHNob3VsZCBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gdGF4b25vbXkgVGhlIDxjb2RlPlRheG9ub215PC9jb2RlPiBvYmplY3QgdG8gYWRkLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vdmVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVGF4b25vbXkgKCBVRERJUmVnaXN0cnkgdWRkaVJlZ2lzdHJ5LCBUYXhvbm9teSB0YXhvbm9teSApCi0JewotCQlhZGRUYXhvbm9taWVzKHVkZGlSZWdpc3RyeSxuZXcgVGF4b25vbXlbXSB7dGF4b25vbXl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiA8Y29kZT5UYXhvbm9teTwvY29kZT4gb2JqZWN0cyBhcy1pcwotCSAqICh3aGV0aGVyIHRoZXkgYXJlIHJlZmVyZW5jZXMgb3IgZnVsbCBtb2RlbHMpCi0JICogdG8gdGhlIGdpdmVuIDxjb2RlPlVERElSZWdpc3RyeTwvY29kZT4uCi0JICogQHBhcmFtIHVkZGlSZWdpc3RyeSBUaGUgPGNvZGU+VURESVJlZ2lzdHJ5PC9jb2RlPiB0byB3aGljaAotCSAqIHRoZSBnaXZlbiA8Y29kZT5UYXhvbm9teTwvY29kZT4gb2JqZWN0cyBzaG91bGQgYmUgYWRkZWQuCi0JICogQHBhcmFtIHRheG9ub21pZXMgVGhlIGFycmF5IG9mIDxjb2RlPlRheG9ub215PC9jb2RlPiBvYmplY3RzIHRvIGFkZC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb3ZlbC52MTAudWRkaXJlZ2lzdHJ5LlVERElSZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRheG9ub21pZXMgKCBVRERJUmVnaXN0cnkgdWRkaVJlZ2lzdHJ5LCBUYXhvbm9teVtdIHRheG9ub21pZXMgKQotCXsKLQkJaWYgKHRheG9ub21pZXMubGVuZ3RoID4gMCkKLQkJewotCQkJVGF4b25vbWllcyB0YXhvbm9teVNldCA9IHVkZGlSZWdpc3RyeS5nZXRUYXhvbm9taWVzKCk7Ci0JCQlpZiAodGF4b25vbXlTZXQgPT0gbnVsbCkKLQkJCXsKLQkJCQl0YXhvbm9teVNldCA9IFVERElSZWdpc3RyeUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRheG9ub21pZXMoKTsKLQkJCQl1ZGRpUmVnaXN0cnkuc2V0VGF4b25vbWllcyh0YXhvbm9teVNldCk7Ci0JCQl9Ci0JCQlFTGlzdCBsaXN0ID0gdGF4b25vbXlTZXQuZ2V0VGF4b25vbXkoKTsKLQkJCWZvciAoaW50IGk9MDsgaTx0YXhvbm9taWVzLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCWxpc3QuYWRkKHRheG9ub21pZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgVVJJIGlkZW50aWZpZXJzIHRvIDxjb2RlPlRheG9ub215PC9jb2RlPgotCSAqIG1vZGVscyBjb250YWluZWQgaW4gb3IgcmVmZXJlbmNlZCBieSB0aGUgPGNvZGU+dWRkaVJlZ2lzdHJ5PC9jb2RlPi4KLQkgKiBQYXNzaW5nIHRoZSByZXN1bHQgdG8gPGNvZGU+SVJlZ2lzdHJ5TWFuYWdlci5sb2FkVGF4b25vbWllcygpPC9jb2RlPgotCSAqIGlzIGEgaGFuZHkgd2F5IHRvIHJlc29sdmUgYW5kIGxvYWQgdGhlIGZ1bGwgdGF4b25vbXkgbW9kZWxzIHVzZWQKLQkgKiBieSB0aGUgVURESSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFVSSSBpZGVudGlmaWVycywgcG9zc2libHkgZW1wdHkgYnV0IG5ldmVyIG51bGwsCi0JICogdG8gPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscy4KLQkgKiBAc2VlIFRheG9ub215Ci0JICogQHNlZSBJUmVnaXN0cnlNYW5hZ2VyI2xvYWRUYXhvbm9taWVzKFN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRUYXhvbm9teVVSSXMgKCBVRERJUmVnaXN0cnkgdWRkaVJlZ2lzdHJ5ICkKLQl7Ci0JCVRheG9ub21pZXMgdGF4b25vbWllcyA9IHVkZGlSZWdpc3RyeS5nZXRUYXhvbm9taWVzKCk7Ci0JCWlmICh0YXhvbm9taWVzID09IG51bGwpIHJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlFTGlzdCB0YXhvbm9teUxpc3QgPSB0YXhvbm9taWVzLmdldFRheG9ub215KCk7Ci0JCUxpc3QgdGF4b25vbXlVUklzID0gbmV3IEFycmF5TGlzdCh0YXhvbm9teUxpc3Quc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaSA9IHRheG9ub215TGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpCi0JCXsKLQkJCVRheG9ub215IHRheG9ub215ID0gKFRheG9ub215KWkubmV4dCgpOwotCQkJaWYgKHRheG9ub215LmdldElkKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQl0YXhvbm9teVVSSXMuYWRkKHRheG9ub215LmdldElkKCkpOwotCQkJfQotCQkJZWxzZSBpZiAodGF4b25vbXkuZ2V0UmVmKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQl0YXhvbm9teVVSSXMuYWRkKHRheG9ub215LmdldFJlZigpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKXRheG9ub215VVJJcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZnVsbCA8Y29kZT5UYXhvbm9teTwvY29kZT4gbW9kZWxzCi0JICogY29udGFpbmVkIGluIG9yIHJlZmVyZW5jZWQgYnkgdGhlIGdpdmVuIDxjb2RlPnVkZGlSZWdpc3RyeTwvY29kZT4uCi0JICogSW5saW5lIHRheG9ub21pZXMgYXJlIHJldHVybmVkIGFzLWlzLiBSZWZlcmVuY2VzIHRvIHRheG9ub21pZXMgYXJlCi0JICogcmVzb2x2ZWQgYnkgZm9sbG93aW5nIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHJlZmVyZW5jZXMgYW5kIGxvYWRpbmcKLQkgKiB0aGUgbW9kZWxzIGF0IHRoZSBsb2NhdGlvbiBVUkxzLgotCSAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCwgYnV0IG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSA8Y29kZT5VRERJUmVnaXN0cnk8L2NvZGU+IHdob3NlCi0JICogPGNvZGU+VGF4b25vbXk8L2NvZGU+IG1vZGVscyB0byBmaW5kLgotCSAqIEByZXR1cm4gVGhlIGFycmF5LCBuZXZlciBudWxsIGJ1dCBwb3NzaWJseSBsZW5ndGggemVybywKLQkgKiBvZiA8Y29kZT5UYXhvbm9teTwvY29kZT4gbW9kZWxzLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vdmVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LlRheG9ub215Ci0JICogQHNlZSAjZ2V0VGF4b25vbXlVUklzKFVERElSZWdpc3RyeSkKLQkgKiBAc2VlIElSZWdpc3RyeU1hbmFnZXIjbG9hZFRheG9ub21pZXMoU3RyaW5nW10pCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgc3VmZmVycyBmcm9tIGEgbGFjayBvZiBhd2FyZW5lc3Mgb2YgdGhlCi0JICogSW5kZXggWE1MIGRvY3VtZW50IHRoYXQgaXMgb2Z0ZW4gcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgVVJJcwotCSAqIHRvIGxvY2F0aW9uIFVSTHMuIFVzZQotCSAqIDxjb2RlPklSZWdpc3RyeU1hbmFnZXIubG9hZFRheG9ub21pZXMoZ2V0VGF4b25vbXlVUklzKHVkZGlSZWdpc3RyeSkpPC9jb2RlPgotCSAqIGluc3RlYWQuCi0JICovCi0JcHVibGljIFRheG9ub215W10gZ2V0VGF4b25vbWllcyAoIFVERElSZWdpc3RyeSB1ZGRpUmVnaXN0cnkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJUmVnaXN0cnlTZXJ2aWNlIHJlZ2lzdHJ5U2VydmljZSA9IFJlZ2lzdHJ5U2VydmljZS5pbnN0YW5jZSgpOwotCQlUYXhvbm9taWVzIHRheG9ub21pZXMgPSB1ZGRpUmVnaXN0cnkuZ2V0VGF4b25vbWllcygpOwotCQlpZiAodGF4b25vbWllcyA9PSBudWxsKSByZXR1cm4gbmV3IFRheG9ub215WzBdOwotCQlFTGlzdCBsaXRlcmFsVGF4b25vbXlMaXN0ID0gdGF4b25vbWllcy5nZXRUYXhvbm9teSgpOwotCQlMaXN0IHJlc29sdmVkVGF4b25vbXlMaXN0ID0gbmV3IEFycmF5TGlzdChsaXRlcmFsVGF4b25vbXlMaXN0LnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGkgPSBsaXRlcmFsVGF4b25vbXlMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkKLQkJewotCQkJVGF4b25vbXkgbGl0ZXJhbFRheG9ub215ID0gKFRheG9ub215KWkubmV4dCgpOwotCQkJaWYgKGxpdGVyYWxUYXhvbm9teS5nZXRJZCgpICE9IG51bGwpCi0JCQl7Ci0JCQkJcmVzb2x2ZWRUYXhvbm9teUxpc3QuYWRkKGxpdGVyYWxUYXhvbm9teSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXRlcmFsVGF4b25vbXkuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJVGF4b25vbXkgcmVzb2x2ZWRUYXhvbm9teSA9IHJlZ2lzdHJ5U2VydmljZS5sb2FkVGF4b25vbXkobmV3IFVSTChsaXRlcmFsVGF4b25vbXkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQlyZXNvbHZlZFRheG9ub215TGlzdC5hZGQocmVzb2x2ZWRUYXhvbm9teSk7Ci0JCQkJfQotCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCS8vVE9ETzogTmVlZCBtZXNzYWdlIHRleHQgaGVyZQotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdTUGx1Z2luLklELCAwLCAiIiwgZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKFRheG9ub215W10pcmVzb2x2ZWRUYXhvbm9teUxpc3QudG9BcnJheShuZXcgVGF4b25vbXlbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IDxjb2RlPlVERElSZWdpc3RyeTwvY29kZT4gbW9kZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5VRERJUmVnaXN0cnk8L2NvZGU+IG1vZGVsLCBuZXZlciBudWxsLgotCSAqLwotCXB1YmxpYyBVRERJUmVnaXN0cnkgbmV3VURESVJlZ2lzdHJ5ICgpCi0JewotCQlyZXR1cm4gVURESVJlZ2lzdHJ5RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVURESVJlZ2lzdHJ5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9VRERJVGF4b25vbXlGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcmVnaXN0cnkvVURESVRheG9ub215RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNGNlODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9yZWdpc3RyeS9VRERJVGF4b25vbXlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+SVRheG9ub215RmluZGVyPC9jb2RlPiBmb3IgVURESSByZWdpc3RyaWVzCi0gKiByZXR1cm5zIGFuIGFycmF5IG9mIDxjb2RlPlRheG9ub215PC9jb2RlPgotICogbW9kZWxzIHVzZWQgKHN1cHBvcnRlZCBieSkgdGhlIHJlZ2lzdHJ5LgotICogQGF1dGhvciBnaWxiZXJ0YUBjYS5pYm0uY29tCi0gKiBAc2VlIFVERElSZWdpc3RyeQotICovCi1wdWJsaWMgY2xhc3MgVURESVRheG9ub215RmluZGVyIGltcGxlbWVudHMgSVRheG9ub215RmluZGVyCi17Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnJlZ2lzdHJ5LklUYXhvbm9teUZpbmRlciN0YXhvbm9taWVzKG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAucmVnaXN0cnkuUmVnaXN0cnkpCi0JICovCi0JcHVibGljIFRheG9ub215W10gdGF4b25vbWllcyAoIFJlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLQl7Ci0JCWlmICggcmVnaXN0cnkgaW5zdGFuY2VvZiBVRERJUmVnaXN0cnkgKQotCQl7Ci0JCQlVRERJUmVnaXN0cnkgdWRkaVJlZ2lzdHJ5ID0gKFVERElSZWdpc3RyeSlyZWdpc3RyeTsJICAKLQkJCXJldHVybiAoVGF4b25vbXlbXSl1ZGRpUmVnaXN0cnkuZ2V0VGF4b25vbWllcygpLmdldFRheG9ub215KCkudG9BcnJheShuZXcgVGF4b25vbXlbMF0pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NmaW5kZXIvQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9BYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDQ2NzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9BYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTcgICAxMjc0NTYgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqIDIwMDYwNjIwICAgMTQ3ODYyIGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpvYW4KLSAqIAotICogSW1wbGVtZW50YXRpb24gb2YgSVdlYlNlcnZpY2VMb2NhdG9yLiAgRXh0ZW5kZXJzIG11c3QgaW1wbGVtZW50IHRoZSBhYnN0cmFjdCBtZXRob2QgZ2V0V2ViU2VydmljZXMoKS4gIAotICogVGhpcyBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gcHJvdmlkZSBtZXRob2RzIHVzZWZ1bCB0byBsb2NhdG9yIGltcGxlbWVudGVycy4gIEV4dGVuZGVycyBzaG91bGQgcmVnaXN0ZXIgdGhlaXIKLSAqIGxvY2F0b3IgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVpciBwbHVnaW4gdXNpbmcgdGhlIG9yZy5lY2xpcHNlLndzdC53cy5sb2NhdG9yIGV4dGVuc2lvbiBwb2ludC4gCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvciBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlTG9jYXRvciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JICovCi0JcHVibGljIEFic3RyYWN0V2ViU2VydmljZUxvY2F0b3IgKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cy4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCdzCi0JICogZGVmYXVsdCBiZWhhdmlvdXIgb2YgcmV0dXJuaW5nIGFuIGVtcHR5IGxpc3QuCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLAotCSAqIG9yIG51bGwgaWYgcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiBAcmV0dXJuIEEgbm9uLW51bGwgYnV0IHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VDbGllbnRzICggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFdlYlNlcnZpY2VDbGllbnRJbmZvIG9iamVjdHMuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QncwotCSAqIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHJldHVybmluZyBhbiBlbXB0eSBsaXN0LgotCSAqIEBwYXJhbSBwcm9qZWN0cyBPbmUgb3IgbW9yZSBwcm9qZWN0cyB0byB3aGljaAotCSAqIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGxpbWl0ZWQuCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLAotCSAqIG9yIG51bGwgaWYgcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiBAcmV0dXJuIEEgbm9uLW51bGwgYnV0IHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VDbGllbnRzICggSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMuIAotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kJ3MKLQkgKiBkZWZhdWx0IGJlaGF2aW91ciBvZiByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdC4KLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsCi0JICogb3IgbnVsbCBpZiBwcm9ncmVzcyBtb25pdG9yaW5nIGlzIG5vdCBkZXNpcmVkLgotCSAqIEByZXR1cm4gQSBub24tbnVsbCBidXQgcG9zc2libHkgZW1wdHkgbGlzdCBvZiBXZWJTZXJ2aWNlSW5mbyBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViU2VydmljZXMgKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCXsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMuIAotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kJ3MKLQkgKiBkZWZhdWx0IGJlaGF2aW91ciBvZiByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdC4KLQkgKiBAcGFyYW0gcHJvamVjdHMgT25lIG9yIG1vcmUgcHJvamVjdHMgdG8gd2hpY2gKLQkgKiB0aGUgc2VhcmNoIHNob3VsZCBiZSBsaW1pdGVkLgotCSAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciwKLQkgKiBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBIG5vbi1udWxsIGJ1dCBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlcyAoIElQcm9qZWN0W10gcHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0JewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9JV2ViU2VydmljZUxvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NmaW5kZXIvSVdlYlNlcnZpY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNTMzMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9JV2ViU2VydmljZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTcgICAxMjc0NTYgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqIDIwMDYwNjIwICAgMTQ3ODYyIGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEBhdXRob3Igam9hbgotICoKLSAqIEludGVyZmFjZSBmb3IgV2ViIHNlcnZpY2UgbG9jYXRvcnMgdGhhdCB3aWxsIGJlIHJldHJpZXZlZAotICogYnkgdGhlIFdlYlNlcnZpY2VGaW5kZXIuIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBub3QgYmUKLSAqIGltcGxlbWVudGVkIGRpcmVjdGx5LiBJbnN0ZWFkLCBzdWJjbGFzc2VzIHNob3VsZCBleHRlbmQKLSAqIEFic3RyYWN0V2ViU2VydmljZUxvY2F0b3IgYW5kIGltcGxlbWVudCB0aGUKLSAqIGdldFdlYlNlcnZpY2VzKCkgYW5kIGdldFdlYlNlcnZpY2VDbGllbnRzKCkgbWV0aG9kcy4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VMb2NhdG9yCi17Ci0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cy4KLQkgKiBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgbG9uZyBydW5uaW5nLgotCSAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciwKLQkgKiBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cy4KLQkgKiBwb3NzaWJseSBlbXB0eSwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlQ2xpZW50cyAoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFdlYlNlcnZpY2VDbGllbnRJbmZvIG9iamVjdHMuCi0JICogVGhpcyBvcGVyYXRpb24gbWF5IGJlIGxvbmcgcnVubmluZy4KLQkgKiBAcGFyYW0gcHJvamVjdHMgT25lIG9yIG1vcmUgcHJvamVjdHMgdG8gd2hpY2ggdGhlCi0JICogc2VhcmNoIHNob3VsZCBiZSBsaW1pdGVkLgotCSAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciwKLQkgKiBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cy4KLQkgKiBwb3NzaWJseSBlbXB0eSwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlQ2xpZW50cyAoIElQcm9qZWN0W10gcHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMuCi0JICogVGhpcyBvcGVyYXRpb24gbWF5IGJlIGxvbmcgcnVubmluZy4KLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsCi0JICogb3IgbnVsbCBpZiBwcm9ncmVzcyBtb25pdG9yaW5nIGlzIG5vdCBkZXNpcmVkLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMsCi0JICogcG9zc2libHkgZW1wdHksIHBvc3NpYmx5IG51bGwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViU2VydmljZXMgKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMuCi0JICogVGhpcyBvcGVyYXRpb24gbWF5IGJlIGxvbmcgcnVubmluZy4KLQkgKiBAcGFyYW0gcHJvamVjdHMgT25lIG9yIG1vcmUgcHJvamVjdHMgdG8gd2hpY2ggdGhlCi0JICogc2VhcmNoIHNob3VsZCBiZSBsaW1pdGVkLgotCSAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciwKLQkgKiBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgV2ViU2VydmljZUluZm8gb2JqZWN0cywKLQkgKiBwb3NzaWJseSBlbXB0eSwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlcyAoIElQcm9qZWN0W10gcHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9XZWJTZXJ2aWNlQ2F0ZWdvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NmaW5kZXIvV2ViU2VydmljZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNTg1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9XZWJTZXJ2aWNlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMzE3ICAgMTI3NDU2IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgY2JyZWFsZXkKLSAqIEEgV2ViU2VydmljZUNhdGVnb3J5IHJlcHJlc2VudHMgYSBkZWZpbmVkIGNhdGVnb3J5IG9mCi0gKiBXZWIgc2VydmljZSBsb2NhdG9ycyBwbHVnZ2VkIGludG8gdGhlIFdlYlNlcnZpY2VGaW5kZXIKLSAqIGZyYW1ld29yay4gRWFjaCBjYXRlZ29yeSBoYXMgYSBub24tdHJhbnNsYXRhYmxlIGlkZW50aWZpZXIsCi0gKiBhbiBvcHRpb25hbCBub24tdHJhbnNsYXRhYmxlIHBhcmVudCBjYXRlZ29yeSBpZGVudGlmaWVyCi0gKiAoYWJzZW50IGZvciByb290IGNhdGVnb3JpZXMpLCBhIHRyYW5zbGF0YWJsZSBzaG9ydCBsYWJlbCwKLSAqIGEgdHJhbnNsYXRhYmxlIGxvbmcgZGVzY3JpcHRpb24gYW5kIGFuIGljb24uCi0gKiBAc2VlIFdlYlNlcnZpY2VGaW5kZXIjZ2V0V2ViU2VydmljZUNhdGVnb3JpZXMoKSAKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDYXRlZ29yeQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0xBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgaWNlXzsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFdlYlNlcnZpY2VDYXRlZ29yeSBmb3IgdGhlIGdpdmVuCi0JICogY29uZmlndXJhdGlvbiBlbGVtZW50IGZyb20gdGhlIGV4dGVuc2lvbiByZWdpc3RyeS4KLQkgKiBAcGFyYW0gaWNlIFRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgb24gd2hpY2ggdGhpcwotCSAqIG5ldyBXZWJTZXJ2aWNlQ2F0ZWdvcnkgaXMgYmFzZWQuIAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQ2F0ZWdvcnkgKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgaWNlICkKLQl7Ci0JCWljZV8gPSBpY2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vbi10cmFuc2xhdGFibGUgaWRlbnRpZmllciBvZiB0aGlzIGNhdGVnb3J5LgotCSAqIEByZXR1cm4gVGhlIG5vbi10cmFuc2xhdGFibGUgaWRlbnRpZmllciBvZiB0aGlzIGNhdGVnb3J5LgotCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGJlIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCAoKQotCXsKLQkJcmV0dXJuIGljZV8uZ2V0QXR0cmlidXRlQXNJcyhBVFRSSUJVVEVfSUQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBub24tdHJhbnNsYXRhYmxlIGlkZW50aWZpZXIgb2YgdGhpcyBjYXRlZ29yeSdzCi0JICogaW1tZWRpYXRlIHBhcmVudCBjYXRlZ29yeSwgb3IgbnVsbCBpZiB0aGlzIGlzIGEgcm9vdCBjYXRlZ29yeQotCSAqIGFuZCwgYXMgc3VjaCwgaGFzIG5vIHBhcmVudCBjYXRlZ29yeS4KLQkgKiBAcmV0dXJuIFRoZSBub24tdHJhbnNsYXRhYmxlIGlkZW50aWZpZXIgb2YgdGhpcyBjYXRlZ29yeSdzCi0JICogcGFyZW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRJZCAoKQotCXsKLQkJcmV0dXJuIGljZV8uZ2V0QXR0cmlidXRlQXNJcyhBVFRSSUJVVEVfQ0FURUdPUlkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgY2F0ZWdvcnkncyBpbW1lZGlhdGUgcGFyZW50IFdlYlNlcnZpY2VDYXRlZ29yeSwgb3IKLQkgKiBudWxsIGlmIHRoaXMgaXMgYSByb290IGNhdGVnb3J5IGFuZCwgYXMgc3VjaCwgaGFzIG5vIHBhcmVudCBjYXRlZ29yeS4KLQkgKiBAcmV0dXJuIFRoaXMgY2F0ZWdvcnkncyBpbW1lZGlhdGUgcGFyZW50IFdlYlNlcnZpY2VDYXRlZ29yeSwgb3IKLQkgKiBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VDYXRlZ29yeSBnZXRQYXJlbnQgKCkKLQl7Ci0JCXJldHVybiBXZWJTZXJ2aWNlRmluZGVyLmluc3RhbmNlKCkuZ2V0V2ViU2VydmljZUNhdGVnb3J5QnlJZChnZXRQYXJlbnRJZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZXJuYXRpb25hbGl6ZWQgc2hvcnQgbGFiZWwgb2YgdGhpcyBjYXRlZ29yeSwKLQkgKiBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuIE5vdGUgdGhhdCB1c2VyIGludGVyZmFjZXMgbWF5Ci0JICogY2hvb3NlIHRvIGJ5cGFzcyBjYXRlZ29yaWVzIHRoYXQgZG8gbm90IGhhdmUgYSBsYWJlbC4KLQkgKiBAcmV0dXJuIFRoZSBpbnRlcm5hdGlvbmFsaXplZCBzaG9ydCBsYWJlbCBvZiB0aGlzIGNhdGVnb3J5LAotCSAqIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsICgpCi0JewotCQlyZXR1cm4gaWNlXy5nZXRBdHRyaWJ1dGVBc0lzKEFUVFJJQlVURV9MQUJFTCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVybmF0aW9uYWxpemVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgY2F0ZWdvcnksCi0JICogb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgotCSAqIEByZXR1cm4gVGhlIGludGVybmF0aW9uYWxpemVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgY2F0ZWdvcnksCi0JICogb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLQl7Ci0JCXJldHVybiBpY2VfLmdldEF0dHJpYnV0ZUFzSXMoQVRUUklCVVRFX0RFU0NSSVBUSU9OKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWNvbiBvZiB0aGlzIGNhdGVnb3J5LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0JICogQHJldHVybiBUaGUgaWNvbiBvZiB0aGlzIGNhdGVnb3J5LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJY29uICgpCi0JewotCQlyZXR1cm4gaWNlXy5nZXRBdHRyaWJ1dGVBc0lzKEFUVFJJQlVURV9JQ09OKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzZmluZGVyL1dlYlNlcnZpY2VGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NmaW5kZXIvV2ViU2VydmljZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTBkOTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NmaW5kZXIvV2ViU2VydmljZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTcgICAxMjc0NTYgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqIDIwMDYwNjIwICAgMTQ3ODYyIGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEBhdXRob3Igam9hbgotICoKLSAqIFdlYlNlcnZpY2VGaW5kZXIgaXMgYSBzaW5nbGV0b24gd2hpY2ggZmluZHMgYWxsIGV4dGVuZGVycyBhbmQgcmV0dXJucyBhIGNvbXByZWhlbnNpdmUgbGlzdCBvZiBXZWJTZXJ2aWNlSW5mbyBvYmplY3RzLgotICogRmluZHMgd2ViIHNlcnZpY2VzIGJ5IGNhbGxpbmcgbG9jYXRvcnMgZXh0ZW5kaW5nIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXIuQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvcn0gCi0gKiB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NmaW5kZXIuV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRmluZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VGaW5kZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTE9DQVRPUiA9ICJ3ZWJTZXJ2aWNlTG9jYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DQVRFR09SWSA9ICJ3ZWJTZXJ2aWNlTG9jYXRvckNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0NBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogUHVibGljIGNvbnN0cnVjdGlvbiBpcyBub3QgYWxsb3dlZC4KLQkgKiBVc2UgV2ViU2VydmljZUZpbmRlci5pbnN0YW5jZSgpLgotCSAqLwotCXByaXZhdGUgV2ViU2VydmljZUZpbmRlciAoKQkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIG9mIDxjb2RlPldlYlNlcnZpY2VGaW5kZXI8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBvZiA8Y29kZT5XZWJTZXJ2aWNlRmluZGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VGaW5kZXIgaW5zdGFuY2UgKCkKLQl7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YW5jZSA9IG5ldyBXZWJTZXJ2aWNlRmluZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlSW5mbyBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCB3ZWIgc2VydmljZXMgZm91bmQgYnkgbG9jYXRvcnMgdGhhdAotCSAqIGhhdmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUgb3JnLmVjbGlwc2Uud3N0LndzLmxvY2F0b3IgZXh0ZW5zaW9uIHBvaW50LiAgQ3VycmVudGx5IHJldHVybnMgYWxsIHdlYiAKLQkgKiBzZXJ2aWNlcyBmb3VuZCBmb3IgYWxsIHJlZ2lzdGVyZWQgbG9jYXRvcnMuICBMb2NhdG9ycyBtdXN0IGV4dGVuZCB7QGxpbmsgQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvcn0uCi0JICogQ2FsbGVycyBjYW4gdXNlIHRoZSBnZXR0ZXIgbWV0aG9kcyBvbiB0aGUgV2ViU2VydmljZUluZm8gb2JqZWN0IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSAKLQkgKiB3ZWIgc2VydmljZXMgZm91bmQuICBUaGUgV2ViU2VydmljZUZpbmRlciBjYW5ub3QgZ3VhcmFudGVlIHRoZSBsZXZlbCBvZiBkZXRhaWwgY29udGFpbmVkIGluIFdlYlNlcnZpY2VJbmZvCi0JICogb2JqZWN0cyByZXR1cm5lZC4gIFRoaXMgaXMgbGVmdCB0byB0aGUgbG9jYXRvciBpbXBsZW1lbnRhdGlvbnMuCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlSW5mbyBvYmplY3RzLCBuZXZlciBudWxsLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRXZWJTZXJ2aWNlcyAoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0JewotCQlyZXR1cm4gZ2V0V2ViU2VydmljZXNCeUNhdGVnb3J5SWQobnVsbCxtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlSW5mbyBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCB3ZWIgc2VydmljZXMgZm91bmQgYnkgbG9jYXRvcnMgdGhhdAotCSAqIGhhdmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUgb3JnLmVjbGlwc2Uud3N0LndzLmxvY2F0b3IgZXh0ZW5zaW9uIHBvaW50LiAgQ3VycmVudGx5IHJldHVybnMgYWxsIHdlYiAKLQkgKiBzZXJ2aWNlcyBmb3VuZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZ2l2ZW4gcHJvamVjdHMgZm9yIGFsbCByZWdpc3RlcmVkIGxvY2F0b3JzLgotCSAqIExvY2F0b3JzIG11c3QgZXh0ZW5kIHtAbGluayBBYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yfS4KLQkgKiBDYWxsZXJzIGNhbiB1c2UgdGhlIGdldHRlciBtZXRob2RzIG9uIHRoZSBXZWJTZXJ2aWNlSW5mbyBvYmplY3QgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIAotCSAqIHdlYiBzZXJ2aWNlcyBmb3VuZC4gIFRoZSBXZWJTZXJ2aWNlRmluZGVyIGNhbm5vdCBndWFyYW50ZWUgdGhlIGxldmVsIG9mIGRldGFpbCBjb250YWluZWQgaW4gV2ViU2VydmljZUluZm8KLQkgKiBvYmplY3RzIHJldHVybmVkLiAgVGhpcyBpcyBsZWZ0IHRvIHRoZSBsb2NhdG9yIGltcGxlbWVudGF0aW9ucy4KLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMsIG5ldmVyIG51bGwuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldFdlYlNlcnZpY2VzICggSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlc0J5Q2F0ZWdvcnlJZChudWxsLHByb2plY3RzLG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMgd2hpY2ggcmVwcmVzZW50IHdlYiBzZXJ2aWNlcyBmb3VuZCBieSBsb2NhdG9ycyB0aGF0Ci0JICogaGF2ZSByZWdpc3RlcmVkIHVzaW5nIHRoZSBvcmcuZWNsaXBzZS53c3Qud3MubG9jYXRvciBleHRlbnNpb24gcG9pbnQgdW5kZXIgdGhlIGdpdmVuIGNhdGVnb3J5LgotCSAqIExvY2F0b3JzIG11c3QgZXh0ZW5kIHtAbGluayBBYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yfS4KLQkgKiBDYWxsZXJzIGNhbiB1c2UgdGhlIGdldHRlciBtZXRob2RzIG9uIHRoZSBXZWJTZXJ2aWNlSW5mbyBvYmplY3QgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIAotCSAqIHdlYiBzZXJ2aWNlcyBmb3VuZC4gIFRoZSBXZWJTZXJ2aWNlRmluZGVyIGNhbm5vdCBndWFyYW50ZWUgdGhlIGxldmVsIG9mIGRldGFpbCBjb250YWluZWQgaW4gV2ViU2VydmljZUluZm8KLQkgKiBvYmplY3RzIHJldHVybmVkLiAgVGhpcyBpcyBsZWZ0IHRvIHRoZSBsb2NhdG9yIGltcGxlbWVudGF0aW9ucy4KLQkgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IG9mIGxvY2F0b3JzIHRvIHVzZS4KLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMsIG5ldmVyIG51bGwuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldFdlYlNlcnZpY2VzQnlDYXRlZ29yeSAoIFdlYlNlcnZpY2VDYXRlZ29yeSBjYXRlZ29yeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICApCi0JewotCQlyZXR1cm4gZ2V0V2ViU2VydmljZXNCeUNhdGVnb3J5SWQoY2F0ZWdvcnkgPT0gbnVsbCA/IG51bGwgOiBjYXRlZ29yeS5nZXRJZCgpLG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUluZm8gb2JqZWN0cyB3aGljaCByZXByZXNlbnQgd2ViIHNlcnZpY2VzIGZvdW5kIGJ5IGxvY2F0b3JzIHRoYXQKLQkgKiBoYXZlIHJlZ2lzdGVyZWQgdXNpbmcgdGhlIG9yZy5lY2xpcHNlLndzdC53cy5sb2NhdG9yIGV4dGVuc2lvbiBwb2ludCB1bmRlciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCi0JICogVGhlIHNlYXJjaCBpcyBjb25zdHJhaW5lZCB0byB0aGUgZ2l2ZW4gc2V0IG9mIG9uZSBvciBtb3JlIHByb2plY3RzLgotCSAqIExvY2F0b3JzIG11c3QgZXh0ZW5kIHtAbGluayBBYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yfS4KLQkgKiBDYWxsZXJzIGNhbiB1c2UgdGhlIGdldHRlciBtZXRob2RzIG9uIHRoZSBXZWJTZXJ2aWNlSW5mbyBvYmplY3QgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIAotCSAqIHdlYiBzZXJ2aWNlcyBmb3VuZC4gIFRoZSBXZWJTZXJ2aWNlRmluZGVyIGNhbm5vdCBndWFyYW50ZWUgdGhlIGxldmVsIG9mIGRldGFpbCBjb250YWluZWQgaW4gV2ViU2VydmljZUluZm8KLQkgKiBvYmplY3RzIHJldHVybmVkLiAgVGhpcyBpcyBsZWZ0IHRvIHRoZSBsb2NhdG9yIGltcGxlbWVudGF0aW9ucy4KLQkgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IG9mIGxvY2F0b3JzIHRvIHVzZS4KLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMsIG5ldmVyIG51bGwuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldFdlYlNlcnZpY2VzQnlDYXRlZ29yeSAoIFdlYlNlcnZpY2VDYXRlZ29yeSBjYXRlZ29yeSwgSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICApCi0JewotCQlyZXR1cm4gZ2V0V2ViU2VydmljZXNCeUNhdGVnb3J5SWQoY2F0ZWdvcnkgPT0gbnVsbCA/IG51bGwgOiBjYXRlZ29yeS5nZXRJZCgpLHByb2plY3RzLG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUluZm8gb2JqZWN0cyB3aGljaCByZXByZXNlbnQgd2ViIHNlcnZpY2VzIGZvdW5kIGJ5IGxvY2F0b3JzIHRoYXQKLQkgKiBoYXZlIHJlZ2lzdGVyZWQgdXNpbmcgdGhlIG9yZy5lY2xpcHNlLndzdC53cy5sb2NhdG9yIGV4dGVuc2lvbiBwb2ludCB1bmRlciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCi0JICogTG9jYXRvcnMgbXVzdCBleHRlbmQge0BsaW5rIEFic3RyYWN0V2ViU2VydmljZUxvY2F0b3J9LgotCSAqIENhbGxlcnMgY2FuIHVzZSB0aGUgZ2V0dGVyIG1ldGhvZHMgb24gdGhlIFdlYlNlcnZpY2VJbmZvIG9iamVjdCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgCi0JICogd2ViIHNlcnZpY2VzIGZvdW5kLiAgVGhlIFdlYlNlcnZpY2VGaW5kZXIgY2Fubm90IGd1YXJhbnRlZSB0aGUgbGV2ZWwgb2YgZGV0YWlsIGNvbnRhaW5lZCBpbiBXZWJTZXJ2aWNlSW5mbwotCSAqIG9iamVjdHMgcmV0dXJuZWQuICBUaGlzIGlzIGxlZnQgdG8gdGhlIGxvY2F0b3IgaW1wbGVtZW50YXRpb25zLgotCSAqIEBwYXJhbSBjYXRlZ29yeUlkIFRoZSBjYXRlZ29yeSBvZiBsb2NhdG9ycyB0byB1c2UuCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlSW5mbyBvYmplY3RzLCBuZXZlciBudWxsLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRXZWJTZXJ2aWNlc0J5Q2F0ZWdvcnlJZCAoIFN0cmluZyBjYXRlZ29yeUlkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCXsKLQkJcmV0dXJuIGdldFdlYlNlcnZpY2VzQnlDYXRlZ29yeUlkKGNhdGVnb3J5SWQsbnVsbCxtb25pdG9yKTsJCi0JfSAKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUluZm8gb2JqZWN0cyB3aGljaCByZXByZXNlbnQgd2ViIHNlcnZpY2VzIGZvdW5kIGJ5IGxvY2F0b3JzIHRoYXQKLQkgKiBoYXZlIHJlZ2lzdGVyZWQgdXNpbmcgdGhlIG9yZy5lY2xpcHNlLndzdC53cy5sb2NhdG9yIGV4dGVuc2lvbiBwb2ludCB1bmRlciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCi0JICogVGhlIHNlYXJjaCBpcyBjb25zdHJhaW5lZCB0byB0aGUgZ2l2ZW4gc2V0IG9mIG9uZSBvciBtb3JlIHByb2plY3RzLgotCSAqIExvY2F0b3JzIG11c3QgZXh0ZW5kIHtAbGluayBBYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yfS4KLQkgKiBDYWxsZXJzIGNhbiB1c2UgdGhlIGdldHRlciBtZXRob2RzIG9uIHRoZSBXZWJTZXJ2aWNlSW5mbyBvYmplY3QgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIAotCSAqIHdlYiBzZXJ2aWNlcyBmb3VuZC4gIFRoZSBXZWJTZXJ2aWNlRmluZGVyIGNhbm5vdCBndWFyYW50ZWUgdGhlIGxldmVsIG9mIGRldGFpbCBjb250YWluZWQgaW4gV2ViU2VydmljZUluZm8KLQkgKiBvYmplY3RzIHJldHVybmVkLiAgVGhpcyBpcyBsZWZ0IHRvIHRoZSBsb2NhdG9yIGltcGxlbWVudGF0aW9ucy4KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJZCBUaGUgY2F0ZWdvcnkgb2YgbG9jYXRvcnMgdG8gdXNlLgotCSAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbCBpZiBwcm9ncmVzcyBtb25pdG9yaW5nIGlzIG5vdCBkZXNpcmVkLgotCSAqIEByZXR1cm4gQW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUluZm8gb2JqZWN0cywgbmV2ZXIgbnVsbC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0V2ViU2VydmljZXNCeUNhdGVnb3J5SWQgKCBTdHJpbmcgY2F0ZWdvcnlJZCwgSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCUxpbmtlZExpc3Qgd2ViU2VydmljZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlXZWJTZXJ2aWNlTG9jYXRvclJlZ2lzdHJ5IHdzbHIgPSBXZWJTZXJ2aWNlTG9jYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJlZ0VsZW1lbnRzID0gd3Nsci5nZXRDb25maWdFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlpZiAoRUxFTUVOVF9MT0NBVE9SLmVxdWFscyhyZWdFbGVtZW50c1tpXS5nZXROYW1lKCkpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJaWYgKGNhdGVnb3J5SWQgPT0gbnVsbCB8fCBjYXRlZ29yeUlkLmVxdWFscyhyZWdFbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGVBc0lzKEFUVFJJQlVURV9DQVRFR09SWSkpKQotCQkJCQl7Ci0JCQkJCQlPYmplY3Qgb2JqID0gcmVnRWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSSUJVVEVfQ0xBU1MpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlTG9jYXRvcikKLQkJCQkJCXsKLQkJCQkJCQlJV2ViU2VydmljZUxvY2F0b3Igd3NsID0gKElXZWJTZXJ2aWNlTG9jYXRvcilvYmo7Ci0JCQkJCQkJTGlzdCB3c0xpc3QgPSBwcm9qZWN0cyA9PSBudWxsID8gd3NsLmdldFdlYlNlcnZpY2VzKG1vbml0b3IpIDogd3NsLmdldFdlYlNlcnZpY2VzKHByb2plY3RzLG1vbml0b3IpOwotCQkJCQkJCWlmICh3c0xpc3QgIT0gbnVsbCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXdlYlNlcnZpY2VzLmFkZEFsbCh3c0xpc3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gCi0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpCi0JCQkJewotCQkJCQkvLyBRdWlldGx5IGJ5cGFzcyBhbnkgSVdlYlNlcnZpY2VMb2NhdG9ycyB0aGF0IGZhaWxlZCB0byBiZSBsb2FkZWQuCi0JCQkJfQotCQkJfQotCQl9IAotCQlyZXR1cm4gd2ViU2VydmljZXMuaXRlcmF0b3IoKTsJCi0JfSAKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cyB3aGljaCByZXByZXNlbnQgd2ViIHNlcnZpY2UgY2xpZW50cyBmb3VuZCBieSBsb2NhdG9ycyB0aGF0Ci0JICogaGF2ZSByZWdpc3RlcmVkIHVzaW5nIHRoZSBvcmcuZWNsaXBzZS53c3Qud3MubG9jYXRvciBleHRlbnNpb24gcG9pbnQuICBDdXJyZW50bHkgcmV0dXJucyBhbGwgd2ViIAotCSAqIHNlcnZpY2UgY2xpZW50cyBmb3VuZCBmb3IgYWxsIHJlZ2lzdGVyZWQgbG9jYXRvcnMuICBMb2NhdG9ycyBtdXN0IGV4dGVuZCB7QGxpbmsgQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvcn0uCi0JICogQ2FsbGVycyBjYW4gdXNlIHRoZSBnZXR0ZXIgbWV0aG9kcyBvbiB0aGUgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSAKLQkgKiB3ZWIgc2VydmljZSBjbGllbnRzIGZvdW5kLiAgVGhlIFdlYlNlcnZpY2VGaW5kZXIgY2Fubm90IGd1YXJhbnRlZSB0aGUgbGV2ZWwgb2YgZGV0YWlsIGNvbnRhaW5lZCBpbiBXZWJTZXJ2aWNlQ2xpZW50SW5mbwotCSAqIG9iamVjdHMgcmV0dXJuZWQuICBUaGlzIGlzIGxlZnQgdG8gdGhlIGxvY2F0b3IgaW1wbGVtZW50YXRpb25zLgotCSAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbCBpZiBwcm9ncmVzcyBtb25pdG9yaW5nIGlzIG5vdCBkZXNpcmVkLgotCSAqIEByZXR1cm4gQW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cywgbmV2ZXIgbnVsbC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0V2ViU2VydmljZUNsaWVudHMgKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCXsKLQkJcmV0dXJuIGdldFdlYlNlcnZpY2VDbGllbnRzQnlDYXRlZ29yeUlkKG51bGwsbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cyB3aGljaCByZXByZXNlbnQgd2ViIHNlcnZpY2UgY2xpZW50cyBmb3VuZCBieSBsb2NhdG9ycyB0aGF0Ci0JICogaGF2ZSByZWdpc3RlcmVkIHVzaW5nIHRoZSBvcmcuZWNsaXBzZS53c3Qud3MubG9jYXRvciBleHRlbnNpb24gcG9pbnQuICBDdXJyZW50bHkgcmV0dXJucyBhbGwgd2ViIAotCSAqIHNlcnZpY2UgY2xpZW50cyBmb3VuZCBmb3IgYWxsIHJlZ2lzdGVyZWQgbG9jYXRvcnMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdpdmVuIHByb2plY3RzLgotCSAqIExvY2F0b3JzIG11c3QgZXh0ZW5kIHtAbGluayBBYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yfS4KLQkgKiBDYWxsZXJzIGNhbiB1c2UgdGhlIGdldHRlciBtZXRob2RzIG9uIHRoZSBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBvYmplY3QgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIAotCSAqIHdlYiBzZXJ2aWNlIGNsaWVudHMgZm91bmQuICBUaGUgV2ViU2VydmljZUZpbmRlciBjYW5ub3QgZ3VhcmFudGVlIHRoZSBsZXZlbCBvZiBkZXRhaWwgY29udGFpbmVkIGluIFdlYlNlcnZpY2VDbGllbnRJbmZvCi0JICogb2JqZWN0cyByZXR1cm5lZC4gIFRoaXMgaXMgbGVmdCB0byB0aGUgbG9jYXRvciBpbXBsZW1lbnRhdGlvbnMuCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBvYmplY3RzLCBuZXZlciBudWxsLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRXZWJTZXJ2aWNlQ2xpZW50cyAoIElQcm9qZWN0W10gcHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0JewotCQlyZXR1cm4gZ2V0V2ViU2VydmljZUNsaWVudHNCeUNhdGVnb3J5SWQobnVsbCxwcm9qZWN0cyxtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCB3ZWIgc2VydmljZSBjbGllbnRzIGZvdW5kIGJ5IGxvY2F0b3JzIHRoYXQKLQkgKiBoYXZlIHJlZ2lzdGVyZWQgdXNpbmcgdGhlIG9yZy5lY2xpcHNlLndzdC53cy5sb2NhdG9yIGV4dGVuc2lvbiBwb2ludCB1bmRlciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCi0JICogTG9jYXRvcnMgbXVzdCBleHRlbmQge0BsaW5rIEFic3RyYWN0V2ViU2VydmljZUxvY2F0b3J9LiAKLQkgKiBDYWxsZXJzIGNhbiB1c2UgdGhlIGdldHRlciBtZXRob2RzIG9uIHRoZSBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBvYmplY3QgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIAotCSAqIHdlYiBzZXJ2aWNlIGNsaWVudHMgZm91bmQuICBUaGUgV2ViU2VydmljZUZpbmRlciBjYW5ub3QgZ3VhcmFudGVlIHRoZSBsZXZlbCBvZiBkZXRhaWwgY29udGFpbmVkIGluIFdlYlNlcnZpY2VDbGllbnRJbmZvCi0JICogb2JqZWN0cyByZXR1cm5lZC4gIFRoaXMgaXMgbGVmdCB0byB0aGUgbG9jYXRvciBpbXBsZW1lbnRhdGlvbnMuCi0JICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSBvZiBsb2NhdG9ycyB0byB1c2UuCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBvYmplY3RzLCBuZXZlciBudWxsLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRXZWJTZXJ2aWNlQ2xpZW50c0J5Q2F0ZWdvcnkgKCBXZWJTZXJ2aWNlQ2F0ZWdvcnkgY2F0ZWdvcnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0JewotCQlyZXR1cm4gZ2V0V2ViU2VydmljZUNsaWVudHNCeUNhdGVnb3J5SWQoY2F0ZWdvcnkgPT0gbnVsbCA/IG51bGwgOiBjYXRlZ29yeS5nZXRJZCgpLG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cyB3aGljaCByZXByZXNlbnQgd2ViIHNlcnZpY2UgY2xpZW50cyBmb3VuZCBieSBsb2NhdG9ycyB0aGF0Ci0JICogaGF2ZSByZWdpc3RlcmVkIHVzaW5nIHRoZSBvcmcuZWNsaXBzZS53c3Qud3MubG9jYXRvciBleHRlbnNpb24gcG9pbnQgdW5kZXIgdGhlIGdpdmVuIGNhdGVnb3J5LgotCSAqIFRoZSBzZWFyY2ggaXMgY29uc3RyYWluZWQgdG8gdGhlIGdpdmVuIHNldCBvZiBvbmUgb3IgbW9yZSBwcm9qZWN0cy4KLQkgKiBMb2NhdG9ycyBtdXN0IGV4dGVuZCB7QGxpbmsgQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvcn0uIAotCSAqIENhbGxlcnMgY2FuIHVzZSB0aGUgZ2V0dGVyIG1ldGhvZHMgb24gdGhlIFdlYlNlcnZpY2VDbGllbnRJbmZvIG9iamVjdCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgCi0JICogd2ViIHNlcnZpY2UgY2xpZW50cyBmb3VuZC4gIFRoZSBXZWJTZXJ2aWNlRmluZGVyIGNhbm5vdCBndWFyYW50ZWUgdGhlIGxldmVsIG9mIGRldGFpbCBjb250YWluZWQgaW4gV2ViU2VydmljZUNsaWVudEluZm8KLQkgKiBvYmplY3RzIHJldHVybmVkLiAgVGhpcyBpcyBsZWZ0IHRvIHRoZSBsb2NhdG9yIGltcGxlbWVudGF0aW9ucy4KLQkgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IG9mIGxvY2F0b3JzIHRvIHVzZS4KLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG9mIFdlYlNlcnZpY2VDbGllbnRJbmZvIG9iamVjdHMsIG5ldmVyIG51bGwuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldFdlYlNlcnZpY2VDbGllbnRzQnlDYXRlZ29yeSAoIFdlYlNlcnZpY2VDYXRlZ29yeSBjYXRlZ29yeSwgSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlQ2xpZW50c0J5Q2F0ZWdvcnlJZChjYXRlZ29yeSA9PSBudWxsID8gbnVsbCA6IGNhdGVnb3J5LmdldElkKCkscHJvamVjdHMsbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCB3ZWIgc2VydmljZSBjbGllbnRzIGZvdW5kIGJ5IGxvY2F0b3JzIHRoYXQKLQkgKiBoYXZlIHJlZ2lzdGVyZWQgdXNpbmcgdGhlIG9yZy5lY2xpcHNlLndzdC53cy5sb2NhdG9yIGV4dGVuc2lvbiBwb2ludCB1bmRlciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCi0JICogTG9jYXRvcnMgbXVzdCBleHRlbmQge0BsaW5rIEFic3RyYWN0V2ViU2VydmljZUxvY2F0b3J9LgotCSAqIENhbGxlcnMgY2FuIHVzZSB0aGUgZ2V0dGVyIG1ldGhvZHMgb24gdGhlIFdlYlNlcnZpY2VDbGllbnRJbmZvIG9iamVjdCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgCi0JICogd2ViIHNlcnZpY2UgY2xpZW50cyBmb3VuZC4gIFRoZSBXZWJTZXJ2aWNlRmluZGVyIGNhbm5vdCBndWFyYW50ZWUgdGhlIGxldmVsIG9mIGRldGFpbCBjb250YWluZWQgaW4gV2ViU2VydmljZUNsaWVudEluZm8KLQkgKiBvYmplY3RzIHJldHVybmVkLiAgVGhpcyBpcyBsZWZ0IHRvIHRoZSBsb2NhdG9yIGltcGxlbWVudGF0aW9ucy4KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJZCBUaGUgY2F0ZWdvcnkgb2YgbG9jYXRvcnMgdG8gdXNlLgotCSAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbCBpZiBwcm9ncmVzcyBtb25pdG9yaW5nIGlzIG5vdCBkZXNpcmVkLgotCSAqIEByZXR1cm4gQW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cywgbmV2ZXIgbnVsbC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0V2ViU2VydmljZUNsaWVudHNCeUNhdGVnb3J5SWQgKCBTdHJpbmcgY2F0ZWdvcnlJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLQl7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlQ2xpZW50c0J5Q2F0ZWdvcnlJZChjYXRlZ29yeUlkLG51bGwsbW9uaXRvcik7Ci0JfSAKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0cyB3aGljaCByZXByZXNlbnQgd2ViIHNlcnZpY2UgY2xpZW50cyBmb3VuZCBieSBsb2NhdG9ycyB0aGF0Ci0JICogaGF2ZSByZWdpc3RlcmVkIHVzaW5nIHRoZSBvcmcuZWNsaXBzZS53c3Qud3MubG9jYXRvciBleHRlbnNpb24gcG9pbnQgdW5kZXIgdGhlIGdpdmVuIGNhdGVnb3J5LgotCSAqIFRoZSBzZWFyY2ggaXMgY29uc3RyYWluZWQgdG8gdGhlIGdpdmVuIHNldCBvZiBvbmUgb3IgbW9yZSBwcm9qZWN0cy4KLQkgKiBMb2NhdG9ycyBtdXN0IGV4dGVuZCB7QGxpbmsgQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvcn0uCi0JICogQ2FsbGVycyBjYW4gdXNlIHRoZSBnZXR0ZXIgbWV0aG9kcyBvbiB0aGUgV2ViU2VydmljZUNsaWVudEluZm8gb2JqZWN0IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSAKLQkgKiB3ZWIgc2VydmljZSBjbGllbnRzIGZvdW5kLiAgVGhlIFdlYlNlcnZpY2VGaW5kZXIgY2Fubm90IGd1YXJhbnRlZSB0aGUgbGV2ZWwgb2YgZGV0YWlsIGNvbnRhaW5lZCBpbiBXZWJTZXJ2aWNlQ2xpZW50SW5mbwotCSAqIG9iamVjdHMgcmV0dXJuZWQuICBUaGlzIGlzIGxlZnQgdG8gdGhlIGxvY2F0b3IgaW1wbGVtZW50YXRpb25zLgotCSAqIEBwYXJhbSBjYXRlZ29yeUlkIFRoZSBjYXRlZ29yeSBvZiBsb2NhdG9ycyB0byB1c2UuCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBBbiBpdGVyYXRvciBvZiBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBvYmplY3RzLCBuZXZlciBudWxsLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRXZWJTZXJ2aWNlQ2xpZW50c0J5Q2F0ZWdvcnlJZCAoIFN0cmluZyBjYXRlZ29yeUlkLCBJUHJvamVjdFtdIHByb2plY3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCXsKLQkJTGlua2VkTGlzdCB3ZWJTZXJ2aWNlQ2xpZW50cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCVdlYlNlcnZpY2VMb2NhdG9yUmVnaXN0cnkgd3NsciA9IFdlYlNlcnZpY2VMb2NhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcmVnRWxlbWVudHMgPSB3c2xyLmdldENvbmZpZ0VsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnRWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCWlmIChFTEVNRU5UX0xPQ0FUT1IuZXF1YWxzKHJlZ0VsZW1lbnRzW2ldLmdldE5hbWUoKSkpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlpZiAoY2F0ZWdvcnlJZCA9PSBudWxsIHx8IGNhdGVnb3J5SWQuZXF1YWxzKHJlZ0VsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZUFzSXMoQVRUUklCVVRFX0NBVEVHT1JZKSkpCi0JCQkJCXsKLQkJCQkJCU9iamVjdCBvYmogPSByZWdFbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJJQlVURV9DTEFTUyk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VMb2NhdG9yKQotCQkJCQkJewotCQkJCQkJCUlXZWJTZXJ2aWNlTG9jYXRvciB3c2wgPSAoSVdlYlNlcnZpY2VMb2NhdG9yKW9iajsKLQkJCQkJCQlMaXN0IHdzTGlzdCA9IHByb2plY3RzID09IG51bGwgPyB3c2wuZ2V0V2ViU2VydmljZUNsaWVudHMobW9uaXRvcikgOiB3c2wuZ2V0V2ViU2VydmljZUNsaWVudHMocHJvamVjdHMsbW9uaXRvcik7Ci0JCQkJCQkJaWYgKHdzTGlzdCAhPSBudWxsKQotCQkJCQkJCXsKLQkJCQkJCQkJd2ViU2VydmljZUNsaWVudHMuYWRkQWxsKHdzTGlzdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAKLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkKLQkJCQl7Ci0JCQkJCS8vIFF1aWV0bHkgYnlwYXNzIGFueSBJV2ViU2VydmljZUxvY2F0b3JzIHRoYXQgZmFpbGVkIHRvIGJlIGxvYWRlZC4KLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiB3ZWJTZXJ2aWNlQ2xpZW50cy5pdGVyYXRvcigpOwkKLQl9IAotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiByZWdpc3RlcmVkIFdlYiBTZXJ2aWNlIENhdGVnb3J5IElEcy4KLQkgKiBAcmV0dXJuIEFuIGFycmF5LCBuZXZlciBudWxsIGJ1dCBwb3NzaWJseSBlbXB0eSwKLQkgKiBvZiByZWdpc3RlcmVkIFdlYiBTZXJ2aWNlIENhdGVnb3J5IGRlc2NyaXB0b3JzLgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQ2F0ZWdvcnlbXSBnZXRXZWJTZXJ2aWNlQ2F0ZWdvcmllcyAoKQotCXsKLQkJTGlua2VkTGlzdCBjYXRlZ29yaWVzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeSB3c2xyID0gV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZWdFbGVtZW50cyA9IHdzbHIuZ2V0Q29uZmlnRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdFbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJewotCQkJaWYgKEVMRU1FTlRfQ0FURUdPUlkuZXF1YWxzKHJlZ0VsZW1lbnRzW2ldLmdldE5hbWUoKSkpCi0JCQl7Ci0JCQkJY2F0ZWdvcmllcy5hZGQobmV3IFdlYlNlcnZpY2VDYXRlZ29yeShyZWdFbGVtZW50c1tpXSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoV2ViU2VydmljZUNhdGVnb3J5W10pY2F0ZWdvcmllcy50b0FycmF5KG5ldyBXZWJTZXJ2aWNlQ2F0ZWdvcnlbMF0pOwotCi0JfQkKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBXZWIgU2VydmljZSBDYXRlZ29yeSBJRHMuCi0JICogQHJldHVybiBBbiBhcnJheSwgbmV2ZXIgbnVsbCBidXQgcG9zc2libHkgZW1wdHksCi0JICogb2YgcmVnaXN0ZXJlZCBXZWIgU2VydmljZSBDYXRlZ29yeSBJRHMuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VDYXRlZ29yeUlkcyAoKQotCXsKLQkJTGlua2VkTGlzdCBjYXRlZ29yaWVzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeSB3c2xyID0gV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZWdFbGVtZW50cyA9IHdzbHIuZ2V0Q29uZmlnRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdFbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJewotCQkJaWYgKEVMRU1FTlRfQ0FURUdPUlkuZXF1YWxzKHJlZ0VsZW1lbnRzW2ldLmdldE5hbWUoKSkpCi0JCQl7Ci0JCQkJU3RyaW5nIGlkID0gcmVnRWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlQXNJcyhBVFRSSUJVVEVfSUQpOwotCQkJCWlmIChpZCAhPSBudWxsKQotCQkJCXsKLQkJCQkJY2F0ZWdvcmllcy5hZGQoaWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKWNhdGVnb3JpZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgV2ViU2VydmljZUNhdGVnb3J5IHdpdGggdGhlIGdpdmVuIElELAotCSAqIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJZCBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIGZpbmQuCi0JICogQHJldHVybiBUaGUgbWF0Y2hpbmcgY2F0ZWdvcnkgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQ2F0ZWdvcnkgZ2V0V2ViU2VydmljZUNhdGVnb3J5QnlJZCAoIFN0cmluZyBjYXRlZ29yeUlkICkKLQl7Ci0JCVdlYlNlcnZpY2VDYXRlZ29yeSBjYXRlZ29yeSA9IG51bGw7Ci0JCWlmIChjYXRlZ29yeUlkICE9IG51bGwpCi0JCXsKLQkJCVdlYlNlcnZpY2VMb2NhdG9yUmVnaXN0cnkgd3NsciA9IFdlYlNlcnZpY2VMb2NhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJlZ0VsZW1lbnRzID0gd3Nsci5nZXRDb25maWdFbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdFbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlpZiAoRUxFTUVOVF9DQVRFR09SWS5lcXVhbHMocmVnRWxlbWVudHNbaV0uZ2V0TmFtZSgpKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyBpZCA9IHJlZ0VsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZUFzSXMoQVRUUklCVVRFX0lEKTsKLQkJCQkJaWYgKGNhdGVnb3J5SWQuZXF1YWxzKGlkKSkKLQkJCQkJewotCQkJCQkJcmV0dXJuIG5ldyBXZWJTZXJ2aWNlQ2F0ZWdvcnkocmVnRWxlbWVudHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzZmluZGVyL1dlYlNlcnZpY2VMb2NhdG9yRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzZmluZGVyL1dlYlNlcnZpY2VMb2NhdG9yRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDJiMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9XZWJTZXJ2aWNlTG9jYXRvckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2ZpbmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIGpvYW4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdGhlIGFkZGl0aW9uIG9mIGxvY2F0b3IgZXh0ZW5zaW9uIHNwZWNpZmljIGZ1bmN0aW9ucwotICogCi0gKi8KLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VMb2NhdG9yRXh0ZW5zaW9uIGV4dGVuZHMgV2ViU2VydmljZUV4dGVuc2lvbkltcGwgewotCQotLy8JIENvcHlyaWdodAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQkKLQkgcHVibGljIFdlYlNlcnZpY2VMb2NhdG9yRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotCSAgewotCSAgICBzdXBlcihjb25maWdFbGVtZW50KTsKLQkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NmaW5kZXIvV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9XZWJTZXJ2aWNlTG9jYXRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDZiZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9XZWJTZXJ2aWNlTG9jYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsOwotCi0vKioKLSAqIEBhdXRob3Igam9hbgotICoKLSAqIFJldHJpZXZlcyBsb2NhdG9ycyB3aGljaCBleHRlbmQge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2ZpbmRlci5BYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yfS4KLSAqIExvY2F0b3JzIG11c3QgY3JlYXRlIGFuIGV4dGVuc2lvbiBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC53cy5sb2NhdG9yIGV4dGVuc2lvbiBwb2ludCBpbiBvcmRlciB0byBiZSByZXRyaWV2ZWQgYnkKLSAqIHRoZSByZWdpc3RyeS4KLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTG9jYXRvclJlZ2lzdHJ5IGV4dGVuZHMgV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbCB7Ci0KLQkgLy8gQ29weXJpZ2h0Ci0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCSAgLyoKLQkgICAqIFRoaXMgaXMgYSBzaW5nbGV0b24gYmVjYXN1ZSBpdCB3YXMgZGVjaWRlZCB0aGF0IHRoZSBtZW1vcnkgZm9vdCBwcmludCAKLQkgICAqIGlzIG5vdCBhcyBleHBlbnNpdmUgYXMgdGhlIHRpbWUgdGFrZW4gcmV0cmlldmluZyB0aGUgZGF0YQotCSAgICogCi0JICAgKi8KLQkgIAotCSAgCi0JICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlTG9jYXRvclJlZ2lzdHJ5IHdzbHI7Ci0JICAKLQkgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0JICB7Ci0JICAJaWYod3NsciA9PSBudWxsKSB3c2xyID0gbmV3IFdlYlNlcnZpY2VMb2NhdG9yUmVnaXN0cnkoKTsKLQkgICAgcmV0dXJuIHdzbHI7Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgV2ViU2VydmljZUxvY2F0b3JSZWdpc3RyeSgpCi0JICB7Ci0JICAgIHN1cGVyKCk7Ci0JICB9Ci0JICAKLQkgIC8qKgotCSAgKiBDaGlsZHJlbiByZWdpc3RyaWVzIHdpbGwgaGF2ZSBkaWZmZXJlbnQgZXh0ZW5zaW9uIHR5cGVzIAotCSAgKiBAcmV0dXJuIFdlYnNlcnZpY2VFeHRlbnNpb24gaG9sZHMgYSBjb25maWcgZWxlbQotCSAgKiBmb3IgdGhhdCBleHRlbnNpb24gY2FwYWJsZSBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLQkgICovCi0JICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbiBjcmVhdGVXZWJTZXJ2aWNlRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotCSAgewotCSAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VMb2NhdG9yRXh0ZW5zaW9uKGNvbmZpZ0VsZW1lbnQpOwotCSAgfQotCi0JICAvKioKLQkgICogQ29udGFjdHMgcGxhdGZvcm0gcmVnaXN0cnkgYW5kIGdldHMgYWxsIGxvY2F0b3JzIHdoaWNoIGhhdmUgcmVnaXN0ZXJlZCAKLQkgICogIHVzaW5nIHRoZSBvcmcuZWNsaXBzZS53c3Qud3MubG9jYXRvciBleHRlbnNpb24gcG9pbnQuCi0JICAqIEByZXR1cm4gSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYW4gYXJyYXkgb2YgZWxlbWVudHMgd2hpY2ggY29udGFpbiBsb2NhdG9ycyAKLQkgICogZXh0ZW5kaW5nIEFic3RyYWN0V2ViU2VydmljZUxvY2F0b3IuCi0JICAqLwotCSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbmZpZ0VsZW1lbnRzKCkKLQkgIHsKLQkgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS53c3Qud3MiLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYXRvciIpOwotCSAgICByZXR1cm4gY29uZmlnOyAgICAKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9Xb3Jrc3BhY2VXU0RMTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2ZpbmRlci9Xb3Jrc3BhY2VXU0RMTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDMwZGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NmaW5kZXIvV29ya3NwYWNlV1NETExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMzE3ICAgMTI3NDU2IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKiAyMDA2MDYyMCAgIDE0Nzg2MiBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotLyoqCi0gKiBFeHRlbmRzIHRoZSBXZWIgU2VydmljZXMgRmluZGVyIEZyYW1ld29yay4KLSAqIEZpbmRzIGFsbCAud3NkbCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLgotICogTm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkuICBXb3Jrc3BhY2VXU0RMTG9jYXRvciByZWdpc3RlcnMgd2l0aCBXZWJTZXJ2aWNlTG9jYXRvclJlZ2lzdHJ5IAotICogYW5kIGlzIGFjY2Vzc2VkIGJ5IHRoZSB7QGxpbmsgV2ViU2VydmljZUZpbmRlcn0uIAotICovCi0KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VXU0RMTG9jYXRvciBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZUxvY2F0b3IKLXsKLQotCXByb3RlY3RlZCBMaXN0IHdzZGxTZXJ2aWNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFUyA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOyAgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0VYVCA9ICJ3c2RsIjsgIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBXb3Jrc3BhY2VXU0RMTG9jYXRvcigpCi0JewotCQlzdXBlcigpOwkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCAud3NkbCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLiAgQ3VycmVudGx5IGRvZXMgbm90IGVsaW1pbmF0ZSBtdWx0aXBsZSAKLQkgKiBvY2N1cmVuY2VzIG9mIHRoZSBzYW1lIHdlYiBzZXJ2aWNlLiAKLQkgKiAKLQkgKiBUT0RPOiBhZGQgYSBsaXN0ZW5lciB0byB0aGUgd29ya3NwYWNlIHJlc291cmNlIHRyZWUgc28gdGhhdCBnZXRXZWJTZXJ2aWNlcyBkb2Vzbid0IGFsd2F5cwotCSAqIHVzZSB0aGUgV1NETFZpc2l0b3IgdG8gd2FsayB0aGUgZW50aXJlIHJlc291cmNlIHRyZWUuICBUaGF0IHNob3VsZCBvbmx5IGhhcHBlbiBvbmNlLiAgQWZ0ZXIKLQkgKiB0aGF0IHRoZSByZXNvdXJjZSB0cmVlIGNhbiBiZSBtb25pdG9yZWQgZm9yIG1vZGlmaWNhdGlvbnMgdG8gLndzZGwgZmlsZXMgYW5kIGNoYW5nZXMgbWFkZSB0byBhIGNhY2hlLiAKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcyBub3QgZGVzaXJlZC4KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgV2ViU2VydmljZUluZm8gb2JqZWN0cywgcG9zc2libHkgbnVsbC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlcyAoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsJCi0JCWlmICh3c2RsU2VydmljZXMgPT0gbnVsbCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJV1NETFZpc2l0b3IgdmlzaXRvciA9IG5ldyBXU0RMVmlzaXRvcigpOwotCQkJCXJvb3QuYWNjZXB0KHZpc2l0b3IpOwkJCi0JCQkJd3NkbFNlcnZpY2VzID0gdmlzaXRvci5nZXRXU0RMKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQkJewotCQkJCS8vIERvIG5vdGhpbmcuCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdzZGxTZXJ2aWNlczsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgYWxsIC53c2RsIGZpbGVzIGluIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIEN1cnJlbnRseSBkb2VzIG5vdCBlbGltaW5hdGUgbXVsdGlwbGUgb2NjdXJlbmNlcyBvZiB0aGUgc2FtZSB3ZWIgc2VydmljZS4gCi0JICogCi0JICogVE9ETzogYWRkIGEgbGlzdGVuZXIgdG8gdGhlIHdvcmtzcGFjZSByZXNvdXJjZSB0cmVlIHNvIHRoYXQgZ2V0V2ViU2VydmljZXMgZG9lc24ndCBhbHdheXMKLQkgKiB1c2UgdGhlIFdTRExWaXNpdG9yIHRvIHdhbGsgdGhlIGVudGlyZSByZXNvdXJjZSB0cmVlLiAgVGhhdCBzaG91bGQgb25seSBoYXBwZW4gb25jZS4gIEFmdGVyCi0JICogdGhhdCB0aGUgcmVzb3VyY2UgdHJlZSBjYW4gYmUgbW9uaXRvcmVkIGZvciBtb2RpZmljYXRpb25zIHRvIC53c2RsIGZpbGVzIGFuZCBjaGFuZ2VzIG1hZGUgdG8gYSBjYWNoZS4gCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgQSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIG1vbml0b3JpbmcgaXMgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiBsaXN0IG9mIFdlYlNlcnZpY2VJbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlcyAoSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJV1NETFZpc2l0b3IgdmlzaXRvciA9IG5ldyBXU0RMVmlzaXRvcigpOwotCQlpZiAocHJvamVjdHMgIT0gbnVsbCkKLQkJewotCQkJZm9yIChpbnQgcD0wOyBwPHByb2plY3RzLmxlbmd0aDsgcCsrKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJcHJvamVjdHNbcF0uYWNjZXB0KHZpc2l0b3IpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkKLQkJCQl7Ci0JCQkJCS8vIERvIG5vdGhpbmcuCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2aXNpdG9yLmdldFdTREwoKTsKLQl9Ci0KLQkvKioKLQkgKiAgVXNlcyB0aGUgVmlzaXRvciBwYXR0ZXJuIHRvIHdhbGsgdGhlIHdvcmtzcGFjZSByZXNvdXJjZSB0cmVlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBXU0RMVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVZpc2l0b3IKLQl7Ci0KLQkJcHJpdmF0ZSBWZWN0b3Igd3NkbCA9IG5ldyBWZWN0b3IoKTsKLQotCQkvKioKLQkJICogdmlzaXRzIGV2ZXJ5IG5vZGUgb24gdGhlIHJlc291cmNlIHRyZWUgc3RvcHBpbmcgYSBmaWxlIHJlc291cmNlcwotCQkgKiBpZiBmaWxlIHJlc291cmNlIGhhcyBleHRlbnNpb24gLndzZGwgYSBXZWJTZXJ2aWNlSW5mbyBvYmplY3QgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gYSB2ZWN0b3IgCi0JCSAqICBUT0RPOiBsb29rIGF0IGNhY2hpbmcgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZSB3ZWIgc2VydmljZSBkZWZpbml0aW9ucyBpbiB0aGUgdmVjdG9yIHJldHVybmVkCi0JCSAqICBUT0RPOiBhZGQgbW9yZSBpbmZvcm1hdGlvbiB0byB0aGUgV2ViU2VydmljZUluZm8gb2JqZWN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIHF1YWxpZmllZCBmaWxlbmFtZSBpcyBhZGRlZC4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkKLQkJewotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCXsgICAgICAgIAotCQkJCVN0cmluZyBleHQgPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5lcXVhbHNJZ25vcmVDYXNlKFdTRExfRVhUKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyB1cmxTdHJpbmcgPSBQTEFURk9STV9SRVMgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCVdlYlNlcnZpY2VJbmZvIHdzSW5mbyA9IG5ldyBXZWJTZXJ2aWNlSW5mbygpOwotCQkJCQl3c0luZm8uc2V0V3NkbFVSTCh1cmxTdHJpbmcpOyAgICAgICAgICAgCi0JCQkJCXdzZGwuYWRkKHdzSW5mbyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyBhIHZlY3RvciBvZiBXZWJTZXJ2aWNlSW5mbyBvYmplY3RzLgotCQkgKiBAcmV0dXJuIHZlY3RvciBvZiBXZWJTZXJ2aWNlSW5mbyBvYmplY3RzCi0JCSAqLwotCQlwdWJsaWMgVmVjdG9yIGdldFdTREwoKQotCQl7Ci0JCQlyZXR1cm4gd3NkbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NpbC9BZGRXU0RMVG9XU0lMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2lsL0FkZFdTRExUb1dTSUxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTAyZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2lsL0FkZFdTRExUb1dTSUxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5BYnN0cmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkluc3BlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLldTSUxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi5FeHRlbnNpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5JbXBsZW1lbnRlZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLndzZGwuUmVmZXJlbmNlZFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLnhtbC5YTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLklsbGVnYWxBcmd1bWVudHNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldTSUxNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0RMVG9XU0lMQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19XU0lMID0gIi13c2lsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX1dTREwgPSAiLXdzZGwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfUkVTT0xWRV9XU0RMID0gIi1yZXNvbHZld3NkbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUgPSAiLWh0dHB1c2VybmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19IVFRQX0JBU0lDX0FVVEhfUEFTU1dPUkQgPSAiLWh0dHBwYXNzd29yZCI7Ci0gIHByaXZhdGUgV1dXQXV0aGVudGljYXRpb25IYW5kbGVyIHd3d0F1dGhIYW5kbGVyXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBhcmdzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NpbF87Ci0gIHByaXZhdGUgQXJyYXlMaXN0IHdzZGxzXzsKLSAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVXU0RMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFBhc3N3b3JkXzsKLQotICBwdWJsaWMgQWRkV1NETFRvV1NJTENvbW1hbmQoKQotICB7Ci0gICAgd3d3QXV0aEhhbmRsZXJfID0gbnVsbDsKLSAgICBhcmdzXyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgY2xlYXJQYXJzZWRBcmdzKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY2xlYXJQYXJzZWRBcmdzKCkKLSAgewotICAgIHdzaWxfID0gbnVsbDsKLSAgICBpZiAod3NkbHNfID09IG51bGwpCi0gICAgICB3c2Rsc18gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZWxzZQotICAgICAgd3NkbHNfLmNsZWFyKCk7Ci0gICAgcmVzb2x2ZVdTRExfID0gZmFsc2U7Ci0gICAgaHR0cFVzZXJuYW1lXyA9IG51bGw7Ci0gICAgaHR0cFBhc3N3b3JkXyA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZXMgdGhlIENvbW1hbmQuCi0gICAqIAotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQKLSAgICogICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlCi0gICAqICAgICAgICAgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gbWV0aG9kIHdhcyBzdWNjZXNzZnVsLiBBIHZhbHVkIG9mIDxjb2RlPm51bGw8L2NvZGU+LAotICAgKiAgICAgICAgIG9yIGEgU3RhdHVzIHdpdGggYSBzZXZlcml0eSBvZiBsZXNzIHRoYW4gPGNvZGU+U3RhdHVzLkVSUk9SPC9jb2RlPgotICAgKiAgICAgICAgIHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotICAgIAotICAgIElVUklGYWN0b3J5IHVyaUZhY3RvcnkgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgLy8gUGFyc2UgYXJndW1lbnRzCi0gICAgdHJ5Ci0gICAgewotICAgICAgcGFyc2VBcmd1bWVudHMoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24gaWFlKQotICAgIHsKLSAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NJTE1lc3NhZ2VzLk1TR19FUlJPUl9JTExFR0FMX0FSR1VNRU5UUywgaWFlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NJTE1lc3NhZ2VzLk1TR19FUlJPUl9JTlZBTElEX0FSR1VNRU5UUywgZSk7Ci0gICAgfQotICAgIC8vIENyZWF0ZSBuZXcgV1NJTCBkb2N1bWVudAotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jdW1lbnQgPSBudWxsOwotICAgIFVSTCB3c2lsVVJMID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICB3c2lsRG9jdW1lbnQgPSBXU0lMRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLSAgICAgIHdzaWxVUkwgPSBuZXcgVVJMKHdzaWxfKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9VUkksIG11cmxlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTSUxFeGNlcHRpb24gd3NpbGUpCi0gICAgewotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NJTE1lc3NhZ2VzLk1TR19FUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTiwgd3NpbGUpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBSZWFkIFdTSUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbSBpcyA9IHVyaUZhY3RvcnkubmV3VVJJKHdzaWxVUkwpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3NpbERvY3VtZW50LnJlYWQobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7Ci0gICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChVUklFeGNlcHRpb24gdXJpZSkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OLCB1cmllKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OLCBpb2UpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoV1NJTEV4Y2VwdGlvbiB3c2lsZSkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OLCB3c2lsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIGludGVybmFsRXhlY3V0ZQotICAgIFN0cmluZyBodHRwVXNlcm5hbWUgPSBudWxsOwotICAgIFN0cmluZyBodHRwUGFzc3dvcmQgPSBudWxsOwotICAgIGlmICh3c2Rsc18uc2l6ZSgpID09IDEgJiYgaHR0cFVzZXJuYW1lXyAhPSBudWxsICYmIGh0dHBQYXNzd29yZF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBodHRwVXNlcm5hbWUgPSBodHRwVXNlcm5hbWVfOwotICAgICAgaHR0cFBhc3N3b3JkID0gaHR0cFBhc3N3b3JkXzsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHdzZGxzXy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyB3c2RsID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHN0YXR1cyA9IGludGVybmFsRXhlY3V0ZShlbnZpcm9ubWVudCwgd3NpbERvY3VtZW50LCBwbGF0Zm9ybTJGaWxlKHVyaUZhY3RvcnksIHdzaWxfKSwgd3NkbCwgaHR0cFVzZXJuYW1lLCBodHRwUGFzc3dvcmQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlKQotICAgICAgewotICAgICAgICBpZiAod3d3QXV0aEhhbmRsZXJfICE9IG51bGwgJiYgaHR0cFVzZXJuYW1lID09IG51bGwgJiYgaHR0cFBhc3N3b3JkID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB3d3dBdXRoSGFuZGxlcl8uaGFuZGxlV1dXQXV0aGVudGljYXRpb24od3d3YWUpOwotICAgICAgICAgIFN0cmluZyBoYW5kbGVyVXNlcm5hbWUgPSB3d3dBdXRoSGFuZGxlcl8uZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgaGFuZGxlclBhc3N3b3JkID0gd3d3QXV0aEhhbmRsZXJfLmdldFBhc3N3b3JkKCk7Ci0gICAgICAgICAgaWYgKGhhbmRsZXJVc2VybmFtZSAhPSBudWxsICYmIGhhbmRsZXJQYXNzd29yZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdGF0dXMgPSBpbnRlcm5hbEV4ZWN1dGUoZW52aXJvbm1lbnQsIHdzaWxEb2N1bWVudCwgcGxhdGZvcm0yRmlsZSh1cmlGYWN0b3J5LCB3c2lsXyksIHdzZGwsIGhhbmRsZXJVc2VybmFtZSwgaGFuZGxlclBhc3N3b3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB3d3dhZTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElTdGF0dXMgd3d3YWVTdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NJTE1lc3NhZ2VzLk1TR19FUlJPUl9VTlJFU09MVkFCTEVfV1NETCwgd3d3YWUyLmdldElPRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Iod3d3YWVTdGF0dXMpOwotICAgICAgICAgICAgICByZXR1cm4gd3d3YWVTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElTdGF0dXMgcyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX1VOUkVTT0xWQUJMRV9XU0RMLCB3d3dhZS5nZXRJT0V4Y2VwdGlvbigpKTsKLSAgICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Iocyk7Ci0gICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFdyaXRlIFdTSUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IFhNTFdyaXRlcigpOwotICAgICAgT3V0cHV0U3RyZWFtIG9zID0gdXJpRmFjdG9yeS5uZXdVUkkod3NpbFVSTCkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBpZiAob3MgIT0gbnVsbCkKLSAgICAgICAgeG1sV3JpdGVyLndyaXRlRG9jdW1lbnQod3NpbERvY3VtZW50LCBvcyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotICAgICAgb3MuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVSSUV4Y2VwdGlvbiB1cmllKQotICAgIHsKLSAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIFdTSUxNZXNzYWdlcy5NU0dfRVJST1JfV1JJVEVfV1NJTCwgdXJpZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NJTE1lc3NhZ2VzLk1TR19FUlJPUl9XUklURV9XU0lMLCBpb2UpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoV1NJTEV4Y2VwdGlvbiB3c2lsZSkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX1dSSVRFX1dTSUwsIHdzaWxlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLQotICBwcml2YXRlIElTdGF0dXMgaW50ZXJuYWxFeGVjdXRlKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgV1NJTERvY3VtZW50IHdzaWxEb2N1bWVudCwgU3RyaW5nIHdzaWwsIFN0cmluZyB3c2RsLCBTdHJpbmcgaHR0cFVzZXJuYW1lLCBTdHJpbmcgaHR0cFBhc3N3b3JkKSB0aHJvd3MgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgQXJyYXlMaXN0IHdzZGxTZXJ2aWNlID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEFycmF5TGlzdCB3c2RsQmluZGluZyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAocmVzb2x2ZVdTRExfKQotICAgIHsKLSAgICAgIC8vIFBhcnNlIFdTREwKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWZpbml0aW9uID0gcGFyc2VXU0RMKHdzZGwsIHdzZGxTZXJ2aWNlLCB3c2RsQmluZGluZywgaHR0cFVzZXJuYW1lLCBodHRwUGFzc3dvcmQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NJTE1lc3NhZ2VzLk1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJJLCBtdXJsZSk7Ci0gICAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICAgIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyggV1NJTE1lc3NhZ2VzLk1TR19FUlJPUl9VTlJFU09MVkFCTEVfV1NETCwgaW9lKTsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpCi0gICAgICB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoIFdTSUxNZXNzYWdlcy5NU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04sIHBjZSk7Ci0gICAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzYXhlKQotICAgICAgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX01BTEZPUk1FRF9XU0RMLCBzYXhlKTsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIEFkZCBXU0RMIHRvIFdTSUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jdW1lbnQuZ2V0SW5zcGVjdGlvbigpOwotICAgICAgU2VydmljZSBzZXJ2aWNlID0gd3NpbERvY3VtZW50LmNyZWF0ZVNlcnZpY2UoKTsKLSAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZG9jdW1lbnRhdGlvbiA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgICAgQWJzdHJhY3Qgc2VydmljZUFic3RyYWN0ID0gd3NpbERvY3VtZW50LmNyZWF0ZUFic3RyYWN0KCk7Ci0gICAgICAgIHNlcnZpY2VBYnN0cmFjdC5zZXRUZXh0KEVsZW1lbnQyU3RyaW5nKGRvY3VtZW50YXRpb24pKTsKLSAgICAgICAgc2VydmljZS5hZGRBYnN0cmFjdChzZXJ2aWNlQWJzdHJhY3QpOwotICAgICAgfQotICAgICAgRGVzY3JpcHRpb24gZGVzYyA9IHdzaWxEb2N1bWVudC5jcmVhdGVEZXNjcmlwdGlvbigpOwotICAgICAgZGVzYy5zZXRSZWZlcmVuY2VkTmFtZXNwYWNlKFdTRExDb25zdGFudHMuTlNfVVJJX1dTREwpOwotICAgICAgZGVzYy5zZXRMb2NhdGlvbihnZXRSZWxhdGl2ZVVSSSh3c2lsLCB3c2RsKSk7Ci0gICAgICBFeHRlbnNpb25CdWlsZGVyIGV4dEJ1aWxkZXIgPSB3c2lsRG9jdW1lbnQuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRCdWlsZGVyKFdTRExDb25zdGFudHMuTlNfVVJJX1dTSUxfV1NETCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsIHx8IGVuZHBvaW50UHJlc2VudChkZWZpbml0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHdzZGxTZXJ2aWNlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFJlZmVyZW5jZSkgZXh0QnVpbGRlci5jcmVhdGVFbGVtZW50KG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwsIFdTRExDb25zdGFudHMuRUxFTV9SRUZFUkVOQ0UpKTsKLSAgICAgICAgICByZWZlcmVuY2Uuc2V0RW5kcG9pbnRQcmVzZW50KG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICAgICAgICBSZWZlcmVuY2VkU2VydmljZSByZWZTZXJ2aWNlID0gKFJlZmVyZW5jZWRTZXJ2aWNlKSBleHRCdWlsZGVyLmNyZWF0ZUVsZW1lbnQobmV3IFFOYW1lKFdTRExDb25zdGFudHMuTlNfVVJJX1dTSUxfV1NETCwgV1NETENvbnN0YW50cy5FTEVNX1JFRl9TRVJWSUNFKSk7Ci0gICAgICAgICAgcmVmU2VydmljZS5zZXRSZWZlcmVuY2VkU2VydmljZU5hbWUoKFFOYW1lKSBpdC5uZXh0KCkpOwotICAgICAgICAgIHJlZmVyZW5jZS5zZXRSZWZlcmVuY2VkU2VydmljZShyZWZTZXJ2aWNlKTsKLSAgICAgICAgICBkZXNjLnNldEV4dGVuc2lvbkVsZW1lbnQocmVmZXJlbmNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFJlZmVyZW5jZSkgZXh0QnVpbGRlci5jcmVhdGVFbGVtZW50KG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwsIFdTRExDb25zdGFudHMuRUxFTV9SRUZFUkVOQ0UpKTsKLSAgICAgICAgcmVmZXJlbmNlLnNldEVuZHBvaW50UHJlc2VudChuZXcgQm9vbGVhbihmYWxzZSkpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gd3NkbEJpbmRpbmcuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEltcGxlbWVudGVkQmluZGluZyBiaW5kaW5nID0gKEltcGxlbWVudGVkQmluZGluZykgZXh0QnVpbGRlci5jcmVhdGVFbGVtZW50KG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwsIFdTRExDb25zdGFudHMuRUxFTV9JTVBMX0JJTkRJTkcpKTsKLSAgICAgICAgICBiaW5kaW5nLnNldEJpbmRpbmdOYW1lKChRTmFtZSkgaXQubmV4dCgpKTsKLSAgICAgICAgICByZWZlcmVuY2UuYWRkSW1wbGVtZW50ZWRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZXJ2aWNlLmFkZERlc2NyaXB0aW9uKGRlc2MpOwotICAgICAgaW5zcGVjdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLSAgICBjYXRjaCAoV1NJTEV4Y2VwdGlvbiB3c2lsZSkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OLCB3c2lsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBXU0lMTWVzc2FnZXMuTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OLCB0KTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiwgYW5kIG9ubHkgaWYsIHRoZSBDb21tYW5kJ3MgPGNvZGU+dW5kbzwvY29kZT4KLSAgICogbWV0aG9kIGlzIHN1cHBvcnRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgQ29tbWFuZCBzdXBwb3J0cyBiZWluZyB1bmRvbmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBVbmRvZXMgdGhlIENvbW1hbmQuCi0gICAqIAotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQKLSAgICogICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlCi0gICAqICAgICAgICAgPGNvZGU+dW5kbzwvY29kZT4gbWV0aG9kIHdhcyBzdWNjZXNzZnVsLiBBIHZhbHVkIG9mIDxjb2RlPm51bGw8L2NvZGU+LAotICAgKiAgICAgICAgIG9yIGEgU3RhdHVzIHdpdGggYSBzZXZlcml0eSBvZiBsZXNzIHRoYW4gPGNvZGU+U3RhdHVzLkVSUk9SPC9jb2RlPgotICAgKiAgICAgICAgIHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgdW5kbyhJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBwYXJzZVdTREwoU3RyaW5nIHdzZGwsIEFycmF5TGlzdCB3c2RsU2VydmljZSwgQXJyYXlMaXN0IHdzZGxCaW5kaW5nLCBTdHJpbmcgaHR0cFVzZXJuYW1lLCBTdHJpbmcgaHR0cFBhc3N3b3JkKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZXNQYXJzZXIgd3NQYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXIod3NkbCk7Ci0gICAgaWYgKGh0dHBVc2VybmFtZSAhPSBudWxsICYmIGh0dHBQYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdzUGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShodHRwVXNlcm5hbWUpOwotICAgICAgd3NQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKGh0dHBQYXNzd29yZCk7Ci0gICAgfQotICAgIHdzUGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX05PTkUpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGwpOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHdzZGxTZXJ2aWNlLmFkZChwYXJzZVFOYW1lKChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKSBpdC5uZXh0KCkpKTsKLSAgICAgIE1hcCBiaW5kaW5ncyA9IGRlZmluaXRpb24uZ2V0QmluZGluZ3MoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBiaW5kaW5ncy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB3c2RsQmluZGluZy5hZGQocGFyc2VRTmFtZSgoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkgaXQubmV4dCgpKSk7Ci0gICAgfQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGVuZHBvaW50UHJlc2VudChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICByZXR1cm4gKGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS5zaXplKCkgPiAwKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKQotICB7Ci0gICAgcmV0dXJuIGFyZ3NfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBhcmdzXyA9IGFyZ3M7Ci0gIH0KLQotICBwdWJsaWMgV1dXQXV0aGVudGljYXRpb25IYW5kbGVyIGdldFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcigpCi0gIHsKLSAgICByZXR1cm4gd3d3QXV0aEhhbmRsZXJfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V1dXQXV0aGVudGljYXRpb25IYW5kbGVyKFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlciB3d3dBdXRoSGFuZGxlcikKLSAgewotICAgIHd3d0F1dGhIYW5kbGVyXyA9IHd3d0F1dGhIYW5kbGVyOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlQXJndW1lbnRzKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24KLSAgewotICAgIGNsZWFyUGFyc2VkQXJncygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc18ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKEFSR19XU0lMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHdzaWxfID0gYXJnc19bKytpXTsKLSAgICAgIGVsc2UgaWYgKEFSR19XU0RMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHdzZGxzXy5hZGQoYXJnc19bKytpXSk7Ci0gICAgICBlbHNlIGlmIChBUkdfUkVTT0xWRV9XU0RMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHJlc29sdmVXU0RMXyA9IHRydWU7Ci0gICAgICBlbHNlIGlmIChBUkdfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIGh0dHBVc2VybmFtZV8gPSBhcmdzX1srK2ldOwotICAgICAgZWxzZSBpZiAoQVJHX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRC5lcXVhbHMoYXJnc19baV0pKQotICAgICAgICBodHRwUGFzc3dvcmRfID0gYXJnc19bKytpXTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24oYXJnc19baV0pOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgUU5hbWUgcGFyc2VRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lKQotICB7Ci0gICAgcmV0dXJuIG5ldyBRTmFtZShxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgRWxlbWVudDJTdHJpbmcoRWxlbWVudCBlKSB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMF07Ci0gICAgaWYgKGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBET01Tb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShlKTsKLSAgICAgIFRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiMiIpOwotICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgYmFvcy5jbG9zZSgpOwotICAgICAgYiA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoYik7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBwbGF0Zm9ybTJGaWxlKElVUklGYWN0b3J5IHVyaUZhY3RvcnksIFN0cmluZyB1cmkpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gdXJpRmFjdG9yeS5uZXdVUkkodXJpKS5hc0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIEZXRF9TTEFTSCA9ICcvJzsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIEJXRF9TTEFTSCA9ICdcXCc7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmVudERpciA9ICIuLi8iOwotCi0gIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlVVJJKFN0cmluZyBiYXNlVVJJLCBTdHJpbmcgdGFyZ2V0VVJJKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIGJhc2VVUklDb3B5ID0gYmFzZVVSSS5yZXBsYWNlKEJXRF9TTEFTSCwgRldEX1NMQVNIKTsKLSAgICAgIFN0cmluZyB0YXJnZXRVUklDb3B5ID0gdGFyZ2V0VVJJLnJlcGxhY2UoQldEX1NMQVNILCBGV0RfU0xBU0gpOwotICAgICAgaW50IG1hdGNoaW5nSW5kZXggPSAtMTsKLSAgICAgIGludCBpbmRleCA9IHRhcmdldFVSSUNvcHkuaW5kZXhPZihGV0RfU0xBU0gpOwotICAgICAgd2hpbGUgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBpZiAoYmFzZVVSSUNvcHkuc3RhcnRzV2l0aCh0YXJnZXRVUklDb3B5LnN1YnN0cmluZygwLCBpbmRleCArIDEpKSkKLSAgICAgICAgewotICAgICAgICAgIG1hdGNoaW5nSW5kZXggPSBpbmRleDsKLSAgICAgICAgICBpbmRleCA9IHRhcmdldFVSSUNvcHkuaW5kZXhPZihGV0RfU0xBU0gsIGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKG1hdGNoaW5nSW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGludCBzbGFzaENvdW50ID0gLTE7Ci0gICAgICAgIGludCBmcm9tSW5kZXggPSBtYXRjaGluZ0luZGV4OwotICAgICAgICB3aGlsZSAoZnJvbUluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgc2xhc2hDb3VudCsrOwotICAgICAgICAgIGZyb21JbmRleCA9IGJhc2VVUklDb3B5LmluZGV4T2YoRldEX1NMQVNILCBmcm9tSW5kZXggKyAxKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVsYXRpdmVVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2xhc2hDb3VudDsgaSsrKQotICAgICAgICAgIHJlbGF0aXZlVVJJLmFwcGVuZChwYXJlbnREaXIpOwotICAgICAgICByZWxhdGl2ZVVSSS5hcHBlbmQodGFyZ2V0VVJJLnN1YnN0cmluZyhtYXRjaGluZ0luZGV4ICsgMSwgdGFyZ2V0VVJJLmxlbmd0aCgpKSk7Ci0gICAgICAgIHJldHVybiByZWxhdGl2ZVVSSS50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gdGFyZ2V0VVJJOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTE2OGJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlIGltcGxlbWVudHMgSVdlYlNlcnZpY2UgewotCQotCXByaXZhdGUgV2ViU2VydmljZUluZm8gaW5mbzsKLQotCXB1YmxpYyBBYnN0cmFjdFdlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbykgewotCQl0aGlzLmluZm8gPSBpbmZvOwotCX0KLQkKLQotCXB1YmxpYyBXZWJTZXJ2aWNlSW5mbyBnZXRXZWJTZXJ2aWNlSW5mbygpIHsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotCQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotICAgICAgU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgcnVuKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZUNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNhNTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50IGltcGxlbWVudHMgSVdlYlNlcnZpY2VDbGllbnQgewotCQotCXByaXZhdGUgV2ViU2VydmljZUNsaWVudEluZm8gaW5mbzsKLQotCXB1YmxpYyBBYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbykgewotCQl0aGlzLmluZm8gPSBpbmZvOwotCX0KLQkKLQotCXB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBnZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpIHsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotICAgICAgU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotCQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotICAgICAgU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgcnVuKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5MDMzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZSBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlUnVudGltZSB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSVdlYlNlcnZpY2UgZ2V0V2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKTsKLQkvKioKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVdlYlNlcnZpY2VDbGllbnQgZ2V0V2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKTsKLQkvKioKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFubm91bmNlKElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UpCi0JewotCQkvL1RPRE8gcHJvdmlkZSBhIGJvaWxlci1wbGF0ZSBhbm5vdW5jZSBpbXBsZW1lbnRhdGlvbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0lDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzNzE4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotcHVibGljIGludGVyZmFjZSBJQ29udGV4dCB7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0QXNzZW1ibGUoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDaGVja091dEZpbGVzKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50KCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Q3JlYXRlRm9sZGVycygpOwotCQotCXB1YmxpYyBib29sZWFuIGdldERlcGxveSgpOwotCQotCXB1YmxpYyBib29sZWFuIGdldERldmVsb3AoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnN0YWxsKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0T3ZlcldyaXRlRmlsZXMoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0UnVuKCk7Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VTY2VuYXJpbyBnZXRTY2VuYXJpbygpOwotCQotCXB1YmxpYyBib29sZWFuIGdldFRlc3QoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0lTZWxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9JU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTNiNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0lTZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotcHVibGljIGludGVyZmFjZSBJU2VsZWN0aW9uIHsKLQkKLQlPYmplY3RbXSBnZXRTZWxlY3Rpb24oKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0lXZWJTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSVdlYlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZTYxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSVdlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlSW5mbyBnZXRXZWJTZXJ2aWNlSW5mbygpOwotCQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCk7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSVdlYlNlcnZpY2VDbGllbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9JV2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxZWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9JV2ViU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZUNsaWVudCB7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VDbGllbnRJbmZvIGdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCk7Ci0JCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCk7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KTsKLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCk7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCk7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KTsJCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9JV2ViU2VydmljZVB1Ymxpc2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0lXZWJTZXJ2aWNlUHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGM1ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0lXZWJTZXJ2aWNlUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlUHVibGlzaGVyIHsKLQkKLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHB1Ymxpc2goSUVudmlyb25tZW50IGVudiwgSVdlYlNlcnZpY2Ugd3MpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSVdlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSVdlYlNlcnZpY2VSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOGMyZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0lXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlUnVudGltZSB7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIElXZWJTZXJ2aWNlIGdldFdlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbyk7Ci0JLyoqCi0JICovCi0JcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbyk7Ci0JLyoqCi0JICovCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhbm5vdW5jZShJV2ViU2VydmljZSB3ZWJTZXJ2aWNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0lXZWJTZXJ2aWNlVGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSVdlYlNlcnZpY2VUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3NDhhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvSVdlYlNlcnZpY2VUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VUZXN0ZXIgewotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdlbmVyYXRlKFRlc3RJbmZvIHRlc3RJbmZvKTsKLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBsYXVuY2goVGVzdEluZm8gdGVzdEluZm8pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1NpbXBsZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9TaW1wbGVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODRiNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1NpbXBsZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQ7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnRleHQgaW1wbGVtZW50cyBJQ29udGV4dCB7Ci0KLQlib29sZWFuIGRldmVsb3A7Ci0JYm9vbGVhbiBhc3NlbWJsZTsKLQlib29sZWFuIGRlcGxveTsKLQlib29sZWFuIGluc3RhbGw7Ci0JYm9vbGVhbiBydW47Ci0JYm9vbGVhbiBjbGllbnQ7Ci0JYm9vbGVhbiB0ZXN0OwotCWJvb2xlYW4gcHVibGlzaDsKLQkKLQlXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW87Ci0JCi0JYm9vbGVhbiBvdmVyd3JpdGVGaWxlczsKLQlib29sZWFuIGNyZWF0ZUZvbGRlcnM7Ci0JYm9vbGVhbiBjaGVja091dEZpbGVzOwotCQotCQotCQotCQotCXB1YmxpYyBTaW1wbGVDb250ZXh0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBTaW1wbGVDb250ZXh0KGJvb2xlYW4gZGV2ZWxvcCwgYm9vbGVhbiBhc3NlbWJsZSwgYm9vbGVhbiBkZXBsb3ksIGJvb2xlYW4gaW5zdGFsbCwgYm9vbGVhbiBydW4sIGJvb2xlYW4gY2xpZW50LCBib29sZWFuIHRlc3QsIGJvb2xlYW4gcHVibGlzaCwgV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvLCBib29sZWFuIG92ZXJ3cml0ZUZpbGVzLCBib29sZWFuIGZvbGRlcnMsIGJvb2xlYW4gY2hlY2tPdXRGaWxlcykgewotCQlzdXBlcigpOwkJCi0JCXRoaXMuZGV2ZWxvcCA9IGRldmVsb3A7Ci0JCXRoaXMuYXNzZW1ibGUgPSBhc3NlbWJsZTsKLQkJdGhpcy5kZXBsb3kgPSBkZXBsb3k7Ci0JCXRoaXMuaW5zdGFsbCA9IGluc3RhbGw7Ci0JCXRoaXMucnVuID0gcnVuOwotCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKLQkJdGhpcy50ZXN0ID0gdGVzdDsKLQkJdGhpcy5wdWJsaXNoID0gcHVibGlzaDsKLQkJdGhpcy5zY2VuYXJpbyA9IHNjZW5hcmlvOwotCQl0aGlzLm92ZXJ3cml0ZUZpbGVzID0gb3ZlcndyaXRlRmlsZXM7Ci0JCXRoaXMuY3JlYXRlRm9sZGVycyA9IGZvbGRlcnM7Ci0JCXRoaXMuY2hlY2tPdXRGaWxlcyA9IGNoZWNrT3V0RmlsZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEFzc2VtYmxlKCkgewotCQlyZXR1cm4gYXNzZW1ibGU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEFzc2VtYmxlKGJvb2xlYW4gYXNzZW1ibGUpIHsKLQkJdGhpcy5hc3NlbWJsZSA9IGFzc2VtYmxlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDaGVja091dEZpbGVzKCkgewotCQlyZXR1cm4gY2hlY2tPdXRGaWxlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q2hlY2tPdXRGaWxlcyhib29sZWFuIGNoZWNrT3V0RmlsZXMpIHsKLQkJdGhpcy5jaGVja091dEZpbGVzID0gY2hlY2tPdXRGaWxlczsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50KCkgewotCQlyZXR1cm4gY2xpZW50OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnQoYm9vbGVhbiBjbGllbnQpIHsKLQkJdGhpcy5jbGllbnQgPSBjbGllbnQ7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldENyZWF0ZUZvbGRlcnMoKSB7Ci0JCXJldHVybiBjcmVhdGVGb2xkZXJzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVGb2xkZXJzKGJvb2xlYW4gY3JlYXRlRm9sZGVycykgewotCQl0aGlzLmNyZWF0ZUZvbGRlcnMgPSBjcmVhdGVGb2xkZXJzOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3koKSB7Ci0JCXJldHVybiBkZXBsb3k7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERlcGxveShib29sZWFuIGRlcGxveSkgewotCQl0aGlzLmRlcGxveSA9IGRlcGxveTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcCgpIHsKLQkJcmV0dXJuIGRldmVsb3A7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERldmVsb3AoYm9vbGVhbiBkZXZlbG9wKSB7Ci0JCXRoaXMuZGV2ZWxvcCA9IGRldmVsb3A7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldEluc3RhbGwoKSB7Ci0JCXJldHVybiBpbnN0YWxsOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsKGJvb2xlYW4gaW5zdGFsbCkgewotCQl0aGlzLmluc3RhbGwgPSBpbnN0YWxsOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRPdmVyV3JpdGVGaWxlcygpIHsKLQkJcmV0dXJuIG92ZXJ3cml0ZUZpbGVzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRPdmVyV3JpdGVGaWxlcyhib29sZWFuIG92ZXJ3cml0ZUZpbGVzKSB7Ci0JCXRoaXMub3ZlcndyaXRlRmlsZXMgPSBvdmVyd3JpdGVGaWxlczsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2g7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2goYm9vbGVhbiBwdWJsaXNoKSB7Ci0JCXRoaXMucHVibGlzaCA9IHB1Ymxpc2g7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFJ1bigpIHsKLQkJcmV0dXJuIHJ1bjsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UnVuKGJvb2xlYW4gcnVuKSB7Ci0JCXRoaXMucnVuID0gcnVuOwotCX0KLQlwdWJsaWMgV2ViU2VydmljZVNjZW5hcmlvIGdldFNjZW5hcmlvKCkgewotCQlyZXR1cm4gc2NlbmFyaW87Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNjZW5hcmlvKFdlYlNlcnZpY2VTY2VuYXJpbyBzY2VuYXJpbykgewotCQl0aGlzLnNjZW5hcmlvID0gc2NlbmFyaW87Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFRlc3QoKSB7Ci0JCXJldHVybiB0ZXN0OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRUZXN0KGJvb2xlYW4gdGVzdCkgewotCQl0aGlzLnRlc3QgPSB0ZXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9UZXN0SW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1Rlc3RJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjhkMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1Rlc3RJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNjA4ICAgMTQ1NTI5IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIFRoaXMgaG9sZHMgaW5mbyB0aGF0IGNvbWVzIGZyb20gdXNlciBpbnB1dCBvciBzb21lIGNhbGN1bGF0aW9ucyB0aGF0IAotICogd2hpY2ggbWlnaHQgYmUgdXNlZnVsIHRvIGFueSB0ZXN0IGV4dGVuZGVycwotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0SW5mbyB7Ci0gIHByaXZhdGUgU3RyaW5nIGpzcEZvbGRlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGlvblByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBwcm94eUJlYW47Ci0gIHByaXZhdGUgU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBjbGllbnRNb2R1bGU7Ci0gIHByaXZhdGUgYm9vbGVhbiBjbGllbnROZWVkRUFSOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRFQVJQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBjbGllbnRFQVJNb2R1bGU7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgcHJpdmF0ZSBJU2VydmVyIGNsaWVudEV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotICBwcml2YXRlIFN0cmluZyB3c2RsU2VydmljZVVSTDsKLSAgcHJpdmF0ZSBib29sZWFuIGV4dGVybmFsQnJvd3NlcjsgIAotICBwcml2YXRlIGJvb2xlYW4gcnVuVGVzdENsaWVudDsKLQotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBmb2xkZXIgdGhlIHVzZXIgaGFzIGNob3NlbiB0byBnZW5lcmF0ZSBhbnkganNwcyAKLSAgKiBAcGFyYW0ganNwRm9sZGVyCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKXsKLQl0aGlzLmpzcEZvbGRlciA9IGpzcEZvbGRlcjsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEpzcEZvbGRlcigpewotICAgIHJldHVybiBqc3BGb2xkZXI7ICAKLSAgfQotICAKLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgcHJvamVjdCB0aGUgdXNlciBoYXMgY2hvc2VuIHRvIGdlbmVyYXRlIGFydGlmYWN0cyB0byAgCi0gICogQHBhcmFtIGdlbmVyYXRpb25Qcm9qZWN0Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRpb25Qcm9qZWN0KFN0cmluZyBnZW5lcmF0aW9uUHJvamVjdCl7Ci0gICAgdGhpcy5nZW5lcmF0aW9uUHJvamVjdCA9IGdlbmVyYXRpb25Qcm9qZWN0OwkgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRpb25Qcm9qZWN0KCl7Ci0gICAgcmV0dXJuIGdlbmVyYXRpb25Qcm9qZWN0OwkgIAotICB9Ci0gIAotICAvKioKLSAgKiBUaGUgcHJveHkgYmVhbiB3YXMgZ2VuZXJhdGVkIGJ5IHVzIHRoaXMgaXMgdGhlIG5hbWUgb2YgaXQgIAotICAqIEBwYXJhbSBwcm94eUJlYW4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pewotICAgIHRoaXMucHJveHlCZWFuID0gcHJveHlCZWFuOwkgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3h5QmVhbigpewotICAgIHJldHVybiBwcm94eUJlYW47CSAgCi0gIH0KLQkgIAotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBTZXRFbmRwb2ludE1ldGhvZCAgIAotICAqIEBwYXJhbSAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V0RW5kcG9pbnRNZXRob2QoU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kKXsKLQl0aGlzLnNldEVuZHBvaW50TWV0aG9kID0gc2V0RW5kcG9pbnRNZXRob2Q7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXRFbmRwb2ludE1ldGhvZCgpewotICAgIHJldHVybiBzZXRFbmRwb2ludE1ldGhvZDsgIAotICB9Ci0gIAotICAvKioKLSAgKiBUaGUgY2xpZW50UHJvamVjdCBjb250YWlucyB0aGUgY2xpZW50IGFydGlmYWN0cyBpbmNsdWRpbmcgdGhlIAotICAqIGdlbmVyYXRlZCBwcm94eSBiZWFuICAgCi0gICogQHBhcmFtIGNsaWVudFByb2plY3QgU3RyaW5nCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpewotICAgIHRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdCgpewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwkgIAotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRoZSBjbGllbnRNb2R1bGUgY29udGFpbnMgdGhlIGNsaWVudCBhcnRpZmFjdHMgaW5jbHVkaW5nIHRoZSAKLSAgICogbW9kdWxlICAgCi0gICAqIEBwYXJhbSBjbGllbnRQcm9qZWN0IFN0cmluZwotICAgKi8KLSAgIHB1YmxpYyB2b2lkIHNldENsaWVudE1vZHVsZShTdHJpbmcgY2xpZW50TW9kdWxlKXsKLSAgICAgdGhpcy5jbGllbnRNb2R1bGUgPSBjbGllbnRNb2R1bGU7CSAgCi0gICB9Ci0gICAKLSAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TW9kdWxlKCl7Ci0gICAgIHJldHVybiBjbGllbnRNb2R1bGU7CSAgCi0gICB9Ci0gIAotICAvKioKLSAgKiBUaGVzZSBhcmUgbWV0aG9kcyBvbiB0aGUgcHJveHliZWFuIHRoZSB1c2VyIGhhcyBjaGVja2VkIG9uZXMgCi0gICogdGhleSB3YW50IGluY2x1ZGVkIGluIHRoZSB0ZXN0IGNsaWVudCAgICAgCi0gICogQHBhcmFtIG1ldGhvZHMKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcyl7Ci0JdGhpcy5tZXRob2RzID0gbWV0aG9kczsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhblNlbGVjdGlvbltdIGdldE1ldGhvZHMoKXsKLSAgICByZXR1cm4gbWV0aG9kczsgIAotICB9Ci0gIAotICAvKioKLSAgKiBJZiB0aGUgY29tbWFuZCBuZWVkcyBhIHNlcnZlciB0aGlzIGlzIHRoZSBjaG9zZW4gCi0gICogY2xpZW50IHNlcnZlcklECi0gICogQHBhcmFtIHNhbXBsZVNlcnZlclR5cGVJRAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKXsKLSAgICB0aGlzLnNlcnZpY2VTZXJ2ZXJUeXBlSUQgPSBzZXJ2aWNlU2VydmVyVHlwZUlEOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVNlcnZlclR5cGVJRCgpewotICAgIHJldHVybiBzZXJ2aWNlU2VydmVyVHlwZUlEOyAgCi0gIH0KLSAgCi0gIC8qKgotICAqIElmIHRoZSBjb21tYW5kIG5lZWRzIGEgc2VydmVyIHRoaXMgaXMgdGhlIGNob3NlbiAKLSAgKiBjbGllbnQgc2VydmVySUQKLSAgKiBAcGFyYW0gc2FtcGxlU2VydmVyVHlwZUlECi0gICovCi0gICBwdWJsaWMgdm9pZCBzZXRDbGllbnRTZXJ2ZXJUeXBlSUQoU3RyaW5nIGNsaWVudFNlcnZlclR5cGVJRCl7Ci0gICAgIHRoaXMuY2xpZW50U2VydmVyVHlwZUlEID0gY2xpZW50U2VydmVyVHlwZUlEOyAgCi0gICB9Ci0gICAKLSAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50U2VydmVyVHlwZUlEKCl7Ci0gICAgIHJldHVybiBjbGllbnRTZXJ2ZXJUeXBlSUQ7ICAKLSAgIH0KLQkgIAotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBJU2VydmVyIGlmIHJlcXVpcmVkCi0gICogQHBhcmFtIHNhbXBsZUV4aXN0aW5nU2VydmVyCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcil7Ci0JdGhpcy5zZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU2VydmVyIGdldFNlcnZpY2VFeGlzdGluZ1NlcnZlcigpewotICAgIHJldHVybiBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7ICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBTdHJpbmcgaWYgcmVxdWlyZWQKLSAgICogQHBhcmFtIGNsaWVudEVBUlByb2plY3QKLSAgICovCi0gICBwdWJsaWMgdm9pZCBzZXRDbGllbnRFQVJQcm9qZWN0KFN0cmluZyBjbGllbnRFQVJQcm9qZWN0KXsKLSAJdGhpcy5jbGllbnRFQVJQcm9qZWN0ID0gY2xpZW50RUFSUHJvamVjdDsgICAKLSAgIH0KLSAgIAotICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRFQVJQcm9qZWN0KCl7Ci0gICAgIHJldHVybiBjbGllbnRFQVJQcm9qZWN0OyAgIAotICAgfQotICAgCi0gICAKLSAgIC8qKgotICAgICogVGhpcyBpcyB0aGUgU3RyaW5nIGlmIHJlcXVpcmVkCi0gICAgKiBAcGFyYW0gY2xpZW50RUFSUHJvamVjdAotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50RUFSTW9kdWxlKFN0cmluZyBjbGllbnRFQVJNb2R1bGUpewotICAJdGhpcy5jbGllbnRFQVJNb2R1bGUgPSBjbGllbnRFQVJNb2R1bGU7ICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50RUFSTW9kdWxlKCl7Ci0gICAgICByZXR1cm4gY2xpZW50RUFSTW9kdWxlOyAgIAotICAgIH0KLSAgIAotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBJU2VydmVyIGlmIHJlcXVpcmVkCi0gICogQHBhcmFtIHNhbXBsZUV4aXN0aW5nU2VydmVyCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgY2xpZW50RXhpc3RpbmdTZXJ2ZXIpewotICAgIHRoaXMuY2xpZW50RXhpc3RpbmdTZXJ2ZXIgPSBjbGllbnRFeGlzdGluZ1NlcnZlcjsgICAKLSAgfQotICAgCi0gIHB1YmxpYyBJU2VydmVyIGdldENsaWVudEV4aXN0aW5nU2VydmVyKCl7Ci0gICAgcmV0dXJuIGNsaWVudEV4aXN0aW5nU2VydmVyOyAgIAotICB9Ci0gICAKLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgZW5kcG9pbnRzIGlmIG1vbml0b3Igc2VydmljZSBpcyBlbmFibGVkCi0gICogQHBhcmFtIGVuZHBvaW50cwotICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChMaXN0IGVuZHBvaW50cyl7Ci0JdGhpcy5lbmRwb2ludHMgPSBlbmRwb2ludHM7ICAKLSAgfQotICBwdWJsaWMgTGlzdCBnZXRFbmRwb2ludCgpewotICAgIHJldHVybiBlbmRwb2ludHM7ICAKLSAgfSAKLQotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBwcm9qZWN0IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGgKLSAgKiB3c2RsCi0gICogQHBhcmFtIHNlcnZpY2VQcm9qZWN0Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KFN0cmluZyBzZXJ2aWNlUHJvamVjdCl7Ci0gICAgdGhpcy5zZXJ2aWNlUHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0OyAgICAJICAKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVByb2plY3QoKXsKLSAgICByZXR1cm4gc2VydmljZVByb2plY3Q7Ci0gIH0KLQotICAvKioKLSAgKiBXU0RMIFVSTAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsU2VydmljZVVSTChTdHJpbmcgd3NkbFNlcnZpY2VVUkwpewotCXRoaXMud3NkbFNlcnZpY2VVUkwgPSB3c2RsU2VydmljZVVSTDsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxTZXJ2aWNlVVJMKCl7Ci0gICAgcmV0dXJuIHdzZGxTZXJ2aWNlVVJMOyAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBjbGllbnROZWVkRUFSCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnROZWVkRUFSKCkgewotCQlyZXR1cm4gY2xpZW50TmVlZEVBUjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudE5lZWRFQVIoYm9vbGVhbiBjbGllbnROZWVkRUFSKSB7Ci0JCXRoaXMuY2xpZW50TmVlZEVBUiA9IGNsaWVudE5lZWRFQVI7Ci0gIH0KLQotICAvKioKLSAgICogZXh0ZXJuYWwgYnJvd3NlcgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RXh0ZXJuYWxCcm93c2VyKCkgCi0gIHsKLQkgIHJldHVybiBleHRlcm5hbEJyb3dzZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEJyb3dzZXIoYm9vbGVhbiBleHRlcm5hbEJyb3dzZXIpIHsKLQkgIHRoaXMuZXh0ZXJuYWxCcm93c2VyID0gZXh0ZXJuYWxCcm93c2VyOwotICB9Ci0KLXB1YmxpYyBib29sZWFuIGdldFJ1blRlc3RDbGllbnQoKSB7Ci0JcmV0dXJuIHJ1blRlc3RDbGllbnQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFJ1blRlc3RDbGllbnQoYm9vbGVhbiBydW5UZXN0Q2xpZW50KSB7Ci0JdGhpcy5ydW5UZXN0Q2xpZW50ID0gcnVuVGVzdENsaWVudDsKLX0KLQotCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUNsaWVudEluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk0ZTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNzI4ICAgMTQ1NDI2IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRJbmZvIHsKLQotCXByaXZhdGUgV2ViU2VydmljZVN0YXRlIHN0YXRlOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQ7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckluc3RhbmNlSWQ7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQ7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHdzZGxVUkw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGltcGxVUkw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHByb3h5RW5kcG9pbnQgPSBudWxsOwotCQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEltcGxVUkwoKSB7Ci0JCXJldHVybiBpbXBsVVJMOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsVVJMKGphdmEubGFuZy5TdHJpbmcgaW1wbFVSTCkgewotCQl0aGlzLmltcGxVUkwgPSBpbXBsVVJMOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2ZXJGYWN0b3J5SWQoKSB7Ci0JCXJldHVybiBzZXJ2ZXJGYWN0b3J5SWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkgewotCQl0aGlzLnNlcnZlckZhY3RvcnlJZCA9IHNlcnZlckZhY3RvcnlJZDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VJZCgpIHsKLQkJcmV0dXJuIHNlcnZlckluc3RhbmNlSWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkKSB7Ci0JCXRoaXMuc2VydmVySW5zdGFuY2VJZCA9IHNlcnZlckluc3RhbmNlSWQ7Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlU3RhdGUgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U3RhdGUoV2ViU2VydmljZVN0YXRlIHN0YXRlKSB7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0V2ViU2VydmljZVJ1bnRpbWVJZCgpIHsKLQkJcmV0dXJuIHdlYlNlcnZpY2VSdW50aW1lSWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VSdW50aW1lSWQoamF2YS5sYW5nLlN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkKSB7Ci0JCXRoaXMud2ViU2VydmljZVJ1bnRpbWVJZCA9IHdlYlNlcnZpY2VSdW50aW1lSWQ7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFdzZGxVUkwoKSB7Ci0JCXJldHVybiB3c2RsVVJMOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsVVJMKGphdmEubGFuZy5TdHJpbmcgd3NkbFVSTCkgewotCQl0aGlzLndzZGxVUkwgPSB3c2RsVVJMOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm94eUVuZHBvaW50KCkgewotCQlyZXR1cm4gcHJveHlFbmRwb2ludDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UHJveHlFbmRwb2ludChqYXZhLmxhbmcuU3RyaW5nIHByb3h5RW5kcG9pbnQpIHsKLQkJdGhpcy5wcm94eUVuZHBvaW50ID0gcHJveHlFbmRwb2ludDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmExYjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIxICAgMTI4OTA1IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKiAyMDA2MDMzMCAgIDEyODgyNyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuY29tbW9uLk1lcmdlVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlSW5mbyB7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB3c2RsVVJMOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlbmRQb2ludFVSTDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaW1wbFVSTDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBpbXBsVVJMczsKLQkKLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmRQb2ludFVSTCgpCi0JewotCQlyZXR1cm4gZW5kUG9pbnRVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEVuZFBvaW50VVJMKGphdmEubGFuZy5TdHJpbmcgZW5kUG9pbnRVUkwpCi0JewotCQl0aGlzLmVuZFBvaW50VVJMID0gZW5kUG9pbnRVUkw7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEltcGxVUkwoKQotCXsKLQkJcmV0dXJuIGltcGxVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEltcGxVUkwoamF2YS5sYW5nLlN0cmluZyBpbXBsVVJMKQotCXsKLQkJdGhpcy5pbXBsVVJMID0gaW1wbFVSTDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkKCkKLQl7Ci0JCXJldHVybiBzZXJ2ZXJGYWN0b3J5SWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLQl7Ci0JCXRoaXMuc2VydmVyRmFjdG9yeUlkID0gc2VydmVyRmFjdG9yeUlkOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2ZXJJbnN0YW5jZUlkKCkKLQl7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJbnN0YW5jZUlkKGphdmEubGFuZy5TdHJpbmcgc2VydmVySW5zdGFuY2VJZCkKLQl7Ci0JCXRoaXMuc2VydmVySW5zdGFuY2VJZCA9IHNlcnZlckluc3RhbmNlSWQ7Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlU3RhdGUgZ2V0U3RhdGUoKQotCXsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShXZWJTZXJ2aWNlU3RhdGUgc3RhdGUpCi0JewotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFdlYlNlcnZpY2VSdW50aW1lSWQoKQotCXsKLQkJcmV0dXJuIHdlYlNlcnZpY2VSdW50aW1lSWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VSdW50aW1lSWQoamF2YS5sYW5nLlN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkKQotCXsKLQkJdGhpcy53ZWJTZXJ2aWNlUnVudGltZUlkID0gd2ViU2VydmljZVJ1bnRpbWVJZDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0V3NkbFVSTCgpCi0JewotCQlyZXR1cm4gd3NkbFVSTDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0V3NkbFVSTChqYXZhLmxhbmcuU3RyaW5nIHdzZGxVUkwpCi0JewotCQl0aGlzLndzZGxVUkwgPSB3c2RsVVJMOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEltcGxVUkxzKCkKLQl7Ci0JCXJldHVybiBpbXBsVVJMczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SW1wbFVSTHMoamF2YS5sYW5nLlN0cmluZ1tdIGltcGxVUkxzKQotCXsKLQkJdGhpcy5pbXBsVVJMcyA9IGltcGxVUkxzOwotCQlNZXJnZVV0aWxzLnN0b3JlTWVyZ2VNb2RlbHMoaW1wbFVSTHMpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlU2NlbmFyaW8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlU2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjY2YxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZVNjZW5hcmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMjQgICAxMTY3NTAgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYlNlcnZpY2VTY2VuYXJpbyBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPVFRPTVVQID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QRE9XTiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVCA9IDI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTY2VuYXJpbyBCT1RUT01VUF9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTY2VuYXJpbyhCT1RUT01VUCwgIkJPVFRPTVVQIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVNjZW5hcmlvIFRPUERPV05fTElURVJBTCA9IG5ldyBXZWJTZXJ2aWNlU2NlbmFyaW8oVE9QRE9XTiwgIlRPUERPV04iKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU2NlbmFyaW8gQ0xJRU5UX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVNjZW5hcmlvKENMSUVOVCwgIkNMSUVOVCIpOwotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2ViU2VydmljZVNjZW5hcmlvW10gVkFMVUVTX0FSUkFZID0KLSAgICBuZXcgV2ViU2VydmljZVNjZW5hcmlvW10KLSAgICB7Ci0JICBCT1RUT01VUF9MSVRFUkFMLAotCSAgVE9QRE9XTl9MSVRFUkFMLAotCSAgQ0xJRU5UX0xJVEVSQUwsCi0gICAgfTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlU2NlbmFyaW8gZ2V0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgV2ViU2VydmljZVNjZW5hcmlvIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgIGlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTY2VuYXJpbyBnZXQoaW50IHZhbHVlKQotICB7Ci0gICAgc3dpdGNoICh2YWx1ZSkKLSAgICB7Ci0gICAgICBjYXNlIEJPVFRPTVVQOiByZXR1cm4gQk9UVE9NVVBfTElURVJBTDsKLSAgICAgIGNhc2UgVE9QRE9XTjogcmV0dXJuIFRPUERPV05fTElURVJBTDsKLSAgICAgIGNhc2UgQ0xJRU5UOiByZXR1cm4gQ0xJRU5UX0xJVEVSQUw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwkKLSAgfQotCi0gIC8qKgotICAgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcml2YXRlIFdlYlNlcnZpY2VTY2VuYXJpbyhpbnQgdmFsdWUsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIodmFsdWUsIG5hbWUpOwotICB9Ci0gIAotCi19IC8vV2ViU2VydmljZVNjZW5hcmlvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZVN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZVN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBjMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYlNlcnZpY2VTdGF0ZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZFTE9QRUQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NFTUJMRUQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVBMT1lFRCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExFRCA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkcgPSA1OwotICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlIFVOS05PV05fTElURVJBTCA9IG5ldyBXZWJTZXJ2aWNlU3RhdGUoVU5LTk9XTiwgIlVOS05PV04iKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU3RhdGUgREVWRUxPUEVEX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKERFVkVMT1BFRCwgIkRFVkVMT1BFRCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZSBBU1NFTUJMRURfTElURVJBTCA9IG5ldyBXZWJTZXJ2aWNlU3RhdGUoQVNTRU1CTEVELCAiQVNTRU1CTEVEIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlIERFUExPWUVEX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKERFUExPWUVELCAiREVQTE9ZRUQiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU3RhdGUgSU5TVEFMTEVEX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKElOU1RBTExFRCwgIklOU1RBTExFRCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZSBSVU5OSU5HX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKFJVTk5JTkcsICJSVU5OSU5HIik7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlW10gVkFMVUVTX0FSUkFZID0KLSAgICBuZXcgV2ViU2VydmljZVN0YXRlW10KLSAgICB7Ci0JICBVTktOT1dOX0xJVEVSQUwsCi0JICBERVZFTE9QRURfTElURVJBTCwKLQkgIEFTU0VNQkxFRF9MSVRFUkFMLAotCSAgREVQTE9ZRURfTElURVJBTCwKLQkgIElOU1RBTExFRF9MSVRFUkFMLAotCSAgUlVOTklOR19MSVRFUkFMLAotICAgIH07Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVN0YXRlIGdldChTdHJpbmcgbmFtZSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTdGF0ZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0gICAgICBpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlU3RhdGUgZ2V0KGludCB2YWx1ZSkKLSAgewotICAgIHN3aXRjaCAodmFsdWUpCi0gICAgewotICAgICAgY2FzZSBVTktOT1dOOiByZXR1cm4gVU5LTk9XTl9MSVRFUkFMOwotICAgICAgY2FzZSBERVZFTE9QRUQ6IHJldHVybiBERVZFTE9QRURfTElURVJBTDsKLSAgICAgIGNhc2UgQVNTRU1CTEVEOiByZXR1cm4gQVNTRU1CTEVEX0xJVEVSQUw7Ci0JICBjYXNlIERFUExPWUVEOiByZXR1cm4gREVQTE9ZRURfTElURVJBTDsKLQkgIGNhc2UgSU5TVEFMTEVEOiByZXR1cm4gSU5TVEFMTEVEX0xJVEVSQUw7Ci0JICBjYXNlIFJVTk5JTkc6IHJldHVybiBSVU5OSU5HX0xJVEVSQUw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwkKLSAgfQotCi0gIC8qKgotICAgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcml2YXRlIFdlYlNlcnZpY2VTdGF0ZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIodmFsdWUsIG5hbWUpOwotICB9Ci0KLX0gLy9XZWJTZXJ2aWNlU3RhdGUKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY5M2U3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1hc2QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtYXNkLXdzZGwxMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1yZWZhY3RvciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zb2FwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXNlYXJjaCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NWY2MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotd3NkbGVkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Qud3NkbC51aV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWE0ZGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDg3OTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotI1dlZCBNYXIgMDggMDA6NTI6MjkgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmY3YWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBKYW4gMzAgMjM6Mzg6MTUgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTJhM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfVUlfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAyLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5zcGVjaWFsaXplZCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy52aXNpdG9yLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uY29ubmVjdGlvbnMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5kaXJlY3RlZGl0LAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBvbGljaWVzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlcywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmxheW91dHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QudXRpbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0LAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbnMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuaWNvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5sYWJlbC5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVmYWN0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNvYXAuY3VzdG9taXphdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5nZWY7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy53c2RsNGo7YnVuZGxlLXZlcnNpb249IlsxLjQuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMi44LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjkyZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLWFzZC8sXAotICAgICAgICAgICBzcmMtYXNkLXdzZGwxMSxcCi0gICAgICAgICAgIHNyYy1yZWZhY3Rvci8sXAotICAgICAgICAgICBzcmMtc29hcC8sXAotICAgICAgICAgICBzcmMtc2VhcmNoLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL2RsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy9kbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZmYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL2RsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy9lbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvZWxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYzE5YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy9lbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRjOWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvdmFsaWRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy93c2RsX2ZpbGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvd3NkbF9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjFmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy93c2RsX2ZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzExNmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1fVUlfTEFCRUxfTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi1fVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEU9Q3JlYXRlIGEgbmV3IFdTREwgRmlsZQotX1VJX1dTRExfTEFCRUw9V1NETCBGaWxlcwotX1VJX0xBQkVMX0dFTkVSQUw9R2VuZXJhbAotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT049RG9jdW1lbnRhdGlvbgotX1VJX0xBQkVMX0VYVEVOU0lPTlM9RXh0ZW5zaW9ucwotX1VJX0xBQkVMX1JFRkFDVE9SPVJlZmFjdG9yCi1fVUlfRURJVE9SX05BTUU9V1NETCBFZGl0b3IKLV9VSV9SRUxPQURfREVQRU5ERU5DSUVTPVJlbG9hZCBEZXBlbmRlbmNpZXMKLXJlZmFjdG9yaW5nLm1lbnUubGFiZWw9UmVmYWN0b3IKLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLVNlbGVjdFJ1bGVyLmxhYmVsPVNlbGVjdCBSdWxlcgotV1NETEVkaXRvck1vZGVzPVdTREwgRWRpdG9yIE1vZGVzCi0KLV9VSV9QTFVHSU5fTkFNRT1XU0RMIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDIzOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVfVUlfRURJVE9SX05BTUUiCi0JCQlpY29uPSJpY29ucy93c2RsX2ZpbGVfb2JqLmdpZiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5JbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMQWN0aW9uQmFyQ29udHJpYnV0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvciI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8Y2F0ZWdvcnkKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotCQkJbmFtZT0iJV9VSV9MQUJFTF9ORVdfQ0FURUdPUllfTkFNRV9XUyIgLz4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIgotCQkJbmFtZT0iV1NETCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1dTRExXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLQkJCWljb249Imljb25zL3dzZGxfZmlsZV9vYmouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0xBQkVMX0NSRUFURV9ORVdfV1NETF9GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIgotCQkJbmFtZT0iV1NETCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1dTRExXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5IgotCQkJaWNvbj0iaWNvbnMvd3NkbF9maWxlX29iai5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8IS0tIHBsYWNlIGV2ZXJ5dGhpbmcgaW4gIldlYiBhbmQgWE1MIiAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVfVUlfV1NETF9MQUJFTCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMUHJlZmVyZW5jZVBhZ2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gc3VwbGVtZW50IFdTREwgMS4xIHNjaGVtYXMgaW4gb3JkZXIgdG8gICAtLT4KLQk8IS0tIGNvbnN0cmFpbiB0aGUgZXh0ZW5zaWJsaXR5IGVsZW1lbnRzIHRoYXQgYXJlIGFsbG93ZWQgYXQgdGhlICd3c2RsJyBsZXZlbCAtLT4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciIKLQkJbmFtZT0iRXh0ZW5zaWJsaXR5IEVsZW1lbnQgRmlsdGVyIgotCQlzY2hlbWE9InNjaGVtYS9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlci5leHNkIiAvPgotCQkKLSAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJXU0RMRWRpdG9yRXh0ZW5zaW9uQ29uZmlndXJhdGlvbiIgbmFtZT0iV1NETEVkaXRvckV4dGVuc2lvbkNvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0b3JNb2RlcyIgbmFtZT0iJVdTRExFZGl0b3JNb2RlcyIvPgotICAgIAotICAgIDwhLS0gdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCwgdXNlIGV4dGVuc2lvbkNhdGVnb3JpZXMgLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iRXh0ZW5zaW9uc1NjaGVtYXNEZXNjcmlwdGlvbiIgbmFtZT0idGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCIvPgkKLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbnNpb25DYXRlZ29yaWVzIiBuYW1lPSJFeHRlbnNpb24gQ2F0ZWdvcmllcyIvPgkJCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlDb250cmlidXRvciI+Ci0JCTxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0JCQljb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yIgotCi0JCQlsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNETGFiZWxQcm92aWRlciI+CQkJCi0JCQk8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0iZ2VuZXJhbCI+PC9wcm9wZXJ0eUNhdGVnb3J5PgotCQkJPHByb3BlcnR5Q2F0ZWdvcnkgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iPjwvcHJvcGVydHlDYXRlZ29yeT4KLQkJCTxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJleHRlbnNpYmlsaXR5Ij48L3Byb3BlcnR5Q2F0ZWdvcnk+Ci0JCTwvcHJvcGVydHlDb250cmlidXRvcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVRhYnMiPgotCQk8cHJvcGVydHlUYWJzCi0JCQljb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yIj4KLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX0dFTkVSQUwiCi0JCQkJY2F0ZWdvcnk9ImdlbmVyYWwiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIj4KLQkJCTwvcHJvcGVydHlUYWI+Ci0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9FWFRFTlNJT05TIgotCQkJCWNhdGVnb3J5PSJleHRlbnNpYmlsaXR5IgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sd2Vic2VydmljZXMuZXh0ZW5zaWJpbGl0eSI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfRE9DVU1FTlRBVElPTiIKLQkJCQljYXRlZ29yeT0iZG9jdW1lbnRhdGlvbiIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdlYnNlcnZpY2VzLmRvY3VtZW50YXRpb24iPgotCQkJPC9wcm9wZXJ0eVRhYj4KLQkJPC9wcm9wZXJ0eVRhYnM+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlTZWN0aW9ucyI+Ci0gICA8cHJvcGVydHlTZWN0aW9ucyBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yIj4KLSAgICAgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC54bWx3ZWJzZXJ2aWNlcy5kb2N1bWVudGF0aW9uIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5wcm9wZXJ0aWVzLnNlY3Rpb25zLkRvY3VtZW50YXRpb25TZWN0aW9uIgotCSAJaWQ9InByb3Auc2VjdGlvbi5Eb2N1bWVudGF0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3QiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgIAotICAgCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnMuTmFtZVNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uTmFtZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZSI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAKLSAgIAkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbnMuVzExUGFyYW1ldGVyU2VjdGlvbiIKLSAgICAgICAgZmlsdGVyPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb25zLlcxMVBhcmFtZXRlclNlY3Rpb25GaWx0ZXIiCi0JIAlpZD0icHJvcC5zZWN0aW9uLlcxMVBhcmFtZXRlclNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAotICAgCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnMuTmFtZVNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uTmFtZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JT3BlcmF0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnMuTmFtZVNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uTmFtZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW50ZXJmYWNlIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5wcm9wZXJ0aWVzLnNlY3Rpb25zLk5hbWVTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLk5hbWVTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVNlcnZpY2UiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QueG1sd2Vic2VydmljZXMuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9ucy5FbmRQb2ludFNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uRW5kUG9pbnRTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUVuZFBvaW50Ij4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5wcm9wZXJ0aWVzLnNlY3Rpb25zLkJpbmRpbmdTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLkJpbmRpbmdTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUJpbmRpbmciPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QueG1sd2Vic2VydmljZXMuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9ucy5JbXBvcnRTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLkltcG9ydFNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW1wb3J0Ij4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDwhLS0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmFzZC5lZGl0b3IucHJvcGVydGllcy5zZWN0aW9ucy5TY2hlbWFTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlNjaGVtYVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYXNkLmZhY2FkZS5JVHlwZSI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgkgCi0JLS0+Ci0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5wcm9wZXJ0aWVzLnNlY3Rpb25zLk5hbWVzcGFjZVNlY3Rpb24iCi0JIAlpZD0icHJvcC5zZWN0aW9uLk5hbWVzcGFjZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QueG1sd2Vic2VydmljZXMuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9ucy5OYW1lc3BhY2VTZWN0aW9uIgotCSAJaWQ9InByb3Auc2VjdGlvbi5OYW1lc3BhY2VTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFic3RyYWN0TW9kZWxDb2xsZWN0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnMuTmFtZXNwYWNlU2VjdGlvbiIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uTmFtZXNwYWNlU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFDYXRlZ29yeUFkYXB0ZXIiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCi0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbnMuVzExTWVzc2FnZVJlZmVyZW5jZVNlY3Rpb24iCi0JCWZpbHRlcj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9ucy5XMTFNZXNzYWdlUmVmZXJlbmNlU2VjdGlvbkZpbHRlciIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uTWVzc2FnZVJlZmVyZW5jZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZSI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAKLQkgPCEtLSBtb3ZlIHRvIHdzZGwgc3BlY2lmaWMgcGx1Z2luIC0tPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LnhtbHdlYnNlcnZpY2VzLmV4dGVuc2liaWxpdHkiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9ucy5XMTFFeHRlbnNpb25zU2VjdGlvbiIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uVzExQXBwbGljYXRpb25JbmZvU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXIiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QueG1sd2Vic2VydmljZXMuZXh0ZW5zaWJpbGl0eSIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb25zLlcxMUV4dGVuc2lvbnNTZWN0aW9uIgotCSAJaWQ9InByb3Auc2VjdGlvbi5XMTFBcHBsaWNhdGlvbkluZm9TZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFic3RyYWN0TW9kZWxDb2xsZWN0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9ucy5OYW1lU2VjdGlvbiIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uTmFtZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQmluZGluZ09wZXJhdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJIAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9ucy5OYW1lU2VjdGlvbiIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uTmFtZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQmluZGluZ01lc3NhZ2VSZWZlcmVuY2UiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgPC9wcm9wZXJ0eVNlY3Rpb25zPgotPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2lvbkNhdGVnb3JpZXMiPgotICAgICA8Y2F0ZWdvcnkKLSAgICAgCWRpc3BsYXlOYW1lPSJIVFRQIgotICAgICAgCW5hbWVzcGFjZVVSST0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI+Ci0gICAgICA8L2NhdGVnb3J5PgotCi0gICAgIDxjYXRlZ29yeQotICAgICAJZGlzcGxheU5hbWU9IlNPQVAiCi0gICAgICAJbmFtZXNwYWNlVVJJPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLSAgICAgPC9jYXRlZ29yeT4KLQotICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgZGlzcGxheU5hbWU9Ik1JTUUiCi0gICAgICAJbmFtZXNwYWNlVVJJPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIj4KLSAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLnJlZmFjdG9yaW5nLm1lbnUub2JqZWN0Q29udHJpYiIgCi0gICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyIj4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsZWRpdG9yLnJlZmFjdG9yaW5nLm1lbnUucmVmYWN0b3JHcm91cC5vYmplY3QiIAotICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJyZWZhY3RvcmluZy1zbG90LXRlbXAiCi0gICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9SRUZBQ1RPUiIgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5XU0RMUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIj4gCi0gICAgICAgICA8L2FjdGlvbj4gICAgICAgICAgCi0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgICAgICAgICAKLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLnNlYXJjaFJlZmVyZW5jZXMubWVudS5vYmplY3RDb250cmliIiAKLSAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXIiPiAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGxlZGl0b3Iuc2VhcmNoUmVmZXJlbmNlcy5tZW51LnNlYXJjaFJlZmVyZW5jZXMub2JqZWN0IiAKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0ic2VhcmNoUmVmZXJlbmNlcy1zbG90LXRlbXAiCi0gICAgICAgICAgICBsYWJlbD0iUmVmZXJlbmNlcyIgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuV1NETFNlYXJjaFJlZmVyZW5jZXNHcm91cEFjdGlvbkRlbGVnYXRlIj4gCi0gICAgICAgICA8L2FjdGlvbj4gICAgICAgICAgCi0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgICAgICAgICAKLSAgICA8L2V4dGVuc2lvbj4gICAgCi0JCi0JCTwhLS0gaW50aWFsaXplIHdzZGwgc291cmNlIHZhbGlkYXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVjb25jaWxlci5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JXU0RMIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQkJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPCEtLSBhZGQgcHJlZmVyZW5jZSBwYWdlcyB0byB0aGUgY29udGV4dCBtZW51IGFjdGlvbiAoSUQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBkZWNsYXJlZCAicGF0aCIgYWJvdmUpIC0tPgotPCEtLQotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMUHJlZmVyZW5jZVBhZ2UiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3Iuc291cmNlIiAvPgotLS0+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uV1NETCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZSIgLz4KLTwhLS0JCQkKLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuV1NETENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZSIgLz4KLS0tPgotCTwvZXh0ZW5zaW9uPgotCQotCQk8IS0tIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYXVnbWVudCB0aGUgTW9kZWxRdWVyeSB0byBwcm92aWRlIFdTREwgc3BlY2lmaWMgZ3VpZGVkIGVkaXRpbmcgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsUXVlcnlFeHRlbnNpb25zIj4KLQkJPG1vZGVsUXVlcnlFeHRlbnNpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50ZXh0LldTRExNb2RlbFF1ZXJ5RXh0ZW5zaW9uIgotCQkJY29udGVudFR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLndzZGxzb3VyY2UiPgotCQk8L21vZGVsUXVlcnlFeHRlbnNpb24+Ci0JPC9leHRlbnNpb24+Ci0gICAKLSAgICAgICAgPCEtLSBTZWFyY2ggcGFydGljaXBhbnQgZXh0ZW5zaW9uIHRoYXQgc3VwcG9ydHMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVuIG9uIFdTREwgcmVzb3VyY2VzIC0tPgotCSA8ZXh0ZW5zaW9uICAgCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoUGFydGljaXBhbnRzIj4KLQkJPHNlYXJjaFBhcnRpY2lwYW50Ci0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwuc2VhcmNoLldTRExTZWFyY2hQYXJ0aWNpcGFudCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guV1NETFNlYXJjaFBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJICAgPG9yPgotCQkJICAgICAgPHdpdGggdmFyaWFibGU9InBhdHRlcm4iPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIi8+CQkJICAgCi0JCQkJICA8L3dpdGg+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9zZWFyY2hQYXJ0aWNpcGFudD4KLQkgPC9leHRlbnNpb24+Ci0JCi0KLQotCTwhLS0gUmVmYWN0b3JpbmcgQ09SRSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IldTREwgUmVuYW1lIFBhcnRpY3BhbnQiICAgICAgICAgICAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWZhY3Rvci5XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkucmVmYWN0b3JpbmcuV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJICAgPG9yPgotCQkJICAgPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQiLz4JCQkgICAKLQkJCQk8L3dpdGg+Ci0JCQkgICA8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQiLz4JCQkJCQkJCQotCQkJCTwvd2l0aD4JCQkJCQkJCi0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4JCQkKLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4KLQkKLQkgCTwhLS0gIFJlZmFjdG9yaW5nIFVJIGV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLnJlZmFjdG9yaW5nLm1lbnUub2JqZWN0Q29udHJpYiIgCi0gICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQiPiAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5yZWZhY3RvcmluZy5tZW51LnJlZmFjdG9yR3JvdXAub2JqZWN0IiAKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgbGFiZWw9IiVyZWZhY3RvcmluZy5tZW51LmxhYmVsIiAKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zLldTRExSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgICAgIDwvYWN0aW9uPiAKLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgIAotICAgCi0gICAgPHZpZXdlckNvbnRyaWJ1dGlvbgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5tZW51LnNvdXJjZSIKLSAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLndzZGxzb3VyY2Uuc291cmNlLkVkaXRvckNvbnRleHQiPgotCSAgICA8YWN0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5yZWZhY3RvcmluZy5tZW51LnJlZmFjdG9yR3JvdXAuc291cmNlIgotICAgICAgIAkJc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgIGxhYmVsPSIlcmVmYWN0b3JpbmcubWVudS5sYWJlbCIgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5XU0RMUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIj4gCi0gIAkgICAgPC9hY3Rpb24+Ci0gICAgICAgPC92aWV3ZXJDb250cmlidXRpb24+ICAgICAgIAotICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAKLSAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQud3NkbC5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLndzZGwucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50Ij4KLQkJPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPiAgIAotCQotCQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLmFydGljbGVzLmFjdGlvbi5jb250cmlidXRpb24uZWRpdG9yIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3IiPgotCi0JCQk8bWVudQotCQkJCWlkPSJXU0RMRWRpdG9yIgotCQkJCWxhYmVsPSIlX1VJX0VESVRPUl9OQU1FIgotCQkJCXBhdGg9ImFkZGl0aW9ucyI+Ci0JCQkJPHNlcGFyYXRvciBuYW1lPSJncm91cDEiIC8+Ci0JCQk8L21lbnU+Ci0KLQkJCTxhY3Rpb24KLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuYWN0aW9ucy5SZWxvYWREZXBlbmRlbmNpZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlsYWJlbD0iJV9VSV9SRUxPQURfREVQRU5ERU5DSUVTIgotCQkJCWljb249Imljb25zL3JlbG9hZGdyYW1tYXIuZ2lmIgotCQkJCXRvb2x0aXA9IlJlbG9hZCBEZXBlbmRlbmNpZXMiCi0JCQkJbWVudWJhclBhdGg9IldTRExFZGl0b3IvZ3JvdXAxIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5SZWxvYWREZXBlbmRlbmNpZXNBY3Rpb25EZWxlZ2F0ZSI+Ci0JCQk8L2FjdGlvbj4KLQotCQkJPCEtLQotCQkJCTxhY3Rpb24KLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5WYWxpZGF0ZUFjdGlvbkRlbGVnYXRlIiAKLQkJCQlsYWJlbD0iJV9VSV9BQ1RJT05fVkFMSURBVEVfV1NETF9ET0NVTUVOVCIgCi0JCQkJaWNvbj0iaWNvbnMvdmFsaWRhdGUuZ2lmIiAKLQkJCQl0b29sdGlwPSIlX1VJX0FDVElPTl9WQUxJREFURV9XU0RMX0RPQ1VNRU5UIgotCQkJCW1lbnViYXJQYXRoPSJXU0RMRWRpdG9yL2dyb3VwMSIKLQkJCQl0b29sYmFyUGF0aD0iJU5vcm1hbC9XU0RMRWRpdG9yIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlZhbGlkYXRlQWN0aW9uRGVsZWdhdGUiPiAKLQkJCQk8L2FjdGlvbj4gICAgICAKLQkJCS0tPgotCi0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLQkJPGV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyCi0JCQluYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLlNvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIj4KLQkJPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLQkJPGV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyCi0JCQluYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLkh0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIj4KLQkJPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLQkJPGV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyCi0JCQluYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLk1pbWVFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIj4KLQkJPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLQk8L2V4dGVuc2lvbj4KLQotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIiPgotCQk8ZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIKLQkJCW5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLlhTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIiPgotCQk8L2V4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLSAgCSAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmV4dGVuc2liaWxpdHlOb2RlQ3VzdG9taXphdGlvbnMiPgotICAgICAgIDxub2RlQ3VzdG9taXphdGlvbgotCQkJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCQkJbm9kZUVkaXRvclByb3ZpZGVyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNvYXAuY3VzdG9taXphdGlvbnMuU09BUE5vZGVFZGl0b3JQcm92aWRlciIKLQkJCWxhYmVsUHJvdmlkZXJDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubGFiZWwucHJvdmlkZXJzLlNPQVBMYWJlbFByb3ZpZGVyIj4KLQkJPC9ub2RlQ3VzdG9taXphdGlvbj4JCQotICAgICAgIDxub2RlQ3VzdG9taXphdGlvbgotCQkJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotCQkJbm9kZUVkaXRvclByb3ZpZGVyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNvYXAuY3VzdG9taXphdGlvbnMuU09BUE5vZGVFZGl0b3JQcm92aWRlciIKLQkJCWxhYmVsUHJvdmlkZXJDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubGFiZWwucHJvdmlkZXJzLkhUVFBMYWJlbFByb3ZpZGVyIj4KLQkJPC9ub2RlQ3VzdG9taXphdGlvbj4JCQkJCQotCTwvZXh0ZW5zaW9uPgkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zY2hlbWEvZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc2NoZW1hL2V4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDcwZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zY2hlbWEvZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiIGlkPSJleHRlbnNpYmlsaXR5ZWxlbWVudEZpbHRlciIgbmFtZT0iRXh0ZW5zaWJpbGl0eSBFbGVtZW50IEZpbHRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgRXh0ZW5zaWJpbGl0eSBFbGVtZW50IEZpbHRlciBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gcmVnaXN0ZXIgZmlsdGVycyBmb3IgRXh0ZW5zaWJpbGl0eSBFbGVtZW50cyBpbiB0aGUgV1NETCBFZGl0b3IgYmFzZWQgb24gdGhlIEV4dGVuc2liaWxpdHkgRWxlbWVudCZhcG9zO3MgbmFtZXNwYWNlLiAgVGhlc2UgZmlsdGVycyBkZXRlcm1pbmUgd2hhdCBpcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIFdTREwgRWRpdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWVzcGFjZSB0aGlzIGV4dGVuc2lvbiBwb2ludCBpbnN0YW5jZSBhcHBsaWVzIHRvLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLkV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEV4dGVuc2liaWxpdHkgRWxlbWVudCBGaWx0ZXIgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2V4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyCi0gICAgICAgICAgICBuYW1lc3BhY2U9JnF1b3Q7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLlNvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHN1cHBsaWVkIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlci5FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zY2hlbWEvZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NjaGVtYS9leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmODk3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NjaGVtYS9leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiIGlkPSJleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMiIG5hbWU9IkV4dGVuc2liaWxpdHkgSXRlbSBUcmVlIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgRXh0ZW5zaWJpbGl0eSBJdGVtIFRyZWUgUHJvdmlkZXIgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIHJlZ2lzdGVyIGN1c3RvbSBJTGFiZWxQcm92aWRlcnMgKHRvIHByb3ZpZGUgY3VzdG9tIGxhYmVscyBhbmQgaWNvbnMpIGZvciBFeHRlbnNpYmlsaXR5IEVsZW1lbnRzIGluIHRoZSBXU0RMIEVkaXRvciBiYXNlZCBvbiB0aGUgRXh0ZW5zaWJpbGl0eSBFbGVtZW50JmFwb3M7cyBuYW1lc3BhY2UuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZXNwYWNlIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGluc3RhbmNlIGFwcGxpZXMgdG8uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWxQcm92aWRlckNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gRXh0ZW5zaWJpbGl0eSBJdGVtIFRyZWUgUHJvdmlkZXIgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVycyZxdW90OyZndDsKLSAgICAgICZsdDtleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcgotICAgICAgICAgICAgbmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8mcXVvdDsKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXJDbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lLlNPQVBMYWJlbFByb3ZpZGVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHN1cHBsaWVkIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NjaGVtYS9pbnRlcm5hbEVkaXRvckV4dGVuc2lvbnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc2NoZW1hL2ludGVybmFsRWRpdG9yRXh0ZW5zaW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTcxMGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc2NoZW1hL2ludGVybmFsRWRpdG9yRXh0ZW5zaW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIgaWQ9ImludGVybmFsRWRpdG9yRXh0ZW5zaW9ucyIgbmFtZT0iSW50ZXJuYWwgRWRpdG9yIEV4dGVuc2lvbnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIEludGVybmFsIEVkaXRvciBFeHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIEdVSSBvYmplY3RzLCBhY3Rpb25zLCBjb250ZXh0IG1lbnUgaXRlbXMsIGV0Yy4uLiBmb3Igbm9uIFdTREwgTW9kZWwgT2JqZWN0cyBpbiB0aGUgV1NETCBFZGl0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImludGVybmFsRWRpdG9yRXh0ZW5zaW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbnRlcm5hbEVkaXRvckV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb24mbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEludGVybmFsIEVkaXRvciBFeHRlbnNpb24gY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsRWRpdG9yRXh0ZW5zaW9ucyZxdW90OyZndDsKLSAgICAgICZsdDtpbnRlcm5hbEVkaXRvckV4dGVuc2lvbgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLlhTREV4dGVuc2lvbiZxdW90OyAvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgc3VwcGxpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb24mbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NjaGVtYS9wcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zY2hlbWEvcHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzODQ2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NjaGVtYS9wcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIgaWQ9InByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyIiBuYW1lPSJQcm9wZXJ0eSBEZXNjcmlwdG9yIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBQcm9wZXJ0eSBEZXNjcmlwdG9yIFByb3ZpZGVyIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byByZWdpc3RlciB0aGVpciBvd24gY3VzdG9tIElQcm9wZXJ0eURlc2NyaXB0b3IgaW4gdGhlIFdTREwgRWRpdG9yIGJhc2VkIG9uIG5hbWVzcGFjZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lc3BhY2UgdGhpcyBleHRlbnNpb24gcG9pbnQgaW5zdGFuY2UgYXBwbGllcyB0by4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gIGNvbnRyaWJ1dGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5wcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlciZxdW90OyZndDsKLSAgICAgICZsdDtwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlcgotICAgICAgICAgICAgbmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8mcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4YW1wbGUuRXhhbXBsZVByb3BlcnR5RGVzY3JpcHRvciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3ImbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL0RlZmF1bHRFZGl0b3JNb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL0RlZmF1bHRFZGl0b3JNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNzc0OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9EZWZhdWx0RWRpdG9yTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMuQVNERWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLkFTRENvbnRlbnRPdXRsaW5lUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9ucy5FZGl0b3JNb2RlU2VjdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRFZGl0b3JNb2RlIGV4dGVuZHMgRWRpdG9yTW9kZQotewotICBwcml2YXRlIEVkaXRvck1vZGVTZWN0aW9uRmlsdGVyIHNlY3Rpb25GaWx0ZXIgPSBudWxsOyAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIERlZmF1bHRFZGl0b3JNb2RlLmNsYXNzLmdldE5hbWUoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotICB7Ci0gICAgcmV0dXJuICJkZWZhdWx0IjsKLSAgfQotCi0gIHB1YmxpYyBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBuZXcgQVNERWRpdFBhcnRGYWN0b3J5KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiBJRDsKLSAgfQotCi0gIHB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldE91dGxpbmVQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFTRENvbnRlbnRPdXRsaW5lUHJvdmlkZXIoKTsKLSAgfSAKLSAgIAotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyMDFhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQlwdWJsaWMgdm9pZCBpbml0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zKElBY3Rpb25CYXJzIGJhcnMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvSVNlbGVjdGlvbk1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9JU2VsZWN0aW9uTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmRhZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9JU2VsZWN0aW9uTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbk1hcHBlciB7Ci0JSVNlbGVjdGlvbiBtYXBTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3RlZE9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL0ludGVybmFsV1NETE11bHRpUGFnZUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9JbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5NDhhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL0ludGVybmFsV1NETE11bHRpUGFnZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmFjdGlvbnMuVzExQWRkUGFydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zLlcxMU9wZW5JbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFTZXRFeGlzdGluZ0VsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFTZXRFeGlzdGluZ01lc3NhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFTZXRFeGlzdGluZ1R5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFTZXROZXdFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmFjdGlvbnMuVzExU2V0TmV3TWVzc2FnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zLlcxMVNldE5ld1R5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNETXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZE1lc3NhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNERGlyZWN0RWRpdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLktleWJvYXJkRHJhZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMuRGVmaW5pdGlvbnNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5BU0RDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnV0aWwuSU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0LlcxMUJpbmRpbmdSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0LlcxMUludGVyZmFjZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQuVzExTWVzc2FnZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQuV1NETFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0LldTRExYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudGV4dC5XU0RMTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlcxMU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExBZGFwdGVyRmFjdG9yeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUtleWJvYXJkRHJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLlByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBBU0RNdWx0aVBhZ2VFZGl0b3IKLXsKLQlSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQlSZXNvdXJjZSB3c2RsUmVzb3VyY2U7Ci0JCi0JcHJvdGVjdGVkIFdTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIgcmVzb3VyY2VDaGFuZ2VIYW5kbGVyOwotCQotCXByb3RlY3RlZCBXU0RMTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlcjsKLQlwcm90ZWN0ZWQgU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgZlNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyOwotCXByb3RlY3RlZCBXU0RMU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkxpc3RlbmVyIGZXU0RMU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLSAgcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbDsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfRURJVE9SX01PREVfRVhURU5TSU9OX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmVkaXRvck1vZGVzIjsgLy8kTk9OLU5MUy1OJCAgCi0gIAotICBwdWJsaWMgSURlc2NyaXB0aW9uIGJ1aWxkTW9kZWwoSUZpbGVFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeyAgIAotCSAgdHJ5IHsKLQkJICAvLyBJU1NVRTogVGhpcyBjb2RlIHdoaWNoIGRlYWxzIHdpdGggdGhlIHN0cnVjdHVyZWQgbW9kZWwgaXMgc2ltaWxhciB0byB0aGUgb25lIGluIHRoZSBYU0QgZWRpdG9yLiAKLQkJICAvLyBJdCBjb3VsZCBiZSByZWZhY3RvcmVkIGludG8gdGhlIGJhc2UgY2xhc3MuCi0KLQkJICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCSAgSURvY3VtZW50IGRvYyA9IHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3JJbnB1dCk7Ci0JCSAgaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jKTsKLQkJCSAgaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCQkgIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYyk7Ci0JCQkgIH0KLQkJCSAgc3RydWN0dXJlZE1vZGVsID0gbW9kZWw7Ci0JCQkgIGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkgIH0KLQkJICBBc3NlcnQuaXNOb3ROdWxsKGRvY3VtZW50KTsKLQotCQkgIE9iamVjdCBvYmogPSBudWxsOwotCi0JCSAgaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJICBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQkJICBtb2RlbEFkYXB0ZXIgPSAoV1NETE1vZGVsQWRhcHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihXU0RMTW9kZWxBZGFwdGVyLmNsYXNzKTsKLQkJCSAgaWYgKG1vZGVsQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJICBtb2RlbEFkYXB0ZXIgPSBuZXcgV1NETE1vZGVsQWRhcHRlcigpOwotCQkJCSAgbm90aWZpZXIuYWRkQWRhcHRlcihtb2RlbEFkYXB0ZXIpOwotCQkJCSAgb2JqID0gbW9kZWxBZGFwdGVyLmNyZWF0ZURlZmluaXRpb24oZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGRvY3VtZW50KTsKLQkJCSAgfQotCQkJICBpZiAob2JqID09IG51bGwpIHsKLQkJCQkgIG9iaiA9IG1vZGVsQWRhcHRlci5jcmVhdGVEZWZpbml0aW9uKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLCBkb2N1bWVudCk7Ci0JCQkgIH0KLQkJICB9Ci0KLQkJICBpZiAob2JqIGluc3RhbmNlb2YgRGVmaW5pdGlvbikgewotCQkJICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgb2JqOwotCQkJICBtb2RlbCA9IChJRGVzY3JpcHRpb24pIFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlci5nZXRJbnN0YW5jZSgpLmFkYXB0KGRlZmluaXRpb24pOwotCQkgIH0KLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICB9ICAgIAotCi0JICByZXR1cm4gbW9kZWw7Ci0gIH0KLQkKLQlwcml2YXRlIFhTRFNjaGVtYVtdIGdldElubGluZVNjaGVtYXMoKSB7Ci0JCUxpc3QgdHlwZXMgPSBnZXRNb2RlbCgpLmdldFR5cGVzKCk7Ci0JCVhTRFNjaGVtYVtdIHNjaGVtYXMgPSBuZXcgWFNEU2NoZW1hW3R5cGVzLnNpemUoKV07Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlcy5zaXplKCk7IGluZGV4KyspIHsKLQkJCVcxMVR5cGUgdHlwZSA9IChXMTFUeXBlKSB0eXBlcy5nZXQoaW5kZXgpOwotCQkJc2NoZW1hc1tpbmRleF0gPSAoWFNEU2NoZW1hKSB0eXBlLmdldFRhcmdldCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc2NoZW1hczsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gRGVmaW5pdGlvbi5jbGFzcykKLQkJewotCQkJcmV0dXJuICgoVzExRGVzY3JpcHRpb24pIGdldE1vZGVsKCkpLmdldFRhcmdldCgpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gSVNlbGVjdGlvbk1hcHBlci5jbGFzcykKLQkJewotCQkJcmV0dXJuIG5ldyBXU0RMU2VsZWN0aW9uTWFwcGVyKCk7Ci0JCX0KLSAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBEZWZpbml0aW9uLmNsYXNzICYmIG1vZGVsIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoKEFkYXB0ZXIpbW9kZWwpLmdldFRhcmdldCgpOyAKLSAgICAgICAgfQotCQllbHNlIGlmICh0eXBlID09IElPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIuY2xhc3MpIHsKLQkJCXJldHVybiBuZXcgVzExT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyKCgoSUZpbGVFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpKTsKLQkJfQotCi0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotICAgICAgICAgICAgV1NETFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlciByZWZNYW5hZ2VyID0gbmV3IFdTRExYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSwgbnVsbCk7Ci0gICAgICAgICAgICByZWZNYW5hZ2VyLnNldFNjaGVtYXMoZ2V0SW5saW5lU2NoZW1hcygpKTsKLSAgICAgICAgICAgIHJldHVybiByZWZNYW5hZ2VyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0eXBlID09IFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAgICAgICAgIFdTRExYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVmTWFuYWdlciA9IG5ldyBXU0RMWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCksIG51bGwpOwotICAgICAgICAgICAgcmVmTWFuYWdlci5zZXRTY2hlbWFzKGdldElubGluZVNjaGVtYXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVmTWFuYWdlcjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBXMTFCaW5kaW5nUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpIHsKLSAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgCUlGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotICAgICAgICAgICAgCXJldHVybiBuZXcgVzExQmluZGluZ1JlZmVyZW5jZUVkaXRNYW5hZ2VyKChXMTFEZXNjcmlwdGlvbikgZ2V0TW9kZWwoKSwgZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBXMTFJbnRlcmZhY2VSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcykgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgICAgICAgICAJcmV0dXJuIG5ldyBXMTFJbnRlcmZhY2VSZWZlcmVuY2VFZGl0TWFuYWdlcigoVzExRGVzY3JpcHRpb24pIGdldE1vZGVsKCksIGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgfSAgICAgICAgCQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gVzExTWVzc2FnZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0gICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAgICAgICAgIAlyZXR1cm4gbmV3IFcxMU1lc3NhZ2VSZWZlcmVuY2VFZGl0TWFuYWdlcigoVzExRGVzY3JpcHRpb24pIGdldE1vZGVsKCksIGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgfSAgICAgICAgCQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gSUtleWJvYXJkRHJhZy5jbGFzcykgewotCQkJcmV0dXJuIG5ldyBLZXlib2FyZERyYWdJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3RlbmVyIG9uIFNTRSdzIHNvdXJjZSBlZGl0b3IncyBzZWxlY3Rpb25zIHRoYXQgY29udmVydHMgRE9NCi0JICogc2VsZWN0aW9ucyBpbnRvIHhzZCBzZWxlY3Rpb25zIGFuZCBub3RpZmllcyBXU0RMIHNlbGVjdGlvbiBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQkvKioKLQkJICogRGV0ZXJtaW5lcyBXU0RMIGZhY2FkZSBvYmplY3QgYmFzZWQgb24gRE9NIG5vZGUKLQkJICogCi0JCSAqIEBwYXJhbSBvYmplY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBPYmplY3QgZ2V0V1NETEZhY2FkZU9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyBnZXQgdGhlIGVsZW1lbnQgbm9kZQotCQkJRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQkJZWxlbWVudCA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlPYmplY3QgbyA9IGVsZW1lbnQ7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJRGVmaW5pdGlvbiBkZWYgPSAoRGVmaW5pdGlvbikgKChXMTFEZXNjcmlwdGlvbikgbW9kZWwpLmdldFRhcmdldCgpOwotCQkJCU9iamVjdCBtb2RlbE9iamVjdCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChkZWYsIGVsZW1lbnQpOwotCQkJCQotCQkJCS8vIHJtYWg6IFdlIGhhbmRsZSB0aGlzIHNwZWNpYWwgc2NlbmFyaW8gd2hlcmUgdGhlIG1vZGVsT2JqZWN0IGlzIGFuIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50LgotCQkJCS8vIFdlIGFjdHVhbGx5IHdhbnQgdGhlIFhTRFNjaGVtYSBvYmplY3QuICBIb3dldmVyLCBvdXIgbm9kZSByZWNvbmNpbGVyIHdpbGwgYWx3YXlzIHJldHVybgotCQkJCS8vIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGJlY2F1c2UgYm90aCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBhbmQgWFNEU2NoZW1hCi0JCQkJLy8gYm90aCBoYXZlIHRoZSBTQU1FIEVsZW1lbnQgb2JqZWN0LCBhbmQgdGhlIHJlY29uY2lsZXIgZW5jb3VudGVycyB0aGUgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLQkJCQkvLyBmaXJzdC4uLi4gIFNlZSBXU0RMTm9kZU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIGZvciBtb3JlIGRldGFpbHMuLi4uLgotCQkJCWlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSB7Ci0JCQkJCW1vZGVsT2JqZWN0ID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgbW9kZWxPYmplY3QpLmdldFNjaGVtYSgpOwotCQkJCX0KLQkJCQlpZiAobW9kZWxPYmplY3QgIT0gbnVsbCkgewotCQkJCQlvID0gV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyLmdldEluc3RhbmNlKCkuYWRhcHQoKE5vdGlmaWVyKSBtb2RlbE9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG87Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldEVuYWJsZU5vdGlmeSgpICYmIGdldEFjdGl2ZVBhZ2UoKSA9PSAxKQotCQkJewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCXsKLQkJCQkJTGlzdCBzZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQkJewotCQkJCQkJT2JqZWN0IGRvbU5vZGUgPSBpLm5leHQoKTsKLQkJCQkJCU9iamVjdCBmYWNhZGUgPSBnZXRXU0RMRmFjYWRlT2JqZWN0KGRvbU5vZGUpOwotCQkJCQkJaWYgKGZhY2FkZSAhPSBudWxsKQotCQkJCQkJewotCQkJCQkJCXNlbGVjdGlvbnMuYWRkKGZhY2FkZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICghc2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0JCQkJCXsKLQkJCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gd3NkbFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbnMpOwotCQkJCQkJZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbih3c2RsU2VsZWN0aW9uLCBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTGlzdGVuZXIgb24gV1NETCdzIHNlbGVjdGlvbiBtYW5hZ2VyJ3Mgc2VsZWN0aW9ucyB0aGF0IGNvbnZlcnRzIFdTREwKLQkgKiBzZWxlY3Rpb25zIGludG8gRE9NIHNlbGVjdGlvbnMgYW5kIG5vdGlmaWVzIFNTRSdzIHNlbGVjdGlvbiBwcm92aWRlcgotCSAqLwotCXByaXZhdGUgY2xhc3MgV1NETFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQkvKioKLQkJICogRGV0ZXJtaW5lcyBET00gbm9kZSBiYXNlZCBvbiBvYmplY3QgKHdzZGwgbm9kZSkKLQkJICogCi0JCSAqIEBwYXJhbSBvYmplY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlOb2RlIG5vZGUgPSBudWxsOwotCQkJCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJCW5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJLy8gVGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBhIFVSSSBmcmFnbWVudCB1c2VkIHRvIGlkZW50aWZ5IGEgV1NETCBlbGVtZW50LgotCQkJCS8vIFRoZSBVUkkgZnJhZ21lbnQgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBkZWZpbml0aW9uIGJlaW5nIGVkaXRlZCBpbiB0aGlzIGVkaXRvci4KLQkJCQlTdHJpbmcgdXJpRnJhZ21lbnQgPSAoU3RyaW5nKW9iamVjdDsKLQkJCQlFT2JqZWN0IGRlZmluaXRpb24gPSAoKERlZmluaXRpb24pKChXMTFEZXNjcmlwdGlvbilnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKSk7Ci0JCQkJRU9iamVjdCBtb2RlbE9iamVjdCA9IGRlZmluaXRpb24uZVJlc291cmNlKCkuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0KLQkJCQlpZiAobW9kZWxPYmplY3QgIT0gbnVsbCkgewotCQkJCQlub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KG1vZGVsT2JqZWN0KTsKLQkJCQl9ICAgICAgICAKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5vZGUgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldE5vZGVGb3JPYmplY3Qob2JqZWN0KTsKLQkJCX0KLQkJCQotCQkJLy8gdGhlIHRleHQgZWRpdG9yIGNhbiBvbmx5IGFjY2VwdCBzZWQgbm9kZXMhCi0JCQkvLwotCQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSkgewotCQkJCW5vZGUgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBkbyBub3QgZmlyZSBzZWxlY3Rpb24gaW4gc291cmNlIGVkaXRvciBpZiBzZWxlY3Rpb24gZXZlbnQgY2FtZQotCQkJLy8gZnJvbSBzb3VyY2UgZWRpdG9yCi0JCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgIT0gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlMaXN0IG90aGVyTW9kZWxPYmplY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHdzZGxPYmplY3QgPSBpLm5leHQoKTsKLQotCQkJCQkJaWYgKHdzZGxPYmplY3QgaW5zdGFuY2VvZiBXU0RMQmFzZUFkYXB0ZXIpIHsKLQkJCQkJCQl3c2RsT2JqZWN0ID0gKChXU0RMQmFzZUFkYXB0ZXIpIHdzZGxPYmplY3QpLmdldFRhcmdldCgpOwotCQkJCQkJfQotCi0JCQkJCQlPYmplY3Qgb3RoZXJNb2RlbE9iamVjdCA9IGdldE9iamVjdEZvck90aGVyTW9kZWwod3NkbE9iamVjdCk7Ci0JCQkJCQlpZiAob3RoZXJNb2RlbE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJb3RoZXJNb2RlbE9iamVjdExpc3QuYWRkKG90aGVyTW9kZWxPYmplY3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghb3RoZXJNb2RlbE9iamVjdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5vZGVTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdGhlck1vZGVsT2JqZWN0TGlzdCk7Ci0JCQkJCQlnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obm9kZVNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJZ3JhcGhpY2FsVmlld2VyLmdldEtleUhhbmRsZXIoKS5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkYyLCAwKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oR0VGQWN0aW9uQ29uc3RhbnRzLkRJUkVDVF9FRElUKSk7Ci0JCXNldEVkaXRQYXJ0RmFjdG9yeShnZXRFZGl0b3JNb2RlTWFuYWdlcigpLmdldEN1cnJlbnRNb2RlKCkuZ2V0RWRpdFBhcnRGYWN0b3J5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZXMoKTsKLQkJCi0JCWlmIChyZXNvdXJjZUNoYW5nZUhhbmRsZXIgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFdTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIodGhpcyk7Ci0JCQlyZXNvdXJjZUNoYW5nZUhhbmRsZXIuYXR0YWNoKCk7Ci0JCX0KLQkJCi0JCWZTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBwcm92aWRlcikuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJcHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCWZXU0RMU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgV1NETFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZXU0RMU2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsgICAgICAKLQkJfQotCQlpZiAocmVzb3VyY2VDaGFuZ2VIYW5kbGVyICE9IG51bGwpIHsKLQkJCXJlc291cmNlQ2hhbmdlSGFuZGxlci5kaXNwb3NlKCk7Ci0JCX0KLQkJZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmV1NETFNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxvYWREZXBlbmRlbmNpZXMoKSB7Ci0JCXRyeSB7Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgKChXMTFEZXNjcmlwdGlvbikgZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQkJV1NETFJlc291cmNlVXRpbC5yZWxvYWREaXJlY3RpdmVzKGRlZmluaXRpb24pOwotCQkJCUNvbXBvbmVudFJlZmVyZW5jZVV0aWwudXBkYXRlQmluZGluZ1JlZmVyZW5jZXMoZGVmaW5pdGlvbik7Ci0JCQkJQ29tcG9uZW50UmVmZXJlbmNlVXRpbC51cGRhdGVQb3J0VHlwZVJlZmVyZW5jZXMoZGVmaW5pdGlvbik7Ci0JCQkJQ29tcG9uZW50UmVmZXJlbmNlVXRpbC51cGRhdGVNZXNzYWdlUmVmZXJlbmNlcyhkZWZpbml0aW9uKTsKLQkJCQlDb21wb25lbnRSZWZlcmVuY2VVdGlsLnVwZGF0ZVNjaGVtYVJlZmVyZW5jZXMoZGVmaW5pdGlvbik7Ci0JCQkJLy8gdGhlIGxpbmUgYmVsb3cgc2ltcGx5IGNhdXNlcyBhIG5vdGlmaWNhdGlvbiBpbiBvcmRlciB0bwotCQkJCS8vIHVwZGF0ZSBvdXIKLQkJCQkvLyB2aWV3cwotCQkJCS8vCi0JCQkJZGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkZWZpbml0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotCi0JICAgIEJhc2VTZWxlY3Rpb25BY3Rpb24gYWN0aW9uID0gbmV3IEFTREFkZE1lc3NhZ2VBY3Rpb24odGhpcyk7Ci0JICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotCSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JICAgIGFjdGlvbiA9IG5ldyBXMTFBZGRQYXJ0QWN0aW9uKHRoaXMpOwotCSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQkgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkgICAgCi0JICAgIGFjdGlvbiA9IG5ldyBXMTFTZXROZXdNZXNzYWdlQWN0aW9uKHRoaXMpOwotCSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQkgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCSAgICBhY3Rpb24gPSBuZXcgVzExU2V0RXhpc3RpbmdNZXNzYWdlQWN0aW9uKHRoaXMpOwotCSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQkgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkgICAgCi0JICAgIGFjdGlvbiA9IG5ldyBXMTFTZXROZXdUeXBlQWN0aW9uKHRoaXMpOwotCSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQkgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkgICAgCi0JICAgIGFjdGlvbiA9IG5ldyBXMTFTZXRFeGlzdGluZ1R5cGVBY3Rpb24odGhpcyk7Ci0JICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotCSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCSAgICAKLQkgICAgYWN0aW9uID0gbmV3IFcxMVNldE5ld0VsZW1lbnRBY3Rpb24odGhpcyk7Ci0JICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotCSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCSAgICAKLQkgICAgYWN0aW9uID0gbmV3IFcxMVNldEV4aXN0aW5nRWxlbWVudEFjdGlvbih0aGlzKTsKLQkgICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0JICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JICAgIAotCSAgICBhY3Rpb24gPSBuZXcgVzExT3BlbkltcG9ydEFjdGlvbih0aGlzKTsKLQkgICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0JICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkgICAgYWN0aW9uID0gbmV3IE9wZW5Jbk5ld0VkaXRvcih0aGlzKTsKLQkgICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0JICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkgICAgQVNERGlyZWN0RWRpdEFjdGlvbiBkaXJlY3RFZGl0QWN0aW9uID0gbmV3IEFTRERpcmVjdEVkaXRBY3Rpb24odGhpcyk7Ci0JICAgIGRpcmVjdEVkaXRBY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQkgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oZGlyZWN0RWRpdEFjdGlvbik7Ci0JICB9Ci0JCi0gIC8qCi0gICAqIEBkZXByZWNhdGVkOiBybWFoOiByZW1vdmUgdGhlIG1ldGhvZCBiZWxvdyBwb3N0IFdUUDEuNS4gIFVzZSBnZXRBZGFwdGVyKCkgbWV0aG9kIGluc3RlYWQuCi0gICAqLwotICBwdWJsaWMgSU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlciBnZXRPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIoKSB7Ci0gICAgcmV0dXJuIG5ldyBXMTFPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIoKChJRmlsZUVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCkpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FRElUT1JfTU9ERV9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kZWZhdWx0RWRpdG9yTW9kZUlkIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJvdGVjdGVkIEVkaXRvck1vZGVNYW5hZ2VyIGNyZWF0ZUVkaXRvck1vZGVNYW5hZ2VyKCkKLSAgewotICAgIGZpbmFsIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKWdldEFkYXB0ZXIoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBFZGl0b3JNb2RlTWFuYWdlcihXU0RMX0VESVRPUl9NT0RFX0VYVEVOU0lPTl9JRCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBpbml0KCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPT0gbnVsbCB8fCAKLSAgICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuaXNFZGl0b3JNb2RlQXBwbGljYWJsZShEZWZhdWx0RWRpdG9yTW9kZS5JRCkpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgYWRkTW9kZShuZXcgRGVmYXVsdEVkaXRvck1vZGUoKSk7Ci0gICAgICAgIH0gIAotICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHByb3RlY3RlZCBFZGl0b3JNb2RlIGdldERlZmF1bHRNb2RlKCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRNb2RlSWQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKERFRkFVTFRfRURJVE9SX01PREVfSUQpOwotICAgICAgICBpZiAoZGVmYXVsdE1vZGVJZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdG9yTW9kZSBlZGl0b3JNb2RlID0gZ2V0RWRpdG9yTW9kZShkZWZhdWx0TW9kZUlkKTsKLSAgICAgICAgICBpZiAoZWRpdG9yTW9kZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0b3JNb2RlOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZWZhdWx0TW9kZSgpOwotICAgICAgfSAgICAgIAotICAgIH07Ci0gICAgbWFuYWdlci5zZXRQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpOwotICAgIHJldHVybiBtYW5hZ2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlZGl0b3JNb2RlQ2hhbmdlZChFZGl0b3JNb2RlIG5ld0VkaXRvck1vZGUpCi0gIHsKLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gbmV3RWRpdG9yTW9kZS5nZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgICBpZiAoZWRpdFBhcnRGYWN0b3J5ICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBncmFwaGljYWxWaWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICBpZiAoZ3JhcGhpY2FsVmlld2VyIGluc3RhbmNlb2YgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikKLSAgICAgIHsgIAotICAgICAgICBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKWdyYXBoaWNhbFZpZXdlcjsKLSAgICAgICAgRGVmaW5pdGlvbnNFZGl0UGFydCBlZGl0UGFydCA9IChEZWZpbml0aW9uc0VkaXRQYXJ0KXZpZXdlci5nZXRSb290RWRpdFBhcnQoKS5nZXRDb250ZW50cygpOwotICAgICAgICBlZGl0UGFydC5zZXRNb2RlbENoaWxkcmVuKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotICAgICAgICBlZGl0UGFydC5yZWZyZXNoKCk7Ci0gICAgICAgIGVkaXRQYXJ0LnNldE1vZGVsQ2hpbGRyZW4obnVsbCk7Ci0gICAgICAgIGVkaXRQYXJ0LnJlZnJlc2goKTsgICAgICAgIAotICAgICAgfQotICAgIH0gIAotICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXdFZGl0b3JNb2RlLmdldE91dGxpbmVQcm92aWRlcigpOwotICAgIGlmIChwcm92aWRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIEFTRENvbnRlbnRPdXRsaW5lUGFnZSBvdXRsaW5lID0gKEFTRENvbnRlbnRPdXRsaW5lUGFnZSlnZXRDb250ZW50T3V0bGluZVBhZ2UoKTsKLSAgICAgIGlmIChvdXRsaW5lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG91dGxpbmUuZ2V0VHJlZVZpZXdlcigpOwotICAgICAgICBpZiAodHJlZVZpZXdlciAhPSBudWxsKQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgb3V0bGluZS5nZXRUcmVlVmlld2VyKCkuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICBvdXRsaW5lLmdldFRyZWVWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotCi0gICAgfSAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHN0b3JlQ3VycmVudE1vZGVQcmVmZXJlbmNlKFN0cmluZyBpZCkKLSAgewotICAgIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShERUZBVUxUX0VESVRPUl9NT0RFX0lELCBpZCk7ICAgIAotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0MGUxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3QgW10geyBhcmcwIH0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVQRU5ERU5DSUVTX0NIQU5HRURfUkVGUkVTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRURJVF9OQU1FU1BBQ0VTX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9QQUdFX0NSRUFUSU5HX0ZJTEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1FTUJFUl9NWV9ERUNJU0lPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9QQUdFX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVHRU5fQklORElOR1NfT05fU0FWRV9RVUVTVElPTk1BUks7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1dBUk5JTkdfRFVQTElDQVRFX05BTUVfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FU1BBQ0VfVVJJU19UT19CRV9JTkNMVURFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9QQUdFX0FVVE9fUkVHRU5FUkFURV9CSU5ESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUkVGX1BBR0VfUFJPTVBUX1JFR0VOX0JJTkRJTkdfT05fU0FWRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRURJVF9OQU1FU1BBQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0lNUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9CSU5ESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1BBUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9SRU9SREVSX1BBUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9SRU9SREVSX01FU1NBR0VfUkVGRVJFTkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRVhJU1RJTkdfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0VYSVNUSU5HX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX05BTUVTUEFDRV9JTlZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ERVNDUklQVElPTl9ORVdfV1NETF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRUdFTl9CSU5ESU5EU19PTl9TQVZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19ET0NVTUVOVF9MSVRFUkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9USVRMRV9TUEVDSUZZX1BPUlRUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9JTkxJTkVfU0NIRU1BX09GOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UQVJHRVRfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QUkVGSVhfV0lUSF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ1JFQVRFX1dTRExfU0tFTEVUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NSRUFURV9ORVdfV1NETF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TT0FQX0JJTkRJTkdfT1BUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfSFRUUF9CSU5ESU5HX09QVElPTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FERF9FWFRFTlNJT05fRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU1BFQ0lGWV9CSU5ESU5HX0RFVEFJTFNfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NQRUNJRllfUE9SVF9ERVRBSUxTX1RPX0JFX0NSRUFURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05FV19CSU5ESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ORVdfUE9SVFRZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JFRkVSRU5DRV9LSU5EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ORVdfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fUlBDX0VOQ09ERUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX1JQQ19MSVRFUkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRVhJU1RJTkdfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU1BFQ0lGWV9QT1JUX0RFVEFJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RJVExFX1NQRUNJRllfQklORElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVElUTEVfU1BFQ0lGWV9CSU5ESU5HX0RFVEFJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0ZJTEVfTVVTVF9FTkRfV0lUSF9XU0RMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9USVRMRV9TUEVDSUZZX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RJVExFX05FV19XU0RMX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1JFTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRk9MREVSX1RZUEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQU5DRUxfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ORVdfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GT0xERVJfSU1QT1JUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRk9MREVSX1NFUlZJQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GT0xERVJfQklORElOR1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZPTERFUl9JTlRFUkZBQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GT0xERVJfUE9SVFRZUEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GT0xERVJfTUVTU0FHRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ORVdfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX05FV19FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VUX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TRVRfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9CSU5ESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DSEVDS0JPWF9PVkVSV1JJVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TRVRfUE9SVFRZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9PUEVOX0lNUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVU5TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9ORVc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JJTkRJTkdfV0laQVJEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CSU5ESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9SRU1PVkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RJVExFX1NFTEVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVElUTEVfU0VMRUNUX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFU0NSSVBUSU9OX1NFTEVDVF9XU0RMX09SX1hTRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVElUTEVfT1BUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWUVTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QT1JUX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BPUlRfV0laQVJEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9IRUxQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FX0ZJTFRFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9OQU1FX01VU1RfQ09OVEFJTl9BVF9MRUFTVF9PTkVfQ0hBUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9OQU1FX0hBU19TUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9OQU1FX0lOVkFMSURfRklSU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fTkFNRV9JTlZBTElEX0NIQVI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1JlbG9hZERlcGVuZGVuY2llc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1JlbG9hZERlcGVuZGVuY2llc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMmM0MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9SZWxvYWREZXBlbmRlbmNpZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBSZWxvYWREZXBlbmRlbmNpZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlCi17Ci0JcHJpdmF0ZSBJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3Igd3NkbEVkaXRvcjsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKQotCXsKLQkJd3NkbEVkaXRvciA9ICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IpID8gKEludGVybmFsV1NETE11bHRpUGFnZUVkaXRvcil0YXJnZXRFZGl0b3IgOiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLQl7Ci0JCWlmICh3c2RsRWRpdG9yICE9IG51bGwpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCXdzZGxFZGl0b3IucmVsb2FkRGVwZW5kZW5jaWVzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhN2RkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSUV4dGVuZGVkQ29udHJpYnV0b3IgewotCi0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIEludGVybmFsV1NETE11bHRpUGFnZUVkaXRvciBtdWx0aVBhZ2VFZGl0b3IgPSBudWxsOwotCi0JLy8gRWRpdG9yRXh0ZW5zaW9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJRXh0ZW5kZWRDb250cmlidXRvciBleHRlbmRlZENvbnRyaWJ1dG9yOwotCi0JcHVibGljIFNvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCi0JCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcigpOwotCi0JCS8vIFJlYWQgYWN0aW9uIGV4dGVuc2lvbnMuCi0JCUV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpOwotCQlleHRlbmRlZENvbnRyaWJ1dG9yID0gYnVpbGRlci5yZWFkQWN0aW9uRXh0ZW5zaW9ucyhFRElUT1JfSUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMpOwotCi0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCWluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihhY3Rpb25CYXJzKTsKLQkJCWluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihhY3Rpb25CYXJzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKQotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKQotCQkJZXh0ZW5kZWRDb250cmlidXRvci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0KLQkJYWRkVG9NZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciNjb250cmlidXRlVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCi0JCWFkZFRvUG9wdXBNZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLQkJYWRkVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKQotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJYWRkVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciN1cGRhdGVUb29sYmFyQWN0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbGJhckFjdGlvbnMoKSB7Ci0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQkvLyBzYXZlIG11bHRpUGFnZUVkaXRvciBiZWZvcmUgY2FsbGluZyBzdXBlci5zZXRBY3RpdmVFZGl0b3IodGFyZ2V0RWRpdG9yKQotCQkvLyBzdXBlci5zZXRBY3RpdmVFZGl0b3Igd2lsbCBjYWxsIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKQotCQkvLyBtdWx0aVBhZ2VFZGl0b3IgaXMgbmVlZGVkIGluIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKQotCQlpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yKQotCQkJbXVsdGlQYWdlRWRpdG9yID0gKEludGVybmFsV1NETE11bHRpUGFnZUVkaXRvcikgdGFyZ2V0RWRpdG9yOwotCi0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCi0JCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJLy8gVGhpcyBjb250cmlidXRvciBpcyBkZXNpZ25lZCBmb3IgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0LgotCQkvLyBUbyBzYWZlLWd1YXJkIHRoaXMgZnJvbSBwcm9ibGVtcyBjYXVzZWQgYnkgdW5leHBlY3RlZCB1c2FnZSBieSBvdGhlciBlZGl0b3JzLCB0aGUgZm9sbG93aW5nCi0JCS8vIGNoZWNrIGlzIGFkZGVkLgotCQlpZiAobXVsdGlQYWdlRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCAmJiBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLQkJCQlhY3RpdmF0ZVNvdXJjZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJCWVsc2UKLQkJCQlhY3RpdmF0ZURlc2lnblBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJfQotCi0JCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0KLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIG1lbnUgYmFyIGFuZCB0b29sIGJhcgotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZURlc2lnblBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsICYmIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJfQotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsICYmIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0gbnVsbCwgc28gcGFzcyBpbiBtdWx0aVBhZ2VFZGl0b3IgaW5zdGVhZCAoZDI4MjQxNCkKLQkJCWlmIChhY3RpdmVFZGl0b3IgPT0gbnVsbCkgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQl9Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVTb3VyY2VQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9Tb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmYzcwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yWE1MOwotCi0KLS8qKgotICogU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgZm9yIG11bHRpIHBhZ2UgZWRpdG9yJ3Mgc291cmNlIHBhZ2UgY29udHJpYnV0b3IuCi0gKgotICogVXNlIFdTRExFZGl0b3JBY3Rpb25Db250cmlidXRvciBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yCi0gKiAqLwotcHVibGljIGNsYXNzIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yWE1MIHsKLQotCXByaXZhdGUgSUFjdGlvbkJhcnMgZkJhcnM7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYWxsczoKLQkgKiA8dWw+Ci0JICogIDxsaT48Y29kZT5jb250cmlidXRlVG9NZW51PC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyBtZW51IG1hbmFnZXI8L2xpPgotCSAqICA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvVG9vbEJhcjwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgdG9vbCBiYXIKLQkgKiAgICBtYW5hZ2VyPC9saT4KLQkgKiAgPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIHN0YXR1cyBsaW5lCi0JICogICAgbWFuYWdlcjwvbGk+Ci0JICogPC91bD4KLQkgKiBUaGUgZ2l2ZW4gYWN0aW9uIGJhcnMgYXJlIGFsc28gcmVtZW1iZXJlZCBhbmQgbWFkZSBhY2Nlc3NpYmxlIHZpYSAKLQkgKiA8Y29kZT5nZXRBY3Rpb25CYXJzPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFycyB0aGUgYWN0aW9uIGJhcnMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMpIHsKLQkJZkJhcnMgPSBiYXJzOwotCQljb250cmlidXRlVG9NZW51KGJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0JCWNvbnRyaWJ1dGVUb1Rvb2xCYXIoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvU3RhdHVzTGluZShiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBjb250cmlidXRvcidzIGFjdGlvbiBiYXJzLgotCSAqCi0JICogQHJldHVybiB0aGUgYWN0aW9uIGJhcnMKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIGZCYXJzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbldTREwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uV1NETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDMzZWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50ZXh0LldTRExIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbldTREwgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwgewotCXB1YmxpYyBJSHlwZXJsaW5rRGV0ZWN0b3JbXSBnZXRIeXBlcmxpbmtEZXRlY3RvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKHNvdXJjZVZpZXdlciA9PSBudWxsIHx8ICFmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSFlQRVJMSU5LU19FTkFCTEVEKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgYWxsRGV0ZWN0b3JzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJLy8gYWRkIFdTREwgSHlwZXJsaW5rIGRldGVjdG9yCi0JCWFsbERldGVjdG9ycy5hZGQobmV3IFdTRExIeXBlcmxpbmtEZXRlY3RvcigpKTsKLQotCQlJSHlwZXJsaW5rRGV0ZWN0b3JbXSBzdXBlckRldGVjdG9ycyA9IHN1cGVyLmdldEh5cGVybGlua0RldGVjdG9ycyhzb3VyY2VWaWV3ZXIpOwotCQlmb3IgKGludCBtID0gMDsgbSA8IHN1cGVyRGV0ZWN0b3JzLmxlbmd0aDsgbSsrKSB7Ci0JCQlJSHlwZXJsaW5rRGV0ZWN0b3IgZGV0ZWN0b3IgPSBzdXBlckRldGVjdG9yc1ttXTsKLQkJCWlmICghYWxsRGV0ZWN0b3JzLmNvbnRhaW5zKGRldGVjdG9yKSkgewotCQkJCWFsbERldGVjdG9ycy5hZGQoZGV0ZWN0b3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUh5cGVybGlua0RldGVjdG9yW10pIGFsbERldGVjdG9ycy50b0FycmF5KG5ldyBJSHlwZXJsaW5rRGV0ZWN0b3JbMF0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDZkOTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuSVdTRExUb29sYmFyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTRERlbGV0ZUFjdGlvbjsKLQotcHVibGljIGNsYXNzIFdTRExBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKLSAgcHJpdmF0ZSBJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIElUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0gIHByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Igc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yLgotICAgKi8KLSAgcHVibGljIFdTRExBY3Rpb25CYXJDb250cmlidXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBwYXJ0KQotICB7Ci0gICAgaWYgKGFjdGl2ZUVkaXRvclBhcnQgPT0gcGFydCkKLSAgICAgIHJldHVybjsKLQotICAgIGFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OwotCi0gICAgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLSAgICAKLSAgICBpZiAoYWN0aXZlRWRpdG9yUGFydCAhPSBudWxsICYmIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLSAgICB7Ci0gICAgICBhY3RpdmF0ZVNvdXJjZVBhZ2UoYWN0aXZlRWRpdG9yUGFydCwgdHJ1ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhY3RpdmF0ZVNvdXJjZVBhZ2Uod3NkbEVkaXRvciwgZmFsc2UpOwotICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHdzZGxFZGl0b3IgPSAoSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yKSBwYXJ0OwotICAgICAgfQotICAgICAgaWYgKHdzZGxFZGl0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gY3M6IGhlcmUncyB3ZSBlbnN1cmUgdGhlIFVORE8gYW5kIFJFRE8gYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gCi0gICAgICAgIC8vIHRoZSBkZXNpZ24gdmlldyBpcyBhY3RpdmUKLSAgICAgICAgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSB3c2RsRWRpdG9yLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKHNpdGUgaW5zdGFuY2VvZiBJRWRpdG9yU2l0ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gd3NkbEVkaXRvci5nZXRUZXh0RWRpdG9yKCk7Ci0gICAgICAgICAgSUFjdGlvbkJhcnMgc2l0ZUFjdGlvbkJhcnMgPSAoKElFZGl0b3JTaXRlKSBzaXRlKS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgICAgc2l0ZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPLCBnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETykpOwotICAgICAgICAgIHNpdGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETywgZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8pKTsKLSAgICAgICAgICBzaXRlQWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7ICAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgCi0KLSAgICAgICAgT2JqZWN0IGFkYXB0ZXIgPSB3c2RsRWRpdG9yLmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGlvblJlZ2lzdHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIHJlZ2lzdHJ5LmdldEFjdGlvbihBU0REZWxldGVBY3Rpb24uSUQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLSAgICAgIC8vIHVwZGF0ZSBtZW51IGJhciBhbmQgdG9vbCBiYXIKLSAgICAgIGFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0ZWQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBlZGl0b3IuCi0gICAqIEByZXR1cm4gSUFjdGlvbiBvciBudWxsIGlmIGVkaXRvciBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIElBY3Rpb24gZ2V0QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgU3RyaW5nIGFjdGlvbklEKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIChlZGl0b3IgPT0gbnVsbCA/IG51bGwgOiBlZGl0b3IuZ2V0QWN0aW9uKGFjdGlvbklEKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpCi0gIHsKLSAgICBtYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoIldTRExFZGl0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBMaXN0IGxpc3QgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckNvbmZpZ3VyYXRpb24oKS5nZXRUb29sYmFyQWN0aW9ucygpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBtYW5hZ2VyLmFkZCgoSVdTRExUb29sYmFyQWN0aW9uKWkubmV4dCgpKTsKLSAgICB9Ci0KLS8vICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0vLyAgICBTdHJpbmdbXSB6b29tU3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7IFpvb21NYW5hZ2VyLkZJVF9BTEwsIFpvb21NYW5hZ2VyLkZJVF9IRUlHSFQsIFpvb21NYW5hZ2VyLkZJVF9XSURUSCB9OwotLy8gICAgbWFuYWdlci5hZGQobmV3IFpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0oZ2V0UGFnZSgpLCB6b29tU3RyaW5ncykpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBhY3RpdmVOZXN0ZWRFZGl0b3IgPSBudWxsOwotICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yUGFydCkKLSAgICB7Ci0gICAgICBhY3RpdmVOZXN0ZWRFZGl0b3IgPSBwYXJ0OwotICAgIH0KLSAgICBzZXRBY3RpdmVQYWdlKGFjdGl2ZU5lc3RlZEVkaXRvcik7Ci0gICAgCi0gICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IpCi0gICAgewotICAgICAgd3NkbEVkaXRvciA9IChJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IpIHBhcnQ7Ci0KLSAgICAgIHRleHRFZGl0b3IgPSB3c2RsRWRpdG9yLmdldFRleHRFZGl0b3IoKTsKLSAgICAgIGlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0gICAgICB7ICAgICAgCi0gICAgICAgIGdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIExpc3QgbGlzdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yQ29uZmlndXJhdGlvbigpLmdldFRvb2xiYXJBY3Rpb25zKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgICgoSVdTRExUb29sYmFyQWN0aW9uKWkubmV4dCgpKS5zZXRFZGl0b3JQYXJ0KHBhcnQpOwotICAgIH0KLSAgICBzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlU291cmNlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IsIGJvb2xlYW4gc3RhdGUpCi0gIHsKLSAgICBpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikKLSAgICB7Ci0gICAgICBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLSAgICAgICgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChzdGF0ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKQotICB7Ci0gICAgaW5pdFNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKGJhcnMpOwotICAgIHN1cGVyLmluaXQoYmFycywgcGFnZSk7Ci0gIH0KLQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaW5pdFNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLSAgICBpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkKLSAgICAgIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLmluaXQoYWN0aW9uQmFycywgZ2V0UGFnZSgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkKLSAgICAgIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExFZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkZmE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExFZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb25zLk5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb25zLldTRExFZGl0b3JDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5Qcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiAvLywgSVBsdWdpbkhlbHBlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGVmYXVsdHBhZ2UiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0lHTl9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRlc2lnbnBhZ2UiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNvdXJjZXBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYU0RfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIjsgIC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUFJPTVBUID0gMDsKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfSUdOT1JFID0gMTsKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEID0gMjsKLQotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExFZGl0b3JQbHVnaW4gaW5zdGFuY2U7Ci0gIHByaXZhdGUgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSByZWdpc3RyeTsKLSAgcHJpdmF0ZSBXU0RMRWRpdG9yQ29uZmlndXJhdGlvbiB3c2RsRWRpdG9yQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5OwotICBwcml2YXRlIGludCBkZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5ID0gREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEOwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yQ29uZmlndXJhdGlvbiBnZXRXU0RMRWRpdG9yQ29uZmlndXJhdGlvbigpCi0gIHsKLSAgICBpZiAod3NkbEVkaXRvckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2RsRWRpdG9yQ29uZmlndXJhdGlvbiA9IG5ldyBXU0RMRWRpdG9yQ29uZmlndXJhdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbEVkaXRvckNvbmZpZ3VyYXRpb247Ci0gIH0KLSAgCi0JcHVibGljIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpIHsKLQkJaWYgKHJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCXJlZ2lzdHJ5ID0gbmV3IEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2lvbkNhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmVnaXN0cnkuX19pbnRlcm5hbFNldERlcHJlY2F0ZWRFeHRlbnNpb25JZCgib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuRXh0ZW5zaW9uc1NjaGVtYXNEZXNjcmlwdGlvbiIpOwotICAgICAgICAgICAgcmVnaXN0cnkuc2V0UHJlZlN0b3JlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSApOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCQotICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJlc291cmNlcyBoZWxwZXIuCi0gICAqLwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yUGx1Z2luKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgaW5zdGFuY2UgPSB0aGlzOwotCi0gICAgLy8gVE9ETy4uLiByZW1vdmUgdGhpcyBjb2RlIHdoZW4gd2UgYWRkICdkZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5JwotICAgIC8vIHRvIGFuIGVkaXRvciBwcmVmZXJlbmNlcyBwYWdlCi0gICAgdHJ5Ci0gICAgewotICAgIAkvLyBfREVCVUdfVVBEQVRFX1BPTElDWSA9IDBEdW1teS5sYWJlbD0KLSAgICAgIFN0cmluZyBzdHJpbmcgPSAiMER1bW15LmxhYmVsIjsgLy8kTk9OLU5MUy0xJAotICAgICAgaW50IHBvbGljeSA9IEludGVnZXIucGFyc2VJbnQoc3RyaW5nKTsKLSAgICAgIGlmIChwb2xpY3kgPj0gMCAmJiBwb2xpY3kgPD0gREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEKQotICAgICAgewotICAgICAgICBkZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5ID0gcG9saWN5OwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5ID0gbmV3IE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIEluc3RhbGwgVVJMCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSTCBnZXRJbnN0YWxsVVJMKCkKLSAgewotCXRyeQotCXsKLQkgIHJldHVybiBGaWxlTG9jYXRvci5yZXNvbHZlKGluc3RhbmNlLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpOyAvLyROT04tTkxTLTEkCi0JfQotCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCXsKLQkgIHJldHVybiBudWxsOwotCX0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHBsdWdpbiBwaHlzaWNhbCBkaXJlY3RvcnkgbG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGx1Z2luTG9jYXRpb24oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggaW5zdGFsbFBhdGggPSBuZXcgUGF0aChnZXRJbnN0YWxsVVJMKCkudG9FeHRlcm5hbEZvcm0oKSkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKTsKLSAgICAgIFN0cmluZyBpbnN0YWxsU3RyID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFBhdGgudG9TdHJpbmcoKSkpLmdldEZpbGUoKTsKLSAgICAgIHJldHVybiBuZXcgUGF0aChpbnN0YWxsU3RyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIldTRExFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luTG9jYXRpb24oKSBleGNlcHRpb24uLiIgKyBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGltYWdlRGVzY3JpcHRvckNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgaW50ZXJuYWxHZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkKLSAgewotICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXQoa2V5KTsKLSAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpCi0gICAgewotICAgICAgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsIGtleSk7Ci0gICAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGltYWdlRGVzY3JpcHRvckNhY2hlLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLSAgICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotICAgKgotICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFN0cmluZyBwYXRoKSB7Ci0gICAgcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmludGVybmFsR2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKQotICB7Ci0gICAgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotICAgIAotICAgIGlmIChpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXksIGJvb2xlYW4gaXNHcmF5ZWQpCi0gICAgeyAKLSAgICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICAgIGlmICghaXNHcmF5ZWQpCi0gICAgICB7Ci0gICAgICAgIGltYWdlID0gc3VwZXIuZ2V0SW1hZ2Uoa2V5KTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbWFnZSA9IChJbWFnZSlncmF5ZWRJbWFnZU1hcC5nZXQoa2V5KTsKLSAgICAgICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbWFnZSBjb2xvckltYWdlID0gc3VwZXIuZ2V0SW1hZ2Uoa2V5KTsKLSAgICAgICAgICBpZiAoY29sb3JJbWFnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBjb2xvckltYWdlLCBTV1QuSU1BR0VfR1JBWSk7Ly9TV1QuSU1BR0VfRElTQUJMRSk7Ci0gICAgICAgICAgICBncmF5ZWRJbWFnZU1hcC5wdXQoa2V5LCBpbWFnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotICAqLwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSBmb3IgdGhpcyBwbHVnaW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhRGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExFZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotCSAgbmV3IFdTRExFZGl0b3JQbHVnaW4oKTsKLQl9Ci0gICAgCi0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkKLSAgewotICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKCkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotICAgIHN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9QQUdFLCBERVNJR05fUEFHRSk7Ci0gICAgCi0gICAgLy8gV1NETFByZWZlcmVuY2VQYWdlIHByZWZzCi0gICAgc3RvcmUuc2V0RGVmYXVsdChNZXNzYWdlcy5fVUlfUFJFRl9QQUdFX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSwgREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsgLy8kTk9OLU5MUy0xJAotICAgIHN0b3JlLnNldERlZmF1bHQoTWVzc2FnZXMuX1VJX1BSRUZfUEFHRV9BVVRPX1JFR0VORVJBVEVfQklORElORywgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgc3RvcmUuc2V0RGVmYXVsdChNZXNzYWdlcy5fVUlfUFJFRl9QQUdFX1BST01QVF9SRUdFTl9CSU5ESU5HX09OX1NBVkUsIGZhbHNlKTsJLy8gVE9ETzogRXh0ZXJuYWxpemUgLy8kTk9OLU5MUy0xJAotICAgIC8vIERvIHdlIG5lZWQgdGhpcyBwcmVmZXJlbmNlIGJlbG93PyAgTG9vayBhdCBXU0RMUHJlZmVyZW5jZVBhZ2UuamF2YQotLy8gICAgc3RvcmUuc2V0RGVmYXVsdCgiRGVmdWFsdCBMb2NhdGlvbjoiLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIpOwotICB9Ci0gIAotICAvKioKLSAgICogc2V0RGVmYXVsdFBhZ2UKLSAgICogU2V0IHRoZSBkZWZhdWx0IHBhZ2UgdG8gb3BlbiB3aGVuIHRoZSBlZGl0b3Igc3RhcnRzLiBNYWludGFpbnMgdGhlIHN0YXRlCi0gICAqIHdoZW4gV1NBRCBpcyBzaHV0ZG93biBhbmQgcmVzdGFydGVkLgotICAgKiBAcGFyYW0gcGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFBhZ2UoU3RyaW5nIHBhZ2UpCi0gIHsKLSAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShERUZBVUxUX1BBR0UsIHBhZ2UpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKERFRkFVTFRfUEFHRSk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldERlcGVuZGVuY2llc0NoYW5nZWRQb2xpY3koKQotICB7Ci0gICAgLy9yZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KERFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZKTsKLSAgICByZXR1cm4gZGVwZW5kZW5jaWVzQ2hhbmdlZFBvbGljeTsKLSAgfQotICAKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0NVU1RPTUlaQVRJT05fUFJPVklERVJfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLnByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJQbHVnaW5JZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfQ1VTVE9NSVpBVElPTl9QUk9WSURFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLnByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0gIAotICBwcml2YXRlIHN0YXRpYyBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlckluaXRpYWxpemVkID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBnZXRQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKCkKLSAgewotICAgIGlmICghcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlckluaXRpYWxpemVkKQotICAgIHsKLSAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJJbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICBTdHJpbmcgcGx1Z2luTmFtZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhQUk9EVUNUX0NVU1RPTUlaQVRJT05fUFJPVklERVJfUExVR0lOX0lEKTsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoUFJPRFVDVF9DVVNUT01JWkFUSU9OX1BST1ZJREVSX0NMQVNTX05BTUUpOwotICAgICAgaWYgKHBsdWdpbk5hbWUgIT0gbnVsbCAmJiBwbHVnaW5OYW1lLmxlbmd0aCgpID4gMCAmJgotICAgIAkgIGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5OYW1lKTsKLSAgICAgICAgICBDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgcmV0dXJuIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci0gIH0gICAKLX0KLQotY2xhc3MgQmFzZVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQpCi0gIHsKLQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0KLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gIH0KLX0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgQmFzZVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FX1NQQUNFID0gIm5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhZ05hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lczsKLSAgcHJvdGVjdGVkIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLSAgcHJpdmF0ZSBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQsIFN0cmluZyB0YWdOYW1lLCBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnRJZDsKLSAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwotICAgIHRoaXMubnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5ID0gbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCwgU3RyaW5nIHRhZ05hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcyhleHRlbnNpb25Qb2ludElkLCB0YWdOYW1lLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIGF0dHJpYnV0ZU5hbWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICBhdHRyaWJ1dGVOYW1lc1swXSA9IGF0dHJpYnV0ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKFN0cmluZyBleHRlbnNpb25Qb2ludElkLCBTdHJpbmcgdGFnTmFtZSwgU3RyaW5nW10gYXR0cmlidXRlTmFtZXMsIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzKGV4dGVuc2lvblBvaW50SWQsIHRhZ05hbWUsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgdGhpcy5hdHRyaWJ1dGVOYW1lcyA9IGF0dHJpYnV0ZU5hbWVzOwotICB9Ci0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBzdXBlci5yZWFkUmVnaXN0cnkoZXh0ZW5zaW9uUG9pbnRJZCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKHRhZ05hbWUpKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRV9TUEFDRSk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lcy5sZW5ndGggPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lc1swXSk7Ci0gICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeS5wdXQobmFtZXNwYWNlLCBjbGFzc05hbWUsIGJ1bmRsZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZXNbaV07Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkucHV0KG5hbWVzcGFjZSwgbWFwLCBidW5kbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgRWxlbWVudENvbnRlbnRGaWx0ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgc3VwZXIoRVhURU5TSU9OX1BPSU5UX0lELCBUQUdfTkFNRSwgImNsYXNzIiwgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KTsgLy8kTk9OLU5MUy0xJAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjZmE1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlcgotewotICBwcm90ZWN0ZWQgSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yIHdzZGxFZGl0b3I7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRlUmVxdWlyZWQ7Ci0gIHByb3RlY3RlZCBJbnRlcm5hbFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLSAgcHJvdGVjdGVkIEludGVybmFsUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lcjsKLQotICBwdWJsaWMgV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlcihJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIHRoaXMud3NkbEVkaXRvciA9IHdzZGxFZGl0b3I7Ci0gICAgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICBwYXJ0TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxQYXJ0TGlzdGVuZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGF0dGFjaCgpCi0gIHsKLSAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIE1hcCBjb21wdXRlRGVwZW5kZW5jeU1hcCgpCi0gIHsKLSAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoKEludGVybmFsV1NETE11bHRpUGFnZUVkaXRvcikgd3NkbEVkaXRvcikuZ2V0TW9kZWwoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgKChXMTFEZXNjcmlwdGlvbikgZGVzY3JpcHRpb24pLmdldFRhcmdldCgpOwotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZGVmaW5pdGlvbi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlpLm5leHQoKTsKLSAgICAgIGlmIChyZXNvdXJjZSAhPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKG1hcC5nZXQodXJpKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbWFwLnB1dCh1cmksIHVyaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZWxvYWQoKQotICB7Ci0gIAlib29sZWFuIGRvUmVsb2FkID0gZmFsc2U7ICAJCi0JaW50IHBvbGljeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5KCk7Ci0JCi0gIAlpZiAocG9saWN5ID09IFdTRExFZGl0b3JQbHVnaW4uREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUFJPTVBUKQotICAJewotCQlkb1JlbG9hZCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHdzZGxFZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIE1lc3NhZ2VzLl9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRCwgTWVzc2FnZXMuX1VJX0RFUEVOREVOQ0lFU19DSEFOR0VEX1JFRlJFU0gpOyAgCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgCX0KLSAgCWVsc2UgaWYgKHBvbGljeSA9PSBXU0RMRWRpdG9yUGx1Z2luLkRFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1JFTE9BRCkKLSAgCXsKLSAgCQlkb1JlbG9hZCA9IHRydWU7Ci0gIAl9Ci0gIAkKLSAgICBpZiAoZG9SZWxvYWQpCi0gICAgeyAgICAKLSAgICAgIHdzZGxFZGl0b3IucmVsb2FkRGVwZW5kZW5jaWVzKCk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzTGlzdGVuaW5nVG9SZXNvdXJjZUNoYW5nZXMoKQotICB7Ci0gIAlpbnQgcG9saWN5ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERlcGVuZGVuY2llc0NoYW5nZWRQb2xpY3koKTsKLSAgCXJldHVybiBwb2xpY3kgPT0gV1NETEVkaXRvclBsdWdpbi5ERVBFTkRFQ0lFU19DSEFOR0VEX1BPTElDWV9QUk9NUFQgfHwKLSAgCQkgICBwb2xpY3kgPT0gV1NETEVkaXRvclBsdWdpbi5ERVBFTkRFQ0lFU19DSEFOR0VEX1BPTElDWV9SRUxPQUQ7Ci0gIH0KLQotCi0gIGNsYXNzIEludGVybmFsUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQZW5kaW5nID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGludCBjb3VudCA9IDA7Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0gICAgeyAgICAgIAkKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgCSAgICAgCQotICAgICAgaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiBpc0xpc3RlbmluZ1RvUmVzb3VyY2VDaGFuZ2VzKCkgJiYgIWlzVXBkYXRlUmVxdWlyZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpCi0gICAgICAgIHsKLSAgICAgICAgICBJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IGV2ZW50LmdldERlbHRhKCkuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkZWx0YXNbaV0uYWNjZXB0KHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1BlbmRpbmcpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGRpc3BsYXkudGltZXJFeGVjKDIwMDAsIG5ldyBUaW1lckV2ZW50KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0gICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotICAgICAgewotICAgICAgICBpZiAoIWxpc3QuY29udGFpbnMocmVzb3VyY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQocmVzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBjbGFzcyBUaW1lckV2ZW50IGltcGxlbWVudHMgUnVubmFibGUKLSAgICB7Ci0gICAgICBwdWJsaWMgVGltZXJFdmVudCgpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJOZXdUaW1lckV2ZW50KCIgKyB3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKS5lUmVzb3VyY2UoKS5nZXRVUkkoKSArICIpICIgKyBjb3VudCk7ICAgICAgCQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotLy8gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpaS5uZXh0KCk7Ci0vLyAgICAgICAgICBTdHJpbmcgcGxhdGZvcm1QYXRoID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS50b1N0cmluZygpOwotLy8gICAgICAgIH0KLQotICAgICAgICBNYXAgZGVwZW5kZW5jeU1hcCA9IGNvbXB1dGVEZXBlbmRlbmN5TWFwKCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKWkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBwbGF0Zm9ybVBhdGggPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgaWYgKGRlcGVuZGVuY3lNYXAuZ2V0KHBsYXRmb3JtUGF0aCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1VwZGF0ZVJlcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmICh3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKSA9PSB3c2RsRWRpdG9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc1VwZGF0ZVJlcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIHBlcmZvcm1SZWxvYWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpc1BlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBJbnRlcm5hbFBhcnRMaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgICBpZiAocGFydCA9PSB3c2RsRWRpdG9yKQotICAgICAgeyAgICAgCi0gICAgICAgIGlmIChpc1VwZGF0ZVJlcXVpcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgaXNVcGRhdGVSZXF1aXJlZCA9IGZhbHNlOwotICAgICAgICAgIHBlcmZvcm1SZWxvYWQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgIH0KLSAgfQotCi0KLX0KLQotLyoKLWNsYXNzIERlcGVuZGVuY3lWaXNpdG9yCi17Ci0JcHVibGljIHZvaWQgdmlzaXRJbXBvcnQoSW1wb3J0IHRoZUltcG9ydCkKLQl7Ci0JCWlmICh0aGVJbXBvcnQuZ2V0RURlZmluaXRpb24oKSAhPSBudWxsKQotCQl7Ci0JCQl2aXNpdERlZmluaXRpb24odGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRoZUltcG9ydC5nZXRFU2NoZW1hKCkgIT0gbnVsbCkKLQkJewotCQkJdmlzaXRTY2hlbWEodGhlSW1wb3J0LmdldEVTY2hlbWEoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZShYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlKQotCXsKLQkJWFNEU2NoZW1hIHJlZmVyZW5jZWRTY2hlbWEgPSBkaXJlY3RpdmUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLQkJaWYgKHJlZmVyZW5jZWRTY2hlbWEgIT0gbnVsbCkKLQkJewotCQkJdmlzaXRTY2hlbWEocmVmZXJlbmNlZFNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotCXsKLQkJaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLQkJewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQl2aXNpdEltcG9ydCgoSW1wb3J0KWkubmV4dCgpKTsKLQkJCX0KLQkJCVR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLQkJCWlmICh0eXBlcyAhPSBudWxsKQotCQkJewotCi0JCQkJZm9yIChJdGVyYXRvciBpID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0JCQkJCXsKLQkJCQkJCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbzsKLQkJCQkJCWlmIChlLmdldEVYU0RTY2hlbWEoKSAhPSBudWxsKQotCQkJCQkJewotCQkJCQkJCXZpc2l0U2NoZW1hKGUuZ2V0RVhTRFNjaGVtYSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0JewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLQkJCXsKLQkJCQl2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZSgoWFNEU2NoZW1hRGlyZWN0aXZlKW8pOwotCQkJfQotCQl9Ci0JfQotfQotCi1jbGFzcyBSZWxvYWREZXBlbmRlbmN5VmlzaXRvciBleHRlbmRzIERlcGVuZGVuY3lWaXNpdG9yCi17Ci0JcHVibGljIHZvaWQgdmlzaXRJbXBvcnQoSW1wb3J0IHRoZUltcG9ydCkKLQl7Ci0JCUNvbXBvbmVudEhhbmRsZXIgaGFuZGxlciA9IFdTRExSZWNvbmNpbGVyLmdldFJlY29uY2lsZXIodGhlSW1wb3J0KTsKLQkJRWxlbWVudCBlbGVtZW50ID0gV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHRoZUltcG9ydCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgaGFuZGxlciAhPSBudWxsKQotCQl7Ci0JCQloYW5kbGVyLnJlY29uY2lsZSh3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSwgdGhlSW1wb3J0LCBlbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0WFNEU2NoZW1hRGlyZWN0aXZlKFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUpCi0JewotCi0JfQotfSovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YjA4NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQm9vbGVhbkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0ZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvckNTSGVscElkczsKLQotcHVibGljIGNsYXNzIFdTRExQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0gIHB1YmxpYyBXU0RMUHJlZmVyZW5jZVBhZ2UoKQotICB7Ci0gICAgc3VwZXIoRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZS5GTEFUKTsKLSAgICBzZXRQcmVmZXJlbmNlU3RvcmUoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gZ2V0RmllbGRFZGl0b3JQYXJlbnQoKTsKLQlHcmlkTGF5b3V0IHBhcmVudExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JcGFyZW50TGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQlwYXJlbnQuc2V0TGF5b3V0KHBhcmVudExheW91dCk7Ci0JCi0vLyAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBzb21lIGNvbnRleHQgaWQgaGVyZSk7IAotCi0JR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgIGdyb3VwLnNldFRleHQoTWVzc2FnZXMuX1VJX1BSRUZfUEFHRV9DUkVBVElOR19GSUxFUyk7IC8vJE5PTi1OTFMtMSQKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5VTEwpOwotICAgIEdyaWREYXRhIGRhdGExID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YTEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGExLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGExLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGExKTsKLQkKLQlTdHJpbmcgbmFtZXNwYWNlTGFiZWwgPSBNZXNzYWdlcy5fVUlfUFJFRl9QQUdFX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRTsgIC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmdGaWVsZEVkaXRvciB0YXJnZXROYW1lc3BhY2UgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IobmFtZXNwYWNlTGFiZWwsIG5hbWVzcGFjZUxhYmVsLCBjb21wb3NpdGUpOyAvLyBFeHRlcm5hbGl6ZQotICAgIEdyaWRMYXlvdXQgY29tcG9zaXRlTGF5b3V0ID0gKEdyaWRMYXlvdXQpY29tcG9zaXRlLmdldExheW91dCgpOwotICAgIGNvbXBvc2l0ZUxheW91dC5tYXJnaW5XaWR0aCA9IDU7ICAgLy8gRGVmYXVsdCB2YWx1ZQotICAgIGNvbXBvc2l0ZUxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBhZGRGaWVsZCh0YXJnZXROYW1lc3BhY2UpOwotICAgIHRhcmdldE5hbWVzcGFjZS5zZXRGb2N1cygpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGFyZ2V0TmFtZXNwYWNlLmdldFRleHRDb250cm9sKGNvbXBvc2l0ZSksIEFTREVkaXRvckNTSGVscElkcy5XU0RMX1BSRUZfREVGQVVMVF9UTlMpOwotCQotCVN0cmluZyBnZW5lcmF0ZUxhYmVsID0gTWVzc2FnZXMuX1VJX1BSRUZfUEFHRV9BVVRPX1JFR0VORVJBVEVfQklORElORzsgLy8kTk9OLU5MUy0xJAotCUJvb2xlYW5GaWVsZEVkaXRvciBnZW5lcmF0ZUJpbmRpbmdPblNhdmUgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKGdlbmVyYXRlTGFiZWwsIGdlbmVyYXRlTGFiZWwsIHBhcmVudCk7Ci0JYWRkRmllbGQoZ2VuZXJhdGVCaW5kaW5nT25TYXZlKTsKLSAgICAKLQlTdHJpbmcgc2hvd0dlbmVyYXRlRGlhbG9nTGFiZWwgPSBNZXNzYWdlcy5fVUlfUFJFRl9QQUdFX1BST01QVF9SRUdFTl9CSU5ESU5HX09OX1NBVkU7ICAgLy8gVE9ETzogRXh0ZXJuYWxpemUgLy8kTk9OLU5MUy0xJAotCUJvb2xlYW5GaWVsZEVkaXRvciBzaG93R2VuZXJhdGVEaWFsb2cgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKHNob3dHZW5lcmF0ZURpYWxvZ0xhYmVsLCBzaG93R2VuZXJhdGVEaWFsb2dMYWJlbCwgcGFyZW50KTsKLQlhZGRGaWVsZChzaG93R2VuZXJhdGVEaWFsb2cpOwotCi0gICAgLyogRG8gd2UgbmVlZCB0aGlzIHByZWZlcmVuY2UgYmVsb3c/ICBJZiBzbywgY2hhbmdlIFdTRExFZGl0b3JQbHVnaW4uamF2YSBhbmQgdXNlIHRoaXMgcHJlZmVyZW5jZSBpbjoKLSAgICAgICBIdHRwQ29udGVudEdlbmVyYXRvci5qYXZhCi0gICAgICAgU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YQotICAgICAgIFNvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQotICAgICovCi0vLyAgICBIdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEgICAgU3RyaW5nRmllbGRFZGl0b3IgbG9jYXRpb24gPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoIkRlZnVhbHQgTG9jYXRpb246IiwgIkRlZmF1bHQgTG9jYXRpb246IiwgZWRpdG9yR3JvdXAxKTsgLy8gRXh0ZXJuYWxpemUKLS8vICAgIGFkZEZpZWxkKGxvY2F0aW9uKTsgCi0JCi0JYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0gICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExTZWxlY3Rpb25NYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETFNlbGVjdGlvbk1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzg4OGQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETFNlbGVjdGlvbk1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uTWFwcGVyIGltcGxlbWVudHMgSVNlbGVjdGlvbk1hcHBlciB7Ci0KLQlwdWJsaWMgSVNlbGVjdGlvbiBtYXBTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgeyAgCi0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikgewotCQkJCQlsaXN0LmFkZCgoKEFkYXB0ZXIpbykuZ2V0VGFyZ2V0KCkpOwotCQkJCX0gIAotCQkJCWVsc2UgewotCQkJCQlsaXN0LmFkZChvKTsKLQkJCQl9ICAKLQkJCX0gIAotCQl9Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTYxYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQWRkRWxlbWVudEFjdGlvbiBleHRlbmRzIEJhc2VOb2RlQWN0aW9uIHsKLQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnROb2RlOwotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4OwotCXByb3RlY3RlZCBTdHJpbmcgbm9kZU5hbWU7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgbmV3RWxlbWVudDsKLQlwcm90ZWN0ZWQgTm9kZSByZWxhdGl2ZU5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCXByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0JcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCXByb3RlY3RlZCBib29sZWFuIGNvbXB1dGVUb3BMZXZlbFJlZkNoaWxkOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2VsZWN0TmV3bHlDcmVhdGVkT2JqZWN0ID0gdHJ1ZTsgLy8gV2Ugc2hvdWxkIG5vdCBiZQotCQkJCQkJCQkJCQkJCQkvLyBzZWxlY3RpbmcgdGhlCi0JCQkJCQkJCQkJCQkJCS8vIG9iamVjdCBpbiB0aGUKLQkJCQkJCQkJCQkJCQkJLy8gYWN0aW9uLi4uLi4gVE9ETwotCi0JcHVibGljIEFkZEVsZW1lbnRBY3Rpb24oU3RyaW5nIHRleHQsIFN0cmluZyBpbWFnZURlc2NyaXB0b3JLZXksIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCXNldFRleHQodGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihXU0RMRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JLZXkpKTsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lOwotCX0KLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBTdHJpbmcgaW1hZ2VEZXNjcmlwdG9yS2V5LCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJc2V0VGV4dCh0ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcktleSkpOwotCQl0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJdGhpcy5ub2RlTmFtZSA9IGxvY2FsTmFtZTsKLQl9Ci0KLQlwdWJsaWMgQWRkRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCXNldFRleHQodGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihudWxsKTsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMubm9kZU5hbWUgPSBsb2NhbE5hbWU7Ci0JfQotCi0JcHVibGljIEFkZEVsZW1lbnRBY3Rpb24oTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBOb2RlIHJlbGF0aXZlTm9kZSkgewotCQl0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJdGhpcy5ub2RlTmFtZSA9IGxvY2FsTmFtZTsKLQkJdGhpcy5yZWxhdGl2ZU5vZGUgPSByZWxhdGl2ZU5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLQkJY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQgPSBpc0VuYWJsZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7Ci0JCXRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0RpYWxvZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlib29sZWFuIG9rID0gc2hvd0RpYWxvZygpOwotCQlpZiAob2spIHsKLQkJCWJlZ2luUmVjb3JkaW5nKCk7Ci0JCQlwZXJmb3JtQWRkRWxlbWVudCgpOwotCQkJZW5kUmVjb3JkaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpIHsKLQkJaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpOwotCQkJYWRkQXR0cmlidXRlcyhuZXdFbGVtZW50KTsKLQkJCWlmIChyZWxhdGl2ZU5vZGUgPT0gbnVsbCAmJiBjb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCkgewotCQkJCXJlbGF0aXZlTm9kZSA9IGNvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKG5ld0VsZW1lbnQpOwotCQkJfQotCi0JCQlpZiAocmVsYXRpdmVOb2RlID09IG51bGwpIHsKLQkJCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3RWxlbWVudCwgcmVsYXRpdmVOb2RlKTsKLQkJCX0KLQkJCS8vIGZvcm1hdChwYXJlbnROb2RlKTsKLQkJCWZvcm1hdChuZXdFbGVtZW50KTsKLQkJCS8vIFVnbHkuLi4uLiBXZSBzaG91bGQgbm90IGJlIHNlbGVjdGluZyB0aGUgb2JqZWN0IGluIHRoZSBncmFwaAotCQkJLy8gdmlldyBpbiB0aGUgQWN0aW9uLgotCQkJLy8gVGhpcyBzaG91bGQgYmUgcmVmYWN0b3JlZCBvdXQuIFdlIGFkZCB0aGlzIGJvb2xlYW4gY2hlY2sKLQkJCS8vIGJlY2F1c2UgV1NETFNldFR5cGVEaWFsb2cuamF2YQotCQkJLy8gdXNlcyBBZGRJbXBvcnRBY3Rpb24uamF2YSBidXQgd2Ugc2hvdWxkIG5vdCBiZSBzZWxlY3RpbmcgdGhlCi0JCQkvLyBuZXdseSBjcmVhdGVkIGltcG9ydC4uLi4KLQkJCWlmIChzZWxlY3ROZXdseUNyZWF0ZWRPYmplY3QpIHsKLQkJCQlzZWxlY3RPYmplY3RGb3JOZXdFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBVZ2x5Li4uLi4gV2Ugc2hvdWxkIG5vdCBiZSBzZWxlY3RpbmcgdGhlIG9iamVjdCBpbiB0aGUgZ3JhcGggdmlldyBpbgotCS8vIHRoZSBBY3Rpb24uCi0JLy8gVGhpcyBzaG91bGQgYmUgcmVmYWN0b3JlZCBvdXQuIFdlIGFkZCB0aGlzIGJvb2xlYW4gY2hlY2sgYmVjYXVzZQotCS8vIFdTRExTZXRUeXBlRGlhbG9nLmphdmEKLQkvLyB1c2VzIEFkZEltcG9ydEFjdGlvbi5qYXZhIGJ1dCB3ZSBzaG91bGQgbm90IGJlIHNlbGVjdGluZyB0aGUgbmV3bHkKLQkvLyBjcmVhdGVkIGltcG9ydC4uLi4KLQkvLyBXZSBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgY2FsbGluZyBydW4oKQotCXB1YmxpYyB2b2lkIHNlbGVjdE9iamVjdEZvck5ld0VsZW1lbnQoYm9vbGVhbiBzZWxlY3QpIHsKLQkJc2VsZWN0TmV3bHlDcmVhdGVkT2JqZWN0ID0gc2VsZWN0OwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCWlmIChwYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnROb2RlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGRvY3VtZW50OwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBub2RlTmFtZSkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudE5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JCUVsZW1lbnQgZWxlbWVudCA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocHJlZml4ICsgIjoiICsgbm9kZU5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkgewotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0KE5vZGUgcGFyZW50Tm9kZSkgewotCQlpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZQotCQkJRm9ybWF0UHJvY2Vzc29yWE1MIGZvcm1hdFByb2Nlc3NvclhNTCA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLQkJCWZvcm1hdFByb2Nlc3NvclhNTC5mb3JtYXROb2RlKChJRE9NTm9kZSkgcGFyZW50Tm9kZSk7Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBFbGVtZW50IGdldERlZmluaXRpb25FbGVtZW50KEVsZW1lbnQgcGFyZW50RWxlbWVudCkgewotCQlFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gbnVsbDsKLQotCQlmb3IgKE5vZGUgbm9kZSA9IHBhcmVudEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJaWYgKFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoZWxlbWVudCkgPT0gV1NETENvbnN0YW50cy5ERUZJTklUSU9OKSB7Ci0JCQkJCWRlZmluaXRpb25FbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZpbml0aW9uRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXROZXdFbGVtZW50KCkgewotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdE9iamVjdEZvck5ld0VsZW1lbnQoKSB7Ci0JCWlmIChlZGl0b3JQYXJ0ID09IG51bGwpIHsKLQkJCWVkaXRvclBhcnQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQl9Ci0JCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KGRlZmluaXRpb24sIG5ld0VsZW1lbnQpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yUGFydC5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdE9iamVjdChXU0RMRWxlbWVudCBvYmplY3QpIHsKLQkJaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yUGFydCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCX0KLQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCAmJiBkZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHNob3dEaWFsb2dIZWxwZXIoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVmYXVsdE5hbWUsIExpc3QgdXNlZE5hbWVzKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBkZWZhdWx0TmFtZTsKLQkJTmV3Q29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdDb21wb25lbnREaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB0aXRsZSwgZGVmYXVsdE5hbWUsIHVzZWROYW1lcyk7Ci0JCWludCByYyA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0JCWlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlyZXN1bHQgPSBkaWFsb2cuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGNvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKE5vZGUgbm9kZVRvQWRkKSB7Ci0JCU5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGEgPSBnZXRQcmVjZWRlbmNlKG5vZGVUb0FkZCk7Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBwYXJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJaW50IGIgPSBnZXRQcmVjZWRlbmNlKG5vZGUpOwotCQkJCWlmIChiID4gYSkgewotCQkJCQlyZXN1bHQgPSBub2RlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZpbml0aW9uU3R1YigpIHsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIENyZWF0ZSB0aGUgRGVmaW5pdGlvbnMgZWxlbWVudCB3aXRoIHByb3BlciBuYW1lc3BhY2UKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWNoYXJTZXQgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oInhtbCIsICJ2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgY2hhclNldCArICJcIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIndzZGw6ZGVmaW5pdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdCk7Ci0KLQkJCS8vIEFkZCB2YXJpb3VzIG5hbWVzcGFjZSBhdHRyaWJ1dGVzIGhlcmUuCi0JCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6c29hcCIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnRucyIsIGdldERlZmF1bHROYW1lc3BhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczp3c2RsIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJuYW1lIiwgZ2V0RmlsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCBnZXREZWZhdWx0TmFtZXNwYWNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCWRlZmluaXRpb24uc2V0RWxlbWVudChyb290KTsKLQkJCXBhcmVudE5vZGUgPSByb290OwotCQkJcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIHsKLQkJU3RyaW5nIG5hbWVzcGFjZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoTWVzc2FnZXMuX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWlmICghbmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZXNwYWNlID0gbmFtZXNwYWNlLmNvbmNhdCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQluYW1lc3BhY2UgKz0gZ2V0RmlsZU5hbWUoKSArICIvIjsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCVN0cmluZyBmaWxlTG9jYXRpb24gPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0JCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZUxvY2F0aW9uKTsKLQkJcmV0dXJuIGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIHByZWNlZGVuY2VNYXAgPSBjcmVhdGVQcmVjZWRlbmNlTWFwKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRQcmVjZWRlbmNlKE5vZGUgbm9kZSkgewotCQlpbnQgcmVzdWx0ID0gMjsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IG5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0JCWlmIChsb2NhbE5hbWUgIT0gbnVsbCkgewotCQkJSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIHByZWNlZGVuY2VNYXAuZ2V0KGxvY2FsTmFtZSk7Ci0JCQlpZiAoaW50ZWdlciAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gaW50ZWdlci5pbnRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIGNyZWF0ZVByZWNlZGVuY2VNYXAoKSB7Ci0JCUhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoMSkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoMykpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlRZUEVTX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig0KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuTUVTU0FHRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNSkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNikpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLkJJTkRJTkdfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDcpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5TRVJWSUNFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig4KSk7Ci0JCXJldHVybiBoYXNoTWFwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRWxlbWVudERlY2xhcmF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRWxlbWVudERlY2xhcmF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjQwNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLQlwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4OwotCQotCXB1YmxpYyBBZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgc3VnZ2VzdGVkUHJlZml4KQotCXsKLQkJdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCXRoaXMucHJlZml4ID0gc3VnZ2VzdGVkUHJlZml4OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKQotCXsKLQkJU3RyaW5nIGV4aXN0aW5nUHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQkJaWYgKGV4aXN0aW5nUHJlZml4ICE9IG51bGwpCi0JCXsKLQkJCXByZWZpeCA9IGV4aXN0aW5nUHJlZml4OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJlZml4ID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQcmVmaXgoZGVmaW5pdGlvbiwgcHJlZml4KTsKLQkJCUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0JCQlpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCkKLQkJCXsKLQkJCQlkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIG5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0JCQkKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkKLQl7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEltcG9ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEltcG9ydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI1NDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRJbXBvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRJbXBvcnRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeDsKLQotICBwdWJsaWMgQWRkSW1wb3J0QWN0aW9uKElFZGl0b3JQYXJ0IHBhcnQsIERlZmluaXRpb24gZGVmaW5pdGlvbiwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0JdGhpcyhwYXJ0LCBkZWZpbml0aW9uLCBwYXJlbnROb2RlLCBwcmVmaXgsIG51bGwsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgQWRkSW1wb3J0QWN0aW9uKElFZGl0b3JQYXJ0IHBhcnQsIERlZmluaXRpb24gZGVmaW5pdGlvbiwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTVBPUlQsICJpY29ucy9pbXBvcnRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImltcG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCSAgc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLQkgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotCSAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JICBzZXRFZGl0b3JQYXJ0KHBhcnQpOwotCSAgCi0JICBpZiAocGFydCBpbnN0YW5jZW9mIEludGVybmFsV1NETE11bHRpUGFnZUVkaXRvcikgewotCSAgCWRvY3VtZW50ID0gKChJRE9NTW9kZWwpICgoSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yKSBwYXJ0KS5nZXRNb2RlbCgpKS5nZXREb2N1bWVudCgpOwotCSAgfQotICB9Ci0gICAgICAgIAotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBub2RlTmFtZSkKLSAgewotICAJaWYgKGVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeCAhPSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsKQotICAJeyAKLSAgICAJRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICAJaWYgKGRlZmluaXRpb25FbGVtZW50ICE9IG51bGwpCi0gICAgCXsgICAgCi0JICAJICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBlbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJfSAgICAgIAkKLSAgCX0KLSAgCXJldHVybiBzdXBlci5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXgoU3RyaW5nIG5zUHJlZml4KQotICB7Ci0gIAl0aGlzLmVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeCA9IG5zUHJlZml4OwotICB9Ci0gICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCBuYW1lc3BhY2UgIT0gbnVsbCA/IG5hbWVzcGFjZSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgbG9jYXRpb24gIT0gbnVsbCA/IGxvY2F0aW9uIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCB8fCAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkpIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlzdXBlci5wZXJmb3JtQWRkRWxlbWVudCgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFdTSVNjaGVtYUltcG9ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFdTSVNjaGVtYUltcG9ydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTAyZWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbgotewotICAgIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeDsKLQotICAgIHB1YmxpYyBBZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWZpbml0aW9uRWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAJcmV0dXJuIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0lNUE9SVDsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldE9yQ3JlYXRlVHlwZXNFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIEVsZW1lbnQgdHlwZXNFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGRlZmluaXRpb24uZ2V0VHlwZXMoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRFbGVtZW50QWN0aW9uIGFkZFR5cGVzQWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oIiIsICJpY29ucy94c2Rfb2JqLmdpZiIsIGRlZmluaXRpb25FbGVtZW50LCBkZWZpbml0aW9uRWxlbWVudC5nZXRQcmVmaXgoKSwgInR5cGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgICAgICAgICAgYWRkVHlwZXNBY3Rpb24uc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWRkVHlwZXNBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgICAgdHlwZXNFbGVtZW50ID0gYWRkVHlwZXNBY3Rpb24uZ2V0TmV3RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGZvcm1hdCh0eXBlc0VsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHlwZXNFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24uZ2V0VHlwZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVzRWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0SW1wb3J0SG9sZGVyRWxlbWVudChFbGVtZW50IHR5cGVzRWxlbWVudCkgewotICAgIAlFbGVtZW50IGltcG9ydEhvbGRlckVsZW1lbnQgPSBudWxsOwotICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHR5cGVzRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKCJzY2hlbWEiLmVxdWFscyhlbGVtZW50LmdldExvY2FsTmFtZSgpKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikgPT0gbnVsbCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbXBvcnRIb2xkZXJFbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW1wb3J0SG9sZGVyRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRPckNyZWF0ZUltcG9ydEhvbGRlckVsZW1lbnQoRWxlbWVudCB0eXBlc0VsZW1lbnQpCi0gICAgewotICAgICAgICBFbGVtZW50IGltcG9ydEhvbGRlckVsZW1lbnQgPSBnZXRJbXBvcnRIb2xkZXJFbGVtZW50KHR5cGVzRWxlbWVudCk7Ci0gICAgICAgIGlmIChpbXBvcnRIb2xkZXJFbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWRkSW1wb3J0SG9sZGVyQWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oIiIsICJpY29ucy94c2Rfb2JqLmdpZiIsIHR5cGVzRWxlbWVudCwgInhzZCIsICJzY2hlbWEiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6eHNkIiwgV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgYWRkSW1wb3J0SG9sZGVyQWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgaW1wb3J0SG9sZGVyRWxlbWVudCA9IGFkZEltcG9ydEhvbGRlckFjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgICBmb3JtYXQoaW1wb3J0SG9sZGVyRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltcG9ydEhvbGRlckVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gYWRkIHRoZSBpbXBvcnQgaWYgaXQncyBhbHJlYWR5IHRoZXJlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0Tm90QWxyZWFkeUV4aXN0cygpIHsKLSAgICAJYm9vbGVhbiBub3RFeGlzdHMgPSB0cnVlOwotICAgIAkKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0VHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgCQlFbGVtZW50IHR5cGVzRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uLmdldFR5cGVzKCkpOwotICAgIAkJRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZ2V0SW1wb3J0SG9sZGVyRWxlbWVudCh0eXBlc0VsZW1lbnQpOwotCi0gICAgCQlpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgCQkJLy8gQ29sbGVjdCBjaGlsZHJlbgotICAgIAkJCU5vZGUgbm9kZSA9IHNjaGVtYUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIAkJCWphdmEudXRpbC5WZWN0b3Igc2NoZW1hQ2hpbGRyZW4gPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgIAkJCWlmIChub2RlICE9IG51bGwpIHsKLSAgICAJCQkJTm9kZSBjaGlsZCA9IG5vZGU7Ci0JCQkJCQotICAgIAkJCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0SW1wbCkpIHsKLSAgICAJCQkJCXNjaGVtYUNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotICAgIAkJCQl9Ci0JCQkJCQotICAgIAkJCQl3aGlsZSAoY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKSB7Ci0gICAgCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgCQkJCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0SW1wbCkpIHsKLSAgICAJCQkJCQlzY2hlbWFDaGlsZHJlbi5hZGRFbGVtZW50KGNoaWxkKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotCi0gICAgCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzY2hlbWFDaGlsZHJlbi5zaXplKCk7IGluZGV4KyspIHsKLSAgICAJCQkJCUVsZW1lbnQgc2NoZW1hQ2hpbGQgPSAoRWxlbWVudCkgc2NoZW1hQ2hpbGRyZW4uZWxlbWVudEF0KGluZGV4KTsKLSAgICAJCQkJCVN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYUNoaWxkLmdldEF0dHJpYnV0ZSgic2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQkJU3RyaW5nIHNjaGVtYU5hbWVzcGFjZSA9IHNjaGVtYUNoaWxkLmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLSAgICAJCQkJCWlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsICYmCi0gICAgCQkJCQkJCXNjaGVtYUxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikgJiYgc2NoZW1hTmFtZXNwYWNlLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgCQkJCQkJbm90RXhpc3RzID0gZmFsc2U7Ci0gICAgCQkJCQkJYnJlYWs7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJCi0gICAgCXJldHVybiBub3RFeGlzdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsICYmIGltcG9ydE5vdEFscmVhZHlFeGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYmVnaW5SZWNvcmRpbmcoKTsKLSAgICAgICAgICAgIHBlcmZvcm1BZGRFbGVtZW50KCk7Ci0gICAgICAgICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCB0eXBlc0VsZW1lbnQgPSBnZXRPckNyZWF0ZVR5cGVzRWxlbWVudCgpOwotICAgICAgICAgICAgRWxlbWVudCBpbXBvcnRIb2xkZXJFbGVtZW50ID0gZ2V0T3JDcmVhdGVJbXBvcnRIb2xkZXJFbGVtZW50KHR5cGVzRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWRkSW1wb3J0QWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oIiIsICJpY29ucy94c2Rfb2JqLmdpZiIsIGltcG9ydEhvbGRlckVsZW1lbnQsIGltcG9ydEhvbGRlckVsZW1lbnQuZ2V0UHJlZml4KCksICJpbXBvcnQiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsIG5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIiwgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGFkZEltcG9ydEFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGFkZEltcG9ydEFjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgICBmb3JtYXQobmV3RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXgoU3RyaW5nIG5zUHJlZml4KQotICAgIHsKLSAgICAgICAgdGhpcy5lbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXggPSBuc1ByZWZpeDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZm9ybWF0KE5vZGUgcGFyZW50Tm9kZSkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZvcm1hdCBzZWxlY3RlZCBub2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgRm9ybWF0UHJvY2Vzc29yWE1MIGZvcm1hdFByb2Nlc3NvclhNTCA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgICAgIGZvcm1hdFByb2Nlc3NvclhNTC5mb3JtYXROb2RlKChJRE9NTm9kZSlwYXJlbnROb2RlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDM1YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsgCi0gICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17IAotICBwdWJsaWMgYWJzdHJhY3QgTm9kZSBnZXROb2RlKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCk7Ci0KLSAgcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoKQotICB7ICAgIAotICAgIE5vZGUgbm9kZSA9IGdldE5vZGUoKTsgIAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFVuZG9EZXNjcmlwdGlvbigpKTsgIAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVuZFJlY29yZGluZygpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIE5vZGUgbm9kZSA9IGdldE5vZGUoKTsgCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICAoKElET01Ob2RlKW5vZGUpLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgCi0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXROYW1lc3BhY2VzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlYmNmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRWRpdE5hbWVzcGFjZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICBwdWJsaWMgRWRpdE5hbWVzcGFjZXNBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfRURJVF9OQU1FU1BBQ0VTKTsgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbmFtZXNwYWNlSW5mb01hbmFnZXIgPSBuZXcgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIoKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmFtZXNwYWNlSW5mb01hbmFnZXIuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoZWxlbWVudCk7Ci0vLyAgICAgIExpc3Qgb2xkTmFtZXNwYWNlSW5mb0xpc3QgPSBOYW1lc3BhY2VJbmZvLmNsb25lTmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0gICAgICAvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotICAgICAgLy8gdGhpcyBpbmZvIHdpbGwgYmUgdXNlZCBpbiBjcmVhdGVQcmVmaXhNYXBwaW5nKCkgdG8gZmlndXJlIG91dCBob3cgdG8gdXBkYXRlIHRoZSBkb2N1bWVudCAKLSAgICAgIC8vIGluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZXMKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgICBOYW1lc3BhY2VJbmZvIG9sZENvcHkgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eSgib2xkQ29weSIsIG9sZENvcHkpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLQkgIElQYXRoIHBhdGggPSBuZXcgUGF0aChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgIEVkaXROYW1lc3BhY2VzRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0TmFtZXNwYWNlc0RpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksICBwYXRoLCBNZXNzYWdlcy5fVUlfRURJVF9OQU1FU1BBQ0VTX0RJQUxPR19USVRMRSwgZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZXNwYWNlSW5mb0xpc3QpOyAvLyROT04tTkxTLTEkCi0gICAgICBpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgICB7ICAgICAgCQotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLSAgICAgICAgTGlzdCBuZXdJbmZvTGlzdCA9IGRpYWxvZy5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotICAgICAgICBuYW1lc3BhY2VJbmZvTWFuYWdlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotICAgICAgICBuYW1lc3BhY2VJbmZvTWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKGVsZW1lbnQsIG5ld0luZm9MaXN0LCBmYWxzZSk7Ci0KLS8qCi0gICAgICAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmFtZSBhbnkgcHJlZml4ZXMKLSAgICAgICAgTWFwIHByZWZpeE1hcHBpbmcgPSBjcmVhdGVQcmVmaXhNYXBwaW5nKG9sZE5hbWVzcGFjZUluZm9MaXN0LCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgICAgIGlmIChwcmVmaXhNYXBwaW5nLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAvL21hbmFnZXIuZ2V0TW9kZWwoKS5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgICBSZXBsYWNlUHJlZml4QWN0aW9uIHJlcGxhY2VQcmVmaXhBY3Rpb24gPSBuZXcgUmVwbGFjZVByZWZpeEFjdGlvbihlbGVtZW50LCBwcmVmaXhNYXBwaW5nKTsKLSAgICAgICAgICByZXBsYWNlUHJlZml4QWN0aW9uLnJ1bigpOwotICAgICAgICAgIC8vbWFuYWdlci5nZXRNb2RlbCgpLmNoYW5nZWRNb2RlbCgpOwotICAgICAgICB9Ci0qLyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIE1hcCBjcmVhdGVQcmVmaXhNYXBwaW5nKExpc3Qgb2xkTGlzdCwgTGlzdCBuZXdMaXN0KQotICB7Ci0gICAgTWFwIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIEhhc2h0YWJsZSBvbGRVUklUb1ByZWZpeFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLSAgICAgIG9sZFVSSVRvUHJlZml4VGFibGUucHV0KG9sZEluZm8udXJpLCBvbGRJbmZvKTsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG5ld0luZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgb2xkVVJJVG9QcmVmaXhUYWJsZS5nZXQobmV3SW5mby51cmkgIT0gbnVsbCA/IG5ld0luZm8udXJpIDogIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIC8vIGlmIG9sZEluZm8gaXMgbm9uIG51bGwgLi4uIHRoZXJlJ3MgYSBtYXRjaGluZyBVUkkgaW4gdGhlIG9sZCBzZXQKLSAgICAgIC8vIHdlIGNhbiB1c2UgaXRzIHByZWZpeCB0byBkZXRlbWluZSBvdXQgbWFwcGluZwotICAgICAgLy8KLSAgICAgIC8vIGlmIG9sZEluZm8gaXMgbnVsbCAuLi4gIHdlIHVzZSB0aGUgJ29sZENvcHknIHdlIHN0YXNoZWQgYXdheSAKLSAgICAgIC8vIGFzc3VtaW5nIHRoYXQgdGhlIHVzZXIgY2hhbmdlZCB0aGUgVVJJIGFuZCB0aGUgcHJlZml4Ci0gICAgICBpZiAob2xkSW5mbyA9PSBudWxsKQotICAgICAgewotICAgICAgICBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG5ld0luZm8uZ2V0UHJvcGVydHkoIm9sZENvcHkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBpZiAob2xkSW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIG9sZFByZWZpeCA9IG9sZEluZm8ucHJlZml4ICE9IG51bGwgPyBvbGRJbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICghb2xkUHJlZml4LmVxdWFscyhuZXdQcmVmaXgpKQotICAgICAgICB7Ci0gICAgICAgICAgbWFwLnB1dChvbGRQcmVmaXgsIG5ld1ByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0lXU0RMVG9vbGJhckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0lXU0RMVG9vbGJhckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGZiMjVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9JV1NETFRvb2xiYXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdTRExUb29sYmFyQWN0aW9uIGV4dGVuZHMgSUFjdGlvbnsKLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSW5OZXdFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSW5OZXdFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzZTA3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkluTmV3RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5PcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuSW5OZXdFZGl0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLk9wZW5Jbk5ld0VkaXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyBPcGVuSW5OZXdFZGl0b3IoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1IpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0SWQoSUQpOwotICAgIHNldEltYWdlRGVzY3JpcHRvcihBU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigid3NkbF9maWxlX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLSAgICAgIC8vIHNob3VsZCBtYWtlIHRoaXMgZ2VuZXJpYyBhbmQgYmUgYWJsZSB0byBnZXQgdGhlIG93bmVyIGZyb20gYSBmYWNhZGUgb2JqZWN0Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgV1NETEJhc2VBZGFwdGVyIGJhc2VBZGFwdGVyID0gKFdTRExCYXNlQWRhcHRlcilvOwotCi0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoRGVmaW5pdGlvbi5jbGFzcyk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpYmFzZUFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyIG9wZW5IZWxwZXIgPSBuZXcgT3Blbk9uU2VsZWN0aW9uSGVscGVyKChEZWZpbml0aW9uKW9iamVjdCk7Ci0gICAgICAgICAgb3BlbkhlbHBlci5vcGVuRWRpdG9yKGVPYmplY3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmQ0ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvci5CaW5kaW5nUmVuYW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yLk1lc3NhZ2VSZW5hbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3IuUG9ydFR5cGVSZW5hbWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiAvL2V4dGVuZHMgQmFzZU5vZGVBY3Rpb24gaW1wbGVtZW50cyBSdW5uYWJsZQotewotICBwcm90ZWN0ZWQgT2JqZWN0IG1vZGVsT2JqZWN0OyAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbmV3TmFtZTsKLSAgcHJvdGVjdGVkIE5vZGUgbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgUmVuYW1lQWN0aW9uKE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIG5ld05hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMubW9kZWxPYmplY3QgPSBtb2RlbE9iamVjdDsKLSAgICB0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotICAgIHRoaXMubm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChtb2RlbE9iamVjdCk7Ci0gIH0gICAgICAKLQotICAvKgotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBub2RlOwotICB9Ci0gICovCi0KLSAgLyoKLSAgcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9SRU5BTUUiKTsgIC8vJE5PTi1OTFMtMSQKLSAgfQotICAqLwotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pIAotICAgIHsKLSAgICAgIHJlbmFtZU9wZXJhdGlvbkhlbHBlcigoT3BlcmF0aW9uKW1vZGVsT2JqZWN0KTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIHJlbmFtZUlPRkhlbHBlcigoV1NETEVsZW1lbnQpbW9kZWxPYmplY3QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIobW9kZWxPYmplY3QsIG5ld05hbWUpOwotICAgIH0KLSAgfSAKLQotICBwcm90ZWN0ZWQgdm9pZCByZW5hbWVNb2RlbE9iamVjdEhlbHBlcihPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyB0aGVOZXdOYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsgCi0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoZU5ld05hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgICAKLQotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2UpCi0gICAgewotICAgICAgTWVzc2FnZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBNZXNzYWdlUmVuYW1lcigoTWVzc2FnZSltb2RlbE9iamVjdCwgdGhlTmV3TmFtZSk7Ci0gICAgICByZW5hbWVyLnZpc2l0QmluZGluZ3MoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICBQb3J0VHlwZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBQb3J0VHlwZVJlbmFtZXIoKFBvcnRUeXBlKW1vZGVsT2JqZWN0LCB0aGVOZXdOYW1lKTsKLSAgICAgIHJlbmFtZXIudmlzaXRCaW5kaW5ncygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgQmluZGluZ1JlbmFtZXIgcmVuYW1lciA9IG5ldyBCaW5kaW5nUmVuYW1lcigoQmluZGluZyltb2RlbE9iamVjdCwgdGhlTmV3TmFtZSk7Ci0gICAgICByZW5hbWVyLnZpc2l0U2VydmljZXMoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW5hbWVPcGVyYXRpb25IZWxwZXIoT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIHJlbmFtZU1vZGVsT2JqZWN0SGVscGVyKG9wZXJhdGlvbiwgbmV3TmFtZSk7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbmFtZUlPRkhlbHBlcihXU0RMRWxlbWVudCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb2JqZWN0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsgCi0gICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgbGlzdCA9IHV0aWwuZ2V0QmluZGluZ0lucHV0cygoSW5wdXQpb2JqZWN0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIGxpc3QgPSB1dGlsLmdldEJpbmRpbmdPdXRwdXRzKChPdXRwdXQpb2JqZWN0KTsKLSAgICB9Ci0gICAgZWxzZSAvLyBmYXVsdAotICAgIHsKLSAgICAgIGxpc3QgPSB1dGlsLmdldEJpbmRpbmdGYXVsdHMoKEZhdWx0KW9iamVjdCk7Ci0gICAgfQotICAgICAgCi0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBiaW5kaW5nT2JqZWN0ID0gaS5uZXh0KCk7Ci0gICAgICAgIHJlbmFtZU1vZGVsT2JqZWN0SGVscGVyKGJpbmRpbmdPYmplY3QsIG5ld05hbWUpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICByZW5hbWVNb2RlbE9iamVjdEhlbHBlcihvYmplY3QsIG5ld05hbWUpOwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU21hcnRSZW5hbWVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TbWFydFJlbmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2JiMDQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TbWFydFJlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCYXNlUGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKgotICogVGhpcyBjbGFzcyByZW5hbWVzICdyZWxhdGVkJyBXU0RMRWxlbWVudHMuICBUaGUgc2NlbmFyaW8gaXMgYXMgZm9sbG93czoKLSAqIFRoZSB1c2VyIHJlbmFtZXMgYSBXU0RMRWxlbWVudCBpbiB0aGUgZWRpdG9yLCBzYXkgYSBNZXNzYWdlLiAgVGhpcyBjbGFzcwotICogd2lsbCBmaW5kIHRoZSAncmVsYXRlZCcgZWxlbWVudHMgdG8gdGhpcyBNZXNzYWdlIGFuZCByZW5hbWUgdGhlbSBhcyB3ZWxsLgotICogSXQgd2lsbCBvbmx5IHJlbmFtZSBhICdyZWxhdGVkJyBlbGVtZW50IGlmIHRoZSBlbGVtZW50IG5hbWUgKG9yIHBhcnQgb2YgaXQpCi0gKiBpcyBnZW5lcmF0ZWQuCi0gKiAKLSAqIFNlZSBOYW1lVXRpbC5qYXZhCi0gKi8KLXB1YmxpYyBjbGFzcyBTbWFydFJlbmFtZUFjdGlvbiBleHRlbmRzIEJhc2VOb2RlQWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUgewotCXByb3RlY3RlZCBPYmplY3QgZWxlbWVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld05hbWU7Ci0JcHJpdmF0ZSBMaXN0IG1lc3NhZ2VSZWZlcmVuY2VzOyAvLyBUaGlzIHZhcmlhYmxlIHNob3VsZCBiZSBhY2Nlc3NlZCBieSBtZXRob2QgZ2V0QWxsTWVzc2FnZVJlZmVyZW5jZXMoKQotCXByb3RlY3RlZCBOb2RlIG5vZGU7Ci0JcHJpdmF0ZSBib29sZWFuIHJlbmFtZVBhcmVudCA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgb2xkTmFtZTsKLQkKLQlwdWJsaWMgU21hcnRSZW5hbWVBY3Rpb24oT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXNldFRleHQoIlNtYXJ0IFJlbmFtZSBBY3Rpb24iKTsgLy8gRG8gbm90IHRyYW5zbGF0ZSAvLyROT04tTkxTLTEkCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JICAgIHRoaXMubm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkgICByZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkgIHJldHVybiBNZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoKLQkgKiBib29sZWFuIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0b3AgbGV2ZWwgKHBhcmVudCkgb2JqZWN0IHNob3VsZCBiZSByZW5hbWVkCi0JICogaXRzZWxmLiAgT3RoZXJ3aXNlLCBvbmx5IHRoZSAiY2hpbGQiIG9iamVjdHMgd2lsbCBiZSByZW5hbWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIHJlbmFtZVBhcmVudCkgewotCQl0aGlzLnJlbmFtZVBhcmVudCA9IHJlbmFtZVBhcmVudDsKLQkJcnVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlSZW5hbWVBY3Rpb24gcmVuYW1lcjsKLQkJCi0JCWJlZ2luUmVjb3JkaW5nKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0JCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgZWxlbWVudDsKLQkJCW9sZE5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotCi0JCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCS8vIFJlbmFtZSBPcGVyYXRpb24KLQkJCWlmIChyZW5hbWVQYXJlbnQpIHsKLQkJCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihvcGVyYXRpb24sIG5ld05hbWUpOwotCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIFJlbmFtZSBJbnB1dAotCQkJSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0JCQkvKgotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaXNJbnB1dE91dHB1dE5hbWVHZW5lcmF0ZWQob2xkTmFtZSwgaW5wdXQuZ2V0TmFtZSgpKSkgewotCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKGlucHV0LCBuZXdOYW1lKTsKLQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJLy8gUmVuYW1lIE91dHB1dAotCQkJT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0JCQkvKgotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIGlzSW5wdXRPdXRwdXROYW1lR2VuZXJhdGVkKG9sZE5hbWUsIG91dHB1dC5nZXROYW1lKCkpKSB7Ci0JCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ob3V0cHV0LCBuZXdOYW1lKTsKLQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJLy8gUmVuYW1lIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCQkJTWVzc2FnZSBtc2c7Ci0KLQkJCS8vIElucHV0Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQltc2cgPSBpbnB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJb2xkTWVzc2FnZU5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJCi0JCQkJCWlmIChpc01lc3NhZ2VOYW1lR2VuZXJhdGVkKG9sZE1lc3NhZ2VOYW1lLCBvbGROYW1lLCAiUmVxdWVzdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7CQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBPdXRwdXQKLQkJCWlmIChvdXRwdXQgIT0gbnVsbCAmJiBvdXRwdXQuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQltc2cgPSBvdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLQkJCQlTdHJpbmcgb2xkTWVzc2FnZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQkKLQkJCQkJaWYgKGlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob2xkTWVzc2FnZU5hbWUsIG9sZE5hbWUsICJSZXNwb25zZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBGYXVsdHMKLQkJCUxpc3QgZmF1bHRzID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKTsKLQkJCWlmIChmYXVsdHMgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGl0ID0gZmF1bHRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgaXQubmV4dCgpOwotCQkJCQltc2cgPSBmYXVsdC5nZXRFTWVzc2FnZSgpOwotCQkJCQlTdHJpbmcgb2xkTWVzc2FnZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJb2xkTWVzc2FnZU5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJCQotCQkJCQkJaWYgKGlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob2xkTWVzc2FnZU5hbWUsIG9sZE5hbWUsIGZhdWx0LmdldE5hbWUoKSkpIHsKLQkJCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkJCQotCQkJCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnB1dCkgewotCQkJSW5wdXQgaW5wdXQgPSAoSW5wdXQpIGVsZW1lbnQ7Ci0JCQlvbGROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJaWYgKG9sZE5hbWUgPT0gbnVsbCkgewotCQkJCW9sZE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlmIChyZW5hbWVQYXJlbnQpIHsKLQkJCQlpbnB1dC5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCi0vLwkJCSBSZW5hbWUgTWVzc2FnZXMgYW5kIFBhcnRzCi0JCQlNZXNzYWdlIG1zZzsKLQkJCQotCQkJLy8gSW5wdXQKLQkJCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0LmdldEVNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCW1zZyA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0JCQkJU3RyaW5nIG9sZE1lc3NhZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJb2xkTWVzc2FnZU5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJCi0JCQkJCWlmIChpc01lc3NhZ2VOYW1lR2VuZXJhdGVkKG9sZE1lc3NhZ2VOYW1lLCBvbGROYW1lLCAiUmVxdWVzdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7CQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPdXRwdXQpIHsKLQkJCU91dHB1dCBvdXRwdXQgPSAoT3V0cHV0KSBlbGVtZW50OwotCQkJb2xkTmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0JCQlpZiAob2xkTmFtZSA9PSBudWxsKSB7Ci0JCQkJb2xkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKHJlbmFtZVBhcmVudCkgewotCQkJCW91dHB1dC5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCi0vLwkJCSBSZW5hbWUgTWVzc2FnZXMgYW5kIFBhcnRzCi0JCQlNZXNzYWdlIG1zZzsKLQkJCQotCQkJLy8gT3V0cHV0Ci0JCQlpZiAob3V0cHV0ICE9IG51bGwgJiYgb3V0cHV0LmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJbXNnID0gb3V0cHV0LmdldEVNZXNzYWdlKCk7Ci0JCQkJU3RyaW5nIG9sZE1lc3NhZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJb2xkTWVzc2FnZU5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJaWYgKGlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob2xkTWVzc2FnZU5hbWUsIG9sZE5hbWUsICJSZXNwb25zZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0JCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgZWxlbWVudDsKLQkJCU1lc3NhZ2UgbXNnID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlvbGROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotCQkJCi0JCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCS8vIFJlbmFtZSB0aGUgRmF1bHQKLQkJCWlmIChyZW5hbWVQYXJlbnQpIHsKLQkJCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihmYXVsdCwgbmV3TmFtZSk7Ci0JCQkJcmVuYW1lci5ydW4oKTsKLQkJCX0KLQotCQkJLy8gUmVuYW1lIHRoZSBNZXNzYWdlIGFuZCBQYXJ0cwotCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJb2xkTWVzc2FnZU5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkKLQkJCQlPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob2xkTWVzc2FnZU5hbWUsIG9wLmdldE5hbWUoKSwgb2xkTmFtZSkpIHsKLQkJCQkJcmVuYW1lTWVzc2FnZUhlbHBlcihtc2csIGNvbXB1dGVOZXdNZXNzYWdlTmFtZShtc2csIG9sZE5hbWUsIG5ld05hbWUpKTsKLQkJCQkJCi0JCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCXJlbmFtZUZhdWx0UGFydHMobXNnLmdldEVQYXJ0cygpLCBvcC5nZXROYW1lKCksIG9sZE5hbWUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZSkgewotCQkJTWVzc2FnZSBtc2cgPSAoTWVzc2FnZSkgZWxlbWVudDsKLQkJCW9sZE5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCi0JCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdNZXNzYWdlTmFtZSA9IGNvbXB1dGVOZXdNZXNzYWdlTmFtZShtc2csIG9sZE5hbWUsIG5ld05hbWUpOwotCQkJaWYgKHJlbmFtZVBhcmVudCkgewotCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBuZXdNZXNzYWdlTmFtZSk7Ci0JCQl9Ci0JCQkJCQotCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCXJlbmFtZVBhcnRzSGVscGVyKG1zZy5nZXRFUGFydHMoKSwgb2xkTWVzc2FnZU5hbWUsIG5ld01lc3NhZ2VOYW1lLCB0cnVlKTsKLS8vCQkJCXJlbmFtZVBhcnRzSGVscGVyKG1zZy5nZXRFUGFydHMoKSwgb2xkTWVzc2FnZU5hbWUsIG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCB0cnVlKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFydCkgewotCQkJUGFydCBwYXJ0ID0gKFBhcnQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgb2xkUGFydE5hbWUgPSBwYXJ0LmdldE5hbWUoKTsKLQkJCQotCQkJaWYgKG9sZFBhcnROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKHJlbmFtZVBhcmVudCkgewotCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKGVsZW1lbnQsIG5ld05hbWUpOwotCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQl9Ci0JCQkKLS8vCQkJUmVuYW1lIEVsZW1lbnRzCi0JCQlyZW5hbWVYU0RFbGVtZW50KHBhcnQsIG9sZFBhcnROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydCkgewotCQkJUG9ydCBwb3J0ID0gKFBvcnQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgb2xkUG9ydE5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLQkJCQotCQkJaWYgKHJlbmFtZVBhcmVudCkgewotCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKGVsZW1lbnQsIG5ld05hbWUpOwotCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQl9Ci0KLS8vCQkJUmVuYW1lIEJpbmRpbmcKLQkJCUJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLQkJCWlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhvbGRQb3J0TmFtZSkpIHsKLQkJCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihiaW5kaW5nLCBuZXdOYW1lKTsJCi0JCQkJcmVuYW1lci5ydW4oKTsKLQkJCX0KLQkJfQotCQllbmRSZWNvcmRpbmcoKTsKLQl9Ci0JCi0JLy8gYm9vbGVhbiBpc0lucHV0T3V0cHV0IHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGUgcGFydCBpcyBhbiBJbnB1dCBvciBPdXRwdXQuCi0JLy8gU2V0IGZhbHNlIGlmIHRoZSBwYXJ0IGlzIGEgRmF1bHQuCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZVBhcnRzSGVscGVyKExpc3QgcGFydHNMaXN0LCBTdHJpbmcgb2xkU3ViU3RyaW5nLCBTdHJpbmcgbmV3U3ViU3RyaW5nLCBib29sZWFuIGlzSW5wdXRPdXRwdXQpIHsKLQkJUmVuYW1lQWN0aW9uIHJlbmFtZXI7Ci0JCQotCQlpZiAocGFydHNMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIHBJdCA9IHBhcnRzTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHBJdC5oYXNOZXh0KCkpIHsKLQkJCQlQYXJ0IHBhcnQgPSAoUGFydCkgcEl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgb2xkUGFydE5hbWUgPSBwYXJ0LmdldE5hbWUoKTsKLQkJCQkKLQkJCQlpZiAoaXNQYXJ0TmFtZUdlbmVyYXRlZChvbGRQYXJ0TmFtZSwgb2xkU3ViU3RyaW5nKSkgewotCQkJCQlTdHJpbmcgbmV3UGFydE5hbWU7Ci0JCQkJCWlmIChpc0lucHV0T3V0cHV0KSB7Ci0JCQkJCQluZXdQYXJ0TmFtZSA9IGNvbXB1dGVOZXdQYXJ0TmFtZShwYXJ0LCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQluZXdQYXJ0TmFtZSA9IGNvbXB1dGVOZXdGYXVsdFBhcnROYW1lKHBhcnQsIG9sZFN1YlN0cmluZywgbmV3U3ViU3RyaW5nKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ocGFydCwgbmV3UGFydE5hbWUpOwotCQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJCQkKLQkJCQkJLy8gUmVuYW1lIEVsZW1lbnRzCi0vLwkJCQkJcmVuYW1lWFNERWxlbWVudChwYXJ0LCBvbGRQYXJ0TmFtZSwgbmV3UGFydE5hbWUpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBSZW5hbWUgRWxlbWVudHMKLQkJCQlyZW5hbWVYU0RFbGVtZW50KHBhcnQsIG9sZFN1YlN0cmluZywgbmV3U3ViU3RyaW5nKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgUGFydCBuYW1lIHdoZW4gdGhlIEZhdWx0IG5hbWUgaXMgY2hhbmdlZC4gIE9ubHkKLQkvLyBjaGFuZ2UgdGhlIFBhcnQgbmFtZSBpZiB0aGUgcGFydCBuYW1lIGlzIGEgZ2VuZXJhdGVkIG5hbWUuCi0JLy8gQ29tcGFyZSB0byByZW5hbWVQYXJ0c0hlbHBlcigpLiAgVGhlIHJlbmFtZVBhcnRzSGVscGVyKCkgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgRmF1bHQKLQkvLyBoYXMgTk9UIGJlZW4gcmVuYW1lZCwgcmF0aGVyLCBpdCBpcyB0cmlnZ2VyZWQgYnkgc29tZSBvdGhlciBuYW1pbmcgKGV4LiBPcGVyYXRpb24KLQkvLyByZW5hbWluZykuICBJdCB3aWxsIHVwZGF0IElucHV0L091dHB1dCwgQU5EIEZhdWx0IFBhcnRzLgotCXByaXZhdGUgdm9pZCByZW5hbWVGYXVsdFBhcnRzKExpc3QgcGFydHNMaXN0LCBTdHJpbmcgYmFzZU5hbWUsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJUmVuYW1lQWN0aW9uIHJlbmFtZXI7Ci0JCQotCQlpZiAocGFydHNMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIHBJdCA9IHBhcnRzTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHBJdC5oYXNOZXh0KCkpIHsKLQkJCQlQYXJ0IHBhcnQgPSAoUGFydCkgcEl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgb2xkUGFydE5hbWUgPSBwYXJ0LmdldE5hbWUoKTsKLQkJCQkKLQkJCQlpZiAoaXNQYXJ0TmFtZUdlbmVyYXRlZChvbGRQYXJ0TmFtZSwgYmFzZU5hbWUsIG9sZFN1YlN0cmluZykpIHsKLQkJCQkJU3RyaW5nIG5ld1BhcnROYW1lOwotCQkJCQluZXdQYXJ0TmFtZSA9IGNvbXB1dGVOZXdGYXVsdFBhcnROYW1lKHBhcnQsIG9sZFN1YlN0cmluZywgbmV3U3ViU3RyaW5nKTsKLQkJCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ocGFydCwgbmV3UGFydE5hbWUpOwotCQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJCQkKLQkJCQkJLy8gUmVuYW1lIEVsZW1lbnRzCi0JCQkJCXJlbmFtZVhTREVsZW1lbnQocGFydCwgb2xkUGFydE5hbWUsIG5ld1BhcnROYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZykgewotCQlTdHJpbmcgc3RyaW5nID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDApOwkJCi0JfQotCQotLy8JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZU5ld0ZhdWx0TWVzc2FnZU5hbWUoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgb2xkU3ViU3RyaW5nLCBTdHJpbmcgbmV3U3ViU3RyaW5nKSB7Ci0vLwkJU3RyaW5nIHN0cmluZyA9IG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLS8vCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDEpOwkJCi0vLwl9Ci0JCi0JLy8gTWV0aG9kIGZvciBJbnB1dCwgT3V0cHV0LCBhbmQgRmF1bHQgUGFydHMKLQkvLyBTZWUgY29tcHV0ZU5ld0ZhdWx0UGFydE5hbWUoKSBmb3IgY29tcGFyaXNvbgotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVOZXdQYXJ0TmFtZShQYXJ0IHBhcnQsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJU3RyaW5nIHN0cmluZyA9IHBhcnQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDApOwkJCi0JfQotCQotCS8vIE1ldGhvZCBmb3IgRmF1bHQgUGFydHMKLQkvLyBUaGlzIG1ldGhvZCBiZWhhdmVzIGluIHRoZSBleGFjdCBzYW1lIHdheSBhcyBjb21wdXRlTmV3UGFydE5hbWUoKSBleGNlcHQgaXQgc3RhcnRzIHNlYXJjaGluZyBmb3IgYSBtYXRjaAotCS8vIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlcnMgd2hvIHdpc2ggdG8gcmVuYW1lIGEgZ2VuZXJhdGVkIChGYXVsdCkgcGFydAotCS8vIHdoZXJlIHRoZSBGYXVsdCBuYW1lIGhhcyBjaGFuZ2VkLiAgV2Ugc3RhcnQgb3VyIHNlYXJjaCBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBuYW1lCi0JLy8gb2YgdGhlIHBhcnQgaXMgYnVpbHQgYnkgYXBwZW5kaW5nIHRoZSBGYXVsdCBuYW1lIGFmdGVyIHRoZSBPcGVyYXRpb24gbmFtZS4KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlTmV3RmF1bHRQYXJ0TmFtZShQYXJ0IHBhcnQsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJU3RyaW5nIHN0cmluZyA9IHBhcnQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDEpOwkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VTZWN0aW9uV2l0aFN1YlN0cmluZyhTdHJpbmcgZnVsbFN0cmluZywgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZywgaW50IHN0YXJ0U2VhcmNoSW5kZXgpIHsKLQkJU3RyaW5nQnVmZmVyIGZ1bGxTQiA9IG5ldyBTdHJpbmdCdWZmZXIoZnVsbFN0cmluZyk7Ci0JCWludCBpbmRleCA9IGZ1bGxTQi5pbmRleE9mKG9sZFN1YlN0cmluZywgc3RhcnRTZWFyY2hJbmRleCk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlyZXR1cm4gZnVsbFNCLnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgb2xkU3ViU3RyaW5nLmxlbmd0aCgpLCBuZXdTdWJTdHJpbmcpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbW1vbk5hbWVHZW5lcmF0b3JDaGVjayhTdHJpbmcgdGFyZ2V0TmFtZSwgU3RyaW5nIGJhc2VOYW1lLCBTdHJpbmcgYXBwZW5kTmFtZSkgewotCQkvLyBGaXJzdCBjcml0ZXJpYSBpcyB0YXJnZXROYW1lIG11c3Qgc3RhcnQgd2l0aCB0aGUgYmFzZU5hbWUKLQkJaWYgKCF0YXJnZXROYW1lLnN0YXJ0c1dpdGgoYmFzZU5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWlmIChhcHBlbmROYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIFNlY29uZCBjcml0ZXJpYS4gIFRoZSBhcHBlbmRlZCBuYW1lIG11c3QgYmUgaW4gdGhlIHRhcmdldE5hbWUgYW5kIGJlZ2luIHJpZ2h0Ci0JCQkvLyBhZnRlciB0aGUgYmFzZU5hbWUgbG9jYXRpb24KLQkJCWlmICghdGFyZ2V0TmFtZS5zdGFydHNXaXRoKGFwcGVuZE5hbWUsIGJhc2VOYW1lLmxlbmd0aCgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQotCQkvLyBUaGlyZCBjcml0ZXJpYSAoaWYgbmVjZXNzYXJ5KS4gIElmIGJhc2VOYW1lICsgYXBwZW5kTmFtZSBpcyBzaG9ydGVyIHRoYW4gdGFyZ2V0TmFtZSwKLQkJLy8gdGhlbiB0aGVyZSBtdXN0IGJlICdleHRyYScgY2hhcmFjdGVycyBhdCB0aGUgZW5kIG9mIHRhcmdldE5hbWUuICBUaGVzZSBjaGFyYWN0ZXJzIG11c3QKLQkJLy8gbWFrZSB1cCBhbiBpbnRlZ2VyLiAgSWYgbm90LCBpdCBpcyBub3QgYSBnZW5lcmF0ZWQgc3RyaW5nLgotCQlpbnQgc3ViTGVuZ3RoID0gYmFzZU5hbWUubGVuZ3RoKCkgKyBhcHBlbmROYW1lLmxlbmd0aCgpOwotCQlpZiAodGFyZ2V0TmFtZS5sZW5ndGgoKSA+IHN1Ykxlbmd0aCkgewotCQkJLy8gV2UgaGF2ZSAnZXh0cmEnIGNoYXJhY3RlcnMKLQkJCVN0cmluZyBleHRyYXMgPSB0YXJnZXROYW1lLnN1YnN0cmluZyhzdWJMZW5ndGgpOwotCQkJCi0JCQlpZighaXNEaWdpdChleHRyYXMpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc09wZXJhdGlvbk5hbWVHZW5lcmF0ZWQoU3RyaW5nIG9wTmFtZSwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG9wTmFtZS5lcXVhbHMobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01lc3NhZ2VOYW1lR2VuZXJhdGVkKFN0cmluZyBtc2dOYW1lLCBTdHJpbmcgYmFzZU5hbWUsIFN0cmluZyBhcHBlbmROYW1lKSB7Ci0JCXJldHVybiBjb21tb25OYW1lR2VuZXJhdG9yQ2hlY2sobXNnTmFtZSwgYmFzZU5hbWUsIGFwcGVuZE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnB1dE91dHB1dE5hbWVHZW5lcmF0ZWQoU3RyaW5nIGluT3V0TmFtZSwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGluT3V0TmFtZS5lcXVhbHMobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhdWx0TmFtZUdlbmVyYXRlZChTdHJpbmcgZmF1bHROYW1lLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZmF1bHROYW1lLmVxdWFscyhuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFydE5hbWVHZW5lcmF0ZWQoU3RyaW5nIHBhcnROYW1lLCBTdHJpbmcgYmFzZU5hbWUpIHsKLQkJcmV0dXJuIGNvbW1vbk5hbWVHZW5lcmF0b3JDaGVjayhwYXJ0TmFtZSwgYmFzZU5hbWUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJ0TmFtZUdlbmVyYXRlZChTdHJpbmcgcGFydE5hbWUsIFN0cmluZyBiYXNlTmFtZSwgU3RyaW5nIGFwcGVuZE5hbWUpIHsKLQkJcmV0dXJuIGNvbW1vbk5hbWVHZW5lcmF0b3JDaGVjayhwYXJ0TmFtZSwgYmFzZU5hbWUsIGFwcGVuZE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlnaXQoU3RyaW5nIHN0cmluZykgewotCQlib29sZWFuIHJWYWx1ZSA9IHRydWU7Ci0JCWNoYXJbXSBjaGFycyA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hhcnMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGNoYXJzW2luZGV4XSkpIHsKLQkJCQlyVmFsdWUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJWYWx1ZTsKLQl9Ci0JCi0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYWlkIGluIHJlbmFtaW5nIGEgbWVzc2FnZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW5hbWVNZXNzYWdlSGVscGVyKE1lc3NhZ2UgbXNnLCBTdHJpbmcgbmV3TmFtZSkgewotCQlMaXN0IG1lc3NhZ2VSZWZzID0gZ2V0UmVmZXJlbmNpbmdNZXNzYWdlUmVmZXJlbmNlcyhtc2csIGdldEFsbE1lc3NhZ2VSZWZlcmVuY2VzKCkpOwotCQkKLQkJUmVuYW1lQWN0aW9uIHJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKG1zZywgbmV3TmFtZSk7Ci0JCXJlbmFtZXIucnVuKCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VSZWZzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZmVyZW5jZSA9IChNZXNzYWdlUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQltZXNzYWdlUmVmZXJlbmNlLnNldEVNZXNzYWdlKG1zZyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldFJlZmVyZW5jaW5nTWVzc2FnZVJlZmVyZW5jZXMoTWVzc2FnZSBtc2csIExpc3QgbWVzc2FnZVJlZnMpIHsKLQkJVmVjdG9yIHJlZmVyZW5jZXNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCVFOYW1lIG1lc3NhZ2VRTmFtZSA9IG1zZy5nZXRRTmFtZSgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VSZWZzLml0ZXJhdG9yKCk7Ci0JCQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UgPSAoTWVzc2FnZVJlZmVyZW5jZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG1lc3NhZ2VSZWZlcmVuY2UuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsICYmIG1lc3NhZ2VRTmFtZS5lcXVhbHMobWVzc2FnZVJlZmVyZW5jZS5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkpKSB7Ci0JCQkJcmVmZXJlbmNlc1ZlY3Rvci5hZGRFbGVtZW50KG1lc3NhZ2VSZWZlcmVuY2UpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVmZXJlbmNlc1ZlY3RvcjsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEFsbE1lc3NhZ2VSZWZlcmVuY2VzKCkgewotCQlpZiAobWVzc2FnZVJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJbWVzc2FnZVJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExFbGVtZW50KSBlbGVtZW50KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0JCQlMaXN0IHBvcnRUeXBlcyA9IGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpOwotCQkKLQkJCWlmIChwb3J0VHlwZXMgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIHBvcnRUeXBlSXRlcmF0b3IgPSBwb3J0VHlwZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAocG9ydFR5cGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJTGlzdCBvcGVyYXRpb25zTGlzdCA9ICgoUG9ydFR5cGUpIHBvcnRUeXBlSXRlcmF0b3IubmV4dCgpKS5nZXRFT3BlcmF0aW9ucygpOwotCQkJCQkKLQkJCQkJaWYgKG9wZXJhdGlvbnNMaXN0ICE9IG51bGwpIHsKLQkJCQkJCUl0ZXJhdG9yIG9wZXJhdGlvbnNJdGVyYXRvciA9IG9wZXJhdGlvbnNMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAob3BlcmF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCW1lc3NhZ2VSZWZlcmVuY2VzLmFkZEFsbChnZXRBbGxNZXNzYWdlUmVmZXJlbmNlcygoT3BlcmF0aW9uKSBvcGVyYXRpb25zSXRlcmF0b3IubmV4dCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtZXNzYWdlUmVmZXJlbmNlczsKLQl9Ci0JCi0JcHJpdmF0ZSBWZWN0b3IgZ2V0QWxsTWVzc2FnZVJlZmVyZW5jZXMoT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlWZWN0b3IgaW9mcyA9IG5ldyBWZWN0b3IoKTsKLQkJSXRlcmF0b3IgaXQgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWlvZnMuYWRkRWxlbWVudChpdC5uZXh0KCkpOwotCQl9Ci0JCQotCQlpZiAoaW9mcyA9PSBudWxsKQotCQkJaW9mcyA9IG5ldyBWZWN0b3IoKTsKLQkJCi0JCWlmIChvcGVyYXRpb24uZ2V0RUlucHV0KCkgIT0gbnVsbCkKLQkJCWlvZnMuYWRkRWxlbWVudChvcGVyYXRpb24uZ2V0RUlucHV0KCkpOwotCQkKLQkJaWYgKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCkKLQkJCWlvZnMuYWRkRWxlbWVudChvcGVyYXRpb24uZ2V0RU91dHB1dCgpKTsKLQkJCi0JCXJldHVybiBpb2ZzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVuYW1lWFNERWxlbWVudChQYXJ0IHBhcnQsIFN0cmluZyBvbGRYU0ROYW1lLCBTdHJpbmcgbmV3WFNETmFtZSkgewotCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gcGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsICYmIGVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCkuc3RhcnRzV2l0aChvbGRYU0ROYW1lKSkgewotCQkJcmVuYW1lRWxlbWVudERlY2xhcmF0aW9uSGVscGVyKGVsZW1lbnREZWNsYXJhdGlvbiwgb2xkWFNETmFtZSwgbmV3WFNETmFtZSk7Ci0JCQkKLQkJCS8vIEhlcmUgd2UgcmVuYW1lIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkJCS8vCi0JCQlRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShwYXJ0LmdldEVsZW1lbnROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIG5ld1hTRE5hbWUpOwotCQkJcGFydC5zZXRFbGVtZW50TmFtZShxbmFtZSk7CQkJCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGVsZW1lbnQ7Ci0JCQlpZiAoQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuZ2V0UGFyYW1ldGVyUGF0dGVybihvcGVyYXRpb24sIHRydWUpID09IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfRUxFTUVOVF9TRVFfRUxFTUVOVCkgewotCQkJCWlmIChlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvbGROYW1lKSkgewotCQkJCQlyZW5hbWVFbGVtZW50RGVjbGFyYXRpb25IZWxwZXIoZWxlbWVudERlY2xhcmF0aW9uLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJCQkJCi0JCQkJCS8vIEhlcmUgd2UgcmVuYW1lIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkJCQkJLy8KLQkJCQkJUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUocGFydC5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBuZXdOYW1lKTsKLQkJCQkJcGFydC5zZXRFbGVtZW50TmFtZShxbmFtZSk7CQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVuYW1lRWxlbWVudERlY2xhcmF0aW9uSGVscGVyKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24sIFN0cmluZyBvbGRYU0ROYW1lLCBTdHJpbmcgbmV3WFNETmFtZSkgewotCQlpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwgJiYgZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKS5zdGFydHNXaXRoKG9sZFhTRE5hbWUpKSB7Ci0JCQlTdHJpbmcgbmV3RWxlbWVudE5hbWUgPSByZXBsYWNlU2VjdGlvbldpdGhTdWJTdHJpbmcoZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKSwgb2xkWFNETmFtZSwgbmV3WFNETmFtZSwgMCk7Ci0JCQllbGVtZW50RGVjbGFyYXRpb24uc2V0TmFtZShuZXdFbGVtZW50TmFtZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9XU0RMQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvV1NETEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YThiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9XU0RMQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMUJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExRW5kUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMUludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMVBhcmFtZXRlckZvckF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFQYXJhbWV0ZXJGb3JFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMVBhcmFtZXRlckZvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLnNwZWNpYWxpemVkLlcxMUFkZHJlc3NFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuc3BlY2lhbGl6ZWQuVzExRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgV1NETEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gIHN0YXRpYyBXU0RMQWRhcHRlckZhY3RvcnkgaW5zdGFuY2U7Ci0gIAotICBwdWJsaWMgc3RhdGljIFdTRExBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBXU0RMQWRhcHRlckZhY3RvcnkoKTsKLSAgICB9ICAKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0JICBBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCi0JICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRGVmaW5pdGlvbikgewotCQkgIGFkYXB0ZXIgPSBuZXcgVzExRGVzY3JpcHRpb24oKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNlcnZpY2UpIHsKLQkJICBhZGFwdGVyID0gbmV3IFcxMVNlcnZpY2UoKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLQkJICBhZGFwdGVyID0gbmV3IFcxMUJpbmRpbmcoKTsKLQkgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJpbmRpbmdPcGVyYXRpb24pIHsKLSAgICAgICAgICBhZGFwdGVyID0gbmV3IFcxMUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCB8fAotICAgICAgICAgICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCB8fAotICAgICAgICAgICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KQotICAgICAgeyAgCi0JCSAgYWRhcHRlciA9IG5ldyBXMTFCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSgpOwotCSAgfQotCSAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUG9ydCkgewotCQkgIGFkYXB0ZXIgPSBuZXcgVzExRW5kUG9pbnQoKTsKLQkgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gICAgICAgICAgYWRhcHRlciA9IG5ldyBXMTFJbnRlcmZhY2UoKTsKLSAgICAgIH0gIAotCSAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0JCSAgYWRhcHRlciA9IG5ldyBXMTFPcGVyYXRpb24oKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2UpCi0JICB7Ci0JICAgIGludCBraW5kID0gLTE7Ci0JICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJbnB1dCkKLQkgICAgewotCSAgICAgIGtpbmQgPSBJTWVzc2FnZVJlZmVyZW5jZS5LSU5EX0lOUFVUOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE91dHB1dCkKLQkgICAgewotCSAgICAgIGtpbmQgPSBJTWVzc2FnZVJlZmVyZW5jZS5LSU5EX09VVFBVVDsKLQkgICAgfQotCSAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGYXVsdCkKLQkgICAgewotCSAgICAgIGtpbmQgPSBJTWVzc2FnZVJlZmVyZW5jZS5LSU5EX0ZBVUxUOwotCSAgICB9Ci0JICAgIGFkYXB0ZXIgPSBuZXcgVzExTWVzc2FnZVJlZmVyZW5jZShraW5kKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEltcG9ydCkgewotCQkgIGFkYXB0ZXIgPSBuZXcgVzExSW1wb3J0KCk7Ci0JICB9Ci0JICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIHsKLQkJICBhZGFwdGVyID0gbmV3IFcxMVR5cGUoKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKLQkJICBhZGFwdGVyID0gbmV3IFcxMU1lc3NhZ2UoKTsKLQkgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBhcnQpCi0gICAgICB7Ci0gICAgCSAgYWRhcHRlciA9IG5ldyBXMTFQYXJhbWV0ZXJGb3JQYXJ0KCk7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICAgIGFkYXB0ZXIgPSBuZXcgVzExUGFyYW1ldGVyRm9yRWxlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICAgIGFkYXB0ZXIgPSBuZXcgVzExUGFyYW1ldGVyRm9yQXR0cmlidXRlKCk7Ci0gICAgICB9ICAgICAgICAKLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1lc3NhZ2UgfHwgCi0gICAgICAgICAgICAgICB0YXJnZXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgLy8gbm90IHdlIG9ubHkgbmVlZCB0aGlzIGFkYXB0ZXIgdG8gc2VydmUgYXMgYW4gJ290aGVyVGhpbmdzVG9MaXN0ZW5UbycgYWRhcHRlcgotICAgICAgICAvLyBmb3IgdXNlIGJ5IHRoZSBXMTFNZXNzYWdlUmVmZXJlbmNlIHdoZW4gY29tcHV0aW5nIGEgcGFyYW1ldGVyIGxpc3QKLSAgICAgICAgYWRhcHRlciA9IG5ldyBXU0RMQmFzZUFkYXB0ZXIoKTsKLSAgICAgIH0gIAotICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU09BUEFkZHJlc3MgfHwKLSAgICAgICAgICAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKQotICAgICAgewotICAgICAgICAvLyBUT0RPLi4gd2UgbmVlZCB0byBlbmFibGUgdGhlIGZhY3RvcnkgdG8gZGVsZWdhdGUgdG8gZXh0ZW5zaW9uIGxhbmd1YWdlIGFkYXB0ZXIgZmFjdG9yaWVzCi0gICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBubyByZWZlcmVuY2VzIHRvIFNPQVAgb3IgSFRUUCBzdHVmZiBmcm9tIHdpdGhpbiB0aGlzIGNsYXNzCi0gICAgICAgIC8vCi0gICAgICAgIGFkYXB0ZXIgPSBuZXcgVzExQWRkcmVzc0V4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOyAgICAgICAgCi0gICAgICB9ICAgICAgICAgCi0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgYWRhcHRlciA9IG5ldyBXMTFFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0gIAotCSAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkgIHsKLQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJOTyBBREFQVEVSIENSRUFURUQgRk9SICIgKyB0YXJnZXQpOyAgICAvLyROT04tTkxTLTEkCi0JICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLQkgIH0KLQotCSAgcmV0dXJuIGFkYXB0ZXI7CQkgIAotICB9Ci0gIAotICBwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQpCi0gIHsKLSAgICByZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9XU0RMQmFzZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvV1NETEJhc2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDYxY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9XU0RMQmFzZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExUmVuYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQVNET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUFTRE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQmFzZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElBU0RPYmplY3QsIElBY3Rpb25Qcm92aWRlciB7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBXU0RMQmFzZUFkYXB0ZXIgb3duZXI7Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQVNET2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICBpZiAoIWxpc3RlbmVyTGlzdC5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgICAgewotCQkgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgICAgfSAgCi0JfQotCi0JcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBU0RPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZUFkYXB0ZXJMaXN0KExpc3Qgbm90aWZpZXJMaXN0LCBMaXN0IGFkYXB0ZXJMaXN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG5vdGlmaWVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspICAgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTm90aWZpZXIpCi0gICAgICAgICAgICB7ICAKLQkJCU5vdGlmaWVyIGNvbXBvbmVudCA9IChOb3RpZmllcilvOyAgICAgIAotCQkJQWRhcHRlciBhZGFwdGVyID0gV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyLmdldEluc3RhbmNlKCkuYWRhcHQoY29tcG9uZW50KTsKLQkJCWFkYXB0ZXJMaXN0LmFkZChhZGFwdGVyKTsKLQkJCQotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBXU0RMQmFzZUFkYXB0ZXIpIHsKLQkJCQkoKFdTRExCYXNlQWRhcHRlcikgYWRhcHRlcikuc2V0T3duZXIodGhpcyk7Ci0JCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicG9wdWxhdGVBZGFwdGVyTGlzdEVycm9yIiArIG8pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9ICAKLQkJfQotCX0KLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlci5nZXRJbnN0YW5jZSgpLmFkYXB0KG5vdGlmaWVyKTsKLQotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlciAmJiAoKFdTRExCYXNlQWRhcHRlcikgYWRhcHRlcikub3duZXIgPT0gbnVsbCkgewotCQkJKChXU0RMQmFzZUFkYXB0ZXIpIGFkYXB0ZXIpLnNldE93bmVyKHRoaXMpOwotCQl9Ci0JCQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T3duZXIoV1NETEJhc2VBZGFwdGVyIG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBXU0RMQWRhcHRlckZhY3RvcnlIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMQWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmdbXSBhY3Rpb25JRHMgPSBuZXcgU3RyaW5nWzBdOwotCQkKLQkJcmV0dXJuIGFjdGlvbklEczsKLQl9Ci0gICAgCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKQotCXsKLQkgIHN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgICAgIHRyeQotICAgICAgewotCSAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgbnVsbCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgLy8gVE9ETy4uLiBleGNlcHRpb24gc2hvdWxkIG5ldmVyIGhhcHBlbiBoZXJlLi4gYnV0IHRoZXkgZG8KLSAgICAgICAgLy8gZHVtcGluZyB0aGUgc3RhY2sgdG8gdGhlIGNvbnNvbGUgdW50aWwgd2UgdHJhY2sgdGhlc2UgZG93bgotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoT2JqZWN0IGNoYW5nZWRPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLQl7Ci0JICBMaXN0IGNsb25lZExpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIGNsb25lZExpc3RlbmVyTGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLQkgIGZvciAoSXRlcmF0b3IgaSA9IGNsb25lZExpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCSAgewotCSAgICBJQVNET2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIgPSAoSUFTRE9iamVjdExpc3RlbmVyKWkubmV4dCgpOwotCSAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgcHJvcGVydHkpOwotCSAgfSAgICAgIAotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRTZXROYW1lQ29tbWFuZChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IFcxMVJlbmFtZUNvbW1hbmQodGhpcywgbmV3TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0JCXRyeQl7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmICh3aW5kb3cgIT0gbnVsbCkJewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJZWRpdG9yUGFydCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB7Ci0JCQkJZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIHRhcmdldCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCQkJfQotCQkJaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxsQmFja0NoZWNrSXNSZWFkT25seSgpOwotCQkJfQotCi0JCQlEZWZpbml0aW9uIGVkaXRvckRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgZWRpdG9yUGFydC5nZXRBZGFwdGVyKERlZmluaXRpb24uY2xhc3MpOwotCQkJaWYgKGRlZmluaXRpb24gIT0gbnVsbCAmJiBkZWZpbml0aW9uID09IGVkaXRvckRlZmluaXRpb24pIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsbEJhY2tDaGVja0lzUmVhZE9ubHkoKTsKLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCi0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZmFsbEJhY2tDaGVja0lzUmVhZE9ubHkoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgewotCQkJZWxlbWVudCA9ICgoV1NETEVsZW1lbnQpIHRhcmdldCkuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0JCQllbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0KS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUgfHwgZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotICAKLSAgcHVibGljIE9iamVjdCBnZXRPd25lcigpIHsKLSAgICByZXR1cm4gb3duZXI7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExQWRkUGFydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9hY3Rpb25zL1cxMUFkZFBhcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzYTI0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExQWRkUGFydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLkludGVybmFsV1NETE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExUGFyYW1ldGVyRm9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuSUFTREFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMuUGFyYW1ldGVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRNZXNzYWdlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyOwotCi1wdWJsaWMgY2xhc3MgVzExQWRkUGFydEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTREFkZFBhcnRBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFcxMUFkZFBhcnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkJewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BBUlQpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihXU0RMRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvcGFydF9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotCQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmID0gbnVsbDsKLQkJCUlNZXNzYWdlIGlNZXNzYWdlID0gbnVsbDsKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0JCQkKLQkJCWlmIChvIGluc3RhbmNlb2YgVzExTWVzc2FnZVJlZmVyZW5jZSkgewotCQkJCW1lc3NhZ2VSZWYgPSAoTWVzc2FnZVJlZmVyZW5jZSkgKChXMTFNZXNzYWdlUmVmZXJlbmNlKSBvKS5nZXRUYXJnZXQoKTsKLQkJCQltZXNzYWdlID0gbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpOwotCQkJfQotCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIFcxMVBhcmFtZXRlckZvclBhcnQpIHsKLQkJCQlXMTFQYXJhbWV0ZXJGb3JQYXJ0IHBhcmFtID0gKFcxMVBhcmFtZXRlckZvclBhcnQpIG87Ci0JCQkJaWYgKHBhcmFtLmdldE93bmVyKCkgaW5zdGFuY2VvZiBJTWVzc2FnZSkgewotCQkJCQlpTWVzc2FnZSA9IChJTWVzc2FnZSkgcGFyYW0uZ2V0T3duZXIoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocGFyYW0uZ2V0T3duZXIoKSBpbnN0YW5jZW9mIFcxMU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkJCQkJbWVzc2FnZVJlZiA9IChNZXNzYWdlUmVmZXJlbmNlKSAoKFcxMU1lc3NhZ2VSZWZlcmVuY2UpIHBhcmFtLmdldE93bmVyKCkpLmdldFRhcmdldCgpOwotCQkJCQltZXNzYWdlID0gbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJCVBhcnQgcGFydCA9IChQYXJ0KSBwYXJhbS5nZXRUYXJnZXQoKTsKLQkJCQkJbWVzc2FnZSA9IChNZXNzYWdlKSBwYXJ0LmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSU1lc3NhZ2UpIHsKLQkJCQlpTWVzc2FnZSA9IChJTWVzc2FnZSkgbzsKLQkJCX0KLQkJCQotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCAmJiBpTWVzc2FnZSA9PSBudWxsICYmIG1lc3NhZ2VSZWYgIT0gbnVsbCkgewotCQkJCUludGVybmFsV1NETE11bHRpUGFnZUVkaXRvciBlZGl0b3IgPSAoSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgKChXMTFEZXNjcmlwdGlvbikgZWRpdG9yLmdldE1vZGVsKCkpLmdldFRhcmdldCgpOwotCQkJCVN0cmluZyBtZXNzYWdlTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUoZGVmaW5pdGlvbiwgIk5ld01lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUFkZE1lc3NhZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbiwgbWVzc2FnZU5hbWUsIGZhbHNlKTsKLQkJCQljb21tYW5kLnJ1bigpOwotCQkJCW1lc3NhZ2UgPSAoTWVzc2FnZSkgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQkJCW1lc3NhZ2VSZWYuc2V0RU1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCQlpTWVzc2FnZSA9IChJTWVzc2FnZSkgV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyLmdldEluc3RhbmNlKCkuYWRhcHQobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChpTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJQ29tbWFuZCBjb21tYW5kID0gaU1lc3NhZ2UuZ2V0QWRkUGFydENvbW1hbmQoKTsKLQkJCSAgICBDb21tYW5kU3RhY2sgc3RhY2sgPSAoQ29tbWFuZFN0YWNrKSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOwotCQkJICAgIHN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkgICAgCi0JCQkgICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBJQVNEQWRkQ29tbWFuZCkgewotCQkJICAgIAlPYmplY3QgZWxlbWVudCA9ICgoSUFTREFkZENvbW1hbmQpIGNvbW1hbmQpLmdldE5ld2x5QWRkZWRDb21wb25lbnQoKTsKLQkJCSAgICAJc2VsZWN0QW5kRGlyZWN0RWRpdChlbGVtZW50KTsKLQkJCSAgICB9Ci0JCQl9Ci0JCX0gIAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb0RpcmVjdEVkaXQoRWRpdFBhcnQgZXApIHsKLQkJaWYgKGVwIGluc3RhbmNlb2YgUGFyYW1ldGVyRWRpdFBhcnQpIHsKLQkJCSgoUGFyYW1ldGVyRWRpdFBhcnQpIGVwKS5wZXJmb3JtRGlyZWN0RWRpdChudWxsKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExT3BlbkltcG9ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9hY3Rpb25zL1cxMU9wZW5JbXBvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0MjhiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExT3BlbkltcG9ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLQotcHVibGljIGNsYXNzIFcxMU9wZW5JbXBvcnRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RPcGVuSW1wb3J0QWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgVzExT3BlbkltcG9ydEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9PUEVOX0lNUE9SVCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCAmJiBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCkgaW5zdGFuY2VvZiBXMTFJbXBvcnQpIHsKLQkJCUltcG9ydCB0aGVJbXBvcnQgPSBnZXRXU0RMSW1wb3J0KChXMTFJbXBvcnQpIGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKSk7Ci0JCQkKLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IHRoZUltcG9ydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0JCQlvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5PcGVuT25TZWxlY3Rpb25IZWxwZXIoZGVmaW5pdGlvbik7Ci0JCSAgICBoZWxwZXIub3BlbkVkaXRvcigob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIHRoZUltcG9ydCk7Ci0JCX0KLQl9Ci0JCi0JICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkgewotCQkgIGJvb2xlYW4gZW5hYmxlZCA9IHN1cGVyLmNhbGN1bGF0ZUVuYWJsZWQoKTsKLQkJICBpZiAoZW5hYmxlZCkgewotCQkJICBpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCAmJiBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCkgaW5zdGFuY2VvZiBXMTFJbXBvcnQpIHsKLQkJCQkJSW1wb3J0IHRoZUltcG9ydCA9IGdldFdTRExJbXBvcnQoKFcxMUltcG9ydCkgZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApKTsKLQkJCQkJCi0JCQkJCWlmICh0aGVJbXBvcnQgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gdGhlSW1wb3J0LmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQotCQkJCQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24udHJpbSgpLmVxdWFscygiIikpCi0JCQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkgIH0KLQkJICB9Ci0JCSAgCi0JCSAgcmV0dXJuIGVuYWJsZWQ7Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgSW1wb3J0IGdldFdTRExJbXBvcnQoVzExSW1wb3J0IHcxMUltcG9ydCkgewotCQkgIHJldHVybiAoSW1wb3J0KSAoKFcxMUltcG9ydCkgdzExSW1wb3J0KS5nZXRUYXJnZXQoKTsKLQkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYWN0aW9ucy9XMTFTZXRFeGlzdGluZ0VsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYWN0aW9ucy9XMTFTZXRFeGlzdGluZ0VsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2OGZmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExU2V0RXhpc3RpbmdFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgVzExU2V0RXhpc3RpbmdFbGVtZW50QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEU2V0RXhpc3RpbmdFbGVtZW50QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBXU0RMQmFzZUFkYXB0ZXIgd3NkbEJhc2VBZGFwdGVyOwotCQotCXB1YmxpYyBXMTFTZXRFeGlzdGluZ0VsZW1lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fRVhJU1RJTkdfRUxFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLS8vCQlzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvbWVzc2FnZV9vYmouZ2lmIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh3c2RsQmFzZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElQYXJhbWV0ZXIgJiYgbyBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikgewotCQkJCQl3c2RsQmFzZUFkYXB0ZXIgPSAoV1NETEJhc2VBZGFwdGVyKSBvOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVmTWFuYWdlciA9IFJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyLmdldFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcih3c2RsQmFzZUFkYXB0ZXIpOwotCQlpZiAod3NkbEJhc2VBZGFwdGVyICE9IG51bGwgJiYgcmVmTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlJQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IHJlZk1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0JCQlpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkJCQlyZWZNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZSh3c2RsQmFzZUFkYXB0ZXIuZ2V0VGFyZ2V0KCksIHNwZWMpOwotCQkJfQotCQl9Ci0JCQotCQl3c2RsQmFzZUFkYXB0ZXIgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExU2V0RXhpc3RpbmdNZXNzYWdlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExU2V0RXhpc3RpbmdNZXNzYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzY1ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9hY3Rpb25zL1cxMVNldEV4aXN0aW5nTWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5SZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLQotcHVibGljIGNsYXNzIFcxMVNldEV4aXN0aW5nTWVzc2FnZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTRFNldE1lc3NhZ2VJbnRlcmZhY2VBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2U7Ci0KLQkKLQlwdWJsaWMgVzExU2V0RXhpc3RpbmdNZXNzYWdlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0VYSVNUSU5HX01FU1NBR0UpOyAvLyROT04tTkxTLTEkCi0vLwkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL21lc3NhZ2Vfb2JqLmdpZiIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAobWVzc2FnZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkgewotCQkJCU9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkJCQkJbWVzc2FnZVJlZmVyZW5jZSA9IChJTWVzc2FnZVJlZmVyZW5jZSkgbzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHJlZk1hbmFnZXIgPSBSZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlci5nZXRNZXNzYWdlUmVmZXJlbmNlRWRpdE1hbmFnZXIobWVzc2FnZVJlZmVyZW5jZSk7Ci0JCWlmIChtZXNzYWdlUmVmZXJlbmNlICE9IG51bGwgJiYgcmVmTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlJQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IHJlZk1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0JCQlpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkJCQlyZWZNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShtZXNzYWdlUmVmZXJlbmNlLCBzcGVjKTsKLQkJCX0KLQkJfQotCQkKLQkJbWVzc2FnZVJlZmVyZW5jZSA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYWN0aW9ucy9XMTFTZXRFeGlzdGluZ1R5cGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYWN0aW9ucy9XMTFTZXRFeGlzdGluZ1R5cGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4MmI0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExU2V0RXhpc3RpbmdUeXBlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgVzExU2V0RXhpc3RpbmdUeXBlQWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEU2V0RXhpc3RpbmdUeXBlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBXU0RMQmFzZUFkYXB0ZXIgd3NkbEJhc2VBZGFwdGVyOwotCQotCXB1YmxpYyBXMTFTZXRFeGlzdGluZ1R5cGVBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fRVhJU1RJTkdfVFlQRSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvbWVzc2FnZV9vYmouZ2lmIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh3c2RsQmFzZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElQYXJhbWV0ZXIgJiYgbyBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikgewotCQkJCQl3c2RsQmFzZUFkYXB0ZXIgPSAoV1NETEJhc2VBZGFwdGVyKSBvOwotCQkJCX0KLQkJCX0KLQkJfQotCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHJlZk1hbmFnZXIgPSBSZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlci5nZXRYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIod3NkbEJhc2VBZGFwdGVyKTsKLQkJaWYgKHdzZGxCYXNlQWRhcHRlciAhPSBudWxsICYmIHJlZk1hbmFnZXIgIT0gbnVsbCkgewotCQkJSUNvbXBvbmVudERpYWxvZyBkaWFsb2cgPSByZWZNYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotCQkJaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0JCQkJcmVmTWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2Uod3NkbEJhc2VBZGFwdGVyLmdldFRhcmdldCgpLCBzcGVjKTsKLQkJCX0KLQkJfQotCQkKLQkJd3NkbEJhc2VBZGFwdGVyID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9hY3Rpb25zL1cxMVNldE5ld0VsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYWN0aW9ucy9XMTFTZXROZXdFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODJkYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9hY3Rpb25zL1cxMVNldE5ld0VsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBXMTFTZXROZXdFbGVtZW50QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEU2V0TmV3RWxlbWVudEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgV1NETEJhc2VBZGFwdGVyIHdzZGxCYXNlQWRhcHRlcjsKLQkKLQlwdWJsaWMgVzExU2V0TmV3RWxlbWVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVdfRUxFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLS8vCQlzZXRJbWFnZURlc2NyaXB0b3IoV1NETEVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3NlcnZpY2Vfb2JqLmdpZiIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewkJCi0JCWlmICh3c2RsQmFzZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElQYXJhbWV0ZXIgJiYgbyBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikgewotCQkJCQl3c2RsQmFzZUFkYXB0ZXIgPSAoV1NETEJhc2VBZGFwdGVyKSBvOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVmTWFuYWdlciA9IFJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyLmdldFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcih3c2RsQmFzZUFkYXB0ZXIpOwotICAgICAgICBpZiAod3NkbEJhc2VBZGFwdGVyICE9IG51bGwgJiYgcmVmTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IHJlZk1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0JCQlpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkJCQlyZWZNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZSh3c2RsQmFzZUFkYXB0ZXIsIHNwZWMpOwotCQkJfQotCQl9Ci0JCQotCQl3c2RsQmFzZUFkYXB0ZXIgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExU2V0TmV3TWVzc2FnZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9hY3Rpb25zL1cxMVNldE5ld01lc3NhZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmOTE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExU2V0TmV3TWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5SZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLQotcHVibGljIGNsYXNzIFcxMVNldE5ld01lc3NhZ2VBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RTZXROZXdNZXNzYWdlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlOwotCQotCXB1YmxpYyBXMTFTZXROZXdNZXNzYWdlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX05FV19NRVNTQUdFKTsgLy8kTk9OLU5MUy0xJAotLy8JCXNldEltYWdlRGVzY3JpcHRvcihXU0RMRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvc2VydmljZV9vYmouZ2lmIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJTWVzc2FnZVJlZmVyZW5jZShJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlKSB7Ci0JCXRoaXMubWVzc2FnZVJlZmVyZW5jZSA9IG1lc3NhZ2VSZWZlcmVuY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQotCQlpZiAobWVzc2FnZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkgewotCQkJCU9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkJCQkJbWVzc2FnZVJlZmVyZW5jZSA9IChJTWVzc2FnZVJlZmVyZW5jZSkgbzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHJlZk1hbmFnZXIgPSBSZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlci5nZXRNZXNzYWdlUmVmZXJlbmNlRWRpdE1hbmFnZXIobWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgICAgIGlmIChtZXNzYWdlUmVmZXJlbmNlICE9IG51bGwgJiYgcmVmTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlJQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IHJlZk1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0JCQlpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkJCQlyZWZNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShtZXNzYWdlUmVmZXJlbmNlLCBzcGVjKTsKLQkJCX0KLQkJfQotCQkKLQkJbWVzc2FnZVJlZmVyZW5jZSA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYWN0aW9ucy9XMTFTZXROZXdUeXBlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2FjdGlvbnMvVzExU2V0TmV3VHlwZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDBlNmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYWN0aW9ucy9XMTFTZXROZXdUeXBlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQuV1NETFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFcxMVNldE5ld1R5cGVBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RTZXROZXdUeXBlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBXU0RMQmFzZUFkYXB0ZXIgd3NkbEJhc2VBZGFwdGVyOwotCQotCXB1YmxpYyBXMTFTZXROZXdUeXBlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX05FV19UWVBFKTsgLy8kTk9OLU5MUy0xJAotLy8JCXNldEltYWdlRGVzY3JpcHRvcihXU0RMRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvc2VydmljZV9vYmouZ2lmIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7CQkKLQkJaWYgKHdzZGxCYXNlQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkgewotCQkJCU9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSVBhcmFtZXRlciAmJiBvIGluc3RhbmNlb2YgV1NETEJhc2VBZGFwdGVyKSB7Ci0JCQkJCXdzZGxCYXNlQWRhcHRlciA9IChXU0RMQmFzZUFkYXB0ZXIpIG87Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZWZNYW5hZ2VyID0gUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXIuZ2V0WFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKHdzZGxCYXNlQWRhcHRlcik7Ci0JCWlmICh3c2RsQmFzZUFkYXB0ZXIgIT0gbnVsbCAmJiByZWZNYW5hZ2VyICE9IG51bGwpIHsKLQkJCUlDb21wb25lbnREaWFsb2cgZGlhbG9nID0gcmVmTWFuYWdlci5nZXROZXdEaWFsb2coKTsKLQkJCWlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotCQkJCXJlZk1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHdzZGxCYXNlQWRhcHRlciwgc3BlYyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdzZGxCYXNlQWRhcHRlciA9IG51bGw7Ci0JfQotICAgIAotICAgIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAocGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcikgcGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICAgICAgV1NETEVsZW1lbnQgZWxlbWVudCA9IChXU0RMRWxlbWVudCkgd3NkbEJhc2VBZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgIElEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChJRGVzY3JpcHRpb24pIFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlci5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdTRExYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIoKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpLCBudWxsLCBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMUJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5MzQ5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMUJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMURlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExR2VuZXJhdGVCaW5kaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFTZXRJbnRlcmZhY2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTRERlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RHZW5lcmF0ZUJpbmRpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEU2V0RXhpc3RpbmdJbnRlcmZhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEU2V0TmV3SW50ZXJmYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQmluZGluZ0NvbnRlbnRQbGFjZUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMQWRhcHRlckZhY3RvcnlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBXMTFCaW5kaW5nIGV4dGVuZHMgV1NETEJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUJpbmRpbmcgewotCi0JcHVibGljIElJbnRlcmZhY2UgZ2V0SW50ZXJmYWNlKCkgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9ICgoQmluZGluZykgdGFyZ2V0KS5nZXRFUG9ydFR5cGUoKTsKLSAgICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgICAgIHsgIAotCSAgICAgIHJldHVybiAoSUludGVyZmFjZSkgY3JlYXRlQWRhcHRlcihwb3J0VHlwZSk7Ci0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0gICAgCi0gICAgcHVibGljIExpc3QgZ2V0QmluZGluZ0NvbnRlbnRMaXN0KCkKLSAgICB7Ci0gICAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICBMaXN0IGJpbmRpbmdPcGVyYXRpb25zID0gY29weUxpc3QoKChCaW5kaW5nKXRhcmdldCkuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkpOyAKLSAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IGNvcHlMaXN0KCgoQmluZGluZyl0YXJnZXQpLmdldEVQb3J0VHlwZSgpLmdldEVPcGVyYXRpb25zKCkpOwotICAgICAgCi0gICAgICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCBwbGFjZWhvbGRlcnMgZm9yIE9wZXJhdGlvbnMKLQkgIExpc3QgdG9BZGFwdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLQkgIEl0ZXJhdG9yIGJpbmRpbmdPcEl0ID0gYmluZGluZ09wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLQkgIHdoaWxlIChiaW5kaW5nT3BJdC5oYXNOZXh0KCkpIHsKLQkJICBCaW5kaW5nT3BlcmF0aW9uIGl0ZW0gPSAoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ09wSXQubmV4dCgpOwotCQkgIG9wZXJhdGlvbnMucmVtb3ZlKGl0ZW0uZ2V0RU9wZXJhdGlvbigpKTsKLQkgIH0KLQkgIAotICAgICAgSXRlcmF0b3Igb3BlcmF0aW9uc0l0ID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKG9wZXJhdGlvbnNJdC5oYXNOZXh0KCkpIHsKLSAgICAJICBPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zSXQubmV4dCgpOwotICAgIAkgIHRvQWRhcHRMaXN0LmFkZChvcCk7Ci0gICAgCSAgdG9BZGFwdExpc3QuYWRkKG9wLmdldEVJbnB1dCgpKTsKLSAgICAJICB0b0FkYXB0TGlzdC5hZGQob3AuZ2V0RU91dHB1dCgpKTsKLSAgICAJICB0b0FkYXB0TGlzdC5hZGRBbGwob3AuZ2V0RUZhdWx0cygpKTsKLSAgICAgIH0KLQotICAgICAgSXRlcmF0b3IgaXQgPSB0b0FkYXB0TGlzdC5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOyAKLSAgICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICAgIHsgIAotICAgIAkgICAgT2JqZWN0IGFkYXB0ZWQgPSBXU0RMQWRhcHRlckZhY3RvcnlIZWxwZXIuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoTm90aWZpZXIpbyk7Ci0gICAgCSAgICBCaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyIHBsYWNlSG9sZGVyID0gbmV3IEJpbmRpbmdDb250ZW50UGxhY2VIb2xkZXIoYWRhcHRlZCk7Ci0gICAgCSAgICBhZGFwdGVyTGlzdC5hZGQocGxhY2VIb2xkZXIpOwotICAgICAgICAgIH0gIAotICAgICAgfQotICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKEJpbmRpbmcpdGFyZ2V0KS5nZXRFQmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgICAvLyBIYW5kbGUgSW5wdXQKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkgPT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0RUlucHV0KCkgIT0gbnVsbCkgewotICAgICAgICAJLy8gTmVlZCBhIHBsYWNlaG9sZGVyCi0gICAgICAgIAlPYmplY3QgYWRhcHRlZE9iamVjdCA9IGNyZWF0ZUFkYXB0ZXIob3BlcmF0aW9uLmdldEVJbnB1dCgpKTsKLSAgICAgICAgCUJpbmRpbmdDb250ZW50UGxhY2VIb2xkZXIgdGVtcCA9IG5ldyBCaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyKGFkYXB0ZWRPYmplY3QpOwotICAgICAgICAJYWRhcHRlckxpc3QuYWRkKHRlbXApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBIYW5kbGUgT3V0cHV0Ci0gICAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpID09IG51bGwgJiYgb3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgIAkvLyBOZWVkIGEgcGxhY2Vob2xkZXIKLSAgICAgICAgCU9iamVjdCBhZGFwdGVkT2JqZWN0ID0gY3JlYXRlQWRhcHRlcihvcGVyYXRpb24uZ2V0RU91dHB1dCgpKTsKLSAgICAgICAgCUJpbmRpbmdDb250ZW50UGxhY2VIb2xkZXIgdGVtcCA9IG5ldyBCaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyKGFkYXB0ZWRPYmplY3QpOwotICAgICAgICAJYWRhcHRlckxpc3QuYWRkKHRlbXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIEZhdWx0cwotICAgICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICBMaXN0IGZhdWx0cyA9IGNvcHlMaXN0KG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkpOwotICAgICAgICBMaXN0IGJpbmRpbmdGYXVsdHMgPSBjb3B5TGlzdChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkpOwotICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYmluZGluZ0ZhdWx0cy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgCUJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBiaW5kaW5nRmF1bHRzLmdldChpbmRleCk7Ci0gICAgICAgIAlsaXN0LmFkZChiaW5kaW5nRmF1bHQpOwotICAgICAgICAJCi0gICAgICAgIAlmYXVsdHMucmVtb3ZlKGJpbmRpbmdGYXVsdC5nZXRFRmF1bHQoKSk7ICAgICAgICAJCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIExlZnQgb3ZlciBmYXVsdHMgbmVlZCBwbGFjZWhvbGRlcnMKLSAgICAgICAgSXRlcmF0b3IgcmVtYW5pbmdGYXVsdHMgPSBmYXVsdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHJlbWFuaW5nRmF1bHRzLmhhc05leHQoKSkgewotICAgICAgICAJT2JqZWN0IGFkYXB0ZWRPYmplY3QgPSBjcmVhdGVBZGFwdGVyKChGYXVsdCkgcmVtYW5pbmdGYXVsdHMubmV4dCgpKTsKLSAgICAgICAgCUJpbmRpbmdDb250ZW50UGxhY2VIb2xkZXIgdGVtcCA9IG5ldyBCaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyKGFkYXB0ZWRPYmplY3QpOwotICAgICAgICAJYWRhcHRlckxpc3QuYWRkKHRlbXApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3QgY29weUxpc3QoTGlzdCBvcmlnTGlzdCkgewotICAgIAlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCUl0ZXJhdG9yIGl0ID0gb3JpZ0xpc3QuaXRlcmF0b3IoKTsKLSAgICAJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgIAkJbmV3TGlzdC5hZGQoaXQubmV4dCgpKTsKLSAgICAJfQotICAgIAkKLSAgICAJcmV0dXJuIG5ld0xpc3Q7Ci0gICAgfQotCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJsaXR5T2JqZWN0cygpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoKEJpbmRpbmcpIHRhcmdldCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLQkJSXRlcmF0b3IgaXQgPSAoKEJpbmRpbmcpIHRhcmdldCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBTT0FQQmluZGluZykgewotCQkJCXJldHVybiAiU09BUCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBIVFRQQmluZGluZykgewotCQkJCXJldHVybiAiSFRUUCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJRGVzY3JpcHRpb24gZ2V0T3duZXJEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChJRGVzY3JpcHRpb24pIG93bmVyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgTGlzdCBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgYWN0aW9uSURzLmFkZChBU0RHZW5lcmF0ZUJpbmRpbmdBY3Rpb24uSUQpOwotICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfUE9SVFRZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgYWN0aW9uSURzLmFkZChBU0RTZXROZXdJbnRlcmZhY2VBY3Rpb24uSUQpOwotICAgIGFjdGlvbklEcy5hZGQoQVNEU2V0RXhpc3RpbmdJbnRlcmZhY2VBY3Rpb24uSUQpOwotICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChBU0REZWxldGVBY3Rpb24uSUQpOwotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgIGFjdGlvbklEcy5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldFNldEludGVyZmFjZUNvbW1hbmQoSUludGVyZmFjZSBuZXdJbnRlcmZhY2UpIHsKLQkJVzExSW50ZXJmYWNlIHcxMUludGVyZmFjZSA9IChXMTFJbnRlcmZhY2UpIG5ld0ludGVyZmFjZTsKLQkJcmV0dXJuIG5ldyBXMTFTZXRJbnRlcmZhY2VDb21tYW5kKChCaW5kaW5nKSB0YXJnZXQsIChQb3J0VHlwZSkgdzExSW50ZXJmYWNlLmdldFRhcmdldCgpKTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgZ2V0R2VuZXJhdGVCaW5kaW5nQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBXMTFHZW5lcmF0ZUJpbmRpbmdDb21tYW5kKChCaW5kaW5nKSB0aGlzLmdldFRhcmdldCgpKTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBXMTFEZWxldGVDb21tYW5kKHRoaXMpOwotCX0KLQotICAgIAotICAgIHByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihOb2RlIG5vZGUpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7ICAgICAgCi0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpOyAgICAgIAotICAgICAgICByZXR1cm4gcmVnaXN0cnkuZ2V0TGFiZWxQcm92aWRlcihuYW1lc3BhY2UpOwotICAgICAgfSAgICAgICAgCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBJbWFnZSBpbWFnZSA9IG51bGw7Ci0gICAgTGlzdCBsaXN0ID0gKChCaW5kaW5nKSB0YXJnZXQpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgeyAgCi0gICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbGlzdC5nZXQoMCk7Ci0gICAgICAgRWxlbWVudCBlbGVtZW50ID0gZWUuZ2V0RWxlbWVudCgpOwotICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgeyAgCi0gICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gZ2V0TGFiZWxQcm92aWRlcihlbGVtZW50KTsKLSAgICAgICAgIGlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgICB7Ci0gICAgICAgICAgIGltYWdlPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICB9ICAgICAgICAKLSAgICBpZiAoaW1hZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYmluZGluZ19vYmouZ2lmIik7ICAgICAgICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGltYWdlOwotICAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gImJpbmRpbmciOwotICB9Ci0gIAotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICBJVHJlZUVsZW1lbnRbXSByZXN1bHQgPSBuZXcgSVRyZWVFbGVtZW50W2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkgIGlmIChnZXRCaW5kaW5nT3BlcmF0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJICByZXR1cm4gdHJ1ZTsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpIHsKLQkgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nT3BlcmF0aW9ucygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdCgoKEJpbmRpbmcpdGFyZ2V0KS5nZXRFQmluZGluZ09wZXJhdGlvbnMoKSwgbGlzdCk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdPcGVyYXRpb25zKGJvb2xlYW4gY3JlYXRlTWlzc2luZ09wZXJhdGlvbnMsIGJvb2xlYW4gc2hvd0V4dHJhT3BlcmF0aW9ucykKLSAgewotICAgIHJldHVybiBnZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZWYxNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQmluZGluZ01lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBXMTFCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSBleHRlbmRzIFdTRExCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSwgSVRyZWVFbGVtZW50Ci17Ci0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gSVRyZWVFbGVtZW50LkVNUFRZX0xJU1Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCSAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpIHsKLQkgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgeyAgIAotICAgIFN0cmluZyBpbWFnZU5hbWUgPSBudWxsOwotICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpCi0gICAgewotICAgICAgaW1hZ2VOYW1lID0gImljb25zL2lucHV0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpCi0gICAgewotICAgICAgaW1hZ2VOYW1lID0gImljb25zL291dHB1dF9vYmouZ2lmIjsgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIH0gCi0gICAgZWxzZSAvL2lmICh0YXJnZXQgaW5zdGFuY2VvZiBCaW5kaW5nRmF1bHQpCi0gICAgewotICAgICAgaW1hZ2VOYW1lID0gImljb25zL2ZhdWx0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZU5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0JICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotCSAgewotCQkgIG5hbWUgPSAoKEJpbmRpbmdJbnB1dCkgdGFyZ2V0KS5nZXROYW1lKCk7Ci0JICB9Ci0JICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KQotCSAgewotCQkgIG5hbWUgPSAoKEJpbmRpbmdPdXRwdXQpIHRhcmdldCkuZ2V0TmFtZSgpOwotCSAgfSAKLQkgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLQkgIHsKLQkJICBuYW1lID0gKChCaW5kaW5nRmF1bHQpIHRhcmdldCkuZ2V0TmFtZSgpOwotCSAgfQotCSAgCi0JICBpZiAobmFtZSA9PSBudWxsKSB7Ci0JCSAgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JICB9Ci0KLQkgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotCSAgU3RyaW5nIHRleHQgPSAiIjsKLQkgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpCi0JICB7Ci0JCSAgdGV4dCA9ICJiaW5kaW5nIGlucHV0IjsKLQkgIH0KLQkgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpCi0JICB7Ci0JCSAgdGV4dCA9ICJiaW5kaW5nIG91dHB1dCI7Ci0JICB9IAotCSAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KQotCSAgewotCQkgIHRleHQgPSAiYmluZGluZyBmYXVsdCI7Ci0JICB9Ci0JICAKLQkgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIElNZXNzYWdlUmVmZXJlbmNlIGdldE1lc3NhZ2VSZWZlcmVuY2UoKQotICB7Ci0gICAgRU9iamVjdCByZXN1bHROb3RpZmllciA9IG51bGw7Ci0gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICByZXN1bHROb3RpZmllciA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZUlucHV0KChCaW5kaW5nSW5wdXQpdGFyZ2V0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkKLSAgICB7Ci0gICAgICByZXN1bHROb3RpZmllciA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZU91dHB1dCgoQmluZGluZ091dHB1dCl0YXJnZXQpOwotICAgIH0gICAgICAgICAgCi0gICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdE5vdGlmaWVyID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlRmF1bHQoKEJpbmRpbmdGYXVsdCl0YXJnZXQpOwotICAgIH0gICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0Tm90aWZpZXIgIT0gbnVsbCA/IChJTWVzc2FnZVJlZmVyZW5jZSljcmVhdGVBZGFwdGVyKHJlc3VsdE5vdGlmaWVyKSA6IG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEV4dGVuc2libGl0eU9iamVjdHMoKQotICB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsgICAgCi0gICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICBpZiAoaXNSZWFkT25seSgpKSB7Ci0vLyAgICAgIGFjdGlvbklEcy5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLS8vICAgIH0KLSAgICByZXR1cm4gKFN0cmluZyBbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFCaW5kaW5nT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMUJpbmRpbmdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwOTdhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMUJpbmRpbmdPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLQotcHVibGljIGNsYXNzIFcxMUJpbmRpbmdPcGVyYXRpb24gZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJQmluZGluZ09wZXJhdGlvbiwgSVRyZWVFbGVtZW50Ci17Ci0gIAotICBwdWJsaWMgSU9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKQotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pdGFyZ2V0OwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgIAotICAgIHJldHVybiBvcGVyYXRpb24gIT0gbnVsbCA/IChJT3BlcmF0aW9uKWNyZWF0ZUFkYXB0ZXIob3BlcmF0aW9uKSA6IG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdNZXNzYWdlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pdGFyZ2V0OwotICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgIHsgIAotICAgICAgbGlzdC5hZGQoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkpOwotICAgIH0KLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkpOwotICAgIH0gICAgIAotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKSk7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbil0YXJnZXQ7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpOwotICAgIHJldHVybiBvcGVyYXRpb24gIT0gbnVsbCA/IG9wZXJhdGlvbi5nZXROYW1lKCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJsaXR5T2JqZWN0cygpCi0gIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBnZXRCaW5kaW5nTWVzc2FnZXMoKTsKLSAgICBJVHJlZUVsZW1lbnRbXSByZXN1bHQgPSBuZXcgSVRyZWVFbGVtZW50W2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkgIGlmIChnZXRCaW5kaW5nTWVzc2FnZXMoKS5zaXplKCkgPiAwKSB7Ci0JCSAgcmV0dXJuIHRydWU7Ci0JICB9Ci0JICAKLQkgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBTdHJpbmcgaW1hZ2VOYW1lID0gImljb25zL29wZXJhdGlvbmJpbmRpbmdfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlTmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuICJiaW5kaW5nIG9wZXJhdGlvbiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsgICAgCi0gICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgYWN0aW9uSURzLmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICByZXR1cm4gKFN0cmluZyBbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFDYXRlZ29yeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExQ2F0ZWdvcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTMzN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFDYXRlZ29yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRCaW5kaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZEltcG9ydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRJbnRlcmZhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkTWVzc2FnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRTY2hlbWFBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkU2VydmljZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFcxMUNhdGVnb3J5QWRhcHRlciBleHRlbmRzIFdTRExCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElDYXRlZ29yeUFkYXB0ZXIsIElUcmVlRWxlbWVudCwgSUFTRE9iamVjdExpc3RlbmVyIHsKLQkgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElNUE9SVFMgPSAxOwotCSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFlQRVMgPSAyOwotCSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VSVklDRVMgPSAzOwotCSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQklORElOR1MgPSA1OwotCSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5URVJGQUNFUyA9IDY7Ci0JICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRVNTQUdFUyA9IDc7Ci0JICAKLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElNUE9SVFNfSEVBREVSX1RFWFQgPSBNZXNzYWdlcy5fVUlfRk9MREVSX0lNUE9SVFM7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVTX0hFQURFUl9URVhUID0gTWVzc2FnZXMuX1VJX0ZPTERFUl9UWVBFUzsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9IRUFERVJfVEVYVCA9IE1lc3NhZ2VzLl9VSV9GT0xERVJfU0VSVklDRVM7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJJTkRJTkdfSEVBREVSX1RFWFQgPSBNZXNzYWdlcy5fVUlfRk9MREVSX0JJTkRJTkdTOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfSEVBREVSX1RFWFQgPSBNZXNzYWdlcy5fVUlfUE9SVF9UWVBFOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0hFQURFUl9URVhUID0gTWVzc2FnZXMuX1VJX0ZPTERFUl9NRVNTQUdFUzsgLy8kTk9OLU5MUy0xJAotCi0JICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7Ci0JICBwcm90ZWN0ZWQgSW1hZ2UgaW1hZ2U7Ci0JICBwcm90ZWN0ZWQgaW50IGdyb3VwVHlwZTsKLQkgIHByb3RlY3RlZCBDb2xsZWN0aW9uIGNoaWxkcmVuOwotCSAgcHJvdGVjdGVkIElEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLQkgIAotCSAgcHVibGljIFcxMUNhdGVnb3J5QWRhcHRlcihJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIFN0cmluZyBsYWJlbCwgSW1hZ2UgaW1hZ2UsIENvbGxlY3Rpb24gY2hpbGRyZW4sIGludCBncm91cFR5cGUpIHsKLQkgICAgdGhpcy50ZXh0ID0gbGFiZWw7Ci0JICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCSAgICB0aGlzLnRhcmdldCA9ICgoVzExRGVzY3JpcHRpb24pIGRlc2NyaXB0aW9uKS5nZXRUYXJnZXQoKTsKLQkgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCSAgICB0aGlzLmdyb3VwVHlwZSA9IGdyb3VwVHlwZTsKLQkgIH0KLQkgIAotCSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpIHsKLQkgICAgcmV0dXJuIChEZWZpbml0aW9uKSB0YXJnZXQ7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBJRGVzY3JpcHRpb24gZ2V0T3duZXJEZXNjcmlwdGlvbigpIHsKLQkJICByZXR1cm4gZGVzY3JpcHRpb247Ci0JICB9Ci0KLQkgIHB1YmxpYyBpbnQgZ2V0R3JvdXBUeXBlKCkgewotCSAgICByZXR1cm4gZ3JvdXBUeXBlOwotCSAgfQotCi0JICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JICAgIHJldHVybiBpbWFnZTsKLQkgIH0KLQotCSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCSAgICByZXR1cm4gdGV4dDsKLQkgIH0KLQotCSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotCSAgfQotCi0JICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihDb2xsZWN0aW9uIGxpc3QpIHsKLQkgICAgY2hpbGRyZW4gPSBsaXN0OwotCSAgfQotCi0JICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCSAgICByZXR1cm4gbnVsbDsKLQkgIH0KLQotCSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkgICAgcmV0dXJuIHRydWU7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsgICAgCi0JICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICAKLQkgICAgc3dpdGNoIChncm91cFR5cGUpIHsKLQkgICAgICBjYXNlIElNUE9SVFMgOiB7Ci0JICAgICAgICBhY3Rpb25JRHMuYWRkKEFTREFkZEltcG9ydEFjdGlvbi5JRCk7Ci0JICAgICAgICBicmVhazsKLQkgICAgICB9Ci0JICAgICAgY2FzZSBUWVBFUyA6IHsKLQkgICAgICAgIGFjdGlvbklEcy5hZGQoQVNEQWRkU2NoZW1hQWN0aW9uLklEKTsKLQkgICAgICAgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgICBjYXNlIFNFUlZJQ0VTIDogewotCSAgICAgICAgYWN0aW9uSURzLmFkZChBU0RBZGRTZXJ2aWNlQWN0aW9uLklEKTsKLQkgICAgICAgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgICBjYXNlIEJJTkRJTkdTIDogewotCSAgICAgICAgYWN0aW9uSURzLmFkZChBU0RBZGRCaW5kaW5nQWN0aW9uLklEKTsKLQkgICAgICAgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgICBjYXNlIElOVEVSRkFDRVMgOiB7Ci0JICAgICAgICBhY3Rpb25JRHMuYWRkKEFTREFkZEludGVyZmFjZUFjdGlvbi5JRCk7Ci0JICAgICAgICBicmVhazsKLQkgICAgICB9Ci0JICAgICAgY2FzZSBNRVNTQUdFUyA6IHsKLQkgICAgCWFjdGlvbklEcy5hZGQoQVNEQWRkTWVzc2FnZUFjdGlvbi5JRCk7Ci0JICAgICAgICBicmVhazsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkgICAgaWYgKGdldFRleHQoKS5lcXVhbHMocHJvcGVydHkpKQotCSAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBwcm9wZXJ0eSk7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBJVHJlZUVsZW1lbnQgZ2V0UGFyZW50KCkgewotCQkgIHJldHVybiBudWxsOwotCSAgfQotCSAgCi0JICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJICBpZiAoZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQkgIHJldHVybiB0cnVlOwotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gZmFsc2U7Ci0JICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFEZXNjcmlwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWYxZDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkQmluZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkSW1wb3J0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFBZGRJbnRlcmZhY2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMUFkZE1lc3NhZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMUFkZFNjaGVtYUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkU2VydmljZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExRWRpdE5hbWVzcGFjZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZEJpbmRpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkSW50ZXJmYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZFNlcnZpY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVzExRGVzY3JpcHRpb24gZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJRGVzY3JpcHRpb24gewotCXByb3RlY3RlZCBMaXN0IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJvdGVjdGVkIFcxMUNhdGVnb3J5QWRhcHRlciBnZXRDYXRlZ29yeShpbnQgY2F0ZWdvcnlJZCkgewotCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoY2F0ZWdvcnlJZCwgZ2V0Q2F0ZWdvcnlBZGFwdGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFcxMUNhdGVnb3J5QWRhcHRlciBnZXRDYXRlZ29yeShpbnQgY2F0ZWdvcnlJZCwgTGlzdCBsaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlXMTFDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChXMTFDYXRlZ29yeUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyLmdldEdyb3VwVHlwZSgpID09IGNhdGVnb3J5SWQpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldENhdGVnb3J5QWRhcHRlcnMoKSB7Ci0JICAgIC8vIGp1c3Qgc2V0IGNhdGVnb3J5YWRhcHRlcnMnIGNoaWxkcmVuIGlmIGNhdGVnb3J5IGFkYXB0ZXJzIGFyZQotCSAgICAvLyBhbHJlYWR5IGNyZWF0ZWQKLQkgICAgaWYgKGNhdGVnb3JpZXMuc2l6ZSgpID09IDApIHsKLQkgICAgCWNhdGVnb3JpZXMgPSBjcmVhdGVDYXRlZ29yeUFkYXB0ZXJzKCk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgIAlXMTFDYXRlZ29yeUFkYXB0ZXIgY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShXMTFDYXRlZ29yeUFkYXB0ZXIuSU1QT1JUUywgY2F0ZWdvcmllcyk7Ci0JICAgIAljYXRlZ29yeS5zZXRDaGlsZHJlbihnZXRJbXBvcnRzKCkpOwotCSAgICAJCi0JICAgIAljYXRlZ29yeSA9IGdldENhdGVnb3J5KFcxMUNhdGVnb3J5QWRhcHRlci5UWVBFUywgY2F0ZWdvcmllcyk7Ci0JICAgIAlhZGRMaXN0ZW5lclRvVHlwZXMoY2F0ZWdvcnkpOwotCi0JICAgIAljYXRlZ29yeSA9IGdldENhdGVnb3J5KFcxMUNhdGVnb3J5QWRhcHRlci5TRVJWSUNFUywgY2F0ZWdvcmllcyk7Ci0JICAgIAljYXRlZ29yeS5zZXRDaGlsZHJlbihnZXRTZXJ2aWNlcygpKTsKLQotCSAgICAJY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShXMTFDYXRlZ29yeUFkYXB0ZXIuQklORElOR1MsIGNhdGVnb3JpZXMpOwotCSAgICAJY2F0ZWdvcnkuc2V0Q2hpbGRyZW4oZ2V0QmluZGluZ3MoKSk7Ci0KLQkgICAgCWNhdGVnb3J5ID0gZ2V0Q2F0ZWdvcnkoVzExQ2F0ZWdvcnlBZGFwdGVyLklOVEVSRkFDRVMsIGNhdGVnb3JpZXMpOwotCSAgICAJY2F0ZWdvcnkuc2V0Q2hpbGRyZW4oZ2V0SW50ZXJmYWNlcygpKTsKLQotCSAgICAJY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShXMTFDYXRlZ29yeUFkYXB0ZXIuTUVTU0FHRVMsIGNhdGVnb3JpZXMpOwotCSAgICAJY2F0ZWdvcnkuc2V0Q2hpbGRyZW4oZ2V0TWVzc2FnZXMoKSk7Ci0JICAgIH0KLSAgICAJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JfQotCQotCS8vIFRPRE86IHJtYWg6IHJpZ2h0IG5vdyBpdCBsb29rcyBsaWtlIHRoZSBkZWZpbml0aW9uIG5lZWRzIHRvIGtub3cgdG9vIG11Y2ggYWJvdXQgdGhlIGNhdGVnb3JpZXMKLQkvLyBXZSBzaG91bGQgbWFrZSB0aGUgY2F0ZWdvcmllcyBtb3JlIHNlbGYtc3VmZmljaWVudC4uLi4gc28gaXQga25vd3MgaG93IHRvIGNvbXB1dGUgaXQncyBjaGlsZHJlbgotCS8vIGJhc2VkIG9uIGl0J3Mga2luZAotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZUNhdGVnb3J5QWRhcHRlcnMoKSB7Ci0JCUxpc3QgY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUxpc3QgaW1wb3J0TGlzdCA9IGdldEltcG9ydHMoKTsKLQkJTGlzdCBzY2hlbWFMaXN0ID0gZ2V0VHlwZXMoKTsKLQkJTGlzdCBzZXJ2aWNlTGlzdCA9IGdldFNlcnZpY2VzKCk7Ci0JCUxpc3QgYmluZGluZ0xpc3QgPSBnZXRCaW5kaW5ncygpOwotCQlMaXN0IGludGVyZmFjZUxpc3QgPSBnZXRJbnRlcmZhY2VzKCk7Ci0JCUxpc3QgbWVzc2FnZUxpc3QgPSBnZXRNZXNzYWdlcygpOwotCi0JCVN0cmluZyBjYXRlZ29yeVRpdGxlID0gVzExQ2F0ZWdvcnlBZGFwdGVyLklNUE9SVFNfSEVBREVSX1RFWFQ7Ci0JCUltYWdlIGNhdGVnb3J5SW1hZ2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2ltcG9ydGhlYWRlcl9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJVzExQ2F0ZWdvcnlBZGFwdGVyIGNhdGVnb3J5ID0gbmV3IFcxMUNhdGVnb3J5QWRhcHRlcih0aGlzLCBjYXRlZ29yeVRpdGxlLCBjYXRlZ29yeUltYWdlLCBpbXBvcnRMaXN0LCBXMTFDYXRlZ29yeUFkYXB0ZXIuSU1QT1JUUyk7Ci0JCXJlZ2lzdGVyTGlzdGVuZXIoY2F0ZWdvcnkpOwotCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0JCQotCQljYXRlZ29yeVRpdGxlID0gVzExQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTX0hFQURFUl9URVhUOwotCQljYXRlZ29yeUltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy90eXBlc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJY2F0ZWdvcnkgPSBuZXcgVzExVHlwZXNDYXRlZ29yeUFkYXB0ZXIodGhpcywgY2F0ZWdvcnlUaXRsZSwgY2F0ZWdvcnlJbWFnZSwgVzExQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsKLQkJYWRkTGlzdGVuZXJUb1R5cGVzKGNhdGVnb3J5KTsKLQkJcmVnaXN0ZXJMaXN0ZW5lcihjYXRlZ29yeSk7Ci0JCWNhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLQkJCi0JCWNhdGVnb3J5VGl0bGUgPSBXMTFDYXRlZ29yeUFkYXB0ZXIuU0VSVklDRV9IRUFERVJfVEVYVDsKLQkJY2F0ZWdvcnlJbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvc2VydmljZWhlYWRlcl9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJY2F0ZWdvcnkgPSBuZXcgVzExQ2F0ZWdvcnlBZGFwdGVyKHRoaXMsIGNhdGVnb3J5VGl0bGUsIGNhdGVnb3J5SW1hZ2UsIHNlcnZpY2VMaXN0LCBXMTFDYXRlZ29yeUFkYXB0ZXIuU0VSVklDRVMpOwotCQlyZWdpc3Rlckxpc3RlbmVyKGNhdGVnb3J5KTsKLQkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQkKLQkJY2F0ZWdvcnlUaXRsZSA9IFcxMUNhdGVnb3J5QWRhcHRlci5CSU5ESU5HX0hFQURFUl9URVhUOwotCQljYXRlZ29yeUltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQljYXRlZ29yeSA9IG5ldyBXMTFDYXRlZ29yeUFkYXB0ZXIodGhpcywgY2F0ZWdvcnlUaXRsZSwgY2F0ZWdvcnlJbWFnZSwgYmluZGluZ0xpc3QsIFcxMUNhdGVnb3J5QWRhcHRlci5CSU5ESU5HUyk7Ci0JCXJlZ2lzdGVyTGlzdGVuZXIoY2F0ZWdvcnkpOwotCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0JCQotCQljYXRlZ29yeVRpdGxlID0gVzExQ2F0ZWdvcnlBZGFwdGVyLklOVEVSRkFDRV9IRUFERVJfVEVYVDsKLQkJY2F0ZWdvcnlJbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcG9ydHR5cGVoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWNhdGVnb3J5ID0gbmV3IFcxMUNhdGVnb3J5QWRhcHRlcih0aGlzLCBjYXRlZ29yeVRpdGxlLCBjYXRlZ29yeUltYWdlLCBpbnRlcmZhY2VMaXN0LCBXMTFDYXRlZ29yeUFkYXB0ZXIuSU5URVJGQUNFUyk7Ci0JCXJlZ2lzdGVyTGlzdGVuZXIoY2F0ZWdvcnkpOwotCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0JCQotCQljYXRlZ29yeVRpdGxlID0gVzExQ2F0ZWdvcnlBZGFwdGVyLk1FU1NBR0VfSEVBREVSX1RFWFQ7Ci0JCWNhdGVnb3J5SW1hZ2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL21lc3NhZ2VoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWNhdGVnb3J5ID0gbmV3IFcxMUNhdGVnb3J5QWRhcHRlcih0aGlzLCBjYXRlZ29yeVRpdGxlLCBjYXRlZ29yeUltYWdlLCBtZXNzYWdlTGlzdCwgVzExQ2F0ZWdvcnlBZGFwdGVyLk1FU1NBR0VTKTsKLQkJcmVnaXN0ZXJMaXN0ZW5lcihjYXRlZ29yeSk7Ci0JCWNhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLQkJCi0JCXJldHVybiBjYXRlZ29yaWVzOwotCSAgfQotCQotCS8vIFNwZWNpYWwgY2FzZToKLQkvLyBXZSBuZWVkIHRvIGhhdmUgdGhlIFR5cGVzIG9iamVjdCBpbmZvcm0gb3VyIGZhY2FkZSAoVzExVHlwZXNDYXRlZ29yeUFkYXB0ZXIpIG9mIGl0J3MKLQkvLyBjaGFuZ2VzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcmVzdCBvZiB0aGUgVzExQ2F0ZWdvcnlBZGFwdGVycyB3aGljaCBsaXN0ZW5zCi0JLy8gdG8gdGhlIERlZmluaXRpb24gb2JqZWN0LgotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lclRvVHlwZXMoVzExQ2F0ZWdvcnlBZGFwdGVyIGNhdGVnb3J5KSB7Ci0JCURlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pIHRoaXMuZ2V0VGFyZ2V0KCk7Ci0JCVR5cGVzIHR5cGVzID0gZGVmLmdldEVUeXBlcygpOwotCQlpZiAodHlwZXMgIT0gbnVsbCAmJiAhdHlwZXMuZUFkYXB0ZXJzKCkuY29udGFpbnMoY2F0ZWdvcnkpKSB7Ci0JCQl0eXBlcy5lQWRhcHRlcnMoKS5hZGQoY2F0ZWdvcnkpOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuICgoRGVmaW5pdGlvbikgdGFyZ2V0KS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSB7Ci0JCVN0cmluZyB0bnMgPSBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJcmV0dXJuICgoRGVmaW5pdGlvbikgdGFyZ2V0KS5nZXRQcmVmaXgodG5zKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0U2VydmljZXMoKSB7Ci0JCUxpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKChEZWZpbml0aW9uKSBnZXRUYXJnZXQoKSk7Ci0JCUxpc3Qgc2VydmljZXMgPSB1dGlsLmdldFNlcnZpY2VzKCk7Ci0JCXBvcHVsYXRlQWRhcHRlckxpc3Qoc2VydmljZXMsIGFkYXB0ZXJMaXN0KTsKLQkJCi0JCXJldHVybiBhZGFwdGVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRCaW5kaW5ncygpIHsKLQkJTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoKERlZmluaXRpb24pIGdldFRhcmdldCgpKTsKLQkJTGlzdCBiaW5kaW5ncyA9IHV0aWwuZ2V0QmluZGluZ3MoKTsKLQkJcG9wdWxhdGVBZGFwdGVyTGlzdChiaW5kaW5ncywgYWRhcHRlckxpc3QpOwotCi0JCXJldHVybiBhZGFwdGVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmZhY2VzKCkgewotCQlMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCgoRGVmaW5pdGlvbikgZ2V0VGFyZ2V0KCkpOwotCQlMaXN0IHBvcnRUeXBlcyA9IHV0aWwuZ2V0UG9ydFR5cGVzKCk7Ci0JCXBvcHVsYXRlQWRhcHRlckxpc3QocG9ydFR5cGVzLCBhZGFwdGVyTGlzdCk7Ci0KLQkJcmV0dXJuIGFkYXB0ZXJMaXN0OwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKCkgewotCQlMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlwb3B1bGF0ZUFkYXB0ZXJMaXN0KCgoRGVmaW5pdGlvbikgdGFyZ2V0KS5nZXRFSW1wb3J0cygpLCBhZGFwdGVyTGlzdCk7Ci0KLQkJcmV0dXJuIGFkYXB0ZXJMaXN0OwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRUeXBlcygpIHsKLQkJTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJVHlwZXMgdHlwZXMgPSAoKERlZmluaXRpb24pIHRhcmdldCkuZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICB7ICAKLQkJICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHR5cGVzLmdldFNjaGVtYXMoKSwgYWRhcHRlckxpc3QpOwotICAgICAgICB9ICAKLQkJcmV0dXJuIGFkYXB0ZXJMaXN0OwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoKERlZmluaXRpb24pIGdldFRhcmdldCgpKTsKLQkJTGlzdCBtZXNzYWdlcyA9IHV0aWwuZ2V0TWVzc2FnZXMoKTsKLQkJcG9wdWxhdGVBZGFwdGVyTGlzdChtZXNzYWdlcywgYWRhcHRlckxpc3QpOwotCi0JCXJldHVybiBhZGFwdGVyTGlzdDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQotCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKERlZmluaXRpb24pIHRhcmdldCk7Ci0JCWlmIChkZWZpbml0aW9uLmdldFFOYW1lKCkgIT0gbnVsbCkgewotCQkJbmFtZSA9IGRlZmluaXRpb24uZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmdbXSBhY3Rpb25JRHMgPSBuZXcgU3RyaW5nWzNdOwotCQlhY3Rpb25JRHNbMF0gPSBBU0RBZGRTZXJ2aWNlQWN0aW9uLklEOwotCQlhY3Rpb25JRHNbMV0gPSBBU0RBZGRCaW5kaW5nQWN0aW9uLklEOwotCQlhY3Rpb25JRHNbMl0gPSBBU0RBZGRJbnRlcmZhY2VBY3Rpb24uSUQ7Ci0JCQotCQlyZXR1cm4gYWN0aW9uSURzOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRJbXBvcnRDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFcxMUFkZEltcG9ydENvbW1hbmQoKERlZmluaXRpb24pIHRhcmdldCk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldEFkZFNjaGVtYUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgVzExQWRkU2NoZW1hQ29tbWFuZCgoRGVmaW5pdGlvbikgdGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgZ2V0QWRkU2VydmljZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgVzExQWRkU2VydmljZUNvbW1hbmQoKERlZmluaXRpb24pIHRhcmdldCk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldEFkZEJpbmRpbmdDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFcxMUFkZEJpbmRpbmdDb21tYW5kKChEZWZpbml0aW9uKSB0YXJnZXQpOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRJbnRlcmZhY2VDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFcxMUFkZEludGVyZmFjZUNvbW1hbmQoKERlZmluaXRpb24pIHRhcmdldCk7CQotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRNZXNzYWdlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBXMTFBZGRNZXNzYWdlQ29tbWFuZCgoRGVmaW5pdGlvbikgdGFyZ2V0KTsJCi0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldEVkaXROYW1lc3BhY2VzQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBXMTFFZGl0TmFtZXNwYWNlc0NvbW1hbmQoKERlZmluaXRpb24pIHRhcmdldCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZXNJbmZvKCkgewotCQlET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCQlFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoKERlZmluaXRpb24pIHRhcmdldCk7Ci0JCXJldHVybiBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gImRlZmluaXRpb24iOwotCX0KLQkKLQlwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBnZXRDYXRlZ29yeUFkYXB0ZXJzKCk7Ci0JCXJldHVybiAoSVRyZWVFbGVtZW50W10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlpZiAoZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyBUT0RPOiBybWFoOiBUaGlzIGNvZGUgc2hvdWxkIGJlIG1vdmVkIGludG8gVzExQ2F0ZWdvcnlBZGFwdGVyCi0JCWNsYXNzIENhdGVnb3J5Tm90aWZpY2F0aW9uIGV4dGVuZHMgTm90aWZpY2F0aW9uSW1wbCB7Ci0JCQlwcm90ZWN0ZWQgT2JqZWN0IGNhdGVnb3J5OwotCQkJCi0JCQlwdWJsaWMgQ2F0ZWdvcnlOb3RpZmljYXRpb24oT2JqZWN0IGNhdGVnb3J5KSB7Ci0JCQkJc3VwZXIobXNnLmdldEV2ZW50VHlwZSgpLCBtc2cuZ2V0T2xkVmFsdWUoKSwgbXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXRQb3NpdGlvbigpKTsKLQkJCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCQkJcmV0dXJuIGNhdGVnb3J5OwotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoKSB7Ci0JCQkJcmV0dXJuIG1zZy5nZXRGZWF0dXJlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmaW5pdGlvbl9FSW1wb3J0cygpKSB7Ci0JCQlXMTFDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KFcxMUNhdGVnb3J5QWRhcHRlci5JTVBPUlRTKTsKLQkJCUFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLQkJCWFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0SW1wb3J0cygpKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLQkJfQotCQllbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZpbml0aW9uX0VUeXBlcygpKSB7Ci0JCQlXMTFDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KFcxMUNhdGVnb3J5QWRhcHRlci5UWVBFUyk7Ci0JCQlBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0JCQlhZGFwdGVyLnNldENoaWxkcmVuKGdldEltcG9ydHMoKSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmaW5pdGlvbl9FU2VydmljZXMoKSkgewotCQkJVzExQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBnZXRDYXRlZ29yeShXMTFDYXRlZ29yeUFkYXB0ZXIuU0VSVklDRVMpOwotCQkJQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotCQkJYWRhcHRlci5zZXRDaGlsZHJlbihnZXRTZXJ2aWNlcygpKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLQkJfQotCQllbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZpbml0aW9uX0VCaW5kaW5ncygpKSB7Ci0JCQlXMTFDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KFcxMUNhdGVnb3J5QWRhcHRlci5CSU5ESU5HUyk7Ci0JCQlBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0JCQlhZGFwdGVyLnNldENoaWxkcmVuKGdldEJpbmRpbmdzKCkpOwotCQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotCQl9Ci0JCWVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRVBvcnRUeXBlcygpKSB7Ci0JCQlXMTFDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KFcxMUNhdGVnb3J5QWRhcHRlci5JTlRFUkZBQ0VTKTsKLQkJCUFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLQkJCWFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0SW50ZXJmYWNlcygpKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLQkJfQotCQllbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZpbml0aW9uX0VNZXNzYWdlcygpKSB7Ci0JCQlXMTFDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KFcxMUNhdGVnb3J5QWRhcHRlci5NRVNTQUdFUyk7Ci0JCQlBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0JCQlhZGFwdGVyLnNldENoaWxkcmVuKGdldE1lc3NhZ2VzKCkpOwotCQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotCQl9Ci0JCWVsc2UgewotCQkJbm90aWZ5TGlzdGVuZXJzKG51bGwsIG51bGwpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFFbmRQb2ludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFFbmRQb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzFiNzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExRW5kUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFTZXRBZGRyZXNzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFTZXRCaW5kaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5zcGVjaWFsaXplZC5XMTFBZGRyZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZEVuZFBvaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTRERlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RTZXRFeGlzdGluZ0JpbmRpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEU2V0TmV3QmluZGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUFTRE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUVuZFBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmUuSVRyZWVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVzExRW5kUG9pbnQgZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJRW5kUG9pbnQsIElBU0RPYmplY3RMaXN0ZW5lciB7Ci0gCi0gICAgcHJvdGVjdGVkIExpc3QgYWRkcmVzc0V4dGVuc2libGl0eUVsZW1lbnRzID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgTGlzdCB0aGluZ3NUb0xpc3RlblRvID0gbnVsbDsKLSAgICAKLQlwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IGdldEFkZHJlc3NFeHRlbnNpYmxpdHlFbGVtZW50cygpOwotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgVzExQWRkcmVzc0V4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlciBhZGRyZXNzRUUgPSAoVzExQWRkcmVzc0V4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcilsaXN0LmdldCgwKTsKLSAgICAgICAgICByZXR1cm4gYWRkcmVzc0VFLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgIH0JCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRBcHBsaWNhYmxlUHJvdG9jb2woKSB7Ci0JCUxpc3QgcHJvdG9jb2xzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm90b2NvbHMuYWRkKCJTT0FQIik7Ci0JCXByb3RvY29scy5hZGQoIkhUVFAiKTsKLQkJCi0JCXJldHVybiBwcm90b2NvbHM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBuZXdQcm90b2NvbCkgewotCQlTdHJpbmcgY3VycmVudEFkZHJlc3MgPSBnZXRBZGRyZXNzKCk7Ci0JCWlmIChuZXdQcm90b2NvbC5lcXVhbHMoIlNPQVAiKSkgewotCQkJU09BUEFkZHJlc3Mgc29hcCA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQWRkcmVzcygpOwotCQkJc29hcC5zZXRMb2NhdGlvblVSSShjdXJyZW50QWRkcmVzcyk7Ci0JCQlzZXROZXdQcm90b2NvbChzb2FwKTsKLQkJfQotCQllbHNlIGlmIChuZXdQcm90b2NvbC5lcXVhbHMoIkhUVFAiKSkgewotCQkJSFRUUEFkZHJlc3MgaHR0cCA9IEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQQWRkcmVzcygpOwotCQkJaHR0cC5zZXRMb2NhdGlvblVSSShjdXJyZW50QWRkcmVzcyk7Ci0JCQlzZXROZXdQcm90b2NvbChodHRwKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TmV3UHJvdG9jb2woRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQlQb3J0IHBvcnQgPSBnZXRQb3J0KCk7Ci0JCQotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBwb3J0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGV4aXN0aW5nRWxlbWVudHMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlPYmplY3QgaXRlbSA9IGV4aXN0aW5nRWxlbWVudHMuZ2V0KGluZGV4KTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgU09BUEFkZHJlc3MgfHwgaXRlbSBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKSB7Ci0JCQkJZXhpc3RpbmdFbGVtZW50cy5yZW1vdmUoaW5kZXgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcG9ydC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChlbGVtZW50KTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0QWRkcmVzc0V4dGVuc2libGl0eUVsZW1lbnRzKCkKLSAgICB7ICAgICAgIAotICAgICAgICBhZGRyZXNzRXh0ZW5zaWJsaXR5RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaW5nc1RvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBnZXRUYXJnZXQoKTsgICAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwb3J0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICAgICAgeyAgIAotICAgICAgICAgIE5vdGlmaWVyIGl0ZW0gPSAoTm90aWZpZXIpaXQubmV4dCgpOwotICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoaXRlbSk7Ci0gICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBXMTFBZGRyZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgYWRkcmVzc0V4dGVuc2libGl0eUVsZW1lbnRzLmFkZChhZGFwdGVyKTsKLSAgICAgICAgICB9ICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFTRE9iamVjdCkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIHRoaW5nc1RvTGlzdGVuVG8uYWRkKGFkYXB0ZXIpOwotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIElBU0RPYmplY3Qgb2JqZWN0ID0gKElBU0RPYmplY3QpaS5uZXh0KCk7Ci0gICAgICAgICAgb2JqZWN0LnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0gIAotICAgICAgIAotICAgICAgcmV0dXJuIGFkZHJlc3NFeHRlbnNpYmxpdHlFbGVtZW50czsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJBZGRyZXNzRXh0ZW5zaWJsaXR5RWxlbWVudHMoKQotICAgIHsgICAgCi0gICAgICBpZiAodGhpbmdzVG9MaXN0ZW5UbyAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIElBU0RPYmplY3Qgb2JqZWN0ID0gKElBU0RPYmplY3QpaS5uZXh0KCk7Ci0gICAgICAgICAgb2JqZWN0LnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdGhpbmdzVG9MaXN0ZW5UbyA9IG51bGw7Ci0gICAgICBhZGRyZXNzRXh0ZW5zaWJsaXR5RWxlbWVudHMgPSBudWxsOwotICAgIH0KLQotCXB1YmxpYyBJQmluZGluZyBnZXRCaW5kaW5nKCkgewotCQlpZiAoZ2V0UG9ydCgpLmdldEVCaW5kaW5nKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIChJQmluZGluZykgY3JlYXRlQWRhcHRlcihnZXRQb3J0KCkuZ2V0RUJpbmRpbmcoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFBvcnQoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBlZUVsZW1lbnRzID0gZ2V0UG9ydCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQkJaWYgKGVlRWxlbWVudHMuc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IG9iamVjdCA9IGVlRWxlbWVudHMuZ2V0KDApOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKSB7Ci0JCQkJdmFsdWUgPSAoKFNPQVBBZGRyZXNzKSBvYmplY3QpLmdldExvY2F0aW9uVVJJKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykgewotCQkJCXZhbHVlID0gKChIVFRQQWRkcmVzcykgb2JqZWN0KS5nZXRMb2NhdGlvblVSSSgpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlID0gIk5vIEFkZHJlc3MiOwotCQl9Ci0JCQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEJpbmRpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFBvcnQgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIChQb3J0KSB0YXJnZXQ7Ci0JfQotCQotCXB1YmxpYyBJU2VydmljZSBnZXRPd25lclNlcnZpY2UoKSB7Ci0JCXJldHVybiAoSVNlcnZpY2UpIG93bmVyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBhY3Rpb25JRHMuYWRkKEFTREFkZEVuZFBvaW50QWN0aW9uLklEKTsKLSAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCArIE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX0JJTkRJTkcpOyAvLyROT04tTkxTLTEkCi0gICAgYWN0aW9uSURzLmFkZChBU0RTZXROZXdCaW5kaW5nQWN0aW9uLklEKTsKLSAgICBhY3Rpb25JRHMuYWRkKEFTRFNldEV4aXN0aW5nQmluZGluZ0FjdGlvbi5JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLSAgICBhY3Rpb25JRHMuYWRkKEFTRERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgYWN0aW9uSURzLmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICByZXR1cm4gKFN0cmluZyBbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgZ2V0U2V0QmluZGluZ0NvbW1hbmQoSUJpbmRpbmcgYmluZGluZykgewotCQlXMTFCaW5kaW5nIHcxMUJpbmRpbmcgPSAoVzExQmluZGluZykgYmluZGluZzsKLQkJcmV0dXJuIG5ldyBXMTFTZXRCaW5kaW5nQ29tbWFuZCgoUG9ydCkgdGFyZ2V0LCAoQmluZGluZykgdzExQmluZGluZy5nZXRUYXJnZXQoKSk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldFNldEFkZHJlc3NDb21tYW5kKFN0cmluZyBuZXdBZGRyZXNzKSB7Ci0JCXJldHVybiBuZXcgVzExU2V0QWRkcmVzc0NvbW1hbmQoKFBvcnQpIHRoaXMuZ2V0VGFyZ2V0KCksIG5ld0FkZHJlc3MpOwotCX0KLQlwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFcxMURlbGV0ZUNvbW1hbmQodGhpcyk7Ci0JfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgLy8gdGhpcyBpcyBjYWxsZWQgd2hlbiBvbmUgb2YgdGhlICdhZGRyZXNzJyBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYWRhcHRlcnMgd2UncmUgbGlzdGVuaW5nIHRvIGNoYW5nZXMKLSAgICAgIC8vCi0gICAgICBjbGVhckFkZHJlc3NFeHRlbnNpYmxpdHlFbGVtZW50cygpOyAgICAgIAotICAgICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICAgIH0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3BvcnRfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuICJwb3J0IjsKLQl9Ci0JCi0JcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gSVRyZWVFbGVtZW50LkVNUFRZX0xJU1Q7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBJVHJlZUVsZW1lbnQgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLy8gVE9ETzogcm1haDogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIElFbmRQb2ludCBJbnRlcmZhY2UuCi0JLy8gRG8gdGhpcyBwb3N0IDEuNS4uLi4KLQlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotCQlTdHJpbmcgcHJvdG9jb2wgPSAiIjsKLQkJCi0JCUxpc3QgbGlzdCA9IGdldEFkZHJlc3NFeHRlbnNpYmxpdHlFbGVtZW50cygpOwotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIAlXMTFBZGRyZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyIGFkZHJlc3NFRSA9IChXMTFBZGRyZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKWxpc3QuZ2V0KDApOwotICAgICAgICAJT2JqZWN0IHRhcmdldCA9IGFkZHJlc3NFRS5nZXRUYXJnZXQoKTsKLSAgICAgICAgCQotICAgICAgICAJLy8gVE9ETzogcm1haDogV2Ugc2hvdWxkIG5vdCB1c2luZyBoYXJkY29kZWQgc3RyaW5ncyBhcyB0aGUgcmV0dXJuZWQgUHJvdG9jb2wuICBXZSBuZWVkIHRvIGdldAotICAgICAgICAJLy8gdGhlIHByb3RvY29sIGR5bmFtaWNhbGx5Li4uLgotICAgICAgICAJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKSB7Ci0gICAgICAgIAkJcHJvdG9jb2wgPSAiU09BUCI7Ci0gICAgICAgIAl9Ci0gICAgICAgIAllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykgewotICAgICAgICAJCXByb3RvY29sID0gIkhUVFAiOwotICAgICAgICAJfQotICAgICAgICB9CQotCi0JCXJldHVybiBwcm90b2NvbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMUltcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5ODFjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMUltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zLlcxMU9wZW5JbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0REZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFcxMUltcG9ydCBleHRlbmRzIFdTRExCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElJbXBvcnQgewotCi0JcHVibGljIEltcG9ydCBnZXRJbXBvcnQoKSB7Ci0JCXJldHVybiAoSW1wb3J0KSB0YXJnZXQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZ2V0SW1wb3J0KCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KCkgewotCQlyZXR1cm4gZ2V0SW1wb3J0KCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldFByZWZpeChnZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBnZXRJbXBvcnQoKS5nZXRMb2NhdGlvblVSSSgpOwotCX0KLQkKLQlwdWJsaWMgSURlc2NyaXB0aW9uIGdldE93bmVyRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoSURlc2NyaXB0aW9uKSBvd25lcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgdGFyZ2V0OwotCQlyZXR1cm4gdGhlSW1wb3J0LmdldExvY2F0aW9uVVJJKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nW10gYWN0aW9uSURzID0gbmV3IFN0cmluZ1syXTsKLQkJYWN0aW9uSURzWzBdID0gVzExT3BlbkltcG9ydEFjdGlvbi5JRDsKLQkJYWN0aW9uSURzWzFdID0gQVNERGVsZXRlQWN0aW9uLklEOyAgICAKLQkJcmV0dXJuIGFjdGlvbklEczsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBXMTFEZWxldGVDb21tYW5kKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2ltcG9ydF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gImltcG9ydCI7Ci0JfQotCQotCXB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIElUcmVlRWxlbWVudC5FTVBUWV9MSVNUOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFJbnRlcmZhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZWVlZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMUFkZE9wZXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRPcGVyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNERGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXMTFJbnRlcmZhY2UgZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJSW50ZXJmYWNlIHsKLQotCXB1YmxpYyBMaXN0IGdldE9wZXJhdGlvbnMoKSB7Ci0JCUxpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBvcHVsYXRlQWRhcHRlckxpc3QoKChQb3J0VHlwZSkgdGFyZ2V0KS5nZXRFT3BlcmF0aW9ucygpLCBhZGFwdGVyTGlzdCk7Ci0KLQkJcmV0dXJuIGFkYXB0ZXJMaXN0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoKFBvcnRUeXBlKSB0YXJnZXQpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsKLSAgICBMaXN0IGFjdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhY3Rpb25JRHMuYWRkKEFTREFkZE9wZXJhdGlvbkFjdGlvbi5JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChBU0REZWxldGVBY3Rpb24uSUQpOwotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgIGFjdGlvbklEcy5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldEFkZE9wZXJhdGlvbkNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgVzExQWRkT3BlcmF0aW9uQ29tbWFuZCgoUG9ydFR5cGUpIHRhcmdldCk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgVzExRGVsZXRlQ29tbWFuZCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wb3J0dHlwZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gInBvcnRUeXBlIjsKLQl9Ci0JCi0JcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlMaXN0IG9wZXJhdGlvbnMgPSBnZXRPcGVyYXRpb25zKCk7Ci0JCUlUcmVlRWxlbWVudFtdIHRyZWVFbGVtZW50cyA9IG5ldyBJVHJlZUVsZW1lbnRbb3BlcmF0aW9ucy5zaXplKCldOwotCQkKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG9wZXJhdGlvbnMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQl0cmVlRWxlbWVudHNbaW5kZXhdID0gKElUcmVlRWxlbWVudCkgb3BlcmF0aW9ucy5nZXQoaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJlZUVsZW1lbnRzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJaWYgKGdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTY0MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zLlcxMUFkZFBhcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkUGFydENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0REZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMQWRhcHRlckZhY3RvcnlIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIFcxMU1lc3NhZ2UgZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJTWVzc2FnZSB7Ci0KLQlwdWJsaWMgTGlzdCBnZXRQYXJ0cygpIHsKLQkJTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlwb3B1bGF0ZUFkYXB0ZXJMaXN0KCgoTWVzc2FnZSkgdGFyZ2V0KS5nZXRFUGFydHMoKSwgYWRhcHRlckxpc3QpOwotCQlJdGVyYXRvciBwYXJ0cyA9ICgoTWVzc2FnZSkgdGFyZ2V0KS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlOb3RpZmllciBjb21wb25lbnQgPSAoTm90aWZpZXIpIHBhcnRzLm5leHQoKTsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlci5nZXRJbnN0YW5jZSgpLmFkYXB0KGNvbXBvbmVudCk7Ci0JCQlhZGFwdGVyTGlzdC5hZGQoYWRhcHRlcik7CQkJCi0JCX0KLQotCQlyZXR1cm4gYWRhcHRlckxpc3Q7Ci0JfQotCQotCXB1YmxpYyBJRGVzY3JpcHRpb24gZ2V0T3duZXJEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChJRGVzY3JpcHRpb24pIG93bmVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKCgoTWVzc2FnZSkgdGFyZ2V0KS5nZXRRTmFtZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiAoKE1lc3NhZ2UpIHRhcmdldCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJfQotCQkKLQkJcmV0dXJuICIiOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgTGlzdCBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgYWN0aW9uSURzLmFkZChXMTFBZGRQYXJ0QWN0aW9uLklEKTsKLSAgICBhY3Rpb25JRHMuYWRkKEFTRERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgYWN0aW9uSURzLmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICByZXR1cm4gKFN0cmluZyBbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgZ2V0QWRkUGFydENvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgVzExQWRkUGFydENvbW1hbmQoKE1lc3NhZ2UpIHRhcmdldCk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgVzExRGVsZXRlQ29tbWFuZCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9tZXNzYWdlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiAibWVzc2FnZSI7Ci0JfQotCQotCXB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBwYXJ0cyA9IGdldFBhcnRzKCk7Ci0JCUlUcmVlRWxlbWVudFtdIHRyZWVFbGVtZW50cyA9IG5ldyBJVHJlZUVsZW1lbnRbcGFydHMuc2l6ZSgpXTsKLQkJCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0cy5zaXplKCk7IGluZGV4KyspIHsKLQkJCXRyZWVFbGVtZW50c1tpbmRleF0gPSAoSVRyZWVFbGVtZW50KSBwYXJ0cy5nZXQoaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJlZUVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlpZiAoZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVHJlZUVsZW1lbnQgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFNZXNzYWdlUmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMU1lc3NhZ2VSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlZTUwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMU1lc3NhZ2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zLlcxMUFkZFBhcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFTZXRFeGlzdGluZ01lc3NhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFTZXROZXdNZXNzYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMUFkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFBZGRJbnB1dFBhcmFtZXRlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFEZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMVJlb3JkZXJQYXJhbWV0ZXJzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy52aXNpdG9yLlcxMUZpbmRJbm5lckVsZW1lbnRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZEZhdWx0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZE9wZXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0REZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmZpZ3VyZXMuTW9kZWxEaWFnbm9zdGljSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQVNET2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yLldTRExWaXNpdG9yRm9yUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBXMTFNZXNzYWdlUmVmZXJlbmNlIGV4dGVuZHMgV1NETEJhc2VBZGFwdGVyIGltcGxlbWVudHMgSU1lc3NhZ2VSZWZlcmVuY2UsIElBU0RPYmplY3RMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgaW50IG1lc3NhZ2VLaW5kID0gLTE7Ci0gIHByb3RlY3RlZCBMaXN0IHBhcmFtZXRlcnMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBwcmV2aWV3U3RyaW5nID0gIiI7Ci0gIAotICBwdWJsaWMgVzExTWVzc2FnZVJlZmVyZW5jZShpbnQgbWVzc2FnZUtpbmQpCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2VLaW5kID0gbWVzc2FnZUtpbmQ7Ci0gIH0KLQotICBwdWJsaWMgSU9wZXJhdGlvbiBnZXRPd25lck9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKElPcGVyYXRpb24pIG93bmVyOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByZXZpZXcoKSB7Ci0JICByZXR1cm4gIiAgKCIgKyBwcmV2aWV3U3RyaW5nICsgIikgICI7Ci0JICAKLQkgIC8qCi0JICBTdHJpbmcgcHJldmlld1N0cmluZyA9ICIoKSI7Ci0JICBMaXN0IHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKLQkgIC8vIEZvciBub3csIGp1c3QgbG9vayBhdCB0aGUgZmlyc3QgUGFydCBmb3IgdGhlIHByZXZpZXcKLQkgIGlmIChwYXJhbXMuc2l6ZSgpID4gMCkgewotCQkgIElQYXJhbWV0ZXIgcGFyYW0gPSAoSVBhcmFtZXRlcikgcGFyYW1zLmdldCgwKTsKLQkJICAKLQkJICBwcmV2aWV3U3RyaW5nID0gcGFyYW0uZ2V0UHJldmlldygpOwotCSAgfQkgIAotCSAgCi0JICByZXR1cm4gcHJldmlld1N0cmluZzsKLQkgICovCi0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCSAgU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0KLQkgIE9iamVjdCBvYmplY3QgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcigpOwotCSAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpIHsKLQkJICBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcilvYmplY3Q7Ci0JCSAgU3RyaW5nIG5ld1N0cmluZyA9IHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuZ2V0UHJvZHVjdFN0cmluZyhrZXksIGFyZ3MpOwotCQkgIGlmIChuZXdTdHJpbmcgIT0gbnVsbCkgewotCQkJICBzdHJpbmcgPSBuZXdTdHJpbmc7Ci0JCSAgfQotCSAgfQotCi0JICByZXR1cm4gc3RyaW5nOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRJbnZhbGlkRWxlbWVudFJlZmVyZW5jZVN0cmluZygpIHsKLQkgIFN0cmluZyBzdHJpbmcgPSBudWxsOwotCSAgU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbMV07Ci0JICBhcmdzWzBdID0gImVsZW1lbnQiOwotCSAgc3RyaW5nID0gZ2V0TWVzc2FnZVN0cmluZygiX1VJX0xBQkVMX0lOVkFMSURfQVJHX1JFRkVSRU5DRSIsIGFyZ3MpOwotCSAgaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCSAgc3RyaW5nID0gIkludmFsaWQgZWxlbWVudCByZWZlcmVuY2UiOwotCSAgfQotCSAgCi0JICByZXR1cm4gc3RyaW5nOwotICB9Ci0gIAotICAvLyBDb252ZW5pZW5jZSBtZXRob2QKLSAgcHVibGljIE1lc3NhZ2VSZWZlcmVuY2UgZ2V0TWVzc2FnZVJlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gKE1lc3NhZ2VSZWZlcmVuY2UpIHRhcmdldDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVNZXNzYWdlS2luZCgpCi0gIHsKLSAgICBpZiAoZ2V0TWVzc2FnZVJlZmVyZW5jZSgpIGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgbWVzc2FnZUtpbmQgPSBLSU5EX0lOUFVUOwotICAgIH0KLSAgICBlbHNlIGlmIChnZXRNZXNzYWdlUmVmZXJlbmNlKCkgaW5zdGFuY2VvZiBPdXRwdXQpCi0gICAgewotICAgICAgbWVzc2FnZUtpbmQgPSBLSU5EX09VVFBVVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZ2V0TWVzc2FnZVJlZmVyZW5jZSgpIGluc3RhbmNlb2YgRmF1bHQpCi0gICAgICBtZXNzYWdlS2luZCA9IEtJTkRfRkFVTFQ7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEtpbmQoKQotICB7Ci0JICBpZiAobWVzc2FnZUtpbmQgPT0gLTEpCi0JICB7Ci0JCSAgY29tcHV0ZU1lc3NhZ2VLaW5kKCk7Ci0JICB9Ci0JICByZXR1cm4gbWVzc2FnZUtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLQkgIE1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZiA9IGdldE1lc3NhZ2VSZWZlcmVuY2UoKTsKLQkgIGlmIChtZXNzYWdlUmVmLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCSAgcmV0dXJuIG1lc3NhZ2VSZWYuZ2V0TmFtZSgpOwotCSAgfQotCSAgCi0JICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKgotICAgKiBYU0QgRWxlbWVudHMgb3IgV1NETCBQYXJ0cy4uLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0UGFyYW1ldGVycygpCi0gIHsKLQkgIExpc3QgcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIExpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYgPSBnZXRNZXNzYWdlUmVmZXJlbmNlKCk7Ci0JICBpZiAobWVzc2FnZVJlZiAhPSBudWxsKSB7Ci0JCSAgaWYgKG1lc3NhZ2VSZWYuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkgIGlmIChtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkgIT0gbnVsbCkgewotCQkJCSAgcGFydHMgPSBtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCk7Ci0JCQkgIH0KLQkJICB9Ci0JICB9Ci0JICAKLQkgIHBvcHVsYXRlQWRhcHRlckxpc3QocGFydHMsIHBhcmFtZXRlcnMpOwotCSAgCi0JICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBXU0RMVmlzaXRvckZvclBhcmFtZXRlcnMgdmlzaXRvckZvclBhcmFtZXRlcnMgPSBuZXcgV1NETFZpc2l0b3JGb3JQYXJhbWV0ZXJzKCk7Ci0gICAgICB2aXNpdG9yRm9yUGFyYW1ldGVycy52aXNpdE1lc3NhZ2VSZWZlcmVuY2UobWVzc2FnZVJlZik7Ci0gICAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3JGb3JQYXJhbWV0ZXJzLmNvbmNyZXRlQ29tcG9uZW50cywgb3RoZXJUaGluZ3NUb0xpc3RlblRvKTsKLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvckZvclBhcmFtZXRlcnMudGhpbmdzVG9MaXN0ZW5Ubywgb3RoZXJUaGluZ3NUb0xpc3RlblRvKTsKLSAgICAgIAotICAgICAgLy8gbm93IHdlIGxpc3RlbiB0byBhbGwgdGhlICd0aGluZ3Mgd2UgbmVlZCB0byBsaXN0ZW4gdG8nCi0gICAgICAvLwotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBU0RPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQVNET2JqZWN0IGFzZE9iamVjdCA9IChJQVNET2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFzZE9iamVjdC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0JICAKLQkgIHJldHVybiBwYXJhbWV0ZXJzOwotICAgIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBvbmUgb2YgdGhlICdvdGhlclRoaW5nc1RvTGlzdGVuVG8nIGhhcyBjaGFuZ2VkCi0gICAgLy8gd2hlbiBvbmUgb2YgdGhlc2UgdGhpbmdzIGNoYW5nZXMgaXQgbWVhbnMgb3VyIHBhcmFtdGVyIGxpc3QgbWF5IGhhdmUgY2hhbmdlcwotICAgIC8vIHNvIHdlIG5lZWQgdG8gcmVjb21wdXRlIGl0Ci0gICAgT2JqZWN0IG5vdGlmaWVyID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICB7Ci0gICAgICBub3RpZmllciA9ICgoQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpOwotICAgIH0gIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJzb21ldGhpbmcgaW4gdGhlICdvdGhlclRoaW5nc1RvTGlzdGVuVG8nIGxpc3QgaGFzIGNoYW5nZWQgIiArIG5vdGlmaWVyKTsgICAgCi0gICAgY2xlYXJQYXJhbWV0ZXJzKCk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOyAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyUGFyYW1ldGVycygpCi0gIHsKLSAgICBpZiAob3RoZXJUaGluZ3NUb0xpc3RlblRvICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBU0RPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQVNET2JqZWN0IGFzZE9iamVjdCA9IChJQVNET2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFzZE9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcGFyYW1ldGVycyA9IG51bGw7ICAgIAotICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGNsZWFyUGFyYW1ldGVycygpOyAgICAKLSAgICBzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0JICBMaXN0IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBhY3Rpb25zLmFkZChBU0RBZGRPcGVyYXRpb25BY3Rpb24uSUQpOwkgIAotCSAgYWN0aW9ucy5hZGRBbGwoKChXMTFPcGVyYXRpb24pIGdldE93bmVyT3BlcmF0aW9uKCkpLmdldFZhbGlkSW5wdXRPdXRwdUFjdGlvbnMoKSk7IAotCSAgYWN0aW9ucy5hZGQoQVNEQWRkRmF1bHRBY3Rpb24uSUQpOwotCSAgYWN0aW9ucy5hZGQoVzExQWRkUGFydEFjdGlvbi5JRCk7Ci0JICBhY3Rpb25zLmFkZChBU0REZWxldGVBY3Rpb24uSUQpOwotCSAgYWN0aW9ucy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfTUVTU0FHRSk7IC8vJE5PTi1OTFMtMSQKLQkgIGFjdGlvbnMuYWRkKFcxMVNldE5ld01lc3NhZ2VBY3Rpb24uSUQpOwotCSAgYWN0aW9ucy5hZGQoVzExU2V0RXhpc3RpbmdNZXNzYWdlQWN0aW9uLklEKTsKLQkgIGFjdGlvbnMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpOwotLy8gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotLy8gICAgICBhY3Rpb25zLmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotLy8gICAgfQotCi0JICBTdHJpbmdbXSBhY3Rpb25JRHMgPSBuZXcgU3RyaW5nW2FjdGlvbnMuc2l6ZSgpXTsKLQkgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhY3Rpb25zLnNpemUoKTsgaW5kZXgrKykgewotCQkgIGFjdGlvbklEc1tpbmRleF0gPSAoU3RyaW5nKSBhY3Rpb25zLmdldChpbmRleCk7Ci0JICB9Ci0JICAKLQkgIHJldHVybiBhY3Rpb25JRHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb21tYW5kIGdldFJlb3JkZXJQYXJhbWV0ZXJzQ29tbWFuZChJUGFyYW1ldGVyIGxlZnRTaWJsaW5nLCBJUGFyYW1ldGVyIHJpZ2h0U2libGluZywgSVBhcmFtZXRlciBtb3ZpbmdQYXJhbWV0ZXIpIHsKLQkgIHJldHVybiBuZXcgVzExUmVvcmRlclBhcmFtZXRlcnNDb21tYW5kKGxlZnRTaWJsaW5nLCByaWdodFNpYmxpbmcsIG1vdmluZ1BhcmFtZXRlcik7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkgewotCSAgcmV0dXJuIG5ldyBXMTFEZWxldGVDb21tYW5kKHRoaXMpOwotICB9Ci0gIAotICBwdWJsaWMgQ29tbWFuZCBnZXRBZGRQYXJhbXRlckNvbW1hbmQoKSB7Ci0gICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pZ2V0TWVzc2FnZVJlZmVyZW5jZSgpLmVDb250YWluZXIoKTsKLSAgICAgIGlmIChnZXRLaW5kKCkgPT0gS0lORF9JTlBVVCkKLSAgICAgIHsgICAgCi0gICAgICAgIGNvbW1hbmQgPSBuZXcgVzExQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kKG9wZXJhdGlvbik7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKGdldEtpbmQoKSA9PSBLSU5EX09VVFBVVCkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBXMTFBZGRPdXRwdXRQYXJhbWV0ZXJDb21tYW5kKG9wZXJhdGlvbik7ICAgICAgICAKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgVzExQWRkRmF1bHRQYXJhbWV0ZXJDb21tYW5kKG9wZXJhdGlvbiwgKEZhdWx0KWdldE1lc3NhZ2VSZWZlcmVuY2UoKSk7ICAgICAgICAKLSAgICAgIH0gCi0gICAgICByZXR1cm4gY29tbWFuZDsKLSAgfSAgCi0gIAotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkgICAgaWYgKGdldEtpbmQoKSA9PSBLSU5EX0lOUFVUKQotCSAgICB7Ci0JICAgIAlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9pbnB1dF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotCSAgICBlbHNlIGlmIChnZXRLaW5kKCkgPT0gS0lORF9PVVRQVVQpCi0JICAgIHsKLQkgICAgCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL291dHB1dF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotCSAgICBlbHNlIGlmIChnZXRLaW5kKCkgPT0gS0lORF9GQVVMVCkKLQkgICAgewotCSAgICAJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvZmF1bHRfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JICAgIH0KLQkgICAgcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkgICAgaWYgKGdldEtpbmQoKSA9PSBLSU5EX0lOUFVUKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICJpbnB1dCI7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoZ2V0S2luZCgpID09IEtJTkRfT1VUUFVUKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICJvdXRwdXQiOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGdldEtpbmQoKSA9PSBLSU5EX0ZBVUxUKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLQkgICAgfQotCSAgICByZXR1cm4gIk5vTmFtZSI7Ci0JfQotICAgIAotCXB1YmxpYyBMaXN0IGdldFBhcmFtZXRlcnMyKCkgCi0gICAgewotCSAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkKLQkgIHsKLQkgICAgcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICBXU0RMVmlzaXRvckZvclBhcmFtZXRlcnMgdmlzaXRvckZvclBhcmFtZXRlcnMgPSBuZXcgV1NETFZpc2l0b3JGb3JQYXJhbWV0ZXJzKCk7Ci0JICAgIHZpc2l0b3JGb3JQYXJhbWV0ZXJzLnZpc2l0TWVzc2FnZVJlZmVyZW5jZShnZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotCSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3JGb3JQYXJhbWV0ZXJzLmNvbmNyZXRlQ29tcG9uZW50cywgcGFyYW1ldGVycyk7Ci0JICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvckZvclBhcmFtZXRlcnMudGhpbmdzVG9MaXN0ZW5Ubywgb3RoZXJUaGluZ3NUb0xpc3RlblRvKTsKLQotCSAgICAvLyBub3cgd2UgbGlzdGVuIHRvIGFsbCB0aGUgJ3RoaW5ncyB3ZSBuZWVkIHRvIGxpc3RlbiB0bycKLQkgICAgLy8KLQkgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkgICAgewotCSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpLm5leHQoKTsKLQkgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBU0RPYmplY3QpCi0JICAgICAgewotCSAgICAgICAgSUFTRE9iamVjdCBhc2RPYmplY3QgPSAoSUFTRE9iamVjdCkgYWRhcHRlcjsKLQkgICAgICAgIGFzZE9iamVjdC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotCSAgICAgIH0KLQkgICAgfSAKLQkgIH0KLQotCSAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0JfSAgICAKLQkKLQlwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAvKgotCQlMaXN0IHBhcnRzID0gZ2V0UGFyYW1ldGVycygpOwotCQlJVHJlZUVsZW1lbnRbXSB0cmVlRWxlbWVudHMgPSBuZXcgSVRyZWVFbGVtZW50W3BhcnRzLnNpemUoKV07Ci0JCQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcGFydHMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQl0cmVlRWxlbWVudHNbaW5kZXhdID0gKElUcmVlRWxlbWVudCkgcGFydHMuZ2V0KGluZGV4KTsKLQkJfQotCQkqLwotCQlyZXR1cm4gSVRyZWVFbGVtZW50LkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCWlmIChnZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQWR2YW5jZWRXMTFNZXNzYWdlUmVmZXJlbmNlKCkgewotCQlkaWFnbm9zdGljTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmID0gKE1lc3NhZ2VSZWZlcmVuY2UpIGdldFRhcmdldCgpOwotCQlMaXN0IHBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWlmIChtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkgIT0gbnVsbCkgewotCQkJCXBhcnRzID0gbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpLmdldEVQYXJ0cygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1lc3NhZ2VSZWYgPT0gbnVsbCB8fCBtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCkgPT0gbnVsbCkgewotCQkJYWRkRXJyb3JEaWFnbm9zdGljTWVzc2FnZShnZXRVbmRlZmluZWRBcmcxU3RyaW5nKCJtZXNzYWdlIikpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRzLnNpemUoKSA8PSAwKSB7Ci0JCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1sxXTsKLQkJCWFyZ3NbMF0gPSAicGFydCI7Ci0JCQlhZGRXYXJuaW5nRGlhZ25vc3RpY01lc3NhZ2UoZ2V0U3RyaW5nRm9yS2V5KCJfVUlfTEFCRUxfTk9fT0JKRUNUX1NQRUNJRklFRF9BUkcxIiwgYXJncykpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaW1wbGlmaWVkVzExTWVzc2FnZVJlZmVyZW5jZSgpIHsKLQkJZGlhZ25vc3RpY01lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmID0gKE1lc3NhZ2VSZWZlcmVuY2UpIGdldFRhcmdldCgpOwotCQkgIGlmIChtZXNzYWdlUmVmID09IG51bGwgfHwgbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCSAgYWRkRXJyb3JEaWFnbm9zdGljTWVzc2FnZShnZXRVbmRlZmluZWRBcmcxU3RyaW5nKCJtZXNzYWdlIikpOwotCQkgIH0KLQkJICBlbHNlIGlmIChtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkuc2l6ZSgpIDw9IDApIHsKLQkJCSAgYWRkV2FybmluZ0RpYWdub3N0aWNNZXNzYWdlKGdldE5vUGFyYW1ldGVyc1NwZWNpZmllZFN0cmluZygpKTsKLQkJICB9Ci0JCSAgZWxzZSB7Ci0JCQkgIFBhcnQgcGFydCA9IChQYXJ0KSBtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkuZ2V0KDApOwotCQkJICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0JCQkgIGlmICh4c2RFbGVtZW50ID09IG51bGwgfHwgeHNkRWxlbWVudC5nZXRTY2hlbWEoKSA9PSBudWxsKSB7Ci0JCQkJICAvLyBObyBYU0QgRWxlbWVudAotCQkJCSAgYWRkRXJyb3JEaWFnbm9zdGljTWVzc2FnZShnZXRVbmRlZmluZWRBcmcxU3RyaW5nKCJlbGVtZW50IikpOwotCQkJICB9Ci0JCQkgIGVsc2UgewotCQkJCSAgTXlJbm5lckVsZW1lbnRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTXlJbm5lckVsZW1lbnRWaXNpdG9yKCk7Ci0JCQkJICB2aXNpdG9yLmZpbmRFcnJvcnNBbmRXYXJuaW5ncyh4c2RFbGVtZW50KTsKLQkJCQkgIGRpYWdub3N0aWNNZXNzYWdlcy5hZGRBbGwodmlzaXRvci5nZXREaWFnbm9zdGljTWVzc2FnZXMoKSk7Ci0JCQkgIH0KLQkJICB9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVycm9yRGlhZ25vc3RpY01lc3NhZ2UoU3RyaW5nIHR4dCkgewotCQlkaWFnbm9zdGljTWVzc2FnZXMuYWRkKG5ldyBNb2RlbERpYWdub3N0aWNJbmZvKHR4dCwgTW9kZWxEaWFnbm9zdGljSW5mby5FUlJPUl9UWVBFLCBudWxsKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRXYXJuaW5nRGlhZ25vc3RpY01lc3NhZ2UoU3RyaW5nIHR4dCkgewotCQlkaWFnbm9zdGljTWVzc2FnZXMuYWRkKG5ldyBNb2RlbERpYWdub3N0aWNJbmZvKHR4dCwgTW9kZWxEaWFnbm9zdGljSW5mby5XQVJOSU5HX1RZUEUsIG51bGwpKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBkaWFnbm9zdGljTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLy8gVE9ETzogcm1haDogUG9zdCBXVFAgMS41LCB3ZSBzaG91bGQgcmVuYW1lIHRoaXMgdG8gYmUgc29tZXRoaW5nIGxpa2UgZ2V0QWR2YW5jZWRXMTFNZXNzYWdlUmVmZXJlbmNlKCkKLQlwdWJsaWMgTGlzdCBnZXREaWFnbm9zdGljTWVzc2FnZXMoKSB7Ci0JCXByb2Nlc3NBZHZhbmNlZFcxMU1lc3NhZ2VSZWZlcmVuY2UoKTsKLQkJcmV0dXJuIGRpYWdub3N0aWNNZXNzYWdlczsKLQl9Ci0JCi0JLy8gVE9ETzogcm1haDogUG9zdCBXVFAgMS41LCB3ZSBzaG91bGQgcmVuYW1lIHRoaXMgdG8gYmUgc29tZXRoaW5nIGxpa2UgZ2V0U2ltcGxpZmllZFcxMU1lc3NhZ2VSZWZlcmVuY2UoKQotCXB1YmxpYyBMaXN0IGdldERpYWdub3N0aWNNZXNzYWdlczIoKSB7Ci0JCXByb2Nlc3NTaW1wbGlmaWVkVzExTWVzc2FnZVJlZmVyZW5jZSgpOwotCQlyZXR1cm4gZGlhZ25vc3RpY01lc3NhZ2VzOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIE15SW5uZXJFbGVtZW50VmlzaXRvciBleHRlbmRzIFcxMUZpbmRJbm5lckVsZW1lbnRWaXNpdG9yIHsKLQkJcHJpdmF0ZSBMaXN0IGRpYWdNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXB1YmxpYyB2b2lkIGZpbmRFcnJvcnNBbmRXYXJuaW5ncyhYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCkgewotCQkJaWYgKHhzZEVsZW1lbnQuZ2V0VHlwZURlZmluaXRpb24oKSA9PSBudWxsIHx8IHhzZEVsZW1lbnQuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRTY2hlbWEoKSA9PSBudWxsKSB7Ci0JCQkJLy8gTm8gWFNEIHR5cGUgKG5vbiBhbm9ueW1vdXMpIGRlZmluZWQKLQkJCQlkaWFnTWVzc2FnZXMuYWRkKG5ldyBNb2RlbERpYWdub3N0aWNJbmZvKGdldFVuZGVmaW5lZEFyZzFTdHJpbmcoInR5cGUiKSwgTW9kZWxEaWFnbm9zdGljSW5mby5FUlJPUl9UWVBFLCBudWxsKSk7Ci0JCQl9Ci0KLQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBpbm5lckVsZW1lbnQgPSBzdXBlci5nZXRJbm5lclhTREVsZW1lbnQoeHNkRWxlbWVudCk7Ci0JCQlpZiAoaW5uZXJFbGVtZW50LmVxdWFscyh4c2RFbGVtZW50KSkgewotCQkJCWRpYWdNZXNzYWdlcy5hZGQobmV3IE1vZGVsRGlhZ25vc3RpY0luZm8oZ2V0Tm9QYXJhbWV0ZXJzU3BlY2lmaWVkU3RyaW5nKCksIE1vZGVsRGlhZ25vc3RpY0luZm8uV0FSTklOR19UWVBFLCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0IGdldERpYWdub3N0aWNNZXNzYWdlcygpIHsKLQkJCXJldHVybiBkaWFnTWVzc2FnZXM7Ci0JCX0KLQl9Ci0JCi0JICBwcml2YXRlIFN0cmluZyBnZXRVbmRlZmluZWRBcmcxU3RyaW5nKFN0cmluZyBhcmcpIHsKLQkJICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1sxXTsKLQkJICBhcmdzWzBdID0gYXJnOwotCQkgIFN0cmluZyBuZXdTdHJpbmcgPSBnZXRTdHJpbmdGb3JLZXkoIl9VSV9MQUJFTF9VTkRFRklORURfQVJHMSIsIGFyZ3MpOwotCQkgIHJldHVybiBuZXdTdHJpbmc7Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgU3RyaW5nIGdldE5vUGFyYW1ldGVyc1NwZWNpZmllZFN0cmluZygpIHsKLQkJICBTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1swXTsKLQkJICBzdHJpbmcgPSBnZXRTdHJpbmdGb3JLZXkoIl9VSV9MQUJFTF9OT19QQVJBTUVURVJTX1NQRUNJRklFRCIsIGFyZ3MpOwotCQkgIHJldHVybiBzdHJpbmc7Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZ0ZvcktleShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCSAgU3RyaW5nIG5ld1N0cmluZyA9ICIiOwotCQkgIG5ld1N0cmluZyA9IE1lc3NhZ2VzLmdldFN0cmluZyhrZXksIGFyZ3MpOwotCQkgIAotCQkgIE9iamVjdCBvYmplY3QgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcigpOwotCQkgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKSB7Ci0JCQkgIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKW9iamVjdDsKLQkJCSAgU3RyaW5nIGN1c3RvbWl6ZWRTdHJpbmcgPSAiIjsKLQkJCSAgaWYgKGFyZ3MgPT0gbnVsbCkgewotCQkJCSAgY3VzdG9taXplZFN0cmluZyA9IHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuZ2V0UHJvZHVjdFN0cmluZyhrZXkpOwotCQkJICB9Ci0JCQkgIGVsc2UgewotCQkJCSAgY3VzdG9taXplZFN0cmluZyA9IHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuZ2V0UHJvZHVjdFN0cmluZyhrZXksIGFyZ3MpOwotCQkJICB9Ci0JCQkgIAotCQkJICBpZiAoY3VzdG9taXplZFN0cmluZyAhPSBudWxsICYmICFjdXN0b21pemVkU3RyaW5nLmVxdWFscygiIikpIHsKLQkJCQkgIG5ld1N0cmluZyA9IGN1c3RvbWl6ZWRTdHJpbmc7Ci0JCQkgIH0KLQkJICB9Ci0KLQkJICBpZiAobmV3U3RyaW5nID09IG51bGwpIHsKLQkJCSAgbmV3U3RyaW5nID0gIiI7Ci0JCSAgfQotCi0JCSAgcmV0dXJuIG5ld1N0cmluZzsKLQkgIH0KLSAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjNhNjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLkRlZmF1bHRFZGl0b3JNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMUFkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFBZGRJbnB1dFBhcmFtZXRlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFEZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMVJlb3JkZXJNZXNzYWdlUmVmZXJlbmNlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkRmF1bHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkSW5wdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkT3BlcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZE91dHB1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0REZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCYXNlUGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBXMTFPcGVyYXRpb24gZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJT3BlcmF0aW9uIHsKLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpCi0JewotCQlMaXN0IG1vZGVsQWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KGdldE9wZXJhdGlvbigpLmdldEVGYXVsdHMoKS5zaXplKCkgKyAyKTsKLQkJCi0JCUlucHV0IGlucHV0ID0gZ2V0T3BlcmF0aW9uKCkuZ2V0RUlucHV0KCk7Ci0JCU91dHB1dCBvdXRwdXQgPSBnZXRPcGVyYXRpb24oKS5nZXRFT3V0cHV0KCk7Ci0JCQotCQlPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBnZXRPcGVyYXRpb24oKS5nZXRTdHlsZSgpOwotCQlpZiAob3BlcmF0aW9uVHlwZSAhPSBudWxsKSB7Ci0JCQlpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKSAmJiBpbnB1dCAhPSBudWxsICYmIG91dHB1dCAhPSBudWxsKSB7Ci0JCQkJLy8gSW5wdXQsIE91dHB1dAotCQkJCW1vZGVsQWRhcHRlckxpc3QuYWRkKGNyZWF0ZUFkYXB0ZXIoaW5wdXQpKTsKLQkJCQltb2RlbEFkYXB0ZXJMaXN0LmFkZChjcmVhdGVBZGFwdGVyKG91dHB1dCkpOwotCQkJfQotCQkJZWxzZSBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFKSAmJiBpbnB1dCAhPSBudWxsICYmIG91dHB1dCAhPSBudWxsKSB7Ci0JCQkJLy8gT3V0cHV0LCBJbnB1dAotCQkJCW1vZGVsQWRhcHRlckxpc3QuYWRkKGNyZWF0ZUFkYXB0ZXIob3V0cHV0KSk7Ci0JCQkJbW9kZWxBZGFwdGVyTGlzdC5hZGQoY3JlYXRlQWRhcHRlcihpbnB1dCkpOwotCQkJfQotCQkJZWxzZSBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5PTkVfV0FZKSAmJiBpbnB1dCAhPSBudWxsKSB7Ci0JCQkJLy8gSW5wdXQKLQkJCQltb2RlbEFkYXB0ZXJMaXN0LmFkZChjcmVhdGVBZGFwdGVyKGlucHV0KSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTikgJiYgb3V0cHV0ICE9IG51bGwpIHsKLQkJCQkvL091dHB1dAotCQkJCW1vZGVsQWRhcHRlckxpc3QuYWRkKGNyZWF0ZUFkYXB0ZXIob3V0cHV0KSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaSA9IGdldE9wZXJhdGlvbigpLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCXsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpLm5leHQoKTsKLQkJCW1vZGVsQWRhcHRlckxpc3QuYWRkKGNyZWF0ZUFkYXB0ZXIobykpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsQWRhcHRlckxpc3Q7Ci0JfQotCQotCS8vIENvbnZpZW5lbmNlIG1ldGhvZAotCXB1YmxpYyBPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkKLQl7Ci0JCXJldHVybiAoT3BlcmF0aW9uKSB0YXJnZXQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gZ2V0T3BlcmF0aW9uKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgSUludGVyZmFjZSBnZXRPd25lckludGVyZmFjZSgpCi0JewotCQlyZXR1cm4gKElJbnRlcmZhY2Upb3duZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlhY3Rpb25zLmFkZChBU0RBZGRPcGVyYXRpb25BY3Rpb24uSUQpOwotCQlhY3Rpb25zLmFkZEFsbChnZXRWYWxpZElucHV0T3V0cHVBY3Rpb25zKCkpOwotCQlhY3Rpb25zLmFkZChBU0RBZGRGYXVsdEFjdGlvbi5JRCk7Ci0JCWFjdGlvbnMuYWRkKEFTRERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgYWN0aW9ucy5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0JCQotCQlTdHJpbmdbXSBhY3Rpb25JRHMgPSBuZXcgU3RyaW5nW2FjdGlvbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFjdGlvbnMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlhY3Rpb25JRHNbaW5kZXhdID0gKFN0cmluZykgYWN0aW9ucy5nZXQoaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gYWN0aW9uSURzOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRJbnB1dENvbW1hbmQoKSB7Ci0JCVcxMUFkZElucHV0UGFyYW1ldGVyQ29tbWFuZCBjb21tYW5kID0gbmV3IFcxMUFkZElucHV0UGFyYW1ldGVyQ29tbWFuZChnZXRPcGVyYXRpb24oKSk7Ci0JCQotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcikgZWRpdG9yLmdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotCQlpZiAobWFuYWdlci5nZXRDdXJyZW50TW9kZSgpLmdldElkKCkgIT0gRGVmYXVsdEVkaXRvck1vZGUuY2xhc3MuZ2V0TmFtZSgpKSB7Ci0JCQljb21tYW5kLnNldFBhcmFtZXRlclBhdHRlcm4oQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9FTEVNRU5UX1NFUV9FTEVNRU5UKTsKLQkJfQotCi0JCXJldHVybiBjb21tYW5kOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRPdXRwdXRDb21tYW5kKCkgewotCQlXMTFBZGRPdXRwdXRQYXJhbWV0ZXJDb21tYW5kIGNvbW1hbmQgPSBuZXcgVzExQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZChnZXRPcGVyYXRpb24oKSk7Ci0JCQotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcikgZWRpdG9yLmdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotCQlpZiAobWFuYWdlci5nZXRDdXJyZW50TW9kZSgpLmdldElkKCkgIT0gRGVmYXVsdEVkaXRvck1vZGUuY2xhc3MuZ2V0TmFtZSgpKSB7Ci0JCQljb21tYW5kLnNldFBhcmFtZXRlclBhdHRlcm4oQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9FTEVNRU5UX1NFUV9FTEVNRU5UKTsKLQkJfQotCi0JCXJldHVybiBjb21tYW5kOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRGYXVsdENvbW1hbmQoT2JqZWN0IGZhdWx0KSB7Ci0JCVcxMUFkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZCBjb21tYW5kID0gbmV3IFcxMUFkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZChnZXRPcGVyYXRpb24oKSwgbnVsbCk7Ci0JCQotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcikgZWRpdG9yLmdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotCQlpZiAobWFuYWdlci5nZXRDdXJyZW50TW9kZSgpLmdldElkKCkgIT0gRGVmYXVsdEVkaXRvck1vZGUuY2xhc3MuZ2V0TmFtZSgpKSB7Ci0JCQljb21tYW5kLnNldFBhcmFtZXRlclBhdHRlcm4oQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9FTEVNRU5UX1NFUV9FTEVNRU5UKTsKLQkJfQotCi0JCXJldHVybiBjb21tYW5kOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRSZW9yZGVyTWVzc2FnZVJlZmVyZW5jZXNDb21tYW5kKElNZXNzYWdlUmVmZXJlbmNlIGxlZnRTaWJsaW5nLCBJTWVzc2FnZVJlZmVyZW5jZSByaWdodFNpYmxpbmcsIElNZXNzYWdlUmVmZXJlbmNlIG1vdmluZ01lc3NhZ2VSZWYpIHsKLQkJcmV0dXJuIG5ldyBXMTFSZW9yZGVyTWVzc2FnZVJlZmVyZW5jZXNDb21tYW5kKGxlZnRTaWJsaW5nLCByaWdodFNpYmxpbmcsIG1vdmluZ01lc3NhZ2VSZWYpOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFcxMURlbGV0ZUNvbW1hbmQodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldFZhbGlkSW5wdXRPdXRwdUFjdGlvbnMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWlmIChnZXRPcGVyYXRpb24oKS5nZXRFSW5wdXQoKSA9PSBudWxsKSB7Ci0JCQlsaXN0LmFkZChBU0RBZGRJbnB1dEFjdGlvbi5JRCk7Ci0JCX0KLQkJaWYgKGdldE9wZXJhdGlvbigpLmdldEVPdXRwdXQoKSA9PSBudWxsKSB7Ci0JCQlsaXN0LmFkZChBU0RBZGRPdXRwdXRBY3Rpb24uSUQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9vcGVyYXRpb25fb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuICJvcGVyYXRpb24iOwotCX0KLQkKLQlwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCUxpc3QgbWVzc2FnZXMgPSBnZXRNZXNzYWdlcygpOwotCQlJVHJlZUVsZW1lbnRbXSB0cmVlRWxlbWVudHMgPSBuZXcgSVRyZWVFbGVtZW50W21lc3NhZ2VzLnNpemUoKV07Ci0JCQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQl0cmVlRWxlbWVudHNbaW5kZXhdID0gKElUcmVlRWxlbWVudCkgbWVzc2FnZXMuZ2V0KGluZGV4KTsKLQkJfQotCQkKLQkJcmV0dXJuIHRyZWVFbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJaWYgKGdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExUGFyYW1ldGVyRm9yQXR0cmlidXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMVBhcmFtZXRlckZvckF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWFhN2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExUGFyYW1ldGVyRm9yQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zLlcxMVNldEV4aXN0aW5nVHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zLlcxMVNldE5ld1R5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExRGVsZXRlUGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0REZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLlByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0vL2ltcG9ydCBjb20uaWJtLmNjbC5zb2Euc2RvLndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuU0RPVzExRGVsZXRlQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIFcxMVBhcmFtZXRlckZvckF0dHJpYnV0ZSBleHRlbmRzIFdTRExCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElQYXJhbWV0ZXIgewotCQotCXByb3RlY3RlZCBYU0RBdHRyaWJ1dGVVc2UgZ2V0WFNEQXR0cmlidXRlVXNlKCkgewotCQlyZXR1cm4gKFhTREF0dHJpYnV0ZVVzZSkgdGFyZ2V0OwotCX0KLQotCXByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRYU0RBdHR0cmlidXRlRGVjbGFyYXRpb24oKSB7Ci0JCVhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gZ2V0WFNEQXR0cmlidXRlVXNlKCk7Ci0JCXJldHVybiBhdHRyVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7CQkKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChJTWVzc2FnZVJlZmVyZW5jZSkgb3duZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0WFNEQXR0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKSB7Ci0JCVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gZ2V0WFNEQXR0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0JCQotCQlpZiAoYXR0ckRlY2wuZ2V0VHlwZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBhdHRyRGVjbC5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gImVycm9yOiBjb3VsZCBub3QgZ2V0IHR5cGUgbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcmV2aWV3KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWVRdWFsaWZpZXIoKSB7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEQXR0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgcmV0dXJuIHRkICE9IG51bGwgPyB0ZC5nZXRUYXJnZXROYW1lc3BhY2UoKSA6IG51bGw7Ci0JfQotCQotCSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICAgIExpc3QgYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAvL2xpc3QuYWRkKEFTREFkZE9wZXJhdGlvbkFjdGlvbi5JRCk7Ci0gICAgICAgICAgLy9saXN0LmFkZChBU0RBZGRJbnB1dEFjdGlvbi5JRCk7Ci0gICAgICAgICAgLy9saXN0LmFkZChBU0RBZGRPdXRwdXRBY3Rpb24uSUQpOwotICAgICAgICAgIC8vbGlzdC5hZGQoQVNEQWRkRmF1bHRBY3Rpb24uSUQpOwotICAgICAgICAgIGFjdGlvbnMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCArIE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX1RZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYWN0aW9ucy5hZGQoVzExU2V0TmV3VHlwZUFjdGlvbi5JRCk7Ci0gICAgICAgICAgYWN0aW9ucy5hZGQoVzExU2V0RXhpc3RpbmdUeXBlQWN0aW9uLklEKTsKLSAgICAgICAgICBhY3Rpb25zLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLQotICAgICAgICAgIGFjdGlvbnMuYWRkKEFTRERlbGV0ZUFjdGlvbi5JRCk7ICAgIAotICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbYWN0aW9ucy5zaXplKCldOwotICAgICAgICAgIGFjdGlvbnMudG9BcnJheShyZXN1bHQpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXMTFEZWxldGVQYXJhbWV0ZXJDb21tYW5kKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBnZXRTZXRUeXBlQ29tbWFuZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0UGFyYW1ldGVyU3RyaW5nKCkgKyAiIC0gYXR0cmlidXRlIjsgCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFBhcmFtZXRlclN0cmluZygpIHsKLQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQlPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpIHsKLQkJCVByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKW9iamVjdDsKLQkJCVN0cmluZyBuZXdTdHJpbmcgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldFByb2R1Y3RTdHJpbmcoIl9VSV9MQUJFTF9QQVJBTUVURVIiKTsKLQkJCWlmIChuZXdTdHJpbmcgIT0gbnVsbCkgewotCQkJCXN0cmluZyA9IG5ld1N0cmluZzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdHJpbmc7Ci0JfQotCSAgCi0JcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IElUcmVlRWxlbWVudFswXTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVHJlZUVsZW1lbnQgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMVBhcmFtZXRlckZvckVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExUGFyYW1ldGVyRm9yRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJmY2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExUGFyYW1ldGVyRm9yRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFTZXRFeGlzdGluZ1R5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFTZXROZXdUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMURlbGV0ZVBhcmFtZXRlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExUmVuYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFTZXRUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0REZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLlByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIFcxMVBhcmFtZXRlckZvckVsZW1lbnQgZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJUGFyYW1ldGVyCi17Ci0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgewotICAgIHJldHVybiAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgdGFyZ2V0KS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0JU3RyaW5nIGNvbXBOYW1lID0gIiI7Ly8gKyBNZXNzYWdlcy5nZXRTdHJpbmcoIl9VSV9MQUJFTF9OT19UWVBFX1NQRUNJRklFRCIpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgIFhTRFR5cGVEZWZpbml0aW9uIGFub255bW91c1R5cGUgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAKLSAgICBpZiAoYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgIGNvbXBOYW1lID0gIioqYW5vbnltb3VzKioiOyAKLSAgICB9Ci0KLSAgICByZXR1cm4gKHRkICE9IG51bGwgJiYgdGQuZ2V0TmFtZSgpICE9IG51bGwpID8gdGQuZ2V0TmFtZSgpIDogY29tcE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJldmlldygpIHsKLQkgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICByZXR1cm4gdGQgIT0gbnVsbCA/IHRkLmdldFRhcmdldE5hbWVzcGFjZSgpIDogbnVsbDsKLSAgIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsKLQkgIExpc3QgYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIC8vbGlzdC5hZGQoQVNEQWRkT3BlcmF0aW9uQWN0aW9uLklEKTsKLSAgICAgIC8vbGlzdC5hZGQoQVNEQWRkSW5wdXRBY3Rpb24uSUQpOwotICAgICAgLy9saXN0LmFkZChBU0RBZGRPdXRwdXRBY3Rpb24uSUQpOwotICAgICAgLy9saXN0LmFkZChBU0RBZGRGYXVsdEFjdGlvbi5JRCk7Ci0gICAgICBhY3Rpb25zLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9UWVBFKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYWN0aW9ucy5hZGQoVzExU2V0TmV3VHlwZUFjdGlvbi5JRCk7Ci0gICAgICBhY3Rpb25zLmFkZChXMTFTZXRFeGlzdGluZ1R5cGVBY3Rpb24uSUQpOwotICAgICAgYWN0aW9ucy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0gICAgIAotICAgICAgYWN0aW9ucy5hZGQoQVNERGVsZXRlQWN0aW9uLklEKTsJICAKLSAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbYWN0aW9ucy5zaXplKCldOwotICAgICAgYWN0aW9ucy50b0FycmF5KHJlc3VsdCk7Ci0JICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFcxMURlbGV0ZVBhcmFtZXRlckNvbW1hbmQodGhpcyk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRTZXRUeXBlQ29tbWFuZChTdHJpbmcgYWN0aW9uSWQpIHsKLQkgIHJldHVybiBuZXcgVzExU2V0VHlwZUNvbW1hbmQodGhpcy5nZXRUYXJnZXQoKSwgYWN0aW9uSWQpOwotICB9Ci0gIAotICBwdWJsaWMgQ29tbWFuZCBnZXRTZXROYW1lQ29tbWFuZChTdHJpbmcgbmV3TmFtZSkgeyAgICAKLSAgICByZXR1cm4gbmV3IFcxMVJlbmFtZUNvbW1hbmQodGhpcywgbmV3TmFtZSkgewotICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgCQl0cnkgewotCQkJYmVnaW5SZWNvcmRpbmcoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpKTsKLQkJCWdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLnNldE5hbWUobmV3TmFtZSk7Ci0gIAkJfQotICAJCWZpbmFsbHkgewotICAJCQllbmRSZWNvcmRpbmcoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpKTsKLSAgCQl9Ci0gICAgICB9Ci0gICAgfTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldE93bmVyKCkKLSAgewotCSAgcmV0dXJuIChJTWVzc2FnZVJlZmVyZW5jZSkgb3duZXI7Ci0gIH0KLSAgCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0UGFyYW1ldGVyU3RyaW5nKCkgKyAiIC0gZWxlbWVudCI7IAotCX0KLQkKLQkgIHByaXZhdGUgU3RyaW5nIGdldFBhcmFtZXRlclN0cmluZygpIHsKLQkJICBTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCSAgT2JqZWN0IG9iamVjdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKCk7Ci0JCSAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpIHsKLQkJCSAgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpb2JqZWN0OwotCQkJICBTdHJpbmcgbmV3U3RyaW5nID0gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5nZXRQcm9kdWN0U3RyaW5nKCJfVUlfTEFCRUxfUEFSQU1FVEVSIik7Ci0JCQkgIGlmIChuZXdTdHJpbmcgIT0gbnVsbCkgewotCQkJCSAgc3RyaW5nID0gbmV3U3RyaW5nOwotCQkJICB9Ci0JCSAgfQotCi0JCSAgcmV0dXJuIHN0cmluZzsKLQkgIH0KLQkKLQlwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgSVRyZWVFbGVtZW50WzBdOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExUGFyYW1ldGVyRm9yUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFQYXJhbWV0ZXJGb3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzI1ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9iYXNpYy9XMTFQYXJhbWV0ZXJGb3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYWN0aW9ucy5XMTFBZGRQYXJ0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmFjdGlvbnMuVzExU2V0RXhpc3RpbmdFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmFjdGlvbnMuVzExU2V0RXhpc3RpbmdUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmFjdGlvbnMuVzExU2V0TmV3RWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5hY3Rpb25zLlcxMVNldE5ld1R5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFTZXRFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFTZXRUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRGYXVsdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRPcGVyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNERGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5maWd1cmVzLk1vZGVsRGlhZ25vc3RpY0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yLldTRExWaXNpdG9yRm9yUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVzExUGFyYW1ldGVyRm9yUGFydCBleHRlbmRzIFdTRExCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElQYXJhbWV0ZXIKLXsKLSAgcHJvdGVjdGVkIFBhcnQgZ2V0UGFydCgpCi0gIHsKLSAgICByZXR1cm4gKFBhcnQpIHRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UGFydCgpLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICBpZiAoZ2V0UGFydCgpLmdldEVsZW1lbnREZWNsYXJhdGlvbigpICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZ2V0UGFydCgpLmdldEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZ2V0UGFydCgpLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0UGFydCgpLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGdldE5vTmFtZVNwZWNpZmllZFN0cmluZygpOwotICAgIH0gIAotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROb05hbWVTcGVjaWZpZWRTdHJpbmcoKSB7Ci0JICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgaWYgKGdldFBhcnQoKS5nZXRFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIGdldFBhcnQoKS5nZXRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZ2V0UGFydCgpLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0UGFydCgpLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAKLSAgICAgIHJldHVybiAiKG5vIG5hbWVzcGFjZSBzcGVjaWZpZWQpIjsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcmV2aWV3KCkgewotCSAgU3RyaW5nIHByZXZpZXcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCSAgCi0vLyAgICAgIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIFdTRExWaXNpdG9yRm9yUGFyYW1ldGVycyB2aXNpdG9yRm9yUGFyYW1ldGVycyA9IG5ldyBXU0RMVmlzaXRvckZvclBhcmFtZXRlcnMoKTsKLSAgICAgIHZpc2l0b3JGb3JQYXJhbWV0ZXJzLnZpc2l0TWVzc2FnZSgoTWVzc2FnZSkgZ2V0UGFydCgpLmVDb250YWluZXIoKSk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIGl0ID0gdmlzaXRvckZvclBhcmFtZXRlcnMuY29uY3JldGVDb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCSAgU3RyaW5nIHN0cmluZ0l0ZW0gPSBudWxsOwotICAgIAkgIE9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotICAgIAkgIGlmIChpdGVtIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0gICAgCQkgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaXRlbTsKLSAgICAJCSAgeHNkRWxlbWVudCA9IHhzZEVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAJCSAgaWYgKHhzZEVsZW1lbnQuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgCQkJICBzdHJpbmdJdGVtID0geHNkRWxlbWVudC5nZXRUeXBlRGVmaW5pdGlvbigpLmdldE5hbWUoKTsKLSAgICAJCSAgfQotICAgICAJICB9Ci0gICAgCSAgZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkgewotICAgIAkJICBzdHJpbmdJdGVtID0gKChYU0RBdHRyaWJ1dGVVc2UpIGl0ZW0pLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgIAkgIH0KLSAgICAJICAKLSAgICAJICBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGFydCkgewotICAgIAkJICBpZiAoKChQYXJ0KSBpdGVtKS5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpIHsKLSAgICAJCQkgIHN0cmluZ0l0ZW0gPSAoKFBhcnQpIGl0ZW0pLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOwotICAgIAkJICB9Ci0gICAgCSAgfQotICAgIAkgIAotICAgIAkgIGlmIChzdHJpbmdJdGVtICE9IG51bGwpIHsKLSAgICAJCSAgcHJldmlldyA9IHByZXZpZXcgKyBzdHJpbmdJdGVtICsgIiwgIjsgLy8kTk9OLU5MUy0xJAotICAgIAkgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHByZXZpZXcubGVuZ3RoKCkgLTIgPiAwKSB7Ci0gICAgCSAgcHJldmlldyA9IHByZXZpZXcuc3Vic3RyaW5nKDAsIHByZXZpZXcubGVuZ3RoKCkgLSAyKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuICIoIiArIHByZXZpZXcgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KSB7Ci0JICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yUGFydCkgewotCQkgIElPcGVyYXRpb24gb3BlcmF0aW9uID0gKChJTWVzc2FnZVJlZmVyZW5jZSkgZ2V0T3duZXIoKSkuZ2V0T3duZXJPcGVyYXRpb24oKTsKLQotCQkgIExpc3QgYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJICBhY3Rpb25zLmFkZChXMTFBZGRQYXJ0QWN0aW9uLklEKTsKLQkJICBhY3Rpb25zLmFkZChBU0RBZGRPcGVyYXRpb25BY3Rpb24uSUQpOwotCQkgIGFjdGlvbnMuYWRkQWxsKCgoVzExT3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldFZhbGlkSW5wdXRPdXRwdUFjdGlvbnMoKSk7Ci0JCSAgYWN0aW9ucy5hZGQoQVNEQWRkRmF1bHRBY3Rpb24uSUQpOwotCQkgIAotCQkgIGFjdGlvbnMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCArIE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX1RZUEUpOyAvLyROT04tTkxTLTEkCi0JCSAgYWN0aW9ucy5hZGQoVzExU2V0TmV3VHlwZUFjdGlvbi5JRCk7Ci0JCSAgYWN0aW9ucy5hZGQoVzExU2V0RXhpc3RpbmdUeXBlQWN0aW9uLklEKTsKLQkJICBhY3Rpb25zLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLQotCQkgIGFjdGlvbnMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCArIE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCSAgYWN0aW9ucy5hZGQoVzExU2V0TmV3RWxlbWVudEFjdGlvbi5JRCk7Ci0JCSAgYWN0aW9ucy5hZGQoVzExU2V0RXhpc3RpbmdFbGVtZW50QWN0aW9uLklEKTsKLQkJICBhY3Rpb25zLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsJCSAgCi0JCSAgCi0JCSAgYWN0aW9ucy5hZGQoQVNERGVsZXRlQWN0aW9uLklEKTsKLSAgICAgIAotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBhY3Rpb25zLmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgfQotCQkgIAotCQkgIFN0cmluZ1tdIGFjdGlvbklEcyA9IG5ldyBTdHJpbmdbYWN0aW9ucy5zaXplKCldOwotCQkgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhY3Rpb25zLnNpemUoKTsgaW5kZXgrKykgewotCQkJICBhY3Rpb25JRHNbaW5kZXhdID0gKFN0cmluZykgYWN0aW9ucy5nZXQoaW5kZXgpOwotCQkgIH0KLQkgIAotCQkgIHJldHVybiBhY3Rpb25JRHM7Ci0JICB9Ci0JICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsKLQkJICBTdHJpbmdbXSBhY3Rpb25JRHMgPSBuZXcgU3RyaW5nWzJdOwotCQkgIGFjdGlvbklEc1swXSA9IFcxMUFkZFBhcnRBY3Rpb24uSUQ7Ci0JCSAgYWN0aW9uSURzWzFdID0gQVNERGVsZXRlQWN0aW9uLklEOwotCQkgIAotCQkgIHJldHVybiBhY3Rpb25JRHM7Ci0JICB9Ci0JICAKLQkgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLQkgIHJldHVybiBuZXcgVzExRGVsZXRlQ29tbWFuZCh0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0T3duZXIoKQotICB7Ci0JICByZXR1cm4gb3duZXI7Ci0gIH0KLSAgCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wYXJ0X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgICAKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0U2Vjb25kYXJ5SW1hZ2UoKSB7Ci0gICAgICAKLSAgICAgIGlmIChnZXRQYXJ0KCkuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9lbGVtZW50X29iai5naWYiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGdldFBhcnQoKS5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChnZXRQYXJ0KCkuZ2V0VHlwZURlZmluaXRpb24oKSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgeyAgCi0gICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvY29tcGxleHR5cGVfb2JqLmdpZiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3NpbXBsZXR5cGVfb2JqLmdpZiIpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgIAotICAgICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wYXJ0X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfSAgCi0gICAgfSAgICAKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiAicGFydCI7Ci0JfQotCQotCXB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBJVHJlZUVsZW1lbnRbMF07Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldFNldFR5cGVDb21tYW5kKFN0cmluZyBhY3Rpb25JZCkgewotCQlyZXR1cm4gbmV3IFcxMVNldFR5cGVDb21tYW5kKChQYXJ0KSB0aGlzLmdldFRhcmdldCgpLCBhY3Rpb25JZCk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIGdldFNldEVsZW1lbnRDb21tYW5kKFN0cmluZyBhY3Rpb25JZCkgewotCQlyZXR1cm4gbmV3IFcxMVNldEVsZW1lbnRDb21tYW5kKChQYXJ0KSB0aGlzLmdldFRhcmdldCgpLCBhY3Rpb25JZCk7Ci0JfQotCQotCS8vIFRPRE86IFdlIHNob3VsZCBtb3ZlIHRoZSBpc1R5cGUoKSBtZXRob2QgdG8gdGhlIElQYXJhbWV0ZXIgSW50ZXJmYWNlLi4uLi4uLi4KLQlwdWJsaWMgYm9vbGVhbiBpc1R5cGUoKSB7Ci0JCVBhcnQgcGFydCA9IChQYXJ0KSB0YXJnZXQ7Ci0JCWlmIChwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXREaWFnbm9zdGljTWVzc2FnZXMoKSB7Ci0JCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlQYXJ0IHBhcnQgPSAoUGFydCkgZ2V0VGFyZ2V0KCk7Ci0JCWlmIChwYXJ0LmdldEVsZW1lbnREZWNsYXJhdGlvbigpID09IG51bGwgJiYgcGFydC5nZXRUeXBlRGVmaW5pdGlvbigpID09IG51bGwpIHsKLQkJCVN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nWzJdOwotCQkJYXJnc1swXSA9ICJlbGVtZW50IjsKLQkJCWFyZ3NbMV0gPSAidHlwZSI7Ci0JCQlTdHJpbmcgbmV3U3RyaW5nID0gZ2V0U3RyaW5nRm9yS2V5KCJfVUlfTEFCRUxfT1JfVU5ERUZJTkVEX0FSRzIiLCBhcmdzKTsKLQkJCU1vZGVsRGlhZ25vc3RpY0luZm8gaW5mbyA9IG5ldyBNb2RlbERpYWdub3N0aWNJbmZvKG5ld1N0cmluZywgTW9kZWxEaWFnbm9zdGljSW5mby5FUlJPUl9UWVBFLCBudWxsKTsKLQkJCWVycm9ycy5hZGQoaW5mbyk7Ci0JCX0KLQkJCi0JCXJldHVybiBlcnJvcnM7Ci0JfQotCQotCSAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nRm9yS2V5KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJICBTdHJpbmcgbmV3U3RyaW5nID0gIiI7Ci0JCSAgbmV3U3RyaW5nID0gTWVzc2FnZXMuZ2V0U3RyaW5nKGtleSwgYXJncyk7Ci0KLQkJICBPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIoKTsKLQkJICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikgewotCQkJICBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcilvYmplY3Q7Ci0JCQkgIFN0cmluZyBjdXN0b21pemVkU3RyaW5nID0gIiI7Ci0JCQkgIGlmIChhcmdzID09IG51bGwpIHsKLQkJCQkgIGN1c3RvbWl6ZWRTdHJpbmcgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldFByb2R1Y3RTdHJpbmcoa2V5KTsKLQkJCSAgfQotCQkJICBlbHNlIHsKLQkJCQkgIGN1c3RvbWl6ZWRTdHJpbmcgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldFByb2R1Y3RTdHJpbmcoa2V5LCBhcmdzKTsKLQkJCSAgfQotCQkJICAKLQkJCSAgaWYgKGN1c3RvbWl6ZWRTdHJpbmcgIT0gbnVsbCAmJiAhY3VzdG9taXplZFN0cmluZy5lcXVhbHMoIiIpKSB7Ci0JCQkJICBuZXdTdHJpbmcgPSBjdXN0b21pemVkU3RyaW5nOwotCQkJICB9Ci0JCSAgfQotCi0JCSAgaWYgKG5ld1N0cmluZyA9PSBudWxsKSB7Ci0JCQkgIG5ld1N0cmluZyA9ICIiOwotCQkgIH0KLQotCQkgIHJldHVybiBuZXdTdHJpbmc7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMVNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmY5Zjg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkRW5kUG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMURlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkRW5kUG9pbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNERGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmUuSVRyZWVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVzExU2VydmljZSBleHRlbmRzIFdTRExCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElTZXJ2aWNlIHsKLQotCXB1YmxpYyBMaXN0IGdldEVuZFBvaW50cygpIHsKLQkJTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBlbmRQb2ludHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gKChTZXJ2aWNlKSB0YXJnZXQpLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVuZFBvaW50cy5hZGQoaXQubmV4dCgpKTsKLQkJfQotCQkKLQkJQ29sbGVjdGlvbnMuc29ydChlbmRQb2ludHMsIG5ldyBFbmRQb2ludENvbXBhcmF0b3IoKSk7Ci0JCXBvcHVsYXRlQWRhcHRlckxpc3QoZW5kUG9pbnRzLCBhZGFwdGVyTGlzdCk7Ci0KLQkJcmV0dXJuIGFkYXB0ZXJMaXN0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICgoU2VydmljZSkgdGFyZ2V0KS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiBnZXRFbmRQb2ludHMoKTsKLQl9Ci0JCi0JcHVibGljIElEZXNjcmlwdGlvbiBnZXRPd25lckRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKElEZXNjcmlwdGlvbikgb3duZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsKLSAgICBMaXN0IGFjdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWN0aW9uSURzLmFkZChBU0RBZGRFbmRQb2ludEFjdGlvbi5JRCk7Ci0JCWFjdGlvbklEcy5hZGQoQVNERGVsZXRlQWN0aW9uLklEKTsKLQotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgIGFjdGlvbklEcy5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBDb21tYW5kIGdldEFkZEVuZFBvaW50Q29tbWFuZCgpIHsKLSAgICAgIHJldHVybiBuZXcgVzExQWRkRW5kUG9pbnRDb21tYW5kKChTZXJ2aWNlKXRhcmdldCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKSB7Ci0gICAgCXJldHVybiBuZXcgVzExRGVsZXRlQ29tbWFuZCh0aGlzKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9zZXJ2aWNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiAic2VydmljZSI7Ci0JfQotCQotCXB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBlbmRQb2ludHMgPSBnZXRFbmRQb2ludHMoKTsKLQkJSVRyZWVFbGVtZW50W10gdHJlZUVsZW1lbnRzID0gbmV3IElUcmVlRWxlbWVudFtlbmRQb2ludHMuc2l6ZSgpXTsKLQkJCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbmRQb2ludHMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQl0cmVlRWxlbWVudHNbaW5kZXhdID0gKElUcmVlRWxlbWVudCkgZW5kUG9pbnRzLmdldChpbmRleCk7Ci0JCX0KLQkJCi0JCXJldHVybiB0cmVlRWxlbWVudHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCWlmIChnZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLSAgICAKLQlwcml2YXRlIGNsYXNzIEVuZFBvaW50Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCSAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JICAgIGlmIChvMSBpbnN0YW5jZW9mIFBvcnQgJiYgbzIgaW5zdGFuY2VvZiBQb3J0KSB7Ci0JICAgICAgQmluZGluZyBiaW5kaW5nMSA9ICgoUG9ydCkgbzEpLmdldEVCaW5kaW5nKCk7Ci0JICAgICAgQmluZGluZyBiaW5kaW5nMiA9ICgoUG9ydCkgbzIpLmdldEVCaW5kaW5nKCk7Ci0KLQkgICAgICBpZiAoYmluZGluZzEgIT0gbnVsbCAmJiBiaW5kaW5nMiA9PSBudWxsKSB7Ci0JICAgICAgICByZXR1cm4gLTE7Ci0JICAgICAgfQotCSAgICAgIGVsc2UgaWYgKGJpbmRpbmcxID09IG51bGwgJiYgYmluZGluZzIgIT0gbnVsbCkgewotCSAgICAgICAgcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICAgIGVsc2UgaWYgKGJpbmRpbmcxID09IG51bGwgJiYgYmluZGluZzIgPT0gbnVsbCkgewotCSAgICAJICByZXR1cm4gMDsKLQkgICAgICB9Ci0JICAgICAgCi0JICAgICAgUG9ydFR5cGUgcG9ydFR5cGUxID0gYmluZGluZzEuZ2V0RVBvcnRUeXBlKCk7Ci0JICAgICAgUG9ydFR5cGUgcG9ydFR5cGUyID0gYmluZGluZzIuZ2V0RVBvcnRUeXBlKCk7Ci0KLQkgICAgICBpZiAocG9ydFR5cGUxICE9IG51bGwgJiYgcG9ydFR5cGUyICE9IG51bGwpIHsKLQkgICAgICAgIFN0cmluZyBuYW1lMSA9IHBvcnRUeXBlMS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCSAgICAgICAgU3RyaW5nIG5hbWUyID0gcG9ydFR5cGUyLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JICAgICAgICByZXR1cm4gbmFtZTEuY29tcGFyZVRvKG5hbWUyKTsKLQkgICAgICB9Ci0JICAgICAgZWxzZSBpZiAocG9ydFR5cGUxICE9IG51bGwgJiYgcG9ydFR5cGUyID09IG51bGwpIHsKLQkgICAgICAgIHJldHVybiAtMTsKLQkgICAgICB9Ci0JICAgICAgZWxzZSBpZiAocG9ydFR5cGUxID09IG51bGwgJiYgcG9ydFR5cGUyICE9IG51bGwpIHsKLQkgICAgICAgIHJldHVybiAxOwotCSAgICAgIH0KLQkgICAgfQotCi0JICAgIHJldHVybiAwOwotCSAgfQotCX0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM4M2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMURlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNERGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTRE9wZW5TY2hlbWFBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFcxMVR5cGUgZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJVHlwZSB7Ci0JcHVibGljIElEZXNjcmlwdGlvbiBnZXRPd25lckRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKElEZXNjcmlwdGlvbikgb3duZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlYU0RTY2hlbWEgc2NoZW1hPSAoWFNEU2NoZW1hKSB0YXJnZXQ7Ci0JCXJldHVybiBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nW10gYWN0aW9uSURzID0gbmV3IFN0cmluZ1syXTsKLQkJYWN0aW9uSURzWzBdID0gQVNET3BlblNjaGVtYUFjdGlvbi5JRDsKLQkJYWN0aW9uSURzWzFdID0gQVNERGVsZXRlQWN0aW9uLklEOwkKLQkJcmV0dXJuIGFjdGlvbklEczsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy94c2Rfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuICJzY2hlbWEiOwotCX0KLQlwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgSVRyZWVFbGVtZW50WzBdOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvLyBUT0RPOiBybWFoOiBNb3ZlIHRoaXMgbWV0aG9kIHNpZ25hdHVyZSB0byB0aGUgaW50ZXJmYWNlIChJVHlwZSkgb2YgdGhpcyBjbGFzcyBwb3N0IFdUUCAxLjUKLQlwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFcxMURlbGV0ZUNvbW1hbmQodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExVHlwZXNDYXRlZ29yeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvYmFzaWMvVzExVHlwZXNDYXRlZ29yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4NTQxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2Jhc2ljL1cxMVR5cGVzQ2F0ZWdvcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmUuSVRyZWVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVzExVHlwZXNDYXRlZ29yeUFkYXB0ZXIgZXh0ZW5kcyBXMTFDYXRlZ29yeUFkYXB0ZXIgewotCXB1YmxpYyBXMTFUeXBlc0NhdGVnb3J5QWRhcHRlcihJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIFN0cmluZyBsYWJlbCwgSW1hZ2UgaW1hZ2UsIGludCBncm91cFR5cGUpIHsKLQkJc3VwZXIoZGVzY3JpcHRpb24sIGxhYmVsLGltYWdlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBncm91cFR5cGUpOwotCX0KLQotCXB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCB0eXBlcyA9ICgoVzExRGVzY3JpcHRpb24pIGdldE93bmVyRGVzY3JpcHRpb24oKSkuZ2V0VHlwZXMoKTsKLQkJcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgdHlwZXMudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZEJpbmRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZEJpbmRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNWQ1NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFBZGRCaW5kaW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLklBU0RBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZEJpbmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBXMTFBZGRCaW5kaW5nQ29tbWFuZCBleHRlbmRzIFcxMVRvcExldmVsRWxlbWVudENvbW1hbmQgaW1wbGVtZW50cyBJQVNEQWRkQ29tbWFuZCB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZTsKLQlwcml2YXRlIEJpbmRpbmcgbmV3QmluZGluZzsKLQkKLQlwdWJsaWMgVzExQWRkQmluZGluZ0NvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQklORElORywgZGVmaW5pdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5ld0JpbmRpbmdOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCQotCXB1YmxpYyBCaW5kaW5nIGdldE5ld0JpbmRpbmcoKSB7Ci0JCXJldHVybiBuZXdCaW5kaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJYmVnaW5SZWNvcmRpbmcoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJaWYgKG5ld05hbWUgPT0gbnVsbCB8fCBuZXdOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5ld05hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZUJpbmRpbmdOYW1lKGRlZmluaXRpb24sICJOZXdCaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJQWRkQmluZGluZ0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRCaW5kaW5nQ29tbWFuZChkZWZpbml0aW9uLCBuZXdOYW1lKTsKLQkJCWNvbW1hbmQucnVuKCk7Ci0JCQkKLQkJCW5ld0JpbmRpbmcgPSAoQmluZGluZykgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQkJZm9ybWF0Q2hpbGQobmV3QmluZGluZy5nZXRFbGVtZW50KCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE5ld2x5QWRkZWRDb21wb25lbnQoKSB7Ci0JCXJldHVybiBuZXdCaW5kaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkRW5kUG9pbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZEVuZFBvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjRlMzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkRW5kUG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5JQVNEQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzLlBvcnRXaXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBXMTFBZGRFbmRQb2ludENvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIGltcGxlbWVudHMgSUFTREFkZENvbW1hbmQKLXsKLSAgICBwcml2YXRlIFNlcnZpY2Ugc2VydmljZTsKLSAgICBwcml2YXRlIFBvcnQgcG9ydDsKLSAgICAKLSAgICBwdWJsaWMgVzExQWRkRW5kUG9pbnRDb21tYW5kKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0FERCwgc2VydmljZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJYmVnaW5SZWNvcmRpbmcoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCQkJCi0JICAgIAlQb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBQb3J0V2l6YXJkKHNlcnZpY2UpOwotCQkJV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCXdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQotCQkJaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmVzdWx0ID09IFdpbmRvdy5PSyAmJiBzZXJ2aWNlLmdldEVQb3J0cygpLnNpemUoKSA+IDApIHsKLQkJCQlMaXN0IHBvcnRzID0gc2VydmljZS5nZXRFUG9ydHMoKTsKLQkJCQlwb3J0ID0gKFBvcnQpIHBvcnRzLmdldChwb3J0cy5zaXplKCkgLSAxKTsKLQkJCQkKLQkJCQlmb3JtYXRDaGlsZChwb3J0LmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmRSZWNvcmRpbmcoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCQl9Ci0gICAgfQotCi0JcHVibGljIE9iamVjdCBnZXROZXdseUFkZGVkQ29tcG9uZW50KCkgewotCQlyZXR1cm4gcG9ydDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFBZGRGYXVsdFBhcmFtZXRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0YmU0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5JQVNEQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCYXNlUGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRGYXVsdFBhcmFtZXRlckNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBXMTFBZGRGYXVsdFBhcmFtZXRlckNvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIGltcGxlbWVudHMgSUFTREFkZENvbW1hbmQgewotCXByb3RlY3RlZCBPcGVyYXRpb24gb3BlcmF0aW9uOwotCXByb3RlY3RlZCBGYXVsdCBmYXVsdDsKLQlwcm90ZWN0ZWQgT2JqZWN0IG5ld09iamVjdDsKLQlwcml2YXRlIGludCBwYXJhbWV0ZXJQYXR0ZXJuID0gLTE7Ci0JCi0JcHVibGljIFcxMUFkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBGYXVsdCBmYXVsdCkgewotICAgICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9GQVVMVCwgb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCXRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotCQl0aGlzLmZhdWx0ID0gZmF1bHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlclBhdHRlcm4oaW50IHBhdHRlcm4pIHsKLQkJcGFyYW1ldGVyUGF0dGVybiA9IHBhdHRlcm47Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQliZWdpblJlY29yZGluZyhvcGVyYXRpb24uZ2V0RWxlbWVudCgpKTsKLQotCQkJaWYgKHBhcmFtZXRlclBhdHRlcm4gPT0gLTEpIHsKLQkJCQkvLyBEZXRlcm1pbmUgd2hpY2ggUGF0dGVybiB3ZSBzaG91bGQgdXNlLiAgRm9yIGV4YW1wbGUsIEFEREJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfRUxFTUVOVF9TRVFfRUxFTUVOVAotCQkJCXBhcmFtZXRlclBhdHRlcm4gPSBBZGRGYXVsdFBhcmFtZXRlckNvbW1hbmQuZ2V0UGFyYW1ldGVyUGF0dGVybkZvckZhdWx0KG9wZXJhdGlvbiwgZmF1bHQpOwotCQkJCWlmIChwYXJhbWV0ZXJQYXR0ZXJuID09IC0xKSB7Ci0JCQkJCXBhcmFtZXRlclBhdHRlcm4gPSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5nZXRQYXJhbWV0ZXJQYXR0ZXJuKG9wZXJhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlBZGRGYXVsdFBhcmFtZXRlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRGYXVsdFBhcmFtZXRlckNvbW1hbmQob3BlcmF0aW9uLCBmYXVsdCk7Ci0JCQljb21tYW5kLnNldFN0eWxlKHBhcmFtZXRlclBhdHRlcm4pOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCWZhdWx0ID0gY29tbWFuZC5nZXRGYXVsdCgpOwotCQkJbmV3T2JqZWN0ID0gY29tbWFuZC5nZXROZXdseUFkZGVkQ29tcG9uZW50UGFydCgpOwotCQkJCi0JCQlpZiAoY29tbWFuZC5nZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJLy8gVHJ5IHRvIGdyYWIgdGhlICJpbm5lciIgWFNERWxlbWVudAotCQkJCW5ld09iamVjdCA9IGdldE5ld1hTREVsZW1lbnQoY29tbWFuZC5nZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmRSZWNvcmRpbmcob3BlcmF0aW9uLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXROZXdseUFkZGVkQ29tcG9uZW50KCkgewotCQlyZXR1cm4gbmV3T2JqZWN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZEltcG9ydENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkSW1wb3J0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGEyZjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkSW1wb3J0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuSUFTREFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkSW1wb3J0Q29tbWFuZDsKLQotcHVibGljIGNsYXNzIFcxMUFkZEltcG9ydENvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIGltcGxlbWVudHMgSUFTREFkZENvbW1hbmQgewotCXByaXZhdGUgT2JqZWN0IGNvbXBvbmVudDsKLQkKLQlwdWJsaWMgVzExQWRkSW1wb3J0Q29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfSU1QT1JULCBkZWZpbml0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJU3RyaW5nIG5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJQWRkSW1wb3J0Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEltcG9ydENvbW1hbmQoZGVmaW5pdGlvbiwgbmFtZXNwYWNlLCBsb2NhdGlvbik7Ci0JCQljb21tYW5kLnJ1bigpOwotCQkJZm9ybWF0Q2hpbGQoY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpLmdldEVsZW1lbnQoKSk7Ci0JCQljb21wb25lbnQgPSBjb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmRSZWNvcmRpbmcoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXROZXdseUFkZGVkQ29tcG9uZW50KCkgewotCQlyZXR1cm4gY29tcG9uZW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZElucHV0UGFyYW1ldGVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFBZGRJbnB1dFBhcmFtZXRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExOTI5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZElucHV0UGFyYW1ldGVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5JQVNEQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCYXNlUGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRJbnB1dFBhcmFtZXRlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgVzExQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kIGV4dGVuZHMgVzExVG9wTGV2ZWxFbGVtZW50Q29tbWFuZCBpbXBsZW1lbnRzIElBU0RBZGRDb21tYW5kewotCXByb3RlY3RlZCBPcGVyYXRpb24gb3BlcmF0aW9uOwotCXByaXZhdGUgT2JqZWN0IGlucHV0OwotCXByaXZhdGUgaW50IHBhcmFtZXRlclBhdHRlcm4gPSAtMTsKLQkKLQlwdWJsaWMgVzExQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfSU5QVVQsIG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQl0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyUGF0dGVybihpbnQgcGF0dGVybikgewotCQlwYXJhbWV0ZXJQYXR0ZXJuID0gcGF0dGVybjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKG9wZXJhdGlvbi5nZXRFbGVtZW50KCkpOwotCi0JCQlpZiAocGFyYW1ldGVyUGF0dGVybiA9PSAtMSkgewotCQkJCS8vIERldGVybWluZSB3aGljaCBQYXR0ZXJuIHdlIHNob3VsZCB1c2UuICBGb3IgZXhhbXBsZSwgQUREQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9FTEVNRU5UX1NFUV9FTEVNRU5UCi0JCQkJcGFyYW1ldGVyUGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLmdldFBhcmFtZXRlclBhdHRlcm4ob3BlcmF0aW9uLCB0cnVlKTsKLQkJCQlpZiAocGFyYW1ldGVyUGF0dGVybiA9PSAtMSkgewotCQkJCQlwYXJhbWV0ZXJQYXR0ZXJuID0gQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuZ2V0UGFyYW1ldGVyUGF0dGVybihvcGVyYXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kKG9wZXJhdGlvbiwgcGFyYW1ldGVyUGF0dGVybik7Ci0JCQljb21tYW5kLnJ1bigpOwotCQkJaW5wdXQgPSBjb21tYW5kLmdldE5ld2x5QWRkZWRDb21wb25lbnRQYXJ0KCk7Ci0JCQkKLQkJCWZvcm1hdENoaWxkKG9wZXJhdGlvbi5nZXRFSW5wdXQoKS5nZXRFbGVtZW50KCkpOwotCQkJaWYgKGNvbW1hbmQuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkgewotCQkJCS8vIFRyeSB0byBncmFiIHRoZSAiaW5uZXIiIFhTREVsZW1lbnQKLQkJCQlpbnB1dCA9IGdldE5ld1hTREVsZW1lbnQoY29tbWFuZC5nZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0JCQkJZm9ybWF0Q2hpbGQoZ2V0WFNEUGFyZW50KGNvbW1hbmQuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpLmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmRSZWNvcmRpbmcob3BlcmF0aW9uLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldFhTRFBhcmVudChYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2QpIHsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0geHNkLmdldFNjaGVtYSgpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE5ld2x5QWRkZWRDb21wb25lbnQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZEludGVyZmFjZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkSW50ZXJmYWNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2VmN2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkSW50ZXJmYWNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuSUFTREFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFBvcnRUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyOwotCi1wdWJsaWMgY2xhc3MgVzExQWRkSW50ZXJmYWNlQ29tbWFuZCBleHRlbmRzIFcxMVRvcExldmVsRWxlbWVudENvbW1hbmQgaW1wbGVtZW50cyBJQVNEQWRkQ29tbWFuZCB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZTsKLQlwcml2YXRlIFBvcnRUeXBlIG5ld1BvcnRUeXBlOwotCQotCXB1YmxpYyBXMTFBZGRJbnRlcmZhY2VDb21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BPUlRUWVBFLCBkZWZpbml0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmV3UG9ydFR5cGVOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCQotCXB1YmxpYyBQb3J0VHlwZSBnZXROZXdQb3J0VHlwZSgpIHsKLQkJcmV0dXJuIG5ld1BvcnRUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJYmVnaW5SZWNvcmRpbmcoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJaWYgKG5ld05hbWUgPT0gbnVsbCB8fCBuZXdOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5ld05hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVBvcnRUeXBlTmFtZShkZWZpbml0aW9uLCAiTmV3UG9ydFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gQWRkIHRoZSBQb3J0IFR5cGUKLQkJCUFkZFBvcnRUeXBlQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFBvcnRUeXBlQ29tbWFuZChkZWZpbml0aW9uLCBuZXdOYW1lLCBmYWxzZSk7Ci0JCQljb21tYW5kLnJ1bigpOwotCQkJCi0JCQluZXdQb3J0VHlwZSA9IChQb3J0VHlwZSkgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQkJCi0JCQkvLyBBZGQgdGhlIE9wZXJhdGlvbgotCQkJSUludGVyZmFjZSBpSW50ZXJmYWNlID0gKElJbnRlcmZhY2UpIFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlci5nZXRJbnN0YW5jZSgpLmFkYXB0KG5ld1BvcnRUeXBlKTsKLQkJCUNvbW1hbmQgYWRkT3BlcmF0aW9uQ29tbWFuZCA9IGlJbnRlcmZhY2UuZ2V0QWRkT3BlcmF0aW9uQ29tbWFuZCgpOwotCQkJYWRkT3BlcmF0aW9uQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQlmb3JtYXRDaGlsZChuZXdQb3J0VHlwZS5nZXRFbGVtZW50KCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE5ld2x5QWRkZWRDb21wb25lbnQoKSB7Ci0JCXJldHVybiBuZXdQb3J0VHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZE1lc3NhZ2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZE1lc3NhZ2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODQ0ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFBZGRNZXNzYWdlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5JQVNEQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRNZXNzYWdlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi1wdWJsaWMgY2xhc3MgVzExQWRkTWVzc2FnZUNvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIGltcGxlbWVudHMgSUFTREFkZENvbW1hbmQgewotICAgIHByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlIG1lc3NhZ2U7Ci0JCi0gICAgcHVibGljIFcxMUFkZE1lc3NhZ2VDb21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9NRVNTQUdFLCBkZWZpbml0aW9uKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgc2V0TmV3TWVzc2FnZU5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgIAl0cnkgewotICAgIAkJYmVnaW5SZWNvcmRpbmcoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIAkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJaWYgKG5ld05hbWUgPT0gbnVsbCB8fCBuZXdOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5ld05hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGRlZmluaXRpb24sICJOZXdNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkgICAgCUFkZE1lc3NhZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbiwgbmV3TmFtZSwgdHJ1ZSk7Ci0JICAgICAgICBjb21tYW5kLnJ1bigpOwotCSAgICAgICAgbWVzc2FnZSA9IChNZXNzYWdlKSBjb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0JICAgICAgICBmb3JtYXRDaGlsZChtZXNzYWdlLmdldEVsZW1lbnQoKSk7Ci0gICAgCX0KLSAgICAJZmluYWxseSB7Ci0gICAgCQllbmRSZWNvcmRpbmcoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlIGdldE5ld01lc3NhZ2UoKSB7Ci0gICAgCXJldHVybiBtZXNzYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldE5ld2x5QWRkZWRDb21wb25lbnQoKSB7Ci0gICAgCXJldHVybiBtZXNzYWdlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZE9wZXJhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkT3BlcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmVkYWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkT3BlcmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kczsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLklBU0RBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZEZhdWx0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRJbnB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE9wZXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPdXRwdXRQYXJhbWV0ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBXMTFBZGRPcGVyYXRpb25Db21tYW5kIGV4dGVuZHMgVzExVG9wTGV2ZWxFbGVtZW50Q29tbWFuZCBpbXBsZW1lbnRzIElBU0RBZGRDb21tYW5kIHsKLQlwcml2YXRlIFBvcnRUeXBlIHBvcnRUeXBlOwotCXByaXZhdGUgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLQkKLQlwdWJsaWMgVzExQWRkT3BlcmF0aW9uQ29tbWFuZChQb3J0VHlwZSBwb3J0VHlwZSkgewotICAgICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9PUEVSQVRJT04sIHBvcnRUeXBlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCXRoaXMucG9ydFR5cGUgPSBwb3J0VHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKHBvcnRUeXBlLmdldEVsZW1lbnQoKSk7Ci0JCQkKLQkJCVN0cmluZyBuYW1lID0gTmFtZVV0aWwuZ2V0T3BlcmF0aW9uTmFtZShwb3J0VHlwZSk7Ci0JCQlBZGRPcGVyYXRpb25Db21tYW5kIG9wZXJhdGlvbkNvbW1hbmQgPSBuZXcgQWRkT3BlcmF0aW9uQ29tbWFuZChwb3J0VHlwZSwgbmFtZSk7Ci0JCQlvcGVyYXRpb25Db21tYW5kLnJ1bigpOwotCQkJb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgb3BlcmF0aW9uQ29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQotCQkJY3JlYXRlTWVzc2FnZShvcGVyYXRpb24sIElNZXNzYWdlUmVmZXJlbmNlLktJTkRfSU5QVVQpOwotCQkJY3JlYXRlTWVzc2FnZShvcGVyYXRpb24sIElNZXNzYWdlUmVmZXJlbmNlLktJTkRfT1VUUFVUKTsKLQkKLQkJCWNyZWF0ZVBhcmFtZXRlcihvcGVyYXRpb24sIG51bGwsIElNZXNzYWdlUmVmZXJlbmNlLktJTkRfSU5QVVQpOwotCQkJY3JlYXRlUGFyYW1ldGVyKG9wZXJhdGlvbiwgbnVsbCwgSU1lc3NhZ2VSZWZlcmVuY2UuS0lORF9PVVRQVVQpOwotCQotCQkJb3BlcmF0aW9uLnNldFN0eWxlKE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSk7Ci0JCQlmb3JtYXRDaGlsZChvcGVyYXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuZFJlY29yZGluZyhwb3J0VHlwZS5nZXRFbGVtZW50KCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0TmV3bHlBZGRlZENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIG9wZXJhdGlvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBNZXNzYWdlUmVmZXJlbmNlIGNyZWF0ZU1lc3NhZ2UoT3BlcmF0aW9uIG9wZXJhdGlvbiwgaW50IG1lc3NhZ2VLaW5kKSB7Ci0JCU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZiA9IG51bGw7Ci0JCUFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kIG1lc3NhZ2VSZWZDb21tYW5kID0gbnVsbDsKLQkgICAgaWYgKG1lc3NhZ2VLaW5kID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfSU5QVVQpCi0JICAgIHsKLQkgICAgCW1lc3NhZ2VSZWZDb21tYW5kID0gbmV3IEFkZElucHV0Q29tbWFuZChvcGVyYXRpb24sIG51bGwpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKG1lc3NhZ2VLaW5kID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfT1VUUFVUKQotCSAgICB7Ci0JICAgIAltZXNzYWdlUmVmQ29tbWFuZCA9IG5ldyBBZGRPdXRwdXRDb21tYW5kKG9wZXJhdGlvbiwgbnVsbCk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAobWVzc2FnZUtpbmQgPT0gSU1lc3NhZ2VSZWZlcmVuY2UuS0lORF9GQVVMVCkKLQkgICAgewotCSAgICAJbWVzc2FnZVJlZkNvbW1hbmQgPSBuZXcgQWRkRmF1bHRDb21tYW5kKG9wZXJhdGlvbiwgTmFtZVV0aWwuZ2V0RmF1bHROYW1lKG9wZXJhdGlvbikpOwotCSAgICB9Ci0JICAgIG1lc3NhZ2VSZWZDb21tYW5kLnJ1bigpOwotCSAgICBtZXNzYWdlUmVmID0gKE1lc3NhZ2VSZWZlcmVuY2UpIG1lc3NhZ2VSZWZDb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0JICAgIAotLy8JICAgIEFkZE1lc3NhZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQobWVzc2FnZVJlZi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIE5hbWVVdGlsLmdldE1lc3NhZ2VOYW1lKG1lc3NhZ2VSZWYpKTsKLS8vCSAgICBjb21tYW5kLnJ1bigpOwotLy8JICAgIG1lc3NhZ2VSZWYuc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpIGNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKSk7Ci0JICAgIAotCSAgICByZXR1cm4gbWVzc2FnZVJlZjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhcmFtZXRlcihPcGVyYXRpb24gb3BlcmF0aW9uLCBQYXJ0IHBhcnQsIGludCBraW5kKSB7Ci0JCSAgSVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBudWxsOwotCQkgIEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kIGFkZFBhcmFtZXRlckNvbW1hbmQgPSBudWxsOwotCQkgIAotCQkgIGlmIChraW5kID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfSU5QVVQpIHsKLQkJCSAgaW50IHBhcmFtZXRlclBhdHRlcm4gPSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5nZXRQYXJhbWV0ZXJQYXR0ZXJuKHBvcnRUeXBlLCB0cnVlKTsKLQkJCSAgaWYgKHBhcmFtZXRlclBhdHRlcm4gPT0gLTEpIHsKLQkJCQkgIHBhcmFtZXRlclBhdHRlcm4gPSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5QQVJUX0VMRU1FTlRfU0VRX0VMRU1FTlQ7Ci0JCQkgIH0KLQkJCSAgYWRkUGFyYW1ldGVyQ29tbWFuZCA9IG5ldyBBZGRJbnB1dFBhcmFtZXRlckNvbW1hbmQob3BlcmF0aW9uLCBwYXJhbWV0ZXJQYXR0ZXJuLCB0cnVlKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoa2luZCA9PSBJTWVzc2FnZVJlZmVyZW5jZS5LSU5EX09VVFBVVCkgewotCQkJICBpbnQgcGFyYW1ldGVyUGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLmdldFBhcmFtZXRlclBhdHRlcm4ocG9ydFR5cGUsIGZhbHNlKTsKLQkJCSAgaWYgKHBhcmFtZXRlclBhdHRlcm4gPT0gLTEpIHsKLQkJCQkgIHBhcmFtZXRlclBhdHRlcm4gPSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5QQVJUX0VMRU1FTlRfU0VRX0VMRU1FTlQ7Ci0JCQkgIH0JCQkgIAotCQkJICBhZGRQYXJhbWV0ZXJDb21tYW5kID0gbmV3IEFkZE91dHB1dFBhcmFtZXRlckNvbW1hbmQob3BlcmF0aW9uLCBwYXJhbWV0ZXJQYXR0ZXJuKTsKLQkJICB9Ci0JCSAgCi0JCSAgaWYgKHBhcmFtZXRlciA9PSBudWxsICYmIGFkZFBhcmFtZXRlckNvbW1hbmQgIT0gbnVsbCkgewotCQkJICBhZGRQYXJhbWV0ZXJDb21tYW5kLnJ1bigpOwotCQkgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZE91dHB1dFBhcmFtZXRlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjE0ZDU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5JQVNEQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCYXNlUGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPdXRwdXRQYXJhbWV0ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFcxMUFkZE91dHB1dFBhcmFtZXRlckNvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIGltcGxlbWVudHMgSUFTREFkZENvbW1hbmQgewotCXByb3RlY3RlZCBPcGVyYXRpb24gb3BlcmF0aW9uOwotCXByaXZhdGUgT2JqZWN0IG91dHB1dDsKLQlwcml2YXRlIGludCBwYXJhbWV0ZXJQYXR0ZXJuID0gLTE7Ci0JCi0JcHVibGljIFcxMUFkZE91dHB1dFBhcmFtZXRlckNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9PVVRQVVQsIG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQl0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyUGF0dGVybihpbnQgcGF0dGVybikgewotCQlwYXJhbWV0ZXJQYXR0ZXJuID0gcGF0dGVybjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKG9wZXJhdGlvbi5nZXRFbGVtZW50KCkpOwotCi0JCQlpZiAocGFyYW1ldGVyUGF0dGVybiA9PSAtMSkgewotCQkJCS8vIERldGVybWluZSB3aGljaCBQYXR0ZXJuIHdlIHNob3VsZCB1c2UuICBGb3IgZXhhbXBsZSwgQUREQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9FTEVNRU5UX1NFUV9FTEVNRU5UCi0JCQkJcGFyYW1ldGVyUGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLmdldFBhcmFtZXRlclBhdHRlcm4ob3BlcmF0aW9uLCBmYWxzZSk7Ci0JCQkJaWYgKHBhcmFtZXRlclBhdHRlcm4gPT0gLTEpIHsKLQkJCQkJcGFyYW1ldGVyUGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLmdldFBhcmFtZXRlclBhdHRlcm4ob3BlcmF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUFkZE91dHB1dFBhcmFtZXRlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRPdXRwdXRQYXJhbWV0ZXJDb21tYW5kKG9wZXJhdGlvbiwgcGFyYW1ldGVyUGF0dGVybik7Ci0JCQljb21tYW5kLnJ1bigpOwotCQkJb3V0cHV0ID0gY29tbWFuZC5nZXROZXdseUFkZGVkQ29tcG9uZW50UGFydCgpOwotCQkJCi0JCQlmb3JtYXRDaGlsZChvcGVyYXRpb24uZ2V0RU91dHB1dCgpLmdldEVsZW1lbnQoKSk7Ci0JCQlpZiAoY29tbWFuZC5nZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJLy8gVHJ5IHRvIGdyYWIgdGhlICJpbm5lciIgWFNERWxlbWVudAotCQkJCW91dHB1dCA9IGdldE5ld1hTREVsZW1lbnQoY29tbWFuZC5nZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0JCQkJZm9ybWF0Q2hpbGQoZ2V0WFNEUGFyZW50KGNvbW1hbmQuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpLmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmRSZWNvcmRpbmcob3BlcmF0aW9uLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldFhTRFBhcmVudChYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2QpIHsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0geHNkOwotCQkKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIHsKLQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IHByZXZpb3VzID0gcGFyZW50OwotCQkJcGFyZW50ID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gcHJldmlvdXM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0TmV3bHlBZGRlZENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFBZGRQYXJ0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFBZGRQYXJ0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA0Y2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkUGFydENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5JQVNEQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQYXJ0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi1wdWJsaWMgY2xhc3MgVzExQWRkUGFydENvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIGltcGxlbWVudHMgSUFTREFkZENvbW1hbmQgewotICAgIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOwotICAgIHByaXZhdGUgUGFydCBwYXJ0OwotICAgIAotICAgIHB1YmxpYyBXMTFBZGRQYXJ0Q29tbWFuZChNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfUEFSVCwgbWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgIAl0cnkgewotICAgIAkJYmVnaW5SZWNvcmRpbmcobWVzc2FnZS5nZXRFbGVtZW50KCkpOwotCi0JICAgIAlBZGRQYXJ0Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIE5hbWVVdGlsLmJ1aWxkVW5pcXVlUGFydE5hbWUobWVzc2FnZSwgIk5ld1BhcnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGNvbW1hbmQucnVuKCk7Ci0JICAgICAgICBwYXJ0ID0gKFBhcnQpIGNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLQkgICAgICAgIGZvcm1hdENoaWxkKHBhcnQuZ2V0RWxlbWVudCgpKTsKLSAgICAJfQotICAgIAlmaW5hbGx5IHsKLSAgICAJCWVuZFJlY29yZGluZyhtZXNzYWdlLmdldEVsZW1lbnQoKSk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0JcHVibGljIE9iamVjdCBnZXROZXdseUFkZGVkQ29tcG9uZW50KCkgewotCQlyZXR1cm4gcGFydDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZFNjaGVtYUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkU2NoZW1hQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzI2MzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkU2NoZW1hQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5JQVNEQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRYU0RTY2hlbWFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBXMTFBZGRTY2hlbWFDb21tYW5kIGV4dGVuZHMgVzExVG9wTGV2ZWxFbGVtZW50Q29tbWFuZCBpbXBsZW1lbnRzIElBU0RBZGRDb21tYW5kIHsKLQlwcml2YXRlIE9iamVjdCBzY2hlbWE7Ci0JCi0JcHVibGljIFcxMUFkZFNjaGVtYUNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0NIRU1BLCBkZWZpbml0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJCXN1cGVyLmV4ZWN1dGUoKTsKLSAgICAKLQkJCVN0cmluZyB0bnMgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQkJTGlzdCBleGlzdGluZ05hbWVzcGFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0JCi0JCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGVlSXQgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZWVJdC5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGl0ZW0gPSBlZUl0Lm5leHQoKTsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgewotCQkJCQkJWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWVFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVtOwotCQkJCQkJaWYgKGVlRWxlbWVudC5nZXRTY2hlbWEoKSAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIG5zID0gZWVFbGVtZW50LmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQkJCQkJCWV4aXN0aW5nTmFtZXNwYWNlcy5hZGQobnMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAKLQkJCX0KLQkJCXRucyA9IE5hbWVVdGlsLmdldFVuaXF1ZU5hbWVIZWxwZXIodG5zLCBleGlzdGluZ05hbWVzcGFjZXMpOwotCQkJCi0JCQlBZGRYU0RTY2hlbWFDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNEU2NoZW1hQ29tbWFuZChkZWZpbml0aW9uLCB0bnMpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCWZvcm1hdENoaWxkKGNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKS5nZXRFbGVtZW50KCkpOwotCQkJc2NoZW1hID0gY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE5ld2x5QWRkZWRDb21wb25lbnQoKSB7Ci0JCXJldHVybiBzY2hlbWE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkU2VydmljZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExQWRkU2VydmljZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlMWFlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUFkZFNlcnZpY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmdlbmVyYXRvci5TT0FQQ29udGVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuUG9ydEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuSUFTREFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkU2VydmljZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLQotcHVibGljIGNsYXNzIFcxMUFkZFNlcnZpY2VDb21tYW5kIGV4dGVuZHMgVzExVG9wTGV2ZWxFbGVtZW50Q29tbWFuZCBpbXBsZW1lbnRzIElBU0RBZGRDb21tYW5kIHsKLQlwcml2YXRlIFNlcnZpY2Ugc2VydmljZTsKLQkKLQlwdWJsaWMgVzExQWRkU2VydmljZUNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TRVJWSUNFLCBkZWZpbml0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCVN0cmluZyBuZXdOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVTZXJ2aWNlTmFtZShkZWZpbml0aW9uKTsKLQkJCUFkZFNlcnZpY2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkU2VydmljZUNvbW1hbmQoZGVmaW5pdGlvbiwgbmV3TmFtZSwgZmFsc2UpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCXNlcnZpY2UgPSAoU2VydmljZSkgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQkJCi0JCQlQb3J0R2VuZXJhdG9yIHBvcnRHZW5lcmF0b3IgPSBuZXcgUG9ydEdlbmVyYXRvcihzZXJ2aWNlKTsKLQkJCXBvcnRHZW5lcmF0b3Iuc2V0Q29udGVudEdlbmVyYXRvcihuZXcgU09BUENvbnRlbnRHZW5lcmF0b3IoKSk7Ci0JCQlwb3J0R2VuZXJhdG9yLnNldE5hbWUoTmFtZVV0aWwuYnVpbGRVbmlxdWVQb3J0TmFtZShzZXJ2aWNlLCAiTmV3UG9ydCIpKTsKLQkJCXBvcnRHZW5lcmF0b3IuZ2VuZXJhdGVQb3J0KCk7Ci0JCQkKLQkJCWZvcm1hdENoaWxkKHNlcnZpY2UuZ2V0RWxlbWVudCgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuZFJlY29yZGluZyhkZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXROZXdseUFkZGVkQ29tcG9uZW50KCkgewotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFEZWxldGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMURlbGV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5MjNjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMURlbGV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFFbmRQb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFcxMURlbGV0ZUNvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIHsKLQlwcm90ZWN0ZWQgV1NETEJhc2VBZGFwdGVyIG9iamVjdDsKLQkKLQlwdWJsaWMgVzExRGVsZXRlQ29tbWFuZChXU0RMQmFzZUFkYXB0ZXIgb2JqZWN0KSB7Ci0gICAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFLCBudWxsKTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCWlmIChvYmplY3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgewotCQkJZWxlbWVudCA9ICgoV1NETEVsZW1lbnQpIG9iamVjdC5nZXRUYXJnZXQoKSkuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iamVjdC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0JCQllbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb2JqZWN0LmdldFRhcmdldCgpKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQliZWdpblJlY29yZGluZyhlbGVtZW50KTsKLQkJCQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFcxMVNlcnZpY2UpIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgb2JqZWN0LmdldFRhcmdldCgpOwotCQkJCXNlcnZpY2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVTZXJ2aWNlcygpLnJlbW92ZShzZXJ2aWNlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFcxMUVuZFBvaW50KSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpICgoVzExU2VydmljZSkgKChXMTFFbmRQb2ludCkgb2JqZWN0KS5nZXRPd25lclNlcnZpY2UoKSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJUG9ydCBwb3J0ID0gKFBvcnQpIG9iamVjdC5nZXRUYXJnZXQoKTsKLQkJCQlzZXJ2aWNlLmdldEVQb3J0cygpLnJlbW92ZShwb3J0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFcxMUJpbmRpbmcpIHsKLQkJCQlCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgb2JqZWN0LmdldFRhcmdldCgpOwotCQkJCWJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVCaW5kaW5ncygpLnJlbW92ZShiaW5kaW5nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFcxMUludGVyZmFjZSkgewotCQkJCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBvYmplY3QuZ2V0VGFyZ2V0KCk7Ci0JCQkJcG9ydFR5cGUuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVQb3J0VHlwZXMoKS5yZW1vdmUocG9ydFR5cGUpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVzExT3BlcmF0aW9uKSB7Ci0JCQkJUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpICgoVzExSW50ZXJmYWNlKSAoKFcxMU9wZXJhdGlvbikgb2JqZWN0KS5nZXRPd25lckludGVyZmFjZSgpKS5nZXRUYXJnZXQoKTsKLQkJCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgb2JqZWN0LmdldFRhcmdldCgpOwotCQkJCXBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkucmVtb3ZlKG9wZXJhdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUGFyYW1ldGVyKSB7Ci0JCQkJUGFydCBwYXJ0ID0gKFBhcnQpIG9iamVjdC5nZXRUYXJnZXQoKTsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgcGFydC5lQ29udGFpbmVyKCk7Ci0JCQkJbWVzc2FnZS5nZXRFUGFydHMoKS5yZW1vdmUocGFydCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJSW1wb3J0KSB7Ci0JCQkJSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIG9iamVjdC5nZXRUYXJnZXQoKTsKLQkJCQl0aGVJbXBvcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVJbXBvcnRzKCkucmVtb3ZlKHRoZUltcG9ydCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXMTFUeXBlKSB7Ci0JCQkJVzExVHlwZSB3MTFUeXBlID0gKFcxMVR5cGUpIG9iamVjdDsKLQkJCQlYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgIHcxMVR5cGUuZ2V0VGFyZ2V0KCk7Ci0JCQkJWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWVFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBzY2hlbWEuZUNvbnRhaW5lcigpOwotCQkJCVR5cGVzIHR5cGUgPSAoVHlwZXMpIGVlRWxlbWVudC5nZXRDb250YWluZXIoKTsKLQkJCQl0eXBlLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5yZW1vdmUoZWVFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElNZXNzYWdlUmVmZXJlbmNlKSB7Ci0JCQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmID0gKE1lc3NhZ2VSZWZlcmVuY2UpIG9iamVjdC5nZXRUYXJnZXQoKTsKLQkJCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbiltZXNzYWdlUmVmLmVDb250YWluZXIoKTsKLQkJCQlpZiAobWVzc2FnZVJlZiBpbnN0YW5jZW9mIElucHV0KSB7Ci0JCQkJCW9wZXJhdGlvbi5zZXRFSW5wdXQobnVsbCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG1lc3NhZ2VSZWYgaW5zdGFuY2VvZiBPdXRwdXQpIHsKLQkJCQkJb3BlcmF0aW9uLnNldEVPdXRwdXQobnVsbCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG1lc3NhZ2VSZWYgaW5zdGFuY2VvZiBGYXVsdCkgewotCQkJCQlvcGVyYXRpb24uZ2V0RUZhdWx0cygpLnJlbW92ZShtZXNzYWdlUmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJTWVzc2FnZSkgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBvYmplY3QuZ2V0VGFyZ2V0KCk7Ci0JCQkJbWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0RU1lc3NhZ2VzKCkucmVtb3ZlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFEZWxldGVQYXJhbWV0ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMURlbGV0ZVBhcmFtZXRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxMjVjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMURlbGV0ZVBhcmFtZXRlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFQYXJhbWV0ZXJGb3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgVzExRGVsZXRlUGFyYW1ldGVyQ29tbWFuZCBleHRlbmRzIFcxMVRvcExldmVsRWxlbWVudENvbW1hbmQgewotCXByaXZhdGUgSVBhcmFtZXRlciBwYXJhbWV0ZXI7Ci0JCi0JcHVibGljIFcxMURlbGV0ZVBhcmFtZXRlckNvbW1hbmQoSVBhcmFtZXRlciBwYXJhbSkgewotICAgICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSwgbnVsbCk7Ci0JCXRoaXMucGFyYW1ldGVyID0gcGFyYW07Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCU9iamVjdCBvYmplY3QgPSAoKFdTRExCYXNlQWRhcHRlcikgcGFyYW1ldGVyKS5nZXRUYXJnZXQoKTsKLQkJRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJZWxlbWVudCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgewotCQkJZWxlbWVudCA9ICgoUGFydCkgb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7Ci0JCQkJZGVsZXRlKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQllbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZSgpIHsKLQkJT2JqZWN0IG9iamVjdCA9ICgoV1NETEJhc2VBZGFwdGVyKSBwYXJhbWV0ZXIpLmdldFRhcmdldCgpOwotCQkKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50ID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIG9iamVjdCkuZ2V0Q29udGFpbmVyKCk7Ci0JCQkKLQkJCWlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgewotCQkJCVhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSB4c2RDb21wb25lbnQ7Ci0JCQkJaWYgKHBhcnRpY2xlLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkgewotCQkJCQlYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgcGFydGljbGUuZ2V0Q29udGFpbmVyKCk7Ci0JCQkJCWlmIChtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuc2l6ZSgpID49IDIpIHsKLQkJCQkJCW1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5yZW1vdmUocGFydGljbGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbW9kZWxHcm91cC5nZXRDb250ZW50cygpLnJlbW92ZShwYXJ0aWNsZSk7Ci0JCQkJCQkvLyBUT0RPOiBXZSBuZWVkIHRoZSBsaW5lIGJlbG93IHRvIGRlbGV0ZSB0aGUgTWVzc2FnZSBhbmQgUGFydAotLy8JCQkJCQlyZW1vdmVNZXNzYWdlQW5kUGFydCh3UGFyYW1ldGVyLmdldFBhcnQoKSk7Ci0JCQkJCQkvLyBUT0RPOiBSZW1vdmUgdGhlIFhTRCBjb21wb25lbnRzIGFzIHdlbGwuLi4uLgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKXsKLQkJCQkvLyBUT0RPOiBXZSBuZWVkIHRoZSBsaW5lIGJlbG93IHRvIGRlbGV0ZSB0aGUgTWVzc2FnZSBhbmQgUGFydAotLy8JCQkJcmVtb3ZlTWVzc2FnZUFuZFBhcnQod1BhcmFtZXRlci5nZXRQYXJ0KCkpOyAvLyBEZWxldGUgdGhlIHBhcnQgYXMgd2VsbAotCQkJCVhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKSB4c2RDb21wb25lbnQ7Ci0JCQkJeHNkU2NoZW1hLmdldENvbnRlbnRzKCkucmVtb3ZlKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUGFydCkgewotCQkJcmVtb3ZlTWVzc2FnZUFuZFBhcnQoKFBhcnQpIG9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWVzc2FnZSkgewotCQkJcmVtb3ZlTWVzc2FnZUFuZFBhcnQoKFBhcnQpICgoTWVzc2FnZSkgb2JqZWN0KS5nZXRFUGFydHMoKS5nZXQoMCkpOwotCQl9Ci0JCQotCQkvLyBEbyB3ZSB3YW50IHRvIHJlbW92ZSB0aGUgSW5wdXQvT3V0cHV0L0ZhdWx0IE1lc3NhZ2VSZWZlcmVuY2UgYXMgd2VsbCBpZgotCQkvLyB0aGVyZSBhcmUgbm8gbW9yZSAiaW5wdXRzIj8uLi4uCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1lc3NhZ2VBbmRQYXJ0KFBhcnQgcGFydCkgewotCQlXMTFNZXNzYWdlUmVmZXJlbmNlICB3TWVzc2FnZSA9IG51bGw7Ci0JCS8qCi0JCWlmIChwYXJhbWV0ZXIgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JFbGVtZW50KSB7Ci0JCQl3TWVzc2FnZSA9IChXMTFNZXNzYWdlUmVmZXJlbmNlKSAoKFcxMVBhcmFtZXRlckZvckVsZW1lbnQpIHBhcmFtZXRlcikuZ2V0T3duZXIoKTsJCi0JCX0KLQkJZWxzZSAqL2lmIChwYXJhbWV0ZXIgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JQYXJ0KSB7Ci0JCQl3TWVzc2FnZSA9IChXMTFNZXNzYWdlUmVmZXJlbmNlKSAoKFcxMVBhcmFtZXRlckZvclBhcnQpIHBhcmFtZXRlcikuZ2V0T3duZXIoKTsKLQkJfQotCQkKLQkJTWVzc2FnZSBtZXNzYWdlID0gd01lc3NhZ2UuZ2V0TWVzc2FnZVJlZmVyZW5jZSgpLmdldEVNZXNzYWdlKCk7IAotCQltZXNzYWdlLmdldEVQYXJ0cygpLnJlbW92ZShwYXJ0KTsKLQkJCi0JCSgoRGVmaW5pdGlvbikgcGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpLmdldEVNZXNzYWdlcygpLnJlbW92ZShtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUVkaXROYW1lc3BhY2VzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFFZGl0TmFtZXNwYWNlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzZDY1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUVkaXROYW1lc3BhY2VzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXMTFFZGl0TmFtZXNwYWNlc0NvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIHsKLQlwcml2YXRlIExpc3QgbmFtZXNwYWNlc0luZm9MaXN0OwotCXByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0JCi0JcHVibGljIFcxMUVkaXROYW1lc3BhY2VzQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkgIHN1cGVyKE1lc3NhZ2VzLl9VSV9FRElUX05BTUVTUEFDRVMsIGRlZmluaXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VzSW5mbyhMaXN0IG5hbWVzcGFjZXMpIHsKLQkJbmFtZXNwYWNlc0luZm9MaXN0ID0gbmFtZXNwYWNlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0bnMpIHsKLQkJdGFyZ2V0TmFtZXNwYWNlID0gdG5zOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCQl0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBwcmVmaXg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQliZWdpblJlY29yZGluZyhkZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0JCQlzdXBlci5leGVjdXRlKCk7Ci0JCQlpZiAodGFyZ2V0TmFtZXNwYWNlUHJlZml4ICE9IG51bGwpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLQotCQkJCS8vIFJlbW92ZSB0aGUgb2xkIHByZWZpeAotCQkJCVN0cmluZyBvbGRQcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnM6IitvbGRQcmVmaXgpOyAKLQotCQkJCS8vIFNldCB0aGUgbmV3IHByZWZpeAotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgdGFyZ2V0TmFtZXNwYWNlUHJlZml4LCBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCX0KLQkJCWlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuZXdWYWx1ZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJCQlTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQkJZGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UobmV3VmFsdWUpOwotCQkJCWRlZmluaXRpb24uZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwgbmV3VmFsdWUpOwotCQkJfQotCi0JCQlpZiAobmFtZXNwYWNlc0luZm9MaXN0ICE9IG51bGwpIHsKLQkJCQlET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCi0JCQkJLyoKLQkJICAgICAgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9NYW5hZ2VyLmdldE5hbWVzcGFjZUluZm9MaXN0KGVsZW1lbnQpOwotLy8JCSAgICAgIExpc3Qgb2xkTmFtZXNwYWNlSW5mb0xpc3QgPSBOYW1lc3BhY2VJbmZvLmNsb25lTmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0JCSAgICAgIC8vIGhlcmUgd2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSBvbGQgaW5mbyBmb3IgZWFjaCBOYW1lc3BhY2VJbmZvCi0JCSAgICAgIC8vIHRoaXMgaW5mbyB3aWxsIGJlIHVzZWQgaW4gY3JlYXRlUHJlZml4TWFwcGluZygpIHRvIGZpZ3VyZSBvdXQgaG93IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnQgCi0JCSAgICAgIC8vIGluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZXMKLQkJICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkgICAgICB7Ci0JCSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkgICAgICAgIE5hbWVzcGFjZUluZm8gb2xkQ29weSA9IG5ldyBOYW1lc3BhY2VJbmZvKGluZm8pOwotCQkgICAgICAgIGluZm8uc2V0UHJvcGVydHkoIm9sZENvcHkiLCBvbGRDb3B5KTsgLy8kTk9OLU5MUy0xJAotCQkgICAgICB9Ci0JCQkJICovCi0KLQkJCQluYW1lc3BhY2VJbmZvTWFuYWdlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJCQluYW1lc3BhY2VJbmZvTWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpLCBuYW1lc3BhY2VzSW5mb0xpc3QsIGZhbHNlKTsKLQotCQkJCS8qCi0JICAgICAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byByZW5hbWUgYW55IHByZWZpeGVzCi0JICAgICAgICBNYXAgcHJlZml4TWFwcGluZyA9IGNyZWF0ZVByZWZpeE1hcHBpbmcob2xkTmFtZXNwYWNlSW5mb0xpc3QsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkgICAgICAgIGlmIChwcmVmaXhNYXBwaW5nLnNpemUoKSA+IDApCi0JICAgICAgICB7Ci0JICAgICAgICAgIC8vbWFuYWdlci5nZXRNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCSAgICAgICAgICBSZXBsYWNlUHJlZml4QWN0aW9uIHJlcGxhY2VQcmVmaXhBY3Rpb24gPSBuZXcgUmVwbGFjZVByZWZpeEFjdGlvbihlbGVtZW50LCBwcmVmaXhNYXBwaW5nKTsKLQkgICAgICAgICAgcmVwbGFjZVByZWZpeEFjdGlvbi5ydW4oKTsKLQkgICAgICAgICAgLy9tYW5hZ2VyLmdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JICAgICAgICB9Ci0JCQkJICovICAgCi0JCQl9Ci0KLQkJCS8qCi0JCSAvLyBDb3VsZCBub3QgbW9kaWZ5IChtb3JlIHNwZWNpZmljYWxseSByZW1vdmUpIG5hbWVzcGFjZXMgdmlhIG1vZGVsLi4uLi4KLQkJIC8vIHNob3VsZCByZXZpc2l0IHRoaXMKLQkJaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSB7Ci0JCQlNYXAgbWFwID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0JCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCVN0cmluZyBvbGRQcmVmaXggPSBudWxsOwotCi0JCQlJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gbWFwLmdldChrZXkpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIG9sZFRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhvbGRUYXJnZXROYW1lc3BhY2UpKSB7Ci0JCQkJCW9sZFByZWZpeCA9IGtleTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAob2xkUHJlZml4ICE9IG51bGwgJiYgIW9sZFByZWZpeC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlUHJlZml4KSkgewotCQkJCW1hcC5yZW1vdmUob2xkUHJlZml4KTsKLQkJCQlkZWZpbml0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLQkJCX0KLQotCQkJU3RyaW5nIHRucyA9ICIiOwotCQkJU3RyaW5nIHByZWZpeCA9ICIiOwotCQkJaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKSB7Ci0JCQkJdG5zID0gdGFyZ2V0TmFtZXNwYWNlOwotCQkJfQotCQkJaWYgKHRhcmdldE5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSB7Ci0JCQkJcHJlZml4ID0gdGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotCQkJfQotCQkJZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UocHJlZml4LCB0bnMpOwotCQkJZGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UodG5zKTsKLS8vCQkJbWFwLnB1dChwcmVmaXgsIHRucyk7Ci0JCX0KLQkJCSAqLwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJfQotCX0KLQkKLQkvKgotCXByb3RlY3RlZCBNYXAgY3JlYXRlUHJlZml4TWFwcGluZyhMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkKLQl7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJSGFzaHRhYmxlIG9sZFVSSVRvUHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlvbGRVUklUb1ByZWZpeFRhYmxlLnB1dChvbGRJbmZvLnVyaSwgb2xkSW5mbyk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG9sZFVSSVRvUHJlZml4VGFibGUuZ2V0KG5ld0luZm8udXJpICE9IG51bGwgPyBuZXdJbmZvLnVyaSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBpZiBvbGRJbmZvIGlzIG5vbiBudWxsIC4uLiB0aGVyZSdzIGEgbWF0Y2hpbmcgVVJJIGluIHRoZSBvbGQgc2V0Ci0JCQkvLyB3ZSBjYW4gdXNlIGl0cyBwcmVmaXggdG8gZGV0ZW1pbmUgb3V0IG1hcHBpbmcKLQkJCS8vCi0JCQkvLyBpZiBvbGRJbmZvIGlzIG51bGwgLi4uICB3ZSB1c2UgdGhlICdvbGRDb3B5JyB3ZSBzdGFzaGVkIGF3YXkgCi0JCQkvLyBhc3N1bWluZyB0aGF0IHRoZSB1c2VyIGNoYW5nZWQgdGhlIFVSSSBhbmQgdGhlIHByZWZpeAotCQkJaWYgKG9sZEluZm8gPT0gbnVsbCkKLQkJCXsKLQkJCQlvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG5ld0luZm8uZ2V0UHJvcGVydHkoIm9sZENvcHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAob2xkSW5mbyAhPSBudWxsKQotCQkJewotCQkJCVN0cmluZyBuZXdQcmVmaXggPSBuZXdJbmZvLnByZWZpeCAhPSBudWxsID8gbmV3SW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBvbGRQcmVmaXggPSBvbGRJbmZvLnByZWZpeCAhPSBudWxsID8gb2xkSW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghb2xkUHJlZml4LmVxdWFscyhuZXdQcmVmaXgpKQotCQkJCXsKLQkJCQkJbWFwLnB1dChvbGRQcmVmaXgsIG5ld1ByZWZpeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCSovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMUdlbmVyYXRlQmluZGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExR2VuZXJhdGVCaW5kaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzIxMWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExR2VuZXJhdGVCaW5kaW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHMuQmluZGluZ1dpemFyZDsKLQotcHVibGljIGNsYXNzIFcxMUdlbmVyYXRlQmluZGluZ0NvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIHsKLQlwcm90ZWN0ZWQgQmluZGluZyBiaW5kaW5nOwotCQotCXB1YmxpYyBXMTFHZW5lcmF0ZUJpbmRpbmdDb21tYW5kKEJpbmRpbmcgYmluZGluZykgewotICAgICAgICBzdXBlcihNZXNzYWdlcy5fVUlfR0VORVJBVEVfQklORElOR19DT05URU5ULCBiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQliZWdpblJlY29yZGluZyhkZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0KLQkJCUJpbmRpbmdXaXphcmQgd2l6YXJkID0gbmV3IEJpbmRpbmdXaXphcmQoYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGJpbmRpbmcsIEJpbmRpbmdXaXphcmQuS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcpOwotCQkJd2l6YXJkLnNldEJpbmRpbmdOYW1lKENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TmFtZShiaW5kaW5nKSk7Ci0JCQl3aXphcmQuc2V0UG9ydFR5cGVOYW1lKENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UG9ydFR5cGVSZWZlcmVuY2UoYmluZGluZykpOwotCQkJV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCXdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQkJCWlmICh3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCWZvcm1hdENoaWxkKGJpbmRpbmcuZ2V0RWxlbWVudCgpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuZFJlY29yZGluZyhkZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFSZW5hbWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVJlbmFtZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5MmQwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVJlbmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMUJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExRW5kUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExUGFyYW1ldGVyRm9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3IuQmluZGluZ1JlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvci5NZXNzYWdlUmVuYW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yLlBvcnRUeXBlUmVuYW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5QZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YTUxSZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5SZW5hbWVDb21wb25lbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFcxMVJlbmFtZUNvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIHsKLQlwcm90ZWN0ZWQgV1NETEJhc2VBZGFwdGVyIG9iamVjdDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFcxMVJlbmFtZUNvbW1hbmQoV1NETEJhc2VBZGFwdGVyIG9iamVjdCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIChvYmplY3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgPyAoKFdTRExFbGVtZW50KSBvYmplY3QuZ2V0VGFyZ2V0KCkpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSA6ICBudWxsKTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJCVN0cmluZyBvcmlnTmFtZSA9IG51bGw7Ci0JCQkKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXMTFEZXNjcmlwdGlvbikgewotCQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBvYmplY3QuZ2V0VGFyZ2V0KCk7Ci0JCQkJVzExVG9wTGV2ZWxFbGVtZW50Q29tbWFuZC5lbnN1cmVEZWZpbml0aW9uKGRlZmluaXRpb24pOwotCQkJCVN0cmluZyBucyA9IGRlZmluaXRpb24uZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQlkZWZpbml0aW9uLnNldFFOYW1lKG5ldyBRTmFtZShucywgbmV3TmFtZSkpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVzExU2VydmljZSkgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBvYmplY3QuZ2V0VGFyZ2V0KCk7Ci0JCQkJU3RyaW5nIG5zID0gc2VydmljZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCXNlcnZpY2Uuc2V0UU5hbWUobmV3IFFOYW1lKG5zLCBuZXdOYW1lKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXMTFFbmRQb2ludCkgewotCQkJCVBvcnQgcG9ydCA9IChQb3J0KSBvYmplY3QuZ2V0VGFyZ2V0KCk7Ci0JCQkJcG9ydC5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVzExQmluZGluZykgewotCQkJCUJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBvYmplY3QuZ2V0VGFyZ2V0KCk7Ci0JCQkJb3JpZ05hbWUgPSBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXMTFJbnRlcmZhY2UpIHsKLQkJCQlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgb2JqZWN0LmdldFRhcmdldCgpOwotCQkJCW9yaWdOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFcxMU9wZXJhdGlvbikgewotCQkJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvYmplY3QuZ2V0VGFyZ2V0KCk7Ci0JCQkJU21hcnRSZW5hbWVBY3Rpb24gYWN0aW9uID0gbmV3IFNtYXJ0UmVuYW1lQWN0aW9uKG9wZXJhdGlvbiwgbmV3TmFtZSk7Ci0JCQkJcmVuYW1lT3BlcmF0aW9uSGVscGVyKG9wZXJhdGlvbik7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVzExTWVzc2FnZVJlZmVyZW5jZSkgewotCQkJCVdTRExFbGVtZW50IGVsZW1lbnQgPSAoV1NETEVsZW1lbnQpICgoVzExTWVzc2FnZVJlZmVyZW5jZSkgb2JqZWN0KS5nZXRUYXJnZXQoKTsKLQkJCQlyZW5hbWVJT0ZIZWxwZXIoZWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXMTFNZXNzYWdlKSB7Ci0JCQkJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpICgoVzExTWVzc2FnZSkgb2JqZWN0KS5nZXRUYXJnZXQoKTsKLS8vCQkJCUl0ZXJhdG9yIHBhcnRzID0gbWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotCQkJCW9yaWdOYW1lID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQotCQkJCVNtYXJ0UmVuYW1lQWN0aW9uIGFjdGlvbiA9IG5ldyBTbWFydFJlbmFtZUFjdGlvbihtZXNzYWdlLCBuZXdOYW1lKTsKLQkJCQlhY3Rpb24ucnVuKGZhbHNlKTsKLS8vCQkJCXdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpIHsKLS8vCQkJCQlTbWFydFJlbmFtZUFjdGlvbiBhY3Rpb24gPSBuZXcgU21hcnRSZW5hbWVBY3Rpb24ocGFydHMubmV4dCgpLCBuZXdOYW1lKTsKLS8vCQkJCQlhY3Rpb24ucnVuKCk7Ci0vLwkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JQYXJ0KSB7Ci0JCQkJUGFydCBwYXJ0ID0gKFBhcnQpICgoVzExUGFyYW1ldGVyRm9yUGFydCkgb2JqZWN0KS5nZXRUYXJnZXQoKTsKLQkJCQlTbWFydFJlbmFtZUFjdGlvbiBhY3Rpb24gPSBuZXcgU21hcnRSZW5hbWVBY3Rpb24ocGFydCwgbmV3TmFtZSk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVzExQmluZGluZ09wZXJhdGlvbikgewotCQkJCUJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSAoKFcxMUJpbmRpbmdPcGVyYXRpb24pIG9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCQkJYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG5ld05hbWUpOwotCQkJCWJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJLy8gVE9ETzogV2Ugc2hvdWxkIGdvIG9mZiBhbmQgcmVuYW1lIHRoZSBhc3NvY2lhdGVkIFBvcnRUeXBlIE9wZXJhdGlvbgotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVzExQmluZGluZ01lc3NhZ2VSZWZlcmVuY2UpIHsKLQkJCQlPYmplY3QgYmluZGluZ01lc3NhZ2VSZWYgPSAoKFcxMUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlKSBvYmplY3QpLmdldFRhcmdldCgpOwotCQkJCWlmIChiaW5kaW5nTWVzc2FnZVJlZiBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkgewotCQkJCQkoKEJpbmRpbmdJbnB1dCkgYmluZGluZ01lc3NhZ2VSZWYpLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJCSgoQmluZGluZ0lucHV0KSBiaW5kaW5nTWVzc2FnZVJlZikuZ2V0RUlucHV0KCkuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQkJLy8gVE9ETzogV2Ugc2hvdWxkIGdvIG9mZiBhbmQgcmVuYW1lIHRoZSBhc3NvY2lhdGVkIFBvcnR0eXBlIE1lc3NhZ2VSZWZlcmVuY2UKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYmluZGluZ01lc3NhZ2VSZWYgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KSB7Ci0JCQkJCSgoQmluZGluZ091dHB1dCkgYmluZGluZ01lc3NhZ2VSZWYpLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJCSgoQmluZGluZ091dHB1dCkgYmluZGluZ01lc3NhZ2VSZWYpLmdldEVPdXRwdXQoKS5zZXROYW1lKG5ld05hbWUpOwotCQkJCQkvLyBUT0RPOiBXZSBzaG91bGQgZ28gb2ZmIGFuZCByZW5hbWUgdGhlIGFzc29jaWF0ZWQgUG9ydHR5cGUgT3V0cHV0CQkJCQotCQkJCX0KLQkJCQllbHNlIGlmIChiaW5kaW5nTWVzc2FnZVJlZiBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgewotCQkJCQkoKEJpbmRpbmdGYXVsdCkgYmluZGluZ01lc3NhZ2VSZWYpLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJCSgoQmluZGluZ0ZhdWx0KSBiaW5kaW5nTWVzc2FnZVJlZikuZ2V0RUZhdWx0KCkuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQkJLy8gVE9ETzogV2Ugc2hvdWxkIGdvIG9mZiBhbmQgcmVuYW1lIHRoZSBhc3NvY2lhdGVkIFBvcnR0eXBlIEZhdWx0Ci0JCQkJfQotCQkJfQotCQotCQkJT2JqZWN0IHRhcmdldCA9IG9iamVjdC5nZXRUYXJnZXQoKTsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCAmJiBvcmlnTmFtZSAhPSBudWxsKSB7Ci0JCQkJV1NETEVsZW1lbnQgY29tcG9uZW50ID0gKFdTRExFbGVtZW50KSB0YXJnZXQ7Ci0JCQkJU3RyaW5nIG5hbWVzcGFjZSA9IGNvbXBvbmVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCi0JCQkJUmVmYWN0b3JpbmdDb21wb25lbnQgcmVmYWN0b3JpbmdDb21wb25lbnQgPSBuZXcgWE1MUmVmYWN0b3JpbmdDb21wb25lbnQoCi0JCQkJCQljb21wb25lbnQsCi0JCQkJCQkoSURPTUVsZW1lbnQpY29tcG9uZW50LmdldEVsZW1lbnQoKSwgCi0JCQkJCQlvcmlnTmFtZSwKLQkJCQkJCW5hbWVzcGFjZSk7Ci0JCi0JCQkJUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IocmVmYWN0b3JpbmdDb21wb25lbnQsIG5ld05hbWUsIHRydWUpOyAgICAKLQkJCQlSZW5hbWVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCQkJCVBlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24gcmVmYWN0b3JPcGVyYXRpb24gPSBuZXcgUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbihyZWZhY3RvcmluZyk7Ci0JCQkJcmVmYWN0b3JPcGVyYXRpb24ucnVuKG51bGwpOyAKLQkJCQkKLQkgICAgICAgICAgICAvLyBybWFoIDogZHVlIHRvIHRoZSBvcmRlcmluZyBpbiB3aGljaCByZWZhY3RvcmluZyBpcyBjYWxsZWQKLQkgICAgICAgICAgICAvLyAoaS5lLiB0aGUgcmVmZXJlbmNlIGNoYW5nZXMgYmVmb3JlIHRoZSBkZWNsYXJhdGlvbiBjaGFuZ2VzKSAKLQkgICAgICAgICAgICAvLyBvdXIgbW9kZWwgcmVmZXJlbmNlcyBtYXkgYmUgbWVzc2VkIHVwIGF0IHRoaXMgcG9pbnQuCi0JICAgICAgICAgICAgLy8gVGhlIGxpbmUgb2YgY29kZSBiZWxvdyBnZXRzIHRoZSBtb2RlbCB0byBmaXggdXAgaXRzIHJlZmVyZW5jZXMuICAKLQkJCQkoKERlZmluaXRpb25JbXBsKSBjb21wb25lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKS5yZWNvbmNpbGVSZWZlcmVuY2VzKHRydWUpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJfQotCX0KLQotCS8vIFRPRE86IFdlIHNob3VsZCBsb29rIGF0IHVzaW5nIHRoZSByZWZhY3RvciBtZWNoYW5pc20gdG8gZG8gdGhpcyByZW5hbWluZy4uLi4KLQlwcml2YXRlIHZvaWQgcmVuYW1lT3BlcmF0aW9uSGVscGVyKE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsgCi0JCUNvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotCQlJdGVyYXRvciBpdCA9IHV0aWwuZ2V0QmluZGluZ09wZXJhdGlvbnMob3BlcmF0aW9uKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZ09wZXJhdGlvbik7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJeyAKLQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5ld05hbWUpOwotCQkJfQotCQkJLy8JCSAgICBUT0RPOiBXZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgbW9kZWwgdG8gcmVuYW1lLi4uLiBOb3QgdGhlIEVsZW1lbnQuLi4KLQkJCS8vCQkJYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG5ld05hbWUpOwotCQl9Ci0JfQotCi0JLy8gVE9ETzogV2Ugc2hvdWxkIGxvb2sgYXQgdXNpbmcgdGhlIHJlZmFjdG9yIG1lY2hhbmlzbSB0byBkbyB0aGlzIHJlbmFtaW5nLi4uLgotCXByaXZhdGUgdm9pZCByZW5hbWVJT0ZIZWxwZXIoV1NETEVsZW1lbnQgb2JqZWN0KQotCXsgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9iamVjdC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7IAotCQlDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChkZWZpbml0aW9uKTsKLQkJTGlzdCBsaXN0ID0gbnVsbDsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW5wdXQpCi0JCXsKLQkJCWxpc3QgPSB1dGlsLmdldEJpbmRpbmdJbnB1dHMoKElucHV0KW9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotCQl7Ci0JCQlsaXN0ID0gdXRpbC5nZXRCaW5kaW5nT3V0cHV0cygoT3V0cHV0KW9iamVjdCk7Ci0JCX0KLQkJZWxzZSAvLyBmYXVsdAotCQl7Ci0JCQlsaXN0ID0gdXRpbC5nZXRCaW5kaW5nRmF1bHRzKChGYXVsdClvYmplY3QpOwotCQl9Ci0KLQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJewotCQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJewotCQkJCU9iamVjdCBiaW5kaW5nT2JqZWN0ID0gaS5uZXh0KCk7Ci0JCQkJcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIoYmluZGluZ09iamVjdCwgbmV3TmFtZSk7Ci0JCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQl9Ci0KLQkJcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIob2JqZWN0LCBuZXdOYW1lKTsKLQl9Ci0KLQkvLyBUT0RPOiBXZSBzaG91bGQgbG9vayBhdCB1c2luZyB0aGUgcmVmYWN0b3IgbWVjaGFuaXNtIHRvIGRvIHRoaXMgcmVuYW1pbmcuLi4uCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZU1vZGVsT2JqZWN0SGVscGVyKE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIHRoZU5ld05hbWUpCi0JewotCQkvLyBUT0RPOiBXZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgbW9kZWwgdG8gcmVuYW1lLi4uLiBOb3QgdGhlIEVsZW1lbnQuLi4KLQkJRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG1vZGVsT2JqZWN0KTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkJeyAKLQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgdGhlTmV3TmFtZSk7Ci0JCX0gICAgCi0KLQkJaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgTWVzc2FnZSkKLQkJewotCQkJTWVzc2FnZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBNZXNzYWdlUmVuYW1lcigoTWVzc2FnZSltb2RlbE9iamVjdCwgdGhlTmV3TmFtZSk7Ci0JCQlyZW5hbWVyLnZpc2l0QmluZGluZ3MoKTsKLQkJfQotCQllbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFBvcnRUeXBlKQotCQl7Ci0JCQlQb3J0VHlwZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBQb3J0VHlwZVJlbmFtZXIoKFBvcnRUeXBlKW1vZGVsT2JqZWN0LCB0aGVOZXdOYW1lKTsKLQkJCXJlbmFtZXIudmlzaXRCaW5kaW5ncygpOwotCQl9Ci0JCWVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZykKLQkJewotCQkJQmluZGluZ1JlbmFtZXIgcmVuYW1lciA9IG5ldyBCaW5kaW5nUmVuYW1lcigoQmluZGluZyltb2RlbE9iamVjdCwgdGhlTmV3TmFtZSk7Ci0JCQlyZW5hbWVyLnZpc2l0U2VydmljZXMoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVJlb3JkZXJNZXNzYWdlUmVmZXJlbmNlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExUmVvcmRlck1lc3NhZ2VSZWZlcmVuY2VzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2U4MjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExUmVvcmRlck1lc3NhZ2VSZWZlcmVuY2VzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kczsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFcxMVJlb3JkZXJNZXNzYWdlUmVmZXJlbmNlc0NvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIHsKLQlwcm90ZWN0ZWQgSU1lc3NhZ2VSZWZlcmVuY2UgbGVmdFNpYmxpbmc7Ci0JcHJvdGVjdGVkIElNZXNzYWdlUmVmZXJlbmNlIHJpZ2h0U2libGluZzsKLQlwcm90ZWN0ZWQgSU1lc3NhZ2VSZWZlcmVuY2UgbW92aW5nUGFyYW1ldGVyOwotCQotCXB1YmxpYyBXMTFSZW9yZGVyTWVzc2FnZVJlZmVyZW5jZXNDb21tYW5kKElNZXNzYWdlUmVmZXJlbmNlIGxlZnRTaWJsaW5nLCBJTWVzc2FnZVJlZmVyZW5jZSByaWdodFNpYmxpbmcsIElNZXNzYWdlUmVmZXJlbmNlIG1vdmluZ1BhcmFtZXRlcikgewotICAgICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX1JFT1JERVJfTUVTU0FHRV9SRUZFUkVOQ0UsIG51bGwpOwotCQl0aGlzLmxlZnRTaWJsaW5nID0gbGVmdFNpYmxpbmc7Ci0JCXRoaXMucmlnaHRTaWJsaW5nID0gcmlnaHRTaWJsaW5nOwotCQl0aGlzLm1vdmluZ1BhcmFtZXRlciA9IG1vdmluZ1BhcmFtZXRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJSU1lc3NhZ2VSZWZlcmVuY2UgbGVmdFNpYkVsZW1lbnQgPSBudWxsOwotCQlJTWVzc2FnZVJlZmVyZW5jZSBtb3ZpbmdDaGlsZCA9IG51bGw7Ci0JCQotCQlpZiAobGVmdFNpYmxpbmcgaW5zdGFuY2VvZiBJTWVzc2FnZVJlZmVyZW5jZSkgewotCQkJbGVmdFNpYkVsZW1lbnQgPSAoSU1lc3NhZ2VSZWZlcmVuY2UpIGxlZnRTaWJsaW5nOyAKLQkJfQotCQlpZiAobW92aW5nUGFyYW1ldGVyIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkJCW1vdmluZ0NoaWxkID0gKElNZXNzYWdlUmVmZXJlbmNlKSBtb3ZpbmdQYXJhbWV0ZXI7Ci0JCX0KLQkJCi0JCVcxMU9wZXJhdGlvbiB3MTFPcGVyYXRpb24gPSAoVzExT3BlcmF0aW9uKSBtb3ZpbmdDaGlsZC5nZXRPd25lck9wZXJhdGlvbigpOwotCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgdzExT3BlcmF0aW9uLmdldFRhcmdldCgpOwotCQkKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKG9wZXJhdGlvbi5nZXRFbGVtZW50KCkpOwotCi0JCQlpZiAobW92aW5nQ2hpbGQuZ2V0S2luZCgpID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfSU5QVVQpIHsKLQkJCQlpZiAobGVmdFNpYkVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkvLyBJbnB1dC9PdXRwdXQgc3R5bGUKLQkJCQkJc2V0SW5wdXRPdXRwdXRPcmRlcihvcGVyYXRpb24sIHRydWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsZWZ0U2liRWxlbWVudCAhPSBudWxsICYmIGxlZnRTaWJFbGVtZW50LmdldEtpbmQoKSA9PSBJTWVzc2FnZVJlZmVyZW5jZS5LSU5EX0lOUFVUKSB7Ci0JCQkJCWlmIChyaWdodFNpYmxpbmcuZ2V0S2luZCgpID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfT1VUUFVUKSB7Ci0JCQkJCQkvLyBJbnB1dC9PdXRwdXQgc3R5bGUKLQkJCQkJCXNldElucHV0T3V0cHV0T3JkZXIob3BlcmF0aW9uLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gT3V0cHV0L0lucHV0IHN0eWxlCi0JCQkJCXNldElucHV0T3V0cHV0T3JkZXIob3BlcmF0aW9uLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobW92aW5nQ2hpbGQuZ2V0S2luZCgpID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfT1VUUFVUKSB7Ci0JCQkJaWYgKGxlZnRTaWJFbGVtZW50ID09IG51bGwpIHsKLQkJCQkJLy8gT3V0cHV0L0lucHV0IHN0eWxlCi0JCQkJCXNldElucHV0T3V0cHV0T3JkZXIob3BlcmF0aW9uLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGxlZnRTaWJFbGVtZW50ICE9IG51bGwgJiYgbGVmdFNpYkVsZW1lbnQuZ2V0S2luZCgpID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfT1VUUFVUKSB7Ci0JCQkJCWlmIChyaWdodFNpYmxpbmcuZ2V0S2luZCgpID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfSU5QVVQpIHsKLQkJCQkJCS8vIE91dHB1dC9JbnB1dCBzdHlsZQotCQkJCQkJc2V0SW5wdXRPdXRwdXRPcmRlcihvcGVyYXRpb24sIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gSW5wdXQvT3V0cHV0IHN0eWxlCi0JCQkJCXNldElucHV0T3V0cHV0T3JkZXIob3BlcmF0aW9uLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmRSZWNvcmRpbmcob3BlcmF0aW9uLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JLy8gYm9vbGVhbiBpbnB1dEZpcnN0ID0gdHJ1ZSBpZiB0aGUgSW5wdXQgaXMgdGhlIGZpcnN0IGluIHRoZSBvcmRlciBvZiBJbnB1dCBhbmQgT3V0cHV0Ci0JcHJpdmF0ZSB2b2lkIHNldElucHV0T3V0cHV0T3JkZXIoT3BlcmF0aW9uIG9wZXJhdGlvbiwgYm9vbGVhbiBpbnB1dEZpcnN0KSB7Ci0JCS8vIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIG1vcmUgaW5mbyBiZWZvcmUgd2UgY2FuIHNldCB0aGUgc3R5bGUJCi0JCWlmIChpbnB1dEZpcnN0ICYmIG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBPdXRwdXQKLQkJCWlmIChvcGVyYXRpb24uZ2V0RU91dHB1dCgpICE9IG51bGwpIHsKLQkJCQkvLyBPcmRlciBpczogSW5wdXQsIE91dHB1dAotCQkJCXNldE9wZXJhdGlvblN0eWxlKG9wZXJhdGlvbiwgT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIE9yZGVyIGlzOiBJbnB1dAotCQkJCXNldE9wZXJhdGlvblN0eWxlKG9wZXJhdGlvbiwgT3BlcmF0aW9uVHlwZS5PTkVfV0FZKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChvcGVyYXRpb24uZ2V0RU91dHB1dCgpICE9IG51bGwpIHsKLQkJCS8vIENoZWNrIGlmIHRoZXJlIGlzIGFuIElucHV0Ci0JCQlpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkvLyBPcmRlciBpczogT3V0cHV0LCBJbnB1dAotCQkJCXNldE9wZXJhdGlvblN0eWxlKG9wZXJhdGlvbiwgT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIE9yZGVyIGlzOiBPdXRwdXQKLQkJCQlzZXRPcGVyYXRpb25TdHlsZShvcGVyYXRpb24sIE9wZXJhdGlvblR5cGUuTk9USUZJQ0FUSU9OKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0T3BlcmF0aW9uU3R5bGUoT3BlcmF0aW9uIG9wZXJhdGlvbiwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKSB7Ci0JCS8vIElmIHRoZXJlIGlzIG5vIHN0eWxlIHRvIGJlZ2luIHdpdGgsIGRvbid0IHNldCBvbmUgbm93Ci0JCWlmIChvcGVyYXRpb24uZ2V0U3R5bGUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCW9wZXJhdGlvbi5zZXRTdHlsZShvcGVyYXRpb25UeXBlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFSZW9yZGVyUGFyYW1ldGVyc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExUmVvcmRlclBhcmFtZXRlcnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNzVlODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFSZW9yZGVyUGFyYW1ldGVyc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFQYXJhbWV0ZXJGb3JBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExUGFyYW1ldGVyRm9yRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFQYXJhbWV0ZXJGb3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLQotcHVibGljIGNsYXNzIFcxMVJlb3JkZXJQYXJhbWV0ZXJzQ29tbWFuZCBleHRlbmRzIFcxMVRvcExldmVsRWxlbWVudENvbW1hbmQgewotICAgIHByb3RlY3RlZCBJUGFyYW1ldGVyIGxlZnRTaWJsaW5nOwotICAgIHByb3RlY3RlZCBJUGFyYW1ldGVyIHJpZ2h0U2libGluZzsKLSAgICBwcm90ZWN0ZWQgSVBhcmFtZXRlciBtb3ZpbmdQYXJhbWV0ZXI7Ci0gICAgCi0gICAgcHVibGljIFcxMVJlb3JkZXJQYXJhbWV0ZXJzQ29tbWFuZChJUGFyYW1ldGVyIGxlZnRTaWJsaW5nLCBJUGFyYW1ldGVyIHJpZ2h0U2libGluZywgSVBhcmFtZXRlciBtb3ZpbmdQYXJhbWV0ZXIpIHsKLSAgICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9SRU9SREVSX1BBUlQsIG51bGwpOwotICAgICAgICB0aGlzLmxlZnRTaWJsaW5nID0gbGVmdFNpYmxpbmc7Ci0gICAgICAgIHRoaXMucmlnaHRTaWJsaW5nID0gcmlnaHRTaWJsaW5nOwotICAgICAgICB0aGlzLm1vdmluZ1BhcmFtZXRlciA9IG1vdmluZ1BhcmFtZXRlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAJaWYgKGxlZnRTaWJsaW5nIGluc3RhbmNlb2YgVzExUGFyYW1ldGVyRm9yUGFydCB8fAotICAgIAkJcmlnaHRTaWJsaW5nIGluc3RhbmNlb2YgVzExUGFyYW1ldGVyRm9yUGFydCB8fAotICAgIAkJbW92aW5nUGFyYW1ldGVyIGluc3RhbmNlb2YgVzExUGFyYW1ldGVyRm9yUGFydCkgewotICAgIAkJZXhlY3V0ZUZvclBhcnQoKTsKLSAgICAJfQotICAgIAllbHNlIGlmIChsZWZ0U2libGluZyBpbnN0YW5jZW9mIFcxMVBhcmFtZXRlckZvckVsZW1lbnQgfHwKLSAgICAgICAgCQkgcmlnaHRTaWJsaW5nIGluc3RhbmNlb2YgVzExUGFyYW1ldGVyRm9yRWxlbWVudCB8fAotICAgICAgICAJCSBtb3ZpbmdQYXJhbWV0ZXIgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JFbGVtZW50KSB7Ci0gICAgCQlleGVjdXRlRm9yRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgCWVsc2UgaWYgKGxlZnRTaWJsaW5nIGluc3RhbmNlb2YgVzExUGFyYW1ldGVyRm9yQXR0cmlidXRlIHx8Ci0gICAgICAgCQkgICAgIHJpZ2h0U2libGluZyBpbnN0YW5jZW9mIFcxMVBhcmFtZXRlckZvckF0dHJpYnV0ZSB8fAotICAgIAkJICAgICBtb3ZpbmdQYXJhbWV0ZXIgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JBdHRyaWJ1dGUpIHsKLS8vICAgIAkJZXhlY3V0ZUZvckVsZW1lbnQoKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUZvckVsZW1lbnQoKSB7Ci0gICAgCVhTREVsZW1lbnREZWNsYXJhdGlvbiBsZWZ0U2liRWxlbWVudCA9IG51bGw7Ci0gICAgCVhTREVsZW1lbnREZWNsYXJhdGlvbiByaWdodFNpYkVsZW1lbnQgPSBudWxsOwotICAgIAlYU0RFbGVtZW50RGVjbGFyYXRpb24gbW92aW5nQ2hpbGQgPSBudWxsOwotICAgIAkKLQkJWFNEUGFydGljbGUgbW92aW5nUGFydGljbGUgPSBudWxsOwotCQlYU0RQYXJ0aWNsZSBsZWZ0UGFydGljbGUgPSBudWxsOwotCQlYU0RQYXJ0aWNsZSByaWdodFBhcnRpY2xlID0gbnVsbDsKLQotCQlpZiAobGVmdFNpYmxpbmcgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JFbGVtZW50KSB7Ci0JCQlsZWZ0U2liRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pICgoVzExUGFyYW1ldGVyRm9yRWxlbWVudCkgbGVmdFNpYmxpbmcpLmdldFRhcmdldCgpOwotCQkJbGVmdFBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBsZWZ0U2liRWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJaWYgKHJpZ2h0U2libGluZyBpbnN0YW5jZW9mIFcxMVBhcmFtZXRlckZvckVsZW1lbnQpIHsKLQkJCXJpZ2h0U2liRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pICgoVzExUGFyYW1ldGVyRm9yRWxlbWVudCkgcmlnaHRTaWJsaW5nKS5nZXRUYXJnZXQoKTsKLQkJCXJpZ2h0UGFydGljbGUgPSAoWFNEUGFydGljbGUpIHJpZ2h0U2liRWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJaWYgKG1vdmluZ1BhcmFtZXRlciBpbnN0YW5jZW9mIFcxMVBhcmFtZXRlckZvckVsZW1lbnQpIHsKLQkJCW1vdmluZ0NoaWxkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgKChXMTFQYXJhbWV0ZXJGb3JFbGVtZW50KSBtb3ZpbmdQYXJhbWV0ZXIpLmdldFRhcmdldCgpOwotCQkJbW92aW5nUGFydGljbGUgPSAoWFNEUGFydGljbGUpIG1vdmluZ0NoaWxkLmVDb250YWluZXIoKTsKLQkJfQotCQkKLQkJaWYgKG1vdmluZ0NoaWxkLmVxdWFscyhsZWZ0U2liRWxlbWVudCkgfHwgbW92aW5nQ2hpbGQuZXF1YWxzKHJpZ2h0U2liRWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotICAgIAkKLSAgICAJaWYgKG1vdmluZ0NoaWxkICE9IG51bGwpIHsKLSAgICAJCXRyeSB7Ci0gICAgCQkJYmVnaW5SZWNvcmRpbmcobW92aW5nUGFydGljbGUuZ2V0RWxlbWVudCgpKTsKLQotICAgIAkJCVhTRE1vZGVsR3JvdXAgY29udGFpbmVyID0gKFhTRE1vZGVsR3JvdXApIG1vdmluZ1BhcnRpY2xlLmdldENvbnRhaW5lcigpOwotICAgIAkJCUxpc3QgcGFydGljbGVzID0gY29udGFpbmVyLmdldENvbnRlbnRzKCk7Ci0gICAgCQkJCi0gICAgCQkJcGFydGljbGVzLnJlbW92ZShtb3ZpbmdQYXJ0aWNsZSk7Ci0KLSAgICAJCQlpbnQgbGVmdEluZGV4ID0gLTEsIHJpZ2h0SW5kZXggPSAtMTsKLSAgICAJCQlpZiAobGVmdFBhcnRpY2xlICE9IG51bGwpIHsKLSAgICAJCQkJbGVmdEluZGV4ID0gcGFydGljbGVzLmluZGV4T2YobGVmdFBhcnRpY2xlKTsKLSAgICAJCQl9Ci0gICAgCQkJaWYgKHJpZ2h0UGFydGljbGUhPSBudWxsKSB7Ci0gICAgCQkJCXJpZ2h0SW5kZXggPSBwYXJ0aWNsZXMuaW5kZXhPZihyaWdodFBhcnRpY2xlKTsKLSAgICAJCQl9Ci0KLSAgICAJCQlpZiAobGVmdEluZGV4ID09IC0xKSB7Ci0gICAgCQkJCS8vIEFkZCBtb3ZpbmcgY2hpbGQgdG8gdGhlIGZyb250Ci0gICAgCQkJCXBhcnRpY2xlcy5hZGQoMCwgbW92aW5nUGFydGljbGUpOyAgCQkJCQotICAgIAkJCX0KLSAgICAJCQllbHNlIGlmIChyaWdodEluZGV4ID09IC0xKSB7Ci0gICAgCQkJCS8vIEFkZCBtb3ZpbmcgY2hpbGQgdG8gdGhlIGVuZAotICAgIAkJCQlwYXJ0aWNsZXMuYWRkKG1vdmluZ1BhcnRpY2xlKTsKLSAgICAJCQl9Ci0gICAgCQkJZWxzZSB7Ci0gICAgCQkJCS8vIEFkZCBtb3ZpbmcgY2hpbGQgYWZ0ZXIgdGhlIG9jY3VyZW5jZSBvZiB0aGUgbGVmdCBzaWJsaW5nCi0gICAgCQkJCXBhcnRpY2xlcy5hZGQobGVmdEluZGV4ICsgMSwgbW92aW5nUGFydGljbGUpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCWZpbmFsbHkgewotICAgIAkJCWVuZFJlY29yZGluZyhtb3ZpbmdQYXJ0aWNsZS5nZXRFbGVtZW50KCkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlRm9yUGFydCgpIHsKLQkJUGFydCBsZWZ0U2liRWxlbWVudCA9IG51bGw7Ci0JCVBhcnQgcmlnaHRTaWJFbGVtZW50ID0gbnVsbDsKLQkJUGFydCBtb3ZpbmdDaGlsZCA9IG51bGw7Ci0KLQkJaWYgKGxlZnRTaWJsaW5nIGluc3RhbmNlb2YgVzExUGFyYW1ldGVyRm9yUGFydCkgewotCQkJbGVmdFNpYkVsZW1lbnQgPSAoUGFydCkgKChXMTFQYXJhbWV0ZXJGb3JQYXJ0KSBsZWZ0U2libGluZykuZ2V0VGFyZ2V0KCk7IAotCQl9Ci0JCWlmIChyaWdodFNpYmxpbmcgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JQYXJ0KSB7Ci0JCQlyaWdodFNpYkVsZW1lbnQgPSAoUGFydCkgKChXMTFQYXJhbWV0ZXJGb3JQYXJ0KSByaWdodFNpYmxpbmcpLmdldFRhcmdldCgpOwotCQl9Ci0JCWlmIChtb3ZpbmdQYXJhbWV0ZXIgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JQYXJ0KSB7Ci0JCQltb3ZpbmdDaGlsZCA9IChQYXJ0KSAoKFcxMVBhcmFtZXRlckZvclBhcnQpIG1vdmluZ1BhcmFtZXRlcikuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJCi0JCWlmIChtb3ZpbmdDaGlsZC5lcXVhbHMobGVmdFNpYkVsZW1lbnQpIHx8IG1vdmluZ0NoaWxkLmVxdWFscyhyaWdodFNpYkVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLSAgICAJCi0gICAgCWlmIChtb3ZpbmdDaGlsZCAhPSBudWxsKSB7Ci0gICAgCQl0cnkgewotICAgIAkJCWJlZ2luUmVjb3JkaW5nKG1vdmluZ0NoaWxkLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIAkJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1vdmluZ0NoaWxkLmVDb250YWluZXIoKTsKLSAgICAJCQlMaXN0IHBhcnRzID0gbWVzc2FnZS5nZXRFUGFydHMoKTsKLQotICAgIAkJCXBhcnRzLnJlbW92ZShtb3ZpbmdDaGlsZCk7Ci0KLSAgICAJCQlpbnQgbGVmdEluZGV4ID0gLTEsIHJpZ2h0SW5kZXggPSAtMTsKLSAgICAJCQlpZiAobGVmdFNpYkVsZW1lbnQgIT0gbnVsbCkgewotICAgIAkJCQlsZWZ0SW5kZXggPSBwYXJ0cy5pbmRleE9mKGxlZnRTaWJFbGVtZW50KTsKLSAgICAJCQl9Ci0gICAgCQkJaWYgKHJpZ2h0U2liRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgCQkJCXJpZ2h0SW5kZXggPSBwYXJ0cy5pbmRleE9mKHJpZ2h0U2liRWxlbWVudCk7Ci0gICAgCQkJfQotCi0gICAgCQkJaWYgKGxlZnRJbmRleCA9PSAtMSkgewotICAgIAkJCQkvLyBBZGQgbW92aW5nIGNoaWxkIHRvIHRoZSBmcm9udAotICAgIAkJCQlwYXJ0cy5hZGQoMCwgbW92aW5nQ2hpbGQpOyAgCQkJCQotICAgIAkJCX0KLSAgICAJCQllbHNlIGlmIChyaWdodEluZGV4ID09IC0xKSB7Ci0gICAgCQkJCS8vIEFkZCBtb3ZpbmcgY2hpbGQgdG8gdGhlIGVuZAotICAgIAkJCQlwYXJ0cy5hZGQobW92aW5nQ2hpbGQpOwotICAgIAkJCX0KLSAgICAJCQllbHNlIHsKLSAgICAJCQkJLy8gQWRkIG1vdmluZyBjaGlsZCBhZnRlciB0aGUgb2NjdXJlbmNlIG9mIHRoZSBsZWZ0IHNpYmxpbmcKLSAgICAJCQkJcGFydHMuYWRkKGxlZnRJbmRleCArIDEsIG1vdmluZ0NoaWxkKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCQlmaW5hbGx5IHsKLSAgICAJCQllbmRSZWNvcmRpbmcobW92aW5nQ2hpbGQuZ2V0RWxlbWVudCgpKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVNldEFkZHJlc3NDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVNldEFkZHJlc3NDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDAyMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFTZXRBZGRyZXNzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBXMTFTZXRBZGRyZXNzQ29tbWFuZCBleHRlbmRzIFcxMVRvcExldmVsRWxlbWVudENvbW1hbmQgewotCXByaXZhdGUgUG9ydCBwb3J0OwotCXByaXZhdGUgU3RyaW5nIG5ld0FkZHJlc3M7Ci0JCi0JcHVibGljIFcxMVNldEFkZHJlc3NDb21tYW5kKFBvcnQgcG9ydCwgU3RyaW5nIG5ld0FkZHJlc3MpIHsKLSAgICAgICAgc3VwZXIoIiIsIHBvcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsgIC8vIFRPRE86IE5lZWQgdG8gYWRkIFN0cmluZyBoZXJlLi4uCi0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCXRoaXMubmV3QWRkcmVzcyA9IG5ld0FkZHJlc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQliZWdpblJlY29yZGluZyhwb3J0LmdldEVsZW1lbnQoKSk7Ci0KLQkJCS8vIFNob3VsZCB0aGUgYWN0dWFsIHNldCBhZGRyZXNzIGNvZGUgbGl2ZSBpbiBpdCdzICdvd24gc2VwYXJhdGUnIGNvbW1hbmQ/PwotCQkJaWYgKCFzZXRBZGRyZXNzKCkpIHsKLQkJCQljcmVhdGVOZXdFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCQkJCXNldEFkZHJlc3MoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuZFJlY29yZGluZyhwb3J0LmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNldEFkZHJlc3MoKSB7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkKLQkJaWYgKHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGVlSXQgPSBwb3J0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGVlSXQuaGFzTmV4dCgpKSB7Ci0JCQkJRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlZUl0Lm5leHQoKSk7Ci0JCQkJaWYgKGVlIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLQkJCQkJKChTT0FQQWRkcmVzcykgZWUpLnNldExvY2F0aW9uVVJJKG5ld0FkZHJlc3MpOwotCQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZWUgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykgewotCQkJCQkoKEhUVFBBZGRyZXNzKSBlZSkuc2V0TG9jYXRpb25VUkkobmV3QWRkcmVzcyk7Ci0JCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJCX0KLQkvLwkJCWVlLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgbmV3QWRkcmVzcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotCS8qCi0JICogVE9ETzogcm1haDogV2UgbmVlZCB0byBjbGVhbiB0aGUgY29kZSBiZWxvdy4uLi4uCi0JICogVGhpbmdzIHNob3VsZCBiZSB3cmFwcGVkIHVwIGFuZCBwbGFjZWQgaW4gYSBjb21tb24gbG9jYXRpb24uICBDdXJyZW50bHksIHRoaXMgaXMKLQkgKiBmcm9tIHRoZSBBZGRFRU1lbnVBY3Rpb25Db250cml1Ym9yLmphdmEgY2xhc3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTmV3RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSB7Ci0JCUxpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocG9ydC5nZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBvcnQuZ2V0RWxlbWVudCgpKTsKLQkgICAgCi0JICAgIGlmIChlZCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgICAgIC8vIGFkZCBpbnNlcnQgY2hpbGQgbm9kZSBhY3Rpb25zCi0JICAgICAgICAgIC8vCi0JICAgICAgICAgIGludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLQkgICAgICAgICAgaW50IHZjID0gTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1Q7Ci0KLQkgICAgICAgICAgbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKHBvcnQuZ2V0RWxlbWVudCgpLCBlZCwgLTEsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCSAgICAgfQotCSAgICAKLQkgICAgY3JlYXRlTmV3RXh0ZW5zaWJpbGl0eUVsZW1lbnRIZWxwZXIxKG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld0V4dGVuc2liaWxpdHlFbGVtZW50SGVscGVyMShMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0KQotCSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVsUXVlcnlBY3Rpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgICBNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKWkubmV4dCgpOwotCSAgICAgIENNTm9kZSBjbW5vZGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCk7Ci0JICAgICAgaWYgKGNtbm9kZSAhPSBudWxsKQotCSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgIGJvb2xlYW4gaXNPdGhlck5hbWVzcGFjZSA9IGZhbHNlOwotCSAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpY21ub2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpICAgICAgICAgIAotCSAgICAgICAgeyAgICAgICAgICAgICAKLQkgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICBpc090aGVyTmFtZXNwYWNlID0gbmFtZXNwYWNlVVJJICE9IG51bGwgJiYgIW5hbWVzcGFjZVVSSS5lcXVhbHMoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotCSAgICAgICAgfQotCi0JICAgICAgICBpZiAoaXNPdGhlck5hbWVzcGFjZSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgaW50IGNtTm9kZVR5cGUgPSBjbW5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkgICAgICAgICAgaWYgKGFjdGlvbi5nZXRLaW5kKCkgPT0gTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpCi0JICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgc3dpdGNoIChjbU5vZGVUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgCSAgY3JlYXRlTmV3RXh0ZW5zaWJpbGl0eUVsZW1lbnRIZWxwZXIyKChDTUVsZW1lbnREZWNsYXJhdGlvbiljbW5vZGUsIGFjdGlvbi5nZXRQYXJlbnQoKSwgYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSk7Ci0JICAgICAgICAgICAgICAgIHJldHVybjsKLQkgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgIH0gICAgICAgICAgIAotCSAgICAgICAgfQotCSAgICAgIH0gICAKLQkgICAgfQotCSAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlTmV3RXh0ZW5zaWJpbGl0eUVsZW1lbnRIZWxwZXIyKENNTm9kZSBjbW5vZGUsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgaWYgKGNtbm9kZSAhPSBudWxsICYmIHBhcmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudClwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOyAgICAgICAgCi0KLSAgICAgICAgRE9NQ29udGVudEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBET01Db250ZW50QnVpbGRlckltcGwoZG9jdW1lbnQpOyAKLSAgICAgICAgYnVpbGRlci5zZXRQcm9wZXJ0eShET01Db250ZW50QnVpbGRlci5QUk9QRVJUWV9CVUlMRF9CTEFOS19URVhUX05PREVTLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBidWlsZGVyLnNldEJ1aWxkUG9saWN5KERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCk7Ci0gICAgICAgIGJ1aWxkZXIuYnVpbGQocGFyZW50LCBjbW5vZGUpOwotICAgICAgICBpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBidWlsZGVyLmdldFJlc3VsdCgpLCBpbmRleCwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIGluc2VydE5vZGVzQXRJbmRleChOb2RlIHBhcmVudCwgTGlzdCBsaXN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gZm9ybWF0KQotICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGluZGV4ID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgICBOb2RlIHJlZkNoaWxkID0gKGluZGV4IDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpID8gbm9kZUxpc3QuaXRlbShpbmRleCkgOiBudWxsOwotICAgIAotICAgICAgLy8gaGVyZSB3ZSBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB0aGUgcHJldmlvdXMgbm9kZSBpcyBhICd3aGl0ZSBzcGFjZScgVGV4dCBub2RlCi0gICAgICAvLyB3ZSBzaG91bGQgcmVhbGx5IGRvIHRoZSBpbnNlcnQgYmVmb3JlIHRoaXMgbm9kZQotICAgICAgLy8KLSAgICAgIGludCBwcmV2SW5kZXggPSBpbmRleCAtIDE7Ci0gICAgICBOb2RlIHByZXZDaGlsZCA9IChwcmV2SW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKHByZXZJbmRleCkgOiBudWxsOwotCSAgICBpZiAoaXNXaGl0ZXNwYWNlVGV4dE5vZGUocHJldkNoaWxkKSkgCi0gICAgICB7Ci0JICAJICByZWZDaGlsZCA9IHByZXZDaGlsZDsKLQkgICAgfQotICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOb2RlIG5ld05vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAKLSAgICAgICAgaWYgKG5ld05vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50OwotICAgICAgICAgIHBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZSgoQXR0ciluZXdOb2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZkNoaWxkKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbmV3Tm9kZSA9IChOb2RlKWkubmV4dCgpOwotICAgICAgICBpZiAoZm9ybWF0KQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkgICAgICBGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkgICAgICBmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpbmV3Tm9kZSk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgLy9zZXRWaWV3ZXJTZWxlY3Rpb24obGlzdCk7Ci0gICAgfSAgIAotCQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzV2hpdGVzcGFjZVRleHROb2RlKE5vZGUgbm9kZSkgCi0gICAgewotCSAgICByZXR1cm4gKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExU2V0QmluZGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExU2V0QmluZGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkYTk0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVNldEJpbmRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgVzExU2V0QmluZGluZ0NvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIHsKLQlwcml2YXRlIFBvcnQgcG9ydDsKLQlwcml2YXRlIEJpbmRpbmcgYmluZGluZzsKLQkKLQlwdWJsaWMgVzExU2V0QmluZGluZ0NvbW1hbmQoUG9ydCBwb3J0LCBCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfQklORElORywgcG9ydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQl0aGlzLnBvcnQgPSBwb3J0OwotCQl0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJYmVnaW5SZWNvcmRpbmcocG9ydC5nZXRFbGVtZW50KCkpOwotCQkJcG9ydC5zZXRFQmluZGluZyhiaW5kaW5nKTsKLQotCQkJdXBkYXRlUG9ydFByb3RvY29sKHBvcnQsIGJpbmRpbmcpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kUmVjb3JkaW5nKHBvcnQuZ2V0RWxlbWVudCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlUG9ydFByb3RvY29sKFBvcnQgcG9ydCwgQmluZGluZyBiaW5kaW5nKSB7Ci0JCVN0cmluZyBwb3J0QWRkcmVzcyA9IG51bGw7Ci0JCU9iamVjdCBiaW5kaW5nUHJvdG9jb2wgPSBnZXRCaW5kaW5nUHJvdG9jb2woYmluZGluZyk7Ci0JCU9iamVjdCBwb3J0UHJvdG9jb2wgPSBnZXRQb3J0UHJvdG9jb2wocG9ydCk7Ci0JCQotCQlpZiAocG9ydFByb3RvY29sIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLQkJCXBvcnRBZGRyZXNzID0gKChTT0FQQWRkcmVzcykgcG9ydFByb3RvY29sKS5nZXRMb2NhdGlvblVSSSgpOwotCQl9Ci0JCWVsc2UgaWYgKHBvcnRQcm90b2NvbCBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKSB7Ci0JCQlwb3J0QWRkcmVzcyA9ICgoSFRUUEFkZHJlc3MpIHBvcnRQcm90b2NvbCkuZ2V0TG9jYXRpb25VUkkoKTsKLQkJfQotCi0JCWlmIChwb3J0QWRkcmVzcyA9PSBudWxsKSB7Ci0JCQlwb3J0QWRkcmVzcyA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnIjsKLQkJfQotCQkKLQkJaWYgKGJpbmRpbmdQcm90b2NvbCBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nICYmICEocG9ydFByb3RvY29sIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpKSB7Ci0JCQlTT0FQQWRkcmVzcyBzb2FwID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBBZGRyZXNzKCk7Ci0JCQlzb2FwLnNldExvY2F0aW9uVVJJKHBvcnRBZGRyZXNzKTsKLQkJCXNldE5ld1Byb3RvY29sKHBvcnQsIHNvYXApOwotCQl9Ci0JCWVsc2UgaWYgKGJpbmRpbmdQcm90b2NvbCBpbnN0YW5jZW9mIEhUVFBCaW5kaW5nICYmICEocG9ydFByb3RvY29sIGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpKSB7Ci0JCQlIVFRQQWRkcmVzcyBodHRwID0gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBBZGRyZXNzKCk7Ci0JCQlodHRwLnNldExvY2F0aW9uVVJJKHBvcnRBZGRyZXNzKTsKLQkJCXNldE5ld1Byb3RvY29sKHBvcnQsIGh0dHApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRCaW5kaW5nUHJvdG9jb2woQmluZGluZyBiaW5kaW5nKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nIHx8IGl0ZW0gaW5zdGFuY2VvZiBIVFRQQmluZGluZykgewotCQkJCXJldHVybiBpdGVtOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFBvcnRQcm90b2NvbChQb3J0IHBvcnQpIHsKLQkJCi0JCUl0ZXJhdG9yIGl0ID0gcG9ydC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0gICAgICAgIAlpZiAoaXRlbSBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKSB7Ci0gICAgICAgIAkJcmV0dXJuIGl0ZW07Ci0gICAgICAgIAl9Ci0gICAgICAgIAllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpIHsKLSAgICAgICAgCQlyZXR1cm4gaXRlbTsKLSAgICAgICAgCX0KLSAgICAgICAgfQkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXROZXdQcm90b2NvbChQb3J0IHBvcnQsIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gcG9ydC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBleGlzdGluZ0VsZW1lbnRzLnNpemUoKTsgaW5kZXgrKykgewotCQkJT2JqZWN0IGl0ZW0gPSBleGlzdGluZ0VsZW1lbnRzLmdldChpbmRleCk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzIHx8IGl0ZW0gaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykgewotCQkJCWV4aXN0aW5nRWxlbWVudHMucmVtb3ZlKGluZGV4KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXBvcnQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFTZXRFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFTZXRFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzBiMTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExU2V0RWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdC5XU0RMWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVzExU2V0RWxlbWVudENvbW1hbmQgZXh0ZW5kcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIHsKLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYWN0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBjb250aW51ZUFwcGx5OwotCQotCS8vIFRPRE86IHJtYWg6IHNpZ25hdHVyZSBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2hhbmdlZCBwb3N0IFdUUCAxLjUuICBJbnN0ZWFkIG9mIHRha2luZyBpbgotCS8vIGFuICJPYmplY3QgcGFyZW50IiwgaXQgc2hvdWxkIGJlICJQYXJ0IHBhcmVudCIuCi0JcHVibGljIFcxMVNldEVsZW1lbnRDb21tYW5kKE9iamVjdCBwYXJlbnQsIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfRUxFTUVOVCwgKChQYXJ0KSBwYXJlbnQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0JewotCQl0cnkgewotCQkJYmVnaW5SZWNvcmRpbmcoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCi0JCQlDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0JCQljb250aW51ZUFwcGx5ID0gdHJ1ZTsgCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUGFydCkKLQkJCXsKLQkJCQlQYXJ0IHBhcnQgPSAoUGFydCkgcGFyZW50OwotCQkJCWlmIChhY3Rpb24uZXF1YWxzKElQYXJhbWV0ZXIuU0VUX05FV19BQ1RJT05fSUQpKQotCQkJCXsKLQkJCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZSA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKWludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXROZXdEaWFsb2coKSk7Ci0KLQkJCQkJLy8gU2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIG5ldyB0eXBlCi0JCQkJCWlmIChjb250aW51ZUFwcGx5KQotCQkJCQkJY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHBhcnQsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZSA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKWludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXRCcm93c2VEaWFsb2coKSk7Ci0JCQkJCWlmIChjb250aW51ZUFwcGx5KQotCQkJCQkJY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHBhcnQsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQkJZm9ybWF0Q2hpbGQocGFydC5nZXRFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kUmVjb3JkaW5nKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBpbnZva2VEaWFsb2coSUNvbXBvbmVudERpYWxvZyBkaWFsb2cpCi0JewotCQlPYmplY3QgbmV3VmFsdWUgPSBudWxsOwotCQkKLQkJaWYgKGRpYWxvZyA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQluZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY29udGludWVBcHBseSA9IGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpCi0JewotCQlDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZXN1bHQgPSBudWxsOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkKLQkJewotCQkJcmVzdWx0ID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0JCQkKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IpCi0JCQl7Ci0JCQkJSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yIHdzZGxFZGl0b3IgPSAoSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yKSBlZGl0b3I7Ci0JCQkJCi0JCQkJTGlzdCB0eXBlcyA9IHdzZGxFZGl0b3IuZ2V0TW9kZWwoKS5nZXRUeXBlcygpOwotCQkJCVhTRFNjaGVtYVtdIHNjaGVtYXMgPSBuZXcgWFNEU2NoZW1hW3R5cGVzLnNpemUoKV07Ci0JCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVzLnNpemUoKTsgaW5kZXgrKykgewotCQkJCQlXMTFUeXBlIHR5cGUgPSAoVzExVHlwZSkgdHlwZXMuZ2V0KGluZGV4KTsKLQkJCQkJc2NoZW1hc1tpbmRleF0gPSAoWFNEU2NoZW1hKSB0eXBlLmdldFRhcmdldCgpOwotCQkJCX0KLQkJCQkKLQkJCQkoKFdTRExYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpIHJlc3VsdCkuc2V0U2NoZW1hcyhzY2hlbWFzKTsKLQkJCQkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9ICAKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFTZXRJbnRlcmZhY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVNldEludGVyZmFjZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4ODJkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVNldEludGVyZmFjZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXMTFTZXRJbnRlcmZhY2VDb21tYW5kIGV4dGVuZHMgVzExVG9wTGV2ZWxFbGVtZW50Q29tbWFuZCB7Ci0JcHJpdmF0ZSBCaW5kaW5nIGJpbmRpbmc7Ci0JcHJpdmF0ZSBQb3J0VHlwZSBwb3J0VHlwZTsKLQkKLQlwdWJsaWMgVzExU2V0SW50ZXJmYWNlQ29tbWFuZChCaW5kaW5nIGJpbmRpbmcsIFBvcnRUeXBlIHBvcnRUeXBlKSB7Ci0gICAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX1BPUlRUWVBFLCBiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0JCXRoaXMucG9ydFR5cGUgPSBwb3J0VHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWJlZ2luUmVjb3JkaW5nKGJpbmRpbmcuZ2V0RWxlbWVudCgpKTsKLQkJCWJpbmRpbmcuc2V0RVBvcnRUeXBlKHBvcnRUeXBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuZFJlY29yZGluZyhiaW5kaW5nLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFTZXRUeXBlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFTZXRUeXBlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZThmNjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvY29tbWFuZHMvVzExU2V0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLkludGVybmFsV1NETE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQuV1NETFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBXMTFTZXRUeXBlQ29tbWFuZCBleHRlbmRzIFcxMVRvcExldmVsRWxlbWVudENvbW1hbmQgewotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQlwcml2YXRlIFN0cmluZyBhY3Rpb247Ci0JcHJpdmF0ZSBib29sZWFuIGNvbnRpbnVlQXBwbHk7Ci0JCi0JcHVibGljIFcxMVNldFR5cGVDb21tYW5kKE9iamVjdCBwYXJlbnQsIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfVFlQRSwgbnVsbCk7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0JewotCQl0cnkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB7Ci0JCQkJYmVnaW5SZWNvcmRpbmcoKChXU0RMRWxlbWVudCkgcGFyZW50KS5nZXRFbGVtZW50KCkpOwotCQkJfQotCi0JCQlDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0JCQljb250aW51ZUFwcGx5ID0gdHJ1ZTsgCi0JCQlpZiAoYWN0aW9uLmVxdWFscyhJUGFyYW1ldGVyLlNFVF9ORVdfQUNUSU9OX0lEKSkKLQkJCXsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlID0gKENvbXBvbmVudFNwZWNpZmljYXRpb24paW52b2tlRGlhbG9nKGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmdldE5ld0RpYWxvZygpKTsKLQotCQkJCS8vIFNldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBuZXcgdHlwZQotCQkJCWlmIChjb250aW51ZUFwcGx5KQotCQkJCQljb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UocGFyZW50LCBuZXdWYWx1ZSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZSA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKWludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXRCcm93c2VEaWFsb2coKSk7Ci0JCQkJaWYgKGNvbnRpbnVlQXBwbHkpCi0JCQkJCWNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShwYXJlbnQsIG5ld1ZhbHVlKTsKLQkJCX0KLQotCQkJLy8gRm9ybWF0Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpIHsKLQkJCQlmb3JtYXRDaGlsZCgoKFdTRExFbGVtZW50KSBwYXJlbnQpLmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotCQkJCWZvcm1hdENoaWxkKCgoWFNEQ29uY3JldGVDb21wb25lbnQpIHBhcmVudCkuZ2V0RWxlbWVudCgpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgewotCQkJCWVuZFJlY29yZGluZygoKFdTRExFbGVtZW50KSBwYXJlbnQpLmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgaW52b2tlRGlhbG9nKElDb21wb25lbnREaWFsb2cgZGlhbG9nKQotCXsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gbnVsbDsKLQkJCi0JCWlmIChkaWFsb2cgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLQkJewotCQkJbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNvbnRpbnVlQXBwbHkgPSBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKQotCXsKLQkJQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gQVNERWRpdG9yUGx1Z2luLmdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAoZWRpdG9yICE9IG51bGwpCi0JCXsKLQkJCXJlc3VsdCA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotCQkJCi0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yKQotCQkJewotCQkJCUludGVybmFsV1NETE11bHRpUGFnZUVkaXRvciB3c2RsRWRpdG9yID0gKEludGVybmFsV1NETE11bHRpUGFnZUVkaXRvcikgZWRpdG9yOwotCQkJCQotCQkJCUxpc3QgdHlwZXMgPSB3c2RsRWRpdG9yLmdldE1vZGVsKCkuZ2V0VHlwZXMoKTsKLQkJCQlYU0RTY2hlbWFbXSBzY2hlbWFzID0gbmV3IFhTRFNjaGVtYVt0eXBlcy5zaXplKCldOwotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlcy5zaXplKCk7IGluZGV4KyspIHsKLQkJCQkJVzExVHlwZSB0eXBlID0gKFcxMVR5cGUpIHR5cGVzLmdldChpbmRleCk7Ci0JCQkJCXNjaGVtYXNbaW5kZXhdID0gKFhTRFNjaGVtYSkgdHlwZS5nZXRUYXJnZXQoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJKChXU0RMWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKSByZXN1bHQpLnNldFNjaGVtYXMoc2NoZW1hcyk7Ci0JCQkJCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfSAgCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9jb21tYW5kcy9XMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVRvcExldmVsRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmNmUxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL2NvbW1hbmRzL1cxMVRvcExldmVsRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy52aXNpdG9yLlcxMUZpbmRJbm5lckVsZW1lbnRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXMTFUb3BMZXZlbEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MID0gInhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICBwdWJsaWMgVzExVG9wTGV2ZWxFbGVtZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgZWxlbWVudCkgewotCSAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkgICgoSURPTU5vZGUpIGVsZW1lbnQpLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkpOwotCSAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IGVsZW1lbnQpIHsKLQkgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJICAoKElET01Ob2RlKSBlbGVtZW50KS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JICByZXR1cm4gZ2V0TGFiZWwoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGQoRWxlbWVudCBjaGlsZCkKLSAgewotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpY2hpbGQpLmdldE1vZGVsKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgICAgIAotICAgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKGNoaWxkKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmNoYW5nZWRNb2RlbCgpOyAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGVuc3VyZURlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0TmV3WFNERWxlbWVudChYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCkgeyAKLQkgIFcxMUZpbmRJbm5lckVsZW1lbnRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgVzExRmluZElubmVyRWxlbWVudFZpc2l0b3IoKTsKLQkgIHJldHVybiB2aXNpdG9yLmdldElubmVyWFNERWxlbWVudCh4c2RFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotCi0gICAgRWxlbWVudCBkZWZpbml0aW9uc0VsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgIGlmIChkZWZpbml0aW9uc0VsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0RGVmYXVsdE5hbWVzcGFjZShkZWZpbml0aW9uKTsKLSAgICAgIGRlZmluaXRpb24uc2V0UU5hbWUobmV3IFFOYW1lKG51bGwsIGdldEZpbGVOYW1lKGRlZmluaXRpb24pKSk7Ci0gICAgICBkZWZpbml0aW9uLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoIndzZGwiLCBXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRlZmluaXRpb24udXBkYXRlRWxlbWVudCgpOwotICAgICAgLy8gTW92aW5nIHRoZXNlIGFib3ZlIHVwZGF0ZUVsZW1lbnQoKSBzZWVtcyB0byBjYXVzZSBncmllZiB3aXRoIHRoZSBtb2RlbC4KLSAgICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJ0bnMiLCB0YXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0gICAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgieHNkIiwgV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRlZmluaXRpb25zRWxlbWVudCA9IGRlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotICAgIH0KLQotICAgIGVuc3VyZVhNTERpcmVjdGl2ZShkb2N1bWVudCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuc3VyZVhNTERpcmVjdGl2ZShEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIGlmIChoYXNYTUxEaXJlY3RpdmUoZG9jdW1lbnQpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgTm9kZSBmaXJzdENoaWxkID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiB4bWxEZWNsYXJhdGlvbiA9IGdldFhNTERlY2xhcmF0aW9uKGRvY3VtZW50KTsKLSAgICBkb2N1bWVudC5pbnNlcnRCZWZvcmUoeG1sRGVjbGFyYXRpb24sIGZpcnN0Q2hpbGQpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1hNTERpcmVjdGl2ZShEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIE5vZGUgZmlyc3RDaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgIAotICAgIGlmIChmaXJzdENoaWxkID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHByb2Nlc3NpbmdJbnN0cnVjdGlvbiAgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKWZpcnN0Q2hpbGQ7Ci0gICAgCi0gICAgaWYgKCFwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uZ2V0VGFyZ2V0KCkuZXF1YWxzKFhNTCkpIAotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gZ2V0WE1MRGVjbGFyYXRpb24oRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgICBTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLSAgICBpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpCi0gICAgewotICAgICAgY2hhclNldCA9ICJVVEYtOCI7Ci0gICAgfQotICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiB4bWxEZWNsYXJhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihYTUwsICJ2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgY2hhclNldCArICJcIiIpOwotICAgIHJldHVybiB4bWxEZWNsYXJhdGlvbjsKLSAgICAKLSAgfQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZShEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhNZXNzYWdlcy5fVUlfUFJFRl9QQUdFX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0KLSAgICBpZiAoIW5hbWVzcGFjZS5lbmRzV2l0aCgiLyIpKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5jb25jYXQoIi8iKTsKLSAgICB9Ci0KLSAgICBuYW1lc3BhY2UgKz0gZ2V0RmlsZU5hbWUoZGVmaW5pdGlvbikgKyAiLyI7Ci0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgU3RyaW5nIGZpbGVMb2NhdGlvbiA9IGRlZmluaXRpb24uZ2V0TG9jYXRpb24oKTsKLSAgICBJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0gICAgcmV0dXJuIGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvc3BlY2lhbGl6ZWQvVzExQWRkcmVzc0V4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9zcGVjaWFsaXplZC9XMTFBZGRyZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTI3OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy9zcGVjaWFsaXplZC9XMTFBZGRyZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuc3BlY2lhbGl6ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotCi1wdWJsaWMgY2xhc3MgVzExQWRkcmVzc0V4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlciBleHRlbmRzIFcxMUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcgotewotICAvLyBUT0RPLi4uIG1ha2UgdGhpcyBjbGFzcyBhYnN0cmFjdCBhbmQgcHJvdmlkZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgaW4KLSAgLy8gU09BUCBhbmQgSFRUUCBwYWNrYWdlcy4gVGhlIFdTRExBZGFwdGVyRmFjdG9yeSBuZWVkcyB0byBrbm93IHRvIGRlbGVnYXRlIHRvIGV4dGVuc2lvbgotICAvLyBhZGFwdGVycyB0byBzdXBwb3J0IHRoZSBhZGRpdGlvbiBvZiBtb3JlIGV4dGVuc2lvbiBsYW5ndWFnZXMKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSSSgpCi0gIHsKLSAgICBTdHJpbmcgYWRkcmVzcyA9IG51bGw7Ci0gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSAoKFNPQVBBZGRyZXNzKSB0YXJnZXQpLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSAoKEhUVFBBZGRyZXNzKSB0YXJnZXQpLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgfQotICAgIHJldHVybiBhZGRyZXNzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIGFkZHJlc3MpCi0gIHsKLSAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgewotICAgICAgKChTT0FQQWRkcmVzcykgdGFyZ2V0KS5zZXRMb2NhdGlvblVSSShhZGRyZXNzKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpCi0gICAgewotICAgICAgKChIVFRQQWRkcmVzcykgdGFyZ2V0KS5zZXRMb2NhdGlvblVSSShhZGRyZXNzKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvc3BlY2lhbGl6ZWQvVzExRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL3NwZWNpYWxpemVkL1cxMUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGQ0ZmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvc3BlY2lhbGl6ZWQvVzExRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuc3BlY2lhbGl6ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXMTFFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBXU0RMQmFzZUFkYXB0ZXIKLXsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL3Zpc2l0b3IvVzExRmluZElubmVyRWxlbWVudFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvdmlzaXRvci9XMTFGaW5kSW5uZXJFbGVtZW50VmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTYxZWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWRhcHRlcnMvdmlzaXRvci9XMTFGaW5kSW5uZXJFbGVtZW50VmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLnZpc2l0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotCi0vKgotICogQ2xhc3MgdXNlZCB0byBmaW5kIGFuZCByZXR1cm4gdGhlICJpbm5lciIgWFNERWxlbWVudCB3aGVuIGdpdmVuIGFuIFhTREVsZW1lbnQuCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgVzExWFNEVmlzaXRvciB3aGljaCByZW1vdmVzIHRoZSBuZWVkIGZvciB0aGlzIGNsYXNzIHRvIHJlaW1wbGVtZW50Ci0gKiB0aGUgYWN0dWFsIHRyYXZlcnNhbCBvZiB0aGUgWFNEIE1vZGVsIHRvIGxvY2F0ZSB0aGUgaW5uZXIgWFNERWxlbWVudC4KLSAqIAotICogQnkgZGVmYXVsdCwgdGhpcyBjbGFzcyB3aWxsIGxvY2F0ZSB0aGUgaW5uZXIgWFNERWxlbWVudCBhdCBkZXB0aCAyLiAgSG93ZXZlciwgdGhpcyBkZXB0aAotICogY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZyBzZXRFbGVtZW50RGVwdGgobmV3RGVwdGgpLgotICovCi1wdWJsaWMgY2xhc3MgVzExRmluZElubmVyRWxlbWVudFZpc2l0b3IgZXh0ZW5kcyBXMTFYU0RWaXNpdG9yIHsKLQkgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudEF0RGVwdGg7Ci0JICBwcm90ZWN0ZWQgaW50IGVsZW1lbnREZXB0aCA9IDI7Ci0JICBwcm90ZWN0ZWQgaW50IGRlcHRoID0gMTsKLQkgIAotCSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRJbm5lclhTREVsZW1lbnQoWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnQpIHsKLQkJICBlbGVtZW50QXREZXB0aCA9IHhzZEVsZW1lbnQ7Ci0JCSAgZGVwdGggPSAxOwotCQkgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKHhzZEVsZW1lbnQpOwotCQkgIAotCQkgIHJldHVybiBlbGVtZW50QXREZXB0aDsKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpIHsKLQkJICBpZiAoZGVwdGggPT0gZWxlbWVudERlcHRoKSB7Ci0JCQkgIGVsZW1lbnRBdERlcHRoID0gZWxlbWVudDsKLQkJICB9Ci0JCSAgZGVwdGgrKzsKLQkJICAKLQkJICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlcHRoKGludCBlbGVtZW50RGVwdGgpIHsKLQkJICB0aGlzLmVsZW1lbnREZXB0aCA9IGVsZW1lbnREZXB0aDsgCi0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL3Zpc2l0b3IvVzExWFNEVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy92aXNpdG9yL1cxMVhTRFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlOTI0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL3Zpc2l0b3IvVzExWFNEVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy52aXNpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROb3RhdGlvbkRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBXMTFYU0RWaXNpdG9yCi17Ci0gIHB1YmxpYyBXMTFYU0RWaXNpdG9yKCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKGlkZW50aXR5Q29uc3RyYWludCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXROb3RhdGlvbkRlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETm90YXRpb25EZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0Tm90YXRpb25EZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKCFtb2RlbEdyb3VwRGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpbzsKLSAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilvOwotICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXApOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gbm90YXRpb24pCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUuZ2V0Q29udGVudCgpICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhDb250ZW50ID0gdHlwZS5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZSgoWFNEUGFydGljbGUpIGNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGUoWFNEUGFydGljbGUgcGFydGljbGUpCi0gIHsKLSAgICB2aXNpdFBhcnRpY2xlQ29udGVudChwYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlQ29udGVudChYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cCgoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB2aXNpdFdpbGRjYXJkKChYU0RXaWxkY2FyZClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIGlmIChtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL3Zpc2l0b3IvVzExWFNEVmlzaXRvckZvckZpZWxkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hZGFwdGVycy92aXNpdG9yL1cxMVhTRFZpc2l0b3JGb3JGaWVsZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlNmRkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FkYXB0ZXJzL3Zpc2l0b3IvVzExWFNEVmlzaXRvckZvckZpZWxkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy52aXNpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGNsYXNzIFcxMVhTRFZpc2l0b3JGb3JGaWVsZHMgZXh0ZW5kcyBXMTFYU0RWaXNpdG9yCi17Ci0gIHB1YmxpYyBXMTFYU0RWaXNpdG9yRm9yRmllbGRzKCkKLSAgewotICB9Ci0KLSAgTGlzdCBjb25jcmV0ZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIExpc3QgdGhpbmdzV2VOZWVkVG9MaXN0ZW5UbyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChhdHRyVXNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pYXR0ckdyb3VwQ29udGVudDsKLSAgICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyR3JvdXApOwotICAgICAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJHcm91cCk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChtb2RlbEdyb3VwKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKW87Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cmlidXRlVXNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKW87Ci0gICAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHJHcm91cCk7Ci0gICAgICAgIGlmIChhdHRyR3JvdXAuaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJHcm91cCA9IGF0dHJHcm91cC5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJHcm91cCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIC8vc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChlbGVtZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICB7Ci0gICAgc3VwZXIudmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLSAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHIpOwotICB9Ci0KLQotICBwdWJsaWMgTGlzdCBnZXRDb25jcmV0ZUNvbXBvbmVudExpc3QoKQotICB7Ci0gICAgcmV0dXJuIGNvbmNyZXRlQ29tcG9uZW50TGlzdDsKLSAgfQotCi0KLSAgcHVibGljIExpc3QgZ2V0VGhpbmdzV2VOZWVkVG9MaXN0ZW5UbygpCi0gIHsKLSAgICByZXR1cm4gdGhpbmdzV2VOZWVkVG9MaXN0ZW5UbzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3YTk5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuWFNEQ29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQgewotCXB1YmxpYyBzdGF0aWMgaW50IFBBUlRfRUxFTUVOVF9TRVFfRUxFTUVOVCAgICAgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IFBBUlRfRUxFTUVOVCAgICAgICAgICAgICAgICAgPSAxOwotCXB1YmxpYyBzdGF0aWMgaW50IFBBUlRfQ09NUExFWFRZUEVfU0VRX0VMRU1FTlQgPSAyOwotCXB1YmxpYyBzdGF0aWMgaW50IFBBUlRfQ09NUExFWFRZUEUgICAgICAgICAgICAgPSAzOwotCXB1YmxpYyBzdGF0aWMgaW50IFBBUlRfU0lNUExFVFlQRQkJCSAgID0gNDsKLQotCXByb3RlY3RlZCBpbnQgc3R5bGUgPSAwOwotCXByb3RlY3RlZCBPcGVyYXRpb24gb3BlcmF0aW9uOwotCXByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmV3WFNERWxlbWVudDsKLQlwcm90ZWN0ZWQgUGFydCBuZXdQYXJ0OwotCQotCXByb3RlY3RlZCBTdHJpbmcgbmV3QW5vbnltb3VzWFNERWxlbWVudE5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBuZXdYU0RFbGVtZW50TmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld1dTRExNZXNzYWdlTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld1dTRExQYXJ0TmFtZTsKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBydW4oKTsKLQkKLQlwdWJsaWMgQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgaW50IHN0eWxlKSB7Ci0JCXRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN0eWxlKGludCBzdHlsZSkgewotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JfQotCQotCXB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3WFNERWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0RWxlbWVudFJlZmVyZW5jZSgpIHsKLQkJaWYgKHN0eWxlID09IFBBUlRfRUxFTUVOVCB8fCBzdHlsZSA9PSBQQVJUX0VMRU1FTlRfU0VRX0VMRU1FTlQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlUGFydEVsZW1lbnRTZXFFbGVtZW50UGF0dGVybihQYXJ0IHBhcnQsIFhTREVsZW1lbnREZWNsYXJhdGlvbiBwYXJ0RWxlbWVudCkgewotCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gcmV0dXJuZWRYU0RFbGVtZW50ID0gbnVsbDsKLQkJCi0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiBvcmlnaW5hbEVsZW1lbnQgPSBudWxsOwotCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gYW5vblhTREVsZW1lbnQgPSBudWxsOwotCQkKLQkJLy8gQ3JlYXRlIHRoZSBYU0RFbGVtZW50IChhbm9ueW1vdXMpIHJlZmVyZW5jZWQgYnkgdGhlIFBhcnQgaWYgbmVjZXNzYXJ5Ci0JCWlmIChwYXJ0RWxlbWVudCA9PSBudWxsIHx8IHBhcnRFbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCB8fCBwYXJ0RWxlbWVudC5nZXRTY2hlbWEoKSA9PSBudWxsKSB7Ci0JCQlhbm9uWFNERWxlbWVudCA9IFhTRENvbXBvbmVudEhlbHBlci5jcmVhdGVBbm9ueW1vdXNYU0RFbGVtZW50RGVmaW5pdGlvbihnZXRBbm9ueW1vdXNYU0RFbGVtZW50QmFzZU5hbWUoKSwgcGFydCk7Ci0vLwkJCXBhcnQuc2V0RWxlbWVudERlY2xhcmF0aW9uKGFub25YU0RFbGVtZW50KTsKLQkJCVN0cmluZyBwcmVmaXhlZE5hbWUgPSBnZXRQcmVmaXhlZENvbXBvbmVudE5hbWUocGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGFub25YU0RFbGVtZW50KTsKLQkJCUNvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0Q29tcG9uZW50UmVmZXJlbmNlKHBhcnQsIGZhbHNlLCBwcmVmaXhlZE5hbWUpOwotCQkJcGFydC5zZXRUeXBlRGVmaW5pdGlvbihudWxsKTsKLQkJCQotCQkJaWYgKHBhcnRFbGVtZW50ICE9IG51bGwgJiYgcGFydEVsZW1lbnQuZ2V0U2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCW9yaWdpbmFsRWxlbWVudCA9IHBhcnRFbGVtZW50OwotCQkJCS8vIFJlbW92ZSB0aGUgJ29yaWdpbmFsJyBYU0RFbGVtZW50IGFzIGEgR2xvYmFsIEVsZW1lbnQKLQkJCQlwYXJ0RWxlbWVudC5nZXRTY2hlbWEoKS5nZXRDb250ZW50cygpLnJlbW92ZShwYXJ0RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhbm9uWFNERWxlbWVudCA9IHBhcnRFbGVtZW50OwotCQl9Ci0JCQotCQkvLyBBZGQgdGhlICdvcmlnaW5hbCcgWFNERWxlbWVudCBpZiBpdCdzIHR5cGUgd2Fzbid0IGFub255bW91cwotCQlpZiAob3JpZ2luYWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCVhTRENvbXBvbmVudEhlbHBlci5hZGRYU0RFbGVtZW50VG9Nb2RlbEdyb3VwKGFub25YU0RFbGVtZW50LCBvcmlnaW5hbEVsZW1lbnQpOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgYSBuZXcgWFNERWxlbWVudAotCQlYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBYU0RDb21wb25lbnRIZWxwZXIuZ2V0WFNETW9kZWxHcm91cChhbm9uWFNERWxlbWVudCwgcGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQlyZXR1cm5lZFhTREVsZW1lbnQgPSBYU0RDb21wb25lbnRIZWxwZXIuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZChudWxsLCBnZXROZXdYU0RFbGVtZW50QmFzZU5hbWUoKSwgbW9kZWxHcm91cCk7Ci0JCQotCQkvLyBBZGQgdGhlIG5ld2x5IGNyZWF0ZWQgWFNERWxlbWVudCB0byB0aGUgTW9kZWxHcm91cAotCQlYU0RDb21wb25lbnRIZWxwZXIuYWRkWFNERWxlbWVudFRvTW9kZWxHcm91cChhbm9uWFNERWxlbWVudCwgcmV0dXJuZWRYU0RFbGVtZW50KTsKLQotCQlmb3JtYXRDaGlsZChhbm9uWFNERWxlbWVudC5nZXRFbGVtZW50KCkpOwotCQlyZXR1cm4gcmV0dXJuZWRYU0RFbGVtZW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZVBhcnRFbGVtZW50UmVmZXJlbmNlQ29tcG9uZW50cyhQYXJ0IHBhcnQpIHsKLQkJWFNERWxlbWVudERlY2xhcmF0aW9uIHJldHVybmVkWFNERWxlbWVudCA9IG51bGw7Ci0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiBwYXJ0RWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0JCQotCQlpZiAoc3R5bGUgPT0gUEFSVF9FTEVNRU5UX1NFUV9FTEVNRU5UKSB7Ci0JCQlyZXR1cm5lZFhTREVsZW1lbnQgPSBjcmVhdGVQYXJ0RWxlbWVudFNlcUVsZW1lbnRQYXR0ZXJuKHBhcnQsIHBhcnRFbGVtZW50KTsKLQkJfQotCQllbHNlIGlmIChzdHlsZSA9PSBQQVJUX0VMRU1FTlQpIHsKLQkJCWlmIChwYXJ0RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuZWRYU0RFbGVtZW50ID0gWFNEQ29tcG9uZW50SGVscGVyLmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQocGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGdldE5ld1hTREVsZW1lbnRCYXNlTmFtZSgpLCBwYXJ0KTsKLQkJCQlpZiAocmV0dXJuZWRYU0RFbGVtZW50ICE9IG51bGwgJiYgIXJldHVybmVkWFNERWxlbWVudC5lcXVhbHMocGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKSkpIHsKLS8vCQkJCQlwYXJ0LnNldEVsZW1lbnREZWNsYXJhdGlvbihyZXR1cm5lZFhTREVsZW1lbnQpOwotCQkJCQlTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0UHJlZml4ZWRDb21wb25lbnROYW1lKHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCByZXR1cm5lZFhTREVsZW1lbnQpOwotCQkJCQlDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBmYWxzZSwgcHJlZml4ZWROYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm5lZFhTREVsZW1lbnQgPSBjcmVhdGVQYXJ0RWxlbWVudFNlcUVsZW1lbnRQYXR0ZXJuKHBhcnQsIHBhcnRFbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJldHVybmVkWFNERWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVQYXJ0Q29tcGxleFR5cGVSZWZlcmVuY2UoUGFydCBwYXJ0KSB7Ci0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiByZXR1cm5lZFhTREVsZW1lbnQgPSBudWxsOwotCQkKLQkJaWYgKHN0eWxlID09IFBBUlRfQ09NUExFWFRZUEVfU0VRX0VMRU1FTlQpIHsKLQkJCVhTRFR5cGVEZWZpbml0aW9uIG9yaWdpbmFsVHlwZSA9IG51bGw7Ci0JCQlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdG9wTGV2ZWxUeXBlID0gbnVsbDsKLQkJCQotCQkJLy8gQ3JlYXRlIHRoZSBDb21wbGV4VHlwZSByZWZlcmVuY2VkIGJ5IHRoZSBQYXJ0IGlmIG5lY2Vzc2FyeQotCQkJaWYgKHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSA9PSBudWxsIHx8IHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB7Ci0JCQkJWFNEU2NoZW1hIHNjaGVtYSA9IFhTRENvbXBvbmVudEhlbHBlci5nZXRYU0RTY2hlbWEocGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQkJCVN0cmluZyB0b3BMZXZlbE5hbWUgPSBOYW1lVXRpbC5nZXRYU0RDb21wbGV4VHlwZU5hbWUocGFydC5nZXROYW1lKCksIHNjaGVtYSk7Ci0JCQkJdG9wTGV2ZWxUeXBlID0gWFNEQ29tcG9uZW50SGVscGVyLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5paW9uKHRvcExldmVsTmFtZSwgcGFydCk7Ci0JCQkJCi0JCQkJaWYgKHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB7Ci0JCQkJCW9yaWdpbmFsVHlwZSA9IHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pewotCQkJCXRvcExldmVsVHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKTsKLQkJCX0JCQkKLQkJCQotCQkJLy8gQ3JlYXRlIGEgbmV3IFhTREVsZW1lbnQKLQkJCVhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IFhTRENvbXBvbmVudEhlbHBlci5nZXRYU0RNb2RlbEdyb3VwKHRvcExldmVsVHlwZSk7Ci0JCQlyZXR1cm5lZFhTREVsZW1lbnQgPSBYU0RDb21wb25lbnRIZWxwZXIuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZChudWxsLCBnZXROZXdYU0RFbGVtZW50QmFzZU5hbWUoKSwgbW9kZWxHcm91cCk7Ci0JCQkKLQkJCS8vIEFkZCB0aGUgJ29yaWdpbmFsJyBYU0RFbGVtZW50IGlmIGl0J3MgdHlwZSB3YXNuJ3QgYW5vbnltb3VzCi0JCQlpZiAob3JpZ2luYWxUeXBlICE9IG51bGwpIHsKLQkJCQkvLyBDcmVhdGUgYW5vdGhlciBuZXcgWFNERWxlbWVudCB0byAnY29udGFpbicgdGhlIG9yaWdpbmFsbHkgcmVmZXJlbmNlZCBYU0RTaW1wbGVUeXBlCi0JCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIG9yaWdYU0RFbGVtZW50ID0gWFNEQ29tcG9uZW50SGVscGVyLmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQobnVsbCwgZ2V0TmV3WFNERWxlbWVudEJhc2VOYW1lKCksIG1vZGVsR3JvdXApOwotCQkJCW9yaWdYU0RFbGVtZW50LnNldFR5cGVEZWZpbml0aW9uKG9yaWdpbmFsVHlwZSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIENoYW5nZSBQYXJ0IHJlZmVyZW5jZQotLy8JCQlwYXJ0LnNldFR5cGVEZWZpbml0aW9uKHRvcExldmVsVHlwZSk7Ci0JCQlTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0UHJlZml4ZWRDb21wb25lbnROYW1lKHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCB0b3BMZXZlbFR5cGUpOwotCQkJQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UocGFydCwgdHJ1ZSwgcHJlZml4ZWROYW1lKTsKLQkJCWZvcm1hdENoaWxkKHRvcExldmVsVHlwZS5nZXRFbGVtZW50KCkpOwotCQl9Ci0JCWVsc2UgaWYgKHN0eWxlID09IFBBUlRfQ09NUExFWFRZUEUpIHsKLQkJCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IG51bGw7Ci0JCQlpZiAocGFydC5nZXRUeXBlRGVmaW5pdGlvbigpID09IG51bGwpIHsKLQkJCQkvLyBDcmVhdGUgYSBuZXcgQ29tcGxleFR5cGUKLQkJCQlYU0RTY2hlbWEgc2NoZW1hID0gWFNEQ29tcG9uZW50SGVscGVyLmdldFhTRFNjaGVtYShwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCQkJU3RyaW5nIGNvbXBsZXhOYW1lID0gTmFtZVV0aWwuZ2V0WFNEQ29tcGxleFR5cGVOYW1lKHBhcnQuZ2V0TmFtZSgpLCBzY2hlbWEpOwotCQkJCWNvbXBsZXhUeXBlID0gWFNEQ29tcG9uZW50SGVscGVyLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5paW9uKGNvbXBsZXhOYW1lLCBwYXJ0KTsKLQkJCQkKLQkJCQkvLyBDcmVhdGUgYW4gWFNERWxlbWVudCBmb3IgdGhlIENvbXBsZXhUeXBlCi0JCQkJWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gWFNEQ29tcG9uZW50SGVscGVyLmdldFhTRE1vZGVsR3JvdXAoY29tcGxleFR5cGUpOwotCQkJCXJldHVybmVkWFNERWxlbWVudCA9IFhTRENvbXBvbmVudEhlbHBlci5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKG51bGwsIGdldE5ld1hTREVsZW1lbnRCYXNlTmFtZSgpLCB4c2RNb2RlbEdyb3VwKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIFRPRE86IFdoYXQgc2hvdWxkIHdlIGRvIGhlcmUuLi4uLiAgV2UgY2FuIGRlZmF1bHQgdG8gdGhlIFBBUlRfRUxFTUVOVF9TRVFfRUxFTUVOVCBzdHlsZQotCQkJCS8vIHNpbmNlIGl0IGhhbmRsZXMgJ211bHRpcGxlJyBYU0RFbGVtZW50cy4uLi4gT1IgLi4uLi4gd2UgY2FuICdvdmVyd3JpdGUgYW5kIHNldCBhIG5ldwotCQkJCS8vIFhTREVsZW1lbnQKLQkJCX0KLQkJCQotCQkJaWYgKGNvbXBsZXhUeXBlICE9IG51bGwgJiYgIWNvbXBsZXhUeXBlLmVxdWFscyhwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkpKSB7Ci0vLwkJCQlwYXJ0LnNldFR5cGVEZWZpbml0aW9uKGNvbXBsZXhUeXBlKTsKLQkJCQlTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0UHJlZml4ZWRDb21wb25lbnROYW1lKHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBjb21wbGV4VHlwZSk7Ci0JCQkJQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UocGFydCwgdHJ1ZSwgcHJlZml4ZWROYW1lKTsKLQkJCQlmb3JtYXRDaGlsZChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkpOwotCQkJfQkKLQkJfQotCQkKLQkJcmV0dXJuIHJldHVybmVkWFNERWxlbWVudDsKLQl9CQotCS8qCi0JICogQ3JlYXRlIGlmIG5lY2Vzc2FyeSBhIE1lc3NhZ2UgYW5kIFBhcnQgZm9yIHRoZSBnaXZlbiBNZXNzYWdlUmVmZXJlbmNlCi0JICogYW5kIHJldHVybiBpdCdzIFBhcnQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFydCBjcmVhdGVXU0RMQ29tcG9uZW50cyhNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYpIHsKLQkJTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpOwotCQlQYXJ0IHBhcnQgPSBudWxsOwotCQkKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBDcmVhdGUgTWVzc2FnZQotCQkJQWRkTWVzc2FnZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRNZXNzYWdlQ29tbWFuZChtZXNzYWdlUmVmLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgZ2V0V1NETE1lc3NhZ2VOYW1lKCkpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCW1lc3NhZ2UgPSAoTWVzc2FnZSkgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQkJbWVzc2FnZVJlZi5zZXRFTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYgKG1lc3NhZ2UuZ2V0RVBhcnRzKCkuc2l6ZSgpID09IDApIHsKLQkJCS8vIENyZWF0ZSBQYXJ0Ci0JCQlTdHJpbmcgcGFydE5hbWUgPSBnZXRXU0RMUGFydE5hbWUoKTsKLQkJCWlmIChzdHlsZSA9PSBQQVJUX0VMRU1FTlRfU0VRX0VMRU1FTlQpIHsKLQkJCQlwYXJ0TmFtZSA9IGdldERvY0xpdFdyYXBwZWRQYXJ0TmFtZSgpOwotCQkJfQotCQkJQWRkUGFydENvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRQYXJ0Q29tbWFuZChtZXNzYWdlLCBwYXJ0TmFtZSk7Ci0JCQljb21tYW5kLnJ1bigpOwotCQkJcGFydCA9IChQYXJ0KSBjb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0aGVyZSBpcyBhbiBleGlzdGluZyBQYXJ0Ci0vLwkJCXBhcnQgPSAoUGFydCkgbWVzc2FnZS5nZXRFUGFydHMoKS5nZXQoMCk7Ci0JCX0KLQkJZm9ybWF0Q2hpbGQobWVzc2FnZS5nZXRFbGVtZW50KCkpOwotCQkKLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RG9jTGl0V3JhcHBlZFBhcnROYW1lKCkgewotCQlyZXR1cm4gInBhcmFtZXRlcnMiOwotCX0KLQotCXByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlWFNET2JqZWN0cyhQYXJ0IHBhcnQpIHsKLQkJWFNERWxlbWVudERlY2xhcmF0aW9uIHJldHVybmVkWFNERWxlbWVudCA9IG51bGw7Ci0JCWlmIChpc1BhcnRFbGVtZW50UmVmZXJlbmNlKCkpIHsKLQkJCS8vIElzIGEgUGFydCAtLT4gRWxlbWVudCByZWZlcmVuY2UKLQkJCWlmIChwYXJ0ID09IG51bGwgJiYgZ2V0TWVzc2FnZVJlZmVyZW5jZSgpICE9IG51bGwgJiYgZ2V0TWVzc2FnZVJlZmVyZW5jZSgpLmdldEVNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCXBhcnQgPSAoUGFydCkgZ2V0TWVzc2FnZVJlZmVyZW5jZSgpLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkuZ2V0KDApOwotCQkJfQotCQkJCi0JCQlyZXR1cm5lZFhTREVsZW1lbnQgPSBjcmVhdGVQYXJ0RWxlbWVudFJlZmVyZW5jZUNvbXBvbmVudHMocGFydCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJcyBhIFBhcnQgLS0+IENvbXBsZXggVHlwZSByZWZlcmVuY2UKLS8vCQkJcmV0dXJuZWRYU0RFbGVtZW50ID0gY3JlYXRlUGFydENvbXBsZXhUeXBlUmVmZXJlbmNlKHBhcnQpOwotCQkJCi0JCQkvLyBJZiBpdCdzIGEgUGFydCAtLT4gVHlwZSByZWZlcmVuY2UsIGFkZGluZyBhIG5ldyBwYXJhbWV0ZXIgYWx3YXlzIG1lYW5zIGFkZGluZyBhIG5ldyBQYXJ0Ci0JCQkvLyB3aXRoIGEgc3RyaW5nIHJlZmVyZW5jZS4gIEJlY2F1c2Ugb2YgdGhpcyBjYXNlLCB3ZSBzaG91bGQgcmVhbGx5IHJlbmFtZSB0aGlzIG1ldGhvZCBpbnN0ZWFkCi0JCQkvLyBvZiBjcmVhdGVYU0RPYmplY3RzKCkgc2luY2Ugd2UgbWF5IGVuZCB1cCBjcmVhdGluZyBhIFBhcnQuCi0JCQlpZiAocGFydCA9PSBudWxsICYmIGdldE1lc3NhZ2VSZWZlcmVuY2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VSZWZlcmVuY2UoKS5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlMaXN0IHBhcnROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBnZXRNZXNzYWdlUmVmZXJlbmNlKCkuZ2V0RU1lc3NhZ2UoKTsKLQkJCQlJdGVyYXRvciBpdCA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCVBhcnQgaXRlbSA9IChQYXJ0KSBpdC5uZXh0KCk7Ci0JCQkJCXBhcnROYW1lcy5hZGQoaXRlbS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlTdHJpbmcgcGFydE5hbWUgPSBOYW1lVXRpbC5nZXRVbmlxdWVOYW1lSGVscGVyKGdldFdTRExQYXJ0TmFtZSgpLCBwYXJ0TmFtZXMpOwotCQkJCUFkZFBhcnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSwgcGFydE5hbWUpOwotCQkJCWNvbW1hbmQucnVuKCk7Ci0JCQkJbmV3UGFydCA9IChQYXJ0KSBjb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXR1cm5lZFhTREVsZW1lbnQ7Ci0JfQotCQotCS8vIFRPRE86IHJtYWg6IFBvc3QgV1RQIDEuNSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG1hZGUgYWJzdHJhY3QKLQlwdWJsaWMgTWVzc2FnZVJlZmVyZW5jZSBnZXRNZXNzYWdlUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmaXhlZENvbXBvbmVudE5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQpIHsKLSAgICAJU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotICAgIAlTdHJpbmcgdG5zID0gY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBMaXN0IHByZWZpeGVzID0gZ2V0UHJlZml4ZXMoZGVmaW5pdGlvbiwgdG5zKTsKLSAgICAgICAgaWYgKHByZWZpeGVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG5hbWUgPSBwcmVmaXhlcy5nZXQoMCkgKyAiOiIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3QgZ2V0UHJlZml4ZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTWFwIG1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGhlTmFtZXNwYWNlID0gKFN0cmluZykgbWFwLmdldChwcmVmaXgpOwotICAgICAgICAgICAgaWYgKHRoZU5hbWVzcGFjZSAhPSBudWxsICYmIHRoZU5hbWVzcGFjZS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBhcmFtZXRlclBhdHRlcm4oV1NETEVsZW1lbnQgZWxlbWVudCkgewotICAgIAlpbnQgcGF0dGVybiA9IC0xOwotICAgIAkKLSAgICAJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgICAJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKChPcGVyYXRpb24pIGVsZW1lbnQpOwotICAgIAkJCi0JCQlQb3J0VHlwZSBwdCA9IChQb3J0VHlwZSkgKChPcGVyYXRpb24pIGVsZW1lbnQpLmdldENvbnRhaW5lcigpOwotICAgIAkJaWYgKHBhdHRlcm4gPT0gLTEpIHsKLSAgICAJCQkvLyBsZXQncyB0cnkgdG8gc2VhcmNoIG90aGVyIE9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgUG9ydFR5cGUKLSAgICAJCQlJdGVyYXRvciBvcEl0ID0gcHQuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIAkJCXdoaWxlIChwYXR0ZXJuID09IC0xICYmIG9wSXQuaGFzTmV4dCgpKSB7Ci0gICAgCQkJCU9wZXJhdGlvbiBpdGVtID0gKE9wZXJhdGlvbikgb3BJdC5uZXh0KCk7Ci0gICAgCQkJCWlmICghaXRlbS5lcXVhbHMoZWxlbWVudCkpIHsKLSAgICAJCQkJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKGl0ZW0pOwotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotCi0gICAgCQlpZiAocGF0dGVybiA9PSAtMSkgewotICAgIAkJCS8vIGxldCdzIHRyeSB0byBzZWFyY2ggb3RoZXIgT3BlcmF0aW9ucyBpbiBPVEhFUiBQb3J0VHlwZXMKLSAgICAJCQlJdGVyYXRvciBwdEl0ID0gcHQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVQb3J0VHlwZXMoKS5pdGVyYXRvcigpOwotICAgIAkJCXdoaWxlIChwYXR0ZXJuID09IC0xICYmIHB0SXQuaGFzTmV4dCgpKSB7Ci0gICAgCQkJCVBvcnRUeXBlIGl0ZW0gPSAoUG9ydFR5cGUpIHB0SXQubmV4dCgpOwotICAgIAkJCQlpZiAoIWl0ZW0uZXF1YWxzKHB0KSkgewotICAgIAkJCQkJcGF0dGVybiA9IGdldFBhdHRlcm4oaXRlbSk7Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gICAgCQlQb3J0VHlwZSBwdCA9IChQb3J0VHlwZSkgZWxlbWVudDsKLSAgICAJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKHB0KTsKLSAgICAJCQotICAgIAkJaWYgKHBhdHRlcm4gPT0gLTEpIHsKLSAgICAJCQkvLyBsZXQncyB0cnkgdG8gc2VhcmNoIG90aGVyIE9wZXJhdGlvbnMgaW4gT1RIRVIgUG9ydFR5cGVzCi0gICAgCQkJSXRlcmF0b3IgcHRJdCA9IHB0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsKLSAgICAJCQl3aGlsZSAocGF0dGVybiA9PSAtMSAmJiBwdEl0Lmhhc05leHQoKSkgewotICAgIAkJCQlQb3J0VHlwZSBpdGVtID0gKFBvcnRUeXBlKSBwdEl0Lm5leHQoKTsKLSAgICAJCQkJaWYgKCFpdGVtLmVxdWFscyhwdCkpIHsKLSAgICAJCQkJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKGl0ZW0pOwotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCQotICAgIAlpZiAocGF0dGVybiA9PSAtMSkgewotICAgIAkJcGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfRUxFTUVOVF9TRVFfRUxFTUVOVDsKLSAgICAJfQotCi0gICAgCXJldHVybiBwYXR0ZXJuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQYXJhbWV0ZXJQYXR0ZXJuKFdTRExFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gdXNlSW5wdXQpIHsKLSAgICAJaW50IHBhdHRlcm4gPSAtMTsKLSAgICAJCi0gICAgCWlmIChlbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gICAgCQlPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBlbGVtZW50OwotICAgIAkJaWYgKHVzZUlucHV0ICYmIG9wLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLQkJCQlwYXR0ZXJuID0gZ2V0UGF0dGVybihvcC5nZXRFSW5wdXQoKS5nZXRFTWVzc2FnZSgpKTsKLQkJCX0KLQkJCWlmICghdXNlSW5wdXQgJiYgb3AuZ2V0RU91dHB1dCgpICE9IG51bGwpewotCQkJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKG9wLmdldEVPdXRwdXQoKS5nZXRFTWVzc2FnZSgpKTsKLQkJCX0KLSAgICAJCQotCQkJUG9ydFR5cGUgcHQgPSAoUG9ydFR5cGUpIG9wLmdldENvbnRhaW5lcigpOwotICAgIAkJaWYgKHBhdHRlcm4gPT0gLTEpIHsKLSAgICAJCQkvLyBsZXQncyB0cnkgdG8gc2VhcmNoIG90aGVyIE9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgUG9ydFR5cGUKLSAgICAJCQlJdGVyYXRvciBvcEl0ID0gcHQuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIAkJCXdoaWxlIChwYXR0ZXJuID09IC0xICYmIG9wSXQuaGFzTmV4dCgpKSB7Ci0gICAgCQkJCU9wZXJhdGlvbiBpdGVtID0gKE9wZXJhdGlvbikgb3BJdC5uZXh0KCk7Ci0gICAgCQkJCWlmICghaXRlbS5lcXVhbHMoZWxlbWVudCkpIHsKLSAgICAJCQkJCWlmICh1c2VJbnB1dCAmJiBpdGVtLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLSAgICAJCQkJCQlwYXR0ZXJuID0gZ2V0UGF0dGVybihpdGVtLmdldEVJbnB1dCgpLmdldEVNZXNzYWdlKCkpOwotICAgIAkJCQkJfQotICAgIAkJCQkJaWYgKCF1c2VJbnB1dCAmJiBpdGVtLmdldEVPdXRwdXQoKSAhPSBudWxsKXsKLSAgICAJCQkJCQlwYXR0ZXJuID0gZ2V0UGF0dGVybihpdGVtLmdldEVPdXRwdXQoKS5nZXRFTWVzc2FnZSgpKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX0KLQotICAgIAkJaWYgKHBhdHRlcm4gPT0gLTEpIHsKLSAgICAJCQkvLyBsZXQncyB0cnkgdG8gc2VhcmNoIG90aGVyIE9wZXJhdGlvbnMgaW4gT1RIRVIgUG9ydFR5cGVzCi0gICAgCQkJSXRlcmF0b3IgcHRJdCA9IHB0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsKLSAgICAJCQl3aGlsZSAocGF0dGVybiA9PSAtMSAmJiBwdEl0Lmhhc05leHQoKSkgewotICAgIAkJCQlQb3J0VHlwZSBpdGVtID0gKFBvcnRUeXBlKSBwdEl0Lm5leHQoKTsKLSAgICAJCQkJaWYgKCFpdGVtLmVxdWFscyhwdCkpIHsKLSAgICAJCQkJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKGl0ZW0sIHVzZUlucHV0KTsKLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydFR5cGUpIHsKLSAgICAJCVBvcnRUeXBlIHB0ID0gKFBvcnRUeXBlKSBlbGVtZW50OwotICAgIAkJcGF0dGVybiA9IGdldFBhdHRlcm4ocHQsIHVzZUlucHV0KTsKLSAgICAJCQotICAgIAkJaWYgKHBhdHRlcm4gPT0gLTEpIHsKLSAgICAJCQkvLyBsZXQncyB0cnkgdG8gc2VhcmNoIG90aGVyIE9wZXJhdGlvbnMgaW4gT1RIRVIgUG9ydFR5cGVzCi0gICAgCQkJSXRlcmF0b3IgcHRJdCA9IHB0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsKLSAgICAJCQl3aGlsZSAocGF0dGVybiA9PSAtMSAmJiBwdEl0Lmhhc05leHQoKSkgewotICAgIAkJCQlQb3J0VHlwZSBpdGVtID0gKFBvcnRUeXBlKSBwdEl0Lm5leHQoKTsKLSAgICAJCQkJaWYgKCFpdGVtLmVxdWFscyhwdCkpIHsKLSAgICAJCQkJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKGl0ZW0sIHVzZUlucHV0KTsKLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAkKLSAgICAJcmV0dXJuIHBhdHRlcm47Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRQYXR0ZXJuKFBvcnRUeXBlIHBvcnRUeXBlKSB7Ci0gICAgCWludCBwYXR0ZXJuID0gLTE7Ci0gICAgCUl0ZXJhdG9yIG9wSXQgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgCXdoaWxlIChwYXR0ZXJuID09IC0xICYmIG9wSXQuaGFzTmV4dCgpKSB7Ci0gICAgCQlPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcEl0Lm5leHQoKTsKLSAgICAJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKG9wKTsKLSAgICAJfQotICAgIAkKLSAgICAJcmV0dXJuIHBhdHRlcm47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFBhdHRlcm4oUG9ydFR5cGUgcG9ydFR5cGUsIGJvb2xlYW4gdXNlSW5wdXQpIHsKLSAgICAJaW50IHBhdHRlcm4gPSAtMTsKLSAgICAJSXRlcmF0b3Igb3BJdCA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAJd2hpbGUgKHBhdHRlcm4gPT0gLTEgJiYgb3BJdC5oYXNOZXh0KCkpIHsKLSAgICAJCU9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wSXQubmV4dCgpOwotICAgIAkJaWYgKHVzZUlucHV0ICYmIG9wLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLSAgICAJCQlwYXR0ZXJuID0gZ2V0UGF0dGVybihvcC5nZXRFSW5wdXQoKS5nZXRFTWVzc2FnZSgpKTsKLSAgICAJCX0KLSAgICAJCWlmICghdXNlSW5wdXQgJiYgb3AuZ2V0RU91dHB1dCgpICE9IG51bGwpIHsKLSAgICAJCQlwYXR0ZXJuID0gZ2V0UGF0dGVybihvcC5nZXRFT3V0cHV0KCkuZ2V0RU1lc3NhZ2UoKSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJCi0gICAgCXJldHVybiBwYXR0ZXJuOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UGF0dGVybihPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWludCBwYXR0ZXJuID0gLTE7Ci0JCQotICAgIAlJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLQkJT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0JCUxpc3QgZmF1bHRzID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKTsKLQkJCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlwYXR0ZXJuID0gZ2V0UGF0dGVybihpbnB1dC5nZXRFTWVzc2FnZSgpKTsKLQkJfQotCQkKLQkJaWYgKHBhdHRlcm4gPT0gLTEgJiYgb3V0cHV0ICE9IG51bGwpIHsKLQkJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKG91dHB1dC5nZXRFTWVzc2FnZSgpKTsKLQkJfQotCQkKLQkJaWYgKHBhdHRlcm4gPT0gLTEgJiYgZmF1bHRzLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGZhdWx0SXQgPSBmYXVsdHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChwYXR0ZXJuID09IC0xICYmIGZhdWx0SXQuaGFzTmV4dCgpKSB7Ci0JCQkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGZhdWx0SXQubmV4dCgpOwotCQkJCXBhdHRlcm4gPSBnZXRQYXR0ZXJuKGZhdWx0LmdldEVNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcGF0dGVybjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFBhdHRlcm4oTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgCWludCBwYXR0ZXJuID0gLTE7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIHBhcnRzID0gbWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHBhcnRzLmhhc05leHQoKSkgewotCQkJCVBhcnQgcGFydCA9IChQYXJ0KSBwYXJ0cy5uZXh0KCk7Ci0JCQkJaWYgKHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlwYXR0ZXJuID0gQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9FTEVNRU5UOwotCi0JCQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50ID0gcGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLQkJCQkJaWYgKGlzU2VxdWVuY2VQYXR0ZXJuKHhzZEVsZW1lbnQuZ2V0VHlwZURlZmluaXRpb24oKSkpIHsKLQkJCQkJCXBhdHRlcm4gPSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5QQVJUX0VMRU1FTlRfU0VRX0VMRU1FTlQ7CQotCQkJCQl9CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCXBhdHRlcm4gPSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5QQVJUX1NJTVBMRVRZUEU7Ci0JCQkJCQotCQkJCQlpZiAocGFydC5nZXRUeXBlRGVmaW5pdGlvbigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0JCQkJCQlwYXR0ZXJuID0gQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9DT01QTEVYVFlQRTsKLQkJCQkJCQotCQkJCQkJWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0JCQkJCQlpZiAoaXNTZXF1ZW5jZVBhdHRlcm4oeHNkVHlwZSkpIHsKLQkJCQkJCQlwYXR0ZXJuID0gQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9DT01QTEVYVFlQRV9TRVFfRUxFTUVOVDsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcGF0dGVybjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NlcXVlbmNlUGF0dGVybihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgCWJvb2xlYW4gaXNTZXF1ZW5jZVBhdHRlcm4gPSBmYWxzZTsKLSAgICAJCi0gICAgCWlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgCQlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0eXBlOwotCi0JICAgIAlpZiAoY29tcGxleFR5cGUuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpIHsKLQkJCQlYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgY29tcGxleFR5cGUuZ2V0Q29udGVudCgpOwotCQkJCWlmIChwYXJ0aWNsZS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKSB7Ci0JCQkJCWlzU2VxdWVuY2VQYXR0ZXJuID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0gICAgCX0KLSAgICAJCi0gICAgCXJldHVybiBpc1NlcXVlbmNlUGF0dGVybjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGQoRWxlbWVudCBjaGlsZCkKLSAgICB7Ci0gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgIHsKLSAgICAgICAgSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAgIAotICAgICAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQYXJ0IGdldE5ld2x5QWRkZWRDb21wb25lbnRQYXJ0KCkgewotICAgIAlyZXR1cm4gbmV3UGFydDsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEFub255bW91c1hTREVsZW1lbnRCYXNlTmFtZSgpOwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmV3WFNERWxlbWVudEJhc2VOYW1lKCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRXU0RMTWVzc2FnZU5hbWUoKTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFdTRExQYXJ0TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTI1MWJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEJpbmRpbmdDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gIHByaXZhdGUgQmluZGluZyBiaW5kaW5nOwotIAotICBwdWJsaWMgQWRkQmluZGluZ0NvbW1hbmQKLQkJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgIAotCQkgU3RyaW5nIGxvY2FsTmFtZSkKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGJpbmRpbmcgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZygpOwotICAgIGJpbmRpbmcuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksbG9jYWxOYW1lKSk7Ci0gICAgYmluZGluZy5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkQmluZGluZyhiaW5kaW5nKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nRmF1bHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdGYXVsdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5OWJiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdGYXVsdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ0ZhdWx0Q29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0OwotICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0gIFN0cmluZyBuYW1lOwotICAKLSAgcHVibGljIEFkZEJpbmRpbmdGYXVsdENvbW1hbmQoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZ09wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiaW5kaW5nRmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgYmluZGluZ0ZhdWx0LnNldE5hbWUobmFtZSk7IAotICAgIGJpbmRpbmdGYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdCgoQmluZGluZ0ZhdWx0KWJpbmRpbmdGYXVsdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ0ZhdWx0OwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ0lucHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nSW5wdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhODgyNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nSW5wdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEJpbmRpbmdJbnB1dENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dDsKLSAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uOwotICBTdHJpbmcgbmFtZTsKLSAgCi0gIHB1YmxpYyBBZGRCaW5kaW5nSW5wdXRDb21tYW5kKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdPcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmluZGluZ0lucHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdJbnB1dCgpOwotICAgIGJpbmRpbmdJbnB1dC5zZXROYW1lKG5hbWUpOyAKLSAgICBiaW5kaW5nSW5wdXQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihiaW5kaW5nT3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dCliaW5kaW5nSW5wdXQpOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nT3BlcmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nT3BlcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE0NjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ09wZXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRCaW5kaW5nT3BlcmF0aW9uQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIEJpbmRpbmcgYmluZGluZzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdJbnB1dE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIFN0cmluZyBiaW5kaW5nT3V0cHV0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdGYXVsdE5hbWUgPSIiOyAvLyROT04tTkxTLTEkCi0gIAotICBwcml2YXRlIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVCaW5kaW5nSW5wdXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUJpbmRpbmdPdXRwdXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUJpbmRpbmdGYXVsdCA9IGZhbHNlOwotICAKLSAgcHVibGljIEFkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kKEJpbmRpbmcgYmluZGluZyxTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIEFkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kCi0gICAgKEJpbmRpbmcgYmluZGluZywgIAotICAgICBTdHJpbmcgbmFtZSwKLSAgICAgYm9vbGVhbiBjcmVhdGVCaW5kaW5nSW5wdXQsCi0gICAgIGJvb2xlYW4gY3JlYXRlQmluZGluZ091dHB1dCwKLSAgICAgYm9vbGVhbiBjcmVhdGVCaW5kaW5nRmF1bHQpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5jcmVhdGVCaW5kaW5nSW5wdXQgPSBjcmVhdGVCaW5kaW5nSW5wdXQ7Ci0gICAgdGhpcy5jcmVhdGVCaW5kaW5nT3V0cHV0ID0gY3JlYXRlQmluZGluZ091dHB1dDsKLSAgICB0aGlzLmNyZWF0ZUJpbmRpbmdGYXVsdCA9IGNyZWF0ZUJpbmRpbmdGYXVsdDsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmluZGluZ09wZXJhdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgYmluZGluZy5hZGRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotCi0gICAgV1NETEVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChjcmVhdGVCaW5kaW5nSW5wdXQpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRCaW5kaW5nSW5wdXRDb21tYW5kKGJpbmRpbmdPcGVyYXRpb24sYmluZGluZ0lucHV0TmFtZSk7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgIH0KLQotICAgIGlmIChjcmVhdGVCaW5kaW5nT3V0cHV0KQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkQmluZGluZ091dHB1dENvbW1hbmQoYmluZGluZ09wZXJhdGlvbixiaW5kaW5nT3V0cHV0TmFtZSk7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgIH0KLQotICAgIGlmIChjcmVhdGVCaW5kaW5nRmF1bHQpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRCaW5kaW5nRmF1bHRDb21tYW5kKGJpbmRpbmdPcGVyYXRpb24sYmluZGluZ0ZhdWx0TmFtZSk7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ0lucHV0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZ0lucHV0TmFtZSA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdPdXRwdXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nT3V0cHV0TmFtZSA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdGYXVsdE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdGYXVsdE5hbWUgPSBuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MGRhNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nT3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ091dHB1dENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0OwotICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0gIFN0cmluZyBuYW1lOwotICAKLSAgcHVibGljIEFkZEJpbmRpbmdPdXRwdXRDb21tYW5kKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdPcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmluZGluZ091dHB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgYmluZGluZ091dHB1dC5zZXROYW1lKG5hbWUpOyAKLSAgICBiaW5kaW5nT3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dCliaW5kaW5nT3V0cHV0KTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nT3V0cHV0OwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMTY0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZCBleHRlbmRzIEFkZEV4dGVuc2lvbkNvbW1hbmQKLXsKLSAgRXh0ZW5zaWJsZUVsZW1lbnQgaW5wdXQ7Ci0gIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50OwotICBFbGVtZW50IGFwcEluZm87Ci0gIEVsZW1lbnQgbmV3RWxlbWVudDsKLQotICBwdWJsaWMgQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBFeHRlbnNpYmxlRWxlbWVudCBpbnB1dCwgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBpbnB1dC5nZXRFbGVtZW50KCk7Ci0gICAgRG9jdW1lbnQgZG9jID0gcGFyZW50RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgCi0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhleHRlbnNpb25zU2NoZW1hU3BlYy5nZXROYW1lc3BhY2VVUkkoKSwgZWxlbWVudC5nZXROYW1lKCkpOwotICAgIAotICAgIFN0cmluZyBwcmVmaXggPSBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbklmUmVxdWlyZWQoZG9jLmdldERvY3VtZW50RWxlbWVudCgpLCAicCIsIGV4dGVuc2lvbnNTY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBuZXdFbGVtZW50LnNldFByZWZpeChwcmVmaXgpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBkbyB3ZSBuZWVkIHRvIGltcGxlbWVudD8KLSAgfQotICBwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25JZlJlcXVpcmVkKEVsZW1lbnQgcm9vdEVsZW1lbnQsIFN0cmluZyBwcmVmaXhIaW50LCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7ICAgICAgCi0gICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUocm9vdEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KHJvb3RFbGVtZW50KTsKLSAgICBwcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkobmFtZXNwYWNlKTsKLSAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgeyAKLSAgICAgIFN0cmluZyBiYXNlUHJlZml4ID0gcHJlZml4SGludDsKLSAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXg7Ci0gICAgICBTdHJpbmcgeG1sbnNDb2xvbiA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHhtbG5zQ29sb24gKyBwcmVmaXg7Ci0gICAgICBpbnQgY291bnQgPSAwOwotICAgICAgd2hpbGUgKHJvb3RFbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb3VudCsrOwotICAgICAgICBwcmVmaXggPSBiYXNlUHJlZml4ICsgY291bnQ7Ci0gICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB4bWxuc0NvbG9uICsgcHJlZml4OwotICAgICAgfSAgICAgIAotICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIG5hbWVzcGFjZSk7ICAKLSAgICB9ICAgIAotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRGYXVsdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRmF1bHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTNmMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRGYXVsdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRGYXVsdENvbW1hbmQgZXh0ZW5kcyBBZGRNZXNzYWdlUmVmZXJlbmNlQ29tbWFuZAotewotICBwcml2YXRlIEZhdWx0IG9yaWdpbmFsRmF1bHQ7Ci0gIAotICBwdWJsaWMgQWRkRmF1bHRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIob3BlcmF0aW9uLG5hbWUpOwotICB9Ci0KLSAgcHVibGljIEFkZEZhdWx0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGVNZXNzYWdlKQotICB7Ci0gICAgc3VwZXIob3BlcmF0aW9uLG5hbWUsY3JlYXRlTWVzc2FnZSk7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIGEgRmF1bHQgYmFzZWQgb24gdGhlIGdpdmVuIEZhdWx0LiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIEZhdWx0LgotICAgKi8KLSAgcHVibGljIEFkZEZhdWx0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBGYXVsdCBvcmlnaW5hbEZhdWx0LCBTdHJpbmcgbmFtZSkgewotICAJc3VwZXIob3BlcmF0aW9uLCBuYW1lLCBmYWxzZSk7Ci0gIAkKLSAgCXRoaXMub3JpZ2luYWxGYXVsdCA9IG9yaWdpbmFsRmF1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBtZXNzYWdlUmVmZXJlbmNlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZhdWx0KCk7Ci0gICAgbWVzc2FnZVJlZmVyZW5jZS5zZXROYW1lKG5hbWUpOyAKLSAgICBtZXNzYWdlUmVmZXJlbmNlLnNldEVuY2xvc2luZ0RlZmluaXRpb24ob3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgb3BlcmF0aW9uLmFkZEZhdWx0KChGYXVsdCltZXNzYWdlUmVmZXJlbmNlKTsKLSAgICAKLSAgICAvLyAgVEJEIC0gYWRkIGJpbmRpbmcgZmF1bHQKLQotICAgIGlmIChvcmlnaW5hbEZhdWx0ID09IG51bGwpIHsKLSAgICAJaWYgKGNyZWF0ZU1lc3NhZ2UpCi0gICAgCQljcmVhdGVNZXNzYWdlKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgIAkvLyBEbyBuZWNlc3NhcnkgY29weWluZyBvZiBkYXRhIGZyb20gb3JpZ2luYWwgRmF1bHQgdG8gbmV3IEZhdWx0Ci0gICAgCWlmIChvcmlnaW5hbEZhdWx0LmdldEVNZXNzYWdlKCkgIT0gbnVsbCkgewotLy8gICAgCQlTdHJpbmcgb3JpZ2luYWxNc2dOYW1lID0gb3JpZ2luYWxGYXVsdC5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0vLyAgICAJCQotLy8gICAgCQlib29sZWFuIGdlbmVkID0gZmFsc2U7Ci0vLyAgICAJCWlmIChvcmlnaW5hbEZhdWx0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLS8vICAgIAkJCWdlbmVkID0gU21hcnRSZW5hbWVBY3Rpb24uaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvcmlnaW5hbE1zZ05hbWUsICgoT3BlcmF0aW9uKSBvcmlnaW5hbEZhdWx0LmVDb250YWluZXIoKSkuZ2V0TmFtZSgpLCAiIik7Ci0vLyAgICAJCQotLy8gICAgCQlTdHJpbmcgbmV3TXNnTmFtZSA9ICIiOwotLy8gICAgCQlpZiAoZ2VuZWQpIHsKLS8vICAgIAkJCW5ld01zZ05hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIG1lc3NhZ2VSZWZlcmVuY2UpOwotLy8gICAgCQl9Ci0vLyAgICAJCWVsc2UgewotLy8gICAgCQkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLS8vICAgIAkJCU1lc3NhZ2UgdE1lc3NhZ2UgPSBvcmlnaW5hbEZhdWx0LmdldEVNZXNzYWdlKCk7Ci0vLyAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCB0TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLS8vICAgIAkJfQotICAgIAkJCi0gICAgCQljcmVhdGVNZXNzYWdlKG9yaWdpbmFsRmF1bHQsIE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUob3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgbWVzc2FnZVJlZmVyZW5jZSkpOwotICAgIAl9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRGYXVsdFBhcmFtZXRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4YWVjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEZhdWx0UGFyYW1ldGVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkRmF1bHRQYXJhbWV0ZXJDb21tYW5kIGV4dGVuZHMgQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQgewotCXByb3RlY3RlZCBGYXVsdCBmYXVsdDsKLQlwcml2YXRlIFN0cmluZyBmYXVsdE5hbWU7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UGFyYW1ldGVyUGF0dGVybkZvckZhdWx0KE9wZXJhdGlvbiBvcGVyYXRpb24sIEZhdWx0IGZhdWx0KSB7Ci0gICAgCWludCBwYXR0ZXJuID0gLTE7Ci0gICAgCWlmIChmYXVsdCAhPSBudWxsKSB7Ci0gICAgCQlwYXR0ZXJuID0gZ2V0UGF0dGVybihmYXVsdC5nZXRFTWVzc2FnZSgpKTsKLSAgICAJfQotCQlpZiAocGF0dGVybiA9PSAtMSkgewotCQkJcGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLmdldFBhcmFtZXRlclBhdHRlcm4ob3BlcmF0aW9uKTsKLQkJfQotCQkKLQkJcmV0dXJuIHBhdHRlcm47Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRQYXR0ZXJuKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgIAlpbnQgcGF0dGVybiA9IC0xOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBwYXJ0cyA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCQlQYXJ0IHBhcnQgPSAoUGFydCkgcGFydHMubmV4dCgpOwotCQkJCWlmIChwYXJ0LmdldEVsZW1lbnREZWNsYXJhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJcGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfRUxFTUVOVDsKLQotCQkJCQlYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0JCQkJCWlmIChpc1NlcXVlbmNlUGF0dGVybih4c2RFbGVtZW50LmdldFR5cGVEZWZpbml0aW9uKCkpKSB7Ci0JCQkJCQlwYXR0ZXJuID0gQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9FTEVNRU5UX1NFUV9FTEVNRU5UOwkKLQkJCQkJfQkJCQkJCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmIChwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlwYXR0ZXJuID0gQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9TSU1QTEVUWVBFOwotCQkJCQkKLQkJCQkJaWYgKHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotCQkJCQkJcGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfQ09NUExFWFRZUEU7Ci0JCQkJCQkKLQkJCQkJCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFydC5nZXRUeXBlRGVmaW5pdGlvbigpOwotCQkJCQkJaWYgKGlzU2VxdWVuY2VQYXR0ZXJuKHhzZFR5cGUpKSB7Ci0JCQkJCQkJcGF0dGVybiA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfQ09NUExFWFRZUEVfU0VRX0VMRU1FTlQ7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHBhdHRlcm47Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTZXF1ZW5jZVBhdHRlcm4oWFNEVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgIAlib29sZWFuIGlzU2VxdWVuY2VQYXR0ZXJuID0gZmFsc2U7Ci0gICAgCQotICAgIAlpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotICAgIAkJWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdHlwZTsKLQotCSAgICAJaWYgKGNvbXBsZXhUeXBlLmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSB7Ci0JCQkJWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGNvbXBsZXhUeXBlLmdldENvbnRlbnQoKTsKLQkJCQlpZiAocGFydGljbGUuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkgewotCQkJCQlpc1NlcXVlbmNlUGF0dGVybiA9IHRydWU7Ci0JCQkJfQotCQkJfQotICAgIAl9Ci0gICAgCQotICAgIAlyZXR1cm4gaXNTZXF1ZW5jZVBhdHRlcm47Ci0gICAgfQotCQotCXB1YmxpYyBBZGRGYXVsdFBhcmFtZXRlckNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgRmF1bHQgZmF1bHQpIHsKLQkJc3VwZXIob3BlcmF0aW9uLCBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5QQVJUX0VMRU1FTlQpOwotCQl0aGlzLmZhdWx0ID0gZmF1bHQ7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZmF1bHQgPT0gbnVsbCkgewotCQkJQWRkRmF1bHRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRmF1bHRDb21tYW5kKG9wZXJhdGlvbiwgZ2V0RmF1bHROYW1lKCkpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCWZhdWx0ID0gKEZhdWx0KSBjb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCVBhcnQgcGFydCA9IGNyZWF0ZVdTRExDb21wb25lbnRzKGZhdWx0KTsKLQkJbmV3UGFydCA9IHBhcnQ7Ci0JCQotCQkvLyBDcmVhdGUgbmVjZXNzYXJ5IFhTRCBPYmplY3RzIHN0YXJ0aW5nIHdpdGggdGhlIFBhcnQgcmVmZXJlbmNlCi0JCW5ld1hTREVsZW1lbnQgPSBjcmVhdGVYU0RPYmplY3RzKHBhcnQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5vbnltb3VzWFNERWxlbWVudEJhc2VOYW1lKCkgewotCQlpZiAobmV3QW5vbnltb3VzWFNERWxlbWVudE5hbWUgPT0gbnVsbCkgewotCQkJbmV3QW5vbnltb3VzWFNERWxlbWVudE5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpICsgIl8iICsgZ2V0RmF1bHROYW1lKCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBuZXdBbm9ueW1vdXNYU0RFbGVtZW50TmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdYU0RFbGVtZW50QmFzZU5hbWUoKSB7Ci0JCWlmIChuZXdYU0RFbGVtZW50TmFtZSA9PSBudWxsKSB7Ci0JCQluZXdYU0RFbGVtZW50TmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCkgKyAiXyIgKyBnZXRGYXVsdE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gbmV3WFNERWxlbWVudE5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V1NETE1lc3NhZ2VOYW1lKCkgewotCQlpZiAobmV3V1NETE1lc3NhZ2VOYW1lID09IG51bGwpIHsKLQkJCW5ld1dTRExNZXNzYWdlTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCkgKyAiXyIgKyBnZXRGYXVsdE5hbWUoKSArICJNc2ciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUxpc3QgdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZE1lc3NhZ2VOYW1lcyhvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLQkJCW5ld1dTRExNZXNzYWdlTmFtZSA9IE5hbWVVdGlsLmdldFVuaXF1ZU5hbWVIZWxwZXIobmV3V1NETE1lc3NhZ2VOYW1lLCB1c2VkTmFtZXMpOwotCQl9Ci0JCQotCQlyZXR1cm4gbmV3V1NETE1lc3NhZ2VOYW1lOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V1NETFBhcnROYW1lKCkgewotCQlpZiAobmV3V1NETFBhcnROYW1lID09IG51bGwpIHsKLQkJCW5ld1dTRExQYXJ0TmFtZSA9IGdldEZhdWx0TmFtZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbmV3V1NETFBhcnROYW1lOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRGYXVsdE5hbWUoKSB7Ci0JCWlmIChmYXVsdE5hbWUgPT0gbnVsbCkgewotCQkJaWYgKGZhdWx0ICE9IG51bGwpIHsKLQkJCQlmYXVsdE5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmYXVsdE5hbWUgPSBOYW1lVXRpbC5nZXRGYXVsdE5hbWUob3BlcmF0aW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYXVsdE5hbWU7Ci0JfQotCQotCS8vIFRPRE86IHJlbW92ZSB0aGlzIG1ldGhvZCBhbmQgdXNlIGdldE1lc3NhZ2VSZWZlcmVuY2UoKSBpbnN0ZWFkCi0JcHVibGljIEZhdWx0IGdldEZhdWx0KCkgewotCQlyZXR1cm4gZmF1bHQ7Ci0JfQotCQotCXB1YmxpYyBNZXNzYWdlUmVmZXJlbmNlIGdldE1lc3NhZ2VSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBmYXVsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEltcG9ydENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkSW1wb3J0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDM5ZGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkSW1wb3J0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRJbXBvcnRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICBwcml2YXRlIEltcG9ydCBpbXBvcnRFbGVtZW50OwotICAKLSAgcHVibGljIEFkZEltcG9ydENvbW1hbmQKLSAgCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLSAgCSBTdHJpbmcgbmFtZXNwYWNlLAotICAJIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydEVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaW1wb3J0RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICBpbXBvcnRFbGVtZW50LnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2UpOwotICAgIGltcG9ydEVsZW1lbnQuc2V0TG9jYXRpb25VUkkobG9jYXRpb24pOwotICAgIGltcG9ydEVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZEltcG9ydChpbXBvcnRFbGVtZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZElucHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRJbnB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1NzVmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZElucHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZElucHV0Q29tbWFuZCBleHRlbmRzIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kCi17Ci0gIHByaXZhdGUgSW5wdXQgb3JpZ2luYWxJbnB1dDsKLQkKLSAgcHVibGljIEFkZElucHV0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRJbnB1dENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlTWVzc2FnZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lLGNyZWF0ZU1lc3NhZ2UpOwotICB9Ci0gIAotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBhbiBJbnB1dCBiYXNlZCBvbiB0aGUgZ2l2ZW4gSW5wdXQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gSW5wdXQuCi0gICAqLwotICBwdWJsaWMgQWRkSW5wdXRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIElucHV0IG9yaWdpbmFsSW5wdXQsIFN0cmluZyBuYW1lKSB7Ci0gIAlzdXBlcihvcGVyYXRpb24sIG5hbWUsIGZhbHNlKTsKLSAgCQotICAJdGhpcy5vcmlnaW5hbElucHV0ID0gb3JpZ2luYWxJbnB1dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2VSZWZlcmVuY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5wdXQoKTsKLSAgLy8gIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0TmFtZShuYW1lKTsgCi0gICAgbWVzc2FnZVJlZmVyZW5jZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIG9wZXJhdGlvbi5zZXRJbnB1dCgoSW5wdXQpbWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgCi0gICAgLy8gVEJEIC0gYWRkIGJpbmRpbmcgaW5wdXQgCi0gICAgCi0gICAgaWYgKG9yaWdpbmFsSW5wdXQgPT0gbnVsbCkgewotICAgIAlpZiAoY3JlYXRlTWVzc2FnZSkKLSAgICAJCWNyZWF0ZU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCS8vIERvIG5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSBvcmlnaW5hbCBJbnB1dCB0byBuZXcgSW5wdXQKLSAgICAJaWYgKG9yaWdpbmFsSW5wdXQuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0gICAgCQlTdHJpbmcgb3JpZ2luYWxNc2dOYW1lID0gb3JpZ2luYWxJbnB1dC5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgCQkKLSAgICAJCWJvb2xlYW4gZ2VuZWQgPSBmYWxzZTsKLSAgICAJCWlmIChvcmlnaW5hbElucHV0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLSAgICAJCQlnZW5lZCA9IFNtYXJ0UmVuYW1lQWN0aW9uLmlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob3JpZ2luYWxNc2dOYW1lLCAoKE9wZXJhdGlvbikgb3JpZ2luYWxJbnB1dC5lQ29udGFpbmVyKCkpLmdldE5hbWUoKSwgIlJlcXVlc3QiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCi0gICAgCQlTdHJpbmcgbmV3TXNnTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCQlpZiAoZ2VuZWQpIHsKLSAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBtZXNzYWdlUmVmZXJlbmNlKTsKLSAgICAJCX0KLSAgICAJCWVsc2UgewotICAgIAkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgCQkJTWVzc2FnZSB0TWVzc2FnZSA9IG9yaWdpbmFsSW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCB0TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAJCX0KLQotICAgIAkJY3JlYXRlTWVzc2FnZShvcmlnaW5hbElucHV0LCBuZXdNc2dOYW1lKTsKLSAgICAJfQotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZElucHV0UGFyYW1ldGVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzIzZjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy52aXNpdG9yLlcxMUZpbmRJbm5lckVsZW1lbnRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuWFNEQ29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kIGV4dGVuZHMgQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQgewotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZVhTRE9iamVjdHMgPSB0cnVlOwotCXByb3RlY3RlZCBib29sZWFuIHJldXNlRXhpc3RpbmdNZXNzYWdlID0gZmFsc2U7Ci0JcHJpdmF0ZSBJbnB1dCBpbnB1dDsKLQlwdWJsaWMgQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIGludCBzdHlsZSkgewotCQlzdXBlcihvcGVyYXRpb24sIHN0eWxlKTsKLQl9Ci0KLQlwdWJsaWMgQWRkSW5wdXRQYXJhbWV0ZXJDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIGludCBzdHlsZSwgYm9vbGVhbiByZXVzZU1lc3NhZ2UpIHsKLQkJc3VwZXIob3BlcmF0aW9uLCBzdHlsZSk7Ci0JCXJldXNlRXhpc3RpbmdNZXNzYWdlID0gcmV1c2VNZXNzYWdlOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUGFydCBwYXJ0ID0gbnVsbDsKLQkJaWYgKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKSB7Ci0JCQlpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCUFkZElucHV0Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZElucHV0Q29tbWFuZChvcGVyYXRpb24sIG51bGwpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCWlucHV0ID0gKElucHV0KSBjb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCWlmIChzdHlsZSA9PSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5QQVJUX0VMRU1FTlRfU0VRX0VMRU1FTlQpIHsKLQkJCXBhcnQgPSBjcmVhdGVEb2NMaXRXcmFwcGVkV1NETENvbXBvbmVudHMoaW5wdXQpOwotCQl9Ci0JCWVsc2UgewotCQkJcGFydCA9IGNyZWF0ZVdTRExDb21wb25lbnRzKGlucHV0KTsKLQkJfQotCQkKLQkJbmV3UGFydCA9IHBhcnQ7Ci0JCS8vIENyZWF0ZSBuZWNlc3NhcnkgWFNEIE9iamVjdHMgc3RhcnRpbmcgd2l0aCB0aGUgUGFydCByZWZlcmVuY2UKLQkJaWYgKGNyZWF0ZVhTRE9iamVjdHMpCi0JCQluZXdYU0RFbGVtZW50ID0gY3JlYXRlWFNET2JqZWN0cyhwYXJ0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhcnQgY3JlYXRlRG9jTGl0V3JhcHBlZFdTRExDb21wb25lbnRzKE1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZikgewotCQlNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCk7Ci0JCVBhcnQgcGFydCA9IG51bGw7Ci0KLQkJaWYgKHJldXNlRXhpc3RpbmdNZXNzYWdlICYmIG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJLy8gU2VlIGlmIHdlIGNhbiB1c2UgYW4gZXhpc3RpbmcgTWVzc2FnZQotCQkJTWVzc2FnZSBleGlzdGluZ01lc3NhZ2UgPSBudWxsOwotCQkJU3RyaW5nIG1lc3NhZ2VOYW1lID0gZ2V0SWRlYWxNZXNzYWdlTmFtZShtZXNzYWdlUmVmKTsKLQkJCUl0ZXJhdG9yIG1lc3NhZ2VzID0gbWVzc2FnZVJlZi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0RU1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChtZXNzYWdlcy5oYXNOZXh0KCkpIHsKLQkJCQlNZXNzYWdlIGl0ZW0gPSAoTWVzc2FnZSkgbWVzc2FnZXMubmV4dCgpOwotCQkJCVFOYW1lIGl0ZW1OYW1lID0gaXRlbS5nZXRRTmFtZSgpOwotCQkJCWlmIChpdGVtTmFtZSAhPSBudWxsICYmIGl0ZW1OYW1lLmdldExvY2FsUGFydCgpICE9IG51bGwgJiYgbWVzc2FnZU5hbWUuZXF1YWxzKGl0ZW1OYW1lLmdldExvY2FsUGFydCgpKSkgewotCQkJCQlleGlzdGluZ01lc3NhZ2UgPSBpdGVtOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChleGlzdGluZ01lc3NhZ2UgIT0gbnVsbCkgewotCQkJCWlmIChleGlzdGluZ01lc3NhZ2UuZ2V0RVBhcnRzKCkuc2l6ZSgpID4gMCkgewotCQkJCQkvLyBTZWUgaWYgZXhpc3RpbmcgTWVzc2FnZSBoYXMgYSBQYXJ0IHJlZmVyZW5jaW5nIGFuIFhTRCBFbGVtZW50IHdpdGggdGhlIHByb3BlciBuYW1lCi0JCQkJCVBhcnQgZXhpc3RpbmdQYXJ0ID0gKFBhcnQpIGV4aXN0aW5nTWVzc2FnZS5nZXRFUGFydHMoKS5nZXQoMCk7Ci0JCQkJCWlmICghKGV4aXN0aW5nUGFydC5nZXROYW1lKCkuZXF1YWxzKGdldERvY0xpdFdyYXBwZWRQYXJ0TmFtZSgpKSkpIHsKLQkJCQkJCW1lc3NhZ2UgPSBudWxsOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGV4aXN0aW5nRWxlbWVudCA9IGV4aXN0aW5nUGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLQkJCQkJCWlmIChleGlzdGluZ0VsZW1lbnQgIT0gbnVsbCAmJiBleGlzdGluZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhvcGVyYXRpb24uZ2V0TmFtZSgpKSkgewotCQkJCQkJCS8vIFRoZXJlIGlzIGFuIGV4aXN0aW5nIFhTRCBFbGVtZW50IHdpdGggdGhlIHByb3BlciBuYW1lCi0JCQkJCQkJLy8gU2VlIGlmIHRoZSBYU0QgRWxlbWVudCBoYXMgYW4gYW5vbnltb3VzIHR5cGUgd2l0aCBhIHNlcXVlbmNlIGFuZCBhbiBYU0QgRWxlbWVudAotCQkJCQkJCVcxMUZpbmRJbm5lckVsZW1lbnRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgVzExRmluZElubmVyRWxlbWVudFZpc2l0b3IoKTsKLQkJCQkJCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gaW5uZXJFbGVtZW50ID0gdmlzaXRvci5nZXRJbm5lclhTREVsZW1lbnQoZXhpc3RpbmdFbGVtZW50KTsKLQkJCQkJCQlpZiAoIWlubmVyRWxlbWVudC5lcXVhbHMoZXhpc3RpbmdFbGVtZW50KSkgewotCQkJCQkJCQkvLyBGb3VuZCBhbiBleGlzdGluZyBpbm5lciBYU0QgRWxlbWVudAotCQkJCQkJCQljcmVhdGVYU0RPYmplY3RzID0gZmFsc2U7Ci0KLQkJCQkJCQkJLy8gc2V0IHRoZSBNZXNzYWdlUmVmZXJlbmNlIC0tPiBNZXNzYWdlIHJlZmVyZW5jZQotCQkJCQkJCQltZXNzYWdlUmVmLnNldEVNZXNzYWdlKGV4aXN0aW5nTWVzc2FnZSk7Ci0JCQkJCQkJCW1lc3NhZ2UgPSBleGlzdGluZ01lc3NhZ2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBDcmVhdGUgTWVzc2FnZQotCQkJQWRkTWVzc2FnZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRNZXNzYWdlQ29tbWFuZChtZXNzYWdlUmVmLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgZ2V0V1NETE1lc3NhZ2VOYW1lKCkpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCW1lc3NhZ2UgPSAoTWVzc2FnZSkgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQkJbWVzc2FnZVJlZi5zZXRFTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0KLQkJaWYgKG1lc3NhZ2UuZ2V0RVBhcnRzKCkuc2l6ZSgpID09IDApIHsKLQkJCS8vIENyZWF0ZSBQYXJ0Ci0JCQlTdHJpbmcgcGFydE5hbWUgPSBnZXREb2NMaXRXcmFwcGVkUGFydE5hbWUoKTsKLQkJCUFkZFBhcnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSwgcGFydE5hbWUpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCXBhcnQgPSAoUGFydCkgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcGFydCA9IChQYXJ0KSBtZXNzYWdlLmdldEVQYXJ0cygpLmdldCgwKTsKLQkJfQotCQlmb3JtYXRDaGlsZChtZXNzYWdlLmdldEVsZW1lbnQoKSk7Ci0KLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5vbnltb3VzWFNERWxlbWVudEJhc2VOYW1lKCkgewotCQlpZiAobmV3QW5vbnltb3VzWFNERWxlbWVudE5hbWUgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuc3R5bGUgPT0gQWRkQmFzZVBhcmFtZXRlckNvbW1hbmQuUEFSVF9FTEVNRU5UX1NFUV9FTEVNRU5UKSB7Ci0JCQkJbmV3QW5vbnltb3VzWFNERWxlbWVudE5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3QW5vbnltb3VzWFNERWxlbWVudE5hbWUgPSBnZXRXU0RMUGFydE5hbWUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ld0Fub255bW91c1hTREVsZW1lbnROYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld1hTREVsZW1lbnRCYXNlTmFtZSgpIHsKLQkJaWYgKG5ld1hTREVsZW1lbnROYW1lID09IG51bGwpIHsKLQkJCW5ld1hTREVsZW1lbnROYW1lID0gImluIjsgLy8kTk9OLU5MUy0xJAotLy8JCQluZXdYU0RFbGVtZW50TmFtZSA9IGdldFdTRExQYXJ0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1hTREVsZW1lbnROYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFdTRExNZXNzYWdlTmFtZSgpIHsKLQkJaWYgKG5ld1dTRExNZXNzYWdlTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLQkJCQluZXdXU0RMTWVzc2FnZU5hbWU9IE5hbWVVdGlsLmdldE1lc3NhZ2VOYW1lKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBuZXdXU0RMTWVzc2FnZU5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRXU0RMUGFydE5hbWUoKSB7Ci0JCWlmIChuZXdXU0RMUGFydE5hbWUgPT0gbnVsbCkgewotCQkJbmV3V1NETFBhcnROYW1lICA9IE5hbWVVdGlsLmdldFBhcnROYW1lKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSk7CQkJCi0JCX0KLQkJCi0JCXJldHVybiBuZXdXU0RMUGFydE5hbWU7Ci0JfQotCQotCS8vIFRPRE86IHJlbW92ZSB0aGlzIG1ldGhvZCBhbmQgdXNlIGdldE1lc3NhZ2VSZWZlcmVuY2UoKSBpbnN0ZWFkCi0JcHVibGljIElucHV0IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVQYXJ0RWxlbWVudFNlcUVsZW1lbnRQYXR0ZXJuKFBhcnQgcGFydCwgWFNERWxlbWVudERlY2xhcmF0aW9uIHBhcnRFbGVtZW50KSB7Ci0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiByZXR1cm5lZFhTREVsZW1lbnQgPSBudWxsOwotCi0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiBvcmlnaW5hbEVsZW1lbnQgPSBudWxsOwotCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gYW5vblhTREVsZW1lbnQgPSBudWxsOwotCi0JCS8vIENyZWF0ZSB0aGUgWFNERWxlbWVudCAoYW5vbnltb3VzKSByZWZlcmVuY2VkIGJ5IHRoZSBQYXJ0IGlmIG5lY2Vzc2FyeQotCQlpZiAocGFydEVsZW1lbnQgPT0gbnVsbCB8fCBwYXJ0RWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpID09IG51bGwpIHsKLQkJCS8vRmluZCBhbiBleGlzdGluZyBYU0RFbGVtZW50IHRvIHVzZSBpZiBwb3NzaWJsZQotCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGV4aXN0aW5nRWxlbWVudCA9IG51bGw7Ci0JCQlTdHJpbmcgaWRlYWxFbGVtZW50TmFtZSA9IGdldEFub255bW91c1hTREVsZW1lbnRCYXNlTmFtZSgpOwotCQkJWFNEU2NoZW1hIHNjaGVtYSA9IFhTRENvbXBvbmVudEhlbHBlci5nZXRYU0RTY2hlbWEocGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXQgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGV4aXN0aW5nRWxlbWVudCA9PSBudWxsICYmIGl0Lmhhc05leHQoKSkgewotCQkJCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gaXRlbSA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGl0ZW0uZ2V0TmFtZSgpLmVxdWFscyhpZGVhbEVsZW1lbnROYW1lKSkgewotCQkJCQkJLy8gZm91bmQgYW4gZWxlbWVudCB3ZSBjYW4gdXNlLiAgQ29uZmlybSBpdCBoYXMgYSBkb2MtbGl0LXdyYXBwZWQgcGF0dGVybgotCQkJCQkJLy8gU2VlIGlmIHRoZSBYU0QgRWxlbWVudCBoYXMgYW4gYW5vbnltb3VzIHR5cGUgd2l0aCBhIHNlcXVlbmNlIGFuZCBhbiBYU0QgRWxlbWVudAotCQkJCQkJZXhpc3RpbmdFbGVtZW50ID0gaXRlbTsKLQotCQkJCQkJWFNEVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGl0ZW0uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLQkJCQkJCWlmICh4c2RUeXBlICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGNvbnRlbnRzID0geHNkVHlwZS5lQ29udGVudHMoKTsKLQkJCQkJCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCAmJiBjb250ZW50cy5nZXQoMCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgewotCQkJCQkJCQlYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgY29udGVudHMuZ2V0KDApOwotCQkJCQkJCQlMaXN0IHBhcnRpY2xlQ29udGVudHMgPSBwYXJ0aWNsZS5lQ29udGVudHMoKTsKLQkJCQkJCQkJaWYgKHBhcnRpY2xlQ29udGVudHMuc2l6ZSgpID4gMCAmJiBwYXJ0aWNsZUNvbnRlbnRzLmdldCgwKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApIHsKLQkJCQkJCQkJCVhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBwYXJ0aWNsZUNvbnRlbnRzLmdldCgwKTsKLQkJCQkJCQkJCUxpc3QgbW9kZWxDb250ZW50cyA9IG1vZGVsR3JvdXAuZUNvbnRlbnRzKCk7Ci0JCQkJCQkJCQlpZiAobW9kZWxDb250ZW50cy5zaXplKCkgPiAwICYmIG1vZGVsQ29udGVudHMuZ2V0KDApIGluc3RhbmNlb2YgWFNEUGFydGljbGUpIHsKLQkJCQkJCQkJCQlYU0RQYXJ0aWNsZSBpbm5lclBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBtb2RlbENvbnRlbnRzLmdldCgwKTsKLQkJCQkJCQkJCQlMaXN0IGlubmVyQ29udGVudHMgPSBpbm5lclBhcnRpY2xlLmVDb250ZW50cygpOwotCQkJCQkJCQkJCWlmIChpbm5lckNvbnRlbnRzLnNpemUoKSA+IDAgJiYgaW5uZXJDb250ZW50cy5nZXQoMCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJCQkJCQkJLy8gaW5uZXIgWFNEIEVsZW1lbnQgZXhpc3RzCi0JCQkJCQkJCQkJCS8vIHJldXNlIGV4aXN0aW5nIGVsZW1lbnQKLQkJCQkJCQkJCQkJU3RyaW5nIHByZWZpeGVkTmFtZSA9IGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgZXhpc3RpbmdFbGVtZW50KTsKLQkJCQkJCQkJCQkJQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UocGFydCwgZmFsc2UsIHByZWZpeGVkTmFtZSk7Ci0JCQkJCQkJCQkJCXJldHVybiBleGlzdGluZ0VsZW1lbnQ7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZXhpc3RpbmdFbGVtZW50ID09IG51bGwpIHsKLQkJCQlhbm9uWFNERWxlbWVudCA9IFhTRENvbXBvbmVudEhlbHBlci5jcmVhdGVBbm9ueW1vdXNYU0RFbGVtZW50RGVmaW5pdGlvbihnZXRBbm9ueW1vdXNYU0RFbGVtZW50QmFzZU5hbWUoKSwgcGFydCk7Ci0vLwkJCQlwYXJ0LnNldEVsZW1lbnREZWNsYXJhdGlvbihhbm9uWFNERWxlbWVudCk7Ci0JCQkJU3RyaW5nIHByZWZpeGVkTmFtZSA9IGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgYW5vblhTREVsZW1lbnQpOwotCQkJCUNvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0Q29tcG9uZW50UmVmZXJlbmNlKHBhcnQsIGZhbHNlLCBwcmVmaXhlZE5hbWUpOwotCQkJCXBhcnQuc2V0VHlwZURlZmluaXRpb24obnVsbCk7Ci0KLQkJCQlpZiAocGFydEVsZW1lbnQgIT0gbnVsbCAmJiBwYXJ0RWxlbWVudC5nZXRTY2hlbWEoKSAhPSBudWxsKSB7Ci0JCQkJCW9yaWdpbmFsRWxlbWVudCA9IHBhcnRFbGVtZW50OwotCQkJCQkvLyBSZW1vdmUgdGhlICdvcmlnaW5hbCcgWFNERWxlbWVudCBhcyBhIEdsb2JhbCBFbGVtZW50Ci0JCQkJCXBhcnRFbGVtZW50LmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcnRFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhbm9uWFNERWxlbWVudCA9IGV4aXN0aW5nRWxlbWVudDsKLQkJCQkvLyByZXVzZSBleGlzdGluZyBlbGVtZW50Ci0JCQkJU3RyaW5nIHByZWZpeGVkTmFtZSA9IGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgZXhpc3RpbmdFbGVtZW50KTsKLQkJCQlDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBmYWxzZSwgcHJlZml4ZWROYW1lKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWFub25YU0RFbGVtZW50ID0gcGFydEVsZW1lbnQ7Ci0JCX0KLQotCQkvLyBDcmVhdGUgYSBuZXcgWFNERWxlbWVudAotCQlYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBYU0RDb21wb25lbnRIZWxwZXIuZ2V0WFNETW9kZWxHcm91cChhbm9uWFNERWxlbWVudCwgcGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQlyZXR1cm5lZFhTREVsZW1lbnQgPSBYU0RDb21wb25lbnRIZWxwZXIuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZChudWxsLCBnZXROZXdYU0RFbGVtZW50QmFzZU5hbWUoKSwgbW9kZWxHcm91cCk7Ci0KLQkJLy8gQWRkIHRoZSBuZXdseSBjcmVhdGVkIFhTREVsZW1lbnQgdG8gdGhlIE1vZGVsR3JvdXAKLQkJWFNEQ29tcG9uZW50SGVscGVyLmFkZFhTREVsZW1lbnRUb01vZGVsR3JvdXAoYW5vblhTREVsZW1lbnQsIHJldHVybmVkWFNERWxlbWVudCk7Ci0KLQkJLy8gQWRkIHRoZSAnb3JpZ2luYWwnIFhTREVsZW1lbnQgaWYgaXQncyB0eXBlIHdhc24ndCBhbm9ueW1vdXMKLQkJaWYgKG9yaWdpbmFsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlYU0RDb21wb25lbnRIZWxwZXIuYWRkWFNERWxlbWVudFRvTW9kZWxHcm91cChhbm9uWFNERWxlbWVudCwgb3JpZ2luYWxFbGVtZW50KTsKLQkJfQotCQlmb3JtYXRDaGlsZChhbm9uWFNERWxlbWVudC5nZXRFbGVtZW50KCkpOwotCQlyZXR1cm4gcmV0dXJuZWRYU0RFbGVtZW50OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJZGVhbE1lc3NhZ2VOYW1lKE1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZikgewkgICAgCi0JCVN0cmluZyBtZXNzYWdlTmFtZSA9ICJOZXdNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCQltZXNzYWdlTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCkgKyAiUmVxdWVzdCI7Ci0JCQotCQlyZXR1cm4gbWVzc2FnZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBNZXNzYWdlUmVmZXJlbmNlIGdldE1lc3NhZ2VSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmRhMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRNZXNzYWdlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRNZXNzYWdlQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lOwotICBwcml2YXRlIE1lc3NhZ2UgbWVzc2FnZTsKLSAgcHJpdmF0ZSBNZXNzYWdlIG9yaWdpbmFsTWVzc2FnZTsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVQYXJ0ID0gZmFsc2U7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFSVF9OQU1FID0gIk5ld1BhcnQiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgQWRkTWVzc2FnZUNvbW1hbmQKLSAgCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLSAgCSBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgfQotICAKLSAgcHVibGljIEFkZE1lc3NhZ2VDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sIAotCQkgU3RyaW5nIGxvY2FsTmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlUGFydCkKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JICB0aGlzLmNyZWF0ZVBhcnQgPSBjcmVhdGVQYXJ0OwotCX0KLSAgCi0gIC8qCi0gICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIGEgTWVzc2FnZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gTWVzc2FnZS4gIEluIGVzc2VuY2UsIHRoaXMgd2lsbAotICAgKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBnaXZlbiBNZXNzYWdlLgotICAgKi8KLSAgcHVibGljIEFkZE1lc3NhZ2VDb21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTWVzc2FnZSBvcmlnaW5hbE1lc3NhZ2UsIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gY29weVBhcnQpIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCXRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotCXRoaXMuY3JlYXRlUGFydCA9IGNvcHlQYXJ0OwotICAJdGhpcy5vcmlnaW5hbE1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBtZXNzYWdlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBtZXNzYWdlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLGxvY2FsTmFtZSkpOwotICAgIG1lc3NhZ2Uuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgCi0gICAgaWYgKG9yaWdpbmFsTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgCWlmIChjcmVhdGVQYXJ0KQotICAgIAl7Ci0gICAgCQlBZGRQYXJ0Q29tbWFuZCBjb21tYW5kID0gCi0gICAgCQkJbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsREVGQVVMVF9QQVJUX05BTUUsV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwic3RyaW5nIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJaWYgKG9yaWdpbmFsTWVzc2FnZS5nZXRFUGFydHMoKSAhPSBudWxsKSB7Ci0gICAgCQlJdGVyYXRvciBpdCA9IG9yaWdpbmFsTWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIAkJCi0gICAgCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCQkJUGFydCBwYXJ0ID0gKFBhcnQpIGl0Lm5leHQoKTsKLSAgICAJCQlBZGRQYXJ0Q29tbWFuZCBjb21tYW5kOwotICAgIAkJCWlmIChTbWFydFJlbmFtZUFjdGlvbi5pc1BhcnROYW1lR2VuZXJhdGVkKHBhcnQuZ2V0TmFtZSgpLCBvcmlnaW5hbE1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpCi0gICAgCQkJCWNvbW1hbmQgPSBuZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSwgcGFydCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVQYXJ0TmFtZShtZXNzYWdlLCBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsJCi0gICAgCQkJZWxzZQotICAgIAkJCQljb21tYW5kID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIHBhcnQsIHBhcnQuZ2V0TmFtZSgpKTsKLSAgICAJCQkKLSAgICAJCQkKLSAgICAJCQljb21tYW5kLnJ1bigpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5MzlmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBZGRNZXNzYWdlUmVmZXJlbmNlQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2U7Ci0gIHByb3RlY3RlZCBPcGVyYXRpb24gb3BlcmF0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVNZXNzYWdlID0gZmFsc2U7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfTUVTU0FHRV9OQU1FID0gIk5ld01lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuY3JlYXRlTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNZXNzYWdlKCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgQWRkTWVzc2FnZUNvbW1hbmQgY29tbWFuZCA9IAotICAgICAgbmV3IEFkZE1lc3NhZ2VDb21tYW5kKGRlZmluaXRpb24sREVGQVVMVF9NRVNTQUdFX05BTUUsY3JlYXRlTWVzc2FnZSk7ICAgICAgCi0gICAgY29tbWFuZC5ydW4oKTsKLSAgICBtZXNzYWdlUmVmZXJlbmNlLnNldEVNZXNzYWdlKChNZXNzYWdlKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIE92ZXJsb2FkZWQgY3JlYXRlTWVzc2FnZShhcmcpIG1ldGhvZC4gIFNpbWlsYXIgdG8gdG8gY3JlYXRlTWVzc2FnZSgpIGJ1dCB0YWtlcyBpbiBhIE1lc3NhZ2VSZWZlcmVuY2UuCi0gICAqIE1ldGhvZCB1c2VkIHRvIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIE1lc3NhZ2UgKGNvbnRhaW5lZCBpbiB0aGUgcGFzc2VkIGluIE1lc3NhZ2VSZWZlcmVuY2UpLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWVzc2FnZShNZXNzYWdlUmVmZXJlbmNlIG9yaWdpbmFsTVJlZiwgU3RyaW5nIG5ld01lc3NhZ2VSZWZOYW1lKSB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBNZXNzYWdlIHRNZXNzYWdlID0gb3JpZ2luYWxNUmVmLmdldEVNZXNzYWdlKCk7Ci0gICAgQWRkTWVzc2FnZUNvbW1hbmQgY29tbWFuZCA9IAotICAgICAgbmV3IEFkZE1lc3NhZ2VDb21tYW5kKGRlZmluaXRpb24sIHRNZXNzYWdlLCBuZXdNZXNzYWdlUmVmTmFtZSwgdHJ1ZSk7Ci0gICAgY29tbWFuZC5ydW4oKTsKLSAgICBtZXNzYWdlUmVmZXJlbmNlLnNldEVNZXNzYWdlKChNZXNzYWdlKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZVJlZmVyZW5jZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3BlcmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPcGVyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjcwZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPcGVyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRPcGVyYXRpb25Db21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgUG9ydFR5cGUgcG9ydFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgcHJpdmF0ZSBPcGVyYXRpb24gb3JpZ2luYWxPcGVyYXRpb247Ci0gIHByaXZhdGUgYm9vbGVhbiBjb3B5SW5PdXRGYXVsdDsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVJbnB1dCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlT3V0cHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVGYXVsdCA9IGZhbHNlOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlBVVF9OQU1FID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9PVVRQVVRfTkFNRSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFVTFRfTkFNRSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgQWRkT3BlcmF0aW9uQ29tbWFuZAotCQkoUG9ydFR5cGUgcG9ydFR5cGUsICAKLQkJIFN0cmluZyBuYW1lKQotCXsKLQkgIHRoaXMucG9ydFR5cGUgPSBwb3J0VHlwZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JfQotICAKLSAgcHVibGljIEFkZE9wZXJhdGlvbkNvbW1hbmQKLQkJKFBvcnRUeXBlIHBvcnRUeXBlLCAgCi0JCSBTdHJpbmcgbmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlSW5wdXQsCi0JCSBib29sZWFuIGNyZWF0ZU91dHB1dCwKLQkJIGJvb2xlYW4gY3JlYXRlRmF1bHQpCi0JewotCSAgdGhpcy5wb3J0VHlwZSA9IHBvcnRUeXBlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQkgIHRoaXMuY3JlYXRlSW5wdXQgPSBjcmVhdGVJbnB1dDsKLQkgIHRoaXMuY3JlYXRlT3V0cHV0ID0gY3JlYXRlT3V0cHV0OwotCSAgdGhpcy5jcmVhdGVGYXVsdCA9IGNyZWF0ZUZhdWx0OwotCX0KLSAgCi0gIC8qCi0gICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIGFuIE9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gT3BlcmF0aW9uLiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIE9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBZGRPcGVyYXRpb25Db21tYW5kKFBvcnRUeXBlIHBvcnRUeXBlLCBPcGVyYXRpb24gb3JpZ2luYWxPcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNvcHlJbk91dEZhdWx0KSB7Ci0gIAl0aGlzLnBvcnRUeXBlID0gcG9ydFR5cGU7Ci0gIAl0aGlzLm9yaWdpbmFsT3BlcmF0aW9uID0gb3JpZ2luYWxPcGVyYXRpb247Ci0gIAl0aGlzLm5hbWUgPSBuYW1lOwotICAJdGhpcy5jb3B5SW5PdXRGYXVsdCA9IGNvcHlJbk91dEZhdWx0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgb3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIG9wZXJhdGlvbi5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHBvcnRUeXBlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0KLSAgICBpZiAob3JpZ2luYWxPcGVyYXRpb24gPT0gbnVsbCkgeyAgICAKLSAgICAJV1NETEVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIAlpZiAoY3JlYXRlSW5wdXQpCi0gICAgCXsKLSAgICAJCWNvbW1hbmQgPSBuZXcgQWRkSW5wdXRDb21tYW5kKG9wZXJhdGlvbixERUZBVUxUX0lOUFVUX05BTUUsdHJ1ZSk7Ci0gICAgCQljb21tYW5kLnJ1bigpOwotICAgIAl9Ci0gICAgCi0gICAgCWlmIChjcmVhdGVPdXRwdXQpCi0gICAgCXsKLSAgICAJCWNvbW1hbmQgPSBuZXcgQWRkT3V0cHV0Q29tbWFuZChvcGVyYXRpb24sREVGQVVMVF9PVVRQVVRfTkFNRSx0cnVlKTsKLSAgICAJCWNvbW1hbmQucnVuKCk7Ci0gICAgCX0KLSAgICAKLSAgICAJaWYgKGNyZWF0ZUZhdWx0KQotICAgIAl7Ci0gICAgCQljb21tYW5kID0gbmV3IEFkZEZhdWx0Q29tbWFuZChvcGVyYXRpb24sREVGQVVMVF9GQVVMVF9OQU1FLHRydWUpOwotICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJLy8gRG8gbmVjZXNzYXJ5IGNvcHlpbmcgb2YgZGF0YSBmcm9tIG9yaWdpbmFsIG9wZXJhdGlvbiB0byBuZXcgb3BlcmF0aW9uCi0gICAgCS8vIFBhcmFtYXRlciBvcmRlcmluZz8gRG9jdW1lbnRhdGlvbj8gIFRoaXMgcGFydCBzdGlsbCBuZWVkcyB0byBiZSB3b3JrZWQgb24gICAgCQotICAgIAkvLyBDb3B5ICdraWRzJyBpZiBuZWNlc3NhcnkKLSAgICAJaWYgKGNvcHlJbk91dEZhdWx0KSB7Ci0gICAgCQlXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAJaWYgKG9yaWdpbmFsT3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCU91dHB1dCBvdXRwdXQgPSBvcmlnaW5hbE9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgICAgIAkJY29tbWFuZCA9IG5ldyBBZGRPdXRwdXRDb21tYW5kKG9wZXJhdGlvbiwgb3V0cHV0LCBOYW1lVXRpbC5idWlsZFVuaXF1ZU91dHB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQljb21tYW5kLnJ1bigpOwotICAgICAgICAJfQotICAgICAgICAJCi0gICAgICAgIAlpZiAob3JpZ2luYWxPcGVyYXRpb24uZ2V0RUlucHV0KCkgIT0gbnVsbCkKLSAgICAgICAgCXsKLSAgICAgICAgCQlJbnB1dCBpbnB1dCA9IG9yaWdpbmFsT3BlcmF0aW9uLmdldEVJbnB1dCgpOwotICAgICAgICAJCWNvbW1hbmQgPSBuZXcgQWRkSW5wdXRDb21tYW5kKG9wZXJhdGlvbiwgaW5wdXQsIE5hbWVVdGlsLmJ1aWxkVW5pcXVlSW5wdXROYW1lKHBvcnRUeXBlLCBvcGVyYXRpb24uZ2V0TmFtZSgpLCAiIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAgICAgCX0KLSAgICAgICAgCi0gICAgICAgIAlpZiAob3JpZ2luYWxPcGVyYXRpb24uZ2V0RUZhdWx0cygpICE9IG51bGwpCi0gICAgICAgIAl7Ci0gICAgICAgIAkJSXRlcmF0b3IgaXQgPSBvcmlnaW5hbE9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpdC5uZXh0KCk7Ci0gICAgICAgIAkJCWNvbW1hbmQgPSBuZXcgQWRkRmF1bHRDb21tYW5kKG9wZXJhdGlvbiwgZmF1bHQsIE5hbWVVdGlsLmJ1aWxkVW5pcXVlRmF1bHROYW1lKG9yaWdpbmFsT3BlcmF0aW9uLCBmYXVsdC5nZXROYW1lKCkpKTsKLSAgICAgICAgCQkJY29tbWFuZC5ydW4oKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgCQkKLSAgICAJfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODgxMWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRPdXRwdXRDb21tYW5kIGV4dGVuZHMgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBPdXRwdXQgb3JpZ2luYWxPdXRwdXQ7Ci0gIAotICBwdWJsaWMgQWRkT3V0cHV0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRPdXRwdXRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSxjcmVhdGVNZXNzYWdlKTsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYW4gT3V0cHV0IGJhc2VkIG9uIHRoZSBnaXZlbiBPdXRwdXQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gT3V0cHV0LgotICAgKi8KLSAgcHVibGljIEFkZE91dHB1dENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgT3V0cHV0IG9yaWdpbmFsT3V0cHV0LCBTdHJpbmcgbmFtZSkgewotICAJc3VwZXIob3BlcmF0aW9uLCBuYW1lLCBmYWxzZSk7Ci0gIAkKLSAgCXRoaXMub3JpZ2luYWxPdXRwdXQgPSBvcmlnaW5hbE91dHB1dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2VSZWZlcmVuY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0vLyAgICBtZXNzYWdlUmVmZXJlbmNlLnNldE5hbWUobmFtZSk7Ci0gICAgbWVzc2FnZVJlZmVyZW5jZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIG9wZXJhdGlvbi5zZXRPdXRwdXQoKE91dHB1dCltZXNzYWdlUmVmZXJlbmNlKTsKLSAgICAKLSAgICAvLyAgVEJEIC0gYWRkIGJpbmRpbmcgb3V0cHV0IAotICAgIAotICAgIGlmIChvcmlnaW5hbE91dHB1dCA9PSBudWxsKSB7Ci0gICAgCWlmIChjcmVhdGVNZXNzYWdlKQotICAgIAkJY3JlYXRlTWVzc2FnZSgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJLy8gRG8gbmVjZXNzYXJ5IGNvcHlpbmcgb2YgZGF0YSBmcm9tIG9yaWdpbmFsIE91dHB1dCB0byBuZXcgT3V0cHV0Ci0gICAgCWlmIChvcmlnaW5hbE91dHB1dC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLSAgICAJCVN0cmluZyBvcmlnaW5hbE1zZ05hbWUgPSBvcmlnaW5hbE91dHB1dC5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQotCQlib29sZWFuIGdlbmVkID0gZmFsc2U7Ci0JCWlmIChvcmlnaW5hbE91dHB1dC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0JCQlnZW5lZCA9IFNtYXJ0UmVuYW1lQWN0aW9uLmlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob3JpZ2luYWxNc2dOYW1lLCAoKE9wZXJhdGlvbikgb3JpZ2luYWxPdXRwdXQuZUNvbnRhaW5lcigpKS5nZXROYW1lKCksICJSZXNwb25zZSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlTdHJpbmcgbmV3TXNnTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChnZW5lZCkgewotCQkJbmV3TXNnTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUob3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgbWVzc2FnZVJlZmVyZW5jZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCQkJTWVzc2FnZSB0TWVzc2FnZSA9IG9yaWdpbmFsT3V0cHV0LmdldEVNZXNzYWdlKCk7Ci0JCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCB0TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQkJfQotCQkKLSAgICAJY3JlYXRlTWVzc2FnZShvcmlnaW5hbE91dHB1dCwgbmV3TXNnTmFtZSk7Ci0gICAgCX0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPdXRwdXRQYXJhbWV0ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NGM3ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPdXRwdXRQYXJhbWV0ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi1wdWJsaWMgY2xhc3MgQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZCBleHRlbmRzIEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kIHsKLQlwcml2YXRlIE91dHB1dCBvdXRwdXQ7Ci0JCi0JcHVibGljIEFkZE91dHB1dFBhcmFtZXRlckNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKG9wZXJhdGlvbiwgc3R5bGUpOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUGFydCBwYXJ0ID0gbnVsbDsKLQkJaWYgKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCkgewotCQkJb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsKLQkJCXBhcnQgPSBjcmVhdGVXU0RMQ29tcG9uZW50cyhvcGVyYXRpb24uZ2V0RU91dHB1dCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCUFkZE91dHB1dENvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRPdXRwdXRDb21tYW5kKG9wZXJhdGlvbiwgbnVsbCk7Ci0JCQljb21tYW5kLnJ1bigpOwotCQkJb3V0cHV0ID0gKE91dHB1dCkgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQkJcGFydCA9IGNyZWF0ZVdTRExDb21wb25lbnRzKG91dHB1dCk7Ci0JCX0KLQkJCi0JCW5ld1BhcnQgPSBwYXJ0OwotCQkvLyBDcmVhdGUgbmVjZXNzYXJ5IFhTRCBPYmplY3RzIHN0YXJ0aW5nIHdpdGggdGhlIFBhcnQgcmVmZXJlbmNlCi0JCW5ld1hTREVsZW1lbnQgPSBjcmVhdGVYU0RPYmplY3RzKHBhcnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFub255bW91c1hTREVsZW1lbnRCYXNlTmFtZSgpIHsKLQkJaWYgKG5ld0Fub255bW91c1hTREVsZW1lbnROYW1lID09IG51bGwpIHsKLQkJCWlmICh0aGlzLnN0eWxlID09IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfRUxFTUVOVF9TRVFfRUxFTUVOVCkgewotCQkJCW5ld0Fub255bW91c1hTREVsZW1lbnROYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKSArICJSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdBbm9ueW1vdXNYU0RFbGVtZW50TmFtZSA9IGdldFdTRExQYXJ0TmFtZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbmV3QW5vbnltb3VzWFNERWxlbWVudE5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3WFNERWxlbWVudEJhc2VOYW1lKCkgewotCQlpZiAobmV3WFNERWxlbWVudE5hbWUgPT0gbnVsbCkgewotCQkJbmV3WFNERWxlbWVudE5hbWUgPSAib3V0IjsgLy8kTk9OLU5MUy0xJAotLy8JCQluZXdYU0RFbGVtZW50TmFtZSA9IGdldFdTRExQYXJ0TmFtZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbmV3WFNERWxlbWVudE5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V1NETE1lc3NhZ2VOYW1lKCkgewotCQlpZiAobmV3V1NETE1lc3NhZ2VOYW1lID09IG51bGwpIHsKLQkJCWlmIChvcGVyYXRpb24uZ2V0RU91dHB1dCgpICE9IG51bGwpIHsKLQkJCQluZXdXU0RMTWVzc2FnZU5hbWU9IE5hbWVVdGlsLmdldE1lc3NhZ2VOYW1lKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbmV3V1NETE1lc3NhZ2VOYW1lOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V1NETFBhcnROYW1lKCkgewotCQlpZiAobmV3V1NETFBhcnROYW1lID09IG51bGwpIHsKLQkJCW5ld1dTRExQYXJ0TmFtZSAgPSBOYW1lVXRpbC5nZXRQYXJ0TmFtZShvcGVyYXRpb24uZ2V0RU91dHB1dCgpKTsJCQkKLQkJfQotCQkKLQkJcmV0dXJuIG5ld1dTRExQYXJ0TmFtZTsKLQl9Ci0JCi0JLy8gVE9ETzogcmVtb3ZlIHRoaXMgbWV0aG9kIGFuZCB1c2UgZ2V0TWVzc2FnZVJlZmVyZW5jZSgpIGluc3RlYWQKLQlwdWJsaWMgT3V0cHV0IGdldE91dHB1dCgpIHsKLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2VSZWZlcmVuY2UgZ2V0TWVzc2FnZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBhcnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBhcnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTA4YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQYXJ0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlBhcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRQYXJ0Q29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIE1lc3NhZ2UgbWVzc2FnZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgcHJpdmF0ZSBQYXJ0IHBhcnQ7Ci0gIHByaXZhdGUgUGFydCBvcmlnaW5hbFBhcnQ7Ci0gIAotICBwcml2YXRlIFFOYW1lIHR5cGVPckVsZW1lbnROYW1lOwotICBwcml2YXRlIGJvb2xlYW4gdXNlVHlwZSA9IHRydWU7Ci0KLSAgcHVibGljIEFkZFBhcnRDb21tYW5kCi0JCShNZXNzYWdlIG1lc3NhZ2UsCi0JCSBTdHJpbmcgbmFtZSkKLQl7Ci0JICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0gIAotICBwdWJsaWMgQWRkUGFydENvbW1hbmQKLQkJKE1lc3NhZ2UgbWVzc2FnZSwKLQkJIFN0cmluZyBuYW1lLAotCQkgU3RyaW5nIG5hbWVzcGFjZSwKLQkJIFN0cmluZyBsb2NhbE5hbWUsCi0JCSBib29sZWFuIHVzZVR5cGUpCi0JewotCSAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JICB0aGlzLnVzZVR5cGUgPSB1c2VUeXBlOwotCSAgdHlwZU9yRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLGxvY2FsTmFtZSk7Ci0JfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYSBQYXJ0IGJhc2VkIG9uIHRoZSBnaXZlbiBQYXJ0LiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIFBhcnQuCi0gICAqLwotICBwdWJsaWMgQWRkUGFydENvbW1hbmQKLQkoTWVzc2FnZSBtZXNzYWdlLAotCSBQYXJ0IG9yaWdpbmFsUGFydCwKLQkgU3RyaW5nIG5hbWUpCi0gIHsKLSAgCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIAl0aGlzLm5hbWUgPSBuYW1lOwotICAJdGhpcy5vcmlnaW5hbFBhcnQgPSBvcmlnaW5hbFBhcnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIEFkZFBhcnRDb21tYW5kCi0JCShNZXNzYWdlIG1lc3NhZ2UsCi0JCSBTdHJpbmcgbmFtZSwKLQkJIFN0cmluZyBuYW1lc3BhY2UsCi0JCSBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQkgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JICB0aGlzLm5hbWUgPSBuYW1lOwotCSAgdHlwZU9yRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLGxvY2FsTmFtZSk7Ci0JfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gcGFydDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmICh0eXBlT3JFbGVtZW50TmFtZSA9PSBudWxsKQotICAgICAgdHlwZU9yRWxlbWVudE5hbWUgPSBjcmVhdGVEZWZhdWx0VHlwZU5hbWUoKTsKLSAgICAKLSAgICAvLyBBZGQgbmFtZXNwYWNlIHRvIHRoZSBEZWZpbml0aW9ucyBpZiBpdCBpcyBub3QgdGhlcmUgeWV0LgotICAgIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCk7Ci0gICAgCi0gICAgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgcGFydC5zZXROYW1lKG5hbWUpOwotICAgIAotICAgIGlmIChvcmlnaW5hbFBhcnQgPT0gbnVsbCkgewotICAgIAlpZiAodXNlVHlwZSkKLSAgICAJCXBhcnQuc2V0VHlwZU5hbWUodHlwZU9yRWxlbWVudE5hbWUpOwotICAgIAllbHNlCi0gICAgCQlwYXJ0LnNldEVsZW1lbnROYW1lKHR5cGVPckVsZW1lbnROYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCWlmIChvcmlnaW5hbFBhcnQuZ2V0VHlwZU5hbWUoKSAhPSBudWxsKQotICAgIAkJcGFydC5zZXRUeXBlTmFtZShvcmlnaW5hbFBhcnQuZ2V0VHlwZU5hbWUoKSk7Ci0KLSAgICAJU3RyaW5nIG5ld0VsZW1lbnROYW1lID0gbnVsbDsKLSAgICAJaWYgKG9yaWdpbmFsUGFydC5nZXRFbGVtZW50TmFtZSgpICE9IG51bGwpIHsKLSAgICAJCQotICAgIAkJYm9vbGVhbiBjcmVhdGVOZXdFbGVtZW50ID0gdHJ1ZTsKLSAgICAJCWlmIChvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCAmJiBvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgCQlpZiAoIShvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSURPTU5vZGUpKSB7Ci0gICAgICAgIAkJCWNyZWF0ZU5ld0VsZW1lbnQgPSBmYWxzZTsKLSAgICAgICAgCQl9ICAgICAgICAJCQotICAgIAkJfQotICAgIAkJCi0gICAgCQlpZiAoY3JlYXRlTmV3RWxlbWVudCkgewotICAgIAkJCW5ld0VsZW1lbnROYW1lID0gZ2V0TmV3TmFtZUhlbHBlcihuYW1lLCBvcmlnaW5hbFBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBmYWxzZSk7Ci0gICAgCQkJcGFydC5zZXRFbGVtZW50TmFtZShuZXcgUU5hbWUob3JpZ2luYWxQYXJ0LmdldEVsZW1lbnROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIG5ld0VsZW1lbnROYW1lKSk7Ci0JCi0gICAgCQkJaWYgKG9yaWdpbmFsUGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgIAkJCQlpZiAobmV3RWxlbWVudE5hbWUgPT0gbnVsbCkgewotICAgIAkJCQkJbmV3RWxlbWVudE5hbWUgPSBnZXROZXdOYW1lSGVscGVyKG5hbWUsIG9yaWdpbmFsUGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGZhbHNlKTsKLSAgICAJCQkJfQotICAgIAkJCi0gICAgCQkJCUFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQgZWxlbWVudEFjdGlvbiA9IG5ldyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKG9yaWdpbmFsUGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIG5ld0VsZW1lbnROYW1lKTsKLSAgICAJCQkJZWxlbWVudEFjdGlvbi5ydW4oKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCQllbHNlIHsKLSAgICAJCQlwYXJ0LnNldEVsZW1lbnROYW1lKG5ldyBRTmFtZShvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgb3JpZ2luYWxQYXJ0LmdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICAJCi0gICAgcGFydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAoKFBhcnRJbXBsKXBhcnQpLnJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOyAKLSAgICBtZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbigpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBtZXNzYWdlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoIWRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpLmNvbnRhaW5zVmFsdWUodHlwZU9yRWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgIHsKLSAgICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJwIix0eXBlT3JFbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7IC8vJE5PTi1OTFMtMSQKLS8vICAgICAgKChXU0RMRWxlbWVudEltcGwpZGVmaW5pdGlvbikudXBkYXRlRWxlbWVudChmYWxzZSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFFOYW1lIGNyZWF0ZURlZmF1bHRUeXBlTmFtZSgpCi0gIHsKLSAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCJzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiBxbmFtZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV3TmFtZUhlbHBlcihTdHJpbmcgYmFzZSwgRGVmaW5pdGlvbiBkZWYsIGJvb2xlYW4gaXNUeXBlKQotICB7IAotICAgIFN0cmluZyBuYW1lID0gYmFzZTsgICAgCi0gICAgaW50IGNvdW50ID0gMDsKLQotICAgIC8vIFVnbHkuLi4uICBSZWRvIHRoaXMuLi4KLSAgICAvLyBHZXQgYSBsaXN0IG9mIEVsZW1lbnRzLi4uCi0gICAgTGlzdCBlbGVtZW50TGlzdCA9IG51bGw7Ci0gICAgaWYgKGRlZi5nZXRFVHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgCUxpc3QgeHNkc0xpc3QgPSBkZWYuZ2V0RVR5cGVzKCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIAlpZiAoeHNkc0xpc3QgIT0gbnVsbCkgewotICAgIAkJSXRlcmF0b3IgeHNkc0l0ZXJhdG9yID0geHNkc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAJCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHhzZEVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHhzZHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgCQlYU0RTY2hlbWEgc2NoZW1hID0geHNkRWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICAJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgIAkJCWVsZW1lbnRMaXN0ID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICAKLSAgICBpZiAoZWxlbWVudExpc3QgIT0gbnVsbCkgewotICAgIAlpbnQgaW5kZXggPSAwOwotICAgIAl3aGlsZSAoaW5kZXggPCBlbGVtZW50TGlzdC5zaXplKCkpIHsKLSAgICAJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50TGlzdC5nZXQoaW5kZXgpOwotICAgIAkJCi0gICAgCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKSkpIHsKLSAgICAJCQljb3VudCsrOwotICAgIAkJCW5hbWUgPSBuYW1lICsgY291bnQ7Ci0gICAgCQkJaW5kZXggPSAwOwotICAgIAkJfQotICAgIAkJZWxzZSB7Ci0gICAgCQkJaW5kZXgrKzsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLQotICAgIHJldHVybiBuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBvcnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBvcnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjY5MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkUG9ydENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgUG9ydCBwb3J0OwotICAKLSAgcHVibGljIEFkZFBvcnRDb21tYW5kCi0JCShTZXJ2aWNlIHNlcnZpY2UsCi0JCSBTdHJpbmcgbmFtZSkKLQl7Ci0JICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBwb3J0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHBvcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydCgpOwotICAgIHBvcnQuc2V0TmFtZShuYW1lKTsKLSAgICBwb3J0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oc2VydmljZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIHNlcnZpY2UuYWRkUG9ydChwb3J0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0VHlwZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUG9ydFR5cGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmZlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRQb3J0VHlwZUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBQb3J0VHlwZSBwb3J0VHlwZTsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVPcGVyYXRpb24gPSBmYWxzZTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9PUEVSQVRJT05fTkFNRSA9ICJOZXdPcGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFBvcnRUeXBlQ29tbWFuZAotCQkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAgCi0JCSBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQl9Ci0KLSAgcHVibGljIEFkZFBvcnRUeXBlQ29tbWFuZAotCQkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAKLQkJIFN0cmluZyBsb2NhbE5hbWUsCi0JCSBib29sZWFuIGNyZWF0ZU9wZXJhdGlvbikKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JICB0aGlzLmNyZWF0ZU9wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbjsKLQl9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLldTRExFbGVtZW50QWN0aW9uI2dldFdTRExFbGVtZW50KCkKLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gcG9ydFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgcG9ydFR5cGUgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICBwb3J0VHlwZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSxsb2NhbE5hbWUpKTsKLSAgICBwb3J0VHlwZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgIAotICAgIGlmIChjcmVhdGVPcGVyYXRpb24pCi0gICAgewotICAgICAgQWRkT3BlcmF0aW9uQ29tbWFuZCBjb21tYW5kID0gCi0gICAgICAgIG5ldyBBZGRPcGVyYXRpb25Db21tYW5kKHBvcnRUeXBlLERFRkFVTFRfT1BFUkFUSU9OX05BTUUsdHJ1ZSx0cnVlLGZhbHNlKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBsb2NhbE5hbWUgPSBuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFNlcnZpY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFNlcnZpY2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NWNmMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRTZXJ2aWNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkU2VydmljZUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlUG9ydCA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1BPUlRfTkFNRSA9ICJOZXdQb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBBZGRTZXJ2aWNlQ29tbWFuZAotCQkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAgCi0JCSBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQl9Ci0KLQlwdWJsaWMgQWRkU2VydmljZUNvbW1hbmQKLQkJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgCi0JCSBTdHJpbmcgbG9jYWxOYW1lLAotCQkgYm9vbGVhbiBjcmVhdGVQb3J0KQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQkgIHRoaXMuY3JlYXRlUG9ydCA9IGNyZWF0ZVBvcnQ7Ci0JfQotCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBzZXJ2aWNlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICBzZXJ2aWNlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLGxvY2FsTmFtZSkpOwotICAgIHNlcnZpY2Uuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgCi0gICAgaWYgKGNyZWF0ZVBvcnQpCi0gICAgewotICAgICAgQWRkUG9ydENvbW1hbmQgY29tbWFuZCA9IAotICAgICAgICBuZXcgQWRkUG9ydENvbW1hbmQoc2VydmljZSxERUZBVUxUX1BPUlRfTkFNRSk7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgbG9jYWxOYW1lID0gbmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRUeXBlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVHlwZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2U1OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRUeXBlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLS8vIERlZmluaXRpb24gbXVzdCBub3QgaGF2ZSAidHlwZXMiIGVsZW1lbnQgdG8gcnVuIHRoaXMgY29tbWFuZC4KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRUeXBlc0NvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgVHlwZXMgdHlwZXM7Ci0gIAotICBwdWJsaWMgQWRkVHlwZXNDb21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gIAlpZiAoKHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSkgIT0gbnVsbCkKLSAgICAgIHJldHVybjsgLy8gInR5cGVzIiBhbHJlYWR5IGV4aXN0cy4KLSAgCQotICAgIHR5cGVzID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVzKCk7Ci0gICAgdHlwZXMuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLnNldFR5cGVzKHR5cGVzKTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiB0eXBlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0ODdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRXh0ZW5zaWJsZUVsZW1lbnQgZXh0ZW5zaWJsZUVsZW1lbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lOwotICBwcml2YXRlIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgcHJpdmF0ZSBNYXAgcHJvcGVydGllczsKLSAKLSAgcHVibGljIEFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQKLSAgICAoRXh0ZW5zaWJsZUVsZW1lbnQgZXh0ZW5zaWJsZUVsZW1lbnQsIAotICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgdGhpcy5leHRlbnNpYmxlRWxlbWVudCA9IGV4dGVuc2libGVFbGVtZW50OwotICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgQWRkVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZAotICAgIChFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCwgCi0gICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgIE1hcCBwcm9wZXJ0aWVzKQotICB7Ci0gICAgdGhpcy5leHRlbnNpYmxlRWxlbWVudCA9IGV4dGVuc2libGVFbGVtZW50OwotICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gIAlleHRlbnNpYmlsaXR5RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgCWV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnRUeXBlKG5ldyBRTmFtZShuYW1lc3BhY2VVUkksbG9jYWxOYW1lKSk7Ci0gIAkKLSAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSBudWxsOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgIAllbnRyeSA9IChNYXAuRW50cnkpaXRlcmF0b3IubmV4dCgpOwotICAgICAgCVN0cmluZyBhdHRyaWJ1dGUgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotICAgICAgCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsgICAgICAJCi0gICAgICAJKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKWV4dGVuc2liaWxpdHlFbGVtZW50KS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIAlleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGV4dGVuc2libGVFbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gIAlleHRlbnNpYmxlRWxlbWVudC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTRlNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi0KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uIGluIHRoZSB0YXJnZXROYW1lc3BhY2UuCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotICBwcml2YXRlIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50OwotICAKLSAgLyoqCi0gICAqIFRPRE86Ci0gICAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcHJvYmxlbSBoZXJlLi4uLiAgV2hhdCBpZiB0aGUgZGVmaW5pdGlvbiB0YXJnZXRuYW1lc3BhY2UgaXMgbnVsbC4uLi4KLSAgICovCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogVXNlIEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gICAqLwotICBwdWJsaWMgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZAotICAgIChEZWZpbml0aW9uIGRlZmluaXRpb24sIAotICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCAKLSAgICAgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFNjaGVtYSgpOwotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IAotICAgICAgWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgZWxlbWVudERlY2wuc2V0TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgCi0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZURlZmluaXRpb24gPSBnZXRYU0RTdHJpbmdUeXBlKHhzZFNjaGVtYSk7Ci0gICAgZWxlbWVudERlY2wuc2V0VHlwZURlZmluaXRpb24oc2ltcGxlVHlwZURlZmluaXRpb24pOyAgICAKLSAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZWxlbWVudERlY2wpOwotICAgIAotICAgIHhzZEVsZW1lbnQgPSBlbGVtZW50RGVjbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKFN0cmluZyBuZXdFbGVtZW50TmFtZSkgewotICAJZWxlbWVudE5hbWUgPSBuZXdFbGVtZW50TmFtZTsKLSAgCXJ1bigpOwotICB9Ci0gIAotICAvKgotICAgKiBTcGVjaWZ5IHdoaWNoIFNjaGVtYSB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgVHlwZS4KLSAgICogQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgY2FsbGluZyBydW4oKS4gIE90aGVyd2lzZSBpdCB3aWxsIHVzZSB0aGUgZmlyc3QKLSAgICogU2NoZW1hIGl0IGZpbmRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpIHsKLSAgCXRoaXMuc2NoZW1hID0gc2NoZW1hOwotICB9Ci0gIAotICAvKgotICAgKiBSZXR1cm4gdGhlIFNjaGVtYSB1c2VkIHRvIGNyZWF0ZSB0aGUgVHlwZQotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0gIAlpZiAoc2NoZW1hID09IG51bGwpIHsKLSAgCQlyZXR1cm4gZ2V0WFNEU2NoZW1hKHRhcmdldE5hbWVzcGFjZSk7Ci0gIAl9Ci0gIAllbHNlIHsKLSAgCQlyZXR1cm4gc2NoZW1hOwotICAJfQotICB9Ci0gIAotICBwcml2YXRlIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldFhTRFN0cmluZ1R5cGUoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHJldHVybiBzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwcml2YXRlIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gICAgCi0gICAgLy8gRG8gd2UgaGF2ZSBhIHNjaGVtYSBhbHJlYWR5PwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0VHlwZXMoKS5nZXRTY2hlbWFzKHRhcmdldE5hbWVzcGFjZSkuaXRlcmF0b3IoKTsKLSAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpaXRlcmF0b3IubmV4dCgpOyAvLyBHZXQgdGhlIGZpcnN0IG9uZS4KLSAgICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CSAgICAKLSAgICAgIC8vIENyZWF0ZSBhIG5ldyBzY2hlbWEgYmVjYXVzZSB0aGVyZSdzIG5vbmUuCi0gICAgICBBZGRYU0RTY2hlbWFDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNEU2NoZW1hQ29tbWFuZChkZWZpbml0aW9uLHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgICAgcmV0dXJuICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKS5nZXRTY2hlbWEoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgVHlwZXMgZ2V0VHlwZXMoKQotICB7Ci0gICAgLy8gVHlwZXMgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0gICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpZGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgcmV0dXJuIHR5cGVzOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBBZGRUeXBlc0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRUeXBlc0NvbW1hbmQoZGVmaW5pdGlvbik7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgICAgcmV0dXJuIChUeXBlcyljb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudCgpCi0gIHsKLQkgIHJldHVybiB4c2RFbGVtZW50OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RTY2hlbWFDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFhTRFNjaGVtYUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3OTE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFhTRFNjaGVtYUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RTY2hlbWFDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50OwotICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIAotICBwdWJsaWMgQWRkWFNEU2NoZW1hQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTRFNjaGVtYUNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgeyAgICAKLSAgICBleHRlbnNpYmlsaXR5RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIGV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gCi0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgIHhzZFNjaGVtYS5zZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgieHNkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB4c2RTY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgLy8gQ2hvb3NlIHRoZSBwcmVmaXggQ2hvb3NlIHRoZSBwcmVmaXggdXNlZCBmb3IgdGhpcyBzY2hlbWEncyBuYW1lc3BhY2UgYW5kIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSdzIG5hbWVzcGFjZS4KLSAgICAvLyAgICAKLSAgICBqYXZhLnV0aWwuTWFwIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAgPSB4c2RTY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotLy8gICAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcC5wdXQoInAiLCB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0Ci0JICAoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCksb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAKLSAgICAvLyBUQkQgLSBDaGVjayBpZiBtdWx0aXBsZSBzY2hlbWFzIHdpdGggdGhlIHNhbWUgdGFyZ2V0TmFtZXNwYWNlIGNhbiBjby1leGlzdC4KLSAgICBUeXBlcyB0eXBlcyA9IGdldFR5cGVzKCk7Ci0gICAgdHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIAotICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpID09IG51bGwpIHsKLSAgICAJZGVmaW5pdGlvbi5zZXRFVHlwZXModHlwZXMpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgVHlwZXMgZ2V0VHlwZXMoKQotICB7Ci0gICAgLy8gVHlwZXMgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcylkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICByZXR1cm4gdHlwZXM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdHlwZXMgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZXMoKTsKLSAgICAgICAgdHlwZXMuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgcmV0dXJuIHR5cGVzOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDdjZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IFhTRFR5cGVEZWZpbml0aW9uIGluIHRoZSB0YXJnZXROYW1lc3BhY2UuCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIHByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotICBwcml2YXRlIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByaXZhdGUgWFNEVHlwZURlZmluaXRpb24geHNkVHlwZTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxleFR5cGUgPSB0cnVlOwotICAKLSAgLyoqCi0gICAqIFRPRE86Ci0gICAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcHJvYmxlbSBoZXJlLi4uLiAgV2hhdCBpZiB0aGUgZGVmaW5pdGlvbiB0YXJnZXRuYW1lc3BhY2UgaXMgbnVsbC4uLi4KLSAgICovCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUsIGJvb2xlYW4gaXNDb21wbGV4VHlwZSkKLSAgewotICAJdGhpcyhkZWZpbml0aW9uLCB0eXBlTmFtZSk7Ci0gIAl0aGlzLmlzQ29tcGxleFR5cGUgPSBpc0NvbXBsZXhUeXBlOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogVXNlIEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgICovCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQKLSAgICAoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAKLSAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZjsKLSAgICAKLSAgICBpZiAoaXNDb21wbGV4VHlwZSkgewotICAgIAl0eXBlRGVmID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgIAl0eXBlRGVmID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgdHlwZURlZi5zZXROYW1lKHR5cGVOYW1lKTsKLSAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQodHlwZURlZik7Ci0gICAgCi0gICAgeHNkVHlwZSA9IHR5cGVEZWY7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgbmV3VHlwZU5hbWUpIHsKLSAgCXR5cGVOYW1lID0gbmV3VHlwZU5hbWU7Ci0gIAlydW4oKTsKLSAgfQotICAKLSAgLyoKLSAgICogU3BlY2lmaXkgaWYgd2Ugc2hvdWxkIGNyZWF0ZSBhIGNvbXBsZXggb3Igc2ltcGxlIHR5cGUuICBUaGlzIHNob3VsZCBzaG91bGQgYmUKLSAgICogY2FsbGVkIGJlZm9yZSBydW4oKS4KLSAgICogT3ZlcnJpZGVzIHRoZSB2YWx1ZSBzZXQgd2hlbiB0aGUgY29uc3RydWN0b3IKLSAgICogQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHR5cGVOYW1lLCBib29sZWFuIGlzQ29tcGxleFR5cGUpCi0gICAqIGlzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpc0NvbXBsZXhUeXBlKGJvb2xlYW4gaXNDb21wbGV4VHlwZSkgewotICAJdGhpcy5pc0NvbXBsZXhUeXBlID0gaXNDb21wbGV4VHlwZTsKLSAgfQotICAKLSAgLyoKLSAgICogU3BlY2lmeSB3aGljaCBTY2hlbWEgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIFR5cGUuCi0gICAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGNhbGxpbmcgcnVuKCkuICBPdGhlcndpc2UgaXQgd2lsbCB1c2UgdGhlIGZpcnN0Ci0gICAqIFNjaGVtYSBpdCBmaW5kcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKSB7Ci0gIAl0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgLyoKLSAgICogUmV0dXJuIHRoZSBTY2hlbWEgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGUKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkgewotICAJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0gIAkJcmV0dXJuIGdldFhTRFNjaGVtYSh0YXJnZXROYW1lc3BhY2UpOwotICAJfQotICAJZWxzZSB7Ci0gIAkJcmV0dXJuIHNjaGVtYTsKLSAgCX0KLSAgfQotCi0gIHByaXZhdGUgWFNEU2NoZW1hIGdldFhTRFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgICAKLSAgICAvLyBEbyB3ZSBoYXZlIGEgc2NoZW1hIGFscmVhZHk/Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRUeXBlcygpLmdldFNjaGVtYXModGFyZ2V0TmFtZXNwYWNlKS5pdGVyYXRvcigpOwotICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7IC8vIEdldCB0aGUgZmlyc3Qgb25lLgotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsJICAgIAotICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNjaGVtYSBiZWNhdXNlIHRoZXJlJ3Mgbm9uZS4KLSAgICAgIEFkZFhTRFNjaGVtYUNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTY2hlbWFDb21tYW5kKGRlZmluaXRpb24sdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCljb21tYW5kLmdldFdTRExFbGVtZW50KCkpLmdldFNjaGVtYSgpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBUeXBlcyBnZXRUeXBlcygpCi0gIHsKLSAgICAvLyBUeXBlcyBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcylkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICByZXR1cm4gdHlwZXM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEFkZFR5cGVzQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFR5cGVzQ29tbWFuZChkZWZpbml0aW9uKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKFR5cGVzKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTREVsZW1lbnQoKQotICB7Ci0JICByZXR1cm4geHNkVHlwZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvV1NETEVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL1dTRExFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE4MDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvV1NETEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwdWJsaWMgYWJzdHJhY3QgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKTsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0TmFtZXNwYWNlc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDRlYmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0TmFtZXNwYWNlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZzsKLQotcHVibGljIGNsYXNzIEVkaXROYW1lc3BhY2VzRGlhbG9nIGV4dGVuZHMgRGlhbG9nCi17Ci0gIHByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgcHJvdGVjdGVkIENvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2cgZWRpdFdTRExOYW1lc3BhY2VzQ29udHJvbDsKLSAgcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0gIC8vICBwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0gIC8vICBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsgIAotCi0gIC8vcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCi0gIHB1YmxpYyBFZGl0TmFtZXNwYWNlc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBMaXN0IG5hbWVzcGFjZUxpc3QpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLSAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB0aGlzLm5hbWVzcGFjZUluZm9MaXN0ID0gbmFtZXNwYWNlTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpCi0gIHsKLSAgICBjcmVhdGUoKTsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotICAgIHNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIHJldHVybiBvcGVuKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICB1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIG9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0gICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sID0gbmV3IENvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2coZGlhbG9nQXJlYSwgcmVzb3VyY2VMb2NhdGlvbik7Ci0gICAgZWRpdFdTRExOYW1lc3BhY2VzQ29udHJvbC5zZXROYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgZWRpdFdTRExOYW1lc3BhY2VzQ29udHJvbC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgIHJldHVybiBkaWFsb2dBcmVhOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICB7Ci0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpCi0gIHsKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICAvKgotICAgIFN0cmluZyBuYW1lID0gbmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9IGNvbXB1dGVFcnJvck1lc3NhZ2UobmFtZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvck1lc3NhZ2UgPSAiIjsKLSAgICB9Ki8KLQotICAgIC8vZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsKLSAgICBva0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKQotICB7Ci0gICAgaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgewotICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gZWRpdFdTRExOYW1lc3BhY2VzQ29udHJvbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvR2VuZXJhdGVCaW5kaW5nT25TYXZlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvR2VuZXJhdGVCaW5kaW5nT25TYXZlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NTU5MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL0dlbmVyYXRlQmluZGluZ09uU2F2ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUJpbmRpbmdPblNhdmVEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkaWFsb2dUaXRsZSA9IE1lc3NhZ2VzLl9VSV9SRUdFTl9CSU5ESU5EU19PTl9TQVZFOwkJLy8gVE9ETzogVHJhbnNsYXRpb25zIG5lZWRlZC4uLi4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkaWFsb2dNZXNzYWdlID0gTWVzc2FnZXMuX1VJX1JFR0VOX0JJTkRJTkdTX09OX1NBVkVfUVVFU1RJT05NQVJLOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gYnV0dG9ucyA9IG5ldyBTdHJpbmdbXXtNZXNzYWdlcy5fVUlfWUVTX0xBQkVMLCBNZXNzYWdlcy5fVUlfTk9fTEFCRUwsIE1lc3NhZ2VzLl9VSV9DQU5DRUxfTEFCRUx9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQotCXByaXZhdGUgQnV0dG9uIHJlbWVtYmVyRGVjaXNpb25Cb3g7Ci0JcHJpdmF0ZSBib29sZWFuIHJlbWVtYmVyRGVjaXNpb24gPSBmYWxzZTsKLQkKLQlwdWJsaWMgR2VuZXJhdGVCaW5kaW5nT25TYXZlRGlhbG9nKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKHNoZWxsLCBkaWFsb2dUaXRsZSwgbnVsbCwgZGlhbG9nTWVzc2FnZSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgYnV0dG9ucywgMCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQljb21wLnNldERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkKLQkJLy8gU3BhY2VyCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCQotCQlyZW1lbWJlckRlY2lzaW9uQm94ID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlyZW1lbWJlckRlY2lzaW9uQm94LnNldFRleHQoTWVzc2FnZXMuX1VJX1JFTUVNQkVSX01ZX0RFQ0lTSU9OX0xBQkVMKTsKLQkJcmVtZW1iZXJEZWNpc2lvbkJveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3RvcmVQcm9tcHRQcmVmZXJlbmNlKGludCBzd3RWYWx1ZSkgewotCQkvLyBTdG9yZSB0aGUgbmV3IHByZWZlcmVuY2UgZm9yIGRpc3BsYXlpbmcgdGhpcyBkaWFsb2cuCi0JCWlmIChyZW1lbWJlckRlY2lzaW9uKSB7Ci0JCQlXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShNZXNzYWdlcy5fVUlfUFJFRl9QQUdFX1BST01QVF9SRUdFTl9CSU5ESU5HX09OX1NBVkUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJCVN0cmluZyBnZW5lcmF0ZUlEID0gTWVzc2FnZXMuX1VJX1BSRUZfUEFHRV9BVVRPX1JFR0VORVJBVEVfQklORElORzsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHN3dFZhbHVlID09IFNXVC5ZRVMpIHsKLQkJCQlXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShnZW5lcmF0ZUlELCB0cnVlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN3dFZhbHVlID09IFNXVC5OTykgewotCQkJCVdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKGdlbmVyYXRlSUQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWludCByVmFsdWUgPSBzdXBlci5vcGVuKCk7Ci0JCQotCQlpZiAoclZhbHVlID09MCkgewotCQkJc3RvcmVQcm9tcHRQcmVmZXJlbmNlKFNXVC5ZRVMpOwotCQkJcmV0dXJuIFNXVC5ZRVM7Ci0JCX0KLQkJZWxzZSBpZiAoclZhbHVlID09IDEpIHsKLQkJCXN0b3JlUHJvbXB0UHJlZmVyZW5jZShTV1QuTk8pOwotCQkJcmV0dXJuIFNXVC5OTzsKLQkJfQotCQllbHNlIGlmIChyVmFsdWUgPT0gMikgewotCQkJc3RvcmVQcm9tcHRQcmVmZXJlbmNlKFNXVC5DQU5DRUwpOwotCQkJcmV0dXJuIFNXVC5DQU5DRUw7Ci0JCX0KLQkJCi0JCXJldHVybiByVmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHJlbWVtYmVyRGVjaXNpb25Cb3gpIHsKLQkJCXJlbWVtYmVyRGVjaXNpb24gPSByZW1lbWJlckRlY2lzaW9uQm94LmdldFNlbGVjdGlvbigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjczNjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdDb21wb25lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5ld0NvbXBvbmVudERpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVGaWVsZDsgCi0gIHByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotICBwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0gIHByb3RlY3RlZCBMaXN0IHVzZWROYW1lczsKLQotICBwdWJsaWMgTmV3Q29tcG9uZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSkgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICBuYW1lID0gZGVmYXVsdE5hbWU7ICAgICAgCi0gICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICB9Ci0gIAotICBwdWJsaWMgTmV3Q29tcG9uZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpIAotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgbmFtZSA9IGRlZmF1bHROYW1lOyAgICAgIAotICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB0aGlzLnVzZWROYW1lcyA9IHVzZWROYW1lczsKLSAgfQotCi0gIHB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpCi0gIHsKLSAgICBjcmVhdGUoKTsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotICAgIHNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIHJldHVybiBvcGVuKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAgCi0gIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIG5hbWVGaWVsZC5mb3JjZUZvY3VzKCk7Ci0gICAgbmFtZUZpZWxkLnNlbGVjdEFsbCgpOyAgCi0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlSGVhZGVyQ29udGVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkQ29udGVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAKLSAgICBjcmVhdGVIZWFkZXJDb250ZW50KGRpYWxvZ0FyZWEpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBnZEZpbGw9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkRmlsbC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkRmlsbC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGdkRmlsbC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2RGaWxsKTsKLQotICAgIExhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBuYW1lTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIG5hbWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMjAwOwotICAgIG5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBuYW1lRmllbGQuc2V0VGV4dChuYW1lKTsKLSAgICBuYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLSAgICBjcmVhdGVFeHRlbmRlZENvbnRlbnQoZGlhbG9nQXJlYSk7Ci0KLSAgICAvLyBlcnJvciBtZXNzYWdlCi0gICAgZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoImVycm9yIG1lc3NhZ2UgZ29lcyBoZXJlIik7ICAgICAgICAgCi0gICAgR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QyLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2QyLndpZHRoSGludCA9IDIwMDsKLSAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkMik7ICAgICAgICAgIAotLy8gICAgQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotLy8gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLSAgICByZXR1cm4gZGlhbG9nQXJlYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHVwZGF0ZUVycm9yTWVzc2FnZSgpOwotICB9ICAgICAgICAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoU3RyaW5nIG5hbWUpCi0gIHsKLSAgCWlmICh1c2VkTmFtZXMgPT0gbnVsbCkKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCQotICAJSXRlcmF0b3IgaXRlcmF0b3IgPSB1c2VkTmFtZXMuaXRlcmF0b3IoKTsKLSAgCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSkpIHsKLSAgCQkJcmV0dXJuIE1lc3NhZ2VzLl9VSV9MQUJFTF9XQVJOSU5HX0RVUExJQ0FURV9OQU1FX0VYSVNUUzsgLy8kTk9OLU5MUy0xJAotICAJCX0KLSAgCX0KLSAgCQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVycm9yTWVzc2FnZSA9IGNvbXB1dGVFcnJvck1lc3NhZ2UobmFtZSk7Ci0gICAgfSAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0gIAotICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLS8vICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSAKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvUHJvdG9jb2xDb21wb25lbnRDb250cm9sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvUHJvdG9jb2xDb21wb25lbnRDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjMxZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL1Byb3RvY29sQ29tcG9uZW50Q29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkJhc2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkNvbnRlbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLmV4dGVuc2lvbi5Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkcy5Db250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm90b2NvbENvbXBvbmVudENvbnRyb2wgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIEJhc2VHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCi0gIHByb3RlY3RlZCBUZXh0IGNvbXBvbmVudE5hbWVGaWVsZDsKLSAgcHJvdGVjdGVkIENvbWJvIHJlZk5hbWVDb21ibzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiByZWZCcm93c2VCdXR0b247Ci0gIHByb3RlY3RlZCBDb21ibyBwcm90b2NvbENvbWJvOwotICBwcm90ZWN0ZWQgQnV0dG9uIG92ZXJ3cml0ZUJ1dHRvbjsKLSAgcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGVtcHR5U2V0dGluZ3NQYWdlOwotICBwcm90ZWN0ZWQgTWFwIHBhZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8vIExpc3Qgb2YgQ29udGVudEdlbmVyYXRvcnMgZm9yIGVhY2ggUHJvdG9jb2wgZm91bmQgaW4gcHJvdG9jb2xDb21ibwotICBwcm90ZWN0ZWQgTGlzdCBjb250ZW50R2VuZXJhdG9yczsKLSAgCi0gIC8vcHJvdGVjdGVkIGJvb2xlYW4gaXNCaW5kaW5nQ29tcG9uZW50ID0gdHJ1ZTsKLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0NvbXBvbmVudCA9IHRydWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyByZWZOYW1lOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgVU5TUEVDSUZJRUQgPSBNZXNzYWdlcy5fVUlfVU5TUEVDSUZJRUQ7IC8vJE5PTi1OTFMtMSQKLSAgLy9wcm90ZWN0ZWQgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yOwotCi0gIHB1YmxpYyBQcm90b2NvbENvbXBvbmVudENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgQmFzZUdlbmVyYXRvciBnZW5lcmF0b3IsIGJvb2xlYW4gc2hvd092ZXJ3cml0ZUJ1dHRvbikKLSAgewotICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCWNvbnRlbnRHZW5lcmF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgc2V0TGF5b3V0RGF0YShjcmVhdGVHcmlkRGF0YSh0cnVlLCAxKSk7Ci0KLSAgICBDb21wb3NpdGUgbGFiZWxWYWx1ZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotICAgIGxhYmVsVmFsdWVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0gICAgbGFiZWxWYWx1ZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKGZhbHNlLCAxKSk7Ci0KLSAgICAvLyByb3cgMQotICAgIC8vCi0gICAgTGFiZWwgY29tcG9uZW50TmFtZUxhYmVsID0gbmV3IExhYmVsKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBjb21wb25lbnROYW1lTGFiZWwuc2V0VGV4dChnZXRDb21wb25lbnROYW1lTGFiZWxUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICBjb21wb25lbnROYW1lRmllbGQgPSBuZXcgVGV4dChsYWJlbFZhbHVlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBnZE5hbWU9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkTmFtZS5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkTmFtZS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGNvbXBvbmVudE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkTmFtZSk7Ci0gICAgY29tcG9uZW50TmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9uZW50TmFtZUZpZWxkLCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPVE9DT0xfQ09NUE9ORU5UX05BTUVfVEVYVCk7Ci0gICAgLy9jcmVhdGVQbGFjZUhvbGRlcihsYWJlbFZhbHVlQ29tcG9zaXRlKTsKLSAgICAKLSAgICAvLyByb3cgMgotICAgIC8vCi0gICAgTGFiZWwgcmVmTmFtZUxhYmVsID0gbmV3IExhYmVsKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICByZWZOYW1lTGFiZWwuc2V0VGV4dChnZXRSZWZOYW1lTGFiZWxUZXh0KCkpOyAvLyROT04tTkxTLTEkCQotICAgIHJlZk5hbWVDb21ibyA9IG5ldyBDb21ibyhsYWJlbFZhbHVlQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBHcmlkRGF0YSBnZFJlZk5hbWU9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkUmVmTmFtZS5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkUmVmTmFtZS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHJlZk5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdkUmVmTmFtZSk7Ci0gICAgcmVmTmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVmTmFtZUNvbWJvLCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPVE9DT0xfQ09NUE9ORU5UX1JFRl9DT01CTyk7Ci0KLSAgICAvL3JlZkJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24obGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIC8vcmVmQnJvd3NlQnV0dG9uLnNldFRleHQoIiAgLi4uICAiKTsKLSAgICAvL0dyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgLy9nZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgLy9nZC5oZWlnaHRIaW50ID0gMTc7Ci0gICAgLy9nZC53aWR0aEhpbnQgPSAyNDsKLSAgICAvL3JlZkJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAvL3JlZkJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAvL2NyZWF0ZVBsYWNlSG9sZGVyKGxhYmVsVmFsdWVDb21wb3NpdGUpOwotCi0gICAgLy8gcm93IDMKLSAgICAvLwotICAgIExhYmVsIHByb3RvY29sTGFiZWwgPSBuZXcgTGFiZWwobGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHByb3RvY29sTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQklORElOR19QUk9UT0NPTCk7IC8vJE5PTi1OTFMtMSQKLSAgICBwcm90b2NvbENvbWJvID0gbmV3IENvbWJvKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotICAgIEdyaWREYXRhIGdkUHJvdG9jb2w9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkUHJvdG9jb2wuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZFByb3RvY29sLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgcHJvdG9jb2xDb21iby5zZXRMYXlvdXREYXRhKGdkUHJvdG9jb2wpOwotICAgIHByb3RvY29sQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm90b2NvbENvbWJvLCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPVE9DT0xfQ09NUE9ORU5UX1BST1RPQ09MX0NPTUJPKTsKLSAgICAvL2NyZWF0ZVBsYWNlSG9sZGVyKGxhYmVsVmFsdWVDb21wb3NpdGUpOwotCi0gICAgLy8gb3B0aW9uYWwgb3ZlcndyaXRlIGJ1dHRvbgotICAgIC8vCi0gICAgaWYgKHNob3dPdmVyd3JpdGVCdXR0b24pCi0gICAgewotICAgICAgb3ZlcndyaXRlQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotICAgICAgb3ZlcndyaXRlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0NIRUNLQk9YX09WRVJXUklURSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAob3ZlcndyaXRlQnV0dG9uLCBBU0RFZGl0b3JDU0hlbHBJZHMucFJPVE9DT0xfQ09NUE9ORU5UX09WRVJXUklURV9DSEVDS0JPWCk7Ci0gICAgfQotCi0gICAgLy8gcHJvdG9jb2wgc3BlY2lmaWMgc2V0dGluZ3MKLSAgICAvLwotICAgIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMsIFNXVC5OT05FKTsKLSAgICBHcmlkRGF0YSBnZEZpbGw9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkRmlsbC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkRmlsbC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGdkRmlsbC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgcGFnZUJvb2suc2V0TGF5b3V0RGF0YShnZEZpbGwpOwotCi0gICAgZW1wdHlTZXR0aW5nc1BhZ2UgPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgewotICAgICAgbmV3IExhYmVsKGVtcHR5U2V0dGluZ3NQYWdlLCBTV1QuTk9ORSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdEZpZWxkcygpCi0gIHsKLSAgICAvLyBwcmltZSB0aGUgZmllbGRzCi0gICAgLy8KLSAgICBjb21wb25lbnROYW1lRmllbGQuc2V0VGV4dChnZXREZWZhdWx0TmFtZSgpKTsKLSAgICB1cGRhdGVSZWZOYW1lQ29tYm8oKTsKLSAgICB1cGRhdGVQcm90b2NvbENvbWJvKCk7Ci0gICAgdXBkYXRlUGFnZUJvb2soZ2VuZXJhdG9yLmdldFByb3RvY29sKCkpOwotICB9Ci0KLSAgcHVibGljIFRleHQgZ2V0Q29tcG9uZW50TmFtZUZpZWxkKCkKLSAgewotICAgIHJldHVybiBjb21wb25lbnROYW1lRmllbGQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWVMYWJlbFRleHQoKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcml2YXRlIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKGJvb2xlYW4gYm90aCwgaW50IHNwYW4pCi0gIHsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShib3RoID8gR3JpZERhdGEuRklMTF9CT1RIIDogR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0gICAgcmV0dXJuIGdkOwotICB9Ci0KLS8vICBwcml2YXRlIENvbnRyb2wgY3JlYXRlUGxhY2VIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkKLS8vICB7Ci0vLyAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLS8vICAgIHJldHVybiBsYWJlbDsKLS8vICB9Ci0gIHB1YmxpYyBCYXNlR2VuZXJhdG9yIGdldEdlbmVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gZ2VuZXJhdG9yOwotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICAvLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBvdmVyd3JpdGVCdXR0b24gJiYgb3ZlcndyaXRlQnV0dG9uICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSByZWZOYW1lQ29tYm8pCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcmVmTmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBTdHJpbmcgcmVmTmFtZSA9IHJlZk5hbWVDb21iby5nZXRJdGVtKGluZGV4KTsKLQkgIGlmIChyZWZOYW1lLmVxdWFscyhVTlNQRUNJRklFRCkpIHsKLQkgICAgICBnZXRHZW5lcmF0b3IoKS5zZXRSZWZOYW1lKCIiKTsgLy8kTk9OLU5MUy0xJAotCSAgfQotCSAgZWxzZSB7Ci0JICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0UmVmTmFtZShyZWZOYW1lKTsKLQkgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHByb3RvY29sQ29tYm8pCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcHJvdG9jb2xDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgU3RyaW5nIHByb3RvY29sID0gKGluZGV4ICE9IC0xKSA/IHByb3RvY29sQ29tYm8uZ2V0SXRlbShpbmRleCkgOiBudWxsOwotCSAgZ2V0R2VuZXJhdG9yKCkuc2V0Q29udGVudEdlbmVyYXRvcigoQ29udGVudEdlbmVyYXRvcikgY29udGVudEdlbmVyYXRvcnMuZ2V0KGluZGV4KSk7Ci0gICAgICB1cGRhdGVQYWdlQm9vayhwcm90b2NvbCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTX09WRVJXUklURV9BUFBMSUNBQkxFID0gIklTX09WRVJXUklURV9BUFBMSUNBQkxFIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlQm9vayhTdHJpbmcgcHJvdG9jb2wpCi0gIHsKLSAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkKLSAgICB7Ci0JICBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UgcGFnZSA9IChDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UpIHBhZ2VNYXAuZ2V0KHByb3RvY29sKTsKLSAgICAgIGlmIChwYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBhZ2UgPSBjcmVhdGVDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UocHJvdG9jb2wpOwotCi0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBwYWdlLmluaXQoZ2V0R2VuZXJhdG9yKCkpOwotICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IHBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQm9vayk7Ci0gICAgICAgICAgY29udHJvbC5zZXREYXRhKElTX09WRVJXUklURV9BUFBMSUNBQkxFLCBuZXcgQm9vbGVhbihwYWdlLmlzT3ZlcndyaXRlQXBwbGljYWJsZSgpKSk7Ci0gICAgICAgICAgcGFnZU1hcC5wdXQocHJvdG9jb2wsIHBhZ2UpOwotICAgICAgICB9Ci0KLS8vICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHBhZ2VNYXAucHV0KHByb3RvY29sLCBwYWdlKTsKLS8vICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGJvb2xlYW4gZW5hYmxlT3ZlcndyaXRlQnV0dG9uID0gdHJ1ZTsKLSAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChvdmVyd3JpdGVCdXR0b24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEJvb2xlYW4gZGF0YSA9IChCb29sZWFuKSBwYWdlLmdldENvbnRyb2woKS5nZXREYXRhKElTX09WRVJXUklURV9BUFBMSUNBQkxFKTsKLSAgICAgICAgICBlbmFibGVPdmVyd3JpdGVCdXR0b24gPSBkYXRhID09IG51bGwgfHwgZGF0YS5lcXVhbHMoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBwYWdlQm9vay5zaG93UGFnZShwYWdlLmdldENvbnRyb2woKSk7Ci0gICAgICAgIHBhZ2VCb29rLmxheW91dCgpOwotICAgICAgICBwYWdlQm9vay5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCi0JCXBhZ2Uuc2V0T3B0aW9uc09uR2VuZXJhdG9yKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHBhZ2VCb29rLnNob3dQYWdlKGVtcHR5U2V0dGluZ3NQYWdlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG92ZXJ3cml0ZUJ1dHRvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZW5hYmxlT3ZlcndyaXRlQnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgb3ZlcndyaXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgb3ZlcndyaXRlQnV0dG9uLnNldFNlbGVjdGlvbihnZW5lcmF0b3IuZ2V0T3ZlcndyaXRlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBvdmVyd3JpdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvdG9jb2xDb21ibygpCi0gIHsKLSAgICBwcm90b2NvbENvbWJvLnJlbW92ZUFsbCgpOwotCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFVOU1BFQ0lGSUVEKTsKLS8vICAgIGxpc3QuYWRkQWxsKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRCaW5kaW5nRXh0ZW5zaW9uTmFtZXMoKSk7Ci0JbGlzdC5hZGRBbGwoQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEJpbmRpbmdFeHRlbnNpb25OYW1lcygpKTsKLQkKLSAgICBTdHJpbmcgcHJvdG9jb2xUZXh0ID0gZ2VuZXJhdG9yLmdldFByb3RvY29sKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvdG9jb2wgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgIHByb3RvY29sQ29tYm8uYWRkKHByb3RvY29sKTsKLQkgIAotCSAgaWYgKHByb3RvY29sLmVxdWFscyhVTlNQRUNJRklFRCkpIHsKLQkJICBjb250ZW50R2VuZXJhdG9ycy5hZGQobnVsbCk7Ci0JICB9Ci0JICBlbHNlIHsKLQkJICBDb250ZW50R2VuZXJhdG9yIGdlbiA9IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRHZW5lcmF0b3JDbGFzc0Zyb21OYW1lKHByb3RvY29sKTsKLQkJICBjb250ZW50R2VuZXJhdG9ycy5hZGQoZ2VuKTsgIAotCSAgfQotICAgIH0KLQotICAgIGlmIChwcm90b2NvbFRleHQgPT0gbnVsbCAmJiBwcm90b2NvbENvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICB7Ci0gICAgICBwcm90b2NvbFRleHQgPSBwcm90b2NvbENvbWJvLmdldEl0ZW0oMCk7Ci0vLyAgICAgIGdlbmVyYXRvci5zZXRQcm90b2NvbCghVU5TUEVDSUZJRUQuZXF1YWxzKHByb3RvY29sVGV4dCkgPyBwcm90b2NvbFRleHQgOiBudWxsKTsKLSAgICB9Ci0gICAgcHJvdG9jb2xDb21iby5zZXRUZXh0KHByb3RvY29sVGV4dCk7Ci0KLQlDb250ZW50R2VuZXJhdG9yIGdlbiA9IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRHZW5lcmF0b3JDbGFzc0Zyb21OYW1lKHByb3RvY29sVGV4dCk7Ci0JZ2VuZXJhdG9yLnNldENvbnRlbnRHZW5lcmF0b3IoZ2VuKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlZk5hbWVDb21ibygpCi0gIHsKLSAgICByZWZOYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0KLSAgICByZWZOYW1lQ29tYm8uYWRkKFVOU1BFQ0lGSUVEKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWZOYW1lcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZWZOYW1lQ29tYm8uYWRkKChTdHJpbmcpIGkubmV4dCgpKTsKLSAgICB9Ci0KLSAgICBpZiAocmVmTmFtZUNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVmVGV4dCA9IGdlbmVyYXRvci5nZXRSZWZOYW1lKCk7Ci0gICAgICByZWZOYW1lQ29tYm8uc2V0VGV4dChyZWZUZXh0ICE9IG51bGwgPyByZWZUZXh0IDogVU5TUEVDSUZJRUQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgewotICAgIGdlbmVyYXRvci5zZXROYW1lKGNvbXBvbmVudE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IExpc3QgZ2V0UmVmTmFtZXMoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZWZOYW1lTGFiZWxUZXh0KCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKTsKLSAgcHVibGljIGFic3RyYWN0IENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSBjcmVhdGVDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UoU3RyaW5nIHByb3RvY29sKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9XMTFCcm93c2VDb21wb25lbnREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9XMTFCcm93c2VDb21wb25lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0YTdlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvVzExQnJvd3NlQ29tcG9uZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTZWFyY2hMaXN0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdC5XU0RMQmluZGluZ1NlYXJjaExpc3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0LldTRExDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQuV1NETEludGVyZmFjZVNlYXJjaExpc3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0LldTRExNZXNzYWdlU2VhcmNoTGlzdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlYXJjaC5JV1NETFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBXMTFCcm93c2VDb21wb25lbnREaWFsb2cgaW1wbGVtZW50cyBJQ29tcG9uZW50RGlhbG9nIHsKLQlwcml2YXRlIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZTsKLQlwcml2YXRlIENvbXBvbmVudFNwZWNpZmljYXRpb24gc2VsZWN0aW9uOwotCXByaXZhdGUgVzExRGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0JCi0JcHVibGljIFcxMUJyb3dzZUNvbXBvbmVudERpYWxvZyhRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUsIElGaWxlIGlGaWxlLCBXMTFEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpIHsKLQkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGRlc2NyaXB0aW9uLmdldFRhcmdldCgpOwotCQkKLQkgICAgU2hlbGwgc2hlbGwgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkgICAgaW50IHJldHVyblZhbHVlID0gV2luZG93LkNBTkNFTDsKLQkgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cgPSBudWxsOwotCSAgICBpZiAocXVhbGlmaWVkTmFtZSA9PSBJV1NETFNlYXJjaENvbnN0YW50cy5CSU5ESU5HX01FVEFfTkFNRSkKLQkgICAgewotCSAgICAJV1NETENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlciA9IG5ldyBXU0RMQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpOwotCSAgICAJZmluYWwgV1NETEJpbmRpbmdTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyID0gbmV3IFdTRExCaW5kaW5nU2VhcmNoTGlzdFByb3ZpZGVyKGRlZmluaXRpb24pOwotCSAgICAJQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbigpOwotCSAgICAJY29uZmlndXJhdGlvbi5zZXRGaWx0ZXJMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVfRklMVEVSKTsKLQkgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihkZXNjcmlwdGlvblByb3ZpZGVyKTsKLQkgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0U2VhcmNoTGlzdFByb3ZpZGVyKHNlYXJjaExpc3RQcm92aWRlcik7Ci0JICAgICAgICAKLQkgICAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSA9IE1lc3NhZ2VzLl9VSV9USVRMRV9TUEVDSUZZX0JJTkRJTkc7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGRpYWxvZyA9IG5ldyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgY29uZmlndXJhdGlvbik7Ci0JICAgICAgICAKLQkgICAgICAgIElGaWxlIGZpbGUgPSBnZXRGaWxlKCk7Ci0JICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCSAgICAgICAgKChTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKSBkaWFsb2cpLnNldEN1cnJlbnRSZXNvdXJjZShmaWxlKTsKLQkgICAgICAgIH0KLQkgICAgfQotCSAgICBlbHNlIGlmIChxdWFsaWZpZWROYW1lID09IElXU0RMU2VhcmNoQ29uc3RhbnRzLlBPUlRfVFlQRV9NRVRBX05BTUUpCi0JICAgIHsKLQkgICAgICBXU0RMQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyID0gbmV3IFdTRExDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0JICAgICAgZmluYWwgV1NETEludGVyZmFjZVNlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIgPSBuZXcgV1NETEludGVyZmFjZVNlYXJjaExpc3RQcm92aWRlcihkZWZpbml0aW9uKTsKLQkgICAgIAotCSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLQkgICAgICBjb25maWd1cmF0aW9uLnNldEZpbHRlckxhYmVsVGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRV9GSUxURVIpOwotCSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihkZXNjcmlwdGlvblByb3ZpZGVyKTsKLQkgICAgICBjb25maWd1cmF0aW9uLnNldFNlYXJjaExpc3RQcm92aWRlcihzZWFyY2hMaXN0UHJvdmlkZXIpOwotCSAgICAgIC8vY29uZmlndXJhdGlvbi5zZXROZXdDb21wb25lbnRIYW5kbGVyKG5ldyBOZXdUeXBlQnV0dG9uSGFuZGxlcigpKTsKLQkgICAgICAKLQkgICAgICBTdHJpbmcgZGlhbG9nVGl0bGUgPSBNZXNzYWdlcy5fVUlfVElUTEVfU1BFQ0lGWV9QT1JUVFlQRTsgLy8kTk9OLU5MUy0xJAotCSAgICAgIGRpYWxvZyA9IG5ldyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgY29uZmlndXJhdGlvbik7Ci0JICAgICAgCi0JICAgICAgSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQkgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0JICAgIAkgICgoU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZykgZGlhbG9nKS5zZXRDdXJyZW50UmVzb3VyY2UoZmlsZSk7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHF1YWxpZmllZE5hbWUgPT0gSVdTRExTZWFyY2hDb25zdGFudHMuTUVTU0FHRV9NRVRBX05BTUUpCi0JICAgIHsKLQkgICAgICBXU0RMQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyID0gbmV3IFdTRExDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0JICAgICAgZmluYWwgV1NETE1lc3NhZ2VTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyID0gbmV3IFdTRExNZXNzYWdlU2VhcmNoTGlzdFByb3ZpZGVyKGRlZmluaXRpb24pOwotCSAgICAgCi0JICAgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbigpOwotCSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmlsdGVyTGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX0ZJTFRFUik7Ci0JICAgICAgY29uZmlndXJhdGlvbi5zZXREZXNjcmlwdGlvblByb3ZpZGVyKGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotCSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0U2VhcmNoTGlzdFByb3ZpZGVyKHNlYXJjaExpc3RQcm92aWRlcik7Ci0JICAgICAgLy9jb25maWd1cmF0aW9uLnNldE5ld0NvbXBvbmVudEhhbmRsZXIobmV3IE5ld1R5cGVCdXR0b25IYW5kbGVyKCkpOwotCSAgICAgIAotCSAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSA9IE1lc3NhZ2VzLl9VSV9USVRMRV9TUEVDSUZZX01FU1NBR0U7IC8vJE5PTi1OTFMtMSQKLQkgICAgICBkaWFsb2cgPSBuZXcgU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhzaGVsbCwgZGlhbG9nVGl0bGUsIGNvbmZpZ3VyYXRpb24pOwotCSAgICAgIAotCSAgICAgIElGaWxlIGZpbGUgPSBnZXRGaWxlKCk7Ci0JICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotCSAgICAJICAoKFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cpIGRpYWxvZykuc2V0Q3VycmVudFJlc291cmNlKGZpbGUpOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLQkgICAgICByZXR1cm5WYWx1ZSA9IGRpYWxvZy5vcGVuKCk7Ci0JICAgICAgaWYgKHJldHVyblZhbHVlID09IFdpbmRvdy5PSykKLQkgICAgICB7Ci0JICAgICAgICBzZWxlY3Rpb24gPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQkKLQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgIAlmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9XMTFOZXdDb21wb25lbnREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9XMTFOZXdDb21wb25lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyMTlhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvVzExTmV3Q29tcG9uZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkQmluZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuY29tbWFuZHMuVzExQWRkSW50ZXJmYWNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFBZGRNZXNzYWdlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUFTRE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guSVdTRExTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExBZGFwdGVyRmFjdG9yeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld0NvbXBvbmVudERpYWxvZzsKLQotcHVibGljIGNsYXNzIFcxMU5ld0NvbXBvbmVudERpYWxvZyBpbXBsZW1lbnRzIElDb21wb25lbnREaWFsb2cgewotCXByb3RlY3RlZCBOZXdDb21wb25lbnREaWFsb2cgZGlhbG9nOwotCXByb3RlY3RlZCBRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWU7Ci0JcHJvdGVjdGVkIElGaWxlIGlGaWxlOwotCXByb3RlY3RlZCBXMTFEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLQlwcm90ZWN0ZWQgSUFTRE9iamVjdCBuZXdPYmplY3Q7Ci0JCi0JcHVibGljIFcxMU5ld0NvbXBvbmVudERpYWxvZyhRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUsIElGaWxlIGlGaWxlLCBXMTFEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lOwotCQl0aGlzLmlGaWxlID0gaUZpbGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJCi0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJaWYgKHF1YWxpZmllZE5hbWUgPT0gSVdTRExTZWFyY2hDb25zdGFudHMuQklORElOR19NRVRBX05BTUUpIHsKLQkJCVN0cmluZyBkaWFsb2dUaXRsZSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfQklORElORzsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGJhc2VOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVCaW5kaW5nTmFtZShnZXREZWZpbml0aW9uKCksICJOZXdCaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3QgdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZEJpbmRpbmdOYW1lcyhnZXREZWZpbml0aW9uKCkpOwotCQkJZGlhbG9nID0gbmV3IE5ld0NvbXBvbmVudERpYWxvZyhzaGVsbCwgZGlhbG9nVGl0bGUsIGJhc2VOYW1lLCB1c2VkTmFtZXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaGVsbCwgQVNERWRpdG9yQ1NIZWxwSWRzLk5FV19CSU5ESU5HX0RJQUxPRyk7Ci0JCX0KLQkJZWxzZSBpZiAocXVhbGlmaWVkTmFtZSA9PSBJV1NETFNlYXJjaENvbnN0YW50cy5QT1JUX1RZUEVfTUVUQV9OQU1FKSB7Ci0JCQlTdHJpbmcgZGlhbG9nVGl0bGUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX1BPUlRUWVBFOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYmFzZU5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVBvcnRUeXBlTmFtZShnZXREZWZpbml0aW9uKCksICJOZXdQb3J0VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQlMaXN0IHVzZWROYW1lcyA9IE5hbWVVdGlsLmdldFVzZWRQb3J0VHlwZU5hbWVzKGdldERlZmluaXRpb24oKSk7Ci0JCQlkaWFsb2cgPSBuZXcgTmV3Q29tcG9uZW50RGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgYmFzZU5hbWUsIHVzZWROYW1lcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNoZWxsLCBBU0RFZGl0b3JDU0hlbHBJZHMuTkVXX1BPUlRUWVBFX0RJQUxPRyk7Ci0JCX0KLQkJZWxzZSBpZiAocXVhbGlmaWVkTmFtZSA9PSBJV1NETFNlYXJjaENvbnN0YW50cy5NRVNTQUdFX01FVEFfTkFNRSkgewotCQkJU3RyaW5nIGRpYWxvZ1RpdGxlID0gTWVzc2FnZXMuX1VJX0xBQkVMX05FV19NRVNTQUdFOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYmFzZU5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGdldERlZmluaXRpb24oKSwgIk5ld01lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlzdCB1c2VkTmFtZXMgPSBOYW1lVXRpbC5nZXRVc2VkTWVzc2FnZU5hbWVzKGdldERlZmluaXRpb24oKSk7Ci0JCQlkaWFsb2cgPSBuZXcgTmV3Q29tcG9uZW50RGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgYmFzZU5hbWUsIHVzZWROYW1lcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNoZWxsLCBBU0RFZGl0b3JDU0hlbHBJZHMuTkVXX01FU1NBR0VfRElBTE9HKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIChEZWZpbml0aW9uKSBkZXNjcmlwdGlvbi5nZXRUYXJnZXQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24pIHsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRTZWxlY3RlZENvbXBvbmVudCgpIHsKLQkJU3RyaW5nIHF1YWxpZmllciA9IGdldERlZmluaXRpb24oKS5nZXRQcmVmaXgoZ2V0RGVmaW5pdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0TmFtZSgpOwotCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihxdWFsaWZpZXIsIG5hbWUsIGlGaWxlKTsKLQkJc3BlYy5zZXRPYmplY3QobmV3T2JqZWN0KTsKLQkJcmV0dXJuIHNwZWM7Ci0JfQotCi0JcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkgewotCQlpbnQgclZhbHVlID0gZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLQkJCi0JCWlmIChyVmFsdWUgPT0gV2luZG93Lk9LKSB7Ci0JCQkvLyBDcmVhdGUgdGhlIG5ldyBPYmplY3QKLQkJCWlmIChxdWFsaWZpZWROYW1lID09IElXU0RMU2VhcmNoQ29uc3RhbnRzLkJJTkRJTkdfTUVUQV9OQU1FKSB7Ci0JCQkJVzExQWRkQmluZGluZ0NvbW1hbmQgY29tbWFuZCA9IChXMTFBZGRCaW5kaW5nQ29tbWFuZCkgZGVzY3JpcHRpb24uZ2V0QWRkQmluZGluZ0NvbW1hbmQoKTsKLQkJCQljb21tYW5kLnNldE5ld0JpbmRpbmdOYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkgICAgCi0JCQkgICAgT2JqZWN0IG5ld1dTRExPYmplY3QgPSBjb21tYW5kLmdldE5ld0JpbmRpbmcoKTsKLQkJCSAgICBuZXdPYmplY3QgPSAoSUFTRE9iamVjdCkgV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyLmdldEluc3RhbmNlKCkuYWRhcHQoKE5vdGlmaWVyKSBuZXdXU0RMT2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHF1YWxpZmllZE5hbWUgPT0gSVdTRExTZWFyY2hDb25zdGFudHMuUE9SVF9UWVBFX01FVEFfTkFNRSkgewotCQkJCVcxMUFkZEludGVyZmFjZUNvbW1hbmQgY29tbWFuZCA9IChXMTFBZGRJbnRlcmZhY2VDb21tYW5kKSBkZXNjcmlwdGlvbi5nZXRBZGRJbnRlcmZhY2VDb21tYW5kKCk7Ci0JCQkJY29tbWFuZC5zZXROZXdQb3J0VHlwZU5hbWUoZGlhbG9nLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZShjb21tYW5kKTsKLQkJCSAgICAKLQkJCSAgICBPYmplY3QgbmV3V1NETE9iamVjdCA9IGNvbW1hbmQuZ2V0TmV3UG9ydFR5cGUoKTsKLQkJCSAgICBuZXdPYmplY3QgPSAoSUFTRE9iamVjdCkgV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyLmdldEluc3RhbmNlKCkuYWRhcHQoKE5vdGlmaWVyKSBuZXdXU0RMT2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHF1YWxpZmllZE5hbWUgPT0gSVdTRExTZWFyY2hDb25zdGFudHMuTUVTU0FHRV9NRVRBX05BTUUpIHsKLQkJCQlXMTFBZGRNZXNzYWdlQ29tbWFuZCBjb21tYW5kID0gKFcxMUFkZE1lc3NhZ2VDb21tYW5kKSBkZXNjcmlwdGlvbi5nZXRBZGRNZXNzYWdlQ29tbWFuZCgpOwotCQkJCWNvbW1hbmQuc2V0TmV3TWVzc2FnZU5hbWUoZGlhbG9nLmdldE5hbWUoKSk7Ci0JCQkJZXhlY3V0ZShjb21tYW5kKTsKLQkJCSAgICAKLQkJCSAgICBPYmplY3QgbmV3V1NETE9iamVjdCA9IGNvbW1hbmQuZ2V0TmV3TWVzc2FnZSgpOwotCQkJICAgIG5ld09iamVjdCA9IChJQVNET2JqZWN0KSBXU0RMQWRhcHRlckZhY3RvcnlIZWxwZXIuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoTm90aWZpZXIpIG5ld1dTRExPYmplY3QpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gclZhbHVlOwotCX0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAocGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgQ29tbWFuZFN0YWNrIHN0YWNrID0gKENvbW1hbmRTdGFjaykgcGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0gICAgICAgICAgICBzdGFjay5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvVzExQmluZGluZ1JlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvVzExQmluZGluZ1JlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzQ1ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1cxMUJpbmRpbmdSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMUVuZFBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMVNldEJpbmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLlcxMUJyb3dzZUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLlcxMU5ld0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guSVdTRExTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMU2V0Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgVzExQmluZGluZ1JlZmVyZW5jZUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgewotCXByb3RlY3RlZCBXMTFEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLQlwcm90ZWN0ZWQgSUZpbGUgaUZpbGU7Ci0JCi0JcHVibGljIFcxMUJpbmRpbmdSZWZlcmVuY2VFZGl0TWFuYWdlcihXMTFEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSUZpbGUgaUZpbGUpIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmlGaWxlID0gaUZpbGU7Ci0JfQotCQotCXB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpIHsKLQkJcmV0dXJuIG5ldyBXMTFCcm93c2VDb21wb25lbnREaWFsb2coSVdTRExTZWFyY2hDb25zdGFudHMuQklORElOR19NRVRBX05BTUUsIGlGaWxlLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0TmV3RGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IFcxMU5ld0NvbXBvbmVudERpYWxvZyhJV1NETFNlYXJjaENvbnN0YW50cy5CSU5ESU5HX01FVEFfTkFNRSwgaUZpbGUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWZpbml0aW9uIGdldERlZmluaXRpb24oKSB7Ci0JCXJldHVybiAoRGVmaW5pdGlvbikgZGVzY3JpcHRpb24uZ2V0VGFyZ2V0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCVcxMUVuZFBvaW50IHcxMUVuZFBvaW50ID0gKFcxMUVuZFBvaW50KSByZWZlcmVuY2luZ09iamVjdDsKLQkJT2JqZWN0IGJpbmRpbmdPYmplY3QgPSByZWZlcmVuY2VkQ29tcG9uZW50LmdldE9iamVjdCgpOwotCQlpZiAoYmluZGluZ09iamVjdCA9PSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIElCaW5kaW5nIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIENvbXBvbmVudFNwZWNpZmljYXRpb24KLQotCQl9Ci0JCQotCQlpZiAoYmluZGluZ09iamVjdCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pIHsKLQkJCVBvcnQgcG9ydCA9IChQb3J0KSB3MTFFbmRQb2ludC5nZXRUYXJnZXQoKTsKLQkJCVdTRExTZXRDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbmV3IFdTRExTZXRDb21wb25lbnRIZWxwZXIoaUZpbGUsIGdldERlZmluaXRpb24oKSk7Ci0JCQloZWxwZXIuc2V0V1NETENvbXBvbmVudChwb3J0LCAiYmluZGluZyIsIChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBiaW5kaW5nT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlCaW5kaW5nIG5ld0JpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0JCQlXMTFTZXRCaW5kaW5nQ29tbWFuZC51cGRhdGVQb3J0UHJvdG9jb2wocG9ydCwgbmV3QmluZGluZyk7Ci0JCX0JCQotCQllbHNlIGlmIChiaW5kaW5nT2JqZWN0IGluc3RhbmNlb2YgSUJpbmRpbmcpewotCQkJSUJpbmRpbmcgYmluZGluZyA9IChJQmluZGluZykgYmluZGluZ09iamVjdDsKLQkJCUNvbW1hbmQgY29tbWFuZCA9IHcxMUVuZFBvaW50LmdldFNldEJpbmRpbmdDb21tYW5kKGJpbmRpbmcpOwotCQkJQ29tbWFuZFN0YWNrIHN0YWNrID0gKENvbW1hbmRTdGFjaykgQVNERWRpdG9yUGx1Z2luLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKTsKLQkJCXN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZ2V0Q29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRRdWlja1BpY2tzKCkgewotCQlMaXN0IHNwZWNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSXRlcmF0b3IgYmluZGluZ3MgPSBkZXNjcmlwdGlvbi5nZXRCaW5kaW5ncygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChiaW5kaW5ncy5oYXNOZXh0KCkpIHsKLQkJCUlCaW5kaW5nIGJpbmRpbmcgPSAoSUJpbmRpbmcpIGJpbmRpbmdzLm5leHQoKTsKLQkJCVN0cmluZyBxdWFsaWZpZXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWUgPSBiaW5kaW5nLmdldE5hbWUoKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJCi0JCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihxdWFsaWZpZXIsIG5hbWUsIGZpbGUpOwotCQkJc3BlYy5zZXRPYmplY3QoYmluZGluZyk7Ci0JCQlzcGVjTGlzdC5hZGQoc3BlYyk7Ci0JCX0KLQotCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gc3BlY0FycmF5ID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb25bc3BlY0xpc3Quc2l6ZSgpXTsKLQkJc3BlY0xpc3QudG9BcnJheShzcGVjQXJyYXkpOwotCQkKLQkJcmV0dXJuIHNwZWNBcnJheTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldEhpc3RvcnkoKSB7Ci0JCUNvbXBvbmVudFNwZWNpZmljYXRpb25bXSBoaXN0b3J5ID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb25bMF07Ci0JCXJldHVybiBoaXN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFRvSGlzdG9yeShDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1cxMUludGVyZmFjZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvVzExSW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlZmVmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvVzExSW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLlcxMUJyb3dzZUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLlcxMU5ld0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guSVdTRExTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMU2V0Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgVzExSW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIgaW1wbGVtZW50cyBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciB7Ci0JcHJvdGVjdGVkIFcxMURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOwotCXByb3RlY3RlZCBJRmlsZSBpRmlsZTsKLQkKLQlwdWJsaWMgVzExSW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIoVzExRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElGaWxlIGlGaWxlKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5pRmlsZSA9IGlGaWxlOwotCX0KLQkKLQlwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXRCcm93c2VEaWFsb2coKSB7Ci0JCXJldHVybiBuZXcgVzExQnJvd3NlQ29tcG9uZW50RGlhbG9nKElXU0RMU2VhcmNoQ29uc3RhbnRzLlBPUlRfVFlQRV9NRVRBX05BTUUsIGlGaWxlLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0TmV3RGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IFcxMU5ld0NvbXBvbmVudERpYWxvZyhJV1NETFNlYXJjaENvbnN0YW50cy5QT1JUX1RZUEVfTUVUQV9OQU1FLCBpRmlsZSwgZGVzY3JpcHRpb24pOwotCX0KLQotCXByaXZhdGUgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkgewotCQlyZXR1cm4gKERlZmluaXRpb24pIGRlc2NyaXB0aW9uLmdldFRhcmdldCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoT2JqZWN0IHJlZmVyZW5jaW5nT2JqZWN0LCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJVzExQmluZGluZyB3MTFCaW5kaW5nID0gKFcxMUJpbmRpbmcpIHJlZmVyZW5jaW5nT2JqZWN0OwotCQlPYmplY3QgaW50ZXJmYWNlT2JqZWN0ID0gcmVmZXJlbmNlZENvbXBvbmVudC5nZXRPYmplY3QoKTsKLQkJaWYgKGludGVyZmFjZU9iamVjdCA9PSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIElJbnRlcmZhY2UgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbgotCi0JCX0KLQkJCi0JCWlmIChpbnRlcmZhY2VPYmplY3QgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKSB7Ci0JCQlCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgdzExQmluZGluZy5nZXRUYXJnZXQoKTsKLQkJCVdTRExTZXRDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbmV3IFdTRExTZXRDb21wb25lbnRIZWxwZXIoaUZpbGUsIGdldERlZmluaXRpb24oKSk7Ci0JCQloZWxwZXIuc2V0V1NETENvbXBvbmVudChiaW5kaW5nLCAidHlwZSIsIChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBpbnRlcmZhY2VPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgSUludGVyZmFjZSl7Ci0JCQlJSW50ZXJmYWNlIGludGVyZmF6ZSA9IChJSW50ZXJmYWNlKSBpbnRlcmZhY2VPYmplY3Q7Ci0JCQlDb21tYW5kIGNvbW1hbmQgPSB3MTFCaW5kaW5nLmdldFNldEludGVyZmFjZUNvbW1hbmQoaW50ZXJmYXplKTsKLQkJCUNvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKTsKLQkJCXN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZ2V0Q29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldFF1aWNrUGlja3MoKSB7Ci0JCUxpc3Qgc3BlY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlJdGVyYXRvciBpbnRlcmZhY2VzID0gZGVzY3JpcHRpb24uZ2V0SW50ZXJmYWNlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpbnRlcmZhY2VzLmhhc05leHQoKSkgewotCQkJSUludGVyZmFjZSBpbnRlcmZhemUgPSAoSUludGVyZmFjZSkgaW50ZXJmYWNlcy5uZXh0KCk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gaW50ZXJmYXplLmdldE5hbWUoKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJCi0JCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihxdWFsaWZpZXIsIG5hbWUsIGZpbGUpOwotCQkJc3BlYy5zZXRPYmplY3QoaW50ZXJmYXplKTsKLQkJCXNwZWNMaXN0LmFkZChzcGVjKTsKLQkJfQotCi0JCUNvbXBvbmVudFNwZWNpZmljYXRpb25bXSBzcGVjQXJyYXkgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltzcGVjTGlzdC5zaXplKCldOwotCQlzcGVjTGlzdC50b0FycmF5KHNwZWNBcnJheSk7Ci0JCQotCQlyZXR1cm4gc3BlY0FycmF5OwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0SGlzdG9yeSgpIHsKLQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvblswXTsKLQkJcmV0dXJuIGhpc3Rvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVG9IaXN0b3J5KENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KSB7Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZWRpdC9XMTFNZXNzYWdlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZWRpdC9XMTFNZXNzYWdlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjNDg3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvVzExTWVzc2FnZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy5XMTFCcm93c2VDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy5XMTFOZXdDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VhcmNoLklXU0RMU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETFNldENvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLQotcHVibGljIGNsYXNzIFcxMU1lc3NhZ2VSZWZlcmVuY2VFZGl0TWFuYWdlciBpbXBsZW1lbnRzIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHsKLQlwcm90ZWN0ZWQgVzExRGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0JcHJvdGVjdGVkIElGaWxlIGlGaWxlOwotCQotCXB1YmxpYyBXMTFNZXNzYWdlUmVmZXJlbmNlRWRpdE1hbmFnZXIoVzExRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElGaWxlIGlGaWxlKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5pRmlsZSA9IGlGaWxlOwotCX0KLQotCXB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpIHsKLQkJcmV0dXJuIG5ldyBXMTFCcm93c2VDb21wb25lbnREaWFsb2coSVdTRExTZWFyY2hDb25zdGFudHMuTUVTU0FHRV9NRVRBX05BTUUsIGlGaWxlLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0TmV3RGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IFcxMU5ld0NvbXBvbmVudERpYWxvZyhJV1NETFNlYXJjaENvbnN0YW50cy5NRVNTQUdFX01FVEFfTkFNRSwgaUZpbGUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIChEZWZpbml0aW9uKSBkZXNjcmlwdGlvbi5nZXRUYXJnZXQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCVcxMU1lc3NhZ2VSZWZlcmVuY2UgdzExTWVzc2FnZVJlZiA9IChXMTFNZXNzYWdlUmVmZXJlbmNlKSByZWZlcmVuY2luZ09iamVjdDsKLQkJT2JqZWN0IG1lc3NhZ2VPYmplY3QgPSByZWZlcmVuY2VkQ29tcG9uZW50LmdldE9iamVjdCgpOwotCQlpZiAobWVzc2FnZU9iamVjdCA9PSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIElNZXNzYWdlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIENvbXBvbmVudFNwZWNpZmljYXRpb24KLQotCQl9Ci0JCQotCQlpZiAobWVzc2FnZU9iamVjdCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pIHsKLQkJCU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZj0gKE1lc3NhZ2VSZWZlcmVuY2UpIHcxMU1lc3NhZ2VSZWYuZ2V0VGFyZ2V0KCk7Ci0JCQlXU0RMU2V0Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG5ldyBXU0RMU2V0Q29tcG9uZW50SGVscGVyKGlGaWxlLCBnZXREZWZpbml0aW9uKCkpOwotCQkJaGVscGVyLnNldFdTRExDb21wb25lbnQobWVzc2FnZVJlZiwgIm1lc3NhZ2UiLCAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgbWVzc2FnZU9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCWVsc2UgaWYgKG1lc3NhZ2VPYmplY3QgaW5zdGFuY2VvZiBXMTFNZXNzYWdlKXsKLQkJCS8vIEJlbG93IGlzIGEgbGl0dGxlIGNvbXBsZXguLi4uIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdG8gaGF2ZSBJTWVzc2FnZSBjb250YWluIGEKLQkJCS8vIGdldFNldE1lc3NhZ2VDb21tYW5kKCkgd2hpY2ggd291bGQgaGFuZGxlIGFsbCBvZiB0aGlzIGJ1dCBkb2VzIGEgZ2V0U2V0TWVzc2FnZUNvbW1hbmQoKQotCQkJLy8gbWFrZSBzZW5zZSBhdCB0aGUgZ2VuZXJpYyBsZXZlbC4uLi4uCi0JCQlXMTFNZXNzYWdlIGlNZXNzYWdlID0gKFcxMU1lc3NhZ2UpIG1lc3NhZ2VPYmplY3Q7Ci0JCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWNPYmplY3QgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpOwotCQkJc3BlY09iamVjdC5zZXROYW1lKGlNZXNzYWdlLmdldE5hbWUoKSk7Ci0JCQlzcGVjT2JqZWN0LnNldE1ldGFOYW1lKElXU0RMU2VhcmNoQ29uc3RhbnRzLk1FU1NBR0VfTUVUQV9OQU1FKTsKLQkJCXNwZWNPYmplY3Quc2V0UXVhbGlmaWVyKGRlc2NyaXB0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCQotCQkJU3RyaW5nIGxvY2F0aW9uID0gKChEZWZpbml0aW9uKSBkZXNjcmlwdGlvbi5nZXRUYXJnZXQoKSkuZ2V0TG9jYXRpb24oKTsKLQkJCVN0cmluZyBwbGF0Zm9ybVJlc291cmNlID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXNvdXJjZSkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uLnN1YnN0cmluZyhwbGF0Zm9ybVJlc291cmNlLmxlbmd0aCgpKSk7Ci0JICAgICAgICAgIHNwZWNPYmplY3Quc2V0RmlsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkpOwotCSAgICAgICAgfSAgCi0JCQkKLQkJCU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZj0gKE1lc3NhZ2VSZWZlcmVuY2UpIHcxMU1lc3NhZ2VSZWYuZ2V0VGFyZ2V0KCk7Ci0JCQlXU0RMU2V0Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG5ldyBXU0RMU2V0Q29tcG9uZW50SGVscGVyKGlGaWxlLCBnZXREZWZpbml0aW9uKCkpOwotCQkJaGVscGVyLnNldFdTRExDb21wb25lbnQobWVzc2FnZVJlZiwgIm1lc3NhZ2UiLCAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgc3BlY09iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBnZXRDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0UXVpY2tQaWNrcygpIHsKLQkJTGlzdCBzcGVjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUl0ZXJhdG9yIG1lc3NhZ2VzID0gZGVzY3JpcHRpb24uZ2V0TWVzc2FnZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAobWVzc2FnZXMuaGFzTmV4dCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gKElNZXNzYWdlKSBtZXNzYWdlcy5uZXh0KCk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gbWVzc2FnZS5nZXROYW1lKCk7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQotCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24ocXVhbGlmaWVyLCBuYW1lLCBmaWxlKTsKLQkJCXNwZWMuc2V0T2JqZWN0KG1lc3NhZ2UpOwotCQkJc3BlY0xpc3QuYWRkKHNwZWMpOwotCQl9Ci0KLQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHNwZWNBcnJheSA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW3NwZWNMaXN0LnNpemUoKV07Ci0JCXNwZWNMaXN0LnRvQXJyYXkoc3BlY0FycmF5KTsKLQkJCi0JCXJldHVybiBzcGVjQXJyYXk7Ci0JfQotCi0JcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRIaXN0b3J5KCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFRvSGlzdG9yeShDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkgewotCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExCYXNlU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvV1NETEJhc2VTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmZTM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvV1NETEJhc2VTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkltcG9ydEltcGw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMQmFzZVNlYXJjaExpc3RQcm92aWRlciBpbXBsZW1lbnRzIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIgewotCQotCXByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMoSUNvbXBvbmVudExpc3QgbGlzdCwgTGlzdCBpbnB1dENvbXBvbmVudHMsIFF1YWxpZmllZE5hbWUgbWV0YU5hbWUpIHsKLQkJSXRlcmF0b3IgaXQgPSBpbnB1dENvbXBvbmVudHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gd3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcXVhbGlmaWVyID0gd3NkbEVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQkJCi0JCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWMgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpOwotCQkJY29tcG9uZW50U3BlYy5zZXRNZXRhTmFtZShtZXRhTmFtZSk7Ci0JCQljb21wb25lbnRTcGVjLnNldE5hbWUobmFtZSk7Ci0JCQljb21wb25lbnRTcGVjLnNldFF1YWxpZmllcihxdWFsaWZpZXIpOwotCQkJCi0JCQlTdHJpbmcgbG9jYXRpb24gPSB3c2RsRWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0TG9jYXRpb24oKTsKLQkJCVN0cmluZyBwbGF0Zm9ybVJlc291cmNlID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXNvdXJjZSkpIHsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbi5zdWJzdHJpbmcocGxhdGZvcm1SZXNvdXJjZS5sZW5ndGgoKSkpOwotCQkJCUlGaWxlIHJlc3VsdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJY29tcG9uZW50U3BlYy5zZXRGaWxlKHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlsaXN0LmFkZChjb21wb25lbnRTcGVjKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRXU0RMRmlsZUltcG9ydHMoTGlzdCB3c2RsSW1wb3J0cykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gd3NkbEltcG9ydHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSW1wb3J0SW1wbCBpbXBvcnRJdGVtID0gKEltcG9ydEltcGwpIGl0Lm5leHQoKTsKLQkJCWltcG9ydEl0ZW0uaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7ICAgICAgICAgIC8vIExvYWQgaWYgbmVjZXNzYXJ5Ci0JCQlpZiAoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkgPT0gbnVsbCkgewotCQkJCWxpc3QuYWRkKGltcG9ydEl0ZW0pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLy9UT0RPICh0cnVuZykgbWFrZSB0aGlzIG9uZSBhYnN0cmFjdCB3aGVuIHdlIGFyZSBpbiBkZXZlbG9wbWVudCBwaGFzZSBhZ2FpbgotCXByb3RlY3RlZCBMaXN0IGdldFNlYXJjaGluZ0NvbXBvbmVudHMoRGVmaW5pdGlvbiBpbXBvcnREZWZpbml0aW9uKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGdldEltcG9ydGVkQ29tcG9uZW50cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBRdWFsaWZpZWROYW1lIG1ldGFOYW1lLCBIYXNoTWFwIGV4Y2x1c2lvbnMpIHsJCQotCQlJdGVyYXRvciBpbXBvcnRzSXQgPSBnZXRXU0RMRmlsZUltcG9ydHMoZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotCQkJSW1wb3J0IGltcG9ydEl0ZW0gPSAoSW1wb3J0KSBpbXBvcnRzSXQubmV4dCgpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gaW1wb3J0SXRlbS5nZXREZWZpbml0aW9uKCkuZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0JCQlleGNsdXNpb25zLnB1dChsb2NhdGlvbiwgQm9vbGVhbi5UUlVFICk7Ci0JCQlEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0JCQlpZiAoaW1wb3J0RGVmaW5pdGlvbiAhPSBudWxsKQotCQkJewotCQkgIAkgIExpc3QgaW1wb3J0ZWRDb21wb25lbnRzID0gZ2V0U2VhcmNoaW5nQ29tcG9uZW50cyhpbXBvcnREZWZpbml0aW9uKTsJCQkKLQkJCSAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgaW1wb3J0ZWRDb21wb25lbnRzLCBtZXRhTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoT3V0c2lkZUN1cnJlbnRSZXNvdXJjZShJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSwgTWFwIGV4Y2x1c2lvbnMpIHsKLQkJaWYgKHNjb3BlICE9IG51bGwpIHsKLQkJCVdTRExDb21wb25lbnRGaW5kZXIgZmluZGVyID0gbmV3IFdTRExDb21wb25lbnRGaW5kZXIobWV0YU5hbWUpOwotCQkJSXRlcmF0b3IgaXQgPSBmaW5kZXIuZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKHNjb3BlKS5pdGVyYXRvcigpOyAKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGl0ZW0gPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgaXQubmV4dCgpOwotCQkJCVN0cmluZyBpdGVtVVJJID0gVVJJSGVscGVyLmdldFBsYXRmb3JtVVJJKGl0ZW0uZ2V0RmlsZSgpKTsKLQkJCQlpZiAoZXhjbHVzaW9ucy5nZXQoaXRlbVVSSSkgPT0gbnVsbCl7Ci0JCQkJCWxpc3QuYWRkKGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZWRpdC9XU0RMQmluZGluZ1NlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExCaW5kaW5nU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2M3MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExCaW5kaW5nU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VhcmNoLklXU0RMU2VhcmNoQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV1NETEJpbmRpbmdTZWFyY2hMaXN0UHJvdmlkZXIgZXh0ZW5kcyBXU0RMQmFzZVNlYXJjaExpc3RQcm92aWRlciB7Ci0JcHVibGljIFdTRExCaW5kaW5nU2VhcmNoTGlzdFByb3ZpZGVyKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3QoSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gR3JhYiBleHBsaWN0bHkgZGVmaW5lZCBjb21wb25lbnRzCi0JCWNyZWF0ZVdTRExDb21wb25lbnRPYmplY3RzKGxpc3QsIGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCksIElXU0RMU2VhcmNoQ29uc3RhbnRzLkJJTkRJTkdfTUVUQV9OQU1FKTsKLQotCQkvLyBGaWxlcyBleGNsdWRlZCBpZiB3ZSBzZWFyY2ggd2l0aCB0aGUgc2VhcmNoIGVuZ2luZSBsYXRlcgotCQlIYXNoTWFwIGV4Y2x1c2lvbnMgPSBuZXcgSGFzaE1hcCgpOwkKLQkJZXhjbHVzaW9ucy5wdXQoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSwgQm9vbGVhbi5UUlVFKTsJCQotCQkKLQkJLy8gR3JhYiBkaXJlY3RseSBpbXBvcnRlZCBjb21wb25lbnRzIGFuZCB1cGRhdGUgdGhlIGV4Y2x1c2lvbnMgJ2xpc3QnCi0JCWdldEltcG9ydGVkQ29tcG9uZW50cyhsaXN0LCBJV1NETFNlYXJjaENvbnN0YW50cy5CSU5ESU5HX01FVEFfTkFNRSwgZXhjbHVzaW9ucyk7Ci0KLQkJc2VhcmNoT3V0c2lkZUN1cnJlbnRSZXNvdXJjZShsaXN0LCBzY29wZSwgSVdTRExTZWFyY2hDb25zdGFudHMuQklORElOR19NRVRBX05BTUUsIGV4Y2x1c2lvbnMpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFNlYXJjaGluZ0NvbXBvbmVudHMoRGVmaW5pdGlvbiBpbXBvcnREZWZpbml0aW9uKSB7Ci0JCXJldHVybiBpbXBvcnREZWZpbml0aW9uLmdldEVCaW5kaW5ncygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZWRpdC9XU0RMQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjQyNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guSVdTRExTZWFyY2hDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciB7Ci0JICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBCSU5ESU5HX0lNQUdFID0gIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYmluZGluZ19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIFBPUlRUWVBFX0lNQUdFID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wb3J0dHlwZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIE1FU1NBR0VfSU1BR0UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL21lc3NhZ2Vfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IGNvbXBvbmVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcihPYmplY3QgY29tcG9uZW50KSB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbikKLQkgICAgewotCSAgICAgIHJlc3VsdCA9ICgoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiljb21wb25lbnQpLmdldFF1YWxpZmllcigpOwotCSAgICB9ICAKLQkgICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0JICAgIHsKLQkgICAgICByZXN1bHQgPSAoKFdTRExFbGVtZW50KSBjb21wb25lbnQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsgCi0JICAgIH0gIAotCSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLQkgICAgewotCSAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IGdldFF1YWxpZmllZE5hbWVGb3JTZWFyY2hNYXRjaCgoU2VhcmNoTWF0Y2gpY29tcG9uZW50KTsKLQkgICAgICBpZiAocXVhbGlmaWVkTmFtZSAhPSBudWxsKQotCSAgICAgIHsgIAotCSAgICAgICAgcmVzdWx0ID0gcXVhbGlmaWVkTmFtZS5nZXROYW1lc3BhY2UoKTsKLQkgICAgICB9ICAgIAotCSAgICB9ICAKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGNvbXBvbmVudCkgewotCSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pCi0JICAgIHsKLQkgICAgICByZXN1bHQgPSAoKENvbXBvbmVudFNwZWNpZmljYXRpb24pY29tcG9uZW50KS5nZXROYW1lKCk7Ci0JICAgIH0gIAotCSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLQkgICAgewotCSAgICAgIHJlc3VsdCA9ICgoV1NETEVsZW1lbnQpY29tcG9uZW50KS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJuYW1lIik7ICAvLyROT04tTkxTLTEkCi0JICAgIH0gIAotCSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLQkgICAgewotCSAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IGdldFF1YWxpZmllZE5hbWVGb3JTZWFyY2hNYXRjaCgoU2VhcmNoTWF0Y2gpY29tcG9uZW50KTsKLQkgICAgICBpZiAocXVhbGlmaWVkTmFtZSAhPSBudWxsKQotCSAgICAgIHsgIAotCSAgICAgICAgcmVzdWx0ID0gcXVhbGlmaWVkTmFtZS5nZXRMb2NhbE5hbWUoKTsKLQkgICAgICB9ICAgIAotCSAgICB9ICAgICAgCi0JICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEZpbGVJY29uKE9iamVjdCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvd3NkbF9maWxlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBjb21wb25lbnQpIHsKLQkgICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLQkgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pCi0JICAgIHsKLQkgICAgICByZXN1bHQgPSAoKENvbXBvbmVudFNwZWNpZmljYXRpb24pY29tcG9uZW50KS5nZXRGaWxlKCk7Ci0JICAgIH0gIAotCSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLQkgICAgewotCSAgICAgIHJlc3VsdCA9ICgoU2VhcmNoTWF0Y2gpY29tcG9uZW50KS5nZXRGaWxlKCk7Ci0JICAgIH0gIAotCSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLQkgICAgewotCSAgICAgIFdTRExFbGVtZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gKFdTRExFbGVtZW50KSBjb21wb25lbnQ7Ci0JICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gY29uY3JldGVDb21wb25lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCSAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgLy8gVE9ETyAoY3MpIHJldmlzaXQgYW5kIHRlc3QgbW9yZQotCSAgICAgICAgLy8KLQkgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGRlZmluaXRpb24uZ2V0TG9jYXRpb24oKTsKLQkgICAgICAgIFN0cmluZyBwbGF0Zm9ybVJlc291cmNlID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXNvdXJjZSkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uLnN1YnN0cmluZyhwbGF0Zm9ybVJlc291cmNlLmxlbmd0aCgpKSk7Ci0JICAgICAgICAgIHJlc3VsdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkgICAgICAgIH0KLQkgICAgICB9ICAKLQkgICAgfQotCSAgICByZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkgICAgU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZShlbGVtZW50KTsKLQkgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotCSAgICAgIHJlc3VsdCArPSBuYW1lOwotCSAgICB9Ci0JICAgIHJldHVybiByZXN1bHQ7Ci0JICB9IAotCSAgCi0JICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGNvbXBvbmVudCkKLQkgIHsKLQkgICAgSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pCi0JICAgIHsKLQkgICAgCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9ICgoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgY29tcG9uZW50KS5nZXRNZXRhTmFtZSgpOwotCSAgICAJaWYgKCBxdWFsaWZpZWROYW1lICE9IG51bGwgKXsKLQkgICAgCQlpZiAoIHF1YWxpZmllZE5hbWUuZXF1YWxzKElXU0RMU2VhcmNoQ29uc3RhbnRzLkJJTkRJTkdfTUVUQV9OQU1FKSkKLQkgICAgCQkJcmVzdWx0ID0gQklORElOR19JTUFHRTsKLQkgICAgCQllbHNlIGlmICggcXVhbGlmaWVkTmFtZS5lcXVhbHMoSVdTRExTZWFyY2hDb25zdGFudHMuUE9SVF9UWVBFX01FVEFfTkFNRSkpCi0JICAgIAkJCXJlc3VsdCA9IFBPUlRUWVBFX0lNQUdFOwotCSAgICAJCWVsc2UgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJV1NETFNlYXJjaENvbnN0YW50cy5NRVNTQUdFX01FVEFfTkFNRSkpCi0JICAgIAkJCXJlc3VsdCA9IE1FU1NBR0VfSU1BR0U7Ci0KLQkgICAgCX0KLQkgICAgfQotCSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLQkgICAgewotCSAgICAgIFNlYXJjaE1hdGNoIHNlYXJjaE1hdGNoID0gKFNlYXJjaE1hdGNoKWNvbXBvbmVudDsKLQkgICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSlzZWFyY2hNYXRjaC5tYXAuZ2V0KCJtZXRhTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgaWYgKCBxdWFsaWZpZWROYW1lICE9IG51bGwgKXsKLQkgICAgCSAgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJV1NETFNlYXJjaENvbnN0YW50cy5CSU5ESU5HX01FVEFfTkFNRSkpCi0JICAgIAkJICByZXN1bHQgPSBCSU5ESU5HX0lNQUdFOwotCSAgICAJICBlbHNlIGlmICggcXVhbGlmaWVkTmFtZS5lcXVhbHMoSVdTRExTZWFyY2hDb25zdGFudHMuUE9SVF9UWVBFX01FVEFfTkFNRSkpCi0JICAgIAkJICByZXN1bHQgPSBQT1JUVFlQRV9JTUFHRTsKLQkgICAgCQllbHNlIGlmICggcXVhbGlmaWVkTmFtZS5lcXVhbHMoSVdTRExTZWFyY2hDb25zdGFudHMuTUVTU0FHRV9NRVRBX05BTUUpKQotCSAgICAJCQlyZXN1bHQgPSBNRVNTQUdFX0lNQUdFOwotCi0JICAgICAgfQotCSAgICB9ICAgICAgCi0JICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0JICAgICAgcmVzdWx0ID0gQklORElOR19JTUFHRTsgICAgICAKLQkgICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0JICAgICAgcmVzdWx0ID0gUE9SVFRZUEVfSU1BR0U7Ci0JICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE1lc3NhZ2UpCi0JCSAgICAgIHJlc3VsdCA9IE1FU1NBR0VfSU1BR0U7Ci0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLQkgIH0KLQkKLQlwcml2YXRlIFF1YWxpZmllZE5hbWUgZ2V0UXVhbGlmaWVkTmFtZUZvclNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKSB7Ci0JCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IG51bGw7Ci0JCU9iamVjdCBvID0gbWF0Y2gubWFwLmdldCgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0JCXsgIAotCQkJcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKW87Ci0JCX0gICAgICAKLQkJcmV0dXJuIHF1YWxpZmllZE5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExDb21wb25lbnRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZWRpdC9XU0RMQ29tcG9uZW50RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhY2IzMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExDb21wb25lbnRGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC51dGlsLkNvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgV1NETENvbXBvbmVudEZpbmRlciB7Ci0JUXVhbGlmaWVkTmFtZSBtZXRhTmFtZTsKLSAgICBwdWJsaWMgV1NETENvbXBvbmVudEZpbmRlcihRdWFsaWZpZWROYW1lIG1ldGFOYW1lKSB7Ci0gICAgCXRoaXMubWV0YU5hbWUgPSBtZXRhTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluZENvbXBvbmVudHMoU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSwgTGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzZWFyY2hTY29wZSkKLSAgICB7Ci0gICAgICB0cnkgewotICAgICAgICAgIENvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4gcGF0dGVybiA9IG5ldyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4obmV3IFF1YWxpZmllZE5hbWUoIioiLCAiKiIpLCBtZXRhTmFtZSwgU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0gpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBUT0RPIChjcykgcmV0aGluayB0aGUgY29tbWVudGVkIG91dCBjb2RlIGJlbG93LiAgSXMgdGhlcmUgc29tZSByZWFzb24gZm9yIG5hcnJvd2luZyB0byBsaXN0IG9mIHNlYXJjaCBwYXJ0aWNwYW50cz8KLSAgICAgICAgICAvLyBJdCBzZWVtcyB0aGUgb25seSBiZW5lZml0IG1heSBiZSB0byBmaWx0ZXIgb3VyIHhzZCBjb21wb25lbnQgZGVjbGFyYXRpb25zIHRoYXQgYXJlbid0IGRlZmluZWQKLSAgICAgICAgICAvLyBpbiBzdGFuZCBhbG9uZSB3c2RsIGRvY3VtZW50cy4gIFBlcmhhcHMgaXQncyBiZXN0IHRvIGRvIHRoaXMgd2l0aCBhbiBhZGRpdGlvbmFsIHByb3BlcnR5IGFyZyBvbiB0aGUKLSAgICAgICAgICAvLyBkZWNsYXJhdGlvbiBwYXR0ZXJuIG9yIHBlcmhhcHMgc2ltcGx5IGRvaW5nIHNvbWUgJ3Bvc3QnIGZpbHRlcmluZy4KLSAgICAgICAgICAvLwotICAgICAgICAgIC8vU3RyaW5nIHBhcnRpY2lwYW50SWQgPSBtZXRhTmFtZS5nZXROYW1lc3BhY2UoKS5lcXVhbHMoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpID8KLSAgICAgICAgICAvLyAgICAib3JnLmVjbGlwc2Uud3N0LndzZGwuc2VhcmNoLldTRExTZWFyY2hQYXJ0aWNpcGFudCIgOgotICAgICAgICAgIC8vICAgICJvcmcuZWNsaXBzZS53c3QueHNkLnNlYXJjaC5YU0RTZWFyY2hQYXJ0aWNpcGFudCI7ICAgICAgICAJCSAgCi0gICAgICAgICAgLy9TZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNwYW50ID0gU2VhcmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZWFyY2hQYXJ0aWNpcGFudChwYXJ0aWNpcGFudElkKTsgICAgICAgICAKLSAgICAgICAgICAvL1NlYXJjaFBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzID0geyBwYXJ0aWNwYW50IH07ICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBUT0RPIChjcykgSSdtIGJldHRpbmcgd2UnbGwgbmVlZCB0byBwcm92aWRlIHNvbWUgaG9vayBoZXJlIHRvIGFsbG93IGV4dGVuZGVycyB0byBjb25maWd1cmUKLSAgICAgICAgICAvLyB0aGUgc2VhcmNoIG9wdGlvbnMuICBDdXJyZW50bHkgd2UganVzdCBwYXNzIGluIG51bGwuCi0gICAgICAgICAgc2VhcmNoRW5naW5lLnNlYXJjaChwYXR0ZXJuLCByZXF1ZXN0b3IsIHNlYXJjaFNjb3BlLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXF1ZXN0b3IuZ2V0UmVzdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgewotICAgICAgICAgICAgU2VhcmNoTWF0Y2ggbWF0Y2ggPSAoU2VhcmNoTWF0Y2gpaS5uZXh0KCk7Ci0gICAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpOwotICAgICAgICAgICAgc3BlYy5zZXRNZXRhTmFtZShtZXRhTmFtZSk7Ci0gICAgICAgICAgICBzcGVjLnNldEZpbGUobWF0Y2guZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IG8gPSBtYXRjaC5tYXAuZ2V0KCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpbzsKLSAgICAgICAgICAgICAgaWYgKHF1YWxpZmllZE5hbWUuZ2V0TG9jYWxOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwZWMuc2V0TmFtZShxdWFsaWZpZWROYW1lLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzcGVjLnNldFF1YWxpZmllcihxdWFsaWZpZWROYW1lLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChzcGVjKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9ICAKLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIC8vc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3QgZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKFNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0KLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTZWFyY2hFbmdpbmUgc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICBmaW5kQ29tcG9uZW50cyhzZWFyY2hFbmdpbmUsIGxpc3QsIHNjb3BlKTsgICAgCi0gICAgICAgIHJldHVybiBsaXN0OyAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvV1NETEludGVyZmFjZVNlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExJbnRlcmZhY2VTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlODI2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvV1NETEludGVyZmFjZVNlYXJjaExpc3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlYXJjaC5JV1NETFNlYXJjaENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFdTRExJbnRlcmZhY2VTZWFyY2hMaXN0UHJvdmlkZXIgZXh0ZW5kcyBXU0RMQmFzZVNlYXJjaExpc3RQcm92aWRlciB7Ci0JcHVibGljIFdTRExJbnRlcmZhY2VTZWFyY2hMaXN0UHJvdmlkZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBHcmFiIGV4cGxpY3RseSBkZWZpbmVkIGNvbXBvbmVudHMKLQkJY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCksIElXU0RMU2VhcmNoQ29uc3RhbnRzLlBPUlRfVFlQRV9NRVRBX05BTUUpOwotCi0JCS8vIEZpbGVzIGV4Y2x1ZGVkIGlmIHdlIHNlYXJjaCB3aXRoIHRoZSBzZWFyY2ggZW5naW5lIGxhdGVyCi0JCUhhc2hNYXAgZXhjbHVzaW9ucyA9IG5ldyBIYXNoTWFwKCk7CQotCQlleGNsdXNpb25zLnB1dChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLCBCb29sZWFuLlRSVUUpOwkJCi0JCQotCQkvLyBHcmFiIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMgYW5kIHVwZGF0ZSB0aGUgZXhjbHVzaW9ucyAnbGlzdCcKLQkJZ2V0SW1wb3J0ZWRDb21wb25lbnRzKGxpc3QsIElXU0RMU2VhcmNoQ29uc3RhbnRzLlBPUlRfVFlQRV9NRVRBX05BTUUsIGV4Y2x1c2lvbnMpOwotCi0JCXNlYXJjaE91dHNpZGVDdXJyZW50UmVzb3VyY2UobGlzdCwgc2NvcGUsIElXU0RMU2VhcmNoQ29uc3RhbnRzLlBPUlRfVFlQRV9NRVRBX05BTUUsIGV4Y2x1c2lvbnMpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFNlYXJjaGluZ0NvbXBvbmVudHMoRGVmaW5pdGlvbiBpbXBvcnREZWZpbml0aW9uKSB7Ci0JCXJldHVybiBpbXBvcnREZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExNZXNzYWdlU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvV1NETE1lc3NhZ2VTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4ZDRlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2VkaXQvV1NETE1lc3NhZ2VTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guSVdTRExTZWFyY2hDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZVNlYXJjaExpc3RQcm92aWRlciBleHRlbmRzIFdTRExCYXNlU2VhcmNoTGlzdFByb3ZpZGVyIHsKLQlwdWJsaWMgV1NETE1lc3NhZ2VTZWFyY2hMaXN0UHJvdmlkZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBHcmFiIGV4cGxpY3RseSBkZWZpbmVkIGNvbXBvbmVudHMKLQkJY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSwgSVdTRExTZWFyY2hDb25zdGFudHMuTUVTU0FHRV9NRVRBX05BTUUpOwotCi0JCS8vIEZpbGVzIGV4Y2x1ZGVkIGlmIHdlIHNlYXJjaCB3aXRoIHRoZSBzZWFyY2ggZW5naW5lIGxhdGVyCi0JCUhhc2hNYXAgZXhjbHVzaW9ucyA9IG5ldyBIYXNoTWFwKCk7CQotCQlleGNsdXNpb25zLnB1dChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLCBCb29sZWFuLlRSVUUpOwkJCi0JCQotCQkvLyBHcmFiIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMgYW5kIHVwZGF0ZSB0aGUgZXhjbHVzaW9ucyAnbGlzdCcKLQkJZ2V0SW1wb3J0ZWRDb21wb25lbnRzKGxpc3QsIElXU0RMU2VhcmNoQ29uc3RhbnRzLk1FU1NBR0VfTUVUQV9OQU1FLCBleGNsdXNpb25zKTsJCQotCQkKLQkJc2VhcmNoT3V0c2lkZUN1cnJlbnRSZXNvdXJjZShsaXN0LCBzY29wZSwgSVdTRExTZWFyY2hDb25zdGFudHMuTUVTU0FHRV9NRVRBX05BTUUsIGV4Y2x1c2lvbnMpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFNlYXJjaGluZ0NvbXBvbmVudHMoRGVmaW5pdGlvbiBpbXBvcnREZWZpbml0aW9uKSB7Ci0JCXJldHVybiBpbXBvcnREZWZpbml0aW9uLmdldEVNZXNzYWdlcygpOwotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZWRpdC9XU0RMWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Mjg4MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMU2V0Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGV4dGVuZHMJWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHsKLQlwdWJsaWMgV1NETFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykgewotCQlzdXBlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0JfQotCQotCXB1YmxpYyBXU0RMWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzLCBJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoY3VycmVudEZpbGUsIG51bGwpOwotCQlpZiAoc2NoZW1hcyA9PSBudWxsIHx8IHNjaGVtYXMubGVuZ3RoID09IDApIHsKLQkJCXNldFNjaGVtYXMoZ2V0SW5saW5lU2NoZW1hcyhkZXNjcmlwdGlvbikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpIHsKLQkJaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIHJlZmVyZW5jaW5nT2JqZWN0OwotCQkJcmVmZXJlbmNpbmdPYmplY3QgPSBhZGFwdGVyLmdldFRhcmdldCgpOwotCQl9Ci0JCQotCQlpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0JCQlQYXJ0IHBhcnQgPSAoUGFydCkgcmVmZXJlbmNpbmdPYmplY3Q7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCWlmIChBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQlmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJfQotCQkJCi0JCQlpZiAoY29tcG9uZW50LmlzTmV3KCkpIHsgIAotCQkJCWlmIChjb21wb25lbnQuZ2V0TWV0YU5hbWUoKSA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FKSB7Ci0JCQkJCUFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJY29tbWFuZC5ydW4oKTsKLQkJCQkJU3RyaW5nIHRucyA9IGNvbW1hbmQuZ2V0WFNERWxlbWVudCgpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQkJCQljb21wb25lbnQuc2V0UXVhbGlmaWVyKHRucyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlXU0RMU2V0Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG5ldyBXU0RMU2V0Q29tcG9uZW50SGVscGVyKGZpbGUsIHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLQkJCWhlbHBlci5zZXRYU0RFbGVtZW50Q29tcG9uZW50KHBhcnQsIGNvbXBvbmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldFF1aWNrUGlja3MoKSB7Ci0vLwkJRWxlbWVudENvbXBvbmVudExpc3QgbGlzdCA9IG5ldyBFbGVtZW50Q29tcG9uZW50TGlzdCgpOwotLy8JCQotLy8JCWlmIChBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLS8vCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgQVNERWRpdG9yUGx1Z2luLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLS8vCQkJWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIoZmlsZSwgc2NoZW1hcyk7Ci0vLwkJCXByb3ZpZGVyLnBvcHVsYXRlQ29tcG9uZW50TGlzdChsaXN0LCBudWxsLCBudWxsKTsKLS8vCQl9Ci0vLwotLy8JCUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlY3NbXSA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW2xpc3Quc2l6ZSgpXTsKLS8vCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5zaXplKCk7IGluZGV4KyspIHsKLS8vCQkJc3BlY3NbaW5kZXhdID0gKENvbXBvbmVudFNwZWNpZmljYXRpb24pIGxpc3QuZ2V0KGluZGV4KTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb25bMF07Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYXMoWFNEU2NoZW1hW10gc2NoZW1hcykgewotCQl0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotCX0KLQkKLQlwcml2YXRlIFhTRFNjaGVtYVtdIGdldElubGluZVNjaGVtYXMoSURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCUxpc3QgdHlwZXMgPSBkZXNjcmlwdGlvbi5nZXRUeXBlcygpOwotCQlYU0RTY2hlbWFbXSBzY2hlbWFzID0gbmV3IFhTRFNjaGVtYVt0eXBlcy5zaXplKCldOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlXMTFUeXBlIHR5cGUgPSAoVzExVHlwZSkgdHlwZXMuZ2V0KGluZGV4KTsKLQkJCXNjaGVtYXNbaW5kZXhdID0gKFhTRFNjaGVtYSkgdHlwZS5nZXRUYXJnZXQoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNjaGVtYXM7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgRWxlbWVudENvbXBvbmVudExpc3QgaW1wbGVtZW50cyBJQ29tcG9uZW50TGlzdCB7Ci0JCXByaXZhdGUgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJcHVibGljIHZvaWQgYWRkKE9iamVjdCBvYmplY3QpIHsKLQkJCWxpc3QuYWRkKG9iamVjdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCXJldHVybiBsaXN0LnNpemUoKTsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbGlzdC5nZXQoaW5kZXgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZWRpdC9XU0RMWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMGU1MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9lZGl0L1dTRExYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMU2V0Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MuTmV3VHlwZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFdTRExYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIgZXh0ZW5kcyBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIgewotCQotCXB1YmxpYyBXU0RMWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKSB7Ci0JCXN1cGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLQl9Ci0JCi0JcHVibGljIFdTRExYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMsIElEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlzdXBlcihjdXJyZW50RmlsZSwgbnVsbCk7Ci0JCWlmIChzY2hlbWFzID09IG51bGwgfHwgc2NoZW1hcy5sZW5ndGggPT0gMCkgewotCQkJc2V0U2NoZW1hcyhnZXRJbmxpbmVTY2hlbWFzKGRlc2NyaXB0aW9uKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0TmV3RGlhbG9nKCkKLQl7Ci0JCWlmIChzY2hlbWFzLmxlbmd0aCA+IDApIHsKLQkJCU5ld1R5cGVEaWFsb2cgbmV3VHlwZURpYWxvZyA9IG5ldyBOZXdUeXBlRGlhbG9nKHNjaGVtYXNbMF0pOwotCQkJbmV3VHlwZURpYWxvZy5hbGxvd0Fub255bW91c1R5cGUoZmFsc2UpOwotCQkJcmV0dXJuIG5ld1R5cGVEaWFsb2c7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlOZXdUeXBlRGlhbG9nIG5ld1R5cGVEaWFsb2cgPSBuZXcgTmV3VHlwZURpYWxvZygpOwotCQkJbmV3VHlwZURpYWxvZy5hbGxvd0Fub255bW91c1R5cGUoZmFsc2UpOwotCQkJcmV0dXJuIG5ld1R5cGVEaWFsb2c7Ci0JCX0KLQl9CQotCi0JcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpIHsKLQkJaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIHJlZmVyZW5jaW5nT2JqZWN0OwotCQkJcmVmZXJlbmNpbmdPYmplY3QgPSBhZGFwdGVyLmdldFRhcmdldCgpOwotCQl9Ci0JCQotCQlpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0JCQlQYXJ0IHBhcnQgPSAoUGFydCkgcmVmZXJlbmNpbmdPYmplY3Q7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCWlmIChBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQlmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJfQotCQkJCi0JCQlpZiAoY29tcG9uZW50LmlzTmV3KCkpIHsgIAotCQkJCUFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZChwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgY29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCQkJaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkgewotCQkJCQljb21tYW5kLmlzQ29tcGxleFR5cGUodHJ1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb21tYW5kLmlzQ29tcGxleFR5cGUoZmFsc2UpOwotCQkJCX0KLQkJCQljb21tYW5kLnJ1bigpOwotCQkJCVN0cmluZyB0bnMgPSBjb21tYW5kLmdldFhTREVsZW1lbnQoKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCQljb21wb25lbnQuc2V0UXVhbGlmaWVyKHRucyk7Ci0JCQl9Ci0JCQkKLQkJCVdTRExTZXRDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbmV3IFdTRExTZXRDb21wb25lbnRIZWxwZXIoZmlsZSwgcGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQkJaGVscGVyLnNldFhTRFR5cGVDb21wb25lbnQocGFydCwgY29tcG9uZW50KTsKLQkJfQotCQllbHNlIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJc3VwZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHJlZmVyZW5jaW5nT2JqZWN0LCBjb21wb25lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKSB7Ci0JCQkKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYXMoWFNEU2NoZW1hW10gc2NoZW1hcykgewotCQl0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotCX0KLQkKLQlwcml2YXRlIFhTRFNjaGVtYVtdIGdldElubGluZVNjaGVtYXMoSURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCUxpc3QgdHlwZXMgPSBkZXNjcmlwdGlvbi5nZXRUeXBlcygpOwotCQlYU0RTY2hlbWFbXSBzY2hlbWFzID0gbmV3IFhTRFNjaGVtYVt0eXBlcy5zaXplKCldOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlXMTFUeXBlIHR5cGUgPSAoVzExVHlwZSkgdHlwZXMuZ2V0KGluZGV4KTsKLQkJCXNjaGVtYXNbaW5kZXhdID0gKFhTRFNjaGVtYSkgdHlwZS5nZXRUYXJnZXQoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNjaGVtYXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL0V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9FeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDE4MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL0V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBleHRlbnNpYmlsaXR5IGl0ZW0gdHJlZSBwcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeSBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeQotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9QUk9WSURFUl9QUk9QRVJUWSA9ICJsYWJlbFByb3ZpZGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfUFJPVklERVJfUFJPUEVSVFkgPSAiY29udGVudFByb3ZpZGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVRUX05BTUVTID0geyAibGFiZWxQcm92aWRlckNsYXNzIiwgImNvbnRlbnRQcm92aWRlckNsYXNzIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmV0dXJuIChJTGFiZWxQcm92aWRlcikgZ2V0UHJvcGVydHkobmFtZXNwYWNlLCBMQUJFTF9QUk9WSURFUl9QUk9QRVJUWSk7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVDaGlsZFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmV0dXJuIChJVHJlZUNoaWxkUHJvdmlkZXIpIGdldFByb3BlcnR5KG5hbWVzcGFjZSwgQ09OVEVOVF9QUk9WSURFUl9QUk9QRVJUWSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9FeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRjYmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9FeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuWFNEVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyIGltcGxlbWVudHMgSVR5cGVTeXN0ZW1Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJVHlwZVN5c3RlbVByb3ZpZGVyW10gdHlwZVN5c3RlbVByb3ZpZGVyczsKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIE9iamVjdFtdIEVNUFRZX0FSUkFZID0ge307Ci0KLSAgcHVibGljIEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIoKQotICB7Ci0gICAgdHlwZVN5c3RlbVByb3ZpZGVycyA9IG5ldyBJVHlwZVN5c3RlbVByb3ZpZGVyWzFdOyAKLSAgICB0eXBlU3lzdGVtUHJvdmlkZXJzWzBdID0gbmV3IFhTRFR5cGVTeXN0ZW1Qcm92aWRlcigpOwotICB9ICAgICAgICAgIAotICAgICAgICAKLSAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU3lzdGVtUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGxpc3QuYWRkQWxsKHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKGRlZmluaXRpb24sIHR5cGVOYW1lQ2F0ZWdvcnkpKTsKLSAgICB9ICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU3lzdGVtUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGxpc3QuYWRkQWxsKHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0QXZhaWxhYmxlVHlwZXMoZGVmaW5pdGlvbiwgc2NoZW1hLCB0eXBlTmFtZUNhdGVnb3J5KSk7Ci0gICAgfSAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRWxlbWVudE5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVTeXN0ZW1Qcm92aWRlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbGlzdC5hZGRBbGwodHlwZVN5c3RlbVByb3ZpZGVyc1tpXS5nZXRBdmFpbGFibGVFbGVtZW50TmFtZXMoZGVmaW5pdGlvbikpOwotICAgIH0gICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRDYXRlZ29yeUZvclR5cGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IFVOS05PV05fVFlQRTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVTeXN0ZW1Qcm92aWRlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcmVzdWx0ID0gdHlwZVN5c3RlbVByb3ZpZGVyc1tpXS5nZXRDYXRlZ29yeUZvclR5cGVOYW1lKGRlZmluaXRpb24sIHR5cGVOYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gVU5LTk9XTl9UWVBFKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0UHJlZml4ZWROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgCSBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVN5c3RlbVByb3ZpZGVycy5sZW5ndGg7IGkrKykKLSAgICAgewotICAgICAgIGxpc3QuYWRkQWxsKHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0UHJlZml4ZWROYW1lcyhkZWZpbml0aW9uLCBuYW1lc3BhY2UsIGxvY2FsTmFtZSkpOwotICAgICB9ICAgICAKLSAgICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjBhZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL0lOb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChPYmplY3QgcGFyZW50TW9kZWxPYmplY3QsIEVsZW1lbnRbXSBlbGVtZW50Q2hhaW4sIGludCBzdGFydCwgaW50W10gZW5kKTsKLSAgcHVibGljIE5vZGUgZ2V0Tm9kZShPYmplY3QgbW9kZWxPYmplY3QpOyAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvSU5vZGVSZWNvbmNpbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvSU5vZGVSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTJkM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL0lOb2RlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEBkZXByZWFjdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVSZWNvbmNpbGVyCi17Ci0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoT2JqZWN0IG1vZGVsT2JqZWN0LCBFbGVtZW50IGVsZW1lbnQsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JVHJlZUNoaWxkUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JVHJlZUNoaWxkUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViZjUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvSVRyZWVDaGlsZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFsbG93cyBleHRlbnNpb24gd3JpdGVycyB0byBwcm92aWRlIHNwZWNpYWxpemUgdHJlZSBjb250ZW50IGJlaGF2aW91ci4KLSAqIEl0IGlzIGludGVuZGVkIHRvIGJlaGF2ZSBzaW1pbGFyIHRvIHRoZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyLgotICogVGhlIG1ham9yIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGNsYXNzIGlzIHNpbXBsaWZpZWQgc28gdGhhdCBvbmx5IG9uZSBtZXRob2QgaXMgaW52b2x2ZWQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KSAgCQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUcmVlQ2hpbGRQcm92aWRlcgotewotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvSVR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTE0ODIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUeXBlU3lzdGVtUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9UWVBFID0gMHgwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMVF9JTl9UWVBFID0gMHgxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSX0RFRklORURfU0lNUExFX1RZUEUgPSAweDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVJfREVGSU5FRF9DT01QTEVYX1RZUEUgPSAweDQ7Ci0KLSAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpOwotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVFbGVtZW50TmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKTsgIAotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUeXBlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFhTRFNjaGVtYSBzY2hlbWEsIGludCB0eXBlTmFtZUNhdGVnb3J5KTsKLSAgcHVibGljIGludCBnZXRDYXRlZ29yeUZvclR5cGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHR5cGVOYW1lKTsKLSAgcHVibGljIExpc3QgZ2V0UHJlZml4ZWROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9OU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9OU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkYjc4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkKLXsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9MT0FESU5HX0VSUk9SID0gIlBMVUdJTl9MT0FESU5HX0VSUk9SIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGNsYXNzTmFtZSwgQnVuZGxlIGJ1bmRsZSkKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbmZvID0gbmV3IFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyhjbGFzc05hbWUsIGJ1bmRsZSk7Ci0gICAgICBtYXAucHV0KG5hbWVzcGFjZVVSSSwgaW5mbyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBuYW1lc3BhY2VVUkksIEhhc2hNYXAgcHJvcGVydHlUb0NsYXNzTmFtZU1hcCwgQnVuZGxlIGJ1bmRsZSkKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbmZvID0gbmV3IE11bHRpUHJvcGVydHlFeHRlbnNpb25JbmZvKHByb3BlcnR5VG9DbGFzc05hbWVNYXAsIGJ1bmRsZSk7Ci0gICAgICBtYXAucHV0KG5hbWVzcGFjZVVSSSwgaW5mbyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgcmV0dXJuIGluZm8gIT0gbnVsbCA/IGluZm8uZ2V0T2JqZWN0KCIiKSA6IG51bGw7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgRXh0ZW5zaW9uSW5mbyBpbmZvID0gKEV4dGVuc2lvbkluZm8pIG1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgICByZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mby5nZXRPYmplY3QocHJvcGVydHkpIDogbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaW9uSW5mbwotICB7Ci0gICAgcHJvdGVjdGVkIEJ1bmRsZSBidW5kbGU7Ci0KLSAgICBwdWJsaWMgRXh0ZW5zaW9uSW5mbyhCdW5kbGUgYnVuZGxlKQotICAgIHsKLSAgICAgIHRoaXMuYnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBwcm9wZXJ0eSk7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyBleHRlbmRzIEV4dGVuc2lvbkluZm8KLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotICAgIHByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OwotICAgIHByb3RlY3RlZCBib29sZWFuIGVycm9yOwotCi0gICAgcHVibGljIFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyhTdHJpbmcgY2xhc3NOYW1lLCBCdW5kbGUgYnVuZGxlKQotICAgIHsKLSAgICAgIHN1cGVyKGJ1bmRsZSk7Ci0gICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIENsYXNzIHRoZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgIG9iamVjdCA9IHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0ID0gUExVR0lOX0xPQURJTkdfRVJST1I7Ci0gICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG9iamVjdCAhPSBQTFVHSU5fTE9BRElOR19FUlJPUiA/IG9iamVjdCA6IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBNdWx0aVByb3BlcnR5RXh0ZW5zaW9uSW5mbyBleHRlbmRzIEV4dGVuc2lvbkluZm8KLSAgewotICAgIHByb3RlY3RlZCBIYXNoTWFwIHByb3BlcnR5VG9DbGFzc05hbWVUYWJsZTsKLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9wZXJ0eVRvT2JqZWN0VGFibGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIE11bHRpUHJvcGVydHlFeHRlbnNpb25JbmZvKEhhc2hNYXAgcHJvcGVydFRvQ2xhc3NOYW1lVGFibGUsIEJ1bmRsZSBidW5kbGUpCi0gICAgewotICAgICAgc3VwZXIoYnVuZGxlKTsKLSAgICAgIHRoaXMucHJvcGVydHlUb0NsYXNzTmFtZVRhYmxlID0gcHJvcGVydFRvQ2xhc3NOYW1lVGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIHByb3BlcnR5VG9DbGFzc05hbWVUYWJsZS5nZXQocHJvcGVydHkpOwotICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwcm9wZXJ0eVRvT2JqZWN0VGFibGUuZ2V0KHByb3BlcnR5KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICByZXN1bHQgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgcHJvcGVydHlUb09iamVjdFRhYmxlLnB1dChwcm9wZXJ0eSwgcmVzdWx0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5VG9PYmplY3RUYWJsZS5wdXQocHJvcGVydHksIFBMVUdJTl9MT0FESU5HX0VSUk9SKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBMVUdJTl9MT0FESU5HX0VSUk9SOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQkgIHJldHVybiByZXN1bHQgIT0gUExVR0lOX0xPQURJTkdfRVJST1IgPyByZXN1bHQgOiBudWxsOyAgICAgIAotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9XU0RMRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL1dTRExFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NmQzNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL1dTRExFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5JV1NETFRvb2xiYXJBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRWRpdG9yQ29uZmlndXJhdGlvbiB7Ci0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMRURJVE9SQ09ORklHVVJBVElPTkVYVEVOU0lPTklEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLldTRExFZGl0b3JFeHRlbnNpb25Db25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUkZBQ1RPUlkgPSAiYWRhcHRlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MQkFSQUNUSU9OID0gInRvb2xiYXJBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUdVUkVGQUNUT1JZID0gImZpZ3VyZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUUEFSVEZBQ1RPUlkgPSAiZWRpdFBhcnRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JICBMaXN0IGRlZmluZWRFeHRlbnNpb25zTGlzdCA9IG51bGw7Ci0KLQkgIHB1YmxpYyBXU0RMRWRpdG9yQ29uZmlndXJhdGlvbigpCi0JICB7Ci0KLQkgIH0KLQotCSAgcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkKLQkgIHsKLQkgICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgcmVhZFdTRExDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLQkgICAgfQotCSAgICBpZiAoIWRlZmluZWRFeHRlbnNpb25zTGlzdC5pc0VtcHR5KCkpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKChXU0RMRWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcykgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmdldCgwKSkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkgICAgfQotCSAgICByZXR1cm4gbnVsbDsKLQkgIH0KLQotCSAgcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotCSAgewotCSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNMaXN0ID09IG51bGwpCi0JICAgIHsKLQkgICAgICByZWFkV1NETENvbmZpZ3VyYXRpb25SZWdpc3RyeSgpOwotCSAgICB9Ci0JICAgIGlmICghZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmlzRW1wdHkoKSkKLQkgICAgewotCSAgICAgIHJldHVybiAoKFdTRExFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzKSBkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuZ2V0KDApKS5nZXRFZGl0UGFydEZhY3RvcnkoKTsKLQkgICAgfQotCSAgICByZXR1cm4gbnVsbDsKLQkgIH0KLQotLy8JICBwdWJsaWMgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBnZXRGaWd1cmVGYWN0b3J5KCkKLS8vCSAgewotLy8JICAgIGlmIChkZWZpbmVkRXh0ZW5zaW9uc0xpc3QgPT0gbnVsbCkKLS8vCSAgICB7Ci0vLwkgICAgICByZWFkV1NETENvbmZpZ3VyYXRpb25SZWdpc3RyeSgpOwotLy8JICAgIH0KLS8vCSAgICBpZiAoIWRlZmluZWRFeHRlbnNpb25zTGlzdC5pc0VtcHR5KCkpCi0vLwkgICAgewotLy8JICAgICAgcmV0dXJuICgoV1NETEVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEZpZ3VyZUZhY3RvcnkoKTsKLS8vCSAgICB9Ci0vLwkgICAgcmV0dXJuIG51bGw7Ci0vLwkgIH0KLQotCSAgcHVibGljIExpc3QgZ2V0VG9vbGJhckFjdGlvbnMoKQotCSAgewotCSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNMaXN0ID09IG51bGwpCi0JICAgIHsKLQkgICAgICByZWFkV1NETENvbmZpZ3VyYXRpb25SZWdpc3RyeSgpOwotCSAgICB9Ci0JICAgIGlmICghZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmlzRW1wdHkoKSkKLQkgICAgewotCSAgICAgIHJldHVybiAoKFdTRExFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzKSBkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuZ2V0KDApKS5nZXRBY3Rpb25MaXN0KCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JICB9Ci0KLQkgIHByb3RlY3RlZCBPYmplY3QgbG9hZENsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgY2xhc3NTdHJpbmcpCi0JICB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0KLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICBDbGFzcyB0aGVDbGFzcyA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCkubG9hZENsYXNzKGNsYXNzU3RyaW5nKTsKLQkgICAgICBPYmplY3QgaW5zdGFuY2UgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCi0JICAgICAgcmV0dXJuIGluc3RhbmNlOwotCSAgICB9Ci0JICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgICAgewotCi0JICAgIH0KLQkgICAgcmV0dXJuIG51bGw7Ci0JICB9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlYWRXU0RMQ29uZmlndXJhdGlvblJlZ2lzdHJ5KCkKLQkgIHsKLQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gd3NkbEVkaXRvckV4dGVuc2lvbkxpc3QgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihXU0RMRURJVE9SQ09ORklHVVJBVElPTkVYVEVOU0lPTklEKTsKLQotCSAgICBib29sZWFuIGRlZmluZWRFeHRlbnNpb25zRXhpc3QgPSAod3NkbEVkaXRvckV4dGVuc2lvbkxpc3QgIT0gbnVsbCAmJiB3c2RsRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGggPiAwKTsKLQotCSAgICBkZWZpbmVkRXh0ZW5zaW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkgICAgaWYgKGRlZmluZWRFeHRlbnNpb25zRXhpc3QpCi0JICAgIHsKLQkgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxFZGl0b3JFeHRlbnNpb25MaXN0Lmxlbmd0aDsgaSsrKQotCSAgICAgIHsKLQkgICAgICAgIFdTRExFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgV1NETEVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMoKTsKLQkgICAgICAgIGRlZmluZWRFeHRlbnNpb25zTGlzdC5hZGQocHJvcGVydGllcyk7Ci0KLQkgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gd3NkbEVkaXRvckV4dGVuc2lvbkxpc3RbaV07Ci0JICAgICAgICBTdHJpbmcgYWRhcHRlckZhY3RvcnlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFEQVBURVJGQUNUT1JZKTsKLQkgICAgICAgIGlmIChhZGFwdGVyRmFjdG9yeUNsYXNzICE9IG51bGwpCi0JICAgICAgICB7Ci0JICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsb2FkQ2xhc3MoZWxlbWVudCwgYWRhcHRlckZhY3RvcnlDbGFzcyk7Ci0JICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeSkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0QWRhcHRlckZhY3RvcnkoKEFkYXB0ZXJGYWN0b3J5KSBvYmplY3QpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0KLS8vCSAgICAgICAgU3RyaW5nIGZpZ3VyZUZhY3RvcnlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEZJR1VSRUZBQ1RPUlkpOwotLy8JICAgICAgICBpZiAoZmlndXJlRmFjdG9yeUNsYXNzICE9IG51bGwpCi0vLwkgICAgICAgIHsKLS8vCSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGZpZ3VyZUZhY3RvcnlDbGFzcyk7Ci0vLwkgICAgICAgICAgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBmaWd1cmVGYWN0b3J5ID0gbnVsbDsKLS8vCSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSkKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBmaWd1cmVGYWN0b3J5ID0gKElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkpIG9iamVjdDsKLS8vCSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0RmlndXJlRmFjdG9yeUxpc3QoZmlndXJlRmFjdG9yeSk7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICB9Ci0JICAgICAgICAKLQkgICAgICAgIFN0cmluZyBlZGl0UGFydEZhY3RvcnlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVESVRQQVJURkFDVE9SWSk7Ci0JICAgICAgICBpZiAoZWRpdFBhcnRGYWN0b3J5Q2xhc3MgIT0gbnVsbCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGxvYWRDbGFzcyhlbGVtZW50LCBlZGl0UGFydEZhY3RvcnlDbGFzcyk7Ci0JICAgICAgICAgIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkgPSBudWxsOwotCSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRpdFBhcnRGYWN0b3J5KQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgZWRpdFBhcnRGYWN0b3J5ID0gKEVkaXRQYXJ0RmFjdG9yeSkgb2JqZWN0OwotCSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0RWRpdFBhcnRGYWN0b3J5TGlzdChlZGl0UGFydEZhY3RvcnkpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0KLQkgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHRvb2xiYXJBY3Rpb25zID0gZWxlbWVudC5nZXRDaGlsZHJlbihUT09MQkFSQUNUSU9OKTsKLQkgICAgICAgIExpc3QgYWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgICAgIGlmICh0b29sYmFyQWN0aW9ucyAhPSBudWxsKQotCSAgICAgICAgewotCSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRvb2xiYXJBY3Rpb25zLmxlbmd0aDsgaisrKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFjdGlvbkVsZW1lbnQgPSB0b29sYmFyQWN0aW9uc1tqXTsKLQkgICAgICAgICAgICBTdHJpbmcgYWN0aW9uQ2xhc3MgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShDTEFTU05BTUUpOwotCSAgICAgICAgICAgIElXU0RMVG9vbGJhckFjdGlvbiBhY3Rpb24gPSBudWxsOwotCSAgICAgICAgICAgIGlmIChhY3Rpb25DbGFzcyAhPSBudWxsKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsb2FkQ2xhc3MoYWN0aW9uRWxlbWVudCwgYWN0aW9uQ2xhc3MpOwotCSAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElXU0RMVG9vbGJhckFjdGlvbikKLQkgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgYWN0aW9uID0gKElXU0RMVG9vbGJhckFjdGlvbikgb2JqZWN0OwotCSAgICAgICAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotCSAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgcHJvcGVydGllcy5zZXRBY3Rpb25MaXN0KGFjdGlvbkxpc3QpOwotCi0KLQotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9XU0RMRWRpdG9yRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbnMvV1NETEVkaXRvckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGJjOTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9XU0RMRWRpdG9yRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExFZGl0b3JFeHRlbnNpb24KLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUTElORV9UUkVFX0NPTlRFTlRfUFJPVklERVIgPSAxOyAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVExJTkVfTEFCRUxfUFJPVklERVIgPSAyOyAgICAgICAgICAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SID0gMzsgICAgICAgICAgLy8gbm9kZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBSUxTX1ZJRVdFUl9QUk9WSURFUiA9IDQ7ICAgICAgICAgIC8vIG5vZGUKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRElUX1BBUlRfRkFDVE9SWSA9IDU7ICAgICAgICAgICAgICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWVNURU1fUFJPVklERVIgPSA2OyAgICAgICAgICAgICAvLyByZXEnZCBmb3IgdHlwZSBzeXN0ZW0gZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PREVfUkVDT05DSUxFUiA9IDc7ICAgICAgICAgICAgICAgICAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0RFX0FTU09DSUFUSU9OX1BST1ZJREVSID0gODsgICAgICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUVVFUllfQ09OVFJJQlVUT1IgPSA5OyAgICAgICAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU09VUkNFX1BST1ZJREVSID0gMTA7ICAgICAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NFQ1RJT05fREVTQ1JJUFRPUl9QUk9WSURFUiA9IDExOyAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYU0RfREVMRVRFX0FDVElPTiA9IDEyOwotICAKLSAgYm9vbGVhbiBpc0V4dGVuc2lvblR5cGVTdXBwb3J0ZWQoaW50IHR5cGUpOwotICBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3QgbW9kZWxPYmplY3QpOwotICBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KGludCB0eXBlLCBJRWRpdG9yUGFydCBlZGl0b3IpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9XU0RMRWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL1dTRExFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODQ1OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL1dTRExFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFdTRExFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzCi17Ci0gIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotLy8gIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZmlndXJlRmFjdG9yeTsKLSAgRWRpdFBhcnRGYWN0b3J5IGVkaXRQYXJ0RmFjdG9yeTsKLSAgTGlzdCBhY3Rpb25MaXN0OwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcygpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aW9uTGlzdChMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICB0aGlzLmFjdGlvbkxpc3QgPSBhY3Rpb25MaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0UGFydEZhY3RvcnlMaXN0KEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmVkaXRQYXJ0RmFjdG9yeSA9IGVkaXRQYXJ0RmFjdG9yeTsKLSAgfQotCi0vLyAgcHVibGljIHZvaWQgc2V0RmlndXJlRmFjdG9yeUxpc3QoSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBmaWd1cmVGYWN0b3J5KQotLy8gIHsKLS8vICAgIHRoaXMuZmlndXJlRmFjdG9yeSA9IGZpZ3VyZUZhY3Rvcnk7Ci0vLyAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEFjdGlvbkxpc3QoKQotICB7Ci0gICAgcmV0dXJuIGFjdGlvbkxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIGVkaXRQYXJ0RmFjdG9yeTsKLSAgfQotCi0vLyAgcHVibGljIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZ2V0RmlndXJlRmFjdG9yeSgpCi0vLyAgewotLy8gICAgcmV0dXJuIGZpZ3VyZUZhY3Rvcnk7Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL1dTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb25zL1dTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY3ZThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9ucy9XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb25zOyAgICAgIAotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEQ29tcG9uZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KE9iamVjdCBwYXJlbnRNb2RlbE9iamVjdCwgRWxlbWVudFtdIGVsZW1lbnRDaGFpbiwgaW50IHN0YXJ0LCBpbnRbXSBlbmQpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIE9iamVjdCBjdXJyZW50T2JqZWN0ID0gcGFyZW50TW9kZWxPYmplY3Q7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZWxlbWVudENoYWluLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gZ2V0TW9kZWxPYmplY3RIZWxwZXIoY3VycmVudE9iamVjdCwgZWxlbWVudENoYWluW2ldKTsKLSAgICAgIGlmIChvID09IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgZW5kWzBdID0gaTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgY3VycmVudE9iamVjdCA9IG87Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBjdXJyZW50T2JqZWN0ICE9IHBhcmVudE1vZGVsT2JqZWN0ID8gY3VycmVudE9iamVjdCA6IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgICByZXR1cm4gKChXU0RMRWxlbWVudEltcGwpbW9kZWxPYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotICAgICAgCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0TW9kZWxPYmplY3RIZWxwZXIoT2JqZWN0IHBhcmVudE9iamVjdCwgRWxlbWVudCBlbGVtZW50Tm9kZSkKLSAgeyAgICAgICAgICAKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY2hpbGRDb21wb25lbnRMaXN0ID0gKChXU0RMRWxlbWVudEltcGwpIHBhcmVudE9iamVjdCkuZ2V0V1NETENvbnRlbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkQ29tcG9uZW50TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0gICAgICBpZiAobyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQgPSAoKFdTRExFbGVtZW50SW1wbClvKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFhTRENvbXBvbmVudEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50ID0gKChYU0RDb21wb25lbnRJbXBsKW8pLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0JCQlpZiAoZWxlbWVudCA9PSBlbGVtZW50Tm9kZSkKLQkJCXsKLQkJCQlyZXN1bHQgPSBvOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0gIH0KLX0gICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzE0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciAKLXsKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKTsgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL0h0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDhmNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBIdHRwRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBpbXBsZW1lbnRzIEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIKLXsgIAotICBwdWJsaWMgSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIoKQotICB7Ci0gIH0gIAkKLQkKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgCi0gICAgCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQlpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJiaW5kaW5nIikpIC8vJE5PTi1OTFMtMSQKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJiaW5kaW5nIik7IAkgICAvLyROT04tTkxTLTEkCi0JfQkgIAotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygib3BlcmF0aW9uIikpIC8vJE5PTi1OTFMtMSQKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJpbnB1dCIpIHx8ICAvLyROT04tTkxTLTEkCi0JICAgICAgICAgcGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvdXRwdXQiKSkgLy8kTk9OLU5MUy0xJAotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImJvZHkiKSB8fCAgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgbG9jYWxOYW1lLmVxdWFscygiaGVhZGVyIik7IAkgICAvLyROT04tTkxTLTEkCi0JfQkKLQllbHNlIGlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImZhdWx0IikpIC8vJE5PTi1OTFMtMSQKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJmYXVsdCIpOyAJICAgLy8kTk9OLU5MUy0xJAotCX0KLQllbHNlIGlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoInBvcnQiKSkgLy8kTk9OLU5MUy0xJAotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImFkZHJlc3MiKTsgCSAgIC8vJE5PTi1OTFMtMSQKLQl9CSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL01pbWVFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9NaW1lRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODllMDExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL01pbWVFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE1pbWVFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIGltcGxlbWVudHMgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcgoteyAgIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9OQU1FU1BBQ0VfVVJJPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIoKQotICB7Ci0gIH0gIAkKLQkKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWVzcGFjZSA9IHBhcmVudEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgCWlmIChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSS5lcXVhbHMocGFyZW50RWxlbWVudE5hbWVzcGFjZSkpCi0gIAl7Ci0gICAgCWlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImlucHV0IikgfHwgcGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvdXRwdXQiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCXsKLSAgICAJICAJcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiY29udGVudCIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkgICAgIGxvY2FsTmFtZS5lcXVhbHMoIm11bHRpcGFydFJlbGF0ZWQiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJICAgICBsb2NhbE5hbWUuZXF1YWxzKCJtaW1lWG1sIik7ICAgIAkgIAkgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0gIAl9Ci0gIAllbHNlIGlmIChNSU1FX05BTUVTUEFDRV9VUkkuZXF1YWxzKHBhcmVudEVsZW1lbnROYW1lc3BhY2UpKQotICAJewotCQlyZXN1bHQgPSB0cnVlOwkJCQkKLSAgCX0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1NvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9Tb2FwRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGUzZWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1NvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTb2FwRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBpbXBsZW1lbnRzIEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIKLXsgICAKLSAgcHVibGljIFNvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyKCkKLSAgewotICB9ICAJCi0JCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250ZXh0KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsgICAgCi0gICAgaWYgKHBhcmVudEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKSkKLSAgICB7IAotICAgICAgLy8gaGVyZSB3ZSBhc3N1bWUgdGhlIHBhcmVudCBlbGVtZW50IGlzIHRoZSBXU0RMIGJpbmRpbmcgCi0gICAgICAvLyBza2VsZXRvbiBhbmQgdGhhdCB0aGUgJ2xvY2FsTmFtZScgaXMgdGhlIFNPQVAgZXh0ZW5zaW9uIGVsZW1lbnQKLSAgICAgIC8vICAgICAgCi0gICAgICBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJiaW5kaW5nIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYmluZGluZyIpOyAJICAgLy8kTk9OLU5MUy0xJAotICAgICAgfQkgIAotICAgICAgZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiaW5wdXQiKSB8fCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygib3V0cHV0IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYm9keSIpIHx8ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoImhlYWRlciIpOyAJICAgLy8kTk9OLU5MUy0xJAotICAgICAgfQkKLSAgICAgIGVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiZmF1bHQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJmYXVsdCIpOyAJICAgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJwb3J0IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYWRkcmVzcyIpOyAJICAgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsgICAgICAgIAotICAgICAgfSAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1hTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1hTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkYWI3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9YU0RFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyCi17ICAgCi0gIHB1YmxpYyBYU0RFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyKCkKLSAgewotICB9ICAJCi0JCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250ZXh0KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUgPSBwYXJlbnRFbGVtZW50LmdldExvY2FsTmFtZSgpOwotCWlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoInR5cGVzIikpIC8vJE5PTi1OTFMtMSQKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJzY2hlbWEiKTsgCSAgIC8vJE5PTi1OTFMtMSQKLQl9CSAgCQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZDFhMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmluZF9hc2N0X3ZhbF9ub3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmluZF9hc2N0X3ZhbF9ub3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjNzMxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRfYXNjdF92YWxfbm90X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRfYXNjdF92YWxfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmluZF9hc2N0X3ZhbF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFkOWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmluZF9hc2N0X3ZhbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2ZTJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmluZGluZ2hlYWRlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZmU1NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDAyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9jb21wbGV4dHlwZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9jb21wbGV4dHlwZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdmODUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvY29tcGxleHR5cGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZGVsZXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2RlbGV0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZGVsZXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2VsZW1lbnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZWxlbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ1ZjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9lcnJvcl9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Vycm9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Vycm9yX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyODExNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZpbGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE3YTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mbGRyX2VsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmxkcl9lbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWMxMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mbGRyX2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWI2OTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2hpZGViaW5kaW5nLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaGlkZWJpbmRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ2Y2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaGlkZWJpbmRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwYWRkcmVzc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwYWRkcmVzc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjIwYzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGJpbmRpbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyOGVmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBiaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBvcGVyYXRpb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cG9wZXJhdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwNDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cG9wZXJhdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwdXJsZW5jb2RlZF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwdXJsZW5jb2RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDUwNTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHB1cmxyZXBsYWNlbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzM1ODdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ltcG9ydF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyNzVhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ltcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaW1wb3J0aGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDBjYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaW5wdXRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaW5wdXRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2YjM0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2lucHV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL21lc3NhZ2Vfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNlNDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9tZXNzYWdlaGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL21lc3NhZ2VoZWFkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhNzExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL21lc3NhZ2VoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL25hbWVzcGFjZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTNmMjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL25hbWVzcGFjZWRlY2xfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlZGVjbF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjc5ZDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlZGVjbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9uZXdfd3NkbF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9uZXdfd3NkbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTA4N2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmV3X3dzZGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL29wZXJhdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODE4YTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL29wZXJhdGlvbmJpbmRpbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTM4NmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vdXRwdXRfbm8uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vdXRwdXRfbm8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI5ZjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X25vLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA5MThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF95ZXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vdXRwdXRfeWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF95ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wYWdlX2Jhbm5lci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhZ2VfYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzBiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhZ2VfYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcGFydF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wYXJ0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTlkZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wYXJ0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzk0OThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0dHlwZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0dHlwZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMyNWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVoZWFkZXJfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVoZWFkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmY2MwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlaGVhZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydGNtcGx4cGx0eXBfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0Y21wbHhwbHR5cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjg2NjQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0Y21wbHhwbHR5cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRlbGVtdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRlbGVtdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODJkMTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0ZWxlbXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0c21wbHR5cF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRzbXBsdHlwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmM3YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRzbXBsdHlwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3F1aWNrYXNzaXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcXVpY2thc3Npc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGFlMmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcXVpY2thc3Npc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NlcnZpY2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNmIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NlcnZpY2Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZWhlYWRlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlaGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDgxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlaGVhZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NpbXBsZXR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2ltcGxldHlwZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVkYmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2ltcGxldHlwZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MjZlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4MGJhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhZGRyZXNzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhdHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGF0dF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGIzNjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGF0dF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYmluZGluZ19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVmNmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJvZHlfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJvZHlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkMDFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBib2R5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2YjFmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBmYXVsdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBoZWFkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyZWEzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGhlYWRlcmZhdWx0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBoZWFkZXJmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjBlMTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGhlYWRlcmZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBvcGVyYXRpb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcG9wZXJhdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MxOTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcG9wZXJhdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy90eXBlc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy90eXBlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY2Zjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdHlwZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy92YWxpZGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzQ3YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy92YWxpZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3dzZGxfZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy93c2RsX2ZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViMWY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3dzZGxfZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2RfZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2RfZmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RjZmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX2ZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3hzZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RjZmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2xhYmVsL3Byb3ZpZGVycy9IVFRQTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9sYWJlbC9wcm92aWRlcnMvSFRUUExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4ZGVmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2xhYmVsL3Byb3ZpZGVycy9IVFRQTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmxhYmVsLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEhUVFBMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBRERSRVNTICAgICAgICAgPSAiYWRkcmVzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQklORElORyAgICAgICAgID0gImJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRVJBVElPTiAgICAgICA9ICJvcGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTF9FTkNPREVEICAgICA9ICJ1cmxFbmNvZGVkIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfUkVQTEFDRU1FTlQgPSAidXJsUmVwbGFjZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEhUVFBMYWJlbFByb3ZpZGVyKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgbWFwLnB1dChBRERSRVNTLCAiaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgbWFwLnB1dChCSU5ESU5HLCAiaWNvbnMvaHR0cGJpbmRpbmdfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgbWFwLnB1dChPUEVSQVRJT04sICJpY29ucy9odHRwb3BlcmF0aW9uX29iai5naWYiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBtYXAucHV0KFVSTF9FTkNPREVELCAiaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgbWFwLnB1dChVUkxfUkVQTEFDRU1FTlQsICJpY29ucy9odHRwdXJscmVwbGFjZW1lbnRfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgCi0gIHsgICAgCi0gICAgTm9kZSBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIFN0cmluZyBpbWFnZU5hbWUgPSAoU3RyaW5nKW1hcC5nZXQobm9kZS5nZXRMb2NhbE5hbWUoKSk7ICAgICAgIAotICAgIHJldHVybiBpbWFnZU5hbWUgIT0gbnVsbCA/IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZU5hbWUpIDogbnVsbDsgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSAgCi0gIHsKLSAgICBOb2RlIG5vZGUgPSAoTm9kZSlvYmplY3Q7Ci0gICAgcmV0dXJuIG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbGFiZWwvcHJvdmlkZXJzL1NPQVBMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2xhYmVsL3Byb3ZpZGVycy9TT0FQTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDYwZWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbGFiZWwvcHJvdmlkZXJzL1NPQVBMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubGFiZWwucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU09BUExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREUkVTUyAgICAgID0gImFkZHJlc3MiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEJPRFkgICAgICAgICA9ICJib2R5IjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCSU5ESU5HICAgICAgPSAiYmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkFVTFQgICAgICAgID0gImZhdWx0IjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFERVIgICAgICAgPSAiaGVhZGVyIjsgIC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBREVSX0ZBVUxUID0gImhlYWRlcmZhdWx0IjsgIC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1BFUkFUSU9OICAgID0gIm9wZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgU09BUExhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgbWFwLnB1dChBRERSRVNTLCAiaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgbWFwLnB1dChCSU5ESU5HLCAiaWNvbnMvc29hcGJpbmRpbmdfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgbWFwLnB1dChCT0RZLCAiaWNvbnMvc29hcGJvZHlfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgbWFwLnB1dChGQVVMVCwgImljb25zL3NvYXBmYXVsdF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXAucHV0KEhFQURFUiwgImljb25zL3NvYXBoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgbWFwLnB1dChIRUFERVJfRkFVTFQsICJpY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgbWFwLnB1dChPUEVSQVRJT04sICJpY29ucy9zb2Fwb3BlcmF0aW9uX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIAotICB7ICAgIAotICAgIE5vZGUgbm9kZSA9IChOb2RlKW9iamVjdDsKLSAgICBTdHJpbmcgaW1hZ2VOYW1lID0gKFN0cmluZyltYXAuZ2V0KG5vZGUuZ2V0TG9jYWxOYW1lKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgcmV0dXJuIGltYWdlTmFtZSAhPSBudWxsID8gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlTmFtZSkgOiBudWxsOyAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpICAKLSAgewotICAgIE5vZGUgbm9kZSA9IChOb2RlKW9iamVjdDsKLSAgICByZXR1cm4gbm9kZS5nZXROb2RlTmFtZSgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzkzNjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1fVUlfREVQRU5ERU5DSUVTX0NIQU5HRUQ9RGVwZW5kZW5jaWVzIENoYW5nZWQKLV9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRF9SRUZSRVNIPU9uZSBvciBtb3JlIGRlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWQuICBEbyB5b3Ugd2FudCB0byByZWZyZXNoIHRoZSBlZGl0b3IgdG8gcmVmbGVjdCB0aGVzZSBjaGFuZ2VzPwotX1VJX0VESVRfTkFNRVNQQUNFU19ESUFMT0dfVElUTEU9RWRpdCBOYW1lc3BhY2VzCi1fVUlfUFJFRl9QQUdFX0NSRUFUSU5HX0ZJTEVTPUNyZWF0aW5nIGZpbGVzCi1fVUlfUkVNRU1CRVJfTVlfREVDSVNJT05fTEFCRUw9UmVtZW1iZXIgbXkgZGVjaXNpb24KLV9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFPURlZmF1bHQgVGFyZ2V0IE5hbWVzcGFjZToKLV9VSV9SRUdFTl9CSU5ESU5HU19PTl9TQVZFX1FVRVNUSU9OTUFSSz1SZWdlbmVyYXRlIEJpbmRpbmdzIE9uIFNhdmU/Ci1fVUlfTEFCRUxfV0FSTklOR19EVVBMSUNBVEVfTkFNRV9FWElTVFM9V2FybmluZzogZHVwbGljYXRlIG5hbWUgYWxyZWFkeSBleGlzdHMKLV9VSV9MQUJFTF9OQU1FU1BBQ0VfVVJJU19UT19CRV9JTkNMVURFRD1OYW1lc3BhY2UgVVJJcyB0byBiZSBpbmNsdWRlZAotX1VJX1BSRUZfUEFHRV9BVVRPX1JFR0VORVJBVEVfQklORElORz1SZWdlbmVyYXRlIEJpbmRpbmcgb24gc2F2ZQotX1VJX1BSRUZfUEFHRV9QUk9NUFRfUkVHRU5fQklORElOR19PTl9TQVZFPVByb21wdCBSZWdlbmVyYXRlIEJpbmRpbmcgb24gc2F2ZQotX1VJX0VESVRfTkFNRVNQQUNFUz1FZGl0IE5hbWVzcGFjZXMuLi4KLV9VSV9BQ1RJT05fQUREX0lNUE9SVD1BZGQgSW1wb3J0Ci1fVUlfQUNUSU9OX0FERF9CSU5ESU5HPUFkZCBCaW5kaW5nCi1fVUlfQUNUSU9OX0FERF9QQVJUPUFkZCBQYXJ0Ci1fVUlfQUNUSU9OX1JFT1JERVJfUEFSVD1SZW9yZGVyIFBhcnQKLV9VSV9BQ1RJT05fUkVPUkRFUl9NRVNTQUdFX1JFRkVSRU5DRT1SZW9yZGVyIE1lc3NhZ2UgUmVmZXJlbmNlCi1fVUlfQUNUSU9OX09QRU5fSU5fTkVXX0VESVRPUj1PcGVuIEluIE5ldyBFZGl0b3IKLV9VSV9BQ1RJT05fRVhJU1RJTkdfTUVTU0FHRT1FeGlzdGluZyBNZXNzYWdlLi4uCi1fVUlfQUNUSU9OX0VYSVNUSU5HX0VMRU1FTlQ9RXhpc3RpbmcgRWxlbWVudC4uLgotX1VJX0VSUk9SX05BTUVTUEFDRV9JTlZBTElEPVRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIGludmFsaWQKLV9VSV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTPUZpbGUgYWxyZWFkeSBleGlzdHM6IHswfQotX1VJX0RFU0NSSVBUSU9OX05FV19XU0RMX0ZJTEU9U3BlY2lmeSB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIG5ldyBXU0RMIGZpbGUuCi1fVUlfUkVHRU5fQklORElORFNfT05fU0FWRT1SZWdlbmVyYXRlIEJpbmRpbmdzIE9uIFNhdmUKLV9VSV9SQURJT19ET0NVTUVOVF9MSVRFUkFMPWRvY3VtZW50IGxpdGVyYWwKLV9VSV9USVRMRV9TUEVDSUZZX1BPUlRUWVBFPVNwZWNpZnkgUG9ydCBUeXBlCi1fVUlfTEFCRUxfQklORElOR19QUk9UT0NPTD1Qcm90b2NvbDoKLV9VSV9MQUJFTF9JTkxJTkVfU0NIRU1BX09GPUlubGluZSBTY2hlbWEgb2YgCi1fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRT1UYXJnZXQgbmFtZXNwYWNlOgotX1VJX0xBQkVMX1BSRUZJWF9XSVRIX0NPTE9OPVByZWZpeDoKLV9VSV9MQUJFTF9DUkVBVEVfV1NETF9TS0VMRVRPTj1DcmVhdGUgV1NETCBTa2VsZXRvbgotX1VJX0xBQkVMX0NSRUFURV9ORVdfV1NETF9GSUxFPUNyZWF0ZSBhIG5ldyBXU0RMIEZpbGUKLV9VSV9MQUJFTF9TT0FQX0JJTkRJTkdfT1BUSU9OUz1TT0FQIEJpbmRpbmcgT3B0aW9ucwotX1VJX0xBQkVMX0hUVFBfQklORElOR19PUFRJT05TPUhUVFAgQmluZGluZyBPcHRpb25zCi1fVUlfTEFCRUxfQUREX0VYVEVOU0lPTl9FTEVNRU5UPUFkZCBFeHRlbnNpb24gRWxlbWVudAotX1VJX1NQRUNJRllfQklORElOR19ERVRBSUxTX0xBQkVMPVNwZWNpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGJpbmRpbmcgdGhhdCB3aWxsIGJlIGNyZWF0ZWQKLV9VSV9TUEVDSUZZX1BPUlRfREVUQUlMU19UT19CRV9DUkVBVEVEPVNwZWNpZnkgdGhlIGRldGFpbHMgb2YgdGhlIHBvcnQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQKLV9VSV9MQUJFTF9ORVdfQklORElORz1OZXcgQmluZGluZwotX1VJX0xBQkVMX05FV19QT1JUVFlQRT1OZXcgUG9ydFR5cGUKLV9VSV9MQUJFTF9SRUZFUkVOQ0VfS0lORD1SZWZlcmVuY2UgS2luZAotX1VJX0xBQkVMX05FV19NRVNTQUdFPU5ldyBNZXNzYWdlCi1fVUlfUkFESU9fUlBDX0VOQ09ERUQ9cnBjIGVuY29kZWQKLV9VSV9SQURJT19SUENfTElURVJBTD1ycGMgbGl0ZXJhbAotX1VJX0FDVElPTl9FWElTVElOR19UWVBFPUV4aXN0aW5nIFR5cGUuLi4KLV9VSV9TUEVDSUZZX1BPUlRfREVUQUlMUz1TcGVjaWZ5IFBvcnQgRGV0YWlscwotX1VJX1RJVExFX1NQRUNJRllfQklORElORz1TcGVjaWZ5IEJpbmRpbmcKLV9VSV9USVRMRV9TUEVDSUZZX0JJTkRJTkdfREVUQUlMUz1TcGVjaWZ5IEJpbmRpbmcgRGV0YWlscwotX1VJX0VSUk9SX0ZJTEVfTVVTVF9FTkRfV0lUSF9XU0RMPUVycm9yOiBGaWxlIG11c3QgZW5kIHdpdGggd3NkbAotX1VJX1RJVExFX1NQRUNJRllfTUVTU0FHRT1TcGVjaWZ5IE1lc3NhZ2UKLV9VSV9USVRMRV9ORVdfV1NETF9GSUxFPU5ldyBXU0RMIEZpbGUKLV9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQ9JykKLV9VSV9BQ1RJT05fUkVOQU1FPVJlbmFtZQotX1VJX0ZPTERFUl9UWVBFUz1UeXBlcwotX1VJX0NBTkNFTF9MQUJFTD1DYW5jZWwKLV9VSV9BQ1RJT05fTkVXX1RZUEU9TmV3IFR5cGUuLi4KLV9VSV9BQ1RJT05fU0VUX1RZUEU9U2V0IFR5cGUKLV9VSV9GT0xERVJfSU1QT1JUUz1JbXBvcnRzCi1fVUlfRk9MREVSX1NFUlZJQ0VTPVNlcnZpY2VzCi1fVUlfRk9MREVSX0JJTkRJTkdTPUJpbmRpbmdzCi1fVUlfRk9MREVSX0lOVEVSRkFDRVM9SW50ZXJmYWNlcwotX1VJX0ZPTERFUl9QT1JUVFlQRVM9UG9ydFR5cGVzCi1fVUlfRk9MREVSX01FU1NBR0VTPU1lc3NhZ2VzCi1fVUlfQUNUSU9OX05FV19NRVNTQUdFPU5ldyBNZXNzYWdlLi4uCi1fVUlfQUNUSU9OX05FV19FTEVNRU5UPU5ldyBFbGVtZW50Li4uCi1fVUlfQUNUSU9OX1NFVF9FTEVNRU5UPVNldCBFbGVtZW50Ci1fVUlfQUNUSU9OX1NFVF9NRVNTQUdFPVNldCBNZXNzYWdlCi1fVUlfQUNUSU9OX1NFVF9CSU5ESU5HPVNldCBCaW5kaW5nCi1fVUlfQ0hFQ0tCT1hfT1ZFUldSSVRFPU92ZXJ3cml0ZSBleGlzdGluZyBiaW5kaW5nIGluZm9ybWF0aW9uCi1fVUlfQUNUSU9OX1NFVF9QT1JUVFlQRT1TZXQgUG9ydFR5cGUKLV9VSV9BQ1RJT05fQUREPUFkZAotX1VJX0FDVElPTl9PUEVOX0lNUE9SVD1PcGVuIEltcG9ydAotX1VJX1VOU1BFQ0lGSUVEPSh1bnNwZWNpZmllZCkKLV9VSV9MQUJFTF9OQU1FPU5hbWUKLV9VSV9MQUJFTF9UWVBFPVR5cGUKLV9VSV9CVVRUT05fTkVXPU5ldy4uLgotX1VJX0xBQkVMX0VMRU1FTlQ9RWxlbWVudAotX1VJX0JVVFRPTl9CUk9XU0U9QnJvd3NlLi4uCi1fVUlfQklORElOR19XSVpBUkQ9QmluZGluZyBXaXphcmQKLV9VSV9CSU5ESU5HPUJpbmRpbmcKLV9VSV9MQUJFTF9NRVNTQUdFPU1lc3NhZ2UKLV9VSV9MQUJFTF9SRU1PVkU9UmVtb3ZlCi1fVUlfVElUTEVfU0VMRUNUPVNlbGVjdAotX1VJX1RJVExFX1NFTEVDVF9GSUxFID0gU2VsZWN0IEZpbGUKLV9VSV9ERVNDUklQVElPTl9TRUxFQ1RfV1NETF9PUl9YU0QgPSBTZWxlY3QgYSBXU0RMIG9yIFhTRCBmaWxlIHRvIGltcG9ydC4KLV9VSV9USVRMRV9PUFRJT05TPU9wdGlvbnMKLV9VSV9ZRVNfTEFCRUw9WWVzCi1fVUlfUE9SVF9UWVBFPVBvcnQgVHlwZQotX1VJX1BPUlRfV0laQVJEPVBvcnQgV2l6YXJkCi1fVUlfTk9fTEFCRUw9Tm8KLV9VSV9BREQ9QWRkLi4uCi1fVUlfSEVMUD1IZWxwCi1fVUlfTEFCRUxfTkFNRV9GSUxURVI9TmFtZSAoPyA9IGNoYXJhY3RlciwgKiA9IGFueSBzdHJpbmcpOgotX1dBUk5fTkFNRV9NVVNUX0NPTlRBSU5fQVRfTEVBU1RfT05FX0NIQVI9SVdBWDE0MTVXIE5hbWUgZmllbGQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIKLV9XQVJOX05BTUVfSEFTX1NQQUNFPUlXQVgxNDAyVyBOYW1lIGZpZWxkIGNhbm5vdCBjb250YWluIGEgc3BhY2UKLV9XQVJOX05BTUVfSU5WQUxJRF9GSVJTVD1JV0FYMTQwM1cgRmlyc3QgY2hhcmFjdGVyIGluIG5hbWUgZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyAoJ18nLCAnOicsICdsZXR0ZXInKQotX1dBUk5fTkFNRV9JTlZBTElEX0NIQVI9SVdBWDE0MDRXIE5hbWUgZmllbGQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIgKCcKLV9XQVJOX1dTSV9DT01QTElBTkNFX1NPQVBfUFJPVE9DT0w9V1MtSSBjb21wbGlhbmNlIHdhcm5pbmc6IHByb3RvY29sIHNob3VsZCBiZSBTT0FQCi1fRVJST1JfV1NJX0NPTVBMSUFOQ0VfU09BUF9QUk9UT0NPTD1XUy1JIGNvbXBsaWFuY2UgZXJyb3I6IHByb3RvY29sIG11c3QgYmUgU09BUAotX1dBUk5fV1NJX0NPTVBMSUFOQ0VfUlBDX0VOQ09ESU5HPVdTLUkgY29tcGxpYW5jZSB3YXJuaW5nOiBiaW5kaW5nIHNob3VsZCBub3QgYmUgcnBjIGVuY29kZWQKLV9FUlJPUl9XU0lfQ09NUExJQU5DRV9SUENfRU5DT0RJTkc9V1MtSSBjb21wbGlhbmNlIGVycm9yOiBiaW5kaW5nIGNhbm5vdCBiZSBycGMgZW5jb2RlZAotX1dTSV9DT01QTElBTkNFX0xJTktfVEVYVD1Nb2RpZnkgcHJvamVjdCBjb21wbGlhbmNlIHNldHRpbmcKLQotX1VJX0xBQkVMX1VOREVGSU5FRF9BUkcxPXswfSB1bmRlZmluZWQKLV9VSV9MQUJFTF9VTkRFRklORURfQVJHMj17MH0gdW5kZWZpbmVkOiAnezF9JwotX1VJX0xBQkVMX09SX1VOREVGSU5FRF9BUkcyPXswfSBvciB7MX0gdW5kZWZpbmVkCi1fVUlfTEFCRUxfT1JfVU5ERUZJTkVEX0FSRzM9ezB9IG9yIHsxfSB1bmRlZmluZWQ6ICd7Mn0nCi1fVUlfTEFCRUxfTk9fT0JKRUNUX1NQRUNJRklFRF9BUkcxPW5vIHswfSBzcGVjaWZpZWQKLV9VSV9MQUJFTF9OT19QQVJBTUVURVJTX1NQRUNJRklFRD1ubyBwYXJhbWV0ZXJzIHNwZWNpZmllZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb25zL0VkaXRvck1vZGVTZWN0aW9uRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbnMvRWRpdG9yTW9kZVNlY3Rpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhNzBkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbnMvRWRpdG9yTW9kZVNlY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWRpdG9yTW9kZVNlY3Rpb25GaWx0ZXIKLXsKLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBcHBsaWNhYmxlKENsYXNzIHNlY3Rpb25DbGFzcywgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbnMvVzExRXh0ZW5zaW9uc1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9ucy9XMTFFeHRlbnNpb25zU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmRhYjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9ucy9XMTFFeHRlbnNpb25zU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFic3RyYWN0TW9kZWxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlci5FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnRleHQuV1NETE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5SZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLkFic3RyYWN0RXh0ZW5zaW9uc1NlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkRPTUV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkRPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgVzExRXh0ZW5zaW9uc1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uCi17Ci0gIFdTRExNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyOwotICAKLSAgcHVibGljIFcxMUV4dGVuc2lvbnNTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0RXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIobmV3IFdTRExFeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcigpKTsKLSAgICBzZXRFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyKG5ldyBXU0RMRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBBZGRFeHRlbnNpb25Db21tYW5kIGdldEFkZEV4dGVuc2lvbkNvbW1hbmQoT2JqZWN0IG8pCi0gIHsKLSAgICBBZGRFeHRlbnNpb25Db21tYW5kIGFkZEV4dGVuc2lvbkNvbW1hbmQgPSBudWxsOwotICAgIEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50ID0gZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoaW5wdXQpOwotICAgIGlmIChleHRlbnNpYmxlRWxlbWVudCAhPSBudWxsKQotICAgIHsgIAotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgbzsKLSAgICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IG5ldyBBZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZChNZXNzYWdlcy5fVUlfTEFCRUxfQUREX0VYVEVOU0lPTl9FTEVNRU5ULCBleHRlbnNpYmxlRWxlbWVudCwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETyAoY3MpIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFkZEV4dGVuc2lvbkNvbW1hbmQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW1vdmVFeHRlbnNpb25Db21tYW5kKE9iamVjdCBvKQotICB7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBOb2RlKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoInJlbW92ZSIsIChOb2RlKW8pOwotICAgIH0gIAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAKLSAgLy8gVE9ETyAoY3MpIHRoZSBBYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uIGlzIHBvbGx1dGVkIHdpdGggWFNEIHNwZWNpYyBzdHVmZgotICAvLyBuZWVkIHRvIGNsZWFuIHRoYXQgdXAhIQotICAvLyBUT0RPIChjcykgd2Ugc2hvdWxkIGF2b2lkIHJlZmVyZW5jaW5nIFdTREwgbW9kZWwgb2JqZWN0cyAuLi4gZ28gdGhydSBmYWNhZGUgaW5zdGVhZAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgeyAgICAKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIGlzUmVhZE9ubHkgPSB0cnVlOyAgICAKLSAgICBFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCA9IGdldEV4dGVuc2libGVFbGVtZW50KGlucHV0KTsKLSAgICBpZiAoZXh0ZW5zaWJsZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7ICAgIAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkKLSAgICAgIHsgIAotICAgICAgICBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gICAgICAgIG1vZGVsQWRhcHRlciA9IFdTRExNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBtb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkuYWRkTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gICAgICB9ICAgICAgICAgCi0gICAgfSAgICAgICAKLSAgICBhZGRCdXR0b24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOyAgICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgbW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpLnJlbW92ZUxpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgIH0gIAotICB9Ci0gIAotICAvLyBUT0RPIChjcykgaW4gdGhlIGZ1dHVyZSB3ZSBuZWVkIHRvICdmaXgnIHRoaW5ncyBzbyB0aGF0IHdlIGNhbiByaWQgb2YgdGhpcyBtZXRob2QKLSAgLy8gd2UgbmVlZCBhIHdheSB0byBkbyBhbGwgb2YgdGhpcyB2aWEgdGhlIGZhY2FkZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgYW55IGRpcmVjdCAKLSAgLy8gZGVwZW5kZW5jeSBvbiB0aGUgV1NETDEuMSBtb2RlbC4vIFNpbWlsYXJseSB0aGlzIGNsYXNzIHNob3VsZG4ndCBuZWVkIHRvICdrbm93JwotICAvLyBhYm91dCBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbiB0aGlzIGlzIGFuIHVuZGVybHlpbmcgZGV0YWlsIHRoYXQgbmVlZHMgdG8gYmUgaGlkZGVuCi0gIC8vIAotICBwcml2YXRlIHN0YXRpYyBFeHRlbnNpYmxlRWxlbWVudCBnZXRFeHRlbnNpYmxlRWxlbWVudChPYmplY3QgbykKLSAgewotICAgIGlmIChvIGluc3RhbmNlb2YgQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24pCi0gICAgeyAgICAgICAgIAotICAgICAgbyA9ICgoQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24pbykuZ2V0TW9kZWwoKTsKLSAgICB9ICAKLSAgICBpZiAobyBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgewotICAgICAgLy8gVE9ETyAoY3MpIHdlIG5lZWQgYSB3YXkgdG8gZG8gYWxsIG9mIHRoaXMgdmlhIHRoZSBmYWNhZGUKLSAgICAgIC8vIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbnkgZGlyZWN0IGRlcGVuZGVuY3kgb24gdGhlIFdTREwxLjEgbW9kZWwKLSAgICAgIC8vIG9mIGNvdXJzZSBhdCB0aGUgbW9tZW50IHdlIGNhbGwgdGhpcyBjbGFzcyB0aGUgVzExRXh0ZW5zaW9uU2VjdGlvbnMKLSAgICAgIC8vIHNvIHRoYXQncyBub3QgYSBwcm9ibGVtLiAgSW4gdGhlIGZ1dHVyZSB0aG91Z2ggd2UnbGwgd2FudCB0byByZXVzZSB0aGlzIAotICAgICAgLy8gY2xhc3MgZm9yIFdTREwgMi4wLgotICAgICAgLy8gICAgICAgCi0gICAgICBvID0gKChBZGFwdGVyKW8pLmdldFRhcmdldCgpOwotICAgIH0gICAgICAKLSAgICBpZiAobyBpbnN0YW5jZW9mIEV4dGVuc2libGVFbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoRXh0ZW5zaWJsZUVsZW1lbnQpbzsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBjcmVhdGVBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nKCkKLSAgeyAgICAKLSAgICBFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCA9IGdldEV4dGVuc2libGVFbGVtZW50KGlucHV0KTsKLSAgICBpZiAoZXh0ZW5zaWJsZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksIGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKSk7ICAgCi0gICAgICBkaWFsb2cuYWRkRWxlbWVudHNUYWJsZUZpbHRlcihuZXcgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZ0ZpbHRlcihleHRlbnNpYmxlRWxlbWVudC5nZXRFbGVtZW50KCkpKTsKLSAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfSAgICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZlN0b3JlKCkKLSAgewotCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gIH0KLSAKLSAgc3RhdGljIGNsYXNzIFdTRExFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7ICAgICAgICAgCi0gICAgICBFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCA9IGdldEV4dGVuc2libGVFbGVtZW50KGlucHV0RWxlbWVudCk7Ci0gICAgICBpZiAoZXh0ZW5zaWJsZUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBkb21FbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRlbnNpYmxlRWxlbWVudC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpLm5leHQoKTsKLSAgICAgICAgICAvLyBhZGQgdGhlIERPTSBlbGVtZW50Ci0gICAgICAgICAgZG9tRWxlbWVudExpc3QuYWRkKGVsZW1lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9tRWxlbWVudExpc3QudG9BcnJheSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotICAgIH0KLSAgfQotICAKLSAgc3RhdGljIGNsYXNzIFdTRExFeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIERPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwcml2YXRlIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoTm9kZSBub2RlKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOyAgICAgIAotICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoKTsgICAgICAKLSAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmdldExhYmVsUHJvdmlkZXIobmFtZXNwYWNlKTsKLSAgICAgIH0gICAgICAgIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0TGFiZWxQcm92aWRlcihlbGVtZW50KTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gICAgICAgIH0gICAgICAgICAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICAgICBJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IGdldExhYmVsUHJvdmlkZXIoZWxlbWVudCk7Ci0gICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0gICAgfSAgICAgICAgCi0gIH0KLSAgLyoqCi0gICAqIFRoaXMgZmlsdGVyIGlzIHRvIGJlIHVzZWQgYnkgdGhlIGRpYWxvZyBpbnZva2VkIHdoZW4gYWRkQnV0dG9uIGlzIHByZXNzZWQKLSAgICovCi0gIHByaXZhdGUgY2xhc3MgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZ0ZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlcgotICB7Ci0gICAgcHJpdmF0ZSBFbGVtZW50IGhvc3RFbGVtZW50OwotCi0gICAgcHVibGljIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2dGaWx0ZXIoRWxlbWVudCBob3N0RWxlbWVudCkKLSAgICB7Ci0gICAgICB0aGlzLmhvc3RFbGVtZW50ID0gaG9zdEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50KS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgICBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIGZpbHRlciA9IChFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyKSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5KCkuZ2V0UHJvcGVydHkobmFtZXNwYWNlLCAiIik7Ci0gICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmaWx0ZXIuaXNWYWxpZENvbnRleHQoaG9zdEVsZW1lbnQsIG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1RyZWVWaWV3ZXJJbnB1dEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRXh0ZW5zaWJsZUVsZW1lbnQgZXh0ZW5zaWJsZUVsZW1lbnQgPSBnZXRFeHRlbnNpYmxlRWxlbWVudChpbnB1dCk7Ci0gICAgcmV0dXJuIGV4dGVuc2libGVFbGVtZW50ICE9IG51bGwgJiYgZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RWxlbWVudCgpID09IGVsZW1lbnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9ucy9XMTFNZXNzYWdlUmVmZXJlbmNlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb25zL1cxMU1lc3NhZ2VSZWZlcmVuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMDhiMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb25zL1cxMU1lc3NhZ2VSZWZlcmVuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQVNET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnMuTmFtZVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5SZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLQotcHVibGljIGNsYXNzIFcxMU1lc3NhZ2VSZWZlcmVuY2VTZWN0aW9uIGV4dGVuZHMgTmFtZVNlY3Rpb24gewotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIE5FV19TVFJJTkcgPSBNZXNzYWdlcy5fVUlfQlVUVE9OX05FVzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEJST1dTRV9TVFJJTkcgPSBNZXNzYWdlcy5fVUlfQlVUVE9OX0JST1dTRTsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBDTGFiZWwgY29tYm9MYWJlbDsgCi0JcHJvdGVjdGVkIENDb21ibyBjb21ibzsKLQlwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVmTWFuYWdlcjsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljcmVhdGVDb250cm9sQXJlYSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sQXJlYSgpCi0JewotCQlGb3JtRGF0YSBkYXRhOwotCQkKLQkJY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0JCWNvbWJvLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0JCWNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21ibywgQVNERWRpdG9yQ1NIZWxwSWRzLlBST1BFUlRJRVNfTUVTU0FHRV9SRUZfTUVTU0FHRV9DT01CTyk7Ci0JCQotCQljb21ib0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9NRVNTQUdFICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAwLCBTV1QuQ0VOVEVSKTsKLQkJY29tYm9MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLS8vCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lVGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzdXBlci5yZWZyZXNoKCk7Ci0JCWlmIChuYW1lVGV4dC5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJU3RyaW5nIHJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCWNvbWJvLmFkZChCUk9XU0VfU1RSSU5HKTsKLQkJY29tYm8uYWRkKE5FV19TVFJJTkcpOwotCQkKLQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmID0gKE1lc3NhZ2VSZWZlcmVuY2UpICgoVzExTWVzc2FnZVJlZmVyZW5jZSkgZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChtZXNzYWdlUmVmICE9IG51bGwgJiYgbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCXJlZk5hbWUgPSBtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJfQotCQkKLQkJQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotCQlpZiAoZWRpdE1hbmFnZXIgIT0gbnVsbCkgewotCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHNwZWNzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNwZWNzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCWNvbWJvLmFkZCgoU3RyaW5nKSBzcGVjc1tpbmRleF0uZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQkJCi0JCQotCQlTdHJpbmdbXSBpdGVtcyA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0JCWludCBpbmRleDsKLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaXRlbXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAoaXRlbXNbaW5kZXhdLmVxdWFscyhyZWZOYW1lKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoaW5kZXggPCBpdGVtcy5sZW5ndGgpIHsKLQkJCS8vIEZvdW5kIGEgbWF0Y2gKLQkJCWNvbWJvLnNlbGVjdChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb21iby5zZXRUZXh0KHJlZk5hbWUpOwotCQl9Ci0KLQkJc2V0Q29udHJvbEZvcmVncm91bmRDb2xvcihjb21ibyk7Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQotCi0vLwkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmID0gKE1lc3NhZ2VSZWZlcmVuY2UpICgoVzExTWVzc2FnZVJlZmVyZW5jZSkgZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0vLwkJSXRlcmF0b3IgaXQgPSBtZXNzYWdlUmVmLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFTWVzc2FnZXMoKS5pdGVyYXRvcigpOwotLy8JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLS8vCQkJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGl0Lm5leHQoKTsKLS8vCQkJY29tYm8uYWRkKG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0vLwkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKSB7Ci0JCWlmIChyZWZNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiByZWZNYW5hZ2VyOwotCQl9Ci0KLQkJcmVmTWFuYWdlciA9IFJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyLmdldE1lc3NhZ2VSZWZlcmVuY2VFZGl0TWFuYWdlcigoSUFTRE9iamVjdCkgZ2V0TW9kZWwoKSk7Ci0gICAgICAgIAotCQlyZXR1cm4gcmVmTWFuYWdlcjsKLQl9Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0JewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGNvbWJvKSB7Ci0JCQlpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiAhaXNJbkRvSGFuZGxlKSAKLQkJCXsKLQkJCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJCXN0YXJ0RGVsYXllZEV2ZW50KGV2ZW50KTsKLQkJCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotCXsKLQkJc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gY29tYm8pIHsKLQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAtMSkgewotCQkJCXZhbHVlID0gY29tYm8uZ2V0SXRlbShjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0KLQkJCQotCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gbnVsbDsKLQkJCWludCBjb250aW51ZUFwcGx5ID0gV2luZG93Lk9LOwotCQkJSU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZiA9IChJTWVzc2FnZVJlZmVyZW5jZSkgdGhpcy5nZXRNb2RlbCgpOwotCQkJCi0JCQlpZiAodmFsdWUuZXF1YWxzKE5FV19TVFJJTkcpKSB7Ci0JCQkJQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotCQkJCUlDb21wb25lbnREaWFsb2cgZGlhbG9nID0gZWRpdE1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0JCQkJY29udGludWVBcHBseSA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0JCQkJc3BlYyA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotCQkJfQotCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzKEJST1dTRV9TVFJJTkcpKSB7Ci0JCQkJQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotCQkJCUlDb21wb25lbnREaWFsb2cgZGlhbG9nID0gZWRpdE1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0JCQkJY29udGludWVBcHBseSA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0JCQkJc3BlYyA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwkJCQkKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNwZWMgPSBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uRm9yVmFsdWUoKFN0cmluZyl2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChjb250aW51ZUFwcGx5ID09IFdpbmRvdy5PSykgewotCQkJCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLQkJCQlpZiAoc3BlYyAhPSBudWxsKSB7Ci0JCQkJCWVkaXRNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShtZXNzYWdlUmVmLCBzcGVjKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNpZmljYXRpb25Gb3JWYWx1ZShTdHJpbmcgdmFsdWUpCi0JewotCQlDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0JCWlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotCQl7ICAKLQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb25bXSBxdWlja1BpY2tzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCQkJaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLQkJCXsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLQkJCQkJaWYgKHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0JCQkJCXsKLQkJCQkJCXJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotCQkJCQl9ICAgICAgICAgICAgICAgIAotCQkJCX0gIAotCQkJfQotCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBlZGl0TWFuYWdlci5nZXRIaXN0b3J5KCk7Ci0JCQlpZiAoaGlzdG9yeSAhPSBudWxsKQotCQkJewotCQkJCWZvciAoaW50IGk9MDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspCi0JCQkJewotCQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBoaXN0b3J5W2ldOwotCQkJCQlpZiAodmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLQkJCQkJeyAgCi0JCQkJCQlyZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQkJCQkJfQotCQkJCX0gIAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbnMvVzExTWVzc2FnZVJlZmVyZW5jZVNlY3Rpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9ucy9XMTFNZXNzYWdlUmVmZXJlbmNlU2VjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM1NTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9ucy9XMTFNZXNzYWdlUmVmZXJlbmNlU2VjdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFcxMU1lc3NhZ2VSZWZlcmVuY2VTZWN0aW9uRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JLy8gcm1haDogd2Ugc2hvdWxkIGNvbnNpZGVyIG90aGVyIHdheXMgb2YgJ2V4dGVuZGluZycgdGhpcyBjYXBhYmlsaXR5Ci0JLy8gcmF0aGVyIHRoYW4gc2ltcGx5IGNoZWNraW5nIGEgdmFyaWFibGUuLi4uCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dXMTFNZXNzYWdlUmVmZXJlbmNlU2VjdGlvbiA9IHRydWU7Ci0JCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJaWYgKHRvVGVzdCBpbnN0YW5jZW9mIElNZXNzYWdlUmVmZXJlbmNlICYmIHNob3dXMTFNZXNzYWdlUmVmZXJlbmNlU2VjdGlvbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb25zL1cxMVBhcmFtZXRlclNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9ucy9XMTFQYXJhbWV0ZXJTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjAxYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb25zL1cxMVBhcmFtZXRlclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExUGFyYW1ldGVyRm9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUFTRE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnMuUGFyYW1ldGVyU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5SZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVzExUGFyYW1ldGVyU2VjdGlvbiBleHRlbmRzIFBhcmFtZXRlclNlY3Rpb24gewotCXByb3RlY3RlZCBCdXR0b24gdHlwZVJhZGlvOwotCXByb3RlY3RlZCBCdXR0b24gZWxlbWVudFJhZGlvOwotCXByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZWZNYW5hZ2VyOwotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xBcmVhKCkJewotCQlzdXBlci5jcmVhdGVDb250cm9sQXJlYSgpOwotCQlGb3JtRGF0YSBkYXRhOwotCQkKLQkJQ0xhYmVsIHJlZmVyZW5jZUtpbmRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfUkVGRVJFTkNFX0tJTkQgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQ29tcG9zaXRlIGNvbXAgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gNTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXAsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tcCwgMCwgU1dULkNFTlRFUik7Ci0JCXJlZmVyZW5jZUtpbmRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJdHlwZVJhZGlvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wLCBNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRSwgU1dULlJBRElPKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50UmFkaW8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXAsIE1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5ULCBTV1QuUkFESU8pOwkgLy8kTk9OLU5MUy0xJAotCQl0eXBlUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWVsZW1lbnRSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0eXBlUmFkaW8sIEFTREVkaXRvckNTSGVscElkcy5QUk9QRVJUSUVTX1BBUlRfVFlQRV9SQURJTyk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZWxlbWVudFJhZGlvLCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPUEVSVElFU19QQVJUX0VMRU1FTlRfUkFESU8pOwotCQkKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJVzExUGFyYW1ldGVyRm9yUGFydCBwYXJhbWV0ZXIgPSAoVzExUGFyYW1ldGVyRm9yUGFydCkgdGhpcy5nZXRNb2RlbCgpOwotCQlQYXJ0IHBhcnQgPSAoUGFydCkgcGFyYW1ldGVyLmdldFRhcmdldCgpOwotCQkKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVSYWRpbyAmJiB0eXBlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWNvbWJvTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRSsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCB0cnVlLCBudWxsKTsKLQkJCXN1cGVyLnJlZnJlc2hDb21ibygpOwotCQl9Ci0JCWVsc2UgaWYgKGUud2lkZ2V0ID09IGVsZW1lbnRSYWRpbyAmJiBlbGVtZW50UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWNvbWJvTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVCArICI6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UocGFydCwgZmFsc2UsIG51bGwpOwotCQkJcmVmcmVzaEVsZW1lbnRDb21ibygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBjb21ibykgewotCQkJaWYgKGVsZW1lbnRSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotCQkJCS8vIEhhbmRsZSBFbGVtZW50IHNlbGVjdGlvbgotCQkJCVN0cmluZyB2YWx1ZSA9IGNvbWJvLmdldEl0ZW0oY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJCi0JCQkJVzExUGFyYW1ldGVyRm9yUGFydCBwYXJhbWV0ZXIgPSAoVzExUGFyYW1ldGVyRm9yUGFydCkgdGhpcy5nZXRNb2RlbCgpOwotCQkJCQotCQkJCWlmICh2YWx1ZS5lcXVhbHMoTkVXX1NUUklORykpIHsKLQkJCQkJQ29tbWFuZCBjb21tYW5kID0gcGFyYW1ldGVyLmdldFNldEVsZW1lbnRDb21tYW5kKElQYXJhbWV0ZXIuU0VUX05FV19BQ1RJT05fSUQpOwotCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzKEJST1dTRV9TVFJJTkcpKSB7Ci0JCQkJCUNvbW1hbmQgY29tbWFuZCA9IHBhcmFtZXRlci5nZXRTZXRFbGVtZW50Q29tbWFuZChJUGFyYW1ldGVyLlNFTEVDVF9FWElTVElOR19BQ1RJT05fSUQpOwotCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0RWxlbWVudENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0JCQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IGdldENvbXBvbmVudFNwZWNpZmljYXRpb25Gb3JWYWx1ZSgoU3RyaW5nKXZhbHVlKTsKLQkJCQkJaWYgKHNwZWMgIT0gbnVsbCkgewotCQkJCQkJZWRpdE1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHBhcmFtZXRlciwgc3BlYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotCQlyZWZyZXNoKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hFbGVtZW50Q29tYm8oKSB7Ci0JCi0JCQkvLyBSZWZyZXNoIHdpdGggRWxlbWVudHMKLQkJCUlQYXJhbWV0ZXIgcGFyYW0gPSBudWxsOwotCQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCQkKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElQYXJhbWV0ZXIpIHsKLQkJCQlwYXJhbSA9IChJUGFyYW1ldGVyKSBtb2RlbDsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gIlBhcmFtZXRlclNlY3Rpb24uamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwYXJhbSAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IHBhcmFtLmdldE5hbWUoKTsKLQkJCQllbGVtZW50TmFtZSA9IHBhcmFtLmdldENvbXBvbmVudE5hbWUoKTsKLQkJCX0KLQotCQkJaWYgKCFuYW1lVGV4dC5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQkJbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLQkJCX0KLQkJCQotCQkJLy8gUG9wdWxhdGUgdGhlIENvbWJvCi0JCQljb21iby5yZW1vdmVBbGwoKTsKLQkJCWNvbWJvLmFkZChCUk9XU0VfU1RSSU5HKTsKLQkJCWNvbWJvLmFkZChORVdfU1RSSU5HKTsKLQkJCQotCQkJQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSBnZXRFbGVtZW50Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLQkJCWlmIChlZGl0TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHNwZWNzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzcGVjcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJY29tYm8uYWRkKChTdHJpbmcpIHNwZWNzW2luZGV4XS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gRGlzcGxheSB0aGUgZWxlbWVudCBpbiB0aGUgQ29tYm8KLQkJCVN0cmluZ1tdIGl0ZW1zID0gY29tYm8uZ2V0SXRlbXMoKTsKLQkJCWludCBpbmRleDsKLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCWlmIChpdGVtc1tpbmRleF0uZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChpbmRleCA8IGl0ZW1zLmxlbmd0aCkgewotCQkJCS8vIEZvdW5kIGEgbWF0Y2gKLQkJCQljb21iby5zZWxlY3QoaW5kZXgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29tYm8uc2V0VGV4dChlbGVtZW50TmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQkKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVzExUGFyYW1ldGVyRm9yUGFydCkgewotCQkJVzExUGFyYW1ldGVyRm9yUGFydCBwYXJhbSA9IChXMTFQYXJhbWV0ZXJGb3JQYXJ0KSBtb2RlbDsKLQkJCVBhcnQgcGFydCA9IChQYXJ0KSBwYXJhbS5nZXRUYXJnZXQoKTsKLQkJCWlmIChwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotCQkJCXR5cGVSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJZWxlbWVudFJhZGlvLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJY29tYm9MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaGFuZGxlVHlwZVNjZW5hcmlvID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkgewotCQkJCXR5cGVSYWRpby5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCWVsZW1lbnRSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJY29tYm9MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5UICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaGFuZGxlVHlwZVNjZW5hcmlvID0gZmFsc2U7Ci0JCQkJcmVmcmVzaEVsZW1lbnRDb21ibygpOwkJCQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gTmVpdGhlciBhIFR5cGUgb3IgRWxlbWVudAotCQkJCXR5cGVSYWRpby5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCWVsZW1lbnRSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7CQkJCQotCQkJfQotCQl9Ci0JCi0JCXNldENvbnRyb2xGb3JlZ3JvdW5kQ29sb3IoZWxlbWVudFJhZGlvKTsKLQkJc2V0Q29udHJvbEZvcmVncm91bmRDb2xvcih0eXBlUmFkaW8pOwotCQkKLQkJc3VwZXIucmVmcmVzaCgpOwotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRFbGVtZW50Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKSB7Ci0JCWlmIChyZWZNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiByZWZNYW5hZ2VyOwotCQl9Ci0JCQotCQlyZWZNYW5hZ2VyID0gUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXIuZ2V0WFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKChJQVNET2JqZWN0KSBnZXRNb2RlbCgpKTsKLQkJCi0JCXJldHVybiByZWZNYW5hZ2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9ucy9XMTFQYXJhbWV0ZXJTZWN0aW9uRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbnMvVzExUGFyYW1ldGVyU2VjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzVkODJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9ucy9XMTFQYXJhbWV0ZXJTZWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkVkaXRvck1vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVzExUGFyYW1ldGVyU2VjdGlvbkZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIKLXsKLSAgcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmICh0b1Rlc3QgaW5zdGFuY2VvZiBJUGFyYW1ldGVyKQotICAgIHsgIAotICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcikgZWRpdG9yLmdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdG9yTW9kZVNlY3Rpb25GaWx0ZXIgZmlsdGVyID0gKEVkaXRvck1vZGVTZWN0aW9uRmlsdGVyKSBtYW5hZ2VyLmdldEN1cnJlbnRNb2RlKCkuZ2V0QWRhcHRlcihFZGl0b3JNb2RlU2VjdGlvbkZpbHRlci5jbGFzcyk7Ci0gICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbHRlci5pc0FwcGxpY2FibGUoVzExUGFyYW1ldGVyU2VjdGlvbi5jbGFzcywgdG9UZXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVjb25jaWxlci9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JXU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZGRkYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JXU0RMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVjb25jaWxlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgcGVyZm9ybXMgdGhlIGFzLXlvdS10eXBlIHZhbGlkYXRpb24KLSAqIEBhdXRob3IgTWFyayBIdXRjaGluc29uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvcldTREwgZXh0ZW5kcyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yCi17Ci0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEQVRPUl9DTEFTUyA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2UuV1NETERlbGVnYXRpbmdWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkIAotCi0gIHB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETCgpCi0gIHsgCi0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0RGVsZWdhdGVWYWxpZGF0b3IoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5ID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmdldFZhbGlkYXRvcihWQUxJREFUT1JfQ0xBU1MpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgeyAvLwotICAgIH0gCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihmaWxlLmdldFByb2plY3QoKSk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoVkFMSURBVE9SX0NMQVNTKTsKLQkJCWlmIChjb25maWd1cmF0aW9uLmlzQnVpbGRFbmFibGVkKHZtZCkgfHwgY29uZmlndXJhdGlvbi5pc01hbnVhbEVuYWJsZWQodm1kKSkKLQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCWVsc2UKLQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETEh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWJhMjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIFdTRExIeXBlcmxpbmsga25vd3MgaG93IHRvIG9wZW4gbGlua3MgZnJvbSB3c2RsIGZpbGVzLgotICogCi0gKiBAc2VlIFdTRExIeXBlcmxpbmtEZXRlY3RvcgotICovCi1wdWJsaWMgY2xhc3MgV1NETEh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsKLXsKLSAgcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0gIHByaXZhdGUgU3RyaW5nIGZSZXNvdXJjZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZlNwZWM7Ci0KLSAgcHVibGljIFdTRExIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIHNwZWMpCi0gIHsKLSAgICBmUmVnaW9uID0gcmVnaW9uOwotICAgIGZSZXNvdXJjZSA9IHJlc291cmNlOwotICAgIGZTcGVjID0gc3BlYzsKLSAgfQotCi0gIHB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpCi0gIHsKLSAgICByZXR1cm4gZlJlZ2lvbjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgb3BlbigpCi0gIHsKLSAgICAvKgotICAgICAqIElTU1VFOiBUaGVyZSBhcmUgY2xlYW5lciB3YXlzIHRvIGZpbmQgdGhlIHJpZ2h0IGZpbGUgYmFzZWQgb24gYSBVUkkKLSAgICAgKiBzdHJpbmcgYW5kIGNsZWFuZXIgd2F5cyB0byBmaW5kIHdoaWNoIGVkaXRvciB0byBvcGVuIGZvciB0aGUgZmlsZS4gU2VlCi0gICAgICogb3RoZXIgSUh5cGVybGluayBhbmQgSUh5cGVybGlua0RldGVjdG9yIGltcGxlbWVudG9ycyBmb3IgZXhhbXBsZXMuCi0gICAgICovCi0gICAgU3RyaW5nIHBhdHRlcm4gPSAicGxhdGZvcm06L3Jlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChmUmVzb3VyY2UgIT0gbnVsbCAmJiBmUmVzb3VyY2Uuc3RhcnRzV2l0aChwYXR0ZXJuKSkKLSAgICB7Ci0gICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChmUmVzb3VyY2Uuc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpKTsKLSAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0KLSAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLSAgICAgIC8vIFdoZW4gdXNpbmcgdGhlIGN1cnNvciBvciB0aGUgbW91c2UgdG8gbW92ZSBhcm91bmQgaW4gdGhlIHRleHQKLSAgICAgIC8vIGVkaXRvciwgdGhlIGxvY2F0aW9uIGhpc3RvcnkgaXMgbm90IHVwZGF0ZWQsIHNvIHdlIG1ha2Ugc3VyZSB3ZSBrZWVwCi0gICAgICAvLyBhIHJlZmVyZW5jZSB0byB3aGVyZSB3ZSBhcmUuIElmIHdlIHVzZSBvdGhlciBuYXZpZ2F0aW9uIG1lYW5zLCBsaWtlIHRoZQotICAgICAgLy8gb3V0bGluZSB2aWV3LCB0aGlzIGNhbGwgd2lsbCBub3QgYWRkIGEgbmV3IGxvY2F0aW9uIGhpc3RvcnkgZW50cnksIGFzCi0gICAgICAvLyBpdCBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBsb2NhdGlvbiBzZXQgdGhyb3VnaCB0aGUgb3V0bGluZSBkcml2ZW4KLSAgICAgIC8vIG5hdmlnYXRpb24uCi0KLSAgICAgIGJvb2xlYW4gc2FtZUVkaXRvciA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgJiYgKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKS5lcXVhbHMoZmlsZSk7Ci0KLSAgICAgIHdvcmtiZW5jaFBhZ2UuZ2V0TmF2aWdhdGlvbkhpc3RvcnkoKS5tYXJrTG9jYXRpb24oZWRpdG9yUGFydCk7Ci0KLSAgICAgIGlmICghc2FtZUVkaXRvcikKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBUaGUgdGFyZ2V0IGlzIGluIGEgZGlmZmVyZW50IGZpbGUsIHNvIG9wZW4gdGhlIHRhcmdldCdzIGVuY2xvc2luZwotICAgICAgICAgIC8vIHJlc291cmNlIGluIGl0J3Mgb3duIGVkaXRvci4gTGV0IHRoZSB3b3JrYmVuY2ggZGVjaWRlIHdoYXQgZWRpdG9yCi0gICAgICAgICAgLy8gdG8gb3BlbiBiYXNlZCBvbiB0aGUgZmlsZSdzIGNvbnRlbnQgdHlwZS4KLQotICAgICAgICAgIGVkaXRvclBhcnQgPSBJREUub3BlbkVkaXRvcih3b3JrYmVuY2hQYWdlLCBmaWxlLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotLy8gICAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBBdHRlbXB0IHRvIHJldHJpZXZlIHRoZSB0YXJnZXQgZWRpdG9yJ3Mgc2VsZWN0aW9uIG1hbmFnZXIgYW5kIHRyeSB0bwotICAgICAgLy8gY2hhbmdlIHRoZSBzZWxlY3Rpb24gdG8gdGhlIHRoaW5nIChzY2hlbWEgY29tcG9uZW50LCB3c2RsIGVsZW1lbnQsIGV0YykKLSAgICAgIC8vIHBvaW50ZWQgdG8gYnkgZlNwZWMuCi0KLSAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZTcGVjKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETEh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETEh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjdkNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90ZXh0L1dTRExIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RIeXBlcmxpbmtEZXRlY3RvcjsKLS8qKgotICogRGV0ZWN0cyBoeXBlcmxpbmtzIGZvciBXU0RMIGZpbGVzLiBVc2VkIGJ5IHRoZSBXU0RMIHRleHQgZWRpdG9yIHRvIHByb3ZpZGUgYQotICogIkdvIHRvIGRlY2xhcmF0aW9uIiBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZSBKYXZhCi0gKiBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMSHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBYU0RIeXBlcmxpbmtEZXRlY3RvcgotewotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqLwotICBwcm90ZWN0ZWQgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoSURvY3VtZW50IGRvY3VtZW50LCBJRE9NTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikKLSAgewotICAgIC8vIEhlcmUgd2UncmUgdHJ5aW5nIHRvIGZpbmQgdGhlIHRhcmdldCBjb21wb25lbnQncyByZXNvdXJjZSBhbmQgc3BlYy4KLQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb24oZG9jdW1lbnQpOwotICAgIE9wZW5PblNlbGVjdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgT3Blbk9uU2VsZWN0aW9uSGVscGVyKGRlZmluaXRpb24pOwotICAgIFN0cmluZ1tdIHRhcmdldERhdGEgPSBoZWxwZXIuY29tcHV0ZVNwZWNpZmljYXRpb24obm9kZSk7Ci0KLSAgICBpZiAodGFyZ2V0RGF0YSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyByZXNvdXJjZSA9IHRhcmdldERhdGFbMF07Ci0gICAgICBTdHJpbmcgc3BlYyA9IHRhcmdldERhdGFbMV07Ci0gICAgICByZXR1cm4gbmV3IFdTRExIeXBlcmxpbmsocmVnaW9uLCByZXNvdXJjZSwgc3BlYyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZGVmaW5pdGlvbiBmcm9tIGRvY3VtZW50Ci0gICAqIAotICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICogQHJldHVybiBEZWZpbml0aW9uCi0gICAqLwotICBwcml2YXRlIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLSAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgSURPTURvY3VtZW50IGRvbURvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRG9jICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgV1NETE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSAoV1NETE1vZGVsQWRhcHRlcikgZG9tRG9jLmdldEFkYXB0ZXJGb3IoV1NETE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgICAgICAvLyBJU1NVRTogaWYgYWRhcHRlciBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciBkb21Eb2MgZ2V0QWRhcHRlckZvcgotICAgICAgICAgICAgLy8gd2lsbCBjcmVhdGUgb25lLiBTbyB3aHkgaXMgdGhpcyBudWxsIGNoZWNrL2NyZWF0aW9uIG5lZWRlZD8KLSAgICAgICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyID0gbmV3IFdTRExNb2RlbEFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgZG9tRG9jLmFkZEFkYXB0ZXIobW9kZWxBZGFwdGVyKTsKLSAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyLmNyZWF0ZURlZmluaXRpb24oZG9tRG9jLmdldERvY3VtZW50RWxlbWVudCgpLCBkb21Eb2MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmaW5pdGlvbiA9IG1vZGVsQWRhcHRlci5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIG1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTGlua2FibGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBib29sZWFuIGlzTGlua2FibGUgPSBzdXBlci5pc0xpbmthYmxlQXR0cmlidXRlKG5hbWUpfHwKLSAgICBuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLkJJTkRJTkdfQVRUUklCVVRFKSB8fCAKLSAgICBuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLkVMRU1FTlRfQVRUUklCVVRFKSB8fCAKLSAgICBuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSB8fCAKLSAgICBuYW1lLmVxdWFscyhXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFKTsgCi0gICAgcmV0dXJuIGlzTGlua2FibGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMTW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg3YmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9ucy5FeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5Nb2RlbFJlY29uY2lsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFdTRExNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIE1vZGVsUmVjb25jaWxlQWRhcHRlciBtb2RlbFJlY29uY2lsZUFkYXB0ZXI7Ci0KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxBZGFwdGVyLmNsYXNzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oRWxlbWVudCBlbGVtZW50LCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uKGRvY3VtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oZmluYWwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKSBkb2N1bWVudDsKLSAgICAgIFN0cmluZyBiYXNlTG9jYXRpb24gPSAiYmxhbmtXU0RMLndzZGwiOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoZG9tTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBiYXNlTG9jYXRpb24gPSBkb21Ob2RlLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgewotICAgICAgICBJRE9NTW9kZWwgZG9tTW9kZWwgPSAoKElET01Ob2RlKSBkb2N1bWVudCkuZ2V0TW9kZWwoKTsKLSAgICAgICAgYmFzZUxvY2F0aW9uID0gZG9tTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0gICAgICB9Ci0gICAgICByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFdTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgIC8vIFRPRE8uLiAucmV2aXN0IHRoZSBiZXN0IGFwcHJvYWNoIHRvIG9idGFpbiBhIFVSSSBmcm9tIHRoZSBTU0UgbW9kZWwKLSAgICAgIC8vCi0gICAgICBVUkkgdXJpID0gbnVsbDsKLSAgICAgIGlmIChiYXNlTG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgICB9Ci0gICAgICBkZWZpbml0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKHVyaS50b1N0cmluZygpKTsKLSAgICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCi0gICAgICBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCByZXNvdXJjZUZhY3RvcnkgPSBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKTsKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotICAgICAgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0gICAgICByZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0KLSAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBzZXRFbGVtZW50T3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgLy8gVXNlIHRoZSBhbmltYXRlZCBmbGF2b3VyIGFzIHdlIGRvbid0IGtub3cgYmVmb3JlaGFuZCBob3cgbWFueSB0aWNrcyB3ZSBuZWVkLgotICAgICAgICAgIC8vIFRoZSB0YXNrIG5hbWUgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgdGhlIGNvZGUgaW4gV1NETFJlc291cmNlSW1wbCBhbmQgWFNEUmVzb3VyY2VJbXBsLgotICAgICAgICAgIAotICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICBNYXAgbG9hZE9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpOwotICAgICAgICAgIAotICAgICAgICAgIGxvYWRPcHRpb25zLnB1dChXU0RMUmVzb3VyY2VJbXBsLldTRExfUFJPR1JFU1NfTU9OSVRPUiwgbW9uaXRvcik7Ci0gICAgICAgICAgbG9hZE9wdGlvbnMucHV0KFhTRFJlc291cmNlSW1wbC5YU0RfUFJPR1JFU1NfTU9OSVRPUiwgbW9uaXRvcik7Ci0gICAgICAgICAgCi0gICAgICAgICAgZGVmaW5pdGlvbi5zZXRFbGVtZW50KGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgICAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS5yZWNvbmNpbGVSZWZlcmVuY2VzKHRydWUpOwotICAgICAgICAgIAotICAgICAgICAgIGxvYWRPcHRpb25zLnJlbW92ZShXU0RMUmVzb3VyY2VJbXBsLldTRExfUFJPR1JFU1NfTU9OSVRPUik7Ci0gICAgICAgICAgbG9hZE9wdGlvbnMucmVtb3ZlKFhTRFJlc291cmNlSW1wbC5YU0RfUFJPR1JFU1NfTU9OSVRPUik7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIElQcm9ncmVzc1NlcnZpY2UgcHJvZ3Jlc3NTZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBwcm9ncmVzc1NlcnZpY2UuYnVzeUN1cnNvcldoaWxlKHNldEVsZW1lbnRPcGVyYXRpb24pOwotICAgICAgfQotICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfSAgICAgICAgICAgICAKLSAgICAgIAotICAgICAgLy8gYXR0YWNoIGFuIGFkYXB0ZXIgdG8ga2VlcCB0aGUgV1NETCBtb2RlbCBhbmQgRE9NIGluIHN5bmMKLSAgICAgIC8vCi0gICAgICBtb2RlbFJlY29uY2lsZUFkYXB0ZXIgPSBuZXcgV1NETE1vZGVsUmVjb25jaWxlQWRhcHRlcihkb2N1bWVudCwgZGVmaW5pdGlvbik7Ci0gICAgICBkb21Ob2RlLmdldE1vZGVsKCkuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKG1vZGVsUmVjb25jaWxlQWRhcHRlcik7Ci0gICAgICAKLSAgICAgIC8vIFRPRE8uLi4gQ1MgOiByZXZpc2l0IHRoaXMgbGluZQotICAgICAgLy8gY3VycmVudGx5IHRoaXMgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSAndHlwZScgc3lzdGVtIHdpdGggdGhlIGRlZmluaXRpb24KLSAgICAgIC8vIEkgc3VzcGVjdCB0aGF0IHRoaXMgY291bGQgYmUgbWFkZSBhIHdob2xlIGxvdCBtb3JlIHNpbXBsZQotICAgICAgLy8KLSAgICAgIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuc2V0VHlwZVN5c3RlbVByb3ZpZGVyKGRlZmluaXRpb24sIG5ldyBFeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIE1vZGVsUmVjb25jaWxlQWRhcHRlciBnZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUmVjb25jaWxlQWRhcHRlcjsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFdTRExNb2RlbEFkYXB0ZXIgbG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBXU0RMTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotICAgIGlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpCi0gICAgewotICAgICAgSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKWRvY3VtZW50OwotICAgICAgYWRhcHRlciA9IChXU0RMTW9kZWxBZGFwdGVyKW5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoV1NETE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICBpZiAoYWRhcHRlciA9PSBudWxsKQotICAgICAgewotICAgICAgICBhZGFwdGVyID0gbmV3IFdTRExNb2RlbEFkYXB0ZXIoKTsgICAgICAgCi0gICAgICAgIG5vdGlmaWVyLmFkZEFkYXB0ZXIoYWRhcHRlcik7ICAgICAgICAKLSAgICAgIH0gCi0gICAgfSAgIAotICAgIHJldHVybiBhZGFwdGVyOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlN2E5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFdTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICBwcm90ZWN0ZWQgQ3VzdG9tV1NETE1vZGVsTG9jYXRvciBjdXN0b21XU0RMTW9kZWxMb2NhdG9yID0gbmV3IEN1c3RvbVdTRExNb2RlbExvY2F0b3IoKTsKLSAgCi0gIGNsYXNzIEN1c3RvbVdTRExNb2RlbExvY2F0b3IgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFdTRExNb2RlbExvY2F0b3IKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gICAgewotICAgICAgcmV0dXJuIFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZSwgbG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gV1NETE1vZGVsTG9jYXRvci5jbGFzczsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIHR5cGUgPT0gV1NETE1vZGVsTG9jYXRvci5jbGFzczsKLSAgfQotCi0gIHB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gY3VzdG9tV1NETE1vZGVsTG9jYXRvcjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMTW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90ZXh0L1dTRExNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MmU0YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90ZXh0L1dTRExNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlci5FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQuWFNETW9kZWxRdWVyeUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5kcyBYU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uCi17Ci0gIHB1YmxpYyBXU0RMTW9kZWxRdWVyeUV4dGVuc2lvbigpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzUGFyZW50RWxlbWVudE1lc3NhZ2VSZWZlcmVuY2UoU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiaW5wdXQiKSB8fCBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoIm91dHB1dCIpIHx8IHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiZmF1bHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTWVzc2FnZVJlZmVyZW5jZShTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudE5hbWUuZXF1YWxzKCJib2R5IikgfHwgZWxlbWVudE5hbWUuZXF1YWxzKCJoZWFkZXIiKSB8fCBlbGVtZW50TmFtZS5lcXVhbHMoImZhdWx0IikgfHwgZWxlbWVudE5hbWUuZXF1YWxzKCJ1cmxSZXBsYWNlbWVudCIpIHx8IGVsZW1lbnROYW1lLmVxdWFscygidXJsRW5jb2RlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZUNoaWxkRWxlbWVudChOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgICAKLSAgICAKLSAgICBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotICAgICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkgPSBwYXJlbnROb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50Tm9kZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIC8vIG9ubHkgZmlsdGVyIGNoaWxkcmVuIGZvciAnbm9uLXNjaGVtYScgZWxlbWVudHMKLSAgICAgIC8vICAgCi0gICAgICBpZiAoIVdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkuZXF1YWxzKHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkpKQotICAgICAgewotICAgICAgICBpZiAocGFyZW50RWxlbWVudE5hbWUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBuYW1lc3BhY2UgYXJlIG9uZSB0aGF0IGFsd2F5cyBzaG91bGQgYmUgZmlsdGVyZWQgb3V0ICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBmb3Igbm93IHRoaXMgaXMgaGFyZGNvZGVkCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gZXhjbHVkZSBzb2FwLWVuYyBlbGVtZW50cwotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVzcGFjZS5lcXVhbHMoV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGVjbGlwc2UgYWxsIHNjaGVtYSBlbGVtZW50cywgZXhjZXB0IGZvciAnc2NoZW1hJyB3aXRoaW5nIHdzZGwgdHlwZXMgZWxlbWVudHMgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygidHlwZXMiKSAmJiBuYW1lLmVxdWFscygic2NoZW1hIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobmFtZXNwYWNlLmVxdWFscyhXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGNzIDogdGhlICdyZXF1aXJlZCcgYXR0cmlidXRlIGlzIGJ1cm5lZCBpbnRvIFdTREwgc2NoZW1hIGFzIHRoZSAnYmFzZScgZXh0ZW5zaWJpbGl0eSBlbGVtZW50Ci0gICAgICAgICAgICAgIC8vIHRoZSBXVFAgV1NETCB2YWxpZGF0b3IgY29tcGxhaW5zIHdoZW4gdGhlc2UgYXJlIHByZXNlbnQgc28gdGhpcyBsaW5lIGZpbHRlcnMgdGhlbSBvdXQKLSAgICAgICAgICAgICAgLy8gb2YgdGhlIGNvbnRlbnQgYXNzaXN0IGFuZCBleHRlbnNpb24gZGV0YWlscyB2aWV3LiAgQXMgZmFyIGFzIEkgY2FuIHRlbGwgbm8gb25lIGFjdHVhbGx5IHVzZXMgJ2VtCi0gICAgICAgICAgICAgIC8vIGluIHByYWN0aXNlIC4uLiBzbyBmaWx0ZXJpbmcgdGhlbSBvdXQgc2hvdWxkIGJlIG9rLiAgCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIC8vIFRPRE8gKGNzKSBob3cgY29tZSB0aGUgc2NoZW1hIHNheXMgdGhlaXIgb2sgYnV0IHRoZSB2YWxpZGF0b3IgZG9lc24ndCBsaWtlIHRoZW0/Ci0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIHJlc3VsdCA9ICFuYW1lLmVxdWFscygicmVxdWlyZWQiKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBUT0RPLi4gd2Ugc2hvdWxkIGludmVzdGlnYXRlIHJlbW92aW5nIHRoZSAgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IHRoaXMgYmUgYSBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGRlZmluZWQgb24gdGhlIGV4dGVuc2lvbiBsYW5ndWFnZXM/Ci0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgZmlsdGVyID0gKEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIpIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyUmVnaXN0cnkoKS5nZXRQcm9wZXJ0eShuYW1lc3BhY2UsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmaWx0ZXIuaXNWYWxpZENvbnRleHQoZWxlbWVudCwgbmFtZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzQXBwbGljYWJsZUNoaWxkRWxlbWVudChwYXJlbnROb2RlLCBuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgaWYgKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGxvb2t1cE9yQ3JlYXRlRGVmaW5pdGlvbihlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkpOwotICAgICAgU3RyaW5nIGN1cnJlbnRFbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICBpZiAoY2hlY2tOYW1lKG5hbWUsICJtZXNzYWdlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGRBbGwodXRpbC5nZXRNZXNzYWdlTmFtZXMoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgImJpbmRpbmciKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldEJpbmRpbmdOYW1lcygpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAidHlwZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiYmluZGluZyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldFBvcnRUeXBlTmFtZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgInBhcnQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwodXRpbC5nZXRDb21wb25lbnROYW1lTGlzdCh0cnVlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAiZWxlbWVudCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAicGFydCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldENvbXBvbmVudE5hbWVMaXN0KGZhbHNlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotICAgICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZVZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBsb29rdXBPckNyZWF0ZVNjaGVtYUZvckVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgIAotICAgIHJldHVybiBsb29rdXBPckNyZWF0ZVNjaGVtYShlbGVtZW50KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgbG9va3VwT3JDcmVhdGVTY2hlbWEoRWxlbWVudCBlbGVtZW50KQotICB7ICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbG9va3VwT3JDcmVhdGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBPYmplY3QgbyA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChkZWZpbml0aW9uLCBlbGVtZW50KTsKLSAgICBpZiAobyBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIHNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpIG8pLmdldFNjaGVtYSgpOwotICAgIH0gCi0gICAgcmV0dXJuIHNjaGVtYTsgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGxvb2t1cE9yQ3JlYXRlRGVmaW5pdGlvbihEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikKLSAgICB7Ci0gICAgICBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotICAgICAgV1NETE1vZGVsQWRhcHRlciBhZGFwdGVyID0gKFdTRExNb2RlbEFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoV1NETE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICBpZiAoYWRhcHRlciA9PSBudWxsKQotICAgICAgewotICAgICAgICBhZGFwdGVyID0gbmV3IFdTRExNb2RlbEFkYXB0ZXIoKTsKLSAgICAgICAgbm90aWZpZXIuYWRkQWRhcHRlcihhZGFwdGVyKTsKLSAgICAgICAgYWRhcHRlci5jcmVhdGVEZWZpbml0aW9uKGRvY3VtZW50KTsKLSAgICAgIH0KLSAgICAgIGRlZmluaXRpb24gPSBhZGFwdGVyLmdldERlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLSAgCi0gIAotICBwcm90ZWN0ZWQgVHlwZXNIZWxwZXIgZ2V0VHlwZXNIZWxwZXIoZmluYWwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IGxvb2t1cE9yQ3JlYXRlU2NoZW1hKGVsZW1lbnQpOwotICAgIHJldHVybiBuZXcgVHlwZXNIZWxwZXIoc2NoZW1hKQotICAgIHsKLSAgICAgIC8vIFRPRE8uLi4gaXQgc2VlbXMgYXMgdGhvdWdoIHRoZSBtb2RlbCBpcyBub3QgY29ycmVjdGx5Ci0gICAgICAvLyBtYWludGluZyB0aGUgbGlzdCBvZiBwcmVmaXhlcyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UKLSAgICAgIC8vIG11c3QgYmUgYSBidWchCi0gICAgICAvLwotICAgICAgcHJvdGVjdGVkIExpc3QgZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gc3VwZXIuZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbG9va3VwT3JDcmVhdGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgTWFwIG1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZykgbWFwLmdldChwcmVmaXgpOwotICAgICAgICAgICAgaWYgKG5zICE9IG51bGwgJiYgbnMuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghbGlzdC5jb250YWlucyhwcmVmaXgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICAgIH0gICAgICAgCi0gICAgfTsgICAgCi0gIH0gCi0gIAotICAvKiogICAKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGxvb2t1cE9yQ3JlYXRlRGVmaW5pdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbG9va3VwT3JDcmVhdGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMTW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETE1vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzIwNzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMTW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLk1vZGVsUmVjb25jaWxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotY2xhc3MgV1NETE1vZGVsUmVjb25jaWxlQWRhcHRlciBleHRlbmRzIE1vZGVsUmVjb25jaWxlQWRhcHRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgcHVibGljIFdTRExNb2RlbFJlY29uY2lsZUFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQsIERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgeyAgICAgICAgICAgCi0gICAgc3VwZXIoZG9jdW1lbnQpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIH0gCi0KLSAgLy8gVGhpcyBtZXRob2QgaXMgY2xldmVyIGVub3VnaCB0byBkZWFsIHdpdGggJ2JhZCcgZG9jdW1lbnRzIHRoYXQgaGFwcGVuIAotICAvLyB0byBoYXZlIG1vcmUgdGhhbiBvbmUgcm9vdCBlbGVtZW50LiAgSXQgcGlja3Mgb2YgdGhlIGZpcnN0ICdtYXRjaGluZycgZWxlbWVudC4KLSAgLy8KLSAgLy8gVE9ETyAoY3MpIHdoeSBhcmVuJ3Qgd2UgY2FsbGluZyB0aGlzIGZyb20gdGhlIFdTRExNb2RlbEFkYXB0ZXIgd2hlbiB0aGUgbW9kZWwgaXMgaW5pdGlhbGl6ZWQ/Ci0gIC8vCi0gIHByaXZhdGUgRWxlbWVudCBnZXREZWZpbml0aW9uRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBudWxsOyAgICAKLSAgICBmb3IgKE5vZGUgbm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgIHsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICAgIGlmIChXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGVsZW1lbnQpID09IFdTRExDb25zdGFudHMuREVGSU5JVElPTikKLSAgICAgICAgewotICAgICAgICAgIGRlZmluaXRpb25FbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGVmaW5pdGlvbkVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZU5vZGVDaGFuZ2VkKE5vZGUgbm9kZSkKLSAgewotICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICByZWNvbmNpbGVNb2RlbE9iamVjdEZvckVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7ICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkKLSAgICB7Ci0gICAgICAvLyBUaGUgZG9jdW1lbnQgY2hhbmdlZCBzbyB3ZSBtYXkgbmVlZCB0byBmaXggdXAgdGhlIAotICAgICAgLy8gZGVmaW5pdGlvbidzIHJvb3QgZWxlbWVudAotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSAoRG9jdW1lbnQpbm9kZTsgICAgCi0gICAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gZ2V0RGVmaW5pdGlvbkVsZW1lbnQoZG9jdW1lbnQpOwotICAgICAgaWYgKGRlZmluaXRpb25FbGVtZW50ICE9IG51bGwgJiYgZGVmaW5pdGlvbkVsZW1lbnQgIT0gZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpCi0gICAgICB7ICAgCi0gICAgICAgIC8vIGhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgbmV3ICdkZWZpbml0aW9uJyBlbGVtZW50IHdhcyBhZGRlZAotICAgICAgICAvLyhlLmcuIHRoZSBmaWxlIHdhcyB0b3RhbGx5IGJsYW5rIGFuZCB0aGVuIHdlIHR5cGUgaW4gdGhlIHJvb3QgZWxlbWVudCkgICAgICAgIAotICAgICAgICAvLyBTZWUgQnVnIDUzNjYKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKGRlZmluaXRpb25FbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhXU0RMQ29uc3RhbnRzLkRFRklOSVRJT05fRUxFTUVOVF9UQUcpKSAgICAgICAgIAotICAgICAgICB7ICAKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIFNldHRpbmcgbmV3IGRlZmluaXRpb24iKTsKLSAgICAgICAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQoZGVmaW5pdGlvbkVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgICBlbHNlIGlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgeyAgICAgICAKLSAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBkZWZpbml0aW9uIGVsZW1lbnQncyBjb250ZW50IGhhcyBjaGFuZ2VkCi0gICAgICAgIC8vIAotICAgICAgICAoKERlZmluaXRpb25JbXBsKWRlZmluaXRpb24pLmVsZW1lbnRDaGFuZ2VkKGRlZmluaXRpb25FbGVtZW50KTsKLSAgICAgIH0gICAgICAKLSAgICAgIGVsc2UgaWYgKGRlZmluaXRpb25FbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gZGVmaW5pdGlvbiBlbGVtZW50IGNsZWFyIG91dCB0aGUgV1NETAotICAgICAgICAvLwotICAgICAgICAoKERlZmluaXRpb25JbXBsKWRlZmluaXRpb24pLnJlbW92ZUFsbCgpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIHJlbW92ZUFsbCgpIGNhbGwgZG9lcyBub3QgcmVtb3ZlIG5hbWVzcGFjZXMgYXMgd2VsbCBhbmQgdGhlIG1vZGVsCi0gICAgICAgIC8vIGRvZXMgbm90IHJlY29uY2lsZSB3ZWxsIGluIHRoaXMgY2FzZS4gQWxzbyByZXNldCB0aGUgZGVmaW5pdGlvbiBuYW1lIGFuZCB0YXJnZXQKLSAgICAgICAgLy8gbmFtZXNwYWNlLgotICAgICAgICAKLSAgICAgICAgZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkuY2xlYXIoKTsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRRTmFtZShudWxsKTsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UobnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBSZXNldCB0aGUgZG9jdW1lbnQgYmVjYXVzZSByZW1vdmVBbGwoKSBzZXRzIHRoZSBkb2N1bWVudCB0byBudWxsIGFzIHdlbGwuCi0gICAgICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotICAgICAgfQotICAgIH0gICAgICAgICAKLSAgfQotICAgICAgIAotICBwcml2YXRlIHZvaWQgcmVjb25jaWxlTW9kZWxPYmplY3RGb3JFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChkZWZpbml0aW9uLCBlbGVtZW50KTsgIAotICAgIGlmIChtb2RlbE9iamVjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGVlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCltb2RlbE9iamVjdDsKLSAgICAgICAgKChYU0RTY2hlbWFJbXBsKWVlLmdldFNjaGVtYSgpKS5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgZWUuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7ICAgICAgICAgICAgCi0gICAgICB9ICAgCi0gICAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgIHsKLSAgICAgICAgKChXU0RMRWxlbWVudEltcGwpbW9kZWxPYmplY3QpLmVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7ICAgICAgICAKLSAgICAgIH0gIAotICAgIH0gICAgIAotICB9ICAKLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZU1vZGVsT2JqZWN0Rm9yRWxlbWVudChFbGVtZW50IGVsZW1lbnQsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmVjb25jaWxlTW9kZWxPYmplY3RGb3JFbGVtZW50KGVsZW1lbnQpOwotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KQotICB7Ci0gICAgaWYgKCFpc0RpcnR5KQotICAgIHsgIAotICAgICAgLy8gY3MgOiBBdCB0aGlzIHRpbWUgKHdoZW4gYSBzYXZlIG9jY3VycykgaXQncyBhIGdvb2Qgb3Bwb3J0dW5pdHkKLSAgICAgIC8vIHRvIHVwZGF0ZSB0aGUgbW9kZWwgdG8gZW5zdXJlIGl0J3MgaW4gc3luYyB3aXRoIHRoZSBzb3VyY2UuIAotICAgICAgLy8gVGhhdCB3YXkgaWYgdGhlIGluY3JlbWVudGFsIHN5bmMgYmV0d2VlbiBET00gYW5kIG1vZGVsIGhhcyBnb3R0ZW4KLSAgICAgIC8vIHRoZSBtb2RlbCBvdXQgb2Ygd2hhY2sgd2UnbGwgYmUgYWJsZSB0byBwdXQgdGhpbmdzIHJpZ2h0IGF0IHRoaXMgcG9pbnQuCi0gICAgICAvLyAgIAotICAgICAgLy8gVE9ETyAoY3MpIG5lZWQgdG8gZG8gbW9yZSB0byBlbnN1cmUgbW9kZWwgaXMgc3luYydkIHVwIHByb3Blcmx5ICAgICAgCi0gICAgICAoKERlZmluaXRpb25JbXBsKWRlZmluaXRpb24pLnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudFJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmMzBlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuSW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb25zLklUeXBlU3lzdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50UmVmZXJlbmNlVXRpbAotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiByb290RGVmaW5pdGlvbjsKLQotICBwdWJsaWMgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChEZWZpbml0aW9uIHJvb3REZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5yb290RGVmaW5pdGlvbiA9IHJvb3REZWZpbml0aW9uOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRXF1YWwoU3RyaW5nIGEsIFN0cmluZyBiKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAoYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGEuZXF1YWxzKGIpIHx8IChhLmxlbmd0aCgpID09IDAgJiYgYiA9PSBudWxsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChiID09IG51bGwgfHwgYi5sZW5ndGgoKSA9PSAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsSW5wdXROYW1lKE9wZXJhdGlvbiBvcGVyYXRpb24sIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgSW5wdXQgb3BlcmF0aW9uSW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgQmluZGluZ0lucHV0IGJpbmRpbmdPcGVyYXRpb25JbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpOwotCi0gICAgaWYgKG9wZXJhdGlvbklucHV0ICE9IG51bGwgJiYgYmluZGluZ09wZXJhdGlvbklucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNFcXVhbChvcGVyYXRpb25JbnB1dC5nZXROYW1lKCksIGJpbmRpbmdPcGVyYXRpb25JbnB1dC5nZXROYW1lKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChvcGVyYXRpb25JbnB1dCA9PSBudWxsICYmIGJpbmRpbmdPcGVyYXRpb25JbnB1dCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNFcXVhbE91dHB1dE5hbWUoT3BlcmF0aW9uIG9wZXJhdGlvbiwgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBPdXRwdXQgb3BlcmF0aW9uT3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsKLSAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPcGVyYXRpb25PdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uT3V0cHV0ICE9IG51bGwgJiYgYmluZGluZ09wZXJhdGlvbk91dHB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzRXF1YWwob3BlcmF0aW9uT3V0cHV0LmdldE5hbWUoKSwgYmluZGluZ09wZXJhdGlvbk91dHB1dC5nZXROYW1lKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChvcGVyYXRpb25PdXRwdXQgPT0gbnVsbCAmJiBiaW5kaW5nT3BlcmF0aW9uT3V0cHV0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nQmluZGluZyhPcGVyYXRpb24gb3BlcmF0aW9uLCBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICByZXR1cm4gaXNFcXVhbChvcGVyYXRpb24uZ2V0TmFtZSgpLCBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7IC8qICYmCi0gICAgCQkJICAgaXNFcXVhbElucHV0TmFtZShvcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24pICYmCi0gICAgCQkJICAgaXNFcXVhbE91dHB1dE5hbWUob3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uKTsqLwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UG9ydHNGb3JQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGoubmV4dCgpOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5nZXRFUG9ydFR5cGUoKSA9PSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHBvcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UG9ydHNGb3JCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGoubmV4dCgpOwotICAgICAgICBpZiAocG9ydC5nZXRFQmluZGluZygpID09IGJpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChwb3J0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdPcGVyYXRpb25zKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGdldEVuY2xvc2luZ1BvcnRUeXBlKG9wZXJhdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCaW5kaW5ncyhwb3J0VHlwZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uLCBiaW5kaW5nKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gZ2V0QmluZGluZ09wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uLCBCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgai5uZXh0KCk7Ci0gICAgICBpZiAoaXNNYXRjaGluZ0JpbmRpbmcob3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0lucHV0IGdldEJpbmRpbmdJbnB1dChJbnB1dCBpbnB1dCwgQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbigoT3BlcmF0aW9uKSBpbnB1dC5lQ29udGFpbmVyKCksIGJpbmRpbmcpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uICE9IG51bGwgPyBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRCaW5kaW5nT3V0cHV0KE91dHB1dCBvdXRwdXQsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oKE9wZXJhdGlvbikgb3V0cHV0LmVDb250YWluZXIoKSwgYmluZGluZyk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCA/IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0ZhdWx0IGdldEJpbmRpbmdGYXVsdChGYXVsdCBmYXVsdCwgQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICBpZiAoZmF1bHROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbigoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCksIGJpbmRpbmcpOwotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEJpbmRpbmdGYXVsdCkgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHQoZmF1bHROYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBFT2JqZWN0IGdldEJpbmRpbmdPYmplY3QoRU9iamVjdCBpbnRlcmZhY2VPYmplY3QsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0QmluZGluZ0lucHV0KChJbnB1dCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEJpbmRpbmdPdXRwdXQoKE91dHB1dCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgRmF1bHQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0QmluZGluZ0ZhdWx0KChGYXVsdCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEJpbmRpbmdPcGVyYXRpb24oKE9wZXJhdGlvbikgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gYmluZGluZzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdJbnB1dHMoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBvcGVyYXRpb25zID0gZ2V0QmluZGluZ09wZXJhdGlvbnMoKE9wZXJhdGlvbikgaW5wdXQuZUNvbnRhaW5lcigpKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nT3V0cHV0cyhPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvdXRwdXQuZUNvbnRhaW5lcigpOwotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IG9wZXJhdGlvbnMgPSBnZXRCaW5kaW5nT3BlcmF0aW9ucyhvcGVyYXRpb24pOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nRmF1bHRzKEZhdWx0IGZhdWx0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBmYXVsdE5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0gICAgaWYgKGZhdWx0TmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCk7Ci0gICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IGdldEJpbmRpbmdPcGVyYXRpb25zKG9wZXJhdGlvbik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdGYXVsdChmYXVsdE5hbWUpOwotICAgICAgICAgIGlmIChiaW5kaW5nRmF1bHQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBnZXRFbmNsb3NpbmdQb3J0VHlwZShPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIChQb3J0VHlwZSkgb3BlcmF0aW9uLmVDb250YWluZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdzKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICByZXR1cm4gZ2V0QmluZGluZ3MoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3BlcmF0aW9uKSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5ncyhQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBkZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgai5uZXh0KCk7Ci0gICAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsIHx8IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSA9PSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ3NXaXRob3V0T3BlcmF0aW9uKFBvcnRUeXBlIHBvcnRUeXBlLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKHBvcnRUeXBlKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGkubmV4dCgpOwotICAgICAgICBib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBqLm5leHQoKTsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZS5lcXVhbHMoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhc05hbWUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaGFzTmFtZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hZGQoYmluZGluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdzKCkKLSAgewotICAgIHJldHVybiBnZXRCaW5kaW5ncygoUG9ydFR5cGUpIG51bGwpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ05hbWVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKGJpbmRpbmcuZ2V0UU5hbWUoKSkpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFBvcnRUeXBlTmFtZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgai5uZXh0KCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGdldFByZWZpeGVkTmFtZXMocG9ydFR5cGUuZ2V0UU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFNlcnZpY2VzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChkZWZpbml0aW9uLmdldEVTZXJ2aWNlcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRQb3J0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSk7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE1lc3NhZ2VOYW1lcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gZGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGoubmV4dCgpOwotICAgICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKG1lc3NhZ2UuZ2V0UU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldERlZmluaXRpb25zKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhZGREZWZpbml0aW9uKHJvb3REZWZpbml0aW9uLCBsaXN0KTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAtLSB3ZSBzaG91bGQgYWx3YXlzIHVzZSBnZXRQcmVmaXhlZE5hbWVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkTmFtZShRTmFtZSBxbmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gcm9vdERlZmluaXRpb24uZ2V0UHJlZml4KHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IHByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UHJlZml4ZWROYW1lcyhRTmFtZSBxbmFtZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNYXAgbWFwID0gcm9vdERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZykgbWFwLmdldChwcmVmaXgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbmFtZXNwYWNlLmVxdWFscyhxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IHByZWZpeC5sZW5ndGgoKSA+IDAgPyBwcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSA6ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICBsaXN0LmFkZChuYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBMaXN0IGxpc3QpCi0gIHsKLSAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKGRlZmluaXRpb24pOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgSW1wb3J0SW1wbCB0aGVJbXBvcnQgPSAoSW1wb3J0SW1wbCkgaS5uZXh0KCk7Ci0gICAgICAgIGlmICh0aGVJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsICYmICF0aGVJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKS5lbmRzV2l0aCgieHNkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHRoZUltcG9ydC5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsJIAotICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gKERlZmluaXRpb24pIHRoZUltcG9ydC5nZXRFRGVmaW5pdGlvbigpOwotICAgICAgICAgIGlmIChpbXBvcnRlZERlZmluaXRpb24gIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhpbXBvcnRlZERlZmluaXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZERlZmluaXRpb24oaW1wb3J0ZWREZWZpbml0aW9uLCBsaXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0VHlwZVJlZmVyZW5jZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UG9ydFR5cGVSZWZlcmVuY2UoQmluZGluZyBiaW5kaW5nLCBTdHJpbmcgcG9ydFR5cGUpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsIHBvcnRUeXBlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJpbmRpbmdSZWZlcmVuY2UoUG9ydCBwb3J0KQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHBvcnQpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImJpbmRpbmciKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFBvcnRUeXBlUmVmZXJlbmNlUU5hbWUoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgUU5hbWUgcmVzdWx0ID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0UG9ydFR5cGVSZWZlcmVuY2UoYmluZGluZyk7Ci0gICAgaWYgKHByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JVdGlsLmNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIHByZWZpeGVkTmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldEJpbmRpbmdSZWZlcmVuY2VRTmFtZShQb3J0IHBvcnQpCi0gIHsKLSAgICBRTmFtZSByZXN1bHQgPSBudWxsOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHBvcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIFN0cmluZyBwcmVmaXhlZE5hbWUgPSBnZXRCaW5kaW5nUmVmZXJlbmNlKHBvcnQpOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yVXRpbC5jcmVhdGVRTmFtZShkZWZpbml0aW9uLCBwcmVmaXhlZE5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlZmVyZW5jZShJbnB1dCBpbnB1dCkKLSAgewotICAgIHJldHVybiBnZXRNZXNzYWdlUmVmZXJlbmNlSGVscGVyKGlucHV0KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZWZlcmVuY2UoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHJldHVybiBnZXRNZXNzYWdlUmVmZXJlbmNlSGVscGVyKG91dHB1dCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVmZXJlbmNlKEZhdWx0IGZhdWx0KQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2VSZWZlcmVuY2VIZWxwZXIoZmF1bHQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWUoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lSGVscGVyKGlucHV0KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lSGVscGVyKG91dHB1dCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZShGYXVsdCBmYXVsdCkKLSAgewotICAgIHJldHVybiBnZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWVIZWxwZXIoZmF1bHQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihXU0RMRWxlbWVudCBvKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG8pOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWVIZWxwZXIoV1NETEVsZW1lbnQgbykKLSAgewotICAgIFFOYW1lIHJlc3VsdCA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gby5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIHByZWZpeGVkTmFtZSA9IGdldE1lc3NhZ2VSZWZlcmVuY2VIZWxwZXIobyk7Ci0gICAgaWYgKHByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JVdGlsLmNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIHByZWZpeGVkTmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlUG9ydFR5cGVSZWZlcmVuY2VzKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0QmluZGluZ3MoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGkubmV4dCgpOwotICAgICAgUU5hbWUgcW5hbWUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldFBvcnRUeXBlUmVmZXJlbmNlUU5hbWUoYmluZGluZyk7Ci0KLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKHFuYW1lICE9IG51bGwpID8gKFBvcnRUeXBlKSBkZWZpbml0aW9uLmdldFBvcnRUeXBlKHFuYW1lKSA6IG51bGw7Ci0KLSAgICAgIGlmIChiaW5kaW5nLmdldFBvcnRUeXBlKCkgIT0gcG9ydFR5cGUpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcuc2V0UG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVCaW5kaW5nUmVmZXJlbmNlcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBpLm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHNlcnZpY2UuZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgai5uZXh0KCk7Ci0gICAgICAgIFFOYW1lIHFuYW1lID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRCaW5kaW5nUmVmZXJlbmNlUU5hbWUocG9ydCk7Ci0KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKHFuYW1lICE9IG51bGwpID8gKEJpbmRpbmcpIGRlZmluaXRpb24uZ2V0QmluZGluZyhxbmFtZSkgOiBudWxsOwotCi0gICAgICAgIGlmIChwb3J0LmdldEJpbmRpbmcoKSAhPSBiaW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgcG9ydC5zZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU1lc3NhZ2VSZWZlcmVuY2VzKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIC8vIGZvciBlYWNoIHBvcnQgdHlwZQotICAgIC8vCi0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpIGkubmV4dCgpOwotCi0gICAgICAvLyBmb3IgZWFjaCBvcGVyYXRpb24KLSAgICAgIC8vCi0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGoubmV4dCgpOwotCi0gICAgICAgIC8vIGhhbmRsZSBJbnB1dAotICAgICAgICAvLwotICAgICAgICBJbnB1dCBpbnB1dCA9IChJbnB1dCkgb3BlcmF0aW9uLmdldElucHV0KCk7Ci0gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUU5hbWUgcW5hbWUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZShpbnB1dCk7Ci0gICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKHFuYW1lICE9IG51bGwpID8gKE1lc3NhZ2UpIGRlZmluaXRpb24uZ2V0TWVzc2FnZShxbmFtZSkgOiBudWxsOwotICAgICAgICAgIGlmIChpbnB1dC5nZXRNZXNzYWdlKCkgIT0gbWVzc2FnZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dC5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBPdXRwdXQKLSAgICAgICAgLy8KLSAgICAgICAgT3V0cHV0IG91dHB1dCA9IChPdXRwdXQpIG9wZXJhdGlvbi5nZXRPdXRwdXQoKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUU5hbWUgcW5hbWUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZShvdXRwdXQpOwotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChxbmFtZSAhPSBudWxsKSA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UocW5hbWUpIDogbnVsbDsKLSAgICAgICAgICBpZiAob3V0cHV0LmdldE1lc3NhZ2UoKSAhPSBtZXNzYWdlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dC5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBGYXVsdHMKLSAgICAgICAgLy8KLSAgICAgICAgZm9yIChJdGVyYXRvciBrID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBrLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgay5uZXh0KCk7Ci0KLSAgICAgICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKGZhdWx0KTsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAocW5hbWUgIT0gbnVsbCkgPyAoTWVzc2FnZSkgZGVmaW5pdGlvbi5nZXRNZXNzYWdlKHFuYW1lKSA6IG51bGw7Ci0gICAgICAgICAgaWYgKGZhdWx0LmdldE1lc3NhZ2UoKSAhPSBtZXNzYWdlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhdWx0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVNjaGVtYVJlZmVyZW5jZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gbWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBqLm5leHQoKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHBhcnQpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpcGFydCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oUG9ydFR5cGUgcG9ydFR5cGUsIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIE9wZXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChpc01hdGNoaW5nQmluZGluZyhvcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBvcGVyYXRpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU9wZXJhdGlvblJlZmVyZW5jZShCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gY29tcHV0ZU9wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICBpZiAob3BlcmF0aW9uICE9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkpCi0gICAgewotICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChib29sZWFuIGlzVHlwZSkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICBJVHlwZVN5c3RlbVByb3ZpZGVyIHR5cGVTeXN0ZW1Qcm92aWRlciA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKHJvb3REZWZpbml0aW9uKTsKLSAgICBpZiAodHlwZVN5c3RlbVByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNUeXBlID8gdHlwZVN5c3RlbVByb3ZpZGVyLmdldEF2YWlsYWJsZVR5cGVOYW1lcyhyb290RGVmaW5pdGlvbiwgMCkgOiB0eXBlU3lzdGVtUHJvdmlkZXIuZ2V0QXZhaWxhYmxlRWxlbWVudE5hbWVzKHJvb3REZWZpbml0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChQYXJ0IHBhcnQsIGJvb2xlYW4gaXNUeXBlKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIElUeXBlU3lzdGVtUHJvdmlkZXIgdHlwZVN5c3RlbVByb3ZpZGVyID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlU3lzdGVtUHJvdmlkZXIoZGVmaW5pdGlvbik7Ci0gICAgaWYgKHR5cGVTeXN0ZW1Qcm92aWRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzVHlwZSA/IHR5cGVTeXN0ZW1Qcm92aWRlci5nZXRBdmFpbGFibGVUeXBlTmFtZXMoZGVmaW5pdGlvbiwgMCkgOiB0eXBlU3lzdGVtUHJvdmlkZXIuZ2V0QXZhaWxhYmxlRWxlbWVudE5hbWVzKGRlZmluaXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHlwZShQYXJ0IHBhcnQpCi0gIHsKLSAgICAvL0VsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwYXJ0KTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKCJlbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcnRDb21wb25lbnRSZWZlcmVuY2UoUGFydCBwYXJ0KQotICB7Ci0gICAgLy9FbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocGFydCk7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJlbGVtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tcG9uZW50UmVmZXJlbmNlKFBhcnQgcGFydCwgYm9vbGVhbiBpc1R5cGUsIFN0cmluZyBjb21wb25lbnROYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHBhcnQpOwotICAgIFN0cmluZyBuZXdBdHRyaWJ1dGUgPSBpc1R5cGUgPyAidHlwZSIgOiAiZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIFN0cmluZyBvbGRBdHRyaWJ1dGUgPSBpc1R5cGUgPyAiZWxlbWVudCIgOiAidHlwZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG9sZEF0dHJpYnV0ZSk7Ci0KLSAgICBTdHJpbmcgdmFsdWUgPSBjb21wb25lbnROYW1lICE9IG51bGwgPyBjb21wb25lbnROYW1lIDogZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3QXR0cmlidXRlKTsKLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpc1R5cGUpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSBwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIHZhbHVlID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHhzZFByZWZpeCAhPSBudWxsICYmIHhzZFByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IHhzZFByZWZpeCArICI6IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gZ2V0Q29tcG9uZW50TmFtZUxpc3QocGFydCwgaXNUeXBlKTsKLSAgICAgICAgdmFsdWUgPSBsaXN0LnNpemUoKSA+IDAgPyAoU3RyaW5nKSBsaXN0LmdldCgwKSA6ICJzb21lLWVsZW1lbnQtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmV3QXR0cmlidXRlLCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIE9wZXJhdGlvbiBjb21wdXRlT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIE9wZXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBiaW5kaW5nT3BlcmF0aW9uLmVDb250YWluZXIoKTsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgYmluZGluZy5nZXRQb3J0VHlwZSgpOwotICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldE9wZXJhdGlvbihwb3J0VHlwZSwgYmluZGluZ09wZXJhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIElucHV0IGNvbXB1dGVJbnB1dChCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0KQotICB7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGNvbXB1dGVPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdJbnB1dC5lQ29udGFpbmVyKCkpOwotICAgIHJldHVybiBvcGVyYXRpb24gIT0gbnVsbCA/IG9wZXJhdGlvbi5nZXRFSW5wdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIE91dHB1dCBjb21wdXRlT3V0cHV0KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb21wdXRlT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3V0cHV0LmVDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbiAhPSBudWxsID8gb3BlcmF0aW9uLmdldEVPdXRwdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEZhdWx0IGNvbXB1dGVGYXVsdChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICB7Ci0gICAgRmF1bHQgcmVzdWx0ID0gbnVsbDsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gY29tcHV0ZU9wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ0ZhdWx0LmVDb250YWluZXIoKSk7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBmYXVsdE5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChmYXVsdE5hbWUgIT0gbnVsbCAmJiBmYXVsdE5hbWUuZXF1YWxzKGJpbmRpbmdGYXVsdC5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcnRSZWZlcmVuY2VWYWx1ZShQYXJ0IHBhcnQpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocGFydCk7Ci0gICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgidHlwZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7ICAgICAgCQkKLSAgICAgICAgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgiZWxlbWVudCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7ICAKLSAgICAgICAgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9ICAgICAgICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgT3BlcmF0aW9uIGdldEJpbmRpbmdPcGVyYXRpb24oRWxlbWVudCBiaW5kaW5nT3BlcmF0aW9uQ29udGVudCkKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBudWxsOwotICAgIE5vZGUgcGFyZW50ID0gYmluZGluZ09wZXJhdGlvbkNvbnRlbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQocm9vdERlZmluaXRpb24sIChFbGVtZW50KSBwYXJlbnQpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdPcGVyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIG9wZXJhdGlvbiA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZU9wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbikgb2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBNZXNzYWdlIGdldEJpbmRpbmdPcGVyYXRpb25JbnB1dE1lc3NhZ2UoRWxlbWVudCBiaW5kaW5nT3BlcmF0aW9uQ29udGVudCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpOwotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLSAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gaW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICBwdWJsaWMgTWVzc2FnZSBnZXRCaW5kaW5nT3BlcmF0aW9uT3V0cHV0TWVzc2FnZShFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25Db250ZW50KQotICB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uQ29udGVudCk7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0RU91dHB1dCgpOwotICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gb3V0cHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZVJlbGF0aXZlVVJJKElGaWxlIHJlZmVyZW5jZWRMb2NhdGlvbiwgSUZpbGUgYmFzZUxvY2F0aW9uLCBib29sZWFuIGVuYWJsZUlFU3R5bGVSZWZlcmVuY2VzKQotICB7Ci0gICAgLy8gVE9ETy4uLiB3ZSBuZWVkIHNvbWUgZXh0ZW5zaW9uIHRvIGFsbG93IElFIGZvbGtzIHRvIHBsdWdpbiBsb2dpYyB0byBjcmVhdGUgYW4gJ0lFJyBzdHlsZSBwYXRoCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciB1c2luZyBVUkkgY2xhc3MgaW4gRU1GIAotICAgIHJldHVybiBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkocmVmZXJlbmNlZExvY2F0aW9uLmdldExvY2F0aW9uKCksIGJhc2VMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZVJlbGF0aXZlVVJJKFN0cmluZyByZWZlcmVuY2VkTG9jYXRpb24sIFN0cmluZyBiYXNlTG9jYXRpb24sIGJvb2xlYW4gZW5hYmxlSUVTdHlsZVJlZmVyZW5jZXMpCi0gIHsKLSAgICAvLyBUT0RPLi4uIHdlIG5lZWQgc29tZSBleHRlbnNpb24gdG8gYWxsb3cgSUUgZm9sa3MgdG8gcGx1Z2luIGxvZ2ljIHRvIGNyZWF0ZSBhbiAnSUUnIHN0eWxlIHBhdGgKLSAgICAvLyBUT0RPLi4uIGNvbnNpZGVyIHVzaW5nIFVSSSBjbGFzcyBpbiBFTUYgCi0gICAgcmV0dXJuIFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShyZWZlcmVuY2VkTG9jYXRpb24sIGJhc2VMb2NhdGlvbik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9DcmVhdGVXU0RMRWxlbWVudEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NyZWF0ZVdTRExFbGVtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwM2ViMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NyZWF0ZVdTRExFbGVtZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5NZXNzYWdlUmVmZXJlbmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCYXNlUGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCaW5kaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRGYXVsdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZElucHV0UGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRNZXNzYWdlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPcGVyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQYXJ0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQb3J0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQb3J0VHlwZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkU2VydmljZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIgewotCS8vIENvbnN0YW50cyB1c2VkIGZvciBnZXR0aW5nIFBhcnQgaW5mb3JtYXRpb24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX0lORk9fRUxFTUVOVF9ERUNMQVJBVElPTiA9ICJFTEVNRU5UX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfSU5GT19UWVBFX0RFRklOSVRJT04gICAgID0gIlRZUEVfREVGSU5JVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHNob3VsZCBiZSBzZXQgaWYgYSBuYW1lIG90aGVyIHRoYW4gdGhlIGNvbXB1dGVkIG5hbWUgaXMgdG8gYmUgdXNlZC4KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcG9ydE5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmRpbmdOYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlucHV0TmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0cHV0TmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmF1bHROYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXNzYWdlTmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydE5hbWUgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTjsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQ1JFQVRFX0RPV05fVE9fUEFSVCA9IHRydWU7Ci0JCQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjcmVhdGVzIHRoZSAnc3BlY2lmaWVkJyAoYnkgY2FsbGluZyBhIGNlcnRhaW4gbWV0aG9kKSBXU0RMRWxlbWVudAotICogYW5kIGl0J3MgJ2NoaWxkcmVuJyBhbGwgdGhlIHdheSB0byB0aGUgUG9ydFR5cGUgbGV2ZWwuCi0gKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZpY2UgY3JlYXRlU2VydmljZShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgc2VydmljZU5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXNlcnZpY2VOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVTZXJ2aWNlTmFtZShkZWZpbml0aW9uKTsJCQotCQkKLQkJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIucG9ydFR5cGVOYW1lID0gc2VydmljZU5hbWU7Ci0JCQotCSAgICBBZGRTZXJ2aWNlQ29tbWFuZCBhZGRTZXJ2aWNlID0gbmV3IEFkZFNlcnZpY2VDb21tYW5kKGRlZmluaXRpb24sIHNlcnZpY2VOYW1lLCBmYWxzZSk7Ci0JICAgIGFkZFNlcnZpY2UucnVuKCk7Ci0JICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBhZGRTZXJ2aWNlLmdldFdTRExFbGVtZW50KCk7Ci0JICAgIENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZVBvcnQoc2VydmljZSk7Ci0gIAkJCi0JICAgIHJldHVybiBzZXJ2aWNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFBvcnQgY3JlYXRlUG9ydChTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJaWYgKHBvcnROYW1lID09IG51bGwgfHwgcG9ydE5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXBvcnROYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQb3J0TmFtZShzZXJ2aWNlLCBudWxsKTsKLQkJCi0JICAgIEFkZFBvcnRDb21tYW5kIGFkZFBvcnQgPSBuZXcgQWRkUG9ydENvbW1hbmQoc2VydmljZSwgcG9ydE5hbWUpOwotCSAgICBhZGRQb3J0LnJ1bigpOwotCSAgICBQb3J0IHBvcnQgPSAoUG9ydCkgYWRkUG9ydC5nZXRXU0RMRWxlbWVudCgpOwotCQlCaW5kaW5nIGJpbmRpbmcgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVCaW5kaW5nKHBvcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBwb3J0KTsKLQotCQlwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0JCQotCSAgICByZXR1cm4gcG9ydDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBQb3J0IHBvcnQpIHsKLQkJYmluZGluZ05hbWUgPSBwb3J0LmdldE5hbWUoKTsKLQkJaWYgKGJpbmRpbmdOYW1lID09IG51bGwgfHwgYmluZGluZ05hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCWJpbmRpbmdOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVCaW5kaW5nTmFtZShkZWZpbml0aW9uLCBudWxsKTsKLQkJCi0JCUFkZEJpbmRpbmdDb21tYW5kIGFkZEJpbmRpbmcgPSBuZXcgQWRkQmluZGluZ0NvbW1hbmQoZGVmaW5pdGlvbiwgYmluZGluZ05hbWUpOwotCQlhZGRCaW5kaW5nLnJ1bigpOwotCQlCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYWRkQmluZGluZy5nZXRXU0RMRWxlbWVudCgpOwotCQlQb3J0VHlwZSBwb3J0VHlwZSA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZVBvcnRUeXBlKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLQotCQliaW5kaW5nLnNldFBvcnRUeXBlKHBvcnRUeXBlKTsKLQkJCi0JCXJldHVybiBiaW5kaW5nOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFBvcnRUeXBlIGNyZWF0ZVBvcnRUeXBlKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQlpZiAocG9ydFR5cGVOYW1lID09IG51bGwgfHwgcG9ydFR5cGVOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlwb3J0VHlwZU5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVBvcnRUeXBlTmFtZShkZWZpbml0aW9uLCAiUG9ydFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJQWRkUG9ydFR5cGVDb21tYW5kIGFkZFBvcnRUeXBlQ29tbWFuZCA9IG5ldyBBZGRQb3J0VHlwZUNvbW1hbmQoZGVmaW5pdGlvbiwgcG9ydFR5cGVOYW1lKTsKLQkJYWRkUG9ydFR5cGVDb21tYW5kLnJ1bigpOwotCQlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgYWRkUG9ydFR5cGVDb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0KLQkJaWYgKENSRUFURV9ET1dOX1RPX1BBUlQpIHsKLQkJCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU9wZXJhdGlvbihwb3J0VHlwZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBwb3J0VHlwZTsKLQl9Ci0KLQkKLS8qCi0gKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgY3JlYXRlcyB0aGUgJ3NwZWNpZmllZCcgKGJ5IGNhbGxpbmcgYSBjZXJ0YWluIG1ldGhvZCkgV1NETEVsZW1lbnQKLSAqIGFuZCBpdCdzICdjaGlsZHJlbicgYWxsIHRoZSB3YXkgdG8gdGhlIFBhcnQgbGV2ZWwuCi0gKi8JCi0gIAlwdWJsaWMgc3RhdGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oUG9ydFR5cGUgcG9ydFR5cGUpIHsKLSAgCQlpZiAob3BlcmF0aW9uTmFtZSA9PSBudWxsIHx8IG9wZXJhdGlvbk5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgCQkJb3BlcmF0aW9uTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlT3BlcmF0aW9uTmFtZShwb3J0VHlwZSk7Ci0gIAkJCi0JCUFkZE9wZXJhdGlvbkNvbW1hbmQgYWN0aW9uID0gbmV3IEFkZE9wZXJhdGlvbkNvbW1hbmQocG9ydFR5cGUsIG9wZXJhdGlvbk5hbWUpOwotCQlhY3Rpb24ucnVuKCk7Ci0JCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLQkJCi0JCWludCBzdHlsZSA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfRUxFTUVOVF9TRVFfRUxFTUVOVDsKLSAgCQlpZiAoUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPT0gUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTikgewotICAJCQlzdHlsZSA9IEFkZEJhc2VQYXJhbWV0ZXJDb21tYW5kLlBBUlRfU0lNUExFVFlQRTsKLSAgCQl9Ci0gIAkJZWxzZSBpZiAoUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPT0gUEFSVF9JTkZPX0VMRU1FTlRfREVDTEFSQVRJT04pIHsKLSAgCQkJc3R5bGUgPSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5QQVJUX0VMRU1FTlRfU0VRX0VMRU1FTlQ7Ci0vLyAgCQkJc3R5bGUgPSBBZGRCYXNlUGFyYW1ldGVyQ29tbWFuZC5QQVJUX0VMRU1FTlQ7Ci0gIAkJfQotICAJCQotCQlBZGRJbnB1dFBhcmFtZXRlckNvbW1hbmQgaW5wdXRDb21tYW5kID0gbmV3IEFkZElucHV0UGFyYW1ldGVyQ29tbWFuZChvcGVyYXRpb24sIHN0eWxlKTsKLQkJaW5wdXRDb21tYW5kLnJ1bigpOwotCQlBZGRPdXRwdXRQYXJhbWV0ZXJDb21tYW5kIG91dHB1dENvbW1hbmQgPSBuZXcgQWRkT3V0cHV0UGFyYW1ldGVyQ29tbWFuZChvcGVyYXRpb24sIHN0eWxlKTsKLQkJb3V0cHV0Q29tbWFuZC5ydW4oKTsKLQkJb3BlcmF0aW9uLnNldFN0eWxlKE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSk7Ci0KLQkJcmV0dXJuIG9wZXJhdGlvbjsKLSAgCX0KLQotICAJcHVibGljIHN0YXRpYyBJbnB1dCBjcmVhdGVJbnB1dChQb3J0VHlwZSBwb3J0VHlwZSwgT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIGlucHV0TmFtZSkgewotICAJCWlmIChpbnB1dE5hbWUgPT0gbnVsbCB8fCBpbnB1dE5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgCSAgCQlpbnB1dE5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZUlucHV0TmFtZShwb3J0VHlwZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0gIAkJCi0gIAkJQWRkSW5wdXRDb21tYW5kIGFjdGlvbiA9IG5ldyBBZGRJbnB1dENvbW1hbmQob3BlcmF0aW9uLCBpbnB1dE5hbWUpOwotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQlJbnB1dCBpbnB1dCA9IChJbnB1dCkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7IAotICAJCU1lc3NhZ2UgbWVzcyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU1lc3NhZ2UoaW5wdXQpOwotICAJCWlucHV0LnNldE1lc3NhZ2UobWVzcyk7Ci0gIAkJCSAgCQkKLSAgCQlyZXR1cm4gaW5wdXQ7Ci0gIAl9Ci0gIAkJCSAgCQotICAJcHVibGljIHN0YXRpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KFBvcnRUeXBlIHBvcnRUeXBlLCBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gIAkJaWYgKG91dHB1dE5hbWUgPT0gbnVsbCB8fCBvdXRwdXROYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gIAkgIAkJb3V0cHV0TmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlT3V0cHV0TmFtZShwb3J0VHlwZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0gIAkJCi0gIAkJQWRkT3V0cHV0Q29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkT3V0cHV0Q29tbWFuZChvcGVyYXRpb24sIG91dHB1dE5hbWUpOwotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQlPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7Ci0gIAkJTWVzc2FnZSBtZXNzID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlTWVzc2FnZShvdXRwdXQpOwotICAJCW91dHB1dC5zZXRNZXNzYWdlKG1lc3MpOwkKLSAgCQkJICAJCQotICAJCXJldHVybiBvdXRwdXQ7Ci0gIAl9Ci0gIAkJCSAgCQotICAJcHVibGljIHN0YXRpYyBGYXVsdCBjcmVhdGVGYXVsdChPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gIAkJaWYgKGZhdWx0TmFtZSA9PSBudWxsIHx8IGZhdWx0TmFtZS50cmltKCkuZXF1YWxzKCIiKSkgIC8vJE5PTi1OTFMtMSQKLQkgIAkJZmF1bHROYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVGYXVsdE5hbWUob3BlcmF0aW9uKTsKLSAgCQkKLSAgCQlBZGRGYXVsdENvbW1hbmQgYWN0aW9uID0gbmV3IEFkZEZhdWx0Q29tbWFuZChvcGVyYXRpb24sIGZhdWx0TmFtZSk7Ci0gIAkJYWN0aW9uLnJ1bigpOwotICAJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgCQlNZXNzYWdlIG1lc3MgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVNZXNzYWdlKGZhdWx0KTsKLSAgCQlmYXVsdC5zZXRNZXNzYWdlKG1lc3MpOwotICAJCSAJCQotICAJCXJldHVybiBmYXVsdDsKLSAgCX0KLSAgCQkJICAJCi0gIAlwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShNZXNzYWdlUmVmZXJlbmNlIGlvZikgewotICAJCWlmIChtZXNzYWdlTmFtZSA9PSBudWxsIHx8IG1lc3NhZ2VOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gIAkgIAkJbWVzc2FnZU5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGlvZi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGlvZik7Ci0vLwkgIAkJbWVzc2FnZU5hbWUgPSBOYW1lVXRpbC5idWlsZE1lc3NhZ2VOYW1lKGlvZi5nZXROYW1lKCkpOwotICAJCQotICAJCURlZmluaXRpb24gZGVmID0gaW9mLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgCQlBZGRNZXNzYWdlQ29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmLCBtZXNzYWdlTmFtZSk7Ci0gIAkJYWN0aW9uLnJ1bigpOwotICAJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgCQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVQYXJ0KG1lc3NhZ2UpOwotICAJCUVsZW1lbnQgcGFyZW50Tm9kZSA9IG1lc3NhZ2UuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgCi0gICAgICB7Ci0JCSAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRm9ybWF0UHJvY2Vzc29yWE1MIGZvcm1hdFByb2Nlc3NvclhNTCA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOwotICAgICAgfQotICAJCQotICAJCW1lc3NhZ2VOYW1lID0gbnVsbDsKLSAgCQlyZXR1cm4gbWVzc2FnZTsKLSAgCX0KLSAgCQkJICAJCi0gIAlwdWJsaWMgc3RhdGljIFBhcnQgY3JlYXRlUGFydChNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgCQlEZWZpbml0aW9uIGRlZiA9IG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAJCVN0cmluZyBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQYXJ0TmFtZShtZXNzYWdlLCBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAJCUFkZFBhcnRDb21tYW5kIGFjdGlvbiA9IG51bGw7Ci0gIAkJCi0gIAkJaWYgKFBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID09IFBBUlRfSU5GT19UWVBFX0RFRklOSVRJT04pIHsKLSAgCQkJYWN0aW9uID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIG5hbWUsIFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAJCX0KLSAgCQllbHNlIGlmIChQQVJUX1RZUEVfT1JfREVGSU5JVElPTiA9PSBQQVJUX0lORk9fRUxFTUVOVF9ERUNMQVJBVElPTikgeyAgCQkJCi0gIAkJCS8vYWN0aW9uID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIG5hbWUsIFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciLCB0cnVlKTsKLSAgCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gZ2V0TmV3TmFtZUhlbHBlcihuYW1lLCBkZWYsIGZhbHNlKTsKLSAgCQkJQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZCBlbGVtZW50QWN0aW9uID0gbmV3IEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoZGVmLCBlbGVtZW50TmFtZSk7Ci0gIAkJCWVsZW1lbnRBY3Rpb24ucnVuKCk7Ci0gIAkJCWFjdGlvbiA9IG5ldyBBZGRQYXJ0Q29tbWFuZChtZXNzYWdlLCBuYW1lLCBkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnROYW1lLCBmYWxzZSk7Ci0gIAkJfQotCi0gIAkJYWN0aW9uLnJ1bigpOwotICAJCQotICAJCXJldHVybiAoUGFydCkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7Ci0gIAl9CQotCi0gIAkvKgotICAJICogVXNlZCB0byBkZXRlcm1pbmUgYSBuYW1lIGZvciBhbiBFbGVtZW50Ci0gIAkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3TmFtZUhlbHBlcihTdHJpbmcgYmFzZSwgRGVmaW5pdGlvbiBkZWYsIGJvb2xlYW4gaXNUeXBlKQotICAgIHsgCi0gICAgICBTdHJpbmcgbmFtZSA9IGJhc2U7ICAgIAotICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgLy8gVWdseS4uLi4gIFJlZG8gdGhpcy4uLgotICAgICAgLy8gR2V0IGEgbGlzdCBvZiBFbGVtZW50cy4uLgotICAgICAgTGlzdCBlbGVtZW50TGlzdCA9IG51bGw7Ci0gICAgICBpZiAoZGVmLmdldEVUeXBlcygpICE9IG51bGwpIHsKLSAgICAgIAlMaXN0IHhzZHNMaXN0ID0gZGVmLmdldEVUeXBlcygpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIAlpZiAoeHNkc0xpc3QgIT0gbnVsbCkgewotICAgICAgCQlJdGVyYXRvciB4c2RzSXRlcmF0b3IgPSB4c2RzTGlzdC5pdGVyYXRvcigpOwotICAgICAgCQlYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCB4c2RFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSB4c2RzSXRlcmF0b3IubmV4dCgpOwotICAgICAgCQlYU0RTY2hlbWEgc2NoZW1hID0geHNkRWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICAgIAkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAJCQllbGVtZW50TGlzdCA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0gICAgICAJCX0KLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChlbGVtZW50TGlzdCAhPSBudWxsKSB7Ci0gICAgICAJaW50IGluZGV4ID0gMDsKLSAgICAgIAl3aGlsZSAoaW5kZXggPCBlbGVtZW50TGlzdC5zaXplKCkpIHsKLSAgICAgIAkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRMaXN0LmdldChpbmRleCk7Ci0gICAgICAJCQotICAgICAgCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKSkpIHsKLSAgICAgIAkJCWNvdW50Kys7Ci0gICAgICAJCQluYW1lID0gbmFtZSArIGNvdW50OwotICAgICAgCQkJaW5kZXggPSAwOwotICAgICAgCQl9Ci0gICAgICAJCWVsc2UgewotICAgICAgCQkJaW5kZXgrKzsKLSAgICAgIAkJfQotICAgICAgCX0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gIAkvKgotICAJICogUmV0dXJuIHRoZSB0eXBlIG9mIFBhcnQgdGhpcyBXU0RMRWxlbWVudCBzaG91bGQgaGF2ZSAoRWxlbWVudCB2cyBUeXBlKS4gIFRvIGRldGVybWluZSB0aGlzLCB3ZSBmaWx0ZXIgdXAgdG8gdGhlICdwYXJlbnQnIFBvcnRUeXBlCi0gIAkgKiBhbmQgZ28gZG93biB0byB0aGUgZmlyc3QgUGFydCB3ZSBlbmNvdW50ZXIgYW5kIGNoZWNrIHRoZSB0eXBlIGl0IGhhcy4gIElmIHRoaXMgZmFpbHMsIGRlZmF1bHQgdG8gVHlwZS4KLSAgCSAqLwotICAJICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXJ0SW5mbyhXU0RMRWxlbWVudCBlbGVtZW50KSB7Ci0gIAkgIAlTdHJpbmcgcGFydEluZm8gPSBudWxsOwotICAJICAJCi0gIAkgIAlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gIAkgIAkJcGFydEluZm8gPSBnZXRQYXJ0SW5mbygoUG9ydFR5cGUpIGVsZW1lbnQpOwotICAJICAJfQotICAJICAJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJICAJCXBhcnRJbmZvID0gZ2V0UGFydEluZm8oKChXU0RMRWxlbWVudEltcGwpIGVsZW1lbnQpLmdldENvbnRhaW5lcigpKTsKLSAgCSAgCX0KLSAgCSAgCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlUmVmZXJlbmNlSW1wbCkgewotICAJICAJCXBhcnRJbmZvID0gZ2V0UGFydEluZm8oKChXU0RMRWxlbWVudEltcGwpIGVsZW1lbnQpLmdldENvbnRhaW5lcigpKTsKLSAgCSAgCX0KLQotICAJICAJaWYgKHBhcnRJbmZvID09IG51bGwpIHsKLSAgCSAgCQlwYXJ0SW5mbyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfSU5GT19UWVBFX0RFRklOSVRJT047Ci0gIAkgIAl9Ci0gIAkgIAkKLSAgCSAgCXJldHVybiBwYXJ0SW5mbzsgIAkKLSAgCSAgfQotICAJICAKLSAgCSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhcnRJbmZvKFBvcnRUeXBlIHBvcnRUeXBlKSB7Ci0gIAkgIAlTdHJpbmcgcGFydEluZm8gPSBudWxsOwotICAJICAJCi0gIAkgIAlpZiAocG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpICE9IG51bGwpIHsKLSAgCSAgCQlJdGVyYXRvciBvcGVyYXRpb25JdCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAJICAJCXdoaWxlIChvcGVyYXRpb25JdC5oYXNOZXh0KCkpIHsKLSAgCSAgCQkJT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgb3BlcmF0aW9uSXQubmV4dCgpOwotCi0gIAkgIAkJCWlmIChvcC5nZXRFSW5wdXQoKSAhPSBudWxsKSB7Ci0gIAkgIAkJCQlwYXJ0SW5mbyA9IGdldE1lc3NhZ2VSZWZQYXJ0SW5mbygoTWVzc2FnZVJlZmVyZW5jZUltcGwpIG9wLmdldEVJbnB1dCgpKTsKLSAgCSAgCQkJfQotICAJICAJCi0gIAkgIAkJCWlmIChwYXJ0SW5mbyA9PSBudWxsICYmIG9wLmdldEVPdXRwdXQoKSAhPSBudWxsKSB7Ci0gIAkgIAkJCQlwYXJ0SW5mbyA9IGdldE1lc3NhZ2VSZWZQYXJ0SW5mbygoTWVzc2FnZVJlZmVyZW5jZUltcGwpIG9wLmdldEVPdXRwdXQoKSk7Ci0gIAkgIAkJCX0KLSAgCSAgCQotICAJICAJCQlpZiAob3AuZ2V0RUZhdWx0cygpICE9IG51bGwpIHsKLSAgCSAgCQkJCUl0ZXJhdG9yIGZhdWx0SXQgPSBvcC5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgCSAgCQkJCXdoaWxlIChwYXJ0SW5mbyA9PSBudWxsICYmIGZhdWx0SXQuaGFzTmV4dCgpKSB7Ci0gIAkgIAkJCQkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGZhdWx0SXQubmV4dCgpOwotICAJICAJCQkJCXBhcnRJbmZvID0gZ2V0TWVzc2FnZVJlZlBhcnRJbmZvKChNZXNzYWdlUmVmZXJlbmNlSW1wbCkgZmF1bHQpOwotICAJICAJCQkJfQotICAJICAJCQl9Ci0gIAkgIAkgIAkgIAkKLSAgCSAgCQkJaWYgKHBhcnRJbmZvICE9IG51bGwpCi0gIAkgIAkJCQlicmVhazsKLSAgCSAgCQl9Ci0gIAkgIAl9Ci0KLSAgCSAgCXJldHVybiBwYXJ0SW5mbzsKLSAgCSAgfQotICAJICAKLSAgCSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZWZQYXJ0SW5mbyhNZXNzYWdlUmVmZXJlbmNlSW1wbCBpb2YpIHsKLSAgCSAgCVN0cmluZyBwYXJ0SW5mbyA9IG51bGw7Ci0gIAkgIAkKLSAgCSAgCWlmIChpb2YuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsICYmIGlvZi5nZXRFTWVzc2FnZSgpLmdldEVQYXJ0cygpICE9IG51bGwpIHsKLSAgCSAgCQlJdGVyYXRvciBwYXJ0SXQgPSBpb2YuZ2V0RU1lc3NhZ2UoKS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAJICAJCi0gIAkgIAkJd2hpbGUgKHBhcnRJbmZvID09IG51bGwgJiYgcGFydEl0Lmhhc05leHQoKSkgewotICAJICAJCQlQYXJ0IHBhcnQgPSAoUGFydCkgcGFydEl0Lm5leHQoKTsKLSAgCSAgCQkKLSAgCSAgCQkJaWYgKHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gIAkgIAkJCQlwYXJ0SW5mbyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfSU5GT19UWVBFX0RFRklOSVRJT047Ci0gIAkgIAkJCX0KLSAgCSAgCQkJZWxzZSBpZiAocGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0gIAkgIAkJCQlwYXJ0SW5mbyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfSU5GT19FTEVNRU5UX0RFQ0xBUkFUSU9OOwotICAJICAJCQl9Ci0gIAkgIAkJfQotICAJICAJfQotICAJICAJCi0gIAkgIAlyZXR1cm4gcGFydEluZm87Ci0gIAkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9OYW1lVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05hbWVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTkyMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05hbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lVXRpbAotewotICAvKioKLSAgICogUmV0dXJuIGEgbmFtZSB3aGljaCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgZmF1bHQgaW4gdGhlIG9wZXJhdGlvbi4KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlRmF1bHROYW1lKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgCXJldHVybiBidWlsZFVuaXF1ZUZhdWx0TmFtZShvcGVyYXRpb24sICJOZXdGYXVsdCIpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlRmF1bHROYW1lKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBiYXNlTmFtZSkgewotICAJaWYgKGJhc2VOYW1lID09IG51bGwpCi0gIAkJYmFzZU5hbWUgPSAiTmV3RmF1bHQiOyAvLyROT04tTkxTLTEkCi0gIAkKLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkRmF1bHROYW1lcyhvcGVyYXRpb24pOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBpbnB1dCBpbiB0aGUgcG9ydFR5cGUuICBSZXR1cm5lZCBuYW1lIHdpbGwgYmUgb2YgdGhlIGZvcm06Ci0gICAqIDxvcGVyYXRpb25OYW1lPiArIDxlbmRpbmc+IFsrIHVuaXF1ZSBJbnRlZ2VyXQotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVJbnB1dE5hbWUoUG9ydFR5cGUgcG9ydFR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgZW5kaW5nKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIFN0cmluZyBjYW5kaWRhdGUgPSBvcGVyYXRpb25OYW1lICsgZW5kaW5nOwotCi0gICAgaW50IGkgPSAwOwotCi0gICAgLy8gbG9vcCB1bnRpbCB3ZSBmaW5kIGEgdW5pcXVlIG5hbWUgKHRoZSBuYW1lIHdpbGwgY29uc2lzdCBvZiB0aGUgb3BlcmF0aW9uTmFtZSArIGVuZGluZyArIGFuIGludGVnZXIpCi0gICAgd2hpbGUgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBib29sZWFuIHVuaXF1ZSA9IHRydWU7Ci0KLSAgICAgIC8vIGRldGVybWluZSBpZiB0aGlzIGNvbWJpbmF0aW9uIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGN1cnJlbnQgcG9ydHR5cGUKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKSAmJiB1bmlxdWU7KQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gY3VycmVudCA9IChPcGVyYXRpb24pIGl0Lm5leHQoKTsKLSAgICAgICAgLy8gVE9ETyA6IHBvcnQgY2hlY2sKLSAgICAgICAgLy8gb2xkICBpZihjdXJyZW50LmlzU2V0RUlucHV0KCkgJiYgY3VycmVudC5nZXRFSW5wdXQoKS5pc1NldE5hbWUoKSkgewotICAgICAgICBpZiAoY3VycmVudC5nZXRFSW5wdXQoKSAhPSBudWxsICYmIGN1cnJlbnQuZ2V0RUlucHV0KCkuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3VycmVudC5nZXRFSW5wdXQoKS5nZXROYW1lKCkuZXF1YWxzKGNhbmRpZGF0ZSkpCi0gICAgICAgICAgICB1bmlxdWUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHVuaXF1ZSkKLSAgICAgICAgbmFtZSA9IGNhbmRpZGF0ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgY2FuZGlkYXRlID0gb3BlcmF0aW9uTmFtZSArIGVuZGluZyArIGk7Ci0gICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIG1lc3NhZ2UgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gICAgaWYgKGJhc2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgYmFzZU5hbWUgPSAiTmV3TWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBMaXN0IG5hbWVzID0gZ2V0VXNlZE1lc3NhZ2VOYW1lcyhkZWZpbml0aW9uKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKGJhc2VOYW1lLCBuYW1lcyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbmFtZSB3aGljaCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgb3BlcmF0aW9uIGluIHRoZSBwb3J0IHR5cGUuCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZU9wZXJhdGlvbk5hbWUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgCXJldHVybiBidWlsZFVuaXF1ZU9wZXJhdGlvbk5hbWUocG9ydFR5cGUsICJOZXdPcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZU9wZXJhdGlvbk5hbWUoUG9ydFR5cGUgcG9ydFR5cGUsIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAJaWYgKGJhc2VOYW1lID09IG51bGwpIHsKLSAgCQliYXNlTmFtZSA9ICJOZXdPcGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gIAl9Ci0KLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkT3BlcmF0aW9uTmFtZXMocG9ydFR5cGUpOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBvdXRwdXQgaW4gdGhlIHBvcnRUeXBlLiAgUmV0dXJuZWQgbmFtZSB3aWxsIGJlIG9mIHRoZSBmb3JtOgotICAgKiA8b3BlcmF0aW9uTmFtZT4gKyA8ZW5kaW5nPiBbKyB1bmlxdWUgSW50ZWdlcl0KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlT3V0cHV0TmFtZShQb3J0VHlwZSBwb3J0VHlwZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIFN0cmluZyBlbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgU3RyaW5nIGNhbmRpZGF0ZSA9IG9wZXJhdGlvbk5hbWUgKyBlbmRpbmc7Ci0KLSAgICBpbnQgaSA9IDA7Ci0KLSAgICAvLyBsb29wIHVudGlsIHdlIGZpbmQgYSB1bmlxdWUgbmFtZSAodGhlIG5hbWUgd2lsbCBjb25zaXN0IG9mIHRoZSBvcGVyYXRpb25OYW1lICsgZW5kaW5nICsgYW4gaW50ZWdlcikKLSAgICB3aGlsZSAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5pcXVlID0gdHJ1ZTsKLQotICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoaXMgY29tYmluYXRpb24gaXMgdW5pcXVlIHdpdGhpbiB0aGUgY3VycmVudCBwb3J0dHlwZQkJCQotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpICYmIHVuaXF1ZTspCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBjdXJyZW50ID0gKE9wZXJhdGlvbikgaXQubmV4dCgpOwotICAgICAgICAvLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgICAgIC8vIG9sZAkJCQlpZihjdXJyZW50LmlzU2V0RU91dHB1dCgpICYmIGN1cnJlbnQuZ2V0RU91dHB1dCgpLmlzU2V0TmFtZSgpKSB7Ci0gICAgICAgIGlmIChjdXJyZW50LmdldEVPdXRwdXQoKSAhPSBudWxsICYmIGN1cnJlbnQuZ2V0RU91dHB1dCgpLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0RU91dHB1dCgpLmdldE5hbWUoKS5lcXVhbHMoY2FuZGlkYXRlKSkKLSAgICAgICAgICAgIHVuaXF1ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAodW5pcXVlKQotICAgICAgICBuYW1lID0gY2FuZGlkYXRlOwotICAgICAgZWxzZQotICAgICAgICBjYW5kaWRhdGUgPSBvcGVyYXRpb25OYW1lICsgZW5kaW5nICsgaTsKLSAgICAgIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbmFtZSB3aGljaCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgcGFydCBpbiB0aGUgbWVzc2FnZS4KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlUGFydE5hbWUoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gIAlMaXN0IG5hbWVzID0gZ2V0VXNlZFBhcnROYW1lcyhtZXNzYWdlKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdQYXJ0IiwgbmFtZXMpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlUGFydE5hbWUoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgYmFzZU5hbWUpCi0gIHsKLSAgCWlmIChiYXNlTmFtZSA9PSBudWxsKQotICAJewotICAJCWJhc2VOYW1lID0gIk5ld1BhcnQiOyAvLyROT04tTkxTLTEkCi0gIAl9Ci0gIAkKLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkUGFydE5hbWVzKG1lc3NhZ2UpOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBwb3J0IHR5cGUgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVBvcnRUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VOYW1lID0gIk5ld1BvcnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIExpc3QgbmFtZXMgPSBnZXRVc2VkUG9ydFR5cGVOYW1lcyhkZWZpbml0aW9uKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKGJhc2VOYW1lLCBuYW1lcyk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVOYW1lSGVscGVyKFN0cmluZyBiYXNlTmFtZSwgTGlzdCBuYW1lcykKLSAgewotICAgIGludCBpID0gMDsKLQotICAgIFN0cmluZyBuYW1lID0gYmFzZU5hbWU7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWYgKCFuYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICAgICBuYW1lID0gYmFzZU5hbWUgKyBpOwotICAgIH0KLQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIHNlcnZpY2UgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVNlcnZpY2VOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAJTGlzdCBuYW1lcyA9IGdldFVzZWRTZXJ2aWNlTmFtZXMoZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcigiTmV3U2VydmljZSIsIG5hbWVzKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIGJpbmRpbmcgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZUJpbmRpbmdOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gICAgaWYgKGJhc2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgYmFzZU5hbWUgPSAiTmV3QmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBMaXN0IG5hbWVzID0gZ2V0VXNlZEJpbmRpbmdOYW1lcyhkZWZpbml0aW9uKTsKLQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKGJhc2VOYW1lLCBuYW1lcyk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVByZWZpeChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBiYXNlUHJlZml4KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGJhc2VQcmVmaXg7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlKHByZWZpeCkgIT0gbnVsbDsgaSsrKQotICAgIHsKLSAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXggKyBpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVQb3J0TmFtZShTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VOYW1lID0gIk5ld1BvcnQiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAKLSAgICBMaXN0IG5hbWVzID0gZ2V0VXNlZFBvcnROYW1lcyhzZXJ2aWNlKTsKLSAgICAKLQlyZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgbmFtZXMpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNZXNzYWdlUmVmZXJlbmNlIG1lc3NSZWYpCi0gIHsgICAKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgaWYgKG1lc3NSZWYgaW5zdGFuY2VvZiBJbnB1dCkKLSAgICB7Ci0gICAgICBuYW1lID0gY3JlYXRlT3BlcmF0aW9uTmFtZShtZXNzUmVmLCAiUmVxdWVzdCIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzUmVmIGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIG5hbWUgPSBjcmVhdGVPcGVyYXRpb25OYW1lKG1lc3NSZWYsICJSZXNwb25zZSIpOyAgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzUmVmIGluc3RhbmNlb2YgRmF1bHQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgZmF1bHROYW1lID0gKChGYXVsdCkgbWVzc1JlZikuZ2V0TmFtZSgpOwotICAgICAgaWYgKGZhdWx0TmFtZSA9PSBudWxsIHx8IGZhdWx0TmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBmYXVsdE5hbWUgPSAiRmF1bHQiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBuYW1lID0gY3JlYXRlT3BlcmF0aW9uTmFtZShtZXNzUmVmLCBmYXVsdE5hbWUpOyAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICByZXR1cm4gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCBuYW1lKTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkRmF1bHROYW1lcyhPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgIG5hbWVzLmFkZChmYXVsdC5nZXROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VXNlZE9wZXJhdGlvbk5hbWVzKFBvcnRUeXBlIHBvcnRUeXBlKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgbmFtZXMuYWRkKG9wLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRQYXJ0TmFtZXMoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpLm5leHQoKTsKLSAgICAgIG5hbWVzLmFkZChwYXJ0LmdldE5hbWUoKSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkUG9ydFR5cGVOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgICBBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBpLm5leHQoKTsKLSAgICAgIC8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIC8vCQkJaWYgKHBvcnRUeXBlLmlzU2V0UU5hbWUoKSkKLSAgICAgIGlmIChwb3J0VHlwZS5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzLmFkZChwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICAgIAotICB9Ci0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkU2VydmljZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIC8vIEZpcnN0IGJ1aWxkIGEgbGlzdCBvZiBuYW1lcyBhbHJlYWR5IHVzZWQKLSAgICBBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGkubmV4dCgpOwotICAgICAgLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgLy8gCQlpZihzZXJ2aWNlLmlzU2V0UU5hbWUoKSkKLSAgICAgIGlmIChzZXJ2aWNlLmdldFFOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgbmFtZXMuYWRkKHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRNZXNzYWdlTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RU1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbXNnID0gKE1lc3NhZ2UpIGkubmV4dCgpOwotICAgICAgLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgaWYgKG1zZy5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgICAgIC8vCQkJaWYobXNnLmlzU2V0UU5hbWUoKSkKLSAgICAgICAgbmFtZXMuYWRkKG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRCaW5kaW5nTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBpLm5leHQoKTsKLSAgICAgIC8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIC8vCQkJaWYgKGJpbmRpbmcuaXNTZXRRTmFtZSgpKQotICAgICAgaWYgKGJpbmRpbmcuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lcy5hZGQoYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRQb3J0TmFtZXMoU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgLy8gRmlyc3QgYnVpbGQgYSBsaXN0IG9mIG5hbWVzIGFscmVhZHkgdXNlZAotICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgaS5uZXh0KCk7Ci0KLSAgICAgIGlmIChwb3J0LmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lcy5hZGQocG9ydC5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVPcGVyYXRpb25OYW1lKE9iamVjdCBvYmplY3QsIFN0cmluZyBzdWZmaXgpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICBFT2JqZWN0IHBhcmVudCA9ICgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICgoT3BlcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgIH0gCi0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSBzdWZmaXg7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZU5hbWUoTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmKSB7CSAgICAKLQlTdHJpbmcgbWVzc2FnZU5hbWUgPSAiTmV3TWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLQlMaXN0IG1lc3NhZ2VOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgbWVzc2FnZVJlZi5nZXRDb250YWluZXIoKTsKLQlJdGVyYXRvciBtZXNzYWdlSXQgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7Ci0Jd2hpbGUgKG1lc3NhZ2VJdC5oYXNOZXh0KCkpIHsKLQkJbWVzc2FnZU5hbWVzLmFkZCgoKE1lc3NhZ2UpIG1lc3NhZ2VJdC5uZXh0KCkpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCX0KLQkKLS8vCVN0cmluZyByZXF1ZXN0UmVzcG9uc2VTdHJpbmcgPSBnZXRSZXF1ZXN0T3JSZXNwb25zZShtZXNzYWdlUmVmKSArICJNc2ciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIHJlcXVlc3RSZXNwb25zZVN0cmluZyA9IGdldFJlcXVlc3RPclJlc3BvbnNlKG1lc3NhZ2VSZWYpOyAvLyROT04tTkxTLTEkCi0JbWVzc2FnZU5hbWUgPSBnZXRVbmlxdWVOYW1lSGVscGVyKG9wZXJhdGlvbi5nZXROYW1lKCkgKyByZXF1ZXN0UmVzcG9uc2VTdHJpbmcsIG1lc3NhZ2VOYW1lcyk7Ci0JCi0JcmV0dXJuIG1lc3NhZ2VOYW1lOwotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXJ0TmFtZShNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYpIHsKLQlTdHJpbmcgcGFydE5hbWUgPSAiTmV3UGFydCI7IC8vJE5PTi1OTFMtMSQKLQlNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlUmVmLmdldEVNZXNzYWdlKCk7Ci0JCi0JT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG1lc3NhZ2VSZWYuZ2V0Q29udGFpbmVyKCk7Ci0JU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotCVN0cmluZyBhcHBlbmRTdHJpbmcgPSAiIjsgICAgCSAgIC8vJE5PTi1OTFMtMSQKLQlpZiAobWVzc2FnZVJlZiBpbnN0YW5jZW9mIElucHV0KSB7Ci0vLwkJYXBwZW5kU3RyaW5nID0gIlBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCi0JCWFwcGVuZFN0cmluZyA9ICJSZXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQllbHNlIGlmIChtZXNzYWdlUmVmIGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0vLwkJYXBwZW5kU3RyaW5nID0gIlJlc3VsdCI7IC8vJE5PTi1OTFMtMSQKLQkJYXBwZW5kU3RyaW5nID0gIlJlc3BvbnNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQllbHNlIGlmIChtZXNzYWdlUmVmIGluc3RhbmNlb2YgRmF1bHQpIHsKLS8vCQlhcHBlbmRTdHJpbmcgPSAiRmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCWFwcGVuZFN0cmluZyA9ICJfRmF1bHQiOyAvLyROT04tTkxTLTEkCi0JfQotCXBhcnROYW1lID0gb3BlcmF0aW9uTmFtZSArIGFwcGVuZFN0cmluZzsKLQkKLQlMaXN0IHVzZWRQYXJ0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQlwYXJ0TmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJSXRlcmF0b3IgcGFydEl0ID0gbWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocGFydEl0Lmhhc05leHQoKSkgewotCQkJdXNlZFBhcnROYW1lcy5hZGQoKChQYXJ0KSBwYXJ0SXQubmV4dCgpKS5nZXROYW1lKCkpOwotCQl9Ci0JfQotCQotCXBhcnROYW1lID0gZ2V0VW5pcXVlTmFtZUhlbHBlcihwYXJ0TmFtZSwgdXNlZFBhcnROYW1lcyk7Ci0JCi0JcmV0dXJuIHBhcnROYW1lOwotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKFBvcnRUeXBlIHBvcnRUeXBlKSB7Ci0JU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSAiTmV3T3BlcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCUl0ZXJhdG9yIG9wZXJhdGlvbkl0ID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotCUxpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCXdoaWxlIChvcGVyYXRpb25JdC5oYXNOZXh0KCkpIHsKLQkJdXNlZE5hbWVzLmFkZCgoKE9wZXJhdGlvbikgb3BlcmF0aW9uSXQubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQkKLQlvcGVyYXRpb25OYW1lID0gZ2V0VW5pcXVlTmFtZUhlbHBlcigiTmV3T3BlcmF0aW9uIiwgdXNlZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQotCXJldHVybiBvcGVyYXRpb25OYW1lOwotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXF1ZXN0T3JSZXNwb25zZShNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYpIHsKLQlpZiAobWVzc2FnZVJlZiBpbnN0YW5jZW9mIElucHV0KQotCXsKLQkJcmV0dXJuICJSZXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQllbHNlIGlmIChtZXNzYWdlUmVmIGluc3RhbmNlb2YgT3V0cHV0KQotCXsKLQkJcmV0dXJuICJSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JZWxzZSBpZiAobWVzc2FnZVJlZiBpbnN0YW5jZW9mIEZhdWx0KQotCXsKLQkJcmV0dXJuICJfRmF1bHQiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGYXVsdE5hbWUoT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCVN0cmluZyBmYXVsdE5hbWUgPSAiZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JTGlzdCBuYW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlJdGVyYXRvciBmYXVsdEl0ID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOwotCXdoaWxlIChmYXVsdEl0Lmhhc05leHQoKSkgewotCQluYW1lTGlzdC5hZGQoKChGYXVsdCkgZmF1bHRJdC5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCWZhdWx0TmFtZSA9IGdldFVuaXF1ZU5hbWVIZWxwZXIoZmF1bHROYW1lLCBuYW1lTGlzdCk7Ci0JCi0JcmV0dXJuIGZhdWx0TmFtZTsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WFNERWxlbWVudE5hbWUoU3RyaW5nIGJhc2VOYW1lLCBPYmplY3QgcGFyZW50KSB7Ci0JU3RyaW5nIGVsZW1lbnROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKSB7Ci0JCWVsZW1lbnROYW1lID0gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgZ2V0VXNlZEVsZW1lbnROYW1lcygoWFNEU2NoZW1hKSBwYXJlbnQpKTsKLQl9Ci0JZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkgewotCQlMaXN0IGV4aXN0aW5nTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBwYXJlbnQ7Ci0JCUl0ZXJhdG9yIG1vZGVsR3JvdXBJdCA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAobW9kZWxHcm91cEl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IGl0ZW0gPSBtb2RlbEdyb3VwSXQubmV4dCgpOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgewotCQkJCVhTRFBhcnRpY2xlIGV4aXN0aW5nUGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZW07Ci0JCQkJaWYgKGV4aXN0aW5nUGFydGljbGUuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCWV4aXN0aW5nTmFtZXMuYWRkKCgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBleGlzdGluZ1BhcnRpY2xlLmdldENvbnRlbnQoKSkuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWVsZW1lbnROYW1lID0gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgZXhpc3RpbmdOYW1lcyk7CQkJCi0JfQotCQotCXJldHVybiBlbGVtZW50TmFtZTsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WFNEQ29tcGxleFR5cGVOYW1lKFN0cmluZyBiYXNlTmFtZSwgWFNEU2NoZW1hIHNjaGVtYSkgewotCVN0cmluZyB0eXBlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JTGlzdCBleGlzdGluZ05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCUl0ZXJhdG9yIGl0ID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHsKLQkJCWV4aXN0aW5nTmFtZXMuYWRkKCgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBpdGVtKS5nZXROYW1lKCkpOwotCQl9Ci0JfQotCQotCXR5cGVOYW1lID0gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgZXhpc3RpbmdOYW1lcyk7Ci0JcmV0dXJuIHR5cGVOYW1lOwotfQotCi1wcml2YXRlIHN0YXRpYyBMaXN0IGdldFVzZWRFbGVtZW50TmFtZXMoWFNEU2NoZW1hIHhzZFNjaGVtYSkgewotCUxpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCUl0ZXJhdG9yIHNjaGVtYUl0ID0geHNkU2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQl3aGlsZSAoc2NoZW1hSXQuaGFzTmV4dCgpKSB7Ci0JCU9iamVjdCBpdGVtID0gc2NoZW1hSXQubmV4dCgpOwotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJdXNlZE5hbWVzLmFkZCgoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaXRlbSkuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gdXNlZE5hbWVzOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05vZGVBc3NvY2lhdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9Ob2RlQXNzb2NpYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYzA1MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05vZGVBc3NvY2lhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuWFNETm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JTm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9ucy5XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5vZGVBc3NvY2lhdGlvbk1hbmFnZXIKLXsgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIgd3NkbFByb3ZpZGVyOwotICBwcm90ZWN0ZWQgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIHhzZFByb3ZpZGVyOwotCi0gIHB1YmxpYyBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyKCkKLSAgeyAgICAgICAgICAgICAKLQkgIHdzZGxQcm92aWRlciA9IG5ldyBXU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIoKTsKLQkgIHhzZFByb3ZpZGVyID0gbmV3IFhTRE5vZGVBc3NvY2lhdGlvblByb3ZpZGVyKCk7Ci0gIH0gICAgICAgIAotCi0gIHByb3RlY3RlZCBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIgZ2V0QXBwaWNhYmxlUHJvdmlkZXIoT2JqZWN0IG9iamVjdCkKLSAgewotCSAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHx8IAotCSAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50IHx8Ci0JICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKSB7Ly8gfHwKLS8vCSAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5KSB7Ci0JCSAgcmV0dXJuIHhzZFByb3ZpZGVyOwotCSAgfQotCSAgCi0JICByZXR1cm4gd3NkbFByb3ZpZGVyOwotICB9Ci0gICAgICAgIAotCi0gIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3RGb3JOb2RlKE9iamVjdCByb290T2JqZWN0LCBFbGVtZW50IHRhcmdldE5vZGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmICh0YXJnZXROb2RlICE9IG51bGwgJiYgdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBUaGUgZWxlbWVudCB3YXMgYWxyZWFkeSByZW1vdmVkIGZyb20gdGhlIERPTSwgY29tbW9uIHNjZW5hcmlvIGR1cmluZyB1bmRvLgotICAgICAgLy8gVGhlIHBhcmVudCBlbGVtZW50J3MgcmVjb25jaWxpYXRpb24gd2lsbCB0YWtlIGNhcmUgb2YgcmVjb25jaWxpbmcgaXQuCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgaW50IGN1cnJlbnRJbmRleCA9IDA7Ci0KLSAgICBFbGVtZW50W10gZWxlbWVudENoYWluID0gZ2V0UGFyZW50RWxlbWVudENoYWluKChFbGVtZW50KXRhcmdldE5vZGUpOwotCi0gICAgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIHAgPSBnZXRBcHBpY2FibGVQcm92aWRlcihyb290T2JqZWN0KTsKLSAgICBpZiAocCAhPSBudWxsKQotICAgIHsKLSAgICAgIE5vZGUgcm9vdE9iamVjdE5vZGUgPSBwLmdldE5vZGUocm9vdE9iamVjdCk7Ci0KLSAgICAgIHdoaWxlIChjdXJyZW50SW5kZXggPCBlbGVtZW50Q2hhaW4ubGVuZ3RoKQotICAgICAgewotICAgICAgICBFbGVtZW50IGUgPSBlbGVtZW50Q2hhaW5bY3VycmVudEluZGV4XTsKLSAgICAgICAgaWYgKGUgPT0gcm9vdE9iamVjdE5vZGUpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgY3VycmVudEluZGV4Kys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VycmVudEluZGV4Kys7Ci0gICAgICB9Ci0gICAgfQotICAgICAgICAgICAgIAotICAgIE9iamVjdCBjdXJyZW50T2JqZWN0ID0gcm9vdE9iamVjdDsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgZW5kW10gPSBuZXcgaW50WzFdOwotCi0gICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IGVsZW1lbnRDaGFpbi5sZW5ndGgpCi0gICAgeyAgICAgICAgICAgICAgIAotICAgICAgcCA9IGdldEFwcGljYWJsZVByb3ZpZGVyKGN1cnJlbnRPYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZW5kWzBdID0gZWxlbWVudENoYWluLmxlbmd0aDsKLSAgICAgICAgY3VycmVudE9iamVjdCA9IHAuZ2V0TW9kZWxPYmplY3QoY3VycmVudE9iamVjdCwgZWxlbWVudENoYWluLCBjdXJyZW50SW5kZXgsIGVuZCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY3VycmVudE9iamVjdCA9PSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIGZhaWx1cmUKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50SW5kZXggPSBNYXRoLm1heChlbmRbMF0sIGN1cnJlbnRJbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgIAotICAgICAgICBicmVhazsKLSAgICAgIH0gCi0gICAgfSAgICAgCi0KLSAgICByZXR1cm4gKGN1cnJlbnRJbmRleCA9PSBlbGVtZW50Q2hhaW4ubGVuZ3RoKSA/IGN1cnJlbnRPYmplY3QgOiBudWxsOwotICB9ICAKLSAgICAgICAgICAgCi0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZShPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsgICAgICAgICAgCi0gICAgTm9kZSByZXN1bHQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoTm9kZSltb2RlbE9iamVjdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlciBwID0gZ2V0QXBwaWNhYmxlUHJvdmlkZXIobW9kZWxPYmplY3QpOyAgICAgICAgICAgICAgIAotICAgICAgaWYgKHAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcC5nZXROb2RlKG1vZGVsT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9ICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotCi0gIHByb3RlY3RlZCBFbGVtZW50W10gZ2V0UGFyZW50RWxlbWVudENoYWluKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB3aGlsZSAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKDAsIGVsZW1lbnQpOwotICAgICAgTm9kZSBub2RlID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBlbGVtZW50ID0gKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpID8gKEVsZW1lbnQpbm9kZSA6IG51bGw7ICAgIAotICAgIH0gICAgICAgICAgICAgICAgCi0KLSAgICBpbnQgbGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLSAgICBFbGVtZW50W10gcmVzdWx0ID0gbmV3IEVsZW1lbnRbbGlzdFNpemVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykKLSAgICB7Ci0gICAgICByZXN1bHRbaV0gPSAoRWxlbWVudClsaXN0LmdldChpKTsKLSAgICB9ICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjUzMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL09wZW5PblNlbGVjdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuSW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExTd2l0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNESHlwZXJsaW5rVGFyZ2V0TG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE9wZW5PblNlbGVjdGlvbkhlbHBlciBleHRlbmRzIFdTRExTd2l0Y2gKLXsKLSAgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBBdHRyIGF0dHIgPSBudWxsOwotICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0gIHB1YmxpYyBPcGVuT25TZWxlY3Rpb25IZWxwZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoRU9iamVjdCBlT2JqZWN0KQotICB7Ci0gICAgU3RyaW5nW10gYXJyYXkgPSBjb21wdXRlU3BlY2lmaWNhdGlvbihlT2JqZWN0KTsKLSAgICBpZiAoYXJyYXkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcGVuRWRpdG9yKGFycmF5WzBdLCBhcnJheVsxXSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgb3BlbkVkaXRvcihOb2RlIG5vZGUpCi0gIHsKLSAgICBTdHJpbmdbXSBhcnJheSA9IGNvbXB1dGVTcGVjaWZpY2F0aW9uKG5vZGUpOwotICAgIGlmIChhcnJheSAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wZW5FZGl0b3IoYXJyYXlbMF0sIGFycmF5WzFdKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBvcGVuRWRpdG9yKFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIHNwZWMpCi0gIHsKLSAgICBTdHJpbmcgcGF0dGVybiA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2Uuc3RhcnRzV2l0aChwYXR0ZXJuKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgocmVzb3VyY2Uuc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpKTsKLSAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQotICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCAmJgotICAgICAgICAgICAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKQotICAgICAgICB7ICAKLSAgICAgICAgCXdvcmtiZW5jaFBhZ2UuZ2V0TmF2aWdhdGlvbkhpc3RvcnkoKS5tYXJrTG9jYXRpb24oZWRpdG9yUGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlc291cmNlLmVuZHNXaXRoKCJ4c2QiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoUGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksIFdTRExFZGl0b3JQbHVnaW4uWFNEX0VESVRPUl9JRCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgd3NkbGVkaXRvcgotCQkJICAgICAgICBlZGl0b3JQYXJ0ID0gIHdvcmtiZW5jaFBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBlZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBpbml0RXgpCi0gCQkJCQl7Ci0gCQkJCQl9Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGVkaXRvclBhcnQuZ2V0Q2xhc3MoKTsKLSAgICAgICAgQ2xhc3NbXSBtZXRob2RBcmdzID0geyBTdHJpbmcuY2xhc3MgfTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRoZUNsYXNzLmdldE1ldGhvZCgib3Blbk9uU2VsZWN0aW9uIiwgbWV0aG9kQXJncyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgT2JqZWN0IGFyZ3NbXSA9IHsgc3BlYyB9OwotICAgICAgICBtZXRob2QuaW52b2tlKGVkaXRvclBhcnQsIGFyZ3MpOwotICAgICAgICB3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkubWFya0xvY2F0aW9uKGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBjb21wdXRlU3BlY2lmaWNhdGlvbihFT2JqZWN0IGVPYmplY3QpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotICAgIE9iamVjdCByZWZlcmVuY2VkT2JqZWN0ID0gZG9Td2l0Y2goZU9iamVjdCk7Ci0gICAgaWYgKHJlZmVyZW5jZWRPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIEVPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSAoRU9iamVjdClyZWZlcmVuY2VkT2JqZWN0OwotICAgICAgaWYgKHJlZmVyZW5jZWRFT2JqZWN0ICE9IGVPYmplY3QgfHwgCi0gICAgICAgICByZWZlcmVuY2VkRU9iamVjdC5lUmVzb3VyY2UoKSAhPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpKQotICAgICAgeyAgICAgICAgCi0gICAgICAKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gcmVmZXJlbmNlZEVPYmplY3QuZVJlc291cmNlKCk7Ci0gICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgcmVzdWx0WzBdID0gcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLSAgICAgICAgcmVzdWx0WzFdID0gcmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQocmVmZXJlbmNlZEVPYmplY3QpOwotICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGNvbXB1dGVTcGVjaWZpY2F0aW9uKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgIGF0dHIgPSAoQXR0cilub2RlOwotICAgICAgICAgIGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgZWxlbWVudCA9IChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSA/IChFbGVtZW50KXBhcmVudCA6IG51bGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KGRlZmluaXRpb24sIGVsZW1lbnQpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbXB1dGVTcGVjaWZpY2F0aW9uKChFT2JqZWN0KW9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBiaW5kaW5nOwotICAgIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlUGFydChQYXJ0IHBhcnQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gcGFydDsKLSAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwYXJ0LmdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSA9PSBkZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsID8gKE9iamVjdClwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgOiAoT2JqZWN0KXBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBwb3J0OwotICAgIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuQklORElOR19BVFRSSUJVVEUpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgaWYgKGlzTWF0Y2hpbmdBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gZmF1bHQuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gaW5wdXQ7Ci0gICAgaWYgKGlzTWF0Y2hpbmdBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gaW5wdXQuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gb3V0cHV0OwotCi0gICAgaWYgKGlzTWF0Y2hpbmdBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gb3V0cHV0LmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgY2FzZUltcG9ydChJbXBvcnQgdGhlSW1wb3J0KQotICB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkKLQkJLy8gRm9yIG5vdywgbG9vayBhdCB0aGUgZmlsZSBleHRlbnNpb24uICBXaGVuIGJ1Z3ppbGxhIDExODI5MyBpcyBmaXhlZCwgbG9vayBhdAotCQkvLyB0aGUgSW1wb3J0J3MgZURlZmluaXRpb24gYW5kIGVTY2hlbWEgaW5zdGVhZC4KLQkJUGF0aCBpbXBvcnRQYXRoID0gbmV3IFBhdGgodGhlSW1wb3J0LmdldExvY2F0aW9uVVJJKCkpOwotCQlTdHJpbmcgZXh0ZW5zaW9uID0gaW1wb3J0UGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWlmIChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgieHNkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHRoZUltcG9ydC5nZXRFU2NoZW1hKCkgPT0gbnVsbCkgewotCQkJCSgoSW1wb3J0SW1wbCl0aGVJbXBvcnQpLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotCQkJfQotCQkJCi0JCQlyZXN1bHQgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotCQl9Ci0JCWVsc2UgaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ3c2RsIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHRoZUltcG9ydC5nZXRFRGVmaW5pdGlvbigpID09IG51bGwpIHsKLQkJCQkoKEltcG9ydEltcGwpdGhlSW1wb3J0KS5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsKLQkJCX0KLQkJCQotCQkJcmVzdWx0ID0gdGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJCi0JCQotLy8JCWlmICh0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpICE9IG51bGwpIHsKLS8vCQkJcmVzdWx0ID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLS8vCQl9Ci0vLwkJZWxzZSBpZiAodGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotLy8JCQlyZXN1bHQgPSB0aGVJbXBvcnQuZ2V0RURlZmluaXRpb24oKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkgICAgICAgIC8vIE5lZWQgdG8gcmVzb2x2ZSBpbXBvcnRzIGJlY2F1c2UgdGhlIG1vZGVsIGRvZXNuJ3QgYXV0b21hdGljYWxseQotLy8JICAgICAgICAvLyBkbyBpdCBmb3IgdXMKLS8vCSAgICAgICAgKChJbXBvcnRJbXBsKXRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0vLwkgICAgICAgIHJlc3VsdCA9IHRoZUltcG9ydC5nZXRFU2NoZW1hKCk7Ci0vLwkgICAgfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IHdzZGxFbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIHdzZGxFbGVtZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzTWF0Y2hpbmdBdHRyaWJ1dGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIGF0dHIgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoYXR0ci5nZXROYW1lKCkpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgewotICAgIEVDbGFzcyB0aGVFQ2xhc3MgPSBvYmplY3QuZUNsYXNzKCk7Ci0gICAgCi0gICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UpCi0gICAgewotICAgICAgLy8gSGFuZGxlIG5hdmlnYXRpb24gYmV0d2VlbiBpbmxpbmUgc2NoZW1hIGNvbXBvbmVudHMuCi0gICAgICAKLSAgICAgIFhTREh5cGVybGlua1RhcmdldExvY2F0b3IgeHNkSHlwZXJsaW5rVGFyZ2V0TG9jYXRvciA9IG5ldyBYU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yKCk7Ci0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHIgIT0gbnVsbCA/IGF0dHIuZ2V0TmFtZSgpOiBudWxsOwotICAgICAgcmV0dXJuIHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IubG9jYXRlKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb2JqZWN0LCBhdHRyaWJ1dGVOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN1cGVyLmRlZmF1bHRDYXNlKG9iamVjdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9SZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1JlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTIwY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1JlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMUVuZFBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExUGFyYW1ldGVyRm9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQuVzExQmluZGluZ1JlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQuVzExSW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdC5XMTFNZXNzYWdlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZWRpdC5XU0RMWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmVkaXQuV1NETFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlciB7Ci0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldEJpbmRpbmdSZWZlcmVuY2VFZGl0TWFuYWdlcihJQVNET2JqZWN0IGFzZE9iamVjdCkgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoVzExSW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAgKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoVzExQmluZGluZ1JlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0ICYmIGFzZE9iamVjdCBpbnN0YW5jZW9mIFcxMUVuZFBvaW50KSB7Ci0gICAgICAgICAgICAgICAgV1NETEVsZW1lbnQgZWxlbWVudCA9IChXU0RMRWxlbWVudCkgKChXMTFFbmRQb2ludCkgYXNkT2JqZWN0KS5nZXRUYXJnZXQoKTsgCi0gICAgICAgICAgICAgICAgSURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKElEZXNjcmlwdGlvbikgV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyLmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVzExQmluZGluZ1JlZmVyZW5jZUVkaXRNYW5hZ2VyKChXMTFEZXNjcmlwdGlvbikgZGVzY3JpcHRpb24sICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0SW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIoSUFTRE9iamVjdCBhc2RPYmplY3QpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAocGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKFcxMUludGVyZmFjZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoVzExSW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCAmJiBhc2RPYmplY3QgaW5zdGFuY2VvZiBXMTFCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgV1NETEVsZW1lbnQgZWxlbWVudCA9IChXU0RMRWxlbWVudCkgKChXMTFCaW5kaW5nKSBhc2RPYmplY3QgKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICBJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoSURlc2NyaXB0aW9uKSBXU0RMQWRhcHRlckZhY3RvcnlIZWxwZXIuZ2V0SW5zdGFuY2UoKS5hZGFwdChlbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXMTFJbnRlcmZhY2VSZWZlcmVuY2VFZGl0TWFuYWdlcigoVzExRGVzY3JpcHRpb24pIGRlc2NyaXB0aW9uLCAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldE1lc3NhZ2VSZWZlcmVuY2VFZGl0TWFuYWdlcihJQVNET2JqZWN0IGFzZE9iamVjdCkgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoVzExTWVzc2FnZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoVzExTWVzc2FnZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgJiYgYXNkT2JqZWN0IGluc3RhbmNlb2YgVzExTWVzc2FnZVJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgIFdTRExFbGVtZW50IGVsZW1lbnQgPSAoV1NETEVsZW1lbnQpICgoVzExTWVzc2FnZVJlZmVyZW5jZSkgYXNkT2JqZWN0KS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICBJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoSURlc2NyaXB0aW9uKSBXU0RMQWRhcHRlckZhY3RvcnlIZWxwZXIuZ2V0SW5zdGFuY2UoKS5hZGFwdChlbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXMTFNZXNzYWdlUmVmZXJlbmNlRWRpdE1hbmFnZXIoKFcxMURlc2NyaXB0aW9uKSBkZXNjcmlwdGlvbiwgKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0WFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKElBU0RPYmplY3QgYXNkT2JqZWN0KSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpIHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCAmJiBhc2RPYmplY3QgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JQYXJ0KSB7Ci0gICAgICAgICAgICAgICAgV1NETEVsZW1lbnQgZWxlbWVudCA9IChXU0RMRWxlbWVudCkgKChXMTFQYXJhbWV0ZXJGb3JQYXJ0KSBhc2RPYmplY3QpLmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgIElEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChJRGVzY3JpcHRpb24pIFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlci5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdTRExYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpLCBudWxsLCBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0WFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKElBU0RPYmplY3QgYXNkT2JqZWN0KSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpIHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCAmJiBhc2RPYmplY3QgaW5zdGFuY2VvZiBJUGFyYW1ldGVyICYmIGFzZE9iamVjdCBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikgewotICAgICAgICAgICAgICAgIFdTRExFbGVtZW50IGVsZW1lbnQgPSAoV1NETEVsZW1lbnQpICgoV1NETEJhc2VBZGFwdGVyKSBhc2RPYmplY3QpLmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgIElEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChJRGVzY3JpcHRpb24pIFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlci5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdTRExYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIoKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpLCBudWxsLCBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvVmFsaWRhdGVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9WYWxpZGF0ZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQ5YTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9WYWxpZGF0ZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRlSGVscGVyCi17Ci0gIC8vIFhNTCBMYW5nIGNhbiBoYXZlIG1hbnkgZGlmZmVyZW50IHZhbGlkIGZvcm1hdHMKLSAgLy8gMSkgeHggICAgICBpZS4gZW4sIGZyLCBkZQotICAvLyAyKSB4eC14eCAgIGllLiBlbi1VUywgZW4tRlIKLSAgLy8gMykgSS14eCAgICBpZS4gSS1lbgotICAvLyA0KSBYLXh4ICAgIGllLiBYLWVuCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrWE1MTGFuZyhTdHJpbmcgbGFuZykKLSAgewotICAgIGlmIChsYW5nLmxlbmd0aCgpID09IDApIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgaWYgKGxhbmcubGVuZ3RoKCkgPT0gMSkgCi0gICAgewotICAgICAgY2hhciBjaDAgPSBsYW5nLmNoYXJBdCgwKTsKLSAgICAgIGlmICgoY2gwID49ICdhJyAmJiBjaDAgPD0gJ3onKSB8fCAoY2gwID49ICdBJyAmJiBjaDAgPD0gJ1onKSkKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9MQU5HX1RPT19TSE9SVCIpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaDAgKyAKLSAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIGludCBvZmZzZXQ7Ci0KLSAgICBjaGFyIGNoMCA9IGxhbmcuY2hhckF0KDApOwotICAgIGlmIChsYW5nLmNoYXJBdCgxKSA9PSAnLScpIAotICAgIHsKLSAgICAgIGlmIChjaDAgPT0gJ2knIHx8IGNoMCA9PSAnSScgfHwgY2gwID09ICd4JyB8fCBjaDAgPT0gJ1gnKSAKLSAgICAgICAgb2Zmc2V0ID0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2gwICsgCi0gICAgICAgIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGNoMSA9IGxhbmcuY2hhckF0KDEpOwotICAgICAgaWYgKChjaDAgPj0gJ2EnICYmIGNoMCA8PSAneicpIHx8IChjaDAgPj0gJ0EnICYmIGNoMCA8PSAnWicpKQotICAgICAgICBpZiAoKGNoMSA+PSAnYScgJiYgY2gxIDw9ICd6JykgfHwgKGNoMSA+PSAnQScgJiYgY2gxIDw9ICdaJykpCi0gICAgICAgICAgb2Zmc2V0ID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0NIQVIiKSArIGNoMSArIAotICAgICAgICAgIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EIik7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0NIQVIiKSArIGNoMCArIAotICAgICAgICBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOwotICAgIH0KLQotICAgIGlmIChsYW5nLmxlbmd0aCgpID4gb2Zmc2V0KSAKLSAgICB7Ci0gICAgICBjaGFyIGNoID0gbGFuZy5jaGFyQXQob2Zmc2V0KyspOwotICAgICAgaWYgKGNoICE9ICctJykgCi0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fSFlQSEVOX05FRURFRCIpICsgSW50ZWdlci50b1N0cmluZyhvZmZzZXQtMSk7ICAgICAgICAKLSAgICAgIGVsc2UgCi0gICAgICB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSAKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaCA9PSAnLScpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsYW5nLmxlbmd0aCgpID09IG9mZnNldCkgCi0gICAgICAgICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fSFlQSEVOX0VORElORyIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjaCA9IGxhbmcuY2hhckF0KG9mZnNldCsrKTsKLSAgICAgICAgICAgIGlmICgoY2ggPCAnYScgfHwgY2ggPiAneicpICYmIChjaCA8ICdBJyB8fCBjaCA+ICdaJykpIAotICAgICAgICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaCArIAotICAgICAgICAgICAgICBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobGFuZy5sZW5ndGgoKSA9PSBvZmZzZXQpCi0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSBpZiAoKGNoIDwgJ2EnIHx8IGNoID4gJ3onKSAmJiAoY2ggPCAnQScgfHwgY2ggPiAnWicpKSAKLSAgICAgICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0NIQVIiKSArIGNoICsgCi0gICAgICAgICAgICBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOyAgICAgICAgICAgICAKLSAgICAgICAgICBlbHNlIGlmIChsYW5nLmxlbmd0aCgpID09IG9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIGNoID0gbGFuZy5jaGFyQXQob2Zmc2V0KyspOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIG1pbiB2YWx1ZSBpcyBjb3JyZWN0LgotICAgKiBBIG1pbmltdW0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIDwgbWF4VmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlzVmFsaWRNaW5WYWx1ZShTdHJpbmcgbWluVmFsdWUsIFN0cmluZyBtYXhWYWx1ZSkKLSAgewotICAgIGludCBtaW47Ci0KLSAgICBpZiAobWluVmFsdWUgPT0gbnVsbCB8fCBtaW5WYWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgLy8gTm90aGluZyB0byBjaGVjawotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgbWluID0gSW50ZWdlci5wYXJzZUludChtaW5WYWx1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfRVJST1JfTUlOX05PVF9QT1NJVElWRSIpOwotICAgIH0KLQotICAgIGlmIChtaW4gPCAwKSAKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9NSU5fTk9UX1BPU0lUSVZFIik7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IG1heCA9IEludGVnZXIucGFyc2VJbnQobWF4VmFsdWUpOwotICAgICAgaWYgKG1pbiA+IG1heCkgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX01JTl9WQUxVRSIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIC8vIE1heCBpcyBub3QgYWNjdXJhdGUuIERvbid0IGNvbXBhcmUgaXQuCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgbWF4IHZhbHVlIGlzIGNvcnJlY3QuCi0gICAqIEEgbWF4aW11bSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgPiBtaW5WYWx1ZQotICAgKgotICAgKiBJdCBjYW4gYWxzbyBiZSBzZXQgdGhlIHN0cmluZyAidW5ib3VuZGVkIgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgaXNWYWxpZE1heFZhbHVlKFN0cmluZyBtYXhWYWx1ZSwgU3RyaW5nIG1pblZhbHVlKQotICB7Ci0gICAgaW50IG1heDsKLQotICAgIGlmIChtYXhWYWx1ZSA9PSBudWxsIHx8IG1heFZhbHVlLmVxdWFscygiIikpICAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgLy8gTm90aGluZyB0byBjaGVjawotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaWYgKG1heFZhbHVlLmVxdWFscygidW5ib3VuZGVkIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBtYXggPSBJbnRlZ2VyLnBhcnNlSW50KG1heFZhbHVlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9NQVhfTk9UX1BPU0lUSVZFIik7Ci0gICAgfQotCi0gICAgaWYgKG1heCA8IDApIAotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX01BWF9OT1RfUE9TSVRJVkUiKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbnQgbWluID0gSW50ZWdlci5wYXJzZUludChtaW5WYWx1ZSk7Ci0gICAgICBpZiAobWF4IDwgbWluKSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfRVJST1JfTUFYX1ZBTFVFIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgLy8gTWluIGlzIG5vdCBhY2N1cmF0ZS4gRG9uJ3QgY29tcGFyZSBpdC4KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIG5hbWUgY29uZm9ybXMgdG8gdGhlIFhNTCBzcGVjCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1hNTE5hbWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gYWxsb3dFbnRpdHlSZWYpCi0gIHsKLSAgICBpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLSAgICBjaGFyIGNoYXJhY3RlcjsKLQotICAgIGlmIChsZW5ndGggPT0gMCkgCi0gICAgewotICAgICAgcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiX1dBUk5fTkFNRV9NVVNUX0NPTlRBSU5fQVRfTEVBU1RfT05FX0NIQVIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBpZiAobmFtZS5pbmRleE9mKCIgIikgPj0gMCkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJldHVybihNZXNzYWdlcy5nZXRTdHJpbmcoIl9XQVJOX05BTUVfSEFTX1NQQUNFIikpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgaW50IGluZGV4ID0gMDsKLSAgICBpZiAobGVuZ3RoID4gMCAmJgotICAgICAgICBuYW1lLmNoYXJBdCgwKSA9PSAnJScpCi0gICAgewotICAgICAgaWYgKGFsbG93RW50aXR5UmVmKSAKLSAgICAgIHsKLSAgICAgICAgLy8gc2tpcCBvdmVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIgCi0gICAgICAgIGluZGV4Kys7Ci0gICAgICB9IC8vIGVuZCBvZiBpZiAoKQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfRklSU1QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfSAvLyBlbmQgb2YgZWxzZQotICAgIH0KLSAgICAKLSAgICBmb3IoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBjaGFyYWN0ZXIgPSBuYW1lLmNoYXJBdChpbmRleCk7Ci0KLSAgICAgIGlmKGluZGV4ID09IDApCi0gICAgICB7Ci0gICAgICAgIGlmKCAhaXNYTUxOYW1lU3RhcnQoY2hhcmFjdGVyKSApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfRklSU1QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmKCFpc1hNTE5hbWVDaGFyKGNoYXJhY3RlcikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKGluZGV4ID09IGxlbmd0aCAtIDEpICYmIC8vY2hlY2sgaWYgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgJzsnCi0gICAgICAgICAgICAgIGFsbG93RW50aXR5UmVmICYmCi0gICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAnOycpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gd2UncmUgc3RpbGwgb2sgdGhlbgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaGFyYWN0ZXIgKyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9IC8vIGVuZCBvZiBlbHNlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIG5hbWUgY29uZm9ybXMgdG8gdGhlIFhNTCBzcGVjCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1hNTE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gY2hlY2tYTUxOYW1lKG5hbWUsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBpc1hNTE5hbWVTdGFydAotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxOYW1lU3RhcnQoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPT0gJ18nIHx8IGNoID09ICc6JyB8fCBDaGFyYWN0ZXIuaXNMZXR0ZXIoY2gpICk7Ci0gIH0KLQotICAvKioKLSAgICogaXNYTUxOYW1lQ2hhcgotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxOYW1lQ2hhcihjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJy0nIHx8IGNoID09ICdfJyB8fCBjaCA9PSAnOicpOwotICB9Ci0KLSAgLyoqCi0gICAqIGlzWE1MUHJlZml4U3RhcnQKLSAgICoqLwotLy8gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxQcmVmaXhTdGFydChjaGFyIGNoKQotLy8gIHsKLS8vICAgIHJldHVybiAoY2ggPT0gJ18nIHx8IENoYXJhY3Rlci5pc0xldHRlcihjaCkgKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIGlzWE1MUHJlZml4Q2hhcgotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxQcmVmaXhDaGFyKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJ18nKTsKLSAgfQotCi0gIC8qKgotICAgKiBwYXJzZUVsZW1lbnRUZXh0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUVsZW1lbnRUZXh0KFN0cmluZyB0ZXh0KQotICB7Ci0gICAgaWYgKHRleHQuaW5kZXhPZignPCcpICE9IC0xIHx8IHRleHQuaW5kZXhPZignPicpICE9IC0xKQotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fRUxFTUVOVF9JTlZBTElEX0NIQVIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VBdHRyaWJ1dGVWYWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUuaW5kZXhPZignIicpICE9IC0xIHx8IHZhbHVlLmluZGV4T2YoJzwnKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKCc+JykgIT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9BVFRSSUJVVEVfSU5WQUxJRF9DSEFSIik7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VBREFUQVNlY3Rpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlQ0RBVEFTZWN0aW9uKFN0cmluZyBzZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlY3Rpb24uaW5kZXhPZigiXV0+IikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0NEQVRBX0lOVkFMSURfU1RSSU5HIik7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VQcm9jZXNzaWluZ0luc3RydWN0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbkRhdGEoU3RyaW5nIGRhdGEpCi0gIHsKLSAgICBpZiAoZGF0YS5pbmRleE9mKCI/PiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9QUk9DRVNTSU5HX0lOVkFMSURfU1RSSU5HIik7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25UYXJnZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uVGFyZ2V0KFN0cmluZyB0YXJnZXQpCi0gIHsKLSAgICBpZiAodGFyZ2V0Lmxlbmd0aCgpID09IDMgJiYgKHRhcmdldC5pbmRleE9mKCJYTUwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigiWE1sIikgIT0gLTEgfHwgdGFyZ2V0LmluZGV4T2YoIlhtTCIpICE9IC0xIHx8IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIHRhcmdldC5pbmRleE9mKCJ4TUwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigiWG1sIikgIT0gLTEgfHwgdGFyZ2V0LmluZGV4T2YoInhNbCIpICE9IC0xIHx8IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIHRhcmdldC5pbmRleE9mKCJ4bUwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigieG1sIikgIT0gLTEpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX1BST0NFU1NJTkdfVEFSR0VUX0lOVkFMSURfU1RSSU5HIik7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIGNoZWNrWE1MTmFtZSh0YXJnZXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIHBhcnNDb21tZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUNvbW1lbnQoU3RyaW5nIGNvbW1lbnQpCi0gIHsKLSAgICBpZiAoY29tbWVudC5pbmRleE9mKCItLSIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9DT01NRU5UX0lOVkFMSURfU1RSSU5HIik7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIHByZWZpeCBjb25mb3JtcyB0byB0aGUgWE1MIHNwZWMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrWE1MUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBpbnQgbGVuZ3RoID0gcHJlZml4Lmxlbmd0aCgpOwotICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgY2hhciBjaGFyYWN0ZXI7Ci0gICAgCi0gICAgaWYgKHByZWZpeC5pbmRleE9mKCIgIikgPj0gMCkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJldHVybihVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fUFJFRklYX0hBU19TUEFDRSIpKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGNoYXJhY3RlciA9IHByZWZpeC5jaGFyQXQoaW5kZXgpOwotCi0gICAgICBpZighaXNYTUxQcmVmaXhDaGFyKGNoYXJhY3RlcikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRTdHJpbmcoIl9XQVJOX1BSRUZJWF9JTlZBTElEX0NIQVIiLCBTdHJpbmcudmFsdWVPZihjaGFyYWN0ZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvVzExT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvVzExT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZTIyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1cxMU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QudXRpbC5JT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFcxMU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlciBpbXBsZW1lbnRzIElPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIgewotCXByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQlwcml2YXRlIElGaWxlIHdzZGxGaWxlOwotCQotCXB1YmxpYyBXMTFPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIoSUZpbGUgd3NkbEZpbGUpCi0JewotCQl0aGlzLndzZGxGaWxlID0gd3NkbEZpbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9wZW5FeHRlcm5hbEVkaXRvcigpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gKChXU0RMQmFzZUFkYXB0ZXIpIG9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCQlPYmplY3Qgb3Blbk9uTW9kZWwgPSBnZXRNb2RlbFRvT3Blbk9uKG5vdGlmaWVyKTsKLQkJCQotCQkJaWYgKG9wZW5Pbk1vZGVsIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsKLQkJCQlvcGVuWFNERWRpdG9yKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb3Blbk9uTW9kZWwpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBYU0RTY2hlbWEgZ2V0U2NoZW1hKFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCkgewotCQlYU0RTY2hlbWEgc2NoZW1hID0geHNkQ29tcG9uZW50LmdldFNjaGVtYSgpOwotCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCU9iamVjdCBub3RpZmllciA9ICgoV1NETEJhc2VBZGFwdGVyKSBvYmplY3QpLmdldFRhcmdldCgpOwotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsKLQkJCQlzY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBub3RpZmllcikuZ2V0U2NoZW1hKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzY2hlbWE7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG9wZW5YU0RFZGl0b3IoWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KSB7Ci0JCVhTRFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoeHNkQ29tcG9uZW50KTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLQkJCUlQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJdHJ5IHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoaXNJbmxpbmVTY2hlbWEoZmlsZSkpIHsKLSAgICAgICAgICAgICAgWFNERmlsZUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IFhTREZpbGVFZGl0b3JJbnB1dChmaWxlLCBzY2hlbWEpOwotCQkJCQkKLQkJCQkJCQllZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKE1lc3NhZ2VzLl9VSV9MQUJFTF9JTkxJTkVfU0NIRU1BX09GICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJSUVkaXRvclJlZmVyZW5jZSBbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJCQkJaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQkJCQkJewotCQkJCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZpbGVFZGl0b3JJbnB1dCkKLQkJCQkJCQkJewotCQkJCQkJCQkJSUZpbGUgYUZpbGUgPSAoKFhTREZpbGVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0RmlsZSgpOwotCQkJCQkJCQkJaWYgKGFGaWxlLmdldEZ1bGxQYXRoKCkuZXF1YWxzKGZpbGUuZ2V0RnVsbFBhdGgoKSkpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJaWYgKCgoWFNERmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0JCQkJCQkJCQkJewotCQkJCQkJCQkJCQllZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQkJCQkJCQkJCXBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWlmIChlZGl0b3JQYXJ0ID09IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQllZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IiLCB0cnVlLCAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotICAgICAgICAgICAgICAvLyBTaG91bGQgb3BlbiBpbiBkZWZhdWx0IGVkaXRvcgotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgIC8vIGVkaXRvclBhcnQgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLQkJCQkJCXsKLQkJCQkJCQlJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciB4c2RFZGl0b3IgPSAoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpZWRpdG9yUGFydDsKLQkJCQkJCQl4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotLy8JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBwaWUuZ2V0TWVzc2FnZSgpLCBwaWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CSAgICAgICAgCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGxpbmtBcHBsaWNhYmxlKCkgewotCQlib29sZWFuIGFwcGxpY2FibGUgPSB0cnVlOwotCQkKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQYXJhbWV0ZXIpIHsKLQkJCUlQYXJhbWV0ZXIgcGFyYW0gPSAoSVBhcmFtZXRlcikgb2JqZWN0OwotCQkJU3RyaW5nIHByZWZpeCA9IHBhcmFtLmdldENvbXBvbmVudE5hbWVRdWFsaWZpZXIoKTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpIHsKLQkJCQlhcHBsaWNhYmxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBhcHBsaWNhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE1vZGVsVG9PcGVuT24oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvYmplY3QpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0JCQlyZXR1cm4geHNkRWxlbWVudC5nZXRUeXBlRGVmaW5pdGlvbigpOwotCQl9Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcnQpIHsKLQkJCU9iamVjdCBlbGVtZW50T3JUeXBlID0gKChQYXJ0KSBvYmplY3QpLmdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotCQkJaWYgKGVsZW1lbnRPclR5cGUgPT0gbnVsbCkgewotCQkJCWVsZW1lbnRPclR5cGUgPSAoKFBhcnQpIG9iamVjdCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGVsZW1lbnRPclR5cGU7Ci0JCX0KLQkJCi0JCXJldHVybiBvYmplY3Q7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5saW5lU2NoZW1hKElGaWxlIGZpbGUpIHsKLQkJLy8gU2hvdWxkIHRoZXJlIGJlIGEgYmV0dGVyIHRlc3QgZm9yIHRoaXM/ICBUaGUgSUZpbGVzIGFyZSBkaWZmZXJlbnQgc28gd2UgY2FuJ3QgdXNlIGZpbGUgPT0gd3NkbEZpbGUuCi0JCXJldHVybiBmaWxlLmdldEZ1bGxQYXRoKCkuZXF1YWxzKHdzZGxGaWxlLmdldEZ1bGxQYXRoKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEJhc2VBZGFwdGVyKSB7Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSAoKFdTRExCYXNlQWRhcHRlcikgb2JqZWN0KS5nZXRUYXJnZXQoKTsKLQkJCU9iamVjdCBvcGVuT25Nb2RlbCA9IGdldE1vZGVsVG9PcGVuT24obm90aWZpZXIpOwotCi0JCQkvLyBXZSBjaGVjayB0byBlbnN1cmUgaXQncyBlbGVtZW50ICE9IG51bGwuICBJZiBpdCBkb2VzLCB0aGVuIGl0J3MgYSBzaWduIG9mIGEKLQkJCS8vIGJhZCByZWZlcmVuY2UgKGlzIGludmFsaWQpLgotCQkJaWYgKG9wZW5Pbk1vZGVsIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQgJiYgKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb3Blbk9uTW9kZWwpLmdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBvcGVuT25Nb2RlbDsKLQotCQkJCVhTRFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoeHNkQ29tcG9uZW50KTsKLQkJCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0JCQkJCUlQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0JCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0JCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMQWRhcHRlckZhY3RvcnlIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMQWRhcHRlckZhY3RvcnlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3NGMyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEFkYXB0ZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBXU0RMQWRhcHRlckZhY3RvcnlIZWxwZXIgaW5zdGFuY2U7Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQkKLQlwdWJsaWMgc3RhdGljIFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlcigpOwotCQl9Ci0JCQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0V1NETEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBmYWN0b3J5LmFkYXB0KHRhcmdldCwgZmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXU0RMQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBXU0RMQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFdTRExBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETEVkaXRvclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ2ZmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9ucy5FeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbnMuSVR5cGVTeXN0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgV1NETEVkaXRvclV0aWwgZXh0ZW5kcyBXU0RMQ29uc3RhbnRzCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgV1NETEVkaXRvclV0aWwgaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyIG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIgPSBuZXcgTm9kZUFzc29jaWF0aW9uTWFuYWdlcigpOwotCi0gIHByb3RlY3RlZCBIYXNoTWFwIGVsZW1lbnROYW1lVG9UeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAxNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSA9IDE1OwotCi0gIHB1YmxpYyBzdGF0aWMgV1NETEVkaXRvclV0aWwgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgV1NETEVkaXRvclV0aWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIFdTRExFZGl0b3JVdGlsKCkKLSAgewotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChCSU5ESU5HX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihCSU5ESU5HKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KERFRklOSVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKERFRklOSVRJT04pKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoRE9DVU1FTlRBVElPTikpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChGQVVMVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoRkFVTFQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoSU1QT1JUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihJTVBPUlQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoSU5QVVRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKElOUFVUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KE1FU1NBR0VfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKE1FU1NBR0UpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoT1BFUkFUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihPUEVSQVRJT04pKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoT1VUUFVUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihPVVRQVVQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoUEFSVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoUEFSVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChQT1JUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihQT1JUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFBPUlRfVFlQRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoUE9SVF9UWVBFKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFNFUlZJQ0VfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFNFUlZJQ0UpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoVFlQRVNfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFRZUEVTKSk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFdTRExUeXBlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGludCByZXN1bHQgPSAtMTsKLQotICAgIEludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKWVsZW1lbnROYW1lVG9UeXBlTWFwLmdldChlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICBpZiAoaW50ZWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGludGVnZXIuaW50VmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldFBhcmVudEVsZW1lbnRDaGFpbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgwLCBlbGVtZW50KTsKLSAgICAgIE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgZWxlbWVudCA9IChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSA/IChFbGVtZW50KW5vZGUgOiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChEZWZpbml0aW9uIGRlZmluaXRpb24sIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkKLSAgewotICAgIE9iamVjdCBvID0gbm9kZUFzc29jaWF0aW9uTWFuYWdlci5nZXRNb2RlbE9iamVjdEZvck5vZGUoZGVmaW5pdGlvbiwgdGFyZ2V0RWxlbWVudCk7Ci0gICAgcmV0dXJuIG87Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50Rm9yT2JqZWN0KE9iamVjdCBvKQotICB7Ci0gICAgcmV0dXJuICgob3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQpbykuZ2V0RWxlbWVudCgpOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZUZvck9iamVjdChPYmplY3QgbykKLSAgewotICAgIHJldHVybiBub2RlQXNzb2NpYXRpb25NYW5hZ2VyLmdldE5vZGUobyk7Ci0gIH0KLQotICAvLyBQcm92aWRlIGEgbWFwcGluZyBiZXR3ZWVuIERlZmluaXRpb25zIGFuZCBJVHlwZVN5c3RlbVByb3ZpZGVycwotICBwcml2YXRlIEhhc2h0YWJsZSB0eXBlU3lzdGVtUHJvdmlkZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcml2YXRlIElUeXBlU3lzdGVtUHJvdmlkZXIgdHlwZVN5c3RlbVByb3ZpZGVyOwotICAKLSAgcHVibGljIElUeXBlU3lzdGVtUHJvdmlkZXIgZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotCSAgaWYgKHR5cGVTeXN0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCSAgdHlwZVN5c3RlbVByb3ZpZGVyID0gbmV3IEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIoKTsKLQkgIH0KLQkgIHJldHVybiB0eXBlU3lzdGVtUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUeXBlU3lzdGVtUHJvdmlkZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBJVHlwZVN5c3RlbVByb3ZpZGVyIHR5cGVTeXN0ZW1Qcm92aWRlcikKLSAgewotIC8vICAgdHlwZVN5c3RlbVByb3ZpZGVycy5wdXQoZGVmaW5pdGlvbix0eXBlU3lzdGVtUHJvdmlkZXIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBjcmVhdGVRTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBwcmVmaXhlZE5hbWUpCi0gIHsKLSAgICBRTmFtZSBxbmFtZSA9IG51bGw7Ci0gICAgaWYgKHByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHByZWZpeGVkTmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoaW5kZXggPT0gLTEpID8gbnVsbCA6IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICBxbmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHFuYW1lOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnROb2RlcyhFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCkKLSAgewotICAgIC8vIEZvciBUeXBlcywgSSBuZWVkIHRvIGdldCBhbGwgdGhlIHNjaGVtYXMKLSAgICBpZiAoZXh0ZW5zaWJsZUVsZW1lbnQgaW5zdGFuY2VvZiBUeXBlcykKLSAgICB7Ci0gICAgICBUeXBlcyB4c2RFRSA9IChUeXBlcylleHRlbnNpYmxlRWxlbWVudDsKLSAgICAgIHJldHVybiB4c2RFRS5nZXRTY2hlbWFzKCk7Ci0gICAgfQotICAgIC8qCi0gICAgTGlzdCBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBnZXRFbGVtZW50Rm9yT2JqZWN0KGV4dGVuc2libGVFbGVtZW50KTsKLSAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsKQotICAgIHsKLQotICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBjaGlsZExpc3QuYWRkKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgICAgfQotICAgICAgSGFzaE1hcCBleHRlbnNpYmxlRWxlbWVudFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGV4dGVuc2libGVFbGVtZW50LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWkubmV4dCgpOwotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnRGb3JPYmplY3QoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZXh0ZW5zaWJsZUVsZW1lbnRUYWJsZS5wdXQoZWxlbWVudCwgZWxlbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNoaWxkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmIChleHRlbnNpYmxlRWxlbWVudFRhYmxlLmdldChvKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hpbGRMaXN0OwotICAgICovCi0gICAgcmV0dXJuIGV4dGVuc2libGVFbGVtZW50LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgYSBsaXN0IG9mICdjaGlsZHJlbicgb2YgdGhlIGdpdmVuIG9iamVjdCBtb2RlbCAoV1NETEVsZW1lbnQpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGVsR3JhcGhWaWV3Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotICAJTGlzdCBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAkKLSAgCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotICAJCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBvYmplY3Q7Ci0gICAgICAgIGNoaWxkTGlzdC5hZGRBbGwocG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpKTsKLSAgCX0KLSAgCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvYmplY3Q7Ci0gIAkJCi0gIAkJaWYgKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKSB7Ci0gIAkJCWNoaWxkTGlzdC5hZGQob3BlcmF0aW9uLmdldEVJbnB1dCgpKTsKLSAgCQl9Ci0gIAkJaWYgKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCkgewotICAJCQljaGlsZExpc3QuYWRkKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotICAJCX0KLSAgCQljaGlsZExpc3QuYWRkQWxsKG9wZXJhdGlvbi5nZXRGYXVsdHMoKS52YWx1ZXMoKSk7Ci0gIAl9Ci0gIAllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlUmVmZXJlbmNlKSB7Ci0gIAkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlID0gKE1lc3NhZ2VSZWZlcmVuY2UpIG9iamVjdDsKLSAgCQljaGlsZExpc3QuYWRkKG1lc3NhZ2VSZWZlcmVuY2UuZ2V0RU1lc3NhZ2UoKSk7Ci0gIAl9ICAJCi0gIAkKLSAgCXJldHVybiBjaGlsZExpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZVVSSUZvclNjaGVtYShTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgeyAgICAgICAgICAgICAKLSAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yVXRpbC5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoaW5wdXRTdHJlYW0pOyAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKElucHV0U3RyZWFtIGlucHV0KQotICB7ICAKLSAgICBUYXJnZXROYW1lc3BhY2VVUklDb250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihXU0RMRWRpdG9yVXRpbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAvLyBMaW5lIGJlbG93IGlzIGEgaGFjayB0byBnZXQgWE1MUmVhZGVyIHdvcmtpbmcKLSAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgIAlYTUxSZWFkZXIgcmVhZGVyID0gb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotICAgIAlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgCXJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgICAgICAKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0gICAgfQotICAgIHJldHVybiBoYW5kbGVyLnRhcmdldE5hbWVzcGFjZVVSSTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUYXJnZXROYW1lc3BhY2VVUklDb250ZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsgICAgICAgCi0gICAgcHVibGljIFN0cmluZyB0YXJnZXROYW1lc3BhY2VVUkk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7ICAgICAgICAgICAgCi0gICAgICBpZiAobG9jYWxOYW1lLmVxdWFscygic2NoZW1hIikgfHwgbG9jYWxOYW1lLmVxdWFscygiZGVmaW5pdGlvbnMiKSkKLSAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgaW50IG5BdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cmlidXRlczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpLmVxdWFscygidGFyZ2V0TmFtZXNwYWNlIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlVVJJID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gdG9kbyB0aGVyZSdzIGEgaWNlIHdheSB0byBkbyB0aGlzIEknbSBzdXJlICAgIAotICAgICAgLy8gaGVyZSBJIGludGVudGlhbGx5IGNhdXNlIGFuIGV4Y2VwdGlvbi4uLiAKLSAgICAgIFN0cmluZyB4ID0gbnVsbDsKLSAgICAgIHgubGVuZ3RoKCk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExSZXNvdXJjZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMUmVzb3VyY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOGMxNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExSZXNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFJlc291cmNlVXRpbAotewotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsb2FkRGlyZWN0aXZlcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBSZXNvdXJjZSByb290UmVzb3VyY2UgPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpOwotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcm9vdFJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgaWYgKHJlc291cmNlICE9IHJvb3RSZXNvdXJjZSkKLSAgICAgIHsKLSAgICAgICAgLy8gIFRPRE8uLi4gY29uc2lkZXIgdW5sb2FkaW5nIHRoZSByZXNvdXJjZXMgIAkKLSAgICAgICAgLy8gIHJlc291cmNlLnVubG9hZCgpOwkJICAgICAgCi0gICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJlbG9hZERpcmVjdGl2ZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZWxvYWREaXJlY3RpdmVWaXNpdG9yKCk7Ci0gICAgdmlzaXRvci52aXNpdERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgUmVsb2FkRGlyZWN0aXZlVmlzaXRvcgotICB7Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgdGhlSW1wb3J0KQotICAgIHsKLSAgICAgIC8vIGZvcmNlIHRoZSBpbXBvcnQgdG8gcmVsb2FkCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QodGhlSW1wb3J0KTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgICgoV1NETEVsZW1lbnRJbXBsKXRoZUltcG9ydCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWFEaXJlY3RpdmUoWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSkKLSAgICB7Ci0gICAgICAvLyBmb3JjZSB0aGUgc2NoZW1hIGRpcmVjdGl2ZSB0byByZWxvYWQKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRpcmVjdGl2ZS5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBkaXJlY3RpdmUuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0SW1wb3J0KChJbXBvcnQpIGkubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBvOwotICAgICAgICAgICAgICBpZiAoZS5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlzaXRTY2hlbWEoZS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZSgoWFNEU2NoZW1hRGlyZWN0aXZlKSBvKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFVSSVJlc29sdmVyIGltcGxlbWVudHMgV1NETE1vZGVsTG9jYXRvcgotICB7Ci0gICAgLy9JZFJlc29sdmVyIGlkUmVzb2x2ZXIgPSBuZXcgSWRSZXNvbHZlckltcGwobnVsbCwgdHJ1ZSk7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0KLSAgICBJbnRlcm5hbFVSSVJlc29sdmVyKCkKLSAgICB7ICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZSwgbG9jYXRpb24pOwotCi0gICAgICAvLyBoZXJlJ3MgYW4gdWdseSBoYWNrLi4uIFBsYXRmb3JtLnJlc29sdmUoKSByZXR1cm5zIFdpbmRvd3MgZmlsZXMgd2l0aCB0aGUgcGF0dGVybiAiZmlsZTpEOi9oZWxsby54c2QiCi0gICAgICAvLyBidXQgRU1GJ3MgVVJJIGNsYXNzIGV4cGVjdHMgYSBwYXR0ZXJuIGxpa2UgdGhpcyAiZmlsZTovLy9EOi9oZWxsby54c2QiCi0gICAgICAvLyAgICAgICAgCi0gICAgICBpZiAocmVzb2x2ZWRMb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotCQlTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6IjsgICAgICAJIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHJlc29sdmVkTG9jYXRpb24uc3RhcnRzV2l0aChmaWxlUHJvdG9jb2wpICYmICFyZXNvbHZlZExvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZVByb3RvY29sICsgIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZWRMb2NhdGlvbiA9IHJlc29sdmVkTG9jYXRpb24uc3Vic3RyaW5nKGZpbGVQcm90b2NvbC5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzb2x2ZWRMb2NhdGlvbiA9IFVSSUhlbHBlci5hZGRJbXBsaWVkRmlsZVByb3RvY29sKHJlc29sdmVkTG9jYXRpb24pOwotICAgICAgfQotICAgICAgLy8gZW5kIHVnbHkgaGFjawotICAgICAgcmV0dXJuIHJlc29sdmVkTG9jYXRpb247Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExTZXRDb21wb25lbnRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMU2V0Q29tcG9uZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5N2M1YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExTZXRDb21wb25lbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkltcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRJbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLQotcHVibGljIGNsYXNzIFdTRExTZXRDb21wb25lbnRIZWxwZXIgewotICAgIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICAgIHByaXZhdGUgSUZpbGUgY3VycmVudElGaWxlOwotICAgIAotICAgIHB1YmxpYyBXU0RMU2V0Q29tcG9uZW50SGVscGVyKElGaWxlIGlGaWxlLCBEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgICAgICAgY3VycmVudElGaWxlID0gaUZpbGU7Ci0gICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdTRExDb21wb25lbnQoV1NETEVsZW1lbnQgaW5wdXRFbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBhZGRJbXBvcnRJZk5lY2Vzc2FyeShzcGVjKTsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudE9iamVjdCA9IGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShzcGVjKTsKLQotICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IHdzZGxFbGVtZW50ID0gaW5wdXRFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIHdzZGxFbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wZXJ0eSwgY29tcG9uZW50T2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRYU0RUeXBlQ29tcG9uZW50KFBhcnQgcGFydCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgIGlmIChzcGVjLmdldE5hbWUoKSAhPSBudWxsICYmIHNwZWMuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkSW1wb3J0SWZOZWNlc3Nhcnkoc3BlYyk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudE9iamVjdCA9IGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShzcGVjKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0Q29tcG9uZW50UmVmZXJlbmNlKChQYXJ0KSBwYXJ0LCB0cnVlLCBjb21wb25lbnRPYmplY3QpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRYU0RFbGVtZW50Q29tcG9uZW50KFBhcnQgcGFydCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgIGFkZEltcG9ydElmTmVjZXNzYXJ5KHNwZWMpOwotICAgICAgICBTdHJpbmcgY29tcG9uZW50T2JqZWN0ID0gZ2V0UHJlZml4ZWRDb21wb25lbnROYW1lKHNwZWMpOwotICAgICAgICAKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UoKFBhcnQpIHBhcnQsIGZhbHNlLCBjb21wb25lbnRPYmplY3QpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFJldHVybiB0aGUgcHJlZml4ZWQgY29tcG9uZW50IG5hbWUgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbgotICAgICAqIENvbXBvbmVudFNwZWNpZmljYXRpb24gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4ZWRDb21wb25lbnROYW1lKENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHNwZWMuZ2V0TmFtZSgpOwotICAgICAgICBMaXN0IHByZWZpeGVzID0gZ2V0UHJlZml4ZXMoZGVmaW5pdGlvbiwgc3BlYy5nZXRRdWFsaWZpZXIoKSk7Ci0gICAgICAgIGlmIChwcmVmaXhlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBuYW1lID0gcHJlZml4ZXMuZ2V0KDApICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9ICAgICAgICAgCi0gICAgICAgICAgCi0gICAgcHJpdmF0ZSBMaXN0IGdldFByZWZpeGVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHRoZU5hbWVzcGFjZSA9IChTdHJpbmcpIG1hcC5nZXQocHJlZml4KTsKLSAgICAgICAgICAgIGlmICh0aGVOYW1lc3BhY2UgIT0gbnVsbCAmJiB0aGVOYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRJbXBvcnRJZk5lY2Vzc2FyeShDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayBpdHNlbGYKLSAgICAgICAgUGF0aCBjdXJyZW50RmlsZUxvY2F0aW9uID0gbmV3IFBhdGgoY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChzcGVjLmdldEZpbGUoKSA9PSBudWxsIHx8IGN1cnJlbnRGaWxlTG9jYXRpb24uZXF1YWxzKHNwZWMuZ2V0RmlsZSgpLmdldExvY2F0aW9uKCkpKSB7Ci0gICAgICAgIAkvLyBpZiB0aGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbidzIGdldEZpbGUoKSByZXR1cm5zIG51bGwsIGZvcmdldCBhYm91dCBhZGRpbmcgbmVjZXNzYXJ5IGltcG9ydHMKLSAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayByZWd1bGFyIEltcG9ydHMKLSAgICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpbXBvcnRzSXQgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKGltcG9ydHNJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0TG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIEltcG9ydEltcGwgaW1wb3J0SXRlbSA9IChJbXBvcnRJbXBsKSBpbXBvcnRzSXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGltcG9ydEl0ZW0uaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICBpbXBvcnRMb2NhdGlvbiA9IGdldE5vcm1hbGl6ZWRMb2NhdGlvbihzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydExvY2F0aW9uID0gZ2V0Tm9ybWFsaXplZExvY2F0aW9uKGltcG9ydERlZmluaXRpb24uZ2V0TG9jYXRpb24oKSk7IAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoc3BlYy5nZXRGaWxlKCkuZ2V0TG9jYXRpb24oKS5lcXVhbHMobmV3IFBhdGgoaW1wb3J0TG9jYXRpb24pKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayBpbmxpbmUgU2NoZW1hcwotICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKLSAgICAgICAgICAgIExpc3QgaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgIT0gbnVsbCkgewotCSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGVlRWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCSAgICAgICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWVFbGVtZW50LmdldFNjaGVtYSgpOwotCSAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwgfHwgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscygiIikpIHsgICAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBjb250ZW50cyA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZChjb250ZW50KTsgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBJdGVyYXRvciBpbXBvcnRJdCA9IGltcG9ydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpbXBvcnRJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBYU0RJbXBvcnQgaW1wb3J0SXRlbSA9IChYU0RJbXBvcnQpIGltcG9ydEl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBpbXBvcnRJdGVtLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkU3RyaW5nID0gcmVzb2x2ZWRTY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0TG9jYXRpb24gPSBnZXROb3JtYWxpemVkTG9jYXRpb24ocmVzb2x2ZWRTdHJpbmcpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzcGVjLmdldEZpbGUoKS5nZXRMb2NhdGlvbigpLmVxdWFscyhuZXcgUGF0aChpbXBvcnRMb2NhdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghZm91bmRNYXRjaCkgewotICAgICAgICAgICAgYm9vbGVhbiB3c2lTdHlsZUltcG9ydCA9IGlzWFNEU2NoZW1hRmlsZShzcGVjKTsKLSAgICAgICAgICAgIGlmICh3c2lTdHlsZUltcG9ydCkgewotICAgICAgICAgICAgICAgIEFkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbiBhY3Rpb24gPSBuZXcgQWRkRWxlbWVudERlY2xhcmF0aW9uQWN0aW9uKGRlZmluaXRpb24sIHNwZWMuZ2V0UXVhbGlmaWVyKCksICJ4c2QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc3BlYy5nZXRGaWxlKCkuZ2V0TG9jYXRpb24oKSwgY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIEFkZFdTSVNjaGVtYUltcG9ydEFjdGlvbiBhZGRJbXBvcnQgPSBuZXcgQWRkV1NJU2NoZW1hSW1wb3J0QWN0aW9uKGRlZmluaXRpb24sIHNwZWMuZ2V0UXVhbGlmaWVyKCksIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBhZGRJbXBvcnQucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3U2VsZWN0ZWRGaWxlTG9jID0gc3BlYy5nZXRGaWxlKCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRGaWxlTG9jID0gZ2V0Tm9ybWFsaXplZExvY2F0aW9uKGRlZmluaXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlTG9jID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlUmVsYXRpdmVVUkkobmV3U2VsZWN0ZWRGaWxlTG9jLCBjdXJyZW50RmlsZUxvYywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzcGVjLmdldFF1YWxpZmllcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFkZEltcG9ydEFjdGlvbiBhZGRJbXBvcnRBY3Rpb24gPSBuZXcgQWRkSW1wb3J0QWN0aW9uKG51bGwsIGRlZmluaXRpb24sIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsIG5hbWVzcGFjZSwgcmVsYXRpdmVMb2MpOwotICAgICAgICAgICAgICAgIGFkZEltcG9ydEFjdGlvbi5ydW4oKTsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlUHJlZml4ID0gZ2V0VW5pcXVlUHJlZml4KGRlZmluaXRpb24sIHByZWZpeCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgdW5pcXVlUHJlZml4LCBuYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBUcnkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgaW4gQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZWZlcnMgdG8KLSAgICAgKiBhbiBYU0Qgb3IgV1NETCBmaWxlLiAgSWYgaXQncyBhbiBYU0QsIHJldHVybiB0cnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1hTRFNjaGVtYUZpbGUoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTG9jYXRpb24gPSBzcGVjLmdldEZpbGUoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgaW50IHBlcmlvZEluZGV4ID0gZmlsZUxvY2F0aW9uLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGlmIChwZXJpb2RJbmRleCA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBmaWxlTG9jYXRpb24uc3Vic3RyaW5nKHBlcmlvZEluZGV4ICsgMSk7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlUHJlZml4KERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGluaXRQcmVmaXgpIHsKLSAgICAgIFN0cmluZyB1bmlxdWVQcmVmaXg7Ci0gICAgICBNYXAgbWFwID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0KLSAgICAgIGlmIChkZWZpbml0aW9uLmdldE5hbWVzcGFjZShpbml0UHJlZml4KSA9PSBudWxsKSB7Ci0gICAgICAgIHVuaXF1ZVByZWZpeCA9IGluaXRQcmVmaXg7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsvLyBpZiB1c2VkLCB0aGVuIHRyeSB0byBjcmVhdGUgYSB1bmlxdWUgb25lCi0gICAgICAgIFN0cmluZyB0ZW1wUHJlZml4ID0gaW5pdFByZWZpeDsKLSAgICAgICAgaW50IGkgPSAxOwotICAgICAgICB3aGlsZShtYXAuY29udGFpbnNLZXkodGVtcFByZWZpeCArIGkpKSB7Ci0gICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIHVuaXF1ZVByZWZpeCA9IHRlbXBQcmVmaXggKyBpOwotICAgICAgfQotICAgICAgcmV0dXJuIHVuaXF1ZVByZWZpeDsKLSAgICB9IAotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vcm1hbGl6ZWRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIFVSTCByZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLSAgICAgICAgICAgIGxvY2F0aW9uID0gcmVzb2x2ZWRVUkwuZ2V0UGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOyAKLSAgICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YU0RDb21wb25lbnRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YU0RDb21wb25lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmOTRkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvWFNEQ29tcG9uZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRYU0RTY2hlbWFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBJbnB1dCBjcmVhdGVJbnB1dChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgc3R5bGUpIC0tLSBjcmVhdGUgZGVmYXVsdCBtZXNzYWdlL3BhcnQvZXRjLgotICogT2JqZWN0IGNyZWF0ZUlucHV0UGFyYW1ldGVyKE9wZXJhdGlvbiBvcGVyYXRpb24sIElucHV0IGlucHV0LCBTdHlsZSBzdHlsZSkgLS0KLSAqIAotICogQ29tbWFuZCBnZXRDcmVhdGVJbnB1dFBhcmFtZXRlckNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgSW5wdXQgaW5wdXQsIFN0eWxlIHN0eWxlKQotICogCi0gKiBNZXNzYWdlL3BhcnQvRWxlbWVudAotICogTWVzc2FnZS9wYXJ0L0VsZW1lbnQvc2VxdWVuY2UvRWxlbWVudAotICogKHgpIE1lc3NhZ2UvcGFydAotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29tcG9uZW50SGVscGVyIHsKLQkvKgotCSAqIENyZWF0ZSBhbiBYU0RFbGVtZW50IHdpdGggdHlwZSBhbm9ueW1vdXMuICBTZXQgdGhlIGdpdmVuIHBhcnQgdG8gcmVmZXJlbmNlIHRoZSBuZXdseSBjcmVhdGVkCi0JICogWFNERWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVBbm9ueW1vdXNYU0RFbGVtZW50RGVmaW5pdGlvbihTdHJpbmcgYmFzZU5hbWUsIFBhcnQgcGFydCkgewotCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gYW5vbkVsZW1lbnQgPSBjcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBiYXNlTmFtZSwgcGFydCk7Ci0JCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBuZXdBbm9uID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCVhTRFBhcnRpY2xlIG5ld1hTRFBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLQkJWFNETW9kZWxHcm91cCBuZXdYU0RNb2RlbEdyb3VwID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETW9kZWxHcm91cCgpOwotCQluZXdYU0RNb2RlbEdyb3VwLnNldENvbXBvc2l0b3IoWFNEQ29tcG9zaXRvci5TRVFVRU5DRV9MSVRFUkFMKTsKLQkJCi0JCWFub25FbGVtZW50LnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKG5ld0Fub24pOwotCQluZXdYU0RQYXJ0aWNsZS5zZXRDb250ZW50KG5ld1hTRE1vZGVsR3JvdXApOwotCQluZXdBbm9uLnNldENvbnRlbnQobmV3WFNEUGFydGljbGUpOwotCQkKLQkJcmV0dXJuIGFub25FbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VOYW1lLCBPYmplY3QgY29udGV4dCkgewotCQlYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IG51bGw7Ci0JCQotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIFBhcnQpIHsKLQkJCUFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKGRlZmluaXRpb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBGaW5kIGEgdW5pcXVlIG5hbWUKLQkJCVhTRFNjaGVtYSB4c2RTY2hlbWEgPSBjb21tYW5kLmdldFNjaGVtYSgpOwotCQkJU3RyaW5nIG5hbWUgPSBOYW1lVXRpbC5nZXRYU0RFbGVtZW50TmFtZShiYXNlTmFtZSwgeHNkU2NoZW1hKTsKLQkJCWNvbW1hbmQucnVuKG5hbWUpOwotCQkJLy8gVGhlICd3b3JrYXJvdW5kJyBiZWxvdyBpcyBjYXVzaW5nIG1lIHRvIGhhbmcuLi4uLiAgVGhlIGxhdGVzdCBXVFAgaXMgbmVlZGVkLgotLy8JCQl4c2RFbGVtZW50ID0geHNkU2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24obmFtZSk7Ci0JCQl4c2RFbGVtZW50ID0gY29tbWFuZC5nZXRYU0RFbGVtZW50KCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApIHsKLQkJCVhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBjb250ZXh0OwotCQkJWFNEUGFydGljbGUgbmV3UGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotCQkJU3RyaW5nIG5hbWUgPSBOYW1lVXRpbC5nZXRYU0RFbGVtZW50TmFtZShiYXNlTmFtZSwgbW9kZWxHcm91cCk7Ci0JCQkKLQkJCUFkZFhTREVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoIkFkZCBYTUwgU2NoZW1hIEVsZW1lbnQiLCBtb2RlbEdyb3VwKTsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJeHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLQkJCXhzZEVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJCXhzZEVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24oZ2V0WFNEU3RyaW5nVHlwZShtb2RlbEdyb3VwKSk7Ci0JCQkKLQkJCW5ld1BhcnRpY2xlLnNldENvbnRlbnQoeHNkRWxlbWVudCk7Ci0JCQltb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKG5ld1BhcnRpY2xlKTsKLQkJfQotCQllbHNlIHsKLQkJCUFkZFhTREVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoKTsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJeHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLQkJCXhzZEVsZW1lbnQuc2V0TmFtZShiYXNlTmFtZSk7Ci0JCX0KLQkJCi0JCXJldHVybiB4c2RFbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkWFNERWxlbWVudFRvTW9kZWxHcm91cChYU0RFbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBYU0RFbGVtZW50RGVjbGFyYXRpb24gY2hpbGQpIHsKLQkJaWYgKHBhcmVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0JCQlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gYW5vblR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLQkJCWlmIChhbm9uVHlwZS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgewotCQkJCVhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBhbm9uVHlwZS5nZXRDb250ZW50KCk7Ci0JCQkJaWYgKHBhcnRpY2xlLmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApIHsKLQkJCQkJLy8gQ3JlYXRlIFhTRFBhcnRpY2xlCi0JCQkJCVhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0JCQkJCWFkZFhTREVsZW1lbnRUb01vZGVsR3JvdXAobW9kZWxHcm91cCwgY2hpbGQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQ3JlYXRlIFhTRE1vZGVsR3JvdXAgLS0gWFNEUGFydGljbGUKLQkJCQkJYWRkWFNERWxlbWVudFRvTW9kZWxHcm91cChwYXJ0aWNsZSwgY2hpbGQpOwotCQkJCX0JCQkJICAKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIENyZWF0ZSBYU0RQYXJ0aWNsZSAtLT4gWFNETW9kZWxHcm91cCAtLT4gWFNEUGFydGljbGUKLQkJCQlYU0RQYXJ0aWNsZSBuZXdQYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0JCQkJYW5vblR5cGUuc2V0Q29udGVudChuZXdQYXJ0aWNsZSk7Ci0JCQkJYWRkWFNERWxlbWVudFRvTW9kZWxHcm91cChuZXdQYXJ0aWNsZSwgY2hpbGQpOwotCQkJfQkJCSAgCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBDcmVhdGUgQW5vbnltb3VzIFR5cGUgLS0+IFhTRFBhcnRpY2xlIC0tPiBYU0RNb2RlbEdyb3VwIC0tPiBYU0RQYXJ0aWNsZQotCQkJWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIG5ld0Fub25UeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlwYXJlbnQuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24obmV3QW5vblR5cGUpOwotCQkJCi0JCQlYU0RQYXJ0aWNsZSBuZXdQYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0JCQluZXdBbm9uVHlwZS5zZXRDb250ZW50KG5ld1BhcnRpY2xlKTsKLQkJCWFkZFhTREVsZW1lbnRUb01vZGVsR3JvdXAobmV3UGFydGljbGUsIGNoaWxkKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkWFNERWxlbWVudFRvTW9kZWxHcm91cChYU0RQYXJ0aWNsZSBwYXJ0aWNsZSwgWFNERWxlbWVudERlY2xhcmF0aW9uIGNoaWxkKSB7Ci0JCVhTRE1vZGVsR3JvdXAgbmV3WFNETW9kZWxHcm91cCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1vZGVsR3JvdXAoKTsKLQkJbmV3WFNETW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7CQkJCQkgIAotCQlwYXJ0aWNsZS5zZXRDb250ZW50KG5ld1hTRE1vZGVsR3JvdXApOwotCQlhZGRYU0RFbGVtZW50VG9Nb2RlbEdyb3VwKG5ld1hTRE1vZGVsR3JvdXAsIGNoaWxkKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFhTREVsZW1lbnRUb01vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwLCBYU0RFbGVtZW50RGVjbGFyYXRpb24gY2hpbGQpIHsKLQkJLy8gQ3JlYXRlIFhTRFBhcnRpY2xlCi0JCVhTRFBhcnRpY2xlIG5ld1BhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLQkJbmV3UGFydGljbGUuc2V0Q29udGVudChjaGlsZCk7Ci0JCW1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQobmV3UGFydGljbGUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBpdCdzIFhTRE1vZGVsR3JvdXAuICBJZiBvbmUgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBvbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTRE1vZGVsR3JvdXAgZ2V0WFNETW9kZWxHcm91cChYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCwgRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCVhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IG51bGw7Ci0JCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBhbm9uVHlwZSA9IG51bGw7Ci0JCQotCQlpZiAoeHNkRWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0JCQlhbm9uVHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHhzZEVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLQkJfQkJICAKLQkJZWxzZSB7Ci0JCQkvLyBDcmVhdGUgQW5vbnltb3VzIFR5cGUKLQkJCWFub25UeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlhbm9uVHlwZS5zZXROYW1lKCJOZXdDb21wbGV4VHlwZU5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0WFNEU2NoZW1hKGRlZmluaXRpb24pLmdldENvbnRlbnRzKCkuYWRkKGFub25UeXBlKTsKLQkJCXhzZEVsZW1lbnQuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oYW5vblR5cGUpOwotCQl9Ci0JCQotCQlpZiAoYW5vblR5cGUgIT0gbnVsbCkgewotCQkJbW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoYW5vblR5cGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbW9kZWxHcm91cDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gaXQncyBYU0RNb2RlbEdyb3VwLiAgSWYgb25lIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgb25lCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0RNb2RlbEdyb3VwIGdldFhTRE1vZGVsR3JvdXAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlKSB7Ci0JCVhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IG51bGw7Ci0JCVhTRFBhcnRpY2xlIHBhcnRpY2xlID0gbnVsbDsKLQkJLy8gQ2hlY2sgZm9yIFhTRFBhcnRpY2xlCi0JCWlmICh4c2RDb21wbGV4VHlwZS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgewotCQkJcGFydGljbGUgPSAoWFNEUGFydGljbGUpIHhzZENvbXBsZXhUeXBlLmdldENvbnRlbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLQkJCW1vZGVsR3JvdXAgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0JCQltb2RlbEdyb3VwLnNldENvbXBvc2l0b3IoWFNEQ29tcG9zaXRvci5TRVFVRU5DRV9MSVRFUkFMKTsJCQkgIAotCQkJcGFydGljbGUuc2V0Q29udGVudChtb2RlbEdyb3VwKTsKLQkJCXhzZENvbXBsZXhUeXBlLnNldENvbnRlbnQocGFydGljbGUpOwotCQl9Ci0JCQotCQkvLyBDaGVjayBmb3IgWFNETW9kZWxHcm91cAotCQlpZiAocGFydGljbGUuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkgewotCQkJbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltb2RlbEdyb3VwID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETW9kZWxHcm91cCgpOwotCQkJbW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7CQkJICAKLQkJCXBhcnRpY2xlLnNldENvbnRlbnQobW9kZWxHcm91cCk7Ci0JCX0KLQkJCi0JCXJldHVybiBtb2RlbEdyb3VwOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5paW9uKFN0cmluZyBjb21wbGV4VHlwZU5hbWUsIFBhcnQgcGFydCkgewotCQlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gbmV3Q29tcGxleFR5cGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJWFNEUGFydGljbGUgbmV3WFNEUGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotCQlYU0RNb2RlbEdyb3VwIG5ld1hTRE1vZGVsR3JvdXAgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0JCW5ld1hTRE1vZGVsR3JvdXAuc2V0Q29tcG9zaXRvcihYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotCQkKLQkJbmV3Q29tcGxleFR5cGUuc2V0TmFtZShjb21wbGV4VHlwZU5hbWUpOwotCQluZXdDb21wbGV4VHlwZS5zZXRDb250ZW50KG5ld1hTRFBhcnRpY2xlKTsKLQkJbmV3WFNEUGFydGljbGUuc2V0Q29udGVudChuZXdYU0RNb2RlbEdyb3VwKTsKLQkJZ2V0WFNEU2NoZW1hKHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKS5nZXRDb250ZW50cygpLmFkZChuZXdDb21wbGV4VHlwZSk7Ci0JCQotCQlyZXR1cm4gbmV3Q29tcGxleFR5cGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYU0RFbGVtZW50VG9Nb2RlbEdyb3VwKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBwYXJlbnQsIFhTREVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAocGFyZW50LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSB7Ci0JCQlYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgcGFyZW50LmdldENvbnRlbnQoKTsKLQkJCWlmIChwYXJ0aWNsZS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKSB7Ci0JCQkJLy8gQ3JlYXRlIFhTRFBhcnRpY2xlCi0JCQkJWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApIHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLQkJCQlhZGRYU0RFbGVtZW50VG9Nb2RlbEdyb3VwKG1vZGVsR3JvdXAsIGNoaWxkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIENyZWF0ZSBYU0RNb2RlbEdyb3VwIC0tIFhTRFBhcnRpY2xlCi0JCQkJYWRkWFNERWxlbWVudFRvTW9kZWxHcm91cChwYXJ0aWNsZSwgY2hpbGQpOwotCQkJfQkJCQkgIAotCQl9Ci0JCWVsc2UgewotCQkJLy8gQ3JlYXRlIFhTRFBhcnRpY2xlIC0tPiBYU0RNb2RlbEdyb3VwIC0tPiBYU0RQYXJ0aWNsZQotCQkJWFNEUGFydGljbGUgbmV3UGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotCQkJcGFyZW50LnNldENvbnRlbnQobmV3UGFydGljbGUpOwotCQkJYWRkWFNERWxlbWVudFRvTW9kZWxHcm91cChuZXdQYXJ0aWNsZSwgY2hpbGQpOwotCQl9Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBpbmxpbmUgWFNEU2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFdTREwuCi0JICogTG9vayBmb3IgdGhlIGlubGluZSBYU0RTY2hlbWEgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIFdTREwuCi0JICogSWYgdGhpcyBpbmxpbmUgWFNEU2NoZW1hIGRvZXMgbm90IGV4aXN0cywgY3JlYXRlIGl0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNEU2NoZW1hIGdldFhTRFNjaGVtYShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJWFNEU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0JCVN0cmluZyB3c2RsVGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCi0JCVR5cGVzIHR5cGVzID0gKFR5cGVzKSBkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQkKLQkJCUl0ZXJhdG9yIGVlSXQgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGVlSXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGVlRWxlbWVudCA9IGVlSXQubmV4dCgpOwotCQkJCWlmIChlZUVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgewotCQkJCQlYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlZSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgZWVFbGVtZW50OwotCQkJCQlpZiAoZWUuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJgotCQkJCQkJZWUuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKHdzZGxUYXJnZXROYW1lc3BhY2UpKSB7Ci0JCQkJCQlzY2hlbWEgPSBlZS5nZXRTY2hlbWEoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCS8vIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBzY2hlbWEKLQkJCUFkZFhTRFNjaGVtYUNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTY2hlbWFDb21tYW5kKGRlZmluaXRpb24pOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGVlRWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotCQkJc2NoZW1hID0gZWVFbGVtZW50LmdldFNjaGVtYSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc2NoZW1hOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBnZXRYU0RTdHJpbmdUeXBlKFhTRENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJWFNEU2NoZW1hIHNjaGVtYSA9IGNvbXBvbmVudC5nZXRTY2hlbWEoKTsKLQkJcmV0dXJuIHNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjkxM2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YU0RUeXBlU3lzdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb25zLklUeXBlU3lzdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW1wb3J0SW1wbDsKLQotcHVibGljIGNsYXNzIFhTRFR5cGVTeXN0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUeXBlU3lzdGVtUHJvdmlkZXIKLXsKLSAgICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHRoZU5hbWVzcGFjZSA9IChTdHJpbmcpIG1hcC5nZXQocHJlZml4KTsKLSAgICAgICAgICAgIGlmICh0aGVOYW1lc3BhY2UgIT0gbnVsbCAmJiB0aGVOYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlZE5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0UHJlZml4ZXMoZGVmaW5pdGlvbiwgbmFtZXNwYWNlKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBsaXN0LmFkZChuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGROYW1lZENvbXBvbmVudHMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBMaXN0IGxpc3QsIExpc3QgbmFtZWRDb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZWRDb21wb25lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFByZWZpeGVkTmFtZXMoZGVmaW5pdGlvbiwgY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpLCBjb21wb25lbnQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0V1NJU3R5bGVJbXBvcnRzKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gICAgewotICAgICAgICBpZiAoeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWFNESW1wb3J0SW1wbCB4c2RJbXBvcnQgPSAoWFNESW1wb3J0SW1wbCkgY29udGVudDsKLQkJCQkJWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpeHNkSW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7CQkJCQkKLQkJCQkJaWYgKHNjaGVtYSA9PSBudWxsKQotCQkJCQl7Ci0JCQkJCQlzY2hlbWEgPSB4c2RJbXBvcnQuaW1wb3J0U2NoZW1hKCk7Ci0JCQkJCX0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZU5hbWVDYXRlZ29yeSA9PSBJVHlwZVN5c3RlbVByb3ZpZGVyLkJVSUxUX0lOX1RZUEUpIHsKLSAgICAgICAgCWxpc3QgPSBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdChkZWZpbml0aW9uKTsgICAgICAgIAkKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgCVR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICAgICAgCWlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCWZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIAkJewotICAgICAgICAJCQlPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAJCQlpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAJCQl7Ci0gICAgICAgIAkJCQlYU0RTY2hlbWEgc2NoZW1hID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIAkJCQlpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgIAkJCQl7Ci0gICAgICAgIAkJCQkJaW5pdFdTSVN0eWxlSW1wb3J0cyhzY2hlbWEpOwotICAgICAgICAJCQkJCWFkZE5hbWVkQ29tcG9uZW50cyhkZWZpbml0aW9uLCBsaXN0LCBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkpOwotICAgICAgICAJCQkJfQotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICAKLSAgICAgICAgCWZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIAl7Ci0gICAgICAgIAkJSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIGkubmV4dCgpOwotICAgICAgICAJCVhTRFNjaGVtYSBzY2hlbWEgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgICAJCWlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgCQl7Ci0gICAgICAgIAkJCWFkZE5hbWVkQ29tcG9uZW50cyhkZWZpbml0aW9uLCBsaXN0LCBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCWxpc3QuYWRkQWxsKGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KGRlZmluaXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICAKLQkJcmV0dXJuIGxpc3Q7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVHlwZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBYU0RTY2hlbWEgc2NoZW1hLCBpbnQgdHlwZU5hbWVDYXRlZ29yeSkKLSAgICB7Ci0gICAgICAgIExpc3Qga2VlcFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciB0eXBlSXRlcmF0b3IgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgLy8gRmlsdGVyIG91dCB1bndhbnRlZCBUeXBlcwotICAgICAgICBpZiAodHlwZU5hbWVDYXRlZ29yeSA9PSBJVHlwZVN5c3RlbVByb3ZpZGVyLlVTRVJfREVGSU5FRF9DT01QTEVYX1RZUEUpIHsKLSAgICAgICAgCXdoaWxlICh0eXBlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJT2JqZWN0IHR5cGUgPSB0eXBlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJCWlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgIAkJCWtlZXBUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lQ2F0ZWdvcnkgPT0gSVR5cGVTeXN0ZW1Qcm92aWRlci5VU0VSX0RFRklORURfU0lNUExFX1RZUEUpIHsKLSAgICAgICAgCXdoaWxlICh0eXBlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJT2JqZWN0IHR5cGUgPSB0eXBlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJCWlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgCQkJa2VlcFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vYWRkTmFtZWRDb21wb25lbnRzKGRlZmluaXRpb24sIGxpc3QsIGtlZXBUeXBlcyk7ICAgICAgICAKLSAgICAgICAgLy9yZXR1cm4gbGlzdDsKLSAgICAgICAgcmV0dXJuIGtlZXBUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHsKLSAgICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgTGlzdCBwcmVmaXhlcyA9IGdldFByZWZpeGVzKGRlZmluaXRpb24sIFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpOwotLy8gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcmVmaXhlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLS8vICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaisrKQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBYU0RET01IZWxwZXIuZGF0YVR5cGVbal1bMF07Ci0vLyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUgOiBsb2NhbE5hbWU7Ci0vLyAgICAgICAgICAgICAgICAgICAgaXRlbXMuYWRkKG5hbWUpOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbXM7Ci0gICAgfQotICAgIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUVsZW1lbnROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9ICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIG8pLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLQkJCQkJCWluaXRXU0lTdHlsZUltcG9ydHMoc2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVkQ29tcG9uZW50cyhkZWZpbml0aW9uLCBsaXN0LCBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIGkubmV4dCgpOwotICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHRoZUltcG9ydC5nZXRFU2NoZW1hKCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkTmFtZWRDb21wb25lbnRzKGRlZmluaXRpb24sIGxpc3QsIHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICBwdWJsaWMgaW50IGdldENhdGVnb3J5Rm9yVHlwZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL0Jhc2VSZW5hbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmFzZVJlbmFtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5ZWI1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmFzZVJlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZW5hbWVyIGV4dGVuZHMgV1NETFZpc2l0b3IKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuZXdOYW1lOwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgZ2xvYmFsQ29tcG9uZW50OwotICAKLSAgcHVibGljIEJhc2VSZW5hbWVyKFdTRExFbGVtZW50IGdsb2JhbENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihnbG9iYWxDb21wb25lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICB0aGlzLmdsb2JhbENvbXBvbmVudCA9IGdsb2JhbENvbXBvbmVudDsKLSAgICB0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE5ld1FOYW1lKCkKLSAgewotICAgIFN0cmluZyBxTmFtZSA9IG51bGw7Ci0gICAgaWYgKG5ld05hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnbG9iYWxDb21wb25lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgcU5hbWUgPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgIHFOYW1lICs9ICI6IiArIG5ld05hbWU7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHFOYW1lID0gbmV3TmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmluZGluZ1JlbmFtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CaW5kaW5nUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE0ODVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CaW5kaW5nUmVuYW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1JlbmFtZXIgZXh0ZW5kcyBCYXNlUmVuYW1lcgotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEJpbmRpbmdSZW5hbWVyLgotICAgKiBAcGFyYW0gZ2xvYmFsQ29tcG9uZW50Ci0gICAqIEBwYXJhbSBuZXdOYW1lCi0gICAqLwotICBwdWJsaWMgQmluZGluZ1JlbmFtZXIoV1NETEVsZW1lbnQgZ2xvYmFsQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHN1cGVyKGdsb2JhbENvbXBvbmVudCwgbmV3TmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBzdXBlci52aXNpdFBvcnQocG9ydCk7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgIGlmIChnbG9iYWxDb21wb25lbnQuZXF1YWxzKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwb3J0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJiaW5kaW5nIiwgZ2V0TmV3UU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvTWVzc2FnZVJlbmFtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9NZXNzYWdlUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODViOTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9NZXNzYWdlUmVuYW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUmVuYW1lciBleHRlbmRzIEJhc2VSZW5hbWVyCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgTWVzc2FnZVJlbmFtZXIuCi0gICAqIEBwYXJhbSBnbG9iYWxDb21wb25lbnQKLSAgICogQHBhcmFtIG5ld05hbWUKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlUmVuYW1lcihXU0RMRWxlbWVudCBnbG9iYWxDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgc3VwZXIoZ2xvYmFsQ29tcG9uZW50LCBuZXdOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBzdXBlci52aXNpdElucHV0KGlucHV0KTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpbnB1dC5nZXRFTWVzc2FnZSgpOwotICAgIGlmIChnbG9iYWxDb21wb25lbnQuZXF1YWxzKG1lc3NhZ2UpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChpbnB1dCk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsIGdldE5ld1FOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHN1cGVyLnZpc2l0T3V0cHV0KG91dHB1dCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMob3V0cHV0KSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qob3V0cHV0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgZ2V0TmV3UU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KQotICB7Ci0gICAgc3VwZXIudmlzaXRGYXVsdChmYXVsdCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMoZmF1bHQpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChmYXVsdCk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsIGdldE5ld1FOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvUG9ydFR5cGVSZW5hbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvUG9ydFR5cGVSZW5hbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTljODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL1BvcnRUeXBlUmVuYW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFBvcnRUeXBlUmVuYW1lciBleHRlbmRzIEJhc2VSZW5hbWVyCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgUG9ydFR5cGVSZW5hbWVyLgotICAgKiBAcGFyYW0gZ2xvYmFsQ29tcG9uZW50Ci0gICAqIEBwYXJhbSBuZXdOYW1lCi0gICAqLwotICBwdWJsaWMgUG9ydFR5cGVSZW5hbWVyKFdTRExFbGVtZW50IGdsb2JhbENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihnbG9iYWxDb21wb25lbnQsIG5ld05hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIHN1cGVyLnZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0KLSAgICBpZiAoZ2xvYmFsQ29tcG9uZW50LmVxdWFscyhwb3J0VHlwZSkpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGJpbmRpbmcpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBnZXROZXdRTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL1dTRExWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvV1NETFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2ODI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvV1NETFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLQotcHVibGljIGNsYXNzIFdTRExWaXNpdG9yCi17Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLQotICBwdWJsaWMgV1NETFZpc2l0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0RGVmaW5pdGlvbigpCi0gIHsKLSAgICB2aXNpdEJpbmRpbmdzKCk7Ci0gICAgdmlzaXRNZXNzYWdlcygpOwotICAgIHZpc2l0UG9ydFR5cGVzKCk7Ci0gICAgdmlzaXRTZXJ2aWNlcygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRCaW5kaW5ncygpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEJpbmRpbmcoYmluZGluZyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRNZXNzYWdlcygpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE1lc3NhZ2UobWVzc2FnZSk7IAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQb3J0VHlwZXMoKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0UG9ydFR5cGUocG9ydFR5cGUpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTZXJ2aWNlcygpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYmluZGluZy5nZXRFUG9ydFR5cGUoKTsKLSAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmluZGluZy5nZXRFQmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7IAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE9wZXJhdGlvbihvcGVyYXRpb24pOyAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0vLyAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCk7Ci0vLyAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCk7ICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRJbnB1dChpbnB1dCk7Ci0gICAgfQotICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdE91dHB1dChvdXRwdXQpOwotICAgIH0KLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoZmF1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRGYXVsdChmYXVsdCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KQotICB7Ci0vLyAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gcGFydC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXNzYWdlLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0UGFydChwYXJ0KTsKLSAgICB9Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpbnB1dC5nZXRFTWVzc2FnZSgpOwotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0T3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0TWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KQotICB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0TWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdFBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdFBvcnQocG9ydCk7Ci0gICAgfQotICAgIAotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9XU0RMVmlzaXRvckZvclBhcmFtZXRlcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9XU0RMVmlzaXRvckZvclBhcmFtZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0NDEwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvV1NETFZpc2l0b3JGb3JQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLnZpc2l0b3IuVzExWFNEVmlzaXRvckZvckZpZWxkczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgV1NETFZpc2l0b3JGb3JQYXJhbWV0ZXJzCi17Ci0gICAgcHVibGljIExpc3QgY29uY3JldGVDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHB1YmxpYyBMaXN0IHRoaW5nc1RvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1lc3NhZ2VSZWZlcmVuY2UoTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIGlmIChtZXNzYWdlUmVmZXJlbmNlLmdldEVNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNZXNzYWdlKG1lc3NhZ2VSZWZlcmVuY2UuZ2V0RU1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0TWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gICAgewotICAgICAgLy8gZm9yIG5vdyB3ZSBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgcGFydCBpcyB0aGUgb25seSBvbmUgdGhhdAotICAgICAgLy8gc2hvdWxkIGJlIHVzZWQgdG8gZGVkdWNlIHRoZSBwYXJhbWV0ZXJzCi0gICAgICAvLyBUT0RPIChjcykgd2UgbmVlZCB0byByZXZpc3QgdGhpcywgbXVsdGlwbGUgcGFydHMgbmVlZCB0byBiZSBjb25zaWRlcmVkCi0gICAgICAvLwotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGluZ3NUb0xpc3RlblRvLmFkZChtZXNzYWdlKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIHZpc2l0UGFydCgoUGFydClpLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHZpc2l0UGFydChQYXJ0IHBhcnQpCi0gICAgewotICAgICAgdGhpbmdzVG9MaXN0ZW5Uby5hZGQocGFydCk7ICAgICAgCi0gICAgICBpZiAocGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2aXNpdFhTREVsZW1lbnREZWNsYXJhdGlvbihwYXJ0LmdldEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIC8vIGlmIChwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnRzLmFkZChwYXJ0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHZpc2l0WFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGVkLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBpZiAodGQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25jcmV0ZUNvbXBvbmVudHMuYWRkKGVkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIC8vIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiBhbm9ueW1vdXMgbG9jYWxseSBkZWZpbmVkIHR5cGUKLSAgICAgICAgICAvLyBzZSB3ZSBuZWVkIHRvIHZpc2l0IGl0J3MgY2hpbGRyZW4KLSAgICAgICAgICB0aGluZ3NUb0xpc3RlblRvLmFkZChlZCk7Ci0gICAgICAgICAgdmlzaXRYU0RDb21wbGV4dFR5cGVEZWZpbml0aW9uKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHRkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgdmlzaXRYU0RDb21wbGV4dFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCkKLSAgICB7Ci0gICAgICAvLyBUT0RPIChjcykgcmV2aXNpdCB0byBzZWUgaWYgaXQgbWFrZXMgc2Vuc2UgZm9yIHRoZSBXU0RMIGVkaXRvciB0byByZWRpc3BsYXkKLSAgICAgIC8vIHRoZSAnRmllbGRzJyAoaW4gWFNEIGVkaXRvciBsaW5nbykgYXMgcGFyYW10ZXJzCi0gICAgICAvLyBwZXJoYXBzIHRoZSBXU0RMIEVkaXRvciBzaG91bGQgc2ltcGx5IHJldXNlIHRoZSBYU0QgRWRpdG9yJ3MKLSAgICAgIC8vIENvbXBsZXhUeXBlIGVkaXQgcGFydCB3aGVuIGRpc3BsYXlpbmcgdGhlc2Ugc2VjdGlvbnM/Ci0gICAgICBXMTFYU0RWaXNpdG9yRm9yRmllbGRzIGZpZWxkVmlzaXRvciA9IG5ldyBXMTFYU0RWaXNpdG9yRm9yRmllbGRzKCk7Ci0gICAgICBmaWVsZFZpc2l0b3IudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odGQpOwotICAgICAgY29uY3JldGVDb21wb25lbnRzLmFkZEFsbChmaWVsZFZpc2l0b3IuZ2V0Q29uY3JldGVDb21wb25lbnRMaXN0KCkpOwotICAgICAgdGhpbmdzVG9MaXN0ZW5Uby5hZGRBbGwoZmllbGRWaXNpdG9yLmdldFRoaW5nc1dlTmVlZFRvTGlzdGVuVG8oKSk7Ci0gICAgfQotICB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL0JpbmRpbmdXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9CaW5kaW5nV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMWM0MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL0JpbmRpbmdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CaW5kaW5nR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3RvY29sQ29tcG9uZW50Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1dpemFyZCBleHRlbmRzIFdpemFyZAotewotICBwcm90ZWN0ZWQgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlIHNwZWNpZnlCaW5kaW5nUGFnZTsKLQotICBwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBpbnQga2luZDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX05FV19CSU5ESU5HID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcgPSAyOwotCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIAotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHdoZW4gYXJlIGNyZWF0aW5nIGEgYnJhbmQgbmV3IEJpbmRpbmcKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nV2l6YXJkKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMoZGVmaW5pdGlvbiwgbnVsbCwgS0lORF9ORVdfQklORElORyk7Ci0gIH0KLQotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHdoZW4gYXJlIGNyZWF0aW5nIGEgYnJhbmQgbmV3IEJpbmRpbmcKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nV2l6YXJkKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICB0aGlzKGRlZmluaXRpb24sIG51bGwsIEtJTkRfTkVXX0JJTkRJTkcpOwotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB3aGVuIHRoZXJlIGlzIGFuIGV4aXN0aW5nIEJpbmRpbmcgd2Ugd2lzaCB0byBtb2RpZnkvcmVnZW5lcmF0ZQotICAgKi8KLSAgcHVibGljIEJpbmRpbmdXaXphcmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBCaW5kaW5nIGJpbmRpbmcsIGludCBraW5kKQotICB7Ci0gICAgc3VwZXIoKTsKLQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMua2luZCA9IGtpbmQ7CQotCWJpbmRpbmdHZW5lcmF0b3IgPSBuZXcgQmluZGluZ0dlbmVyYXRvcihkZWZpbml0aW9uLCBiaW5kaW5nKTsKLQotICAgIHNldFdpbmRvd1RpdGxlKE1lc3NhZ2VzLl9VSV9CSU5ESU5HX1dJWkFSRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAvL3NldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShXU0RMRWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvTmV3WE1MLmdpZiIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdOYW1lKFN0cmluZyBiaW5kaW5nTmFtZSkKLSAgewotLy8gICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgYmluZGluZ05hbWUpOwotICAgIGJpbmRpbmdHZW5lcmF0b3Iuc2V0TmFtZShiaW5kaW5nTmFtZSk7Ci0vKgotIAkvLyBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKTsKLQlpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLQkgIExpc3QgZWVMaXN0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBpZiAoZWVMaXN0LnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlZUxpc3QuZ2V0KDApOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZWUpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uRm9yTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgYmluZGluZ0dlbmVyYXRvci5zZXRQcm90b2NvbChleHRlbnNpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBvcnRUeXBlTmFtZShTdHJpbmcgcG9ydFR5cGVOYW1lKQotICB7Ci0gICAgYmluZGluZ0dlbmVyYXRvci5zZXRSZWZOYW1lKHBvcnRUeXBlTmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0dlbmVyYXRvciBnZXRCaW5kaW5nR2VuZXJhdG9yKCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nR2VuZXJhdG9yOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHdpemFyZCBzZXR1cCBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldHVwKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgc3BlY2lmeUJpbmRpbmdQYWdlID0gbmV3IEJpbmRpbmdXaXphcmRPcHRpb25zUGFnZSgpOwotICAgIGFkZFBhZ2Uoc3BlY2lmeUJpbmRpbmdQYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gIAlib29sZWFuIHJlY29yZGluZ1N0YXJ0ZWQgPSBmYWxzZTsKLSAgCWlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSA9PSBudWxsIHx8IChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkgewotICAJCXJlY29yZGluZ1N0YXJ0ZWQgPSB0cnVlOwotICAJCWJlZ2luUmVjb3JkaW5nKCk7Ci0gIAkJCi0gIAkJLy8gQ3JlYXRlIHRoZSBEZWZpbml0aW9ucyBlbGVtZW50IHdpdGggcHJvcGVyIG5hbWVzcGFjZQotICAJICAgIFByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotICAJCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotICAJICAgIGlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAJICAgIHsKLSAgCSAgICAJY2hhclNldCA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLSAgCSAgICB9Ci0gIAkgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCAidmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gIAkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgid3NkbDpkZWZpbml0aW9ucyIpOyAgCQkgLy8kTk9OLU5MUy0xJAotICAJCWRvY3VtZW50LmFwcGVuZENoaWxkKHJvb3QpOwotCi0gIAkJLy8gQWRkIHZhcmlvdXMgbmFtZXNwYWNlIGF0dHJpYnV0ZXMgaGVyZS4gCi0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnNvYXAiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6dG5zIiwgZ2V0RGVmYXVsdE5hbWVzcGFjZShkZWZpbml0aW9uKSk7IC8vJE5PTi1OTFMtMSQKLSAgCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6d3NkbCIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6eHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAJCXJvb3Quc2V0QXR0cmlidXRlKCJuYW1lIiwgZ2V0RmlsZU5hbWUoZGVmaW5pdGlvbikpOyAvLyROT04tTkxTLTEkCi0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIGdldERlZmF1bHROYW1lc3BhY2UoZGVmaW5pdGlvbikpOyAvLyROT04tTkxTLTEkCi0KLSAgCQlkZWZpbml0aW9uLnNldEVsZW1lbnQocm9vdCk7CQotICAJfQotCi0JLy8gR2VuZXJhdGUvcmUtZ2VuZXJhdGUgdGhlIEJpbmRpbmcKLSAgICB0cnkKLSAgICB7Ci0JCUJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nKCk7Ci0JCQotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihiaW5kaW5nKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseSB7Ci0gICAgCWlmIChyZWNvcmRpbmdTdGFydGVkKQotICAgIAkJZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoTWVzc2FnZXMuX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKCFuYW1lc3BhY2UuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgCW5hbWVzcGFjZSA9IG5hbWVzcGFjZS5jb25jYXQoIi8iKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBuYW1lc3BhY2UgKz0gZ2V0RmlsZU5hbWUoZGVmaW5pdGlvbikgKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIFN0cmluZyBmaWxlTG9jYXRpb24gPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0gIAlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0gIAlyZXR1cm4gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKCkgewotICAgIE5vZGUgbm9kZSA9IGRvY3VtZW50OwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0JJTkRJTkcpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBlbmRSZWNvcmRpbmcoKSB7Ci0gICAgTm9kZSBub2RlID0gZG9jdW1lbnQ7IAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgIAotICAgIH0KLSAgfQotCi0gIGNsYXNzIEJpbmRpbmdXaXphcmRPcHRpb25zUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLSAgewotICAgIHByb3RlY3RlZCBQcm90b2NvbENvbXBvbmVudENvbnRyb2wgcHJvdG9jb2xDb21wb25lbnRDb250cm9sOwotCi0gICAgcHVibGljIEJpbmRpbmdXaXphcmRPcHRpb25zUGFnZSgpCi0gICAgewotICAgICAgc3VwZXIoIlNwZWNpZnlCaW5kaW5nUGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBzZXRUaXRsZShNZXNzYWdlcy5fVUlfVElUTEVfU1BFQ0lGWV9CSU5ESU5HX0RFVEFJTFMpOyAvLyROT04tTkxTLTEkCi0gICAgICBzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5fVUlfU1BFQ0lGWV9CSU5ESU5HX0RFVEFJTFNfTEFCRUwpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdHZW5lcmF0b3IgZ2V0QmluZGluZ0dlbmVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuICgoQmluZGluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLmdldEJpbmRpbmdHZW5lcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgUHJvdG9jb2xDb21wb25lbnRDb250cm9sIHByb3RvY29sQ29tcG9uZW50Q29udHJvbCA9IG5ldyBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sKHBhcmVudCwgYmluZGluZ0dlbmVyYXRvciwgdHJ1ZSk7Ci0gICAgICBwcm90b2NvbENvbXBvbmVudENvbnRyb2wuaW5pdEZpZWxkcygpOwotICAgICAgc2V0Q29udHJvbChwcm90b2NvbENvbXBvbmVudENvbnRyb2wpOwotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm90b2NvbENvbXBvbmVudENvbnRyb2wsIEFTREVkaXRvckNTSGVscElkcy5CSU5ESU5HX1dJWkFSRCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sIGV4dGVuZHMgUHJvdG9jb2xDb21wb25lbnRDb250cm9sCi0gIHsKLSAgICBwdWJsaWMgQmluZGluZ1Byb3RvY29sQ29tcG9uZW50Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBCaW5kaW5nR2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICB7Ci0gICAgICB0aGlzKHBhcmVudCwgZ2VuZXJhdG9yLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmluZGluZ1Byb3RvY29sQ29tcG9uZW50Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBCaW5kaW5nR2VuZXJhdG9yIGdlbmVyYXRvciwgYm9vbGVhbiBzaG93T3ZlcndyaXRlQnV0dG9uKQotICAgIHsKLSAgICAgIHN1cGVyKHBhcmVudCwgZ2VuZXJhdG9yLCBzaG93T3ZlcndyaXRlQnV0dG9uKTsKLQotICAgICAgaWYgKGdlbmVyYXRvci5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50TmFtZUZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZk5hbWVMYWJlbFRleHQoKQotICAgIHsKLSAgICAgIHJldHVybiBNZXNzYWdlcy5fVUlfUE9SVF9UWVBFOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0UmVmTmFtZXMoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChnZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpKS5nZXRQb3J0VHlwZU5hbWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpCi0gICAgewotICAgICAgU3RyaW5nIGJpbmRpbmdOYW1lID0gZ2VuZXJhdG9yLmdldE5hbWUoKTsKLSAgICAgIHJldHVybiBiaW5kaW5nTmFtZSAhPSBudWxsID8gYmluZGluZ05hbWUgOiBOYW1lVXRpbC5idWlsZFVuaXF1ZUJpbmRpbmdOYW1lKGdlbmVyYXRvci5nZXREZWZpbml0aW9uKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UgY3JlYXRlQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKFN0cmluZyBwcm90b2NvbCkKLSAgICB7Ci0gICAgICBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2Ugb3B0aW9uc1BhZ2UgPSBudWxsOwotCSAgU3RyaW5nIHByb3RvY29sU2VsZWN0aW9uID0gcHJvdG9jb2xDb21iby5nZXRJdGVtKHByb3RvY29sQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JICBpZiAocHJvdG9jb2xTZWxlY3Rpb24uZXF1YWxzKCJTT0FQIikpIHsgLy8kTk9OLU5MUy0xJAotCQkgIG9wdGlvbnNQYWdlID0gbmV3IFNvYXBCaW5kaW5nT3B0aW9uc1BhZ2UoKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHByb3RvY29sU2VsZWN0aW9uLmVxdWFscygiSFRUUCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJICBvcHRpb25zUGFnZSA9IG5ldyBIdHRwQmluZGluZ09wdGlvbnNQYWdlKCk7Ci0JICB9Ci0vLyAgICAgIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24gZXh0ZW5zaW9uID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24ocHJvdG9jb2wpOwotLy8gICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBvcHRpb25zUGFnZSA9IGV4dGVuc2lvbi5jcmVhdGVCaW5kaW5nQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKCk7Ci0vLyAgICAgIH0KLSAgICAgIHJldHVybiBvcHRpb25zUGFnZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9Db250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9Db250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWExNmUxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsgIAotICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkJhc2VHZW5lcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGluaXQoQmFzZUdlbmVyYXRvciBiYXNlR2VuZXJhdG9yKTsgICAgICAgICAgICAgCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLSAgcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCk7Ci0gIAotICAvLyBUT0RPIGNhbiB0aGlzIGdvIGludG8gaW5pdD8KLSAgLy8KLSAgcHVibGljIHZvaWQgc2V0T3B0aW9uc09uR2VuZXJhdG9yKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9IdHRwQmluZGluZ09wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvSHR0cEJpbmRpbmdPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTU4Njc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9IdHRwQmluZGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuZ2VuZXJhdG9yLkhUVFBDb250ZW50R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CYXNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgSHR0cEJpbmRpbmdPcHRpb25zUGFnZSBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBnZXRCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gcG9zdEJ1dHRvbjsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotICBwcm90ZWN0ZWQgQmFzZUdlbmVyYXRvciBnZW5lcmF0b3I7Ci0gIHByb3RlY3RlZCBIVFRQQ29udGVudEdlbmVyYXRvciBodHRwR2VuZXJhdG9yOwotCi0gIHB1YmxpYyBIdHRwQmluZGluZ09wdGlvbnNQYWdlKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChCYXNlR2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgewotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCWlmIChnZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpIGluc3RhbmNlb2YgSFRUUENvbnRlbnRHZW5lcmF0b3IpIHsKLQkJaHR0cEdlbmVyYXRvciA9IChIVFRQQ29udGVudEdlbmVyYXRvcikgZ2VuZXJhdG9yLmdldENvbnRlbnRHZW5lcmF0b3IoKTsKLQl9Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgCi0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgTGFiZWwgb3B0aW9uc0hlYWRpbmcgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULk5PTkUpOwotICAgIG9wdGlvbnNIZWFkaW5nLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0hUVFBfQklORElOR19PUFRJT05TKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotICAgIGdldEJ1dHRvbi5zZXRUZXh0KCJIVFRQIEdFVCIpOyAvLyROT04tTkxTLTEkCi0gICAgZ2V0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQotICAgIHBvc3RCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5SQURJTyk7Ci0gICAgcG9zdEJ1dHRvbi5zZXRUZXh0KCJIVFRQIFBPU1QiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGdlbmVyYXRvci5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZ2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKTsKLSAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3QgZWVMaXN0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGlmIChlZUxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlZUxpc3QuZ2V0KDApOwotICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChlZSk7Ci0gICAgICAgICAgU3RyaW5nIHZlcmIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyYiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKCJQT1NUIi5lcXVhbHModmVyYikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBnZXRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIHBvc3RCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHBvc3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgZ2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCWNvbXB1dGVPcHRpb25zKCk7Ci0JCi0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLQkgIHJldHVybiBjb250cm9sOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUFwcGxpY2FibGUoKQotICB7Ci0gIAlyZXR1cm4gdHJ1ZTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQljb21wdXRlT3B0aW9ucygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZU9wdGlvbnMoKQotICB7Ci0JICBpZiAoZ2VuZXJhdG9yLmdldENvbnRlbnRHZW5lcmF0b3IoKSBpbnN0YW5jZW9mIEhUVFBDb250ZW50R2VuZXJhdG9yKSB7Ci0JCSAgSFRUUENvbnRlbnRHZW5lcmF0b3IgaHR0cEdlbmVyYXRvciA9IChIVFRQQ29udGVudEdlbmVyYXRvcikgZ2VuZXJhdG9yLmdldENvbnRlbnRHZW5lcmF0b3IoKTsKLQotCQkgIGlmIChwb3N0QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkgIGh0dHBHZW5lcmF0b3Iuc2V0VmVyYihIVFRQQ29udGVudEdlbmVyYXRvci5WRVJCX1BPU1QpOwotCQkgIH0JICAKLQkJICBlbHNlIGlmIChnZXRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCSAgaHR0cEdlbmVyYXRvci5zZXRWZXJiKEhUVFBDb250ZW50R2VuZXJhdG9yLlZFUkJfR0VUKTsKLQkJICB9Ci0JICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE9wdGlvbnNPbkdlbmVyYXRvcigpIHsKLQkgIGNvbXB1dGVPcHRpb25zKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05hbWVzcGFjZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvTmFtZXNwYWNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxYzEwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvTmFtZXNwYWNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuTmF2aWdhYmxlVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdE5hbWVzcGFjZUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLlVwZGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25SZXNvdXJjZXM7Ci0gCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVGFibGUgZXh0ZW5kcyBDb21wb3NpdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSSA9IFhNTENvbW1vblJlc291cmNlcy5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FIik7IAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9MQUJFTF9QUkVGSVgiKTsgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREUgPSBNZXNzYWdlcy5fVUlfVElUTEVfU0VMRUNUOyAvLyROT04tTkxTLTEkCi0gICAgCi0gIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IFZlY3RvcigpOwotICBwcm90ZWN0ZWQgTGlzdCBjaGVja2VkTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJvdGVjdGVkIE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyIHRhYmxlVmlld2VyOyAgICAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBhZGRCdXR0b247Ci0KLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBVcGRhdGVMaXN0ZW5lciB1cGRhdGVMaXN0ZW5lcjsgICAKLSAgcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247ICAKLSAgcHJvdGVjdGVkIGludCB2aXNpYmxlUm93cyA9IC0xOyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGR1bW15Um93c1JlbW92ZWQgPSBmYWxzZTsKLSAgVGFibGUgdGFibGU7Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgIAotICAgIHRoaXMocGFyZW50LCAtMSwgLTEsIC0xKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTmFtZXNwYWNlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIC0xLCAtMSwgdmlzaWJsZVJvd3MpOwotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50KQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgLTEpOwotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgdmlzaWJsZVJvd3MpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBHcmlkRGF0YSBmaWxsR0Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGZpbGxHRC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbGxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGZpbGxHRC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBmaWxsR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgCi0gICAgc2V0TGF5b3V0RGF0YShmaWxsR0QpOyAgICAgICAgICAgICAKLSAgICAKLSAgICBHcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotICAgIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfVVJJU19UT19CRV9JTkNMVURFRCk7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOyAgIAotICAgIEdyaWREYXRhIGdkID0gZmlsbEdEOwotICAgIGlmICh3aWR0aEhpbnQgIT0gLTEpCi0gICAgewotICAgICAgZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotICAgIH0gICAKLSAgICBpZiAoaGVpZ2h0SGludCAhPSAtMSkKLSAgICB7Ci0gICAgICBnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLSAgICB9Ci0gICAgbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dERhdGEoZ2QpOyAKLSAgICAvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChuYW1lc3BhY2VJbmZvR3JvdXAsIG5ldyBDb250cm9sQ29udGV4dENvbXB1dGVyKG5hbWVzcGFjZUluZm9Hcm91cCwgWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19OQU1FU1BBQ0VfR1JPVVApKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nW10gdGl0bGVBcnJheSA9IHtJTkNMVURFLCBQUkVGSVgsIE5BTUVTUEFDRV9VUkl9OwotCi0gICAgdGFibGUgPSBuZXcgVGFibGUobmFtZXNwYWNlSW5mb0dyb3VwLCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgCi0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShmaWxsR0QpOwotICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICB0YWJsZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLSAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmogPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICBpZiAob2JqICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgVGFibGVFbGVtZW50IGhvbGRlciA9IChUYWJsZUVsZW1lbnQpb2JqOwotICAgICAgICAgICAgVGFibGVDb2x1bW4gY29sID0gdGFibGUuZ2V0Q29sdW1uKDApOwotICAgICAgICAgICAgaWYgKGUueCA8IGNvbC5nZXRXaWR0aCgpKSAvLyBpZiB0aGUgcG9pbnQgZmFsbHMgd2l0aGluIHRoZSBTZWxlY3QgY29sdW1uIHRoZW4gcGVyZm9ybSBjaGVjay91bmNoZWNrCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50U3RhdGUgPSBob2xkZXIuZ2V0Q2hlY2tlZCgpOwotICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlLmVxdWFscygidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGNoZWNrZWRMaXN0LnNldChob2xkZXIuZ2V0SW5kZXgoKSwgImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRTdGF0ZS5lcXVhbHMoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhvbGRlci5zZXRDaGVja2VkKCJ0cnVlIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgY2hlY2tlZExpc3Quc2V0KGhvbGRlci5nZXRJbmRleCgpLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxpc3RlbmVyLnVwZGF0ZU9jY3VyZWQodGhpcywgbmFtZXNwYWNlSW5mb0xpc3QpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHRhYmxlVmlld2VyID0gbmV3IE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyKHRhYmxlKTsKLSAgICBwcm92aWRlciA9IG5ldyBOYW1lc3BhY2VJbmZvVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0gICAgdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsgICAKLSAgICB0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICB0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKHRpdGxlQXJyYXkpOwotICAgIHRhYmxlVmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgTmFtZXNwYWNlSW5mb0NlbGxNb2RpZmllcigpKTsKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnRbXSB3aWR0aEFycmF5ID0gezEwLCAyMCwgNTB9OwotICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOyAgCi0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRpdGxlQXJyYXkubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KHRpdGxlQXJyYXlbaV0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSh3aWR0aEFycmF5W2ldLCB0cnVlKSk7Ci0gICAgfSAgICAgICAgIAotICAgIHRoaXMudmlzaWJsZVJvd3MgPSB2aXNpYmxlUm93czsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVSb3dzOyBpKyspCi0gICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7IAotICAgICAgaXRlbS5zZXRUZXh0KCIjIyMjIyMjIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgdGFibGUuc2V0TGF5b3V0KGxheW91dCk7ICAKLSAgICAKLSAgICBDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclt0aXRsZUFycmF5Lmxlbmd0aF07Ci0gICAgY2VsbEVkaXRvcnNbMF0gPSBuZXcgTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvcih0YWJsZSk7Ci0gICAgY2VsbEVkaXRvcnNbMV0gPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotICAgIHRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQotLy8gICAgY3JlYXRlQnV0dG9ucyhuYW1lc3BhY2VJbmZvR3JvdXApOyAgICAgICAgICAgIAotCi0gICAgaW5pdGlhbGl6ZSgpOyAgICAKLSAgfSAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVMaXN0ZW5lcihVcGRhdGVMaXN0ZW5lciB1cGRhdGVMaXN0ZW5lcikKLSAgewotICAgIHRoaXMudXBkYXRlTGlzdGVuZXIgPSB1cGRhdGVMaXN0ZW5lcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpCi0gIHsgICAgCi0gICAgdGhpcy5uYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9MaXN0OwotICAgIHVwZGF0ZSgpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0gIH0gIAotCi0gIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUNoZWNrZWRMaXN0KCkKLSAgewotICAgIHJldHVybiBjaGVja2VkTGlzdDsKLSAgfSAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMUHJlZml4KCkKLSAgewotICAgIHJldHVybiAoKE5hbWVzcGFjZUluZm8pKG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKSkpLnByZWZpeDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlTG9jYXRpb24oSVBhdGggcmVzb3VyY2VMb2NhdGlvbikKLSAgewotICAgIHRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgR3JpZExheW91dCBjcmVhdGVHcmlkTGF5b3V0KCkKLSAgewotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgcmV0dXJuIGdyaWRMYXlvdXQ7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpCi0gIHsKLSAgICAvLyBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuLi4uCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvMSA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzEucHJlZml4ID0gIndzZGwiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzEudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvMSk7Ci0gICAgY2hlY2tlZExpc3QuYWRkKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBOYW1lc3BhY2VJbmZvIGluZm8yID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBpbmZvMi5wcmVmaXggPSAic29hcCI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvMi51cmkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzIpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzMgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm8zLnByZWZpeCA9ICJodHRwIjsgIC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvMy51cmkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzMpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzQgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm80LnByZWZpeCA9ICJtaW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm80LnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIjsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvNCk7Ci0gICAgY2hlY2tlZExpc3QuYWRkKCJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvNSA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzUucHJlZml4ID0gInNvYXBlbmMiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzUudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvNSk7Ci0gICAgY2hlY2tlZExpc3QuYWRkKCJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvNiA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzYucHJlZml4ID0gInNvYXBlbnYiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzYudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvNik7Ci0gICAgY2hlY2tlZExpc3QuYWRkKCJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvNyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzcucHJlZml4ID0gInhzaSI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvNy51cmkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm83KTsKLSAgICBjaGVja2VkTGlzdC5hZGQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBOYW1lc3BhY2VJbmZvIGluZm84ID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBpbmZvOC5wcmVmaXggPSAieHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm84LnVyaSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzgpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgdXBkYXRlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkRGF0YSBoRmlsbEdEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgaEZpbGxHRC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGhGaWxsR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICAKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShoRmlsbEdEKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgCi0gICAgQnV0dG9uIGhpZGRlbkJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgaGlkZGVuQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotICAgIGhpZGRlbkJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICBoaWRkZW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICBTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgeyAgCi0gICAgICAgIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICBwZXJmb3JtTmV3KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OyAgIAotICAgIAotICAgIC8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB0aHJlZSBidXR0b25zCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShoRmlsbEdEKTsKLSAgICBHcmlkTGF5b3V0IGJ1dHRvbkdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGJ1dHRvbkdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgYnV0dG9uR3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uR3JpZExheW91dCk7Ci0KLSAgICAvLyBhZGQgdGhlIE5ldyBidXR0b24KLSAgICAvLwotICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLSAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGFkZEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsvL1ZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtTmV3KCkKLSAgewotICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gaW52b2tlRGlhbG9nKFhNTENvbW1vblJlc291cmNlcy5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04iKSwgaW5mbyk7IAotICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IERpYWxvZy5PSykKLSAgICB7Ci0gICAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgICBjaGVja2VkTGlzdC5hZGQoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLSAgICB9Ci0gIH0gCi0gICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykKLSAgewotICAgIFNoZWxsIHNoZWxsID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coc2hlbGwsIGluZm8pOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0gICAgZGlhbG9nLm9wZW4oKTsgICAgICAKLSAgICByZXR1cm4gZGlhbG9nOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKQotICB7Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0KLSAgICBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICB9Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0VGFyZ2V0TmFtZXNwYWNlSW5mbygpCi0gIHsKLSAgICByZXR1cm4gKG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwgJiYgbmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkgPyAKLSAgICAgICAgICAgKE5hbWVzcGFjZUluZm8pbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApIDoKLSAgICAgICAgICAgbnVsbDsKLSAgfSAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHVwZGF0ZUhlbHBlcihuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCB1cGRhdGVIZWxwZXIoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHZpc2libGVSb3dzICE9IC0xICYmICFkdW1teVJvd3NSZW1vdmVkKQotICAgIHsKLS8vICAgICAgZHVtbXlSb3dzUmVtb3ZlZCA9IHRydWU7Ci0vLyAgICAgIHRhYmxlVmlld2VyLmdldFRhYmxlKCkucmVtb3ZlQWxsKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvciBleHRlbmRzIENoZWNrYm94Q2VsbEVkaXRvciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyBOYW1lc3BhY2VJbmZvQ2hlY2tib3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRGb2N1c0NvbnRyb2woKS5yZWRyYXcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSAgIAotICAgIHsgICAgICAKLSAgICAgIGlmICh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7fQotICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7fQotCi0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyCi0gIHsKLSAgICBwdWJsaWMgTmFtZXNwYWNlSW5mb0NlbGxNb2RpZmllcigpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKFBSRUZJWCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBpbnQgY29sdW1uID0gMDsKLSAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoUFJFRklYKSkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhOQU1FU1BBQ0VfVVJJKSkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uID0gMjsKLSAgICAgIH0KLQotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRDb2x1bW5UZXh0KGVsZW1lbnQsIGNvbHVtbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWVsZW1lbnQ7Ci0gICAgICBpZiAoaXRlbSAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSAoVGFibGVFbGVtZW50KW9iajsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBob2xkZXIuZ2V0TmFtZXNwYWNlSW5mbygpOwotICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgY2hlY2tlZExpc3Quc2V0KGhvbGRlci5nZXRJbmRleCgpLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaG9sZGVyLnNldENoZWNrZWQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjaGVja2VkTGlzdC5zZXQoaG9sZGVyLmdldEluZGV4KCksICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKFBSRUZJWCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5mby5wcmVmaXggPSAoKFN0cmluZyl2YWx1ZSkudHJpbSgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAgICAgICBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICAgICAgICB9Ci0KLS8vICAgICAgICAgIHBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGNsYXNzIFRhYmxlRWxlbWVudAotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyBpbmZvOwotICAgIGludCBpbmRleDsKLSAgICBTdHJpbmcgY2hlY2tlZCA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIFRhYmxlRWxlbWVudChOYW1lc3BhY2VJbmZvIGluZm8sIGludCBpbmRleCkKLSAgICB7Ci0gICAgICB0aGlzLmluZm8gPSBpbmZvOwotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvKCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRJbmRleCgpCi0gICAgewotICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldENoZWNrZWQoKQotICAgIHsKLSAgICAgIHJldHVybiBjaGVja2VkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkKFN0cmluZyBjaGVja2VkKQotICAgIHsKLSAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBOYW1lc3BhY2VJbmZvVGFibGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciwgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgewotICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbyluYW1lc3BhY2VJbmZvTGlzdC5nZXQoaSk7Ci0gICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSBuZXcgVGFibGVFbGVtZW50KGluZm8sIGkpOwotICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgoU3RyaW5nKWNoZWNrZWRMaXN0LmdldChpKSk7Ci0gICAgICAgIHYuYWRkKGhvbGRlcik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdi50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW4pCi0gICAgewotICAgICAgVGFibGVFbGVtZW50IGhvbGRlciA9IChUYWJsZUVsZW1lbnQpb2JqZWN0OwotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gaG9sZGVyLmdldE5hbWVzcGFjZUluZm8oKTsKLSAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgc3dpdGNoIChjb2x1bW4pCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMTogeyByZXN1bHQgPSBpbmZvLnByZWZpeDsgYnJlYWs7IH0KLSAgICAgICAgY2FzZSAyOiB7IHJlc3VsdCA9IGluZm8udXJpOyBicmVhazsgfQotICAgICAgfQotICAgICAgcmVzdWx0ID0gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQudHJpbSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChyZXN1bHQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBzd2l0Y2ggKGNvbHVtbikKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIHJlc3VsdCA9IFhNTENvbW1vblJlc291cmNlcy5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX05PX05BTUVTUEFDRV9OQU1FIik7ICAKLSAgICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0vLyAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJlZml4KCkKLS8vICAgIHsKLS8vICAgICAgU3RyaW5nIGRlZmF1bHRQcmVmaXggPSAicCI7Ci0vLyAgICAgIGlmIChuYW1lc3BhY2VJbmZvTGlzdCA9PSBudWxsKQotLy8gICAgICAgIHJldHVybiBkZWZhdWx0UHJlZml4OwotLy8KLS8vICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICAgIGZvciAoaW50IGk9MDsgaTxuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCk7IGkrKykKLS8vICAgICAgewotLy8gICAgICAgIE5hbWVzcGFjZUluZm8gbnNpbmZvID0gKE5hbWVzcGFjZUluZm8pbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KGkpOwotLy8gICAgICAgIGlmIChuc2luZm8ucHJlZml4ICE9IG51bGwpCi0vLyAgICAgICAgICB2LmFkZEVsZW1lbnQobnNpbmZvLnByZWZpeCk7Ci0vLyAgICAgIH0KLS8vCi0vLyAgICAgIGlmICh2LmNvbnRhaW5zKGRlZmF1bHRQcmVmaXgpKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nIHMgPSBkZWZhdWx0UHJlZml4OwotLy8gICAgICAgIGZvciAoaW50IGo9MDsgdi5jb250YWlucyhzKTsgaisrKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHMgPSBkZWZhdWx0UHJlZml4ICsgSW50ZWdlci50b1N0cmluZyhqKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgcmV0dXJuIHM7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZQotLy8gICAgICAgIHJldHVybiBkZWZhdWx0UHJlZml4OwotLy8gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgIC8vIE91dHB1dCBDb2x1bW4KLSAgICAgIHsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSAoVGFibGVFbGVtZW50KSBvYmplY3Q7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGhvbGRlci5nZXRDaGVja2VkKCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdC5lcXVhbHMoInRydWUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL291dHB1dF95ZXMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL291dHB1dF9uby5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIE9iamVjdCBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotCi0gIGNsYXNzIE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyIGV4dGVuZHMgTmF2aWdhYmxlVGFibGVWaWV3ZXIKLSAgewotICAgIHB1YmxpYyBOYW1lc3BhY2VOYXZpZ2FibGVUYWJsZVZpZXdlcihUYWJsZSBwYXJlbnQpCi0gICAgewotICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdXU0RMV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvTmV3V1NETFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJlZTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdXU0RMV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByb3BlcnRpZXMuV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuZ2VuZXJhdG9yLkhUVFBDb250ZW50R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmdlbmVyYXRvci5TT0FQQ29udGVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CaW5kaW5nR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuSW50ZXJuYWxXU0RMTXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNyZWF0ZVdTRExFbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuRE9NVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE5ld1dTRExXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIFdTRExOZXdGaWxlUGFnZSBuZXdGaWxlUGFnZTsKLQlwcml2YXRlIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2Ugb3B0aW9uc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTmV3V1NETFdpemFyZC4KLQkgKi8KLQlwdWJsaWMgTmV3V1NETFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlGaWxlIGZpbGUgPSBuZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJY2hhclNldCA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyB3c2RsUHJlZml4ID0gIndzZGwiOyAvLyROT04tTkxTLTEkCi0JCVZlY3RvciBuYW1lc3BhY2VzID0gb3B0aW9uc1BhZ2UuZ2V0TmFtZXNwYWNlSW5mbygpOwotCi0JCVN0cmluZyBwcmVmaXggPSBvcHRpb25zUGFnZS5nZXRQcmVmaXgoKTsKLQkJU3RyaW5nIGRlZmluaXRpb25OYW1lID0gb3B0aW9uc1BhZ2UuZ2V0RGVmaW5pdGlvbk5hbWUoKTsKLQotCQlVUkkgdXJpMiA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJV1NETFJlc291cmNlSW1wbCByZXNvdXJjZSA9IChXU0RMUmVzb3VyY2VJbXBsKSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLndzZGwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVzb3VyY2Uuc2V0VVJJKHVyaTIpOwotCQkKLQkJV1NETEZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgV1NETEZhY3RvcnlJbXBsKCk7Ci0JCURlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbkltcGwpIGZhY3RvcnkuY3JlYXRlRGVmaW5pdGlvbigpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkZWZpbml0aW9uKTsKLQkJCi0JCWRlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKG9wdGlvbnNQYWdlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJZGVmaW5pdGlvbi5zZXRMb2NhdGlvbihmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCWRlZmluaXRpb24uc2V0RW5jb2RpbmcoY2hhclNldCk7Ci0JCWRlZmluaXRpb24uc2V0UU5hbWUobmV3IFFOYW1lKHdzZGxQcmVmaXgsIGRlZmluaXRpb25OYW1lKSk7Ci0JCWRlZmluaXRpb24uYWRkTmFtZXNwYWNlKHByZWZpeCwgb3B0aW9uc1BhZ2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5zaXplKCk7IGkrKykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZXMuZ2V0KGkpOwotCi0JCQlpZiAoaW5mby5wcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoaW5mby5wcmVmaXgsIGluZm8udXJpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRlZmluaXRpb24uYWRkTmFtZXNwYWNlKG51bGwsIGluZm8udXJpKTsKLQkJCX0KLQkJfQotCQkvLyBUT0RPIDogY3MuLi4gd2h5IGRvIHdlIG5lZWQgdGhpcz8gIHRoZXNlIGNhbGxzIGFyZSBldmlsIQotCQlkZWZpbml0aW9uLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlpZiAob3B0aW9uc1BhZ2UuZ2V0Q3JlYXRlU2tlbGV0b25Cb29sZWFuKCkpIHsKLQkJCQlpZiAob3B0aW9uc1BhZ2UuaXNTb2FwRG9jTGl0ZXJhbFByb3RvY29sKCkpIHsKLQkJCQkJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX0lORk9fRUxFTUVOVF9ERUNMQVJBVElPTjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTjsKLQkJCQl9Ci0KLQkJCQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5zZXJ2aWNlTmFtZSA9IGRlZmluaXRpb25OYW1lOwotCQkJCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLnBvcnROYW1lID0gZGVmaW5pdGlvbk5hbWUgKyBvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpOwotCQkJCVNlcnZpY2Ugc2VydmljZSA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZVNlcnZpY2UoZGVmaW5pdGlvbik7Ci0KLQotCQkJCS8vIEdlbmVyYXRlIEJpbmRpbmcKLQkJCQlJdGVyYXRvciBiaW5kaW5nSXQgPSBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLml0ZXJhdG9yKCk7Ci0JCQkJQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLQkJCQlpZiAoYmluZGluZ0l0Lmhhc05leHQoKSkgewotCQkJCQliaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdJdC5uZXh0KCk7Ci0JCQkJfQotCQkJCUJpbmRpbmdHZW5lcmF0b3IgYmluZGluZ0dlbmVyYXRvciA9IG5ldyBCaW5kaW5nR2VuZXJhdG9yKGRlZmluaXRpb24sIGJpbmRpbmcsIFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJKTsKLQkJCQlQb3J0IHBvcnQgPSAoUG9ydCkgc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUoQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXROYW1lKHBvcnQuZ2V0RUJpbmRpbmcoKSkpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3Iuc2V0UmVmTmFtZShDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldFBvcnRUeXBlUmVmZXJlbmNlKHBvcnQuZ2V0RUJpbmRpbmcoKSkpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3Iuc2V0T3ZlcndyaXRlKHRydWUpOwotCQkJCQotCQkJCWlmIChvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpLmVxdWFscygiU09BUCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIG5hbWVzcGFjZSA9IFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJOwotCQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldENvbnRlbnRHZW5lcmF0b3IoQmluZGluZ0dlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKG5hbWVzcGFjZSkpOwotCi0JCQkJCVNPQVBDb250ZW50R2VuZXJhdG9yIHNvYXBHZW4gPSAoU09BUENvbnRlbnRHZW5lcmF0b3IpIGJpbmRpbmdHZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpOwotCQkJCQlCb29sZWFuIGJvb2xlYW5WYWx1ZSA9IChCb29sZWFuKSBvcHRpb25zUGFnZS5nZXRQcm90b2NvbE9wdGlvbnMoKVswXTsKLQkJCQkJQm9vbGVhbiBib29sZWFuVmFsdWUyID0gKEJvb2xlYW4pIG9wdGlvbnNQYWdlLmdldFByb3RvY29sT3B0aW9ucygpWzJdOwotCQkJCQlpZiAoYm9vbGVhblZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkvLyBEb2N1bWVudCBMaXRlcmFsCi0JCQkJCQlzb2FwR2VuLnNldFN0eWxlKFNPQVBDb250ZW50R2VuZXJhdG9yLlNUWUxFX0RPQ1VNRU5UKTsKLQkJCQkJCXNvYXBHZW4uc2V0VXNlKFNPQVBDb250ZW50R2VuZXJhdG9yLlVTRV9MSVRFUkFMKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChib29sZWFuVmFsdWUyLmJvb2xlYW5WYWx1ZSgpKXsKLQkJCQkJCS8vIFJQQyBMaXRlcmFsCi0JCQkJCQlzb2FwR2VuLnNldFN0eWxlKFNPQVBDb250ZW50R2VuZXJhdG9yLlNUWUxFX1JQQyk7Ci0JCQkJCQlzb2FwR2VuLnNldFVzZShTT0FQQ29udGVudEdlbmVyYXRvci5VU0VfTElURVJBTCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBSUEMgRW5jb2RlZAotCQkJCQkJc29hcEdlbi5zZXRTdHlsZShTT0FQQ29udGVudEdlbmVyYXRvci5TVFlMRV9SUEMpOwotCQkJCQkJc29hcEdlbi5zZXRVc2UoU09BUENvbnRlbnRHZW5lcmF0b3IuVVNFX0VOQ09ERUQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9wdGlvbnNQYWdlLmdldFByb3RvY29sKCkuZXF1YWxzKCJIVFRQIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgbmFtZXNwYWNlID0gSFRUUENvbnN0YW50cy5IVFRQX05BTUVTUEFDRV9VUkk7Ci0JCQkJCWJpbmRpbmdHZW5lcmF0b3Iuc2V0Q29udGVudEdlbmVyYXRvcihCaW5kaW5nR2VuZXJhdG9yLmdldENvbnRlbnRHZW5lcmF0b3IobmFtZXNwYWNlKSk7Ci0KLQkJCQkJQm9vbGVhbiBib29sZWFuVmFsdWUgPSAoQm9vbGVhbikgb3B0aW9uc1BhZ2UuZ2V0UHJvdG9jb2xPcHRpb25zKClbMF07Ci0JCQkJCWlmIChib29sZWFuVmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCS8vIFBvc3QKLQkJCQkJCSgoSFRUUENvbnRlbnRHZW5lcmF0b3IpIGJpbmRpbmdHZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpKS5zZXRWZXJiKEhUVFBDb250ZW50R2VuZXJhdG9yLlZFUkJfUE9TVCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBHZXQKLQkJCQkJCSgoSFRUUENvbnRlbnRHZW5lcmF0b3IpIGJpbmRpbmdHZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpKS5zZXRWZXJiKEhUVFBDb250ZW50R2VuZXJhdG9yLlZFUkJfR0VUKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQliaW5kaW5nR2VuZXJhdG9yLmdlbmVyYXRlQmluZGluZygpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3IuZ2VuZXJhdGVQb3J0Q29udGVudCgpOwkJCQkKLQkJCX0KLQkJCXJlc291cmNlLnNhdmUobnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ291bGQgbm90IHdyaXRlIG5ldyBXU0RMIGZpbGUgaW4gV1NETCBXaXphcmQ6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoKLQkJICogaWYgKGZpbGUgIT0gbnVsbCkgeyBmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldwotCQkgKiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpOyBpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsgSVdvcmtiZW5jaAotCQkgKiB3b3JrYmVuY2ggPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7IGZpbmFsCi0JCSAqIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0KLQkJICogd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOyBmaW5hbCBJV29ya2JlbmNoUGFydAotCQkgKiBmb2N1c1BhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsgaWYKLQkJICogKGZvY3VzUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJICogRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjIChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJICogKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWZvY3VzUGFydCkuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7IH0gfSk7IH0gfSB9Ci0JCSAqLwotCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0KLQkJLy8gTmVlZCBuZXcgaWNvbgotCQl0aGlzLnNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShJbnRlcm5hbFdTRExNdWx0aVBhZ2VFZGl0b3IuY2xhc3MsICJpY29ucy9uZXdfd3NkbF93aXouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuc2V0V2luZG93VGl0bGUoTWVzc2FnZXMuX1VJX1RJVExFX05FV19XU0RMX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCW5ld0ZpbGVQYWdlID0gbmV3IFdTRExOZXdGaWxlUGFnZShzZWxlY3Rpb24pOwotCQlvcHRpb25zUGFnZSA9IG5ldyBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlKE1lc3NhZ2VzLl9VSV9USVRMRV9PUFRJT05TLCBNZXNzYWdlcy5fVUlfVElUTEVfT1BUSU9OUywgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhZGRQYWdlKG5ld0ZpbGVQYWdlKTsKLQkJYWRkUGFnZShvcHRpb25zUGFnZSk7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldE5ld0ZpbGVQYXRoKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBuZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlyZXR1cm4gZmlsZU5hbWUgIT0gbnVsbCA/IG5ldyBQYXRoKGZpbGVOYW1lKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAobmV3RmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKSAmJiBvcHRpb25zUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGVkaXRvcklkID0gbnVsbDsKLQkJCQkJCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKGlGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLCBpRmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKS5nZXRDb250ZW50VHlwZSgpKTsKLQkJCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQkJCWVkaXRvcklkID0gZWRpdG9yLmdldElkKCk7Ci0JCQkJCQl9Ci0JCQkJCQl3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChpRmlsZSksIGVkaXRvcklkKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIEIyQkdVSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRXhjZXB0aW9uCi0JCQkJCQkvLyBlbmNvdW50ZXJlZCB3aGVuIGF0dGVtcHRpbmcgdG8gb3BlbiBmaWxlOiAiICsgaUZpbGUKLQkJCQkJCS8vICsgIlxuXG4iICsgZXgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yIGV4dGVuZHMgQ01WaXNpdG9yIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BVFRSSUJVVEVTID0gTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQ0hJTERfTk9ERVMgPSBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTID0gTW9kZWxRdWVyeS5JTkNMVURFX1NFUVVFTkNFX0dST1VQUzsKLQotCQlwdWJsaWMgSGFzaHRhYmxlIGNoaWxkTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwdWJsaWMgSGFzaHRhYmxlIGF0dHJpYnV0ZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwdWJsaWMgRWxlbWVudCByb290RWxlbWVudDsKLQkJcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RFbGVtZW50RGVjbGFyYXRpb247Ci0JCXB1YmxpYyBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0JCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVTZXF1ZW5jZUdyb3VwczsKLQkJcHVibGljIERPTVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkJcHVibGljIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoRWxlbWVudCByb290RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50OwotCQkJdGhpcy5yb290RWxlbWVudERlY2xhcmF0aW9uID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsKLQkJCXZhbGlkYXRvciA9IG5ldyBET01WYWxpZGF0b3IoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KENNTm9kZSBjbU5vZGUpIHsKLQkJCVN0cmluZyBrZXkgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSBjbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKSBjbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLQkJCQkJa2V5ID0gIlsiICsgbmFtZXNwYWNlVVJJICsgIl0iICsga2V5OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0KLQkJcHVibGljIExpc3QgY29tcHV0ZUF2YWlsYWJsZUNvbnRlbnQoaW50IGluY2x1ZGVPcHRpb25zKSB7Ci0JCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQotCQkJaW50IGNvbnRlbnRUeXBlID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJaW5jbHVkZVNlcXVlbmNlR3JvdXBzID0gKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTKSAhPSAwKTsKLQkJCXZpc2l0Q01Ob2RlKHJvb3RFbGVtZW50RGVjbGFyYXRpb24pOwotCi0JCQlpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9BVFRSSUJVVEVTKSAhPSAwKSB7Ci0JCQkJdi5hZGRBbGwoYXR0cmlidXRlVGFibGUudmFsdWVzKCkpOwotCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gbmlsbGFibGVBdHRyaWJ1dGUgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25pbGxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobmlsbGFibGVBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQl2LmFkZChuaWxsYWJsZUF0dHJpYnV0ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9DSElMRF9OT0RFUykgIT0gMCkgewotCQkJCWlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKSB7Ci0JCQkJCXYuYWRkQWxsKGNoaWxkTm9kZVRhYmxlLnZhbHVlcygpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKSB7Ci0JCQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSByb290RWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJCQl2LmFkZCgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKSB7Ci0JCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSByb290RWxlbWVudERlY2xhcmF0aW9uLmdldERhdGFUeXBlKCk7Ci0JCQkJCWlmIChkYXRhVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQl2LmFkZChkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdjsKLQkJfQotCi0JCS8qCi0JCSAqIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KSB7IFN0cmluZyB1cmkgPQotCQkgKiBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyBMaXN0IGxpc3QgPQotCQkgKiBnZXRDTURvY3VtZW50TGlzdChyb290RWxlbWVudCwgcm9vdEVsZW1lbnREZWNsYXJhdGlvbiwgdXJpKTsgZm9yCi0JCSAqIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJICogQ01Eb2N1bWVudCBjbWRvY3VtZW50ID0gKENNRG9jdW1lbnQpaXRlcmF0b3IubmV4dCgpOyBpZiAoY21kb2N1bWVudCAhPQotCQkgKiBudWxsKSB7IENNTmFtZWROb2RlTWFwIG1hcCA9IGNtZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsgaW50IHNpemUgPQotCQkgKiBtYXAuZ2V0TGVuZ3RoKCk7IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7IENNTm9kZSBlZCA9Ci0JCSAqIG1hcC5pdGVtKGkpOwotCQkgKiAKLQkJICogY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsgfSB9IH0gfQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJCXN1cGVyLnZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhZCk7Ci0JCQlhdHRyaWJ1dGVUYWJsZS5wdXQoYWQuZ2V0Tm9kZU5hbWUoKSwgYWQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQkJaWYgKGVkID09IHJvb3RFbGVtZW50RGVjbGFyYXRpb24gJiYgIWlzUm9vdFZpc2l0ZWQpIHsKLQkJCQlpc1Jvb3RWaXNpdGVkID0gdHJ1ZTsKLQkJCQlzdXBlci52aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljaGlsZE5vZGVUYWJsZS5wdXQoZ2V0S2V5KGVkKSwgZWQpOwotCQkJCX0KLQotCQkJCUNNTm9kZUxpc3Qgc3Vic3RpdHV0aW9uR3JvdXAgPSAoQ01Ob2RlTGlzdCkgZWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoc3Vic3RpdHV0aW9uR3JvdXAgIT0gbnVsbCkgewotCQkJCQloYW5kbGVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3Vic3RpdHV0aW9uR3JvdXAoQ01Ob2RlTGlzdCBzdWJzdGl0dXRpb25Hcm91cCkgewotCQkJaW50IHN1YnN0aXR1dGlvbkdyb3VwTGVuZ3RoID0gc3Vic3RpdHV0aW9uR3JvdXAuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGggPiAxKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzdGl0dXRpb25Hcm91cExlbmd0aDsgaSsrKSB7Ci0JCQkJCUNNTm9kZSBlZCA9IHN1YnN0aXR1dGlvbkdyb3VwLml0ZW0oaSk7Ci0JCQkJCWlmICghQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKSB7Ci0JCQlpZiAoaW5jbHVkZVNlcXVlbmNlR3JvdXBzKSB7Ci0JCQkJaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5TRVFVRU5DRSAmJiBncm91cC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAxICYmIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KGdyb3VwKSkgewotCQkJCQljaGlsZE5vZGVUYWJsZS5wdXQoZ3JvdXAsIGdyb3VwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZXNSZXF1aXJlZENvbnRlbnQoQ01Hcm91cCBncm91cCkgewotCQkJTGlzdCBsaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGdyb3VwKTsKLQkJCXJldHVybiBsaXN0LnNpemUoKSA+IDE7Ci0JCX0KLQotCQlwdWJsaWMgRE9NVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJCXJldHVybiB2YWxpZGF0b3I7Ci0JCX0KLQl9IC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaGVyZQotCQotCQotCXB1YmxpYyB2b2lkIG9wZW5Qcm9qZWN0V1NJUHJvcGVydGllcygpIHsKLQkJU2hlbGwgc2hlbGwgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3RmlsZVBhZ2UuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5hcHBlbmQobmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKSkpLmdldFByb2plY3QoKTsKLQkJLy9QcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihzaGVsbCx0YXJnZXRQcm9qZWN0LG51bGwsbnVsbCxudWxsKS5vcGVuKCk7Ci0KLQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByb3BlcnR5RGlhbG9nT24oc2hlbGwsdGFyZ2V0UHJvamVjdCxXU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlLlBBR0VfSUQgLG5ldyBTdHJpbmdbXSB7V1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZS5QQUdFX0lEfSxudWxsKS5vcGVuKCk7Ci0JfQotCQotCSAgcHVibGljIFN0cmluZyBnZXRXU0lQcmVmZXJlbmNlcygpIHsKLQkJICBJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ld0ZpbGVQYWdlLmdldENvbnRhaW5lckZ1bGxQYXRoKCkuYXBwZW5kKG5ld0ZpbGVQYWdlLmdldEZpbGVOYW1lKCkpKS5nZXRQcm9qZWN0KCk7Ci0JCSAgUGVyc2lzdGVudFdTSUNvbnRleHQgV1NJU1NCY29udGV4dCA9IFdTUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKTsKLQkJICAKLQkJICAgICBpZiAoV1NJU1NCY29udGV4dC5wcm9qZWN0U3RvcE5vbldTSUNvbXBsaWFuY2VzKHRhcmdldFByb2plY3QpKQotCQkgICAgICB7Ci0JCSAgICAgICAgcmV0dXJuIChQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kpOwotCQkgICAgICB9IAotCQkgICAgICBlbHNlIGlmIChXU0lTU0Jjb250ZXh0LnByb2plY3RXYXJuTm9uV1NJQ29tcGxpYW5jZXModGFyZ2V0UHJvamVjdCkpCi0JCSAgICAgIHsKLQkJICAgICAgICByZXR1cm4gKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSSk7Ci0JCSAgICAgIH0KLQkJICAgICAgZWxzZSAKLQkJICAgICAgewotCQkgICAgCXJldHVybiAoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotCQkgICAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvUG9ydFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1BvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0NjZmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvUG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5Qb3J0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3RvY29sQ29tcG9uZW50Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLQotcHVibGljIGNsYXNzIFBvcnRXaXphcmQgZXh0ZW5kcyBXaXphcmQKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfTkVXX0JJTkRJTkcgPSAxOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTVFlMRV9FWElTVElOR19CSU5ESU5HID0gMSA8PCAxOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTVFlMRV9ERUZBVUxUID0gU1RZTEVfTkVXX0JJTkRJTkcgfCBTVFlMRV9FWElTVElOR19CSU5ESU5HOwotCi0gIHByb3RlY3RlZCBQb3J0R2VuZXJhdG9yIHBvcnRHZW5lcmF0b3I7Ci0gIHByb3RlY3RlZCBQb3J0V2l6YXJkT3B0aW9uc1BhZ2Ugc3BlY2lmeUJpbmRpbmdQYWdlOwotICBwcm90ZWN0ZWQgaW50IHN0eWxlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgUG9ydFdpemFyZC4KLSAgICovCi0gIHB1YmxpYyBQb3J0V2l6YXJkKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIHRoaXMoc2VydmljZSwgMCk7Ci0gIH0KLQotICBwdWJsaWMgUG9ydFdpemFyZChTZXJ2aWNlIHNlcnZpY2UsIGludCBzdHlsZSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgcG9ydEdlbmVyYXRvciA9IG5ldyBQb3J0R2VuZXJhdG9yKHNlcnZpY2UpOwotICAgIHNldFdpbmRvd1RpdGxlKE1lc3NhZ2VzLl9VSV9QT1JUX1dJWkFSRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAvL3NldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShXU0RMRWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvTmV3WE1MLmdpZiIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB3aXphcmQgc2V0dXAgaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXR1cCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkKLSAgewotICAgIHNwZWNpZnlCaW5kaW5nUGFnZSA9IG5ldyBQb3J0V2l6YXJkT3B0aW9uc1BhZ2Uoc3R5bGUpOwotICAgIGFkZFBhZ2Uoc3BlY2lmeUJpbmRpbmdQYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IHBvcnRHZW5lcmF0b3IuZ2VuZXJhdGVQb3J0KCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAob2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjbGFzcyBQb3J0V2l6YXJkT3B0aW9uc1BhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi0gIHsKLQotICAgIHByb3RlY3RlZCBQcm90b2NvbENvbXBvbmVudENvbnRyb2wgcHJvdG9jb2xDb21wb25lbnRDb250cm9sOwotCi0gICAgcHVibGljIFBvcnRXaXphcmRPcHRpb25zUGFnZShpbnQgc3R5bGUpCi0gICAgewotICAgICAgc3VwZXIoIlNwZWNpZnlQb3J0UGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBzZXRUaXRsZShNZXNzYWdlcy5fVUlfU1BFQ0lGWV9QT1JUX0RFVEFJTFMpOyAvLyROT04tTkxTLTEkCi0gICAgICBzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5fVUlfU1BFQ0lGWV9QT1JUX0RFVEFJTFNfVE9fQkVfQ1JFQVRFRCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9ydEdlbmVyYXRvciBnZXRHZW5lcmF0b3IoKQotICAgIHsKLSAgICAgIHJldHVybiBwb3J0R2VuZXJhdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBQcm90b2NvbENvbXBvbmVudENvbnRyb2wgcHJvdG9jb2xDb21wb25lbnRDb250cm9sID0gbmV3IFBvcnRQcm90b2NvbENvbXBvbmVudENvbnRyb2wocGFyZW50LCBwb3J0R2VuZXJhdG9yKTsKLSAgICAgIHByb3RvY29sQ29tcG9uZW50Q29udHJvbC5pbml0RmllbGRzKCk7Ci0gICAgICBzZXRDb250cm9sKHByb3RvY29sQ29tcG9uZW50Q29udHJvbCk7Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3RvY29sQ29tcG9uZW50Q29udHJvbCwgQVNERWRpdG9yQ1NIZWxwSWRzLlBPUlRfV0laQVJEKTsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBQb3J0UHJvdG9jb2xDb21wb25lbnRDb250cm9sIGV4dGVuZHMgUHJvdG9jb2xDb21wb25lbnRDb250cm9sCi0gIHsKLQotICAgIHB1YmxpYyBQb3J0UHJvdG9jb2xDb21wb25lbnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIFBvcnRHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICAgIHsKLSAgICAgIHN1cGVyKHBhcmVudCwgZ2VuZXJhdG9yLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWZOYW1lTGFiZWxUZXh0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gTWVzc2FnZXMuX1VJX0JJTkRJTkc7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRSZWZOYW1lcygpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKHBvcnRHZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpKS5nZXRCaW5kaW5nTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBwb3J0R2VuZXJhdG9yLmdldFNlcnZpY2UoKTsKLSAgICAgIHJldHVybiBOYW1lVXRpbC5idWlsZFVuaXF1ZVBvcnROYW1lKHNlcnZpY2UsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UgY3JlYXRlQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKFN0cmluZyBwcm90b2NvbCkKLSAgICB7Ci0gICAgICBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2Ugb3B0aW9uc1BhZ2UgPSBudWxsOwkgIAotCSAgU3RyaW5nIHByb3RvY29sU2VsZWN0aW9uID0gcHJvdG9jb2xDb21iby5nZXRJdGVtKHByb3RvY29sQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JICBpZiAocHJvdG9jb2xTZWxlY3Rpb24uZXF1YWxzKCJTT0FQIikpIHsgLy8kTk9OLU5MUy0xJAotCQkgIG9wdGlvbnNQYWdlID0gbmV3IFNvYXBCaW5kaW5nT3B0aW9uc1BhZ2UoKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHByb3RvY29sU2VsZWN0aW9uLmVxdWFscygiSFRUUCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJICBvcHRpb25zUGFnZSA9IG5ldyBIdHRwQmluZGluZ09wdGlvbnNQYWdlKCk7Ci0JICB9CSAgCi0JICAvLyBUT0RPOiBXZSBuZWVkIHRvIGV2ZW50dWFsbHkgcHV0IHRoaXMgYmFjayBpbgotLy8gICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uKHByb3RvY29sKTsKLS8vICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgb3B0aW9uc1BhZ2UgPSBleHRlbnNpb24uY3JlYXRlUG9ydENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSgpOwotLy8gICAgICB9Ci0gICAgICByZXR1cm4gb3B0aW9uc1BhZ2U7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1NvYXBCaW5kaW5nT3B0aW9uc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9Tb2FwQmluZGluZ09wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODMwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1NvYXBCaW5kaW5nT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5nZW5lcmF0b3IuU09BUENvbnRlbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkJhc2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTb2FwQmluZGluZ09wdGlvbnNQYWdlIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQnV0dG9uIGRvY0xpdGVyYWw7Ci0gIHByb3RlY3RlZCBCdXR0b24gcnBjTGl0ZXJhbDsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNFbmNvZGVkOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBCYXNlR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICBwdWJsaWMgU29hcEJpbmRpbmdPcHRpb25zUGFnZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoQmFzZUdlbmVyYXRvciBnZW5lcmF0b3IpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29udHJvbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIExhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChjb250cm9sLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgIEdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgTGFiZWwgb3B0aW9uc0hlYWRpbmcgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULk5PTkUpOwotICAgIG9wdGlvbnNIZWFkaW5nLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1NPQVBfQklORElOR19PUFRJT05TKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgZG9jTGl0ZXJhbCA9IG5ldyBCdXR0b24oY29udHJvbCwgU1dULlJBRElPKTsKLSAgICBkb2NMaXRlcmFsLnNldFRleHQoTWVzc2FnZXMuX1VJX1JBRElPX0RPQ1VNRU5UX0xJVEVSQUwpOyAvLyROT04tTkxTLTEkCi0gICAgZG9jTGl0ZXJhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICBycGNMaXRlcmFsID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotICAgIHJwY0xpdGVyYWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfUkFESU9fUlBDX0xJVEVSQUwpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcnBjRW5jb2RlZCA9IG5ldyBCdXR0b24oY29udHJvbCwgU1dULlJBRElPKTsKLSAgICBycGNFbmNvZGVkLnNldFRleHQoTWVzc2FnZXMuX1VJX1JBRElPX1JQQ19FTkNPREVEKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGdlbmVyYXRvci5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZ2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKTsKLQotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgaWYgKGVlTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7Ci0KLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZWUpOwotICAgICAgICAgIFN0cmluZyBzdHlsZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgCi0gICAgICAgICAgaWYgKCJycGMiLmVxdWFscyhzdHlsZSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgUlBDIExpdGVyYWwgb3IgUlBDIEVuY29kZWQKLSAgICAgICAgICAJU3RyaW5nIHVzZSA9ICJlbmNvZGVkIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIAlMaXN0IG9wZXJhdGlvbnMgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgICAgIAlpZiAob3BlcmF0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgCQllbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAJCUJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICAgIAkJaWYgKG9wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgCQkJT2JqZWN0IG9iamVjdCA9IG9wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgICAJCQllbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG9iamVjdCk7Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCQllbHNlIGlmIChvcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgCQkJT2JqZWN0IG9iamVjdCA9IG9wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgICAgCQkJZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvYmplY3QpOwotICAgICAgICAgIAkJfQotICAgICAgICAgIAkJZWxzZSBpZiAob3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJCUJpbmRpbmdGYXVsdCBmYXVsdCA9IChCaW5kaW5nRmF1bHQpIG9wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpLmdldCgwKTsKLSAgICAgICAgICAJCQlMaXN0IGZhdWx0RUUgPSBmYXVsdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAJCQkKLSAgICAgICAgICAJCQlpZiAoZmF1bHRFRS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgCQkJCWVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZmF1bHRFRS5nZXQoMCkpOwotICAgICAgICAgIAkJCX0KLSAgICAgICAgICAJCX0KLSAgICAgICAgICAJCQotICAgICAgICAgIAkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgIAkJCXVzZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ1c2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIAkJfQotICAgICAgICAgIAl9Ci0gICAgICAgICAgCQotICAgICAgICAgIAlpZiAodXNlICE9IG51bGwgJiYgImxpdGVyYWwiLmVxdWFscyh1c2UpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAJCWRvY0xpdGVyYWwuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAJCXJwY0xpdGVyYWwuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIAkJcnBjRW5jb2RlZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgIAl9Ci0gICAgICAgICAgCWVsc2UgeyAgICAgICAgICAJCi0gICAgICAgICAgCQlkb2NMaXRlcmFsLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgCQlycGNMaXRlcmFsLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgCQlycGNFbmNvZGVkLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAJfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGRvY0xpdGVyYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgcnBjTGl0ZXJhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBycGNFbmNvZGVkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGNvbXB1dGVPcHRpb25zKCk7Ci0KLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLQkgIHJldHVybiBjb250cm9sOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUFwcGxpY2FibGUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICAgIGNvbXB1dGVPcHRpb25zKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlT3B0aW9ucygpCi0gIHsKLQkgIGlmIChnZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpIGluc3RhbmNlb2YgU09BUENvbnRlbnRHZW5lcmF0b3IpIHsKLQkJICBTT0FQQ29udGVudEdlbmVyYXRvciBzb2FwR2VuZXJhdG9yID0gKFNPQVBDb250ZW50R2VuZXJhdG9yKSBnZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpOwotCQkgIGlmIChkb2NMaXRlcmFsLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkgIHNvYXBHZW5lcmF0b3Iuc2V0U3R5bGUoU09BUENvbnRlbnRHZW5lcmF0b3IuU1RZTEVfRE9DVU1FTlQpOwotCQkJICBzb2FwR2VuZXJhdG9yLnNldFVzZShTT0FQQ29udGVudEdlbmVyYXRvci5VU0VfTElURVJBTCk7Ci0JCSAgfQkgIAotCQkgIGVsc2UgaWYgKHJwY0xpdGVyYWwuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCSAgc29hcEdlbmVyYXRvci5zZXRTdHlsZShTT0FQQ29udGVudEdlbmVyYXRvci5TVFlMRV9SUEMpOwotCQkJICBzb2FwR2VuZXJhdG9yLnNldFVzZShTT0FQQ29udGVudEdlbmVyYXRvci5VU0VfTElURVJBTCk7Ci0JCSAgfQotCQkgIGVsc2UgaWYgKHJwY0VuY29kZWQuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCSAgc29hcEdlbmVyYXRvci5zZXRTdHlsZShTT0FQQ29udGVudEdlbmVyYXRvci5TVFlMRV9SUEMpOwotCQkJICBzb2FwR2VuZXJhdG9yLnNldFVzZShTT0FQQ29udGVudEdlbmVyYXRvci5VU0VfRU5DT0RFRCk7Ci0JCSAgfQotCSAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zT25HZW5lcmF0b3IoKSB7Ci0JICBjb21wdXRlT3B0aW9ucygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9XU0RMTmV3RmlsZU9wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTYzNjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC13c2RsMTEvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9XU0RMTmV3RmlsZU9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5WYWxpZGF0ZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuVXBkYXRlTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBVcGRhdGVMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgdGFyZ2V0TmFtZXNwYWNlVGV4dDsKLSAgcHJvdGVjdGVkIFRleHQgcHJlZml4VGV4dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUG9ydE9wRmllbGRCb29sZWFuID0gdHJ1ZTsKLSAgCi0gIHByb3RlY3RlZCBQYWdlQm9vayBwcm90b2NvbFBhZ2VCb29rOwotICBwcm90ZWN0ZWQgQ29tYm8gcHJvdG9jb2xDb21ibzsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBzb2FwUGFnZTsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBodHRwUGFnZTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkb2NMaXRSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNMaXRSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNFbmNSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBodHRwR2V0UmFkaW87Ci0gIHByb3RlY3RlZCBCdXR0b24gaHR0cFBvc3RSYWRpbzsKLSAgcHJvdGVjdGVkIExpbmsgV1NJUHJlZmVyZW5jZUxpbms7Ci0gIAotLy8gIHByaXZhdGUgQmluZGluZ0dlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlLgotICAgKiBAcGFyYW0gcGFnZU5hbWUKLSAgICovCi0gIHB1YmxpYyBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlKFN0cmluZyBwYWdlTmFtZSkKLSAgewotICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2UuCi0gICAqIEBwYXJhbSBwYWdlTmFtZQotICAgKiBAcGFyYW0gdGl0bGUKLSAgICogQHBhcmFtIHRpdGxlSW1hZ2UKLSAgICovCi0gIHB1YmxpYyBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlKFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLCBJbWFnZURlc2NyaXB0b3IgdGl0bGVJbWFnZSkKLSAgewotICAgIHN1cGVyKHBhZ2VOYW1lLCB0aXRsZSwgdGl0bGVJbWFnZSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuX1VJX0RFU0NSSVBUSU9OX05FV19XU0RMX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoYmFzZSwgTWVzc2FnZXMuX1VJX0hFTFApOyAvLyROT04tTkxTLTEkCi0gICAgYmFzZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAvLyAgR3JvdXAgd3NkbEdyb3VwID0gVmlld1V0aWxpdHkuY3JlYXRlR3JvdXAoYmFzZSwgMiwgIldTREwiLCBmYWxzZSk7Ci0gICAgQ29tcG9zaXRlIHdzZGxHcm91cCA9IG5ldyBDb21wb3NpdGUoYmFzZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgd3NkbEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgd3NkbEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpd3NkbEdyb3VwLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQotICAgIExhYmVsIHRhcmdldE5hbWVzcGFjZSA9IG5ldyBMYWJlbCh3c2RsR3JvdXAsIFNXVC5MRUZUKTsKLSAgICB0YXJnZXROYW1lc3BhY2Uuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSk7IC8vJE5PTi1OTFMtMSQKLSAgICBHcmlkRGF0YSBuc0RhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBuc0RhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlLnNldExheW91dERhdGEobnNEYXRhKTsKLSAgICAKLSAgICB0YXJnZXROYW1lc3BhY2VUZXh0ID0gbmV3IFRleHQod3NkbEdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgdGV4dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICB0ZXh0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0ZXh0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICB0ZXh0RGF0YS53aWR0aEhpbnQgPSAxMDsKLSAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEodGV4dERhdGEpOwotICAgIAotICAgIHRhcmdldE5hbWVzcGFjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YXJnZXROYW1lc3BhY2VUZXh0LCBBU0RFZGl0b3JDU0hlbHBJZHMuV1NETF9XSVpBUkRfT1BUSU9OU19QQUdFX1ROU19URVhUKTsKLQotICAgIExhYmVsIHByZWZpeCA9IG5ldyBMYWJlbCh3c2RsR3JvdXAsIFNXVC5MRUZUKTsKLSAgICBwcmVmaXguc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfUFJFRklYX1dJVEhfQ09MT04pOyAvLyROT04tTkxTLTEkXAotCi0gICAgR3JpZERhdGEgcHJlZml4RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIHByZWZpeERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgcHJlZml4LnNldExheW91dERhdGEocHJlZml4RGF0YSk7Ci0gICAgCi0gICAgcHJlZml4VGV4dCA9IG5ldyBUZXh0KHdzZGxHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIHByZWZpeFRleHREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgcHJlZml4VGV4dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgcHJlZml4VGV4dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgcHJlZml4VGV4dERhdGEud2lkdGhIaW50ID0gMTA7Ci0gICAgcHJlZml4VGV4dC5zZXRMYXlvdXREYXRhKHByZWZpeFRleHREYXRhKTsKLQotICAgIHByZWZpeFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcmVmaXhUZXh0LCBBU0RFZGl0b3JDU0hlbHBJZHMuV1NETF9XSVpBUkRfT1BUSU9OU19QQUdFX1BSRUZJWF9URVhUKTsKLSAgICAKLSAgICAvLyAgICBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSBYTUxDYXRhbG9nUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5sb29rdXBPckNyZWF0ZVhNTENhdGFsb2coImRlZmF1bHQiKTsKLSAgICAvLyAgICBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBjYXRhbG9nID0gbmV3IFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKGJhc2UsIHhtbENhdGFsb2cpOwotCi0vLyAgRGV0ZXJtaW5lIGlmIHRoZSB1c2VyIHdpc2hlcyB0byBjcmVhdGUgYSBza2VsZXRvbiBXU0RMLiAgSWYgeWVzLCBwcmVzZW50IHRoZSB1c2VyIHdpdGggaW5wdXQgZmllbGRzLgotICAgIGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGJhc2UsIFNXVC5DSEVDSyk7Ci0gICAgY3JlYXRlU2tlbGV0b25DaGVja0JveC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9DUkVBVEVfV1NETF9TS0VMRVRPTik7IC8vJE5PTi1OTFMtMSQKLSAgICBjcmVhdGVTa2VsZXRvbkNoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3gsIEFTREVkaXRvckNTSGVscElkcy5XU0RMX1dJWkFSRF9PUFRJT05TX1BBR0VfQ1JFQVRFX1NLRUxFVE9OX0NIRUNLQk9YKTsKLSAgICAKLSAgICB3c2RsU2tlbGV0b25Hcm91cCA9IG5ldyBDb21wb3NpdGUoYmFzZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0MiA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Mi5udW1Db2x1bW5zID0gMjsKLSAgICB3c2RsU2tlbGV0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0Mik7Ci0KLSAgICBHcmlkRGF0YSBkYXRhMiA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEyLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB3c2RsU2tlbGV0b25Hcm91cC5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQotICAgY3JlYXRlTGFiZWwod3NkbFNrZWxldG9uR3JvdXAsIE1lc3NhZ2VzLl9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MKTsgLy8kTk9OLU5MUy0xJAotICAgcHJvdG9jb2xDb21ibyA9IG5ldyBDb21ibyh3c2RsU2tlbGV0b25Hcm91cCwgU1dULlJFQURfT05MWSk7Ci0gICBHcmlkRGF0YSBkYXRhQyA9IG5ldyBHcmlkRGF0YSgpOwotICAgZGF0YUMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBkYXRhQy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgIHByb3RvY29sQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhQyk7Ci0gICBwcm90b2NvbENvbWJvLmFkZChTT0FQX1BST1RPQ09MKTsKLSAgIHByb3RvY29sQ29tYm8uYWRkKEhUVFBfUFJPVE9DT0wpOwotICAgcHJvdG9jb2xDb21iby5zZWxlY3QoMCk7Ci0gICBwcm90b2NvbENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm90b2NvbENvbWJvLCBBU0RFZGl0b3JDU0hlbHBJZHMuV1NETF9XSVpBUkRfT1BUSU9OU19QQUdFX1BST1RPQ09MX0NPTUJPKTsKLQotICAgc2VwTGFiZWwgPSBuZXcgTGFiZWwoYmFzZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgIEdyaWREYXRhIHNlcERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgIHNlcERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBzZXBEYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgc2VwTGFiZWwuc2V0TGF5b3V0RGF0YShzZXBEYXRhKTsKLSAgIAotICAgCi0gICAvLyBDcmVhdGUgUGFnZUJvb2sgYW5kIHBhZ2VzL2NvbnRyb2xzIGZvciB0aGUgUGFnZUJvb2sKLSAgIHByb3RvY29sUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soYmFzZSwgU1dULk5PTkUpOwotCi0gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFNvYXAgUGFnZQotICAgc29hcFBhZ2UgPSBuZXcgQ29tcG9zaXRlKHByb3RvY29sUGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgIEdyaWRMYXlvdXQgcGJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgc29hcFBhZ2Uuc2V0TGF5b3V0KHBiTGF5b3V0KTsKLQotICAgR3JpZERhdGEgcGJEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICBwYkRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgcGJEYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgc29hcFBhZ2Uuc2V0TGF5b3V0RGF0YShwYkRhdGEpOwotCi0gICBjcmVhdGVMYWJlbChzb2FwUGFnZSwgTWVzc2FnZXMuX1VJX0xBQkVMX1NPQVBfQklORElOR19PUFRJT05TKTsgLy8kTk9OLU5MUy0xJAotICAgZG9jTGl0UmFkaW8gPSBuZXcgQnV0dG9uKHNvYXBQYWdlLCBTV1QuUkFESU8pOwotICAgcnBjTGl0UmFkaW8gPSBuZXcgQnV0dG9uKHNvYXBQYWdlLCBTV1QuUkFESU8pOwotICAgcnBjRW5jUmFkaW8gPSBuZXcgQnV0dG9uKHNvYXBQYWdlLCBTV1QuUkFESU8pOwotICAgZG9jTGl0UmFkaW8uc2V0VGV4dChTT0FQX0RPQ1VNRU5UX0xJVEVSQUwpOwotICAgcnBjTGl0UmFkaW8uc2V0VGV4dChTT0FQX1JQQ19MSVRFUkFMKTsKLSAgIHJwY0VuY1JhZGlvLnNldFRleHQoU09BUF9SUENfRU5DT0RFRCk7Ci0gICBkb2NMaXRSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRvY0xpdFJhZGlvLCBBU0RFZGl0b3JDU0hlbHBJZHMuRE9DX0xJVF9SQURJTyk7Ci0gICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJwY0xpdFJhZGlvLCBBU0RFZGl0b3JDU0hlbHBJZHMuUlBDX0xJVF9SQURJTyk7Ci0gICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJwY0VuY1JhZGlvLCBBU0RFZGl0b3JDU0hlbHBJZHMuUlBDX0VOQ09ERURfUkFESU8pOwotICAgCi0gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEh0dHAgUGFnZQotICAgaHR0cFBhZ2UgPSBuZXcgQ29tcG9zaXRlKHByb3RvY29sUGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgIHBiTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgIGh0dHBQYWdlLnNldExheW91dChwYkxheW91dCk7Ci0KLSAgIHBiRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgcGJEYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIHBiRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIGh0dHBQYWdlLnNldExheW91dERhdGEocGJEYXRhKTsKLSAgIAotICAgY3JlYXRlTGFiZWwoaHR0cFBhZ2UsIE1lc3NhZ2VzLl9VSV9MQUJFTF9IVFRQX0JJTkRJTkdfT1BUSU9OUyk7IC8vIEFscmVhZHkgRXh0ZXJuYWxpemVkIC8vJE5PTi1OTFMtMSQKLSAgIGh0dHBHZXRSYWRpbyA9IG5ldyBCdXR0b24oaHR0cFBhZ2UsIFNXVC5SQURJTyk7Ci0gICBodHRwUG9zdFJhZGlvID0gbmV3IEJ1dHRvbihodHRwUGFnZSwgU1dULlJBRElPKTsKLSAgIGh0dHBHZXRSYWRpby5zZXRUZXh0KEhUVFBfR0VUKTsKLSAgIGh0dHBQb3N0UmFkaW8uc2V0VGV4dChIVFRQX1BPU1QpOwotICAgaHR0cEdldFJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoaHR0cEdldFJhZGlvLCBBU0RFZGl0b3JDU0hlbHBJZHMuSFRUUF9HRVRfUkFESU8pOwotICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChodHRwUG9zdFJhZGlvLCBBU0RFZGl0b3JDU0hlbHBJZHMuSFRUUF9QT1NUX1JBRElPKTsKLSAgIAotICAgd3NkbFNrZWxldG9uR3JvdXAuc2V0VmlzaWJsZSh0cnVlKTsKLSAgIHNlcExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0gICBwcm90b2NvbFBhZ2VCb29rLnNob3dQYWdlKHNvYXBQYWdlKTsKLSAgIHByb3RvY29sUGFnZUJvb2suc2V0VmlzaWJsZSh0cnVlKTsKLSAgIAotICAgV1NJUHJlZmVyZW5jZUxpbmsgPSBuZXcgTGluayhiYXNlLCBTV1QuTk9ORSk7Ci0gICBXU0lQcmVmZXJlbmNlTGluay5zZXRUZXh0KCI8QT4iICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJfV1NJX0NPTVBMSUFOQ0VfTElOS19URVhUIikgKyAiPC9BPiIpOwotICAgV1NJUHJlZmVyZW5jZUxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWdldE5ld1dTRExXaXphcmQoKS5vcGVuUHJvamVjdFdTSVByb3BlcnRpZXMoKTsKLQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJfQotCX0pOwotICAgCi0gICBXU0lQcmVmZXJlbmNlTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKSk7Ci0gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBBZGQgU2VsZWN0aW9uIExpc3RlbmVycwotICAgY3JlYXRlU2tlbGV0b25DaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgIAotCi0gICBycGNFbmNSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgIAotICAgCi0vLyAgIEJpbmRpbmdQcm90b2NvbENvbXBvbmVudENvbnRyb2wgY29tcG9uZW50ID0gbmV3IEJpbmRpbmdQcm90b2NvbENvbXBvbmVudENvbnRyb2woYmFzZSwgZ2VuZXJhdG9yLCBmYWxzZSk7Ci0vLyAgIGNvbXBvbmVudC5pbml0RmllbGRzKCk7Ci0gICAKLSAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYmFzZSwgQVNERWRpdG9yQ1NIZWxwSWRzLldTRExfV0laQVJEX09QVElPTlNfUEFHRSk7Ci0KLSAgICBzZXRDb250cm9sKGJhc2UpOwotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBOZXdXU0RMV2l6YXJkIGdldE5ld1dTRExXaXphcmQoKQotICB7Ci0gICAgcmV0dXJuIChOZXdXU0RMV2l6YXJkKWdldFdpemFyZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZURlZmF1bHREZWZpbml0aW9uTmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9ICJEZWZhdWx0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBJUGF0aCBwYXRoID0gZ2V0TmV3V1NETFdpemFyZCgpLmdldE5ld0ZpbGVQYXRoKCk7Ci0gICAgaWYgKHBhdGggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVEZWZhdWx0TmFtZXNwYWNlTmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhNZXNzYWdlcy5fVUlfUFJFRl9QQUdFX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoIW5hbWVzcGFjZS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAJbmFtZXNwYWNlID0gbmFtZXNwYWNlLmNvbmNhdCgiLyIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIElQYXRoIHBhdGggPSBnZXROZXdXU0RMV2l6YXJkKCkuZ2V0TmV3RmlsZVBhdGgoKTsKLSAgICBpZiAocGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSArPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS50b1N0cmluZygpICsgIi8iOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgewotICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLSAgICBpZiAodmlzaWJsZSkKLSAgICB7Ci0gICAgICAvLyBwcmltZSB0aGUgZmllbGRzICAgIAotICAgICAgdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KGNvbXB1dGVEZWZhdWx0TmFtZXNwYWNlTmFtZSgpKTsKLSAgICAgIHByZWZpeFRleHQuc2V0VGV4dCgidG5zIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gcHJlZml4VGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZWZpbml0aW9uTmFtZSgpCi0gIHsKLSAgCXJldHVybiBjb21wdXRlRGVmYXVsdERlZmluaXRpb25OYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIHsKLQotICAgIGlmIChlLndpZGdldCA9PSB0YXJnZXROYW1lc3BhY2VUZXh0KQotICAgIHsKLSAgICAgIHN0YXJ0RGVsYXllZEV2ZW50KGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBwcmVmaXhUZXh0KQotICAgIHsKLSAgICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgICB9Ci0JZWxzZSBpZiAoZS53aWRnZXQgPT0gcHJvdG9jb2xDb21ibykgewotCQkvLyBVcGRhdGUgd2hhdCBwYWdlL2NvbnRyb2wgd2Ugc2hvdyBpbiB0aGUgUGFnZUJvb2sKLQkJaWYgKHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiU09BUCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3RvY29sUGFnZUJvb2suc2hvd1BhZ2Uoc29hcFBhZ2UpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiSFRUUCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3RvY29sUGFnZUJvb2suc2hvd1BhZ2UoaHR0cFBhZ2UpOwotCQl9Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1cGRhdGVPY2N1cmVkKE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikKLSAgewotICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIGJvb2xlYW4gcmVhZHkgPSB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0KLSAgICAvL3RoaXMuc2V0TWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIl9VSV9ERVNDUklQVElPTl9ORVdfV1NETF9GSUxFIiksdGhpcy5OT05FKTsgIC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIHNvIHRoYXQgdGhlIHBhZ2UgZG9lc24ndCBpbW1lZGlhdGVseSBzaG93IHVwIHdpdGggYW4gZXJyb3IKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBpZiAocmVhZHkpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIXZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpKSkKLSAgICB7Ci0gICAgICByZWFkeSA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoY3JlYXRlU2tlbGV0b25DaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgewotCi0gICAgICAgIGlmICghdmFsaWRhdGVXU0lDb21wbGlhbmNlKCkpIHsKLSAgICAgICAgCQotICAgICAgICAJcmVhZHkgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJdGhpcy5zZXRNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiX1VJX0RFU0NSSVBUSU9OX05FV19XU0RMX0ZJTEUiKSx0aGlzLk5PTkUpOyAgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAKLSAgICByZXR1cm4gcmVhZHk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVdTSUNvbXBsaWFuY2UoKSB7Ci0JICBTdHJpbmcgV1NJQ29tcGxpYW5jZSA9IGdldE5ld1dTRExXaXphcmQoKS5nZXRXU0lQcmVmZXJlbmNlcygpOwotICAKLQkgIGlmICghKHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiU09BUCIpKSkgewotCQkgIGlmIChXU0lDb21wbGlhbmNlLmVxdWFscyhQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kpKSB7Ci0JCQkgIHRoaXMuc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX1dTSV9DT01QTElBTkNFX1NPQVBfUFJPVE9DT0wiKSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJICB9IGVsc2UgaWYgKFdTSUNvbXBsaWFuY2UuZXF1YWxzKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSSkpIHsKLQkJCSAgdGhpcy5zZXRNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiX1dBUk5fV1NJX0NPTVBMSUFOQ0VfU09BUF9QUk9UT0NPTCIpLCB0aGlzLldBUk5JTkcpOwotCQkJICByZXR1cm4gdHJ1ZTsKLQkJICB9Ci0JICB9IGVsc2UgaWYgKHJwY0VuY1JhZGlvLmdldFNlbGVjdGlvbigpKSB7Ci0JCSAgaWYgKFdTSUNvbXBsaWFuY2UuZXF1YWxzKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSSkpIHsKLQkJCSAgdGhpcy5zZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfV1NJX0NPTVBMSUFOQ0VfUlBDX0VOQ09ESU5HIikpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCSAgfSBlbHNlIGlmIChXU0lDb21wbGlhbmNlLmVxdWFscyhQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kpKSB7Ci0JCQkgIHRoaXMuc2V0TWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIl9XQVJOX1dTSV9DT01QTElBTkNFX1JQQ19FTkNPRElORyIpLCB0aGlzLldBUk5JTkcpOwotCQkJICByZXR1cm4gdHJ1ZTsKLQkJICB9Ci0JICB9IGVsc2UgewotCQkgIHRoaXMuc2V0TWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIl9VSV9ERVNDUklQVElPTl9ORVdfV1NETF9GSUxFIiksdGhpcy5OT05FKTsgIC8vJE5PTi1OTFMtMSQKLQkgIH0KLQotCSAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gVmFsaWRhdGVIZWxwZXIuY2hlY2tYTUxQcmVmaXgocHJlZml4KTsKLQotICAgIGlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBlcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVYTUxOYW1lKFN0cmluZyB4bWxOYW1lKQotICB7Ci0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MTmFtZSh4bWxOYW1lKTsKLQotICAgIGlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBlcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5zKQotICB7Ci0gICAgYm9vbGVhbiB0ZXN0ID0gdHJ1ZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgCW5ldyBVUkkobnMpOwotLy8gICAgICBVUkkgdGVzdFVSSSA9IG5ldyBVUkkobnMpOwotICAgICAgLy8gICAgICBpZiAoIXRlc3RVUkkuaXNHZW5lcmljVVJJKCkpCi0gICAgICAvLyAgICAgIHsKLSAgICAgIC8vICAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9OQU1FU1BBQ0VfSU5WQUxJRCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gICAgICAgIHRlc3QgPSBmYWxzZTsKLSAgICAgIC8vICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gVmFsaWRhdGVIZWxwZXIuY2hlY2tYTUxOYW1lKG5zKTsKLSAgICAgIC8vCQkJaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotICAgICAgLy8JCQl7Ci0gICAgICAvLwkJCQl0ZXN0ID0gdHJ1ZTsKLSAgICAgIC8vCQkJfQotICAgICAgLy8JCQllbHNlCi0gICAgICAvLwkJCXsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fVUlfRVJST1JfTkFNRVNQQUNFX0lOVkFMSUQpOyAvLyROT04tTkxTLTEkCi0gICAgICB0ZXN0ID0gZmFsc2U7Ci0gICAgICAvLwkJCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGVzdDsKLSAgfQotCi0gIC8qCi0gIHByaXZhdGUgYm9vbGVhbiBhcmVQcmVmaXhlc1VuaXF1ZUFuZFZhbGlkKCkKLSAgewotICAgIGphdmEudXRpbC5MaXN0IGluZm9MaXN0ID0gbmFtZXNwYWNlSW5mby5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotICAgIGphdmEudXRpbC5MaXN0IGNoZWNrZWRMaXN0ID0gbmFtZXNwYWNlSW5mby5nZXROYW1lc3BhY2VDaGVja2VkTGlzdCgpOwotCi0gICAgVmVjdG9yIHByZWZpeExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgYm9vbGVhbiB0ZXN0ID0gdHJ1ZTsKLSAgICBib29sZWFuIGlzT25lQmxhbmsgPSBmYWxzZTsKLQotICAgIFN0cmluZyBjdXJyZW50UHJlZml4ID0gcHJlZml4VGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgIGlmIChjdXJyZW50UHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgaXNPbmVCbGFuayA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdGVQcmVmaXgoY3VycmVudFByZWZpeCkpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeExpc3QuYWRkKGN1cnJlbnRQcmVmaXgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfUFJFRklYX0lTX0lOVkFMSUQiLCBjdXJyZW50UHJlZml4KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mb0xpc3Quc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paW5mb0xpc3QuZ2V0KGkpOwotICAgICAgaWYgKCgoU3RyaW5nKWNoZWNrZWRMaXN0LmdldChpKSkuZXF1YWxzKCJ0cnVlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGFQcmVmaXggPSBpbmZvLnByZWZpeC50cmltKCk7Ci0gICAgICAgIGlmIChhUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghcHJlZml4TGlzdC5jb250YWlucyhhUHJlZml4KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsaWRhdGVQcmVmaXgoYVByZWZpeCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByZWZpeExpc3QuYWRkKGFQcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfUFJFRklYX0lTX0lOVkFMSUQiLCBpbmZvLnByZWZpeCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHRlc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfUFJFRklYX0lTX0FfRFVQTElDQVRFIiwgaW5mby5wcmVmaXgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdGVzdCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNPbmVCbGFuaykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc09uZUJsYW5rID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9NT1JFX1RIQU5fT05FX1BSRUZJWF9JU19CTEFOSyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdGVzdCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0ZXN0OwotICB9Ci0gICovCi0KLSAgcHJvdGVjdGVkIERlbGF5ZWRFdmVudCBkZWxheWVkVGFzazsKLSAgcHJvdGVjdGVkIHZvaWQgc3RhcnREZWxheWVkRXZlbnQoTW9kaWZ5RXZlbnQgZSkKLSAgewotICAgIGlmIChkZWxheWVkVGFzayA9PSBudWxsIHx8IGRlbGF5ZWRUYXNrLmdldEV2ZW50KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCwgZGVsYXllZFRhc2spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTW9kaWZ5RXZlbnQgZGVsYXllZEV2ZW50ID0gZGVsYXllZFRhc2suZ2V0RXZlbnQoKTsKLQotICAgICAgaWYgKGUud2lkZ2V0ID09IGRlbGF5ZWRFdmVudC53aWRnZXQpCi0gICAgICB7Ci0gICAgICAgIC8vIHNhbWUgZXZlbnQsIGp1c3QgZGlmZmVyZW50IGRhdGEsIGRlbGF5IG5ldyBldmVudAotICAgICAgICBkZWxheWVkVGFzay5zZXRFdmVudChudWxsKTsKLSAgICAgIH0KLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUKLSAgewotICAgIHByb3RlY3RlZCBNb2RpZnlFdmVudCBldmVudDsKLQotICAgIC8qCi0gICAgICogQHNlZSBSdW5uYWJsZSNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgaWYgKGV2ZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgICAgICAgZXZlbnQgPSBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNb2RpZnlFdmVudCBnZXRFdmVudCgpCi0gICAgewotICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50KE1vZGlmeUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gIAkgaWYgKGUud2lkZ2V0ID09IHJwY0VuY1JhZGlvKSB7Ci0gIAkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotICAJIH0KLQkgIAotCSAgaWYgKGUud2lkZ2V0ID09IGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3gpIHsKLSAgCSAJaWYgKGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCSAJCXdzZGxTa2VsZXRvbkdyb3VwLnNldFZpc2libGUodHJ1ZSk7Ci0gIAkgCQlzZXBMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotICAJIAkJcHJvdG9jb2xQYWdlQm9vay5zZXRWaXNpYmxlKHRydWUpOwotICAJIAl9Ci0gIAkgCWVsc2UgewotICAJIAkJd3NkbFNrZWxldG9uR3JvdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci0gIAkgCQlzZXBMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgCSAJCXByb3RvY29sUGFnZUJvb2suc2V0VmlzaWJsZShmYWxzZSk7Ci0gIAkgCX0KLSAgCSAJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotICAJIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUFJPVE9DT0wgPSAiU09BUCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiSFRUUCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUlBDX0VOQ09ERUQgPSBNZXNzYWdlcy5fVUlfUkFESU9fUlBDX0VOQ09ERUQ7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUlBDX0xJVEVSQUwgPSBNZXNzYWdlcy5fVUlfUkFESU9fUlBDX0xJVEVSQUw7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRE9DVU1FTlRfTElURVJBTCA9IE1lc3NhZ2VzLl9VSV9SQURJT19ET0NVTUVOVF9MSVRFUkFMOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BPU1QgPSAiSFRUUCBQT1NUIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9HRVQgPSAiSFRUUCBHRVQiOyAvLyROT04tTkxTLTEkCi0KLSAgQ29tcG9zaXRlIHdzZGxTa2VsZXRvbkdyb3VwOwotICBCdXR0b24gY3JlYXRlU2tlbGV0b25DaGVja0JveDsKLSAgCi0gIExhYmVsIHNlcExhYmVsOwotICAKLSAgcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsU3RyaW5nKSB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQobGFiZWxTdHJpbmcpOwotICAgIEdyaWREYXRhIG5zRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIG5zRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5zRGF0YSk7Ci0gICAgCi0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0gIAotICBwdWJsaWMgVmVjdG9yIGdldE5hbWVzcGFjZUluZm8oKSB7Ci0JCVZlY3RvciBuYW1lc3BhY2VzID0gbmV3IFZlY3RvcigpOwotICAJCQotICAJCS8vIEFkZCBEZWZhdWx0IE5hbWVzcGFjZXMKLQkJTmFtZXNwYWNlSW5mbyBpbmZvMSA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCWluZm8xLnByZWZpeCA9ICJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotCQlpbmZvMS51cmkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOyAvLyROT04tTkxTLTEkCi0JCW5hbWVzcGFjZXMuYWRkRWxlbWVudChpbmZvMSk7Ci0JCQotCQlOYW1lc3BhY2VJbmZvIGluZm84ID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJaW5mbzgucHJlZml4ID0gInhzZCI7IC8vJE5PTi1OTFMtMSQKLQkJaW5mbzgudXJpID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCQluYW1lc3BhY2VzLmFkZEVsZW1lbnQoaW5mbzgpOwotCi0JCXJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDcmVhdGVTa2VsZXRvbkJvb2xlYW4oKSB7Ci0gIAlyZXR1cm4gY3JlYXRlU2tlbGV0b25DaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLSAgCXJldHVybiBwcm90b2NvbENvbWJvLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHVibGljIE9iamVjdFtdIGdldFByb3RvY29sT3B0aW9ucygpIHsKLSAgCU9iamVjdCBib29sW10gPSBuZXcgQm9vbGVhblszXTsKLSAgCWlmIChwcm90b2NvbENvbWJvLmdldFRleHQoKS5lcXVhbHMoU09BUF9QUk9UT0NPTCkpIHsKLSAgCQlpZiAoZG9jTGl0UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCQkJYm9vbFswXSA9IG5ldyBCb29sZWFuKHRydWUpOwotICAJCX0KLSAgCQllbHNlIHsKLSAgCQkJYm9vbFswXSA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgCQl9Ci0gIAkJCi0gIAkJaWYgKHJwY0xpdFJhZGlvLmdldFNlbGVjdGlvbigpKSB7Ci0gIAkJCWJvb2xbMl0gPSBuZXcgQm9vbGVhbih0cnVlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJCWJvb2xbMl0gPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0gIAkJfQotICAJfQotICAJZWxzZSBpZiAocHJvdG9jb2xDb21iby5nZXRUZXh0KCkuZXF1YWxzKEhUVFBfUFJPVE9DT0wpKXsKLSAgCQlpZiAoaHR0cEdldFJhZGlvLmdldFNlbGVjdGlvbigpKSB7Ci0gIAkJCWJvb2xbMF0gPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCQlib29sWzBdID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gYm9vbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTb2FwRG9jTGl0ZXJhbFByb3RvY29sKCkgewotICAJaWYgKGdldFByb3RvY29sKCkuZXF1YWxzKFNPQVBfUFJPVE9DT0wpICYmIGRvY0xpdFJhZGlvLmdldFNlbGVjdGlvbigpKSB7Ci0gIAkJcmV0dXJuIHRydWU7Ci0gIAl9Ci0gIAllbHNlIHsKLSAgCQlyZXR1cm4gZmFsc2U7Ci0gIAl9Ci0gIH0KLSAgfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNWZiMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1dTRExOZXdGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdTRExOZXdGaWxlUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UKLXsKLSAgcHVibGljIFdTRExOZXdGaWxlUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIAotICB7Ci0gICAgc3VwZXIoTWVzc2FnZXMuX1VJX1RJVExFX05FV19XU0RMX0ZJTEUsIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRUaXRsZShNZXNzYWdlcy5fVUlfVElUTEVfTkVXX1dTRExfRklMRSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5fVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IGNvbnRhaW5lciBhbmQgbmFtZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgdGhpcy5zZXRGaWxlTmFtZShjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkpOwotCi0gICAgc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkKLSAgewotICAgIFBhdGggbmV3TmFtZSA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpOwotICAgIFN0cmluZyBmdWxsRmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotICAgIFN0cmluZyBleHRlbnNpb24gPSBuZXdOYW1lLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwgfHwgIWV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ3c2RsIikpICAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLl9VSV9FUlJPUl9GSUxFX01VU1RfRU5EX1dJVEhfV1NETCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGZpbGUgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUKLSAgICBTdHJpbmcgc2FtZU5hbWUgPSBleGlzdHNGaWxlQW55Q2FzZShmdWxsRmlsZU5hbWUpOwotICAgIGlmIChzYW1lTmFtZSAhPSBudWxsKSAKLSAgICB7Ci0vLyAgICAgICBTdHJpbmcgcXVhbGlmaWVkRmlsZU5hbWUgPSBnZXRDb250YWluZXJGdWxsUGF0aCgpLnRvU3RyaW5nKCkgKyAnLycgKyBmdWxsRmlsZU5hbWU7Ci0gICAgICAgc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLl9VSV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTLCBzYW1lTmFtZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIAotICAgIHJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdE5hbWUgPSAiTmV3V1NETEZpbGUiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLndzZGwiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zID0geyAiKi53c2RsIn07IC8vJE5PTi1OTFMtMSQKLQotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIFN0cmluZyBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0gICAgSVBhdGggY29udGFpbmVyRnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgIGlmIChjb250YWluZXJGdWxsUGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdoaWxlICh0cnVlKQotICAgICAgewotICAgICAgICBJUGF0aCBwYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLSAgICAgICAgLy8gaWYgKFdvcmtiZW5jaFV0aWxpdHkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmV4aXN0cyhwYXRoKSkKLSAgICAgICAgaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKHBhdGgpKQotICAgICAgICB7Ci0gICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgY291bnQgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmlsZU5hbWU7Ci0gIH0KLQotICAvLyByZXR1cm5zIHRydWUgaWYgZmlsZSBvZiBzcGVjaWZpZWQgbmFtZSBleGlzdHMgaW4gYW55IGNhc2UgZm9yIHNlbGVjdGVkIGNvbnRhaW5lcgotICBwcm90ZWN0ZWQgU3RyaW5nIGV4aXN0c0ZpbGVBbnlDYXNlKFN0cmluZyBmaWxlTmFtZSkKLSAgewotICAgIGlmICggKGdldENvbnRhaW5lckZ1bGxQYXRoKCkgIT0gbnVsbCkgJiYgKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuaXNFbXB0eSgpID09IGZhbHNlKQotICAgICAgICAgICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgLy9sb29rIHRocm91Z2ggYWxsIHJlc291cmNlcyBhdCB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciAtIGNvbXBhcmUgaW4gdXBwZXIgY2FzZQotICAgICAgSVJlc291cmNlIHBhcmVudCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihnZXRDb250YWluZXJGdWxsUGF0aCgpKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgewotICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBwYXJlbnQ7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0gICAgICAgICAgU3RyaW5nIGVudGVyZWRGaWxlVXBwZXIgPSBmaWxlTmFtZS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtZW1iZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVVwcGVyTmFtZSA9IG1lbWJlcnNbaV0uZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VVcHBlck5hbWUuZXF1YWxzKGVudGVyZWRGaWxlVXBwZXIpKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIHJldHVybiBtZW1iZXJzW2ldLmdldE5hbWUoKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkLXdzZGwxMS9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljMzQ2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qtd3NkbDExL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbnMuSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoT2JqZWN0IHBhcmVudE1vZGVsT2JqZWN0LCBFbGVtZW50W10gZWxlbWVudENoYWluLCBpbnQgc3RhcnQsIGludFtdIGVuZCkKLSAgeyAgIAotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChwYXJlbnRNb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KXBhcmVudE1vZGVsT2JqZWN0OwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gZWxlbWVudENoYWluW2VsZW1lbnRDaGFpbi5sZW5ndGggLSAxXTsKLSAgICAgICAgcmVzdWx0ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQodGFyZ2V0RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudE1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQ2F0ZWdvcnlBZGFwdGVyKXBhcmVudE1vZGVsT2JqZWN0KS5nZXRYU0RTY2hlbWEoKTsKLSAgICB9Ci0vLyAgICBlbHNlIGlmIChwYXJlbnRNb2RlbE9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5KQotLy8gICAgewotLy8gICAgICByZXN1bHQgPSAoKENhdGVnb3J5KXBhcmVudE1vZGVsT2JqZWN0KS5nZXRYU0RTY2hlbWEoKTsKLS8vICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKE9iamVjdCBtb2RlbE9iamVjdCkKLSAgeyAgICAgICAgCi0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW1vZGVsT2JqZWN0OwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBub2RlID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9ICAgICAgICAKLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIG5vZGUgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgIHsKLSAgICAgIG5vZGUgPSAoKENhdGVnb3J5QWRhcHRlciltb2RlbE9iamVjdCkuZ2V0WFNEU2NoZW1hKCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLS8vICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnkpCi0vLyAgICB7Ci0vLyAgICAgIG5vZGUgPSAoKENhdGVnb3J5KW1vZGVsT2JqZWN0KS5nZXRYU0RTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0vLyAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5vZGU7Ci0gIH0gICAgICAKLX0gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL0FTREVkaXRvckNTSGVscElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9BU0RFZGl0b3JDU0hlbHBJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0MThjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL0FTREVkaXRvckNTSGVscElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Q7Ci0KLXB1YmxpYyBjbGFzcyBBU0RFZGl0b3JDU0hlbHBJZHMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS4iOwotCQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5ldyBXU0RMIFdpemFyZCAtIE9wdGlvbnMgcGFnZToKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1dJWkFSRF9PUFRJT05TX1BBR0VfVE5TX1RFWFQgPSBwbHVnaW5JZCArICJ3c2RsdTAwMDAiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfV0laQVJEX09QVElPTlNfUEFHRV9QUkVGSVhfVEVYVCA9IHBsdWdpbklkICsgIndzZGx1MDAwMSI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9XSVpBUkRfT1BUSU9OU19QQUdFX0NSRUFURV9TS0VMRVRPTl9DSEVDS0JPWCA9IHBsdWdpbklkICsgIndzZGx1MDAwMiI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9XSVpBUkRfT1BUSU9OU19QQUdFX1BST1RPQ09MX0NPTUJPID0gcGx1Z2luSWQgKyAid3NkbHUwMDAzIjsKLQotLy8JU29hcCBCaW5kaW5nIE9wdGlvbnMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfTElUX1JBRElPID0gcGx1Z2luSWQgKyAid3NkbHUwMDEwIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSUENfTElUX1JBRElPID0gcGx1Z2luSWQgKyAid3NkbHUwMDExIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSUENfRU5DT0RFRF9SQURJTyA9IHBsdWdpbklkICsgIndzZGx1MDAxMiI7Ci0KLS8vCUhUVFAgQmluZGluZyBPcHRpb25zCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9HRVRfUkFESU8gPSBwbHVnaW5JZCArICJ3c2RsdTAwMTMiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUVFBfUE9TVF9SQURJTyA9IHBsdWdpbklkICsgIndzZGx1MDAxNCI7Ci0KLQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVdTREwgRWRpdG9yIC0gRGVzaWduIFZpZXcKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX0RFU0lHTl9WSUVXX1NFUlZJQ0VfT0JKRUNUID0gcGx1Z2luSWQgKyAid3NkbHUwMDIwIjsgICAvLyAgU2VydmljZSBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gd3NkbHUwMDIwCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9ERVNJR05fVklFV19CSU5ESU5HX09CSkVDVCA9IHBsdWdpbklkICsgIndzZGx1MDAyMSI7ICAgLy8gIEJpbmRpbmcgT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IHdzZGx1MDAyMQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfREVTSUdOX1ZJRVdfUE9SVFRZUEVfT0JKRUNUID0gcGx1Z2luSWQgKyAid3NkbHUwMDIyIjsgICAvLyAgUG9ydFR5cGUgT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gd3NkbHUwMDIyCi0KLQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVdTREwgRWRpdG9yIC0gT3V0bGluZSBWaWV3Ci0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9PVVRMSU5FX1ZJRVdfR1JPVVAgPSBwbHVnaW5JZCArICJ3c2RsdTAwMjMiOyAgIC8vICBJbXBvcnRzLCBUeXBlcywgU2VydmljZXMsIEJpbmRpbmdzLCBQb3J0IFR5cGVzLCBNZXNzYWdlcyAoZ3JvdXBlZCB0b2dldGhlcikgICAgICAgICAgICAgLS0+IHdzZGx1MDAyMwotCi0KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlXU0RMIEVkaXRvciAtIFBvcnQgV2l6YXJkCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUE9SVF9XSVpBUkQgPSBwbHVnaW5JZCArICJ3c2RsdTAwMzAiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBPUlRfV0laQVJEX05BTUVfVEVYVCA9IHBsdWdpbklkICsgIndzZGx1MDAzMSI7ICAgLy8gIG5vdCB1c2VkIC0gZHVwIGJlbG93Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUE9SVF9XSVpBUkRfQklORElOR19DT01CTyA9IHBsdWdpbklkICsgIndzZGx1MDAzMiI7ICAgLy8gIG5vdCB1c2VkIC0gZHVwIGJlbG93Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUE9SVF9XSVpBUkRfUFJPVE9DT0xfQ09NQk8gPSBwbHVnaW5JZCArICJ3c2RsdTAwMzMiOyAgIC8vICBub3QgdXNlZCAtIGR1cCBiZWxvdwotCi0KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlXU0RMIEVkaXRvciAtIEdlbmVyYXRlIEJpbmRpbmcgV2l6YXJkCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQklORElOR19XSVpBUkQgPSBwbHVnaW5JZCArICJ3c2RsdTAwNDAiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1RPQ09MX0NPTVBPTkVOVF9OQU1FX1RFWFQgPSBwbHVnaW5JZCArICJ3c2RsdTAwNDEiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1RPQ09MX0NPTVBPTkVOVF9SRUZfQ09NQk8gPSBwbHVnaW5JZCArICJ3c2RsdTAwNDIiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1RPQ09MX0NPTVBPTkVOVF9QUk9UT0NPTF9DT01CTyA9IHBsdWdpbklkICsgIndzZGx1MDA0MyI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcFJPVE9DT0xfQ09NUE9ORU5UX09WRVJXUklURV9DSEVDS0JPWCA9IHBsdWdpbklkICsgIndzZGx1MDA0NCI7Ci0KLQkKLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlXU0RMIEVkaXRvciAtIEVkaXQgTmFtZXNwYWNlcyBEaWFsb2cgLS0tIGNvbW1vbi51aQotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVESVRfTlNfRElBTE9HID0gcGx1Z2luSWQgKyAid3NkbHUwMDUwIjsgICAvLyAgRWRpdCBOYW1lc3BhY2VzIERpYWxvZyAgICAgICAgICAgICAgICAgICJkaWFsb2ciICAgICAgICAtLT4gd3NkbHUwMDUwCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRURJVF9OU19ESUFMT0dfVE5TX1RFWFQgPSBwbHVnaW5JZCArICJ3c2RsdTAwNTEiOyAgIC8vICBUYXJnZXQgTmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiICAgICAgICAgIC0tPiB3c2RsdTAwNTEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFRElUX05TX0RJQUxPR19ERUNMQVJBVElPTlNfVEFCTEUgPSBwbHVnaW5JZCArICJ3c2RsdTAwNTIiOyAgIC8vICBOYW1lc3BhY2UgRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgInRhYmxlIiAgICAgICAgIC0tPiB3c2RsdTAwNTIKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVESVRfTlNfRElBTE9HX0FERF9CVVRUT04gPSBwbHVnaW5JZCArICJ3c2RsdTAwNTMiOyAgIC8vICBBZGQuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1c2ggYnV0dG9uIiAgIC0tPiB3c2RsdTAwNTMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFRElUX05TX0RJQUxPR19FRElUX0JVVFRPTiA9IHBsdWdpbklkICsgIndzZGx1MDA1NCI7ICAgLy8gIEVkaXQuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVzaCBidXR0b24iICAgLS0+IHdzZGx1MDA1NAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVESVRfTlNfRElBTE9HX0RFTEVURV9CVVRUT04gPSBwbHVnaW5JZCArICJ3c2RsdTAwNTUiOyAgIC8vICBEZWxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1c2ggYnV0dG9uIiAgIC0tPiB3c2RsdTAwNTUKLQotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JV1NETCBFZGl0b3IgLSBBZGQgTmFtZXNwYWNlIERlY2xhcmF0aW9ucyBEaWFsb2cgLS0tIGNvbW1vbi51aQotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9OU19ERUNMID0gcGx1Z2luSWQgKyAid3NkbHUwMDYwIjsgICAvLyAgQWRkIE5hbWVzcGFjZSBEZWNsYXJhdGlvbnMgRGlhbG9nICAgICAgICJkaWFsb2ciICAgICAgICAtLT4gd3NkbHUwMDYwCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX05TX0RFQ0xfU0VMRUNUX1JFR19OU19SQURJTyA9IHBsdWdpbklkICsgIndzZGx1MDA2MSI7ICAgLy8gIFNlbGVjdCBGcm9tIFJlZ2lzdGVyZWQgTmFtZXNwYWNlcyAgICAgICAicmFkaW8iICAgICAgICAgLS0+IHdzZGx1MDA2MQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9OU19ERUNMX1NQRUNJRllfTkVXX05TX1JBRElPID0gcGx1Z2luSWQgKyAid3NkbHUwMDYyIjsgICAvLyAgU3BlY2lmeSBOZXcgTmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICJyYWRpbyIgICAgICAgICAtLT4gd3NkbHUwMDYyCi0KLQkvLyBSZWdpc3RlcmVkIE5hbWVzcGFjZXM6Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX05TX0RFQ0xfU0VMRUNUX05TX1RPX0FERF9UQUJMRSA9IHBsdWdpbklkICsgIndzZGx1MDA2MyI7ICAgLy8gIFNlbGVjdCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0byBhZGQgInRhYmxlIiAgICAgICAgLS0+IHdzZGx1MDA2MwotCi0JLy8gTmV3IE5hbWVzcGFjZToKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTlNfREVDTF9QUkVGSVhfVEVYVCA9IHBsdWdpbklkICsgIiI7ICAgLy8gIFByZWZpeDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgICAgICAgICAgLS0+KENPTU1PTikgd3NkbHUwMDY0Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX05TX0RFQ0xfTkFNRVNQQUNFX05BTUVfVEVYVCA9IHBsdWdpbklkICsgIiI7ICAgLy8gIE5hbWVzcGFjZSBOYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgICAgICAgICAgLS0+KENPTU1PTikgd3NkbHUwMDY1Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX05TX0RFQ0xfTE9DQVRJT05fSElOVF9URVhUID0gcGx1Z2luSWQgKyAiIjsgICAvLyAgTG9jYXRpb24gSGludDogICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiAgICAgICAgICAtLT4oQ09NTU9OKSB3c2RsdTAwNjYKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTlNfREVDTF9CUk9XU0VfQlVUVE9OID0gcGx1Z2luSWQgKyAiIjsgICAvLyAgQnJvd3NlLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdXNoIGJ1dHRvbiIgICAtLT4oQ09NTU9OKSB3c2RsdTAwNjcKLQkKLQkKLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlXU0RMIEVkaXRvciAtIE5ldyBOYW1lc3BhY2UgSW5mb3JtYXRpb24gRGlhbG9nIC0tLSBjb21tb24udWkKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfTkFNRVNQQUNFX0lORk9fRElBTE9HID0gcGx1Z2luSWQgKyAid3NkbHUwMDY4IjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUVTUEFDRV9OQU1FID0gcGx1Z2luSWQgKyAid3NkbHUwMDY1IjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGSVggPSAgICAgICAgIHBsdWdpbklkICsgIndzZGx1MDA2NCI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQVRJT05fSElOVCA9ICBwbHVnaW5JZCArICJ3c2RsdTAwNjYiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJST1dTRSA9ICAgICAgICAgcGx1Z2luSWQgKyAid3NkbHUwMDY3IjsKLQotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JV1NETCBFZGl0b3IgLSBOZXcgTWVzc2FnZSBEaWFsb2cKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfTUVTU0FHRV9ESUFMT0cgPSBwbHVnaW5JZCArICJ3c2RsdTAwODAiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19NRVNTQUdFX0RJQUxPR19OQU1FX1RFWFQgPSBwbHVnaW5JZCArICJ3c2RsdTAwODEiOyAgLy8gbm90IHVzZWQgLS0gdGV4dCB3aWxsIHVzZSAiZGlhbG9nIiBjb250ZXh0IElkCi0KLQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVdTREwgRWRpdG9yIC0gU3BlY2lmeSBNZXNzYWdlIERpYWxvZyAtLS0gY29tbW9uLnVpCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1BFQ0lGWV9NRVNTQUdFX0RJQUxPRyA9IHBsdWdpbklkICsgIndzZGx1MDA4MiI7IC8vICAgICAgICAgICAgICAgICJkaWFsb2ciICAgICAgICAtLT4gd3NkbHUwMDgyCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTUEVDSUZZX0RJQUxPR19OQU1FX1RFWFQgPSBwbHVnaW5JZCArICJ3c2RsdTAwNzAiOyAvLyAgIE5hbWUgKD8gPSBjaGFyYWN0ZXIsICogPSBhbnkgc3RyaW5nKTogICAidGV4dCIgICAgICAgICAgLS0+KENPTU1PTikgd3NkbHUwMDcwCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1BFQ0lGWV9ESUFMT0dfQ09NUE9ORU5UU19MSVNUID0gcGx1Z2luSWQgKyAid3NkbHUwMDcxIjsgIC8vICBDb21wb25lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QiICAgICAgICAgIC0tPihDT01NT04pIHdzZGx1MDA3MQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1BFQ0lGWV9ESUFMT0dfU0VBUkNIX1NDT1BFID0gcGx1Z2luSWQgKyAid3NkbHUwMDcyIjsgLy8gIFNlYXJjaCBTY29wZToKLQkvL1dvcmtzcGFjZSwgRW5jbG9zaW5nIFByb2plY3QsIEN1cnJlbnQgUmVzb3VyY2UsIFdvcmtpbmcgU2V0cyAoR3JvdXBlZCkgICAgICAgICAgInJhZGlvIiAgICAgICAgIC0tPihDT01NT04pIHdzZGx1MDA3MgotCi0KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlXU0RMIEVkaXRvciAtIE5ldyBCaW5kaW5nIERpYWxvZwotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19CSU5ESU5HX0RJQUxPRyA9IHBsdWdpbklkICsgIndzZGx1MDA4MyI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX0JJTkRJTkdfRElBTE9HX05BTUVfVEVYVCA9IHBsdWdpbklkICsgIndzZGx1MDA4NCI7IC8vIG5vdCB1c2VkIC0tIHRleHQgd2lsbCB1c2UgImRpYWxvZyIgY29udGV4dCBJZAotCi0JCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JV1NETCBFZGl0b3IgLSBTcGVjaWZ5IEJpbmRpbmcgRGlhbG9nIC0tLSBjb21tb24udWkKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTUEVDSUZZX0JJTkRJTkdfRElBTE9HID0gcGx1Z2luSWQgKyAid3NkbHUwMDg1IjsgIC8vICBTcGVjaWZ5IEJpbmRpbmcgRGlhbG9nICAgICAgICAgICAgICAgICAgImRpYWxvZyIgICAgICAgIC0tPiB3c2RsdTAwODUKLQotCQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVdTREwgRWRpdG9yIC0gTmV3IFBvcnRUeXBlIERpYWxvZyAKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfUE9SVFRZUEVfRElBTE9HID0gcGx1Z2luSWQgKyAid3NkbHUwMDg2IjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfUE9SVFRZUEVfRElBTE9HX05BTUVfVEVYVCA9IHBsdWdpbklkICsgIndzZGx1MDA4NyI7IC8vIG5vdCB1c2VkIC0tIHRleHQgd2lsbCB1c2UgImRpYWxvZyIgY29udGV4dCBJZAotCi0JCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JV1NETCBFZGl0b3IgLSBTcGVjaWZ5IFBvcnQgVHlwZSBEaWFsb2cgLS0tIGNvbW1vbi51aQotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQRUNJRllfUE9SVFRZUEVfRElBTE9HID0gcGx1Z2luSWQgKyAid3NkbHUwMDg4IjsgLy8gIFNwZWNpZnkgUG9ydCBUeXBlIERpYWxvZyAgICAgICAgICAgICAgICAiZGlhbG9nIiAgICAgICAgLS0+IHdzZGx1MDA4OAotCi0JCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JV1NETCBFZGl0b3IgLSBQcm9wZXJ0aWVzCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JLy9EZWZpbml0aW9uOgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfTkFNRV9URVhUID0gcGx1Z2luSWQgKyAid3NkbHUwMTAwIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX0RFRl9QUkVGSVhfVEVYVCA9IHBsdWdpbklkICsgIndzZGx1MDEwMSI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19ERUZfVE5TX1RFWFQgPSBwbHVnaW5JZCArICJ3c2RsdTAxMDIiOwotCi0JLy9Qb3J0OgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfUE9SVF9CSU5ESU5HX0NPTUJPID0gcGx1Z2luSWQgKyAid3NkbHUwMTAzIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX1BPUlRfQUREUkVTU19URVhUID0gcGx1Z2luSWQgKyAid3NkbHUwMTA0IjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX1BPUlRfUFJPVE9DT0xfVEVYVCA9IHBsdWdpbklkICsgIndzZGx1MDEwNSI7Ci0KLQkvL0JpbmRpbmc6Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19CSU5ESU5HX1BPUlRUWVBFX0NPTUJPID0gcGx1Z2luSWQgKyAid3NkbHUwMTA2IjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX0JJTkRJTkdfUFJPVE9DT0xfVEVYVCA9IHBsdWdpbklkICsgIndzZGx1MDEwNyI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19CSU5ESU5HX0dFTl9CSU5ESU5HX0JVVFRPTiA9IHBsdWdpbklkICsgIndzZGx1MDEwOCI7Ci0KLQkvL0lucHV0L091dHB1dC9GYXVsdDoKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX01FU1NBR0VfUkVGX01FU1NBR0VfQ09NQk8gPSBwbHVnaW5JZCArICJ3c2RsdTAxMDkiOwotCi0JLy9QYXJ0OgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfUEFSVF9FTEVNRU5UX0NPTUJPID0gcGx1Z2luSWQgKyAid3NkbHUwMTEwIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX1BBUlRfVFlQRV9DT01CTyA9IHBsdWdpbklkICsgIndzZGx1MDExMSI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19QQVJUX1RZUEVfUkFESU8gPSBwbHVnaW5JZCArICJ3c2RsdTAxMTIiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfUEFSVF9FTEVNRU5UX1JBRElPID0gcGx1Z2luSWQgKyAid3NkbHUwMTEzIjsKLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfRE9DVU1FTlRBVElPTl9UQUIgPSBwbHVnaW5JZCArICJ3c2RsdTAxMTQiOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9XSVpBUkRfT1BUSU9OU19QQUdFID0gcGx1Z2luSWQgKyAid3NkbHUwMTIwIjsgIC8vIE5ldyBXU0RMIFdpemFyZCAtIG9wdGlvbnMgcGFnZSAJLS0+IHdzZGx1MDEyMAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfREVTSUdOX1ZJRVcgPSBwbHVnaW5JZCArICJ3c2RsdTAxMjEiOyAvLyAgRGVzaWduIFZpZXcgCQkJCS0tPiB3c2RsdTAxMjEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX09VVExJTkVfVklFVyA9IHBsdWdpbklkICsgIndzZGx1MDEyMiI7ICAvLyBPdXRsaW5lIFZpZXcgCQkJCS0tPiB3c2RsdTAxMjIKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BST1BFUlRJRVNfVklFVyA9IHBsdWdpbklkICsgIndzZGx1MDEyMyI7IC8vICBQcm9wZXJ0aWVzIFZpZXcJCQkJLS0+IHdzZGx1MDEyMwotCi0vLwlXU0RMIFByZWZlcmVuY2UgUGFnZToKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BSRUZfREVGQVVMVF9UTlMgPSBwbHVnaW5JZCArICJ3c2RsdTAyMDAiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfUFJFRl9SRUdFTl9PTl9TQVZFID0gcGx1Z2luSWQgKyAid3NkbHUwMjAxIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BSRUZfUFJPTVBUX1JFR0VOX09OX1NBVkUgPSBwbHVnaW5JZCArICJ3c2RsdTAyMDIiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9BU0RFZGl0b3JQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvQVNERWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YWMwYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9BU0RFZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQVNERWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEID0gMjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEFTREVkaXRvclBsdWdpbiBpbnN0YW5jZTsKLQkgIAotCSAgcHVibGljIEFTREVkaXRvclBsdWdpbigpIHsJCSAgCi0JICB9Ci0JICAKLS8vCS8qKgotLy8JICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgQVNERWRpdG9yUGx1Z2luIGdldEluc3RhbmNlKCkKLS8vCXsKLS8vCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotLy8JCQlpbnN0YW5jZSA9IG5ldyBBU0RFZGl0b3JQbHVnaW4oKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGluc3RhbmNlOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKQotLy8JewotLy8JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLS8vCQkKLS8vCQlpZiAoaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpICE9IG51bGwpCi0vLwkJewotLy8JCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotLy8JCX0KLS8vCQllbHNlCi0vLwkJewotLy8JCQlpbWFnZVJlZ2lzdHJ5LnB1dChpY29uTmFtZSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKGdldENsYXNzKCksIGljb25OYW1lKSk7Ci0vLwkJCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0vLwkJfQotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQkvLyBXZSBzaG91bGQgbm90IGtub3cgYWJvdXQgV1NETEVkaXRvclBsdWdpbi5qYXZhLiAgRXZlbnR1YWxseSwgd2Ugc2hvdWxkIG1vdmUgdGhlc2UKLQkJLy8gJ2dlbmVyaWMnLCAndG9wLWxldmVsJyBpY29ucyB0byB0aGUgQVNEIGxldmVsLi4uLi4KLQkJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKHBhdGgpOwotCX0KLQkKLSAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihTdHJpbmcgcGF0aCkgewotICAgIC8vIFdlIHNob3VsZCBub3Qga25vdyBhYm91dCBXU0RMRWRpdG9yUGx1Z2luLmphdmEuICBFdmVudHVhbGx5LCB3ZSBzaG91bGQgbW92ZSB0aGVzZQotICAgIC8vICdnZW5lcmljJywgJ3RvcC1sZXZlbCcgaWNvbnMgdG8gdGhlIEFTRCBsZXZlbC4uLi4uCi0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihwYXRoKTsKLSAgfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL0FTRExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvQVNETGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzhjMzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvQVNETGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5FZGl0b3JNb2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEFTRExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQVNETGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0gICAgcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBnZXREZWxlZ2F0ZSgpCi0gICAgewotICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7ICAgCi0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIEVkaXRvck1vZGVNYW5hZ2VyIG1hbmFnZXIgPSAoRWRpdG9yTW9kZU1hbmFnZXIpIGVkaXRvci5nZXRBZGFwdGVyKEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKTsKLSAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxhYmVsUHJvdmlkZXIgPSAoSUxhYmVsUHJvdmlkZXIpIG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKS5nZXRBZGFwdGVyKElMYWJlbFByb3ZpZGVyLmNsYXNzKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyOwotICAgIH0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgIAotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0IHNlbGVjdGVkID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKW9iamVjdCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCSAgICBJTGFiZWxQcm92aWRlciBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKCk7Ci0gICAgICAgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICByZXN1bHQgPSBkZWxlZ2F0ZS5nZXRJbWFnZShzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElUcmVlRWxlbWVudCkgewotCQkJCXJlc3VsdCA9ICgoSVRyZWVFbGVtZW50KSBzZWxlY3RlZCkuZ2V0SW1hZ2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuICJObyBpdGVtcyBzZWxlY3RlZCI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkKLSAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGRlbGVnYXRlID0gZ2V0RGVsZWdhdGUoKTsKLSAgICAgICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGRlbGVnYXRlLmdldFRleHQoc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAoKElUcmVlRWxlbWVudCkgc2VsZWN0ZWQpLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0KLQkJCQotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUFTRE9iamVjdCAmJiAoKElBU0RPYmplY3QpIHNlbGVjdGVkKS5pc1JlYWRPbmx5KCkpIHsKLQkJCQlyZXN1bHQgID0gcmVzdWx0ICsgIiAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9SRUFEX09OTFkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9BU0RNdWx0aVBhZ2VFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvQVNETXVsdGlQYWdlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjI3YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9BU0RNdWx0aVBhZ2VFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5ab29tTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkQmluZGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRFbmRQb2ludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRGYXVsdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRJbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkSW5wdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkSW50ZXJmYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZE9wZXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRPdXRwdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEQWRkUGFyYW1ldGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTREFkZFNjaGVtYUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RBZGRTZXJ2aWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTRERlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RHZW5lcmF0ZUJpbmRpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNET3BlblNjaGVtYUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RTZXRFeGlzdGluZ0JpbmRpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEU2V0RXhpc3RpbmdJbnRlcmZhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEU2V0TmV3QmluZGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RTZXROZXdJbnRlcmZhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5EZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5kaXJlY3RlZGl0LkRpcmVjdEVkaXRTZWxlY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLkFTREVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5BU0RDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnMuQVNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnV0aWwuSU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29tbW9uTXVsdGlQYWdlRWRpdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVNETXVsdGlQYWdlRWRpdG9yIGV4dGVuZHMgQ29tbW9uTXVsdGlQYWdlRWRpdG9yCi17Ci0gIC8vIFRPRE86IG1vdmUgdG8gZGVzaWduIHZpZXdlcgotICBwcm90ZWN0ZWQgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIgbWVudVByb3ZpZGVyOwotICBwcm90ZWN0ZWQgSURlc2NyaXB0aW9uIG1vZGVsOwotICBwcml2YXRlIGludCBjdXJyZW50UGFnZSA9IC0xOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGVkaXRvciBleGFtcGxlLgotICAgKi8KLSAgcHVibGljIEFTRE11bHRpUGFnZUVkaXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgCi0gICAgZ2V0RWRpdERvbWFpbigpLnNldEFjdGl2ZVRvb2wobmV3IERpcmVjdEVkaXRTZWxlY3Rpb25Ub29sKCkpOwotICAgIGdldEVkaXREb21haW4oKS5zZXREZWZhdWx0VG9vbChuZXcgRGlyZWN0RWRpdFNlbGVjdGlvblRvb2woKSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIEludGVybmFsTGF5b3V0IGV4dGVuZHMgU3RhY2tMYXlvdXQKLSAgewotICAgIHB1YmxpYyBJbnRlcm5hbExheW91dCgpIHsKLSAgICAgIHN1cGVyKCk7ICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotICAgICAgQ29udHJvbCBjaGlsZHJlbltdID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICByZWN0LnggKz0gbWFyZ2luV2lkdGg7Ci0gICAgICByZWN0LnkgKz0gbWFyZ2luSGVpZ2h0OwotICAgICAgcmVjdC53aWR0aCAtPSAyICogbWFyZ2luV2lkdGg7Ci0gICAgICByZWN0LmhlaWdodCAtPSAyICogbWFyZ2luSGVpZ2h0OwotICAgICAgCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChpID09IDAgJiYgbW9kZUNvbWJvICE9IG51bGwpIHsgLy8gRm9yIHRoZSBkcm9wIGRvd24gdG9vbGJhcgotICAgICAgICAgIGNoaWxkcmVuW2ldLnNldEJvdW5kcyhyZWN0LnggKyByZWN0LndpZHRoIC0gOTAgLSBtYXhMZW5ndGgsIHJlY3QueSArIDEwLCBtYXhMZW5ndGggKyA2MCwgMjYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2Ugey8vIEZvciB0aGUgbWFpbiBncmFwaCB2aWV3ZXIKLSAgICAgICAgICBjaGlsZHJlbltpXS5zZXRCb3VuZHMocmVjdCk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgIAotICAgIH0gICAgICAgICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVHcmFwaFBhZ2VDb21wb3NpdGUoKSB7ICAgIAotICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGdldENvbnRhaW5lcigpLCBTV1QuRkxBVCk7Ci0gICAgcGFyZW50LnNldExheW91dChuZXcgSW50ZXJuYWxMYXlvdXQoKSk7Ci0gICAgY3JlYXRlVmlld01vZGVUb29sYmFyKHBhcmVudCk7Ci0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIAotICBwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSB7Ci0JICBpZiAoKGZPdXRsaW5lUGFnZSA9PSBudWxsKSB8fCBmT3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgKGZPdXRsaW5lUGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSkgewotCQkgIElDb250ZW50UHJvdmlkZXIgIHByb3ZpZGVyID0gZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKS5nZXRDdXJyZW50TW9kZSgpLmdldE91dGxpbmVQcm92aWRlcigpOwotICAgICAgICAgIAotICAgICAgQVNEQ29udGVudE91dGxpbmVQYWdlIG91dGxpbmVQYWdlID0gbmV3IEFTRENvbnRlbnRPdXRsaW5lUGFnZSh0aGlzLCBtZW51UHJvdmlkZXIpOwotCQkgIG91dGxpbmVQYWdlLnNldENvbnRlbnRQcm92aWRlcigoSVRyZWVDb250ZW50UHJvdmlkZXIpcHJvdmlkZXIpOwotCQkgIG91dGxpbmVQYWdlLnNldExhYmVsUHJvdmlkZXIoKElMYWJlbFByb3ZpZGVyKXByb3ZpZGVyKTsKLQkJICBvdXRsaW5lUGFnZS5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLQkJICBvdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3V0bGluZVBhZ2UpOwotICAgICAgCi0gICAgICBmT3V0bGluZVBhZ2UgPSBvdXRsaW5lUGFnZTsKLQkgIH0KLQkgIHJldHVybiBmT3V0bGluZVBhZ2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0gIHsKLSAgICBzZWxlY3Rpb25Qcm92aWRlciA9IGdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICBnZXRFZGl0b3JTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotCi0gICAgY3JlYXRlR3JhcGhQYWdlKCk7Ci0gICAgY3JlYXRlU291cmNlUGFnZSgpOwotCi0gICAgYnVpbGRBbmRTZXRNb2RlbCgpOwotICAgIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKTsKLSAgICBzZXRBY3RpdmVQYWdlKGdldERlZmF1bHRQYWdlVHlwZUluZGV4KCkpOwotICAgIAotICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0TW9kZWwoKSkpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKSwgQVNERWRpdG9yQ1NIZWxwSWRzLldTRExfREVTSUdOX1ZJRVcpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRQYWdlVHlwZUluZGV4KCkgewotCSAgaW50IHBhZ2VJbmRleCA9IFNPVVJDRV9QQUdFX0lOREVYOwotCSAgaWYgKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0UGFnZSgpLmVxdWFscyhXU0RMRWRpdG9yUGx1Z2luLkRFU0lHTl9QQUdFKSkgewotCQkgIHBhZ2VJbmRleCA9IERFU0lHTl9QQUdFX0lOREVYOwotCSAgfQotCi0JICByZXR1cm4gcGFnZUluZGV4OwotCSAgfQotICAKLSAgcHJvdGVjdGVkIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKHRoaXMsIGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGJ1aWxkQW5kU2V0TW9kZWwoKSB7Ci0JICBtb2RlbCA9IGJ1aWxkTW9kZWwoKElGaWxlRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gIH0KLQotICBhYnN0cmFjdCBwdWJsaWMgSURlc2NyaXB0aW9uIGJ1aWxkTW9kZWwoSUZpbGVFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkKLSAgewotICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQotICAgIEJhc2VTZWxlY3Rpb25BY3Rpb24gYWN0aW9uID0gbmV3IEFTREFkZFNlcnZpY2VBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQVNEQWRkQmluZGluZ0FjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBU0RBZGRJbnRlcmZhY2VBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQVNEQWRkRW5kUG9pbnRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQVNEQWRkT3BlcmF0aW9uQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFTREFkZElucHV0QWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFTREFkZE91dHB1dEFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBU0RBZGRGYXVsdEFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFTRERlbGV0ZUFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBU0RTZXROZXdCaW5kaW5nQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFTRFNldEV4aXN0aW5nQmluZGluZ0FjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFTRFNldE5ld0ludGVyZmFjZUFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBU0RTZXRFeGlzdGluZ0ludGVyZmFjZUFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBU0RHZW5lcmF0ZUJpbmRpbmdBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQVNEQWRkSW1wb3J0QWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFTREFkZFBhcmFtZXRlckFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOyAgICAKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQVNEQWRkU2NoZW1hQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFTRE9wZW5TY2hlbWFBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgSURlc2NyaXB0aW9uIGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgPT0gWm9vbU1hbmFnZXIuY2xhc3MpCi0gICAgICByZXR1cm4gZ3JhcGhpY2FsVmlld2VyLmdldFByb3BlcnR5KFpvb21NYW5hZ2VyLmNsYXNzLnRvU3RyaW5nKCkpOwotCi0gICAgaWYgKHR5cGUgPT0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpCi0gICAgewotICAgIAlBU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gbmV3IEFTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKHRoaXMpOwotICAgIAlyZXR1cm4gcGFnZTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gR3JhcGhpY2FsVmlld2VyLmNsYXNzKQotICAgICAgcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLSAgICBpZiAodHlwZSA9PSBFZGl0UGFydC5jbGFzcyAmJiBncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiBncmFwaGljYWxWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0gICAgaWYgKHR5cGUgPT0gSUZpZ3VyZS5jbGFzcyAmJiBncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBncmFwaGljYWxWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkpLmdldEZpZ3VyZSgpOwotICAgIAotICAgIGlmIChJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzLmVxdWFscyh0eXBlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0Q29udGVudE91dGxpbmVQYWdlKCk7Ci0gICAgfQotICAgIAotICAgIGlmICh0eXBlID09IElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcykKLSAgICB7Ci0gICAgICAgcmV0dXJuIGdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpIHsKLSAgICByZXR1cm4gbmV3IEFTREVkaXRQYXJ0RmFjdG9yeSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRFZGl0UGFydEZhY3RvcnkoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkgIGdyYXBoaWNhbFZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoZmFjdG9yeSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKG1vZGVsKTsKLSAgICBtZW51UHJvdmlkZXIgPSBuZXcgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIoZ3JhcGhpY2FsVmlld2VyLCBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLSAgICBjdXJyZW50UGFnZSA9IG5ld1BhZ2VJbmRleDsKLSAgICBzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JICBpZiAoY3VycmVudFBhZ2UgPT0gU09VUkNFX1BBR0VfSU5ERVgpIHsKLQkJICBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdFBhZ2UoV1NETEVkaXRvclBsdWdpbi5TT1VSQ0VfUEFHRSk7Ci0JICB9Ci0JICBlbHNlIHsKLQkJICBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdFBhZ2UoV1NETEVkaXRvclBsdWdpbi5ERVNJR05fUEFHRSk7Ci0JICB9Ci0KLQkgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IElPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIgZ2V0T3BlbkV4dGVybmFsRWRpdG9ySGVscGVyKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL0FTRFNlbGVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvQVNEU2VsZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzdhYzg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvQVNEU2VsZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0RTZWxlY3Rpb25NYW5hZ2VyIGV4dGVuZHMgTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVOb3RpZnkgPSB0cnVlOwotCQotCXB1YmxpYyBBU0RTZWxlY3Rpb25NYW5hZ2VyKE11bHRpUGFnZUVkaXRvclBhcnQgbXVsdGlQYWdlRWRpdG9yKQotCXsKLQkJc3VwZXIobXVsdGlQYWdlRWRpdG9yKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0JewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQl7Ci0JCWlmIChlbmFibGVOb3RpZnkpCi0JCXsKLQkJCXNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlKQotCXsgIAotCQlpZiAoZW5hYmxlTm90aWZ5KQotCQl7Ci0JCQljdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJZW5hYmxlTm90aWZ5ID0gZmFsc2U7Ci0JCQl0cnkKLQkJCXsKLQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNvdXJjZSwgc2VsZWN0aW9uKTsKLQkJCQlMaXN0IGNvcHlPZkxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QobGlzdGVuZXJMaXN0KTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb3B5T2ZMaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLQkJCQl7Ci0JCQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcilpLm5leHQoKTsKLQkJCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseQotCQkJewotCQkJCWVuYWJsZU5vdGlmeSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZlZWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkgIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UQUJfR1JBUEg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RBQl9TT1VSQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9ORVc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JFQURfT05MWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QT1JUVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTE9DQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FERFJFU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0JJTkRJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9TRVJWSUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfT1BFUkFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0lNUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9PVVRQVVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRkFVTFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9QT1JUVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX0JST1dTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX05FV19QT1JUVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX05FV19CSU5ESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRVhJU1RJTkdfUE9SVFRZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dFTkVSQVRFX0JJTkRJTkdfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0VYSVNUSU5HX0JJTkRJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0JJTkRJTkdfUFJPVE9DT0w7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQklORElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfSU5QVVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NFQ1RJT05fQURWQU5DRURfQVRUUklCVVRFUzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRURJVF9OQU1FU1BBQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fT1BFTl9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RPT0xUSVBfUkVOQU1FX1JFRkFDVE9SOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JJR0hUX0NMSUNLX1RPX0lOU0VSVF9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZEJpbmRpbmdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRCaW5kaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTU0NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZEJpbmRpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmUuSUNhdGVnb3J5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEFTREFkZEJpbmRpbmdBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RBZGRCaW5kaW5nQWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQVNEQWRkQmluZGluZ0FjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQklORElORyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2JpbmRpbmdfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQotCQkJaWYgKG8gaW5zdGFuY2VvZiBJQ2F0ZWdvcnlBZGFwdGVyKSB7Ci0JCQkJbyA9ICgoSUNhdGVnb3J5QWRhcHRlcikgbykuZ2V0T3duZXJEZXNjcmlwdGlvbigpOwotCQkJfQotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIElEZXNjcmlwdGlvbikgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9ICgoSURlc2NyaXB0aW9uKSBvKS5nZXRBZGRCaW5kaW5nQ29tbWFuZCgpOwotCQkJICAgIENvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIEFTREVkaXRvclBsdWdpbi5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0JCQkgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLQkJCSAgICAKLQkJCSAgICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElBU0RBZGRDb21tYW5kKSB7Ci0JCQkgICAgCU9iamVjdCBvYmplY3QgPSAoKElBU0RBZGRDb21tYW5kKSBjb21tYW5kKS5nZXROZXdseUFkZGVkQ29tcG9uZW50KCk7Ci0JCQkgICAgCXBlcmZvcm1TZWxlY3Rpb24ob2JqZWN0KTsKLQkJCSAgICB9Ci0JCQl9Ci0JCX0gIAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkRW5kUG9pbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRFbmRQb2ludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE3ZTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRFbmRQb2ludEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklFbmRQb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgQVNEQWRkRW5kUG9pbnRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEQWRkRW5kUG9pbnRBY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBBU0RBZGRFbmRQb2ludEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfUE9SVCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3BvcnRfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCUlTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCQkJCi0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElTZXJ2aWNlKSB7Ci0gICAgICAgICAgICAJc2VydmljZSA9IChJU2VydmljZSkgbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJRW5kUG9pbnQpIHsKLSAgICAgICAgICAgIAlzZXJ2aWNlID0gKChJRW5kUG9pbnQpIG8pLmdldE93bmVyU2VydmljZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gc2VydmljZS5nZXRBZGRFbmRQb2ludENvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICBDb21tYW5kU3RhY2sgc3RhY2sgPSAoQ29tbWFuZFN0YWNrKSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOwotICAgICAgICAgICAgICAgIHN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgCi0JCQkgICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBJQVNEQWRkQ29tbWFuZCkgewotCQkJICAgIAlPYmplY3QgZWxlbWVudCA9ICgoSUFTREFkZENvbW1hbmQpIGNvbW1hbmQpLmdldE5ld2x5QWRkZWRDb21wb25lbnQoKTsKLQkJCSAgICAJc2VsZWN0QW5kRGlyZWN0RWRpdChlbGVtZW50KTsKLQkJCSAgICB9Ci0gICAgICAgICAgICB9Ci0JCX0gIAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkRmF1bHRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRGYXVsdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzE4ODM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRGYXVsdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLQotcHVibGljIGNsYXNzIEFTREFkZEZhdWx0QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEQWRkRmF1bHRBY3Rpb25uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQVNEQWRkRmF1bHRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkJewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0ZBVUxUKTsgICAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihBU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9mYXVsdF9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotCQkJSU9wZXJhdGlvbiBpT3BlcmF0aW9uID0gbnVsbDsKLQkJCU9iamVjdCBwb3NzaWJsZUZhdWx0ID0gbnVsbDsKLQkJCQotCQkJaWYgKG8gaW5zdGFuY2VvZiBJT3BlcmF0aW9uKSB7Ci0JCQkJaU9wZXJhdGlvbiA9IChJT3BlcmF0aW9uKSBvOwotCQkJfQotCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElNZXNzYWdlUmVmZXJlbmNlKSB7Ci0JCQkJaU9wZXJhdGlvbiA9ICgoSU1lc3NhZ2VSZWZlcmVuY2UpIG8pLmdldE93bmVyT3BlcmF0aW9uKCk7Ci0JCQkJcG9zc2libGVGYXVsdCA9ICgoVzExTWVzc2FnZVJlZmVyZW5jZSkgbykuZ2V0VGFyZ2V0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVBhcmFtZXRlcikgewotCQkJCWlPcGVyYXRpb24gPSAoKElNZXNzYWdlUmVmZXJlbmNlKSAoKElQYXJhbWV0ZXIpIG8pLmdldE93bmVyKCkpLmdldE93bmVyT3BlcmF0aW9uKCk7Ci0JCQkJcG9zc2libGVGYXVsdCA9ICgoVzExTWVzc2FnZVJlZmVyZW5jZSkgKChJUGFyYW1ldGVyKSBvKS5nZXRPd25lcigpKS5nZXRUYXJnZXQoKTsKLQkJCX0KLQkJCQotCQkJaWYgKGlPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9IGlPcGVyYXRpb24uZ2V0QWRkRmF1bHRDb21tYW5kKHBvc3NpYmxlRmF1bHQpOwotCQkJICAgIENvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIEFTREVkaXRvclBsdWdpbi5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0JCQkgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLQkJCSAgICAKLQkJCSAgICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElBU0RBZGRDb21tYW5kKSB7Ci0JCQkgICAgCU9iamVjdCBvYmplY3QgPSAoKElBU0RBZGRDb21tYW5kKSBjb21tYW5kKS5nZXROZXdseUFkZGVkQ29tcG9uZW50KCk7Ci0JCQkgICAgCXBlcmZvcm1TZWxlY3Rpb24ob2JqZWN0KTsKLQkJCSAgICB9Ci0JCQl9Ci0JCX0gIAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkSW1wb3J0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkSW1wb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Y2UwYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZEltcG9ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JQ2F0ZWdvcnlBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgQVNEQWRkSW1wb3J0QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEQWRkSW1wb3J0QWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQVNEQWRkSW1wb3J0QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTVBPUlQpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihBU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9pbXBvcnRfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQotCQkJaWYgKG8gaW5zdGFuY2VvZiBJQ2F0ZWdvcnlBZGFwdGVyKSB7Ci0JCQkJbyA9ICgoSUNhdGVnb3J5QWRhcHRlcikgbykuZ2V0T3duZXJEZXNjcmlwdGlvbigpOwotCQkJfQotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIElEZXNjcmlwdGlvbikgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9ICgoSURlc2NyaXB0aW9uKSBvKS5nZXRBZGRJbXBvcnRDb21tYW5kKCk7Ci0JCQkgICAgQ29tbWFuZFN0YWNrIHN0YWNrID0gKENvbW1hbmRTdGFjaykgQVNERWRpdG9yUGx1Z2luLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKTsKLQkJCSAgICBzdGFjay5leGVjdXRlKGNvbW1hbmQpOwotCQkJICAgIAotCQkJICAgIGlmIChjb21tYW5kIGluc3RhbmNlb2YgSUFTREFkZENvbW1hbmQpIHsKLQkJCSAgICAJT2JqZWN0IG9iamVjdCA9ICgoSUFTREFkZENvbW1hbmQpIGNvbW1hbmQpLmdldE5ld2x5QWRkZWRDb21wb25lbnQoKTsKLQkJCSAgICAJcGVyZm9ybVNlbGVjdGlvbihvYmplY3QpOwotCQkJICAgIH0KLQkJCX0KLQkJfSAgCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRJbnB1dEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZElucHV0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNWY5YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZElucHV0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLQotcHVibGljIGNsYXNzIEFTREFkZElucHV0QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbiB7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTREFkZElucHV0QWN0aW9ubiI7ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEFTREFkZElucHV0QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTlBVVCk7ICAgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvaW5wdXRfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCUlPcGVyYXRpb24gaU9wZXJhdGlvbiA9IG51bGw7Ci0JCQkKLQkJCWlmIChvIGluc3RhbmNlb2YgSU9wZXJhdGlvbikgewotCQkJCWlPcGVyYXRpb24gPSAoSU9wZXJhdGlvbikgbzsKLQkJCX0KLQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJTWVzc2FnZVJlZmVyZW5jZSkgewotCQkJCWlPcGVyYXRpb24gPSAoKElNZXNzYWdlUmVmZXJlbmNlKSBvKS5nZXRPd25lck9wZXJhdGlvbigpOwotCQkJfQotCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElQYXJhbWV0ZXIpIHsKLQkJCQlpT3BlcmF0aW9uID0gKChJTWVzc2FnZVJlZmVyZW5jZSkgKChJUGFyYW1ldGVyKSBvKS5nZXRPd25lcigpKS5nZXRPd25lck9wZXJhdGlvbigpOwotCQkJfQotCQkJCi0JCQlpZiAoaU9wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJQ29tbWFuZCBjb21tYW5kID0gaU9wZXJhdGlvbi5nZXRBZGRJbnB1dENvbW1hbmQoKTsKLQkJCSAgICBDb21tYW5kU3RhY2sgc3RhY2sgPSAoQ29tbWFuZFN0YWNrKSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOwotCQkJICAgIHN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkgICAgCi0JCQkgICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBJQVNEQWRkQ29tbWFuZCkgewotCQkJICAgIAlPYmplY3Qgb2JqZWN0ID0gKChJQVNEQWRkQ29tbWFuZCkgY29tbWFuZCkuZ2V0TmV3bHlBZGRlZENvbXBvbmVudCgpOwotCQkJICAgIAlwZXJmb3JtU2VsZWN0aW9uKG9iamVjdCk7Ci0JCQkgICAgfQotCQkJfQotCQl9ICAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZEludGVyZmFjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZEludGVyZmFjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDYzODAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRJbnRlcmZhY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklDYXRlZ29yeUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0RBZGRJbnRlcmZhY2VBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEQWRkSW50ZXJmYWNlQWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQVNEQWRkSW50ZXJmYWNlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9QT1JUVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3BvcnR0eXBlX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IG8gPSBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCk7Ci0KLQkJCWlmIChvIGluc3RhbmNlb2YgSUNhdGVnb3J5QWRhcHRlcikgewotCQkJCW8gPSAoKElDYXRlZ29yeUFkYXB0ZXIpIG8pLmdldE93bmVyRGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJCQotCQkJaWYgKG8gaW5zdGFuY2VvZiBJRGVzY3JpcHRpb24pIHsKLQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoKElEZXNjcmlwdGlvbikgbykuZ2V0QWRkSW50ZXJmYWNlQ29tbWFuZCgpOwotCQkJICAgIENvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIEFTREVkaXRvclBsdWdpbi5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0JCQkgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLQkJCSAgICAKLQkJCSAgICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElBU0RBZGRDb21tYW5kKSB7Ci0JCQkgICAgCU9iamVjdCBlbGVtZW50ID0gKChJQVNEQWRkQ29tbWFuZCkgY29tbWFuZCkuZ2V0TmV3bHlBZGRlZENvbXBvbmVudCgpOwotCQkJICAgIAlzZWxlY3RBbmREaXJlY3RFZGl0KGVsZW1lbnQpOwotCQkJICAgIH0KLQkJCX0KLQkJfSAgCi0JfQotCQotCS8qCi0JICogQGRlcHJlY2F0ZWQuICBUbyBiZSByZW1vdmVkIHBvc3QgV1RQIDEuNQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRGlyZWN0RWRpdChFZGl0UGFydCBlcCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkTWVzc2FnZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZE1lc3NhZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkMDdhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkTWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JQ2F0ZWdvcnlBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgQVNEQWRkTWVzc2FnZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTREFkZE1lc3NhZ2VBY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBBU0RBZGRNZXNzYWdlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9NRVNTQUdFKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvbWVzc2FnZV9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIElDYXRlZ29yeUFkYXB0ZXIpIHsKLQkJCQlvID0gKChJQ2F0ZWdvcnlBZGFwdGVyKSBvKS5nZXRPd25lckRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChvIGluc3RhbmNlb2YgSURlc2NyaXB0aW9uKSB7Ci0JCQkJQ29tbWFuZCBjb21tYW5kID0gKChJRGVzY3JpcHRpb24pIG8pLmdldEFkZE1lc3NhZ2VDb21tYW5kKCk7Ci0JCQkgICAgQ29tbWFuZFN0YWNrIHN0YWNrID0gKENvbW1hbmRTdGFjaykgQVNERWRpdG9yUGx1Z2luLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKTsKLQkJCSAgICBzdGFjay5leGVjdXRlKGNvbW1hbmQpOwotCQkJICAgIAotCQkJICAgIGlmIChjb21tYW5kIGluc3RhbmNlb2YgSUFTREFkZENvbW1hbmQpIHsKLQkJCSAgICAJT2JqZWN0IG9iamVjdCA9ICgoSUFTREFkZENvbW1hbmQpIGNvbW1hbmQpLmdldE5ld2x5QWRkZWRDb21wb25lbnQoKTsKLQkJCSAgICAJcGVyZm9ybVNlbGVjdGlvbihvYmplY3QpOwotCQkJICAgIH0KLQkJCX0KLQkJfSAgCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRPcGVyYXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRPcGVyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyNzYyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkT3BlcmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotCi1wdWJsaWMgY2xhc3MgQVNEQWRkT3BlcmF0aW9uQWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbiB7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTREFkZE9wZXJhdGlvbkFjdGlvbiI7ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEFTREFkZE9wZXJhdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfT1BFUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvb3BlcmF0aW9uX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IG8gPSBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCk7Ci0JCQlJSW50ZXJmYWNlIHRoZUludGVyZmFjZSA9IG51bGw7Ci0JCQkKLQkJCWlmIChvIGluc3RhbmNlb2YgSUludGVyZmFjZSkgewotCQkJCXRoZUludGVyZmFjZSA9IChJSW50ZXJmYWNlKSBvOwotCQkJfQotCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElPcGVyYXRpb24pIHsKLQkJCQl0aGVJbnRlcmZhY2UgPSAoKElPcGVyYXRpb24pIG8pLmdldE93bmVySW50ZXJmYWNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkJCQl0aGVJbnRlcmZhY2UgPSAoKElNZXNzYWdlUmVmZXJlbmNlKSBvKS5nZXRPd25lck9wZXJhdGlvbigpLmdldE93bmVySW50ZXJmYWNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVBhcmFtZXRlcikgewotCQkJCXRoZUludGVyZmFjZSA9ICgoSU1lc3NhZ2VSZWZlcmVuY2UpICgoSVBhcmFtZXRlcikgbykuZ2V0T3duZXIoKSkuZ2V0T3duZXJPcGVyYXRpb24oKS5nZXRPd25lckludGVyZmFjZSgpOwotCQkJfQotCQkJCi0JCQlpZiAodGhlSW50ZXJmYWNlICE9IG51bGwpIHsKLQkJCQlDb21tYW5kIGNvbW1hbmQgPSB0aGVJbnRlcmZhY2UuZ2V0QWRkT3BlcmF0aW9uQ29tbWFuZCgpOwotCQkJICAgIENvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIEFTREVkaXRvclBsdWdpbi5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0JCQkgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLQkJCSAgICAKLQkJCSAgICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElBU0RBZGRDb21tYW5kKSB7Ci0JCQkgICAgCU9iamVjdCBlbGVtZW50ID0gKChJQVNEQWRkQ29tbWFuZCkgY29tbWFuZCkuZ2V0TmV3bHlBZGRlZENvbXBvbmVudCgpOwotCQkJICAgIAlzZWxlY3RBbmREaXJlY3RFZGl0KGVsZW1lbnQpOwotCQkJICAgIH0KLQkJCX0KLQkJfSAgCi0JfQotCQotCS8qCi0JICogQGRlcHJlY2F0ZWQuICBUbyBiZSByZW1vdmVkIHBvc3QgV1RQIDEuNQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRGlyZWN0RWRpdChFZGl0UGFydCBlcCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkT3V0cHV0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkT3V0cHV0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzZhYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZE91dHB1dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0RBZGRPdXRwdXRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEQWRkT3V0cHV0QWN0aW9ubiI7ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEFTREFkZE91dHB1dEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfT1VUUFVUKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvb3V0cHV0X29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IG8gPSBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCk7Ci0JCQlJT3BlcmF0aW9uIGlPcGVyYXRpb24gPSBudWxsOwotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIElPcGVyYXRpb24pIHsKLQkJCQlpT3BlcmF0aW9uID0gKElPcGVyYXRpb24pIG87Ci0JCQl9Ci0JCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkJCQlpT3BlcmF0aW9uID0gKChJTWVzc2FnZVJlZmVyZW5jZSkgbykuZ2V0T3duZXJPcGVyYXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJUGFyYW1ldGVyKSB7Ci0JCQkJaU9wZXJhdGlvbiA9ICgoSU1lc3NhZ2VSZWZlcmVuY2UpICgoSVBhcmFtZXRlcikgbykuZ2V0T3duZXIoKSkuZ2V0T3duZXJPcGVyYXRpb24oKTsKLQkJCX0KLQkJCQotCQkJaWYgKGlPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9IGlPcGVyYXRpb24uZ2V0QWRkT3V0cHV0Q29tbWFuZCgpOwotCQkJICAgIENvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIEFTREVkaXRvclBsdWdpbi5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0JCQkgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLQkJCSAgICAKLQkJCSAgICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElBU0RBZGRDb21tYW5kKSB7Ci0JCQkgICAgCU9iamVjdCBvYmplY3QgPSAoKElBU0RBZGRDb21tYW5kKSBjb21tYW5kKS5nZXROZXdseUFkZGVkQ29tcG9uZW50KCk7Ci0JCQkgICAgCXBlcmZvcm1TZWxlY3Rpb24ob2JqZWN0KTsKLQkJCSAgICB9Ci0JCQl9Ci0JCX0gIAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkUGFyYW1ldGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkUGFyYW1ldGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MjJiY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZFBhcmFtZXRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0RBZGRQYXJhbWV0ZXJBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQVNEQWRkUGFyYW1ldGVyQWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgQVNEQWRkUGFyYW1ldGVyQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpICAgewotICAgICAgICBzdXBlcihwYXJ0KTsKLSAgICAgICAgc2V0SWQoSUQpOwotICAgICAgICBzZXRUZXh0KCJBZGQgUGFyYW1ldGVyIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvaW5wdXRfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLSAgICAgICAgICAgIElNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElNZXNzYWdlUmVmZXJlbmNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZXNzYWdlUmVmZXJlbmNlID0gKElNZXNzYWdlUmVmZXJlbmNlKW87Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJUGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVJlZmVyZW5jZSA9ICgoSU1lc3NhZ2VSZWZlcmVuY2UpICgoSVBhcmFtZXRlcikgbykuZ2V0T3duZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtZXNzYWdlUmVmZXJlbmNlIGluc3RhbmNlb2YgVzExTWVzc2FnZVJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgIFcxMU1lc3NhZ2VSZWZlcmVuY2UgdzExTWVzc2FnZVJlZmVyZW5jZSA9IChXMTFNZXNzYWdlUmVmZXJlbmNlKW1lc3NhZ2VSZWZlcmVuY2U7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSB3MTFNZXNzYWdlUmVmZXJlbmNlLmdldEFkZFBhcmFtdGVyQ29tbWFuZCgpOwotICAgICAgICAgICAgICAgIENvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIEFTREVkaXRvclBsdWdpbi5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgICAgICAgICAKLQkJCSAgICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElBU0RBZGRDb21tYW5kKSB7Ci0JCQkgICAgCU9iamVjdCBvYmplY3QgPSAoKElBU0RBZGRDb21tYW5kKSBjb21tYW5kKS5nZXROZXdseUFkZGVkQ29tcG9uZW50KCk7Ci0JCQkgICAgCXNlbGVjdEFuZERpcmVjdEVkaXQob2JqZWN0KTsKLQkJCSAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRTY2hlbWFBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRTY2hlbWFBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwNGIyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEQWRkU2NoZW1hQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklDYXRlZ29yeUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0RBZGRTY2hlbWFBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RBZGRTY2hlbWFBY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBBU0RBZGRTY2hlbWFBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkJewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1NDSEVNQSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3hzZF9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIElDYXRlZ29yeUFkYXB0ZXIpIHsKLQkJCQlvID0gKChJQ2F0ZWdvcnlBZGFwdGVyKSBvKS5nZXRPd25lckRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChvIGluc3RhbmNlb2YgSURlc2NyaXB0aW9uKSB7Ci0JCQkJQ29tbWFuZCBjb21tYW5kID0gKChJRGVzY3JpcHRpb24pIG8pLmdldEFkZFNjaGVtYUNvbW1hbmQoKTsKLQkJCSAgICBDb21tYW5kU3RhY2sgc3RhY2sgPSAoQ29tbWFuZFN0YWNrKSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOwotCQkJICAgIHN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkgICAgCi0JCQkgICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBJQVNEQWRkQ29tbWFuZCkgewotCQkJICAgIAlPYmplY3Qgb2JqZWN0ID0gKChJQVNEQWRkQ29tbWFuZCkgY29tbWFuZCkuZ2V0TmV3bHlBZGRlZENvbXBvbmVudCgpOwotCQkJICAgIAlwZXJmb3JtU2VsZWN0aW9uKG9iamVjdCk7Ci0JCQkgICAgfQotCQkJfQotCQl9ICAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZFNlcnZpY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RBZGRTZXJ2aWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjM2OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREFkZFNlcnZpY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLlNlcnZpY2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JQ2F0ZWdvcnlBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgQVNEQWRkU2VydmljZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24gewkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RBZGRTZXJ2aWNlQWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQVNEQWRkU2VydmljZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0VSVklDRSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3NlcnZpY2Vfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQotCQkJaWYgKG8gaW5zdGFuY2VvZiBJQ2F0ZWdvcnlBZGFwdGVyKSB7Ci0JCQkJbyA9ICgoSUNhdGVnb3J5QWRhcHRlcikgbykuZ2V0T3duZXJEZXNjcmlwdGlvbigpOwotCQkJfQotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIElEZXNjcmlwdGlvbikgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9ICgoSURlc2NyaXB0aW9uKSBvKS5nZXRBZGRTZXJ2aWNlQ29tbWFuZCgpOwotCQkJICAgIENvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIEFTREVkaXRvclBsdWdpbi5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0JCQkgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLQkJCSAgICAKLQkJCSAgICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElBU0RBZGRDb21tYW5kKSB7Ci0JCQkgICAgCU9iamVjdCBlbGVtZW50ID0gKChJQVNEQWRkQ29tbWFuZCkgY29tbWFuZCkuZ2V0TmV3bHlBZGRlZENvbXBvbmVudCgpOwotCQkJICAgIAlzZWxlY3RBbmREaXJlY3RFZGl0KGVsZW1lbnQpOwotCQkJICAgIH0KLQkJCX0KLQkJfSAgCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvRGlyZWN0RWRpdChFZGl0UGFydCBlcCkgewotCQlpZiAoZXAgaW5zdGFuY2VvZiBTZXJ2aWNlRWRpdFBhcnQpIHsKLQkJCSgoU2VydmljZUVkaXRQYXJ0KSBlcCkucGVyZm9ybURpcmVjdEVkaXQobnVsbCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRERlbGV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRERlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM0NTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0REZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklFbmRQb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBBU0REZWxldGVBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0REZWxldGVBY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBBU0REZWxldGVBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkJewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZGVsZXRlX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJdGVyYXRvciBpdCA9IGdldFNlbGVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQkJCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVNlcnZpY2UpIHsKLQkJCQljb21tYW5kID0gKChJU2VydmljZSkgb2JqZWN0KS5nZXREZWxldGVDb21tYW5kKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRW5kUG9pbnQpIHsKLQkJCQljb21tYW5kID0gKChJRW5kUG9pbnQpIG9iamVjdCkuZ2V0RGVsZXRlQ29tbWFuZCgpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUJpbmRpbmcpIHsKLQkJCQljb21tYW5kID0gKChJQmluZGluZykgb2JqZWN0KS5nZXREZWxldGVDb21tYW5kKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJSW50ZXJmYWNlKSB7Ci0JCQkJY29tbWFuZCA9ICgoSUludGVyZmFjZSkgb2JqZWN0KS5nZXREZWxldGVDb21tYW5kKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJT3BlcmF0aW9uKSB7Ci0JCQkJY29tbWFuZCA9ICgoSU9wZXJhdGlvbikgb2JqZWN0KS5nZXREZWxldGVDb21tYW5kKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJTWVzc2FnZVJlZmVyZW5jZSkgewotCQkJCWNvbW1hbmQgPSAoKElNZXNzYWdlUmVmZXJlbmNlKSBvYmplY3QpLmdldERlbGV0ZUNvbW1hbmQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQYXJhbWV0ZXIpIHsKLQkJCQljb21tYW5kID0gKChJUGFyYW1ldGVyKSBvYmplY3QpLmdldERlbGV0ZUNvbW1hbmQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElJbXBvcnQpIHsKLQkJCQljb21tYW5kID0gKChJSW1wb3J0KSBvYmplY3QpLmdldERlbGV0ZUNvbW1hbmQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElNZXNzYWdlKSB7Ci0JCQkJY29tbWFuZCA9ICgoSU1lc3NhZ2UpIG9iamVjdCkuZ2V0RGVsZXRlQ29tbWFuZCgpOwotCQkJfQotCQkJIC8vIFRPRE8gKGNzKSBQcm92aWRlIGdldERlbGV0ZUNvbW1hbmQoKSBvbiBBU0RPYmplY3QgdGhlbiBubyAnZWxzZSBpZicgdGVzdHMgbmVlZGVkIGF0IGFsbC4uLgotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVzExVHlwZSkgewotCQkJCWNvbW1hbmQgPSAoKFcxMVR5cGUpIG9iamVjdCkuZ2V0RGVsZXRlQ29tbWFuZCgpOwotCQkJfQotCQkJCi0JCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkgICAgQ29tbWFuZFN0YWNrIHN0YWNrID0gKENvbW1hbmRTdGFjaykgQVNERWRpdG9yUGx1Z2luLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKTsKLQkJCSAgICBzdGFjay5leGVjdXRlKGNvbW1hbmQpOwotCi0JCQkgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikgewotCQkJICAgIAlPYmplY3QgdGFyZ2V0ID0gKChXU0RMQmFzZUFkYXB0ZXIpIG9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCQkgICAgCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgewotCQkJICAgIAkJcGVyZm9ybVNlbGVjdGlvbigoKFdTRExFbGVtZW50KSB0YXJnZXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCQkgICAgCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCX0gIAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0REaXJlY3RFZGl0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNERGlyZWN0RWRpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ1YmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0REaXJlY3RFZGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkRpcmVjdEVkaXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQVNET2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgQVNERGlyZWN0RWRpdEFjdGlvbiBleHRlbmRzIERpcmVjdEVkaXRBY3Rpb24gewotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXI7Ci0JCi0JLyoqCi0JICogU2FtZSBhcyB7QGxpbmsgI0RpcmVjdEVkaXRBY3Rpb24oSVdvcmtiZW5jaFBhcnQpfS4KLQkgKiBAcGFyYW0gZWRpdG9yIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQVNERGlyZWN0RWRpdEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc3VwZXIoKElXb3JrYmVuY2hQYXJ0KWVkaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIERpcmVjdEVkaXRBY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJ0LgotCSAqIEBwYXJhbSBwYXJ0IHRoZSB3b3JrYmVuY2ggcGFydAotCSAqLwotCXB1YmxpYyBBU0REaXJlY3RFZGl0QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJc3VwZXIocGFydCk7Ci0JfQotCQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb24jZ2V0U2VsZWN0aW9uKCkKLQkgICAqLwotCSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLQkgIHsKLQkJICAvLyBJZiB3ZSdyZSBpbiB0aGlzIGFjdGlvbiwgd2UgYXNzdW1lIHRoZSBhY3Rpb24gd2FzIGluaXRpYXRlZCB2aWEgdGhlIGdyYXBoaWNhbCB2aWV3ZXIuCi0JCSAgLy8gV2UgdXNlIHRoZSBncmFwaGljYWwgdmlldyB0byBvYnRhaW4gdGhlIHNlbGVjdGVkIGVkaXQgcGFydCBiZWNhdXNlIGZvciB1cywgb25lIG1vZGVsCi0JCSAgLy8gbWF5IGRyaXZlIG1vcmUgdGhhbiBvbmUgZWRpdCBwYXJ0LiAgU28gd2UgbmVlZCB0byBmaW5kIHRoZSBleGFjdCBlZGl0IHBhcnQgd2Ugd2lzaCB0bwotCQkgIC8vIGRpcmVjdCBlZGl0LiAgVGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgZGV0ZXJtaW5pbmcgdGhlIGVkaXQgcGFydCB3b3VsZCBoYXZlIGJlZW4gdG8gZ28KLQkJICAvLyB0aHJvdWdoIHRoZSBzZWxlY3Rpb24gbWFuYWdlciwgdGhlbiB0aHJvdWdoIHRoZSBlZGl0IHBhcnQgcmVnaXN0cnkuICBIb3dldmVyLCB0aGUgc2VsZWN0aW9uCi0JCSAgLy8gbWFuYWdlciBvbmx5IHJldHVybnMgdGhlIG1vZGVsIG9iamVjdCAobm90IHRoZSBlZGl0IHBhcnQpLi4uLiBhbmQgc2luY2UgdGhlIG1vZGVsIG9iamVjdAotCQkgIC8vIG1heSBkcml2ZSBtb3JlIHRoYW4gb25lIGVkaXQgcGFydCwgdGhlIGVkaXQgcGFydCByZWdpc3RyeSBtYXkgcmV0dXJuIHRoZSAid3JvbmciIGVkaXQKLQkJICAvLyBwYXJ0IGZvciBkaXJlY3QgZWRpdGluZy4gIFRodXMgd2UgbG9vayBjYWxsIEdyYXBoaWNhbFZpZXdlci5nZXRGb2N1c0VkaXRQYXJ0KCkuCi0JCSAgSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCSAgT2JqZWN0IG9iamVjdCA9IGVkaXRvci5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0JCSAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdyYXBoaWNhbFZpZXdlcikgewotCQkJICBPYmplY3Qgc2VsZWN0aW9uID0gKChHcmFwaGljYWxWaWV3ZXIpIG9iamVjdCkuZ2V0Rm9jdXNFZGl0UGFydCgpOwotCQkJICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJICB9Ci0JICAgIAotCSAgICByZXR1cm4gc3VwZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JICB9Ci0JICAKLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI3NldFNlbGVjdGlvblByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyKQotCSAgICovCi0JICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpCi0JICB7Ci0JICAgIHN1cGVyLnNldFNlbGVjdGlvblByb3ZpZGVyKHByb3ZpZGVyKTsKLQkgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotCSAgfQotCSAgCi0JICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkgewotCQkgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCSAgCi0JCSAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElBU0RPYmplY3QpIHsKLQkJCSAgcmV0dXJuICAhKChJQVNET2JqZWN0KSBzZWxlY3Rpb24pLmlzUmVhZE9ubHkoKTsKLQkJICB9Ci0JCSAgCi0JCSAgcmV0dXJuIHRydWU7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNERHJhZ0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRERyYWdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkMWE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNERHJhZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFTRERyYWdBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwcm90ZWN0ZWQgR3JhcGhpY2FsRWRpdFBhcnQgbW92aW5nQ2hpbGRFZGl0UGFydDsKLQlwcm90ZWN0ZWQgUG9pbnQgcG9pbnRlckxvY2F0aW9uOwotCQotCXB1YmxpYyBBU0REcmFnQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJc3VwZXIocGFydCk7Ci0JfQotCQotCS8qCi0JICogU3ViLWNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcnVuKCk7Ci0JfQotCQotCS8qCi0JICogU3ViLWNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qCi0JICogU3ViLWNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldEZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRERyYWdSZW9yZGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNERHJhZ1Jlb3JkZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YTNlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNERHJhZ1Jlb3JkZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUFTRE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0REcmFnUmVvcmRlckFjdGlvbiBleHRlbmRzIEFTRERyYWdBY3Rpb24gewotCSAgcHJvdGVjdGVkIElBU0RPYmplY3QgbW92aW5nQ2hpbGQ7Ci0JICBwcm90ZWN0ZWQgSUFTRE9iamVjdCBuZXdQYXJlbnQ7Ci0JICBwcm90ZWN0ZWQgR3JhcGhpY2FsRWRpdFBhcnQgbGVmdFNpYmxpbmdFZGl0UGFydDsKLQkgIHByb3RlY3RlZCBHcmFwaGljYWxFZGl0UGFydCByaWdodFNpYmxpbmdFZGl0UGFydDsKLQkgIHByb3RlY3RlZCBJQVNET2JqZWN0IGxlZnRTaWJFbGVtZW50OwotCSAgcHJvdGVjdGVkIElBU0RPYmplY3QgcmlnaHRTaWJFbGVtZW50OwotCSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuTmV2ZXJFeGVjdXRlID0gZmFsc2U7Ci0JICAKLQkgIHB1YmxpYyBBU0REcmFnUmVvcmRlckFjdGlvbihHcmFwaGljYWxFZGl0UGFydCBtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBFZGl0UGFydCBwb2ludGVyRWRpdFBhcnQsIFBvaW50IHBvaW50ZXJMb2NhdGlvbikgewotCQkgIHN1cGVyKG51bGwpOwotCSAgCXRoaXMubW92aW5nQ2hpbGRFZGl0UGFydCA9IG1vdmluZ0NoaWxkRWRpdFBhcnQ7Ci0JICAJdGhpcy5wb2ludGVyTG9jYXRpb24gPSBwb2ludGVyTG9jYXRpb247Ci0KLQkJRWRpdFBhcnQgcG9zc2libGVQYXJlbnQgPSBnZXRQYXJlbnRFZGl0UGFydChwb2ludGVyRWRpdFBhcnQpOwotCQkKLQkJaWYgKCEocG9zc2libGVQYXJlbnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkpIHsKLQkJCWNhbk5ldmVyRXhlY3V0ZSA9IHRydWU7Ci0JCQlyZXR1cm47Ci0JCX0KLQkgIAkKLQkJR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0UGFyZW50RWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHBvc3NpYmxlUGFyZW50OwotCQkKLQkJaWYgKHBvaW50ZXJFZGl0UGFydC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0JCQkvLyBTb3J0IHRoZSBzaWJsaW5ncyAoYW5kIGl0c2VsZikKLQkJCUxpc3QgdGFyZ2V0RWRpdFBhcnRTaWJsaW5ncyA9IHBvaW50ZXJFZGl0UGFydC5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpOwotCQkJQ29sbGVjdGlvbnMuc29ydCh0YXJnZXRFZGl0UGFydFNpYmxpbmdzLCBuZXcgVmVydGljYWxFZGl0UGFydENvbXBhcmF0b3IoKSk7Ci0JICAKLQkJCS8vIEdldCAnbGVmdCcgYW5kICdyaWdodCcgc2libGluZ3MKLQkJCWxlZnRTaWJsaW5nRWRpdFBhcnQgPSBnZXRWZXJ0aWNhbExlZnRTaWJsaW5nKHRhcmdldEVkaXRQYXJ0U2libGluZ3MsIG1vdmluZ0NoaWxkRWRpdFBhcnQsIHBvaW50ZXJMb2NhdGlvbik7Ci0JCQlyaWdodFNpYmxpbmdFZGl0UGFydCA9IGdldFZlcnRpY2FsUmlnaHRTaWJsaW5nKHRhcmdldEVkaXRQYXJ0U2libGluZ3MsIG1vdmluZ0NoaWxkRWRpdFBhcnQsIHBvaW50ZXJMb2NhdGlvbik7ICAgICAgICAgICAJCi0KLQkJCWlmIChtb3ZpbmdDaGlsZEVkaXRQYXJ0ICE9IG51bGwpCi0JCQkJbW92aW5nQ2hpbGQgPSAoSUFTRE9iamVjdCkgbW92aW5nQ2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkKLQkJCQlsZWZ0U2liRWxlbWVudCA9IChJQVNET2JqZWN0KSBsZWZ0U2libGluZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkKLQkJCQlyaWdodFNpYkVsZW1lbnQgPSAoSUFTRE9iamVjdCkgcmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQotCQkJbmV3UGFyZW50ID0gKElBU0RPYmplY3QpIHRhcmdldFBhcmVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdQYXJlbnQgPSAoSUFTRE9iamVjdCkgdGFyZ2V0UGFyZW50RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCWxlZnRTaWJFbGVtZW50ID0gbnVsbDsKLQkJCXJpZ2h0U2liRWxlbWVudD0gbnVsbDsKLQkJfQotCSAgfQotCSAgICAgICAgICAgIAotCSAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0JICB7Ci0JICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JICAgIAotCSAgICBpZiAoY2FuTmV2ZXJFeGVjdXRlIHx8IG5ld1BhcmVudCA9PSBudWxsIHx8IG1vdmluZ0NoaWxkID09IG51bGwpIHsKLQkgICAgCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgICAKLQkgICAgaWYgKG1vdmluZ0NoaWxkIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkgICAgCUlNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYgPSAoSU1lc3NhZ2VSZWZlcmVuY2UpIG1vdmluZ0NoaWxkOwotCSAgICAJaWYgKG1lc3NhZ2VSZWYuZ2V0S2luZCgpID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfSU5QVVQgfHwgbWVzc2FnZVJlZi5nZXRLaW5kKCkgPT0gSU1lc3NhZ2VSZWZlcmVuY2UuS0lORF9PVVRQVVQpIHsKLQkgICAgCQlJTWVzc2FnZVJlZmVyZW5jZSBsZWZ0U2liTWVzc2FnZVJlZiA9IChJTWVzc2FnZVJlZmVyZW5jZSkgbGVmdFNpYkVsZW1lbnQ7Ci0KLQkgICAgCQlyZXN1bHQgPSB0cnVlOwotCSAgICAJCWlmIChsZWZ0U2liTWVzc2FnZVJlZiAhPSBudWxsKSB7Ci0JICAgIAkJCWlmIChsZWZ0U2liTWVzc2FnZVJlZi5nZXRLaW5kKCkgPT0gSU1lc3NhZ2VSZWZlcmVuY2UuS0lORF9GQVVMVCkgewotCSAgICAJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JICAgIAkJCX0KLQkgICAgCQl9Ci0JICAgIAkJaWYgKCEocmVzdWx0ICYmIG5ld1BhcmVudC5lcXVhbHMobWVzc2FnZVJlZi5nZXRPd25lck9wZXJhdGlvbigpKSkpIHsKLQkgICAgCQkJcmVzdWx0ID0gZmFsc2U7Ci0JICAgIAkJfQotCSAgICAJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKG1vdmluZ0NoaWxkIGluc3RhbmNlb2YgSVBhcmFtZXRlcikgewotCSAgICAJaWYgKG5ld1BhcmVudCBpbnN0YW5jZW9mIElNZXNzYWdlUmVmZXJlbmNlICYmIG5ld1BhcmVudC5lcXVhbHMoKChJUGFyYW1ldGVyKSBtb3ZpbmdDaGlsZCkuZ2V0T3duZXIoKSkpIHsKLQkgICAgCQlyZXN1bHQgPSB0cnVlOwotCSAgICAJfQotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gcmVzdWx0OwotCSAgfSAgICAgICAgICAgCi0KLQkgIC8qCi0JICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcnVuKCkKLQkgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLwkgICAgYmVnaW5SZWNvcmRpbmcoKTsKLQkgIAlpZiAoY2FuRXhlY3V0ZSgpKSB7Ci0JICAJCWlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIElNZXNzYWdlUmVmZXJlbmNlKSB7Ci0JICAJCQlPYmplY3QgbWVzc2FnZVJlZk93bmVyID0gKChJTWVzc2FnZVJlZmVyZW5jZSkgbW92aW5nQ2hpbGQpLmdldE93bmVyT3BlcmF0aW9uKCk7Ci0JICAJCQlpZiAobWVzc2FnZVJlZk93bmVyIGluc3RhbmNlb2YgSU9wZXJhdGlvbikgewotCSAgCQkJCUlNZXNzYWdlUmVmZXJlbmNlIGxlZnRTaWIgPSAoSU1lc3NhZ2VSZWZlcmVuY2UpIGxlZnRTaWJFbGVtZW50OwotCSAgCQkJCUlNZXNzYWdlUmVmZXJlbmNlIHJpZ2h0U2liID0gKElNZXNzYWdlUmVmZXJlbmNlKSByaWdodFNpYkVsZW1lbnQ7Ci0JICAJCQkJSU1lc3NhZ2VSZWZlcmVuY2UgbW92aW5nU2liID0gKElNZXNzYWdlUmVmZXJlbmNlKSBtb3ZpbmdDaGlsZDsKLQkgIAkJCQlDb21tYW5kIGNvbW1hbmQgPSAoKElPcGVyYXRpb24pIG1lc3NhZ2VSZWZPd25lcikuZ2V0UmVvcmRlck1lc3NhZ2VSZWZlcmVuY2VzQ29tbWFuZChsZWZ0U2liLCByaWdodFNpYiwgbW92aW5nU2liKTsKLQkgIAkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkgIAkJCX0KLQkgIAkJfQotCSAgCQllbHNlIGlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIElQYXJhbWV0ZXIpIHsKLQkgIAkJCU9iamVjdCBwYXJhbU93bmVyID0gKChJUGFyYW1ldGVyKSBtb3ZpbmdDaGlsZCkuZ2V0T3duZXIoKTsKLQkgIAkJCWlmIChwYXJhbU93bmVyIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkgIAkJCQlJUGFyYW1ldGVyIGxlZnRTaWIgPSAoSVBhcmFtZXRlcikgbGVmdFNpYkVsZW1lbnQ7Ci0JICAJCQkJSVBhcmFtZXRlciByaWdodFNpYiA9IChJUGFyYW1ldGVyKSByaWdodFNpYkVsZW1lbnQ7Ci0JICAJCQkJSVBhcmFtZXRlciBtb3ZpbmdTaWIgPSAoSVBhcmFtZXRlcikgbW92aW5nQ2hpbGQ7Ci0JICAJCQkJQ29tbWFuZCBjb21tYW5kID0gKChJTWVzc2FnZVJlZmVyZW5jZSkgcGFyYW1Pd25lcikuZ2V0UmVvcmRlclBhcmFtZXRlcnNDb21tYW5kKGxlZnRTaWIsIHJpZ2h0U2liLCBtb3ZpbmdTaWIpOwotCSAgCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCSAgCQkJfQotCSAgCQl9Ci0vLwkgIAkJd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vdmluZ0NoaWxkKSk7Ci0JICAJfQotLy8JICAgIGVuZFJlY29yZGluZygpOwotCSAgfQotCSAgCi0JICBwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpIHsKLQkgIAlJRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkgICAgaWYgKGZlZWRiYWNrRmlndXJlID09IG51bGwgJiYgbW92aW5nQ2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KQotCSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUG9seWxpbmUoKTsKLQkgICAgICAoKFBvbHlsaW5lKWZlZWRiYWNrRmlndXJlKS5zZXRMaW5lV2lkdGgoMik7CQotCSAgICAgIGRyYXdMaW5lcygoUG9seWxpbmUpIGZlZWRiYWNrRmlndXJlKTsKLQkgICAgfQotCSAgICAKLQkgIAlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JICB9Ci0KLQkgIC8qIFJldHVybiBhIFBvaW50TGlzdCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYWRkIGEgZmVlZGJhY2sgZmlndXJlLiAgVGhlIGZlZWRiYWNrIGZpZ3VyZSB3aWxsIGJlIGEKLQkgICAqIFBvbHlsaW5lIGNvbXBvc2VkIG9mIHRoZSBQb2ludHMgaW4gdGhlIFBvaW50TGlzdAotCSAgICovCi0JICBwcml2YXRlIFBvaW50TGlzdCBkcmF3TGluZXMoUG9seWxpbmUgcG9seUxpbmUpIHsKLQkgICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG5ldyBQb2ludExpc3QoKTsgCi0JICAgIAotCSAgICBpZiAobGVmdFNpYmxpbmdFZGl0UGFydCAhPSBudWxsKSB7Ci0JICAgIAlSZWN0YW5nbGUgbGVmdFJlY3RhbmdsZSA9IGxlZnRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCSAgIAlpbnQgeENvb3JkID0gbGVmdFJlY3RhbmdsZS54OwotCQkgIAlpbnQgeUNvb3JkID0gbGVmdFJlY3RhbmdsZS55OwotCQkgICAJaW50IGhlaWdodCA9IGxlZnRSZWN0YW5nbGUuaGVpZ2h0OwotCQkgICAJaW50IHdpZHRoID0gbGVmdFJlY3RhbmdsZS53aWR0aDsKLQotCQkgICAJLy8gRHJhdyBsZWZ0IGVuZCBsaW5lCi0JCSAgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQgKyAzLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCAtIDMpOwotCQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0IC0gMywgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQpOwotCQkgICAJCi0JCSAgIAkvLyBEcmF3IGhvcml6b250YWwgbGluZQotCQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0KTsKLQkJICAgCQotCQkgICAJLy8gRHJhdyByaWdodCBlbmQgbGluZQotCQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQgLSAzKTsKLQkJICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQgKyAzKTsgICAJCi0JICAgIH0KLQkgICAgZWxzZSBpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkgewotCSAgICAJUmVjdGFuZ2xlIHJpZ2h0UmVjdGFuZ2xlID0gcmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JICAgIAlpbnQgeENvb3JkID0gcmlnaHRSZWN0YW5nbGUueDsKLQkgICAgCWludCB5Q29vcmQgPSByaWdodFJlY3RhbmdsZS55OwotCSAgIAkJaW50IHdpZHRoID0gcmlnaHRSZWN0YW5nbGUud2lkdGg7CQotCi0JICAgCQkvLyBEcmF3IGxlZnQgZW5kIGxpbmUKLQkJICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIDMsIHhDb29yZCwgeUNvb3JkIC0gMyk7Ci0JCSAgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgLSAzLCB4Q29vcmQsIHlDb29yZCk7Ci0JCSAgIAkKLQkJICAgCS8vIERyYXcgaG9yaXpvbnRhbCBsaW5lCi0JCSAgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQpOwotCQkgICAJCi0JCSAgIAkvLyBEcmF3IHJpZ2h0IGVuZCBsaW5lCi0JCSAgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCAtIDMpOwotCQkgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIDMpOyAgIAotCSAgICB9Ci0KLQkgICAgcmV0dXJuIHBvaW50TGlzdDsKLQkgIH0gICAgICAgICAgICAgICAgICAgIAotCSAgCi0JICBwcm90ZWN0ZWQgUG9seWxpbmUgYWRkTGluZVRvUG9seWxpbmUoUG9seWxpbmUgcG9seWxpbmUsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotCQlwb2x5bGluZS5hZGRQb2ludChuZXcgUG9pbnQoeDEsIHkxKSk7Ci0JCXBvbHlsaW5lLmFkZFBvaW50KG5ldyBQb2ludCh4MiwgeTIpKTsKLQotCQlyZXR1cm4gcG9seWxpbmU7Ci0JICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAKLQkgIC8qCi0JICAgKiBQcmUtY29uZGl0aW9uOiBUaGUgTGlzdCBzaWJsaW5ncyBzaG91bGQgYmUgc29ydGVkIGJ5IGl0J3MgeS1jb29yZGluYXRlIAotCSAgICovCi0JICBwcml2YXRlIEdyYXBoaWNhbEVkaXRQYXJ0IGdldFZlcnRpY2FsUmlnaHRTaWJsaW5nKExpc3Qgc2libGluZ3MsIEdyYXBoaWNhbEVkaXRQYXJ0IG1vdmluZ0VkaXRQYXJ0LCBQb2ludCBwb2ludGVyTG9jYXRpb24pIHsKLQkgIAlHcmFwaGljYWxFZGl0UGFydCByaWdodFNpYmxpbmcgPSBudWxsOwotCSAgCWludCBwb2ludGVyWUxvY2F0aW9uID0gcG9pbnRlckxvY2F0aW9uLnk7Ci0KLQkgIAlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2libGluZ3Muc2l6ZSgpOyBpbmRleCsrKSB7Ci0JICAJCUdyYXBoaWNhbEVkaXRQYXJ0IHNpYmxpbmcgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCk7Ci0JICAJCWludCBzaWJsaW5nWUxvY2F0aW9uID0gc2libGluZy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55OwotCi0JICAJCWlmIChzaWJsaW5nWUxvY2F0aW9uID4gcG9pbnRlcllMb2NhdGlvbikgewotCSAgCQkJcmlnaHRTaWJsaW5nID0gc2libGluZzsKLQkgIAkJCWJyZWFrOwotCSAgCQl9Ci0JICAJfQotCSAgCQotCSAgCXJldHVybiByaWdodFNpYmxpbmc7Ci0JICB9Ci0KLQkgIC8qCi0JICAgKiBQcmUtY29uZGl0aW9uOiBUaGUgTGlzdCBzaWJsaW5ncyBzaG91bGQgYmUgc29ydGVkIGJ5IGl0J3MgeS1jb29yZGluYXRlIAotCSAgICovCi0JICBwcml2YXRlIEdyYXBoaWNhbEVkaXRQYXJ0IGdldFZlcnRpY2FsTGVmdFNpYmxpbmcoTGlzdCBzaWJsaW5ncywgR3JhcGhpY2FsRWRpdFBhcnQgbW92aW5nRWRpdFBhcnQsIFBvaW50IHBvaW50ZXJMb2NhdGlvbikgewotCSAgCUdyYXBoaWNhbEVkaXRQYXJ0IGxlZnRTaWJsaW5nID0gbnVsbDsKLQkgIAlpbnQgcG9pbnRlcllMb2NhdGlvbiA9IHBvaW50ZXJMb2NhdGlvbi55OwotCi0JICAJaW50IGluZGV4OwotCSAgCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNpYmxpbmdzLnNpemUoKTsgaW5kZXgrKykgewotCSAgCQlHcmFwaGljYWxFZGl0UGFydCBzaWJsaW5nID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXgpOwotCSAgCQlpbnQgc2libGluZ1lMb2NhdGlvbiA9IHNpYmxpbmcuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueTsKLQkgIAkgIAkKLQkgIAkJaWYgKHNpYmxpbmdZTG9jYXRpb24gPiBwb2ludGVyWUxvY2F0aW9uKSB7Ci0JICAJCQlpZiAoaW5kZXggPiAwKSB7Ci0JICAJCQkJbGVmdFNpYmxpbmcgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotCSAgCQkJfQotCi0JICAJCQlicmVhazsKLQkgIAkJfQotCSAgCX0KLQotCSAgCWlmIChpbmRleCA9PSBzaWJsaW5ncy5zaXplKCkpIHsKLQkgIAkJbGVmdFNpYmxpbmcgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotCSAgCX0KLQotCSAgCXJldHVybiBsZWZ0U2libGluZzsKLQkgIH0KLQkgIAotCSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldFBhcmVudEVkaXRQYXJ0KEVkaXRQYXJ0IHRhcmdldCkKLQkgIHsKLQkgIAlyZXR1cm4gdGFyZ2V0LmdldFBhcmVudCgpOwotCSAgfQotCi0JICBwcml2YXRlIGNsYXNzIFZlcnRpY2FsRWRpdFBhcnRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JICAJCi0JICAJcHVibGljIFZlcnRpY2FsRWRpdFBhcnRDb21wYXJhdG9yKCkgewotCSAgCX0KLQkgIAkKLQkgIAlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IHBhcnQxLCBPYmplY3QgcGFydDIpIHsKLQkgIAkJaW50IGNvbXBhcmVWYWx1ZSA9IDA7Ci0KLQkgIAkJaWYgKHBhcnQxIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQgJiYgcGFydDIgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCSAgCQkJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQxID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0MTsKLQkgIAkJCUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0MiA9IChHcmFwaGljYWxFZGl0UGFydCkgcGFydDI7Ci0JICAJCQkKLQkgIAkJCWludCBlZGl0UGFydDFZID0gZWRpdFBhcnQxLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpLnk7Ci0JICAJCQlpbnQgZWRpdFBhcnQyWSA9IGVkaXRQYXJ0Mi5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55OwotCSAgCQkJCi0JICAJCQlJbnRlZ2VyIGludGVnZXJQYXJ0MSA9IG5ldyBJbnRlZ2VyKGVkaXRQYXJ0MVkpOwotCSAgCQkJSW50ZWdlciBpbnRlZ2VyUGFydDIgPSBuZXcgSW50ZWdlcihlZGl0UGFydDJZKTsKLQkgIAkJCQotCSAgCQkJY29tcGFyZVZhbHVlID0gaW50ZWdlclBhcnQxLmNvbXBhcmVUbyhpbnRlZ2VyUGFydDIpOwotCSAgCQl9Ci0KLQkgIAkJcmV0dXJuIGNvbXBhcmVWYWx1ZTsKLQkgIAl9Ci0JICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTREVkaXROYW1lc3BhY2VzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNERWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViNzI3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNERWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5jb21tYW5kcy5XMTFFZGl0TmFtZXNwYWNlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBBU0RFZGl0TmFtZXNwYWNlc0FjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTREVkaXROYW1lc3BhY2VzQWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIElEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgQVNERWRpdE5hbWVzcGFjZXNBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgSURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCVN0cmluZyB0ZXh0ID0gTWVzc2FnZXMuX1VJX0VESVRfTkFNRVNQQUNFUzsgLy8kTk9OLU5MUy0xJAotCQlzZXRUZXh0KHRleHQpOwotCQkKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCU9iamVjdCBvID0gZGVzY3JpcHRpb247Ci0JCWlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElDYXRlZ29yeUFkYXB0ZXIpIHsKLQkJCQlvID0gKChJQ2F0ZWdvcnlBZGFwdGVyKSBvKS5nZXRPd25lckRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChvIGluc3RhbmNlb2YgSURlc2NyaXB0aW9uKSB7Ci0JCQkvLyBUT0RPOiBUaGUgY29kZSBiZWxvdyBpcyBub3QgZ2VuZXJpYy4gIFdlIG5lZWQgdG8gcmV2aXNpdCB0aGlzIHRvIGVuc3VyZSBpdCBpcwotCQkJLy8gZ2VuZXJpYy4gIElEZXNjcmlwdGlvbiBuZWVkcyBhIGdldE5hbWVzcGFjZXNJbmZvKCkgYW5kIGdldEVkaXROYW1lc3BhY2VzQ29tbWFuZCgpLi4uCi0JCQlJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoSURlc2NyaXB0aW9uKSBvOwotCQkJVzExRGVzY3JpcHRpb24gdzExRGVzY3JpcHRpb24gPSAoVzExRGVzY3JpcHRpb24pIG87Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgdzExRGVzY3JpcHRpb24uZ2V0VGFyZ2V0KCk7Ci0JCQkKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLQkJCUxpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSB3MTFEZXNjcmlwdGlvbi5nZXROYW1lc3BhY2VzSW5mbygpOwotCQkJU3RyaW5nIHRucyA9IGRlc2NyaXB0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQkJRWRpdE5hbWVzcGFjZXNEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VzRGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgcGF0aCwgTWVzc2FnZXMuX1VJX0VESVRfTkFNRVNQQUNFU19ESUFMT0dfVElUTEUsIHRucywgbmFtZXNwYWNlSW5mb0xpc3QpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotCQkJaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQlMaXN0IG5ld0luZm9MaXN0ID0gZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0JCQkJVzExRWRpdE5hbWVzcGFjZXNDb21tYW5kIGNvbW1hbmQgPSAoVzExRWRpdE5hbWVzcGFjZXNDb21tYW5kKSB3MTFEZXNjcmlwdGlvbi5nZXRFZGl0TmFtZXNwYWNlc0NvbW1hbmQoKTsKLQkJCQljb21tYW5kLnNldE5hbWVzcGFjZXNJbmZvKG5ld0luZm9MaXN0KTsKLQkJCQljb21tYW5kLnNldFRhcmdldE5hbWVzcGFjZShkaWFsb2cuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQkJCUNvbW1hbmRTdGFjayBzdGFjayA9IChDb21tYW5kU3RhY2spIEFTREVkaXRvclBsdWdpbi5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0JCQkgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLQkJICAgIH0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RHZW5lcmF0ZUJpbmRpbmdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RHZW5lcmF0ZUJpbmRpbmdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZGI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNER2VuZXJhdGVCaW5kaW5nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUJpbmRpbmc7Ci0KLXB1YmxpYyBjbGFzcyBBU0RHZW5lcmF0ZUJpbmRpbmdBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RHZW5lcmF0ZUJpbmRpbmdBY3Rpb25uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQVNER2VuZXJhdGVCaW5kaW5nQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfR0VORVJBVEVfQklORElOR19DT05URU5UKTsgICAvLyROT04tTkxTLTEkCi0vLwkJc2V0SW1hZ2VEZXNjcmlwdG9yKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9pbnB1dF9vYmouZ2lmIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQotCQkJaWYgKG8gaW5zdGFuY2VvZiBJQmluZGluZykgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9ICgoSUJpbmRpbmcpIG8pLmdldEdlbmVyYXRlQmluZGluZ0NvbW1hbmQoKTsKLQkJCSAgICBDb21tYW5kU3RhY2sgc3RhY2sgPSAoQ29tbWFuZFN0YWNrKSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOwotCQkJICAgIHN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQl9Ci0JCX0gIAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RPcGVuU2NoZW1hQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNET3BlblNjaGVtYUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjExY2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RPcGVuU2NoZW1hQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnV0aWwuSU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlcjsKLQotcHVibGljIGNsYXNzIEFTRE9wZW5TY2hlbWFBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RPcGVuU2NoZW1hQWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQVNET3BlblNjaGVtYUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9PUEVOX1NDSEVNQSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvYmluZGluZ19vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEFTRE11bHRpUGFnZUVkaXRvcikgewotCQkJCQlJT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyIGhlbHBlciA9ICgoQVNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3IpLmdldE9wZW5FeHRlcm5hbEVkaXRvckhlbHBlcigpOwotCQkJCQloZWxwZXIuc2V0TW9kZWwobyk7Ci0JCQkJCWhlbHBlci5vcGVuRXh0ZXJuYWxFZGl0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gIAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEU2V0RXhpc3RpbmdCaW5kaW5nQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEU2V0RXhpc3RpbmdCaW5kaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Nzg1MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRFNldEV4aXN0aW5nQmluZGluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUVuZFBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBBU0RTZXRFeGlzdGluZ0JpbmRpbmdBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBU0RTZXRFeGlzdGluZ0JpbmRpbmdBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElFbmRQb2ludCBlbmRQb2ludDsKLQkKLQlwdWJsaWMgQVNEU2V0RXhpc3RpbmdCaW5kaW5nQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0VYSVNUSU5HX0JJTkRJTkcpOyAvLyROT04tTkxTLTEkCi0vLwkJc2V0SW1hZ2VEZXNjcmlwdG9yKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9zZXJ2aWNlX29iai5naWYiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElFbmRQb2ludChJRW5kUG9pbnQgZW5kUG9pbnQpIHsKLQkJdGhpcy5lbmRQb2ludCA9IGVuZFBvaW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7CQkKLQkJaWYgKGVuZFBvaW50ID09IG51bGwpIHsKLQkJCWlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJT2JqZWN0IG8gPSBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJRW5kUG9pbnQpIHsKLQkJCQkJZW5kUG9pbnQgPSAoSUVuZFBvaW50KSBvOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVmTWFuYWdlciA9IFJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyLmdldEJpbmRpbmdSZWZlcmVuY2VFZGl0TWFuYWdlcihlbmRQb2ludCk7Ci0JCWlmIChlbmRQb2ludCAhPSBudWxsICYmIHJlZk1hbmFnZXIgIT0gbnVsbCkgewotCQkJSUNvbXBvbmVudERpYWxvZyBkaWFsb2cgPSByZWZNYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotCQkJaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0JCQkJcmVmTWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoZW5kUG9pbnQsIHNwZWMpOwotCQkJfQotCQl9Ci0JCQotCQllbmRQb2ludCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRFNldEV4aXN0aW5nSW50ZXJmYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEU2V0RXhpc3RpbmdJbnRlcmZhY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwNWNhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEU2V0RXhpc3RpbmdJbnRlcmZhY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBBU0RTZXRFeGlzdGluZ0ludGVyZmFjZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTRFNldEV4aXN0aW5nSW50ZXJmYWNlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJQmluZGluZyBiaW5kaW5nOwotCQotCXB1YmxpYyBBU0RTZXRFeGlzdGluZ0ludGVyZmFjZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9FWElTVElOR19QT1JUVFlQRSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlzZXRJbWFnZURlc2NyaXB0b3IoV1NETEVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3NlcnZpY2Vfb2JqLmdpZiIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SUJpbmRpbmcoSUJpbmRpbmcgYmluZGluZykgewotCQl0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7CQkKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotCQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElCaW5kaW5nKSB7Ci0JCQkJCWJpbmRpbmcgPSAoSUJpbmRpbmcpIG87Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZWZNYW5hZ2VyID0gUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXIuZ2V0SW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIoYmluZGluZyk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwgJiYgcmVmTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlJQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IHJlZk1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0JCQlpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkJCQlyZWZNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShiaW5kaW5nLCBzcGVjKTsKLQkJCX0KLQkJfQotCQkKLQkJYmluZGluZyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRFNldE5ld0JpbmRpbmdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9BU0RTZXROZXdCaW5kaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZGE5OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRFNldE5ld0JpbmRpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklFbmRQb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgQVNEU2V0TmV3QmluZGluZ0FjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTRFNldE5ld0JpbmRpbmdBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElFbmRQb2ludCBlbmRQb2ludDsKLQkKLQlwdWJsaWMgQVNEU2V0TmV3QmluZGluZ0FjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQl7Ci0JCXN1cGVyKHBhcnQpOwotCQlzZXRJZChJRCk7Ci0JCXNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVdfQklORElORyk7IC8vJE5PTi1OTFMtMSQKLS8vCQlzZXRJbWFnZURlc2NyaXB0b3IoV1NETEVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3NlcnZpY2Vfb2JqLmdpZiIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SUVuZFBvaW50KElFbmRQb2ludCBlbmRQb2ludCkgewotCQl0aGlzLmVuZFBvaW50ID0gZW5kUG9pbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQotCQlpZiAoZW5kUG9pbnQgPT0gbnVsbCkgewotCQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElFbmRQb2ludCkgewotCQkJCQllbmRQb2ludCA9IChJRW5kUG9pbnQpIG87Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZWZNYW5hZ2VyID0gUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXIuZ2V0QmluZGluZ1JlZmVyZW5jZUVkaXRNYW5hZ2VyKGVuZFBvaW50KTsKLSAgICAgICAgaWYgKGVuZFBvaW50ICE9IG51bGwgJiYgcmVmTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlJQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IHJlZk1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0JCQlpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkJCQlyZWZNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShlbmRQb2ludCwgc3BlYyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWVuZFBvaW50ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEU2V0TmV3SW50ZXJmYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2FjdGlvbnMvQVNEU2V0TmV3SW50ZXJmYWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYWVjNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0FTRFNldE5ld0ludGVyZmFjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5SZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLQotcHVibGljIGNsYXNzIEFTRFNldE5ld0ludGVyZmFjZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFTRFNldE5ld0ludGVyZmFjZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgSUJpbmRpbmcgYmluZGluZzsKLQkKLQlwdWJsaWMgQVNEU2V0TmV3SW50ZXJmYWNlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCXsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX05FV19QT1JUVFlQRSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlzZXRJbWFnZURlc2NyaXB0b3IoV1NETEVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3NlcnZpY2Vfb2JqLmdpZiIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SUJpbmRpbmcoSUJpbmRpbmcgYmluZGluZykgewotCQl0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7CQkKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotCQkJaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApIHsKLQkJCQlPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElCaW5kaW5nKSB7Ci0JCQkJCWJpbmRpbmcgPSAoSUJpbmRpbmcpIG87Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZWZNYW5hZ2VyID0gUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXIuZ2V0SW50ZXJmYWNlUmVmZXJlbmNlRWRpdE1hbmFnZXIoYmluZGluZyk7Ci0JCWlmIChiaW5kaW5nICE9IG51bGwgJiYgcmVmTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlJQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IHJlZk1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0JCQlpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkJCQlyZWZNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShiaW5kaW5nLCBzcGVjKTsKLQkJCX0KLQkJfQotCQkKLQkJYmluZGluZyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0Jhc2VTZWxlY3Rpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9CYXNlU2VsZWN0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NzUwMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0Jhc2VTZWxlY3Rpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5BYnN0cmFjdE1vZGVsQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMQWRhcHRlckZhY3RvcnlIZWxwZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2VsZWN0aW9uQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQk1FTlVfU1RBUlRfSUQgPSAiU1VCTUVOVV9TVEFSVF9JRDogIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNRU5VX0VORF9JRCA9ICJTVUJNRU5VX0VORF9JRDogIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcjsKLSAgCi0gIHB1YmxpYyBCYXNlU2VsZWN0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlNlbGVjdGlvbkFjdGlvbiNnZXRTZWxlY3Rpb24oKQotICAgKi8KLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIC8vIGFsd2F5cyBnZXQgc2VsZWN0aW9uIGZyb20gc2VsZWN0aW9uIHByb3ZpZGVyIGZpcnN0Ci0gICAgaWYgKHByb3ZpZGVyIT1udWxsKQotICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotICAgIAotICAgIHJldHVybiBzdXBlci5nZXRTZWxlY3Rpb24oKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI3NldFNlbGVjdGlvblByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uUHJvdmlkZXIoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKQotICB7Ci0gICAgc3VwZXIuc2V0U2VsZWN0aW9uUHJvdmlkZXIocHJvdmlkZXIpOwotICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRPYmplY3RzKCkKLSAgewotCSAgTGlzdCBwcm9jZXNzZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgTGlzdCBvYmplY3RzID0gc3VwZXIuZ2V0U2VsZWN0ZWRPYmplY3RzKCk7Ci0JICBJdGVyYXRvciBpdCA9IG9iamVjdHMuaXRlcmF0b3IoKTsKLQkgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJICBPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKSB7Ci0JCQkgIHByb2Nlc3NlZE9iamVjdHMuYWRkKCgoQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24pIGl0ZW0pLmdldE1vZGVsKCkpOwotCQkgIH0KLQkJICBlbHNlIHsKLQkJCSAgcHJvY2Vzc2VkT2JqZWN0cy5hZGQoaXRlbSk7Ci0JCSAgfQotCSAgfQotCSAgCi0JICByZXR1cm4gcHJvY2Vzc2VkT2JqZWN0czsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JICAKLQkgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQVNET2JqZWN0KSB7Ci0JCSAgcmV0dXJuICAhKChJQVNET2JqZWN0KSBzZWxlY3Rpb24pLmlzUmVhZE9ubHkoKTsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNlbGVjdEFuZERpcmVjdEVkaXQoZmluYWwgT2JqZWN0IG8pIHsKLQkgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCSAgaWYgKG8gaW5zdGFuY2VvZiBOb3RpZmllcikgewotCQkJCSAgcGVyZm9ybVNlbGVjdGlvbihvKTsKLQkJCQkgIGFjdGl2YXRlRGlyZWN0RWRpdCgpOwotCQkJICB9Ci0JCSAgfX07Ci0JCSAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVEaXJlY3RFZGl0KCkgewotCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQlpZiAoIShwYXJ0IGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpKSB7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCU9iamVjdCBncmFwaGljYWxWaWV3ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotCQkJaWYgKGdyYXBoaWNhbFZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpIHsKLQkJCQlBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IChBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKSBncmFwaGljYWxWaWV3ZXI7Ci0JCQkJT2JqZWN0IG9iaiA9IHZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkvLyB0b2RvOiBybWFoOiB3ZSBuZWVkIHRvIGNvbXBsZXRlbHkgcmVtb3ZlIGFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgZG9EaXJlY3RFZGl0KCkuCi0JCQkJLy8gVXNlIHBlcmZvcm1SZXF1ZXN0KCkgaW5zdGVhZC4KLS8vCQkJCWRvRGlyZWN0RWRpdCgoRWRpdFBhcnQpIG9iaik7Ci0JCQkJUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoKTsKLQkJCQlyZXF1ZXN0LnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQpOwotCQkJCSgoRWRpdFBhcnQpIG9iaikucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXJlY3RFZGl0KEVkaXRQYXJ0IGVwKSB7Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCk7Ci0JCXJlcXVlc3Quc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCk7Ci0JCWVwLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotCX0KLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2VsZWN0aW9uKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETzogV2Ugc2hvdWxkbid0IGtub3cgYWJvdXQgV1NETEJhc2VBZGFwdGVyIGhlcmUuLi4uCi0gICAgCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMQmFzZUFkYXB0ZXIpIHsKLSAgICAJCW9iamVjdCA9ICgoV1NETEJhc2VBZGFwdGVyKSBvYmplY3QpLmdldFRhcmdldCgpOwotICAgIAl9Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIE5vdGlmaWVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlOb3RpZmllciBlbGVtZW50ID0gKE5vdGlmaWVyKSBvYmplY3Q7Ci0JCQotICAgIAl0cnkgewotCQkJLy8gVE9ETzogV2Ugc2hvdWxkbid0IGtub3cgYWJvdXQgV1NETEFkYXB0ZXJGYWN0b3J5SGVscGVyIGhlcmUuLi4uCi0JICAgIAlPYmplY3QgYWRhcHRlZCA9IFdTRExBZGFwdGVyRmFjdG9yeUhlbHBlci5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW1lbnQpOwotCSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JICAgICAgICBpZiAoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKSAhPSBudWxsKSB7Ci0JICAgICAgICAJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLQkgICAgICAgIAlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCSAgICAgICAgCQlwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlZCkpOwotCSAgICAgICAgCX0KLQkgICAgICAgIH0KLSAgICAJfQotICAgIAljYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9JQVNEQWRkQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0lBU0RBZGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MmVlMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL0lBU0RBZGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFTREFkZENvbW1hbmQgewotCXB1YmxpYyBPYmplY3QgZ2V0TmV3bHlBZGRlZENvbXBvbmVudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL1Nob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9hY3Rpb25zL1Nob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQ0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvYWN0aW9ucy9TaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLQotCi0vKioKLSAqIFNob3cgdGhlIHByb3BlcnRpZXMgdmlldyBpbiB0aGUgY3VycmVudCBwZXJzcGVjdGl2ZS4KLSAqLwotcHVibGljIGNsYXNzIFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiOyAvLyROT04tTkxTLTEkCi0JCi0gIHByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGVuYWJsZWRJbWFnZSwgZGlzYWJsZWRJbWFnZTsKLQotCXB1YmxpYyBTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTKTsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLSAgICBzZXRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oImljb25zL2VsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIikgKTsgLy8kTk9OLU5MUy0xJAotCSAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQVNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oImljb25zL2RsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIikgKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRXb3JrYmVuY2hQYXJ0KCkuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5zaG93VmlldyhQUk9QRVJUSUVTX1ZJRVdfSUQpOwotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKQotICAgIHsKLQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL0Rlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGQyMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLkNvbHVtbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29udGV4dE1lbnVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZU1hbmFnZXI7Ci0KLQotcHVibGljIGNsYXNzIERlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyIGV4dGVuZHMgQ29udGV4dE1lbnVQcm92aWRlcgotewotICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBHcmFwaENvbnRleHRNZW51UHJvdmlkZXIuCi0gICAqIAotICAgKiBAcGFyYW0gc2VsZWN0aW9uUHJvdmlkZXIKLSAgICogQHBhcmFtIGVkaXRvcgotICAgKi8KLSAgcHVibGljIERlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKQotICB7Ci0gICAgc3VwZXIodmlld2VyKTsKLSAgICB0aGlzLnNlbGVjdGlvblByb3ZpZGVyID0gc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0QXBwcm9wcmlhdGVTZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGlvbikgewotCSAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIENvbHVtbkVkaXRQYXJ0KSB7Ci0JCSAgcmV0dXJuICgoRWRpdFBhcnQpIHNlbGVjdGlvbikuZ2V0UGFyZW50KCk7Ci0JICB9Ci0JICAKLQkgIHJldHVybiBzZWxlY3Rpb247Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQ29udGV4dE1lbnVQcm92aWRlciNidWlsZENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIsCi0gICAqICAgICAgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyKQotICAgKi8KLSAgcHVibGljIHZvaWQgYnVpbGRDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkKLSAgewotCUlNZW51TWFuYWdlciBjdXJyZW50TWVudSA9IG1lbnU7Ci0gICAgCi0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihFZGl0b3JNb2RlTWFuYWdlci5jbGFzcyk7Ci0JQ29udGV4dE1lbnVQYXJ0aWNpcGFudCBjb250ZXh0TWVudVBhcnRpY2lwYW50ID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRDdXJyZW50TW9kZSgpLmdldENvbnRleHRNZW51UGFydGljaXBhbnQoKSA6IG51bGw7Ci0KLSAgICAgICAgCi0gICAgY3VycmVudE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBPYmplY3QgYWN0aXZlUGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgc2VsZWN0ZWRPYmplY3QgPSBnZXRBcHByb3ByaWF0ZVNlbGVjdGlvbihzZWxlY3RlZE9iamVjdCk7Ci0KLSAgICAgIGlmIChjb250ZXh0TWVudVBhcnRpY2lwYW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIENvbnZlcnQgZWRpdHBhcnRzIHRvIG1vZGVsIG9iamVjdHMgYXMgc2VsZWN0aW9ucwotICAgICAgICBPYmplY3QgbyA9IHNlbGVjdGVkT2JqZWN0OwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgbyA9ICgoRWRpdFBhcnQpc2VsZWN0ZWRPYmplY3QpLmdldE1vZGVsKCk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGNvbnRleHRNZW51UGFydGljaXBhbnQuY29udHJpYnV0ZUFjdGlvbnMobywgbWVudSk7Ci0gICAgICB9ICAKLSAgICAgIAotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUFjdGlvblByb3ZpZGVyKQotICAgICAgewotICAgICAgICBJQWN0aW9uUHJvdmlkZXIgYWN0aW9uUHJvdmlkZXIgPSAoSUFjdGlvblByb3ZpZGVyKSBzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IGFjdGlvblByb3ZpZGVyLmdldEFjdGlvbnMoYWN0aXZlUGFydCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpZCA9IGFjdGlvbnNbaV07ICAgICAgICAgIAotICAgICAgICAgIGlmIChjb250ZXh0TWVudVBhcnRpY2lwYW50ID09IG51bGwgfHwgY29udGV4dE1lbnVQYXJ0aWNpcGFudC5pc0FwcGxpY2FibGUoc2VsZWN0ZWRPYmplY3QsIGlkKSkKLSAgICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEKSkgewotICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGlkLnN1YnN0cmluZyhCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICBJTWVudU1hbmFnZXIgc3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcih0ZXh0KTsKLSAgICAgICAgICAgICAgY3VycmVudE1lbnUuYWRkKHN1Yk1lbnUpOwotICAgICAgICAgICAgICBjdXJyZW50TWVudSA9IHN1Yk1lbnU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpZC5zdGFydHNXaXRoKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpKSB7Ci0gICAgICAgICAgICAgIGN1cnJlbnRNZW51ID0gZ2V0UGFyZW50TWVudShtZW51LCBjdXJyZW50TWVudSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihpZCk7Ci0gICAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjdGlvbi5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50TWVudS5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9ICAgICAKLSAgICAgICAgCi0gICAgICAgIG1lbnUuYWRkKHJlZ2lzdHJ5LmdldEFjdGlvbihTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpKTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsgICAgICAgCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInJlZmFjdG9yaW5nLXNsb3QtdGVtcCIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsgICAgICAgCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInNlYXJjaF9zbG90X3RlbXAiKSk7ICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElNZW51TWFuYWdlciBnZXRQYXJlbnRNZW51KElNZW51TWFuYWdlciByb290LCBJTWVudU1hbmFnZXIgY2hpbGQpIHsKLQkgIElNZW51TWFuYWdlciBwYXJlbnQgPSBudWxsOwotCSAgCi0JICBJQ29udHJpYnV0aW9uSXRlbVtdIGtpZHMgPSByb290LmdldEl0ZW1zKCk7Ci0JICBpbnQgaW5kZXggPSAwOwotCSAgd2hpbGUgKGluZGV4IDwga2lkcy5sZW5ndGggJiYgcGFyZW50ID09IG51bGwpIHsKLQkJICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0ga2lkc1tpbmRleF07Ci0JCSAgaWYgKGl0ZW0uZXF1YWxzKGNoaWxkKSkgewotCQkJICBwYXJlbnQgPSByb290OwotCQkgIH0KLQkJICBlbHNlIHsKLQkJCSAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLQkJCQkgIHBhcmVudCA9IGdldFBhcmVudE1lbnUoKElNZW51TWFuYWdlcikgaXRlbSwgY2hpbGQpOwotCQkJICB9Ci0JCSAgfQotCQkgIGluZGV4Kys7Ci0JICB9Ci0JICAKLQkgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLSAgcHJvdGVjdGVkIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0KLSAgcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKQotICB7Ci0gICAgaWYgKGNvbW1hbmRTdGFjayA9PSBudWxsKQotICAgICAgY29tbWFuZFN0YWNrID0gZ2V0Vmlld2VyKCkuZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotICAgIHJldHVybiBjb21tYW5kU3RhY2s7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL0Rlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL0Rlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwMmE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5CYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29tbW9uU2VsZWN0aW9uTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIgZXh0ZW5kcyBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBBU0RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBBU0RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKTsKLS8vVE9ETyBNYWtlIHRoaXMgZ2VuZXJpYwotCSAgcHVibGljIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIoSUVkaXRvclBhcnQgZWRpdG9yLCBDb21tb25TZWxlY3Rpb25NYW5hZ2VyIG1hbmFnZXIpCi0JICB7Ci0JICAgIHN1cGVyKCk7Ci0JICAgIHNldENvbnRleHRNZW51KG5ldyBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlcih0aGlzLCB0aGlzKSk7Ci0JICAgIGVkaXRvci5nZXRFZGl0b3JTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgib3JnLmVjbGlwc2Uud3N0LndzZGwuZWRpdG9yLnBvcHVwLmdyYXBoIiwgZ2V0Q29udGV4dE1lbnUoKSwgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkgICAgLy8gbWFrZSB0aGUgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciBsaXN0ZW4gdG8gZ3JhcGggdmlldyBzZWxlY3Rpb24gY2hhbmdlcwotCSAgICBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcik7ICAgIAotCSAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihtYW5hZ2VyKTsKLQkgICAgbWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7ICAKLSAgICAgICAgCi0JICAgIHNldEtleUhhbmRsZXIobmV3IEJhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyKHRoaXMpKTsKLQkgIH0KLQkgIAotCSAgLy8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gc29tZXRoaW5nIGNoYW5nZXMgaW4gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyCi0JICAvLyAoZS5nLiBhIHNlbGVjdGlvbiBvY2N1cmVkIGZyb20gYW5vdGhlciB2aWV3KQotCSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JICB7Ci0JICAgIE9iamVjdCBzZWxlY3RlZE9iamVjdCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCSAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgIT0gaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcikKLQkgICAgewotCSAgICAJRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRFZGl0UGFydChnZXRSb290RWRpdFBhcnQoKSwgc2VsZWN0ZWRPYmplY3QpOwotCSAgICAJaWYgKGVkaXRQYXJ0ICE9IG51bGwpCi0JICAgIAl7Ci0JICAgIAkJc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRQYXJ0KSk7Ci0JICAgIAl9ICAgCi0JICAgIH0KLQkgIH0KLQkgIAotCSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldEVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBPYmplY3QgbW9kZWwpICAKLQkgIHsgICAgICAgICAgICAgICAgICAgICAKLQkgICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLQkgICAgaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgPT0gbW9kZWwpCi0JICAgIHsKLQkgICAgICByZXN1bHQgPSBlZGl0UGFydDsgICAgICAKLQkgICAgfSAgICAgICAgICAgICAgICAgICAKLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgZm9yIChJdGVyYXRvciBpID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCSAgICAgIHsKLQkgICAgICAgIHJlc3VsdCA9IGdldEVkaXRQYXJ0KChFZGl0UGFydClpLm5leHQoKSwgbW9kZWwpOwotCSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotCSAgICAgICAgewotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLQkgIH0KLQkgIAotCi0gICAgICAvKgotCSAgICogV2UgbmVlZCB0byBjb252ZXJ0IGZyb20gZWRpdCBwYXJ0IHNlbGVjdGlvbnMgdG8gbW9kZWwgb2JqZWN0IHNlbGVjdGlvbnMKLQkgICAqLwotCSAgY2xhc3MgQVNEU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0JICB7Ci0JICAgIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQotCSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQkgICAgewotCSAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JICAgIHsKLQkgICAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0JICAgIHsKLQkgICAgICByZXR1cm4gc2VsZWN0aW9uOwotCSAgICB9Ci0KLQkgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkgICAgewotCSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JICAgICAgewotCSAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBpLm5leHQoKTsKLQkgICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCSAgICAgIH0KLQkgICAgfQotCi0JICAgIHB1YmxpYyBTdHJ1Y3R1cmVkU2VsZWN0aW9uIGNvbnZlcnRTZWxlY3Rpb25Gcm9tRWRpdFBhcnRUb01vZGVsKElTZWxlY3Rpb24gZWRpdFBhcnRTZWxlY3Rpb24pCi0JICAgIHsKLQkgICAgICBMaXN0IHNlbGVjdGVkTW9kZWxPYmplY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICAgIGlmIChlZGl0UGFydFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAgICAgIHsKLQkgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGVkaXRQYXJ0U2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JICAgICAgICB7Ci0JICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkgICAgICAgICAgT2JqZWN0IG1vZGVsID0gbnVsbDsKLQkgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iajsKLQkgICAgICAgICAgICBtb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7ICAgICAgICAgIAotCSAgICAgICAgICB9Ci0JICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgc2VsZWN0ZWRNb2RlbE9iamVjdExpc3QuYWRkKG1vZGVsKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRNb2RlbE9iamVjdExpc3QpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCSAgICB7Ci0JICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkgICAgewotCSAgICAgIElTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gY29udmVydFNlbGVjdGlvbkZyb21FZGl0UGFydFRvTW9kZWwoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCSAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCSAgICAgIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBuZXdFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgbmV3U2VsZWN0aW9uKTsKLQkgICAgICBub3RpZnlMaXN0ZW5lcnMobmV3RXZlbnQpOwotCSAgICB9Ci0JICB9IAotfSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9EZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL0Rlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGU4YjQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL0Rlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gb2YgY29sb3IgYW5kIGZvbnQgcmVsYXRlZCBjb25zdGFudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzIAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGdyb3VwQm9yZGVyQ29sb3IgICAgICAgID0gbmV3IENvbG9yKG51bGwsIDExOCwgMTM0LCAxNjQpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGdyb3VwSGVhZGVyQ29sb3IgICAgICAgID0gbmV3IENvbG9yKG51bGwsIDIzMiwgMjQwLCAyNDgpOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZWxlbWVudEJvcmRlckNvbG9yICAgICAgPSBuZXcgQ29sb3IobnVsbCwgMTIwLCAxNTIsIDE4NCk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZWxlbWVudEJhY2tncm91bmRDb2xvciAgPSBuZXcgQ29sb3IobnVsbCwgMjMyLCAyNDAsIDI0OCk7ICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBlbGVtZW50TGFiZWxDb2xvciAgICAgICA9IG5ldyBDb2xvcihudWxsLCAgODAsIDEwMiwgMTQ0KTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciByZWFkT25seUJvcmRlckNvbG9yICAgICA9IG5ldyBDb2xvcihudWxsLCAxNjQsIDE2NCwgMTY0KTsgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgcmVkICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAgIDAsICAgMCk7IAotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgdGFibGVPcGVyYXRpb25IZWFkaW5nQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjI0LCAyMzMsIDI0Nik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgdGFibGVNZXNzYWdlSGVhZGluZ0NvbG9yID0gbmV3IENvbG9yKG51bGwsIDIzMCwgMjQwLCAyNDUpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIHRhYmxlQ2VsbFNlbGVjdGlvbkNvbG9yID0gbmV3IENvbG9yKG51bGwsIDIzOCwgMjMyLCAxNzApOyAvL25ldyBDb2xvcihudWxsLCAyNDAsIDIzMCwgMTQwKTsgLy8xLCAxNSwgNDIpOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgcmVhZE9ubHlUYWJsZU9wZXJhdGlvbkhlYWRpbmdDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyMzksIDI0MywgMjU1KTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciByZWFkT25seU1lc3NhZ2VSZWZIZWFkaW5nQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjQ1LCAyNDUsIDI0NSk7Ci0gIAotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIHJlYWRPbmx5QmFja2dyb3VuZENvbG9yID0gQ29sb3JDb25zdGFudHMud2hpdGU7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgcmVhZE9ubHlMYWJlbENvbG9yID0gQ29sb3JDb25zdGFudHMuZ3JheTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBsYWJlbENvbG9yID0gQ29sb3JDb25zdGFudHMuYmxhY2s7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBGb250ICBzbWFsbEJvbGRGb250ICAgICAgICAgICA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiVGFob21hIiwgOCwgU1dULkJPTEQpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9udCAgbWVkaXVtRm9udCAgICAgICAgICAgICAgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIlRhaG9tYSIsIDEwLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBGb250ICBtZWRpdW1Cb2xkRm9udCAgICAgICAgICA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiVGFob21hIiwgMTAsIFNXVC5CT0xEKTsgIC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9LZXlib2FyZERyYWdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9LZXlib2FyZERyYWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NGFkZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vS2V5Ym9hcmREcmFnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUtleWJvYXJkRHJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci0KLXB1YmxpYyBjbGFzcyBLZXlib2FyZERyYWdJbXBsIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbiBpbXBsZW1lbnRzIElLZXlib2FyZERyYWcgewotCi0JcHVibGljIEtleWJvYXJkRHJhZ0ltcGwoKSB7Ci0JCXN1cGVyKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtS2V5Ym9hcmREcmFnKEdyYXBoaWNhbEVkaXRQYXJ0IG1vdmluZ0VsZW1lbnQsIGludCBkaXJlY3Rpb24pIHsKLQotCQlLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5IHBvbGljeSA9IChLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5KW1vdmluZ0VsZW1lbnQuZ2V0RWRpdFBvbGljeShLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LktFWSk7Ci0JCQotCQlFZGl0UGFydCByaWdodEVsZW1lbnQgPSBwb2xpY3kuZ2V0UmVsYXRpdmVFZGl0UGFydChtb3ZpbmdFbGVtZW50LCBkaXJlY3Rpb24pOwotCQlwb2xpY3kgPSAoS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSlyaWdodEVsZW1lbnQuZ2V0RWRpdFBvbGljeShLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LktFWSk7Ci0JCUVkaXRQYXJ0IGxlZnRFbGVtZW50ID0gKHBvbGljeSAhPSBudWxsKT8gcG9saWN5LmdldFJlbGF0aXZlRWRpdFBhcnQocmlnaHRFbGVtZW50LCBkaXJlY3Rpb24pOiBudWxsOwotCQkgIAotCQlPYmplY3QgbGVmdFNpYkVsZW1lbnQgPSAobGVmdEVsZW1lbnQgIT0gbnVsbCk/IGxlZnRFbGVtZW50LmdldE1vZGVsKCkgOiBudWxsOwotCQlPYmplY3QgcmlnaHRTaWJFbGVtZW50ID0gKHJpZ2h0RWxlbWVudCAhPSBudWxsKT8gcmlnaHRFbGVtZW50LmdldE1vZGVsKCkgOiBudWxsOwotCQlpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKSB7Ci0JCQlsZWZ0U2liRWxlbWVudCA9IHJpZ2h0U2liRWxlbWVudDsKLQkJCXJpZ2h0U2liRWxlbWVudCA9IGxlZnRTaWJFbGVtZW50OwotCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiAhPSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkgcmV0dXJuOwotCQkKLQkJT2JqZWN0IHNvdXJjZSA9IG1vdmluZ0VsZW1lbnQuZ2V0TW9kZWwoKTsKLQotCQlpZiAoc291cmNlIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpIHsKLSAgCQkJCi0JCQlpZighKGxlZnRTaWJFbGVtZW50IGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpKSBsZWZ0U2liRWxlbWVudCA9IG51bGw7Ci0JCQlpZighKHJpZ2h0U2liRWxlbWVudCBpbnN0YW5jZW9mIElNZXNzYWdlUmVmZXJlbmNlKSkgcmlnaHRTaWJFbGVtZW50ID0gbnVsbDsKLQkJCQotCQkJT2JqZWN0IG1lc3NhZ2VSZWZPd25lciA9ICgoSU1lc3NhZ2VSZWZlcmVuY2UpIHNvdXJjZSkuZ2V0T3duZXJPcGVyYXRpb24oKTsKLSAgCQkJaWYgKG1lc3NhZ2VSZWZPd25lciBpbnN0YW5jZW9mIElPcGVyYXRpb24pIHsKLSAgCQkJCUlNZXNzYWdlUmVmZXJlbmNlIGxlZnRTaWIgPSAoSU1lc3NhZ2VSZWZlcmVuY2UpIGxlZnRTaWJFbGVtZW50OwotICAJCQkJSU1lc3NhZ2VSZWZlcmVuY2UgcmlnaHRTaWIgPSAoSU1lc3NhZ2VSZWZlcmVuY2UpIHJpZ2h0U2liRWxlbWVudDsKLSAgCQkJCUlNZXNzYWdlUmVmZXJlbmNlIG1vdmluZ1NpYiA9IChJTWVzc2FnZVJlZmVyZW5jZSkgc291cmNlOwotICAJCQkJQ29tbWFuZCBjb21tYW5kID0gKChJT3BlcmF0aW9uKSBtZXNzYWdlUmVmT3duZXIpLmdldFJlb3JkZXJNZXNzYWdlUmVmZXJlbmNlc0NvbW1hbmQobGVmdFNpYiwgcmlnaHRTaWIsIG1vdmluZ1NpYik7Ci0gIAkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLSAgCQkJCXBlcmZvcm1TZWxlY3Rpb24oc291cmNlKTsKLSAgCQkJfQotICAJCX0KLSAgCQllbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBJUGFyYW1ldGVyKSB7Ci0gIAkJCQotICAJCQlpZighKGxlZnRTaWJFbGVtZW50IGluc3RhbmNlb2YgSVBhcmFtZXRlcikpIGxlZnRTaWJFbGVtZW50ID0gbnVsbDsKLQkJCWlmKCEocmlnaHRTaWJFbGVtZW50IGluc3RhbmNlb2YgSVBhcmFtZXRlcikpIHJpZ2h0U2liRWxlbWVudCA9IG51bGw7Ci0JCQkKLSAgCQkJT2JqZWN0IHBhcmFtT3duZXIgPSAoKElQYXJhbWV0ZXIpIHNvdXJjZSkuZ2V0T3duZXIoKTsKLSAgCQkJaWYgKHBhcmFtT3duZXIgaW5zdGFuY2VvZiBJTWVzc2FnZVJlZmVyZW5jZSkgewotICAJCQkJSVBhcmFtZXRlciBsZWZ0U2liID0gKElQYXJhbWV0ZXIpIGxlZnRTaWJFbGVtZW50OwotICAJCQkJSVBhcmFtZXRlciByaWdodFNpYiA9IChJUGFyYW1ldGVyKSByaWdodFNpYkVsZW1lbnQ7Ci0gIAkJCQlJUGFyYW1ldGVyIG1vdmluZ1NpYiA9IChJUGFyYW1ldGVyKSBzb3VyY2U7Ci0gIAkJCQlDb21tYW5kIGNvbW1hbmQgPSAoKElNZXNzYWdlUmVmZXJlbmNlKSBwYXJhbU93bmVyKS5nZXRSZW9yZGVyUGFyYW1ldGVyc0NvbW1hbmQobGVmdFNpYiwgcmlnaHRTaWIsIG1vdmluZ1NpYik7Ci0gIAkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLSAgCQkJCXBlcmZvcm1TZWxlY3Rpb24oc291cmNlKTsKLSAgCQkJfQotICAJCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9jb25uZWN0aW9ucy9DZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2Nvbm5lY3Rpb25zL0NlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWM5YzI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2Nvbm5lY3Rpb25zL0NlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uY29ubmVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1wdWJsaWMgY2xhc3MgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPVFRPTSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVCA9IDM7Ci0gIAotICAvLyBUaGVzZSB0d28gYXJlIGN1c3RvbSBmb3IgcmVjdGFuZ2xlcyB3aXRoIGhlYWRlciBibG9ja3MKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVBREVSX0xFRlQgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFERVJfUklHSFQgPSA1OwotCi0gIHByaXZhdGUgaW50IGxvY2F0aW9uOwotICBwcml2YXRlIGludCBpbnNldDsKLSAgcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLSAgCi0gIHB1YmxpYyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoSUZpZ3VyZSBvd25lciwgaW50IGxvY2F0aW9uLCBpbnQgaW5zZXQpIHsKLSAgICBzdXBlcihvd25lcik7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHRoaXMuaW5zZXQgPSBpbnNldDsKLSAgfQotICAKLSAgcHVibGljIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihJRmlndXJlIG93bmVyLCBpbnQgbG9jYXRpb24sIGludCBpbnNldCwgaW50IG9mZnNldCkgewotICAgIHRoaXMob3duZXIsIGxvY2F0aW9uLCBpbnNldCk7Ci0gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpIHsKLSAgICBSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCk7Ci0gICAgaW50IHgsIHk7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikgewotICAgICAgY2FzZSBUT1A6Ci0gICAgICAgIHggPSByLnJpZ2h0KCkgLSByLndpZHRoIC8gMiArIG9mZnNldDsKLSAgICAgICAgeSA9IHIueSArIGluc2V0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQk9UVE9NOgotICAgICAgICB4ID0gci5yaWdodCgpIC0gci53aWR0aCAvIDIgKyBvZmZzZXQ7Ci0gICAgICAgIHkgPSByLmJvdHRvbSgpIC0gaW5zZXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMRUZUOgotICAgICAgICB4ID0gci54ICsgaW5zZXQ7Ci0gICAgICAgIHkgPSByLmJvdHRvbSgpIC0gci5oZWlnaHQgLyAyICsgb2Zmc2V0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUklHSFQ6Ci0gICAgICAgIHggPSByLnJpZ2h0KCkgLSBpbnNldDsKLSAgICAgICAgeSA9IHIuYm90dG9tKCkgLSByLmhlaWdodCAvIDIgKyBvZmZzZXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBIRUFERVJfTEVGVDoKLSAgICAgICAgeCA9IHIueCArIGluc2V0OwotICAgICAgICB5ID0gci55ICsgb2Zmc2V0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSEVBREVSX1JJR0hUOgotICAgICAgICB4ID0gci5yaWdodCgpIC0gaW5zZXQ7Ci0gICAgICAgIHkgPSByLnkgKyBvZmZzZXQ7Ci0gICAgICAgIGJyZWFrOyAgICAgICAgCi0gICAgICAgIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcuIEF0dGFjaCB0aGUgYW5jaG9yIHRvIHRoZSBtaWRkbGUKLSAgICAgICAgeCA9IHIucmlnaHQoKSAtIHIud2lkdGggLyAyOwotICAgICAgICB5ID0gci5ib3R0b20oKSAtIHIuaGVpZ2h0IC8gMjsKLSAgICB9Ci0gICAgUG9pbnQgcCA9IG5ldyBQb2ludCh4LHkpOwotCi0gICAgZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotICAgIHJldHVybiBwOwotICB9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0gICAgcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2Nvbm5lY3Rpb25zL1RvcExlZnRDb25uZWN0aW9uQW5jaG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9jb25uZWN0aW9ucy9Ub3BMZWZ0Q29ubmVjdGlvbkFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDBiZGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2Nvbm5lY3Rpb25zL1RvcExlZnRDb25uZWN0aW9uQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5jb25uZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1wdWJsaWMgY2xhc3MgVG9wTGVmdENvbm5lY3Rpb25BbmNob3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25BbmNob3IKLXsgCi0gIElGaWd1cmUgbGFiZWw7Ci0gIHB1YmxpYyBUb3BMZWZ0Q29ubmVjdGlvbkFuY2hvcihJRmlndXJlIG93bmVyLCBJRmlndXJlIGxhYmVsKSB7Ci0gICAgc3VwZXIob3duZXIpOwotICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgfQotICBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0gICAgaW50IHggPSBnZXRPd25lcigpLmdldEJvdW5kcygpLng7Ci0gICAgaW50IHkgPSBsYWJlbC5nZXRCb3VuZHMoKS55ICsgbGFiZWwuZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gMjsKLSAgICBQb2ludCBwID0gbmV3IFBvaW50KHgseSk7Ci0gICAgZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotICAgIHJldHVybiBwOwotICB9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0gICAgcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9kaXJlY3RlZGl0L0FTRENDb21iby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZGlyZWN0ZWRpdC9BU0RDQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5YjFkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9kaXJlY3RlZGl0L0FTRENDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5kaXJlY3RlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZVRleHRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qCi0gKiBybWFoOgotICogVGhpcyBjbGFzcyBpcyBhIGNvcHkgb2YgQ0NvbWJvLiAgV2UgY29weSBpdCBiZWNhdXNlIHdlIHdpc2ggdG8gYWxpZ24KLSAqIHRoZSBUZXh0IG9mIHRoZSBDb21ibyBpbiBvdXIgb3duIHNwZWNpYWwgd2F5LiAgSG93ZXZlciB0aGVyZSBpcyBubwotICogd2F5IHRvIGFjY2VzcyB0aGUgVGV4dCBvYmplY3Qgd2l0aGluIENDb21iby4uLi4uCi0gKiBCdWcgZm9yIHRoaXMgaXNzdWUgdG8gYmUgb3BlbmVkCi0gKi8KLQotLyoqCi0gKiBUaGUgQ0NvbWJvIGNsYXNzIHJlcHJlc2VudHMgYSBzZWxlY3RhYmxlIHVzZXIgaW50ZXJmYWNlIG9iamVjdAotICogdGhhdCBjb21iaW5lcyBhIHRleHQgZmllbGQgYW5kIGEgbGlzdCBhbmQgaXNzdWVzIG5vdGlmaWNhdGlvbgotICogd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGZyb20gdGhlIGxpc3QuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCBhbHRob3VnaCB0aGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiwKLSAqIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gYWRkIGNoaWxkcmVuIHRvIGl0LCBvciBzZXQgYSBsYXlvdXQgb24gaXQuCi0gKiA8L3A+Ci0gKiA8ZGw+Ci0gKiA8ZHQ+PGI+U3R5bGVzOjwvYj4KLSAqIDxkZD5CT1JERVIsIFJFQURfT05MWSwgRkxBVDwvZGQ+Ci0gKiA8ZHQ+PGI+RXZlbnRzOjwvYj4KLSAqIDxkZD5TZWxlY3Rpb248L2RkPgotICogPC9kbD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFTRENDb21ibyBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQlUZXh0IHRleHQ7Ci0JTGlzdCBsaXN0OwotCWludCB2aXNpYmxlSXRlbUNvdW50ID0gNTsKLQlTaGVsbCBwb3B1cDsKLQlCdXR0b24gYXJyb3c7Ci0JYm9vbGVhbiBoYXNGb2N1czsKLQlMaXN0ZW5lciBsaXN0ZW5lciwgZmlsdGVyOwotCUNvbG9yIGZvcmVncm91bmQsIGJhY2tncm91bmQ7Ci0JRm9udCBmb250OwotCXByaXZhdGUgaW50IHRleHRJbmRlbnQgPSA1OwotCQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gKiA8cD4KLSAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBTV1QjQk9SREVSCi0gKiBAc2VlIFNXVCNSRUFEX09OTFkKLSAqIEBzZWUgU1dUI0ZMQVQKLSAqIEBzZWUgV2lkZ2V0I2dldFN0eWxlKCkKLSAqLwotcHVibGljIEFTRENDb21ibyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0Jc3VwZXIgKHBhcmVudCwgc3R5bGUgPSBjaGVja1N0eWxlIChzdHlsZSkpOwotCQotCWludCB0ZXh0U3R5bGUgPSBTV1QuU0lOR0xFOwotCWlmICgoc3R5bGUgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQlpZiAoKHN0eWxlICYgU1dULkZMQVQpICE9IDApIHRleHRTdHlsZSB8PSBTV1QuRkxBVDsKLQl0ZXh0ID0gbmV3IFRleHQgKHRoaXMsIHRleHRTdHlsZSk7Ci0JaW50IGFycm93U3R5bGUgPSBTV1QuQVJST1cgfCBTV1QuRE9XTjsKLQlpZiAoKHN0eWxlICYgU1dULkZMQVQpICE9IDApIGFycm93U3R5bGUgfD0gU1dULkZMQVQ7Ci0JYXJyb3cgPSBuZXcgQnV0dG9uICh0aGlzLCBhcnJvd1N0eWxlKTsKLQotCWxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAocG9wdXAgPT0gZXZlbnQud2lkZ2V0KSB7Ci0JCQkJcG9wdXBFdmVudCAoZXZlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICh0ZXh0ID09IGV2ZW50LndpZGdldCkgewotCQkJCXRleHRFdmVudCAoZXZlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChsaXN0ID09IGV2ZW50LndpZGdldCkgewotCQkJCWxpc3RFdmVudCAoZXZlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChhcnJvdyA9PSBldmVudC53aWRnZXQpIHsKLQkJCQlhcnJvd0V2ZW50IChldmVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKEFTRENDb21iby50aGlzID09IGV2ZW50LndpZGdldCkgewotCQkJCWNvbWJvRXZlbnQgKGV2ZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZ2V0U2hlbGwgKCkgPT0gZXZlbnQud2lkZ2V0KSB7Ci0JCQkJaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c091dCk7Ci0JCQl9Ci0JCX0KLQl9OwotCWZpbHRlciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVNoZWxsIHNoZWxsID0gKChDb250cm9sKWV2ZW50LndpZGdldCkuZ2V0U2hlbGwgKCk7Ci0JCQlpZiAoc2hlbGwgPT0gQVNEQ0NvbWJvLnRoaXMuZ2V0U2hlbGwgKCkpIHsKLQkJCQloYW5kbGVGb2N1cyAoU1dULkZvY3VzT3V0KTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JaW50IFtdIGNvbWJvRXZlbnRzID0ge1NXVC5EaXNwb3NlLCBTV1QuTW92ZSwgU1dULlJlc2l6ZX07Ci0JZm9yIChpbnQgaT0wOyBpPGNvbWJvRXZlbnRzLmxlbmd0aDsgaSsrKSB0aGlzLmFkZExpc3RlbmVyIChjb21ib0V2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLQkKLQlpbnQgW10gdGV4dEV2ZW50cyA9IHtTV1QuS2V5RG93biwgU1dULktleVVwLCBTV1QuTWVudURldGVjdCwgU1dULk1vZGlmeSwgU1dULk1vdXNlRG93biwgU1dULk1vdXNlVXAsIFNXVC5UcmF2ZXJzZSwgU1dULkZvY3VzSW59OwotCWZvciAoaW50IGk9MDsgaTx0ZXh0RXZlbnRzLmxlbmd0aDsgaSsrKSB0ZXh0LmFkZExpc3RlbmVyICh0ZXh0RXZlbnRzIFtpXSwgbGlzdGVuZXIpOwotCQotCWludCBbXSBhcnJvd0V2ZW50cyA9IHtTV1QuU2VsZWN0aW9uLCBTV1QuRm9jdXNJbn07Ci0JZm9yIChpbnQgaT0wOyBpPGFycm93RXZlbnRzLmxlbmd0aDsgaSsrKSBhcnJvdy5hZGRMaXN0ZW5lciAoYXJyb3dFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0JCi0JY3JlYXRlUG9wdXAobnVsbCwgLTEpOwotCWluaXRBY2Nlc3NpYmxlKCk7Ci19Ci1zdGF0aWMgaW50IGNoZWNrU3R5bGUgKGludCBzdHlsZSkgewotCWludCBtYXNrID0gU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCB8IFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULlJJR0hUX1RPX0xFRlQ7Ci0JcmV0dXJuIHN0eWxlICYgbWFzazsKLX0KLS8qKgotICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIG5ldyBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlICNhZGQoU3RyaW5nLGludCkKLSAqLwotcHVibGljIHZvaWQgYWRkIChTdHJpbmcgc3RyaW5nKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWxpc3QuYWRkIChzdHJpbmcpOwotfQotLyoqCi0gKiBBZGRzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIncyBsaXN0IGF0IHRoZSBnaXZlbgotICogemVyby1yZWxhdGl2ZSBpbmRleC4KLSAqIDxwPgotICogTm90ZTogVG8gYWRkIGFuIGl0ZW0gYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgdXNlIHRoZQotICogcmVzdWx0IG9mIGNhbGxpbmcgPGNvZGU+Z2V0SXRlbUNvdW50KCk8L2NvZGU+IGFzIHRoZQotICogaW5kZXggb3IgdXNlIDxjb2RlPmFkZChTdHJpbmcpPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBuZXcgaXRlbQotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBmb3IgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSAtIGlmIHRoZSBpbmRleCBpcyBub3QgYmV0d2VlbiAwIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IChpbmNsdXNpdmUpPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSAjYWRkKFN0cmluZykKLSAqLwotcHVibGljIHZvaWQgYWRkIChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JbGlzdC5hZGQgKHN0cmluZywgaW5kZXgpOwotfQotLyoqCi0gKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwKLSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBpcyBtb2RpZmllZCwgYnkgc2VuZGluZwotICogaXQgb25lIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5Nb2RpZnlMaXN0ZW5lcjwvY29kZT4KLSAqIGludGVyZmFjZS4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIE1vZGlmeUxpc3RlbmVyCi0gKiBAc2VlICNyZW1vdmVNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lciAoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lciAobGlzdGVuZXIpOwotCWFkZExpc3RlbmVyIChTV1QuTW9kaWZ5LCB0eXBlZExpc3RlbmVyKTsKLX0KLS8qKgotICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gKiBiZSBub3RpZmllZCB3aGVuIHRoZSByZWNlaXZlcidzIHNlbGVjdGlvbiBjaGFuZ2VzLCBieSBzZW5kaW5nCi0gKiBpdCBvbmUgb2YgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyPC9jb2RlPgotICogaW50ZXJmYWNlLgotICogPHA+Ci0gKiA8Y29kZT53aWRnZXRTZWxlY3RlZDwvY29kZT4gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbWJvJ3MgbGlzdCBzZWxlY3Rpb24gY2hhbmdlcy4KLSAqIDxjb2RlPndpZGdldERlZmF1bHRTZWxlY3RlZDwvY29kZT4gaXMgdHlwaWNhbGx5IGNhbGxlZCB3aGVuIEVOVEVSIGlzIHByZXNzZWQgdGhlIGNvbWJvJ3MgdGV4dCBhcmVhLgotICogPC9wPgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIKLSAqIEBzZWUgI3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyCi0gKiBAc2VlIFNlbGVjdGlvbkV2ZW50Ci0gKi8KLXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFR5cGVkTGlzdGVuZXIgKGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sdHlwZWRMaXN0ZW5lcik7Ci19Ci12b2lkIGFycm93RXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0Jc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCWNhc2UgU1dULkZvY3VzSW46IHsKLQkJCWhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5TZWxlY3Rpb246IHsKLQkJCWRyb3BEb3duICghaXNEcm9wcGVkICgpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotLyoqCi0gKiBTZXRzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCB0byBhbiBlbXB0eQotICogc2VsZWN0aW9uIHN0YXJ0aW5nIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBjaGFyYWN0ZXIuIElmIHRoZQotICogdGV4dCBmaWVsZCBpcyBlZGl0YWJsZSwgdGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBwbGFjaW5nIHRoZQotICogaS1iZWFtIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dC4KLSAqIDxwPgotICogTm90ZTogVG8gY2xlYXIgdGhlIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSByZWNlaXZlcidzIGxpc3QsIAotICogdXNlIDxjb2RlPmRlc2VsZWN0QWxsKCk8L2NvZGU+LgotICogPC9wPgotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlICNkZXNlbGVjdEFsbAotICovCi1wdWJsaWMgdm9pZCBjbGVhclNlbGVjdGlvbiAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JdGV4dC5jbGVhclNlbGVjdGlvbiAoKTsKLQlsaXN0LmRlc2VsZWN0QWxsICgpOwotfQotdm9pZCBjb21ib0V2ZW50IChFdmVudCBldmVudCkgewotCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJaWYgKHBvcHVwICE9IG51bGwgJiYgIXBvcHVwLmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlsaXN0LnJlbW92ZUxpc3RlbmVyIChTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCQkJCXBvcHVwLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsICgpOwotCQkJc2hlbGwucmVtb3ZlTGlzdGVuZXIgKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5ICgpOwotCQkJZGlzcGxheS5yZW1vdmVGaWx0ZXIgKFNXVC5Gb2N1c0luLCBmaWx0ZXIpOwotCQkJcG9wdXAgPSBudWxsOyAgCi0JCQl0ZXh0ID0gbnVsbDsgIAotCQkJbGlzdCA9IG51bGw7ICAKLQkJCWFycm93ID0gbnVsbDsKLQkJCWJyZWFrOwotCQljYXNlIFNXVC5Nb3ZlOgotCQkJZHJvcERvd24gKGZhbHNlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNXVC5SZXNpemU6Ci0JCQlpbnRlcm5hbExheW91dCAoZmFsc2UpOwotCQkJYnJlYWs7Ci0JfQotfQotCi1wdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUgKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOwotCVN0cmluZ1tdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLQlpbnQgdGV4dFdpZHRoID0gMDsKLQlHQyBnYyA9IG5ldyBHQyAodGV4dCk7Ci0JaW50IHNwYWNlciA9IGdjLnN0cmluZ0V4dGVudCAoIiAiKS54OyAvLyROT04tTkxTLTEkCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQl0ZXh0V2lkdGggPSBNYXRoLm1heCAoZ2Muc3RyaW5nRXh0ZW50IChpdGVtc1tpXSkueCwgdGV4dFdpZHRoKTsKLQl9Ci0JZ2MuZGlzcG9zZSgpOwotCVBvaW50IHRleHRTaXplID0gdGV4dC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsKLQlQb2ludCBhcnJvd1NpemUgPSBhcnJvdy5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsKLQlQb2ludCBsaXN0U2l6ZSA9IGxpc3QuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0JaW50IGJvcmRlcldpZHRoID0gZ2V0Qm9yZGVyV2lkdGggKCk7Ci0JCi0JaGVpZ2h0ID0gTWF0aC5tYXggKHRleHRTaXplLnksIGFycm93U2l6ZS55KTsKLQl3aWR0aCA9IE1hdGgubWF4ICh0ZXh0V2lkdGggKyAyKnNwYWNlciArIGFycm93U2l6ZS54ICsgMipib3JkZXJXaWR0aCwgbGlzdFNpemUueCk7Ci0JaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKSB3aWR0aCA9IHdIaW50OwotCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7Ci0JcmV0dXJuIG5ldyBQb2ludCAod2lkdGggKyAyKmJvcmRlcldpZHRoLCBoZWlnaHQgKyAyKmJvcmRlcldpZHRoKTsKLX0KLXZvaWQgY3JlYXRlUG9wdXAoU3RyaW5nW10gaXRlbXMsIGludCBzZWxlY3Rpb25JbmRleCkgewkJCi0JCS8vIGNyZWF0ZSBzaGVsbCBhbmQgbGlzdAotCQlwb3B1cCA9IG5ldyBTaGVsbCAoZ2V0U2hlbGwgKCksIFNXVC5OT19UUklNIHwgU1dULk9OX1RPUCk7Ci0JCWludCBzdHlsZSA9IGdldFN0eWxlICgpOwotCQlpbnQgbGlzdFN0eWxlID0gU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTDsKLQkJaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSBsaXN0U3R5bGUgfD0gU1dULkZMQVQ7Ci0JCWlmICgoc3R5bGUgJiBTV1QuUklHSFRfVE9fTEVGVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5SSUdIVF9UT19MRUZUOwotCQlpZiAoKHN0eWxlICYgU1dULkxFRlRfVE9fUklHSFQpICE9IDApIGxpc3RTdHlsZSB8PSBTV1QuTEVGVF9UT19SSUdIVDsKLQkJbGlzdCA9IG5ldyBMaXN0IChwb3B1cCwgbGlzdFN0eWxlKTsKLQkJaWYgKGZvbnQgIT0gbnVsbCkgbGlzdC5zZXRGb250IChmb250KTsKLQkJaWYgKGZvcmVncm91bmQgIT0gbnVsbCkgbGlzdC5zZXRGb3JlZ3JvdW5kIChmb3JlZ3JvdW5kKTsKLQkJaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgbGlzdC5zZXRCYWNrZ3JvdW5kIChiYWNrZ3JvdW5kKTsKLQkJCi0JCWludCBbXSBwb3B1cEV2ZW50cyA9IHtTV1QuQ2xvc2UsIFNXVC5QYWludCwgU1dULkRlYWN0aXZhdGV9OwotCQlmb3IgKGludCBpPTA7IGk8cG9wdXBFdmVudHMubGVuZ3RoOyBpKyspIHBvcHVwLmFkZExpc3RlbmVyIChwb3B1cEV2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLQkJaW50IFtdIGxpc3RFdmVudHMgPSB7U1dULk1vdXNlVXAsIFNXVC5TZWxlY3Rpb24sIFNXVC5UcmF2ZXJzZSwgU1dULktleURvd24sIFNXVC5LZXlVcCwgU1dULkZvY3VzSW4sIFNXVC5EaXNwb3NlfTsKLQkJZm9yIChpbnQgaT0wOyBpPGxpc3RFdmVudHMubGVuZ3RoOyBpKyspIGxpc3QuYWRkTGlzdGVuZXIgKGxpc3RFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0JCQotCQlpZiAoaXRlbXMgIT0gbnVsbCkgbGlzdC5zZXRJdGVtcyAoaXRlbXMpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIGxpc3Quc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25JbmRleCk7Ci19Ci0vKioKLSAqIERlc2VsZWN0cyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gemVyby1yZWxhdGl2ZSBpbmRleCBpbiB0aGUgcmVjZWl2ZXIncyAKLSAqIGxpc3QuICBJZiB0aGUgaXRlbSBhdCB0aGUgaW5kZXggd2FzIGFscmVhZHkgZGVzZWxlY3RlZCwgaXQgcmVtYWlucwotICogZGVzZWxlY3RlZC4gSW5kaWNlcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UgYXJlIGlnbm9yZWQuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBkZXNlbGVjdAotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgZGVzZWxlY3QgKGludCBpbmRleCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCWxpc3QuZGVzZWxlY3QgKGluZGV4KTsKLX0KLS8qKgotICogRGVzZWxlY3RzIGFsbCBzZWxlY3RlZCBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICogPHA+Ci0gKiBOb3RlOiBUbyBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQsCi0gKiB1c2UgPGNvZGU+Y2xlYXJTZWxlY3Rpb24oKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgI2NsZWFyU2VsZWN0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlsaXN0LmRlc2VsZWN0QWxsICgpOwotfQotdm9pZCBkcm9wRG93biAoYm9vbGVhbiBkcm9wKSB7Ci0JaWYgKGRyb3AgPT0gaXNEcm9wcGVkICgpKSByZXR1cm47Ci0JaWYgKCFkcm9wKSB7Ci0JCXBvcHVwLnNldFZpc2libGUgKGZhbHNlKTsKLQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJaWYgKCFpc0Rpc3Bvc2VkICgpJiYgYXJyb3cuaXNGb2N1c0NvbnRyb2woKSkgewotCQkJdGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZ2V0U2hlbGwoKSAhPSBwb3B1cC5nZXRQYXJlbnQgKCkpIHsKLQkJU3RyaW5nW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zICgpOwotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotCQlsaXN0LnJlbW92ZUxpc3RlbmVyIChTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCQlwb3B1cC5kaXNwb3NlKCk7Ci0JCXBvcHVwID0gbnVsbDsKLQkJbGlzdCA9IG51bGw7Ci0JCWNyZWF0ZVBvcHVwIChpdGVtcywgc2VsZWN0aW9uSW5kZXgpOwotCX0KLQkKLQlQb2ludCBzaXplID0gZ2V0U2l6ZSAoKTsKLQlpbnQgaXRlbUNvdW50ID0gbGlzdC5nZXRJdGVtQ291bnQgKCk7Ci0JaXRlbUNvdW50ID0gKGl0ZW1Db3VudCA9PSAwKSA/IHZpc2libGVJdGVtQ291bnQgOiBNYXRoLm1pbih2aXNpYmxlSXRlbUNvdW50LCBpdGVtQ291bnQpOwotCWludCBpdGVtSGVpZ2h0ID0gbGlzdC5nZXRJdGVtSGVpZ2h0ICgpICogaXRlbUNvdW50OwotCVBvaW50IGxpc3RTaXplID0gbGlzdC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIGl0ZW1IZWlnaHQsIGZhbHNlKTsKLQlsaXN0LnNldEJvdW5kcyAoMSwgMSwgTWF0aC5tYXggKHNpemUueCAtIDIsIGxpc3RTaXplLngpLCBsaXN0U2l6ZS55KTsKLQkKLQlpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotCWlmIChpbmRleCAhPSAtMSkgbGlzdC5zZXRUb3BJbmRleCAoaW5kZXgpOwotCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkgKCk7Ci0JUmVjdGFuZ2xlIGxpc3RSZWN0ID0gbGlzdC5nZXRCb3VuZHMgKCk7Ci0JUmVjdGFuZ2xlIHBhcmVudFJlY3QgPSBkaXNwbGF5Lm1hcCAoZ2V0UGFyZW50ICgpLCBudWxsLCBnZXRCb3VuZHMgKCkpOwotCVBvaW50IGNvbWJvU2l6ZSA9IGdldFNpemUgKCk7Ci0JUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gZ2V0TW9uaXRvciAoKS5nZXRDbGllbnRBcmVhICgpOwotCWludCB3aWR0aCA9IE1hdGgubWF4IChjb21ib1NpemUueCwgbGlzdFJlY3Qud2lkdGggKyAyKTsKLQlpbnQgaGVpZ2h0ID0gbGlzdFJlY3QuaGVpZ2h0ICsgMjsKLQlpbnQgeCA9IHBhcmVudFJlY3QueDsKLQlpbnQgeSA9IHBhcmVudFJlY3QueSArIGNvbWJvU2l6ZS55OwotCWlmICh5ICsgaGVpZ2h0ID4gZGlzcGxheVJlY3QueSArIGRpc3BsYXlSZWN0LmhlaWdodCkgeSA9IHBhcmVudFJlY3QueSAtIGhlaWdodDsKLQlpZiAoeCArIHdpZHRoID4gZGlzcGxheVJlY3QueCArIGRpc3BsYXlSZWN0LndpZHRoKSB4ID0gZGlzcGxheVJlY3QueCArIGRpc3BsYXlSZWN0LndpZHRoIC0gbGlzdFJlY3Qud2lkdGg7Ci0JcG9wdXAuc2V0Qm91bmRzICh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLQlwb3B1cC5zZXRWaXNpYmxlICh0cnVlKTsKLQlsaXN0LnNldEZvY3VzICgpOwotfQotLyoKLSAqIFJldHVybiB0aGUgbG93ZXJjYXNlIG9mIHRoZSBmaXJzdCBub24tJyYnIGNoYXJhY3RlciBmb2xsb3dpbmcKLSAqIGFuICcmJyBjaGFyYWN0ZXIgaW4gdGhlIGdpdmVuIHN0cmluZy4gSWYgdGhlcmUgYXJlIG5vICcmJwotICogY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLCByZXR1cm4gJ1wwJy4KLSAqLwotY2hhciBfZmluZE1uZW1vbmljIChTdHJpbmcgc3RyaW5nKSB7Ci0JaWYgKHN0cmluZyA9PSBudWxsKSByZXR1cm4gJ1wwJzsKLQlpbnQgaW5kZXggPSAwOwotCWludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoICgpOwotCWRvIHsKLQkJd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIHN0cmluZy5jaGFyQXQgKGluZGV4KSAhPSAnJicpIGluZGV4Kys7Ci0JCWlmICgrK2luZGV4ID49IGxlbmd0aCkgcmV0dXJuICdcMCc7Ci0JCWlmIChzdHJpbmcuY2hhckF0IChpbmRleCkgIT0gJyYnKSByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlIChzdHJpbmcuY2hhckF0IChpbmRleCkpOwotCQlpbmRleCsrOwotCX0gd2hpbGUgKGluZGV4IDwgbGVuZ3RoKTsKLSAJcmV0dXJuICdcMCc7Ci19Ci0vKiAKLSAqIFJldHVybiB0aGUgTGFiZWwgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSByZWNlaXZlciBpbiB0aGUgei1vcmRlciwgCi0gKiBvciBudWxsIGlmIG5vbmUuIAotICovCi1MYWJlbCBnZXRBc3NvY2lhdGVkTGFiZWwgKCkgewotCUNvbnRyb2xbXSBzaWJsaW5ncyA9IGdldFBhcmVudCAoKS5nZXRDaGlsZHJlbiAoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChzaWJsaW5ncyBbaV0gPT0gdGhpcykgewotCQkJaWYgKGkgPiAwICYmIHNpYmxpbmdzIFtpLTFdIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQlyZXR1cm4gKExhYmVsKSBzaWJsaW5ncyBbaS0xXTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBDb250cm9sIFtdIGdldENoaWxkcmVuICgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBuZXcgQ29udHJvbCBbMF07Ci19Ci0vKioKLSAqIEdldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotICoKLSAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHJlY2VpdmVyIGlzIGVkaXRhYmxlCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgYm9vbGVhbiBnZXRFZGl0YWJsZSAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIHRleHQuZ2V0RWRpdGFibGUoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4sIHplcm8tcmVsYXRpdmUgaW5kZXggaW4gdGhlCi0gKiByZWNlaXZlcidzIGxpc3QuIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dAotICogb2YgcmFuZ2UuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4KLSAqIEByZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4Ci0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0SXRlbSAoaW50IGluZGV4KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gbGlzdC5nZXRJdGVtIChpbmRleCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50ICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gbGlzdC5nZXRJdGVtQ291bnQgKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgYXJlYSB3aGljaCB3b3VsZCBiZSB1c2VkIHRvCi0gKiBkaXNwbGF5IDxlbT5vbmU8L2VtPiBvZiB0aGUgaXRlbXMgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2Ygb25lIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0SXRlbUhlaWdodCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIGxpc3QuZ2V0SXRlbUhlaWdodCAoKTsKLX0KLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+cyB3aGljaCBhcmUgdGhlIGl0ZW1zCi0gKiBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LiAKLSAqIDxwPgotICogTm90ZTogVGhpcyBpcyBub3QgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgcmVjZWl2ZXIKLSAqIHRvIG1haW50YWluIGl0cyBsaXN0IG9mIGl0ZW1zLCBzbyBtb2RpZnlpbmcgdGhlIGFycmF5IHdpbGwKLSAqIG5vdCBhZmZlY3QgdGhlIHJlY2VpdmVyLiAKLSAqIDwvcD4KLSAqCi0gKiBAcmV0dXJuIHRoZSBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0Ci0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgU3RyaW5nIFtdIGdldEl0ZW1zICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gbGlzdC5nZXRJdGVtcyAoKTsKLX0KLXB1YmxpYyBNZW51IGdldE1lbnUoKSB7Ci0JcmV0dXJuIHRleHQuZ2V0TWVudSgpOwotfQotLyoqCi0gKiBSZXR1cm5zIGEgPGNvZGU+UG9pbnQ8L2NvZGU+IHdob3NlIHggY29vcmRpbmF0ZSBpcyB0aGUgc3RhcnQKLSAqIG9mIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCwgYW5kIHdob3NlIHkKLSAqIGNvb3JkaW5hdGUgaXMgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWVzCi0gKiBhcmUgemVyby1yZWxhdGl2ZS4gQW4gImVtcHR5IiBzZWxlY3Rpb24gYXMgaW5kaWNhdGVkIGJ5Ci0gKiB0aGUgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgaGF2aW5nIHRoZSBzYW1lIHZhbHVlLgotICoKLSAqIEByZXR1cm4gYSBwb2ludCByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gdGV4dC5nZXRTZWxlY3Rpb24gKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHplcm8tcmVsYXRpdmUgaW5kZXggb2YgdGhlIGl0ZW0gd2hpY2ggaXMgY3VycmVudGx5Ci0gKiBzZWxlY3RlZCBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LCBvciAtMSBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgotICoKLSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldFNlbGVjdGlvbkluZGV4ICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLX0KLXB1YmxpYyBpbnQgZ2V0U3R5bGUgKCkgewotCWludCBzdHlsZSA9IHN1cGVyLmdldFN0eWxlICgpOwotCXN0eWxlICY9IH5TV1QuUkVBRF9PTkxZOwotCWlmICghdGV4dC5nZXRFZGl0YWJsZSgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOyAKLQlyZXR1cm4gc3R5bGU7Ci19Ci0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZQotICogcmVjZWl2ZXIncyB0ZXh0IGZpZWxkLgotICoKLSAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgdGV4dAotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUZXh0ICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gdGV4dC5nZXRUZXh0ICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHJlY2VpdmVycydzIHRleHQgZmllbGQuCi0gKgotICogQHJldHVybiB0aGUgdGV4dCBoZWlnaHQKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0VGV4dEhlaWdodCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIHRleHQuZ2V0TGluZUhlaWdodCAoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSByZWNlaXZlcidzCi0gKiB0ZXh0IGZpZWxkIGlzIGNhcGFibGUgb2YgaG9sZGluZy4gSWYgdGhpcyBoYXMgbm90IGJlZW4gY2hhbmdlZAotICogYnkgPGNvZGU+c2V0VGV4dExpbWl0KCk8L2NvZGU+LCBpdCB3aWxsIGJlIHRoZSBjb25zdGFudAotICogPGNvZGU+Q29tYm8uTElNSVQ8L2NvZGU+LgotICogCi0gKiBAcmV0dXJuIHRoZSB0ZXh0IGxpbWl0Ci0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRUZXh0TGltaXQgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCXJldHVybiB0ZXh0LmdldFRleHRMaW1pdCAoKTsKLX0KLS8qKgotICogR2V0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgYXJlIHZpc2libGUgaW4gdGhlIGRyb3AKLSAqIGRvd24gcG9ydGlvbiBvZiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICoKLSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSB2aXNpYmxlCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmlzaWJsZUl0ZW1Db3VudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIHZpc2libGVJdGVtQ291bnQ7Ci19Ci12b2lkIGhhbmRsZUZvY3VzIChpbnQgdHlwZSkgewotCWlmIChpc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgU1dULkZvY3VzSW46IHsKLQkJCWlmIChoYXNGb2N1cykgcmV0dXJuOwotLy8JCQlpZiAoZ2V0RWRpdGFibGUgKCkpIHRleHQuc2VsZWN0QWxsICgpOwotCQkJaGFzRm9jdXMgPSB0cnVlOwotCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCAoKTsKLQkJCXNoZWxsLnJlbW92ZUxpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotCQkJc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5ICgpOwotCQkJZGlzcGxheS5yZW1vdmVGaWx0ZXIgKFNXVC5Gb2N1c0luLCBmaWx0ZXIpOwotCQkJZGlzcGxheS5hZGRGaWx0ZXIgKFNXVC5Gb2N1c0luLCBmaWx0ZXIpOwotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLQkJCW5vdGlmeUxpc3RlbmVycyAoU1dULkZvY3VzSW4sIGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuRm9jdXNPdXQ6IHsKLQkJCWlmICghaGFzRm9jdXMpIHJldHVybjsKLQkJCUNvbnRyb2wgZm9jdXNDb250cm9sID0gZ2V0RGlzcGxheSAoKS5nZXRGb2N1c0NvbnRyb2wgKCk7Ci0JCQlpZiAoZm9jdXNDb250cm9sID09IGFycm93IHx8IGZvY3VzQ29udHJvbCA9PSBsaXN0IHx8IGZvY3VzQ29udHJvbCA9PSB0ZXh0KSByZXR1cm47Ci0JCQloYXNGb2N1cyA9IGZhbHNlOwotCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCAoKTsKLQkJCXNoZWxsLnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5ICgpOwotCQkJZGlzcGxheS5yZW1vdmVGaWx0ZXIgKFNXVC5Gb2N1c0luLCBmaWx0ZXIpOwotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLQkJCW5vdGlmeUxpc3RlbmVycyAoU1dULkZvY3VzT3V0LCBlKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotLyoqCi0gKiBTZWFyY2hlcyB0aGUgcmVjZWl2ZXIncyBsaXN0IHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBpdGVtCi0gKiAoaW5kZXggMCkgdW50aWwgYW4gaXRlbSBpcyBmb3VuZCB0aGF0IGlzIGVxdWFsIHRvIHRoZSAKLSAqIGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhhdCBpdGVtLiBJZiBubyBpdGVtCi0gKiBpcyBmb3VuZCwgcmV0dXJucyAtMS4KLSAqCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBzZWFyY2ggaXRlbQotICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGluZGV4T2YgKFN0cmluZyBzdHJpbmcpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXJldHVybiBsaXN0LmluZGV4T2YgKHN0cmluZyk7Ci19Ci0vKioKLSAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGdpdmVuLCAKLSAqIHplcm8tcmVsYXRpdmUgaW5kZXggdW50aWwgYW4gaXRlbSBpcyBmb3VuZCB0aGF0IGlzIGVxdWFsCi0gKiB0byB0aGUgYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGF0IGl0ZW0uIElmCi0gKiBubyBpdGVtIGlzIGZvdW5kIG9yIHRoZSBzdGFydGluZyBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsCi0gKiByZXR1cm5zIC0xLgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gKiBAcGFyYW0gc3RhcnQgdGhlIHplcm8tcmVsYXRpdmUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gdGhlIHNlYXJjaAotICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGluZGV4T2YgKFN0cmluZyBzdHJpbmcsIGludCBzdGFydCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JcmV0dXJuIGxpc3QuaW5kZXhPZiAoc3RyaW5nLCBzdGFydCk7Ci19Ci0KLXZvaWQgaW5pdEFjY2Vzc2libGUoKSB7Ci0JQWNjZXNzaWJsZUFkYXB0ZXIgYWNjZXNzaWJsZUFkYXB0ZXIgPSBuZXcgQWNjZXNzaWJsZUFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCBnZXROYW1lIChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkJTGFiZWwgbGFiZWwgPSBnZXRBc3NvY2lhdGVkTGFiZWwgKCk7Ci0JCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBzdHJpcE1uZW1vbmljIChsYWJlbC5nZXRUZXh0KCkpOwotCQkJfQotCQkJZS5yZXN1bHQgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCVN0cmluZyBzaG9ydGN1dCA9IG51bGw7Ci0JCQlMYWJlbCBsYWJlbCA9IGdldEFzc29jaWF0ZWRMYWJlbCAoKTsKLQkJCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBsYWJlbC5nZXRUZXh0ICgpOwotCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJY2hhciBtbmVtb25pYyA9IF9maW5kTW5lbW9uaWMgKHRleHQpOwotCQkJCQlpZiAobW5lbW9uaWMgIT0gJ1wwJykgewotCQkJCQkJc2hvcnRjdXQgPSAiQWx0KyIrbW5lbW9uaWM7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWUucmVzdWx0ID0gc2hvcnRjdXQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0SGVscCAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQgKCk7Ci0JCX0KLQl9OwotCWdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChhY2Nlc3NpYmxlQWRhcHRlcik7Ci0JdGV4dC5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAoYWNjZXNzaWJsZUFkYXB0ZXIpOwotCWxpc3QuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKGFjY2Vzc2libGVBZGFwdGVyKTsKLQkKLQlhcnJvdy5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBnZXROYW1lIChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJZS5yZXN1bHQgPSBpc0Ryb3BwZWQgKCkgPyBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9DbG9zZSIpIDogU1dULmdldE1lc3NhZ2UgKCJTV1RfT3BlbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRLZXlib2FyZFNob3J0Y3V0IChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJZS5yZXN1bHQgPSAiQWx0K0Rvd24gQXJyb3ciOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHVibGljIHZvaWQgZ2V0SGVscCAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQgKCk7Ci0JCX0KLQl9KTsKLQotCWdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZVRleHRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBnZXRDYXJldE9mZnNldCAoQWNjZXNzaWJsZVRleHRFdmVudCBlKSB7Ci0JCQllLm9mZnNldCA9IHRleHQuZ2V0Q2FyZXRQb3NpdGlvbiAoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRTZWxlY3Rpb25SYW5nZShBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLQkJCVBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQllLm9mZnNldCA9IHNlbC54OwotCQkJZS5sZW5ndGggPSBzZWwueSAtIHNlbC54OwotCQl9Ci0JfSk7Ci0JCi0JZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludCAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlQb2ludCB0ZXN0UG9pbnQgPSB0b0NvbnRyb2wgKGUueCwgZS55KTsKLQkJCWlmIChnZXRCb3VuZHMgKCkuY29udGFpbnMgKHRlc3RQb2ludCkpIHsKLQkJCQllLmNoaWxkSUQgPSBBQ0MuQ0hJTERJRF9TRUxGOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbiAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgbG9jYXRpb24gPSBnZXRCb3VuZHMgKCk7Ci0JCQlQb2ludCBwdCA9IHRvRGlzcGxheSAobG9jYXRpb24ueCwgbG9jYXRpb24ueSk7Ci0JCQllLnggPSBwdC54OwotCQkJZS55ID0gcHQueTsKLQkJCWUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsKLQkJCWUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50IChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCWUuZGV0YWlsID0gMDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZ2V0Um9sZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQllLmRldGFpbCA9IEFDQy5ST0xFX0NPTUJPQk9YOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQllLmRldGFpbCA9IEFDQy5TVEFURV9OT1JNQUw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQllLnJlc3VsdCA9IGdldFRleHQgKCk7Ci0JCX0KLQl9KTsKLQotCXRleHQuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZ2V0Um9sZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQllLmRldGFpbCA9IHRleHQuZ2V0RWRpdGFibGUgKCkgPyBBQ0MuUk9MRV9URVhUIDogQUNDLlJPTEVfTEFCRUw7Ci0JCX0KLQl9KTsKLQotCWFycm93LmdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0RGVmYXVsdEFjdGlvbiAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQllLnJlc3VsdCA9IGlzRHJvcHBlZCAoKSA/IFNXVC5nZXRNZXNzYWdlICgiU1dUX0Nsb3NlIikgOiBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9PcGVuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfSk7Ci19Ci1ib29sZWFuIGlzRHJvcHBlZCAoKSB7Ci0JcmV0dXJuIHBvcHVwLmdldFZpc2libGUgKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQ29udHJvbCAoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAodGV4dC5pc0ZvY3VzQ29udHJvbCAoKSB8fCBhcnJvdy5pc0ZvY3VzQ29udHJvbCAoKSB8fCBsaXN0LmlzRm9jdXNDb250cm9sICgpIHx8IHBvcHVwLmlzRm9jdXNDb250cm9sICgpKSB7Ci0JCXJldHVybiB0cnVlOwotCX0gCi0JcmV0dXJuIHN1cGVyLmlzRm9jdXNDb250cm9sICgpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0SW5kZW50KGludCBpbmRlbnQpIHsKLQl0ZXh0SW5kZW50ID0gaW5kZW50OwotfQotCi12b2lkIGludGVybmFsTGF5b3V0IChib29sZWFuIGNoYW5nZWQpIHsKLQlpZiAoaXNEcm9wcGVkICgpKSBkcm9wRG93biAoZmFsc2UpOwotCVJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSAoKTsKLQlpbnQgd2lkdGggPSByZWN0LndpZHRoOwotCWludCBoZWlnaHQgPSByZWN0LmhlaWdodDsKLQlQb2ludCBhcnJvd1NpemUgPSBhcnJvdy5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIGhlaWdodCwgY2hhbmdlZCk7Ci0KLQl0ZXh0LnBhY2soKTsKLQlpbnQgdGV4dEhlaWdodCA9IHRleHQuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCWludCB0ZXh0WCA9IHRleHRJbmRlbnQ7Ci0JaW50IHRleHRZID0gKGhlaWdodCAtIHRleHRIZWlnaHQpIC8gMjsKLQl0ZXh0LnNldExvY2F0aW9uKHRleHRYLCB0ZXh0WSk7Ci0JCi0JYXJyb3cuc2V0Qm91bmRzICh3aWR0aCAtIGFycm93U2l6ZS54LCAwLCBhcnJvd1NpemUueCwgYXJyb3dTaXplLnkpOwotfQotdm9pZCBsaXN0RXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0Jc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQlpZiAoZ2V0U2hlbGwgKCkgIT0gcG9wdXAuZ2V0UGFyZW50ICgpKSB7Ci0JCQkJU3RyaW5nW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zICgpOwotCQkJCWludCBzZWxlY3Rpb25JbmRleCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJcG9wdXAgPSBudWxsOwotCQkJCWxpc3QgPSBudWxsOwotCQkJCWNyZWF0ZVBvcHVwIChpdGVtcywgc2VsZWN0aW9uSW5kZXgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1dULkZvY3VzSW46IHsKLQkJCWhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5Nb3VzZVVwOiB7Ci0JCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCWRyb3BEb3duIChmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5TZWxlY3Rpb246IHsKLQkJCWludCBpbmRleCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLQkJCXRleHQuc2V0VGV4dCAobGlzdC5nZXRJdGVtIChpbmRleCkpOwotLy8JCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCWxpc3Quc2V0U2VsZWN0aW9uIChpbmRleCk7Ci0JCQlFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCWUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotCQkJZS5kb2l0ID0gZXZlbnQuZG9pdDsKLQkJCWlmICghaXNEcm9wcGVkKCkpIHsKLQkJCQlub3RpZnlMaXN0ZW5lcnMgKFNXVC5TZWxlY3Rpb24sIGUpOwotCQkJfQotCQkJZXZlbnQuZG9pdCA9IGUuZG9pdDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1dULlRyYXZlcnNlOiB7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVDoKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0JCQllLnRpbWUgPSBldmVudC50aW1lOwotCQkJZS5kZXRhaWwgPSBldmVudC5kZXRhaWw7Ci0JCQllLmRvaXQgPSBldmVudC5kb2l0OwotCQkJZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0JCQllLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotCQkJbm90aWZ5TGlzdGVuZXJzIChTV1QuVHJhdmVyc2UsIGUpOwotCQkJZXZlbnQuZG9pdCA9IGUuZG9pdDsKLQkJCWV2ZW50LmRldGFpbCA9IGUuZGV0YWlsOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuS2V5VXA6IHsJCQotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQllLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLQkJCWUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JCQllLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCQotCQkJbm90aWZ5TGlzdGVuZXJzIChTV1QuS2V5VXAsIGUpOwotCQkJCi0JCQkKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1dULktleURvd246IHsKLQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkVTQykgeyAKLQkJCQkvLyBFc2NhcGUga2V5IGNhbmNlbHMgcG9wdXAgbGlzdAotCQkJCWRyb3BEb3duIChmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5BTFQpICE9IDAgJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQIHx8IGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0RPV04pKSB7Ci0JCQkJZHJvcERvd24gKGZhbHNlKTsKLQkJCX0KLQkJCQotCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkvLyBFbnRlciBjYXVzZXMgZGVmYXVsdCBzZWxlY3Rpb24KLQkJCQlkcm9wRG93biAoZmFsc2UpOwotCQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0JCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCQllLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCQlub3RpZnlMaXN0ZW5lcnMgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBlKTsKLQkJCX0KLQkJCS8vIEF0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotCQkJLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLQkJCWlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQllLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLQkJCWUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JCQllLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgZSk7Ci0JCQlicmVhazsKLQkJCQotCQl9Ci0JfQotfQotCi12b2lkIHBvcHVwRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJY2FzZSBTV1QuUGFpbnQ6Ci0JCQkvLyBkcmF3IGJsYWNrIHJlY3RhbmdsZSBhcm91bmQgbGlzdAotCQkJUmVjdGFuZ2xlIGxpc3RSZWN0ID0gbGlzdC5nZXRCb3VuZHMoKTsKLQkJCUNvbG9yIGJsYWNrID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCQlldmVudC5nYy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLQkJCWV2ZW50LmdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgbGlzdFJlY3Qud2lkdGggKyAxLCBsaXN0UmVjdC5oZWlnaHQgKyAxKTsKLQkJCWJyZWFrOwotCQljYXNlIFNXVC5DbG9zZToKLQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCWRyb3BEb3duIChmYWxzZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1QuRGVhY3RpdmF0ZToKLQkJCWRyb3BEb3duIChmYWxzZSk7Ci0JCQlicmVhazsKLQl9Ci19Ci1wdWJsaWMgdm9pZCByZWRyYXcgKCkgewotCXN1cGVyLnJlZHJhdygpOwotCXRleHQucmVkcmF3KCk7Ci0JYXJyb3cucmVkcmF3KCk7Ci0JaWYgKHBvcHVwLmlzVmlzaWJsZSgpKSBsaXN0LnJlZHJhdygpOwotfQotcHVibGljIHZvaWQgcmVkcmF3IChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBhbGwpIHsKLQlzdXBlci5yZWRyYXcoeCwgeSwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSByZWNlaXZlcidzIGxpc3QgYXQgdGhlIGdpdmVuCi0gKiB6ZXJvLXJlbGF0aXZlIGluZGV4LgotICoKLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZSAoaW50IGluZGV4KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlsaXN0LnJlbW92ZSAoaW5kZXgpOwotfQotLyoqCi0gKiBSZW1vdmVzIHRoZSBpdGVtcyBmcm9tIHRoZSByZWNlaXZlcidzIGxpc3Qgd2hpY2ggYXJlCi0gKiBiZXR3ZWVuIHRoZSBnaXZlbiB6ZXJvLXJlbGF0aXZlIHN0YXJ0IGFuZCBlbmQgCi0gKiBpbmRpY2VzIChpbmNsdXNpdmUpLgotICoKLSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0gKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHJhbmdlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiBlaXRoZXIgdGhlIHN0YXJ0IG9yIGVuZCBhcmUgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZSAoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlsaXN0LnJlbW92ZSAoc3RhcnQsIGVuZCk7Ci19Ci0vKioKLSAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGl0ZW0KLSAqIHVudGlsIGFuIGl0ZW0gaXMgZm91bmQgdGhhdCBpcyBlcXVhbCB0byB0aGUgYXJndW1lbnQsIAotICogYW5kIHJlbW92ZXMgdGhhdCBpdGVtIGZyb20gdGhlIGxpc3QuCi0gKgotICogQHBhcmFtIHN0cmluZyB0aGUgaXRlbSB0byByZW1vdmUKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0PC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZSAoU3RyaW5nIHN0cmluZykgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKHN0cmluZyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlsaXN0LnJlbW92ZSAoc3RyaW5nKTsKLX0KLS8qKgotICogUmVtb3ZlcyBhbGwgb2YgdGhlIGl0ZW1zIGZyb20gdGhlIHJlY2VpdmVyJ3MgbGlzdCBhbmQgY2xlYXIgdGhlCi0gKiBjb250ZW50cyBvZiByZWNlaXZlcidzIHRleHQgZmllbGQuCi0gKiA8cD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlQWxsICgpIHsKLQljaGVja1dpZGdldCgpOwotCXRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi0JbGlzdC5yZW1vdmVBbGwgKCk7Ci19Ci0vKioKLSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gKiBiZSBub3RpZmllZCB3aGVuIHRoZSByZWNlaXZlcidzIHRleHQgaXMgbW9kaWZpZWQuCi0gKgotICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgTW9kaWZ5TGlzdGVuZXIKLSAqIEBzZWUgI2FkZE1vZGlmeUxpc3RlbmVyCi0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyIChNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIGxpc3RlbmVyKTsJCi19Ci0vKioKLSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gKiBiZSBub3RpZmllZCB3aGVuIHRoZSByZWNlaXZlcidzIHNlbGVjdGlvbiBjaGFuZ2VzLgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIFNlbGVjdGlvbkxpc3RlbmVyCi0gKiBAc2VlICNhZGRTZWxlY3Rpb25MaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lciAoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlyZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JcmVtb3ZlTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sbGlzdGVuZXIpOwkKLX0KLS8qKgotICogU2VsZWN0cyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gemVyby1yZWxhdGl2ZSBpbmRleCBpbiB0aGUgcmVjZWl2ZXIncyAKLSAqIGxpc3QuICBJZiB0aGUgaXRlbSBhdCB0aGUgaW5kZXggd2FzIGFscmVhZHkgc2VsZWN0ZWQsIGl0IHJlbWFpbnMKLSAqIHNlbGVjdGVkLiBJbmRpY2VzIHRoYXQgYXJlIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZC4KLSAqCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHNlbGVjdAotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2VsZWN0IChpbnQgaW5kZXgpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChpbmRleCA9PSAtMSkgewotCQlsaXN0LmRlc2VsZWN0QWxsICgpOwotCQl0ZXh0LnNldFRleHQgKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm47Ci0JfQotCWlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgbGlzdC5nZXRJdGVtQ291bnQoKSkgewotCQlpZiAoaW5kZXggIT0gZ2V0U2VsZWN0aW9uSW5kZXgoKSkgewotCQkJdGV4dC5zZXRUZXh0IChsaXN0LmdldEl0ZW0gKGluZGV4KSk7Ci0vLwkJCXRleHQuc2VsZWN0QWxsICgpOwotCQkJbGlzdC5zZWxlY3QgKGluZGV4KTsKLQkJCWxpc3Quc2hvd1NlbGVjdGlvbiAoKTsKLQkJfQotCX0KLX0KLXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQgKENvbG9yIGNvbG9yKSB7Ci0Jc3VwZXIuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYmFja2dyb3VuZCA9IGNvbG9yOwotCWlmICh0ZXh0ICE9IG51bGwpIHRleHQuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JaWYgKGxpc3QgIT0gbnVsbCkgbGlzdC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlpZiAoYXJyb3cgIT0gbnVsbCkgYXJyb3cuc2V0QmFja2dyb3VuZChjb2xvcik7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotICoKLSAqIEBwYXJhbSBlZGl0YWJsZSB0aGUgbmV3IGVkaXRhYmxlIHN0YXRlCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlIChib29sZWFuIGVkaXRhYmxlKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JdGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRFbmFibGVkIChib29sZWFuIGVuYWJsZWQpIHsKLQlzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotCWlmIChwb3B1cCAhPSBudWxsKSBwb3B1cC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JaWYgKHRleHQgIT0gbnVsbCkgdGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCWlmIChhcnJvdyAhPSBudWxsKSBhcnJvdy5zZXRFbmFibGVkKGVuYWJsZWQpOwotfQotcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMgKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIHRleHQuc2V0Rm9jdXMgKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRGb250IChGb250IGZvbnQpIHsKLQlzdXBlci5zZXRGb250IChmb250KTsKLQl0aGlzLmZvbnQgPSBmb250OwotCXRleHQuc2V0Rm9udCAoZm9udCk7Ci0JbGlzdC5zZXRGb250IChmb250KTsKLQlpbnRlcm5hbExheW91dCAodHJ1ZSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kIChDb2xvciBjb2xvcikgewotCXN1cGVyLnNldEZvcmVncm91bmQoY29sb3IpOwotCWZvcmVncm91bmQgPSBjb2xvcjsKLQlpZiAodGV4dCAhPSBudWxsKSB0ZXh0LnNldEZvcmVncm91bmQoY29sb3IpOwotCWlmIChsaXN0ICE9IG51bGwpIGxpc3Quc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JaWYgKGFycm93ICE9IG51bGwpIGFycm93LnNldEZvcmVncm91bmQoY29sb3IpOwotfQotLyoqCi0gKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBpdGVtIGluIHRoZSByZWNlaXZlcidzIGxpc3QgYXQgdGhlIGdpdmVuCi0gKiB6ZXJvLXJlbGF0aXZlIGluZGV4IHRvIHRoZSBzdHJpbmcgYXJndW1lbnQuIFRoaXMgaXMgZXF1aXZhbGVudAotICogdG8gPGNvZGU+cmVtb3ZlPC9jb2RlPidpbmcgdGhlIG9sZCBpdGVtIGF0IHRoZSBpbmRleCwgYW5kIHRoZW4KLSAqIDxjb2RlPmFkZDwvY29kZT4naW5nIHRoZSBuZXcgaXRlbSBhdCB0aGF0IGluZGV4LgotICoKLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBuZXcgdGV4dCBmb3IgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSAtIGlmIHRoZSBpbmRleCBpcyBub3QgYmV0d2VlbiAwIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IG1pbnVzIDEgKGluY2x1c2l2ZSk8L2xpPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0SXRlbSAoaW50IGluZGV4LCBTdHJpbmcgc3RyaW5nKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlsaXN0LnNldEl0ZW0gKGluZGV4LCBzdHJpbmcpOwotfQotLyoqCi0gKiBTZXRzIHRoZSByZWNlaXZlcidzIGxpc3QgdG8gYmUgdGhlIGdpdmVuIGFycmF5IG9mIGl0ZW1zLgotICoKLSAqIEBwYXJhbSBpdGVtcyB0aGUgYXJyYXkgb2YgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBpdGVtcyBhcnJheSBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgYW4gaXRlbSBpbiB0aGUgaXRlbXMgYXJyYXkgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRJdGVtcyAoU3RyaW5nIFtdIGl0ZW1zKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JbGlzdC5zZXRJdGVtcyAoaXRlbXMpOwotCWlmICghdGV4dC5nZXRFZGl0YWJsZSAoKSkgdGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogU2V0cyB0aGUgbGF5b3V0IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZXIgdG8gYmUKLSAqIHRoZSBhcmd1bWVudCB3aGljaCBtYXkgYmUgbnVsbC4KLSAqIDxwPgotICogTm90ZTogTm8gTGF5b3V0IGNhbiBiZSBzZXQgb24gdGhpcyBDb250cm9sIGJlY2F1c2UgaXQgYWxyZWFkeQotICogbWFuYWdlcyB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgaXRzIGNoaWxkcmVuLgotICogPC9wPgotICoKLSAqIEBwYXJhbSBsYXlvdXQgdGhlIHJlY2VpdmVyJ3MgbmV3IGxheW91dCBvciBudWxsCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRMYXlvdXQgKExheW91dCBsYXlvdXQpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm47Ci19Ci1wdWJsaWMgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgewotCXRleHQuc2V0TWVudShtZW51KTsKLX0KLS8qKgotICogU2V0cyB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gdGhlCi0gKiByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50IHdob3NlIHggY29vcmRpbmF0ZSBpcyB0aGUKLSAqIHN0YXJ0IG9mIHRoZSBzZWxlY3Rpb24gYW5kIHdob3NlIHkgY29vcmRpbmF0ZSBpcyB0aGUgZW5kCi0gKiBvZiB0aGUgc2VsZWN0aW9uLiAKLSAqCi0gKiBAcGFyYW0gc2VsZWN0aW9uIGEgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBuZXcgc2VsZWN0aW9uIHN0YXJ0IGFuZCBlbmQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwb2ludCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiAoUG9pbnQgc2VsZWN0aW9uKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoc2VsZWN0aW9uID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXRleHQuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gdGhlCi0gKiBnaXZlbiBzdHJpbmcuCi0gKiA8cD4KLSAqIE5vdGU6IFRoZSB0ZXh0IGZpZWxkIGluIGEgPGNvZGU+Q29tYm88L2NvZGU+IGlzIHR5cGljYWxseQotICogb25seSBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgYSBzaW5nbGUgbGluZSBvZiB0ZXh0LiBUaHVzLAotICogc2V0dGluZyB0aGUgdGV4dCB0byBhIHN0cmluZyBjb250YWluaW5nIGxpbmUgYnJlYWtzIG9yCi0gKiBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgd2lsbCBwcm9iYWJseSBjYXVzZSBpdCB0byAKLSAqIGRpc3BsYXkgaW5jb3JyZWN0bHkuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IHRleHQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRUZXh0IChTdHJpbmcgc3RyaW5nKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZiAoc3RyaW5nKTsKLQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJbGlzdC5kZXNlbGVjdEFsbCAoKTsKLQkJdGV4dC5zZXRUZXh0IChzdHJpbmcpOwotCQlyZXR1cm47Ci0JfQotCXRleHQuc2V0VGV4dCAoc3RyaW5nKTsKLS8vCXRleHQuc2VsZWN0QWxsICgpOwotCWxpc3Quc2V0U2VsZWN0aW9uIChpbmRleCk7Ci0JbGlzdC5zaG93U2VsZWN0aW9uICgpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIHJlY2VpdmVyJ3MKLSAqIHRleHQgZmllbGQgaXMgY2FwYWJsZSBvZiBob2xkaW5nIHRvIGJlIHRoZSBhcmd1bWVudC4KLSAqCi0gKiBAcGFyYW0gbGltaXQgbmV3IHRleHQgbGltaXQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfQ0FOTk9UX0JFX1pFUk8gLSBpZiB0aGUgbGltaXQgaXMgemVybzwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRUZXh0TGltaXQgKGludCBsaW1pdCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JdGV4dC5zZXRUZXh0TGltaXQgKGxpbWl0KTsKLX0KLQotcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQgKFN0cmluZyBzdHJpbmcpIHsKLQljaGVja1dpZGdldCgpOwotCXN1cGVyLnNldFRvb2xUaXBUZXh0KHN0cmluZyk7Ci0JYXJyb3cuc2V0VG9vbFRpcFRleHQgKHN0cmluZyk7Ci0JdGV4dC5zZXRUb29sVGlwVGV4dCAoc3RyaW5nKTsJCQotfQotCi1wdWJsaWMgdm9pZCBzZXRWaXNpYmxlIChib29sZWFuIHZpc2libGUpIHsKLQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCWlmICghdmlzaWJsZSkgcG9wdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSBkcm9wCi0gKiBkb3duIHBvcnRpb24gb2YgdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcGFyYW0gY291bnQgdGhlIG5ldyBudW1iZXIgb2YgaXRlbXMgdG8gYmUgdmlzaWJsZQotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgdm9pZCBzZXRWaXNpYmxlSXRlbUNvdW50IChpbnQgY291bnQpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpZiAoY291bnQgPCAwKSByZXR1cm47Ci0JdmlzaWJsZUl0ZW1Db3VudCA9IGNvdW50OwotfQotU3RyaW5nIHN0cmlwTW5lbW9uaWMgKFN0cmluZyBzdHJpbmcpIHsKLQlpbnQgaW5kZXggPSAwOwotCWludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoICgpOwotCWRvIHsKLQkJd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgKHN0cmluZy5jaGFyQXQgKGluZGV4KSAhPSAnJicpKSBpbmRleCsrOwotCQlpZiAoKytpbmRleCA+PSBsZW5ndGgpIHJldHVybiBzdHJpbmc7Ci0JCWlmIChzdHJpbmcuY2hhckF0IChpbmRleCkgIT0gJyYnKSB7Ci0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleC0xKSArIHN0cmluZy5zdWJzdHJpbmcoaW5kZXgsIGxlbmd0aCk7Ci0JCX0KLQkJaW5kZXgrKzsKLQl9IHdoaWxlIChpbmRleCA8IGxlbmd0aCk7Ci0gCXJldHVybiBzdHJpbmc7Ci19Ci12b2lkIHRleHRFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJY2FzZSBTV1QuRm9jdXNJbjogewotCQkJaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c0luKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1dULktleURvd246IHsKLQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0JCQkJZHJvcERvd24gKGZhbHNlKTsKLQkJCQlFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotCQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQkJZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQkJbm90aWZ5TGlzdGVuZXJzIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZSk7Ci0JCQl9Ci0JCQkvL0F0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotCQkJLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLQkJCWlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLQkJCQotCQkJaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQIHx8IGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0RPV04pIHsKLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwKSB7Ci0JCQkJCWJvb2xlYW4gZHJvcHBlZCA9IGlzRHJvcHBlZCAoKTsKLS8vCQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQkJaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLQkJCQkJZHJvcERvd24gKCFkcm9wcGVkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaW50IG9sZEluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQKSB7Ci0JCQkJCXNlbGVjdCAoTWF0aC5tYXggKG9sZEluZGV4IC0gMSwgMCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGVjdCAoTWF0aC5taW4gKG9sZEluZGV4ICsgMSwgZ2V0SXRlbUNvdW50ICgpIC0gMSkpOwotCQkJCX0KLQkJCQlpZiAob2xkSW5kZXggIT0gZ2V0U2VsZWN0aW9uSW5kZXggKCkpIHsKLQkJCQkJRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCQkJCQllLnRpbWUgPSBldmVudC50aW1lOwotCQkJCQllLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzIChTV1QuU2VsZWN0aW9uLCBlKTsKLQkJCQl9Ci0JCQkJLy9BdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZC4KLQkJCQkvLyBJZiBzbywgZG8gbm90IGNvbnRpbnVlLgotCQkJCWlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLQkJCX0KLQkJCQotCQkJLy8gRnVydGhlciB3b3JrIDogTmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgaW5jcmVtZW50YWwgc2VhcmNoIGluIAotCQkJLy8gcG9wIHVwIGxpc3QgYXMgY2hhcmFjdGVycyB0eXBlZCBpbiB0ZXh0IHdpZGdldAotCQkJCi0KLQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0JCQllLnRpbWUgPSBldmVudC50aW1lOwotCQkJZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0JCQllLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotCQkJZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQkvL25vdGlmeUxpc3RlbmVycyAoU1dULktleURvd24sIGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuS2V5VXA6IHsKLQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0JCQllLnRpbWUgPSBldmVudC50aW1lOwotCQkJZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0JCQllLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotCQkJZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQlub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlVcCwgZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5NZW51RGV0ZWN0OiB7Ci0JCQlFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotCQkJZS50aW1lID0gZXZlbnQudGltZTsKLQkJCW5vdGlmeUxpc3RlbmVycyAoU1dULk1lbnVEZXRlY3QsIGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuTW9kaWZ5OiB7Ci0JCQlsaXN0LmRlc2VsZWN0QWxsICgpOwotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQlub3RpZnlMaXN0ZW5lcnMgKFNXVC5Nb2RpZnksIGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuTW91c2VEb3duOiB7Ci0JCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCWlmICh0ZXh0LmdldEVkaXRhYmxlICgpKSByZXR1cm47Ci0JCQlib29sZWFuIGRyb3BwZWQgPSBpc0Ryb3BwZWQgKCk7Ci0vLwkJCXRleHQuc2VsZWN0QWxsICgpOwotCQkJaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLQkJCWRyb3BEb3duICghZHJvcHBlZCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNXVC5Nb3VzZVVwOiB7Ci0JCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCWlmICh0ZXh0LmdldEVkaXRhYmxlICgpKSByZXR1cm47Ci0vLwkJCXRleHQuc2VsZWN0QWxsICgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTV1QuVHJhdmVyc2U6IHsJCQotCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVDoKLQkJCQkJLy8gVGhlIGVudGVyIGNhdXNlcyBkZWZhdWx0IHNlbGVjdGlvbiBhbmQKLQkJCQkJLy8gdGhlIGFycm93IGtleXMgYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgbGlzdCBjb250ZW50cyBzbwotCQkJCQkvLyBkbyBub3QgdXNlIHRoZW0gZm9yIHRyYXZlcnNhbC4KLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLQkJCWUudGltZSA9IGV2ZW50LnRpbWU7Ci0JCQllLmRldGFpbCA9IGV2ZW50LmRldGFpbDsKLQkJCWUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0JCQllLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLQkJCWUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JCQlub3RpZnlMaXN0ZW5lcnMgKFNXVC5UcmF2ZXJzZSwgZSk7Ci0JCQlldmVudC5kb2l0ID0gZS5kb2l0OwotCQkJZXZlbnQuZGV0YWlsID0gZS5kZXRhaWw7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2RpcmVjdGVkaXQvQVNEQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9kaXJlY3RlZGl0L0FTRENvbWJvQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjMzYzU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2RpcmVjdGVkaXQvQVNEQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotCi0vKgotICogVGhpcyBpcyBhIGNvcHkgb2YgQ29tYm9Cb3hDZWxsRWRpdG9yLgotICogV2UgbmVlZCB0byBhcHBseSBhbmQgZGVhY3RpdmF0ZSB0aGUgY29tYm8gb24gYSBzaW5nbGUgY2xpY2sgKG5vdCBvbiBhIGRvdWJsZSBjbGljayBsaWtlCi0gKiB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yKS4KLSAqLwotcHVibGljIGNsYXNzIEFTRENvbWJvQm94Q2VsbEVkaXRvciBleHRlbmRzIENlbGxFZGl0b3IgewotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3Qgb2YgaXRlbXMgdG8gcHJlc2VudCBpbiB0aGUgY29tYm8gYm94LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gaXRlbXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbS4KLSAgICAgKi8KLSAgICBpbnQgc2VsZWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1c3RvbSBjb21ibyBib3ggY29udHJvbC4KLSAgICAgKi8KLSAgICBBU0RDQ29tYm8gY29tYm9Cb3g7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBjZWxsLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb250aW51ZUFwcGx5OyAgICAKLSAgICBwcml2YXRlIE9iamVjdCBzZWxlY3RlZFZhbHVlOwotICAgIHByaXZhdGUgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBpbnQgdGV4dEluZGVudCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IENvbWJvQm94Q2VsbEVkaXRvciBzdHlsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0U3R5bGUgPSBTV1QuTk9ORTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY2VsbCBlZGl0b3Igd2l0aCBhIGNvbWJvIGNvbnRhaW5pbmcgdGhlIGdpdmVuIAotICAgICAqIGxpc3Qgb2YgY2hvaWNlcyBhbmQgcGFyZW50ZWQgdW5kZXIgdGhlIGdpdmVuIGNvbnRyb2wuIFRoZSBjZWxsCi0gICAgICogZWRpdG9yIHZhbHVlIGlzIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtLgotICAgICAqIEluaXRpYWxseSwgdGhlIGNlbGwgZWRpdG9yIGhhcyBubyBjZWxsIHZhbGlkYXRvciBhbmQKLSAgICAgKiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyBzZWxlY3RlZC4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqIEBwYXJhbSBpdGVtcyB0aGUgbGlzdCBvZiBzdHJpbmdzIGZvciB0aGUgY29tYm8gYm94Ci0gICAgICovCi0gICAgcHVibGljIEFTRENvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcywgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBkZWZhdWx0U3R5bGUpOwotICAgICAgICBzZXRJdGVtcyhpdGVtcyk7Ci0gICAgICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyID0gZWRpdE1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaG9pY2VzIGZvciB0aGUgY29tYm8gYm94Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNob2ljZXMgZm9yIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLml0ZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgY2hvaWNlcyBmb3IgdGhlIGNvbWJvIGJveAotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1zIHRoZSBsaXN0IG9mIGNob2ljZXMgZm9yIHRoZSBjb21ibyBib3gKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGl0ZW1zKTsKLSAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zOwotICAgICAgICBwb3B1bGF0ZUNvbWJvQm94SXRlbXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dEluZGVudChpbnQgaW5kZW50KSB7Ci0gICAgCXRleHRJbmRlbnQgPSBpbmRlbnQ7Ci0gICAgCWNvbWJvQm94LnNldFRleHRJbmRlbnQoaW5kZW50KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIENlbGxFZGl0b3IuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNvbWJvQm94ID0gbmV3IEFTRENDb21ibyhwYXJlbnQsIGdldFN0eWxlKCkpOwotICAgICAgICBjb21ib0JveC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgICAgICBjb21ib0JveC5zZXRUZXh0SW5kZW50KHRleHRJbmRlbnQpOwotICAgICAgICAKLSAgICAgICAgY29tYm9Cb3guYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBob29rIGtleSBwcmVzc2VkIC0gc2VlIFBSIDE0MjAxICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGtleVJlbGVhc2VPY2N1cmVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjb21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHNlbGVjdGlvbk1hZGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIAlzZWxlY3Rpb25NYWRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGNvbWJvQm94LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9FU0NBUEUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLSAgICAgICAgICAgICAgICAgICAgZS5kb2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjb21ib0JveC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgQVNEQ29tYm9Cb3hDZWxsRWRpdG9yLnRoaXMuZm9jdXNMb3N0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gY29tYm9Cb3g7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgT2JqZWN0IGludm9rZURpYWxvZyhJQ29tcG9uZW50RGlhbG9nIGRpYWxvZykgewotICAJICBPYmplY3QgbmV3VmFsdWUgPSBudWxsOwotICAJICAKLSAgCSAgaWYgKGRpYWxvZyA9PSBudWxsKSB7Ci0gIAkJICByZXR1cm4gbnVsbDsKLSAgCSAgfQotICAJICAKLSAgCSAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gIAkJICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAJICB9Ci0gIAkgIGVsc2UgewotICAJCSAgY29udGludWVBcHBseSA9IGZhbHNlOwotICAJICB9Ci0KLSAgCSAgcmV0dXJuIG5ld1ZhbHVlOwotICAgIH0gIAotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNvbWJvQm94Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YKLSAgICAgKiB0aGlzIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IGZyYW1ld29yayBtZXRob2QgcmV0dXJucwotICAgICAqIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHdyYXBwZWQKLSAgICAgKiAgYXMgYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihzZWxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gQ2VsbEVkaXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldEZvY3VzKCkgewotICAgICAgICBjb21ib0JveC5zZXRGb2N1cygpOwotICAgICAgICBjb21ib0JveC5kcm9wRG93bih0cnVlKTsKLS8vICAgICAgICBTdHJpbmcgY29tYm9UZXh0ID0gY29tYm9Cb3guZ2V0VGV4dCgpOwotLy8gICAgICAgIGNvbWJvQm94LnNldFRleHQoIiAgICAgICAgICIgKyBjb21ib1RleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5Db21ib0JveENlbGxFZGl0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mCi0gICAgICogdGhpcyA8Y29kZT5DZWxsRWRpdG9yPC9jb2RlPiBmcmFtZXdvcmsgbWV0aG9kIHNldHMgdGhlIAotICAgICAqIG1pbmltdW0gd2lkdGggb2YgdGhlIGNlbGwuICBUaGUgbWluaW11bSB3aWR0aCBpcyAxMCBjaGFyYWN0ZXJzCi0gICAgICogaWYgPGNvZGU+Y29tYm9Cb3g8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBvciA8Y29kZT5kaXNwb3NlZDwvY29kZT4KLSAgICAgKiBlbGVzIGl0IGlzIDYwIHBpeGVscyB0byBtYWtlIHN1cmUgdGhlIGFycm93IGJ1dHRvbiBhbmQgc29tZSB0ZXh0IGlzIHZpc2libGUuCi0gICAgICogVGhlIGxpc3Qgb2YgQ0NvbWJvIHdpbGwgYmUgd2lkZSBlbm91Z2ggdG8gc2hvdyBpdHMgbG9uZ2VzdCBpdGVtLgotICAgICAqLwotICAgIHB1YmxpYyBMYXlvdXREYXRhIGdldExheW91dERhdGEoKSB7Ci0gICAgICAgIExheW91dERhdGEgbGF5b3V0RGF0YSA9IHN1cGVyLmdldExheW91dERhdGEoKTsKLSAgICAgICAgaWYgKChjb21ib0JveCA9PSBudWxsKSB8fCBjb21ib0JveC5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICBsYXlvdXREYXRhLm1pbmltdW1XaWR0aCA9IDYwOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1ha2UgdGhlIGNvbWJvQm94IDEwIGNoYXJhY3RlcnMgd2lkZQotICAgICAgICAgICAgR0MgZ2MgPSBuZXcgR0MoY29tYm9Cb3gpOwotICAgICAgICAgICAgbGF5b3V0RGF0YS5taW5pbXVtV2lkdGggPSAoZ2MuZ2V0Rm9udE1ldHJpY3MoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICogMTApICsgMTA7Ci0gICAgICAgICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxheW91dERhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkNvbWJvQm94Q2VsbEVkaXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YKLSAgICAgKiB0aGlzIDxjb2RlPkNlbGxFZGl0b3I8L2NvZGU+IGZyYW1ld29yayBtZXRob2QKLSAgICAgKiBhY2NlcHRzIGEgemVyby1iYXNlZCBpbmRleCBvZiBhIHNlbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgc2VsZWN0aW9uIHdyYXBwZWQKLSAgICAgKiAgIGFzIGFuIDxjb2RlPkludGVnZXI8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShjb21ib0JveCAhPSBudWxsICYmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpKTsKLSAgICAgICAgc2VsZWN0aW9uID0gKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKTsKLSAgICAgICAgY29tYm9Cb3guc2VsZWN0KHNlbGVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbGlzdCBvZiBjaG9pY2VzIGZvciB0aGUgY29tYm8gYm94IGZvciB0aGUgY3VycmVudCBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbWJvQm94SXRlbXMoKSB7Ci0gICAgICAgIGlmIChjb21ib0JveCAhPSBudWxsICYmIGl0ZW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbWJvQm94LnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBjb21ib0JveC5hZGQoaXRlbXNbaV0sIGkpOwotCi0gICAgICAgICAgICBzZXRWYWx1ZVZhbGlkKHRydWUpOwotICAgICAgICAgICAgc2VsZWN0aW9uID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZSBhbmQgZGVhY3RpYXZhdGVzIHRoZSBjZWxsIGVkaXRvcgotICAgICAqLwotICAgIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKSB7Ci0gICAgICAgIC8vCW11c3Qgc2V0IHRoZSBzZWxlY3Rpb24gYmVmb3JlIGdldHRpbmcgdmFsdWUKLSAgICAgICAgc2VsZWN0aW9uID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gZG9HZXRWYWx1ZSgpOwotICAgICAgICBtYXJrRGlydHkoKTsKLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gaXNDb3JyZWN0KG5ld1ZhbHVlKTsKLSAgICAgICAgc2V0VmFsdWVWYWxpZChpc1ZhbGlkKTsKLSAgICAgICAgaWYgKCFpc1ZhbGlkKSB7Ci0gICAgICAgICAgICAvLyB0cnkgdG8gaW5zZXJ0IHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0RXJyb3JNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGl0ZW1zW3NlbGVjdGlvbl0gfSkpOwotICAgICAgICB9Ci0gICAgICAgIGZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0gICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IjZm9jdXNMb3N0KCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmb2N1c0xvc3QoKSB7Ci0gICAgICAgIGlmIChpc0FjdGl2YXRlZCgpKSB7Ci0gICAgICAgICAgICBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yI2tleVJlbGVhc2VPY2N1cmVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQga2V5UmVsZWFzZU9jY3VyZWQoS2V5RXZlbnQga2V5RXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUV2ZW50LmNoYXJhY3RlciA9PSAnXHUwMDFiJykgeyAvLyBFc2NhcGUgY2hhcmFjdGVyCi0gICAgICAgICAgICBmaXJlQ2FuY2VsRWRpdG9yKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5RXZlbnQuY2hhcmFjdGVyID09ICdcdCcpIHsgLy8gdGFiIGtleQotICAgICAgICAgICAgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLSAgICAgICAgfSAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZFZhbHVlKCkgewotICAgIAlyZXR1cm4gc2VsZWN0ZWRWYWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uTWFkZSgpIHsKLSAgICAJT2JqZWN0IG5ld1ZhbHVlID0gbnVsbDsKLSAgICAJY29udGludWVBcHBseSA9IHRydWU7Ci0gICAgCXNlbGVjdGlvbiA9IGNvbWJvQm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgCVN0cmluZyBzdHJpbmdTZWxlY3Rpb24gPSBpdGVtc1tzZWxlY3Rpb25dOwotICAgIAkKLSAgICAJaWYgKHN0cmluZ1NlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0JVVFRPTl9CUk9XU0UpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAJCW5ld1ZhbHVlID0gaW52b2tlRGlhbG9nKGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpKTsKLSAgICAJfQotICAgIAllbHNlIGlmIChzdHJpbmdTZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9CVVRUT05fTkVXKSkgeyAvLyROT04tTkxTLTEkCi0gICAgCQluZXdWYWx1ZSA9IGludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXROZXdEaWFsb2coKSk7Ci0gICAgCX0KLQotICAgIAlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotICAgIAkJaW50IGluZGV4ID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsgICAgICAgICAgICAgIAotICAgIAkJaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgCQkJc2VsZWN0ZWRWYWx1ZSA9IGNvbWJvQm94LmdldEl0ZW0oaW5kZXgpOwotICAgIAkJfQotICAgIAl9Ci0gICAgCWVsc2UgewotICAgIAkJc2VsZWN0ZWRWYWx1ZSA9IG5ld1ZhbHVlOwotICAgIAl9Ci0gICAJCWFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9kaXJlY3RlZGl0L0NvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2RpcmVjdGVkaXQvQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDlhYzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2RpcmVjdGVkaXQvQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLQotICBwdWJsaWMgQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0JICBzdXBlcihzb3VyY2UsIENvbWJvQm94Q2VsbEVkaXRvci5jbGFzcywgbmV3IEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IobGFiZWwpKTsKLSAgICB0aGlzLmxhYmVsID0gbGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGxhYmVsLmdldFRleHQoKTsgICAKLQotICAgIEFTRENDb21ibyBjb21ibyA9IChBU0RDQ29tYm8pZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLSAgIAljb21iby5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7Ci0gICAgY29tYm8uc2V0Rm9yZWdyb3VuZChsYWJlbC5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY29tYm8uc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgyMCk7Ci0gICAgY29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gIElDZWxsRWRpdG9yTGlzdGVuZXIgY2VsbEVkaXRvckxpc3RlbmVyID0gbmV3IElDZWxsRWRpdG9yTGlzdGVuZXIoKQotICB7Ci0gICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkKLSAgICB7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGFwcGx5RWRpdG9yVmFsdWUoKQotICAgIHsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkLCBib29sZWFuIG5ld1N0YXRlKQotICAgIHsKLSAgICB9Ci0gIH07Ci0gIGdldENlbGxFZGl0b3IoKS5hZGRMaXN0ZW5lcihjZWxsRWRpdG9yTGlzdGVuZXIpOwotCi0gICAgU3RyaW5nW10gaXRlbSA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpdGVtW2ldLmVxdWFscyhpbml0aWFsTGFiZWxUZXh0KSkKLSAgICAgIHsKLQkgICAgICBnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUobmV3IEludGVnZXIoaSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IAkKLSAgfQkgCi0gICAgICAgICAKLSAgLy8gaGFjay4uLiBmb3Igc29tZSByZWFzb24gdGhlIENvbWJvQm94Q2VsbEVkaXRvciBkb2VzJ3QgZmlyZSBhbiBlZGl0b3JWYWx1ZUNoYW5nZWQgdG8gc2V0IHRoZSBkaXJ0eSBmbGFnCi0gIC8vIHVubGVzcyB3ZSBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0cnVlLCB0aGUgbWFuYWdlciBpcyBub3Qgbm90aWZpZWQgb2YgY2hhbmdlcyBtYWRlIGluIHRoZSBjZWxsIGVkaXRvcgotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RpcnR5KCkKLSAgewotCSAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgeyAKLSAgICBib29sZWFuIGlzTGFiZWxUZXh0SW5MaXN0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBsaXN0ID0gY29tcHV0ZUNvbWJvQ29udGVudCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgIGlmIChzdHJpbmcuZXF1YWxzKGxhYmVsLmdldFRleHQoKSkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgaXNMYWJlbFRleHRJbkxpc3QgPSB0cnVlOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAKLSAgICAgICAgIAotICAgIGlmICghaXNMYWJlbFRleHRJbkxpc3QpCi0gICAgewotICAgICAgbGlzdC5hZGQobGFiZWwuZ2V0VGV4dCgpKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3Qgc29ydGVkTGlzdCA9IGNvbXB1dGVTb3J0ZWRMaXN0KGxpc3QpOwotICAgIFN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1tzb3J0ZWRMaXN0LnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzdHJpbmdBcnJheVtpXSA9IChTdHJpbmcpc29ydGVkTGlzdC5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBjcmVhdGVDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgc3RyaW5nQXJyYXkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZ1tdIHN0cmluZ0FycmF5KQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21ib0JveENlbGxFZGl0b3IoY29tcG9zaXRlLCBzdHJpbmdBcnJheSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZVNvcnRlZExpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBjb21wdXRlQ29tYm9Db250ZW50KCk7IAotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBlcmZvcm1Nb2RpZnkoT2JqZWN0IHZhbHVlKTsKLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCi0gICAgcHVibGljIEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpCi0gICAgewotICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgIH0gICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIAotICAgIHsKLSAgICAgICAgQVNEQ0NvbWJvIGNvbWJvID0gKEFTRENDb21ibyljZWxsZWRpdG9yLmdldENvbnRyb2woKTsgIAotCSAgICBSZWN0YW5nbGUgbGFiZWxQYXJlbnRCb3VuZHMgPSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JICAgIGxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUobGFiZWxQYXJlbnRCb3VuZHMpOwotCSAgICAKLQkgICAgaW50IHggPSBsYWJlbFBhcmVudEJvdW5kcy54OwotCSAgICBpbnQgeSA9IGxhYmVsUGFyZW50Qm91bmRzLnk7Ci0JICAgIGludCB3aWR0aEsgPSBsYWJlbFBhcmVudEJvdW5kcy53aWR0aDsKLQkgICAgaW50IGhlaWdodCA9IGxhYmVsUGFyZW50Qm91bmRzLmhlaWdodDsKLQkgICAgY29tYm8uc2V0Qm91bmRzKHgsIHkgKyAxLCB3aWR0aEssIGhlaWdodCAtIDIpOwotICAgIH0KLSAgfSAKLSAgIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdChDZWxsRWRpdG9yIGNlbGxFZGl0b3IpCi0gIHsKLQkgIEFTRENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0NlbGxFZGl0b3IgPSAoQVNEQ29tYm9Cb3hDZWxsRWRpdG9yKSBjZWxsRWRpdG9yOwotCSAgQVNEQ0NvbWJvIGNvbWJvID0gKEFTRENDb21ibylnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCSAgaW50IGluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsgICAgICAgICAgICAgIAotCSAgaWYgKGluZGV4ICE9IC0xKQotCSAgewotCQkgIE9iamVjdCB2YWx1ZSA9IGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCQkgIGlmIChjb21ib0NlbGxFZGl0b3IuZ2V0U2VsZWN0ZWRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCSAgdmFsdWUgPSBjb21ib0NlbGxFZGl0b3IuZ2V0U2VsZWN0ZWRWYWx1ZSgpOwotCQkgIH0KLQkJICAKLQkJICBwZXJmb3JtTW9kaWZ5KHZhbHVlKTsKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkJICBTdHJpbmcgdHlwZWRWYWx1ZSA9IGNvbWJvLmdldFRleHQoKTsJCi0JCSAgaWYgKGNvbWJvLmluZGV4T2YodHlwZWRWYWx1ZSkgIT0gLTEpCi0JCSAgewkgICAgICAKLQkJCSAgcGVyZm9ybU1vZGlmeSh0eXBlZFZhbHVlKTsKLQkJICB9ICAgICAgCQotCQkgIGVsc2UKLQkJICB7Ci0JCQkgIFN0cmluZyBjbG9zZU1hdGNoID0gZ2V0Q2xvc2VNYXRjaCh0eXBlZFZhbHVlLCBjb21iby5nZXRJdGVtcygpKTsKLQkJCSAgaWYgKGNsb3NlTWF0Y2ggIT0gbnVsbCkKLQkJCSAgewotCQkJCSAgcGVyZm9ybU1vZGlmeShjbG9zZU1hdGNoKTsgICAgICAJCi0JCQkgIH0KLQkJCSAgZWxzZQotCQkJICB7ICAgICAgCQotCQkJCSAgRGlzcGxheS5nZXRDdXJyZW50KCkuYmVlcCgpOwotCQkJICB9Ci0JCSAgfQotCSAgfSAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xvc2VNYXRjaChTdHJpbmcgdmFsdWUsIFN0cmluZ1tdIGl0ZW1zKQotICB7Ci0gICAgaW50IG1hdGNoSW5kZXggPSAtMTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgIAlTdHJpbmcgaXRlbSA9IGl0ZW1zW2ldOwotICAgIAlTdHJpbmcgYSA9IGdldExvY2FsTmFtZSh2YWx1ZSk7Ci0gICAgCVN0cmluZyBiID0gZ2V0TG9jYWxOYW1lKGl0ZW0pOwotCQkgIGlmIChhLmVxdWFsc0lnbm9yZUNhc2UoYikpCi0JCSAgeyAKLQkJCSAgbWF0Y2hJbmRleCA9IGk7Ci0JCQkgIGJyZWFrOwkJCQkKLQkJICB9CSAgICAJICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gbWF0Y2hJbmRleCAhPSAtMSA/IGl0ZW1zW21hdGNoSW5kZXhdIDogbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbE5hbWUoU3RyaW5nIHN0cmluZykKLSAgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JICByZXR1cm4gKGluZGV4ICE9IC0xKSA/IHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAxKSA6IHN0cmluZzsgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9kaXJlY3RlZGl0L0RpcmVjdEVkaXRTZWxlY3Rpb25Ub29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9kaXJlY3RlZGl0L0RpcmVjdEVkaXRTZWxlY3Rpb25Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjQ5YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZGlyZWN0ZWRpdC9EaXJlY3RFZGl0U2VsZWN0aW9uVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuU2VsZWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLQotLyoqCi0gKiBFeHRlbmRzIHRoZSBkZWZhdWx0IEdFRiBzZWxlY3Rpb24gdG9vbHMgdG8gc2VuZCB0aGUKLSAqIG1vdXNlIGV2ZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0RWRpdFNlbGVjdGlvblRvb2wgZXh0ZW5kcyBTZWxlY3Rpb25Ub29sIHsKLQkKLQlwcm90ZWN0ZWQgSU5hbWVkRWRpdFBhcnQgZ2V0U2VsZWN0ZWRQYXJ0KCkgewotCQlpZihnZXRDdXJyZW50Vmlld2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFZGl0UGFydCBlcCA9IGdldEN1cnJlbnRWaWV3ZXIoKS5nZXRGb2N1c0VkaXRQYXJ0KCk7Ci0JCWlmKGVwIGluc3RhbmNlb2YgSU5hbWVkRWRpdFBhcnQgJiYgZXAuaXNBY3RpdmUoKSkKLQkJCXJldHVybiAoSU5hbWVkRWRpdFBhcnQpZXA7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVCdXR0b25Eb3duKGludCBidXR0b24pIHsKLQkJc3VwZXIuaGFuZGxlQnV0dG9uRG93bihidXR0b24pOwotCQlJTmFtZWRFZGl0UGFydCBzZWxlY3RlZFBhcnQgPSBnZXRTZWxlY3RlZFBhcnQoKTsKLQkJCi0JCWlmKHNlbGVjdGVkUGFydCAhPSBudWxsICYmIGJ1dHRvbiA9PSAxKSB7Ci0JCQlJbnB1dCBpID0gZ2V0Q3VycmVudElucHV0KCk7Ci0JCQlQb2ludCBsID0gdHJhbnNsYXRlTG9jYXRpb24oaS5nZXRNb3VzZUxvY2F0aW9uKCkpOwotCQkJCi0JCQlJRmlndXJlIGYgPSAoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHNlbGVjdGVkUGFydCkuZ2V0RmlndXJlKCk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZi5nZXRCb3VuZHMoKTsKLQkJCWlmKGJvdW5kcy5jb250YWlucyhsLngsbC55KSkgewotCQkJCXNlbGVjdGVkUGFydC5wZXJmb3JtRGlyZWN0RWRpdCh0cmFuc2xhdGVMb2NhdGlvbihuZXcgUG9pbnQobC54LCBsLnkpKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBQb2ludCB0cmFuc2xhdGVMb2NhdGlvbihQb2ludCBtb3VzZUxvY2F0aW9uKSB7Ci0JCUZpZ3VyZUNhbnZhcyBjYW52YXMgPSAoRmlndXJlQ2FudmFzKWdldEN1cnJlbnRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCVBvaW50IHZpZXdMb2NhdGlvbiA9IGNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotCQlyZXR1cm4gbmV3IFBvaW50KG1vdXNlTG9jYXRpb24ueCArIHZpZXdMb2NhdGlvbi54LG1vdXNlTG9jYXRpb24ueSArIHZpZXdMb2NhdGlvbi55KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5MTY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLklOYW1lZEVkaXRQYXJ0OwotCi1wdWJsaWMgY2xhc3MgTGFiZWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQlwcml2YXRlIElOYW1lZEVkaXRQYXJ0IG5hbWVkRWRpdFBhcnQ7Ci0JcHJpdmF0ZSBQb2ludCBjdXJzb3JMb2NhdGlvbjsKLQotCXB1YmxpYyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKElOYW1lZEVkaXRQYXJ0IG5hbWVkRWRpdFBhcnQsIFBvaW50IGN1cnNvckxvY2F0aW9uKSB7Ci0JCXRoaXMubmFtZWRFZGl0UGFydCA9IG5hbWVkRWRpdFBhcnQ7Ci0JCXRoaXMuY3Vyc29yTG9jYXRpb24gPSBjdXJzb3JMb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KWNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQlpZiAodGV4dC5nZXRCb3VuZHMoKS54IDw9IDAgJiYgbmFtZWRFZGl0UGFydC5nZXRMYWJlbEZpZ3VyZSgpICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmFtZWRFZGl0UGFydC5nZXRMYWJlbEZpZ3VyZSgpOwotCQkJUmVjdGFuZ2xlIGJvdW5kaW5nUmVjdCA9IGxhYmVsLmdldFRleHRCb3VuZHMoKTsKLQotCQkJLy8gUmVkdWNlIHRoZSB3aWR0aCBieSB0aGUgYW1vdW50IHdlIHNoaWZ0ZWQgYWxvbmcgdGhlIHgtYXhpcwotCQkJaW50IGRlbHRhID0gTWF0aC5hYnMoYm91bmRpbmdSZWN0LnggLSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRCb3VuZHMoKS54KTsKLS8vCQkJYm91bmRpbmdSZWN0LndpZHRoID0gdGFibGVDZWxsRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS53aWR0aCAtIGRlbHRhOwotCQkJCi0JCQlsYWJlbC5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kaW5nUmVjdCk7Ci0JCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIHRyaW0gPSB0ZXh0LmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQkJYm91bmRpbmdSZWN0LnRyYW5zbGF0ZSh0cmltLngsIHRyaW0ueSk7Ci0vLwkJCWJvdW5kaW5nUmVjdC53aWR0aCA9IGJvdW5kaW5nUmVjdC53aWR0aCAtIHRyaW0ueDsKLQkJCWJvdW5kaW5nUmVjdC5oZWlnaHQgPSBib3VuZGluZ1JlY3QuaGVpZ2h0IC0gdHJpbS55OwotCQkJCi0JCQlib3VuZGluZ1JlY3Qud2lkdGggPSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAtIGRlbHRhOwotCQkJdGV4dC5zZXRCb3VuZHMoYm91bmRpbmdSZWN0LngsIGJvdW5kaW5nUmVjdC55LCBib3VuZGluZ1JlY3Qud2lkdGgsIGJvdW5kaW5nUmVjdC5oZWlnaHQpOwotCQkJCi0JCQlpZiAoY3Vyc29yTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCS8vIFRyYW5zbGF0ZSBwb2ludAotCQkJCVBvaW50IHRyYW5zbGF0ZWRQb2ludCA9IG5ldyBQb2ludChjdXJzb3JMb2NhdGlvbi54IC0gYm91bmRpbmdSZWN0LngsY3Vyc29yTG9jYXRpb24ueSAtIGJvdW5kaW5nUmVjdC55KTsKLQotCQkJCS8vIENhbGN1bGF0ZSB0ZXh0IG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2xhdGVkIHBvaW50Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oMCwgMCk7Ci0JCQkJaW50IHhDYXJldCA9IHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLng7Ci0JCQkJaW50IG9mZnNldCA9IHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpOwotCQkJCXdoaWxlICh4Q2FyZXQgPCB0cmFuc2xhdGVkUG9pbnQueCkgewotCQkJCQl0ZXh0LnNldFNlbGVjdGlvbihvZmZzZXQgKyAxLCBvZmZzZXQgKyAxKTsJCQkKLQkJCQkJeENhcmV0ID0gdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueDsKLQkJCQkJaW50IG5ld09mZnNldCA9IHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpOwotCQkJCQlpZiAobmV3T2Zmc2V0ID09IG9mZnNldCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJb2Zmc2V0Kys7Ci0JCQkJfQotCQkJCXRleHQuc2V0U2VsZWN0aW9uKG9mZnNldCwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2RpcmVjdGVkaXQvTGFiZWxFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDNhZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLQotcHVibGljIGNsYXNzIExhYmVsRWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlwcml2YXRlIElBY3Rpb25CYXJzIGFjdGlvbkJhcnM7Ci0JcHJpdmF0ZSBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlciBhY3Rpb25IYW5kbGVyOwotCXByaXZhdGUgSUFjdGlvbiBjb3B5LCBjdXQsIHBhc3RlLCB1bmRvLCByZWRvLCBmaW5kLCBzZWxlY3RBbGwsIGRlbGV0ZTsKLQlwcml2YXRlIEZvbnQgc2NhbGVkRm9udDsKLQotCXB1YmxpYyBMYWJlbEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzb3VyY2UsIG51bGwsIGxvY2F0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlpZiAoYWN0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlhY3Rpb25IYW5kbGVyLmRpc3Bvc2UoKTsKLQkJCWFjdGlvbkhhbmRsZXIgPSBudWxsOwotCQl9Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCXJlc3RvcmVTYXZlZEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJCWFjdGlvbkJhcnMgPSBudWxsOwotCQl9Ci0KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dGZWVkYmFjaygpIHsKLQkJZ2V0RWRpdFBhcnQoKS5zaG93U291cmNlRmVlZGJhY2soZ2V0RGlyZWN0RWRpdFJlcXVlc3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvck9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCUxhYmVsIGxhYmVsID0gKChJTmFtZWRFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0TGFiZWxGaWd1cmUoKTsKLQkJCi0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlzY2FsZWRGb250ID0gbGFiZWwuZ2V0Rm9udCgpOwotCQkJCi0JCQkvLyBUT0RPOiBybWFoOiAgaGFjayBoZXJlIHRvIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUKLQkJCS8vIGRpcmVjdCBlZGl0IFRleHQuICBTb2x1dGlvbiBpcyB0byBtYWtlIHRoZSBUZXh0IHRyYW5zcGFyZW50Li4uCi0JCQlDb2xvciBjb2xvciA9IGxhYmVsLmdldEJhY2tncm91bmRDb2xvcigpOwotCQkJaWYgKGNvbG9yLmVxdWFscyhEZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMudGFibGVDZWxsU2VsZWN0aW9uQ29sb3IpKSB7Ci0JCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCX0KLQkJCWVsc2UgewotLy8JCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSk7Ci0JCQkgICAgdGV4dC5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSBsYWJlbC5nZXRUZXh0KCk7Ci0JCQlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzY2FsZWRGb250ID0gbGFiZWwuZ2V0UGFyZW50KCkuZ2V0Rm9udCgpOwotCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldFBhcmVudCgpLmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJfQotCQkKLQkJRm9udERhdGEgZGF0YSA9IHNjYWxlZEZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLQkJRGltZW5zaW9uIGZvbnRTaXplID0gbmV3IERpbWVuc2lvbigwLCBkYXRhLmdldEhlaWdodCgpKTsKLQkJbGFiZWwuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQkJCi0JCXRleHQuc2V0Rm9udChzY2FsZWRGb250KTsKLS8vCQl0ZXh0LnNlbGVjdEFsbCgpOwotCi0JCS8vIEhvb2sgdGhlIGNlbGwgZWRpdG9yJ3MgY29weS9wYXN0ZSBhY3Rpb25zIHRvIHRoZSBhY3Rpb25CYXJzIHNvIHRoYXQgdGhleSBjYW4KLQkJLy8gYmUgaW52b2tlZCB2aWEga2V5Ym9hcmQgc2hvcnRjdXRzLgotCQlhY3Rpb25CYXJzID0gQVNERWRpdG9yUGx1Z2luLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCXNhdmVDdXJyZW50QWN0aW9ucyhhY3Rpb25CYXJzKTsKLQkJYWN0aW9uSGFuZGxlciA9IG5ldyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcihhY3Rpb25CYXJzKTsKLQkJYWN0aW9uSGFuZGxlci5hZGRDZWxsRWRpdG9yKGdldENlbGxFZGl0b3IoKSk7Ci0JCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlU2F2ZWRBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpewotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGNvcHkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBwYXN0ZSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLCBkZWxldGUpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCksIHNlbGVjdEFsbCk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXQpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5GSU5ELmdldElkKCksIGZpbmQpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksIHVuZG8pOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksIHJlZG8pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlQ3VycmVudEFjdGlvbnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQljb3B5ID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpKTsKLQkJcGFzdGUgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpKTsKLQkJZGVsZXRlID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQlzZWxlY3RBbGwgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCkpOwotCQljdXQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSk7Ci0JCWZpbmQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5GSU5ELmdldElkKCkpOwotCQl1bmRvID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpKTsKLQkJcmVkbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZGlyZWN0ZWRpdC9UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2RpcmVjdGVkaXQvVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZmE5OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZGlyZWN0ZWRpdC9UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5kaXJlY3RlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFQYXJhbWV0ZXJGb3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5QYXJhbWV0ZXJUeXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFR5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJUGFyYW1ldGVyIHNldE9iamVjdDsKLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSVBhcmFtZXRlciBwYXJhbWV0ZXIsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHNvdXJjZSwgbGFiZWwpOwotICAgIGVkaXRQYXJ0ID0gc291cmNlOwotICAgIHNldE9iamVjdCA9IHBhcmFtZXRlcjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvck9uKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLQkgIHJldHVybiBzdXBlci5jcmVhdGVDZWxsRWRpdG9yT24oY29tcG9zaXRlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGNvbXB1dGVDb21ib0NvbnRlbnQoKQotICB7Ci0JICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotCSAgICBpZiAoZWRpdE1hbmFnZXIgIT0gbnVsbCkKLQkgICAgewotCSAgICAgICBsaXN0LmFkZChNZXNzYWdlcy5fVUlfQlVUVE9OX0JST1dTRSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgbGlzdC5hZGQoTWVzc2FnZXMuX1VJX0JVVFRPTl9ORVcpOyAvLyROT04tTkxTLTEkCi0JICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBxdWlja1BpY2tzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCSAgICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotCSAgICAgICB7Ci0JICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLQkgICAgICAgICB7Ci0JICAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotCSAgICAgICAgICAgbGlzdC5hZGQoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOwotCSAgICAgICAgIH0gIAotCSAgICAgICB9Ci0JICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBoaXN0b3J5ID0gZWRpdE1hbmFnZXIuZ2V0SGlzdG9yeSgpOwotCSAgICAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotCSAgICAgICB7Ci0JICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykKLQkgICAgICAgICB7Ci0JICAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBoaXN0b3J5W2ldOwotCSAgICAgICAgICAgbGlzdC5hZGQoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOwotCSAgICAgICAgIH0gIAotCSAgICAgICB9Ci0JICAgIH0gCi0JICAgIHJldHVybiBsaXN0OyAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1Nb2RpZnkoT2JqZWN0IHZhbHVlKQotICB7Ci0JICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLQkgICAgaWYgKGVkaXRNYW5hZ2VyID09IG51bGwpCi0JICAgIHsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgICAgCi0JICAgIC8vIG91ciBjcnVkZSBjb21ibyBib3ggY2FuIG9ubHkgd29yayB3aXRoICdTdHJpbmcnIG9iamVjdHMKLQkgICAgLy8gaWYgd2UgZ2V0IGEgU3RyaW5nIGJhY2sgd2UgbmVlZCB0byBkbyBzb21lIGNsZXZlciBtYXBwaW5nIHRvIGdldCB0aGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiAKLQkgICAgLy8gICAgCi0JICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkgICAgewotCSAgICAgIHZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY2lmaWNhdGlvbkZvclZhbHVlKChTdHJpbmcpdmFsdWUpOyAgICAgCi0JICAgIH0gIAotCSAgICAvLyB3ZSBhc3N1bWUgdGhlIHNlbGVjdGVkIHZhbHVlIGlzIGFsd2F5cyBvZiB0aGUgZm9ybSBvZiBhIENvbXBvbmVudFNwZWNpZmljYXRpb24KLQkgICAgLy8gCi0JICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pICAgICAgCi0JICAgIHsKLQkJCWVkaXRNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShnZXRFZGl0UGFydCgpLmdldE1vZGVsKCksIChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSB2YWx1ZSk7Ci0JICAgIH0KLSAgfSAKLQotICBwcm90ZWN0ZWQgTGlzdCBjb21wdXRlU29ydGVkTGlzdChMaXN0IGxpc3QpCi0gIHsKLS8vICAgIHJldHVybiBUeXBlc0hlbHBlci5zb3J0TGlzdChsaXN0KTsKLQkgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwcml2YXRlIGludCBnZXRUZXh0SW5kZW50KCkgewotCSAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYW1ldGVyVHlwZUVkaXRQYXJ0KSB7Ci0JCSAgUmVjdGFuZ2xlIGJvdW5kcyA9ICgoUGFyYW1ldGVyVHlwZUVkaXRQYXJ0KSBlZGl0UGFydCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCSAgaW50IHRleHRYID0gKChQYXJhbWV0ZXJUeXBlRWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRMYWJlbEZpZ3VyZSgpLmdldFRleHRCb3VuZHMoKS54OyAKLQkJICByZXR1cm4gdGV4dFggLSBib3VuZHMueDsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIDU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDZWxsRWRpdG9yIGNyZWF0ZUNlbGxFZGl0b3IoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgU3RyaW5nW10gc3RyaW5nQXJyYXkpCi0gIHsKLSAgICBBU0RDb21ib0JveENlbGxFZGl0b3IgY2VsbEVkaXRvciA9IG5ldyBBU0RDb21ib0JveENlbGxFZGl0b3IoY29tcG9zaXRlLCBzdHJpbmdBcnJheSwgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKSk7Ci0gICAgY2VsbEVkaXRvci5zZXRUZXh0SW5kZW50KGdldFRleHRJbmRlbnQoKSk7Ci0gICAgLy8oKEFEVENvbWJvQm94Q2VsbEVkaXRvcikgY2VsbEVkaXRvcikuc2V0T2JqZWN0VG9Nb2RpZnkoc2V0T2JqZWN0KTsKLSAgICAKLSAgICByZXR1cm4gY2VsbEVkaXRvcjsKLSAgfQotCi0JcHVibGljIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkgewotCQlDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNUeXBlID0gdHJ1ZTsKLQkJCi0JCS8vIFRPRE86IFdlJ3JlIHNwZWNpZmljYWxseSBsb29raW5nIGZvciBhbmQgdXNpbmcgV1NETDExIEltcGwgY2xhc3Nlcy4uLi4gV2Ugc2hvdWxkCi0JCS8vIGludmVzdGlnYXRlIGZ1cnRoZXIgdG8gc2VlIGlmIHdlIGNhbiBhdm9pZCBrbm93aW5nIGFib3V0IFdTREwxMSBJbXBsIGNsYXNzZXMuCi0JCWlmIChzZXRPYmplY3QgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JQYXJ0KSB7Ci0JCQlpc1R5cGUgPSAoKFcxMVBhcmFtZXRlckZvclBhcnQpIHNldE9iamVjdCkuaXNUeXBlKCk7Ci0JCX0KLQkJCi0JCWlmIChpc1R5cGUpIHsgCi0JCQllZGl0TWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcikgUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXIuZ2V0WFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKHNldE9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllZGl0TWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcikgUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXIuZ2V0WFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKHNldE9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gZWRpdE1hbmFnZXI7IAotCX0KLQkKLQkvLyBUT0RPOiBybWFoOiBUaGlzIGNvZGUgc2hvdWxkIGxpdmUgaW4gYSBjb21tb24gcGxhY2UuLi4uLiBUaGlzIGNvZGUgaXMgYWxzbyB1c2VkIGluIG90aGVyIFVJIHNjZW5hcmlvcyB3aGVuCi0JLy8gYSBzaW1pbGFyIGNvbWJvIGJveCBpcyB1c2VkLiAgRm9yIGV4YW1wbGUgaW4gdGhlIHByb3BlcnRpZXMuLi4oUGFyYW1ldGVyU2VjdGlvbikgIEFsc28gdXNlZCBpbiB0aGUgWFNERWRpdG9yLi4uCi0JcHJvdGVjdGVkIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0Q29tcG9uZW50U3BlY2lmaWNhdGlvbkZvclZhbHVlKFN0cmluZyB2YWx1ZSkKLQl7Ci0JCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLQkJaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0JCXsgIAotCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0JCQlpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotCQkJewotCQkJCWZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0JCQkJewotCQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotCQkJCQlpZiAodmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLQkJCQkJewotCQkJCQkJcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0JCQkJCX0gICAgICAgICAgICAgICAgCi0JCQkJfSAgCi0JCQl9Ci0JCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaGlzdG9yeSA9IGVkaXRNYW5hZ2VyLmdldEhpc3RvcnkoKTsKLQkJCWlmIChoaXN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykKLQkJCQl7Ci0JCQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0JCQkJCWlmICh2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotCQkJCQl7ICAKLQkJCQkJCXJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotCQkJCQl9Ci0JCQkJfSAgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0FTREVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0FTREVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E0MTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9BU0RFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFic3RyYWN0TW9kZWxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkJpbmRpbmdDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQmluZGluZ0NvbnRlbnRQbGFjZUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRW5kUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgQVNERWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBjaGlsZCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURlc2NyaXB0aW9uKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IERlZmluaXRpb25zRWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbikKLSAgICB7Ci0gICAgICBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKW1vZGVsOwotICAgICAgaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBCaW5kaW5nQ29sdW1uKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBCaW5kaW5nQ29sdW1uRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgIAotICAgICAgICBjaGlsZCA9IG5ldyBDb2x1bW5FZGl0UGFydCgpOwotICAgICAgfSAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUVuZFBvaW50KQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IEVuZFBvaW50RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJU2VydmljZSkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBTZXJ2aWNlRWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQmluZGluZykKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBCaW5kaW5nRWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQmluZGluZ09wZXJhdGlvbiB8fAotICAgICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgSUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlIHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBCaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IEJpbmRpbmdDb250ZW50RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJSW50ZXJmYWNlKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IEludGVyZmFjZUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSU1lc3NhZ2VSZWZlcmVuY2UpCi0gICAgewotICAgICAgY2hpbGQgPSBuZXcgTWVzc2FnZVJlZmVyZW5jZUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSU9wZXJhdGlvbikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBPcGVyYXRpb25FZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElQYXJhbWV0ZXIgJiYgY29udGV4dCBpbnN0YW5jZW9mIFBhcmFtZXRlckVkaXRQYXJ0KSB7Ci0gICAgCWNoaWxkID0gbmV3IFBhcmFtZXRlclR5cGVFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElQYXJhbWV0ZXIgJiYgY29udGV4dCBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2VFZGl0UGFydCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBQYXJhbWV0ZXJFZGl0UGFydCgpOwotICAgIH0KLSAgICBpZiAoY2hpbGQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ291bGQgbm90IGNyZWF0ZSBlZGl0cGFydCBmb3IgbW9kZWw6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICB9Ci0gICAgQXNzZXJ0LmlzTm90TnVsbChjaGlsZCk7Ci0gICAgY2hpbGQuc2V0TW9kZWwobW9kZWwpOwotICAgIHJldHVybiBjaGlsZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0FTRFJvb3RFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0FTRFJvb3RFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjk0M2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9BU0RSb290RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5CZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBBU0RSb290RWRpdFBhcnQgZXh0ZW5kcyBTY2FsYWJsZVJvb3RFZGl0UGFydCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmdlZi5Sb290RWRpdFBhcnQKLXsgIAotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgIC8vIFNldCB1cCBDb25uZWN0aW9uIGxheWVyIHdpdGggYSByb3V0ZXIsIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIG9uZQotICAgIENvbm5lY3Rpb25MYXllciBjb25uZWN0aW9uTGF5ZXIgPSAoQ29ubmVjdGlvbkxheWVyKSBnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKTsKLSAgICBpZiAoY29ubmVjdGlvbkxheWVyICE9IG51bGwpCi0gICAgeyAgCi0vLyAgICAgIGNvbm5lY3Rpb25MYXllci5zZXRDb25uZWN0aW9uUm91dGVyKG5ldyBNYW5oYXR0YW5Db25uZWN0aW9uUm91dGVyKCkpOwotICAgICAgY29ubmVjdGlvbkxheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIobmV3IEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIoKSk7Ci0gICAgfQotICAgIHJlZnJlc2goKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0Fic3RyYWN0Qm94dEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvQWJzdHJhY3RCb3h0RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0ZjM4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvQWJzdHJhY3RCb3h0RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLldTRExCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwb2xpY2llcy5BU0RMYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXMuQVNEU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmZpZ3VyZXMuQm94Q29tcG9uZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24ubGF5b3V0cy5Db2x1bW5EYXRhOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCb3h0RWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cyBJTmFtZWRFZGl0UGFydAotewotICBwcm90ZWN0ZWQgQ29sdW1uRGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbkRhdGEoKTsKLSAgcHJvdGVjdGVkIEJveENvbXBvbmVudEZpZ3VyZSBmaWd1cmU7Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgZmlndXJlID0gbmV3IEJveENvbXBvbmVudEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoMSkpOwotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIC8vIHRvb2xiYXJMYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoVG9vbGJhckxheW91dC5BTElHTl9CT1RUT01SSUdIVCk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0gICAgLy8gaWYoaXNTY3JvbGxhYmxlKCkpCi0gICAgLy8gZmlndXJlLnNldFNjcm9sbGluZ0FjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gZmlndXJlLmdldENvbnRlbnRQYW5lKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgbmV3IEFTRExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBU0RTZWxlY3Rpb25FZGl0UG9saWN5KCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgY3Vyc29yTG9jYXRpb24pewotCSAgaWYgKGN1cnNvckxvY2F0aW9uID09IG51bGwgfHwgIGhpdFRlc3RGaWd1cmUoZmlndXJlLmdldEhlYWRpbmdGaWd1cmUoKSwgY3Vyc29yTG9jYXRpb24pICYmICFpc1JlYWRPbmx5KCkpIHsKLQkJICBtYW5hZ2VyID0gbmV3IExhYmVsRWRpdE1hbmFnZXIodGhpcywgbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IodGhpcywgY3Vyc29yTG9jYXRpb24pKTsKLQkJICBtYW5hZ2VyLnNob3coKTsKLQkgIH0KLSAgICBlbHNlIGlmICgoaGl0VGVzdChmaWd1cmUuZ2V0TGFiZWwoKSwgY3Vyc29yTG9jYXRpb24pIHx8Ci0gICAgICAgIGhpdFRlc3RGaWd1cmUoZmlndXJlLmdldEhlYWRpbmdGaWd1cmUoKSwgY3Vyc29yTG9jYXRpb24pKSAmJiBpc1JlYWRPbmx5KCkpIHsKLSAgICAgIGRvT3Blbk5ld0VkaXRvcigpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXEpIHsKLQkgIGlmIChyZXEuZ2V0VHlwZSgpLmVxdWFscyhSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCkpIHsKLQkJICBQb2ludCBsb2NhdGlvbiA9IG51bGw7Ci0JCSAgaWYgKHJlcSBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KSB7Ci0JCQkgIGxvY2F0aW9uID0gKChEaXJlY3RFZGl0UmVxdWVzdCkgcmVxKS5nZXRMb2NhdGlvbigpOwkJCSAgCi0JCSAgfQotCQkgIHBlcmZvcm1EaXJlY3RFZGl0KGxvY2F0aW9uKTsKLQkgIH0KLSAgfQotICAKLSAgcHVibGljIExhYmVsIGdldExhYmVsRmlndXJlKCkgewotCSAgcmV0dXJuIGZpZ3VyZS5nZXRMYWJlbCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIC8vIGdldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIFdTRExCYXNlQWRhcHRlciBib3ggPSAoV1NETEJhc2VBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIGZpZ3VyZS5oZWFkaW5nRmlndXJlLnNldElzUmVhZE9ubHkoYm94LmlzUmVhZE9ubHkoKSk7Ci0gICAgZmlndXJlLmdldExhYmVsKCkuc2V0VGV4dChib3guZ2V0TmFtZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotCSAgTGluZUJvcmRlciBib3hGaWd1cmVMaW5lQm9yZGVyID0gKExpbmVCb3JkZXIpIGZpZ3VyZS5nZXRCb3JkZXIoKTsKLQkgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMik7Ci0vLwkgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0Q29sb3IoQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOwotCSAgZmlndXJlLnNldFNlbGVjdGVkKHRydWUpOwotCSAgZmlndXJlLnJlcGFpbnQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotCSAgTGluZUJvcmRlciBib3hGaWd1cmVMaW5lQm9yZGVyID0gKExpbmVCb3JkZXIpIGZpZ3VyZS5nZXRCb3JkZXIoKTsKLQkgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMSk7Ci0JICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkgIGZpZ3VyZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JICBmaWd1cmUucmVwYWludCgpOwotICB9Ci0KLSAgcHVibGljIENvbHVtbkRhdGEgZ2V0Q29sdW1uRGF0YSgpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uRGF0YTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFmNGJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9CYXNlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUFTRE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJQVNET2JqZWN0TGlzdGVuZXIsIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9BQ1RJT05fQVJSQVkgPSB7fTsKLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElBY3Rpb25Qcm92aWRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gKChJQWN0aW9uUHJvdmlkZXIpbW9kZWwpLmdldEFjdGlvbnMob2JqZWN0KTsKLSAgICB9ICAKLSAgICByZXR1cm4gRU1QVFlfQUNUSU9OX0FSUkFZOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25zVG9MaXN0KExpc3QgbGlzdCwgU3RyaW5nW10gYWN0aW9ucykKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZChhY3Rpb25zW2ldKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOyAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQVNET2JqZWN0KQotICAgIHsKLSAgICAgIElBU0RPYmplY3Qgb2JqZWN0ID0gKElBU0RPYmplY3QpbW9kZWw7Ci0gICAgICBvYmplY3QucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICB9ICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQVNET2JqZWN0KQotICAgIHsKLSAgICAgIElBU0RPYmplY3Qgb2JqZWN0ID0gKElBU0RPYmplY3QpbW9kZWw7Ci0gICAgICBvYmplY3QudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgIH0gICAKLSAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJwcm9wZXJ0eUNoYW5nZWQgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCSAgSXRlcmF0b3Iga2lkcyA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkgIHdoaWxlIChraWRzLmhhc05leHQoKSkgewotCQkgIE9iamVjdCBpdGVtID0ga2lkcy5uZXh0KCk7Ci0JCSAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBCYXNlRWRpdFBhcnQpIHsKLQkJCSAgKChCYXNlRWRpdFBhcnQpIGl0ZW0pLnJlZnJlc2hDb25uZWN0aW9ucygpOwotCQkgIH0KLQkgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKSB7Ci0JICAKLSAgfQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpIHsKLQkgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBoaXRUZXN0KFJlY3RhbmdsZSByZWN0YW5nbGUsIFBvaW50IGxvY2F0aW9uKSB7Ci0JICByZXR1cm4gcmVjdGFuZ2xlLmNvbnRhaW5zKGxvY2F0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGl0VGVzdChMYWJlbCB0YXJnZXQsIFBvaW50IGxvY2F0aW9uKSB7Ci0JICBSZWN0YW5nbGUgb3JpZ0IgPSB0YXJnZXQuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkgIFJlY3RhbmdsZSB0cmFuc0IgPSB0YXJnZXQuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQotCSAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUodHJhbnNCKTsKLQotCSAgaW50IG5ld1ggPSBvcmlnQi54ICsgTWF0aC5hYnModHJhbnNCLnggLSBvcmlnQi54KTsKLQkgIGludCBuZXdZID0gb3JpZ0IueSArIE1hdGguYWJzKHRyYW5zQi55IC0gb3JpZ0IueSk7CSAgCi0JICBSZWN0YW5nbGUgZmluYWxCID0gbmV3IFJlY3RhbmdsZShuZXdYLCBuZXdZLCBvcmlnQi53aWR0aCwgb3JpZ0IuaGVpZ2h0KTsKLQotCSAgcmV0dXJuIGZpbmFsQi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGhpdFRlc3RGaWd1cmUoRmlndXJlIHRhcmdldCwgUG9pbnQgbG9jYXRpb24pIHsKLSAgICBSZWN0YW5nbGUgb3JpZ0IgPSB0YXJnZXQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIFJlY3RhbmdsZSB0cmFuc0IgPSB0YXJnZXQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCi0gICAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUodHJhbnNCKTsKLQotICAgIGludCBuZXdYID0gb3JpZ0IueCArIE1hdGguYWJzKHRyYW5zQi54IC0gb3JpZ0IueCk7Ci0gICAgaW50IG5ld1kgPSBvcmlnQi55ICsgTWF0aC5hYnModHJhbnNCLnkgLSBvcmlnQi55KTsgICAgCi0gICAgUmVjdGFuZ2xlIGZpbmFsQiA9IG5ldyBSZWN0YW5nbGUobmV3WCwgbmV3WSwgb3JpZ0Iud2lkdGgsIG9yaWdCLmhlaWdodCk7Ci0KLSAgICByZXR1cm4gZmluYWxCLmNvbnRhaW5zKGxvY2F0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCSAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUFTRE9iamVjdCkgewotCQkgIHJldHVybiAoKElBU0RPYmplY3QpIG1vZGVsKS5pc1JlYWRPbmx5KCk7Ci0JICB9Ci0JICAKLQkgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9PcGVuTmV3RWRpdG9yKCkKLSAgewotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IChBY3Rpb25SZWdpc3RyeSkgZWRpdG9yUGFydC5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgYWN0aW9uLnJ1bigpOwotICAgIH0KLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7ICAgICAgCi0gICAgS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSBuYXZpZ2F0aW9uRWRpdFBvbGljeSA9IG5ldyBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5KCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIHB1YmxpYyBFZGl0UGFydCBnZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIEJhc2VFZGl0UGFydC50aGlzLmdldFJlbGF0aXZlRWRpdFBhcnQoZGlyZWN0aW9uKTsgICAgICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9OwotICAgIGluc3RhbGxFZGl0UG9saWN5KEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuS0VZLCBuYXZpZ2F0aW9uRWRpdFBvbGljeSk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZ2V0UmVsYXRpdmVFZGl0UGFydChpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldFJlbGF0aXZlRWRpdFBhcnQodGhpcywgZGlyZWN0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0JpbmRpbmdDb2x1bW5FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0JpbmRpbmdDb2x1bW5FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmRkNzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9CaW5kaW5nQ29sdW1uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXlvdXRBbmltYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5sYXlvdXRzLkJpbmRpbmdDb2x1bW5MYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nQ29sdW1uRWRpdFBhcnQgZXh0ZW5kcyBDb2x1bW5FZGl0UGFydAotewotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICAvL2ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgLy9maWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0gICAgLy8gY3VzdG9tIGxheW91dCB0aGF0IGNhbiBkbyBhbmltYXRpb24KLSAgICAvLwotICAgIEJpbmRpbmdDb2x1bW5MYXlvdXQgbGF5b3V0ID0gbmV3IEJpbmRpbmdDb2x1bW5MYXlvdXQodGhpcyk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAKLSAKLSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcigpCi0gIHsKLSAgICBzdXBlci5yZWdpc3RlcigpOwotICAgIGdldEZpZ3VyZSgpLmFkZExheW91dExpc3RlbmVyKExheW91dEFuaW1hdG9yLmdldERlZmF1bHQoKSk7ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyKCkKLSAgewotICAgIGdldEZpZ3VyZSgpLnJlbW92ZUxheW91dExpc3RlbmVyKExheW91dEFuaW1hdG9yLmdldERlZmF1bHQoKSk7ICAgCi0gICAgc3VwZXIudW5yZWdpc3RlcigpOwotICB9Ci0gIAotICAvLyB0aGlzIG1ldGhvZCB3aWxsIGV4cGFuZCB0aGUgYmluZGluZyBlZGl0IHBhcnQKLSAgLy8gYW5kIGNvbGxhcHNlIGFueSBvdGhlciBiaW5kaW5ncyBhcyBhcHByb3ByaWF0ZQotICAvL3B1YmxpYyB2b2lkIGV4cGFuZChCaWRpbmdFZGl0UGFydCBiaW5kaW5nRWRpdFBhcnQpCi0gIC8veyAgICAKLSAgLy99Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoQmluZGluZ0VkaXRQYXJ0cygpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICBlZGl0UGFydC5yZWZyZXNoKCk7ICAgICAgIAotICAgIH0KLSAgICBnZXRGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOyAgICAgICAgICAgCi0gICAgZ2V0RmlndXJlKCkucmV2YWxpZGF0ZSgpOyAgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9CaW5kaW5nQ29udGVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvQmluZGluZ0NvbnRlbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjNjMjI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9CaW5kaW5nQ29udGVudEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkJpbmRpbmdDb250ZW50UGxhY2VIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXMuQVNEU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nT3BlcmF0aW9uOwotCi0vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgQmluZGluZ09wZXJhdGlvbiwgQmluZGluZ0lucHV0LCBCaW5kaW5nT3V0cHV0IGFuZCBCaW5kaW5nRmF1bHQKLS8vCi1wdWJsaWMgY2xhc3MgQmluZGluZ0NvbnRlbnRFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAoteyAgCi0gIExhYmVsIGxhYmVsOwotICBwcm90ZWN0ZWQgQVNEU2VsZWN0aW9uRWRpdFBvbGljeSBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSA9IG5ldyBBU0RTZWxlY3Rpb25FZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBGaWd1cmUgZmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy50b29sdGlwQmFja2dyb3VuZCk7Ci0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQodHJ1ZSk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoNSwgNSwgMiwgMikpOwotICAgIGZpZ3VyZS5hZGQobGFiZWwpOwotICAgIAotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9ICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotCSAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBJQmluZGluZ09wZXJhdGlvbikKLQkgIHsgIAotCQkgIElCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoSUJpbmRpbmdPcGVyYXRpb24pIGdldE1vZGVsKCk7Ci0JCSAgbGFiZWwuc2V0SWNvbihiaW5kaW5nT3BlcmF0aW9uLmdldEltYWdlKCkpOwotLy8JCSAgbGFiZWwuc2V0VGV4dChiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0JICB9Ci0JICBlbHNlIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgSUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlKQotCSAgewotCQkgIElCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmID0gKElCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSkgZ2V0TW9kZWwoKTsKLQkJICBsYWJlbC5zZXRJY29uKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYmluZF9hc2N0X3ZhbF9vYmouZ2lmIikpOwotLy8JCSAgbGFiZWwuc2V0SWNvbihtZXNzYWdlUmVmLmdldEltYWdlKCkpOwotLy8JCSAgbGFiZWwuc2V0VGV4dChtZXNzYWdlUmVmLmdldE5hbWUoKSk7Ci0JICB9Ci0JICBlbHNlIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgQmluZGluZ0NvbnRlbnRQbGFjZUhvbGRlcikgewotCQkgIGxhYmVsLnNldEljb24oV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9iaW5kX2FzY3RfdmFsX25vdF9vYmouZ2lmIikpOwotCSAgfQotCi0JICBzdXBlci5yZWZyZXNoVmlzdWFscygpOyAgICAKLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0gICAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKSB7Ci0JICBsYWJlbC5nZXRQYXJlbnQoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnRhYmxlQ2VsbFNlbGVjdGlvbkNvbG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkgewotCSAgbGFiZWwuZ2V0UGFyZW50KCkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnRvb2x0aXBCYWNrZ3JvdW5kKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0JpbmRpbmdFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0JpbmRpbmdFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM3NWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9CaW5kaW5nRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5jb25uZWN0aW9ucy5DZW50ZXJlZENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXMuQVNEU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmZpZ3VyZXMuQm94Q29tcG9uZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlcy5Db21wb25lbnRSZWZlcmVuY2VDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24ubGF5b3V0cy5CaW5kaW5nQ29sdW1uTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24ubGF5b3V0cy5CaW5kaW5nQ29udGVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmxheW91dHMuQmluZGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ0VkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIHByb3RlY3RlZCBCb3hDb21wb25lbnRGaWd1cmUgZmlndXJlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cGFuZGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgTGFiZWwgaG92ZXJIZWxwTGFiZWwgPSBuZXcgTGFiZWwoIiIpOwotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBmaWd1cmUgPSBuZXcgQm94Q29tcG9uZW50RmlndXJlKCk7Ci0gICAgZmlndXJlLmdldExhYmVsKCkuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMiwgMiwgMSwgMikpOwotICAgIGZpZ3VyZS5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoMCkpOwotICAgIGZpZ3VyZS5nZXRDb250ZW50UGFuZSgpLnNldExheW91dE1hbmFnZXIobmV3IEJpbmRpbmdDb250ZW50TGF5b3V0KHRoaXMpKTsKLSAgICBmaWd1cmUuZ2V0Q29udGVudFBhbmUoKS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgZmlndXJlLmdldENvbnRlbnRQYW5lKCkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IEJpbmRpbmdMYXlvdXQodGhpcykpOwotICAgIC8vIGlmKGlzU2Nyb2xsYWJsZSgpKQotICAgIC8vIGZpZ3VyZS5zZXRTY3JvbGxpbmdBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGZpZ3VyZS5nZXRDb250ZW50UGFuZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBJQmluZGluZyBiaW5kaW5nID0gKElCaW5kaW5nKSBnZXRNb2RlbCgpOyAgCi0gICAgcmV0dXJuIGlzRXhwYW5kZWQgPyBiaW5kaW5nLmdldEJpbmRpbmdDb250ZW50TGlzdCgpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgICBkZWFjdGl2YXRlQ29ubmVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgc3VwZXIuYWRkRmVlZGJhY2soKTsKLSAgICBMaW5lQm9yZGVyIGJveEZpZ3VyZUxpbmVCb3JkZXIgPSAoTGluZUJvcmRlcikgZmlndXJlLmdldEJvcmRlcigpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMik7Ci0vLyAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldENvbG9yKENvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsKLSAgICBmaWd1cmUuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgZmlndXJlLnJlcGFpbnQoKTsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KHRydWUpOwotICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuRkVFREJBQ0tfTEFZRVIpLmFkZChjb25uZWN0aW9uRmlndXJlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBzdXBlci5yZW1vdmVGZWVkYmFjaygpOwotICAgIExpbmVCb3JkZXIgYm94RmlndXJlTGluZUJvcmRlciA9IChMaW5lQm9yZGVyKSBmaWd1cmUuZ2V0Qm9yZGVyKCk7Ci0gICAgYm94RmlndXJlTGluZUJvcmRlci5zZXRXaWR0aCgxKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBmaWd1cmUuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgIGZpZ3VyZS5yZXBhaW50KCk7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgICBnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5hZGQoY29ubmVjdGlvbkZpZ3VyZSk7Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgLy8gSWYgYXBwcm9wcmlhdGUsIGNyZWF0ZSBvdXIgY29ubmVjdGlvbkZpZ3VyZSBhbmQgYWRkIGl0IHRvIHRoZSBhcHByb3ByaWF0ZQotICAgIC8vIGxheWVyCi0gICAgaWYgKGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEFkZCBvdXIgZWRpdHBvbGljeSBhcyBhIGxpc3RlbmVyIG9uIHRoZSBjb25uZWN0aW9uLCBzbyBpdCBjYW4gc3RheSBpbgotICAgICAgLy8gc3luY2gKLSAgICAgIC8vIGNvbm5lY3Rpb25GaWd1cmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigoQXR0cmlidXRlU2VsZWN0aW9uRmVlZGJhY2tQb2xpY3kpCi0gICAgICAvLyBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpKTsKLSAgICAgIC8vIGNvbm5lY3Rpb25GaWd1cmUuYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLmFkZChjb25uZWN0aW9uRmlndXJlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlQ29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotICAgICAgcmVtb3ZlZCA9IHJlbW92ZUNvbm5lY3Rpb25GaWd1cmUoZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikpOwotICAgICAgaWYgKCFyZW1vdmVkKQotICAgICAgewotICAgICAgICByZW1vdmVDb25uZWN0aW9uRmlndXJlKGdldExheWVyKExheWVyQ29uc3RhbnRzLkZFRURCQUNLX0xBWUVSKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVDb25uZWN0aW9uRmlndXJlKElGaWd1cmUgcGFyZW50KQotICB7Ci0gICAgYm9vbGVhbiBjb250YWlucyA9IGZhbHNlOwotICAgIEl0ZXJhdG9yIGl0ID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIElGaWd1cmUgZmlnID0gKElGaWd1cmUpIGl0Lm5leHQoKTsKLSAgICAgIGlmIChmaWcuZXF1YWxzKGNvbm5lY3Rpb25GaWd1cmUpKQotICAgICAgewotICAgICAgICBjb250YWlucyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoY29udGFpbnMpCi0gICAgewotICAgICAgcGFyZW50LnJlbW92ZShjb25uZWN0aW9uRmlndXJlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnRhaW5zOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSA9PSBudWxsICYmIHNob3VsZERyYXdDb25uZWN0aW9uKCkpCi0gICAgewotICAgICAgSUJpbmRpbmcgYmluZGluZyA9IChJQmluZGluZykgZ2V0TW9kZWwoKTsKLSAgICAgIE9iamVjdCB0eXBlQmVpbmdSZWYgPSBiaW5kaW5nLmdldEludGVyZmFjZSgpOwotICAgICAgaWYgKHR5cGVCZWluZ1JlZiAhPSBudWxsKQotICAgICAgewotICAgICAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlZmVyZW5jZVR5cGVQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGdldFZpZXdlcigpLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQodHlwZUJlaW5nUmVmKTsKLSAgICAgICAgaWYgKHJlZmVyZW5jZVR5cGVQYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICByZWZyZXNoQ29ubmVjdGlvbnMoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChpc0V4cGFuZGVkKQotICAgIHsgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gIAotICAgIElCaW5kaW5nIGJpbmRpbmcgPSAoSUJpbmRpbmcpIGdldE1vZGVsKCk7Ci0gICAgT2JqZWN0IHR5cGVCZWluZ1JlZiA9IGJpbmRpbmcuZ2V0SW50ZXJmYWNlKCk7Ci0gICAgaWYgKHR5cGVCZWluZ1JlZiAhPSBudWxsKQotICAgIHsKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh0eXBlQmVpbmdSZWYpOwotICAgICAgaWYgKHJlZmVyZW5jZVR5cGVQYXJ0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICByZWZyZXNoQ29ubmVjdGlvbnMoKTsKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIElCaW5kaW5nKQotICAgIHsgIAotICAgICAgSUJpbmRpbmcgYmluZGluZyA9IChJQmluZGluZykgZ2V0TW9kZWwoKTsKLSAgICAgICgoQm94Q29tcG9uZW50RmlndXJlKSBnZXRGaWd1cmUoKSkuaGVhZGluZ0ZpZ3VyZS5zZXRJc1JlYWRPbmx5KCgoSUJpbmRpbmcpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSk7Ci0gICAgICBmaWd1cmUuZ2V0TGFiZWwoKS5zZXRJY29uKGJpbmRpbmcuZ2V0SW1hZ2UoKSk7Ci0gICAgICAKLSAgICAgIC8vIFNob3cgdGhlIG5hbWUgb2YgdGhlIElCaW5kaW5nIHdpdGggaG92ZXIgaGVscAotICAgICAgU3RyaW5nIHByZXBlbmRTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQklORElORzsKLSAgICAgIGhvdmVySGVscExhYmVsLnNldFRleHQoIiAiICsgcHJlcGVuZFN0cmluZyArICIgOiAiICsgYmluZGluZy5nZXROYW1lKCkgKyAiICIpOwotICAgICAgZmlndXJlLnNldFRvb2xUaXAoaG92ZXJIZWxwTGFiZWwpOwotICAgIH0KLQotICAgIC8vZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLnB1dChMYXkuY2xhc3MsIGNvbnRyb2xsZXIpOwotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRDb25uZWN0aW9uVGFyZ2V0RWRpdFBhcnQoKQotICB7Ci0gICAgSUJpbmRpbmcgYmluZGluZyA9IChJQmluZGluZykgZ2V0TW9kZWwoKTsKLSAgICBPYmplY3QgdHlwZUJlaW5nUmVmID0gYmluZGluZy5nZXRJbnRlcmZhY2UoKTsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh0eXBlQmVpbmdSZWYpOwotICAgICAgcmV0dXJuIHJlZmVyZW5jZVR5cGVQYXJ0OwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKCkKLSAgewotICAgIGlmIChzaG91bGREcmF3Q29ubmVjdGlvbigpKQotICAgIHsKLSAgICAgIElCaW5kaW5nIGJpbmRpbmcgPSAoSUJpbmRpbmcpIGdldE1vZGVsKCk7Ci0gICAgICBPYmplY3QgdHlwZUJlaW5nUmVmID0gYmluZGluZy5nZXRJbnRlcmZhY2UoKTsKLSAgICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh0eXBlQmVpbmdSZWYpOwotICAgICAgICBJRmlndXJlIHJlZkZpZ3VyZT0gcmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgMCkpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKHJlZkZpZ3VyZSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkhFQURFUl9MRUZULCAwLCAxMSkpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFZpc2libGUoZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7ICAgIAotICAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQVNEU2VsZWN0aW9uRWRpdFBvbGljeSgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRXhwYW5kZWQoKQotICB7Ci0gICAgcmV0dXJuIGlzRXhwYW5kZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGlzRXhwYW5kZWQpCi0gIHsKLSAgICB0aGlzLmlzRXhwYW5kZWQgPSBpc0V4cGFuZGVkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgTGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpOwotICAgICAgaWYgKGxheW91dE1hbmFnZXIgaW5zdGFuY2VvZiBCaW5kaW5nQ29sdW1uTGF5b3V0KQotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgQmluZGluZ0NvbHVtbkxheW91dCBiaW5kaW5nQ29sdW1uTGF5b3V0ID0gKEJpbmRpbmdDb2x1bW5MYXlvdXQpbGF5b3V0TWFuYWdlcjsKLSAgICAgICAgYmluZGluZ0NvbHVtbkxheW91dC5zZXRFeHBhbmRlZCh0aGlzLCAhaXNFeHBhbmRlZCk7Ci0gICAgICAgICgoQmluZGluZ0NvbHVtbkVkaXRQYXJ0KWdldFBhcmVudCgpKS5yZWZyZXNoQmluZGluZ0VkaXRQYXJ0cygpOwotICAgICAgfSAgCi0gICAgfQotICB9IAotICAKLSAgcHVibGljIEVkaXRQYXJ0IGdldFJlbGF0aXZlRWRpdFBhcnQoaW50IGRpcmVjdGlvbikKLSAgewotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVCkKLSAgICB7Ci0gICAgICAvLyBuYXZpZ2F0ZSBmb3J3YXJkIGFsb25nIHRoZSBjb25uZWN0aW9uICh0byB0aGUgcmlnaHQpCi0gICAgICByZXR1cm4gZ2V0Q29ubmVjdGlvblRhcmdldEVkaXRQYXJ0KCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpCi0gICAgewotICAgICAgLy8gbmF2aWdhdGUgYmFja3dhcmQgYWxvbmcgdGhlIGNvbm5lY3Rpb24gKHRvIHRoZSBsZWZ0KQotICAgICAgcmV0dXJuIEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldFNvdXJjZUNvbm5lY3Rpb25FZGl0UGFydCh0aGlzKTsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHN1cGVyLmdldFJlbGF0aXZlRWRpdFBhcnQoZGlyZWN0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0NvbHVtbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvQ29sdW1uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyM2E5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvQ29sdW1uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFic3RyYWN0TW9kZWxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSURlc2NyaXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ29sdW1uRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsgICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotICAgIGxheW91dC5zZXRTcGFjaW5nKDIwKTsKLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIChJRGVzY3JpcHRpb24pZ2V0TW9kZWwoKTsgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7IAotICAgIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24pZ2V0TW9kZWwoKTsKLSAgICBPYmplY3QgY2hpbGRyZW5bXSA9IGNvbGxlY3Rpb24uZ2V0Q2hpbGRyZW4oKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykgewotICAgIAlsaXN0LmFkZChjaGlsZHJlbltpbmRleF0pOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKSB7Ci0JICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKSB7Ci0JICAKLSAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0RlZmluaXRpb25zRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9EZWZpbml0aW9uc0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NjQ5NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0RlZmluaXRpb25zRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5b3V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQWJzdHJhY3RNb2RlbENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQmluZGluZ0NvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JbnRlcmZhY2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuU2VydmljZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLQotcHVibGljIGNsYXNzIERlZmluaXRpb25zRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgewotCSAgTGlzdCBjb2xsZWN0aW9ucyA9IG51bGw7Ci0JICBGaWd1cmUgY29udGVudFBhbmU7Ci0gICAgICBMYWJlbCBtZXNzYWdlTGFiZWw7IAotICAgICAgSW50ZXJuYWxMYXlvdXRMaXN0ZW5lciBpbnRlcm5hbExheW91dExpc3RlbmVyID0gbmV3IEludGVybmFsTGF5b3V0TGlzdGVuZXIoKTsKLQkgIAotCSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLQkgIHsgICAgCi0JICAgIFBhbmVsIHBhbmVsID0gbmV3IFBhbmVsKCk7ICAgIAotICAgICAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCh0cnVlKTsKLSAgICAgICAgcGFuZWwuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLSAgICAgICAgcGFuZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoNjAsIDMwLCAzMCwgMzApKTsKLQkgICAgY29udGVudFBhbmUgPSBuZXcgRmlndXJlKCk7Ci0JICAgIHBhbmVsLmFkZChjb250ZW50UGFuZSk7Ci0KLSAgICAgICAgbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKCIiKTsKLSAgICAgICAgY29udGVudFBhbmUuYWRkKG1lc3NhZ2VMYWJlbCk7Ci0gICAgICAKLQkgICAgVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCh0cnVlKTsKLQkgICAgbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0JICAgIGxheW91dC5zZXRTcGFjaW5nKDApOwotCSAgICBjb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JICAgIHJldHVybiBwYW5lbDsKLQkgIH0KLQkgIAotICAgICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICAgICAgewotICAgICAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gaGVyZSB3ZSB3YW50IHRvIGVuc3VyZSB0aGUgYmluZGluZyBjb2x1bW4gaXMgbGlzdGVuaW5nCi0gICAgICAgIC8vIHRvIHRoZSBpbnRlcmZhY2UgY29sdW1uIHNvIHRoYXQgaXQgY2FuIHJlLWxheW91dCB3aGVuIAotICAgICAgICAvLyB0aGUgaW50ZXJmYWNlIGNoYW5nZXMKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICAgIGlmIChjaGlsZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgSW50ZXJmYWNlQ29sdW1uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkLmdldEZpZ3VyZSgpLmFkZExheW91dExpc3RlbmVyKGludGVybmFsTGF5b3V0TGlzdGVuZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gICAgICAgICAgIAotICAgICAgfQotICAgICAgICAgICAgICAgIAotCSAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJICBzdXBlci5yZWZyZXNoKCk7Ci0JCSAgCi0JCSAgLy8gUmVmcmVzaCB0aGUgY29ubmVjdGluZyBsaW5lcwotCQkgIHJlZnJlc2hDb25uZWN0aW9ucygpOwotCSAgfQotCSAgCi0JICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0JICB7Ci0JICAgIHJldHVybiBjb250ZW50UGFuZTsKLQkgIH0KLQkgIAotCi0JICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotCSAgewotCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JICB9Ci0JICAKLSAgICAgIHB1YmxpYyB2b2lkIHNldE1vZGVsQ2hpbGRyZW4oTGlzdCBsaXN0KQotICAgICAgewotICAgICAgICBjb2xsZWN0aW9ucyA9IGxpc3Q7Ci0gICAgICB9Ci0gICAgICAKLQkgIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotCSAgeyAKLQkgICAgaWYgKGNvbGxlY3Rpb25zID09IG51bGwpCi0JICAgIHsKLQkgICAgICBjb2xsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgICAKLQkgICAgICBJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoSURlc2NyaXB0aW9uKSBnZXRNb2RlbCgpOwotCSAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCSAgICAgIHsgIAotCSAgICAgICAgY29sbGVjdGlvbnMuYWRkKG5ldyBTZXJ2aWNlQ29sdW1uKGRlc2NyaXB0aW9uKSk7Ci0JICAgICAgICBjb2xsZWN0aW9ucy5hZGQobmV3IEJpbmRpbmdDb2x1bW4oZGVzY3JpcHRpb24pKTsKLQkgICAgICAgIGNvbGxlY3Rpb25zLmFkZChuZXcgSW50ZXJmYWNlQ29sdW1uKGRlc2NyaXB0aW9uKSk7Ci0JICAgICAgfQotCSAgICB9Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW4gPSBmYWxzZTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbGxlY3Rpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uIGNvbHVtbiA9IChBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbilpLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbHVtbi5oYXNDaGlsZHJlbigpKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzQ2hpbGRyZW4gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChoYXNDaGlsZHJlbikKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOwotICAgICAgICBpZiAoY29udGVudFBhbmUuZ2V0Q2hpbGRyZW4oKS5jb250YWlucyhtZXNzYWdlTGFiZWwpKQotICAgICAgICAgIGNvbnRlbnRQYW5lLnJlbW92ZShtZXNzYWdlTGFiZWwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfUklHSFRfQ0xJQ0tfVE9fSU5TRVJUX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICghY29udGVudFBhbmUuZ2V0Q2hpbGRyZW4oKS5jb250YWlucyhtZXNzYWdlTGFiZWwpKQotICAgICAgICAgIGNvbnRlbnRQYW5lLmFkZChtZXNzYWdlTGFiZWwpOwotICAgICAgfQotICAgICAgCi0KLQkgICAgcmV0dXJuIGNvbGxlY3Rpb25zOwotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotCSAgeyAgICAKLQkgIH0JIAotICAgICAgCi0gICAgICBwcml2YXRlIGNsYXNzIEludGVybmFsTGF5b3V0TGlzdGVuZXIgZXh0ZW5kcyBMYXlvdXRMaXN0ZW5lci5TdHViCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHBvc3RMYXlvdXQoSUZpZ3VyZSBjb250YWluZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCaW5kaW5nQ29sdW1uRWRpdFBhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICgoQmluZGluZ0NvbHVtbkVkaXRQYXJ0KWNoaWxkKS5yZWZyZXNoQmluZGluZ0VkaXRQYXJ0cygpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9ICAgCi0gICAgICB9ICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9FZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0VkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDJmODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0VkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlcy5Db21wb25lbnRSZWZlcmVuY2VDb25uZWN0aW9uOwotCi0KLWNsYXNzIEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsCi17Ci0gIHN0YXRpYyBHcmFwaGljYWxFZGl0UGFydCBnZXRSZWxhdGl2ZUVkaXRQYXJ0KEdyYXBoaWNhbEVkaXRQYXJ0IGZvY3VzRWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICAvLyB0aGVzZSAnZGVsdGEnIHZhbHVlcyBuZWVkIHRvIGJlIHNldCB0byBzb21lIHZhbHVlIHRoYXQncyBsYXJnZSBlbm91Z2ggdG8gY3Jvc3MgdGhlIGdhcAotICAgIC8vIGJldHdlZW4gYWRqYWNlbnQgZWRpdCBwYXJ0cyAoc2luY2Ugc29tZSBsYXlvdXRzIG1heSBzcGFjZSB0aGUgZWRpdCBwYXJ0cyBvdXQgYSBiaXQpCi0gICAgaW50IGR4ID0gNTsKLSAgICBpbnQgZHkgPSA1OwotICAgICAgICAKLSAgICBJRmlndXJlIGNvbnRlbnRQYW5lID0gZm9jdXNFZGl0UGFydC5nZXRDb250ZW50UGFuZSgpOwotICAgIAotICAgIC8vIHdlIGF0dGVtcHQgdG8gY29tcHV0ZSBhIHJlY3RhbmdsZSB0aGF0IHJlcHJlc2VudHMgb3VyIGN1cnJlbnQgbG9jYXRpb24KLSAgICBSZWN0YW5nbGUgciA9IGZvY3VzRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIGZvY3VzRWRpdFBhcnQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLSAgICBpZiAoY29udGVudFBhbmUgIT0gZm9jdXNFZGl0UGFydC5nZXRGaWd1cmUoKSkKLSAgICB7Ci0gICAgICAvLyBpZiB0aGUgRWRpdFBhcnQgaGFzIGEgY29udGVudFBhbmUgKHRoYXQncyBubyB0aGUgZmlndXJlKSB0aGVuIHdlIGFzc3VtZQotICAgICAgLy8gZWZmZWN0aXZlIHJlY3RhbmdsZSBpcyBvbmx5IHRoZSBoZWFkZXIgcG9ydGlvbiBvZiB0aGUgZmlndXJlCi0gICAgICAvLwotICAgICAgUmVjdGFuZ2xlIGNvbnRlbnRQYW5lQm91bmRzID0gY29udGVudFBhbmUuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgY29udGVudFBhbmUudHJhbnNsYXRlVG9BYnNvbHV0ZShjb250ZW50UGFuZUJvdW5kcyk7Ci0gICAgICAKLSAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IHdoZW4gdGhlIGVkaXRwYXJ0J3MgZmlndXJlIGFuZCBjb250ZW50UGFuZSBhcmUgZGlmZmVyZW50Ci0gICAgICAvLyB0aGF0IHBvcnRpb24gb2YgdGhlICdoaXR0YWJsZScgcG9ydGlvbiBvZiBlZGl0cGFydCBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGNvbnRlbnRQYW5lCi0gICAgICBpZiAoY29udGVudFBhbmVCb3VuZHMueSA+IHIueSkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgdGhlIGNvbnRlbnRQYW5lIGlzIGxvd2VyIHRoYW4gdGhlIGZpZ3VyZSB3ZSBvbmx5IHdhbnQgdGhlIHJlY3RhbmdsZQotICAgICAgICAvLyBhYm92ZSB0aGUgY29udGVudFBhbmUKLSAgICAgICAgci5oZWlnaHQgPSBjb250ZW50UGFuZUJvdW5kcy55IC0gci55OwotICAgICAgICAvLyB3ZSBhZGp1c3QgdGhlIHJlY3RhbmdsZSB0aGUgcmlnaHQgc2xpZ2h0bHkgc2luY2UgdGhlIGNvbnRlbnQgaXMgbmVzdGVkIGEgYml0ICAgICAKLSAgICAgICAgci54ID0gY29udGVudFBhbmVCb3VuZHMueDsKLSAgICAgIH0KLSAgICAgIGlmIChjb250ZW50UGFuZUJvdW5kcy54ID4gci54KQotICAgICAgewotICAgICAgICAvLyBpZiB0aGUgY29udGVudFBhbmUgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBmaWd1cmUgd2Ugb25seSB3YW50IHRoZSByZWN0YW5nbGUKLSAgICAgICAgLy8gdG8gdGhlIGxlZnQgb2YgdGhlIGNvbnRlbnQgcGFuZQotICAgICAgICByLndpZHRoID0gY29udGVudFBhbmVCb3VuZHMueCAtIHIueDsKLSAgICAgIH0KLSAgICB9Ci0gICAgUG9pbnQgcCA9IG51bGw7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICB7Ci0gICAgICBwID0gci5nZXRUb3BMZWZ0KCk7Ci0gICAgICBwLnkgLT0gZHk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkKLSAgICB7Ci0gICAgICBwID0gci5nZXRCb3R0b21MZWZ0KCk7Ci0gICAgICBwLnggKz0gZHg7Ci0gICAgICBwLnkgKz0gZHk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKQotICAgIHsKLSAgICAgIHAgPSByLmdldFRvcFJpZ2h0KCk7Ci0gICAgICBwLnggKz0gZHg7Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKQotICAgIHsKLSAgICAgIHAgPSByLmdldExlZnQoKTsKLSAgICAgIHAueCAtPSBkeDsKLSAgICB9ICAKLSAgICBFZGl0UGFydCB0ID0gZm9jdXNFZGl0UGFydC5nZXRWaWV3ZXIoKS5maW5kT2JqZWN0QXQocCk7Ci0gICAgICAgIAotICAgIGlmICh0IGluc3RhbmNlb2YgQ29sdW1uRWRpdFBhcnQgfHwgdCBpbnN0YW5jZW9mIERlZmluaXRpb25zRWRpdFBhcnQpCi0gICAgewotICAgICAgdCA9IG51bGw7Ci0gICAgfSAgICAgIAotICAgIHJldHVybiAoR3JhcGhpY2FsRWRpdFBhcnQpdDsKLSAgfQotICAKLSAgc3RhdGljIEVkaXRQYXJ0IGdldE5leHRTaWJsaW5nKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7ICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgIAotICAgIEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWRpdFBhcnQpOwotICAgICAgaWYgKGluZGV4ICsgMSA8IGNoaWxkcmVuLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpbmRleCArIDEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBzdGF0aWMgRWRpdFBhcnQgZ2V0UHJldlNpYmxpbmcoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICBpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGVkaXRQYXJ0KTsKLSAgICAgIGlmIChpbmRleCAtIDEgPj0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgLy8gICAgICAgIAotICAgICAgICByZXN1bHQgPSAoRWRpdFBhcnQpY2hpbGRyZW4uZ2V0KGluZGV4IC0gMSk7Ci0gICAgICB9IAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAKLSAgc3RhdGljIEVkaXRQYXJ0IGdldE5leHRJbnRlcmZhY2UoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEVkaXRQYXJ0IGUgPSBlZGl0UGFydDsgZSAhPSBudWxsOyBlID0gZS5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAoZSBpbnN0YW5jZW9mIEludGVyZmFjZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBJbnRlcmZhY2VFZGl0UGFydCBpZSA9IChJbnRlcmZhY2VFZGl0UGFydCllOwotICAgICAgICByZXN1bHQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXROZXh0U2libGluZyhpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAKLSAgCi0gIHN0YXRpYyBFZGl0UGFydCBnZXRTb3VyY2VDb25uZWN0aW9uRWRpdFBhcnQoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIC8vIGZpbmQgdGhlIGZpcnN0IGNvbm5lY3Rpb24gdGhhdCB0YXJnZXRzIHRoaXMgZWRpdFBhcnQKLSAgICAvLyBuYXZpZ2F0ZSBiYWNrd2FyZCBhbG9uZyB0aGUgY29ubmVjdGlvbiAodG8gdGhlIGxlZnQpIHRvIGZpbmQgdGhlIHNvdXJjIGVkaXQgcGFydAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgRWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gZWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0gICAgTGF5ZXJNYW5hZ2VyIG1hbmFnZXIgPSAoTGF5ZXJNYW5hZ2VyKWVkaXRQYXJ0LmdldFZpZXdlcigpLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoTGF5ZXJNYW5hZ2VyLklEKTsKLSAgICBJRmlndXJlIGxheWVyID0gbWFuYWdlci5nZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKTsgICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGF5ZXIuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEZpZ3VyZSBmaWd1cmUgPSAoRmlndXJlKWkubmV4dCgpOwotICAgICAgaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24gY29tcG9uZW50UmVmZXJlbmNlQ29ubmVjdGlvbiA9IChDb21wb25lbnRSZWZlcmVuY2VDb25uZWN0aW9uKWZpZ3VyZTsKLSAgICAgICAgQ29ubmVjdGlvbkFuY2hvciB0YXJnZXRBbmNob3IgPSBjb21wb25lbnRSZWZlcmVuY2VDb25uZWN0aW9uLmdldFRhcmdldEFuY2hvcigpOwotICAgICAgICBpZiAodGFyZ2V0QW5jaG9yLmdldE93bmVyKCkgPT0gZWRpdFBhcnQuZ2V0RmlndXJlKCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIENvbm5lY3Rpb25BbmNob3Igc291cmNlQW5jaG9yID0gY29tcG9uZW50UmVmZXJlbmNlQ29ubmVjdGlvbi5nZXRTb3VyY2VBbmNob3IoKTsKLSAgICAgICAgICBJRmlndXJlIHNvdXJjZUZpZ3VyZSA9IHNvdXJjZUFuY2hvci5nZXRPd25lcigpOyAgICAgICAgICAKLSAgICAgICAgICBFZGl0UGFydCBwYXJ0ID0gbnVsbDsKLSAgICAgICAgICB3aGlsZSAocGFydCA9PSBudWxsICYmIHNvdXJjZUZpZ3VyZSAhPSBudWxsKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0ID0gKEVkaXRQYXJ0KXZpZXdlci5nZXRWaXN1YWxQYXJ0TWFwKCkuZ2V0KHNvdXJjZUZpZ3VyZSk7Ci0gICAgICAgICAgICBzb3VyY2VGaWd1cmUgPSBzb3VyY2VGaWd1cmUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICByZXN1bHQgPSBwYXJ0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0VuZFBvaW50RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9FbmRQb2ludEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NmFkZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0VuZFBvaW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5EZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5jb25uZWN0aW9ucy5DZW50ZXJlZENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5kaXJlY3RlZGl0LkxhYmVsQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5kaXJlY3RlZGl0LkxhYmVsRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXMuQVNETGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBvbGljaWVzLkFTRFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5maWd1cmVzLkNvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRW5kUG9pbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFbmRQb2ludEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0IGltcGxlbWVudHMgSUZlZWRiYWNrSGFuZGxlciwgSU5hbWVkRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIExhYmVsIG5hbWVMYWJlbDsKLSAgcHJvdGVjdGVkIExhYmVsIGFkZHJlc3NMYWJlbDsKLSAgcHJpdmF0ZSBMYWJlbCBob3ZlckhlbHBMYWJlbCA9IG5ldyBMYWJlbCgiIik7Ci0gIHByb3RlY3RlZCBGaWd1cmUgYWRkcmVzc0JveEZpZ3VyZTsKLSAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgTUFYX0FERFJFU1NfV0lEVEggPSAxNTA7Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIGZpZ3VyZSA9IG5ldyBQYW5lbCgpOwotICAgIGZpZ3VyZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig0KSk7Ci0gICAgVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgLy8gbGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KFRvb2xiYXJMYXlvdXQuQUxJR05fVE9QTEVGVCk7Ci0gICAgbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLSAgICBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICBuYW1lTGFiZWwuc2V0SWNvbigoKElFbmRQb2ludCkgZ2V0TW9kZWwoKSkuZ2V0SW1hZ2UoKSk7Ci0gICAgbmFtZUxhYmVsLnNldExhYmVsQWxpZ25tZW50KExhYmVsLkxFRlQpOwotICAgIC8vIG5hbWVMYWJlbC5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpOwotICAgIGZpZ3VyZS5hZGQobmFtZUxhYmVsKTsKLSAgICBGaWd1cmUgZjEgPSBuZXcgRmlndXJlKCk7Ci0gICAgZjEuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgMjAsIDAsIDApKTsKLSAgICBmMS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotICAgIGZpZ3VyZS5hZGQoZjEpOwotICAgIGFkZHJlc3NCb3hGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgYWRkcmVzc0JveEZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgICBhZGRyZXNzQm94RmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKQotICAgIHsKLSAgICAgIC8vIGhlcmUnIHdlIHR3ZWFrIHRoZSBsYXlvdXQgc28gdGhhdCBhZGRyZXNzIGxhYmVscyBhcmVuJ3Qgc2l6ZWQgdG9vIHdpZGUKLSAgICAgIC8vIHRoZSBMYWJlbCBjbGFzcyBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdGhlIGFkZGl0aW9uIG9mIHRoZSAnLi4uJyAKLSAgICAgIC8vCi0gICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBjb250YWluZXIsIGludCB3SGludCwgaW50IGhIaW50KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmNhbGN1bGF0ZVByZWZlcnJlZFNpemUoY29udGFpbmVyLCB3SGludCwgaEhpbnQpOwotICAgICAgICBkLndpZHRoID0gTWF0aC5taW4oZC53aWR0aCwgTUFYX0FERFJFU1NfV0lEVEgpOwotICAgICAgICByZXR1cm4gZDsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBmMS5hZGQoYWRkcmVzc0JveEZpZ3VyZSk7Ci0gICAgYWRkcmVzc0xhYmVsID0gbmV3IExhYmVsKCk7Ci0KLSAgICBhZGRyZXNzTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBhZGRyZXNzTGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMiwgNiwgMiwgNikpOwotICAgIGFkZHJlc3NMYWJlbC5zZXRMYWJlbEFsaWdubWVudChMYWJlbC5MRUZUKTsKLSAgICBhZGRyZXNzQm94RmlndXJlLmFkZChhZGRyZXNzTGFiZWwpOwotICAgIAotICAgIC8vIHJtYWg6IFRoZSBibG9jayBvZiBjb2RlIGJlbG93IGhhcyBiZWVuIG1vdmVkIGZyb20gcmVmcmVzaFZpc3VhbHMoKS4gIFdlJ3JlCi0gICAgLy8gYXNzdW1pbmcgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiB0aGUgRWRpdFBhcnQgd2lsbCBuZXZlciBjaGFuZ2Ugb25jZSB0aGUKLSAgICAvLyBFZGl0UGFydCBoYXMgYmVlbiBjcmVhdGVkLgotICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgeyAgCi0gICAgICBuYW1lTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5yZWFkT25seUxhYmVsQ29sb3IpOwotICAgICAgYWRkcmVzc0xhYmVsLnNldEZvcmVncm91bmRDb2xvcihEZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMucmVhZE9ubHlMYWJlbENvbG9yKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBuYW1lTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5sYWJlbENvbG9yKTsKLSAgICAgIGFkZHJlc3NMYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLmxhYmVsQ29sb3IpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgbmV3IEFTRExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQVNEU2VsZWN0aW9uRWRpdFBvbGljeSgpKTsKLSAgfQotICBwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0gIHByaXZhdGUgUG9pbnQgY3Vyc29yTG9jYXRpb247Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgY3Vyc29yTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLmN1cnNvckxvY2F0aW9uID0gY3Vyc29yTG9jYXRpb247Ci0gICAgaWYgKCFpc1JlYWRPbmx5KCkgJiYgKGN1cnNvckxvY2F0aW9uID09IG51bGwgfHwgaGl0VGVzdChnZXRMYWJlbEZpZ3VyZSgpLCBjdXJzb3JMb2NhdGlvbikpKSB7Ci0gICAgCW1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBjdXJzb3JMb2NhdGlvbikpOwotICAgIAltYW5hZ2VyLnNob3coKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaGl0VGVzdChnZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSwgY3Vyc29yTG9jYXRpb24pICYmIGlzUmVhZE9ubHkoKSkgewotICAgICAgZG9PcGVuTmV3RWRpdG9yKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCSAgaWYgKHJlcS5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUKSkgewotCQkgIHBlcmZvcm1EaXJlY3RFZGl0KG51bGwpOwotCSAgfQotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldExhYmVsRmlndXJlKCkKLSAgewotICAgIGlmIChjdXJzb3JMb2NhdGlvbiA9PSBudWxsIHx8IHRyYW5zbGF0ZUJvdW5kcyhuYW1lTGFiZWwuZ2V0Qm91bmRzKCkpLmNvbnRhaW5zKGN1cnNvckxvY2F0aW9uKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmFtZUxhYmVsOwotICAgIH0KLSAgICBlbHNlIGlmICh0cmFuc2xhdGVCb3VuZHMoYWRkcmVzc0xhYmVsLmdldEJvdW5kcygpKS5jb250YWlucyhjdXJzb3JMb2NhdGlvbikpCi0gICAgewotICAgICAgcmV0dXJuIGFkZHJlc3NMYWJlbDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBSZWN0YW5nbGUgdHJhbnNsYXRlQm91bmRzKFJlY3RhbmdsZSBib3VuZHMpIHsKLQkgIAotCQlBU0RNdWx0aVBhZ2VFZGl0b3IgZWRpdG9yID0gKEFTRE11bHRpUGFnZUVkaXRvcikgQVNERWRpdG9yUGx1Z2luLmdldEFjdGl2ZUVkaXRvcigpOwotCQlGaWd1cmVDYW52YXMgY2FudmFzID0gKEZpZ3VyZUNhbnZhcykgKChFZGl0UGFydFZpZXdlcikgZWRpdG9yLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKSkuZ2V0Q29udHJvbCgpOwotCQlQb2ludCB2aWV3TG9jYXRpb24gPSBjYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWaWV3TG9jYXRpb24oKTsKLQkJCi0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKGJvdW5kcy54ICsgdmlld0xvY2F0aW9uLngsIGJvdW5kcy55ICsgdmlld0xvY2F0aW9uLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJlZmVyZW5jZWRNb2RlbCgpCi0gIHsKLSAgICBJRW5kUG9pbnQgZW5kUG9pbnQgPSAoSUVuZFBvaW50KSBnZXRNb2RlbCgpOwotICAgIHJldHVybiBlbmRQb2ludC5nZXRCaW5kaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBJRW5kUG9pbnQgZW5kUG9pbnQgPSAoSUVuZFBvaW50KSBnZXRNb2RlbCgpOwotICAgIG5hbWVMYWJlbC5zZXRUZXh0KGVuZFBvaW50LmdldE5hbWUoKSk7Ci0gICAgYWRkcmVzc0xhYmVsLnNldFRleHQoZW5kUG9pbnQuZ2V0QWRkcmVzcygpKTsKLSAgICAKLSAgICBSZWN0YW5nbGUgdGV4dEJvdW5kcyA9IGFkZHJlc3NMYWJlbC5nZXRUZXh0Qm91bmRzKCk7Ci0gICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGFkZHJlc3NMYWJlbC5nZXRCb3VuZHMoKTsKLSAgICBpbnQgdGV4dFBsYWNlbWVudCA9IGFkZHJlc3NMYWJlbC5nZXRUZXh0UGxhY2VtZW50KCk7Ci0gICAgaW50IHhEZWx0YSA9IHRleHRCb3VuZHMueCAtIGJvdW5kcy54OwotICAgIGludCB4VGV4dEluY3JlYXNlID0gdGV4dFBsYWNlbWVudCAtIHhEZWx0YTsKLSAgICBpbnQgdGV4dFNpemUgPSB0ZXh0Qm91bmRzLndpZHRoICsgeFRleHRJbmNyZWFzZTsKLSAgICBpbnQgYm91bmRTaXplID0gYm91bmRzLndpZHRoOwotCi0gICAgaWYgKHRleHRTaXplID4gYm91bmRTaXplKSB7Ci0gICAgCWhvdmVySGVscExhYmVsLnNldFRleHQoIiAiICsgZW5kUG9pbnQuZ2V0QWRkcmVzcygpICArICIgIik7Ci0gICAgICAgIGFkZHJlc3NMYWJlbC5zZXRUb29sVGlwKGhvdmVySGVscExhYmVsKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFkZHJlc3NMYWJlbC5zZXRUb29sVGlwKG51bGwpOwotICAgIH0KLQotICAgIHJlZnJlc2hDb25uZWN0aW9ucygpOwotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgIGFjdGl2YXRlQ29ubmVjdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotCSAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotCSAgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikuYWRkKGNvbm5lY3Rpb25GaWd1cmUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRlYWN0aXZhdGVDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpCi0gICAgewotICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0gICAgICByZW1vdmVkID0gcmVtb3ZlQ29ubmVjdGlvbkZpZ3VyZShnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKSk7Ci0gICAgICAKLSAgICAgIGlmICghcmVtb3ZlZCkgewotICAgIAkgIHJlbW92ZUNvbm5lY3Rpb25GaWd1cmUoZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuRkVFREJBQ0tfTEFZRVIpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVDb25uZWN0aW9uRmlndXJlKElGaWd1cmUgcGFyZW50KSB7Ci0JICBib29sZWFuIGNvbnRhaW5zID0gZmFsc2U7Ci0JICBJdGVyYXRvciBpdCA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCSAgSUZpZ3VyZSBmaWcgPSAoSUZpZ3VyZSkgaXQubmV4dCgpOwotCQkgIGlmIChmaWcuZXF1YWxzKGNvbm5lY3Rpb25GaWd1cmUpKSB7Ci0JCQkgIGNvbnRhaW5zID0gdHJ1ZTsKLQkJCSAgYnJlYWs7Ci0JCSAgfQotCSAgfQotCSAgCi0JICBpZiAoY29udGFpbnMpIHsKLQkJICBwYXJlbnQucmVtb3ZlKGNvbm5lY3Rpb25GaWd1cmUpOwotCSAgfQotCSAgCi0JICByZXR1cm4gY29udGFpbnM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLQkgIE9iamVjdCB0eXBlQmVpbmdSZWYgPSBnZXRSZWZlcmVuY2VkTW9kZWwoKTsKLSAgICAgIGlmICh0eXBlQmVpbmdSZWYgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByZWZlcmVuY2VUeXBlUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHR5cGVCZWluZ1JlZik7Ci0gICAgICAgIGlmIChyZWZlcmVuY2VUeXBlUGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0KLSAgcHVibGljIENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLQkgIGlmIChjb25uZWN0aW9uRmlndXJlID09IG51bGwgJiYgc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKSkKLQkgICAgewotCSAgICAgIE9iamVjdCB0eXBlQmVpbmdSZWYgPSBnZXRSZWZlcmVuY2VkTW9kZWwoKTsKLQkgICAgICBpZiAodHlwZUJlaW5nUmVmICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByZWZlcmVuY2VUeXBlUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHR5cGVCZWluZ1JlZik7Ci0JICAgICAgICBpZiAocmVmZXJlbmNlVHlwZVBhcnQgIT0gbnVsbCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgLy8gV2UgZG8gcmVmZXJlbmNlIGFub3RoZXIgVHlwZS4gQnVpbGQgYSBjb25uZWN0aW9uLiBXZSBjYW4gbWFrZQotCSAgICAgICAgICAvLyBhc3N1bXB0aW9ucyBhYm91dCBhbmNob3IgcG9zaXRpb25pbmcgc2luY2UgYW4gYXR0cmlidXRlIGNhbiBvbmx5Ci0JICAgICAgICAgIC8vIGhhdmUgYSAicmVmZXJlbmNlIiByZWxhdGlvbnNoaXAsIG5vICJpbmhlcml0YW5jZSIsIG5vCi0JICAgICAgICAgIC8vICJpcy1yZWZlcmVuY2VkLWJ5IgotCSAgICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24oKTsKLQkgICAgICAgICAgcmVmcmVzaENvbm5lY3Rpb25zKCk7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci0KLSAgRWRpdFBhcnQgZ2V0Q29ubmVjdGlvblRhcmdldEVkaXRQYXJ0KCkKLSAgewotICAgIE9iamVjdCB0eXBlQmVpbmdSZWYgPSBnZXRSZWZlcmVuY2VkTW9kZWwoKTsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKSB7Ci0gICAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlZmVyZW5jZVR5cGVQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGdldFZpZXdlcigpLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQodHlwZUJlaW5nUmVmKTsKLSAgICAgIHJldHVybiByZWZlcmVuY2VUeXBlUGFydDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hDb25uZWN0aW9ucygpIHsKLQkgIGlmIChzaG91bGREcmF3Q29ubmVjdGlvbigpKSB7Ci0JCSAgT2JqZWN0IHR5cGVCZWluZ1JlZiA9IGdldFJlZmVyZW5jZWRNb2RlbCgpOwotCQkgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpIHsKLQkJCSAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByZWZlcmVuY2VUeXBlUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHR5cGVCZWluZ1JlZik7Ci0JICAgICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoYWRkcmVzc0JveEZpZ3VyZSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlJJR0hULCAwLCAwKSk7Ci0JICAgICAgICAgIElGaWd1cmUgdGFyZ2V0RmlndXJlID0gcmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCk7Ci0JICAgICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IodGFyZ2V0RmlndXJlLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuSEVBREVSX0xFRlQsIDAsIDEwKSk7Ci0JICAgICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLQkgICAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRWaXNpYmxlKHRydWUpOwotCQkgIH0KLQkJICBlbHNlIHsKLQkJCSAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0JCSAgfQotCSAgfQotCSAgZWxzZSBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKXsKLQkJICBjb25uZWN0aW9uRmlndXJlLnNldFZpc2libGUoZmFsc2UpOwotCSAgfQotICB9Ci0KLSAgcHJpdmF0ZSBJRmlndXJlIGdldEZpZ3VyZUZvckZlZWRiYWNrKCkKLSAgewotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBJRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZUZvckZlZWRiYWNrKCk7Ci0gICAgZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihEZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMudGFibGVDZWxsU2VsZWN0aW9uQ29sb3IpOwotICAgIAotICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpIHsKLSAgICAJY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQodHJ1ZSk7Ci0gICAgCWdldExheWVyKExheWVyQ29uc3RhbnRzLkZFRURCQUNLX0xBWUVSKS5hZGQoY29ubmVjdGlvbkZpZ3VyZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmVGb3JGZWVkYmFjaygpOwotICAgIGZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoZmlndXJlLmdldFBhcmVudCgpLmdldEJhY2tncm91bmRDb2xvcigpKTsKLSAgICAKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKSB7Ci0gICAgCWNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICAJZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikuYWRkKGNvbm5lY3Rpb25GaWd1cmUpOwotICAgIH0KLSAgfQotCi0gIC8vIFRPRE86IHJtYWg6IFZFUlkgVUdMWSBIQUNLLi4uLiBJIGRvbid0IHNlZSBhbnkgb3RoZXIgd2F5IHRvIHNvbHZlIHRoaXMKLSAgLy8gaXNzdWUgYXQgdGhpcyB0aW1lLgotICAvLyBFbmRQb2ludEVkaXRQYXJ0IGNvbnRhaW5zIHR3byBsYWJlbHMgd2hpY2ggY2FuIGJlIGRpcmVjdCBlZGl0ZWQuIFRoZSBmYWNhZGUKLSAgLy8gZHJpdmluZyBFbmRQb2ludEVkaXRQYXJ0Ci0gIC8vIGNvbnRhaW5zIGEgZ2V0U2V0TmFtZUNvbW1hbmQoKSBhbmQgYSBnZXRTZXRBZGRyZXNzQ29tbWFuZCgpLi4uIGhvd2V2ZXIsCi0gIC8vIHRoaXMgY2xhc3MgKExhYmVsRGlyZWN0RWRpdFBvbGljeSkKLSAgLy8gb25seSBrbm93cyBhYm91dCBnZXRTZXROYW1lQ29tbWFuZCgpLi4uLi4gVGhpcyBpcyB0aGUgcHJvYmxlbSB3ZSBmYWNlIHdoZW4KLSAgLy8gY29tYmluaW5nIHR3byBsYWJlbHMgaW50bwotICAvLyBvbmUgRWRpdFBhcnQuLi4uLgotICAvLyBTZWUgTGFiZWxEaXJlY3RFZGl0UG9saWN5LmdldERpcmVjdEVkaXRDb21tYW5kKERpcmVjdEVkaXRSZXF1ZXN0KQotICBwdWJsaWMgQ29tbWFuZCBnZXRTZXRQcm9wZXJMYWJlbENvbW1hbmQoU3RyaW5nIG5ld1ZhbHVlKQotICB7Ci0gICAgLy8gVE9ETzogcm1haDogV2UgbmVlZCB0byB0cmFuc2xhdGUgdGhlIHBvaW50Li4uCi0gICAgaWYgKGN1cnNvckxvY2F0aW9uID09IG51bGwgfHwgdHJhbnNsYXRlQm91bmRzKG5hbWVMYWJlbC5nZXRCb3VuZHMoKSkuY29udGFpbnMoY3Vyc29yTG9jYXRpb24pKQotICAgIHsKLSAgICAgIHJldHVybiAoKElFbmRQb2ludCkgZ2V0TW9kZWwoKSkuZ2V0U2V0TmFtZUNvbW1hbmQobmV3VmFsdWUpOwotICAgIH0KLSAgICBlbHNlIGlmICh0cmFuc2xhdGVCb3VuZHMoYWRkcmVzc0xhYmVsLmdldEJvdW5kcygpKS5jb250YWlucyhjdXJzb3JMb2NhdGlvbikpCi0gICAgewotICAgICAgcmV0dXJuICgoSUVuZFBvaW50KSBnZXRNb2RlbCgpKS5nZXRTZXRBZGRyZXNzQ29tbWFuZChuZXdWYWx1ZSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZ2V0UmVsYXRpdmVFZGl0UGFydChpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKQotICAgIHsgICAgICAKLSAgICAgIC8vIG5hdmlnYXRlIGZvcndhcmQgYWxvbmcgdGhlIGNvbm5lY3Rpb24gKHRvIHRoZSByaWdodCkKLSAgICAgIHJldHVybiBnZXRDb25uZWN0aW9uVGFyZ2V0RWRpdFBhcnQoKTsKLSAgICB9ICAKLSAgICByZXR1cm4gc3VwZXIuZ2V0UmVsYXRpdmVFZGl0UGFydChkaXJlY3Rpb24pOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9JRmVlZGJhY2tIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvSUZlZWRiYWNrSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA1MzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9JRmVlZGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZlZWRiYWNrSGFuZGxlciB7Ci0JcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKTsKLQlwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0lOYW1lZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvSU5hbWVkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2ZGUzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvSU5hbWVkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVkRWRpdFBhcnQgewotCXB1YmxpYyBMYWJlbCBnZXRMYWJlbEZpZ3VyZSgpOwotCXB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9JbnRlcmZhY2VFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0ludGVyZmFjZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTY0MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL0ludGVyZmFjZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5EZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5maWd1cmVzLkJveENvbXBvbmVudEZpZ3VyZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlcy5CYXNlTGlua0ljb25GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5sYXlvdXRzLlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklJbnRlcmZhY2U7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcmZhY2VFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm94dEVkaXRQYXJ0IGltcGxlbWVudHMgSUZlZWRiYWNrSGFuZGxlcgotewotCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGxpbmtJY29uQ29sdW1uOwotCXByb3RlY3RlZCBCb3hDb21wb25lbnRGaWd1cmUgYm94RmlndXJlOwotICBwdWJsaWMgSW50ZXJmYWNlRWRpdFBhcnQoKQotICB7Ci0gICAgY29sdW1uRGF0YS5zZXRDb2x1bW5XZWlnaHQoIk1lc3NhZ2VMYWJlbCIsIDApOyAvLyROT04tTkxTLTEkCi0gICAgY29sdW1uRGF0YS5zZXRDb2x1bW5XZWlnaHQoIk1lc3NhZ2VDb250ZW50UGFuZSIsIDEwMCk7IC8vJE5PTi1OTFMtMSQKLSAgICBjb2x1bW5EYXRhLnNldENvbHVtbldlaWdodCgicGFyYW1ldGVyTmFtZSIsIDUwKTsgLy8kTk9OLU5MUy0xJAotICAgIGNvbHVtbkRhdGEuc2V0Q29sdW1uV2VpZ2h0KCJwYXJhbWV0ZXJUeXBlIiwgNTApOyAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotCQlJRmlndXJlIG91dGVyID0gbmV3IEZpZ3VyZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQkJCXN1cGVyLnZhbGlkYXRlKCk7Ci0JCQkJLy8gSWYgd2UgZG9uJ3QgbGF5b3V0IG91ciBMaW5rIEljb24gQ29sdW1uIGF0IHRoaXMgcG9pbnQsIHRoZSBsaW5rIGljb25zCi0JCQkJLy8gd2lsbCBub3QgYmUgcHJvcGVybHkgdXBkYXRlZCBpbiB0aGUgc2NlbmFyaW8gd2hlcmUgYSBwb3J0dHlwZSBpcyBhZGRlZAotCQkJCS8vIG9yIHJlbW92ZWQuICBUaGUgbGluayBpY29ucyBvZiB0aGUgZXhpc3RpbmcgcG9ydHR5cGVzIHdpbGwgbm90IGJlIHVwZGF0ZWQuCi0JCQkJZ2V0TGlua0ljb25Db2x1bW4oKS5nZXRMYXlvdXRNYW5hZ2VyKCkubGF5b3V0KGdldExpbmtJY29uQ29sdW1uKCkpOwotCQkJfQotCQl9OwotCQkKLQkJb3V0ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCh0cnVlKSk7Ci0JICAgIGJveEZpZ3VyZSA9IChCb3hDb21wb25lbnRGaWd1cmUpIHN1cGVyLmNyZWF0ZUZpZ3VyZSgpOwotCSAgICBib3hGaWd1cmUuZ2V0TGFiZWwoKS5zZXRJY29uKCgoSUludGVyZmFjZSkgZ2V0TW9kZWwoKSkuZ2V0SW1hZ2UoKSk7Ci0JICAgIGJveEZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMub3JhbmdlKTsKLQkgICAgYm94RmlndXJlLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigxKSk7Ci0JICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLQkgICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotCSAgICBib3hGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLQkgICAgb3V0ZXIuYWRkKGJveEZpZ3VyZSk7Ci0JICAgIGxpbmtJY29uQ29sdW1uID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCSAgICBsaW5rSWNvbkNvbHVtbi5zZXRPdXRsaW5lKGZhbHNlKTsKLQkgICAgbGlua0ljb25Db2x1bW4uc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpIHsKLQkJCXB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIHBhcmVudCkgewotCQkJCXN1cGVyLmxheW91dChwYXJlbnQpOwotCQkJCQotCQkJCS8vIFdlIG5lZWQgdG8gbGF5b3V0IG9uIHRoZSB5LWF4aXMKLQkJCQlJdGVyYXRvciBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGNoaWxkcmVuLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgaXRlbSA9IGNoaWxkcmVuLm5leHQoKTsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJRmlndXJlKSB7Ci0JCQkJCQlJRmlndXJlIGZpZ3VyZSA9IChJRmlndXJlKSBpdGVtOwotCQkJCQkJZmlndXJlLmdldExheW91dE1hbmFnZXIoKS5sYXlvdXQoZmlndXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgY29udGFpbmVyLCBpbnQgd0hpbnQsIGludCBoSGludCkgewotCQkJCURpbWVuc2lvbiBkaW1lbnNpb24gPSBzdXBlci5jYWxjdWxhdGVQcmVmZXJyZWRTaXplKGNvbnRhaW5lciwgd0hpbnQsIGhIaW50KTsKLQkJCQkKLQkJCQkvLyBDYWxjdWxhdGUgdGhlIGhlaWdodAotCQkJCUl0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmdldFBhcmVudCgpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEJveENvbXBvbmVudEZpZ3VyZSkgewotCQkJCQkJZGltZW5zaW9uLmhlaWdodCA9ICgoSUZpZ3VyZSkgaXRlbSkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGRpbWVuc2lvbjsKLQkJCX0KLQkgICAgfSk7Ci0JICAgIAotCSAgICBvdXRlci5hZGQobGlua0ljb25Db2x1bW4pOwotCSAgICAKLQkgICAgLy8gcm1haDogVGhlIGJsb2NrIG9mIGNvZGUgYmVsb3cgaGFzIGJlZW4gbW92ZWQgZnJvbSByZWZyZXNoVmlzdWFscygpLiAgV2UncmUKLQkgICAgLy8gYXNzdW1pbmcgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiB0aGUgRWRpdFBhcnQgd2lsbCBuZXZlciBjaGFuZ2Ugb25jZSB0aGUKLQkgICAgLy8gRWRpdFBhcnQgaGFzIGJlZW4gY3JlYXRlZC4KLQkgICAgaWYgKGlzUmVhZE9ubHkoKSkgCi0JICAgIHsKLQkgICAgCWZpZ3VyZS5nZXRMYWJlbCgpLnNldEZvcmVncm91bmRDb2xvcihEZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMucmVhZE9ubHlMYWJlbENvbG9yKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgCWZpZ3VyZS5nZXRMYWJlbCgpLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBvdXRlcjsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIGF0dGFjaFRvSW50ZXJmYWNlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIFJvd0xheW91dCByb3dMYXlvdXQpCi0gIHsKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJbnRlcmZhY2VFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgSW50ZXJmYWNlRWRpdFBhcnQgaW50ZXJmYWNlRWRpdFBhcnQgPSAoSW50ZXJmYWNlRWRpdFBhcnQpcGFyZW50OwotICAgICAgICByb3dMYXlvdXQuc2V0Q29sdW1uRGF0YShpbnRlcmZhY2VFZGl0UGFydC5jb2x1bW5EYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICB9ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIElJbnRlcmZhY2UgdGhlSW50ZXJmYWNlID0gKElJbnRlcmZhY2UpZ2V0TW9kZWwoKTsKLSAgICByZXR1cm4gdGhlSW50ZXJmYWNlLmdldE9wZXJhdGlvbnMoKTsgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKSB7Ci0JICBzdXBlci5hZGRGZWVkYmFjaygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKSB7Ci0JICBzdXBlci5yZW1vdmVGZWVkYmFjaygpOwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0IGdldFJlbGF0aXZlRWRpdFBhcnQoaW50IGRpcmVjdGlvbikKLSAgewotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICB7Ci0gICAgICByZXR1cm4gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0U291cmNlQ29ubmVjdGlvbkVkaXRQYXJ0KHRoaXMpOyAgICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHN1cGVyLmdldFJlbGF0aXZlRWRpdFBhcnQoZGlyZWN0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIElGaWd1cmUgZ2V0TGlua0ljb25Db2x1bW4oKSB7Ci0JICByZXR1cm4gbGlua0ljb25Db2x1bW47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9NZXNzYWdlUmVmZXJlbmNlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9NZXNzYWdlUmVmZXJlbmNlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzMzlhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvTWVzc2FnZVJlZmVyZW5jZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRyYWdUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwb2xpY2llcy5BU0REcmFnQW5kRHJvcEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXMuQVNER3JhcGhOb2RlRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXMuQVNEU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmZpZ3VyZXMuTGlzdEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmZpZ3VyZXMuTW9kZWxEaWFnbm9zdGljSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmxheW91dHMuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUmVmZXJlbmNlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cyBJRmVlZGJhY2tIYW5kbGVyCi17ICAgCi0gIHByb3RlY3RlZCBGaWd1cmUgY29udGVudFBhbmU7ICAKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotICBwcm90ZWN0ZWQgUm93TGF5b3V0IHJvd0xheW91dDsKLSAgCi0gIHByaXZhdGUgRmlndXJlIG1lc3NhZ2VMYWJlbFdyYXBwZXI7Ci0gIHByaXZhdGUgTGFiZWwgbWVzc2FnZUxhYmVsOwotICAKLSAgcHJvdGVjdGVkIEFTRFNlbGVjdGlvbkVkaXRQb2xpY3kgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgQVNEU2VsZWN0aW9uRWRpdFBvbGljeSgpOwotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIExpc3RGaWd1cmUgZmlndXJlID0gbmV3IExpc3RGaWd1cmUodHJ1ZSk7Ci0gICAgZmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLSAgICBmaWd1cmUuc2V0UGFpbnRGaXJzdExpbmUoZmFsc2UpOwotICAgIGZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMudG9vbHRpcEJhY2tncm91bmQpOwotCi0gICAgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHJvd0xheW91dCk7IAotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbGFiZWwuc2V0TGFiZWxBbGlnbm1lbnQoTGFiZWwuTEVGVCk7Ci0gICAgLy9sYWJlbC5zZXRGb250KERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5tZWRpdW1Gb250KTsgCi0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMiwgMTYsIDIgLDEwKSk7Ci0gICAgZmlndXJlLmFkZChsYWJlbCk7ICAKLSAgICAKLSAgICAvKgotICAgIFJlY3RhbmdsZUZpZ3VyZSBwYXJ0c0xpc3QgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgcGFydHNMaXN0LnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpKTsKLSAgICBwYXJ0c0xpc3QuYWRkKG5ldyBMYWJlbCgicGFydHMxIikpOwotICAgIHBhcnRzTGlzdC5hZGQobmV3IExhYmVsKCJwYXJzdDIiKSk7Ci0gICAgZmlndXJlLmFkZChwYXJ0c0xpc3QpOwotICAgICovCi0gICAgY29udGVudFBhbmUgPSBuZXcgTGlzdEZpZ3VyZSgpOwotICAgIC8vY29udGVudFBhbmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgKChMaXN0RmlndXJlKWNvbnRlbnRQYW5lKS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgY29udGVudFBhbmUuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgCi0gICAgLyoKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSkKLSAgICB7Ci0gICAgICAgLy8gVE9ETyAoY3MpIGNvbnNpZGVyIG1pbm9yIHR3ZWFrIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIHJvdyBmaWxscyB1cCB0aGUgYXZhaWxhYmxlIHNwYWNlICAgICAgICAgICAgIAotICAgICAgIC8vIHZlcnRpY2FsbHkuLi4gd2l0aG91dCB0aGlzIGEgYml0IG9mIHRyaW0gaXMgdmlzaWJsZSBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0Ci0gICAgICAgLy8gd2hlbiB0aGUgcGFyYW0gbGFiZWxzIGFyZSBnaXZlbiBhIG1hcmdpbiB3aWR0aCB0b3AgYW5kIGJvdHRvbSA8ICAnNCcgCi0gICAgICAgcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgcGFyZW50KQotICAgICAgIHsKLSAgICAgICAgIHN1cGVyLmxheW91dChwYXJlbnQpOwotICAgICAgICAgaWYgKGNoaWxkcmVuLnNpemUoKSA9PSAxKQotICAgICAgICAgewotICAgICAgICAgICAgRmlndXJlIGNoaWxkID0gKEZpZ3VyZSljaGlsZHJlbi5nZXQoMCk7Ci0gICAgICAgICAgICAvL2NoaWxkLmdldEJvdW5kcygpLmhlaWdodCA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0OwotICAgICAgICAgfSAgCi0gICAgICAgfQotICAgIH07ICAgICAKLSAgICAgKi8KLSAgICB0b29sYmFyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgY29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLSAgICBmaWd1cmUuYWRkKGNvbnRlbnRQYW5lKTsKLSAgICAKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChsYWJlbCwgIk1lc3NhZ2VMYWJlbCIpOyAvLyROT04tTkxTLTEkCi0gICAgLy9yb3dMYXlvdXQuc2V0Q29uc3RyYWludChwYXJ0c0xpc3QsICJQYXJ0c0xpc3QiKTsKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChjb250ZW50UGFuZSwgIk1lc3NhZ2VDb250ZW50UGFuZSIpOyAvLyROT04tTkxTLTEkCi0gICAKLSAgICAvLyBybWFoOiBUaGUgYmxvY2sgb2YgY29kZSBiZWxvdyBoYXMgYmVlbiBtb3ZlZCBmcm9tIHJlZnJlc2hWaXN1YWxzKCkuICBXZSdyZQotICAgIC8vIGFzc3VtaW5nIHRoZSByZWFkLW9ubHkgc3RhdGUgb2YgdGhlIEVkaXRQYXJ0IHdpbGwgbmV2ZXIgY2hhbmdlIG9uY2UgdGhlCi0gICAgLy8gRWRpdFBhcnQgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICBpZiAoaXNSZWFkT25seSgpKSAKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnJlYWRPbmx5TGFiZWxDb2xvcik7Ci0gICAgICBsYWJlbC5nZXRQYXJlbnQoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnJlYWRPbmx5TWVzc2FnZVJlZkhlYWRpbmdDb2xvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgICAgbGFiZWwuZ2V0UGFyZW50KCkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnRvb2x0aXBCYWNrZ3JvdW5kKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7ICAKLQkgIGlmICghaXNSZWFkT25seSgpKSB7Ci0JCSAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwgbmV3IEFTRERyYWdBbmREcm9wRWRpdFBvbGljeShnZXRWaWV3ZXIoKSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpKTsKLQkgIH0KLQkgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsKLSAgfQotICAKLSAgcHVibGljIERyYWdUcmFja2VyIGdldERyYWdUcmFja2VyKFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiBuZXcgQVNER3JhcGhOb2RlRHJhZ1RyYWNrZXIoKEVkaXRQYXJ0KXRoaXMpOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudFBhbmU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAgIAotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgSU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZSA9IChJTWVzc2FnZVJlZmVyZW5jZSlnZXRNb2RlbCgpOyAgICAKLSAgICBsYWJlbC5zZXRUZXh0KG1lc3NhZ2UuZ2V0VGV4dCgpKTsKLSAgICBsYWJlbC5zZXRJY29uKG1lc3NhZ2UuZ2V0SW1hZ2UoKSk7IAotICAgIAotICAgIC8vIFJlc2l6ZSBjb2x1bW4gd2lkdGhzLiAgU2l6ZXMgbWF5IGhhdmUgc2hydW5rLgotICAgIHJvd0xheW91dC5nZXRDb2x1bW5EYXRhKCkuY2xlYXJDb2x1bW5XaWR0aHMoKTsKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IGdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJbnRlcmZhY2VFZGl0UGFydCkKLSAgICAgIHsgCi0gICAgICAgICgoR3JhcGhpY2FsRWRpdFBhcnQpcGFyZW50KS5nZXRGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbigpIHsKLQkgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgICAgcmVmcmVzaE1lc3NhZ2UoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE1lc3NhZ2UoKSB7Ci0JICBpZiAoZ2V0TW9kZWxDaGlsZHJlbigpLnNpemUoKSA+IDApIHsKLQkJICBpZiAobWVzc2FnZUxhYmVsV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkgIGNvbnRlbnRQYW5lLnJlbW92ZShtZXNzYWdlTGFiZWxXcmFwcGVyKTsKLQkJCSAgbWVzc2FnZUxhYmVsV3JhcHBlciA9IG51bGw7Ci0JCSAgfQotCSAgfQotCSAgZWxzZSB7Ci0JCSAgaWYgKG1lc3NhZ2VMYWJlbFdyYXBwZXIgPT0gbnVsbCkgewotCQkJICBtZXNzYWdlTGFiZWxXcmFwcGVyID0gbmV3IEZpZ3VyZSgpOwotCQkJICBtZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoKTsKLQkJCSAgCi0JCQkgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKQotCQkJICAgIHsKLQkJCQkgIC8vIFdlIHdhbnQgdG8gY2VudGVyIHRoZSB0ZXh0Ci0JCQkgICAgICAgcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgcGFyZW50KQotCQkJICAgICAgIHsKLQkJCSAgICAgICAgIHN1cGVyLmxheW91dChwYXJlbnQpOwotCi0JCQkgICAgICAgICBpZiAocGFyZW50LmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEgJiYgcGFyZW50LmdldENoaWxkcmVuKCkuZ2V0KDApIGluc3RhbmNlb2YgTGFiZWwpCi0JCQkgICAgICAgICB7Ci0JCQkgICAgICAgICAgICBwYXJlbnQuc2V0U2l6ZShwYXJlbnQuZ2V0U2l6ZSgpLndpZHRoLCBwYXJlbnQuZ2V0U2l6ZSgpLmhlaWdodCArIDMpOwotCQkJICAgICAgICAgICAgTGFiZWwgY2hpbGQgPSAoTGFiZWwpIHBhcmVudC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLQkJCSAgICAgICAgICAgIGludCBuZXdYQW1vdW50ID0gKHBhcmVudC5nZXRTaXplKCkud2lkdGggLSBjaGlsZC5nZXRTaXplKCkud2lkdGgpIC8gMjsKLQkJCSAgICAgICAgICAgIFBvaW50IHAgPSBjaGlsZC5nZXRMb2NhdGlvbigpOwotCQkJICAgICAgICAgICAgY2hpbGQuc2V0TG9jYXRpb24obmV3IFBvaW50KHAueCArIG5ld1hBbW91bnQsIHAueSArIDMpKTsKLQkJCSAgICAgICAgIH0gIAotCQkJICAgICAgIH0KLQkJCSAgICB9OyAgICAgCi0KLQkJCSAgbWVzc2FnZUxhYmVsV3JhcHBlci5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotCQkJICBtZXNzYWdlTGFiZWxXcmFwcGVyLmFkZChtZXNzYWdlTGFiZWwpOwotCQkJICBjb250ZW50UGFuZS5hZGQobWVzc2FnZUxhYmVsV3JhcHBlcik7Ci0JCSAgfQotCQkgIAotCQkgIExpc3QgZXJyb3JMaXN0ID0gZ2V0RXJyb3JzKCk7Ci0JCSAgTGlzdCB3YXJuTGlzdCA9IGdldFdhcm5pbmdzKCk7Ci0KLQkJICBpZiAoZXJyb3JMaXN0LnNpemUoKSA+IDApIHsKLQkJCSAgTW9kZWxEaWFnbm9zdGljSW5mbyBpbmZvID0gKE1vZGVsRGlhZ25vc3RpY0luZm8pIGVycm9yTGlzdC5nZXQoMCk7Ci0JCQkgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KCIgICIgKyBpbmZvLmdldERlc2NyaXB0aW9uVGV4dCgpICsgIiAgIik7IAotCQkJICBtZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGluZm8uZ2V0RGVzY3JpcHRpb25UZXh0Q29sb3IoKSk7Ci0JCSAgfQotCQkgIGVsc2UgaWYgKHdhcm5MaXN0LnNpemUoKSA+IDApewotCQkJICBNb2RlbERpYWdub3N0aWNJbmZvIGluZm8gPSAoTW9kZWxEaWFnbm9zdGljSW5mbykgd2Fybkxpc3QuZ2V0KDApOwotCQkJICBtZXNzYWdlTGFiZWwuc2V0VGV4dCgiICAiICsgaW5mby5nZXREZXNjcmlwdGlvblRleHQoKSArICIgICIpOyAKLQkJCSAgbWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmRDb2xvcihpbmZvLmdldERlc2NyaXB0aW9uVGV4dENvbG9yKCkpOwotCQkgIH0KLQkJICBlbHNlIHsKLQkJCSAgbWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOwotCQkJICBtZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJICB9Ci0JICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldEVycm9ycygpIHsKLQkgIC8vIFRPRE86IHJtYWg6IFdlIHNob3VsZCBub3Qga25vdyBhYm91dCBXMTFNZXNzYWdlUmVmZXJlbmNlIGhlcmUuICBNb2RpZnkKLQkgIC8vIE1lc3NhZ2VSZWZlcmVuY2UgcG9zdCBXVFAgMS41IHRvIGluY2x1ZGUgdGhlIGdldERpYWdub3N0aWNNZXNzYWdlcygpIG1ldGhvZC4KLQkgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgVzExTWVzc2FnZVJlZmVyZW5jZSkgewotCQkgIFcxMU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZiA9IChXMTFNZXNzYWdlUmVmZXJlbmNlKSBnZXRNb2RlbCgpOwotCQkgIHJldHVybiBnZXREaWFnbm9zdGljTWVzc2FnZVR5cGUobWVzc2FnZVJlZi5nZXREaWFnbm9zdGljTWVzc2FnZXMoKSwgTW9kZWxEaWFnbm9zdGljSW5mby5FUlJPUl9UWVBFKTsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JICAvLyBUT0RPOiBybWFoOiBXZSBzaG91bGQgbm90IGtub3cgYWJvdXQgVzExTWVzc2FnZVJlZmVyZW5jZSBoZXJlLiAgTW9kaWZ5Ci0JICAvLyBNZXNzYWdlUmVmZXJlbmNlIHBvc3QgV1RQIDEuNSB0byBpbmNsdWRlIHRoZSBnZXREaWFnbm9zdGljTWVzc2FnZXMoKSBtZXRob2QuCi0JICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFcxMU1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkJICBXMTFNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYgPSAoVzExTWVzc2FnZVJlZmVyZW5jZSkgZ2V0TW9kZWwoKTsKLQkJICByZXR1cm4gZ2V0RGlhZ25vc3RpY01lc3NhZ2VUeXBlKG1lc3NhZ2VSZWYuZ2V0RGlhZ25vc3RpY01lc3NhZ2VzKCksIE1vZGVsRGlhZ25vc3RpY0luZm8uV0FSTklOR19UWVBFKTsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0RGlhZ25vc3RpY01lc3NhZ2VUeXBlKExpc3QgZGlhZ25vc3RpY0luZm8sIGludCB0eXBlKSB7Ci0JICBMaXN0IGxpc3RUeXBlID0gbmV3IEFycmF5TGlzdCgpOwotCSAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRpYWdub3N0aWNJbmZvLnNpemUoKTsgaW5kZXgrKykgewotCQkgIE1vZGVsRGlhZ25vc3RpY0luZm8gaW5mbyA9IChNb2RlbERpYWdub3N0aWNJbmZvKSBkaWFnbm9zdGljSW5mby5nZXQoaW5kZXgpOwotCQkgIGlmIChpbmZvLmdldFR5cGUoKSA9PSB0eXBlKSB7Ci0JCQkgIGxpc3RUeXBlLmFkZChpbmZvKTsKLQkJICB9Ci0JICB9Ci0JICAKLQkgIHJldHVybiBsaXN0VHlwZTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgSU1lc3NhZ2VSZWZlcmVuY2UgdGhlTWVzc2FnZSA9IChJTWVzc2FnZVJlZmVyZW5jZSlnZXRNb2RlbCgpOwotICAgIHJldHVybiB0aGVNZXNzYWdlLmdldFBhcmFtZXRlcnMoKTsgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE5vdGlmeSgpCi0gIHsKLSAgICBJbnRlcmZhY2VFZGl0UGFydC5hdHRhY2hUb0ludGVyZmFjZUVkaXRQYXJ0KHRoaXMsIHJvd0xheW91dCk7Ci0gICAgc3VwZXIuYWRkTm90aWZ5KCk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpIHsKLQkgIGxhYmVsLmdldFBhcmVudCgpLnNldEJhY2tncm91bmRDb2xvcihEZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMudGFibGVDZWxsU2VsZWN0aW9uQ29sb3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKSB7Ci0JICBpZiAoaXNSZWFkT25seSgpKSB7Ci0JICAgIGxhYmVsLmdldFBhcmVudCgpLnNldEJhY2tncm91bmRDb2xvcihEZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMucmVhZE9ubHlNZXNzYWdlUmVmSGVhZGluZ0NvbG9yKTsKLQkgIH0KLQkgIGVsc2UgewotCQkgIGxhYmVsLmdldFBhcmVudCgpLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy50b29sdGlwQmFja2dyb3VuZCk7Ci0JICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBnZXRSZWxhdGl2ZUVkaXRQYXJ0KGludCBkaXJlY3Rpb24pCi0gIHsgIAotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gc3VwZXIuZ2V0UmVsYXRpdmVFZGl0UGFydChkaXJlY3Rpb24pOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEggJiYgZWRpdFBhcnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldE5leHRJbnRlcmZhY2UodGhpcyk7Ci0gICAgfSAgICAgICAgCi0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL09wZXJhdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvT3BlcmF0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzNzQ0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvT3BlcmF0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbENlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBvbGljaWVzLkFTRExhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwb2xpY2llcy5BU0RTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlcy5MaXN0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cyBJTmFtZWRFZGl0UGFydAoteyAKLSAgcHJvdGVjdGVkIEZpZ3VyZSBjb250ZW50UGFuZTsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotICBwcml2YXRlIENvbG9yIHVuc2VsZWN0ZWRDb2xvcjsKLSAgcHJpdmF0ZSBGaWd1cmUgbGFiZWxIb2xkZXI7Ci0gIAotICBwdWJsaWMgT3BlcmF0aW9uRWRpdFBhcnQoKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy50YWJsZU9wZXJhdGlvbkhlYWRpbmdDb2xvcik7Ci0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOyAgIAotICAgIHRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsgICAKLSAgICB0b29sYmFyTGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KFRvb2xiYXJMYXlvdXQuQUxJR05fVE9QTEVGVCk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0gICAgCi0gICAgbGFiZWxIb2xkZXIgPSBuZXcgUGFuZWwoKTsKLSAgICBsYWJlbEhvbGRlci5zZXRCYWNrZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnRhYmxlT3BlcmF0aW9uSGVhZGluZ0NvbG9yKTsKLSAgICBsYWJlbEhvbGRlci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KHRydWUpKTsKLSAgICBmaWd1cmUuYWRkKGxhYmVsSG9sZGVyKTsKLSAgICAKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgiT3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLS8vICAgIGxhYmVsLnNldEZvbnQoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnNtYWxsQm9sZEZvbnQpOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIsIDIsMiwyKSk7Ci0gICAgbGFiZWwuc2V0VGV4dEFsaWdubWVudChMYWJlbC5MRUZUKTsgIAotICAgIGxhYmVsSG9sZGVyLmFkZChsYWJlbCk7Ci0gICAgCi0gICAgCi0gICAgY29udGVudFBhbmUgPSBuZXcgTGlzdEZpZ3VyZSgpOyAgCi0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0MiA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICB0b29sYmFyTGF5b3V0Mi5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGNvbnRlbnRQYW5lLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dDIpOwotICAgIGZpZ3VyZS5hZGQoY29udGVudFBhbmUpOwotIAotICAgIC8vIHJtYWg6IFRoZSBibG9jayBvZiBjb2RlIGJlbG93IGhhcyBiZWVuIG1vdmVkIGZyb20gcmVmcmVzaFZpc3VhbHMoKS4gIFdlJ3JlCi0gICAgLy8gYXNzdW1pbmcgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiB0aGUgRWRpdFBhcnQgd2lsbCBuZXZlciBjaGFuZ2Ugb25jZSB0aGUKLSAgICAvLyBFZGl0UGFydCBoYXMgYmVlbiBjcmVhdGVkLgotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAJbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5yZWFkT25seUxhYmVsQ29sb3IpOwotICAgCSAgICBmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5yZWFkT25seVRhYmxlT3BlcmF0aW9uSGVhZGluZ0NvbG9yKTsKLSAgIAkgICAgbGFiZWxIb2xkZXIuc2V0QmFja2dyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5yZWFkT25seVRhYmxlT3BlcmF0aW9uSGVhZGluZ0NvbG9yKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCWxhYmVsLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gCSAgICBmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy50YWJsZU9wZXJhdGlvbkhlYWRpbmdDb2xvcik7Ci0gICAJICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihEZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMudGFibGVPcGVyYXRpb25IZWFkaW5nQ29sb3IpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgbmV3IEFTRExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBU0RTZWxlY3Rpb25FZGl0UG9saWN5KCkpOwotICB9Ci0gIAotICBwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKXsKLQkgIFJlY3RhbmdsZSB0ZXh0QXJlYSA9IGdldExhYmVsRmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JICB0ZXh0QXJlYS53aWR0aCA9IGdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCSAgaWYgKGN1cnNvckxvY2F0aW9uID09IG51bGwgfHwgaGl0VGVzdCh0ZXh0QXJlYSwgY3Vyc29yTG9jYXRpb24pICYmICFpc1JlYWRPbmx5KCkpIHsKLQkJICBtYW5hZ2VyID0gbmV3IExhYmVsRWRpdE1hbmFnZXIodGhpcywgbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IodGhpcywgY3Vyc29yTG9jYXRpb24pKTsKLQkJICBtYW5hZ2VyLnNob3coKTsKLQkgIH0KLSAgICBlbHNlIGlmIChnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIEZpZ3VyZSAmJiBoaXRUZXN0RmlndXJlKChGaWd1cmUpIGdldEZpZ3VyZSgpLCBjdXJzb3JMb2NhdGlvbikgJiYgaXNSZWFkT25seSgpKSB7Ci0gICAgICBkb09wZW5OZXdFZGl0b3IoKTsgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCSAgaWYgKHJlcS5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUKSkgewotCQkgIHBlcmZvcm1EaXJlY3RFZGl0KG51bGwpOwotCSAgfQotICB9Ci0gIAotICBwdWJsaWMgTGFiZWwgZ2V0TGFiZWxGaWd1cmUoKSB7Ci0JICByZXR1cm4gbGFiZWw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAgIAotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgSU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoSU9wZXJhdGlvbilnZXRNb2RlbCgpOwotICAgIGxhYmVsLnNldFRleHQob3BlcmF0aW9uLmdldE5hbWUoKSk7Ly8gKyAiLS0tIiArIGdldE1vZGVsKCkpOwotICAgIGxhYmVsLnNldEljb24ob3BlcmF0aW9uLmdldEltYWdlKCkpOwotICAgIAotCi0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UGFuZTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgSU9wZXJhdGlvbiB0aGVPcGVyYXRpb24gPSAoSU9wZXJhdGlvbilnZXRNb2RlbCgpOwotICAgIHJldHVybiB0aGVPcGVyYXRpb24uZ2V0TWVzc2FnZXMoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKSB7Ci0JICB1bnNlbGVjdGVkQ29sb3IgPSBsYWJlbEhvbGRlci5nZXRCYWNrZ3JvdW5kQ29sb3IoKTsKLS8vCSAgZ2V0RmlndXJlKCkuc2V0QmFja2dyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy50YWJsZUNlbGxTZWxlY3Rpb25Db2xvcik7Ci0JICBsYWJlbEhvbGRlci5zZXRCYWNrZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnRhYmxlQ2VsbFNlbGVjdGlvbkNvbG9yKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKSB7Ci0JICBpZiAodW5zZWxlY3RlZENvbG9yICE9IG51bGwpIHsKLQkJICBsYWJlbEhvbGRlci5zZXRCYWNrZ3JvdW5kQ29sb3IodW5zZWxlY3RlZENvbG9yKTsKLQkgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIHRvIGJlIHJlbW92ZWQgcG9zdCBXVFAgMS41Ci0gICAqLwotICBwcm90ZWN0ZWQgTGFiZWwgcHJldmlld0xhYmVsOwotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIHRvIGJlIHJlbW92ZWQgcG9zdCBXVFAgMS41Ci0gICAqLyAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlcmF0aW9uUHJldmlldygpIAotICB7Ci0gICAgcmV0dXJuICJkZXByZWNhdGVkIjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9QYXJhbWV0ZXJFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL1BhcmFtZXRlckVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNmJmZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL1BhcmFtZXRlckVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5EZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5kaXJlY3RlZGl0LkxhYmVsQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5kaXJlY3RlZGl0LkxhYmVsRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXMuQVNERHJhZ0FuZERyb3BFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBvbGljaWVzLkFTREdyYXBoTm9kZURyYWdUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBvbGljaWVzLkFTRExhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwb2xpY2llcy5BU0RTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24ubGF5b3V0cy5Sb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JUGFyYW1ldGVyOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cyBJRmVlZGJhY2tIYW5kbGVyLCBJTmFtZWRFZGl0UGFydAoteyAgIAotICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgTGFiZWwgcGFyYW1ldGVyTmFtZTsKLSAgcHJvdGVjdGVkIFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0gIHByb3RlY3RlZCBJbWFnZSBsYWJlbEltYWdlOwotICAKLSAgcHJvdGVjdGVkIEFTRFNlbGVjdGlvbkVkaXRQb2xpY3kgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgQVNEU2VsZWN0aW9uRWRpdFBvbGljeSgpOwotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBJRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICAgICAgewotICAgICAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgICAgICAvLyB0aGlzIGJpdCBvZiBjb2RlIGlzIHVzZWQgdG8gZHJhdyB0aGUgZGl2aWRpbmcgbGluZSBiZXR3ZWVuCi0gICAgICAgIC8vIHRoZSBwYXJhbWV0ZXIgbmFtZSBhbmQgdGhlIHBhcmFtZXRlciB0eXBlCi0gICAgICAgIC8vIHdlIG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgbW92aW5nIHRoaXMgbGluZSBkcmF3aW5nIGludG8gdGhlIAotICAgICAgICAvLyBtZXNzYWdlIHJlZmVyZW5jZSdzIGZpZ3VyZSB3aGVyZSB0aGUgaG9yaXpvbnRhbCBsaW5lcyBhcmUgZG93bidzCi0gICAgICAgIFJlY3RhbmdsZSByID0gcGFyYW1ldGVyTmFtZS5nZXRCb3VuZHMoKTsKLSAgICAgICAgaW50IHg9IHIueCArICByLndpZHRoIC0xOwotICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoeCwgci55LCB4LCByLnkgKyByLmhlaWdodCk7Ci0gICAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgICB9Ci0gICAgfTsgICAgICAgIAotICAgIC8vdG9vbGJhckxheW91dC5zZXRNaW5vckFsaWdubWVudChUb29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0gICAgZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIocm93TGF5b3V0KTsgCi0gICAgLyoKLSAgICBTdHJpbmcgeCA9ICIiOwotICAgIGludCBzaXplID0gKGludCkoTWF0aC5yYW5kb20oKSo1MCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgeCArPSAieCI7Ci0gICAgfSAgCi0gICAgU3RyaW5nIHkgPSAiIjsKLSAgICBpbnQgc2l6ZXkgPSAoaW50KShNYXRoLnJhbmRvbSgpKjUwKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemV5OyBpKyspCi0gICAgewotICAgICAgeSArPSAieSI7Ci0gICAgfSAqLwotICAgIAotICAgIGNvbnRlbnRQYW5lID0gbmV3IEZpZ3VyZSgpOwotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dDIgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgdG9vbGJhckxheW91dDIuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsgICAKLSAgICBjb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQyKTsKLQotICAgIElGaWd1cmUgcGFyYW1ldGVyTmFtZVBhbmUgPSBuZXcgUGFuZWwoKTsKLSAgICB0b29sYmFyTGF5b3V0MiA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsgIAotICAgIHRvb2xiYXJMYXlvdXQyLnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7ICAgCi0gICAgcGFyYW1ldGVyTmFtZVBhbmUuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0Mik7Ci0gICAgCi0gICAgcGFyYW1ldGVyTmFtZSA9IG5ldyBMYWJlbCgpOwotICAgIHBhcmFtZXRlck5hbWUuc2V0TGFiZWxBbGlnbm1lbnQoTGFiZWwuTEVGVCk7Ci0gICAgcGFyYW1ldGVyTmFtZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig0LDEwLDQsMTApKTsKLSAgICAKLSAgICBwYXJhbWV0ZXJOYW1lUGFuZS5hZGQocGFyYW1ldGVyTmFtZSk7Ci0gICAgZmlndXJlLmFkZChwYXJhbWV0ZXJOYW1lUGFuZSk7Ci0gICAgZmlndXJlLmFkZChjb250ZW50UGFuZSk7Ci0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQocGFyYW1ldGVyTmFtZVBhbmUsICJwYXJhbWV0ZXJOYW1lIik7IC8vJE5PTi1OTFMtMSQKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChjb250ZW50UGFuZSwgInBhcmFtZXRlclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIGxhYmVsSW1hZ2UgPSAoKElQYXJhbWV0ZXIpIGdldE1vZGVsKCkpLmdldEltYWdlKCk7Ci0gICAgCi0gICAgLy8gcm1haDogVGhlIGJsb2NrIG9mIGNvZGUgYmVsb3cgaGFzIGJlZW4gbW92ZWQgZnJvbSByZWZyZXNoVmlzdWFscygpLiAgV2UncmUKLSAgICAvLyBhc3N1bWluZyB0aGUgcmVhZC1vbmx5IHN0YXRlIG9mIHRoZSBFZGl0UGFydCB3aWxsIG5ldmVyIGNoYW5nZSBvbmNlIHRoZQotICAgIC8vIEVkaXRQYXJ0IGhhcyBiZWVuIGNyZWF0ZWQuCi0gICAgaWYgKGlzUmVhZE9ubHkoKSkgCi0gICAgewotICAgICAgcGFyYW1ldGVyTmFtZS5zZXRGb3JlZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnJlYWRPbmx5TGFiZWxDb2xvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwYXJhbWV0ZXJOYW1lLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZE5vdGlmeSgpCi0gIHsKLSAgICBJbnRlcmZhY2VFZGl0UGFydC5hdHRhY2hUb0ludGVyZmFjZUVkaXRQYXJ0KHRoaXMsIHJvd0xheW91dCk7Ci0gICAgc3VwZXIuYWRkTm90aWZ5KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLSAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKXsKLQkgIGlmICghaXNSZWFkT25seSgpICYmIChjdXJzb3JMb2NhdGlvbiA9PSBudWxsIHx8IGhpdFRlc3QoZ2V0TGFiZWxGaWd1cmUoKS5nZXRCb3VuZHMoKSwgY3Vyc29yTG9jYXRpb24pKSkgewotCQltYW5hZ2VyID0gbmV3IExhYmVsRWRpdE1hbmFnZXIodGhpcywgbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IodGhpcywgY3Vyc29yTG9jYXRpb24pKTsKLQkJbWFuYWdlci5zaG93KCk7Ci0JICB9Ci0gICAgZWxzZSBpZiAoZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBGaWd1cmUgJiYgaGl0VGVzdEZpZ3VyZSgoRmlndXJlKSBnZXRGaWd1cmUoKSwgY3Vyc29yTG9jYXRpb24pICYmIGlzUmVhZE9ubHkoKSkgewotICAgICAgZG9PcGVuTmV3RWRpdG9yKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCSAgaWYgKHJlcS5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUKSkgewotCQkgIHBlcmZvcm1EaXJlY3RFZGl0KG51bGwpOwotCSAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgbmV3IEFTRExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkgIGlmICghaXNSZWFkT25seSgpKSB7Ci0JCSAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwgbmV3IEFTRERyYWdBbmREcm9wRWRpdFBvbGljeShnZXRWaWV3ZXIoKSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpKTsKLQkgIH0KLQkgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsKLSAgfQotICAKLSAgcHVibGljIERyYWdUcmFja2VyIGdldERyYWdUcmFja2VyKFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiBuZXcgQVNER3JhcGhOb2RlRHJhZ1RyYWNrZXIoKEVkaXRQYXJ0KXRoaXMpOwotICB9Ci0gIAotICBwdWJsaWMgTGFiZWwgZ2V0TGFiZWxGaWd1cmUoKSB7Ci0JICByZXR1cm4gcGFyYW1ldGVyTmFtZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7ICAgCi0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBJUGFyYW1ldGVyIHBhcmFtZXRlciA9IChJUGFyYW1ldGVyKWdldE1vZGVsKCk7Ci0gICAgcGFyYW1ldGVyTmFtZS5zZXRUZXh0KHBhcmFtZXRlci5nZXROYW1lKCkpOwotICAgIGlmIChsYWJlbEltYWdlICE9IG51bGwpIHsKLSAgICAJcGFyYW1ldGVyTmFtZS5zZXRJY29uKGxhYmVsSW1hZ2UpOwotICAgIH0KLSAgICAKLSAgICAvLyBSZXNpemUgY29sdW1uIHdpZHRocy4gIFNpemVzIG1heSBoYXZlIHNocnVuay4KLSAgICByb3dMYXlvdXQuZ2V0Q29sdW1uRGF0YSgpLmNsZWFyQ29sdW1uV2lkdGhzKCk7Ci0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSW50ZXJmYWNlRWRpdFBhcnQpCi0gICAgICB7IAotICAgICAgICAoKEdyYXBoaWNhbEVkaXRQYXJ0KXBhcmVudCkuZ2V0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotCSAgLy8gT24gdGhlIGZhY2FkZSBsZXZlbCwgb25lIElQYXJhbWV0ZXIgd2lsbCBoYXZlIHR3byBlZGl0YWJsZSB2YWx1ZXMuCi0JICAvLyBBIG5hbWUgYW5kIGEgdHlwZSByZWZlcmVuY2UuICBUbyBtYWtlIGRpcmVjdCBlZGl0aW5nIGFuZCBzZWxlY3Rpb24KLQkgIC8vIGZlZWRiYWNrIGVhc2llciwgd2Ugc2hvdyB0aGlzIG9uZSBmYWNhZGUgb2JqZWN0IGFzIHR3byBlZGl0IHBhcnRzLgotCSAgLy8gVGhlIGFwcHJvYWNoIGlzIHRvIHRoZSBzYW1lIGZhY2FkZSBtb2RlbCwgdG8gZHJpdmUgdGhlIHNlY29uZCAoY2hpbGQKLQkgIC8vIEVkaXRQYXJ0LgotCi0gICAgICAvLyBUT0RPIChjcykgUmljaCBjb25zaWRlciBjcmVhdGluZyAyIGhhcmQgY29kZSBlZGl0IHBhcnRzCi0gICAgICAvLyB0aGUgZmlyc3QgZm9yIHRoZSBwYXJhbWV0ZXIgbmFtZQotICAgICAgLy8gdGhlIHNlY29uZCBmb3IgdGhlIHBhcmFtdGVyIHR5cGUKLQkgIExpc3Qga2lkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIGtpZHMuYWRkKGdldE1vZGVsKCkpOwotCSAgcmV0dXJuIGtpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UGFuZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKSB7CQotCSAgcGFyYW1ldGVyTmFtZS5nZXRQYXJlbnQoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnRhYmxlQ2VsbFNlbGVjdGlvbkNvbG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkgewotICAgICAgcGFyYW1ldGVyTmFtZS5nZXRQYXJlbnQoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoZmlndXJlLmdldEJhY2tncm91bmRDb2xvcigpKTsKLSAgfQotICAKLSAgcHVibGljIEVkaXRQYXJ0IGdldFJlbGF0aXZlRWRpdFBhcnQoaW50IGRpcmVjdGlvbikKLSAgeyAgCi0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBzdXBlci5nZXRSZWxhdGl2ZUVkaXRQYXJ0KGRpcmVjdGlvbik7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCAmJiBlZGl0UGFydCA9PSBudWxsKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0TmV4dEludGVyZmFjZSh0aGlzKTsgICAgICAgICAgIAotICAgIH0gICAgICAgCi0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvUGFyYW1ldGVyVHlwZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvUGFyYW1ldGVyVHlwZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZWMxODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL1BhcmFtZXRlclR5cGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBhbmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExUGFyYW1ldGVyRm9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmRpcmVjdGVkaXQuVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBvbGljaWVzLkFTRFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5maWd1cmVzLkJhc2VMaW5rSWNvbkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmZpZ3VyZXMuTW9kZWxEaWFnbm9zdGljSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmxheW91dHMuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QudXRpbC5JT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuVzExT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlTW90aW9uTGlzdGVuZXIuU3R1YjsKLQotcHVibGljIGNsYXNzIFBhcmFtZXRlclR5cGVFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElGZWVkYmFja0hhbmRsZXIsIElOYW1lZEVkaXRQYXJ0Ci17ICAgCi0JcHJvdGVjdGVkIFNpbXBsZURpcmVjdEVkaXRQb2xpY3kgc2ltcGxlRGlyZWN0RWRpdFBvbGljeSA9IG5ldyBTaW1wbGVEaXJlY3RFZGl0UG9saWN5KCk7Ci0JcHJvdGVjdGVkIExhYmVsIHBhcmFtZXRlclR5cGU7Ci0JcHJvdGVjdGVkIFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0KLQkgIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0JCSAgaWYgKHJlcS5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUKSkgewotCQkJICBwZXJmb3JtRGlyZWN0RWRpdChudWxsKTsKLQkJICB9Ci0JICB9Ci0JICAKLQlwcm90ZWN0ZWQgTXlNb3VzZUV2ZW50TGlzdGVuZXIgbW91c2VFdmVudExpc3RlbmVyOwotCXByaXZhdGUgQmFzZUxpbmtJY29uRmlndXJlIGxpbmtJY29uRmlndXJlOwotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLQl7Ci0JCUlGaWd1cmUgZmlndXJlID0gbmV3IFBhbmVsKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHJvd0xheW91dCk7IAotCi0JCXBhcmFtZXRlclR5cGUgPSBuZXcgTGFiZWwoKTsKLQkJcGFyYW1ldGVyVHlwZS5zZXRMYWJlbEFsaWdubWVudChMYWJlbC5MRUZUKTsKLQkJcGFyYW1ldGVyVHlwZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig0LDEyLDQsMjApKTsKLQkJZmlndXJlLmFkZChwYXJhbWV0ZXJUeXBlKTsKLQotCQkvLyBybWFoOiBUaGUgYmxvY2sgb2YgY29kZSBiZWxvdyBoYXMgYmVlbiBtb3ZlZCBmcm9tIHJlZnJlc2hWaXN1YWxzKCkuICBXZSdyZQotCQkvLyBhc3N1bWluZyB0aGUgcmVhZC1vbmx5IHN0YXRlIG9mIHRoZSBFZGl0UGFydCB3aWxsIG5ldmVyIGNoYW5nZSBvbmNlIHRoZQotCQkvLyBFZGl0UGFydCBoYXMgYmVlbiBjcmVhdGVkLgotCQlpZiAoaXNSZWFkT25seSgpKSAKLQkJewotCQkJcGFyYW1ldGVyVHlwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoRGVzaWduVmlld0dyYXBoaWNzQ29uc3RhbnRzLnJlYWRPbmx5TGFiZWxDb2xvcik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwYXJhbWV0ZXJUeXBlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCX0KLQotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLQl7ICAgCi0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCUlQYXJhbWV0ZXIgcGFyYW0gPSAoSVBhcmFtZXRlcikgZ2V0TW9kZWwoKTsKLQkJU3RyaW5nIG5hbWUgPSBwYXJhbS5nZXRDb21wb25lbnROYW1lKCk7Ci0JCXBhcmFtZXRlclR5cGUuc2V0VGV4dChuYW1lKTsKLQotCi0JCS8vIFRPRE8gKGNzKSB0aGlzIGV2aWwgYml0IG9mIGNvZGUgbmVlZHMgdG8gYmUgZml4ZWQgcG9zdCBXVFAgMS41IHdoZW4gd2UgaGF2ZSBtb3JlIGZyZWVkb20gdG8gCi0JCS8vIGNsZWFuIHVwIG91ciBpbnRlcm5hbCBjb2RlIHN0cnVjdHVyZS4gIFdlIHNob3VsZG4ndCBoYXZlIGhhcmRjb2RlZCBhZGFwdGVyIHJlZmVyZW5jZXMgaGVyZSEKLQkJaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBXMTFQYXJhbWV0ZXJGb3JQYXJ0KQotCQl7Ci0JCQlJbWFnZSBpbWFnZSA9ICgoVzExUGFyYW1ldGVyRm9yUGFydClnZXRNb2RlbCgpKS5nZXRTZWNvbmRhcnlJbWFnZSgpOwotCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQl7Ci0JCQkJcGFyYW1ldGVyVHlwZS5zZXRJY29uKGltYWdlKTsKLQkJCX0KLQotCQkJcGFyYW1ldGVyVHlwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0JCQlMaXN0IGRpYWdub3N0aWNNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQkvLyBUT0RPOiBybWFoOiBXZSBzaG91bGQgbm90IGtub3cgYWJvdXQgVzExUGFyYW1ldGVyRm9yUGFydCBoZXJlLiAgTW9kaWZ5Ci0JCQkvLyBJUGFyYW1ldGVyIHBvc3QgV1RQIDEuNSB0byBpbmNsdWRlIHRoZSBnZXREaWFnbm9zdGljTWVzc2FnZXMoKSBtZXRob2QuCi0JCQlpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFcxMVBhcmFtZXRlckZvclBhcnQpIHsKLQkJCQlXMTFQYXJhbWV0ZXJGb3JQYXJ0IHBhcmFtRm9yUGFydCA9IChXMTFQYXJhbWV0ZXJGb3JQYXJ0KSBnZXRNb2RlbCgpOwotCQkJCWRpYWdub3N0aWNNZXNzYWdlcyA9IHBhcmFtRm9yUGFydC5nZXREaWFnbm9zdGljTWVzc2FnZXMoKTsKLQkJCX0KLQotCQkJSXRlcmF0b3IgaXQgPSBkaWFnbm9zdGljTWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJCU1vZGVsRGlhZ25vc3RpY0luZm8gZXJyb3JJbmZvID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgZXJyb3JJbmZvID09IG51bGwpIHsKLQkJCQlNb2RlbERpYWdub3N0aWNJbmZvIHRlbXAgPSAoTW9kZWxEaWFnbm9zdGljSW5mbykgaXQubmV4dCgpOwotCQkJCWlmICh0ZW1wLmdldFR5cGUoKSA9PSBNb2RlbERpYWdub3N0aWNJbmZvLkVSUk9SX1RZUEUpIHsKLQkJCQkJZXJyb3JJbmZvID0gdGVtcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZXJyb3JJbmZvICE9IG51bGwpIHsKLQkJCQlwYXJhbWV0ZXJUeXBlLnNldFRleHQoZXJyb3JJbmZvLmdldERlc2NyaXB0aW9uVGV4dCgpKTsKLQkJCQlwYXJhbWV0ZXJUeXBlLnNldEZvcmVncm91bmRDb2xvcihlcnJvckluZm8uZ2V0RGVzY3JpcHRpb25UZXh0Q29sb3IoKSk7Ci0JCQkJcGFyYW1ldGVyVHlwZS5zZXRJY29uKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJLy8gRm9yY2UgdGhlIExpbmtJY29uQ29sdW1uIHRvIHJlc2l6ZSBhbmQgcmVsYXlvdXQgaXRzZWxmLgotCQlpZiAoZ2V0SW50ZXJmYWNlRWRpdFBhcnQoKSAhPSBudWxsKSB7Ci0JCQkoKEZpZ3VyZSkgZ2V0SW50ZXJmYWNlRWRpdFBhcnQoKS5nZXRMaW5rSWNvbkNvbHVtbigpKS5pbnZhbGlkYXRlKCk7Ci0JCQlyZWZyZXNoTGlua0ZpZ3VyZShuZXcgUG9pbnQoLTEsIC0xKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEludGVyZmFjZUVkaXRQYXJ0IGdldEludGVyZmFjZUVkaXRQYXJ0KCkgewotCQlFZGl0UGFydCBlcCA9IGdldFBhcmVudCgpOwotCQl3aGlsZSAoZXAgIT0gbnVsbCAmJiAhKGVwIGluc3RhbmNlb2YgSW50ZXJmYWNlRWRpdFBhcnQpKSB7Ci0JCQllcCA9IGVwLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJaWYgKGVwIGluc3RhbmNlb2YgSW50ZXJmYWNlRWRpdFBhcnQpIHsKLQkJCXJldHVybiAoSW50ZXJmYWNlRWRpdFBhcnQpIGVwOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKSB7CSAJCSAgICAgICAgICAKLQkJZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihEZXNpZ25WaWV3R3JhcGhpY3NDb25zdGFudHMudGFibGVDZWxsU2VsZWN0aW9uQ29sb3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkgewotCQlmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKGZpZ3VyZS5nZXRQYXJlbnQoKS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JfQotCi0JcHVibGljIExhYmVsIGdldExhYmVsRmlndXJlKCkgewotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotCXsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBU0RTZWxlY3Rpb25FZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKSB7Ci0JCWlmIChjdXJzb3JMb2NhdGlvbiA9PSBudWxsIHx8IChoaXRUZXN0KHBhcmFtZXRlclR5cGUsIGN1cnNvckxvY2F0aW9uKSAmJiAhaXNSZWFkT25seSgpKSkgeyAKLQkJCUlQYXJhbWV0ZXIgcGFyYW0gPSAoSVBhcmFtZXRlcikgZ2V0TW9kZWwoKTsKLQotCQkJVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyKHBhcmFtLCB0aGlzLCBwYXJhbWV0ZXJUeXBlKTsgICAKLQkJCXNpbXBsZURpcmVjdEVkaXRQb2xpY3kuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0JCQltYW5hZ2VyLnNob3coKTsKLQotCi0JCX0KLQkJZWxzZSBpZiAocGFyYW1ldGVyVHlwZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEZpZ3VyZSAmJgotCQkJCSBoaXRUZXN0RmlndXJlKChGaWd1cmUpIHBhcmFtZXRlclR5cGUuZ2V0UGFyZW50KCksIGN1cnNvckxvY2F0aW9uKSAmJiBpc1JlYWRPbmx5KCkpIHsKLQkJCWRvT3Blbk5ld0VkaXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0KLQkJSUZpZ3VyZSBwcmltYXJ5TGF5ZXIgPSBnZXRMYXllcihMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJbW91c2VFdmVudExpc3RlbmVyID0gbmV3IE15TW91c2VFdmVudExpc3RlbmVyKCk7Ci0JCXByaW1hcnlMYXllci5hZGRNb3VzZU1vdGlvbkxpc3RlbmVyKG1vdXNlRXZlbnRMaXN0ZW5lcik7Ci0JCXByaW1hcnlMYXllci5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlRXZlbnRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJaWYgKG1vdXNlRXZlbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJRmlndXJlIHByaW1hcnlMYXllciA9IGdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQkJcHJpbWFyeUxheWVyLnJlbW92ZU1vdXNlTW90aW9uTGlzdGVuZXIobW91c2VFdmVudExpc3RlbmVyKTsKLQkJCXByaW1hcnlMYXllci5yZW1vdmVNb3VzZUxpc3RlbmVyKG1vdXNlRXZlbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQlJbnRlcmZhY2VFZGl0UGFydCBlcCA9IGdldEludGVyZmFjZUVkaXRQYXJ0KCk7Ci0JCWlmIChlcCAhPSBudWxsICYmIGxpbmtJY29uRmlndXJlICE9IG51bGwpIHsKLQkJCUlGaWd1cmUgZmlnID0gZXAuZ2V0TGlua0ljb25Db2x1bW4oKTsKLQkJCWlmIChmaWcuZ2V0Q2hpbGRyZW4oKS5jb250YWlucyhsaW5rSWNvbkZpZ3VyZSkpIHsKLQkJCQllcC5nZXRMaW5rSWNvbkNvbHVtbigpLnJlbW92ZShsaW5rSWNvbkZpZ3VyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBleHRlbmRzIERpcmVjdEVkaXRQb2xpY3kgCi0JewotCQlwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIGRlbGVnYXRlOwotCi0JCXB1YmxpYyB2b2lkIHNldERlbGVnYXRlKFR5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBkZWxlZ2F0ZSkKLQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJfQotCi0JCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChmaW5hbCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSAKLQkJeyAKLQkJCXJldHVybiBuZXcgQ29tbWFuZCgpIC8vQWJzdHJhY3RDb21tYW5kKCkKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkKLQkJCQl7ICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCWRlbGVnYXRlLnBlcmZvcm1FZGl0KHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpKTsKLQkJCQkJfSAgCi0JCQkJfSAgICAgCi0KLQkJCQlwdWJsaWMgdm9pZCByZWRvKCkKLQkJCQl7Ci0JCQkJfSAgCi0KLQkJCQlwdWJsaWMgdm9pZCB1bmRvKCkKLQkJCQl7Ci0JCQkJfSAgICAgCi0KLQkJCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLQkJCQl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSAKLQkJeyAgICAgIAotCQkJLy9oYWNrIHRvIHByZXZlbnQgYXN5bmMgbGF5b3V0IGZyb20gcGxhY2luZyB0aGUgY2VsbCBlZGl0b3IgdHdpY2UuCi0JCQlnZXRIb3N0RmlndXJlKCkuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFZGl0UGFydCBnZXRSZWxhdGl2ZUVkaXRQYXJ0KGludCBkaXJlY3Rpb24pCi0JeyAgICAgICAgIAotCQlFZGl0UGFydCBlZGl0UGFydCA9IHN1cGVyLmdldFJlbGF0aXZlRWRpdFBhcnQoZGlyZWN0aW9uKTsKLQkJaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCAmJiBlZGl0UGFydCA9PSBudWxsKQotCQl7Ci0JCQllZGl0UGFydCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldE5leHRJbnRlcmZhY2UodGhpcyk7Ci0JCX0gICAKLQkJcmV0dXJuIGVkaXRQYXJ0OwotCX0KLQotCXByaXZhdGUgY2xhc3MgTXlNb3VzZUV2ZW50TGlzdGVuZXIgZXh0ZW5kcyBTdHViIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBtZSkgeyB9Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2tlZChNb3VzZUV2ZW50IG1lKSB7IH0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmVkKE1vdXNlRXZlbnQgbWUpIHsKLQkJCVBvaW50IHBvaW50ZXIgPSBtZS5nZXRMb2NhdGlvbigpOwotCQkJcmVmcmVzaExpbmtGaWd1cmUocG9pbnRlcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBtZSkgewotCQkJUG9pbnQgcG9pbnRlciA9IG1lLmdldExvY2F0aW9uKCk7Ci0JCQlvcGVuRXh0ZXJuYWxFZGl0b3IocG9pbnRlcik7Ci0JCX0KLQl9Ci0KLQkvLyBNZXRob2RzIGJlbG93IGhhbmRsZSB0aGUgTGluayBGaWd1cmUuLi4uLgotCXByaXZhdGUgdm9pZCBlbXBoYXNpemVMaW5rRmlndXJlKCkgewotCQlsaW5rSWNvbkZpZ3VyZS5zZXRDb2xvcihDb2xvckNvbnN0YW50cy5ibHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5lbXBoYXNpemVMaW5rRmlndXJlKCkgewotCQlsaW5rSWNvbkZpZ3VyZS5zZXRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwb2ludGVySW5SYW5nZShSZWN0YW5nbGUgZmlnQm91bmRzLCBQb2ludCBwb2ludGVyKSB7Ci0JCVJlY3RhbmdsZSBsaW5rQm91bmRzID0gZ2V0TGlua0ZpZ3VyZUJvdW5kcygpOwotCi0JCWludCBlbnRpcmVYID0gZmlnQm91bmRzLng7Ci0JCWludCBlbnRpcmVZID0gZmlnQm91bmRzLnk7Ci0JCWludCBlbnRpcmVXaWR0aCA9IGZpZ0JvdW5kcy53aWR0aCArIGxpbmtCb3VuZHMud2lkdGg7Ci0JCWludCBlbnRpcmVIZWlnaHQgPSBmaWdCb3VuZHMuaGVpZ2h0OwotCQlSZWN0YW5nbGUgZW50aXJlQm91bmRzID0gbmV3IFJlY3RhbmdsZShlbnRpcmVYLCBlbnRpcmVZLCBlbnRpcmVXaWR0aCwgZW50aXJlSGVpZ2h0KTsKLQotCQlyZXR1cm4gZW50aXJlQm91bmRzLmNvbnRhaW5zKHBvaW50ZXIpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc0xpbmtGaWd1cmUoKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0SW50ZXJmYWNlRWRpdFBhcnQoKS5nZXRMaW5rSWNvbkNvbHVtbigpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXRlbS5lcXVhbHMobGlua0ljb25GaWd1cmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0TGlua0ZpZ3VyZUJvdW5kcygpIHsKLQkJaWYgKGNvbnRhaW5zTGlua0ZpZ3VyZSgpKSB7Ci0JCQlyZXR1cm4gbGlua0ljb25GaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLSAKLQlwcml2YXRlIElPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIgZ2V0RXh0ZXJuYWxFZGl0b3JPcGVuZXIoKSB7Ci0JCUlPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIgb3BlbkV4dGVybmFsRWRpdG9ySGVscGVyID0gbnVsbDsKLQkJCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlLmdldEFjdGl2ZUVkaXRvcigpICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IGFkYXB0ZWQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoSU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlci5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVkIGluc3RhbmNlb2YgSU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlcikgewotCQkJCQkJb3BlbkV4dGVybmFsRWRpdG9ySGVscGVyID0gKElPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIpIGFkYXB0ZWQ7Ci0JCQkJCQlvcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJcmV0dXJuIG9wZW5FeHRlcm5hbEVkaXRvckhlbHBlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaExpbmtGaWd1cmUoUG9pbnQgcG9pbnQpIHsKLQkJUmVjdGFuZ2xlIGZpZ0JvdW5kcyA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldEJvdW5kcygpOwotCQkvLyBUT0RPOiBybWFoOiAgV2Ugc2hvdWxkIG5vdCBrbm93IGFib3V0IFcxMU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlciBoZXJlLiAgUG9zdCBXVFAgMS41LCB3ZSBzaG91bGQgYWRkIHRoZQotCQkvLyBpc1ZhbGlkKCkgbWV0aG9kIHRvIGludGVyZmFjZSBJT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyLmphdmEKLQkJaWYgKGdldEV4dGVybmFsRWRpdG9yT3BlbmVyKCkgaW5zdGFuY2VvZiBXMTFPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIpIHsKLQkJCVcxMU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlciBvcGVuSGVscGVyID0gKFcxMU9wZW5FeHRlcm5hbEVkaXRvckhlbHBlcikgZ2V0RXh0ZXJuYWxFZGl0b3JPcGVuZXIoKTsKLQotCQkJaWYgKG9wZW5IZWxwZXIubGlua0FwcGxpY2FibGUoKSkgewotCQkJCWlmICghZmlndXJlQ29udGFpbnNMaW5rRmlndXJlKGdldEludGVyZmFjZUVkaXRQYXJ0KCkuZ2V0TGlua0ljb25Db2x1bW4oKSkpIHsKLQkJCQkJbGlua0ljb25GaWd1cmUgPSBuZXcgQmFzZUxpbmtJY29uRmlndXJlKHRoaXMpOwotCQkJCQlnZXRJbnRlcmZhY2VFZGl0UGFydCgpLmdldExpbmtJY29uQ29sdW1uKCkuYWRkKGxpbmtJY29uRmlndXJlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKG9wZW5IZWxwZXIuaXNWYWxpZCgpKSB7Ci0JCQkJCWxpbmtJY29uRmlndXJlLnNldExpbmtJY29uU3R5bGUoQmFzZUxpbmtJY29uRmlndXJlLlZBTElEX1NDSEVNQV9MSU5LX1NUWUxFKTsKLQkJCQkJCi0JCQkJCWlmIChwb2ludGVySW5SYW5nZShmaWdCb3VuZHMsIHBvaW50KSkgewotCQkJCQkJZW1waGFzaXplTGlua0ZpZ3VyZSgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdW5lbXBoYXNpemVMaW5rRmlndXJlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxpbmtJY29uRmlndXJlLnNldExpbmtJY29uU3R5bGUoQmFzZUxpbmtJY29uRmlndXJlLklOVkFMSURfU0NIRU1BX0xJTktfU1RZTEUpOwotCQkJCX0KLQkJCQkJCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoY29udGFpbnNMaW5rRmlndXJlKCkpIHsKLQkJCQkJZ2V0SW50ZXJmYWNlRWRpdFBhcnQoKS5nZXRMaW5rSWNvbkNvbHVtbigpLnJlbW92ZShsaW5rSWNvbkZpZ3VyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZpZ3VyZUNvbnRhaW5zTGlua0ZpZ3VyZShJRmlndXJlIHBhcmVudCkgewotCQlJdGVyYXRvciBpdCA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdC5uZXh0KCkuZXF1YWxzKGxpbmtJY29uRmlndXJlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRXh0ZXJuYWxFZGl0b3IoUG9pbnQgcG9pbnQpIHsKLQkJUmVjdGFuZ2xlIGxpbmtGaWdCb3VuZHMgPSBnZXRMaW5rRmlndXJlQm91bmRzKCk7Ci0JCWlmIChsaW5rRmlnQm91bmRzID09IG51bGwgfHwgZ2V0RXh0ZXJuYWxFZGl0b3JPcGVuZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWN0YW5nbGUgdGVzdGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUobGlua0ZpZ0JvdW5kcy54LCBsaW5rRmlnQm91bmRzLnksIDAsIGxpbmtGaWdCb3VuZHMuaGVpZ2h0KTsKLQotCQlpZiAoZ2V0RXh0ZXJuYWxFZGl0b3JPcGVuZXIoKS5saW5rQXBwbGljYWJsZSgpICYmIHBvaW50ZXJJblJhbmdlKHRlc3Rib3VuZHMsIHBvaW50KSkgewotCQkJLy8gT3BlbiBpbiBYU0QgRWRpdG9yCi0JCQlnZXRFeHRlcm5hbEVkaXRvck9wZW5lcigpLm9wZW5FeHRlcm5hbEVkaXRvcigpOwkJCQkgIAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL1NlcnZpY2VFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL1NlcnZpY2VFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWEyZjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9TZXJ2aWNlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwb2xpY2llcy5BU0RMYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXMuQVNEU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmZpZ3VyZXMuSGVhZGluZ0ZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0IGltcGxlbWVudHMgSU5hbWVkRWRpdFBhcnQKLXsKLSAgSUZpZ3VyZSBjb250ZW50UGFuZTsKLSAgSGVhZGluZ0ZpZ3VyZSBoZWFkaW5nRmlndXJlOwotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0JICBMaW5lQm9yZGVyIGJveEZpZ3VyZUxpbmVCb3JkZXIgPSAoTGluZUJvcmRlcikgZmlndXJlLmdldEJvcmRlcigpOwotCSAgYm94RmlndXJlTGluZUJvcmRlci5zZXRXaWR0aCgyKTsKLS8vCSAgYm94RmlndXJlTGluZUJvcmRlci5zZXRDb2xvcihDb2xvckNvbnN0YW50cy5kYXJrQmx1ZSk7Ci0JICBoZWFkaW5nRmlndXJlLnNldFNlbGVjdGVkKHRydWUpOwkgIAotCSAgZmlndXJlLnJlcGFpbnQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0JICBMaW5lQm9yZGVyIGJveEZpZ3VyZUxpbmVCb3JkZXIgPSAoTGluZUJvcmRlcikgZmlndXJlLmdldEJvcmRlcigpOwotCSAgYm94RmlndXJlTGluZUJvcmRlci5zZXRXaWR0aCgxKTsKLQkgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0Q29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCSAgaGVhZGluZ0ZpZ3VyZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JICBmaWd1cmUucmVwYWludCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigxKSk7Ci0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIHRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsgICAgCi0gICAgaGVhZGluZ0ZpZ3VyZSA9IG5ldyBIZWFkaW5nRmlndXJlKCk7Ci0gICAJaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldEljb24oKChJU2VydmljZSkgZ2V0TW9kZWwoKSkuZ2V0SW1hZ2UoKSk7CQotICAgIGZpZ3VyZS5hZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0gICAgICAgIAotICAgIGNvbnRlbnRQYW5lID0gbmV3IEZpZ3VyZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpIAotICAgICAgewotICAgICAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgICBib29sZWFuIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRmlndXJlIGZpZ3VyZSA9IChGaWd1cmUpaS5uZXh0KCk7ICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGlzRmlyc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsgIAotICAgICAgICAgIFJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoci54LCByLnkgKzEsIHIueCArIHIud2lkdGgsIHIueSArIDEpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dDIgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgdG9vbGJhckxheW91dDIuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsgICAKLSAgICBjb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQyKTsKLSAgICBmaWd1cmUuYWRkKGNvbnRlbnRQYW5lKTsKLSAgICAKLSAgICAvLyBybWFoOiBUaGUgYmxvY2sgb2YgY29kZSBiZWxvdyBoYXMgYmVlbiBtb3ZlZCBmcm9tIHJlZnJlc2hWaXN1YWxzKCkuICBXZSdyZQotICAgIC8vIGFzc3VtaW5nIHRoZSByZWFkLW9ubHkgc3RhdGUgb2YgdGhlIEVkaXRQYXJ0IHdpbGwgbmV2ZXIgY2hhbmdlIG9uY2UgdGhlCi0gICAgLy8gRWRpdFBhcnQgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICBpZiAoaXNSZWFkT25seSgpKSAKLSAgICB7Ci0gICAgICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0Rm9yZWdyb3VuZENvbG9yKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5yZWFkT25seUxhYmVsQ29sb3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UGFuZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCSAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBuZXcgQVNETGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCSAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFTRFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLSAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKXsKLQkgIGlmIChjdXJzb3JMb2NhdGlvbiA9PSBudWxsIHx8IGhpdFRlc3QoaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLCBjdXJzb3JMb2NhdGlvbikgJiYgIWlzUmVhZE9ubHkoKSkgewotCQkgIG1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBjdXJzb3JMb2NhdGlvbikpOwotCQkgIG1hbmFnZXIuc2hvdygpOwotICAgIH0KLSAgICBlbHNlIGlmICgoaGl0VGVzdChoZWFkaW5nRmlndXJlLmdldExhYmVsKCksIGN1cnNvckxvY2F0aW9uKSB8fAotICAgICAgICAgICAgICBoaXRUZXN0RmlndXJlKGhlYWRpbmdGaWd1cmUsIGN1cnNvckxvY2F0aW9uKSkgJiYgaXNSZWFkT25seSgpKSB7Ci0gICAgICBkb09wZW5OZXdFZGl0b3IoKTsKLQkgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXEpIHsKLQkgIGlmIChyZXEuZ2V0VHlwZSgpLmVxdWFscyhSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCkpIHsKLQkJICBwZXJmb3JtRGlyZWN0RWRpdChudWxsKTsKLQkgIH0KLSAgfQotICAKLSAgcHVibGljIExhYmVsIGdldExhYmVsRmlndXJlKCkgewotCSAgcmV0dXJuIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgSVNlcnZpY2Ugc2VydmljZSA9IChJU2VydmljZSlnZXRNb2RlbCgpOwotICAgIHJldHVybiBzZXJ2aWNlLmdldEVuZFBvaW50cygpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsgCi0gICAgSVNlcnZpY2Ugc2VydmljZSA9IChJU2VydmljZSlnZXRNb2RlbCgpOwotICAgIGhlYWRpbmdGaWd1cmUuc2V0SXNSZWFkT25seShzZXJ2aWNlLmlzUmVhZE9ubHkoKSk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldFRleHQoc2VydmljZS5nZXROYW1lKCkpOwotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7ICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9BYnN0cmFjdE1vZGVsQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fic3RyYWN0TW9kZWxDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZWVhZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fic3RyYWN0TW9kZWxDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQVNET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUFTRE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uIGltcGxlbWVudHMgSUFTRE9iamVjdCwgSVRyZWVFbGVtZW50Ci17Ci0gIElBU0RPYmplY3QgbW9kZWw7Ci0gIFN0cmluZyBraW5kOwotICAKLSAgcHVibGljIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKElBU0RPYmplY3QgbW9kZWwsIFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElBU0RPYmplY3QgbW9kZWwpCi0gIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuIGtpbmQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpIHsKLQkgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCSAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBU0RPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIG1vZGVsLnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFTRE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbW9kZWwudW5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0JpbmRpbmdDb2x1bW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9CaW5kaW5nQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTlmZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0JpbmRpbmdDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU5hbWVkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEJpbmRpbmdDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbiB7Ci0JICBwdWJsaWMgQmluZGluZ0NvbHVtbihJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkgICAgc3VwZXIoZGVzY3JpcHRpb24sICJCaW5kaW5nQ29sdW1uIik7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLQkgIAotCSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQkJTGlzdCBiaW5kaW5ncyA9ICgoSURlc2NyaXB0aW9uKW1vZGVsKS5nZXRCaW5kaW5ncygpOwotCQkJQ29sbGVjdGlvbnMuc29ydChiaW5kaW5ncywgbmV3IEJpbmRpbmdDb21wYXJhdG9yKCkpOwotCQkJT2JqZWN0IGFycmF5W10gPSBiaW5kaW5ncy50b0FycmF5KCk7Ci0JCQkKLQkJCUlUcmVlRWxlbWVudCB0cmVlRWxlbWVudFtdID0gbmV3IElUcmVlRWxlbWVudFthcnJheS5sZW5ndGhdOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykgewotCQkJCXRyZWVFbGVtZW50W2luZGV4XSA9IChJVHJlZUVsZW1lbnQpIGFycmF5W2luZGV4XTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHRyZWVFbGVtZW50OwotCSAgfQotCi0JICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJICBJVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnRbXSA9IGdldENoaWxkcmVuKCk7Ci0JCSAgaWYgKHRyZWVFbGVtZW50Lmxlbmd0aCA+IDApIHsKLQkJCSAgcmV0dXJuIHRydWU7Ci0JCSAgfQotCQkgIAotCQkgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkgIAotCSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkgIHJldHVybiAiZGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSBjbGFzcyBCaW5kaW5nQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJaWYgKG8xIGluc3RhbmNlb2YgSUJpbmRpbmcgJiYgbzIgaW5zdGFuY2VvZiBJQmluZGluZykgewotCQkJCQlJSW50ZXJmYWNlIGludGVyZmFjZTEgPSAoKElCaW5kaW5nKSBvMSkuZ2V0SW50ZXJmYWNlKCk7Ci0JCQkJCUlJbnRlcmZhY2UgaW50ZXJmYWNlMiA9ICgoSUJpbmRpbmcpIG8yKS5nZXRJbnRlcmZhY2UoKTsKLQkJCQkJCi0JCQkJCWlmIChpbnRlcmZhY2UxICE9IG51bGwgJiYgaW50ZXJmYWNlMiAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZTEgPSAoKElOYW1lZE9iamVjdCkgaW50ZXJmYWNlMSkuZ2V0TmFtZSgpOwotCQkJCQkJU3RyaW5nIG5hbWUyID0gKChJTmFtZWRPYmplY3QpIGludGVyZmFjZTIpLmdldE5hbWUoKTsKLQkJCQkJCXJldHVybiBuYW1lMS5jb21wYXJlVG8obmFtZTIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGludGVyZmFjZTEgIT0gbnVsbCAmJiBpbnRlcmZhY2UyID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpbnRlcmZhY2UxID09IG51bGwgJiYgaW50ZXJmYWNlMiAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9CaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQmluZGluZ0NvbnRlbnRQbGFjZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTYzZDI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9CaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyIHsKLQlwcml2YXRlIE9iamVjdCBtb2RlbDsKLQkKLQlwdWJsaWMgQmluZGluZ0NvbnRlbnRQbGFjZUhvbGRlcihPYmplY3QgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTM3MTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJQWN0aW9uUHJvdmlkZXIKLXsKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSW50ZXJmYWNlQ29sdW1uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSW50ZXJmYWNlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDBmMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0ludGVyZmFjZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTmFtZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmUuSVRyZWVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24gewotCXB1YmxpYyBJbnRlcmZhY2VDb2x1bW4oSURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGRlc2NyaXB0aW9uLCAiSW50ZXJmYWNlQ29sdW1uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlMaXN0IGludGVyZmFjZXMgPSAoKElEZXNjcmlwdGlvbiltb2RlbCkuZ2V0SW50ZXJmYWNlcygpOwkJCi0JCUNvbXBhcmF0b3IgY29tcGFyZSA9IG5ldyBOYW1lZE9iamVjdENvbXBhcmF0b3IoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChpbnRlcmZhY2VzLCBjb21wYXJlKTsKLQkJT2JqZWN0IGFycmF5W10gPSBpbnRlcmZhY2VzLnRvQXJyYXkoKTsKLQkJCi0JCUlUcmVlRWxlbWVudCB0cmVlRWxlbWVudFtdID0gbmV3IElUcmVlRWxlbWVudFthcnJheS5sZW5ndGhdOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQl0cmVlRWxlbWVudFtpbmRleF0gPSAoSVRyZWVFbGVtZW50KSBhcnJheVtpbmRleF07Ci0JCX0KLQkJCi0JCXJldHVybiB0cmVlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJSVRyZWVFbGVtZW50IHRyZWVFbGVtZW50W10gPSBnZXRDaGlsZHJlbigpOwotCQlpZiAodHJlZUVsZW1lbnQubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gImRlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgY2xhc3MgTmFtZWRPYmplY3RDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcnsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgaW5zdGFuY2VvZiBJTmFtZWRPYmplY3QgJiYgbzIgaW5zdGFuY2VvZiBJTmFtZWRPYmplY3QpIHsKLQkJCQlTdHJpbmcgbmFtZTEgPSAoKElOYW1lZE9iamVjdCkgbzEpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmFtZTIgPSAoKElOYW1lZE9iamVjdCkgbzIpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvKG5hbWUyKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1NlcnZpY2VDb2x1bW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9TZXJ2aWNlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTdjODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1NlcnZpY2VDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbiB7Ci0JcHVibGljIFNlcnZpY2VDb2x1bW4oSURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGRlc2NyaXB0aW9uLCAiU2VydmljZUNvbHVtbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJT2JqZWN0IGFycmF5W10gPSAoKElEZXNjcmlwdGlvbiltb2RlbCkuZ2V0U2VydmljZXMoKS50b0FycmF5KCk7Ci0JCUlUcmVlRWxlbWVudCB0cmVlRWxlbWVudFtdID0gbmV3IElUcmVlRWxlbWVudFthcnJheS5sZW5ndGhdOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQl0cmVlRWxlbWVudFtpbmRleF0gPSAoSVRyZWVFbGVtZW50KSBhcnJheVtpbmRleF07Ci0JCX0KLQkJCi0JCXJldHVybiB0cmVlRWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCUlUcmVlRWxlbWVudCB0cmVlRWxlbWVudFtdID0gZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKHRyZWVFbGVtZW50Lmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuICJkZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cG9saWNpZXMvQVNERHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cG9saWNpZXMvQVNERHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzAxZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBvbGljaWVzL0FTRERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZUNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNERHJhZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0REcmFnUmVvcmRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5NZXNzYWdlUmVmZXJlbmNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMuUGFyYW1ldGVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0REcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQkgIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7ICAgIAotCSAgcHJvdGVjdGVkIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdDsKLQkgIHByb3RlY3RlZCBQb2ludCBsb2NhdGlvbjsKLQkgIHByb3RlY3RlZCBBU0REcmFnQWN0aW9uIGRyYWdBY3Rpb247ICAgIAotCSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRXhlY3V0ZSA9IGZhbHNlOwotCi0JICBwdWJsaWMgQVNERHJhZ0FuZERyb3BDb21tYW5kKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KQotCSAgewotCSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLQotCSAgICBsb2NhdGlvbiA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsgICAKLQkgICAgRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSB2aWV3ZXIuZmluZE9iamVjdEF0KGxvY2F0aW9uKTsgCi0KLQkgICAgaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYW1ldGVyRWRpdFBhcnQgfHwgdGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNZXNzYWdlUmVmZXJlbmNlRWRpdFBhcnQpIHsKLQkgICAgCSgoR3JhcGhpY2FsRWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvY2F0aW9uKTsKLQkgICAgCUdyYXBoaWNhbEVkaXRQYXJ0IG1vdmluZ0NoaWxkRWRpdFBhcnQ7Ci0JICAgIAlWZWN0b3IgZHJhZ0FjdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0JICAgIAlpZiAocmVxdWVzdC5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0FERCkpIHsgLy8gVGhpcyByZWFsbHkgc2hvdWxkbid0IGJlIFJFUV9BREQuLi4uCi0JICAgIAkJTGlzdCBsaXN0ID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLQkgICAgCQlpZiAobGlzdC5zaXplKCkgPD0gMCkgewotCSAgICAJCQljYW5FeGVjdXRlID0gZmFsc2U7Ci0JICAgIAkJCXJldHVybjsKLQkgICAgCQl9Ci0JICAgIAkJCi0JICAgIAkJLy8gR3JhYmJpbmcgdGhlIGZpc3Qgc2VsZWN0aW9uCi0JICAgIAkJbW92aW5nQ2hpbGRFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JICAgIAkJT2JqZWN0IG1vZGVsID0gbW92aW5nQ2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotCSAgICAJCUVkaXRQYXJ0IHBvaW50ZXJFZGl0UGFydCA9IHZpZXdlci5maW5kT2JqZWN0QXQobG9jYXRpb24pOwotCSAgICAJCQotCSAgICAJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElQYXJhbWV0ZXIpIHsKLQkgICAgCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBBU0REcmFnUmVvcmRlckFjdGlvbihtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyRWRpdFBhcnQsIGdldFBvaW50ZXJMb2NhdGlvbihsb2NhdGlvbikpKTsKLQkgICAgCQl9Ci0JICAgIAkJZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJTWVzc2FnZVJlZmVyZW5jZSkgewotCSAgICAJCQlJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmID0gKElNZXNzYWdlUmVmZXJlbmNlKSBtb2RlbDsKLQkgICAgCQkJaWYgKG1lc3NhZ2VSZWYuZ2V0S2luZCgpID09IElNZXNzYWdlUmVmZXJlbmNlLktJTkRfSU5QVVQgfHwgbWVzc2FnZVJlZi5nZXRLaW5kKCkgPT0gSU1lc3NhZ2VSZWZlcmVuY2UuS0lORF9PVVRQVVQpIHsKLQkgICAgCQkJCWRyYWdBY3Rpb25zLmFkZChuZXcgQVNERHJhZ1Jlb3JkZXJBY3Rpb24obW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckVkaXRQYXJ0LCBnZXRQb2ludGVyTG9jYXRpb24obG9jYXRpb24pKSk7Ci0vLwkgICAgCQkJCWRyYWdBY3Rpb25zLmFkZChuZXcgV1NETERyYWdTZXRNZXNzYWdlQWN0aW9uKG1vdmluZ0NoaWxkRWRpdFBhcnQsIHBvaW50ZXJFZGl0UGFydCwgbG9jYXRpb24pKTsKLQkgICAgCQkJfQotCSAgICAJCX0KLQkgICAgCQkKLS8vCSAgICAJCWVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgRmF1bHQpIHsKLS8vCSAgICAJCWRyYWdBY3Rpb25zLmFkZChuZXcgV1NETERyYWdTZXRNZXNzYWdlQWN0aW9uKG1vdmluZ0NoaWxkRWRpdFBhcnQsIHBvaW50ZXJFZGl0UGFydCwgbG9jYXRpb24pKTsKLS8vCSAgICAJCX0gICAgICAgICAgICAKLQkgICAgCX0KLS8vCSAgICAJZWxzZSBpZiAocmVxdWVzdC5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0NMT05FKSkgewotLy8JICAgIAlMaXN0IGxpc3QgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotLy8JICAgIAlpZiAobGlzdC5zaXplKCkgPiAwKQotLy8JICAgIAl7Ci0vLwkgICAgCS8vIEdyYWJiaW5nIHRoZSBmaXN0IHNlbGVjdGlvbgotLy8JICAgIAltb3ZpbmdDaGlsZEVkaXRQYXJ0ID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBsaXN0LmdldCgwKTsKLS8vCSAgICAJCi0vLwkgICAgCWRyYWdBY3Rpb25zLmFkZChuZXcgQ29weVdTRExFbGVtZW50QWN0aW9uKHZpZXdlciwKLS8vCSAgICAJKFdTRExFbGVtZW50KSBtb3ZpbmdDaGlsZEVkaXRQYXJ0LmdldE1vZGVsKCksCi0vLwkgICAgCShXU0RMRWxlbWVudCkgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSwKLS8vCSAgICAJbnVsbCkpOwotLy8JICAgIAl9Ci0vLwkgICAgCX0KLQkgICAgCQotCSAgICAJSXRlcmF0b3IgaXQgPSBkcmFnQWN0aW9ucy5pdGVyYXRvcigpOwotCSAgICAJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCSAgICAJCWRyYWdBY3Rpb24gPSAoQVNERHJhZ0FjdGlvbikgaXQubmV4dCgpOwotCSAgICAJCWNhbkV4ZWN1dGUgPSBkcmFnQWN0aW9uLmNhbkV4ZWN1dGUoKTsKLQkgICAgCQlpZiAoY2FuRXhlY3V0ZSkKLQkgICAgCQkJYnJlYWs7Ci0JICAgIAl9Ci0JICAgIH0KLQkgIH0KLQkgIAotCSAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0JICB7IAotCSAgICByZXR1cm4gY2FuRXhlY3V0ZTsKLQkgIH0gICAgIAotCSAgCi0JICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCSAgICBpZiAoY2FuRXhlY3V0ZSkKLQkgICAgeyAKLQkgICAgICBkcmFnQWN0aW9uLnJ1bigpOyAKLQkgICAgfQotCSAgfQotCSAgCi0JICBwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpIHsKLQkgIAlpZiAoZHJhZ0FjdGlvbiAhPSBudWxsKSB7Ci0JICAJCXJldHVybiBkcmFnQWN0aW9uLmdldEZlZWRiYWNrRmlndXJlKCk7Ci0JICAJfQotCSAgCWVsc2UgewotCSAgCQlyZXR1cm4gbnVsbDsKLQkgIAl9Ci0JICB9Ci0JICAKLQkgIC8qCi0JICAgKiBUaGlzIG1ldGhvZCBjb21wZW5zYXRlcyBmb3IgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uCi0JICAgKi8KLQkgIHByaXZhdGUgUG9pbnQgZ2V0UG9pbnRlckxvY2F0aW9uKFBvaW50IG9yaWdQb2ludGVyTG9jYXRpb24pIHsKLQkgIAkgUG9pbnQgY29tcGVuc2F0ZWRMb2NhdGlvbiA9IG9yaWdQb2ludGVyTG9jYXRpb247Ci0JICAJIEZpZ3VyZUNhbnZhcyBmaWd1cmVDYW52YXMgPSAoRmlndXJlQ2FudmFzKSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCSAgICAgaW50IHlPZmZzZXQgPSBmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWZXJ0aWNhbFJhbmdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotCSAgICAgY29tcGVuc2F0ZWRMb2NhdGlvbi55ID0gY29tcGVuc2F0ZWRMb2NhdGlvbi55ICsgeU9mZnNldDsKLQkgICAgIAotCSAgICAgcmV0dXJuIGNvbXBlbnNhdGVkTG9jYXRpb247Ci0JICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBvbGljaWVzL0FTRERyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBvbGljaWVzL0FTRERyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzIzZWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwb2xpY2llcy9BU0REcmFnQW5kRHJvcEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLQotcHVibGljIGNsYXNzIEFTRERyYWdBbmREcm9wRWRpdFBvbGljeSBleHRlbmRzIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuR3JhcGhpY2FsRWRpdFBvbGljeSB7Ci0JcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsKLQlwcm90ZWN0ZWQgQVNEU2VsZWN0aW9uRWRpdFBvbGljeSBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLQkKLQlwdWJsaWMgQVNERHJhZ0FuZERyb3BFZGl0UG9saWN5KEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgQVNEU2VsZWN0aW9uRWRpdFBvbGljeSBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSkgewotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJdGhpcy5zZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSA9IHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsgICAgICAgICAgICAgCi0JCUFTRERyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDaGFuZ2VCb3VuZHNSZXF1ZXN0KSB7Ci0JCQljb21tYW5kID0gbmV3IEFTRERyYWdBbmREcm9wQ29tbWFuZCh2aWV3ZXIsIChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3QpOwotCQkJc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kuc2V0RHJhZ0FuZERyb3BDb21tYW5kKGNvbW1hbmQpOwotCQl9IAotCQlyZXR1cm4gY29tbWFuZDsgICAgICAgICAgICAgCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBvbGljaWVzL0FTREdyYXBoTm9kZURyYWdUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cG9saWNpZXMvQVNER3JhcGhOb2RlRHJhZ1RyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5ZjZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cG9saWNpZXMvQVNER3JhcGhOb2RlRHJhZ1RyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRHJhZ0VkaXRQYXJ0c1RyYWNrZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0RHcmFwaE5vZGVEcmFnVHJhY2tlciBleHRlbmRzIERyYWdFZGl0UGFydHNUcmFja2VyICB7Ci0JcHJvdGVjdGVkIEVkaXRQYXJ0IGVkaXRQYXJ0OyAKLQkKLQlwdWJsaWMgQVNER3JhcGhOb2RlRHJhZ1RyYWNrZXIoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJc3VwZXIoZWRpdFBhcnQpOwotCQl0aGlzLmVkaXRQYXJ0ID0gZWRpdFBhcnQ7Ci0JfSAKLQkKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgeyAKLQkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCQlyZXR1cm4gZWRpdFBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KTsgCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwb2xpY2llcy9BU0RMYWJlbERpcmVjdEVkaXRQb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2VkaXRwb2xpY2llcy9BU0RMYWJlbERpcmVjdEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0YjZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cG9saWNpZXMvQVNETGFiZWxEaXJlY3RFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5FbmRQb2ludEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU5hbWVkT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgQVNETGFiZWxEaXJlY3RFZGl0UG9saWN5IGV4dGVuZHMgRGlyZWN0RWRpdFBvbGljeSB7Ci0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQlTdHJpbmcgbGFiZWxUZXh0ID0gKFN0cmluZykgcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKTsKLQkJRWRpdFBhcnQgZWRpdFBhcnQ9IGdldEhvc3QoKTsKLQotCQkvLyBUT0RPOiBybWFoOiAgU3RhcnQgVkVSWSBVR0xZIEhBQ0suLi4uICBJIGRvbid0IHNlZSBhbnkgb3RoZXIgd2F5IHRvIHNvbHZlIHRoaXMgaXNzdWUgYXQgdGhpcyB0aW1lLgotCQkvLyBFbmRQb2ludEVkaXRQYXJ0IGNvbnRhaW5zIHR3byBsYWJlbHMgd2hpY2ggY2FuIGJlIGRpcmVjdCBlZGl0ZWQuICBUaGUgZmFjYWRlIGRyaXZpbmcgRW5kUG9pbnRFZGl0UGFydAotCQkvLyBjb250YWlucyBhIGdldFNldE5hbWVDb21tYW5kKCkgYW5kIGEgZ2V0U2V0QWRkcmVzc0NvbW1hbmQoKS4uLiBob3dldmVyLCB0aGlzIGNsYXNzIChMYWJlbERpcmVjdEVkaXRQb2xpY3kpCi0JCS8vIG9ubHkga25vd3MgYWJvdXQgZ2V0U2V0TmFtZUNvbW1hbmQoKS4uLi4uICBUaGlzIGlzIHRoZSBwcm9ibGVtIHdlIGZhY2Ugd2hlbiBjb21iaW5pbmcgdHdvIGxhYmVscyBpbnRvCi0JCS8vIG9uZSBFZGl0UGFydC4uLi4uCi0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVuZFBvaW50RWRpdFBhcnQpIHsKLQkJCWNvbW1hbmQgPSAoKEVuZFBvaW50RWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRTZXRQcm9wZXJMYWJlbENvbW1hbmQobGFiZWxUZXh0KTsKLQkJfQotCQkvLyBFbmQgVkVSWSBVR0xZIEhBQ0sKLQkJZWxzZSBpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIElOYW1lZE9iamVjdCkgewotCQkJY29tbWFuZCA9ICgoSU5hbWVkT2JqZWN0KSBlZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRTZXROYW1lQ29tbWFuZChsYWJlbFRleHQpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cG9saWNpZXMvQVNEU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZWRpdHBvbGljaWVzL0FTRFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhZmZmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9lZGl0cG9saWNpZXMvQVNEU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLklGZWVkYmFja0hhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0RTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7Ci0JcHJvdGVjdGVkIEFTRERyYWdBbmREcm9wQ29tbWFuZCBkcmFnQW5kRHJvcENvbW1hbmQ7Ci0JcHJvdGVjdGVkIElGaWd1cmUgZmVlZGJhY2s7Ci0KLQkgIHB1YmxpYyB2b2lkIHNldERyYWdBbmREcm9wQ29tbWFuZChBU0REcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kKSB7Ci0JICAgIHRoaXMuZHJhZ0FuZERyb3BDb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kOwotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCBzaG93U291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KQotCSAgewotCSAgCWVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2sobnVsbCk7Ci0JICAJCi0JICAJaWYgKGRyYWdBbmREcm9wQ29tbWFuZCAhPSBudWxsICYmIGRyYWdBbmREcm9wQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSB8fCBSRVFfQURELmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpIHsKLQkJCSAgc2hvd01vdmVDaGFuZ2VCb3VuZHNGZWVkYmFjaygoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdCk7Ci0JCSAgfQotLy8JCSAgZWxzZSBpZiAoUkVRX0NMT05FLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpIHsKLS8vCQkgIAkgIHNob3dDb3B5Q2hhbmdlQm91bmRzRmVlZGJhY2soKENoYW5nZUJvdW5kc1JlcXVlc3QpIHJlcXVlc3QpOwotLy8JCSAgfQotCSAgCX0KLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBFcmFzZSBmZWVkYmFjayBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlY2VpdmVyIG9iamVjdCBpcyAKLQkgICAqIGJlaW5nIGRyYWdnZWQuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGRyYWcgaXMKLQkgICAqIGNvbXBsZXRlZCBvciBjYW5jZWxsZWQgb24gdGhlIHJlY2VpdmVyIG9iamVjdC4KLQkgICAqIEBwYXJhbSBkcmFnVHJhY2tlciBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRHJhZ1RyYWNrZXIgVGhlIGRyYWcgdHJhY2tlciBvZiB0aGUgdG9vbCBwZXJmb3JtaW5nIHRoZSBkcmFnLgotCSAgICovCi0JICBwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgCi0JICB7Ci0JICAgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpIHx8ICBSRVFfQURELmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpCi0JICAgIHsKLQkJCSAgZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjaygoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0KTsKLQkgICAgfQotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIEVyYXNlIGZlZWRiYWNrIGluZGljYXRpbmcgdGhhdCB0aGUgcmVjZWl2ZXIgb2JqZWN0IGlzIAotCSAgICogYmVpbmcgZHJhZ2dlZC4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgZHJhZyBpcwotCSAgICogY29tcGxldGVkIG9yIGNhbmNlbGxlZCBvbiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotCSAgICogQHBhcmFtIGRyYWdUcmFja2VyIG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnVHJhY2tlciBUaGUgZHJhZyB0cmFja2VyIG9mIHRoZSB0b29sIHBlcmZvcm1pbmcgdGhlIGRyYWcuCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2soQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSAKLQkgIHsKLQkJICBpZiAoZmVlZGJhY2sgIT0gbnVsbCkgCi0JICAgIHsJCSAgICAgIAotCQkJICByZW1vdmVGZWVkYmFjayhmZWVkYmFjayk7Ci0JCSAgfQotCQkgIGZlZWRiYWNrID0gbnVsbDsKLQkgIH0KLQkgIAotCSAgcHJvdGVjdGVkIHZvaWQgc2hvd01vdmVDaGFuZ2VCb3VuZHNGZWVkYmFjayhDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpCi0JICB7Ci0JICAJaWYgKGRyYWdBbmREcm9wQ29tbWFuZCAhPSBudWxsICYmIGRyYWdBbmREcm9wQ29tbWFuZC5nZXRGZWVkYmFja0ZpZ3VyZSgpICE9IG51bGwpIHsKLQkgIAkJZmVlZGJhY2sgPSBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKTsKLQkgIAkJYWRkRmVlZGJhY2soZmVlZGJhY2spOwotCSAgCX0KLQkgIH0gCi0JICAKLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdCgpIGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikgewotCQkJCSgoSUZlZWRiYWNrSGFuZGxlcikgZ2V0SG9zdCgpKS5yZW1vdmVGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3QoKSBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpIHsKLQkJCSgoSUZlZWRiYWNrSGFuZGxlcikgZ2V0SG9zdCgpKS5hZGRGZWVkYmFjaygpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvQmFzZUxpbmtJY29uRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9maWd1cmVzL0Jhc2VMaW5rSWNvbkZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkxMjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvQmFzZUxpbmtJY29uRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlTGlua0ljb25GaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXB1YmxpYyBzdGF0aWMgaW50IFZBTElEX1NDSEVNQV9MSU5LX1NUWUxFID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBJTlZBTElEX1NDSEVNQV9MSU5LX1NUWUxFID0gMjsKLQotCXByaXZhdGUgaW50IGxpbmtJY29uU3R5bGUgPSBWQUxJRF9TQ0hFTUFfTElOS19TVFlMRTsJCi0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0OwotCXByaXZhdGUgTGlzdCBjaGlsZEZpZ3VyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHVibGljIGludCBmaWd1cmVTcGFjaW5nID0gNzsKLQotCXB1YmxpYyBCYXNlTGlua0ljb25GaWd1cmUoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCkgewotCQllZGl0UGFydCA9IGVwOwotCi0JCVRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQodHJ1ZSkgewotCQkJcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgcGFyZW50KSB7Ci0JCQkJc3VwZXIubGF5b3V0KHBhcmVudCk7Ci0KLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gZ2V0QXNzb2NpYXRlZEVkaXRQYXJ0KCk7Ci0JCQkJSUZpZ3VyZSBhc3NvY2lhdGVkRmlndXJlID0gZXAuZ2V0RmlndXJlKCk7Ci0JCQkJaWYgKGFzc29jaWF0ZWRGaWd1cmUgIT0gbnVsbCkgewotCQkJCQkvLyBVcGRhdGUgdGhlIGJvdW5kcwotCQkJCQlSZWN0YW5nbGUgYXNzb2NpYXRlZEJvdW5kcyA9IGFzc29jaWF0ZWRGaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCB4ID0gYXNzb2NpYXRlZEJvdW5kcy54ICsgYXNzb2NpYXRlZEJvdW5kcy53aWR0aDsKLQkJCQkJaW50IHkgPSBhc3NvY2lhdGVkQm91bmRzLnk7Ci0JCQkJCWludCB3aWR0aCA9IGdldFNpemUoKS53aWR0aDsKLQkJCQkJaW50IGhlaWdodCA9IGFzc29jaWF0ZWRCb3VuZHMuaGVpZ2h0OwotCi0JCQkJCVJlY3RhbmdsZSBuZXdGaWdCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQkJCQkvLyBTZXQgbXkgYm91bmRzIGJhc2VkIG9uIG15IGFzc29jaWF0ZWQgZWRpdHBhcnQKLQkJCQkJc2V0Qm91bmRzKG5ld0ZpZ0JvdW5kcyk7Ci0KLQkJCQkJLy8gTGF5b3V0IHRoZSBjaGlsZHJlbgotCQkJCQlJdGVyYXRvciBpdCA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCUlGaWd1cmUgZmlnID0gKElGaWd1cmUpIGl0Lm5leHQoKTsKLQkJCQkJCVBvaW50IG5ld1BvaW50ID0gbmV3IFBvaW50KHgsIHkpOwotCi0JCQkJCQkvLyBJbmRlbnQgdGhlIGZpZ3VyZSB0byB0aGUgcmlnaHQgdG8gc2hvdyB0aGUgImJyb2tlbiIgc2NoZW1hIGxpbmsgZmlndXJlCi0JCQkJCQlpZiAoZmlnIGluc3RhbmNlb2YgUmlnaHRJbnZhbGlkSWNvbkZpZ3VyZSkgewotCQkJCQkJCW5ld1BvaW50LnggPSBuZXdQb2ludC54ICsgZmlndXJlU3BhY2luZzsKLQkJCQkJCX0KLQotCQkJCQkJZmlnLnNldExvY2F0aW9uKG5ld1BvaW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCi0JCS8vIERlZmF1bHQgdG8gYSBWYWxpZExpbmtJY29uRmlndXJlCi0JCWxpbmtJY29uU3R5bGUgPSBWQUxJRF9TQ0hFTUFfTElOS19TVFlMRTsKLQkJYWRkQ2hpbGRGaWd1cmUobmV3IFZhbGlkTGlua0ljb25GaWd1cmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkRmlndXJlcygpIHsKLQkJSXRlcmF0b3IgaXQgPSBjaGlsZEZpZ3VyZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVtb3ZlKChJRmlndXJlKSBpdC5uZXh0KCkpOwotCQl9Ci0KLQkJY2hpbGRGaWd1cmVzLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENoaWxkRmlndXJlKElGaWd1cmUgZmlnKSB7Ci0JCWNoaWxkRmlndXJlcy5hZGQoZmlnKTsKLQkJYWRkKGZpZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlua0ljb25TdHlsZShpbnQgc3R5bGUpIHsKLQkJaWYgKHN0eWxlID09IFZBTElEX1NDSEVNQV9MSU5LX1NUWUxFICYmIGxpbmtJY29uU3R5bGUgIT0gVkFMSURfU0NIRU1BX0xJTktfU1RZTEUpIHsKLQkJCXJlbW92ZUNoaWxkRmlndXJlcygpOwotCQkJYWRkQ2hpbGRGaWd1cmUobmV3IFZhbGlkTGlua0ljb25GaWd1cmUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoc3R5bGUgPT0gSU5WQUxJRF9TQ0hFTUFfTElOS19TVFlMRSAmJiBsaW5rSWNvblN0eWxlICE9IElOVkFMSURfU0NIRU1BX0xJTktfU1RZTEUpIHsKLQkJCXJlbW92ZUNoaWxkRmlndXJlcygpOwotCQkJYWRkQ2hpbGRGaWd1cmUobmV3IExlZnRJbnZhbGlkSWNvbkZpZ3VyZSgpKTsKLQkJCWFkZENoaWxkRmlndXJlKG5ldyBSaWdodEludmFsaWRJY29uRmlndXJlKCkpOwotCQl9Ci0KLQkJbGlua0ljb25TdHlsZSA9IHN0eWxlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGlua0ljb25TdHlsZSgpIHsKLQkJcmV0dXJuIGxpbmtJY29uU3R5bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJSXRlcmF0b3IgaXQgPSBjaGlsZEZpZ3VyZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSUZpZ3VyZSBmaWcgPSAoSUZpZ3VyZSkgaXQubmV4dCgpOwotCQkJZmlnLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0JCQlmaWcuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldEFzc29jaWF0ZWRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGVkaXRQYXJ0OwotCX0KLQotCXByaXZhdGUgY2xhc3MgTGVmdEludmFsaWRJY29uRmlndXJlIGV4dGVuZHMgTGlua0ljb25GaWd1cmUgewotCQlwdWJsaWMgTGVmdEludmFsaWRJY29uRmlndXJlKCkgewotCQkJc3VwZXIobnVsbCk7Ci0JCQlQb2ludExpc3QgcG9pbnRzID0gbmV3IFBvaW50TGlzdCgpOwotCQkJCi0JCQkvLyBEcmF3IHRoZSBhcnJvdwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMCwgNCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0JCQlwb2ludHMuYWRkUG9pbnQobmV3IFBvaW50KGhvcml6b250YWxCdWZmZXIgKyA1LCA0ICsgdmVydGljYWxCdWZmZXIpKTsKLQotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgNywgMCArIHZlcnRpY2FsQnVmZmVyKSk7CS8vIHRvcCBzbGFzaAotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgNSwgNCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0JCQlwb2ludHMuYWRkUG9pbnQobmV3IFBvaW50KGhvcml6b250YWxCdWZmZXIgKyAyLCAxMCArIHZlcnRpY2FsQnVmZmVyKSk7CS8vIGJvdHRvbSBzbGFzaAotCi0JCQlwb2ludHMuYWRkUG9pbnQobmV3IFBvaW50KGhvcml6b250YWxCdWZmZXIgKyA0LCA2ICsgdmVydGljYWxCdWZmZXIpKTsKLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDAsIDYgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMCwgNCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0KLQkJCXNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0JCQlzZXRGaWxsKHRydWUpOwotCQkJc2V0UG9pbnRzKHBvaW50cyk7Ci0JCX0KLQotCQkvLyBXZSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgd2lkdGggYmVjYXVzZSB3ZSBpbmRlbnQgdGhlIGZpZ3VyZSB0b3dhcmRzIHRoZSByaWdodC4KLQkJLy8gU28gd2UgaW5kZW50IGJ5IHRoYXQgc2FtZSBhbW91bnQgc3RvcmVkIGluIGhvcml6b250YWxCdWZmZXIKLQkJcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCQlEaW1lbnNpb24gZGltZW5zaW9uID0gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotCQkJZGltZW5zaW9uLndpZHRoID0gZGltZW5zaW9uLndpZHRoICsgaG9yaXpvbnRhbEJ1ZmZlcjsKLQotCQkJcmV0dXJuIGRpbWVuc2lvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IHBvaW50KSB7Ci0JCQlzdXBlci5zZXRMb2NhdGlvbihwb2ludCk7Ci0JCQkvLyBVcGRhdGUgdGhlIHBvaW50cyB3aXRoIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGNhbGwKLQkJCXNldEZpZ3VyZUxvY2F0aW9uKHBvaW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUmlnaHRJbnZhbGlkSWNvbkZpZ3VyZSBleHRlbmRzIExpbmtJY29uRmlndXJlIHsKLQkJcHVibGljIFJpZ2h0SW52YWxpZEljb25GaWd1cmUoKSB7Ci0JCQlzdXBlcihudWxsKTsKLQkJCVBvaW50TGlzdCBwb2ludHMgPSBuZXcgUG9pbnRMaXN0KCk7Ci0KLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDUsIDQgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgNywgMCArIHZlcnRpY2FsQnVmZmVyKSk7CS8vIHRvcCBzbGFzaAotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgNSwgNCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0JCQlwb2ludHMuYWRkUG9pbnQobmV3IFBvaW50KGhvcml6b250YWxCdWZmZXIgKyAxMCwgNCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0KLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDEwLCAwICsgdmVydGljYWxCdWZmZXIpKTsKLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDE1LCA1ICsgdmVydGljYWxCdWZmZXIpKTsKLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDEwLCAxMCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0JCQlwb2ludHMuYWRkUG9pbnQobmV3IFBvaW50KGhvcml6b250YWxCdWZmZXIgKyAxMCwgNiArIHZlcnRpY2FsQnVmZmVyKSk7Ci0KLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDQsIDYgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMiwgMTAgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwkvLyBib3R0b20gc2xhc2gKLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDUsIDQgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCi0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotCQkJc2V0RmlsbCh0cnVlKTsKLQkJCXNldFBvaW50cyhwb2ludHMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgcG9pbnQpIHsKLQkJCXN1cGVyLnNldExvY2F0aW9uKHBvaW50KTsKLQkJCXNldEZpZ3VyZUxvY2F0aW9uKHBvaW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVmFsaWRMaW5rSWNvbkZpZ3VyZSBleHRlbmRzIExlZnRJbnZhbGlkSWNvbkZpZ3VyZSB7Ci0JCXB1YmxpYyBWYWxpZExpbmtJY29uRmlndXJlKCkgewotCQkJUG9pbnRMaXN0IHBvaW50cyA9IG5ldyBQb2ludExpc3QoKTsKLQotCQkJLy8gRHJhdyB0aGUgYXJyb3cKLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDAsIDQgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMTUsIDQgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMTUsIDAgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMjAsIDUgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMTUsIDEwICsgdmVydGljYWxCdWZmZXIpKTsKLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDE1LCA2ICsgdmVydGljYWxCdWZmZXIpKTsKLQkJCXBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDAsIDYgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkJcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMCwgNCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0KLQkJCXNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0JCQlzZXRGaWxsKHRydWUpOwotCQkJc2V0UG9pbnRzKHBvaW50cyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9maWd1cmVzL0JveENvbXBvbmVudEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZmlndXJlcy9Cb3hDb21wb25lbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkYmMyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9maWd1cmVzL0JveENvbXBvbmVudEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgQm94Q29tcG9uZW50RmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0gIHB1YmxpYyBIZWFkaW5nRmlndXJlIGhlYWRpbmdGaWd1cmU7Ci0gIEZpZ3VyZSBjb250ZW50UGFuZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBpc1NlbGVjdGVkKQotICB7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5zZXRTZWxlY3RlZChpc1NlbGVjdGVkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzUmVhZE9ubHkoYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLSAgfQotCi0gIHB1YmxpYyBCb3hDb21wb25lbnRGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBoZWFkaW5nRmlndXJlID0gbmV3IEhlYWRpbmdGaWd1cmUoKTsKLSAgICBhZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0gICAgY29udGVudFBhbmUgPSBuZXcgTGlzdEZpZ3VyZSgpOwotICAgIGNvbnRlbnRQYW5lLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0gICAgYWRkKGNvbnRlbnRQYW5lKTsKLSAgfQotCi0gIHB1YmxpYyBGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRQYW5lOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldExhYmVsKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlLmdldExhYmVsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBGaWd1cmUgZ2V0SGVhZGluZ0ZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGluZ0ZpZ3VyZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvQ29tcG9uZW50UmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZmlndXJlcy9Db21wb25lbnRSZWZlcmVuY2VDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjAyYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZmlndXJlcy9Db21wb25lbnRSZWZlcmVuY2VDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5Z29uRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24gZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb24KLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGlnaGxpZ2h0ID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sb3IgYWN0aXZlQ29ubmVjdGlvbiA9IENvbG9yQ29uc3RhbnRzLmJsYWNrOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGluYWN0aXZlQ29ubmVjdGlvbiA9IG5ldyBDb2xvcihudWxsLCAxOTgsIDE5NSwgMTk4KTsKLQotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIENvbXBvbmVudFJlZmVyZW5jZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRUYXJnZXREZWNvcmF0aW9uKG5ldyBQb2x5Z29uRGVjb3JhdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Sb3V0ZXIoQ29ubmVjdGlvblJvdXRlciBjcikKLSAgewotICAgIGlmIChjciAhPSBudWxsICYmIGdldENvbm5lY3Rpb25Sb3V0ZXIoKSAhPSBudWxsKS8vIFRPRE86Li4uLiAmJiAhKGdldENvbm5lY3Rpb25Sb3V0ZXIoKSBpbnN0YW5jZW9mIEJPTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcikpCi0gICAgICBzdXBlci5zZXRDb25uZWN0aW9uUm91dGVyKGNyKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgaGlnaGxpZ2h0IHN0YXR1cy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGlnaGxpZ2h0ZWQoKQotICB7Ci0gICAgcmV0dXJuIGhpZ2hsaWdodDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gaGlnaGxpZ2h0Ci0gICAqICAgICAgICAgIFRoZSBoaWdobGlnaHQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0KGJvb2xlYW4gaGlnaGxpZ2h0KQotICB7Ci0gICAgdGhpcy5oaWdobGlnaHQgPSBoaWdobGlnaHQ7Ci0gICAgc2V0Rm9yZWdyb3VuZENvbG9yKGhpZ2hsaWdodCA/IGFjdGl2ZUNvbm5lY3Rpb24gOiBpbmFjdGl2ZUNvbm5lY3Rpb24pOwotICAgIHNldE9wYXF1ZShoaWdobGlnaHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9maWd1cmVzL0hlYWRpbmdGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvSGVhZGluZ0ZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGQ1YmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvSGVhZGluZ0ZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotcHVibGljIGNsYXNzIEhlYWRpbmdGaWd1cmUgZXh0ZW5kcyBGaWd1cmUKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBoZWFkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyMjQsIDIzMywgMjQ2KTsKLSAgTGFiZWwgbGFiZWw7Ci0gIHByb3RlY3RlZCBDb2xvcltdIGdyYWRpZW50Q29sb3IgPSB7Q29sb3JDb25zdGFudHMud2hpdGUsICAKLSAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSwKLSAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSwKLSAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmdyYXl9OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHkgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBIZWFkaW5nRmlndXJlKCkKLSAgewotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMikpOwotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICB0b29sYmFyTGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KFRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLSAgICBzZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotICAgIGFkZChsYWJlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gaXNTZWxlY3RlZCkKLSAgewotICAgIHRoaXMuaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzUmVhZE9ubHkoYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsKLSAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0vLyAgICBDb2xvciBvbGRGb3JlZ3JvdW5kID0gIGdyYXBoaWNzLmdldEZvcmVncm91bmRDb2xvcigpOwotICAgIC8vIEZpbGwgZm9yIHRoZSBoZWFkZXIgc2VjdGlvbgotICAgIC8vCi0gICAgUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgLy9ncmFwaGljcy5maWxsUmVjdGFuZ2xlKHIueCsxLCByLnkrMSwgci53aWR0aC0xLCBiYXJZY29vcmRpbmF0ZSAtIHIueSAtIDEpOwotICAgIENvbG9yIGdyYWRpZW50MSA9IGlzUmVhZE9ubHkgPyBncmFkaWVudENvbG9yWzFdIDogaGVhZGVyQ29sb3I7Ci0gICAgaWYgKGlzU2VsZWN0ZWQgJiYgaXNSZWFkT25seSkgZ3JhZGllbnQxID0gZ3JhZGllbnRDb2xvclszXTsKLSAgICBlbHNlIGlmIChpc1NlbGVjdGVkICYmICFpc1JlYWRPbmx5KSBncmFkaWVudDEgPSBncmFkaWVudENvbG9yWzJdOwotICAgIENvbG9yIGdyYWRpZW50MiA9IGdyYWRpZW50Q29sb3JbMF07Ci0gICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGdyYWRpZW50MSk7Ci0gICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKGdyYWRpZW50Mik7Ci0gICAgUmVjdGFuZ2xlIGxhYmVsQm91bmRzID0gbGFiZWwuZ2V0Qm91bmRzKCk7Ci0gICAgZ3JhcGhpY3MuZmlsbEdyYWRpZW50KHIueCsxLCByLnkrMSwgci53aWR0aC0yLCBsYWJlbEJvdW5kcy5oZWlnaHQgLCB0cnVlKTsKLSAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZGFya0dyYXkpOwotICAgIGxhYmVsLnBhaW50KGdyYXBoaWNzKTsgICAgCi0gICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGlzU2VsZWN0ZWQgPyBncmFkaWVudENvbG9yWzFdIDogZ3JhZGllbnRDb2xvclszXSk7Ci0gICAgLy9ncmFwaGljcy5kcmF3TGluZShyLngrMSwgci55ICsgMTUsIHIueCArIHIud2lkdGgsIHIueSArIDE1KTsKLSAgICAvL2dyYXBoaWNzLmRyYXdMaW5lKHIueCsxLCByLnkgKyBsYWJlbEJvdW5kcy5oZWlnaHQsIHIueCArIHIud2lkdGgsIHIueSArIGxhYmVsQm91bmRzLmhlaWdodCk7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvTGlua0ljb25GaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvTGlua0ljb25GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwN2EzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9maWd1cmVzL0xpbmtJY29uRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5Z29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLQotcHVibGljIGNsYXNzIExpbmtJY29uRmlndXJlIGV4dGVuZHMgUG9seWdvbiB7Ci0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0OwotCXByaXZhdGUgUG9pbnQgZmlnTG9jYXRpb247Ci0JICBwcml2YXRlIFBvaW50TGlzdCBwb2ludHMgPSBuZXcgUG9pbnRMaXN0KCk7Ci0JICBwdWJsaWMgaW50IGhvcml6b250YWxCdWZmZXIgPSA1OwotCSAgcHVibGljIGludCB2ZXJ0aWNhbEJ1ZmZlciA9IDc7Ci0KLQkgIHB1YmxpYyBMaW5rSWNvbkZpZ3VyZShBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCSAgZWRpdFBhcnQgPSBlcDsKLQkJICAKLQkJICAvLyBEcmF3IHRoZSBhcnJvdwotCQkgIHBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDAsIDQgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkgIHBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDksIDQgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkgIHBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDksIDAgKyB2ZXJ0aWNhbEJ1ZmZlcikpOwotCQkgIHBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoaG9yaXpvbnRhbEJ1ZmZlciArIDE0LCA1ICsgdmVydGljYWxCdWZmZXIpKTsKLQkJICBwb2ludHMuYWRkUG9pbnQobmV3IFBvaW50KGhvcml6b250YWxCdWZmZXIgKyA5LCAxMCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0JCSAgcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgOSwgNiArIHZlcnRpY2FsQnVmZmVyKSk7Ci0JCSAgcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMCwgNiArIHZlcnRpY2FsQnVmZmVyKSk7Ci0JCSAgcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChob3Jpem9udGFsQnVmZmVyICsgMCwgNCArIHZlcnRpY2FsQnVmZmVyKSk7Ci0JCSAgCi0JCSAgc2V0RmlsbCh0cnVlKTsJICAKLQkJICBzZXRQb2ludHMocG9pbnRzKTsKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJICBzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHNldEZpZ3VyZUxvY2F0aW9uKFBvaW50IG5ld1N0YXJ0aW5nTG9jYXRpb24pIHsKLQkJICBpbnQgZHkgPSBuZXdTdGFydGluZ0xvY2F0aW9uLnk7Ci0KLQkJICBpZiAoZmlnTG9jYXRpb24gIT0gbnVsbCkgewotCQkJICBkeSA9IG5ld1N0YXJ0aW5nTG9jYXRpb24ueSAtIGZpZ0xvY2F0aW9uLnk7Ci0JCSAgfQotCi0JCSAgLy8gVXBkYXRlIHRoZSBwb2ludHMKLQkJICBQb2ludExpc3QgbmV3UG9pbnRzID0gbmV3IFBvaW50TGlzdCgpOwotCQkgIFBvaW50TGlzdCBwTGlzdCA9IGdldFBvaW50cygpOwotCQkgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwTGlzdC5zaXplKCk7IGluZGV4KyspIHsKLQkJCSAgUG9pbnQgcG9pbnQgPSBwTGlzdC5nZXRQb2ludChpbmRleCk7Ci0JCQkgIC8vIEFkZCA1IGZvciB0aGUgcGFkZGluZwotCQkJICBQb2ludCBuZXdQb2ludCA9IG5ldyBQb2ludChwb2ludC54ICsgaG9yaXpvbnRhbEJ1ZmZlciwgcG9pbnQueSArIGR5KTsKLQkJCSAgbmV3UG9pbnRzLmFkZFBvaW50KG5ld1BvaW50KTsKLQkJICB9Ci0JCSAgc2V0UG9pbnRzKG5ld1BvaW50cyk7Ci0KLQkJICBmaWdMb2NhdGlvbiA9IG5ld1N0YXJ0aW5nTG9jYXRpb247Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHByaW1UcmFuc2xhdGUoaW50IGR4LCBpbnQgZHkpIHsKLQkJCWJvdW5kcy54ICs9IGR4OwotCQkJYm91bmRzLnkgKz0gZHk7Ci0JCQkKLQkJCVBvaW50TGlzdCBwTGlzdCA9IGdldFBvaW50cygpOwotCQkJUG9pbnRMaXN0IG5ld0xpc3QgPSBuZXcgUG9pbnRMaXN0KCk7Ci0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQkJUG9pbnQgcG9pbnQgPSBwTGlzdC5nZXRQb2ludChpbmRleCk7Ci0JCQkJUG9pbnQgbmV3UG9pbnQgPSBuZXcgUG9pbnQocG9pbnQueCArIGR4LCBwb2ludC55KTsKLQkJCQluZXdMaXN0LmFkZFBvaW50KG5ld1BvaW50KTsKLQkJCX0KLQkJCXNldFBvaW50cyhuZXdMaXN0KTsKLQkJCQotCQkJaWYgKHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSkgewotCQkJCWZpcmVDb29yZGluYXRlU3lzdGVtQ2hhbmdlZCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCSAgCi0JICBwdWJsaWMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRBc3NvY2lhdGVkRWRpdFBhcnQoKSB7Ci0JCSAgcmV0dXJuIGVkaXRQYXJ0OwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vZmlndXJlcy9MaXN0RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9maWd1cmVzL0xpc3RGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4NTYzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9maWd1cmVzL0xpc3RGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotcHVibGljIGNsYXNzIExpc3RGaWd1cmUgZXh0ZW5kcyBGaWd1cmUKLXsKLSAgYm9vbGVhbiBpc09wYXF1ZSA9IGZhbHNlOwotICBib29sZWFuIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICBib29sZWFuIHBhaW50Rmlyc3RMaW5lID0gdHJ1ZTsKLSAgCi0gIHB1YmxpYyBMaXN0RmlndXJlKGJvb2xlYW4gaXNIb3Jpem9udGFsKQotICB7Ci0gICAgdGhpcy5pc0hvcml6b250YWwgPSBpc0hvcml6b250YWw7IAotICB9Ci0gIAotICBwdWJsaWMgTGlzdEZpZ3VyZSgpCi0gIHsKLSAgICB0aGlzKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICB7Ci0gICAgc3VwZXIucGFpbnQoZ3JhcGhpY3MpOwotICAgIGJvb2xlYW4gaXNGaXJzdCA9IHRydWU7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRmlndXJlIGZpZ3VyZSA9IChGaWd1cmUpIGkubmV4dCgpOwotICAgICAgaWYgKGlzRmlyc3QgJiYgIXBhaW50Rmlyc3RMaW5lKQotICAgICAgewotICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgICB7ICAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShyLngsIHIueSwgci54LCByLnkgKyByLmhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShyLngsIHIueSwgci54ICsgci53aWR0aCwgci55KTsKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkKLSAgewotICAgIHJldHVybiBpc09wYXF1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9wYXF1ZShib29sZWFuIGlzT3BhcXVlKQotICB7Ci0gICAgdGhpcy5pc09wYXF1ZSA9IGlzT3BhcXVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNQYWludEZpcnN0TGluZSgpCi0gIHsKLSAgICByZXR1cm4gcGFpbnRGaXJzdExpbmU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYWludEZpcnN0TGluZShib29sZWFuIHBhaW50Rmlyc3RMaW5lKQotICB7Ci0gICAgdGhpcy5wYWludEZpcnN0TGluZSA9IHBhaW50Rmlyc3RMaW5lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9maWd1cmVzL01vZGVsRGlhZ25vc3RpY0luZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvTW9kZWxEaWFnbm9zdGljSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTYwZTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2ZpZ3VyZXMvTW9kZWxEaWFnbm9zdGljSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qCi0gKiBBIE1vZGVsRGlhZ25vc3RpY0luZm8gb2JqZWN0IGNvbnRhaW5zICJhZGRpdGlvbmFsIiBpbmZvcm1hdGlvbiBhYm91dCBhIG1vZGVsIG9iamVjdC4KLSAqIEl0IGlzIHBhc3NlZCBmcm9tIGEgbW9kZWwgKGZhY2FkZSkgb2JqZWN0IHRvIGFuIEVkaXRQYXJ0LiAgVGhlIEVkaXRQYXJ0IHVzZXMgdGhlIE1vZGVsRGlhZ25vc3RpY0luZm8KLSAqIG9iamVjdCB0byBkaXNwbGF5IGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSAoZm9yIGV4YW1wbGUsIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUgbW9kZWwKLSAqIG9iamVjdCBpcyBpbiBzb21lIHdheSBpbnZhbGlkLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxEaWFnbm9zdGljSW5mbyB7Ci0JcHVibGljIHN0YXRpYyBpbnQgSU5GT1JNQVRJT05BTF9UWVBFID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCBFUlJPUl9UWVBFID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBXQVJOSU5HX1RZUEUgPSAyOwotCQotCXByaXZhdGUgaW50IHR5cGUgPSAxOwotCXByaXZhdGUgU3RyaW5nIHRleHQgPSAiIjsKLQlwcml2YXRlIENvbG9yIHRleHRDb2xvcjsKLQkKLQlwdWJsaWMgTW9kZWxEaWFnbm9zdGljSW5mbyhTdHJpbmcgdHh0LCBpbnQgaW5mb1R5cGUsIENvbG9yIGNvbG9yKSB7Ci0JCXRleHQgPSB0eHQ7Ci0JCXR5cGUgPSBpbmZvVHlwZTsKLQkJdGV4dENvbG9yID0gY29sb3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uVGV4dChTdHJpbmcgdHh0KSB7Ci0JCXRleHQgPSB0eHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uVGV4dENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCXRleHRDb2xvciA9IGNvbG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBpbmZvVHlwZSkgewotCQl0eXBlID0gaW5mb1R5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHVibGljIENvbG9yIGdldERlc2NyaXB0aW9uVGV4dENvbG9yKCkgewotCQlpZiAodGV4dENvbG9yICE9IG51bGwpIHsKLQkJCXJldHVybiB0ZXh0Q29sb3I7Ci0JCX0KLQkJCi0JCWlmICh0eXBlID09IEVSUk9SX1RZUEUpIHsKLQkJCXJldHVybiBDb2xvckNvbnN0YW50cy5yZWQ7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBXQVJOSU5HX1RZUEUpIHsKLQkJCXJldHVybiBDb2xvckNvbnN0YW50cy5saWdodEdyYXk7Ci0JCX0KLQkJCi0JCXJldHVybiBDb2xvckNvbnN0YW50cy5ibGFjazsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9sYXlvdXRzL0JpbmRpbmdDb2x1bW5MYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2xheW91dHMvQmluZGluZ0NvbHVtbkxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjBhYzc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2xheW91dHMvQmluZGluZ0NvbHVtbkxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmxheW91dHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMuQmluZGluZ0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JSW50ZXJmYWNlOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ0NvbHVtbkxheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17Ci0gIEVkaXRQYXJ0IGJpbmRpbmdDb2x1bW5FZGl0UGFydDsKLSAgCi0gIHB1YmxpYyBCaW5kaW5nQ29sdW1uTGF5b3V0KEVkaXRQYXJ0IGJpbmRpbmdDb2x1bW5FZGl0UGFydCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5iaW5kaW5nQ29sdW1uRWRpdFBhcnQgPSBiaW5kaW5nQ29sdW1uRWRpdFBhcnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBjb250YWluZXIsIGludCB3SGludCwgaW50IGhIaW50KQotICB7Ci0gICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjb250YWluZXIuZ2V0Q2xpZW50QXJlYSgpOwotICAgIERpbWVuc2lvbiBkID0gY2FsY3VsYXRlQ2hpbGRyZW5TaXplKGNvbnRhaW5lci5nZXRDaGlsZHJlbigpLCB3SGludCwgaEhpbnQpOwotICAgIGQuaGVpZ2h0ID0gTWF0aC5tYXgoZC5oZWlnaHQsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLSAgICByZXR1cm4gZDsKLSAgfQotCi0gIHByaXZhdGUgRGltZW5zaW9uIGNhbGN1bGF0ZUNoaWxkcmVuU2l6ZShMaXN0IGNoaWxkcmVuLCBpbnQgd0hpbnQsIGludCBoSGludCkKLSAgewotICAgIERpbWVuc2lvbiBjaGlsZFNpemU7Ci0gICAgSUZpZ3VyZSBjaGlsZDsKLSAgICBpbnQgaGVpZ2h0ID0gMCwgd2lkdGggPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotICAgICAgaGVpZ2h0ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICBoZWlnaHQgKz0gODA7Ci0gICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IERpbWVuc2lvbihNYXRoLm1heCh3aWR0aCwgMTUwKSwgaGVpZ2h0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGNvbnRhaW5lcikKLSAgewotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJCaW5kaW5nQ29sdW1uTGF5b3V0LmxheW91dCgpIiArIGNvbnRhaW5lci5nZXRDaGlsZHJlbigpLnNpemUoKSk7Ci0gICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjb250YWluZXIuZ2V0Q2xpZW50QXJlYSgpOwotICAgIFJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgpOwotICAgIHIueCA9IGNsaWVudEFyZWEueCArIDUwOwotICAgIHIueSA9IGNsaWVudEFyZWEueTsKLSAgICBpbnQgdXNlZCA9IDA7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRmlndXJlIGNoaWxkID0gKEZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gZCA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoLTEsIC0xKTsKLSAgICAgIHIud2lkdGggPSBkLndpZHRoOwotICAgICAgci5oZWlnaHQgPSBkLmhlaWdodDsKLSAgICAgIAotICAgICAgY2hpbGQuc2V0Qm91bmRzKHIpOwotICAgICAgdXNlZCArPSAzMDsKLSAgICAgIHVzZWQgKz0gci5oZWlnaHQ7Ci0gICAgICAKLSAgICAgIElGaWd1cmUgaW50ZWZhY2VGaWd1cmUgPSBnZXRJbnRlcmZhY2VGaWd1cmVGb3JFeHBhbmRlZEVkaXRQYXJ0RmlndXJlKGNoaWxkKTsKLSAgICAgIGlmIChpbnRlZmFjZUZpZ3VyZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgYiA9IGludGVmYWNlRmlndXJlLmdldEJvdW5kcygpOwotICAgICAgICBpbnQgd2lkdGggPSAzMDsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoYi54IC0gd2lkdGgsIGIueSwgd2lkdGgsIGIuaGVpZ2h0KSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHIueSArPSBkLmhlaWdodDsKLSAgICAgIHIueSArPSA4MDsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKEJpbmRpbmdFZGl0UGFydCBiaW5kaW5nRWRpdFBhcnQsIGJvb2xlYW4gaXNFeHBhbmRlZCkKLSAgewotICAgIC8vIEZpcnN0IHJ1biB0aHJvdWdoIGFsbCBvZiB0aGUgYmluZGluZ3MgYXJlIGFyZSBleHBhbmRlZAotICAgIC8vIHRvIGVuc3VyZSBhdCBtb3N0IG9uZSBiaW5kaW5nIGlzIGV4cGFuZGVkIGZvciBlYWNoIGludGVyZmFjZSBzaW5jZQotICAgIC8vIHdlIG1heSBuZWVkIHRvIGNvbGxhcHNlIGEgYmluZGluZyBpbiBvcmRlciB0byBleHBhbmQgdGhpcyBvbmUuCi0gICAgLy8KLSAgICBJSW50ZXJmYWNlIGludGVyZmF6ZSA9IGdldEludGVyZmFjZShiaW5kaW5nRWRpdFBhcnQpOyAgICAKLSAgICBpZiAoaW50ZXJmYXplICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBiaW5kaW5nRWRpdFBhcnQuc2V0RXhwYW5kZWQoaXNFeHBhbmRlZCk7Ci0gICAgICBpZiAoaXNFeHBhbmRlZCkKLSAgICAgIHsgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nQ29sdW1uRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ0VkaXRQYXJ0IG90aGVyQmluZGluZ0VkaXRQYXJ0ID0gKEJpbmRpbmdFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgICBpZiAob3RoZXJCaW5kaW5nRWRpdFBhcnQgIT0gYmluZGluZ0VkaXRQYXJ0ICYmCi0gICAgICAgICAgICAgIGludGVyZmF6ZSA9PSBnZXRJbnRlcmZhY2Uob3RoZXJCaW5kaW5nRWRpdFBhcnQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG90aGVyQmluZGluZ0VkaXRQYXJ0LnNldEV4cGFuZGVkKGZhbHNlKTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICB9Ci0gIAotICBwcml2YXRlIElGaWd1cmUgZ2V0SW50ZXJmYWNlRmlndXJlRm9yRXhwYW5kZWRFZGl0UGFydEZpZ3VyZShGaWd1cmUgZWRpdFBhcnRGaWd1cmUpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nQ29sdW1uRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEJpbmRpbmdFZGl0UGFydCBiaW5kaW5nRWRpdFBhcnQgPSAoQmluZGluZ0VkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgaWYgKGJpbmRpbmdFZGl0UGFydC5pc0V4cGFuZGVkKCkgJiYgYmluZGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpID09IGVkaXRQYXJ0RmlndXJlKQotICAgICAgewotICAgICAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGludGVyZmFjZUVkaXRQYXJ0ID0gZ2V0TWF0Y2hpbmdFZGl0UGFydChnZXRJbnRlcmZhY2UoYmluZGluZ0VkaXRQYXJ0KSk7Ci0gICAgICAgIGlmIChpbnRlcmZhY2VFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGludGVyZmFjZUVkaXRQYXJ0LmdldEZpZ3VyZSgpOwotICAgICAgICB9ICAgICAgICAgIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIElJbnRlcmZhY2UgZ2V0SW50ZXJmYWNlKEJpbmRpbmdFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIElCaW5kaW5nIGJpbmRpbmcgPSAoSUJpbmRpbmcpZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICByZXR1cm4gYmluZGluZy5nZXRJbnRlcmZhY2UoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldE1hdGNoaW5nRWRpdFBhcnQoSUludGVyZmFjZSBpbnRlcmZhemUpCi0gIHsKLSAgICByZXR1cm4oQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCliaW5kaW5nQ29sdW1uRWRpdFBhcnQuZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldChpbnRlcmZhemUpOyAgICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2xheW91dHMvQmluZGluZ0NvbnRlbnRMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2xheW91dHMvQmluZGluZ0NvbnRlbnRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxYjM4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9sYXlvdXRzL0JpbmRpbmdDb250ZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24ubGF5b3V0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5CaW5kaW5nRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMuSU5hbWVkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQmluZGluZ0NvbnRlbnRQbGFjZUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JT3BlcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBsYXlvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBiaW5kaW5nICdydWxlcicgZGlzcGxheWVkCi0gKiB0byB0aGUgbGVmdCBzaWRlIG9mIGFuIGludGVyZmFjZS4gVGhlIGNvbnRlbnRzIGFyZSBhbGlnbmVkIHdpdGggdGhlIGludGVyZmFjZQotICogZmlndXJlcyBzbyB0aGF0IGNvcnJlc3BvZGluZyBiaW5kaW5nIGFuZCBpbnRlcmZhY2UgY29uc3RydWN0cyBhcmUgc2lkZSBieSBzaWRlLgotICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ0NvbnRlbnRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAotewotICBCaW5kaW5nRWRpdFBhcnQgYmluZGluZ0VkaXRQYXJ0OwotICAKLSAgcHVibGljIEJpbmRpbmdDb250ZW50TGF5b3V0KEJpbmRpbmdFZGl0UGFydCBiaW5kaW5nRWRpdFBhcnQpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdFZGl0UGFydCA9IGJpbmRpbmdFZGl0UGFydDsKLSAgfQotCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIGNvbnRhaW5lciwgaW50IHdIaW50LCBpbnQgaEhpbnQpCi0gIHsKLSAgICBpZiAoYmluZGluZ0VkaXRQYXJ0LmlzRXhwYW5kZWQoKSkKLSAgICB7ICAKLSAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29udGFpbmVyLmdldENsaWVudEFyZWEoKTsKLSAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKDAsMCk7Ci0gICAgfSAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBjb250YWluZXIpCi0gIHsgICAgIAotICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29udGFpbmVyLmdldENsaWVudEFyZWEoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZEVkaXRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGkubmV4dCgpOwotICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjb3JyZXNwb25kaW5nRWRpdFBhcnQgPSBudWxsOwotICAgICAgT2JqZWN0IG1vZGVsID0gY2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUJpbmRpbmdPcGVyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIElPcGVyYXRpb24gb3BlcmF0aW9uID0gKChJQmluZGluZ09wZXJhdGlvbiltb2RlbCkuZ2V0T3BlcmF0aW9uKCk7Ci0gICAgICAgIGNvcnJlc3BvbmRpbmdFZGl0UGFydCA9IGdldEVkaXRQYXJ0KG9wZXJhdGlvbik7ICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQmluZGluZ01lc3NhZ2VSZWZlcmVuY2UpCi0gICAgICB7Ci0gICAgICAgIElNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UgPSAoKElCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSltb2RlbCkuZ2V0TWVzc2FnZVJlZmVyZW5jZSgpOwotICAgICAgICBjb3JyZXNwb25kaW5nRWRpdFBhcnQgPSBnZXRFZGl0UGFydChtZXNzYWdlUmVmZXJlbmNlKTsgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEJpbmRpbmdDb250ZW50UGxhY2VIb2xkZXIpIHsKLSAgICAJICBPYmplY3QgY29ycmVzcG9uZGluZ01vZGVsID0gKChCaW5kaW5nQ29udGVudFBsYWNlSG9sZGVyKSBtb2RlbCkuZ2V0TW9kZWwoKTsKLSAgICAJICBjb3JyZXNwb25kaW5nRWRpdFBhcnQgPSBnZXRFZGl0UGFydChjb3JyZXNwb25kaW5nTW9kZWwpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoY29ycmVzcG9uZGluZ0VkaXRQYXJ0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElGaWd1cmUgZmlndXJlID0gY29ycmVzcG9uZGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpOyAgICAgICAKLSAgICAgICAgaWYgKGNvcnJlc3BvbmRpbmdFZGl0UGFydCBpbnN0YW5jZW9mIElOYW1lZEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgZmlndXJlID0gKChJTmFtZWRFZGl0UGFydCljb3JyZXNwb25kaW5nRWRpdFBhcnQpLmdldExhYmVsRmlndXJlKCk7ICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgICAgICBSZWN0YW5nbGUgbmV3Qm91bmRzID0gbmV3IFJlY3RhbmdsZShjbGllbnRBcmVhLngsIGJvdW5kcy55LCBjbGllbnRBcmVhLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgY2hpbGRFZGl0UGFydC5nZXRGaWd1cmUoKS5zZXRCb3VuZHMobmV3Qm91bmRzKTsKLSAgICAgIH0gIAotICAgIH0KLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRFZGl0UGFydChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWJpbmRpbmdFZGl0UGFydC5nZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KG1vZGVsKTsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydDsgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2Rlc2lnbi9sYXlvdXRzL0JpbmRpbmdMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2xheW91dHMvQmluZGluZ0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ4ZTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2xheW91dHMvQmluZGluZ0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24ubGF5b3V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLkJpbmRpbmdFZGl0UGFydDsKLQotLy8ganVzdCBhIHRvb2xiYXIgbGF5b3V0IHdpdGggYSBtaW5vciB0d2VhayB0byBlbnN1cmUgdGhlIGxhc3QgZmlndXJlIGZpbGxzCi0vLyB0aGUgZW50aXJlIGF2YWlsYWJsZSBzcGFjZQotcHVibGljIGNsYXNzIEJpbmRpbmdMYXlvdXQgZXh0ZW5kcyBUb29sYmFyTGF5b3V0Ci17Ci0gIEJpbmRpbmdFZGl0UGFydCBlZGl0UGFydDsKLSAgCi0gIHB1YmxpYyBCaW5kaW5nTGF5b3V0KEJpbmRpbmdFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIGNvbnRhaW5lciwgaW50IHdIaW50LCBpbnQgaEhpbnQpCi0gIHsKLSAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmNhbGN1bGF0ZVByZWZlcnJlZFNpemUoY29udGFpbmVyLCB3SGludCwgaEhpbnQpOwotICAgIC8vUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjb250YWluZXIuZ2V0Q2xpZW50QXJlYSgpOwotICAgIC8vZC53aWR0aCA9IE1hdGgubWF4KGQud2lkdGgsIGNsaWVudEFyZWEud2lkdGgpOwotICAgIC8vZC5oZWlnaHQgPSBNYXRoLm1heChkLmhlaWdodCwgY2xpZW50QXJlYS5oZWlnaHQpOwotICAgIHJldHVybiBkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBjb250YWluZXIpCi0gIHsKLSAgICBzdXBlci5sYXlvdXQoY29udGFpbmVyKTsKLSAgICBpZiAoZWRpdFBhcnQuaXNFeHBhbmRlZCgpKQotICAgIHsgIAotICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjb250YWluZXIuZ2V0Q2xpZW50QXJlYSgpOyAgICAKLSAgICAgIExpc3QgY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGlmIChjaGlsZHJlbi5zaXplKCkgPiAxKQotICAgICAgewotICAgICAgICBGaWd1cmUgaGVhZGVyID0gKEZpZ3VyZSljaGlsZHJlbi5nZXQoMCk7ICAgICAgICAKLSAgICAgICAgRmlndXJlIGNvbnRlbnRQYW5lID0gKEZpZ3VyZSljaGlsZHJlbi5nZXQoY2hpbGRyZW4uc2l6ZSgpIC0gMSk7Ci0gICAgICAgIGlmIChjb250ZW50UGFuZS5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApCi0gICAgICAgIHsgIAotICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBjb250ZW50UGFuZS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICBib3VuZHMuaGVpZ2h0ID0gY2xpZW50QXJlYS5oZWlnaHQgLSBoZWFkZXIuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2xheW91dHMvQ29sdW1uRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vbGF5b3V0cy9Db2x1bW5EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTU4ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vbGF5b3V0cy9Db2x1bW5EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5sYXlvdXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29sdW1uRGF0YQotewotICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICBjbGFzcyBFbnRyeQotICB7Ci0gICAgaW50IHdpZHRoID0gMDsKLSAgICBpbnQgd2VpZ2h0ID0gMTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY2xlYXJDb2x1bW5XaWR0aHMoKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSlpLm5leHQoKTsKLSAgICAgIGVudHJ5LndpZHRoID0gMDsKLSAgICB9ICAKLSAgfSAgCi0gIAotICBwcml2YXRlIEVudHJ5IGxvb2t1cE9yQ3JlYXRlQ29sdW1uRW50cnkoU3RyaW5nIGlkZW50aWZpZXIpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSltYXAuZ2V0KGlkZW50aWZpZXIpOwotICAgIGlmIChlbnRyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIGVudHJ5ID0gbmV3IEVudHJ5KCk7Ci0gICAgICBtYXAucHV0KGlkZW50aWZpZXIsIGVudHJ5KTsKLSAgICB9ICAKLSAgIHJldHVybiBlbnRyeTsgCi0gIH0gIAotICAKLSAgdm9pZCBzdHJldGNoQ29sdW1uV2lkdGhJZk5lZWRlZChTdHJpbmcgaWRlbnRpZmllciwgaW50IHdpZHRoKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSBsb29rdXBPckNyZWF0ZUNvbHVtbkVudHJ5KGlkZW50aWZpZXIpOwotICAgIGVudHJ5LndpZHRoID0gTWF0aC5tYXgoZW50cnkud2lkdGgsIHdpZHRoKTsKLSAgfQotICAKLSAgaW50IGdldENvbHVtbldpZHRoKFN0cmluZyBpZGVudGlmaWVyKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSAoRW50cnkpbWFwLmdldChpZGVudGlmaWVyKTsKLSAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZW50cnkud2lkdGg7Ci0gICAgfSAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAwOy8vaG1tIHNob3VsZCB3ZSByZXR1cm4gLTEgPwotICAgIH0gIAotICB9Ci0gIAotICBpbnQgZ2V0Q29sdW1uV2VpZ2h0KFN0cmluZyBpZGVudGlmaWVyKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSAoRW50cnkpbWFwLmdldChpZGVudGlmaWVyKTsKLSAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZW50cnkud2VpZ2h0OwotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29sdW1uV2VpZ2h0KFN0cmluZyBpZGVudGlmaWVyLCBpbnQgd2VpZ2h0KQotICB7Ci0gICAgRW50cnkgZW50cnkgPSBsb29rdXBPckNyZWF0ZUNvbHVtbkVudHJ5KGlkZW50aWZpZXIpOwotICAgIGVudHJ5LndlaWdodCA9IHdlaWdodDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vbGF5b3V0cy9Sb3dMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZGVzaWduL2xheW91dHMvUm93TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yzc0MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9kZXNpZ24vbGF5b3V0cy9Sb3dMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5sYXlvdXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotcHVibGljIGNsYXNzIFJvd0xheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17Ci0gIC8vIGxheW91dCBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJlbnQgY29udGV4dAotICAvLyBhbnkgbGF5b3V0IG1hbmFnZXIgdW5kZXIgdGhlIHBhcmVudCBjb250ZXh0IGlzIGNvbm5lY3RlZAotICAvLyBjb2x1bW4gcm93cyBhcmUgbWFpbnRhaW5lZCBhY2Nyb3NzIGNvbnRhaW5lciBib3VuZGFyaWVzICAKLSAgcHJvdGVjdGVkIENvbHVtbkRhdGEgY29sdW1uRGF0YTsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgZmlndXJlVG9Db250c3RyYWludE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICBwdWJsaWMgUm93TGF5b3V0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0KLSAgLy8gdGhpcyBtZXRob2QgY29tcHV0ZXMgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCB0byBkaXNwbGF5IHRoZSBmaWd1cmVzCi0gIC8vCi0gIHByaXZhdGUgRGltZW5zaW9uIGNhbGN1bGF0ZUNoaWxkcmVuU2l6ZShJRmlndXJlIGNvbnRhaW5lciwgTGlzdCBjaGlsZHJlbiwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gcHJlZmVycmVkKQotICB7Ci0gICAgRGltZW5zaW9uIGNoaWxkU2l6ZTsKLSAgICBJRmlndXJlIGNoaWxkOwotICAgIGludCBoZWlnaHQgPSAwOwotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgCi0gICAgLy9JUm93RmlndXJlIGZpZ3VyZSA9IChJUm93RmlndXJlKWNvbnRhaW5lcjsKLSAgICAKLSAgICAvLyBmb3IgZWFjaCBjZWxsIGluIHRoZSByb3cKLSAgICAvLwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgU3RyaW5nIGNvbHVtbklkZW5pZmllciA9IChTdHJpbmcpZ2V0Q29uc3RyYWludChjaGlsZCk7Ci0gICAgICAgICAgICAgCi0gICAgICAvLyBmaXJzdCB3ZSBjb21wdXRlIHRoZSBjaGlsZCBzaXplIHdpdGhvdXQgcmVnYXJkIGZvciBjb2x1bW5EYXRhCi0gICAgICAvLwotICAgICAgY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOy8vIDogY2hpbGQuZ2V0TWluaW11bVNpemUod0hpbnQsIGhIaW50KTsKLSAgICAgICAgCi0gICAgICAvLyBub3cgdGhhdCB0aGUgY29sdW1uRGF0YSBoYXMgYmVlbiBwb3B1bGF0ZWQgd2UgY2FuIGNvbnNpZGVyIGlmIHRoZSByb3cgbmVlZHMgdG8gYmUgbGFyZ2VyCi0gICAgICAvLwotICAgICAgaW50IGVmZmVjdGl2ZVdpZHRoID0gY2hpbGRTaXplLndpZHRoOwotICAgICAgaWYgKGNvbHVtbklkZW5pZmllciAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIGNvbHVtbkRhdGEuc3RyZXRjaENvbHVtbldpZHRoSWZOZWVkZWQoY29sdW1uSWRlbmlmaWVyLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgICBlZmZlY3RpdmVXaWR0aCA9IGNvbHVtbkRhdGEuZ2V0Q29sdW1uV2lkdGgoY29sdW1uSWRlbmlmaWVyKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoY2hpbGRTaXplLmhlaWdodCwgaGVpZ2h0KTsKLSAgICAgIHdpZHRoICs9IGVmZmVjdGl2ZVdpZHRoOwotICAgIH0gIAotICAgIHJldHVybiBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICB9Ci0gIAotICAKLSAgCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIGNvbnRhaW5lciwgaW50IHdIaW50LCBpbnQgaEhpbnQpCi0gIHsgICAgCi0gICAgTGlzdCBjaGlsZHJlbiA9IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotICAgIERpbWVuc2lvbiBwcmVmU2l6ZSA9IGNhbGN1bGF0ZUNoaWxkcmVuU2l6ZShjb250YWluZXIsIGNoaWxkcmVuLCB3SGludCwgaEhpbnQsIHRydWUpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJwcmVmZXJyZWRTaXplPSIgKyBwcmVmU2l6ZSk7Ci0gICAgcmV0dXJuIHByZWZTaXplOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgcGFyZW50KQotICB7Ci0gICAgLy8gbGF5b3V0IGEgdGFibGUgd2l0aCB0aGUgY29sdW1ucyBhbGlnbmVkICAgICAgCi0gICAgLy9JUm93RmlndXJlIHJvd0ZpZ3VyZSA9IChJUm93RmlndXJlKXBhcmVudDsgICAgCi0gICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOyAgIAotICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICBSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoKTsKLSAgICByLnggPSBjbGllbnRBcmVhLng7Ci0gICAgci55ID0gY2xpZW50QXJlYS55OwotICAgIHIuaGVpZ2h0ID0gY2xpZW50QXJlYS5oZWlnaHQ7Ci0gICAgCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBSZWN0YW5nbGVbXSBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlW2NoaWxkcmVuU2l6ZV07Ci0gICAgCi0gICAgLy8gZm9yIGVhY2ggY2VsbCBpbiB0aGUgcm93Ci0gICAgLy8KLSAgICBpbnQgcmVxdWlyZWRXaWR0aCA9IDA7Ci0gICAgaW50IHRvdGFsQ29sdW1uV2VpZ2h0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgLy9TdHJpbmcgY29sdW1uSWRlbmlmaWVyID0gZmlndXJlLmdldENvbHVtbklkZW50aWZpZXIoY2hpbGQpOyAgICAgICAgICAgICAKLSAgICAgIC8vIGZpcnN0IHdlIGNvbXB1dGUgdGhlIGNoaWxkIHNpemUgd2l0aG91dCByZWdhcmQgZm9yIGNvbHVtbkRhdGEKLSAgICAgIC8vCi0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgtMSwgLTEpOwotICAgICAgCi0gICAgICBpbnQgY29sdW1uV2lkdGggPSAtMTsKLSAgICAgIC8vU3RyaW5nIGNvbHVtbklkZW50aWZpZXIgPSByb3dGaWd1cmUuZ2V0Q29sdW1uSWRlbnRpZmllcihjaGlsZCk7Ci0gICAgICBTdHJpbmcgY29sdW1uSWRlbnRpZmllciA9IChTdHJpbmcpZ2V0Q29uc3RyYWludChjaGlsZCk7Ci0gICAgICBpZiAoY29sdW1uSWRlbnRpZmllciAhPSBudWxsKQotICAgICAgewotICAgICAgICAvL2NvbHVtbkRhdGEuc3RyZXRjaENvbHVtbldpZHRoSWZOZWVkZWQoY29sdW1uSWRlbnRpZmllciwgY2hpbGRTaXplLndpZHRoKTsgICAgICAgIAotICAgICAgICBjb2x1bW5XaWR0aCA9IGNvbHVtbkRhdGEuZ2V0Q29sdW1uV2lkdGgoY29sdW1uSWRlbnRpZmllcik7Ci0gICAgICAgIHRvdGFsQ29sdW1uV2VpZ2h0ICs9IGNvbHVtbkRhdGEuZ2V0Q29sdW1uV2VpZ2h0KGNvbHVtbklkZW50aWZpZXIpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY29sdW1uV2lkdGgoIiArIGNvbHVtbklkZW50aWZpZXIgKyAiKT0iICsgY29sdW1uV2lkdGgpOyAgICAgICAgCi0gICAgICB9ICAKLSAgICAgIHIud2lkdGggPSBNYXRoLm1heChjaGlsZFNpemUud2lkdGgsIGNvbHVtbldpZHRoKTsKLSAgICAgIHJlcXVpcmVkV2lkdGggKz0gci53aWR0aDsKLSAgICAgIGJvdW5kc1tpXSA9IG5ldyBSZWN0YW5nbGUocik7ICAgICAgCi0gICAgICByLnggKz0gci53aWR0aDsKLSAgICB9ICAgICAgICAgIAotICAgIGlmICh0b3RhbENvbHVtbldlaWdodCA8IDEpCi0gICAgewotICAgICAgdG90YWxDb2x1bW5XZWlnaHQgPSAxOwotICAgIH0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY2xpZW50QXJlYS53aWR0aD0iICsgY2xpZW50QXJlYS53aWR0aCArICIsICIgKyByLngpOwotICAgIGludCBleHRyYVdpZHRoID0gTWF0aC5tYXgoY2xpZW50QXJlYS53aWR0aCAtIHJlcXVpcmVkV2lkdGgsIDApOyAgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZXh0cmFXaWR0aD0iICsgZXh0cmFXaWR0aCArICIgdG90YWxDb2x1bW5XZWlnaHQ9IiArIHRvdGFsQ29sdW1uV2VpZ2h0KTsgIAotICAgIGludCBleHRyYVdpZHRoQWxsb2NhdGVkID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOyAgICAgIAotICAgICAgUmVjdGFuZ2xlIGIgPSBib3VuZHNbaV07ICAgIAotICAgICAgaWYgKGV4dHJhV2lkdGggPiAwKQotICAgICAgeyAgCi0gICAgICAgIFN0cmluZyBjb2x1bW5JZGVudGlmaWVyID0gKFN0cmluZylnZXRDb25zdHJhaW50KGNoaWxkKTsKLSAgICAgICAgaWYgKGNvbHVtbklkZW50aWZpZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgaW50IHdlaWdodCA9IGNvbHVtbkRhdGEuZ2V0Q29sdW1uV2VpZ2h0KGNvbHVtbklkZW50aWZpZXIpOwotICAgICAgICAgIGZsb2F0IGZyYWN0aW9uID0gKGZsb2F0KXdlaWdodCAvIChmbG9hdCl0b3RhbENvbHVtbldlaWdodDsKLSAgICAgICAgICBpbnQgZXh0cmFXaWR0aEZvckNoaWxkID0gKGludCkoZXh0cmFXaWR0aCAqIGZyYWN0aW9uKTsKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZXh0cmFXaWR0aEZvckNoaWxkKCIgKyBmcmFjdGlvbiArICIpPSIgKyBleHRyYVdpZHRoRm9yQ2hpbGQpOyAgICAgICAgCi0gICAgICAgICAgYi53aWR0aCArPSBleHRyYVdpZHRoRm9yQ2hpbGQ7ICAgICAgICAKLSAgICAgICAgICBiLnggKz0gZXh0cmFXaWR0aEFsbG9jYXRlZDsKLSAgICAgICAgICBleHRyYVdpZHRoQWxsb2NhdGVkICs9IGV4dHJhV2lkdGhGb3JDaGlsZDsKLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGIueCArPSBleHRyYVdpZHRoQWxsb2NhdGVkOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjaGlsZC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZShiKSk7ICAKLSAgICB9ICAKLSAgfQotCi0gIHB1YmxpYyBDb2x1bW5EYXRhIGdldENvbHVtbkRhdGEoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbkRhdGE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5EYXRhKENvbHVtbkRhdGEgY29sdW1uRGF0YSkKLSAgewotICAgIHRoaXMuY29sdW1uRGF0YSA9IGNvbHVtbkRhdGE7Ci0gIH0gICAgCi0gIAotICBwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnQoSUZpZ3VyZSBjaGlsZCkKLSAgewotICAgIHJldHVybiBmaWd1cmVUb0NvbnRzdHJhaW50TWFwLmdldChjaGlsZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnQoSUZpZ3VyZSBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpCi0gIHsKLSAgICBmaWd1cmVUb0NvbnRzdHJhaW50TWFwLnB1dChjaGlsZCwgY29uc3RyYWludCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKQotICB7Ci0gICAgLy9maWd1cmVUb0NvbnRzdHJhaW50TWFwLmNsZWFyKCk7Ci0gICAgLy90aGlzLmNvbHVtbkRhdGEuY2xlYXJDb2x1bW5XaWR0aHMoKTsKLSAgICBzdXBlci5pbnZhbGlkYXRlKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImludmFsaWRhdGUiKTsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lBU0RPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lBU0RPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwYjNkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JQVNET2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElBU0RPYmplY3QKLXsKLSAgICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBU0RPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcik7Ci0gICAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBU0RPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcik7Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lBU0RPYmplY3RMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSUFTRE9iamVjdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MjhjMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSUFTRE9iamVjdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZTsKLQotcHVibGljIGludGVyZmFjZSBJQVNET2JqZWN0TGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSUJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGI5Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSUJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJQmluZGluZyBleHRlbmRzIElOYW1lZE9iamVjdAotewotCXB1YmxpYyBJSW50ZXJmYWNlIGdldEludGVyZmFjZSgpOwotCXB1YmxpYyBMaXN0IGdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0JcHVibGljIExpc3QgZ2V0QmluZGluZ0NvbnRlbnRMaXN0KCk7Ci0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJsaXR5T2JqZWN0cygpOwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKTsgIAotCXB1YmxpYyBJRGVzY3JpcHRpb24gZ2V0T3duZXJEZXNjcmlwdGlvbigpOwotICAKLQlwdWJsaWMgQ29tbWFuZCBnZXRTZXRJbnRlcmZhY2VDb21tYW5kKElJbnRlcmZhY2UgbmV3SW50ZXJmYWNlKTsKLQlwdWJsaWMgQ29tbWFuZCBnZXRHZW5lcmF0ZUJpbmRpbmdDb21tYW5kKCk7Ci0JcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JQmluZGluZ01lc3NhZ2VSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiYzk2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JQmluZGluZ01lc3NhZ2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlIGV4dGVuZHMgSU5hbWVkT2JqZWN0Ci17Ci0JcHVibGljIElNZXNzYWdlUmVmZXJlbmNlIGdldE1lc3NhZ2VSZWZlcmVuY2UoKTsKLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmxpdHlPYmplY3RzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JQmluZGluZ09wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSUJpbmRpbmdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4Yjk5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JQmluZGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBJQmluZGluZ09wZXJhdGlvbiBleHRlbmRzIElOYW1lZE9iamVjdAotewotCXB1YmxpYyBJT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpOwotCXB1YmxpYyBMaXN0IGdldEJpbmRpbmdNZXNzYWdlcygpOwotCXB1YmxpYyBMaXN0IGdldEV4dGVuc2libGl0eU9iamVjdHMoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSURlc2NyaXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmN2M1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXNjcmlwdGlvbiBleHRlbmRzIElOYW1lZE9iamVjdAotewotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKTsKLS8vCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZXNJbmZvKCk7CS8vIFRPRE86IEFkZCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlCi0JCi0JcHVibGljIExpc3QgZ2V0SW1wb3J0cygpOwotCXB1YmxpYyBMaXN0IGdldFR5cGVzKCk7Ci0JcHVibGljIExpc3QgZ2V0U2VydmljZXMoKTsKLQlwdWJsaWMgTGlzdCBnZXRCaW5kaW5ncygpOwotCXB1YmxpYyBMaXN0IGdldEludGVyZmFjZXMoKTsKLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpOwotICAKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRJbXBvcnRDb21tYW5kKCk7Ci0JcHVibGljIENvbW1hbmQgZ2V0QWRkU2NoZW1hQ29tbWFuZCgpOwotCXB1YmxpYyBDb21tYW5kIGdldEFkZFNlcnZpY2VDb21tYW5kKCk7Ci0JcHVibGljIENvbW1hbmQgZ2V0QWRkQmluZGluZ0NvbW1hbmQoKTsKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRJbnRlcmZhY2VDb21tYW5kKCk7Ci0JcHVibGljIENvbW1hbmQgZ2V0QWRkTWVzc2FnZUNvbW1hbmQoKTsKLS8vCXB1YmxpYyBDb21tYW5kIGdldEVkaXROYW1lc3BhY2VzQ29tbWFuZCgpOwkvLyBUT0RPOiBBZGQgdGhpcyBtZXRob2QgaW4gdGhlIGZ1dHVyZQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSUVuZFBvaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JRW5kUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlZmNkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JRW5kUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVuZFBvaW50IGV4dGVuZHMgSU5hbWVkT2JqZWN0Ci17Ci0JcHVibGljIElTZXJ2aWNlIGdldE93bmVyU2VydmljZSgpOwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpOwotCXB1YmxpYyBJQmluZGluZyBnZXRCaW5kaW5nKCk7Ci0gIAotCXB1YmxpYyBDb21tYW5kIGdldFNldEJpbmRpbmdDb21tYW5kKElCaW5kaW5nIGJpbmRpbmcpOwotCXB1YmxpYyBDb21tYW5kIGdldFNldEFkZHJlc3NDb21tYW5kKFN0cmluZyBuZXdBZGRyZXNzKTsKLQlwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JSW1wb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NjkxMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSUltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJSW1wb3J0IGV4dGVuZHMgSU5hbWVkT2JqZWN0IHsKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KCk7Ci0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpOwotCQotCXB1YmxpYyBJRGVzY3JpcHRpb24gZ2V0T3duZXJEZXNjcmlwdGlvbigpOwotCXB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lJbnRlcmZhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljNjBhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUludGVyZmFjZSBleHRlbmRzIElOYW1lZE9iamVjdCB7Ci0gIHB1YmxpYyBMaXN0IGdldE9wZXJhdGlvbnMoKTsKLSAgCi0gIHB1YmxpYyBDb21tYW5kIGdldEFkZE9wZXJhdGlvbkNvbW1hbmQoKTsKLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSU1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTU0NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSU1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJTWVzc2FnZSBleHRlbmRzIElOYW1lZE9iamVjdCB7Ci0JICBwdWJsaWMgTGlzdCBnZXRQYXJ0cygpOwotCSAgCi0JICBwdWJsaWMgSURlc2NyaXB0aW9uIGdldE93bmVyRGVzY3JpcHRpb24oKTsKLQkgIAotCSAgcHVibGljIENvbW1hbmQgZ2V0QWRkUGFydENvbW1hbmQoKTsKLQkgIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lNZXNzYWdlUmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JTWVzc2FnZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDljNzY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lNZXNzYWdlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8vIHRoaXMgaXMgYSBzaW1wbGlmaWNhdGlvbiBvZiBhbiBpbnB1dCwgb3V0cHV0IG9yIGZhdWx0IG9iamVjdAotLy8gKG9yIGFueSBvdGhlciBraW5kIG9mIG9iamVjdCBmdXR1cmUgc3BlY3MgbWlnaHQgY29vayB1cCkKLXB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VSZWZlcmVuY2UgZXh0ZW5kcyBJTmFtZWRPYmplY3QKLXsgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBLSU5EX0lOUFVUICA9IDE7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEtJTkRfT1VUUFVUID0gMjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9GQVVMVCA9IDM7Ci0gIAotICBwdWJsaWMgaW50IGdldEtpbmQoKTsKLSAgcHVibGljIExpc3QgZ2V0UGFyYW1ldGVycygpOyAgIAotICBwdWJsaWMgSU9wZXJhdGlvbiBnZXRPd25lck9wZXJhdGlvbigpOwotICBwdWJsaWMgU3RyaW5nIGdldFByZXZpZXcoKTsKLSAgCi0gIHB1YmxpYyBDb21tYW5kIGdldFJlb3JkZXJQYXJhbWV0ZXJzQ29tbWFuZChJUGFyYW1ldGVyIGxlZnRTaWJsaW5nLCBJUGFyYW1ldGVyIHJpZ2h0U2libGluZywgSVBhcmFtZXRlciBtb3ZpbmdQYXJhbWV0ZXIpOwotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JTmFtZWRPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lOYW1lZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNjNDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lOYW1lZE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVkT2JqZWN0IGV4dGVuZHMgSUFTRE9iamVjdCwgSVRyZWVFbGVtZW50Ci17ICAKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgCi0JcHVibGljIENvbW1hbmQgZ2V0U2V0TmFtZUNvbW1hbmQoU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSU9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjYyYjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uIGV4dGVuZHMgSU5hbWVkT2JqZWN0Ci17Ci0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKTsKLQlwdWJsaWMgSUludGVyZmFjZSBnZXRPd25lckludGVyZmFjZSgpOwotICAKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRJbnB1dENvbW1hbmQoKTsKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRPdXRwdXRDb21tYW5kKCk7Ci0gIC8vIFRPRE86IHJtYWg6IFdlIG5lZWQgdG8gcmV2aXNpdCB0aGlzIChTZW5kaW5nIGluIGFuIGV4aXN0aW5nIEZhdWx0SW1wbCB3aGVuIHdlIHdhbnQgdG8KLSAgLy8gYWRkIGEgRmF1bHQgUGFyYW1ldGVyLiAgV2hhdCBkbyB3ZSByZWFsbHkgd2FudCB0byBkbyB3aGVuIHdlIGFkZCBhCi0gIC8vICduZXcgRmF1bHQnLi4uLiBUaGlzIGFsc28gcmVsYXRlcyB0byB3aGF0IHdlIHJlYWxseSB3YW50IHRvIGRvIHdoZW4gd2UgZGVsZXRlIGEgRmF1bHQuLi4KLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRGYXVsdENvbW1hbmQoT2JqZWN0IGZhdWx0KTsKLQlwdWJsaWMgQ29tbWFuZCBnZXRSZW9yZGVyTWVzc2FnZVJlZmVyZW5jZXNDb21tYW5kKElNZXNzYWdlUmVmZXJlbmNlIGxlZnRTaWJsaW5nLCBJTWVzc2FnZVJlZmVyZW5jZSByaWdodFNpYmxpbmcsIElNZXNzYWdlUmVmZXJlbmNlIG1vdmluZ01lc3NhZ2VSZWYpOwotCXB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lQYXJhbWV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4ZWYxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0KLS8vIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZXNjcmliZSBpbiBzaW1wbGlmaWVkIGRlc2NyaXRwaW9uIG9mIHRoZSBpbnB1dC9vdXRwdXQvZmF1bHQgc3RydWN0dXJlCi0vLyBpbiB0aGUgZmFtaWxpYXIgc3R5bGUgb2YgYSB0eXBpY2FsIHByb2dyYW1taW5nIGxhbmd1YWdlIHBhcmFtZXRlciBlLmcuICJTdHJpbmdbXSBmb28iCi0vLyAKLS8vIG9mdGVuIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNpbXBsaWZpY2F0aW9uIG9mIGEgbW9yZSBjb21wbGV4IHNlcnZpY2UgZGVzY3JpcHRpb24gb3Igc2NoZW1hCi0vLyB0aGlzIGNsYXNzIHNlcnZlcyBjb21tb24gZGVub21pbmF0b3IgdG8gZHJpdmUgYSBzaW1wbGUgdmlldyBvZiBhbiBvcGVyYXRpb24ncyBtZXNzYWdlIHN0cnVjdHVyZQotLy8gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZWRpdG9ycyBjYW4gY2hvb3NlIHRvIHByb3ZpZGUgJ2FkdmFuY2VkJyB2aWV3cyB0aGF0IGRlbHZlIGludG8gYWRkaXRpb24gZGV0YWlscwotLy8gb2YgYSBNZXNzYWdlIHN0cnVjdHVyZQotcHVibGljIGludGVyZmFjZSBJUGFyYW1ldGVyIGV4dGVuZHMgSU5hbWVkT2JqZWN0Ci17Ci0JcHVibGljIE9iamVjdCBnZXRPd25lcigpOwotLy8gIFN0cmluZyBnZXRLaW5kKCk7Ci0JcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCk7Ci0JcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lUXVhbGlmaWVyKCk7Ci0JcHVibGljIFN0cmluZyBnZXRQcmV2aWV3KCk7Ci0gIC8vPyBpbnQgZ2V0TWluT2NjdXJzKCk7Ci0gIC8vPyBpbnQgZ2V0TWF4T2NjdXJzKCk7Ci0JCi0JLy8gVE9ETzogcm1haDogRG8gdGhlc2Ugc3RyaW5ncyBiZWxvbmcgaGVyZT8/PwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9ORVdfQUNUSU9OX0lEID0gIlNldFR5cGVBY3Rpb25fQWRkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfRVhJU1RJTkdfQUNUSU9OX0lEID0gIlNldFR5cGVBY3Rpb25fRXhpc3RpbmdUeXBlIjsgLy8kTk9OLU5MUy0xJAotICAKLQlwdWJsaWMgQ29tbWFuZCBnZXRTZXRUeXBlQ29tbWFuZChTdHJpbmcgYWN0aW9uSWQpOwotCXB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhkMDk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvZmFjYWRlL0lTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlIGV4dGVuZHMgSU5hbWVkT2JqZWN0Ci17ICAKLQlwdWJsaWMgTGlzdCBnZXRFbmRQb2ludHMoKTsKLQlwdWJsaWMgSURlc2NyaXB0aW9uIGdldE93bmVyRGVzY3JpcHRpb24oKTsKLQlwdWJsaWMgQ29tbWFuZCBnZXRBZGRFbmRQb2ludENvbW1hbmQoKTsKLQlwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9mYWNhZGUvSVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzZTMwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL2ZhY2FkZS9JVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVR5cGUgZXh0ZW5kcyBJTmFtZWRPYmplY3QgewotCXB1YmxpYyBJRGVzY3JpcHRpb24gZ2V0T3duZXJEZXNjcmlwdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmI1ZThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9UQUJfR1JBUEg9RGVzaWduCi1fVUlfVEFCX1NPVVJDRT1Tb3VyY2UKLV9VSV9CVVRUT05fTkVXPU5ldy4uLgotX1VJX0xBQkVMX1JFQURfT05MWT1yZWFkLW9ubHkKLV9VSV9MQUJFTF9OQU1FU1BBQ0U9TmFtZXNwYWNlCi1fVUlfTEFCRUxfUE9SVFRZUEU9UG9ydFR5cGUKLV9VSV9MQUJFTF9MT0NBVElPTj1Mb2NhdGlvbgotX1VJX0xBQkVMX0FERFJFU1M9QWRkcmVzcwotX1VJX0xBQkVMX0JJTkRJTkc9QmluZGluZwotX1VJX0xBQkVMX1BSRUZJWD1QcmVmaXgKLV9VSV9MQUJFTF9OQU1FPU5hbWUKLV9VSV9MQUJFTF9UWVBFPVR5cGUKLV9VSV9BQ1RJT05fQUREX1NFUlZJQ0U9QWRkIFNlcnZpY2UKLV9VSV9BQ1RJT05fQUREX01FU1NBR0U9QWRkIE1lc3NhZ2UKLV9VSV9BQ1RJT05fQUREX09QRVJBVElPTj1BZGQgT3BlcmF0aW9uCi1fVUlfQUNUSU9OX0FERF9JTVBPUlQ9QWRkIEltcG9ydAotX1VJX0FDVElPTl9BRERfT1VUUFVUPUFkZCBPdXRwdXQKLV9VSV9BQ1RJT05fQUREX0ZBVUxUPUFkZCBGYXVsdAotX1VJX0FDVElPTl9BRERfUE9SVD1BZGQgUG9ydAotX1VJX0FDVElPTl9BRERfUE9SVFRZUEU9QWRkIFBvcnRUeXBlCi1fVUlfQUNUSU9OX0RFTEVURT1EZWxldGUKLV9VSV9CVVRUT05fQlJPV1NFPUJyb3dzZS4uLgotX1VJX0FDVElPTl9ORVdfUE9SVFRZUEU9TmV3IFBvcnRUeXBlLi4uCi1fVUlfQUNUSU9OX05FV19CSU5ESU5HPU5ldyBCaW5kaW5nLi4uCi1fVUlfQUNUSU9OX0VYSVNUSU5HX1BPUlRUWVBFPUV4aXN0aW5nIFBvcnRUeXBlLi4uCi1fVUlfR0VORVJBVEVfQklORElOR19DT05URU5UPUdlbmVyYXRlIEJpbmRpbmcgQ29udGVudC4uLgotX1VJX0FDVElPTl9FWElTVElOR19CSU5ESU5HPUV4aXN0aW5nIEJpbmRpbmcuLi4KLV9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MPVByb3RvY29sCi1fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRT1UYXJnZXQgbmFtZXNwYWNlCi1fVUlfQUNUSU9OX0FERF9CSU5ESU5HPUFkZCBCaW5kaW5nCi1fVUlfQUNUSU9OX0FERF9TQ0hFTUE9QWRkIFNjaGVtYQotX1VJX0FDVElPTl9BRERfSU5QVVQ9QWRkIElucHV0Ci1fVUlfU0VDVElPTl9BRFZBTkNFRF9BVFRSSUJVVEVTPUFkdmFuY2VkCi0KLV9VSV9BQ1RJT05fRURJVF9OQU1FU1BBQ0VTID0gRWRpdCBOYW1lc3BhY2VzLi4uCi1fVUlfQUNUSU9OX09QRU5fU0NIRU1BPU9wZW4gU2NoZW1hCi1fVUlfVE9PTFRJUF9SRU5BTUVfUkVGQUNUT1I9Q2xpY2sgaGVyZSB0byBpbnZva2UgdGhlIFJlbmFtZSByZWZhY3RvcmluZy4KLQotX1VJX0xBQkVMX1JJR0hUX0NMSUNLX1RPX0lOU0VSVF9DT05URU5UPVJpZ2h0IG1vdXNlIGNsaWNrIGhlcmUgdG8gaW5zZXJ0IGNvbnRlbnQKLV9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTPVNob3cgcHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9vdXRsaW5lL0FTRENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9vdXRsaW5lL0FTRENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRmYWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2Qvb3V0bGluZS9BU0RDb250ZW50T3V0bGluZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBU0RDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgewotCXByb3RlY3RlZCBBU0RNdWx0aVBhZ2VFZGl0b3Igd3NkbEVkaXRvcjsKLQlwcm90ZWN0ZWQgSURlc2NyaXB0aW9uIG1vZGVsOwotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0JcHJvdGVjdGVkIElNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyOwotCQotCXB1YmxpYyBBU0RDb250ZW50T3V0bGluZVBhZ2UoQVNETXVsdGlQYWdlRWRpdG9yIGVkaXRvciwgSU1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIpIHsKLQkJd3NkbEVkaXRvciA9IGVkaXRvcjsKLQkJdGhpcy5tZW51TGlzdGVuZXIgPSBtZW51TGlzdGVuZXI7Ci0JfQotCQotCXB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRUcmVlVmlld2VyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoSURlc2NyaXB0aW9uIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7ICAgICAgICAgICAgICAgICAKLQkJCi0JCWdldFRyZWVWaWV3ZXIoKS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dChtb2RlbCk7Ci0JCWdldFRyZWVWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQotCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI3BvcHVwIik7Ly8kTk9OLU5MUy0xJAotCQltZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCU1lbnUgbWVudSA9IG1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KGdldFRyZWVWaWV3ZXIoKS5nZXRDb250cm9sKCkpOwotCQlnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCQkKLQkgICAgZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoIm9yZy5lY2xpcHNlLndzdC53c2RsLndzZGxlZGl0b3IiLCBtZW51TWFuYWdlciwgd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOyAvLyROT04tTkxTLTEkCi0JCSAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksQVNERWRpdG9yQ1NIZWxwSWRzLldTRExfT1VUTElORV9WSUVXKTsgCi0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NpbmdTZWxlY3Rpb25DaGFuZ2UgPSBmYWxzZTsKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoIXByb2Nlc3NpbmdTZWxlY3Rpb25DaGFuZ2UpIHsKLQkJCXByb2Nlc3NpbmdTZWxlY3Rpb25DaGFuZ2UgPSB0cnVlOwotCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQlPYmplY3Qgc2VsZWN0aW9uID0gbnVsbDsKLQkJCQotCQkJaWYgKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVkaXRQYXJ0KXsKLQkJCQlFZGl0UGFydCBuZXdFZGl0UGFydCA9IChFZGl0UGFydCkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCXNlbGVjdGlvbiA9IG5ld0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQl9Ci0JCi0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQlzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQl9Ci0JCQlwcm9jZXNzaW5nU2VsZWN0aW9uQ2hhbmdlID0gZmFsc2U7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9vdXRsaW5lL0FTRENvbnRlbnRPdXRsaW5lUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2Qvb3V0bGluZS9BU0RDb250ZW50T3V0bGluZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDkzMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9vdXRsaW5lL0FTRENvbnRlbnRPdXRsaW5lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLm91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTRE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQVNET2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JTmFtZWRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBBU0RDb250ZW50T3V0bGluZVByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsIElMYWJlbFByb3ZpZGVyLCBJQVNET2JqZWN0TGlzdGVuZXIgewotCXByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0JcHJvdGVjdGVkIEFTRE11bHRpUGFnZUVkaXRvciBlZGl0b3I7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovICAgIAotCXByb3RlY3RlZCBJRGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0KLSAgICBwdWJsaWMgQVNEQ29udGVudE91dGxpbmVQcm92aWRlcigpCi0gICAgeyAgICAgIAotICAgIH0KLSAgICAKLQlwdWJsaWMgQVNEQ29udGVudE91dGxpbmVQcm92aWRlcihBU0RNdWx0aVBhZ2VFZGl0b3IgZWRpdG9yLCBJRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwotICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpIHsKLQkJCUlUcmVlRWxlbWVudFtdIGtpZHMgPSAoKElUcmVlRWxlbWVudCkgcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBraWRzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCWF0dGFjaExpc3RlbmVyKGtpZHNbaW5kZXhdKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGtpZHM7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsgCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElUcmVlRWxlbWVudCkgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl1bmF0dGFjaEFsbExpc3RlbmVycygpOwotCQl2aWV3ZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJdW5hdHRhY2hBbGxMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElUcmVlRWxlbWVudCkgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLSAgICAKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotICAgICAgICAgCi0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU5hbWVkT2JqZWN0KSB7IAotCQkJdGV4dCA9ICAoKElOYW1lZE9iamVjdCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpIHsKLQkJCXRleHQgPSAoKElUcmVlRWxlbWVudCkgZWxlbWVudCkuZ2V0VGV4dCgpOwotCQl9Ci0JCWVsc2UgewotCQkJdGV4dCA9IGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhdHRhY2hMaXN0ZW5lcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQVNET2JqZWN0ICYmICFsaXN0ZW5lcnMuY29udGFpbnMob2JqZWN0KSkgewotCQkJKChJQVNET2JqZWN0KSBvYmplY3QpLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0JCQlsaXN0ZW5lcnMuYWRkKG9iamVjdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdW5hdHRhY2hBbGxMaXN0ZW5lcnMoKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJKChJQVNET2JqZWN0KSBpdGVtKS51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7ICAgICAgICAgICAgIAotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gKFRyZWVWaWV3ZXIpIHZpZXdlcjsKLQkJCXRyZWVWaWV3ZXIucmVmcmVzaChvYmplY3QpOwotCQkJdHJlZVZpZXdlci5yZXZlYWwob2JqZWN0KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL291dGxpbmUvSUNhdGVnb3J5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9vdXRsaW5lL0lDYXRlZ29yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzZDgyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL291dGxpbmUvSUNhdGVnb3J5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGVnb3J5QWRhcHRlciB7Ci0JcHVibGljIElEZXNjcmlwdGlvbiBnZXRPd25lckRlc2NyaXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL291dGxpbmUvSVRyZWVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL291dGxpbmUvSVRyZWVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NGZiNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9vdXRsaW5lL0lUcmVlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUcmVlRWxlbWVudCB7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgSVRyZWVFbGVtZW50W10gRU1QVFlfTElTVCA9IHt9OwotICBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpOwotICBJVHJlZUVsZW1lbnQgZ2V0UGFyZW50KCk7Ci0gIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKTsKLSAgU3RyaW5nIGdldFRleHQoKTsKLSAgSW1hZ2UgZ2V0SW1hZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvcHJvcGVydGllcy9zZWN0aW9ucy9BU0RBYnN0cmFjdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvcHJvcGVydGllcy9zZWN0aW9ucy9BU0RBYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViYzAwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvQVNEQWJzdHJhY3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQVNET2JqZWN0TGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU0RBYnN0cmFjdFNlY3Rpb24gaW1wbGVtZW50cyBJU2VjdGlvbiwgSUFTRE9iamVjdExpc3RlbmVyLCBMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLQlwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBPYmplY3QgZWxlbWVudE1vZGVsOwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHkgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgaW50IHJpZ2h0TWFyZ2luU3BhY2U7Ci0JcHJvdGVjdGVkIGludCB0YWJsZU1pbmltdW1XaWR0aCA9IDUwOwotCXByb3RlY3RlZCBDdXN0b21MaXN0ZW5lciBjdXN0b21MaXN0ZW5lciA9IG5ldyBDdXN0b21MaXN0ZW5lcigpOwotCQotCXByb3RlY3RlZCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQl7Ci0JCWNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGFGYWN0b3J5KQotCXsKLQkJdGhpcy5mYWN0b3J5ID0gYUZhY3Rvcnk7Ci0JCUdDIGdjID0gbmV3IEdDKHBhcmVudCk7Ci0JCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQoIiAgLi4uICAiKTsgLy8kTk9OLU5MUy0xJAotCQlyaWdodE1hcmdpblNwYWNlID0gZXh0ZW50Lng7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlBc3NlcnQuaXNUcnVlKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQllbGVtZW50TW9kZWwgPSBpbnB1dDsKLQkJYXR0YWNoTGlzdGVuZXIoZWxlbWVudE1vZGVsKTsKLQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElBU0RPYmplY3QpIHsKLQkJCWlzUmVhZE9ubHkgPSAoKElBU0RPYmplY3QpIGlucHV0KS5pc1JlYWRPbmx5KCk7Ci0JCX0KLQkJCi0JCXJlZnJlc2goKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZVNob3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQmVTaG93bigpCi0JewotCQlyZWZyZXNoKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNhYm91dFRvQmVIaWRkZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9CZUhpZGRlbigpCi0JewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCQl1bmF0dGFjaEFsbExpc3RlbmVycygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZ2V0TWluaW11bUhlaWdodCgpCi0JICovCi0JcHVibGljIGludCBnZXRNaW5pbXVtSGVpZ2h0KCkKLQl7Ci0JCXJldHVybiBTV1QuREVGQVVMVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0JCWlmICghY29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLQkJewotCQkJaWYgKGlzUmVhZE9ubHkpCi0JCQl7Ci0JCQkJY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICogQHJldHVybiB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICovCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotCXsKLQkJcmVmcmVzaCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCXt9Ci0JCi0JcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCXt9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQl7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc0luRG9IYW5kbGUpIAotCQl7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCQlpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiAhaXNJbkRvSGFuZGxlKSAKLQkJewotCQkJaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLQkJCWRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfQotCQkKLQl9Ci0JCi0JYm9vbGVhbiBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqIEByZXR1cm4gdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJFbmFibGVkKCkgCi0JewotCQlyZXR1cm4gbGlzdGVuZXJFbmFibGVkOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBhcHBseVRleHRMaXN0ZW5lcnMoQ29udHJvbCBjb250cm9sKQotICAgIHsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVycyhDb250cm9sIGNvbnRyb2wpCi0gICAgewotICAgICAgY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULktleURvd24sIGN1c3RvbUxpc3RlbmVyKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0JICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBsaXN0ZW5lckVuYWJsZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJFbmFibGVkKGJvb2xlYW4gIHYpIAotCXsKLQkJdGhpcy5saXN0ZW5lckVuYWJsZWQgPSB2OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc0luRG9IYW5kbGUpIAotCQl7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotLy8JCQlzdGFydERlbGF5ZWRFdmVudChldmVudCk7Ci0JCQlkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLQkJCWlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotCXsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBEZWxheWVkRXZlbnQgZGVsYXllZFRhc2s7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnREZWxheWVkRXZlbnQoRXZlbnQgZSkKLQl7Ci0JCWlmIChkZWxheWVkVGFzayA9PSBudWxsIHx8Ci0JCQkJZGVsYXllZFRhc2suZ2V0RXZlbnQoKSA9PSBudWxsKQotCQl7Ci0JCQlkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLQkJCWRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCxkZWxheWVkVGFzayk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlFdmVudCBkZWxheWVkRXZlbnQgPSBkZWxheWVkVGFzay5nZXRFdmVudCgpOwotCQkJCi0JCQlpZiAoZS53aWRnZXQgPT0gZGVsYXllZEV2ZW50LndpZGdldCAmJgotCQkJCQllLnR5cGUgPT0gZGVsYXllZEV2ZW50LnR5cGUpCi0JCQl7Ci0JCQkJLy8gc2FtZSBldmVudCwganVzdCBkaWZmZXJlbnQgZGF0YSwgZGVsYXkgbmV3IGV2ZW50Ci0JCQkJZGVsYXllZFRhc2suc2V0RXZlbnQobnVsbCk7Ci0JCQl9Ci0JCQlkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLQkJCWRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCxkZWxheWVkVGFzayk7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUKLQl7Ci0JCXByb3RlY3RlZCBFdmVudCBldmVudDsKLQkJCi0JCS8qCi0JCSAqIEBzZWUgUnVubmFibGUjcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpCi0JCXsKLQkJCWlmIChldmVudCAhPSBudWxsKQotCQkJewotCQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQkJZG9IYW5kbGVFdmVudChldmVudCk7Ci0JCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCQkJZXZlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0cyB0aGUgZXZlbnQuCi0JCSAqIEByZXR1cm4gUmV0dXJucyBhIEV2ZW50Ci0JCSAqLwotCQlwdWJsaWMgRXZlbnQgZ2V0RXZlbnQoKQotCQl7Ci0JCQlyZXR1cm4gZXZlbnQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBldmVudC4KLQkJICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEV2ZW50KEV2ZW50IGV2ZW50KQotCQl7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJCi0JfQotCSAgIAotICAgIGNsYXNzIEN1c3RvbUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgICB7Ci0gICAgICBib29sZWFuIGlzSGFuZGxpbmdFdmVudCA9IGZhbHNlOwotICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc1JlYWRPbmx5KSAKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5LZXlEb3duIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzSGFuZGxpbmdFdmVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpc0hhbmRsaW5nRXZlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICBpc0hhbmRsaW5nRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c091dCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghaXNIYW5kbGluZ0V2ZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXNIYW5kbGluZ0V2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICBpc0hhbmRsaW5nRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbkRvSGFuZGxlOwotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5Eb0hhbmRsZSgpIAotCXsKLQkJcmV0dXJuIGlzSW5Eb0hhbmRsZTsKLQl9Ci0JCi0Jc3RhdGljIHByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZU1hbmFnZXIoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLQl7IAotCQlJU3RhdHVzTGluZU1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5Ci0JCXsgICAgICAgICAgICAgICAgICAgICAgIAotCQkJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCXJlc3VsdCA9IGNvbnRyaWJ1dG9yLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQl9ICAKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRNb2RlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXR0YWNoTGlzdGVuZXIoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUFTRE9iamVjdCAmJiAhbGlzdGVuZXJzLmNvbnRhaW5zKG9iamVjdCkpIHsKLQkJCSgoSUFTRE9iamVjdCkgb2JqZWN0KS5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotCQkJbGlzdGVuZXJzLmFkZChvYmplY3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVuYXR0YWNoQWxsTGlzdGVuZXJzKCkgewotCQlJdGVyYXRvciBpdCA9IGxpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCSgoSUFTRE9iamVjdCkgaXRlbSkudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldENvbnRyb2xGb3JlZ3JvdW5kQ29sb3IoQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCWlmIChpc1JlYWRPbmx5KSB7Ci0JCQkJY29udHJvbC5zZXRGb3JlZ3JvdW5kKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5yZWFkT25seUxhYmVsQ29sb3IpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udHJvbC5zZXRGb3JlZ3JvdW5kKERlc2lnblZpZXdHcmFwaGljc0NvbnN0YW50cy5sYWJlbENvbG9yKTsKLQkJCX0KLQkJfQotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkgIT0gbnVsbCAmJiBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb21tYW5kU3RhY2sgc3RhY2sgPSAoQ29tbWFuZFN0YWNrKSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKTsKLSAgICAgICAgICAgIHN0YWNrLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvcHJvcGVydGllcy9zZWN0aW9ucy9BU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL0FTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjY1ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL0FTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi1wdWJsaWMgY2xhc3MgQVNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIvLywgSUVsZW1lbnRMaXN0ZW5lcgotewotICAvKioKLSAgICogQHBhcmFtIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IKLSAgICovCi0gIHB1YmxpYyBBU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKQotICB7Ci0gICAgc3VwZXIodGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcik7Ci0vLyAgICB0YWJDb250cmlidXRvciA9IHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JewotCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZChnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkgICAgLy9zdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0gIAotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL0JpbmRpbmdTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvQmluZGluZ1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkMmZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvQmluZGluZ1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTRFNldEV4aXN0aW5nSW50ZXJmYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5hY3Rpb25zLkFTRFNldE5ld0ludGVyZmFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5SZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1NlY3Rpb24gZXh0ZW5kcyBSZWZlcmVuY2VTZWN0aW9uIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZWZNYW5hZ2VyOwotCXByaXZhdGUgQ0xhYmVsIHByb3RvY29sVmFsdWU7Ci0vLwlwcml2YXRlIENMYWJlbCBvcHRpb25zVmFsdWU7Ci0JcHJpdmF0ZSBCdXR0b24gcmVnZW5CaW5kaW5nQnV0dG9uOwotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tYm9MYWJlbC5zZXRUZXh0KG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlcy5fVUlfTEFCRUxfUE9SVFRZUEUgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCUNMYWJlbCBwcm90b2NvbExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MKTsKLQkJcHJvdG9jb2xWYWx1ZT0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsKLQkJCi0JCS8vIExheW91dCBwcm90b2NvbExhYmVsCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHByb3RvY29sVmFsdWUsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvdG9jb2xWYWx1ZSwgMCwgU1dULkNFTlRFUik7Ci0JCXByb3RvY29sTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCS8vIExheW91dCBwcm90b2NvbFZhbHVlCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ibywgMCk7Ci0vLwkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJcHJvdG9jb2xWYWx1ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJLyoKLQkJQ0xhYmVsIG9wdGlvbnNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5nZXRTdHJpbmcoIl9VSV9USVRMRV9PUFRJT05TIikgKyAiOiIpOwotCQlvcHRpb25zVmFsdWUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotCQkKLQkJLy8gTGF5b3V0IG9wdGlvbnNMYWJlbAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChvcHRpb25zVmFsdWUsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQob3B0aW9uc1ZhbHVlLCAwLCBTV1QuQ0VOVEVSKTsKLQkJb3B0aW9uc0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvLyBMYXlvdXQgb3B0aW9uc1ZhbHVlCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcm90b2NvbFZhbHVlLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0vLwkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvdG9jb2xWYWx1ZSwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlvcHRpb25zVmFsdWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCVN0cmluZyBidXR0b25MYWJlbCA9IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlcy5nZXRTdHJpbmcoIl9VSV9HRU5FUkFURV9CSU5ESU5HX0NPTlRFTlQiKTsKLQkJcmVnZW5CaW5kaW5nQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIGJ1dHRvbkxhYmVsLCBTV1QuUFVTSCk7Ci0KLQkJLy8gTGF5b3V0IGJ1dHRvbgotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLS8vCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG9wdGlvbnNWYWx1ZSwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChvcHRpb25zTGFiZWwsIDApOwotCQlyZWdlbkJpbmRpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJKi8KLQotCQlTdHJpbmcgYnV0dG9uTGFiZWwgPSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuTWVzc2FnZXMuX1VJX0dFTkVSQVRFX0JJTkRJTkdfQ09OVEVOVDsKLQkJcmVnZW5CaW5kaW5nQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIGJ1dHRvbkxhYmVsLCBTV1QuUFVTSCk7Ci0KLQkJLy8gTGF5b3V0IGJ1dHRvbgotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLS8vCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG9wdGlvbnNWYWx1ZSwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcm90b2NvbExhYmVsLCAwKTsKLQkJcmVnZW5CaW5kaW5nQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmVnZW5CaW5kaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm90b2NvbFZhbHVlLCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPUEVSVElFU19CSU5ESU5HX1BST1RPQ09MX1RFWFQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlZ2VuQmluZGluZ0J1dHRvbiwgQVNERWRpdG9yQ1NIZWxwSWRzLlBST1BFUlRJRVNfQklORElOR19HRU5fQklORElOR19CVVRUT04pOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbWJvLCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPUEVSVElFU19CSU5ESU5HX1BPUlRUWVBFX0NPTUJPKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc3VwZXIucmVmcmVzaCgpOwotCQlJQmluZGluZyBiaW5kaW5nID0gZ2V0SUJpbmRpbmcoKTsKLQkJU3RyaW5nIHByb3RvY29sID0gYmluZGluZy5nZXRQcm90b2NvbCgpOwotCQlpZiAocHJvdG9jb2wgPT0gbnVsbCB8fCBwcm90b2NvbC5lcXVhbHMoIiIpKSB7Ci0JCQlwcm90b2NvbCA9ICItLS0tIjsKLQkJfQotCQlwcm90b2NvbFZhbHVlLnNldFRleHQocHJvdG9jb2wpOwotCi0vLwkJb3B0aW9uc1ZhbHVlLnNldFRleHQoIiIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKSB7Ci0JCWlmIChyZWZNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiByZWZNYW5hZ2VyOwotCQl9Ci0KLQkJcmVmTWFuYWdlciA9IFJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyLmdldEludGVyZmFjZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKChJQVNET2JqZWN0KSBnZXRNb2RlbCgpKTsKLQkJCi0JCXJldHVybiByZWZNYW5hZ2VyOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldENvbWJvSXRlbXMoKSB7Ci0JCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotCQkKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaXRlbXMuYWRkKEJST1dTRV9TVFJJTkcpOwotCQlpdGVtcy5hZGQoTkVXX1NUUklORyk7Ci0KLQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGNvbWJvSXRlbXMgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvbWJvSXRlbXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpdGVtcy5hZGQoY29tYm9JdGVtc1tpbmRleF0pOwotCQl9Ci0JCQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDdXJyZW50Q29tYm9JdGVtKCkgewotCQlJQmluZGluZyBiaW5kaW5nID0gZ2V0SUJpbmRpbmcoKTsKLQkJcmV0dXJuIGJpbmRpbmcuZ2V0SW50ZXJmYWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21ib0l0ZW1OYW1lKE9iamVjdCBpdGVtKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKSB7Ci0JCQluYW1lID0gKChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBpdGVtKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIElJbnRlcmZhY2UpIHsKLQkJCW5hbWUgPSAoKElJbnRlcmZhY2UpIGl0ZW0pLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQluYW1lID0gKFN0cmluZykgaXRlbTsKLQkJfQotCQkKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUNvbWJvU2VsZWN0aW9uKE9iamVjdCBpdGVtKSB7Ci0JCUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG51bGw7Ci0JCQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pIHsKLQkJCXNwZWMgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgaXRlbTsKLQkJCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotCQkJbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoKElCaW5kaW5nKSBnZXRNb2RlbCgpLCBzcGVjKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlpZiAoaXRlbS5lcXVhbHMoQlJPV1NFX1NUUklORykpIHsKLQkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJCUFTRFNldEV4aXN0aW5nSW50ZXJmYWNlQWN0aW9uIGFjdGlvbiA9IG5ldyBBU0RTZXRFeGlzdGluZ0ludGVyZmFjZUFjdGlvbihwYXJ0KTsKLQkJCQlhY3Rpb24uc2V0SUJpbmRpbmcoKElCaW5kaW5nKSBnZXRNb2RlbCgpKTsKLQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChpdGVtLmVxdWFscyhORVdfU1RSSU5HKSkgewotCQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJQVNEU2V0TmV3SW50ZXJmYWNlQWN0aW9uIGFjdGlvbiA9IG5ldyBBU0RTZXROZXdJbnRlcmZhY2VBY3Rpb24ocGFydCk7Ci0JCQkJYWN0aW9uLnNldElCaW5kaW5nKChJQmluZGluZykgZ2V0TW9kZWwoKSk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCQl9Ci0KLQkJcmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgSUJpbmRpbmcgZ2V0SUJpbmRpbmcoKSB7Ci0JCXJldHVybiAoSUJpbmRpbmcpIGdldE1vZGVsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHJlZ2VuQmluZGluZ0J1dHRvbikgewotCQkJQ29tbWFuZCBjb21tYW5kID0gZ2V0SUJpbmRpbmcoKS5nZXRHZW5lcmF0ZUJpbmRpbmdDb21tYW5kKCk7Ci0JCSAgICBDb21tYW5kU3RhY2sgc3RhY2sgPSAoQ29tbWFuZFN0YWNrKSBBU0RFZGl0b3JQbHVnaW4uZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOwotCQkgICAgc3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL0RvY3VtZW50YXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvRG9jdW1lbnRhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2MmM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvRG9jdW1lbnRhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuQWRkRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLkFTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5BYnN0cmFjdE1vZGVsQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudGF0aW9uU2VjdGlvbiBleHRlbmRzIEFTREFic3RyYWN0U2VjdGlvbiB7Ci0JVGV4dCBkb2NUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJZG9jVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSB8IFNXVC5OT05FIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsgLy8kTk9OLU5MUy0xJAotCQlkb2NUZXh0LmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCB0aGlzKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRvY1RleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkb2NUZXh0LCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPUEVSVElFU19ET0NVTUVOVEFUSU9OX1RBQik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JLyoKLQkgKiBUT0RPOiB0aGUgZG9IYW5kbGVFdmVudCgpIGFuZCByZWZyZXNoKCkgbWV0aG9kcyBib3RoIHVzZSBXU0RMMTEgc3BlY2lmaWMKLQkgKiBrbm93bGVkZ2UuICBUaGlzIGNsYXNzIChEb2N1bWVudGF0aW9uU2VjdGlvbikgc2hvdWxkIGJlIGdlbmVyaWMuICBJbiBQb3N0IDEuNSwKLQkgKiB3ZSBuZWVkIHRvIGFkZCBkb2N1bWVudGF0aW9uIHN1cHBvcnQgbWV0aG9kcyB0byBvdXIgZmFjYWRlIHNvIHdlIGRvbid0IG5lZWQKLQkgKiB0byBrbm93IFdTREwgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uLi4uLi4uIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLQkJc3VwZXIucmVmcmVzaCgpOwotCQlpZiAoZG9jVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJZG9jVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0TW9kZWwoKSAhPSBudWxsICYmIGdldEVsZW1lbnQoKSAhPSBudWxsKQotCQl7Ci0JCQlFbGVtZW50IGRvY05vZGUgPSBnZXRFbGVtZW50KCkuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWlmIChkb2NOb2RlICE9IG51bGwpCi0JCQl7Ci0JCQkJTm9kZSB0ZXh0Tm9kZSA9IGRvY05vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmICh0ZXh0Tm9kZSAhPSBudWxsKQotCQkJCXsKLQkJCQkJU3RyaW5nIGRvY1ZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCWlmIChkb2NWYWx1ZSAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlkb2NUZXh0LnNldFRleHQoZG9jVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIFRPRE86IHRoZSBkb0hhbmRsZUV2ZW50KCkgYW5kIHJlZnJlc2goKSBtZXRob2RzIGJvdGggdXNlIFdTREwxMSBzcGVjaWZpYwotCSAqIGtub3dsZWRnZS4gIFRoaXMgY2xhc3MgKERvY3VtZW50YXRpb25TZWN0aW9uKSBzaG91bGQgYmUgZ2VuZXJpYy4gIEluIFBvc3QgMS41LAotCSAqIHdlIG5lZWQgdG8gYWRkIGRvY3VtZW50YXRpb24gc3VwcG9ydCBtZXRob2RzIHRvIG91ciBmYWNhZGUgc28gd2UgZG9uJ3QgbmVlZAotCSAqIHRvIGtub3cgV1NETCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4uLi4uLi4gCi0JICovCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gZG9jVGV4dCkKLQkJewotCQkJU3RyaW5nIHZhbHVlID0gZG9jVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoZ2V0TW9kZWwoKSAhPSBudWxsICYmIGdldEVsZW1lbnQoKSAhPSBudWxsKQotCQkJewotCQkJCUVsZW1lbnQgZG9jTm9kZSA9IGdldEVsZW1lbnQoKS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJCWlmIChkb2NOb2RlICE9IG51bGwpCi0JCQkJewotCQkJCQlOb2RlIHRleHROb2RlID0gZG9jTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCWlmICh0ZXh0Tm9kZSAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQl0ZXh0Tm9kZS5zZXROb2RlVmFsdWUodmFsdWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkKLQkJCQkJCXsKLQkJCQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY05vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCQkJCW9yZy53M2MuZG9tLlRleHQgbmV3VGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0JCQkJCQkJZG9jTm9kZS5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnQoKTsKLQkJCQkJQWRkRWxlbWVudEFjdGlvbiBhY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbihlbGVtZW50LCBlbGVtZW50LmdldFByZWZpeCgpLCAiZG9jdW1lbnRhdGlvbiIsIGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQkJCUVsZW1lbnQgbmV3RG9jdW1lbnRhdGlvbiA9IGFjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0KLQkJCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXdEb2N1bWVudGF0aW9uLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQkJb3JnLnczYy5kb20uVGV4dCBuZXdUZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKLQkJCQkJbmV3RG9jdW1lbnRhdGlvbi5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0JCQkJCWdldEVsZW1lbnQoKS5zZXREb2N1bWVudGF0aW9uRWxlbWVudChuZXdEb2N1bWVudGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFdTRExFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCVdTRExFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKSB7Ci0JCQltb2RlbCA9ICgoQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24pIG1vZGVsKS5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQkvLyBUT0RPOiBTaG91bGQgd2UgYmUgaGFuZGxpbmcgdGhlIFhNTCBTY2hlbWEgY2FzZSBoZXJlIGFzIHdlbGw/Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikgewotCQkJT2JqZWN0IHRhcmdldCA9ICgoV1NETEJhc2VBZGFwdGVyKSBtb2RlbCkuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpIHsKLQkJCQllbGVtZW50ID0gKFdTRExFbGVtZW50KSB0YXJnZXQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL0VuZFBvaW50U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL0VuZFBvaW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGM3NTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvcHJvcGVydGllcy9zZWN0aW9ucy9FbmRQb2ludFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFFbmRQb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RTZXRFeGlzdGluZ0JpbmRpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmFjdGlvbnMuQVNEU2V0TmV3QmluZGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklBU0RPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmZhY2FkZS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklFbmRQb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlJlZmVyZW5jZUVkaXRNYW5hZ2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFbmRQb2ludFNlY3Rpb24gZXh0ZW5kcyBSZWZlcmVuY2VTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVGV4dCBhZGRyZXNzVGV4dDsKLQlwcm90ZWN0ZWQgQ0NvbWJvIHByb3RvY29sQ29tYm87Ci0JCi0JcHJvdGVjdGVkIExpc3QgYmluZGluZ3NJbkNvbWJvID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZWZNYW5hZ2VyOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0JCQotCQkvLyBBZGRyZXNzIHJvdwotCQlDTGFiZWwgYWRkcmVzc0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9BRERSRVNTICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFkZHJlc3NUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZHJlc3NUZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZHJlc3NUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJYWRkcmVzc0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJYWRkcmVzc1RleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhZGRyZXNzVGV4dCwgQVNERWRpdG9yQ1NIZWxwSWRzLlBST1BFUlRJRVNfUE9SVF9BRERSRVNTX1RFWFQpOwotCi0JCS8vIFByb3RvY29sIFJvdwotCQlDTGFiZWwgcHJvdG9jb2xMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQklORElOR19QUk9UT0NPTCArICI6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcm90b2NvbENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOyAvLyROT04tTkxTLTEkCi0KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvdG9jb2xDb21ibywgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcm90b2NvbENvbWJvLCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHJvdG9jb2xMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZHJlc3NUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXByb3RvY29sQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHJvdG9jb2xDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm90b2NvbENvbWJvLCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPUEVSVElFU19QT1JUX1BST1RPQ09MX1RFWFQpOwotCi0JCWNvbWJvTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQklORElORyArICI6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21ibywgQVNERWRpdG9yQ1NIZWxwSWRzLlBST1BFUlRJRVNfUE9SVF9CSU5ESU5HX0NPTUJPKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlyZW1vdmVMaXN0ZW5lcnMoYWRkcmVzc1RleHQpOwotCQlwcm90b2NvbENvbWJvLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCXN1cGVyLnJlZnJlc2goKTsKLQotCQlJRW5kUG9pbnQgZW5kUG9pbnQgPSAoSUVuZFBvaW50KSBnZXRNb2RlbCgpOwotCQlpZiAoZW5kUG9pbnQuZ2V0QWRkcmVzcygpICE9IG51bGwpIHsKLQkJCWlmICghZW5kUG9pbnQuZ2V0QWRkcmVzcygpLmVxdWFscyhhZGRyZXNzVGV4dC5nZXRUZXh0KCkpKSB7Ci0JCQkJYWRkcmVzc1RleHQuc2V0VGV4dChlbmRQb2ludC5nZXRBZGRyZXNzKCkpOwotCQkJfQotCQl9Ci0JCQotCQlwcm90b2NvbENvbWJvLnJlbW92ZUFsbCgpOwotCQlpZiAoZW5kUG9pbnQgaW5zdGFuY2VvZiBXMTFFbmRQb2ludCkgewotCQkJU3RyaW5nIHByb3RvY29sVmFsdWUgPSAoKFcxMUVuZFBvaW50KSBlbmRQb2ludCkuZ2V0UHJvdG9jb2woKTsKLQkJCUxpc3QgcHJvdG9jb2xzID0gKChXMTFFbmRQb2ludCkgZ2V0TW9kZWwoKSkuZ2V0QXBwbGljYWJsZVByb3RvY29sKCk7Ci0JCQlJdGVyYXRvciBpdCA9IHByb3RvY29scy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXByb3RvY29sQ29tYm8uYWRkKChTdHJpbmcpIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCQotCQkJcHJvdG9jb2xDb21iby5zZXRUZXh0KHByb3RvY29sVmFsdWUpOwotCQl9Ci0JCQotCQlzZXRDb250cm9sRm9yZWdyb3VuZENvbG9yKGFkZHJlc3NUZXh0KTsKLQkJc2V0Q29udHJvbEZvcmVncm91bmRDb2xvcihwcm90b2NvbENvbWJvKTsKLQkJYXBwbHlUZXh0TGlzdGVuZXJzKGFkZHJlc3NUZXh0KTsKLQkJcHJvdG9jb2xDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkgewotCQlpZiAocmVmTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVmTWFuYWdlcjsKLQkJfQotCi0JCXJlZk1hbmFnZXIgPSBSZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlci5nZXRCaW5kaW5nUmVmZXJlbmNlRWRpdE1hbmFnZXIoKElBU0RPYmplY3QpIGdldE1vZGVsKCkpOyAKLQkJCi0JCXJldHVybiByZWZNYW5hZ2VyOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldENvbWJvSXRlbXMoKSB7Ci0JCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotCQkKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaXRlbXMuYWRkKEJST1dTRV9TVFJJTkcpOwotCQlpdGVtcy5hZGQoTkVXX1NUUklORyk7Ci0KLQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGNvbWJvSXRlbXMgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvbWJvSXRlbXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpdGVtcy5hZGQoY29tYm9JdGVtc1tpbmRleF0pOwotCQl9Ci0JCQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q3VycmVudENvbWJvSXRlbSgpIHsKLQkJSUVuZFBvaW50IGVuZFBvaW50ID0gKElFbmRQb2ludCkgZ2V0TW9kZWwoKTsKLQkJcmV0dXJuIGVuZFBvaW50LmdldEJpbmRpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21ib0l0ZW1OYW1lKE9iamVjdCBpdGVtKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKSB7Ci0JCQluYW1lID0gKChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBpdGVtKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIElCaW5kaW5nKSB7Ci0JCQluYW1lID0gKChJQmluZGluZykgaXRlbSkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCW5hbWUgPSAoU3RyaW5nKSBpdGVtOwotCQl9Ci0JCQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUNvbWJvU2VsZWN0aW9uKE9iamVjdCBpdGVtKSB7Ci0JCUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG51bGw7Ci0JCQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pIHsKLQkJCXNwZWMgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgaXRlbTsKLQkJCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotCQkJbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoKElFbmRQb2ludCkgZ2V0TW9kZWwoKSwgc3BlYyk7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJaWYgKGl0ZW0uZXF1YWxzKEJST1dTRV9TVFJJTkcpKSB7Ci0JCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCQlBU0RTZXRFeGlzdGluZ0JpbmRpbmdBY3Rpb24gYWN0aW9uID0gbmV3IEFTRFNldEV4aXN0aW5nQmluZGluZ0FjdGlvbihwYXJ0KTsKLQkJCQlhY3Rpb24uc2V0SUVuZFBvaW50KChJRW5kUG9pbnQpIGdldE1vZGVsKCkpOwotCQkJCWFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGl0ZW0uZXF1YWxzKE5FV19TVFJJTkcpKSB7Ci0JCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCQlBU0RTZXROZXdCaW5kaW5nQWN0aW9uIGFjdGlvbiA9IG5ldyBBU0RTZXROZXdCaW5kaW5nQWN0aW9uKHBhcnQpOwotCQkJCWFjdGlvbi5zZXRJRW5kUG9pbnQoKElFbmRQb2ludCkgZ2V0TW9kZWwoKSk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCQl9Ci0JCQotCQlyZWZyZXNoKCk7Ci0JfQotCQotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLQkgIGlmIChldmVudC53aWRnZXQgPT0gYWRkcmVzc1RleHQgJiYgIWFkZHJlc3NUZXh0LmlzRGlzcG9zZWQoKSkgewotCQkgIFN0cmluZyBuZXdBZGRyZXNzID0gYWRkcmVzc1RleHQuZ2V0VGV4dCgpOwotCQkgIGlmIChuZXdBZGRyZXNzID09IG51bGwpIHsKLQkJCSAgbmV3QWRkcmVzcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCSAgfQotCQkgIAotCQkgIFN0cmluZyBvbGRBZGRyZXNzID0gZ2V0T2xkQWRkcmVzcygpOwotCQkgIGlmIChvbGRBZGRyZXNzLmVxdWFscyhuZXdBZGRyZXNzKSkKLQkJCSAgcmV0dXJuOwotCQkgIAotCQkgIElFbmRQb2ludCBlbmRQb2ludCA9IChJRW5kUG9pbnQpIGdldE1vZGVsKCk7Ci0JCSAgQ29tbWFuZCBjb21tYW5kID0gZW5kUG9pbnQuZ2V0U2V0QWRkcmVzc0NvbW1hbmQobmV3QWRkcmVzcyk7Ci0JCSAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0JICB9Ci0JICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gcHJvdG9jb2xDb21ibyAmJiAhcHJvdG9jb2xDb21iby5pc0Rpc3Bvc2VkKCkpIHsKLQkJICBTdHJpbmcgbmV3UHJvdG9jb2wgPSBwcm90b2NvbENvbWJvLmdldFRleHQoKTsKLQkJICBpZiAobmV3UHJvdG9jb2wgIT0gbnVsbCAmJiBnZXRNb2RlbCgpIGluc3RhbmNlb2YgVzExRW5kUG9pbnQpIHsKLQkJCSAgVzExRW5kUG9pbnQgZW5kUG9pbnQgPSAoVzExRW5kUG9pbnQpIGdldE1vZGVsKCk7Ci0JCQkgIGVuZFBvaW50LnNldFByb3RvY29sKG5ld1Byb3RvY29sKTsKLQkJICB9Ci0JICB9Ci0KLQkgIGVsc2UgewotCQkgIHN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotCSAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0T2xkQWRkcmVzcygpIHsKLQkgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFcxMUVuZFBvaW50KSB7Ci0JCSAgdmFsdWUgPSAoKFcxMUVuZFBvaW50KSBnZXRNb2RlbCgpKS5nZXRBZGRyZXNzKCk7Ci0JICB9Ci0KLQkgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCSAgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCSAgfQotCSAgcmV0dXJuIHZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvSW1wb3J0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL0ltcG9ydFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmMzA0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvSW1wb3J0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkltcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5iYXNpYy5XMTFJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRTZWN0aW9uIGV4dGVuZHMgQVNEQWJzdHJhY3RTZWN0aW9uCi17Ci0JcHJvdGVjdGVkIFRleHQgbmFtZXNwYWNlVGV4dCwgcHJlZml4VGV4dCwgbG9jYXRpb25UZXh0OwotCXByaXZhdGUgU3RyaW5nIG9sZFByZWZpeFZhbHVlOwotCUJ1dHRvbiBidXR0b247Ci0JLy8gVE9ETzogUmVtb3ZlOiBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0Ci0JSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQotCQluYW1lc3BhY2VUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJbmFtZXNwYWNlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0vLwkJbmFtZXNwYWNlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ0xhYmVsIG5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVzcGFjZVRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZXNwYWNlVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcHJlZml4VGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJcHJlZml4VGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWFwcGx5VGV4dExpc3RlbmVycyhwcmVmaXhUZXh0KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVzcGFjZVRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJcHJlZml4VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNMYWJlbCBwcmVmaXhMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfUFJFRklYKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsIDAsIFNXVC5DRU5URVIpOwotCQlwcmVmaXhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWxvY2F0aW9uVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWxvY2F0aW9uVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0vLwkJbG9jYXRpb25UZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCUNMYWJlbCBsb2NhdGlvbkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9jYXRpb25UZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotCQlidXR0b24uc2V0SW1hZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9icm93c2VidXR0b24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsb2NhdGlvblRleHQsIDAsIFNXVC5DRU5URVIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJbG9jYXRpb25UZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOyAgCi0JCU9iamVjdCBvYmogPSBnZXRNb2RlbCgpOwotCQlib29sZWFuIHJlZnJlc2hQcmVmaXhUZXh0ID0gdHJ1ZTsKLQkJYm9vbGVhbiByZWZyZXNoTG9jYXRpb25UZXh0ID0gdHJ1ZTsKLQkJYm9vbGVhbiByZWZyZXNoTmFtZXNwYWNlVGV4dCA9IHRydWU7Ci0JCWlmIChwcmVmaXhUZXh0LmlzRm9jdXNDb250cm9sKCkpCi0JCXsKLQkJCXJlZnJlc2hQcmVmaXhUZXh0ID0gZmFsc2U7Ci0JCX0KLQkJaWYgKGxvY2F0aW9uVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotCQl7Ci0JCQlyZWZyZXNoTG9jYXRpb25UZXh0ID0gZmFsc2U7Ci0JCX0KLQkJaWYgKG5hbWVzcGFjZVRleHQuaXNGb2N1c0NvbnRyb2woKSkKLQkJewotCQkJcmVmcmVzaE5hbWVzcGFjZVRleHQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChyZWZyZXNoUHJlZml4VGV4dCkKLQkJewotCQkJcHJlZml4VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChyZWZyZXNoTG9jYXRpb25UZXh0KQotCQl7Ci0JCQlsb2NhdGlvblRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocmVmcmVzaE5hbWVzcGFjZVRleHQpCi0JCXsKLQkJCW5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgSUltcG9ydCkKLQkJewotCQkJSUltcG9ydCB0aGVJbXBvcnQgPSAoSUltcG9ydCkgb2JqOwotCQkJaWYgKHJlZnJlc2hMb2NhdGlvblRleHQpCi0JCQl7Ci0JCQkJU3RyaW5nIGxvY2F0aW9uVmFsdWUgPSB0aGVJbXBvcnQuZ2V0TG9jYXRpb24oKTsgCi0JCQkJbG9jYXRpb25UZXh0LnNldFRleHQobG9jYXRpb25WYWx1ZSAhPSBudWxsID8gbG9jYXRpb25WYWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlTdHJpbmcgbmFtZXNwYWNlVmFsdWUgPSB0aGVJbXBvcnQuZ2V0TmFtZXNwYWNlKCk7Ci0JCQlpZiAocmVmcmVzaE5hbWVzcGFjZVRleHQpCi0JCQl7Ci0JCQkJbmFtZXNwYWNlVGV4dC5zZXRUZXh0KG5hbWVzcGFjZVZhbHVlICE9IG51bGwgPyBuYW1lc3BhY2VWYWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAocmVmcmVzaFByZWZpeFRleHQpCi0JCQl7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IHRoZUltcG9ydC5nZXROYW1lc3BhY2VQcmVmaXgoKTsKLQkJCQlwcmVmaXhUZXh0LnNldFRleHQocHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlvbGRQcmVmaXhWYWx1ZSA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkvLyBUT0RPOiBXZSBoYXZlIHNvbWUgV1NETDExIEltcGwgc3BlY2lmaWMga25vd2xlZGdlIGJlbG93Li4uIFdlIHNob3VsZCB0cnkgdG8gcmVtb3ZlIHRoaXMuLi4KLQkJaWYgKGV2ZW50LndpZGdldCA9PSBwcmVmaXhUZXh0ICYmIGxvY2F0aW9uVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwICYmIG5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCAmJiBnZXRNb2RlbCgpIGluc3RhbmNlb2YgVzExSW1wb3J0KSB7Ci0JCQlpZiAob2xkUHJlZml4VmFsdWUuZXF1YWxzKHByZWZpeFRleHQuZ2V0VGV4dCgpKSkKLQkJCSAgcmV0dXJuOwotCQkJCi0JCQlXMTFJbXBvcnQgdzExSW1wb3J0ID0gKFcxMUltcG9ydCkgZ2V0TW9kZWwoKTsKLQkJCUltcG9ydCBpbXBvcnRPYmogPSAoSW1wb3J0KSB3MTFJbXBvcnQuZ2V0VGFyZ2V0KCk7Ci0vLwkJCW9yZy53M2MuZG9tLkVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChpbXBvcnRPYmopOwotCQkJTWFwIG5hbWVzcGFjZXNNYXAgPSBpbXBvcnRPYmouZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldE5hbWVzcGFjZXMoKTsKLQotCQkJaWYgKG5hbWVzcGFjZXNNYXAuY29udGFpbnNLZXkocHJlZml4VGV4dC5nZXRUZXh0KCkpKSB7Ci0JCQkJLy8gV2Ugc2hvdWxkIGFkZCBlcnJvciBtZXNzYWdlcy4uLi4uLi4uLgotCQkJCS8vICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0xBQkVMX1BSRUZJWF9FWElTVFMiKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gaW1wb3J0T2JqLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFbGVtZW50KCk7Ci0JCQkJZGVmaW5pdGlvbkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeFZhbHVlKTsKLQkJCQlkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXhUZXh0LmdldFRleHQoKSwgbmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkpOwotCi0vLwkJCQljbGVhckVycm9yTWVzc2FnZSgpOwotCQkJCW9sZFByZWZpeFZhbHVlID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCXsKLQkJLy8gVE9ETzogV2UgaGF2ZSBzb21lIFdTREwxMSBJbXBsIHNwZWNpZmljIGtub3dsZWRnZSBiZWxvdy4uLiBXZSBzaG91bGQgdHJ5IHRvIHJlbW92ZSB0aGlzLi4uCi0JCWlmIChlLndpZGdldCA9PSBidXR0b24gJiYgZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFcxMUltcG9ydCkKLQkJewotCQkJVzExSW1wb3J0IHcxMUltcG9ydCA9IChXMTFJbXBvcnQpIGdldE1vZGVsKCk7Ci0KLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJSUZpbGUgY3VycmVudFdTRExGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCi0JCQlTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgbnVsbCwgdHJ1ZSk7Ci0JCQlTdHJpbmcgW10gZmlsdGVycyA9IHsgInhzZCIsICJ3c2RsIiB9OyAvLyROT04tTkxTLTEkCi0JCQlJRmlsZSBbXSBleGNsdWRlZEZpbGVzID0geyBjdXJyZW50V1NETEZpbGUgfTsKLQotCQkJZGlhbG9nLmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVycywgZXhjbHVkZWRGaWxlcyk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLk1lc3NhZ2VzLl9VSV9USVRMRV9TRUxFQ1QpOyAvLyROT04tTkxTLTEkCi0JCQlkaWFsb2cuc2V0VGl0bGUob3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXMuX1VJX1RJVExFX1NFTEVDVF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlhbG9nLnNldE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuTWVzc2FnZXMuX1VJX0RFU0NSSVBUSU9OX1NFTEVDVF9XU0RMX09SX1hTRCk7IC8vJE5PTi1OTFMtMSQKLQkJCWludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLQkJCXsKLQkJCQlJRmlsZSBzZWxlY3RlZEZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCi0JCQkJLy9pZiAoc2VsZWN0ZWRGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLmVxdWFscyhjdXJyZW50V1NETEZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpKQotCQkJCS8vewotCQkJCS8vICBTeXN0ZW0ub3V0LnByaW50bG4oIlNBTUUgRklMRToiICsgY3VycmVudFdTRExGaWxlLmdldExvY2F0aW9uKCkpOwotCQkJCS8vfQotCi0JCQkJU3RyaW5nIGxvY2F0aW9uID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlUmVsYXRpdmVVUkkoc2VsZWN0ZWRGaWxlLCBjdXJyZW50V1NETEZpbGUsIHRydWUpOwotCi0JCQkJSW1wb3J0IGltcG9ydE9iaiA9IChJbXBvcnQpIHcxMUltcG9ydC5nZXRUYXJnZXQoKTsKLQkJCQlvcmcudzNjLmRvbS5FbGVtZW50IGltcG9ydEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW1wb3J0T2JqKTsKLQkJCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBpbXBvcnRPYmouZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCQkJCW9yZy53M2MuZG9tLkVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0KLQkJCQlTdHJpbmcgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcHJlZml4ID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIHVuaXF1ZVByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoc2VsZWN0ZWRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7ICAgICAgCi0KLQkJCQkvLyBub3RlIHRoYXQgdGhlIGdldFRhcmdldE5hbWVzcGFjZVVSSUZvclNjaGVtYSB3b3JrcyBmb3IgYm90aCBzY2hlbWEgYW5kIHdzZGwgZmlsZXMKLQkJCQkvLyBJIHNob3VsZCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjb252ZW5pZW5jZSBtZXRob2QKLQkJCQlpbXBvcnRUYXJnZXROYW1lc3BhY2UgPSAgV1NETEVkaXRvclV0aWwuZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKHVyaS50b1N0cmluZygpKTsKLQotCQkJCWlmIChwcmVmaXgudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCXVuaXF1ZVByZWZpeCA9IGdldFVuaXF1ZVByZWZpeChkZWZpbml0aW9uLCB1cmkuZmlsZUV4dGVuc2lvbigpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdW5pcXVlUHJlZml4ID0gcHJlZml4OyAKLQkJCQl9Ci0KLQotCQkJCWlmIChpbXBvcnRUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fAotCQkJCQkJKGltcG9ydFRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIGltcG9ydFRhcmdldE5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0JCQkJewotCQkJCQlyZXR1cm47ICAvLyB3aGF0IHRvIGRvIHdpdGggbm8gbmFtZXNwYWNlIGRvY3M/Ci0JCQkJfQotCi0JCQkJaW1wb3J0T2JqLnNldExvY2F0aW9uVVJJKGxvY2F0aW9uKTsKLQkJCQlpbXBvcnRPYmouc2V0TmFtZXNwYWNlVVJJKGltcG9ydFRhcmdldE5hbWVzcGFjZSk7Ci0JCQkJKChJbXBvcnRJbXBsKSBpbXBvcnRPYmopLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotCi0JCQkJZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgdW5pcXVlUHJlZml4LCBpbXBvcnRUYXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0KLQkJCQluYW1lc3BhY2VUZXh0LnNldFRleHQoaW1wb3J0VGFyZ2V0TmFtZXNwYWNlKTsKLQkJCQlsb2NhdGlvblRleHQuc2V0VGV4dChsb2NhdGlvbik7Ci0JCQkJcHJlZml4VGV4dC5zZXRUZXh0KHVuaXF1ZVByZWZpeCk7Ci0JCQl9Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVQcmVmaXgoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgaW5pdFByZWZpeCkKLQl7Ci0JCVN0cmluZyB1bmlxdWVQcmVmaXg7Ci0JCU1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQotCQlpZiAoZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UoaW5pdFByZWZpeCkgPT0gbnVsbCkKLQkJewotCQkJdW5pcXVlUHJlZml4ID0gaW5pdFByZWZpeDsKLQkJfQotCQllbHNlIC8vIGlmIHVzZWQsIHRoZW4gdHJ5IHRvIGNyZWF0ZSBhIHVuaXF1ZSBvbmUKLQkJewotCQkJU3RyaW5nIHRlbXBQcmVmaXggPSBpbml0UHJlZml4OwotCQkJaW50IGkgPSAxOwotCQkJd2hpbGUobWFwLmNvbnRhaW5zS2V5KHRlbXBQcmVmaXggKyBpKSkKLQkJCXsKLQkJCQlpKys7Ci0JCQl9Ci0JCQl1bmlxdWVQcmVmaXggPSB0ZW1wUHJlZml4ICsgaTsKLQkJfQotCQlyZXR1cm4gdW5pcXVlUHJlZml4OyAgICAKLQl9Ci0KLQkvLyBUT0RPOiBSZW1vdmUgbWV0b2Qgc2V0RWRpdG9yUGFydCgpIGJlbG93Ci0JcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotCXsKLQkJdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvTmFtZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvcHJvcGVydGllcy9zZWN0aW9ucy9OYW1lU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmFhNDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvcHJvcGVydGllcy9zZWN0aW9ucy9OYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLklTZWxlY3Rpb25NYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSU5hbWVkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuUmVuYW1lQ29tcG9uZW50QWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgTmFtZVNlY3Rpb24gZXh0ZW5kcyBBU0RBYnN0cmFjdFNlY3Rpb24gaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIgewotCUNMYWJlbCBuYW1lTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIC8qKgotICAgKiBDbGlja2luZyBvbiBpdCBpbnZva2VzIHRoZSByZWZhY3Rvci0+cmVuYW1lIGFjdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZUh5cGVybGluayByZW5hbWVIeXBlcmxpbms7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJCi0JCUZvcm1EYXRhIGRhdGE7CQkKLSAgICAKLQkJbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwgQVNERWRpdG9yQ1NIZWxwSWRzLlBST1BFUlRJRVNfTkFNRV9URVhUKTsKLQotCQluYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYXBwbHlUZXh0TGlzdGVuZXJzKG5hbWVUZXh0KTsKLQl9Ci0JCi0gIHByaXZhdGUgdm9pZCBzaG93UmVmYWN0b3JCdXR0b24oKSB7Ci0gICAgaWYgKGlzUmVhZE9ubHkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAKLSAgICBpZiAocmVuYW1lSHlwZXJsaW5rID09IG51bGwpIHsKLSAgICAgIHJlbmFtZUh5cGVybGluayA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVJbWFnZUh5cGVybGluayhjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotICAgICAgcmVuYW1lSHlwZXJsaW5rLnNldEltYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcXVpY2thc3Npc3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICByZW5hbWVIeXBlcmxpbmsuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1RPT0xUSVBfUkVOQU1FX1JFRkFDVE9SKTsKLSAgICAgIHJlbmFtZUh5cGVybGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICByZW5hbWVIeXBlcmxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBkYXRhID0gKEZvcm1EYXRhKSBuYW1lVGV4dC5nZXRMYXlvdXREYXRhKCk7IAotICAgIEZvcm1BdHRhY2htZW50IHJpZ2h0ID0gZGF0YS5yaWdodDsKLSAgICByaWdodC5jb250cm9sID0gcmVuYW1lSHlwZXJsaW5rOwotICAgIHJpZ2h0Lm9mZnNldCA9IC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFOwotICAgIHJpZ2h0LmFsaWdubWVudCA9IFNXVC5MRUZUOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHJlbmFtZUh5cGVybGluaywgMCwgU1dULkNFTlRFUik7Ci0gICAgcmVuYW1lSHlwZXJsaW5rLnNldFZpc2libGUodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoaWRlUmVmYWN0b3JCdXR0b24oKSB7Ci0gICAgaWYgKGlzUmVhZE9ubHkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocmVuYW1lSHlwZXJsaW5rID09IG51bGwpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRm9ybURhdGEgZGF0YSA9IChGb3JtRGF0YSkgbmFtZVRleHQuZ2V0TGF5b3V0RGF0YSgpOwotICAgIEZvcm1BdHRhY2htZW50IHJpZ2h0ID0gZGF0YS5yaWdodDsKLSAgICByaWdodC5jb250cm9sID0gbnVsbDsKLSAgICByaWdodC5udW1lcmF0b3IgPSAxMDA7Ci0gICAgcmlnaHQub2Zmc2V0ID0gLXJpZ2h0TWFyZ2luU3BhY2U7IAotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIHJlbmFtZUh5cGVybGluay5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgfQotICAKLSAgCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc3VwZXIucmVmcmVzaCgpOwotCQlpZiAobmFtZVRleHQuaXNEaXNwb3NlZCgpIHx8IG5hbWVUZXh0LmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIElOYW1lZE9iamVjdCkgewotCQkJbmFtZSA9ICgoSU5hbWVkT2JqZWN0KSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQlPYmplY3QgbW9kZWwgPSAoKEVkaXRQYXJ0KSBnZXRNb2RlbCgpKS5nZXRNb2RlbCgpOyAKLQkJCW5hbWUgPSAoKElOYW1lZE9iamVjdCkgbW9kZWwpLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCW5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0JCXNldENvbnRyb2xGb3JlZ3JvdW5kQ29sb3IobmFtZVRleHQpOwotICAgIAotICAgIGlmIChjYW5SZWZhY3RvcigpKSB7Ci0gICAgICBzaG93UmVmYWN0b3JCdXR0b24oKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBoaWRlUmVmYWN0b3JCdXR0b24oKTsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJCUlOYW1lZE9iamVjdCBuYW1lZE9iamVjdCA9IG51bGw7Ci0JCQkKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElOYW1lZE9iamVjdCkgewotCQkJCW5hbWVkT2JqZWN0ID0gKElOYW1lZE9iamVjdCkgbW9kZWw7Ci0JCQl9Ci0JCQkKLQkJCWlmIChuYW1lZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKCAhbmV3VmFsdWUuZXF1YWxzKCBuYW1lZE9iamVjdC5nZXROYW1lKCkgKSApewotCQkJCSAgQ29tbWFuZCBjb21tYW5kID0gbmFtZWRPYmplY3QuZ2V0U2V0TmFtZUNvbW1hbmQobmV3VmFsdWUpOwotCQkJCSAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotICAKLSAgcHJpdmF0ZSB2b2lkIGludm9rZVJlbmFtZVJlZmFjdG9yaW5nKCkgewotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWVkaXRvci5nZXRBZGFwdGVyKERlZmluaXRpb24uY2xhc3MpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZWRpdG9yLmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotICAgIElTZWxlY3Rpb25NYXBwZXIgbWFwcGVyID0gKElTZWxlY3Rpb25NYXBwZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25NYXBwZXIuY2xhc3MpOwotICAgIHNlbGVjdGlvbiA9IG1hcHBlciAhPSBudWxsID8gbWFwcGVyLm1hcFNlbGVjdGlvbihzZWxlY3Rpb24pIDogc2VsZWN0aW9uOwotICAgIFJlbmFtZUNvbXBvbmVudEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVuYW1lQ29tcG9uZW50QWN0aW9uKHNlbGVjdGlvbiwgZGVmaW5pdGlvbik7Ci0gICAgYWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotICAgIGFjdGlvbi5ydW4oKTsKLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0IGdldFJlYWxNb2RlbCgpIHsKLSAgICBPYmplY3QgcmVhbE1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICAKLSAgICBpZiAocmVhbE1vZGVsIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLSAgICAgIHJlYWxNb2RlbCA9ICgoRWRpdFBhcnQpIGdldE1vZGVsKCkpLmdldE1vZGVsKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZWFsTW9kZWw7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGUgbW9kZWwgb2JqZWN0J3MgbmFtZSBjYW4gYmUgcmVmYWN0b3JlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBvYmplY3QgY2FuIGJlIHJlZmFjdG9yZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjYW5SZWZhY3RvcigpIHsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRSZWFsTW9kZWwoKTsKLQotICAgIGJvb2xlYW4gY2FuUmVmYWN0b3IgPSBtb2RlbCBpbnN0YW5jZW9mIElNZXNzYWdlIHx8IAotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIElCaW5kaW5nIHx8IAotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIElJbnRlcmZhY2U7Ci0gICAgcmV0dXJuIGNhblJlZmFjdG9yOwotICB9Ci0gIAotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXIjbGlua0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpCi0gIHsKLSAgICBpbnZva2VSZW5hbWVSZWZhY3RvcmluZygpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyI2xpbmtFbnRlcmVkKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGUpCi0gIHsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lciNsaW5rRXhpdGVkKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvTmFtZXNwYWNlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL05hbWVzcGFjZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjYzA1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvTmFtZXNwYWNlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmNvbW1hbmRzLlcxMUVkaXROYW1lc3BhY2VzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuQVNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuYWN0aW9ucy5BU0RFZGl0TmFtZXNwYWNlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5BYnN0cmFjdE1vZGVsQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklOYW1lZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2Qub3V0bGluZS5JQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlU2VjdGlvbiBleHRlbmRzIEFTREFic3RyYWN0U2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIENvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2cgZWRpdFdTRExOYW1lc3BhY2VzQ29udHJvbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1dHRvbjsKLQkKLQlUZXh0IG5hbWVUZXh0OwotCVRleHQgcHJlZml4VGV4dDsKLQlUZXh0IHRhcmdldE5hbWVzcGFjZVRleHQ7Ci0JcHJvdGVjdGVkIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZSB0YWJsZVZpZXdlcjsKLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxpbmdFdmVudDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJCi0JCVN0cmluZyBuYW1lU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUgKyAiOiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgcHJlZml4U3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWCArICI6IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyBuYW1lc3BhY2VTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRTsgLy8kTk9OLU5MUy0xJAotCQlHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotCQlpbnQgeG9mZnNldCA9IE1hdGgubWF4KDExNSwgZ2MudGV4dEV4dGVudChuYW1lU3RyaW5nKS54ICsgMjApOyAvLyBhZGRzIDIwIGR1ZSB0byBib3JkZXJzCi0JCXhvZmZzZXQgPSBNYXRoLm1heCh4b2Zmc2V0LCBnYy50ZXh0RXh0ZW50KHByZWZpeFN0cmluZykueCArIDIwKTsgLy8gYWRkcyAyMCBkdWUgdG8gYm9yZGVycwotCQl4b2Zmc2V0ID0gTWF0aC5tYXgoeG9mZnNldCwgZ2MudGV4dEV4dGVudChuYW1lc3BhY2VTdHJpbmcpLnggKyAyMCk7IC8vIGFkZHMgMjAgZHVlIHRvIGJvcmRlcnMKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJLy8gbmFtZQotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG5hbWVTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCW5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwgQVNERWRpdG9yQ1NIZWxwSWRzLlBST1BFUlRJRVNfTkFNRV9URVhUKTsKLQkJCi0JCS8vIHByZWZpeAotCQlDTGFiZWwgcHJlZml4TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgcHJlZml4U3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmaXhUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcmVmaXhUZXh0LCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPUEVSVElFU19ERUZfUFJFRklYX1RFWFQpOwotCQkKLQkJLy8gdGFyZ2V0bmFtZXNwYWNlCi0JCUNMYWJlbCB0YXJnZXROYW1lc3BhY2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBuYW1lc3BhY2VTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCXRhcmdldE5hbWVzcGFjZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRhcmdldE5hbWVzcGFjZVRleHQsIEFTREVkaXRvckNTSGVscElkcy5QUk9QRVJUSUVTX0RFRl9UTlNfVEVYVCk7Ci0JCQotCQkvLyBBZHZhbmNlZCBidXR0b24KLQkJYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9TRUNUSU9OX0FEVkFOQ0VEX0FUVFJJQlVURVMgKyAiLi4uIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCQotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8gTGFiZWxzCi0JCS8vIG5hbWUgbGF5b3V0Ci0JCUZvcm1EYXRhIGRhdGFOYW1lTGFiZWwgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YU5hbWVMYWJlbC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhTmFtZUxhYmVsKTsKLQkJCi0JCS8vIHByZWZpeCBsYXlvdXQKLQkJRm9ybURhdGEgZGF0YVByZWZpeExhYmVsID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGFQcmVmaXhMYWJlbC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhUHJlZml4TGFiZWwudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsIDAsIFNXVC5DRU5URVIpOwotCQlwcmVmaXhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGFQcmVmaXhMYWJlbCk7Ci0JCQotCQkvLyB0YXJnZXROYW1lc3BhY2VMYWJlbCBsYXlvdXQKLQkJRm9ybURhdGEgZGF0YXRuc0xhYmVsID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGF0bnNMYWJlbC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhdG5zTGFiZWwucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFyZ2V0TmFtZXNwYWNlVGV4dCwgMCk7Ci0JCWRhdGF0bnNMYWJlbC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFyZ2V0TmFtZXNwYWNlVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCXRhcmdldE5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YXRuc0xhYmVsKTsKLQkJCi0JCQotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8gVGV4dCBGaWVsZHMKLQkJLy8gbmFtZSB0ZXh0IGZpZWxkCi0JCUZvcm1EYXRhIGRhdGFOYW1lVGV4dCA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhTmFtZVRleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCB4b2Zmc2V0KTsKLQkJZGF0YU5hbWVUZXh0LnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YU5hbWVUZXh0LnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhTmFtZVRleHQpOwotCQlhcHBseVRleHRMaXN0ZW5lcnMobmFtZVRleHQpOwotCQkKLQkJLy8gcHJlZml4IHRleHQgZmllbGQKLQkJRm9ybURhdGEgZGF0YVByZWZpeFRleHQgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YVByZWZpeFRleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCB4b2Zmc2V0KTsKLQkJZGF0YVByZWZpeFRleHQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhUHJlZml4VGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJcHJlZml4VGV4dC5zZXRMYXlvdXREYXRhKGRhdGFQcmVmaXhUZXh0KTsKLQkJYXBwbHlUZXh0TGlzdGVuZXJzKHByZWZpeFRleHQpOwotCQkKLQkJLy8gdGFyZ2V0bmFtZXNwYWNlIHRleHQgZmllbGQKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgeG9mZnNldCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXRhcmdldE5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYXBwbHlUZXh0TGlzdGVuZXJzKHRhcmdldE5hbWVzcGFjZVRleHQpOwotCQkKLQkJLy8gQWR2YW5jZWQgYnV0dG9uIGxheW91dAotCQlGb3JtRGF0YSBkYXRhQnV0dG9uID0gbmV3IEZvcm1EYXRhKCk7Ci0vLwkJZGF0YUJ1dHRvbi5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgKyAyKTsKLQkJZGF0YUJ1dHRvbi5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGFCdXR0b24udG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRhcmdldE5hbWVzcGFjZVRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLS8vCQlkYXRhQnV0dG9uLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXJnZXROYW1lc3BhY2VUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YUJ1dHRvbik7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWhhbmRsaW5nRXZlbnQgPSB0cnVlOwotCQlPYmplY3Qgb2JqID0gZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElEZXNjcmlwdGlvbikgewotCQkJSURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKElEZXNjcmlwdGlvbikgb2JqOwotCi0JCQlpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KSB7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhkZXNjcmlwdGlvbi5nZXROYW1lKCkpKSB7Ci0JCQkJCUNvbW1hbmQgY29tbWFuZCA9IGRlc2NyaXB0aW9uLmdldFNldE5hbWVDb21tYW5kKG5ld05hbWUpOwotCQkJCQlleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCB8fCBldmVudC53aWRnZXQgPT0gdGFyZ2V0TmFtZXNwYWNlVGV4dCkgewotCQkJCVN0cmluZyBuZXdUYXJnZXROUyA9IHRhcmdldE5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpOwkJCQkKLQkJCQlTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0JCQkJCi0JCQkJYm9vbGVhbiB0YXJnZXROU2RpZmYgPSAhbmV3VGFyZ2V0TlMuZXF1YWxzKGRlc2NyaXB0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCQlib29sZWFuIHByZWZpeERpZmYgPSAhbmV3UHJlZml4LmVxdWFscyhkZXNjcmlwdGlvbi5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0JCQkJaWYgKHRhcmdldE5TZGlmZiB8fCBwcmVmaXhEaWZmICkgewotCQkJCQkvLyBUT0RPOiBUaGUgY29kZSBiZWxvdyBpcyBub3QgZ2VuZXJpYy4gIFdlIG5lZWQgdG8gcmV2aXNpdCB0aGlzIHRvIGVuc3VyZSBpdCBpcwotCQkJCQkvLyBnZW5lcmljLiAgSURlc2NyaXB0aW9uIG5lZWRzIGEgZ2V0TmFtZXNwYWNlc0luZm8oKSBhbmQgZ2V0RWRpdE5hbWVzcGFjZXNDb21tYW5kKCkuLi4KLQkJCQkJVzExRWRpdE5hbWVzcGFjZXNDb21tYW5kIGNvbW1hbmQgPSAKLQkJCQkJCShXMTFFZGl0TmFtZXNwYWNlc0NvbW1hbmQpICgoVzExRGVzY3JpcHRpb24pIGRlc2NyaXB0aW9uKS5nZXRFZGl0TmFtZXNwYWNlc0NvbW1hbmQoKTsKLQkJCQkJaWYgKHRhcmdldE5TZGlmZikKLQkJCQkJICBjb21tYW5kLnNldFRhcmdldE5hbWVzcGFjZShuZXdUYXJnZXROUyk7Ci0JCQkJCWlmIChwcmVmaXhEaWZmKQotCQkJCQkgIGNvbW1hbmQuc2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KG5ld1ByZWZpeCk7Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWhhbmRsaW5nRXZlbnQgPSBmYWxzZTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldERlc2NyaXB0aW9uKCkgewotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbikgewotCQkJbW9kZWwgPSAoKEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKSBtb2RlbCkuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElEZXNjcmlwdGlvbikgewotCQkJCXJldHVybiAoSURlc2NyaXB0aW9uKSBtb2RlbDsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElDYXRlZ29yeUFkYXB0ZXIpIHsKLQkJCXJldHVybiAoKElDYXRlZ29yeUFkYXB0ZXIpIG1vZGVsKS5nZXRPd25lckRlc2NyaXB0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLQkJc3VwZXIucmVmcmVzaCgpOwotCQkKLQkJLy8gU2V0IG5hbWVUZXh0Ci0JCWlmIChuYW1lVGV4dCA9PSBudWxsIHx8IG5hbWVUZXh0LmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0RGVzY3JpcHRpb24oKSBpbnN0YW5jZW9mIElOYW1lZE9iamVjdCkgewotCQkJbmFtZVRleHQuc2V0VGV4dCgoKElOYW1lZE9iamVjdCkgZ2V0RGVzY3JpcHRpb24oKSkuZ2V0TmFtZSgpKTsKLQkJfQkJCi0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQkJCi0JCQotCQkvLyBTZXQgdGFyZ2V0TmFtZXNwYWNlVGV4dCBhbmQgcHJlZml4VGV4dAotCQlpZiAodGFyZ2V0TmFtZXNwYWNlVGV4dCA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZVRleHQuaXNGb2N1c0NvbnRyb2woKSB8fCBoYW5kbGluZ0V2ZW50KQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IG9iaiA9IGdldERlc2NyaXB0aW9uKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJRGVzY3JpcHRpb24pCi0JCXsKLQkJCUlEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChJRGVzY3JpcHRpb24pIG9iajsKLQkJCVN0cmluZyB0YXJnZXROUyA9IGRlc2NyaXB0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQkJU3RyaW5nIG5ld1ByZWZpeCA9IGRlc2NyaXB0aW9uLmdldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpOyAgICAgICAgICAgIAotCQkJcHJlZml4VGV4dC5zZXRUZXh0KG5ld1ByZWZpeCAhPSBudWxsID8gbmV3UHJlZml4IDogIiIpOwotCQkJCi0JCQkvLyBzZXQgdGFyZ2V0bmFtZXNwYWNlIGZpZWxkIGFuZCBwcmVmaXggZmllbGQKLQkJCWlmICh0YXJnZXROUyAhPSBudWxsKQotCQkJewotCQkJCXRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dCh0YXJnZXROUyk7Ci0JCQl9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICB9Ci0JCQlpZiAobmV3UHJlZml4ICE9IG51bGwpCi0JCQl7Ci0JCQkJcHJlZml4VGV4dC5zZXRUZXh0KG5ld1ByZWZpeCk7Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCXsKLQkJaWYgKGUud2lkZ2V0ID09IGJ1dHRvbikJewotCQkJT2JqZWN0IG9iaiA9IGdldERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSURlc2NyaXB0aW9uKSB7Ci0JCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCQlBU0RFZGl0TmFtZXNwYWNlc0FjdGlvbiBhY3Rpb24gPSBuZXcgQVNERWRpdE5hbWVzcGFjZXNBY3Rpb24ocGFydCwgKElEZXNjcmlwdGlvbikgb2JqKTsKLQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQkJcmVmcmVzaCgpOwotCSAgICAgICAgfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL1BhcmFtZXRlclNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvcHJvcGVydGllcy9zZWN0aW9ucy9QYXJhbWV0ZXJTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Mzg0YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL1BhcmFtZXRlclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5BU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5mYWNhZGUuSUFTRE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QuZmFjYWRlLklQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5SZWZlcmVuY2VFZGl0TWFuYWdlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyU2VjdGlvbiBleHRlbmRzIE5hbWVTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBORVdfU1RSSU5HID0gTWVzc2FnZXMuX1VJX0JVVFRPTl9ORVc7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBCUk9XU0VfU1RSSU5HID0gTWVzc2FnZXMuX1VJX0JVVFRPTl9CUk9XU0U7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgQ0xhYmVsIGNvbWJvTGFiZWw7IAotCXByb3RlY3RlZCBDQ29tYm8gY29tYm87Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVHlwZVNjZW5hcmlvID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcGFyYW1ldGVyUmVmTWFuYWdlcjsKLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY3JlYXRlQ29udHJvbEFyZWEoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbEFyZWEoKQotCXsKLQkJRm9ybURhdGEgZGF0YTsKLQkJCi0JCWNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotCQljb21iby5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQljb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQotCQljb21ib0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAwLCBTV1QuQ0VOVEVSKTsKLQkJY29tYm9MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLS8vCQlCdXR0b24gYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLS8vCQlidXR0b24uc2V0SW1hZ2UoSW50ZXJmYWNlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJpY29ucy9vYmoxNi9icm93c2VidXR0b24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0vLwkJCi0vLwkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotLy8JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLS8vCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSArIDIpOwotLy8JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLS8vCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0eXBlQ29tYm8sIDAsIFNXVC5DRU5URVIpOwotLy8JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLS8vCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lVGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzdXBlci5yZWZyZXNoKCk7Ci0JCWlmIChuYW1lVGV4dC5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbWJvLCBBU0RFZGl0b3JDU0hlbHBJZHMuUFJPUEVSVElFU19QQVJUX0VMRU1FTlRfQ09NQk8pOwotCi0JCWlmIChoYW5kbGVUeXBlU2NlbmFyaW8pIHsKLQkJCXJlZnJlc2hDb21ibygpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21ibywgQVNERWRpdG9yQ1NIZWxwSWRzLlBST1BFUlRJRVNfUEFSVF9UWVBFX0NPTUJPKTsKLQkJfQotCQkKLQkJc2V0Q29udHJvbEZvcmVncm91bmRDb2xvcihjb21ibyk7Ci0JCQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDb21ibygpIHsKLQkJSVBhcmFtZXRlciBwYXJhbSA9IG51bGw7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJUGFyYW1ldGVyKSB7Ci0JCQlwYXJhbSA9IChJUGFyYW1ldGVyKSBtb2RlbDsKLQkJfQotCQkKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdHlwZU5hbWUgPSAiUGFyYW1ldGVyU2VjdGlvbi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGFyYW0gIT0gbnVsbCkgewotCQkJbmFtZSA9IHBhcmFtLmdldE5hbWUoKTsKLQkJCXR5cGVOYW1lID0gcGFyYW0uZ2V0Q29tcG9uZW50TmFtZSgpOwotCQl9Ci0JCQotCQlpZiAoIW5hbWVUZXh0LmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCW5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0JCX0KLQkJCi0JCS8vIFBvcHVsYXRlIHRoZSB0eXBlIENvbWJvCi0JCWNvbWJvLnJlbW92ZUFsbCgpOwotCQljb21iby5hZGQoQlJPV1NFX1NUUklORyk7Ci0JCWNvbWJvLmFkZChORVdfU1RSSU5HKTsKLQkJCi0JCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLQkJaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb25bXSBzcGVjcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzcGVjcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQljb21iby5hZGQoKFN0cmluZykgc3BlY3NbaW5kZXhdLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQkKLQkJCXNwZWNzID0gZWRpdE1hbmFnZXIuZ2V0SGlzdG9yeSgpOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNwZWNzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCWNvbWJvLmFkZCgoU3RyaW5nKSBzcGVjc1tpbmRleF0uZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQkJCi0JCQotCQkvLyBEaXNwbGF5IHRoZSB0eXBlIGluIHRoZSBDb21ibwotCQlTdHJpbmdbXSBpdGVtcyA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0JCWludCBpbmRleDsKLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaXRlbXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAoaXRlbXNbaW5kZXhdLmVxdWFscyh0eXBlTmFtZSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JCQkvLyBGb3VuZCBhIG1hdGNoCi0JCQljb21iby5zZWxlY3QoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tYm8uc2V0VGV4dCh0eXBlTmFtZSk7Ci0JCX0KLQkJCi0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotCXsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBjb21ibykgewotCQkJaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgIWlzSW5Eb0hhbmRsZSkgCi0JCQl7Ci0JCQkJaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLQkJCQlzdGFydERlbGF5ZWRFdmVudChldmVudCk7Ci0JCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci5oYW5kbGVFdmVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCXN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGNvbWJvICYmIGhhbmRsZVR5cGVTY2VuYXJpbykgewotCQkJaGFuZGxlQ29tYm9TZWxlY3Rpb24oKTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDb21ib1NlbGVjdGlvbigpIHsKLQkJU3RyaW5nIHZhbHVlID0gY29tYm8uZ2V0SXRlbShjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCi0JCUlQYXJhbWV0ZXIgcGFyYW1ldGVyID0gKElQYXJhbWV0ZXIpIHRoaXMuZ2V0TW9kZWwoKTsKLQkJCi0JCWlmICh2YWx1ZS5lcXVhbHMoTkVXX1NUUklORykpIHsKLQkJCUNvbW1hbmQgY29tbWFuZCA9IHBhcmFtZXRlci5nZXRTZXRUeXBlQ29tbWFuZChJUGFyYW1ldGVyLlNFVF9ORVdfQUNUSU9OX0lEKTsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHZhbHVlLmVxdWFscyhCUk9XU0VfU1RSSU5HKSkgewotCQkJQ29tbWFuZCBjb21tYW5kID0gcGFyYW1ldGVyLmdldFNldFR5cGVDb21tYW5kKElQYXJhbWV0ZXIuU0VMRUNUX0VYSVNUSU5HX0FDVElPTl9JRCk7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCUNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IGdldENvbXBvbmVudFNwZWNpZmljYXRpb25Gb3JWYWx1ZSgoU3RyaW5nKXZhbHVlKTsKLQkJCWlmIChzcGVjICE9IG51bGwpIHsKLQkJCQllZGl0TWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UocGFyYW1ldGVyLCBzcGVjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKSB7Ci0JCWlmIChwYXJhbWV0ZXJSZWZNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJhbWV0ZXJSZWZNYW5hZ2VyOwotCQl9CQkKLSAgICAgICAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBJQVNET2JqZWN0KQotICAgICAgICB7ICAKLQkJICBwYXJhbWV0ZXJSZWZNYW5hZ2VyID0gUmVmZXJlbmNlRWRpdE1hbmFnZXJIZWxwZXIuZ2V0WFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKChJQVNET2JqZWN0KSBnZXRNb2RlbCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsIiArIGdldE1vZGVsKCkpOwotICAgICAgICB9ICAKLQkJcmV0dXJuIHBhcmFtZXRlclJlZk1hbmFnZXI7Ci0JfQotCQotCS8vIFRPRE86IHJtYWg6IFRoaXMgY29kZSBzaG91bGQgbGl2ZSBpbiBhIGNvbW1vbiBwbGFjZS4uLi4uIFRoaXMgY29kZSBpcyBhbHNvIHVzZWQgaW4gb3RoZXIgVUkgc2NlbmFyaW9zIHdoZW4KLQkvLyBhIHNpbWlsYXIgY29tYm8gYm94IGlzIHVzZWQuICBGb3IgZXhhbXBsZSBpbiBEaXJlY3QgRWRpdC4uLihUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIpICBBbHNvIHVzZWQgaW4gdGhlIFhTREVkaXRvci4uLgotCXByb3RlY3RlZCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNpZmljYXRpb25Gb3JWYWx1ZShTdHJpbmcgdmFsdWUpCi0JewotCQlDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0JCWlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotCQl7ICAKLQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb25bXSBxdWlja1BpY2tzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCQkJaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLQkJCXsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLQkJCQkJaWYgKHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0JCQkJCXsKLQkJCQkJCXJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotCQkJCQl9ICAgICAgICAgICAgICAgIAotCQkJCX0gIAotCQkJfQotCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBlZGl0TWFuYWdlci5nZXRIaXN0b3J5KCk7Ci0JCQlpZiAoaGlzdG9yeSAhPSBudWxsKQotCQkJewotCQkJCWZvciAoaW50IGk9MDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspCi0JCQkJewotCQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBoaXN0b3J5W2ldOwotCQkJCQlpZiAodmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLQkJCQkJeyAgCi0JCQkJCQlyZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQkJCQkJfQotCQkJCX0gIAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvUmVmZXJlbmNlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC9wcm9wZXJ0aWVzL3NlY3Rpb25zL1JlZmVyZW5jZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyMmRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3Byb3BlcnRpZXMvc2VjdGlvbnMvUmVmZXJlbmNlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5NZXNzYWdlczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZVNlY3Rpb24gZXh0ZW5kcyBOYW1lU2VjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlJPV1NFX1NUUklORyA9IE1lc3NhZ2VzLl9VSV9CVVRUT05fQlJPV1NFOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX1NUUklORyA9IE1lc3NhZ2VzLl9VSV9CVVRUT05fTkVXOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIENDb21ibyBjb21ibzsKLQlwcm90ZWN0ZWQgQ0xhYmVsIGNvbWJvTGFiZWw7Ci0JCi0JcHJvdGVjdGVkIExpc3QgaXRlbXNJbkNvbWJvID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJRm9ybURhdGEgZGF0YTsKLQkJCi0JCS8vIENyZWF0ZSBDb21ibyByb3cgb2Ygd2lkZ2V0cwotCQljb21ib0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICJSZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJAotCQljb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLQkJY29tYm8uc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQotCQkvLyBMYXlvdXQgQ29tYm8gTGFiZWwKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQljb21ib0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvLyBMYXlvdXQgQ29tYm8KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0JewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGNvbWJvKSB7Ci0JCQlpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiAhaXNJbkRvSGFuZGxlKSAKLQkJCXsKLQkJCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJCXN0YXJ0RGVsYXllZEV2ZW50KGV2ZW50KTsKLQkJCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWNvbWJvLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQkKLQkJc3VwZXIucmVmcmVzaCgpOwotCQkKLQkJTGlzdCBjb21ib0l0ZW1zID0gZ2V0Q29tYm9JdGVtcygpOwotCQlpZiAoY29tYm9JdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQljb21iby5yZW1vdmVBbGwoKTsKLQkJCWl0ZW1zSW5Db21iby5jbGVhcigpOwotCi0JCQkvLyBXZSBuZWVkIHRvIHBvcHVsYXRlIHRoaXMgY29tYm8gd2l0aCB0aGUgYXZhaWxhYmxlIHJlZmVyZW5jZXMKLQkJCS8vIFRPRE86IHJtYWg6IFdlIHNob3VsZCBpbmNsdWRlIHRoZSBwcmVmaXggYXMgd2VsbAotCQkJU3RyaW5nIGN1cnJlbnRDb21ib0l0ZW1OYW1lID0gZ2V0Q29tYm9JdGVtTmFtZShnZXRDdXJyZW50Q29tYm9JdGVtKCkpOwotCQkJaW50IGN1cnJlbnRCaW5kaW5nSW5kZXggPSAtMTsKLQkJCQotCQkJTGlzdCBpdGVtcyA9IGdldENvbWJvSXRlbXMoKTsKLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5zaXplKCk7IGluZGV4KyspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0ZW1zLmdldChpbmRleCk7Ci0JCQkJU3RyaW5nIGl0ZW1OYW1lID0gZ2V0Q29tYm9JdGVtTmFtZShpdGVtKTsKLQkJCQljb21iby5hZGQoaXRlbU5hbWUpOwotCQkJCWl0ZW1zSW5Db21iby5hZGQoaXRlbSk7Ci0KLQkJCQlpZiAoaXRlbU5hbWUuZXF1YWxzKGN1cnJlbnRDb21ib0l0ZW1OYW1lKSkgewotCQkJCQljdXJyZW50QmluZGluZ0luZGV4ID0gaW5kZXg7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY3VycmVudEJpbmRpbmdJbmRleCAhPSAtMSkgewotCQkJCWNvbWJvLnNlbGVjdChjdXJyZW50QmluZGluZ0luZGV4KTsJCi0JCQl9Ci0JCX0KLQkJCi0JCXNldENvbnRyb2xGb3JlZ3JvdW5kQ29sb3IoY29tYm8pOwotCQljb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgZ2V0Q29tYm9JdGVtcygpOwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0Q3VycmVudENvbWJvSXRlbSgpOwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29tYm9JdGVtTmFtZShPYmplY3QgaXRlbSk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybUNvbWJvU2VsZWN0aW9uKE9iamVjdCBpdGVtKTsKLQkKLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0JICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLQkgIGlmIChldmVudC53aWRnZXQgPT0gY29tYm8gJiYgIWNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkgIGludCBzZWxlY3Rpb25JbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCSAgcGVyZm9ybUNvbWJvU2VsZWN0aW9uKGl0ZW1zSW5Db21iby5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLQkJICByZWZyZXNoKCk7Ci0JICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvdXRpbC9BU0RFZGl0UGFydEZhY3RvcnlIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvdXRpbC9BU0RFZGl0UGFydEZhY3RvcnlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhM2Q0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1hc2Qvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYXNkL3V0aWwvQVNERWRpdFBhcnRGYWN0b3J5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYXNkLmRlc2lnbi5EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFzZC5kZXNpZ24uZWRpdHBhcnRzLkFTREVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBAZGVwcmFjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQVNERWRpdFBhcnRGYWN0b3J5SGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBBU0RFZGl0UGFydEZhY3RvcnlIZWxwZXIgaW5zdGFuY2U7Ci0JCi0JcHJpdmF0ZSBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5OwotCQotCXB1YmxpYyBzdGF0aWMgQVNERWRpdFBhcnRGYWN0b3J5SGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQVNERWRpdFBhcnRGYWN0b3J5SGVscGVyKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCWlmIChlZGl0UGFydEZhY3RvcnkgPT0gbnVsbCkgewotCQkJZWRpdFBhcnRGYWN0b3J5ID0gbmV3IEFTREVkaXRQYXJ0RmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBlZGl0UGFydEZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVkaXRQYXJ0RmFjdG9yeShFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSkgewotCQllZGl0UGFydEZhY3RvcnkgPSBmYWN0b3J5OwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpIHsKLQkJCSgoRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikgYWRhcHRlcikuc2V0RWRpdFBhcnRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC91dGlsL0lPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLWFzZC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hc2QvdXRpbC9JT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmU2ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtYXNkL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FzZC91dGlsL0lPcGVuRXh0ZXJuYWxFZGl0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hc2QudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBJT3BlbkV4dGVybmFsRWRpdG9ySGVscGVyIHsKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChPYmplY3Qgb2JqZWN0KTsKLQlwdWJsaWMgdm9pZCBvcGVuRXh0ZXJuYWxFZGl0b3IoKTsKLQlwdWJsaWMgYm9vbGVhbiBsaW5rQXBwbGljYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVmYWN0b3IvV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWZhY3Rvci9XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmYzczZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWZhY3Rvci9XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VhcmNoLklXU0RMU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLkNvbXBvbmVudFJlbmFtZUFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5YTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLS8qKgotICogVGhpcyBwYXJ0aWNpcGFudCB0YWtlcyBjYXNlIG9mIHJlbmFtaW5nIG1hdGNoZXMgdGhhdCBhcmUgWFNEIGNvbXBvbmVudHMKLSAqLwotcHVibGljIGNsYXNzIFdTRExDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFhNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV1NETEVsZW1lbnQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KXsKLQkJCWlmKGdldEFyZ3VtZW50cygpIGluc3RhbmNlb2YgQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKXsKLQkJCQltYXRjaGVzID0gKExpc3QpKChDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpZ2V0QXJndW1lbnRzKCkpLmdldE1hdGNoZXMoKS5nZXQoSVdTRExTZWFyY2hDb25zdGFudHMuV1NETF9OQU1FU1BBQ0UpOwotCQkJfQotCQkJaWYobWF0Y2hlcyAhPSBudWxsKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkKLQkJcmV0dXJuICJXU0RMIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQ29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Mzk1MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkdsb2JhbEJ1aWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TYXZlRGlydHlGaWxlc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Ob2RlQXNzb2NpYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlhNTFJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZW5hbWVSZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lQ29tcG9uZW50QWN0aW9uIGV4dGVuZHMgV1NETFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCXByaXZhdGUgUmVmYWN0b3JpbmdDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQ7Ci0KLQlwdWJsaWMgUmVuYW1lQ29tcG9uZW50QWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJRGVmaW5pdGlvbiBtb2RlbCkgewotCQlzdXBlcihzZWxlY3Rpb24pOwotCQlzZXRNb2RlbChtb2RlbCk7Ci0JfQotIAotCXByb3RlY3RlZCBib29sZWFuIGRvQ2FuRW5hYmxlWFNEU2VsZWN0aW9uKFhTRE5hbWVkQ29tcG9uZW50IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJc2VsZWN0ZWRDb21wb25lbnQgPSBuZXcgWE1MUmVmYWN0b3JpbmdDb21wb25lbnQoCi0JCQkJCXNlbGVjdGVkT2JqZWN0LAotCQkJCQkoSURPTUVsZW1lbnQpc2VsZWN0ZWRPYmplY3QuZ2V0RWxlbWVudCgpLCAKLQkJCQkJc2VsZWN0ZWRPYmplY3QuZ2V0TmFtZSgpLAotCQkJCQlzZWxlY3RlZE9iamVjdC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCi0JCQkvLyBpZiBpdCdzIGVsZW1lbnQgcmVmZXJlbmNlLCB0aGVuIHRoaXMgYWN0aW9uIGlzIG5vdCBhcHByb3ByaWF0ZQotCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBzZWxlY3RlZE9iamVjdDsKLQkJCQlpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKSB7Ci0JCQkJCXNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKXsKLQkJCQlYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBzZWxlY3RlZE9iamVjdDsKLQkJCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlLmdldENvbnRhaW5lcigpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJCWlmKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKS5lcXVhbHModHlwZSkpewotCQkJCQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHsKLQkJCQkJWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcGFyZW50OwotCQkJCQlpZihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkuZXF1YWxzKHR5cGUpKXsKLQkJCQkJCXNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjYW5SdW4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9DYW5FbmFibGVXU0RMU2VsZWN0aW9uKFdTRExFbGVtZW50IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gbnVsbDsKLQkJU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7IAotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nKXsKLQkJCWxvY2FsTmFtZSA9ICgoQmluZGluZylzZWxlY3RlZE9iamVjdCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCW5hbWVzcGFjZSA9ICgoQmluZGluZylzZWxlY3RlZE9iamVjdCkuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFBvcnRUeXBlKXsKLQkJCWxvY2FsTmFtZSA9ICgoUG9ydFR5cGUpc2VsZWN0ZWRPYmplY3QpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQluYW1lc3BhY2UgPSAoKFBvcnRUeXBlKXNlbGVjdGVkT2JqZWN0KS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTWVzc2FnZSl7Ci0JCQlsb2NhbE5hbWUgPSAoKE1lc3NhZ2Upc2VsZWN0ZWRPYmplY3QpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQluYW1lc3BhY2UgPSAoKE1lc3NhZ2Upc2VsZWN0ZWRPYmplY3QpLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCX0KLQkJaWYobG9jYWxOYW1lICE9IG51bGwpewotCQkJc2VsZWN0ZWRDb21wb25lbnQgPSBuZXcgWE1MUmVmYWN0b3JpbmdDb21wb25lbnQoCi0JCQkJCXNlbGVjdGVkT2JqZWN0LAotCQkJCQkoSURPTUVsZW1lbnQpc2VsZWN0ZWRPYmplY3QuZ2V0RWxlbWVudCgpLCAKLQkJCQkJbG9jYWxOYW1lLAotCQkJCQluYW1lc3BhY2UpOwotCQl9Ci0JCQotCQotCQlyZXR1cm4gY2FuUnVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKE9iamVjdCBzZWxlY3RlZE9iamVjdCkgewotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gZG9DYW5FbmFibGVYU0RTZWxlY3Rpb24oKFhTRE5hbWVkQ29tcG9uZW50KSBzZWxlY3RlZE9iamVjdCk7Ci0JCX0gZWxzZSBpZihzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCl7Ci0JCQlyZXR1cm4gZG9DYW5FbmFibGVXU0RMU2VsZWN0aW9uKChXU0RMRWxlbWVudEltcGwpIHNlbGVjdGVkT2JqZWN0KTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlpZiAoZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpIHsKLQkJCQkvLyBpc3N1ZSAoZWIpICBkZXBlbmRlbmN5IG9uIHV0aWxpdHkgY2xhc3MgdG8gZ2V0IGNvbXBvbmVudCBmcm9tIHRoZSBtb2RlbCBiYXNlZCBvbiBlbGVtZW50Ci0JCQkJT2JqZWN0IGNvbmNyZXRlQ29tcG9uZW50ID0gCShuZXcgTm9kZUFzc29jaWF0aW9uTWFuYWdlcigpKS5nZXRNb2RlbE9iamVjdEZvck5vZGUoZ2V0RGVmaW5pdGlvbigpLCBub2RlKTsKLQkJCQlyZXR1cm4gY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW4oKSB7Ci0KLQkJcmV0dXJuIHNlbGVjdGVkQ29tcG9uZW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCi0gICAgICAgIGJvb2xlYW4gcmMgPSBTYXZlRGlydHlGaWxlc0RpYWxvZy5zYXZlRGlydHlGaWxlcygpOwotICAgICAgICBpZiAoIXJjKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9ICAKLQkJUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3Ioc2VsZWN0ZWRDb21wb25lbnQsIHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCVJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCXRyeSB7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCXJlZmFjdG9yaW5nLAotCQkJCQlSZWZhY3RvcmluZ01lc3NhZ2VzCi0JCQkJCS5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFdpemFyZC5kZWZhdWx0UGFnZVRpdGxlIiksIC8vJE5PTi1OTFMtMSQgVE9ETzogcHJvdmlkZSBjb3JyZWN0IHN0cmluZ3MKLQkJCQkJUmVmYWN0b3JpbmdNZXNzYWdlcwotCQkJCQkuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRXaXphcmQuaW5wdXRQYWdlLmRlc2NyaXB0aW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmMgPSBzdXBlci5wZXJmb3JtRmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLygoRGVmaW5pdGlvbkltcGwpZ2V0RGVmaW5pdGlvbigpKS5yZWNvbmNpbGVSZWZlcmVuY2VzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH07ICAgICAgICAKLQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcCA9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24oCi0JCQkJCXdpemFyZCk7Ci0JCQlvcC5ydW4oV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQKLQkJCQkJLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQl0cmlnZ2VyQnVpbGQoKTsKLSAgICAgICAgICAgIAotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCQl7CQkJICAKLQkJCSAgcHVibGljIHZvaWQgcnVuKCkKLQkJCSAgewotCQkJICAgICgoRGVmaW5pdGlvbkltcGwpZ2V0RGVmaW5pdGlvbigpKS5yZWNvbmNpbGVSZWZlcmVuY2VzKHRydWUpOwotCQkJICB9Ci0JCQl9KTsgIAotICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcuIFVzZXIgYWN0aW9uIGdvdCBjYW5jZWxsZWQKLQkJfQotCQkKLQkJaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBEZWZpbml0aW9uSW1wbCkgewotCQkJKChEZWZpbml0aW9uSW1wbCkgZ2V0TW9kZWwoKSkucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyQnVpbGQoKSB7Ci0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKS5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCQluZXcgR2xvYmFsQnVpbGRBY3Rpb24oV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwKLQkJCQkJSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCkucnVuKCk7Ci0JCX0KLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvV1NETFJlZmFjdG9yQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvV1NETFJlZmFjdG9yQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0YTcxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1dTRExSZWZhY3RvckFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuUmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMUmVmYWN0b3JBY3Rpb25Hcm91cCBleHRlbmRzIFJlZmFjdG9yQWN0aW9uR3JvdXAgewotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX0VMRU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgV1NETFJlZmFjdG9yQWN0aW9uR3JvdXAoSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJCi0JCXN1cGVyKHNlbGVjdGlvbik7IAotCSAgCWlmKCBkZWZpbml0aW9uICE9IG51bGwpewotCQkJZkVkaXRvckFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlSZW5hbWVDb21wb25lbnRBY3Rpb24gYWN0aW9uID0gbmV3IFJlbmFtZUNvbXBvbmVudEFjdGlvbihzZWxlY3Rpb24sIGRlZmluaXRpb24pOwotCQkJZlJlbmFtZUFjdGlvbiA9IG5ldyBSZW5hbWVBY3Rpb24oc2VsZWN0aW9uKTsKLQkJCWZSZW5hbWVBY3Rpb24uc2V0UmVuYW1lQ29tcG9uZW50QWN0aW9uKGFjdGlvbik7Ci0JCQlmUmVuYW1lQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChSRU5BTUVfRUxFTUVOVCk7Ci0JCQlmRWRpdG9yQWN0aW9ucy5hZGQoZlJlbmFtZUFjdGlvbik7Ci0JCQlpbml0QWN0aW9uKGZSZW5hbWVBY3Rpb24sIHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2VBY3Rpb24oZlJlbmFtZUFjdGlvbiwgZlNlbGVjdGlvblByb3ZpZGVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvV1NETFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9XU0RMUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDVmOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9XU0RMUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLklTZWxlY3Rpb25NYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JHcm91cFN1Yk1lbnU7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlCi17Ci0gIHB1YmxpYyBXU0RMUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIEZpbGxzIHRoZSBtZW51IHdpdGggYXBwbGljYWJsZSByZWZhY3RvciBzdWItbWVudWVzCi0gICAqIAotICAgKiBAcGFyYW0gbWVudQotICAgKiAgICAgICAgICBUaGUgbWVudSB0byBmaWxsCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpCi0gIHsKLSAgICBpZiAoZlNlbGVjdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHdvcmtiZW5jaFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpOwotICAgICAgaWYgKHNpdGUgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gc2l0ZS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb25NYXBwZXIgbWFwcGVyID0gKElTZWxlY3Rpb25NYXBwZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25NYXBwZXIuY2xhc3MpOwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1hcHBlciAhPSBudWxsID8gbWFwcGVyLm1hcFNlbGVjdGlvbihmU2VsZWN0aW9uKSA6IGZTZWxlY3Rpb247Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBlZGl0b3IuZ2V0QWRhcHRlcihEZWZpbml0aW9uLmNsYXNzKTsKLSAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgUmVmYWN0b3JBY3Rpb25Hcm91cCByZWZhY3Rvck1lbnVHcm91cCA9IG5ldyBXU0RMUmVmYWN0b3JBY3Rpb25Hcm91cChzZWxlY3Rpb24sIGRlZmluaXRpb24pOwotICAgICAgICAgIFJlZmFjdG9yR3JvdXBTdWJNZW51IHN1Yk1lbnUgPSBuZXcgUmVmYWN0b3JHcm91cFN1Yk1lbnUocmVmYWN0b3JNZW51R3JvdXApOwotICAgICAgICAgIHN1Yk1lbnUuZmlsbChtZW51LCAtMSk7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvV1NETFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1dTRExTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODBmNjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvV1NETFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfRUxFTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBXU0RMU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlzdXBlcihzZWxlY3Rpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCl7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmKG1vZGVsIGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLQkJewotCQkJcmV0dXJuIChEZWZpbml0aW9uKSBtb2RlbDsKLQkJfQotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc2VhcmNoL0lXU0RMU2VhcmNoQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvSVdTRExTZWFyY2hDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2YzVjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvSVdTRExTZWFyY2hDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElXU0RMU2VhcmNoQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTkFNRVNQQUNFID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9DT05URU5UX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBNRVNTQUdFX01FVEFfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKAotCQkJV1NETF9OQU1FU1BBQ0UsICJtZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQT1JUX1RZUEVfTUVUQV9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoCi0JCQlXU0RMX05BTUVTUEFDRSwgInBvcnRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBCSU5ESU5HX01FVEFfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKAotCQkJV1NETF9OQU1FU1BBQ0UsICJiaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvV1NETFNlYXJjaENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvV1NETFNlYXJjaENvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDIzMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc2VhcmNoL1dTRExTZWFyY2hDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLkNvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV1NETFNlYXJjaENvbnRyaWJ1dG9yIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IgewotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVjbGFyYXRpb25zKCkgewotCi0JCWRlY2xhcmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBucyA9IElXU0RMU2VhcmNoQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFOwotCi0JCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCAibWVzc2FnZSIsICJuYW1lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlkZWNsYXJhdGlvbnMucHV0KElXU0RMU2VhcmNoQ29uc3RhbnRzLk1FU1NBR0VfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCQlwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCAicG9ydFR5cGUiLCAibmFtZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZGVjbGFyYXRpb25zLnB1dChJV1NETFNlYXJjaENvbnN0YW50cy5QT1JUX1RZUEVfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCQlwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4obnMsICJiaW5kaW5nIiwgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRlY2xhcmF0aW9ucy5wdXQoSVdTRExTZWFyY2hDb25zdGFudHMuQklORElOR19NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgIGluaXRpYWxpemVSZWZlcmVuY2VzKCkgewotCi0JCXJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmcgbnMgPSBJV1NETFNlYXJjaENvbnN0YW50cy5XU0RMX05BTUVTUEFDRTsKLQotCQlMaXN0IHBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCAicGFydCIsICJlbGVtZW50IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4obnMsICJwYXJ0IiwgInR5cGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCAicGFydCIsICJ0eXBlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCAiaW5wdXQiLCAibWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybihucywgIm91dHB1dCIsICJtZXNzYWdlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCAiZmF1bHQiLCAibWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlZmVyZW5jZXMucHV0KElXU0RMU2VhcmNoQ29uc3RhbnRzLk1FU1NBR0VfTUVUQV9OQU1FLCBwYXR0ZXJucyk7Ci0KLQkJcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybihucywgImJpbmRpbmciLCAidHlwZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlZmVyZW5jZXMucHV0KElXU0RMU2VhcmNoQ29uc3RhbnRzLlBPUlRfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgInBvcnQiLCAiYmluZGluZyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlZmVyZW5jZXMucHV0KElXU0RMU2VhcmNoQ29uc3RhbnRzLkJJTkRJTkdfTUVUQV9OQU1FLCBwYXR0ZXJucyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTdXBwb3J0ZWROYW1lc3BhY2VzKCkgewotCQluYW1lc3BhY2VzID0gbmV3IFN0cmluZ1tdeyBJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0UsIElXU0RMU2VhcmNoQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NlYXJjaC9XU0RMU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NlYXJjaC9XU0RMU2VhcmNoUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyNTUyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvV1NETFNlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5Db21wb25lbnRTZWFyY2hDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBYTUxTZWFyY2hQYXJ0aWNpcGFudCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnNlYXJjaC5XU0RMU2VhcmNoUGFydGljaXBhbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhTRF9QQVJUSUNJUEFOTlRfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5zZWFyY2guWFNEU2VhcmNoUGFydGljaXBhbnQiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgV1NETFNlYXJjaFBhcnRpY2lwYW50KCkKLQl7Ci0JICBzdXBlcigpOwotICAgICAgaWQgPSBJRDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbnRlbnRUeXBlcygpCi0JewotCSAgU3RyaW5nW10gcmVzdWx0ID0geyAib3JnLmVjbGlwc2Uud3N0LndzZGwud3NkbHNvdXJjZSIgfTsgLy8kTk9OLU5MUy0xJAotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiApewotCQkJWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiBjb21wb25lbnRQYXR0ZXJuID0gKFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSBjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQlpZihJV1NETFNlYXJjaENvbnN0YW50cy5XU0RMX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSB8fAotCQkJCQlJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hDb250cmlidXRvciBnZXRTZWFyY2hDb250cmlidXRvcigpIHsKLQotCQlyZXR1cm4gbmV3IFdTRExTZWFyY2hDb250cmlidXRvcigpOwotCX0KLQkKLSAgcHVibGljIHZvaWQgYmVnaW5TZWFyY2hpbmcoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBNYXAgc2VhcmNoT3B0aW9ucykgewotCQkKLQkJc3VwZXIuYmVnaW5TZWFyY2hpbmcocGF0dGVybiwgc2VhcmNoT3B0aW9ucyk7Ci0JCUxpc3QgcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pewotCQkJCi0JCQlYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4gY29tcG9uZW50UGF0dGVybiA9IChYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pcGF0dGVybjsKLQkJCWlmKElXU0RMU2VhcmNoQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFLmVxdWFscyhjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpKXsKLQkJCQlYTUxTZWFyY2hQYXR0ZXJuIGNoaWxkUGF0dGVybiA9IGdldFNlYXJjaENvbnRyaWJ1dG9yKCkuZ2V0RGVjbGFyYXRpb25QYXR0ZXJuKGNvbXBvbmVudFBhdHRlcm4uZ2V0TWV0YU5hbWUoKSk7Ci0JCQkJaWYoY2hpbGRQYXR0ZXJuICE9IG51bGwpewotCQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCSAgICAgCQkJcGF0dGVybnMuYWRkKGNoaWxkUGF0dGVybik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0UuZXF1YWxzKGNvbXBvbmVudFBhdHRlcm4uZ2V0TWV0YU5hbWUoKS5nZXROYW1lc3BhY2UoKSkpewotCQkJCVNlYXJjaFBhcnRpY2lwYW50IHhzZFBhcnRpY2lwYW50ID0gU2VhcmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZWFyY2hQYXJ0aWNpcGFudChYU0RfUEFSVElDSVBBTk5UX0lEKTsKLQkJCQlpZih4c2RQYXJ0aWNpcGFudCBpbnN0YW5jZW9mIFhNTFNlYXJjaFBhcnRpY2lwYW50KXsKLQkJCQkJQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IgeHNkQ29udHJpYnV0b3IgPSAoKFhNTFNlYXJjaFBhcnRpY2lwYW50KXhzZFBhcnRpY2lwYW50KS5nZXRTZWFyY2hDb250cmlidXRvcigpOwotCQkJCQlpZih4c2RDb250cmlidXRvciAhPSBudWxsKXsKLQkJCQkJCVhNTFNlYXJjaFBhdHRlcm4gY2hpbGRQYXR0ZXJuID0geHNkQ29udHJpYnV0b3IuZ2V0RGVjbGFyYXRpb25QYXR0ZXJuKGNvbXBvbmVudFBhdHRlcm4uZ2V0TWV0YU5hbWUoKSk7Ci0JCQkJCQlpZihjaGlsZFBhdHRlcm4gIT0gbnVsbCl7Ci0JCQkJCQkJY2hpbGRQYXR0ZXJuLnNldFNlYXJjaE5hbWUoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TG9jYWxOYW1lKCkpOwotCQkJCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkJICAgICAJCQlwYXR0ZXJucy5hZGQoY2hpbGRQYXR0ZXJuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNvbXBvbmVudFBhdHRlcm4uc2V0Q2hpbGRyZW4oKFhNTFNlYXJjaFBhdHRlcm5bXSkgcGF0dGVybnMudG9BcnJheShuZXcgWE1MU2VhcmNoUGF0dGVybltwYXR0ZXJucy5zaXplKCldKSk7Ci0JCQkKLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKXsKLQkJCVhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4gY29tcG9uZW50UGF0dGVybiA9IChYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKXBhdHRlcm47Ci0JCQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRQYXR0ZXJucyA9IGdldFNlYXJjaENvbnRyaWJ1dG9yKCkuZ2V0UmVmZXJlbmNlc1BhdHRlcm5zKGNvbXBvbmVudFBhdHRlcm4uZ2V0TWV0YU5hbWUoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkUGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLQkJCQlYTUxTZWFyY2hQYXR0ZXJuIGNoaWxkUGF0dGVybiA9IGNoaWxkUGF0dGVybnNbaV07Ci0JCQkJY2hpbGRQYXR0ZXJuLnNldFNlYXJjaE5hbWUoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TG9jYWxOYW1lKCkpOwotCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwkKLQkJCQlwYXR0ZXJucy5hZGQoY2hpbGRQYXR0ZXJuKTsKLQkJCX0KLQkJCVNlYXJjaFBhcnRpY2lwYW50IHhzZFBhcnRpY2lwYW50ID0gU2VhcmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZWFyY2hQYXJ0aWNpcGFudChYU0RfUEFSVElDSVBBTk5UX0lEKTsKLQkJCWlmKHhzZFBhcnRpY2lwYW50IGluc3RhbmNlb2YgWE1MU2VhcmNoUGFydGljaXBhbnQpewotCQkJCUNvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yIHhzZENvbnRyaWJ1dG9yID0gKChYTUxTZWFyY2hQYXJ0aWNpcGFudCl4c2RQYXJ0aWNpcGFudCkuZ2V0U2VhcmNoQ29udHJpYnV0b3IoKTsKLQkJCQlpZih4c2RDb250cmlidXRvciAhPSBudWxsKXsKLQkJCQkJY2hpbGRQYXR0ZXJucyA9IHhzZENvbnRyaWJ1dG9yLmdldFJlZmVyZW5jZXNQYXR0ZXJucyhjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkUGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVhNTFNlYXJjaFBhdHRlcm4gY2hpbGRQYXR0ZXJuID0gY2hpbGRQYXR0ZXJuc1tpXTsKLQkJCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldExvY2FsTmFtZSgpKTsKLQkJCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwkJCi0JCQkJCQlwYXR0ZXJucy5hZGQoY2hpbGRQYXR0ZXJuKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNvbXBvbmVudFBhdHRlcm4uc2V0Q2hpbGRyZW4oKFhNTFNlYXJjaFBhdHRlcm5bXSkgcGF0dGVybnMudG9BcnJheShuZXcgWE1MU2VhcmNoUGF0dGVybltwYXR0ZXJucy5zaXplKCldKSk7Ci0JCQkKLQkJfQotCQkKLQl9Ci0KLSAgCi0gIAotCQotCQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvV1NETEZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvV1NETEZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmEwODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1dTRExGaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Xb3Jrc3BhY2VTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuV1NETEJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWRhcHRlcnMuYmFzaWMuVzExSW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFkYXB0ZXJzLmJhc2ljLlcxMU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VhcmNoLklXU0RMU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLklTZWxlY3Rpb25NYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guWFNEU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9ucy5GaW5kQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgV1NETEZpbmRSZWZlcmVuY2VzQWN0aW9uIGV4dGVuZHMgRmluZEFjdGlvbgotewotICBwdWJsaWMgV1NETEZpbmRSZWZlcmVuY2VzQWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIHN1cGVyKGVkaXRvcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25EZWZpbml0aW9uSWQoU3RyaW5nIHN0cmluZykKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFRvIGJlIHVzZWQgYnkgc3ViY2xhc3MgaW4gaXRzIHJ1bigpIFJldHVybnMgdGhlIGZpbGUgd2hlcmUgdGhlIHNlbGVjdGlvbiBvZgotICAgKiBhIGNvbXBvbmVudCAoZnJvbSB0aGUgdXNlcikgb2NjdXJzIGllLiBSZXR1cm5zIHRoZSBmaWxlIHRoYXQgdGhlIHVzZXIgaXMKLSAgICogY3VycmVudGx5IHdvcmtpbmcgb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBJRmlsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCB3b3JraW5nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgSUZpbGUgZ2V0Q3VycmVudEZpbGUoKQotICB7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0gICAgICAgIHJldHVybiBmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBUbyBiZSB1c2VkIGJ5IHN1YmNsYXNzIGluIGl0cyBydW4oKS4uIERldGVybWluZXMgdGhlIG1ldGFOYW1lIG9mIHRoZSBXU0RMCi0gICAqIGNvbXBvbmVudCBnaXZlbiB0byB0aGlzIG1ldGhvZC4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQKLSAgICogICAgICAgICAgVGhlIGNvbXBvbmVudCBvZiB3aGljaCB3ZSB3YW50IHRvIGRldGVybWluZSB0aGUgbmFtZQotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGZpcnN0IG9uZSBpcyBmb3IgTWV0YU5hbWUvVHlwZSwgc2Vjb25kIGZvciBFbGVtZW50UXVhbGlmaWVkTmFtZQotICAgKi8KLSAgcHJvdGVjdGVkIFF1YWxpZmllZE5hbWVbXSBkZXRlcm1pbmVNZXRhQW5kUXVhbGlmaWVkTmFtZShXU0RMQmFzZUFkYXB0ZXIgY29tcG9uZW50KQotICB7Ci0gICAgUXVhbGlmaWVkTmFtZSBuYW1lc1tdID0gbnVsbDsKLSAgICBRTmFtZSBxTmFtZTsKLQlpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgVzExTWVzc2FnZSApCi0gICAgewotCQluYW1lcyA9IG5ldyBRdWFsaWZpZWROYW1lWzJdOwotICAgIAluYW1lc1swXSA9IElXU0RMU2VhcmNoQ29uc3RhbnRzLk1FU1NBR0VfTUVUQV9OQU1FOwotICAgIAlxTmFtZSA9ICgoTWVzc2FnZSkgY29tcG9uZW50LmdldFRhcmdldCgpKS5nZXRRTmFtZSgpOwotICAgIAluYW1lc1sxXSA9IG5ldyBRdWFsaWZpZWROYW1lKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFcxMUludGVyZmFjZSkKLSAgICB7Ci0gICAgCW5hbWVzID0gbmV3IFF1YWxpZmllZE5hbWVbMl07Ci0gICAgCW5hbWVzWzBdID0gSVdTRExTZWFyY2hDb25zdGFudHMuUE9SVF9UWVBFX01FVEFfTkFNRTsKLSAgICAJcU5hbWUgPSAoKFBvcnRUeXBlKSBjb21wb25lbnQuZ2V0VGFyZ2V0KCkpLmdldFFOYW1lKCk7Ci0gICAgCW5hbWVzWzFdID0gbmV3IFF1YWxpZmllZE5hbWUocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgVzExQmluZGluZykKLSAgICB7Ci0gICAgCW5hbWVzID0gbmV3IFF1YWxpZmllZE5hbWVbMl07Ci0gICAgCW5hbWVzWzBdID0gSVdTRExTZWFyY2hDb25zdGFudHMuQklORElOR19NRVRBX05BTUU7Ci0gICAgCXFOYW1lID0gKChCaW5kaW5nKSBjb21wb25lbnQuZ2V0VGFyZ2V0KCkpLmdldFFOYW1lKCk7Ci0gICAgCW5hbWVzWzFdID0gbmV3IFF1YWxpZmllZE5hbWUocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgIH0KLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgV1NETEJhc2VBZGFwdGVyIGdldFdTRExOYW1lZENvbXBvbmVudCgpCi0gIHsKLSAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgIElTZWxlY3Rpb25NYXBwZXIgbWFwcGVyID0gKElTZWxlY3Rpb25NYXBwZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25NYXBwZXIuY2xhc3MpOwotICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChtYXBwZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvbiA9IG1hcHBlci5tYXBTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgT2JqZWN0IG8gPSBzLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFdTRExCYXNlQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFdTRExCYXNlQWRhcHRlcikgbzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gVGhlIGV4cGVjdGVkIGNvbXBvbmVudCB3ZSBnZXQgZnJvbSB0aGUgZWRpdG9yIGRvZXMgbm90IG1lZXQKLSAgICAvLyBvdXIgZXhwZWN0YXRpb24KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIFN0cmluZyBwYXR0ZXJuID0gIiI7Ci0gICAgV1NETEJhc2VBZGFwdGVyIGNvbXBvbmVudCA9IGdldFdTRExOYW1lZENvbXBvbmVudCgpOwotICAgIElGaWxlIGZpbGUgPSBnZXRDdXJyZW50RmlsZSgpOwotICAgIFF1YWxpZmllZE5hbWVbXSBuYW1lcyA9IGRldGVybWluZU1ldGFBbmRRdWFsaWZpZWROYW1lKGNvbXBvbmVudCk7Ci0gICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCAmJiBuYW1lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFdvcmtzcGFjZVNlYXJjaFNjb3BlKCk7Ci0gICAgICBTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbiA9ICJXb3Jrc3BhY2UiOwotICAgICAgWFNEU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSBuZXcgWFNEU2VhcmNoUXVlcnkocGF0dGVybiwgZmlsZSwgbmFtZXNbMV0sIAotICAgIAkJICBuYW1lc1swXSwgWFNEU2VhcmNoUXVlcnkuTElNSVRfVE9fUkVGRVJFTkNFUywgc2NvcGUsIHNjb3BlRGVzY3JpcHRpb24pOwotICAgICAgTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0gICAgICBOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvV1NETEZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvV1NETEZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYjUyMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1dTRExGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlByb2plY3RTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guWFNEU2VhcmNoUXVlcnk7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24gZXh0ZW5kcyBXU0RMRmluZFJlZmVyZW5jZXNBY3Rpb257Ci0JcHVibGljIFdTRExGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpCi0JewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCQlTdHJpbmcgcGF0dGVybiA9ICIiOwotCQlXU0RMQmFzZUFkYXB0ZXIgY29tcG9uZW50ID0gZ2V0V1NETE5hbWVkQ29tcG9uZW50KCk7Ci0JCUlGaWxlIGZpbGUgPSBnZXRDdXJyZW50RmlsZSgpOwotCQlRdWFsaWZpZWROYW1lW10gbmFtZXMgPSBkZXRlcm1pbmVNZXRhQW5kUXVhbGlmaWVkTmFtZShjb21wb25lbnQpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGNvbXBvbmVudCAhPSBudWxsICYmIG5hbWVzICE9IG51bGwpCi0JCXsKLQkJCUlQYXRoIGZ1bGxQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotCQkJUHJvamVjdFNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFByb2plY3RTZWFyY2hTY29wZShmdWxsUGF0aCk7Ci0JCQlTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbiA9ICJQcm9qZWN0IjsKLQkJCVhTRFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gbmV3IFhTRFNlYXJjaFF1ZXJ5KHBhdHRlcm4sIGZpbGUsIG5hbWVzWzFdLCAKLQkJCQkJbmFtZXNbMF0sIFhTRFNlYXJjaFF1ZXJ5LkxJTUlUX1RPX1JFRkVSRU5DRVMsIHNjb3BlLCBzY29wZURlc2NyaXB0aW9uKTsKLQkJCU5ld1NlYXJjaFVJLmFjdGl2YXRlU2VhcmNoUmVzdWx0VmlldygpOwotCQkJTmV3U2VhcmNoVUkucnVuUXVlcnlJbkJhY2tncm91bmQoc2VhcmNoUXVlcnkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1dTRExGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1dTRExGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTEwMTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9XU0RMRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtpbmdTZXRTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hZGFwdGVycy5XU0RMQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlhTRFNlYXJjaFF1ZXJ5OwotCi1wdWJsaWMgY2xhc3MgV1NETEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uIGV4dGVuZHMgV1NETEZpbmRSZWZlcmVuY2VzQWN0aW9uewotCQotCXB1YmxpYyBXU0RMRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQlJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzID0gcXVlcnlXb3JraW5nU2V0cygpOwotCQlpZiAoIHdvcmtpbmdTZXRzID09IG51bGwgfHwgd29ya2luZ1NldHMubGVuZ3RoID09IDApCi0JCQkvLyBUaGUgdXNlciBjaG9vc2VzIG5vdGhpbmcsIG5vIHBvaW50IHRvIGNvbnRpbnVlLgotCQkJcmV0dXJuOwotCQlTdHJpbmcgcGF0dGVybiA9ICIiOwotCi0JCVdTRExCYXNlQWRhcHRlciBjb21wb25lbnQgPSBnZXRXU0RMTmFtZWRDb21wb25lbnQoKTsKLQkJSUZpbGUgZmlsZSA9IGdldEN1cnJlbnRGaWxlKCk7Ci0JCVF1YWxpZmllZE5hbWVbXSBuYW1lcyA9IGRldGVybWluZU1ldGFBbmRRdWFsaWZpZWROYW1lKGNvbXBvbmVudCk7Ci0JCWlmICggZmlsZSAhPSBudWxsICYmIGNvbXBvbmVudCAhPSBudWxsKXsKLQkJCS8vIENyZWF0ZSBhIHNjb3BlIGZyb20gdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0cwotCQkJV29ya2luZ1NldFNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFdvcmtpbmdTZXRTZWFyY2hTY29wZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JraW5nU2V0cy5sZW5ndGg7IGkrKyl7Ci0JCQkJSUFkYXB0YWJsZVtdIGVsZW1lbnRzID0gd29ya2luZ1NldHNbaV0uZ2V0RWxlbWVudHMoKTsKLQkJCQlzY29wZS5hZGRBV29ya2luZ1NldFRvU2NvcGUoZWxlbWVudHMpOwotCQkJfQotCi0JCQlTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbiA9ICJXb3JraW5nIFNldCI7ICAgIAotCQkJWFNEU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSAKLQkJCQluZXcgWFNEU2VhcmNoUXVlcnkocGF0dGVybiwgZmlsZSwgbmFtZXNbMV0sIG5hbWVzWzBdLCBYU0RTZWFyY2hRdWVyeS5MSU1JVF9UT19SRUZFUkVOQ0VTLCBzY29wZSwgc2NvcGVEZXNjcmlwdGlvbik7ICAgIAotCQkJTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0JCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyBhIGRpYWxvZyBhc2tpbmcgdGhlIHVzZXIgdG8gY2hvb3NlIHRoZSB3b3JraW5nIFNldHMgaGUgd2FudHMKLQkgKiB0byBkbyB0aGUgc2VhcmNoIG9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtpbmdTZXRbXSBxdWVyeVdvcmtpbmdTZXRzKCl7Ci0JCVNoZWxsIHNoZWxsPSBYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKTsKLQkJaWYgKHNoZWxsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0KLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKS5jcmVhdGVXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCB0cnVlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzPSBkaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAod29ya2luZ1NldHMubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gd29ya2luZ1NldHM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1dTRExSZWZlcmVuY2VzU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9XU0RMUmVmZXJlbmNlc1NlYXJjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjUyN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1dTRExSZWZlcmVuY2VzU2VhcmNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuUmVmZXJlbmNlc1NlYXJjaEdyb3VwOwotCi1wdWJsaWMgY2xhc3MgV1NETFJlZmVyZW5jZXNTZWFyY2hHcm91cCBleHRlbmRzIFJlZmVyZW5jZXNTZWFyY2hHcm91cCAgewotICAgIC8qKgotICAgICAqIE5vdGU6IFRoaXMgY29uc3RydWN0b3IgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBlZGl0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETFJlZmVyZW5jZXNTZWFyY2hHcm91cChJRWRpdG9yUGFydCBlZGl0b3IpIHsKLSAgICAJc3VwZXIoZWRpdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLS8vICAgICAgZkdyb3VwSWQ9IElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0ZJTkQ7Ci0gICAgCQotICAgIAlmRmluZFJlZmVyZW5jZXNBY3Rpb249IG5ldyBXU0RMRmluZFJlZmVyZW5jZXNBY3Rpb24oZkVkaXRvcik7Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0FjdGlvbi5zZXRUZXh0KFNlYXJjaE1lc3NhZ2VzLlNlYXJjaF9GaW5kRGVjbGFyYXRpb25BY3Rpb25fbGFiZWwpOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJTRUFSQ0hfUkVGRVJFTkNFU19JTl9XT1JLU1BBQ0UiKTsKLSAgICAgICAgLy9mRWRpdG9yLnNldEFjdGlvbigiU2VhcmNoUmVmZXJlbmNlc0luV29ya3NwYWNlIiwgZkZpbmRSZWZlcmVuY2VzQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbj0gbmV3IFdTRExGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbihmRWRpdG9yKTsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLnNldFRleHQoU2VhcmNoTWVzc2FnZXMuU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWwpOyAgICAgICAgCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIlNFQVJDSF9SRUZFUkVOQ0VTX0lOX1BST0pFQ1QiKTsKLSAgICAgICAgLy9mRWRpdG9yLnNldEFjdGlvbigiU2VhcmNoUmVmZXJlbmNlc0luUHJvamVjdCIsIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uPSBuZXcgV1NETEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKGZFZGl0b3IpOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uc2V0VGV4dChTZWFyY2hNZXNzYWdlcy5TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbCk7ICAgICAgICAgCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIi5TRUFSQ0hfUkVGRVJFTkNFU19JTl9XT1JLSU5HX1NFVCIpOwotICAgICAgICAvL2ZFZGl0b3Iuc2V0QWN0aW9uKCJTZWFyY2hSZWZlcmVuY2VzSW5Xb3JraW5nU2V0IiwgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9XU0RMU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9XU0RMU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmYzIwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvV1NETFNlYXJjaFJlZmVyZW5jZXNHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zLkJhc2VHcm91cEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuWFNEU2VhcmNoR3JvdXBTdWJNZW51OwotCi1wdWJsaWMgY2xhc3MgV1NETFNlYXJjaFJlZmVyZW5jZXNHcm91cEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAoZlNlbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdvcmtiZW5jaFBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotCQkgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gd29ya2JlbmNoUGFydC5nZXRTaXRlKCk7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJICByZXR1cm47Ci0JCi0JCSAgSUVkaXRvclBhcnQgZWRpdG9yID0gc2l0ZS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgaWYgKCBlZGl0b3IgIT0gbnVsbCApewotICAgICAgICAgICAgV1NETFJlZmVyZW5jZXNTZWFyY2hHcm91cCByZWZlcmVuY2VzR3JvdXAgPSBuZXcgV1NETFJlZmVyZW5jZXNTZWFyY2hHcm91cChlZGl0b3IpOwotICAgICAgICAgICAgWFNEU2VhcmNoR3JvdXBTdWJNZW51IHN1Yk1lbnUgPSBuZXcgWFNEU2VhcmNoR3JvdXBTdWJNZW51KHJlZmVyZW5jZXNHcm91cCk7Ci0gICAgICAgICAgICBzdWJNZW51LmZpbGwobWVudSwgLTEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NvYXAvY3VzdG9taXphdGlvbnMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc29hcC9jdXN0b21pemF0aW9ucy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFjMjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc29hcC9jdXN0b21pemF0aW9ucy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNvYXAuY3VzdG9taXphdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zb2FwLmN1c3RvbWl6YXRpb25zLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfU1BFQ0lGWV9QQVJUU19ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfUEFSVFNfQlVUVE9OOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc29hcC9jdXN0b21pemF0aW9ucy9TT0FQTm9kZUVkaXRvclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NvYXAvY3VzdG9taXphdGlvbnMvU09BUE5vZGVFZGl0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY2OTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc29hcC9jdXN0b21pemF0aW9ucy9TT0FQTm9kZUVkaXRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc29hcC5jdXN0b21pemF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTm9kZUFzc29jaWF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLkRpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlRWRpdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSBvZiBob3cgYSBOb2RlRWRpdG9yUHJvdmlkZXIgY2FuIHV0aWxpemUgdGhlIFdTREwgbW9kZWwgaWYgcmVxdWlyZWQKLSAqIChhbmQgaXMgbm90IGxpbWl0ZWQgdG8gdGhlIERPTSBtb2RlbCkuICBJdCdzIGhvcGUgdGhhdCBwb3RlbnRpYWwgYWRvcHRlcnMgY2FuIHByb3ZpZGUgZmVlZGJhY2sgYW5kIG9wZW4KLSAqIGJ1Z3Mgd2hlcmUgdGhleSBmaW5kIHN1cHBvcnQgaXMgbGFja2luZyBvciBpbmNvbnZlbmllbnQuIAotICovCi1wdWJsaWMgY2xhc3MgU09BUE5vZGVFZGl0b3JQcm92aWRlciBleHRlbmRzIE5vZGVFZGl0b3JQcm92aWRlcgotewotICBwdWJsaWMgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZ2V0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24oU3RyaW5nIHBhcmVudE5hbWUsIFN0cmluZyBub2RlTmFtZSkKLSAgewotICAgIC8vIFRPRE8gKGNzKSB0aGlzIGV4dGVuc2lvbiBpcyBvbmx5IGRlc2lnbmVkIHRvIHdvcmsgd2hlbiB1c2VkIHZpYSB0aGUgV1NETCBFZGl0b3IgY29udGV4dC4KLSAgICAvLyBSZXVzZSBmcm9tIG90aGVyIGNvbnRleHQgaXMgcG9zc2libGUgdG9vIGlmIHRoZSBlZGl0b3IgcHJvdmlkZXMgdGhlIGFwcHJvcHJpYXRlICdnZXRBZGFwdGVyJyBiZWhhdmlvdXIuCi0gICAgLy8gV2UgbmVlZCB0byByZXZpc2l0IHRoaXMgYW5kIGdldCBtb3JlIGZlZWRiYWNrIGZyb20gYWRvcHRlcnMgdG8gc2VlIGlmIGRpZmZlcmVudCBhcHByb2FjaCBpcyByZXF1aXJlZCAKLSAgICAvLyBpbiBvcmRlciB0byBvYnRhaW4gYSBXU0RMIG1vZGVsLgotLy8gICAgLwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIGZpbmFsIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWVkaXRvci5nZXRBZGFwdGVyKERlZmluaXRpb24uY2xhc3MpOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBpZiAocGFyZW50TmFtZS5lcXVhbHMoImJvZHkiKSAmJiBub2RlTmFtZS5lcXVhbHMoInBhcnRzIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgewotICAgICAgICAvLyBnZWUuLi4gdGhpcyBjYXNlIHNvdW5kcyBzb3J0YSBtb3JiaWQgZWg/Ci0gICAgICAgIC8vCi0gICAgICAgIHJldHVybiBuZXcgRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24oKQotICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgIHB1YmxpYyB2b2lkIGludm9rZURpYWxvZygpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClnZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvLyBUT0RPIChjcykgSSB0aGluayB3ZSBzaG91bGQgcHVzaCB0aGlzIGZ1bmN0aW9uIGRvd24gdG8gdGhlIFdTREwgbW9kZWwgKGFsYSBYU0QgbW9kZWwpCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIE5vZGVBc3NvY2lhdGlvbk1hbmFnZXIgbm9kZUFzc29jaWF0aW9uTWFuYWdlciA9IG5ldyBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgIE9iamVjdCBvID0gbm9kZUFzc29jaWF0aW9uTWFuYWdlci5nZXRNb2RlbE9iamVjdEZvck5vZGUoZGVmaW5pdGlvbiwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgU09BUEJvZHkpCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIFNPQVBTZWxlY3RQYXJ0c0RpYWxvZyBkaWFsb2cgPSBuZXcgU09BUFNlbGVjdFBhcnRzRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIGRlZmluaXRpb24sIChTT0FQQm9keSlvKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChNZXNzYWdlcy5VSV9TUEVDSUZZX1BBUlRTX0RJQUxPR19USVRMRSk7ICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaW50IHJjID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPT0gRGlhbG9nLk9LKQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICBQYXJ0W10gcGFydHMgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRQYXJ0cygpOwotICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgICAgICBQYXJ0IHBhcnQgPSBwYXJ0c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gcGFydC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIC8vIFRPRE8gKGNzKSB3ZSBuZWVkIHRvIHByb3ZpZGUgJ2NvbW1hbmQnIHN1cHBvcnQgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHVuZG8gcHJvcGVybHkKLSAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInBhcnRzIiwgdmFsdWUpOyAgICAgICAgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgICAgcHVibGljIFN0cmluZyBnZXRCdXRvblRleHQoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNZXNzYWdlcy5VSV9QQVJUU19CVVRUT047IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAgCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zb2FwL2N1c3RvbWl6YXRpb25zL1NPQVBTZWxlY3RQYXJ0c0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9zb2FwL2N1c3RvbWl6YXRpb25zL1NPQVBTZWxlY3RQYXJ0c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBiNTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc29hcC9jdXN0b21pemF0aW9ucy9TT0FQU2VsZWN0UGFydHNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc29hcC5jdXN0b21pemF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLQotcHVibGljIGNsYXNzIFNPQVBTZWxlY3RQYXJ0c0RpYWxvZyBleHRlbmRzIERpYWxvZwoteyAgCi0gIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgU09BUEJvZHkgYm9keTsKLSAgQ2hlY2tib3hUcmVlVmlld2VyIGNoZWNrTGlzdDsKLSAgUGFydFtdIHNlbGVjdGVkUGFydHMgPSB7fTsKLSAgCi0gIHB1YmxpYyBTT0FQU2VsZWN0UGFydHNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIERlZmluaXRpb24gZGVmaW5pdGlvbiwgU09BUEJvZHkgYm9keSkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsgIAotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5ib2R5ID0gYm9keTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBjaGVja0xpc3QgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKLSAgICBncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0gICAgY2hlY2tMaXN0LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBjaGVja0xpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJbnRlcm5hbFRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgY2hlY2tMaXN0LnNldExhYmVsUHJvdmlkZXIobmV3IEludGVybmFsTGFiZWxQcm92aWRlcigpKTsKLSAgICBjaGVja0xpc3Quc2V0SW5wdXQoIiIpOwotICAgIAotICAgIExpc3QgbGlzdCA9IGJvZHkuZ2V0UGFydHMoKTsKLSAgICBjaGVja0xpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKGxpc3QudG9BcnJheSgpKTsgICAgIAotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpCi0gIHsKLSAgICBPYmplY3RbXSBjaGVja2VkID0gY2hlY2tMaXN0LmdldENoZWNrZWRFbGVtZW50cygpOwotICAgIHNlbGVjdGVkUGFydHMgPSBuZXcgUGFydFtjaGVja2VkLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkLmxlbmd0aDsgaSsrKQotICAgIHsgIAotICAgICAgc2VsZWN0ZWRQYXJ0c1tpXSA9IChQYXJ0KWNoZWNrZWRbaV07Ci0gICAgfSAKLSAgICBzdXBlci5va1ByZXNzZWQoKTsgICAgCi0gIH0KLSAgCi0gCi0gIGNsYXNzIEludGVybmFsTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydCllbGVtZW50OwotICAgICAgcmV0dXJuIHBhcnQuZ2V0TmFtZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcGFydF9vYmouZ2lmIik7Ci0gICAgfQotICB9Ci0gIAotICBjbGFzcyBJbnRlcm5hbFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlcgotICB7ICAKLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7ICAgIAotICAgICAgRU9iamVjdCBjb250YWluZXIgPSBib2R5LmVDb250YWluZXIoKTsKLSAgICAgIE1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZmVyZW5jZSA9IG51bGw7Ci0gICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotICAgICAgewotICAgICAgICBtZXNzYWdlUmVmZXJlbmNlID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlSW5wdXQoKEJpbmRpbmdJbnB1dCljb250YWluZXIpOyAKLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KQotICAgICAgewotICAgICAgICBtZXNzYWdlUmVmZXJlbmNlID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlT3V0cHV0KChCaW5kaW5nT3V0cHV0KWNvbnRhaW5lcik7ICAgICAgICAgCi0gICAgICB9ICAKLSAgICAgIGlmIChtZXNzYWdlUmVmZXJlbmNlICE9IG51bGwgJiYgbWVzc2FnZVJlZmVyZW5jZS5nZXRFTWVzc2FnZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlUmVmZXJlbmNlLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkudG9BcnJheSgpOwotICAgICAgfSAgCi0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgeyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFBhcnRbXSBnZXRTZWxlY3RlZFBhcnRzKCkKLSAgewotICAgIHJldHVybiBzZWxlY3RlZFBhcnRzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3NvYXAvY3VzdG9taXphdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc29hcC9jdXN0b21pemF0aW9ucy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmYThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvc29hcC9jdXN0b21pemF0aW9ucy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVUlfU1BFQ0lGWV9QQVJUU19ESUFMT0dfVElUTEU9U3BlY2lmeSBQYXJ0cwotVUlfUEFSVFNfQlVUVE9OPS4uLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExNGMxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4Y2x1ZGluZz0id3NkbHZhbGlkYXRldWkvfHdzZGx2YWxpZGF0ZS8iIGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MDMyZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzZGx2YWxpZGF0ZS5qYXIKLXdzZGx2YWxpZGF0ZXVpLmphcgotd3NkbHZhbGlkYXRlc3JjLnppcAotd3NkbHZhbGlkYXRldWlzcmMuemlwCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTBjMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiZmNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1R1ZSBBcHIgMTggMTI6MzA6MjkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1Y2VjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMTggMTI6MzA6MjkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDA3YzBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb247IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDIucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2UuVmFsaWRhdGVXU0RMUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlX1BST1ZJREVSX05BTUUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cyxvcmcuZWNsaXBzZS53c3Qud3NpIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cyxvcmcuZWNsaXBzZS53c3Qud3NpIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmV4Y2VwdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLG9yZy5lY2xpcHNlLndzdC53c2kiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLG9yZy5lY2xpcHNlLndzdC53c2kiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cyxvcmcuZWNsaXBzZS53c3Qud3NpIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmFudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLG9yZy5lY2xpcHNlLndzdC53c2kiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLG9yZy5lY2xpcHNlLndzdC53c2kiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLG9yZy5lY2xpcHNlLndzdC53c2kiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMsb3JnLmVjbGlwc2Uud3N0LndzaSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuaHR0cDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLG9yZy5lY2xpcHNlLndzdC53c2kiLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLm1pbWU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cyxvcmcuZWNsaXBzZS53c3Qud3NpIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5zb2FwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMsb3JnLmVjbGlwc2Uud3N0LndzaSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMsb3JnLmVjbGlwc2Uud3N0LndzaSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cyxvcmcuZWNsaXBzZS53c3Qud3NpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy4zLjApIiwKLSBvcmcuYXBhY2hlLmFudDtidW5kbGUtdmVyc2lvbj0iWzEuNi41LDEuNy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy53c2RsNGo7YnVuZGxlLXZlcnNpb249IlsxLjQuMCwxLjUuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0O2J1bmRsZS12ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiMjRjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBleHNkLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvZXh0dmFsaWRhdG9yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC9leHR2YWxpZGF0b3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlOGRkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC9leHR2YWxpZGF0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIiBpZD0iZXh0dmFsaWRhdG9yIiBuYW1lPSJXU0RMIEV4dGVuc2lvbiBWYWxpZGF0b3IiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIFdTREwgRXh0ZW5zaW9uIFZhbGlkYXRvciBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gY29udHJpYnV0ZSBhIHZhbGlkYXRvciB0aGF0IHByb3ZpZGVzIGN1c3RvbSB2YWxpZGF0aW9uIGxvZ2ljIGZvciBXU0RMIDEuMSBkb2N1bWVudHMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4dHZhbGlkYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dHZhbGlkYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JV1NETFZhbGlkYXRvciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklXU0RMVmFsaWRhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBXU0RMIG5hbWVzcGFjZSBmb3Igd2hpY2ggdGhpcyB2YWxpZGF0b3Igc2hvdWxkIHJ1bi4gQ3VycmVudGx5IHRoZSBvbmx5IGFjY2VwdGVkIHZhbHVlIGlzIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgV1NETCBFeHRlbnNpb24gVmFsaWRhdG9yIGNvbnRyaWJ1dGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0mcXVvdDt3c2RsV1NJVmFsaWRhdG9yJnF1b3Q7Ci0gICAgICAgICBuYW1lPSZxdW90O1dTREwgV1MtSSBWYWxpZGF0b3ImcXVvdDsKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uZXh0dmFsaWRhdG9yJnF1b3Q7Jmd0OwotICAgICAgJmx0O2V4dHZhbGlkYXRvcgotICAgICAgICAgICAgbmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnZhbGlkYXRlLndzZGwuV1NETFZhbGlkYXRvciZxdW90OyZndDsKLSAgICAgICZsdDsvZXh0dmFsaWRhdG9yJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgc3VwcGxpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JV1NETFZhbGlkYXRvciZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtjb2RlJmd0Owotb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC52YWxpZGF0ZS53c2RsLldTRExWYWxpZGF0b3IKLSZsdDsvY29kZSZndDsKLUNvbnRyaWJ1dGVzIFdTLUkgdmFsaWRhdGlvbiBsb2dpYyBmb3IgdGhlIG5hbWVzcGFjZSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2Qvd3NkbDExdmFsaWRhdG9yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC93c2RsMTF2YWxpZGF0b3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiNjBlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC93c2RsMTF2YWxpZGF0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIiBpZD0id3NkbDExdmFsaWRhdG9yIiBuYW1lPSJXU0RMIDEuMSBFeHRlbnNpb24gVmFsaWRhdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBXU0RMIDEuMSBFeHRlbnNpb24gVmFsaWRhdG9yIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBjb250cmlidXRlIGEgdmFsaWRhdG9yIGZvciBhIHNwZWNpZmljIG5hbWVzcGFjZSB0byBXU0RMIDEuMSB2YWxpZGF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2YWxpZGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3ImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZXNwYWNlIHRoaXMgdmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBXU0RMIDEuMSBFeHRlbnNpb24gVmFsaWRhdG9yIGNvbnRyaWJ1dGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLndzZGwxMXZhbGlkYXRvciZxdW90OyZndDsKLSAgICAgICZsdDt2YWxpZGF0b3IKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLmh0dHAuSFRUUFZhbGlkYXRvciZxdW90OwotICAgICAgICAgICAgbmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8mcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgc3VwcGxpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExVmFsaWRhdG9yJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2NvZGUmZ3Q7Ci1vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5odHRwLkhUVFBWYWxkaWF0b3IKLSZsdDsvY29kZSZndDsKLUNvbnRyaWJ1dGVzIHZhbGlkYXRpb24gbG9naWMgZm9yIHRoZSBuYW1lc3BhY2UgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLy4KLSZsdDtjb2RlJmd0Owotb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEubWltZS5NSU1FVmFsZGlhdG9yCi0mbHQ7L2NvZGUmZ3Q7Ci1Db250cmlidXRlcyB2YWxpZGF0aW9uIGxvZ2ljIGZvciB0aGUgbmFtZXNwYWNlIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8uCi0mbHQ7Y29kZSZndDsKLW9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnNvYXAuU09BUFZhbGRpYXRvcgotJmx0Oy9jb2RlJmd0OwotQ29udHJpYnV0ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgdGhlIG5hbWVzcGFjZSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vbGliLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vbGliLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTJmMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2xpYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotKi5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmNDBjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIS0tIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbgotIS0tIFRvb2wgTmFtZQotCi1fUExVR0lOX05BTUUgICAgICAgPSBXU0RMIFZhbGlkYXRvcgotX1BST1ZJREVSX05BTUUgICAgID0gRWNsaXBzZS5vcmcKLQotX1VJX1dTREw0Sl9WQUxJREFUT1JfREVMRUdBVEUgPSBXU0RMNEotYmFzZWQgV1NETCBWYWxpZGF0b3IKLV9VSV9XU0RMX1ZBTElEQVRPUiA9IFdTREwgVmFsaWRhdG9yCi1fVUlfV1NETF9WQUxJREFUT1JfTUFSS0VSID0gV1NETCBQcm9ibGVtCi0KLSEtLSBFeHRlbnNpb24gcG9pbnRzCi1fV1NETF9FWFRFTlNJT05fVkFMSURBVE9SX05BTUUgICA9IFdTREwgRXh0ZW5zaW9uIFZhbGlkYXRvcgotX1dTREwxMV9WQUxJREFUT1JfTkFNRSA9IFdTREwgMS4xIFZhbGlkYXRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDlhMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0dmFsaWRhdG9yIiBuYW1lPSIlX1dTRExfRVhURU5TSU9OX1ZBTElEQVRPUl9OQU1FIiBzY2hlbWE9ImV4c2QvZXh0dmFsaWRhdG9yLmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id3NkbDExdmFsaWRhdG9yIiBuYW1lPSIlV1NETDExX1ZBTElEQVRPUl9OQU1FIiBzY2hlbWE9ImV4c2Qvd3NkbDExdmFsaWRhdG9yLmV4c2QiLz4KLSAgIAotCTxleHRlbnNpb24KLSAgICAJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckRlbGVnYXRlcyI+Ci0gICAgICAgIDxkZWxlZ2F0ZQotICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgICAgbmFtZT0iJV9VSV9XU0RMNEpfVkFMSURBVE9SX0RFTEVHQVRFIgotICAgICAgICAgICAgICB0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZS5XU0RMRGVsZWdhdGluZ1ZhbGlkYXRvciIvPgotICAgICA8L2V4dGVuc2lvbj4JCi0KLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPCEtLSBBbiBleHRlbnNpb24gZm9yIGFkZGluZyB0aGUgV1NETCB2YWxpZGF0b3IgdG8gdGhlICAgICAgLS0+Ci0gICA8IS0tIHZhbGlkYXRpb24gZnJhbWV3b3JrLiAJCQkJCQkgICAgICAgICAgIC0tPgkJCQkJCQkJCQkgICAtLT4KLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IndzZGxWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSIlX1VJX1dTRExfVkFMSURBVE9SIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5IZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBhc3luYz0idHJ1ZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2UuV1NETERlbGVnYXRpbmdWYWxpZGF0b3IiCi0gICAgICAgICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgZnVsbEJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgICAgaW5jcmVtZW50YWw9InRydWUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICAgICA8bWFya2VySWQgbWFya2VySWRWYWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi52YWxpZGF0aW9uTWFya2VyIi8+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InZhbGlkYXRpb25NYXJrZXIiCi0gICAgICAgICBuYW1lPSIlX1VJX1dTRExfVkFMSURBVE9SX01BUktFUiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9DbGFzc2xvYWRlcldTRExWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NsYXNzbG9hZGVyV1NETFZhbGlkYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4N2NhOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NsYXNzbG9hZGVyV1NETFZhbGlkYXRvckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZy5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OwotCi0KLQotLyoqCi0gKiBBIGRlbGVnYXRlIGhvbGRzIGEgdmFsaWRhdG9yJ3MgaW5mb3JtYXRpb24gYW5kIGNhbiBpbnN0YW50aWF0ZSBpdAotICogd2hlbiByZXF1ZXN0ZWQgdG8uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2xvYWRlcldTRExWYWxpZGF0b3JEZWxlZ2F0ZSBleHRlbmRzIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZQotewotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgZGVsZWdhdGUgZm9yIGEgdmFsaWRhdG9yIGJ5IGl0cyBjbGFzcyBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKi8KLSAgcHVibGljIENsYXNzbG9hZGVyV1NETFZhbGlkYXRvckRlbGVnYXRlKFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUpCi0gIHsKLSAgICB0aGlzLnZhbGlkYXRvckNsYXNzbmFtZSA9IHZhbGlkYXRvckNsYXNzbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUgYW5kIAotICAgKiBhIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgQ2xhc3Nsb2FkZXJXU0RMVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gIHsKLSAgICB0aGlzKHZhbGlkYXRvckNsYXNzbmFtZSk7Ci0gICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuV1NETFZhbGlkYXRvckRlbGVnYXRlI2xvYWRWYWxpZGF0b3IoKQotICAgKi8KLSAgcHJvdGVjdGVkIElXU0RMVmFsaWRhdG9yIGxvYWRWYWxpZGF0b3IoKQotICB7Ci0JSVdTRExWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLSAgICBpZihjbGFzc0xvYWRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcyA9Ci0gICAgICBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKHZhbGlkYXRvckNsYXNzbmFtZSkgOiBDbGFzcy5mb3JOYW1lKHZhbGlkYXRvckNsYXNzbmFtZSk7Ci0KLSAgICAgIHZhbGlkYXRvciA9IChJV1NETFZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgIH0KLSAgICBjYXRjaChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgCUxvZ2dlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2coIlVuYWJsZSB0byBsb2FkIHZhbGlkYXRvciAiICsgdmFsaWRhdG9yQ2xhc3NuYW1lLCBJTG9nZ2VyLlNFVl9FUlJPUiwgdCk7Ci0gICAgfQotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3JEZWxlZ2F0ZSNnZXRWYWxpZGF0b3JOYW1lKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdG9yQ2xhc3NuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZGUxYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLS8qKgotICogU2V0IGNvbnN0YW50cyB0aGF0IHRoZSB2YWxpZGF0b3IgbWFrZXMgdXNlIG9mLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0YW50cwotewotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBwcm9wZXJ0aWVzIGZpbGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX1ZBTElEQVRPUl9QUk9QRVJUSUVTX0ZJTEUgPSAidmFsaWRhdGV3c2RsIjsKLQotICAvKioKLSAgICogVGhlIFNPQVAgMS4xIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1NPQVAxMSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIjsKLQotICAvKioKLSAgICogVGhlIEhUVFAgbmFtZXNwYWNlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfSFRUUCA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIjsKLQotICAvKioKLSAgICogVGhlIE1JTUUgbmFtZXNwYWNlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfTUlNRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgV1NETCBzY2hlbWEgY2FjaGUgYXR0cmlidXRlIGFsbG93cyBhbiBYTUxHcmFtbWFyUG9vbCBvYmplY3QgdG8gYmUgc2V0IGZvciB1c2UgaW4gCi0gICAqIGlubGluZSBzY2hlbWEgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTFNDSEVNQV9DQUNIRV9BVFRSSUJVVEUgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy93c2RsL3NjaGVtYWNhY2hlIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgV1NETCBzY2hlbWEgY2FjaGUgYXR0cmlidXRlIGFsbG93cyBhbiBYTUxHcmFtbWFyUG9vbCBvYmplY3QgdG8gYmUgc2V0IGZvciB1c2UgaW4gCi0gICAqIFhNTCBjb25mb3JtYW5jZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0NBQ0hFX0FUVFJJQlVURSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL3dzZGwveG1sY2FjaGUiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRyb2xsZXJWYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRyb2xsZXJWYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY0ZDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db250cm9sbGVyVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgdmFsaWRhdGlvbiBpbmZvIHRoYXQgYWxsb3dzIGZvciBzdGFydGluZyBhbmQKLSAqIGNvbXBsZXRpbmcgV1NETCBhbmQgV1MtSSB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRyb2xsZXJWYWxpZGF0aW9uSW5mbyBleHRlbmRzIElWYWxpZGF0aW9uSW5mbwotewotICAKLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBzdGVwcyB0byBjb21wbGV0ZSBXU0RMIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21wbGV0ZVdTRExWYWxpZGF0aW9uKCk7Ci0gIAotLy8gIC8qKgotLy8gICAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBzdGVwcyB0byBjb21wbGV0ZSBXUy1JIFdTREwgdmFsaWRhdGlvbi4KLS8vICAgKi8KLS8vICBwdWJsaWMgdm9pZCBjb21wbGV0ZVdTSVZhbGlkYXRpb24oKTsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTE1ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyOwotCi0KLS8qKgotICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25JbmZvIGV4dGVuZHMgSVZhbGlkYXRpb25SZXBvcnQKLXsKLSAgCi0gIC8qKgotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBmaWxlLiAoVXNlcyB0aGUgVVJJIGZyb20gdGhpcyB2YWxpZGF0aW9uIGluZm8gb2JqZWN0LikKLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBpbiB0aGUgZmlsZS4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbik7Ci0gIAotICAvKioKLSAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlcnJvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogQWRkIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGlzIGZpbGUuIChVc2VzIHRoZSBVUkkgZnJvbSB0aGlzIHZhbGlkYXRpb24gaW5mbyBvYmplY3QuKQotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgZm9yIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgd2FybmluZyBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nIGluIHRoZSBmaWxlLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4pOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZyBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVycm9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpOwotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgVVJJIHJlc29sdmVyIGluIHVzZSBmb3IgdGhpcyB2YWxpZGF0aW9uLiBUaGUgVVJJIHJlc29sdmVyCi0gICAqIHJldHVybmVkIGlzIGFjdHVhbGx5IGEgVVJJIHJlc29sdmVyIGhhbmRsZXIgdGhhdCB3aWxsIAotICAgKiBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSByZWdpc3RlcmVkIFVSSSByZXNvbHZlcnMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgcmVzb2x2ZXIgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlciBnZXRVUklSZXNvbHZlcigpOwotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuIElmIHRoZSBhdHRyaWJ1dGUKLSAgICogaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQsIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBiZWluZyByZXF1ZXN0ZWQuCi0gICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGhhcyBiZWVuIHJlZ2lzdGVyZWQsIG51bGwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjVhOWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGEgdmFsaWRhdGlvbiBtZXNzYWdlLiBBIHZhbGlkYXRpb24gbWVzc2FnZSBjb250YWlucyBpbmZvcm1hdGlvbgotICogZm9yIHRoZSBtZXNzYWdlLCBpdHMgc2V2ZXJpdHkgYW5kIHdoZXJlIGl0J3MgbG9jYXRlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvbk1lc3NhZ2UKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIEVSUk9SX01FU1NBR0VfTUFQX1FVQUxJRklFRF9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoIm9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUiLCAiZXJyb3JNZXNzYWdlTWFwIik7Ci0gIC8qKgotICAgKiBTZXZlcml0eSBlcnJvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVl9FUlJPUiA9IDA7Ci0gIC8qKgotICAgKiBTZXZlcml0eSB3YXJuaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VWX1dBUk5JTkcgPSAxOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIGZvciB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIGZvciB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2V2ZXJpdHkgb2YgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzZXZlcml0eSBvZiB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpbmUgd2hlcmUgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpbmUgd2hlcmUgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZSgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY29sdW1uIHdoZXJlIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gd2hlcmUgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCk7Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldE5lc3RlZE1lc3NhZ2VzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25SZXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvblJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ0YmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvblJlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGEgV1NETCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvblJlcG9ydAotewotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvciB0aGUgZmlsZSB0aGUgcmVwb3J0IHJlZmVycyB0by4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhlIHJlcG9ydCByZWZlcnMgdG8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBXU0RMIHNwZWNpZmljYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgV1NETCB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXU0RMVmFsaWQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhbiBhcnJheSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHJldHVybiBBbiBhcnJheSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIElWYWxpZGF0aW9uTWVzc2FnZVtdIGdldFZhbGlkYXRpb25NZXNzYWdlcygpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgZXJyb3JzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlIGVycm9ycywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCk7Ci0gIAotICBwdWJsaWMgSGFzaE1hcCBnZXROZXN0ZWRNZXNzYWdlcygpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVdTRExWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JV1NETFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWMwZGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JV1NETFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmV4Y2VwdGlvbi5WYWxpZGF0ZVdTRExFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIFdTREwgdmFsaWRhdG9yLiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgdG9wIGxldmVsIHZhbGlkYXRvciAKLSAqIGNvbXBvbmVudCBzdWNoIGFzIGEgV1NETCAxLjEgdmFsaWRhdG9yLCBXU0RMIDEuMiB2YWxpZGF0b3Igb3IgV1MtSSBCYXNpYyBQcm9maWxlIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJV1NETFZhbGlkYXRvcgotewotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBkb21Nb2RlbCBBIERPTSBtb2RlbCBvZiB0aGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHZhbGlkYXRpb24gdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQuCi0gICAqIEB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShEb2N1bWVudCBkb21Nb2RlbCwgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8pIHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTBkZmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFcnJvclJlcG9ydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJQb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uLlZhbGlkYXRlV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLkFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLkRlZmF1bHRYTUxWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5MaW5lTnVtYmVyRE9NUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeXBvaW50IHRvIHRoZSBXU0RMIFZhbGlkYXRvci4gVGhlIGNvbnRyb2xsZXIgaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSByZWFkZXIsIHRoZSBYTUwgY29uZm9ybWFuY2UgY2hlY2ssIHRoZSBXU0RMCi0gKiB2YWxpZGF0aW9uIGFuZCB0aGUgV1MtSSB2YWxpZGF0aW9uIGlmIHNlbGVjdGVkLiBUaGUgY29udHJvbGxlciBjb250YWlucyBhbnkKLSAqIGVycm9ycyBhbmQgd2FybmluZ3MgZ2VuZXJhdGVkIGFzIHdlbGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ29udHJvbGxlcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FUlJPUl9QUk9CTEVNX1dTRExfVkFMSURBVE9SID0gIl9FUlJPUl9QUk9CTEVNX1dTRExfVkFMSURBVE9SIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fV1NETF9WQUxJREFUT1IgPSAiX0VSUk9SX05PX1dTRExfVkFMSURBVE9SIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfUFJPQkxFTV9FWFRfVkFMSURBVE9SID0gIl9FUlJPUl9QUk9CTEVNX0VYVF9WQUxJREFUT1IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FUlJPUl9ET0NVTUVOVF9MT0NBVElPTiA9ICJfRVJST1JfRE9DVU1FTlRfTE9DQVRJT04iOwotCi0gIHByb3RlY3RlZCBWYWxpZGF0b3JSZWdpc3RyeSB2ZXI7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZTsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyOwotCi0gIC8vcHJvdGVjdGVkIFN0cmluZyB3c2RsTmFtZXNwYWNlID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIFJlc291cmNlQnVuZGxlIG5lZWRzIHRvIGJlIHNldCBzbyBpdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSByZWFkZXIuCi0gICAqIAotICAgKiBAcGFyYW0gcmIKLSAgICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uQ29udHJvbGxlcihSZXNvdXJjZUJ1bmRsZSByYiwgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgICByZXNvdXJjZWJ1bmRsZSA9IHJiOwotICAgIG1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyZXNvdXJjZWJ1bmRsZSk7Ci0gICAgdGhpcy51cmlSZXNvbHZlciA9IHVyaVJlc29sdmVyOwotCi0gICAgdmVyID0gVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBXU0RMIGZpbGUgd2l0aCB0aGUgc3RyZWFtLiBUaGlzIG1ldGhvZCB3aWxsIHJ1biB0aGUgY2hlY2sgb2YgdGhlIAotICAgKiBXU0RMIGRvY3VtZW50LiBUaGUgdmFsaWRhdGlvbiBpcyBicm9rZW4gdXAgaW50byB0aHJlZSBzdGFnZXM6IFhNTCBjb25mb3JtYW5jZSwKLSAgICogV1NETCBzZW1hbnRpYywgYW5kIHBvc3QgdmFsaWRhdGlvbi4KLSAgICogCi0gKiBAcGFyYW0gdXJpIAotICogCQkJVGhlIFVSSSBvZiB0aGUgV1NETCBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWQuCi0gKiBAcGFyYW0gaW5wdXRTdHJlYW0gCi0gKiAJCQlUaGUgY29udGVudHMgb2YgdGhlIFdTREwgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkLgotICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAqIAkJCVRoZSBXU0RMIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiB0byBiZSB1c2VkIHdoaWxlIHZhbGlkYXRpbmcgdGhpcyBVUkkuCi0gKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgd2l0aCB0aGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGUgZmlsZS4KLSAqLwotICBwdWJsaWMgSVZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFdTRExWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICB7Ci0gICAgCi0gICAgSW5wdXRTdHJlYW0geG1sVmFsaWRhdGVTdHJlYW0gPSBudWxsOwotICAgIElucHV0U3RyZWFtIHdzZGxWYWxpZGF0ZVN0cmVhbSA9IG51bGw7Ci0gICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0gICAgeyAvL2NvcHkgdGhlIGlucHV0U3RyZWFtIHNvIHdlIGNhbiB1c2UgaXQgbW9yZSB0aGFuIG9uY2UKLSAgICAgIFN0cmluZyBjb250ZW50cyA9IGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICAgIHhtbFZhbGlkYXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzLmdldEJ5dGVzKCkpOwotICAgICAgd3NkbFZhbGlkYXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzLmdldEJ5dGVzKCkpOwotICAgIH0KLSAgICAKLSAgICBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8gdmFsSW5mbyA9IG5ldyBWYWxpZGF0aW9uSW5mb0ltcGwodXJpLCBtZXNzYWdlZ2VuZXJhdG9yKTsKLSAgICAoKFZhbGlkYXRpb25JbmZvSW1wbCl2YWxJbmZvKS5zZXRVUklSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gICAgKChWYWxpZGF0aW9uSW5mb0ltcGwpdmFsSW5mbykuc2V0Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLQotICAgIGlmICh2YWxpZGF0ZVhNTCh2YWxJbmZvLCB4bWxWYWxpZGF0ZVN0cmVhbSkpCi0gICAgewotICAgICAgRG9jdW1lbnQgd3NkbGRvYyA9IGdldERvY3VtZW50KHVyaSwgd3NkbFZhbGlkYXRlU3RyZWFtLCB2YWxJbmZvKTsKLQotICAgICAgaWYoIXZhbEluZm8uaGFzRXJyb3JzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB3c2RsbnMgPSBnZXRXU0RMTmFtZXNwYWNlKHdzZGxkb2MpOwotICAgICAgICBpZih3c2RsbnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICh2YWxpZGF0ZVdTREwod3NkbGRvYywgdmFsSW5mbywgd3NkbG5zKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2lvblZhbGlkYXRvcnMod3NkbGRvYywgdmFsSW5mbywgd3NkbG5zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbEluZm87Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgZm9yIFhNTCBjb25mb3JtYW5jZS4KLQkgKiBAcGFyYW0gdmFsSW5mbyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFsaWRhdGlvbgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gdGhlIGlucHV0U3RyZWFtIHRvIHZhbGlkYXRlCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjb25mb3JtYW50LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVhNTChDb250cm9sbGVyVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICBJWE1MVmFsaWRhdG9yIHhtbFZhbGlkYXRvciA9IEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0WE1MVmFsaWRhdG9yKCk7Ci0gICAgeG1sVmFsaWRhdG9yLnNldFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgICB4bWxWYWxpZGF0b3Iuc2V0RmlsZSh2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgaWYgKHhtbFZhbGlkYXRvciBpbnN0YW5jZW9mIERlZmF1bHRYTUxWYWxpZGF0b3IpCi0gICAgewotICAgICAgICAoKERlZmF1bHRYTUxWYWxpZGF0b3IpeG1sVmFsaWRhdG9yKS5zZXRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0gICAgICAgIFhNTEdyYW1tYXJQb29sIGdyYW1tYXJQb29sID0gKFhNTEdyYW1tYXJQb29sKXZhbEluZm8uZ2V0QXR0cmlidXRlKENvbnN0YW50cy5YTUxfQ0FDSEVfQVRUUklCVVRFKTsKLSAgICAgICAgaWYoZ3JhbW1hclBvb2wgIT0gbnVsbCkKLSAgICAgICAgICAoKERlZmF1bHRYTUxWYWxpZGF0b3IpeG1sVmFsaWRhdG9yKS5zZXRHcmFtbWFyUG9vbChncmFtbWFyUG9vbCk7Ci0gICAgfQotICAgIC8veG1sVmFsaWRhdG9yLnNldFZhbGlkYXRpb25JbmZvKHZhbEluZm8pOwotICAgIHhtbFZhbGlkYXRvci5ydW4oKTsKLSAgICAvLyBpZiB0aGVyZSBhcmUgbm8geG1sIGNvbmZvcm1hbmNlIHByb2JsZW1zIGdvIG9uIHRvIGNoZWNrIHRoZSB3c2RsIHN0dWZmCi0gICAgaWYgKHhtbFZhbGlkYXRvci5oYXNFcnJvcnMoKSkKLSAgICB7Ci0gICAgICAvLyB0ZW1wIGhhbmRsaW5nIG9mIFhNTCBlcnJvcnMgdW50aWwgdmFsaWRhdG9yIGlzIHVwZGF0ZWQuCi0gICAgICBMaXN0IGVycm9ycyA9IHhtbFZhbGlkYXRvci5nZXRFcnJvcnMoKTsKLSAgICAgIEl0ZXJhdG9yIGVycm9yc0l0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSVZhbGlkYXRpb25NZXNzYWdlIHZhbE1lcyA9IChJVmFsaWRhdGlvbk1lc3NhZ2UpZXJyb3JzSXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodmFsTWVzIGluc3RhbmNlb2YgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsICYmIHZhbEluZm8gaW5zdGFuY2VvZiBWYWxpZGF0aW9uSW5mb0ltcGwpCi0gICAgICAgIHsgICBTdHJpbmcgZXJyb3JLZXkgPSAoKFZhbGlkYXRpb25NZXNzYWdlSW1wbCl2YWxNZXMpLmdldEVycm9yS2V5KCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBtZXNzYWdlQXJncyA9ICgoVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKXZhbE1lcykuZ2V0TWVzc2FnZUFyZ3VtZW50cygpOwotICAgICAgICAgICAgKChWYWxpZGF0aW9uSW5mb0ltcGwpdmFsSW5mbykuYWRkRXJyb3IodmFsTWVzLmdldE1lc3NhZ2UoKSwgdmFsTWVzLmdldExpbmUoKSwgdmFsTWVzLmdldENvbHVtbigpLCB2YWxNZXMuZ2V0VVJJKCksIGVycm9yS2V5LCBtZXNzYWdlQXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKHZhbE1lcy5nZXRNZXNzYWdlKCksIHZhbE1lcy5nZXRMaW5lKCksIHZhbE1lcy5nZXRDb2x1bW4oKSwgdmFsTWVzLmdldFVSSSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvL3dzZGxOYW1lc3BhY2UgPSB4bWxWYWxpZGF0b3IuZ2V0V1NETE5hbWVzcGFjZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgZm9yIFhNTCBjb25mb3JtYW5jZS4KLQkgKiBAcGFyYW0gdmFsSW5mbyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFsaWRhdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgY29uZm9ybWFudCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVYTUwoQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsgcmV0dXJuIHZhbGlkYXRlWE1MKHZhbEluZm8sIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBXU0RMIGZpbGUuIFNldCB0aGUgZXJyb3JzIGFuZCB3YXJuaW5nIGFwcHJvcHJpYXRlbHkuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbGRvYyBBIFczQyBkb2N1bWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIHdzZGxOYW1lc3BhY2UgVGhlIFdTREwgbmFtZXNwYWNlIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlV1NETChEb2N1bWVudCB3c2RsZG9jLCBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgU3RyaW5nIHdzZGxOYW1lc3BhY2UpCi0gIHsKLSAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGVbXSB3c2RsVmFscyA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KHdzZGxOYW1lc3BhY2UsIFZhbGlkYXRvclJlZ2lzdHJ5LldTRExfVkFMSURBVE9SKTsKLSAgICBpZiAod3NkbFZhbHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxWYWxzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgd3NkbHZhbGRlbCA9IHdzZGxWYWxzW2ldOwotICAgICAgICBJV1NETFZhbGlkYXRvciB3c2RsVmFsID0gd3NkbHZhbGRlbC5nZXRWYWxpZGF0b3IoKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbCB2YWxpZGF0b3IgaXNuJ3QgbnVsbCwgdmFsaWRhdGUuCi0gICAgICAgIGlmICh3c2RsVmFsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3c2RsVmFsLnZhbGlkYXRlKHdzZGxkb2MsIHZhbEluZm8pOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVmFsaWRhdGVXU0RMRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfUFJPQkxFTV9XU0RMX1ZBTElEQVRPUiwgd3NkbE5hbWVzcGFjZSksIDEsIDEsIHZhbEluZm8uZ2V0RmlsZVVSSSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlIHZhbGlkYXRvciBpcyBudWxsIGFuZCB0aGUgbmFtZXNwYWNlIGlzbid0IGNyZWF0ZSBhbiBlcnJvci4KLSAgICAgICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBpcyBudWxsIHRoZSBmaWxlIGlzIGVtcHR5IChhbmQgdGhlIFhNTCB2YWxpZGF0b3IKLSAgICAgICAgLy8gaGFzIGxldCBpdCBnbykKLSAgICAgICAgLy8gc28gaXQgaXMgdmFsaWQgYnV0IGRvZXMgbm90IG5lZWQgdG8gYmUgdmFsaWRhdGVkLgotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX1dTRExfVkFMSURBVE9SLCB3c2RsTmFtZXNwYWNlKSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgdmFsSW5mby5nZXRGaWxlVVJJKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIE5vIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZC4KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fV1NETF9WQUxJREFUT1IsIHdzZGxOYW1lc3BhY2UpLCAxLCAxLCB2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgfQotICAgIHZhbEluZm8uY29tcGxldGVXU0RMVmFsaWRhdGlvbigpOwotCi0gICAgcmV0dXJuIHZhbEluZm8uaXNXU0RMVmFsaWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlIHdpdGggdGhlIGV4dGVuc2lvbiB2YWxpZGF0b3IuIFNldCB0aGUgZXJyb3JzIGFuZCB3YXJuaW5nIGFwcHJvcHJpYXRlbHkuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbGRvYyBBIFczQyBkb2N1bWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIHdzZGxOYW1lc3BhY2UgVGhlIFdTREwgbmFtZXNwYWNlIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRXh0ZW5zaW9uVmFsaWRhdG9ycyhEb2N1bWVudCB3c2RsZG9jLCBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgU3RyaW5nIHdzZGxOYW1lc3BhY2UpCi0gIHsKLSAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGVbXSBleHRWYWxzID0gdmVyLnF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkod3NkbE5hbWVzcGFjZSwgVmFsaWRhdG9yUmVnaXN0cnkuRVhUX1ZBTElEQVRPUik7Ci0gICAgaWYoZXh0VmFscyAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBudW12YWxzID0gZXh0VmFscy5sZW5ndGg7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtdmFsczsgaSsrKQotICAgICAgewotICAgICAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgZXh0dmFsZGVsID0gZXh0VmFsc1tpXTsKLSAgICAgICAgSVdTRExWYWxpZGF0b3IgZXh0dmFsID0gZXh0dmFsZGVsLmdldFZhbGlkYXRvcigpOwotICAgICAgICBpZihleHR2YWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICBleHR2YWwudmFsaWRhdGUod3NkbGRvYywgdmFsSW5mbyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKFRocm93YWJsZSAgdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZFdhcm5pbmcobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX1BST0JMRU1fRVhUX1ZBTElEQVRPUiwgIGV4dHZhbGRlbC5nZXRWYWxpZGF0b3JOYW1lKCksIHdzZGxOYW1lc3BhY2UpLCAxLCAxLCB2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgICAgICAgICBMb2dnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9nZ2VyKCkubG9nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9QUk9CTEVNX0VYVF9WQUxJREFUT1IsICBleHR2YWxkZWwuZ2V0VmFsaWRhdG9yTmFtZSgpLCB3c2RsTmFtZXNwYWNlKSwgSUxvZ2dlci5TRVZfRVJST1IsIHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gICAqIAotICAgKiBAcGFyYW0gcmIKLSAgICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VCdW5kbGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgcmVzb3VyY2VidW5kbGUgPSByYjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRpb25Db250cm9sbGVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgcmVzb3VyY2UgYnVuZGxlIHNldCBmb3IgdGhpcyBWYWxpZGF0aW9uQ29udHJvbGxlci4KLSAgICogQHNlZSAjc2V0UmVzb3VyY2VCdW5kbGUKLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VidW5kbGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgYSBET00gZG9jdW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIAotICAgKiAJCVRoZSB1cmkgb2YgdGhlIGZpbGUgdG8gcmVhZAotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLSAgICogCQlBbiBvcHRpb25hbCBJbnB1dFN0cmVhbSB0byByZWFkIHRoZSBkb2N1bWVudCBmcm9tLgotICAgKiBAcGFyYW0gdmFsaW5mbwotICAgKiAJCUEgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB1c2VkIGZvciByZXBvcnRpbmcgbWVzc2FnZXMuCi0gICAqIEByZXR1cm4gVGhlIERPTSBtb2RlbCBvZiB0aGUgV1NETCBkb2N1bWVudCBvciBudWxsIGlmIHRoZSBkb2N1bWVudCBjYW4ndCBiZSByZWFkLgotICAgKi8KLSAgcHJpdmF0ZSBEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIHZhbGluZm8pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDYXRjaCBhIHByZW1hdHVyZSBFT0YgZXJyb3IgdG8gYWxsb3cgZW1wdHkgV1NETCBmaWxlcyB0byBiZSBjb25zaWRlcmVkIHZhbGlkLgotICAgICAgU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uKCkKLSAgICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIFhNTEVycm9yUmVwb3J0ZXIgY3JlYXRlRXJyb3JSZXBvcnRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhNTEVycm9yUmVwb3J0ZXIoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3VtZW50cywgc2hvcnQgc2V2ZXJpdHkpIHRocm93cyBYTklFeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYm9vbGVhbiByZXBvcnRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJQcmVtYXR1cmVFT0YiKSkKLSAgICAgICAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5yZXBvcnRFcnJvcihkb21haW4sIGtleSwgYXJndW1lbnRzLCBzZXZlcml0eSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgCi0gICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG51bGw7Ci0gICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgIHsgLy90aGVuIHdlIHdhbnQgdG8gY3JlYXRlIGEgRE9NIGZyb20gdGhlIGlucHV0c3RyZWFtCi0gICAgICAgIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgRE9NUGFyc2VyIGJ1aWxkZXIgPSBuZXcgTGluZU51bWJlckRPTVBhcnNlcihjb25maWd1cmF0aW9uKTsKLSAgICAgIGJ1aWxkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5nZXREb2N1bWVudCgpOwotCi0gICAgICByZXR1cm4gZG9jOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgLy8gSW4gdGhpcyBjYXNlIHRoZSB2YWxpZGF0b3Igd2lsbCBmYWlsIHdpdGggYW4gdW5leHBsYWluZWQgZXJyb3IgbWVzc2FnZQotICAgICAgLy8gYWJvdXQgYSBudWxsIFdTREwgbmFtZXNwYWNlLiBUaGlzIGVycm9yIHNob3VsZCBiZSBhZGRyZXNzZWQgYXMgd2VsbC4KLSAgICAgdmFsaW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfRE9DVU1FTlRfTE9DQVRJT04sIHVyaSksIDAsIDAsIHVyaSk7Ci0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFdTRExOYW1lc3BhY2UoRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgU3RyaW5nIHdzZGxucyA9IG51bGw7Ci0gICAgaWYoZG9jICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCByb290ZG9jID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgaWYocm9vdGRvYyAhPSBudWxsKQotICAgICAgewotICAgICAgICB3c2RsbnMgPSByb290ZG9jLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd3NkbG5zOwotICB9Ci0gIAotICAKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgLy8gSGVyZSB3ZSBhcmUgcmVhZGluZyB0aGUgZmlsZSBhbmQgc3RvcmluZyB0byBhIHN0cmluZ2J1ZmZlci4KLSAgICBTdHJpbmdCdWZmZXIgZmlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbVJlYWRlciBpbnB1dFJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0gICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaW5wdXRSZWFkZXIpOwotICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMTAyNF07Ci0gICAgICBpbnQgbnVtYmVyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLSAgICAgIHdoaWxlIChudW1iZXJSZWFkICE9IC0xKQotICAgICAgewotICAgICAgICBmaWxlU3RyaW5nLmFwcGVuZChjaGFycywgMCwgbnVtYmVyUmVhZCk7Ci0gICAgICAgIG51bWJlclJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL1RPRE86IGxvZyBlcnJvciBtZXNzYWdlCi0gICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlU3RyaW5nLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkluZm9JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTE5MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25JbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiBpbmZvIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbmZvSW1wbCBpbXBsZW1lbnRzIElWYWxpZGF0aW9uUmVwb3J0LCBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8KLXsKLSAgcHJpdmF0ZSBib29sZWFuIFdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEID0gdHJ1ZTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1dBUk5fTk9fVkFMRElBVE9SID0gIl9XQVJOX05PX1ZBTERJQVRPUiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9SRUZfRklMRV9FUlJPUl9NRVNTQUdFID0gIl9SRUZfRklMRV9FUlJPUl9NRVNTQUdFIjsKLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGluZ19maWxlX3VyaSA9IG51bGw7Ci0gIHByaXZhdGUgVVJMIHZhbGlkYXRpbmdfZmlsZV91cmwgPSBudWxsOwotICBwcml2YXRlIGJvb2xlYW4gd3NkbFZhbGlkID0gZmFsc2U7Ci0gIHByaXZhdGUgTGlzdCBtZXNzYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgLy9wcml2YXRlIExpc3Qgc2NoZW1hcyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBMaXN0IG5zTm9WYWxzID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciA9IG51bGw7Ci0gIHByaXZhdGUgYm9vbGVhbiBoYXNlcnJvcnMgPSBmYWxzZTsKLSAgcHJpdmF0ZSBIYXNoTWFwIG5lc3RlZE1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlciA9IG51bGw7Ci0gIHByaXZhdGUgV1NETFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiAgICAgICAgICAgIFRoZSBVUkkgb2YgdGhlIGZpbGUgZm9yIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25JbmZvSW1wbChTdHJpbmcgdXJpLCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3IpCi0gIHsKLSAgICB0aGlzLnZhbGlkYXRpbmdfZmlsZV91cmkgPSB1cmk7Ci0gICAgaWYodXJpICE9IG51bGwpCi0gICAgewotICAgICAgdXJpID0gdXJpLnJlcGxhY2VBbGwoIiUyMCIsIiAiKTsKLSAgICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VyaSA9IHVyaTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpbmdfZmlsZV91cmwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGhpcy5tZXNzYWdlZ2VuZXJhdG9yID0gbWVzc2FnZWdlbmVyYXRvcjsKLSAgfQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0I2dldEZpbGVVUkkoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0aW5nX2ZpbGVfdXJpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblJlcG9ydCNpc1dTRExWYWxpZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dTRExWYWxpZCgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFZhbGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm8jYWRkRXJyb3IoamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBpbnQsIGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbikKLSAgewotICAgIGFkZEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdmFsaWRhdGluZ19maWxlX3VyaSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25JbmZvI2FkZEVycm9yKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBpZihhZGRNZXNzYWdlKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBWYWxpZGF0aW9uTWVzc2FnZUltcGwuU0VWX0VSUk9SKSkKLSAgICB7Ci0gICAgICBoYXNlcnJvcnMgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7Ci0gICAgaWYoYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsLlNFVl9FUlJPUiwgZXJyb3JLZXksIG1lc3NhZ2VBcmd1bWVudHMpKQotICAgIHsKLSAgICAgIGhhc2Vycm9ycyA9IHRydWU7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm8jYWRkV2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4pCi0gIHsKLSAgICBhZGRXYXJuaW5nKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdmFsaWRhdGluZ19maWxlX3VyaSk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm8jYWRkV2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBhZGRNZXNzYWdlKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBWYWxpZGF0aW9uTWVzc2FnZUltcGwuU0VWX1dBUk5JTkcpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgbWVzc2FnZSB0byB0aGUgbGlzdC4gQSBtZXNzYWdlIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QgaW4gCi0gICAqIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyBzdWNoIGFzIHdoZW4gdGhlIFVSSSBpcyBpbnZhbGlkIG9yIHRoZSBtZXNzYWdlIAotICAgKiBpcyBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBtZXNzYWdlIHdhcyBhYmxlIHRvIGJlIGFkZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIGludCBzZXZlcml0eSkKLSAgewotICAgICAgcmV0dXJuIHRoaXMuYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgc2V2ZXJpdHksIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgbWVzc2FnZSB0byB0aGUgbGlzdC4gQSBtZXNzYWdlIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QgaW4gCi0gICAqIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyBzdWNoIGFzIHdoZW4gdGhlIFVSSSBpcyBpbnZhbGlkIG9yIHRoZSBtZXNzYWdlIAotICAgKiBpcyBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGVycm9yS2V5IFRoZSBYZXJjZXMgRXJyb3IgS2V5Ci0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIFRoZSBYZXJjZXMgYXJndW1lbnRzIHVzZWQgdG8gY3JlYXRlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgYWJsZSB0byBiZSBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgewotICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bGx5QWRkZWQgPSBmYWxzZTsKLSAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBudWxsIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVwb3J0LgotICAgIGlmKG1lc3NhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5QWRkZWQ7Ci0gICAgfQotICAgIFN0cmluZyBlcnJvclVSSSA9IHVyaTsKLSAgICBVUkwgZXJyb3JVUkwgPSBudWxsOwotICAgIGlmIChlcnJvclVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlcnJvclVSSSA9IGVycm9yVVJJLnJlcGxhY2VBbGwoIiUyMCIsICIgIik7Ci0gICAgICAgIGVycm9yVVJMID0gbmV3IFVSTChlcnJvclVSSSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIC8vZXJyb3JVUkkgPSBub3JtYWxpemVVUkkoZXJyb3JVUkkpOwotICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgZXJyb3JVUkkgPSB2YWxpZGF0aW5nX2ZpbGVfdXJpOwotLy8gICAgICBlcnJvclVSTCA9IHZhbGlkYXRpbmdfZmlsZV91cmw7Ci0vLyAgICB9Ci0gICAgLy9ib29sZWFuIGRvRGlhbG9nID0gdHJ1ZTsKLSAgICBpZiAoZXJyb3JVUkwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdWNjZXNzZnVsbHlBZGRlZCA9IHRydWU7Ci0gICAgICAvLyBBZGQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QgaWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgb2ZmIG9yCi0gICAgICAvLyB0aGlzIG1lc3NhZ2UgaXMgZm9yIHRoZSBjdXJyZW50IGZpbGUuCi0gICAgICBpZiAoIVdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEIHx8IHZhbGlkYXRpbmdfZmlsZV91cmwuc2FtZUZpbGUoZXJyb3JVUkwpKQotICAgICAgewotCi0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlSW1wbCB2YWxtZXMgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKG1lc3NhZ2UsIGxpbmUsCi0gICAgICAgICAgICBjb2x1bW4sIHNldmVyaXR5LCB1cmksIGVycm9yS2V5LCBtZXNzYWdlQXJndW1lbnRzKTsKLSAgICAgICAgbWVzc2FnZXMuYWRkKHZhbG1lcyk7Ci0gICAgICB9Ci0gICAgICAvLyBJZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBlbmFibGVkIGNyZWF0ZSBhIG5lc3RlZCBlcnJvci4KLSAgICAgIGVsc2UgaWYgKFdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmVzdGVkdXJpID0gZXJyb3JVUkwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsIG5lc3RlZG1lc3MgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKG1lc3NhZ2UsIGxpbmUsCi0gICAgICAgICAgICBjb2x1bW4sIHNldmVyaXR5LCBuZXN0ZWR1cmkpOwotCi0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlSW1wbCBjb250YWluZXIgPSAoVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKSBuZXN0ZWRNZXNzYWdlcy5nZXQobmVzdGVkdXJpKTsKLSAgICAgICAgaWYoY29udGFpbmVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJbml0aWFsbHkgc2V0IHRoZSBuZXN0ZWQgZXJyb3IgdG8gYSB3YXJuaW5nLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjaGFuZ2VkCi0gICAgICAgICAgLy8gdG8gYW4gZXJyb3IgaWYgYSBuZXN0ZWQgbWVzc2FnZSBoYXMgYSBzZXZlcml0eSBvZiBlcnJvci4KLSAgICAgICAgICBjb250YWluZXIgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9SRUZfRklMRV9FUlJPUl9NRVNTQUdFLCBuZXN0ZWR1cmkpLCAxLCAwLCBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcsIG5lc3RlZHVyaSk7Ci0gICAgICAgICAgbmVzdGVkTWVzc2FnZXMucHV0KG5lc3RlZHVyaSwgY29udGFpbmVyKTsKLSAgICAgICAgICBtZXNzYWdlcy5hZGQoY29udGFpbmVyKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluZXIuYWRkTmVzdGVkTWVzc2FnZShuZXN0ZWRtZXNzKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5QWRkZWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0I2dldFZhbGlkYXRpb25NZXNzYWdlcygpCi0gICAqLwotICBwdWJsaWMgSVZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiAoSVZhbGlkYXRpb25NZXNzYWdlW10pbWVzc2FnZXMudG9BcnJheShuZXcgSVZhbGlkYXRpb25NZXNzYWdlW21lc3NhZ2VzLnNpemUoKV0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm8jYWRkTmFtZXNwYWNlV2l0aE5vVmFsaWRhdG9yKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIElmIHRoZSBsaXN0IGRvZXNuJ3QgYWxyZWFkeSBjb250YWluIHRoaXMgbmFtZXNwYWNlLCBhZGQgaXQgdG8gdGhlIGxpc3QKLSAgICAvLyBhbmQgY3JlYXRlIGEgd2FybmluZyBtZXNzYWdlLgotICAgIGlmICghbnNOb1ZhbHMuY29udGFpbnMobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICBuc05vVmFscy5hZGQobmFtZXNwYWNlKTsKLSAgICAgIGFkZFdhcm5pbmcobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1dBUk5fTk9fVkFMRElBVE9SLCBuYW1lc3BhY2UpLCAxLCAwKTsKLQotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250cm9sbGVyVmFsaWRhdGlvbkluZm8jY29tcGxldGVXU0RMVmFsaWRhdGlvbigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21wbGV0ZVdTRExWYWxpZGF0aW9uKCkKLSAgewotICAgIGlmIChoYXNlcnJvcnMpCi0gICAgewotICAgICAgd3NkbFZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB3c2RsVmFsaWQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQjaGFzRXJyb3JzKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpCi0gIHsKLSAgICByZXR1cm4gaGFzZXJyb3JzOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0I2dldE5lc3RlZE1lc3NhZ2VzKCkKLSAgICovCi0gIHB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBuZXN0ZWRNZXNzYWdlczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgCXRoaXMudXJpUmVzb2x2ZXIgPSB1cmlSZXNvbHZlcjsKLSAgfQotICAKLSAgcHVibGljIFVSSVJlc29sdmVyIGdldFVSSVJlc29sdmVyKCkKLSAgewotICAJcmV0dXJuIHVyaVJlc29sdmVyOwotICB9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLlZhbGlkYXRpb25JbmZvI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSAKLQl7Ci0JCWlmKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oV1NETFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gIWhhc0Vycm9ycygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uTWVzc2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3ZmMxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbk1lc3NhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIEEgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIGNyZWF0ZWQgd2hlbiB0aGVyZSBpcyBpbmZvcm1hdGlvbiB0byByZXBvcnQgZnJvbQotICogdmFsaWRhdGluZyBhIFdTREwgZG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWVzc2FnZUltcGwgaW1wbGVtZW50cyBJVmFsaWRhdGlvbk1lc3NhZ2UKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotICBwcm90ZWN0ZWQgaW50IGxpbmVOdW1iZXI7Ci0gIHByb3RlY3RlZCBpbnQgY29sdW1uTnVtYmVyOwotICBwcm90ZWN0ZWQgU3RyaW5nIHVyaTsKLSAgcHJvdGVjdGVkIGludCBzZXZlcml0eSA9IFNFVl9FUlJPUjsKLSAgcHJvdGVjdGVkIExpc3QgbmVzdGVkRXJyb3JzOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yS2V5ID0gbnVsbDsKLSAgcHJvdGVjdGVkIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIHdoZXJlIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbiB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiBAZGVwcmVjYXRlZCBVc2UgY29udHJ1Y3RvciB3aXRoIFVSSSBwYXJhbWV0ZXIuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlciwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgdGhpcyhtZXNzYWdlLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIHNldmVyaXR5LCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQWxsb3dzIHNwZWNpZnlpbmcgYSB1cmkgZm9yIHRoZSByZWZlcmVuY2UgdGhhdCB0aGUgbWVzc2FnZSByZWZlcnMgdG8uCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiBAcGFyYW0gY29sdW1uTnVtYmVyIFRoZSBjb2x1bW4gd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSByZWZlcmVuY2UgZmlsZSBmb3IgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlciwgaW50IHNldmVyaXR5LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgICB0aGlzKG1lc3NhZ2UsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgc2V2ZXJpdHksIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQWxsb3dzIHNwZWNpZnlpbmcgYSB1cmkgZm9yIHRoZSByZWZlcmVuY2UgdGhhdCB0aGUgbWVzc2FnZSByZWZlcnMgdG8uCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiBAcGFyYW0gY29sdW1uTnVtYmVyIFRoZSBjb2x1bW4gd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSByZWZlcmVuY2UgZmlsZSBmb3IgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBlcnJvcktleSBUaGUgWGVyY2VzIEVycm9yIGtleQotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBUaGUgdmFsdWVzIHVzZWQgdG8gImZpbGwgaW4gdGhlIGJsYW5rcyIgb2YgYSBYZXJjZXMgZXJyb3IgTWVzc2FnZQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlSW1wbChTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIGludCBzZXZlcml0eSwgU3RyaW5nIHVyaSwgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgIHRoaXMuY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOwotICAgIHRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICB0aGlzLmVycm9yS2V5ID0gZXJyb3JLZXk7Ci0gICAgdGhpcy5tZXNzYWdlQXJndW1lbnRzID0gbWVzc2FnZUFyZ3VtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29sdW1uIG51bWJlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNvbHVtbiBudW1iZXIgd2hlcmUgdGhlIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkKLSAgewotICAgIHJldHVybiBjb2x1bW5OdW1iZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGluZSBudW1iZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lKCkKLSAgewotICAgIHJldHVybiBsaW5lTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIHJldHVybnMgdGhlIHVyaSBvZiB0aGUgcmVmZXJlbmNlIGZpbGUgZm9yIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSB1cmkgb2YgdGhlIHJlc291cmNlIHRoYXQgdGhlIG1lc3NhZ2UgcmVmZXJzIHRvLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uTWVzc2FnZSNnZXRTZXZlcml0eSgpCi0gICAqLwotICBwdWJsaWMgaW50IGdldFNldmVyaXR5KCkKLSAgewotICAgIHJldHVybiBzZXZlcml0eTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KQotICB7Ci0gICAgaWYoc2V2ZXJpdHkgPT0gU0VWX0VSUk9SIHx8IHNldmVyaXR5ID09IFNFVl9XQVJOSU5HKQotICAgIHsKLSAgICAgIHRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRpb25NZXNzYWdlIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gYWRkIGFzIGEgbmVzdGVkIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROZXN0ZWRNZXNzYWdlKElWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSkKLSAgewotICAgIGlmIChuZXN0ZWRFcnJvcnMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXN0ZWRFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotICAgIG5lc3RlZEVycm9ycy5hZGQodmFsaWRhdGlvbk1lc3NhZ2UpOwotICAgIGludCB2YWxpZGFpdG9ubWVzc2FnZVNldmVyaXR5ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLSAgICBpZih2YWxpZGFpdG9ubWVzc2FnZVNldmVyaXR5ID09IFNFVl9FUlJPUikKLSAgICB7Ci0gICAgICBzZXRTZXZlcml0eShTRVZfRVJST1IpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0TmVzdGVkTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIG5lc3RlZEVycm9ycyAhPSBudWxsID8gbmVzdGVkRXJyb3JzIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotICAvKioKLSAgICogQHJldHVybiB0aGUgZXJyb3Iga2V5Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVycm9yS2V5KCkKLSAgewotICAgIHJldHVybiBlcnJvcktleTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBlcnJvcktleSB0aGUgZXJyb3Iga2V5IHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JLZXkoU3RyaW5nIGVycm9yS2V5KQotICB7Ci0gICAgdGhpcy5lcnJvcktleSA9IGVycm9yS2V5OwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIHRoZSBYZXJjZXMgbWVzc2FnZSBhcmd1bWVudHMgdXNlZCB0byAiZmlsbCBpbiB0aGUgYmxhbmtzIiBvZiB0aGUgbWVzc2FnZXMKLSAgICovCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRNZXNzYWdlQXJndW1lbnRzKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlQXJndW1lbnRzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Y4MzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0KLS8qKgotICogQSByZWdpc3RyeSBvZiBJV1NETFZhbGlkYXRvciB2YWxpZGF0b3JzLiBUaGlzIGhvbGRzIHRoZSB0b3AgbGV2ZWwgV1NETCBhbmQgV1MtSSB2YWxpZGF0b3JzLgotICogVmFsaWRhdG9ycyBhcmUgcmVnaXN0ZXJlZCBieSB0aGUgbmFtZXNwYWNlIHRoZXkgdmFsaWRhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeQotewotICAvKioKLSAgICogVGhlIFdTREwgdmFsaWRhdG9yIHR5cGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIEludGVnZXIgV1NETF9WQUxJREFUT1IgPSBuZXcgSW50ZWdlcigwKTsKLSAgLyoqCi0gICAqIFRoZSBXUy1JIHZhbGlkYXRvciB0eXBlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIEVYVF9WQUxJREFUT1IgPSBuZXcgSW50ZWdlcigxKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSB2ZXJJbnN0YW5jZTsKLSAgLyoKLSAgICBUaGlzIGlzIGEgTWFwIG9mIE1hcHMuIFRoZSB0b3AtbGV2ZWwgTWFwIGlzIGtleWVkIGJ5IChDbGFzcylwYXJlbnRUeXBlLAotICAgIGFuZCB0aGUgaW5uZXIgTWFwcyBhcmUga2V5ZWQgYnkgKFFOYW1lKWVsZW1lbnRUeXBlLgotICAgIFRoaXMgaWRlYSBpcyB0aGUgc2FtZSBhcyBpcyBkb25lIGluIFdTREw0SgotICAqLwotICBwcm90ZWN0ZWQgTWFwIHZhbGlkYXRvclJlZyA9IG5ldyBIYXNodGFibGUoKTsKLQotICBwcm90ZWN0ZWQgSXRlcmF0b3IgZGVmYXVsdFZhbGlkYXRvckl0ZXJhdG9yOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBWYWxpZGF0b3JSZWdpc3RyeSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmICh2ZXJJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZlckluc3RhbmNlID0gbmV3IFZhbGlkYXRvclJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiB2ZXJJbnN0YW5jZTsKLSAgfQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhpcyB2YWxpZGF0b3Igb2YgdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRoZSB2YWxpZGF0b3IgdmFsaWRhdGVzLgotICAgKiBAcGFyYW0gdmFsRGVsZWdhdGUgVGhlIHZhbGlkYXRvciBkZWxlZ2F0ZSB0byByZWdpc3Rlci4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETFZhbGlkYXRvckRlbGVnYXRlIHZhbERlbGVnYXRlLCBJbnRlZ2VyIHR5cGUpCi0gIHsKLSAgICAvLyBhbGxvdyB0aGUgbnVsbCBuYW1lc3BhY2UgYnV0IG1ha2UgaXQgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0KLSAgICAvLyBnZXQgdGhlIGhhc3RhYmxlIGZvciB0aGUgdHlwZSBvZiB2YWxpZGF0b3Igd2Ugd2FudAotICAgIEhhc2h0YWJsZSB0eXBlVmFsaWRhdG9yUmVnID0gKEhhc2h0YWJsZSl2YWxpZGF0b3JSZWcuZ2V0KHR5cGUpOwotICAgIC8vIGlmIGl0J3MgbnVsbCBpZiBtZWFucyB3ZSBoYXZlbid0IGRlZmluZWQgdGhpcyB0eXBlIG9mIHZhbGlkYXRvciB5ZXQKLSAgICBpZiAodHlwZVZhbGlkYXRvclJlZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHR5cGVWYWxpZGF0b3JSZWcgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICB2YWxpZGF0b3JSZWcucHV0KHR5cGUsIHR5cGVWYWxpZGF0b3JSZWcpOwotICAgIH0KLSAgICAKLSAgICAgIExpc3QgbmFtZXNwYWNldmFscyA9IChMaXN0KXR5cGVWYWxpZGF0b3JSZWcuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICBpZihuYW1lc3BhY2V2YWxzID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzcGFjZXZhbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHR5cGVWYWxpZGF0b3JSZWcucHV0KG5hbWVzcGFjZSwgbmFtZXNwYWNldmFscyk7Ci0gICAgICB9Ci0gICAgICBuYW1lc3BhY2V2YWxzLmFkZCh2YWxEZWxlZ2F0ZSk7Ci0KLSAgfQotICAvKioKLSAgICogQXNrIGZvciB0aGUgdmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWVzcGFjZS4gSWYgbm9uZSBpcyBmb3VuZAotICAgKiByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBmb3IgdGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRvciBkZWxlZ2F0ZXMgaWYgYXQgbGVhc3Qgb25lIGlzIHJlZ2lzdGVyZWQsIG51bGwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZVtdIHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkoU3RyaW5nIG5hbWVzcGFjZSwgSW50ZWdlciB0eXBlKQotICB7Ci0gICAgLy8gaWYgdGhlIG5hbWVzcGFjZSBpcyBudWxsIGFsbG93IGl0IGFuZCB0cmVhdCBpdCBhcyB0aGUgZW1wdHkgc3RyaW5nCi0gICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9ICIiOwotICAgIH0KLSAgICBIYXNodGFibGUgdHlwZVZhbGlkYXRvclJlZyA9IChIYXNodGFibGUpdmFsaWRhdG9yUmVnLmdldCh0eXBlKTsKLSAgICBpZiAodHlwZVZhbGlkYXRvclJlZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0gICAgTGlzdCB2YWxkZWxzID0gKExpc3QpdHlwZVZhbGlkYXRvclJlZy5nZXQobmFtZXNwYWNlKTsKLSAgICBpZih2YWxkZWxzICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChXU0RMVmFsaWRhdG9yRGVsZWdhdGVbXSl2YWxkZWxzLnRvQXJyYXkobmV3IFdTRExWYWxpZGF0b3JEZWxlZ2F0ZVt2YWxkZWxzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRvciByZWdpc3RlcmVkIG9mIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYSB2YWxpZGF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhlIG5hbWVzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVnaXN0ZXJlZFZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBJbnRlZ2VyIHR5cGUpCi0gIHsKLSAgICBpZiAocXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UsIHR5cGUpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDY0M2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdmFsaWRhdGlvbiBvZiBhIHNwZWNpZmljCi0gKiBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRpb25Db25maWd1cmF0aW9uIAotewotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICAvKioKLSAgICogU2V0IGFuIGF0dHJpYnV0ZSBvbiB0aGUgdmFsaWRhdG9yLiBBbiBhdHRyaWJ1dGUgaXMKLSAgICogZGVmaW5lZCBieSBhIG5hbWUgYW5kIGEgdmFsdWUgcGFpci4gQW4gYXR0cmlidXRlIG1heQotICAgKiBiZSBkZWZpbmVkIGZvciBhbnkgdmFsaWRhdG9yLCBidWlsdCBpbiBvciBhbiBleHRlbnNpb24uCi0gICAqIEV4dGVuc2lvbiB2YWxpZGF0b3JzIGNhbiBwcm9iZSB0aGUgYXR0cmlidXRlcyBzZXQgb24KLSAgICogdGhlIFdTREwgdmFsaWRhdG9yIHRvIGN1c3RvbWl6ZSB0aGUgd2F5IGluIHdoaWNoIHRoZXkKLSAgICogdmFsaWRhdGUuIEEgbnVsbCB2YWx1ZSB3aWxsIHVuc2V0IGFuIGF0dHJpYnV0ZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgaWRlbnRpZmllci4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUgaXRzZWxmLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgewotCWlmKHZhbHVlID09IG51bGwpCi0JewotCSAgcHJvcGVydGllcy5yZW1vdmUobmFtZSk7Ci0JfQotCWVsc2UKLQl7Ci0gIAkgIHByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIHNldCBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gIHsKLQlpZihuYW1lICE9IG51bGwpCi0JICByZXR1cm4gcHJvcGVydGllcy5nZXQobmFtZSk7Ci0JcmV0dXJuIG51bGw7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzJiMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JRXh0ZW5zaWJsZVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuQ2xhc3Nsb2FkZXJXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFCYXNpY1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRvckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLmh0dHAuSFRUUFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5taW1lLk1JTUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuc29hcC5TT0FQVmFsaWRhdG9yOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBBbiBtYWluIFdTREwgdmFsaWRhdG9yIGNsYXNzLiBUaGUgV1NETCB2YWxpZGF0b3IgdmFsaWRhdGVzIFdTREwgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURBVE9SX1JFU09VUkNFX0JVTkRMRSA9ICJ2YWxpZGF0ZXdzZGwiOwotICBwcml2YXRlIFZhbGlkYXRpb25Db250cm9sbGVyIHZhbGlkYXRpb25Db250cm9sbGVyOwotICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXI7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRvcigpCi0gIHsKLSAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShWQUxJREFUT1JfUkVTT1VSQ0VfQlVORExFKTsKLSAgICB1cmlSZXNvbHZlciA9IG5ldyBVUklSZXNvbHZlcigpOwotICAgIHZhbGlkYXRpb25Db250cm9sbGVyID0gbmV3IFZhbGlkYXRpb25Db250cm9sbGVyKHJiLCB1cmlSZXNvbHZlcik7Ci0gICAgCi0gICAgLy9SZWdpc3RlciB0aGUgZGVmYXVsdCB2YWxpZGF0b3JzLgotICAgIFZhbGlkYXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAvLyBSZWdpc3RlciB0aGUgV1NETCAxLjEgdmFsaWRhdG9yIGNvbnRyb2xsZXIgYW5kIHZhbGlkYXRvcnMuCi0gICAgV1NETFZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IENsYXNzbG9hZGVyV1NETFZhbGlkYXRvckRlbGVnYXRlKFdTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIuY2xhc3MuZ2V0TmFtZSgpLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfV1NETCwgZGVsZWdhdGUsIFZhbGlkYXRvclJlZ2lzdHJ5LldTRExfVkFMSURBVE9SKTsKLSAgICBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZTEgPSBuZXcgQ2xhc3Nsb2FkZXJXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZShXU0RMMTFCYXNpY1ZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCksIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCBkZWxlZ2F0ZTEpOwotICAgIGRlbGVnYXRlMSA9IG5ldyBDbGFzc2xvYWRlcldTREwxMVZhbGlkYXRvckRlbGVnYXRlKEhUVFBWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgIHJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uc3RhbnRzLk5TX0hUVFAsIGRlbGVnYXRlMSk7Ci0gICAgZGVsZWdhdGUxID0gbmV3IENsYXNzbG9hZGVyV1NETDExVmFsaWRhdG9yRGVsZWdhdGUoU09BUFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCksIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3Iob3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25zdGFudHMuTlNfU09BUDExLCBkZWxlZ2F0ZTEpOwotICAgIGRlbGVnYXRlMSA9IG5ldyBDbGFzc2xvYWRlcldTREwxMVZhbGlkYXRvckRlbGVnYXRlKE1JTUVWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgIHJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uc3RhbnRzLk5TX01JTUUsIGRlbGVnYXRlMSk7Ci0gICAKLSAgICAvLyBUaGUgV1NETCAxLjEgc2NoZW1hIHZhbGlkYXRvciBpcyBhIHNwZWNpYWwgY2FzZSBhcyBpdCBpcyByZWdpc3RlcmVkIGZvciB0aHJlZSBuYW1lc3BhY2VzLgotLy8gICAgZGVsZWdhdGUxID0gbmV3IFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKElubGluZVNjaGVtYVZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCksIFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0vLyAgICByZWdpc3RlcldTREwxMVZhbGlkYXRvcihDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5LCBkZWxlZ2F0ZTEpOwotLy8gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCwgZGVsZWdhdGUxKTsKLS8vICAgIHJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEsIGRlbGVnYXRlMSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEByZXR1cm4gQSB2YWxpZGF0aW9uIHJlcG9ydCBzdW1tYXJpemluZyB0aGUgcmVzdWx0cyBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpKQotICB7Ci0gICByZXR1cm4gdmFsaWRhdGUodXJpLCBudWxsLCBuZXcgV1NETFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCkpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBmaWxlIGJlaW5nIHZhbGlkYXRlZAotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gVGhlIHN0cmVhbSB0byB2YWxpZGF0ZQotICAgKiBAcmV0dXJuIEEgVmFsaWRhdGlvbiByZXBvcnQgc3VtbWFyaXppbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHZhbGlkYXRpb24KLSAgICovCi0gIHB1YmxpYyBJVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgV1NETFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gIHsKLSAgICBpZih1cmkgPT0gbnVsbCkgCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBpZihjb25maWd1cmF0aW9uID09IG51bGwpCi0gICAgICBjb25maWd1cmF0aW9uID0gbmV3IFdTRExWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpOwotICAgIHJldHVybiB2YWxpZGF0aW9uQ29udHJvbGxlci52YWxpZGF0ZSh1cmksIGlucHV0U3RyZWFtLCBjb25maWd1cmF0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIFVSSSByZXNvbHZlciB0byB0aGUgV1NETCB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSByZXNvbHZlciB0byBhZGQgdG8gdGhlIFdTREwgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVVJJUmVzb2x2ZXIoSUV4dGVuc2libGVVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAJdGhpcy51cmlSZXNvbHZlci5hZGRVUklSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWdpc3RlciBhbiBleHRlbnNpb24gV1NETCB2YWxpZGF0b3IgZGVsZWdhdGUgd2l0aCB0aGlzIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB0aGUgdmFsaWRhdG9yIHZhbGlkYXRlcyBmb3IuIFRoaXMgaXMgdGhlIFdTREwgbmFtZXNwYWNlLgotICAgKiBAcGFyYW0gZGVsZWdhdGUgVGhlIGRlbGVnYXRlIHRoYXQgaG9sZHMgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV1NETEV4dGVuc2lvblZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUpCi0gIHsKLSAgICBWYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKG5hbWVzcGFjZSwgZGVsZWdhdGUsIFZhbGlkYXRvclJlZ2lzdHJ5LkVYVF9WQUxJREFUT1IpOwotICB9Ci0gIAotICAvKioKLSAgICogUmVnaXN0ZXIgYSBXU0RMIDEuMSB2YWxpZGF0b3IgZGVsZWdhdGUgd2l0aCB0aGlzIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB0aGUgdmFsaWRhdG9yIHZhbGlkYXRlcyBmb3IuCi0gICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgZGVsZWdhdGUgdGhhdCBob2xkcyB0aGUgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUpCi0gIHsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKG5hbWVzcGFjZSwgZGVsZWdhdGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvV1NETFZhbGlkYXRvckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvV1NETFZhbGlkYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYWUwMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLS8qKgotICogQSBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSBXU0RMIHZhbGlkYXRvci4KLSAqIEEgZGVsZWdhdGUgaXMgdXNlZCB0byBsYXp5IGxvYWQgZXh0ZW5zaW9uIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgCi17Ci0gIHByaXZhdGUgSVdTRExWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgaW4gdGhpcyBkZWxlZ2F0ZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFdTREwgdmFsaWRhdG9yIHNwZWNpZmllZCBieSB0aGlzIGRlbGVnYXRlLgotICAgKi8KLSAgcHVibGljIElXU0RMVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpCi0gIHsKLSAgICBpZiAodmFsaWRhdG9yID09IG51bGwpCi0gICAgewotICAgICAgdmFsaWRhdG9yID0gbG9hZFZhbGlkYXRvcigpOwotICAgIH0KLSAgICByZXR1cm4gdmFsaWRhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogTG9hZCB0aGUgdmFsaWRhdG9yIHNwZWNpZmllZCBpbiB0aGlzIGRlbGVnYXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgV1NETCB2YWxpZGF0b3Igc3BlY2lmaWVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgSVdTRExWYWxpZGF0b3IgbG9hZFZhbGlkYXRvcigpOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdmFsaWRhdG9yIG5hbWUuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRvck5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL0VjbGlwc2VMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL0VjbGlwc2VMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4MmY0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9FY2xpcHNlTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXI7Ci0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIGxvZyB0byB0aGUgbG9nIGZpbGUgaW4gdGhlIEVjbGlwc2UgbWV0YWRhdGEgZGlyZWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIKLXsKLQotCQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5KSAKLSAgewotICAgIGxvZyhtZXNzYWdlLCBzZXZlcml0eSwgbnVsbCk7CQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZy5JTG9nZ2VyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5UaHJvd2FibGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgVGhyb3dhYmxlIHRocm93YWJsZSkKLSAgewotCS8vIERvbid0IGxvZyB2ZXJib3NlIGluZm9ybWF0aW9uIGluIHRoZSBFY2xpcHNlIGxvZy4KLQlpZihzZXZlcml0eSA9PSBJTG9nZ2VyLlNFVl9WRVJCT1NFKQotCXsKLQkgIHJldHVybjsKLQl9Ci0JaW50IHN0YXR1cyA9IElTdGF0dXMuSU5GTzsKLQlpZihzZXZlcml0eSA9PSBJTG9nZ2VyLlNFVl9XQVJOSU5HKQotCXsKLQkgIHN0YXR1cyA9IElTdGF0dXMuV0FSTklORzsKLQl9Ci0JZWxzZSBpZihzZXZlcml0eSA9PSBJTG9nZ2VyLlNFVl9FUlJPUikKLQl7Ci0JICBzdGF0dXMgPSBJU3RhdHVzLkVSUk9SOwotCX0KLSAgICBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhzdGF0dXMsIFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLCBtZXNzYWdlLCB0aHJvd2FibGUpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2VjbGlwc2UvRWNsaXBzZVdTREwxMVZhbGlkYXRvckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9FY2xpcHNlV1NETDExVmFsaWRhdG9yRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhYjZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9FY2xpcHNlV1NETDExVmFsaWRhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRvckRlbGVnYXRlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgZXh0ZW5kcyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZQotewotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIEJ1bmRsZSBidW5kbGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUgYW5kIAotICAgKiBhIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSB0byB1c2UgdG8gbG9hZCB0aGUgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIEVjbGlwc2VXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZShTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBCdW5kbGUgYnVuZGxlKQotICB7Ci0JdGhpcy52YWxpZGF0b3JDbGFzc25hbWUgPSB2YWxpZGF0b3JDbGFzc25hbWU7Ci0gICAgdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSNsb2FkVmFsaWRhdG9yKCkKLSAgICovCi0gIHByb3RlY3RlZCBJV1NETDExVmFsaWRhdG9yIGxvYWRWYWxpZGF0b3IoKQotICB7Ci0JSVdTREwxMVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCWlmKGJ1bmRsZSAhPSBudWxsKQotCXsKLQkgIHRyeQotCSAgewotICAgICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3NuYW1lKTsKLQotICAgICAgICB2YWxpZGF0b3IgPSAoSVdTREwxMVZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgCUxvZ2dlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2coIlVuYWJsZSB0byBsb2FkIHZhbGlkYXRvciAiICsgdmFsaWRhdG9yQ2xhc3NuYW1lLCBJTG9nZ2VyLlNFVl9FUlJPUiwgdCk7Ci0gICAgICB9Ci0JfQotCXJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL0VjbGlwc2VXU0RMVmFsaWRhdG9yRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL0VjbGlwc2VXU0RMVmFsaWRhdG9yRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlMTgxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9FY2xpcHNlV1NETFZhbGlkYXRvckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JV1NETFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQSBkZWxlZ2F0ZSBob2xkcyBhIHZhbGlkYXRvcidzIGluZm9ybWF0aW9uIGFuZCBjYW4gaW5zdGFudGlhdGUgaXQKLSAqIHdoZW4gcmVxdWVzdGVkIHRvLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVdTRExWYWxpZGF0b3JEZWxlZ2F0ZSBleHRlbmRzIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZQotewotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIEJ1bmRsZSBidW5kbGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUgYW5kIAotICAgKiBhbiBPU0dJIGJ1bmRsZSB0byBsb2FkIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEBwYXJhbSBidW5kbGUgVGhlIE9TR0kgYnVuZGxlIHRvIHVzZSB0byBsb2FkIHRoZSB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgRWNsaXBzZVdTRExWYWxpZGF0b3JEZWxlZ2F0ZShTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBCdW5kbGUgYnVuZGxlKQotICB7Ci0JdGhpcy52YWxpZGF0b3JDbGFzc25hbWUgPSB2YWxpZGF0b3JDbGFzc25hbWU7Ci0gICAgdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5BYnN0cmFjdFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSNsb2FkVmFsaWRhdG9yKCkKLSAgICovCi0gIHByb3RlY3RlZCBJV1NETFZhbGlkYXRvciBsb2FkVmFsaWRhdG9yKCkKLSAgewotCUlXU0RMVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0gICAgaWYoYnVuZGxlICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgCUNsYXNzIHZhbGlkYXRvckNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzc25hbWUpOwotCi0gICAgICAgIHZhbGlkYXRvciA9IChJV1NETFZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgfQotICAgICAgY2F0Y2goVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgCUxvZ2dlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2coIlVuYWJsZSB0byBsb2FkIHZhbGlkYXRvciAiICsgdmFsaWRhdG9yQ2xhc3NuYW1lLCBJTG9nZ2VyLlNFVl9FUlJPUiwgdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkFic3RyYWN0V1NETFZhbGlkYXRvckRlbGVnYXRlI2dldFZhbGlkYXRvck5hbWUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JOYW1lKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0b3JDbGFzc25hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL0lubGluZVNjaGVtYU1vZGVsR3JhbW1hclBvb2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9JbmxpbmVTY2hlbWFNb2RlbEdyYW1tYXJQb29sSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg5YmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL0lubGluZVNjaGVtYU1vZGVsR3JhbW1hclBvb2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxHcmFtbWFyUG9vbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLkdyYW1tYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJEZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBBIGdyYW1tYXIgcG9vbCBmb3IgaW5saW5lIHNjaGVtYXMuIFRoaXMgZ3JhbW1hciBwb29sIHJlc3RyaWN0cyBpbmxpbmUgc2NoZW1hcwotICogZnJvbSBiZWluZyBjYWNoZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVTY2hlbWFNb2RlbEdyYW1tYXJQb29sSW1wbCBleHRlbmRzIFhNTEdyYW1tYXJQb29sSW1wbCAKLXsKLSAgcHVibGljIHZvaWQgcHV0R3JhbW1hcihHcmFtbWFyIGdyYW1tYXIpIAotICB7Ci0JaWYgKGdyYW1tYXIgPT0gbnVsbCkKLQkgIHJldHVybjsKLQkvLyB3ZSBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gJ3NlbGVjdGl2ZScgY2FjaGluZyBvZiBzY2hlbWFzCi0JWE1MR3JhbW1hckRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gZ3JhbW1hci5nZXRHcmFtbWFyRGVzY3JpcHRpb24oKTsKLQlpZiAoIWZQb29sSXNMb2NrZWQgJiYgIWNvbnRhaW5zR3JhbW1hcihncmFtbWFyLmdldEdyYW1tYXJEZXNjcmlwdGlvbigpKSkgCi0JewotCSAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgY2FjaGluZyB0aGUgaW5saW5lIHNjaGVtYXMKLQkgIC8vIHdlIGVuc3VyZSB0aGUgbGl0ZXJhbCBzeXN0ZW0gaWQgZG9lcyBub3QgZW5kIHdpdGggd3NkbAotCSAgLy8gYmVmb3JlIHdlIGF0dGVtcHQgdG8gJ3B1dCcgdGhlIGdyYW1tYXIKLQkgIFN0cmluZyBsaXRTeXNJZCA9IGRlc2NyaXB0aW9uLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotCSAgU3RyaW5nIGJhc1N5c0lkID0gZGVzY3JpcHRpb24uZ2V0QmFzZVN5c3RlbUlkKCk7Ci0JICBpZiAobGl0U3lzSWQgIT0gbnVsbCAmJiBsaXRTeXNJZC5lbmRzV2l0aCgieHNkIikKLQkJCSYmIGJhc1N5c0lkICE9IG51bGwgJiYgYmFzU3lzSWQuZW5kc1dpdGgoIndzZGwiKSkgCi0JICB7Ci0JCQkJLyoKLQkJCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oInB1dEdyYW1hbXIgOiAiICsKLQkJCQkgKiBzY2hlbWFEZXNjcmlwdGlvbi5nZXROYW1lc3BhY2UoKSArICIsICIgKwotCQkJCSAqIHNjaGVtYURlc2NyaXB0aW9uLmdldEV4cGFuZGVkU3lzdGVtSWQoKSArICIsICIgKwotCQkJCSAqIHNjaGVtYURlc2NyaXB0aW9uLmdldEJhc2VTeXN0ZW1JZCgpKTsKLQkJCQkgKi8KLQkgICAgc3VwZXIucHV0R3JhbW1hcihncmFtbWFyKTsKLQkgIH0KLQl9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9VUklSZXNvbHZlcldyYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1VSSVJlc29sdmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjJjOWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1VSSVJlc29sdmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JRXh0ZW5zaWJsZVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdXRpb25SZXN1bHQ7Ci0KLS8qKgotICogQW4gd3JhcHBlciBVUkkgcmVzb2x2ZXIgdGhhdCB3cmFwcyB0aGUgV2ViIFN0YW5kYXJkIFRvb2xzIFVSSSByZXNvbHZlcgotICogaW4gYSBXU0RMIHZhbGlkYXRvciBVUkkgcmVzb2x2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlcldyYXBwZXIgaW1wbGVtZW50cyBJRXh0ZW5zaWJsZVVSSVJlc29sdmVyCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlcldyYXBwZXIoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklFeHRlbnNpYmxlVVJJUmVzb2x2ZXIjcmVzb2x2ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHV0aW9uUmVzdWx0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzb2x2ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgSVVSSVJlc29sdXRpb25SZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotICAgIFN0cmluZyByZXNvbHZlZFN5c3RlbUlkID0gcmVzb2x2ZVBsYXRmb3JtVVJMKHN5c3RlbUlkKTsKLSAgICBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICAgIGlmIChwdWJsaWNJZCAhPSBudWxsIHx8IHJlc29sdmVkU3lzdGVtSWQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIGxvY2F0aW9uID0gcmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCByZXNvbHZlZFN5c3RlbUlkKTsKLSAgICB9ICAKLSAgICAKLSAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICB7ICAgICAgIAotICAgICAgcmVzdWx0LnNldExvZ2ljYWxMb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgICBTdHJpbmcgcGh5c2ljYWwgPSByZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCBsb2NhdGlvbik7Ci0gICAgICBpZihwaHlzaWNhbCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQuc2V0UGh5c2ljYWxMb2NhdGlvbihwaHlzaWNhbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5zZXRQaHlzaWNhbExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXNvbHZlIHBsYXRmb3JtIFVSTHMgdG8gc3RhbmRhcmQgVVJMcy4gVGhpcyBtZXRob2QgaGFzIHRoZQotICAgKiBwcmFjdGljYWwgZWZmZWN0IG9mIHRyYW5zZm9ybWluZyBhIFVSTCBzdWNoIGFzCi0gICAqIHBsYXRmb3JtOi90ZXN0L3Rlc3Qud3NkbAotICAgKiBpbnRvCi0gICAqIGZpbGU6L2M6L3d0cC93b3Jrc3BhY2UvdGVzdC90ZXN0LndzZGwKLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0aGF0IG1heSBjb250YWluIHRoZSBwbGF0Zm9ybSBzY2hlbWUuCi0gICAqIEByZXR1cm4gQSByZXNvbHZlZCBVUkwgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZSBwbGF0Zm9ybSBzY2hlbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVQbGF0Zm9ybVVSTChTdHJpbmcgdXJsKQotICB7Ci0JICBTdHJpbmcgcmVzdWx0ID0gdXJsOwotCSAgaWYodXJsICE9IG51bGwgJiYgdXJsLnN0YXJ0c1dpdGgoInBsYXRmb3JtOiIpKQotICAgICAgewotICAgIAkgIHRyeQotICAgIAkgIHsKLSAgICAJCSAgVVJMIGZpbGVVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTCh1cmwpKTsKLSAgICAJCSAgcmVzdWx0ID0gZmlsZVVSTC50b0V4dGVybmFsRm9ybSgpOwotICAgIAkgIH0KLSAgICAJICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAJICB7Ci0gICAgCQkgIC8vIENhbid0IHJlc29sdmUgdXNpbmcgdGhlIEZpbGVMb2NhdG9yIGluIHRoaXMKLSAgICAJCSAgLy8gY2FzZSBzbyBkbyBub3RoaW5nLgotICAgIAkgIH0KLSAgICAgIH0KLQkgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9WYWxpZGF0ZVdTRExQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1ZhbGlkYXRlV1NETFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNkMWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1ZhbGlkYXRlV1NETFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHJlcXVpcmVkIGZvciBlY2xpcHNlLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVXU0RMUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19GSUxFID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0ZVdTRExQbHVnaW4gaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSB3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTRExQbHVnaW4oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICBpbnN0YW5jZSA9IHRoaXM7Ci0gICAgd3NkbFZhbGlkYXRvclJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKENvbnN0YW50cy5XU0RMX1ZBTElEQVRPUl9QUk9QRVJUSUVTX0ZJTEUpOwotICAgIHJlc291cmNlYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFBST1BFUlRJRVNfRklMRSk7Ci0gICAgCi0gICAgTG9nZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLnNldExvZ2dlcihuZXcgRWNsaXBzZUxvZ2dlcigpKTsKLQotICAgIG5ldyBXU0RMVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIoCi0gICAgICAiZXh0dmFsaWRhdG9yIiwKLSAgICAgICJleHR2YWxpZGF0b3IiLAotICAgICAgV1NETFZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyLkVYVF9WQUxJREFUT1IpCi0gICAgICAucmVhZFJlZ2lzdHJ5KCk7Ci0KLSAgICAvLyByZWdpc3RlciBhbnkgV1NETCAxLjEgdmFsaWRhdG9ycyBkZWZpbmVkCi0gICAgbmV3IFdTREwxMVZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyKCJ3c2RsMTF2YWxpZGF0b3IiLCAidmFsaWRhdG9yIikucmVhZFJlZ2lzdHJ5KCk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIFhNTENhdGFsb2cucmVzZXQoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4gb2JqZWN0LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4gb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFZhbGlkYXRlV1NETFBsdWdpbiBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWdpbi4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGluc3RhbGwgdXJsIG9mIHRoaXMgcGx1Z2luCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxVUkwoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIEZpbGVMb2NhdG9yLnJlc29sdmUoZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSkuZ2V0RmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBSZXNvdXJjZUJ1bmRsZSBoZWxwZXIgbWV0aG9kcwotICAgKiAKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Z2luLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHBsdWdpbgotICAgKi8KLSAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBXU0RMIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIFdTREwgdmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0V1NETFZhbGlkYXRvclJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiB3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gaWQuCi0gICAqIAotICAgKiBAcGFyYW0gc3RyaW5nSUQgLSB0aGUgaWQgZm9yIHRoZSBzdHJpbmcKLSAgICogQHJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gaWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBzdHJpbmdJRCkKLSAgewotICAgIHJldHVybiBnZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhzdHJpbmdJRCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBXU0RMRXh0ZW5zaW9uVmFsaWRhdG9yCi0gKi8KLWNsYXNzIFdTRExWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgV1NETF9WQUxJREFUT1IgPSAwOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFWFRfVkFMSURBVE9SID0gMTsKLSAgcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhZ05hbWU7Ci0gIHByb3RlY3RlZCBpbnQgdmFsaWRhdG9yVHlwZTsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyKFN0cmluZyBleHRlbnNpb25Qb2ludElkLCBTdHJpbmcgdGFnTmFtZSwgaW50IHZhbGlkYXRvclR5cGUpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvblBvaW50SWQgPSBleHRlbnNpb25Qb2ludElkOwotICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7Ci0gICAgdGhpcy52YWxpZGF0b3JUeXBlID0gdmFsaWRhdG9yVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6Ci0gICAqCi0gICAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnZhbGlkYXRlLndzZGwuV1NETEV4dGVuc2lvblZhbGlkYXRvciIKLSAgICogICAgICAgICAgICBpZD0ic29hcFZhbGlkYXRvciIKLSAgICogICAgICAgICAgICBuYW1lPSJTT0FQIFZhbGlkYXRvciI+PgotICAgKiAgIDx2YWxpZGF0b3I+Ci0gICAqICAgICAgICA8cnVuIGNsYXNzPSIgb3JnLmVjbGlwc2UudmFsaWRhdGUud3NkbC5zb2FwLlNPQVBWYWxpZGF0b3IiLz4KLSAgICogICA8L3ZhbGlkYXRvcj4KLSAgICogICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdmFsdWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICogPC9leHRlbnNpb24+Ci0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0gICAgewotICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLQotICAgICAgaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAvLyAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbigpLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAvLwkJCQltb2RpZmllZCB0byByZXNvbHZlIGNlcnRhaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgcGx1Z2luIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAotCi0gICAgICAgICAgQnVuZGxlIHBsdWdpbkJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAodmFsaWRhdG9yVHlwZSA9PSBFWFRfVkFMSURBVE9SKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICBFY2xpcHNlV1NETFZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IEVjbGlwc2VXU0RMVmFsaWRhdG9yRGVsZWdhdGUodmFsaWRhdG9yQ2xhc3MsIHBsdWdpbkJ1bmRsZSk7Ci0gICAgICAgICAgICBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCkucmVnaXN0ZXJXU0RMRXh0ZW5zaW9uVmFsaWRhdG9yKG5hbWVzcGFjZSwgZGVsZWdhdGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFJlYWQgV1NEbCAxLjEgZXh0ZW5zaW9uIHZhbGlkYXRvcnMuCi0gKiAKLSAqICA8ZXh0ZW5zaW9uCi0gKiAgICAgcG9pbnQ9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udmFsaWRhdG9yIgotICogICAgIGlkPSJ3c2RsVmFsaWRhdG9yIgotICogICAgIG5hbWU9IiVfVUlfV1NETF9WQUxJREFUT1IiPgotICogICAgPHdzZGwxMXZhbGlkYXRvcgotICogICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICogICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuc29hcC53c2RsMTEuU09BUFZhbGlkYXRvciIKLSAqICAgICAgIHJlc291cmNlYnVuZGxlPSJ2YWxpZGF0ZXdzZGxzb2FwIi8+Ci0gKiAgIDwvZXh0ZW5zaW9uPgotICogIAotICovCi1jbGFzcyBXU0RMMTFWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhZ05hbWU7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGV4dGVuc2lvblBvaW50SWQgLSB0aGUgaWQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludAotICAgKiBAcGFyYW0gdGFnTmFtZSAtIHRoZSB0YWcgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0gICAqLwotICBwdWJsaWMgV1NETDExVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQsIFN0cmluZyB0YWdOYW1lKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnRJZDsKLSAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIGhhbmRsZSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyB0aGF0IG1hdGNoCi0gICAqIHRoZSBzcGVkaWZpZWQgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50SWQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGFuZCBkZWFsIHdpdGggdGhlIGV4dGVuc2lvbiBwb2ludHMuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZXh0ZW5zaW9uIHBvaW50IGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0gICAgewotICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLQotICAgICAgaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwgJiYgbmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQnVuZGxlIHBsdWdpbkJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBFY2xpcHNlV1NETDExVmFsaWRhdG9yRGVsZWdhdGUodmFsaWRhdG9yQ2xhc3MsIHBsdWdpbkJ1bmRsZSk7Ci0gICAgICAgICAgV1NETFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG5hbWVzcGFjZSwgZGVsZWdhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmRlZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MR3JhbW1hclBvb2xJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuV1NETFZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotCi0vKioKLSAqIEEgV1NETCB2YWxpZGF0b3IgdG8gY29udHJpYnV0ZSB0byB0aGUgV1RQIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IgCi17Ci0gIHByb3RlY3RlZCBIYXNoTWFwIHhzZEdyYW1tYXJQb29scyA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByb3RlY3RlZCBIYXNoTWFwIHhtbEdyYW1tYXJQb29scyA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNnZXRWYWxpZGF0b3JOYW1lKCkKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdG9yTmFtZSgpIAotICB7Ci0JcmV0dXJuIFdTRExWYWxpZGF0aW9uTWVzc2FnZXMuTWVzc2FnZV9XU0RMX3ZhbGlkYXRpb25fbWVzc2FnZV91aTsKLSAgfQotCi0gIC8qKiAKLSAgICogQ3JlYXRlIGFuZCBjb25maWd1cmUgdGhlIHR3byBncmFtbWFyIHBvb2xzIGZvciB0aGlzIFdTREwgdmFsaWRhdGlvbiBjb250ZXh0LgotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3NldHVwVmFsaWRhdGlvbihvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSAKLSAgewotCXN1cGVyLnNldHVwVmFsaWRhdGlvbihjb250ZXh0KTsKLSAgICAKLQlYTUxHcmFtbWFyUG9vbCB4c2RHcmFtbWFyUG9vbCA9IG5ldyBJbmxpbmVTY2hlbWFNb2RlbEdyYW1tYXJQb29sSW1wbCgpOwotCVhNTEdyYW1tYXJQb29sIHhtbEdyYW1tYXJQb29sID0gbmV3IFhNTEdyYW1tYXJQb29sSW1wbCgpOwotCQotCXhzZEdyYW1tYXJQb29scy5wdXQoY29udGV4dCwgeHNkR3JhbW1hclBvb2wpOwotCXhtbEdyYW1tYXJQb29scy5wdXQoY29udGV4dCwgeG1sR3JhbW1hclBvb2wpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSB0d28gZ3JhbW1hciBwb29scyBmb3IgdGhpcyBXU0RMIHZhbGlkYXRpb24gY29udGV4dC4KLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciN0ZWFyZG93blZhbGlkYXRpb24ob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhcmRvd25WYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLSAgICBYTUxHcmFtbWFyUG9vbCB4c2RHcmFtbWFyUG9vbCA9IChYTUxHcmFtbWFyUG9vbCl4c2RHcmFtbWFyUG9vbHMucmVtb3ZlKGNvbnRleHQpOwotICAgIGlmKHhzZEdyYW1tYXJQb29sICE9IG51bGwpCi0gICAgICB4c2RHcmFtbWFyUG9vbC5jbGVhcigpOwotICAgIFhNTEdyYW1tYXJQb29sIHhtbEdyYW1tYXJQb29sID0gKFhNTEdyYW1tYXJQb29sKXhtbEdyYW1tYXJQb29scy5yZW1vdmUoY29udGV4dCk7Ci0gICAgaWYoeG1sR3JhbW1hclBvb2wgIT0gbnVsbCkKLSAgICAgIHhtbEdyYW1tYXJQb29sLmNsZWFyKCk7Ci0gICAgCi0gICAgc3VwZXIudGVhcmRvd25WYWxpZGF0aW9uKGNvbnRleHQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLQlYTUxHcmFtbWFyUG9vbCB4c2RHcmFtbWFyUG9vbCA9IChYTUxHcmFtbWFyUG9vbCl4c2RHcmFtbWFyUG9vbHMuZ2V0KGNvbnRleHQpOwotCVhNTEdyYW1tYXJQb29sIHhtbEdyYW1tYXJQb29sID0gKFhNTEdyYW1tYXJQb29sKXhtbEdyYW1tYXJQb29scy5nZXQoY29udGV4dCk7Ci0JCi0JV1NETFZhbGlkYXRvciB2YWxpZGF0b3IgPSBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0JCi0JV1NETFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgV1NETFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCk7Ci0JY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShDb25zdGFudHMuWE1MU0NIRU1BX0NBQ0hFX0FUVFJJQlVURSwgeHNkR3JhbW1hclBvb2wpOwotICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydHkoQ29uc3RhbnRzLlhNTF9DQUNIRV9BVFRSSUJVVEUsIHhtbEdyYW1tYXJQb29sKTsKLQotCUlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0JaWYgKGlucHV0c3RyZWFtICE9IG51bGwpCi0JewotCSAgdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbmZpZ3VyYXRpb24pOwotCX0KLQllbHNlCi0JewotCSAgdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVyaSwgbnVsbCwgY29uZmlndXJhdGlvbik7Ci0JfQotCQkJICAgICAgICAKLQlyZXR1cm4gY29udmVydFJlcG9ydFRvWE1MUmVwb3J0KHZhbHJlcG9ydCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb252ZXJ0IGEgV1NETCBJVmFsaWRhdGlvblJlcG9ydCB0byBhbiBYTUwgVmFsaWRhdGlvbiBSZXBvcnQuCi0gICAqIAotICAgKiBAcGFyYW0gcmVwb3J0IAotICAgKiAJCVRoZSBXU0RMIElWYWxpZGF0aW9uUmVwb3J0IHRvIGNvbnZlcnQuCi0gICAqIEByZXR1cm4gCi0gICAqIAkJQW4gWE1MIFZhbGlkYXRpb24gUmVwb3J0IHJlcHJlc2VudGluZyB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBJVmFsaWRhdGlvblJlcG9ydC4KLSAgICovCi0gIHByb3RlY3RlZCBWYWxpZGF0aW9uUmVwb3J0IGNvbnZlcnRSZXBvcnRUb1hNTFJlcG9ydChJVmFsaWRhdGlvblJlcG9ydCByZXBvcnQpCi0gIHsKLQlWYWxpZGF0aW9uSW5mbyBjb252ZXJ0ZWRSZXBvcnQgPSBuZXcgVmFsaWRhdGlvbkluZm8ocmVwb3J0LmdldEZpbGVVUkkoKSk7Ci0JSVZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMgPSByZXBvcnQuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0JaW50IG51bU1lc3NhZ2VzID0gbWVzc2FnZXMubGVuZ3RoOwotCWZvcihpbnQgaSA9IDA7IGkgPCBudW1NZXNzYWdlczsgaSsrKQotCXsKLQkgIGNvbnZlcnRNZXNzYWdlKG1lc3NhZ2VzW2ldLCBjb252ZXJ0ZWRSZXBvcnQpOwotCX0KLQotCXJldHVybiBjb252ZXJ0ZWRSZXBvcnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb252ZXJ0IGEgV1NETCBJVmFsaWRhdGlvbk1lc3NhZ2UgYnkgcmVwb3J0aW5nIGl0IGluIHRoZSBWYWxpZGF0aW9uSW5mbyBvYmplY3QuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAJCVRoZSBJVmFsaWRhdGlvbk1lc3NhZ2UgdG8gY29udmVydC4KLSAgICogQHBhcmFtIGNvbnZlcnRlZFJlcG9ydAotICAgKiAJCVRoZSBWYWxpZGF0aW9uSW5mbyBvYmplY3QgcmVwcmVzdGluZyB0aGUgY29udmVydGVkIHJlcG9ydC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbnZlcnRNZXNzYWdlKElWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlLCBWYWxpZGF0aW9uSW5mbyBjb252ZXJ0ZWRSZXBvcnQpCi0gIHsKLQlMaXN0IG5lc3RlZE1lc3NhZ2VzID0gbWVzc2FnZS5nZXROZXN0ZWRNZXNzYWdlcygpOwotCWlmKG5lc3RlZE1lc3NhZ2VzICE9IG51bGwgJiYgbmVzdGVkTWVzc2FnZXMuc2l6ZSgpID4gMCkKLQl7Ci0JICBJdGVyYXRvciBtZXNzYWdlSXRlciA9IG5lc3RlZE1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0JICB3aGlsZShtZXNzYWdlSXRlci5oYXNOZXh0KCkpCi0JICB7Ci0JCWNvbnZlcnRNZXNzYWdlKChJVmFsaWRhdGlvbk1lc3NhZ2UpbWVzc2FnZUl0ZXIubmV4dCgpLCBjb252ZXJ0ZWRSZXBvcnQpOwotCSAgfQotCX0KLQllbHNlCi0JewotCSAgaWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLQkgICAgY29udmVydGVkUmVwb3J0LmFkZFdhcm5pbmcobWVzc2FnZS5nZXRNZXNzYWdlKCksIG1lc3NhZ2UuZ2V0TGluZSgpLCBtZXNzYWdlLmdldENvbHVtbigpLCBtZXNzYWdlLmdldFVSSSgpKTsKLQkgIGVsc2UKLQkJY29udmVydGVkUmVwb3J0LmFkZEVycm9yKG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCBtZXNzYWdlLmdldExpbmUoKSwgbWVzc2FnZS5nZXRDb2x1bW4oKSwgbWVzc2FnZS5nZXRVUkkoKSk7Ci0JfQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjZ2V0VmFsaWRhdG9ySUQoKQotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0b3JJRCgpCi0gIHsKLSAgICAvLyBCZWNhdXNlIHRoaXMgY2xhc3MgaXMgdXNlZCBhcyBhIGRlbGVnYXRlLCByZXR1cm4gdGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IKLSAgICAvLyB3aGljaCBkZWxlZ2F0ZXMgdG8gdGhpcyBjbGFzcy4KLSAKLSAgICByZXR1cm4gV1NETERlbGVnYXRpbmdWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1dTRExEZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9XU0RMRGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDIwZDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1dTRExEZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5EZWxlZ2F0aW5nVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZSAoY2xhc3MgbmFtZSkgd2hpY2ggdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrCi0gKiB3aWxsIHVzZSB0byBpZGVudGlmeSB0aGUgV1NETCB2YWxpZGF0b3IuIFRoZSBhY3R1YWwgZGVsZWdhdGluZyB2YWxpZGF0b3IKLSAqIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgdGhlIGJhc2UgY2xhc3MuIFRoZSBhY3R1YWwgdmFsaWRhdGlvbgotICogZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSB0aGUgZGVsZWdhdGVzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGNsYXNzIGFzCi0gKiB0aGVpciB0YXJnZXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRGVsZWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIERlbGVnYXRpbmdWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETERlbGVnYXRpbmdWYWxpZGF0b3IoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1dTRExWYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1dTRExWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhYzA5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9XU0RMVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBXU0RMIFZhbGlkYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2Uud3NkbHZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VfV1NETF92YWxpZGF0aW9uX21lc3NhZ2VfdWk7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV1NETFZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBXU0RMVmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1dTRExWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL1dTRExWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2YzU1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZWNsaXBzZS9XU0RMVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlOwotCi0KLQotLyoqCi0gKiBBbiBFY2xpcHNlIFdTREwgdmFsaWRhdG9yLiBUaGlzIHZhbGlkYXRvciBpcyB0aGUgZGVmYXVsdCB2YWxpZGF0b3IKLSAqIHVzZWQgaW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBUaGVyZSBpcyBvbmx5IGEgc2luZ2xlIGluc3RhbmNlIG9mCi0gKiB0aGlzIHZhbGlkYXRvci4gV2hlbiBjcmVhdGVkLCB0aGlzIHZhbGlkYXRvciByZWdpc3RlcnMgYWxsIGV4dGVuc2lvbgotICogVVJJIHJlc29sdmVycy4KLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3IKLXsKLQlwcml2YXRlIHN0YXRpYyBXU0RMVmFsaWRhdG9yIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvciByZWdpc3RlcnMgYWxsIG9mIHRoZSBVUkkgcmVzb2x2ZXJzIGRlZmluZWQgdmlhIHRoZQotCSAqIFdTREwgVVJJIHJlc29sdmVyIGV4dGVuc2lvbiBwb2ludCB3aXRoIHRoZSBXU0RMIHZhbGlkYXRvci4gCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFdTRExWYWxpZGF0b3IoKQotCXsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICBVUklSZXNvbHZlcldyYXBwZXIgcmVzb2x2ZXIgPSBuZXcgVVJJUmVzb2x2ZXJXcmFwcGVyKCk7Ci0gICAgICBhZGRVUklSZXNvbHZlcihyZXNvbHZlcik7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoaXMgRWNsaXBzZSBXU0RMIHZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBFY2xpcHNlIFdTREwgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NETFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpCi0JewotCQlpZihpbnN0YW5jZSA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YW5jZSA9IG5ldyBXU0RMVmFsaWRhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2VjbGlwc2Uvd3NkbHZhbGlkYXRpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9lY2xpcHNlL3dzZGx2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZGI1MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2VjbGlwc2Uvd3NkbHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBDb25zdGFudHMgZm9yIHN0cmluZ3MgIAotCi0jIHZhbGlkYXRpb24gc3RyaW5ncwotTWVzc2FnZV9XU0RMX3ZhbGlkYXRpb25fbWVzc2FnZV91aT1XU0RMIFZhbGlkYXRvciB2YWxpZGF0aW5nIHswfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2V4Y2VwdGlvbi9WYWxpZGF0ZVdTRExFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9leGNlcHRpb24vVmFsaWRhdGVXU0RMRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDFiNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2V4Y2VwdGlvbi9WYWxpZGF0ZVdTRExFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0vKioKLSAqIEN1c3RvbSBleGNlcHRpb24gZm9yIFdTREwgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotCS8qKgotICAgKiBSZXF1aXJlZCBzZXJpYWwgdmVyc2lvbiB1aWQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTRExFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0JewotCSAgc3VwZXIobWVzc2FnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2xvZ2dpbmcvSUxvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmFlODkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9sb2dnaW5nL0lMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgc3RhbmRhcmQgbG9nZ2VyIGZvciB0aGUgV1NETCB2YWxpZGF0b3IuIAotICogQWxsb3dzIGZvciBsb2dnaW5nIGVycm9ycyBhbmQgd2FybmluZ3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ2dlcgotewotICAvKioKLSAgICogU2V2ZXJpdHkgZXJyb3IgZm9yIGxvZ2dpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfRVJST1IgPSAwOwotICAKLSAgLyoqCi0gICAqIFNldmVyaXR5IHdhcm5pbmcgZm9yIGxvZ2dpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfV0FSTklORyA9IDE7Ci0gIAotICAvKioKLSAgICogU2V2ZXJpdHkgaW5mbyBmb3IgbG9nZ2luZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IFNFVl9JTkZPID0gMjsKLSAgCi0gIC8qKgotICAgKiBTZXZlcml0eSB2ZXJib3NlIGZvciBsb2dnaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgU0VWX1ZFUkJPU0UgPSAzOwotICAKLSAgLyoqCi0gICAqIExvZyBhIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSAKLSAgICogCQlUaGUgbWVzc2FnZSB0byBsb2cuCi0gICAqIEBwYXJhbSBzZXZlcml0eQotICAgKiAJCVRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZSB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSk7Ci0gIAotICAvKioKLSAgICogTG9nIGEgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIAotICAgKiAJCVRoZSBtZXNzYWdlIHRvIGxvZy4KLSAgICogQHBhcmFtIHNldmVyaXR5Ci0gICAqIAkJVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlIHRvIGxvZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSAKLSAgICogCQlUaGUgZXhjZXB0aW9uIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBUaHJvd2FibGUgdGhyb3dhYmxlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhOWQ1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvbG9nZ2luZy9Mb2dnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZzsKLQotLyoqCi0gKiBUaGUgbG9nZ2VyIGZhY3RvcnkgYWxsb3dzIGZvciBzaW1wbGUgdXNlIG9mIHdoYXRldmVyIGxvZ2dpbmcgbWVjaGFuaXNtIGlzIGluCi0gKiBwbGFjZS4gVGhlIHRvb2wgY2FuIHNwZWNpZnkgYSBjdXN0b20gSUxvZ2dlci4gVGhlIFdTREwgdmFsaWRhdG9yIHdpbGwgcmVxdWVzdCB0aGUKLSAqIGxvZ2dlciBmcm9tIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXJGYWN0b3J5Ci17Ci0gIHByaXZhdGUgc3RhdGljIExvZ2dlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0gIHByaXZhdGUgSUxvZ2dlciBsb2dnZXIgID0gbnVsbDsKLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlciBmYWN0b3J5LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBsb2dnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExvZ2dlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0JaWYoZmFjdG9yeSA9PSBudWxsKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpOwotCX0KLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbG9nZ2VyIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbG9nZ2VyCi0gICAqICAgICAgICAgICAgVGhlIElMb2dnZXIgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nZ2VyKElMb2dnZXIgbG9nZ2VyKQotICB7Ci0gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvZ2dlci4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbG9nZ2VyLgotICAgKi8KLSAgcHVibGljIElMb2dnZXIgZ2V0TG9nZ2VyKCkKLSAgewotCWlmKGxvZ2dlciA9PSBudWxsKQotCXsKLQkgIGxvZ2dlciA9IG5ldyBTdGFuZGFyZExvZ2dlcigpOwotCX0KLQlyZXR1cm4gbG9nZ2VyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvbG9nZ2luZy9TdGFuZGFyZExvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2xvZ2dpbmcvU3RhbmRhcmRMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjMWIyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvbG9nZ2luZy9TdGFuZGFyZExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZzsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIHByaW50IGxvZyBpbmZvIHRvIHN0YW5kYXJkIHN5c3RlbSBvdXRwdXRzLgotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyCi17IAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5KSAKLSAgeyAgCi0JUHJpbnRTdHJlYW0gb3V0cHV0U3RyZWFtID0gU3lzdGVtLm91dDsKLQlpZihzZXZlcml0eSA9PSBJTG9nZ2VyLlNFVl9FUlJPUikKLQl7Ci0JICBvdXRwdXRTdHJlYW0gPSBTeXN0ZW0uZXJyOwotCX0KLSAgICBvdXRwdXRTdHJlYW0ucHJpbnRsbihtZXNzYWdlKTsKLSAgfQotCi0vKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLlRocm93YWJsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgZXJyb3IsIGludCBzZXZlcml0eSwgVGhyb3dhYmxlIHRocm93YWJsZSkKLSAgewotCWxvZyhlcnJvciwgc2V2ZXJpdHkpOwotCWxvZyh0aHJvd2FibGUudG9TdHJpbmcoKSwgc2V2ZXJpdHkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvSUV4dGVuc2libGVVUklSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL0lFeHRlbnNpYmxlVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzMGFlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvSUV4dGVuc2libGVVUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgV1NETCB2YWxpZGF0b3IncyBVUkkgcmVzb2x2ZXIgbWVjaGFuaXNtLiBUaGUgVVJJIHJlc29sdmVyCi0gKiBpcyB1c2VkIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGFuIGVudGl0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRXh0ZW5zaWJsZVVSSVJlc29sdmVyCi17Ci0gLyoqCi0gICogUmVzb2x2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVudGl0eSBkZXNjcmliZWQgYnkgdGhlIHB1YmxpY0lkIGFuZCBzeXN0ZW1JZC4KLSAgKiAKLSAgKiBAcGFyYW0gYmFzZUxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgdXJpLgotICAqIEBwYXJhbSBwdWJsaWNJZCBBbiBvcHRpb25hbCBwdWJsaWMgaWRlbnRpZmllciAoaS5lLiBuYW1lc3BhY2UgbmFtZSksIG9yIG51bGwgaWYgbm9uZS4KLSAgKiBAcGFyYW0gc3lzdGVtSWQgQW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJLCBvciBudWxsIGlmIG5vbmUuCi0gICogQHBhcmFtIHJlc3VsdCBUaGUgcmVzdWx0IG9mIHRoZSByZXNvbHV0aW9uLgotICAqLwotICBwdWJsaWMgdm9pZCByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBJVVJJUmVzb2x1dGlvblJlc3VsdCByZXN1bHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL0lVUklSZXNvbHV0aW9uUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvSVVSSVJlc29sdXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2YmIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvSVVSSVJlc29sdXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlcjsKLQotLyoqCi0gKiBUaGUgcmVwcmVzZW50YXRpb24gb2YgYSBVUkkgcmVzb2x1dGlvbiByZXN1bHQuIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBtZWFudCB0bwotICogYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSSVJlc29sdXRpb25SZXN1bHQgCi17Ci0gIC8qKgotICAgKiBHZXQgdGhlIGxvZ2ljYWwgbG9jYXRpb24gb2YgdGhlIHJlc29sdXRpb24gcmVzdWx0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbG9naWNhbCBsb2NhdGlvbiBvZiB0aGUgcmVzb2x1dGlvbiByZXN1bHQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxMb2NhdGlvbigpOwotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbG9naWNhbCBsb2NhdGlvbiBvZiB0aGUgcmVzb2x1dGlvbiByZXN1bHQuCi0gICAqIAotICAgKiBAcGFyYW0gbG9naWNhbExvY2F0aW9uIFRoZSBsb2dpY2FsIGxvY2F0aW9uIG9mIHRoZSByZXNvbHV0aW9uIHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvZ2ljYWxMb2NhdGlvbihTdHJpbmcgbG9naWNhbExvY2F0aW9uKTsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSByZXNvbHV0aW9uIHJlc3VsdC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSByZXNvbHV0aW9uIHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxMb2NhdGlvbigpOwotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIHJlc29sdXRpb24gcmVzdWx0LgotICAgKiAKLSAgICogQHBhcmFtIHBoeXNpY2FsTG9jYXRpb24gVGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSByZXNvbHV0aW9uIHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBoeXNpY2FsTG9jYXRpb24oU3RyaW5nIHBoeXNpY2FsTG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdXRpb25SZXN1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHV0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZGYwYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBVUkkgcmVzb2x1dGlvbiByZXN1bHRzLgotICoKLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdXRpb25SZXN1bHQgaW1wbGVtZW50cyBJVVJJUmVzb2x1dGlvblJlc3VsdAotewotICBwcml2YXRlIFN0cmluZyBsb2dpY2FsTG9jYXRpb24gPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBwaHlzaWNhbExvY2F0aW9uID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHV0aW9uUmVzdWx0KCkKLSAgewotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHV0aW9uUmVzdWx0I2dldExvZ2ljYWxMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxMb2NhdGlvbigpCi0gIHsKLQlyZXR1cm4gbG9naWNhbExvY2F0aW9uOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHV0aW9uUmVzdWx0I3NldExvZ2ljYWxMb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9naWNhbExvY2F0aW9uKFN0cmluZyBsb2dpY2FsTG9jYXRpb24pCi0gIHsKLQl0aGlzLmxvZ2ljYWxMb2NhdGlvbiA9IGxvZ2ljYWxMb2NhdGlvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x1dGlvblJlc3VsdCNnZXRQaHlzaWNhbExvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxMb2NhdGlvbigpCi0gIHsKLQlyZXR1cm4gcGh5c2ljYWxMb2NhdGlvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x1dGlvblJlc3VsdCNzZXRQaHlzaWNhbExvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQaHlzaWNhbExvY2F0aW9uKFN0cmluZyBwaHlzaWNhbExvY2F0aW9uKQotICB7Ci0JdGhpcy5waHlzaWNhbExvY2F0aW9uID0gcGh5c2ljYWxMb2NhdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTRiODZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLkxhenlVUkxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1haW4gVVJJIHJlc29sdmVyIHRoYXQgY2FsbHMgb3V0IHRvIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZAotICogZXh0ZXJuYWwgVVJJIHJlc29sdmVycyB0byBsb2NhdGUgYW4gZW50aXR5LiBJZiBub25lIG9mIHRoZSBleHRlcm5hbCByZXNvbHZlcnMKLSAqIGNhbiBsb2NhdGUgdGhlIGVudGl0eSB0aGUgcmVzb2x2ZXIgd2lsbCBhc2sgdGhlIGludGVybmFsIFdTREwgdmFsaWRhdG9yIFhNTAotICogY2F0YWxvZyB0byByZXNvbHZlIHRoZSBsb2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyIGltcGxlbWVudHMgSUV4dGVuc2libGVVUklSZXNvbHZlciwgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJpdmF0ZSBMaXN0IGV4dFVSSVJlc29sdmVyc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiAKLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlcigpCi0gIHsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEFkZCBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHVyaVJlc29sdmVyCi0gICAqICAgICAgICAgIFRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVVJJUmVzb2x2ZXIoSUV4dGVuc2libGVVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAgIGV4dFVSSVJlc29sdmVyc0xpc3QuYWRkKHVyaVJlc29sdmVyKTsKLSAgfQotCi0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklFeHRlbnNpYmxlVVJJUmVzb2x2ZXIjcmVzb2x2ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHV0aW9uUmVzdWx0KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzb2x2ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgSVVSSVJlc29sdXRpb25SZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgSXRlcmF0b3IgcmVzb2x2ZXJJdGVyID0gZXh0VVJJUmVzb2x2ZXJzTGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlKHJlc29sdmVySXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSUV4dGVuc2libGVVUklSZXNvbHZlciByZXNvbHZlciA9IChJRXh0ZW5zaWJsZVVSSVJlc29sdmVyKXJlc29sdmVySXRlci5uZXh0KCk7Ci0gICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICByZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkLCByZXN1bHQpOwotICAgICAgaWYgKHJlc3VsdC5nZXRMb2dpY2FsTG9jYXRpb24oKSAhPSBudWxsICYmICFyZXN1bHQuZ2V0UGh5c2ljYWxMb2NhdGlvbigpLmVxdWFscyhzeXN0ZW1JZCkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGxvY2F0ZSB0aGUgcmVzdWx0IHlldCBhc2sgdGhlIGludGVybmFsIFhNTAotICAgIC8vIGNhdGFsb2cuCi0gICAgaWYgKHJlc3VsdC5nZXRMb2dpY2FsTG9jYXRpb24oKSA9PSBudWxsICYmIChwdWJsaWNJZCAhPSBudWxsIHx8IHN5c3RlbUlkICE9IG51bGwpKQotICAgIHsKLSAgICAgIFN0cmluZyB0ZW1wcmVzdWx0ID0gWE1MQ2F0YWxvZy5nZXRJbnN0YW5jZSgpLnJlc29sdmVFbnRpdHlMb2NhdGlvbihwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgaWYodGVtcHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgIAlyZXN1bHQuc2V0TG9naWNhbExvY2F0aW9uKHRlbXByZXN1bHQpOwotICAgIAlyZXN1bHQuc2V0UGh5c2ljYWxMb2NhdGlvbih0ZW1wcmVzdWx0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYocmVzdWx0LmdldExvZ2ljYWxMb2NhdGlvbigpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LnNldExvZ2ljYWxMb2NhdGlvbihub3JtYWxpemUoYmFzZUxvY2F0aW9uLCBzeXN0ZW1JZCkpOwotICAgICAgcmVzdWx0LnNldFBoeXNpY2FsTG9jYXRpb24ocmVzdWx0LmdldExvZ2ljYWxMb2NhdGlvbigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBJVVJJUmVzb2x1dGlvblJlc3VsdCByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0JSVVSSVJlc29sdXRpb25SZXN1bHQgcmVzdWx0PSBuZXcgVVJJUmVzb2x1dGlvblJlc3VsdCgpOwotCXJlc29sdmUoYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQsIHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXIpCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmVzb3VyY2VJZGVudGlmaWVyKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldFB1YmxpY0lkKCk7Ci0gICAgU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgIGlmIChwdWJsaWNJZCA9PSBudWxsIHx8IHB1YmxpY0lkLmVxdWFscygiIikpCi0gICAgewotICAgICAgcHVibGljSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIElVUklSZXNvbHV0aW9uUmVzdWx0IHJlc3VsdCA9IHJlc29sdmUocmVzb3VyY2VJZGVudGlmaWVyLmdldEJhc2VTeXN0ZW1JZCgpLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIFhNTElucHV0U291cmNlIHhtbElucHV0U291cmNlID0gbnVsbDsKLSAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgewotICAgICAgTGF6eVVSTElucHV0U3RyZWFtIGlzID0gbmV3IExhenlVUkxJbnB1dFN0cmVhbShyZXN1bHQuZ2V0UGh5c2ljYWxMb2NhdGlvbigpKTsKLSAgICAgIHhtbElucHV0U291cmNlID0gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCByZXN1bHQuZ2V0TG9naWNhbExvY2F0aW9uKCksIHJlc3VsdC5nZXRMb2dpY2FsTG9jYXRpb24oKSwgaXMsIG51bGwpOwotICAgIH0KLSAgICByZXR1cm4geG1sSW5wdXRTb3VyY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBOb3JtYWxpemUgdGhlIHN5c3RlbUlkLiBNYWtlIGl0IGFic29sdXRlIHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICogYmFzZUxvY2F0aW9uIGlmIG5lY2Vzc2FyeS4KLSAgICogCi0gICAqIEBwYXJhbSBiYXNlTG9jYXRpb24gVGhlIGJhc2UgbG9jYXRpb24gb2YgdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgc3lzdGVtIGlkIG9mIHRoZSBmaWxlLgotICAgKiBAcmV0dXJuIEEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBzeXN0ZW0gaWQuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgCWlmKHN5c3RlbUlkID09IG51bGwpCi0gIAl7Ci0gIAkgIHJldHVybiBzeXN0ZW1JZDsKLSAgCX0KLSAgCS8vIFRyeSB0byBmaW5kIGEgc2NoZW1lIGluIHRoZSBzeXN0ZW1JZC4KLSAgCWludCBzY2hlbWFMb2MgPSBzeXN0ZW1JZC5pbmRleE9mKCc6Jyk7Ci0gIAlpZihzY2hlbWFMb2MgIT0gLTEgJiYgc3lzdGVtSWQuY2hhckF0KHNjaGVtYUxvYysxKSA9PSAnLycpCi0gIAl7Ci0gIAkgIC8vIEEgc2NoZW1lIGhhcyBiZWVuIGZvdW5kLiBUaGUgc3lzdGVtSWQgaXMgYW4KLSAgCSAgLy8gYWJzb2x1dGUgbG9jYXRpb24gc28gcmV0dXJuIGl0LgotICAJICByZXR1cm4gc3lzdGVtSWQ7Ci0gIAl9Ci0gIAlpZihiYXNlTG9jYXRpb24gPT0gbnVsbCkKLSAgCXsKLSAgCSAgcmV0dXJuIGJhc2VMb2NhdGlvbjsKLSAgCX0KLSAgCQotICAJU3RyaW5nIHJlc3VsdCA9ICIiOwotICAJCi0gIAkvLyBFbnN1cmUgYWxsIHNsYXNoZXMgaW4gdGhlIGxvY2F0aW9ucyBhcmUgLy4KLSAgCWJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgCXN5c3RlbUlkID0gc3lzdGVtSWQucmVwbGFjZSgnXFwnLCcvJyk7Ci0gIAkKLSAgCS8vIFJlbW92ZSB0aGUgdHJhaWxpbmcgc2VjdGlvbiBvZiB0aGUgYmFzZUxvY2F0aW9uLgotCWludCBsYXN0U2xhc2ggPSBiYXNlTG9jYXRpb24ubGFzdEluZGV4T2YoJy8nKTsKLSAgCVN0cmluZyB0ZW1wcmVzdWx0ID0gYmFzZUxvY2F0aW9uLnN1YnN0cmluZygwLCBsYXN0U2xhc2grMSk7Ci0gIAkKLSAgCWlmKHN5c3RlbUlkLnN0YXJ0c1dpdGgoIi8iKSkKLSAgCXsKLSAgCSAgc3lzdGVtSWQgPSBzeXN0ZW1JZC5zdWJzdHJpbmcoMSk7Ci0gIAl9Ci0gIAkKLSAgCS8vIEpvaW4gdGhlIGJhc2UgbG9jYXRpb24gd2l0aCB0aGUgc3lzdGVtaWQKLSAgCXRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0ICsgc3lzdGVtSWQ7Ci0gIAkKLSAgCS8vIFdoaWxlIHRoZSByZWxhdGl2ZSBsb2NhdGlvbiBzdGFydHMgd2l0aCBhIC4uLyBvciAuLyBjaGFuZ2UKLSAgCS8vIHRoZSByZXN1bHQgYW5kIHRoZSByZWxhdGl2ZSBsb2NhdGlvbi4KLSAgCWludCBsb2M7Ci0gIAl3aGlsZSgobG9jID0gdGVtcHJlc3VsdC5sYXN0SW5kZXhPZigiLi8iKSkgIT0gLTEpCi0gIAl7Ci0gIAkgIHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKGxvYyArIDIpICsgcmVzdWx0OwotICAJICBpZih0ZW1wcmVzdWx0LmNoYXJBdChsb2MgLSAxKSA9PSAnLicpCi0gIAkgIHsKLSAgCSAgCWlmKHRlbXByZXN1bHQuY2hhckF0KGxvYyAtIDIpID09ICcvJykKLSAgCSAgCXsKLSAgCSAgCSAgU3RyaW5nIHRlbXAgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MgLSAyKTsKLSAgCSAgCSAgaW50IGxvYzIgPSB0ZW1wLmxhc3RJbmRleE9mKCcvJyk7Ci0gIAkgIAkgIGlmKGxvYzIgPT0gLTEpCi0gIAkgIAkgIHsKLSAgCSAgCSAgCS8vIElmIHRoZXJlIGlzIG5vIG90aGVyIC8gYmVmb3JlIHRoaXMgdGhlIFVSTCBtdXN0IHN0YXJ0IHdpdGggc2NoZW1lOi8uLi8KLSAgCSAgCSAgCXJlc3VsdCA9ICIuLi8iICsgcmVzdWx0OwotICAJICAJICAJdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYyAtIDEpOwotICAJICAJICB9Ci0gIAkgIAkgIGVsc2UKLSAgCSAgCSAgewotICAJICAJICAJLy8gUmVtb3ZlIHRoZSBzZWN0aW9uIHRoYXQgY29tZXMgYmVmb3JlIHRoaXMgb25lIGZyb20gdGVtcHJlc3VsdCB1bmxlc3MgaXQncyAuLi8uCi0gIAkgIAkgICAgdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYyAtIDEpOwotICAJICAJICAgIGludCBudW1TZWN0c1RvUmVtb3ZlID0gMTsKLSAgCSAgCSAgICAKLSAgCSAgCSAgICB3aGlsZSh0ZW1wcmVzdWx0LmVuZHNXaXRoKCIuLyIpKQotICAJICAJICAgIHsKLSAgCSAgCSAgICAgIGludCB0ZW1wcmVzbGVuID0gdGVtcHJlc3VsdC5sZW5ndGgoKTsKLSAgCSAgCSAgICAgIGlmKHRlbXByZXNsZW4gPiAyICYmIHRlbXByZXN1bHQuY2hhckF0KHRlbXByZXNsZW4gLTMpID09ICcuJykKLSAgCSAgCSAgICAgIHsKLSAgCSAgCSAgICAgIAlpZih0ZW1wcmVzbGVuID4gMyAmJiB0ZW1wcmVzdWx0LmNoYXJBdCh0ZW1wcmVzbGVuIC0gNCkgPT0gJy8nKQotICAJICAJICAgICAgCXsKLSAgCSAgCSAgICAgIAkgIG51bVNlY3RzVG9SZW1vdmUrKzsKLSAgCSAgCSAgICAgIAkgIHRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCB0ZW1wcmVzdWx0Lmxlbmd0aCgpIC0zKTsKLSAgCSAgCSAgICAgICAgfQotICAJICAJICAgICAgCWVsc2UKLSAgCSAgCSAgICAgIAl7Ci0gIAkgIAkgICAgICAJICBicmVhazsKLSAgCSAgCSAgICAgIAl9Ci0gIAkgIAkgICAgICB9Ci0gIAkgIAkgICAgICBlbHNlCi0gIAkgIAkgICAgICB7Ci0gIAkgIAkgICAgICAJaWYodGVtcHJlc3VsdC5jaGFyQXQodGVtcHJlc3VsdC5sZW5ndGgoKSAtMikgPT0gJy8nKQotICAJICAJICAgICAgCXsKLSAgCSAgCSAgICAgIAkgIHRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCB0ZW1wcmVzdWx0Lmxlbmd0aCgpIC0yKTsKLSAgCSAgCSAgICAgIAl9Ci0gIAkgIAkgICAgICAJZWxzZQotICAJICAJICAgICAgCXsKLSAgCSAgCSAgICAgIAkgIGJyZWFrOwotICAJICAJICAgICAgCX0KLSAgCSAgCSAgICAgIH0KLSAgCSAgCSAgICB9Ci0gIAkgIAkgICAgLy8gUmVtb3ZlIHRoZSBzZWN0aW9ucy4KLSAgCSAgCSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtU2VjdHNUb1JlbW92ZTsgaSsrKQotICAJICAJICAgIHsKLSAgCSAgCSAgICAgIFN0cmluZyB0ZW1wMiA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsdGVtcHJlc3VsdC5sZW5ndGgoKS0xKTsKLSAgCSAgCSAgICAgIGludCBsb2MzID0gdGVtcDIubGFzdEluZGV4T2YoJy8nKTsKLSAgCSAgCSAgICAgIGlmKGxvYzMgPT0gLTEpCi0gIAkgIAkgICAgICB7Ci0gIAkgIAkgICAgICAJYnJlYWs7Ci0gIAkgIAkgICAgICB9Ci0gIAkgIAkgICAgICB0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jMysxKTsKLSAgCSAgCSAgICB9Ci0gIAkgIAkgIH0gCi0gIAkgIAl9Ci0gIAkgIAllbHNlCi0gIAkgIAl7Ci0gIAkgIAkgIC8vIFRoZSBVUkkgaXMgb2YgdGhlIGZvcm0gZmlsZTovL3NvbWVkaXIuLi8gc28gY29weSBpdCBhcyBpcwotICAJICAJICBTdHJpbmcgdGVtcCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYyAtIDEpOwotCSAgCSAgaW50IGxvYzIgPSB0ZW1wLmxhc3RJbmRleE9mKCcvJyk7Ci0JICAJICBpZihsb2MyID09IC0xKQotCSAgCSAgewotCSAgCSAgCS8vIFRoZSBVUkkgbXVzdCBsb29rIGxpa2UgZmlsZTouLi8gb3IgLi4vIHNvIGNvcHkgb3ZlciB0aGUgd2hvbGUgdGVtcHJlc3VsdC4KLQkgIAkgIAlyZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLGxvYysyKSArIHJlc3VsdDsKLQkgIAkgIAl0ZW1wcmVzdWx0ID0gIiI7Ci0JICAJICB9Ci0JICAJICBlbHNlCi0JICAJICB7Ci0JICAJICAJLy8gQ29weSBvdmVyIHRoZSB3aG9sZSBzb21lZGlyLi4vCi0JICAJICAJcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcobG9jMiArIDEsIHRlbXByZXN1bHQubGVuZ3RoKCkpOwotCSAgCSAgICB0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jMisxKTsKLQkgIAkgIH0KLSAgCSAgCX0KLSAgCSAgfQotICAJICBlbHNlCi0gIAkgIHsKLSAgCSAgICBpZih0ZW1wcmVzdWx0LmNoYXJBdChsb2MgLTEgKSA9PSAnLycpCi0JICAJewotICAJICAJICAvLyBSZXN1bHQgaXMgb2YgdGhlIGZvcm0gZmlsZTovL3NvbWV0aGluZy8uL3NvbWV0aGluZyBzbyByZW1vdmUgdGhlIC4vCi0gIAkgICAgICB0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCxsb2MpOwotCSAgCX0KLSAgCSAgICBlbHNlCi0gIAkgICAgewotICAJICAgICAgLy8gUmVzdWx0IFVSSSBpcyBvZiBmb3JtIGZpbGU6Ly9zb21lZGlyLi8gc28gY29weSBvdmVyIHRoZSB3aG9sZSBzZWN0aW9uLgotICAgIAkgIFN0cmluZyB0ZW1wID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jIC0gMSk7Ci0gIAkgIAkgIGludCBsb2MyID0gdGVtcC5sYXN0SW5kZXhPZignLycpOwotICAJICAJICBpZihsb2MyID09IC0xKQotICAJICAJICB7Ci0gIAkgIAkgIAkvLyBUaGUgVVJJIG11c3QgbG9vayBsaWtlIGZpbGU6Li8gb3IgLi8gc28gY29weSBvdmVyIHRoZSB3aG9sZSB0ZW1wcmVzdWx0LgotICAJICAJICAJcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jKSArIHJlc3VsdDsKLSAgCSAgCSAgCXRlbXByZXN1bHQgPSAiIjsKLSAgCSAgCSAgfQotICAJICAJICBlbHNlCi0gIAkgIAkgIHsKLSAgCSAgCSAgCS8vIENvcHkgb3ZlciB0aGUgd2hvbGUgc29tZWRpci4vCi0gIAkgIAkgIAlyZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZyhsb2MyICsgMSwgdGVtcHJlc3VsdC5sZW5ndGgoKSk7Ci0gIAkgIAkgICAgdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYzIrMSk7Ci0gIAkgIAkgIH0KLSAgCSAgICB9Ci0gIAkgIH0KLSAgCX0KLSAgCXJlc3VsdCA9IHRlbXByZXN1bHQgKyByZXN1bHQ7Ci0gIAlyZXR1cm4gcmVzdWx0OwotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdmVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhOTk5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXI7Ci0KLQotLyoqCi0gKiBBIGRlbGVnYXRlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lOwotICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyOwotICBwcml2YXRlIElFeHRlbnNpYmxlVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBjbGFzc25hbWUgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIFVSSSByZXNvbHZlci4KLSAgICogQHBhcmFtIGNsYXNzbG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIFVSSSByZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlckRlbGVnYXRlKFN0cmluZyBjbGFzc25hbWUsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQotICB7Ci0gICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gICAgdGhpcy5jbGFzc2xvYWRlciA9IGNsYXNzbG9hZGVyOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBVUkkgcmVzb2x2ZXIgZGVzY3JpYmVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgcmVzb2x2ZXIgZGVzY3JpYmVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwdWJsaWMgSUV4dGVuc2libGVVUklSZXNvbHZlciBnZXRVUklSZXNvbHZlcigpCi0gIHsKLSAgICBpZihyZXNvbHZlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICByZXNvbHZlciA9IChJRXh0ZW5zaWJsZVVSSVJlc29sdmVyKWNsYXNzbG9hZGVyLmxvYWRDbGFzcyhjbGFzc25hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlciA9IChJRXh0ZW5zaWJsZVVSSVJlc29sdmVyKWdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlMikKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9BbnRMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvQW50TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGY3YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9BbnRMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXI7Ci0KLS8qKgotICogQSBsb2dnZXIgdGhhdCBsb2dzIHVzaW5nIEFudCdzIGxvZyBtZXRob2QuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIAotewotICBwcml2YXRlIFRhc2sgdGFzayA9IG51bGw7Ci0JCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBhbnRUYXNrCi0gICAqIAkJVGhlIEFudCB0YXNrIHRoaXMgbG9nZ2VyIHdpbGwgYWN0IGZvci4KLSAgICovCi0gIHB1YmxpYyBBbnRMb2dnZXIoVGFzayBhbnRUYXNrKQotICB7Ci0gICAgdGFzayA9IGFudFRhc2s7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlciNsb2coamF2YS5sYW5nLlN0cmluZywgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHkpIAotICB7Ci0gICAgaW50IG1zZ0xldmVsID0gUHJvamVjdC5NU0dfRVJSOwotICAgIGlmKHNldmVyaXR5ID09IElMb2dnZXIuU0VWX1dBUk5JTkcpCi0gICAgewotICAgICAgbXNnTGV2ZWwgPSBQcm9qZWN0Lk1TR19XQVJOOwotICAgIH0KLSAgICBlbHNlIGlmKHNldmVyaXR5ID09IElMb2dnZXIuU0VWX0lORk8pCi0gICAgewotICAgICAgbXNnTGV2ZWwgPSBQcm9qZWN0Lk1TR19JTkZPOwotICAgIH0KLSAgICBlbHNlIGlmKHNldmVyaXR5ID09IElMb2dnZXIuU0VWX1ZFUkJPU0UpCi0gICAgewotICAgICAgbXNnTGV2ZWwgPSBQcm9qZWN0Lk1TR19WRVJCT1NFOwotICAgIH0KLSAgICB0YXNrLmxvZyhtZXNzYWdlLCBtc2dMZXZlbCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLlRocm93YWJsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBUaHJvd2FibGUgdGhyb3dhYmxlKSAKLSAgewotCWxvZyhtZXNzYWdlLCBzZXZlcml0eSk7Ci0JbG9nKHRocm93YWJsZS50b1N0cmluZygpLCBzZXZlcml0eSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9FeHRlbnNpb25WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvRXh0ZW5zaW9uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNDk0NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9FeHRlbnNpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmFudDsKLQotLyoqCi0gKiBBbiBleHRlbnNpb24gQW50IFdTREwgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIGNsYXNzbmFtZSA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgY2xhc3NuYW1lKQotICB7Ci0gICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLSAgewotICAgIHJldHVybiB0aGlzLmNsYXNzbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1Byb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDY1NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmFudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJvcGVydHkgc2V0IG9uIHRoZSBXU0RMIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5IGV4dGVuZHMgVGFzayAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgotICAgKiAKLSAgICogQHBhcmFtIG5hbWUKLSAgICogCQlUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiAJCVRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLQkgIAotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1VSSVJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1VSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjYyMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9VUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLQotLyoqCi0gKiBUaGUgVVJJUmVzb2x2ZXIgdGFzayBhbGxvd3Mgc3BlY2lmeWluZyBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyIHdpdGgKLSAqIHRoZSBXU0RMVmFsaWRhdGUgQW50IHRhc2suCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlciBleHRlbmRzIFRhc2sKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhenogPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhenopCi0gIHsKLSAgICB0aGlzLmNsYXp6ID0gY2xheno7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNsYXp6OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1dTRExWYWxpZGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9XU0RMVmFsaWRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0Zjc0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1dTRExWYWxpZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmFudDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EVERMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNsYXNzbG9hZGVyV1NETFZhbGlkYXRvckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5DbGFzc2xvYWRlcldTREwxMVZhbGlkYXRvckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRvckRlbGVnYXRlOwotCi0vKioKLSAqIEFuIEFudCB0YXNrIHRvIHJ1biBXU0RMIHZhbGlkYXRpb24gb24gYSBmaWxlIG9yIGEgc2V0IG9mIGZpbGVzLgotICogCi0gKiBPcHRpb25zCi0gKiAtIGZpbGUgLSB0aGUgZmlsZSB0byBydW4gdmFsaWRhdGlvbiBvbiAob3B0aW9uYWwgaWYgZmlsZXNldCBpcyB1c2VkKQotICogLSBmYWlsb25lcnJvciAtIGZhaWwgdGhlIGJ1aWxkIHByb2Nlc3Mgb24gdGhlIGZpcnN0IGZpbGUgd2l0aCBhbiBlcnJvcgotICogCi0gKiBTdXBwb3J0ZWQgTmVzdGVkIEVsZW1lbnRzCi0gKiAtIHhtbGNhdGFsb2cgLSBhbiB4bWwgY2F0YWxvZwotICogLSBkdGQgICAgICAgIC0gYSBkdGQgc3BlY2lmaWNhdGlvbiBhcyB3b3VsZCBhcHBlYXIgaW4gYW4geG1sY2F0YWxvZwotICogLSBzY2hlbWEgICAgIC0gYSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBhcyB3b3VsZCBhcHBlYXIgaW4gYW4geG1sY2F0YWxvZwotICogLSBlbnRpdHkgICAgIC0gYW4gZW50aXR5IHNwZWNpZmljYXRpb24gYXMgd291bGQgYXBwZWFyIGluIGFuIHhtbGNhdGFsb2cKLSAqIC0gZmlsZXNldCAgICAtIGEgc2V0IG9mIGZpbGVzIHRvIHZhbGlkYXRlCi0gKiAtIHdzZGwxMXZhbGlkYXRvciAtIGFuIGV4dGVuc2lvbiBXU0RMIDEuMSB2YWxpZGF0b3IKLSAqIC0gdXJpcmVzb2x2ZXIgLSBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0ZSBleHRlbmRzIFRhc2sKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBVSV9QUk9QRVJUSUVTID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfUFJPUEVSVElFUyA9IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uc3RhbnRzLldTRExfVkFMSURBVE9SX1BST1BFUlRJRVNfRklMRTsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fRklMRV9TUEVDSUZJRUQgPSAiX0VSUk9SX05PX0ZJTEVfU1BFQ0lGSUVEIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSID0gIl9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9BQ1RJT05fVkFMSURBVElOR19GSUxFID0gIl9VSV9BQ1RJT05fVkFMSURBVElOR19GSUxFIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfVUlfRVJST1JfTUFSS0VSID0gIl9VSV9FUlJPUl9NQVJLRVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9XQVJOSU5HX01BUktFUiA9ICJfVUlfV0FSTklOR19NQVJLRVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9WQUxJRCA9ICJfVUlfVkFMSUQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9JTlZBTElEID0gIl9VSV9JTlZBTElEIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVhDX1VOQUJMRV9UT19WQUxJREFURV9GSUxFID0gIl9FWENfVU5BQkxFX1RPX1ZBTElEQVRFX0ZJTEUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FWENfV1NETF9GQUlMX09OX0VSUk9SID0gIl9FWENfV1NETF9GQUlMX09OX0VSUk9SIjsKLSAgCi0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vLyI7Ci0KLSAgLy8gR2xvYmFsIFZhcnMKLSAgcHJvdGVjdGVkIExpc3QgZmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBQYXRoIGNsYXNzcGF0aDsKLSAgcHJvdGVjdGVkIFN0cmluZyB4c2REaXJlY3RvcnkgPSBudWxsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOwotICBwcm90ZWN0ZWQgWE1MQ2F0YWxvZyBnbG9iYWxYTUxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2coKTsKLSAgcHJvdGVjdGVkIExpc3Qgd3NkbDExdmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIExpc3QgZXh0dmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIExpc3QgZXh0VVJJUmVzb2x2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgTGlzdCBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBDb25zdHVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0ZSgpCi0gIHsKLQlMb2dnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuc2V0TG9nZ2VyKG5ldyBBbnRMb2dnZXIodGhpcykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlbGxzIHRoZSBXU0RMIHZhbGlkYXRlIHRhc2sgdG8gZmFpbCB0aGUgYnVpbGQgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZmFpbE9uRXJyb3IgV2hldGhlciB0byBmYWlsIG9uIGVycm9yIG9yIG5vdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gZmFpbE9uRXJyb3IpCi0gIHsKLSAgICB0aGlzLmZhaWxPbkVycm9yID0gZmFpbE9uRXJyb3I7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGJhc2Ugc2NoZW1hIGZpbGVzIGZvciB0aGUgY2F0YWxvZyBhcmUgbG9jYXRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBkaXIgLSB0aGUgZGlyZWN0b3J5IG9mIHRoZSBiYXNlIHNjaGVtYSBmaWxlcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hRGlyKFN0cmluZyBkaXIpCi0gIHsKLSAgICB4c2REaXJlY3RvcnkgPSBkaXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGEgZmlsZSB0byBydW4gV1NETCB2YWxpZGF0aW9uIG9uLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgLSBhIGZpbGUgdG8gcnVuIHZhbGlkYXRpb24gb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpCi0gIHsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIHNldCBvZiBmaWxlcyB0byBydW4gV1NETCB2YWxpZGF0aW9uIG9uLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgRmlsZVNldCBvZiBmaWxlcyB0byBydW4gV1NETCB2YWxpZGF0aW9uIG9uCi0gICAqLwotICBwdWJsaWMgRmlsZVNldCBjcmVhdGVGaWxlc2V0KCkKLSAgewotICAgIEZpbGVTZXQgZmlsZXNldCA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgZmlsZXNldHMuYWRkKGZpbGVzZXQpOwotICAgIHJldHVybiBmaWxlc2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBYTUwgY2F0YWxvZyB0byB0aGUgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGNhdGFsb2cgLSB0aGUgY2F0YWxvZyB0byBhZGQgdG8gdGhlIHZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFhNTENhdGFsb2coWE1MQ2F0YWxvZyBjYXRhbG9nKQotICB7Ci0gICAgZ2xvYmFsWE1MQ2F0YWxvZy5hZGRDb25maWd1cmVkWE1MQ2F0YWxvZyhjYXRhbG9nKTsKLSAgfQotICAvKioKLSAgICogQWRkIGFuIGV4dGVuc2lvbiB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gZXh0VmFsIFRoZSBleHRlbnNpb24gdmFsaWRhdG9yIHRvIGFkZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRFeHRlbnNpb25WYWxpZGF0b3IoRXh0ZW5zaW9uVmFsaWRhdG9yIGV4dFZhbCkKLSAgewotICAgIGV4dHZhbGlkYXRvcnMuYWRkKGV4dFZhbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYW4gZXh0ZW5zaW9uIFdTREwgMS4xIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBleHRWYWwgVGhlIGV4dGVuc2lvbiBXU0RMIDEuMSB2YWxpZGF0b3IgdG8gYWRkLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFdTREwxMVZhbGlkYXRvcihFeHRlbnNpb25WYWxpZGF0b3IgZXh0VmFsKQotICB7Ci0gICAgd3NkbDExdmFsaWRhdG9ycy5hZGQoZXh0VmFsKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbGxvdyBzcGVjaWZpY2F0aW9uIG9mIGFuIGVudGl0eSBvdXRzaWRlIG9mIGFuIFhNTENhdGFsb2cuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgRFRETG9jYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGVudGl0eQotICAgKiovCi0gIHB1YmxpYyBEVERMb2NhdGlvbiBjcmVhdGVFbnRpdHkoKQotICB7Ci0gICAgRFRETG9jYXRpb24gZHRkTG9jID0gbmV3IERURExvY2F0aW9uKCk7Ci0gICAgZ2xvYmFsWE1MQ2F0YWxvZy5hZGRFbnRpdHkoZHRkTG9jKTsKLSAgICByZXR1cm4gZHRkTG9jOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG93IHNwZWNpZmljYXRpb24gb2YgYSBEVEQgb3V0c2lkZSBvZiBhbiBYTUxDYXRhbG9nLgotICAgKiAKLSAgICogQHJldHVybiBhIERURExvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBEVEQKLSAgICoqLwotICBwdWJsaWMgRFRETG9jYXRpb24gY3JlYXRlRFREKCkKLSAgewotICAgIERURExvY2F0aW9uIGR0ZExvYyA9IG5ldyBEVERMb2NhdGlvbigpOwotICAgIGdsb2JhbFhNTENhdGFsb2cuYWRkRW50aXR5KGR0ZExvYyk7Ci0gICAgcmV0dXJuIGR0ZExvYzsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIFVSSVJlc29sdmVyIGV4dGVuc2lvbi4KLSAgICogCi0gICAqIEByZXR1cm4gQSBVUklSZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlciBjcmVhdGVVUklSZXNvbHZlcigpCi0gIHsKLSAgICBVUklSZXNvbHZlciB1cmlyZXMgPSBuZXcgVVJJUmVzb2x2ZXIoKTsKLSAgICBleHRVUklSZXNvbHZlcnMuYWRkKHVyaXJlcy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgcmV0dXJuIHVyaXJlczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIHByb3BlcnR5IHRvIHRoZSBXU0RMIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSAKLSAgICogCQlUaGUgcHJvcGVydHkgdG8gYWRkLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFByb3BlcnR5KFByb3BlcnR5IHByb3BlcnR5KQotICB7Ci0gICAgcHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyB0byBydW4gV1NETCB2YWxpZGF0aW9uIG9uLiBUYWtlcyB0aGUgZmlsZSBhbmQgZmlsZXNldAotICAgKiBhbmQgY3JlYXRlcyB0aGUgbGlzdC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgdmFsaWRhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBnZXRGaWxlTGlzdCgpCi0gIHsKLSAgICBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy8gaWYgYSBzcGVjaWZpYyBmaWxlIHdhcyBzcGVjaWZpZWQgYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoZmlsZSk7Ci0gICAgICAgIGZpbGVzLmFkZCh1cmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgRmlsZSB0aGVGaWxlID0gbmV3IEZpbGUoZmlsZSk7Ci0gICAgICAgIGlmKCF0aGVGaWxlLmlzQWJzb2x1dGUoKSkKLSAgICAgICAgewotICAgICAgICAgIHRoZUZpbGUgPSBuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBmaWxlKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgYWJzRmlsZSA9IHRoZUZpbGUudG9TdHJpbmcoKTsgCi0gICAgICAgIGlmKCFhYnNGaWxlLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0gICAgICAgIHsKLSAgICAgICAgICBhYnNGaWxlID0gRklMRV9QUk9UT0NPTCArIGFic0ZpbGU7Ci0gICAgICAgIH0KLSAgICAgICAgYWJzRmlsZSA9IGFic0ZpbGUucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgICAgIGZpbGVzLmFkZChhYnNGaWxlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBnbyB0aHJvdWdoIGFsbCBmaWxlc2V0cyBzcGVjaWZpZWQgYW5kIGFkZCBhbGwgdGhlIGZpbGVzIHRvIHRoZSBsaXN0Ci0gICAgSXRlcmF0b3IgZnNJdGVyID0gZmlsZXNldHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZnNJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBGaWxlU2V0IGZpbGVzZXQgPSAoRmlsZVNldClmc0l0ZXIubmV4dCgpOwotICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZpbGVzZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihmaWxlc2V0LmdldFByb2plY3QoKSk7Ci0gICAgICBTdHJpbmcgYmFzZWRpciA9IGRzLmdldEJhc2VkaXIoKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3I7Ci0KLSAgICAgIFN0cmluZ1tdIGZpbGVsaXN0ID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgaW50IG51bUZpbGVzID0gZmlsZWxpc3QubGVuZ3RoOwotICAgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgbnVtRmlsZXMgPiAwKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZpbGVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYWJzRmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBiYXNlZGlyICsgZmlsZWxpc3RbaV07Ci0gICAgICAgICAgYWJzRmlsZSA9IGFic0ZpbGUucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgICAgICAgZmlsZXMuYWRkKGFic0ZpbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWxlczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gdGhlIHJlc291cmNlIGJ1bmRsZXMgZm9yIHRoZSB1aSBhbmQgdmFsaWRhdG9yIGFyZSBuZWVkZWQKLSAgICBNZXNzYWdlR2VuZXJhdG9yIG1lc3NHZW4gPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlQnVuZGxlIHVpUkIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVUlfUFJPUEVSVElFUyk7Ci0gICAgICBtZXNzR2VuID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IodWlSQik7Ci0gICAgfQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBpZiB0aGUgcmVzb3VyY2UgYnVuZGxlcyBjYW4ndCBiZSBvcGVuZWQgd2UgY2FuJ3QgcmVwb3J0IGVycm9yIHNvIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gb3BlbiByZXNvdXJjZSBidW5kbGUuICIgKyBlKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIFhNTCBjYXRhbG9nLgotICAgIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cuc2V0RXh0ZW5zaW9uWE1MQ2F0YWxvZyhYTUxDYXRhbG9nSW1wbC5jbGFzcy5nZXROYW1lKCksIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgWE1MQ2F0YWxvZ0ltcGwgeG1sQ2F0YWxvZyA9IChYTUxDYXRhbG9nSW1wbClvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nLmdldEV4dGVuc2lvbkNhdGFsb2dJbnN0YW5jZSgpOwotICAgIHhtbENhdGFsb2cuYWRkWE1MQ2F0YWxvZyhnbG9iYWxYTUxDYXRhbG9nKTsKLSAgICAKLSAgICBXU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3IgPSBuZXcgV1NETFZhbGlkYXRvcigpOwotICAgIAotICAgIFdTRExWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFdTRExWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpOwotICAgIC8vIFNldCB0aGUgcHJvcGVydGllcy4KLSAgICBJdGVyYXRvciBwcm9wZXJ0eUl0ZXIgPSBwcm9wZXJ0aWVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUocHJvcGVydHlJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSlwcm9wZXJ0eUl0ZXIubmV4dCgpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgICAJCi0gICAgLy8gU2V0IHRoZSBleHRlbnNpb24gVVJJUmVzb2x2ZXJzLgotICAgIEl0ZXJhdG9yIHJlc29sdmVyc0l0ZXIgPSBleHRVUklSZXNvbHZlcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZShyZXNvbHZlcnNJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzb2x2ZXJDbGFzcyA9IChTdHJpbmcpcmVzb2x2ZXJzSXRlci5uZXh0KCk7Ci0gICAgICB3c2RsVmFsaWRhdG9yLmFkZFVSSVJlc29sdmVyKG5ldyBVUklSZXNvbHZlckRlbGVnYXRlKHJlc29sdmVyQ2xhc3MsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuZ2V0VVJJUmVzb2x2ZXIoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB0byB2YWxpZGF0ZS4KLSAgICBMaXN0IGZpbGVzID0gZ2V0RmlsZUxpc3QoKTsKLSAgICAKLSAgICAvLyBSZWdpc3RlciB0aGUgV1NETCAxLjEgZXh0ZW5zaW9uIHZhbGlkYXRvcnMuCi0gICAgSXRlcmF0b3Igd3NkbDExZXh0SXRlciA9IHdzZGwxMXZhbGlkYXRvcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSh3c2RsMTFleHRJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpb25WYWxpZGF0b3IgZXh0VmFsID0gKEV4dGVuc2lvblZhbGlkYXRvcil3c2RsMTFleHRJdGVyLm5leHQoKTsKLSAgICAgIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IENsYXNzbG9hZGVyV1NETDExVmFsaWRhdG9yRGVsZWdhdGUoZXh0VmFsLmdldENsYXNzTmFtZSgpKTsKLSAgICAgIHdzZGxWYWxpZGF0b3IucmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoZXh0VmFsLmdldE5hbWVzcGFjZSgpLCBkZWxlZ2F0ZSk7Ci0gICAgfQotICAgIAotICAgIC8vIFJlZ2lzdGVyIHRoZSBleHRlbnNpb24gdmFsaWRhdG9ycy4KLSAgICBJdGVyYXRvciBleHRJdGVyID0gZXh0dmFsaWRhdG9ycy5pdGVyYXRvcigpOwotICAgIHdoaWxlKGV4dEl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2lvblZhbGlkYXRvciBleHRWYWwgPSAoRXh0ZW5zaW9uVmFsaWRhdG9yKWV4dEl0ZXIubmV4dCgpOwotICAgICAgQ2xhc3Nsb2FkZXJXU0RMVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgQ2xhc3Nsb2FkZXJXU0RMVmFsaWRhdG9yRGVsZWdhdGUoZXh0VmFsLmdldENsYXNzTmFtZSgpKTsKLSAgICAgIHdzZGxWYWxpZGF0b3IucmVnaXN0ZXJXU0RMRXh0ZW5zaW9uVmFsaWRhdG9yKGV4dFZhbC5nZXROYW1lc3BhY2UoKSwgZGVsZWdhdGUpOwotICAgIH0KLQotICAgIC8vIFRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGFueSBmaWxlcyB0byB2YWxpZGF0ZS4KLSAgICBpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgbG9nKG1lc3NHZW4uZ2V0U3RyaW5nKF9FUlJPUl9OT19GSUxFX1NQRUNJRklFRCksIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHhzZERpcmVjdG9yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cuYWRkU2NoZW1hRGlyKHhzZERpcmVjdG9yeSk7Ci0gICAgfQotCi0gICAgLy8gVmFsaWRhdGUgYWxsIHRoZSBmaWxlcyBzcGVjaWZpZWQuCi0gICAgSXRlcmF0b3IgaUZpbGVzID0gZmlsZXMuaXRlcmF0b3IoKTsKLQotICAgIC8vIENvbW1vbiBzdHJpbmdzIG5lZWRlZCBpbiB2YWxpZGF0aW9uIG91dHB1dC4KLSAgICBTdHJpbmcgaW5mb0RlbGltID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUik7Ci0gICAgU3RyaW5nIHZhbGlkID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX1ZBTElEKTsKLSAgICBTdHJpbmcgaW52YWxpZCA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9JTlZBTElEKTsKLSAgICBTdHJpbmcgZXJyb3JtYXJrZXIgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfRVJST1JfTUFSS0VSKTsKLSAgICBTdHJpbmcgd2FybmluZ21hcmtlciA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9XQVJOSU5HX01BUktFUik7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbnVsbDsKLSAgICBib29sZWFuIG5vdHZhbGlkID0gdHJ1ZTsKLSAgICB3aGlsZSAoaUZpbGVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBub3R2YWxpZCA9IGZhbHNlOwotICAgICAgU3RyaW5nIGZpbGVuYW1lID0gKFN0cmluZylpRmlsZXMubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaW5mb0RlbGltKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobWVzc0dlbi5nZXRTdHJpbmcoX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUsIGZpbGVuYW1lKSkuYXBwZW5kKCIgLSAiKTsKLQotICAgICAgICBJVmFsaWRhdGlvblJlcG9ydCB2YWxSZXBvcnQgPSB3c2RsVmFsaWRhdG9yLnZhbGlkYXRlKGZpbGVuYW1lLCBudWxsLCBjb25maWd1cmF0aW9uKTsKLQotICAgICAgICBJVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcyA9IHZhbFJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLQotICAgICAgICBpZiAoIXZhbFJlcG9ydC5oYXNFcnJvcnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQodmFsaWQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW52YWxpZCk7Ci0gICAgICAgICAgbm90dmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIikuYXBwZW5kKGluZm9EZWxpbSkuYXBwZW5kKCJcbiIpOwotCi0gICAgICAgIHJlc3VsdC5hcHBlbmQocmVwb3J0TWVzc2FnZXMobWVzc2FnZXMsIGVycm9ybWFya2VyLCB3YXJuaW5nbWFya2VyKSk7Ci0KLSAgICAgICAgaWYobm90dmFsaWQpCi0gICAgICAgIHsKLSAgICAgICAgICBsb2cocmVzdWx0LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbG9nKHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBsb2cobWVzc0dlbi5nZXRTdHJpbmcoX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfRklMRSwgZmlsZW5hbWUsIGUpLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBpZiAobm90dmFsaWQgJiYgZmFpbE9uRXJyb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBUbyBmYWlsIG9uIGVycm9yLCB0aHJvdyBhIGJ1aWxkIGV4Y2VwdGlvbi4KLSAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc0dlbi5nZXRTdHJpbmcoX0VYQ19XU0RMX0ZBSUxfT05fRVJST1IpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cucmVzZXQoKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIHN0cmluZyB3aXRoIGZvcm1hdHRlZCBvdXRwdXQgZm9yIHRoZSBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gcmVwb3J0LgotICAgKiBAcGFyYW0gZXJyb3JtYXJrZXIgVGhlIG1hcmtlciB0byB1c2UgZm9yIGVycm9yIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gd2FybmluZ21hcmtlciBUaGUgbWFya2VyIHRvIHVzZSBmb3Igd2FybmluZyBtZXNzYWdlcy4KLSAgICogQHJldHVybiBBIHN0cmluZyB3aXRoIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXBvcnRNZXNzYWdlcyhJVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcywgU3RyaW5nIGVycm9ybWFya2VyLCBTdHJpbmcgd2FybmluZ21hcmtlcikKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXR1cm5CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBpZiAobWVzc2FnZXMgPT0gbnVsbCkKLSAgICAgIHJldHVybiByZXR1cm5CdWZmZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIGludCBudW1NZXNzYWdlcyA9IG1lc3NhZ2VzLmxlbmd0aDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtTWVzc2FnZXM7IGkrKykKLSAgICB7Ci0gICAgICBJVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldOwotCi0gICAgICBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gd2FybmluZ21hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgfWlmKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0VSUk9SKQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gZXJyb3JtYXJrZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSB3YXJuaW5nbWFya2VyOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICB9aWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfRVJST1IpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSBlcnJvcm1hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IHdhcm5pbmdtYXJrZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgIH1pZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gd2FybmluZ21hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgfQotICAgICAgcmV0dXJuQnVmZmVyCi0gICAgICAgIC5hcHBlbmQocHJlZml4KQotICAgICAgICAuYXBwZW5kKCIgIikKLSAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldExpbmUoKSkKLSAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgIC5hcHBlbmQobWVzc2FnZS5nZXRDb2x1bW4oKSkKLSAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgIC5hcHBlbmQobWVzc2FnZS5nZXRNZXNzYWdlKCkpCi0gICAgICAgIC5hcHBlbmQoIlxuIik7Ci0gICAgfQotICAgIHJldHVybiByZXR1cm5CdWZmZXIudG9TdHJpbmcoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvWE1MQ2F0YWxvZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvWE1MQ2F0YWxvZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3NjJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1hNTENhdGFsb2dJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EVERMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXU0RMIFZhbGlkYXRvcidzIFhNTCBDYXRhbG9nIHRoYXQgdXNlcyB0aGUgWE1MIENhdGFsb2cKLSAqIGZyb20gYW50LgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0ltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nCi17Ci0gIHByb3RlY3RlZCBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSBuZXcgWE1MQ2F0YWxvZygpOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cjYWRkRW50cnlUb0NhdGFsb2coamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVudHJ5VG9DYXRhbG9nKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgRFRETG9jYXRpb24gcmVzTG9jID0gbmV3IERURExvY2F0aW9uKCk7Ci0gICAgcmVzTG9jLnNldExvY2F0aW9uKHN5c3RlbUlkKTsKLSAgICByZXNMb2Muc2V0UHVibGljSWQocHVibGljSWQpOwotICAgIHhtbENhdGFsb2cuYWRkRW50aXR5KHJlc0xvYyk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nI3Jlc29sdmVFbnRpdHlMb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyByZXNvbHZlRW50aXR5TG9jYXRpb24oU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRJZCA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFNvdXJjZSBpcyA9IHhtbENhdGFsb2cucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkSWQgPSBpcy5nZXRTeXN0ZW1JZCgpOwotICAgICAgfQotICAgIH0KLSAgICAvLyAKLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgcmVzb3VyY2UgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0gICAgfQotICAgIC8vIG5lZWRzIHRvIHJldHVybiBudWxsIGlmIGl0IGNhbid0IHJlc29sdmUgdGhlIGlkCi0gICAgaWYgKHJlc29sdmVkSWQgIT0gbnVsbCAmJiByZXNvbHZlZElkLmVxdWFscygiIikpCi0gICAgewotICAgICAgcmVzb2x2ZWRJZCA9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlZElkOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGNvbmZpZ3VyZWQgWE1MIENhdGFsb2cgdG8gdGhpcyBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIGNhdGFsb2cgQSBjb25maWd1cmVkIFhNTCBjYXRhbG9nIHRvIGFkZCB0byB0aGlzIGNhdGFsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRYTUxDYXRhbG9nKFhNTENhdGFsb2cgY2F0YWxvZykKLSAgewotICAgIHhtbENhdGFsb2cuYWRkQ29uZmlndXJlZFhNTENhdGFsb2coY2F0YWxvZyk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvTG9nNGpMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS90ZXh0L0xvZzRqTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YTIyNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvTG9nNGpMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkudGV4dDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXI7Ci0KLS8qKgotICogQSBjdXN0b20gV1NETCB2YWxpZGF0b3IgbG9nZ2VyIHRoYXQgcGFzc2VzIGxvZ2dpbmcgZXZlbnRzIHRvIGxvZzRqLgotICovCi1wdWJsaWMgY2xhc3MgTG9nNGpMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIAotewotICAvLyBUaGlzIGNsYXNzIGlzIGltcGxlbWVudGVkIHVzaW5nIHJlZmxlY3Rpb24gdG8gYXZvaWQgYSBjb21pbGF0aW9uIGRlcGVuZGVuY3kKLSAgLy8gb24gbG9nNGouCi0gIHByb3RlY3RlZCBPYmplY3QgbG9nZ2VyID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1ldGhvZCBlcnJvcjEgPSBudWxsOwotICBwcm90ZWN0ZWQgTWV0aG9kIHdhcm4xID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1ldGhvZCBpbmZvMSA9IG51bGw7Ci0gIHByb3RlY3RlZCBNZXRob2QgZGVidWcxID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1ldGhvZCBlcnJvcjIgPSBudWxsOwotICBwcm90ZWN0ZWQgTWV0aG9kIHdhcm4yID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1ldGhvZCBpbmZvMiA9IG51bGw7Ci0gIHByb3RlY3RlZCBNZXRob2QgZGVidWcyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBMb2c0akxvZ2dlcigpCi0gIHsKLQl0cnkKLSAgICB7Ci0JICBDbGFzcyBsb2dnZXJDbGFzcyA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUubG9nNGouTG9nZ2VyIik7Ci0JICBDbGFzcyBjYXRlZ29yeUNsYXNzID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygib3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeSIpOwotCSAgTWV0aG9kIGdldExvZ2dlciA9IGxvZ2dlckNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRMb2dnZXIiICwgbmV3IENsYXNzW117Q2xhc3MuY2xhc3N9KTsKLQkgIGxvZ2dlciA9IGdldExvZ2dlci5pbnZva2UobG9nZ2VyQ2xhc3MsIG5ldyBPYmplY3RbXXtXU0RMVmFsaWRhdGUuY2xhc3N9KTsKLQkgIGVycm9yMSA9IGNhdGVnb3J5Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImVycm9yIiAsIG5ldyBDbGFzc1tde09iamVjdC5jbGFzc30pOwotCSAgd2FybjEgPSBjYXRlZ29yeUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJ3YXJuIiAsIG5ldyBDbGFzc1tde09iamVjdC5jbGFzc30pOwotCSAgaW5mbzEgPSBjYXRlZ29yeUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJpbmZvIiAsIG5ldyBDbGFzc1tde09iamVjdC5jbGFzc30pOwotCSAgZGVidWcxID0gY2F0ZWdvcnlDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZGVidWciICwgbmV3IENsYXNzW117T2JqZWN0LmNsYXNzfSk7Ci0JICBlcnJvcjIgPSBjYXRlZ29yeUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJlcnJvciIgLCBuZXcgQ2xhc3NbXXtPYmplY3QuY2xhc3MsIFRocm93YWJsZS5jbGFzc30pOwotCSAgd2FybjIgPSBjYXRlZ29yeUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJ3YXJuIiAsIG5ldyBDbGFzc1tde09iamVjdC5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfSk7Ci0JICBpbmZvMiA9IGNhdGVnb3J5Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImluZm8iICwgbmV3IENsYXNzW117T2JqZWN0LmNsYXNzLCBUaHJvd2FibGUuY2xhc3N9KTsKLQkgIGRlYnVnMiA9IGNhdGVnb3J5Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlYnVnIiAsIG5ldyBDbGFzc1tde09iamVjdC5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfSk7Ci0JfQotCWNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLQl7Ci0JICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuYWJsZSB0byBjcmVhdGUgTG9nNGogTG9nZ2VyLiBFbnN1cmUgTG9nNEogaXMgb24gdGhlIGNsYXNzcGF0aC4iKTsgCi0JfQotCWNhdGNoKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotCXsKLQkJCi0JfQotCWNhdGNoKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLQl7Ci0JCQotCX0KLQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0JewotCQkKLQl9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlciNsb2coamF2YS5sYW5nLlN0cmluZywgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHkpIAotICB7Ci0JaWYobG9nZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmKHNldmVyaXR5ID09IElMb2dnZXIuU0VWX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IxLmludm9rZShsb2dnZXIsIG5ldyBPYmplY3RbXXttZXNzYWdlfSk7Ci0JCX0KLSAgICAgICAgZWxzZSBpZihzZXZlcml0eSA9PSBJTG9nZ2VyLlNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgd2FybjEuaW52b2tlKGxvZ2dlciwgbmV3IE9iamVjdFtde21lc3NhZ2V9KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHNldmVyaXR5ID09IElMb2dnZXIuU0VWX0lORk8pCi0gICAgICAgIHsKLSAgICAgICAgICBpbmZvMS5pbnZva2UobG9nZ2VyLCBuZXcgT2JqZWN0W117bWVzc2FnZX0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoc2V2ZXJpdHkgPT0gSUxvZ2dlci5TRVZfVkVSQk9TRSkKLSAgICAgICAgewotICAgICAgICAgIGRlYnVnMS5pbnZva2UobG9nZ2VyLCBuZXcgT2JqZWN0W117bWVzc2FnZX0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgICB9Ci0gICAgICBjYXRjaChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLlRocm93YWJsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBUaHJvd2FibGUgdGhyb3dhYmxlKSAKLSAgewotCWlmKGxvZ2dlciAhPSBudWxsKQotCXsKLQkgIHRyeQotCSAgewotCSAgICBpZihzZXZlcml0eSA9PSBJTG9nZ2VyLlNFVl9FUlJPUikKLQkgICAgewotCQkgIGVycm9yMi5pbnZva2UobG9nZ2VyLCBuZXcgT2JqZWN0W117bWVzc2FnZSwgdGhyb3dhYmxlfSk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZihzZXZlcml0eSA9PSBJTG9nZ2VyLlNFVl9XQVJOSU5HKQotCSAgICB7Ci0JCSAgd2FybjIuaW52b2tlKGxvZ2dlciwgbmV3IE9iamVjdFtde21lc3NhZ2UsIHRocm93YWJsZX0pOwotCSAgICB9Ci0JICAgIGVsc2UgaWYoc2V2ZXJpdHkgPT0gSUxvZ2dlci5TRVZfSU5GTykKLQkgICAgewotCQkgIGluZm8yLmludm9rZShsb2dnZXIsIG5ldyBPYmplY3RbXXttZXNzYWdlLCB0aHJvd2FibGV9KTsKLQkgICAgfQotCSAgICBlbHNlIGlmKHNldmVyaXR5ID09IElMb2dnZXIuU0VWX1ZFUkJPU0UpCi0JICAgIHsKLQkgICAgICBkZWJ1ZzIuaW52b2tlKGxvZ2dlciwgbmV3IE9iamVjdFtde21lc3NhZ2UsIHRocm93YWJsZX0pOwotCSAgICB9Ci0JICB9Ci0JICBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0JICB7Ci0JCS8vIERvIG5vdGhpbmcuCi0JICB9Ci0JICBjYXRjaChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0JICB7Ci0JCS8vIERvIG5vdGhpbmcuICAKLQkgIH0KLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS90ZXh0L1dTRExWYWxpZGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvV1NETFZhbGlkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NTdiZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvV1NETFZhbGlkYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkudGV4dDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNsYXNzbG9hZGVyV1NETFZhbGlkYXRvckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZy5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5DbGFzc2xvYWRlcldTREwxMVZhbGlkYXRvckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRvckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIEEgY29tbWFuZGUgbGluZSB0b29sIHRvIHJ1biBXU0RMIFZhbGlkYXRpb24gb24gYSBzaW5nbGUgb3IgbXVsdGlwbGUgZmlsZXMuCi0gKiAKLSAqIE9wdGlvbnMKLSAqIC1zY2hlbWFEaXIgZGlyZWN0b3J5ICAgICAgIDogYSBkaXJlY3Rvcnkgb2Ygc2NoZW1hcyB0byBsb2FkIGludG8gdGhlIGNhdGFsb2cKLSAqIC1zY2hlbWEgbmFtZXNwYWNlIGxvY2F0aW9uIDogYSBzY2hlbWEgdG8gbG9hZCBpbnRvIHRoZSByZWdpc3RyeQotICogLXdzZGwxMXYgY2xhc3NuYW1lIG5hbWVzcGFjZSByZXNvdXJjZWJ1bmRsZSA6IHJlZ2lzdGVyIGEgV1NETCAxLjEgZXh0ZW5zaW9uIHZhbGlkYXRvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBsb2FkIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIHdpdGggdGhlIGdpdmVuIHJlc291cmNlYnVuZGxlCi0gKiAtd3NpdiB2YWxpZGF0b3JDbGFzcyBuYW1lc3BhY2UgcHJvcGVydGllc2ZpbGUgOiByZWdpc3RlciBhIFdTLUkgdmFsaWRhdG9yCi0gKiAtdXJpcmVzb2x2ZXIgVVJJUmVzb2x2ZXJDbGFzcyA6IHJlZ2lzdGVyIGFuIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIKLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0ZQotewotICBwcml2YXRlIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWCA9ICJmaWxlOi8vLyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfUFJPUEVSVElFUyA9Ci0gICAgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25zdGFudHMuV1NETF9WQUxJREFUT1JfUFJPUEVSVElFU19GSUxFOwotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fV1NETDExVkFMID0gIi13c2RsMTF2IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRVhUVkFMID0gIi1leHR2IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0NIRU1BRElSID0gIi1zY2hlbWFEaXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TQ0hFTUEgPSAiLXNjaGVtYSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VSSVJFU09MVkVSID0gIi11cmlyZXNvbHZlciI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0xPR0dFUiA9ICItbG9nZ2VyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUFJPUEVSVFkgPSAiLUQiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9WRVJCT1NFID0gIi12ZXJib3NlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVkVSQk9TRV9TSE9SVCA9ICItdiI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0VNUFRZID0gIiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfU1BBQ0UgPSAiICI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfREFTSCA9ICItIjsKLSAgCi0gIFN0cmluZyB3b3JraW5nZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotICAKLSAgLy9wcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLSAgcHJvdGVjdGVkIFdTRExWYWxpZGF0b3Igd3NkbFZhbGlkYXRvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBXU0RMVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IHdzZGxGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotICBwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgdmFsaWRhdG9yUkIgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExWYWxpZGF0ZSgpCi0gIHsKLSAgCXdzZGxWYWxpZGF0b3IgPSBuZXcgV1NETFZhbGlkYXRvcigpOwotICAJY29uZmlndXJhdGlvbiA9IG5ldyBXU0RMVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLSAgCQotICAgIHRyeQotICAgIHsKLSAgICAgIHZhbGlkYXRvclJCID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFZBTElEQVRPUl9QUk9QRVJUSUVTKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2coIlZhbGlkYXRpb24gZmFpbGVkOiBVbmFibGUgdG8gbG9hZCB0aGUgV1NETCB2YWxpZGF0b3IgcHJvcGVydGllcyBmaWxlLiIsIElMb2dnZXIuU0VWX0VSUk9SLCBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZmlsZXMgc3BlY2lmaWVkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKQotICB7Ci0JSUxvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9nZ2VyKCk7Ci0JCi0JaW50IG51bUludmFsaWQgPSAwOwotCi0JSXRlcmF0b3IgZmlsZXNJdGVyID0gd3NkbEZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGZpbGVzSXRlci5oYXNOZXh0KCkpCi0JewotCSAgU3RyaW5nIHdzZGxGaWxlID0gKFN0cmluZylmaWxlc0l0ZXIubmV4dCgpOwotCSAgSVZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gdmFsaWRhdGVGaWxlKHdzZGxGaWxlKTsKLQotCSAgaWYodmFsUmVwb3J0Lmhhc0Vycm9ycygpKQotCSAgewotCSAgICBudW1JbnZhbGlkKys7Ci0JICAgIGxvZ2dlci5sb2coTWVzc2FnZUZvcm1hdC5mb3JtYXQoV1NETFZhbGlkYXRlVGV4dFVJTWVzc2FnZXMuX1VJX0ZJTEVfSU5WQUxJRCwgbmV3IE9iamVjdFtde3dzZGxGaWxlfSksIElMb2dnZXIuU0VWX0lORk8pOwotCSAgICAvL2xvZ2dlci5sb2coV1NETFZhbGlkYXRlVGV4dFVJTWVzc2FnZXMuX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUiwgSUxvZ2dlci5TRVZfRVJST1IpOwotCSAgICBsb2dnZXIubG9nKGdldE1lc3NhZ2VzKHZhbFJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKSksIElMb2dnZXIuU0VWX0lORk8pOwotCSAgfQotCSAgZWxzZSBpZih2ZXJib3NlKQotCSAgewotCSAgICBsb2dnZXIubG9nKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdTRExWYWxpZGF0ZVRleHRVSU1lc3NhZ2VzLl9VSV9GSUxFX1ZBTElELCBuZXcgT2JqZWN0W117d3NkbEZpbGV9KSwgSUxvZ2dlci5TRVZfVkVSQk9TRSk7Ci0JICB9Ci0JfQotICAgIAotICAgIC8vIExvZyB0aGUgc3VtbWFyeS4KLSAgICBsb2dnZXIubG9nKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdTRExWYWxpZGF0ZVRleHRVSU1lc3NhZ2VzLl9VSV9WQUxJREFUSU9OX1NVTU1BUlksIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcih3c2RsRmlsZXMuc2l6ZSgpKSwgbmV3IEludGVnZXIobnVtSW52YWxpZCl9KSwgSUxvZ2dlci5TRVZfSU5GTyk7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIFdTREwgdmFsaWRhdGlvbiBvbiBhIGdpdmVuIGZpbGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZW5hbWUgCi0gICAqIAkJVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgSVZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGVGaWxlKFN0cmluZyBmaWxlbmFtZSkKLSAgewkKLSAgICAvLyBSZXNvbHZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4KLSAgICBTdHJpbmcgZmlsZWxvY2F0aW9uID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgZmlsZVVSTCA9IFN0cmluZ1V0aWxzLmdldFVSTChuZXcgVVJMKEZJTEVfUFJFRklYICsgd29ya2luZ2RpciArICIvIiksIGZpbGVuYW1lKTsKLSAgICAgIGZpbGVsb2NhdGlvbiA9IGZpbGVVUkwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcuIFRoZSBXU0RMIHZhbGlkYXRvciB3aWxsIGhhbmRsZSB0aGUgZXJyb3IuCi0gICAgICAvL0xvZ2dlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2coTWVzc2FnZUZvcm1hdC5mb3JtYXQoV1NETFZhbGlkYXRlVGV4dFVJTWVzc2FnZXMuX0VSUk9SX1VOQUJMRV9UT19SRUFEX0ZJTEUsIG5ldyBPYmplY3RbXXtmaWxlbmFtZX0pLCBJTG9nZ2VyLlNFVl9FUlJPUik7Ci0gICAgfQotICAgIAotICAgIC8vIFJ1biB2YWxpZGF0aW9uIG9uIHRoZSBmaWxlLgotICAgIElWYWxpZGF0aW9uUmVwb3J0IHZhbFJlcG9ydCA9IHdzZGxWYWxpZGF0b3IudmFsaWRhdGUoZmlsZWxvY2F0aW9uLCBudWxsLCBjb25maWd1cmF0aW9uKTsKLSAgICByZXR1cm4gdmFsUmVwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBTdHJpbmcgd2l0aCBmb3JtYXR0ZWQgb3V0cHV0IGZvciBhIGxpc3Qgb2YgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZXMgCi0gICAqIAkJVGhlIG1lc3NhZ2VzIHRvIGdldC4KLSAgICogQHJldHVybiAKLSAgICogCQlBIHN0cmluZyB3aXRoIGEgZm9ybWF0dGVkIGxpc3Qgb2YgdGhlIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlcyhJVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBvdXRwdXRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKG1lc3NhZ2VzICE9IG51bGwpCi0gICAgewotICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBtZXNzYWdlcyB0aGF0IGxvb2tzIGxpa2UKLSAgICAgIC8vIEVSUk9SIDE6MSBFcnJvciBtZXNzYWdlIGNvbnRlbnQKLSAgICAgIGludCBudW1NZXNzYWdlcyA9IG1lc3NhZ2VzLmxlbmd0aDsKLSAgICAgIFN0cmluZyBtYXJrZXIgPSBudWxsOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1NZXNzYWdlczsgaSsrKQotICAgICAgewotICAgICAgICBJVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldOwotICAgICAgICBpbnQgc2V2ZXJpdHkgPSBtZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgICAgIGlmIChzZXZlcml0eSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgbWFya2VyID0gV1NETFZhbGlkYXRlVGV4dFVJTWVzc2FnZXMuX1VJX0VSUk9SX01BUktFUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZXZlcml0eSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXJrZXIgPSBXU0RMVmFsaWRhdGVUZXh0VUlNZXNzYWdlcy5fVUlfV0FSTklOR19NQVJLRVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWFya2VyID0gU1RSSU5HX0VNUFRZOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dEJ1ZmZlcgotICAgICAgICAgIC5hcHBlbmQobWFya2VyKQotICAgICAgICAgIC5hcHBlbmQoU1RSSU5HX1NQQUNFKQotICAgICAgICAgIC5hcHBlbmQobWVzc2FnZS5nZXRMaW5lKCkpCi0gICAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldENvbHVtbigpKQotICAgICAgICAgIC5hcHBlbmQoU1RSSU5HX1NQQUNFKQotICAgICAgICAgIC5hcHBlbmQobWVzc2FnZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICBpZihpICE9IG51bU1lc3NhZ2VzIC0xKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0cHV0QnVmZmVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0QnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGUgY29tbWFuZCBsaW5lIHRvb2wuIAotICAgKiBDaGVja3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIHJlZ2lzdGVycyB0aGUgZGVmYXVsdCB2YWxpZGF0b3JzIGFuZCBydW5zIHZhbGlkYXRpb24gb24gdGhlCi0gICAqIGxpc3Qgb2YgZmlsZXMuCi0gICAqIAotICAgKiBAcGFyYW0gYXJncyAtIHRoZSBhcmd1bWVudHMgdG8gdGhlIHZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIC8vIE5vIGFyZ3VtZW50cyBzcGVjaWZpZWQuIFByaW50IHVzYWdlLgotCWlmIChhcmdzLmxlbmd0aCA8IDEpCi0gICAgewotCSAgU3lzdGVtLmVyci5wcmludGxuKFdTRExWYWxpZGF0ZVRleHRVSU1lc3NhZ2VzLl9FUlJPUl9XUk9OR19BUkdVTUVOVFMpOwotCSAgU3lzdGVtLmV4aXQoMCk7Ci0JfQotCQotCVdTRExWYWxpZGF0ZSB3c2RsVmFsaWRhdGUgPSBuZXcgV1NETFZhbGlkYXRlKCk7Ci0Jd3NkbFZhbGlkYXRlLnBhcnNlQXJndW1lbnRzKGFyZ3MpOwotCXdzZGxWYWxpZGF0ZS52YWxpZGF0ZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgZm9yIHRoaXMgV1NETFZhbGlkYXRlIHRhc2sgYW5kCi0gICAqIGNvbmZpZ3VyZSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGFyZ3MKLSAgICogCQlUaGUgYXJndW1lbnRzIHNwZWNpZmllZCBmb3IgdGhpcyB0YXNrLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGFyc2VBcmd1bWVudHMoU3RyaW5nW10gYXJncykKLSAgewotCWludCBudW1hcmdzID0gYXJncy5sZW5ndGg7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWFyZ3M7IGkrKykKLQl7Ci0JICBTdHJpbmcgcGFyYW0gPSBhcmdzW2ldOwotCi0JICAvLyBSZWdpc3RlcmluZyBhbiBleHRlbnNpb24gdmFsaWRhdG9yIG9yIFdTREwgMS4xIGV4dGVuc2lvbiB2YWxpZGF0b3IuCi0JICBpZiAocGFyYW0uZXF1YWxzKFdTRExWYWxpZGF0ZS5QQVJBTV9XU0RMMTFWQUwpIAotCQkJICB8fCBwYXJhbS5lcXVhbHMoV1NETFZhbGlkYXRlLlBBUkFNX0VYVFZBTCkpCi0JICB7Ci0JICAgIFN0cmluZyBuYW1lc3BhY2UgPSBhcmdzWysraV07Ci0JICAgIGlmICghbmFtZXNwYWNlLnN0YXJ0c1dpdGgoV1NETFZhbGlkYXRlLlNUUklOR19EQVNIKSkKLQkgICAgewotCSAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IGFyZ3NbKytpXTsKLQotCSAgICAgIGlmICghdmFsaWRhdG9yQ2xhc3Muc3RhcnRzV2l0aChXU0RMVmFsaWRhdGUuU1RSSU5HX0RBU0gpKQotCSAgICAgIHsKLQkgICAgICAgIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoV1NETFZhbGlkYXRlLlBBUkFNX1dTREwxMVZBTCkpCi0JICAgICAgICB7ICAKLQkgICAgICAgICAgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgQ2xhc3Nsb2FkZXJXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzcyk7Ci0JICAgICAgICAgIHdzZGxWYWxpZGF0b3IucmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoV1NETFZhbGlkYXRlLlBBUkFNX0VYVFZBTCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIENsYXNzbG9hZGVyV1NETFZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IENsYXNzbG9hZGVyV1NETFZhbGlkYXRvckRlbGVnYXRlKHZhbGlkYXRvckNsYXNzKTsKLQkgICAgICAgICAgd3NkbFZhbGlkYXRvci5yZWdpc3RlcldTRExFeHRlbnNpb25WYWxpZGF0b3IobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICAgIGVsc2UKLQkgICAgICB7Ci0JICAgICAgICBpLS07Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgIGktLTsKLQkgICAgfSAgCi0JICB9Ci0JICAvLyBSZWdpc3RlciBhIGRpcmVjdG9yeSB3aXRoIHNjaGVtYXMuCi0JICBlbHNlIGlmIChwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKFdTRExWYWxpZGF0ZS5QQVJBTV9TQ0hFTUFESVIpKQotCSAgewotCSAgICBTdHJpbmcgeHNkRGlyID0gYXJnc1srK2ldOwotCSAgICBYTUxDYXRhbG9nLmFkZFNjaGVtYURpcih4c2REaXIpOwotCSAgfQotCSAgLy8gUmVnaXN0ZXIgYSBzY2hlbWEuCi0JICAvLyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aCBhbiBYTUwgY2F0YWxvZy4KLQkgIGVsc2UgaWYgKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoV1NETFZhbGlkYXRlLlBBUkFNX1NDSEVNQSkpCi0JICB7Ci0JICAgIFN0cmluZyBwdWJsaWNpZCA9IGFyZ3NbKytpXTsKLQkgICAgU3RyaW5nIHN5c3RlbWlkID0gYXJnc1srK2ldOwotCSAgICBYTUxDYXRhbG9nLmFkZEVudGl0eShuZXcgWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcihwdWJsaWNpZCwgc3lzdGVtaWQpKTsKLQkgIH0KLQkgIC8vIFJlZ2lzdGVyIGEgVVJJIHJlc29sdmVyLiAKLQkgIC8vIFRPRE86IERldGVybWluZSBpZiB0aGlzIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgdGV4dCBVSS4KLQkgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShQQVJBTV9VUklSRVNPTFZFUikpCi0JICB7Ci0JICAgIFN0cmluZyByZXNvbHZlckNsYXNzID0gYXJnc1srK2ldOwotCSAgICB3c2RsVmFsaWRhdG9yLmFkZFVSSVJlc29sdmVyKG5ldyBVUklSZXNvbHZlckRlbGVnYXRlKHJlc29sdmVyQ2xhc3MsIG51bGwpLmdldFVSSVJlc29sdmVyKCkpOwotCSAgfQotCSAgLy8gQ29uZmlndXJlIHRoZSBsb2dnZXIuCi0JICBlbHNlIGlmKHBhcmFtLmVxdWFscyhQQVJBTV9MT0dHRVIpKQotCSAgewotCSAgICBTdHJpbmcgbG9nZ2VyQ2xhc3NTdHJpbmcgPSBhcmdzWysraV07Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgQ2xhc3MgbG9nZ2VyQ2xhc3MgPSBXU0RMVmFsaWRhdGUuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobG9nZ2VyQ2xhc3NTdHJpbmcpOwotCSAgICAgIElMb2dnZXIgbG9nZ2VyID0gKElMb2dnZXIpbG9nZ2VyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkgICAgICBMb2dnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuc2V0TG9nZ2VyKGxvZ2dlcik7Ci0JICAgIH0KLQkgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0JICAgIHsKLQkgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoV1NETFZhbGlkYXRlVGV4dFVJTWVzc2FnZXMuX0VSUk9SX0xPQURJTkdfTE9HR0VSLCBuZXcgT2JqZWN0W117bG9nZ2VyQ2xhc3NTdHJpbmd9KSk7Ci0JICAgIH0KLQkgIH0KLQkgIC8vIFNldCBwcm9wZXJ0aWVzLgotCSAgZWxzZSBpZihwYXJhbS5zdGFydHNXaXRoKFBBUkFNX1BST1BFUlRZKSkKLQkgIHsKLQkgICAgaW50IHNlcGFyYXRvciA9IHBhcmFtLmluZGV4T2YoJz0nKTsKLQkgICAgU3RyaW5nIG5hbWUgPSBwYXJhbS5zdWJzdHJpbmcoMiwgc2VwYXJhdG9yKTsKLQkgICAgU3RyaW5nIHZhbHVlID0gcGFyYW0uc3Vic3RyaW5nKHNlcGFyYXRvcisxKTsKLQkgICAgY29uZmlndXJhdGlvbi5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0JICB9Ci0JICAvLyBTZXQgdmVyYm9zZTsKLQkgIGVsc2UgaWYocGFyYW0uZXF1YWxzKFBBUkFNX1ZFUkJPU0UpIHx8IHBhcmFtLmVxdWFscyggUEFSQU1fVkVSQk9TRV9TSE9SVCkpCi0JICB7Ci0JCXZlcmJvc2UgPSB0cnVlOwotCSAgfQotCSAgLy8gYSBmaWxlIHRvIHZhbGlkYXRlCi0JICBlbHNlCi0JICB7Ci0JICAgIGlmKCFwYXJhbS5zdGFydHNXaXRoKFdTRExWYWxpZGF0ZS5TVFJJTkdfREFTSCkpCi0JICAgIHsgIAotCSAgICAgIHdzZGxGaWxlcy5hZGQocGFyYW0pOwotCSAgICB9Ci0JICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdGV4dC9XU0RMVmFsaWRhdGVUZXh0VUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvV1NETFZhbGlkYXRlVGV4dFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhYzhlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdGV4dC9XU0RMVmFsaWRhdGVUZXh0VUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgdGhlIFdTRExWYWxpZGF0ZSB0ZXh0IFVJLgotICogVGhpcyBjbGFzcyBtaW1pY3MgdGhlIGJlaGF2aW91ciBvZiB0aGUgT1NHSSBOTFMgY2xhc3MgZm9yIGNvbnZlbmllbmNlLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRlVGV4dFVJTWVzc2FnZXMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS50ZXh0LndzZGx2YWxpZGF0ZXRleHR1aSI7Ly8kTk9OLU5MUy0xJAotCi0JLy8gRXJyb3IgbWVzc2FnZXMuCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1dST05HX0FSR1VNRU5UUyA9ICJfRVJST1JfV1JPTkdfQVJHVU1FTlRTIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfTE9BRElOR19MT0dHRVIgPSAiX0VSUk9SX0xPQURJTkdfTE9HR0VSIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVU5BQkxFX1RPX1JFQURfRklMRSA9ICJfRVJST1JfVU5BQkxFX1RPX1JFQURfRklMRSI7Ci0JCi0JLy8gVmFsaWRhdGlvbiBtZXNzYWdlcy4KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSID0gIl9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX1ZBTElEID0gIl9VSV9GSUxFX1ZBTElEIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRV9JTlZBTElEID0gIl9VSV9GSUxFX0lOVkFMSUQiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9NQVJLRVIgPSAiX1VJX0VSUk9SX01BUktFUiI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTUFSS0VSID0gIl9VSV9XQVJOSU5HX01BUktFUiI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1ZBTElEQVRJT05fU1VNTUFSWSA9ICJfVUlfVkFMSURBVElPTl9TVU1NQVJZIjsKLQotCXN0YXRpYyAKLQl7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQlfRVJST1JfV1JPTkdfQVJHVU1FTlRTID0gYnVuZGxlLmdldFN0cmluZyhTdHJpbmcudmFsdWVPZihfRVJST1JfV1JPTkdfQVJHVU1FTlRTKSk7Ci0JCV9FUlJPUl9MT0FESU5HX0xPR0dFUiA9IGJ1bmRsZS5nZXRTdHJpbmcoX0VSUk9SX0xPQURJTkdfTE9HR0VSKTsKLQkJX0VSUk9SX1VOQUJMRV9UT19SRUFEX0ZJTEUgPSBidW5kbGUuZ2V0U3RyaW5nKF9FUlJPUl9VTkFCTEVfVE9fUkVBRF9GSUxFKTsKLQkJX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUiA9IGJ1bmRsZS5nZXRTdHJpbmcoX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUik7Ci0JCV9VSV9GSUxFX1ZBTElEID0gYnVuZGxlLmdldFN0cmluZyhfVUlfRklMRV9WQUxJRCk7Ci0JCV9VSV9GSUxFX0lOVkFMSUQgPSBidW5kbGUuZ2V0U3RyaW5nKF9VSV9GSUxFX0lOVkFMSUQpOwotCQlfVUlfRVJST1JfTUFSS0VSID0gYnVuZGxlLmdldFN0cmluZyhfVUlfRVJST1JfTUFSS0VSKTsKLQkJX1VJX1dBUk5JTkdfTUFSS0VSID0gYnVuZGxlLmdldFN0cmluZyhfVUlfV0FSTklOR19NQVJLRVIpOwotCQlfVUlfVkFMSURBVElPTl9TVU1NQVJZID0gYnVuZGxlLmdldFN0cmluZyhfVUlfVkFMSURBVElPTl9TVU1NQVJZKTsKLQl9Ci0KLQlwcml2YXRlIFdTRExWYWxpZGF0ZVRleHRVSU1lc3NhZ2VzKCkgCi0JewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS90ZXh0L3dzZGx2YWxpZGF0ZXRleHR1aS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvd3NkbHZhbGlkYXRldGV4dHVpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZWQ4MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvd3NkbHZhbGlkYXRldGV4dHVpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE1lc3NhZ2VzIGZvciB0aGUgV1NETFZhbGlkYXRlIHRleHQgVUkgaW50ZXJmYWNlLgotCi0jIEVycm9yIG1lc3NhZ2VzCi1fRVJST1JfV1JPTkdfQVJHVU1FTlRTICAgICA9IFVzYWdlOiBXU0RMVmFsaWRhdGUgWy13c2RsMTF2IG5hbWVzcGFjZSBjbGFzc25hbWVdIFstZXh0diBuYW1lc3BhY2UgY2xhc3NuYW1lXSBbLURuYW1lPXZhbHVlXSBmaWxlbmFtZVxuXAotXCAgLXdzZGwxMXZcdFJlZ2lzdGVyIHRoZSBXU0RMIDEuMSB2YWxpZGF0b3Igc3BlY2lmaWVkIGJ5IGNsYXNzbmFtZVxuXAotXHRcdGZvciBuYW1lc3BhY2UuXG5cCi1cICAtZXh0dlx0XHRSZWdpc3RlciB0aGUgV1NETCBleHRlbnNpb24gdmFsaWRhdG9yIHNwZWNpZmllZCBieVxuXAotXHRcdGNsYXNzbmFtZSBmb3IgbmFtZXNwYWNlLlxuXAotXCAgLXZlcmJvc2UsIC12XHRQcmludCBvdXQgdmVyYm9zZSBpbmZvcm1hdGlvbi5cblwKLVwgIC1sb2dnZXJcdFNwZWNpZnkgYW4gYWx0ZXJuYXRlIGxvZ2dlciB0aGF0IGltcGxlbWVudHNcblwKLVx0XHRvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlclxuXAotXCAgLURcdFx0U3BlY2lmeSBhIHByb3BlcnR5IHdpdGggbmFtZSBhbmQgdmFsdWUuICAKLV9FUlJPUl9MT0FESU5HX0xPR0dFUiAgICAgID0gVW5hYmxlIHRvIGxvYWQgbG9nZ2VyIGNsYXNzIHswfS4KLV9FUlJPUl9VTkFCTEVfVE9fUkVBRF9GSUxFID0gVW5hYmxlIHRvIHJlYWQgZmlsZSB7MH0uCi0KLSMgVmFsaWRhdGlvbiBtZXNzYWdlcwotX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUiAgPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV9VSV9GSUxFX0lOVkFMSUQgICAgICAgICAgID0gezB9IC0gTm90IHZhbGlkCi1fVUlfRklMRV9WQUxJRCAgICAgICAgICAgICA9IHswfSAtIFZhbGlkCi1fVUlfRVJST1JfTUFSS0VSICAgICAgICAgICA9IEVSUk9SCi1fVUlfV0FSTklOR19NQVJLRVIgICAgICAgICA9IFdBUk5JTkcKLV9VSV9WQUxJREFUSU9OX1NVTU1BUlkgICAgID0gezB9IGZpbGVzIHZhbGlkYXRlZC4gezF9IGZpbGVzIHJlcG9ydGVkIGVycm9ycy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdXRpbC9FcnJvck1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL0Vycm9yTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWJkYzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL0Vycm9yTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogQSBjbGFzcyB0byBob2xkIHZhbGlkYXRpb24gbWVzc2FnZXMuIEluIHRoaXMgY2FzZSBhbiBlcnJvciBtZXNzYWdlIGlzIGEgZ2VuZXJpYwotICogdGVybSBmb3IgYW55IGtpbmQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlLgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlCi17Ci0gIHByaXZhdGUgaW50IGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIHNldmVyaXR5OwotICBwcml2YXRlIFN0cmluZyBlcnJvclN0cmluZywgdXJpOwotICBwcml2YXRlIGludCBzdGFydE9mZnNldCA9IC0xOwotICBwcml2YXRlIGludCBlbmRPZmZzZXQgPSAtMTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgRXJyb3JNZXNzYWdlKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gZXJyb3IgVGhlIG1lc3NhZ2UgdG8gc2V0LgotICAgKiBAc2VlICNnZXRFcnJvck1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpCi0gIHsKLSAgICBlcnJvclN0cmluZyA9IGVycm9yOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHNlZSAjZ2V0U2V2ZXJpdHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkKLSAgewotICAgIHRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZSB1c2luZyBzdHJpbmcgbmFtZXMgZm9yIHRoZSBzZXZlcml0eS4KLSAgICogCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZXZlcml0eS4KLSAgICogQHNlZSAjZ2V0U2V2ZXJpdHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldmVyaXR5KFN0cmluZyBzZXZlcml0eSkKLSAgewotICAgIGlmIChzZXZlcml0eS5lcXVhbHMoIndhcm5pbmciKSkKLSAgICB7Ci0gICAgICB0aGlzLnNldmVyaXR5ID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2V2ZXJpdHkuZXF1YWxzKCJlcnJvciIpKQotICAgIHsKLSAgICAgIHRoaXMuc2V2ZXJpdHkgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChzZXZlcml0eS5lcXVhbHMoImZhdGFsIikpCi0gICAgewotICAgICAgdGhpcy5zZXZlcml0eSA9IDI7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGxpbmUgd2hlcmUgdGhlIGVycm9yIGlzIGxvY2F0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgaXMgbG9jYXRlZC4KLSAgICogQHNlZSAjZ2V0RXJyb3JMaW5lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvckxpbmUoaW50IGxpbmUpCi0gIHsKLSAgICBlcnJvckxpbmUgPSBsaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgaXMgbG9jYXRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgaXMgbG9jYXRlZC4KLSAgICogQHNlZSAjZ2V0RXJyb3JDb2x1bW4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yQ29sdW1uKGludCBjb2x1bW4pCi0gIHsKLSAgICBlcnJvckNvbHVtbiA9IGNvbHVtbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZXJyb3IgbWVzc2FnZS4KLSAgICogQHNlZSAjc2V0RXJyb3JNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JTdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2V2ZXJpdHkgb2YgdGhlIGVycm9yLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhlIGVycm9yLgotICAgKiBAc2VlICNzZXRTZXZlcml0eQotICAgKi8KLSAgcHVibGljIGludCBnZXRTZXZlcml0eSgpCi0gIHsKLSAgICByZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KLSAgICogQHNlZSAjc2V0RXJyb3JMaW5lCi0gICAqLwotICBwdWJsaWMgaW50IGdldEVycm9yTGluZSgpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JMaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAc2VlICNzZXRFcnJvckNvbHVtbgotICAgKi8KLSAgcHVibGljIGludCBnZXRFcnJvckNvbHVtbigpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JDb2x1bW47Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc3RhcnQgb2Zmc2V0LgotICAgKiAKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZmZzZXQuCi0gICAqIEBzZWUgI2dldEVycm9yU3RhcnRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yU3RhcnRPZmZzZXQoaW50IHN0YXJ0KQotICB7Ci0gICAgc3RhcnRPZmZzZXQgPSBzdGFydDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlcnJvciBzdGFydCBvZmZzZXQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBlcnJvciBzdGFydCBvZmZzZXQuCi0gICAqIEBzZWUgI3NldEVycm9yU3RhcnRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RXJyb3JTdGFydE9mZnNldCgpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRPZmZzZXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW5kIG9mZnNldC4KLSAgICogCi0gICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZmZzZXQuCi0gICAqIEBzZWUgI2dldEVycm9yRW5kT2Zmc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvckVuZE9mZnNldChpbnQgZW5kKQotICB7Ci0gICAgZW5kT2Zmc2V0ID0gZW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVycm9yIGVuZCBvZmZzZXQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBlcnJvciBlbmQgb2Zmc2V0LgotICAgKiBAc2VlICNzZXRFcnJvckVuZE9mZnNldAotICAgKi8KLSAgcHVibGljIGludCBnZXRFcnJvckVuZE9mZnNldCgpCi0gIHsKLSAgICByZXR1cm4gZW5kT2Zmc2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBuZXcgbGluZSBvdCB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBuZXdMaW5lIFRoZSBuZXcgbGluZSB0byBhZGQgdG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROZXdFcnJvck1lc3NhZ2VMaW5lKFN0cmluZyBuZXdMaW5lKQotICB7Ci0gICAgZXJyb3JTdHJpbmcgKz0gIlxuIiArIG5ld0xpbmU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIFVSSSBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSB0byBzZXQuCi0gICAqLwotIAotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBVUkkgb2YgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdXRpbC9MYXp5VVJMSW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL0xhenlVUkxJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRmNDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL0xhenlVUkxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZy5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBhbGxvd3MgSW5wdXRTdHJlYW1zIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIHRvIHhlcmNlcyB3aXRob3V0Ci0gKiBhY3R1YWxseSBvcGVuaW5nIGZpbGUgaGFuZGxlcyBvciBuZXR3b3JrIGNvbm5lY3Rpb25zIHVudGlsIGl0IGlzIGFic29sdXRlbHkKLSAqIG5lY2Nlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5VVJMSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbQoteyAgCi0gIHByaXZhdGUgc3RhdGljIGludCBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50ID0gMDsgCi0gIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbm5lcjsKLSAgcHJvdGVjdGVkIFN0cmluZyB1cmw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGVycm9yOwotICBib29sZWFuIGhhc01hcmtzOwotICBib29sZWFuIHByZXRlbmRGaWxlSXNTdGlsbE9wZW47Ci0KLSAgcHVibGljIExhenlVUkxJbnB1dFN0cmVhbShTdHJpbmcgdXJsKQotICB7Ci0gICAgdGhpcy51cmwgPSB1cmw7Ci0JaW5uZXIgPSBudWxsOwotCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChpbm5lciA9PSBudWxsICYmICFlcnJvcikKLSAgICB7Ci0gICAgICBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50Kys7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgc3RyZWFtICgiICsgZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudCArICIpLS0gIiArIHVybCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW5uZXIgPSBuZXcgVVJMKHVybCkub3BlblN0cmVhbSgpOwotCQlwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuID0gZmFsc2U7Ci0JCWhhc01hcmtzID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5IAotICAgICAgewotICAgICAgICBpZiAoaW5uZXIgPT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbm5lciAhPSBudWxsICYmICFwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSB7Ci0JCQlpbm5lci5jbG9zZSgpOwotCQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IHRydWU7Ci0JCX0KLSAgCX0KLQotICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAwOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7Ci0JcmV0dXJuIGlubmVyLmF2YWlsYWJsZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSB7Ci0JCS8vIFN0b3AgYmVoYXZpbmcgYXMgaWYgdGhlIHN0cmVhbSB3ZXJlIHN0aWxsIG9wZW4uCi0JCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSBmYWxzZTsKLQl9IGVsc2UgewotCQlpZiAoaW5uZXIgIT0gbnVsbCkgewotCQkJZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudC0tOwotCQkgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2xvc2luZyBzdHJlYW0gKCIgKyBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50ICsgIikgLS0gIiArIHVybCk7Ci0JCQlpbm5lci5jbG9zZSgpOwotCQl9Ci0JfQotICB9Ci0KLSAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KQotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybjsKLQloYXNNYXJrcyA9IHRydWU7Ci0JdHJ5IHsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlubmVyLm1hcmsocmVhZGxpbWl0KTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JICBMb2dnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9nZ2VyKCkubG9nKCJUaGUgZm9sbG93aW5nIElPRXhjZXB0aW9uIG9jY3VycmVkIGluIHRoZSBXU0RMIHZhbGlkYXRvcidzIExhenlVUkxJbnB1dFN0cmVhbS4iLCBJTG9nZ2VyLlNFVl9FUlJPUiwgZSk7Ci0JfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi0gIHsKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIGZhbHNlOwotCXRyeSB7Ci0JCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCQlpZiAoaW5uZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW5uZXIubWFya1N1cHBvcnRlZCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkgIExvZ2dlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2coIlRoZSBmb2xsb3dpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQgaW4gdGhlIFdTREwgdmFsaWRhdG9yJ3MgTGF6eVVSTElucHV0U3RyZWFtLiIsIElMb2dnZXIuU0VWX0VSUk9SLCBlKTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIC0xOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7Ci0JaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoKTsKLQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQlyZXR1cm4gYnl0ZXNSZWFkOwotICB9Ci0KLQotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAtMTsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7Ci0JCWludCBieXRlc1JlYWQgPSBpbm5lci5yZWFkKGIpOwotCQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQkJcmV0dXJuIGJ5dGVzUmVhZDsKLQl9Ci0KLSAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgeyAgICAKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIC0xOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7Ci0JaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoYiwgb2ZmLCBsZW4pOwotCWlmIChieXRlc1JlYWQgPT0gLTEgJiYgIWhhc01hcmtzKSBjbG9zZVN0cmVhbSgpOwotCXJldHVybiBieXRlc1JlYWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybjsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOwotCWlubmVyLnJlc2V0KCk7Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsgICAKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIDA7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsKLQlyZXR1cm4gaW5uZXIuc2tpcChuKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3V0aWwvTWVzc2FnZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3V0aWwvTWVzc2FnZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjc4Y2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL01lc3NhZ2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3Igd29ya2luZyB3aXRoIHJlc291cmNlcyBpbiBhIHJlc291cmNlIGJ1bmRsZS4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VHZW5lcmF0b3IKLXsKLSAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlYnVuZGxlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHdvcmsgd2l0aC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlR2VuZXJhdG9yKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgcmVzb3VyY2VidW5kbGUgPSByYjsKLSAgfQotCi0gIC8qKgotICAqIFNldCB0aGUgcmVzb3VyY2VidW5kbGUgdG8gdGhlIG9uZSBzcGVjaWZpZWQuCi0gICogCi0gICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gIH0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBrZXkuCi0gICogCi0gICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgcmVzb3VyY2UuCi0gICogQHJldHVybiBUaGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlc291cmNlLgotICAgKiBAcGFyYW0gczEgVGhlIHN1YnN0aXR1dGlvbiB0byBwZXJmb3JtLgotICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W10geyBzMSB9KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGRvZXMgdHdvIHN1YnN0aXR1dGlvbnMuCi0gICAqIAotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSByZXNvdXJjZS4KLSAgICogQHBhcmFtIHMxIFRoZSBmaXJzdCBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHBhcmFtIHMyIFRoZSBzZWNvbmQgc3Vic3RpdHV0aW9uIHRvIHBlcmZvcm0uCi0gICAqIEByZXR1cm4gVGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtdIHsgczEsIHMyIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqICBHZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGRvZXMgdGhyZWUgc3Vic3RpdHV0aW9ucy4KLSAgICogCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlc291cmNlLgotICAgKiBAcGFyYW0gczEgVGhlIGZpcnN0IHN1YnN0aXR1dGlvbiB0byBwZXJmb3JtLgotICAgKiBAcGFyYW0gczIgVGhlIHNlY29uZCBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHBhcmFtIHMzIFRoZSB0aGlyZCBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHJldHVybiBUaGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSwgT2JqZWN0IHMyLCBPYmplY3QgczMpCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXSB7IHMxLCBzMiwgczMgfSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvQ2xhc3Nsb2FkZXJXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9DbGFzc2xvYWRlcldTREwxMVZhbGlkYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YjdmNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9DbGFzc2xvYWRlcldTREwxMVZhbGlkYXRvckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENsYXNzbG9hZGVyV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgZXh0ZW5kcyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZQotewotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgZGVsZWdhdGUgZm9yIGEgdmFsaWRhdG9yIGJ5IGl0cyBjbGFzcyBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKi8KLSAgcHVibGljIENsYXNzbG9hZGVyV1NETDExVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSkKLSAgewotCXRoaXMudmFsaWRhdG9yQ2xhc3NuYW1lID0gdmFsaWRhdG9yQ2xhc3NuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGRlbGVnYXRlIGZvciBhIHZhbGlkYXRvciBieSBpdHMgY2xhc3MgbmFtZSBhbmQgCi0gICAqIGEgY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBDbGFzc2xvYWRlcldTREwxMVZhbGlkYXRvckRlbGVnYXRlKFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICB7Ci0gICAgdGhpcyh2YWxpZGF0b3JDbGFzc25hbWUpOwotICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRvckRlbGVnYXRlI2xvYWRWYWxpZGF0b3IoKQotICAgKi8KLSAgcHJvdGVjdGVkIElXU0RMMTFWYWxpZGF0b3IgbG9hZFZhbGlkYXRvcigpCi0gIHsKLQlJV1NETDExVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0JaWYoY2xhc3NMb2FkZXIgPT0gbnVsbCkKLQl7Ci0JICBjbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQl9Ci0JdHJ5Ci0JewotICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MgPQotICAgICAgY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzc25hbWUpIDogQ2xhc3MuZm9yTmFtZSh2YWxpZGF0b3JDbGFzc25hbWUpOwotCi0gICAgICB2YWxpZGF0b3IgPSAoSVdTREwxMVZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvZ2dlcigpLmxvZygiVW5hYmxlIHRvIGxvYWQgdmFsaWRhdG9yICIgKyB2YWxpZGF0b3JDbGFzc25hbWUsIElMb2dnZXIuU0VWX0VSUk9SLCB0KTsKLSAgICB9Ci0JcmV0dXJuIHZhbGlkYXRvcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JV1NETDExVmFsaWRhdGlvbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSVdTREwxMVZhbGlkYXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOWYxZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JV1NETDExVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5VUklSZXNvbHZlcjsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIFdTREwgMS4xIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uIFVzZXMgYW4gZXhpc3RpbmcKLSAqIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gc2V0IGFuZCByZXRyaWV2ZQotICogc2NoZW1hcyBhbmQgY29udmVuaWVuY2UgbWV0aG9kcyBmb3Igc2V0dGluZyBlcnJvcnMgd2l0aCBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXU0RMMTFWYWxpZGF0aW9uSW5mbwotewotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBmaWxlIGJlaW5nIHZhbGlkYXRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgZmlsZSBiZWluZyB2YWxpZGF0ZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKTsKLSAgCi0gIC8qKgotICAgKiBBZGQgYSBzY2hlbWEgdG8gdGhlIGxpc3Qgb2Ygc2NoZW1hcyBhdmFpbGFibGUgZm9yIHRoaXMgV1NETCBkb2N1bWVudC4KLSAgICogCi0gICAqIEBwYXJhbSB4c01vZGVsIFRoZSBzY2hlbWEgdG8gYWRkIHRvIHRoZSBsaXN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkU2NoZW1hKFhTTW9kZWwgeHNNb2RlbCk7Ci0gIAotICAvKioKLSAgICogR2V0IGFuIGFycmF5IG9mIGFsbCB0aGUgc2NoZW1hcyBhdmFpbGFibGUgZm9yIHRoaXMgV1NETCBkb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgYWxsIHRoZSBzY2hlbWFzIGF2YWlsYWJsZSBmb3IgdGhpcyBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIFhTTW9kZWxbXSBnZXRTY2hlbWFzKCk7Ci0gIAotICAvKioKLSAgICogQ2xlYXIgYWxsIHRoZSBzdG9yZWQgc2NoZW1hcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyU2NoZW1hcygpOwotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgZWxlbWVudCBsb2NhdGlvbnMgaGFzaHRhYmxlLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnRMb2NhdGlvbnMgVGhlIGhhc2h0YWJsZSB0byBzZXQgd2l0aCB0aGUgZWxlbWVudCBsb2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TG9jYXRpb25zKEhhc2h0YWJsZSBlbGVtZW50TG9jYXRpb25zKTsKLSAgCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgZXJyb3IgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgdG8gYWRkLgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgZm9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBlbGVtZW50KTsKLSAgCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgZXJyb3IgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgdG8gYWRkLgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgZm9yLgotICAgKiBAcGFyYW0gZXJyb3JLZXkgVGhlIGVycm9yIGtleSBmb3IgdGhpcyBtZXNzYWdlCi0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIFRoZSBzdHJpbmdzIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBlbGVtZW50LCBTdHJpbmcgZXJyb3JLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpOwotICAKLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlIGF0IHRoZSBnaXZlbiBsaW5lIGFuZCBjb2x1bW4uCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBlcnJvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgd2FybmluZyB0byBhZGQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBvYmplY3QgdG8gYWRkIHRoZSB3YXJuaW5nIGZvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBlbGVtZW50KTsKLSAgCi0gIC8qKgotICAgKiBBZGQgYSB3YXJuaW5nIG1lc3NhZ2UgYXQgdGhlIGdpdmVuIGxpbmUgYW5kIGNvbHVtbi4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB3YXJuaW5nIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHdhcm5pbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBVUkkgcmVzb2x2ZXIgaW4gdXNlIGZvciB0aGlzIHZhbGlkYXRpb24uIFRoZSBVUkkgcmVzb2x2ZXIKLSAgICogcmV0dXJuZWQgaXMgYWN0dWFsbHkgYSBVUkkgcmVzb2x2ZXIgaGFuZGxlciB0aGF0IHdpbGwgCi0gICAqIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHJlZ2lzdGVyZWQgVVJJIHJlc29sdmVycy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSByZXNvbHZlciBoYW5kbGVyLgotICAgKi8KLSAgcHVibGljIFVSSVJlc29sdmVyIGdldFVSSVJlc29sdmVyKCk7Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzY2hlbWEgY2FjaGUgaWYgb25lIGlzIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHNjaGVtYSBjYWNoZSBpZiBvbmUgaXMgc3BlY2lmaWVkLCBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBYTUxHcmFtbWFyUG9vbCBnZXRTY2hlbWFDYWNoZSgpOwotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgWE1MIGNhY2hlIGlmIG9uZSBpcyBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYTUwgY2FjaGUgaWYgb25lIGlzIHNwZWNpZmllZCwgbnVsbCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgWE1MR3JhbW1hclBvb2wgZ2V0WE1MQ2FjaGUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JV1NETDExVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhYmNkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSB2YWxpZGF0b3IgcGx1Z2dlZCBpbnRvIHRoZSBXU0RMIDEuMSB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdTREwxMVZhbGlkYXRvcgotewotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhpcyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgY3VycmVudCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JbXBvcnRIb2xkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSW1wb3J0SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMTIwYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JbXBvcnRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x1dGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuRXJyb3JNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZC5YU0RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuRGVmYXVsdFhNTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5JWE1MVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2dSZXNvbHZlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuRE9NVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLlFOYW1lVXRpbHM7Ci0KLS8qKgotICogQSBjbGFzcyB0byBob2xkIGFuZCBwYXJzZSBhbiBpbXBvcnQgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEltcG9ydEhvbGRlciBpbXBsZW1lbnRzIENvbXBhcmFibGUKLXsKLSAgcHJpdmF0ZSBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIAotICBwcml2YXRlIFdTRExEb2N1bWVudCBpbXBvcnRpbmdXU0RMRG9jID0gbnVsbDsKLSAgcHJpdmF0ZSBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50ID0gbnVsbDsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGltcG9ydGluZ0RlZiA9IG51bGw7Ci0gIHByaXZhdGUgRWxlbWVudCBpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50ID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBjbGFzc3BhdGhVUkkgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBjb250ZXh0VVJJID0gbnVsbDsKLSAgcHJpdmF0ZSBpbnQgZGVwdGg7Ci0gIHByaXZhdGUgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgcHJpdmF0ZSBMaXN0IHNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1dTRExGaWxlSW1wb3J0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIGltcG9ydEludmFsaWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBJbXBvcnQgaW1wb3J0RGVmID0gbnVsbDsKLSAgcHJpdmF0ZSBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgaW1wb3J0LgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBpbXBvcnQuCi0gICAqIEBwYXJhbSBjb250ZXh0VVJJIFRoZSBjb250ZXh0IFVSSSBmb3IgcmVzb2x2aW5nIHRoZSBpbXBvcnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsRG9jIFRoZSBXU0RMRG9jdW1lbnQgdGhhdCBjb250YWlucyB0aGUgaW1wb3J0LgotICAgKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBpbXBvcnQuCi0gICAqIEBwYXJhbSBpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50IFRoZSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgaW1wb3J0IGluIHRoZSBlbmNhcHN1bGF0aW5nIFdTRExEb2N1bWVudC4KLSAgICogQHBhcmFtIG1lc3NhZ2VnZW5lcmF0b3IgQSBtZXNzYWdlZ2VuZXJhdG9yIGZvciBvYnRhaW5pbmcgc3RyaW5ncy4KLSAgICogQHBhcmFtIHZhbGluZm8gVGhlIFdTREwxMVZhbGlkYXRpb25JbmZvIGZvciByZXBvcnRpbmcgbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0SG9sZGVyKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIGNvbnRleHRVUkksIFdTRExEb2N1bWVudCBpbXBvcnRpbmdXU0RMRG9jLCBpbnQgZGVwdGgsIEVsZW1lbnQgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCwgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsaW5mbykKLSAgewotICAgIHRoaXMubWVzc2FnZWdlbmVyYXRvciA9IG1lc3NhZ2VnZW5lcmF0b3I7Ci0gICAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgICB0aGlzLmltcG9ydGluZ1dTRExEb2MgPSBpbXBvcnRpbmdXU0RMRG9jOwotICAgIGlmKGltcG9ydGluZ1dTRExEb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aGlzLmltcG9ydGluZ0RlZiA9IGltcG9ydGluZ1dTRExEb2MuZ2V0RGVmaW5pdGlvbigpOwotICAgIH0KLSAgICB0aGlzLmltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQgPSBpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50OwotICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgCi0gICAgLy8gIEFsbG93IFdTREwgaW1wb3J0cyB0byBoYXZlIG5vIGxvY2F0aW9uIGF0dHJpYnV0ZSBldmVuIHRob3VnaCBpdCBpcyByZXF1aXJlZC4KLSAgICAvLyBTY2hlbWEgd2lsbCBub3JtYWxseSBjYXRjaCB0aGUgcHJvYmxlbSBidXQgdGhpcyBhbGxvd3MgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlCi0gICAgLy8gc2NoZW1hIGFuZCBoYXZlIHRoZSB2YWxpZGF0b3IgcnVuLgotICAgIGlmICh0aGlzLmxvY2F0aW9uID09IG51bGwpCi0gICAgewotICAgICAgdGhpcy5sb2NhdGlvbiA9IG5hbWVzcGFjZTsKLSAgICB9Ci0gICAgdGhpcy5jb250ZXh0VVJJID0gY29udGV4dFVSSTsKLSAgICAKLSAgICB0aGlzLmxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbi5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICBJVVJJUmVzb2x1dGlvblJlc3VsdCBjbGFzc3BhdGhVUkkgPSB2YWxpbmZvLmdldFVSSVJlc29sdmVyKCkucmVzb2x2ZSh0aGlzLmNvbnRleHRVUkksIHRoaXMubmFtZXNwYWNlLCB0aGlzLmxvY2F0aW9uKTsKLSAgICBpZihjbGFzc3BhdGhVUkkuZ2V0TG9naWNhbExvY2F0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aGlzLmxvY2F0aW9uID0gY2xhc3NwYXRoVVJJLmdldExvZ2ljYWxMb2NhdGlvbigpOwotICAgIH0KLSAgICBpZihjbGFzc3BhdGhVUkkuZ2V0UGh5c2ljYWxMb2NhdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgdGhpcy5jbGFzc3BhdGhVUkkgPSBjbGFzc3BhdGhVUkkuZ2V0UGh5c2ljYWxMb2NhdGlvbigpOwotICAgICAgdGhpcy5jb250ZXh0VVJJID0gbnVsbDsKLSAgICB9IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLSAgewotICAgIEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBkb2N1bWVudEVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGlmKGRvY3VtZW50RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgCSAgLy8gSGFuZGxlIFdTREwgaW1wb3J0cy4KLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUywgZG9jdW1lbnRFbGVtZW50KSkKLSAgICAgIHsKLSAgICAgICAgaWYoaXNYTUxWYWxpZCh0aGlzLmNsYXNzcGF0aFVSSSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3c2RsRG9jdW1lbnQgPSBuZXcgV1NETERvY3VtZW50KHRoaXMubG9jYXRpb24sIGRvY3VtZW50RWxlbWVudCwgdGhpcy5kZXB0aCwgdGhpcy5tZXNzYWdlZ2VuZXJhdG9yLCB0aGlzLnZhbGluZm8pOwotICAgICAgICAgICAgY3JlYXRlV1NETEltcG9ydCh3c2RsRG9jdW1lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsaW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1VOQUJMRV9UT19JTVBPUlRfQkFEX0xPQ0FUSU9OIiwgIiciICsgaW1wb3J0RGVmLmdldExvY2F0aW9uVVJJKCkgKyAiJyIpLCBpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIEhhbmRsZSBzY2hlbWEgaW1wb3J0cy4KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX1hTRF8yMDAxLCBkb2N1bWVudEVsZW1lbnQpKQotICAgICAgewotICAgICAgICBjcmVhdGVYU0RJbXBvcnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzWE1MVmFsaWQoU3RyaW5nIHVyaSkKLSAgewotICAgIElYTUxWYWxpZGF0b3IgeG1sVmFsaWRhdG9yID0gQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRYTUxWYWxpZGF0b3IoKTsKLSAgICB4bWxWYWxpZGF0b3Iuc2V0RmlsZSh1cmkpOwotICAgIHhtbFZhbGlkYXRvci5zZXRVUklSZXNvbHZlcih2YWxpbmZvLmdldFVSSVJlc29sdmVyKCkpOwotICAgIC8veG1sVmFsaWRhdG9yLnNldFZhbGlkYXRpb25JbmZvKHZhbEluZm8pOwotICAgIGlmKHhtbFZhbGlkYXRvciBpbnN0YW5jZW9mIERlZmF1bHRYTUxWYWxpZGF0b3IpCi0gICAgewotICAgIAlYTUxHcmFtbWFyUG9vbCBncmFtbWFyUG9vbCA9IHZhbGluZm8uZ2V0WE1MQ2FjaGUoKTsKLSAgICAgICAgaWYoZ3JhbW1hclBvb2wgIT0gbnVsbCkKLSAgICAgICAgICAoKERlZmF1bHRYTUxWYWxpZGF0b3IpeG1sVmFsaWRhdG9yKS5zZXRHcmFtbWFyUG9vbChncmFtbWFyUG9vbCk7Ci0gICAgfQotICAgIHhtbFZhbGlkYXRvci5ydW4oKTsKLSAgICAvLyBpZiB0aGVyZSBhcmUgbm8geG1sIGNvbmZvcm1hbmNlIHByb2JsZW1zIGdvIG9uIHRvIGNoZWNrIHRoZSB3c2RsIHN0dWZmCi0gICAgaWYgKHhtbFZhbGlkYXRvci5oYXNFcnJvcnMoKSkKLSAgICB7Ci0gICAgICAvLyB0ZW1wIGhhbmRsaW5nIG9mIFhNTCBlcnJvcnMgdW50aWwgdmFsaWRhdG9yIGlzIHVwZGF0ZWQuCi0gICAgICBMaXN0IGVycm9ycyA9IHhtbFZhbGlkYXRvci5nZXRFcnJvcnMoKTsKLSAgICAgIEl0ZXJhdG9yIGVycm9yc0l0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSVZhbGlkYXRpb25NZXNzYWdlIHZhbE1lcyA9IChJVmFsaWRhdGlvbk1lc3NhZ2UpZXJyb3JzSXRlci5uZXh0KCk7Ci0gICAgICAgIHZhbGluZm8uYWRkRXJyb3IodmFsTWVzLmdldE1lc3NhZ2UoKSwgdmFsTWVzLmdldExpbmUoKSwgdmFsTWVzLmdldENvbHVtbigpLCB2YWxNZXMuZ2V0VVJJKCkpOwotICAgICAgfQotICAgICAgaW1wb3J0SW52YWxpZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBpbXBvcnRpbmcgV1NETERvY3VtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgaW1wb3J0aW5nIFdTRExEb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBXU0RMRG9jdW1lbnQgZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydGluZ1dTRExEb2M7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFdTREwgZG9jdW1lbnQgdGhpcyBpbXBvcnQgcmVwcmVzZW50cy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFdTREwgZG9jdW1lbnQgdGhpcyBpbXBvcnQgcmVwcmVzZW50cy4KLSAgICovCi0gIHB1YmxpYyBXU0RMRG9jdW1lbnQgZ2V0V1NETERvY3VtZW50KCkKLSAgewotICAgIHJldHVybiB3c2RsRG9jdW1lbnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvY2F0aW9uLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY29udGV4dCBVUkkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb250ZXh0IFVSSS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFVSSSgpCi0gIHsKLSAgICByZXR1cm4gY29udGV4dFVSSTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZGVwdGggaW4gdGhlIFdTREwgdHJlZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGRlcHRoIGluIHRoZSBXU0RMIHRyZWUuCi0gICAqLwotICBwdWJsaWMgaW50IGdldERlcHRoKCkKLSAgewotICAgIHJldHVybiBkZXB0aDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY29udGFpbmluZyBkZWZpbnRpb25zIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb250YWluaW5nIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRJbXBvcnRpbmdEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBpbXBvcnRpbmdEZWY7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGVsZW1lbnQgZm9yIHRoaXMgaW1wb3J0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZWxlbWVudCBmb3IgdGhpcyBpbXBvcnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBpZihlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IGxvY2F0aW9uOwotICAgIC8vSW1wb3J0IGltcG9ydERlZiA9IGltcG9ydGluZ0RlZi5jcmVhdGVJbXBvcnQoKTsKLSAgICAKLSAgICAvLyAgQWxsb3cgbG9jYXRpbmcgV1NETCBkb2N1bWVudHMgdXNpbmcgYW55IHJlZ2lzdGVyZWQgVVJJIHJlc29sdmVyLgotICAgIC8vU3RyaW5nIGNsYXNzcGF0aFVSSSA9IFVSSVJlc29sdmVyLmdldEluc3RhbmNlKCkucmVzb2x2ZShjb250ZXh0VVJJLCBuYW1lc3BhY2VVUkksIGxvY2F0aW9uVVJJKTsKLS8vICAgIGlmICghY2xhc3NwYXRoVVJJLmVxdWFscyhsb2NhdGlvblVSSSkpCi0vLyAgICB7Ci0vLyAgICAgIGxvY2F0aW9uVVJJID0gY2xhc3NwYXRoVVJJOwotLy8gICAgICBjb250ZXh0VVJJID0gbnVsbDsKLS8vICAgIH0KLSAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICBpZiAobG9jYXRpb25VUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy9TdHJpbmcgY29udGV4dFVSSSA9IGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICAvL0RlZmluaXRpb24gaW1wb3J0ZWREZWYgPSBudWxsOwotICAgICAgICAgIAotICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKLSAgICAgICAgICBVUkwgdXJsID0gbnVsbDsKLQotICAgICAgICAgIAotICAgICAgICAgICAgVVJMIGNvbnRleHRVUkwgPSAoY29udGV4dFVSSSAhPSBudWxsKSA/IFN0cmluZ1V0aWxzLmdldFVSTChudWxsLCBjb250ZXh0VVJJKSA6IG51bGw7Ci0KLSAgICAgICAgICAgIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTChjb250ZXh0VVJMLCBsb2NhdGlvblVSSSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEhhbmRsZSBmaWxlOi8vIHVybHMuIFRoZSBjb3JyZWN0IGZvcm1hdCBzaG91bGQgYmUgZmlsZTovLy8gb3IgZmlsZTovLgotICAgICAgICAgICAgU3RyaW5nIHVybEF1dGhvcml0eSA9IHVybC5nZXRBdXRob3JpdHkoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmxQcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOwotICAgICAgICAgICAgaWYodXJsQXV0aG9yaXR5ICE9bnVsbCAmJiB1cmxQcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikgJiYgIXVybEF1dGhvcml0eS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh1cmxQcm90b2NvbCwiIiwiLyIgKyB1cmxBdXRob3JpdHkgKyB1cmwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOwotCQkJLy8gVGVzdCBmb3IgY2FzZSBzZW5zaXRpdml0eSBvbiBsb2NhbCBmaWxlcy4KLQkJCWlmKHVybFN0cmluZy5zdGFydHNXaXRoKCJmaWxlOiIpKQotCQkJewotCQkJICBGaWxlIHRlc3RmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQkgIFN0cmluZyB0ZXN0ZmlsZVN0cmluZyA9IHRlc3RmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJICBTdHJpbmcgY2Fub25pY2FsZmlsZVN0cmluZyA9IHRlc3RmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQotICAgICAgICAgICAgICBpZiAoIXRlc3RmaWxlU3RyaW5nLmVxdWFscyhjYW5vbmljYWxmaWxlU3RyaW5nKSkKLSAgICAgICAgICAgICAgewotCQkJCWlmICghU3RyaW5nLnZhbHVlT2YodGVzdGZpbGVTdHJpbmcuY2hhckF0KDApKS5lcXVhbHNJZ25vcmVDYXNlCi0JCQkJICAgIChTdHJpbmcudmFsdWVPZihjYW5vbmljYWxmaWxlU3RyaW5nLmNoYXJBdCgwKSkpCi0JCQkJICAgIHx8ICF0ZXN0ZmlsZVN0cmluZy5zdWJzdHJpbmcoMSx0ZXN0ZmlsZVN0cmluZy5sZW5ndGgoKSkuZXF1YWxzCi0JCQkJCShjYW5vbmljYWxmaWxlU3RyaW5nLnN1YnN0cmluZygxLGNhbm9uaWNhbGZpbGVTdHJpbmcubGVuZ3RoKCkpKSkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICB1cmxTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICAgICAgIHVybCA9IG51bGw7Ci0JCQkJfQotICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCQlpZih1cmwgIT0gbnVsbCkKLQkJCXsKLQkJCSAgdHJ5Ci0JCQkgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBTdHJpbmdVdGlscy5nZXRDb250ZW50QXNSZWFkZXIodXJsKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkgICAgLy8gTm8gbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLiBUaGUgZXJyb3Igd2lsbCBiZSBoYW5kbGVkIGJlbG93LgotCQkJICB9Ci0JCQl9Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgIGlmKGNsYXNzcGF0aFVSSSAhPSBudWxsICYmICFjbGFzc3BhdGhVUkkuZXF1YWxzKGxvY2F0aW9uKSkKLSAgCQkJICB7Ci0gIAkJCSAgICBpbnB1dFNvdXJjZS5zZXRCeXRlU3RyZWFtKG5ldyBVUkwoY2xhc3NwYXRoVVJJKS5vcGVuU3RyZWFtKCkpOwotICAJCQkgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlucHV0U291cmNlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEdldCB0aGUgYWN0dWFsIGxvY2F0aW9uIGZyb20gdGhlIGVsZW1lbnQuCi0gICAgICAgICAgICAgIFN0cmluZyBhY3R1YWxMb2NhdGlvbiA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50LCBDb25zdGFudHMuQVRUUl9MT0NBVElPTik7Ci0gICAgICAgICAgICAgIGlmKGFjdHVhbExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCWFjdHVhbExvY2F0aW9uID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsICJzY2hlbWFMb2NhdGlvbiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmKGFjdHVhbExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCWFjdHVhbExvY2F0aW9uID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkUmVhZGVyV2FybmluZygKLSAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RlZiwKLSAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1VOQUJMRV9UT19JTVBPUlRfQkFEX0xPQ0FUSU9OIiwgIiciICsgYWN0dWFsTG9jYXRpb24gKyAiJyIpKTsKLSAgICAgICAgICAgICAgaW1wb3J0SW52YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gVE9ETzogbW9kaWZ5IHRoZSByZWFkZXIgZXJyb3IgdG8gc2hvdyBpbiBhbGwgdGhlIGNvcnJlY3QgbG9jYXRpb25zLgotICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLAotICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbG9jYXRlIGltcG9ydGVkIGRvY3VtZW50ICIKLSAgICAgICAgICAgICAgICAgICsgImF0ICciCi0gICAgICAgICAgICAgICAgICArIGxvY2F0aW9uVVJJCi0gICAgICAgICAgICAgICAgICArICInIgotICAgICAgICAgICAgICAgICAgKyAoY29udGV4dFVSSSA9PSBudWxsID8gIi4iIDogIiwgcmVsYXRpdmUgdG8gJyIgKyBjb250ZXh0VVJJICsgIicuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2MgPSBXU0RMUmVhZGVySW1wbC5nZXREb2N1bWVudChpbnB1dFNvdXJjZSwgbG9jYXRpb25VUkkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBUaGUgRmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcmVhZC4gCi0gICAgICAgICAgICAgIC8vIFBlcmZvcm0gWE1MIHZhbGlkYXRpb24uCi0gICAgICAgICAgICAgIGlzWE1MVmFsaWQobG9jYXRpb25VUkkpOwotLy8gICAgICAgICAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkUmVhZGVyRXJyb3IoCi0vLyAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RlZiwKLS8vICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCwKLS8vICAgICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9VTkFCTEVfVE9fSU1QT1JUX0lOVkFMSUQiLCAiJyIgKyBsb2NhdGlvbiArICInIikpOwotICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmKCFRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUywgZWxlbWVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzV1NETEZpbGVJbXBvcnQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBpbXBvcnRlZCBkb2N1bWVudCBoYXMgdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBpbXBvcnQgZWxlbWVudCBzdGF0ZXMuCi0gICAgICAgICAgICBTdHJpbmcgaW1wb3J0VGFyZ2V0TlMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIGlmKCFpbXBvcnRUYXJnZXROUy5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW1wb3J0aW5nV1NETERvYy5hZGRSZWFkZXJXYXJuaW5nKAotICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRGVmLAotICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfV0FSTl9XUk9OR19OU19PTl9JTVBPUlQiLCAiJyIgKyBuYW1lc3BhY2UgKyAiJyIsICInIiArIGltcG9ydFRhcmdldE5TICsgIiciKSk7Ci0gICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICBpbXBvcnRJbnZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmKHJlYWRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7fQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgCi0gICAgfQotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIGltcG9ydCBlbGVtZW50IGZvciBhIFdTREwgaW1wb3J0IG9mIGEgV1NETCBkb2N1bWVudC4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgVGhlIGRvY3VtZW50IG9mIHRoZSBpbXBvcnQuCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW1wb3J0IGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGNyZWF0ZVdTRExJbXBvcnQoV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgewotICAgIGlmKGltcG9ydERlZiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBpbXBvcnREZWY7Ci0gICAgfQotICAgIGltcG9ydERlZiA9IGdldE5ld0ltcG9ydCgpOwotICAKLSAgICBpZiAoaW1wb3J0RGVmICE9IG51bGwpCi0gICAgewotICAgICAgaW1wb3J0RGVmLnNldERlZmluaXRpb24od3NkbERvY3VtZW50LmdldERlZmluaXRpb24oKSk7Ci0gICAgICBzY2hlbWFzLmFkZEFsbCh3c2RsRG9jdW1lbnQuZ2V0U2NoZW1hcygpKTsKLSAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkU2NoZW1hcyhzY2hlbWFzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIGltcG9ydCBlbGVtZW50IGZvciBhIFdTREwgaW1wb3J0IG9mIGEgc2NoZW1hIGltcG9ydCBvZiBhIHNjaGVtYSBkb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW1wb3J0IGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGNyZWF0ZVhTREltcG9ydCgpCi0gIHsKLSAgICBpZihpbXBvcnREZWYgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1wb3J0RGVmOwotICAgIH0KLSAgICBpbXBvcnREZWYgPSBnZXROZXdJbXBvcnQoKTsKLSAgICBYU0RWYWxpZGF0b3IgeHNkdmFsaWRhdG9yID0gbmV3IFhTRFZhbGlkYXRvcigpOwotCi0gICAgeHNkdmFsaWRhdG9yLnZhbGlkYXRlKGxvY2F0aW9uLCBYTUxDYXRhbG9nUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKSwgdmFsaW5mby5nZXRTY2hlbWFDYWNoZSgpKTsKLSAgICBpZiAoeHNkdmFsaWRhdG9yLmlzVmFsaWQoKSkKLSAgICB7Ci0gICAgICBYU01vZGVsIHNjaGVtYSA9IHhzZHZhbGlkYXRvci5nZXRYU01vZGVsKCk7Ci0gICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjaGVtYXMuYWRkKHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgIC8vIGFkZFJlYWRlcldhcm5pbmcoCi0vLyAgICAgICAgZGVmLAotLy8gICAgICAgIGltcG9ydERlZiwKLS8vICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1VOQUJMRV9UT19JTVBPUlRfSU5WQUxJRCIsICInIiArIGltcG9ydERlZi5nZXRMb2NhdGlvblVSSSgpICsgIiciKSk7Ci0gICAgICBJdGVyYXRvciBlcnJvcnMgPSB4c2R2YWxpZGF0b3IuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFcnJvck1lc3NhZ2UgZXJyID0gKEVycm9yTWVzc2FnZSkgZXJyb3JzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IGVyci5nZXRVUkkoKTsKLSAgICAgICAgaW50IGxpbmUgPSBlcnIuZ2V0RXJyb3JMaW5lKCk7Ci0gICAgICAgIFN0cmluZyBlcnJtZXNzID0gZXJyLmdldEVycm9yTWVzc2FnZSgpOwotICAgICAgICB2YWxpbmZvLmFkZEVycm9yKGVycm1lc3MsIGxpbmUsIGVyci5nZXRFcnJvckNvbHVtbigpLCB1cmkpOwotICAgICAgfQotICAgIH0KLSAgICBpbXBvcnRpbmdXU0RMRG9jLmFkZFNjaGVtYXMoc2NoZW1hcyk7Ci0gICAgcmV0dXJuIGltcG9ydERlZjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgaW1wb3J0IGVsZW1lbnQgaWYgaXQgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGltcG9ydCBlbGVtZW50IGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgb3IgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBJbXBvcnQgZ2V0SW1wb3J0KCkKLSAgewotICAgIHJldHVybiBpbXBvcnREZWY7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgYSBuZXcgaW1wb3J0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgbmV3IGltcG9ydCBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSBJbXBvcnQgZ2V0TmV3SW1wb3J0KCkKLSAgewotICAgIGlmKGltcG9ydEludmFsaWQpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIEltcG9ydCBpbXBvcnREZWYgPSBpbXBvcnRpbmdEZWYuY3JlYXRlSW1wb3J0KCk7IAotICAgIAotICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbXBvcnREZWYuc2V0TmFtZXNwYWNlVVJJKG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaW1wb3J0RGVmLnNldExvY2F0aW9uVVJJKGxvY2F0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgaWYoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoZWxlbWVudCk7Ci0KLSAgICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbXBvcnREZWYuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBpbXBvcnREZWY7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHNjaGVtYXMgY29ycmVzcG9uZGluZyB0byB0aGlzIGltcG9ydC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHNjaGVtYXMgY29ycmVzcG9uZGluZyB0byB0aGlzIGltcG9ydC4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFNjaGVtYXMoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbXBvcnQgaW1wb3J0cyBhIFdTREwgZG9jdW1lbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGltcG9ydCBpbXBvcnRzIGEgV1NETCBkb2N1bWVudCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXU0RMRmlsZUltcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gaXNXU0RMRmlsZUltcG9ydDsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgewotICAgIGlmKG9iai5nZXRDbGFzcygpID09IEltcG9ydEhvbGRlci5jbGFzcykKLSAgICB7Ci0gICAgICBJbXBvcnRIb2xkZXIgb3RoZXJJbXBvcnQgPSAoSW1wb3J0SG9sZGVyKW9iajsKLSAgICAgIAotICAgICAgaWYoZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG90aGVySW1wb3J0LmdldE5hbWVzcGFjZSgpKSAmJiBnZXRMb2NhdGlvbigpLmVxdWFscyhvdGhlckltcG9ydC5nZXRMb2NhdGlvbigpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG9iaikKLSAgewotICAgIGlmKG9iaiA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBJbXBvcnRIb2xkZXIgb3RoZXJJbXBvcnQgPSAoSW1wb3J0SG9sZGVyKW9iajsKLSAgICAgIAotICAgIHJldHVybiAoZ2V0TmFtZXNwYWNlKCkrZ2V0TG9jYXRpb24oKSkuY29tcGFyZVRvKChvdGhlckltcG9ydC5nZXROYW1lc3BhY2UoKStvdGhlckltcG9ydC5nZXRMb2NhdGlvbigpKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIG1lc3NhZ2VnZW5lcmF0b3IgZm9yIHRoZSBpbXBvcnQgaG9sZGVyLgotICAgKiAKLSAgICogQHBhcmFtIG1nIFRoZSBtZXNzYWdlIGdlbmVyYXRvciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlR2VuZXJhdG9yKE1lc3NhZ2VHZW5lcmF0b3IgbWcpCi0gIHsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbWc7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW1wb3J0IGlzIGludmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgaW1wb3J0IGlzIGludmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSW1wb3J0SW52YWxpZCgpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0SW52YWxpZDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvTG9jYXRpb25Ib2xkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvTG9jYXRpb25Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlZjMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0xvY2F0aW9uSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLS8qKgotICogSG9sZHMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBhbiBlbGVtZW50IGluIGEgZG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhdGlvbkhvbGRlcgotewotICBwcml2YXRlIGludCBsaW5lOwotICBwcml2YXRlIGludCBjb2x1bW47Ci0gIHByaXZhdGUgU3RyaW5nIHVyaTsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIG51bWJlci4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIG51bWJlci4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBMb2NhdGlvbkhvbGRlcihpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIHRoaXMubGluZSA9IGxpbmU7Ci0gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0gICAgdGhpcy51cmkgPSB1cmk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpbmUgbnVtYmVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGluZSBudW1iZXIuCi0gICAqLwotICBwdWJsaWMgaW50IGdldExpbmUoKQotICB7Ci0gICAgcmV0dXJuIGxpbmU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbHVtbiBudW1iZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW4oKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZmlsZSBVUkkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBmaWxlIFVSSS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvUmVhZGVyRXJyb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvUmVhZGVyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiNGU0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1JlYWRlckVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLS8qKgotICogSG9sZHMgYW4gZXJyb3IgY3JlYXRlZCB3aGVuIHJlYWRpbmcgYSBXU0RMIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgUmVhZGVyRXJyb3IKLXsKLSAgcHJvdGVjdGVkIE9iamVjdCBwYXJlbnRPYmplY3Q7IC8vIHRoZSBvYmplY3Qgb2YgdGhlIHBhcmVudCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yCi0gIHByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OyAvLyB0aGUgb2JqZWN0IHRoZSBlcnJvciBpcyBhc3NvY2lhdGVkIHdpdGgKLSAgcHJvdGVjdGVkIFN0cmluZyBlcnJvcjsgLy8gdGhlIGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IAotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRPYmplY3QgdGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvcgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IKLSAgICogQHBhcmFtIGVycm9yIHRoZSBlcnJvcgotICAgKi8KLSAgcHVibGljIFJlYWRlckVycm9yKE9iamVjdCBwYXJlbnRPYmplY3QsIE9iamVjdCBvYmplY3QsIFN0cmluZyBlcnJvcikKLSAgewotICAgIHRoaXMucGFyZW50T2JqZWN0ID0gcGFyZW50T2JqZWN0OwotICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBwYXJlbnRPYmplY3Q7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gb2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkKLSAgewotICAgIHJldHVybiBlcnJvcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQ4NGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvVmFsaWRhdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0KLS8qKgotICogQSByZWdpc3RyeSB0byBob2xkIGFsbCB0aGUgV1NETCAxLjEgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5Ci17Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSB2ZXJJbnN0YW5jZTsKLQotICBwcm90ZWN0ZWQgTWFwIHZhbGlkYXRvclJlZyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmICh2ZXJJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZlckluc3RhbmNlID0gbmV3IFZhbGlkYXRvclJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiB2ZXJJbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGlzIHZhbGlkYXRvciBkZWxlZ2F0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAqIEBwYXJhbSB2YWxEZWxlZ2F0ZSBUaGUgdmFsaWRhdG9yIGRlbGVnYXRlIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgdmFsRGVsZWdhdGUpCi0gIHsKLSAgICAvLyBhbGxvdyB0aGUgbnVsbCBuYW1lc3BhY2UgYnV0IG1ha2UgaXQgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIHZhbGlkYXRvciB0byB0aGUgaGFzaHRhYmxlCi0gICAgaWYoIXZhbGlkYXRvclJlZy5jb250YWluc0tleShuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIHZhbGlkYXRvclJlZy5wdXQobmFtZXNwYWNlLCBuZXcgV1NETDExVmFsaWRhdG9yRGVsZWdhdGVDb250YWluZXIoKSk7Ci0gICAgfQotICAgICgoV1NETDExVmFsaWRhdG9yRGVsZWdhdGVDb250YWluZXIpdmFsaWRhdG9yUmVnLmdldChuYW1lc3BhY2UpKS5hZGRWYWxpZGF0b3IodmFsRGVsZWdhdGUpOwotICAgIC8vdmFsaWRhdG9yUmVnLnB1dChuYW1lc3BhY2UsIHZhbERlbGVnYXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc2sgZm9yIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlLiBJZiBub25lIGlzIGZvdW5kCi0gICAqIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEByZXR1cm4gVGhlIFdTREwgMS4xIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBJV1NETDExVmFsaWRhdG9yIHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIGlmIHRoZSBuYW1lc3BhY2UgaXMgbnVsbCBhbGxvdyBpdCBhbmQgdHJlYXQgaXQgYXMgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0gICAgcmV0dXJuIChJV1NETDExVmFsaWRhdG9yKXZhbGlkYXRvclJlZy5nZXQobmFtZXNwYWNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCB0ZWxscyB3aGV0aGVyIGEgdmFsaWRhdG9yIGZvciBhIGdpdmVuIG5hbWVzcGFjZSBpcyByZWdpc3RlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRvIGNoZWNrLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYSB2YWxpZGF0b3IgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVnaXN0ZXJlZFZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgaWYgKHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkobmFtZXNwYWNlKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBjbGFzcyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZUNvbnRhaW5lciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLSAgewotCXByaXZhdGUgTGlzdCB2YWxpZGF0b3JEZWxlZ2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHVibGljIHZvaWQgYWRkVmFsaWRhdG9yKFdTREwxMVZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlKQotCXsKLQkgIHZhbGlkYXRvckRlbGVnYXRlcy5hZGQoZGVsZWdhdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKSB7Ci0JCS8vTm90aGluZyB0byBkbwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykgewotCQlJdGVyYXRvciB2YWxEZWxJdGVyID0gdmFsaWRhdG9yRGVsZWdhdGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKHZhbERlbEl0ZXIuaGFzTmV4dCgpKQotCQl7Ci0JCSAgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSAoV1NETDExVmFsaWRhdG9yRGVsZWdhdGUpdmFsRGVsSXRlci5uZXh0KCk7Ci0JCSAgZGVsZWdhdGUuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGUoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0JCX0KLQkJCi0JfQotCSAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExQmFzaWNWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExQmFzaWNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwNDA1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMUJhc2ljVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2QuU2NoZW1hQXR0cmlidXRlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkLlhTRFZhbGlkYXRvcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0vKioKLSAqIFZhbGlkYXRlIHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIGEgV1NETCAxLjEgRG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMTFCYXNpY1ZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEVfTkFNRSA9ICJ2YWxpZGF0ZXdzZGwiOwotCQotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZVTExfQ0hFQ0tJTkdfRkVBVFVSRV9JRCA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYS1mdWxsLWNoZWNraW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBDT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNPQVBfRU5DT0RJTkdfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKLSAgCi0gIC8vIEVycm9yIGFuZCBXYXJuaW5nIEtleXMKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1BPUlRfTkFNRV9OT1RfVU5JUVVFID0gIl9QT1JUX05BTUVfTk9UX1VOSVFVRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9OT19CSU5ESU5HX0ZPUl9QT1JUID0gIl9OT19CSU5ESU5HX0ZPUl9QT1JUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX05PX0FERFJFU1NfUE9SVCA9ICJfTk9fQUREUkVTU19QT1JUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX01PUkVfVEhFTl9PTkVfQUREUkVTU19QT1JUID0gIl9NT1JFX1RIRU5fT05FX0FERFJFU1NfUE9SVCI7IC8vVE9ETyBzaG91bGQgYmUgX01PUkVfVEhBTl9PTkVfQUREUkVTU19QT1JULCBub3QgVEhFTgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUE9SVFRZUEVfVU5ERUZJTkVEX0ZPUl9CSU5ESU5HID0gIl9QT1JUVFlQRV9VTkRFRklORURfRk9SX0JJTkRJTkciOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUgPSAiX09QRVJBVElPTl9VTkRFRklORURfRk9SX1BPUlRUWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQgPSAiX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfSU5QVVRfTkFNRV9OT1RfVU5JUVVFID0gIl9JTlBVVF9OQU1FX05PVF9VTklRVUUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVUID0gIl9NRVNTQUdFX1VOREVGSU5FRF9GT1JfSU5QVVQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfT1VUUFVUX05BTUVfTk9UX1VOSVFVRSA9ICJfT1VUUFVUX05BTUVfTk9UX1VOSVFVRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfT1VUUFVUID0gIl9NRVNTQUdFX1VOREVGSU5FRF9GT1JfT1VUUFVUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCA9ICJfTUVTU0FHRV9VTkRFRklORURfRk9SX0ZBVUxUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1BBUlRfTk9fRUxFTUVOVF9PUl9UWVBFID0gIl9QQVJUX05PX0VMRU1FTlRfT1JfVFlQRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9QQVJUX0JPVEhfRUxFTUVOVF9BTkRfVFlQRSA9ICJfUEFSVF9CT1RIX0VMRU1FTlRfQU5EX1RZUEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUEFSVF9JTlZBTElEX0VMRU1FTlQgPSAiX1BBUlRfSU5WQUxJRF9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1BBUlRfSU5WQUxJRF9UWVBFID0gIl9QQVJUX0lOVkFMSURfVFlQRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9XQVJOX1NPQVBFTkNfSU1QT1JURURfUEFSVCA9ICJfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1BBUlQiOwotCi0gIHByaXZhdGUgZmluYWwgaW50IEVMRU1FTlQgPSAwOwotICBwcml2YXRlIGZpbmFsIGludCBUWVBFID0gMTsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJFUVVFU1QgPSAiUmVxdWVzdCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJFU1BPTlNFID0gIlJlc3BvbnNlIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiJyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotICAKLQotICAvL3Byb3RlY3RlZCBXU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyIHZhbGlkYXRvcmNvbnRyb2xsZXI7Ci0gIHByb3RlY3RlZCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3I7Ci0KLSAgcHVibGljIFdTREwxMUJhc2ljVmFsaWRhdG9yKCkKLSAgewotCVJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEVfTkFNRSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgfQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIC8vdGhpcy52YWxpZGF0b3Jjb250cm9sbGVyID0gdmFsaWRhdG9yY29udHJvbGxlcjsKLSAgICAvL3NldERlZmF1bHRSZXNvdXJjZUJ1bmRsZUlmTmVlZGVkKHZhbGlkYXRvcmNvbnRyb2xsZXIpOwotICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSAoRGVmaW5pdGlvbillbGVtZW50OwotICAgIHZhbGlkYXRlVHlwZXMod3NkbERlZmluaXRpb24sIHZhbEluZm8pOwotICAgIHZhbGlkYXRlU2VydmljZXMod3NkbERlZmluaXRpb24sIHZhbEluZm8pOwotICAgIHZhbGlkYXRlQmluZGluZ3Mod3NkbERlZmluaXRpb24sIHZhbEluZm8pOwotICAgIHZhbGlkYXRlUG9ydFR5cGVzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKLSAgICB2YWxpZGF0ZU1lc3NhZ2VzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFRha2VzIGEgbGlzdCBvZiBFeHRlbnNpYmlsaXR5RWxlbWVudHMgYW5kIGNoZWNrcyBpZiB0aGVyZSdzIGEgdmFsaWRhdG9yIAotICAgKiBhc3NvY2lhdGVkIHdpdGggZWFjaCBlbGVtZW50IGFuZCBpZiBzbyBjYWxscyB0aGUgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudHMgVGhlIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBleHRlbnNpYmlsaXR5RWxlbWVudHMgVGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlci4KLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBkZWZuaW50aW9ucyBlbGVtZW50IGZvciB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QoCi0gICAgTGlzdCBwYXJlbnRzLAotICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLAotICAgIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgVmFsaWRhdG9yUmVnaXN0cnkgdmVyID0gVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBJdGVyYXRvciBleHRFbGVtcyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChleHRFbGVtcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgSVdTREwxMVZhbGlkYXRvciB2YWwgPSB2ZXIucXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UpOwotICAgICAgaWYgKHZhbCAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgdmFsLnZhbGlkYXRlKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgICB7Ci0vLyAgICAgICAgdmFsSW5mby5hZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IobmFtZXNwYWNlKTsKLS8vICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCB0aGUgVHlwZXMgZWxlbWVudCBpcyBjb3JyZWN0LiAKLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmcm9tIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICAgKi8KLQotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVR5cGVzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSB3c2RsRGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgIC8vIGVuc3VyZSB0aGF0IHR5cGVzIGlzIGRlZmluZWQKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBwYXJlbnRzLmFkZCh3c2RsRGVmaW5pdGlvbik7Ci0gICAgICBwYXJlbnRzLmFkZCgwLCB0eXBlcyk7Ci0gICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIGFsbCBvZiB0aGUgZGVjbGFyZWQgc2VydmljZXMgZm9yIHRoZSBkZWZpbml0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNlcnZpY2VzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgaWYgKHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2VzKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBPYmplY3Qgc2VydmljZXNbXSA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkudG9BcnJheSgpOwotICAgIExpc3QgcGFyZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwYXJlbnRzLmFkZCh3c2RsRGVmaW5pdGlvbik7Ci0gICAgSGFzaHRhYmxlIGFsbFBvcnRzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLy9UT0RPOiBjaGVjayB0aGF0IHBvcnRzIGluIG90aGVyIGltcG9ydGVkIGZpbGVzIGRvbid0IGNvbmZsaWN0IHdpdGggcG9ydHMgaW4gdGhpcyBvbmUKLSAgICAvLyAgICAvLyByZWdpc3RlciBhbGwgb2YgdGhlIGltcG9ydGVkIHBvcnRzCi0gICAgLy8gICAgSXRlcmF0b3IgaW1wb3J0cyA9IHdzZGxEZWZpbml0aW9uLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIC8vICAgIHdoaWxlKGltcG9ydHMuaGFzTmV4dCgpKQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgIEl0ZXJhdG9yIGltcHNlcnZpY2VzID0gKChJbXBvcnQpaW1wb3J0cy5uZXh0KCkpLmdldERlZmluaXRpb24oKS5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gICAgICB3aGlsZShpbXBzZXJ2aWNlcy5oYXNOZXh0KCkpCi0gICAgLy8gICAgICB7Ci0gICAgLy8gICAgICAgIEl0ZXJhdG9yIGltcHBvcnRzID0gKChTZXJ2aWNlKWltcHNlcnZpY2VzLm5leHQoKSkuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIC8vICAgICAgICB3aGlsZShpbXBwb3J0cy5oYXNOZXh0KCkpCi0gICAgLy8gICAgICAgIHsKLSAgICAvLyAgICAgICAgICBQb3J0IHRlbXBQID0gKFBvcnQpaW1wcG9ydHMubmV4dCgpOwotICAgIC8vICAgICAgICAgIGFsbFBvcnRzLnB1dCh0ZW1wUC5nZXROYW1lKCksdGVtcFApOwkKLSAgICAvLyAgICAgICAgfQotICAgIC8vICAgICAgfQotICAgIC8vICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFNlcnZpY2UgcyA9IChTZXJ2aWNlKXNlcnZpY2VzW2ldOwotICAgICAgcGFyZW50cy5hZGQoMCwgcyk7Ci0gICAgICBPYmplY3QgcG9ydHNbXSA9IHMuZ2V0UG9ydHMoKS52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBQb3J0IHAgPSAoUG9ydClwb3J0c1tqXTsKLSAgICAgICAgcGFyZW50cy5hZGQoMCwgcCk7Ci0gICAgICAgIC8vIGEgUG9ydCBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIFdEU0wgZG9jdW1lbnQKLSAgICAgICAgaWYgKGFsbFBvcnRzLmNvbnRhaW5zKHAuZ2V0TmFtZSgpKSkKLSAgICAgICAgeyAgU3RyaW5nW10gYXJncyA9IHtwLmdldE5hbWUoKX07Ci0gICAgICAgICAgCi0gICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfUE9SVF9OQU1FX05PVF9VTklRVUUsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBfUE9SVF9OQU1FX05PVF9VTklRVUUsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFsbFBvcnRzLnB1dChwLmdldE5hbWUoKSwgcCk7Ci0KLSAgICAgICAgICAvLyBnZXQgdGhlIGJpbmRpbmcgZm9yIHRoaXMgcG9ydCBhbmQgc2VlIGlmIHRoZSBQb3J0VHlwZSBmb3IgdGhlIGJpbmRpbmcKLSAgICAgICAgICAvLyBpcyBkZWZpbmVkCi0gICAgICAgICAgaWYgKHAuZ2V0QmluZGluZygpID09IG51bGwgfHwgcC5nZXRCaW5kaW5nKCkuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ05hbWUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgICAgICAgICBpZiAocC5nZXRCaW5kaW5nKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmluZGluZ05hbWUgPSBwLmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGFyZ3NbXSA9IHtwLmdldE5hbWUoKX07Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTk9fQklORElOR19GT1JfUE9SVCwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUsIFFVT1RFICsgYmluZGluZ05hbWUgKyBRVU9URSksCi0gICAgICAgICAgICAgIHAsIF9OT19CSU5ESU5HX0ZPUl9QT1JULCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRoYXQgdGhlIG91dHB1dCBvZiBvbmUgcG9ydCBpc24ndCB0aGUgaW5wdXQgb2YgYW5vdGhlciBhbmQgdmljZSB2ZXJzYQotICAgICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGUgcG9ydAotICAgICAgICAgICAgLy8gdGhlcmUgY2FuIG9ubHkgYmUgb25lIGFuZCBtdXN0IGJlIG9uZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgZGVmaW5lZCBmb3IgYSBwb3J0Ci0gICAgICAgICAgICBMaXN0IGV4dGVsZW1zID0gcC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGlmIChleHRlbGVtcy5zaXplKCkgPCAxKQotICAgICAgICAgICAgeyBTdHJpbmcgYXJnc1tdPSB7cC5nZXROYW1lKCl9OwotICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9OT19BRERSRVNTX1BPUlQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgIHAsIF9OT19BRERSRVNTX1BPUlQsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZWxlbXMuc2l6ZSgpID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDE7IGsgPCBleHRlbGVtcy5zaXplKCk7IGsrKykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7cC5nZXROYW1lKCl9OwotICAgICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTU9SRV9USEVOX09ORV9BRERSRVNTX1BPUlQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgIGV4dGVsZW1zLmdldChrKSwgX01PUkVfVEhFTl9PTkVfQUREUkVTU19QT1JULCBhcmdzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgcC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICB9Ci0gICAgICAvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciB0aGUgc2VydmljZQotICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIGJpbmRpbmdzIHJlZmVyIHRvIHZhbGlkIFBvcnRUeXBlcyBhbmQgYWxsIG9mIHRoZSBvcGVyYXRpb25zCi0gIC8vIGluIGEgZ2l2ZW4gYmluZGluZyByZWZlciB0byBhIGRlZmluZWQgb3BlcmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZwotICAvLyBQb3J0VHlwZS4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCaW5kaW5ncyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIGlmICh3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgT2JqZWN0IGJpbmRpbmdzW10gPSB3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpLnZhbHVlcygpLnRvQXJyYXkoKTsKLSAgICBMaXN0IHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcGFyZW50cy5hZGQod3NkbERlZmluaXRpb24pOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQmluZGluZyBiID0gKEJpbmRpbmcpYmluZGluZ3NbaV07Ci0gICAgICBwYXJlbnRzLmFkZCgwLCBiKTsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYi5nZXRQb3J0VHlwZSgpOwotCi0gICAgICBpZiAocG9ydFR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAvLyB0aGUgUG9ydFR5cGUgaXMgbm90IGRlZmluZWQgc28gZG9uJ3QgYm90aGVyIGNoZWNraW5nIHRoZSBvcGVyYXRpb25zCi0gICAgICBpZiAocG9ydFR5cGUuaXNVbmRlZmluZWQoKSkKLSAgICAgIHsgU3RyaW5nW10gYXJncyA9IHtwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCBiLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCl9OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORywKLSAgICAgICAgICAgIFFVT1RFICsgYXJnc1swXSArIFFVT1RFLAotICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzFdICsgUVVPVEUpLAotICAgICAgICAgIGIsIF9QT1JUVFlQRV9VTkRFRklORURfRk9SX0JJTkRJTkcsIGFyZ3MpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyB0aGUgUG9ydFR5cGUgaXMgZGVmaW5lZCBzbyBub3cgd2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBvcGVyYXRpb25zIGFyZSBkZWZpbmVkCi0gICAgICAgIE9iamVjdCBiaW5kaW5nT3BlcmF0aW9uc1tdID0gYi5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLnRvQXJyYXkoKTsKLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgb3BlcmF0aW9uIGlzIGRlZmluZWQgZm9yIGVhY2ggQmluZGluZ09wZXJhdGlvbgotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGJpbmRpbmdPcGVyYXRpb25zLmxlbmd0aDsgaysrKQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBibyA9IChCaW5kaW5nT3BlcmF0aW9uKWJpbmRpbmdPcGVyYXRpb25zW2tdOwotICAgICAgICAgIHBhcmVudHMuYWRkKDAsIGJvKTsKLSAgICAgICAgICBpZiAoYm8uZ2V0T3BlcmF0aW9uKCkgPT0gbnVsbCB8fCBiby5nZXRPcGVyYXRpb24oKS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7Yi5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpfTsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIF9PUEVSQVRJT05fVU5ERUZJTkVEX0ZPUl9QT1JUVFlQRSwKLSAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSwKLSAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMV0gKyBRVU9URSksCi0gICAgICAgICAgICAgIGJvLCBfT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUsIGFyZ3MpOwotICAgICAgICAgICAgLy8gbmljZSBpZGVhIHRvIGFkZCBzdWdnZXN0aW9ucyB0byBvdGhlciBlbGVtZW50cyB0byBmaXggdGhlIGVycm9yCi0gICAgICAgICAgICAvLyBidXQgaXQgZG9lc24ndCB3b3JrIHdpdGggbXVsdGlwZSBmaWxlcyBsaWtlIHRoaXMKLSAgICAgICAgICAgIC8vYWRkVmFsaWRhdGlvbk1lc3NhZ2Uod2FybmluZ0xpc3QscG9ydFR5cGUscG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICJEZWZpbmUgYW4gb3BlcmF0aW9uIGhlcmUgdG8gY29ycmVzcG9uZCB3aXRoIHRoZSBvcGVyYXRpb24gaW46ICIgKyBiby5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgYWxsIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiwgYmluZGluZyBpbnB1dHMsIG91dHB1dHMgYW5kIGZhdWx0cwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBCaW5kaW5nSW5wdXQgYmlucHV0ID0gYm8uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgICAgICBpZiAoYmlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBhcmVudHMuYWRkKDAsIGJpbnB1dCk7Ci0gICAgICAgICAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIGJpbmRpbmcgb3BlcmF0aW9uIGlucHV0Ci0gICAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KAotICAgICAgICAgICAgICAgIHBhcmVudHMsCi0gICAgICAgICAgICAgICAgYm8uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgdmFsSW5mbyk7Ci0gICAgICAgICAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmluZGluZ091dHB1dCBib3V0cHV0ID0gYm8uZ2V0QmluZGluZ091dHB1dCgpOwotICAgICAgICAgICAgaWYgKGJvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFyZW50cy5hZGQoMCwgYm91dHB1dCk7Ci0gICAgICAgICAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIGJpbmRpbmcgb3BlcmF0aW9uIG91dHB1dAotICAgICAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdCgKLSAgICAgICAgICAgICAgICBwYXJlbnRzLAotICAgICAgICAgICAgICAgIGJvLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICB2YWxJbmZvKTsKLSAgICAgICAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBubyBpbnB1dCBvciBvdXRwdXQgaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhlIG9wZXJhdGlvbgotICAgICAgICAgICAgaWYgKGJpbnB1dCA9PSBudWxsICYmIGJvdXRwdXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsgU3RyaW5nW10gYXJncyA9IHsgYm8uZ2V0TmFtZSgpIH07Ci0gICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICBibywgX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgZWFjaCBiaW5kaW5nIG9wZXJhdGlvbiBmYXVsdAotICAgICAgICAgICAgSXRlcmF0b3IgZmF1bHRzID0gYm8uZ2V0QmluZGluZ0ZhdWx0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZmF1bHRzLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQmluZGluZ0ZhdWx0IGJmID0gKEJpbmRpbmdGYXVsdClmYXVsdHMubmV4dCgpOwotICAgICAgICAgICAgICBwYXJlbnRzLmFkZCgwLCBiZik7Ci0gICAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KHBhcmVudHMsIGJmLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB2YWxJbmZvKTsKLSAgICAgICAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIGJpbmRpbmcgb3BlcmF0aW9uCi0gICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgYm8uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHZhbEluZm8pOwotICAgICAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciB0aGUgYmluZGluZwotICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgYi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IGFsbCBvZiB0aGUgUG9ydFR5cGVzIGhhdmUgdmFsaWQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZWlyCi0gIC8vIG9wZXJhdGlvbiBpbnB1dCwgb3V0cHV0IGFuZCBmYXVsdCB0eXBlcy4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQb3J0VHlwZXMoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBpZiAod3NkbERlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBPYmplY3QgcG9ydHR5cGVzW10gPSB3c2RsRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKS52YWx1ZXMoKS50b0FycmF5KCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvcnR0eXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwID0gKFBvcnRUeXBlKXBvcnR0eXBlc1tpXTsKLSAgICAgIE9iamVjdCBvcGVyYXRpb25zW10gPSBwLmdldE9wZXJhdGlvbnMoKS50b0FycmF5KCk7Ci0gICAgICBMaXN0IGluQW5kT3V0TmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9wZXJhdGlvbnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBvID0gKE9wZXJhdGlvbilvcGVyYXRpb25zW2pdOwotICAgICAgICBpZiAobyA9PSBudWxsIHx8IG8uaXNVbmRlZmluZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbWVzc2FnZXMgYXJlIGRlZmluZWQgZm9yIHRoZSBpbnB1dCwgb3V0cHV0IGFuZCBmYXVsdHMKLSAgICAgICAgTWVzc2FnZSBtOwotICAgICAgICBJbnB1dCBpbnB1dCA9IG8uZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgaW5wdXROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotICAgICAgICAgIC8vIGlmIHRoZSBuYW1lIGlzbid0IGRlZmluZWQgaXQgZGVmYXVsdHMgdG8gdGhpcwotICAgICAgICAgIGlmIChpbnB1dE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dE5hbWUgPSBvLmdldE5hbWUoKSArIFJFUVVFU1Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpbkFuZE91dE5hbWVzLmNvbnRhaW5zKGlucHV0TmFtZSkpCi0gICAgICAgICAgeyBTdHJpbmdbXSBhcmdzID0ge2lucHV0TmFtZSwgcC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpIH07Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBfSU5QVVRfTkFNRV9OT1RfVU5JUVVFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1swXSArIFFVT1RFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1sxXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgaW5wdXQsIF9JTlBVVF9OQU1FX05PVF9VTklRVUUsIGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5BbmRPdXROYW1lcy5hZGQoaW5wdXROYW1lKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtID0gaW5wdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzTmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIFFOYW1lIG1lc3NRTmFtZSA9IG0uZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChtZXNzUU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzc05hbWUgPSBtZXNzUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0ge21lc3NOYW1lfTsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9JTlBVVCwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgIGlucHV0LCBfTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVULCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgT3V0cHV0IG91dHB1dCA9IG8uZ2V0T3V0cHV0KCk7Ci0gICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAvLyBpZiB0aGUgbmFtZSBpc24ndCBkZWZpbmVkIGl0IGRlZmF1bHRzIHRvIHRoaXMKLSAgICAgICAgICBpZiAob3V0cHV0TmFtZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dE5hbWUgPSBvLmdldE5hbWUoKSArIFJFU1BPTlNFOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChpbkFuZE91dE5hbWVzLmNvbnRhaW5zKG91dHB1dE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7b3V0cHV0TmFtZSwgcC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpfTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgX09VVFBVVF9OQU1FX05PVF9VTklRVUUsCi0gICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUsCi0gICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzFdICsgUVVPVEUpLAotICAgICAgICAgICAgICBvdXRwdXQsIF9PVVRQVVRfTkFNRV9OT1RfVU5JUVVFLCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluQW5kT3V0TmFtZXMuYWRkKG91dHB1dE5hbWUpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG0gPSBvdXRwdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzTmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIFFOYW1lIG1lc3NRTmFtZSA9IG0uZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChtZXNzUU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzc05hbWUgPSBtZXNzUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0ge21lc3NOYW1lfTsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9PVVRQVVQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICBvdXRwdXQsIF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfT1VUUFVULCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZmF1bHRzW10gPSBvLmdldEZhdWx0cygpLnZhbHVlcygpLnRvQXJyYXkoKTsKLQotICAgICAgICAvL0xpc3QgZmF1bHROYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBmYXVsdHMubGVuZ3RoOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICBGYXVsdCBmID0gKEZhdWx0KWZhdWx0c1trXTsKLSAgICAgICAgICBtID0gZi5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NOYW1lID0gRU1QVFlfU1RSSU5HOwotICAgICAgICAgICAgUU5hbWUgbWVzc1FOYW1lID0gbS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKG1lc3NRTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZXNzTmFtZSA9IG1lc3NRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBhcmdzW10gPSB7bWVzc05hbWV9OwotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTUVTU0FHRV9VTkRFRklORURfRk9SX0ZBVUxULCBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSksCi0gICAgICAgICAgICAgICAgZiwgX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCwgYXJncyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgYWxsIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50IGFyZSB2YWxpZC4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXNzYWdlcyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIGlmICh3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgSXRlcmF0b3IgbWVzc2FnZXMgPSB3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICB3aGlsZSAobWVzc2FnZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbSA9IChNZXNzYWdlKW1lc3NhZ2VzLm5leHQoKTsKLSAgICAgIGlmICghbS5pc1VuZGVmaW5lZCgpKQotICAgICAgewotICAgICAgICAvLyBpZiB0aGUgbWVzc2FnZSBoYXMgYSBwYXJ0IChhbmQgaXQgZG9lc24ndCBoYXZlIHRvKQotICAgICAgICAvLyBlbnN1cmUgZWFjaCBtZXNzYWdlIHBhcnQgaGFzIGVpdGhlciBhbiBlbGVtZW50IG9yIGEgdHlwZQotICAgICAgICBpZiAoIW0uZ2V0UGFydHMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBwYXJ0cyA9IG0uZ2V0UGFydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgUGFydCBwID0gKFBhcnQpcGFydHMubmV4dCgpOwotICAgICAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPSBwLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICBRTmFtZSB0eXBlTmFtZSA9IHAuZ2V0VHlwZU5hbWUoKTsKLSAgICAgICAgICAgIE1hcCBleHRBdHRzID0gcC5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOlRoaXMgd2lsbCBoYXZlIHRvIGJlIGV4dGVuZGVkIGFzIHBhcnRzIGNhbiBoYXZlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgICAgICAgIC8vZW5zdXJlIHRoZSBwYXJ0IGhhcyBhIHR5cGUgb3IgYW4gZWxlbWVudCBkZWZpbmVkCi0gICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUgPT0gbnVsbCAmJiB0eXBlTmFtZSA9PSBudWxsICYmIChleHRBdHRzID09IG51bGwgfHwgZXh0QXR0cy5pc0VtcHR5KCkpKQotICAgICAgICAgICAgeyBTdHJpbmdbXSBhcmdzID0geyBwLmdldE5hbWUoKX07Ci0gICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1BBUlRfTk9fRUxFTUVOVF9PUl9UWVBFLCBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSksCi0gICAgICAgICAgICAgICAgICBwLCBfUEFSVF9OT19FTEVNRU5UX09SX1RZUEUsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9oZXJlIHRoZSBwYXJ0IGhhcyBib3RoIHRoZSBlbGVtZW50IGFuZCB0eXBlIGRlZmluZWQgYW5kIGl0IGNhbiBvbmx5IGhhdmUgb25lIGRlZmluZWQJCi0gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50TmFtZSAhPSBudWxsICYmIHR5cGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7IFN0cmluZ1tdIGFyZ3MgPSB7cC5nZXROYW1lKCl9OwotICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9QQVJUX0JPVEhfRUxFTUVOVF9BTkRfVFlQRSwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgcCwgX1BBUlRfQk9USF9FTEVNRU5UX0FORF9UWVBFLCBhcmdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghY2hlY2tQYXJ0Q29uc3RpdHVlbnQoZWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgRUxFTUVOVCwKLSAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgIHZhbEluZm8pKQotICAgICAgICAgICAgICB7IFN0cmluZ1tdIGFyZ3MgPSB7cC5nZXROYW1lKCksIGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpfTsKLSAgICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIF9QQVJUX0lOVkFMSURfRUxFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUsCi0gICAgICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1sxXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgIHAsIF9QQVJUX0lOVkFMSURfRUxFTUVOVCwgYXJncyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIHR5cGUgaXRzZWxmIGlzIGRlZmluZWQgcHJvcGVybHkKLSAgICAgICAgICAgICAgaWYgKCFjaGVja1BhcnRDb25zdGl0dWVudCh0eXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgdHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCksIFRZUEUsIHAsIHZhbEluZm8pKQotICAgICAgICAgICAgICB7IFN0cmluZ1tdIGFyZ3MgPSB7cC5nZXROYW1lKCksIHR5cGVOYW1lLmdldExvY2FsUGFydCgpIH07IAotICAgICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgX1BBUlRfSU5WQUxJRF9UWVBFLAotICAgICAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSwKLSAgICAgICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzFdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgcCwgX1BBUlRfSU5WQUxJRF9UWVBFLCBhcmdzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBpcyBkZWZpbmVkIGluIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBwYXJ0LiAgQSBwYXJ0IGlzIGFuCi0gICAqIEVMRU1FTlQgb3IgYSBUWVBFLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBjaGVjay4KLSAgICogQHBhcmFtIHBhcnQgVGhlIHBhcnQgdG8gY2hlY2ssIGVpdGhlciBFTEVNRU5UIG9yIFRZUEUuCi0gICAqIEBwYXJhbSBwYXJ0T2JqZWN0IFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBwYXJ0LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBhcnQgZWxlbWVudCBvZiB0eXBlIGlzIGRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrUGFydENvbnN0aXR1ZW50KAotICAgIFN0cmluZyBuYW1lc3BhY2UsCi0gICAgU3RyaW5nIG5hbWUsCi0gICAgaW50IHBhcnQsCi0gICAgUGFydCBwYXJ0T2JqZWN0LAotICAgIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0KLSAgICBib29sZWFuIHBhcnR2YWxpZCA9IGZhbHNlOwotICAgIC8vIEZpcnN0IHRha2UgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlIGl0J3MgZnJvbSB0aGUgc2NoZW1hIG5hbWVzcGFjZS4KLSAgICAvLyBUaGUgMTk5OSwgMjAwMCBhbmQgMjAwMSBzY2hlbWEgbmFtZXNwYWNlcyBhcmUgYWxsIGFjY2VwdGVkLgotICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEpCi0gICAgICB8fCBuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpCi0gICAgICB8fCBuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotICAgIHsKLSAgICAgIFNjaGVtYUF0dHJpYnV0ZVRhYmxlIHhzZFRhYmxlID0gbmV3IFNjaGVtYUF0dHJpYnV0ZVRhYmxlKCk7Ci0gICAgICBpZiAoeHNkVGFibGUuY29udGFpbnNTeW1ib2wobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHBhcnR2YWxpZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGNoZWNrIGlubGluZSBhbmQgaW1wb3J0ZWQgc2NoZW1hCi0gICAgZWxzZQotICAgIHsKLSAgICAgIFhTTW9kZWxbXSBzY2hlbWFzID0gdmFsSW5mby5nZXRTY2hlbWFzKCk7Ci0gICAgICBpbnQgbnVtU2NoZW1hcyA9IHNjaGVtYXMubGVuZ3RoOwotICAgICAgLy9JdGVyYXRvciBzY2hlbWFzSXRlciA9IHNjaGVtYXMuaXRlcmF0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2NoZW1hczsgaSsrKQotICAgICAgewotICAgICAgICBYU01vZGVsIHNjaGVtYSA9IHNjaGVtYXNbaV07Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwYXJ0ID09IEVMRU1FTlQgJiYgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbihuYW1lLCBuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChwYXJ0ID09IFRZUEUgJiYgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9uKG5hbWUsIG5hbWVzcGFjZSkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIElmIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IGltcG9ydGVkIGRvIHNvCi0JLy8gbm93LgotICAgIC8vIEFsbG93IHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSB0byBiZSBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIGJ1dCBtYXJrCi0JLy8gaXQgYXMgYSB3YXJuaW5nLgotICAgIGlmICghcGFydHZhbGlkICYmIG5hbWVzcGFjZS5lcXVhbHMoU09BUF9FTkNPRElOR19VUkkpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBYU0RWYWxpZGF0b3IgeHNkVmFsID0gbmV3IFhTRFZhbGlkYXRvcigpOwotICAgICAgICBTdHJpbmcgc29hcEVuYyA9IHZhbEluZm8uZ2V0VVJJUmVzb2x2ZXIoKS5yZXNvbHZlKCIiLCBTT0FQX0VOQ09ESU5HX1VSSSwgbnVsbCkuZ2V0UGh5c2ljYWxMb2NhdGlvbigpOwotICAgICAgICBpZihzb2FwRW5jICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RWYWwudmFsaWRhdGUoc29hcEVuYywgbnVsbCwgdmFsSW5mby5nZXRTY2hlbWFDYWNoZSgpKTsKLSAgICAgICAgICAvLyBzYW5pdHkgY2hlY2sgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZwotICAgICAgICAgIGlmICh4c2RWYWwuaXNWYWxpZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTTW9kZWwgeHNNb2RlbCA9IHhzZFZhbC5nZXRYU01vZGVsKCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJ0ID09IEVMRU1FTlQgJiYgeHNNb2RlbC5nZXRFbGVtZW50RGVjbGFyYXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFydCA9PSBUWVBFICYmIHhzTW9kZWwuZ2V0VHlwZURlZmluaXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX1NPQVBFTkNfSU1QT1JURURfUEFSVCwgUVVPVEUgKyBuYW1lICsgUVVPVEUpLCBwYXJ0T2JqZWN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAJTG9nZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvZ2dlcigpLmxvZygiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHBlcmZvcm1pbmcgV1NETCB2YWxpZGF0aW9uIG9mIGEgcGFydCB3aXRoIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZS4iLCBJTG9nZ2VyLlNFVl9FUlJPUiwgZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwYXJ0dmFsaWQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0aW9uSW5mb0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExVmFsaWRhdGlvbkluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMThjMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0aW9uSW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hclBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25JbmZvSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyOwotCi0vKioKLSAqIEFuIGltcGxlbWVuYXRpb24gb2YgV1NETDExVmFsaWRhdGlvbkluZm8uCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMTFWYWxpZGF0aW9uSW5mb0ltcGwgaW1wbGVtZW50cyBJV1NETDExVmFsaWRhdGlvbkluZm8KLXsKLSAgcHJpdmF0ZSBJVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG51bGw7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGVsZW1lbnRsb2NhdGlvbnMgPSBudWxsOwotICBwcml2YXRlIExpc3Qgc2NoZW1hcyA9IG5ldyBWZWN0b3IoKTsKLSAgCi0gIHB1YmxpYyBXU0RMMTFWYWxpZGF0aW9uSW5mb0ltcGwoSVZhbGlkYXRpb25JbmZvIHZhbGluZm8pCi0gIHsKLSAgICB0aGlzLnZhbGluZm8gPSB2YWxpbmZvOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNnZXRGaWxlVVJJKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaW5mby5nZXRGaWxlVVJJKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jYWRkU2NoZW1hKG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWwpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTY2hlbWEoWFNNb2RlbCB4c01vZGVsKQotICB7Ci0gICAgaWYgKHhzTW9kZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzY2hlbWFzLmFkZCh4c01vZGVsKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNnZXRTY2hlbWFzKCkKLSAgICovCi0gIHB1YmxpYyBYU01vZGVsW10gZ2V0U2NoZW1hcygpCi0gIHsKLSAgICByZXR1cm4gKFhTTW9kZWxbXSlzY2hlbWFzLnRvQXJyYXkobmV3IFhTTW9kZWxbc2NoZW1hcy5zaXplKCldKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbyNjbGVhcmRTY2hlbWFzKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyU2NoZW1hcygpCi0gIHsKLSAgICBzY2hlbWFzLmNsZWFyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvI3NldEVsZW1lbnRMb2NhdGlvbnMoamF2YS51dGlsLkhhc2h0YWJsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRMb2NhdGlvbnMoSGFzaHRhYmxlIGVsZW1lbnRMb2NhdGlvbnMpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnRsb2NhdGlvbnMgPSBlbGVtZW50TG9jYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvI2FkZEVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBhZGRFcnJvcihtZXNzYWdlLCBlbGVtZW50LCBudWxsLCBudWxsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvI2FkZEVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZWxlbWVudCwgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7Ci0gICAgTG9jYXRpb25Ib2xkZXIgbG9jYXRpb247Ci0gICAgaWYgKGVsZW1lbnRsb2NhdGlvbnMuY29udGFpbnNLZXkoZWxlbWVudCkpCi0gICAgewotICAgICAgbG9jYXRpb24gPSAoTG9jYXRpb25Ib2xkZXIpZWxlbWVudGxvY2F0aW9ucy5nZXQoZWxlbWVudCk7Ci0gICAgICBhZGRFcnJvcihtZXNzYWdlLCBsb2NhdGlvbi5nZXRMaW5lKCksIGxvY2F0aW9uLmdldENvbHVtbigpLCBsb2NhdGlvbi5nZXRVUkkoKSwgZXJyb3JLZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgIH0KLSAgICAvLyBpZiB3ZSBnaXZlIGl0IGFuIGVsZW1lbnQgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkIHdlJ2xsIHNldCB0aGUgbG9jYXRpb24KLSAgICAvLyBhdCAoMCwwKSBzbyB0aGUgZXJyb3Igc2hvd3MgdXAgYnV0IG5vIGxpbmUgbWFya2VyIGluIHRoZSBlZGl0b3IKLSAgICBlbHNlCi0gICAgewotICAgICAgYWRkRXJyb3IobWVzc2FnZSwgMCwgMSwgZ2V0RmlsZVVSSSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jYWRkV2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBMb2NhdGlvbkhvbGRlciBsb2NhdGlvbjsKLSAgICBpZiAoZWxlbWVudGxvY2F0aW9ucy5jb250YWluc0tleShlbGVtZW50KSkKLSAgICB7Ci0gICAgICBsb2NhdGlvbiA9IChMb2NhdGlvbkhvbGRlcillbGVtZW50bG9jYXRpb25zLmdldChlbGVtZW50KTsKLSAgICAgIGFkZFdhcm5pbmcobWVzc2FnZSwgbG9jYXRpb24uZ2V0TGluZSgpLCBsb2NhdGlvbi5nZXRDb2x1bW4oKSwgbG9jYXRpb24uZ2V0VVJJKCkpOwotICAgIH0KLSAgICAvLyBpZiB3ZSBnaXZlIGl0IGFuIGVsZW1lbnQgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkIHdlJ2xsIHNldCB0aGUgbG9jYXRpb24KLSAgICAvLyBhdCAoMCwwKSBzbyB0aGUgZXJyb3Igc2hvd3MgdXAgYnV0IG5vIGxpbmUgbWFya2VyIGluIHRoZSBlZGl0b3IKLSAgICBlbHNlCi0gICAgewotICAgICAgYWRkV2FybmluZyhtZXNzYWdlLCAwLCAxLCBnZXRGaWxlVVJJKCkpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm8jYWRkTmFtZXNwYWNlV2l0aE5vVmFsaWRhdG9yKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZVdpdGhOb1ZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlKQotLy8gIHsKLS8vICAgIHZhbGluZm8uYWRkTmFtZXNwYWNlV2l0aE5vVmFsaWRhdG9yKG5hbWVzcGFjZSk7Ci0vLwotLy8gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jYWRkRXJyb3IoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBhZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgeyAKLSAgICB0cnkKLSAgICB7ICgoVmFsaWRhdGlvbkluZm9JbXBsKXZhbGluZm8pLmFkZEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBlcnJvcktleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgfQotICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB2YWxpbmZvLmFkZEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICB2YWxpbmZvLmFkZFdhcm5pbmcobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvI2dldFVSSVJlc29sdmVyKCkKLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlciBnZXRVUklSZXNvbHZlcigpIAotICB7Ci0JcmV0dXJuIHZhbGluZm8uZ2V0VVJJUmVzb2x2ZXIoKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNnZXRTY2hlbWFDYWNoZSgpCi0gICAqLwotICBwdWJsaWMgWE1MR3JhbW1hclBvb2wgZ2V0U2NoZW1hQ2FjaGUoKSAKLSAgewotCVhNTEdyYW1tYXJQb29sIGdyYW1tYXJQb29sID0gKFhNTEdyYW1tYXJQb29sKXZhbGluZm8uZ2V0QXR0cmlidXRlKENvbnN0YW50cy5YTUxTQ0hFTUFfQ0FDSEVfQVRUUklCVVRFKTsKLQlyZXR1cm4gZ3JhbW1hclBvb2w7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jZ2V0WE1MQ2FjaGUoKQotICAgKi8KLSAgcHVibGljIFhNTEdyYW1tYXJQb29sIGdldFhNTENhY2hlKCkgCi0gIHsKLQlYTUxHcmFtbWFyUG9vbCBncmFtbWFyUG9vbCA9IChYTUxHcmFtbWFyUG9vbCl2YWxpbmZvLmdldEF0dHJpYnV0ZShDb25zdGFudHMuWE1MX0NBQ0hFX0FUVFJJQlVURSk7Ci0JcmV0dXJuIGdyYW1tYXJQb29sOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5NzE5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVdTRExWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24uVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaXMgdGhlIGhlYWQgb2YgdmFsaWRhdGlvbi4gCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyIGltcGxlbWVudHMgSVdTRExWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEVfTkFNRSA9ICJ2YWxpZGF0ZXdzZGwiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9XQVJOX05PX1ZBTERJQVRPUiA9ICJfV0FSTl9OT19WQUxESUFUT1IiOwotLy8gIHByb3RlY3RlZCBmaW5hbCBpbnQgRVJST1JfTUVTU0FHRSA9IDA7Ci0vLyAgcHJvdGVjdGVkIGZpbmFsIGludCBXQVJOSU5HX01FU1NBR0UgPSAxOwotLy8gIHByb3RlY3RlZCBTdHJpbmcgZmlsZVVSSTsKLS8vICBwcm90ZWN0ZWQgTGlzdCBzY2hlbWFzID0gbmV3IFZlY3RvcigpOwotLy8gIHByb3RlY3RlZCBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yID0gbnVsbDsKLSAgLy9wcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbnRyb2xsZXIgdmFsaWRhdGlvbkNvbnRyb2xsZXI7Ci0gIHByb3RlY3RlZCBWYWxpZGF0b3JSZWdpc3RyeSB2ZXIgPSBWYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBXU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyKCkKLSAgewotICAgIFJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEVfTkFNRSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0JbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgfQotCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuSVdTRExWYWxpZGF0b3IjdmFsaWRhdGUob3JnLnczYy5kb20uRG9jdW1lbnQsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShEb2N1bWVudCBkb21Nb2RlbCwgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8pIHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgewotICAgIC8vIHJlc2V0IHRoZSB2YXJpYWJsZXMKLS8vICAgIHJlc2V0KCk7Ci0vLyAgICBmaWxlVVJJID0gdmFsSW5mby5nZXRGaWxlVVJJKCk7Ci0gICAgLy90aGlzLnZhbGlkYXRpb25Db250cm9sbGVyID0gdmFsaWRhdGlvbmNvbnRyb2xsZXI7Ci0KLSAgICBJV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm8gPSBuZXcgV1NETDExVmFsaWRhdGlvbkluZm9JbXBsKHZhbEluZm8pOwotICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gcmVhZFdTRExEb2N1bWVudChkb21Nb2RlbCwgdmFsSW5mby5nZXRGaWxlVVJJKCksIGdldE1lc3NhZ2VHZW5lcmF0b3IoKSwgd3NkbHZhbGluZm8pOwotICAgIC8vIERvbid0IHZhbGlkYXRlIGFuIG51bGwgZGVmaW5pdGlvbnMgZWxlbWVudC4gRWl0aGVyIHRoZSBmaWxlIGlzIGVtdHB5IGFuZCB2YWxpZCBvcgotICAgIC8vIGhhZCBhbiBlcnJvciB3aGVuIHJlYWRpbmcuCi0gICAgaWYod3NkbERvY3MgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIGludCBudW1XU0RMRG9jcyA9IHdzZGxEb2NzLmxlbmd0aDsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1XU0RMRG9jczsgaSsrKQotICAgICAgewotICAgICAgICBXU0RMRG9jdW1lbnQgdGVtcERvYyA9IHdzZGxEb2NzW2ldOwotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gdGVtcERvYy5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBzY2hlbWFzLgotICAgICAgICBMaXN0IHhzZExpc3QgPSB0ZW1wRG9jLmdldFNjaGVtYXMoKTsKLSAgICAgICAgSXRlcmF0b3IgeHNkSXRlciA9IHhzZExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHhzZEl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbHZhbGluZm8uYWRkU2NoZW1hKChYU01vZGVsKXhzZEl0ZXIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBTZXQgdGhlIGVsZW1lbnQgbG9jYXRpb25zIHRhYmxlLgotICAgICAgICB3c2RsdmFsaW5mby5zZXRFbGVtZW50TG9jYXRpb25zKHRlbXBEb2MuZ2V0RWxlbWVudExvY2F0aW9ucygpKTsKLSAgICAgICAgLy8gU2V0IGFueSByZWFkZXIgZXJyb3JzLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYWZ0ZXIgdGhlIGVsZW1lbnQgbG9jYXRpb25zIHRhYmxlIGlzIHNldC4KLSAgICAgICAgTGlzdCByZWFkZXJFcnJvcnMgPSB0ZW1wRG9jLmdldFJlYWRlckVycm9ycygpOwotICAgICAgICBpZiAocmVhZGVyRXJyb3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciByZWFkZXJFcnJvcnNJID0gcmVhZGVyRXJyb3JzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKHJlYWRlckVycm9yc0kuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRlckVycm9yIHJlID0gKFJlYWRlckVycm9yKXJlYWRlckVycm9yc0kubmV4dCgpOwotICAgICAgICAgICAgd3NkbHZhbGluZm8uYWRkRXJyb3IocmUuZ2V0RXJyb3IoKSwgcmUuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMaXN0IHJlYWRlcldhcm5pbmdzID0gdGVtcERvYy5nZXRSZWFkZXJXYXJuaW5ncygpOwotICAgICAgICBpZiAocmVhZGVyV2FybmluZ3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIHJlYWRlcldhcm5pbmdzSSA9IHJlYWRlcldhcm5pbmdzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKHJlYWRlcldhcm5pbmdzSS5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyRXJyb3IgcmUgPSAoUmVhZGVyRXJyb3IpcmVhZGVyV2FybmluZ3NJLm5leHQoKTsKLSAgICAgICAgICAgIHdzZGx2YWxpbmZvLmFkZFdhcm5pbmcocmUuZ2V0RXJyb3IoKSwgcmUuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2YWxpZGF0ZVdTRExFbGVtZW50KENvbnN0YW50cy5OU19VUklfV1NETCwgd3NkbERlZmluaXRpb24sIG5ldyBWZWN0b3IoKSwgd3NkbHZhbGluZm8pOwotICAgICAgICB3c2RsdmFsaW5mby5jbGVhclNjaGVtYXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWFkIGluIHRoZSBXU0RMIGRvY3VtZW50IGFuZCBzZXQgdGhlIG1vZGVsIGFuZCBpbXBvcnRlZCBzY2hlbWFzLgotICAgKiAKLSAgICogQHBhcmFtIGRvbU1vZGVsIEEgRE9NIG1vZGVsIG9mIHRoZSBkb2N1bWVudCB0byBiZSByZWFkLgotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byByZWFkLgotICAgKiBAcGFyYW0gbWVzc2FnZWdlbmVyYXRvciBUaGUgbWVzc2FnZWdlbmVyYXRvciB0aGUgcmVhZGVyIHNob3VsZCB1c2UgZm9yIGFueSBtZXNzYWdlcyBwcm9kdWNlZC4KLSAgICogQHBhcmFtIHdzZGx2YWxpbmZvIFRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKiBAcmV0dXJuIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZvciB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBXU0RMRG9jdW1lbnRbXSByZWFkV1NETERvY3VtZW50KERvY3VtZW50IGRvbU1vZGVsLCBTdHJpbmcgZmlsZSwgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yLCBJV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm8pIHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgewotICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0KLSAgICAgIFdTRExSZWFkZXJJbXBsIHdzZGxSZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwod3NkbHZhbGluZm8pOwotICAgICAgd3NkbFJlYWRlci5zZXRNZXNzYWdlR2VuZXJhdG9yKG1lc3NhZ2VnZW5lcmF0b3IpOwotICAgICAgaWYoZG9tTW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3NkbERvY3MgPSB3c2RsUmVhZGVyLnJlYWRXU0RMKGZpbGUsIGRvbU1vZGVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgIAotICAgICAgICB3c2RsRG9jcyA9IHdzZGxSZWFkZXIucmVhZFdTREwoZmlsZSk7Ci0gICAgICB9Ci0gICAgICAvL3dzZGx2YWxpbmZvLnNldEVsZW1lbnRMb2NhdGlvbnMod3NkbFJlYWRlci5nZXRFbGVtZW50TG9jYXRpb25zSGFzaHRhYmxlKCkpOwotLy8gICAgICBMaXN0IHJlYWRlckVycm9ycyA9IHdzZGxSZWFkZXIuZ2V0UmVhZGVyRXJyb3JzKCk7Ci0vLyAgICAgIGlmIChyZWFkZXJFcnJvcnMgIT0gbnVsbCkKLS8vICAgICAgIHsKLS8vICAgICAgICBJdGVyYXRvciByZWFkZXJFcnJvcnNJID0gcmVhZGVyRXJyb3JzLml0ZXJhdG9yKCk7Ci0vLyAgICAgICAgd2hpbGUgKHJlYWRlckVycm9yc0kuaGFzTmV4dCgpKQotLy8gICAgICAgICB7Ci0vLyAgICAgICAgICBSZWFkZXJFcnJvciByZSA9IChSZWFkZXJFcnJvcilyZWFkZXJFcnJvcnNJLm5leHQoKTsKLS8vICAgICAgICAgIHdzZGx2YWxpbmZvLmFkZEVycm9yKHJlLmdldEVycm9yKCksIHJlLmdldE9iamVjdCgpKTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgaWYgKHdzZGxSZWFkZXIuaGFzSW1wb3J0U2NoZW1hcygpKQotLy8gICAgICB7Ci0vLyAgICAgICAgTGlzdCB4c2RMaXN0ID0gd3NkbFJlYWRlci5nZXRJbXBvcnRTY2hlbWFzKCk7Ci0vLyAgICAgICAgSXRlcmF0b3IgeHNkSXRlciA9IHhzZExpc3QuaXRlcmF0b3IoKTsKLS8vICAgICAgICB3aGlsZSAoeHNkSXRlci5oYXNOZXh0KCkpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgd3NkbHZhbGluZm8uYWRkU2NoZW1hKChYU01vZGVsKXhzZEl0ZXIubmV4dCgpKTsKLS8vICAgICAgICB9Ci0vLwotLy8gICAgICB9Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVmFsaWRhdGVXU0RMRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpICsgIiAiICsgZS5nZXRGYXVsdENvZGUoKSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBWYWxpZGF0ZVdTRExFeGNlcHRpb24oInVuYWJsZSB0byByZWFkIGZpbGUiICsgZS5nZXRNZXNzYWdlKCkgKyAiICIgKyBlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbERvY3M7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBXU0RMIGVsZW1lbnQsIGNhbGwgVmFsaWRhdGVFbGVtZW50IGZvciBpdC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgZm9yIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlV1NETEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHdzZGx2YWxpbmZvKQotICB7Ci0gICAgSVdTREwxMVZhbGlkYXRvciB2YWwgPSB2ZXIucXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UpOwotICAgIGlmICh2YWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2YWwudmFsaWRhdGUoZWxlbWVudCwgcGFyZW50cywgd3NkbHZhbGluZm8pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCSAgLy9UT0RPOiBBZGQgdGhpcyBhcyBhIHByZWZlcmVuY2UuCi0gICAgICAvL3dzZGx2YWxpbmZvLmFkZFdhcm5pbmcobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1dBUk5fTk9fVkFMRElBVE9SLCBuYW1lc3BhY2UpLCBlbGVtZW50KTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIG1lc3NhZ2UgZ2VuZXJhdG9yIGZvciB0aGlzIGNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzZ2VuIFRoZSBtZXNzYWdlIGdlbmVyYXRvciB0byBzZXQgZm9yIHRoaXMgY29udHJvbGxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VHZW5lcmF0b3IoTWVzc2FnZUdlbmVyYXRvciBtZXNnZW4pCi0gIHsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbWVzZ2VuOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWVzc2FnZSBnZW5lcmF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VHZW5lcmF0b3IgZ2V0TWVzc2FnZUdlbmVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZWdlbmVyYXRvcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGZpbGVuYW1lIGZvciB0aGUgZmlsZSBjdXJyZW50bHkgYmVpbmcgdmFsaWRhdGVkLiBTb21lIHZhbGlkYXRvcnMgcmVxdWlyZSB0aGlzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZmlsZW5hbWUgZm9yIHRoZSBmaWxlIGJlaW5nIHZhbGlkYXRlZC4KLSAgICovCi0vLyAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCi0vLyAgewotLy8gICAgcmV0dXJuIGZpbGVVUkk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgZXJyb3IgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYWRkIHRoZSBlcnJvciBmb3IuCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgdG8gYWRkLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGVycm9yKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKEVSUk9SX01FU1NBR0UsIG9iamVjdCwgZXJyb3IpOwotLy8gICAgZXJyb3JzID0gdHJ1ZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXkga25vdwotICAgKiBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZEVycm9yTWVzc2FnZShpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIGVycm9yKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKEVSUk9SX01FU1NBR0UsIGxpbmUsIGNvbHVtbiwgZXJyb3IpOwotLy8gICAgZXJyb3JzID0gdHJ1ZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgd2FybmluZyBtZXNzYWdlLgotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nTWVzc2FnZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgd2FybmluZykKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShXQVJOSU5HX01FU1NBR0UsIG9iamVjdCwgd2FybmluZyk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgd2FybmluZyBtZXNzYWdlcyB3aGVuIHRoZXkga25vdwotICAgKiBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nTWVzc2FnZShpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHdhcm5pbmcpCi0vLyAgewotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoV0FSTklOR19NRVNTQUdFLCBsaW5lLCBjb2x1bW4sIHdhcm5pbmcpOwotLy8gIH0KLQotICAvKioKLSAgICogSWYgeW91IGhhdmUgYW4gb2JqZWN0IHJlYWQgaW4gYnkgdGhlIHJlYWRlciBmb3IgdGhpcwotICAgKiB2YWxpZGF0b3Jjb250cm9sbGVyIHRoZSBvYmplY3QgY2FuIGJlIHBhc3NlZCBpbiBoZXJlIGFuZCB0aGUgbGluZSBhbmQgY29sdW1uCi0gICAqIGluZm9ybWF0aW9uIHdpbGwgYmUgYWJzdHJhY3RlZCBmcm9tIGl0LgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGVycm9yICh1c2VkIHRvIGdldCB0aGUgbG9jYXRpb24pLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKGludCB0eXBlLCBPYmplY3QgbywgU3RyaW5nIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgaW50W10gbG9jYXRpb247Ci0vLyAgICBpZiAoZWxlbWVudExvY2F0aW9ucy5jb250YWluc0tleShvKSkKLS8vICAgIHsKLS8vICAgICAgbG9jYXRpb24gPSAoaW50W10pZWxlbWVudExvY2F0aW9ucy5nZXQobyk7Ci0vLyAgICB9Ci0vLyAgICAvLyBpZiB3ZSBnaXZlIGl0IGFuIGVsZW1lbnQgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkIHdlJ2xsIHNldCB0aGUgbG9jYXRpb24KLS8vICAgIC8vIGF0ICgwLDApIHNvIHRoZSBlcnJvciBzaG93cyB1cCBidXQgbm8gbGluZSBtYXJrZXIgaW4gdGhlIGVkaXRvcgotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICBsb2NhdGlvbiA9IG5ldyBpbnRbXSB7IDAsIDAgfTsKLS8vICAgIH0KLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKHR5cGUsIGxvY2F0aW9uWzBdLCBsb2NhdGlvblsxXSwgbWVzc2FnZSk7Ci0vLyAgfQotCi0gIC8qKgotICAgICogQ3JlYXRlcyBhIHZhbGlkYXRpb24gbWVzc2FnZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgKiAKLSAgCSogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIGFkZC4KLSAgCSogQHBhcmFtIGxpbmUgVGhlIGxpbmUgd2hlcmUgdGhlIGVycm9yIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgCSogQHBhcmFtIGNvbHVtbiBUaGUgbGluZSB3aGVyZSB0aGUgY29sdW1uIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgCSogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAJKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShpbnQgdHlwZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyBtZXNzYWdlKQotLy8gIHsKLS8vICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIGlmICh0eXBlID09IEVSUk9SX01FU1NBR0UpCi0vLyAgICAgIHsKLS8vICAgICAgICB2YWxpZGF0aW9uQ29udHJvbGxlci5hZGRFcnJvck1lc3NhZ2UobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmICh0eXBlID09IFdBUk5JTkdfTUVTU0FHRSkKLS8vICAgICAgewotLy8gICAgICAgIHZhbGlkYXRpb25Db250cm9sbGVyLmFkZFdhcm5pbmdNZXNzYWdlKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5jb250cm9sbGVyLklXU0RMVmFsaWRhdG9yI2lzVmFsaWQoKQotICAgKi8KLS8vICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLS8vICB7Ci0vLyAgICByZXR1cm4gIWVycm9yczsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSB2YWxpZGF0b3IgY29udHJvbGxlci4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKQotLy8gIHsKLS8vICAgIHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICBmaWxlVVJJID0gIiI7Ci0vLyAgICB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0vLyAgICBlbGVtZW50TG9jYXRpb25zID0gbnVsbDsKLS8vICAgIHJlc291cmNlYnVuZGxlID0gbnVsbDsKLS8vICAgIC8vdmFsaWRhdGlvbkNvbnRyb2xsZXIgPSBudWxsOwotLy8gICAgZXJyb3JzID0gZmFsc2U7Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjEzNWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExVmFsaWRhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotLyoqCi0gKiBUaGUgV1NETCAxLjEgdmFsaWRhdG9yIGRlbGVnYXRlIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgdmFsaWRhdG9yIHRvIGJlIGluc3RhbnRpYXRlZCBhdAotICogYSBsYXRlciBwb2ludC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlCi17Ci0gIHByaXZhdGUgSVdTREwxMVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0KLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsaWRhdG9yIHNwZWNpZmllZCBpbiB0aGlzIGRlbGVnYXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgV1NETCAxLjEgdmFsaWRhdG9yIHNwZWNpZmllZCBieSB0aGlzIGRlbGVnYXRlLgotICAgKi8KLSAgcHVibGljIElXU0RMMTFWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB2YWxpZGF0b3IgPSBsb2FkVmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBJV1NETDExVmFsaWRhdG9yIGxvYWRWYWxpZGF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTEyMmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uRGVzZXJpYWxpemVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50TlNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkLklubGluZVNjaGVtYVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5FbGVtZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuRE9NVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLlFOYW1lVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLlhQYXRoVXRpbHM7Ci0KLS8qKgotICogQSBXU0RMIGRvY3VtZW50IHRoYXQga25vd3MgaG93IHRvIHBhcnNlIGl0c2VsZi4KLSAqLwotcHVibGljIGNsYXNzIFdTRExEb2N1bWVudAotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFNUWUxFX09ORV9XQVkgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5FTEVNX0lOUFVUIH0pOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFNUWUxFX1JFUVVFU1RfUkVTUE9OU0UgPQotICAgIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkVMRU1fSU5QVVQsIENvbnN0YW50cy5FTEVNX09VVFBVVCB9KTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBTVFlMRV9TT0xJQ0lUX1JFU1BPTlNFID0KLSAgICBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5FTEVNX09VVFBVVCwgQ29uc3RhbnRzLkVMRU1fSU5QVVQgfSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgU1RZTEVfTk9USUZJQ0FUSU9OID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyBDb25zdGFudHMuRUxFTV9PVVRQVVQgfSk7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0VSUk9SX01VTFRJUExFX1RZUEVTX0RFRklORUQgPSAiX0VSUk9SX01VTFRJUExFX1RZUEVTX0RFRklORUQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VOQUJMRV9UT19JTVBPUlRfTk9fTE9DQVRJT04gPSAiX1VOQUJMRV9UT19JTVBPUlRfTk9fTE9DQVRJT04iOwotCi0gIHByb3RlY3RlZCBFeHRlbnNpb25SZWdpc3RyeSBleHRSZWcgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZhY3RvcnlJbXBsTmFtZSA9IG51bGw7Ci0KLSAgLy8gc3RvcmUgdGhlIGVsZW1lbnQgbG9jYXRpb25zIHdpdGhpbiB0aGUgZmlsZSAtIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzCi0gIC8vIHRoZSBsb2NhdGlvbiBpbmZvIGlzIHN0b3JlZCBhcyBhbiBpbnQgYXJyYXkgb2YgbGVuZ3RoIDIge2xpbmVudW1iZXIsIGNvbG51bWJlcn0KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbGVtZW50TG9jYXRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgLy8gaG9sZCB0aGUgcmVhZGVyIGVycm9ycwotICBwcm90ZWN0ZWQgTGlzdCByZWFkZXJFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBMaXN0IHJlYWRlcldhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotICAKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0gIHByaXZhdGUgU2V0IGltcG9ydGVkRGVmcyA9IG5ldyBUcmVlU2V0KCk7Ci0gIHByaXZhdGUgRWxlbWVudCB0eXBlc0VsID0gbnVsbDsKLSAgcHJpdmF0ZSBMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIExpc3QgcG9ydHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIExpc3QgYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgTGlzdCBzZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBMaXN0IGV4dGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIGludCBkZXB0aDsKLSAgLy8gSG9sZCB0aGUgc2NoZW1hcyB0aGF0IGFyZSBpbXBvcnRlZCBvciBkZWNsYXJlZCBpbmxpbmUgaW4gdGhpcyB3c2RsIGRvY3VtZW50LgotICBwcml2YXRlIExpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gUGVyZm9ybXMgYSBwcmVwYXJzZSBvZiB0aGUgZG9jdW1lbnQgYW5kIGhhbmRsZXMgaW1wb3J0cyBhbmQgdHlwZXMuCi0gICAqIAotICAgKiBAcGFyYW0gZG9jdW1lbnRCYXNlVVJJIFRoZSBVUkkgb2YgdGhpcyBXU0RMIGRvY3VtZW50LgotICAgKiBAcGFyYW0gZGVmRWwgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZXB0aCBUaGUgZGVwdGggb2YgdGhpcyBkb2N1bWVudCBpbiBhIGRvY3VtZW50IHRyZWUuCi0gICAqIEBwYXJhbSBtZXNzYWdlZ2VuZXJhdG9yIEEgbWVzc2FnZWdlbmVyYXRvciB1c2VkIGZvciByZXRyaWV2aW5nIHN0cmluZ3MuCi0gICAqIEBwYXJhbSB2YWxpbmZvIEEgV1NETDExVmFsaWRhdGlvbkluZm8gb2JqZWN0IGZvciByZXBvcnRpbmcgbWVzc2FnZXMuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBFbGVtZW50IGRlZkVsLCBpbnQgZGVwdGgsIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciwgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbGluZm8pIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2VnZW5lcmF0b3IgPSBtZXNzYWdlZ2VuZXJhdG9yOwotICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgdGhpcy5kZXB0aCA9IGRlcHRoOwotICAgIAotICAgIGNoZWNrRWxlbWVudE5hbWUoZGVmRWwsIENvbnN0YW50cy5RX0VMRU1fREVGSU5JVElPTlMpOwotICAgIAotICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgKGZhY3RvcnlJbXBsTmFtZSAhPSBudWxsKSA/IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKGZhY3RvcnlJbXBsTmFtZSkgOiBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIGRlZiA9IGZhY3RvcnkubmV3RGVmaW5pdGlvbigpOwotICAgIC8vIEZpeCBmb3IgV1NETDRKIGFkZGluZyBkZWZhdWx0IFdTREwgbmFtZXNwYWNlIHdoZW4gbm8gZGVmYXVsdAotICAgIC8vIG5hbWVzcGFjZSBoYXMgYmVlbiBkZWNsYXJlZC4KLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBmaXggb25jZSBmaXhlZCBpbiBXU0RMNEouCi0gICAgaWYoZGVmLmdldE5hbWVzcGFjZSgiIikgIT0gbnVsbCkKLSAgICAJZGVmLmdldE5hbWVzcGFjZXMoKS5yZW1vdmUoIiIpOwotCi0gICAgaWYgKGV4dFJlZyAhPSBudWxsKQotICAgIHsKLSAgICAgIGRlZi5zZXRFeHRlbnNpb25SZWdpc3RyeShleHRSZWcpOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGRlZkVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGRlZkVsLCBDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICBOYW1lZE5vZGVNYXAgYXR0cnMgPSBkZWZFbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICBpZiAoZG9jdW1lbnRCYXNlVVJJICE9IG51bGwpCi0gICAgewotICAgICAgZGVmLnNldERvY3VtZW50QmFzZVVSSShkb2N1bWVudEJhc2VVUkkpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgZGVmLnNldFFOYW1lKG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIG5hbWUpKTsKLSAgICB9Ci0KLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgewotICAgICAgZGVmLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgIH0KLQotICAgIGludCBzaXplID0gYXR0cnMuZ2V0TGVuZ3RoKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHIgPSAoQXR0cilhdHRycy5pdGVtKGkpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQotICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YTUxOUykpCi0gICAgICB7Ci0gICAgICAgIGlmIChsb2NhbFBhcnQgIT0gbnVsbCAmJiAhbG9jYWxQYXJ0LmVxdWFscyhDb25zdGFudHMuQVRUUl9YTUxOUykpCi0gICAgICAgIHsKLSAgICAgICAgICBkZWYuYWRkTmFtZXNwYWNlKGxvY2FsUGFydCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRlZi5hZGROYW1lc3BhY2UobnVsbCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlcmUgYXJlIHByb2JsZW1zIHdoZW4gdGhlIG1vZGVsIGlzIGNyZWF0ZWQgYW5kIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpcyBub3QKLSAgICAvLyBJbXBvcnQgLSBUeXBlcyAtIE1lc3NhZ2UgLSBQb3J0VHlwZSAtIEJpbmRpbmcgLSBTZXJ2aWNlIHNvIHdlIG5lZWQgdG8gcmVhZCB0aGVtCi0gICAgLy8gaW50byB0aGUgbW9kZWwgaW4gdGhhdCBvcmRlcgotICAgIC8vIFBlcmZvcm1hbmNlIHdpc2UgdGhpcyBzaG91bGQgYmUgbW9kaWZpZWQgYXMgd2UgaGF2ZSB0byBtYWtlIDUgZXh0cmEgbG9vcHMgdGhyb3VnaAotICAgIC8vIGFsbCBvZiB0aGUgZWxlbWVudHMgYXMgYSByZXN1bHQKLQotICAgIC8vIHRha2UgY2FyZSBvZiBJbXBvcnRzLCBUeXBlcywgRG9jdW1lbnRhdGlvbiBhbmQgZXh0ZW5zaWJsZWVsZW1lbnRzIHRvZ2V0aGVyIC0gc2F2ZXMgYSBwYXNzIGZvciBEb2N1bWVudGF0aW9uIAotICAgIC8vIGxhdGVyIGFuZCBEb2NzIGRvbid0IGVmZmVjdCBhbnl0aGluZyBlbHNlIC0gSW1wb3J0cyBhbmQgVHlwZXMgYXJlIGVzc2VudGlhbGx5IHRoZSBzYW1lIHRoaW5nCi0gICAgLy8gbm8gcHJlY29uY2VpdmVkIGlkZWFzIGFib3V0IGV4dGVuc2libGUgZWxlbWVudHMKLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGRlZkVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0KLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9JTVBPUlQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUodGVtcEVsLCBDb25zdGFudHMuQVRUUl9OQU1FU1BBQ0UpOwotICAgICAgICBTdHJpbmcgbG9jYXRpb25VUkkgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUodGVtcEVsLCBDb25zdGFudHMuQVRUUl9MT0NBVElPTik7Ci0gICAgICAgIGlmKGxvY2F0aW9uVVJJID09IG51bGwgfHwgbG9jYXRpb25VUkkuZXF1YWxzKCIiKSkKLSAgICAgICAgewotICAgICAgICAgIGFkZFJlYWRlckVycm9yKGRlZiwgdGVtcEVsLCBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfVU5BQkxFX1RPX0lNUE9SVF9OT19MT0NBVElPTikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEltcG9ydEhvbGRlciBpaCA9IG5ldyBJbXBvcnRIb2xkZXIobmFtZXNwYWNlVVJJLCBsb2NhdGlvblVSSSwgZGVmLmdldERvY3VtZW50QmFzZVVSSSgpLCB0aGlzLCBkZXB0aCsxLCB0ZW1wRWwsIG1lc3NhZ2VnZW5lcmF0b3IsIHZhbGluZm8pOwotICAgICAgICAgIC8vIE9ubHkgYWRkIHRoZSBpbXBvcnQgdG8gdGhlIGxpc3QgaWYgaXQgaXMgbm90IGFuIGltcG9ydCBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICAgICAgICBpZighZG9jdW1lbnRCYXNlVVJJLmVxdWFscyhpaC5nZXRMb2NhdGlvbigpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbXBvcnRlZERlZnMuYWRkKGloKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0TG9jYXRpb24odGVtcEVsLCB0ZW1wRWwpOwotLy8gICAgICAgIGlmIChpbXBvcnRlZERlZnMgPT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBpbXBvcnRlZERlZnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChkb2N1bWVudEJhc2VVUkkgIT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBpbXBvcnRlZERlZnMucHV0KGRvY3VtZW50QmFzZVVSSSwgZGVmKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZGVmLmFkZEltcG9ydChwYXJzZUltcG9ydCh0ZW1wRWwsIGRlZiwgaW1wb3J0ZWREZWZzKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBkZWYuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX1RZUEVTLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBpZih0eXBlc0VsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRMb2NhdGlvbih0ZW1wRWwsIHRlbXBFbCk7Ci0gICAgICAgICAgYWRkUmVhZGVyRXJyb3IoZGVmLCB0ZW1wRWwsIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9NVUxUSVBMRV9UWVBFU19ERUZJTkVEKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZXNFbCA9IHRlbXBFbDsKLSAgICAgICAgICBwYXJzZVR5cGVzKCk7Ci0gICAgICAgIH0KLS8vICAgICAgICBkZWYuc2V0VHlwZXMocGFyc2VUeXBlcyh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fTUVTU0FHRSwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZXMuYWRkKHRlbXBFbCk7Ci0gICAgICAgIC8vZGVmLmFkZE1lc3NhZ2UocGFyc2VNZXNzYWdlKHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9QT1JUX1RZUEUsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIHBvcnR0eXBlcy5hZGQodGVtcEVsKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgUG9ydFR5cGUgcHQgPSBwYXJzZVBvcnRUeXBlKHRlbXBFbCwgZGVmKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgaWYocHQgIT0gbnVsbCkKLSAgICAgICAgLy8gICAgICAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICBkZWYuYWRkUG9ydFR5cGUocHQpOwotICAgICAgICAvLyAgICAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9CSU5ESU5HLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5ncy5hZGQodGVtcEVsKTsKLSAgICAgICAgLy9kZWYuYWRkQmluZGluZyhwYXJzZUJpbmRpbmcodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX1NFUlZJQ0UsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2VzLmFkZCh0ZW1wRWwpOwotICAgICAgICAvL2RlZi5hZGRTZXJ2aWNlKHBhcnNlU2VydmljZSh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBleHRlbGVtZW50cy5hZGQodGVtcEVsKTsKLSAgICAgICAgLy8gICAgICAgIGRlZi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCgKLSAgICAgICAgLy8gICAgICAgICAgcGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChEZWZpbml0aW9uLmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGRlZmluaXRpb25zIGVsZW1lbnQgZm9yIHRoaXMgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZvciB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGEgc2V0IG9mIHRoZSBpbXBvcnRzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgc2V0IG9mIHRoZSBpbXBvcnRzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgU2V0IGdldEltcG9ydHMoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydGVkRGVmczsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gZGVmCi0gICAqIEBwYXJhbSBkb2MKLSAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICovCi0vLyAgcHVibGljIHZvaWQgc2V0SW1wb3J0KERlZmluaXRpb24gZGVmLCBFbGVtZW50IGRvYywgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotLy8gIHsKLS8vICAgIGlmKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uZXF1YWxzKCIiKSkKLS8vICAgIHsKLS8vICAgICAgdmFsaW5mby5hZGRFcnJvcigpX1VOQUJMRV9UT19JTVBPUlRfTk9fTE9DQVRJT04gCi0vLyAgICB9Ci0vLyAgICBJbXBvcnQgaW1wID0gZGVmLmNyZWF0ZUltcG9ydCgpOwotLy8gICAgaW1wLnNldERlZmluaXRpb24oZGVmKTsKLS8vICAgIGltcC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2MpOwotLy8gICAgaW1wLnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2UpOwotLy8gICAgaW1wLnNldExvY2F0aW9uVVJJKGxvY2F0aW9uKTsKLS8vICAgIGRlZi5hZGRJbXBvcnQoaW1wKTsKLS8vICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIHR5cGVzIGluIHRoZSBXU0RMIGRvY3VtZW50LiBIYW5kbGVzIGRvY3VtZW50YXRpb24sIGltcG9ydCBhbmQgc2NoZW1hCi0gICAqIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VUeXBlcygpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IGRlZi5jcmVhdGVUeXBlcygpOwotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudCh0eXBlc0VsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgdHlwZXMuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRlbXBFbC5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbXBvcnQiKSkKLSAgICAgICAgLy9lbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9JTVBPUlQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IHJlYWxseSBiZSB1c2VkIGhlcmUgYnV0IGEgbGl0dGxlIGhhY2sgd2lsbCBtYWtlCi0gICAgICAgIC8vIGxpZmUgZWFzaWVyCi0gICAgICAgIC8vcGFyc2VJbXBvcnQodGVtcEVsLCBkZWYsIChNYXApbmV3IEhhc2h0YWJsZSgpKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSk7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsICJzY2hlbWFMb2NhdGlvbiIpOwotICAgICAgICBpbXBvcnRlZERlZnMuYWRkKG5ldyBJbXBvcnRIb2xkZXIobmFtZXNwYWNlVVJJLCBsb2NhdGlvblVSSSwgZGVmLmdldERvY3VtZW50QmFzZVVSSSgpLCB0aGlzLCBkZXB0aCsxLCB0ZW1wRWwsIG1lc3NhZ2VnZW5lcmF0b3IsIHZhbGluZm8pKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KFR5cGVzLmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoVHlwZXMuY2xhc3MsIHRlbXBFbCwgZGVmKTsKLSAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0gICAgZGVmLnNldFR5cGVzKHR5cGVzKTsKLSAgICAKLSAgICB2YWxpbmZvLnNldEVsZW1lbnRMb2NhdGlvbnMoZWxlbWVudExvY2F0aW9ucyk7Ci0gICAgTGlzdCB0eXBlc0VsZW1zID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYodHlwZXNFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHR5cGVzRWxlbXNJdGVyID0gdHlwZXNFbGVtcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUodHlwZXNFbGVtc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCB0eXBlRWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCl0eXBlc0VsZW1zSXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBJbmxpbmVTY2hlbWFWYWxpZGF0b3IgeHNkVmFsID0gbmV3IElubGluZVNjaGVtYVZhbGlkYXRvcigpOwotICAgICAgICB4c2RWYWwuc2V0TWVzc2FnZUdlbmVyYXRvcihtZXNzYWdlZ2VuZXJhdG9yKTsKLSAgICAKLSAgICAgICAgTGlzdCBwYXJlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwYXJlbnRzLmFkZChkZWYpOwotICAgICAgICBwYXJlbnRzLmFkZCgwLHR5cGVzKTsKLSAgICAgICAgeHNkVmFsLnZhbGlkYXRlKHR5cGVFbGVtZW50LCBwYXJlbnRzLHZhbGluZm8pOwotICAgICAgICBYU01vZGVsW10gdHlwZXNTY2hlbWFzID0gdmFsaW5mby5nZXRTY2hlbWFzKCk7Ci0gICAgICAgIExpc3QgdHlwZXNTY2hlbWFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdHlwZXNTY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgICAgICB7ICAKLSAgICAgICAgICB0eXBlc1NjaGVtYUxpc3QuYWRkKHR5cGVzU2NoZW1hc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2NoZW1hcy5hZGRBbGwodHlwZXNTY2hlbWFMaXN0KTsKLSAgICAgICAgdmFsaW5mby5jbGVhclNjaGVtYXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdmFsaW5mby5zZXRFbGVtZW50TG9jYXRpb25zKG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIG1lc3NhZ2VzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZU1lc3NhZ2VzKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZi5hZGRNZXNzYWdlKHBhcnNlTWVzc2FnZSgoRWxlbWVudCltZXNzYWdlcy5nZXQoaSksIGRlZikpOwotICAgICAgfQotICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAge30KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgcG9ydFR5cGVzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVBvcnR0eXBlcygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvcnR0eXBlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBwYXJzZVBvcnRUeXBlKChFbGVtZW50KXBvcnR0eXBlcy5nZXQoaSksIGRlZik7Ci0gICAgICAgIGlmIChwdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZGVmLmFkZFBvcnRUeXBlKHB0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAge30KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgYmluZGluZ3MgaW4gdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlQmluZGluZ3MoKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmLmFkZEJpbmRpbmcocGFyc2VCaW5kaW5nKChFbGVtZW50KWJpbmRpbmdzLmdldChpKSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICB7fQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBzZXJ2aWNlcyBpbiB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VTZXJ2aWNlcygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWYuYWRkU2VydmljZShwYXJzZVNlcnZpY2UoKEVsZW1lbnQpc2VydmljZXMuZ2V0KGkpLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgIHt9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgaW4gdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZWxlbWVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KERlZmluaXRpb24uY2xhc3MsIChFbGVtZW50KWV4dGVsZW1lbnRzLmdldChpKSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICB7fQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgZ2l2ZW4gbGlzdCBvZiBzY2hlbWFzIHRvIHRoZSBzY2hlbWFzIGZvciB0aGlzIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYXMgVGhlIGxpc3Qgb2Ygc2NoZW1hcyB0byBhZGQgdG8gdGhpcyBkb2N1bWVudCdzIHNjaGVtYXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTY2hlbWFzKExpc3Qgc2NoZW1hcykKLSAgewotICAgIHRoaXMuc2NoZW1hcy5hZGRBbGwoc2NoZW1hcyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHNjaGVtYXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgYmluZGluZy4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nRWwgVGhlIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgYmluZGluZyBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIHBhcnNlQmluZGluZyhFbGVtZW50IGJpbmRpbmdFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgcG9ydFR5cGVOYW1lOwotICAgIHRyeQotICAgIHsKLSAgICAgIHBvcnRUeXBlTmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKGJpbmRpbmdFbCwgQ29uc3RhbnRzLkFUVFJfVFlQRSwgQ29uc3RhbnRzLkVMRU1fQklORElORywgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgbWVzc2FnZSBuYW1lCi0gICAgICBwb3J0VHlwZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdFbCwgInR5cGUiKSk7Ci0gICAgfQotCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBudWxsOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBRTmFtZSBiaW5kaW5nTmFtZSA9IG5ldyBRTmFtZShkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUpOwotCi0gICAgICBiaW5kaW5nID0gZGVmLmdldEJpbmRpbmcoYmluZGluZ05hbWUpOwotCi0gICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgewotICAgICAgICBiaW5kaW5nID0gZGVmLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgICAgYmluZGluZy5zZXRRTmFtZShiaW5kaW5nTmFtZSk7Ci0gICAgICB9Ci0gICAgICAvLyByZXBvcnQgYW4gZXJyb3IgaWYgYSBiaW5kaW5nIHdpdGggdGhpcyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZAotICAgICAgZWxzZSBpZiAoIWJpbmRpbmcuaXNVbmRlZmluZWQoKSkKLSAgICAgIHsKLSAgICAgICAgLy9hZGRSZWFkZXJFcnJvcihkZWYsYmluZGluZ0VsLCAiX0JJTkRJTkdfTkFNRV9BTFJFQURZX0RFRklORUQiKTsgICAgICAgCi0gICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgIGRlZiwKLSAgICAgICAgICBiaW5kaW5nRWwsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9CSU5ESU5HX05BTUVfQUxSRUFEWV9ERUZJTkVEIiwgIiciICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgIiciKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBiaW5kaW5nID0gZGVmLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBXaGV0aGVyIGl0IHdhcyByZXRyaWV2ZWQgb3IgY3JlYXRlZCwgdGhlIGRlZmluaXRpb24gaGFzIGJlZW4gZm91bmQuCi0gICAgYmluZGluZy5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgaWYgKHBvcnRUeXBlTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvcnRUeXBlID0gZGVmLmdldFBvcnRUeXBlKHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICBwb3J0VHlwZS5zZXRRTmFtZShwb3J0VHlwZU5hbWUpOwotICAgICAgICBkZWYuYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nLnNldFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX09QRVJBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5hZGRCaW5kaW5nT3BlcmF0aW9uKHBhcnNlQmluZGluZ09wZXJhdGlvbih0ZW1wRWwsIHBvcnRUeXBlLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmcuY2xhc3MsIHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24oYmluZGluZywgYmluZGluZ0VsKTsKLQotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbkVsIFRoZSBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcG9ydFR5cGUgVGhlIHBvcnRUeXBlIHRoZSBiaW5kaW5nIHJlZmVyZW5jZXMuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdPcGVyYXRpb24gcGFyc2VCaW5kaW5nT3BlcmF0aW9uKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsLCBQb3J0VHlwZSBwb3J0VHlwZSwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGRlZi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ09wZXJhdGlvbkVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU5QVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KHBhcnNlQmluZGluZ0lucHV0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9PVVRQVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChwYXJzZUJpbmRpbmdPdXRwdXQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0ZBVUxULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChwYXJzZUJpbmRpbmdGYXVsdCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ09wZXJhdGlvbi5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgICAgIC8vU3RyaW5nIGlucHV0TmFtZSA9IChiaW5kaW5nSW5wdXQgIT0gbnVsbCA/IGJpbmRpbmdJbnB1dC5nZXROYW1lKCkgOiBudWxsKTsKLSAgICAgIC8vU3RyaW5nIG91dHB1dE5hbWUgPSAoYmluZGluZ091dHB1dCAhPSBudWxsID8gYmluZGluZ091dHB1dC5nZXROYW1lKCkgOiBudWxsKTsKLQotICAgICAgLy8gaGFjayBjb2RlIHRvIGdldCBhdCBvcGVyYXRpb25zIHRoYXQgYXJlIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQKLSAgICAgIC8vIGlucHV0cyBhbmQgb3V0cHV0cyAKLSAgICAgIE9wZXJhdGlvbiBvcCA9IG51bGw7Ci0gICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAvLyBnZXQgYSBsaXN0IG9mIGFsbCBvcGVyYXRpb25zIHdpdGggbWF0Y2hpbmcgbmFtZXMKLSAgICAgIExpc3QgbWF0Y2hpbmdPcGVyYXRpb25zID0gbmV3IFZlY3RvcigpOwotICAgICAgSXRlcmF0b3IgaU9wZXJhdGlvbnMgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaU9wZXJhdGlvbnMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gb3BlciA9IChPcGVyYXRpb24paU9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICBpZiAob3Blci5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXRjaGluZ09wZXJhdGlvbnMuYWRkKG9wZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtYXRjaGluZ09wZXJhdGlvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBtYXRjaGluZyBvcGVyYXRpb24gdGhpcyBpcyB3aGF0IHdlJ3JlIHJlZmVycmluZyB0by4KLSAgICAgICAgLy8gT25seSBtYXRjaGluZyBpZiBiaW5kaW5nIG9wZXJhdGlvbiBpbnB1dCBuYW1lIGFuZCBvdXRwdXQgbmFtZSBhcmUKLSAgICAgICAgLy8gYm90aCBudWxsIG9yIHRoZSBzYW1lIGFzIHRoZSBwb3J0VHlwZSBvcGVyYXRpb24gaW5wdXQgYW5kIG91dHB1dCBuYW1lcy4KLSAgICAgICAgLy8gdGhlIHBvcnRUeXBlIG9wZXJhdGlvbiBuYW1lCi0gICAgICAgIGlmIChtYXRjaGluZ09wZXJhdGlvbnMuc2l6ZSgpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBvbmx5IHNheSB0aGUgc2luZ2xlIG9wZXJhdGlvbiBpcyB0aGUgb25lIHdlJ3JlIGxvb2tpbmcgZm9yIGlmIHRoZSBuYW1lcwotICAgICAgICAgIC8vIG9mIHRoZSBiaW5kaW5nIGlucHV0IGFuZCBvdXRwdXQgYXJlIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICBPcGVyYXRpb24gdGVtcE9wID0gKE9wZXJhdGlvbiltYXRjaGluZ09wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICAgIGJvb2xlYW4gaW5wdXRPSyA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gb3V0cHV0T0sgPSBmYWxzZTsKLSAgICAgICAgICBJbnB1dCB0ZW1wSW5wdXQgPSB0ZW1wT3AuZ2V0SW5wdXQoKTsKLSAgICAgICAgICBPdXRwdXQgdGVtcE91dHB1dCA9IHRlbXBPcC5nZXRPdXRwdXQoKTsKLQotICAgICAgICAgIC8vIG9yZGVyIGlzIGltcG9ydGFudCBpbiB0aGVzZSBjb25kaXRpb25zLiBjb25kaXRpb24gMiBtdXN0IGZhaWwgZm9yIDMgdG8gd29yawotICAgICAgICAgIC8vIGNoZWNrIHRoZSBpbnB1dAotICAgICAgICAgIGlmICh0ZW1wSW5wdXQgPT0gbnVsbCAmJiBiaW5kaW5nSW5wdXQgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dE9LID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYmluZGluZ0lucHV0ID09IG51bGwgfHwgYmluZGluZ0lucHV0LmdldE5hbWUoKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh0ZW1wSW5wdXQgIT0gbnVsbCAmJiBiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpLmVxdWFscyh0ZW1wSW5wdXQuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dE9LID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gY2hlY2sgdGhlIG91dHB1dAotICAgICAgICAgIGlmICh0ZW1wT3V0cHV0ID09IG51bGwgJiYgYmluZGluZ091dHB1dCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dE9LID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYmluZGluZ091dHB1dCA9PSBudWxsIHx8IGJpbmRpbmdPdXRwdXQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh0ZW1wT3V0cHV0ICE9IG51bGwgJiYgYmluZGluZ091dHB1dC5nZXROYW1lKCkuZXF1YWxzKHRlbXBPdXRwdXQuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRPSyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpbnB1dE9LICYmIG91dHB1dE9LKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wID0gdGVtcE9wOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyAgICAgICAgICBvcCA9IChPcGVyYXRpb24pIG1hdGNoaW5nT3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb3RoZXJ3aXNlIGZpbmQgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUsIGlucHV0bmFtZSwgb3V0cHV0bmFtZSBzaWduYXR1cmUKLSAgICAgICAgaWYgKG1hdGNoaW5nT3BlcmF0aW9ucyAhPSBudWxsICYmIG9wID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpTWF0Y2hpbmdPcGVyYXRpb25zID0gbWF0Y2hpbmdPcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGlNYXRjaGluZ09wZXJhdGlvbnMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgYm9vbGVhbiBpbnB1dE5hbWVzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gb3V0cHV0TmFtZXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXIgPSAoT3BlcmF0aW9uKWlNYXRjaGluZ09wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgLy8gICAgICAgICAgaWYgKG9wZXIuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgICAgLy8gICAgICAgICAgewotICAgICAgICAgICAgSW5wdXQgb3BJbnB1dCA9IG9wZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChvcElucHV0ICE9IG51bGwgJiYgYmluZGluZ0lucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBvcElucHV0TmFtZSA9IG9wSW5wdXQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lucHV0TmFtZSA9IGJpbmRpbmdJbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIGlmIChvcElucHV0TmFtZSAhPSBudWxsICYmIG9wSW5wdXROYW1lLmVxdWFsc0lnbm9yZUNhc2UoYmluZGluZ0lucHV0TmFtZSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKG9wSW5wdXROYW1lID09IG51bGwgJiYgYmluZGluZ0lucHV0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5wdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob3BJbnB1dCA9PSBudWxsICYmIGJpbmRpbmdJbnB1dCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3V0cHV0IG9wT3V0cHV0ID0gb3Blci5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgIGlmIChvcE91dHB1dCAhPSBudWxsICYmIGJpbmRpbmdPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIG9wT3V0cHV0TmFtZSA9IG9wT3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdPdXRwdXROYW1lID0gYmluZGluZ091dHB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIGlmIChvcE91dHB1dE5hbWUgIT0gbnVsbCAmJiBvcE91dHB1dE5hbWUuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nT3V0cHV0TmFtZSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChvcE91dHB1dE5hbWUgPT0gbnVsbCAmJiBiaW5kaW5nT3V0cHV0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9wT3V0cHV0ID09IG51bGwgJiYgYmluZGluZ091dHB1dCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbnB1dE5hbWVzRXF1YWwgJiYgb3V0cHV0TmFtZXNFcXVhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3AgPSBvcGVyOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy9PcGVyYXRpb24gb3AgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb24obmFtZSwgaW5wdXROYW1lLCBvdXRwdXROYW1lKTsKLQotICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wID0gZGVmLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICBvcC5zZXROYW1lKG5hbWUpOwotICAgICAgICBwb3J0VHlwZS5hZGRPcGVyYXRpb24ob3ApOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbihvcCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihiaW5kaW5nT3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uRWwpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGJpbmRpbmcgaW5wdXQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nSW5wdXRFbCBUaGUgYmluZGluZyBpbnB1dCBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBiaW5kaW5nIGlucHV0IGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdJbnB1dCBwYXJzZUJpbmRpbmdJbnB1dChFbGVtZW50IGJpbmRpbmdJbnB1dEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBkZWYuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ0lucHV0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nSW5wdXQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdJbnB1dEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0lucHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdJbnB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmdJbnB1dC5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihiaW5kaW5nSW5wdXQsIGJpbmRpbmdJbnB1dEVsKTsKLQotICAgIHJldHVybiBiaW5kaW5nSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBiaW5kaW5nIG91dHB1dCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdPdXRwdXRFbCBUaGUgYmluZGluZyBvdXRwdXQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgYmluZGluZyBvdXRwdXQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dCBwYXJzZUJpbmRpbmdPdXRwdXQoRWxlbWVudCBiaW5kaW5nT3V0cHV0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gZGVmLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShiaW5kaW5nT3V0cHV0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3V0cHV0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChiaW5kaW5nT3V0cHV0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQocGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChCaW5kaW5nT3V0cHV0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmdPdXRwdXQsIGJpbmRpbmdPdXRwdXRFbCk7Ci0KLSAgICByZXR1cm4gYmluZGluZ091dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGJpbmRpbmcgZmF1bHQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nRmF1bHRFbCBUaGUgYmluZGluZyBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBiaW5kaW5nIGZhdWx0IGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdGYXVsdCBwYXJzZUJpbmRpbmdGYXVsdChFbGVtZW50IGJpbmRpbmdGYXVsdEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSBkZWYuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ0ZhdWx0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nRmF1bHQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdGYXVsdEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0ZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdGYXVsdC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmdGYXVsdC5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihiaW5kaW5nRmF1bHQsIGJpbmRpbmdGYXVsdEVsKTsKLQotICAgIHJldHVybiBiaW5kaW5nRmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBtZXNzYWdlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gbXNnRWwgVGhlIG1lc3NhZ2UgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgbWVzc2FnZSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlIHBhcnNlTWVzc2FnZShFbGVtZW50IG1zZ0VsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE1lc3NhZ2UgbXNnID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShtc2dFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFFOYW1lIG1lc3NhZ2VOYW1lID0gbmV3IFFOYW1lKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSk7Ci0KLSAgICAgIG1zZyA9IGRlZi5nZXRNZXNzYWdlKG1lc3NhZ2VOYW1lKTsKLQotICAgICAgaWYgKG1zZyA9PSBudWxsKQotICAgICAgewotICAgICAgICBtc2cgPSBkZWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBtc2cuc2V0UU5hbWUobWVzc2FnZU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIW1zZy5pc1VuZGVmaW5lZCgpKQotICAgICAgewotICAgICAgICAvLyBwcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UgYXMgYSBtZXNzYWdlIHdpdGggdGhpcyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZAotICAgICAgICBhZGRSZWFkZXJFcnJvcigKLSAgICAgICAgICBkZWYsCi0gICAgICAgICAgbXNnRWwsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9NRVNTQUdFX05BTUVfQUxSRUFEWV9ERUZJTkVEIiwgIiciICsgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1zZyA9IGRlZi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgfQotCi0gICAgLy8gV2hldGhlciBpdCB3YXMgcmV0cmlldmVkIG9yIGNyZWF0ZWQsIHRoZSBkZWZpbml0aW9uIGhhcyBiZWVuIGZvdW5kLgotICAgIG1zZy5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChtc2dFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIG1zZy5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fUEFSVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgbXNnLmFkZFBhcnQocGFyc2VQYXJ0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihtc2csIG1zZ0VsKTsKLQotICAgIHJldHVybiBtc2c7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBwYXJ0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcGFydEVsIFRoZSBwYXJ0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIHBhcnQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgUGFydCBwYXJzZVBhcnQoRWxlbWVudCBwYXJ0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgUGFydCBwYXJ0ID0gZGVmLmNyZWF0ZVBhcnQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShwYXJ0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgUU5hbWUgZWxlbWVudE5hbWU7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZWxlbWVudE5hbWUgPSBET01VdGlscy5nZXRRdWFsaWZpZWRBdHRyaWJ1dGVWYWx1ZShwYXJ0RWwsIENvbnN0YW50cy5BVFRSX0VMRU1FTlQsIENvbnN0YW50cy5FTEVNX01FU1NBR0UsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIGVsZW1lbnQgbmFtZQotICAgICAgZWxlbWVudE5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBhcnRFbCwgQ29uc3RhbnRzLkFUVFJfRUxFTUVOVCkpOwotICAgIH0KLQotICAgIFFOYW1lIHR5cGVOYW1lOwotICAgIHRyeQotICAgIHsKLSAgICAgIHR5cGVOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUocGFydEVsLCBDb25zdGFudHMuQVRUUl9UWVBFLAotICAgICAgICAvLyBDb3JyZWN0ZWQgLSB3YXMgQVRUUl9FTEVNRU5UCi0gIENvbnN0YW50cy5FTEVNX01FU1NBR0UsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIGVsZW1lbnQgYXR0cmlidXRlCi0gICAgICB0eXBlTmFtZSA9IG5ldyBRTmFtZShudWxsLCBET01VdGlscy5nZXRBdHRyaWJ1dGUocGFydEVsLCBDb25zdGFudHMuQVRUUl9UWVBFKSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJ0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRFbGVtZW50TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwYXJ0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwYXJ0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgTWFwIGV4dGVuc2lvbkF0dHJpYnV0ZXMgPSBwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKTsKLQotICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMucHV0QWxsKGdldFBhcnRBdHRyaWJ1dGVzKHBhcnRFbCwgZGVmKSk7Ci0KLSAgICAvLyBOZWVkIHRvIGRvIHNvbWV0aGluZyBoZXJlIHRvIGxvY2F0ZSBwYXJ0IGRlZmluaXRpb24uCi0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKHBhcnQsIHBhcnRFbCk7Ci0KLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBtYXAgb2YgdGhlIHBhcnQgYXR0cmlidXRlcy4KLSAgICogCi0gICAqIEBwYXJhbSBlbCBUaGUgcGFydCBhdHRyaWJ1dGVzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmludGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIG1hcCBjb250YWluaW5nIHRoZSBwYXJ0IGF0dHJpYnV0ZXMuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE1hcCBnZXRQYXJ0QXR0cmlidXRlcyhFbGVtZW50IGVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBOYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVsLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0cyA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0KLSAgICBmb3IgKGludCBhID0gMDsgYSA8IGF0dHM7IGErKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKW5vZGVNYXAuaXRlbShhKTsKLSAgICAgIFN0cmluZyBsTmFtZSA9IGF0dHJpYnV0ZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIFN0cmluZyBuU3BhY2UgPSBhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gYXR0cmlidXRlLmdldFByZWZpeCgpOwotICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZShuU3BhY2UsIGxOYW1lKTsKLQotICAgICAgaWYgKG5TcGFjZSAhPSBudWxsICYmICFuU3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfV1NETCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghblNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hNTE5TKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzdHJWYWx1ZSA9IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOwotICAgICAgICAgIFFOYW1lIHFWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBxVmFsdWUgPSBET01VdGlscy5nZXRRTmFtZShzdHJWYWx1ZSwgZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHFWYWx1ZSA9IG5ldyBRTmFtZShzdHJWYWx1ZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgcVZhbHVlKTsKLQotICAgICAgICAgIFN0cmluZyB0ZW1wTlNVcmkgPSBkZWYuZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0KLSAgICAgICAgICB3aGlsZSAodGVtcE5TVXJpICE9IG51bGwgJiYgIXRlbXBOU1VyaS5lcXVhbHMoblNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmaXggKz0gIl8iOwotICAgICAgICAgICAgdGVtcE5TVXJpID0gZGVmLmdldE5hbWVzcGFjZShwcmVmaXgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGRlZi5hZGROYW1lc3BhY2UocHJlZml4LCBuU3BhY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgIWxOYW1lLmVxdWFscyhDb25zdGFudHMuQVRUUl9OQU1FKQotICAgICAgICAgICYmICFsTmFtZS5lcXVhbHMoQ29uc3RhbnRzLkFUVFJfRUxFTUVOVCkKLSAgICAgICAgICAmJiAhbE5hbWUuZXF1YWxzKENvbnN0YW50cy5BVFRSX1RZUEUpKQotICAgICAgewotICAgICAgICBXU0RMRXhjZXB0aW9uIHdzZGxFeGMgPQotICAgICAgICAgIG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICAgICAgV1NETEV4Y2VwdGlvbi5JTlZBTElEX1dTREwsCi0gICAgICAgICAgICAiRW5jb3VudGVyZWQgaWxsZWdhbCAiCi0gICAgICAgICAgICAgICsgInBhcnQgZXh0ZW5zaW9uICIKLSAgICAgICAgICAgICAgKyAiYXR0cmlidXRlICciCi0gICAgICAgICAgICAgICsgbmFtZQotICAgICAgICAgICAgICArICInLiBFeHRlbnNpb24gIgotICAgICAgICAgICAgICArICJhdHRyaWJ1dGVzIG11c3QgYmUgaW4gIgotICAgICAgICAgICAgICArICJhIG5hbWVzcGFjZSBvdGhlciB0aGFuICIKLSAgICAgICAgICAgICAgKyAiV1NETCdzLiIpOwotCi0gICAgICAgIHdzZGxFeGMuc2V0TG9jYXRpb24oWFBhdGhVdGlscy5nZXRYUGF0aEV4cHJGcm9tTm9kZShlbCkpOwotICAgICAgICAvL3Rocm93IHdzZGxFeGM7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihhdHRyaWJ1dGVzLCBlbCk7Ci0KLSAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcG9ydFR5cGVFbCBUaGUgcG9ydFR5cGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBwb3J0VHlwZSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBwYXJzZVBvcnRUeXBlKEVsZW1lbnQgcG9ydFR5cGVFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLQotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShwb3J0VHlwZUVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgcG9ydFR5cGVOYW1lID0gbmV3IFFOYW1lKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSk7Ci0KLSAgICAgIHBvcnRUeXBlID0gZGVmLmdldFBvcnRUeXBlKHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICBwb3J0VHlwZS5zZXRRTmFtZShwb3J0VHlwZU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIXBvcnRUeXBlLmlzVW5kZWZpbmVkKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHRoZSBQb3J0VHlwZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgcHJvZHVjZSBhbiBlcnJvciBhbmQgcmV0dXJuIG51bGwKLSAgICAgICAgYWRkUmVhZGVyRXJyb3IoCi0gICAgICAgICAgZGVmLAotICAgICAgICAgIHBvcnRUeXBlRWwsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9QT1JUVFlQRV9OQU1FX0FMUkVBRFlfREVGSU5FRCIsICInIiArIHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgIH0KLQotICAgIC8vIFdoZXRoZXIgaXQgd2FzIHJldHJpZXZlZCBvciBjcmVhdGVkLCB0aGUgZGVmaW5pdGlvbiBoYXMgYmVlbiBmb3VuZC4KLSAgICBwb3J0VHlwZS5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwb3J0VHlwZUVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgcG9ydFR5cGUuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX09QRVJBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbW9kaWZpZWQgc28gZHVwbGljYXRlIG9wZXJhdGlvbnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gcG9ydHR5cGUgCi0gICAgICAgIE9wZXJhdGlvbiBvcCA9IHBhcnNlT3BlcmF0aW9uKHRlbXBFbCwgcG9ydFR5cGUsIGRlZik7Ci0gICAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wKTsKLSAgICAgICAgfQotICAgICAgICAvL3BvcnRUeXBlLmFkZE9wZXJhdGlvbihwYXJzZU9wZXJhdGlvbih0ZW1wRWwsIHBvcnRUeXBlLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gc29tZXRoaW5nIGVsc2UgdGhhdCBzaG91bGRuJ3QgYmUgaGVyZQotICAgICAgICAvLyBORUVEIFRPIEFERCBUTyBFUlJPUiBMSVNUCi0gICAgICAgIC8vRE9NVXRpbHMudGhyb3dXU0RMRXhjZXB0aW9uKHRlbXBFbCk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24ocG9ydFR5cGUsIHBvcnRUeXBlRWwpOwotCi0gICAgcmV0dXJuIHBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gb3BFbCBUaGUgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBUaGUgcG9ydFR5cGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBwYXJzZU9wZXJhdGlvbihFbGVtZW50IG9wRWwsIFBvcnRUeXBlIHBvcnRUeXBlLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE9wZXJhdGlvbiBvcCA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUob3BFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgU3RyaW5nIHBhcmFtZXRlck9yZGVyU3RyID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKG9wRWwsIENvbnN0YW50cy5BVFRSX1BBUkFNRVRFUl9PUkRFUik7Ci0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChvcEVsKTsKLSAgICBMaXN0IG1lc3NhZ2VPcmRlciA9IG5ldyBWZWN0b3IoKTsKLSAgICBFbGVtZW50IGRvY0VsID0gbnVsbDsKLSAgICBJbnB1dCBpbnB1dCA9IG51bGw7Ci0gICAgT3V0cHV0IG91dHB1dCA9IG51bGw7Ci0gICAgTGlzdCBmYXVsdHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGRvY0VsID0gdGVtcEVsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU5QVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0ID0gcGFyc2VJbnB1dCh0ZW1wRWwsIGRlZik7Ci0gICAgICAgIG1lc3NhZ2VPcmRlci5hZGQoQ29uc3RhbnRzLkVMRU1fSU5QVVQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fT1VUUFVULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBvdXRwdXQgPSBwYXJzZU91dHB1dCh0ZW1wRWwsIGRlZik7Ci0gICAgICAgIG1lc3NhZ2VPcmRlci5hZGQoQ29uc3RhbnRzLkVMRU1fT1VUUFVUKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0ZBVUxULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBmYXVsdHMuYWRkKHBhcnNlRmF1bHQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gaW52YWxpZCBlbGVtZW50IGluIHRoZSBvcGVyYXRpb24KLSAgICAgICAgLy8gWE1MIGNoZWNrIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgaW5wdXROYW1lID0gKGlucHV0ICE9IG51bGwgPyBpbnB1dC5nZXROYW1lKCkgOiBudWxsKTsKLSAgICAgIFN0cmluZyBvdXRwdXROYW1lID0gKG91dHB1dCAhPSBudWxsID8gb3V0cHV0LmdldE5hbWUoKSA6IG51bGwpOwotCi0gICAgICBib29sZWFuIG9wRGVmaW5lZCA9IGZhbHNlOwotCi0gICAgICB0cnkKLSAgICAgIHsKLQotICAgICAgICAvL29wID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9uKG5hbWUsIGlucHV0TmFtZSwgb3V0cHV0TmFtZSk7Ci0KLSAgICAgICAgLy9PcGVyYXRpb24gb3AgPSBudWxsOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25zICE9IG51bGwpCi0gICAgICAgIHsKLQotICAgICAgICAgIEl0ZXJhdG9yIGlPcGVyYXRpb25zID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpT3BlcmF0aW9ucy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBpbnB1dE5hbWVzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gb3V0cHV0TmFtZXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXIgPSAoT3BlcmF0aW9uKWlPcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvcGVyLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElucHV0IG9wSW5wdXQgPSBvcGVyLmdldElucHV0KCk7Ci0gICAgICAgICAgICAgIGlmIChvcElucHV0ICE9IG51bGwgJiYgaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBvcElucHV0TmFtZSA9IG9wSW5wdXQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChvcElucHV0TmFtZSAhPSBudWxsICYmIGlucHV0TmFtZSAhPSBudWxsICYmIG9wSW5wdXROYW1lLmVxdWFscyhpbnB1dE5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlucHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wSW5wdXROYW1lID09IG51bGwgJiYgaW5wdXROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW5wdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAob3BJbnB1dCA9PSBudWxsICYmIGlucHV0ID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIE91dHB1dCBvcE91dHB1dCA9IG9wZXIuZ2V0T3V0cHV0KCk7Ci0gICAgICAgICAgICAgIGlmIChvcE91dHB1dCAhPSBudWxsICYmIG91dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wT3V0cHV0TmFtZSA9IG9wT3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAob3BPdXRwdXROYW1lICE9IG51bGwgJiYgb3V0cHV0TmFtZSAhPSBudWxsICYmIG9wT3V0cHV0TmFtZS5lcXVhbHMob3V0cHV0TmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3V0cHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsICYmIG91dHB1dE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAob3BPdXRwdXQgPT0gbnVsbCAmJiBvdXRwdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChpbnB1dE5hbWVzRXF1YWwgJiYgb3V0cHV0TmFtZXNFcXVhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wID0gb3BlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAvKiYmICFvcC5pc1VuZGVmaW5lZCgpKi8KLSAgICAgICAgKQotICAgICAgewotICAgICAgICAvL29wID0gbnVsbDsKLSAgICAgICAgb3BEZWZpbmVkID0gdHJ1ZTsKLQotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiAhb3BEZWZpbmVkKQotICAgICAgewotICAgICAgICBpZiAoaW5wdXROYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbnB1dCB0ZW1wSW4gPSBvcC5nZXRJbnB1dCgpOwotCi0gICAgICAgICAgaWYgKHRlbXBJbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0ZW1wSW4uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vb3AgPSBudWxsOwotICAgICAgICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiAhb3BEZWZpbmVkKQotICAgICAgewotICAgICAgICBpZiAob3V0cHV0TmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgT3V0cHV0IHRlbXBPdXQgPSBvcC5nZXRPdXRwdXQoKTsKLQotICAgICAgICAgIGlmICh0ZW1wT3V0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHRlbXBPdXQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vb3AgPSBudWxsOwotICAgICAgICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAob3BEZWZpbmVkKQotICAgICAgewotICAgICAgICAvLyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgd2UncmUgZ29pbmcgdG8gcmV0dXJuIG51bGwuCi0gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgV1NETCAxLjIgd29ya2luZyBkcmFmdCBvcGVyYXRpb24gb3ZlcmxvYWRpbmcgaXMgbm8gbG9uZ2VyIGFsbG93ZWQuCi0gICAgICAgIC8vIEdvaW5nIHRvIHVzZSB0aGF0IGhlcmUgdG8gc2F2ZSBhIGxvdCBvZiB3b3JrCi0gICAgICAgIHNldExvY2F0aW9uKG9wLCBvcEVsKTsKLSAgICAgICAgYWRkUmVhZGVyRXJyb3IoCi0gICAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgICAgb3AsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAiX0RVUExJQ0FURV9PUEVSQVRJT05fRk9SX1BPUlRUWVBFIiwKLSAgICAgICAgICAgICInIiArIG9wLmdldE5hbWUoKSArICInIiwKLSAgICAgICAgICAgICInIiArIHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3AgPSBkZWYuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgICAgIG9wLnNldE5hbWUobmFtZSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG9wID0gZGVmLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIH0KLQotICAgIC8vIFdoZXRoZXIgaXQgd2FzIHJldHJpZXZlZCBvciBjcmVhdGVkLCB0aGUgZGVmaW5pdGlvbiBoYXMgYmVlbiBmb3VuZC4KLSAgICBvcC5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgaWYgKHBhcmFtZXRlck9yZGVyU3RyICE9IG51bGwpCi0gICAgewotICAgICAgb3Auc2V0UGFyYW1ldGVyT3JkZXJpbmcoU3RyaW5nVXRpbHMucGFyc2VOTVRva2VucyhwYXJhbWV0ZXJPcmRlclN0cikpOwotICAgIH0KLQotICAgIGlmIChkb2NFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcC5zZXRJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wLnNldE91dHB1dChvdXRwdXQpOwotICAgIH0KLQotICAgIGlmIChmYXVsdHMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBmYXVsdEl0ZXJhdG9yID0gZmF1bHRzLml0ZXJhdG9yKCk7Ci0KLSAgICAgIHdoaWxlIChmYXVsdEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRmF1bHQgZiA9IChGYXVsdClmYXVsdEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgLy8gaWYgdGhlIGZhdWx0IGlzbid0IGRlZmluZWQgeWV0Ci0gICAgICAgIGlmIChvcC5nZXRGYXVsdChmLmdldE5hbWUoKSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG9wLmFkZEZhdWx0KGYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgICAgb3AsCi0gICAgICAgICAgICBmLAotICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9EVVBMSUNBVEVfRkFVTFRfTkFNRSIsICInIiArIGYuZ2V0TmFtZSgpICsgIiciLCAiJyIgKyBvcC5nZXROYW1lKCkgKyAiJyIpKTsKLSAgICAgICAgICAvL2ZhdWx0RXJyb3JzLmFkZChuZXcgT2JqZWN0W117ZiwiRHVwbGljYXRlIE5hbWUiLG9wfSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBPcGVyYXRpb25UeXBlIHN0eWxlID0gbnVsbDsKLQotICAgIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX09ORV9XQVkpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5PTkVfV0FZOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX1JFUVVFU1RfUkVTUE9OU0UpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX1NPTElDSVRfUkVTUE9OU0UpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX05PVElGSUNBVElPTikpCi0gICAgewotICAgICAgc3R5bGUgPSBPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcC5zZXRTdHlsZShzdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihvcCwgb3BFbCk7Ci0KLSAgICAvLyBtb2RpZmllZCB0byByZW1vdmUgZHVwbGljYXRlIG9wZXJhdGlvbnMKLSAgICAvLyAgICBpZihvcERlZmluZWQpCi0gICAgLy8gICAgewotICAgIC8vICAgICAgYWRkUmVhZGVyRXJyb3IocG9ydFR5cGUsb3AsVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfRFVQTElDQVRFX09QRVJBVElPTl9GT1JfUE9SVFRZUEUiLCInIitvcC5nZXROYW1lKCkrIiciLCInIitwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKyInIikpOwotICAgIC8vICAgICAgcmV0dXJuIG51bGw7Ci0gICAgLy8gICAgfQotICAgIHJldHVybiBvcDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHNlcnZpY2UgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBzZXJ2aWNlRWwgVGhlIHNlcnZpY2UgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBzZXJ2aWNlIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2UgcGFyc2VTZXJ2aWNlKEVsZW1lbnQgc2VydmljZUVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFNlcnZpY2Ugc2VydmljZSA9IGRlZi5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoc2VydmljZUVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2VydmljZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lKSk7Ci0gICAgfQotICAgIFNlcnZpY2UgczsKLSAgICAvLyBhIHNlcnZpY2Ugd2l0aCB0aGlzIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCi0gICAgaWYgKChzID0gZGVmLmdldFNlcnZpY2Uoc2VydmljZS5nZXRRTmFtZSgpKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRSZWFkZXJFcnJvcigKLSAgICAgICAgZGVmLAotICAgICAgICBzZXJ2aWNlRWwsCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfU0VSVklDRV9OQU1FX0FMUkVBRFlfREVGSU5FRCIsICInIiArIHMuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICInIikpOwotICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoc2VydmljZUVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fUE9SVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHBhcnNlUG9ydCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXJ2aWNlLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU2VydmljZS5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihzZXJ2aWNlLCBzZXJ2aWNlRWwpOwotCi0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHBvcnQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBwb3J0RWwgVGhlIHBvcnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgcG9ydCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBQb3J0IHBhcnNlUG9ydChFbGVtZW50IHBvcnRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBQb3J0IHBvcnQgPSBkZWYuY3JlYXRlUG9ydCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBvcnRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgYmluZGluZ1N0cjsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiaW5kaW5nU3RyID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUocG9ydEVsLCBDb25zdGFudHMuQVRUUl9CSU5ESU5HLCBDb25zdGFudHMuRUxFTV9QT1JULCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL3RoZSBjYWxsIGFib3ZlIGZhaWxzIGlmIHRoZXJlIGlzIG5vIHF1YWxpZmllZCBuYW1lc3BhY2UgZm9yIHRoZSBtZXNzYWdlIG5hbWUKLSAgICAgIGJpbmRpbmdTdHIgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBvcnRFbCwgImJpbmRpbmciKSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwb3J0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGJpbmRpbmdTdHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSBkZWYuZ2V0QmluZGluZyhiaW5kaW5nU3RyKTsKLQotICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZyA9IGRlZi5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgICAgIGJpbmRpbmcuc2V0UU5hbWUoYmluZGluZ1N0cik7Ci0gICAgICAgIGRlZi5hZGRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgfQotCi0gICAgICBwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwb3J0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHBvcnQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQocGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChQb3J0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKHBvcnQsIHBvcnRFbCk7Ci0KLSAgICByZXR1cm4gcG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRUeXBlIFRoZSBwYXJlbnQgdHlwZSBvZiB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgKiBAcGFyYW0gZWwgVGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmlsaXR5RWxlbWVudCBwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KENsYXNzIHBhcmVudFR5cGUsIEVsZW1lbnQgZWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBRTmFtZSBlbGVtZW50VHlwZSA9IFFOYW1lVXRpbHMubmV3UU5hbWUoZWwpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnID0gZGVmLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgICAgIGlmIChleHRSZWcgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oCi0gICAgICAgICAgV1NETEV4Y2VwdGlvbi5DT05GSUdVUkFUSU9OX0VSUk9SLAotICAgICAgICAgICJObyBFeHRlbnNpb25SZWdpc3RyeSBzZXQgZm9yIHRoaXMgIgotICAgICAgICAgICAgKyAiRGVmaW5pdGlvbiwgc28gdW5hYmxlIHRvIGRlc2VyaWFsaXplICIKLSAgICAgICAgICAgICsgImEgJyIKLSAgICAgICAgICAgICsgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICsgIicgZWxlbWVudCBpbiB0aGUgIgotICAgICAgICAgICAgKyAiY29udGV4dCBvZiBhICciCi0gICAgICAgICAgICArIHBhcmVudFR5cGUuZ2V0TmFtZSgpCi0gICAgICAgICAgICArICInLiIpOwotICAgICAgfQotCi0gICAgICBFeHRlbnNpb25EZXNlcmlhbGl6ZXIgZXh0RFMgPSBleHRSZWcucXVlcnlEZXNlcmlhbGl6ZXIocGFyZW50VHlwZSwgZWxlbWVudFR5cGUpOwotCi0gICAgICAvLyBhc2lnbiB0aGUgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdG8gYSB2YXIgc28gd2UgY2FuIGFkZCBpdCB0byB0aGUgbG9jYXRpb25zCi0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gZXh0RFMudW5tYXJzaGFsbChwYXJlbnRUeXBlLCBlbGVtZW50VHlwZSwgZWwsIGRlZiwgZXh0UmVnKTsKLSAgICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgICAvLyB0aGlzIG1pZ2h0IG5vdCB3b3JrIHByb3Blcmx5Ci0gICAgICBzZXRMb2NhdGlvbihleHRFbGVtLCBlbCk7Ci0KLSAgICAgIC8vIHJlZ2lzdGVyIGFsbCBvZiB0aGUgY2hpbGQgRWxlbWVudHMgc28gd2UgY2FuIGZpbmQgdGhlbSBsYXRlcgotICAgICAgLy8gdXNlZCBmb3IgaW5saW5lIHNjaGVtYSB2YWxpZGF0aW9uCi0gICAgICByZWdpc3RlckNoaWxkRWxlbWVudHMoZXh0RWxlbSk7Ci0KLSAgICAgIHJldHVybiBleHRFbGVtOwotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGlmIChlLmdldExvY2F0aW9uKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZS5zZXRMb2NhdGlvbihYUGF0aFV0aWxzLmdldFhQYXRoRXhwckZyb21Ob2RlKGVsKSk7Ci0gICAgICB9Ci0gICAgICB0aHJvdyBlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGlucHV0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gaW5wdXRFbCBUaGUgaW5wdXQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBpbnB1dCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBJbnB1dCBwYXJzZUlucHV0KEVsZW1lbnQgaW5wdXRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLQotICAgIElucHV0IGlucHV0ID0gZGVmLmNyZWF0ZUlucHV0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoaW5wdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoaW5wdXRFbCwgQ29uc3RhbnRzLkFUVFJfTUVTU0FHRSwgQ29uc3RhbnRzLkVMRU1fSU5QVVQsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIG1lc3NhZ2UgbmFtZQotICAgICAgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGlucHV0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgaW5wdXQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZU5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBkZWYuZ2V0TWVzc2FnZShtZXNzYWdlTmFtZSk7Ci0KLSAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBkZWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBtZXNzYWdlLnNldFFOYW1lKG1lc3NhZ2VOYW1lKTsKLSAgICAgICAgZGVmLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlucHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChpbnB1dEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gWE1MIFZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGlzCi0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGlucHV0LCBpbnB1dEVsKTsKLQotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIG91dHB1dCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIG91dHB1dEVsIFRoZSBvdXRwdXQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBvdXRwdXQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgT3V0cHV0IHBhcnNlT3V0cHV0KEVsZW1lbnQgb3V0cHV0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgT3V0cHV0IG91dHB1dCA9IGRlZi5jcmVhdGVPdXRwdXQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShvdXRwdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUob3V0cHV0RWwsIENvbnN0YW50cy5BVFRSX01FU1NBR0UsIENvbnN0YW50cy5FTEVNX09VVFBVVCwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgbWVzc2FnZSBuYW1lCi0gICAgICBtZXNzYWdlTmFtZSA9IG5ldyBRTmFtZShudWxsLCBET01VdGlscy5nZXRBdHRyaWJ1dGUob3V0cHV0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgb3V0cHV0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKG1lc3NhZ2VOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZGVmLmdldE1lc3NhZ2UobWVzc2FnZU5hbWUpOwotCi0gICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gZGVmLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgbWVzc2FnZS5zZXRRTmFtZShtZXNzYWdlTmFtZSk7Ci0gICAgICAgIGRlZi5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgfQotCi0gICAgICBvdXRwdXQuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KG91dHB1dEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihvdXRwdXQsIG91dHB1dEVsKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBmYXVsdCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGZhdWx0RWwgVGhlIGZhdWx0IGVsZW1lbnQgdG8gcGFyc2UuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGZhdWx0IGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEZhdWx0IHBhcnNlRmF1bHQoRWxlbWVudCBmYXVsdEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEZhdWx0IGZhdWx0ID0gZGVmLmNyZWF0ZUZhdWx0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZmF1bHRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoZmF1bHRFbCwgQ29uc3RhbnRzLkFUVFJfTUVTU0FHRSwgQ29uc3RhbnRzLkVMRU1fSU5QVVQsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIG1lc3NhZ2UgbmFtZQotICAgICAgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGZhdWx0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgZmF1bHQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZU5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBkZWYuZ2V0TWVzc2FnZShtZXNzYWdlTmFtZSk7Ci0KLSAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBkZWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBtZXNzYWdlLnNldFFOYW1lKG1lc3NhZ2VOYW1lKTsKLSAgICAgICAgZGVmLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZhdWx0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChmYXVsdEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgZmF1bHQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gWE1MIFZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGlzCi0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGZhdWx0LCBmYXVsdEVsKTsKLQotICAgIHJldHVybiBmYXVsdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbWVzc2FnZWdlbmVyYXRvciBmb3IgdGhlIHJlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZyBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1nKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1nOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB0aGUgcmVmT2JqZWN0IHRvIHRoZSBlbGVtZW50TG9jYXRpb24gaGFzaHRhYmxlIHdpdGggdGhlIGxvY2F0aW9uIGRlZmluZWQgaW4gZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSByZWZPYmplY3QgVGhlIG9iamVjdCB0byBhZGQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TG9jYXRpb24oT2JqZWN0IHJlZk9iamVjdCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRWxlbWVudEltcGwgZWxlbWVudEltcGwgPSAoRWxlbWVudEltcGwpZWxlbWVudDsKLSAgICAgIEVsZW1lbnRMb2NhdGlvbiBlbGVtZW50TG9jYXRpb24gPSAoRWxlbWVudExvY2F0aW9uKWVsZW1lbnRJbXBsLmdldFVzZXJEYXRhKCk7Ci0gICAgICBpZiAoZWxlbWVudExvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0KLSAgICAgICAgZWxlbWVudExvY2F0aW9ucy5wdXQoCi0gICAgICAgICAgcmVmT2JqZWN0LAotICAgICAgICAgIG5ldyBMb2NhdGlvbkhvbGRlcihlbGVtZW50TG9jYXRpb24uZ2V0TGluZU51bWJlcigpLCBlbGVtZW50TG9jYXRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKSkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotICAvKioKLSAgICogQWRkIGEgcmVhZGVyIGVycm9yIHRvIHRoZSBsaXN0LgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlYWRlckVycm9yKE9iamVjdCBwYXJlbnRvYmplY3QsIE9iamVjdCBvYmplY3QsIFN0cmluZyBlcnJvcikKLSAgewotICAgIHJlYWRlckVycm9ycy5hZGQobmV3IFJlYWRlckVycm9yKHBhcmVudG9iamVjdCwgb2JqZWN0LCBlcnJvcikpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgcmVhZGVyIHdhcm5pbmcgdG8gdGhlIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50b2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIHdhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlYWRlcldhcm5pbmcoT2JqZWN0IHBhcmVudG9iamVjdCwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIHdhcm5pbmcpCi0gIHsKLSAgICByZWFkZXJXYXJuaW5ncy5hZGQobmV3IFJlYWRlckVycm9yKHBhcmVudG9iamVjdCwgb2JqZWN0LCB3YXJuaW5nKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWdpc3RlciBhbGwgb2YgdGhlIGxvY2F0aW9ucyBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGV4dGVuc2liaWxpdHkKLSAgICogZWxlbWVudCBnaXZlbi4KLSAgICogCi0gICAqIEBwYXJhbSBleHRFbGVtIFRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgd2hvc2UgY2hpbGQgZWxlbWVudHMgd2lsbCBiZSByZWdpc3RlcmVkLgotICAgKi8KLQotICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckNoaWxkRWxlbWVudHMoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSkKLSAgewotICAgIC8vIG9ubHkgYWRkIHRob3NlIHRoYXQgYXJlIG9mIHR5cGUgdW5rbm93bi4gaWYgdGhleSdyZSBrbm93biB0aGV5IAotICAgIC8vIHdpbGwgdGFrZSBjYXJlIG9mIHRoZW1zZWx2ZXMKLSAgICBpZiAoZXh0RWxlbSBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW0gPSAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtKS5nZXRFbGVtZW50KCk7Ci0gICAgICByZWdpc3RlckNoaWxkRWxlbWVudHNSZWN1cnNpdmVseShlbGVtKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhlIGxvY2F0aW9uIG9mIGFsbCBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgZWxlbS4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHdob3NlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgcmVnaXN0ZXJlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQ2hpbGRFbGVtZW50c1JlY3Vyc2l2ZWx5KEVsZW1lbnQgZWxlbSkKLSAgewotICAgIGlmIChlbGVtIGluc3RhbmNlb2YgRWxlbWVudE5TSW1wbCkKLSAgICB7Ci0gICAgICBzZXRMb2NhdGlvbihlbGVtLCBlbGVtKTsKLQotICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpIHx8IGkgPCA1OyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICAgIHJlZ2lzdGVyQ2hpbGRFbGVtZW50c1JlY3Vyc2l2ZWx5KGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogQ2hlY2sgdGhhdCBhbiBlbGVtZW50IG5hbWUgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBlbCBUaGUgZWxlbWVudCB3aXRoIHRoZSBuYW1lIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gcW5hbWUgVGhlIG5hbWUgdG8gY2hlY2sgYWdhaW5zdC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWxlbWVudE5hbWUoRWxlbWVudCBlbCwgUU5hbWUgcW5hbWUpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIVFOYW1lVXRpbHMubWF0Y2hlcyhxbmFtZSwgZWwpKQotICAgIHsKLSAgICAgIFdTRExFeGNlcHRpb24gd3NkbEV4YyA9IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uSU5WQUxJRF9XU0RMLCAiRXhwZWN0ZWQgZWxlbWVudCAnIiArIHFuYW1lICsgIicuIik7Ci0KLSAgICAgIHdzZGxFeGMuc2V0TG9jYXRpb24oWFBhdGhVdGlscy5nZXRYUGF0aEV4cHJGcm9tTm9kZShlbCkpOwotCi0gICAgICB0aHJvdyB3c2RsRXhjOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZWxlbWVudCBsb2NhdGlvbnMgaGFzaHRhYmxlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZWxlbWVudCBsb2NhdGlvbnMgaGFzaHRhYmxlLgotICAgKi8KLSAgcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50TG9jYXRpb25zKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50TG9jYXRpb25zOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSByZWFkZXIgZXJyb3JzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgcmVhZGVyIGVycm9ycy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFJlYWRlckVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gcmVhZGVyRXJyb3JzOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHJlYWRlciB3YXJuaW5ncy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHJlYWRlciB3YXJuaW5ncy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFJlYWRlcldhcm5pbmdzKCkKLSAgewotICAgIHJldHVybiByZWFkZXJXYXJuaW5nczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETFJlYWRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETFJlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2ZWNkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExSZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5MaW5lTnVtYmVyRE9NUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBBIFdTREwgcmVhZGVyIHRoYXQgc3VwcG9ydHMgY3ljbGljIFdTREwgaW1wb3J0cywgc2NoZW1hIGltcG9ydHMgYW5kIGlubGluZSBzY2hlbWFzLgotICogVGhpcyByZWFkZXIgaXMgYmFzZWQgb24gdGhlIFdTRExSZWFkZXJJbXBsIGZyb20gV1NETDRKLiAKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZWFkZXJJbXBsCi17Ci0gIHByb3RlY3RlZCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIHByb3RlY3RlZCBJV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm87Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbHZhbGluZm8gVGhlIFdTREwgMS4xIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIFdTRExSZWFkZXJJbXBsKElXU0RMMTFWYWxpZGF0aW9uSW5mbyB3c2RsdmFsaW5mbykKLSAgewotICAgIHRoaXMud3NkbHZhbGluZm8gPSB3c2RsdmFsaW5mbzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSByb290IGRvY3VtZW50LiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgYWxsIGltcG9ydHMgYW5kIHBhcnNlIHRoZW0gYXMgCi0gICAqIHdlbGwgY3JlYXRpbmcgYSBXU0RMRG9jdW1lbnQgZm9yIGVhY2ggdW5pcXVlIFdTREwgZmlsZS4gVGhpcyBtZXRob2Qgc3VwcG9ydHMKLSAgICogY3ljbGljIFdTREwgaW1wb3J0IHN0YXRlbWVudHMgc3VjaCB0aGF0IGZpbGUgQSBjYW4gaW1wb3J0IGZpbGUgQiBhbmQgZmlsZSBCCi0gICAqIGNhbiBpbXBvcnQgZmlsZSBBLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSBUaGUgYmFzZSBVUkkgb2YgdGhlIHJvb3QgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBkZWZFbCBUaGUgZGVmaW5pdGlvbiBlbGVtZW50IG9mIHRoZSByb290IGRvY3VtZW50LgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdTRExEb2N1bWVudHMgY29udGFpbmluZyBhbGwgb2YgdGhlIHVuaXF1ZSBmaWxlcyBpbiB0aGUgZGVzY3JpcHRpb24uCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExEb2N1bWVudFtdIHBhcnNlRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50QmFzZVVSSSwgRWxlbWVudCBkZWZFbCkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIGludCBpbml0aWFsSW1wb3J0QXJyYXlTaXplID0gMjA7Ci0gICAgTGlzdFtdIGZpbGVzQXREZXB0aCA9IG5ldyBBcnJheUxpc3RbaW5pdGlhbEltcG9ydEFycmF5U2l6ZV07Ci0gICAgTWFwIGZpbGVzSW1wb3J0aW5nID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIFNvcnRlZFNldCBwYXJzZWRJbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBTb3J0ZWRTZXQgaW1wb3J0c1RvUGFyc2UgPSBuZXcgVHJlZVNldCgpOwotICAgIGludCBtYXhkZXB0aCA9IDA7Ci0KLSAgICBXU0RMRG9jdW1lbnQgcm9vdGRvYyA9IG5ldyBXU0RMRG9jdW1lbnQoZG9jdW1lbnRCYXNlVVJJLCBkZWZFbCwgMCwgbWVzc2FnZWdlbmVyYXRvciwgd3NkbHZhbGluZm8pOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSByb290ZG9jLmdldERlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBJbXBvcnRIb2xkZXIgcm9vdEltcG9ydCA9IG5ldyBJbXBvcnRIb2xkZXIodGFyZ2V0TmFtZXNwYWNlLCBkb2N1bWVudEJhc2VVUkksIGRvY3VtZW50QmFzZVVSSSwgcm9vdGRvYywgMCwgbnVsbCwgbWVzc2FnZWdlbmVyYXRvciwgd3NkbHZhbGluZm8pOwotICAgIHJvb3RJbXBvcnQuY3JlYXRlV1NETEltcG9ydChyb290ZG9jKTsKLSAgICBwYXJzZWRJbXBvcnRzLmFkZChyb290SW1wb3J0KTsKLSAgICBMaXN0IHJvb3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZpbGVzSW1wb3J0aW5nLnB1dChyb290SW1wb3J0LmdldExvY2F0aW9uKCksIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgcm9vdExpc3QuYWRkKHJvb3Rkb2MpOwotICAgIGZpbGVzQXREZXB0aFswXSA9IHJvb3RMaXN0OwotICAgIGltcG9ydHNUb1BhcnNlLmFkZEFsbChyb290ZG9jLmdldEltcG9ydHMoKSk7Ci0gICAgU2V0IGltcHMgPSByb290ZG9jLmdldEltcG9ydHMoKTsKLSAgICBJdGVyYXRvciBpbXBJdGVyID0gaW1wcy5pdGVyYXRvcigpOwotICAgIHdoaWxlKGltcEl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEltcG9ydEhvbGRlciBpbXAgPSAoSW1wb3J0SG9sZGVyKWltcEl0ZXIubmV4dCgpOwotICAgICAgTGlzdCB0ZW1wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRlbXBMaXN0LmFkZChpbXAuZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICBmaWxlc0ltcG9ydGluZy5wdXQoaW1wLmdldExvY2F0aW9uKCksIHRlbXBMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgd2hpbGUoIWltcG9ydHNUb1BhcnNlLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBJbXBvcnRIb2xkZXIgaW1wID0gKEltcG9ydEhvbGRlcilpbXBvcnRzVG9QYXJzZS5maXJzdCgpOwotICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gaW5pdGlhbGl6ZSB0aGUgaW1wb3J0IGhlcmUgc28gZWFjaCBpbXBvcnQKLSAgICAgIC8vIGlzIG9ubHkgY3JlYXRlZCBvbmNlLiBJbiB0aGUgY2FzZSBvZiByZWNpcHJpY2FsIGltcG9ydHMgdGhpcwotICAgICAgLy8gYXZvaWRzIGFuIGluZmluaXRlIGxvb3AuCi0gICAgICBpbXAuaW5pdGlhbGl6ZSgpOwotICAgICAgV1NETERvY3VtZW50IGltcERvYyA9IGltcC5nZXRXU0RMRG9jdW1lbnQoKTsKLSAgICAgIAotICAgICAgaW1wb3J0c1RvUGFyc2UucmVtb3ZlKGltcCk7Ci0gICAgICAKLSAgICAgIHBhcnNlZEltcG9ydHMuYWRkKGltcCk7Ci0gICAgICAKLSAgICAgIC8vIEFkZCBuZXcgaW1wb3J0cyB0byB0aGUgbGlzdCBvZiBpbXBvcnRzIHRvIHBhcnNlLgotICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgaW1wb3J0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC4KLSAgICAgIGlmKGltcERvYyAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBJbmNyZWF0ZSBpbXBvcnQgYXJyYXkgaWYgbmVjZXNzYXJ5LgotICAgICAgICBpZihpbXAuZ2V0RGVwdGgoKSA+PSBpbml0aWFsSW1wb3J0QXJyYXlTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdFtdIHRlbXBBcnJheSA9IG5ldyBMaXN0W2ZpbGVzQXREZXB0aC5sZW5ndGggKyBpbml0aWFsSW1wb3J0QXJyYXlTaXplXTsKLSAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZpbGVzQXREZXB0aCwgMCwgdGVtcEFycmF5LCAwLCBmaWxlc0F0RGVwdGgubGVuZ3RoKTsKLSAgICAgICAgICBmaWxlc0F0RGVwdGggPSB0ZW1wQXJyYXk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGZvciB0aGUgZGVwdGggaWYgbmVjZXNzYXJ5LgotICAgICAgICBpbnQgaW1wRGVwdGggPSBpbXAuZ2V0RGVwdGgoKTsKLSAgICAgICAgaWYoZmlsZXNBdERlcHRoW2ltcERlcHRoXSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYobWF4ZGVwdGggPCBpbXBEZXB0aCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhkZXB0aCA9IGltcERlcHRoOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaWxlc0F0RGVwdGhbaW1wRGVwdGhdID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbGVzQXREZXB0aFtpbXAuZ2V0RGVwdGgoKV0uYWRkKGltcERvYyk7Ci0gICAgICAgIAotICAgICAgICBTZXQgaW1wb3J0cyA9IGltcERvYy5nZXRJbXBvcnRzKCk7Ci0gICAgICAgIEltcG9ydEhvbGRlcltdIGltcG9ydHNBcnJheSA9IChJbXBvcnRIb2xkZXJbXSlpbXBvcnRzLnRvQXJyYXkobmV3IEltcG9ydEhvbGRlcltpbXBvcnRzLnNpemUoKV0pOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaW1wb3J0c0FycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSW1wb3J0SG9sZGVyIGloID0gaW1wb3J0c0FycmF5W2ldOwotICAgICAgICAgIC8vIElmIGFscmVhZHkgcGFyc2VkLCBhZGQgdGhlIGRlZmluaXRpb24gaW1wb3J0aW5nIHRoaXMgZmlsZSB0byB0aGUgbGlzdC4KLSAgICAgICAgICBpZihmaWxlc0ltcG9ydGluZy5jb250YWluc0tleShpaC5nZXRMb2NhdGlvbigpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAoKExpc3QpZmlsZXNJbXBvcnRpbmcuZ2V0KGloLmdldExvY2F0aW9uKCkpKS5hZGQoaWguZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIE90aGVyd2lzZSBhZGQgaXQgdG8gdGhlIGxpc3QgdG8gcGFyc2UuCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFkZCB0aGlzIGltcG9ydCB0byB0aGUgbGlzdCBvZiBmaWxlcyBpbXBvcnRpbmcgbGlzdC4KLSAgICAgICAgICAgIExpc3QgdGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB0ZW1wTGlzdC5hZGQoaWguZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBmaWxlc0ltcG9ydGluZy5wdXQoaWguZ2V0TG9jYXRpb24oKSwgdGVtcExpc3QpOwotICAgICAgICAgICAgaW1wb3J0c1RvUGFyc2UuYWRkKGloKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQWRkIGFsbCBvZiB0aGUgaW1wb3J0cyB0byB0aGUgcmVzcGVjdGl2ZSBkb2N1bWVudHMuCi0gICAgSXRlcmF0b3IgaW1wb3J0RWxlbWVudHNJdGVyID0gcGFyc2VkSW1wb3J0cy5pdGVyYXRvcigpOwotICAgIHdoaWxlKGltcG9ydEVsZW1lbnRzSXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSW1wb3J0SG9sZGVyIGltcCA9IChJbXBvcnRIb2xkZXIpaW1wb3J0RWxlbWVudHNJdGVyLm5leHQoKTsKLSAgICAgIExpc3QgZmlsZXMgPSAoTGlzdClmaWxlc0ltcG9ydGluZy5nZXQoaW1wLmdldExvY2F0aW9uKCkpOwotICAgICAgSXRlcmF0b3IgZmlsZXNJdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGZpbGVzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWZpbGVzSXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBEZWZpbml0aW9uSW1wbCBkZWYgPSAoRGVmaW5pdGlvbkltcGwpZG9jLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgSW1wb3J0IGltcEVsZW0gPSBpbXAuZ2V0SW1wb3J0KCk7Ci0gICAgICAgIGlmKGltcEVsZW0gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGRlZi5hZGRJbXBvcnQoaW1wRWxlbSk7Ci0gICAgICAgICAgaWYoIWltcC5pc1dTRExGaWxlSW1wb3J0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9jLmFkZFNjaGVtYXMoaW1wLmdldFNjaGVtYXMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBQYXJzZSB0aGUgV1NETCBkb2N1bWVudHMuCi0gICAgLy8gUGFyc2UgdGhlIE1lc3NhZ2VzLgotICAgIGZvcihpbnQgaSA9IG1heGRlcHRoOyBpID49MDsgaS0tKQotICAgIHsKLSAgICAgIExpc3QgZG9jcyA9IGZpbGVzQXREZXB0aFtpXTsKLSAgICAgIEl0ZXJhdG9yIGRvY3NJdGVyID0gZG9jcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUoZG9jc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBXU0RMRG9jdW1lbnQgZG9jID0gKFdTRExEb2N1bWVudClkb2NzSXRlci5uZXh0KCk7Ci0gICAgICAgIGRvYy5wYXJzZU1lc3NhZ2VzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFBhcnNlIHRoZSBQb3J0dHlwZXMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlUG9ydHR5cGVzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFBhcnNlIHRoZSBCaW5kaW5ncy4KLSAgICBmb3IoaW50IGkgPSBtYXhkZXB0aDsgaSA+PTA7IGktLSkKLSAgICB7Ci0gICAgICBMaXN0IGRvY3MgPSBmaWxlc0F0RGVwdGhbaV07Ci0gICAgICBJdGVyYXRvciBkb2NzSXRlciA9IGRvY3MuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGRvY3NJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IGRvYyA9IChXU0RMRG9jdW1lbnQpZG9jc0l0ZXIubmV4dCgpOwotICAgICAgICBkb2MucGFyc2VCaW5kaW5ncygpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBQYXJzZSB0aGUgU2VydmljZXMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlU2VydmljZXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUGFyc2UgdGhlIEV4dGVuc2liaWxpdHkgRWxlbWVudHMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIExpc3Qgd3NkbERvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgd3NkbERvY3MuYWRkKGRvYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAoV1NETERvY3VtZW50W10pd3NkbERvY3MudG9BcnJheShuZXcgV1NETERvY3VtZW50W3dzZGxEb2NzLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGlucHV0U291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIGRvY3VtZW50IGJlaW5nIHJldHJpZXZlZC4KLSAgICogQHBhcmFtIGRlc2MgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkb2N1bWVudCBiZWluZyByZXRyaWV2ZWQuCi0gICAqIEByZXR1cm4gVGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgU3RyaW5nIGRlc2MpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24oKQotICAgICAgewotICAgICAgICBwcm90ZWN0ZWQgWE1MRXJyb3JSZXBvcnRlciBjcmVhdGVFcnJvclJlcG9ydGVyKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWE1MRXJyb3JSZXBvcnRlcigpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzLCBzaG9ydCBzZXZlcml0eSkgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBib29sZWFuIHJlcG9ydEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoIlByZW1hdHVyZUVPRiIpKQotICAgICAgICAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVwb3J0RXJyb3IoZG9tYWluLCBrZXksIGFyZ3VtZW50cywgc2V2ZXJpdHkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIAotICAgICAgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKQotICAgICAgewotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIERPTVBhcnNlciBidWlsZGVyID0gbmV3IExpbmVOdW1iZXJET01QYXJzZXIoY29uZmlndXJhdGlvbik7Ci0gICAgICBidWlsZGVyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotICAgICAgYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmdldERvY3VtZW50KCk7Ci0KLSAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLlBBUlNFUl9FUlJPUiwgIlByb2JsZW0gcGFyc2luZyAnIiArIGRlc2MgKyAiJy4iLCB0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgdXNpbmcgYSBjb250ZXh0IFVSSSBhbmQgZmlsZSBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gY29udGV4dFVSSSBUaGUgY29udGV4dCBVUkkgdG8gdXNlLgotICAgKiBAcGFyYW0gd3NkbFVSSSBUaGUgV1NETCBVUkkgdG8gdXNlLgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdTRExEb2N1bWVudHMuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudFtdIHJlYWRXU0RMKFN0cmluZyBjb250ZXh0VVJJLCBTdHJpbmcgd3NkbFVSSSkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCBjb250ZXh0VVJMID0gKGNvbnRleHRVUkkgIT0gbnVsbCkgPyBTdHJpbmdVdGlscy5nZXRVUkwobnVsbCwgY29udGV4dFVSSSkgOiBudWxsOwotICAgICAgVVJMIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTChjb250ZXh0VVJMLCB3c2RsVVJJKTsKLSAgICAgIFJlYWRlciByZWFkZXIgPSBTdHJpbmdVdGlscy5nZXRDb250ZW50QXNSZWFkZXIodXJsKTsKLSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChpbnB1dFNvdXJjZSwgd3NkbFVSSSk7Ci0gICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gbnVsbDsKLSAgICAgIC8vIG9ubHkgcGFyc2UgdGhlIGRvY3VtZW50IGlmIGl0IGlzbid0IGVtcHR5Ci0gICAgICBpZihkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgICB7ICAgICAgCi0gICAgICAgIHdzZGxEb2NzID0gcmVhZFdTREwodXJsLnRvU3RyaW5nKCksIGRvYyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gd3NkbERvY3M7Ci0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICBXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLAotICAgICAgICAiVW5hYmxlIHRvIHJlc29sdmUgaW1wb3J0ZWQgZG9jdW1lbnQgYXQgJyIgKyB3c2RsVVJJICsgIicuIiwKLSAgICAgICAgdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWVzc2FnZWdlbmVyYXRvciBmb3IgdGhlIHJlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZyBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1nKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1nOwotICB9Ci0gIAotICAvKioKLSAgICogUmVhZCB0aGUgV1NETCBkb2N1bWVudCBhY2Nlc3NpYmxlIHZpYSB0aGUgc3BlY2lmaWVkCi0gICAqIFVSSSBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gd3NkbFVSSSBBIFVSSSBwb2ludGluZyB0byBhIFdTREwgZmlsZS4KLSAgICogQHJldHVybiBBbiBhcnJheSBvZiBXU0RMRG9jdW1lbnRzLgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudFtdIHJlYWRXU0RMKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRXU0RMKG51bGwsIHdzZGxVUkkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIFdTREwgZG9jdW1lbnQgZGVzY3JpYmVkIGJ5IGEgVVJJIGFuZCBpdHMgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBkb2N1bWVudEJhc2VVUkkgVGhlIFVSSSBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRlZmluaXRpb25zRWxlbWVudCBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmb3IgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV1NETERvY3VtZW50cy4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50W10gcmVhZFdTREwoU3RyaW5nIGRvY3VtZW50QmFzZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBkZWZpbml0aW9uc0VsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBwYXJzZURvY3VtZW50KGRvY3VtZW50QmFzZVVSSSwgZGVmaW5pdGlvbnNFbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzcGVjaWZpZWQgV1NETCBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSBUaGUgZG9jdW1lbnQgYmFzZSBVUkkuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgVGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV1NETERvY3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyBXU0RMRG9jdW1lbnRbXSByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHJldHVybiByZWFkV1NETChkb2N1bWVudEJhc2VVUkksIHdzZGxEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gIH0KLSAgCi0gIAotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9odHRwL0hUVFBWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvaHR0cC9IVFRQVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzRlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9odHRwL0hUVFBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuaHR0cDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3I7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdJbnB1dEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdPcGVyYXRpb25JbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5Qb3J0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb25JbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50SW1wbDsKLQotLyoqCi0gKiBUaGUgSFRUUCB2YWxpZGF0b3IgaXMgYW4gZXh0ZW5zaW9uIFdTREwgdmFsaWRhdG9yIHRoYXQgdmFsaWRhdGVzIGFsbCBlbGVtZW50cyBpbiB0aGUgSFRUUAotICogbmFtZXNwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgSFRUUFZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEhUVFBfUkVTT1VSQ0VfQlVORExFX05BTUUgPSAidmFsaWRhdGV3c2RsaHR0cCI7Ci0JCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19JTlBVVF9FTEVNRU5UID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfSU5QVVRfRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0hUVFBfRUxFTUVOVF9GT1JfTE9DQVRJT04gPSAiX0VSUk9SX0lOVkFMSURfSFRUUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyA9ICJfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX0FERFJFU1MgPSAiX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9BRERSRVNTIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19WRVJCID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfVkVSQiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0xPQ0FUSU9OX1VSSSA9ICJfRVJST1JfSU5WQUxJRF9MT0NBVElPTl9VUkkiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiA9ICJfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT1RfT05MWV9FTEVNRU5UX0RFRklORUQgPSAiX0VSUk9SX05PVF9PTkxZX0VMRU1FTlRfREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19IVFRQT1BFUkFUSU9OX0ZPUl9VUkwgPSAiX0VSUk9SX05PX0hUVFBPUEVSQVRJT05fRk9SX1VSTCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUID0gIkdFVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFBPU1QgPSAiUE9TVCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiJyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotCi0gIHByaXZhdGUgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIEhUVFBWYWxpZGF0b3IoKQotICB7Ci0JUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoSFRUUF9SRVNPVVJDRV9CVU5ETEVfTkFNRSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0JbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICAvLyBQb3J0IEhUVFAgZGVmaW5pdGlvbgotICAgIC8vIG1ha2Ugc3VyZSBldmVyeSBwb3J0IGhhcyBvbmx5IG9uZSBhZGRyZXNzIGVsZW1lbnQgZGVmaW5lZAotICAgIC8vIGlmIGl0IGlzIGFuIGFkZHJlc3MgZWxlbWVudCwgdmFsaWRhdGUgaXQKLSAgICBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBQb3J0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBBZGRyZXNzSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVBZGRyZXNzKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgICBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBCaW5kaW5nIEhUVFAgZGVmaW5pdGlvbgotICAgIC8vIEEgSFRUUCBCaW5kaW5nIG11c3QgaGF2ZSBhIHZlcmIgb2YgR0VUIG9yIFBPU1QKLSAgICBlbHNlIGlmIChwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gSFRUUEJpbmRpbmdJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUJpbmRpbmcoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBCaW5kaW5nIE9wZXJhdGlvbiBIVFRQIGRlZmluaXRpb24KLSAgICAvLyBBIEhUVFAgT3BlcmF0aW9uIGhhcyBhIGxvY2F0aW9uIHVyaSBkZWZpbmVkCi0gICAgZWxzZSBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBCaW5kaW5nT3BlcmF0aW9uSW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBPcGVyYXRpb25JbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZU9wZXJhdGlvbihlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCwKLSAgICAgICAgICAgIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0lucHV0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICAvLyB2YWxpZGF0ZSB0aGUgSFRUUCB1cmxFbmNvZGVkIGFuZCB1cmxSZXBsYWNlbWVudAotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQVXJsRW5jb2RlZEltcGwuY2xhc3MgfHwgZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBVcmxSZXBsYWNlbWVudEltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlSHR0cFVybChlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfSU5QVVRfRUxFTUVOVCwgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgICAgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gaW4gdGhpcyBjYXNlIHRoZXJlIGhhcyBiZWVuIGEgSFRUUCBlbGVtZW50IGRlZmluZWQgdGhhdCBpcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBwb2ludCBpbiB0aGUgSFRUUCBuYW1lc3BhY2UKLSAgICBlbHNlCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX0lOVkFMSURfSFRUUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiwKLSAgICAgICAgICBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgZWxlbWVudCk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgdGhlIEhUVFAgYWRkcmVzcyBoYXMgYSB2YWx1ZSBzcGVjaWZpZWQgZm9yIGl0J3MgdXJpIGFuZCB0aGF0IHRoZXJlIGlzIGEgSFRUUCBCaW5kaW5nIGRlZmluZWQKLSAgICogZm9yIHRoZSBCaW5kaW5nIHNwZWNpZmllZCBpbiB0aGUgcG9ydC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVFRQIGFkZHJlc3MgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgVGhlIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgSFRUUCBhZGRyZXNzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciBpbiBjaGFyZ2Ugb2YgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQWRkcmVzcyhPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIEhUVFBBZGRyZXNzSW1wbCBoYSA9IChIVFRQQWRkcmVzc0ltcGwpZWxlbWVudDsKLQotICAgIFN0cmluZyB1cmkgPSBoYS5nZXRMb2NhdGlvblVSSSgpOwotICAgIGlmICh1cmkgPT0gbnVsbCB8fCB1cmkuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTKSwgaGEpOwotICAgIH0KLQotICAgIFBvcnQgcG9ydCA9IChQb3J0KXBhcmVudHMuZ2V0KDApOwotCi0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0KLSAgICBpZiAoIWhhc0h0dHBCaW5kaW5nKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgIF9FUlJPUl9OT19IVFRQQklORElOR19GT1JfQUREUkVTUywKLSAgICAgICAgICBRVU9URSArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFLAotICAgICAgICAgIFFVT1RFICsgcG9ydC5nZXROYW1lKCkgKyBRVU9URSksCi0gICAgICAgIGhhKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoZSBIVFRQIEJpbmRpbmcgZGVmaW5lZCBpcyB2YWxpZC4gQSBIVFRQIEJpbmRpbmcgbXVzdCBoYXZlIGEgdmVyYiBvZiBHRVQgb3IgUE9TVC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVFRQIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgVGhlIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgSFRUUCBiaW5kaW5nIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciBpbiBjaGFyZ2Ugb2YgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQmluZGluZyhPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIEhUVFBCaW5kaW5nSW1wbCBoYiA9IChIVFRQQmluZGluZ0ltcGwpZWxlbWVudDsKLQotICAgIFN0cmluZyB2ZXJiID0gaGIuZ2V0VmVyYigpOwotCi0gICAgaWYgKHZlcmIgIT0gbnVsbCAmJiAhdmVyYi5lcXVhbHMoR0VUKSAmJiAhdmVyYi5lcXVhbHMoUE9TVCkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1ZFUkIsIFFVT1RFICsgdmVyYiArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFuIG9wZXJhdGlvbiBtdXN0IGhhdmUgYSBsb2NhdGlvbiBkZWZpbmVkLiBBIEhUVFAgQmluZGluZyBtdXN0IGJlIHNwZWNpZmllZCB0byB1c2UgYW4gb3BlcmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUVFAgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIEhUVFAgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciBpbiBjaGFyZ2Ugb2YgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlT3BlcmF0aW9uKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgSFRUUE9wZXJhdGlvbiBobyA9IChIVFRQT3BlcmF0aW9uKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgbG9jYXRpb25VUkkgPSBoby5nZXRMb2NhdGlvblVSSSgpOwotCi0gICAgaWYgKGxvY2F0aW9uVVJJICE9IG51bGwgJiYgbG9jYXRpb25VUkkuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfTE9DQVRJT05fVVJJKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpcGFyZW50cy5nZXQoMSk7Ci0gICAgaWYgKCFoYXNIdHRwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiwgUVVPVEUgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgIGhvKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIEhUVFAgdXJsUmVwbGFjZW1lbnQgb3IgdXJsRW5jb2RlZC4gRW5zdXJlIHRoZSBIVFRQIG9wZXJhdGlvbiBoYXMgYmVlbiBkZWZpbmVkLiAKLSAgICogRW5zdXJlIHRoYXQgZWl0aGVyIGVsZW1lbnQgaXMgdGhlIG9ubHkgZWxlbWVudCBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRUUCBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBIVFRQIGJpbmRpbmcgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciBpbiBjaGFyZ2Ugb2YgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSHR0cFVybChPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pcGFyZW50cy5nZXQoMSk7Ci0KLSAgICBTdHJpbmcgZWxlbWVudE5hbWU7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQVXJsRW5jb2RlZEltcGwuY2xhc3MpCi0gICAgewotICAgICAgZWxlbWVudE5hbWUgPSAidXJsRW5jb2RlZCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQVXJsUmVwbGFjZW1lbnRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGVsZW1lbnROYW1lID0gInVybFJlcGxhY2VtZW50IjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVsZW1lbnROYW1lID0gRU1QVFlfU1RSSU5HOwotICAgIH0KLQotICAgIEJpbmRpbmdJbnB1dCBpbnB1dCA9IChCaW5kaW5nSW5wdXQpcGFyZW50cy5nZXQoMCk7Ci0gICAgaWYgKGlucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLnNpemUoKSAhPSAxKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PVF9PTkxZX0VMRU1FTlRfREVGSU5FRCwgZWxlbWVudE5hbWUpLCBlbGVtZW50KTsKLSAgICB9Ci0KLSAgICBpZiAoIWhhc0h0dHBPcGVyYXRpb24ob3BlcmF0aW9uKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fSFRUUE9QRVJBVElPTl9GT1JfVVJMLCBRVU9URSArIG9wZXJhdGlvbi5nZXROYW1lKCkgKyBRVU9URSwgZWxlbWVudE5hbWUpLAotICAgICAgICBlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBCaW5kaW5nT3BlcmF0aW9uIHRlbGxzIHdoZXRoZXIgaXQgaGFzIGEgSFRUUCBvcGVyYXRpb24gZGVmaW5lZCBmb3IgaXQuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZyBUaGUgSFRUUCBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYW4gSFRUUCBvcGVyYXRpb24gZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzSHR0cE9wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IGV4dGVsZW1zID0gb3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgaWYgKGV4dGVsZW1zICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGlleHRlbGVtcyA9IGV4dGVsZW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpZXh0ZWxlbXMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlleHRlbGVtcy5uZXh0KCkuZ2V0Q2xhc3MoKSA9PSBIVFRQT3BlcmF0aW9uSW1wbC5jbGFzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgYmluZGluZyByZXR1cm5zIHRydWUgaWYgaXQgaGFzIGEgSFRUUCBiaW5kaW5nIGRlZmluZWQuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZyBUaGUgYmluZGluZyB0byBjaGVjay4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGFuIEhUVFAgYmluZGluZyBkZWZpbmVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzSHR0cEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IGV4dGVsZW1zID0gYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGlmIChleHRlbGVtcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpZXh0ZWxlbXMgPSBleHRlbGVtcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaWV4dGVsZW1zLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpZXh0ZWxlbXMubmV4dCgpLmdldENsYXNzKCkgPT0gSFRUUEJpbmRpbmdJbXBsLmNsYXNzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvbWltZS9NSU1FVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL21pbWUvTUlNRVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJhM2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvbWltZS9NSU1FVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEubWltZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm87Ci0KLS8qKgotICogVGhlIE1JTUUgdmFsaWRhdG9yIHBsdWdzIGludG8gdGhlIFdTREwgdmFsaWRhdG9yIHRvIHByb3ZpZGUKLSAqIHZhbGlkYXRpb24gZm9yIGFsbCBlbGVtZW50cyBpbiBhIFdTREwgZG9jdW1lbnQgd2l0aGluIHRoZSBNSU1FIG5hbWVzcGFjZS4KLSAqLwotcHVibGljIGNsYXNzIE1JTUVWYWxpZGF0b3IgaW1wbGVtZW50cyBJV1NETDExVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBNSU1FX1JFU09VUkNFX0JVTkRMRV9OQU1FID0gInZhbGlkYXRld3NkbG1pbWUiOwotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotCi0gIHB1YmxpYyBNSU1FVmFsaWRhdG9yKCkKLSAgewotCVJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKE1JTUVfUkVTT1VSQ0VfQlVORExFX05BTUUsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCW1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyYik7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3NvYXAvU09BUFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9zb2FwL1NPQVBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmODU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3NvYXAvU09BUFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5zb2FwOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3I7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ0ZhdWx0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdJbnB1dEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdPcGVyYXRpb25JbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nT3V0cHV0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuUG9ydEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzc0ltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keUltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbkltcGw7Ci0KLS8qKgotICogVGhlIFNPQVAgdmFsaWRhdG9yIHBsdWdzIGludG8gdGhlIFdTREwgdmFsaWRhdG9yIHRvIHByb3ZpZGUKLSAqIHZhbGlkYXRpb24gZm9yIGFsbCBlbGVtZW50cyBpbiBhIFdTREwgZG9jdW1lbnQgd2l0aGluIHRoZSBTT0FQIG5hbWVzcGFjZS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQVmFsaWRhdG9yIGltcGxlbWVudHMgSVdTREwxMVZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU09BUF9SRVNPVVJDRV9CVU5ETEVfTkFNRSA9ICJ2YWxpZGF0ZXdzZGxzb2FwIjsKLQkgIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0hFQURFUl9CT0RZX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfSEVBREVSX0JPRFlfRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0ZBVUxUX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfRkFVTFRfRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX1NPQVBfRUxFTUVOVF9GT1JfTE9DQVRJT04gPSAiX0VSUk9SX0lOVkFMSURfU09BUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyA9ICJfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0FERFJFU1MgPSAiX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9BRERSRVNTIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19TVFlMRSA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1NUWUxFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19VUkkgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19VUkkiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9PUEVSQVRJT05fU1RZTEUgPSAiX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OX1NUWUxFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9PUEVSQVRJT04gPSAiX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9PUEVSQVRJT04iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CT0RZX0VOQ09ESU5HX1NUWUxFID0gIl9FUlJPUl9JTlZBTElEX0JPRFlfRU5DT0RJTkdfU1RZTEUiOwotICAvL3ByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JPRFlfTkFNRVNQQUNFX0ZPUl9FTkNPREVEID0gIl9FUlJPUl9JTlZBTElEX0JPRFlfTkFNRVNQQUNFX0ZPUl9FTkNPREVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfTk9UX1RZUEUgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX05PVF9UWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX1VOREVGSU5FRCA9ICJfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9CT0RZID0gIl9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQk9EWSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfTUVTU0FHRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9NRVNTQUdFX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfUEFSVF9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9QQVJUX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfVVNFX1VOREVGSU5FRCA9ICJfRVJST1JfSEVBREVSX1VTRV9VTkRFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSX05BTUVTUEFDRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9OQU1FU1BBQ0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIgPSAiX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSRkFVTFRfTUVTU0FHRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUkZBVUxUX01FU1NBR0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0hFQURFUkZBVUxUX1BBUlRfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9QQVJUX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0hFQURFUkZBVUxUX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9FTkNPRElOR1NUWUxFX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRSA9ICJfRVJST1JfSU5WQUxJRF9GQVVMVF9OQU1FIjsKLSAgLy9wcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9GQVVMVF9FTkNPRElOR19TVFlMRSA9ICJfRVJST1JfSU5WQUxJRF9GQVVMVF9FTkNPRElOR19TVFlMRSI7Ci0gIC8vcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRVNQQUNFX0ZPUl9FTkNPREVEID0gIl9FUlJPUl9JTlZBTElEX0ZBVUxUX05BTUVTUEFDRV9GT1JfRU5DT0RFRCI7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFTkNPREVEID0gImVuY29kZWQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBMSVRFUkFMID0gImxpdGVyYWwiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSUEMgPSAicnBjIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRE9DVU1FTlQgPSAiZG9jdW1lbnQiOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiJyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotCi0gIHByb3RlY3RlZCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3I7Ci0gCi0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFNPQVBWYWxpZGF0b3IoKQotICB7Ci0JUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoU09BUF9SRVNPVVJDRV9CVU5ETEVfTkFNRSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0JbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICAvLyBQb3J0IFNPQVAgZGVmaW5pdGlvbgotICAgIC8vIG1ha2Ugc3VyZSBldmVyeSBwb3J0IGhhcyBvbmx5IG9uZSBhZGRyZXNzIGVsZW1lbnQgZGVmaW5lZAotICAgIC8vIGlmIGl0IGlzIGFuIGFkZHJlc3MgZWxlbWVudCwgdmFsaWRhdGUgaXQKLSAgICBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBQb3J0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IFNPQVBBZGRyZXNzSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVBZGRyZXNzKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQmluZGluZyBTT0FQIGRlZmluaXRpb24KLSAgICAvLyBBIFNPQVAgQmluZGluZyBtdXN0IGhhdmUgYSBzdHlsZSBvciBycGMgb3IgZG9jdW1lbnQgb3Igbm8gc3R5bGUgZGVmaW5lZCAtIGRlZmF1bHRzIHRvIGRvY3VtZW50Ci0gICAgLy8gTXVzdCBoYXZlIGEgdHJhbnNwb3J0IHVyaSBkZWZpbmVkIC0gY2hlY2sgaWYgdGhlIHVyaSBpcyBlbXB0eQotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBTT0FQQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlQmluZGluZyhlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfRUxFTUVOVCwgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBCaW5kaW5nIE9wZXJhdGlvbiBTT0FQIGRlZmluaXRpb24KLSAgICAvLyBBIFNPQVAgT3BlcmF0aW9uIG1heSBoYXZlIGEgc3R5bGUgZGVmaW5lZCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZG9jdW1lbnQgb3IgcnBjCi0gICAgLy8gYW5kIG1heSBoYXZlIGEgc29hcEFjdGlvbiB1cmkgZGVmaW5lZAotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ09wZXJhdGlvbkltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBTT0FQT3BlcmF0aW9uSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVPcGVyYXRpb24oZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCwKLSAgICAgICAgICAgIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIGlmICgKLSAgICAgIHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0lucHV0SW1wbC5jbGFzcyB8fCBwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdPdXRwdXRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIC8vIHZhbGlkYXRlIHRoZSBTT0FQIGJvZHkKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gU09BUEJvZHlJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUJvZHkoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICAvLyB2YWxpYXRlIHRoZSBTT0FQIGhlYWRlcgotICAgICAgZWxzZSBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IFNPQVBIZWFkZXJJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUhlYWRlcihlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0hFQURFUl9CT0RZX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBCaW5kaW5nRmF1bHRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gU09BUEZhdWx0SW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVGYXVsdChlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0ZBVUxUX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaW4gdGhpcyBjYXNlIHRoZXJlIGhhcyBiZWVuIGEgU09BUCBlbGVtZW50IGRlZmluZWQgdGhhdCBpcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBwb2ludCBpbiB0aGUgU09BUCBuYW1lc3BhY2UKLSAgICBlbHNlCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX0lOVkFMSURfU09BUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiwKLSAgICAgICAgICBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgdGhlIFNPQVAgYWRkcmVzcyBoYXMgYSB2YWx1ZSBzcGVjaWZpZWQgZm9yIGl0J3MgdXJpIGFuZCB0aGF0IHRoZSBiaW5kaW5nIGhhcyBhIFNPQVAKLSAgICogQmluZGluZyBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgYWRkcmVzcyBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBhZGRyZXNzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQWRkcmVzcyhPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBBZGRyZXNzSW1wbCBzYSA9IChTT0FQQWRkcmVzc0ltcGwpZWxlbWVudDsKLQotICAgIFN0cmluZyB1cmkgPSBzYS5nZXRMb2NhdGlvblVSSSgpOwotICAgIGlmICh1cmkgPT0gbnVsbCB8fCB1cmkuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTKSwgc2EpOwotICAgIH0KLQotICAgIFBvcnQgcG9ydCA9IChQb3J0KXBhcmVudHMuZ2V0KDApOwotCi0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0KLSAgICBpZiAoIWhhc1NvYXBCaW5kaW5nKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgIF9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQUREUkVTUywKLSAgICAgICAgICBRVU9URSArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFLAotICAgICAgICAgIFFVT1RFICsgcG9ydC5nZXROYW1lKCkgKyBRVU9URSksIHNhKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoZSBTT0FQIEJpbmRpbmcgZGVmaW5lZCBpcyB2YWxpZC4gQSBTT0FQIEJpbmRpbmcgbXVzdCBoYXZlIGEgc3R5bGUgb2YgcnBjIG9yIGRvY3VtZW50Ci0gICAqIG9yIG5vIHN0eWxlIGRlZmluZWQgKGRlZmF1bHRzIHRvIGRvY3VtZW50LikgIEEgdmFsaWQgKG5vbiBlbXB0eSkgVVJJIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgU09BUCBiaW5kaW5nIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBTT0FQIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCaW5kaW5nKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEJpbmRpbmdJbXBsIHNiID0gKFNPQVBCaW5kaW5nSW1wbCllbGVtZW50OwotCi0gICAgU3RyaW5nIHN0eWxlID0gc2IuZ2V0U3R5bGUoKTsKLSAgICBTdHJpbmcgdXJpID0gc2IuZ2V0VHJhbnNwb3J0VVJJKCk7Ci0KLSAgICBpZiAoc3R5bGUgIT0gbnVsbCAmJiAhc3R5bGUuZXF1YWxzSWdub3JlQ2FzZShSUEMpICYmICFzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKERPQ1VNRU5UKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1NUWUxFLCBRVU9URSArIHNiLmdldFN0eWxlKCkgKyBRVU9URSksIGVsZW1lbnQpOwotICAgIH0KLSAgICBpZiAodXJpLmVxdWFsc0lnbm9yZUNhc2UoRU1QVFlfU1RSSU5HKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfVVJJKSwgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFuIG9wZXJhdGlvbiBtYXkgaGF2ZSBhIHN0eWxlIGRlZmluZWQuIElmIGl0IGlzIGRlZmluZWQgaXQgbXVzdCBiZSBycGMgb3IgZG9jdW1lbnQuIEl0IG1heSBhbHNvIGhhdmUgYQotICAgKiB1cmkgZGVmaW5lZCB3aGljaCBtdXN0IGJlIG5vbiBlbXB0eS4gIEl0IG1heSBoYXZlIGEgc29hcEFjdGlvbiBkZWZpbmVkIGFzIHdlbGwuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgU09BUCBvcGVyYXRpb24gZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlT3BlcmF0aW9uKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUE9wZXJhdGlvbiBzbyA9IChTT0FQT3BlcmF0aW9uKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgc29hcFN0eWxlID0gc28uZ2V0U3R5bGUoKTsKLQotICAgIGlmIChzb2FwU3R5bGUgIT0gbnVsbCAmJiAhc29hcFN0eWxlLmVxdWFsc0lnbm9yZUNhc2UoUlBDKSAmJiAhc29hcFN0eWxlLmVxdWFsc0lnbm9yZUNhc2UoRE9DVU1FTlQpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OX1NUWUxFKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpcGFyZW50cy5nZXQoMSk7Ci0gICAgaWYgKCFoYXNTb2FwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiwgUVVPVEUgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFNPQVAgYm9keS4gSWYgZW5jb2RlZCBhIGJvZHkgbXVzdCBoYXZlIGFuIGVuY29kaW5nU3R5bGUuIEFsc28sCi0gICAqIGlmIHNwZWNpZmllZCwgYWxsIG9mIHRoZSBwYXJ0cyBsaXN0ZWQgbXVzdCBiZSBkZWZpbmVkIHBhcnRzIGFuZCBpbiB0aGUgZW5jb2RpbmcgdXNlIGNhc2UsIHRoZSBwYXJ0cwotICAgKiBtdXN0IGhhdmUgdHlwZXMgZGVmaW5lZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGJvZHkgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgYm9keSBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGlzIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJvZHkoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBTT0FQQm9keUltcGwgc2IgPSAoU09BUEJvZHlJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgdXNlID0gc2IuZ2V0VXNlKCk7Ci0KLSAgICAvLyBpZiB0aGUgdXNlID0gZW5jb2RlZCB0aGVuIHRoZXJlIG11c3QgYmUgZW5jb2RpbmdTdHlsZXMuCi0gICAgaWYgKHVzZSAhPSBudWxsICYmIHVzZS5lcXVhbHNJZ25vcmVDYXNlKEVOQ09ERUQpKQotICAgIHsKLSAgICAgIExpc3QgZW5jb2RpbmdTdHlsZXMgPSBzYi5nZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwgfHwgZW5jb2RpbmdTdHlsZXMuc2l6ZSgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQk9EWV9FTkNPRElOR19TVFlMRSksIHNiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodXNlICE9IG51bGwgJiYgIXVzZS5lcXVhbHNJZ25vcmVDYXNlKExJVEVSQUwpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UsIFFVT1RFICsgdXNlICsgUVVPVEUpLCBzYik7Ci0gICAgfQotCi0gICAgLy9DaGVjayB0aGF0IHRoZSBwYXJ0cyBhcmUgdmFsaWQKLSAgICAvLyBwYXJ0cyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIG1lc3NhZ2Ugc3BlY2lmaWVkIGZvciB0aGUgb3BlcmF0aW9uCi0gICAgTGlzdCBwYXJ0cyA9IHNiLmdldFBhcnRzKCk7Ci0KLSAgICBpZiAocGFydHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBwYXJ0c0l0ZXJhdG9yID0gcGFydHMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChwYXJ0c0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcnQgPSAoU3RyaW5nKXBhcnRzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvID0gKEJpbmRpbmdPcGVyYXRpb24pcGFyZW50cy5nZXQoMSk7Ci0gICAgICAgIE9wZXJhdGlvbiBvID0gYm8uZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgaWYgKG8gIT0gbnVsbCAmJiAhby5pc1VuZGVmaW5lZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZ2V0IHRoZSBtZXNzYWdlIGZyb20gdGhlIGlucHV0IG9yIG91dHB1dCBpZiBpdCBleGlzdHMKLSAgICAgICAgICBNZXNzYWdlIG1lc3MgPSBudWxsOwotICAgICAgICAgIGlmIChwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdJbnB1dEltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgSW5wdXQgaW5wdXQgPSBvLmdldElucHV0KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZXNzID0gaW5wdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdPdXRwdXRJbXBsLmNsYXNzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE91dHB1dCBvdXRwdXQgPSBvLmdldE91dHB1dCgpOwotCi0gICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lc3MgPSBvdXRwdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChtZXNzICE9IG51bGwgJiYgIW1lc3MuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQYXJ0IHAgPSBtZXNzLmdldFBhcnQocGFydCk7Ci0KLSAgICAgICAgICAgIGlmIChwICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGlmIHRoZSB1c2UgaXMgZW5jb2RlZCB0aGUgcGFydHMgbXVzdCBhbGwgaGF2ZSBhIHR5cGUgZGVmaW5lZAotICAgICAgICAgICAgICBpZiAodXNlICE9IG51bGwgJiYgdXNlLmVxdWFsc0lnbm9yZUNhc2UoRU5DT0RFRCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocC5nZXRUeXBlTmFtZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gcGFydCBlcnJvciAtIHBhcnQgbmVlZHMgdG8gYmUgdHlwZSBhbmQgaXNuJ3QJCi0gICAgICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfTk9UX1RZUEUsIFFVT1RFICsgcGFydCArIFFVT1RFKSwgc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL3BhcnQgZXJyb3IgLSBwYXJ0IGlzbid0IGRlZmluZWQJCi0gICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX1VOREVGSU5FRCwgUVVPVEUgKyBwYXJ0ICsgUVVPVEUpLCBzYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL3BhcnQgZXJyb3IgLSBpbnB1dCBpc24ndCBkZWZpbmVkCi0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVELCBRVU9URSArIHBhcnQgKyBRVU9URSksIHNiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gcGFydHMgZXJyb3IgLSBvcGVyYXRpb24gaXNuJ3QgZGVmaW5lZAotICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVELCBRVU9URSArIHBhcnQgKyBRVU9URSksIHNiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKXBhcmVudHMuZ2V0KDIpOwotICAgIGlmICghaGFzU29hcEJpbmRpbmcoYmluZGluZykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9CT0RZLCBRVU9URSArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc2IpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBIFNPQVAgaGVhZGVyIG11c3QgaGF2ZSBhIG1lc3NhZ2UsIHBhcnQgYW5kIHVzZSBkZWZpbmVkLiBJZiB0aGUgdXNlIGlzIGVuY29kZWQsIG11c3QKLSAgICogYWxzbyBoYXZlIGEgbm9uLWVtcHR5IGVuY29kaW5nU3R5bGUgYW5kIG5hbWVzcGFjZSBkZWZpbmVkLgotICAgKiBBIFNPQVAgaGVhZGVyIG1heSBoYXZlIGhlYWRlcmZhdWx0cyBkZWZpbmVkIGFzIHdlbGwuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgU09BUCBoZWFkZXIgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgaGVhZGVyIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSGVhZGVyKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEhlYWRlckltcGwgc29hcEhlYWRlciA9IChTT0FQSGVhZGVySW1wbCllbGVtZW50OwotCi0gICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gc29hcEhlYWRlci5nZXRNZXNzYWdlKCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gKChEZWZpbml0aW9uKXBhcmVudHMuZ2V0KHBhcmVudHMuc2l6ZSgpIC0gMSkpLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKTsKLSAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIG1lc3NhZ2UgdW5kZWZpbmVkCi0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSX01FU1NBR0VfVU5ERUZJTkVELCBRVU9URSArIG1lc3NhZ2VRTmFtZS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc29hcEhlYWRlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFydG5hbWUgPSBzb2FwSGVhZGVyLmdldFBhcnQoKTsKLSAgICAgIFBhcnQgcGFydCA9IG1lc3NhZ2UuZ2V0UGFydChwYXJ0bmFtZSk7Ci0gICAgICBpZiAocGFydCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBwYXJ0IHVuZGVmaW5lZAotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgX0VSUk9SX0hFQURFUl9QQVJUX1VOREVGSU5FRCwKLSAgICAgICAgICAgIFFVT1RFICsgcGFydG5hbWUgKyBRVU9URSwKLSAgICAgICAgICAgIFFVT1RFICsgbWVzc2FnZVFOYW1lLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzb2FwSGVhZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgdXNlID0gc29hcEhlYWRlci5nZXRVc2UoKTsKLSAgICBpZiAodXNlICE9IG51bGwgJiYgIXVzZS5lcXVhbHNJZ25vcmVDYXNlKExJVEVSQUwpICYmICF1c2UuZXF1YWxzSWdub3JlQ2FzZShFTkNPREVEKSkKLSAgICB7Ci0gICAgICAvLyB1c2UgdW5kZWZpbmVkCi0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSX1VTRV9VTkRFRklORUQsIFFVT1RFICsgdXNlICsgUVVPVEUpLCBzb2FwSGVhZGVyKTsKLSAgICB9Ci0KLSAgICBpZiAodXNlLmVxdWFsc0lnbm9yZUNhc2UoRU5DT0RFRCkpCi0gICAgewotICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlcyA9IHNvYXBIZWFkZXIuZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGlmIChlbmNvZGluZ1N0eWxlcyA9PSBudWxsIHx8IGVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbm8gZW5jb2RpbmdTdHlsZSBkZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUl9FTkNPRElOR1NUWUxFX1VOREVGSU5FRCksIHNvYXBIZWFkZXIpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgICAgewotICAgICAgICAvLyBubyBuYW1lc3BhY2UgZGVmaW5lZAotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJfTkFNRVNQQUNFX1VOREVGSU5FRCksIHNvYXBIZWFkZXIpOwotICAgICAgfQotICAgIH0KLQotICAgIExpc3QgaGVhZGVyRmF1bHRzID0gc29hcEhlYWRlci5nZXRTT0FQSGVhZGVyRmF1bHRzKCk7Ci0gICAgaWYgKGhlYWRlckZhdWx0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGloZWFkZXJGYXVsdHMgPSBoZWFkZXJGYXVsdHMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpaGVhZGVyRmF1bHRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVIZWFkZXJGYXVsdChpaGVhZGVyRmF1bHRzLm5leHQoKSwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpcGFyZW50cy5nZXQoMik7Ci0gICAgaWYgKCFoYXNTb2FwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0hFQURFUiwgUVVPVEUgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvYXBIZWFkZXIpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEEgU09BUCBoZWFkZXJmYXVsdCBtdXN0IGhhdmUgYSBtZXNzYWdlLCBwYXJ0IGFuZCB1c2UgZGVmaW5lZC4gSWYgdGhlIHVzZSBpcyBlbmNvZGVkLCBtdXN0Ci0gICAqIGFsc28gaGF2ZSBhIG5vbi1lbXB0eSBlbmNvZGluZ1N0eWxlIGFuZCBuYW1lc3BhY2UgZGVmaW5lZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGhlYWRlciBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBoZWFkZXIgZmF1bHQgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXJGYXVsdChPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBIZWFkZXJGYXVsdEltcGwgc29hcEhlYWRlckZhdWx0ID0gKFNPQVBIZWFkZXJGYXVsdEltcGwpZWxlbWVudDsKLQotICAgIFFOYW1lIG1lc3NhZ2VRTmFtZSA9IHNvYXBIZWFkZXJGYXVsdC5nZXRNZXNzYWdlKCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gKChEZWZpbml0aW9uKXBhcmVudHMuZ2V0KHBhcmVudHMuc2l6ZSgpIC0gMSkpLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKTsKLSAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIG1lc3NhZ2UgdW5kZWZpbmVkCi0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSRkFVTFRfTUVTU0FHRV9VTkRFRklORUQsIFFVT1RFICsgbWVzc2FnZVFOYW1lLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzb2FwSGVhZGVyRmF1bHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHBhcnRuYW1lID0gc29hcEhlYWRlckZhdWx0LmdldFBhcnQoKTsKLSAgICAgIFBhcnQgcGFydCA9IG1lc3NhZ2UuZ2V0UGFydChwYXJ0bmFtZSk7Ci0gICAgICBpZiAocGFydCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBwYXJ0IHVuZGVmaW5lZAotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgX0VSUk9SX0hFQURFUkZBVUxUX1BBUlRfVU5ERUZJTkVELAotICAgICAgICAgICAgUVVPVEUgKyBwYXJ0bmFtZSArIFFVT1RFLAotICAgICAgICAgICAgUVVPVEUgKyBtZXNzYWdlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIHVzZSA9IHNvYXBIZWFkZXJGYXVsdC5nZXRVc2UoKTsKLSAgICBpZiAodXNlICE9IG51bGwgJiYgIXVzZS5lcXVhbHNJZ25vcmVDYXNlKExJVEVSQUwpICYmICF1c2UuZXF1YWxzSWdub3JlQ2FzZShFTkNPREVEKSkKLSAgICB7Ci0gICAgICAvLyB1c2UgdW5kZWZpbmVkCi0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSRkFVTFRfVVNFX1VOREVGSU5FRCwgUVVPVEUgKyB1c2UgKyBRVU9URSksIHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgfQotCi0gICAgaWYgKHVzZS5lcXVhbHNJZ25vcmVDYXNlKEVOQ09ERUQpKQotICAgIHsKLSAgICAgIExpc3QgZW5jb2RpbmdTdHlsZXMgPSBzb2FwSGVhZGVyRmF1bHQuZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGlmIChlbmNvZGluZ1N0eWxlcyA9PSBudWxsIHx8IGVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbm8gZW5jb2RpbmdTdHlsZSBkZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUkZBVUxUX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEKSwgc29hcEhlYWRlckZhdWx0KTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHNvYXBIZWFkZXJGYXVsdC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgICAgewotICAgICAgICAvLyBubyBuYW1lc3BhY2UgZGVmaW5lZAotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEKSwgc29hcEhlYWRlckZhdWx0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBWYWxpZGF0ZSB0aGUgU09BUCBmYXVsdC4gQSBTT0FQIGZhdWx0IG11c3QgaGF2ZSBhIG5hbWUgZGVmaW5lZCB0aGF0IGNvcnJlc3BvbmRzIHdpdGggdGhlIG5hbWUKLSAgKiBzcGVjaWZpZWQgaW4gdGhlIHBvcnRUeXBlLiAgSWYgZW5jb2RlZCBhIGZhdWx0IG11c3QgaGF2ZSBhbiBlbmNvZGluZ1N0eWxlIGFuZCBhIG5hbWVzcGFjZVVSSS4gCi0gICogCi0gICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgZmF1bHQgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgZmF1bHQgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbGlkYXRpb25JbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGYXVsdChPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBGYXVsdEltcGwgZmF1bHQgPSAoU09BUEZhdWx0SW1wbCllbGVtZW50OwotCi0gICAgU3RyaW5nIG5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0KLSAgICBTdHJpbmcgcGFyZW50TmFtZSA9ICgoQmluZGluZ0ZhdWx0KXBhcmVudHMuZ2V0KDApKS5nZXROYW1lKCk7Ci0KLSAgICBpZiAoIW5hbWUuZXF1YWxzKHBhcmVudE5hbWUpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0ZBVUxUX05BTUUsIFFVT1RFICsgbmFtZSArIFFVT1RFLCBRVU9URSArIHBhcmVudE5hbWUgKyBRVU9URSksIGZhdWx0KTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaGFzU29hcEJpbmRpbmcuIC0gaGVscGVyIE1ldGhvZAotICAgKiBHaXZlbiBhIGJpbmRpbmcgcmV0dXJucyB0cnVlIGlmIGl0IGhhcyBhIFNPQVAgYmluZGluZyBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmcgLSB0aGUgU09BUCBiaW5kaW5nIHRvIGNoZWNrCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhIGJpbmRpbmcgaGFzIGEgU09BUCBiaW5kaW5nIGRlZmluZWQsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzU29hcEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IGV4dGVsZW1zID0gYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGlmIChleHRlbGVtcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpZXh0ZWxlbXMgPSBleHRlbGVtcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaWV4dGVsZW1zLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpZXh0ZWxlbXMubmV4dCgpLmdldENsYXNzKCkgPT0gU09BUEJpbmRpbmdJbXBsLmNsYXNzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0RPTUVycm9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9ET01FcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjliMTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0RPTUVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gc2lnbmlmeSBlcnJvciBsZXZlbHMgdGhhdCBhcmUgdGhlIHJlc3VsdCBvZgotICogWE1MUGFyc2VFeGNlcHRpb24uIFRoZXkgY29uY2VwdHVhbGx5IGNvcnJlc3BvbmQgdG8gb3JnLnczYy5kb20uRE9NRXJyb3IgYnV0Ci0gKiB3ZSB1c2Ugb3VyIG93biBpbnRlcmZhY2UsIHNpbmNlIERPTUVycm9yIGlzIG5vdCBpbiBKYXZhIDEuNCwgYW5kIGl0cwotICogcGFja2FnZSBjaGFuZ2VzIGZyb20gWGVyY2VzIDIuNi4yIGFuZCBYZXJjZXMgMi43LjAuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBET01FcnJvciB7Ci0JaW50IFNFVkVSSVRZX1dBUk5JTkcgPSAxOwotCWludCBTRVZFUklUWV9FUlJPUiA9IDI7Ci0JaW50IFNFVkVSSVRZX0ZBVEFMX0VSUk9SID0gMzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvRmlsZUVudGl0eVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTk3NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvRmlsZUVudGl0eVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTGF6eVVSTElucHV0U3RyZWFtOwotCi0vKioKLSAqIEVudGl0eSByZXNvbHZlIHRvIHJlc29sdmUgZmlsZSBlbnRpdGllcy4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXIpCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmVzb3VyY2UpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHVibGljSWQgPSByZXNvdXJjZS5nZXRQdWJsaWNJZCgpOwotICAgIFN0cmluZyBzeXN0ZW1JZCA9IHJlc291cmNlLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gcmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgU3RyaW5nIHVybCA9IG51bGw7Ci0gICAgaWYoc3lzdGVtSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBzeXN0ZW1JZDsKLSAgICB9Ci0gICAgZWxzZSBpZihwdWJsaWNJZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHVybCA9IHB1YmxpY0lkOwotICAgIH0KLSAgICBlbHNlIGlmKG5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVybCA9IG5hbWVzcGFjZTsKLSAgICB9Ci0gICAgaWYodXJsICE9IG51bGwpCi0gICAgewotICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgTGF6eVVSTElucHV0U3RyZWFtKHVybCk7Ci0gICAgICByZXR1cm4gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCByZXNvdXJjZS5nZXRFeHBhbmRlZFN5c3RlbUlkKCksIHJlc291cmNlLmdldEV4cGFuZGVkU3lzdGVtSWQoKSwgaXMsIG51bGwpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVNjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDEyNDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVNjaGVtYUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBHZW5lcmF0ZSBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNjaGVtYSBmb3IgYW4gaW5saW5lIHNjaGVtYS4gV2lsbCBhZGQgaW1wb3J0cyBmb3IgdW5yZXNvbHZlZAotICogbmFtZXNwYWNlcy4KLSAqLwotcHVibGljIGNsYXNzIElubGluZVNjaGVtYUdlbmVyYXRvcgotewotICAvKioKLSAgICogR2VuZXJhdGluZyBpbXBvcnQgc3RhdGVtZW50cyBmb3IgaW5saW5lIHNjaGVtYSByZWZlcmVuY2VzIGlzIAotICAgKiBpbnZhbGlkIGFjY29yZGluZyB0byB0aGUgV1NETCBzcGVjLiBBcyBzb21lIG9sZGVyIGNsaWVudHMgKFdTVlQpIG1heQotICAgKiBkZXBlbmQgb24gdGhpcyBmdW5jdGlvbmFsaXR5IHRoZSBvcHRpb24gdG8gYWxsb3cgdGhpcyBpcyBsZWZ0Ci0gICAqIGluLiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIHBvc3QgMS41LgotICAgKiBUT0RPOiBSZXZpZXcgcmVtb3ZpbmcgdGhpcyBwcmVmZXJlbmNlLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIEdFTkVSQVRFX0lOTElORV9JTVBPUlRTID0gZmFsc2U7Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0VOQ09ESU5HX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6Ly8vIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJpbXBvcnQiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImluY2x1ZGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUEgPSAic2NoZW1hIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGlnbm9yZU5hbWVzcGFjZXMgPQotICAgIHsgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSwgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCwgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSB9OwotCi0gIHByb3RlY3RlZCBzdGF0aWMgSW5saW5lU2NoZW1hR2VuZXJhdG9yIGluc3RhbmNlID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgSW5saW5lU2NoZW1hR2VuZXJhdG9yKCkKLSAgewotCVN0cmluZyBnZW5JbmxpbmVJbXBvcnRzID0gU3lzdGVtLmdldFByb3BlcnR5KCJ3c2RsLnJlcXVpcmUuaW5saW5lLmltcG9ydHMiKTsKLQlpZihnZW5JbmxpbmVJbXBvcnRzICE9IG51bGwgJiYgZ2VuSW5saW5lSW1wb3J0cy5lcXVhbHMoImZhbHNlIikpCi0JewotCSAgR0VORVJBVEVfSU5MSU5FX0lNUE9SVFMgPSB0cnVlOwotCX0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgaW5saW5lIHNjaGVtYSBnZW5lcmF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIElubGluZVNjaGVtYUdlbmVyYXRvciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBJbmxpbmVTY2hlbWFHZW5lcmF0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NoZW1hIGZyb20gdGhlIGVsZW1lbnQgcHJvdmlkZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBlbGVtZW50cyBBIGxpc3Qgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gICAqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSB2YWxpZEltcG9ydE5TcyBBIHNldCBvZiBuYW1lc3BhY2VzIGZvciB3aGljaCBpdCdzIHZhbGlkIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50cy4KLSAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVhTRFN0cmluZyhFbGVtZW50IGVsZW1lbnQsIExpc3QgZWxlbWVudHMsIFN0cmluZyBmaWxlbG9jYXRpb24sIFNldCB2YWxpZEltcG9ydE5TcykKLSAgewotCSAgcmV0dXJuIElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcoZWxlbWVudCwgZWxlbWVudHMsIGZpbGVsb2NhdGlvbiwgbmV3IEhhc2h0YWJsZSgpLCB2YWxpZEltcG9ydE5Tcyk7Ci0gIH0KLSAgCi0gIC8qKgotICAJKiBDcmVhdGVzIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2NoZW1hIG1vZGVsIHdpdGggdGhlIHJvb3QgZWxlbWVudCBvZgotICAJKiBleHRFbGVtLiBDYWxscyBjcmVhdGVYU0RTdHJpbmdSZWN1cnNpdmVseSB0byB0YWtlIGNhcmUgb2YgYnVpbGRpbmcgdGhlIFN0cmluZwotICAJKiBhZnRlciBpdCBvYnRhaW5zIHRoZSBFbGVtZW50IGZyb20gdGhlIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC4KLSAgCSogCi0gIAkqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgCSogQHBhcmFtIGVsZW1lbnRzIEEgbGlzdCB0byBjb250YWluIHRoZSBlbGVtZW50cyBpbiB0aGUgc2NoZW1hIGluIG9yZGVyLgotICAJKiBAcGFyYW0gZmlsZWxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0aGUgc2NoZW1hIGlzIGxvY2F0ZWQgaW4uCi0gIAkqIEBwYXJhbSBwYXJlbnROU3MgQSBoYXNodGFibGUgb2YgcGFyZW50IG5hbWVzcGFjZXMgdG8gdXNlZCB0byByZXNvbHZlIHByZWZpeGVzLgotICAJKiBAcGFyYW0gdmFsaWRJbXBvcnROU3MgQSBzZXQgb2YgbmFtZXNwYWNlcyBmb3Igd2hpY2ggaXQncyB2YWxpZCB0byBjcmVhdGUgaW1wb3J0IHN0YXRlbWVudHMuCi0gIAkqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjaGVtYSB3aXRoIHRoZSByb290IGVsZW1lbnQgJ2VsZW1lbnQnLgotICAJKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlWFNEU3RyaW5nKEVsZW1lbnQgZWxlbWVudCwgTGlzdCBlbGVtZW50cywgU3RyaW5nIGZpbGVsb2NhdGlvbiwgSGFzaHRhYmxlIHBhcmVudE5TcywgU2V0IHZhbGlkSW1wb3J0TlNzKQotICB7Ci0JU2V0IGltcG9ydE5TcyA9IG5ldyBUcmVlU2V0KCk7IAotICAgIGltcG9ydE5Tcy5hZGRBbGwodmFsaWRJbXBvcnROU3MpOyAKLSAgICBpbXBvcnROU3MuYWRkKFNPQVBfRU5DT0RJTkdfVVJJKTsgCi0KLSAgICBJbmxpbmVTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgSGFzaHRhYmxlIG5zUmVzb2x2ZXIgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0TlNSZXNvbHZlcihlbGVtZW50KTsKLSAgICBMaXN0IHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLmdldE5hbWVzcGFjZVByZWZpeGVzKGVsZW1lbnQpOwotICAgIEhhc2h0YWJsZSByZXFOU0RlY2wgPSBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9IYXNodGFibGUgcmVxTlNEZWNsID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTlNEZWNsYXJhdGlvbnMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgaWYoR0VORVJBVEVfSU5MSU5FX0lNUE9SVFMpCi0gICAgewotICAgICAgTGlzdCBpbXBvcnROUyA9IHNjaGVtYUdlbmVyYXRvci5nZXRJbXBvcnROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IucmVtb3ZlSW1wb3J0cyhyZXFucywgaW1wb3J0TlMpOwotICAgICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IucmVtb3ZlTG9jYWxOYW1lc3BhY2VzKHJlcW5zLCBlbGVtZW50KTsKLQkgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlc3RyaWN0SW1wb3J0cyhyZXFucywgdmFsaWRJbXBvcnROU3MpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVxbnMuY2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmdSZWN1cnNpdmVseShlbGVtZW50LCBlbGVtZW50cywgcmVxbnMsIHJlcU5TRGVjbCwgZmlsZWxvY2F0aW9uKTsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBpcyByZXF1aXJlZCBidXQgbm90IGltcG9ydGVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gZmlsZWxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBwYXJlbnROU3MgQSBoYXNodGFibGUgb2YgdGhlIHBhcmVudCBuYW1lc3BhY2VzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNvYXAgZW5jb2RpbmcgbmFtZXNwYWNlIGlzIHJlcXVpcmVkIGJ1dCBub3QgaW1wb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzb2FwRW5jb2RpbmdSZXF1aXJlZE5vdEltcG9ydGVkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGZpbGVsb2NhdGlvbiwgSGFzaHRhYmxlIHBhcmVudE5TcykKLSAgewotICAgIElubGluZVNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW5lcmF0b3IgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICBIYXNodGFibGUgbnNSZXNvbHZlciA9IHNjaGVtYUdlbmVyYXRvci5nZXROU1Jlc29sdmVyKGVsZW1lbnQpOwotICAgIExpc3QgcmVxbnMgPSBudWxsOwotCi0gICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0TmFtZXNwYWNlUHJlZml4ZXMoZWxlbWVudCk7Ci0gICAgc2NoZW1hR2VuZXJhdG9yLnJlc29sdmVOYW1lc3BhY2VzKHJlcW5zLCBuc1Jlc29sdmVyLCBwYXJlbnROU3MpOwotICAgIC8vc2NoZW1hR2VuZXJhdG9yLnJlc29sdmVVbmRlY2xhcmVkTmFtZXNwYWNlcyhyZXFucywgcGFyZW50TlNzKTsKLSAgICBMaXN0IGltcG9ydE5TID0gc2NoZW1hR2VuZXJhdG9yLmdldEltcG9ydE5hbWVzcGFjZXMoZWxlbWVudCk7Ci0gICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IucmVtb3ZlSW1wb3J0cyhyZXFucywgaW1wb3J0TlMpOwotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlbW92ZUxvY2FsTmFtZXNwYWNlcyhyZXFucywgZWxlbWVudCk7Ci0gICAgcmV0dXJuIHNjaGVtYUdlbmVyYXRvci5jaGVja1NPQVBFbmNvZGluZ1JlcXVpcmVkKHJlcW5zKTsKLSAgfQotICAvKioKLSAgICogUmVzb2x2ZSB0aGUgdW5kZWNsYXJlZCBuYW1lc3BhY2VzLgotICAgKiAKLSAgICogQHBhcmFtIHVucmVzb2x2ZWROU3MgQSBsaXN0IG9mIHVucmVzb2x2ZWQgbmFtZXNwYWNlcy4KLSAgICogQHBhcmFtIG5zUmVzb2x2ZXIgVGhlIG5hbWVzcGFjZSByZXNvbHZlciB0byB1c2UuCi0gICAqIEByZXR1cm4gQSBoYXNodGFibGUgb2YgcHJlZml4ZXMgYW5kIG5hbWVzcGFjZXMuCi0gICAqLwotLy8gIHByb3RlY3RlZCBIYXNodGFibGUgcmVzb2x2ZVVuZGVjbGFyZWROYW1lc3BhY2VzKExpc3QgdW5yZXNvbHZlZE5TcywgSGFzaHRhYmxlIG5zUmVzb2x2ZXIpCi0vLyAgewotLy8gICAgSGFzaHRhYmxlIG5hbWVzcGFjZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0vLyAgICBpZiAodW5yZXNvbHZlZE5TcyAhPSBudWxsICYmICF1bnJlc29sdmVkTlNzLmlzRW1wdHkoKSAmJiBuc1Jlc29sdmVyICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIGZvciAoaW50IGkgPSB1bnJlc29sdmVkTlNzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyl1bnJlc29sdmVkTlNzLmdldChpKTsKLS8vICAgICAgICBpZiAobnMuZXF1YWxzKCIiKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBucyA9IFhNTE5TOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgewotLy8gICAgICAgICAgbnMgPSBYTUxOUyArICI6IiArIG5zOwotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAobnNSZXNvbHZlci5jb250YWluc0tleShucykpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgLy9uYW1lc3BhY2VzLnJlbW92ZShpKTsKLS8vICAgICAgICAgIC8vbmFtZXNwYWNlcy5hZGQoaSwgbnNSZXNvbHZlci5nZXQobnMpKTsKLS8vICAgICAgICAgIG5hbWVzcGFjZXMucHV0KG5zLCBuc1Jlc29sdmVyLmdldChucykpOwotLy8gICAgICAgICAgdW5yZXNvbHZlZE5Tcy5yZW1vdmUoaSk7Ci0vLyAgICAgICAgICB1bnJlc29sdmVkTlNzLmFkZChpLCBuc1Jlc29sdmVyLmdldChucykpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgcmV0dXJuIG5hbWVzcGFjZXM7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJlY3Vyc2l2ZSBtZXRob2QgY3JlYXRlcyB0aGUgc2NoZW1hIFN0cmluZyBmcm9tIHRoZSByb290IEVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBlbGVtZW50cyBBIGxpc3QgdG8gYmUgY3JlYXRlZCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSBpbiBvcmRlci4KLSAgICogQHBhcmFtIHJlcXVpcmVkTmFtZXNwYWNlcyBBIGxpc3Qgb2YgcmVxdWlyZWQgbmFtZXNwYWNlcy4KLSAgICogQHBhcmFtIHJlcU5TRGVjbCBBIGhhc2h0YWJsZSBvZiByZXF1aXJlZCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLgotICAgKiBAcGFyYW0gZmlsZWxvY2F0aW9uIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIHNjaGVtYS4KLSAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNjaGVtYS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkoCi0gICAgRWxlbWVudCBlbGVtLAotICAgIExpc3QgZWxlbWVudHMsCi0gICAgTGlzdCByZXF1aXJlZE5hbWVzcGFjZXMsCi0gICAgSGFzaHRhYmxlIHJlcU5TRGVjbCwKLSAgICBTdHJpbmcgZmlsZWxvY2F0aW9uKQotICB7Ci0gICAgaWYgKGVsZW0gPT0gbnVsbCkKLSAgICAgIHJldHVybiAiIjsgLy8ganVzdCBpbiBjYXNlCi0KLSAgICBlbGVtZW50cy5hZGQoZWxlbSk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgeHNkU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW0uZ2V0VGFnTmFtZSgpOwotICAgIHhzZFN0cmluZy5hcHBlbmQoIjwiKS5hcHBlbmQoZWxlbWVudE5hbWUpOwotCi0gICAgU3RyaW5nIG5hbWVQcmVmaXggPSAiIjsgLy8gdGhlIHhtbG5zIHByZWZpeCB1c2VkIGZvciB0aGUgZWxlbWVudHMKLSAgICAvLyBHZXQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZSB4c2RTdHJpbmcKLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLSAgICAgIHhzZFN0cmluZy5hcHBlbmQoIiAiKS5hcHBlbmQobi5nZXROb2RlTmFtZSgpKS5hcHBlbmQoIj1cIiIpOwotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbi5nZXROb2RlTmFtZSgpOwotICAgICAgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0NIRU1BTE9DQVRJT04pICYmIGZpbGVsb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZChyZWxhdGl2ZVBhdGgpLmFwcGVuZCgiXCIiKTsgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIC8vIGdldCB0aGUgbmFtZSBwcmVmaXggZm9yIHRoaXMgc2NoZW1hIHRvIHVzZSBpbiBnZW5lcmF0aW5nIGltcG9ydCBzdGF0ZW1lbnRzCi0gICAgICAgIGlmIChub2RlTmFtZS5pbmRleE9mKFhNTE5TKSAhPSAtMSkKLSAgICAgICAgewotCi0gICAgICAgICAgaWYgKG5vZGVWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKGVsZW0uZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVQcmVmaXggPSBub2RlTmFtZTsKLSAgICAgICAgICAgIGlmIChuYW1lUHJlZml4LmVxdWFsc0lnbm9yZUNhc2UoWE1MTlMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuYW1lUHJlZml4ID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hbWVQcmVmaXggPSBuYW1lUHJlZml4LnN1YnN0cmluZyg2KSArICI6IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVwbGFjZSBvbGQgc2NoZW1hIG5hbWVzcGFjZXMgd2l0aCB0aGUgbmV3IHNjaGVtYSBuYW1lc3BhY2UuCi0gICAgICAgIGlmKG5vZGVWYWx1ZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSkgfHwgbm9kZVZhbHVlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKSkKLSAgICAgICAgIHsKLSAgICAgICAgICBub2RlVmFsdWUgPSBDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxOwotICAgICAgICB9Ci0gICAgICAgIHhzZFN0cmluZy5hcHBlbmQobm9kZVZhbHVlKS5hcHBlbmQoIlwiIik7Ci0gICAgICB9Ci0gICAgfQotLy8gICAgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoImltcG9ydCIpICYmICFmb3VuZFNjaGVtYUxvY2F0aW9uKQotLy8gICAgewotLy8gICAgICB4c2RTdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKFNDSEVNQUxPQ0FUSU9OKS5hcHBlbmQoIj1cIiIpLmFwcGVuZChuYW1lc3BhY2UpLmFwcGVuZCgiXCIiKTsKLS8vICAgIH0KLSAgICAvLyBhZGQgaW4gYW55IHJlcXVpcmVkIE5TIGRlY2xhcmF0aW9ucyBmcm9tIHBhcmVudCBlbGVtZW50cwotICAgIGlmIChyZXFOU0RlY2wgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiBrZXlzID0gcmVxTlNEZWNsLmtleXMoKTsKLSAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBkZWNsTlMgPSAoU3RyaW5nKXJlcU5TRGVjbC5nZXQoa2V5KTsKLSAgICAgICAgaWYoZGVjbE5TLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCBkZWNsTlMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotICAgICAgICAgewotICAgICAgICAgIGRlY2xOUyA9IENvbnN0YW50cy5OU19VUklfWFNEXzIwMDE7Ci0gICAgICAgIH0KLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChrZXkpLmFwcGVuZCgiPVwiIikuYXBwZW5kKGRlY2xOUykuYXBwZW5kKCJcIiIpOwotICAgICAgfQotCi0gICAgfQotICAgIHhzZFN0cmluZy5hcHBlbmQoIj4iKTsKLSAgICBpZiAocmVxdWlyZWROYW1lc3BhY2VzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaVJlcXVpcmVkTmFtZXNwYWNlcyA9IHJlcXVpcmVkTmFtZXNwYWNlcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGlSZXF1aXJlZE5hbWVzcGFjZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWlSZXF1aXJlZE5hbWVzcGFjZXMubmV4dCgpOwotCi0gICAgICAgIHhzZFN0cmluZwotICAgICAgICAgIC5hcHBlbmQoIjwiKQotICAgICAgICAgIC5hcHBlbmQobmFtZVByZWZpeCkKLSAgICAgICAgICAuYXBwZW5kKElNUE9SVCkKLSAgICAgICAgICAuYXBwZW5kKCIgIikKLSAgICAgICAgICAuYXBwZW5kKE5BTUVTUEFDRSkKLSAgICAgICAgICAuYXBwZW5kKCI9XCIiKQotICAgICAgICAgIC5hcHBlbmQobnMpCi0gICAgICAgICAgLmFwcGVuZCgiXCIgIikKLSAgICAgICAgICAuYXBwZW5kKFNDSEVNQUxPQ0FUSU9OKQotICAgICAgICAgIC5hcHBlbmQoIj1cIiIpCi0gICAgICAgICAgLmFwcGVuZChucykKLSAgICAgICAgICAuYXBwZW5kKCJcIi8+Iik7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgeHNkU3RyaW5nLmFwcGVuZCgiXG4iKTsKLQotICAgIC8vIGNhbGwgdGhlIG1ldGhvZCByZWN1cnNpdmVseSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpIHx8IGkgPCA1OyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICB4c2RTdHJpbmcuYXBwZW5kKGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5KGNoaWxkLCBlbGVtZW50cywgbnVsbCwgbnVsbCwgZmlsZWxvY2F0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgeHNkU3RyaW5nLmFwcGVuZCgiPC8iKS5hcHBlbmQoZWxlbS5nZXRUYWdOYW1lKCkpLmFwcGVuZCgiPiIpOwotCi0gICAgcmV0dXJuIHhzZFN0cmluZy50b1N0cmluZygpOwotCi0gIH0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2UgcHJlZml4ZXMgdGhhdCBhcmUgdXNlZCBmb3IgZWxlbWVudHMgb3IgdHlwZXMgaW4gdGhlIHNjaGVtYS4KLSAgICogIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEgdG8gY2hlY2sgZm9yIG5hbWVzcGFjZSBwcmVmaXhlcy4KLSAgICogQHJldHVybiBBIGxpc3Qgb2YgbmFtZXNwYWNlIHByZWZpeGVzIGZvciB0aGUgZWxlbWVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGdldE5hbWVzcGFjZVByZWZpeGVzKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIExpc3QgbmFtZXNwYWNlID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICAvLyByZWdpc3RlciBhbGwgdGhlIGNoaWxkIHR5cGVzIGZpcnN0Ci0gICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBudW1DaGlsZHJlbiA9IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgIC8vIHdlIG9ubHkgd2FudCBub2RlcyB0aGF0IGFyZSBFbGVtZW50cwotICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpbjsKLSAgICAgICAgTGlzdCBjaGlsZG5zID0gZ2V0TmFtZXNwYWNlUHJlZml4ZXMoY2hpbGQpOwotICAgICAgICBmb3IgKGludCBqID0gY2hpbGRucy5zaXplKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpY2hpbGRucy5nZXQoaik7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMobnMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZS5hZGQobnMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBBZGQgdGhlIG5hbWVzcGFjZSBvZiB0aGUgY3VycmVudCBlbGVtZW50Ci0gICAgU3RyaW5nIGVsZW1OUyA9IGVsZW0uZ2V0UHJlZml4KCk7Ci0gICAgLy8gaWYgdGhlcmUgaXMgbm8gbmFtZXNwYWNlIHByZWZpeCBzZXQgaXQgdG8gdGhlIGVtcHR5IHByZWZpeC4KLSAgICBpZihlbGVtTlMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbGVtTlMgPSAiIjsKLSAgICB9Ci0gICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMoZWxlbU5TKSkKLSAgICAgewotICAgICAgbmFtZXNwYWNlLmFkZChlbGVtTlMpOwotICAgIH0KLSAgICAvLyBub3cgYWRkIGFsbCBvZiB0aGUgY3VycmVudCBlbGVtZW50J3MgbmFtZXNwYWNlcwotICAgIC8vIGRvbid0IGluY2x1ZGUgaW1wb3J0IGFuZCBzY2hlbWEgZWxlbWVudHMKLSAgICBTdHJpbmcgbG9jYWxuYW1lID0gZWxlbS5nZXRMb2NhbE5hbWUoKTsKLSAgICBpZiAoIWxvY2FsbmFtZS5lcXVhbHMoSU1QT1JUKSAmJiAhbG9jYWxuYW1lLmVxdWFscyhJTkNMVURFKSAmJiAhbG9jYWxuYW1lLmVxdWFscyhTQ0hFTUEpKQotICAgIHsKLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBuID0gYXR0cy5pdGVtKGkpOwotCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgLy8gcmVtb3ZlZCByZXN0cmljdGlvbiB0aGF0IHdlJ3JlIG9ubHkgbG9va2luZyBhdCB0eXBlcwotICAgICAgICAvLwkJaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRSkpCi0gICAgICAgIC8vCQl7Ci0gICAgICAgIC8vIGRvbid0IHRha2UgbmFtZXNwYWNlIGluZm8gZnJvbSBhdHRyaWJ1dGVzIGRlZmluaW5nIG5hbWVzcGFjZXMuCi0gICAgICAgIC8vIHRoYXQgaW5jbHVkZXMgeG1sbnMsIHRhcmdldE5hbWVzcGFjZQotICAgICAgICBpZiAobm9kZU5hbWUuaW5kZXhPZihYTUxOUykgIT0gLTEgfHwgbm9kZU5hbWUuZXF1YWxzKFRBUkdFVE5BTUVTUEFDRSkgfHwgbm9kZU5hbWUuZXF1YWxzKE5BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR3JhYiBuYW1lc3BhY2UgcHJlZml4ZXMgZnJvbSBhdHRyaWJ1dGVzLgotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgY29sb25JbmRleCA9IG5vZGVOYW1lLmluZGV4T2YoIjoiKTsKLSAgICAgICAgICBpZihjb2xvbkluZGV4ICE9IC0xICYmIChjb2xvbkluZGV4ICsgMSA8IG5vZGVOYW1lLmxlbmd0aCgpICYmIG5vZGVOYW1lLmNoYXJBdChjb2xvbkluZGV4ICsgMSkgIT0gJy8nKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbm9kZU5hbWUuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpOwotICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMocHJlZml4KSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICBuYW1lc3BhY2UuYWRkKHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGludCBjb2xvbkluZGV4ID0gbm9kZVZhbHVlLmluZGV4T2YoIjoiKTsKLSAgICAgICAgLy8gRG9uJ3QgdGFrZSBuYW1lc3BhY2UgaW5mbyBmcm9tIGF0dHJpYnV0ZXMgd2l0aCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIHRoYXQgaXMgYXR0cmlidXRlcwotICAgICAgICAvLyB0aGF0IGFyZSBub3QgcHJlZml4ZWQuIChjb2xvbkluZGV4ID09IC0xKQotICAgICAgICAvLyBJZiB0aGUgY29sb25JbmRleCBpcyBmb2xsb3dlZCBieSBhIC8gdGhlbiBpdCBpcyBhIFVSSSBhbmQgbm90Ci0gICAgICAgIC8vIG5hbWVzcGFjZSBxdWFsaWZpZWQuCi0JCWlmIChjb2xvbkluZGV4ID09IC0xIHx8IChjb2xvbkluZGV4ICsgMSA8IG5vZGVWYWx1ZS5sZW5ndGgoKSAmJiBub2RlVmFsdWUuY2hhckF0KGNvbG9uSW5kZXggKyAxKSA9PSAnLycpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaGVyZSB3ZSBoYXZlIGZvdW5kIGEgY29sb24gZGVsaW1pdGVyIHNvIHdlIG5lZWQgdGhlIG5hbWVzcGFjZSBkZWZpbmVkIGhlcmUKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZVZhbHVlID0gbm9kZVZhbHVlLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhub2RlVmFsdWUpKQotICAgICAgICB7Ci0KLSAgICAgICAgICBuYW1lc3BhY2UuYWRkKG5vZGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotCi0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBhbGwgdGhlIG5hbWVzcGFjZXMgdGhhdCBoYXZlIGFuIGltcG9ydCBzdGF0ZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIGFsbCB0aGUgbmFtZXNwYWNlcyB0aGF0IGFyZSBpbXBvcnRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGdldEltcG9ydE5hbWVzcGFjZXMoRWxlbWVudCBlbGVtKQotICB7Ci0gICAgTGlzdCBuYW1lc3BhY2UgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvLyBjYWxsIHRoZSBtZXRob2QgcmVjdXJzaXZlbHkgZm9yIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIC8vIHJlZ2lzdGVyIGFsbCB0aGUgY2hpbGQgdHlwZXMgZmlyc3QKLSAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgfHwgaSA8IDU7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0gICAgICAvLyB3ZSBvbmx5IHdhbnQgbm9kZXMgdGhhdCBhcmUgRWxlbWVudHMKLSAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KW47Ci0gICAgICAgIExpc3QgY2hpbGRucyA9IGdldEltcG9ydE5hbWVzcGFjZXMoY2hpbGQpOwotICAgICAgICBmb3IgKGludCBqID0gY2hpbGRucy5zaXplKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpY2hpbGRucy5nZXQoaik7Ci0gICAgICAgICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMobnMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZS5hZGQobnMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBpZiB0aGlzIGlzIGFuIGltcG9ydCBlbGVtZW50IGdldCB0aGUgbmFtZXNwYWNlIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3QKLSAgICBpZiAoZWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKElNUE9SVCkpCi0gICAgewotICAgICAgTmFtZWROb2RlTWFwIGF0dHMgPSBlbGVtLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIG4gPSBhdHRzLml0ZW0oaSk7Ci0KLSAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbi5nZXROb2RlTmFtZSgpOwotICAgICAgICBpZiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShOQU1FU1BBQ0UpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMobm9kZVZhbHVlKSkKLSAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIG5hbWVzcGFjZS5hZGQobm9kZVZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotCi0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgSGFzaHRhYmxlIHdpdGggbmFtZXNwYWNlIHByZWZpeGVzIGFzIGtleXMgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBBIGhhc2h0YWJsZSB3aXRoIG5hbWVzcGFjZSBwcmVmaXhlcyBtYXBwZWQgdG8gbmFtZXNwYWNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0TlNSZXNvbHZlcihFbGVtZW50IGVsZW0pCi0gIHsKLSAgICBIYXNodGFibGUgbnNSZXNvbHZlciA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gYXR0cy5pdGVtKGkpOwotCi0gICAgICBTdHJpbmcgbm9kZU5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICBpZiAobm9kZU5hbWUuaW5kZXhPZihYTUxOUykgIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICBTdHJpbmcgbmFtZVByZWZpeCA9IG5vZGVOYW1lOwotCi0gICAgICAgIGlmIChuYW1lUHJlZml4LmVxdWFsc0lnbm9yZUNhc2UoWE1MTlMpKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVByZWZpeCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5hbWVQcmVmaXggPSBuYW1lUHJlZml4LnN1YnN0cmluZyg2KTsKLSAgICAgICAgfQotICAgICAgICBuc1Jlc29sdmVyLnB1dChuYW1lUHJlZml4LCBub2RlVmFsdWUpOwotCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuc1Jlc29sdmVyOwotCi0gIH0KLQotICAvKioKLSAgICogUmVzb2x2ZSB0aGUgbmFtZXNwYWNlcyBpbiB0aGUgZ2l2ZW4gbmFtZXNwYWNlcyBsaXN0IHdpdGggdGhlIHR3byBuYW1lc3BhY2UKLSAgICogcmVzb2x2ZXIgaGFzaHRhYmxlcyBwcm92aWRlZC4gUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIG5hbWVzcGFjZSB0aGF0IG5lZWQKLSAgICogdG8gYmUgZGVjbGFyZWQuCi0gICAqIEZpcnN0IHJlc29sdmUgYWdhaW5zdCB0aGUgbG9jYWwgbmFtZXNwYWNlcyB3aXRoIG5zUmVzb2x2ZXIuCi0gICAqIE5leHQgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBwYXJlbnQgbmFtZXNwYWNlIHdpdGggcGFyZW50TlNSZXNvbHZlci4KLSAgICogQSBzaWRlIGFmZmVjdCBvZiB0aGlzIG1ldGhvZCBpcyB0aGUgbmFtZXNwYWNlcyBsaXN0IGlzIGxlZnQgd2l0aCBvbmx5IHRob3NlIAotICAgKiBuYW1lc3BhY2VzIHRoYXQgYXJlIHJlc29sdmVkIGFuZCB0aGUgcmVzb2x2ZWQgZW50aXRpZXMgYXJlIHBsYWNlZCBpbiB0aGUgCi0gICAqIGxpc3QgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgZW50cmllcy4KLSAgICogRm9yIGV4LiBJZiB5b3UgcHJvdmlkZSBhIGxpc3Qgc3VjaCBhcyB7eHNkLCBpbnRmfSBhbmQgb25seSB4c2QgY2FuIGJlIHJlc29sdmVkCi0gICAqIHlvdSB3aWxsIGVuZCB1cCB3aXRoIHRoZSBsaXN0IHtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX0KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VzIFRoZSBsaXN0IG9mIG5hbWVzcGFjZXMgdG8gcmVzb2x2ZS4KLSAgICogQHBhcmFtIG5zUmVzb2x2ZXIgVGhlIGhhc2h0YWJsZSB0byBiZSB1c2VkIGFzIHRoZSBsb2NhbCByZXNvbHZlci4KLSAgICogQHBhcmFtIHBhcmVudE5TUmVzb2x2ZXIgVGhlIGhhc2h0YWJsZSB0byBiZSB1c2VkIGFzIHRoZSBwYXJlbnQgbmFtZXNwYWNlIHJlc29sdmVyLgotICAgKiBAcmV0dXJuIEEgSGFzaHRhYmxlIG9mIG5hbWVzcGFjZXMgdGhhdCBtdXN0IGJlIGRlY2xhcmVkLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSByZXNvbHZlTmFtZXNwYWNlcyhMaXN0IG5hbWVzcGFjZXMsIEhhc2h0YWJsZSBuc1Jlc29sdmVyLCBIYXNodGFibGUgcGFyZW50TlNSZXNvbHZlcikKLSAgewotICAJSGFzaHRhYmxlIHJlcU5TRGVjbCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBpZiAobmFtZXNwYWNlcyAhPSBudWxsICYmICFuYW1lc3BhY2VzLmlzRW1wdHkoKSAmJiBuc1Jlc29sdmVyICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IG5hbWVzcGFjZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpbmFtZXNwYWNlcy5nZXQoaSk7Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgbmFtZXNwYWNlIGZyb20gdGhlIGxpc3QuCi0gICAgICAgIG5hbWVzcGFjZXMucmVtb3ZlKGkpOwotICAgICAgICAvLyBGaXJzdCB0cnkgdG8gcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsb2NhbCBuYW1lc3BhY2UgcmVzb2x2ZXIuCi0gICAgICAgIGlmIChuc1Jlc29sdmVyLmNvbnRhaW5zS2V5KG5zKSkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCByZXNvbHZlZE5TID0gbnNSZXNvbHZlci5nZXQobnMpOwotICAgICAgICAgIC8vIE9ubHkgYWRkIHRoZSBuYW1lc3BhY2UgaWYgaXQncyBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdC4KLSAgICAgICAgICBpZighbmFtZXNwYWNlcy5jb250YWlucyhyZXNvbHZlZE5TKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2VzLmFkZChpLCBuc1Jlc29sdmVyLmdldChucykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBOZXh0IHRyeSB0byByZXNvbHZlIGFnYWluc3QgdGhlIHBhcmVudCBuYW1lc3BhY2UgcmVzb2x2ZXIuCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJaWYgKG5zLmVxdWFscygiIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5zID0gWE1MTlM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5zID0gWE1MTlMgKyAiOiIgKyBuczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnROU1Jlc29sdmVyLmNvbnRhaW5zS2V5KG5zKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT2JqZWN0IHJlc29sdmVkTlMgPSBwYXJlbnROU1Jlc29sdmVyLmdldChucyk7Ci0gICAgICAgICAgICAgIC8vIE9ubHkgYWRkIHRoZSBuYW1lc3BhY2UgaWYgaXQncyBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgaWYoIW5hbWVzcGFjZXMuY29udGFpbnMocmVzb2x2ZWROUykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLmFkZChpLCByZXNvbHZlZE5TKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAvLyBTdGlsbCBuZWVkIHRvIGRlY2xhcmUgdGhlIG5hbWVzcGFjZSB0aG91Z2guCi0gICAgICAgICAgICAgIHJlcU5TRGVjbC5wdXQobnMsIHJlc29sdmVkTlMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcU5TRGVjbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgYW55IG5hbWVzcGFjZSBmcm9tIHRoZSBuYW1lc3BhY2VzIGxpc3QgaWYgaXQgaXMgaW4gdGhlIGltcG9ydCBsaXN0LgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIG5hbWVzcGFjZXMgbGlzdC4KLSAgICogQHBhcmFtIGltcG9ydGVkTmFtZXNwYWNlcyBBIGxpc3Qgb2YgaW1wb3J0ZWQgbmFtZXNwYWNlcy4KLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHdpdGhvdXQgdGhlIGltcG9ydGVkIG5hbWVzcGFjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCByZW1vdmVJbXBvcnRzKExpc3QgbmFtZXNwYWNlcywgTGlzdCBpbXBvcnRlZE5hbWVzcGFjZXMpCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlcyAhPSBudWxsICYmIGltcG9ydGVkTmFtZXNwYWNlcyAhPSBudWxsICYmICFpbXBvcnRlZE5hbWVzcGFjZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGlJbXBvcnRlZE5TID0gaW1wb3J0ZWROYW1lc3BhY2VzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaUltcG9ydGVkTlMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgaU5TID0gKFN0cmluZylpSW1wb3J0ZWROUy5uZXh0KCk7Ci0KLSAgICAgICAgbmFtZXNwYWNlcy5yZW1vdmUoaU5TKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIHRoZSBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBzY2hlbWEgYW5kIHRoZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiB0aGUgaWdub3JlTmFtZXNwYWNlcwotICAgKiBsaXN0IGZyb20gdGhlIG5hbWVzcGFjZXMgbGlzdCBwcm92aWRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VzIFRoZSBsaXN0IG9mIGxvY2FsIG5hbWVzcGFjZXMuCi0gICAqIEBwYXJhbSBlbGVtIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHdpdGggdGhlIGxvY2FsIG5hbWVzcGFjZXMgcmVtb3ZlZC4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IHJlbW92ZUxvY2FsTmFtZXNwYWNlcyhMaXN0IG5hbWVzcGFjZXMsIEVsZW1lbnQgZWxlbSkKLSAgewotICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwgJiYgZWxlbSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBucyA9IGVsZW0uZ2V0QXR0cmlidXRlKFRBUkdFVE5BTUVTUEFDRSk7Ci0gICAgICBuYW1lc3BhY2VzLnJlbW92ZShucyk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSBpZ25vcmVOYW1lc3BhY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgewotICAgICAgICAvLyBrZWVwIHJlbW92aW5nIHRoZSBuYW1lc3BhY2UgdW50aWwgaXQgaXMgbm90IGluIHRoZSBsaXN0Ci0gICAgICAgIGlmIChuYW1lc3BhY2VzLnJlbW92ZShpZ25vcmVOYW1lc3BhY2VzW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlczsKLSAgfQotICAKLSAgLyoqIAotICAgKiBSZW1vdmUgYWxsIHRoZSBuYW1lc3BhY2VzIGluIHRoZSBuYW1lc3BhY2VzIGxpc3QgdGhhdCBhcmVuJ3QgY29udGFpbmVkIGluIHRoZSAKLSAgICogdmFsaWRJbXBvcnROU3Mgc2V0LiAKLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VzIEEgbGlzdCBvZiBuYW1lc3BhY2VzLiAKLSAgICogQHBhcmFtIHZhbGlkSW1wb3J0TlNzIEEgc2V0IG9mIHZhbGlkIG5hbWVzcGFjZXMuIAotICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBuYW1lc3BhY2VzIHRoYXQgZG9lcyBub3QgY29udGFpbiBhbnkgbWVtYmVycyB3aGljaCBhcmVuJ3QgaW4gdGhlIHZhbGlkSW1wb3J0TlNzIHNldC4gCi0gICAqLyAKLSAgcHJvdGVjdGVkIExpc3QgcmVzdHJpY3RJbXBvcnRzKExpc3QgbmFtZXNwYWNlcywgU2V0IHZhbGlkSW1wb3J0TlNzKSAKLSAgeyAKLSAgICAgICAgSXRlcmF0b3IgbnNJdGVyID0gbmFtZXNwYWNlcy5pdGVyYXRvcigpOyAKLSAgICAgICAgd2hpbGUobnNJdGVyLmhhc05leHQoKSkgCi0gICAgICAgIHsgCi0gICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyluc0l0ZXIubmV4dCgpOyAKLSAgICAgICAgICBpZighdmFsaWRJbXBvcnROU3MuY29udGFpbnMobnMpKSAKLSAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMucmVtb3ZlKG5zKTsgCi0JCQkJbnNJdGVyID0gbmFtZXNwYWNlcy5pdGVyYXRvcigpOwotICAgICAgICAgIH0gCi0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBuYW1lc3BhY2VzOyAKLSAgfSAKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBpcyBpbiB0aGUgbGlzdCBvZiByZXF1aXJlZCBuYW1lc3BhY2VzLAotICAgKiBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcGFyYW0gcmVxbnMgVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB0byBjaGVjayBmb3IgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlcyBpcyBpbiB0aGUgbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tTT0FQRW5jb2RpbmdSZXF1aXJlZChMaXN0IHJlcW5zKQotICB7Ci0gICAgaWYgKHJlcW5zLmNvbnRhaW5zKFNPQVBfRU5DT0RJTkdfVVJJKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVNjaGVtYVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY3ZGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVNjaGVtYVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLkVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBQbHVnaW4gdmFsaWRhdG9yIGZvciB0aGUgV1NETCBWYWxpZGF0aW9uIGZyYW1ld29yay4gVmFsaWRhdGVzIGlubGluZSBzY2hlbWEgZm91bmQgaW4gYSBXU0RMIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgSW5saW5lU2NoZW1hVmFsaWRhdG9yIGltcGxlbWVudHMgSVdTREwxMVZhbGlkYXRvcgotewotICAvKioKLSAgICogUHJvcGVydHkgdG8gYWxsb3cgdGhlIFdTREwgdmFsaWRhdG9yIHRvIHVzZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotICAgKiBkZWZpbmVkIG9uIHRoZSBXU0RMIGRvY3VtZW50IGZvciBzY2hlbWFzIHdpdGggbm8gdGFyZ2V0IG5hbWVzcGFjZS4KLSAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIGFsbG93IGNsaWVudHMgd2hvIGRlcGVuZCBvbiB0aGlzIGZ1bmN0aW9uYWxpdHkKLSAgICogdG8gY29udGludWUgdG8gdXNlIGl0IGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBwb3N0IDEuNS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBVU0VfV1NETF9UQVJHRVROQU1FU1BBQ0UgPSBmYWxzZTsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9XQVJOX09MRF9TQ0hFTUFfTkFNRVNQQUNFID0gIl9XQVJOX09MRF9TQ0hFTUFfTkFNRVNQQUNFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9TQ0hFTUEgPSAiX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9TQ0hFTUEiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiJyI7Ci0gIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciA9IG51bGw7Ci0gIAotICBwdWJsaWMgSW5saW5lU2NoZW1hVmFsaWRhdG9yKCkKLSAgewotCVN0cmluZyB1c2VOUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlLndzZGwudGFyZ2V0bmFtZXNwYWNlIik7Ci0JaWYodXNlTlMgIT0gbnVsbCAmJiB1c2VOUy5lcXVhbHMoInRydWUiKSkKLQl7Ci0JICBVU0VfV1NETF9UQVJHRVROQU1FU1BBQ0UgPSB0cnVlOwotCX0KLSAgfQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gIAlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBlbGVtID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLSAgICBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gKERlZmluaXRpb24pIHBhcmVudHMuZ2V0KHBhcmVudHMuc2l6ZSgpIC0gMSk7Ci0gICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IHdzZGxEZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpOwotICAgIC8vIEFkZCBpbiB0aGUgbmFtZXNwYWNlcyBkZWZpbmVkIGluIHRoZSBkb2MgYWxyZWFkeSB0aGF0IGFyZW4ndCBkZWZpbmVkIGxvY2FsbHkgaW4gdGhpcyBzY2hlbWEuCi0gICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgbmFtZXNwYWNlcyBvdGhlciB0aGVuIGluIHRoZSBkZWZpbnRpb25zIGFuZCB0eXBlcyBlbGVtZW50cyBhcwotICAgIC8vIGlubGluZSBzY2hlbWEgY2FuIG5vdCBoYXZlIGFueSBvdGhlciBwYXJlbnRzIGFuZCBtdXN0IGhhdmUgdGhlcmUgdHdvIHBhcmVudHMuCi0gICAgLy8gRmlyc3QgdGFrZSBjYXJlIG9mIHRoZSBkZWZpbml0aW9ucyBlbGVtZW50Ci0gICAgCi0gICAgLy8gY3JlYXRlIHRoZSBpbmxpbmUgc2NoZW1hIHN0cmluZwotCUVsZW1lbnQgdzNjZWxlbWVudCA9IGVsZW0uZ2V0RWxlbWVudCgpOwotCUhhc2h0YWJsZSBwYXJlbnRuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25zRnJvbVBhcmVudHMod3NkbERlZmluaXRpb24sdzNjZWxlbWVudCk7Ci0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHczY2VsZW1lbnQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotCS8vIGlmIHRoZSB0YXJnZXROYW1lc3BhY2UgaGFzbid0IGJlZW4gZGVmaW5lZCBmb3IgdGhlIHNjaGVtYSB1c2UgdGhlIAotCS8vIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgZGVmaW5pdGlvbnMgZWxlbWVudAotCWlmKFVTRV9XU0RMX1RBUkdFVE5BTUVTUEFDRSAmJiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgfHwgdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhFTVBUWV9TVFJJTkcpKSkKLQkgewotCSAgdGFyZ2V0TmFtZXNwYWNlID0gd3NkbERlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JICB3M2NlbGVtZW50LnNldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFLHRhcmdldE5hbWVzcGFjZSk7Ci0JfQotCQotICAgIC8vIElmIHRoZSBuYW1lc3BhY2UgZ2l2ZW4gaXMgb25lIG9mIHRoZSBvbGQgc2NoZW1hIG5hbWVzcGFjZXMgcHJvZHVjZSBhIHdhcm5pbmcuCi0JU3RyaW5nIG5hbWVzcGFjZSA9IHczY2VsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JaWYobmFtZXNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCBuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotCSB7Ci0JICB2YWxJbmZvLmFkZFdhcm5pbmcoCi0JICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1dBUk5fT0xEX1NDSEVNQV9OQU1FU1BBQ0UsIFFVT1RFICsgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSArIFFVT1RFKSwgZWxlbWVudCk7Ci0JfQotCQotICAgIC8vIG5vdyBjcmVhdGUgYW5kIGNhbGwgdGhlIHZhbGlkYXRvciBmb3IgdGhlIGlubGluZSBzY2hlbWEKLSAgICBYU0RWYWxpZGF0b3Igc2NoZW1hdiA9IG5ldyBYU0RWYWxpZGF0b3IoKTsKLSAgICAKLSAgICAvL1N0cmluZyBmaWxlTG9jYXRpb24gPSBuZXcgVVJMKHZhbGlkYXRvcm1hbmFnZXIuZ2V0RmlsZW5hbWUoKSkuZ2V0UGF0aCgpOwotICAgIElubGluZVhTRFJlc29sdmVyIGlubGluZUVudGl0eVJlc29sdmVyID0KLSAgICAgIGdldEVudGl0eVJlc29sdmVyKHdzZGxEZWZpbml0aW9uLCAoVHlwZXMpIHBhcmVudHMuZ2V0KDApLCBiYXNlTG9jYXRpb24sIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgLy8JYWRkIGluIHRoZSBleHRlcm5hbCBYU0QgQ2F0YWxvZyB0byByZXNvbHZlIHNjaGVtYXMgb2ZmbGluZQotICAgIFhNTEVudGl0eVJlc29sdmVyQ2hhaW4gZW50aXR5UmVzb2x2ZXJDaGFpbiA9IG5ldyBYTUxFbnRpdHlSZXNvbHZlckNoYWluKCk7Ci0gICAgZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihpbmxpbmVFbnRpdHlSZXNvbHZlcik7Ci0gICAgZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcih2YWxJbmZvLmdldFVSSVJlc29sdmVyKCkpOwotICAgIC8vZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihYTUxDYXRhbG9nUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihuZXcgRmlsZUVudGl0eVJlc29sdmVyKCkpOwotCQotICAgIC8vCSBDcmVhdGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5saW5lIHNjaGVtYS4gCi0gICAgU3RyaW5nIHhzZCA9IElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcodzNjZWxlbWVudCwgZWxlbWVudHMsIGJhc2VMb2NhdGlvbiwgcGFyZW50bmFtZXNwYWNlcywgaW5saW5lRW50aXR5UmVzb2x2ZXIuZ2V0SW5saW5lU2NoZW1hTlNzKCkpOyAKLQotCQotICAgIHNjaGVtYXYudmFsaWRhdGVJbmxpbmVTY2hlbWEoeHNkLCB0YXJnZXROYW1lc3BhY2UsIGJhc2VMb2NhdGlvbiwgZW50aXR5UmVzb2x2ZXJDaGFpbiwgaW5saW5lRW50aXR5UmVzb2x2ZXIsIHZhbEluZm8uZ2V0U2NoZW1hQ2FjaGUoKSk7Ci0gICAgCi0vLwljaGVjayBpZiB0aGUgU09BUCBFbmNvZGluZyBuYW1lc3BhY2UgaXMgcmVxdWlyZWQgYnV0IG5vdCBpbXBvcnRlZAotCQkgaWYgKElubGluZVNjaGVtYUdlbmVyYXRvci5zb2FwRW5jb2RpbmdSZXF1aXJlZE5vdEltcG9ydGVkKGVsZW0uZ2V0RWxlbWVudCgpLCBiYXNlTG9jYXRpb24sIHBhcmVudG5hbWVzcGFjZXMpKQotCQkgewotCQkgICB2YWxJbmZvLmFkZFdhcm5pbmcobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9TQ0hFTUEpLCBlbGVtZW50KTsKLQkJIH0KLQotICAgIC8vIElmIHRoZSBzY2hlbWEgaXNuJ3QgdmFsaWQgYWRkIHRoZSBlcnJvciBtZXNzYWdlcyBwcm9kdWNlZCB0byB2YWxpbmZvLgotICAgIC8vIERvbid0IGFkZCB0aGUgZXJyb3JzIGlmIHRoZXkgYXJlIGxvY2F0ZWQgb24gYW5vdGhlciBpbmxpbmUgc2NoZW1hLiBUaGVzZQotCS8vIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiB0aGUgb3RoZXIgc2NoZW1hIGlzIHZhbGlkYXRlZC4KLQkJIAotICAgIGlmICghc2NoZW1hdi5pc1ZhbGlkKCkpCi0gICAgewotICAgICAgSXRlcmF0b3IgZXJyb3JzID0gc2NoZW1hdi5nZXRFcnJvcnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGVycm9ycy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEVycm9yTWVzc2FnZSBlcnIgPSAoRXJyb3JNZXNzYWdlKSBlcnJvcnMubmV4dCgpOwotICAgICAgICBTdHJpbmcgdXJpID0gZXJyLmdldFVSSSgpOwotICAgICAgICBpbnQgbGluZSA9IGVyci5nZXRFcnJvckxpbmUoKTsKLSAgICAgICAgU3RyaW5nIGVycm1lc3MgPSBlcnIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0gICAgICAgIGVycm1lc3MgPSByZXBsYWNlTmFtZXNwYWNlKGVycm1lc3MsIG5hbWVzcGFjZSk7Ci0gICAgICAgIGlmKGxpbmUgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYodXJpID09IG51bGwgfHwgdXJpLmVxdWFscyh2YWxJbmZvLmdldEZpbGVVUkkoKSkpCi0gICAgICAgICAgewotCQkJdmFsSW5mby5hZGRFcnJvcihlcnJtZXNzLCBnZXRPYmplY3RBdExpbmUobGluZSAtIDEsIGVsZW1lbnRzKSk7Ci0gICAgICAgICAgfQotCQkgIGVsc2UgaWYoIWlubGluZUVudGl0eVJlc29sdmVyLmlzSW5saW5lU2NoZW1hKHVyaSkgJiYgIXVyaS5lcXVhbHModmFsSW5mby5nZXRGaWxlVVJJKCkgKyBJbmxpbmVYU0RSZXNvbHZlci5JTkxJTkVfU0NIRU1BX0lEKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKGVycm1lc3MsIGxpbmUsIGVyci5nZXRFcnJvckNvbHVtbigpLCB1cmkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCQllbHNlIGlmKHVyaSAhPSBudWxsICYmICFpbmxpbmVFbnRpdHlSZXNvbHZlci5pc0lubGluZVNjaGVtYSh1cmkpICYmICF1cmkuZXF1YWxzKHZhbEluZm8uZ2V0RmlsZVVSSSgpICsgSW5saW5lWFNEUmVzb2x2ZXIuSU5MSU5FX1NDSEVNQV9JRCkpCi0gICAgICAgIHsKLQkgICAgICB2YWxJbmZvLmFkZEVycm9yKGVycm1lc3MsIDAsMCwgdXJpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBJZiB0aGUgcGFyc2VyIHdhcyBhYmxlIHRvIGNyZWF0ZSBhIHNjaGVtYSBtb2RlbCBhc3NpZ24gaXQgZm9yIHVzZS4gCi0gICAgLy8gSWYgdGhlIHNjaGVtYSBpcyBpbnZhbGlkIHdlIHN0aWxsIHdhbnQgdG8gbWFrZSB1c2Ugb2YgdGhlIG1vZGVsCi0gICAgLy8gd2hlcmUgcG9zc2libGUgdG8gYXZvaWQgY2FzY2FkaW5nIGVycm9yIG1lc3NhZ2VzIHRvIG1lc3NhZ2UgcGFydHMuCi0gICAgWFNNb2RlbCB4c01vZGVsID0gc2NoZW1hdi5nZXRYU01vZGVsKCk7Ci0gICAgaWYoeHNNb2RlbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkU2NoZW1hKHhzTW9kZWwpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW4gZW50aXR5IHJlc29sdmVyIHRoYXQgd2lsbCByZXNvbHZlIGlubGluZSBzY2hlbWFzLiAgRXZlcnkgaW5saW5lIHNjaGVtYSBpcyBwcmVyZWdpc3RlcmVkIHdpdGgKLSAgICogdGhlIHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB0eXBlcyBUaGUgdHlwZXMgZWxlbWVudC4KLSAgICogQHBhcmFtIHJlZmVyZW5jZUxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBBbiBlbnRpdHkgcmVzb2x2ZXIgdGhhdCBjYW4gcmVzb2x2ZSBpbmxpbmUgc2NoZW1hcy4KLSAgICovCi0gIHByb3RlY3RlZCBJbmxpbmVYU0RSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcihEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBUeXBlcyB0eXBlcywgU3RyaW5nIHJlZmVyZW5jZUxvY2F0aW9uLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgSW5saW5lWFNEUmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSBuZXcgSW5saW5lWFNEUmVzb2x2ZXIoKTsKLS8vICAgIGVudGl0eVJlc29sdmVyLnNldFJlZmVyZW5jZUxvY2F0aW9uKHJlZmVyZW5jZUxvY2F0aW9uKTsKLSAgICBMaXN0IHNjaGVtYXMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBpZiAoc2NoZW1hcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGlTY2hlbWFzID0gc2NoZW1hcy5pdGVyYXRvcigpOwotCSAgU2V0IG5hbWVzcGFjZXMgPSBuZXcgVHJlZVNldCgpOyAKLSAgICAgIHdoaWxlIChpU2NoZW1hcy5oYXNOZXh0KCkpIAotICAgICAgeyAKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBpU2NoZW1hcy5uZXh0KCk7IAotICAgICAgICBTdHJpbmcgdGhpc05hbWVzcGFjZSA9IGV4dEVsZW0uZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsgCi0gICAgICAgIGlmKHRoaXNOYW1lc3BhY2UgIT0gbnVsbCkgCi0gICAgICAgIHsgCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5hZGQodGhpc05hbWVzcGFjZSk7IAotICAgICAgICB9IAotICAgICAgfSAKLSAgICAgIGlTY2hlbWFzID0gc2NoZW1hcy5pdGVyYXRvcigpOyAKLQotICAgICAgd2hpbGUgKGlTY2hlbWFzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBpU2NoZW1hcy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aGlzTmFtZXNwYWNlID0gZXh0RWxlbS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBpZiAodGhpc05hbWVzcGFjZSAhPSBudWxsICYmICF0aGlzTmFtZXNwYWNlLmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAJCi0gICAgICAgIAlFbGVtZW50IGVsZW1lbnQgPSBleHRFbGVtLmdldEVsZW1lbnQoKTsKLQkJCQotLy8JCQljcmVhdGUgdGhlIGlubGluZSBzY2hlbWEgc3RyaW5nCi0JCQkgLy9FbGVtZW50IHczY2VsZW1lbnQgPSBlbGVtLmdldEVsZW1lbnQoKTsKLQkJCSBIYXNodGFibGUgcGFyZW50bmFtZXNwYWNlcyA9IGdldE5hbWVzcGFjZURlY2xhcmF0aW9uc0Zyb21QYXJlbnRzKHdzZGxEZWZpbml0aW9uLGVsZW1lbnQpOwotCQkJIFN0cmluZyB4c2QgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuY3JlYXRlWFNEU3RyaW5nKGVsZW1lbnQsIG5ldyBBcnJheUxpc3QoKSwgcmVmZXJlbmNlTG9jYXRpb24sIHBhcmVudG5hbWVzcGFjZXMsIG5hbWVzcGFjZXMpOwotICAgICAgICAJLy9hZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbixlbGVtZW50KTsKLSAgICAgICAgICBlbnRpdHlSZXNvbHZlci5hZGQodGhpc05hbWVzcGFjZSwgeHNkKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlbnRpdHlSZXNvbHZlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEudmFsaWRhdG9yLklXU0RMMTFWYWxpZGF0b3Ijc2V0UmVzb3VyY2VCdW5kbGUoamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgCW1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyYik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VHZW5lcmF0b3IoTWVzc2FnZUdlbmVyYXRvciBtZXNzZ2VuKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1lc3NnZW47Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFzIGluIHRoZSBmb3JtIAotICAgKiB4bWxucz0ic29tZW5hbWVzcGFjZSIKLSAgICogZnJvbSB0aGUgZGVmaW5pdGlvbnMgYW5kIHR5cGVzIGVsZW1lbnRzIGFuZCBhZGQgdGhlbSB0byB0aGUgc2NoZW1hIGVsZW1lbnQgc28gdGhlIHNjaGVtYSAKLSAgICogdmFsaWRhdG9yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgdHlwZXMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIGhhc2h0YWJsZSB3aXRoIHRoZSBuYW1lc3BhY2UgZWxlbWVudHMgZnJvbSB0aGUgZWxlbWVudHMgcHJvdmlkZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldE5hbWVzcGFjZURlY2xhcmF0aW9uc0Zyb21QYXJlbnRzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAJSGFzaHRhYmxlIG5zcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBJdGVyYXRvciBuYW1lU3BhY2VzID0gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICBTdHJpbmcgWE1MTlMgPSBDb25zdGFudHMuQVRUUl9YTUxOUzsKLSAgICAKLSAgICB3aGlsZSAobmFtZVNwYWNlcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIG5zcHJlZml4ID0gWE1MTlM7Ci0gICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKSBuYW1lU3BhY2VzLm5leHQoKTsKLSAgICAgIGlmICghbnMuZXF1YWxzSWdub3JlQ2FzZSgiIikpCi0gICAgICB7Ci0gICAgICAgIG5zcHJlZml4ICs9ICI6IjsKLSAgICAgIH0KLSAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUobnNwcmVmaXggKyBucykpCi0gICAgICB7Ci0gICAgICAJbnNzLnB1dChuc3ByZWZpeCArIG5zLCB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UobnMpKTsKLS8vICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuc3ByZWZpeCArIG5zLCB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UobnMpKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICAvLyBOZXh0IGhhbmRsZSB0aGUgcGFyZW50IHR5cGVzIGVsZW1lbnQKLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0c2xlbmd0aCA9IGF0dHMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSB0ZW1wbm9kZSA9IGF0dHMuaXRlbShpKTsKLSAgICAgIFN0cmluZyBub2RlbmFtZSA9IHRlbXBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAvLyBpZiB0aGlzIGlzIGEgbmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgaWYgKG5vZGVuYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xKQotICAgICAgewotCQluc3MucHV0KG5vZGVuYW1lLCAgdGVtcG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKG5vZGVuYW1lLCB0ZW1wbm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuc3M7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIGxpbmUgbnVtYmVyIGZvciB0aGUgc2NoZW1hIHJldHVybnMgdGhlIGVsZW1lbnQgZm91bmQgb24gdGhhdCBsaW5lLiAKLSAgICogVXNlZnVsIGZvciBvYnRhaW5pbmcgZWxlbWVudHMgZnJvbSBzY2hlbWEgU3RyaW5ncy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIG51bWJlciBmb3IgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGVsZW1lbnRzIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIGNoZWNrLgotICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgbG9jYXRlZCBhdCB0aGUgbGluZSBvciBhdCBsaW5lIDAgaWYgdGhlIGxpbmUgaXMgaW52YWxpZC4KLSAgICovCi0gICBwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdEF0TGluZShpbnQgbGluZSwgTGlzdCBlbGVtZW50cykKLSAgIHsKLSAgIAlpZihsaW5lIDwgMCB8fCBsaW5lID49IGVsZW1lbnRzLnNpemUoKSkKLSAgIAl7Ci0gICAJICBsaW5lID0gMDsKLSAgIAl9Ci0JcmV0dXJuIGVsZW1lbnRzLmdldChsaW5lKTsKLSAgIH0KLSAgIAotICAvKioKLSAgICogUmVwbGFjZSBhbnkgaW5zdGFuY2Ugb2YgdGhlIDIwMDEgc2NoZW1hIG5hbWVzcGFjZSBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSB3aXRoCi0gICAqIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byByZXBsYWNlIHRoZSBuYW1lc3BhY2UgaW4uCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB1c2VkIGZvciByZXBsYWNlbWVudC4KLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSB3aXRoIHRoZSAyMDAxIHNjaGVtYSBuYW1lc3BhY2UgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlcGxhY2VOYW1lc3BhY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBuYW1lc3BhY2UpCi0gICB7Ci0gICAgIFN0cmluZyB4c2QyMDAxID0gQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMTsKLSAgICAgaW50IHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKHhzZDIwMDEpOwotICAgICBpbnQgZW5kID0gc3RhcnQgKyB4c2QyMDAxLmxlbmd0aCgpOwotICAgICBpZihzdGFydCA8IDApCi0gICAgIHsKLSAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICAgfQotICAgICBTdHJpbmcgc3RhcnRTdHJpbmcgPSBtZXNzYWdlLnN1YnN0cmluZygwLHN0YXJ0KTsKLSAgICAgU3RyaW5nIGVuZFN0cmluZyA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCxtZXNzYWdlLmxlbmd0aCgpKTsKLSAgICAgcmV0dXJuIHN0YXJ0U3RyaW5nICsgbmFtZXNwYWNlICsgZW5kU3RyaW5nOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVhTRFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGI3ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEFuIFhNTEVudGl0eVJlc29sdmVyIHRoYXQgYWxsb3dzIGlubGluZSBzY2hlbWFzIHRvIHJlc29sdmUgZWFjaCBvdGhlciB0aHJvdWdoIGltcG9ydHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVYU0RSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTElORV9TQ0hFTUFfSUQgPSAiI2lubGluZXNjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVggPSAiZmlsZToiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbnRpdGllcyA9IG5ldyBIYXNodGFibGUoKTsKLS8vICBwcm90ZWN0ZWQgU3RyaW5nIHJlZkxvY2F0aW9uID0gbnVsbDsKLSAgcHJvdGVjdGVkIFhNTEVudGl0eVJlc29sdmVyIGV4dGVybmFsUmVzb2x2ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgWE1MSW5wdXRTb3VyY2UgcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2UgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlZmVycmluZ1NjaGVtYU5hbWVzcGFjZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3R1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBJbmxpbmVYU0RSZXNvbHZlcigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpCi0JCSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsJIAotCVN0cmluZyBwdWJsaWNJZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRQdWJsaWNJZCgpOwkKLQlTdHJpbmcgbmFtZXNwYWNlID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldE5hbWVzcGFjZSgpOwotCVhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLQlTdHJpbmcgc2NoZW1hID0gbnVsbDsKLQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkKLQl7Ci0JICBpZihwdWJsaWNJZCA9PSBudWxsKQotCSAgewotCSAgCWlmKG5hbWVzcGFjZSA9PSBudWxsKQotCSAgCXsJCi0JICAgICAgcmV0dXJuIG51bGw7Ci0JICAJfQotCSAgCWVsc2UKLQkgIAl7Ci0JICAJCXN5c3RlbUlkID0gbmFtZXNwYWNlOwotCSAgCX0KLQkgIH0KLQkgIGVsc2UKLQkgIHsJCi0JICAgIHN5c3RlbUlkID0gcHVibGljSWQ7Ci0JICB9Ci0JfQotCSAgCi0JaWYocmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlICE9IG51bGwgJiYgcmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlLmVxdWFscyhzeXN0ZW1JZCkpCi0JewotCQlpZihyZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZSE9bnVsbCkKLQkJewotCQkJcmV0dXJuIHJlZmVycmluZ1NjaGVtYUlucHV0U291cmNlOwotCQl9Ci0JfQotCWVsc2UgaWYgKChzY2hlbWEgPSAoU3RyaW5nKSBlbnRpdGllcy5nZXQoc3lzdGVtSWQpKSAhPSBudWxsICYmICFzY2hlbWEuZXF1YWxzKCIiKSkKLQl7Ci0JCWlzID0gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCByZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpICsgSU5MSU5FX1NDSEVNQV9JRCwgbnVsbCwgbmV3IFN0cmluZ1JlYWRlcihzY2hlbWEpLG51bGwpOwotCX0KLQkKLSAgICAvL2lmKGlzID09IG51bGwpCi0gICAgLy97Ci0gICAgLy8JdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgLy99Ci0JcmV0dXJuIGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBpbmxpbmUgc2NoZW1hLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSAtIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEKLSAgICogQHBhcmFtIHNjaGVtYSAtIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2hlbWEKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hKQotICB7Ci0gICAgZW50aXRpZXMucHV0KHRhcmdldE5hbWVzcGFjZSwgc2NoZW1hKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgcmVmZXJyaW5nIGlubGluZSBzY2hlbWEuIAotICAgKiAKLSAgICogQHBhcmFtIGlucHV0U291cmNlIC0gYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5saW5lIHNjaGVtYQotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW5saW5lIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUmVmZXJyaW5nU2NoZW1hKFhNTElucHV0U291cmNlIGlucHV0U291cmNlLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLSAgICByZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXNwYWNlIGNvcnJlc3BvbmRzIHRvIGFuIGlubGluZSBzY2hlbWEsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5hbWVzcGFjZSBjb3JyZXNwb25kcyB0byBhbiBpbmxpbmUgc2NoZW1hLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0lubGluZVNjaGVtYShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmV0dXJuIGVudGl0aWVzLmNvbnRhaW5zS2V5KG5hbWVzcGFjZSk7Ci0gIH0KLSAgCi0gIC8qKiAKLSAgICogR2V0IHRoZSBzZXQgb2YgdGhlIGlubGluZSBzY2hlbWEgbmFtZXNwYWNlcy4gCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzZXQgb2YgdGhlIGlubGluZSBzY2hlbWEgbmFtZXNwYWNlcy4gCi0gICAqLyAKLSAgcHVibGljIFNldCBnZXRJbmxpbmVTY2hlbWFOU3MoKSAKLSAgeyAKLSAgICAgICAgcmV0dXJuIGVudGl0aWVzLmtleVNldCgpOyAKLSAgfSAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1NjaGVtYUF0dHJpYnV0ZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNDNlMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5TY2hlbWFTeW1ib2xzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuU3ltYm9sVGFibGU7Ci0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBhbGxvdyB0aGUgY2FsbGluZyBjb2RlIHRvIHNlZSBpZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQgaW4gc2NoZW1hLgotICogVGhpcyBzZXJ2ZXMgYXMgc2NoZW1hIGZvciBzY2hlbWEuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSBleHRlbmRzIFN5bWJvbFRhYmxlCi17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZVRhYmxlKCkKLSAgewotICAgIC8vIGFkZCBhbGwgb2YgdGhlIHN5Ym9scyB0byB0aGUgdGFibGUuIFNjaGVtYVN5bWJvbHMgcHJvYmFibHkgc2hvdWxkIGhhdmUKLSAgICAvLyBhIFN5bWJvbFRhYmxlIGZvciB0aGVzZSBidXQgaXQgZG9lc24ndAotCi0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5EQU5ZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFdPUE9VTkRMT0NBTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5ET1RIRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UV09QT1VORFRBUkdFVE5TKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUE9VTkRBTEwpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRV8wKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFJVRV8xKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQU5ZU0lNUExFVFlQRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0FOWVRZUEUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9BTllVUkkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CQVNFNjRCSU5BUlkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CT09MRUFOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0NPTExBUFNFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RBVEVUSU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREVDSU1BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RPVUJMRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RVUkFUSU9OKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRJRVMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9FWFRFTlNJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0ZMT0FUKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSEVYQklOQVJZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSUQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9JRFJFRik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lEUkVGUyk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MQU5HVUFHRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xBWCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xJU1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTkFNRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05FR0FUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX01PTlRIKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTU9OVEhEQVkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OQ05BTUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OTVRPS0VOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk1UT0tFTlMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05ORUdBVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05QT1NJVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT1JNQUxJWkVEU1RSSU5HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk9UQVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9PUFRJT05BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BPU0lUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BSRVNFUlZFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUFJPSElCSVRFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1FOQU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUVVBTElGSUVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVQTEFDRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1JFUVVJUkVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVTVFJJQ1RJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NLSVApOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJQ1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJTkcpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVUJTVElUVVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9USU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVE9LRU4pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UUlVFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5CT1VOREVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5JT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTlFVQUxJRklFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVEQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVESU5UKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURMT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURTSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1lFQVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9ZRUFSTU9OVEgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvVmFsaWRhdGVFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlM2U1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLkVycm9yTWVzc2FnZTsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBYTUxFcnJvckhhbmRsZXIgdGhhdCBjYXB0dXJlcyBlcnJvciBmcm9tIFhlcmNlcy4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgWE1MRXJyb3JIYW5kbGVyCi17Ci0gIEFycmF5TGlzdCBlcnJvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgCi0gIAotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBtZXNzYWdlcyBjcmVhdGVkIGJ5IFhlcmNlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVycm9ycyBsaXN0LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIHZhbGlkYXRpb24gbWVzc2FnZSBmcm9tIHRoZSBleGNlcHRpb24gYW5kIHNldmVyaXR5LgotICAgKiAKLSAgICogQHBhcmFtIGtleSBUaGUgWGVyY2VzIGVycm9yIGtleS4KLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvci4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eS4KLSAgICogQHJldHVybiBBbiBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHJvdGVjdGVkIEVycm9yTWVzc2FnZSBjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihTdHJpbmcga2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBlcnJvciwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgU3RyaW5nIHVyaSA9IGVycm9yLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgIGlmKHVyaSA9PSBudWxsKQotICAgIHsKLSAgICAgIHVyaSA9IGVycm9yLmdldFB1YmxpY0lkKCk7Ci0gICAgfQotICAgIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0gICAgZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShlcnJvci5nZXRMaW5lTnVtYmVyKCkpOwotICAgIGVycm9yTWVzc2FnZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3IuZ2V0TWVzc2FnZSgpKTsKLSAgICBlcnJvck1lc3NhZ2Uuc2V0RXJyb3JDb2x1bW4oZXJyb3IuZ2V0Q29sdW1uTnVtYmVyKCkpOwotICAgIGVycm9yTWVzc2FnZS5zZXRVUkkodXJpKTsKLSAgICBlcnJvck1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciNlcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvckxpc3QuYWRkKGNyZWF0ZVZhbGlkYXRpb25NZXNzYWdlRm9yRXhjZXB0aW9uKGtleSwgZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9FUlJPUikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZmF0YWxFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIGVycm9yTGlzdC5hZGQoY3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VGb3JFeGNlcHRpb24oa2V5LCBleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX0ZBVEFMX0VSUk9SKSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciN3YXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3JMaXN0LmFkZChjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihrZXksIGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfV0FSTklORykpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9YTUxFbnRpdHlSZXNvbHZlckNoYWluLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9YTUxFbnRpdHlSZXNvbHZlckNoYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzIwYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWE1MRW50aXR5UmVzb2x2ZXJDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEhhbmRsZSBhIGNoYWluIG9mIGVudGl0eSByZXNvbHZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFbnRpdHlSZXNvbHZlckNoYWluIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJpdmF0ZSBMaXN0IGVudGl0eVJlc29sdmVycyA9IG5ldyBWZWN0b3IoKTsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHhtbFJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLSAgICAKLSAgICAvLyBUT0RPOiBUaGlzIGZpeCBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHRoaXMgcHJvYmxlbSBpcyBmaXhlZCBpbiBYZXJjZXMuCi0gICAgLy8gWGVyY2VzIGN1cnJlbnRseSAodmVyc2lvbiAyLjcpIGhhcyBhIHByb2JsZW0gd2hlbiB0aGUgaG9ub3VyIGFsbCBzY2hlbWEgbG9jYXRpb25zCi0gICAgLy8gcHJvcGVydHkgaXMgc2V0IGFuZCB0aGUgc2FtZSBzY2hlbWEgaXMgaW1wb3J0ZWQgYnkgdHdvIGRpZmZlcmVudCBmaWxlcyBhbmQgb25lCi0gICAgLy8gb2YgdGhlIGltcG9ydHMgdXNlcyBcIGFuZCBhbm90aGVyIHVzZXMgLyBpbiBwYXJ0IG9mIHRoZSBsb2NhdGlvbi4KLSAgICBpZih4bWxSZXNvdXJjZUlkZW50aWZpZXIuZ2V0TGl0ZXJhbFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAJeG1sUmVzb3VyY2VJZGVudGlmaWVyLnNldExpdGVyYWxTeXN0ZW1JZCh4bWxSZXNvdXJjZUlkZW50aWZpZXIuZ2V0TGl0ZXJhbFN5c3RlbUlkKCkucmVwbGFjZSgnXFwnLCcvJykpOwotICAgIAotICAgIEl0ZXJhdG9yIGVudGl0eVJlc29sdmVySXRlciA9IGVudGl0eVJlc29sdmVycy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlbnRpdHlSZXNvbHZlckl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gKFhNTEVudGl0eVJlc29sdmVyKWVudGl0eVJlc29sdmVySXRlci5uZXh0KCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaXMgPSBlbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5KHhtbFJlc291cmNlSWRlbnRpZmllcik7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoWE5JRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gVGhyb3cgYW5kIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGlzbid0IGZvdW5kCi0gICAgaWYgKGlzID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9jYXRlIGZpbGUiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBlbnRpdHkgcmVzb2x2ZXIgdG8gdGhpcyBjaGFpbi4KLSAgICogCi0gICAqIEBwYXJhbSBlbnRpdHlSZXNvbHZlciBUaGUgcmVzb2x2ZXIgdG8gYWRkIHRvIHRoZSBjaGFpbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVudGl0eVJlc29sdmVyKFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKQotICB7Ci0gICAgZW50aXR5UmVzb2x2ZXJzLmFkZChlbnRpdHlSZXNvbHZlcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1hTRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGVmZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWFNEVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLlhTRERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWE1MR3JhbW1hclByZXBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTEdyYW1tYXJQb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuR3JhbW1hcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWFNHcmFtbWFyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5TdHJpbmdMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci0KLQotLyoqCi0gKiBWYWxpZGF0ZSBzY2hlbWFzIGZyb20gZmlsZXMgb3IgU3RyaW5nLgotICovCi1wdWJsaWMgY2xhc3MgWFNEVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TX0ZFQVRVUkVfSUQgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2hvbm91ci1hbGwtc2NoZW1hTG9jYXRpb25zIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWCA9ICJmaWxlOiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRBUkdFVE5BTUVTUEFDRSA9ICJ0YXJnZXROYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJpbXBvcnQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNDSEVNQUxPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gaWdub3JlTmFtZXNwYWNlcyA9Ci0gICAgeyAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiIH07Ci0KLSAgcHJvdGVjdGVkIFhTTW9kZWwgeHNNb2RlbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFhTRDsKLSAgcHJvdGVjdGVkIExpc3QgZXJyb3JzOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVsb2NhdGlvbjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgWFNEVmFsaWRhdG9yKCkKLSAgewotICAgIHhzTW9kZWwgPSBudWxsOwotICAgIGlzVmFsaWRYU0QgPSBmYWxzZTsKLSAgICBlcnJvcnMgPSBudWxsOwotICB9Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSBhbiBpbmxpbmUgc2NoZW1hLgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYSBBIHNjaGVtYSByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4KLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gZmlsZWxvYyBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlSW5saW5lU2NoZW1hKFN0cmluZyBzY2hlbWEsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyBmaWxlbG9jKQotICB7Ci0gICAgdmFsaWRhdGVJbmxpbmVTY2hlbWEoc2NoZW1hLCB0YXJnZXROYW1lc3BhY2UsIGZpbGVsb2MsIG51bGwsIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgYW4gaW5saW5lIHNjaGVtYSBhbmQgc3BlY2lmeSBhbiBlbnRpdHkgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hIFRoaXMgc2NoZW1hIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBmaWxlbG9jIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIHNjaGVtYS4KLSAgICogQHBhcmFtIGVudGl0eVJlc29sdmVyQ2hhaW4gVGhlIGVudGl0eSByZXNvbHZlciBjaGFpbi4KLSAgICogQHBhcmFtIGlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyIEFuIGlubGluZSBzY2hlbWEgcmVzb2x2ZXIgZm9yIHRoaXMgc2NoZW1hLgotICAgKiBAcGFyYW0gZ3JhbW1hclBvb2wgQSBYZXJjZXMgWE1MR3JhbW1hclBvb2wgdGhhdCBob2xkcyBwcmVjYWNoZWQgc2NoZW1hcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlSW5saW5lU2NoZW1hKAotICAgIFN0cmluZyBzY2hlbWEsCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICBTdHJpbmcgZmlsZWxvYywKLSAgICBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlckNoYWluLAotICAgIFhNTEVudGl0eVJlc29sdmVyIGlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyLAotICAgIFhNTEdyYW1tYXJQb29sIGdyYW1tYXJQb29sKQotICB7Ci0gICAgZmlsZWxvY2F0aW9uID0gZmlsZWxvYzsKLSAgICAKLSAgICB2YWxpZGF0ZVhTRChzY2hlbWEsIHRydWUsIGVudGl0eVJlc29sdmVyQ2hhaW4sdGFyZ2V0TmFtZXNwYWNlLCBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlciwgZ3JhbW1hclBvb2wpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGxvY2F0ZWQgYXQgdGhlIHVyaSBzcGVjaWZpZWQgd2l0aCB0aGUgZ2l2ZW4gZW50aXR5IHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBBbiBhYnNvbHV0ZSB1cmkgZm9yIHRoZSBzY2hlbWEgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBlbnRpdHlSZXNvbHZlciBBbiBlbnRpdHkgcmVzb2x2ZXIgdG8gYmUgdXNlZC4KLSAgICogQHBhcmFtIGdyYW1tYXJQb29sIEEgWGVyY2VzIFhNTEdyYW1tYXJQb29sIHRoYXQgaG9sZHMgcHJlY2FjaGVkIHNjaGVtYXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciwgWE1MR3JhbW1hclBvb2wgZ3JhbW1hclBvb2wpCi0gIHsKLSAgICB2YWxpZGF0ZVhTRCh1cmksIGZhbHNlLCBlbnRpdHlSZXNvbHZlciwgbnVsbCwgbnVsbCwgZ3JhbW1hclBvb2wpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIHNjaGVtYS4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhlIHNjaGVtYSBvciBpdCdzIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gaW5saW5lWFNEIFRydWUgaWYgYW4gaW5saW5lIHNjaGVtYSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgQW4gZW50aXR5IHJlc29sdmVyIHRvIHVzZS4KLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hIGJlaW5nIHZhbGlkYXRlZC4KLSAgICogQHBhcmFtIGlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyIEFuIGlubGluZSBzY2hlbWEgZW50aXR5IHJlc29sdmVyLgotICAgKiBAcGFyYW0gZ3JhbW1hclBvb2wgQSBYZXJjZXMgWE1MR3JhbW1hclBvb2wgdGhhdCBob2xkcyBwcmVjYWNoZWQgc2NoZW1hcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWFNEKFN0cmluZyBzY2hlbWEsIGJvb2xlYW4gaW5saW5lWFNELCBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgWE1MRW50aXR5UmVzb2x2ZXIgaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIsIFhNTEdyYW1tYXJQb29sIGdyYW1tYXJQb29sKQotICB7Ci0JVmFsaWRhdGVFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IFZhbGlkYXRlRXJyb3JIYW5kbGVyKCk7Ci0JLy9lcnJvckhhbmRsZXIuZ2V0RXJyb3JNZXNzYWdlcygpLmNsZWFyKCk7Ci0JdHJ5Ci0JewotCSAgWE1MR3JhbW1hclByZXBhcnNlciBncmFtbWFyUHJlcGFyc2VyID0gbmV3IFhNTEdyYW1tYXJQcmVwYXJzZXIoKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIucmVnaXN0ZXJQcmVwYXJzZXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEsbnVsbC8qc2NoZW1hTG9hZGVyKi8pOwotCQkKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkNPTlRJTlVFX0FGVEVSX0ZBVEFMX0VSUk9SX0ZFQVRVUkUsIGZhbHNlKTsKLSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLk5BTUVTUEFDRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5OQU1FU1BBQ0VfUFJFRklYRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5WQUxJREFUSU9OX0ZFQVRVUkUsIHRydWUpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuU0NIRU1BX1ZBTElEQVRJT05fRkVBVFVSRSwgdHJ1ZSk7Ci0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5TQ0hFTUFfRlVMTF9DSEVDS0lORywgZmFsc2UpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuRVhURVJOQUxfR0VORVJBTF9FTlRJVElFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkVYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVElFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLldBUk5fT05fRFVQTElDQVRFX0FUVERFRl9GRUFUVVJFLCB0cnVlKTsKLQkgICAgICAKLQkgIHRyeQotCSAgewotCQlncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TX0ZFQVRVUkVfSUQsIHRydWUpOwotCSAgfQotCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgewotCSAgICAvLyBDYXRjaCB0aGUgZXhjZXB0aW9uIGFuZCBpZ25vcmUgaWYgd2UgY2FuJ3Qgc2V0IHRoaXMgZmVhdHVyZS4KLQkgIH0KLQotCSAgLy8gY3MgOiB0b2dnbGUgdGhlIGNvbW1lbnRzIG9uIHRoZXNlIDIgbGluZXMgdG8gZWFzaWx5IGRpc2FibGUgY2FjaGluZwotICAgICAgLy8gZ3JhbW1hclByZXBhcnNlci5zZXRHcmFtbWFyUG9vbChuZXcgWE1MR3JhbW1hclBvb2xJbXBsKCkpOyAJCQotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRHcmFtbWFyUG9vbChncmFtbWFyUG9vbCAhPSBudWxsID8gZ3JhbW1hclBvb2wgOiBuZXcgWE1MR3JhbW1hclBvb2xJbXBsKCkpOyAKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7Ci0JICBpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKLQkgIHsKLQkgICAgZ3JhbW1hclByZXBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihlbnRpdHlSZXNvbHZlcik7Ci0JICB9Ci0KLQkgIHRyeQotCSAgewotCSAgICBYTUxJbnB1dFNvdXJjZSBpcyA9IG51bGw7Ci0JICAgIExpc3Qgb2xkR3JhbW1hcnMgPSBudWxsOwotCSAgICBYTUxHcmFtbWFyUG9vbEltcGwgcG9vbCA9IG51bGw7Ci0JICAgIC8vIFRoaXMgYWxsb3dzIHN1cHBvcnQgZm9yIHRoZSBpbmxpbmUgc2NoZW1hIGluIFdTREwgZG9jdW1lbnRzLgotCSAgICBpZiAoaW5saW5lWFNEKQotCSAgICB7ICAgICAgIAotCSAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYSk7Ci0JCSAgaXMgPSBuZXcgWE1MSW5wdXRTb3VyY2UobnVsbCxmaWxlbG9jYXRpb24sZmlsZWxvY2F0aW9uLHJlYWRlcixudWxsKTsKLQkJCQkKLQkJICAoKElubGluZVhTRFJlc29sdmVyKWlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyKS5hZGRSZWZlcnJpbmdTY2hlbWEoaXMsdGFyZ2V0TmFtZXNwYWNlKTsKLQkJICAvLyBJbiB0aGUgY2FzZSB0aGF0ICdzaGFyZWQnIGdyYW1tYXIgcG9vbCBpcyB1c2VkIHdlIG5lZWQgdG8gY29uc2lkZXIKLQkJICAvLyB0aGF0IHdlIG1pZ2h0IGhhdmUgYWxyZWFkeSBhZGRlZCBhIHNjaGVtYSB0byB0aGUgcG9vbCB3aXRoIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UKLQkJICAvLyBhcyB0aGUgaW5saW5lIHNjaGVtYSB3ZSdyZSBob3BpbmcgdG8gY29uc3RydWN0LiAgSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gcmVtb3ZlCi0JCSAgLy8gdGhlIHNjaGVtYSBmcm9tIHRoZSBwb29sIGJlZm9yZSBjb25zdHJ1Y3Rpbmcgb3VyIGlubGluZSBzY2hlbWEuICBXZSBjYW4gYWRkIGl0IAotCQkgIC8vIGJhY2sgd2hlbiB3ZSdyZSBhbGwgZG9uZS4KLQkJICBwb29sID0gKFhNTEdyYW1tYXJQb29sSW1wbClncmFtbWFyUHJlcGFyc2VyLmdldEdyYW1tYXJQb29sKCk7ICAgICAgICAJICAgICAgCi0JCSAgb2xkR3JhbW1hcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgc2NoZW1hIG5hbWVzcGFjZSBpZiBpdCBpcyBsaXN0ZWQgZGlyZWN0bHkKLQkJICAvLyBpbiB0aGUgcG9vbC4gSWYgaXQgaXMgaW5kaXJlY3RseSBsaXN0ZWQgYXMgYW4gaW1wb3J0IG9mIGEgZ3JhbW1hciBsaXN0ZWQKLQkJICAvLyBkaXJlY3RseSBpbiB0aGUgcG9vbCBoaWRlIHRoZSBncmFtbWFyIHRvIGNvbnRpbnVlIHRvIGdldCBjYWNoaW5nIGJlbmVmaXRzCi0JCSAgLy8gZnJvbSB0aGUgY2FjaGVkIGdyYW1tYXIuCi0JCSAgR3JhbW1hcltdIGdyYW1tYXJzID0gcG9vbC5yZXRyaWV2ZUluaXRpYWxHcmFtbWFyU2V0KFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BKTsKLQkJICBpbnQgbnVtR3JhbW1hcnMgPSBncmFtbWFycy5sZW5ndGg7Ci0JCSAgZm9yKGludCBpID0gMDsgaSA8IG51bUdyYW1tYXJzOyBpKyspCi0JCSAgewotCQkgICAgWE1MR3JhbW1hckRlc2NyaXB0aW9uIGRlc2MgPSBncmFtbWFyc1tpXS5nZXRHcmFtbWFyRGVzY3JpcHRpb24oKTsKLQkJICAgIGlmKHRhcmdldE5hbWVzcGFjZS5lcXVhbHMoZGVzYy5nZXROYW1lc3BhY2UoKSkpCi0JCSAgICB7Ci0JCSAgICAgIG9sZEdyYW1tYXJzLmFkZChwb29sLnJlbW92ZUdyYW1tYXIoZGVzYykpOwotCQkgICAgfQotCQkgICAgZWxzZQotCQkgICAgewotCQkgICAgICBpZihncmFtbWFyc1tpXSBpbnN0YW5jZW9mIFhTR3JhbW1hcikKLQkJICAgICAgewotCQkgICAgCVhTR3JhbW1hciBncmFtbWFyID0gKFhTR3JhbW1hcilncmFtbWFyc1tpXTsKLQkJICAgIAkgIAkgIAotCQkgICAgCVN0cmluZ0xpc3QgbmFtZXNwYWNlcyA9IGdyYW1tYXIudG9YU01vZGVsKCkuZ2V0TmFtZXNwYWNlcygpOwotCQkgICAgCWlmKG5hbWVzcGFjZXMuY29udGFpbnModGFyZ2V0TmFtZXNwYWNlKSkKLQkJICAgIAl7Ci0JCSAgICAJICBvbGRHcmFtbWFycy5hZGQocG9vbC5yZW1vdmVHcmFtbWFyKGRlc2MpKTsKLQkJICAgIAkgIAkgICAgLy9wb29sLnB1dEdyYW1tYXIobmV3IFhTR3JhbW1hckhpZGVyKGdyYW1tYXIsIHRhcmdldE5hbWVzcGFjZSkpOwotCQkgICAgCX0KLQkJICAgICAgfQotCQkgICAgfQotCQkgIH0KLQkJICAgIAkKLQkJICBTZXQgaW5saW5lTlNzID0gKChJbmxpbmVYU0RSZXNvbHZlcilpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikuZ2V0SW5saW5lU2NoZW1hTlNzKCk7Ci0JCSAgSXRlcmF0b3IgbnNpdGVyID0gaW5saW5lTlNzLml0ZXJhdG9yKCk7Ci0JCSAgd2hpbGUobnNpdGVyLmhhc05leHQoKSkKLQkJICB7Ci0JCSAgICBYU0REZXNjcmlwdGlvbiBkZXNjID0gbmV3IFhTRERlc2NyaXB0aW9uKCk7Ci0JCSAgICBkZXNjLnNldE5hbWVzcGFjZSgoU3RyaW5nKW5zaXRlci5uZXh0KCkpOyAgICAgIAotCQkgICAgR3JhbW1hciBvbGRHcmFtbWFyID0gcG9vbC5yZW1vdmVHcmFtbWFyKGRlc2MpOwotCQkgICAgaWYob2xkR3JhbW1hciAhPSBudWxsKQotCQkgICAgICBvbGRHcmFtbWFycy5hZGQob2xkR3JhbW1hcik7Ci0JCSAgfQotCi0JICAgIH0KLQkgICAgLy8gZ2V0IHRoZSBpbnB1dCBzb3VyY2UgZm9yIGFuIGV4dGVybmFsIHNjaGVtYSBmaWxlCi0JICAgIGVsc2UKLQkgICAgewotCSAgICAgIGlzID0gbmV3IFhNTElucHV0U291cmNlKG51bGwsc2NoZW1hLHNjaGVtYSk7Ci0JICAgIH0KLQotCSAgICBYU0dyYW1tYXIgZ3JhbW1hciA9IChYU0dyYW1tYXIpZ3JhbW1hclByZXBhcnNlci5wcmVwYXJzZUdyYW1tYXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEsaXMpOwotCSAgICB4c01vZGVsID0gZ3JhbW1hci50b1hTTW9kZWwoKTsKLQkJCQotCSAgICAvLyBIZXJlIHdlIGFkZCB0aGUgdGVtcG9yaWxpeSByZW1vdmVkIHNjaGVtYSBiYWNrLgotCQlpZiAoaW5saW5lWFNEICYmIG9sZEdyYW1tYXJzICE9IG51bGwpCi0JCXsKLQkJICBYU0REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ldyBYU0REZXNjcmlwdGlvbigpOwotCQkgIGRlc2NyaXB0aW9uLnNldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOyAKLQkJICBwb29sLnJlbW92ZUdyYW1tYXIoZGVzY3JpcHRpb24pOwotCQkJCQotCQkgIFNldCBpbmxpbmVOU3MgPSAoKElubGluZVhTRFJlc29sdmVyKWlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyKS5nZXRJbmxpbmVTY2hlbWFOU3MoKTsKLQkJICBJdGVyYXRvciBuc2l0ZXIgPSBpbmxpbmVOU3MuaXRlcmF0b3IoKTsKLQkJICB3aGlsZShuc2l0ZXIuaGFzTmV4dCgpKQotCQkgIHsKLQkJCVhTRERlc2NyaXB0aW9uIGRlc2MgPSBuZXcgWFNERGVzY3JpcHRpb24oKTsKLQkJICAgIGRlc2Muc2V0TmFtZXNwYWNlKChTdHJpbmcpbnNpdGVyLm5leHQoKSk7ICAgCi0JCSAgICBwb29sLnJlbW92ZUdyYW1tYXIoZGVzYyk7Ci0JCSAgfQotCQkgIAotCQkgIEl0ZXJhdG9yIG9sZEdJdGVyID0gb2xkR3JhbW1hcnMuaXRlcmF0b3IoKTsKLQkgICAgICB3aGlsZShvbGRHSXRlci5oYXNOZXh0KCkpCi0JCSAgewotCQkJIEdyYW1tYXIgb2xkR3JhbW1hciA9IChHcmFtbWFyKW9sZEdJdGVyLm5leHQoKTsKLQkJCSBpZihvbGRHcmFtbWFyICE9IG51bGwpCi0JCQkgICBwb29sLnB1dEdyYW1tYXIob2xkR3JhbW1hcik7Ci0JCSAgfQotCQl9ICAKLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsKLQkgICAgICAgIC8vIFBhcnNlciB3aWxsIHJldHVybiBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyBzdHJ1Y3R1cmFsbHkgaW52YWxpZC4KLQkgICAgICAJLy8gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSBpZ25vcmUgdGhlIGVycm9yLgotCSAgICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkgIH0KLQkgIGVycm9ycyA9IGVycm9ySGFuZGxlci5nZXRFcnJvck1lc3NhZ2VzKCk7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkKLQl7Ci0JICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JfQotCWlmIChlcnJvcnMuaXNFbXB0eSgpKQotCXsKLQkgIGlzVmFsaWRYU0QgPSB0cnVlOwotCX0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBYU01vZGVsIGNyZWF0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYU01vZGVsIGNyZWF0ZWQuCi0gICAqLwotCi0gIHB1YmxpYyBYU01vZGVsIGdldFhTTW9kZWwoKQotICB7Ci0gIAlyZXR1cm4geHNNb2RlbDsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzY2hlbWEgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2NoZW1hIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiBpc1ZhbGlkWFNEOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZXJyb3IgbGlzdC4KLSAgICogCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIGVycm9yIGZyb20gdGhlIHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0Fic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0Fic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Y2I1MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9BYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGdlbmVyYXRpbmcgb2JqZWN0cyBuZWVkZWQgZm9yIFhNTCBDb25mb3JtYW5jZSB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3RvcnkKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBpbnN0YW5jZTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGlzIGZhY3RvcnkuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIGZhY3RvcnkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3RvcnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIGZhY3RvcnkgdG8gdXNlLgotICAgKiAKLSAgICogQHBhcmFtIGZhY3RvcnkgLSB0aGUgaW1wbGVtZW50YXRpb24gdGhpcyBmYWN0b3J5IHdpbGwgdXNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb24oQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3RvcnkgZmFjdG9yeSkKLSAgewotICAgIGluc3RhbmNlID0gZmFjdG9yeTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybiBhbiBYTUwgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHJldHVybiBhbiBYTUwgdmFsaWRhdG9yCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgSVhNTFZhbGlkYXRvciBnZXRYTUxWYWxpZGF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9EZWZhdWx0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGUxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9EZWZhdWx0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRYTUxDb25mb3JtYW5jZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeQotewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBEZWZhdWx0WE1MQ29uZm9ybWFuY2VGYWN0b3J5KCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3RvcnkjZ2V0WE1MVmFsaWRhdG9yKCkKLSAgICovCi0gIHB1YmxpYyBJWE1MVmFsaWRhdG9yIGdldFhNTFZhbGlkYXRvcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IERlZmF1bHRYTUxWYWxpZGF0b3IoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjUzMzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uTWVzc2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLklMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5sb2dnaW5nLkxvZ2dlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x1dGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZC5YU0RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSVhNTFZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRYTUxWYWxpZGF0b3IgaW1wbGVtZW50cyBJWE1MVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpOwotICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIC8vcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBzY2hlbWFMb2NhdGlvblN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgcHJvdGVjdGVkIExpc3QgaWdub3JlZE5hbWVzcGFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAotICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RXJyb3JLZXkgPSBudWxsOwotICBwcm90ZWN0ZWQgT2JqZWN0W10gY3VycmVudE1lc3NhZ2VBcmd1bWVudHMgPSBudWxsOwotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGlsZE9mRG9jID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBYTUxHcmFtbWFyUG9vbCBncmFtbWFyUG9vbCA9IG51bGw7IAotICAKLSAgLyoqCi0gICAqIEEgc3RhY2sgb2Ygc3RhcnQgdGFnIGxvY2F0aW9ucywgdXNlZCB0byBtb3ZlIGVycm9ycwotICAgKiByZXBvcnRlZCBhdCB0aGUgY2xvc2UgdGFnIHRvIGJlIHJlcG9ydGVkIGF0IHRoZSBzdGFydCB0YWcuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RhY2sgc3RhcnRFbGVtZW50TG9jYXRpb25zID0gbmV3IFN0YWNrKCk7Ci0gIHByb3RlY3RlZCBTZXQgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldCA9IG5ldyBUcmVlU2V0KCk7Ci0KLS8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBEZWZhdWx0WE1MVmFsaWRhdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgCi0gICAgaWdub3JlZE5hbWVzcGFjZUxpc3QuYWRkKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpOwotICAgIGlnbm9yZWROYW1lc3BhY2VMaXN0LmFkZChDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKTsKLSAgICBpZ25vcmVkTmFtZXNwYWNlTGlzdC5hZGQoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSk7Ci0gICAgCi0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoImN2Yy1jb21wbGV4LXR5cGUuMi40LmIiKTsKLSAgICBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmFkZCgiY3ZjLWNvbXBsZXgtdHlwZS4yLjMiKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5JWE1MVmFsaWRhdG9yI3NldEZpbGUoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIHVyaSkKLSAgewotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvciNzZXRVUklSZXNvbHZlcihvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgCXRoaXMudXJpUmVzb2x2ZXIgPSB1cmlSZXNvbHZlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBncmFtbWFyUG9vbAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R3JhbW1hclBvb2woWE1MR3JhbW1hclBvb2wgZ3JhbW1hclBvb2wpCi0gIHsKLQl0aGlzLmdyYW1tYXJQb29sID0gZ3JhbW1hclBvb2w7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvciNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIC8vIFZhbGlkYXRlIHRoZSBYTUwgZmlsZS4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZWFkZXIgcmVhZGVyMSA9IG51bGw7IC8vIFVzZWQgZm9yIHZhbGlkYXRpb24gcGFyc2UuCi0gICAgICAKLSAgICAgIElucHV0U291cmNlIHZhbGlkYXRlSW5wdXRTb3VyY2U7IAotICAgICAKLSAgICAgIHZhbGlkYXRlSW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgIGlmICh0aGlzLmlucHV0U3RyZWFtICE9IG51bGwpCi0gICAgICB7ICAgIAotICAgICAgICBTdHJpbmcgc3RyaW5nID0gY3JlYXRlU3RyaW5nRm9ySW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgICByZWFkZXIxID0gbmV3IFN0cmluZ1JlYWRlcihzdHJpbmcpOwotICAgICAgICAgIAotICAgICAgICB2YWxpZGF0ZUlucHV0U291cmNlLnNldEJ5dGVTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgICB2YWxpZGF0ZUlucHV0U291cmNlLnNldENoYXJhY3RlclN0cmVhbShyZWFkZXIxKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IGNyZWF0ZVhNTFJlYWRlcigpOwotICAgICAgcmVhZGVyLnBhcnNlKHZhbGlkYXRlSW5wdXRTb3VyY2UpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBObyBuZWVkIHRvIGFkZCBhbiBlcnJvciBoZXJlLiBTQVhQYXJzZUV4Y2VwdGlvbnMgYXJlIHJlcG9ydGVkIGJ5IHRoZSBlcnJvciByZXBvcnRlci4KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gTm8gbmVlZCB0byBsb2cgdGhpcyBlcnJvci4gVGhlIFdTREwgdmFsaWRhdG9yIHdpbGwgY2F0Y2ggdGhpcyBlcnJvciB3aGVuIGNyZWF0aW5nIHRoZSBkb20gbW9kZWwuCi0gICAgICAvL0xvZ2dlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2coIlRoZSBXU0RMIHZhbGlkYXRvciB3YXMgdW5hYmxlIHRvIHJlYWQgZmlsZSAiICsgdXJpICsgIi4iLCBJTG9nZ2VyLlNFVl9FUlJPUiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9nZ2VyKCkubG9nKCJBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcGVyZm9ybWluZyBXU0RMIFhNTCBjb25mb3JtYW5jZSB2YWxpZGF0aW9uIGZvciBmaWxlICIgKyB1cmkgKyAiLiIsIElMb2dnZXIuU0VWX0VSUk9SLCBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLSAgICogQHJldHVybgotICAgKi8KLSAgZmluYWwgU3RyaW5nIGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgLy8gSGVyZSB3ZSBhcmUgcmVhZGluZyB0aGUgZmlsZSBhbmQgc3RvcmluZyB0byBhIHN0cmluZ2J1ZmZlci4KLSAgICBTdHJpbmdCdWZmZXIgZmlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbVJlYWRlciBpbnB1dFJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0gICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaW5wdXRSZWFkZXIpOwotICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMTAyNF07Ci0gICAgICBpbnQgbnVtYmVyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLSAgICAgIHdoaWxlIChudW1iZXJSZWFkICE9IC0xKQotICAgICAgewotICAgICAgICBmaWxlU3RyaW5nLmFwcGVuZChjaGFycywgMCwgbnVtYmVyUmVhZCk7Ci0gICAgICAgIG51bWJlclJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9nZ2VyKCkubG9nKCJUaGUgV1NETCB2YWxkaWF0b3Igd2FzIHVuYWJsZSB0byBjcmVhdGUgdG8gY3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGlucHV0IHN0cmVhbS4gV1NETCBYTUwgdmFsaWRhdGlvbiBtYXkgbm90IGhhdmUgcnVuIGNvcnJlY3RseS4iLCBJTG9nZ2VyLlNFVl9FUlJPUiwgZSk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlU3RyaW5nLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvciNoYXNFcnJvcnMoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkKLSAgewotICAgIHJldHVybiAhZXJyb3JzLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5JWE1MVmFsaWRhdG9yI2dldEVycm9ycygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRFcnJvcnMoKQotICB7Ci0gICAgcmV0dXJuIGVycm9yczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqIEBwYXJhbSBsaW5lCi0gICAqIEBwYXJhbSBjb2x1bW4KLSAgICogQHBhcmFtIHVyaQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0JLy8gRm9yIHRoZSBmb2xsb3dpbmcgZXJyb3JzIHRoZSBsaW5lIG51bWJlciB3aWxsIGJlIG1vZGlmaWVkIHRvIHVzZSB0aGF0IG9mIHRoZSBzdGFydAotICAJLy8gdGFnIGluc3RlYWQgb2YgdGhlIGVuZCB0YWcuCi0gIAlpZiAoY3VycmVudEVycm9yS2V5ICE9IG51bGwgJiYgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5jb250YWlucyhjdXJyZW50RXJyb3JLZXkpKSAgCi0gIAl7Ci0gIAkgIExvY2F0aW9uQ29vcmRpbmF0ZSBhZGp1c3RlZENvb3JkaW5hdGVzID0gKExvY2F0aW9uQ29vcmRpbmF0ZSlzdGFydEVsZW1lbnRMb2NhdGlvbnMucGVlaygpOwotICAJICBsaW5lID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRMaW5lTnVtYmVyKCk7Ci0gIAkgIGNvbHVtbiA9IGFkanVzdGVkQ29vcmRpbmF0ZXMuZ2V0Q29sdW1uTnVtbmVyKCk7Ci0gIAl9Ci0gIAkKLQllcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uTWVzc2FnZUltcGwobWVzc2FnZSwgbGluZSwgY29sdW1uLCBWYWxpZGF0aW9uTWVzc2FnZUltcGwuU0VWX1dBUk5JTkcsIHVyaSwgY3VycmVudEVycm9yS2V5LCBjdXJyZW50TWVzc2FnZUFyZ3VtZW50cykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBoYW5kbGVyIGZvciB0aGUgU0FYIHBhcnNlci4gVGhpcyBoYW5kbGVyIHdpbGwgb2J0YWluIHRoZSBXU0RMCi0gICAqIG5hbWVzcGFjZSwgaGFuZGxlIGVycm9ycyBhbmQgcmVzb2x2ZSBlbnRpdGllcy4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxDb25mb3JtYW5jZURlZmF1bHRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotCXByaXZhdGUgTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLQkKLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSAKLSAgICB7Ci0JCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0JCXN1cGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKLQl9Ci0KLQkvKioKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICBTdHJpbmcgdGVtcFVSSSA9IGFyZzAuZ2V0U3lzdGVtSWQoKTsKLSAgICAgaWYgKGlucHV0U3RyZWFtIT0gbnVsbCAmJiBhcmcwLmdldFN5c3RlbUlkKCkgPT0gbnVsbCkKLSAgICAgewotICAgICAgIC8vbWg6IEluIHRoaXMgY2FzZSB3ZSBhcmUgdmFsaWRhdGluZyBhIHN0cmVhbSBzbyB0aGUgVVJJIG1heSBiZSBudWxsIGluIHRoaXMgZXhjZXB0aW9uCi0gICAgICAgdGVtcFVSSSA9IHVyaTsgICAgICAgCi0gICAgIH0KLSAgICAgYWRkRXJyb3IoYXJnMC5nZXRNZXNzYWdlKCksIGFyZzAuZ2V0TGluZU51bWJlcigpLCBhcmcwLmdldENvbHVtbk51bWJlcigpLCB0ZW1wVVJJKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGFkZEVycm9yKGFyZzAuZ2V0TWVzc2FnZSgpLCBhcmcwLmdldExpbmVOdW1iZXIoKSwgYXJnMC5nZXRDb2x1bW5OdW1iZXIoKSwgYXJnMC5nZXRTeXN0ZW1JZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGFkZEVycm9yKGFyZzAuZ2V0TWVzc2FnZSgpLCBhcmcwLmdldExpbmVOdW1iZXIoKSwgYXJnMC5nZXRDb2x1bW5OdW1iZXIoKSwgYXJnMC5nZXRTeXN0ZW1JZCgpKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYobG9jYWxOYW1lLmVxdWFscygiZG9jdW1lbnRhdGlvbiIpICYmICh1cmkuZXF1YWxzKENvbnN0YW50cy5OU19VUklfV1NETCkgfHwgdXJpLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxKXx8IHVyaS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSkgfHwgdXJpLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKSkpCi0JCXsKLQkJICBpc0NoaWxkT2ZEb2MgPSBmYWxzZTsKLQkJfQotCQlzdXBlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSk7Ci0JCXN0YXJ0RWxlbWVudExvY2F0aW9ucy5wb3AoKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLAotCQkJQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnRFbGVtZW50TG9jYXRpb25zLnB1c2gobmV3IExvY2F0aW9uQ29vcmRpbmF0ZShsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCQlpZihsb2NhbE5hbWUuZXF1YWxzKCJkb2N1bWVudGF0aW9uIikgJiYgKHVyaS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9XU0RMKSB8fCB1cmkuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEpfHwgdXJpLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCB1cmkuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKSkKLQkJewotCQkgIGlzQ2hpbGRPZkRvYyA9IHRydWU7Ci0JCX0KLQkJc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cyk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGlucHV0U3RyZWFtIC0gc2V0IHRoZSBpbnB1dFN0cmVhbSB0byB2YWxpZGF0ZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICAgIHRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGNsYXNzIFhNTFZhbGlkYXRvclBhcnNlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24KLSAgewotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRFREQ29uZmlndXJhdGlvbiNjcmVhdGVFcnJvclJlcG9ydGVyKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MRXJyb3JSZXBvcnRlciBjcmVhdGVFcnJvclJlcG9ydGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFhNTEVycm9yUmVwb3J0ZXIoKQotICAgICAgewotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFcnJvclJlcG9ydGVyI3JlcG9ydEVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgc2hvcnQpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMsCi0gICAgICAgICAgICBzaG9ydCBzZXZlcml0eSkgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgY3VycmVudEVycm9yS2V5ID0ga2V5OwotICAgICAgICAgIGN1cnJlbnRNZXNzYWdlQXJndW1lbnRzID0gYXJndW1lbnRzOwotICAgICAgICAgIHN1cGVyLnJlcG9ydEVycm9yKGRvbWFpbiwga2V5LCBhcmd1bWVudHMsIHNldmVyaXR5KTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gWE1MIFJlYWRlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgWE1MIHJlYWRlciBvciBudWxsIGlmIHVuc3VjY2Vzc2Z1bC4KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBYTUxSZWFkZXIgY3JlYXRlWE1MUmVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7ICAgICAKLSAgICBTQVhQYXJzZXIgcmVhZGVyID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZWFkZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIobmV3IFhNTFZhbGlkYXRvclBhcnNlckNvbmZpZ3VyYXRpb24oKSk7Ci0gICAgICAKLSAgICAgIFhNTENvbmZvcm1hbmNlRGVmYXVsdEhhbmRsZXIgY29uZm9ybWFuY2VEZWZhdWx0SGFuZGxlciA9IG5ldyBYTUxDb25mb3JtYW5jZURlZmF1bHRIYW5kbGVyKCk7Ci0gICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGNvbmZvcm1hbmNlRGVmYXVsdEhhbmRsZXIpOwotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGNvbmZvcm1hbmNlRGVmYXVsdEhhbmRsZXIpOwotICAgICAgCi0gICAgICAvLyBPbGRlciBYZXJjZXMgdmVyc2lvbnMgd2lsbCB0aHJvd24gYSBOUEUgaWYgYSBudWxsIGdyYW1tYXIgcG9vbCBpcyBzZXQuCi0gICAgICBpZihncmFtbWFyUG9vbCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZWFkZXIuc2V0UHJvcGVydHkob3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHMuWEVSQ0VTX1BST1BFUlRZX1BSRUZJWCArIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuQ29uc3RhbnRzLlhNTEdSQU1NQVJfUE9PTF9QUk9QRVJUWSwgZ3JhbW1hclBvb2wpOwotICAgICAgfQotICAgICAgcmVhZGVyLnNldFByb3BlcnR5KG9yZy5hcGFjaGUueGVyY2VzLmltcGwuQ29uc3RhbnRzLlhFUkNFU19QUk9QRVJUWV9QUkVGSVggKyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLkNvbnN0YW50cy5FTlRJVFlfUkVTT0xWRVJfUFJPUEVSVFksIG5ldyBNeUVudGl0eVJlc29sdmVyKHVyaVJlc29sdmVyKSk7Ci0gICAgICByZWFkZXIuc2V0RmVhdHVyZShvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLkNvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLkNvbnN0YW50cy5DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9GRUFUVVJFLCBmYWxzZSk7Ci0gICAgICByZWFkZXIuc2V0RmVhdHVyZShvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLkNvbnN0YW50cy5TQVhfRkVBVFVSRV9QUkVGSVggKyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLkNvbnN0YW50cy5OQU1FU1BBQ0VTX0ZFQVRVUkUsIHRydWUpOwotICAgICAgcmVhZGVyLnNldEZlYXR1cmUob3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHMuU0FYX0ZFQVRVUkVfUFJFRklYICsgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHMuTkFNRVNQQUNFX1BSRUZJWEVTX0ZFQVRVUkUsIHRydWUpOwotCSAgcmVhZGVyLnNldEZlYXR1cmUob3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHMuU0FYX0ZFQVRVUkVfUFJFRklYICsgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHMuVkFMSURBVElPTl9GRUFUVVJFLCB0cnVlKTsKLQkgIHJlYWRlci5zZXRGZWF0dXJlKG9yZy5hcGFjaGUueGVyY2VzLmltcGwuQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuQ29uc3RhbnRzLlNDSEVNQV9WQUxJREFUSU9OX0ZFQVRVUkUsIHRydWUpOwotICAgIH0gCi0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgeyAKLSAgICAgIExvZ2dlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2coIkVycm9yIGNyZWF0aW5nIFhNTCByZWFkZXIgZm9yIFdTREwgWE1MIGNvbmZvcm1hbmNlIHZhbGlkYXRpb24uIiwgSUxvZ2dlci5TRVZfRVJST1IsIGUpOwotICAgIH0KLSAgICByZXR1cm4gcmVhZGVyOwotICB9IAotICAKLSAgLyoqCi0gICAqIEEgY3VzdG9tIGVudGl0eSByZXNvbHZlciB0aGF0IHVzZXMgdGhlIFVSSSByZXNvbHZlciBzcGVjaWZpZWQgdG8gcmVzb2x2ZSBlbnRpdGllcy4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBNeUVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIgCi0gIHsKLSAgICBwcml2YXRlIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmlSZXNvbHZlciBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZSB3aXRoIHRoaXMgZW50aXR5IHJlc29sdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBNeUVudGl0eVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICAgIHsKLSAgICAgIHRoaXMudXJpUmVzb2x2ZXIgPSB1cmlSZXNvbHZlcjsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXIpCi0gICAgICovCi0gICAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJpZCkgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgZXhhbWluaW5nIGEgc3ViZWxlbWVudCBvZiB0aGUgCi0JICAvLyBXU0RMIG9yIHNjaGVtYSBkb2N1bWVudGF0aW9uIGVsZW1lbnQgd2UgZG9uJ3Qgd2FudCB0byByZXNvbHZlIGl0Ci0JICAvLyBhcyBhbnl0aGluZyBpcyBhbGxvd2VkIGFzIGEgY2hpbGQgb2YgZG9jdW1lbnRhdGlvbi4KLQkgIGlmKGlzQ2hpbGRPZkRvYykKLQkgIHsKLQkgICAgcmV0dXJuIG5ldyBYTUxJbnB1dFNvdXJjZShyaWQpOwotCSAgfQotCSAgCi0JICBib29sZWFuIG5zVXNlZCA9IGZhbHNlOwotCSAgCi0JICBTdHJpbmcgbnMgPSByaWQuZ2V0TmFtZXNwYWNlKCk7Ci0JICBpZihucyAhPSBudWxsICYmIGlnbm9yZWROYW1lc3BhY2VMaXN0LmNvbnRhaW5zKG5zKSkKLQkgIHsKLQkJcmV0dXJuIG5ldyBYTUxJbnB1dFNvdXJjZShyaWQpOwotCSAgfQotCSAgCi0JICBTdHJpbmcgc3lzdGVtSWQgPSByaWQuZ2V0TGl0ZXJhbFN5c3RlbUlkKCk7Ci0JICBpZihzeXN0ZW1JZCA9PSBudWxsKQotCSAgewotCQlzeXN0ZW1JZCA9IG5zOwotCQluc1VzZWQgPSB0cnVlOwotCSAgfQotCSAgU3RyaW5nIHB1YmxpY0lkID0gcmlkLmdldFB1YmxpY0lkKCk7Ci0gICAgICBpZihwdWJsaWNJZCA9PSBudWxsKQotICAgICAgewotICAgICAgICBwdWJsaWNJZCA9IHN5c3RlbUlkOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBYZXJjZXMgdGVuZHMgdG8gdHJ5IHRvIHJlc29sdmUgbG9jYXRpb25zIHdpdGggbm8gaW5mb3JtYXRpb24uCi0gICAgICAvLyBObyBuZWVkIHRvIGRvIGFueSBwcm9jZXNzaW5nIGlmIHdlIGhhdmUgbm8gaW5mb3JtYXRpb24uCi0gICAgICBpZihwdWJsaWNJZCAhPSBudWxsIHx8IHN5c3RlbUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElVUklSZXNvbHV0aW9uUmVzdWx0IHJlc3VsdCA9IHVyaVJlc29sdmVyLnJlc29sdmUoIiIsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSByZXN1bHQuZ2V0UGh5c2ljYWxMb2NhdGlvbigpOwotICAgICAgICBpZiAodXJpICE9IG51bGwgJiYgIXVyaS5lcXVhbHMoIiIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIG5hbWVzcGFjZSB3YXMgdXNlZCB0byByZXNvbHZlIHRoaXMgcmVmZXJlbmNlIGVuc3VyZSBhIHNjaGVtYQotICAgICAgICAgIC8vIGhhcyBiZWVuIHJldHVybmVkLiBOYW1lc3BhY2VzIHRlbmQgdG8gcG9pbnQgdG8gV2ViIHJlc291cmNlcyB0aGF0Ci0gICAgICAgICAgLy8gbWF5IG9yIG1heSBub3QgYmUgc2NoZW1hcy4KLSAgICAgICAgICBib29sZWFuIGNyZWF0ZUVudGl0eVJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgaWYobnNVc2VkKQotICAgICAgICAgIHsKLSAgICAgICAgCVhTRFZhbGlkYXRvciB4c2RWYWwgPSBuZXcgWFNEVmFsaWRhdG9yKCk7Ci0gICAgICAgIAl4c2RWYWwudmFsaWRhdGUodXJpLCB1cmlSZXNvbHZlciwgbnVsbCk7Ci0gICAgICAgIAlpZigheHNkVmFsLmlzVmFsaWQoKSkKLSAgICAgICAgCSAgY3JlYXRlRW50aXR5UmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmKGNyZWF0ZUVudGl0eVJlc3VsdCkKLSAgICAgICAgICB7Ci0JICAgICAgICB0cnkKLQkgICAgICAgIHsKLQkJICAgICAgVVJMIGVudGl0eVVSTCA9IG5ldyBVUkwodXJpKTsKLSAgICAgICAgICAgICAgWE1MSW5wdXRTb3VyY2UgaXMgPSBuZXcgWE1MSW5wdXRTb3VyY2UocmlkLmdldFB1YmxpY0lkKCksIHN5c3RlbUlkLCByZXN1bHQuZ2V0TG9naWNhbExvY2F0aW9uKCkpOwotCQkgICAgICBpcy5zZXRCeXRlU3RyZWFtKGVudGl0eVVSTC5vcGVuU3RyZWFtKCkpOwotICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpczsKLSAgICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0JICAgICAgICB7Ci0JCSAgICAgIC8vIE5vIG5lZWQgdG8gcmVwb3J0IHRoaXMgZXJyb3IuIFNpbXBseSBjb250aW51ZSBiZWxvdy4KLQkgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfSAgCi0gIAotICAvKiogCi0gICAqIEEgbGluZSBhbmQgY29sdW1uIG51bWJlciBjb29yZGluYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIExvY2F0aW9uQ29vcmRpbmF0ZQotICB7CQotCXByaXZhdGUgaW50IGxpbmVObyA9IC0xOwotICAgIHByaXZhdGUgaW50IGNvbHVtbk5vID0gLTE7Ci0gICAgCi0gICAgcHVibGljIExvY2F0aW9uQ29vcmRpbmF0ZShpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgICB7Ci0gICAgICB0aGlzLmxpbmVObyA9IGxpbmVOdW1iZXI7Ci0gICAgICB0aGlzLmNvbHVtbk5vID0gY29sdW1uTnVtYmVyOwotICAgIH0KLSAgICAJCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgICB7IAotICAgICAgcmV0dXJuIHRoaXMubGluZU5vOwotICAgIH0KLSAgICAJCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1uZXIoKQotICAgIHsgCi0gICAgICByZXR1cm4gdGhpcy5jb2x1bW5ObzsKLSAgICB9IAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0VsZW1lbnRMb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9FbGVtZW50TG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkOWEzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0VsZW1lbnRMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEhvbGRzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gZWxlbWVudCBpbiB0aGUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TG9jYXRpb24KLXsgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJsb2NhdGlvbiI7Ci0gIHByb3RlY3RlZCBpbnQgbGluZTsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW47Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIC0gdGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICogQHBhcmFtIGNvbHVtbiAtIHRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50TG9jYXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4pCi0gIHsKLSAgICB0aGlzLmxpbmUgPSBsaW5lOwotICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaW5lIG51bWJlciBmb3IgdGhpcyBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgZm9yIHRoaXMgZWxlbWVudAotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgewotICAJcmV0dXJuIGxpbmU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgZm9yIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgZm9yIHRoaXMgZWxlbWVudAotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gIAlyZXR1cm4gY29sdW1uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0lYTUxDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0lYTUxDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjQ1NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYW4gWE1MIGNhdGFsb2cuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTENhdGFsb2cKLXsKLQotICAvKioKLSAgICogQWRkIGEgcHVibGljIGlkIGFuZCBhIGxvY2F0aW9uIHRvIHRoZSBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIHB1YmxpY0lkIC0KLSAgICogICAgICAgICAgdGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50cnkKLSAgICogQHBhcmFtIHN5c3RlbUlkIC0KLSAgICogICAgICAgICAgdGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50cnkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEVudHJ5VG9DYXRhbG9nKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLQotICAvKioKLSAgICogUmVzb2x2ZSB0aGUgbG9jYXRpb24gb2YgYW4gZW50aXR5IGdpdmVuIHB1YmxpYyBhbmQgc3lzdGVtIGlkcy4KLSAgICogCi0gICAqIEBwYXJhbSBwdWJsaWNJZCAtCi0gICAqICAgICAgICAgIHRoZSBwdWJsaWMgaWQgb2YgdGhlIGVudGl0eSB0byBiZSByZXNvbHZlZAotICAgKiBAcGFyYW0gc3lzdGVtSWQgLQotICAgKiAgICAgICAgICB0aGUgc3lzdGVtIGlkIG9mIHRoZSBlbnRpdHkgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGVudGl0eQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlRW50aXR5TG9jYXRpb24oU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvSVhNTFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzAwMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhbiBYTUwgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFNldCB0aGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0gdGhlIHVyaSBvZiB0aGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdlcmUgdmFsaWRhdGlvbiBlcnJvcnMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3ZXJlIHZhbGlkYXRpb24gZXJyb3JzLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZXJyb3JzLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBlcnJvcnMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpOwotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgVVJJIHJlc29sdmVyIHRvIHVzZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlciBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvTGluZU51bWJlckRPTVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9MaW5lTnVtYmVyRE9NUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGUzNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9MaW5lTnVtYmVyRE9NUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuU3ltYm9sVGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBBIERPTSBwYXJzZXIgdGhhdCB3aWxsIHJlZ2lzdGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdpdGggdGhlIGVsZW1lbnRzIGluIHRoZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIExpbmVOdW1iZXJET01QYXJzZXIgZXh0ZW5kcyBET01QYXJzZXIKLXsKLSAgWE1MTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgTGluZU51bWJlckRPTVBhcnNlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHNldEZlYXR1cmUoREVGRVJfTk9ERV9FWFBBTlNJT04sIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0dWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gYXJnMCBUaGUgcGFyc2VyIGNvbmZpZ3VyYXRpb24uCi0gICAqLwotICBwdWJsaWMgTGluZU51bWJlckRPTVBhcnNlcihYTUxQYXJzZXJDb25maWd1cmF0aW9uIGFyZzApCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzZXRGZWF0dXJlKERFRkVSX05PREVfRVhQQU5TSU9OLCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBhcmcwIEEgc3ltYm9sIHRhYmxlIGZvciB0aGUgcGFyc2VyLgotICAgKi8KLSAgcHVibGljIExpbmVOdW1iZXJET01QYXJzZXIoU3ltYm9sVGFibGUgYXJnMCkKLSAgewotICAgIHN1cGVyKGFyZzApOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGFyZzAgQSBzeW1ib2wgdGFibGUgZm9yIHRoZSBwYXJzZXIuCi0gICAqIEBwYXJhbSBhcmcxIEEgZ3JhbW1hciBwb29sIGZvciB0aGUgcGFyc2VyLgotICAgKi8KLSAgcHVibGljIExpbmVOdW1iZXJET01QYXJzZXIoU3ltYm9sVGFibGUgYXJnMCwgWE1MR3JhbW1hclBvb2wgYXJnMSkKLSAgewotICAgIHN1cGVyKGFyZzAsIGFyZzEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTERvY3VtZW50SGFuZGxlciNzdGFydEVsZW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MQXR0cmlidXRlcywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoUU5hbWUgYXJnMCwgWE1MQXR0cmlidXRlcyBhcmcxLCBBdWdtZW50YXRpb25zIGFyZzIpIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIEVsZW1lbnQgZWxlbWVudDsKLSAgICAvLyBGb3IgZWxlbWVudHMgZnJvbSB0aGUgU2NoZW1hIG5hbWVzcGFjZSB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZW0KLSAgICAvLyB0aGUgd2F5IHRoZXkgd2VyZSBlbnRlcmVkLiBSZXZlcnQgdGhlIHZhbHVlcyB0byB0aGUgbm9uLW5vcm1hbGl6ZWQgdmFsdWVzLgotICAgIFN0cmluZyBucyA9IGFyZzAudXJpOwotICAgIGlmKG5zICE9IG51bGwgJiYgKG5zLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxKSB8fCBucy5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSkgfHwgbnMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKSkKLSAgICB7Ci0gICAgICBpbnQgbnVtYXR0cyA9IGFyZzEuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtYXR0czsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgbm9uTm9ybWFsaXplZFZhbHVlID0gYXJnMS5nZXROb25Ob3JtYWxpemVkVmFsdWUoaSk7Ci0gICAgICAgIGFyZzEuc2V0VmFsdWUoaSwgbm9uTm9ybWFsaXplZFZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuc3RhcnRFbGVtZW50KGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGVsZW1lbnQgPSAoRWxlbWVudClnZXRQcm9wZXJ0eShDVVJSRU5UX0VMRU1FTlRfTk9ERSk7Ci0gICAgICBFbGVtZW50SW1wbCBlbGVtZW50SW1wbCA9IChFbGVtZW50SW1wbCllbGVtZW50OwotICAgICAgLy8gU2V0dGluZyB0aGUgdXNlciBkYXRhIHdpdGggYW4gaWRlbnRpZmllciBzdWNoIGFzIEVsZW1lbnRMb2NhdGlvbi5LRVlfTkFNRQotICAgICAgLy8gbWF5IGJlIGEgbG9uZyB0ZXJtIGdvb2QgaWRlYS4gVGhlIHNldFVzZXJEYXRhIG1ldGhvZCB3aXRoIG5vIGlkIGlzIHVzZWQgCi0gICAgICAvLyB0byBzdXBwb3J0IEpWTXMgd2l0aCBhbHRlcm5hdGUgdmVyc2lvbnMgb2YgWGVyY2VzLgotICAgICAgZWxlbWVudEltcGwuc2V0VXNlckRhdGEobmV3IEVsZW1lbnRMb2NhdGlvbihsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSkpOwotICAgIH0KLSAgICAvLyBjYXRjaCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGFuZCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgY2FuJ3QgZ2V0IGVsZW1lbnQKLSAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MRG9jdW1lbnRIYW5kbGVyI3N0YXJ0RG9jdW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3IsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5OYW1lc3BhY2VDb250ZXh0LCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoWE1MTG9jYXRvciBhcmcwLCBTdHJpbmcgYXJnMSwgTmFtZXNwYWNlQ29udGV4dCBhcmcyLCBBdWdtZW50YXRpb25zIGFyZzMpCi0gICAgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgbG9jYXRvciA9IGFyZzA7Ci0gICAgc3VwZXIuc3RhcnREb2N1bWVudChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5ODg3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5qYXhwLlNBWFBhcnNlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogWE1MQ2F0YWxvZyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyLCBvYnRhaW4gYW5kIGRlbGV0ZSBhbiBpbnN0YW5jZQotICogb2YgYW4gWE1MIGNhdGFsb2cuIE1ldGhvZCBkZWZpbml0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIHRoZSBjYXRhbG9nIHRvIHNldCBhCi0gKiBsb2NhdGlvbiBpbiB0aGUgY2F0YWxvZyBhbmQgcmVzb2x2ZSBhbiBlbnRpdHkgZnJvbSB0aGUgY2F0YWxvZy4KLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2cgaW1wbGVtZW50cyBJWE1MQ2F0YWxvZwotewotICAvL3ByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfQ09OVElOVUVfQUZURVJfRkFUQUxfRVJST1IgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIjsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIjsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRVMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiOwotCi0gIC8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9WQUxJREFUSU9OID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLQotICAvL3ByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfVkFMSURBVElPTl9TQ0hFTUEgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIjsKLSAgCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6Ly8vIjsKLQotICBwcml2YXRlIHN0YXRpYyBJWE1MQ2F0YWxvZyBpbnN0YW5jZSA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHhtbGNhdGFsb2djbGFzcyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZXh0Y2xhc3NMb2FkZXIgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIElYTUxDYXRhbG9nIGV4dFhNTENhdGFsb2dJbnN0YW5jZSA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBzY2hlbWFkaXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIHByaXZhdGUgc3RhdGljIExpc3QgZW50aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIEEgaGFzaHRhYmxlIHRvIGhvbGQgdGhlIFhNTCBjYXRhbG9nIGVudHJpZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgTWFwIGNhdGFsb2cgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIGNhdGFsb2cuIEFzc2lnbnMgYWxsIHJlZ2lzdGVyZWQgc2NoZW1hcyB0bwotICAgKiB0aGUgWE1MIGNhdGFsb2cuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgWE1MIGNhdGFsb2cuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElYTUxDYXRhbG9nIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IFhNTENhdGFsb2coKTsKLQotICAgICAgLy8gQWRkIHRoZSByZWdpc3RlcmVkIGVudGl0aWVzIHRvIHRoZSBjYXRhbG9nLgotICAgICAgSXRlcmF0b3IgZW50aXR5SXRlciA9IGVudGl0aWVzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZW50aXR5SXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFhNTENhdGFsb2dFbnRpdHlIb2xkZXIgZW50aXR5ID0gKFhNTENhdGFsb2dFbnRpdHlIb2xkZXIpIGVudGl0eUl0ZXIubmV4dCgpOwotICAgICAgICBpbnN0YW5jZS5hZGRFbnRyeVRvQ2F0YWxvZyhlbnRpdHkuZ2V0UHVibGljSWQoKSwgZW50aXR5LmdldFN5c3RlbUlkKCkpOwotICAgICAgfQotCi0gICAgICAvLyBBZGQgdGhlIHNjaGVtYXMgaW4gdGhlIHNjaGVtYSBkaXJlY3RvcmllcyB0byB0aGUgY2F0YWxvZy4KLSAgICAgIGlmIChzY2hlbWFkaXJzLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyZmFjdG9yeSA9IG5ldyBTQVhQYXJzZXJGYWN0b3J5SW1wbCgpOwotICAgICAgICAgIHBhcnNlcmZhY3Rvcnkuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFX1BSRUZJWEVTLCB0cnVlKTsKLSAgICAgICAgICBwYXJzZXJmYWN0b3J5LnNldEZlYXR1cmUoX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgIHNheFBhcnNlciA9IHBhcnNlcmZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3Igc2NoZW1hZGlySXRlciA9IHNjaGVtYWRpcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgU2NoZW1hTmFtZXNwYWNlSGFuZGxlciBoYW5kbGVyID0gKChYTUxDYXRhbG9nKSBpbnN0YW5jZSkubmV3IFNjaGVtYU5hbWVzcGFjZUhhbmRsZXIoKTsKLSAgICAgICAgd2hpbGUgKHNjaGVtYWRpckl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYWRpciA9IChTdHJpbmcpIHNjaGVtYWRpckl0ZXIubmV4dCgpOwotICAgICAgICAgIHJlZ2lzdGVyU2NoZW1hc0ZvckRpcihpbnN0YW5jZSwgc2NoZW1hZGlyLCBzYXhQYXJzZXIsIGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgc2NoZW1hcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGFuZCBhbGwgc3ViZGlyZWN0b3JpZXMgd2l0aCB0aGUKLSAgICogWE1MIGNhdGFsb2cuCi0gICAqIAotICAgKiBAcGFyYW0gY2F0YWxvZwotICAgKiAgICAgICAgICBUaGUgY2F0YWxvZyB0byByZWdpc3RlciB0aGUgc2NoZW1hcyB3aXRoLgotICAgKiBAcGFyYW0gc2NoZW1hZGlyCi0gICAqICAgICAgICAgIFRoZSBzY2hlbWEgZGlyZWN0b3J5IHRvIHNlYXJjaCBmb3Igc2NoZW1hIGZpbGVzLgotICAgKiBAcGFyYW0gcGFyc2VyCi0gICAqICAgICAgICAgIFRoZSBTQVhQYXJzZXIgdG8gdXNlIHRvIHBhcnNlIHRoZSBzY2hlbWFzIGZvciB0aGVpcgotICAgKiAgICAgICAgICB0YXJnZXROYW1lc3BhY2UuCi0gICAqIEBwYXJhbSBoYW5kbGVyCi0gICAqICAgICAgICAgIFRoZSBoYW5kbGVyIHRvIHVzZSB0byBnZXQgdGhlIHRhcmdldE5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJTY2hlbWFzRm9yRGlyKElYTUxDYXRhbG9nIGNhdGFsb2csIFN0cmluZyBzY2hlbWFkaXIsIFNBWFBhcnNlciBwYXJzZXIsCi0gICAgICBTY2hlbWFOYW1lc3BhY2VIYW5kbGVyIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBSZW1vdmUgZmlsZTogYW5kIGZpbGU6LyBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIGxvY2F0aW9uIGlmIHRoZXkgYXJlIHByZXNlbnQuCi0gICAgaWYoc2NoZW1hZGlyLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0gICAgewotICAgICAgc2NoZW1hZGlyID0gc2NoZW1hZGlyLnN1YnN0cmluZyg1KTsKLSAgICB9Ci0gICAgd2hpbGUoc2NoZW1hZGlyLnN0YXJ0c1dpdGgoIi8vIikpCi0gICAgewotICAgICAgc2NoZW1hZGlyID0gc2NoZW1hZGlyLnN1YnN0cmluZygxKTsKLSAgICB9Ci0gICAgCi0gICAgRmlsZSBkaXIgPSBuZXcgRmlsZShzY2hlbWFkaXIpOwotICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkKLSAgICB7Ci0gICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0gICAgICBpbnQgbnVtZmlsZXMgPSBmaWxlcy5sZW5ndGg7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWZpbGVzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEZpbGUgdGVtcGZpbGUgPSBmaWxlc1tpXTsKLSAgICAgICAgU3RyaW5nIHRlbXBmaWxlcGF0aCA9IHRlbXBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB0ZW1wZmlsZXBhdGggPSB0ZW1wZmlsZXBhdGgucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgICAgIHdoaWxlKHRlbXBmaWxlcGF0aC5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgIHsKLSAgICAgICAgICB0ZW1wZmlsZXBhdGggPSB0ZW1wZmlsZXBhdGguc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHRlbXBmaWxlcGF0aCA9IEZJTEVfUFJPVE9DT0wgKyB0ZW1wZmlsZXBhdGg7Ci0gICAgICAgIGlmICh0ZW1wZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVnaXN0ZXJTY2hlbWFzRm9yRGlyKGNhdGFsb2csIHRlbXBmaWxlcGF0aCwgcGFyc2VyLCBoYW5kbGVyKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVyLnJlc2V0KCk7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHRlbXBmaWxlcGF0aCwgaGFuZGxlcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBsb2cgZXJyb3IuCi0gICAgICAgICAgfQotICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBoYW5kbGVyLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXRhbG9nLmFkZEVudHJ5VG9DYXRhbG9nKHRhcmdldE5hbWVzcGFjZSwgdGVtcGZpbGVwYXRoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uIFhNTCBjYXRhbG9nLiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBpZiBvbmUKLSAgICogaXMgcmVnaXN0ZXJlZCBhbmQgY2FuIGJlIGNyZWF0ZWQsIG51bGwgb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbiBYTUwgY2F0YWxvZyBpZiBvbmUgaXMgcmVnaXN0ZXJlZCwKLSAgICogICAgICAgICBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVhNTENhdGFsb2cgZ2V0RXh0ZW5zaW9uQ2F0YWxvZ0luc3RhbmNlKCkKLSAgewotICAgIGlmIChleHRYTUxDYXRhbG9nSW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXh0eG1sY2F0YWxvZ2NsYXNzICE9IG51bGwgJiYgZXh0Y2xhc3NMb2FkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzcyBjYXRhbG9nQ2xhc3MgPSBleHRjbGFzc0xvYWRlciAhPSBudWxsID8gZXh0Y2xhc3NMb2FkZXIubG9hZENsYXNzKGV4dHhtbGNhdGFsb2djbGFzcykgOiBDbGFzcwotICAgICAgICAgICAgICAuZm9yTmFtZShleHR4bWxjYXRhbG9nY2xhc3MpOwotICAgICAgICAgIGV4dFhNTENhdGFsb2dJbnN0YW5jZSA9IChJWE1MQ2F0YWxvZykgY2F0YWxvZ0NsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy9UT0RPOiBMb2cgZXJyb3IKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXh0WE1MQ2F0YWxvZ0luc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY2xhc3Mgb2YgdGhlIFhNTCBjYXRhbG9nIHRvIGJlIHVzZWQuCi0gICAqIAotICAgKiBAcGFyYW0geG1sY2F0YWxvZwotICAgKiAgICAgICAgICBUaGUgY2xhc3Mgb2YgdGhlIFhNTCBjYXRhbG9nIHRvIGJlIHVzZWQuCi0gICAqIEBwYXJhbSBjbGFzc2xvYWRlcgotICAgKiAgICAgICAgICBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGNhdGFsb2cuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXh0ZW5zaW9uWE1MQ2F0YWxvZyhTdHJpbmcgeG1sY2F0YWxvZywgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpCi0gIHsKLSAgICBleHR4bWxjYXRhbG9nY2xhc3MgPSB4bWxjYXRhbG9nOwotICAgIGV4dGNsYXNzTG9hZGVyID0gY2xhc3Nsb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBpbnN0YW5jZSBvZiB0aGUgWE1MIGNhdGFsb2cgdG8gbnVsbC4gRm9yIGRlbGV0aW5nIHRoZSBjYXRhbG9nIGlmCi0gICAqIG5lY2Vzc2FyeS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpCi0gIHsKLSAgICBpbnN0YW5jZSA9IG51bGw7Ci0gICAgZXh0eG1sY2F0YWxvZ2NsYXNzID0gbnVsbDsKLSAgICBleHRjbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgZXh0WE1MQ2F0YWxvZ0luc3RhbmNlID0gbnVsbDsKLSAgICBlbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBzY2hlbWFkaXJzID0gbmV3IEFycmF5TGlzdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSBkaXJlY3RvcnkgdG8gYmUgY2hlY2tlZCBmb3Igc2NoZW1hcyB0byByZWdpc3RlciBpbiB0aGUKLSAgICogY2F0YWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWFkaXIKLSAgICogICAgICAgICAgVGhlIGRpcmVjdG9yeSB0byBjaGVjayBmb3Igc2NoZW1hcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTY2hlbWFEaXIoU3RyaW5nIHNjaGVtYWRpcikKLSAgewotICAgIHNjaGVtYWRpcnMuYWRkKHNjaGVtYWRpcik7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGFuIGVudGl0eSB0byB0aGUgY2F0YWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSBlbnRpdHkKLSAgICogICAgICAgICAgVGhlIGVudGl0eSB0byBhZGQgdG8gdGhlIGNhdGFsb2cuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRW50aXR5KFhNTENhdGFsb2dFbnRpdHlIb2xkZXIgZW50aXR5KQotICB7Ci0gICAgZW50aXRpZXMuYWRkKGVudGl0eSk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuaW50ZXJuYWwueG1sLklYTUxDYXRhbG9nI2FkZEVudHJ5VG9DYXRhbG9nKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVudHJ5VG9DYXRhbG9nKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgY2F0YWxvZy5wdXQocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5pbnRlcm5hbC54bWwuSVhNTENhdGFsb2cjcmVzb2x2ZUVudGl0eUxvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZUVudGl0eUxvY2F0aW9uKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgU3RyaW5nIHJlc29sdmVkbG9jYXRpb24gPSBudWxsOwotICAgIC8vIEZpcnN0IHRyeSB0byByZXNvbHZlIHVzaW5nIHRoZSBleHQgY2F0YWxvZy4KLSAgICBJWE1MQ2F0YWxvZyBleHRjYXRhbG9nID0gZ2V0RXh0ZW5zaW9uQ2F0YWxvZ0luc3RhbmNlKCk7Ci0gICAgaWYgKGV4dGNhdGFsb2cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXNvbHZlZGxvY2F0aW9uID0gZXh0Y2F0YWxvZy5yZXNvbHZlRW50aXR5TG9jYXRpb24ocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICB9Ci0gICAgaWYgKHJlc29sdmVkbG9jYXRpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBpZiB0aGVyZSdzIG5vIHN5c3RlbSBpZCB1c2UgdGhlIHB1YmxpYyBpZAotICAgICAgaWYgKHN5c3RlbUlkID09IG51bGwgfHwgc3lzdGVtSWQuZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgc3lzdGVtSWQgPSBwdWJsaWNJZDsKLSAgICAgIH0KLSAgICAgIHJlc29sdmVkbG9jYXRpb24gPSAoU3RyaW5nKSBjYXRhbG9nLmdldChzeXN0ZW1JZCk7Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlZGxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgaGFuZGxlciB1c2VkIGluIHBhcnNpbmcgdG8gZ2V0IHRoZSB0YXJnZXROYW1lc3BhY2Ugc3RyaW5nIG9mIGEgc2NoZW1hLgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFNjaGVtYU5hbWVzcGFjZUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotICB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRSA9ICJ0YXJnZXROYW1lc3BhY2UiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0NIRU1BID0gInNjaGVtYSI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyBhcmcyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobG9jYWxuYW1lLmVxdWFscyhTQ0hFTUEpKQotICAgICAgewotCi0gICAgICAgIGludCBudW1BdHRzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BdHRzOyBpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgIFN0cmluZyBhdHRuYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKLSAgICAgICAgICBpZiAoYXR0bmFtZS5lcXVhbHMoVEFSR0VUX05BTUVTUEFDRSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxuYW1lLCBhcmcyLCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRhcmdldE5hbWVzcGFjZSBmb3VuZCBieSBwYXJzaW5nIHRoZSBmaWxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHRhcmdldE5hbWVzcGFjZSBmb3VuZCBieSBwYXJzaW5nIHRoZSBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgaGFuZGxlciBzbyBpdCBjYW4gYmUgcmV1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICB0YXJnZXROYW1lc3BhY2UgPSBudWxsOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ0VudGl0eUhvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nRW50aXR5SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlY2E2YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nRW50aXR5SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLS8qKgotICogQSBjb250YWluZXIgdG8gaG9sZCB0aGUgZW50aXR5IGluZm9ybWF0aW9uIHVudGlsIGFuIFhNTCBjYXRhbG9nIGlzCi0gKiB0byBiZSBpbml0aWFsaXplZC4KLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dFbnRpdHlIb2xkZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQ7Ci0gIHByaXZhdGUgU3RyaW5nIHN5c3RlbUlkOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBwdWJsaWMgaWQgb2YgdGhlIGVudGl0eS4KLSAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBzeXN0ZW0gaWQgb2YgdGhlIGVudGl0eS4KLSAgICovCi0gIHB1YmxpYyBYTUxDYXRhbG9nRW50aXR5SG9sZGVyKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotICAgIHRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50aXR5LgotICAgKiBAcmV0dXJuIFRoZSBwdWJsaWMgaWQgb2YgdGhlIGVudGl0eS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKQotICB7Ci0gICAgcmV0dXJuIHB1YmxpY0lkOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgc3lzdGVtIGlkIG9mIHRoZSBlbnRpdHkuCi0gICAqIEByZXR1cm4gVGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50aXR5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpCi0gIHsKLSAgICByZXR1cm4gc3lzdGVtSWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ1Jlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2dSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTg1MGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ1Jlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTGF6eVVSTElucHV0U3RyZWFtOwotCi0vKioKLSAqIEEgcmVzb2x2ZXIgdG8gcmVzb2x2ZXIgZW50aXRpZXMgZnJvbSB0aGUgWE1MIGNhdGFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nUmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIFhNTENhdGFsb2dSZXNvbHZlciB4bWxDYXRhbG9nOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBYTUxDYXRhbG9nUmVzb2x2ZXIoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGlzIHJlc29sdmVyLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZXNvbHZlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYTUxDYXRhbG9nUmVzb2x2ZXIgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKHhtbENhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB4bWxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2dSZXNvbHZlcigpOwotICAgIH0KLSAgICByZXR1cm4geG1sQ2F0YWxvZzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHVibGljSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0UHVibGljSWQoKTsKLSAgICBpZihwdWJsaWNJZCA9PSBudWxsKQotICAgIHsKLSAgICAgIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBTdHJpbmcgc3lzdGVtSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TGl0ZXJhbFN5c3RlbUlkKCk7Ci0gICAgU3RyaW5nIGxvY2F0aW9uID0gWE1MQ2F0YWxvZy5nZXRJbnN0YW5jZSgpLnJlc29sdmVFbnRpdHlMb2NhdGlvbihwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIExhenlVUkxJbnB1dFN0cmVhbSBpcyA9IG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0obG9jYXRpb24pOwotICAgICAgWE1MSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHN5c3RlbUlkLCBzeXN0ZW1JZCwgaXMsIG51bGwpOwotICAgICAgcmV0dXJuIGlucHV0U291cmNlOwotICAgIH0KLSAgICAvLyBvdGhlcndpc2UgcmV0dXJuIG51bGwgdG8gdGVsbCB0aGUgcGFyc2VyIHRvIGxvY2F0ZSB0aGUgc3lzdGVtSWQgYXMgYSBVUkkKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxNZXNzYWdlSW5mb0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxNZXNzYWdlSW5mb0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDNhYjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLXB1YmxpYyBjbGFzcyBYTUxNZXNzYWdlSW5mb0hlbHBlcgotewotICAKLSAgLy9zZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWNvbmNpbGUuRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQVRUUklCVVRFUyA9ICJBTExfQVRUUklCVVRFUyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0iQVRUUklCVVRFX05BTUUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSAiQVRUUklCVVRFX1ZBTFVFIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHID0gIlNUQVJUX1RBRyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAiVEVYVCI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQgPSAiRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVCI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRU5USVRZX1JFRkVSRU5DRSA9ICJURVhUX0VOVElUWV9SRUZFUkVOQ0UiOyAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUgPSAiVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUiOwotICAKLSAgCi0gIHB1YmxpYyBYTUxNZXNzYWdlSW5mb0hlbHBlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqICByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBzaG91bGQgYmUgdW5kZXJsaW5lZCB3aXRoIHRoZSByZWQgInNxdWlnZ2xlcyIKLSAgICogIHVzaW5nIHRoZSBlcnJvcktleSwgYW5kIHRoZSBtZXNzYWdlQXJndW1lbnRzCi0gICAqICA8YnI+UG9zaXRpb24gMCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgY29udGFpbnMgdGhlIHNlbGVjdGlvbiBTdHJhdGVneSxvciB3aGF0IERPTSBFbGVtZW50IHRvIHVuZGVybGluZS4gIAotICAgKiAgRm9yIGV4YW1wbGUgIkFUVFJJQlVURV9OQU1FIiAgCi0gICAqICA8YnI+UG9zaXRpb24gMSBjb250YWlucyB0aGUgbmFtZSBvciB2YWx1ZSB0byBzcXVpZ2dsZS4KLSAgICogIDxwPkZvciBleGFtcGxlLCBpZiB3ZSB3YW50ZWQgdG8gc3F1aWdnbGUgdGhlIGF0dHJpYnV0ZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBuYW1lCi0gICAqICBmb28gdGhpcyBtZXRob2Qgd291bGQgcmV0dXJuIHsiQVRUUklCVVRFX05BTUUiLCAiZm9vIn0KLSAgICogIDwvcD4KLSAgICogIEBwYXJhbSBlcnJvcktleSB0aGUgZXJyb3Iga2V5IGdpdmVuIGJ5IHRoZSBYZXJjZXMgcGFyc2VyCi0gICAqICBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyB0aGUgYXJndW1lbnRzIHVzZWQgYnkgWGVyY2VzIHRvICJmaWxsIGluIHRoZSBibGFua3MiIG9mIHRoZWlyIG1lc3NhZ2VzCi0gICAqICBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNxdWlnZ2xlIGluZm9ybWF0aW9uCi0gICAqICBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkucmVjb25jaWxlLkRlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3IKLSAgICogIAotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGNyZWF0ZU1lc3NhZ2VJbmZvKFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgeyAKLSAgICBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSBudWxsOwotICAgIFN0cmluZyBuYW1lT3JWYWx1ZSA9IG51bGw7Ci0KLSAgICAvL1hNTCBFcnJvcnMKLSAgICBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5hIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5kIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5iIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQ09OVEVOVF9JTlZBTElEIikKLSAgICAgICAgfCBlcnJvcktleS5lcXVhbHMoIk1TR19DT05URU5UX0lOQ09NUExFVEUiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19SRVFVSVJFRF9BVFRSSUJVVEVfTk9UX1NQRUNJRklFRCIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS40IikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSBTVEFSVF9UQUc7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLXR5cGUuMy4xLjMiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneSA9IFRFWFQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4yLjMiKSkKLSAgICB7Ci0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtdHlwZS4zLjEuMSIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gQUxMX0FUVFJJQlVURVM7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjIuMiIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9OT1RfREVDTEFSRUQiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneSA9IEFUVFJJQlVURV9OQU1FOwotCSAgLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVuZGVybGluZQotCSAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWF0dHJpYnV0ZS4zIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX1ZBTFVFX05PVF9JTl9MSVNUIikpCi0gICAgewkKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSBBVFRSSUJVVEVfVkFMVUU7ICAKLQkJLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgbmFtZSBvZiB0aGUgQXR0cmlidXRlCi0gICAgCWlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1hdHRyaWJ1dGUuMyIpKQotICAgIAl7IG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzFdOwotICAgIAl9Ci0gICAgCWVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9WQUxVRV9OT1RfSU5fTElTVCIpKQotICAgIAl7CW5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzBdOwotICAgIAl9Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWVsdC40LjIiKSkKLSAgICB7CXNlbGVjdGlvblN0cmF0ZWd5PVZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFOwotCQkvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdlIHdhbnQgdG8gdW5lcmxpbmUKLSAgICAJbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07CQotICAgIH0KLSAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVudGl0eU5vdERlY2xhcmVkIikpCi0gICAgeyAgCXNlbGVjdGlvblN0cmF0ZWd5PVRFWFRfRU5USVRZX1JFRkVSRU5DRTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLy9XU0RMIEVycm9ycwotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9PVVRQVVQiKSB8fAotICAgICAgICAgICAgICAgZXJyb3JLZXkuZXF1YWxzKCJfTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVUIikgfHwKLSAgICAgICAgICAgICAgIGVycm9yS2V5LmVxdWFscygiX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5PUFUVFJJQlVURV9WQUxVRTsKLSAgICAgIG5hbWVPclZhbHVlPSAibWVzc2FnZSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORyIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5PUFUVFJJQlVURV9WQUxVRTsKLSAgICAgIG5hbWVPclZhbHVlPSJ0eXBlIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJfT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneT1BVFRSSUJVVEVfVkFMVUU7Ci0gICAgICBuYW1lT3JWYWx1ZT0ibmFtZSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiX1BBUlRfSU5WQUxJRF9FTEVNRU5UIikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3k9QVRUUklCVVRFX1ZBTFVFOwotICAgICAgbmFtZU9yVmFsdWU9ImVsZW1lbnQiOwotICAgIH0KLSAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIl9OT19CSU5ESU5HX0ZPUl9QT1JUIikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3k9QVRUUklCVVRFX1ZBTFVFOwotICAgICAgbmFtZU9yVmFsdWU9ImJpbmRpbmciOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgbWVzc2FnZUluZm9bXSA9IG5ldyBTdHJpbmdbMl07Ci0gICAgbWVzc2FnZUluZm9bMF0gPSBzZWxlY3Rpb25TdHJhdGVneTsKLSAgICBtZXNzYWdlSW5mb1sxXSA9IG5hbWVPclZhbHVlOwotICAgIHJldHVybiBtZXNzYWdlSW5mbzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy92YWxpZGF0ZXdzZGwucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvdmFsaWRhdGV3c2RsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMWMxNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy92YWxpZGF0ZXdzZGwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotIS0tIEVycm9yIHdpdGggZG9jdW1lbnQgbG9jYXRpb24KLV9FUlJPUl9ET0NVTUVOVF9MT0NBVElPTiAgICAgICAgICAgICAgICAgICA9IFRoZSBXU0RMIGRvY3VtZW50IHswfSBjb3VsZCBub3QgYmUgcmVhZC4KLSEtLSBXYXJuaW5nIE1lc3NhZ2VzCi1fV0FSTl9OT19WQUxESUFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgPSBUaGVyZSBpcyBubyByZWdpc3RlcmVkIHZhbGlkYXRvciBmb3IgdGhlIG5hbWVzcGFjZSB7MH0uCi0KLV9FUlJPUl9QUk9CTEVNX1dTRExfVkFMSURBVE9SICAgICAgICAgICAgICA9IEEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIHRoZSBXU0RMIHZhbGlkYXRvciBmb3IgbmFtZXNwYWNlIHswfS4KLV9FUlJPUl9OT19XU0RMX1ZBTElEQVRPUiAgICAgICAgICAgICAgICAgICA9IFRoZSBuYW1lc3BhY2UgezB9IHNwZWNpZmllZCBpcyBub3QgYSB2YWxpZCBXU0RMIG5hbWVzcGFjZS4KLV9FUlJPUl9QUk9CTEVNX0VYVF9WQUxJREFUT1IgICAgICAgICAgICAgICA9IEEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIHRoZSBFeHRlbnNpb24gdmFsaWRhdG9yIHswfSBmb3IgbmFtZXNwYWNlIHsxfS4KLQotIS0tIFN0cmluZ3MgZm9yIFdTREwgMS4xIHZhbGlkYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotX1VOQUJMRV9UT19JTVBPUlRfQkFEX0xPQ0FUSU9OICAgICAgICAgICAgID0gVGhlIHswfSBkb2N1bWVudCBjb3VsZCBub3QgYmUgaW1wb3J0ZWQuIENoZWNrIHRoYXQgdGhlIGRvY3VtZW50IGV4aXN0cyBhbmQgdGhhdCB0aGUgbG9jYXRpb24gaXMgY29ycmVjdC4KLV9VTkFCTEVfVE9fSU1QT1JUX05PX0xPQ0FUSU9OICAgICAgICAgICAgICA9IFRoZSBsb2NhdGlvbiBhdHRyaWJ1dGUgaXMgZW1wdHkuIEEgbG9jYXRpb24gbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHRoZSBsb2NhdGlvbiBhdHRyaWJ1dGUuCi1fVU5BQkxFX1RPX0lNUE9SVF9JTlZBTElEICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGRvY3VtZW50IGNvdWxkIG5vdCBiZSBpbXBvcnRlZCBiZWNhdXNlIGl0IGlzIG5vdCB2YWxpZC4gVGhlIGRvY3VtZW50IG11c3QgYmUgY29ycmVjdGVkIGJlZm9yZSBpdCBjYW4gYmUgaW1wb3J0ZWQuCi1fTk9fQklORElOR19GT1JfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHBvcnQgaGFzIGFuIGludmFsaWQgYmluZGluZyAtIHsxfS4gQ2hlY2sgdGhhdCB0aGUgezF9IGJpbmRpbmcgaXMgZGVmaW5lZC4KLV9QT1JUVFlQRV9VTkRFRklORURfRk9SX0JJTkRJTkcgICAgICAgICAgICA9IFRoZSB7MH0gcG9ydCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHsxfSBiaW5kaW5nIGlzIHVuZGVmaW5lZC4gQ2hlY2sgdGhlIHswfSBwb3J0IHR5cGUgbmFtZSBhbmQgZW5zdXJlIGl0IGlzIGRlZmluZWQuCi1fT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUgICAgICAgICAgPSBUaGUgb3BlcmF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIHswfSBiaW5kaW5nIGlzIG5vdCBkZWZpbmVkIGZvciBwb3J0IHR5cGUgezF9LiBBbGwgb3BlcmF0aW9ucyBzcGVjaWZpZWQgaW4gdGhpcyBiaW5kaW5nIG11c3QgYmUgZGVmaW5lZCBpbiBwb3J0IHR5cGUgezF9LgotX0lOUFVUX05BTUVfTk9UX1VOSVFVRSAgICAgICAgICAgICAgICAgICAgID0gVGhlIG5hbWUgezB9IHNwZWNpZmllZCBmb3IgdGhpcyBpbnB1dCBlbGVtZW50IGlzIG5vdCB1bmlxdWUuIFRoZSBuYW1lIG9mIGFuIGlucHV0IGVsZW1lbnQgbXVzdCBiZSB1bmlxdWUgZnJvbSB0aGUgbmFtZXMgb2YgYWxsIG90aGVyIGlucHV0IGFuZCBvdXRwdXQgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgezF9IHBvcnQgdHlwZS4KLV9PVVRQVVRfTkFNRV9OT1RfVU5JUVVFICAgICAgICAgICAgICAgICAgICA9IFRoZSBuYW1lIHswfSBzcGVjaWZpZWQgZm9yIHRoaXMgb3V0cHV0IGVsZW1lbnQgaXMgbm90IHVuaXF1ZS4gVGhlIG5hbWUgb2YgYW4gb3V0cHV0IGVsZW1lbnQgbXVzdCBiZSB1bmlxdWUgZnJvbSB0aGUgbmFtZXMgb2YgYWxsIG90aGVyIGlucHV0cyBhbmQgb3V0cHV0IGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIHsxfSBwb3J0IHR5cGUuCi1fTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVUICAgICAgICAgICAgICAgPSBUaGUgaW5wdXQgZWxlbWVudCBpcyByZWZlcmVuY2luZyBhbiB1bmRlZmluZWQgbWVzc2FnZSB7MH0uIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgbmFtZSBhbmQgbmFtZXNwYWNlIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHRoZSBtZXNzYWdlIGhhcyBiZWVuIGRlZmluZWQuCi1fTUVTU0FHRV9VTkRFRklORURfRk9SX09VVFBVVCAgICAgICAgICAgICAgPSBUaGUgb3V0cHV0IGVsZW1lbnQgaXMgcmVmZXJlbmNpbmcgYW4gdW5kZWZpbmVkIG1lc3NhZ2UgezB9LiBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIG5hbWUgYW5kIG5hbWVzcGFjZSBhcmUgY29ycmVjdCBhbmQgdGhhdCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBkZWZpbmVkLgotX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCAgICAgICAgICAgICAgID0gVGhlIGZhdWx0IGVsZW1lbnQgaXMgcmVmZXJlbmNpbmcgYW4gdW5kZWZpbmVkIG1lc3NhZ2UgezB9LiBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIG5hbWUgYW5kIG5hbWVzcGFjZSBhcmUgY29ycmVjdCBhbmQgdGhhdCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBkZWZpbmVkLgotX0RVUExJQ0FURV9GQVVMVF9OQU1FICAgICAgICAgICAgICAgICAgICAgID0gQSBmYXVsdCB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgZm9yIHRoZSB7MX0gMHBlcmF0aW9uLiBDaGVjayB0aGF0IGV2ZXJ5IGZhdWx0IGRlZmluZWQgZm9yIHRoaXMgb3BlcmF0aW9uIGhhcyBhIHVuaXF1ZSBuYW1lLgotX1BBUlRfTk9fRUxFTUVOVF9PUl9UWVBFICAgICAgICAgICAgICAgICAgID0gVGhlIHBhcnQgezB9IGRvZXMgbm90IGhhdmUgYSB0eXBlIGRlZmluZWQuIEV2ZXJ5IHBhcnQgbXVzdCBzcGVjaWZ5IGEgdHlwZSBmcm9tIHNvbWUgdHlwZSBzeXN0ZW0uIFRoZSB0eXBlIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGJ1aWx0IGluICJlbGVtZW50IiBvciAidHlwZSIgYXR0cmlidXRlcyBvciBtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIGFuIGV4dGVuc2lvbiBhdHRyaWJ1dGUuCi1fUEFSVF9CT1RIX0VMRU1FTlRfQU5EX1RZUEUgICAgICAgICAgICAgICAgPSBUaGUgcGFydCB7MH0gaGFzIGJvdGggYW4gZWxlbWVudCBhbmQgYSB0eXBlIGRlZmluZWQuIEV2ZXJ5IHBhcnQgbXVzdCBvbmx5IGhhdmUgYW4gZWxlbWVudCBvciBhIHR5cGUgZGVmaW5lZC4KLV9QQVJUX0lOVkFMSURfRUxFTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IFRoZSBwYXJ0IHswfSBoYXMgYW4gaW52YWxpZCB2YWx1ZSB7MX0gZGVmaW5lZCBmb3IgaXRzIGVsZW1lbnQuIEVsZW1lbnQgZGVjbGFyYXRpb25zIG11c3QgcmVmZXIgdG8gdmFsaWQgdmFsdWVzIGRlZmluZWQgaW4gYSBzY2hlbWEuCi1fUEFSVF9JTlZBTElEX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgcGFydCB7MH0gaGFzIGFuIGludmFsaWQgdmFsdWUgezF9IGRlZmluZWQgZm9yIGl0cyB0eXBlLiBUeXBlIGRlY2xhcmF0aW9ucyBtdXN0IHJlZmVyIHRvIHZhbGlkIHZhbHVlcyBkZWZpbmVkIGluIGEgc2NoZW1hLgotX0RVUExJQ0FURV9PUEVSQVRJT05fRk9SX1BPUlRUWVBFICAgICAgICAgID0gQW4gb3BlcmF0aW9uIHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBmb3IgdGhlIHsxfSBwb3J0IHR5cGUuIEV2ZXJ5IG9wZXJhdGlvbiBkZWZpbmVkIGZvciBhIHBvcnQgdHlwZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4gCi1fU0VSVklDRV9OQU1FX0FMUkVBRFlfREVGSU5FRCAgICAgICAgICAgICAgPSBBIFNlcnZpY2Ugd2l0aCB0aGUgbmFtZSB7MH0gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBFdmVyeSBzZXJ2aWNlIGluIHRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLgotX0JJTkRJTkdfTkFNRV9BTFJFQURZX0RFRklORUQgICAgICAgICAgICAgID0gQSBiaW5kaW5nIHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gRXZlcnkgYmluZGluZyBpbiB0aGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4KLV9NRVNTQUdFX05BTUVfQUxSRUFEWV9ERUZJTkVEICAgICAgICAgICAgICA9IEEgbWVzc2FnZSB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIEV2ZXJ5IG1lc3NhZ2UgaW4gdGhlIFdTREwgZG9jdW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuCi1fUE9SVFRZUEVfTkFNRV9BTFJFQURZX0RFRklORUQgICAgICAgICAgICAgPSBBIHBvcnQgdHlwZSB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIEV2ZXJ5IHBvcnQgdHlwZSBpbiB0aGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4KLV9NT1JFX1RIRU5fT05FX0FERFJFU1NfUE9SVCAgICAgICAgICAgICAgICA9IEFuIGFkZHJlc3MgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGZvciBwb3J0IHswfS4gRWFjaCBwb3J0IGNhbiBoYXZlIG9ubHkgb25lIGFkZHJlc3MgZGVmaW5lZC4KLV9OT19BRERSRVNTX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSBwb3J0IHswfSBoYXMgbm8gYWRkcmVzcyBkZWZpbmVkLiBFYWNoIHBvcnQgbXVzdCBkZWZpbmUgb25lIGFkZHJlc3MuCi1fUE9SVF9OQU1FX05PVF9VTklRVUUgICAgICAgICAgICAgICAgICAgICAgPSBBIHBvcnQgd2l0aCB0aGUgbmFtZSB7MH0gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBFdmVyeSBwb3J0IGluIHRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLgotX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQgICAgICAgICAgICAgID0gTm8gaW5wdXQgb3Igb3V0cHV0IGVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhlIHswfSBvcGVyYXRpb24uIEFuIGlucHV0IGVsZW1lbnQsIGFuIG91dHB1dCBlbGVtZW50LCBvciBib3RoIG11c3QgYmUgZGVmaW5lZCBmb3IgZXZlcnkgb3BlcmF0aW9uLgotX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9QQVJUICAgICAgICAgICAgICAgID0gVGhlIHBhcnQgezB9IHVzZXMgYW4gZWxlbWVudCBvciB0eXBlIGZyb20gdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGJ1dCB0aGUgbmFtZXNwYWNlIGhhcyBub3QgYmVlbiBpbXBvcnRlZC4gVGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIHNob3VsZCBiZSBpbXBvcnRlZCB3aXRoIGFuIGltcG9ydCBzdGF0ZW1lbnQgYmVmb3JlIGl0IGlzIHVzZWQuCi1fV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1NDSEVNQSAgICAgICAgICAgICAgPSBUaGUgaW5saW5lIHNjaGVtYSB1c2VzIGFuIGVsZW1lbnQgb3IgdHlwZSBmcm9tIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBidXQgdGhlIG5hbWVzcGFjZSBoYXMgbm90IGJlZW4gaW1wb3J0ZWQuIFRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBzaG91bGQgYmUgaW1wb3J0ZWQgd2l0aCBhbiBpbXBvcnQgc3RhdGVtZW50IGJlZm9yZSBpdCBpcyB1c2VkLgotX1JFRkVSRU5DRURfRklMRV9DT05UQUlOU19FUlJPUlMgICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4KLV9XQVJOX09MRF9TQ0hFTUFfTkFNRVNQQUNFICAgICAgICAgICAgICAgICA9IEFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgbmFtZXNwYWNlIGhhcyBiZWVuIHNwZWNpZmllZC4gezB9IGlzIHRoZSBzY2hlbWEgbmFtZXNwYWNlIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi1fRVJST1JfTVVMVElQTEVfVFlQRVNfREVGSU5FRCAgICAgICAgICAgICAgPSBBIHR5cGVzIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBPbmx5IG9uZSB0eXBlcyBlbGVtZW50IGlzIGFsbG93ZWQuCi1fV0FSTl9XUk9OR19OU19PTl9JTVBPUlQgICAgICAgICAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgaW1wb3J0ZWQgYmVjYXVzZSB0aGUgbmFtZXNwYWNlIHswfSBkb2VzIG5vdCBtYXRjaCB0aGUgdGFyZ2V0IG5hbWVzcGFjZSB7MX0gb2YgdGhlIGltcG9ydGVkIGRvY3VtZW50LgotIS0tIFJlZmVyZW5jZWQgZmlsZSBlcnJvcgotIS0tIE5vdGUgdG8gdHJhbnNsYXRvciAtIF9SRUZfRklMRV9FUlJPUl9NRVNTQUdFIG5lZWRzIGEgdHJhaWxpbmcgc3BhY2UgYXMgYW5vdGhlciBtZXNzYWdlIG1heSBmb2xsb3cuCi1fUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSAgICAgICAgICA9IFJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKHswfSkuIAotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvdmFsaWRhdGV3c2RsaHR0cC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy92YWxpZGF0ZXdzZGxodHRwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlN2FmZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy92YWxpZGF0ZXdzZGxodHRwLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1fRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MgICAgICAgICAgICAgICAgICAgPSBObyBsb2NhdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIHRoaXMgYWRkcmVzcy4gRXZlcnkgYWRkcmVzcyBtdXN0IGhhdmUgYSB2YWxpZCBsb2NhdGlvbiBzcGVjaWZpZWQuCi1fRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIEhUVFAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICJhZGRyZXNzIi4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfRUxFTUVOVCAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgSFRUUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgImJpbmRpbmciLgotX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBIVFRQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudCBpcyAib3BlcmF0aW9uIi4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfSU5QVVRfRUxFTUVOVCAgICAgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgSFRUUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnRzIGFyZSAidXJsUmVwbGFjZW1lbnQiIGFuZCAidXJsRW5jb2RlZCIuCi1fRVJST1JfSU5WQUxJRF9IVFRQX0VMRU1FTlRfRk9SX0xPQ0FUSU9OICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgY2Fubm90IGJlIHNwZWNpZmllZCBoZXJlLiBUaGlzIGVsZW1lbnQgaXMgbm90IGRlZmluZWQgaW4gdGhlIEhUVFAgbmFtZXNwYWNlIGZvciB1c2UgYXQgdGhpcyBwb2ludC4KLV9FUlJPUl9OT19IVFRQQklORElOR19GT1JfQUREUkVTUyAgICAgICAgICAgICAgICA9IEFuIEhUVFAgYWRkcmVzcyBjYW5ub3QgYmUgc3BlY2lmaWVkIGhlcmUgYXMgdGhlIHswfSBiaW5kaW5nIHRoYXQgdGhlIHsxfSBwb3J0IHJlZmVycyB0byBkb2VzIG5vdCBoYXZlIGFuIEhUVFAgYmluZGluZyBlbGVtZW50IGRlZmluZWQuIFRoZXJlIG11c3QgYmUgYW4gSFRUUCBiaW5kaW5nIGVsZW1lbnQgZGVmaW5lZCBpbiBvcmRlciB0byBzcGVjaWZ5IGFuIEhUVFAgYWRkcmVzcyBmb3IgYSBiaW5kaW5nLgotX0VSUk9SX0lOVkFMSURfQklORElOR19WRVJCICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSB2ZXJiIGRlZmluZWQgZm9yIHRoZSBIVFRQIGJpbmRpbmcgaXMgaW52YWxpZC4gVGhlIEhUVFAgYmluZGluZyB2ZXJiIG11c3QgYmUgIkdFVCIgb3IgIlBPU1QiIGFuZCBpcyBjYXNlIHNlbnNpdGl2ZS4KLV9FUlJPUl9JTlZBTElEX0xPQ0FUSU9OX1VSSSAgICAgICAgICAgICAgICAgICAgICA9IFRoZSBsb2NhdGlvbiBVUkkgaXMgaW52YWxpZCBmb3IgdGhlIEhUVFAgb3BlcmF0aW9uLiBZb3UgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgbG9jYXRpb24gVVJJIGZvciBldmVyeSBIVFRQIE9wZXJhdGlvbi4KLV9FUlJPUl9OT19IVFRQQklORElOR19GT1JfT1BFUkFUSU9OICAgICAgICAgICAgICA9IFRoZSB7MH0gYmluZGluZyB0aGF0IHRoZSBIVFRQIG9wZXJhdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGRvZXMgbm90IGhhdmUgYW4gSFRUUCBiaW5kaW5nIGRlZmluZWQuIEFuIEhUVFAgYmluZGluZyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZGVmaW5lIGFuIEhUVFAgb3BlcmF0aW9uIGhlcmUuCi1fRVJST1JfTk9fSFRUUE9QRVJBVElPTl9GT1JfVVJMICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IG9wZXJhdGlvbiB0aGF0IHRoZSB7MX0gSFRUUCBlbGVtZW50IGlzIHNwZWNpZmllZCBmb3IgZG9lcyBub3QgaGF2ZSBhbiBIVFRQIG9wZXJhdGlvbiBkZWZpbmVkLiBBIEhUVFAgb3BlcmF0aW9uIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byBkZWZpbmUgYSB7MX0gSFRUUCBlbGVtZW50IGhlcmUuCi1fRVJST1JfTk9UX09OTFlfRUxFTUVOVF9ERUZJTkVEICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IEhUVFAgZWxlbWVudCBkZWZpbmVkIGlzIG5vdCB0aGUgb25seSBlbGVtZW50IGRlZmluZWQgZm9yIHRoZSBpbnB1dCBlbGVtZW50LiBXaGVuIHswfSBpcyBkZWZpbmVkIGl0IG11c3QgYmUgdGhlIG9ubHkgY2hpbGQgZWxlbWVudCBkZWZpbmVkIGZvciB0aGUgaW5wdXQgZWxlbWVudC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvdmFsaWRhdGV3c2RsbWltZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy92YWxpZGF0ZXdzZGxtaW1lLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2U3YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy92YWxpZGF0ZXdzZGxtaW1lLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvdmFsaWRhdGV3c2Rsc29hcC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy92YWxpZGF0ZXdzZGxzb2FwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMmI5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy92YWxpZGF0ZXdzZGxzb2FwLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLV9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyAgICAgICAgICAgICAgICAgICA9IE5vIGxvY2F0aW9uIGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgdGhpcyBhZGRyZXNzLiBFdmVyeSBhZGRyZXNzIG11c3QgaGF2ZSBhIHZhbGlkIGxvY2F0aW9uIHNwZWNpZmllZC4KLV9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IFRoZSAgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICJhZGRyZXNzIi4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfU1RZTEUgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gc3R5bGUgZGVmaW5lZCBmb3IgdGhlIFNPQVAgYmluZGluZyBpbiBpbnZhbGlkLiBUaGUgU09BUCBiaW5kaW5nIHN0eWxlIG11c3QgYmUgInJwYyIgb3IgImRvY3VtZW50Ii4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfVVJJICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB0cmFuc3BvcnQgVVJJIGhhcyBub3QgYmVlbiBkZWZpbmVkIGZvciB0aGUgU09BUCBiaW5kaW5nLiBZb3UgbXVzdCBzcGVjaWZ5IGEgdHJhbnNwb3J0IFVSSSBmb3IgZXZlcnkgU09BUCBiaW5kaW5nLgotX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OX1NUWUxFICAgICAgICAgICAgICAgICAgID0gVGhlIHN0eWxlIHNwZWNpZmllZCBmb3IgdGhlIFNPQVAgb3BlcmF0aW9uIGlzIGludmFsaWQuIFRoZSBTT0FQIG9wZXJhdGlvbiBzdHlsZSBtdXN0IGJlICJycGMiIG9yICJkb2N1bWVudCIuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICJiaW5kaW5nIi4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgU09BUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgIm9wZXJhdGlvbiIuCi1fRVJST1JfSU5WQUxJRF9IRUFERVJfQk9EWV9FTEVNRU5UICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50cyBhcmUgImJvZHkiLCAiaGVhZGVyIiBhbmQgImhlYWRlcmZhdWx0Ii4KLV9FUlJPUl9JTlZBTElEX0ZBVUxUX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgU09BUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgImZhdWx0Ii4KLQotIS0tIEEgU09BUCBib2R5IGVsZW1lbnQgaW4gYSBXU0RMIGRvY3VtZW50IGNhbiBoYXZlIGFuIGF0dHJpYnV0ZSAidXNlIiBkZWZpbmVkIHRvIGJlIGVpdGhlciBsaXRlcmFsIG9yIGVuY29kZWQuIC0tCi0hLS0gVGhpcyBzdHJpbmcgaXMgdXNlZCBpbiBhbiBlcnJvciB0YXNrIGluIFdTQUQgaWYgdGhlIGRvY3VtZW50IHNwZWNpZmllcyBhIHVzZSBvdGhlciB0aGVuIGxpdGVyYWwgb3IgZW5jb2RlZC4gLS0gCi0hLS0gRm9yIGV4YW1wbGUsIGlmIHRoZSBkb2N1bWVudCBzcGVjaWZpZXMgdGhlIHVzZSBvZiB0aGUgU09BUCBib2R5IGFzICJzaW1wbGUiIHRoZSBvdXRwdXQgc3RyaW5nIHNob3VsZCBiZTogICAgLS0KLSEtLSBUaGUgJ3NpbXBsZScgdXNlIHNwZWNpZmllZCBmb3IgdGhlIFNPQVAgYm9keSBpcyBpbnZhbGlkLiBUaGUgdXNlIG11c3QgYmUgbGl0ZXJhbCBvciBlbmNvZGVkLiAgICAgICAgICAgICAgICAtLQotX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UgICAgICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSB1c2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBib2R5IGlzIGludmFsaWQuIFRoZSB1c2UgbXVzdCBiZSBsaXRlcmFsIG9yIGVuY29kZWQuCi1fRVJST1JfSU5WQUxJRF9CT0RZX0VOQ09ESU5HX1NUWUxFICAgICAgICAgICAgICAgPSBUaGVyZSBpcyBubyBlbmNvZGluZyBzdHlsZSBVUkkgZGVmaW5lZCBmb3IgdGhlIFNPQVAgYm9keS4gWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgVVJJIGZvciB0aGUgZW5jb2Rpbmcgc3R5bGUgd2hlbiB0aGUgdXNlIGlzIGVuY29kZWQuCi1fRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVEICAgICAgICAgICAgICAgPSBUaGUgezB9IHBhcnQgc3BlY2lmaWVkIGFzIGEgcGFydCBmb3IgdGhlIFNPQVAgYm9keSBpcyB1bmRlZmluZWQuICBZb3UgY2FuIG9ubHkgc3BlY2lmeSBkZWZpbmVkIHBhcnRzLgotX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX05PVF9UWVBFICAgICAgICAgICAgICAgID0gVGhlIHswfSBwYXJ0IGRvZXMgbm90IGhhdmUgYSB0eXBlIGRlZmluZWQgYW5kIGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgYSBTT0FQIGJvZHkgd2l0aCBpdHMgdXNlIGVuY29kZWQuIFdoZW4gdXNlIGlzIGVuY29kZWQgb24gYSBTT0FQIGJvZHksIGFsbCBwYXJ0cyBkZWZpbmVkIG11c3Qgb25seSBjb250YWluIGEgdmFsaWQgdHlwZS4KLV9FUlJPUl9JTlZBTElEX1NPQVBfRUxFTUVOVF9GT1JfTE9DQVRJT04gICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBjYW5ub3QgYmUgc3BlY2lmaWVkIGhlcmUuIFRoaXMgZWxlbWVudCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgU09BUCBuYW1lc3BhY2UgZm9yIHVzZSBhdCB0aGlzIHBvaW50LgotX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9BRERSRVNTICAgICAgICAgICAgICAgID0gQSBTT0FQIGFkZHJlc3MgY2Fubm90IGJlIHNwZWNpZmllZCBoZXJlIGFzIHRoZSB7MH0gYmluZGluZyB0aGF0IHRoZSB7MX0gcG9ydCByZWZlcnMgdG8gZG9lcyBub3QgaGF2ZSBhIFNPQVAgYmluZGluZyBlbGVtZW50IGRlZmluZWQuIFRoZXJlIG11c3QgYmUgYSBTT0FQIGJpbmRpbmcgZWxlbWVudCBkZWZpbmVkIGluIG9yZGVyIHRvIHNwZWNpZnkgYSBTT0FQIGFkZHJlc3MgZm9yIGEgYmluZGluZy4KLV9FUlJPUl9IRUFERVJfTUVTU0FHRV9VTkRFRklORUQgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gbWVzc2FnZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGhlYWRlciBpcyB1bmRlZmluZWQuIFRoZSBtZXNzYWdlIHNwZWNpZmllZCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuCi1fRVJST1JfSEVBREVSX1BBUlRfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHBhcnQgc3BlY2lmaWVkIGluIG1lc3NhZ2UgezF9IGZvciB0aGUgU09BUCBoZWFkZXIgaXMgdW5kZWZpbmVkLiBFbnN1cmUgdGhlIHBhcnQgaXMgZGVmaW5lZCBpbiB0aGUgezF9IG1lc3NhZ2UuCi1fRVJST1JfSEVBREVSX1VTRV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHVzZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGhlYWRlciBpcyBpbnZhbGlkLiBUaGUgdXNlIG11c3QgYmUgc3BlY2lmaWVkIGFzIGxpdGVyYWwgb3IgZW5jb2RlZC4KLV9FUlJPUl9IRUFERVJfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQgICAgICAgICAgICA9IFRoZSBlbmNvZGluZyBzdHlsZSBmb3IgdGhlIFNPQVAgaGVhZGVyIGlzIG5vdCBzcGVjaWZpZWQuIFdoZW4gdGhlIHVzZSBpcyBlbmNvZGVkIHRoZSBlbmNvZGluZyBzdHlsZSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIFVSSS4KLV9FUlJPUl9IRUFERVJfTkFNRVNQQUNFX1VOREVGSU5FRCAgICAgICAgICAgICAgICA9IFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBTT0FQIGhlYWRlciBpcyBub3Qgc3BlY2lmaWVkLiBXaGVuIHRoZSB1c2UgaXMgZW5jb2RlZCBhIG5hbWVzcGFjZSBVUkkgbXVzdCBiZSBkZWZpbmVkLgotX0VSUk9SX0hFQURFUkZBVUxUX01FU1NBR0VfVU5ERUZJTkVEICAgICAgICAgICAgID0gVGhlIHswfSBtZXNzYWdlIHNwZWNpZmllZCBmb3IgdGhlIFNPQVAgaGVhZGVyIGZhdWx0IGlzIHVuZGVmaW5lZC4gVGhlIG1lc3NhZ2Ugc3BlY2lmaWVkIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4KLV9FUlJPUl9IRUFERVJGQVVMVF9QQVJUX1VOREVGSU5FRCAgICAgICAgICAgICAgICA9IFRoZSB7MH0gcGFydCBzcGVjaWZpZWQgaW4gbWVzc2FnZSB7MX0gZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyB1bmRlZmluZWQuIEVuc3VyZSB0aGUgcGFydCBpcyBkZWZpbmVkIGluIHRoZSB7MX0gbWVzc2FnZS4gCi1fRVJST1JfSEVBREVSRkFVTFRfVVNFX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHVzZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyBpbnZhbGlkLiBUaGUgdXNlIG11c3QgYmUgc3BlY2lmaWVkIGFzIGxpdGVyYWwgb3IgZW5jb2RlZC4KLV9FUlJPUl9IRUFERVJGQVVMVF9FTkNPRElOR1NUWUxFX1VOREVGSU5FRCAgICAgICA9IFRoZSBlbmNvZGluZyBzdHlsZSBmb3IgdGhlIFNPQVAgaGVhZGVyIGZhdWx0IGlzIG5vdCBzcGVjaWZpZWQuIFdoZW4gdGhlIHVzZSBpcyBlbmNvZGVkIHRoZSBlbmNvZGluZyBzdHlsZSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIFVSSS4KLV9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEICAgICAgICAgICA9IFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyBub3Qgc3BlY2lmaWVkLiBXaGVuIHRoZSB1c2UgaXMgZW5jb2RlZCBhIG5hbWVzcGFjZSBVUkkgbXVzdCBiZSBkZWZpbmVkLgotX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBuYW1lIHNwZWNpZmllZCBmb3IgdGhlIFNPQVAgZmF1bHQgaXMgaW52YWxpZC4gVGhlIG5hbWUgc3BlY2lmaWVkIG11c3QgYmUgezF9LCB0aGUgbmFtZSBmcm9tIHRoZSBmYXVsdCBwYXJlbnQgZWxlbWVudC4KLV9FUlJPUl9OT19TT0FQQklORElOR19GT1JfT1BFUkFUSU9OICAgICAgICAgICAgICA9IFRoZSB7MH0gYmluZGluZyB0aGF0IHRoZSBTT0FQIG9wZXJhdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGRvZXMgbm90IGhhdmUgYSBTT0FQIGJpbmRpbmcgZGVmaW5lZC4gQSBTT0FQIGJpbmRpbmcgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvIGRlZmluZSBhIFNPQVAgb3BlcmF0aW9uIGhlcmUuCi1fRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0JPRFkgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgU09BUCBib2R5IGlzIHNwZWNpZmllZCBmb3IgZG9lcyBub3QgaGF2ZSBhIFNPQVAgYmluZGluZyBkZWZpbmVkLiBBIFNPQVAgYmluZGluZyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZGVmaW5lIGEgU09BUCBib2R5IGhlcmUuCi1fRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0hFQURFUiAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgU09BUCBoZWFkZXIgaXMgc3BlY2lmaWVkIGZvciBkb2VzIG5vdCBoYXZlIGEgU09BUCBiaW5kaW5nIGRlZmluZWQuIEEgU09BUCBiaW5kaW5nIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byBkZWZpbmUgYSBTT0FQIGhlYWRlciBoZXJlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvdmFsaWRhdGV3c2RsdWkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvdmFsaWRhdGV3c2RsdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyMjM3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3ZhbGlkYXRld3NkbHVpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0hLS0gQW50IFVJCi1fVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSICAgICAgICAgICAgICAgICAgPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV9VSV9FUlJPUl9NQVJLRVIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVSUk9SICAKLV9VSV9XQVJOSU5HX01BUktFUiAgICAgICAgICAgICAgICAgICAgICAgICA9IFdBUk5JTkcKLV9VSV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZBTElECi1fVUlfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJTlZBTElECi1fVUlfQUNUSU9OX1ZBTElEQVRJTkdfRklMRSAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW5nIHswfQotCi1fRVJST1JfTk9fRklMRV9TUEVDSUZJRUQgICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gcnVuIFdTREwgVmFsaWRhdGlvbi4gWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgZmlsZS4KLQotX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfRklMRSAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIHZhbGlkYXRlIHRoZSBXU0RMIGZpbGUgezB9LiB7MX0KLV9FWENfV1NETF9GQUlMX09OX0VSUk9SICAgICAgICAgICAgICAgICAgICA9IFRoZSBXU0RMIGZpbGUgaXMgbm90IHZhbGlkLiAoRmFpbCBPbiBFcnJvciBpcyBlbmFibGVkLikKLQotX0VSUk9SX1VOQUJMRV9UT19MT0FEX0VYVF9WQUxJREFUT1IgICAgICAgID0gVW5hYmxlIHRvIGxvYWQgdGhlIHZhbGlkYXRvciBmb3IgbmFtZXNwYWNlIHswfS4gezF9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTkzYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWh0dHAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtbWltZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zb2FwIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXdzZGwiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2YyOTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluCi13c2RsLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LndzZGxfMS4wLjAuamFyCi1vcmcuZWNsaXBzZS53c3Qud3NkbC5wYXRjaAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYzUzYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2RsPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOWQ2N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jTW9uIEphbiAzMCAyMzo0MDowOCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNTBhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gSmFuIDMwIDIzOjE5OjE5IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2RiNzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndzZGw7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luSW1wbGVtZW50YXRpb24KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuZ2VuZXJhdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5nZW5lcmF0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5leHRlbnNpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGo7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuNC4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi40LjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLndzZGw0ajtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDEuNS4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzZGE0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHNyYy1odHRwLyxcCi0gICAgICAgICAgICAgICAgICBzcmMtbWltZS8sXAotICAgICAgICAgICAgICAgICAgc3JjLXNvYXAvLFwKLSAgICAgICAgICAgICAgICAgIHNyYy13c2RsLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NjE5YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIKLQluYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy53c2RsNGoiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkKLQkJPHR5cGUgbmFtZT0iQmluZGluZ0ZhdWx0IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iQmluZGluZ0lucHV0IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iQmluZGluZ09wZXJhdGlvbiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iQmluZGluZ091dHB1dCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkRlZmluaXRpb24iICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJFeHRlbnNpYmlsaXR5RWxlbWVudCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkV4dGVuc2libGVFbGVtZW50IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRmF1bHQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJJbXBvcnQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCQotCQk8dHlwZSBuYW1lPSJJbnB1dCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkJCi0JCTx0eXBlIG5hbWU9Ik1lc3NhZ2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJNZXNzYWdlUmVmZXJlbmNlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJOYW1lc3BhY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9Ik9wZXJhdGlvbiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotICAgIAk8dHlwZSBuYW1lPSJPdXRwdXQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCQotICAgICAJPHR5cGUgbmFtZT0iUGFydCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkJCi0JCTx0eXBlIG5hbWU9IlBvcnQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IlBvcnRUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iU2VydmljZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlR5cGVzIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iV1NETEVsZW1lbnQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJXU0RMRmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotPCEtLQk8dHlwZSBuYW1lPSJXU0RMUGx1Z2luIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4tLT4KLQkJPHR5cGUgbmFtZT0iWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkKLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbCIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IldTRExDb25zdGFudHMiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci08IS0tCTx0eXBlIG5hbWU9IkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSIgLz4gLS0+CQkKLTwhLS0JPHR5cGUgbmFtZT0iRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkiIC8+LS0+CQotPCEtLQk8dHlwZSBuYW1lPSJXU0RMUmVzb3VyY2VJbXBsIiBzdWJjbGFzcz0iZmFsc2UiLz4tLT4KLQk8L3BhY2thZ2U+Ci0JCi08IS0tIHRoZXNlIHBsdWdpbidzIHRvIGJlIHByb3ZpZGVkIHdpdGggbm9uIEFQSSBkaXNjbGFpbWVycyAtLT4KLTwhLS0JCi0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU09BUEJvZHkiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBIZWFkZXJGYXVsdCIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEFkZHJlc3MiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBGYWN0b3J5IiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQSGVhZGVyIiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQQmluZGluZyIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEhlYWRlckJhc2UiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBGYXVsdCIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUE9wZXJhdGlvbiIgLz4KLQk8L3BhY2thZ2U+Ci0KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUiPgotCQk8dHlwZSBuYW1lPSJNSU1FQ29udGVudCIgLz4KLQkJPHR5cGUgbmFtZT0iTUlNRVBhY2thZ2UiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1JTUVNdWx0aXBhcnRSZWxhdGVkIiAvPgotCQk8dHlwZSBuYW1lPSJNSU1FUGFydCIgLz4KLQkJPHR5cGUgbmFtZT0iTUlNRU1pbWVYbWwiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1JTUVGYWN0b3J5IiAvPgotCTwvcGFja2FnZT4KLQotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cCI+Ci0JCTx0eXBlIG5hbWU9IkhUVFBGYWN0b3J5IiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQT3BlcmF0aW9uIiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQVXJsRW5jb2RlZCIgLz4KLQkJPHR5cGUgbmFtZT0iSFRUUFBhY2thZ2UiIC8+Ci0JCTx0eXBlIG5hbWU9IkhUVFBBZGRyZXNzIiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQVXJsUmVwbGFjZW1lbnQiIC8+Ci0JCTx0eXBlIG5hbWU9IkhUVFBCaW5kaW5nIiAvPgotCTwvcGFja2FnZT4KLS0tPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2dyYWJqYXJzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvZ3JhYmphcnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZlZGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvZ3JhYmphcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iY29weUphcnMiIGJhc2VkaXI9Ii4iPgotCi0JPHByb3BlcnR5IG5hbWU9InBsdWdpbk5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvcHlKYXJzIiBpZj0iZG93bmxvYWRQYXRoIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjb3B5SmFyczIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNvcHlKYXJzMiIgaWY9InBsdWdpbnNQYXRoIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjb3B5SmFyczMiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY29weUphcnMzIiBpZj0icGx1Z2luTmFtZSI+Ci0JCTxjb3B5IHRvZGlyPSIke3BsdWdpbnNQYXRofS8ke3BsdWdpbk5hbWV9JHt2ZXJzaW9ufS9saWIiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZG93bmxvYWRQYXRofS8ke3BsdWdpbk5hbWV9JHt2ZXJzaW9ufSI+Ci0JCQkJPGZpbGVuYW1lIG5hbWU9IiouamFyIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXBKYXJzIiBpZj0icGx1Z2luc1BhdGgiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsZWFudXBKYXJzMiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbnVwSmFyczIiIGlmPSJwbHVnaW5OYW1lIj4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtwbHVnaW5zUGF0aH0vJHtwbHVnaW5OYW1lfSR7dmVyc2lvbn0vbGliIj4KLQkJCQk8ZmlsZW5hbWUgbmFtZT0iKi5qYXIiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvbGliLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkyZjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0qLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTkxNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IFdTREwgTW9kZWwKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLXhwRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3JpZXMgPSBXU0RMIEV4dGVuc2liaWxpdHkgRWxlbWVudCBGYWN0b3JpZXMKLXhwUG9ydEFuZEJpbmRpbmdDb250ZW50R2VuZXJhdG9ycyA9IFBvcnQgYW5kIEJpbmRpbmcgQ29udGVudCBHZW5lcmF0b3JzCi14cFdTRExDb250ZW50VHlwZSA9IFdTREwgQ29udGVudCBUeXBlCi0KLV9FUlJPUl9JTlZBTElEX1dTREwgPSBUaGUgaW5wdXQgc291cmNlIGlzIG5vdCBhIHZhbGlkIFdTREwgZG9jdW1lbnQuCi1fVUlfSU9FcnJvcl9tZXNzYWdlID0gSU86IHswfQotX1VJX1BhcnNlckVycm9yX21lc3NhZ2UgPSBET006IHswfQotCi1fVUlfUmVzb3VyY2VMb2FkX3Byb2dyZXNzID0gTG9hZGluZyBXU0RMIGRvY3VtZW50cyAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyNDAxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIgotCQluYW1lPSIleHBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyIgCi0JCXNjaGVtYT0ic2NoZW1hL2V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzLmV4c2QiLz4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJjb250ZW50R2VuZXJhdG9ycyIKLQkJbmFtZT0iJXhwUG9ydEFuZEJpbmRpbmdDb250ZW50R2VuZXJhdG9ycyIgCi0JCXNjaGVtYT0ic2NoZW1hL2NvbnRlbnRHZW5lcmF0b3JzLmV4c2QiLz4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0JCTxwYWNrYWdlCi0JCQl1cmk9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvV1NETCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZSI+Ci0JCTwvcGFja2FnZT4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0JCTxwYXJzZXIKLQkJCXR5cGU9IndzZGwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCI+Ci0JCTwvcGFyc2VyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLQkJPHBhY2thZ2UKLQkJCXVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93c2RsLzIwMDMvSFRUUCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UiPgotCQk8L3BhY2thZ2U+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC5leHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyI+Ci0JCTxleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLQkJCW5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbC5IVFRQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLQkJPHBhY2thZ2UKLQkJCXVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93c2RsLzIwMDMvTUlNRSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UiPgotCQk8L3BhY2thZ2U+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC5leHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyI+Ci0JCTxleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLQkJCW5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbC5NSU1FRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLQkJPHBhY2thZ2UKLQkJCXVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93c2RsLzIwMDMvU09BUCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UiPgotCQk8L3BhY2thZ2U+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC5leHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyI+Ci0JCTxleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLQkJCW5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwuY29udGVudEdlbmVyYXRvcnMiPgotCQk8Y29udGVudEdlbmVyYXRvcgotCQkJbmFtZT0iU09BUCIKLQkJCW5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuZ2VuZXJhdG9yLlNPQVBDb250ZW50R2VuZXJhdG9yIj4KLQkJPC9jb250ZW50R2VuZXJhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwuY29udGVudEdlbmVyYXRvcnMiPgotCQk8Y29udGVudEdlbmVyYXRvcgotCQkJbmFtZT0iSFRUUCIKLQkJCW5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuZ2VuZXJhdG9yLkhUVFBDb250ZW50R2VuZXJhdG9yIj4KLQkJPC9jb250ZW50R2VuZXJhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0KLQotCTwhLS0gZGVmaW5lIGEgd3NkbCBjb250ZW50IHR5cGUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJXhwV1NETENvbnRlbnRUeXBlIgotCQkJaWQ9IndzZGxzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04IgotCQkJZmlsZS1leHRlbnNpb25zPSJ3c2RsIiAvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NjaGVtYS9jb250ZW50R2VuZXJhdG9ycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zY2hlbWEvY29udGVudEdlbmVyYXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyYTQ0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NjaGVtYS9jb250ZW50R2VuZXJhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53c2RsIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIgaWQ9ImNvbnRlbnRHZW5lcmF0b3JzIiBuYW1lPSJQb3J0IGFuZCBCaW5kaW5nIENvbnRlbnQgR2VuZXJhdG9ycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgUG9ydCBhbmQgQmluZGluZyBDb250ZW50IEdlbmVyYXRvcnMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIHJlZ2lzdGVyIGN1c3RvbSBnZW5lcmF0b3JzIGZvciBQb3J0cyBhbmQgQmluZGluZ3MuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIFBvcnQgYW5kIEJpbmRpbmcgQ29udGVudCBHZW5lcmF0b3JzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byByZWdpc3RlciBjdXN0b20gY29udGVudCBnZW5lcmF0b3JzIGZvciBXU0RMIFBvcnRzIGFuZCBCaW5kaW5ncy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudEdlbmVyYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGVudEdlbmVyYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTmFtZSB1c2VkIGZvciB0aGlzIHBhcnRpY3VsYXIgZXh0ZW5zaW9uIHBvaW50IGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZXNwYWNlIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGluc3RhbmNlIGFwcGxpZXMgdG8uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuQ29udGVudEdlbmVyYXRvciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250ZW50IGdlbmVyYXRvciBjb250cmlidXRpb246Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwuY29udGVudEdlbmVyYXRvcnMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7Y29udGVudEdlbmVyYXRvcgotICAgICAgICAgICAgbmFtZT0mcXVvdDtTT0FQJnF1b3Q7Ci0gICAgICAgICAgICBuYW1lc3BhY2U9JnF1b3Q7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmdlbmVyYXRvci5TT0FQQ29udGVudEdlbmVyYXRvciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuQ29udGVudEdlbmVyYXRvciZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc2NoZW1hL2V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NjaGVtYS9leHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjQ1NTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc2NoZW1hL2V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIiBpZD0iZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3JpZXMiIG5hbWU9IldTREwgRXh0ZW5zaWJpbGl0eSBFbGVtZW50IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgV1NETCBFeHRlbnNpYmlsaXR5IEVsZW1lbnQgRmFjdG9yaWVzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byByZWdpc3RlciBmYWN0b3JpZXMgZm9yIGNyZWF0aW5nIGN1c3RvbSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZXNwYWNlIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGluc3RhbmNlIGFwcGxpZXMgdG8uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGZhY3RvcnkgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC53c2RsLmV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotICAgICAgICAgICAgbmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8mcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgc3VwcGxpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkmbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL21vZGVsL0hUVFAuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL21vZGVsL0hUVFAuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQxNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9IVFRQLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5odHRwL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLmh0dHAuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5odHRwLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLmh0dHAiIG1vZGVsTmFtZT0iSFRUUCIgZWRpdFBsdWdpbkNsYXNzPSIiCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9IiIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjL21vZGVsL1hTRC5nZW5tb2RlbCMvL3hzZCI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxodHRwLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPlZBQkFTRV9QTFVHSU5TX1BBVEg8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXU0RMIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMiIGVjb3JlUGFja2FnZT0id3NkbC5lY29yZSMvIj4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9RTmFtZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL09wZXJhdGlvblR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01FbGVtZW50Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vV1NETEV4Y2VwdGlvbiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTURvY3VtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZG9jdW1lbnRhdGlvbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZWxlbWVudCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9nZXRFbmNsb3NpbmdEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24vZGVmaW5pdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS91bmRlZmluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnRUeXBlL2VPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vc3R5bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZU91dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VGYXVsdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VQYXJhbWV0ZXJPcmRlcmluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS91bmRlZmluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL2VQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUGFydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L2VsZW1lbnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvdHlwZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC90eXBlRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VsZW1lbnREZWNsYXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VNZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lUG9ydFR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZUJpbmRpbmdPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZU9wZXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nRmF1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9TZXJ2aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1NlcnZpY2UvZVBvcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnQvZUJpbmRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZWxlbWVudFR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2xvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lbmNvZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lTWVzc2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVBvcnRUeXBlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lQmluZGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VOYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VUeXBlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lSW1wb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2dldERvY3VtZW50Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQvZG9jdW1lbnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ltcG9ydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0ltcG9ydC9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2xvY2F0aW9uVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZVNjaGVtYSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvZ2V0U2NoZW1hIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9zZXRTY2hlbWEiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0ltcG9ydC9zZXRTY2hlbWEvc2NoZW1hIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9lRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2dldEV4dGVuc2liaWxpdHlFbGVtZW50cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZXh0RWxlbWVudCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW5wdXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vT3V0cHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ZhdWx0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9lSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2dldElucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9zZXRJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0L2lucHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZU91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2dldE91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9zZXRPdXRwdXQvb3V0cHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZUZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9nZXRGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdC9mYXVsdCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTmFtZXNwYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTmFtZXNwYWNlL1VSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvcHJlZml4Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uL29wZXJhdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL25hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL2lucHV0TmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vb3V0cHV0TmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQvZmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0UGFyYW1ldGVyT3JkZXJpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZy9wYXJhbWV0ZXJPcmRlciIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldElucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQvaW5wdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0L291dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUlucHV0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPdXRwdXQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUZhdWx0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNZXNzYWdlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydC9wYXJ0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cy9wYXJ0T3JkZXIiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQYXJ0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS92YWx1ZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JU2VydmljZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQvcG9ydCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvZ2V0QmluZGluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nL2JpbmRpbmciLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbi9iaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vaW5wdXROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9vdXRwdXROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldFBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZS9wb3J0VHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdC9iaW5kaW5nRmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldE9wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbi9vcGVyYXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0L2JpbmRpbmdJbnB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQvYmluZGluZ091dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdJbnB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ091dHB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0ZhdWx0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmcvYmluZGluZyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydC9pbXBvcnREZWYiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL3ByZWZpeCIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlL3BvcnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2Uvc2VydmljZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ09wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUltcG9ydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVNZXNzYWdlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU9wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUGFydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQb3J0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVNlcnZpY2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZy9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmdzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZS9wcmVmaXgiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkvZXh0ZW5zaW9uUmVnaXN0cnkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RG9jdW1lbnRCYXNlVVJJIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJL2RvY3VtZW50QmFzZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZy9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMvdHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUxpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVVJMIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9UeXBlcyI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcy4xIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSXRlcmF0b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVR5cGVzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC9wYXJlbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L2NoaWxkcmVuIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC9zY2hlbWEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9lTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iSFRUUCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZyIgZWNvcmVQYWNrYWdlPSJodHRwLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9IVFRQQmluZGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaHR0cC5lY29yZSMvL0hUVFBCaW5kaW5nL3ZlcmIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0hUVFBPcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGh0dHAuZWNvcmUjLy9IVFRQT3BlcmF0aW9uL2xvY2F0aW9uVVJJIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9IVFRQVXJsUmVwbGFjZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSFRUUFVybEVuY29kZWQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSFRUUEFkZHJlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGh0dHAuZWNvcmUjLy9IVFRQQWRkcmVzcy9sb2NhdGlvblVSSSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSUhUVFBBZGRyZXNzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0lIVFRQQmluZGluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9JSFRUUE9wZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9JSFRUUFVybEVuY29kZWQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSUhUVFBVcmxSZXBsYWNlbWVudCIvPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvbW9kZWwvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5IVFRQLmNhdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvbW9kZWwvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5IVFRQLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzMjA3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL21vZGVsL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuSFRUUC5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDIKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiaHR0cCIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIHF1aWQgICAgICAgCSIzQUJGRDlBRDAxRjgiCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3MgIkhUVFBCaW5kaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0FCRkU1N0MwMTM2IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNUZGMUQwMDE5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZlcmIiCi0JCSAgICBxdWlkICAgICAgIAkiM0FCRkU2MEQwMERCIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSFRUUE9wZXJhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNBQkZFNkFFMDA1MCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRTVGRjRCMDM3QyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUJGRTcwRDAxNDciCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJIVFRQVXJsUmVwbGFjZW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUJGRUExQTAxN0MiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUU3MjhCODAyQzMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkhUVFBVcmxFbmNvZGVkIgotCSAgICBxdWlkICAgICAgIAkiM0FCRkVBNkQwMjk0IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzI4RDUwMDk0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJIVFRQQWRkcmVzcyIKLQkgICAgcXVpZCAgICAgICAJIjNBQzNCRjI1MDBGNSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRTVGRUE5MDFCNyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUMzQkZBNzAxMkUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBvcnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUMxMUU1MjAxRkIiCi0JICAgIHRpdGxlICAgICAgCSJQb3J0IgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEFkZHJlc3MiIEAxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgNDMyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDEzNSwgMzUxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQwMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkhUVFBBZGRyZXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUMzQkYyNTAwRjUiCi0JCSAgICB3aWR0aCAgICAgIAk0MjAKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFeHRlbnNpYmlsaXR5IgotCSAgICBxdWlkICAgICAgIAkiM0FFNUZFM0IwMzdCIgotCSAgICB0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDEyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSg3MCwgNTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDA0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJICAgIHdpZHRoICAgICAgCTQyMgotCQkgICAgaGVpZ2h0ICAgICAJMTc0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBBZGRyZXNzIiBAMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDQ4MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxMjgsIDQyOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyODgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIVFRQQWRkcmVzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FDM0JGMjUwMEY1IgotCQkgICAgd2lkdGggICAgICAJMzA2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEJpbmRpbmciIEA0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNjQwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANAotCQkJbG9jYXRpb24gICAJKDM0NCwgNTg4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkhUVFBCaW5kaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRTU3QzAxMzYiCi0JCSAgICB3aWR0aCAgICAgIAkyOTAKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDUKLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDMwNSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMgotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMjcyLCAzMDUpCi0JCQkoMjcyLCAyMTUpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTVGRUE5MDFCNyIKLQkJICAgIGNsaWVudCAgICAgCUAzCi0JCSAgICBzdXBwbGllciAgIAlAMgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzIsIDQxNikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUU1RkYxRDAwMTkiCi0JCSAgICBjbGllbnQgICAgIAlANAotCQkgICAgc3VwcGxpZXIgICAJQDIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDc1LCA1NzYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDc1LCAzMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBPcGVyYXRpb24iIEA4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDY3MiwgODE2KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOAotCQkJbG9jYXRpb24gICAJKDUxOCwgNzY0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMwOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkhUVFBPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFNkFFMDA1MCIKLQkJICAgIHdpZHRoICAgICAgCTMyNgotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFNUZGNEIwMzdDIgotCQkgICAgY2xpZW50ICAgICAJQDgKLQkJICAgIHN1cHBsaWVyICAgCUAyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY1NiwgNzUyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMzA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsUmVwbGFjZW1lbnQiIEAxMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDk5MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwCi0JCQlsb2NhdGlvbiAgIAkoNjA1LCA5NDEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSFRUUFVybFJlcGxhY2VtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRUExQTAxN0MiCi0JCSAgICB3aWR0aCAgICAgIAk0NDAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUU3MjhCODAyQzMiCi0JCSAgICBjbGllbnQgICAgIAlAMTAKLQkJICAgIHN1cHBsaWVyICAgCUAyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg2OSwgOTI5KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg2OSwgMzA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsRW5jb2RlZCIgQDEyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNzIsIDExNjgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMgotCQkJbG9jYXRpb24gICAJKDkwMCwgMTExNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIVFRQVXJsRW5jb2RlZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkVBNkQwMjk0IgotCQkgICAgd2lkdGggICAgICAJMzYyCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFNzI4RDUwMDk0IgotCQkgICAgY2xpZW50ICAgICAJQDEyCi0JCSAgICBzdXBwbGllciAgIAlAMgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTAzLCAxMTA1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMDMsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNBRTcyQTcwMDBBOSIKLQkgICAgdGl0bGUgICAgICAJIkJpbmRpbmciCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQmluZGluZyIgQDE0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMjcyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCWxvY2F0aW9uICAgCSgyMDAsIDIyMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIVFRQQmluZGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkU1N0MwMTM2IgotCQkgICAgd2lkdGggICAgICAJMjkwCi0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUE9wZXJhdGlvbiIgQDE1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMjcyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCWxvY2F0aW9uICAgCSg1MTksIDE5MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIVFRQT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRTZBRTAwNTAiCi0JCSAgICB3aWR0aCAgICAgIAk0MjAKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsUmVwbGFjZW1lbnQiIEAxNgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4NDgsIDU5MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2Ci0JCQlsb2NhdGlvbiAgIAkoNjM3LCA1NDEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSFRUUFVybFJlcGxhY2VtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRUExQTAxN0MiCi0JCSAgICB3aWR0aCAgICAgIAk0NDAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsRW5jb2RlZCIgQDE3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM4NCwgNTkyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTcKLQkJCWxvY2F0aW9uICAgCSgyMTIsIDU0MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIVFRQVXJsRW5jb2RlZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkVBNkQwMjk0IgotCQkgICAgd2lkdGggICAgICAJMzYyCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkpKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9odHRwLmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9odHRwLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzEwMzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvbW9kZWwvaHR0cC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Imh0dHAiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvSFRUUCIgbnNQcmVmaXg9Imh0dHAiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhUVFBCaW5kaW5nIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lIVFRQQmluZGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcmIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUE9wZXJhdGlvbiIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUE9wZXJhdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhUVFBVcmxSZXBsYWNlbWVudCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUFVybFJlcGxhY2VtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUFVybEVuY29kZWQiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSUhUVFBVcmxFbmNvZGVkIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUEFkZHJlc3MiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSUhUVFBBZGRyZXNzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBBZGRyZXNzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBCaW5kaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmciCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBPcGVyYXRpb24iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklIVFRQVXJsRW5jb2RlZCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklIVFRQVXJsUmVwbGFjZW1lbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9odHRwLm1kbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvbW9kZWwvaHR0cC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTJiZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9odHRwLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDMyMzgzICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQyCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlUUlVFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTUxIgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMThDIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjNBQkZEOUE3MDE1MCIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjNBQkZEOUE3MDE1MiIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJodHRwIgotCQlxdWlkICAgICAgIAkiM0FCRkQ5QUQwMUY4IgotCQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzcyAiSFRUUEJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0FCRkU1N0MwMTM2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTVGRjFEMDAxOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSI0MDk4NDNGMTAzQzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDNBNzAyRUIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyYiIKLQkJCQlxdWlkICAgICAgIAkiM0FCRkU2MEQwMERCIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkhUVFBPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FCRkU2QUUwMDUwIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTVGRjRCMDM3QyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSI0MDk4NDQ0NjAyQ0MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0M0ZGMDJCQiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FCRkU3MEQwMTQ3IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkhUVFBVcmxSZXBsYWNlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQUJGRUExQTAxN0MiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFNzI4QjgwMkMzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NEQyMDJDNSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUFVybFJlcGxhY2VtZW50IgotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ5NjAwRDgiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkhUVFBVcmxFbmNvZGVkIgotCQkJcXVpZCAgICAgICAJIjNBQkZFQTZEMDI5NCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUU3MjhENTAwOTQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0OTEwMDA5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQVXJsRW5jb2RlZCIKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0NTcwMDYzIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJIVFRQQWRkcmVzcyIKLQkJCXF1aWQgICAgICAgCSIzQUMzQkYyNTAwRjUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFNUZFQTkwMUI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0MEQ4MDBDNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUEFkZHJlc3MiCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0MDg5MDFBMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FDM0JGQTcwMTJFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQQWRkcmVzcyIKLQkJCXF1aWQgICAgICAgCSI0MDk4NDA4OTAxQTEiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyIKLQkJCQlxdWlkICAgICAgIAkiNDA5ODQwQTQwMTNBIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQQmluZGluZyIKLQkJCXF1aWQgICAgICAgCSI0MDk4NDNBNzAyRUIiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiNDA5ODQzQ0EwMTc3IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjQwOTg0M0ZGMDJCQiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NDEzMDIwNCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSFRUUFVybEVuY29kZWQiCi0JCQlxdWlkICAgICAgIAkiNDA5ODQ0NTcwMDYzIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQiCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NDZEMDIxQyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSFRUUFVybFJlcGxhY2VtZW50IgotCQkJcXVpZCAgICAgICAJIjQwOTg0NDk2MDBEOCIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0QUMwMUFCIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikpCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0FDMTFFNTIwMUZCIgotCQkJdGl0bGUgICAgICAJIlBvcnQiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBBZGRyZXNzIiBAMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjcyLCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzEsIDcwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUEFkZHJlc3MiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUMzQkYyNTAwRjUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzEsIDc2MykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MDkpCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUEFkZHJlc3MiIEAyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NzIsIDI4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOCwgMjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwNjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUhUVFBBZGRyZXNzIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOCwgMTc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwNjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjQwOTg0MDg5MDFBMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOCwgMjg5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTEwNjUpCi0JCQkJd2lkdGggICAgICAJMTA4NgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDBEODAwQzQiCi0JCQkJY2xpZW50ICAgICAJQDEKLQkJCQlzdXBwbGllciAgIAlAMgotCQkJCWxpbmVfc3R5bGUgCTApKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJFeHRlbnNpYmlsaXR5IgotCQkJcXVpZCAgICAgICAJIjNBRTVGRTNCMDM3QiIKLQkJCXRpdGxlICAgICAgCSJFeHRlbnNpYmlsaXR5IgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTI4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzAsIDUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBBZGRyZXNzIiBANQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDQ4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgNDI4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQQWRkcmVzcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQzNCRjI1MDBGNSIKLQkJCQl3aWR0aCAgICAgIAkzMDYKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBCaW5kaW5nIiBANgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDM0NCwgNTg4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQkZFNTdDMDEzNiIKLQkJCQl3aWR0aCAgICAgIAkyOTAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANwotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDMwNSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjcyLCAzMDUpCi0JCQkJICAgICgyNzIsIDIxNSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUU1RkVBOTAxQjciCi0JCQkJY2xpZW50ICAgICAJQDUKLQkJCQlzdXBwbGllciAgIAlANAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3MiwgNDE2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDMwNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUU1RkYxRDAwMTkiCi0JCQkJY2xpZW50ICAgICAJQDYKLQkJCQlzdXBwbGllciAgIAlANAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3NSwgNTc2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzUsIDMwNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUE9wZXJhdGlvbiIgQDEwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY3MiwgODE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDUxOCwgNzY0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FCRkU2QUUwMDUwIgotCQkJCXdpZHRoICAgICAgCTMyNgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFNUZGNEIwMzdDIgotCQkJCWNsaWVudCAgICAgCUAxMAotCQkJCXN1cHBsaWVyICAgCUA0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjU2LCA3NTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsUmVwbGFjZW1lbnQiIEAxMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MDUsIDk0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUFVybFJlcGxhY2VtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FCRkVBMUEwMTdDIgotCQkJCXdpZHRoICAgICAgCTQ0MAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFNzI4QjgwMkMzIgotCQkJCWNsaWVudCAgICAgCUAxMgotCQkJCXN1cHBsaWVyICAgCUA0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY5LCA5MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2OSwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsRW5jb2RlZCIgQDE0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAwLCAxMTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQVXJsRW5jb2RlZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQkZFQTZEMDI5NCIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTcyOEQ1MDA5NCIKLQkJCQljbGllbnQgICAgIAlAMTQKLQkJCQlzdXBwbGllciAgIAlANAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMDMsIDExMDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMDMsIDMwNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3KSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZyIKLQkJCXF1aWQgICAgICAgCSIzQUU3MkE3MDAwQTkiCi0JCQl0aXRsZSAgICAgIAkiQmluZGluZyIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEJpbmRpbmciIEAxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCA1OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQwLCA1NDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FCRkU1N0MwMTM2IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MCwgNjAwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NSkKLQkJCQl3aWR0aCAgICAgIAkyOTAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBPcGVyYXRpb24iIEAxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTY5NiwgNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDUyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUE9wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQkZFNkFFMDA1MCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCA1ODcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA5KQotCQkJCXdpZHRoICAgICAgCTQyMAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUFVybFJlcGxhY2VtZW50IiBAMTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MTYsIDE4MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNSwgMTc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUFVybFJlcGxhY2VtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FCRkVBMUEwMTdDIgotCQkJCXdpZHRoICAgICAgCTQ0MAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUFVybEVuY29kZWQiIEAxOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjA4LCAxNTIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQzNiwgMTQ2OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUFVybEVuY29kZWQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUJGRUE2RDAyOTQiCi0JCQkJd2lkdGggICAgICAJMzYyCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUEJpbmRpbmciIEAyMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklIVFRQQmluZGluZyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjQwOTg0M0E3MDJFQiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTYxKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTEwNTApCi0JCQkJd2lkdGggICAgICAJMTA3MAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQzRjEwM0MwIgotCQkJCWNsaWVudCAgICAgCUAxNgotCQkJCXN1cHBsaWVyICAgCUAyMAotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUE9wZXJhdGlvbiIgQDIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjk2LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1MCwgMTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUhUVFBPcGVyYXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTAsIDUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjQwOTg0M0ZGMDJCQiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTUwLCAxNjEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5MCkKLQkJCQl3aWR0aCAgICAgIAkxMTEwCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ0NjAyQ0MiCi0JCQkJY2xpZW50ICAgICAJQDE3Ci0JCQkJc3VwcGxpZXIgICAJQDIyCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQVXJsRW5jb2RlZCIgQDI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDEwNDUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTEyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSFRUUFVybEVuY29kZWQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCA5OTUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTEyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0NTcwMDYzIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAxMTA1KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTExMjUpCi0JCQkJd2lkdGggICAgICAJMTE0NgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0OTEwMDA5IgotCQkJCWNsaWVudCAgICAgCUAxOQotCQkJCXN1cHBsaWVyICAgCUAyNAotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUFVybFJlcGxhY2VtZW50IiBAMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDEzNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTgxLCAxMzE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEyMDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUhUVFBVcmxSZXBsYWNlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTgxLCAxMjY3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEyMDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjQwOTg0NDk2MDBEOCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5ODEsIDEzNzcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMTIwMykKLQkJCQl3aWR0aCAgICAgIAkxMjI0Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDREMjAyQzUiCi0JCQkJY2xpZW50ICAgICAJQDE4Ci0JCQkJc3VwcGxpZXIgICAJQDI2Ci0JCQkJbGluZV9zdHlsZSAJMCkpKSkpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzZGwiCi0JCXF1aWQgICAgICAgCSIzQURGQjhFNTAyMUUiCi0JCWRvY3VtZW50YXRpb24gCQotfFRoZSBXU0RMIG1vZGVsIGNvbnRhaW5zIGNsYXNzZXMgZm9yIHRoZSBXZWIgU2VydmljZXMgRGVzY3JpcHRpb24gTGFuZ3VhZ2UgKFdTREwpLgotfAotfFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4KLXwKLXxXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLgotfAotfFRoZSBtb2RlbCBjb250YWlucyB0aGUgZm9sbG93aW5nIGRpYWdyYW1zLCBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBjaGFwdGVycyBpbiB0aGUgV1NETCAxLjEgc3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9OT1RFLXdzZGwtMjAwMTAzMTUpCi18LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUKLXwtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQotfC0gMi4xLjMgRXh0ZW5zaWJpbGl0eSwgc2hvd3MgdGhlIFdTREwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc20KLXwtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwKLXwtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4KLXwKLXxUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4KLQkJCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1QzZBMzAyREQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LiIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyOTYwMEM4IgotCQkJCXJlc3VsdCAgICAgCSJEZWZpbml0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyQjgwMzQ3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRlZmluaXRpb24iCi0JCQkJCXR5cGUgICAgICAgCSJEZWZpbml0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnRhdGlvbkVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDQ0U0NDM2MDJBMyIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0Y5N0RCRDMwMjA3IgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJQb3J0VHlwZSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUM5QjcwMTUwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkQ4MDE5RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OEUwMDIzIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjFFMzAxRTUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0RFQjAzMTYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRGRDAxQkEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUU5REU5ODAwM0MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRTIwMTcxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ3MjYwMUFDIgotCQkJCXR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQkREOTY0MzAwNEMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjIzNTAwM0UiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0UyMjAxQUQiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDUyMDAxMUIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTWVzc2FnZSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUQwNTUwMUM0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg3QzAxRkUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUQyMDIyNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTRCMDJCMCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTQyMDBGMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJQYXJ0IgotCQkJcXVpZCAgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTZEMDJGMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg5N0UyMzAyMzciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBCNzAzQzgiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMDg3MDNEQiIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGVOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBDMzAzQzUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGJpbmRpbmcgZWxlbWVudC4gQSBiaW5kaW5nIGRlZmluZXMgbWVzc2FnZSBmb3JtYXQgYW5kIHByb3RvY29sIGRldGFpbHMgZm9yIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGRlZmluZWQgYnkgYSBwYXJ0aWN1bGFyIHBvcnRUeXBlLiBUaGVyZSBtYXkgYmUgYW55IG51bWJlciBvZiBiaW5kaW5ncyBmb3IgYSBnaXZlbiBwb3J0VHlwZS4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUZBMEYwMkYwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQxMDEyOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg5OTAxNEIiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUY0MDFBMyIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTZEMDE1MSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENERGMDM1QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcuIEFuIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgYmluZGluZydzIHBvcnRUeXBlLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjAwOTIwMkY3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBREU0MDFEQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODlDNENCMDE5OSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJTZXJ2aWNlIgotCQkJcXVpZCAgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NEUwMUI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0OEE0MDE1MSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0ODEwMjIwIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0QzUwMUUyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydCBlbGVtZW50LiBBIHBvcnQgZGVmaW5lcyBhbiBpbmRpdmlkdWFsIGVuZHBvaW50IGJ5IHNwZWNpZnlpbmcgYSBzaW5nbGUgYWRkcmVzcyBmb3IgYSBiaW5kaW5nIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDYwMENCMDBBQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0NTAyQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlBMDAzOTEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBXU0RMIGFsbG93cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JEREY1MzUwMkMzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCQkJcXVpZCAgICAgICAJIjNBRjk1NDNDMDA3MyIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgV1NETCBkb2N1bWVudC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNEZDMjAxMkIiCi0JCQkJcmVzdWx0ICAgICAJIkRPTURvY3VtZW50IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1MERFMDFFNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudCIKLQkJCQkJdHlwZSAgICAgICAJIkRPTURvY3VtZW50IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ3NDAwNEUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjQwMzUyQjdDMDM5NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4NTcwMkY1IgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDBEMDAwRCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFRTU4MDM3QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwRDAzNDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzc5IgotCQkJCXJlc3VsdCAgICAgCSJYU0RTY2hlbWEiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM5NyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzY2hlbWEiCi0JCQkJCXR5cGUgICAgICAgCSJYU0RTY2hlbWEiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTBBMDAzNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MTQwMjExIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2libGVFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCWRvY3VtZW50YXRpb24gCSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkUzQzAzRDQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMTJDMDNDRCIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxNDcwMjk1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dEVsZW1lbnQiCi0JCQkJCXR5cGUgICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MDQwMjVGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTBDMDM1QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzNTAwREQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZGODAxQ0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTFDODIwMDJGMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzRDAzMTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwMjAwMkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUxQjAxMTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QjU5QjAwNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQTQwMjAzIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQjUwM0EyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxRUEwMjBFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNUE0MDI3RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRDkwMEYxIgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNGMTAzMjYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMjAyMDBCRSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5Mzg2MDJDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU3MTAzMzMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTQxMzAzN0YiCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTQyMTAxMDkiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QkY5RTAxNEEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUU5hbWUiCi0JCQlxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NDlEQTkwMDNEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk5hbWVzcGFjZSIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0NEMzAwMzAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QyOTAxQjEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZml4IgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QzMjAyMzYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uVHlwZSIKLQkJCXF1aWQgICAgICAgCSIzQUVCNDc4MjAyNEYiCi0JCQlkb2N1bWVudGF0aW9uIAkKLXxPTkVfV0FZPTEKLXxSRVFVRVNUX1JFU1BPTlNFPTIKLXxTT0xJQ0lUX1JFU1BPTlNFPTMKLXxOT1RJRklDQVRJT049NAotCQkJCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMzNTMwM0UzIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnRUeXBlIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZBQzEwMUNBIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCQUYwMUE0IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkY3MDMxQSIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE2MzIwMDBEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRBNzc2MDBEMSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM0MjAwNjUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM1OTAyOEYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzcxMDJCMSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM4MTAxQjAiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk2Qzk5MDMxRCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJPcmRlciIKLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0RTUwMThEIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyQzQwMTA3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCIKLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRjAwMUQyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3RUUwMDE1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbnB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjMzMTAwRUYiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYzNDcwMjc3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODAwMDAzOSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU91dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTgyOTAyN0QiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQzQTAzNUQiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NDUwMUM4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgzOTAxRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTg2MTAzMUQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ3NTAxMzEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5GYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJTWVzc2FnZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QThBRjAwNEYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk1lc3NhZ2Ugbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIyNDAyNzMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydCIKLQkJCQkJdHlwZSAgICAgICAJIklQYXJ0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIzRDAyMzMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJUGFydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI1NDAyNUUiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcmRlcmVkUGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjYxMDIwRCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0T3JkZXIiCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOEJDMDI2MCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE5M0YwMUJFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODg0NTAwNTIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInZhbHVlIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlleGNlcHRpb25zIAkiV1NETEV4Y2VwdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEwMTAxQzMiCi0JCQkJcmVzdWx0ICAgICAJIklJdGVyYXRvciIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJRTmFtZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTUwMDIzMSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCNDkwMjg3IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5TZXJ2aWNlIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RDU2MDFEMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0IgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NURBMjAwMzYiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NURCMDAxQkMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCODAwMzI2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MUYzMDJCNSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTI2MzAyRjIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUI4QzAwMTYiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUYxNjAxNTMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ09wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUZBNDAxQzUiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkE5MDI4NCIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkJFMDFBOCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSIKLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCQ0YwMzAyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjg0QURDMDAwNzIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBCQzAwNDEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0ZhdWx0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBEOTAwOUQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwRkMwMDYxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTMyRDAwMTciCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzNGMDM3QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iCi0JCQkJCXR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTA5MDBEQSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MUQwMDdGIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdJbnB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTU0NzAyQTYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ091dHB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3V0cHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFERUIwMTAwIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBREZFMDAwRCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFMjEwMTExIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMkQwMDUwIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0ZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNCODRBRTRGMDBCRCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFGMzIwM0RCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRjU2MDI5MiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNCODRCMTI0MDJBQiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjEzNTAzRDEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRGVmaW5pdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRJbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTQ5MDI1OSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbXBvcnREZWYiCi0JCQkJCXR5cGUgICAgICAgCSJJSW1wb3J0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk2RTAwNUUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5QzUwMDQ1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlFNDAxRUUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAic2VydmljZSIKLQkJCQkJdHlwZSAgICAgICAJIklTZXJ2aWNlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTE3MDM4QyIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMzIwMjg2IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNDYwMTNCIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTVDMDBCMCIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlGRTAzN0MiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTc1MDJFNyIKLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW1wb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE4MzAxNEMiCi0JCQkJcmVzdWx0ICAgICAJIklJbXBvcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBOUQwMzNFIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFBRjAyNTQiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFDMjAzQzQiCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUU4MDBFRCIKLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUY4MDI2RCIKLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIwODAxREEiCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjE1MDM5QiIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMzIwMTNBIgotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjQyMDA3NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5ncyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCOTIwMzQxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCQ0QwMDYwIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCRTcwMTQ0IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzE3MDEwNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDM0UwMDFEIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEM2MjAxNEIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4IgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Qzc0MDExNSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENCRTAwNzEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDREEwMUM2IgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHJlZml4IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENGRDAwMTciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4RDIzMDBBOCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThEM0IwM0NFIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUI4MDEyQiIKLQkJCQlyZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUQ3MDNCQiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpb25SZWdpc3RyeSIKLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVGRTAyMDgiCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50QmFzZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ2MTgwMzI4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50QmFzZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlVHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCIKLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwN0UwMDRDIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRDgwMjlBIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBGQTAzMDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiIKLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDk1MDBFRSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJ0eXBlcyIKLQkJCQkJdHlwZSAgICAgICAJIklUeXBlcyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSW1wb3J0IgotCQkJcXVpZCAgICAgICAJIjNCODRCMjAyMDExOSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW1wb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW1wb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjIwQzAyRUEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklMaXN0IgotCQkJcXVpZCAgICAgICAJIjNCODVDMEEyMDNDNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzBBRjAyOTciCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNYXAiCi0JCQlxdWlkICAgICAgIAkiM0I4OTZCMDMwMEQ0IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTWFwIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklVUkwiCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1NjMwMjc0IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLm5ldC5VUkwgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubmV0LlVSTCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1NkUwM0UyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1OTMwMkE1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1OUYwMkU4IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0QzQjAzODAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIgotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENGMzgwM0U2IgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRjdFMDMwMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSXRlcmF0b3IiCi0JCQlxdWlkICAgICAgIAkiM0M0Njg3REEwMTY3IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciIKLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4MDgwMEI5IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRXhjZXB0aW9uIgotCQkJcXVpZCAgICAgICAJIjNDNDY4OTY1MDMxMyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXhjZXB0aW9uIGNsYXNzLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODk3NDAzMTUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5UeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENCRjEwMTczIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQjI0QUVDMDFDQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NDMzYwRDcwMzlDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MjdGMDBCNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NEMTUwMkMwMjNCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRG9jdW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwNjAwMTgyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlUmVmZXJlbmNlIgotCQkJcXVpZCAgICAgICAJIjNGNjc3MURCMDJEQyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzRjY3ODBBMDAxQUIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHJvdGVjdGVkIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCQkJcXVpZCAgICAgICAJIjNBRDVDODI0MDE4QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDMyIKLQkJCQlsYWJlbCAgICAgIAkicG9ydFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUNEIgotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIgotCQkJcXVpZCAgICAgICAJIjNBRDVDRUJFMDBFMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNjEiCi0JCQkJbGFiZWwgICAgICAJImVQYXJ0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1MjAxMEYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTc2IgotCQkJCWxhYmVsICAgICAgCSJlUG9ydFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTgwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiCi0JCQlxdWlkICAgICAgIAkiM0FENUQzRTEwMTc5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ09wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIzOSIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3IgotCQkJcXVpZCAgICAgICAJIjNBRDVENDI1MDM4QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFDIgotCQkJCWxhYmVsICAgICAgCSJlUG9ydHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCODAxMUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCOTAyNEQiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI2MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwMzAxRTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBDMSIKLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MTAxMDQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNTQiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ3MiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3QiIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3QjAzMTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwN0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2VydmljZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA4OSIKLQkJCQlsYWJlbCAgICAgIAkiZVNlcnZpY2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJCQlsYWJlbCAgICAgIAkiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMiCi0JCQlxdWlkICAgICAgIAkiM0FERjJFNjQwMUY1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkU2NTAyNTEiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUiCi0JCQlxdWlkICAgICAgIAkiM0FERjJFQjMwMTYzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ091dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRUI0MDEzRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjciCi0JCQlxdWlkICAgICAgIAkiM0FERjJGOTQwMjREIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5MCIKLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSIKLQkJCXF1aWQgICAgICAgCSIzQURGMkZCODAyRjkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQSIKLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxIgotCQkJcXVpZCAgICAgICAJIjNBREYzMzE2MDFBNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3IgotCQkJCWxhYmVsICAgICAgCSJlRmF1bHRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMyIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzMiCi0JCQlxdWlkICAgICAgIAkiM0FERjM0MDAwM0U1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0ZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0ZhdWx0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzUiCi0JCQlxdWlkICAgICAgIAkiM0FFMDkxRjQwMkYzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM2IgotCQkJCXF1aWQgICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNyIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NTAwMkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM4IgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMjgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTmFtZXNwYWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNENTYwMzMyIgotCQkJCWxhYmVsICAgICAgCSJlTmFtZXNwYWNlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOSIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQTAwMkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQzAxRTgiCi0JCQkJbGFiZWwgICAgICAJImVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDAiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFGMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQxIgotCQkJcXVpZCAgICAgICAJIjNBRUE0MTJGMDAzNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNTUiCi0JCQkJbGFiZWwgICAgICAJImVQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MiIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjVGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDMiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEMjQwMEJEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4MyIKLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3OTAwRjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDYiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NyIKLQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAwQzQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAzMjciCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDgiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OSIKLQkJCXF1aWQgICAgICAgCSIzQjhCMUMxMjAzQjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDFDIgotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTAiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAyNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MSIKLQkJCXF1aWQgICAgICAgCSIzQjhCMURDQzAyRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVTY2hlbWEiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCIKLQkJCQlsYWJlbCAgICAgIAkiZVNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MiIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjdBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTMiCi0JCQlxdWlkICAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkJbGFiZWwgICAgICAJImVUeXBlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTUiCi0JCQlxdWlkICAgICAgIAkiM0M0NjgyOTMwM0U1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTBFIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU2IgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTciCi0JCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCWxhYmVsICAgICAgCSJlSW1wb3J0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTgiCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTkiCi0JCQlxdWlkICAgICAgIAkiM0NDMzYxNDUwMEYyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MCIKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNFIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYxIgotCQkJcXVpZCAgICAgICAJIjNGNzRFNzg0MDFCMSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNGNzRFNzg2MDAwRiIKLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MiIKLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDIzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYzIgotCQkJcXVpZCAgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicGFyZW50IgotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiCi0JCQkJbGFiZWwgICAgICAJInBhcmVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY2hpbGRyZW4iCi0JCQkJcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQyIKLQkJCQlsYWJlbCAgICAgIAkiY2hpbGRyZW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi43IFNlcnZpY2VzIgotCQkJcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyIKLQkJCXRpdGxlICAgICAgCSIyLjcgU2VydmljZXMiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDgwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2MTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiCi0JCQkJd2lkdGggICAgICAJNTIwCi0JCQkJaGVpZ2h0ICAgICAJNDA0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIgQDI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODE2LCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0ODEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIKLQkJCQl3aWR0aCAgICAgIAkyNzgKLQkJCQloZWlnaHQgICAgIAkyMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIiBAMzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciCi0JCQkJd2lkdGggICAgICAJMjQ2Ci0JCQkJaGVpZ2h0ICAgICAJMjY0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAzODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJMzAyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCQkJY2xpZW50ICAgICAJQDMxCi0JCQkJc3VwcGxpZXIgICAJQDMwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQwLCAzNzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAzMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTI2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQ0LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTMwMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCWNsaWVudCAgICAgCUAzMwotCQkJCXN1cHBsaWVyICAgCUAyOAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzAsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzAsIDEwMDIpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDM1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzUsIDg0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJCQl3aWR0aCAgICAgIAkzMDAKLQkJCQloZWlnaHQgICAgIAkxNjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQ1MDJDOSIKLQkJCQljbGllbnQgICAgIAlAMzUKLQkJCQlzdXBwbGllciAgIAlAMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDksIDgyOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODA5LCA2MzcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBAMzcKLQkJCQlsb2NhdGlvbiAgIAkoMzQzLCA5MTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5NDAwMzkzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydHMiIEAzOAotCQkJCQlQYXJlbnRfVmlldyAJQDM3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEzLCA5NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTg5NzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUMiCi0JCQkJCWNsaWVudCAgICAgCUAzNwotCQkJCQlzdXBwbGllciAgIAlAMzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA5MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM5LCA4ODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDgwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDk5MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4NDY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMzcKLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTYsIDc0NCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUQiCi0JCQkJCWNsaWVudCAgICAgCUAzNwotCQkJCQlzdXBwbGllciAgIAlAMzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzQzLCA5MTYpCi0JCQkJCSAgICAoMjU3LCA5MTYpCi0JCQkJCSAgICAoMjU3LCA2NzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBANDUKLQkJCQlsb2NhdGlvbiAgIAkoODg2LCAxMjcwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEA0NgotCQkJCQlQYXJlbnRfVmlldyAJQDQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0ODU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQkJY2xpZW50ICAgICAJQDQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNSwgMTI3MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcwLCAxMzEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQyODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyIiBANDkKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NQotCQkJCQlsb2NhdGlvbiAgIAkoMzgsIDQyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTIsIDExMDYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4Nzk0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI2MSIKLQkJCQkJY2xpZW50ICAgICAJQDQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAzNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4ODYsIDEyNzApCi0JCQkJCSAgICAoODEyLCAxMjcwKQotCQkJCQkgICAgKDgxMiwgOTk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMiwgOTk2KSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi41IEJpbmRpbmdzIgotCQkJcXVpZCAgICAgICAJIjM5QUQ1MTI3MDI1MiIKLQkJCXRpdGxlICAgICAgCSIyLjUgQmluZGluZ3MiCi0JCQl6b29tICAgICAgIAk4NQotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEA1MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTE0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDY0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTM3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPcGVyYXRpb24iIEA1MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDM1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDEzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgODApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJNTY4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IiBANTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIDEzMzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nSW5wdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMjg0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIgotCQkJCXdpZHRoICAgICAgCTI3OAotCQkJCWhlaWdodCAgICAgCTE3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiIEA1NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTYzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxNTg4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIgotCQkJCXdpZHRoICAgICAgCTMxMgotCQkJCWhlaWdodCAgICAgCTE3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIgQDU1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MiwgMTk1OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdGYXVsdCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5MDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiCi0JCQkJd2lkdGggICAgICAJMjkwCi0JCQkJaGVpZ2h0ICAgICAJMTc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDU2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgNDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQl3aWR0aCAgICAgIAk2OTEKLQkJCQloZWlnaHQgICAgIAkzMDEKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBANTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEA1OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNTg3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA1MzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJNDMyCi0JCQkJaGVpZ2h0ICAgICAJMzIyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCQkJY2xpZW50ICAgICAJQDU5Ci0JCQkJc3VwcGxpZXIgICAJQDUxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1MjcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3OSwgNDI4KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDYxCi0JCQkJbG9jYXRpb24gICAJKDEwMzksIDc0MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1MjAxMEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZSIgQDYyCi0JCQkJCVBhcmVudF9WaWV3IAlANjEKLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDksIDc4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTI5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE3NiIKLQkJCQkJY2xpZW50ICAgICAJQDYxCi0JCQkJCXN1cHBsaWVyICAgCUA1NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1OSwgNzQyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTIsIDcxNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0IiBANjUKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MQotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc2LCA2OTcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwOTQ0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE4MCIKLQkJCQkJY2xpZW50ICAgICAJQDYxCi0JCQkJCXN1cHBsaWVyICAgCUA1OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCA3NDIpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEA2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcyLCA4NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQl3aWR0aCAgICAgIAk0NTAKLQkJCQloZWlnaHQgICAgIAkzNzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDE0MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDc2LCAxMjgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMjc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQzIiBANjkKLQkJCQlsb2NhdGlvbiAgIAkoMTI2NCwgMTM1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNDAwQkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDcwCi0JCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQkJbG9jYXRpb24gICAJKDk2LCAyODcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMTMxNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3NTE0OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4MyIKLQkJCQkJY2xpZW50ICAgICAJQDY5Ci0JCQkJCXN1cHBsaWVyICAgCUA1NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDEzNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NCwgMTM5OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5NTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NCIgQDczCi0JCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQkJbG9jYXRpb24gICAJKDk2LCAyODcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDg0IgotCQkJCQljbGllbnQgICAgIAlANjkKLQkJCQkJc3VwcGxpZXIgICAJQDY4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzgxLCAxMzU5KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDE2NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODEyLCAxNTM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NSIgQDc1Ci0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBANzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDUsIDE2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc0NzcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTREIgotCQkJCQljbGllbnQgICAgIAlANzUKLQkJCQkJc3VwcGxpZXIgICAJQDU4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTAyNzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ2IiBANzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSIKLQkJCQkJY2xpZW50ICAgICAJQDc1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDE2NTQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTAwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTksIDkzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQl3aWR0aCAgICAgIAkzNjQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBREU0MDFEQyIKLQkJCQljbGllbnQgICAgIAlAODAKLQkJCQlzdXBwbGllciAgIAlANTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjYsIDkxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTY2LCA2MzYpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBAODIKLQkJCQlsb2NhdGlvbiAgIAkoNDU3LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0UxMDE3OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDgzCi0JCQkJCVBhcmVudF9WaWV3IAlAODIKLQkJCQkJbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM1LCA5MjApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjI1IgotCQkJCQljbGllbnQgICAgIAlAODIKLQkJCQkJc3VwcGxpZXIgICAJQDU5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ1NywgMTAyMikKLQkJCQkJICAgICgyNzYsIDEwMjIpCi0JCQkJCSAgICAoMjc2LCA4NDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDU3LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc2LCA4NDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMwLCA4ODQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPcGVyYXRpb25zIiBAODYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MgotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDk3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ09wZXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxMTY5OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIzOSIKLQkJCQkJY2xpZW50ICAgICAJQDgyCi0JCQkJCXN1cHBsaWVyICAgCUA4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDU3LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEwLCAxMDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2OSwgOTgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODQ5NTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTQsIDEwNjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyNzU2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBAOTAKLQkJCQlsb2NhdGlvbiAgIAkoMTQxOCwgMTA0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNTAzOEEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb24iIEA5MQotCQkJCQlQYXJlbnRfVmlldyAJQDkwCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTA3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA2MDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRjUiCi0JCQkJCWNsaWVudCAgICAgCUA5MAotCQkJCQlzdXBwbGllciAgIAlANjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYzLCAxMDQwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODksIDEwMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NjcyMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOCIgQDk0Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTAKLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjczLCAxMDcwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTU0MjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRkYiCi0JCQkJCWNsaWVudCAgICAgCUA5MAotCQkJCQlzdXBwbGllciAgIAlAODAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTc0LCAxMDQwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMyIgQDk2Ci0JCQkJbG9jYXRpb24gICAJKDc4NywgMTE5MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NDAxRjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nSW5wdXQiIEA5NwotCQkJCQlQYXJlbnRfVmlldyAJQDk2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY5LCAxMTUyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nSW5wdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxMTkwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MSIKLQkJCQkJY2xpZW50ICAgICAJQDk2Ci0JCQkJCXN1cHBsaWVyICAgCUA2OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODcsIDExOTApCi0JCQkJCSAgICAoNjM2LCAxMTkwKQotCQkJCQkgICAgKDYzNiwgMTI3MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzYsIDEyNzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg1LCAxMjIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDA0NzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0IiBAMTAwCi0JCQkJCVBhcmVudF9WaWV3IAlAOTYKLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4NSwgMTE0NCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTIiCi0JCQkJCWNsaWVudCAgICAgCUA5NgotCQkJCQlzdXBwbGllciAgIAlAODAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzg3LCAxMTkwKQotCQkJCQkgICAgKDkyNiwgMTE5MCkKLQkJCQkJICAgICg5MjYsIDEwOTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI2LCAxMDk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODcxLCAxMTM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3NTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEAxMDMKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTMxMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCMzAxNjMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3V0cHV0IiBAMTA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzA2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDUwODIKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiCi0JCQkJCWNsaWVudCAgICAgCUAxMDMKLQkJCQkJc3VwcGxpZXIgICAJQDc0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTUyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTQ3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc0NTkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDEwNwotCQkJCQlQYXJlbnRfVmlldyAJQDEwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgNTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTgzLCAxMTQwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzRCIKLQkJCQkJY2xpZW50ICAgICAJQDEwMwotCQkJCQlzdXBwbGllciAgIAlAODAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxMDk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzMSwgMTE4NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkwMTY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAMTEwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIwLCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzcyLCAxOTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDExMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTg1OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQljbGllbnQgICAgIAlAMTExCi0JCQkJc3VwcGxpZXIgICAJQDU1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwMywgMjAwNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzUzLCAyMDA3KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzMiIEAxMTMKLQkJCQlsb2NhdGlvbiAgIAkoMTM1NiwgMTM1MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMDAzRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nRmF1bHRzIiBAMTE0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEzCi0JCQkJCWxvY2F0aW9uICAgCSgxODgsIDYxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODIsIDE3NTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQSIKLQkJCQkJY2xpZW50ICAgICAJQDExMwotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgMTg0NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDksIDE3OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTE5NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE5MjkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEAxMTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTMKLQkJCQkJc3VwcGxpZXIgICAJQDgwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTYsIDEzNTIpCi0JCQkJCSAgICAoMTM1NiwgMTIxNykKLQkJCQkJICAgICgxMTE3LCAxMjE3KQotCQkJCQkgICAgKDExMTcsIDEwOTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDEwOTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTUyLCAxMTY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcwMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEAxMjEKLQkJCQlsb2NhdGlvbiAgIAkoMTY0MCwgMTk3MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGNDAyRjMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdCIgQDEyMgotCQkJCQlQYXJlbnRfVmlldyAJQDEyMQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjQyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMQotCQkJCQlzdXBwbGllciAgIAlAMTEwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MywgMTk3MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MTgsIDIwMTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MjI3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzYiIEAxMjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEKLQkJCQkJbG9jYXRpb24gICAJKC0zNDQsIDgxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkJCWNsaWVudCAgICAgCUAxMjEKLQkJCQkJc3VwcGxpZXIgICAJQDExMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTcsIDE5NzApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkJCWNsaWVudCAgICAgCUA3NAotCQkJCXN1cHBsaWVyICAgCUA1NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUxQjAxMTMiCi0JCQkJY2xpZW50ICAgICAJQDY4Ci0JCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi40IFBvcnRUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiCi0JCQl0aXRsZSAgICAgIAkiMi40IFBvcnRUeXBlcyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iCi0JCQl6b29tICAgICAgIAk4MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDE3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JCQkJd2lkdGggICAgICAJNzE4Ci0JCQkJaGVpZ2h0ICAgICAJMTk2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iIEAxMjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklPcGVyYXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxMjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiCi0JCQkJd2lkdGggICAgICAJODkxCi0JCQkJaGVpZ2h0ICAgICAJMTg4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxMzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTQzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUlucHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDEzODcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCQkJd2lkdGggICAgICAJNjQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTk0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMTc5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklPdXRwdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTcwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIKLQkJCQl3aWR0aCAgICAgIAk2NzQKLQkJCQloZWlnaHQgICAgIAkxOTQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDEzMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjAyNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCQl3aWR0aCAgICAgIAk2NDQKLQkJCQloZWlnaHQgICAgIAkxOTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTMzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTgsIDY3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJd2lkdGggICAgICAJNjk1Ci0JCQkJaGVpZ2h0ICAgICAJMjgxCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxMzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU3NiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA2OTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNTIwCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDEzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMTM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMTQyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDEzNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJd2lkdGggICAgICAJMjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEAxMzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjE0LCA2MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQl3aWR0aCAgICAgIAk2OTUKLQkJCQloZWlnaHQgICAgIAkzNTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTM5Ci0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDc5NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNDAxOEMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTQwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5Ci0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDc0OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzU5NjQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUNEIgotCQkJCQljbGllbnQgICAgIAlAMTM5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDUsIDc5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzYsIDg2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwMzkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA5MjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjI0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBvcnRUeXBlIiBAMTQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM5Ci0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA3OTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODgsIDc1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUzNDg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTQ2Ci0JCQkJbG9jYXRpb24gICAJKDIxMDcsIDc3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEyRjAwMzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJhbWV0ZXJPcmRlcmluZyIgQDE0NwotCQkJCQlQYXJlbnRfVmlldyAJQDE0NgotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NSwgNjQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NgotCQkJCQlzdXBwbGllciAgIAlAMTM0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzE2LCA3NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjcyLCA4MjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NjYxMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3MSwgODg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMDYyMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDE1MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NgotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1RiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NgotCQkJCQlzdXBwbGllciAgIAlAMTM4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCA3NzMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTUyCi0JCQkJbG9jYXRpb24gICAJKDE3MDIsIDE1MDQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTYwMUE0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHRzIiBAMTUzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUyCi0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3ODk5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODciCi0JCQkJCWNsaWVudCAgICAgCUAxNTIKLQkJCQkJc3VwcGxpZXIgICAJQDEzNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDIwNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDk1ODAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTMsIDE5NjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTUyCi0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjYxLCAxMDY5KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJCQkJY2xpZW50ICAgICAJQDE1MgotCQkJCQlzdXBwbGllciAgIAlAMTM4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MzYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDE2MAotCQkJCWxvY2F0aW9uICAgCSgxMTc4LCAxMjM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRjk0MDI0RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTYwCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMTM0MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxOTgyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiCi0JCQkJCWNsaWVudCAgICAgCUAxNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEzNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc4LCAxMjM0KQotCQkJCQkgICAgKDk4MCwgMTIzNCkKLQkJCQkJICAgICg5ODAsIDE0MTApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDYsIDEzNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NzY2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAxNjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNjAKLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNiwgMTAzNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEzOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc4LCAxMjM0KQotCQkJCQkgICAgKDEyNzcsIDEyMzQpCi0JCQkJCSAgICAoMTI3NywgOTYwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc3LCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk3LCAxMDU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY0MTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTgxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxNjcKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEAxNjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNjcKLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDE2NjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwOTA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQSIKLQkJCQkJY2xpZW50ICAgICAJQDE2NwotCQkJCQlzdXBwbGllciAgIAlAMTM3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDE2NzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzYzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxNzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNjcKLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjcsIDEwMzcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBCIgotCQkJCQljbGllbnQgICAgIAlAMTY3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIzLCAxMDgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTAzNDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZEODAxOUYiCi0JCQkJY2xpZW50ICAgICAJQDEzMwotCQkJCXN1cHBsaWVyICAgCUAxMjgKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkUyMDE3MSIKLQkJCQljbGllbnQgICAgIAlAMTM4Ci0JCQkJc3VwcGxpZXIgICAJQDEyOQotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTc2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkJCWNsaWVudCAgICAgCUAxMzYKLQkJCQlzdXBwbGllciAgIAlAMTMwCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZGODAxQ0QiCi0JCQkJY2xpZW50ICAgICAJQDEzNwotCQkJCXN1cHBsaWVyICAgCUAxMzEKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJCQljbGllbnQgICAgIAlAMTM1Ci0JCQkJc3VwcGxpZXIgICAJQDEzMgotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyMjQsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzcsIDEzMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNTkzCi0JCQkJaGVpZ2h0ICAgICAJMzEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiIEAxODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgMjU0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMjQ2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIKLQkJCQl3aWR0aCAgICAgIAk2NzIKLQkJCQloZWlnaHQgICAgIAkxODAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxODEKLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMjI3NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTgwCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTI0LCAyMjc1KQotCQkJCSAgICAoMTUyNCwgMjQ1NCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJCQljbGllbnQgICAgIAlAMTM1Ci0JCQkJc3VwcGxpZXIgICAJQDE4MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzYsIDIxNzYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzYsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTgxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJCQljbGllbnQgICAgIAlAMTM3Ci0JCQkJc3VwcGxpZXIgICAJQDE4MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNzEsIDE4NTQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTgxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJCQljbGllbnQgICAgIAlAMTM2Ci0JCQkJc3VwcGxpZXIgICAJQDE4MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MCwgMTUzNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAyMjc1KQotCQkJCWRyYXdTdXBwbGllciAJQDE4MSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEAxODUKLQkJCQlsb2NhdGlvbiAgIAkoMjIwNiwgMjI1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NDAxQjEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMTg2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTg1Ci0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY4LCAxNjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTIyMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkJCQljbGllbnQgICAgIAlAMTg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNzkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2MCwgMTY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MiIgQDE4OQotCQkJCQlQYXJlbnRfVmlldyAJQDE4NQotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAyMyIKLQkJCQkJY2xpZW50ICAgICAJQDE4NQotCQkJCQlzdXBwbGllciAgIAlAMTgwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIyMDYsIDIyNTkpCi0JCQkJCSAgICAoMjIwNiwgMjU1NikKLQkJCQkJICAgICgxODU2LCAyNTU2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU2LCAyNTU2KSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xIERlZmluaXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNDhBMDI2MiIKLQkJCXRpdGxlICAgICAgCSIyLjEgRGVmaW5pdGlvbnMiCi0JCQl6b29tICAgICAgIAk4MwotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAxOTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxOTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDExMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkJCQl3aWR0aCAgICAgIAk3MDYKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMTkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NiwgODk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQl3aWR0aCAgICAgIAkyOTQKLQkJCQloZWlnaHQgICAgIAkxMjAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDE5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDU0NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTE4MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MDAsIDEwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE5NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MDgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDEzNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCXdpZHRoICAgICAgCTQ0MgotCQkJCWhlaWdodCAgICAgCTI4MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDE5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMjQsIDE2MDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMTk2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTUyOAotCQkJCWhlaWdodCAgICAgCTQyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDE5NwotCQkJCWxvY2F0aW9uICAgCSgxMzU4LCA4NjApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDE5OAotCQkJCQlQYXJlbnRfVmlldyAJQDE5NwotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDUzNSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJCWNsaWVudCAgICAgCUAxOTcKLQkJCQkJc3VwcGxpZXIgICAJQDE5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1OCwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwMywgNTExKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTY2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDIwMQotCQkJCQlQYXJlbnRfVmlldyAJQDE5NwotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODYsIDkwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3OTA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDE5NwotCQkJCQlzdXBwbGllciAgIAlAMTkxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTgsIDg2MCkKLQkJCQkJICAgICgxMzU4LCA5NDgpCi0JCQkJCSAgICAoMTY3NywgOTQ4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDk0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDk4NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkyNjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMjA0Ci0JCQkJbG9jYXRpb24gICAJKDE2MTIsIDU5NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMjA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjA0Ci0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTEyKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQkJY2xpZW50ICAgICAJQDIwNAotCQkJCQlzdXBwbGllciAgIAlAMTk2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTIsIDU5NSkKLQkJCQkJICAgICgxNDY0LCA1OTUpCi0JCQkJCSAgICAoMTQ2NCwgNDUzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjQsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU4NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDIwOAotCQkJCQlQYXJlbnRfVmlldyAJQDIwNAotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTIsIDU1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgwMzM1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCQljbGllbnQgICAgIAlAMjA0Ci0JCQkJCXN1cHBsaWVyICAgCUAxOTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDEsIDU5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDY1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQxMDA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIyNTk0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDIxMgotCQkJCWxvY2F0aW9uICAgCSgxMjc5LCAxMTM3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAyMTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTIKLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCQkJY2xpZW50ICAgICAJQDIxMgotCQkJCQlzdXBwbGllciAgIAlAMTk2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3OSwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDQ5NzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDIxNgotCQkJCQlQYXJlbnRfVmlldyAJQDIxMgotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJCQljbGllbnQgICAgIAlAMjEyCi0JCQkJCXN1cHBsaWVyICAgCUAxOTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI3OSwgMTEzNykKLQkJCQkJICAgICgxMjc5LCAxMjA4KQotCQkJCQkgICAgKDE4OTEsIDEyMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzNDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTcsIDEyNDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDQwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDIyMAotCQkJCWxvY2F0aW9uICAgCSgxMjEyLCAxMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjcxMDEwNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAyMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMjAKLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDU5NCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNEEiCi0JCQkJCWNsaWVudCAgICAgCUAyMjAKLQkJCQkJc3VwcGxpZXIgICAJQDE5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYyNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU3OTYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGVzIiBAMjI0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjIwCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkxLCAxNDUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyMzY5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCQkJY2xpZW50ICAgICAJQDIyMAotCQkJCQlzdXBwbGllciAgIAlAMTk0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTIsIDExNTkpCi0JCQkJCSAgICAoMTIxMiwgMTQ5MCkKLQkJCQkJICAgICgxNTg3LCAxNDkwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg3LCAxNDkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMywgMTQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI1NjExCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU4NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEAyMjgKLQkJCQlsb2NhdGlvbiAgIAkoMTExNCwgMTU4NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBAMjI5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjI4Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCA2ODApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzcxIgotCQkJCQljbGllbnQgICAgIAlAMjI4Ci0JCQkJCXN1cHBsaWVyICAgCUAxOTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE0LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTU1LCA3NTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjcwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdzIiBAMjMyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjI4Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUxLCAxNjc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5ncyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY2MzQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkJCQljbGllbnQgICAgIAlAMjI4Ci0JCQkJCXN1cHBsaWVyICAgCUAxOTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTExNCwgMTU4NSkKLQkJCQkJICAgICgxMTE0LCAxNzE2KQotCQkJCQkgICAgKDIxMTUsIDE3MTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDE3MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDUwNzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTQsIDE3NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMTA3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIzNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjgsIDE5MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjM3Ci0JCQkJbG9jYXRpb24gICAJKDEwNjYsIDE1MzMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0IwMzExIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIzOAotCQkJCQlQYXJlbnRfVmlldyAJQDIzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDY2OSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwN0YiCi0JCQkJCWNsaWVudCAgICAgCUAyMzcKLQkJCQkJc3VwcGxpZXIgICAJQDE5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMDksIDc1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzE5Njk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2VydmljZXMiIEAyNDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMzcKLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkzLCAyMDI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTZXJ2aWNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkxODI0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJCQljbGllbnQgICAgIAlAMjM3Ci0JCQkJCXN1cHBsaWVyICAgCUAyMzYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA2NiwgMTUzMykKLQkJCQkJICAgICgxMDY2LCAyMDU5KQotCQkJCQkgICAgKDE2MTksIDIwNTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDIwNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU0LCAyMDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDAxOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyMDUxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI0NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJCQljbGllbnQgICAgIAlAMTk2Ci0JCQkJc3VwcGxpZXIgICAJQDE5MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDI2MykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg1LCAyNjMpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkJCXF1aWQgICAgICAgCSIzQUQ2MEM1MTAxOTIiCi0JCQl0aXRsZSAgICAgIAkiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkJCXpvb20gICAgICAgCTgwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMjQ2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTQsIDE1MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJMTgyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAMjQ3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTg4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyNDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzQyLCAxNjc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCXdpZHRoICAgICAgCTE4MgotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjQ5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMjMzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMjI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDI1MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDczNiwgMTc2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYzLCAxNzA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCXdpZHRoICAgICAgCTM2NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCAxMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkJCXdpZHRoICAgICAgCTgwNAotCQkJCWhlaWdodCAgICAgCTE3MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAMjUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxOTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDE4OTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQl3aWR0aCAgICAgIAkyNzQKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyNTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAyMTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NjMsIDIwOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJd2lkdGggICAgICAJMzA4Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjU0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTIzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQl3aWR0aCAgICAgIAkyMjIKLQkJCQloZWlnaHQgICAgIAkxNDYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjU1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM1LCAxMzU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjU2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA1ODApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJCXdpZHRoICAgICAgCTU2MAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNTcKLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ4MCwgMTAzOSkKLQkJCQkgICAgKDQ4MCwgODA4KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjU4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkJCWNsaWVudCAgICAgCUAyNDcKLQkJCQlzdXBwbGllciAgIAlAMjU2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2NiwgMTgyNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjU5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkJCWNsaWVudCAgICAgCUAyNTMKLQkJCQlzdXBwbGllciAgIAlAMjU2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NywgMjA3OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NywgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkJCWNsaWVudCAgICAgCUAyNDkKLQkJCQlzdXBwbGllciAgIAlAMjU2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxOSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIgotCQkJCWNsaWVudCAgICAgCUAyNTIKLQkJCQlzdXBwbGllciAgIAlAMjU2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTg4LCAxODg3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYwMDkyMDJGNyIKLQkJCQljbGllbnQgICAgIAlAMjUwCi0JCQkJc3VwcGxpZXIgICAJQDI1NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc5NywgMTY5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk3LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJY2xpZW50ICAgICAJQDI0NgotCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwMSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjY0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkJCWNsaWVudCAgICAgCUAyNTQKLQkJCQlzdXBwbGllciAgIAlAMjU2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExLCAxMjIzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQljbGllbnQgICAgIAlAMjU1Ci0JCQkJc3VwcGxpZXIgICAJQDI1NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQxNCwgMTM0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEyMDAyNUUiCi0JCQkJY2xpZW50ICAgICAJQDI0OAotCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI5LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDU4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJd2lkdGggICAgICAJNTYzCi0JCQkJaGVpZ2h0ICAgICAJMjM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMjY4Ci0JCQkJbG9jYXRpb24gICAJKDExOTEsIDY3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjY5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODQ3LCA2MzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCQljbGllbnQgICAgIAlAMjY4Ci0JCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODMwLCA2MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzOTY5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI3MgotCQkJCQlQYXJlbnRfVmlldyAJQDI2OAotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTUsIDUyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzkwNzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCQljbGllbnQgICAgIAlAMjY4Ci0JCQkJCXN1cHBsaWVyICAgCUAyNjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTYsIDYyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYzLCA3NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjQ3OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiIEAyNzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDg0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJXU0RMRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCQl3aWR0aCAgICAgIAk3NzQKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjc3Ci0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDQwMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMjc2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMDA4LCA0MDIpCi0JCQkJICAgICgxMDA4LCAzMTIpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkUzQzAzRDQiCi0JCQkJY2xpZW50ICAgICAJQDI1NgotCQkJCXN1cHBsaWVyICAgCUAyNzYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTIsIDU2OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDkyLCA0MDIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjc3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJCQljbGllbnQgICAgIAlAMjY3Ci0JCQkJc3VwcGxpZXIgICAJQDI1MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTUsIDU3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNSwgMjQ2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyODAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCQkJY2xpZW50ICAgICAJQDI2NwotCQkJCXN1cHBsaWVyICAgCUAyNzYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCA1NzEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMTYsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDEzMDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk1ODgKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyODIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFFQzAxQ0IiCi0JCQkJY2xpZW50ICAgICAJQDI4MQotCQkJCXN1cHBsaWVyICAgCUAyNjcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDI4MwotCQkJCWxvY2F0aW9uICAgCSgyMzExLCAxNjg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGFyZW50IiBAMjg0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjgzCi0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjIsIDEzMzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFyZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkIiCi0JCQkJCWNsaWVudCAgICAgCUAyODMKLQkJCQkJc3VwcGxpZXIgICAJQDI4MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzExLCAxNjg2KQotCQkJCQkgICAgKDI0MzIsIDE2ODYpCi0JCQkJCSAgICAoMjQzMiwgMTM3NCkKLQkJCQkJICAgICgyMzEwLCAxMzc0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzEwLCAxMzc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2NiwgMTQyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDI4NwotCQkJCQlQYXJlbnRfVmlldyAJQDI4MwotCQkJCQlsb2NhdGlvbiAgIAkoMjc5LCAyOTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODk5LCAxNTM3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NoaWxkcmVuIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTg1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTExOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJCQljbGllbnQgICAgIAlAMjgzCi0JCQkJCXN1cHBsaWVyICAgCUAyODEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjMxMSwgMTY4NikKLQkJCQkJICAgICgyMDE2LCAxNjg2KQotCQkJCQkgICAgKDIwMTYsIDE0MjUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjMxMSwgMTY4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTYsIDE0MjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDcwLCAxNDgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyIKLQkJCXF1aWQgICAgICAgCSIzQUU4RUQ3MjAxQkQiCi0JCQl0aXRsZSAgICAgIAkiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCQkJem9vbSAgICAgICAJOTAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAyOTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW1wb3J0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkJCXdpZHRoICAgICAgCTU5OAotCQkJCWhlaWdodCAgICAgCTIxOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMjkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDExMzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgMTA0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTmFtZXNwYWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJCXdpZHRoICAgICAgCTQ3OQotCQkJCWhlaWdodCAgICAgCTIxNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAyOTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgMTE0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTY5NAotCQkJCWhlaWdodCAgICAgCTE3MwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMzIwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM3IiBAMjk0Ci0JCQkJbG9jYXRpb24gICAJKDMwOSwgNzg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU5hbWVzcGFjZXMiIEAyOTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAyOTQKLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYxLCA5NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU5hbWVzcGFjZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5ODg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMzIiCi0JCQkJCWNsaWVudCAgICAgCUAyOTQKLQkJCQkJc3VwcGxpZXIgICAJQDI5MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDk3MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY4NzA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDkxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI1MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDI5OQotCQkJCQlQYXJlbnRfVmlldyAJQDI5NAotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNjgsIDU5MikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzI4IgotCQkJCQljbGllbnQgICAgIAlAMjk0Ci0JCQkJCXN1cHBsaWVyICAgCUAyOTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCA1NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzksIDU4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ0OTYxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAzMDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDcyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NSwgNTgwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQkJd2lkdGggICAgICAJNDUyCi0JCQkJaGVpZ2h0ICAgICAJMzA0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUxIiBAMzAzCi0JCQkJbG9jYXRpb24gICAJKDE0ODYsIDEwMDEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0MwMkU1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2NoZW1hIiBAMzA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzAzCi0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxMDE4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyNzAiCi0JCQkJCWNsaWVudCAgICAgCUAzMDMKLQkJCQkJc3VwcGxpZXIgICAJQDI5MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg2LCAxMDAxKQotCQkJCQkgICAgKDE2MzIsIDEwMDEpCi0JCQkJCSAgICAoMTYzMiwgMTEzMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCAxMDAxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMiwgMTEzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTIiIEAzMDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDMKLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCQkJCWNsaWVudCAgICAgCUAzMDMKLQkJCQkJc3VwcGxpZXIgICAJQDMwMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODYsIDg3MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAzMDgKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgNDAzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUEzRTNBMDAyRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDAiIEAzMDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDgKLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDYsIDQ4MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUYyIgotCQkJCQljbGllbnQgICAgIAlAMzA4Ci0JCQkJCXN1cHBsaWVyICAgCUAzMDIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA4NywgNDAzKQotCQkJCQkgICAgKDEzNjQsIDQwMykKLQkJCQkJICAgICgxMzY0LCA1NjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NCwgNTY4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZURlZmluaXRpb24iIEAzMTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDgKLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNSwgMzYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42Mzc1MzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRTgiCi0JCQkJCWNsaWVudCAgICAgCUAzMDgKLQkJCQkJc3VwcGxpZXIgICAJQDI5MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ1LCA0MDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDQ1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE0OTEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMzE0Ci0JCQkJbG9jYXRpb24gICAJKDczNywgODI2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAzMTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTQKLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1MiwgNjQ3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiCi0JCQkJCWNsaWVudCAgICAgCUAzMTQKLQkJCQkJc3VwcGxpZXIgICAJQDI5MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3MzcsIDgyNikKLQkJCQkJICAgICg1MTAsIDgyNikKLQkJCQkJICAgICg1MTAsIDU0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDU3LCA1OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAzMTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTQKLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDQsIDc3MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk5MTg5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCQljbGllbnQgICAgIAlAMzE0Ci0JCQkJCXN1cHBsaWVyICAgCUAzMDIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI0NiwgODI2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4MCwgODc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIyMTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNjIsIDkzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMyMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDBEMDM0MCIKLQkJCQljbGllbnQgICAgIAlAMzAyCi0JCQkJc3VwcGxpZXIgICAJQDI5MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTUsIDU2OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgMzMzKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMiBUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQjg1QUU1OTAzN0UiCi0JCQl0aXRsZSAgICAgIAkiMi4yIFR5cGVzIgotCQkJem9vbSAgICAgICAJOTAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJODEKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMzIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxMjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTUsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTUwMAotCQkJCWhlaWdodCAgICAgCTE3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAzMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTYwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTA2LCAxNTMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTYyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMzI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxOTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDIyLCAxODI4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCXdpZHRoICAgICAgCTUzNQotCQkJCWhlaWdodCAgICAgCTMwNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDMyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDEwNjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNDY2Ci0JCQkJaGVpZ2h0ICAgICAJMjU4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ3IiBAMzI3Ci0JCQkJbG9jYXRpb24gICAJKDczNSwgMTE3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAwQzQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBAMzI4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzI3Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NSwgMTEzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5MDA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzI3IgotCQkJCQljbGllbnQgICAgIAlAMzI3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NiwgMTE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzOSwgMTIwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg4NzA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0OCIgQDMzMQotCQkJCQlQYXJlbnRfVmlldyAJQDMyNwotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2NzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkJCQljbGllbnQgICAgIAlAMzI3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4NSwgMTE3MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDkiIEAzMzIKLQkJCQlsb2NhdGlvbiAgIAkoNTI3LCAxNTkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxQzEyMDNCMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9uIiBAMzMzCi0JCQkJCVBhcmVudF9WaWV3IAlAMzMyCi0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjYsIDE1NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzUzOTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCQkJCWNsaWVudCAgICAgCUAzMzIKLQkJCQkJc3VwcGxpZXIgICAJQDMyNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk3LCAxNTkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA3LCAxNjQ1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTU4NzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUwIiBAMzM2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzMyCi0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDI2IgotCQkJCQljbGllbnQgICAgIAlAMzMyCi0JCQkJCXN1cHBsaWVyICAgCUAzMjYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTI3LCAxNTkyKQotCQkJCQkgICAgKDQzNywgMTU5MikKLQkJCQkJICAgICg0MzcsIDEzMTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAxMzEzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NSIgQDMzNwotCQkJCWxvY2F0aW9uICAgCSgzMjIsIDE5MTEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTMwM0U1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDMzOAotCQkJCQlQYXJlbnRfVmlldyAJQDMzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM4LCAxODcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDg1NjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCQkJCWNsaWVudCAgICAgCUAzMzcKLQkJCQkJc3VwcGxpZXIgICAJQDMyNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTkxMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MywgMTk2NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NiIgQDM0MQotCQkJCQlQYXJlbnRfVmlldyAJQDMzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDExOCIKLQkJCQkJY2xpZW50ICAgICAJQDMzNwotCQkJCQlzdXBwbGllciAgIAlAMzI2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDMyMiwgMTkxMSkKLQkJCQkJICAgICgyMjksIDE5MTEpCi0JCQkJCSAgICAoMjI5LCAxMzEzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOSwgMTMxMykpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMzQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDYwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA1MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCXdpZHRoICAgICAgCTM4OQotCQkJCWhlaWdodCAgICAgCTIxNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDM0MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTIyMgotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDM0NAotCQkJCWxvY2F0aW9uICAgCSgyMzQsIDYwNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDM0NQotCQkJCQlQYXJlbnRfVmlldyAJQDM0NAotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA2NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDcKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NjEwMTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkJCWNsaWVudCAgICAgCUAzNDQKLQkJCQkJc3VwcGxpZXIgICAJQDM0MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDYsIDYwNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNiwgNTY5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM4ODMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzQ4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQ0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzMsIDMxMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJCWNsaWVudCAgICAgCUAzNDQKLQkJCQkJc3VwcGxpZXIgICAJQDM0MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQsIDYwNCkKLQkJCQkJICAgICgxNzQsIDYwNCkKLQkJCQkJICAgICgxNzQsIDIyNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMjI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCAyNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzcyOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIiBAMzUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDIwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVR5cGVzIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAxNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiCi0JCQkJd2lkdGggICAgICAJMjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMTY2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDM1MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTcyOCwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzU5LCA3NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzM5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIgotCQkJCXdpZHRoICAgICAgCTc1NwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzNTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTIxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyOSwgMTEwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTY3MwotCQkJCWhlaWdodCAgICAgCTI1MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OSIgQDM1NAotCQkJCWxvY2F0aW9uICAgCSgxODI2LCA5NzUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDUwMEYyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDM1NQotCQkJCQlQYXJlbnRfVmlldyAJQDM1NAotCQkJCQlsb2NhdGlvbiAgIAkoMzA2LCA0NDcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNEIgotCQkJCQljbGllbnQgICAgIAlAMzU0Ci0JCQkJCXN1cHBsaWVyICAgCUAzNTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDg1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzQsIDkwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjU2NDg5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEAzNTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTQKLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNiwgMTAzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNzU3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0UiCi0JCQkJCWNsaWVudCAgICAgCUAzNTQKLQkJCQkJc3VwcGxpZXIgICAJQDM1MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgMTA5MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODgsIDEwNTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1MTUxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQURDRDNCMDM4MCIKLQkJCQljbGllbnQgICAgIAlAMzQyCi0JCQkJc3VwcGxpZXIgICAJQDM1MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwNSwgNTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDUsIDMwNykpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDM2MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgMjI0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDEzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQkJd2lkdGggICAgICAJNTAwCi0JCQkJaGVpZ2h0ICAgICAJMjEyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzYyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCWNsaWVudCAgICAgCUAzNDIKLQkJCQlzdXBwbGllciAgIAlAMzYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU0LCA1MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NCwgMzMwKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDQ2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgMzY4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCQl3aWR0aCAgICAgIAk2ODcKLQkJCQloZWlnaHQgICAgIAkyMTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAzNjQKLQkJCQlsb2NhdGlvbiAgIAkoMTIwNiwgNDkzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAzNjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNjQKLQkJCQkJbG9jYXRpb24gICAJKC01ODYsIDIzNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzYsIDM4NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCQljbGllbnQgICAgIAlAMzY0Ci0JCQkJCXN1cHBsaWVyICAgCUAzNjEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIwNiwgNDkzKQotCQkJCQkgICAgKDEwOTQsIDQ5MykKLQkJCQkJICAgICgxMDk0LCAzMzApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMzMwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0MiwgMzc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjgzMjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAzNjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNjQKLQkJCQkJbG9jYXRpb24gICAJKC01ODYsIDIzNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExOTYsIDQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDM5NzExCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCQljbGllbnQgICAgIAlAMzY0Ci0JCQkJCXN1cHBsaWVyICAgCUAzNjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODEsIDQ5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTUsIDU0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY0OTU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzk2LCAzOTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NDkxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNzIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjI3RjAwQjciCi0JCQkJY2xpZW50ICAgICAJQDM1MgotCQkJCXN1cHBsaWVyICAgCUAzNjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODEyLCA3NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDU3MikpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjMgTWVzc2FnZXMiCi0JCQlxdWlkICAgICAgIAkiM0JDRTg1M0QwMkM4IgotCQkJdGl0bGUgICAgICAJIjIuMyBNZXNzYWdlcyIKLQkJCXpvb20gICAgICAgCTg1Ci0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSIgQDM3MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzczCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDEyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU1lc3NhZ2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzczCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIgotCQkJCXdpZHRoICAgICAgCTM4MAotCQkJCWhlaWdodCAgICAgCTMyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiIEAzNzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCAxMjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklQYXJ0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgNzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiCi0JCQkJd2lkdGggICAgICAJNjE3Ci0JCQkJaGVpZ2h0ICAgICAJMzI0Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzNzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDgxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgNjkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCXdpZHRoICAgICAgCTQ5MgotCQkJCWhlaWdodCAgICAgCTI3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOTZEMDJGMSIKLQkJCQljbGllbnQgICAgIAlAMzc1Ci0JCQkJc3VwcGxpZXIgICAJQDM3NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDQsIDY3OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwNCwgMzg2KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzNzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDUwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQl3aWR0aCAgICAgIAk0MzIKLQkJCQloZWlnaHQgICAgIAkzMjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThEMTAyQkEiCi0JCQkJY2xpZW50ICAgICAJQDM3NwotCQkJCXN1cHBsaWVyICAgCUAzNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDUsIDQ5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCAzODgpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBAMzc5Ci0JCQkJbG9jYXRpb24gICAJKDY4OCwgOTUyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRUJFMDBFMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcnRzIiBAMzgwCi0JCQkJCVBhcmVudF9WaWV3IAlAMzc5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgODk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk3NDUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkYwMDYxIgotCQkJCQljbGllbnQgICAgIAlAMzc5Ci0JCQkJCXN1cHBsaWVyICAgCUAzNzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgOTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMDA1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODk4MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTA2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQyMDM4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMiIgQDM4NAotCQkJCQlQYXJlbnRfVmlldyAJQDM3OQotCQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MDQsIDg5MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNTciCi0JCQkJCWNsaWVudCAgICAgCUAzNzkKLQkJCQkJc3VwcGxpZXIgICAJQDM3NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2ODgsIDk1MikKLQkJCQkJICAgICg0NDUsIDk1MikKLQkJCQkJICAgICg0NDUsIDgxNykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgODE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzkzLCA5MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NzYwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpKSkKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAieHNkIgotCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJYU0QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJvcmcuZWNsaXBzZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJInhzZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHNkLzIwMDIvWFNEIikpCi0JCXF1aWQgICAgICAgCSIzOUFCREM2RjAxQUEiCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBbm5vdGF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5RTE3NzAxMTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0RTIwMzY2IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFwcGxpY2F0aW9uSW5mb3JtYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUJGMDJDOCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2VySW5mb3JtYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUVBMDE1NyIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVzIgotCQkJCXF1aWQgICAgICAgCSIzQkJGN0YwNTAxRTIiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIkRPTUF0dHIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5QjdEQzAxOTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTYxMDNCRSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODdGNTIwMkI0IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzJEOEUyMDBFQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDNBMDIyMSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRUIwMkE4IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y3QjAzODYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3MzcwMzhGIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjcyRDdCQjAzNDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNDRjMwMjdEIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0REQjAzQjciCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0RFMDAyRDgiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnN0cmFpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IwMjIwMzgyIgotCQkJCXR5cGUgICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjcxOUQ5MDM0MSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RCb3VuZGVkRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjNDMDIyNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1MkEwMENDIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDYXJkaW5hbGl0eUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0RjAxMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTZDMDE1MyIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ2FyZGluYWxpdHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QjgwMjg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCQUEyMDMxMCIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcml2YXRpb25NZXRob2QiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzZFNDAyMEUiCi0JCQkJdHlwZSAgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiCi0JCQkJaW5pdHYgICAgICAJInJlc3RyaWN0aW9uIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzcxRDAyNkEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNzM4MDBDNSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0E0MjAyQjgiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQjhBMDNFNiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2MTgwMTREIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRkI5NzAwNkUiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MzMUFGNUUwM0E2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEREI1MDFBNSIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljIgotCQkJcXVpZCAgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRDRDMEY0QzAxQTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldmVyaXR5IgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjkxQzAwNUQiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpYWdub3N0aWNTZXZlcml0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNUZERDAyODAiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NDMwMTZCIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGluZSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYwN0UwMjEzIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29sdW1uIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjExRTAyOTYiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub2RlIgotCQkJCXF1aWQgICAgICAgCSIzQzAxNkI2QjAyMDAiCi0JCQkJdHlwZSAgICAgICAJIkRPTU5vZGUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW5ub3RhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NEYwMTg2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2NjAzMzkiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5pbGxhYmxlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGQjQwMjlGIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzQ2ODAzNjgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0QTAwM0I5IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRFMDAwMEUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNEMwMEIyIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTY4MDFDMSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RjYyMDNDRiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaXJjdWxhciIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzM0RENCMDAwMTgiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVudW1lcmF0aW9uRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzlEMDNDNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M2NDAwNTQiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2RDI1NjgwMjU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzM3NDAyNTMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWNldE5hbWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODlGQjQwMUVDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWZmZWN0aXZlVmFsdWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEFBRTMwM0I2IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmVhdHVyZSIKLQkJCXF1aWQgICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODEwMjBGIgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODgwMEM1IgotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZvcm0iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTAyQjAzM0UiCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzI3MUExQjAxNkYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJnbG9iYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwMDcwMzcyIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZlYXR1cmVSZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwNDQwMTg1IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGaXhlZEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2OTlFMDBDMSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4ODAxQjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZBNjAwMjAxIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3OUJFMDJFRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I5OTAwMTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUQyMDA4QSIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2OUU4MDFENiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM3QjAzOTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBQTMwMjQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxQzcwMTQzIgotCQkJCXR5cGUgICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW1wb3J0IgotCQkJcXVpZCAgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEOTAwM0UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQjE1MDM2QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbmNsdWRlIgotCQkJcXVpZCAgICAgICAJIjNCNjg4QzdEMDI1MCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEQzAzODEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIgotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RMZW5ndGhGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3ODAwMkRGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc2QzAwNEIiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RXhjbHVzaXZlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4OTYwMEMyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjhFMDMwOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMzEwM0FEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzBBMUVFMjAxRjciCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE3NDAyN0QiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTkzMDM1NCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4SW5jbHVzaXZlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4N0QwMERBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjgzMDNCOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhMZW5ndGhGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCN0QwMEZDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdEQTAwRjMiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRXhjbHVzaXZlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5MkQwMDBBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjU5MDI4MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5GYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMjQwMDk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzBBMUVEMTAzOTgiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFBMjAwOEUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUJFMDNFMiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluSW5jbHVzaXZlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4ODcwMkM5IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjUyMDM1MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5MZW5ndGhGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3QzQwMEMwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc5OTAxNUUiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETW9kZWxHcm91cCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbXBvc2l0b3IiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjFEMDFDRiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcG9zaXRvciIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkUyMDM4MSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QkQyNTUwMzg1IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FDNDAwOTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUY2MDJFOCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZWRDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDRUEyMDE5NyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzAwMDE0MiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDQwMzFFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNOYW1lIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTdGMDEyNyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVSSSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU4NzAwRTIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc1VSSSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTVBQTAyQUYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDk2MzAyNUUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETm90YXRpb25EZWNsYXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ5NDMwMkYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNEYwMjNDIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JZGVudGlmaWVyIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMyRTAwRjAiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWNJZGVudGlmaWVyIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMzNDAzOTciCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETnVtZXJpY0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0MjAwNzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NUEzMDAxMiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY1OTAxMkMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NEY2MDJEQSIKLQkJCQl0eXBlICAgICAgIAkiWFNET3JkZXJlZCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGUiCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEZDMDFFNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1pbk9jY3VycyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjhFMDNCMiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1heE9jY3VycyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjk5MDNBRSIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QkQyMjMwMEM2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzgwQkQ5MDA1OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXR0ZXJuRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Q0E1MDM4RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M3OTAzMTEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZENEJBMDIzQyIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaXJjdWxhciIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTY4MDAyMTYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmUiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQjY0MDI0MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYSIKLQkJCXF1aWQgICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNDNEEwMTgyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0RTUwM0REIgotCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODY4RUMwMjI2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjlGOUJGRjAxODAiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDRCMDEwMiIKLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSIKLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudEZvcm1EZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNzgwMEFDIgotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIgotCQkJCWluaXR2ICAgICAgCSJ1bnF1YWxpZmllZCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbERlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwQzRBNzAwMzgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNTlEMDJEOCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0QyMkQ2RDgwMzU2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQlxdWlkICAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQjU2MDA5MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4OENCODAwQkEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RTYwMzcyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCXF1aWQgICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRDlCMzAzMzAiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NvcGUiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjU1MDMyQiIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzMxNTgwMEE5IgotCQkJCXR5cGUgICAgICAgCSJYU0RWYXJpZXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkJCXF1aWQgICAgICAgCSIzQjZENTQ0RjAxNDYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjVFMDM1QSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsaWRGYWNldHMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQjBGMDBCNiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUZXJtIgotCQkJcXVpZCAgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhBQTAxRDMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QkQyNDQwMDY5IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNjEwMzM3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlBQjAyMzIiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVHlwZURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkY1MDEzQSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2VGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NjIwMDQ1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg1MDAyMDEiCi0JCQkJdHlwZSAgICAgICAJIlhTRFdoaXRlU3BhY2UiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdpbGRjYXJkIgotCQkJcXVpZCAgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDBFOTAxOUUiCi0JCQkJdHlwZSAgICAgICAJIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50IgotCQkJCXF1aWQgICAgICAgCSIzQjk3Q0Y4NjAyMjMiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9jZXNzQ29udGVudHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDEyRTAxRTQiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2Nlc3NDb250ZW50cyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCREI3MDFGOSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4NEY3MDA5MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ5MDE1MDNERSIKLQkJCQl0eXBlICAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjdCQkJFMTAxQjEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NQXR0ciIKLQkJCXF1aWQgICAgICAgCSIzQkJGOEM4OTAxQjYiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkF0dHIiCi0JCQkJcXVpZCAgICAgICAJIjNCQkY4Q0IwMDBENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCIKLQkJCXF1aWQgICAgICAgCSIzQzI3ODUwRTAzODEiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQzI3ODUxQjAzQzYiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjgxODk3OTAyMDAiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODE4OURCMDM3NCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Ob2RlIgotCQkJcXVpZCAgICAgICAJIjNCRkU2NEE1MDExNyIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uTm9kZSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY1QkYwMDJEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlZhbHVlIgotCQkJcXVpZCAgICAgICAJIjNDMDQwQjVCMDMxRiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5sYW5nLk9iamVjdCIKLQkJCQlxdWlkICAgICAgIAkiM0MwNDBCOEQwM0Q1IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCQTdCMEU4MDFBOCIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3B0aW9uYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTE1MDJCNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkIgotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyMjAyRDMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTI5MDJGMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHkiCi0JCQlxdWlkICAgICAgIAkiM0JDNzcxNUQwMDlCIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5pdGUiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MURDMDJFRCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb3VudGFibHlJbmZpbml0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxRUMwMTQxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4RmluYWwiCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyQ0EwMUNCIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkU3MDBEQSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRUEwMTZBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RDIwMTEyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb3NpdG9yIgotCQkJcXVpZCAgICAgICAJIjNCODY5QjYyMDAzNyIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUJEMDAwMDMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2hvaWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNCODAxMUUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VxdWVuY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0U1MDA1NyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uc3RyYWludCIKLQkJCXF1aWQgICAgICAgCSIzQjg2OUUyNjAxQUUiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlZmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RThFMDI1OCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaXhlZCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOTkwMjcxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCODZBNzlGMDNBMiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW1wdHkiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0NEMDJGMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaW1wbGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QxMDBDRSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDMwMUI3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRPbmx5IgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdENzAyRTkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERlcml2YXRpb25NZXRob2QiCi0JCQlxdWlkICAgICAgIAkiM0I4NkEwQjAwMENFIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMEM4MDMyOSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQ0MwMTYyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljU2V2ZXJpdHkiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY4QTcwMzJGIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYXRhbCIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4QzMwM0QwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVycm9yIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFNzAwRTMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid2FybmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RUEwMUZGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluZm9ybWF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQkZFN0ZDMjAxOUEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCOTdDNUE0MDNERiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3OTAwNDUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3RjAxQUMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjgzMDIwQiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjQ1MDA2OSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERm9ybSIKLQkJCXF1aWQgICAgICAgCSIzQjlGOTEzQjAxRUIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInF1YWxpZmllZCIKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxNkYwMDIzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVucXVhbGlmaWVkIgotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE4QzAwN0YiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCODZBMUUwMDI3MiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2V5IgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMjAwODUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2V5cmVmIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMzAxNEYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pcXVlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxNjAzNjUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzVFQTAwMjMiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFueSIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjAwMDM0IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjIwMDVGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjUwMTE3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkIgotCQkJcXVpZCAgICAgICAJIjNCQzc3MTUyMDJFNCIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFsc2UiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUE5MDI3MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJ0aWFsIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFCQjAxRkYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidG90YWwiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUM0MDFCMiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvY2Vzc0NvbnRlbnRzIgotCQkJcXVpZCAgICAgICAJIjNCOEZGOEM3MDI4NCIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3RyaWN0IgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGODAwNDUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGF4IgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGNjAzOEIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2tpcCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RTgwMkJBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzVCRTAyNzIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OEIwMEI4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY5NDAyOTEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI1MDAyOTUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZUZpbmFsIgotCQkJcXVpZCAgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODEwMjMwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MzAxMzgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjg4MDI0RSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkUwMDM3NCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJcXVpZCAgICAgICAJIjNCOTdDNTkxMDBBRSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2NDAyMzEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjZEMDIxNiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVmFyaWV0eSIKLQkJCXF1aWQgICAgICAgCSIzQjhGRjc3MzAyNDkiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0b21pYyIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QTcwMkRGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FEMDEzOSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUYwMzlGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlIgotCQkJcXVpZCAgICAgICAJIjNCRUVEMEY2MDM0MiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlc2VydmUiCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTBGMDExNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXBsYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyNzAzNEQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29sbGFwc2UiCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI5MDM5NiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhWYXJpZXR5IgotCQkJcXVpZCAgICAgICAJIjNCOEZGQjg5MDMzQSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VsZWN0b3IiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkFDMDE5MiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaWVsZCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQjMwMjc4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NCIKLQkJCXF1aWQgICAgICAgCSIzQzYyNkVBNzAxMDIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY1IgotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REFEQzAyRjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY3IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDI0MiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY4IgotCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDA2RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMwRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMxOCIKLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzAiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NkIwMkNCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1NkQwMEE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1NkQwMEE3IgotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzIiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNkIwMTk0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzA5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2RDAzMTMiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc0IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjA2MDI5MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc2IgotCQkJcXVpZCAgICAgICAJIjNCNjk0MDRFMDA2NyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzciCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDI5QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyQTUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3OCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU5RjAwODYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc5IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNkEiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MCIKLQkJCXF1aWQgICAgICAgCSIzQzI3NUQzMjAyMjAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgxIgotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwRCIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgyIgotCQkJcXVpZCAgICAgICAJIjNCNjg4N0JGMDE1MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTgiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI1RTAxRjkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg1IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDUwIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg2IgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTg1MDEwRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODciCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkIiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4OCIKLQkJCXF1aWQgICAgICAgCSIzQjZGMURFOTAxOEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg5IgotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzNkMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzODAiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTAiCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2ODgwMUMyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MSIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2OEEwMTExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudEFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExQiIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudEFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNTAzNDAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkzIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NCIKLQkJCXF1aWQgICAgICAgCSIzQjZGRERENzAxMTMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk1IgotCQkJCXF1aWQgICAgICAgCSIzQjZGREREQTAyNkIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZGREREQTAyNzUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk2IgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0RGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTciCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTgiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMDZFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzRBIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAwIgotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAxIgotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDdDIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAyIgotCQkJcXVpZCAgICAgICAJIjNCNjg1MUJBMDEyNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAzIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA0IgotCQkJcXVpZCAgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIgotCQkJCWxhYmVsICAgICAgCSJjb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNiIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RDb250YWluZXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDciCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwOCIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMTAzNTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwOSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiIKLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEwIgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTExIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyM0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTIiCi0JCQlxdWlkICAgICAgIAkiM0I2ODkxMTQwMUFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNDMCIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTgiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQxRTYwMjUxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTkiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDJGNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAzMEIiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIwIgotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIxIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjIiCi0JCQlxdWlkICAgICAgIAkiM0M0MkRCREQwMjk3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjMiCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDExRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI0IgotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI1IgotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDRSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNiIKLQkJCXF1aWQgICAgICAgCSIzQjZENTk3MTAyRUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI3IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjgiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI2NTMwMTdBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJzY29wZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RCIKLQkJCQlsYWJlbCAgICAgIAkic2NvcGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMwIgotCQkJcXVpZCAgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEZlYXR1cmUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzIiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzQiCi0JCQlxdWlkICAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jZWRLZXkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzYiCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzciCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzZWxlY3RvciIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM4IgotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM5IgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmllbGRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJbGFiZWwgICAgICAJImZpZWxkcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQwIgotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q4MDJGQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQxIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDIiCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDQiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTcwMkM4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE4MDNFMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDYiCi0JCQlxdWlkICAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDciCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAxQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDI1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDgiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0aWNsZXMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMiIKLQkJCQlsYWJlbCAgICAgIAkicGFydGljbGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTUwMDhBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDA5NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMEEwIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUyIgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUzIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXAiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI0NTAzOTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOUUiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1OCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDcxNTAxMTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MCIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0M4OTAxMjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTEwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiCi0JCQkJbGFiZWwgICAgICAJInRlcm0iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYyIgotCQkJcXVpZCAgICAgICAJIjNCNkFERTQyMDA5QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYzIgotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NCIKLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY2IgotCQkJcXVpZCAgICAgICAJIjNCNjg4RTZCMDAzRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY3IgotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2OCIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RDAxQkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5IgotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcwIgotCQkJcXVpZCAgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcxIgotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzIiCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NCIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAwNDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc2IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRUZGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc3IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzgiCi0JCQlxdWlkICAgICAgIAkiM0JGQzJBMTcwMUVEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzkiCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MCIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUVBNzAyM0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QiIKLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgyIgotCQkJcXVpZCAgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODQiCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNDOCIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg2IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNUFEMDM3NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg3IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0Q29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCIKLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODgiCi0JCQlxdWlkICAgICAgIAkiM0JDOEFFMDIwM0E4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODkiCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA1MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiCi0JCQkJbGFiZWwgICAgICAJImZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkwIgotCQkJcXVpZCAgICAgICAJIjNCNkMzNEI3MDIwOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkxIgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5MiIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCWxhYmVsICAgICAgCSJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NCIKLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDJBNSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTYiCi0JCQlxdWlkICAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTciCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDIyRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5OCIKLQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MTAxNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDAiCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2Q0YwMDg4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDEiCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQlsYWJlbCAgICAgIAkiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDIiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA0IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjExMDI2RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA1IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDIwMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNiIKLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNyIKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzMyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDgiCi0JCQlxdWlkICAgICAgIAkiM0JFQkRDODcwMjQ3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDkiCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDJGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEwIgotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjExIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wb25lbnRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImNvbXBvbmVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxMiIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxMyIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNyIKLQkJCQlsYWJlbCAgICAgIAkiZGlhZ25vc3RpY3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTQiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTUiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFsbERpYWdub3N0aWNzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJbGFiZWwgICAgICAJImFsbERpYWdub3N0aWNzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNiIKLQkJCXF1aWQgICAgICAgCSIzQzIxRENDNzAwRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNyIKLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTgiCi0JCQlxdWlkICAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTkiCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIwIgotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIxIgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwRDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjIiCi0JCQlxdWlkICAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcxIgotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjQiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVDRjAwMDVFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAxRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDI4IgotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNiIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNyIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCWxhYmVsICAgICAgCSJvcmlnaW5hbFZlcnNpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjgiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVFQUIwMDFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjkiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDEwQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1IgotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMwIgotCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMxIgotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIgotCQkJCWxhYmVsICAgICAgCSJpdGVtVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMiIKLQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3MzAxOTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hRm9yU2NoZW1hIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUZCIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWFGb3JTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzQiCi0JCQlxdWlkICAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwM0MiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNiIKLQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM4IgotCQkJcXVpZCAgICAgICAJIjNDMjhBMEYyMDFBNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJFNSIKLQkJCQlsYWJlbCAgICAgIAkidHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzOSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDAiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE2REIwMUU1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0RFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ0IgotCQkJcXVpZCAgICAgICAJIjNDMjhBNzRCMDE3OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ2IgotCQkJcXVpZCAgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciCi0JCQkJbGFiZWwgICAgICAJImNvbXBsZXhUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ3IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDEyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDgiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwREQiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0OSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyNzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIgotCQkJCWxhYmVsICAgICAgCSJtaW5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDhEMDI1MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0Q0IgotCQkJCWxhYmVsICAgICAgCSJtYXhJbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIgotCQkJCWxhYmVsICAgICAgCSJtaW5JbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEIzMDIwNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTlBIgotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjIxIgotCQkJCWxhYmVsICAgICAgCSJtYXhFeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIgotCQkJCWxhYmVsICAgICAgCSJsZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIndoaXRlU3BhY2VGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA3NSIKLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVudW1lcmF0aW9uRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFDIgotCQkJCWxhYmVsICAgICAgCSJlbnVtZXJhdGlvbkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjgiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjkiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQlsYWJlbCAgICAgIAkicGF0dGVybkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDODAyQTciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUY1IgotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJudW1lcmljRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDEiCi0JCQkJbGFiZWwgICAgICAJIm51bWVyaWNGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDRjAxOTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDg1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiIKLQkJCQlsYWJlbCAgICAgIAkibWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAyNyIKLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0Q3IgotCQkJCWxhYmVsICAgICAgCSJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0IgotCQkJCWxhYmVsICAgICAgCSJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAwNDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmRlcmVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJib3VuZGVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOTgiCi0JCQkJbGFiZWwgICAgICAJImJvdW5kZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NDAxRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzYwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4RmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjU0RjAxNDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIxNyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQTAwQUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMDAzQTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMCIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA2MCIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNDMyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNCIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MDAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMENGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNiIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNyIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTBGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNGYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDExQSIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwOCIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjREMzAyOEUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwOSIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkYzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljUGFydGljbGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGRCIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEwIgotCQkJcXVpZCAgICAgICAJIjNENEJCNEQ5MDFGNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzExIgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyODQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjhFIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTIiCi0JCQlxdWlkICAgICAgIAkiM0Q0QzY4RkYwMUJGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTMiCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4IgotCQkJdGl0bGUgICAgICAJIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAMzg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCA4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMzg4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzg5Ci0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzODcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDkyOCwgMjI1KQotCQkJCSAgICAoOTI4LCAxMzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDM5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5MQotCQkJCWxvY2F0aW9uICAgCSgxMjAzLCA3MDYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM4OAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwMywgNzA2KQotCQkJCSAgICAoMTIwMywgNjE1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDM5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3MiwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJd2lkdGggICAgICAJNTIyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzkzCi0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzOTIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ0NCwgNzA5KQotCQkJCSAgICAoNDQ0LCA2MTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzk0Ci0JCQkJbG9jYXRpb24gICAJKDE1NzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzkwCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTcyLCA0NjUpCi0JCQkJICAgICgxNTcyLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAzOTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTAsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzOTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTA1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjYyLCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEAzOTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM2LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOTgKLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzOTYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ1MywgMTIwMykKLQkJCQkgICAgKDQ1MywgMTExMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDM5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDAwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgODAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDAwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDAxCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDk1MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxODcyLCA5NTApCi0JCQkJICAgICgxODcyLCA4NTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDAyCi0JCQkJbG9jYXRpb24gICAJKDE4MSwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzOTkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4MSwgNDY1KQotCQkJCSAgICAoMTgxLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA0MDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzAsIDEyMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDQwNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTA1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA0MDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjksIDE0NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjU2Ci0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDQwNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAzLCAxNDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTU4MQotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDA3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA0MDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEwNTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDQwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA2LCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA0MTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTI5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2LCAxMjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA0MTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDExCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANDEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxMjgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEyMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA0MTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAsIDE0NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk2OTQKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDQxNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAkzMTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0MTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlAMzk3Ci0JCQkJc3VwcGxpZXIgICAJQDM4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTQsIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA0MTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDgwMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MTgKLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQxNwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTYyLCA5NDcpCi0JCQkJICAgICg5NjIsIDg1NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxOQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQyMAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE4LCAxMTU0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMTYzNTM0Ci0JCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCWNsaWVudCAgICAgCUA0MTAKLQkJCQlzdXBwbGllciAgIAlAMzkyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDksIDcwOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDIxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA0MTAKLQkJCQlzdXBwbGllciAgIAlAMzk2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDEyMDMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlANDExCi0JCQkJc3VwcGxpZXIgICAJQDM5OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDIzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUA0MDkKLQkJCQlzdXBwbGllciAgIAlAMzkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDAyLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyNAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlAMzkwCi0JCQkJc3VwcGxpZXIgICAJQDM4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjksIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OSwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDQwNwotCQkJCXN1cHBsaWVyICAgCUAzOTAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkwLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDI2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCWNsaWVudCAgICAgCUAzOTUKLQkJCQlzdXBwbGllciAgIAlAMzkyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNzA5KQotCQkJCWRyYXdTdXBwbGllciAJQDM5MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDQxMgotCQkJCXN1cHBsaWVyICAgCUA0MTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzIxLCAxMjI1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzIxLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyOAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQyOQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNywgODg2KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMjE1ODEyCi0JCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCWNsaWVudCAgICAgCUA0MDQKLQkJCQlzdXBwbGllciAgIAlAMzkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwMCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDM5NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDQwNAotCQkJCXN1cHBsaWVyICAgCUA0MDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCA5NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAMzk2Ci0JCQkJc3VwcGxpZXIgICAJQDQxNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1MCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAMzk5Ci0JCQkJc3VwcGxpZXIgICAJQDM4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIgotCQkJCWNsaWVudCAgICAgCUA0MTUKLQkJCQlzdXBwbGllciAgIAlAMzg3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxMiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEyLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEI4MDI4NiIKLQkJCQljbGllbnQgICAgIAlAMzkyCi0JCQkJc3VwcGxpZXIgICAJQDM4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUAzODgKLQkJCQlzdXBwbGllciAgIAlAMzg3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzUwLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlANDE0Ci0JCQkJc3VwcGxpZXIgICAJQDM4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3MiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzIsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA0MDMKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MywgMTIyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQotCQkJCWRyYXdTdXBwbGllciAJQDQwMSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJY2xpZW50ICAgICAJQDQwNQotCQkJCXN1cHBsaWVyICAgCUAzODgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQljbGllbnQgICAgIAlANDA2Ci0JCQkJc3VwcGxpZXIgICAJQDM4OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDE0MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzEsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUA0MTcKLQkJCQlzdXBwbGllciAgIAlAMzg4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTU5LCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDQwMAotCQkJCXN1cHBsaWVyICAgCUAzODgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzIsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA0MDgKLQkJCQlzdXBwbGllciAgIAlANDE3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYyLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjIsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDQ0Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NSwgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0MjUzMQotCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCQUEyMDMxMCIKLQkJCQljbGllbnQgICAgIAlANDEzCi0JCQkJc3VwcGxpZXIgICAJQDM5OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDQxMwotCQkJCXN1cHBsaWVyICAgCUAzOTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDE0MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMTIwMykKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTgpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzNzRCMTgxOTAwMjgiCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAk5NgotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQ0NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc4NCwgMTYzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDQ3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjgiIEA0NDgKLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAxNjI3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNjUzMDE3QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NvcGUiIEA0NDkKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDgKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzcxMjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIgotCQkJCQljbGllbnQgICAgIAlANDQ4Ci0JCQkJCXN1cHBsaWVyICAgCUA0NDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MSwgMTYyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTY2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjkiIEA0NTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDgKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkUiCi0JCQkJCWNsaWVudCAgICAgCUA0NDgKLQkJCQkJc3VwcGxpZXIgICAJQDQ0NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI3LCAxNjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBANDUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAxMjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANDU0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYwIiBANDU1Ci0JCQkJbG9jYXRpb24gICAJKDIyMjksIDExMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDODkwMTIyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjEiIEA0NTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTUKLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiCi0JCQkJCWNsaWVudCAgICAgCUA0NTUKLQkJCQkJc3VwcGxpZXIgICAJQDQ1NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDU3Ci0JCQkJCVBhcmVudF9WaWV3IAlANDU1Ci0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTU3LCAxMTIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Rlcm0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDQ1NQotCQkJCQlzdXBwbGllciAgIAlANDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTE3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzQsIDExMTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExOTQwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEA0NjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDgiIEA0NjIKLQkJCQlsb2NhdGlvbiAgIAkoMjIxOSwgODgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNjA2MDI2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ5IiBANDYzCi0JCQkJCVBhcmVudF9WaWV3IAlANDYyCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDQ2MgotCQkJCQlzdXBwbGllciAgIAlANDYxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA4MjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0NjQKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjIKLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTA1LCA4ODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFydGljbGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIyIgotCQkJCQljbGllbnQgICAgIAlANDYyCi0JCQkJCXN1cHBsaWVyICAgCUA0NTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDkzOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyODEsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzksIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANDY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDUsIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQ2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTQiIEA0NzAKLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk1IiBANDcxCi0JCQkJCVBhcmVudF9WaWV3IAlANDcwCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJCWNsaWVudCAgICAgCUA0NzAKLQkJCQkJc3VwcGxpZXIgICAJQDQ2OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1OTAsIDExNDApCi0JCQkJCSAgICAoNTQwLCAxMTQwKQotCQkJCQkgICAgKDU0MCwgMTA0NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDAsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA0NzIKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzAKLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMDUzNTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANDcwCi0JCQkJCXN1cHBsaWVyICAgCUA0NjkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTkwLCAxMTQwKQotCQkJCQkgICAgKDY0MSwgMTE0MCkKLQkJCQkJICAgICg2NDEsIDEwNDUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQxLCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg0LCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTIyNDQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQ3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgOTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk2IiBANDc2Ci0JCQkJbG9jYXRpb24gICAJKDExMTksIDExMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3REYwMjRGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NyIgQDQ3NwotCQkJCQlQYXJlbnRfVmlldyAJQDQ3NgotCQkJCQlsb2NhdGlvbiAgIAkoLTE1NjksIC04KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0UxMDBGRCIKLQkJCQkJY2xpZW50ICAgICAJQDQ3NgotCQkJCQlzdXBwbGllciAgIAlANDc1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRUeXBlIiBANDc4Ci0JCQkJCVBhcmVudF9WaWV3IAlANDc2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU5LCAxMTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZFIgotCQkJCQljbGllbnQgICAgIAlANDc2Ci0JCQkJCXN1cHBsaWVyICAgCUA0NjAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MywgMTEyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMiIgQDQ4MQotCQkJCWxvY2F0aW9uICAgCSgxNDU1LCA5ODIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkEwMTI2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDMiIEA0ODIKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODEKLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTAiCi0JCQkJCWNsaWVudCAgICAgCUA0ODEKLQkJCQkJc3VwcGxpZXIgICAJQDQ3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NSwgOTgyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4MCwgOTgyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA0ODMKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODEKLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDUsIDkyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2Mjg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MSIKLQkJCQkJY2xpZW50ICAgICAJQDQ4MQotCQkJCQlzdXBwbGllciAgIAlANDY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMwLCA5ODIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUwLCAxMDIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDI4NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTgiIEA0ODYKLQkJCQlsb2NhdGlvbiAgIAkoOTIxLCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDA2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTkiIEA0ODcKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODYKLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzQ5IgotCQkJCQljbGllbnQgICAgIAlANDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA0NzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyMSwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA0ODgKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODYKLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEyNTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5OTM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0QSIKLQkJCQkJY2xpZW50ICAgICAJQDQ4NgotCQkJCQlzdXBwbGllciAgIAlANDY4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEzNzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzksIDEyNTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4ODM0NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0OTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMjIsIDcyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTM5OAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANDkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxNjMyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjIzLCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANDkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDMsIDQwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUyIiBANDk0Ci0JCQkJbG9jYXRpb24gICAJKDIyMTYsIDYwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MyIgQDQ5NQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NAotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJCWNsaWVudCAgICAgCUA0OTQKLQkJCQkJc3VwcGxpZXIgICAJQDQ5MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxNiwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNTAxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDQ5NgotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NAotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDYyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODI2MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM5IgotCQkJCQljbGllbnQgICAgIAlANDk0Ci0JCQkJCXN1cHBsaWVyICAgCUA0NjEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTYsIDYzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjMzNjQ1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDQ5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOSwgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgyIiBANTAwCi0JCQkJbG9jYXRpb24gICAJKDE2NzYsIDEyMDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QkYwMTUwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MyIgQDUwMQotCQkJCQlQYXJlbnRfVmlldyAJQDUwMAotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBNyIKLQkJCQkJY2xpZW50ICAgICAJQDUwMAotCQkJCQlzdXBwbGllciAgIAlANDk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTM3MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkIiBANTAyCi0JCQkJCVBhcmVudF9WaWV3IAlANTAwCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU3LCAxMTA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MjU3NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE4IgotCQkJCQljbGllbnQgICAgIAlANTAwCi0JCQkJCXN1cHBsaWVyICAgCUA0NjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOCwgMTEwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjE5NjMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc4IiBANTA1Ci0JCQkJbG9jYXRpb24gICAJKDE0MjksIDE0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1OUYwMDg2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3OSIgQDUwNgotCQkJCQlQYXJlbnRfVmlldyAJQDUwNQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNjkiCi0JCQkJCWNsaWVudCAgICAgCUA1MDUKLQkJCQkJc3VwcGxpZXIgICAJQDQ5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTAsIDE0MzgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNSwgMTUwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzI1OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNkEiCi0JCQkJCWNsaWVudCAgICAgCUA1MDUKLQkJCQkJc3VwcGxpZXIgICAJQDQ2OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDgsIDE0MzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI3LCAxMzkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NjM1MzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA1MTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NiIgQDUxMQotCQkJCWxvY2F0aW9uICAgCSg3NzcsIDE0MjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODUwMTBEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NyIgQDUxMgotCQkJCQlQYXJlbnRfVmlldyAJQDUxMQotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkEiCi0JCQkJCWNsaWVudCAgICAgCUA1MTEKLQkJCQkJc3VwcGxpZXIgICAJQDQ2OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk2LCAxNDI1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb24iIEA1MTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTEKLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDE1MDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTkyNTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTgzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkIiCi0JCQkJCWNsaWVudCAgICAgCUA1MTEKLQkJCQkJc3VwcGxpZXIgICAJQDUxMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU4LCAxNDI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIxLCAxMzg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzI0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzAiIEA1MTYKLQkJCQlsb2NhdGlvbiAgIAkoMjM3LCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTZCMDJDQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzEiIEA1MTcKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTYKLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTYiCi0JCQkJCWNsaWVudCAgICAgCUA1MTYKLQkJCQkJc3VwcGxpZXIgICAJQDUxMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMzcxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEA1MTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTYKLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4OCwgMTI0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTciCi0JCQkJCWNsaWVudCAgICAgCUA1MTYKLQkJCQkJc3VwcGxpZXIgICAJQDQ2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1LCAxMjQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANTIxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4LCA3NDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkyIiBANTIyCi0JCQkJbG9jYXRpb24gICAJKDcyOCwgNzc1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzM1MDM0MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTMiIEA1MjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjIKLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJCWNsaWVudCAgICAgCUA1MjIKLQkJCQkJc3VwcGxpZXIgICAJQDQ3NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3MjgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDkzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4OCwgOTM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANTI0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTIyCi0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTgsIDg4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjE0MDk0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUA1MjIKLQkJCQkJc3VwcGxpZXIgICAJQDUyMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzksIDc3NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MCwgODEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTUyNDM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA1MjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNywgNDA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTYwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNCIgQDUyOAotCQkJCWxvY2F0aW9uICAgCSgxNjI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkS2V5IiBANTI5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTI4Ci0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MSwgNjA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRLZXkiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43OTcyOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJCWNsaWVudCAgICAgCUA1MjgKLQkJCQkJc3VwcGxpZXIgICAJQDUyNwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjI5LCA1NzQpCi0JCQkJCSAgICAoMTU1NSwgNTc0KQotCQkJCQkgICAgKDE1NTUsIDUwMSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCA1MDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjIyLCA1MzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NzYxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM1IiBANTMyCi0JCQkJCVBhcmVudF9WaWV3IAlANTI4Ci0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2RiIKLQkJCQkJY2xpZW50ICAgICAJQDUyOAotCQkJCQlzdXBwbGllciAgIAlANTI3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MjksIDU3NCkKLQkJCQkJICAgICgxNjg5LCA1NzQpCi0JCQkJCSAgICAoMTY4OSwgNDQ0KQotCQkJCQkgICAgKDE2MTYsIDQ0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE2LCA0NDQpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDUzMwotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzkiIEA1MzQKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzMKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQkJY2xpZW50ICAgICAJQDUzMwotCQkJCQlzdXBwbGllciAgIAlANTI3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA1MDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEA1MzUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzMKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExOSwgNjU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM5MjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5IgotCQkJCQljbGllbnQgICAgIAlANTMzCi0JCQkJCXN1cHBsaWVyICAgCUA0OTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTMsIDY1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5OTA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNiIgQDUzOAotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzciIEA1MzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgKLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCQljbGllbnQgICAgIAlANTM4Ci0JCQkJCXN1cHBsaWVyICAgCUA1MjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBANTQwCi0JCQkJCVBhcmVudF9WaWV3IAlANTM4Ci0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMywgNjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTEyMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTk4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJCWNsaWVudCAgICAgCUA1MzgKLQkJCQkJc3VwcGxpZXIgICAJQDQ5MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNzE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgNjUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTI1MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANTQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk1OTkKLQkJCQloZWlnaHQgICAgIAkyMDkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODAiIEA1NDQKLQkJCQlsb2NhdGlvbiAgIAkoMjM5NSwgNjA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUE3MDIzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgxIiBANTQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTQ0Ci0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCQljbGllbnQgICAgIAlANTQ0Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM5NSwgNjA2KQotCQkJCQkgICAgKDIzOTUsIDY1KQotCQkJCQkgICAgKDE2MTEsIDY1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibm90YXRpb25EZWNsYXJhdGlvbnMiIEA1NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDQKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODksIDEwNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4OTc3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEIiCi0JCQkJCWNsaWVudCAgICAgCUA1NDQKLQkJCQkJc3VwcGxpZXIgICAJQDQ5MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzk1LCA2MDYpCi0JCQkJCSAgICAoMjM5NSwgMTYzMykKLQkJCQkJICAgICgyMDk4LCAxNjMzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTgsIDE2MzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzQ0LCAxMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODc4MjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc2IiBANTQ5Ci0JCQkJbG9jYXRpb24gICAJKDE3NzIsIDI0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVGRjAyNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NyIgQDU1MAotCQkJCQlQYXJlbnRfVmlldyAJQDU0OQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJCWNsaWVudCAgICAgCUA1NDkKLQkJCQkJc3VwcGxpZXIgICAJQDU0MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMjQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cERlZmluaXRpb25zIiBANTUxCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ5Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NiwgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXBEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzNTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQkJY2xpZW50ICAgICAJQDU0OQotCQkJCQlzdXBwbGllciAgIAlANDkzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3NzIsIDI0OSkKLQkJCQkJICAgICgxODMyLCAyNDkpCi0JCQkJCSAgICAoMTgzMiwgMzk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MzIsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDM0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM3ODY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MiIgQDU1NAotCQkJCWxvY2F0aW9uICAgCSgyMzQ2LCA1MTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzMiIEA1NTUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTQKLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcyLCAxODU3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy42MzAwNzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThCIgotCQkJCQljbGllbnQgICAgIAlANTU0Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0NiwgNTE4KQotCQkJCQkgICAgKDIzNDYsIDE0OSkKLQkJCQkJICAgICgxNjExLCAxNDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMTQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIgQDU1NwotCQkJCQlQYXJlbnRfVmlldyAJQDU1NAotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDgsIDE5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ5OTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQkJY2xpZW50ICAgICAJQDU1NAotCQkJCQlzdXBwbGllciAgIAlANDk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNDYsIDUxOCkKLQkJCQkJICAgICgyMzQ2LCAxNDQxKQotCQkJCQkgICAgKDIxNjYsIDE0NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2NiwgMTQ0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOTksIDE5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0ODg2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzQiIEA1NjAKLQkJCQlsb2NhdGlvbiAgIAkoMjAzLCAxNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMDQ5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzUiIEA1NjEKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjAKLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCQljbGllbnQgICAgIAlANTYwCi0JCQkJCXN1cHBsaWVyICAgCUA1NDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb25zIiBANTYyCi0JCQkJCVBhcmVudF9WaWV3IAlANTYwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ5LCAxOTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDc1NzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzdFIgotCQkJCQljbGllbnQgICAgIAlANTYwCi0JCQkJCXN1cHBsaWVyICAgCUA1MjEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjAzLCAxNTkpCi0JCQkJCSAgICAoMTA0LCAxNTkpCi0JCQkJCSAgICAoMTA0LCA3ODQpCi0JCQkJCSAgICAoMTg5LCA3ODQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODksIDc4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NSwgMjAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk3MDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc4IiBANTY1Ci0JCQkJbG9jYXRpb24gICAJKDEwODcsIDMyOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExNzAxRUQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3OSIgQDU2NgotCQkJCQlQYXJlbnRfVmlldyAJQDU2NQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQkJY2xpZW50ICAgICAJQDU2NQotCQkJCQlzdXBwbGllciAgIAlANTQzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAyNjQpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU2NwotCQkJCQlQYXJlbnRfVmlldyAJQDU2NQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3NSwgMzM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA5NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjdEIgotCQkJCQljbGllbnQgICAgIAlANTY1Ci0JCQkJCXN1cHBsaWVyICAgCUA1MjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTgsIDMzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTA3MTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MCIgQDU3MAotCQkJCWxvY2F0aW9uICAgCSg0OCwgMzIwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTcxIiBANTcxCi0JCQkJCVBhcmVudF9WaWV3IAlANTcwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJCWNsaWVudCAgICAgCUA1NzAKLQkJCQkJc3VwcGxpZXIgICAJQDU0MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OSwgMzIyKQotCQkJCQkgICAgKDQ5LCA2OCkKLQkJCQkJICAgICgxMDEzLCA2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgNjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiIEA1NzIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzAKLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM4LCAxMDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk4NTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQkJY2xpZW50ICAgICAJQDU3MAotCQkJCQlzdXBwbGllciAgIAlANTEwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5LCAzMjIpCi0JCQkJCSAgICAoNDksIDE0MTUpCi0JCQkJCSAgICAoMTc0LCAxNDE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDE0MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MSwgMTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk2NzA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDU3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NSwgNDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNTAxCi0JCQkJaGVpZ2h0ICAgICAJOTcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjAiIEA1NzYKLQkJCQlsb2NhdGlvbiAgIAkoNDk5LCA1ODkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNTkwMTk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjEiIEA1NzcKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzYKLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFMyIKLQkJCQkJY2xpZW50ICAgICAJQDU3NgotCQkJCQlzdXBwbGllciAgIAlANTc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5OSwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUyLCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIiBANTc4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTc2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgxMSwgNTg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAk2LjUyMDgzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUVEIgotCQkJCQljbGllbnQgICAgIAlANTc2Ci0JCQkJCXN1cHBsaWVyICAgCUA1NzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDk5LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDcsIDQ5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5OSwgNTU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE0IiBANTgxCi0JCQkJbG9jYXRpb24gICAJKDI0MSwgNjEzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDA1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE1IiBANTgyCi0JCQkJCVBhcmVudF9WaWV3IAlANTgxCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQkYiCi0JCQkJCWNsaWVudCAgICAgCUA1ODEKLQkJCQkJc3VwcGxpZXIgICAJQDU3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTgzCi0JCQkJCVBhcmVudF9WaWV3IAlANTgxCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwOCwgNjk0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODY0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0MwIgotCQkJCQljbGllbnQgICAgIAlANTgxCi0JCQkJCXN1cHBsaWVyICAgCUA1MjEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA3MzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDY4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjEwMTY5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNiIgQDU4NgotCQkJCWxvY2F0aW9uICAgCSg4MzcsIDQ2MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNyIgQDU4NwotCQkJCQlQYXJlbnRfVmlldyAJQDU4NgotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJCWNsaWVudCAgICAgCUA1ODYKLQkJCQkJc3VwcGxpZXIgICAJQDU3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDQ2MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANTg4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTg2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1MTQ2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQkJY2xpZW50ICAgICAJQDU4NgotCQkJCQlzdXBwbGllciAgIAlANTI3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQ2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgNDA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA0MzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY4IiBANTkxCi0JCQkJbG9jYXRpb24gICAJKDU0MSwgMjQ2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRThEMDFCRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY5IiBANTkyCi0JCQkJCVBhcmVudF9WaWV3IAlANTkxCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTgiCi0JCQkJCWNsaWVudCAgICAgCUA1OTEKLQkJCQkJc3VwcGxpZXIgICAJQDU0MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAyNDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb25zIiBANTkzCi0JCQkJCVBhcmVudF9WaWV3IAlANTkxCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MywgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwOTMwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OSIKLQkJCQkJY2xpZW50ICAgICAJQDU5MQotCQkJCQlzdXBwbGllciAgIAlANTc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDU0MSwgMjQ2KQotCQkJCQkgICAgKDIyNCwgMjQ2KQotCQkJCQkgICAgKDIyNCwgNDAwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI0LCA0MDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODYsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMiIgQDU5NgotCQkJCWxvY2F0aW9uICAgCSgzNTMsIDYyMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQyREJERDAyOTciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMyIgQDU5NwotCQkJCQlQYXJlbnRfVmlldyAJQDU5NgotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTFFIgotCQkJCQljbGllbnQgICAgIAlANTk2Ci0JCQkJCXN1cHBsaWVyICAgCUA1NzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzUzLCA2MjEpCi0JCQkJCSAgICAoMzA2LCA2MjEpCi0JCQkJCSAgICAoMzA2LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDYsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwIiBANTk4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTk2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3OSwgNjM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJNC44MDg1MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJCWNsaWVudCAgICAgCUA1OTYKLQkJCQkJc3VwcGxpZXIgICAJQDU3NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNTMsIDYyMSkKLQkJCQkJICAgICg0MDAsIDYyMSkKLQkJCQkJICAgICg0MDAsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNDk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUwLCA1ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjk3NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2OUU3ODYwMkM1IgotCQkJdGl0bGUgICAgICAJIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA2MDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDEyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDEwNykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHRhcmdldE5hbWVzcGFjZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTUzNAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDYwMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTY3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANjAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMTY4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTUyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTU4NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTM5Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGRlcml2YXRpb25NZXRob2QgOiBYU0REZXJpdmF0aW9uTWV0aG9kID0gcmVzdHJpY3Rpb24iCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEQ29tcGxleEZpbmFsIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iCi0JCQkJCSIrIGNvbnRlbnRUeXBlQ2F0ZWdvcnkgOiBYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCQkiPDwwLi4qPj4gKyBwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJMTE5MgotCQkJCWhlaWdodCAgICAgCTMzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MDQKLQkJCQlsb2NhdGlvbiAgIAkoNDYzLCAzNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYwMQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDYzLCAzNjIpCi0JCQkJICAgICg0NjMsIDIyMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDYwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTc5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSIKLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTY0NgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA2MDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDE0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDk4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyByZXF1aXJlZCA6IGJvb2xlYW4iCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANjA3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg5MCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkxMjYwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSA6IFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQkJIjw8MC4uKj4+ICsgbmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIKLQkJCQkJIisgcHJvY2Vzc0NvbnRlbnRzIDogWFNEUHJvY2Vzc0NvbnRlbnRzIikpCi0JCQkJd2lkdGggICAgICAJMTMwNAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANjA4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTQ0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDEzODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJNTk2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA2MDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDUxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQ5MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA2Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYxMAotCQkJCWxvY2F0aW9uICAgCSgyOTQsIDY5NykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjA5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyOTQsIDY5NykKLQkJCQkgICAgKDI5NCwgNjA1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDYxMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjU2LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTUsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANjEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgNTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDE4LCA0NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MTMKLQkJCQlsb2NhdGlvbiAgIAkoMjY4NCwgOTYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2MTIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI2ODQsIDk2MikKLQkJCQkgICAgKDI2ODQsIDU3NikpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb3NpdG9yIiBANjE0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDExMTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvc2l0b3IiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTA2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUI2MjAwMzciCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbnQiIEA2MTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlFMjYwMUFFIgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REZXJpdmF0aW9uTWV0aG9kIiBANjE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIyMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODZBMEIwMDBDRSIKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiIEA2MTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCA4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTFFMDAyNzIiCi0JCQkJd2lkdGggICAgICAJNjI1Ci0JCQkJaGVpZ2h0ICAgICAJMzAwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiIEA2MTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjExNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIwNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NkE3OUYwM0EyIgotCQkJCXdpZHRoICAgICAgCTUxNAotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANjE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTYwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNTE2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvY2Vzc0NvbnRlbnRzIiBANjIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMjI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxMDYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY4QzcwMjg0IgotCQkJCXdpZHRoICAgICAgCTQzOAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aFZhcmlldHkiIEA2MjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkZCODkwMzNBIgotCQkJCXdpZHRoICAgICAgCTM4MQotCQkJCWhlaWdodCAgICAgCTI1MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDYyMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDE4NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3ODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTczOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE4NDgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMTk5Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxpc3QiCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyB1bmlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA2MjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxOTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxODkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMjAwMSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMDIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM4MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiIEA2MjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTA3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzU5MTAwQUUiCi0JCQkJd2lkdGggICAgICAJNjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBANjI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTExNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTE3NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMzYKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgc3Vic3RpdHV0aW9uIgotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBANjI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMjI3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjIxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjI3MykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMDIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiIEA2MjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAyMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjE1NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxMDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1RUEwMDIzIgotCQkJCXdpZHRoICAgICAgCTY5NgotCQkJCWhlaWdodCAgICAgCTI5NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA2MjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCA4ODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgNzQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDgwOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkxMzU3Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5pbGxhYmxlIDogYm9vbGVhbiIKLQkJCQkJIjw8MC4uKj4+ICsgZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIjw8MC4uKj4+ICsgc3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIDogWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAkxNDA0Ci0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjI5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUA2MjgKLQkJCQlzdXBwbGllciAgIAlANjA5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjgxLCA3MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDYxMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA2MzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDgxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDYzMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjAsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MzIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDYzMQotCQkJCXN1cHBsaWVyICAgCUA2MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODYyLCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODYyLCA5NjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjEzKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDYzMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEzMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjgsIDEyNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MzQKLQkJCQlsb2NhdGlvbiAgIAkoMjM3NSwgMTQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMzc1LCAxNDY1KQotCQkJCSAgICAoMjM3NSwgMTM3NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlANjMzCi0JCQkJc3VwcGxpZXIgICAJQDYxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNjgsIDEyNDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNjgsIDk2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjM2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA2MDMKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgxOCwgMTUxMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxOCwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjM3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA2MDUKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwNiwgMTUwNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNiwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANjM4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOCwgMTEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjM5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA2MzgKLQkJCQlzdXBwbGllciAgIAlANjEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExNSwgMTA4OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgOTYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYxMykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDY0MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDQ2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJMTE1MAotCQkJCWhlaWdodCAgICAgCTE0NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQljbGllbnQgICAgIAlANjQwCi0JCQkJc3VwcGxpZXIgICAJQDYwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjgsIDQ1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OCwgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYwNCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDY0MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzgsIDcwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk1MDIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANjQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAyNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiCi0JCQkJY2xpZW50ICAgICAJQDY0MgotCQkJCXN1cHBsaWVyICAgCUA2MDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjkwLCA2OTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTAsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA2MzAKLQkJCQlzdXBwbGllciAgIAlANjA5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxLCA4MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDYxMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDYwOQotCQkJCXN1cHBsaWVyICAgCUA2MDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzIsIDQxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzcyLCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQljbGllbnQgICAgIAlANjEyCi0JCQkJc3VwcGxpZXIgICAJQDYwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2ODcsIDQ0OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4NywgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYwNCkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIgotCQkJcXVpZCAgICAgICAJIjNCNkMzMjY1MDA1RiIKLQkJCXRpdGxlICAgICAgCSI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IiBANjQ4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgODk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgODQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGaXhlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIgotCQkJCXdpZHRoICAgICAgCTMzOAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA2NDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA4OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNCwgODQ1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJd2lkdGggICAgICAJNDUwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEA2NTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjYsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDY1MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzcsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjUyCi0JCQkJbG9jYXRpb24gICAJKDcxOCwgMTA0OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjQ5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3MTgsIDEwNDkpCi0JCQkJICAgICg3MTgsIDk1OSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEA2NTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgOTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzk5LCA4NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBANjU0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MywgODcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJd2lkdGggICAgICAJMzg4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEA2NTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAzMiwgMTEwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMTA0OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBANjU2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTksIDEwNDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCQl3aWR0aCAgICAgIAkzODgKLQkJCQloZWlnaHQgICAgIAkxMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEA2NTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM0OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDY1OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwNSwgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY1OQotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDEyNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY0OAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ0LCAxMjYyKQotCQkJCSAgICAoMTQ0LCA5NjQpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEA2NjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMTU1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDY2MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEA2NjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBANjYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE5MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDE4NTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDY2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MiwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJd2lkdGggICAgICAJNDQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBANjY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTkwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0LCAxODUyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDY2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyLCAyMDU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBANjY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTgsIDIwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOUQwM0M3IgotCQkJCWNsaWVudCAgICAgCUA2NTAKLQkJCQlzdXBwbGllciAgIAlANjQ5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzk0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTQsIDEwNDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjUyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODYyMDA0NSIKLQkJCQljbGllbnQgICAgIAlANjYxCi0JCQkJc3VwcGxpZXIgICAJQDY0OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA2NzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAxMTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkNBNTAzOEQiCi0JCQkJY2xpZW50ICAgICAJQDY1MQotCQkJCXN1cHBsaWVyICAgCUA2NDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMDQ5KQotCQkJCWRyYXdTdXBwbGllciAJQDY1MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4MDAyREYiCi0JCQkJY2xpZW50ICAgICAJQDY1NwotCQkJCXN1cHBsaWVyICAgCUA2NDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjMsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWQiIEA2NzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTMyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEyNzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNTIwMkU0IgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eSIgQDY3NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNUQwMDlCIgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlIiBANjc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCRUVEMEY2MDM0MiIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkyODcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6VmFsdWUiIEA2NzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAyMDk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwNjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlZhbHVlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQzA0MEI1QjAzMUYiCi0JCQkJd2lkdGggICAgICAJNjM2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjc3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNjEwMzM3IgotCQkJCWNsaWVudCAgICAgCUA2NjYKLQkJCQlzdXBwbGllciAgIAlANjQ4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDIwNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEA2NzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDEzNzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTMyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTM4MCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEA2NzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxMzc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTM4MCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQyNDAwOTgiCi0JCQkJY2xpZW50ICAgICAJQDY3OAotCQkJCXN1cHBsaWVyICAgCUA2NDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzUsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMzEwM0FEIgotCQkJCWNsaWVudCAgICAgCUA2NzkKLQkJCQlzdXBwbGllciAgIAlANjQ4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgMTMwOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTIwMzUzIgotCQkJCWNsaWVudCAgICAgCUA2NjQKLQkJCQlzdXBwbGllciAgIAlANjc4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg1LCAxNjY0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODUsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjgzMDNCOCIKLQkJCQljbGllbnQgICAgIAlANjYyCi0JCQkJc3VwcGxpZXIgICAJQDY3OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDAsIDE2NjQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDAsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjhFMDMwOSIKLQkJCQljbGllbnQgICAgIAlANjYzCi0JCQkJc3VwcGxpZXIgICAJQDY3OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjIsIDE4NDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjIsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M0MDBDMCIKLQkJCQljbGllbnQgICAgIAlANjU4Ci0JCQkJc3VwcGxpZXIgICAJQDY0OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTQ4NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I3RDAwRkMiCi0JCQkJY2xpZW50ICAgICAJQDY2MAotCQkJCXN1cHBsaWVyICAgCUA2NDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I5OTAwMTYiCi0JCQkJY2xpZW50ICAgICAJQDY2NwotCQkJCXN1cHBsaWVyICAgCUA2NDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc1LCAyMDQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA2ODgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDM2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAzMTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTQwNgotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2ODkKLQkJCQlsb2NhdGlvbiAgIAkoMzY2LCA1MjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY4OAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzY2LCA1MjIpCi0JCQkJICAgICgzNjYsIDQzMCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDY5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQsIDU3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY5MQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDc4MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjkwCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyNzIsIDc4MSkKLQkJCQkgICAgKDI3MiwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCWNsaWVudCAgICAgCUA2NDkKLQkJCQlzdXBwbGllciAgIAlANjkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTk0LCA4MzMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5NCwgNzgxKQotCQkJCWRyYXdTdXBwbGllciAJQDY5MSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIgQDY5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZ1bmRhbWVudGFsRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiCi0JCQkJd2lkdGggICAgICAJNDcwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY5NAotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDc4OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjkzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3NjgsIDc4OSkKLQkJCQkgICAgKDc2OCwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NTkwMTJDIgotCQkJCWNsaWVudCAgICAgCUA2NTMKLQkJCQlzdXBwbGllciAgIAlANjkzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA1MCwgODYwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjNDMDIyNCIKLQkJCQljbGllbnQgICAgIAlANjU0Ci0JCQkJc3VwcGxpZXIgICAJQDY5MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjUsIDg2MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyNSwgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDY5NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0RjAxMzEiCi0JCQkJY2xpZW50ICAgICAJQDY1NQotCQkJCXN1cHBsaWVyICAgCUA2OTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjM3LCAxMDM2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM3LCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjQyMDA3NCIKLQkJCQljbGllbnQgICAgIAlANjU2Ci0JCQkJc3VwcGxpZXIgICAJQDY5MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDEwMzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2OTQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANjk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NiwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDEwNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1OTgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk2NTYKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI2IiBANzAwCi0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTc4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1OTcxMDJFQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI3IiBANzAxCi0JCQkJCVBhcmVudF9WaWV3IAlANzAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA5LCAyMzUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQkJY2xpZW50ICAgICAJQDcwMAotCQkJCQlzdXBwbGllciAgIAlANjg4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3NSwgMTc4KQotCQkJCQkgICAgKDU1MCwgMTc4KQotCQkJCQkgICAgKDU1MCwgMzA2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCAzMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDcwMwotCQkJCQlQYXJlbnRfVmlldyAJQDcwMAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODMxMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJCWNsaWVudCAgICAgCUA3MDAKLQkJCQkJc3VwcGxpZXIgICAJQDY5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAxNzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYxLCAyMTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjUwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODgiIEA3MDYKLQkJCQlsb2NhdGlvbiAgIAkoMzY5LCA3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwMjAzQTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0cyIgQDcwNwotCQkJCQlQYXJlbnRfVmlldyAJQDcwNgotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQ5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA2NSIKLQkJCQkJY2xpZW50ICAgICAJQDcwNgotCQkJCQlzdXBwbGllciAgIAlANjkwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDM2OSwgNzIpCi0JCQkJCSAgICAoMTAwLCA3MikKLQkJCQkJICAgICgxMDAsIDU2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwLCA1NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc5MDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4OSIgQDcxMAotCQkJCQlQYXJlbnRfVmlldyAJQDcwNgotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDMxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNTEiCi0JCQkJCWNsaWVudCAgICAgCUA3MDYKLQkJCQkJc3VwcGxpZXIgICAJQDY5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzAiIEA3MTIKLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgNTA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxMwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOCwgNDQ5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTYwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMxIiBANzE0Ci0JCQkJCVBhcmVudF9WaWV3IAlANzEyCi0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ2LCAzNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERiIKLQkJCQkJY2xpZW50ICAgICAJQDcxMgotCQkJCQlzdXBwbGllciAgIAlANjk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNDg3LCA1MDgpCi0JCQkJCSAgICAoMTQ4NywgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIml0ZW1UeXBlRGVmaW5pdGlvbiIgQDcxNgotCQkJCQlQYXJlbnRfVmlldyAJQDcxMgotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzE2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2l0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjIxMTUzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBFMCIKLQkJCQkJY2xpZW50ICAgICAJQDcxMgotCQkJCQlzdXBwbGllciAgIAlANjk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNTkwLCA1MDgpCi0JCQkJCSAgICAoMTU5MCwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDQ2OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAzOTg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MCIgQDcxOQotCQkJCWxvY2F0aW9uICAgCSgxNzI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QjcwMjA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTEiIEA3MjAKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTkKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDM1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU4IgotCQkJCQljbGllbnQgICAgIAlANzE5Ci0JCQkJCXN1cHBsaWVyICAgCUA2OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE2NzgsIDU3NCkKLQkJCQkJICAgICgxNjc4LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OCwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWVtYmVyVHlwZURlZmluaXRpb25zIiBANzIyCi0JCQkJCVBhcmVudF9WaWV3IAlANzE5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA2NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWVtYmVyVHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMjY5MjMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCQljbGllbnQgICAgIAlANzE5Ci0JCQkJCXN1cHBsaWVyICAgCUA2OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE3ODEsIDU3NCkKLQkJCQkJICAgICgxNzgxLCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMCwgNTIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMTIxMjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkyIiBANzI1Ci0JCQkJbG9jYXRpb24gICAJKDc0OCwgMjY5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNjMyMDFEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnVuZGFtZW50YWxGYWNldHMiIEA3MjYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MjUKLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgMzEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Z1bmRhbWVudGFsRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDA5MDkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCQljbGllbnQgICAgIAlANzI1Ci0JCQkJCXN1cHBsaWVyICAgCUA2OTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzQ4LCAyNjkpCi0JCQkJCSAgICAoNjU5LCAyNjkpCi0JCQkJCSAgICAoNjU5LCA1NjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTksIDU2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyOCwgMzg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzgwMjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MyIgQDcyOQotCQkJCQlQYXJlbnRfVmlldyAJQDcyNQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1MiwgMjI4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNTkiCi0JCQkJCWNsaWVudCAgICAgCUA3MjUKLQkJCQkJc3VwcGxpZXIgICAJQDY5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAyNjkpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NCIgQDczMQotCQkJCWxvY2F0aW9uICAgCSgxMTc1LCAzOTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEA3MzIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzEKLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDMxNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCQljbGllbnQgICAgIAlANzMxCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDExMzUsIDM5NikKLQkJCQkJICAgICgxMTM1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANzM0Ci0JCQkJCVBhcmVudF9WaWV3IAlANzMxCi0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA0NDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuNTMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANzMxCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDEyMTUsIDM5NikKLQkJCQkJICAgICgxMjE1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxNSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgMzU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk2MTU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NiIgQDczNwotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0NDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTciIEA3MzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzcKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNjgsIDMyNykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjJGIgotCQkJCQljbGllbnQgICAgIAlANzM3Ci0JCQkJCXN1cHBsaWVyICAgCUA2OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQotCQkJCQkgICAgKDEzMDksIDQ0NikKLQkJCQkJICAgICgxMzA5LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwOSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iIEA3NDAKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzcKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDQsIDUwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQkJY2xpZW50ICAgICAJQDczNwotCQkJCQlzdXBwbGllciAgIAlANjk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNjAsIDQ0NikKLQkJCQkJICAgICgxNDEyLCA0NDYpCi0JCQkJCSAgICAoMTQxMiwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTIsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzMsIDQwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYyMTQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANzQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgNTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgMzc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDg4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBsaXN0IgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgdW5pb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDc0NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDkyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzdCMDM5NiIKLQkJCQljbGllbnQgICAgIAlANjkzCi0JCQkJc3VwcGxpZXIgICAJQDY4OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MSwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTEsIDUyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCWNsaWVudCAgICAgCUA2OTAKLQkJCQlzdXBwbGllciAgIAlANjg4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA1NjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgNTIyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NDcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJY2xpZW50ICAgICAJQDY4OAotCQkJCXN1cHBsaWVyICAgCUA2NzAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjYsIDMwNikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY2LCAyMTUpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2Qzg4MDFCNCIKLQkJCQljbGllbnQgICAgIAlANjQ4Ci0JCQkJc3VwcGxpZXIgICAJQDY5MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDc4MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2OTEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTkwMjgxIgotCQkJCWNsaWVudCAgICAgCUA2NjUKLQkJCQlzdXBwbGllciAgIAlANjc4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwLCAxODQwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAsIDE0NDQpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCNjlENjhEMDBEMiIKLQkJCXRpdGxlICAgICAgCSI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANzUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJd2lkdGggICAgICAJMzU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANzUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MiwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgMTUwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNiwgMTQ2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMzA0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjYzLCAyNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANzU0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTMxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANzU1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA3MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA2NjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA3NTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA3NTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDU0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDUwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDc1OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDY4LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANzU5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTE3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDc2MAotCQkJCWxvY2F0aW9uICAgCSgxOTk0LCAxNDEyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA3NTkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5OTQsIDE0MTIpCi0JCQkJICAgICgxOTk0LCAxMjcxKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzYxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA3NTIKLQkJCQlzdXBwbGllciAgIAlANzU5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA4NCwgMTQ0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA4NCwgMTQxMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3NjApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDc2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MCwgODIxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDAyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTIsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQl3aWR0aCAgICAgIAkyMzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANzY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDg0LCAzNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDc2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgMTgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA3NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDY3LCAxNjc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNjY5Ci0JCQkJaGVpZ2h0ICAgICAJMTAwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NjcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDc2NgotCQkJCXN1cHBsaWVyICAgCUA3NTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTcyLCAxNjYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcyLCAxNDEyKQotCQkJCWRyYXdTdXBwbGllciAJQDc2MCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDc2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgsIDk4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA3NjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODgsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDc3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA3NzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MiwgNjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTczOAotCQkJCWhlaWdodCAgICAgCTU0MwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMiIgQDc3MgotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzMiIEA3NzMKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzIKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzM0MiCi0JCQkJCWNsaWVudCAgICAgCUA3NzIKLQkJCQkJc3VwcGxpZXIgICAJQDc1NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjcxLCAxMzU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc3NAotCQkJCQlQYXJlbnRfVmlldyAJQDc3MgotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk4LCAxMzIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS4xMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJCWNsaWVudCAgICAgCUA3NzIKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4NjUsIDEzNTkpCi0JCQkJCSAgICAoOTI1LCAxMzU5KQotCQkJCQkgICAgKDkyNSwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEyNzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjQyMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTYiIEA3NzcKLQkJCQlsb2NhdGlvbiAgIAkoNzEzLCA3MDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEYwMjEyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTciIEA3NzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzcKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwQzkiCi0JCQkJCWNsaWVudCAgICAgCUA3NzcKLQkJCQkJc3VwcGxpZXIgICAJQDc1NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDcwOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzcKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNjY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTIzOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQkJY2xpZW50ICAgICAJQDc3NwotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgNzA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk2LCA3NTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MzU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTAiIEA3ODIKLQkJCQlsb2NhdGlvbiAgIAkoNzE5LCAxMTkzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE1MDA4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUxIiBANzgzCi0JCQkJCVBhcmVudF9WaWV3IAlANzgyCi0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMDk2IgotCQkJCQljbGllbnQgICAgIAlANzgyCi0JCQkJCXN1cHBsaWVyICAgCUA3NTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTE5MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3ODQKLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODIKLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMTE0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDY5OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwQTAiCi0JCQkJCWNsaWVudCAgICAgCUA3ODIKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMTkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCAxMjQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDQxNjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEwIiBANzg3Ci0JCQkJbG9jYXRpb24gICAJKDc4NSwgNTUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTExIiBANzg4Ci0JCQkJCVBhcmVudF9WaWV3IAlANzg3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDIzRiIKLQkJCQkJY2xpZW50ICAgICAJQDc4NwotCQkJCQlzdXBwbGllciAgIAlANzU3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNTUwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4OQotCQkJCQlQYXJlbnRfVmlldyAJQDc4NwotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OSwgNTE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzA3MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJCWNsaWVudCAgICAgCUA3ODcKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODUsIDU1MCkKLQkJCQkJICAgICg4ODQsIDU1MCkKLQkJCQkJICAgICg4ODQsIDY3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyOTczMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODIiIEA3OTIKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgNDA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgzIiBANzkzCi0JCQkJCVBhcmVudF9WaWV3IAlANzkyCi0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTY1IgotCQkJCQljbGllbnQgICAgIAlANzkyCi0JCQkJCXN1cHBsaWVyICAgCUA3NTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDEzNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBANzk0Ci0JCQkJCVBhcmVudF9WaWV3IAlANzkyCi0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI0LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC42NjU0MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCQljbGllbnQgICAgIAlANzkyCi0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg0Mzg3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5OCIgQDc5NwotCQkJCWxvY2F0aW9uICAgCSgxNzUyLCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMjkxMDE1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk5IiBANzk4Ci0JCQkJCVBhcmVudF9WaWV3IAlANzk3Ci0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxOUYiCi0JCQkJCWNsaWVudCAgICAgCUA3OTcKLQkJCQkJc3VwcGxpZXIgICAJQDc1OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzUyLCAxMDM0KQotCQkJCQkgICAgKDE4MTIsIDEwMzQpCi0JCQkJCSAgICAoMTgxMiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3OTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTcKLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0MywgOTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTYwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDFBOSIKLQkJCQkJY2xpZW50ICAgICAJQDc5NwotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgMTAzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODQsIDEwNjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MDMzMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDAiIEA4MDIKLQkJCQlsb2NhdGlvbiAgIAkoMTg5NiwgODgxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOTAwNkNGMDA4OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAxIiBAODAzCi0JCQkJCVBhcmVudF9WaWV3IAlAODAyCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQkJY2xpZW50ICAgICAJQDgwMgotCQkJCQlzdXBwbGllciAgIAlANzU5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE4OTYsIDg4MSkKLQkJCQkJICAgICgxOTU2LCA4ODEpCi0JCQkJCSAgICAoMTk1NiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTU2LCAxMTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGVyaXZhdGlvbkFubm90YXRpb24iIEA4MDQKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDIKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCA4NDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1NDIzNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQkJY2xpZW50ICAgICAJQDgwMgotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA4ODEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg5LCA5MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNTA4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDIiIEA4MDcKLQkJCQlsb2NhdGlvbiAgIAkoMjA0MCwgNzE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjMzMDI2NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAzIiBAODA4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODA3Ci0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyODQiCi0JCQkJCWNsaWVudCAgICAgCUA4MDcKLQkJCQkJc3VwcGxpZXIgICAJQDc1OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMDQwLCA3MTUpCi0JCQkJCSAgICAoMjEwMCwgNzE1KQotCQkJCQkgICAgKDIxMDAsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMCwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODA5Ci0JCQkJCVBhcmVudF9WaWV3IAlAODA3Ci0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDY4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjhFIgotCQkJCQljbGllbnQgICAgIAlAODA3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDc0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA5MzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMCIgQDgxMgotCQkJCWxvY2F0aW9uICAgCSg2NjgsIDg2NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNDAwNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMSIgQDgxMwotCQkJCQlQYXJlbnRfVmlldyAJQDgxMgotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMENBIgotCQkJCQljbGllbnQgICAgIAlAODEyCi0JCQkJCXN1cHBsaWVyICAgCUA3NjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDczLCA4NjUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODE0Ci0JCQkJCVBhcmVudF9WaWV3IAlAODEyCi0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgODI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzNDE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBENCIKLQkJCQkJY2xpZW50ICAgICAJQDgxMgotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgODY1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAxLCA5MDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4MjA1MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjQiIEA4MTcKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgMTY3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI1IiBAODE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE3Ci0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUM0IgotCQkJCQljbGllbnQgICAgIAlAODE3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ3MiwgMTY3KQotCQkJCQkgICAgKDE0NzIsIDcyKQotCQkJCQkgICAgKDE4ODMsIDcyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODMsIDcyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgxOQotCQkJCQlQYXJlbnRfVmlldyAJQDgxNwotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzYzMDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUNFIgotCQkJCQljbGllbnQgICAgIAlAODE3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTksIDYxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkzNTc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc0IiBAODIyCi0JCQkJbG9jYXRpb24gICAJKDkyNywgMzUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjA2MDI5MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzUiIEA4MjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjIKLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcxIgotCQkJCQljbGllbnQgICAgIAlAODIyCi0JCQkJCXN1cHBsaWVyICAgCUA3NjQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCAzNTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODI0Ci0JCQkJCVBhcmVudF9WaWV3IAlAODIyCi0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAzMTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjgxNjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MiIKLQkJCQkJY2xpZW50ICAgICAJQDgyMgotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkyNywgMzUwKQotCQkJCQkgICAgKDk4NywgMzUwKQotCQkJCQkgICAgKDk4NywgNjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg3LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM3LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MzM0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NiIgQDgyNwotCQkJCWxvY2F0aW9uICAgCSgxMDI3LCAyMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREMwMkY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NyIgQDgyOAotCQkJCQlQYXJlbnRfVmlldyAJQDgyNwotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDIzOCIKLQkJCQkJY2xpZW50ICAgICAJQDgyNwotCQkJCQlzdXBwbGllciAgIAlANzY1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDIyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MjkKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjcKLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODMwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDA2MjUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjQyIgotCQkJCQljbGllbnQgICAgIAlAODI3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTAyNywgMjIyKQotCQkJCQkgICAgKDEwODcsIDIyMikKLQkJCQkJICAgICgxMDg3LCA2NzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNjEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTAwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgyNTgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkwIiBAODMyCi0JCQkJbG9jYXRpb24gICAJKDE0OTQsIDE0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2ODgwMUMyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MSIgQDgzMwotCQkJCQlQYXJlbnRfVmlldyAJQDgzMgotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTExIgotCQkJCQljbGllbnQgICAgIAlAODMyCi0JCQkJCXN1cHBsaWVyICAgCUA3NjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxNjYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudEFubm90YXRpb24iIEA4MzQKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzIKLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NiwgMTM1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50QW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3NzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExQiIKLQkJCQkJY2xpZW50ICAgICAJQDgzMgotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDMsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzAwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDQiIEA4MzcKLQkJCQlsb2NhdGlvbiAgIAkoNjM3LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE3MDJDOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ1IiBAODM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODM3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTgwM0UyIgotCQkJCQljbGllbnQgICAgIAlAODM3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxMSwgMTAyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzcKLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxMCwgOTc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODg4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE5MDAwNCIKLQkJCQkJY2xpZW50ICAgICAJQDgzNwotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDEwMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEwNjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMDA4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NCIgQDg0MgotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA2MDcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTcwMTAyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NSIgQDg0MwotCQkJCQlQYXJlbnRfVmlldyAJQDg0MgotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MSIKLQkJCQkJY2xpZW50ICAgICAJQDg0MgotCQkJCQlzdXBwbGllciAgIAlANzY5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1ODEsIDYwNykKLQkJCQkJICAgICgxNTgxLCA1NDcpCi0JCQkJCSAgICAoMTY3OSwgNTQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzksIDU0NykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlAODQyCi0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA0NjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTg4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTIiCi0JCQkJCWNsaWVudCAgICAgCUA4NDIKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNjIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA0IiBAODQ3Ci0JCQkJbG9jYXRpb24gICAJKDg0OSwgMTQ5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMTAyNkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNSIgQDg0OAotCQkJCQlQYXJlbnRfVmlldyAJQDg0NwotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDFGOSIKLQkJCQkJY2xpZW50ICAgICAJQDg0NwotCQkJCQlzdXBwbGllciAgIAlANzcwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAODQ3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDIsIDE0NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTg4MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMjAzIgotCQkJCQljbGllbnQgICAgIAlAODQ3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODQ5LCAxNDk2KQotCQkJCQkgICAgKDEwNjIsIDE0OTYpCi0JCQkJCSAgICAoMTA2MiwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDYyLCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNSwgMTI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyNjkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNiIgQDg1MgotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE1NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjMwMDA1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDciIEA4NTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTIKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMjciCi0JCQkJCWNsaWVudCAgICAgCUA4NTIKLQkJCQkJc3VwcGxpZXIgICAJQDc3MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNTY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4NTQKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTIKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDE1MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwNDk1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMzMiIKLQkJCQkJY2xpZW50ICAgICAJQDg1MgotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk1MiwgMTU2NSkKLQkJCQkJICAgICgxMjAwLCAxNTY1KQotCQkJCQkgICAgKDEyMDAsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTQsIDEyNzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg1NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQljbGllbnQgICAgIAlANzUzCi0JCQkJc3VwcGxpZXIgICAJQDc2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDI0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgMTM1KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDc2OQotCQkJCXN1cHBsaWVyICAgCUA3NTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTk3LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTcsIDM1OSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJcXVpZCAgICAgICAJIjNCNkFENzREMDNDNCIKLQkJCXRpdGxlICAgICAgCSI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDg1OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODU5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDg2MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCXdpZHRoICAgICAgCTU0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA4NjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDk5MSwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA4NjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTYsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODYzCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDU2MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODYyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMzYwLCA1NjEpCi0JCQkJICAgICgxMzYwLCA0NzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIgQDg2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREluY2x1ZGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiCi0JCQkJd2lkdGggICAgICAJMjU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAODY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAODY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDg2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzUsIDExNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJODY5Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQyIiBAODY4Ci0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDEyMDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDMiIEA4NjkKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjgKLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUA4NjgKLQkJCQkJc3VwcGxpZXIgICAJQDg2NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODcwCi0JCQkJCVBhcmVudF9WaWV3IAlAODY4Ci0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzQ3LCAxMTU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NDQxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QyIKLQkJCQkJY2xpZW50ICAgICAJQDg2OAotCQkJCQlzdXBwbGllciAgIAlAODY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNCwgMTIwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDAsIDEyNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDcKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTQ3MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQwIiBAODczCi0JCQkJbG9jYXRpb24gICAJKDExNjgsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDgwMkZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDEiIEA4NzQKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzMKLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QiIKLQkJCQkJY2xpZW50ICAgICAJQDg3MwotCQkJCQlzdXBwbGllciAgIAlAODY1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNjgsIDEwMjIpCi0JCQkJCSAgICAoMTE2OCwgOTYyKQotCQkJCQkgICAgKDEyODUsIDk2MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NSwgOTYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg3NQotCQkJCQlQYXJlbnRfVmlldyAJQDg3MwotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjkwLCAxMDc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJCWNsaWVudCAgICAgCUA4NzMKLQkJCQkJc3VwcGxpZXIgICAJQDg2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNjgsIDExNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTI3LCAxMDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzY5NzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYyIiBAODc4Ci0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEzNTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDIwMDlBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjMiIEA4NzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzgKLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJCWNsaWVudCAgICAgCUA4NzgKLQkJCQkJc3VwcGxpZXIgICAJQDg2NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDE5NDAsIDEzNTMpCi0JCQkJCSAgICAoMTk0MCwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MCwgMTI1NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODgwCi0JCQkJCVBhcmVudF9WaWV3IAlAODc4Ci0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCAxMzIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTY4MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJCWNsaWVudCAgICAgCUA4NzgKLQkJCQkJc3VwcGxpZXIgICAJQDg2NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDExODEsIDEzNTMpCi0JCQkJCSAgICAoMTE4MSwgMTI1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4MSwgMTI1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzAsIDEzMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MTM0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4ODMKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA1NjEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg1OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjg4LCA1NjEpCi0JCQkJICAgICgyODgsIDQ3MSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDg4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDYyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDg4NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1OCwgMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQkJd2lkdGggICAgICAJNDE0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAODg2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA5NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgOTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA4ODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwLCA2MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAODg3Ci0JCQkJc3VwcGxpZXIgICAJQDg1OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMSwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjEsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4ODMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA4ODQKLQkJCQlzdXBwbGllciAgIAlAODU5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTg5LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OSwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDg4MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4OTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJY2xpZW50ICAgICAJQDg2MQotCQkJCXN1cHBsaWVyICAgCUA4NjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDE2LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTYsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEA4OTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTAsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODkyCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDEwODkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg5MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTgyNCwgMTA4OSkKLQkJCQkgICAgKDE4MjQsIDk5OSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg5MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOERDMDM4MSIKLQkJCQljbGllbnQgICAgIAlAODY0Ci0JCQkJc3VwcGxpZXIgICAJQDg5MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjYsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjYsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODkyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg5NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCIKLQkJCQljbGllbnQgICAgIAlAODY2Ci0JCQkJc3VwcGxpZXIgICAJQDg5MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MzQsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzQsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODkyKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA4OTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODk2Ci0JCQkJbG9jYXRpb24gICAJKDE3NjIsIDgxOSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODk1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzYyLCA4MTkpCi0JCQkJICAgICgxNzYyLCA3MjcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4OTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiCi0JCQkJY2xpZW50ICAgICAJQDg2NQotCQkJCXN1cHBsaWVyICAgCUA4OTUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE2LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTYsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODk4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA4OTUKLQkJCQlzdXBwbGllciAgIAlAODYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NiwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU2LCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODYzKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDg5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxNDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MDAKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjg5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4OTkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDExMjAsIDI4OSkKLQkJCQkgICAgKDExMjAsIDE5OSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDQiIEA5MDEKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NSwgMjE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGFpbmVyIiBAOTAyCi0JCQkJCVBhcmVudF9WaWV3IAlAOTAxCi0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDIxMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250YWluZXIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMzExMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0UiCi0JCQkJCWNsaWVudCAgICAgCUA5MDEKLQkJCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMTc2KQotCQkJCQkgICAgKDEzNzQsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM1LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMjY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA1IiBAOTA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTAxCi0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0YiCi0JCQkJCWNsaWVudCAgICAgCUA5MDEKLQkJCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMjU0KQotCQkJCQkgICAgKDEzNDUsIDI1NCkKLQkJCQkJICAgICgxMzQ1LCAxOTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM0NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDYiIEA5MDYKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAyMTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNDgwMjYxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290Q29udGFpbmVyIiBAOTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTA2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAyMTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdENvbnRhaW5lciIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNTAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTYwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJCWNsaWVudCAgICAgCUA5MDYKLQkJCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDE3NikKLQkJCQkJICAgICg4NjYsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNyIgQDkxMAotCQkJCQlQYXJlbnRfVmlldyAJQDkwNgotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODYiCi0JCQkJCWNsaWVudCAgICAgCUA5MDYKLQkJCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDI1NykKLQkJCQkJICAgICg4OTUsIDI1NykKLQkJCQkJICAgICg4OTUsIDE5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQljbGllbnQgICAgIAlAODYyCi0JCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjcsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NywgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkwMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDhFMjAwRUEiCi0JCQkJY2xpZW50ICAgICAJQDg2MAotCQkJCXN1cHBsaWVyICAgCUA4OTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTAwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQljbGllbnQgICAgIAlAODU5Ci0JCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTksIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkxNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTE0Ci0JCQkJc3VwcGxpZXIgICAJQDg4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNiwgMTE0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2LCA3MjcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTgiIEA5MTYKLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTQyNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxOSIgQDkxNwotCQkJCQlQYXJlbnRfVmlldyAJQDkxNgotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDkxNgotCQkJCQlzdXBwbGllciAgIAlAODkxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjE0NywgMTQyNSkKLQkJCQkJICAgICgyMTQ3LCA5NDMpCi0JCQkJCSAgICAoMjA2NywgOTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY3LCA5NDMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEA5MTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MTYKLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTE5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NSwgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQkJY2xpZW50ICAgICAJQDkxNgotCQkJCQlzdXBwbGllciAgIAlAOTE0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjI1LCAxNDI1KQotCQkJCQkgICAgKDIyNSwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI1LCAxMjU1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTY5MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE2IiBAOTIxCi0JCQkJbG9jYXRpb24gICAJKDE1MDUsIDE1MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTciIEA5MjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjEKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUA5MjEKLQkJCQkJc3VwcGxpZXIgICAJQDg5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTA1LCAxNTAzKQotCQkJCQkgICAgKDIxODgsIDE1MDMpCi0JCQkJCSAgICAoMjE4OCwgNjc1KQotCQkJCQkgICAgKDIwNTksIDY3NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1OSwgNjc1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEA5MjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjEKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCQljbGllbnQgICAgIAlAOTIxCi0JCQkJCXN1cHBsaWVyICAgCUA5MTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUwNSwgMTUwMykKLQkJCQkJICAgICgxMTMsIDE1MDMpCi0JCQkJCSAgICAoMTEzLCAxMjU1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMsIDEyNTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY3NjgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwOCIgQDkyNgotCQkJCWxvY2F0aW9uICAgCSg2NiwgMjQ0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQzMxMDM1NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA5IiBAOTI3Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTI2Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzMxIgotCQkJCQljbGllbnQgICAgIAlAOTI2Ci0JCQkJCXN1cHBsaWVyICAgCUA4OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjYsIDI0NCkKLQkJCQkJICAgICg2NiwgMTQ0KQotCQkJCQkgICAgKDg2NiwgMTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE0NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDkyOAotCQkJCQlQYXJlbnRfVmlldyAJQDkyNgotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNjgxMTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTk5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzM0IiCi0JCQkJCWNsaWVudCAgICAgCUA5MjYKLQkJCQkJc3VwcGxpZXIgICAJQDkxNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2LCAxMTQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAxODQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMTMKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY2NTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTMxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3ODBCRDkwMDU5IgotCQkJCWNsaWVudCAgICAgCUA4ODUKLQkJCQlzdXBwbGllciAgIAlAODk5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU5LCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTAwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAODY3Ci0JCQkJc3VwcGxpZXIgICAJQDg1OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQwMCwgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODgzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MzMKLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgODM3KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4NjEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEwMTIsIDgzNykKLQkJCQkgICAgKDEwMTIsIDcyNykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzNAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDkzNQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MSwgODcxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODg4MTU4Ci0JCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0RTIwMzY2IgotCQkJCWNsaWVudCAgICAgCUA4NjcKLQkJCQlzdXBwbGllciAgIAlAODYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzNywgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzNywgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDkzMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MzYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzcKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5MCwgODY1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTgxNjMzCi0JCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0QkEwMjNDIgotCQkJCWNsaWVudCAgICAgCUA4ODYKLQkJCQlzdXBwbGllciAgIAlAODYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI1LCA5MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDkzMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDg5MQotCQkJCXN1cHBsaWVyICAgCUA4OTUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI4LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjgsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTYpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJcXVpZCAgICAgICAJIjNCOUY4Rjc2MDJDNyIKLQkJCXRpdGxlICAgICAgCSI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA5MzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCAxNDQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxMzU5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxNDE5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkzODIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZm9ybSA6IFhTREZvcm0iCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGb3JtIiBAOTQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NjAsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZvcm0iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzE1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOUY5MTNCMDFFQiIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5NDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgOTcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBlbGVtZW50IDogRE9NRWxlbWVudCIpKQotCQkJCXdpZHRoICAgICAgCTY3NQotCQkJCWhlaWdodCAgICAgCTE0MwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDk0MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg3LCAzMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDAKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDk0MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzgsIDg5MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDcwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAOTQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgMTQwOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMTM1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAOTQ1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg2NCwgNjI0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDU3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQkJd2lkdGggICAgICAJMjU2Ci0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk0NgotCQkJCWxvY2F0aW9uICAgCSg4NTAsIDUzNykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTQyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg4NTAsIDUzNykKLQkJCQkgICAgKDg1MCwgNDQ3KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUVsZW1lbnQiIEA5NDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI0OCwgMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01FbGVtZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4MTg5NzkwMjAwIgotCQkJCXdpZHRoICAgICAgCTc2OQotCQkJCWhlaWdodCAgICAgCTIwMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5NDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA2NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCA1ODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAOTQ5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMzMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCXdpZHRoICAgICAgCTQyMgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NTAKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyNjMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk0MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzY4LCAyNjMpCi0JCQkJICAgICgzNjgsIDE2NykpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDk1MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTQ1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxMzQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTI5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTQwNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgc3Vic3RpdHV0aW9uIgotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyBhbGwiKSkKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA5NTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE3OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTcwOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE2NTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3NjgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMTk4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iCi0JCQkJCSIrIGFsbCIpKQotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDk1MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMjA5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMDQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMTAwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMwotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTc3OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDk1NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBAOTU1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NDQsIDIwMTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE5MzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE4ODIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIgotCQkJCXdpZHRoICAgICAgCTM4MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA5NTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMzM5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTU4OAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB1c2UgOiBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIKLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNjQwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IiBAOTU3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTYzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE0OTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JBN0IwRTgwMUE4IgotCQkJCXdpZHRoICAgICAgCTUxMgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAOTU4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2MDgsIDkyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ5OCwgODgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzOAotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDk1OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNDAsIDE3MTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJOTY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTY5MSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk5MzQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKSkKLQkJCQl3aWR0aCAgICAgIAk5ODQKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA5NjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAxMTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMDk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTE1NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NTIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk5MDYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAOTYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEwMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyMiwgNzc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTk5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMTAxNAotCQkJCWhlaWdodCAgICAgCTQ4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA5NjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA5NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3LCA5MDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDk2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzNDQsIDY1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjYwKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDMwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDk2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDE5NDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMjAwMikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk4MjIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEQ29tcGxleEZpbmFsIgotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCQkiKyBtaXhlZCA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk4NzgKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA5NjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4OCwgMTY5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwNCwgMTY0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzg2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTY2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUA5NjUKLQkJCQlzdXBwbGllciAgIAlAOTQ0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNiwgMTYzMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwNiwgMTQ3MikpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA5NjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjIwOCwgNzA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA1OTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJOTAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJOTE4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTY4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCWNsaWVudCAgICAgCUA5NTgKLQkJCQlzdXBwbGllciAgIAlAOTQyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY5NiwgODY5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjk2LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQ2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlAOTU5Ci0JCQkJc3VwcGxpZXIgICAJQDkzOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTQsIDE2MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTQsIDE1MzMpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NzAKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NywgMTg1NikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTY1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNDg3LCAxODU2KQotCQkJCSAgICAoMTQ4NywgMTc2MCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01BdHRyIiBAOTcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MDAsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzUwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01BdHRyIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQkJGOEM4OTAxQjYiCi0JCQkJd2lkdGggICAgICAJNjU4Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTcyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA5NjQKLQkJCQlzdXBwbGllciAgIAlAOTY1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczNCwgMTkzMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTczNCwgMTg1NikKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTczCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5IgotCQkJCWNsaWVudCAgICAgCUA5NjMKLQkJCQlzdXBwbGllciAgIAlAOTQyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgNTg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQ2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAOTY3Ci0JCQkJc3VwcGxpZXIgICAJQDk0MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxOTAsIDU4NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5MCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJY2xpZW50ICAgICAJQDk0OAotCQkJCXN1cHBsaWVyICAgCUA5NDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjIsIDU3MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyLCA0NDcpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQljbGllbnQgICAgIAlAOTQ5Ci0JCQkJc3VwcGxpZXIgICAJQDk0MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MCwgMzIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAsIDI2MykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTc3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCWNsaWVudCAgICAgCUA5NjIKLQkJCQlzdXBwbGllciAgIAlAOTQ4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzLCA4OTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMywgNzA4KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDk2MAotCQkJCXN1cHBsaWVyICAgCUA5NTgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAwLCAxMDg0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAwLCA5ODcpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Eb2N1bWVudCIgQDk3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDk0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Eb2N1bWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODUwRTAzODEiCi0JCQkJd2lkdGggICAgICAJNzc2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIgotCQkJCWNsaWVudCAgICAgCUA5NDIKLQkJCQlzdXBwbGllciAgIAlAOTQxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCAzMjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgMjYzKQotCQkJCWRyYXdTdXBwbGllciAJQDk1MCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDk4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDM1MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDMwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJCXdpZHRoICAgICAgCTY4NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAOTQ1Ci0JCQkJc3VwcGxpZXIgICAJQDk0MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1MCwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCWNsaWVudCAgICAgCUA5NTYKLQkJCQlzdXBwbGllciAgIAlAOTQyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAxMjY3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA5NDMKLQkJCQlzdXBwbGllciAgIAlAOTQyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5NCwgODgwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjk0LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQ2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTYxCi0JCQkJc3VwcGxpZXIgICAJQDk0NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgNzY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDY4NykpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk4NgotCQkJCWxvY2F0aW9uICAgCSgxNzAzLCAxMjkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NDMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE3MDMsIDEyOTApCi0JCQkJICAgICgxNzAzLCAxMDA4KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUA5NDQKLQkJCQlzdXBwbGllciAgIAlAOTQzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwMywgMTM0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTI5MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5ODYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUA5MzkKLQkJCQlzdXBwbGllciAgIAlAOTQzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTM0NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMTI5MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5ODYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA5NTMKLQkJCQlzdXBwbGllciAgIAlAOTY1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MywgMjAyOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MywgMTg1NikKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI4LiBDb25jcmV0ZSBDb250YWlubWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBODA5NzAyN0EiCi0JCQl0aXRsZSAgICAgIAkiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDk5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NzIsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzOSwgOTQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDk5MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NDAsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzMSwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAOTkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDEzLCA3NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDk5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk5NAotCQkJCWxvY2F0aW9uICAgCSgxOTQzLCA4NjgpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk5MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTk0MywgODY4KQotCQkJCSAgICAoMTk0MywgNjMxKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NCIgQDk5NQotCQkJCWxvY2F0aW9uICAgCSgyMTI1LCA2ODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjQwMDUxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjUiIEA5OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTUKLQkJCQkJbG9jYXRpb24gICAJKDE1NywgMzQ0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJBRCIKLQkJCQkJY2xpZW50ICAgICAJQDk5NQotCQkJCQlzdXBwbGllciAgIAlAOTkyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA3MjkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDk5NwotCQkJCQlQYXJlbnRfVmlldyAJQDk5NQotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU1LCA2NzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQjciCi0JCQkJCWNsaWVudCAgICAgCUA5OTUKLQkJCQkJc3VwcGxpZXIgICAJQDk5MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NywgNjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDEwMDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMDEKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMDAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI3MiwgNDY1KQotCQkJCSAgICAoMjcyLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAxMDAyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNzIsIDExMjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTY5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTU4NwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEAxMDAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA1NzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OSwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCXdpZHRoICAgICAgCTM1MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MiIgQDEwMDQKLQkJCQlsb2NhdGlvbiAgIAkoMTE3MCwgMTM1NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEAxMDA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAwNAotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OSwgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzQwNDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTMzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDAzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzAsIDEzNTYpCi0JCQkJCSAgICAoMjA2LCAxMzU2KQotCQkJCQkgICAgKDIwNiwgNjMxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDYsIDYzMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2LCAxMzIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTkxNDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MyIgQDEwMDgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA0Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjUyMSwgMTM5OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4IgotCQkJCQljbGllbnQgICAgIAlAMTAwNAotCQkJCQlzdXBwbGllciAgIAlAMTAwMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTcwLCAxMzU2KQotCQkJCQkgICAgKDI3MzEsIDEzNTYpCi0JCQkJCSAgICAoMjczMSwgMTIyNykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjczMSwgMTIyNykpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMDEwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NiIgQDEwMTEKLQkJCQlsb2NhdGlvbiAgIAkoMTIyLCAxMTM2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJDRUIxMDJGOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ3IiBAMTAxMgotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTEKLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjYwMDFCIgotCQkJCQljbGllbnQgICAgIAlAMTAxMQotCQkJCQlzdXBwbGllciAgIAlAMTAwMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCA2MzEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDExCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjMsIDE1MTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MDQ5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDExCi0JCQkJCXN1cHBsaWVyICAgCUAxMDEwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDE2NDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MCwgMTU4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgxMTg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDEwMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQkJd2lkdGggICAgICAJNTEzCi0JCQkJaGVpZ2h0ICAgICAJMTAwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU4IiBAMTAxNwotCQkJCWxvY2F0aW9uICAgCSg0NywgODg1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0NzE1MDExOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU5IiBAMTAxOAotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTcKLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDE3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDEwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDE2NDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTAxOQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTcKLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyLCAxODkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIxODU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk5NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MUEwM0I1IgotCQkJCQljbGllbnQgICAgIAlAMTAxNwotCQkJCQlzdXBwbGllciAgIAlAMTAxNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI4LCAxOTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNzg4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEAxMDIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MiwgODQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJd2lkdGggICAgICAJMzYzCi0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTAyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTc1LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4OCIgQDEwMjQKLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgMTAzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFOTAxOEEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg5IiBAMTAyNQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQKLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFQTAzNkMiCi0JCQkJCWNsaWVudCAgICAgCUAxMDI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE5LCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxOSwgOTU1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwMjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEwMzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDczMTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM4MCIKLQkJCQkJY2xpZW50ICAgICAJQDEwMjQKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjc5LCAxMDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDQwODE2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBAMTAyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE2OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU1LCAxNjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMDMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTY5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4NCIgQDEwMzEKLQkJCQlsb2NhdGlvbiAgIAkoMTM1MSwgMTg0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNTAxMTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NSIgQDEwMzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMxCi0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0I0IgotCQkJCQljbGllbnQgICAgIAlAMTAzMQotCQkJCQlzdXBwbGllciAgIAlAMTAzMAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzUxLCAxODQwKQotCQkJCQkgICAgKDEyOTQsIDE4NDApCi0JCQkJCSAgICAoMTI5NCwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NCwgMTc1MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAzMwotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzEKLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTgwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjMyNjUzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNDOCIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzEKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM1MSwgMTg0MCkKLQkJCQkJICAgICgxNDA5LCAxODQwKQotCQkJCQkgICAgKDE0MDksIDE3NTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MSwgMTg0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE3NTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjEsIDE4MDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3Mjg0OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2OCIgQDEwMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMTQzMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAwNkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTAzNwotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzYKLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDE1MjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NDk3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMTgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDM2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDMwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkwLCAxNDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTY0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMTUyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0NTQ1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2OSIgQDEwNDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDM2Ci0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ5LCAxMjY2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMEUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDM2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDIzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkwLCAxNDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTIyMykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg2IiBAMTA0MgotCQkJCWxvY2F0aW9uICAgCSgxNjkwLCAxNjg0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNUFEMDM3NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRDb250ZW50cyIgQDEwNDMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQyCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDE3MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRDb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDEwIgotCQkJCQljbGllbnQgICAgIAlAMTA0MgotCQkJCQlzdXBwbGllciAgIAlAMTAyOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NDYsIDE2ODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE2NDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk5NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDczMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg3IiBAMTA0NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDIKLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2NiwgMTY0MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDA2IgotCQkJCQljbGllbnQgICAgIAlAMTA0MgotCQkJCQlzdXBwbGllciAgIAlAMTAzMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzQsIDE2ODQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMDQ4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjYyNCwgNzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM4OCwgNzQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJCXdpZHRoICAgICAgCTQ5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAMTA0OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMDUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NTcsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NiIgQDEwNTEKLQkJCQlsb2NhdGlvbiAgIAkoOTYzLCAzMTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkIwMDNEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwNTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDUxCi0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCAzNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4MTA4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNTEKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5OSwgMzE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE2LCAyOTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NjM5NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY3IiBAMTA1NQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTEKLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTUsIDM2MSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTA3IgotCQkJCQljbGllbnQgICAgIAlAMTA1MQotCQkJCQlzdXBwbGllciAgIAlAMTA1MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MjgsIDMxOSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxMDU3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgOTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NCwgOTQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDU4Ci0JCQkJbG9jYXRpb24gICAJKDIzMjIsIDE1OTMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwNTcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIzMjIsIDE1OTMpCi0JCQkJICAgICgyMzIyLCAxMDQ3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA1OQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDEwNjAKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ2LCA5MDUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjAwMDAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkY1MDEzQSIKLQkJCQljbGllbnQgICAgIAlAMTA1NwotCQkJCXN1cHBsaWVyICAgCUA5OTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTUwLCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTAsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEwNjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDU3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgNTMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNjYyCi0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEyIiBAMTA2MgotCQkJCWxvY2F0aW9uICAgCSgxNDk4LCAxNDMxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg5MTE0MDFBRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDYzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2MgotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMjcsIDE0NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1NDM4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNyIKLQkJCQkJY2xpZW50ICAgICAJQDEwNjIKLQkJCQkJc3VwcGxpZXIgICAJQDEwNTcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkKLQkJCQkJICAgICgyMjgxLCAxNDMxKQotCQkJCQkgICAgKDIyODEsIDEwNDcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyODEsIDEwNDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMDQsIDEzOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwNTQxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEzIiBAMTA2NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjIKLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCA4NjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNiIKLQkJCQkJY2xpZW50ICAgICAJQDEwNjIKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkKLQkJCQkJICAgICgxMTMxLCAxNDMxKQotCQkJCQkgICAgKDExMzEsIDYzMikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzMSwgNjMyKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEAxMDY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU1LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDA0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEAxMDY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA4OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDUsIDg1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTYiIEAxMDcwCi0JCQkJbG9jYXRpb24gICAJKDUzNCwgNzM2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzM0VGMDE2MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEAxMDcxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3MAotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjAsIDc0OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTU1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTExMTExCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNzAKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA4NDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU5NSwgODA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzU5MjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNyIgQDEwNzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDcwCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgNjUzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDcwCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgNjMyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzYiIEAxMDc2Ci0JCQkJbG9jYXRpb24gICAJKDkwMCwgMTAzMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBAMTA3NwotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzYKLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTMsIDEwNDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzI4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDc2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDY4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMTA0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1ODkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzciIEAxMDgwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3NgotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA5NjgpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNzYKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgOTUxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzgiIEAxMDgyCi0JCQkJbG9jYXRpb24gICAJKDcwMCwgMTAzMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAwMjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDEwODMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDgyCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTAzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1NDc5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSIKLQkJCQkJY2xpZW50ICAgICAJQDEwODIKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgMTExMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzcxLCAxMDQyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMwNzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTcxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzOSIgQDEwODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDgyCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDY1OSwgOTY4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDgyCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDk1MSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBAMTA4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgMTQ0MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwMCwgMTM5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCXdpZHRoICAgICAgCTUyMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwODkKLQkJCQlsb2NhdGlvbiAgIAkoNTUwLCAxNTkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDg4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg1NTAsIDE1OTApCi0JCQkJICAgICg1NTAsIDE0OTUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IiBAMTA5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDAsIDUzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCXdpZHRoICAgICAgCTU0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTQwNiwgNzY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDkwCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNDA2LCA3NjUpCi0JCQkJICAgICgxNDA2LCA2MzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTA5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDE2OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzkzLCAxNjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTQiIEAxMDkzCi0JCQkJbG9jYXRpb24gICAJKDE2MTQsIDE4NjgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RkRERDcwMTEzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NSIgQDEwOTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkzCi0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDkzCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTQsIDE4NjgpCi0JCQkJCSAgICAoMjUwMCwgMTg2OCkKLQkJCQkJICAgICgyNTAwLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAwLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwOTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkzCi0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxNzg3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTg3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQkJY2xpZW50ICAgICAJQDEwOTMKLQkJCQkJc3VwcGxpZXIgICAJQDEwODgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkKLQkJCQkJICAgICg5ODQsIDE4NjgpCi0JCQkJCSAgICAoOTg0LCAxNDk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODQsIDE0OTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDE4MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3MTI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDAiIEAxMDk4Ci0JCQkJbG9jYXRpb24gICAJKDI5MjcsIDM4NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzNjAzODYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUNvbnRlbnRzIiBAMTA5OQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTgKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAzNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlQ29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3MzA2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3QyIKLQkJCQkJY2xpZW50ICAgICAJQDEwOTgKLQkJCQkJc3VwcGxpZXIgICAJQDEwOTAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjkyNywgMzg3KQotCQkJCQkgICAgKDE3NTAsIDM4NykKLQkJCQkJICAgICgxNzUwLCA1MjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNTIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODA0LCA0MjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzI0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAxIiBAMTEwMgotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTgKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOTQ2LCAxNDQ4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDk4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDkyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDI5MjcsIDM4NykKLQkJCQkJICAgICgyOTg3LCAzODcpCi0JCQkJCSAgICAoMjk4NywgMTY3MSkKLQkJCQkJICAgICgyOTI4LCAxNjcxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDE2NzEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDExMDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc2IiBAMTEwNQotCQkJCWxvY2F0aW9uICAgCSgxNzUwLCA4NzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNEUwMDY3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDExMDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTA1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgNjkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTEwMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMkE1IgotCQkJCQljbGllbnQgICAgIAlAMTEwNQotCQkJCQlzdXBwbGllciAgIAlAMTA5MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE0LCA2OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNDQ0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzciIEAxMTA5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDksIDEwNjUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDI5QiIKLQkJCQkJY2xpZW50ICAgICAJQDExMDUKLQkJCQkJc3VwcGxpZXIgICAJQDExMDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDExMTMpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTExMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA4IiBAMTExMgotCQkJCWxvY2F0aW9uICAgCSgxMjUyLCAxODk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRUJEQzg3MDI0NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA5IiBAMTExMwotCQkJCQlQYXJlbnRfVmlldyAJQDExMTIKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAyRjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMTEyCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNTIsIDE4OTYpCi0JCQkJCSAgICAoMjYwMywgMTg5NikKLQkJCQkJICAgICgyNjAzLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAzLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTExNAotCQkJCQlQYXJlbnRfVmlldyAJQDExMTIKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjgyLCAxODU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzgxMTQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCQljbGllbnQgICAgIAlAMTExMgotCQkJCQlzdXBwbGllciAgIAlAMTExMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjUyLCAxODk2KQotCQkJCQkgICAgKDQyOCwgMTg5NikKLQkJCQkJICAgICg0MjgsIDEyMjMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQyOCwgMTIyMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgyLCAxODYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzUwMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODAiIEAxMTE3Ci0JCQkJbG9jYXRpb24gICAJKDExOTksIDEzMjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEMzIwMjIwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MSIgQDExMTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTE3Ci0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEMiCi0JCQkJCWNsaWVudCAgICAgCUAxMTE3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTA0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoMTg5NywgMTMyMSkKLQkJCQkJICAgICgxODk3LCAxMjIzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk3LCAxMjIzKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTExOQotCQkJCQlQYXJlbnRfVmlldyAJQDExMTcKLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk1NjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEQiCi0JCQkJCWNsaWVudCAgICAgCUAxMTE3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTExCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoNTAwLCAxMzIxKQotCQkJCQkgICAgKDUwMCwgMTIyMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxMjIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MjMwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDEwOTIKLQkJCQlzdXBwbGllciAgIAlAMTA1NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDYsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDYsIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA1OCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEyNAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgNDk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDQ2NDI5Ci0JCQkJICAgIGhlaWdodCAgICAgCTYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDEwNjEKLQkJCQlzdXBwbGllciAgIAlAMTAwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTMsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDAxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEwMzAKLQkJCQlzdXBwbGllciAgIAlAMTA1NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDksIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA1OCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTI2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEyNwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgMTU5MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk4MDM5MgotCQkJCSAgICBoZWlnaHQgICAgIAkzODUKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJY2xpZW50ICAgICAJQDEwMzAKLQkJCQlzdXBwbGllciAgIAlAMTA4OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDQsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDQsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA4OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTI4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUAxMDAzCi0JCQkJc3VwcGxpZXIgICAJQDEwMDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwMSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEyOQotCQkJCWxvY2F0aW9uICAgCSg0MzEsIDIyMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTAxNgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDMxLCAyMjIpCi0JCQkJICAgICg0MzEsIDEzMCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzAKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMxCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYxLCAyMjQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NzY3NDQKLQkJCQkgICAgaGVpZ2h0ICAgICAJODYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI0NDAwNjkiCi0JCQkJY2xpZW50ICAgICAJQDEwMDAKLQkJCQlzdXBwbGllciAgIAlAMTAxNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3NSwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUsIDIyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTI5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTMyCi0JCQkJbG9jYXRpb24gICAJKDEzMDksIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA0OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTMwOSwgNDY1KQotCQkJCSAgICAoMTMwOSwgMzc1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzMwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMzQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDEsIDQ5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NDI4NgotCQkJCSAgICBoZWlnaHQgICAgIAkxMAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTY2MDMzOSIKLQkJCQljbGllbnQgICAgIAlAMTA2MQotCQkJCXN1cHBsaWVyICAgCUAxMDQ5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCA1MjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzMSwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExMzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyIKLQkJCQljbGllbnQgICAgIAlAMTAxMAotCQkJCXN1cHBsaWVyICAgCUAxMDg4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjUwLCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA4OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEzNwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDUsIDQ5MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk1ODMzMwotCQkJCSAgICBoZWlnaHQgICAgIAk4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjEwM0JFIgotCQkJCWNsaWVudCAgICAgCUAxMDIzCi0JCQkJc3VwcGxpZXIgICAJQDEwNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEzMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM4Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEzOQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MAotCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkVCMDJBOCIKLQkJCQljbGllbnQgICAgIAlAMTEwNAotCQkJCXN1cHBsaWVyICAgCUA5OTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODc4LCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODc4LCA4NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDAKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQxCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MiwgODA3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODc5MzEwCi0JCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwM0EwMjIxIgotCQkJCWNsaWVudCAgICAgCUAxMTA0Ci0JCQkJc3VwcGxpZXIgICAJQDEwOTAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAzLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAzLCA3NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA5MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQyCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE0MwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTQsIDgwMSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJENzM3MDM4RiIKLQkJCQljbGllbnQgICAgIAlAMTAyMgotCQkJCXN1cHBsaWVyICAgCUAxMDkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI4NCwgODM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg0LCA3NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA5MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNjQwMjQwIgotCQkJCWNsaWVudCAgICAgCUA5OTIKLQkJCQlzdXBwbGllciAgIAlAMTA0OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyODQsIDc2MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3OSwgNzYyKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA5OTEKLQkJCQlzdXBwbGllciAgIAlAMTA0OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDUyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExMzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiIKLQkJCQljbGllbnQgICAgIAlAMTA0OAotCQkJCXN1cHBsaWVyICAgCUA5OTEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA3MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDYzMSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSIKLQkJCQljbGllbnQgICAgIAlAOTkzCi0JCQkJc3VwcGxpZXIgICAJQDEwNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUwLCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTMyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDgKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ5Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyMSwgODk3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDg3NzE5Ci0JCQkJICAgIGhlaWdodCAgICAgCTc2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNEYwMjNDIgotCQkJCWNsaWVudCAgICAgCUA5OTAKLQkJCQlzdXBwbGllciAgIAlAMTA0OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4OTYsIDkzNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg5NiwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExMzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1MAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTEKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzEzLCA5MDQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTA2MjIKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjgKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJFMjAzODEiCi0JCQkJY2xpZW50ICAgICAJQDEwMDIKLQkJCQlzdXBwbGllciAgIAlAOTkzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM4MSwgMTEwOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM4MSwgODY4KQotCQkJCWRyYXdTdXBwbGllciAJQDk5NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUyCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4NzgsIDI2OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NjY2NwotCQkJCSAgICBoZWlnaHQgICAgIAk2NgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjU1MDM4NSIKLQkJCQljbGllbnQgICAgIAlAMTAwMgotCQkJCXN1cHBsaWVyICAgCUAxMDE2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk0MywgMTEwOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk0MywgMjIyKQotCQkJCWRyYXdTdXBwbGllciAJQDExMjkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQljbGllbnQgICAgIAlAMTExMQotCQkJCXN1cHBsaWVyICAgCUAxMDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDYyLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjIsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDAxKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIgotCQkJcXVpZCAgICAgICAJIjNDMjVFQjdBMDM4QyIKLQkJCXRpdGxlICAgICAgCSI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTE1NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExOCIgQDExNTYKLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE5IiBAMTE1NwotCQkJCQlQYXJlbnRfVmlldyAJQDExNTYKLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMkY3IgotCQkJCQljbGllbnQgICAgIAlAMTE1NgotCQkJCQlzdXBwbGllciAgIAlAMTE1NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjgsIDE2OTUpCi0JCQkJCSAgICAoMTc1LCAxNjk1KQotCQkJCQkgICAgKDE3NSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExNTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTU2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMjksIDE3NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDMwQiIKLQkJCQkJY2xpZW50ICAgICAJQDExNTYKLQkJCQkJc3VwcGxpZXIgICAJQDExNTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjI4LCAxNjk1KQotCQkJCQkgICAgKDI4MSwgMTY5NSkKLQkJCQkJICAgICgyODEsIDE1OTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxLCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjksIDE2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExNjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU0IiBAMTE2MwotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTUiIEAxMTY0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg2MCwgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCQljbGllbnQgICAgIAlAMTE2MwotCQkJCQlzdXBwbGllciAgIAlAMTE2MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE2OTgpCi0JCQkJCSAgICAoOTAxLCAxNjk4KQotCQkJCQkgICAgKDkwMSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTE2NgotCQkJCQlQYXJlbnRfVmlldyAJQDExNjMKLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDIwLCAxNzM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM5RSIKLQkJCQkJY2xpZW50ICAgICAJQDExNjMKLQkJCQkJc3VwcGxpZXIgICAJQDExNjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTUyLCAxNjk4KQotCQkJCQkgICAgKDEwMDQsIDE2OTgpCi0JCQkJCSAgICAoMTAwNCwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA0LCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDE2NDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDIwLCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDExNzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDc1Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDExNzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDQxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NiwgMjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNDA2Ci0JCQkJaGVpZ2h0ICAgICAJMjg3Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOCIgQDExNzIKLQkJCQlsb2NhdGlvbiAgIAkoMTMwMywgNjc5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAMTE3MwotCQkJCQlQYXJlbnRfVmlldyAJQDExNzIKLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTczCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAwMzg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCQljbGllbnQgICAgIAlAMTE3MgotCQkJCQlzdXBwbGllciAgIAlAMTE3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzAzLCA2NzkpCi0JCQkJCSAgICAoMTMwMywgNDE5KQotCQkJCQkgICAgKDg0MywgNDE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkwNzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEAxMTc2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE3MgotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDExNzIKLQkJCQkJc3VwcGxpZXIgICAJQDExNjkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMwMywgNjc5KQotCQkJCQkgICAgKDEzMDMsIDk5NykKLQkJCQkJICAgICg5MDEsIDk5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDk5NykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE2IiBAMTE3OAotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDExNzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTc4Ci0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM4LCA1MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMTkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQkJY2xpZW50ICAgICAJQDExNzgKLQkJCQkJc3VwcGxpZXIgICAJQDExNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQotCQkJCQkgICAgKDEyMTYsIDUzNCkKLQkJCQkJICAgICg4NDMsIDUzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDUzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTI2LCA1NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMTY0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE3IiBAMTE4MgotCQkJCQlQYXJlbnRfVmlldyAJQDExNzgKLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgNzU2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTc4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTcwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTYsIDY0OSkKLQkJCQkJICAgICgxMjE2LCA3OTcpCi0JCQkJCSAgICAoODc3LCA3OTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA3OTcpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMiIgQDExODQKLQkJCQlsb2NhdGlvbiAgIAkoNjYyLCA2NDIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMTg1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NAotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDY3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjE2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTg0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTcwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNzI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDMwNjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjMiIEAxMTg4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NAotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjEsIDU3NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcwIgotCQkJCQljbGllbnQgICAgIAlAMTE4NAotCQkJCQlzdXBwbGllciAgIAlAMTE3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDU1OSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI0IiBAMTE5MAotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI1IiBAMTE5MQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTAKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDFFIgotCQkJCQljbGllbnQgICAgIAlAMTE5MAotCQkJCQlzdXBwbGllciAgIAlAMTE3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NSwgMTg4KQotCQkJCQkgICAgKDc1LCAxMjgpCi0JCQkJCSAgICAoNTEwLCAxMjgpCi0JCQkJCSAgICAoNTEwLCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMTkyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5MAotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VmVyc2lvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMjgiCi0JCQkJCWNsaWVudCAgICAgCUAxMTkwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc1LCAxODgpCi0JCQkJCSAgICAoNzUsIDM4MCkKLQkJCQkJICAgICg0MzcsIDM4MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAzODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMzI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI2IiBAMTE5NQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAxMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEIwMTFCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjciIEAxMTk2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE5NQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyMSIKLQkJCQkJY2xpZW50ICAgICAJQDExOTUKLQkJCQkJc3VwcGxpZXIgICAJQDExNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2NiwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTE5NwotCQkJCQlQYXJlbnRfVmlldyAJQDExOTUKLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2NCwgOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JpZ2luYWxWZXJzaW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCQljbGllbnQgICAgIAlAMTE5NQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAxMzQpCi0JCQkJCSAgICAoMTMyMiwgMTM0KQotCQkJCQkgICAgKDEzMjIsIDMzNCkKLQkJCQkJICAgICg4NDMsIDMzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODEwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjgiIEAxMjAwCi0JCQkJbG9jYXRpb24gICAJKDEyNiwgNjU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFRUFCMDAxRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI5IiBAMTIwMQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDAKLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDUxMywgNjU2KQotCQkJCQkgICAgKDUxMywgNTU5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIgQDEyMDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAwCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDM5MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDY2LCA2NTYpCi0JCQkJCSAgICAoNjYsIDQ3MikKLQkJCQkJICAgICg0MzcsIDQ3MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgNDcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTYsIDUyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY4NDY4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMiIgQDEyMDUKLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzMiIEAxMjA2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIwNQotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCQljbGllbnQgICAgIAlAMTIwNQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2NDIsIDEyNikKLQkJCQkJICAgICg1ODgsIDEyNikKLQkJCQkJICAgICg1ODgsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hRm9yU2NoZW1hIiBAMTIwNwotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDUKLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYUZvclNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1NTU1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGQiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDUKLQkJCQkJc3VwcGxpZXIgICAJQDExNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjQyLCAxMjYpCi0JCQkJCSAgICAoNjk3LCAxMjYpCi0JCQkJCSAgICAoNjk3LCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OTcsIDI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAyMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMTg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyMTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDExNjkKLQkJCQlzdXBwbGllciAgIAlAMTE3MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzgsIDg0MykpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTIxMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0OTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzIiIEAxMjEyCi0JCQkJbG9jYXRpb24gICAJKDIzNCwgMTM0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2QjAxOTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDczIiBAMTIxMwotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTIKLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMwOSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMTIKLQkJCQkJc3VwcGxpZXIgICAJQDEyMTEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDE4MSwgMTM0MCkKLQkJCQkJICAgICgxODEsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxLCAxMjM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyMTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEyCi0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMzLCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjg2NzkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMxMyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMTIKLQkJCQkJc3VwcGxpZXIgICAJQDEyMTEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDI4NywgMTM0MCkKLQkJCQkJICAgICgyODcsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg3LCAxMjM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDEyOTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0Mjk0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEyMTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYwLCAxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDEyMTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTI0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDYiIEAxMjIwCi0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNyIgQDEyMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjIwCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDEwRiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjAKLQkJCQkJc3VwcGxpZXIgICAJQDEyMTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY0ZhY2V0cyIgQDEyMjIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjIwCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNDYxNTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIgotCQkJCQljbGllbnQgICAgIAlAMTIyMAotCQkJCQlzdXBwbGllciAgIAlAMTIxOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMzYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjI1LCAzMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEyMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMjI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgNjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgNTk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwOCIgQDEyMjcKLQkJCQlsb2NhdGlvbiAgIAkoMTUwOCwgNzkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQzMDI4RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA5IiBAMTIyOAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjcKLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjI3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjI2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA2OTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyMjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDc2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRkQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjI3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjI1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NTQsIDgyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk1MDYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyMzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg0IiBAMTIzMwotCQkJCWxvY2F0aW9uICAgCSg5MTksIDEzNDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNUUwMUY5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NSIgQDEyMzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzCi0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDQ2IgotCQkJCQljbGllbnQgICAgIAlAMTIzMwotCQkJCQlzdXBwbGllciAgIAlAMTIzMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoODY2LCAxMzQ5KQotCQkJCQkgICAgKDg2NiwgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDEyMzkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyMzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzCi0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDk5MywgMTM5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzc3MzU4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDUwIgotCQkJCQljbGllbnQgICAgIAlAMTIzMwotCQkJCQlzdXBwbGllciAgIAlAMTIzMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoOTczLCAxMzQ5KQotCQkJCQkgICAgKDk3MywgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzMsIDEyMzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMTI5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAxNDkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEyMzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTAiIEAxMjQwCi0JCQkJbG9jYXRpb24gICAJKDIwMjUsIDc5MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREOTAxRjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMSIgQDEyNDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQwCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0IgotCQkJCQljbGllbnQgICAgIAlAMTI0MAotCQkJCQlzdXBwbGllciAgIAlAMTIyNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgNjk1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0MAotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA4MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjM5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwOTgsIDg0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MTczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMiIgQDEyNDUKLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMyIgQDEyNDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE3IgotCQkJCQljbGllbnQgICAgIAlAMTI0NQotCQkJCQlzdXBwbGllciAgIAlAMTIzMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyNDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzM1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEyNDUKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTc1NCwgMTE3OCkKLQkJCQkJICAgICgyMDI4LCAxMTc4KQotCQkJCQkgICAgKDIwMjgsIDk5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM2NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEwLiBEaWFnbm9zdGljcyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNUYwODAzRTIiCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEAxMjUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJCXdpZHRoICAgICAgCTY4NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljU2V2ZXJpdHkiIEAxMjUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDY1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNTQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY4QTcwMzJGIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1OSwgNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODk2LCAxMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDYyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk3MzEKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyNTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NCwgNDAyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTQzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTQiIEAxMjU1Ci0JCQkJbG9jYXRpb24gICAJKDE0NCwgMjgzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2NDMxMDM1RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE1IiBAMTI1NgotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNTUKLQkJCQkJc3VwcGxpZXIgICAJQDEyNTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAxNzYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbGxEaWFnbm9zdGljcyIgQDEyNTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYWxsRGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0ODU5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJCWNsaWVudCAgICAgCUAxMjU1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjU0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEwIiBAMTI2MAotCQkJCWxvY2F0aW9uICAgCSgxMDI4LCA0NDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMjcwM0NEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTEiIEAxMjYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI2MAotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQkJY2xpZW50ICAgICAJQDEyNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEyNTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcxMywgNDQwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyNjIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjYwCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzOCwgMjMwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBvbmVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjYwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjUzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwMjgsIDQ0MCkKLQkJCQkJICAgICgxMDg4LCA0NDApCi0JCQkJCSAgICAoMTA4OCwgMTc0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODgsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEyIiBAMTI2NQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDI4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMyIgQDEyNjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCQljbGllbnQgICAgIAlAMTI2NQotCQkJCQlzdXBwbGllciAgIAlAMTI1MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDE3NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRpYWdub3N0aWNzIiBAMTI2NwotCQkJCQlQYXJlbnRfVmlldyAJQDEyNjUKLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MjYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjciCi0JCQkJCWNsaWVudCAgICAgCUAxMjY1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjU0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDk0NzM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI3MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEMwRjRDMDFBMSIKLQkJCQljbGllbnQgICAgIAlAMTI1NAotCQkJCXN1cHBsaWVyICAgCUAxMjUzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAzOTApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjExLiBTdXBwbGVtZW50YWwiCi0JCQlxdWlkICAgICAgIAkiM0MyODdFNDkwMTlCIgotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI3MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk4NTIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDg4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDgyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNzgwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI3MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyNzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM2IiBAMTI3NQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1hcnlDb21wb25lbnQiIEAxMjc2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI3NQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWFyeUNvbXBvbmVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQwODI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEzIgotCQkJCQljbGllbnQgICAgIAlAMTI3NQotCQkJCQlzdXBwbGllciAgIAlAMTI3MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTcyNjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNyIgQDEyNzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjc1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNzUKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEyODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDY2NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk3MjIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiIKLQkJCQkJIisgY2lyY3VsYXIgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNzgyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTI4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDEwNzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIzCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyIKLQkJCQkJIisgZWZmZWN0aXZlVmFsdWUgOiBWYWx1ZSIpKQotCQkJCXdpZHRoICAgICAgCTQ1OAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEyODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA1NjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDYyOCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjkKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODIwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMTI4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDI4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAyMTcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTM1NgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBhbGlhc05hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHVSSSA6IFN0cmluZyIKLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciCi0JCQkJCSIrIHFOYW1lIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDcyCi0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTI4NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDM1MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODUKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCAyOTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMjg2Ci0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTEwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMjg1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgzMjAsIDUxMCkKLQkJCQkgICAgKDMyMCwgNDIwKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI4NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQljbGllbnQgICAgIAlAMTI4MwotCQkJCXN1cHBsaWVyICAgCUAxMjg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjg2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyODgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDEyNzEKLQkJCQlzdXBwbGllciAgIAlAMTI4NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg3NywgNzQ4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjg2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDEyODkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxODA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMSwgMTc2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDU2Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBAMTI5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTc3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNzI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQl3aWR0aCAgICAgIAk0OTMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEAxMjkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE4ODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIgotCQkJCXdpZHRoICAgICAgCTQ5MwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDEyOTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAxOTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MywgMTkxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEAxMjkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzQsIDEzNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDEyOTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2MywgMTIxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCXdpZHRoICAgICAgCTM5NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEAxMjk1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCAxMzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDEzNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAkzODAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBAMTI5NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTIzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5LCAxMTc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJd2lkdGggICAgICAJNDAwCi0JCQkJaGVpZ2h0ICAgICAJMTMyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBAMTI5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE2MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTM1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1OTUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MwotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIgotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDEyOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyMjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjIzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCXdpZHRoICAgICAgCTQ1NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTI5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDI2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc0LCAyNTcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEAxMzAwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMjEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOTYsIDIwNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDEzMDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgMjA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQl3aWR0aCAgICAgIAk0NTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEAxMzAyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAyMjcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDIyMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDEzMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE1ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTUwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTU2MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEAxMzA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjQ2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMTEsIDI0MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDEzMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOSwgMjM5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEAxMzA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDI1NTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEzMDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NjcsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMzA4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDEwMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEzMDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTM2NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk1OTQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ4IiBAMTMxMAotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTMxMQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTAKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTgwLCAxMTczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTMuMjY4MjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEREIgotCQkJCQljbGllbnQgICAgIAlAMTMxMAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDQ2LCAxMjE4KQotCQkJCQkgICAgKDE0ODcsIDEyMTgpCi0JCQkJCSAgICAoMTQ4NywgMTI5MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTI5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTI1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE4NDIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ5IiBAMTMxNAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTAKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBFNyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMTAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkKLQkJCQkJICAgICgxNDA1LCAxMjE4KQotCQkJCQkgICAgKDE0MDUsIDEyOTIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDUsIDEyOTIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MiIgQDEzMTUKLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1MyIgQDEzMTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzE1Ci0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDkxIgotCQkJCQljbGllbnQgICAgIAlAMTMxNQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzMzLCAxNTc1KQotCQkJCQkgICAgKDE0ODcsIDE1NzUpCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEZhY2V0IiBAMTMxNwotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTUKLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgMTU0MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ2MjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCQljbGllbnQgICAgIAlAMTMxNQotCQkJCQlzdXBwbGllciAgIAlAMTI5NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTE1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTQiIEAxMzIwCi0JCQkJbG9jYXRpb24gICAJKDE1ODcsIDE3OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUIwMzk2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTUiIEAxMzIxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyMAotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5IgotCQkJCQljbGllbnQgICAgIAlAMTMyMAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTg3LCAxNzkzKQotCQkJCQkgICAgKDE0NDcsIDE3OTMpCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEluY2x1c2l2ZUZhY2V0IiBAMTMyMgotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjAKLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTg0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzIwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjg5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MiwgMTc5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyMCwgMTc1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NiIgQDEzMjUKLQkJCQlsb2NhdGlvbiAgIAkoOTM3LCAxNzg3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU3IiBAMTMyNgotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjUKLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMUY5IgotCQkJCQljbGllbnQgICAgIAlAMTMyNQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MzcsIDE3ODcpCi0JCQkJCSAgICAoOTk3LCAxNzg3KQotCQkJCQkgICAgKDk5NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzMjcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI1Ci0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTIsIDE3NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDIwMyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjUKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTc4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAxNzQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM5NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU4IiBAMTMzMAotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTkiIEAxMzMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzMAotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTMzMAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5ODEsIDE5MzcpCi0JCQkJCSAgICAoMTA0MSwgMTkzNykKLQkJCQkJICAgICgxMDQxLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5FeGNsdXNpdmVGYWNldCIgQDEzMzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMwCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIzLCAxOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDEyNTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjkxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ2NjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MCIgQDEzMzUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OSwgMTk1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNjAyOEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MSIgQDEzMzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM1Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMzM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NjksIDE5NTMpCi0JCQkJCSAgICAoMTQwMCwgMTk1MykKLQkJCQkJICAgICgxNDAwLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RXhjbHVzaXZlRmFjZXQiIEAxMzM3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMzNQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzUKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY0LCAxOTUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTYxLCAxOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYyIiBAMTM0MAotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMTgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYzIiBAMTM0MQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDAKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImxlbmd0aEZhY2V0IiBAMTM0MgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDAKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA0LCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2xlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzU0NzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMjIsIDIxODApCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkKLQkJCQkJICAgICgzODcsIDIyNDApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjI0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcxLCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU1OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY2IiBAMTM0NQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY3IiBAMTM0NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDUKLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFCIgotCQkJCQljbGllbnQgICAgIAlAMTM0NQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbnVtZXJhdGlvbkZhY2V0cyIgQDEzNDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NTg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA4NCwgMTk4OSkKLQkJCQkJICAgICgxMDg0LCAyMDQ5KQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MTI5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjgiIEAxMzUwCi0JCQkJbG9jYXRpb24gICAJKDE0NTEsIDIwNzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjkiIEAxMzUxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzUwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NTEsIDIwNzQpCi0JCQkJCSAgICAoMTM2MiwgMjA3NCkKLQkJCQkJICAgICgxMzYyLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGF0dGVybkZhY2V0cyIgQDEzNTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzIyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMDc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTcyLCAyMDM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcwIiBAMTM1NQotCQkJCWxvY2F0aW9uICAgCSgxODI3LCAxNDAwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM4MDJBNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcxIiBAMTM1NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFFQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxNDAwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2FyZGluYWxpdHlGYWNldCIgQDEzNTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg0NywgMTM1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjYXJkaW5hbGl0eUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzE3MzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzU1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNDI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MCIgQDEzNjAKLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQxMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MSIgQDEzNjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYwCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCQljbGllbnQgICAgIAlAMTM2MAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTM2MgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjAKLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwOCwgMjU1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzYwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0MTMpCi0JCQkJCSAgICAoMTI2MiwgMjU5NikKLQkJCQkJICAgICgyMDY1LCAyNTk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNTk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTc5LCAyNTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg0IiBAMTM2NQotCQkJCWxvY2F0aW9uICAgCSgxODQxLCAxMzA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEUzMDBEOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg1IiBAMTM2NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjUKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM4RSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxMzA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYm91bmRlZEZhY2V0IiBAMTM2NwotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjUKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMyLCAxMjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2JvdW5kZWRGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzMTc0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM5OCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjUKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTQ3MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY0IiBAMTM3MAotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMTg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY1IiBAMTM3MQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzAKLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzcwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzNzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzcwCi0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzMsIDIyMDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrd2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNzUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzcwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIxODYpCi0JCQkJCSAgICAoMTMyOCwgMjI0NikKLQkJCQkJICAgICgyMDkzLCAyMjQ2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMjQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDMzLCAyMjAzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgyIiBAMTM3NQotCQkJCWxvY2F0aW9uICAgCSg2NzQsIDEzOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwMDQ4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODMiIEAxMzc2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM3NQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTM3NQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMzkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JkZXJlZEZhY2V0IiBAMTM3NwotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzUKLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTgsIDEzNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JkZXJlZEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjE1MzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM0NjE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3MiIgQDEzODAKLQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAxMjk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENCMDM5QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjczIiBAMTM4MQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODAKLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCIKLQkJCQkJY2xpZW50ICAgICAJQDEzODAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTI5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDEzODIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY4LCAxMjU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK251bWVyaWNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QxIgotCQkJCQljbGllbnQgICAgIAlAMTM4MAotCQkJCQlzdXBwbGllciAgIAlAMTI5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQwLCAxMjk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDYsIDEyNjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODYiIEAxMzg1Ci0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODciIEAxMzg2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNjAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2ODksIDE2NjIpCi0JCQkJCSAgICAoMTQ4NywgMTY2MikKLQkJCQkJICAgICgxNDg3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4RmFjZXQiIEAxMzg3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2OSwgMTYyMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMTM4NQotCQkJCQlzdXBwbGllciAgIAlAMTI5NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNTM4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODgiIEAxMzkwCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NEYwMTQ1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODkiIEAxMzkxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5MAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCQljbGllbnQgICAgIAlAMTM5MAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxMzkyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5MAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDIyODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJCWNsaWVudCAgICAgCUAxMzkwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIyNTgpCi0JCQkJCSAgICAoMTMyOCwgMjMyNCkKLQkJCQkJICAgICgyMDkzLCAyMzI0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMzI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA5LCAyMjkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkwIiBAMTM5NQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzY2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNUM0MDExQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkxIiBAMTM5NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTUKLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCQljbGllbnQgICAgIAlAMTM5NQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIgQDEzOTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjU3LCAyNDYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heExlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjY5MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMzk1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyOTcsIDIzNjYpCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkKLQkJCQkJICAgICgyMTAyLCAyNDk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA3LCAyNDcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkyIiBAMTQwMAotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkzIiBAMTQwMQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDAKLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDEzOCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCIgQDE0MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODUzMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDAwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0NDkpCi0JCQkJCSAgICAoMTI2MiwgMjY2OCkKLQkJCQkJICAgICgyMDY1LCAyNjY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY0ODUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk0IiBAMTQwNQotCQkJCWxvY2F0aW9uICAgCSgxNDIyLCAyMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNkIwMDNBNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk1IiBAMTQwNgotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDUKLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQyMiwgMjE1OSkKLQkJCQkJICAgICgxMzYyLCAyMTU5KQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiIEAxNDA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQwNQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTkwOTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDA1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzAwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjE1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjExOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NiIgQDE0MTAKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMjA4MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NyIgQDE0MTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEwCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE4NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MTAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIgQDE0MTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEwCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDIxMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4NjE5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTQxMAotCQkJCQlzdXBwbGllciAgIAlAMTMwMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg0LCAyMDgzKQotCQkJCQkgICAgKDEwODQsIDIxNDMpCi0JCQkJCSAgICAoNDg1LCAyMTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIxNDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgMjEwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTMxNzE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMiIgQDE0MTUKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMyIgQDE0MTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE1Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTQxNQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVMZW5ndGhGYWNldCIgQDE0MTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE1Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxNzMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIgotCQkJCQljbGllbnQgICAgIAlAMTQxNQotCQkJCQlzdXBwbGllciAgIAlAMTMwMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTIyLCAyMjQxKQotCQkJCQkgICAgKDExMjIsIDIzMTgpCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4NTY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MCIgQDE0MjAKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAxNTY1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUxIiBAMTQyMQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjAKLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIgotCQkJCQljbGllbnQgICAgIAlAMTQyMAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDE1NjUpCi0JCQkJCSAgICAoOTU5LCAxNTY1KQotCQkJCQkgICAgKDk1OSwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5GYWNldCIgQDE0MjIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIwCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MzA5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTU2NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAxNTIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA0IiBAMTQyNQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDE2NTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzAwMURCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDUiIEAxNDI2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQyNQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBDRiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODE2LCAxNjUwKQotCQkJCQkgICAgKDk1OSwgMTY1MCkKLQkJCQkJICAgICg5NTksIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDI3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQyNQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjQsIDE2MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTY1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAxNjA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDI3NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc0IiBAMTQzMAotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc1IiBAMTQzMQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzAKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDMwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heExlbmd0aEZhY2V0IiBAMTQzMgotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzAKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyMjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIgotCQkJCQljbGllbnQgICAgIAlAMTQzMAotCQkJCQlzdXBwbGllciAgIAlAMTMwNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjk3LCAyMzIxKQotCQkJCQkgICAgKDEyOTcsIDI0MDkpCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc5MjA4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NiIgQDE0MzUKLQkJCQlsb2NhdGlvbiAgIAkoMTE1OSwgMjI3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NyIgQDE0MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQzNQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0MzcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMjM3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDI3IgotCQkJCQljbGllbnQgICAgIAlAMTQzNQotCQkJCQlzdXBwbGllciAgIAlAMTMwNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTU5LCAyMjczKQotCQkJCQkgICAgKDExNTksIDI0MDkpCi0JCQkJCSAgICAoNDUwLCAyNDA5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0MDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMjM2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMCIgQDE0NDAKLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMjMzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMSIgQDE0NDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQwCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCQljbGllbnQgICAgIAlAMTQ0MAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIgQDE0NDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQwCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NiwgMjQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUyNjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDYwIgotCQkJCQljbGllbnQgICAgIAlAMTQ0MAotCQkJCQlzdXBwbGllciAgIAlAMTMwNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk3LCAyMzM0KQotCQkJCQkgICAgKDExOTcsIDI0OTMpCi0JCQkJCSAgICAoNDUwLCAyNDkzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0OTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNywgMjQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE2MDQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5OCIgQDE0NDUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5OSIgQDE0NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ1Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQ0NQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IiBAMTQ0NwotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDUKLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NzAzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIzMSwgMjQzOCkKLQkJCQkJICAgICgxMjMxLCAyNjY4KQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxODgxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzgiIEAxNDUwCi0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDIzOTcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwMERFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzkiIEAxNDUxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0NTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUwCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MywgMjU1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzRDciCi0JCQkJCWNsaWVudCAgICAgCUAxNDUwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMzEsIDIzOTcpCi0JCQkJCSAgICAoMTIzMSwgMjU4NykKLQkJCQkJICAgICg0NTEsIDI1ODcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjU4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM1LCAyNTYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDU1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDc2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTksIDU3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNDQ0Ci0JCQkJaGVpZ2h0ICAgICAJNDEzCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0NTYKLQkJCQlsb2NhdGlvbiAgIAkoMTIwOSwgMTA2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTQ1NQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwOSwgMTA2NSkKLQkJCQkgICAgKDEyMDksIDk3NCkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzQiIEAxNDU3Ci0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxNDU4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1NwotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NywgMTAzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTg3NjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDNDIgotCQkJCQljbGllbnQgICAgIAlAMTQ1NwotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2MTcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM1IiBAMTQ2MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTcKLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTcKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDg4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDAiIEAxNDYyCi0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDg3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZEQjAxRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQ2MwotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjIKLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU4LCA3OTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTIwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDYyCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA5MTkpCi0JCQkJCSAgICAoMTQ1NCwgOTE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDkxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwOSwgODc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MSIgQDE0NjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYyCi0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDYyCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA4MjgpCi0JCQkJCSAgICAoMTQ1NCwgODI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDgyOCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQyIiBAMTQ2NwotCQkJCWxvY2F0aW9uICAgCSgxNTM1LCA2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTIwMTA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0NjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY3Ci0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCQljbGllbnQgICAgIAlAMTQ2NwotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM1LCA2ODQpCi0JCQkJCSAgICAoMTUzNSwgNzI4KQotCQkJCQkgICAgKDE0NTQsIDcyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA3MjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDYsIDY4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQzIiBAMTQ3MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjcKLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1QiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjcKLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzNSwgNjg0KQotCQkJCQkgICAgKDE1MzUsIDY0MSkKLQkJCQkJICAgICgxNDU0LCA2NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNjQxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDYiIEAxNDcyCi0JCQkJbG9jYXRpb24gICAJKDYxMywgOTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDczCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3MgotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjUsIDk4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wbGV4VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTE3IgotCQkJCQljbGllbnQgICAgIAlAMTQ3MgotCQkJCQlzdXBwbGllciAgIAlAMTMwOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2MTMsIDk0MCkKLQkJCQkJICAgICgyODQsIDk0MCkKLQkJCQkJICAgICgyODQsIDEwMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDEwMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgOTcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NyIgQDE0NzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDcyCi0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTIxIgotCQkJCQljbGllbnQgICAgIAlAMTQ3MgotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEwLCA5NDApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAMTQ1NQotCQkJCXN1cHBsaWVyICAgCUAxMjg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTEyLCA1MTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI4NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDc4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUAxMzA3Ci0JCQkJc3VwcGxpZXIgICAJQDE0NTUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDE0NTYpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NCIgQDE0NzkKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MiwgMTEzMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0QjAxNzgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGUiIEAxNDgwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjQ2NzUzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NzkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxMjkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIxLCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDUiIEAxNDgzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDc5Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgOTc0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAMTQ4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDMwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDM2MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGdsb2JhbCA6IGJvb2xlYW4iCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0ODUKLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxNDg0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMjYyLCA1NjgpCi0JCQkJICAgICgyMjYyLCA0NzcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDg2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUAxMjgxCi0JCQkJc3VwcGxpZXIgICAJQDE0ODQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1OTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDg1KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzgiIEAxNDg3Ci0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGUiIEAxNDg4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4NwotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMzEsIDQ5OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYyNjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRTUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDg3Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1NTMsIDQ1MykKLQkJCQkJICAgICgxMjIyLCA0NTMpCi0JCQkJCSAgICAoMTIyMiwgNTYyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMjIsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NSwgNDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTIwMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzOSIgQDE0OTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDg3Ci0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNDg3Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMCIgQDE0OTIKLQkJCQlsb2NhdGlvbiAgIAkoMTkwOCwgMzUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRGZWF0dXJlIiBAMTQ5MwotCQkJCQlQYXJlbnRfVmlldyAJQDE0OTIKLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjk0MTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCQljbGllbnQgICAgIAlAMTQ5MgotCQkJCQlzdXBwbGllciAgIAlAMTQ4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxOTA4LCAzNTMpCi0JCQkJCSAgICAoMTkwOCwgMzg3KQotCQkJCQkgICAgKDE5OTMsIDM4NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk2NjM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzEiIEAxNDk2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ5MgotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJCWNsaWVudCAgICAgCUAxNDkyCi0JCQkJCXN1cHBsaWVyICAgCUAxNDg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE5MDgsIDM1MykKLQkJCQkJICAgICgxOTA4LCAzMTkpCi0JCQkJCSAgICAoMTk5MywgMzE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDk3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUAxMjg1Ci0JCQkJc3VwcGxpZXIgICAJQDEyODQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ5NCwgMjg0KQotCQkJCSAgICAoNDk0LCAyNDQpCi0JCQkJICAgICg5OTYsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NiwgMjQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDk4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUAxMjcyCi0JCQkJc3VwcGxpZXIgICAJQDE0ODQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MTgsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDg1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEzMDkKLQkJCQlzdXBwbGllciAgIAlAMTQ1NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDEyOTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDEwNjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ1NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTAwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUAxNDg0Ci0JCQkJc3VwcGxpZXIgICAJQDEyODQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIxNDcsIDI5MSkKLQkJCQkgICAgKDIxNDcsIDI0NCkKLQkJCQkgICAgKDE0NjgsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAyNDQpKSkpKSkpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTYzIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6aHR0cCIgQDE1MDEKLQkJCWxvY2F0aW9uICAgCSgzMzYsIDIyNCkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTAxCi0JCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMTQwKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiaHR0cCIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiM0FCRkQ5QUQwMUY4IgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp3c2RsIiBAMTUwMgotCQkJbG9jYXRpb24gICAJKDc4NCwgMjI0KQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDIKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjQwLCAxNDApCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJ3c2RsIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQURGQjhFNTAyMUUiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OnhzZCIgQDE1MDMKLQkJCWxvY2F0aW9uICAgCSgxMjMyLCAyMjQpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwMwotCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAxNDApCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJ4c2QiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM5QUJEQzZGMDFBQSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTIiCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBQkZEOUE3MDE4QiIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjNBQkZEOUE3MDE1MyIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTU1IgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJBTlNJIgotCQkJCXZhbHVlICAgICAgCTgwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIk9yYWNsZSIKLQkJCQl2YWx1ZSAgICAgIAk4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiCi0JCQkJdmFsdWUgICAgICAJODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiU3liYXNlIgotCQkJCXZhbHVlICAgICAgCTgwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIldhdGNvbSIKLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIklkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZSIKLQkJCXZhbHVlICAgICAgCSJWXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSJfViIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc09LIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExFbGVtZW50IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiIKLQkJCQl2YWx1ZSAgICAgIAk1NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk2MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCIKLQkJCQl2YWx1ZSAgICAgIAk1MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlVuaW9uIgotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuaHR0cC9zcmMvcm9zZS9odHRwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLmh0dHAvc3JjL3Jvc2UvaHR0cGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlJhaXNlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIgotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIm1fIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJInNfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb290RGlyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNIgotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN1biIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0IgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJJQk0iCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyIKLQkJCXZhbHVlICAgICAgCTMpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIl9JRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCIKLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50IgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTE5MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIgotCQkJCXZhbHVlICAgICAgCTE5MDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQUZURVIiCi0JCQkJdmFsdWUgICAgICAJMTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiCi0JCQkJdmFsdWUgICAgICAJMTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIgotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJST1ciCi0JCQkJdmFsdWUgICAgICAJMTcwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiCi0JCQkJdmFsdWUgICAgICAJMTYwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSI2IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLmh0dHAvc3JjL3Jvc2UvaHR0cGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLmh0dHAvc3JjL3Jvc2UvaHR0cGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kZW50IgotCQkJdmFsdWUgICAgICAJMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiCi0JCQkJdmFsdWUgICAgICAJNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciIKLQkJCQl2YWx1ZSAgICAgIAk3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJTQ0MiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlR5cGVMaWJJbXBvcnRlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiCi0JCQkJdmFsdWUgICAgICAJMjEzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiMCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlIgotCQkJdmFsdWUgICAgICAJKCJDcmVhdGFibGVTZXQiIDIyMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluaXRpYWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVRlcm1pbmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiQ29sbGVjdGlvbiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiVGV4dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiRvcGVyYXRpb24iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JcXVpZCAgICAgICAJIjNBQkZEOUE3MDE1NCIpKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YWI1ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQQWRkcmVzcygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUEFkZHJlc3MgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYXRpb25VUkkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBBZGRyZXNzX0xvY2F0aW9uVVJJKCkKLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvblVSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2F0aW9uVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSFRUUEFkZHJlc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzMyNTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZyNnZXRWZXJiIDxlbT5WZXJiPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUEJpbmRpbmcoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUVFBCaW5kaW5nIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJiPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJiPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcmI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcmIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBCaW5kaW5nX1ZlcmIoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcmIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZyNnZXRWZXJiIDxlbT5WZXJiPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJiPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJiKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJiKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSFRUUEJpbmRpbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU4MmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbC5IVFRQRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUEJpbmRpbmcgY3JlYXRlSFRUUEJpbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBPcGVyYXRpb24gY3JlYXRlSFRUUE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUFVybFJlcGxhY2VtZW50IGNyZWF0ZUhUVFBVcmxSZXBsYWNlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBVcmxFbmNvZGVkIGNyZWF0ZUhUVFBVcmxFbmNvZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkZHJlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkZHJlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBBZGRyZXNzIGNyZWF0ZUhUVFBBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBQYWNrYWdlIGdldEhUVFBQYWNrYWdlKCk7Ci0KLX0gLy9IVFRQRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBhOWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbiNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUE9wZXJhdGlvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUE9wZXJhdGlvbiBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2F0aW9uVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQT3BlcmF0aW9uX0xvY2F0aW9uVVJJKCkKLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvblVSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24jZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBIVFRQT3BlcmF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQUGFja2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkNjU5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJodHRwIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9IVFRQIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gImh0dHAiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbC5IVFRQUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQmluZGluZ0ltcGwgPGVtPkJpbmRpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQmluZGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRIVFRQQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fVkVSQiA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmluZGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUE9wZXJhdGlvbkltcGwgPGVtPk9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBPcGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTl9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTl9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQVXJsUmVwbGFjZW1lbnRJbXBsIDxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQVXJsUmVwbGFjZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUFVybFJlcGxhY2VtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhUVFBfVVJMX1JFUExBQ0VNRU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfUkVQTEFDRU1FTlRfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVF9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQVXJsRW5jb2RlZEltcGwgPGVtPlVybCBFbmNvZGVkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFVybEVuY29kZWRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUFVybEVuY29kZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9FTkNPREVEX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlVybCBFbmNvZGVkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX0VOQ09ERURfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUEFkZHJlc3NJbXBsIDxlbT5BZGRyZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUEFkZHJlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUEFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9BRERSRVNTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTU19fTE9DQVRJT05fVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BZGRyZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTU19GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIDxlbT5JSFRUUCBBZGRyZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRJSFRUUEFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUhUVFBfQUREUkVTUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklIVFRQIEFkZHJlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUhUVFBfQUREUkVTU19GRUFUVVJFX0NPVU5UID0gMDsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyA8ZW0+SUhUVFAgQmluZGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SUhUVFBCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElIVFRQX0JJTkRJTkcgPSA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSFRUUCBCaW5kaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElIVFRQX0JJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24gPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRJSFRUUE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSFRUUF9PUEVSQVRJT04gPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSFRUUCBPcGVyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUhUVFBfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCA8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldElIVFRQVXJsRW5jb2RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSFRUUF9VUkxfRU5DT0RFRCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElIVFRQX1VSTF9FTkNPREVEX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldElIVFRQVXJsUmVwbGFjZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUhUVFBfVVJMX1JFUExBQ0VNRU5UID0gOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElIVFRQX1VSTF9SRVBMQUNFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nIDxlbT5CaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhUVFBCaW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZyNnZXRWZXJiIDxlbT5WZXJiPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyYjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZyNnZXRWZXJiKCkKLQkgKiBAc2VlICNnZXRIVFRQQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SFRUUEJpbmRpbmdfVmVyYigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SFRUUE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbiNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24jZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBzZWUgI2dldEhUVFBPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEhUVFBPcGVyYXRpb25fTG9jYXRpb25VUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZCA8ZW0+VXJsIEVuY29kZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhUVFBVcmxFbmNvZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MgPGVtPkFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SFRUUEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBzZWUgI2dldEhUVFBBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIVFRQQWRkcmVzc19Mb2NhdGlvblVSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MgPGVtPklIVFRQIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUhUVFAgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElIVFRQQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgPGVtPklIVFRQIEJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUhUVFAgQmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElIVFRQQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiA8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24KLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSFRUUE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUhUVFBVcmxFbmNvZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBGYWN0b3J5IGdldEhUVFBGYWN0b3J5KCk7Ci0KLX0gLy9IVFRQUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFVybEVuY29kZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBVcmxFbmNvZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNmMwMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFVybEVuY29kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVybCBFbmNvZGVkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQVXJsRW5jb2RlZCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUFVybEVuY29kZWQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgewotfSAvLyBIVFRQVXJsRW5jb2RlZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFVybFJlcGxhY2VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsUmVwbGFjZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkMWRkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsUmVwbGFjZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVybCBSZXBsYWNlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUFVybFJlcGxhY2VtZW50KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQVXJsUmVwbGFjZW1lbnQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IHsKLX0gLy8gSFRUUFVybFJlcGxhY2VtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9nZW5lcmF0b3IvSFRUUENvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2dlbmVyYXRvci9IVFRQQ29udGVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWE4OGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2dlbmVyYXRvci9IVFRQQ29udGVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5Db250ZW50R2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQQ29udGVudEdlbmVyYXRvciBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3IKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSQl9QT1NUID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSQl9HRVQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJCX05PVF9TRVQgPSAtMTsKLQotICBwcml2YXRlIGludCB2ZXJiT3B0aW9uID0gVkVSQl9OT1RfU0VUOwotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZHJlc3NMb2NhdGlvbiA9IENvbnRlbnRHZW5lcmF0b3IuQUREUkVTU19MT0NBVElPTjsKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIHJlcXVpcmVkTmFtZXNwYWNlcyA9IHsgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgfTsKLQotICBwdWJsaWMgdm9pZCBzZXRWZXJiKGludCB2ZXJiKSB7Ci0JICB2ZXJiT3B0aW9uID0gdmVyYjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QWRkcmVzc0xvY2F0aW9uKFN0cmluZyBhZGRyZXNzTG9jYXRpb24pIHsKLQkgIHRoaXMuYWRkcmVzc0xvY2F0aW9uID0gYWRkcmVzc0xvY2F0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCkKLSAgewotICAgIHJldHVybiByZXF1aXJlZE5hbWVzcGFjZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZlcnJlZE5hbWVzcGFjZVByZWZpeChTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0JICBpZiAobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIpKSB7Ci0JCSAgcmV0dXJuICJtaW1lIjsKLQkgIH0KLQkgIGVsc2UgaWYgKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iKSkgewotCQkgIHJldHVybiAiaHR0cCI7Ci0JICB9Ci0KLQkgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoUG9ydCBwb3J0KQotICB7Ci0JICAvLyBXZSBibG93IGF3YXkgYW55IGV4aXN0aW5nIEV4dGVuc2liaWxpdHlFbGVtZW50cy9jb250ZW50IGJlZm9yZSB3ZSBnZW5lcmF0ZSBpdAotCSAgLy8gSXMgaXQgd29ydGggYmVpbmcgc21hcnRlcj8gIExvb2sgZm9yIG1hdGNoaW5nIGNvbnRlbnQgZmlyc3QgYW5kIGNyZWF0ZSB0aG9zZSB3aGljaCBhcmVuJ3QgZm91bmQ/Pz8/Ci0JICBMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQkgIHJlbW92ZUV4dGVuc2ViaWxpdHlFbGVtZW50cyhwb3J0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgcmVtb3ZlTGlzdCk7Ci0KLQkgIEhUVFBBZGRyZXNzIGh0dHBBZGRyZXNzPSBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUEFkZHJlc3MoKTsKLQkgIGh0dHBBZGRyZXNzLnNldExvY2F0aW9uVVJJKGFkZHJlc3NMb2NhdGlvbik7Ci0JICBwb3J0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBBZGRyZXNzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0NvbnRlbnQoQmluZGluZyBiaW5kaW5nLCBQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0JICByZW1vdmVFeHRlbnNlYmlsaXR5RWxlbWVudHMoYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHJlbW92ZUxpc3QpOwotCQotCSAgSFRUUEJpbmRpbmcgaHR0cEJpbmRpbmcgPSBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUEJpbmRpbmcoKTsKLQkgIGh0dHBCaW5kaW5nLnNldFZlcmIoZ2V0VmVyYk9wdGlvbihiaW5kaW5nKSA9PSBWRVJCX1BPU1QgPyAiUE9TVCIgOiAiR0VUIik7Ci0KLQkgIGJpbmRpbmcuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cEJpbmRpbmcpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uQ29udGVudChCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLQkgIC8vIFdlIGJsb3cgYXdheSBhbnkgZXhpc3RpbmcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzL2NvbnRlbnQgYmVmb3JlIHdlIGdlbmVyYXRlIGl0Ci0JICAvLyBJcyBpdCB3b3J0aCBiZWluZyBzbWFydGVyPyAgTG9vayBmb3IgbWF0Y2hpbmcgY29udGVudCBmaXJzdCBhbmQgY3JlYXRlIHRob3NlIHdoaWNoIGFyZW4ndCBmb3VuZD8/Pz8KLQkgIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoYmluZGluZ09wZXJhdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCSAgcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQkKLQkgIEhUVFBPcGVyYXRpb24gaHR0cE9wZXJhdGlvbiA9IEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQT3BlcmF0aW9uKCk7Ci0JICBodHRwT3BlcmF0aW9uLnNldExvY2F0aW9uVVJJKCIvIiArIG9wZXJhdGlvbi5nZXROYW1lKCkpOwotCSAgYmluZGluZ09wZXJhdGlvbi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwT3BlcmF0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0lucHV0Q29udGVudChCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0LCBJbnB1dCBpbnB1dCkKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nSW5wdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQkgIAotCSAgLy8gaGFjazogd2UncmUgYmVpbmcgc25lYWt5IGhlcmUuIFNldCB0aGUgJ3ZlcmInIG9wdGlvbnMgbm93LgotCSAgaW50IG9wdGlvbiA9IGdldFZlcmJPcHRpb24oYmluZGluZ0lucHV0KTsKLQkgIHJlbW92ZUV4dGVuc2ViaWxpdHlFbGVtZW50cyhiaW5kaW5nSW5wdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQkgIAotCSAgaWYgKG9wdGlvbiA9PSBWRVJCX1BPU1QpCi0JICB7Ci0JCSAgLy8gVE9ETzogSXMgdGhlcmUgYW4gZXF1aXZhbGVudCBIVFRQIE1vZGVsIE9iamVjdCBmb3IgdGhpcz8uLi4uCi0JCSAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChiaW5kaW5nSW5wdXQuZ2V0RWxlbWVudCgpLCAibWltZSIsICJjb250ZW50Iik7Ci0JCSAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCSAgSFRUUFVybEVuY29kZWQgdXJsRW5jb2RlZD0gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBVcmxFbmNvZGVkKCk7Ci0JCSAgYmluZGluZ0lucHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHVybEVuY29kZWQpOwotCSAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQsIE91dHB1dCBvdXRwdXQpCi0gIHsKLQkgIC8vIFdlIGJsb3cgYXdheSBhbnkgZXhpc3RpbmcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzL2NvbnRlbnQgYmVmb3JlIHdlIGdlbmVyYXRlIGl0Ci0JICAvLyBJcyBpdCB3b3J0aCBiZWluZyBzbWFydGVyPyAgTG9vayBmb3IgbWF0Y2hpbmcgY29udGVudCBmaXJzdCBhbmQgY3JlYXRlIHRob3NlIHdoaWNoIGFyZW4ndCBmb3VuZD8/Pz8KLQkgIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoYmluZGluZ091dHB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0JICAvLyBoYWNrOiB3ZSdyZSBiZWluZyBzbmVha3kgaGVyZS4gU2V0IHRoZSAndmVyYicgb3B0aW9ucyBub3cuCi0JICBnZXRWZXJiT3B0aW9uKGJpbmRpbmdPdXRwdXQpOwotCSAgcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdPdXRwdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQotCSAgLy8gVE9ETzogSXMgdGhlcmUgYW4gZXF1aXZhbGVudCBIVFRQIE1vZGVsIE9iamVjdCBmb3IgdGhpcz8uLi4uCi0JICBFbGVtZW50IGJpbmRpbmdPdXRwdXRFbGVtZW50ID0gYmluZGluZ091dHB1dC5nZXRFbGVtZW50KCk7Ci0JICBFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGJpbmRpbmdPdXRwdXRFbGVtZW50LCAibWltZSIsICJjb250ZW50Iik7Ci0JICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L3htbCIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nRmF1bHRDb250ZW50KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQsIEZhdWx0IGZhdWx0KQotICB7Ci0gICAgLy9UT0RPISEKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArICI6IiArIGVsZW1lbnROYW1lKSA6IGVsZW1lbnROYW1lOwotICAgIEVsZW1lbnQgcmVzdWx0ID0gcGFyZW50RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChuYW1lKTsKLQlwYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShyZXN1bHQsIHBhcmVudEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLS8vICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8gIAotICBwcml2YXRlIGludCBnZXRWZXJiT3B0aW9uKE9iamVjdCBnZW5lcmljQmluZGluZ09iamVjdCkgewotCSAgaWYgKHZlcmJPcHRpb24gPT0gVkVSQl9OT1RfU0VUICYmIGdlbmVyaWNCaW5kaW5nT2JqZWN0ICE9IG51bGwpIHsKLQkJICAvLyBpbml0KCkgd2FzIG5ldmVyIGNhbGxlZCwgdHJ5IHRvIGRldGVybWluZSB0aGUgJ3ZlcmInIGJhc2VkIG9uIHdoYXQgd2UgaGF2ZS9rbm93Ci0JCSAgQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZ09iamVjdChnZW5lcmljQmluZGluZ09iamVjdCk7Ci0JCSAgCi0JCSAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgdmVyYiBmcm9tIHRoZSBCaW5kaW5nIE9iamVjdAotCQkgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCSAgTGlzdCBsaXN0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCQkgIEl0ZXJhdG9yIHZhbHVlc0l0ID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShsaXN0LCAidmVyYiIpLml0ZXJhdG9yKCk7Ci0KLQkJCSAgd2hpbGUgKHZhbHVlc0l0Lmhhc05leHQoKSkgewotCQkJCSAgU3RyaW5nIHZlcmIgPSAoU3RyaW5nKSB2YWx1ZXNJdC5uZXh0KCk7Ci0JCQkJICAKLQkJCQkgIGlmICh2ZXJiLmVxdWFscygiUE9TVCIpKSB7Ci0JCQkJCSAgdmVyYk9wdGlvbiA9IFZFUkJfUE9TVDsKLQkJCQkgIH0KLQkJCQkgIGVsc2UgaWYgKHZlcmIuZXF1YWxzKCJHRVQiKSkgewotCQkJCQkgIHZlcmJPcHRpb24gPSBWRVJCX0dFVDsKLQkJCQkgIH0KLQkJCQkgIAotCQkJCSAgaWYgKHZlcmJPcHRpb24gIT0gVkVSQl9OT1RfU0VUKSB7Ci0JCQkJCSAgYnJlYWs7Ci0JCQkJICB9Ci0JCQkgIH0KLQkJICB9Ci0JICB9Ci0JICAKLQkgIGlmICh2ZXJiT3B0aW9uID09IFZFUkJfTk9UX1NFVCkgewotCQkgIHZlcmJPcHRpb24gPSBWRVJCX0dFVDsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIHZlcmJPcHRpb247Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEF0dHJpYnV0ZVZhbHVlKExpc3QgZWVMaXN0LCBTdHJpbmcgYXR0cmlidXRlS2V5KSB7Ci0JICBMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIEl0ZXJhdG9yIGVlRWxlbWVudHNJdCA9IGVlTGlzdC5pdGVyYXRvcigpOwotCSAgCi0JICB3aGlsZSAoZWVFbGVtZW50c0l0Lmhhc05leHQoKSkgewotCQkgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlRWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZWVFbGVtZW50c0l0Lm5leHQoKTsKLQkJICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBlZUVsZW1lbnQuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVLZXkpOwotCQkgIGlmIChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsICYmICFhdHRyaWJ1dGVWYWx1ZS5lcXVhbHMoIiIpKSB7Ci0JCQkgIHZhbHVlcy5hZGQoYXR0cmlidXRlVmFsdWUpOwotCQkgIH0JCSAgCi0JICB9Ci0JICAKLQkgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgQmluZGluZyBnZXRCaW5kaW5nT2JqZWN0KE9iamVjdCBnZW5lcmljQmluZGluZ09iamVjdCkgewotCSAgT2JqZWN0IHBhcmVudCA9IGdlbmVyaWNCaW5kaW5nT2JqZWN0OwotCSAgCi0JICBpbnQgaW5kZXggPSAwOwotCSAgd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIGluZGV4IDwgNSkgewotCQkgIHBhcmVudCA9IGdldEdlbmVyaWNCaW5kaW5nT2JqZWN0UGFyZW50KHBhcmVudCk7Ci0JCSAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLQkJCSAgYnJlYWs7Ci0JCSAgfQotCQkgIGluZGV4Kys7Ci0JICB9Ci0KLQkgIHJldHVybiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZyk/IChCaW5kaW5nKSBwYXJlbnQgOiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIE9iamVjdCBnZXRHZW5lcmljQmluZGluZ09iamVjdFBhcmVudChPYmplY3QgZ2VuZXJpY0JpbmRpbmdPYmplY3QpIHsKLQkgIE9iamVjdCBwYXJlbnQgPSBudWxsOwotCSAgCi0JICBpZiAoZ2VuZXJpY0JpbmRpbmdPYmplY3QgIT0gbnVsbCkgewotCQkgIGlmIChnZW5lcmljQmluZGluZ09iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdPcGVyYXRpb24pIHsKLQkJCSAgcGFyZW50ID0gKChCaW5kaW5nT3BlcmF0aW9uKSBnZW5lcmljQmluZGluZ09iamVjdCkuZ2V0Q29udGFpbmVyKCk7Ci0JCSAgfQotCQkgIGVsc2UgaWYgKGdlbmVyaWNCaW5kaW5nT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KSB7Ci0JCQkgIHBhcmVudCA9ICgoQmluZGluZ0lucHV0KSBnZW5lcmljQmluZGluZ09iamVjdCkuZ2V0Q29udGFpbmVyKCk7Ci0JCSAgfQotCQkgIGVsc2UgaWYgKGdlbmVyaWNCaW5kaW5nT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkgewotCQkJICBwYXJlbnQgPSAoKEJpbmRpbmdPdXRwdXQpIGdlbmVyaWNCaW5kaW5nT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoZ2VuZXJpY0JpbmRpbmdPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nRmF1bHQpIHsKLQkJCSAgcGFyZW50ID0gKChCaW5kaW5nRmF1bHQpIGdlbmVyaWNCaW5kaW5nT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJICB9CSAgCi0JICB9Ci0JICAKLQkgIHJldHVybiBwYXJlbnQ7CSAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZW1vdmVFeHRlbnNlYmlsaXR5RWxlbWVudHMoTGlzdCBvcmlnaW5hbExpc3QsIExpc3QgcmVtb3ZlTGlzdCkgewotCSAgSXRlcmF0b3IgcmVtb3ZlSXQgPSByZW1vdmVMaXN0Lml0ZXJhdG9yKCk7Ci0JICB3aGlsZSAocmVtb3ZlSXQuaGFzTmV4dCgpKSB7Ci0JCSAgb3JpZ2luYWxMaXN0LnJlbW92ZShyZW1vdmVJdC5uZXh0KCkpOwotCSAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotCSAgcmV0dXJuICJIVFRQIjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEFkZHJlc3NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBBZGRyZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFkNDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEFkZHJlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZGRyZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQWRkcmVzc0ltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBBZGRyZXNzSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhUVFBBZGRyZXNzIHsKLQkvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb25VUkkgPSBMT0NBVElPTl9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUEFkZHJlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBBZGRyZXNzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSSSgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uVVJJOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uVVJJKFN0cmluZyBuZXdMb2NhdGlvblVSSSkgewotCQlTdHJpbmcgb2xkTG9jYXRpb25VUkkgPSBsb2NhdGlvblVSSTsKLQkJbG9jYXRpb25VUkkgPSBuZXdMb2NhdGlvblVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkksIG9sZExvY2F0aW9uVVJJLCBsb2NhdGlvblVSSSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0JCQkJcmV0dXJuIGdldExvY2F0aW9uVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotCQkJCXNldExvY2F0aW9uVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotCQkJCXNldExvY2F0aW9uVVJJKExPQ0FUSU9OX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0JCQkJcmV0dXJuIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb25VUkkgIT0gbnVsbCA6ICFMT0NBVElPTl9VUklfRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uVVJJKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2F0aW9uVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2NhdGlvblVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gIAlzZXRMb2NhdGlvblVSSQotICAgICAgKEhUVFBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBIVFRQQ29uc3RhbnRzLkxPQ0FUSU9OX1VSSV9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQQWRkcmVzc19Mb2NhdGlvblVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsSFRUUENvbnN0YW50cy5MT0NBVElPTl9VUklfQVRUUklCVVRFLGdldExvY2F0aW9uVVJJKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoSFRUUENvbnN0YW50cy5IVFRQX05BTUVTUEFDRV9VUkksIEhUVFBDb25zdGFudHMuQUREUkVTU19FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9Ci19IC8vSFRUUEFkZHJlc3NJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBCaW5kaW5nSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNGJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBCaW5kaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUEJpbmRpbmdJbXBsI2dldFZlcmIgPGVtPlZlcmI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQQmluZGluZ0ltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBIVFRQQmluZGluZyB7Ci0JLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgYXNzaWduZWQgd2l0aCAxTCB0byBhdm9pZAotICAgKiBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcmIoKSA8ZW0+VmVyYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSQl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJiKCkgPGVtPlZlcmI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcmIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyYiA9IFZFUkJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUEJpbmRpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBCaW5kaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJiKCkgewotCQlyZXR1cm4gdmVyYjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJiKFN0cmluZyBuZXdWZXJiKSB7Ci0JCVN0cmluZyBvbGRWZXJiID0gdmVyYjsKLQkJdmVyYiA9IG5ld1ZlcmI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fVkVSQiwgb2xkVmVyYiwgdmVyYikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCOgotCQkJCXJldHVybiBnZXRWZXJiKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fVkVSQjoKLQkJCQlzZXRWZXJiKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fVkVSQjoKLQkJCQlzZXRWZXJiKFZFUkJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fVkVSQjoKLQkJCQlyZXR1cm4gVkVSQl9FREVGQVVMVCA9PSBudWxsID8gdmVyYiAhPSBudWxsIDogIVZFUkJfRURFRkFVTFQuZXF1YWxzKHZlcmIpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmVyYjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyYik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gIAlzZXRWZXJiCi0gICAgICAoSFRUUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIEhUVFBDb25zdGFudHMuVkVSQl9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQQmluZGluZ19WZXJiKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxIVFRQQ29uc3RhbnRzLlZFUkJfQVRUUklCVVRFLGdldFZlcmIoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoSFRUUENvbnN0YW50cy5IVFRQX05BTUVTUEFDRV9VUkksIEhUVFBDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9Ci0gIAotfSAvL0hUVFBCaW5kaW5nSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWU5N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSFRUUEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HOiByZXR1cm4gY3JlYXRlSFRUUEJpbmRpbmcoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT046IHJldHVybiBjcmVhdGVIVFRQT3BlcmF0aW9uKCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UOiByZXR1cm4gY3JlYXRlSFRUUFVybFJlcGxhY2VtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERUQ6IHJldHVybiBjcmVhdGVIVFRQVXJsRW5jb2RlZCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1M6IHJldHVybiBjcmVhdGVIVFRQQWRkcmVzcygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBCaW5kaW5nIGNyZWF0ZUhUVFBCaW5kaW5nKCkgewotCQlIVFRQQmluZGluZ0ltcGwgaHR0cEJpbmRpbmcgPSBuZXcgSFRUUEJpbmRpbmdJbXBsKCk7Ci0JCXJldHVybiBodHRwQmluZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUE9wZXJhdGlvbiBjcmVhdGVIVFRQT3BlcmF0aW9uKCkgewotCQlIVFRQT3BlcmF0aW9uSW1wbCBodHRwT3BlcmF0aW9uID0gbmV3IEhUVFBPcGVyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBodHRwT3BlcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQVXJsUmVwbGFjZW1lbnQgY3JlYXRlSFRUUFVybFJlcGxhY2VtZW50KCkgewotCQlIVFRQVXJsUmVwbGFjZW1lbnRJbXBsIGh0dHBVcmxSZXBsYWNlbWVudCA9IG5ldyBIVFRQVXJsUmVwbGFjZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBodHRwVXJsUmVwbGFjZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBVcmxFbmNvZGVkIGNyZWF0ZUhUVFBVcmxFbmNvZGVkKCkgewotCQlIVFRQVXJsRW5jb2RlZEltcGwgaHR0cFVybEVuY29kZWQgPSBuZXcgSFRUUFVybEVuY29kZWRJbXBsKCk7Ci0JCXJldHVybiBodHRwVXJsRW5jb2RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUEFkZHJlc3MgY3JlYXRlSFRUUEFkZHJlc3MoKSB7Ci0JCUhUVFBBZGRyZXNzSW1wbCBodHRwQWRkcmVzcyA9IG5ldyBIVFRQQWRkcmVzc0ltcGwoKTsKLQkJcmV0dXJuIGh0dHBBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQUGFja2FnZSBnZXRIVFRQUGFja2FnZSgpIHsKLQkJcmV0dXJuIChIVFRQUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBIVFRQUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLX0gLy9IVFRQRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUE9wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUE9wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2NmJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBPcGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUE9wZXJhdGlvbkltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBPcGVyYXRpb25JbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSFRUUE9wZXJhdGlvbiB7Ci0JLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgYXNzaWduZWQgd2l0aCAxTCB0byBhdm9pZAotICAgKiBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uVVJJID0gTE9DQVRJT05fVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBPcGVyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBPcGVyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJJKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIG5ld0xvY2F0aW9uVVJJKSB7Ci0JCVN0cmluZyBvbGRMb2NhdGlvblVSSSA9IGxvY2F0aW9uVVJJOwotCQlsb2NhdGlvblVSSSA9IG5ld0xvY2F0aW9uVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJLCBvbGRMb2NhdGlvblVSSSwgbG9jYXRpb25VUkkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSToKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb25VUkkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJOgotCQkJCXNldExvY2F0aW9uVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSToKLQkJCQlzZXRMb2NhdGlvblVSSShMT0NBVElPTl9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSToKLQkJCQlyZXR1cm4gTE9DQVRJT05fVVJJX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvblVSSSAhPSBudWxsIDogIUxPQ0FUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMobG9jYXRpb25VUkkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb25VUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2F0aW9uVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldExvY2F0aW9uVVJJCi0gICAgICAoSFRUUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIEhUVFBDb25zdGFudHMuTE9DQVRJT05fVVJJX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBPcGVyYXRpb25fTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LEhUVFBDb25zdGFudHMuTE9DQVRJT05fVVJJX0FUVFJJQlVURSxnZXRMb2NhdGlvblVSSSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKEhUVFBDb25zdGFudHMuSFRUUF9OQU1FU1BBQ0VfVVJJLCBIVFRQQ29uc3RhbnRzLk9QRVJBVElPTl9FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9Ci0gIAotfSAvL0hUVFBPcGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxYWRhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFBhY2thZ2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEhUVFBQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBodHRwQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBodHRwT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBodHRwVXJsRW5jb2RlZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBodHRwQWRkcmVzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpaHR0cEFkZHJlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaWh0dHBCaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlodHRwT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlodHRwVXJsRW5jb2RlZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSFRUUFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBIVFRQUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSFRUUFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KEhUVFBQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UuCi0JCUhUVFBQYWNrYWdlSW1wbCB0aGVIVFRQUGFja2FnZSA9IChIVFRQUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEhUVFBQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhTRFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoV1NETFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChXU0RMUGFja2FnZS5lTlNfVVJJKSA6IFdTRExQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCi0JCS8vIFN0ZXAgMTogY3JlYXRlIG1ldGEtbW9kZWwgb2JqZWN0cwotCQl0aGVIVFRQUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV1NETFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gU3RlcCAyOiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgotCQl0aGVIVFRQUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdTRExQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQlyZXR1cm4gdGhlSFRUUFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRIVFRQQmluZGluZygpIHsKLQkJcmV0dXJuIGh0dHBCaW5kaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhUVFBCaW5kaW5nX1ZlcmIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlodHRwQmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SFRUUE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIGh0dHBPcGVyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SFRUUE9wZXJhdGlvbl9Mb2NhdGlvblVSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWh0dHBPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhUVFBVcmxSZXBsYWNlbWVudCgpIHsKLQkJcmV0dXJuIGh0dHBVcmxSZXBsYWNlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhUVFBVcmxFbmNvZGVkKCkgewotCQlyZXR1cm4gaHR0cFVybEVuY29kZWRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRIVFRQQWRkcmVzcygpIHsKLQkJcmV0dXJuIGh0dHBBZGRyZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhUVFBBZGRyZXNzX0xvY2F0aW9uVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaHR0cEFkZHJlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElIVFRQQWRkcmVzcygpIHsKLQkJcmV0dXJuIGlodHRwQWRkcmVzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElIVFRQQmluZGluZygpIHsKLQkJcmV0dXJuIGlodHRwQmluZGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElIVFRQT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gaWh0dHBPcGVyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSFRUUFVybEVuY29kZWQoKSB7Ci0JCXJldHVybiBpaHR0cFVybEVuY29kZWRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSFRUUFVybFJlcGxhY2VtZW50KCkgewotCQlyZXR1cm4gaWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUEZhY3RvcnkgZ2V0SFRUUEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSFRUUEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJaHR0cEJpbmRpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9CSU5ESU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShodHRwQmluZGluZ0VDbGFzcywgSFRUUF9CSU5ESU5HX19WRVJCKTsKLQotCQlodHRwT3BlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhUVFBfT1BFUkFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShodHRwT3BlcmF0aW9uRUNsYXNzLCBIVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJKTsKLQotCQlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9VUkxfUkVQTEFDRU1FTlQpOwotCi0JCWh0dHBVcmxFbmNvZGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhUVFBfVVJMX0VOQ09ERUQpOwotCi0JCWh0dHBBZGRyZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhUVFBfQUREUkVTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaHR0cEFkZHJlc3NFQ2xhc3MsIEhUVFBfQUREUkVTU19fTE9DQVRJT05fVVJJKTsKLQotCQlpaHR0cEFkZHJlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfQUREUkVTUyk7Ci0KLQkJaWh0dHBCaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKElIVFRQX0JJTkRJTkcpOwotCi0JCWlodHRwT3BlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElIVFRQX09QRVJBVElPTik7Ci0KLQkJaWh0dHBVcmxFbmNvZGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKElIVFRQX1VSTF9FTkNPREVEKTsKLQotCQlpaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElIVFRQX1VSTF9SRVBMQUNFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVdTRExQYWNrYWdlSW1wbCB0aGVXU0RMUGFja2FnZSA9IChXU0RMUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlodHRwQmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJaHR0cEJpbmRpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSFRUUEJpbmRpbmcoKSk7Ci0JCWh0dHBPcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCWh0dHBPcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSFRUUE9wZXJhdGlvbigpKTsKLQkJaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSFRUUFVybFJlcGxhY2VtZW50KCkpOwotCQlodHRwVXJsRW5jb2RlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJaHR0cFVybEVuY29kZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSFRUUFVybEVuY29kZWQoKSk7Ci0JCWh0dHBBZGRyZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQlodHRwQWRkcmVzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQQWRkcmVzcygpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGh0dHBCaW5kaW5nRUNsYXNzLCBIVFRQQmluZGluZy5jbGFzcywgIkhUVFBCaW5kaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SFRUUEJpbmRpbmdfVmVyYigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyYiIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLQkJaW5pdEVDbGFzcyhodHRwT3BlcmF0aW9uRUNsYXNzLCBIVFRQT3BlcmF0aW9uLmNsYXNzLCAiSFRUUE9wZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhUVFBPcGVyYXRpb25fTG9jYXRpb25VUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2F0aW9uVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotCQlpbml0RUNsYXNzKGh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcywgSFRUUFVybFJlcGxhY2VtZW50LmNsYXNzLCAiSFRUUFVybFJlcGxhY2VtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGh0dHBVcmxFbmNvZGVkRUNsYXNzLCBIVFRQVXJsRW5jb2RlZC5jbGFzcywgIkhUVFBVcmxFbmNvZGVkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGh0dHBBZGRyZXNzRUNsYXNzLCBIVFRQQWRkcmVzcy5jbGFzcywgIkhUVFBBZGRyZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SFRUUEFkZHJlc3NfTG9jYXRpb25VUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2F0aW9uVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotCQlpbml0RUNsYXNzKGlodHRwQWRkcmVzc0VDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MuY2xhc3MsICJJSFRUUEFkZHJlc3MiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGlodHRwQmluZGluZ0VDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcuY2xhc3MsICJJSFRUUEJpbmRpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGlodHRwT3BlcmF0aW9uRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uLmNsYXNzLCAiSUhUVFBPcGVyYXRpb24iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGlodHRwVXJsRW5jb2RlZEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQuY2xhc3MsICJJSFRUUFVybEVuY29kZWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudC5jbGFzcywgIklIVFRQVXJsUmVwbGFjZW1lbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotfSAvL0hUVFBQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQVXJsRW5jb2RlZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFVybEVuY29kZWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODFlOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQVXJsRW5jb2RlZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXJsIEVuY29kZWQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQVXJsRW5jb2RlZEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBIVFRQVXJsRW5jb2RlZCB7Ci0JLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgYXNzaWduZWQgd2l0aCAxTCB0byBhdm9pZAotICAgKiBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBVcmxFbmNvZGVkSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQVXJsRW5jb2RlZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotCSAgewotCSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLQkgICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShIVFRQQ29uc3RhbnRzLkhUVFBfTkFNRVNQQUNFX1VSSSwgSFRUUENvbnN0YW50cy5VUkxfRU5DT0RFRF9FTEVNRU5UX1RBRyk7Ci0JICAgIHJldHVybiBlbGVtZW50VHlwZTsKLQkgIH0KLQkgIAotfSAvL0hUVFBVcmxFbmNvZGVkSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQVXJsUmVwbGFjZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxSZXBsYWNlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4YjRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxSZXBsYWNlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVybCBSZXBsYWNlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBVcmxSZXBsYWNlbWVudEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBIVFRQVXJsUmVwbGFjZW1lbnQgewotCS8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQVXJsUmVwbGFjZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBVcmxSZXBsYWNlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLQkgIHsKLQkgICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpCi0JICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoSFRUUENvbnN0YW50cy5IVFRQX05BTUVTUEFDRV9VUkksIEhUVFBDb25zdGFudHMuVVJMX1JFUExBQ0VNRU5UX0VMRU1FTlRfVEFHKTsKLQkgICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotCSAgfQotCSAgCi19IC8vSFRUUFVybFJlcGxhY2VtZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzQ4MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBIVFRQUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBIVFRQUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBIVFRQU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlSFRUUEJpbmRpbmcoSFRUUEJpbmRpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhUVFBCaW5kaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSFRUUE9wZXJhdGlvbihIVFRQT3BlcmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIVFRQT3BlcmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSFRUUFVybFJlcGxhY2VtZW50KEhUVFBVcmxSZXBsYWNlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUFVybFJlcGxhY2VtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSFRUUFVybEVuY29kZWQoSFRUUFVybEVuY29kZWQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhUVFBVcmxFbmNvZGVkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSFRUUEFkZHJlc3MoSFRUUEFkZHJlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhUVFBBZGRyZXNzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUhUVFBBZGRyZXNzKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJSFRUUEFkZHJlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUEJpbmRpbmcoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlIVFRQQmluZGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQT3BlcmF0aW9uKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlIVFRQT3BlcmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUhUVFBVcmxFbmNvZGVkKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJSFRUUFVybEVuY29kZWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUFVybFJlcGxhY2VtZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUhUVFBVcmxSZXBsYWNlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUEJpbmRpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUE9wZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCA8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUFVybFJlcGxhY2VtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQgPGVtPlVybCBFbmNvZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIVFRQVXJsRW5jb2RlZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzIDxlbT5BZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIVFRQQWRkcmVzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MgPGVtPklIVFRQIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUhUVFBBZGRyZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyA8ZW0+SUhUVFAgQmluZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSFRUUEJpbmRpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24gPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlIVFRQT3BlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCA8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUhUVFBVcmxFbmNvZGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUhUVFBVcmxSZXBsYWNlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0hUVFBBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NmExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSFRUUENvbnN0YW50cyAKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTU19FTEVNRU5UX1RBRyA9ICJhZGRyZXNzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19FTEVNRU5UX1RBRyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX0VMRU1FTlRfVEFHID0gIm9wZXJhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkNPREVEX0VMRU1FTlRfVEFHID0gInVybEVuY29kZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUkVQTEFDRU1FTlRfRUxFTUVOVF9UQUcgPSAidXJsUmVwbGFjZW1lbnQiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1VSSV9BVFRSSUJVVEUgPSJsb2NhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUkJfQVRUUklCVVRFID0idmVyYiI7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5NjJkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgaWYgKEhUVFBDb25zdGFudHMuSFRUUF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIGlmIChIVFRQQ29uc3RhbnRzLkFERFJFU1NfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUEFkZHJlc3MoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEhUVFBDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQQmluZGluZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSFRUUENvbnN0YW50cy5PUEVSQVRJT05fRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUE9wZXJhdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSFRUUENvbnN0YW50cy5VUkxfRU5DT0RFRF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBVcmxFbmNvZGVkKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLlVSTF9SRVBMQUNFTUVOVF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBVcmxSZXBsYWNlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5oYW5kbGVkIGxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSk7Ci0gICAgICAgIHJldHVybiBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5oYW5kbGVkIG5hbWVzcGFjZTogIiArIG5hbWVzcGFjZSk7Ci0gICAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkMDNmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSFRUUFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEhUVFBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJc3dpdGNoICh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElORzogewotCQkJCQlIVFRQQmluZGluZyBodHRwQmluZGluZyA9IChIVFRQQmluZGluZyl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBCaW5kaW5nKGh0dHBCaW5kaW5nKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cEJpbmRpbmcpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSFRUUEJpbmRpbmcoaHR0cEJpbmRpbmcpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChodHRwQmluZGluZyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwQmluZGluZyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT046IHsKLQkJCQkJSFRUUE9wZXJhdGlvbiBodHRwT3BlcmF0aW9uID0gKEhUVFBPcGVyYXRpb24pdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIVFRQT3BlcmF0aW9uKGh0dHBPcGVyYXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwT3BlcmF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUhUVFBPcGVyYXRpb24oaHR0cE9wZXJhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGh0dHBPcGVyYXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cE9wZXJhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlQ6IHsKLQkJCQkJSFRUUFVybFJlcGxhY2VtZW50IGh0dHBVcmxSZXBsYWNlbWVudCA9IChIVFRQVXJsUmVwbGFjZW1lbnQpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIVFRQVXJsUmVwbGFjZW1lbnQoaHR0cFVybFJlcGxhY2VtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cFVybFJlcGxhY2VtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUhUVFBVcmxSZXBsYWNlbWVudChodHRwVXJsUmVwbGFjZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChodHRwVXJsUmVwbGFjZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cFVybFJlcGxhY2VtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEOiB7Ci0JCQkJCUhUVFBVcmxFbmNvZGVkIGh0dHBVcmxFbmNvZGVkID0gKEhUVFBVcmxFbmNvZGVkKXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSFRUUFVybEVuY29kZWQoaHR0cFVybEVuY29kZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwVXJsRW5jb2RlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlIVFRQVXJsRW5jb2RlZChodHRwVXJsRW5jb2RlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGh0dHBVcmxFbmNvZGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBVcmxFbmNvZGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1M6IHsKLQkJCQkJSFRUUEFkZHJlc3MgaHR0cEFkZHJlc3MgPSAoSFRUUEFkZHJlc3MpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIVFRQQWRkcmVzcyhodHRwQWRkcmVzcyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBBZGRyZXNzKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUhUVFBBZGRyZXNzKGh0dHBBZGRyZXNzKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoaHR0cEFkZHJlc3MpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cEFkZHJlc3MpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBCaW5kaW5nKEhUVFBCaW5kaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSFRUUE9wZXJhdGlvbihIVFRQT3BlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSFRUUFVybFJlcGxhY2VtZW50KEhUVFBVcmxSZXBsYWNlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVybCBFbmNvZGVkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVybCBFbmNvZGVkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQVXJsRW5jb2RlZChIVFRQVXJsRW5jb2RlZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFkZHJlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSFRUUEFkZHJlc3MoSFRUUEFkZHJlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBBZGRyZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQQWRkcmVzcyhqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIEJpbmRpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgQmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUhUVFBCaW5kaW5nKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUhUVFBPcGVyYXRpb24oamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUFVybEVuY29kZWQoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUFVybFJlcGxhY2VtZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9IVFRQU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL01JTUUuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL01JTUUuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGRjNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9tb2RlbC9NSU1FLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5taW1lL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLm1pbWUuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5taW1lLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLm1pbWUiIG1vZGVsTmFtZT0iTUlNRSIgZWRpdFBsdWdpbkNsYXNzPSIiCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9IiIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjL21vZGVsL1hTRC5nZW5tb2RlbCMvL3hzZCI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxtaW1lLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPlZBQkFTRV9QTFVHSU5TX1BBVEg8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNSU1FIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nIiBlY29yZVBhY2thZ2U9Im1pbWUuZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtaW1lLmVjb3JlIy8vTGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9NSU1FQ29udGVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbWltZS5lY29yZSMvL01JTUVDb250ZW50L3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQvZVBhcnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQvc2V0UGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQvc2V0UGFydC9wYXJ0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVDb250ZW50L2dldFBhcnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL01JTUVQYXJ0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRVBhcnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibWltZS5lY29yZSMvL01JTUVQYXJ0L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50L2V4dGVuc2liaWxpdHlFbGVtZW50Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVQYXJ0L2dldEV4dGVuc2liaWxpdHlFbGVtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vTUlNRU11bHRpcGFydFJlbGF0ZWQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtaW1lLmVjb3JlIy8vTUlNRU11bHRpcGFydFJlbGF0ZWQvZU1JTUVQYXJ0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVNdWx0aXBhcnRSZWxhdGVkL2FkZE1JTUVQYXJ0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1pbWUuZWNvcmUjLy9NSU1FTXVsdGlwYXJ0UmVsYXRlZC9hZGRNSU1FUGFydC9taW1lUGFydCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1pbWUuZWNvcmUjLy9NSU1FTXVsdGlwYXJ0UmVsYXRlZC9nZXRNSU1FUGFydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL01JTUVNaW1lWG1sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtaW1lLmVjb3JlIy8vTUlNRU1pbWVYbWwvZVBhcnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRU1pbWVYbWwvc2V0UGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtaW1lLmVjb3JlIy8vTUlNRU1pbWVYbWwvc2V0UGFydC9wYXJ0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVNaW1lWG1sL2dldFBhcnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL0lNSU1FUGFydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9JTUlNRU11bHRpcGFydFJlbGF0ZWQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vSU1JTUVDb250ZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL0lNSU1FTWltZVhtbCIvPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXU0RMIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMiIGVjb3JlUGFja2FnZT0id3NkbC5lY29yZSMvIj4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9RTmFtZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL09wZXJhdGlvblR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01FbGVtZW50Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vV1NETEV4Y2VwdGlvbiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTURvY3VtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZG9jdW1lbnRhdGlvbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZWxlbWVudCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9nZXRFbmNsb3NpbmdEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24vZGVmaW5pdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS91bmRlZmluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnRUeXBlL2VPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vc3R5bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZU91dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VGYXVsdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VQYXJhbWV0ZXJPcmRlcmluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS91bmRlZmluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL2VQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUGFydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L2VsZW1lbnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvdHlwZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC90eXBlRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VsZW1lbnREZWNsYXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VNZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lUG9ydFR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZUJpbmRpbmdPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZU9wZXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nRmF1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9TZXJ2aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1NlcnZpY2UvZVBvcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnQvZUJpbmRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZWxlbWVudFR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2xvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lbmNvZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lTWVzc2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVBvcnRUeXBlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lQmluZGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VOYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VUeXBlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lSW1wb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2dldERvY3VtZW50Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQvZG9jdW1lbnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ltcG9ydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0ltcG9ydC9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2xvY2F0aW9uVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZVNjaGVtYSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvZ2V0U2NoZW1hIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9zZXRTY2hlbWEiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0ltcG9ydC9zZXRTY2hlbWEvc2NoZW1hIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9lRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2dldEV4dGVuc2liaWxpdHlFbGVtZW50cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZXh0RWxlbWVudCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW5wdXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vT3V0cHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ZhdWx0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9lSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2dldElucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9zZXRJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0L2lucHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZU91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2dldE91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9zZXRPdXRwdXQvb3V0cHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZUZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9nZXRGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdC9mYXVsdCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTmFtZXNwYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTmFtZXNwYWNlL1VSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvcHJlZml4Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uL29wZXJhdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL25hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL2lucHV0TmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vb3V0cHV0TmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQvZmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0UGFyYW1ldGVyT3JkZXJpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZy9wYXJhbWV0ZXJPcmRlciIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldElucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQvaW5wdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0L291dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUlucHV0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPdXRwdXQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUZhdWx0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNZXNzYWdlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydC9wYXJ0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cy9wYXJ0T3JkZXIiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQYXJ0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS92YWx1ZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JU2VydmljZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQvcG9ydCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvZ2V0QmluZGluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nL2JpbmRpbmciLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbi9iaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vaW5wdXROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9vdXRwdXROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldFBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZS9wb3J0VHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdC9iaW5kaW5nRmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldE9wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbi9vcGVyYXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0L2JpbmRpbmdJbnB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQvYmluZGluZ091dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdJbnB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ091dHB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0ZhdWx0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmcvYmluZGluZyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydC9pbXBvcnREZWYiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL3ByZWZpeCIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlL3BvcnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2Uvc2VydmljZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ09wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUltcG9ydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVNZXNzYWdlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU9wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUGFydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQb3J0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVNlcnZpY2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZy9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmdzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZS9wcmVmaXgiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkvZXh0ZW5zaW9uUmVnaXN0cnkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RG9jdW1lbnRCYXNlVVJJIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJL2RvY3VtZW50QmFzZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZy9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMvdHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUxpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVVJMIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9UeXBlcyI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcy4xIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSXRlcmF0b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVR5cGVzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC9wYXJlbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L2NoaWxkcmVuIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC9zY2hlbWEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9lTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuTUlNRS5jYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuTUlNRS5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0N2Y5MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9tb2RlbC9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLk1JTUUuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQyCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1pbWUiCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBxdWlkICAgICAgIAkiM0FDOTEyN0MwMjY2IgotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJNSU1FQ29udGVudCIKLQkgICAgcXVpZCAgICAgICAJIjNBQzkxMzVCMDNBNyIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRUYxMUNBMDM4RSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNBQzkxOTcxMDM2QiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIk1JTUVQYXJ0IgotCSAgICBxdWlkICAgICAgIAkiM0FDOTEzRUUwMEVCIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjExNDAwMjU5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFOEIxQUIwMTVEIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiTUlNRU11bHRpcGFydFJlbGF0ZWQiCi0JICAgIHF1aWQgICAgICAgCSIzQUM5MTNGQTAyNUIiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUVGMTFENTAzMzAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIk1JTUVNaW1lWG1sIgotCSAgICBxdWlkICAgICAgIAkiM0FDOTE0NUEwMUZGIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjExREQwMzhCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBxdWlkICAgICAgIAkiM0FFNzNCM0MwMzU2IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkgICAgcXVpZCAgICAgICAJIjNBRTczQjNEMDA5MCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVDb250ZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxMzVCMDNBNyIpCi0JCShvYmplY3QgUm9sZSAicGFydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUU3M0IzRDAwOUEiCi0JCSAgICBsYWJlbCAgICAgIAkicGFydCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiIKLQkgICAgcXVpZCAgICAgICAJIjNBRTczQkI5MDBENSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUU3M0JCOTAzQ0UiCi0JCSAgICBsYWJlbCAgICAgIAkicGFydCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzNCQjkwM0UyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU1pbWVYbWwiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTE0NUEwMUZGIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiCi0JICAgIHF1aWQgICAgICAgCSIzQUVGMTJGRTAzODciCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjEzMDAwMEQ3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU11bHRpcGFydFJlbGF0ZWQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRkEwMjVCIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImVsZW1lbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUYxMzAwMDBFMSIKLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IgotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxM0VFMDBFQiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkJpbmRpbmdzIgotCSAgICBxdWlkICAgICAgIAkiM0FDOTEyOEIwMUY5IgotCSAgICB0aXRsZSAgICAgIAkiQmluZGluZ3MiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAk1NgotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiIEAxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDMzNikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEKLQkJCWxvY2F0aW9uICAgCSgxNzE0LCAyNTUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjg0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTUlNRUNvbnRlbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxMzVCMDNBNyIKLQkJICAgIHdpZHRoICAgICAgCTMwMgotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE1MDQsIDc4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSgxMzU0LCA1NTUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgd2lkdGggICAgICAJMzE4Ci0JCSAgICBoZWlnaHQgICAgIAk0ODIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMwotCQkgICAgbG9jYXRpb24gICAJKDE3MjIsIDUwNSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0IzQzAzNTYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEA0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMjYsIC03MjcpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFNzNCM0QwMDkwIgotCQkJICAgIGNsaWVudCAgICAgCUAzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEKLQkJCSAgICBsaW5lX3N0eWxlIAkwKQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFydCIgQDUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMyNiwgLTcyNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Ci0JCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQkJbG9jYXRpb24gICAJKDE3NDAsIDUwOCkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk5NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcnQiCi0JCQkJcGN0RGlzdCAgICAJLTAuMDk3OTM0Ci0JCQkJaGVpZ2h0ICAgICAJMTYKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0IzRDAwOUEiCi0JCQkgICAgY2xpZW50ICAgICAJQDMKLQkJCSAgICBzdXBwbGllciAgIAlAMgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Ci0JCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQkJbG9jYXRpb24gICAJKDE3MzQsIDU2OSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjQ0OTEwMwotCQkJCWhlaWdodCAgICAgCTQ5Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU1pbWVYbWwiIEA4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyMTYsIDMyMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDgKLQkJCWxvY2F0aW9uICAgCSgxMDYxLCAyNjgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzEwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTUlNRU1pbWVYbWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiIKLQkJICAgIHdpZHRoICAgICAgCTMyOAotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDkKLQkJICAgIGxvY2F0aW9uICAgCSgxMzA0LCA0NjMpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFNzNCQjkwMEQ1IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJ0IiBAMTAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE4NCwgLTExODUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEKLQkJCQlQYXJlbnRfVmlldyAJQDEwCi0JCQkJbG9jYXRpb24gICAJKDEzMTEsIDQ3OSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk5NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcnQiCi0JCQkJcGN0RGlzdCAgICAJMC4xNzc5NDEKLQkJCQloZWlnaHQgICAgIAk0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFNzNCQjkwM0NFIgotCQkJICAgIGNsaWVudCAgICAgCUA5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIKLQkJCQlQYXJlbnRfVmlldyAJQDEwCi0JCQkJbG9jYXRpb24gICAJKDEyNzIsIDU1NCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY1MjI3MAotCQkJCWhlaWdodCAgICAgCTc2Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDEzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Ci0JCQkgICAgbG9jYXRpb24gICAJKC0xODQsIC0xMTg1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRTczQkI5MDNFMiIKLQkJCSAgICBjbGllbnQgICAgIAlAOQotCQkJICAgIHN1cHBsaWVyICAgCUA4Ci0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIiBAMTQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCAzMjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNAotCQkJbG9jYXRpb24gICAJKDMxMiwgMjY5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQzMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1JTUVNdWx0aXBhcnRSZWxhdGVkIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiCi0JCSAgICB3aWR0aCAgICAgIAk0NTAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCIgQDE1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDUyOCwgODQ4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCWxvY2F0aW9uICAgCSgzODAsIDc2NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNSU1FUGFydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCWxvY2F0aW9uICAgCSgzODAsIDgyNykKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTMwMykKLQkJICAgIHdpZHRoICAgICAgCTMxNAotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDE2Ci0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCA1NjgpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFRjEyRkUwMzg3IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Ci0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0xMzYpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFRjEzMDAwMEQ3IgotCQkJICAgIGNsaWVudCAgICAgCUAxNgotCQkJICAgIHN1cHBsaWVyICAgCUAxNAotCQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50cyIgQDE4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNgotCQkJICAgIGxvY2F0aW9uICAgCSgwLCAtMTM2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Ci0JCQkJUGFyZW50X1ZpZXcgCUAxOAotCQkJCWxvY2F0aW9uICAgCSg1MzUsIDYyNykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50cyIKLQkJCQlwY3REaXN0ICAgIAkwLjMyMDAwMAotCQkJCWhlaWdodCAgICAgCTcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTMwMDAwRTEiCi0JCQkgICAgY2xpZW50ICAgICAJQDE2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE1Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwCi0JCQkJUGFyZW50X1ZpZXcgCUAxOAotCQkJCWxvY2F0aW9uICAgCSg0NzEsIDcxNikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjc5NDExOAotCQkJCWhlaWdodCAgICAgCTU4Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEKLQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJbG9jYXRpb24gICAJKDYzNiwgNzM0KQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJMTA4Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRXh0ZW5zaWJpbGl0eSIKLQkgICAgcXVpZCAgICAgICAJIjNBRTczQUEzMDMyRSIKLQkgICAgdGl0bGUgICAgICAJIkV4dGVuc2liaWxpdHkiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDIyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQwMCwgMTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlpdGFsaWNzICAgIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjIKLQkJCWxvY2F0aW9uICAgCSgxMzgsIDQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUyNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCSAgICB3aWR0aCAgICAgIAk1NDIKLQkJICAgIGhlaWdodCAgICAgCTI5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDIzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNDQsIDE5MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIzCi0JCQlsb2NhdGlvbiAgIAkoMTExNSwgOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkgICAgd2lkdGggICAgICAJNDc2Ci0JCSAgICBoZWlnaHQgICAgIAkzOTIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAyNAotCQkgICAgbG9jYXRpb24gICAJKDg4OCwgMTgzKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiIiBAMjUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkgICAgbG9jYXRpb24gICAJKDUzNiwgMjMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYKLQkJCQlQYXJlbnRfVmlldyAJQDI1Ci0JCQkJbG9jYXRpb24gICAJKDcxNCwgMjIyKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJICAgIGNsaWVudCAgICAgCUAyNAotCQkJICAgIHN1cHBsaWVyICAgCUAyMgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNwotCQkJCVBhcmVudF9WaWV3IAlAMjUKLQkJCQlsb2NhdGlvbiAgIAkoNjk0LCAyMzMpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAyOAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTM2LCAyMykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOQotCQkJCVBhcmVudF9WaWV3IAlAMjgKLQkJCQlsb2NhdGlvbiAgIAkoOTk2LCAyMjUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDU3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlwY3REaXN0ICAgIAkwLjUwMTUzOAotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJICAgIGNsaWVudCAgICAgCUAyNAotCQkJICAgIHN1cHBsaWVyICAgCUAyMwotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMAotCQkJCVBhcmVudF9WaWV3IAlAMjgKLQkJCQlsb2NhdGlvbiAgIAkoMTA2OSwgMTMyKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODI5NjMwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIgQDMxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE1MDQsIDc4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMxCi0JCQlsb2NhdGlvbiAgIAkoMTM0OSwgNzMzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMxMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1JTUVNaW1lWG1sIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiCi0JCSAgICB3aWR0aCAgICAgIAkzMjgKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgQDMyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNDgsIDYwOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMyCi0JCQlsb2NhdGlvbiAgIAkoMTAzMiwgNTU3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQzMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1JTUVNdWx0aXBhcnRSZWxhdGVkIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiCi0JCSAgICB3aWR0aCAgICAgIAk0NTAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCIgQDMzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQwMCwgNzUyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCWxvY2F0aW9uICAgCSgyOTUsIDcwMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNSU1FUGFydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIgotCQkgICAgd2lkdGggICAgICAJMjI4Ci0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFRjExNDAwMjU5IgotCQkgICAgY2xpZW50ICAgICAJQDMzCi0JCSAgICBzdXBwbGllciAgIAlAMjIKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiIEAzNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzI4LCA5NzYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNQotCQkJbG9jYXRpb24gICAJKDE1ODcsIDkyNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyODIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNSU1FQ29udGVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3IgotCQkgICAgd2lkdGggICAgICAJMzAwCi0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNgotCQkgICAgbG9jYXRpb24gICAJKDEzNDQsIDU0OSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMjMKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEzNDQsIDU0OSkKLQkJCSgxMzQ0LCAzODgpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTFERDAzOEIiCi0JCSAgICBjbGllbnQgICAgIAlAMzEKLQkJICAgIHN1cHBsaWVyICAgCUAyMwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQxLCA3MjEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0MSwgNTQ5KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzYpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFRjExRDUwMzMwIgotCQkgICAgY2xpZW50ICAgICAJQDMyCi0JCSAgICBzdXBwbGllciAgIAlAMjMKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM0NywgNTQ1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNDcsIDU0OSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDM2KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRUYxMUNBMDM4RSIKLQkJICAgIGNsaWVudCAgICAgCUAzNQotCQkgICAgc3VwcGxpZXIgICAJQDIzCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3MjIsIDkxMikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzIyLCA1NDkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzNikpKSkpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL21pbWUuZWNvcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL21pbWUuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2JmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9tb2RlbC9taW1lLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibWltZSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9NSU1FIiBuc1ByZWZpeD0ibWltZSI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTUlNRUNvbnRlbnQiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSU1JTUVDb250ZW50Ij4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0UGFydCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlUGFydCIgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2RsLmVjb3JlIy8vUGFydCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNSU1FUGFydCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JTUlNRVBhcnQiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NkbC5lY29yZSMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIgZVR5cGU9IiMvL0xpc3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTUlNRU11bHRpcGFydFJlbGF0ZWQiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSU1JTUVNdWx0aXBhcnRSZWxhdGVkIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkTUlNRVBhcnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1pbWVQYXJ0IiBlVHlwZT0iIy8vSU1JTUVQYXJ0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TUlNRVBhcnRzIiBlVHlwZT0iIy8vTGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlTUlNRVBhcnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTUlNRVBhcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1JTUVNaW1lWG1sIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lNSU1FTWltZVhtbCI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFBhcnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQYXJ0IiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzZGwuZWNvcmUjLy9QYXJ0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNSU1FUGFydCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNSU1FQ29udGVudCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNSU1FTWltZVhtbCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikxpc3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvbWltZS5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL21pbWUubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzc2YTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvbWltZS5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjk5OCArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0MgotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJVFJVRQotCWdyaWRYICAgICAgCTE2Ci0JZ3JpZFkgICAgICAJMTYKLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250Ci0JICAgIHNpemUgICAgICAgCTEwCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkgICAgY29sb3IgICAgICAJMAotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCXNob3dNZXNzYWdlTnVtIAkxCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUKLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciCi0JcXVpZCAgICAgICAJIjNBQzkxMDUxMDMxRSIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBQzkxMDUyMDAxQiIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3IgotCXF1aWQgICAgICAgCSIzQUM5MTA1MTAzMUQiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3IgotCXF1aWR1ICAgICAgCSIzQUM5MTA1MTAzMUYiCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibWltZSIKLQkJcXVpZCAgICAgICAJIjNBQzkxMjdDMDI2NiIKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1JTUVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNBQzkxMzVCMDNBNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUVGMTFDQTAzOEUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiNDBBMTA2QTMwMTY4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA1RTAwMUNDIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNjZGMDAyMyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0IgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJInZvaWQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSI0MEExMDY3RDAyQ0MiCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkJCXF1aWQgICAgICAgCSIzQUM5MTk3MTAzNkIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTUlNRVBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0FDOTEzRUUwMEVCIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjQwQTBGREVGMDMyMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSI0MEExMDJDRDAxNzUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6SU1JTUVQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSI0MEExMDI1RDAxQTYiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNDY0MDFBMiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQotCQkJCXJlc3VsdCAgICAgCSJ2b2lkIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCXF1aWQgICAgICAgCSI0MEExMDQ4NDAyN0IiCi0JCQkJcmVzdWx0ICAgICAJIkxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1JTUVNdWx0aXBhcnRSZWxhdGVkIgotCQkJcXVpZCAgICAgICAJIjNBQzkxM0ZBMDI1QiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUVGMTFENTAzMzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiNDBBMTAzQUQwMzFDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FTXVsdGlwYXJ0UmVsYXRlZCIKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTAzM0IwMEREIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1JTUVQYXJ0IgotCQkJCXF1aWQgICAgICAgCSI0MEExMDNGNjAxNzIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWltZVBhcnQiCi0JCQkJCXR5cGUgICAgICAgCSJJTUlNRVBhcnQiKSkKLQkJCQlyZXN1bHQgICAgIAkidm9pZCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1JTUVQYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTA0MDMwMzhEIgotCQkJCXJlc3VsdCAgICAgCSJMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJNSU1FTWltZVhtbCIKLQkJCXF1aWQgICAgICAgCSIzQUM5MTQ1QTAxRkYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFRjExREQwMzhCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNzQ3MDM0RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRU1pbWVYbWwiCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwNkVGMDA4QiIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSI0MEExMDZENDAxRUIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydCIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJ2b2lkIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydCIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTA2RTEwMDk1IgotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNSU1FUGFydCIKLQkJCXF1aWQgICAgICAgCSI0MEExMDI1RDAxQTYiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTAyOUQwM0Q5IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNSU1FTXVsdGlwYXJ0UmVsYXRlZCIKLQkJCXF1aWQgICAgICAgCSI0MEExMDMzQjAwREQiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTAzNzgwMThGIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNSU1FQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSI0MEExMDVFMDAxQ0MiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTA1RjUwMjI2IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNSU1FTWltZVhtbCIKLQkJCXF1aWQgICAgICAgCSI0MEExMDZFRjAwOEIiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTA3MUUwM0I0IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkxpc3QiCi0JCQlxdWlkICAgICAgIAkiNDBBMTBCRkEwMTA5IgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTGlzdCIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTBDMDkwMkE2IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JCQlxdWlkICAgICAgIAkiM0FFNzNCM0MwMzU2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkJCXF1aWQgICAgICAgCSIzQUU3M0IzRDAwOTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxMzVCMDNBNyIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0FFNzNCM0QwMDlBIgotCQkJCWxhYmVsICAgICAgCSJlUGFydCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiIKLQkJCXF1aWQgICAgICAgCSIzQUU3M0JCOTAwRDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQUU3M0JCOTAzQ0UiCi0JCQkJbGFiZWwgICAgICAJImVQYXJ0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJCQlxdWlkICAgICAgIAkiM0FFNzNCQjkwM0UyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNaW1lWG1sIgotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCQkJcXVpZCAgICAgICAJIjNBRUYxMkZFMDM4NyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSIKLQkJCQlxdWlkICAgICAgIAkiM0FFRjEzMDAwMEQ3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIgotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZU1JTUVQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQUVGMTMwMDAwRTEiCi0JCQkJbGFiZWwgICAgICAJImVNSU1FUGFydCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIkJpbmRpbmdzIgotCQkJcXVpZCAgICAgICAJIjNBQzkxMjhCMDFGOSIKLQkJCXRpdGxlICAgICAgCSJCaW5kaW5ncyIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiIEAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCA4NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCA3MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjg0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgNzc3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTI3MikKLQkJCQl3aWR0aCAgICAgIAkzMDIKLQkJCQloZWlnaHQgICAgIAkyODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1MSwgMTE1MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQloZWlnaHQgICAgIAkxMjQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDMKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTA2NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUU3M0IzQzAzNTYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMwotCQkJCQlsb2NhdGlvbiAgIAkoLTQxNiwgLTE2OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUU3M0IzRDAwOTAiCi0JCQkJCWNsaWVudCAgICAgCUAzCi0JCQkJCXN1cHBsaWVyICAgCUAxCi0JCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJ0IiBANQotCQkJCQlQYXJlbnRfVmlldyAJQDMKLQkJCQkJbG9jYXRpb24gICAJKC00MTYsIC0xNjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTUsIDExMDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzOTMyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUU3M0IzRDAwOUEiCi0JCQkJCWNsaWVudCAgICAgCUAzCi0JCQkJCXN1cHBsaWVyICAgCUAyCi0JCQkJCWxpbmVfc3R5bGUgCTAKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4MSwgMTA5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ5MTAzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIgQDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDE1MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDc4LCAxMzk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FTWltZVhtbCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NzgsIDE0NTgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA2KQotCQkJCXdpZHRoICAgICAgCTMyNgotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAOQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMzIzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTczQkI5MDBENSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcnQiIEAxMAotCQkJCQlQYXJlbnRfVmlldyAJQDkKLQkJCQkJbG9jYXRpb24gICAJKDE0NCwgLTMyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA2LCAxMjkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODk1ODMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCQjkwM0NFIgotCQkJCQljbGllbnQgICAgIAlAOQotCQkJCQlzdXBwbGllciAgIAlAMgotCQkJCQlsaW5lX3N0eWxlIAkwCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcwOCwgMTI4NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjUyMjcwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDQsIC0zMjUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCQjkwM0UyIgotCQkJCQljbGllbnQgICAgIAlAOQotCQkJCQlzdXBwbGllciAgIAlAOAotCQkJCQlsaW5lX3N0eWxlIAkwKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgQDE0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1NjAsIDU5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNDEsIDQ4NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTUlNRU11bHRpcGFydFJlbGF0ZWQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQxLCA1NDYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0KQotCQkJCXdpZHRoICAgICAgCTQ1NgotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRVBhcnQiIEAxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTYwLCAxMDQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI5NiwgOTM0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQzkxM0VFMDBFQiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTYsIDk5NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk1MjUpCi0JCQkJd2lkdGggICAgICAJNTQ2Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAxNgotCQkJCWxvY2F0aW9uICAgCSg1NjAsIDgxNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVGMTJGRTAzODciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAxNwotCQkJCQlQYXJlbnRfVmlldyAJQDE2Ci0JCQkJCWxvY2F0aW9uICAgCSgzMiwgMTExKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUYxMzAwMDBENyIKLQkJCQkJY2xpZW50ICAgICAJQDE2Ci0JCQkJCXN1cHBsaWVyICAgCUAxNAotCQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTUlNRVBhcnQiIEAxOAotCQkJCQlQYXJlbnRfVmlldyAJQDE2Ci0JCQkJCWxvY2F0aW9uICAgCSgzMiwgMTExKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc0NCwgODkwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNSU1FUGFydCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUYxMzAwMDBFMSIKLQkJCQkJY2xpZW50ICAgICAJQDE2Ci0JCQkJCXN1cHBsaWVyICAgCUAxNQotCQkJCQlsaW5lX3N0eWxlIAkwCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAzLCA4OTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NDExOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDM2NCwgODkwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU5Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRVBhcnQiIEAyMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1LCAxNDIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU1JTUVQYXJ0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDUsIDEzNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTAzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTAyNUQwMUE2IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNSwgMTQ4MikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDI4KQotCQkJCXdpZHRoICAgICAgCTEwNDgKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjQwQTEwMkNEMDE3NSIKLQkJCQljbGllbnQgICAgIAlAMTUKLQkJCQlzdXBwbGllciAgIAlAMjIKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6SU1JTUVNdWx0aXBhcnRSZWxhdGVkIiBAMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzY4LCAxNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCAxNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTI1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTUlNRU11bHRpcGFydFJlbGF0ZWQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MywgOTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTI1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTAzM0IwMEREIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MywgMjAyKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEyNDcpCi0JCQkJd2lkdGggICAgICAJMTI2OAotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTAzQUQwMzFDIgotCQkJCWNsaWVudCAgICAgCUAxNAotCQkJCXN1cHBsaWVyICAgCUAyNAotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRUNvbnRlbnQiIEAyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCA0MzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4NCwgMzk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU1JTUVDb250ZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg0LCAzNDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA1RTAwMUNDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwODQsIDQ1OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDk0KQotCQkJCXdpZHRoICAgICAgCTExMTQKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjQwQTEwNkEzMDE2OCIKLQkJCQljbGllbnQgICAgIAlAMQotCQkJCXN1cHBsaWVyICAgCUAyNgotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRU1pbWVYbWwiIEAyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjE2LCAxOTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTUsIDE4NzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTEyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTUlNRU1pbWVYbWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTUsIDE4MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTEyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA2RUYwMDhCIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTUsIDE5MzApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTExOSkKLQkJCQl3aWR0aCAgICAgIAkxMTQwCi0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDc0NzAzNEUiCi0JCQkJY2xpZW50ICAgICAJQDgKLQkJCQlzdXBwbGllciAgIAlAMjgKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TGlzdCIgQDMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDE3NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAxNzAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJMaXN0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDE2NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjQwQTEwQkZBMDEwOSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDE3NjEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQxKQotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiRXh0ZW5zaWJpbGl0eSIKLQkJCXF1aWQgICAgICAgCSIzQUU3M0FBMzAzMkUiCi0JCQl0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDE5MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDcsIDg3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDcsIDE5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2KQotCQkJCXdpZHRoICAgICAgCTQ3NgotCQkJCWhlaWdodCAgICAgCTIzNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU1pbWVYbWwiIEAzMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgNzUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzQsIDY0NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTUlNRU1pbWVYbWwiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NCwgNzA2KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNikKLQkJCQl3aWR0aCAgICAgIAkzMjYKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIiBAMzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgMTEzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzMsIDEwMzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVNdWx0aXBhcnRSZWxhdGVkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzRkEwMjVCIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMywgMTA5MCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQpCi0JCQkJd2lkdGggICAgICAJNDU2Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCIgQDM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNzY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCA2NjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCA3MjIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI1KQotCQkJCXdpZHRoICAgICAgCTU0NgotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiIEAzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCA3NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1MCwgNjQ2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQzkxMzVCMDNBNyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjUwLCA3MDYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA2KQotCQkJCXdpZHRoICAgICAgCTMwMgotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNgotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDUyNikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDk3NiwgNTI2KQotCQkJCSAgICAoOTc2LCAzMDkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUYxMUREMDM4QiIKLQkJCQljbGllbnQgICAgIAlAMzIKLQkJCQlzdXBwbGllciAgIAlAMzEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCA2MzQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDUyNikKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUYxMUQ1MDMzMCIKLQkJCQljbGllbnQgICAgIAlAMzMKLQkJCQlzdXBwbGllciAgIAlAMzEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDQsIDEwMTgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0NCwgNTI2KQotCQkJCWRyYXdTdXBwbGllciAJQDM2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFRjExQ0EwMzhFIgotCQkJCWNsaWVudCAgICAgCUAzNQotCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzgsIDYzNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3OCwgNTI2KQotCQkJCWRyYXdTdXBwbGllciAJQDM2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMEZERUYwMzIyIgotCQkJCWNsaWVudCAgICAgCUAzNAotCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1NiwgNjUwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDUyNikKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNikpKSkpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzZGwiCi0JCXF1aWQgICAgICAgCSIzQURGQjhFNTAyMUUiCi0JCWRvY3VtZW50YXRpb24gCQotfFRoZSBXU0RMIG1vZGVsIGNvbnRhaW5zIGNsYXNzZXMgZm9yIHRoZSBXZWIgU2VydmljZXMgRGVzY3JpcHRpb24gTGFuZ3VhZ2UgKFdTREwpLgotfAotfFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4KLXwKLXxXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLgotfAotfFRoZSBtb2RlbCBjb250YWlucyB0aGUgZm9sbG93aW5nIGRpYWdyYW1zLCBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBjaGFwdGVycyBpbiB0aGUgV1NETCAxLjEgc3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9OT1RFLXdzZGwtMjAwMTAzMTUpCi18LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUKLXwtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQotfC0gMi4xLjMgRXh0ZW5zaWJpbGl0eSwgc2hvd3MgdGhlIFdTREwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc20KLXwtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwKLXwtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4KLXwKLXxUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4KLQkJCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1QzZBMzAyREQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LiIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyOTYwMEM4IgotCQkJCXJlc3VsdCAgICAgCSJEZWZpbml0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyQjgwMzQ3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRlZmluaXRpb24iCi0JCQkJCXR5cGUgICAgICAgCSJEZWZpbml0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnRhdGlvbkVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDQ0U0NDM2MDJBMyIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0Y5N0RCRDMwMjA3IgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJQb3J0VHlwZSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUM5QjcwMTUwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkQ4MDE5RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OEUwMDIzIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjFFMzAxRTUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0RFQjAzMTYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRGRDAxQkEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUU5REU5ODAwM0MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRTIwMTcxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ3MjYwMUFDIgotCQkJCXR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQkREOTY0MzAwNEMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjIzNTAwM0UiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0UyMjAxQUQiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDUyMDAxMUIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTWVzc2FnZSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUQwNTUwMUM0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg3QzAxRkUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUQyMDIyNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTRCMDJCMCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTQyMDBGMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJQYXJ0IgotCQkJcXVpZCAgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTZEMDJGMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg5N0UyMzAyMzciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBCNzAzQzgiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMDg3MDNEQiIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGVOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBDMzAzQzUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGJpbmRpbmcgZWxlbWVudC4gQSBiaW5kaW5nIGRlZmluZXMgbWVzc2FnZSBmb3JtYXQgYW5kIHByb3RvY29sIGRldGFpbHMgZm9yIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGRlZmluZWQgYnkgYSBwYXJ0aWN1bGFyIHBvcnRUeXBlLiBUaGVyZSBtYXkgYmUgYW55IG51bWJlciBvZiBiaW5kaW5ncyBmb3IgYSBnaXZlbiBwb3J0VHlwZS4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUZBMEYwMkYwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQxMDEyOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg5OTAxNEIiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUY0MDFBMyIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTZEMDE1MSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENERGMDM1QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcuIEFuIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgYmluZGluZydzIHBvcnRUeXBlLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjAwOTIwMkY3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBREU0MDFEQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODlDNENCMDE5OSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJTZXJ2aWNlIgotCQkJcXVpZCAgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NEUwMUI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0OEE0MDE1MSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0ODEwMjIwIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0QzUwMUUyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydCBlbGVtZW50LiBBIHBvcnQgZGVmaW5lcyBhbiBpbmRpdmlkdWFsIGVuZHBvaW50IGJ5IHNwZWNpZnlpbmcgYSBzaW5nbGUgYWRkcmVzcyBmb3IgYSBiaW5kaW5nIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDYwMENCMDBBQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0NTAyQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlBMDAzOTEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBXU0RMIGFsbG93cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JEREY1MzUwMkMzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCQkJcXVpZCAgICAgICAJIjNBRjk1NDNDMDA3MyIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgV1NETCBkb2N1bWVudC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNEZDMjAxMkIiCi0JCQkJcmVzdWx0ICAgICAJIkRPTURvY3VtZW50IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1MERFMDFFNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudCIKLQkJCQkJdHlwZSAgICAgICAJIkRPTURvY3VtZW50IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ3NDAwNEUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjQwMzUyQjdDMDM5NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4NTcwMkY1IgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDBEMDAwRCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFRTU4MDM3QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwRDAzNDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzc5IgotCQkJCXJlc3VsdCAgICAgCSJYU0RTY2hlbWEiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM5NyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzY2hlbWEiCi0JCQkJCXR5cGUgICAgICAgCSJYU0RTY2hlbWEiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTBBMDAzNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MTQwMjExIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2libGVFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCWRvY3VtZW50YXRpb24gCSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkUzQzAzRDQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMTJDMDNDRCIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxNDcwMjk1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dEVsZW1lbnQiCi0JCQkJCXR5cGUgICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MDQwMjVGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTBDMDM1QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzNTAwREQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZGODAxQ0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTFDODIwMDJGMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzRDAzMTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwMjAwMkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUxQjAxMTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QjU5QjAwNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQTQwMjAzIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQjUwM0EyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxRUEwMjBFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNUE0MDI3RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRDkwMEYxIgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNGMTAzMjYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMjAyMDBCRSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5Mzg2MDJDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU3MTAzMzMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTQxMzAzN0YiCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTQyMTAxMDkiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QkY5RTAxNEEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUU5hbWUiCi0JCQlxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NDlEQTkwMDNEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk5hbWVzcGFjZSIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0NEMzAwMzAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QyOTAxQjEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZml4IgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QzMjAyMzYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uVHlwZSIKLQkJCXF1aWQgICAgICAgCSIzQUVCNDc4MjAyNEYiCi0JCQlkb2N1bWVudGF0aW9uIAkKLXxPTkVfV0FZPTEKLXxSRVFVRVNUX1JFU1BPTlNFPTIKLXxTT0xJQ0lUX1JFU1BPTlNFPTMKLXxOT1RJRklDQVRJT049NAotCQkJCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMzNTMwM0UzIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnRUeXBlIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZBQzEwMUNBIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCQUYwMUE0IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkY3MDMxQSIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE2MzIwMDBEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRBNzc2MDBEMSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM0MjAwNjUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM1OTAyOEYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzcxMDJCMSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM4MTAxQjAiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk2Qzk5MDMxRCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJPcmRlciIKLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0RTUwMThEIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyQzQwMTA3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCIKLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRjAwMUQyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3RUUwMDE1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbnB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjMzMTAwRUYiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYzNDcwMjc3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODAwMDAzOSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU91dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTgyOTAyN0QiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQzQTAzNUQiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NDUwMUM4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgzOTAxRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTg2MTAzMUQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ3NTAxMzEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5GYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJTWVzc2FnZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QThBRjAwNEYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk1lc3NhZ2Ugbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIyNDAyNzMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydCIKLQkJCQkJdHlwZSAgICAgICAJIklQYXJ0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIzRDAyMzMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJUGFydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI1NDAyNUUiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcmRlcmVkUGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjYxMDIwRCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0T3JkZXIiCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOEJDMDI2MCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE5M0YwMUJFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODg0NTAwNTIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInZhbHVlIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlleGNlcHRpb25zIAkiV1NETEV4Y2VwdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEwMTAxQzMiCi0JCQkJcmVzdWx0ICAgICAJIklJdGVyYXRvciIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJRTmFtZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTUwMDIzMSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCNDkwMjg3IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5TZXJ2aWNlIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RDU2MDFEMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0IgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NURBMjAwMzYiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NURCMDAxQkMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCODAwMzI2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MUYzMDJCNSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTI2MzAyRjIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUI4QzAwMTYiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUYxNjAxNTMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ09wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUZBNDAxQzUiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkE5MDI4NCIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkJFMDFBOCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSIKLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCQ0YwMzAyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjg0QURDMDAwNzIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBCQzAwNDEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0ZhdWx0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBEOTAwOUQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwRkMwMDYxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTMyRDAwMTciCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzNGMDM3QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iCi0JCQkJCXR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTA5MDBEQSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MUQwMDdGIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdJbnB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTU0NzAyQTYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ091dHB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3V0cHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFERUIwMTAwIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBREZFMDAwRCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFMjEwMTExIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMkQwMDUwIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0ZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNCODRBRTRGMDBCRCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFGMzIwM0RCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRjU2MDI5MiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNCODRCMTI0MDJBQiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjEzNTAzRDEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRGVmaW5pdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRJbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTQ5MDI1OSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbXBvcnREZWYiCi0JCQkJCXR5cGUgICAgICAgCSJJSW1wb3J0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk2RTAwNUUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5QzUwMDQ1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlFNDAxRUUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAic2VydmljZSIKLQkJCQkJdHlwZSAgICAgICAJIklTZXJ2aWNlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTE3MDM4QyIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMzIwMjg2IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNDYwMTNCIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTVDMDBCMCIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlGRTAzN0MiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTc1MDJFNyIKLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW1wb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE4MzAxNEMiCi0JCQkJcmVzdWx0ICAgICAJIklJbXBvcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBOUQwMzNFIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFBRjAyNTQiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFDMjAzQzQiCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUU4MDBFRCIKLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUY4MDI2RCIKLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIwODAxREEiCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjE1MDM5QiIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMzIwMTNBIgotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjQyMDA3NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5ncyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCOTIwMzQxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCQ0QwMDYwIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCRTcwMTQ0IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzE3MDEwNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDM0UwMDFEIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEM2MjAxNEIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4IgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Qzc0MDExNSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENCRTAwNzEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDREEwMUM2IgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHJlZml4IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENGRDAwMTciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4RDIzMDBBOCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThEM0IwM0NFIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUI4MDEyQiIKLQkJCQlyZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUQ3MDNCQiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpb25SZWdpc3RyeSIKLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVGRTAyMDgiCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50QmFzZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ2MTgwMzI4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50QmFzZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlVHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCIKLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwN0UwMDRDIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRDgwMjlBIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBGQTAzMDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiIKLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDk1MDBFRSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJ0eXBlcyIKLQkJCQkJdHlwZSAgICAgICAJIklUeXBlcyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSW1wb3J0IgotCQkJcXVpZCAgICAgICAJIjNCODRCMjAyMDExOSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW1wb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW1wb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjIwQzAyRUEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklMaXN0IgotCQkJcXVpZCAgICAgICAJIjNCODVDMEEyMDNDNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzBBRjAyOTciCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNYXAiCi0JCQlxdWlkICAgICAgIAkiM0I4OTZCMDMwMEQ0IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTWFwIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklVUkwiCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1NjMwMjc0IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLm5ldC5VUkwgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubmV0LlVSTCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1NkUwM0UyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1OTMwMkE1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1OUYwMkU4IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0QzQjAzODAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIgotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENGMzgwM0U2IgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRjdFMDMwMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSXRlcmF0b3IiCi0JCQlxdWlkICAgICAgIAkiM0M0Njg3REEwMTY3IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciIKLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4MDgwMEI5IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRXhjZXB0aW9uIgotCQkJcXVpZCAgICAgICAJIjNDNDY4OTY1MDMxMyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXhjZXB0aW9uIGNsYXNzLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODk3NDAzMTUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5UeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENCRjEwMTczIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQjI0QUVDMDFDQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NDMzYwRDcwMzlDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MjdGMDBCNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NEMTUwMkMwMjNCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRG9jdW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwNjAwMTgyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlUmVmZXJlbmNlIgotCQkJcXVpZCAgICAgICAJIjNGNjc3MURCMDJEQyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzRjY3ODBBMDAxQUIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHJvdGVjdGVkIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2IgotCQkJcXVpZCAgICAgICAJIjNBRDVDODI0MDE4QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDMyIKLQkJCQlsYWJlbCAgICAgIAkicG9ydFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUNEIgotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3IgotCQkJcXVpZCAgICAgICAJIjNBRDVDRUJFMDBFMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNjEiCi0JCQkJbGFiZWwgICAgICAJImVQYXJ0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1MjAxMEYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTc2IgotCQkJCWxhYmVsICAgICAgCSJlUG9ydFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE4MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ09wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIzOSIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNTAzOEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGNSIKLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFDIgotCQkJCWxhYmVsICAgICAgCSJlUG9ydHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCODAxMUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCOTAyNEQiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI2MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwMzAxRTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBDMSIKLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MTAxMDQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNTQiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ3MiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3QiIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3QjAzMTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwN0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2VydmljZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA4OSIKLQkJCQlsYWJlbCAgICAgIAkiZVNlcnZpY2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJCQlsYWJlbCAgICAgIAkiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkiCi0JCQlxdWlkICAgICAgIAkiM0FERjJFNjQwMUY1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkU2NTAyNTEiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEiCi0JCQlxdWlkICAgICAgIAkiM0FERjJFQjMwMTYzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ091dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRUI0MDEzRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzMiCi0JCQlxdWlkICAgICAgIAkiM0FERjJGOTQwMjREIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5MCIKLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSIKLQkJCXF1aWQgICAgICAgCSIzQURGMkZCODAyRjkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQSIKLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNiIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM3IgotCQkJcXVpZCAgICAgICAJIjNBREYzMzE2MDFBNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3IgotCQkJCWxhYmVsICAgICAgCSJlRmF1bHRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM4IgotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzkiCi0JCQlxdWlkICAgICAgIAkiM0FERjM0MDAwM0U1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0ZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0ZhdWx0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDAiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDEiCi0JCQlxdWlkICAgICAgIAkiM0FFMDkxRjQwMkYzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIgotCQkJCXF1aWQgICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MyIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NTAwMkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ0IgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMjgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTmFtZXNwYWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNENTYwMzMyIgotCQkJCWxhYmVsICAgICAgCSJlTmFtZXNwYWNlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NSIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQTAwMkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQzAxRTgiCi0JCQkJbGFiZWwgICAgICAJImVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDYiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFGMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ3IgotCQkJcXVpZCAgICAgICAJIjNBRUE0MTJGMDAzNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNTUiCi0JCQkJbGFiZWwgICAgICAJImVQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0OCIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjVGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDkiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEMjQwMEJEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4MyIKLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUwIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3OTAwRjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTIiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MyIKLQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAwQzQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAzMjciCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTQiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSIKLQkJCXF1aWQgICAgICAgCSIzQjhCMUMxMjAzQjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDFDIgotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTYiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAyNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyIKLQkJCXF1aWQgICAgICAgCSIzQjhCMURDQzAyRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVTY2hlbWEiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCIKLQkJCQlsYWJlbCAgICAgIAkiZVNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjdBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTkiCi0JCQlxdWlkICAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkJbGFiZWwgICAgICAJImVUeXBlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjEiCi0JCQlxdWlkICAgICAgIAkiM0M0NjgyOTMwM0U1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTBFIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjMiCi0JCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCWxhYmVsICAgICAgCSJlSW1wb3J0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjUiCi0JCQlxdWlkICAgICAgIAkiM0NDMzYxNDUwMEYyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NiIKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNFIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY3IgotCQkJcXVpZCAgICAgICAJIjNGNzRFNzg0MDFCMSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNGNzRFNzg2MDAwRiIKLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2OCIKLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDIzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY5IgotCQkJcXVpZCAgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicGFyZW50IgotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiCi0JCQkJbGFiZWwgICAgICAJInBhcmVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY2hpbGRyZW4iCi0JCQkJcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQyIKLQkJCQlsYWJlbCAgICAgIAkiY2hpbGRyZW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi43IFNlcnZpY2VzIgotCQkJcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyIKLQkJCXRpdGxlICAgICAgCSIyLjcgU2VydmljZXMiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEA0MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDgwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2MTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MywgNzE1KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ3MSkKLQkJCQl3aWR0aCAgICAgIAk1MjAKLQkJCQloZWlnaHQgICAgIAk0MDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IiBANDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDUyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQ4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNDMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNTM2KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NSkKLQkJCQl3aWR0aCAgICAgIAkyNzgKLQkJCQloZWlnaHQgICAgIAkyMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIiBANDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCAxNDUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3KQotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTI2NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDUyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NCwgMzg5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCA0NDQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTMwMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NEUwMUI0IgotCQkJCWNsaWVudCAgICAgCUA0NAotCQkJCXN1cHBsaWVyICAgCUA0MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MCwgMzc3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDAsIDI5MikpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyNjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQ0LCAxMTgwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk0MTAKLQkJCQloZWlnaHQgICAgIAkzMDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSIKLQkJCQljbGllbnQgICAgIAlANDYKLQkJCQlzdXBwbGllciAgIAlANDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMwLCAxMDAyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEA0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODE2LCA5MTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4NDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjgyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4OTUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTMwMAotCQkJCWhlaWdodCAgICAgCTE2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDUwMkM5IgotCQkJCWNsaWVudCAgICAgCUA0OAotCQkJCXN1cHBsaWVyICAgCUA0MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBANTAKLQkJCQlsb2NhdGlvbiAgIAkoMzQzLCA5MTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5NDAwMzkzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydHMiIEA1MQotCQkJCQlQYXJlbnRfVmlldyAJQDUwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEzLCA5NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTg5NzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUMiCi0JCQkJCWNsaWVudCAgICAgCUA1MAotCQkJCQlzdXBwbGllciAgIAlANDgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA5MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM5LCA4ODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDgwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDk5MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4NDY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDU1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTAKLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTYsIDc0NCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUQiCi0JCQkJCWNsaWVudCAgICAgCUA1MAotCQkJCQlzdXBwbGllciAgIAlANDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzQzLCA5MTYpCi0JCQkJCSAgICAoMjU3LCA5MTYpCi0JCQkJCSAgICAoMjU3LCA2NzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3IiBANTgKLQkJCQlsb2NhdGlvbiAgIAkoODg2LCAxMjcwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEA1OQotCQkJCQlQYXJlbnRfVmlldyAJQDU4Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0ODU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQkJY2xpZW50ICAgICAJQDU4Ci0JCQkJCXN1cHBsaWVyICAgCUA0NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNSwgMTI3MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcwLCAxMzEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQyODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBANjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1OAotCQkJCQlsb2NhdGlvbiAgIAkoMzgsIDQyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTIsIDExMDYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4Nzk0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI2MSIKLQkJCQkJY2xpZW50ICAgICAJQDU4Ci0JCQkJCXN1cHBsaWVyICAgCUA0OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4ODYsIDEyNzApCi0JCQkJCSAgICAoODEyLCAxMjcwKQotCQkJCQkgICAgKDgxMiwgOTk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMiwgOTk2KSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi41IEJpbmRpbmdzIgotCQkJcXVpZCAgICAgICAJIjM5QUQ1MTI3MDI1MiIKLQkJCXRpdGxlICAgICAgCSIyLjUgQmluZGluZ3MiCi0JCQl6b29tICAgICAgIAk4NQotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEA2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTE0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDY0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNzIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcxKQotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTM3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPcGVyYXRpb24iIEA2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDM1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDEzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgODApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxODgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTkKLQkJCQkgICAgbWF4X3dpZHRoICAJMzk2KQotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTU2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMzM0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTI4NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCIKLQkJCQl3aWR0aCAgICAgIAkyNzgKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBANjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE2MzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3V0cHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTU4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIKLQkJCQl3aWR0aCAgICAgIAkzMTIKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiIEA2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5NTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTA4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTE3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEA2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjgsIDQ4NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgNTQ0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk2OTEKLQkJCQloZWlnaHQgICAgIAkzMDEKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBANzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEA3MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNTg3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA1MzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTcsIDU5NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpCi0JCQkJd2lkdGggICAgICAJNDMyCi0JCQkJaGVpZ2h0ICAgICAJMzIyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCQkJY2xpZW50ICAgICAJQDcyCi0JCQkJc3VwcGxpZXIgICAJQDY0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1MjcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3OSwgNDI4KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDc0Ci0JCQkJbG9jYXRpb24gICAJKDEwMzksIDc0MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1MjAxMEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZSIgQDc1Ci0JCQkJCVBhcmVudF9WaWV3IAlANzQKLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDksIDc4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTI5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE3NiIKLQkJCQkJY2xpZW50ICAgICAJQDc0Ci0JCQkJCXN1cHBsaWVyICAgCUA2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1OSwgNzQyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTIsIDcxNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDc4Ci0JCQkJCVBhcmVudF9WaWV3IAlANzQKLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NiwgNjk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDk0NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiCi0JCQkJCWNsaWVudCAgICAgCUA3NAotCQkJCQlzdXBwbGllciAgIAlANzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgNzQyKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBAODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDEwMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MiwgODUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MiwgOTA5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk2Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ0NikKLQkJCQl3aWR0aCAgICAgIAk0NTAKLQkJCQloZWlnaHQgICAgIAkzNzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDgxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDE0MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDc2LCAxMjgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDc2LCAxMzQxKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTMwMykKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDkiIEA4MgotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCAxMzU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRDI0MDBCRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAODMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MgotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAxMzE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc1MTQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkJCQljbGllbnQgICAgIAlAODIKLQkJCQkJc3VwcGxpZXIgICAJQDcwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTM1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk0LCAxMzk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODk1NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUwIiBAODYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MgotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODQiCi0JCQkJCWNsaWVudCAgICAgCUA4MgotCQkJCQlzdXBwbGllciAgIAlAODEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODEsIDEzNTkpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBAODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgMTY2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTIsIDE1MzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODEyLCAxNTk3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTMwMykKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTEiIEA4OAotCQkJCWxvY2F0aW9uICAgCSgxNDMyLCAxNjU0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRDc5MDBGMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDg5Ci0JCQkJCVBhcmVudF9WaWV3IAlAODgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NDc3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJCQkJY2xpZW50ICAgICAJQDg4Ci0JCQkJCXN1cHBsaWVyICAgCUA3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDE2NTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4MSwgMTY5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkwMjc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MiIgQDkyCi0JCQkJCVBhcmVudF9WaWV3IAlAODgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEUiCi0JCQkJCWNsaWVudCAgICAgCUA4OAotCQkJCQlzdXBwbGllciAgIAlAODcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxNjU0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDEwMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5ODkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTM2NAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERTQwMURDIgotCQkJCWNsaWVudCAgICAgCUA5MwotCQkJCXN1cHBsaWVyICAgCUA2NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2NiwgOTE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjYsIDYzNikpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBAOTUKLQkJCQlsb2NhdGlvbiAgIAkoNDU3LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0UxMDE3OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEA5NgotCQkJCQlQYXJlbnRfVmlldyAJQDk1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNSwgOTIwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCQkJY2xpZW50ICAgICAJQDk1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0NTcsIDEwMjIpCi0JCQkJCSAgICAoMjc2LCAxMDIyKQotCQkJCQkgICAgKDI3NiwgODQ5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NiwgODQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMCwgODg0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgOTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjExNjk5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkJCQljbGllbnQgICAgIAlAOTUKLQkJCQkJc3VwcGxpZXIgICAJQDkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2OSwgOTgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODQ5NTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCAxMDY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjc1NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMiIEAxMDMKLQkJCQlsb2NhdGlvbiAgIAkoMTQxOCwgMTA0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNTAzOEEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb24iIEAxMDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMKLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEwNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNjAxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkJCQljbGllbnQgICAgIAlAMTAzCi0JCQkJCXN1cHBsaWVyICAgCUA4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjMsIDEwNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTY3MjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjczLCAxMDcwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTU0MjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRkYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDMKLQkJCQkJc3VwcGxpZXIgICAJQDkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxMDkKLQkJCQlsb2NhdGlvbiAgIAkoNzg3LCAxMTkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRTY0MDFGNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdJbnB1dCIgQDExMAotCQkJCQlQYXJlbnRfVmlldyAJQDEwOQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY5LCAxMTUyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nSW5wdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxMTkwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MSIKLQkJCQkJY2xpZW50ICAgICAJQDEwOQotCQkJCQlzdXBwbGllciAgIAlAODEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzg3LCAxMTkwKQotCQkJCQkgICAgKDYzNiwgMTE5MCkKLQkJCQkJICAgICg2MzYsIDEyNzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg1LCAxMjIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDA0NzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwIiBAMTEzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODUsIDExNDQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkJCQljbGllbnQgICAgIAlAMTA5Ci0JCQkJCXN1cHBsaWVyICAgCUA5MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODcsIDExOTApCi0JCQkJCSAgICAoOTI2LCAxMTkwKQotCQkJCQkgICAgKDkyNiwgMTA5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzNzc1OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMSIgQDExNgotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMzEyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRUIzMDE2MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPdXRwdXQiIEAxMTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTIsIDE0MjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPdXRwdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0NTA4MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzQyIKLQkJCQkJY2xpZW50ICAgICAJQDExNgotCQkJCQlzdXBwbGllciAgIAlAODcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxNDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzQ1OTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCQljbGllbnQgICAgIAlAMTE2Ci0JCQkJCXN1cHBsaWVyICAgCUA5MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDEwOTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MjAsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzIsIDE5MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMTI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjEyLCAxODU5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDE5MTcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQljbGllbnQgICAgIAlAMTI0Ci0JCQkJc3VwcGxpZXIgICAJQDY4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwMywgMjAwNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzUzLCAyMDA3KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAxMjYKLQkJCQlsb2NhdGlvbiAgIAkoMTM1NiwgMTM1MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMDAzRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nRmF1bHRzIiBAMTI3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI2Ci0JCQkJCWxvY2F0aW9uICAgCSgxODgsIDYxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODIsIDE3NTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQSIKLQkJCQkJY2xpZW50ICAgICAJQDEyNgotCQkJCQlzdXBwbGllciAgIAlAMTI0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgMTg0NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDksIDE3OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTE5NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE5MjkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDAiIEAxMzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjYKLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjYKLQkJCQkJc3VwcGxpZXIgICAJQDkzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTYsIDEzNTIpCi0JCQkJCSAgICAoMTM1NiwgMTIxNykKLQkJCQkJICAgICgxMTE3LCAxMjE3KQotCQkJCQkgICAgKDExMTcsIDEwOTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDEwOTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTUyLCAxMTY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcwMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDEiIEAxMzQKLQkJCQlsb2NhdGlvbiAgIAkoMTY0MCwgMTk3MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGNDAyRjMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdCIgQDEzNQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNAotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjQyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNAotCQkJCQlzdXBwbGllciAgIAlAMTIzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MywgMTk3MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MTgsIDIwMTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MjI3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDIiIEAxMzgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQKLQkJCQkJbG9jYXRpb24gICAJKC0zNDQsIDgxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQKLQkJCQkJc3VwcGxpZXIgICAJQDEyNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTcsIDE5NzApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTM5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkJCWNsaWVudCAgICAgCUA4NwotCQkJCXN1cHBsaWVyICAgCUA2NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUxQjAxMTMiCi0JCQkJY2xpZW50ICAgICAJQDgxCi0JCQkJc3VwcGxpZXIgICAJQDY2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi40IFBvcnRUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiCi0JCQl0aXRsZSAgICAgIAkiMi40IFBvcnRUeXBlcyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iCi0JCQl6b29tICAgICAgIAk4MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTQxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDE3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMjMzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY5NikKLQkJCQl3aWR0aCAgICAgIAk3MTgKLQkJCQloZWlnaHQgICAgIAkxOTYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIgQDE0MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDE3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU9wZXJhdGlvbiIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDEyNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMjM3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcwOSkKLQkJCQl3aWR0aCAgICAgIAk4OTEKLQkJCQloZWlnaHQgICAgIAkxODgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIgQDE0MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW5wdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTM4NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDE0OTgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjIxKQotCQkJCXdpZHRoICAgICAgCTY0NAotCQkJCWhlaWdodCAgICAgCTE5NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCIgQDE0NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDE3OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJT3V0cHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxODE4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NikKLQkJCQl3aWR0aCAgICAgIAk2NzQKLQkJCQloZWlnaHQgICAgIAkxOTQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDE0NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjAyNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIxMzcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI1KQotCQkJCXdpZHRoICAgICAgCTY0NAotCQkJCWhlaWdodCAgICAgCTE5NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxNDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OCwgNjcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4LCA3MzMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTY5NQotCQkJCWhlaWdodCAgICAgCTI4MQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMTQ3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NzYsIDgwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMyNSwgNjkyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA3NTMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0KQotCQkJCXdpZHRoICAgICAgCTUyMAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxNDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTcyOCwgMjExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NywgMjA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDE0OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAxNDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzAsIDE0MjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEAxNTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTc5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMTc0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBAMTUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDc4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxNCwgNjIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTQsIDY4MSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDYpCi0JCQkJd2lkdGggICAgICAJNjk1Ci0JCQkJaGVpZ2h0ICAgICAJMzUyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDE1MgotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCA3OTcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjQwMThDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9ucyIgQDE1MwotCQkJCQlQYXJlbnRfVmlldyAJQDE1MgotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA3NDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM1OTY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDRCIKLQkJCQkJY2xpZW50ICAgICAJQDE1MgotCQkJCQlzdXBwbGllciAgIAlAMTUxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjA1LCA3OTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTc2LCA4NjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDM5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgOTIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzYyNDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwb3J0VHlwZSIgQDE1NwotCQkJCQlQYXJlbnRfVmlldyAJQDE1MgotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUMzIgotCQkJCQljbGllbnQgICAgIAlAMTUyCi0JCQkJCXN1cHBsaWVyICAgCUAxNDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNzk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODg4LCA3NTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MzQ4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NyIgQDE1OQotCQkJCWxvY2F0aW9uICAgCSgyMTA3LCA3NzMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMkYwMDM1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFyYW1ldGVyT3JkZXJpbmciIEAxNjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTkKLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDUsIDY0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MzMzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNTUiCi0JCQkJCWNsaWVudCAgICAgCUAxNTkKLQkJCQkJc3VwcGxpZXIgICAJQDE0NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxNiwgNzczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3MiwgODIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTY2MTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNzEsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzA2MjIwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDgiIEAxNjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTkKLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNUYiCi0JCQkJCWNsaWVudCAgICAgCUAxNTkKLQkJCQkJc3VwcGxpZXIgICAJQDE1MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5OSwgNzczKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNyIgQDE2NQotCQkJCWxvY2F0aW9uICAgCSgxNzAyLCAxNTA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYzMzE2MDFBNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0cyIgQDE2NgotCQkJCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNSwgMTk4MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzg5OTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg3IgotCQkJCQljbGllbnQgICAgIAlAMTY1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCAyMDQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NCwgMjAyMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ5NTgwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTkzLCAxOTYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDUzNzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDE3MAotCQkJCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2MSwgMTA2OSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODgiCi0JCQkJCWNsaWVudCAgICAgCUAxNjUKLQkJCQkJc3VwcGxpZXIgICAJQDE1MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDk2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDEwMzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzM2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzMiIEAxNzMKLQkJCQlsb2NhdGlvbiAgIAkoMTE3OCwgMTIzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NDAyNEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDE3NAotCQkJCQlQYXJlbnRfVmlldyAJQDE3MwotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDEzNDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTk4MjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTczCi0JCQkJCXN1cHBsaWVyICAgCUAxNDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkKLQkJCQkJICAgICg5ODAsIDEyMzQpCi0JCQkJCSAgICAoOTgwLCAxNDEwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDE0MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ2LCAxMzY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzc2NjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTY2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM0IiBAMTc3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTczCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzYsIDEwMzYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTlBIgotCQkJCQljbGllbnQgICAgIAlAMTczCi0JCQkJCXN1cHBsaWVyICAgCUAxNTEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkKLQkJCQkJICAgICgxMjc3LCAxMjM0KQotCQkJCQkgICAgKDEyNzcsIDk2MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NywgOTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NywgMTA1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NDEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM1IiBAMTgwCi0JCQkJbG9jYXRpb24gICAJKDE0NjgsIDEzNDUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjgwMkY5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBAMTgxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgwCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYyLCAxNjY5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDkwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEEiCi0JCQkJCWNsaWVudCAgICAgCUAxODAKLQkJCQkJc3VwcGxpZXIgICAJQDE1MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDE3MzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTQ2LCAxNjc2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM2MzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTc4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM2IiBAMTg0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTgwCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDI3LCAxMDM3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQiIKLQkJCQkJY2xpZW50ICAgICAJQDE4MAotCQkJCQlzdXBwbGllciAgIAlAMTUxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgOTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMywgMTA4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjkwMzQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTg3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkJCWNsaWVudCAgICAgCUAxNDYKLQkJCQlzdXBwbGllciAgIAlAMTQxCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxODgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFMjAxNzEiCi0JCQkJY2xpZW50ICAgICAJQDE1MQotCQkJCXN1cHBsaWVyICAgCUAxNDIKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkVFMDMxRCIKLQkJCQljbGllbnQgICAgIAlAMTQ5Ci0JCQkJc3VwcGxpZXIgICAJQDE0MwotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTkwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRjgwMUNEIgotCQkJCWNsaWVudCAgICAgCUAxNTAKLQkJCQlzdXBwbGllciAgIAlAMTQ0Ci0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMjAwMjAwMkQiCi0JCQkJY2xpZW50ICAgICAJQDE0OAotCQkJCXN1cHBsaWVyICAgCUAxNDUKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjI0LCAxNDU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM3LCAxMzEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM3LCAxMzczKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk1OTMKLQkJCQloZWlnaHQgICAgIAkzMTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIgQDE5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTIwLCAyNTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlUmVmZXJlbmNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNTI3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpCi0JCQkJd2lkdGggICAgICAJNjcyCi0JCQkJaGVpZ2h0ICAgICAJMTgwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTk0Ci0JCQkJbG9jYXRpb24gICAJKDE1MjQsIDIyNzUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDE5MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTUyNCwgMjI3NSkKLQkJCQkgICAgKDE1MjQsIDI0NTQpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzRDAzMTkiCi0JCQkJY2xpZW50ICAgICAJQDE0OAotCQkJCXN1cHBsaWVyICAgCUAxOTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc2LCAyMTc2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc2LCAyMjc1KQotCQkJCWRyYXdTdXBwbGllciAJQDE5NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzNTAwREQiCi0JCQkJY2xpZW50ICAgICAJQDE1MAotCQkJCXN1cHBsaWVyICAgCUAxOTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzcxLCAxODU0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzcxLCAyMjc1KQotCQkJCWRyYXdTdXBwbGllciAJQDE5NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIyODAyRTciCi0JCQkJY2xpZW50ICAgICAJQDE0OQotCQkJCXN1cHBsaWVyICAgCUAxOTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODAsIDE1MzQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMjI3NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxOTQpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY3IiBAMTk4Ci0JCQkJbG9jYXRpb24gICAJKDIyMDYsIDIyNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODQwMUIxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDE5OQotCQkJCQlQYXJlbnRfVmlldyAJQDE5OAotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2OCwgMTY3MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEyMjMwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAwRiIKLQkJCQkJY2xpZW50ICAgICAJQDE5OAotCQkJCQlzdXBwbGllciAgIAlAMTkyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwNiwgMTYxMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNjAsIDE2NzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjgiIEAyMDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTgKLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMjMiCi0JCQkJCWNsaWVudCAgICAgCUAxOTgKLQkJCQkJc3VwcGxpZXIgICAJQDE5MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjA2LCAyMjU5KQotCQkJCQkgICAgKDIyMDYsIDI1NTYpCi0JCQkJCSAgICAoMTg1NiwgMjU1NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg1NiwgMjU1NikpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMSBEZWZpbml0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ4QTAyNjIiCi0JCQl0aXRsZSAgICAgIAkiMi4xIERlZmluaXRpb25zIgotCQkJem9vbSAgICAgICAJODMKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIiBAMjAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRGVmaW5pdGlvbiIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxMTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAyMjApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwKQotCQkJCXdpZHRoICAgICAgCTcwNgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyMDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg2LCA4OTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCXdpZHRoICAgICAgCTI5NAotCQkJCWhlaWdodCAgICAgCTEyMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMjA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxMCwgNTQ1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDYwNCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0NzgpCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTgyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMjA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTA1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTExNSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDIwNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MDgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDEzNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk2LCAxNDE5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAyMDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNjAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNjU5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyMDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTEwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDk4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk3Ci0JCQkJICAgIG1heF93aWR0aCAgCTUyMSkKLQkJCQl3aWR0aCAgICAgIAk1MjgKLQkJCQloZWlnaHQgICAgIAk0MjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTkiIEAyMTAKLQkJCQlsb2NhdGlvbiAgIAkoMTM1OCwgODYwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjAiIEAyMTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTAKLQkJCQkJbG9jYXRpb24gICAJKDYyLCAtMzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCA1MzUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJCQljbGllbnQgICAgIAlAMjEwCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTgsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDMsIDUxMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU2NjQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAyMTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTAKLQkJCQkJbG9jYXRpb24gICAJKDYyLCAtMzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg2LCA5MDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzkwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkJCWNsaWVudCAgICAgCUAyMTAKLQkJCQkJc3VwcGxpZXIgICAJQDIwNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzU4LCA4NjApCi0JCQkJCSAgICAoMTM1OCwgOTQ4KQotCQkJCQkgICAgKDE2NzcsIDk0OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc3LCA5NDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA5ODcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MjY1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDIxNwotCQkJCWxvY2F0aW9uICAgCSgxNjEyLCA1OTUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NCIgQDIxOAotCQkJCQlQYXJlbnRfVmlldyAJQDIxNwotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDUxMikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiCi0JCQkJCWNsaWVudCAgICAgCUAyMTcKLQkJCQkJc3VwcGxpZXIgICAJQDIwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjEyLCA1OTUpCi0JCQkJCSAgICAoMTQ2NCwgNTk1KQotCQkJCQkgICAgKDE0NjQsIDQ1MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY0LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTI0LCA0OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1ODY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAyMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTcKLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjkyLCA1NTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUltcG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MDMzNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCIKLQkJCQkJY2xpZW50ICAgICAJQDIxNwotCQkJCQlzdXBwbGllciAgIAlAMjA1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAxLCA1OTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA2NTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MTAwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NiwgNjQ2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMjU5NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkiIEAyMjUKLQkJCQlsb2NhdGlvbiAgIAkoMTI3OSwgMTEzNykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwMzAxRTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwIiBAMjI2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjI1Ci0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzgsIDU5MSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQjciCi0JCQkJCWNsaWVudCAgICAgCUAyMjUKLQkJCQkJc3VwcGxpZXIgICAJQDIwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzksIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjAsIDU4NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA0OTc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZXMiIEAyMjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMjUKLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NywgMTE3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzEzNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBDMSIKLQkJCQkJY2xpZW50ICAgICAJQDIyNQotCQkJCQlzdXBwbGllciAgIAlAMjA2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNzksIDExMzcpCi0JCQkJCSAgICAoMTI3OSwgMTIwOCkKLQkJCQkJICAgICgxODkxLCAxMjA4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODkxLCAxMjA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTE3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzk3LCAxMjQ0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ0MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAyMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTIxMiwgMTE1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MTAxMDQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjM0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjMzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCA1OTQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzRBIgotCQkJCQljbGllbnQgICAgIAlAMjMzCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjEyLCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1Nzk2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlcyIgQDIzNwotCQkJCQlQYXJlbnRfVmlldyAJQDIzMwotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5MSwgMTQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MjM2OTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNTQiCi0JCQkJCWNsaWVudCAgICAgCUAyMzMKLQkJCQkJc3VwcGxpZXIgICAJQDIwNwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjEyLCAxMTU5KQotCQkJCQkgICAgKDEyMTIsIDE0OTApCi0JCQkJCSAgICAoMTU4NywgMTQ5MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4NywgMTQ5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzMsIDE0NTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNTYxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMiwgMTU0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk1ODU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBAMjQxCi0JCQkJbG9jYXRpb24gICAJKDExMTQsIDE1ODUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzcwMDk1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDI0MgotCQkJCQlQYXJlbnRfVmlldyAJQDI0MQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgNjgwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3MSIKLQkJCQkJY2xpZW50ICAgICAJQDI0MQotCQkJCQlzdXBwbGllciAgIAlAMjA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNCwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1NSwgNzUyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY3MDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5ncyIgQDI0NQotCQkJCQlQYXJlbnRfVmlldyAJQDI0MQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1MSwgMTY3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NjM0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3QiIKLQkJCQkJY2xpZW50ICAgICAJQDI0MQotCQkJCQlzdXBwbGllciAgIAlAMjA4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMTQsIDE1ODUpCi0JCQkJCSAgICAoMTExNCwgMTcxNikKLQkJCQkJICAgICgyMTE1LCAxNzE2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCAxNzE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MywgMTY3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ1MDc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDE0LCAxNzU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTEwNzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyNDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCAxOTIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCAxOTc5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEAyNTAKLQkJCQlsb2NhdGlvbiAgIAkoMTA2NiwgMTUzMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3QjAzMTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2IiBAMjUxCi0JCQkJCVBhcmVudF9WaWV3IAlAMjUwCi0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgNjY5KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJCQkJY2xpZW50ICAgICAJQDI1MAotCQkJCQlzdXBwbGllciAgIAlAMjA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOSwgNzU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTk2OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTZXJ2aWNlcyIgQDI1NAotCQkJCQlQYXJlbnRfVmlldyAJQDI1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTMsIDIwMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNlcnZpY2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTE4MjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwODkiCi0JCQkJCWNsaWVudCAgICAgCUAyNTAKLQkJCQkJc3VwcGxpZXIgICAJQDI0OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDY2LCAxNTMzKQotCQkJCQkgICAgKDEwNjYsIDIwNTkpCi0JCQkJCSAgICAoMTYxOSwgMjA1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMjA1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTQsIDIwMzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0MDE5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMiwgMjExMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIwNTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjU4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRjgwMzgyIgotCQkJCWNsaWVudCAgICAgCUAyMDkKLQkJCQlzdXBwbGllciAgIAlAMjAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMjYzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODUsIDI2MykpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMyBFeHRlbnNpYmlsaXR5IgotCQkJcXVpZCAgICAgICAJIjNBRDYwQzUxMDE5MiIKLQkJCXRpdGxlICAgICAgCSIyLjEuMyBFeHRlbnNpYmlsaXR5IgotCQkJem9vbSAgICAgICAJODAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAyNTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDE1ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5NCwgMTUzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQl3aWR0aCAgICAgIAkxODIKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAyNjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAxODg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDg3LCAxODM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDI2MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNDIsIDE2NzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJd2lkdGggICAgICAJMTgyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEAyNjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAyMzM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAyMjgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQkJd2lkdGggICAgICAJMjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAMjYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzM2LCAxNzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDE3MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJd2lkdGggICAgICAJMzY0Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDEzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgODYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiCi0JCQkJd2lkdGggICAgICAJODA0Ci0JCQkJaGVpZ2h0ICAgICAJMTcyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEAyNjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDE5NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMTg5OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDI2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDIxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2MywgMjA5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQl3aWR0aCAgICAgIAkzMDgKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyNjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEyOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMjM1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTIyMgotCQkJCWhlaWdodCAgICAgCTE0NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyNjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDEzNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAyNjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDksIDU4MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwOSwgNjQxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk1MzEpCi0JCQkJd2lkdGggICAgICAJNTYwCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI3MAotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDEwMzkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDgwLCAxMDM5KQotCQkJCSAgICAoNDgwLCA4MDgpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDBDQjAwQUEiCi0JCQkJY2xpZW50ICAgICAJQDI2MAotCQkJCXN1cHBsaWVyICAgCUAyNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY2LCAxODI0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY2LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjVBNDAyN0UiCi0JCQkJY2xpZW50ICAgICAJQDI2NgotCQkJCXN1cHBsaWVyICAgCUAyNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk3LCAyMDc5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk3LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTM4NjAyQzkiCi0JCQkJY2xpZW50ICAgICAJQDI2MgotCQkJCXN1cHBsaWVyICAgCUAyNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE5LCAyMjcxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE5LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjU5QjAwNzIiCi0JCQkJY2xpZW50ICAgICAJQDI2NQotCQkJCXN1cHBsaWVyICAgCUAyNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODgsIDE4ODcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4OCwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwOTIwMkY3IgotCQkJCWNsaWVudCAgICAgCUAyNjMKLQkJCQlzdXBwbGllciAgIAlAMjY5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzk3LCAxNjk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTcsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTBGMDJGMCIKLQkJCQljbGllbnQgICAgIAlAMjU5Ci0JCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYwMSwgMTUxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAxLCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCQkJY2xpZW50ICAgICAJQDI2NwotCQkJCXN1cHBsaWVyICAgCUAyNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTEsIDEyMjMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCWNsaWVudCAgICAgCUAyNjgKLQkJCQlzdXBwbGllciAgIAlAMjY5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDE0LCAxMzQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJCQljbGllbnQgICAgIAlAMjYxCi0JCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE2NjMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MjksIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDY4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNTgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNjQ0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NSkKLQkJCQl3aWR0aCAgICAgIAk1NjMKLQkJCQloZWlnaHQgICAgIAkyMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjciIEAyODEKLQkJCQlsb2NhdGlvbiAgIAkoMTE5MSwgNjcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAyODIKLQkJCQkJUGFyZW50X1ZpZXcgCUAyODEKLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NDcsIDYzMSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJCWNsaWVudCAgICAgCUAyODEKLQkJCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzYwLCA2NzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzAsIDYyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM5Njk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMjg1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjgxCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NSwgNTIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3OTA3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkJCWNsaWVudCAgICAgCUAyODEKLQkJCQkJc3VwcGxpZXIgICAJQDI4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMywgNjcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NiwgNjI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjMsIDc2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjMyNDc5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk5MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIgQDI4OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxOTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODkKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzMCwgODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIldTRExFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjg5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDE0NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNzUzKQotCQkJCXdpZHRoICAgICAgCTc3NAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyOTAKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgNDAyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAyODkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEwMDgsIDQwMikKLQkJCQkgICAgKDEwMDgsIDMxMikpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJCQljbGllbnQgICAgIAlAMjY5Ci0JCQkJc3VwcGxpZXIgICAJQDI4OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5MiwgNTY4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0OTIsIDQwMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAyOTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjkyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxNDkwM0QwIgotCQkJCWNsaWVudCAgICAgCUAyODAKLQkJCQlzdXBwbGllciAgIAlAMjY0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxNSwgNTcxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE1LCAyNDYpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRERGNTM1MDJDMyIKLQkJCQljbGllbnQgICAgIAlAMjgwCi0JCQkJc3VwcGxpZXIgICAJQDI4OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDU3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MiwgNDAyKQotCQkJCWRyYXdTdXBwbGllciAJQDI5MCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI5NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAxNiwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMSwgMTMwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJCXdpZHRoICAgICAgCTU4OAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUVDMDFDQiIKLQkJCQljbGllbnQgICAgIAlAMjk0Ci0JCQkJc3VwcGxpZXIgICAJQDI4MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3OTYsIDEyOTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTYsIDgwNSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY5IiBAMjk2Ci0JCQkJbG9jYXRpb24gICAJKDIzMTEsIDE2ODYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTIwMjZFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJlbnQiIEAyOTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAyOTYKLQkJCQkJbG9jYXRpb24gICAJKDI3OSwgMjk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQyMiwgMTMzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCQkJY2xpZW50ICAgICAJQDI5NgotCQkJCQlzdXBwbGllciAgIAlAMjk0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzMTEsIDE2ODYpCi0JCQkJCSAgICAoMjQzMiwgMTY4NikKLQkJCQkJICAgICgyNDMyLCAxMzc0KQotCQkJCQkgICAgKDIzMTAsIDEzNzQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjMxMSwgMTY4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTAsIDEzNzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzY2LCAxNDI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNoaWxkcmVuIiBAMzAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMjk2Ci0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTksIDE1MzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2hpbGRyZW4iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5ODU2MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkMiCi0JCQkJCWNsaWVudCAgICAgCUAyOTYKLQkJCQkJc3VwcGxpZXIgICAJQDI5NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzExLCAxNjg2KQotCQkJCQkgICAgKDIwMTYsIDE2ODYpCi0JCQkJCSAgICAoMjAxNiwgMTQyNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNiwgMTQyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzAsIDE0ODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCQkJcXVpZCAgICAgICAJIjNBRThFRDcyMDFCRCIKLQkJCXRpdGxlICAgICAgCSIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIgQDMwMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklJbXBvcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxMjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiCi0JCQkJd2lkdGggICAgICAJNTk4Ci0JCQkJaGVpZ2h0ICAgICAJMjE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiIEAzMDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTEzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCAxMDQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJOYW1lc3BhY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiCi0JCQkJd2lkdGggICAgICAJNDc5Ci0JCQkJaGVpZ2h0ICAgICAJMjE1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDMwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCAxMTQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTczCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQsIDIzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQl3aWR0aCAgICAgIAk0OTAKLQkJCQloZWlnaHQgICAgIAkzMjAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDMiIEAzMDcKLQkJCQlsb2NhdGlvbiAgIAkoMzA5LCA3ODYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTUwMDJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTmFtZXNwYWNlcyIgQDMwOAotCQkJCQlQYXJlbnRfVmlldyAJQDMwNwotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjEsIDk1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTmFtZXNwYWNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk4ODQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMzMiIKLQkJCQkJY2xpZW50ICAgICAJQDMwNwotCQkJCQlzdXBwbGllciAgIAlAMzA0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgMTAyOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0OCwgOTczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Njg3MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjUwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTgyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ0IiBAMzEyCi0JCQkJCVBhcmVudF9WaWV3IAlAMzA3Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OCwgNTkyKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMjgiCi0JCQkJCWNsaWVudCAgICAgCUAzMDcKLQkJCQkJc3VwcGxpZXIgICAJQDMwNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDU0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzOSwgNTgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDQ5NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTcxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDMxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgNzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjU1LCA1ODApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCQl3aWR0aCAgICAgIAk0NTIKLQkJCQloZWlnaHQgICAgIAkzMDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAzMTYKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NiwgMTAwMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDQzAyRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTY2hlbWEiIEAzMTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTYKLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDEwMTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkyNTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3MCIKLQkJCQkJY2xpZW50ICAgICAJQDMxNgotCQkJCQlzdXBwbGllciAgIAlAMzA1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0ODYsIDEwMDEpCi0JCQkJCSAgICAoMTYzMiwgMTAwMSkKLQkJCQkJICAgICgxNjMyLCAxMTMwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMyLCAxMTMwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2MywgMTAxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkyNTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDMyMAotCQkJCQlQYXJlbnRfVmlldyAJQDMxNgotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3QSIKLQkJCQkJY2xpZW50ICAgICAJQDMxNgotCQkJCQlzdXBwbGllciAgIAlAMzE1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCAxMDAwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NSIgQDMyMQotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCA0MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0EwMDJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDMyMgotCQkJCQlQYXJlbnRfVmlldyAJQDMyMQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiCi0JCQkJCWNsaWVudCAgICAgCUAzMjEKLQkJCQkJc3VwcGxpZXIgICAJQDMxNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg3LCA0MDMpCi0JCQkJCSAgICAoMTM2NCwgNDAzKQotCQkJCQkgICAgKDEzNjQsIDU2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRGVmaW5pdGlvbiIgQDMyNAotCQkJCQlQYXJlbnRfVmlldyAJQDMyMQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA1LCAzNjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzUzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCQkJY2xpZW50ICAgICAJQDMyMQotCQkJCQlzdXBwbGllciAgIAlAMzA2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNDU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQ5MTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjMiIEAzMjcKLQkJCQlsb2NhdGlvbiAgIAkoNzM3LCA4MjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NCIgQDMyOAotCQkJCQlQYXJlbnRfVmlldyAJQDMyNwotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUyLCA2NDcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQkJY2xpZW50ICAgICAJQDMyNwotCQkJCQlzdXBwbGllciAgIAlAMzA2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDczNywgODI2KQotCQkJCQkgICAgKDUxMCwgODI2KQotCQkJCQkgICAgKDUxMCwgNTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA1NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NTcsIDU5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDMzMQotCQkJCQlQYXJlbnRfVmlldyAJQDMyNwotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTkxODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJCWNsaWVudCAgICAgCUAzMjcKLQkJCQkJc3VwcGxpZXIgICAJQDMxNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA4NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzM1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMEQwMzQwIgotCQkJCWNsaWVudCAgICAgCUAzMTUKLQkJCQlzdXBwbGllciAgIAlAMzAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1NSwgNTY4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNCODVBRTU5MDM3RSIKLQkJCXRpdGxlICAgICAgCSIyLjIgVHlwZXMiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAk4MQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzMzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5NSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNTAwCi0JCQkJaGVpZ2h0ICAgICAJMTc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDMzNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDYsIDE1MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk0NzgKLQkJCQloZWlnaHQgICAgIAkxNjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzMzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE5NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTE3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4ODMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTUzNQotCQkJCWhlaWdodCAgICAgCTMwNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDMzOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDEwNjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTEyMikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQpCi0JCQkJd2lkdGggICAgICAJNDY2Ci0JCQkJaGVpZ2h0ICAgICAJMjU4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMzQwCi0JCQkJbG9jYXRpb24gICAJKDczNSwgMTE3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAwQzQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBAMzQxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQwCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NSwgMTEzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5MDA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzI3IgotCQkJCQljbGllbnQgICAgIAlAMzQwCi0JCQkJCXN1cHBsaWVyICAgCUAzMzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NiwgMTE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzOSwgMTIwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg4NzA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDM0NAotCQkJCQlQYXJlbnRfVmlldyAJQDM0MAotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2NzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkJCQljbGllbnQgICAgIAlAMzQwCi0JCQkJCXN1cHBsaWVyICAgCUAzMzkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4NSwgMTE3MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTUiIEAzNDUKLQkJCQlsb2NhdGlvbiAgIAkoNTI3LCAxNTkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxQzEyMDNCMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9uIiBAMzQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjYsIDE1NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzUzOTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCQkJCWNsaWVudCAgICAgCUAzNDUKLQkJCQkJc3VwcGxpZXIgICAJQDMzNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk3LCAxNTkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA3LCAxNjQ1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTU4NzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDI2IgotCQkJCQljbGllbnQgICAgIAlAMzQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAzMzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTI3LCAxNTkyKQotCQkJCQkgICAgKDQzNywgMTU5MikKLQkJCQkJICAgICg0MzcsIDEzMTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAxMzEzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MSIgQDM1MAotCQkJCWxvY2F0aW9uICAgCSgzMjIsIDE5MTEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTMwM0U1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDM1MQotCQkJCQlQYXJlbnRfVmlldyAJQDM1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM4LCAxODcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDg1NjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCQkJCWNsaWVudCAgICAgCUAzNTAKLQkJCQkJc3VwcGxpZXIgICAJQDMzOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTkxMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MywgMTk2NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MiIgQDM1NAotCQkJCQlQYXJlbnRfVmlldyAJQDM1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDExOCIKLQkJCQkJY2xpZW50ICAgICAJQDM1MAotCQkJCQlzdXBwbGllciAgIAlAMzM5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDMyMiwgMTkxMSkKLQkJCQkJICAgICgyMjksIDE5MTEpCi0JCQkJCSAgICAoMjI5LCAxMzEzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOSwgMTMxMykpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMzU1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDYwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA1MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDU2NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkzMTIpCi0JCQkJd2lkdGggICAgICAJMzg5Ci0JCQkJaGVpZ2h0ICAgICAJMjE2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzU2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJMjIyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU5IiBAMzU3Ci0JCQkJbG9jYXRpb24gICAJKDIzNCwgNjA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMzU4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNwotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY2MTAxNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDM1NwotCQkJCQlzdXBwbGllciAgIAlAMzU1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4Mzg4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjAiIEAzNjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTcKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMywgMzEzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiIKLQkJCQkJY2xpZW50ICAgICAJQDM1NwotCQkJCQlzdXBwbGllciAgIAlAMzU2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNCwgNjA0KQotCQkJCQkgICAgKDE3NCwgNjA0KQotCQkJCQkgICAgKDE3NCwgMjI1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAyMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDI3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3NzI5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiIEAzNjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNSwgMjAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJVHlwZXMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDE1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJCQl3aWR0aCAgICAgIAkyNDgKLQkJCQloZWlnaHQgICAgIAkxNjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTksIDc1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MzkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQkJd2lkdGggICAgICAJNzU3Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDM2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxMjE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTI5LCAxMTAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNjczCi0JCQkJaGVpZ2h0ICAgICAJMjUwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY1IiBAMzY3Ci0JCQkJbG9jYXRpb24gICAJKDE4MjYsIDk3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY2IiBAMzY4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzY3Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkJCWNsaWVudCAgICAgCUAzNjcKLQkJCQkJc3VwcGxpZXIgICAJQDM2NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgODU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3NCwgOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTY0ODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDM3MAotCQkJCQlQYXJlbnRfVmlldyAJQDM2NwotCQkJCQlsb2NhdGlvbiAgIAkoMzA2LCA0NDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA2LCAxMDMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA3NTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRSIKLQkJCQkJY2xpZW50ICAgICAJQDM2NwotCQkJCQlzdXBwbGllciAgIAlAMzY2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCAxMDkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjUxNTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzczCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NBRENEM0IwMzgwIgotCQkJCWNsaWVudCAgICAgCUAzNTUKLQkJCQlzdXBwbGllciAgIAlAMzY0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwNSwgMzA3KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMzc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyMjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxNSwgMTMwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAxODUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMSkKLQkJCQl3aWR0aCAgICAgIAk1MDAKLQkJCQloZWlnaHQgICAgIAkyMTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNzUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiCi0JCQkJY2xpZW50ICAgICAJQDM1NQotCQkJCXN1cHBsaWVyICAgCUAzNzQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTQsIDUwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzNzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCAzNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCA0MjMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY1KQotCQkJCXdpZHRoICAgICAgCTY4NwotCQkJCWhlaWdodCAgICAgCTIxNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDM3NwotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA0OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOCIgQDM3OAotCQkJCQlQYXJlbnRfVmlldyAJQDM3NwotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMzg2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJCWNsaWVudCAgICAgCUAzNzcKLQkJCQkJc3VwcGxpZXIgICAJQDM3NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjA2LCA0OTMpCi0JCQkJCSAgICAoMTA5NCwgNDkzKQotCQkJCQkgICAgKDEwOTQsIDMzMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAzNzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyODMyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM4MQotCQkJCQlQYXJlbnRfVmlldyAJQDM3NwotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzk3MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkJCWNsaWVudCAgICAgCUAzNzcKLQkJCQkJc3VwcGxpZXIgICAJQDM3NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MSwgNDkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxNSwgNTQ2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjQ5NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTYsIDM5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk0OTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyIKLQkJCQljbGllbnQgICAgIAlAMzY1Ci0JCQkJc3VwcGxpZXIgICAJQDM3NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MTIsIDc0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgNTcyKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyIKLQkJCXF1aWQgICAgICAgCSIzQkNFODUzRDAyQzgiCi0JCQl0aXRsZSAgICAgIAkiMi4zIE1lc3NhZ2VzIgotCQkJem9vbSAgICAgICAJODUKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzg2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTWVzc2FnZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTgwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTM4MSkKLQkJCQl3aWR0aCAgICAgIAkzODAKLQkJCQloZWlnaHQgICAgIAkzMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IiBAMzg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgMTI0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUGFydCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCAxODIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNjAzKQotCQkJCXdpZHRoICAgICAgCTYxNwotCQkJCWhlaWdodCAgICAgCTMyNAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMzg4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA4MTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDY5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgNzQ4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ4NCkKLQkJCQl3aWR0aCAgICAgIAk0OTIKLQkJCQloZWlnaHQgICAgIAkyNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzODkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTk2RDAyRjEiCi0JCQkJY2xpZW50ICAgICAJQDM4OAotCQkJCXN1cHBsaWVyICAgCUAzODcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzA0LCA2NzgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDQsIDM4NikpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMzkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDY1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCA1MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTY1KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk0MzIKLQkJCQloZWlnaHQgICAgIAkzMjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThEMTAyQkEiCi0JCQkJY2xpZW50ICAgICAJQDM5MAotCQkJCXN1cHBsaWVyICAgCUAzODYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDUsIDQ5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCAzODgpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBAMzkyCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgOTUyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRUJFMDBFMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcnRzIiBAMzkzCi0JCQkJCVBhcmVudF9WaWV3IAlAMzkyCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgODk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk3NDUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkYwMDYxIgotCQkJCQljbGllbnQgICAgIAlAMzkyCi0JCQkJCXN1cHBsaWVyICAgCUAzODgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgOTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMDA1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODk4MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTA2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQyMDM4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOCIgQDM5NwotCQkJCQlQYXJlbnRfVmlldyAJQDM5MgotCQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MDQsIDg5MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNTciCi0JCQkJCWNsaWVudCAgICAgCUAzOTIKLQkJCQkJc3VwcGxpZXIgICAJQDM5MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2ODgsIDk1MikKLQkJCQkJICAgICg0NDUsIDk1MikKLQkJCQkJICAgICg0NDUsIDgxNykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgODE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzkzLCA5MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NzYwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpKSkKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAieHNkIgotCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJYU0QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJvcmcuZWNsaXBzZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJInhzZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHNkLzIwMDIvWFNEIikpCi0JCXF1aWQgICAgICAgCSIzOUFCREM2RjAxQUEiCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBbm5vdGF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5RTE3NzAxMTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0RTIwMzY2IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFwcGxpY2F0aW9uSW5mb3JtYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUJGMDJDOCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2VySW5mb3JtYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUVBMDE1NyIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVzIgotCQkJCXF1aWQgICAgICAgCSIzQkJGN0YwNTAxRTIiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIkRPTUF0dHIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5QjdEQzAxOTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTYxMDNCRSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODdGNTIwMkI0IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzJEOEUyMDBFQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDNBMDIyMSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRUIwMkE4IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y3QjAzODYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3MzcwMzhGIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjcyRDdCQjAzNDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNDRjMwMjdEIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0REQjAzQjciCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0RFMDAyRDgiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnN0cmFpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IwMjIwMzgyIgotCQkJCXR5cGUgICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjcxOUQ5MDM0MSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RCb3VuZGVkRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjNDMDIyNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1MkEwMENDIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDYXJkaW5hbGl0eUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0RjAxMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTZDMDE1MyIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ2FyZGluYWxpdHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QjgwMjg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCQUEyMDMxMCIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcml2YXRpb25NZXRob2QiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzZFNDAyMEUiCi0JCQkJdHlwZSAgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiCi0JCQkJaW5pdHYgICAgICAJInJlc3RyaWN0aW9uIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzcxRDAyNkEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNzM4MDBDNSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0E0MjAyQjgiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQjhBMDNFNiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2MTgwMTREIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRkI5NzAwNkUiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MzMUFGNUUwM0E2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEREI1MDFBNSIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljIgotCQkJcXVpZCAgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRDRDMEY0QzAxQTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldmVyaXR5IgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjkxQzAwNUQiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpYWdub3N0aWNTZXZlcml0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNUZERDAyODAiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NDMwMTZCIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGluZSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYwN0UwMjEzIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29sdW1uIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjExRTAyOTYiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub2RlIgotCQkJCXF1aWQgICAgICAgCSIzQzAxNkI2QjAyMDAiCi0JCQkJdHlwZSAgICAgICAJIkRPTU5vZGUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW5ub3RhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NEYwMTg2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2NjAzMzkiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5pbGxhYmxlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGQjQwMjlGIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzQ2ODAzNjgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0QTAwM0I5IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRFMDAwMEUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNEMwMEIyIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTY4MDFDMSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RjYyMDNDRiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaXJjdWxhciIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzM0RENCMDAwMTgiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVudW1lcmF0aW9uRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzlEMDNDNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M2NDAwNTQiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2RDI1NjgwMjU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzM3NDAyNTMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWNldE5hbWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODlGQjQwMUVDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWZmZWN0aXZlVmFsdWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEFBRTMwM0I2IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmVhdHVyZSIKLQkJCXF1aWQgICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODEwMjBGIgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODgwMEM1IgotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZvcm0iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTAyQjAzM0UiCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzI3MUExQjAxNkYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJnbG9iYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwMDcwMzcyIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZlYXR1cmVSZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwNDQwMTg1IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGaXhlZEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2OTlFMDBDMSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4ODAxQjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZBNjAwMjAxIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3OUJFMDJFRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I5OTAwMTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUQyMDA4QSIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2OUU4MDFENiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM3QjAzOTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBQTMwMjQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxQzcwMTQzIgotCQkJCXR5cGUgICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW1wb3J0IgotCQkJcXVpZCAgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEOTAwM0UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQjE1MDM2QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbmNsdWRlIgotCQkJcXVpZCAgICAgICAJIjNCNjg4QzdEMDI1MCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEQzAzODEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIgotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RMZW5ndGhGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3ODAwMkRGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc2QzAwNEIiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RXhjbHVzaXZlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4OTYwMEMyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjhFMDMwOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMzEwM0FEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzBBMUVFMjAxRjciCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE3NDAyN0QiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTkzMDM1NCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4SW5jbHVzaXZlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4N0QwMERBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjgzMDNCOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhMZW5ndGhGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCN0QwMEZDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdEQTAwRjMiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRXhjbHVzaXZlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5MkQwMDBBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjU5MDI4MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5GYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMjQwMDk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzBBMUVEMTAzOTgiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFBMjAwOEUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUJFMDNFMiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluSW5jbHVzaXZlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4ODcwMkM5IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjUyMDM1MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5MZW5ndGhGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3QzQwMEMwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc5OTAxNUUiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETW9kZWxHcm91cCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbXBvc2l0b3IiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjFEMDFDRiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcG9zaXRvciIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkUyMDM4MSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QkQyNTUwMzg1IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FDNDAwOTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUY2MDJFOCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZWRDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDRUEyMDE5NyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzAwMDE0MiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDQwMzFFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNOYW1lIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTdGMDEyNyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVSSSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU4NzAwRTIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc1VSSSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTVBQTAyQUYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDk2MzAyNUUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETm90YXRpb25EZWNsYXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ5NDMwMkYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNEYwMjNDIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JZGVudGlmaWVyIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMyRTAwRjAiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWNJZGVudGlmaWVyIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMzNDAzOTciCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETnVtZXJpY0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0MjAwNzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NUEzMDAxMiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY1OTAxMkMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NEY2MDJEQSIKLQkJCQl0eXBlICAgICAgIAkiWFNET3JkZXJlZCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGUiCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEZDMDFFNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1pbk9jY3VycyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjhFMDNCMiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1heE9jY3VycyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjk5MDNBRSIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QkQyMjMwMEM2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzgwQkQ5MDA1OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXR0ZXJuRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Q0E1MDM4RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M3OTAzMTEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZENEJBMDIzQyIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaXJjdWxhciIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTY4MDAyMTYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmUiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQjY0MDI0MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYSIKLQkJCXF1aWQgICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNDNEEwMTgyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0RTUwM0REIgotCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODY4RUMwMjI2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjlGOUJGRjAxODAiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVGb3JtRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDRCMDEwMiIKLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSIKLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudEZvcm1EZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNzgwMEFDIgotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIgotCQkJCWluaXR2ICAgICAgCSJ1bnF1YWxpZmllZCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbERlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwQzRBNzAwMzgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNTlEMDJEOCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0QyMkQ2RDgwMzU2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQlxdWlkICAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQjU2MDA5MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4OENCODAwQkEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RTYwMzcyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCXF1aWQgICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRDlCMzAzMzAiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NvcGUiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjU1MDMyQiIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzMxNTgwMEE5IgotCQkJCXR5cGUgICAgICAgCSJYU0RWYXJpZXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkJCXF1aWQgICAgICAgCSIzQjZENTQ0RjAxNDYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjVFMDM1QSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsaWRGYWNldHMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQjBGMDBCNiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUZXJtIgotCQkJcXVpZCAgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhBQTAxRDMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QkQyNDQwMDY5IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNjEwMzM3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlBQjAyMzIiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVHlwZURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkY1MDEzQSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2VGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NjIwMDQ1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg1MDAyMDEiCi0JCQkJdHlwZSAgICAgICAJIlhTRFdoaXRlU3BhY2UiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdpbGRjYXJkIgotCQkJcXVpZCAgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDBFOTAxOUUiCi0JCQkJdHlwZSAgICAgICAJIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50IgotCQkJCXF1aWQgICAgICAgCSIzQjk3Q0Y4NjAyMjMiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9jZXNzQ29udGVudHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDEyRTAxRTQiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2Nlc3NDb250ZW50cyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCREI3MDFGOSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4NEY3MDA5MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ5MDE1MDNERSIKLQkJCQl0eXBlICAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjdCQkJFMTAxQjEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NQXR0ciIKLQkJCXF1aWQgICAgICAgCSIzQkJGOEM4OTAxQjYiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkF0dHIiCi0JCQkJcXVpZCAgICAgICAJIjNCQkY4Q0IwMDBENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCIKLQkJCXF1aWQgICAgICAgCSIzQzI3ODUwRTAzODEiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQzI3ODUxQjAzQzYiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjgxODk3OTAyMDAiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODE4OURCMDM3NCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Ob2RlIgotCQkJcXVpZCAgICAgICAJIjNCRkU2NEE1MDExNyIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uTm9kZSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY1QkYwMDJEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlZhbHVlIgotCQkJcXVpZCAgICAgICAJIjNDMDQwQjVCMDMxRiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5sYW5nLk9iamVjdCIKLQkJCQlxdWlkICAgICAgIAkiM0MwNDBCOEQwM0Q1IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCQTdCMEU4MDFBOCIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3B0aW9uYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTE1MDJCNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkIgotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyMjAyRDMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTI5MDJGMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHkiCi0JCQlxdWlkICAgICAgIAkiM0JDNzcxNUQwMDlCIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5pdGUiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MURDMDJFRCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb3VudGFibHlJbmZpbml0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxRUMwMTQxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4RmluYWwiCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyQ0EwMUNCIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkU3MDBEQSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRUEwMTZBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RDIwMTEyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb3NpdG9yIgotCQkJcXVpZCAgICAgICAJIjNCODY5QjYyMDAzNyIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUJEMDAwMDMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2hvaWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNCODAxMUUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VxdWVuY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0U1MDA1NyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uc3RyYWludCIKLQkJCXF1aWQgICAgICAgCSIzQjg2OUUyNjAxQUUiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlZmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RThFMDI1OCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaXhlZCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOTkwMjcxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCODZBNzlGMDNBMiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW1wdHkiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0NEMDJGMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaW1wbGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QxMDBDRSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDMwMUI3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRPbmx5IgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdENzAyRTkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERlcml2YXRpb25NZXRob2QiCi0JCQlxdWlkICAgICAgIAkiM0I4NkEwQjAwMENFIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMEM4MDMyOSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQ0MwMTYyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljU2V2ZXJpdHkiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY4QTcwMzJGIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYXRhbCIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4QzMwM0QwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVycm9yIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFNzAwRTMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid2FybmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RUEwMUZGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluZm9ybWF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQkZFN0ZDMjAxOUEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCOTdDNUE0MDNERiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3OTAwNDUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3RjAxQUMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjgzMDIwQiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjQ1MDA2OSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERm9ybSIKLQkJCXF1aWQgICAgICAgCSIzQjlGOTEzQjAxRUIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInF1YWxpZmllZCIKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxNkYwMDIzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVucXVhbGlmaWVkIgotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE4QzAwN0YiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCODZBMUUwMDI3MiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2V5IgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMjAwODUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2V5cmVmIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMzAxNEYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pcXVlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxNjAzNjUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzVFQTAwMjMiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFueSIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjAwMDM0IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjIwMDVGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjUwMTE3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkIgotCQkJcXVpZCAgICAgICAJIjNCQzc3MTUyMDJFNCIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFsc2UiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUE5MDI3MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJ0aWFsIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFCQjAxRkYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidG90YWwiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUM0MDFCMiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvY2Vzc0NvbnRlbnRzIgotCQkJcXVpZCAgICAgICAJIjNCOEZGOEM3MDI4NCIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3RyaWN0IgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGODAwNDUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGF4IgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGNjAzOEIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2tpcCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RTgwMkJBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzVCRTAyNzIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OEIwMEI4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY5NDAyOTEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI1MDAyOTUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZUZpbmFsIgotCQkJcXVpZCAgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODEwMjMwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MzAxMzgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjg4MDI0RSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkUwMDM3NCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJcXVpZCAgICAgICAJIjNCOTdDNTkxMDBBRSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2NDAyMzEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjZEMDIxNiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVmFyaWV0eSIKLQkJCXF1aWQgICAgICAgCSIzQjhGRjc3MzAyNDkiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0b21pYyIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QTcwMkRGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FEMDEzOSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUYwMzlGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlIgotCQkJcXVpZCAgICAgICAJIjNCRUVEMEY2MDM0MiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlc2VydmUiCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTBGMDExNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXBsYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyNzAzNEQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29sbGFwc2UiCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI5MDM5NiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhWYXJpZXR5IgotCQkJcXVpZCAgICAgICAJIjNCOEZGQjg5MDMzQSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VsZWN0b3IiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkFDMDE5MiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaWVsZCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQjMwMjc4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MCIKLQkJCXF1aWQgICAgICAgCSIzQzYyNkVBNzAxMDIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDcxIgotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REFEQzAyRjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDczIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDI0MiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc0IgotCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDA2RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMwRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMxOCIKLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzYiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NkIwMkNCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1NkQwMEE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1NkQwMEE3IgotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzgiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNkIwMTk0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzA5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2RDAzMTMiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgwIgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjA2MDI5MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgyIgotCQkJcXVpZCAgICAgICAJIjNCNjk0MDRFMDA2NyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDI5QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyQTUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU5RjAwODYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNkEiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NiIKLQkJCXF1aWQgICAgICAgCSIzQzI3NUQzMjAyMjAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg3IgotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwRCIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg4IgotCQkJcXVpZCAgICAgICAJIjNCNjg4N0JGMDE1MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTgiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI1RTAxRjkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkxIgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDUwIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkyIgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTg1MDEwRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkIiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NCIKLQkJCXF1aWQgICAgICAgCSIzQjZGMURFOTAxOEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk1IgotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzNkMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzODAiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTYiCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2ODgwMUMyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NyIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2OEEwMTExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudEFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExQiIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudEFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5OCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNTAzNDAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk5IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDAiCi0JCQlxdWlkICAgICAgIAkiM0I2RkRERDcwMTEzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAyIgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0RGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAzIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZFIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNCIKLQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAwNkUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzRBIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA2IgotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA3IgotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDdDIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA4IgotCQkJcXVpZCAgICAgICAJIjNCNjg1MUJBMDEyNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA5IgotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEwIgotCQkJcXVpZCAgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIgotCQkJCWxhYmVsICAgICAgCSJjb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExMiIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RDb250YWluZXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNCIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMTAzNTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiIKLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE2IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE3IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyM0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTgiCi0JCQlxdWlkICAgICAgIAkiM0I2ODkxMTQwMUFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyMCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyMSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNDMCIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyMiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjQiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQxRTYwMjUxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDJGNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAzMEIiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI2IgotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI3IgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjgiCi0JCQlxdWlkICAgICAgIAkiM0M0MkRCREQwMjk3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjkiCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDExRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMwIgotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMxIgotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDRSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMiIKLQkJCXF1aWQgICAgICAgCSIzQjZENTk3MTAyRUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzQiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI2NTMwMTdBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJzY29wZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RCIKLQkJCQlsYWJlbCAgICAgIAkic2NvcGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM2IgotCQkJcXVpZCAgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEZlYXR1cmUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzgiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDAiCi0JCQlxdWlkICAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jZWRLZXkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDIiCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzZWxlY3RvciIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ0IgotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ1IgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmllbGRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJbGFiZWwgICAgICAJImZpZWxkcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ2IgotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q4MDJGQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ3IgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDgiCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDkiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTcwMkM4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE4MDNFMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTIiCi0JCQlxdWlkICAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAxQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDI1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0aWNsZXMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMiIKLQkJCQlsYWJlbCAgICAgIAkicGFydGljbGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTYiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTUwMDhBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTciCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDA5NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMEEwIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU4IgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU5IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXAiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI0NTAzOTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOUUiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDcxNTAxMTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NiIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0M4OTAxMjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTEwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiCi0JCQkJbGFiZWwgICAgICAJInRlcm0iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY4IgotCQkJcXVpZCAgICAgICAJIjNCNkFERTQyMDA5QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY5IgotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MCIKLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcyIgotCQkJcXVpZCAgICAgICAJIjNCNjg4RTZCMDAzRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTczIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NCIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RDAxQkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5IgotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc2IgotCQkJcXVpZCAgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc3IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzgiCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MCIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAwNDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgyIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRUZGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgzIgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODQiCi0JCQlxdWlkICAgICAgIAkiM0JGQzJBMTcwMUVEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODUiCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUVBNzAyM0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QiIKLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg4IgotCQkJcXVpZCAgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTAiCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNDOCIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkyIgotCQkJcXVpZCAgICAgICAJIjNCNkMzNUFEMDM3NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkzIgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0Q29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCIKLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTQiCi0JCQlxdWlkICAgICAgIAkiM0JDOEFFMDIwM0E4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTUiCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA1MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiCi0JCQkJbGFiZWwgICAgICAJImZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk2IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNEI3MDIwOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk3IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5OCIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCWxhYmVsICAgICAgCSJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMCIKLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMSIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDJBNSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDIiCi0JCQlxdWlkICAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDIyRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNCIKLQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MTAxNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDYiCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2Q0YwMDg4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDciCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQlsYWJlbCAgICAgIAkiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDgiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEwIgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjExMDI2RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjExIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDIwMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxMiIKLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxMyIKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzMyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTQiCi0JCQlxdWlkICAgICAgIAkiM0JFQkRDODcwMjQ3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTUiCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDJGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE2IgotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE3IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wb25lbnRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImNvbXBvbmVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxOCIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxOSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNyIKLQkJCQlsYWJlbCAgICAgIAkiZGlhZ25vc3RpY3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjAiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjEiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFsbERpYWdub3N0aWNzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJbGFiZWwgICAgICAJImFsbERpYWdub3N0aWNzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMiIKLQkJCXF1aWQgICAgICAgCSIzQzIxRENDNzAwRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjQiCi0JCQlxdWlkICAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI2IgotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI3IgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwRDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjgiCi0JCQlxdWlkICAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjkiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcxIgotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzAiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVDRjAwMDVFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAxRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDI4IgotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMiIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCWxhYmVsICAgICAgCSJvcmlnaW5hbFZlcnNpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzQiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVFQUIwMDFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDEwQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1IgotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM2IgotCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM3IgotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIgotCQkJCWxhYmVsICAgICAgCSJpdGVtVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzOCIKLQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3MzAxOTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzOSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hRm9yU2NoZW1hIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUZCIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWFGb3JTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDAiCi0JCQlxdWlkICAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwM0MiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ0IgotCQkJcXVpZCAgICAgICAJIjNDMjhBMEYyMDFBNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJFNSIKLQkJCQlsYWJlbCAgICAgIAkidHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE2REIwMUU1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDciCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0RFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0OSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUwIgotCQkJcXVpZCAgICAgICAJIjNDMjhBNzRCMDE3OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUyIgotCQkJcXVpZCAgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciCi0JCQkJbGFiZWwgICAgICAJImNvbXBsZXhUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDEyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTQiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwREQiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1NSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyNzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIgotCQkJCWxhYmVsICAgICAgCSJtaW5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDhEMDI1MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0Q0IgotCQkJCWxhYmVsICAgICAgCSJtYXhJbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIgotCQkJCWxhYmVsICAgICAgCSJtaW5JbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEIzMDIwNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTlBIgotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjIxIgotCQkJCWxhYmVsICAgICAgCSJtYXhFeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIgotCQkJCWxhYmVsICAgICAgCSJsZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjcxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIndoaXRlU3BhY2VGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA3NSIKLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjczIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVudW1lcmF0aW9uRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFDIgotCQkJCWxhYmVsICAgICAgCSJlbnVtZXJhdGlvbkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzQiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQlsYWJlbCAgICAgIAkicGF0dGVybkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDODAyQTciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUY1IgotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJudW1lcmljRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDEiCi0JCQkJbGFiZWwgICAgICAJIm51bWVyaWNGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDRjAxOTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDg1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiIKLQkJCQlsYWJlbCAgICAgIAkibWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAyNyIKLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0Q3IgotCQkJCWxhYmVsICAgICAgCSJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0IgotCQkJCWxhYmVsICAgICAgCSJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAwNDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmRlcmVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJib3VuZGVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOTgiCi0JCQkJbGFiZWwgICAgICAJImJvdW5kZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NDAxRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzYwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4RmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjU0RjAxNDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIxNyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQTAwQUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMDAzQTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNCIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNiIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA2MCIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwOCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwOSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNDMyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMCIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MDAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMENGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMiIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMyIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTBGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNGYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDExQSIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxNCIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjREMzAyOEUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxNSIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkYzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljUGFydGljbGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGRCIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzE2IgotCQkJcXVpZCAgICAgICAJIjNENEJCNEQ5MDFGNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzE3IgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyODQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjhFIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTgiCi0JCQlxdWlkICAgICAgIAkiM0Q0QzY4RkYwMUJGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTkiCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4IgotCQkJdGl0bGUgICAgICAJIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBANDAwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCA4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBANDAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDAyCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MDAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDkyOCwgMjI1KQotCQkJCSAgICAoOTI4LCAxMzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDQwMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQwNAotCQkJCWxvY2F0aW9uICAgCSgxMjAzLCA3MDYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQwMQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwMywgNzA2KQotCQkJCSAgICAoMTIwMywgNjE1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3MiwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJd2lkdGggICAgICAJNTIyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDA2Ci0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MDUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ0NCwgNzA5KQotCQkJCSAgICAoNDQ0LCA2MTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDA3Ci0JCQkJbG9jYXRpb24gICAJKDE1NzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTcyLCA0NjUpCi0JCQkJICAgICgxNTcyLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0MDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTAsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA0MDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTA1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjYyLCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0MTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM2LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MTEKLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MDkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ1MywgMTIwMykKLQkJCQkgICAgKDQ1MywgMTExMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQxMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDEzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgODAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE0Ci0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDk1MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDEzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxODcyLCA5NTApCi0JCQkJICAgICgxODcyLCA4NTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE1Ci0JCQkJbG9jYXRpb24gICAJKDE4MSwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MTIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4MSwgNDY1KQotCQkJCSAgICAoMTgxLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA0MTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzAsIDEyMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDQxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTA1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA0MTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjksIDE0NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjU2Ci0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDQxOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAzLCAxNDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTU4MQotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA0MjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEwNTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDQyMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA2LCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA0MjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTI5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2LCAxMjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA0MjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANDI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxMjgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEyMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA0MjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAsIDE0NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk2OTQKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDQyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAkzMTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0MjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlANDEwCi0JCQkJc3VwcGxpZXIgICAJQDQwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTQsIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA0MzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDgwMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MzEKLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQzMAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTYyLCA5NDcpCi0JCQkJICAgICg5NjIsIDg1NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzMgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQzMwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE4LCAxMTU0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMTYzNTM0Ci0JCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCWNsaWVudCAgICAgCUA0MjMKLQkJCQlzdXBwbGllciAgIAlANDA1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDksIDcwOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA0MjMKLQkJCQlzdXBwbGllciAgIAlANDA5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDEyMDMpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDExKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlANDI0Ci0JCQkJc3VwcGxpZXIgICAJQDQxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUA0MjIKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDAyLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlANDAzCi0JCQkJc3VwcGxpZXIgICAJQDQwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjksIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OSwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDQyMAotCQkJCXN1cHBsaWVyICAgCUA0MDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkwLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCWNsaWVudCAgICAgCUA0MDgKLQkJCQlzdXBwbGllciAgIAlANDA1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNzA5KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDQyNQotCQkJCXN1cHBsaWVyICAgCUA0MzAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzIxLCAxMjI1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzIxLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDMxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQ0MgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNywgODg2KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMjE1ODEyCi0JCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCWNsaWVudCAgICAgCUA0MTcKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwMCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDQxNwotCQkJCXN1cHBsaWVyICAgCUA0MTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCA5NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlANDA5Ci0JCQkJc3VwcGxpZXIgICAJQDQzMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1MCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDMxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlANDEyCi0JCQkJc3VwcGxpZXIgICAJQDQwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIgotCQkJCWNsaWVudCAgICAgCUA0MjgKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxMiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEyLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEI4MDI4NiIKLQkJCQljbGllbnQgICAgIAlANDA1Ci0JCQkJc3VwcGxpZXIgICAJQDQwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA0MDEKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzUwLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlANDI3Ci0JCQkJc3VwcGxpZXIgICAJQDQwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3MiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzIsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA0MTYKLQkJCQlzdXBwbGllciAgIAlANDEzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MywgMTIyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQotCQkJCWRyYXdTdXBwbGllciAJQDQxNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJY2xpZW50ICAgICAJQDQxOAotCQkJCXN1cHBsaWVyICAgCUA0MDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDYpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQljbGllbnQgICAgIAlANDE5Ci0JCQkJc3VwcGxpZXIgICAJQDQwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDE0MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzEsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUA0MzAKLQkJCQlzdXBwbGllciAgIAlANDAxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTU5LCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDQxMwotCQkJCXN1cHBsaWVyICAgCUA0MDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzIsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA0MjEKLQkJCQlzdXBwbGllciAgIAlANDMwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYyLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjIsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MzEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDU3Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDU2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NSwgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0MjUzMQotCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCQUEyMDMxMCIKLQkJCQljbGllbnQgICAgIAlANDI2Ci0JCQkJc3VwcGxpZXIgICAJQDQxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQxNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDQyNgotCQkJCXN1cHBsaWVyICAgCUA0MDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDE0MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMTIwMykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTEpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzNzRCMTgxOTAwMjgiCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAk5NgotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQ1OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc4NCwgMTYzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDYwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzQiIEA0NjEKLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAxNjI3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNjUzMDE3QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NvcGUiIEA0NjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjEKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzcxMjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIgotCQkJCQljbGllbnQgICAgIAlANDYxCi0JCQkJCXN1cHBsaWVyICAgCUA0NTkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MSwgMTYyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTY2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzUiIEA0NjUKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjEKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkUiCi0JCQkJCWNsaWVudCAgICAgCUA0NjEKLQkJCQkJc3VwcGxpZXIgICAJQDQ2MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI3LCAxNjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBANDY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAxMjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANDY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY2IiBANDY4Ci0JCQkJbG9jYXRpb24gICAJKDIyMjksIDExMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDODkwMTIyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjciIEA0NjkKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjgKLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiCi0JCQkJCWNsaWVudCAgICAgCUA0NjgKLQkJCQkJc3VwcGxpZXIgICAJQDQ2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDcwCi0JCQkJCVBhcmVudF9WaWV3IAlANDY4Ci0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTU3LCAxMTIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Rlcm0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDQ2OAotCQkJCQlzdXBwbGllciAgIAlANDY2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTE3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzQsIDExMTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExOTQwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEA0NzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTQiIEA0NzUKLQkJCQlsb2NhdGlvbiAgIAkoMjIxOSwgODgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNjA2MDI2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU1IiBANDc2Ci0JCQkJCVBhcmVudF9WaWV3IAlANDc1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDQ3NQotCQkJCQlzdXBwbGllciAgIAlANDc0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA4MjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0NzcKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzUKLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTA1LCA4ODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFydGljbGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIyIgotCQkJCQljbGllbnQgICAgIAlANDc1Ci0JCQkJCXN1cHBsaWVyICAgCUA0NjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDkzOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyODEsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzksIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANDgxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDUsIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQ4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDAiIEA0ODMKLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAxIiBANDg0Ci0JCQkJCVBhcmVudF9WaWV3IAlANDgzCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJCWNsaWVudCAgICAgCUA0ODMKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1OTAsIDExNDApCi0JCQkJCSAgICAoNTQwLCAxMTQwKQotCQkJCQkgICAgKDU0MCwgMTA0NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDAsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA0ODUKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODMKLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMDUzNTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANDgzCi0JCQkJCXN1cHBsaWVyICAgCUA0ODIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTkwLCAxMTQwKQotCQkJCQkgICAgKDY0MSwgMTE0MCkKLQkJCQkJICAgICg2NDEsIDEwNDUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQxLCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg0LCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTIyNDQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQ4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgOTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMiIgQDQ4OQotCQkJCWxvY2F0aW9uICAgCSgxMTE5LCAxMTEyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0RGMDI0RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAzIiBANDkwCi0JCQkJCVBhcmVudF9WaWV3IAlANDg5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZEIgotCQkJCQljbGllbnQgICAgIAlANDg5Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMDQ1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudFR5cGUiIEA0OTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODkKLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTksIDExMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkUiCi0JCQkJCWNsaWVudCAgICAgCUA0ODkKLQkJCQkJc3VwcGxpZXIgICAJQDQ3MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDExNzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxMTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA4IiBANDk0Ci0JCQkJbG9jYXRpb24gICAJKDE0NTUsIDk4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQTAxMjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwOSIgQDQ5NQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NAotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MCIKLQkJCQkJY2xpZW50ICAgICAJQDQ5NAotCQkJCQlzdXBwbGllciAgIAlANDg4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjgwLCA5ODIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDQ5NgotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NAotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NSwgOTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYyODU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCQljbGllbnQgICAgIAlANDk0Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzAsIDk4MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTAsIDEwMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0Mjg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDQiIEA0OTkKLQkJCQlsb2NhdGlvbiAgIAkoOTIxLCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDA2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA1IiBANTAwCi0JCQkJCVBhcmVudF9WaWV3IAlANDk5Ci0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0OSIKLQkJCQkJY2xpZW50ICAgICAJQDQ5OQotCQkJCQlzdXBwbGllciAgIAlANDg4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANTAxCi0JCQkJCVBhcmVudF9WaWV3IAlANDk5Ci0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTkzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNEEiCi0JCQkJCWNsaWVudCAgICAgCUA0OTkKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMzcxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc5LCAxMjU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODgzNDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANTA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNzY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTIyLCA3MjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQl3aWR0aCAgICAgIAkzOTgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDUwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTYzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMywgMTU5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDUwNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgNDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODAzLCA0MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1OCIgQDUwNwotCQkJCWxvY2F0aW9uICAgCSgyMjE2LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTkiIEA1MDgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDcKLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4IgotCQkJCQljbGllbnQgICAgIAlANTA3Ci0JCQkJCXN1cHBsaWVyICAgCUA1MDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA1MDkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDcKLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA2MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyNjA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDUwNwotCQkJCQlzdXBwbGllciAgIAlANDc0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU2LCA2MzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzMzY0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA1MTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTksIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4OCIgQDUxMwotCQkJCWxvY2F0aW9uICAgCSgxNjc2LCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4N0JGMDE1MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODkiIEA1MTQKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTMKLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTciCi0JCQkJCWNsaWVudCAgICAgCUA1MTMKLQkJCQkJc3VwcGxpZXIgICAJQDUxMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEzNzEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDUxNQotCQkJCQlQYXJlbnRfVmlldyAJQDUxMwotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NywgMTEwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjI1NzY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBOCIKLQkJCQkJY2xpZW50ICAgICAJQDUxMwotCQkJCQlzdXBwbGllciAgIAlANDgwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTgsIDExMDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NCIgQDUxOAotCQkJCWxvY2F0aW9uICAgCSgxNDI5LCAxNDM4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTlGMDA4NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODUiIEA1MTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTgKLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDY5IgotCQkJCQljbGllbnQgICAgIAlANTE4Ci0JCQkJCXN1cHBsaWVyICAgCUA1MTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjEwLCAxNDM4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDUyMAotCQkJCQlQYXJlbnRfVmlldyAJQDUxOAotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDE1MDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMyNTk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDZBIgotCQkJCQljbGllbnQgICAgIAlANTE4Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ4LCAxNDM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNywgMTM5MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTYzNTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTIiIEA1MjQKLQkJCQlsb2NhdGlvbiAgIAkoNzc3LCAxNDI1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTg1MDEwRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTMiIEA1MjUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjQKLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZBIgotCQkJCQljbGllbnQgICAgIAlANTI0Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NiwgMTQyNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTI2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAxNTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU5MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZCIgotCQkJCQljbGllbnQgICAgIAlANTI0Ci0JCQkJCXN1cHBsaWVyICAgCUA1MjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OCwgMTQyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMSwgMTM4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyNDQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc2IiBANTI5Ci0JCQkJbG9jYXRpb24gICAJKDIzNywgMTIwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2QjAyQ0IiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc3IiBANTMwCi0JCQkJCVBhcmVudF9WaWV3IAlANTI5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE2IgotCQkJCQljbGllbnQgICAgIAlANTI5Ci0JCQkJCXN1cHBsaWVyICAgCUA1MjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTM3MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTMxCi0JCQkJCVBhcmVudF9WaWV3IAlANTI5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODgsIDEyNDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE3IgotCQkJCQljbGllbnQgICAgIAlANTI5Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NSwgMTI0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDUzNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OCwgNzQzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5OCIgQDUzNQotCQkJCWxvY2F0aW9uICAgCSg3MjgsIDc3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNTAzNDAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk5IiBANTM2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhEIgotCQkJCQljbGllbnQgICAgIAlANTM1Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzI4LCA3NzUpCi0JCQkJCSAgICAoNzg4LCA3NzUpCi0JCQkJCSAgICAoNzg4LCA5MzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODgsIDkzOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDUzNwotCQkJCQlQYXJlbnRfVmlldyAJQDUzNQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU4LCA4ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4xNDA5NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhFIgotCQkJCQljbGllbnQgICAgIAlANTM1Ci0JCQkJCXN1cHBsaWVyICAgCUA1MzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcyOCwgNzc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc5LCA3NzUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTAsIDgxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE1MjQzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANTQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTcsIDQwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDAiIEA1NDEKLQkJCQlsb2NhdGlvbiAgIAkoMTYyOSwgNTc0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEMjlFMDE0RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlZEtleSIgQDU0MgotCQkJCQlQYXJlbnRfVmlldyAJQDU0MQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjEsIDYwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2VkS2V5IgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNzk3Mjk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyQTgwMTY1IgotCQkJCQljbGllbnQgICAgIAlANTQxCi0JCQkJCXN1cHBsaWVyICAgCUA1NDAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYyOSwgNTc0KQotCQkJCQkgICAgKDE1NTUsIDU3NCkKLQkJCQkJICAgICgxNTU1LCA1MDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgNTAxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMiwgNTM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDc2MTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MSIgQDU0NQotCQkJCQlQYXJlbnRfVmlldyAJQDU0MQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNkYiCi0JCQkJCWNsaWVudCAgICAgCUA1NDEKLQkJCQkJc3VwcGxpZXIgICAJQDU0MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjI5LCA1NzQpCi0JCQkJCSAgICAoMTY4OSwgNTc0KQotCQkJCQkgICAgKDE2ODksIDQ0NCkKLQkJCQkJICAgICgxNjE2LCA0NDQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxNiwgNDQ0KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDQiIEA1NDYKLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgNjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ1IiBANTQ3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJCWNsaWVudCAgICAgCUA1NDYKLQkJCQkJc3VwcGxpZXIgICAJQDU0MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNTAxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBANTQ4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTksIDY1NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzOTI1MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSIKLQkJCQkJY2xpZW50ICAgICAJQDU0NgotCQkJCQlzdXBwbGllciAgIAlANTA0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUzLCA2NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyOTkwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDIiIEA1NTEKLQkJCQlsb2NhdGlvbiAgIAkoMTQxNSwgNjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQzIiBANTUyCi0JCQkJCVBhcmVudF9WaWV3IAlANTUxCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQkJY2xpZW50ICAgICAJQDU1MQotCQkJCQlzdXBwbGllciAgIAlANTQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA1MDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDU1MwotCQkJCQlQYXJlbnRfVmlldyAJQDU1MQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTMsIDY1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDExMjE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk5OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCQljbGllbnQgICAgIAlANTUxCi0JCQkJCXN1cHBsaWVyICAgCUA1MDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODEsIDY1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzkyNTIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDU1NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDY4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNTk5Ci0JCQkJaGVpZ2h0ICAgICAJMjA5Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg2IiBANTU3Ci0JCQkJbG9jYXRpb24gICAJKDIzOTUsIDYwNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBNzAyM0UiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NyIgQDU1OAotCQkJCQlQYXJlbnRfVmlldyAJQDU1NwotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgMTc0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRUE4MDM4QSIKLQkJCQkJY2xpZW50ICAgICAJQDU1NwotCQkJCQlzdXBwbGllciAgIAlANTU2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzOTUsIDYwNikKLQkJCQkJICAgICgyMzk1LCA2NSkKLQkJCQkJICAgICgxNjExLCA2NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCA2NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm5vdGF0aW9uRGVjbGFyYXRpb25zIiBANTU5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDg5LCAxMDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODk3NzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhCIgotCQkJCQljbGllbnQgICAgIAlANTU3Ci0JCQkJCXN1cHBsaWVyICAgCUA1MDUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM5NSwgNjA2KQotCQkJCQkgICAgKDIzOTUsIDE2MzMpCi0JCQkJCSAgICAoMjA5OCwgMTYzMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk4LCAxNjMzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM0NCwgMTA1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDg3ODI5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MiIgQDU2MgotCQkJCWxvY2F0aW9uICAgCSgxNzcyLCAyNDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFRkYwMjRGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODMiIEA1NjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjIKLQkJCQkJbG9jYXRpb24gICAJKC05NDgsIC0zMjcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVGMDAwMjVBIgotCQkJCQljbGllbnQgICAgIAlANTYyCi0JCQkJCXN1cHBsaWVyICAgCUA1NTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDI0OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyIgQDU2NAotCQkJCQlQYXJlbnRfVmlldyAJQDU2MgotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzYsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzU5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNjQiCi0JCQkJCWNsaWVudCAgICAgCUA1NjIKLQkJCQkJc3VwcGxpZXIgICAJQDUwNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzcyLCAyNDkpCi0JCQkJCSAgICAoMTgzMiwgMjQ5KQotCQkJCQkgICAgKDE4MzIsIDM5NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzcyLCAyNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODMyLCAzOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAzNDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNzg2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzgiIEA1NjcKLQkJCQlsb2NhdGlvbiAgIAkoMjM0NiwgNTE4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTkyMDIxNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc5IiBANTY4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTY3Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3MiwgMTg1NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuNjMwMDcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QiIKLQkJCQkJY2xpZW50ICAgICAJQDU2NwotCQkJCQlzdXBwbGllciAgIAlANTU2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNDYsIDUxOCkKLQkJCQkJICAgICgyMzQ2LCAxNDkpCi0JCQkJCSAgICAoMTYxMSwgMTQ5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDE0OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiIEA1NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjcKLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA4LCAxOTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0OTk0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MzAxOEMiCi0JCQkJCWNsaWVudCAgICAgCUA1NjcKLQkJCQkJc3VwcGxpZXIgICAJQDUxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQ2LCA1MTgpCi0JCQkJCSAgICAoMjM0NiwgMTQ0MSkKLQkJCQkJICAgICgyMTY2LCAxNDQxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNjYsIDE0NDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjk5LCAxOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zNDg4NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgwIiBANTczCi0JCQkJbG9jYXRpb24gICAJKDIwMywgMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDA0OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgxIiBANTc0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTczCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3NCIKLQkJCQkJY2xpZW50ICAgICAJQDU3MwotCQkJCQlzdXBwbGllciAgIAlANTU2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE1OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9ucyIgQDU3NQotCQkJCQlQYXJlbnRfVmlldyAJQDU3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM0OSwgMTk2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQ3NTcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3RSIKLQkJCQkJY2xpZW50ICAgICAJQDU3MwotCQkJCQlzdXBwbGllciAgIAlANTM0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIwMywgMTU5KQotCQkJCQkgICAgKDEwNCwgMTU5KQotCQkJCQkgICAgKDEwNCwgNzg0KQotCQkJCQkgICAgKDE4OSwgNzg0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5LCA3ODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUsIDIwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NzAxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4NCIgQDU3OAotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCAzMjkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMTcwMUVEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODUiIEA1NzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzgKLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExQTAyNzMiCi0JCQkJCWNsaWVudCAgICAgCUA1NzgKLQkJCQkJc3VwcGxpZXIgICAJQDU1NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgMjY0KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEA1ODAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzgKLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzUsIDMzOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwOTUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3RCIKLQkJCQkJY2xpZW50ICAgICAJQDU3OAotCQkJCQlzdXBwbGllciAgIAlANTQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAzOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE4LCAzMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEwNzE0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzYiIEA1ODMKLQkJCQlsb2NhdGlvbiAgIAkoNDgsIDMyMCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQTAwQzMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NyIgQDU4NAotCQkJCQlQYXJlbnRfVmlldyAJQDU4MwotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC0yODgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkIwMjdEIgotCQkJCQljbGllbnQgICAgIAlANTgzCi0JCQkJCXN1cHBsaWVyICAgCUA1NTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDksIDMyMikKLQkJCQkJICAgICg0OSwgNjgpCi0JCQkJCSAgICAoMTAxMywgNjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDksIDMyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDY4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb25zIiBANTg1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTgzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzOCwgMTA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5ODUzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0UiCi0JCQkJCWNsaWVudCAgICAgCUA1ODMKLQkJCQkJc3VwcGxpZXIgICAJQDUyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OSwgMzIyKQotCQkJCQkgICAgKDQ5LCAxNDE1KQotCQkJCQkgICAgKDE3NCwgMTQxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAxNDE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTEsIDEwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5NjcwNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA1ODgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgNDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUsIDQxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTUwMQotCQkJCWhlaWdodCAgICAgCTk3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI2IiBANTg5Ci0JCQkJbG9jYXRpb24gICAJKDQ5OSwgNTg5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlDMDU5MDE5OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI3IiBANTkwCi0JCQkJCVBhcmVudF9WaWV3IAlANTg5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1RDAxRTMiCi0JCQkJCWNsaWVudCAgICAgCUA1ODkKLQkJCQkJc3VwcGxpZXIgICAJQDU4OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OTksIDU4OSkKLQkJCQkJICAgICg0NTIsIDU4OSkKLQkJCQkJICAgICg0NTIsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTksIDU4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MiwgNDk2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIgQDU5MQotCQkJCQlQYXJlbnRfVmlldyAJQDU4OQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzLCAxMDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MTEsIDU4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJNi41MjA4MzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFRCIKLQkJCQkJY2xpZW50ICAgICAJQDU4OQotCQkJCQlzdXBwbGllciAgIAlANTg4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5OSwgNTg5KQotCQkJCQkgICAgKDU0NywgNTg5KQotCQkJCQkgICAgKDU0NywgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQ3LCA0OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0OTksIDU1OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMCIgQDU5NAotCQkJCWxvY2F0aW9uICAgCSgyNDEsIDYxMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAwNTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMSIgQDU5NQotCQkJCQlQYXJlbnRfVmlldyAJQDU5NAotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0JGIgotCQkJCQljbGllbnQgICAgIAlANTk0Ci0JCQkJCXN1cHBsaWVyICAgCUA1ODgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDU5NgotCQkJCQlQYXJlbnRfVmlldyAJQDU5NAotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MDgsIDY5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg2NDQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDNDMCIKLQkJCQkJY2xpZW50ICAgICAJQDU5NAotCQkJCQlzdXBwbGllciAgIAlANTM0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNzMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCA2ODUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxMDE2OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjIiIEA1OTkKLQkJCQlsb2NhdGlvbiAgIAkoODM3LCA0NjApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjMiIEA2MDAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTkKLQkJCQkJbG9jYXRpb24gICAJKC0xODE5LCAtNjgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCQljbGllbnQgICAgIAlANTk5Ci0JCQkJCXN1cHBsaWVyICAgCUA1ODgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNywgNDYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA0NjApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDYwMQotCQkJCQlQYXJlbnRfVmlldyAJQDU5OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgNTI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTE0NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiCi0JCQkJCWNsaWVudCAgICAgCUA1OTkKLQkJCQkJc3VwcGxpZXIgICAJQDU0MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA4LCA0NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDQwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwNDM1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NCIgQDYwNAotCQkJCWxvY2F0aW9uICAgCSg1NDEsIDI0NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RDAxQkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NSIgQDYwNQotCQkJCQlQYXJlbnRfVmlldyAJQDYwNAotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEUwMTk4IgotCQkJCQljbGllbnQgICAgIAlANjA0Ci0JCQkJCXN1cHBsaWVyICAgCUA1NTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMjQ2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9ucyIgQDYwNgotCQkJCQlQYXJlbnRfVmlldyAJQDYwNAotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDMsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDkzMDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTg5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTkiCi0JCQkJCWNsaWVudCAgICAgCUA2MDQKLQkJCQkJc3VwcGxpZXIgICAJQDU4OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1NDEsIDI0NikKLQkJCQkJICAgICgyMjQsIDI0NikKLQkJCQkJICAgICgyMjQsIDQwMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDEsIDI0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNCwgNDAwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjA2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2LCAzMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDY5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjgiIEA2MDkKLQkJCQlsb2NhdGlvbiAgIAkoMzUzLCA2MjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCREQwMjk3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjkiIEA2MTAKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MDkKLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDExRSIKLQkJCQkJY2xpZW50ICAgICAJQDYwOQotCQkJCQlzdXBwbGllciAgIAlANTg4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDM1MywgNjIxKQotCQkJCQkgICAgKDMwNiwgNjIxKQotCQkJCQkgICAgKDMwNiwgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgNjIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA2LCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cCIgQDYxMQotCQkJCQlQYXJlbnRfVmlldyAJQDYwOQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzksIDYzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTQuODA4NTExCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTI4IgotCQkJCQljbGllbnQgICAgIAlANjA5Ci0JCQkJCXN1cHBsaWVyICAgCUA1ODgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzUzLCA2MjEpCi0JCQkJCSAgICAoNDAwLCA2MjEpCi0JCQkJCSAgICAoNDAwLCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDQ5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1MCwgNTgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY5NzY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIgotCQkJcXVpZCAgICAgICAJIjNCNjlFNzg2MDJDNSIKLQkJCXRpdGxlICAgICAgCSIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBANjE0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2LCAxMDcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBuYW1lIDogU3RyaW5nIgotCQkJCQkiKyB0YXJnZXROYW1lc3BhY2UgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk1MzQKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA2MTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU2NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJNTEyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDYxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNjgsIDE2ODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1MjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTE3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1ODQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJMTE3NwotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBkZXJpdmF0aW9uTWV0aG9kIDogWFNERGVyaXZhdGlvbk1ldGhvZCA9IHJlc3RyaWN0aW9uIgotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRENvbXBsZXhGaW5hbCIKLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIgotCQkJCQkiKyBjb250ZW50VHlwZUNhdGVnb3J5IDogWFNEQ29udGVudFR5cGVDYXRlZ29yeSIKLQkJCQkJIjw8MC4uKj4+ICsgcHJvaGliaXRlZFN1YnN0aXR1dGlvbnMgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpKQotCQkJCXdpZHRoICAgICAgCTExOTIKLQkJCQloZWlnaHQgICAgIAkzMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjE3Ci0JCQkJbG9jYXRpb24gICAJKDQ2MywgMzYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2MTQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ2MywgMzYyKQotCQkJCSAgICAoNDYzLCAyMjEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA2MTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAxNjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMTU3OSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk2NDYKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANjE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgMzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCA5OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgcmVxdWlyZWQgOiBib29sZWFuIgotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIgotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQotCQkJCXdpZHRoICAgICAgCTU0OAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDYyMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMTkzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4MzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTI4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4OTApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMTI5NAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkgOiBYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJCSI8PDAuLio+PiArIG5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciCi0JCQkJCSIrIHByb2Nlc3NDb250ZW50cyA6IFhTRFByb2Nlc3NDb250ZW50cyIpKQotCQkJCXdpZHRoICAgICAgCTEzMDQKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDYyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE0NDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCAxMzg0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCXdpZHRoICAgICAgCTU5NgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANjIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA1MTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0OTEpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTU0OAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIgotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQotCQkJCXdpZHRoICAgICAgCTU1NAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MjMKLQkJCQlsb2NhdGlvbiAgIAkoMjk0LCA2OTcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYyMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjk0LCA2OTcpCi0JCQkJICAgICgyOTQsIDYwNSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA2MjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI1NiwgMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTk1LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTU0MAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDYyNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDUxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxOCwgNDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjI2Ci0JCQkJbG9jYXRpb24gICAJKDI2ODQsIDk2MikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjI1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyNjg0LCA5NjIpCi0JCQkJICAgICgyNjg0LCA1NzYpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9zaXRvciIgQDYyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxMTE2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb3NpdG9yIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDEwNjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlCNjIwMDM3IgotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW50IiBANjI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzgsIDQ2OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWludCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODY5RTI2MDFBRSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGVyaXZhdGlvbk1ldGhvZCIgQDYyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAyMjcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMjEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REZXJpdmF0aW9uTWV0aG9kIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4MCwgMjE2MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTBCMDAwQ0UiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IiBANjMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDE3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgMzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NkExRTAwMjcyIgotCQkJCXdpZHRoICAgICAgCTYyNQotCQkJCWhlaWdodCAgICAgCTMwMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb250ZW50VHlwZUNhdGVnb3J5IiBANjMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MDQsIDIyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIxMTUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMDY1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODZBNzlGMDNBMiIKLQkJCQl3aWR0aCAgICAgIAk1MTQKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDYzMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTUxNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTQ2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiCi0JCQkJd2lkdGggICAgICAJMzYyCi0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2Nlc3NDb250ZW50cyIgQDYzMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDIyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMjE1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTA2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGOEM3MDI4NCIKLQkJCQl3aWR0aCAgICAgIAk0MzgKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhWYXJpZXR5IiBANjM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3NjgsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgOTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoVmFyaWV0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGQjg5MDMzQSIKLQkJCQl3aWR0aCAgICAgIAkzODEKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA2MzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAxODcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxNzg4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3MzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxODQ4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBsaXN0IgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgdW5pb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBANjM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMjAwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTk0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTg5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzJDQTAxQ0IiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDIwMDEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzODIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIiBANjM3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDg1LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDEwNzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1OTEwMEFFIgotCQkJCXdpZHRoICAgICAgCTY0OAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDYzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDExMTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTA2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDExNzYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHN1YnN0aXR1dGlvbiIKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDYzOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2NjQsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIyMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjE2MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVCRTAyNzIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIyNzMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkKLQkJCQl3aWR0aCAgICAgIAk1NTAKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IiBANjQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMjI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxNTQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUVBMDAyMyIKLQkJCQl3aWR0aCAgICAgIAk2OTYKLQkJCQloZWlnaHQgICAgIAkyOTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANjQxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI2NCwgODgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDc0OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCA4MDkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMTM5NgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBuaWxsYWJsZSA6IGJvb2xlYW4iCi0JCQkJCSI8PDAuLio+PiArIGRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJCSI8PDAuLio+PiArIHN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyA6IFhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJMTQwNAotCQkJCWhlaWdodCAgICAgCTI4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlANjQxCi0JCQkJc3VwcGxpZXIgICAJQDYyMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4MSwgNzM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODEsIDY5NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANjQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCA4MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ5MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA2NDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCAxMTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDIwLCAxMTAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIgotCQkJCWNsaWVudCAgICAgCUA2NDQKLQkJCQlzdXBwbGllciAgIAlANjI1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg2MiwgMTA4OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg2MiwgOTYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYyNikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA2NDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMzEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTY4LCAxMjYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzODYKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjQ3Ci0JCQkJbG9jYXRpb24gICAJKDIzNzUsIDE0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY0NgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjM3NSwgMTQ2NSkKLQkJCQkgICAgKDIzNzUsIDEzNzUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiCi0JCQkJY2xpZW50ICAgICAJQDY0NgotCQkJCXN1cHBsaWVyICAgCUA2MjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzY4LCAxMjQ5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzY4LCA5NjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlANjE2Ci0JCQkJc3VwcGxpZXIgICAJQDY0NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4MTgsIDE1MTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4MTgsIDE0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjQ3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlANjE4Ci0JCQkJc3VwcGxpZXIgICAJQDY0NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDYsIDE1MDcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDYsIDE0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjQ3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDY1MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTgsIDExMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQljbGllbnQgICAgIAlANjUxCi0JCQkJc3VwcGxpZXIgICAJQDYyNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMTUsIDEwODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDk2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjYpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA2NTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDM0LCA0NjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTEzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTExNTAKLQkJCQloZWlnaHQgICAgIAkxNDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJY2xpZW50ICAgICAJQDY1MwotCQkJCXN1cHBsaWVyICAgCUA2MTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY4LCA0NTYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjgsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA2NTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc4LCA3MDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNTAyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDY1NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMjY4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjg0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIgotCQkJCWNsaWVudCAgICAgCUA2NTUKLQkJCQlzdXBwbGllciAgIAlANjE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI5MCwgNjkxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjkwLCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjE3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyIKLQkJCQljbGllbnQgICAgIAlANjQzCi0JCQkJc3VwcGxpZXIgICAJQDYyMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MSwgODAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEsIDY5NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUA2MjIKLQkJCQlzdXBwbGllciAgIAlANjE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzcyLCA0MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM3MiwgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYxNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDYyNQotCQkJCXN1cHBsaWVyICAgCUA2MTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjg3LCA0NDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2ODcsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTcpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzI2NTAwNUYiCi0JCQl0aXRsZSAgICAgIAkiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIgQDY2MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDg5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzIsIDg0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERml4ZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIKLQkJCQl3aWR0aCAgICAgIAkzMzgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANjYyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgODk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDQsIDg0NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBANjYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY2LCAxMTEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbnVtZXJhdGlvbkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEA2NjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc3LCAxMTEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2NQotCQkJCWxvY2F0aW9uICAgCSg3MTgsIDEwNDkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY2MgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNzE4LCAxMDQ5KQotCQkJCSAgICAoNzE4LCA5NTkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBANjY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5OSwgODcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDY2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCA5MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODMsIDg3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCXdpZHRoICAgICAgCTM4OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBANjY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMzIsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDcsIDEwNDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJd2lkdGggICAgICAJNDY4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDY2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCAxMTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE5LCAxMDQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJd2lkdGggICAgICAJMzg4Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBANjcwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgMTM3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDkxLCAxMzIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCQl3aWR0aCAgICAgIAkzNDgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEA2NzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjA4LCAxNTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MDUsIDE0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCXdpZHRoICAgICAgCTQyNAotCQkJCWhlaWdodCAgICAgCTEzNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NzIKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAxMjYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE0NCwgMTI2MikKLQkJCQkgICAgKDE0NCwgOTY0KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBANjczCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDE1NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDcsIDE0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTEzNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEA2NzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTM3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCAxMzIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJd2lkdGggICAgICAJNDk4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBANjc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTAsIDE2NzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDY3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxOTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAxODUyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhFeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiIEA2NzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIsIDE2NzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5IgotCQkJCXdpZHRoICAgICAgCTQ0NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDY3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDE5MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNCwgMTg1MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEA2NzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MiwgMjA1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVG90YWxEaWdpdHNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDY4MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE4LCAyMDU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzlEMDNDNyIKLQkJCQljbGllbnQgICAgIAlANjYzCi0JCQkJc3VwcGxpZXIgICAJQDY2MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM5NCwgMTEwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzk0LCAxMDQ5KQotCQkJCWRyYXdTdXBwbGllciAJQDY2NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg2MjAwNDUiCi0JCQkJY2xpZW50ICAgICAJQDY3NAotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMzA4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBANjgzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAxNjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjg0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDQTUwMzhEIgotCQkJCWNsaWVudCAgICAgCUA2NjQKLQkJCQlzdXBwbGllciAgIAlANjYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA0NCwgMTEwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0NCwgMTA0OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjg1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3ODAwMkRGIgotCQkJCWNsaWVudCAgICAgCUA2NzAKLQkJCQlzdXBwbGllciAgIAlANjYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYzLCAxMzA4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjMsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjcyKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkIiBANjg2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE0MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEzMjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMjc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTUyMDJFNCIKLQkJCQl3aWR0aCAgICAgIAk0NDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHkiIEA2ODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTY2OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTVEMDA5QiIKLQkJCQl3aWR0aCAgICAgIAk0NDQKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZSIgQDY4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCAyMDMyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2MSwgMTkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQkVFRDBGNjAzNDIiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMjg3Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlZhbHVlIiBANjg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMjA5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDYyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJWYWx1ZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODkKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjAxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0MwNDBCNUIwMzFGIgotCQkJCXdpZHRoICAgICAgCTYzNgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjYxMDMzNyIKLQkJCQljbGllbnQgICAgIAlANjc5Ci0JCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAyMDQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBANjkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAxMzc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzODApCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5MAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpCi0JCQkJd2lkdGggICAgICAJMzA0Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBANjkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTM3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTMyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEzODApCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpCi0JCQkJd2lkdGggICAgICAJMzA2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMjQwMDk4IgotCQkJCWNsaWVudCAgICAgCUA2OTEKLQkJCQlzdXBwbGllciAgIAlANjYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM1LCAxMzA4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzUsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjcyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExRDMxMDNBRCIKLQkJCQljbGllbnQgICAgIAlANjkyCi0JCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODEsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjcyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjUyMDM1MyIKLQkJCQljbGllbnQgICAgIAlANjc3Ci0JCQkJc3VwcGxpZXIgICAJQDY5MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NSwgMTY2NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg1LCAxNDQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4MzAzQjgiCi0JCQkJY2xpZW50ICAgICAJQDY3NQotCQkJCXN1cHBsaWVyICAgCUA2OTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAwLCAxNjY0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAwLCAxNDQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4RTAzMDkiCi0JCQkJY2xpZW50ICAgICAJQDY3NgotCQkJCXN1cHBsaWVyICAgCUA2OTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjIyLCAxODQwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIyLCAxNDQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNDAwQzAiCi0JCQkJY2xpZW50ICAgICAJQDY3MQotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDcsIDE0ODUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCN0QwMEZDIgotCQkJCWNsaWVudCAgICAgCUA2NzMKLQkJCQlzdXBwbGllciAgIAlANjYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM5NywgMTQ4NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM5NywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzAwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOTkwMDE2IgotCQkJCWNsaWVudCAgICAgCUA2ODAKLQkJCQlzdXBwbGllciAgIAlANjYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NSwgMjA0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAzNjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMzE4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0MDYKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANzAyCi0JCQkJbG9jYXRpb24gICAJKDM2NiwgNTIyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA3MDEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDM2NiwgNTIyKQotCQkJCSAgICAoMzY2LCA0MzApKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEA3MDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA2MjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM0LCA1NzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3MDQKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA3ODEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDcwMwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjcyLCA3ODEpCi0JCQkJICAgICgyNzIsIDY4NykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSIKLQkJCQljbGllbnQgICAgIAlANjYyCi0JCQkJc3VwcGxpZXIgICAJQDcwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5NCwgODMzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTQsIDc4MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiIEA3MDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCA2MjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNiwgNTczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGdW5kYW1lbnRhbEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IgotCQkJCXdpZHRoICAgICAgCTQ3MAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3MDcKLQkJCQlsb2NhdGlvbiAgIAkoNzY4LCA3ODkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDcwNgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNzY4LCA3ODkpCi0JCQkJICAgICg3NjgsIDY4NykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjU5MDEyQyIKLQkJCQljbGllbnQgICAgIAlANjY2Ci0JCQkJc3VwcGxpZXIgICAJQDcwNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNTAsIDg2MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1MCwgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDcwNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzYzQzAyMjQiCi0JCQkJY2xpZW50ICAgICAJQDY2NwotCQkJCXN1cHBsaWVyICAgCUA3MDYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTI1LCA4NjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjUsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzEwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NEYwMTMxIgotCQkJCWNsaWVudCAgICAgCUA2NjgKLQkJCQlzdXBwbGllciAgIAlANzA2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzNywgMTAzNikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzNywgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDcwNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0MjAwNzQiCi0JCQkJY2xpZW50ICAgICAJQDY2OQotCQkJCXN1cHBsaWVyICAgCUA3MDYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAxMDM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzA3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDcxMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0NTYsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANzEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCAxMDcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhcmlldHkgOiBYU0RWYXJpZXR5IgotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpCi0JCQkJd2lkdGggICAgICAJNjU2Ci0JCQkJaGVpZ2h0ICAgICAJMjUwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMiIgQDcxMwotCQkJCWxvY2F0aW9uICAgCSg3NzUsIDE3OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3MTAyRUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMyIgQDcxNAotCQkJCQlQYXJlbnRfVmlldyAJQDcxMwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwOSwgMjM1KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMTkiCi0JCQkJCWNsaWVudCAgICAgCUA3MTMKLQkJCQkJc3VwcGxpZXIgICAJQDcwMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzUsIDE3OCkKLQkJCQkJICAgICg1NTAsIDE3OCkKLQkJCQkJICAgICg1NTAsIDMwNikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU1MCwgMzA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2ltcGxlVHlwZURlZmluaXRpb24iIEA3MTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTMKLQkJCQkJbG9jYXRpb24gICAJKC0xMjA5LCAtNDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgzMTMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTA1IgotCQkJCQljbGllbnQgICAgIAlANzEzCi0JCQkJCXN1cHBsaWVyICAgCUA3MTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzE2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MSwgMjE1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTI1MDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk0IiBANzE5Ci0JCQkJbG9jYXRpb24gICAJKDM2OSwgNzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDIwM0E4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldHMiIEA3MjAKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTkKLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA0OTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4NjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTg3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNjUiCi0JCQkJCWNsaWVudCAgICAgCUA3MTkKLQkJCQkJc3VwcGxpZXIgICAJQDcwMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNjksIDcyKQotCQkJCQkgICAgKDEwMCwgNzIpCi0JCQkJCSAgICAoMTAwLCA1NjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMCwgNTYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDQ5OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3OTAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEA3MjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTkKLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzIzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc2LCAzMSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDYwMDUxIgotCQkJCQljbGllbnQgICAgIAlANzE5Ci0JCQkJCXN1cHBsaWVyICAgCUA3MTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2OSwgNzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCA3MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM2IiBANzI1Ci0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDUwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjYKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzgsIDQ0OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk2MAotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNyIgQDcyNwotCQkJCQlQYXJlbnRfVmlldyAJQDcyNQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NiwgMzQwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREYiCi0JCQkJCWNsaWVudCAgICAgCUA3MjUKLQkJCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM4LCA1MDgpCi0JCQkJCSAgICAoMTQ4NywgNTA4KQotCQkJCQkgICAgKDE0ODcsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAyODUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpdGVtVHlwZURlZmluaXRpb24iIEA3MjkKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MjUKLQkJCQkJbG9jYXRpb24gICAJKC00NDYsIDI4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDU3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpdGVtVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4yMTE1MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwRTAiCi0JCQkJCWNsaWVudCAgICAgCUA3MjUKLQkJCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM4LCA1MDgpCi0JCQkJCSAgICAoMTU5MCwgNTA4KQotCQkJCQkgICAgKDE1OTAsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCAyODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA0NjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMzk4NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTYiIEA3MzIKLQkJCQlsb2NhdGlvbiAgIAkoMTcyOSwgNTc0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNEI3MDIwOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk3IiBANzMzCi0JCQkJCVBhcmVudF9WaWV3IAlANzMyCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAzNTMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNEJFMDI1OCIKLQkJCQkJY2xpZW50ICAgICAJQDczMgotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3MjksIDU3NCkKLQkJCQkJICAgICgxNjc4LCA1NzQpCi0JCQkJCSAgICAoMTY3OCwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzgsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIgQDczNQotCQkJCQlQYXJlbnRfVmlldyAJQDczMgotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgMzUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNjU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjI2OTIzMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNEJFMDI1OSIKLQkJCQkJY2xpZW50ICAgICAJQDczMgotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3MjksIDU3NCkKLQkJCQkJICAgICgxNzgxLCA1NzQpCi0JCQkJCSAgICAoMTc4MSwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3ODEsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzAsIDUyMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzEyMTIxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5OCIgQDczOAotCQkJCWxvY2F0aW9uICAgCSg3NDgsIDI2OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzMjAxREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZ1bmRhbWVudGFsRmFjZXRzIiBANzM5Ci0JCQkJCVBhcmVudF9WaWV3IAlANzM4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIzNiwgNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDMxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQwOTA5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNjM1MDA2MyIKLQkJCQkJY2xpZW50ICAgICAJQDczOAotCQkJCQlzdXBwbGllciAgIAlANzA2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc0OCwgMjY5KQotCQkJCQkgICAgKDY1OSwgMjY5KQotCQkJCQkgICAgKDY1OSwgNTYxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU5LCA1NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjgsIDM4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM4MDI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTkiIEA3NDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTIsIDIyOCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDU5IgotCQkJCQljbGllbnQgICAgIAlANzM4Ci0JCQkJCXN1cHBsaWVyICAgCUA3MTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMjY5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDAiIEA3NDQKLQkJCQlsb2NhdGlvbiAgIAkoMTE3NSwgMzk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAxIiBANzQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlANzQ0Ci0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAzMTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSIKLQkJCQkJY2xpZW50ICAgICAJQDc0NAotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzUsIDM5NikKLQkJCQkJICAgICgxMTM1LCAzOTYpCi0JCQkJCSAgICAoMTEzNSwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzUsIDM5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzUsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDc0NwotCQkJCQlQYXJlbnRfVmlldyAJQDc0NAotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgNDQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjUzMzMzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSIKLQkJCQkJY2xpZW50ICAgICAJQDc0NAotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzUsIDM5NikKLQkJCQkJICAgICgxMjE1LCAzOTYpCi0JCQkJCSAgICAoMTIxNSwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzUsIDM5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTUsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzIsIDM1OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5NjE1NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDIiIEA3NTAKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDQ2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1NTcyMDE2QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAzIiBANzUxCi0JCQkJCVBhcmVudF9WaWV3IAlANzUwCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjY4LCAzMjcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDIyRiIKLQkJCQkJY2xpZW50ICAgICAJQDc1MAotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNjAsIDQ0NikKLQkJCQkJICAgICgxMzA5LCA0NDYpCi0JCQkJCSAgICAoMTMwOSwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDksIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIiBANzUzCi0JCQkJCVBhcmVudF9WaWV3IAlANzUwCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjA0LCA1MDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy4wMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyNDMiCi0JCQkJCWNsaWVudCAgICAgCUA3NTAKLQkJCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzYwLCA0NDYpCi0JCQkJCSAgICAoMTQxMiwgNDQ2KQotCQkJCQkgICAgKDE0MTIsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYwLCA0NDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEyLCAyODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzczLCA0MDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MjE0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDc1NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDUxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDI4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDM3OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDQ4OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbGlzdCIKLQkJCQkJIisgcmVzdHJpY3Rpb24iCi0JCQkJCSIrIHVuaW9uIikpCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFZhcmlldHkiIEA3NTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE4LCA5MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM3QjAzOTYiCi0JCQkJY2xpZW50ICAgICAJQDcwNgotCQkJCXN1cHBsaWVyICAgCUA3MDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTEsIDU2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTkxLCA1MjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzAyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc1OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQljbGllbnQgICAgIAlANzAzCi0JCQkJc3VwcGxpZXIgICAJQDcwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3MiwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDUyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5IgotCQkJCWNsaWVudCAgICAgCUA3MDEKLQkJCQlzdXBwbGllciAgIAlANjgzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY2LCAzMDYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NiwgMjE1KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4ODAxQjQiCi0JCQkJY2xpZW50ICAgICAJQDY2MQotCQkJCXN1cHBsaWVyICAgCUA3MDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcsIDgyOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCA3ODEpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjU5MDI4MSIKLQkJCQljbGllbnQgICAgIAlANjc4Ci0JCQkJc3VwcGxpZXIgICAJQDY5MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MCwgMTg0MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwLCAxNDQ0KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjY5RDY4RDAwRDIiCi0JCQl0aXRsZSAgICAgIAkiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDc2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCXdpZHRoICAgICAgCTM1NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDc2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODIsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDc2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDE1MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjYsIDE0NjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDc2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDMwNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2MywgMjYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDc2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEzMTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjA2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDc2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNzA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgNjYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANzY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTE0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANzcwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA1MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA3NzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2OCwgMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDc3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTAsIDExNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3NzMKLQkJCQlsb2NhdGlvbiAgIAkoMTk5NCwgMTQxMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANzcyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxOTk0LCAxNDEyKQotCQkJCSAgICAoMTk5NCwgMTI3MSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc3NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlANzY1Ci0JCQkJc3VwcGxpZXIgICAJQDc3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwODQsIDE0NDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwODQsIDE0MTIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzczKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA3NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAsIDgyMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDc3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODkyLCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDc3NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NCwgMzQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA3NzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDE4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANzc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc5MiwgMTcxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2NywgMTY3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTY2OQotCQkJCWhlaWdodCAgICAgCTEwMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzgwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA3NzkKLQkJCQlzdXBwbGllciAgIAlANzcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU3MiwgMTY2MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU3MiwgMTQxMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3NzMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA3ODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEwMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc4LCA5ODEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANzgyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzgyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg4LCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIKLQkJCQl3aWR0aCAgICAgIAk0NTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA3ODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE1MzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDcxLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBANzg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzIsIDY4NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAk3MzgKLQkJCQloZWlnaHQgICAgIAk1NDMKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzgiIEA3ODUKLQkJCQlsb2NhdGlvbiAgIAkoODY1LCAxMzU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDE4MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM5IiBANzg2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzg1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCA1NTkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzNDIgotCQkJCQljbGllbnQgICAgIAlANzg1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2NSwgMTM1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY3MSwgMTM1OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3ODcKLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODUKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5OCwgMTMyMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuMTE2NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzQ2IgotCQkJCQljbGllbnQgICAgIAlANzg1Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODY1LCAxMzU5KQotCQkJCQkgICAgKDkyNSwgMTM1OSkKLQkJCQkJICAgICg5MjUsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMjc2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDY0MjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYyIiBANzkwCi0JCQkJbG9jYXRpb24gICAJKDcxMywgNzA5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBGMDIxMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYzIiBANzkxCi0JCQkJCVBhcmVudF9WaWV3IAlANzkwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTAwMEM5IgotCQkJCQljbGllbnQgICAgIAlANzkwCi0JCQkJCXN1cHBsaWVyICAgCUA3NjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxMywgNzA5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA3MDkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzkyCi0JCQkJCVBhcmVudF9WaWV3IAlANzkwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDY2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTUyMzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwRDMiCi0JCQkJCWNsaWVudCAgICAgCUA3OTAKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDcwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5NiwgNzUzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTM1NzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU2IiBANzk1Ci0JCQkJbG9jYXRpb24gICAJKDcxOSwgMTE5MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNTAwOEEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NyIgQDc5NgotCQkJCQlQYXJlbnRfVmlldyAJQDc5NQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwMSwgMzkzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE2MDA5NiIKLQkJCQkJY2xpZW50ICAgICAJQDc5NQotCQkJCQlzdXBwbGllciAgIAlANzY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDExOTMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzk3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzk1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjAsIDExNDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDA2OTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMEEwIgotCQkJCQljbGllbnQgICAgIAlANzk1Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgMTE5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNiwgMTI0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA0MTY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNiIgQDgwMAotCQkJCWxvY2F0aW9uICAgCSg3ODUsIDU1MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQTAwNjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNyIgQDgwMQotCQkJCQlQYXJlbnRfVmlldyAJQDgwMAotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyM0YiCi0JCQkJCWNsaWVudCAgICAgCUA4MDAKLQkJCQkJc3VwcGxpZXIgICAJQDc3MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDU1MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDAKLQkJCQkJbG9jYXRpb24gICAJKC0zMzUsIC0yNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzksIDUxNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDcwNzA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEIwMjQ5IgotCQkJCQljbGllbnQgICAgIAlAODAwCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzg1LCA1NTApCi0JCQkJCSAgICAoODg0LCA1NTApCi0JCQkJCSAgICAoODg0LCA2NzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODQsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzNSwgNjEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjk3MzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg4IiBAODA1Ci0JCQkJbG9jYXRpb24gICAJKDExODQsIDQwNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NjAyOTAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4OSIgQDgwNgotCQkJCQlQYXJlbnRfVmlldyAJQDgwNQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2NSIKLQkJCQkJY2xpZW50ICAgICAJQDgwNQotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCAxMzUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDgwNwotCQkJCQlQYXJlbnRfVmlldyAJQDgwNQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNCwgMjI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNjY1NDI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2RiIKLQkJCQkJY2xpZW50ICAgICAJQDgwNQotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4NDM4NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDQiIEA4MTAKLQkJCQlsb2NhdGlvbiAgIAkoMTc1MiwgMTAzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MTAxNTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNSIgQDgxMQotCQkJCQlQYXJlbnRfVmlldyAJQDgxMAotCQkJCQlsb2NhdGlvbiAgIAkoNTM2LCAyMTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTIwMTlGIgotCQkJCQljbGllbnQgICAgIAlAODEwCi0JCQkJCXN1cHBsaWVyICAgCUA3NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTc1MiwgMTAzNCkKLQkJCQkJICAgICgxODEyLCAxMDM0KQotCQkJCQkgICAgKDE4MTIsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDExNjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODEyCi0JCQkJCVBhcmVudF9WaWV3IAlAODEwCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDMsIDk5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk2MDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxQTkiCi0JCQkJCWNsaWVudCAgICAgCUA4MTAKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDEwMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg0LCAxMDY2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTAzMzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA2IiBAODE1Ci0JCQkJbG9jYXRpb24gICAJKDE4OTYsIDg4MSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZDRjAwODgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNyIgQDgxNgotCQkJCQlQYXJlbnRfVmlldyAJQDgxNQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCA0MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZEMTAxNUQiCi0JCQkJCWNsaWVudCAgICAgCUA4MTUKLQkJCQkJc3VwcGxpZXIgICAJQDc3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxODk2LCA4ODEpCi0JCQkJCSAgICAoMTk1NiwgODgxKQotCQkJCQkgICAgKDE5NTYsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1NiwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRlcml2YXRpb25Bbm5vdGF0aW9uIiBAODE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE1Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgODQyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzkwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Rlcml2YXRpb25Bbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTQyMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZEMTAxNjciCi0JCQkJCWNsaWVudCAgICAgCUA4MTUKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgODgxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OSwgOTE0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDUwODUKLQkJCQkJICAgIGhlaWdodCAgICAgCTMzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA4IiBAODIwCi0JCQkJbG9jYXRpb24gICAJKDIwNDAsIDcxNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzMzAyNjQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwOSIgQDgyMQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMAotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjg0IgotCQkJCQljbGllbnQgICAgIAlAODIwCi0JCQkJCXN1cHBsaWVyICAgCUA3NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjA0MCwgNzE1KQotCQkJCQkgICAgKDIxMDAsIDcxNSkKLQkJCQkJICAgICgyMTAwLCAxMTYxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDAsIDExNjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDgyMgotCQkJCQlQYXJlbnRfVmlldyAJQDgyMAotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA2ODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzE5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4RSIKLQkJCQkJY2xpZW50ICAgICAJQDgyMAotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQwLCA3MTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg1LCA3NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwOTMxMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjYiIEA4MjUKLQkJCQlsb2NhdGlvbiAgIAkoNjY4LCA4NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzQwMDRGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjciIEA4MjYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjUKLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBDQSIKLQkJCQkJY2xpZW50ICAgICAJQDgyNQotCQkJCQlzdXBwbGllciAgIAlANzc1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3MywgODY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgyNwotCQkJCQlQYXJlbnRfVmlldyAJQDgyNQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTQsIDgyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzQxNDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNjAwRDQiCi0JCQkJCWNsaWVudCAgICAgCUA4MjUKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDg2NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMSwgOTAzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODIwNTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMwIiBAODMwCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDE2NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCOTAxQ0QiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMSIgQDgzMQotCQkJCQlQYXJlbnRfVmlldyAJQDgzMAotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDNCIKLQkJCQkJY2xpZW50ICAgICAJQDgzMAotCQkJCQlzdXBwbGllciAgIAlANzc2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NzIsIDE2NykKLQkJCQkJICAgICgxNDcyLCA3MikKLQkJCQkJICAgICgxODgzLCA3MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODgzLCA3MikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MzIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzAKLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDEyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDc2MzA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDRSIKLQkJCQkJY2xpZW50ICAgICAJQDgzMAotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE5LCA2MTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MzU3NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MCIgQDgzNQotCQkJCWxvY2F0aW9uICAgCSg5MjcsIDM1MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNjAyOTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgxIiBAODM2Ci0JCQkJCVBhcmVudF9WaWV3IAlAODM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MSIKLQkJCQkJY2xpZW50ICAgICAJQDgzNQotCQkJCQlzdXBwbGllciAgIAlANzc3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYyOSwgMzUwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgzNwotCQkJCQlQYXJlbnRfVmlldyAJQDgzNQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5MywgLTQ1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMzEwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC44MTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNzAxNzIiCi0JCQkJCWNsaWVudCAgICAgCUA4MzUKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MjcsIDM1MCkKLQkJCQkJICAgICg5ODcsIDM1MCkKLQkJCQkJICAgICg5ODcsIDY3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4NywgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNywgNjEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDMzNDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzIiIEA4NDAKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNywgMjIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQURDMDJGNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzMiIEA4NDEKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDAKLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REFERDAyMzgiCi0JCQkJCWNsaWVudCAgICAgCUA4NDAKLQkJCQkJc3VwcGxpZXIgICAJQDc3OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCAyMjIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODQyCi0JCQkJCVBhcmVudF9WaWV3IAlAODQwCi0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDAzLCAxODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQwNjI1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDI0MiIKLQkJCQkJY2xpZW50ICAgICAJQDg0MAotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwMjcsIDIyMikKLQkJCQkJICAgICgxMDg3LCAyMjIpCi0JCQkJCSAgICAoMTA4NywgNjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjcsIDIyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDYxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MjU4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5NiIgQDg0NQotCQkJCWxvY2F0aW9uICAgCSgxNDk0LCAxNDM4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOTAwNjg4MDFDMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTciIEA4NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDUKLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDg0NQotCQkJCQlzdXBwbGllciAgIAlANzc5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTY2MikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRBbm5vdGF0aW9uIiBAODQ3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTYsIDEzNTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudEFubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzcxMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMUIiCi0JCQkJCWNsaWVudCAgICAgCUA4NDUKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTQsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQzLCAxMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTMwMDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUwIiBAODUwCi0JCQkJbG9jYXRpb24gICAJKDYzNywgMTAyMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNzAyQzgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MSIgQDg1MQotCQkJCQlQYXJlbnRfVmlldyAJQDg1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4MywgMjIyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE4MDNFMiIKLQkJCQkJY2xpZW50ICAgICAJQDg1MAotCQkJCQlzdXBwbGllciAgIAlANzgxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTEsIDEwMjIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODUyCi0JCQkJCVBhcmVudF9WaWV3IAlAODUwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTAsIDk3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg4ODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxOTAwMDQiCi0JCQkJCWNsaWVudCAgICAgCUA4NTAKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM3LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMDYyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzAwODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzAiIEA4NTUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4MSwgNjA3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUE3MDEwMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzEiIEA4NTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTUKLQkJCQkJbG9jYXRpb24gICAJKDMwMSwgLTIyNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTEiCi0JCQkJCWNsaWVudCAgICAgCUA4NTUKLQkJCQkJc3VwcGxpZXIgICAJQDc4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTgxLCA2MDcpCi0JCQkJCSAgICAoMTU4MSwgNTQ3KQotCQkJCQkgICAgKDE2NzksIDU0NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCA2MDcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc5LCA1NDcpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg1NwotCQkJCQlQYXJlbnRfVmlldyAJQDg1NQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2OSwgNDYyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMTk2OTcwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTkwMTkyIgotCQkJCQljbGllbnQgICAgIAlAODU1Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODEsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDYyMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTk2OTcwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxMCIgQDg2MAotCQkJCWxvY2F0aW9uICAgCSg4NDksIDE0OTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTEwMjZGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTEiIEA4NjEKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjAKLQkJCQkJbG9jYXRpb24gICAJKC0yNzEsIDY5NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMjAxRjkiCi0JCQkJCWNsaWVudCAgICAgCUA4NjAKLQkJCQkJc3VwcGxpZXIgICAJQDc4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNDk2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg2MgotCQkJCQlQYXJlbnRfVmlldyAJQDg2MAotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQyLCAxNDY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4ODI1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDIwMyIKLQkJCQkJY2xpZW50ICAgICAJQDg2MAotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDg0OSwgMTQ5NikKLQkJCQkJICAgICgxMDYyLCAxNDk2KQotCQkJCQkgICAgKDEwNjIsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2MiwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTUsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjY5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTIiIEA4NjUKLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCAxNTY1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUIzMDAwNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEzIiBAODY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAODY1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjQwMzI3IgotCQkJCQljbGllbnQgICAgIAlAODY1Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTU2NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODY3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODY1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCAxNTM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDQ5NTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMzIiCi0JCQkJCWNsaWVudCAgICAgCUA4NjUKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE1NjUpCi0JCQkJCSAgICAoMTIwMCwgMTU2NSkKLQkJCQkJICAgICgxMjAwLCAxMjE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDAsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU0LCAxMjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiCi0JCQkJY2xpZW50ICAgICAJQDc2NgotCQkJCXN1cHBsaWVyICAgCUA3NzYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTg0LCAyNDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5ODQsIDEzNSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCWNsaWVudCAgICAgCUA3ODIKLQkJCQlzdXBwbGllciAgIAlANzY2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk5NywgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTk3LCAzNTkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNi4gQ29uY3JldGUgQ29tcG9uZW50cyIKLQkJCXF1aWQgICAgICAgCSIzQjZBRDc0RDAzQzQiCi0JCQl0aXRsZSAgICAgIAkiNi4gQ29uY3JldGUgQ29tcG9uZW50cyIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA4NzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEA4NzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTY4LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQl3aWR0aCAgICAgIAk1NDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IiBAODc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIwMCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5OTEsIDYyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAODc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTU2LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiCi0JCQkJd2lkdGggICAgICAJNDI2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg3NgotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA1NjEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg3NQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTM2MCwgNTYxKQotCQkJCSAgICAoMTM2MCwgNDcxKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiIEA4NzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxMTU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbmNsdWRlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIgotCQkJCXdpZHRoICAgICAgCTI1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDg3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDg3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDUsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA4ODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzc1LCAxMTUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTg2OQotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0OCIgQDg4MQotCQkJCWxvY2F0aW9uICAgCSgxMzY4LCAxMjA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M1MDA3RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ5IiBAODgyCi0JCQkJCVBhcmVudF9WaWV3IAlAODgxCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzYwMDZCIgotCQkJCQljbGllbnQgICAgIAlAODgxCi0JCQkJCXN1cHBsaWVyICAgCUA4NzcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDEyMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg4MwotCQkJCQlQYXJlbnRfVmlldyAJQDg4MQotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODgzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0NywgMTE1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTQ0MTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkMiCi0JCQkJCWNsaWVudCAgICAgCUA4ODEKLQkJCQkJc3VwcGxpZXIgICAJQDg4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzQsIDEyMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzAwLCAxMjUzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA3Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE0NzA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NiIgQDg4NgotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q4MDJGQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ3IiBAODg3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODg2Ci0JCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIyMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEIiCi0JCQkJCWNsaWVudCAgICAgCUA4ODYKLQkJCQkJc3VwcGxpZXIgICAJQDg3OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTY4LCAxMDIyKQotCQkJCQkgICAgKDExNjgsIDk2MikKLQkJCQkJICAgICgxMjg1LCA5NjIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODUsIDk2MikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4ODgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODYKLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5MCwgMTA3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDUzNzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDkwMThDIgotCQkJCQljbGllbnQgICAgIAlAODg2Ci0JCQkJCXN1cHBsaWVyICAgCUA4ODAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTY4LCAxMTQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyNywgMTA3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM2OTc1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2OCIgQDg5MQotCQkJCWxvY2F0aW9uICAgCSgxNTYzLCAxMzUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFERTQyMDA5QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY5IiBAODkyCi0JCQkJCVBhcmVudF9WaWV3IAlAODkxCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMkZFIgotCQkJCQljbGllbnQgICAgIAlAODkxCi0JCQkJCXN1cHBsaWVyICAgCUA4NzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU2MywgMTM1MykKLQkJCQkJICAgICgxOTQwLCAxMzUzKQotCQkJCQkgICAgKDE5NDAsIDEyNTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NDAsIDEyNTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg5MwotCQkJCQlQYXJlbnRfVmlldyAJQDg5MQotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgMTMyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE2ODA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMzA4IgotCQkJCQljbGllbnQgICAgIAlAODkxCi0JCQkJCXN1cHBsaWVyICAgCUA4ODAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU2MywgMTM1MykKLQkJCQkJICAgICgxMTgxLCAxMzUzKQotCQkJCQkgICAgKDExODEsIDEyNTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODEsIDEyNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTMwLCAxMzI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjEzNDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODk2Ci0JCQkJbG9jYXRpb24gICAJKDI4OCwgNTYxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI4OCwgNTYxKQotCQkJCSAgICAoMjg4LCA0NzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA4OTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYwLCA2MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJCXdpZHRoICAgICAgCTQ3NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiIEA4OTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTgsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IgotCQkJCXdpZHRoICAgICAgCTQxNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDg5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgOTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NTAsIDkxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAOTAwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMCwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiCi0JCQkJY2xpZW50ICAgICAJQDkwMAotCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjEsIDYxNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxLCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODk2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyIKLQkJCQljbGllbnQgICAgIAlAODk3Ci0JCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU4OSwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODksIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTAzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCWNsaWVudCAgICAgCUA4NzQKLQkJCQlzdXBwbGllciAgIAlAODc1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAxNiwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDE2LCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODc2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAOTA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTkwLCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkwNQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCAxMDg5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5MDQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4MjQsIDEwODkpCi0JCQkJICAgICgxODI0LCA5OTkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEQzAzODEiCi0JCQkJY2xpZW50ICAgICAJQDg3NwotCQkJCXN1cHBsaWVyICAgCUA5MDQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY2LCAxMTQ1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY2LCAxMDg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkwNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJY2xpZW50ICAgICAJQDg3OQotCQkJCXN1cHBsaWVyICAgCUA5MDQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM0LCAxMTQ1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTM0LCAxMDg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkwNSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTA4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzAsIDYyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCXdpZHRoICAgICAgCTQzOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkwOQotCQkJCWxvY2F0aW9uICAgCSgxNzYyLCA4MTkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDkwOAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTc2MiwgODE5KQotCQkJCSAgICAoMTc2MiwgNzI3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTEwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCWNsaWVudCAgICAgCUA4NzgKLQkJCQlzdXBwbGllciAgIAlAOTA4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNiwgODg5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE2LCA4MTkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiIKLQkJCQljbGllbnQgICAgIAlAOTA4Ci0JCQkJc3VwcGxpZXIgICAJQDg3NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTYsIDYxNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1NiwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDg3NikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5MTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTEzCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDI4OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTEyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMTIwLCAyODkpCi0JCQkJICAgICgxMTIwLCAxOTkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEwIiBAOTE0Ci0JCQkJbG9jYXRpb24gICAJKDE0ODUsIDIxNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwODAzQzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRhaW5lciIgQDkxNQotCQkJCQlQYXJlbnRfVmlldyAJQDkxNAotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAyMTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGFpbmVyIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzMxMTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNFIgotCQkJCQljbGllbnQgICAgIAlAOTE0Ci0JCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQotCQkJCQkgICAgKDE0ODUsIDE3NikKLQkJCQkJICAgICgxMzc0LCAxNzYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3NCwgMTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzNSwgMjI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDI2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMSIgQDkxOAotCQkJCQlQYXJlbnRfVmlldyAJQDkxNAotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNGIgotCQkJCQljbGllbnQgICAgIAlAOTE0Ci0JCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQotCQkJCQkgICAgKDE0ODUsIDI1NCkKLQkJCQkJICAgICgxMzQ1LCAyNTQpCi0JCQkJCSAgICAoMTM0NSwgMTk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNDUsIDE5OSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEyIiBAOTE5Ci0JCQkJbG9jYXRpb24gICAJKDc3MywgMjE2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjQ4MDI2MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdENvbnRhaW5lciIgQDkyMAotCQkJCQlQYXJlbnRfVmlldyAJQDkxOQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMjE3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RDb250YWluZXIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjUwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTE2MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg1IgotCQkJCQljbGllbnQgICAgIAlAOTE5Ci0JCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzczLCAyMTYpCi0JCQkJCSAgICAoNzczLCAxNzYpCi0JCQkJCSAgICAoODY2LCAxNzYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTMiIEA5MjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MTkKLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg2IgotCQkJCQljbGllbnQgICAgIAlAOTE5Ci0JCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzczLCAyMTYpCi0JCQkJCSAgICAoNzczLCAyNTcpCi0JCQkJCSAgICAoODk1LCAyNTcpCi0JCQkJCSAgICAoODk1LCAxOTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTUsIDE5OSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MjQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiCi0JCQkJY2xpZW50ICAgICAJQDg3NQotCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY3LCAzNjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjcsIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTI1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ4RTIwMEVBIgotCQkJCWNsaWVudCAgICAgCUA4NzMKLQkJCQlzdXBwbGllciAgIAlAOTEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUyLCAzNjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MiwgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkxMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MjYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiCi0JCQkJY2xpZW50ICAgICAJQDg3MgotCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTksIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk5LCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTEzKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA5MjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MjgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiCi0JCQkJY2xpZW50ICAgICAJQDkyNwotCQkJCXN1cHBsaWVyICAgCUA5MDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTYsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNiwgNzI3KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI0IiBAOTI5Ci0JCQkJbG9jYXRpb24gICAJKDEzODIsIDE0MjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjUiIEA5MzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjkKLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiCi0JCQkJCWNsaWVudCAgICAgCUA5MjkKLQkJCQkJc3VwcGxpZXIgICAJQDkwNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzgyLCAxNDI1KQotCQkJCQkgICAgKDIxNDcsIDE0MjUpCi0JCQkJCSAgICAoMjE0NywgOTQzKQotCQkJCQkgICAgKDIwNjcsIDk0MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NywgOTQzKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAOTMxCi0JCQkJCVBhcmVudF9WaWV3IAlAOTI5Ci0JCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAyMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDUsIDEzODkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDY1NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiCi0JCQkJCWNsaWVudCAgICAgCUA5MjkKLQkJCQkJc3VwcGxpZXIgICAJQDkyNwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzgyLCAxNDI1KQotCQkJCQkgICAgKDIyNSwgMTQyNSkKLQkJCQkJICAgICgyMjUsIDEyNTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNSwgMTI1NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk2OTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMiIgQDkzNAotCQkJCWxvY2F0aW9uICAgCSgxNTA1LCAxNTAzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQ0M3MDBFQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIzIiBAOTM1Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTM0Ci0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQyIgotCQkJCQljbGllbnQgICAgIAlAOTM0Ci0JCQkJCXN1cHBsaWVyICAgCUA5MDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUwNSwgMTUwMykKLQkJCQkJICAgICgyMTg4LCAxNTAzKQotCQkJCQkgICAgKDIxODgsIDY3NSkKLQkJCQkJICAgICgyMDU5LCA2NzUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTksIDY3NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAOTM2Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTM0Ci0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDMsIDE0NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMzMzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQkJY2xpZW50ICAgICAJQDkzNAotCQkJCQlzdXBwbGllciAgIAlAOTI3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MDUsIDE1MDMpCi0JCQkJCSAgICAoMTEzLCAxNTAzKQotCQkJCQkgICAgKDExMywgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzLCAxMjU1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTM2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE0NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NzY4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTQiIEA5MzkKLQkJCQlsb2NhdGlvbiAgIAkoNjYsIDI0NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMTAzNTYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNSIgQDk0MAotCQkJCQlQYXJlbnRfVmlldyAJQDkzOQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQzMzMDMzMSIKLQkJCQkJY2xpZW50ICAgICAJQDkzOQotCQkJCQlzdXBwbGllciAgIAlAOTEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY2LCAyNDQpCi0JCQkJCSAgICAoNjYsIDE0NCkKLQkJCQkJICAgICg4NjYsIDE0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NiwgMjQ0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxNDQpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEA5NDEKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MzkKLQkJCQkJbG9jYXRpb24gICAJKC05NCwgLTQ0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NSwgOTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTY4MTEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzNCIgotCQkJCQljbGllbnQgICAgIAlAOTM5Ci0JCQkJCXN1cHBsaWVyICAgCUA5MjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NiwgMTE0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNiwgMTg0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTEzCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2NjU5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzgwQkQ5MDA1OSIKLQkJCQljbGllbnQgICAgIAlAODk4Ci0JCQkJc3VwcGxpZXIgICAJQDkxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTksIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1OSwgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkxMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiCi0JCQkJY2xpZW50ICAgICAJQDg4MAotCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MDAsIDExNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDg5NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTQ2Ci0JCQkJbG9jYXRpb24gICAJKDEwMTIsIDgzNykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODc0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMDEyLCA4MzcpCi0JCQkJICAgICgxMDEyLCA3MjcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDcKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5NDgKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzEsIDg3MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4ODE1OAotCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEUyMDM2NiIKLQkJCQljbGllbnQgICAgIAlAODgwCi0JCQkJc3VwcGxpZXIgICAJQDg3NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzcsIDExNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMzcsIDgzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ5Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTUwCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTAsIDg2NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4MTYzMwotCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEJBMDIzQyIKLQkJCQljbGllbnQgICAgIAlAODk5Ci0JCQkJc3VwcGxpZXIgICAJQDg3NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNSwgOTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDgzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCWNsaWVudCAgICAgCUA5MDQKLQkJCQlzdXBwbGllciAgIAlAOTA4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyOCwgODg5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI4LCA4MTkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA5KSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNy4gQ29uY3JldGUgQXR0cmlidXRlcyIKLQkJCXF1aWQgICAgICAgCSIzQjlGOEY3NjAyQzciCi0JCQl0aXRsZSAgICAgIAkiNy4gQ29uY3JldGUgQXR0cmlidXRlcyIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAOTUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMTQ0MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzOCwgMTM1OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzOCwgMTQxOSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGZvcm0gOiBYU0RGb3JtIgotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk0MzAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERm9ybSIgQDk1MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYwLCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzY1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGb3JtIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTMxNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjlGOTEzQjAxRUIiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAOTU0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCA5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDk3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudCA6IERPTUVsZW1lbnQiKSkKLQkJCQl3aWR0aCAgICAgIAk2NzUKLQkJCQloZWlnaHQgICAgIAkxNDMKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA5NTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAzODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NywgMzMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA5NTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgOTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjc4LCA4OTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJCXdpZHRoICAgICAgCTQ3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDk1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDE0MDgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDEzNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDk1OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NjQsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA1NzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI1NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NTkKLQkJCQlsb2NhdGlvbiAgIAkoODUwLCA1MzcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk1NQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoODUwLCA1MzcpCi0JCQkJICAgICg4NTAsIDQ0NykpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01FbGVtZW50IiBAOTYwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyNDgsIDEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRWxlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNCODE4OTc5MDIwMCIKLQkJCQl3aWR0aCAgICAgIAk3NjkKLQkJCQloZWlnaHQgICAgIAkyMDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNjQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNTg0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNTEyCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDk2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDMzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTYzCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjYzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NTQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDM2OCwgMjYzKQotCQkJCSAgICAoMzY4LCAxNjcpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA5NjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTM0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEyOTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDE0MDcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHN1YnN0aXR1dGlvbiIKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgYWxsIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBAOTY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3MDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNjU4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzY4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyBhbGwiKSkKLQkJCQl3aWR0aCAgICAgIAk1NTAKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA5NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjEwMCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk3NzgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA5NjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDk2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTQ0LCAyMDE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxOTMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxODgyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQl3aWR0aCAgICAgIAkzODIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTI3OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTMzOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk2MzAKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdXNlIDogWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTY0MAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIgQDk3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2MzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTQ4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNDk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCQTdCMEU4MDFBOCIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDk3MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjA4LCA5MjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0OTgsIDg4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCQl3aWR0aCAgICAgIAkyMzgKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA5NzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQwLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTk2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2OTEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJOTczCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJOTg0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAOTczCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTA5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDExNTYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODg4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJOTA2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDk3NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MjIsIDc3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk5OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTEwMTQKLQkJCQloZWlnaHQgICAgIAk0ODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAOTc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgOTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNywgOTA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA5NzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA2NTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDYwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDY2MCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA5NzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAxOTQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDIwMDIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJODcwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRENvbXBsZXhGaW5hbCIKLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIisgbWl4ZWQgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODc4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAOTc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0ODgsIDE2OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDE2NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAOTc4Ci0JCQkJc3VwcGxpZXIgICAJQDk1NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDYsIDE2MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDYsIDE0NzIpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAOTgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyMDgsIDcwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNTk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTkwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTkxOAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlAOTcxCi0JCQkJc3VwcGxpZXIgICAJQDk1NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2OTYsIDg2OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NiwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDk3MgotCQkJCXN1cHBsaWVyICAgCUA5NTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDk0LCAxNjE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk0LCAxNTMzKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTgzCi0JCQkJbG9jYXRpb24gICAJKDE0ODcsIDE4NTYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk3OAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ4NywgMTg1NikKLQkJCQkgICAgKDE0ODcsIDE3NjApKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NQXR0ciIgQDk4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAwLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDM1MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NQXR0ciIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDMwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JCRjhDODkwMUI2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlAOTc3Ci0JCQkJc3VwcGxpZXIgICAJQDk3OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzQsIDE5MzApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MzQsIDE4NTYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTgzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSIKLQkJCQljbGllbnQgICAgIAlAOTc2Ci0JCQkJc3VwcGxpZXIgICAJQDk1NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDU4OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiCi0JCQkJY2xpZW50ICAgICAJQDk4MAotCQkJCXN1cHBsaWVyICAgCUA5NTUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTkwLCA1ODYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA5NjEKLQkJCQlzdXBwbGllciAgIAlAOTYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyLCA1NzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMiwgNDQ3KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiCi0JCQkJY2xpZW50ICAgICAJQDk2MgotCQkJCXN1cHBsaWVyICAgCUA5NTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAsIDMyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwLCAyNjMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTYzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSIKLQkJCQljbGllbnQgICAgIAlAOTc1Ci0JCQkJc3VwcGxpZXIgICAJQDk2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMywgODkyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjMsIDcwOCkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTkxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCWNsaWVudCAgICAgCUA5NzMKLQkJCQlzdXBwbGllciAgIAlAOTcxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwMCwgMTA4NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMCwgOTg3KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRG9jdW1lbnQiIEA5OTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA5NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRG9jdW1lbnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg1MEUwMzgxIgotCQkJCXdpZHRoICAgICAgCTc3NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQljbGllbnQgICAgIAlAOTU1Ci0JCQkJc3VwcGxpZXIgICAJQDk1NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgMzIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDI2MykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEA5OTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTk0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzNTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTk0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2NEE1MDExNyIKLQkJCQl3aWR0aCAgICAgIAk2ODYKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiCi0JCQkJY2xpZW50ICAgICAJQDk1OAotCQkJCXN1cHBsaWVyICAgCUA5NTUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTAsIDU2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODUwLCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlAOTY5Ci0JCQkJc3VwcGxpZXIgICAJQDk1NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMTI2NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyIKLQkJCQljbGllbnQgICAgIAlAOTU2Ci0JCQkJc3VwcGxpZXIgICAJQDk1NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTQsIDg4MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5NCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiCi0JCQkJY2xpZW50ICAgICAJQDk3NAotCQkJCXN1cHBsaWVyICAgCUA5NTgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDc2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCA2ODcpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5OTkKLQkJCQlsb2NhdGlvbiAgIAkoMTcwMywgMTI5MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTU2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzAzLCAxMjkwKQotCQkJCSAgICAoMTcwMywgMTAwOCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDk1NwotCQkJCXN1cHBsaWVyICAgCUA5NTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAzLCAxMzQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjkwKQotCQkJCWRyYXdTdXBwbGllciAJQDk5OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUA5NTIKLQkJCQlzdXBwbGllciAgIAlAOTU2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTM0NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMTI5MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlAOTY2Ci0JCQkJc3VwcGxpZXIgICAJQDk3OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTMsIDIwMjgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTMsIDE4NTYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTgzKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QTgwOTcwMjdBIgotCQkJdGl0bGUgICAgICAJIjguIENvbmNyZXRlIENvbnRhaW5tZW50IgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEAxMDAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY3MiwgOTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzOSwgOTQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDEwMDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjQwLCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDMxLCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQl3aWR0aCAgICAgIAk0MzYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEAxMDA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxMywgNzQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCQl3aWR0aCAgICAgIAkyODAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEAxMDA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgNTc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMDcKLQkJCQlsb2NhdGlvbiAgIAkoMTk0MywgODY4KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDA2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxOTQzLCA4NjgpCi0JCQkJICAgICgxOTQzLCA2MzEpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcwIiBAMTAwOAotCQkJCWxvY2F0aW9uICAgCSgyMTI1LCA2ODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjQwMDUxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzEiIEAxMDA5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOAotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkFEIgotCQkJCQljbGllbnQgICAgIAlAMTAwOAotCQkJCQlzdXBwbGllciAgIAlAMTAwNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNzI5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOAotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTUsIDY3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTc1NDM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJCNyIKLQkJCQkJY2xpZW50ICAgICAJQDEwMDgKLQkJCQkJc3VwcGxpZXIgICAJQDEwMDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDYzMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NywgNjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDEwMTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMTQKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMTMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI3MiwgNDY1KQotCQkJCSAgICAoMjcyLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAxMDE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNzIsIDExMjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTY5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTU4NwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEAxMDE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA1NzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4OSwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCXdpZHRoICAgICAgCTM1MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1OCIgQDEwMTcKLQkJCQlsb2NhdGlvbiAgIAkoMTE3MCwgMTM1NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEAxMDE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNwotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OSwgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzQwNDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTMzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDE3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzAsIDEzNTYpCi0JCQkJCSAgICAoMjA2LCAxMzU2KQotCQkJCQkgICAgKDIwNiwgNjMxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDYsIDYzMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2LCAxMzIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTkxNDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1OSIgQDEwMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE3Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjUyMSwgMTM5OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4IgotCQkJCQljbGllbnQgICAgIAlAMTAxNwotCQkJCQlzdXBwbGllciAgIAlAMTAxNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTcwLCAxMzU2KQotCQkJCQkgICAgKDI3MzEsIDEzNTYpCi0JCQkJCSAgICAoMjczMSwgMTIyNykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjczMSwgMTIyNykpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMDIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MiIgQDEwMjQKLQkJCQlsb2NhdGlvbiAgIAkoMTIyLCAxMTM2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJDRUIxMDJGOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUzIiBAMTAyNQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQKLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjYwMDFCIgotCQkJCQljbGllbnQgICAgIAlAMTAyNAotCQkJCQlzdXBwbGllciAgIAlAMTAxNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCA2MzEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjMsIDE1MTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MDQ5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDIzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDE2NDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MCwgMTU4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgxMTg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDEwMjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQkJd2lkdGggICAgICAJNTEzCi0JCQkJaGVpZ2h0ICAgICAJMTAwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY0IiBAMTAzMAotCQkJCWxvY2F0aW9uICAgCSg0NywgODg1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0NzE1MDExOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY1IiBAMTAzMQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzAKLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDMwCi0JCQkJCXN1cHBsaWVyICAgCUAxMDIzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDE2NDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTAzMgotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzAKLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyLCAxODkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIxODU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk5NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MUEwM0I1IgotCQkJCQljbGllbnQgICAgIAlAMTAzMAotCQkJCQlzdXBwbGllciAgIAlAMTAyOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDI4LCAxOTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNzg4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEAxMDM1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MiwgODQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJd2lkdGggICAgICAJMzYzCi0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTAzNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTc1LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5NCIgQDEwMzcKLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgMTAzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFOTAxOEEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk1IiBAMTAzOAotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzcKLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFQTAzNkMiCi0JCQkJCWNsaWVudCAgICAgCUAxMDM3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDM1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE5LCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxOSwgOTU1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwMzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDM3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEwMzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDczMTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM4MCIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzcKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjc5LCAxMDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDQwODE2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBAMTA0MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE2OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU1LCAxNjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMDQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTY5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MCIgQDEwNDQKLQkJCQlsb2NhdGlvbiAgIAkoMTM1MSwgMTg0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNTAxMTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MSIgQDEwNDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQ0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0I0IgotCQkJCQljbGllbnQgICAgIAlAMTA0NAotCQkJCQlzdXBwbGllciAgIAlAMTA0MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzUxLCAxODQwKQotCQkJCQkgICAgKDEyOTQsIDE4NDApCi0JCQkJCSAgICAoMTI5NCwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NCwgMTc1MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTA0NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDQKLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTgwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjMyNjUzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNDOCIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDQKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM1MSwgMTg0MCkKLQkJCQkJICAgICgxNDA5LCAxODQwKQotCQkJCQkgICAgKDE0MDksIDE3NTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MSwgMTg0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE3NTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjEsIDE4MDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3Mjg0OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NCIgQDEwNDkKLQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMTQzMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAwNkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTA1MAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkKLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDE1MjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NDk3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMTgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDQzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkwLCAxNDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTY0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMTUyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0NTQ1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NSIgQDEwNTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQ5Ci0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ5LCAxMjY2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMEUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDM2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkwLCAxNDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTIyMykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkyIiBAMTA1NQotCQkJCWxvY2F0aW9uICAgCSgxNjkwLCAxNjg0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNUFEMDM3NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRDb250ZW50cyIgQDEwNTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDE3MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRDb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDEwIgotCQkJCQljbGllbnQgICAgIAlAMTA1NQotCQkJCQlzdXBwbGllciAgIAlAMTA0MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NDYsIDE2ODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE2NDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk5NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDczMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkzIiBAMTA1OQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTUKLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2NiwgMTY0MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDA2IgotCQkJCQljbGllbnQgICAgIAlAMTA1NQotCQkJCQlzdXBwbGllciAgIAlAMTA0MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzQsIDE2ODQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMDYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjYyNCwgNzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM4OCwgNzQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJCXdpZHRoICAgICAgCTQ5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAMTA2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMDYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NTcsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MiIgQDEwNjQKLQkJCQlsb2NhdGlvbiAgIAkoOTYzLCAzMTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkIwMDNEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwNjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDY0Ci0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCAzNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4MTA4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNjQKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5OSwgMzE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE2LCAyOTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NjM5NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTczIiBAMTA2OAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjQKLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTUsIDM2MSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTA3IgotCQkJCQljbGllbnQgICAgIAlAMTA2NAotCQkJCQlzdXBwbGllciAgIAlAMTA2MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MjgsIDMxOSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxMDcwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgOTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NCwgOTQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDcxCi0JCQkJbG9jYXRpb24gICAJKDIzMjIsIDE1OTMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIzMjIsIDE1OTMpCi0JCQkJICAgICgyMzIyLCAxMDQ3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA3MgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDEwNzMKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ2LCA5MDUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjAwMDAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkY1MDEzQSIKLQkJCQljbGllbnQgICAgIAlAMTA3MAotCQkJCXN1cHBsaWVyICAgCUAxMDA2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE1MCwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTUwLCA4NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwNykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTA3NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCA1MzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk2NjIKLQkJCQloZWlnaHQgICAgIAkxMTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTgiIEAxMDc1Ci0JCQkJbG9jYXRpb24gICAJKDE0OTgsIDE0MzEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTQwMUFGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwNzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc1Ci0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyNywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0Mzg5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE3IgotCQkJCQljbGllbnQgICAgIAlAMTA3NQotCQkJCQlzdXBwbGllciAgIAlAMTA3MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDk4LCAxNDMxKQotCQkJCQkgICAgKDIyODEsIDE0MzEpCi0JCQkJCSAgICAoMjI4MSwgMTA0NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI4MSwgMTA0NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIwNCwgMTM5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA1NDE5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTkiIEAxMDc5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA3NQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTAsIDg2NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE2IgotCQkJCQljbGllbnQgICAgIAlAMTA3NQotCQkJCQlzdXBwbGllciAgIAlAMTA3NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDk4LCAxNDMxKQotCQkJCQkgICAgKDExMzEsIDE0MzEpCi0JCQkJCSAgICAoMTEzMSwgNjMyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMxLCA2MzIpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDEwODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NTUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQl3aWR0aCAgICAgIAk0MDQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDEwODIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDg5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNSwgODUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTYwOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMiIgQDEwODMKLQkJCQlsb2NhdGlvbiAgIAkoNTM0LCA3MzYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDEwODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDgzCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMCwgNzQ4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMTExMTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk5IgotCQkJCQljbGllbnQgICAgIAlAMTA4MwotCQkJCQlzdXBwbGllciAgIAlAMTA4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDg0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTk1LCA4MDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NTkyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIzIiBAMTA4NwotCQkJCQlQYXJlbnRfVmlldyAJQDEwODMKLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCA2NTMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCIKLQkJCQkJY2xpZW50ICAgICAJQDEwODMKLQkJCQkJc3VwcGxpZXIgICAJQDEwNzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA2MzIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MiIgQDEwODkKLQkJCQlsb2NhdGlvbiAgIAkoOTAwLCAxMDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEAxMDkwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA4OQotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxMywgMTA0MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMjg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIzNCIKLQkJCQkJY2xpZW50ICAgICAJQDEwODkKLQkJCQkJc3VwcGxpZXIgICAJQDEwODEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgMTExMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAxMDQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTU4OTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MyIgQDEwOTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDk2OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCQljbGllbnQgICAgIAlAMTA4OQotCQkJCQlzdXBwbGllciAgIAlAMTA4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCA5NTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NCIgQDEwOTUKLQkJCQlsb2NhdGlvbiAgIAkoNzAwLCAxMDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBAMTA5NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE2LCAxMDM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU0Nzk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5IgotCQkJCQljbGllbnQgICAgIAlAMTA5NQotCQkJCQlzdXBwbGllciAgIAlAMTA4MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzEsIDEwNDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzA3NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ1IiBAMTA5OQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU5LCA5NjgpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQkJY2xpZW50ICAgICAJQDEwOTUKLQkJCQkJc3VwcGxpZXIgICAJQDEwODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgOTUxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEAxMTAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCAxNDQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAwLCAxMzk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJd2lkdGggICAgICAJNTIyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwMgotCQkJCWxvY2F0aW9uICAgCSg1NTAsIDE1OTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDExMDEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDU1MCwgMTU5MCkKLQkJCQkgICAgKDU1MCwgMTQ5NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEAxMTAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgNTc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0MCwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQkJd2lkdGggICAgICAJNTQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwNAotCQkJCWxvY2F0aW9uICAgCSgxNDA2LCA3NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDExMDMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE0MDYsIDc2NSkKLQkJCQkgICAgKDE0MDYsIDYzMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMTA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTY5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTMsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDAiIEAxMTA2Ci0JCQkJbG9jYXRpb24gICAJKDE2MTQsIDE4NjgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RkRERDcwMTEzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDEiIEAxMTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNgotCQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA0NzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RkREREEwMjZCIgotCQkJCQljbGllbnQgICAgIAlAMTEwNgotCQkJCQlzdXBwbGllciAgIAlAMTEwNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjE0LCAxODY4KQotCQkJCQkgICAgKDI1MDAsIDE4NjgpCi0JCQkJCSAgICAoMjUwMCwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjUwMCwgMTc1MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMTA4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNgotCQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA0NzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NiwgMTc4NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk4NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTg5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNzUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTA2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTAxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTQsIDE4NjgpCi0JCQkJCSAgICAoOTg0LCAxODY4KQotCQkJCQkgICAgKDk4NCwgMTQ5NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg0LCAxNDk1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAxODI0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzEyODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA2IiBAMTExMQotCQkJCWxvY2F0aW9uICAgCSgyOTI3LCAzODcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzYwMzg2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVDb250ZW50cyIgQDExMTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTExCi0JCQkJCWxvY2F0aW9uICAgCSgyNDYzLCAtMzc1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNSwgMzU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZUNvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzMwNjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwN0MiCi0JCQkJCWNsaWVudCAgICAgCUAxMTExCi0JCQkJCXN1cHBsaWVyICAgCUAxMTAzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDI5MjcsIDM4NykKLQkJCQkJICAgICgxNzUwLCAzODcpCi0JCQkJCSAgICAoMTc1MCwgNTIxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDUyMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNCwgNDI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTcyNDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNyIgQDExMTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTExCi0JCQkJCWxvY2F0aW9uICAgCSgyNDYzLCAtMzc1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjk0NiwgMTQ0OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDcyIgotCQkJCQljbGllbnQgICAgIAlAMTExMQotCQkJCQlzdXBwbGllciAgIAlAMTEwNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyOTI3LCAzODcpCi0JCQkJCSAgICAoMjk4NywgMzg3KQotCQkJCQkgICAgKDI5ODcsIDE2NzEpCi0JCQkJCSAgICAoMjkyOCwgMTY3MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTI4LCAxNjcxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMTE3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTksIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MiIgQDExMTgKLQkJCQlsb2NhdGlvbiAgIAkoMTc1MCwgODcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDRFMDA2NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMTE5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTExOAotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDAsIDY5MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUxMDM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDJBNSIKLQkJCQkJY2xpZW50ICAgICAJQDExMTgKLQkJCQkJc3VwcGxpZXIgICAJQDExMDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDYzMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNCwgNjk1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzQ0NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgzIiBAMTEyMgotCQkJCQlQYXJlbnRfVmlldyAJQDExMTgKLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzA5LCAxMDY1KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA1MDAyOUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTE4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTE3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA4NzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCAxMTEzKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDExMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNzksIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNCIgQDExMjUKLQkJCQlsb2NhdGlvbiAgIAkoMTI1MiwgMTg5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4NzAyNDciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNSIgQDExMjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI1Ci0JCQkJCWxvY2F0aW9uICAgCSg3MDgsIDEyODgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMkY5IgotCQkJCQljbGllbnQgICAgIAlAMTEyNQotCQkJCQlzdXBwbGllciAgIAlAMTEwNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjUyLCAxODk2KQotCQkJCQkgICAgKDI2MDMsIDE4OTYpCi0JCQkJCSAgICAoMjYwMywgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMywgMTc1MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDExMjcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI1Ci0JCQkJCWxvY2F0aW9uICAgCSg3MDgsIDEyODgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4MiwgMTg1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM4MTE0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRUJEQzhDMDMwMyIKLQkJCQkJY2xpZW50ICAgICAJQDExMjUKLQkJCQkJc3VwcGxpZXIgICAJQDExMjQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI1MiwgMTg5NikKLQkJCQkJICAgICg0MjgsIDE4OTYpCi0JCQkJCSAgICAoNDI4LCAxMjIzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MjgsIDEyMjMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4MiwgMTg2MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTc1MDMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg2IiBAMTEzMAotCQkJCWxvY2F0aW9uICAgCSgxMTk5LCAxMzIxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc1RDMyMDIyMCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODciIEAxMTMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEzMAotCQkJCQlsb2NhdGlvbiAgIAkoNjU1LCA3MTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEM0MwMTBDIgotCQkJCQljbGllbnQgICAgIAlAMTEzMAotCQkJCQlzdXBwbGllciAgIAlAMTExNwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk5LCAxMzIxKQotCQkJCQkgICAgKDE4OTcsIDEzMjEpCi0JCQkJCSAgICAoMTg5NywgMTIyMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5NywgMTIyMykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDExMzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTMwCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAxMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5NTY5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEM0MwMTBEIgotCQkJCQljbGllbnQgICAgIAlAMTEzMAotCQkJCQlzdXBwbGllciAgIAlAMTEyNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk5LCAxMzIxKQotCQkJCQkgICAgKDUwMCwgMTMyMSkKLQkJCQkJICAgICg1MDAsIDEyMjMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUwMCwgMTIyMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODIzMDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUAxMTA1Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjA2LCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjA2LCAxNTkzKQotCQkJCWRyYXdTdXBwbGllciAJQDEwNzEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzNgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMzcKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDQ5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NjQyOQotCQkJCSAgICBoZWlnaHQgICAgIAk2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCWNsaWVudCAgICAgCUAxMDc0Ci0JCQkJc3VwcGxpZXIgICAJQDEwMTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTMsIDUyMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUzLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAxNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUAxMDQzCi0JCQkJc3VwcGxpZXIgICAJQDEwNzAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA5LCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNTkzKQotCQkJCWRyYXdTdXBwbGllciAJQDEwNzEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzOQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDAKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDE1OTEpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45ODAzOTIKLQkJCQkgICAgaGVpZ2h0ICAgICAJMzg1Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCWNsaWVudCAgICAgCUAxMDQzCi0JCQkJc3VwcGxpZXIgICAJQDExMDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNTkwKQotCQkJCWRyYXdTdXBwbGllciAJQDExMDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTY0MDI3OSIKLQkJCQljbGllbnQgICAgIAlAMTAxNgotCQkJCXN1cHBsaWVyICAgCUAxMDEzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NiwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDEwMTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExNDIKLQkJCQlsb2NhdGlvbiAgIAkoNDMxLCAyMjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMjkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQzMSwgMjIyKQotCQkJCSAgICAoNDMxLCAxMzApKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE0NAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM2MSwgMjI0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTc2NzQ0Ci0JCQkJICAgIGhlaWdodCAgICAgCTg2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNDQwMDY5IgotCQkJCWNsaWVudCAgICAgCUAxMDEzCi0JCQkJc3VwcGxpZXIgICAJQDEwMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzUsIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc1LCAyMjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTE0NQotCQkJCWxvY2F0aW9uICAgCSgxMzA5LCA0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwNjIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEzMDksIDQ2NSkKLQkJCQkgICAgKDEzMDksIDM3NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ3Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQxLCA0OTUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjQyODYKLQkJCQkgICAgaGVpZ2h0ICAgICAJMTAKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2NjAzMzkiCi0JCQkJY2xpZW50ICAgICAJQDEwNzQKLQkJCQlzdXBwbGllciAgIAlAMTA2MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzMSwgNTIwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzEsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQ1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciCi0JCQkJY2xpZW50ICAgICAJQDEwMjMKLQkJCQlzdXBwbGllciAgIAlAMTEwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1MCwgMTY0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjUwLCAxNTkwKQotCQkJCWRyYXdTdXBwbGllciAJQDExMDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0OQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTAKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjA1LCA0OTMpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NTgzMzMKLQkJCQkgICAgaGVpZ2h0ICAgICAJOAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTYxMDNCRSIKLQkJCQljbGllbnQgICAgIAlAMTAzNgotCQkJCXN1cHBsaWVyICAgCUAxMDYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMTExMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExNDUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1MQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTIKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTUxLCA5MDUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDg5ODAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNzMKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJFQjAyQTgiCi0JCQkJY2xpZW50ICAgICAJQDExMTcKLQkJCQlzdXBwbGllciAgIAlAMTAwNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzgsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzgsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTMKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU0Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MiwgODA3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODc5MzEwCi0JCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwM0EwMjIxIgotCQkJCWNsaWVudCAgICAgCUAxMTE3Ci0JCQkJc3VwcGxpZXIgICAJQDExMDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAzLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAzLCA3NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU1Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1NgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTQsIDgwMSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJENzM3MDM4RiIKLQkJCQljbGllbnQgICAgIAlAMTAzNQotCQkJCXN1cHBsaWVyICAgCUAxMTAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI4NCwgODM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg0LCA3NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNjQwMjQwIgotCQkJCWNsaWVudCAgICAgCUAxMDA1Ci0JCQkJc3VwcGxpZXIgICAJQDEwNjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg0LCA3NjIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNzksIDc2MikpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiIKLQkJCQljbGllbnQgICAgIAlAMTAwNAotCQkJCXN1cHBsaWVyICAgCUAxMDYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNTIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjM3LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCWNsaWVudCAgICAgCUAxMDYxCi0JCQkJc3VwcGxpZXIgICAJQDEwMDQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA3MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDYzMSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSIKLQkJCQljbGllbnQgICAgIAlAMTAwNgotCQkJCXN1cHBsaWVyICAgCUAxMDYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk1MCwgNTIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTUwLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTYxCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE2MgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MjEsIDg5NykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxODEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4NzcxOQotCQkJCSAgICBoZWlnaHQgICAgIAk3NgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTRGMDIzQyIKLQkJCQljbGllbnQgICAgIAlAMTAwMwotCQkJCXN1cHBsaWVyICAgCUAxMDYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg5NiwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODk2LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTYzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE2NAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMTMsIDkwNCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MDYyMgotCQkJCSAgICBoZWlnaHQgICAgIAk2OAotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkUyMDM4MSIKLQkJCQljbGllbnQgICAgIAlAMTAxNQotCQkJCXN1cHBsaWVyICAgCUAxMDA2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM4MSwgMTEwOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM4MSwgODY4KQotCQkJCWRyYXdTdXBwbGllciAJQDEwMDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2NQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNjYKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyODc4LCAyNjkpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDY2NjcKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjYKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI1NTAzODUiCi0JCQkJY2xpZW50ICAgICAJQDEwMTUKLQkJCQlzdXBwbGllciAgIAlAMTAyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5NDMsIDExMDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5NDMsIDIyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDExMjQKLQkJCQlzdXBwbGllciAgIAlAMTAxMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ2MiwgMTExMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDYyLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAxNCkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUI3QTAzOEMiCi0JCQl0aXRsZSAgICAgIAkiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDExNjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDE1MzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ5MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjQiIEAxMTY5Ci0JCQkJbG9jYXRpb24gICAJKDIyOCwgMTY5NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFNjAyNTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNSIgQDExNzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcsIDE2MjMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDJGNyIKLQkJCQkJY2xpZW50ICAgICAJQDExNjkKLQkJCQkJc3VwcGxpZXIgICAJQDExNjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjI4LCAxNjk1KQotCQkJCQkgICAgKDE3NSwgMTY5NSkKLQkJCQkJICAgICgxNzUsIDE1OTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1LCAxNTkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iIEAxMTcyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2OQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ3NiwgLTM4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzI5LCAxNzQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS45MjQ1MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAzMEIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTY5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTY4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIyOCwgMTY5NSkKLQkJCQkJICAgICgyODEsIDE2OTUpCi0JCQkJCSAgICAoMjgxLCAxNTkxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4MSwgMTU5MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI5LCAxNjQ2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDU3MTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAxMTc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDc5MCwgMTQ5MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTE4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MCIgQDExNzYKLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCAxNjk4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ1MDM5OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYxIiBAMTE3NwotCQkJCQlQYXJlbnRfVmlldyAJQDExNzYKLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NjAsIDE2MjMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM4QSIKLQkJCQkJY2xpZW50ICAgICAJQDExNzYKLQkJCQkJc3VwcGxpZXIgICAJQDExNzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTUyLCAxNjk4KQotCQkJCQkgICAgKDkwMSwgMTY5OCkKLQkJCQkJICAgICg5MDEsIDE1OTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAxLCAxNTkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExNzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTc2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTI4OCwgLTMxOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMCwgMTczOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTU2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zMjY5MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOUUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTc2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk1MiwgMTY5OCkKLQkJCQkJICAgICgxMDA0LCAxNjk4KQotCQkJCQkgICAgKDEwMDQsIDE1OTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwNCwgMTU5MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCAxNjQ5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDExODIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NTYsIDk5MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDQyMCwgOTQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJCXdpZHRoICAgICAgCTQ5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEAxMTgzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MTIsIDczNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCXdpZHRoICAgICAgCTQ3NQotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMTg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA0MTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NDYsIDI4NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTQwNgotCQkJCWhlaWdodCAgICAgCTI4NwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjQiIEAxMTg1Ci0JCQkJbG9jYXRpb24gICAJKDEzMDMsIDY3OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDExODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDEsIC04NTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTksIDM4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMDM4NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQkJY2xpZW50ICAgICAJQDExODUKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMwMywgNjc5KQotCQkJCQkgICAgKDEzMDMsIDQxOSkKLQkJCQkJICAgICg4NDMsIDQxOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDQxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTIyLCA0NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MDc0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI1IiBAMTE4OQotCQkJCQlQYXJlbnRfVmlldyAJQDExODUKLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0NSwgOTU2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiCi0JCQkJCWNsaWVudCAgICAgCUAxMTg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMDMsIDY3OSkKLQkJCQkJICAgICgxMzAzLCA5OTcpCi0JCQkJCSAgICAoOTAxLCA5OTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAxLCA5OTcpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMiIgQDExOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgNjQ5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQ0M3MDBFQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEAxMTkyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5MQotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzOCwgNTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDE5MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiCi0JCQkJCWNsaWVudCAgICAgCUAxMTkxCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTYsIDY0OSkKLQkJCQkJICAgICgxMjE2LCA1MzQpCi0JCQkJCSAgICAoODQzLCA1MzQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA1MzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyNiwgNTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MzE2NDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMyIgQDExOTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkxCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDc1NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQyIgotCQkJCQljbGllbnQgICAgIAlAMTE5MQotCQkJCQlzdXBwbGllciAgIAlAMTE4MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjE2LCA2NDkpCi0JCQkJCSAgICAoMTIxNiwgNzk3KQotCQkJCQkgICAgKDg3NywgNzk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNzk3KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjgiIEAxMTk3Ci0JCQkJbG9jYXRpb24gICAJKDY2MiwgNjQyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVEM0E2MDEzMSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNpbmdEaXJlY3RpdmVzIiBAMTE5OAotCQkJCQlQYXJlbnRfVmlldyAJQDExOTcKLQkJCQkJbG9jYXRpb24gICAJKC0yMzQsIDExNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCA2NzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVmZXJlbmNpbmdEaXJlY3RpdmVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MDg3NTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTIxNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcxIgotCQkJCQljbGllbnQgICAgIAlAMTE5NwotCQkJCQlzdXBwbGllciAgIAlAMTE4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDcyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA2NzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzMDY1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI5IiBAMTIwMQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTcKLQkJCQkJbG9jYXRpb24gICAJKC0yMzQsIDExNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIxLCA1NzYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MCIKLQkJCQkJY2xpZW50ICAgICAJQDExOTcKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MiwgNjQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA1NTkpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMCIgQDEyMDMKLQkJCQlsb2NhdGlvbiAgIAkoNzUsIDE4OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGMDAwNUUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzMSIgQDEyMDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAzCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAxRSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDMKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzUsIDE4OCkKLQkJCQkJICAgICg3NSwgMTI4KQotCQkJCQkgICAgKDUxMCwgMTI4KQotCQkJCQkgICAgKDUxMCwgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDI3MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RWZXJzaW9uIiBAMTIwNQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDMKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgNzQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFZlcnNpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC41OTM3NTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDI4IgotCQkJCQljbGllbnQgICAgIAlAMTIwMwotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NSwgMTg4KQotCQkJCQkgICAgKDc1LCAzODApCi0JCQkJCSAgICAoNDM3LCAzODApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgMzgwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDMyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc0NzU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMiIgQDEyMDgKLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMTM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFRDBCMDExQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMzIiBAMTIwOQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDgKLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMjEiCi0JCQkJCWNsaWVudCAgICAgCUAxMjA4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDEzNCkKLQkJCQkJICAgICg3NjYsIDEzNCkKLQkJCQkJICAgICg3NjYsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjYsIDI3MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm9yaWdpbmFsVmVyc2lvbiIgQDEyMTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA4Ci0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNjQsIDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK29yaWdpbmFsVmVyc2lvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjY1MDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyQiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDgKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMTM0KQotCQkJCQkgICAgKDEzMjIsIDEzNCkKLQkJCQkJICAgICgxMzIyLCAzMzQpCi0JCQkJCSAgICAoODQzLCAzMzQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMTM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCAzMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTgxMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM0IiBAMTIxMwotCQkJCWxvY2F0aW9uICAgCSgxMjYsIDY1NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBQjAwMUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNSIgQDEyMTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEzCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUYwMTBCIgotCQkJCQljbGllbnQgICAgIAlAMTIxMwotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYsIDY1NikKLQkJCQkJICAgICg1MTMsIDY1NikKLQkJCQkJICAgICg1MTMsIDU1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMywgNTU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiIEAxMjE1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIxMwotCQkJCQlsb2NhdGlvbiAgIAkoLTgzNCwgMTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcsIDQzMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRWZXJzaW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzOTAyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUYwMTE1IgotCQkJCQljbGllbnQgICAgIAlAMTIxMwotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYsIDY1NikKLQkJCQkJICAgICg2NiwgNjU2KQotCQkJCQkgICAgKDY2LCA0NzIpCi0JCQkJCSAgICAoNDM3LCA0NzIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDQ3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzU2LCA1MjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2ODQ2OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzgiIEAxMjE4Ci0JCQkJbG9jYXRpb24gICAJKDY0MiwgMTI2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc4NDczMDE5NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM5IiBAMTIxOQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgKLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGMSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMTgKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjQyLCAxMjYpCi0JCQkJCSAgICAoNTg4LCAxMjYpCi0JCQkJCSAgICAoNTg4LCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODgsIDI3MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYUZvclNjaGVtYSIgQDEyMjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjE4Ci0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM5LCA3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWFGb3JTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTU1NTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjE4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY0MiwgMTI2KQotCQkJCQkgICAgKDY5NywgMTI2KQotCQkJCQkgICAgKDY5NywgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY0MiwgMTI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjk3LCAyNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMjEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDE4NjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjIzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCWNsaWVudCAgICAgCUAxMTgyCi0JCQkJc3VwcGxpZXIgICAJQDExODMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzgsIDkzNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM4LCA4NDMpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NywgMTE0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc4IiBAMTIyNQotCQkJCWxvY2F0aW9uICAgCSgyMzQsIDEzNDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkIwMTk0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3OSIgQDEyMjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwLCAxMjcxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMDkiCi0JCQkJCWNsaWVudCAgICAgCUAxMjI1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjI0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNCwgMTM0MCkKLQkJCQkJICAgICgxODEsIDEzNDApCi0JCQkJCSAgICAoMTgxLCAxMjM5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgMTM0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MSwgMTIzOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjI4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIyNQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMywgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS44Njc5MjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMTMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjI1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjI0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNCwgMTM0MCkKLQkJCQkJICAgICgyODcsIDEzNDApCi0JCQkJCSAgICAoMjg3LCAxMjM5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgMTM0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NywgMTIzOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCAxMjk1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDI5NDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMjMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2MCwgMTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MDQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMjMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5OSwgMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQl3aWR0aCAgICAgIAkyNDQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEyIiBAMTIzMwotCQkJCWxvY2F0aW9uICAgCSgxNjY4LCAyODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUUwMUNDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTMiIEAxMjM0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIzMwotCQkJCQlsb2NhdGlvbiAgIAkoOCwgLTE1MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMEYiCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY4LCAyODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAxOTkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNGYWNldHMiIEAxMjM1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIzMwotCQkJCQlsb2NhdGlvbiAgIAkoOCwgLTE1MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1MiwgMzAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY0ZhY2V0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjQ2MTU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDExQSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzMKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDM2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNSwgMzAxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzY5MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMjM4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNiwgOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTIzOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NzYsIDY0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTUsIDU5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTQiIEAxMjQwCi0JCQkJbG9jYXRpb24gICAJKDE1MDgsIDc5MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREMzAyOEUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxNSIgQDEyNDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDQwMkYzIgotCQkJCQljbGllbnQgICAgIAlAMTI0MAotCQkJCQlzdXBwbGllciAgIAlAMTIzOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwOCwgNzkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwOCwgNjk1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljUGFydGljbGUiIEAxMjQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0MAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyLCAtMjgwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk1LCA3NjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljUGFydGljbGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yNTkyNTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDQwMkZEIgotCQkJCQljbGllbnQgICAgIAlAMTI0MAotCQkJCQlzdXBwbGllciAgIAlAMTIzOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwOCwgNzkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwOCwgODg5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDU0LCA4MjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NTA2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjQ1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1NiwgMTE0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MCIgQDEyNDYKLQkJCQlsb2NhdGlvbiAgIAkoOTE5LCAxMzQ5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjVFMDFGOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTEiIEAxMjQ3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI0NgotCQkJCQlsb2NhdGlvbiAgIAkoLTIzMywgLTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjUsIDEyNzMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA0NiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNDYKLQkJCQkJc3VwcGxpZXIgICAJQDEyNDUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTE5LCAxMzQ5KQotCQkJCQkgICAgKDg2NiwgMTM0OSkKLQkJCQkJICAgICg4NjYsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTE5LCAxMzQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxMjM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI0NgotCQkJCQlsb2NhdGlvbiAgIAkoLTIzMywgLTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5OTMsIDEzOTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjM3NzM1OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA1MCIKLQkJCQkJY2xpZW50ICAgICAJQDEyNDYKLQkJCQkJc3VwcGxpZXIgICAJQDEyNDUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTE5LCAxMzQ5KQotCQkJCQkgICAgKDk3MywgMTM0OSkKLQkJCQkJICAgICg5NzMsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTE5LCAxMzQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTczLCAxMjM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDEyOTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMTQ5MjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAxMjUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk1MiwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNiwgOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzE2IiBAMTI1MwotCQkJCWxvY2F0aW9uICAgCSgyMDI1LCA3OTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDkwMUY2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTciIEAxMjU0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI1MwotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4NCIKLQkJCQkJY2xpZW50ICAgICAJQDEyNTMKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjUsIDY5NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1dpbGRjYXJkIiBAMTI1NQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTMKLQkJCQkJbG9jYXRpb24gICAJKDE1MywgLTI4MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyNiwgODM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1dpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODgwOTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjhFIgotCQkJCQljbGllbnQgICAgIAlAMTI1MwotCQkJCQlzdXBwbGllciAgIAlAMTI1MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgODg5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjU3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDk4LCA4NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjE3MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTgiIEAxMjU4Ci0JCQkJbG9jYXRpb24gICAJKDE3NTQsIDExNzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY4RkYwMUJGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTkiIEAxMjU5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI1OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE5OCwgMjM0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxNyIKLQkJCQkJY2xpZW50ICAgICAJQDEyNTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNDUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzAxLCAxMTc4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjYwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI1OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE5OCwgMjM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMjYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1dpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjMzNTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTgzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRDNjkwMjAzMTgiCi0JCQkJCWNsaWVudCAgICAgCUAxMjU4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjUyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3NTQsIDExNzgpCi0JCQkJCSAgICAoMjAyOCwgMTE3OCkKLQkJCQkJICAgICgyMDI4LCA5OTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjgsIDk5OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MiwgMTA5OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgzNjY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMC4gRGlhZ25vc3RpY3MiCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGMDgwM0UyIgotCQkJdGl0bGUgICAgICAJIjEwLiBEaWFnbm9zdGljcyIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAMTI2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDEwMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Ob2RlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5NDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2NEE1MDExNyIKLQkJCQl3aWR0aCAgICAgIAk2ODYKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpY1NldmVyaXR5IiBAMTI2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCA2NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDU0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNDk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2OEE3MDMyRiIKLQkJCQl3aWR0aCAgICAgIAk0NjIKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTI2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTksIDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjg0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg5NiwgMTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTQwLCA2MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MTMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJd2lkdGggICAgICAJNzMxCi0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiIEAxMjY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQsIDQwMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQl3aWR0aCAgICAgIAk2NTgKLQkJCQloZWlnaHQgICAgIAk0MzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIwIiBAMTI2OAotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDI4MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMTAzNUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMSIgQDEyNjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzYiCi0JCQkJCWNsaWVudCAgICAgCUAxMjY4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjY1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMTc2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYWxsRGlhZ25vc3RpY3MiIEAxMjcwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI2OAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwOSwgMzMwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2FsbERpYWdub3N0aWNzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDg1OTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTE2NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM3IgotCQkJCQljbGllbnQgICAgIAlAMTI2OAotCQkJCQlzdXBwbGllciAgIAlAMTI2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0LCAyODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQsIDM5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTYsIDMyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNTYxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNiIgQDEyNzMKLQkJCQlsb2NhdGlvbiAgIAkoMTAyOCwgNDQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2MjI3MDNDRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE3IiBAMTI3NAotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzMKLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNjEiCi0JCQkJCWNsaWVudCAgICAgCUAxMjczCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MTMsIDQ0MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbXBvbmVudHMiIEAxMjc1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MzgsIDIzMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wb25lbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjkxODEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMkIwMDZDIgotCQkJCQljbGllbnQgICAgIAlAMTI3MwotCQkJCQlzdXBwbGllciAgIAlAMTI2NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDI4LCA0NDApCi0JCQkJCSAgICAoMTA4OCwgNDQwKQotCQkJCQkgICAgKDEwODgsIDE3NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg4LCAxNzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDMsIDIzMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODIzODQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOCIgQDEyNzgKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAyODIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNjkwMTY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEAxMjc5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI3OAotCQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAtMjc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjZBMDAyNiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNzgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAxNzQpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJkaWFnbm9zdGljcyIgQDEyODAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjc4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMzMwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2RpYWdub3N0aWNzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTI2MzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI3IgotCQkJCQljbGllbnQgICAgIAlAMTI3OAotCQkJCQlzdXBwbGllciAgIAlAMTI2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDM5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ1LCAzMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5NDczNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyODMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRDMEY0QzAxQTEiCi0JCQkJY2xpZW50ICAgICAJQDEyNjcKLQkJCQlzdXBwbGllciAgIAlAMTI2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMzkwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDE3NCkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMS4gU3VwcGxlbWVudGFsIgotCQkJcXVpZCAgICAgICAJIjNDMjg3RTQ5MDE5QiIKLQkJCXRpdGxlICAgICAgCSIxMS4gU3VwcGxlbWVudGFsIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDY0LCA4MTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNzYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTgzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJODUyCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTI4NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCA4ODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzMxLCA4MjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTc4MAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDEyODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDExMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJd2lkdGggICAgICAJNDk4Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiIEAxMjg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM4NCwgMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIzNiwgNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MiIgQDEyODgKLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzUwMTM3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwcmltYXJ5Q29tcG9uZW50IiBAMTI4OQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODgKLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1NiwgMTE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1hcnlDb21wb25lbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0MDgyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMyIKLQkJCQkJY2xpZW50ICAgICAJQDEyODgKLQkJCQkJc3VwcGxpZXIgICAJQDEyODYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM3LCA4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjI0LCA1NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3MjYwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDMiIEAxMjkyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI4OAotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1OCwgMTI2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjg4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjg3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjcsIDg0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMjk0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgNjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2NjcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGVsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iCi0JCQkJCSIrIGNpcmN1bGFyIDogYm9vbGVhbiIpKQotCQkJCXdpZHRoICAgICAgCTc4MgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDEyOTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxMDcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgOTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDAsIDEwNTEpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1OQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBmYWNldE5hbWUgOiBTdHJpbmciCi0JCQkJCSIrIGVmZmVjdGl2ZVZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAk0NTgKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAxMjk2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNTY4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTgwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA2MjgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODA1Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiIpKQotCQkJCXdpZHRoICAgICAgCTgyMAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDEyOTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAyODgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAxNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMjE3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgYWxpYXNOYW1lIDogU3RyaW5nIgotCQkJCQkiKyB1UkkgOiBTdHJpbmciCi0JCQkJCSIrIGFsaWFzVVJJIDogU3RyaW5nIgotCQkJCQkiKyBxTmFtZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQ3MgotCQkJCWhlaWdodCAgICAgCTI4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDEyOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAzNTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMjk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NjIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTI5OQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDUxMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTI5OAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzIwLCA1MTApCi0JCQkJICAgICgzMjAsIDQyMCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzMDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiCi0JCQkJY2xpZW50ICAgICAJQDEyOTYKLQkJCQlzdXBwbGllciAgIAlAMTI5OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxLCA1NTYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxLCA1MTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI5OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzAxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIgotCQkJCWNsaWVudCAgICAgCUAxMjg0Ci0JCQkJc3VwcGxpZXIgICAJQDEyOTgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NzcsIDc0OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA1MTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI5OSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEAxMzAyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMTgwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDEsIDE3NjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIgotCQkJCXdpZHRoICAgICAgCTQ1NgotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDEzMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE3NzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTcyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJd2lkdGggICAgICAJNDkzCi0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTMwNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTkzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxODg5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQl3aWR0aCAgICAgIAk0OTMKLQkJCQloZWlnaHQgICAgIAkxMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEAxMzA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMTk2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzMsIDE5MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBAMTMwNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM0LCAxMzcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJCXdpZHRoICAgICAgCTQyMgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiIEAxMzA3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM1MiwgMTI2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjMsIDEyMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCIKLQkJCQl3aWR0aCAgICAgIAkzOTYKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBAMTMwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNCwgMTM5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAxMzQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQkJd2lkdGggICAgICAJMzgwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDEzMDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEyMzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0OSwgMTE3OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETnVtZXJpY0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJCXdpZHRoICAgICAgCTQwMAotCQkJCWhlaWdodCAgICAgCTEzMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIgQDEzMTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNjE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTUzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MDUKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiIKLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQotCQkJCXdpZHRoICAgICAgCTQyMAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEAxMzExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjI4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDIsIDIyMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQl3aWR0aCAgICAgIAk0NTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDEzMTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAyNjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NCwgMjU3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSIKLQkJCQl3aWR0aCAgICAgIAk0NzgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBAMTMxMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNjgsIDIxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTk2LCAyMDc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJd2lkdGggICAgICAJMzYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEAxMzE0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAyMDk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDIwNDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJd2lkdGggICAgICAJNDU4Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBAMTMxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMjI3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAyMjIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCQl3aWR0aCAgICAgIAkzNTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEAxMzE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNTg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1MDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1NjMpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIgotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBAMTMxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDI0NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTExLCAyNDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiIKLQkJCQl3aWR0aCAgICAgIAk0MzYKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEAxMzE4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzksIDIzOTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCXdpZHRoICAgICAgCTQyMAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBAMTMxOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjYwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAyNTU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCXdpZHRoICAgICAgCTQyMgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMzIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxMTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY3LCAxMTAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTMyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTA3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwLCAxMDIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMzIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTMwNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzNjQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc1Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIHZhbGlkRmFjZXRzIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNTk0Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NCIgQDEzMjMKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0NiwgMTIxOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NDAzMEEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDEzMjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4MCwgMTE3MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkzLjI2ODI5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBERCIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkKLQkJCQkJICAgICgxNDg3LCAxMjE4KQotCQkJCQkgICAgKDE0ODcsIDEyOTIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDEyOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEyNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xODQyMTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NSIgQDEzMjcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwRTciCi0JCQkJCWNsaWVudCAgICAgCUAxMzIzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NDYsIDEyMTgpCi0JCQkJCSAgICAoMTQwNSwgMTIxOCkKLQkJCQkJICAgICgxNDA1LCAxMjkyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NDYsIDEyMTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA1LCAxMjkyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTgiIEAxMzI4Ci0JCQkJbG9jYXRpb24gICAJKDE3MzMsIDE1NzUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEQwMjUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTkiIEAxMzI5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMyOAotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5MSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTczMywgMTU3NSkKLQkJCQkJICAgICgxNDg3LCAxNTc1KQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhGYWNldCIgQDEzMzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4Ci0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTEsIDE1NDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NjI0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5QiIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzMsIDE1NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI2LCAxNTc1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDQyLCAxNTM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkxNTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYwIiBAMTMzMwotCQkJCWxvY2F0aW9uICAgCSgxNTg3LCAxNzkzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFCMDM5NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYxIiBAMTMzNAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzMKLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEFDMDNDOSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU4NywgMTc5MykKLQkJCQkJICAgICgxNDQ3LCAxNzkzKQotCQkJCQkgICAgKDE0NDcsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4NywgMTc5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NDcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhJbmNsdXNpdmVGYWNldCIgQDEzMzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMzCi0JCQkJCWxvY2F0aW9uICAgCSg3MDcsIC0zMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNywgMTc1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhJbmNsdXNpdmVGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4NDQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0Q0IgotCQkJCQljbGllbnQgICAgIAlAMTMzMwotCQkJCQlzdXBwbGllciAgIAlAMTMwMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4NywgMTc5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTIsIDE3OTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMjAsIDE3NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1OTE1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjIiIEAxMzM4Ci0JCQkJbG9jYXRpb24gICAJKDkzNywgMTc4NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBRjAzMzgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MyIgQDEzMzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM4Ci0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDFGOSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTM3LCAxNzg3KQotCQkJCQkgICAgKDk5NywgMTc4NykKLQkJCQkJICAgICg5OTcsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTk3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluSW5jbHVzaXZlRmFjZXQiIEAxMzQwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzOAotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkyLCAxNzQ1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkluY2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDYwNjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAyMDMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzM4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzAzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE3ODcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NSwgMTc0MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzOTYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NCIgQDEzNDMKLQkJCQlsb2NhdGlvbiAgIAkoOTgxLCAxOTM3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEIzMDIwNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY1IiBAMTM0NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDMKLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5MCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTgxLCAxOTM3KQotCQkJCQkgICAgKDEwNDEsIDE5MzcpCi0JCQkJCSAgICAoMTA0MSwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQxLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluRXhjbHVzaXZlRmFjZXQiIEAxMzQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0MwotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMywgMTkwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5FeGNsdXNpdmVGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzQxMjUzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTlBIgotCQkJCQljbGllbnQgICAgIAlAMTM0MwotCQkJCQlzdXBwbGllciAgIAlAMTMwNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgxLCAxOTM3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTE4LCAxOTM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODksIDE4OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NjY1MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjYiIEAxMzQ4Ci0JCQkJbG9jYXRpb24gICAJKDE0NjksIDE5NTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjYwMjhEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjciIEAxMzQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0OAotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjcwMjE3IgotCQkJCQljbGllbnQgICAgIAlAMTM0OAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDY5LCAxOTUzKQotCQkJCQkgICAgKDE0MDAsIDE5NTMpCi0JCQkJCSAgICAoMTQwMCwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY5LCAxOTUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwMCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEV4Y2x1c2l2ZUZhY2V0IiBAMTM1MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDgKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgLTk1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ2LCAxOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTgwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMjEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY5LCAxOTUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NCwgMTk1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk2MSwgMTkxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI3MjM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2OCIgQDEzNTMKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjE4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAwNTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2OSIgQDEzNTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzE4LCA2MjgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMjQ2IgotCQkJCQljbGllbnQgICAgIAlAMTM1MwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJsZW5ndGhGYWNldCIgQDEzNTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzE4LCA2MjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNCwgMjIwNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitsZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDc1NDcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMjUwIgotCQkJCQljbGllbnQgICAgIAlAMTM1MwotCQkJCQlzdXBwbGllciAgIAlAMTMxNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTIyLCAyMTgwKQotCQkJCQkgICAgKDExMjIsIDIyNDApCi0JCQkJCSAgICAoMzg3LCAyMjQwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIxODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIyNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgMjIwNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk1NTk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3MiIgQDEzNTgKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMTk4OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMjAyMUQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3MyIgQDEzNTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQiIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZW51bWVyYXRpb25GYWNldHMiIEAxMzYwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OAotCQkJCQlsb2NhdGlvbiAgIAkoLTEzODAsIDQzNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM3LCAyMDE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VudW1lcmF0aW9uRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjU4NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMzAwQUMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzU4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwODQsIDE5ODkpCi0JCQkJCSAgICAoMTA4NCwgMjA0OSkKLQkJCQkJICAgICg0ODUsIDIwNDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ4NSwgMjA0OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTgzLCAyMDIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTEyOTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc0IiBAMTM2MwotCQkJCWxvY2F0aW9uICAgCSgxNDUxLCAyMDc0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM1MDE1OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc1IiBAMTM2NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjMKLQkJCQkJbG9jYXRpb24gICAJKC0xNTI1LCA1MzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzYwMEIwIgotCQkJCQljbGllbnQgICAgIAlAMTM2MwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDUxLCAyMDc0KQotCQkJCQkgICAgKDEzNjIsIDIwNzQpCi0JCQkJCSAgICAoMTM2MiwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUxLCAyMDc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhdHRlcm5GYWNldHMiIEAxMzY1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyMCwgMjAzOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXR0ZXJuRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjcyMjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQkEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzEzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUxLCAyMDc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjA3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3MiwgMjAzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA4NjQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NiIgQDEzNjgKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNywgMTQwMCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDODAyQTciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NyIgQDEzNjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzY4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTQwMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNhcmRpbmFsaXR5RmFjZXQiIEAxMzcwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2OAotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NDcsIDEzNTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2FyZGluYWxpdHlGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcxNzMwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUY1IgotCQkJCQljbGllbnQgICAgIAlAMTM2OAotCQkJCQlzdXBwbGllciAgIAlAMTMwNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNywgMTQwMCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDE0MDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODMsIDEzNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzQyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODYiIEAxMzczCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDI0MTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREIwMzc3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODciIEAxMzc0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM1QSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnJhY3Rpb25EaWdpdHNGYWNldCIgQDEzNzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzczCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDgsIDI1NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM3MzkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzY0IgotCQkJCQljbGllbnQgICAgIAlAMTM3MwotCQkJCQlzdXBwbGllciAgIAlAMTMxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAyNDEzKQotCQkJCQkgICAgKDEyNjIsIDI1OTYpCi0JCQkJCSAgICAoMjA2NSwgMjU5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NSwgMjU5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3OSwgMjU1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzODg2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5MCIgQDEzNzgKLQkJCQlsb2NhdGlvbiAgIAkoMTg0MSwgMTMwNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFMzAwRDkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5MSIgQDEzNzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEzNSwgLTc5MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFNDAzOEUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODQxLCAxMzA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTMwNikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJvdW5kZWRGYWNldCIgQDEzODAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEzNSwgLTc5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzMiwgMTI3MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitib3VuZGVkRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzE3NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFNDAzOTgiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODQxLCAxMzA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE1NCwgMTMwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NywgMTI3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU0NzE3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3MCIgQDEzODMKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjE4NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCRjAxOEMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3MSIgQDEzODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgzCi0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzAwMDZCIgotCQkJCQljbGllbnQgICAgIAlAMTM4MwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ3aGl0ZVNwYWNlRmFjZXQiIEAxMzg1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM4MwotCQkJCQlsb2NhdGlvbiAgIAkoLTY0MCwgNjM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjczLCAyMjA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3doaXRlU3BhY2VGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkwOTA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzAwMDc1IgotCQkJCQljbGllbnQgICAgIAlAMTM4MwotCQkJCQlzdXBwbGllciAgIAlAMTMxMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzI4LCAyMTg2KQotCQkJCQkgICAgKDEzMjgsIDIyNDYpCi0JCQkJCSAgICAoMjA5MywgMjI0NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMjI0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAzMywgMjIwMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI2NzYzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4OCIgQDEzODgKLQkJCQlsb2NhdGlvbiAgIAkoNjc0LCAxMzkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDA0OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg5IiBAMTM4OQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgKLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDNCOSIKLQkJCQkJY2xpZW50ICAgICAJQDEzODgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTM5MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm9yZGVyZWRGYWNldCIgQDEzOTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU4LCAxMzUzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK29yZGVyZWRGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYxNTM4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0MzIgotCQkJCQljbGllbnQgICAgIAlAMTM4OAotCQkJCQlzdXBwbGllciAgIAlAMTMwOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDEzNTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNDYxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzgiIEAxMzkzCi0JCQkJbG9jYXRpb24gICAJKDY4NywgMTI5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQjAzOUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3OSIgQDEzOTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzkzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzUsIDEyOTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJudW1lcmljRmFjZXQiIEAxMzk1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM5MwotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MDksIC01NzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OCwgMTI1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitudW1lcmljRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4MDk3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMSIKLQkJCQkJY2xpZW50ICAgICAJQDEzOTMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0MCwgMTI5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA2LCAxMjYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY4NDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkyIiBAMTM5OAotCQkJCWxvY2F0aW9uICAgCSgxNjg5LCAxNjYyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ0MDFFQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkzIiBAMTM5OQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTgKLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzYwIgotCQkJCQljbGllbnQgICAgIAlAMTM5OAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjg5LCAxNjYyKQotCQkJCQkgICAgKDE0ODcsIDE2NjIpCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heEZhY2V0IiBAMTQwMAotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTgKLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjksIDE2MjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4RmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MjA1MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDEzOTgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI2LCAxNjYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDQ0LCAxNjI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTUzODUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk0IiBAMTQwMwotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjU4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNTRGMDE0NSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk1IiBAMTQwNAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDMKLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtNDYyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM4QyIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IiBAMTQwNQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDMKLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtNDYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg1LCAyMjg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA4NTQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzk2IgotCQkJCQljbGllbnQgICAgIAlAMTQwMwotCQkJCQlzdXBwbGllciAgIAlAMTMxMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzI4LCAyMjU4KQotCQkJCQkgICAgKDEzMjgsIDIzMjQpCi0JCQkJCSAgICAoMjA5MywgMjMyNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMjMyNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwOSwgMjI5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4ODE3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NiIgQDE0MDgKLQkJCQlsb2NhdGlvbiAgIAkoMTI5NywgMjM2NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNDAxMUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NyIgQDE0MDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA4Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNUM1MDIwRCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiIEAxNDEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOAotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1NywgMjQ2MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI2OTA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjE3IgotCQkJCQljbGllbnQgICAgIAlAMTQwOAotCQkJCQlzdXBwbGllciAgIAlAMTMxNwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjk3LCAyMzY2KQotCQkJCQkgICAgKDEyOTcsIDI0OTkpCi0JCQkJCSAgICAoMjEwMiwgMjQ5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzY2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQ5OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNywgMjQ3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MzA4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5OCIgQDE0MTMKLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQ0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQTAwQUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5OSIgQDE0MTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxMzgiCi0JCQkJCWNsaWVudCAgICAgCUAxNDEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxNDE1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQxMwotCQkJCQlsb2NhdGlvbiAgIAkoLTExNzAsIC04MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDAsIDI2MzQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTg1MzE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkIwMTQyIgotCQkJCQljbGllbnQgICAgIAlAMTQxMwotCQkJCQlzdXBwbGllciAgIAlAMTMxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAyNDQ5KQotCQkJCQkgICAgKDEyNjIsIDI2NjgpCi0JCQkJCSAgICAoMjA2NSwgMjY2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NSwgMjY2OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4OSwgMjYyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI2NDg1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMCIgQDE0MTgKLQkJCQlsb2NhdGlvbiAgIAkoMTQyMiwgMjE1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMDAzQTYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMSIgQDE0MTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE4Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzcwLCAtMTMxMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTEiCi0JCQkJCWNsaWVudCAgICAgCUAxNDE4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0MjIsIDIxNTkpCi0JCQkJCSAgICAoMTM2MiwgMjE1OSkKLQkJCQkJICAgICgxMzYyLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjIsIDIxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlUGF0dGVybkZhY2V0IiBAMTQyMAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTgKLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzI3LCAyMTI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk5MDkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjEwMzEyIgotCQkJCQljbGllbnQgICAgIAlAMTQxOAotCQkJCQlzdXBwbGllciAgIAlAMTMxMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIxNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDIsIDIxMTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4OTIyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDIiIEAxNDIzCi0JCQkJbG9jYXRpb24gICAJKDEwODQsIDIwODMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0EwMjZCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDMiIEAxNDI0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMwotCQkJCQlsb2NhdGlvbiAgIAkoODI4LCAtMTM3MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQjAxODYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDIzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAyMDgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiIEAxNDI1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMwotCQkJCQlsb2NhdGlvbiAgIAkoODI4LCAtMTM3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAyMTAxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODYxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE5MCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA4NCwgMjA4MykKLQkJCQkJICAgICgxMDg0LCAyMTQzKQotCQkJCQkgICAgKDQ4NSwgMjE0MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAyMDgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMTQzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDIxMDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkzMTcxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDgiIEAxNDI4Ci0JCQkJbG9jYXRpb24gICAJKDExMjIsIDIyNDEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwMDUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDkiIEAxNDI5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQyOAotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtNDc5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDNCOSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiIEAxNDMwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyOAotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtNDc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTGVuZ3RoRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MTczMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDNDMyIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTEyMiwgMjI0MSkKLQkJCQkJICAgICgxMTIyLCAyMzE4KQotCQkJCQkgICAgKDM4NywgMjMxOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg3LCAyMzE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NzAsIDIyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODU2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTYiIEAxNDMzCi0JCQkJbG9jYXRpb24gICAJKDc3MywgMTU2NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NTAyNUIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NyIgQDE0MzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDMzCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3MCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzczLCAxNTY1KQotCQkJCQkgICAgKDk1OSwgMTU2NSkKLQkJCQkJICAgICg5NTksIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluRmFjZXQiIEAxNDM1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMwotCQkJCQlsb2NhdGlvbiAgIAkoNDY5LCAxMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzUzLCAxNTMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjMwOTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NjAyN0EiCi0JCQkJCWNsaWVudCAgICAgCUAxNDMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDE1NjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNCwgMTUyMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ2NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMCIgQDE0MzgKLQkJCQlsb2NhdGlvbiAgIAkoODE2LCAxNjUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCOTcwMDFEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzExIiBAMTQzOQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzgKLQkJCQkJbG9jYXRpb24gICAJKDQ5NiwgLTMzNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MTAwQ0YiCi0JCQkJCWNsaWVudCAgICAgCUAxNDM4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDgxNiwgMTY1MCkKLQkJCQkJICAgICg5NTksIDE2NTApCi0JCQkJCSAgICAoOTU5LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkZhY2V0IiBAMTQ0MAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzgKLQkJCQkJbG9jYXRpb24gICAJKDQ5NiwgLTMzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY0LCAxNjE0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1pbkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNDE2MTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MTAwRDkiCi0JCQkJCWNsaWVudCAgICAgCUAxNDM4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTYsIDE2NTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDE2NTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMTYwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAyNzQwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MCIgQDE0NDMKLQkJCQlsb2NhdGlvbiAgIAkoMTI5NywgMjMyMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDRjAxOTkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MSIgQDE0NDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQzCi0JCQkJCWxvY2F0aW9uICAgCSgtNzE5LCA0OTcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDg1IgotCQkJCQljbGllbnQgICAgIAlAMTQ0MwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjMyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhMZW5ndGhGYWNldCIgQDE0NDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQzCi0JCQkJCWxvY2F0aW9uICAgCSgtNzE5LCA0OTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzAsIDIzODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4TGVuZ3RoRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjI1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQyMDA4RiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI5NywgMjMyMSkKLQkJCQkJICAgICgxMjk3LCAyNDA5KQotCQkJCQkgICAgKDIxMDIsIDI0MDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjMyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDIsIDI0MDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTQsIDIzNjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3OTIwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODIiIEAxNDQ4Ci0JCQkJbG9jYXRpb24gICAJKDExNTksIDIyNzMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDUwMEM1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODMiIEAxNDQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTI4MSwgNDQ5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ2MDAxRCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTU5LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluTGVuZ3RoRmFjZXQiIEAxNDUwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTI4MSwgNDQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDIzNzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluTGVuZ3RoRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxOTUyNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ2MDAyNyIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE1OSwgMjI3MykKLQkJCQkJICAgICgxMTU5LCAyNDA5KQotCQkJCQkgICAgKDQ1MCwgMjQwOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCAyNDA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjMsIDIzNjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzYxMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDYiIEAxNDUzCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDIzMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTgwMTZEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDciIEAxNDU0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1MwotCQkJCQlsb2NhdGlvbiAgIAkoOTQxLCAtNjEwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODk5MDA1NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiIEAxNDU1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1MwotCQkJCQlsb2NhdGlvbiAgIAkoOTQxLCAtNjEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTYsIDI0NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MjYwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODk5MDA2MCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE5NywgMjMzNCkKLQkJCQkJICAgICgxMTk3LCAyNDkzKQotCQkJCQkgICAgKDQ1MCwgMjQ5MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAyMzM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCAyNDkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDI0NTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNjA0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDQiIEAxNDU4Ci0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDI0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDAwMDYyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDUiIEAxNDU5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1OAotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAxRCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCIgQDE0NjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMjYzMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTcwMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MTAwMjciCi0JCQkJCWNsaWVudCAgICAgCUAxNDU4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMzEsIDI0MzgpCi0JCQkJCSAgICAoMTIzMSwgMjY2OCkKLQkJCQkJICAgICg0NTEsIDI2NjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjY2OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAyNjMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTg4MTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg0IiBAMTQ2MwotCQkJCWxvY2F0aW9uICAgCSgxMjMxLCAyMzk3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDBERSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg1IiBAMTQ2NAotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjMKLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzQ0QiCi0JCQkJCWNsaWVudCAgICAgCUAxNDYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInRvdGFsRGlnaXRzRmFjZXQiIEAxNDY1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTMsIDI1NTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdG90YWxEaWdpdHNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTg1NTY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwM0Q3IgotCQkJCQljbGllbnQgICAgIAlAMTQ2MwotCQkJCQlzdXBwbGllciAgIAlAMTMxOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjMxLCAyMzk3KQotCQkJCQkgICAgKDEyMzEsIDI1ODcpCi0JCQkJCSAgICAoNDUxLCAyNTg3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDI1ODcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNSwgMjU2MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE0NjQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMTQ2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA3NjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDE5LCA1NzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTQxMwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNDY5Ci0JCQkJbG9jYXRpb24gICAJKDEyMDksIDEwNjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDE0NjgKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEyMDksIDEwNjUpCi0JCQkJICAgICgxMjA5LCA5NzQpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQwIiBAMTQ3MAotCQkJCWxvY2F0aW9uICAgCSgxMDkwLCAxMDMxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjg4MEY1MDNEOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTQ3MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzAKLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTcsIDEwMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk4NzY1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxOTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDAzQyIKLQkJCQkJY2xpZW50ICAgICAJQDE0NzAKLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCA5NzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMjEsIDEwMzQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjE3MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MSIgQDE0NzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDcwCi0JCQkJCWxvY2F0aW9uICAgCSgzMjIsIC0yNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGOTAwNDYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDcwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5MCwgMTA4OCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ2IiBAMTQ3NQotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA4NzMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REIwMUU1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZSIgQDE0NzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDc1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OCwgNzkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNzYwODcwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REQwM0REIgotCQkJCQljbGllbnQgICAgIAlAMTQ3NQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM4LCA4NzMpCi0JCQkJCSAgICAoMTUzOCwgOTE5KQotCQkJCQkgICAgKDE0NTQsIDkxOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA5MTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDksIDg3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDE2NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDciIEAxNDc5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3NQotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REQwM0RFIgotCQkJCQljbGllbnQgICAgIAlAMTQ3NQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM4LCA4NzMpCi0JCQkJCSAgICAoMTUzOCwgODI4KQotCQkJCQkgICAgKDE0NTQsIDgyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA4MjgpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0OCIgQDE0ODAKLQkJCQlsb2NhdGlvbiAgIAkoMTUzNSwgNjg0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzEyMDEwOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGUiIEAxNDgxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4MAotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTksIDU5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjk3NzI3MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1MSIKLQkJCQkJY2xpZW50ICAgICAJQDE0ODAKLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzNSwgNjg0KQotCQkJCQkgICAgKDE1MzUsIDcyOCkKLQkJCQkJICAgICgxNDU0LCA3MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNzI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA2LCA2ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjc3NzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0OSIgQDE0ODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDgwCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNUIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDgwCi0JCQkJCXN1cHBsaWVyICAgCUAxNDY4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzUsIDY4NCkKLQkJCQkJICAgICgxNTM1LCA2NDEpCi0JCQkJCSAgICAoMTQ1NCwgNjQxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDY0MSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUyIiBAMTQ4NQotCQkJCWxvY2F0aW9uICAgCSg2MTMsIDk0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdFRDAzQzAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbXBsZXhUeXBlIiBAMTQ4NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODUKLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDY1LCA5ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcGxleFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MzA1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBN0Y0MDExNyIKLQkJCQkJY2xpZW50ICAgICAJQDE0ODUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjEzLCA5NDApCi0JCQkJCSAgICAoMjg0LCA5NDApCi0JCQkJCSAgICAoMjg0LCAxMDA4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYxMywgOTQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg0LCAxMDA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDk3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTA5MzIwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTMiIEAxNDg5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBN0Y0MDEyMSIKLQkJCQkJY2xpZW50ICAgICAJQDE0ODUKLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYxMywgOTQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMCwgOTQwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiCi0JCQkJY2xpZW50ICAgICAJQDE0NjgKLQkJCQlzdXBwbGllciAgIAlAMTI5OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTIsIDU2MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExMiwgNTEwKQotCQkJCWRyYXdTdXBwbGllciAJQDEyOTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlAMTMyMAotCQkJCXN1cHBsaWVyICAgCUAxNDY4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NiwgMTA4OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0NiwgMTA2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDY5KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTAiIEAxNDkyCi0JCQkJbG9jYXRpb24gICAJKDEzNjIsIDExMzMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEIwMTc4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlIiBAMTQ5MwotCQkJCQlQYXJlbnRfVmlldyAJQDE0OTIKLQkJCQkJbG9jYXRpb24gICAJKC0xNTgsIC0xNjMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTksIDEwOTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2ltcGxlVHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI0Njc1MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxN0IiCi0JCQkJCWNsaWVudCAgICAgCUAxNDkyCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTI5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMSwgMTA5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIyNzI3MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUxIiBAMTQ5NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0OTIKLQkJCQkJbG9jYXRpb24gICAJKC0xNTgsIC0xNjMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEQwMTg1IgotCQkJCQljbGllbnQgICAgIAlAMTQ5MgotCQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MiwgMTEzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDk3NCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDE0OTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAzODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDAyLCAzMDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDAyLCAzNjMpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTU1MAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBnbG9iYWwgOiBib29sZWFuIgotCQkJCQkiKyBmZWF0dXJlUmVmZXJlbmNlIDogYm9vbGVhbiIpKQotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNDk4Ci0JCQkJbG9jYXRpb24gICAJKDIyNjIsIDU2OCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTQ5NwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjI2MiwgNTY4KQotCQkJCSAgICAoMjI2MiwgNDc3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlAMTI5NAotCQkJCXN1cHBsaWVyICAgCUAxNDk3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzQ2LCA1NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ5OCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ0IiBAMTUwMAotCQkJCWxvY2F0aW9uICAgCSgxNTUzLCA0NTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjIwMUE0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlIiBAMTUwMQotCQkJCQlQYXJlbnRfVmlldyAJQDE1MDAKLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzMxLCA0OTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MjY2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkU1IgotCQkJCQljbGllbnQgICAgIAlAMTUwMAotCQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTUzLCA0NTMpCi0JCQkJCSAgICAoMTIyMiwgNDUzKQotCQkJCQkgICAgKDEyMjIsIDU2MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIyLCA1NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODUsIDQ3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODEyMDMwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDUiIEAxNTA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTUwMAotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkYwIgotCQkJCQljbGllbnQgICAgIAlAMTUwMAotCQkJCQlzdXBwbGllciAgIAlAMTQ5NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1MywgNDUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgNDUzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzYiIEAxNTA1Ci0JCQkJbG9jYXRpb24gICAJKDE5MDgsIDM1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwNjAyRDciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRmVhdHVyZSIgQDE1MDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjY4LCAtMTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzI5LCAzNTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRGZWF0dXJlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI5NDEyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjkwMTBCMDAwRSIKLQkJCQkJY2xpZW50ICAgICAJQDE1MDUKLQkJCQkJc3VwcGxpZXIgICAJQDE0OTcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTkwOCwgMzUzKQotCQkJCQkgICAgKDE5MDgsIDM4NykKLQkJCQkJICAgICgxOTkzLCAzODcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgMzg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTQ1LCAzNTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NjYzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM3IiBAMTUwOQotCQkJCQlQYXJlbnRfVmlldyAJQDE1MDUKLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDE4IgotCQkJCQljbGllbnQgICAgIAlAMTUwNQotCQkJCQlzdXBwbGllciAgIAlAMTQ5NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxOTA4LCAzNTMpCi0JCQkJCSAgICAoMTkwOCwgMzE5KQotCQkJCQkgICAgKDE5OTMsIDMxOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzMTkpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQljbGllbnQgICAgIAlAMTI5OAotCQkJCXN1cHBsaWVyICAgCUAxMjk3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg0OTQsIDI4NCkKLQkJCQkgICAgKDQ5NCwgMjQ0KQotCQkJCSAgICAoOTk2LCAyNDQpKQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMjg0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTYsIDI0NCkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyIKLQkJCQljbGllbnQgICAgIAlAMTI4NQotCQkJCXN1cHBsaWVyICAgCUAxNDk3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcxOCwgODEyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzE4LCA1NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ5OCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTEyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUAxMzIyCi0JCQkJc3VwcGxpZXIgICAJQDE0NjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY1LCAxMjkyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjY1LCAxMDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDE0NjkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxMwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQljbGllbnQgICAgIAlAMTQ5NwotCQkJCXN1cHBsaWVyICAgCUAxMjk3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMTQ3LCAyOTEpCi0JCQkJICAgICgyMTQ3LCAyNDQpCi0JCQkJICAgICgxNDY4LCAyNDQpKQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNDcsIDI5MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMjQ0KSkpKSkpKQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBQzkxMDUxMDNCMiIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om1pbWUiIEAxNTE0Ci0JCQlsb2NhdGlvbiAgIAkoNDAwLCAyNDApCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNAotCQkJICAgIGxvY2F0aW9uICAgCSgyNTYsIDE1NikKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJIm1pbWUiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjNBQzkxMjdDMDI2NiIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkbCIgQDE1MTUKLQkJCWxvY2F0aW9uICAgCSg4ODAsIDI0MCkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTE1Ci0JCQkgICAgbG9jYXRpb24gICAJKDczNiwgMTU2KQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkid3NkbCIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiM0FERkI4RTUwMjFFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp4c2QiIEAxNTE2Ci0JCQlsb2NhdGlvbiAgIAkoMTM3NiwgMjQwKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MTYKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMTU2KQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkieHNkIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzOUFCREM2RjAxQUEiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyIKLQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzFGIgotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQUM5MTA1MjAwMUEiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3NlcwotCXF1aWQgICAgICAgCSIzQUM5MTA1MTAzMjYiCi0JUHJvY3NORGV2cyAJKGxpc3QKLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyIKLQkJcXVpZCAgICAgICAJIjNBQzkxMDUxMDMyOCIKLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMKLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlIgotCQkJdmFsdWUgICAgICAJKCJEYXRhQmFzZVNldCIgODAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiQU5TSSIKLQkJCQl2YWx1ZSAgICAgIAk4MDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJPcmFjbGUiCi0JCQkJdmFsdWUgICAgICAJODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiU1FMU2VydmVyIgotCQkJCXZhbHVlICAgICAgCTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIlN5YmFzZSIKLQkJCQl2YWx1ZSAgICAgIAk4MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJXYXRjb20iCi0JCQkJdmFsdWUgICAgICAJODA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJJZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVl8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lIgotCQkJdmFsdWUgICAgICAJIlRfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkluaGVyaXRTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiX1YiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQmFzZVZpZXdzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJWQVJDSEFSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiTnVsbHNPSyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSURMRWxlbWVudCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExTcGVjaWZpY2F0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSURMU3BlY1NldCIgMjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSURMU3BlY1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlR5cGVkZWYiCi0JCQkJdmFsdWUgICAgICAJNTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJFeGNlcHRpb24iCi0JCQkJdmFsdWUgICAgICAJNjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTdHJ1Y3QiCi0JCQkJdmFsdWUgICAgICAJNTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJVbmlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4MSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLm1pbWUvc3JjL3Jvc2UvbWltZWJpbmRpbmdNREwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUlETE1vZHVsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5taW1lL3NyYy9yb3NlL21pbWViaW5kaW5nTURMLm1kbCwgY3RjLCBpYm1jdGMiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJtXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJzXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9vdERpciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTSIKLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdW4iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk1pY3Jvc29mdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiSUJNIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiCi0JCQl2YWx1ZSAgICAgIAkzKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJfSUQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIgotCQkJCXZhbHVlICAgICAgCTE4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIgotCQkJCXZhbHVlICAgICAgCTE4MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiIKLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUk9XIgotCQkJCXZhbHVlICAgICAgCTE3MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIgotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIgotCQkJCXZhbHVlICAgICAgCTE2MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiNiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5IgotCQkJdmFsdWUgICAgICAJImNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5taW1lL3NyYy9yb3NlL21pbWViaW5kaW5nTURMLm1kbCwgY3RjLCBpYm1jdGMiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5taW1lL3NyYy9yb3NlL21pbWViaW5kaW5nTURMLm1kbCwgY3RjLCBpYm1jdGMiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIgotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGVudCIKLQkJCXZhbHVlICAgICAgCTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5IgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAk1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiCi0JCQkJdmFsdWUgICAgICAJNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiU0NDIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUeXBlTGliSW1wb3J0ZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTIxMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIgotCQkJdmFsdWUgICAgICAJIjAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSIKLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZSIKLQkJCXZhbHVlICAgICAgCSgiQ3JlYXRhYmxlU2V0IiAyMjEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbml0aWFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUZXJtaW5hdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbkNsYXNzIgotCQkJdmFsdWUgICAgICAJIkNvbGxlY3Rpb24iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiQmluYXJ5IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlRleHQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkb3BlcmF0aW9uIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlIyRWRpdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpKQotCXF1aWQgICAgICAgCSIzQUM5MTA1MTAzMjciKSkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODY2ZjgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRUNvbnRlbnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVDb250ZW50IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVDb250ZW50X1R5cGUoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVQYXJ0KFBhcnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFydCBnZXRFUGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFUGFydChQYXJ0IHZhbHVlKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcnQoU3RyaW5nIHBhcnQpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXJ0KCk7Ci0KLX0gLy8gTUlNRUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVlMTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNSU1FRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbC5NSU1FRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRUNvbnRlbnQgY3JlYXRlTUlNRUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRVBhcnQgY3JlYXRlTUlNRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNSU1FTXVsdGlwYXJ0UmVsYXRlZCBjcmVhdGVNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaW1lIFhtbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWltZSBYbWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVNaW1lWG1sIGNyZWF0ZU1JTUVNaW1lWG1sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVQYWNrYWdlIGdldE1JTUVQYWNrYWdlKCk7Ci0KLX0gLy9NSU1FRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRU1pbWVYbWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVNaW1lWG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Nzk0YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRU1pbWVYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWltZSBYbWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sI2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVNaW1lWG1sKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNSU1FTWltZVhtbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVQYXJ0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVQYXJ0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFUGFydChQYXJ0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVNaW1lWG1sX0VQYXJ0KCkKLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhcnQgZ2V0RVBhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVQYXJ0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RVBhcnQoUGFydCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJ0KFN0cmluZyBwYXJ0KTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFydCgpOwotCi19IC8vIE1JTUVNaW1lWG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTXVsdGlwYXJ0UmVsYXRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRU11bHRpcGFydFJlbGF0ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhN2IzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTXVsdGlwYXJ0UmVsYXRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aXBhcnQgUmVsYXRlZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQjZ2V0RU1JTUVQYXJ0IDxlbT5FTUlNRSBQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVNdWx0aXBhcnRSZWxhdGVkIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTUlNRSBQYXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVNSU1FIFBhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTUlNRSBQYXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVNdWx0aXBhcnRSZWxhdGVkX0VNSU1FUGFydCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVNSU1FUGFydCgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgYWRkTUlNRVBhcnQoTUlNRVBhcnQgbWltZVBhcnQpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5MaXN0IiBwYXJhbWV0ZXJzPSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TUlNRVBhcnRzKCk7Ci0KLX0gLy8gTUlNRU11bHRpcGFydFJlbGF0ZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjg3NmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibWltZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvTUlNRSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJtaW1lIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGwuTUlNRVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRUNvbnRlbnRJbXBsIDxlbT5Db250ZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0TUlNRUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX0VQQVJUID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFydEltcGwgPGVtPlBhcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFydEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRNSU1FUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX1BBUlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9QQVJUX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCA8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTVVMVElQQVJUX1JFTEFURURfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTUlNRSBQYXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNaW1lWG1sSW1wbCA8ZW0+TWltZSBYbWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTWltZVhtbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRNSU1FTWltZVhtbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NSU1FX1hNTF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUxfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUxfX0VQQVJUID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NaW1lIFhtbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgPGVtPklNSU1FIFBhcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldElNSU1FUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTUlNRV9QQVJUID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1JTUUgUGFydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUlNRV9QQVJUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldElNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTUlNRV9NVUxUSVBBUlRfUkVMQVRFRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklNSU1FIE11bHRpcGFydCBSZWxhdGVkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNSU1FX01VTFRJUEFSVF9SRUxBVEVEX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCA8ZW0+SU1JTUUgQ29udGVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0SU1JTUVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNSU1FX0NPTlRFTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTUlNRSBDb250ZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNSU1FX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIDxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0SU1JTUVNaW1lWG1sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNSU1FX01JTUVfWE1MID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1JTUVfTUlNRV9YTUxfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxpc3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldExpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTElTVCA9IDg7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNSU1FQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0TUlNRUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1JTUVDb250ZW50X1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVQYXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldEVQYXJ0KCkKLQkgKiBAc2VlICNnZXRNSU1FQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydCA8ZW0+UGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNSU1FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIDxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQjZ2V0RU1JTUVQYXJ0IDxlbT5FTUlNRSBQYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FTUlNRSBQYXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkI2dldEVNSU1FUGFydCgpCi0JICogQHNlZSAjZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1JTUVNdWx0aXBhcnRSZWxhdGVkX0VNSU1FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sIDxlbT5NaW1lIFhtbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NaW1lIFhtbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TUlNRU1pbWVYbWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sI2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVQYXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sI2dldEVQYXJ0KCkKLQkgKiBAc2VlICNnZXRNSU1FTWltZVhtbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TUlNRU1pbWVYbWxfRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IDxlbT5JTUlNRSBQYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklNSU1FIFBhcnQ8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJTUlNRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIDxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQgPGVtPklNSU1FIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1JTUUgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElNSU1FQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwgPGVtPklNSU1FIE1pbWUgWG1sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklNSU1FIE1pbWUgWG1sPC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SU1JTUVNaW1lWG1sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLkxpc3QgPGVtPkxpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxpc3Q8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTGlzdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVGYWN0b3J5IGdldE1JTUVGYWN0b3J5KCk7Ci0KLX0gLy9NSU1FUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2I4MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRVBhcnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVQYXJ0IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudChqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5MaXN0IiBwYXJhbWV0ZXJzPSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLX0gLy8gTUlNRVBhcnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY3NmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsLk1JTUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVDb250ZW50SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FQ29udGVudEltcGwjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRUNvbnRlbnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTUlNRUNvbnRlbnQgewotCS8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVBhcnQoKSA8ZW0+RVBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFydCBlUGFydCA9IG51bGw7Ci0JCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFydDsgLy8gVEJECi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTUlNRUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTUlNRVBhY2thZ2UuZUlOU1RBTkNFLmdldE1JTUVDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJ0IGdldEVQYXJ0KCkgewotCQlpZiAoZVBhcnQgIT0gbnVsbCAmJiBlUGFydC5lSXNQcm94eSgpKSB7Ci0JCQlQYXJ0IG9sZEVQYXJ0ID0gZVBhcnQ7Ci0JCQllUGFydCA9IChQYXJ0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllUGFydCk7Ci0JCQlpZiAoZVBhcnQgIT0gb2xkRVBhcnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VQQVJULCBvbGRFUGFydCwgZVBhcnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZVBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnQgYmFzaWNHZXRFUGFydCgpIHsKLQkJcmV0dXJuIGVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVQYXJ0KFBhcnQgbmV3RVBhcnQpIHsKLQkJUGFydCBvbGRFUGFydCA9IGVQYXJ0OwotCQllUGFydCA9IG5ld0VQYXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VQQVJULCBvbGRFUGFydCwgZVBhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydChTdHJpbmcgcGFydCkgewotICAgICAgdGhpcy5wYXJ0ID0gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0KCkgewotICAgICAgcmV0dXJuIHBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FUEFSVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVQYXJ0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVBhcnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VQQVJUOgotCQkJCXNldEVQYXJ0KChQYXJ0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQ6Ci0JCQkJc2V0RVBhcnQoKFBhcnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQ6Ci0JCQkJcmV0dXJuIGVQYXJ0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldFBhcnQKLSAgICAgIChNSU1FQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgTUlNRUNvbnN0YW50cy5QQVJUX0FUVFJJQlVURSkpOwotICAJc2V0VHlwZQotICAgICAgKE1JTUVDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBNSU1FQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuIGdldE1JTUVDb250ZW50X0VQYXJ0KCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxNSU1FQ29uc3RhbnRzLlBBUlRfQVRUUklCVVRFLGdldFBhcnQoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gTUlNRVBhY2thZ2UuZUlOU1RBTkNFLiBnZXRNSU1FQ29udGVudF9UeXBlKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxNSU1FQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLGdldFR5cGUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoTUlNRUNvbnN0YW50cy5NSU1FX05BTUVTUEFDRV9VUkksIE1JTUVDb25zdGFudHMuQ09OVEVOVF9FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9IAotICAKLX0gLy9NSU1FQ29udGVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjYwN2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1JTUVGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1JTUVGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVDogcmV0dXJuIGNyZWF0ZU1JTUVDb250ZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVDogcmV0dXJuIGNyZWF0ZU1JTUVQYXJ0KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURUQ6IHJldHVybiBjcmVhdGVNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MOiByZXR1cm4gY3JlYXRlTUlNRU1pbWVYbWwoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLkxJU1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpc3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLkxJU1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMaXN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FQ29udGVudCBjcmVhdGVNSU1FQ29udGVudCgpIHsKLQkJTUlNRUNvbnRlbnRJbXBsIG1pbWVDb250ZW50ID0gbmV3IE1JTUVDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gbWltZUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVQYXJ0IGNyZWF0ZU1JTUVQYXJ0KCkgewotCQlNSU1FUGFydEltcGwgbWltZVBhcnQgPSBuZXcgTUlNRVBhcnRJbXBsKCk7Ci0JCXJldHVybiBtaW1lUGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRU11bHRpcGFydFJlbGF0ZWQgY3JlYXRlTUlNRU11bHRpcGFydFJlbGF0ZWQoKSB7Ci0JCU1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCBtaW1lTXVsdGlwYXJ0UmVsYXRlZCA9IG5ldyBNSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwoKTsKLQkJcmV0dXJuIG1pbWVNdWx0aXBhcnRSZWxhdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FTWltZVhtbCBjcmVhdGVNSU1FTWltZVhtbCgpIHsKLQkJTUlNRU1pbWVYbWxJbXBsIG1pbWVNaW1lWG1sID0gbmV3IE1JTUVNaW1lWG1sSW1wbCgpOwotCQlyZXR1cm4gbWltZU1pbWVYbWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgY3JlYXRlTGlzdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKExpc3Qpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TGlzdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRVBhY2thZ2UgZ2V0TUlNRVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoTUlNRVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTUlNRVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIE1JTUVQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci19IC8vTUlNRUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVNaW1lWG1sSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FTWltZVhtbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3ZTZhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVNaW1lWG1sSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbC5NSU1FQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaW1lIFhtbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRU1pbWVYbWxJbXBsI2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1JTUVNaW1lWG1sSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1JTUVNaW1lWG1sIHsKLQkvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUGFydCgpIDxlbT5FUGFydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQYXJ0IGVQYXJ0ID0gbnVsbDsKLQkKLSAgICBwcml2YXRlIFN0cmluZyBwYXJ0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1JTUVNaW1lWG1sSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1JTUVQYWNrYWdlLmVJTlNUQU5DRS5nZXRNSU1FTWltZVhtbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJ0IGdldEVQYXJ0KCkgewotCQlpZiAoZVBhcnQgIT0gbnVsbCAmJiBlUGFydC5lSXNQcm94eSgpKSB7Ci0JCQlQYXJ0IG9sZEVQYXJ0ID0gZVBhcnQ7Ci0JCQllUGFydCA9IChQYXJ0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllUGFydCk7Ci0JCQlpZiAoZVBhcnQgIT0gb2xkRVBhcnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FUEFSVCwgb2xkRVBhcnQsIGVQYXJ0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJ0IGJhc2ljR2V0RVBhcnQoKSB7Ci0JCXJldHVybiBlUGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFUGFydChQYXJ0IG5ld0VQYXJ0KSB7Ci0JCVBhcnQgb2xkRVBhcnQgPSBlUGFydDsKLQkJZVBhcnQgPSBuZXdFUGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRVBBUlQsIG9sZEVQYXJ0LCBlUGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0KFN0cmluZyBwYXJ0KSB7Ci0gICAgICB0aGlzLnBhcnQgPSBwYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnQoKSB7Ci0gICAgICByZXR1cm4gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FUEFSVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVQYXJ0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVBhcnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VQQVJUOgotCQkJCXNldEVQYXJ0KChQYXJ0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRVBBUlQ6Ci0JCQkJc2V0RVBhcnQoKFBhcnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VQQVJUOgotCQkJCXJldHVybiBlUGFydCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAJc2V0UGFydAotICAgICAgKE1JTUVDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBNSU1FQ29uc3RhbnRzLlBBUlRfQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuIGdldE1JTUVDb250ZW50X0VQYXJ0KCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxNSU1FQ29uc3RhbnRzLlBBUlRfQVRUUklCVVRFLGdldFBhcnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoTUlNRUNvbnN0YW50cy5NSU1FX05BTUVTUEFDRV9VUkksIE1JTUVDb25zdGFudHMuTUlNRV9YTUxfRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfSAKLX0gLy9NSU1FTWltZVhtbEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDI5YzlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsLk1JTUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpcGFydCBSZWxhdGVkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwjZ2V0RU1JTUVQYXJ0IDxlbT5FTUlNRSBQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTUlNRU11bHRpcGFydFJlbGF0ZWQgewotCS8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFTUlNRVBhcnQoKSA8ZW0+RU1JTUUgUGFydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFTUlNRVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlTUlNRVBhcnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1JTUVQYWNrYWdlLmVJTlNUQU5DRS5nZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFTUlNRVBhcnQoKSB7Ci0JCWlmIChlTUlNRVBhcnQgPT0gbnVsbCkgewotCQkJZU1JTUVQYXJ0ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1JTUVQYXJ0LmNsYXNzLCB0aGlzLCBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUKTsKLQkJfQotCQlyZXR1cm4gZU1JTUVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNSU1FUGFydChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCBtaW1lUGFydCkgewotCQlnZXRFTUlNRVBhcnQoKS5hZGQobWltZVBhcnQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1JTUVQYXJ0cygpIHsKLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFTUlNRVBhcnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVDoKLQkJCQlyZXR1cm4gZ2V0RU1JTUVQYXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUOgotCQkJCWdldEVNSU1FUGFydCgpLmNsZWFyKCk7Ci0JCQkJZ2V0RU1JTUVQYXJ0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVDoKLQkJCQlnZXRFTUlNRVBhcnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUOgotCQkJCXJldHVybiBlTUlNRVBhcnQgIT0gbnVsbCAmJiAhZU1JTUVQYXJ0LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gICAgewotICAgICAgaWYgKE1JTUVDb25zdGFudHMuUEFSVF9FTEVNRU5UX1RBRy5lcXVhbHMoY2hpbGQuZ2V0TG9jYWxOYW1lKCkpKQotICAgICAgewotICAgICAgICBNSU1FUGFydCBtaW1lUGFydCA9IE1JTUVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNSU1FUGFydCgpOwotCSAgICBtaW1lUGFydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JICAgIG1pbWVQYXJ0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBhZGRNSU1FUGFydChtaW1lUGFydCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoTUlNRUNvbnN0YW50cy5NSU1FX05BTUVTUEFDRV9VUkksIE1JTUVDb25zdGFudHMuTVVMVElQQVJUX1JFTEFURURfRUxFTUVOVF9UQUcpOwotICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICAgIH0gCi0gICAgCi19IC8vTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1NGM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFBhY2thZ2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1JTUVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE1JTUVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaW1lQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaW1lUGFydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaW1lTWltZVhtbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbWltZVBhcnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGltaW1lQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbWltZU1pbWVYbWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGlzdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1JTUVQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTUlNRUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTUlNRVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE1JTUVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChNSU1FUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlLgotCQlNSU1FUGFja2FnZUltcGwgdGhlTUlNRVBhY2thZ2UgPSAoTUlNRVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBNSU1FUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFdTRExQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoV1NETFBhY2thZ2UuZU5TX1VSSSkgOiBXU0RMUGFja2FnZUltcGwuZUlOU1RBTkNFKTsKLQotCQkvLyBTdGVwIDE6IGNyZWF0ZSBtZXRhLW1vZGVsIG9iamVjdHMKLQkJdGhlTUlNRVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdTRExQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIFN0ZXAgMjogY29tcGxldGUgaW5pdGlhbGl6YXRpb24KLQkJdGhlTUlNRVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXU0RMUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJcmV0dXJuIHRoZU1JTUVQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TUlNRUNvbnRlbnQoKSB7Ci0JCXJldHVybiBtaW1lQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNSU1FQ29udGVudF9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWltZUNvbnRlbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNSU1FQ29udGVudF9FUGFydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1pbWVDb250ZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNSU1FUGFydCgpIHsKLQkJcmV0dXJuIG1pbWVQYXJ0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKSB7Ci0JCXJldHVybiBtaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZF9FTUlNRVBhcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TUlNRU1pbWVYbWwoKSB7Ci0JCXJldHVybiBtaW1lTWltZVhtbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNSU1FTWltZVhtbF9FUGFydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1pbWVNaW1lWG1sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJTUlNRVBhcnQoKSB7Ci0JCXJldHVybiBpbWltZVBhcnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJTUlNRU11bHRpcGFydFJlbGF0ZWQoKSB7Ci0JCXJldHVybiBpbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJTUlNRUNvbnRlbnQoKSB7Ci0JCXJldHVybiBpbWltZUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJTUlNRU1pbWVYbWwoKSB7Ci0JCXJldHVybiBpbWltZU1pbWVYbWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRMaXN0KCkgewotCQlyZXR1cm4gbGlzdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRUZhY3RvcnkgZ2V0TUlNRUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTUlNRUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJbWltZUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlNRV9DT05URU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtaW1lQ29udGVudEVDbGFzcywgTUlNRV9DT05URU5UX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtaW1lQ29udGVudEVDbGFzcywgTUlNRV9DT05URU5UX19FUEFSVCk7Ci0KLQkJbWltZVBhcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlNRV9QQVJUKTsKLQotCQltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX01VTFRJUEFSVF9SRUxBVEVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcywgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVCk7Ci0KLQkJbWltZU1pbWVYbWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlNRV9NSU1FX1hNTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWltZU1pbWVYbWxFQ2xhc3MsIE1JTUVfTUlNRV9YTUxfX0VQQVJUKTsKLQotCQlpbWltZVBhcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1JTUVfUEFSVCk7Ci0KLQkJaW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNSU1FX01VTFRJUEFSVF9SRUxBVEVEKTsKLQotCQlpbWltZUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1JTUVfQ09OVEVOVCk7Ci0KLQkJaW1pbWVNaW1lWG1sRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNSU1FX01JTUVfWE1MKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlsaXN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKExJU1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdTRExQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJbWltZUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCW1pbWVDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU1JTUVDb250ZW50KCkpOwotCQltaW1lUGFydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJbWltZVBhcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTUlNRVBhcnQoKSk7Ci0JCW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpKTsKLQkJbWltZU1pbWVYbWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCW1pbWVNaW1lWG1sRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU1JTUVNaW1lWG1sKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MobWltZUNvbnRlbnRFQ2xhc3MsIE1JTUVDb250ZW50LmNsYXNzLCAiTUlNRUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNSU1FQ29udGVudF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKSwgdGhlV1NETFBhY2thZ2UuZ2V0UGFydCgpLCBudWxsLCAiZVBhcnQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKG1pbWVDb250ZW50RUNsYXNzLCBudWxsLCAic2V0UGFydCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFydCIpOwotCi0JCWFkZEVPcGVyYXRpb24obWltZUNvbnRlbnRFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRQYXJ0Iik7Ci0KLQkJaW5pdEVDbGFzcyhtaW1lUGFydEVDbGFzcywgTUlNRVBhcnQuY2xhc3MsICJNSU1FUGFydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1pbWVQYXJ0RUNsYXNzLCBudWxsLCAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhlV1NETFBhY2thZ2UuZ2V0SUV4dGVuc2liaWxpdHlFbGVtZW50KCksICJleHRlbnNpYmlsaXR5RWxlbWVudCIpOwotCi0JCWFkZEVPcGVyYXRpb24obWltZVBhcnRFQ2xhc3MsIHRoaXMuZ2V0TGlzdCgpLCAiZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIik7Ci0KLQkJaW5pdEVDbGFzcyhtaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcywgTUlNRU11bHRpcGFydFJlbGF0ZWQuY2xhc3MsICJNSU1FTXVsdGlwYXJ0UmVsYXRlZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1JTUVNdWx0aXBhcnRSZWxhdGVkX0VNSU1FUGFydCgpLCB0aGlzLmdldE1JTUVQYXJ0KCksIG51bGwsICJlTUlNRVBhcnQiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MsIG51bGwsICJhZGRNSU1FUGFydCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElNSU1FUGFydCgpLCAibWltZVBhcnQiKTsKLQotCQlhZGRFT3BlcmF0aW9uKG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLCB0aGlzLmdldExpc3QoKSwgImdldE1JTUVQYXJ0cyIpOwotCi0JCWluaXRFQ2xhc3MobWltZU1pbWVYbWxFQ2xhc3MsIE1JTUVNaW1lWG1sLmNsYXNzLCAiTUlNRU1pbWVYbWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNSU1FTWltZVhtbF9FUGFydCgpLCB0aGVXU0RMUGFja2FnZS5nZXRQYXJ0KCksIG51bGwsICJlUGFydCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1pbWVNaW1lWG1sRUNsYXNzLCBudWxsLCAic2V0UGFydCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFydCIpOwotCi0JCWFkZEVPcGVyYXRpb24obWltZU1pbWVYbWxFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRQYXJ0Iik7Ci0KLQkJaW5pdEVDbGFzcyhpbWltZVBhcnRFQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0LmNsYXNzLCAiSU1JTUVQYXJ0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhpbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkLmNsYXNzLCAiSU1JTUVNdWx0aXBhcnRSZWxhdGVkIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhpbWltZUNvbnRlbnRFQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50LmNsYXNzLCAiSU1JTUVDb250ZW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhpbWltZU1pbWVYbWxFQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sLmNsYXNzLCAiSU1JTUVNaW1lWG1sIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUobGlzdEVEYXRhVHlwZSwgTGlzdC5jbGFzcywgIkxpc3QiLCBJU19TRVJJQUxJWkFCTEUpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci19IC8vTUlNRVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYXJ0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FUGFydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiNDhlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYXJ0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbC5NSU1FQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FUGFydEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBNSU1FUGFydCB7Ci0JCi0gICAgLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgYXNzaWduZWQgd2l0aCAxTCB0byBhdm9pZAotICAgKiBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgcHJpdmF0ZSBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1JTUVQYXJ0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1JTUVQYWNrYWdlLmVJTlNUQU5DRS5nZXRNSU1FUGFydCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkgewotICAgICAgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkKGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2liaWxpdHlFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCQotICAvLwotICAvLyBSZWNvbmNpbGlhdGlvbjogRE9NIC0+IE1PREVMCi0gIC8vCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBpZiAoIVdTRExDb25zdGFudHMuaXNNYXRjaGluZ05hbWVzcGFjZShjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSwgV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpKQotICAgIHsgIAotICAgICAgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB1c2VFeHRlbnNpb25GYWN0b3JpZXMoKSA/IAotICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICAgKChXU0RMRmFjdG9yeUltcGwpV1NETEZhY3RvcnkuZUlOU1RBTkNFKS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLQkgICAgICAgICAgCi0gICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQkgIAotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkKLSAgewotICAJLy8gVXNlIGV4dGVuc2lvbiBmYWN0b3JpZXMgYnkgZGVmYXVsdC4KLSAgICByZXR1cm4gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpID09IG51bGwgPyAKLSAgICAgIHRydWUgOiAoKERlZmluaXRpb25JbXBsKWdldEVuY2xvc2luZ0RlZmluaXRpb24oKSkuZ2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCk7Ci0gIH0KLQotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotICB7Ci0gICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpCi0gICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShNSU1FQ29uc3RhbnRzLk1JTUVfTkFNRVNQQUNFX1VSSSwgTUlNRUNvbnN0YW50cy5QQVJUX0VMRU1FTlRfVEFHKTsKLSAgICByZXR1cm4gZWxlbWVudFR5cGU7Ci0gIH0gCi0gIAotfSAvL01JTUVQYXJ0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODg3ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1JTUVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1JTUVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IE1JTUVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FQ29udGVudChNSU1FQ29udGVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRUNvbnRlbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FUGFydChNSU1FUGFydCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRVBhcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTXVsdGlwYXJ0UmVsYXRlZChNSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRU11bHRpcGFydFJlbGF0ZWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTWltZVhtbChNSU1FTWltZVhtbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRU1pbWVYbWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRVBhcnQoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlNSU1FUGFydEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FTXVsdGlwYXJ0UmVsYXRlZChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSU1JTUVDb250ZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJTUlNRUNvbnRlbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRU1pbWVYbWwoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlNSU1FTWltZVhtbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTUlNRUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydCA8ZW0+UGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTUlNRVBhcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwgPGVtPk1pbWUgWG1sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNSU1FTWltZVhtbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgPGVtPklNSU1FIFBhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1JTUVQYXJ0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCA8ZW0+SU1JTUUgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJTUlNRUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIDxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJTUlNRU1pbWVYbWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9NSU1FQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGUzNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1JTUVDb25zdGFudHMgCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRUxFTUVOVF9UQUcgPSAiY29udGVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfWE1MX0VMRU1FTlRfVEFHID0gIm1pbWVYbWwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlRfUkVMQVRFRF9FTEVNRU5UX1RBRyA9ICJtdWx0aXBhcnRSZWxhdGVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9FTEVNRU5UX1RBRyA9ICJwYXJ0IjsKLQkgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9BVFRSSUJVVEUgPSJwYXJ0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9BVFRSSUJVVEUgPSJ0eXBlIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgOiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTVkN2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE1JTUVFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgaW1wbGVtZW50cyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLXsKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBpZiAoTUlNRUNvbnN0YW50cy5NSU1FX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgaWYgKE1JTUVDb25zdGFudHMuQ09OVEVOVF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIE1JTUVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNSU1FQ29udGVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoTUlNRUNvbnN0YW50cy5NSU1FX1hNTF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIE1JTUVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNSU1FTWltZVhtbCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoTUlNRUNvbnN0YW50cy5NVUxUSVBBUlRfUkVMQVRFRF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIE1JTUVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotICAgICAgfQotICAgICAgLyogVE9ETyAtIGZpeCB0aGUgcm9zZSBtb2RlbAotICAgICAgZWxzZSBpZiAoInBhcnQiLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gTUlNRUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1JTUVQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICAqLwotCSAgZWxzZQotCSAgewotCSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5oYW5kbGVkIGxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSk7Ci0JICAgIHJldHVybiBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5oYW5kbGVkIG5hbWVzcGFjZTogIiArIG5hbWVzcGFjZSk7Ci0gICAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhNTZkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNSU1FUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTUlNRVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UOiB7Ci0JCQkJCU1JTUVDb250ZW50IG1pbWVDb250ZW50ID0gKE1JTUVDb250ZW50KXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTUlNRUNvbnRlbnQobWltZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlNSU1FQ29udGVudChtaW1lQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG1pbWVDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlQ6IHsKLQkJCQkJTUlNRVBhcnQgbWltZVBhcnQgPSAoTUlNRVBhcnQpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNSU1FUGFydChtaW1lUGFydCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVQYXJ0KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU1JTUVQYXJ0KG1pbWVQYXJ0KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQobWltZVBhcnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZVBhcnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURUQ6IHsKLQkJCQkJTUlNRU11bHRpcGFydFJlbGF0ZWQgbWltZU11bHRpcGFydFJlbGF0ZWQgPSAoTUlNRU11bHRpcGFydFJlbGF0ZWQpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNSU1FTXVsdGlwYXJ0UmVsYXRlZChtaW1lTXVsdGlwYXJ0UmVsYXRlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVNdWx0aXBhcnRSZWxhdGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU1JTUVNdWx0aXBhcnRSZWxhdGVkKG1pbWVNdWx0aXBhcnRSZWxhdGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQobWltZU11bHRpcGFydFJlbGF0ZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZU11bHRpcGFydFJlbGF0ZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUw6IHsKLQkJCQkJTUlNRU1pbWVYbWwgbWltZU1pbWVYbWwgPSAoTUlNRU1pbWVYbWwpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNSU1FTWltZVhtbChtaW1lTWltZVhtbCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVNaW1lWG1sKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU1JTUVNaW1lWG1sKG1pbWVNaW1lWG1sKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQobWltZU1pbWVYbWwpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZU1pbWVYbWwpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVDb250ZW50KE1JTUVDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FUGFydChNSU1FUGFydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTXVsdGlwYXJ0UmVsYXRlZChNSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgWG1sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgWG1sPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTWltZVhtbChNSU1FTWltZVhtbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIFBhcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgUGFydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSU1JTUVQYXJ0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FTXVsdGlwYXJ0UmVsYXRlZChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIENvbnRlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSU1JTUVDb250ZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FTWltZVhtbChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9NSU1FU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL1NPQVAuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL1NPQVAuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDQxY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9tb2RlbC9TT0FQLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5zb2FwL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLnNvYXAuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5zb2FwLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLnNvYXAiIG1vZGVsTmFtZT0iU09BUCIgZWRpdFBsdWdpbkNsYXNzPSIiCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9IiIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjL21vZGVsL1hTRC5nZW5tb2RlbCMvL3hzZCI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxzb2FwLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPlZBQkFTRV9QTFVHSU5TX1BBVEg8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJTT0FQIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nIiBlY29yZVBhY2thZ2U9InNvYXAuZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJzb2FwLmVjb3JlIy8vSVN0cmluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQQmluZGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQmluZGluZy90cmFuc3BvcnRVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBCaW5kaW5nL3N0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQQm9keSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQm9keS91c2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBCb2R5L25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEJvZHkvZW5jb2RpbmdTdHlsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc29hcC5lY29yZSMvL1NPQVBCb2R5L3BhcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyQmFzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyQmFzZS91c2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEhlYWRlckJhc2UvZW5jb2RpbmdTdHlsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL21lc3NhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL3BhcnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBGYXVsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQRmF1bHQvdXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQRmF1bHQvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQRmF1bHQvZW5jb2RpbmdTdHlsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBPcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUE9wZXJhdGlvbi9zb2FwQWN0aW9uVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQT3BlcmF0aW9uL3N0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQQWRkcmVzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQWRkcmVzcy9sb2NhdGlvblVSSSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzb2FwLmVjb3JlIy8vU09BUEhlYWRlckZhdWx0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBIZWFkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyL2hlYWRlckZhdWx0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV1NETCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0uZXRvb2xzIiBlY29yZVBhY2thZ2U9IndzZGwuZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vUU5hbWUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9PcGVyYXRpb25UeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRWxlbWVudCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1dTRExFeGNlcHRpb24iLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01Eb2N1bWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9kb2N1bWVudGF0aW9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZWxlbWVudCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9nZXRFbmNsb3NpbmdEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24vZGVmaW5pdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnRUeXBlL2VPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3N0eWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZU91dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VQYXJhbWV0ZXJPcmRlcmluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL2VQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUGFydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvdHlwZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvdHlwZURlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VNZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VQb3J0VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VCaW5kaW5nT3BlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZU9wZXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ091dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nRmF1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9TZXJ2aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1NlcnZpY2UvZVBvcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50L2VsZW1lbnRUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2xvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VuY29kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU1lc3NhZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVBvcnRUeXBlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VCaW5kaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VTZXJ2aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VOYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVR5cGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUltcG9ydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9nZXREb2N1bWVudCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50L2RvY3VtZW50Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbXBvcnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2xvY2F0aW9uVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZURlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9nZXRTY2hlbWEiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZUV4dGVuc2liaWxpdHlFbGVtZW50cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50L2V4dEVsZW1lbnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lucHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL091dHB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9GYXVsdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9lSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2dldElucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9zZXRJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0L2lucHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9lT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dC9vdXRwdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2VGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZ2V0RmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQvZmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL05hbWVzcGFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvcHJlZml4Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uL29wZXJhdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL25hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL2lucHV0TmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vb3V0cHV0TmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQvZmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0UGFyYW1ldGVyT3JkZXJpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZy9wYXJhbWV0ZXJPcmRlciIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldElucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQvaW5wdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0L291dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUlucHV0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPdXRwdXQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUZhdWx0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNZXNzYWdlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydC9wYXJ0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cy9wYXJ0T3JkZXIiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQYXJ0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS92YWx1ZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JU2VydmljZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQvcG9ydCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvZ2V0QmluZGluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nL2JpbmRpbmciLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbi9iaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vaW5wdXROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9vdXRwdXROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldFBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZS9wb3J0VHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdC9iaW5kaW5nRmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldE9wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbi9vcGVyYXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0L2JpbmRpbmdJbnB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQvYmluZGluZ091dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdJbnB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ091dHB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0ZhdWx0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmcvYmluZGluZyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydC9pbXBvcnREZWYiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL3ByZWZpeCIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlL3BvcnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2Uvc2VydmljZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ09wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUltcG9ydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVNZXNzYWdlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU9wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUGFydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQb3J0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVNlcnZpY2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZy9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmdzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZS9wcmVmaXgiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkvZXh0ZW5zaW9uUmVnaXN0cnkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RG9jdW1lbnRCYXNlVVJJIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJL2RvY3VtZW50QmFzZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZy9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMvdHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUxpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVVJMIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9UeXBlcyI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcy4xIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSXRlcmF0b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVR5cGVzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcGFyZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvY2hpbGRyZW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQvc2NoZW1hIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9lTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuU09BUC5jYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuU09BUC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjAzNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9tb2RlbC9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLlNPQVAuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsOTQ1ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQyCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInNvYXAiCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBxdWlkICAgICAgIAkiM0EwMUNGMEMwMUEyIgotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJTT0FQQmluZGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5QTM4MDFBQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc3BvcnRVUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0EwMUQzREYwMUU0IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkgICAgcXVpZCAgICAgICAJIjNBMDFEM0YxMDI5RSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlNPQVBCb2R5IgotCSAgICBxdWlkICAgICAgIAkiM0EwMURFRDUwMzFGIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBNDUwMDQxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTAxRTJENTAxQTUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBOTM0NzdDMDFCMiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZ1N0eWxlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRUU0QTREQjAwNzIiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJJU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJTT0FQSGVhZGVyQmFzZSIKLQkgICAgcXVpZCAgICAgICAJIjNBMDFERUU3MDM0RCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5QTNFMDMyNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjJFOUMwMDU2IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkVBMjAyNUQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmdTdHlsZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0VFNEE1OEYwMUFFIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiSVN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiU09BUEZhdWx0IgotCSAgICBxdWlkICAgICAgIAkiM0EwNkQ5RkEwMEY3IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBNEEwMDIwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTA5ODIxQTAxMkIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyMDQ4MDNBRSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZ1N0eWxlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRUU0QTU2MzAzQUYiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJJU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJTT0FQT3BlcmF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0EwQUQ0NTUwMEU4IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBNEUwMzFGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvYXBBY3Rpb25VUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0EwQUQ0NjQwMDRBIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkgICAgcXVpZCAgICAgICAJIjNBMEFENDZDMDE4QyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlNPQVBBZGRyZXNzIgotCSAgICBxdWlkICAgICAgIAkiM0FEMUZGNzUwMjg3IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDk1MzUwMDk4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDIxMUM5MDI1QyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXJGYXVsdCIKLQkgICAgcXVpZCAgICAgICAJIjNBRDYzMkI4MDNERCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzM0MDAzOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIgotCQkgICAgcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiU09BUEhlYWRlciIKLQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzA5MDE2RCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzMwMDE3RCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIgotCQkgICAgcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSVN0cmluZyIKLQkgICAgcXVpZCAgICAgICAJIjNCOEREOTBDMDIyMCIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuU3RyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCOEREOTMyMDM4MyIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkgICAgcXVpZCAgICAgICAJIjNBMDZFMEI1MDAzNiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTA2RTBCNjAwQzQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQQm9keSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiKQotCQkob2JqZWN0IFJvbGUgInBhcnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBMDZFMEI2MDBDNSIKLQkJICAgIGxhYmVsICAgICAgCSJwYXJ0cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBxdWlkICAgICAgIAkiM0FENjJERTYwMTMwIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJtZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyREU3MDA0QiIKLQkJICAgIGxhYmVsICAgICAgCSJtZXNzYWdlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkRFNzAwNTUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCIKLQkgICAgcXVpZCAgICAgICAJIjNBRDYyREY4MDJEMSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkRGQTAwMDIiCi0JCSAgICBsYWJlbCAgICAgIAkicGFydCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjJERkEwMDAzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlckJhc2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ2MzMzNzAxQ0QiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDciCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjMzMzcwMzcyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMwOTAxNkQiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaGVhZGVyRmF1bHRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzM3MDM3MyIKLQkJICAgIGxhYmVsICAgICAgCSJoZWFkZXJGYXVsdHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyRmF1bHQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMyQjgwM0REIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNBMDFDRjIzMDI5RiIKLQkgICAgdGl0bGUgICAgICAJIkJpbmRpbmciCi0JICAgIHpvb20gICAgICAgCTg3Ci0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMzI0Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMjA4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDU1LCAxMDApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDM0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU09BUEJpbmRpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkJICAgIHdpZHRoICAgICAgCTQ1MgotCQkgICAgaGVpZ2h0ICAgICAJMjQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBPcGVyYXRpb24iIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNDAsIDIwOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSg4MDMsIDEwMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTBBRDQ1NTAwRTgiCi0JCSAgICB3aWR0aCAgICAgIAk0OTIKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyIiBAMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDk2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgzOTUsIDkwNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMwOTAxNkQiCi0JCSAgICB3aWR0aCAgICAgIAkzNDgKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyRmF1bHQiIEA0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNjAsIDk2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQKLQkJCWxvY2F0aW9uICAgCSgxMTQyLCA5MDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDM2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU09BUEhlYWRlckZhdWx0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzJCODAzREQiCi0JCSAgICB3aWR0aCAgICAgIAk0NTQKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA1Ci0JCSAgICBsb2NhdGlvbiAgIAkoOTMzLCA5NjEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzcwMUNEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBANgotCQkJICAgIFBhcmVudF9WaWV3IAlANQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzcsIC01NDMpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzcwMzcyIgotCQkJICAgIGNsaWVudCAgICAgCUA1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzMsIDk2MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzM0LCA5NjEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiaGVhZGVyRmF1bHRzIiBANwotCQkJICAgIFBhcmVudF9WaWV3IAlANQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzcsIC01NDMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOAotCQkJCVBhcmVudF9WaWV3IAlANwotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDkyMSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNDYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitoZWFkZXJGYXVsdHMiCi0JCQkJcGN0RGlzdCAgICAJLTAuMDMwNzAyCi0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMzNzAzNzMiCi0JCQkgICAgY2xpZW50ICAgICAJQDUKLQkJCSAgICBzdXBwbGllciAgIAlANAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkzMywgOTYxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMzLCA5NjEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOQotCQkJCVBhcmVudF9WaWV3IAlANwotCQkJCWxvY2F0aW9uICAgCSgxMDgwLCA5MjQpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC43MzY4NDIKLQkJCQloZWlnaHQgICAgIAkzOAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwCi0JCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDk5OSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTEKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjYxNDAzNQotCQkJCWhlaWdodCAgICAgCTM4Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDExCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDQ5NikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExCi0JCQlsb2NhdGlvbiAgIAkoMTcwMSwgNDE5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI0NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJICAgIHdpZHRoICAgICAgCTI2NAotCQkgICAgaGVpZ2h0ICAgICAJMTc4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIiBAMTIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgNTI4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTIKLQkJCWxvY2F0aW9uICAgCSg3OTQsIDQyMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0OTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyQmFzZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIgotCQkgICAgd2lkdGggICAgICAJNTEwCi0JCSAgICBoZWlnaHQgICAgIAkyNDAKLQkJICAgIGFubm90YXRpb24gCTgpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTMKLQkJICAgIGxvY2F0aW9uICAgCSgxNDkzLCA0ODUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENjJERTYwMTMwIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlIiBAMTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzCi0JCQkgICAgbG9jYXRpb24gICAJKDM0MSwgLTY4MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQotCQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTU3NCwgNTE1KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI1NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC40MTIzMjIKLQkJCQloZWlnaHQgICAgIAkzMAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDYyREU3MDA0QiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkzLCA0ODUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTIsIDQ4NSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNgotCQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMCwgNDQ4KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNjg3MjA0Ci0JCQkJaGVpZ2h0ICAgICAJMzgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzCi0JCQkgICAgbG9jYXRpb24gICAJKDM0MSwgLTY4MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOAotCQkJCVBhcmVudF9WaWV3IAlAMTcKLQkJCQlsb2NhdGlvbiAgIAkoMTQyMCwgNTI1KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjM3MjI1NAotCQkJCWhlaWdodCAgICAgCTQwCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENjJERTcwMDU1IgotCQkJICAgIGNsaWVudCAgICAgCUAxMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0OTMsIDQ4NSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NSwgNDg1KSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5IiBAMTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgMTM0NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE5Ci0JCQlsb2NhdGlvbiAgIAkoNzk0LCAxMjM2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNPQVBCb2R5IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiCi0JCSAgICB3aWR0aCAgICAgIAk1MTAKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgMTIwMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIwCi0JCQlsb2NhdGlvbiAgIAkoMTYyOCwgOTU2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhcnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJICAgIHdpZHRoICAgICAgCTQxMAotCQkgICAgaGVpZ2h0ICAgICAJNTEyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDIxCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU5MCwgNzA0KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDYyREY4MDJEMSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicGFydCIgQDIyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMQotCQkJICAgIGxvY2F0aW9uICAgCSg0MzgsIC00NjQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMKLQkJCQlQYXJlbnRfVmlldyAJQDIyCi0JCQkJbG9jYXRpb24gICAJKDE5MTcsIDg4NikKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxMjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwYXJ0IgotCQkJCXBjdERpc3QgICAgCTAuODgxNDY1Ci0JCQkJaGVpZ2h0ICAgICAJOTAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRGQTAwMDIiCi0JCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE1OTAsIDcwNCkKLQkJCQkoMTgyNywgNzA0KQotCQkJCSgxODI3LCA5NDQpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDcwNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNywgOTQ0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMgotCQkJCWxvY2F0aW9uICAgCSgxNzc0LCA4ODYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44ODE0NjUKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAyNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDM4LCAtNDY0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJCWxvY2F0aW9uICAgCSgxMjA5LCA3NDYpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTEyMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRGQTAwMDMiCi0JCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE1OTAsIDcwNCkKLQkJCQkoMTE3MCwgNzA0KQotCQkJCSgxMTcwLCA2NDgpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDcwNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3MCwgNjQ4KSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDI3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTQ1NywgMTM5MCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTA2RTBCNTAwMzYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAyOAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjcKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1LCAtOTE0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBMDZFMEI2MDBDNCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjcKLQkJCSAgICBzdXBwbGllciAgIAlAMTkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU3LCAxMzkwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk1LCAxMzkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcnRzIiBAMjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Ci0JCQkgICAgbG9jYXRpb24gICAJKDIyNSwgLTkxNCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMAotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoMTU5MSwgMTQ5NCkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwYXJ0cyIKLQkJCQlwY3REaXN0ICAgIAkwLjgzMzg1NgotCQkJCWhlaWdodCAgICAgCTEwNAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBMDZFMEI2MDBDNSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjcKLQkJCSAgICBzdXBwbGllciAgIAlAMjAKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU3LCAxMzkwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE5LCAxMzkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSgxNTkxLCAxMzQ0KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuODMzODU2Ci0JCQkJaGVpZ2h0ICAgICAJNDcKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQRmF1bHQiIEAzMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCAxNjQ4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzIKLQkJCWxvY2F0aW9uICAgCSg3OTQsIDE1NDApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU09BUEZhdWx0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTA2RDlGQTAwRjciCi0JCSAgICB3aWR0aCAgICAgIAk1MTAKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpJU3RyaW5nIiBAMzMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCAxMzYwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCWxvY2F0aW9uICAgCSg2NiwgMTMzMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJU3RyaW5nIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMzCi0JCQlsb2NhdGlvbiAgIAkoNjYsIDEyODIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4REQ5MEMwMjIwIgotCQkgICAgd2lkdGggICAgICAJMzY2Ci0JCSAgICBoZWlnaHQgICAgIAkxODAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNAotCQkgICAgbG9jYXRpb24gICAJKDEwNDAsIDc1MCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMTIKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEwNDAsIDc1MCkKLQkJCSgxMDQwLCA2NDgpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMzMDAxN0QiCi0JCSAgICBjbGllbnQgICAgIAlAMwotCQkgICAgc3VwcGxpZXIgICAJQDEyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0NSwgODk1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNzUwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzQpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzQwMDM4IgotCQkgICAgY2xpZW50ICAgICAJQDQKLQkJICAgIHN1cHBsaWVyICAgCUAxMgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE2LCA4OTUpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxNiwgNzUwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzQpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUG9ydCIKLQkgICAgcXVpZCAgICAgICAJIjNBMDg1RTMwMDM1QyIKLQkgICAgdGl0bGUgICAgICAJIlBvcnQiCi0JICAgIHpvb20gICAgICAgCTkwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBBZGRyZXNzIiBAMzcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCAzMjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNwotCQkJbG9jYXRpb24gICAJKDE1MSwgMjM5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQwMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNPQVBBZGRyZXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQxRkY3NTAyODciCi0JCSAgICB3aWR0aCAgICAgIAk0MjAKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFeHRlbnNpYmlsaXR5IgotCSAgICBxdWlkICAgICAgIAkiM0FFMDk5QjEwMTYxIgotCSAgICB0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSIKLQkgICAgem9vbSAgICAgICAJOTAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEFkZHJlc3MiIEAzOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCA1NzYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzOAotCQkJbG9jYXRpb24gICAJKDEzNzEsIDUyNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQQWRkcmVzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FEMUZGNzUwMjg3IgotCQkgICAgd2lkdGggICAgICAJMzE2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAzOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDU5MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM5Ci0JCQlsb2NhdGlvbiAgIAkoMTYyLCA1NDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjg0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU09BUEJpbmRpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkJICAgIHdpZHRoICAgICAgCTMwMgotCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5IiBANDAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgMTEwNCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQwCi0JCQlsb2NhdGlvbiAgIAkoOTUwLCAxMDU1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNPQVBCb2R5IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiCi0JCSAgICB3aWR0aCAgICAgIAkyNjIKLQkJICAgIGhlaWdodCAgICAgCTEyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQRmF1bHQiIEA0MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxMjY0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDEKLQkJCWxvY2F0aW9uICAgCSgxMTEyLCAxMjE1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI0MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNPQVBGYXVsdCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0EwNkQ5RkEwMEY3IgotCQkgICAgd2lkdGggICAgICAJMjU4Ci0JCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUE9wZXJhdGlvbiIgQDQyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDUxMiwgNzUyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDIKLQkJCWxvY2F0aW9uICAgCSgzNDQsIDcwMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTBBRDQ1NTAwRTgiCi0JCSAgICB3aWR0aCAgICAgIAkzNTQKLQkJICAgIGhlaWdodCAgICAgCTEyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIgQDQzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgOTI4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDMKLQkJCWxvY2F0aW9uICAgCSg2MjcsIDg3OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyQmFzZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIgotCQkgICAgd2lkdGggICAgICAJMzk2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEA0NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg2MDgsIDEyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ0Ci0JCQlsb2NhdGlvbiAgIAkoNDA4LCA1MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkgICAgd2lkdGggICAgICAJNDE4Ci0JCSAgICBoZWlnaHQgICAgIAkxNzQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0NQotCQkgICAgbG9jYXRpb24gICAJKDYwOCwgMzA1KQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA0NAotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoNjA4LCAzMDUpCi0JCQkoNjA4LCAyMTUpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUEzODAxQUIiCi0JCSAgICBjbGllbnQgICAgIAlAMzkKLQkJICAgIHN1cHBsaWVyICAgCUA0NAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDQsIDUzMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNDQsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA5QTNFMDMyNiIKLQkJICAgIGNsaWVudCAgICAgCUA0MwotCQkgICAgc3VwcGxpZXIgICAJQDQ0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgxNSwgODY3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxNSwgMzA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDlBNDUwMDQxIgotCQkgICAgY2xpZW50ICAgICAJQDQwCi0JCSAgICBzdXBwbGllciAgIAlANDQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2OCwgMTA0MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY4LCAzMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0NSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUE0RTAzMUYiCi0JCSAgICBjbGllbnQgICAgIAlANDIKLQkJICAgIHN1cHBsaWVyICAgCUA0NAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MDYsIDY5MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDYsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1MAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA5QTRBMDAyMCIKLQkJICAgIGNsaWVudCAgICAgCUA0MQotCQkgICAgc3VwcGxpZXIgICAJQDQ0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDEyMDMpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMzA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDk1MzUwMDk4IgotCQkgICAgY2xpZW50ICAgICAJQDM4Ci0JCSAgICBzdXBwbGllciAgIAlANDQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTUyMCwgNTE1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjAsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KSkpKSkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvbW9kZWwvc29hcC5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvbW9kZWwvc29hcC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhZWNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL3NvYXAuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InNvYXAiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvU09BUCIgbnNQcmVmaXg9InNvYXAiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBCaW5kaW5nIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNwb3J0VVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0eWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBCb2R5IiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmNvZGluZ1N0eWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2RsLmVjb3JlIy8vUGFydCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQSGVhZGVyQmFzZSIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmdTdHlsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzZGwuZWNvcmUjLy9NZXNzYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcnQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NkbC5lY29yZSMvL1BhcnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEZhdWx0IiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmNvZGluZ1N0eWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBPcGVyYXRpb24iIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQWN0aW9uVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0eWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBBZGRyZXNzIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEhlYWRlckZhdWx0IiBlU3VwZXJUeXBlcz0iIy8vU09BUEhlYWRlckJhc2UiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQSGVhZGVyIiBlU3VwZXJUeXBlcz0iIy8vU09BUEhlYWRlckJhc2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoZWFkZXJGYXVsdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU09BUEhlYWRlckZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJU3RyaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvbW9kZWwvc29hcC5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL3NvYXAubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2QwYWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvbW9kZWwvc29hcC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjY4OCArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0MgotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJVFJVRQotCWdyaWRYICAgICAgCTE2Ci0JZ3JpZFkgICAgICAJMTYKLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250Ci0JICAgIHNpemUgICAgICAgCTEwCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkgICAgY29sb3IgICAgICAJMAotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCXNob3dNZXNzYWdlTnVtIAkxCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUKLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NCIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3OCIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjMiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3IgotCXF1aWR1ICAgICAgCSIzOUUyN0YwODAwNjUiCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCIKLQkJcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSIKLQkJZG9jdW1lbnRhdGlvbiAJCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuCi18Ci18V1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50LgotfAotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuCi18Ci18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkKLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQotfC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETAotfC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLgotfAotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLgotCQkKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiCi0JCQkJcmVzdWx0ICAgICAJIkRlZmluaXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENEZEMDFCQSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiCi0JCQkJdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTIwMDExQiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDA1NTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODdDMDFGRSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRDIwMjI2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNEIwMkIwIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ1NDIwMEYxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODk3RTIzMDIzNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDA5MjAyRjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUM0Q0IwMTk5IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNlcnZpY2UiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRDNTAxRTIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQ1MDJDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFdTREwgYWxsb3dzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxNDkwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0FGOTU0M0MwMDczIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I4NUIyMUEwMjcxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRjgwMzgyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiIKLQkJCQlyZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXREb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50IgotCQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkltcG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIFdTREwgaW1wb3J0IGVsZW1lbnQuIFdTREwgYWxsb3dzIGFzc29jaWF0aW5nIGEgbmFtZXNwYWNlIHdpdGggYSBkb2N1bWVudCBsb2NhdGlvbiB1c2luZyBhbiBpbXBvcnQgZWxlbWVudC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUVFNTgwMzdBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzNzkiCi0JCQkJcmVzdWx0ICAgICAJIlhTRFNjaGVtYSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzk3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSIKLQkJCQkJdHlwZSAgICAgICAJIlhTRFNjaGVtYSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MEEwMDM2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUxNDAyMTEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0RWxlbWVudCIKLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QzUwNDAyNUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MEMwMzVCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIGlucHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTFCMDExMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNBNDAyMDMiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNCNTAzQTIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzFFQTAyMEUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ091dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU0MzAyQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0YxMDMyNiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiIKLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJRTmFtZSIKLQkJCXF1aWQgICAgICAgCSIzQUU4RUQyMjAxNDAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIgotCQkJcXVpZCAgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBuYW1lc3BhY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZSBwcmVmaXggdXNlZCBpbiBhIFdTREwgZG9jdW1lbnQuIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDI5MDFCMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDMyMDIzNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb25UeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiIKLQkJCWRvY3VtZW50YXRpb24gCQotfE9ORV9XQVk9MQotfFJFUVVFU1RfUkVTUE9OU0U9MgotfFNPTElDSVRfUkVTUE9OU0U9MwotfE5PVElGSUNBVElPTj00Ci0JCQkKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzM1MzAzRTMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNCODRBNUJFMDMzMSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTYzMjAwMEQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3NzYwMEQxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlck9yZGVyIgotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTRFNTAxOEQiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJDNDAxMDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRTQwMDk0IgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTc5OTAxMkIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLklucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDNBMDM1RCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ0NTAxQzgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODM5MDFENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NkEwMEJEIgotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTg3MTAyMDgiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNZXNzYWdlIgotCQkJcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0IgotCQkJCQl0eXBlICAgICAgIAkiSVBhcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjNEMDIzMyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjU0MDI1RSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNjEwMjBEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnRPcmRlciIKLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUGFydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODQ1MDA1MiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCWV4Y2VwdGlvbnMgCSJXU0RMRXhjZXB0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTAxMDFDMyIKLQkJCQlyZXN1bHQgICAgIAkiSUl0ZXJhdG9yIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEyRDAyRDUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIlFOYW1lIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NTAwMjMxIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJU2VydmljZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUI0OTAyODciCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCNUIwMDNFIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjE2MDE1MyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjUwMDA2NiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RkE0MDFDNSIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQTkwMjg0IgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQkUwMUE4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUJDRjAzMDIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRBREMwMDA3MiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0ZhdWx0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyIKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MDkwMERBIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUxRDAwN0YiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0lucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdJbnB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MzQwMzQ5IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRENCMDIxQyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ091dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUyRDAwNTAiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFNEYwMEJEIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTVGMDAyQSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5FbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTM1MDNEMSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxRDkwMTQyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OEYxMDM5RCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEltcG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImltcG9ydERlZiIKLQkJCQkJdHlwZSAgICAgICAJIklJbXBvcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTZFMDA1RSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5ODQwMDRCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlDNTAwNDUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUU0MDFFRSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIgotCQkJCQl0eXBlICAgICAgIAkiSVNlcnZpY2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3IgotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyIKLQkJCQlyZXN1bHQgICAgIAkiSUltcG9ydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUlucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCIKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIgotCQkJCXJlc3VsdCAgICAgCSJJUGFydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1IgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQcmVmaXgiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIgotCQkJCXJlc3VsdCAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudEJhc2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUZFMDIwOCIKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDYxODAzMjgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnRCYXNlIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwNTYwMDgwIgotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwQkEwMzU1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBEODAyOUEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwNkYwMzFCIgotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIgotCQkJCQl0eXBlICAgICAgIAkiSVR5cGVzIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFFNzAyQTEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUxpc3QiCi0JCQlxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMEFGMDI5NyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1hcCIKLQkJCXF1aWQgICAgICAgCSIzQjg5NkIwMzAwRDQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QjExMDJCNSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVVSTCIKLQkJCXF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5uZXQuVVJMIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpb25SZWdpc3RyeSIKLQkJCXF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU5RjAyRTgiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJdGVyYXRvciIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkl0ZXJhdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODgwODAwQjkiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iCi0JCQlxdWlkICAgICAgIAkiM0M0Njg5NjUwMzEzIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4OTc0MDMxNSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuVHlwZXMgbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYyN0YwMEI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0QxNTAyQzAyM0IiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiCi0JCQlxdWlkICAgICAgIAkiM0Y2NzcxREIwMkRDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNzYyQTZBMDMwOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQcm90ZWN0ZWQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJwb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIgotCQkJCWxhYmVsICAgICAgCSJwb3J0VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQ0QiCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiCi0JCQlxdWlkICAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA2MSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIgotCQkJcXVpZCAgICAgICAJIjNBRDVEMzUyMDEwRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxODAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ09wZXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciCi0JCQlxdWlkICAgICAgIAkiM0FENUQ0MjUwMzhBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRjUiCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5IgotCQkJcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIgotCQkJcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjcxMDEwNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM0QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjc3MDA5NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5ncyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjdCMDMxMSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJCWxhYmVsICAgICAgCSJlU2VydmljZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIgotCQkJcXVpZCAgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCWxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyIKLQkJCXF1aWQgICAgICAgCSIzQURGMkU2NDAxRjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MSIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSIKLQkJCXF1aWQgICAgICAgCSIzQURGMkVCMzAxNjMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0MiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNiIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNyIKLQkJCXF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTlBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5IgotCQkJcXVpZCAgICAgICAJIjNBREYyRkI4MDJGOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBBIgotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIgotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEiCi0JCQlxdWlkICAgICAgIAkiM0FERjMzMTYwMUE0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODciCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMyIKLQkJCXF1aWQgICAgICAgCSIzQURGMzQwMDAzRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUEiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nRmF1bHRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSIKLQkJCXF1aWQgICAgICAgCSIzQUUwOTFGNDAyRjMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZFIgotCQkJCWxhYmVsICAgICAgCSJlRmF1bHQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzYiCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM3IgotCQkJcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzgiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVOYW1lc3BhY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiCi0JCQkJbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM5IgotCQkJcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCQlsYWJlbCAgICAgIAkiZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDEiCi0JCQlxdWlkICAgICAgIAkiM0FFQTQxMkYwMDM1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIgotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MyIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNDAwQkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ1IgotCQkJcXVpZCAgICAgICAJIjNCODRBRDc5MDBGMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTREIgotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTRFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ3IgotCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0OCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ5IgotCQkJcXVpZCAgICAgICAJIjNCOEIxQzEyMDNCMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIgotCQkJcXVpZCAgICAgICAJIjNCOEIxRENDMDJFNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjcwIgotCQkJCWxhYmVsICAgICAgCSJlU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUyIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MyIKLQkJCXF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU0IgotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlVHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZVR5cGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIgotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5MzAzRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTYiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyIKLQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJbGFiZWwgICAgICAJImVJbXBvcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1OSIKLQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIgotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjEiCi0JCQlxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIgotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjMiCi0JCQlxdWlkICAgICAgIAkiM0Y3ODk2QTIwMjZFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCQlsYWJlbCAgICAgIAkicGFyZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjaGlsZHJlbiIKLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJCWxhYmVsICAgICAgCSJjaGlsZHJlbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiCi0JCQlxdWlkICAgICAgIAkiMzlBRDNFRjYwMTI3IgotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyIKLQkJCXpvb20gICAgICAgCTkwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCQl3aWR0aCAgICAgIAk1MjAKLQkJCQloZWlnaHQgICAgIAk0MDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IiBAMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0ODEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNDMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IgotCQkJCXdpZHRoICAgICAgCTI3OAotCQkJCWhlaWdodCAgICAgCTIxOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkyNjQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDUyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAzODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJMzAyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTRFMDFCNCIKLQkJCQljbGllbnQgICAgIAlANAotCQkJCXN1cHBsaWVyICAgCUAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQwLCAzNzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQl3aWR0aCAgICAgIAk0MTAKLQkJCQloZWlnaHQgICAgIAkzMDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCWNsaWVudCAgICAgCUA2Ci0JCQkJc3VwcGxpZXIgICAJQDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMwLCAxMDAyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEA4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3NSwgODQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCXdpZHRoICAgICAgCTMwMAotCQkJCWhlaWdodCAgICAgCTE2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0NTAyQzkiCi0JCQkJY2xpZW50ICAgICAJQDgKLQkJCQlzdXBwbGllciAgIAlAMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAxMAotCQkJCWxvY2F0aW9uICAgCSgzNDMsIDkxNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0cyIgQDExCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MTMsIDk0NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxODk3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyIKLQkJCQkJY2xpZW50ICAgICAJQDEwCi0JCQkJCXN1cHBsaWVyICAgCUA4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzOSwgODgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA4MDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA5OTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODQ2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEAxNQotCQkJCQlQYXJlbnRfVmlldyAJQDEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCA3NDQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5NDEwMzFEIgotCQkJCQljbGllbnQgICAgIAlAMTAKLQkJCQkJc3VwcGxpZXIgICAJQDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzQzLCA5MTYpCi0JCQkJCSAgICAoMjU3LCA5MTYpCi0JCQkJCSAgICAoMjU3LCA2NzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBAMTgKLQkJCQlsb2NhdGlvbiAgIAkoODg2LCAxMjcwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEAxOQotCQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0ODU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQkJY2xpZW50ICAgICAJQDE4Ci0JCQkJCXN1cHBsaWVyICAgCUA2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEAyMgotCQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3OTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCQljbGllbnQgICAgIAlAMTgKLQkJCQkJc3VwcGxpZXIgICAJQDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODg2LCAxMjcwKQotCQkJCQkgICAgKDgxMiwgMTI3MCkKLQkJCQkJICAgICg4MTIsIDk5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTIsIDk5NikpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNSBCaW5kaW5ncyIKLQkJCXF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiCi0JCQl0aXRsZSAgICAgIAkiMi41IEJpbmRpbmdzIgotCQkJem9vbSAgICAgICAJODUKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIiBAMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDExNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCA2NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkzNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIiBAMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAzNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxMzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDgwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIgotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTU2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMzM0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTI4NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCIKLQkJCQl3aWR0aCAgICAgIAkyNzgKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBAMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE2MzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3V0cHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTU4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIKLQkJCQl3aWR0aCAgICAgIAkzMTIKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiIEAyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5NTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTA4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTE3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjgsIDQ4NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJd2lkdGggICAgICAJNjkxCi0JCQkJaGVpZ2h0ICAgICAJMzAxCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDEyODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDE2NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTU4NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDY4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NywgNTM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCXdpZHRoICAgICAgCTQzMgotCQkJCWhlaWdodCAgICAgCTMyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCWNsaWVudCAgICAgCUAzMgotCQkJCXN1cHBsaWVyICAgCUAyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3OSwgNTI3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzksIDQyOCkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEAzNAotCQkJCWxvY2F0aW9uICAgCSgxMDM5LCA3NDIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTIwMTBGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGUiIEAzNQotCQkJCQlQYXJlbnRfVmlldyAJQDM0Ci0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ5LCA3ODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkyOTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCQkJCWNsaWVudCAgICAgCUAzNAotCQkJCQlzdXBwbGllciAgIAlAMjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTksIDc0MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDkyLCA3MTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjE5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQKLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NiwgNjk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDk0NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiCi0JCQkJCWNsaWVudCAgICAgCUAzNAotCQkJCQlzdXBwbGllciAgIAlAMzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgNzQyKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBANDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDEwMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MiwgODUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJd2lkdGggICAgICAJNDUwCi0JCQkJaGVpZ2h0ICAgICAJMzcwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEA0MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCAxNDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3NiwgMTI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDQyCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjQwMEJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA0MwotCQkJCQlQYXJlbnRfVmlldyAJQDQyCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDEzMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzUxNDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODMiCi0JCQkJCWNsaWVudCAgICAgCUA0MgotCQkJCQlzdXBwbGllciAgIAlAMzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxMzU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4OTU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDQiIEA0NgotCQkJCQlQYXJlbnRfVmlldyAJQDQyCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCQkJY2xpZW50ICAgICAJQDQyCi0JCQkJCXN1cHBsaWVyICAgCUA0MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEA0NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAxNjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxMiwgMTUzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDUiIEA0OAotCQkJCWxvY2F0aW9uICAgCSgxNDMyLCAxNjU0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRDc5MDBGMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NDc3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJCQkJY2xpZW50ICAgICAJQDQ4Ci0JCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDE2NTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4MSwgMTY5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkwMjc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDUyCi0JCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEUiCi0JCQkJCWNsaWVudCAgICAgCUA0OAotCQkJCQlzdXBwbGllciAgIAlANDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxNjU0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDEwMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJd2lkdGggICAgICAJMzY0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFNDAxREMiCi0JCQkJY2xpZW50ICAgICAJQDUzCi0JCQkJc3VwcGxpZXIgICAJQDI1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2NiwgNjM2KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDU1Ci0JCQkJbG9jYXRpb24gICAJKDQ1NywgMTAyMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYiIEA1NgotCQkJCQlQYXJlbnRfVmlldyAJQDU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNSwgOTIwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCQkJY2xpZW50ICAgICAJQDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAzMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0NTcsIDEwMjIpCi0JCQkJCSAgICAoMjc2LCAxMDIyKQotCQkJCQkgICAgKDI3NiwgODQ5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NiwgODQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMCwgODg0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDU5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCA5NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTE2OTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMzkiCi0JCQkJCWNsaWVudCAgICAgCUA1NQotCQkJCQlzdXBwbGllciAgIAlANTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMCwgMTAyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjksIDk4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg0OTU2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCAxMDY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjc1NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDYzCi0JCQkJbG9jYXRpb24gICAJKDE0MTgsIDEwNDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjUwMzhBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9uIiBANjQKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEwNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNjAxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkJCQljbGllbnQgICAgIAlANjMKLQkJCQkJc3VwcGxpZXIgICAJQDQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTY3MjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgiIEA2NwotCQkJCQlQYXJlbnRfVmlldyAJQDYzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3MywgMTA3MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk1NDIwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkZGIgotCQkJCQljbGllbnQgICAgIAlANjMKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMiIEA2OQotCQkJCWxvY2F0aW9uICAgCSg3ODcsIDExOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjQwMUY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0lucHV0IiBANzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OSwgMTE1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0lucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTE5MDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTEiCi0JCQkJCWNsaWVudCAgICAgCUA2OQotCQkJCQlzdXBwbGllciAgIAlANDEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzg3LCAxMTkwKQotCQkJCQkgICAgKDYzNiwgMTE5MCkKLQkJCQkJICAgICg2MzYsIDEyNzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4NSwgMTIyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQwNDc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDczCi0JCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODUsIDExNDQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkJCQljbGllbnQgICAgIAlANjkKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc4NywgMTE5MCkKLQkJCQkJICAgICg5MjYsIDExOTApCi0JCQkJCSAgICAoOTI2LCAxMDk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNiwgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzNzc1OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDc2Ci0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ091dHB1dCIgQDc3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzA2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDUwODIKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiCi0JCQkJCWNsaWVudCAgICAgCUA3NgotCQkJCQlzdXBwbGllciAgIAlANDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTQ3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc0NTkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDgwCi0JCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCQljbGllbnQgICAgIAlANzYKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEA4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyMCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzcyLCAxOTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDE4NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQljbGllbnQgICAgIAlAODQKLQkJCQlzdXBwbGllciAgIAlAMjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjAzLCAyMDA3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDg2Ci0JCQkJbG9jYXRpb24gICAJKDEzNTYsIDEzNTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDAwM0U1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0ZhdWx0cyIgQDg3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODYKLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODIsIDE3NTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQSIKLQkJCQkJY2xpZW50ICAgICAJQDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDE4NDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwOSwgMTc5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE5MjkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEA5MQotCQkJCQlQYXJlbnRfVmlldyAJQDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgxODgsIDYxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc2LCAxMTk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA1MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzU2LCAxMzUyKQotCQkJCQkgICAgKDEzNTYsIDEyMTcpCi0JCQkJCSAgICAoMTExNywgMTIxNykKLQkJCQkJICAgICgxMTE3LCAxMDk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxMDk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4NzAwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNSIgQDk0Ci0JCQkJbG9jYXRpb24gICAJKDE2NDAsIDE5NzApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjQwMkYzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHQiIEA5NQotCQkJCQlQYXJlbnRfVmlldyAJQDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjQyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCQkJY2xpZW50ICAgICAJQDk0Ci0JCQkJCXN1cHBsaWVyICAgCUA4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjMsIDE5NzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDk4Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTQKLQkJCQkJbG9jYXRpb24gICAJKC0zNDQsIDgxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkJCWNsaWVudCAgICAgCUA5NAotCQkJCQlzdXBwbGllciAgIAlAODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTE3LCAxOTcwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkJCWNsaWVudCAgICAgCUA0NwotCQkJCXN1cHBsaWVyICAgCUAyNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUxQjAxMTMiCi0JCQkJY2xpZW50ICAgICAJQDQxCi0JCQkJc3VwcGxpZXIgICAJQDI2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi40IFBvcnRUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiCi0JCQl0aXRsZSAgICAgIAkiMi40IFBvcnRUeXBlcyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iCi0JCQl6b29tICAgICAgIAk4MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDE3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JCQkJd2lkdGggICAgICAJNzE4Ci0JCQkJaGVpZ2h0ICAgICAJMTk2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iIEAxMDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklPcGVyYXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxMjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiCi0JCQkJd2lkdGggICAgICAJODkxCi0JCQkJaGVpZ2h0ICAgICAJMTg4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTQzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUlucHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDEzODcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCQkJd2lkdGggICAgICAJNjQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTk0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMTc5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklPdXRwdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTcwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIKLQkJCQl3aWR0aCAgICAgIAk2NzQKLQkJCQloZWlnaHQgICAgIAkxOTQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDEwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjAyNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCQl3aWR0aCAgICAgIAk2NDQKLQkJCQloZWlnaHQgICAgIAkxOTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTgsIDY3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJd2lkdGggICAgICAJNjk1Ci0JCQkJaGVpZ2h0ICAgICAJMjgxCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxMDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU3NiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA2OTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNTIwCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDEwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMTA5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMTQyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDExMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJd2lkdGggICAgICAJMjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEAxMTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjE0LCA2MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQl3aWR0aCAgICAgIAk2OTUKLQkJCQloZWlnaHQgICAgIAkzNTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTEyCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDc5NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNDAxOEMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTEzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDc0OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzU5NjQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUNEIgotCQkJCQljbGllbnQgICAgIAlAMTEyCi0JCQkJCXN1cHBsaWVyICAgCUAxMTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDUsIDc5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzYsIDg2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwMzkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA5MjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjI0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBvcnRUeXBlIiBAMTE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEyCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMTIKLQkJCQkJc3VwcGxpZXIgICAJQDEwNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA3OTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODgsIDc1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUzNDg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTE5Ci0JCQkJbG9jYXRpb24gICAJKDIxMDcsIDc3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEyRjAwMzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJhbWV0ZXJPcmRlcmluZyIgQDEyMAotCQkJCQlQYXJlbnRfVmlldyAJQDExOQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NSwgNjQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJCQkJY2xpZW50ICAgICAJQDExOQotCQkJCQlzdXBwbGllciAgIAlAMTA3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzE2LCA3NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjcyLCA4MjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NjYxMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3MSwgODg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMDYyMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDEyNAotCQkJCQlQYXJlbnRfVmlldyAJQDExOQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1RiIKLQkJCQkJY2xpZW50ICAgICAJQDExOQotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCA3NzMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTI1Ci0JCQkJbG9jYXRpb24gICAJKDE3MDIsIDE1MDQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTYwMUE0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHRzIiBAMTI2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3ODk5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODciCi0JCQkJCWNsaWVudCAgICAgCUAxMjUKLQkJCQkJc3VwcGxpZXIgICAJQDEwOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDIwNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDk1ODAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTMsIDE5NjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTMwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjYxLCAxMDY5KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJCQkJY2xpZW50ICAgICAJQDEyNQotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MzYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDEzMwotCQkJCWxvY2F0aW9uICAgCSgxMTc4LCAxMjM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRjk0MDI0RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTM0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMzCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMTM0MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxOTgyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMKLQkJCQkJc3VwcGxpZXIgICAJQDEwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc4LCAxMjM0KQotCQkJCQkgICAgKDk4MCwgMTIzNCkKLQkJCQkJICAgICg5ODAsIDE0MTApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDYsIDEzNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NzY2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAxMzcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMKLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNiwgMTAzNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMKLQkJCQkJc3VwcGxpZXIgICAJQDExMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc4LCAxMjM0KQotCQkJCQkgICAgKDEyNzcsIDEyMzQpCi0JCQkJCSAgICAoMTI3NywgOTYwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc3LCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk3LCAxMDU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY0MTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTgxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxNDAKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEAxNDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAKLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDE2NjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwOTA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MAotCQkJCQlzdXBwbGllciAgIAlAMTEwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDE2NzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzYzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxNDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAKLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjcsIDEwMzcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBCIgotCQkJCQljbGllbnQgICAgIAlAMTQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIzLCAxMDgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTAzNDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZEODAxOUYiCi0JCQkJY2xpZW50ICAgICAJQDEwNgotCQkJCXN1cHBsaWVyICAgCUAxMDEKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkUyMDE3MSIKLQkJCQljbGllbnQgICAgIAlAMTExCi0JCQkJc3VwcGxpZXIgICAJQDEwMgotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkJCWNsaWVudCAgICAgCUAxMDkKLQkJCQlzdXBwbGllciAgIAlAMTAzCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZGODAxQ0QiCi0JCQkJY2xpZW50ICAgICAJQDExMAotCQkJCXN1cHBsaWVyICAgCUAxMDQKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJCQljbGllbnQgICAgIAlAMTA4Ci0JCQkJc3VwcGxpZXIgICAJQDEwNQotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyMjQsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzcsIDEzMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNTkzCi0JCQkJaGVpZ2h0ICAgICAJMzEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiIEAxNTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgMjU0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMjQ2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIKLQkJCQl3aWR0aCAgICAgIAk2NzIKLQkJCQloZWlnaHQgICAgIAkxODAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNTQKLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMjI3NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTUzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTI0LCAyMjc1KQotCQkJCSAgICAoMTUyNCwgMjQ1NCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJCQljbGllbnQgICAgIAlAMTA4Ci0JCQkJc3VwcGxpZXIgICAJQDE1MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzYsIDIxNzYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzYsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJCQljbGllbnQgICAgIAlAMTEwCi0JCQkJc3VwcGxpZXIgICAJQDE1MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNzEsIDE4NTQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJCQljbGllbnQgICAgIAlAMTA5Ci0JCQkJc3VwcGxpZXIgICAJQDE1MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MCwgMTUzNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAyMjc1KQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEAxNTgKLQkJCQlsb2NhdGlvbiAgIAkoMjIwNiwgMjI1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NDAxQjEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMTU5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTU4Ci0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY4LCAxNjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTIyMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkJCQljbGllbnQgICAgIAlAMTU4Ci0JCQkJCXN1cHBsaWVyICAgCUAxNTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2MCwgMTY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MiIgQDE2MgotCQkJCQlQYXJlbnRfVmlldyAJQDE1OAotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAyMyIKLQkJCQkJY2xpZW50ICAgICAJQDE1OAotCQkJCQlzdXBwbGllciAgIAlAMTUzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIyMDYsIDIyNTkpCi0JCQkJCSAgICAoMjIwNiwgMjU1NikKLQkJCQkJICAgICgxODU2LCAyNTU2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU2LCAyNTU2KSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xIERlZmluaXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNDhBMDI2MiIKLQkJCXRpdGxlICAgICAgCSIyLjEgRGVmaW5pdGlvbnMiCi0JCQl6b29tICAgICAgIAk4MwotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAxNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxOTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDExMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkJCQl3aWR0aCAgICAgIAk3MDYKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMTY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NiwgODk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQl3aWR0aCAgICAgIAkyOTQKLQkJCQloZWlnaHQgICAgIAkxMjAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDE2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDU0NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTE4MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MDAsIDEwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MDgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDEzNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCXdpZHRoICAgICAgCTQ0MgotCQkJCWhlaWdodCAgICAgCTI4MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDE2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMjQsIDE2MDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMTY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTUyOAotCQkJCWhlaWdodCAgICAgCTQyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDE3MAotCQkJCWxvY2F0aW9uICAgCSgxMzU4LCA4NjApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDE3MQotCQkJCQlQYXJlbnRfVmlldyAJQDE3MAotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDUzNSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJCWNsaWVudCAgICAgCUAxNzAKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1OCwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwMywgNTExKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTY2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDE3NAotCQkJCQlQYXJlbnRfVmlldyAJQDE3MAotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODYsIDkwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3OTA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDE3MAotCQkJCQlzdXBwbGllciAgIAlAMTY0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTgsIDg2MCkKLQkJCQkJICAgICgxMzU4LCA5NDgpCi0JCQkJCSAgICAoMTY3NywgOTQ4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDk0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDk4NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkyNjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMTc3Ci0JCQkJbG9jYXRpb24gICAJKDE2MTIsIDU5NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMTc4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTc3Ci0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTEyKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQkJY2xpZW50ICAgICAJQDE3NwotCQkJCQlzdXBwbGllciAgIAlAMTY5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTIsIDU5NSkKLQkJCQkJICAgICgxNDY0LCA1OTUpCi0JCQkJCSAgICAoMTQ2NCwgNDUzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjQsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU4NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDE4MQotCQkJCQlQYXJlbnRfVmlldyAJQDE3NwotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTIsIDU1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgwMzM1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCQljbGllbnQgICAgIAlAMTc3Ci0JCQkJCXN1cHBsaWVyICAgCUAxNjUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDEsIDU5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDY1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQxMDA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIyNTk0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDE4NQotCQkJCWxvY2F0aW9uICAgCSgxMjc5LCAxMTM3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxODUKLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCQkJY2xpZW50ICAgICAJQDE4NQotCQkJCQlzdXBwbGllciAgIAlAMTY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3OSwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDQ5NzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDE4OQotCQkJCQlQYXJlbnRfVmlldyAJQDE4NQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJCQljbGllbnQgICAgIAlAMTg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNjYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI3OSwgMTEzNykKLQkJCQkJICAgICgxMjc5LCAxMjA4KQotCQkJCQkgICAgKDE4OTEsIDEyMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzNDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTcsIDEyNDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDQwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDE5MwotCQkJCWxvY2F0aW9uICAgCSgxMjEyLCAxMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjcxMDEwNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAxOTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTMKLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDU5NCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNEEiCi0JCQkJCWNsaWVudCAgICAgCUAxOTMKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYyNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU3OTYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGVzIiBAMTk3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTkzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkxLCAxNDUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyMzY5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCQkJY2xpZW50ICAgICAJQDE5MwotCQkJCQlzdXBwbGllciAgIAlAMTY3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTIsIDExNTkpCi0JCQkJCSAgICAoMTIxMiwgMTQ5MCkKLQkJCQkJICAgICgxNTg3LCAxNDkwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg3LCAxNDkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMywgMTQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI1NjExCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU4NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEAyMDEKLQkJCQlsb2NhdGlvbiAgIAkoMTExNCwgMTU4NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBAMjAyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjAxCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCA2ODApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzcxIgotCQkJCQljbGllbnQgICAgIAlAMjAxCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE0LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTU1LCA3NTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjcwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdzIiBAMjA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjAxCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUxLCAxNjc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5ncyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY2MzQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkJCQljbGllbnQgICAgIAlAMjAxCi0JCQkJCXN1cHBsaWVyICAgCUAxNjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTExNCwgMTU4NSkKLQkJCQkJICAgICgxMTE0LCAxNzE2KQotCQkJCQkgICAgKDIxMTUsIDE3MTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDE3MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDUwNzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTQsIDE3NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMTA3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjgsIDE5MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjEwCi0JCQkJbG9jYXRpb24gICAJKDEwNjYsIDE1MzMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0IwMzExIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIxMQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDY2OSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwN0YiCi0JCQkJCWNsaWVudCAgICAgCUAyMTAKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMDksIDc1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzE5Njk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2VydmljZXMiIEAyMTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTAKLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkzLCAyMDI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTZXJ2aWNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkxODI0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJCQljbGllbnQgICAgIAlAMjEwCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA2NiwgMTUzMykKLQkJCQkJICAgICgxMDY2LCAyMDU5KQotCQkJCQkgICAgKDE2MTksIDIwNTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDIwNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU0LCAyMDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDAxOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyMDUxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJCQljbGllbnQgICAgIAlAMTY5Ci0JCQkJc3VwcGxpZXIgICAJQDE2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDI2MykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg1LCAyNjMpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkJCXF1aWQgICAgICAgCSIzQUQ2MEM1MTAxOTIiCi0JCQl0aXRsZSAgICAgIAkiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkJCXpvb20gICAgICAgCTgwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMjE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTQsIDE1MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJMTgyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAMjIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTg4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzQyLCAxNjc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCXdpZHRoICAgICAgCTE4MgotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMjMzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMjI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDIyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDczNiwgMTc2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYzLCAxNzA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCXdpZHRoICAgICAgCTM2NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCAxMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkJCXdpZHRoICAgICAgCTgwNAotCQkJCWhlaWdodCAgICAgCTE3MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAMjI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxOTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDE4OTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQl3aWR0aCAgICAgIAkyNzQKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAyMTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NjMsIDIwOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJd2lkdGggICAgICAJMzA4Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTIzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQl3aWR0aCAgICAgIAkyMjIKLQkJCQloZWlnaHQgICAgIAkxNDYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM1LCAxMzU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA1ODIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJCXdpZHRoICAgICAgCTU2MAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyMzAKLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ4MCwgMTAzOSkKLQkJCQkgICAgKDQ4MCwgODA4KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkJCWNsaWVudCAgICAgCUAyMjAKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2NiwgMTgyNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkJCWNsaWVudCAgICAgCUAyMjYKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NywgMjA3OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NywgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkJCWNsaWVudCAgICAgCUAyMjIKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxOSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIgotCQkJCWNsaWVudCAgICAgCUAyMjUKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTg4LCAxODg3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYwMDkyMDJGNyIKLQkJCQljbGllbnQgICAgIAlAMjIzCi0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc5NywgMTY5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk3LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJY2xpZW50ICAgICAJQDIxOQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwMSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkJCWNsaWVudCAgICAgCUAyMjcKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExLCAxMjIzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQljbGllbnQgICAgIAlAMjI4Ci0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQxNCwgMTM0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEyMDAyNUUiCi0JCQkJY2xpZW50ICAgICAJQDIyMQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI5LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDU4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJd2lkdGggICAgICAJNTYzCi0JCQkJaGVpZ2h0ICAgICAJMjM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMjQxCi0JCQkJbG9jYXRpb24gICAJKDExOTEsIDY3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODQ3LCA2MzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCQljbGllbnQgICAgIAlAMjQxCi0JCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODMwLCA2MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzOTY5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI0NQotCQkJCQlQYXJlbnRfVmlldyAJQDI0MQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTUsIDUyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzkwNzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCQljbGllbnQgICAgIAlAMjQxCi0JCQkJCXN1cHBsaWVyICAgCUAyNDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTYsIDYyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYzLCA3NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjQ3OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiIEAyNDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJXU0RMRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCQl3aWR0aCAgICAgIAk3NzQKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjUwCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDQwMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMjQ5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMDA4LCA0MDIpCi0JCQkJICAgICgxMDA4LCAzMTIpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkUzQzAzRDQiCi0JCQkJY2xpZW50ICAgICAJQDIyOQotCQkJCXN1cHBsaWVyICAgCUAyNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTIsIDU2OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDkyLCA0MDIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjUwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJCQljbGllbnQgICAgIAlAMjQwCi0JCQkJc3VwcGxpZXIgICAJQDIyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTUsIDU3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNSwgMjQ2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCQkJY2xpZW50ICAgICAJQDI0MAotCQkJCXN1cHBsaWVyICAgCUAyNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCA1NzEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMTYsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDEzMDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk1ODgKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFFQzAxQ0IiCi0JCQkJY2xpZW50ICAgICAJQDI1NAotCQkJCXN1cHBsaWVyICAgCUAyNDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDI1NgotCQkJCWxvY2F0aW9uICAgCSgyMzExLCAxNjg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGFyZW50IiBAMjU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjU2Ci0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjIsIDEzMzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFyZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkIiCi0JCQkJCWNsaWVudCAgICAgCUAyNTYKLQkJCQkJc3VwcGxpZXIgICAJQDI1NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzExLCAxNjg2KQotCQkJCQkgICAgKDI0MzIsIDE2ODYpCi0JCQkJCSAgICAoMjQzMiwgMTM3NCkKLQkJCQkJICAgICgyMzEwLCAxMzc0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzEwLCAxMzc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2NiwgMTQyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDI2MAotCQkJCQlQYXJlbnRfVmlldyAJQDI1NgotCQkJCQlsb2NhdGlvbiAgIAkoMjc5LCAyOTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODk5LCAxNTM3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NoaWxkcmVuIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTg1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTExOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJCQljbGllbnQgICAgIAlAMjU2Ci0JCQkJCXN1cHBsaWVyICAgCUAyNTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjMxMSwgMTY4NikKLQkJCQkJICAgICgyMDE2LCAxNjg2KQotCQkJCQkgICAgKDIwMTYsIDE0MjUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjMxMSwgMTY4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTYsIDE0MjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDcwLCAxNDgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyIKLQkJCXF1aWQgICAgICAgCSIzQUU4RUQ3MjAxQkQiCi0JCQl0aXRsZSAgICAgIAkiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCQkJem9vbSAgICAgICAJOTAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAyNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW1wb3J0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkJCXdpZHRoICAgICAgCTU5OAotCQkJCWhlaWdodCAgICAgCTIxOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMjY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDExMzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgMTA0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTmFtZXNwYWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJCXdpZHRoICAgICAgCTQ3OQotCQkJCWhlaWdodCAgICAgCTIxNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAyNjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgMTE0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTY5NAotCQkJCWhlaWdodCAgICAgCTE3MwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMzIwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM3IiBAMjY3Ci0JCQkJbG9jYXRpb24gICAJKDMwOSwgNzg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU5hbWVzcGFjZXMiIEAyNjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjcKLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYxLCA5NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU5hbWVzcGFjZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5ODg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMzIiCi0JCQkJCWNsaWVudCAgICAgCUAyNjcKLQkJCQkJc3VwcGxpZXIgICAJQDI2NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDk3MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY4NzA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDkxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI1MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDI3MgotCQkJCQlQYXJlbnRfVmlldyAJQDI2NwotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNjgsIDU5MikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzI4IgotCQkJCQljbGllbnQgICAgIAlAMjY3Ci0JCQkJCXN1cHBsaWVyICAgCUAyNjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCA1NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzksIDU4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ0OTYxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAyNzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDcyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NSwgNTgwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQkJd2lkdGggICAgICAJNDUyCi0JCQkJaGVpZ2h0ICAgICAJMzA0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUxIiBAMjc2Ci0JCQkJbG9jYXRpb24gICAJKDE0ODYsIDEwMDEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0MwMkU1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2NoZW1hIiBAMjc3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjc2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxMDE4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyNzAiCi0JCQkJCWNsaWVudCAgICAgCUAyNzYKLQkJCQkJc3VwcGxpZXIgICAJQDI2NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg2LCAxMDAxKQotCQkJCQkgICAgKDE2MzIsIDEwMDEpCi0JCQkJCSAgICAoMTYzMiwgMTEzMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCAxMDAxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMiwgMTEzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTIiIEAyODAKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNzYKLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCQkJCWNsaWVudCAgICAgCUAyNzYKLQkJCQkJc3VwcGxpZXIgICAJQDI3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgODcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOSIgQDI4MQotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCA0MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0EwMDJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDI4MgotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjgyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiCi0JCQkJCWNsaWVudCAgICAgCUAyODEKLQkJCQkJc3VwcGxpZXIgICAJQDI3NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg3LCA0MDMpCi0JCQkJCSAgICAoMTM2NCwgNDAzKQotCQkJCQkgICAgKDEzNjQsIDU2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRGVmaW5pdGlvbiIgQDI4NAotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA1LCAzNjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzUzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCQkJY2xpZW50ICAgICAJQDI4MQotCQkJCQlzdXBwbGllciAgIAlAMjY2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNDU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQ5MTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAyODcKLQkJCQlsb2NhdGlvbiAgIAkoNzM3LCA4MjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDI4OAotCQkJCQlQYXJlbnRfVmlldyAJQDI4NwotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUyLCA2NDcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQkJY2xpZW50ICAgICAJQDI4NwotCQkJCQlzdXBwbGllciAgIAlAMjY2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDczNywgODI2KQotCQkJCQkgICAgKDUxMCwgODI2KQotCQkJCQkgICAgKDUxMCwgNTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA1NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NTcsIDU5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDI5MQotCQkJCQlQYXJlbnRfVmlldyAJQDI4NwotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTkxODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJCWNsaWVudCAgICAgCUAyODcKLQkJCQkJc3VwcGxpZXIgICAJQDI3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA4NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjk1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMEQwMzQwIgotCQkJCWNsaWVudCAgICAgCUAyNzUKLQkJCQlzdXBwbGllciAgIAlAMjYzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1NSwgNTY4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNCODVBRTU5MDM3RSIKLQkJCXRpdGxlICAgICAgCSIyLjIgVHlwZXMiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAk4MQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAyOTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5NSwgMTE1OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNTAwCi0JCQkJaGVpZ2h0ICAgICAJMTc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDI5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDYsIDE1MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk0NzgKLQkJCQloZWlnaHQgICAgIAkxNjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAyOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE5NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTE3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNTM1Ci0JCQkJaGVpZ2h0ICAgICAJMzA1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMjk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTA2NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQl3aWR0aCAgICAgIAk0NjYKLQkJCQloZWlnaHQgICAgIAkyNTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDciIEAzMDAKLQkJCQlsb2NhdGlvbiAgIAkoNzM1LCAxMTcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEAzMDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDAKLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc1LCAxMTMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjkwMDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMjciCi0JCQkJCWNsaWVudCAgICAgCUAzMDAKLQkJCQkJc3VwcGxpZXIgICAJQDI5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg2LCAxMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM5LCAxMjA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODg3MDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ4IiBAMzA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzAwCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMzEiCi0JCQkJCWNsaWVudCAgICAgCUAzMDAKLQkJCQkJc3VwcGxpZXIgICAJQDI5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg1LCAxMTcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDMwNQotCQkJCWxvY2F0aW9uICAgCSg1MjcsIDE1OTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTIwM0IyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb24iIEAzMDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDUKLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2NiwgMTU1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3NTM5NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAxQyIKLQkJCQkJY2xpZW50ICAgICAJQDMwNQotCQkJCQlzdXBwbGllciAgIAlAMjk3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDE1OTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDE2NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NTg3NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTAiIEAzMDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDUKLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMjYiCi0JCQkJCWNsaWVudCAgICAgCUAzMDUKLQkJCQkJc3VwcGxpZXIgICAJQDI5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1MjcsIDE1OTIpCi0JCQkJCSAgICAoNDM3LCAxNTkyKQotCQkJCQkgICAgKDQzNywgMTMxMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDEzMTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU1IiBAMzEwCi0JCQkJbG9jYXRpb24gICAJKDMyMiwgMTkxMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5MzAzRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMzExCi0JCQkJCVBhcmVudF9WaWV3IAlAMzEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzgsIDE4NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0ODU2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSIKLQkJCQkJY2xpZW50ICAgICAJQDMxMAotCQkJCQlzdXBwbGllciAgIAlAMjk4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxOTExKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzE0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTE4IgotCQkJCQljbGllbnQgICAgIAlAMzEwCi0JCQkJCXN1cHBsaWVyICAgCUAyOTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzIyLCAxOTExKQotCQkJCQkgICAgKDIyOSwgMTkxMSkKLQkJCQkJICAgICgyMjksIDEzMTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5LCAxMzEzKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAzMTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDUxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJd2lkdGggICAgICAJMzg5Ci0JCQkJaGVpZ2h0ICAgICAJMjE2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJMjIyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMzE3Ci0JCQkJbG9jYXRpb24gICAJKDIzNCwgNjA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMzE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzE3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNwotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY2MTAxNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDMxNwotCQkJCQlzdXBwbGllciAgIAlAMzE1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4Mzg4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAzMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTcKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMywgMzEzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiIKLQkJCQkJY2xpZW50ICAgICAJQDMxNwotCQkJCQlzdXBwbGllciAgIAlAMzE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNCwgNjA0KQotCQkJCQkgICAgKDE3NCwgNjA0KQotCQkJCQkgICAgKDE3NCwgMjI1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAyMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDI3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3NzI5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiIEAzMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNSwgMjAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJVHlwZXMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDE1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJCQl3aWR0aCAgICAgIAkyNDgKLQkJCQloZWlnaHQgICAgIAkxNjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTksIDc1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MzkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQkJd2lkdGggICAgICAJNzU3Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDMyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxMjE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTI5LCAxMTAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNjczCi0JCQkJaGVpZ2h0ICAgICAJMjUwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU5IiBAMzI3Ci0JCQkJbG9jYXRpb24gICAJKDE4MjYsIDk3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYwIiBAMzI4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzI3Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkJCWNsaWVudCAgICAgCUAzMjcKLQkJCQkJc3VwcGxpZXIgICAJQDMyNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgODU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3NCwgOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTY0ODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDMzMAotCQkJCQlQYXJlbnRfVmlldyAJQDMyNwotCQkJCQlsb2NhdGlvbiAgIAkoMzA2LCA0NDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA2LCAxMDMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA3NTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRSIKLQkJCQkJY2xpZW50ICAgICAJQDMyNwotCQkJCQlzdXBwbGllciAgIAlAMzI2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCAxMDkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjUxNTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NBRENEM0IwMzgwIgotCQkJCWNsaWVudCAgICAgCUAzMTUKLQkJCQlzdXBwbGllciAgIAlAMzI0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwNSwgMzA3KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMzM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyMjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxNSwgMTMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQl3aWR0aCAgICAgIAk1MDAKLQkJCQloZWlnaHQgICAgIAkyMTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiCi0JCQkJY2xpZW50ICAgICAJQDMxNQotCQkJCXN1cHBsaWVyICAgCUAzMzQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTQsIDUwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCAzNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCXdpZHRoICAgICAgCTY4NwotCQkJCWhlaWdodCAgICAgCTIxNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDMzNwotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA0OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDMzOAotCQkJCQlQYXJlbnRfVmlldyAJQDMzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMzg2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJCWNsaWVudCAgICAgCUAzMzcKLQkJCQkJc3VwcGxpZXIgICAJQDMzNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjA2LCA0OTMpCi0JCQkJCSAgICAoMTA5NCwgNDkzKQotCQkJCQkgICAgKDEwOTQsIDMzMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAzNzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyODMyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM0MQotCQkJCQlQYXJlbnRfVmlldyAJQDMzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzk3MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkJCWNsaWVudCAgICAgCUAzMzcKLQkJCQkJc3VwcGxpZXIgICAJQDMzNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MSwgNDkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxNSwgNTQ2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjQ5NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTYsIDM5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk0OTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyIKLQkJCQljbGllbnQgICAgIAlAMzI1Ci0JCQkJc3VwcGxpZXIgICAJQDMzNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MTIsIDc0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgNTcyKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyIKLQkJCXF1aWQgICAgICAgCSIzQkNFODUzRDAyQzgiCi0JCQl0aXRsZSAgICAgIAkiMi4zIE1lc3NhZ2VzIgotCQkJem9vbSAgICAgICAJODUKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzQ2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTWVzc2FnZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiCi0JCQkJd2lkdGggICAgICAJMzgwCi0JCQkJaGVpZ2h0ICAgICAJMzI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCIgQDM0NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDEyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBhcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCA3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIKLQkJCQl3aWR0aCAgICAgIAk2MTcKLQkJCQloZWlnaHQgICAgIAkzMjQKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDM0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA2OTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMjc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQ5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkJCWNsaWVudCAgICAgCUAzNDgKLQkJCQlzdXBwbGllciAgIAlAMzQ3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwNCwgNjc4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA0LCAzODYpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDM1MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCXdpZHRoICAgICAgCTQzMgotCQkJCWhlaWdodCAgICAgCTMyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM1MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJCQljbGllbnQgICAgIAlAMzUwCi0JCQkJc3VwcGxpZXIgICAJQDM0NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAzNTIKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFydHMiIEAzNTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTIKLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCA4OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTc0NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiCi0JCQkJCWNsaWVudCAgICAgCUAzNTIKLQkJCQkJc3VwcGxpZXIgICAJQDM0OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTgwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDIwMzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMzU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzUyCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyIKLQkJCQkJY2xpZW50ICAgICAJQDM1MgotCQkJCQlzdXBwbGllciAgIAlAMzUwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY4OCwgOTUyKQotCQkJCQkgICAgKDQ0NSwgOTUyKQotCQkJCQkgICAgKDQ0NSwgODE3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDkxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ3NjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkpKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJzb2FwIgotCQlxdWlkICAgICAgIAkiM0EwMUNGMEMwMUEyIgotCQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzcyAiU09BUEJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0EwMUQzQjkwMUFEIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5QTM4MDFBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRyYW5zcG9ydFVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0EwMUQzREYwMUU0IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkJCXF1aWQgICAgICAgCSIzQTAxRDNGMTAyOUUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiU09BUEJvZHkiCi0JCQlxdWlkICAgICAgIAkiM0EwMURFRDUwMzFGIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5QTQ1MDA0MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJCQlxdWlkICAgICAgIAkiM0EwMUUyRDUwMUE1IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0E5MzQ3N0MwMUIyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nU3R5bGVzIgotCQkJCXF1aWQgICAgICAgCSIzRUU0QTREQjAwNzIiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIklTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXJCYXNlIgotCQkJcXVpZCAgICAgICAJIjNBMDFERUU3MDM0RCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUUwOUEzRTAzMjYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiCi0JCQkJcXVpZCAgICAgICAJIjNBRDYyRTlDMDA1NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRDYyRUEyMDI1RCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZ1N0eWxlcyIKLQkJCQlxdWlkICAgICAgIAkiM0VFNEE1OEYwMUFFIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJJU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJTT0FQRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0EwNkQ5RkEwMEY3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5QTRBMDAyMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJCQlxdWlkICAgICAgIAkiM0EwOTgyMUEwMTJCIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENjIwNDgwM0FFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nU3R5bGVzIgotCQkJCXF1aWQgICAgICAgCSIzRUU0QTU2MzAzQUYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIklTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0EwQUQ0NTUwMEU4IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5QTRFMDMxRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvYXBBY3Rpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBMEFENDY0MDA0QSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSIKLQkJCQlxdWlkICAgICAgIAkiM0EwQUQ0NkMwMThDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBBZGRyZXNzIgotCQkJcXVpZCAgICAgICAJIjNBRDFGRjc1MDI4NyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUUwOTUzNTAwOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FEMjExQzkwMjVDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXJGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUQ2MzJCODAzREQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjMzMzQwMDM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXIiCi0JCQlxdWlkICAgICAgIAkiM0FENjMzMDkwMTZEIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDYzMzMwMDE3RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJJU3RyaW5nIgotCQkJcXVpZCAgICAgICAJIjNCOEREOTBDMDIyMCIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5sYW5nLlN0cmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4REQ5MzIwMzgzIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NCIKLQkJCXF1aWQgICAgICAgCSIzQTA2RTBCNTAwMzYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY1IgotCQkJCXF1aWQgICAgICAgCSIzQTA2RTBCNjAwQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJvZHkiCi0JCQkJcXVpZHUgICAgICAJIjNBMDFERUQ1MDMxRiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiM0EwNkUwQjYwMEM1IgotCQkJCWxhYmVsICAgICAgCSJwYXJ0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjYiCi0JCQlxdWlkICAgICAgIAkiM0FENjJERTYwMTMwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJtZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ2MkRFNzAwNEIiCi0JCQkJbGFiZWwgICAgICAJIm1lc3NhZ2UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NyIKLQkJCQlxdWlkICAgICAgIAkiM0FENjJERTcwMDU1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2OCIKLQkJCXF1aWQgICAgICAgCSIzQUQ2MkRGODAyRDEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNBRDYyREZBMDAwMiIKLQkJCQlsYWJlbCAgICAgIAkicGFydCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY5IgotCQkJCXF1aWQgICAgICAgCSIzQUQ2MkRGQTAwMDMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlckJhc2UiCi0JCQkJcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDcwIgotCQkJcXVpZCAgICAgICAJIjNBRDYzMzM3MDFDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzEiCi0JCQkJcXVpZCAgICAgICAJIjNBRDYzMzM3MDM3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MzMwOTAxNkQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaGVhZGVyRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ2MzMzNzAzNzMiCi0JCQkJbGFiZWwgICAgICAJImhlYWRlckZhdWx0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDYzMkI4MDNERCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjNBMDFDRjIzMDI5RiIKLQkJCXRpdGxlICAgICAgCSJCaW5kaW5nIgotCQkJem9vbSAgICAgICAJODcKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMzI0Ci0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAzNjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDE1NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgpCi0JCQkJd2lkdGggICAgICAJNDUyCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQT3BlcmF0aW9uIiBAMzYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAyMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMywgMTAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0EwQUQ0NTUwMEU4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDMsIDE1NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0NzEpCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXIiIEAzNjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU2MCwgOTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOTUsIDkwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU09BUEhlYWRlciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYzMzA5MDE2RCIKLQkJCQl3aWR0aCAgICAgIAkzNDgKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJGYXVsdCIgQDM2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgOTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTQyLCA5MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBIZWFkZXJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYzMkI4MDNERCIKLQkJCQl3aWR0aCAgICAgIAk0NTQKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzAiIEAzNjQKLQkJCQlsb2NhdGlvbiAgIAkoOTMzLCA5NjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjMzMzcwMUNEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MSIgQDM2NQotCQkJCQlQYXJlbnRfVmlldyAJQDM2NAotCQkJCQlsb2NhdGlvbiAgIAkoMjc3LCAtNTQzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDYzMzM3MDM3MiIKLQkJCQkJY2xpZW50ICAgICAJQDM2NAotCQkJCQlzdXBwbGllciAgIAlAMzYyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzMsIDk2MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDczNCwgOTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaGVhZGVyRmF1bHRzIiBAMzY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzY0Ci0JCQkJCWxvY2F0aW9uICAgCSgyNzcsIC01NDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDkyMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitoZWFkZXJGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzA3MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ2MzMzNzAzNzMiCi0JCQkJCWNsaWVudCAgICAgCUAzNjQKLQkJCQkJc3VwcGxpZXIgICAJQDM2MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMzLCA5NjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMzLCA5NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDgwLCA5MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgOTk5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUxCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTQwMzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzNzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA0OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDEsIDQxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQl3aWR0aCAgICAgIAkyNjQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIiBAMzcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc5NCwgNDIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQSGVhZGVyQmFzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk0LCA0NzcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY1KQotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY2IiBAMzcyCi0JCQkJbG9jYXRpb24gICAJKDE0OTMsIDQ4NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MkRFNjAxMzAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1lc3NhZ2UiIEAzNzMKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNzIKLQkJCQkJbG9jYXRpb24gICAJKDM0MSwgLTY4MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NzQsIDUxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTIzMjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ2MkRFNzAwNEIiCi0JCQkJCWNsaWVudCAgICAgCUAzNzIKLQkJCQkJc3VwcGxpZXIgICAJQDM3MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5MywgNDg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MiwgNDg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzczCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNDQ4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcyMDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY3IiBAMzc2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzcyCi0JCQkJCWxvY2F0aW9uICAgCSgzNDEsIC02ODMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIwLCA1MjUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MjI1NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDYyREU3MDA1NSIKLQkJCQkJY2xpZW50ICAgICAJQDM3MgotCQkJCQlzdXBwbGllciAgIAlAMzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkzLCA0ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk1LCA0ODUpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQQm9keSIgQDM3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgMTM0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk0LCAxMjM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQQm9keSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDFERUQ1MDMxRiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk0LCAxMjkzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTY2NSkKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDM3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCA5NTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJNTEyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY4IiBAMzgwCi0JCQkJbG9jYXRpb24gICAJKDE1OTAsIDcwNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MkRGODAyRDEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcnQiIEAzODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzODAKLQkJCQkJbG9jYXRpb24gICAJKDQzOCwgLTQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDg4NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODE0NjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTkwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ2MkRGQTAwMDIiCi0JCQkJCWNsaWVudCAgICAgCUAzODAKLQkJCQkJc3VwcGxpZXIgICAJQDM3OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTkwLCA3MDQpCi0JCQkJCSAgICAoMTgyNywgNzA0KQotCQkJCQkgICAgKDE4MjcsIDk0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI3LCA5NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzc0LCA4ODYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MTQ2NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjkiIEAzODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAzODAKLQkJCQkJbG9jYXRpb24gICAJKDQzOCwgLTQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDksIDc0NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENjJERkEwMDAzIgotCQkJCQljbGllbnQgICAgIAlAMzgwCi0JCQkJCXN1cHBsaWVyICAgCUAzNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU5MCwgNzA0KQotCQkJCQkgICAgKDExNzAsIDcwNCkKLQkJCQkJICAgICgxMTcwLCA2NDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU5MCwgNzA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3MCwgNjQ4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NCIgQDM4NgotCQkJCWxvY2F0aW9uICAgCSgxNDU3LCAxMzkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDZFMEI1MDAzNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjUiIEAzODcKLQkJCQkJUGFyZW50X1ZpZXcgCUAzODYKLQkJCQkJbG9jYXRpb24gICAJKDIyNSwgLTkxNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQTA2RTBCNjAwQzQiCi0JCQkJCWNsaWVudCAgICAgCUAzODYKLQkJCQkJc3VwcGxpZXIgICAJQDM3OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NywgMTM5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTUsIDEzOTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0cyIgQDM4OAotCQkJCQlQYXJlbnRfVmlldyAJQDM4NgotCQkJCQlsb2NhdGlvbiAgIAkoMjI1LCAtOTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MSwgMTQ5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODMzODU2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBMDZFMEI2MDBDNSIKLQkJCQkJY2xpZW50ICAgICAJQDM4NgotCQkJCQlzdXBwbGllciAgIAlAMzc5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU3LCAxMzkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMTM5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTEsIDEzNDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMzg1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEZhdWx0IiBAMzkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNjQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3OTQsIDE1NDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDZEOUZBMDBGNyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk0LCAxNTk3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTY2NSkKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6SVN0cmluZyIgQDM5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCAxMzMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJU3RyaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDEyODIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEREOTBDMDIyMCIKLQkJCQl3aWR0aCAgICAgIAkzNjYKLQkJCQloZWlnaHQgICAgIAkxODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzkzCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDc1MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzcxCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMDQwLCA3NTApCi0JCQkJICAgICgxMDQwLCA2NDgpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MzMzMDAxN0QiCi0JCQkJY2xpZW50ICAgICAJQDM2MgotCQkJCXN1cHBsaWVyICAgCUAzNzEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDUsIDg5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ1LCA3NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYzMzM0MDAzOCIKLQkJCQljbGllbnQgICAgIAlAMzYzCi0JCQkJc3VwcGxpZXIgICAJQDM3MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTYsIDg5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxNiwgNzUwKQotCQkJCWRyYXdTdXBwbGllciAJQDM5MykpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0EwODVFMzAwMzVDIgotCQkJdGl0bGUgICAgICAJIlBvcnQiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEFkZHJlc3MiIEAzOTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTEsIDIzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU09BUEFkZHJlc3MiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQxRkY3NTAyODciCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MSwgMjk0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOSkKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiCi0JCQlxdWlkICAgICAgIAkiM0FFMDk5QjEwMTYxIgotCQkJdGl0bGUgICAgICAJIkV4dGVuc2liaWxpdHkiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEFkZHJlc3MiIEAzOTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgNTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzcxLCA1MjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBBZGRyZXNzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FEMUZGNzUwMjg3IgotCQkJCXdpZHRoICAgICAgCTMxNgotCQkJCWhlaWdodCAgICAgCTEyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAzOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA1OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MiwgNTQzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkJCQl3aWR0aCAgICAgIAkzMDIKLQkJCQloZWlnaHQgICAgIAkxMjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5IiBAMzk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDk1MCwgMTA1NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU09BUEJvZHkiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiCi0JCQkJd2lkdGggICAgICAJMjYyCi0JCQkJaGVpZ2h0ICAgICAJMTIyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQRmF1bHQiIEA0MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMTI2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExMiwgMTIxNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU09BUEZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0EwNkQ5RkEwMEY3IgotCQkJCXdpZHRoICAgICAgCTI1OAotCQkJCWhlaWdodCAgICAgCTEyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUE9wZXJhdGlvbiIgQDQwMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1MTIsIDc1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ0LCA3MDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQTBBRDQ1NTAwRTgiCi0JCQkJd2lkdGggICAgICAJMzU0Ci0JCQkJaGVpZ2h0ICAgICAJMTIyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIgQDQwMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjI3LCA4NzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBIZWFkZXJCYXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIgotCQkJCXdpZHRoICAgICAgCTM5NgotCQkJCWhlaWdodCAgICAgCTEyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEA0MDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDEyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA4LCA1NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJd2lkdGggICAgICAJNDE4Ci0JCQkJaGVpZ2h0ICAgICAJMTc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQwNAotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDMwNSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg2MDgsIDMwNSkKLQkJCQkgICAgKDYwOCwgMjE1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDlBMzgwMUFCIgotCQkJCWNsaWVudCAgICAgCUAzOTgKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQ0LCA1MzEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM0NCwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOUEzRTAzMjYiCi0JCQkJY2xpZW50ICAgICAJQDQwMgotCQkJCXN1cHBsaWVyICAgCUA0MDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTUsIDg2NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODE1LCAzMDUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA5QTQ1MDA0MSIKLQkJCQljbGllbnQgICAgIAlAMzk5Ci0JCQkJc3VwcGxpZXIgICAJQDQwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjgsIDEwNDMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjgsIDMwNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDlBNEUwMzFGIgotCQkJCWNsaWVudCAgICAgCUA0MDEKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTA2LCA2OTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUwNiwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOUE0QTAwMjAiCi0JCQkJY2xpZW50ICAgICAJQDQwMAotCQkJCXN1cHBsaWVyICAgCUA0MDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAxMjAzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAzMDUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA5NTM1MDA5OCIKLQkJCQljbGllbnQgICAgIAlAMzk3Ci0JCQkJc3VwcGxpZXIgICAJQDQwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjAsIDUxNSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyMCwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkpKSkpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInhzZCIKLQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiWFNEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkib3JnLmVjbGlwc2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJ4c2QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3hzZC8yMDAyL1hTRCIpKQotCQlxdWlkICAgICAgIAkiMzlBQkRDNkYwMUFBIgotCQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQW5ub3RhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUUxNzcwMTE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZENEUyMDM2NiIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcHBsaWNhdGlvbkluZm9ybWF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VCRjAyQzgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlckluZm9ybWF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VFQTAxNTciCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlcyIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdGMDUwMUUyIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01BdHRyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2MTAzQkUiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjUyMDJCNCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjcyRDhFMjAwRUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5NDAzQTAyMjEiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkVCMDJBOCIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzgwMEQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODdGN0IwMzg2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2UiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzJENzM3MDM4RiIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQ0YzMDI3RCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNEREIwM0I3IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNERTAwMkQ4IgotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMDIyMDM4MiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzI3MTlEOTAzNDEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQm91bmRlZEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NTFEMDM0NCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzYzQzAyMjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTJBMDBDQyIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHlGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NEYwMTMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzU2QzAxNTMiCi0JCQkJdHlwZSAgICAgICAJIlhTRENhcmRpbmFsaXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEI4MDI4NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5QkFBMjAzMTAiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXJpdmF0aW9uTWV0aG9kIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM2RTQwMjBFIgotCQkJCXR5cGUgICAgICAgCSJYU0REZXJpdmF0aW9uTWV0aG9kIgotCQkJCWluaXR2ICAgICAgCSJyZXN0cmljdGlvbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MUQwMjZBIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzczODAwQzUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29udGVudFR5cGVDYXRlZ29yeSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNBNDIwMkI4IgotCQkJCXR5cGUgICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0I4QTAzRTYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjE4MDE0RCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEZCOTcwMDZFIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMzFBRjVFMDNBNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBOTAzRDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZBRERCNTAxQTUiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4MDAzOTQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpYyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Q0QzBGNEMwMUExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXZlcml0eSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY5MUMwMDVEIgotCQkJCXR5cGUgICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTVGREQwMjgwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNDMDYzNzQzMDE2QiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpbmUiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MDdFMDIxMyIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbHVtbiIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYxMUUwMjk2IgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm9kZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwMTZCNkIwMjAwIgotCQkJCXR5cGUgICAgICAgCSJET01Ob2RlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFubm90YXRpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNDMDYzNzRGMDE4NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjYwMzM5IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuaWxsYWJsZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRkI0MDI5RiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0NjgwMzY4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNEEwMDNCOSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0RTAwMDBFIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTRDMDBCMiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE2ODAxQzEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUY2MjAzQ0YiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MzNERDQjAwMDE4IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbnVtZXJhdGlvbkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM5RDAzQzciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNjQwMDU0IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyNTY4MDI1OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzczNzQwMjUzIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFjZXROYW1lIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RkI0MDFFQyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVmZmVjdGl2ZVZhbHVlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQUUzMDNCNiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZlYXR1cmUiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRjgxMDIwRiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWludCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRjg4MDBDNSIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmb3JtIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwMkIwMzNFIgotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzFBMUIwMTZGIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ2xvYmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDA3MDM3MiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmZWF0dXJlUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDQ0MDE4NSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERml4ZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNjk5RTAwQzEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODgwMUI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaXhlZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QTYwMDIwMSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOTkwMDE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlEMjAwOEEiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnVuZGFtZW50YWxGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNjlFODAxRDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDN0IwMzk2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMUM3MDE0MyIKLQkJCQl0eXBlICAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREltcG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5MzAxN0YiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjZBREIxNTAzNkMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW5jbHVkZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM3RDAyNTAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4REMwMzgxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzgwMDJERiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3NkMwMDRCIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4RTAzMDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDMxMDNBRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRTIwMUY3IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExNzQwMjdEIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE5MzAzNTQiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEluY2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4MzAzQjgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4TGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjdEMDBGQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3REEwMEYzIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1OTAyODEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDI0MDA5OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRDEwMzk4IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQTIwMDhFIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFCRTAzRTIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkluY2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1MjAzNTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluTGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0M0MDBDMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3OTkwMTVFIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXAiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTY0MDI3OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21wb3NpdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0YxRDAxQ0YiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBvc2l0b3IiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFMjAzODEiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjU1MDM4NSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFGNjAyRTgiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5hbWVkQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NDcwMDAxNDIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzA0MDMxRSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzTmFtZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU3RjAxMjciCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1UkkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1ODcwMEUyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNVUkkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1QUEwMkFGIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOTA5NjMwMjVFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTRGMDIzQyIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSWRlbnRpZmllciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMkUwMEYwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSWRlbnRpZmllciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMzQwMzk3IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE51bWVyaWNGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NDIwMDc0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzVBMzAwMTIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NTkwMTJDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzRGNjAyREEiCi0JCQkJdHlwZSAgICAgICAJIlhTRE9yZGVyZWQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhcnRpY2xlIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhGQzAxRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaW5PY2N1cnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y4RTAzQjIiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtYXhPY2N1cnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y5OTAzQUUiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjc4MEJEOTAwNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGF0dGVybkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkNBNTAzOEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNzkwMzExIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRCQTAyM0MiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2ODAwMjE2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkIzMDFENSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lIgotCQkJcXVpZCAgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIgotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzhGMDAyRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWEiCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NEU1MDNERCIKLQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NoZW1hTG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjg2OEVDMDIyNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I5RjlCRkYwMTgwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRm9ybURlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA0QjAxMDIiCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRGb3JtRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDc4MDBBQyIKLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSIKLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWxEZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEM0QTcwMDM4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9ja0RlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjU5RDAyRDgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZlcnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNEMjJENkQ4MDM1NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb21wb3NpdG9yIgotCQkJcXVpZCAgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMzIxMDJBRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ5QjMwMzMwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjb3BlIgotCQkJcXVpZCAgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0Q2NDAyMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzMTU4MDBBOSIKLQkJCQl0eXBlICAgICAgIAkiWFNEVmFyaWV0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU0NEYwMTQ2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RTaW1wbGVGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjY1RTAzNUEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbGlkRmFjZXRzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QUIwRjAwQjYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVGVybSIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjQ0MDA2OSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRvdGFsRGlnaXRzRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjYxMDMzNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc5QUIwMjMyIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJGNTAxM0EiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODYyMDA0NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NTAwMjAxIgotCQkJCXR5cGUgICAgICAgCSJYU0RXaGl0ZVNwYWNlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaWxkY2FyZCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQwRTkwMTlFIgotCQkJCXR5cGUgICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0NGODYwMjIzIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvY2Vzc0NvbnRlbnRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxMkUwMUU0IgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkE3QkRCNzAxRjkiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZEODRGNzAwOTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5IgotCQkJCXF1aWQgICAgICAgCSIzQjZEOTAxNTAzREUiCi0JCQkJdHlwZSAgICAgICAJIlhTRFhQYXRoVmFyaWV0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I3QkJCRTEwMUIxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUF0dHIiCi0JCQlxdWlkICAgICAgIAkiM0JCRjhDODkwMUI2IgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5BdHRyIgotCQkJCXF1aWQgICAgICAgCSIzQkJGOENCMDAwRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0MyNzg1MEUwMzgxIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg1MUIwM0M2IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4MTg5NzkwMjAwIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjgxODlEQjAzNzQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NTm9kZSIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjRBNTAxMTciCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLk5vZGUiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NUJGMDAyRCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJWYWx1ZSIKLQkJCXF1aWQgICAgICAgCSIzQzA0MEI1QjAzMUYiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubGFuZy5PYmplY3QiCi0JCQkJcXVpZCAgICAgICAJIjNDMDQwQjhEMDNENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQkE3QjBFODAxQTgiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wdGlvbmFsIgotCQkJCXF1aWQgICAgICAgCSIzQkE3QjExNTAyQjciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjIwMkQzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyOTAyRjAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5IgotCQkJcXVpZCAgICAgICAJIjNCQzc3MTVEMDA5QiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluaXRlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFEQzAyRUQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY291bnRhYmx5SW5maW5pdGUiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUVDMDE0MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleEZpbmFsIgotCQkJcXVpZCAgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFNzAwREEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkVBMDE2QSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkQyMDExMiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9zaXRvciIKLQkJCXF1aWQgICAgICAgCSIzQjg2OUI2MjAwMzciCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlCRDAwMDAzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNob2ljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDQjgwMTFFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcXVlbmNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNFNTAwNTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NjlFMjYwMUFFIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU4RTAyNTgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RTk5MDI3MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTc5RjAzQTIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVtcHR5IgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdDRDAyRjAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2ltcGxlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMTAwQ0UiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWl4ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QzMDFCNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50T25seSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDcwMkU5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REZXJpdmF0aW9uTWV0aG9kIgotCQkJcXVpZCAgICAgICAJIjNCODZBMEIwMDBDRSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDODAzMjkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMENDMDE2MiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpY1NldmVyaXR5IgotCQkJcXVpZCAgICAgICAJIjNCRkU2OEE3MDMyRiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmF0YWwiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEMzMDNEMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlcnJvciIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RTcwMEUzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndhcm5pbmciCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEVBMDFGRiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTdGQzIwMTlBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzVBNDAzREYiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN1YnN0aXR1dGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NzkwMDQ1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2N0YwMUFDIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4MzAyMEIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI0NTAwNjkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZvcm0iCi0JCQlxdWlkICAgICAgIAkiM0I5RjkxM0IwMUVCIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxdWFsaWZpZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MTZGMDAyMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bnF1YWxpZmllZCIKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxOEMwMDdGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTFFMDAyNzIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTIwMDg1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleXJlZiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTMwMTRGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaXF1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTYwMzY1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1RUEwMDIzIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbnkiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYwMDAzNCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYyMDA1RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXQiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDY1MDExNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZCIKLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1MjAyRTQiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhbHNlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFBOTAyNzEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFydGlhbCIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQkIwMUZGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRvdGFsIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFDNDAxQjIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2Nlc3NDb250ZW50cyIKLQkJCXF1aWQgICAgICAgCSIzQjhGRjhDNzAyODQiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0cmljdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RjgwMDQ1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxheCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RjYwMzhCIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNraXAiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEU4MDJCQSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QkUwMjcyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjhCMDBCOCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OTQwMjkxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNTAwMjk1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVGaW5hbCIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgxMDIzMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODMwMTM4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4ODAyNEUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZFMDAzNzQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzU5MTAwQUUiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NjQwMjMxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2RDAyMTYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFZhcmlldHkiCi0JCQlxdWlkICAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdG9taWMiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0E3MDJERiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRDAxMzkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FGMDM5RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2hpdGVTcGFjZSIKLQkJCXF1aWQgICAgICAgCSIzQkVFRDBGNjAzNDIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZXNlcnZlIgotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEwRjAxMTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVwbGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjcwMzREIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbGxhcHNlIgotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyOTAzOTYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoVmFyaWV0eSIKLQkJCXF1aWQgICAgICAgCSIzQjhGRkI4OTAzM0EiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlbGVjdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJBQzAxOTIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGQiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkIzMDI3OCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzIiCi0JCQlxdWlkICAgICAgIAkiM0M2MjZFQTcwMTAyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MyIKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzQiCi0JCQlxdWlkICAgICAgIAkiM0I2OURBREMwMkY1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyNDIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NiIKLQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAwNkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc3IgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMEUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMTgiCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc4IgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTZCMDJDQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNyIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgwIgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjZCMDE5NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMwOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzEzIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwNjAyOTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NCIKLQkJCXF1aWQgICAgICAgCSIzQjY5NDA0RTAwNjciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg1IgotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyOUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwNTAwMkE1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODYiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1OUYwMDg2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDY5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDZBIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODgiCi0JCQlxdWlkICAgICAgIAkiM0MyNzVEMzIwMjIwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEQiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MCIKLQkJCXF1aWQgICAgICAgCSIzQjY4ODdCRjAxNTAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE4IgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTIiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNUUwMUY5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDQ2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA1MCIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NTAxMEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZCIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTYiCi0JCQlxdWlkICAgICAgIAkiM0I2RjFERTkwMThBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzZDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzgwIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk4IgotCQkJcXVpZCAgICAgICAJIjNCOTAwNjg4MDFDMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTkiCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRBbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMUIiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRBbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzMzM1MDM0MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDIiCi0JCQlxdWlkICAgICAgIAkiM0I2RkRERDcwMTEzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA0IgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0RGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZFIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNiIKLQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAwNkUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzRBIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA4IgotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDdDIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEwIgotCQkJcXVpZCAgICAgICAJIjNCNjg1MUJBMDEyNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTExIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEyIgotCQkJcXVpZCAgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIgotCQkJCWxhYmVsICAgICAgCSJjb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNCIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RDb250YWluZXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNiIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMTAzNTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiIKLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE4IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyM0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjAiCi0JCQlxdWlkICAgICAgIAkiM0I2ODkxMTQwMUFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyMiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNDMCIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyNSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjYiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQxRTYwMjUxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjciCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDJGNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAzMEIiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI4IgotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzAiCi0JCQlxdWlkICAgICAgIAkiM0M0MkRCREQwMjk3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzEiCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDExRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMyIgotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMzIgotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDRSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNCIKLQkJCXF1aWQgICAgICAgCSIzQjZENTk3MTAyRUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzYiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI2NTMwMTdBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJzY29wZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RCIKLQkJCQlsYWJlbCAgICAgIAkic2NvcGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzciCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM4IgotCQkJcXVpZCAgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEZlYXR1cmUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzOSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDIiCi0JCQlxdWlkICAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jZWRLZXkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDQiCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzZWxlY3RvciIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ2IgotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ3IgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmllbGRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJbGFiZWwgICAgICAJImZpZWxkcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ4IgotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q4MDJGQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ5IgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTAiCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTIiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTcwMkM4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE4MDNFMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTQiCi0JCQlxdWlkICAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAxQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDI1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTYiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTciCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0aWNsZXMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMiIKLQkJCQlsYWJlbCAgICAgIAkicGFydGljbGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTgiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTUwMDhBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDA5NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMEEwIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXAiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MiIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI0NTAzOTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOUUiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NCIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NiIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDcxNTAxMTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2OCIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0M4OTAxMjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTEwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiCi0JCQkJbGFiZWwgICAgICAJInRlcm0iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcwIgotCQkJcXVpZCAgICAgICAJIjNCNkFERTQyMDA5QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcxIgotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MiIKLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc0IgotCQkJcXVpZCAgICAgICAJIjNCNjg4RTZCMDAzRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RDAxQkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5IgotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc4IgotCQkJcXVpZCAgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc5IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODAiCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAwNDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg0IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRUZGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg1IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODYiCi0JCQlxdWlkICAgICAgIAkiM0JGQzJBMTcwMUVEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODciCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4OCIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUVBNzAyM0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QiIKLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkwIgotCQkJcXVpZCAgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkxIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTIiCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNDOCIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk0IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNUFEMDM3NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk1IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0Q29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCIKLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTYiCi0JCQlxdWlkICAgICAgIAkiM0JDOEFFMDIwM0E4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTciCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA1MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiCi0JCQkJbGFiZWwgICAgICAJImZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk4IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNEI3MDIwOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk5IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMCIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCWxhYmVsICAgICAgCSJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMiIKLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDJBNSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDQiCi0JCQlxdWlkICAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDIyRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNiIKLQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MTAxNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDgiCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2Q0YwMDg4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDkiCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQlsYWJlbCAgICAgIAkiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEyIgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjExMDI2RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDIwMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNCIKLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNSIKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzMyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTYiCi0JCQlxdWlkICAgICAgIAkiM0JFQkRDODcwMjQ3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTciCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDJGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE4IgotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wb25lbnRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImNvbXBvbmVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMCIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNyIKLQkJCQlsYWJlbCAgICAgIAkiZGlhZ25vc3RpY3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjIiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjMiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFsbERpYWdub3N0aWNzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJbGFiZWwgICAgICAJImFsbERpYWdub3N0aWNzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNCIKLQkJCXF1aWQgICAgICAgCSIzQzIxRENDNzAwRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjYiCi0JCQlxdWlkICAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjciCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI4IgotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI5IgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwRDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzAiCi0JCQlxdWlkICAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcxIgotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzIiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVDRjAwMDVFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAxRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDI4IgotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNCIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCWxhYmVsICAgICAgCSJvcmlnaW5hbFZlcnNpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzYiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVFQUIwMDFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzciCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDEwQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1IgotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM4IgotCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM5IgotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIgotCQkJCWxhYmVsICAgICAgCSJpdGVtVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MCIKLQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3MzAxOTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hRm9yU2NoZW1hIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUZCIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWFGb3JTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDIiCi0JCQlxdWlkICAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwM0MiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ2IgotCQkJcXVpZCAgICAgICAJIjNDMjhBMEYyMDFBNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJFNSIKLQkJCQlsYWJlbCAgICAgIAkidHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDgiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE2REIwMUU1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0RFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUyIgotCQkJcXVpZCAgICAgICAJIjNDMjhBNzRCMDE3OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU0IgotCQkJcXVpZCAgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciCi0JCQkJbGFiZWwgICAgICAJImNvbXBsZXhUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDEyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwREQiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1NyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyNzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIgotCQkJCWxhYmVsICAgICAgCSJtaW5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDhEMDI1MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0Q0IgotCQkJCWxhYmVsICAgICAgCSJtYXhJbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIgotCQkJCWxhYmVsICAgICAgCSJtaW5JbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEIzMDIwNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTlBIgotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjIxIgotCQkJCWxhYmVsICAgICAgCSJtYXhFeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjcxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIgotCQkJCWxhYmVsICAgICAgCSJsZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjczIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIndoaXRlU3BhY2VGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA3NSIKLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVudW1lcmF0aW9uRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFDIgotCQkJCWxhYmVsICAgICAgCSJlbnVtZXJhdGlvbkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzciCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQlsYWJlbCAgICAgIAkicGF0dGVybkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDODAyQTciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUY1IgotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJudW1lcmljRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDEiCi0JCQkJbGFiZWwgICAgICAJIm51bWVyaWNGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDRjAxOTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDg1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiIKLQkJCQlsYWJlbCAgICAgIAkibWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAyNyIKLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0Q3IgotCQkJCWxhYmVsICAgICAgCSJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0IgotCQkJCWxhYmVsICAgICAgCSJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAwNDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmRlcmVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJib3VuZGVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOTgiCi0JCQkJbGFiZWwgICAgICAJImJvdW5kZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NDAxRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzYwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4RmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjU0RjAxNDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIxNyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQTAwQUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMDAzQTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNiIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwOCIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwOSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA2MCIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNDMyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMiIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MDAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMENGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxNCIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxNSIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTBGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNGYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDExQSIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxNiIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjREMzAyOEUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxNyIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkYzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljUGFydGljbGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGRCIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzE4IgotCQkJcXVpZCAgICAgICAJIjNENEJCNEQ5MDFGNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzE5IgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyODQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjhFIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMjAiCi0JCQlxdWlkICAgICAgIAkiM0Q0QzY4RkYwMUJGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMjEiCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4IgotCQkJdGl0bGUgICAgICAJIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBANDExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCA4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBANDEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDUxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDEzCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MTEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDkyOCwgMjI1KQotCQkJCSAgICAoOTI4LCAxMzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDQxNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQxNQotCQkJCWxvY2F0aW9uICAgCSgxMjAzLCA3MDYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQxMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwMywgNzA2KQotCQkJCSAgICAoMTIwMywgNjE1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3MiwgNTE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJd2lkdGggICAgICAJNTIyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE3Ci0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MTYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ0NCwgNzA5KQotCQkJCSAgICAoNDQ0LCA2MTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE4Ci0JCQkJbG9jYXRpb24gICAJKDE1NzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDE0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTcyLCA0NjUpCi0JCQkJICAgICgxNTcyLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0MTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTAsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA0MjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTA1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjYyLCAxMDE1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0MjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM2LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MjIKLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MjAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ1MywgMTIwMykKLQkJCQkgICAgKDQ1MywgMTExMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgODAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDI1Ci0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDk1MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDI0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxODcyLCA5NTApCi0JCQkJICAgICgxODcyLCA4NTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDI2Ci0JCQkJbG9jYXRpb24gICAJKDE4MSwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MjMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4MSwgNDY1KQotCQkJCSAgICAoMTgxLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA0MjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzAsIDEyMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDQyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTA1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA0MjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjksIDE0NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjU2Ci0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDQzMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAzLCAxNDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTU4MQotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA0MzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEwNTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDQzMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA2LCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA0MzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTI5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2LCAxMjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA0MzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANDM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxMjgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEyMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA0MzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAsIDE0NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk2OTQKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDQzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAkzMTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0MzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlANDIxCi0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTQsIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQxMykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA0NDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDgwMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0NDIKLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQ0MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTYyLCA5NDcpCi0JCQkJICAgICg5NjIsIDg1NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQ0NAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE4LCAxMTU0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMTYzNTM0Ci0JCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCWNsaWVudCAgICAgCUA0MzQKLQkJCQlzdXBwbGllciAgIAlANDE2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDksIDcwOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA0MzQKLQkJCQlzdXBwbGllciAgIAlANDIwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDEyMDMpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDIyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlANDM1Ci0JCQkJc3VwcGxpZXIgICAJQDQyMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MjYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUA0MzMKLQkJCQlzdXBwbGllciAgIAlANDE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDAyLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlANDE0Ci0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjksIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OSwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQxMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDQzMQotCQkJCXN1cHBsaWVyICAgCUA0MTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkwLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCWNsaWVudCAgICAgCUA0MTkKLQkJCQlzdXBwbGllciAgIAlANDE2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNzA5KQotCQkJCWRyYXdTdXBwbGllciAJQDQxNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDQzNgotCQkJCXN1cHBsaWVyICAgCUA0NDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzIxLCAxMjI1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzIxLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDQyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1MgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQ1MwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNywgODg2KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMjE1ODEyCi0JCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCWNsaWVudCAgICAgCUA0MjgKLQkJCQlzdXBwbGllciAgIAlANDE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwMCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQxOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDQyOAotCQkJCXN1cHBsaWVyICAgCUA0MjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCA5NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlANDI1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlANDIwCi0JCQkJc3VwcGxpZXIgICAJQDQ0MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1MCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDQyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlANDIzCi0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIgotCQkJCWNsaWVudCAgICAgCUA0MzkKLQkJCQlzdXBwbGllciAgIAlANDExCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxMiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEyLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDEzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEI4MDI4NiIKLQkJCQljbGllbnQgICAgIAlANDE2Ci0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA0MTIKLQkJCQlzdXBwbGllciAgIAlANDExCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzUwLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDEzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlANDM4Ci0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3MiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzIsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDYxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA0MjcKLQkJCQlzdXBwbGllciAgIAlANDI0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MywgMTIyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQotCQkJCWRyYXdTdXBwbGllciAJQDQyNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NjIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJY2xpZW50ICAgICAJQDQyOQotCQkJCXN1cHBsaWVyICAgCUA0MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDYpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ2MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQljbGllbnQgICAgIAlANDMwCi0JCQkJc3VwcGxpZXIgICAJQDQxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDE0MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzEsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDY0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUA0NDEKLQkJCQlzdXBwbGllciAgIAlANDEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTU5LCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDQxNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NjUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDQyNAotCQkJCXN1cHBsaWVyICAgCUA0MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzIsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDY2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA0MzIKLQkJCQlzdXBwbGllciAgIAlANDQxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYyLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjIsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0NDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDY3Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDY4Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NSwgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0MjUzMQotCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCQUEyMDMxMCIKLQkJCQljbGllbnQgICAgIAlANDM3Ci0JCQkJc3VwcGxpZXIgICAJQDQyMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQyNikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NjkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDQzNwotCQkJCXN1cHBsaWVyICAgCUA0MjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDE0MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMTIwMykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MjIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzNzRCMTgxOTAwMjgiCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAk5NgotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQ3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc4NCwgMTYzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDcxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzYiIEA0NzIKLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAxNjI3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNjUzMDE3QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NvcGUiIEA0NzMKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzIKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzcxMjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIgotCQkJCQljbGllbnQgICAgIAlANDcyCi0JCQkJCXN1cHBsaWVyICAgCUA0NzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MSwgMTYyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTY2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzciIEA0NzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzIKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkUiCi0JCQkJCWNsaWVudCAgICAgCUA0NzIKLQkJCQkJc3VwcGxpZXIgICAJQDQ3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI3LCAxNjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBANDc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAxMjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANDc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY4IiBANDc5Ci0JCQkJbG9jYXRpb24gICAJKDIyMjksIDExMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDODkwMTIyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjkiIEA0ODAKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzkKLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiCi0JCQkJCWNsaWVudCAgICAgCUA0NzkKLQkJCQkJc3VwcGxpZXIgICAJQDQ3OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDgxCi0JCQkJCVBhcmVudF9WaWV3IAlANDc5Ci0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTU3LCAxMTIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Rlcm0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDQ3OQotCQkJCQlzdXBwbGllciAgIAlANDc3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTE3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzQsIDExMTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExOTQwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEA0ODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTYiIEA0ODYKLQkJCQlsb2NhdGlvbiAgIAkoMjIxOSwgODgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNjA2MDI2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU3IiBANDg3Ci0JCQkJCVBhcmVudF9WaWV3IAlANDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDQ4NgotCQkJCQlzdXBwbGllciAgIAlANDg1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA4MjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0ODgKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODYKLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTA1LCA4ODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFydGljbGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIyIgotCQkJCQljbGllbnQgICAgIAlANDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA0NzgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDkzOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyODEsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzksIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANDkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDUsIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQ5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDIiIEA0OTQKLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAzIiBANDk1Ci0JCQkJCVBhcmVudF9WaWV3IAlANDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJCWNsaWVudCAgICAgCUA0OTQKLQkJCQkJc3VwcGxpZXIgICAJQDQ5MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1OTAsIDExNDApCi0JCQkJCSAgICAoNTQwLCAxMTQwKQotCQkJCQkgICAgKDU0MCwgMTA0NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDAsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA0OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTQKLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMDUzNTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANDk0Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTkwLCAxMTQwKQotCQkJCQkgICAgKDY0MSwgMTE0MCkKLQkJCQkJICAgICg2NDEsIDEwNDUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQxLCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg0LCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTIyNDQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQ5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgOTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNCIgQDUwMAotCQkJCWxvY2F0aW9uICAgCSgxMTE5LCAxMTEyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0RGMDI0RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA1IiBANTAxCi0JCQkJCVBhcmVudF9WaWV3IAlANTAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZEIgotCQkJCQljbGllbnQgICAgIAlANTAwCi0JCQkJCXN1cHBsaWVyICAgCUA0OTkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMDQ1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudFR5cGUiIEA1MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDAKLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTksIDExMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkUiCi0JCQkJCWNsaWVudCAgICAgCUA1MDAKLQkJCQkJc3VwcGxpZXIgICAJQDQ4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDExNzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxMTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEwIiBANTA1Ci0JCQkJbG9jYXRpb24gICAJKDE0NTUsIDk4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQTAxMjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMSIgQDUwNgotCQkJCQlQYXJlbnRfVmlldyAJQDUwNQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MCIKLQkJCQkJY2xpZW50ICAgICAJQDUwNQotCQkJCQlzdXBwbGllciAgIAlANDk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjgwLCA5ODIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDUwNwotCQkJCQlQYXJlbnRfVmlldyAJQDUwNQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NSwgOTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYyODU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCQljbGllbnQgICAgIAlANTA1Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzAsIDk4MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTAsIDEwMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0Mjg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDYiIEA1MTAKLQkJCQlsb2NhdGlvbiAgIAkoOTIxLCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDA2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA3IiBANTExCi0JCQkJCVBhcmVudF9WaWV3IAlANTEwCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0OSIKLQkJCQkJY2xpZW50ICAgICAJQDUxMAotCQkJCQlzdXBwbGllciAgIAlANDk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANTEyCi0JCQkJCVBhcmVudF9WaWV3IAlANTEwCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTkzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNEEiCi0JCQkJCWNsaWVudCAgICAgCUA1MTAKLQkJCQkJc3VwcGxpZXIgICAJQDQ5MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMzcxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc5LCAxMjU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODgzNDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANTE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNzY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTIyLCA3MjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQl3aWR0aCAgICAgIAkzOTgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDUxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTYzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMywgMTU5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDUxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgNDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODAzLCA0MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MCIgQDUxOAotCQkJCWxvY2F0aW9uICAgCSgyMjE2LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjEiIEA1MTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTgKLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4IgotCQkJCQljbGllbnQgICAgIAlANTE4Ci0JCQkJCXN1cHBsaWVyICAgCUA1MTcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA1MjAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTgKLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA2MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyNjA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDUxOAotCQkJCQlzdXBwbGllciAgIAlANDg1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU2LCA2MzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzMzY0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA1MjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTksIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MCIgQDUyNAotCQkJCWxvY2F0aW9uICAgCSgxNjc2LCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4N0JGMDE1MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTEiIEA1MjUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjQKLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTciCi0JCQkJCWNsaWVudCAgICAgCUA1MjQKLQkJCQkJc3VwcGxpZXIgICAJQDUyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEzNzEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDUyNgotCQkJCQlQYXJlbnRfVmlldyAJQDUyNAotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NywgMTEwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjI1NzY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBOCIKLQkJCQkJY2xpZW50ICAgICAJQDUyNAotCQkJCQlzdXBwbGllciAgIAlANDkxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTgsIDExMDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NiIgQDUyOQotCQkJCWxvY2F0aW9uICAgCSgxNDI5LCAxNDM4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTlGMDA4NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODciIEA1MzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjkKLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDY5IgotCQkJCQljbGllbnQgICAgIAlANTI5Ci0JCQkJCXN1cHBsaWVyICAgCUA1MjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjEwLCAxNDM4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDUzMQotCQkJCQlQYXJlbnRfVmlldyAJQDUyOQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDE1MDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMyNTk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDZBIgotCQkJCQljbGllbnQgICAgIAlANTI5Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ4LCAxNDM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNywgMTM5MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTYzNTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTQiIEA1MzUKLQkJCQlsb2NhdGlvbiAgIAkoNzc3LCAxNDI1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTg1MDEwRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTUiIEA1MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzUKLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZBIgotCQkJCQljbGllbnQgICAgIAlANTM1Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NiwgMTQyNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTM3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAxNTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU5MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZCIgotCQkJCQljbGllbnQgICAgIAlANTM1Ci0JCQkJCXN1cHBsaWVyICAgCUA1MzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OCwgMTQyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMSwgMTM4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyNDQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc4IiBANTQwCi0JCQkJbG9jYXRpb24gICAJKDIzNywgMTIwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2QjAyQ0IiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc5IiBANTQxCi0JCQkJCVBhcmVudF9WaWV3IAlANTQwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE2IgotCQkJCQljbGllbnQgICAgIAlANTQwCi0JCQkJCXN1cHBsaWVyICAgCUA1MzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTM3MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTQyCi0JCQkJCVBhcmVudF9WaWV3IAlANTQwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODgsIDEyNDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE3IgotCQkJCQljbGllbnQgICAgIAlANTQwCi0JCQkJCXN1cHBsaWVyICAgCUA0OTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NSwgMTI0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDU0NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OCwgNzQ1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDAiIEA1NDYKLQkJCQlsb2NhdGlvbiAgIAkoNzI4LCA3NzUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzUwMzQwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDEiIEA1NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDYKLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJCWNsaWVudCAgICAgCUA1NDYKLQkJCQkJc3VwcGxpZXIgICAJQDQ5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3MjgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDkzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4OCwgOTM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANTQ4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTgsIDg4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjE0MDk0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUA1NDYKLQkJCQkJc3VwcGxpZXIgICAJQDU0NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzksIDc3NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MCwgODEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTUyNDM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA1NTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNywgNDA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTYwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MiIgQDU1MgotCQkJCWxvY2F0aW9uICAgCSgxNjI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkS2V5IiBANTUzCi0JCQkJCVBhcmVudF9WaWV3IAlANTUyCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MSwgNjA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRLZXkiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43OTcyOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJCWNsaWVudCAgICAgCUA1NTIKLQkJCQkJc3VwcGxpZXIgICAJQDU1MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjI5LCA1NzQpCi0JCQkJCSAgICAoMTU1NSwgNTc0KQotCQkJCQkgICAgKDE1NTUsIDUwMSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCA1MDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjIyLCA1MzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NzYxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQzIiBANTU2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTUyCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2RiIKLQkJCQkJY2xpZW50ICAgICAJQDU1MgotCQkJCQlzdXBwbGllciAgIAlANTUxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MjksIDU3NCkKLQkJCQkJICAgICgxNjg5LCA1NzQpCi0JCQkJCSAgICAoMTY4OSwgNDQ0KQotCQkJCQkgICAgKDE2MTYsIDQ0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE2LCA0NDQpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NiIgQDU1NwotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEA1NTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTcKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQkJY2xpZW50ICAgICAJQDU1NwotCQkJCQlzdXBwbGllciAgIAlANTUxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA1MDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEA1NTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTcKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExOSwgNjU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM5MjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5IgotCQkJCQljbGllbnQgICAgIAlANTU3Ci0JCQkJCXN1cHBsaWVyICAgCUA1MTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTMsIDY1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5OTA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NCIgQDU2MgotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDUiIEA1NjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjIKLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCQljbGllbnQgICAgIAlANTYyCi0JCQkJCXN1cHBsaWVyICAgCUA1NTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBANTY0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTYyCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMywgNjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTEyMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTk4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJCWNsaWVudCAgICAgCUA1NjIKLQkJCQkJc3VwcGxpZXIgICAJQDUxNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNzE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgNjUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTI1MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANTY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk1OTkKLQkJCQloZWlnaHQgICAgIAkyMDkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODgiIEA1NjgKLQkJCQlsb2NhdGlvbiAgIAkoMjM5NSwgNjA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUE3MDIzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg5IiBANTY5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTY4Ci0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCQljbGllbnQgICAgIAlANTY4Ci0JCQkJCXN1cHBsaWVyICAgCUA1NjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM5NSwgNjA2KQotCQkJCQkgICAgKDIzOTUsIDY1KQotCQkJCQkgICAgKDE2MTEsIDY1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibm90YXRpb25EZWNsYXJhdGlvbnMiIEA1NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjgKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODksIDEwNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4OTc3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEIiCi0JCQkJCWNsaWVudCAgICAgCUA1NjgKLQkJCQkJc3VwcGxpZXIgICAJQDUxNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzk1LCA2MDYpCi0JCQkJCSAgICAoMjM5NSwgMTYzMykKLQkJCQkJICAgICgyMDk4LCAxNjMzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTgsIDE2MzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzQ0LCAxMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODc4MjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg0IiBANTczCi0JCQkJbG9jYXRpb24gICAJKDE3NzIsIDI0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVGRjAyNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NSIgQDU3NAotCQkJCQlQYXJlbnRfVmlldyAJQDU3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJCWNsaWVudCAgICAgCUA1NzMKLQkJCQkJc3VwcGxpZXIgICAJQDU2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMjQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cERlZmluaXRpb25zIiBANTc1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTczCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NiwgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXBEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzNTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQkJY2xpZW50ICAgICAJQDU3MwotCQkJCQlzdXBwbGllciAgIAlANTE3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3NzIsIDI0OSkKLQkJCQkJICAgICgxODMyLCAyNDkpCi0JCQkJCSAgICAoMTgzMiwgMzk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MzIsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDM0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM3ODY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MCIgQDU3OAotCQkJCWxvY2F0aW9uICAgCSgyMzQ2LCA1MTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODEiIEA1NzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzgKLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcyLCAxODU3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy42MzAwNzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThCIgotCQkJCQljbGllbnQgICAgIAlANTc4Ci0JCQkJCXN1cHBsaWVyICAgCUA1NjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0NiwgNTE4KQotCQkJCQkgICAgKDIzNDYsIDE0OSkKLQkJCQkJICAgICgxNjExLCAxNDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMTQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIgQDU4MQotCQkJCQlQYXJlbnRfVmlldyAJQDU3OAotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDgsIDE5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ5OTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQkJY2xpZW50ICAgICAJQDU3OAotCQkJCQlzdXBwbGllciAgIAlANTIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNDYsIDUxOCkKLQkJCQkJICAgICgyMzQ2LCAxNDQxKQotCQkJCQkgICAgKDIxNjYsIDE0NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2NiwgMTQ0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOTksIDE5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0ODg2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODIiIEA1ODQKLQkJCQlsb2NhdGlvbiAgIAkoMjAzLCAxNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMDQ5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODMiIEA1ODUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODQKLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCQljbGllbnQgICAgIAlANTg0Ci0JCQkJCXN1cHBsaWVyICAgCUA1NjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb25zIiBANTg2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ5LCAxOTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDc1NzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzdFIgotCQkJCQljbGllbnQgICAgIAlANTg0Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjAzLCAxNTkpCi0JCQkJCSAgICAoMTA0LCAxNTkpCi0JCQkJCSAgICAoMTA0LCA3ODQpCi0JCQkJCSAgICAoMTg5LCA3ODQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODksIDc4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NSwgMjAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk3MDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg2IiBANTg5Ci0JCQkJbG9jYXRpb24gICAJKDEwODcsIDMyOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExNzAxRUQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NyIgQDU5MAotCQkJCQlQYXJlbnRfVmlldyAJQDU4OQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQkJY2xpZW50ICAgICAJQDU4OQotCQkJCQlzdXBwbGllciAgIAlANTY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAyNjQpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU5MQotCQkJCQlQYXJlbnRfVmlldyAJQDU4OQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3NSwgMzM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA5NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjdEIgotCQkJCQljbGllbnQgICAgIAlANTg5Ci0JCQkJCXN1cHBsaWVyICAgCUA1NTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTgsIDMzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTA3MTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3OCIgQDU5NAotCQkJCWxvY2F0aW9uICAgCSg0OCwgMzIwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc5IiBANTk1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJCWNsaWVudCAgICAgCUA1OTQKLQkJCQkJc3VwcGxpZXIgICAJQDU2NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OSwgMzIyKQotCQkJCQkgICAgKDQ5LCA2OCkKLQkJCQkJICAgICgxMDEzLCA2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgNjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiIEA1OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTQKLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM4LCAxMDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk4NTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQkJY2xpZW50ICAgICAJQDU5NAotCQkJCQlzdXBwbGllciAgIAlANTM0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5LCAzMjIpCi0JCQkJCSAgICAoNDksIDE0MTUpCi0JCQkJCSAgICAoMTc0LCAxNDE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDE0MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MSwgMTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk2NzA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDU5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NSwgNDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNTAxCi0JCQkJaGVpZ2h0ICAgICAJOTcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjgiIEA2MDAKLQkJCQlsb2NhdGlvbiAgIAkoNDk5LCA1ODkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNTkwMTk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjkiIEA2MDEKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MDAKLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFMyIKLQkJCQkJY2xpZW50ICAgICAJQDYwMAotCQkJCQlzdXBwbGllciAgIAlANTk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5OSwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUyLCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIiBANjAyCi0JCQkJCVBhcmVudF9WaWV3IAlANjAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDgxMSwgNTg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAk2LjUyMDgzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUVEIgotCQkJCQljbGllbnQgICAgIAlANjAwCi0JCQkJCXN1cHBsaWVyICAgCUA1OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDk5LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDcsIDQ5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5OSwgNTU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIyIiBANjA1Ci0JCQkJbG9jYXRpb24gICAJKDI0MSwgNjEzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDA1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIzIiBANjA2Ci0JCQkJCVBhcmVudF9WaWV3IAlANjA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQkYiCi0JCQkJCWNsaWVudCAgICAgCUA2MDUKLQkJCQkJc3VwcGxpZXIgICAJQDU5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANjA3Ci0JCQkJCVBhcmVudF9WaWV3IAlANjA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwOCwgNjk0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODY0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0MwIgotCQkJCQljbGllbnQgICAgIAlANjA1Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA3MzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDY4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjEwMTY5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNCIgQDYxMAotCQkJCWxvY2F0aW9uICAgCSg4MzcsIDQ2MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNSIgQDYxMQotCQkJCQlQYXJlbnRfVmlldyAJQDYxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJCWNsaWVudCAgICAgCUA2MTAKLQkJCQkJc3VwcGxpZXIgICAJQDU5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDQ2MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANjEyCi0JCQkJCVBhcmVudF9WaWV3IAlANjEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1MTQ2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQkJY2xpZW50ICAgICAJQDYxMAotCQkJCQlzdXBwbGllciAgIAlANTUxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQ2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgNDA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA0MzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc2IiBANjE1Ci0JCQkJbG9jYXRpb24gICAJKDU0MSwgMjQ2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRThEMDFCRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc3IiBANjE2Ci0JCQkJCVBhcmVudF9WaWV3IAlANjE1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTgiCi0JCQkJCWNsaWVudCAgICAgCUA2MTUKLQkJCQkJc3VwcGxpZXIgICAJQDU2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAyNDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb25zIiBANjE3Ci0JCQkJCVBhcmVudF9WaWV3IAlANjE1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MywgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwOTMwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OSIKLQkJCQkJY2xpZW50ICAgICAJQDYxNQotCQkJCQlzdXBwbGllciAgIAlANTk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDU0MSwgMjQ2KQotCQkJCQkgICAgKDIyNCwgMjQ2KQotCQkJCQkgICAgKDIyNCwgNDAwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI0LCA0MDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODYsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMCIgQDYyMAotCQkJCWxvY2F0aW9uICAgCSgzNTMsIDYyMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQyREJERDAyOTciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMSIgQDYyMQotCQkJCQlQYXJlbnRfVmlldyAJQDYyMAotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTFFIgotCQkJCQljbGllbnQgICAgIAlANjIwCi0JCQkJCXN1cHBsaWVyICAgCUA1OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzUzLCA2MjEpCi0JCQkJCSAgICAoMzA2LCA2MjEpCi0JCQkJCSAgICAoMzA2LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDYsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwIiBANjIyCi0JCQkJCVBhcmVudF9WaWV3IAlANjIwCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3OSwgNjM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJNC44MDg1MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJCWNsaWVudCAgICAgCUA2MjAKLQkJCQkJc3VwcGxpZXIgICAJQDU5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNTMsIDYyMSkKLQkJCQkJICAgICg0MDAsIDYyMSkKLQkJCQkJICAgICg0MDAsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNDk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUwLCA1ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjk3NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2OUU3ODYwMkM1IgotCQkJdGl0bGUgICAgICAJIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA2MjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDEyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDExNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHRhcmdldE5hbWVzcGFjZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTUzNAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDYyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTY3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANjI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMTY4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTUyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTU4NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTM5Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGRlcml2YXRpb25NZXRob2QgOiBYU0REZXJpdmF0aW9uTWV0aG9kID0gcmVzdHJpY3Rpb24iCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEQ29tcGxleEZpbmFsIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iCi0JCQkJCSIrIGNvbnRlbnRUeXBlQ2F0ZWdvcnkgOiBYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCQkiPDwwLi4qPj4gKyBwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJMTE5MgotCQkJCWhlaWdodCAgICAgCTMzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MjgKLQkJCQlsb2NhdGlvbiAgIAkoNDYzLCAzNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYyNQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDYzLCAzNjIpCi0JCQkJICAgICg0NjMsIDIyMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDYyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTc5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSIKLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTY0NgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA2MzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDE0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDk4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyByZXF1aXJlZCA6IGJvb2xlYW4iCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANjMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg5MCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkxMjYwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSA6IFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQkJIjw8MC4uKj4+ICsgbmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIKLQkJCQkJIisgcHJvY2Vzc0NvbnRlbnRzIDogWFNEUHJvY2Vzc0NvbnRlbnRzIikpCi0JCQkJd2lkdGggICAgICAJMTMwNAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANjMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTQ0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDEzODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJNTk2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA2MzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDUxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQ5OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA2Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYzNAotCQkJCWxvY2F0aW9uICAgCSgyOTQsIDY5NykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyOTQsIDY5NykKLQkJCQkgICAgKDI5NCwgNjA1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDYzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjU2LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTUsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANjM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgNTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDE4LCA0NjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MzcKLQkJCQlsb2NhdGlvbiAgIAkoMjY4NCwgOTYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2MzYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI2ODQsIDk2MikKLQkJCQkgICAgKDI2ODQsIDU3NikpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb3NpdG9yIiBANjM4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDExMTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvc2l0b3IiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTA2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUI2MjAwMzciCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbnQiIEA2MzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlFMjYwMUFFIgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REZXJpdmF0aW9uTWV0aG9kIiBANjQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIyMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODZBMEIwMDBDRSIKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiIEA2NDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCA4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTFFMDAyNzIiCi0JCQkJd2lkdGggICAgICAJNjI1Ci0JCQkJaGVpZ2h0ICAgICAJMzAwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiIEA2NDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjExNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIwNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NkE3OUYwM0EyIgotCQkJCXdpZHRoICAgICAgCTUxNAotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANjQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTYwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNTE2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvY2Vzc0NvbnRlbnRzIiBANjQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMjI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxMDYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY4QzcwMjg0IgotCQkJCXdpZHRoICAgICAgCTQzOAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aFZhcmlldHkiIEA2NDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkZCODkwMzNBIgotCQkJCXdpZHRoICAgICAgCTM4MQotCQkJCWhlaWdodCAgICAgCTI1MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDY0NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDE4NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3ODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTczOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE4NDgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMTk5Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxpc3QiCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyB1bmlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA2NDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxOTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxODkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMjAwMSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMDIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM4MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiIEA2NDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTA3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzU5MTAwQUUiCi0JCQkJd2lkdGggICAgICAJNjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBANjQ5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTExNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTE3NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMzYKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgc3Vic3RpdHV0aW9uIgotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBANjUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMjI3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjIxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjI3MykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMDIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiIEA2NTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAyMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjE1NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxMDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1RUEwMDIzIgotCQkJCXdpZHRoICAgICAgCTY5NgotCQkJCWhlaWdodCAgICAgCTI5NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA2NTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCA4ODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgNzQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDgwOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkxMzU3Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5pbGxhYmxlIDogYm9vbGVhbiIKLQkJCQkJIjw8MC4uKj4+ICsgZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIjw8MC4uKj4+ICsgc3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIDogWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAkxNDA0Ci0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUA2NTIKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjgxLCA3MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDYzNCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA2NTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDgxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDY1NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjAsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDY1NQotCQkJCXN1cHBsaWVyICAgCUA2MzYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODYyLCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODYyLCA5NjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjM3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDY1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEzMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjgsIDEyNjMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NTgKLQkJCQlsb2NhdGlvbiAgIAkoMjM3NSwgMTQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjU3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMzc1LCAxNDY1KQotCQkJCSAgICAoMjM3NSwgMTM3NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlANjU3Ci0JCQkJc3VwcGxpZXIgICAJQDYzNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNjgsIDEyNDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNjgsIDk2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA2MjcKLQkJCQlzdXBwbGllciAgIAlANjU3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgxOCwgMTUxMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxOCwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA2MjkKLQkJCQlzdXBwbGllciAgIAlANjU3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwNiwgMTUwNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNiwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANjYyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOCwgMTEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA2NjIKLQkJCQlzdXBwbGllciAgIAlANjM2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExNSwgMTA4OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgOTYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYzNykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDY2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDQ2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJMTE1MAotCQkJCWhlaWdodCAgICAgCTE0NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQljbGllbnQgICAgIAlANjY0Ci0JCQkJc3VwcGxpZXIgICAJQDYyNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjgsIDQ1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OCwgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYyOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDY2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzgsIDcwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk1MDIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANjY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAyNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiCi0JCQkJY2xpZW50ICAgICAJQDY2NgotCQkJCXN1cHBsaWVyICAgCUA2MjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjkwLCA2OTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTAsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA2NTQKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxLCA4MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDYzNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDYzMwotCQkJCXN1cHBsaWVyICAgCUA2MjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzIsIDQxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzcyLCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQljbGllbnQgICAgIAlANjM2Ci0JCQkJc3VwcGxpZXIgICAJQDYyNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2ODcsIDQ0OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4NywgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYyOCkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIgotCQkJcXVpZCAgICAgICAJIjNCNkMzMjY1MDA1RiIKLQkJCXRpdGxlICAgICAgCSI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IiBANjcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgODk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgODQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGaXhlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIgotCQkJCXdpZHRoICAgICAgCTMzOAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA2NzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA4OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNCwgODQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJd2lkdGggICAgICAJNDUwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEA2NzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjYsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDY3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzcsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjc2Ci0JCQkJbG9jYXRpb24gICAJKDcxOCwgMTA0OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjczCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3MTgsIDEwNDkpCi0JCQkJICAgICg3MTgsIDk1OSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEA2NzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgOTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzk5LCA4NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBANjc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MywgODcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJd2lkdGggICAgICAJMzg4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEA2NzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAzMiwgMTEwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMTA0OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBANjgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTksIDEwNDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCQl3aWR0aCAgICAgIAkzODgKLQkJCQloZWlnaHQgICAgIAkxMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEA2ODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM0OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDY4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwNSwgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY4MwotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDEyNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ0LCAxMjYyKQotCQkJCSAgICAoMTQ0LCA5NjQpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEA2ODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMTU1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDY4NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEA2ODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBANjg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE5MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDE4NTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDY4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MiwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJd2lkdGggICAgICAJNDQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBANjg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTkwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0LCAxODUyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDY5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyLCAyMDU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBANjkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTgsIDIwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOUQwM0M3IgotCQkJCWNsaWVudCAgICAgCUA2NzQKLQkJCQlzdXBwbGllciAgIAlANjczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzk0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTQsIDEwNDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjc2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODYyMDA0NSIKLQkJCQljbGllbnQgICAgIAlANjg1Ci0JCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjgzKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA2OTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAxMTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkNBNTAzOEQiCi0JCQkJY2xpZW50ICAgICAJQDY3NQotCQkJCXN1cHBsaWVyICAgCUA2NzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMDQ5KQotCQkJCWRyYXdTdXBwbGllciAJQDY3NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4MDAyREYiCi0JCQkJY2xpZW50ICAgICAJQDY4MQotCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjMsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWQiIEA2OTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTMyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEyNzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNTIwMkU0IgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eSIgQDY5OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNUQwMDlCIgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlIiBANjk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCRUVEMEY2MDM0MiIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkyODcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6VmFsdWUiIEA3MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAyMDk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzAwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwNjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlZhbHVlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQzA0MEI1QjAzMUYiCi0JCQkJd2lkdGggICAgICAJNjM2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzAxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNjEwMzM3IgotCQkJCWNsaWVudCAgICAgCUA2OTAKLQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDIwNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4MykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEA3MDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDEzNzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTMyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEA3MDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxMzc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MDQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQyNDAwOTgiCi0JCQkJY2xpZW50ICAgICAJQDcwMgotCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzUsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzA1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMzEwM0FEIgotCQkJCWNsaWVudCAgICAgCUA3MDMKLQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgMTMwOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzA2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTIwMzUzIgotCQkJCWNsaWVudCAgICAgCUA2ODgKLQkJCQlzdXBwbGllciAgIAlANzAyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg1LCAxNjY0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODUsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjgzMDNCOCIKLQkJCQljbGllbnQgICAgIAlANjg2Ci0JCQkJc3VwcGxpZXIgICAJQDcwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDAsIDE2NjQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDAsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjhFMDMwOSIKLQkJCQljbGllbnQgICAgIAlANjg3Ci0JCQkJc3VwcGxpZXIgICAJQDcwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjIsIDE4NDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjIsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M0MDBDMCIKLQkJCQljbGllbnQgICAgIAlANjgyCi0JCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTQ4NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I3RDAwRkMiCi0JCQkJY2xpZW50ICAgICAJQDY4NAotCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I5OTAwMTYiCi0JCQkJY2xpZW50ICAgICAJQDY5MQotCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc1LCAyMDQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4MykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA3MTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDM2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTQwNgotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3MTMKLQkJCQlsb2NhdGlvbiAgIAkoMzY2LCA1MjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzY2LCA1MjIpCi0JCQkJICAgICgzNjYsIDQzMCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDcxNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQsIDU3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcxNQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDc4MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANzE0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyNzIsIDc4MSkKLQkJCQkgICAgKDI3MiwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzE2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCWNsaWVudCAgICAgCUA2NzMKLQkJCQlzdXBwbGllciAgIAlANzE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTk0LCA4MzMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5NCwgNzgxKQotCQkJCWRyYXdTdXBwbGllciAJQDcxNSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIgQDcxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZ1bmRhbWVudGFsRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiCi0JCQkJd2lkdGggICAgICAJNDcwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcxOAotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDc4OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANzE3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3NjgsIDc4OSkKLQkJCQkgICAgKDc2OCwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzE5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NTkwMTJDIgotCQkJCWNsaWVudCAgICAgCUA2NzcKLQkJCQlzdXBwbGllciAgIAlANzE3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA1MCwgODYwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzE4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjNDMDIyNCIKLQkJCQljbGllbnQgICAgIAlANjc4Ci0JCQkJc3VwcGxpZXIgICAJQDcxNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjUsIDg2MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyNSwgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDcxOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0RjAxMzEiCi0JCQkJY2xpZW50ICAgICAJQDY3OQotCQkJCXN1cHBsaWVyICAgCUA3MTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjM3LCAxMDM2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM3LCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzE4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjQyMDA3NCIKLQkJCQljbGllbnQgICAgIAlANjgwCi0JCQkJc3VwcGxpZXIgICAJQDcxNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDEwMzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NiwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDEwNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1OTgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk2NTYKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM0IiBANzI0Ci0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTc4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1OTcxMDJFQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM1IiBANzI1Ci0JCQkJCVBhcmVudF9WaWV3IAlANzI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA5LCAyMzUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQkJY2xpZW50ICAgICAJQDcyNAotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3NSwgMTc4KQotCQkJCQkgICAgKDU1MCwgMTc4KQotCQkJCQkgICAgKDU1MCwgMzA2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCAzMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDcyNwotCQkJCQlQYXJlbnRfVmlldyAJQDcyNAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODMxMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJCWNsaWVudCAgICAgCUA3MjQKLQkJCQkJc3VwcGxpZXIgICAJQDcyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAxNzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYxLCAyMTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjUwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTYiIEA3MzAKLQkJCQlsb2NhdGlvbiAgIAkoMzY5LCA3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwMjAzQTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0cyIgQDczMQotCQkJCQlQYXJlbnRfVmlldyAJQDczMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQ5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA2NSIKLQkJCQkJY2xpZW50ICAgICAJQDczMAotCQkJCQlzdXBwbGllciAgIAlANzE0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDM2OSwgNzIpCi0JCQkJCSAgICAoMTAwLCA3MikKLQkJCQkJICAgICgxMDAsIDU2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwLCA1NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc5MDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NyIgQDczNAotCQkJCQlQYXJlbnRfVmlldyAJQDczMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDMxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNTEiCi0JCQkJCWNsaWVudCAgICAgCUA3MzAKLQkJCQkJc3VwcGxpZXIgICAJQDcyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzgiIEA3MzYKLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgNTA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOCwgNDQ5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTYwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM5IiBANzM4Ci0JCQkJCVBhcmVudF9WaWV3IAlANzM2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ2LCAzNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERiIKLQkJCQkJY2xpZW50ICAgICAJQDczNgotCQkJCQlzdXBwbGllciAgIAlANzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNDg3LCA1MDgpCi0JCQkJCSAgICAoMTQ4NywgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIml0ZW1UeXBlRGVmaW5pdGlvbiIgQDc0MAotCQkJCQlQYXJlbnRfVmlldyAJQDczNgotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2l0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjIxMTUzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBFMCIKLQkJCQkJY2xpZW50ICAgICAJQDczNgotCQkJCQlzdXBwbGllciAgIAlANzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNTkwLCA1MDgpCi0JCQkJCSAgICAoMTU5MCwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDQ2OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAzOTg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5OCIgQDc0MwotCQkJCWxvY2F0aW9uICAgCSgxNzI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QjcwMjA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTkiIEA3NDQKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDMKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDM1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU4IgotCQkJCQljbGllbnQgICAgIAlANzQzCi0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE2NzgsIDU3NCkKLQkJCQkJICAgICgxNjc4LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OCwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWVtYmVyVHlwZURlZmluaXRpb25zIiBANzQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzQzCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA2NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWVtYmVyVHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMjY5MjMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCQljbGllbnQgICAgIAlANzQzCi0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE3ODEsIDU3NCkKLQkJCQkJICAgICgxNzgxLCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMCwgNTIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMTIxMjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAwIiBANzQ5Ci0JCQkJbG9jYXRpb24gICAJKDc0OCwgMjY5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNjMyMDFEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnVuZGFtZW50YWxGYWNldHMiIEA3NTAKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDkKLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgMzEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Z1bmRhbWVudGFsRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDA5MDkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCQljbGllbnQgICAgIAlANzQ5Ci0JCQkJCXN1cHBsaWVyICAgCUA3MTcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzQ4LCAyNjkpCi0JCQkJCSAgICAoNjU5LCAyNjkpCi0JCQkJCSAgICAoNjU5LCA1NjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTksIDU2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyOCwgMzg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzgwMjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMSIgQDc1MwotCQkJCQlQYXJlbnRfVmlldyAJQDc0OQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1MiwgMjI4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNTkiCi0JCQkJCWNsaWVudCAgICAgCUA3NDkKLQkJCQkJc3VwcGxpZXIgICAJQDcyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAyNjkpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMiIgQDc1NQotCQkJCWxvY2F0aW9uICAgCSgxMTc1LCAzOTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDMiIEA3NTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTUKLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDMxNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCQljbGllbnQgICAgIAlANzU1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDExMzUsIDM5NikKLQkJCQkJICAgICgxMTM1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANzU4Ci0JCQkJCVBhcmVudF9WaWV3IAlANzU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA0NDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuNTMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANzU1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDEyMTUsIDM5NikKLQkJCQkJICAgICgxMjE1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxNSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzU4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgMzU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk2MTU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNCIgQDc2MQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0NDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDUiIEA3NjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjEKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNjgsIDMyNykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjJGIgotCQkJCQljbGllbnQgICAgIAlANzYxCi0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQotCQkJCQkgICAgKDEzMDksIDQ0NikKLQkJCQkJICAgICgxMzA5LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwOSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iIEA3NjQKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjEKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDQsIDUwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQkJY2xpZW50ICAgICAJQDc2MQotCQkJCQlzdXBwbGllciAgIAlANzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNjAsIDQ0NikKLQkJCQkJICAgICgxNDEyLCA0NDYpCi0JCQkJCSAgICAoMTQxMiwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTIsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzMsIDQwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYyMTQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANzY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgNTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgMzc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDg4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBsaXN0IgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgdW5pb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDc2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDkyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzdCMDM5NiIKLQkJCQljbGllbnQgICAgIAlANzE3Ci0JCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MSwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTEsIDUyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzcwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCWNsaWVudCAgICAgCUA3MTQKLQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA1NjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgNTIyKQotCQkJCWRyYXdTdXBwbGllciAJQDcxMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJY2xpZW50ICAgICAJQDcxMgotCQkJCXN1cHBsaWVyICAgCUA2OTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjYsIDMwNikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY2LCAyMTUpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc3MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2Qzg4MDFCNCIKLQkJCQljbGllbnQgICAgIAlANjcyCi0JCQkJc3VwcGxpZXIgICAJQDcxNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDc4MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MTUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzczCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTkwMjgxIgotCQkJCWNsaWVudCAgICAgCUA2ODkKLQkJCQlzdXBwbGllciAgIAlANzAyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwLCAxODQwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAsIDE0NDQpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCNjlENjhEMDBEMiIKLQkJCXRpdGxlICAgICAgCSI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANzc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJd2lkdGggICAgICAJMzU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANzc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MiwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgMTUwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNiwgMTQ2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMzA0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjYzLCAyNjMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANzc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTMxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANzc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA3MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA2NjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA3ODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA3ODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDU0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDUwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDc4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzgyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDY4LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANzgzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTE3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDc4NAotCQkJCWxvY2F0aW9uICAgCSgxOTk0LCAxNDEyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA3ODMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5OTQsIDE0MTIpCi0JCQkJICAgICgxOTk0LCAxMjcxKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzg1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA3NzYKLQkJCQlzdXBwbGllciAgIAlANzgzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA4NCwgMTQ0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA4NCwgMTQxMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3ODQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDc4NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzg2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MCwgODIxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDAyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTIsIDM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQl3aWR0aCAgICAgIAkyMzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANzg4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDg0LCAzNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDc4OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzg5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgMTgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA3OTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDY3LCAxNjc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNjY5Ci0JCQkJaGVpZ2h0ICAgICAJMTAwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3OTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDc5MAotCQkJCXN1cHBsaWVyICAgCUA3ODMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTcyLCAxNjYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcyLCAxNDEyKQotCQkJCWRyYXdTdXBwbGllciAJQDc4NCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDc5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgsIDk4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA3OTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODgsIDUxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDc5NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA3OTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MiwgNjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTczOAotCQkJCWhlaWdodCAgICAgCTU0MwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MCIgQDc5NgotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDEiIEA3OTcKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTYKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzM0MiCi0JCQkJCWNsaWVudCAgICAgCUA3OTYKLQkJCQkJc3VwcGxpZXIgICAJQDc3OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjcxLCAxMzU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5OAotCQkJCQlQYXJlbnRfVmlldyAJQDc5NgotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk4LCAxMzIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS4xMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJCWNsaWVudCAgICAgCUA3OTYKLQkJCQkJc3VwcGxpZXIgICAJQDc5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4NjUsIDEzNTkpCi0JCQkJCSAgICAoOTI1LCAxMzU5KQotCQkJCQkgICAgKDkyNSwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEyNzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjQyMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjQiIEA4MDEKLQkJCQlsb2NhdGlvbiAgIAkoNzEzLCA3MDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEYwMjEyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjUiIEA4MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDEKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwQzkiCi0JCQkJCWNsaWVudCAgICAgCUA4MDEKLQkJCQkJc3VwcGxpZXIgICAJQDc3OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDcwOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDEKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNjY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTIzOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQkJY2xpZW50ICAgICAJQDgwMQotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgNzA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk2LCA3NTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MzU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTgiIEA4MDYKLQkJCQlsb2NhdGlvbiAgIAkoNzE5LCAxMTkzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE1MDA4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU5IiBAODA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODA2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMDk2IgotCQkJCQljbGllbnQgICAgIAlAODA2Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTE5MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDYKLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMTE0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDY5OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwQTAiCi0JCQkJCWNsaWVudCAgICAgCUA4MDYKLQkJCQkJc3VwcGxpZXIgICAJQDc5NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMTkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCAxMjQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDQxNjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE4IiBAODExCi0JCQkJbG9jYXRpb24gICAJKDc4NSwgNTUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE5IiBAODEyCi0JCQkJCVBhcmVudF9WaWV3IAlAODExCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDIzRiIKLQkJCQkJY2xpZW50ICAgICAJQDgxMQotCQkJCQlzdXBwbGllciAgIAlANzgxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNTUwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgxMwotCQkJCQlQYXJlbnRfVmlldyAJQDgxMQotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OSwgNTE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzA3MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJCWNsaWVudCAgICAgCUA4MTEKLQkJCQkJc3VwcGxpZXIgICAJQDc5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODUsIDU1MCkKLQkJCQkJICAgICg4ODQsIDU1MCkKLQkJCQkJICAgICg4ODQsIDY3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyOTczMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTAiIEA4MTYKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgNDA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkxIiBAODE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTY1IgotCQkJCQljbGllbnQgICAgIAlAODE2Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDEzNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI0LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC42NjU0MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCQljbGllbnQgICAgIAlAODE2Ci0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg0Mzg3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNiIgQDgyMQotCQkJCWxvY2F0aW9uICAgCSgxNzUyLCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMjkxMDE1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA3IiBAODIyCi0JCQkJCVBhcmVudF9WaWV3IAlAODIxCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxOUYiCi0JCQkJCWNsaWVudCAgICAgCUA4MjEKLQkJCQkJc3VwcGxpZXIgICAJQDc4MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzUyLCAxMDM0KQotCQkJCQkgICAgKDE4MTIsIDEwMzQpCi0JCQkJCSAgICAoMTgxMiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjEKLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODIzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0MywgOTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTYwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDFBOSIKLQkJCQkJY2xpZW50ICAgICAJQDgyMQotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgMTAzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODQsIDEwNjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MDMzMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDgiIEA4MjYKLQkJCQlsb2NhdGlvbiAgIAkoMTg5NiwgODgxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOTAwNkNGMDA4OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA5IiBAODI3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODI2Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQkJY2xpZW50ICAgICAJQDgyNgotCQkJCQlzdXBwbGllciAgIAlANzgzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE4OTYsIDg4MSkKLQkJCQkJICAgICgxOTU2LCA4ODEpCi0JCQkJCSAgICAoMTk1NiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTU2LCAxMTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGVyaXZhdGlvbkFubm90YXRpb24iIEA4MjgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjYKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCA4NDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1NDIzNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQkJY2xpZW50ICAgICAJQDgyNgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA4ODEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg5LCA5MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNTA4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTAiIEA4MzEKLQkJCQlsb2NhdGlvbiAgIAkoMjA0MCwgNzE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjMzMDI2NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjExIiBAODMyCi0JCQkJCVBhcmVudF9WaWV3IAlAODMxCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyODQiCi0JCQkJCWNsaWVudCAgICAgCUA4MzEKLQkJCQkJc3VwcGxpZXIgICAJQDc4MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMDQwLCA3MTUpCi0JCQkJCSAgICAoMjEwMCwgNzE1KQotCQkJCQkgICAgKDIxMDAsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMCwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODMzCi0JCQkJCVBhcmVudF9WaWV3IAlAODMxCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDY4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjhFIgotCQkJCQljbGllbnQgICAgIAlAODMxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDc0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA5MzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyOCIgQDgzNgotCQkJCWxvY2F0aW9uICAgCSg2NjgsIDg2NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNDAwNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyOSIgQDgzNwotCQkJCQlQYXJlbnRfVmlldyAJQDgzNgotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMENBIgotCQkJCQljbGllbnQgICAgIAlAODM2Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDczLCA4NjUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODM2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgODI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzNDE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBENCIKLQkJCQkJY2xpZW50ICAgICAJQDgzNgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgODY1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAxLCA5MDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4MjA1MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzIiIEA4NDEKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgMTY3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMzIiBAODQyCi0JCQkJCVBhcmVudF9WaWV3IAlAODQxCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUM0IgotCQkJCQljbGllbnQgICAgIAlAODQxCi0JCQkJCXN1cHBsaWVyICAgCUA3ODcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ3MiwgMTY3KQotCQkJCQkgICAgKDE0NzIsIDcyKQotCQkJCQkgICAgKDE4ODMsIDcyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODMsIDcyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg0MwotCQkJCQlQYXJlbnRfVmlldyAJQDg0MQotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzYzMDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUNFIgotCQkJCQljbGllbnQgICAgIAlAODQxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTksIDYxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkzNTc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgyIiBAODQ2Ci0JCQkJbG9jYXRpb24gICAJKDkyNywgMzUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjA2MDI5MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODMiIEA4NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDYKLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcxIgotCQkJCQljbGllbnQgICAgIAlAODQ2Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCAzNTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODQ4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAzMTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjgxNjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MiIKLQkJCQkJY2xpZW50ICAgICAJQDg0NgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkyNywgMzUwKQotCQkJCQkgICAgKDk4NywgMzUwKQotCQkJCQkgICAgKDk4NywgNjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg3LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM3LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MzM0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NCIgQDg1MQotCQkJCWxvY2F0aW9uICAgCSgxMDI3LCAyMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREMwMkY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NSIgQDg1MgotCQkJCQlQYXJlbnRfVmlldyAJQDg1MQotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDIzOCIKLQkJCQkJY2xpZW50ICAgICAJQDg1MQotCQkJCQlzdXBwbGllciAgIAlANzg5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDIyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTEKLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDA2MjUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjQyIgotCQkJCQljbGllbnQgICAgIAlAODUxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTAyNywgMjIyKQotCQkJCQkgICAgKDEwODcsIDIyMikKLQkJCQkJICAgICgxMDg3LCA2NzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNjEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTAwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgyNTgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk4IiBAODU2Ci0JCQkJbG9jYXRpb24gICAJKDE0OTQsIDE0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2ODgwMUMyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5OSIgQDg1NwotCQkJCQlQYXJlbnRfVmlldyAJQDg1NgotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTExIgotCQkJCQljbGllbnQgICAgIAlAODU2Ci0JCQkJCXN1cHBsaWVyICAgCUA3OTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxNjYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudEFubm90YXRpb24iIEA4NTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTYKLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODU4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NiwgMTM1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50QW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3NzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExQiIKLQkJCQkJY2xpZW50ICAgICAJQDg1NgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDMsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzAwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTIiIEA4NjEKLQkJCQlsb2NhdGlvbiAgIAkoNjM3LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE3MDJDOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUzIiBAODYyCi0JCQkJCVBhcmVudF9WaWV3IAlAODYxCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTgwM0UyIgotCQkJCQljbGllbnQgICAgIAlAODYxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxMSwgMTAyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjEKLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxMCwgOTc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODg4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE5MDAwNCIKLQkJCQkJY2xpZW50ICAgICAJQDg2MQotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDEwMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEwNjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMDA4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MiIgQDg2NgotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA2MDcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTcwMTAyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MyIgQDg2NwotCQkJCQlQYXJlbnRfVmlldyAJQDg2NgotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MSIKLQkJCQkJY2xpZW50ICAgICAJQDg2NgotCQkJCQlzdXBwbGllciAgIAlANzkzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1ODEsIDYwNykKLQkJCQkJICAgICgxNTgxLCA1NDcpCi0JCQkJCSAgICAoMTY3OSwgNTQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzksIDU0NykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODY4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODY2Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA0NjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTg4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTIiCi0JCQkJCWNsaWVudCAgICAgCUA4NjYKLQkJCQkJc3VwcGxpZXIgICAJQDc5NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNjIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEyIiBAODcxCi0JCQkJbG9jYXRpb24gICAJKDg0OSwgMTQ5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMTAyNkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMyIgQDg3MgotCQkJCQlQYXJlbnRfVmlldyAJQDg3MQotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDFGOSIKLQkJCQkJY2xpZW50ICAgICAJQDg3MQotCQkJCQlzdXBwbGllciAgIAlANzk0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODczCi0JCQkJCVBhcmVudF9WaWV3IAlAODcxCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDIsIDE0NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTg4MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMjAzIgotCQkJCQljbGllbnQgICAgIAlAODcxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODQ5LCAxNDk2KQotCQkJCQkgICAgKDEwNjIsIDE0OTYpCi0JCQkJCSAgICAoMTA2MiwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDYyLCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODczCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNSwgMTI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyNjkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNCIgQDg3NgotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE1NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjMwMDA1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTUiIEA4NzcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzYKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMjciCi0JCQkJCWNsaWVudCAgICAgCUA4NzYKLQkJCQkJc3VwcGxpZXIgICAJQDc5NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNTY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4NzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzYKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDE1MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwNDk1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMzMiIKLQkJCQkJY2xpZW50ICAgICAJQDg3NgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk1MiwgMTU2NSkKLQkJCQkJICAgICgxMjAwLCAxNTY1KQotCQkJCQkgICAgKDEyMDAsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTQsIDEyNzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQljbGllbnQgICAgIAlANzc3Ci0JCQkJc3VwcGxpZXIgICAJQDc4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDI0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgMTM1KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDc5MwotCQkJCXN1cHBsaWVyICAgCUA3NzcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTk3LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTcsIDM1OSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJcXVpZCAgICAgICAJIjNCNkFENzREMDNDNCIKLQkJCXRpdGxlICAgICAgCSI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDg4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDM3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDg4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDM3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCXdpZHRoICAgICAgCTU0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA4ODUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODUKLQkJCQkgICAgbG9jYXRpb24gICAJKDk5MSwgNjMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA4ODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTYsIDM3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODg3Ci0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDU2MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODg2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMzYwLCA1NjEpCi0JCQkJICAgICgxMzYwLCA0NzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIgQDg4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREluY2x1ZGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiCi0JCQkJd2lkdGggICAgICAJMjU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAODg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAODkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDg5MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzUsIDExNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJODY5Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUwIiBAODkyCi0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDEyMDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTEiIEA4OTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTIKLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUA4OTIKLQkJCQkJc3VwcGxpZXIgICAJQDg4OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODk0Ci0JCQkJCVBhcmVudF9WaWV3IAlAODkyCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzQ3LCAxMTU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NDQxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QyIKLQkJCQkJY2xpZW50ICAgICAJQDg5MgotCQkJCQlzdXBwbGllciAgIAlAODkxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNCwgMTIwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDAsIDEyNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDcKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTQ3MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ4IiBAODk3Ci0JCQkJbG9jYXRpb24gICAJKDExNjgsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDgwMkZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDkiIEA4OTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTcKLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QiIKLQkJCQkJY2xpZW50ICAgICAJQDg5NwotCQkJCQlzdXBwbGllciAgIAlAODg5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNjgsIDEwMjIpCi0JCQkJCSAgICAoMTE2OCwgOTYyKQotCQkJCQkgICAgKDEyODUsIDk2MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NSwgOTYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg5OQotCQkJCQlQYXJlbnRfVmlldyAJQDg5NwotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjkwLCAxMDc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJCWNsaWVudCAgICAgCUA4OTcKLQkJCQkJc3VwcGxpZXIgICAJQDg5MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNjgsIDExNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTI3LCAxMDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzY5NzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcwIiBAOTAyCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEzNTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDIwMDlBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzEiIEA5MDMKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MDIKLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJCWNsaWVudCAgICAgCUA5MDIKLQkJCQkJc3VwcGxpZXIgICAJQDg5MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDE5NDAsIDEzNTMpCi0JCQkJCSAgICAoMTk0MCwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MCwgMTI1NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAOTA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTAyCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCAxMzIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTY4MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJCWNsaWVudCAgICAgCUA5MDIKLQkJCQkJc3VwcGxpZXIgICAJQDg5MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDExODEsIDEzNTMpCi0JCQkJCSAgICAoMTE4MSwgMTI1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4MSwgMTI1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzAsIDEzMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MTM0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MDcKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA1NjEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg4MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjg4LCA1NjEpCi0JCQkJICAgICgyODgsIDQ3MSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDkwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDYzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDkwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1OCwgMzc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQkJd2lkdGggICAgICAJNDE0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAOTEwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA5NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgOTE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA5MTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwLCA2MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAOTExCi0JCQkJc3VwcGxpZXIgICAJQDg4MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMSwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjEsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTEzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA5MDgKLQkJCQlzdXBwbGllciAgIAlAODgzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTg5LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OSwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDkwNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJY2xpZW50ICAgICAJQDg4NQotCQkJCXN1cHBsaWVyICAgCUA4ODYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDE2LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTYsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4ODcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEA5MTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTAsIDkwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTE2Ci0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDEwODkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTgyNCwgMTA4OSkKLQkJCQkgICAgKDE4MjQsIDk5OSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOERDMDM4MSIKLQkJCQljbGllbnQgICAgIAlAODg4Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjYsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjYsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCIKLQkJCQljbGllbnQgICAgIAlAODkwCi0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MzQsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzQsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5MTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNjMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTIwCi0JCQkJbG9jYXRpb24gICAJKDE3NjIsIDgxOSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTE5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzYyLCA4MTkpCi0JCQkJICAgICgxNzYyLCA3MjcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiCi0JCQkJY2xpZW50ICAgICAJQDg4OQotCQkJCXN1cHBsaWVyICAgCUA5MTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE2LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTYsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTIyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA5MTkKLQkJCQlzdXBwbGllciAgIAlAODg2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NiwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU2LCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODg3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDkyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxNDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MjQKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjg5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5MjMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDExMjAsIDI4OSkKLQkJCQkgICAgKDExMjAsIDE5OSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTIiIEA5MjUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NSwgMjE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGFpbmVyIiBAOTI2Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTI1Ci0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDIxMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250YWluZXIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMzExMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0UiCi0JCQkJCWNsaWVudCAgICAgCUA5MjUKLQkJCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMTc2KQotCQkJCQkgICAgKDEzNzQsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM1LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMjY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEzIiBAOTI5Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTI1Ci0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0YiCi0JCQkJCWNsaWVudCAgICAgCUA5MjUKLQkJCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMjU0KQotCQkJCQkgICAgKDEzNDUsIDI1NCkKLQkJCQkJICAgICgxMzQ1LCAxOTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM0NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTQiIEA5MzAKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAyMTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNDgwMjYxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290Q29udGFpbmVyIiBAOTMxCi0JCQkJCVBhcmVudF9WaWV3IAlAOTMwCi0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAyMTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdENvbnRhaW5lciIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNTAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTYwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJCWNsaWVudCAgICAgCUA5MzAKLQkJCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDE3NikKLQkJCQkJICAgICg4NjYsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNSIgQDkzNAotCQkJCQlQYXJlbnRfVmlldyAJQDkzMAotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODYiCi0JCQkJCWNsaWVudCAgICAgCUA5MzAKLQkJCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDI1NykKLQkJCQkJICAgICg4OTUsIDI1NykKLQkJCQkJICAgICg4OTUsIDE5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQljbGllbnQgICAgIAlAODg2Ci0JCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjcsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NywgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkyNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MzYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDhFMjAwRUEiCi0JCQkJY2xpZW50ICAgICAJQDg4NAotCQkJCXN1cHBsaWVyICAgCUA5MjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTI0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQljbGllbnQgICAgIAlAODgzCi0JCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTksIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTM4Ci0JCQkJc3VwcGxpZXIgICAJQDkxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNiwgMTE0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2LCA3MjcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjYiIEA5NDAKLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTQyNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNyIgQDk0MQotCQkJCQlQYXJlbnRfVmlldyAJQDk0MAotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDk0MAotCQkJCQlzdXBwbGllciAgIAlAOTE1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjE0NywgMTQyNSkKLQkJCQkJICAgICgyMTQ3LCA5NDMpCi0JCQkJCSAgICAoMjA2NywgOTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY3LCA5NDMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEA5NDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NDAKLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NSwgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQkJY2xpZW50ICAgICAJQDk0MAotCQkJCQlzdXBwbGllciAgIAlAOTM4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjI1LCAxNDI1KQotCQkJCQkgICAgKDIyNSwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI1LCAxMjU1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTY5MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI0IiBAOTQ1Ci0JCQkJbG9jYXRpb24gICAJKDE1MDUsIDE1MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjUiIEA5NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NDUKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUA5NDUKLQkJCQkJc3VwcGxpZXIgICAJQDkxOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTA1LCAxNTAzKQotCQkJCQkgICAgKDIxODgsIDE1MDMpCi0JCQkJCSAgICAoMjE4OCwgNjc1KQotCQkJCQkgICAgKDIwNTksIDY3NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1OSwgNjc1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEA5NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NDUKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCQljbGllbnQgICAgIAlAOTQ1Ci0JCQkJCXN1cHBsaWVyICAgCUA5MzgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUwNSwgMTUwMykKLQkJCQkJICAgICgxMTMsIDE1MDMpCi0JCQkJCSAgICAoMTEzLCAxMjU1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMsIDEyNTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY3NjgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNiIgQDk1MAotCQkJCWxvY2F0aW9uICAgCSg2NiwgMjQ0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQzMxMDM1NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE3IiBAOTUxCi0JCQkJCVBhcmVudF9WaWV3IAlAOTUwCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzMxIgotCQkJCQljbGllbnQgICAgIAlAOTUwCi0JCQkJCXN1cHBsaWVyICAgCUA5MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjYsIDI0NCkKLQkJCQkJICAgICg2NiwgMTQ0KQotCQkJCQkgICAgKDg2NiwgMTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE0NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDk1MgotCQkJCQlQYXJlbnRfVmlldyAJQDk1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNjgxMTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTk5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzM0IiCi0JCQkJCWNsaWVudCAgICAgCUA5NTAKLQkJCQkJc3VwcGxpZXIgICAJQDkzOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2LCAxMTQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAxODQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMTMKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY2NTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3ODBCRDkwMDU5IgotCQkJCWNsaWVudCAgICAgCUA5MDkKLQkJCQlzdXBwbGllciAgIAlAOTIzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU5LCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTI0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAODkxCi0JCQkJc3VwcGxpZXIgICAJQDg4MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQwMCwgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NTcKLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgODM3KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4ODUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEwMTIsIDgzNykKLQkJCQkgICAgKDEwMTIsIDcyNykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1OAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDk1OQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MSwgODcxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODg4MTU4Ci0JCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0RTIwMzY2IgotCQkJCWNsaWVudCAgICAgCUA4OTEKLQkJCQlzdXBwbGllciAgIAlAODg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzNywgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzNywgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjAKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5NjEKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5MCwgODY1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTgxNjMzCi0JCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0QkEwMjNDIgotCQkJCWNsaWVudCAgICAgCUA5MTAKLQkJCQlzdXBwbGllciAgIAlAODg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI1LCA5MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDkxNQotCQkJCXN1cHBsaWVyICAgCUA5MTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI4LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjgsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjApKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJcXVpZCAgICAgICAJIjNCOUY4Rjc2MDJDNyIKLQkJCXRpdGxlICAgICAgCSI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA5NjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCAxNDQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxMzYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxNDI3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkzODIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZm9ybSA6IFhTREZvcm0iCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGb3JtIiBAOTY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NjAsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZvcm0iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzE1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOUY5MTNCMDFFQiIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5NjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMTA1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDYKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudCA6IERPTUVsZW1lbnQiKSkKLQkJCQl3aWR0aCAgICAgIAk2NzUKLQkJCQloZWlnaHQgICAgIAkxNDMKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA5NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAzODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NywgMzM1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA5NjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgOTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjc4LCA4OTQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJCXdpZHRoICAgICAgCTQ3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDk2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDE0MDgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDEzNTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDk2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NjQsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA1NzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI1NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NzAKLQkJCQlsb2NhdGlvbiAgIAkoODUwLCA1MzcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoODUwLCA1MzcpCi0JCQkJICAgICg4NTAsIDQ0NykpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01FbGVtZW50IiBAOTcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyNDgsIDEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRWxlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNCODE4OTc5MDIwMCIKLQkJCQl3aWR0aCAgICAgIAk3NjkKLQkJCQloZWlnaHQgICAgIAkyMDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNjQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNTg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNTEyCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDk3MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDMzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTc0Ci0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjYzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NjUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDM2OCwgMjYzKQotCQkJCSAgICAoMzY4LCAxNjcpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA5NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTM0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEyOTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDE0MDcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHN1YnN0aXR1dGlvbiIKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgYWxsIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBAOTc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3MDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNjU4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzY4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTE5OAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyBhbGwiKSkKLQkJCQl3aWR0aCAgICAgIAk1NTAKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA5NzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjEwMCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjMKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk3NzgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA5NzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDk3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTQ0LCAyMDE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxOTMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxODgyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQl3aWR0aCAgICAgIAkzODIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTI3OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTMzOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdXNlIDogWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTY0MAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIgQDk4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2MzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTQ4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNDk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCQTdCMEU4MDFBOCIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDk4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjA4LCA5MjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0OTgsIDg4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCQl3aWR0aCAgICAgIAkyMzgKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA5ODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQwLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTk2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2OTEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJOTM0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJOTg0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAOTg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTA5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDExNTYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODUyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJOTA2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDk4NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MjIsIDc3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk5OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTEwMTQKLQkJCQloZWlnaHQgICAgIAk0ODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAOTg2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgOTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNywgOTA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA5ODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA2NTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDYwMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDY2OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA5ODgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAxOTQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDIwMDIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJODIyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRENvbXBsZXhGaW5hbCIKLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIisgbWl4ZWQgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODc4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAOTg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0ODgsIDE2OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDE2NDYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAOTg5Ci0JCQkJc3VwcGxpZXIgICAJQDk2OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDYsIDE2MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDYsIDE0NzIpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAOTkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyMDgsIDcwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNTk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTkwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTkxOAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlAOTgyCi0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2OTYsIDg2OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NiwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDk4MwotCQkJCXN1cHBsaWVyICAgCUA5NjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDk0LCAxNjE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk0LCAxNTMzKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTk0Ci0JCQkJbG9jYXRpb24gICAJKDE0ODcsIDE4NTYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk4OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ4NywgMTg1NikKLQkJCQkgICAgKDE0ODcsIDE3NjApKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NQXR0ciIgQDk5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAwLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDM1MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NQXR0ciIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDMwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JCRjhDODkwMUI2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlAOTg4Ci0JCQkJc3VwcGxpZXIgICAJQDk4OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzQsIDE5MzApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MzQsIDE4NTYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSIKLQkJCQljbGllbnQgICAgIAlAOTg3Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDU4OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiCi0JCQkJY2xpZW50ICAgICAJQDk5MQotCQkJCXN1cHBsaWVyICAgCUA5NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTkwLCA1ODYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTk5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA5NzIKLQkJCQlzdXBwbGllciAgIAlAOTczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyLCA1NzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMiwgNDQ3KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIgotCQkJCWNsaWVudCAgICAgCUA5NzMKLQkJCQlzdXBwbGllciAgIAlAOTY1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwLCAzMjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MCwgMjYzKQotCQkJCWRyYXdTdXBwbGllciAJQDk3NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCWNsaWVudCAgICAgCUA5ODYKLQkJCQlzdXBwbGllciAgIAlAOTcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzLCA4OTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMywgNzA4KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCWNsaWVudCAgICAgCUA5ODQKLQkJCQlzdXBwbGllciAgIAlAOTgyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwMCwgMTA4NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMCwgOTg3KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRG9jdW1lbnQiIEAxMDAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDk0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Eb2N1bWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg1MEUwMzgxIgotCQkJCXdpZHRoICAgICAgCTc3NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMDQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiCi0JCQkJY2xpZW50ICAgICAJQDk2NgotCQkJCXN1cHBsaWVyICAgCUA5NjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDMyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCAyNjMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTc0KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAMTAwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzNTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciCi0JCQkJd2lkdGggICAgICAJNjg2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwNgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAOTY5Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1MCwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlAOTgwCi0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMTI2NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTcwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJY2xpZW50ICAgICAJQDk2NwotCQkJCXN1cHBsaWVyICAgCUA5NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjk0LCA4ODApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTQsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTg1Ci0JCQkJc3VwcGxpZXIgICAJQDk2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgNzY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDY4NykpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMTAKLQkJCQlsb2NhdGlvbiAgIAkoMTcwMywgMTI5MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTY3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzAzLCAxMjkwKQotCQkJCSAgICAoMTcwMywgMTAwOCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDk2OAotCQkJCXN1cHBsaWVyICAgCUA5NjcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAzLCAxMzQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjkwKQotCQkJCWRyYXdTdXBwbGllciAJQDEwMTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAxMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQljbGllbnQgICAgIAlAOTYzCi0JCQkJc3VwcGxpZXIgICAJQDk2NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEzNDcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDEyOTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAxMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDEzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA5NzcKLQkJCQlzdXBwbGllciAgIAlAOTg5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MywgMjAyOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MywgMTg1NikKLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTQpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI4LiBDb25jcmV0ZSBDb250YWlubWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBODA5NzAyN0EiCi0JCQl0aXRsZSAgICAgIAkiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDEwMTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjcyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDM5LCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAMTAxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NDAsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzEsIDUzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDEwMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDEzLCA3NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDEwMTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA1MzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIKLQkJCQl3aWR0aCAgICAgIAk0MzgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAxOAotCQkJCWxvY2F0aW9uICAgCSgxOTQzLCA4NjgpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMTcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5NDMsIDg2OCkKLQkJCQkgICAgKDE5NDMsIDYzMSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzIiIEAxMDE5Ci0JCQkJbG9jYXRpb24gICAJKDIxMjUsIDY4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MyIgQDEwMjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQUQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDE5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDE2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA3MjkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NSwgNjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCQljbGllbnQgICAgIAlAMTAxOQotCQkJCQlzdXBwbGllciAgIAlAMTAxNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY3LCA2NzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMTAyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4LCAyNzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAyNQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTAyNAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjcyLCA0NjUpCi0JCQkJICAgICgyNzIsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEwMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM3MiwgMTEyMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTg3Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDEwMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDU3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzUyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYwIiBAMTAyOAotCQkJCWxvY2F0aW9uICAgCSgxMTcwLCAxMzU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDEwMjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNDA0NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMjgKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3MCwgMTM1NikKLQkJCQkJICAgICgyMDYsIDEzNTYpCi0JCQkJCSAgICAoMjA2LCA2MzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNiwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1OTE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYxIiBAMTAzMgotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjgKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNTIxLCAxMzk4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDI4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDI2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzAsIDEzNTYpCi0JCQkJCSAgICAoMjczMSwgMTM1NikKLQkJCQkJICAgICgyNzMxLCAxMjI3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzMxLCAxMjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEwMzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAsIDE2OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU0IiBAMTAzNQotCQkJCWxvY2F0aW9uICAgCSgxMjIsIDExMzYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTUiIEAxMDM2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDI3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDYzMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAzNwotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzUKLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMywgMTUxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAyNSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzUKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgMTY0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODExODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAMTA0MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQl3aWR0aCAgICAgIAk1MTMKLQkJCQloZWlnaHQgICAgIAkxMDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjYiIEAxMDQxCi0JCQkJbG9jYXRpb24gICAJKDQ3LCA4ODUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MTUwMTE5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjciIEAxMDQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0MQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDEKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTY0MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDQzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0MQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjE4NTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTk1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQxCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDEzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgsIDE5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3ODgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDEwNDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNjMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMDQ3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk2IiBAMTA0OAotCQkJCWxvY2F0aW9uICAgCSgxMzE5LCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkYxREU5MDE4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTciIEAxMDQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTU3LCAtMTAyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM2QyIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDgKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTA1MAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDgKLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzMxNzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIgotCQkJCQljbGllbnQgICAgIAlAMTA0OAotCQkJCQlzdXBwbGllciAgIAlAMTA0NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDEwMzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTUsIDE2NTUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEwNTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkyIiBAMTA1NQotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkzIiBAMTA1NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTUKLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDU0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTEsIDE4NDApCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkKLQkJCQkJICAgICgxMjk0LCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk0LCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxODA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI2NTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0M4IgotCQkJCQljbGllbnQgICAgIAlAMTA1NQotCQkJCQlzdXBwbGllciAgIAlAMTA1NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzUxLCAxODQwKQotCQkJCQkgICAgKDE0MDksIDE4NDApCi0JCQkJCSAgICAoMTQwOSwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTc1MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MSwgMTgwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcyODQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc2IiBAMTA2MAotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2MAotCQkJCQlsb2NhdGlvbiAgIAkoNzc0LCAtMTgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgMTUyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ0OTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEwNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEwNTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQ1NDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc3IiBAMTA2NAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjAKLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMwRSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxMjIzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTQiIEAxMDY2Ci0JCQkJbG9jYXRpb24gICAJKDE2OTAsIDE2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUQwMzc0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldENvbnRlbnRzIiBAMTA2NwotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjYKLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgMTczMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldENvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzIwNTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NiwgMTY4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTY0NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTk0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNzMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEAxMDcwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2NgotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTY2LCAxNjQzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDU0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzNCwgMTY4NCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDEwNzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjI0LCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzg4LCA3NDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEAxMDczCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOCwgMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEwNzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1NywgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc0IiBAMTA3NQotCQkJCWxvY2F0aW9uICAgCSg5NjMsIDMxOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QjAwM0QiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTA3NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzUKLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDM2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgxMDgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCQljbGllbnQgICAgIAlAMTA3NQotCQkJCQlzdXBwbGllciAgIAlAMTA3MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk5LCAzMTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTYsIDI5MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk2Mzk2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzUiIEAxMDc5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA3NQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NSwgMzYxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJCWNsaWVudCAgICAgCUAxMDc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDc0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgyOCwgMzE5KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDEwODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA5OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc0LCA5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwODIKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMiwgMTU5MykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA4MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjMyMiwgMTU5MykKLQkJCQkgICAgKDIzMjIsIDEwNDcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDgzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDYsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2MDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk1Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRjUwMTNBIgotCQkJCWNsaWVudCAgICAgCUAxMDgxCi0JCQkJc3VwcGxpZXIgICAJQDEwMTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTUwLCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTAsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDE4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMDg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA1NzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDUzMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTY2MgotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMCIgQDEwODYKLQkJCQlsb2NhdGlvbiAgIAkoMTQ5OCwgMTQzMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNDAxQUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTA4NwotCQkJCQlQYXJlbnRfVmlldyAJQDEwODYKLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDI3LCAxNDcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQzODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMDg2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDgxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0OTgsIDE0MzEpCi0JCQkJCSAgICAoMjI4MSwgMTQzMSkKLQkJCQkJICAgICgyMjgxLCAxMDQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjgxLCAxMDQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjA0LCAxMzk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDU0MTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMSIgQDEwOTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgODY2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDg2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDg1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0OTgsIDE0MzEpCi0JCQkJCSAgICAoMTEzMSwgMTQzMSkKLQkJCQkJICAgICgxMTMxLCA2MzIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzEsIDYzMikpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBAMTA5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY1NSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBAMTA5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgODk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA1LCA4NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI0IiBAMTA5NAotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDczNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBAMTA5NQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTQKLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIwLCA3NDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExMTExMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDk0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgODQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1OTUsIDgwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc1OTI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjUiIEAxMDk4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA5NAotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDY1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCQljbGllbnQgICAgIAlAMTA5NAotCQkJCQlzdXBwbGllciAgIAlAMTA4NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDYzMikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ0IiBAMTEwMAotCQkJCWxvY2F0aW9uICAgCSg5MDAsIDEwMzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDExMDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTAwCi0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEzLCAxMDQyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMyODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCQljbGllbnQgICAgIAlAMTEwMAotCQkJCQlzdXBwbGllciAgIAlAMTA5MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDEwNDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTg5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ1IiBAMTEwNAotCQkJCQlQYXJlbnRfVmlldyAJQDExMDAKLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgOTY4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTAwCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDk1MSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ2IiBAMTEwNgotCQkJCWxvY2F0aW9uICAgCSg3MDAsIDEwMzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEAxMTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNgotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDEwMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTQ3OTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTg1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJCWNsaWVudCAgICAgCUAxMTA2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDkyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3MSwgMTA0MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMDc3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEAxMTEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNgotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTksIDk2OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1IgotCQkJCQljbGllbnQgICAgIAlAMTEwNgotCQkJCQlzdXBwbGllciAgIAlAMTA5MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCA5NTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDExMTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDE0NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDAsIDEzOTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTEzCi0JCQkJbG9jYXRpb24gICAJKDU1MCwgMTU5MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTExMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNTUwLCAxNTkwKQotCQkJCSAgICAoNTUwLCAxNDk1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDExMTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQwLCA1MzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQl3aWR0aCAgICAgIAk1NDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTE1Ci0JCQkJbG9jYXRpb24gICAJKDE0MDYsIDc2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTExNAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQwNiwgNzY1KQotCQkJCSAgICAoMTQwNiwgNjMxKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDExMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5MywgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMiIgQDExMTcKLQkJCQlsb2NhdGlvbiAgIAkoMTYxNCwgMTg2OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZGRERENzAxMTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMyIgQDExMTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTE3Ci0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTE3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTQsIDE4NjgpCi0JCQkJCSAgICAoMjUwMCwgMTg2OCkKLQkJCQkJICAgICgyNTAwLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAwLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDExMTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTE3Ci0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxNzg3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTg3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQkJY2xpZW50ICAgICAJQDExMTcKLQkJCQkJc3VwcGxpZXIgICAJQDExMTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkKLQkJCQkJICAgICg5ODQsIDE4NjgpCi0JCQkJCSAgICAoOTg0LCAxNDk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODQsIDE0OTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDE4MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3MTI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDgiIEAxMTIyCi0JCQkJbG9jYXRpb24gICAJKDI5MjcsIDM4NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzNjAzODYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUNvbnRlbnRzIiBAMTEyMwotCQkJCQlQYXJlbnRfVmlldyAJQDExMjIKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAzNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlQ29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3MzA2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3QyIKLQkJCQkJY2xpZW50ICAgICAJQDExMjIKLQkJCQkJc3VwcGxpZXIgICAJQDExMTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjkyNywgMzg3KQotCQkJCQkgICAgKDE3NTAsIDM4NykKLQkJCQkJICAgICgxNzUwLCA1MjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNTIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODA0LCA0MjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzI0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA5IiBAMTEyNgotCQkJCQlQYXJlbnRfVmlldyAJQDExMjIKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOTQ2LCAxNDQ4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTIyCi0JCQkJCXN1cHBsaWVyICAgCUAxMTE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDI5MjcsIDM4NykKLQkJCQkJICAgICgyOTg3LCAzODcpCi0JCQkJCSAgICAoMjk4NywgMTY3MSkKLQkJCQkJICAgICgyOTI4LCAxNjcxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDE2NzEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDExMjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg0IiBAMTEyOQotCQkJCWxvY2F0aW9uICAgCSgxNzUwLCA4NzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNEUwMDY3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDExMzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgNjkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTEwMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMkE1IgotCQkJCQljbGllbnQgICAgIAlAMTEyOQotCQkJCQlzdXBwbGllciAgIAlAMTExNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE0LCA2OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNDQ0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODUiIEAxMTMzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyOQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDksIDEwNjUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDI5QiIKLQkJCQkJY2xpZW50ICAgICAJQDExMjkKLQkJCQkJc3VwcGxpZXIgICAJQDExMjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDExMTMpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTEzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE2IiBAMTEzNgotCQkJCWxvY2F0aW9uICAgCSgxMjUyLCAxODk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRUJEQzg3MDI0NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE3IiBAMTEzNwotCQkJCQlQYXJlbnRfVmlldyAJQDExMzYKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAyRjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMTM2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNTIsIDE4OTYpCi0JCQkJCSAgICAoMjYwMywgMTg5NikKLQkJCQkJICAgICgyNjAzLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAzLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTEzOAotCQkJCQlQYXJlbnRfVmlldyAJQDExMzYKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjgyLCAxODU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzgxMTQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCQljbGllbnQgICAgIAlAMTEzNgotCQkJCQlzdXBwbGllciAgIAlAMTEzNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjUyLCAxODk2KQotCQkJCQkgICAgKDQyOCwgMTg5NikKLQkJCQkJICAgICg0MjgsIDEyMjMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQyOCwgMTIyMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgyLCAxODYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzUwMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODgiIEAxMTQxCi0JCQkJbG9jYXRpb24gICAJKDExOTksIDEzMjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEMzIwMjIwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4OSIgQDExNDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTQxCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEMiCi0JCQkJCWNsaWVudCAgICAgCUAxMTQxCi0JCQkJCXN1cHBsaWVyICAgCUAxMTI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoMTg5NywgMTMyMSkKLQkJCQkJICAgICgxODk3LCAxMjIzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk3LCAxMjIzKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTE0MwotCQkJCQlQYXJlbnRfVmlldyAJQDExNDEKLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk1NjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEQiCi0JCQkJCWNsaWVudCAgICAgCUAxMTQxCi0JCQkJCXN1cHBsaWVyICAgCUAxMTM1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoNTAwLCAxMzIxKQotCQkJCQkgICAgKDUwMCwgMTIyMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxMjIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MjMwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDExMTYKLQkJCQlzdXBwbGllciAgIAlAMTA4MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDYsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDYsIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA4MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ3Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE0OAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgNDk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDQ2NDI5Ci0JCQkJICAgIGhlaWdodCAgICAgCTYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDEwODUKLQkJCQlzdXBwbGllciAgIAlAMTAyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTMsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDI1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEwNTQKLQkJCQlzdXBwbGllciAgIAlAMTA4MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDksIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA4MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUwCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgMTU5MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk4MDM5MgotCQkJCSAgICBoZWlnaHQgICAgIAkzODUKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJY2xpZW50ICAgICAJQDEwNTQKLQkJCQlzdXBwbGllciAgIAlAMTExMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDQsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDQsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTExMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUAxMDI3Ci0JCQkJc3VwcGxpZXIgICAJQDEwMjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAyNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTE1MwotCQkJCWxvY2F0aW9uICAgCSg0MzEsIDIyMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA0MAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDMxLCAyMjIpCi0JCQkJICAgICg0MzEsIDEzMCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTQKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU1Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYxLCAyMjQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NzY3NDQKLQkJCQkgICAgaGVpZ2h0ICAgICAJODYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI0NDAwNjkiCi0JCQkJY2xpZW50ICAgICAJQDEwMjQKLQkJCQlzdXBwbGllciAgIAlAMTA0MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3NSwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUsIDIyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTUzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTU2Ci0JCQkJbG9jYXRpb24gICAJKDEzMDksIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA3MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTMwOSwgNDY1KQotCQkJCSAgICAoMTMwOSwgMzc1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1NwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTgKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDEsIDQ5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NDI4NgotCQkJCSAgICBoZWlnaHQgICAgIAkxMAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTY2MDMzOSIKLQkJCQljbGllbnQgICAgIAlAMTA4NQotCQkJCXN1cHBsaWVyICAgCUAxMDczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCA1MjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzMSwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExNTYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyIKLQkJCQljbGllbnQgICAgIAlAMTAzNAotCQkJCXN1cHBsaWVyICAgCUAxMTEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjUwLCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTExMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTYwCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE2MQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDUsIDQ5MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk1ODMzMwotCQkJCSAgICBoZWlnaHQgICAgIAk4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjEwM0JFIgotCQkJCWNsaWVudCAgICAgCUAxMDQ3Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE1NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTYyCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE2MwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MAotCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkVCMDJBOCIKLQkJCQljbGllbnQgICAgIAlAMTEyOAotCQkJCXN1cHBsaWVyICAgCUAxMDE3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg3OCwgMTExMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3OCwgODY4KQotCQkJCWRyYXdTdXBwbGllciAJQDEwMTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2NAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNjUKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAzQTAyMjEiCi0JCQkJY2xpZW50ICAgICAJQDExMjgKLQkJCQlzdXBwbGllciAgIAlAMTExNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDMsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTE1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY3Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NCwgODAxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIgotCQkJCWNsaWVudCAgICAgCUAxMDQ2Ci0JCQkJc3VwcGxpZXIgICAJQDExMTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODQsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTE1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJY2xpZW50ICAgICAJQDEwMTYKLQkJCQlzdXBwbGllciAgIAlAMTA3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyODQsIDc2MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3OSwgNzYyKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTY5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUAxMDE1Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDEwNzIKLQkJCQlzdXBwbGllciAgIAlAMTAxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDcyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTcxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCWNsaWVudCAgICAgCUAxMDE3Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUwLCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNzIKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTczCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyMSwgODk3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDg3NzE5Ci0JCQkJICAgIGhlaWdodCAgICAgCTc2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNEYwMjNDIgotCQkJCWNsaWVudCAgICAgCUAxMDE0Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODk2LCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4OTYsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNzQKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc1Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMxMywgOTA0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODUwNjIyCi0JCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRTIwMzgxIgotCQkJCWNsaWVudCAgICAgCUAxMDI2Ci0JCQkJc3VwcGxpZXIgICAJQDEwMTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzgxLCAxMTA5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzgxLCA4NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAxOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTc2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE3NwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4NzgsIDI2OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NjY2NwotCQkJCSAgICBoZWlnaHQgICAgIAk2NgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjU1MDM4NSIKLQkJCQljbGllbnQgICAgIAlAMTAyNgotCQkJCXN1cHBsaWVyICAgCUAxMDQwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk0MywgMTEwOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk0MywgMjIyKQotCQkJCWRyYXdTdXBwbGllciAJQDExNTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE3OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQljbGllbnQgICAgIAlAMTEzNQotCQkJCXN1cHBsaWVyICAgCUAxMDI0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDYyLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjIsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDI1KSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIgotCQkJcXVpZCAgICAgICAJIjNDMjVFQjdBMDM4QyIKLQkJCXRpdGxlICAgICAgCSI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTE3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNiIgQDExODAKLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI3IiBAMTE4MQotCQkJCQlQYXJlbnRfVmlldyAJQDExODAKLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMkY3IgotCQkJCQljbGllbnQgICAgIAlAMTE4MAotCQkJCQlzdXBwbGllciAgIAlAMTE3OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjgsIDE2OTUpCi0JCQkJCSAgICAoMTc1LCAxNjk1KQotCQkJCQkgICAgKDE3NSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExODMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTgwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMjksIDE3NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDMwQiIKLQkJCQkJY2xpZW50ICAgICAJQDExODAKLQkJCQkJc3VwcGxpZXIgICAJQDExNzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjI4LCAxNjk1KQotCQkJCQkgICAgKDI4MSwgMTY5NSkKLQkJCQkJICAgICgyODEsIDE1OTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxLCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjksIDE2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYyIiBAMTE4NwotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjMiIEAxMTg4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg2MCwgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCQljbGllbnQgICAgIAlAMTE4NwotCQkJCQlzdXBwbGllciAgIAlAMTE4NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE2OTgpCi0JCQkJCSAgICAoOTAxLCAxNjk4KQotCQkJCQkgICAgKDkwMSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTE5MAotCQkJCQlQYXJlbnRfVmlldyAJQDExODcKLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDIwLCAxNzM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM5RSIKLQkJCQkJY2xpZW50ICAgICAJQDExODcKLQkJCQkJc3VwcGxpZXIgICAJQDExODYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTUyLCAxNjk4KQotCQkJCQkgICAgKDEwMDQsIDE2OTgpCi0JCQkJCSAgICAoMTAwNCwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA0LCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDE2NDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDIwLCA5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDExOTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDc1Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDExOTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDQxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NiwgMjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNDA2Ci0JCQkJaGVpZ2h0ICAgICAJMjg3Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyNiIgQDExOTYKLQkJCQlsb2NhdGlvbiAgIAkoMTMwMywgNjc5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAMTE5NwotCQkJCQlQYXJlbnRfVmlldyAJQDExOTYKLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAwMzg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCQljbGllbnQgICAgIAlAMTE5NgotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzAzLCA2NzkpCi0JCQkJCSAgICAoMTMwMywgNDE5KQotCQkJCQkgICAgKDg0MywgNDE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkwNzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjciIEAxMjAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5NgotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDExOTYKLQkJCQkJc3VwcGxpZXIgICAJQDExOTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMwMywgNjc5KQotCQkJCQkgICAgKDEzMDMsIDk5NykKLQkJCQkJICAgICg5MDEsIDk5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDk5NykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI0IiBAMTIwMgotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDEyMDMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAyCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM4LCA1MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMTkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDIKLQkJCQkJc3VwcGxpZXIgICAJQDExOTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQotCQkJCQkgICAgKDEyMTYsIDUzNCkKLQkJCQkJICAgICg4NDMsIDUzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDUzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTI2LCA1NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMTY0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI1IiBAMTIwNgotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDIKLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgNzU2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjAyCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTYsIDY0OSkKLQkJCQkJICAgICgxMjE2LCA3OTcpCi0JCQkJCSAgICAoODc3LCA3OTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA3OTcpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMCIgQDEyMDgKLQkJCQlsb2NhdGlvbiAgIAkoNjYyLCA2NDIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMjA5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIwOAotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDY3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjE2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzEiCi0JCQkJCWNsaWVudCAgICAgCUAxMjA4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTk0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNzI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDMwNjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzEiIEAxMjEyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwOAotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjEsIDU3NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcwIgotCQkJCQljbGllbnQgICAgIAlAMTIwOAotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDU1OSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMyIiBAMTIxNAotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMzIiBAMTIxNQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTQKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDFFIgotCQkJCQljbGllbnQgICAgIAlAMTIxNAotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NSwgMTg4KQotCQkJCQkgICAgKDc1LCAxMjgpCi0JCQkJCSAgICAoNTEwLCAxMjgpCi0JCQkJCSAgICAoNTEwLCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMjE2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIxNAotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VmVyc2lvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMjgiCi0JCQkJCWNsaWVudCAgICAgCUAxMjE0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc1LCAxODgpCi0JCQkJCSAgICAoNzUsIDM4MCkKLQkJCQkJICAgICg0MzcsIDM4MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAzODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMzI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM0IiBAMTIxOQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAxMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEIwMTFCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzUiIEAxMjIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxOQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyMSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMTkKLQkJCQkJc3VwcGxpZXIgICAJQDExOTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2NiwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTIyMQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTkKLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2NCwgOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JpZ2luYWxWZXJzaW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCQljbGllbnQgICAgIAlAMTIxOQotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAxMzQpCi0JCQkJCSAgICAoMTMyMiwgMTM0KQotCQkJCQkgICAgKDEzMjIsIDMzNCkKLQkJCQkJICAgICg4NDMsIDMzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODEwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzYiIEAxMjI0Ci0JCQkJbG9jYXRpb24gICAJKDEyNiwgNjU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFRUFCMDAxRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM3IiBAMTIyNQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjQKLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDUxMywgNjU2KQotCQkJCQkgICAgKDUxMywgNTU5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIgQDEyMjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDM5MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDY2LCA2NTYpCi0JCQkJCSAgICAoNjYsIDQ3MikKLQkJCQkJICAgICg0MzcsIDQ3MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgNDcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTYsIDUyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY4NDY4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MCIgQDEyMjkKLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDEiIEAxMjMwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyOQotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCQljbGllbnQgICAgIAlAMTIyOQotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2NDIsIDEyNikKLQkJCQkJICAgICg1ODgsIDEyNikKLQkJCQkJICAgICg1ODgsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hRm9yU2NoZW1hIiBAMTIzMQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjkKLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYUZvclNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1NTU1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGQiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjkKLQkJCQkJc3VwcGxpZXIgICAJQDExOTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjQyLCAxMjYpCi0JCQkJCSAgICAoNjk3LCAxMjYpCi0JCQkJCSAgICAoNjk3LCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OTcsIDI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAyMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMTg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyMzQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDExOTMKLQkJCQlzdXBwbGllciAgIAlAMTE5NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzgsIDg0MykpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTIzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0OTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODAiIEAxMjM2Ci0JCQkJbG9jYXRpb24gICAJKDIzNCwgMTM0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2QjAxOTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgxIiBAMTIzNwotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzYKLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMwOSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzYKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDE4MSwgMTM0MCkKLQkJCQkJICAgICgxODEsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxLCAxMjM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyMzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjM2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMzLCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjg2NzkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMxMyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzYKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDI4NywgMTM0MCkKLQkJCQkJICAgICgyODcsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg3LCAxMjM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDEyOTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0Mjk0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEyNDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYwLCAxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDEyNDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTI0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTQiIEAxMjQ0Ci0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxNSIgQDEyNDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ0Ci0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDEwRiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNDQKLQkJCQkJc3VwcGxpZXIgICAJQDEyNDIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY0ZhY2V0cyIgQDEyNDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ0Ci0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNDYxNTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIgotCQkJCQljbGllbnQgICAgIAlAMTI0NAotCQkJCQlzdXBwbGllciAgIAlAMTI0MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMzYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjI1LCAzMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEyNDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMjUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgNjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgNTk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxNiIgQDEyNTEKLQkJCQlsb2NhdGlvbiAgIAkoMTUwOCwgNzkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQzMDI4RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzE3IiBAMTI1MgotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTEKLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjUxCi0JCQkJCXN1cHBsaWVyICAgCUAxMjUwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA2OTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyNTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUxCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDc2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRkQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjUxCi0JCQkJCXN1cHBsaWVyICAgCUAxMjQ5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NTQsIDgyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk1MDYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkyIiBAMTI1NwotCQkJCWxvY2F0aW9uICAgCSg5MTksIDEzNDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNUUwMUY5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MyIgQDEyNTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDQ2IgotCQkJCQljbGllbnQgICAgIAlAMTI1NwotCQkJCQlzdXBwbGllciAgIAlAMTI1NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoODY2LCAxMzQ5KQotCQkJCQkgICAgKDg2NiwgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDEyMzkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk5MywgMTM5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzc3MzU4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDUwIgotCQkJCQljbGllbnQgICAgIAlAMTI1NwotCQkJCQlzdXBwbGllciAgIAlAMTI1NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoOTczLCAxMzQ5KQotCQkJCQkgICAgKDk3MywgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzMsIDEyMzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMTI5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAxNDkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEyNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTgiIEAxMjY0Ci0JCQkJbG9jYXRpb24gICAJKDIwMjUsIDc5MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREOTAxRjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxOSIgQDEyNjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY0Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0IgotCQkJCQljbGllbnQgICAgIAlAMTI2NAotCQkJCQlzdXBwbGllciAgIAlAMTI1MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgNjk1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI2NAotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjY3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA4MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjY0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjYzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwOTgsIDg0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MTczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMyMCIgQDEyNjkKLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyMSIgQDEyNzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE3IgotCQkJCQljbGllbnQgICAgIAlAMTI2OQotCQkJCQlzdXBwbGllciAgIAlAMTI1NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyNzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzM1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEyNjkKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTc1NCwgMTE3OCkKLQkJCQkJICAgICgyMDI4LCAxMTc4KQotCQkJCQkgICAgKDIwMjgsIDk5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM2NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEwLiBEaWFnbm9zdGljcyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNUYwODAzRTIiCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEAxMjc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJCXdpZHRoICAgICAgCTY4NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljU2V2ZXJpdHkiIEAxMjc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDY1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNTQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY4QTcwMzJGIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1OSwgNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODk2LCAxMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDY0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk3MzEKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyNzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NCwgNDAyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTQzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjIiIEAxMjc5Ci0JCQkJbG9jYXRpb24gICAJKDE0NCwgMjgzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2NDMxMDM1RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIzIiBAMTI4MAotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzkKLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNzkKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAxNzYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbGxEaWFnbm9zdGljcyIgQDEyODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjc5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYWxsRGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0ODU5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJCWNsaWVudCAgICAgCUAxMjc5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE4IiBAMTI4NAotCQkJCWxvY2F0aW9uICAgCSgxMDI4LCA0NDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMjcwM0NEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEAxMjg1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI4NAotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQkJY2xpZW50ICAgICAJQDEyODQKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcxMywgNDQwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzOCwgMjMwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBvbmVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjg0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwMjgsIDQ0MCkKLQkJCQkJICAgICgxMDg4LCA0NDApCi0JCQkJCSAgICAoMTA4OCwgMTc0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODgsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIwIiBAMTI4OQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDI4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMSIgQDEyOTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCQljbGllbnQgICAgIAlAMTI4OQotCQkJCQlzdXBwbGllciAgIAlAMTI3NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDE3NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRpYWdub3N0aWNzIiBAMTI5MQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODkKLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MjYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjciCi0JCQkJCWNsaWVudCAgICAgCUAxMjg5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDk0NzM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI5NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEMwRjRDMDFBMSIKLQkJCQljbGllbnQgICAgIAlAMTI3OAotCQkJCXN1cHBsaWVyICAgCUAxMjc3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAzOTApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjExLiBTdXBwbGVtZW50YWwiCi0JCQlxdWlkICAgICAgIAkiM0MyODdFNDkwMTlCIgotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk4NTIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjk2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDg4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDgyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNzgwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ0IiBAMTI5OQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1hcnlDb21wb25lbnQiIEAxMzAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI5OQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWFyeUNvbXBvbmVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQwODI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEzIgotCQkJCQljbGllbnQgICAgIAlAMTI5OQotCQkJCQlzdXBwbGllciAgIAlAMTI5NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTcyNjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NSIgQDEzMDMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjk5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMiIKLQkJCQkJY2xpZW50ICAgICAJQDEyOTkKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEzMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDY2NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk3MjIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiIKLQkJCQkJIisgY2lyY3VsYXIgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNzgyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTMwNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDEwNzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIzCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyIKLQkJCQkJIisgZWZmZWN0aXZlVmFsdWUgOiBWYWx1ZSIpKQotCQkJCXdpZHRoICAgICAgCTQ1OAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEzMDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA1NjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDYyOCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjkKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODIwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMTMwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDI4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDE1OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAyMjUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTM1NgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBhbGlhc05hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHVSSSA6IFN0cmluZyIKLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciCi0JCQkJCSIrIHFOYW1lIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDcyCi0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTMwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDM1MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCAyOTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMzEwCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTEwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgzMjAsIDUxMCkKLQkJCQkgICAgKDMyMCwgNDIwKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTMxMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQljbGllbnQgICAgIAlAMTMwNwotCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMzEwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzMTIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDEyOTUKLQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg3NywgNzQ4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMzEwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDEzMTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxODA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMSwgMTc2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDU2Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBAMTMxNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTc3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNzI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQl3aWR0aCAgICAgIAk0OTMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEAxMzE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE4ODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIgotCQkJCXdpZHRoICAgICAgCTQ5MwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDEzMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAxOTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MywgMTkxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEAxMzE3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzQsIDEzNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDEzMTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2MywgMTIxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCXdpZHRoICAgICAgCTM5NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEAxMzE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCAxMzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDEzNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAkzODAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBAMTMyMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTIzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5LCAxMTc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJd2lkdGggICAgICAJNDAwCi0JCQkJaGVpZ2h0ICAgICAJMTMyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBAMTMyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE2MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE2MDMpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MwotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIgotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDEzMjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyMjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjIzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCXdpZHRoICAgICAgCTQ1NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTMyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDI2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc0LCAyNTcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEAxMzI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMjEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOTYsIDIwNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDEzMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgMjA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQl3aWR0aCAgICAgIAk0NTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEAxMzI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAyMjcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDIyMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDEzMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE1ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTUwNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTU3MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEAxMzI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjQ2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMTEsIDI0MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDEzMjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOSwgMjM5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEAxMzMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDI1NTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEzMzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NjcsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMzMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDEwMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEzMzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTM2NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk1OTQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU2IiBAMTMzNAotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTMzNQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzQKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTgwLCAxMTczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTMuMjY4MjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEREIgotCQkJCQljbGllbnQgICAgIAlAMTMzNAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDQ2LCAxMjE4KQotCQkJCQkgICAgKDE0ODcsIDEyMTgpCi0JCQkJCSAgICAoMTQ4NywgMTI5MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTI5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTI1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE4NDIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU3IiBAMTMzOAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzQKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBFNyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkKLQkJCQkJICAgICgxNDA1LCAxMjE4KQotCQkJCQkgICAgKDE0MDUsIDEyOTIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDUsIDEyOTIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MCIgQDEzMzkKLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MSIgQDEzNDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM5Ci0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDkxIgotCQkJCQljbGllbnQgICAgIAlAMTMzOQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzMzLCAxNTc1KQotCQkJCQkgICAgKDE0ODcsIDE1NzUpCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEZhY2V0IiBAMTM0MQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzkKLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgMTU0MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ2MjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCQljbGllbnQgICAgIAlAMTMzOQotCQkJCQlzdXBwbGllciAgIAlAMTMyMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTE1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjIiIEAxMzQ0Ci0JCQkJbG9jYXRpb24gICAJKDE1ODcsIDE3OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUIwMzk2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjMiIEAxMzQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0NAotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5IgotCQkJCQljbGllbnQgICAgIAlAMTM0NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTg3LCAxNzkzKQotCQkJCQkgICAgKDE0NDcsIDE3OTMpCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEluY2x1c2l2ZUZhY2V0IiBAMTM0NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDQKLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTg0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzEzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MiwgMTc5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyMCwgMTc1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NCIgQDEzNDkKLQkJCQlsb2NhdGlvbiAgIAkoOTM3LCAxNzg3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY1IiBAMTM1MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDkKLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMUY5IgotCQkJCQljbGllbnQgICAgIAlAMTM0OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MzcsIDE3ODcpCi0JCQkJCSAgICAoOTk3LCAxNzg3KQotCQkJCQkgICAgKDk5NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzNTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ5Ci0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTIsIDE3NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDIwMyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTc4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAxNzQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM5NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY2IiBAMTM1NAotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjciIEAxMzU1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM1NAotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTM1NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5ODEsIDE5MzcpCi0JCQkJCSAgICAoMTA0MSwgMTkzNykKLQkJCQkJICAgICgxMDQxLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5FeGNsdXNpdmVGYWNldCIgQDEzNTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU0Ci0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIzLCAxOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDEyNTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzU0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ2NjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2OCIgQDEzNTkKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OSwgMTk1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNjAyOEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2OSIgQDEzNjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU5Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMzU5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NjksIDE5NTMpCi0JCQkJCSAgICAoMTQwMCwgMTk1MykKLQkJCQkJICAgICgxNDAwLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RXhjbHVzaXZlRmFjZXQiIEAxMzYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY0LCAxOTUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTYxLCAxOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcwIiBAMTM2NAotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMTgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcxIiBAMTM2NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjQKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMzY0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImxlbmd0aEZhY2V0IiBAMTM2NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjQKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA0LCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2xlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzU0NzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzY0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzI2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMjIsIDIxODApCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkKLQkJCQkJICAgICgzODcsIDIyNDApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjI0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcxLCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU1OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc0IiBAMTM2OQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc1IiBAMTM3MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjkKLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFCIgotCQkJCQljbGllbnQgICAgIAlAMTM2OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbnVtZXJhdGlvbkZhY2V0cyIgQDEzNzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NTg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA4NCwgMTk4OSkKLQkJCQkJICAgICgxMDg0LCAyMDQ5KQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MTI5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzYiIEAxMzc0Ci0JCQkJbG9jYXRpb24gICAJKDE0NTEsIDIwNzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzciIEAxMzc1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM3NAotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NTEsIDIwNzQpCi0JCQkJCSAgICAoMTM2MiwgMjA3NCkKLQkJCQkJICAgICgxMzYyLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGF0dGVybkZhY2V0cyIgQDEzNzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzIyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMDc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTcyLCAyMDM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc4IiBAMTM3OQotCQkJCWxvY2F0aW9uICAgCSgxODI3LCAxNDAwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM4MDJBNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc5IiBAMTM4MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzkKLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFFQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxNDAwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2FyZGluYWxpdHlGYWNldCIgQDEzODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg0NywgMTM1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjYXJkaW5hbGl0eUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzE3MzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNDI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4OCIgQDEzODQKLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQxMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4OSIgQDEzODUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCQljbGllbnQgICAgIAlAMTM4NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTM4NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzODQKLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwOCwgMjU1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzg0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0MTMpCi0JCQkJCSAgICAoMTI2MiwgMjU5NikKLQkJCQkJICAgICgyMDY1LCAyNTk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNTk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTc5LCAyNTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkyIiBAMTM4OQotCQkJCWxvY2F0aW9uICAgCSgxODQxLCAxMzA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEUzMDBEOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkzIiBAMTM5MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzODkKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM4RSIKLQkJCQkJY2xpZW50ICAgICAJQDEzODkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxMzA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYm91bmRlZEZhY2V0IiBAMTM5MQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODkKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMyLCAxMjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2JvdW5kZWRGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzMTc0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM5OCIKLQkJCQkJY2xpZW50ICAgICAJQDEzODkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTQ3MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcyIiBAMTM5NAotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMTg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjczIiBAMTM5NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTQKLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzk0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzOTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzMsIDIyMDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrd2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNzUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzk0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIxODYpCi0JCQkJCSAgICAoMTMyOCwgMjI0NikKLQkJCQkJICAgICgyMDkzLCAyMjQ2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMjQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDMzLCAyMjAzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkwIiBAMTM5OQotCQkJCWxvY2F0aW9uICAgCSg2NzQsIDEzOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwMDQ4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTEiIEAxNDAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTM5OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMzkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JkZXJlZEZhY2V0IiBAMTQwMQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTkKLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTgsIDEzNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JkZXJlZEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjE1MzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzk5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM0NjE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MCIgQDE0MDQKLQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAxMjk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENCMDM5QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgxIiBAMTQwNQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDQKLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTI5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDE0MDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY4LCAxMjU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK251bWVyaWNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QxIgotCQkJCQljbGllbnQgICAgIAlAMTQwNAotCQkJCQlzdXBwbGllciAgIAlAMTMyMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQwLCAxMjk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDYsIDEyNjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTQiIEAxNDA5Ci0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTUiIEAxNDEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNDA5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2ODksIDE2NjIpCi0JCQkJCSAgICAoMTQ4NywgMTY2MikKLQkJCQkJICAgICgxNDg3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4RmFjZXQiIEAxNDExCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2OSwgMTYyMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMTQwOQotCQkJCQlzdXBwbGllciAgIAlAMTMyMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNTM4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTYiIEAxNDE0Ci0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NEYwMTQ1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTciIEAxNDE1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQxNAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCQljbGllbnQgICAgIAlAMTQxNAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxNDE2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQxNAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDIyODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDE0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIyNTgpCi0JCQkJCSAgICAoMTMyOCwgMjMyNCkKLQkJCQkJICAgICgyMDkzLCAyMzI0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMzI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA5LCAyMjkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk4IiBAMTQxOQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzY2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNUM0MDExQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk5IiBAMTQyMAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTkKLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCQljbGllbnQgICAgIAlAMTQxOQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIgQDE0MjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE5Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjU3LCAyNDYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heExlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjY5MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxNDE5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyOTcsIDIzNjYpCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkKLQkJCQkJICAgICgyMTAyLCAyNDk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA3LCAyNDcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAwIiBAMTQyNAotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAxIiBAMTQyNQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjQKLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDEzOCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCIgQDE0MjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODUzMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0NDkpCi0JCQkJCSAgICAoMTI2MiwgMjY2OCkKLQkJCQkJICAgICgyMDY1LCAyNjY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY0ODUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAyIiBAMTQyOQotCQkJCWxvY2F0aW9uICAgCSgxNDIyLCAyMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNkIwMDNBNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAzIiBAMTQzMAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjkKLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQyMiwgMjE1OSkKLQkJCQkJICAgICgxMzYyLCAyMTU5KQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiIEAxNDMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyOQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTkwOTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDI5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzI0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjE1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjExOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNCIgQDE0MzQKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMjA4MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNSIgQDE0MzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM0Ci0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE4NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIgQDE0MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM0Ci0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDIxMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4NjE5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTQzNAotCQkJCQlzdXBwbGllciAgIAlAMTMyNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg0LCAyMDgzKQotCQkJCQkgICAgKDEwODQsIDIxNDMpCi0JCQkJCSAgICAoNDg1LCAyMTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIxNDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgMjEwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTMxNzE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMCIgQDE0MzkKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMSIgQDE0NDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTQzOQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVMZW5ndGhGYWNldCIgQDE0NDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxNzMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIgotCQkJCQljbGllbnQgICAgIAlAMTQzOQotCQkJCQlzdXBwbGllciAgIAlAMTMyNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTIyLCAyMjQxKQotCQkJCQkgICAgKDExMjIsIDIzMTgpCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4NTY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1OCIgQDE0NDQKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAxNTY1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU5IiBAMTQ0NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDQKLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIgotCQkJCQljbGllbnQgICAgIAlAMTQ0NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDE1NjUpCi0JCQkJCSAgICAoOTU5LCAxNTY1KQotCQkJCQkgICAgKDk1OSwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5GYWNldCIgQDE0NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ0Ci0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MzA5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTU2NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAxNTIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEyIiBAMTQ0OQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDE2NTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzAwMURCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTMiIEAxNDUwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0OQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBDRiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODE2LCAxNjUwKQotCQkJCQkgICAgKDk1OSwgMTY1MCkKLQkJCQkJICAgICg5NTksIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDUxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0OQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjQsIDE2MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTY1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAxNjA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDI3NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgyIiBAMTQ1NAotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgzIiBAMTQ1NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTQKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDU0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heExlbmd0aEZhY2V0IiBAMTQ1NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTQKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyMjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIgotCQkJCQljbGllbnQgICAgIAlAMTQ1NAotCQkJCQlzdXBwbGllciAgIAlAMTMyOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjk3LCAyMzIxKQotCQkJCQkgICAgKDEyOTcsIDI0MDkpCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc5MjA4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NCIgQDE0NTkKLQkJCQlsb2NhdGlvbiAgIAkoMTE1OSwgMjI3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NSIgQDE0NjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQ1OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0NjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMjM3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDI3IgotCQkJCQljbGllbnQgICAgIAlAMTQ1OQotCQkJCQlzdXBwbGllciAgIAlAMTMyOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTU5LCAyMjczKQotCQkJCQkgICAgKDExNTksIDI0MDkpCi0JCQkJCSAgICAoNDUwLCAyNDA5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0MDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMjM2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwOCIgQDE0NjQKLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMjMzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwOSIgQDE0NjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY0Ci0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCQljbGllbnQgICAgIAlAMTQ2NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIgQDE0NjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY0Ci0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NiwgMjQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUyNjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDYwIgotCQkJCQljbGllbnQgICAgIAlAMTQ2NAotCQkJCQlzdXBwbGllciAgIAlAMTMyOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk3LCAyMzM0KQotCQkJCQkgICAgKDExOTcsIDI0OTMpCi0JCQkJCSAgICAoNDUwLCAyNDkzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0OTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNywgMjQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE2MDQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNiIgQDE0NjkKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNyIgQDE0NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQ2OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IiBAMTQ3MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjkKLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NzAzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIzMSwgMjQzOCkKLQkJCQkJICAgICgxMjMxLCAyNjY4KQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxODgxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODYiIEAxNDc0Ci0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDIzOTcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwMERFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODciIEAxNDc1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3NAotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NzQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0NzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDc0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MywgMjU1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzRDciCi0JCQkJCWNsaWVudCAgICAgCUAxNDc0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMzEsIDIzOTcpCi0JCQkJCSAgICAoMTIzMSwgMjU4NykKLQkJCQkJICAgICg0NTEsIDI1ODcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjU4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM1LCAyNTYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDc2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTksIDU3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNDQ0Ci0JCQkJaGVpZ2h0ICAgICAJNDEzCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0ODAKLQkJCQlsb2NhdGlvbiAgIAkoMTIwOSwgMTA2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwOSwgMTA2NSkKLQkJCQkgICAgKDEyMDksIDk3NCkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDIiIEAxNDgxCi0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxNDgyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4MQotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NywgMTAzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTg3NjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDNDIgotCQkJCQljbGllbnQgICAgIAlAMTQ4MQotCQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2MTcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQzIiBAMTQ4NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODEKLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0ODEKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDg4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDgiIEAxNDg2Ci0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDg3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZEQjAxRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQ4NwotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODYKLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU4LCA3OTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTIwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDg2Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDc5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA5MTkpCi0JCQkJCSAgICAoMTQ1NCwgOTE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDkxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwOSwgODc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0OSIgQDE0OTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDg2Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDc5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA4MjgpCi0JCQkJCSAgICAoMTQ1NCwgODI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDgyOCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUwIiBAMTQ5MQotCQkJCWxvY2F0aW9uICAgCSgxNTM1LCA2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTIwMTA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0OTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDkxCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCQljbGllbnQgICAgIAlAMTQ5MQotCQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM1LCA2ODQpCi0JCQkJCSAgICAoMTUzNSwgNzI4KQotCQkJCQkgICAgKDE0NTQsIDcyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA3MjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDYsIDY4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUxIiBAMTQ5NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0OTEKLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1QiIKLQkJCQkJY2xpZW50ICAgICAJQDE0OTEKLQkJCQkJc3VwcGxpZXIgICAJQDE0NzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzNSwgNjg0KQotCQkJCQkgICAgKDE1MzUsIDY0MSkKLQkJCQkJICAgICgxNDU0LCA2NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNjQxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTQiIEAxNDk2Ci0JCQkJbG9jYXRpb24gICAJKDYxMywgOTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDk3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ5NgotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjUsIDk4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wbGV4VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTE3IgotCQkJCQljbGllbnQgICAgIAlAMTQ5NgotCQkJCQlzdXBwbGllciAgIAlAMTMzMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2MTMsIDk0MCkKLQkJCQkJICAgICgyODQsIDk0MCkKLQkJCQkJICAgICgyODQsIDEwMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDEwMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgOTcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NSIgQDE1MDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDk2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTIxIgotCQkJCQljbGllbnQgICAgIAlAMTQ5NgotCQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEwLCA5NDApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUwMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAMTQ3OQotCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTEyLCA1MTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTMxMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTAyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUAxMzMxCi0JCQkJc3VwcGxpZXIgICAJQDE0NzkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDE0ODApCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MiIgQDE1MDMKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MiwgMTEzMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0QjAxNzgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGUiIEAxNTA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTUwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTA0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjQ2NzUzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQkJY2xpZW50ICAgICAJQDE1MDMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxMjkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIxLCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTMiIEAxNTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTUwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNTAzCi0JCQkJCXN1cHBsaWVyICAgCUAxNDc5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgOTc0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAMTUwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDMwNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDM3MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGdsb2JhbCA6IGJvb2xlYW4iCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE1MDkKLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxNTA4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMjYyLCA1NjgpCi0JCQkJICAgICgyMjYyLCA0NzcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTEwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUAxMzA1Ci0JCQkJc3VwcGxpZXIgICAJQDE1MDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1OTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTA5KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDYiIEAxNTExCi0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGUiIEAxNTEyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUxMQotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMzEsIDQ5OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYyNjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRTUiCi0JCQkJCWNsaWVudCAgICAgCUAxNTExCi0JCQkJCXN1cHBsaWVyICAgCUAxNDc5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1NTMsIDQ1MykKLQkJCQkJICAgICgxMjIyLCA0NTMpCi0JCQkJCSAgICAoMTIyMiwgNTYyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMjIsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NSwgNDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTIwMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NyIgQDE1MTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTExCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNTExCi0JCQkJCXN1cHBsaWVyICAgCUAxNTA4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDE1MTYKLQkJCQlsb2NhdGlvbiAgIAkoMTkwOCwgMzUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRGZWF0dXJlIiBAMTUxNwotCQkJCQlQYXJlbnRfVmlldyAJQDE1MTYKLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjk0MTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCQljbGllbnQgICAgIAlAMTUxNgotCQkJCQlzdXBwbGllciAgIAlAMTUwOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxOTA4LCAzNTMpCi0JCQkJCSAgICAoMTkwOCwgMzg3KQotCQkJCQkgICAgKDE5OTMsIDM4NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk2NjM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzkiIEAxNTIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUxNgotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJCWNsaWVudCAgICAgCUAxNTE2Ci0JCQkJCXN1cHBsaWVyICAgCUAxNTA4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE5MDgsIDM1MykKLQkJCQkJICAgICgxOTA4LCAzMTkpCi0JCQkJCSAgICAoMTk5MywgMzE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTIxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUAxMzA5Ci0JCQkJc3VwcGxpZXIgICAJQDEzMDgKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ5NCwgMjg0KQotCQkJCSAgICAoNDk0LCAyNDQpCi0JCQkJICAgICg5OTYsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NiwgMjQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTIyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUAxMjk2Ci0JCQkJc3VwcGxpZXIgICAJQDE1MDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MTgsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTA5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEzMzMKLQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDEyOTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDEwNjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ4MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTI0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUAxNTA4Ci0JCQkJc3VwcGxpZXIgICAJQDEzMDgKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIxNDcsIDI5MSkKLQkJCQkgICAgKDIxNDcsIDI0NCkKLQkJCQkgICAgKDE0NjgsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAyNDQpKSkpKSkpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDc2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkbCIgQDE1MjUKLQkJCWxvY2F0aW9uICAgCSgyNzIsIDI1NikKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTI1Ci0JCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTcyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkid3NkbCIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiM0FERkI4RTUwMjFFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojpzb2FwIiBAMTUyNgotCQkJbG9jYXRpb24gICAJKDcwNCwgMjU2KQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MjYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTYwLCAxNzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJzb2FwIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQTAxQ0YwQzAxQTIiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OnhzZCIgQDE1MjcKLQkJCWxvY2F0aW9uICAgCSgxMTUyLCAyNTYpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUyNwotCQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCAxNzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJ4c2QiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM5QUJEQzZGMDFBQSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjUiCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3NyIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NiIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY4IgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJBTlNJIgotCQkJCXZhbHVlICAgICAgCTgwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIk9yYWNsZSIKLQkJCQl2YWx1ZSAgICAgIAk4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiCi0JCQkJdmFsdWUgICAgICAJODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiU3liYXNlIgotCQkJCXZhbHVlICAgICAgCTgwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIldhdGNvbSIKLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIklkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZSIKLQkJCXZhbHVlICAgICAgCSJWXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSJfViIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc09LIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExFbGVtZW50IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiIKLQkJCQl2YWx1ZSAgICAgIAk1NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk2MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCIKLQkJCQl2YWx1ZSAgICAgIAk1MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlVuaW9uIgotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuc29hcC9zcmMvcm9zZS9zb2FwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLnNvYXAvc3JjL3Jvc2Uvc29hcGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlJhaXNlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIgotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIm1fIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJInNfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb290RGlyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNIgotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN1biIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0IgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJJQk0iCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyIKLQkJCXZhbHVlICAgICAgCTMpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIl9JRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCIKLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50IgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTE5MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIgotCQkJCXZhbHVlICAgICAgCTE5MDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQUZURVIiCi0JCQkJdmFsdWUgICAgICAJMTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiCi0JCQkJdmFsdWUgICAgICAJMTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIgotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJST1ciCi0JCQkJdmFsdWUgICAgICAJMTcwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiCi0JCQkJdmFsdWUgICAgICAJMTYwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSI2IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJlcG9zaXRvcnkiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLnNvYXAvc3JjL3Jvc2Uvc29hcGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLnNvYXAvc3JjL3Jvc2Uvc29hcGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kZW50IgotCQkJdmFsdWUgICAgICAJMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiCi0JCQkJdmFsdWUgICAgICAJNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciIKLQkJCQl2YWx1ZSAgICAgIAk3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJTQ0MiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlR5cGVMaWJJbXBvcnRlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiCi0JCQkJdmFsdWUgICAgICAJMjEzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiMCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlIgotCQkJdmFsdWUgICAgICAJKCJDcmVhdGFibGVTZXQiIDIyMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluaXRpYWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVRlcm1pbmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiQ29sbGVjdGlvbiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiVGV4dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiRvcGVyYXRpb24iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NyIpKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhN2Y2MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQWRkcmVzcygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEFkZHJlc3MgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3MgewotCi0KLX0gLy8gU09BUEFkZHJlc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmEyODVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyNnZXRUcmFuc3BvcnRVUkkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQmluZGluZygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmcgewotfSAvLyBTT0FQQmluZGluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEJvZHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOWNlOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEJvZHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldFBhcnRzIDxlbT5QYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBCb2R5KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQQm9keSBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keSB7Ci19IC8vIFNPQVBCb2R5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxZDMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmFjdG9yeUltcGwoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEJpbmRpbmcgY3JlYXRlU09BUEJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Cb2R5PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJvZHk8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEJvZHkgY3JlYXRlU09BUEJvZHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXIgQmFzZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXIgQmFzZTwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQSGVhZGVyQmFzZSBjcmVhdGVTT0FQSGVhZGVyQmFzZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBGYXVsdCBjcmVhdGVTT0FQRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBPcGVyYXRpb24gY3JlYXRlU09BUE9wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkZHJlc3M8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQQWRkcmVzcyBjcmVhdGVTT0FQQWRkcmVzcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhlYWRlciBGYXVsdDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXIgRmF1bHQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEhlYWRlckZhdWx0IGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhlYWRlcjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXI8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEhlYWRlciBjcmVhdGVTT0FQSGVhZGVyKCk7Ci0KLSAgLyoKLSAgICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotCS8vU09BUFBhY2thZ2UgZ2V0U09BUFBhY2thZ2UoKTsKLQotfSAvL1NPQVBGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmM5OTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmF1bHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRVc2UgPGVtPlVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBGYXVsdCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEZhdWx0IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdCB7Ci0KLX0gLy8gU09BUEZhdWx0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjEwNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEhlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlciNnZXRIZWFkZXJGYXVsdHMgPGVtPkhlYWRlciBGYXVsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQSGVhZGVyIGV4dGVuZHMgU09BUEhlYWRlckJhc2UgewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVhZGVyIEZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0fS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWFkZXIgRmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlciBGYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJfSGVhZGVyRmF1bHRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEhlYWRlckZhdWx0cygpOwotCi19IC8vIFNPQVBIZWFkZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVhYTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWFkZXIgQmFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFBhcnQgPGVtPlBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEhlYWRlckJhc2UgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VXNlKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckJhc2VfVXNlKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRVc2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFVzZSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVc2UoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lc3BhY2VVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuY29kaW5nIFN0eWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZV9FbmNvZGluZ1N0eWxlcygpCi0gICAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLklTdHJpbmciCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRNZXNzYWdlKE1lc3NhZ2UpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJCYXNlX01lc3NhZ2UoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTWVzc2FnZSBnZXRNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE1lc3NhZ2UoTWVzc2FnZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0UGFydChQYXJ0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBhcnQgZ2V0UGFydCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0UGFydCA8ZW0+UGFydDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRQYXJ0KFBhcnQgdmFsdWUpOwotCi19IC8vIFNPQVBIZWFkZXJCYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzkyNGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGVhZGVyIEZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmdzLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckZhdWx0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQSGVhZGVyRmF1bHQgZXh0ZW5kcyBTT0FQSGVhZGVyQmFzZSB7Ci19IC8vIFNPQVBIZWFkZXJGYXVsdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzcwNDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbiNnZXRTb2FwQWN0aW9uVVJJIDxlbT5Tb2FwIEFjdGlvbiBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBPcGVyYXRpb24oKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBPcGVyYXRpb24gZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbiB7Ci19IC8vIFNPQVBPcGVyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmU1NjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotICAvKioKLSAgICogVGhlIHBhY2thZ2UgbmFtZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZU5BTUUgPSAic29hcCI7Ci0KLSAgLyoqCi0gICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9TT0FQIjsKLQotICAvKioKLSAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAic29hcCI7Ci0KLSAgLyoqCi0gICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsLmluaXQoKTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQmluZGluZ0ltcGwgPGVtPkJpbmRpbmc8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfQklORElORyA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19UUkFOU1BPUlRfVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19TVFlMRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwgPGVtPkJvZHk8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfQk9EWSA9IDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX1VTRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVMgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQk9EWV9fUEFSVFMgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Qm9keTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsIDxlbT5IZWFkZXIgQmFzZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRSA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fVVNFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fRU5DT0RJTkdfU1RZTEVTID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19QQVJUID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkhlYWRlciBCYXNlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEZhdWx0SW1wbCA8ZW0+RmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBGYXVsdEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVCA9IDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfRkFVTFRfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fVVNFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19OQU1FU1BBQ0VfVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUE9wZXJhdGlvbkltcGwgPGVtPk9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUE9wZXJhdGlvbkltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OID0gNDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEFjdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX19TVFlMRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEFkZHJlc3NJbXBsIDxlbT5BZGRyZXNzPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQWRkcmVzc0ltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEFkZHJlc3MoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWludCBTT0FQX0FERFJFU1MgPSA1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTU19fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTU19fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19MT0NBVElPTl9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QWRkcmVzczwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckZhdWx0SW1wbCA8ZW0+SGVhZGVyIEZhdWx0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyRmF1bHRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsI2dldFNPQVBIZWFkZXJGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUID0gNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVCA9IFNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQgPSBTT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVF9UWVBFID0gU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19VU0UgPSBTT0FQX0hFQURFUl9CQVNFX19VU0U7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19OQU1FU1BBQ0VfVVJJID0gU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuY29kaW5nIFN0eWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19FTkNPRElOR19TVFlMRVMgPSBTT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFID0gU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX1BBUlQgPSBTT0FQX0hFQURFUl9CQVNFX19QQVJUOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkhlYWRlciBGYXVsdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfRkVBVFVSRV9DT1VOVCA9IFNPQVBfSEVBREVSX0JBU0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckltcGwgPGVtPkhlYWRlcjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEhlYWRlcigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSID0gNzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fRUxFTUVOVCA9IFNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fUkVRVUlSRUQgPSBTT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFID0gU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19VU0UgPSBTT0FQX0hFQURFUl9CQVNFX19VU0U7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19OQU1FU1BBQ0VfVVJJID0gU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuY29kaW5nIFN0eWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19FTkNPRElOR19TVFlMRVMgPSBTT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19NRVNTQUdFID0gU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX1BBUlQgPSBTT0FQX0hFQURFUl9CQVNFX19QQVJUOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVhZGVyIEZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTID0gU09BUF9IRUFERVJfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5IZWFkZXI8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZFQVRVUkVfQ09VTlQgPSBTT0FQX0hFQURFUl9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPklTdHJpbmc8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0SVN0cmluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IElTVFJJTkcgPSA4OwotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUNsYXNzIGdldFNPQVBCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nI2dldFRyYW5zcG9ydFVSSSA8ZW0+VHJhbnNwb3J0IFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNwb3J0IFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0VHJhbnNwb3J0VVJJKCkKLSAgICogQHNlZSAjZ2V0U09BUEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJpbmRpbmdfVHJhbnNwb3J0VVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3R5bGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nI2dldFN0eWxlKCkKLSAgICogQHNlZSAjZ2V0U09BUEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJpbmRpbmdfU3R5bGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5IDxlbT5Cb2R5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Qm9keTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEJvZHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0VXNlIDxlbT5Vc2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0VXNlKCkKLSAgICogQHNlZSAjZ2V0U09BUEJvZHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfVXNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQHNlZSAjZ2V0U09BUEJvZHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfTmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldEVuY29kaW5nU3R5bGVzKCkKLSAgICogQHNlZSAjZ2V0U09BUEJvZHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfRW5jb2RpbmdTdHlsZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRQYXJ0cyA8ZW0+UGFydHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFydHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldFBhcnRzKCkKLSAgICogQHNlZSAjZ2V0U09BUEJvZHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVSZWZlcmVuY2UgZ2V0U09BUEJvZHlfUGFydHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlIDxlbT5IZWFkZXIgQmFzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkhlYWRlciBCYXNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQSGVhZGVyQmFzZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRVc2UgPGVtPlVzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRVc2UoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9Vc2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9FbmNvZGluZ1N0eWxlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRNZXNzYWdlKCkKLSAgICogQHNlZSAjZ2V0U09BUEhlYWRlckJhc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlckJhc2VfTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRQYXJ0IDxlbT5QYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRQYXJ0KCkKLSAgICogQHNlZSAjZ2V0U09BUEhlYWRlckJhc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlckJhc2VfUGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0IDxlbT5GYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRVc2UgPGVtPlVzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0VXNlKCkKLSAgICogQHNlZSAjZ2V0U09BUEZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBGYXVsdF9Vc2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBzZWUgI2dldFNPQVBGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQRmF1bHRfTmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAc2VlICNnZXRTT0FQRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEZhdWx0X0VuY29kaW5nU3R5bGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUE9wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFNvYXBBY3Rpb25VUkkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFNvYXBBY3Rpb25VUkkoKQotICAgKiBAc2VlICNnZXRTT0FQT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBPcGVyYXRpb25fU29hcEFjdGlvblVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3R5bGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U3R5bGUoKQotICAgKiBAc2VlICNnZXRTT0FQT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBPcGVyYXRpb25fU3R5bGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzIDxlbT5BZGRyZXNzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEFkZHJlc3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBzZWUgI2dldFNPQVBBZGRyZXNzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBBZGRyZXNzX0xvY2F0aW9uVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQgPGVtPkhlYWRlciBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkhlYWRlciBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUNsYXNzIGdldFNPQVBIZWFkZXJGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlciA8ZW0+SGVhZGVyPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGVhZGVyPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUNsYXNzIGdldFNPQVBIZWFkZXIoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyI2dldEhlYWRlckZhdWx0cyA8ZW0+SGVhZGVyIEZhdWx0czwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IZWFkZXIgRmF1bHRzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyI2dldEhlYWRlckZhdWx0cygpCi0gICAqIEBzZWUgI2dldFNPQVBIZWFkZXIoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlcl9IZWFkZXJGYXVsdHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPklTdHJpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SVN0cmluZzwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVEYXRhVHlwZSBnZXRJU3RyaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQRmFjdG9yeSBnZXRTT0FQRmFjdG9yeSgpOwotCi19IC8vU09BUFBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2dlbmVyYXRvci9TT0FQQ29udGVudEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvZ2VuZXJhdG9yL1NPQVBDb250ZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyM2VlZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvZ2VuZXJhdG9yL1NPQVBDb250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuZ2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuQ29udGVudEdlbmVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVBDb250ZW50R2VuZXJhdG9yIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvcgotewkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fTk9UX1NFVCA9IC0xOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX0RPQ1VNRU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9SUEMgPSAyOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRV9MSVRFUkFMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VfRU5DT0RFRCA9IDI7Ci0JCi0JcHJpdmF0ZSBpbnQgc3R5bGVPcHRpb24gPSBPUFRJT05fTk9UX1NFVDsKLQlwcml2YXRlIGludCB1c2VPcHRpb24gPSBPUFRJT05fTk9UX1NFVDsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVZhbHVlID0gIiI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYWRkcmVzc0xvY2F0aW9uID0gQ29udGVudEdlbmVyYXRvci5BRERSRVNTX0xPQ0FUSU9OOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gcmVxdWlyZWROYW1lc3BhY2VzID0geyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIn07Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gcHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMgPSB7InNvYXAifTsKLSAgCi0gICAgIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCkKLSAgewotICAgIHJldHVybiByZXF1aXJlZE5hbWVzcGFjZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4KFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLQkgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIikpIHsKLQkJICByZXR1cm4gInNvYXAiOwotCSAgfQotCSAgCi0JICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlKGludCBzdHlsZSkgewotCSAgc3R5bGVPcHRpb24gPSBzdHlsZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VXNlKGludCB1c2UpIHsKLQkgIHVzZU9wdGlvbiA9IHVzZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QWRkcmVzc0xvY2F0aW9uKFN0cmluZyBhZGRyZXNzTG9jYXRpb24pIHsKLQkgIHRoaXMuYWRkcmVzc0xvY2F0aW9uID0gYWRkcmVzc0xvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVQb3J0Q29udGVudChQb3J0IHBvcnQpCi0gIHsKLQkgIC8vIFdlIGJsb3cgYXdheSBhbnkgZXhpc3RpbmcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzL2NvbnRlbnQgYmVmb3JlIHdlIGdlbmVyYXRlIGl0Ci0JICAvLyBJcyBpdCB3b3J0aCBiZWluZyBzbWFydGVyPyAgTG9vayBmb3IgbWF0Y2hpbmcgY29udGVudCBmaXJzdCBhbmQgY3JlYXRlIHRob3NlIHdoaWNoIGFyZW4ndCBmb3VuZD8/Pz8KLQkgIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QocG9ydC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwkgIAotCSAgcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQotCSAgU09BUEFkZHJlc3Mgc29hcEFkZHJlc3M9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQWRkcmVzcygpOwotCSAgc29hcEFkZHJlc3Muc2V0TG9jYXRpb25VUkkoYWRkcmVzc0xvY2F0aW9uKTsKLQkgIHBvcnQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEFkZHJlc3MpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdDb250ZW50KEJpbmRpbmcgYmluZGluZywgUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsJICAKLQkgIC8vIFdlIGJsb3cgYXdheSBhbnkgZXhpc3RpbmcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzL2NvbnRlbnQgYmVmb3JlIHdlIGdlbmVyYXRlIGl0Ci0JICAvLyBJcyBpdCB3b3J0aCBiZWluZyBzbWFydGVyPyAgTG9vayBmb3IgbWF0Y2hpbmcgY29udGVudCBmaXJzdCBhbmQgY3JlYXRlIHRob3NlIHdoaWNoIGFyZW4ndCBmb3VuZD8/Pz8KLQkgIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwkgIAotCSAgcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmcuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQkKLQlTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRTsKLQlTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0Jc29hcEJpbmRpbmcuc2V0U3R5bGUoKGdldFN0eWxlT3B0aW9uKGJpbmRpbmcpID09IFNUWUxFX0RPQ1VNRU5UKSA/ICJkb2N1bWVudCIgOiAicnBjIik7Ci0Jc29hcEJpbmRpbmcuc2V0VHJhbnNwb3J0VVJJKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiKTsKLQkKLQliaW5kaW5nLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCaW5kaW5nKTsJCi0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nT3BlcmF0aW9uLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0JcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQkKLQlTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUE9wZXJhdGlvbigpOwkKLQkKLSAgICBTdHJpbmcgc29hcEFjdGlvblZhbHVlID0gZ2V0TmFtZXNwYWNlKGJpbmRpbmdPcGVyYXRpb24pOwotICAgIGlmICghc29hcEFjdGlvblZhbHVlLmVuZHNXaXRoKCIvIikpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIHNvYXBBY3Rpb25WYWx1ZSArPSAiLyI7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHNvYXBBY3Rpb25WYWx1ZSArPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotCQotCXNvYXBPcGVyYXRpb24uc2V0U29hcEFjdGlvblVSSShzb2FwQWN0aW9uVmFsdWUpOwotCQotCWJpbmRpbmdPcGVyYXRpb24uYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcE9wZXJhdGlvbik7CQotICB9ICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdJbnB1dENvbnRlbnQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCwgSW5wdXQgaW5wdXQpCi0gIHsKLQkgIC8vIFdlIGJsb3cgYXdheSBhbnkgZXhpc3RpbmcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzL2NvbnRlbnQgYmVmb3JlIHdlIGdlbmVyYXRlIGl0Ci0JICAvLyBJcyBpdCB3b3J0aCBiZWluZyBzbWFydGVyPyAgTG9vayBmb3IgbWF0Y2hpbmcgY29udGVudCBmaXJzdCBhbmQgY3JlYXRlIHRob3NlIHdoaWNoIGFyZW4ndCBmb3VuZD8/Pz8KLQkgIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoYmluZGluZ0lucHV0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0JcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdJbnB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHJlbW92ZUxpc3QpOwotCQotCVNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFOwotCVNPQVBCb2R5IHNvYXBCb2R5ID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEJvZHkoKTsKLQlzb2FwQm9keS5zZXRVc2UoKGdldFVzZU9wdGlvbihudWxsKSA9PSBVU0VfRU5DT0RFRCkgPyAiZW5jb2RlZCIgOiAibGl0ZXJhbCIpOwotCWlmIChnZXRVc2VPcHRpb24oYmluZGluZ0lucHV0KSA9PSBVU0VfRU5DT0RFRCAmJiBnZXRTdHlsZU9wdGlvbihiaW5kaW5nSW5wdXQpID09IFNUWUxFX1JQQykKLSAgICB7Ci0JCUxpc3QgZW5jb2RpbmdMaXN0ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJZW5jb2RpbmdMaXN0LmFkZCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLQkJc29hcEJvZHkuc2V0RW5jb2RpbmdTdHlsZXMoZW5jb2RpbmdMaXN0KTsKLQkgIAlzb2FwQm9keS5zZXROYW1lc3BhY2VVUkkoZ2V0TmFtZXNwYWNlKGJpbmRpbmdJbnB1dCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChnZXRVc2VPcHRpb24oYmluZGluZ0lucHV0KSA9PSBVU0VfTElURVJBTCAmJiBnZXRTdHlsZU9wdGlvbihiaW5kaW5nSW5wdXQpID09IFNUWUxFX1JQQykgewotCSAgCXNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSShnZXROYW1lc3BhY2UoYmluZGluZ0lucHV0KSk7Ci0gICAgfQotCQotCWJpbmRpbmdJbnB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQm9keSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCwgT3V0cHV0IG91dHB1dCkKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nT3V0cHV0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0JcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdPdXRwdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQkKLQlTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRTsKLQlTT0FQQm9keSBzb2FwQm9keSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBCb2R5KCk7Ci0Jc29hcEJvZHkuc2V0VXNlKChnZXRVc2VPcHRpb24oYmluZGluZ091dHB1dCkgPT0gVVNFX0VOQ09ERUQpID8gImVuY29kZWQiIDogImxpdGVyYWwiKTsKLQlpZiAoZ2V0VXNlT3B0aW9uKGJpbmRpbmdPdXRwdXQpID09IFVTRV9FTkNPREVEICYmIGdldFN0eWxlT3B0aW9uKGJpbmRpbmdPdXRwdXQpID09IFNUWUxFX1JQQykKLSAgICB7Ci0JCUxpc3QgZW5jb2RpbmdMaXN0ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJZW5jb2RpbmdMaXN0LmFkZCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLQkJc29hcEJvZHkuc2V0RW5jb2RpbmdTdHlsZXMoZW5jb2RpbmdMaXN0KTsKLQkgIAlzb2FwQm9keS5zZXROYW1lc3BhY2VVUkkoZ2V0TmFtZXNwYWNlKGJpbmRpbmdPdXRwdXQpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZ2V0VXNlT3B0aW9uKGJpbmRpbmdPdXRwdXQpID09IFVTRV9MSVRFUkFMICYmIGdldFN0eWxlT3B0aW9uKGJpbmRpbmdPdXRwdXQpID09IFNUWUxFX1JQQykgewotCSAgCXNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSShnZXROYW1lc3BhY2UoYmluZGluZ091dHB1dCkpOwotICAgIH0KLQkKLQliaW5kaW5nT3V0cHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCb2R5KTsJCi0gIH0gICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdGYXVsdENvbnRlbnQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCwgRmF1bHQgZmF1bHQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAvLyBXZSBibG93IGF3YXkgYW55IGV4aXN0aW5nIEV4dGVuc2liaWxpdHlFbGVtZW50cy9jb250ZW50IGJlZm9yZSB3ZSBnZW5lcmF0ZSBpdAotCSAgLy8gSXMgaXQgd29ydGggYmVpbmcgc21hcnRlcj8gIExvb2sgZm9yIG1hdGNoaW5nIGNvbnRlbnQgZmlyc3QgYW5kIGNyZWF0ZSB0aG9zZSB3aGljaCBhcmVuJ3QgZm91bmQ/Pz8/Ci0JICBMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGJpbmRpbmdGYXVsdC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCXJlbW92ZUV4dGVuc2ViaWxpdHlFbGVtZW50cyhiaW5kaW5nRmF1bHQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQkKLQlTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRTsKLQlTT0FQRmF1bHQgc29hcEZhdWx0ID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0KCk7Ci0Jc29hcEZhdWx0LnNldFVzZSgoZ2V0VXNlT3B0aW9uKGJpbmRpbmdGYXVsdCkgPT0gVVNFX0VOQ09ERUQpID8gImVuY29kZWQiIDogImxpdGVyYWwiKTsKLQlzb2FwRmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotLy8Jc29hcEZhdWx0LnNldE5hbWVzcGFjZVVSSShnZXROYW1lc3BhY2UoYmluZGluZ0ZhdWx0KSk7Ci0KLQlpZiAoZ2V0VXNlT3B0aW9uKGJpbmRpbmdGYXVsdCkgPT0gVVNFX0VOQ09ERUQgJiYgZ2V0U3R5bGVPcHRpb24oYmluZGluZ0ZhdWx0KSA9PSBTVFlMRV9SUEMpCi0gICAgewotCQlMaXN0IGVuY29kaW5nTGlzdCA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCWVuY29kaW5nTGlzdC5hZGQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0JCXNvYXBGYXVsdC5zZXRFbmNvZGluZ1N0eWxlcyhlbmNvZGluZ0xpc3QpOwotICAgIH0KLQkKLQliaW5kaW5nRmF1bHQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEZhdWx0KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZXNwYWNlKFdTRExFbGVtZW50IHdzZGxFbGVtZW50KSB7Ci0JICBpZiAobmFtZXNwYWNlVmFsdWUuZXF1YWxzKCIiKSAmJiB3c2RsRWxlbWVudCAhPSBudWxsKSB7Ci0JCSAgbmFtZXNwYWNlVmFsdWUgPSB3c2RsRWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JICB9Ci0JICBpZiAobmFtZXNwYWNlVmFsdWUgPT0gbnVsbCkgewotCQkgIG5hbWVzcGFjZVZhbHVlID0gIiI7Ci0JICB9Ci0JICAKLQkgIHJldHVybiBuYW1lc3BhY2VWYWx1ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUV4dGVuc2ViaWxpdHlFbGVtZW50cyhMaXN0IG9yaWdpbmFsTGlzdCwgTGlzdCByZW1vdmVMaXN0KSB7Ci0JICBJdGVyYXRvciByZW1vdmVJdCA9IHJlbW92ZUxpc3QuaXRlcmF0b3IoKTsKLQkgIHdoaWxlIChyZW1vdmVJdC5oYXNOZXh0KCkpIHsKLQkJICBvcmlnaW5hbExpc3QucmVtb3ZlKHJlbW92ZUl0Lm5leHQoKSk7Ci0JICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgQmluZGluZyBnZXRCaW5kaW5nT2JqZWN0KE9iamVjdCBnZW5lcmljQmluZGluZ09iamVjdCkgewotCSAgT2JqZWN0IHBhcmVudCA9IGdlbmVyaWNCaW5kaW5nT2JqZWN0OwotCSAgCi0JICBpbnQgaW5kZXggPSAwOwotCSAgd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIGluZGV4IDwgNSkgewotCQkgIHBhcmVudCA9IGdldEdlbmVyaWNCaW5kaW5nT2JqZWN0UGFyZW50KHBhcmVudCk7Ci0JCSAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLQkJCSAgYnJlYWs7Ci0JCSAgfQotCQkgIGluZGV4Kys7Ci0JICB9Ci0KLQkgIHJldHVybiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZyk/IChCaW5kaW5nKSBwYXJlbnQgOiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIE9iamVjdCBnZXRHZW5lcmljQmluZGluZ09iamVjdFBhcmVudChPYmplY3QgZ2VuZXJpY0JpbmRpbmdPYmplY3QpIHsKLQkgIE9iamVjdCBwYXJlbnQgPSBudWxsOwotCSAgCi0JICBpZiAoZ2VuZXJpY0JpbmRpbmdPYmplY3QgIT0gbnVsbCkgewotCQkgIGlmIChnZW5lcmljQmluZGluZ09iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdPcGVyYXRpb24pIHsKLQkJCSAgcGFyZW50ID0gKChCaW5kaW5nT3BlcmF0aW9uKSBnZW5lcmljQmluZGluZ09iamVjdCkuZ2V0Q29udGFpbmVyKCk7Ci0JCSAgfQotCQkgIGVsc2UgaWYgKGdlbmVyaWNCaW5kaW5nT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KSB7Ci0JCQkgIHBhcmVudCA9ICgoQmluZGluZ0lucHV0KSBnZW5lcmljQmluZGluZ09iamVjdCkuZ2V0Q29udGFpbmVyKCk7Ci0JCSAgfQotCQkgIGVsc2UgaWYgKGdlbmVyaWNCaW5kaW5nT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkgewotCQkJICBwYXJlbnQgPSAoKEJpbmRpbmdPdXRwdXQpIGdlbmVyaWNCaW5kaW5nT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoZ2VuZXJpY0JpbmRpbmdPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nRmF1bHQpIHsKLQkJCSAgcGFyZW50ID0gKChCaW5kaW5nRmF1bHQpIGdlbmVyaWNCaW5kaW5nT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJICB9CSAgCi0JICB9Ci0JICAKLQkgIHJldHVybiBwYXJlbnQ7CSAgCi0gIH0KLSAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U3R5bGVPcHRpb24oT2JqZWN0IGdlbmVyaWNCaW5kaW5nT2JqZWN0KSB7Ci0JICBpZiAoc3R5bGVPcHRpb24gPT0gT1BUSU9OX05PVF9TRVQgJiYgZ2VuZXJpY0JpbmRpbmdPYmplY3QgIT0gbnVsbCkgewotCQkgIC8vIGluaXQoKSB3YXMgbmV2ZXIgY2FsbGVkLCB0cnkgdG8gZGV0ZXJtaW5lIHRoZSAnc3R5bGUnIGJhc2VkIG9uIHdoYXQgd2UgaGF2ZS9rbm93Ci0JCSAgQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZ09iamVjdChnZW5lcmljQmluZGluZ09iamVjdCk7Ci0JCSAgCi0JCSAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3R5bGUgZnJvbSB0aGUgQmluZGluZyBPYmplY3QKLQkJICBpZiAoYmluZGluZyAhPSBudWxsKSB7Ci0JCQkgIExpc3QgbGlzdCA9IGJpbmRpbmcuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCQkJICBJdGVyYXRvciB2YWx1ZXNJdCA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50QXR0cmlidXRlVmFsdWUobGlzdCwgInN0eWxlIikuaXRlcmF0b3IoKTsKLQotCQkJICB3aGlsZSAodmFsdWVzSXQuaGFzTmV4dCgpKSB7Ci0JCQkJICBTdHJpbmcgc3R5bGUgPSAoU3RyaW5nKSB2YWx1ZXNJdC5uZXh0KCk7Ci0JCQkJICAKLQkJCQkgIGlmIChzdHlsZS5lcXVhbHMoImRvY3VtZW50IikpIHsKLQkJCQkJICBzdHlsZU9wdGlvbiA9IFNUWUxFX0RPQ1VNRU5UOwotCQkJCSAgfQotCQkJCSAgZWxzZSBpZiAoc3R5bGUuZXF1YWxzKCJycGMiKSkgewotCQkJCQkgIHN0eWxlT3B0aW9uID0gU1RZTEVfUlBDOyAgCi0JCQkJICB9Ci0JCQkJICAKLQkJCQkgIGlmIChzdHlsZU9wdGlvbiAhPSBPUFRJT05fTk9UX1NFVCkgewotCQkJCQkgIGJyZWFrOwotCQkJCSAgfQotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgCi0JICBpZiAoc3R5bGVPcHRpb24gPT0gT1BUSU9OX05PVF9TRVQpIHsKLQkJICBzdHlsZU9wdGlvbiA9IFNUWUxFX0RPQ1VNRU5UOwotCSAgfQotCSAgCi0JICByZXR1cm4gc3R5bGVPcHRpb247Ci0gIH0KLQkKLQkgIHByaXZhdGUgaW50IGdldFVzZU9wdGlvbihPYmplY3QgZ2VuZXJpY0JpbmRpbmdPYmplY3QpIHsKLQkJICBpZiAodXNlT3B0aW9uID09IE9QVElPTl9OT1RfU0VUKSB7Ci0JCQkgIC8vIGluaXQoKSB3YXMgbmV2ZXIgY2FsbGVkLCB0cnkgdG8gZGV0ZXJtaW5lIHRoZSAndXNlJyBiYXNlZCBvbiB3aGF0IHdlIGhhdmUva25vdwotCQkJICBJdGVyYXRvciBtZXNzYWdlUmVmSXQgPSBnZXRNZXNzYWdlUmVmZXJlbmNlQmluZGluZ09iamVjdHMoZ2VuZXJpY0JpbmRpbmdPYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkgIAotCQkJICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSB1c2UgZnJvbSB0aGUgbGlzdCBvZiBCaW5kaW5nSW5wdXRzLCBCaW5kaW5nT3V0cHV0cywgYW5kIEJpbmRpbmdGYXVsdHMKLQkJCSAgd2hpbGUgKG1lc3NhZ2VSZWZJdC5oYXNOZXh0KCkpIHsKLQkJCQkgIE9iamVjdCBtZXNzYWdlUmVmID0gbWVzc2FnZVJlZkl0Lm5leHQoKTsKLQkJCQkgIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCSAgCi0JCQkJICBpZiAobWVzc2FnZVJlZiBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkgewotCQkJCQkgIExpc3QgbGlzdCA9ICgoQmluZGluZ0lucHV0KSBtZXNzYWdlUmVmKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCQkJCSAgdmFsdWVzID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShsaXN0LCAidXNlIik7Ci0JCQkJICB9Ci0JCQkJICBlbHNlIGlmIChtZXNzYWdlUmVmIGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkgewotCQkJCQkgIExpc3QgbGlzdCA9ICgoQmluZGluZ091dHB1dCkgbWVzc2FnZVJlZikuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCQkJCQkgIHZhbHVlcyA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50QXR0cmlidXRlVmFsdWUobGlzdCwgInVzZSIpOwotCQkJCSAgfQotCQkJCSAgZWxzZSBpZiAobWVzc2FnZVJlZiBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgewotCQkJCQkgIExpc3QgbGlzdCA9ICgoQmluZGluZ0ZhdWx0KSBtZXNzYWdlUmVmKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCQkJCSAgdmFsdWVzID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShsaXN0LCAidXNlIik7CQkJCSAgCi0JCQkJICB9Ci0KLQkJCQkgIEl0ZXJhdG9yIHZhbHVlc0l0ID0gdmFsdWVzLml0ZXJhdG9yKCk7Ci0JCQkJICB3aGlsZSAodmFsdWVzSXQuaGFzTmV4dCgpKSB7Ci0JCQkJCSAgU3RyaW5nIHVzZSA9IChTdHJpbmcpIHZhbHVlc0l0Lm5leHQoKTsKLQkJCQkJICAKLQkJCQkJICBpZiAodXNlLmVxdWFscygibGl0ZXJhbCIpKSB7Ci0JCQkJCQkgIHVzZU9wdGlvbiA9IFVTRV9MSVRFUkFMOwotCQkJCQkgIH0KLQkJCQkJICBlbHNlIGlmICh1c2UuZXF1YWxzKCJlbmNvZGVkIikpIHsKLQkJCQkJCSAgdXNlT3B0aW9uID0gVVNFX0VOQ09ERUQ7ICAKLQkJCQkJICB9Ci0JCQkJICB9Ci0JCQkJICAKLQkJCQkgIGlmICh1c2VPcHRpb24gIT0gT1BUSU9OX05PVF9TRVQpIHsKLQkJCQkJICBicmVhazsKLQkJCQkgIH0KLQkJCSAgfQotCQkgIH0KLQotCQkgIGlmICh1c2VPcHRpb24gPT0gT1BUSU9OX05PVF9TRVQpIHsKLQkJCSAgdXNlT3B0aW9uID0gVVNFX0xJVEVSQUw7Ci0JCSAgfQotCQkgIAotCQkgIHJldHVybiB1c2VPcHRpb247Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgTGlzdCBnZXRNZXNzYWdlUmVmZXJlbmNlQmluZGluZ09iamVjdHMoT2JqZWN0IGdlbmVyaWNCaW5kaW5nT2JqZWN0KSB7Ci0JCSAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkgIEJpbmRpbmcgYmluZGluZyA9IGdldEJpbmRpbmdPYmplY3QoZ2VuZXJpY0JpbmRpbmdPYmplY3QpOwotCQkgIAotCQkgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCSAgSXRlcmF0b3Igb3BlcmF0aW9uc0l0ID0gYmluZGluZy5nZXRFQmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotCQkgIAotCQkJICB3aGlsZSAob3BlcmF0aW9uc0l0Lmhhc05leHQoKSkgewotCQkJCSAgQmluZGluZ09wZXJhdGlvbiBvcCA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcGVyYXRpb25zSXQubmV4dCgpOwotCQkJCSAgbGlzdC5hZGQob3AuZ2V0RUJpbmRpbmdJbnB1dCgpKTsKLQkJCQkgIGxpc3QuYWRkKG9wLmdldEVCaW5kaW5nT3V0cHV0KCkpOwotCQkJCSAgbGlzdC5hZGRBbGwob3AuZ2V0RUJpbmRpbmdGYXVsdHMoKSk7Ci0JCQkgIH0JICAKLQkJICB9Ci0JCSAgCi0JCSAgcmV0dXJuIGxpc3Q7Ci0JICB9Ci0JCi0JICBwcml2YXRlIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShMaXN0IGVlTGlzdCwgU3RyaW5nIGF0dHJpYnV0ZUtleSkgewotCQkgIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkgIEl0ZXJhdG9yIGVlRWxlbWVudHNJdCA9IGVlTGlzdC5pdGVyYXRvcigpOwotCQkgIAotCQkgIHdoaWxlIChlZUVsZW1lbnRzSXQuaGFzTmV4dCgpKSB7Ci0JCQkgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlRWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZWVFbGVtZW50c0l0Lm5leHQoKTsKLQkJCSAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gZWVFbGVtZW50LmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlS2V5KTsKLQkJCSAgaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwgJiYgIWF0dHJpYnV0ZVZhbHVlLmVxdWFscygiIikpIHsKLQkJCQkgIHZhbHVlcy5hZGQoYXR0cmlidXRlVmFsdWUpOwotCQkJICB9CQkgIAotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gdmFsdWVzOwotCSAgfQotCSAgCi0JICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotCQkgIHJldHVybiAiU09BUCI7Ci0JICB9Ci19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEFkZHJlc3NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBBZGRyZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTlhNGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEFkZHJlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZGRyZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQWRkcmVzc0ltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBBZGRyZXNzSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBBZGRyZXNzIHsKLSAgLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgYXNzaWduZWQgd2l0aCAxTCB0byBhdm9pZAotICAgKiBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvblVSSSA9IExPQ0FUSU9OX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUEFkZHJlc3NJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBBZGRyZXNzKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJJKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvblVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uVVJJKFN0cmluZyBuZXdMb2NhdGlvblVSSSkKLSAgewotICAgIFN0cmluZyBvbGRMb2NhdGlvblVSSSA9IGxvY2F0aW9uVVJJOwotICAgIGxvY2F0aW9uVVJJID0gbmV3TG9jYXRpb25VUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19MT0NBVElPTl9VUkksIG9sZExvY2F0aW9uVVJJLCBsb2NhdGlvblVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotICAgICAgICByZXR1cm4gZ2V0TG9jYXRpb25VUkkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0gICAgICAgIHNldExvY2F0aW9uVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgc2V0TG9jYXRpb25VUkkoTE9DQVRJT05fVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb25VUkkgIT0gbnVsbCA6ICFMT0NBVElPTl9VUklfRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uVVJJKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKGxvY2F0aW9uVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGxvY2F0aW9uVVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0JCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBzZXRMb2NhdGlvblVSSQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLkxPQ0FUSU9OX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBBZGRyZXNzX0xvY2F0aW9uVVJJKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLkxPQ0FUSU9OX0FUVFJJQlVURSxnZXRMb2NhdGlvblVSSSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLCBTT0FQQ29uc3RhbnRzLkFERFJFU1NfRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfSAKLX0gLy9TT0FQQWRkcmVzc0ltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEJpbmRpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBCaW5kaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWNjZDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEJpbmRpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQmluZGluZ0ltcGwjZ2V0VHJhbnNwb3J0VVJJIDxlbT5UcmFuc3BvcnQgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQmluZGluZ0ltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEJpbmRpbmcgewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zcG9ydFVSSSgpIDxlbT5UcmFuc3BvcnQgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFRyYW5zcG9ydFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zcG9ydFVSSSgpIDxlbT5UcmFuc3BvcnQgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFRyYW5zcG9ydFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyB0cmFuc3BvcnRVUkkgPSBUUkFOU1BPUlRfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3R5bGUoKSA8ZW0+U3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0U3R5bGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3R5bGUoKSA8ZW0+U3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0U3R5bGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3R5bGUgPSBTVFlMRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCaW5kaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRyYW5zcG9ydFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0VVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0VVJJKFN0cmluZyBuZXdUcmFuc3BvcnRVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkVHJhbnNwb3J0VVJJID0gdHJhbnNwb3J0VVJJOwotICAgIHRyYW5zcG9ydFVSSSA9IG5ld1RyYW5zcG9ydFVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkksIG9sZFRyYW5zcG9ydFVSSSwgdHJhbnNwb3J0VVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkKLSAgewotICAgIHJldHVybiBzdHlsZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0cmluZyBuZXdTdHlsZSkKLSAgewotICAgIFN0cmluZyBvbGRTdHlsZSA9IHN0eWxlOwotICAgIHN0eWxlID0gbmV3U3R5bGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19UUkFOU1BPUlRfVVJJOgotICAgICAgICByZXR1cm4gZ2V0VHJhbnNwb3J0VVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fU1RZTEU6Ci0gICAgICAgIHJldHVybiBnZXRTdHlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkk6Ci0gICAgICAgIHNldFRyYW5zcG9ydFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1NUWUxFOgotICAgICAgICBzZXRTdHlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19UUkFOU1BPUlRfVVJJOgotICAgICAgICBzZXRUcmFuc3BvcnRVUkkoVFJBTlNQT1JUX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoU1RZTEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fVFJBTlNQT1JUX1VSSToKLSAgICAgICAgcmV0dXJuIFRSQU5TUE9SVF9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHRyYW5zcG9ydFVSSSAhPSBudWxsIDogIVRSQU5TUE9SVF9VUklfRURFRkFVTFQuZXF1YWxzKHRyYW5zcG9ydFVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fU1RZTEU6Ci0gICAgICAgIHJldHVybiBTVFlMRV9FREVGQVVMVCA9PSBudWxsID8gc3R5bGUgIT0gbnVsbCA6ICFTVFlMRV9FREVGQVVMVC5lcXVhbHMoc3R5bGUpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAodHJhbnNwb3J0VVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHRyYW5zcG9ydFVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBzdHlsZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChzdHlsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldFN0eWxlCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuU1RZTEVfQVRUUklCVVRFKSk7Ci0gICAgc2V0VHJhbnNwb3J0VVJJCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuVFJBTlNQT1JUX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCaW5kaW5nX1N0eWxlKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLlNUWUxFX0FUVFJJQlVURSxnZXRTdHlsZSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdfVHJhbnNwb3J0VVJJKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLlRSQU5TUE9SVF9BVFRSSUJVVEUsZ2V0VHJhbnNwb3J0VVJJKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5TT0FQX05BTUVTUEFDRV9VUkksIFNPQVBDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9Ci19IC8vU09BUEJpbmRpbmdJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBCb2R5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQm9keUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlZDQ4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBCb2R5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb2R5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwjZ2V0UGFydHMgPGVtPlBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEJvZHlJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEJvZHkgewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2UoKSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2UgPSBVU0VfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmdTdHlsZXMoKSA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBFTGlzdCBlbmNvZGluZ1N0eWxlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRzKCkgPGVtPlBhcnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UGFydHMoKQotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgTGlzdCBwYXJ0cyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBCb2R5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQm9keSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKQotICB7Ci0gICAgcmV0dXJuIHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgbmV3VXNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFVzZSA9IHVzZTsKLSAgICB1c2UgPSBuZXdVc2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0UsIG9sZFVzZSwgdXNlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG5hbWVzcGFjZVVSSSA9IG5ld05hbWVzcGFjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdTdHlsZXMoTGlzdCBsaXN0KQotewotICBlbmNvZGluZ1N0eWxlcyA9IChFTGlzdClsaXN0OwotfQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbmNvZGluZ1N0eWxlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRU5DT0RJTkdfU1RZTEVTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFydHMoTGlzdCBsaXN0KQotICB7Ci0gICAgcGFydHMgPSBsaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0UGFydHMoKQotICB7Ci0gICAgaWYgKHBhcnRzID09IG51bGwpCi0gICAgewotICAgICAgcGFydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFBhcnQuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUEFSVFMpOwotICAgICAgcmV0dXJuIGdldEltcGxpY2l0UGFydHMoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHBhcnRzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRJbXBsaWNpdFBhcnRzKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBwYXJ0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1BBUlRTOgotICAgICAgICByZXR1cm4gZ2V0UGFydHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19QQVJUUzoKLSAgICAgICAgZ2V0UGFydHMoKS5jbGVhcigpOwotICAgICAgICBnZXRQYXJ0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fVVNFOgotICAgICAgICBzZXRVc2UoVVNFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUEFSVFM6Ci0gICAgICAgIGdldFBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1VTRToKLSAgICAgICAgcmV0dXJuIFVTRV9FREVGQVVMVCA9PSBudWxsID8gdXNlICE9IG51bGwgOiAhVVNFX0VERUZBVUxULmVxdWFscyh1c2UpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzICE9IG51bGwgJiYgIWVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19QQVJUUzoKLSAgICAgICAgcmV0dXJuIHBhcnRzICE9IG51bGwgJiYgIXBhcnRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHVzZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1c2UpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZXNwYWNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBlbmNvZGluZ1N0eWxlczogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChlbmNvZGluZ1N0eWxlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFKSkKLSAgICAgIHNldFVzZShjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFKSk7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpKQotICAgICAgc2V0TmFtZXNwYWNlVVJJKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpKTsKLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFKSkgCi0gICAgewotICAgICAgU3RyaW5nIGVuY29kaW5nU3R5bGVzID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVuY29kaW5nU3R5bGVzKTsKLSAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgCWdldEVuY29kaW5nU3R5bGVzKCkuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgfSAgIAotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5QQVJUU19BVFRSSUJVVEUpKQotICAgIC8vIFN5bmNocm9uaXplICdwYXJ0cycgdmFyaWFibGUgZnJvbSBlbGVtZW50J3MgYXR0cmlidXRlLgotICAgIHsKLSAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldE1lc3NhZ2UoKTsKLSAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICAgIHJldHVybjsKLSAgICAgIAotICAgICAgU3RyaW5nIHBhcnROYW1lcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuUEFSVFNfQVRUUklCVVRFKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhcnROYW1lcywiICIpOwotICAgICAgU3RyaW5nIHBhcnROYW1lID0gbnVsbDsKLSAgICAgIFBhcnQgbmV3UGFydCA9IG51bGw7Ci0gICAgICBnZXRQYXJ0cygpLmNsZWFyKCk7Ci0gICAgICB3aGlsZShwYXJzZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICBwYXJ0TmFtZSA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgbmV3UGFydCA9IChtZXNzYWdlICE9IG51bGwpID8gKFBhcnQpIG1lc3NhZ2UuZ2V0UGFydChwYXJ0TmFtZSkgOiBudWxsOwotICAgICAgICBpZiAobmV3UGFydCAhPSBudWxsKQotICAgICAgICAgIC8vIERvIG5vdCB1c2UgZ2V0UGFydHMoKSBoZXJlIHNpbmNlIGl0IHdpbGwgcmV0dXJuIGEgbGlzdCBvZgotICAgICAgICAgIC8vIGltcGxpY2l0bHkgY29sbGVjdGVkIHBhcnRzLgotICAgICAgICAgIHBhcnRzLmFkZChuZXdQYXJ0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJvZHlfVXNlKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUsZ2V0VXNlKCkpOwotICAgICAgaWYoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCb2R5X05hbWVzcGFjZVVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFLGdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJvZHlfRW5jb2RpbmdTdHlsZXMoKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlTGlzdCA9IGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlcyA9ICIiOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVuY29kaW5nU3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZW5jb2RpbmdTdHlsZXMuZXF1YWxzKCIiKSkgLy8gZmlyc3QgaXRlcmF0aW9uCi0gICAgICAgICAgICBlbmNvZGluZ1N0eWxlcyArPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgCWVuY29kaW5nU3R5bGVzICs9ICIgIiArIChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZW5jb2RpbmdTdHlsZXMuZXF1YWxzKCIiKSkKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUsZW5jb2RpbmdTdHlsZXMpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIC8vCi0gICAgLy8gVXBkYXRlIHRoZSBlbGVtZW50J3MgInBhcnRzIiBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgLy8KLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsIHx8IGVSZWZlcmVuY2UgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCb2R5X1BhcnRzKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIFVzZWQgdG8gYmUgQnVnemlsbGEgMTA4MTc2LCBub3cgaXQgaXMgQnVnemlsbGEgMTM3OTkwCi0KLSAgICAgICAgU3RyaW5nIHBhcnRzQXR0cmlidXRlVmFsdWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gRG8gbm90IHVzZSBnZXRQYXJ0cygpIGFzIGl0IHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIGltcGxpY2l0IG1lc3NhZ2UKLSAgICAgICAgLy8gcGFydHMuCi0KLSAgICAgICAgaWYgKHBhcnRzICE9IG51bGwgJiYgIXBhcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ0J1ZmZlciBwYXJ0TmFtZXNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJ0cy5pdGVyYXRvcigpOwotCi0gICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gcGFydC5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIHBhcnROYW1lc0J1ZmZlci5hcHBlbmQocGFydE5hbWUpOwotCi0gICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJ0TmFtZXNCdWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwYXJ0c0F0dHJpYnV0ZVZhbHVlID0gcGFydE5hbWVzQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFNPQVBDb25zdGFudHMuUEFSVFNfQVRUUklCVVRFLCBwYXJ0c0F0dHJpYnV0ZVZhbHVlKTsKLSAgICAgIH0gICAgIAotICAgIH0KLSAgfSAKLSAgCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLCBTT0FQQ29uc3RhbnRzLkJPRFlfRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfSAKLSAKLSAgcHJpdmF0ZSBMaXN0IGdldEltcGxpY2l0UGFydHMoKQotICB7Ci0gICAgTGlzdCBpbXBsaWNpdFBhcnRzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0gICAgaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuZ2V0RVBhcnRzKCkuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBpbXBsaWNpdFBhcnRzLmFkZEFsbChtZXNzYWdlLmdldEVQYXJ0cygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGltcGxpY2l0UGFydHM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgCi0gICAgaWYoZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotICAgIHsKLSAgICAgIGlmKCgoQmluZGluZ0lucHV0KWVDb250YWluZXIoKSkuZ2V0RUlucHV0KCkgIT0gbnVsbCkKLSAgCSAgICBtZXNzYWdlID0gKChCaW5kaW5nSW5wdXQpZUNvbnRhaW5lcigpKS5nZXRFSW5wdXQoKS5nZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICBpZihlQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KQotICAgIHsKLSAgICAgIGlmICgoKEJpbmRpbmdPdXRwdXQpZUNvbnRhaW5lcigpKS5nZXRFT3V0cHV0KCkgIT0gbnVsbCkKLSAgCSAgbWVzc2FnZSA9ICgoQmluZGluZ091dHB1dCllQ29udGFpbmVyKCkpLmdldEVPdXRwdXQoKS5nZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICBpZihlQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBCaW5kaW5nRmF1bHQpCi0gICAgewotICAgICAgaWYoKChCaW5kaW5nRmF1bHQpZUNvbnRhaW5lcigpKS5nZXRFRmF1bHQoKSAhPSBudWxsKQotICAJICBtZXNzYWdlID0gKChCaW5kaW5nRmF1bHQpZUNvbnRhaW5lcigpKS5nZXRFRmF1bHQoKS5nZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0KLX0gLy9TT0FQQm9keUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA0ZTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgU09BUEZhY3RvcnkgewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBGYWN0b3J5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0gIHsKLSAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElORzogcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWTogcmV0dXJuIGNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0U6IHJldHVybiBjcmVhdGVTT0FQSGVhZGVyQmFzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUOiByZXR1cm4gY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OOiByZXR1cm4gY3JlYXRlU09BUE9wZXJhdGlvbigpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1M6IHJldHVybiBjcmVhdGVTT0FQQWRkcmVzcygpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVDogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUjogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXIoKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLklTVFJJTkc6Ci0gICAgICAgIHJldHVybiBjcmVhdGVJU3RyaW5nRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5JU1RSSU5HOgotICAgICAgICByZXR1cm4gY29udmVydElTdHJpbmdUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEJpbmRpbmcgY3JlYXRlU09BUEJpbmRpbmcoKQotICB7Ci0gICAgU09BUEJpbmRpbmdJbXBsIHNvYXBCaW5kaW5nID0gbmV3IFNPQVBCaW5kaW5nSW1wbCgpOwotICAgIHJldHVybiBzb2FwQmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQQm9keSBjcmVhdGVTT0FQQm9keSgpCi0gIHsKLSAgICBTT0FQQm9keUltcGwgc29hcEJvZHkgPSBuZXcgU09BUEJvZHlJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBCb2R5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBIZWFkZXJCYXNlIGNyZWF0ZVNPQVBIZWFkZXJCYXNlKCkKLSAgewotICAgIFNPQVBIZWFkZXJCYXNlSW1wbCBzb2FwSGVhZGVyQmFzZSA9IG5ldyBTT0FQSGVhZGVyQmFzZUltcGwoKTsKLSAgICByZXR1cm4gc29hcEhlYWRlckJhc2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEZhdWx0IGNyZWF0ZVNPQVBGYXVsdCgpCi0gIHsKLSAgICBTT0FQRmF1bHRJbXBsIHNvYXBGYXVsdCA9IG5ldyBTT0FQRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQT3BlcmF0aW9uIGNyZWF0ZVNPQVBPcGVyYXRpb24oKQotICB7Ci0gICAgU09BUE9wZXJhdGlvbkltcGwgc29hcE9wZXJhdGlvbiA9IG5ldyBTT0FQT3BlcmF0aW9uSW1wbCgpOwotICAgIHJldHVybiBzb2FwT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBBZGRyZXNzIGNyZWF0ZVNPQVBBZGRyZXNzKCkKLSAgewotICAgIFNPQVBBZGRyZXNzSW1wbCBzb2FwQWRkcmVzcyA9IG5ldyBTT0FQQWRkcmVzc0ltcGwoKTsKLSAgICByZXR1cm4gc29hcEFkZHJlc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEhlYWRlckZhdWx0IGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICBTT0FQSGVhZGVyRmF1bHRJbXBsIHNvYXBIZWFkZXJGYXVsdCA9IG5ldyBTT0FQSGVhZGVyRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXJGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQSGVhZGVyIGNyZWF0ZVNPQVBIZWFkZXIoKQotICB7Ci0gICAgU09BUEhlYWRlckltcGwgc29hcEhlYWRlciA9IG5ldyBTT0FQSGVhZGVySW1wbCgpOwotICAgIHJldHVybiBzb2FwSGVhZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVJU3RyaW5nRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJU3RyaW5nVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUFBhY2thZ2UgZ2V0U09BUFBhY2thZ2UoKQotICB7Ci0gICAgcmV0dXJuIChTT0FQUGFja2FnZSlnZXRFUGFja2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHN0YXRpYyBTT0FQUGFja2FnZSBnZXRQYWNrYWdlKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLX0gLy9TT0FQRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhdWx0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQRmF1bHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODA5YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmF1bHRJbXBsI2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmF1bHRJbXBsI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEZhdWx0SW1wbCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEZhdWx0SW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBGYXVsdCB7Ci0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlKCkgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZSA9IFVTRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZ1N0eWxlcygpIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIEVMaXN0IGVuY29kaW5nU3R5bGVzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUEZhdWx0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQRmF1bHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkKLSAgewotICAgIHJldHVybiB1c2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2UoU3RyaW5nIG5ld1VzZSkKLSAgewotICAgIFN0cmluZyBvbGRVc2UgPSB1c2U7Ci0gICAgdXNlID0gbmV3VXNlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1VTRSwgb2xkVXNlLCB1c2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5ld05hbWVzcGFjZVVSSSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgbmFtZXNwYWNlVVJJID0gbmV3TmFtZXNwYWNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi17Ci0gIHJldHVybiBuYW1lOwotfQotCi1wdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotewotICB0aGlzLm5hbWUgPSBuYW1lOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZ1N0eWxlcyhMaXN0IGxpc3QpCi17Ci0gIGVuY29kaW5nU3R5bGVzID0gKEVMaXN0KWxpc3Q7Ci19Ci0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBMaXN0IGdldEVuY29kaW5nU3R5bGVzKCkKLSAgewotICAgIGlmIChlbmNvZGluZ1N0eWxlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVuY29kaW5nU3R5bGVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19VU0U6Ci0gICAgICAgIHNldFVzZShVU0VfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fVVNFOgotICAgICAgICByZXR1cm4gVVNFX0VERUZBVUxUID09IG51bGwgPyB1c2UgIT0gbnVsbCA6ICFVU0VfRURFRkFVTFQuZXF1YWxzKHVzZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh1c2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodXNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5jb2RpbmdTdHlsZXM6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RpbmdTdHlsZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldE5hbWUKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSkpOwotICAgIHNldE5hbWVzcGFjZVVSSQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLk5BTUVTUEFDRV9VUklfQVRUUklCVVRFKSk7Ci0gICAgc2V0VXNlCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSkpOwotICAgIAotICAgIC8vIFRCRCAtIGhhbmRsZSBlbmNvZGluZ1N0eWxlcwotICAgIAotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSxnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9Vc2UoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSxnZXRVc2UoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9FbmNvZGluZ1N0eWxlcygpKQotCSAgewotCSAgICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlTGlzdCA9IGdldEVuY29kaW5nU3R5bGVzKCk7Ci0JICAgICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSAiIjsKLQkgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZW5jb2RpbmdTdHlsZUxpc3QuaXRlcmF0b3IoKTsKLQkgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGlmIChlbmNvZGluZ1N0eWxlcy5lcXVhbHMoIiIpKSAvLyBmaXJzdCBpdGVyYXRpb24KLQkgICAgICAgICAgICBlbmNvZGluZ1N0eWxlcyArPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkgICAgICAgICAgZWxzZQotCSAgICAgICAgICAJZW5jb2RpbmdTdHlsZXMgKz0gIiAiICsgKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAoIWVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpCi0JICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLkVOQ09ESU5HX1NUWUxFX0FUVFJJQlVURSxlbmNvZGluZ1N0eWxlcyk7Ci0JICAgICAgfSAvLyBUQkQgLSBJcyB0aGlzIHRoZSBwcm9wZXIgd2F5IHRvIGhhbmRsZSBlbmNvZGluZ1N0eWxlcwotICAgICAgaWYgKGdldE5hbWUoKSAhPSBudWxsKQotICAgICAgCW5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLGdldE5hbWUoKSk7IC8vIFJldmlzaXQgUm9zZSBtb2RlbAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5TT0FQX05BTUVTUEFDRV9VUkksIFNPQVBDb25zdGFudHMuRkFVTFRfRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotCi19IC8vU09BUEZhdWx0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyQmFzZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckJhc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjY2MzYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyQmFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWFkZXIgQmFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsI2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJCYXNlSW1wbCNnZXRQYXJ0IDxlbT5QYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlckJhc2VJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEhlYWRlckJhc2UgewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2UoKSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2UgPSBVU0VfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmdTdHlsZXMoKSA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBFTGlzdCBlbmNvZGluZ1N0eWxlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2UoKSA8ZW0+TWVzc2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydCgpIDxlbT5QYXJ0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBQYXJ0IHBhcnQgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQSGVhZGVyQmFzZUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkKLSAgewotICAgIHJldHVybiB1c2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2UoU3RyaW5nIG5ld1VzZSkKLSAgewotICAgIFN0cmluZyBvbGRVc2UgPSB1c2U7Ci0gICAgdXNlID0gbmV3VXNlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1VTRSwgb2xkVXNlLCB1c2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5ld05hbWVzcGFjZVVSSSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgbmFtZXNwYWNlVVJJID0gbmV3TmFtZXNwYWNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RW5jb2RpbmdTdHlsZXMoKQotICB7Ci0gICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwpCi0gICAgewotICAgICAgZW5jb2RpbmdTdHlsZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVMpOwotICAgIH0KLSAgICByZXR1cm4gZW5jb2RpbmdTdHlsZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIE1lc3NhZ2Ugb2xkTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICBtZXNzYWdlID0gKE1lc3NhZ2UpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KW1lc3NhZ2UpOwotICAgICAgaWYgKG1lc3NhZ2UgIT0gb2xkTWVzc2FnZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFLCBvbGRNZXNzYWdlLCBtZXNzYWdlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE1lc3NhZ2UgYmFzaWNHZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShNZXNzYWdlIG5ld01lc3NhZ2UpCi0gIHsKLSAgICBNZXNzYWdlIG9sZE1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0UsIG9sZE1lc3NhZ2UsIG1lc3NhZ2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBQYXJ0IGdldFBhcnQoKQotICB7Ci0gICAgaWYgKHBhcnQgIT0gbnVsbCAmJiBwYXJ0LmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgUGFydCBvbGRQYXJ0ID0gcGFydDsKLSAgICAgIHBhcnQgPSAoUGFydCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcGFydCk7Ci0gICAgICBpZiAocGFydCAhPSBvbGRQYXJ0KQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1BBUlQsIG9sZFBhcnQsIHBhcnQpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBhcnQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgUGFydCBiYXNpY0dldFBhcnQoKQotICB7Ci0gICAgcmV0dXJuIHBhcnQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0KFBhcnQgbmV3UGFydCkKLSAgewotICAgIFBhcnQgb2xkUGFydCA9IHBhcnQ7Ci0gICAgcGFydCA9IG5ld1BhcnQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUEFSVCwgb2xkUGFydCwgcGFydCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0TWVzc2FnZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19QQVJUOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFBhcnQoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0UGFydCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRToKLSAgICAgICAgc2V0TWVzc2FnZSgoTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUEFSVDoKLSAgICAgICAgc2V0UGFydCgoUGFydCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19VU0U6Ci0gICAgICAgIHNldFVzZShVU0VfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1BBUlQ6Ci0gICAgICAgIHNldFBhcnQoKFBhcnQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1VTRToKLSAgICAgICAgcmV0dXJuIFVTRV9FREVGQVVMVCA9PSBudWxsID8gdXNlICE9IG51bGwgOiAhVVNFX0VERUZBVUxULmVxdWFscyh1c2UpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICByZXR1cm4gZW5jb2RpbmdTdHlsZXMgIT0gbnVsbCAmJiAhZW5jb2RpbmdTdHlsZXMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOgotICAgICAgICByZXR1cm4gbWVzc2FnZSAhPSBudWxsOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19QQVJUOgotICAgICAgICByZXR1cm4gcGFydCAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAodXNlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVzZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBuYW1lc3BhY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobmFtZXNwYWNlVVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVuY29kaW5nU3R5bGVzOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVuY29kaW5nU3R5bGVzKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFKSkKLSAgICAgIHNldFVzZShjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFKSk7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpKQotICAgICAgc2V0TmFtZXNwYWNlVVJJKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpKTsKLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFKSkgCi0gICAgewotICAgICAgU3RyaW5nIGVuY29kaW5nU3R5bGVzID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVuY29kaW5nU3R5bGVzKTsKLSAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgCWdldEVuY29kaW5nU3R5bGVzKCkuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgfSAKLSAgICAKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuTUVTU0FHRV9BVFRSSUJVVEUpKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIFFOYW1lIG1lc3NhZ2VRTmFtZSA9IGNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuTUVTU0FHRV9BVFRSSUJVVEUpLCBlbGVtZW50KTsKLSAgICAgIE1lc3NhZ2UgbmV3TWVzc2FnZSA9IChtZXNzYWdlUU5hbWUgIT0gbnVsbCkgPyAoTWVzc2FnZSkgZGVmaW5pdGlvbi5nZXRNZXNzYWdlKG1lc3NhZ2VRTmFtZSkgOiBudWxsOwotICAgICAgaWYgKG5ld01lc3NhZ2UgIT0gbnVsbCAmJiBuZXdNZXNzYWdlICE9IGdldE1lc3NhZ2UoKSkKLSAgICAgICAgc2V0TWVzc2FnZShuZXdNZXNzYWdlKTsKLSAgICAgIAotICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLlBBUlRfQVRUUklCVVRFKTsKLSAgICAgICAgUGFydCBuZXdQYXJ0ID0gKG5ld01lc3NhZ2UgIT0gbnVsbCkgPyAoUGFydCkgbmV3TWVzc2FnZS5nZXRQYXJ0KHBhcnROYW1lKSA6IG51bGw7Ci0gICAgICAgIGlmIChuZXdQYXJ0ICE9IG51bGwgJiYgbmV3UGFydCAhPSBnZXRQYXJ0KCkpCi0gICAgICAgICAgc2V0UGFydChuZXdQYXJ0KTsKLSAgICAgIH0gICAKLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQkgIAotIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXJCYXNlX1VzZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFLGdldFVzZSgpKTsKLSAgICAgIGlmKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSxnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXJCYXNlX0VuY29kaW5nU3R5bGVzKCkpCi0gICAgICB7Ci0gICAgICAgIExpc3QgZW5jb2RpbmdTdHlsZUxpc3QgPSBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSAiIjsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmNvZGluZ1N0eWxlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpIC8vIGZpcnN0IGl0ZXJhdGlvbgotICAgICAgICAgICAgZW5jb2RpbmdTdHlsZXMgKz0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgZWxzZQotICAJICAgICAgICBlbmNvZGluZ1N0eWxlcyArPSAiICIgKyAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpCi0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFLGVuY29kaW5nU3R5bGVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZVJlZmVyZW5jZShlUmVmZXJlbmNlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsIHx8IGVSZWZlcmVuY2UgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXJCYXNlX01lc3NhZ2UoKSkKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUU5hbWUgcU5hbWUgPSBtZXNzYWdlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFNPQVBDb25zdGFudHMuTUVTU0FHRV9BVFRSSUJVVEUsIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIiMiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfUGFydCgpKQotICAgICAgewotICAgICAgICBQYXJ0IHBhcnQgPSBnZXRQYXJ0KCk7Ci0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBwYXJ0LmdldE5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFNPQVBDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUscGFydE5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19IC8vU09BUEhlYWRlckJhc2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJGYXVsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckZhdWx0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDMyNDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckZhdWx0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlciBGYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJGYXVsdEltcGwgZXh0ZW5kcyBTT0FQSGVhZGVyQmFzZUltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyRmF1bHQgewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUEhlYWRlckZhdWx0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyRmF1bHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0TWVzc2FnZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUEFSVDoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRQYXJ0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFBhcnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fTUVTU0FHRToKLSAgICAgICAgc2V0TWVzc2FnZSgoTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1BBUlQ6Ci0gICAgICAgIHNldFBhcnQoKFBhcnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19VU0U6Ci0gICAgICAgIHNldFVzZShVU0VfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19QQVJUOgotICAgICAgICBzZXRQYXJ0KChQYXJ0KW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1VTRToKLSAgICAgICAgcmV0dXJuIFVTRV9FREVGQVVMVCA9PSBudWxsID8gdXNlICE9IG51bGwgOiAhVVNFX0VERUZBVUxULmVxdWFscyh1c2UpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICByZXR1cm4gbWVzc2FnZSAhPSBudWxsOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUEFSVDoKLSAgICAgICAgcmV0dXJuIHBhcnQgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0gIAotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotICB7Ci0gICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpCi0gICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSwgU09BUENvbnN0YW50cy5IRUFERVJfRkFVTFRfRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfSAKLQotfSAvL1NPQVBIZWFkZXJGYXVsdEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2MjQxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckltcGwjZ2V0SGVhZGVyRmF1bHRzIDxlbT5IZWFkZXIgRmF1bHRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlckltcGwgZXh0ZW5kcyBTT0FQSGVhZGVyQmFzZUltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyIHsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlYWRlckZhdWx0cygpIDxlbT5IZWFkZXIgRmF1bHRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0SGVhZGVyRmF1bHRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaGVhZGVyRmF1bHRzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUEhlYWRlckltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVMaXN0IGdldEhlYWRlckZhdWx0cygpCi0gIHsKLSAgICBpZiAoaGVhZGVyRmF1bHRzID09IG51bGwpCi0gICAgewotICAgICAgaGVhZGVyRmF1bHRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNPQVBIZWFkZXJGYXVsdC5jbGFzcywgdGhpcywgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFMpOwotICAgIH0KLSAgICByZXR1cm4gaGVhZGVyRmF1bHRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEhlYWRlckZhdWx0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fVVNFOgotICAgICAgICByZXR1cm4gZ2V0VXNlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTUVTU0FHRToKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldE1lc3NhZ2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1BBUlQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFydCgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRQYXJ0KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTOgotICAgICAgICByZXR1cm4gZ2V0SGVhZGVyRmF1bHRzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1VTRToKLSAgICAgICAgc2V0VXNlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX01FU1NBR0U6Ci0gICAgICAgIHNldE1lc3NhZ2UoKE1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19QQVJUOgotICAgICAgICBzZXRQYXJ0KChQYXJ0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUzoKLSAgICAgICAgZ2V0SGVhZGVyRmF1bHRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0SGVhZGVyRmF1bHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fVVNFOgotICAgICAgICBzZXRVc2UoVVNFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTUVTU0FHRToKLSAgICAgICAgc2V0TWVzc2FnZSgoTWVzc2FnZSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUEFSVDoKLSAgICAgICAgc2V0UGFydCgoUGFydCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUzoKLSAgICAgICAgZ2V0SGVhZGVyRmF1bHRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19VU0U6Ci0gICAgICAgIHJldHVybiBVU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzZSAhPSBudWxsIDogIVVTRV9FREVGQVVMVC5lcXVhbHModXNlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICByZXR1cm4gZW5jb2RpbmdTdHlsZXMgIT0gbnVsbCAmJiAhZW5jb2RpbmdTdHlsZXMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UgIT0gbnVsbDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1BBUlQ6Ci0gICAgICAgIHJldHVybiBwYXJ0ICE9IG51bGw7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTOgotICAgICAgICByZXR1cm4gaGVhZGVyRmF1bHRzICE9IG51bGwgJiYgIWhlYWRlckZhdWx0cy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBpZiAoU09BUENvbnN0YW50cy5IRUFERVJfRkFVTFRfRUxFTUVOVF9UQUcuZXF1YWxzKGNoaWxkLmdldExvY2FsTmFtZSgpKSkKLSAgICB7Ci0gICAgICBTT0FQSGVhZGVyRmF1bHQgZmF1bHQgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlckZhdWx0KCk7Ci0gICAgICBmYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBmYXVsdC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgIGdldEhlYWRlckZhdWx0cygpLmFkZChmYXVsdCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgU09BUEhlYWRlciBoZWFkZXIgPSAoU09BUEhlYWRlcikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFNPQVBIZWFkZXJGYXVsdCkKLSAgICB7Ci0gICAgICBoZWFkZXIuZ2V0SGVhZGVyRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLCBTT0FQQ29uc3RhbnRzLkhFQURFUl9FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9IAotCi19IC8vU09BUEhlYWRlckltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUE9wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUE9wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0ZTI3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBPcGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUE9wZXJhdGlvbkltcGwjZ2V0U29hcEFjdGlvblVSSSA8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQT3BlcmF0aW9uSW1wbCNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQT3BlcmF0aW9uSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBPcGVyYXRpb24gewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBBY3Rpb25VUkkoKSA8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFNvYXBBY3Rpb25VUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBBY3Rpb25VUkkoKSA8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFNvYXBBY3Rpb25VUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgc29hcEFjdGlvblVSSSA9IFNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0eWxlKCkgPGVtPlN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFN0eWxlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0eWxlKCkgPGVtPlN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFN0eWxlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN0eWxlID0gU1RZTEVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBPcGVyYXRpb25JbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBPcGVyYXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U29hcEFjdGlvblVSSSgpCi0gIHsKLSAgICByZXR1cm4gc29hcEFjdGlvblVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFNvYXBBY3Rpb25VUkkoU3RyaW5nIG5ld1NvYXBBY3Rpb25VUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkU29hcEFjdGlvblVSSSA9IHNvYXBBY3Rpb25VUkk7Ci0gICAgc29hcEFjdGlvblVSSSA9IG5ld1NvYXBBY3Rpb25VUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSSwgb2xkU29hcEFjdGlvblVSSSwgc29hcEFjdGlvblVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRTdHlsZSgpCi0gIHsKLSAgICByZXR1cm4gc3R5bGU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHJpbmcgbmV3U3R5bGUpCi0gIHsKLSAgICBTdHJpbmcgb2xkU3R5bGUgPSBzdHlsZTsKLSAgICBzdHlsZSA9IG5ld1N0eWxlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJOgotICAgICAgICByZXR1cm4gZ2V0U29hcEFjdGlvblVSSSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHJldHVybiBnZXRTdHlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TT0FQX0FDVElPTl9VUkk6Ci0gICAgICAgIHNldFNvYXBBY3Rpb25VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICBzZXRTdHlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJOgotICAgICAgICBzZXRTb2FwQWN0aW9uVVJJKFNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICBzZXRTdHlsZShTVFlMRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJOgotICAgICAgICByZXR1cm4gU09BUF9BQ1RJT05fVVJJX0VERUZBVUxUID09IG51bGwgPyBzb2FwQWN0aW9uVVJJICE9IG51bGwgOiAhU09BUF9BQ1RJT05fVVJJX0VERUZBVUxULmVxdWFscyhzb2FwQWN0aW9uVVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICByZXR1cm4gU1RZTEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0eWxlICE9IG51bGwgOiAhU1RZTEVfRURFRkFVTFQuZXF1YWxzKHN0eWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHNvYXBBY3Rpb25VUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc29hcEFjdGlvblVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBzdHlsZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChzdHlsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0U29hcEFjdGlvblVSSQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLlNPQVBfQUNUSU9OX0FUVFJJQlVURSkpOwotICAgIHNldFN0eWxlCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuU1RZTEVfQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUE9wZXJhdGlvbl9Tb2FwQWN0aW9uVVJJKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLlNPQVBfQUNUSU9OX0FUVFJJQlVURSxnZXRTb2FwQWN0aW9uVVJJKCkpOwotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQT3BlcmF0aW9uX1N0eWxlKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLlNUWUxFX0FUVFJJQlVURSxnZXRTdHlsZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLCBTT0FQQ29uc3RhbnRzLk9QRVJBVElPTl9FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9IAotCi19IC8vU09BUE9wZXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTFkMTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBTT0FQUGFja2FnZSB7Ci0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBCaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwQm9keUVDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEhlYWRlckJhc2VFQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBGYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcE9wZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEFkZHJlc3NFQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBIZWFkZXJGYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEhlYWRlckVDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaVN0cmluZ0VEYXRhVHlwZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLSAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLSAgICogcGFja2FnZSBVUkkgdmFsdWUuCi0gICAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLSAgICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLSAgICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLSAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNlTlNfVVJJCi0gICAqIEBzZWUgI2luaXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgU09BUFBhY2thZ2VJbXBsKCkKLSAgewotICAgIHN1cGVyKGVOU19VUkksIFNPQVBGYWN0b3J5LmVJTlNUQU5DRSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotICAgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotICAgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotICAgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLSAgICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotICAgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotICAgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0gICAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotICAgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0gICAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0gICAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0gICAqIHRob3NlIG9mIGFub3RoZXIuCi0gICAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLSAgICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNlTlNfVVJJCi0gICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBzdGF0aWMgU09BUFBhY2thZ2UgaW5pdCgpCi0gIHsKLSAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoU09BUFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFNPQVBQYWNrYWdlLmVOU19VUkkpOwotCi0gICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZS4KLSAgICBTT0FQUGFja2FnZUltcGwgdGhlU09BUFBhY2thZ2UgPSAoU09BUFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBTT0FQUGFja2FnZUltcGwoKSk7Ci0KLSAgICBpc0luaXRlZCA9IHRydWU7Ci0KLSAgICAvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLSAgICBYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLSAgICAvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotICAgIFdTRExQYWNrYWdlSW1wbCB0aGVXU0RMUGFja2FnZSA9IChXU0RMUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChXU0RMUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFdTRExQYWNrYWdlLmVOU19VUkkpIDogV1NETFBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7Ci0KLSAgICAvLyBTdGVwIDE6IGNyZWF0ZSBtZXRhLW1vZGVsIG9iamVjdHMKLSAgICB0aGVTT0FQUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLSAgICB0aGVXU0RMUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotICAgIC8vIFN0ZXAgMjogY29tcGxldGUgaW5pdGlhbGl6YXRpb24KLSAgICB0aGVTT0FQUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0gICAgdGhlV1NETFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgcmV0dXJuIHRoZVNPQVBQYWNrYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQQmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gc29hcEJpbmRpbmdFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQmluZGluZ19UcmFuc3BvcnRVUkkoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBCaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQmluZGluZ19TdHlsZSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEJpbmRpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUEJvZHkoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBCb2R5RUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfVXNlKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwQm9keUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfTmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwQm9keUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfRW5jb2RpbmdTdHlsZXMoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBCb2R5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTT0FQQm9keV9QYXJ0cygpCi0gIHsKLSAgICByZXR1cm4gKEVSZWZlcmVuY2Upc29hcEJvZHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUEhlYWRlckJhc2UoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXJCYXNlRUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEhlYWRlckJhc2VfVXNlKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwSGVhZGVyQmFzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEhlYWRlckJhc2VfTmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwSGVhZGVyQmFzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEhlYWRlckJhc2VfRW5jb2RpbmdTdHlsZXMoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyQmFzZV9NZXNzYWdlKCkKLSAgewotICAgIHJldHVybiAoRVJlZmVyZW5jZSlzb2FwSGVhZGVyQmFzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlckJhc2VfUGFydCgpCi0gIHsKLSAgICByZXR1cm4gKEVSZWZlcmVuY2Upc29hcEhlYWRlckJhc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUEZhdWx0KCkKLSAgewotICAgIHJldHVybiBzb2FwRmF1bHRFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQRmF1bHRfVXNlKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwRmF1bHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBGYXVsdF9OYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEZhdWx0X0VuY29kaW5nU3R5bGVzKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwRmF1bHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUE9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gc29hcE9wZXJhdGlvbkVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBPcGVyYXRpb25fU29hcEFjdGlvblVSSSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcE9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUE9wZXJhdGlvbl9TdHlsZSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcE9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQQWRkcmVzcygpCi0gIHsKLSAgICByZXR1cm4gc29hcEFkZHJlc3NFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQWRkcmVzc19Mb2NhdGlvblVSSSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEFkZHJlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUEhlYWRlckZhdWx0KCkKLSAgewotICAgIHJldHVybiBzb2FwSGVhZGVyRmF1bHRFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBIZWFkZXIoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXJFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyX0hlYWRlckZhdWx0cygpCi0gIHsKLSAgICByZXR1cm4gKEVSZWZlcmVuY2Upc29hcEhlYWRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRJU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBpU3RyaW5nRURhdGFUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBGYWN0b3J5IGdldFNPQVBGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiAoU09BUEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLSAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gIHsKLSAgICBpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0gICAgaXNDcmVhdGVkID0gdHJ1ZTsKLQotICAgIC8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotICAgIHNvYXBCaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfQklORElORyk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwQmluZGluZ0VDbGFzcywgU09BUF9CSU5ESU5HX19UUkFOU1BPUlRfVVJJKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBCaW5kaW5nRUNsYXNzLCBTT0FQX0JJTkRJTkdfX1NUWUxFKTsKLQotICAgIHNvYXBCb2R5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfQk9EWSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwQm9keUVDbGFzcywgU09BUF9CT0RZX19VU0UpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEJvZHlFQ2xhc3MsIFNPQVBfQk9EWV9fTkFNRVNQQUNFX1VSSSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwQm9keUVDbGFzcywgU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVMpOwotICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc29hcEJvZHlFQ2xhc3MsIFNPQVBfQk9EWV9fUEFSVFMpOwotCi0gICAgc29hcEhlYWRlckJhc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9IRUFERVJfQkFTRSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwSGVhZGVyQmFzZUVDbGFzcywgU09BUF9IRUFERVJfQkFTRV9fVVNFKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBIZWFkZXJCYXNlRUNsYXNzLCBTT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBIZWFkZXJCYXNlRUNsYXNzLCBTT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVMpOwotICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0UpOwotICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBfSEVBREVSX0JBU0VfX1BBUlQpOwotCi0gICAgc29hcEZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfRkFVTFQpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEZhdWx0RUNsYXNzLCBTT0FQX0ZBVUxUX19VU0UpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEZhdWx0RUNsYXNzLCBTT0FQX0ZBVUxUX19OQU1FU1BBQ0VfVVJJKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBGYXVsdEVDbGFzcywgU09BUF9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTKTsKLQotICAgIHNvYXBPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9PUEVSQVRJT04pOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcE9wZXJhdGlvbkVDbGFzcywgU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwT3BlcmF0aW9uRUNsYXNzLCBTT0FQX09QRVJBVElPTl9fU1RZTEUpOwotCi0gICAgc29hcEFkZHJlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9BRERSRVNTKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBBZGRyZXNzRUNsYXNzLCBTT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSk7Ci0KLSAgICBzb2FwSGVhZGVyRmF1bHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9IRUFERVJfRkFVTFQpOwotCi0gICAgc29hcEhlYWRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0hFQURFUik7Ci0gICAgY3JlYXRlRVJlZmVyZW5jZShzb2FwSGVhZGVyRUNsYXNzLCBTT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUyk7Ci0KLSAgICAvLyBDcmVhdGUgZGF0YSB0eXBlcwotICAgIGlTdHJpbmdFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSVNUUklORyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotICAgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotICB7Ci0gICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotICAgIC8vIEluaXRpYWxpemUgcGFja2FnZQotICAgIHNldE5hbWUoZU5BTUUpOwotICAgIHNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotICAgIHNldE5zVVJJKGVOU19VUkkpOwotCi0gICAgLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotICAgIFdTRExQYWNrYWdlSW1wbCB0aGVXU0RMUGFja2FnZSA9IChXU0RMUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSk7Ci0KLSAgICAvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0gICAgc29hcEJpbmRpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0gICAgc29hcEJvZHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0gICAgc29hcEhlYWRlckJhc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0gICAgc29hcEZhdWx0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgIHNvYXBPcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0gICAgc29hcEFkZHJlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0gICAgc29hcEhlYWRlckZhdWx0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U09BUEhlYWRlckJhc2UoKSk7Ci0gICAgc29hcEhlYWRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNPQVBIZWFkZXJCYXNlKCkpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLSAgICBpbml0RUNsYXNzKHNvYXBCaW5kaW5nRUNsYXNzLCBTT0FQQmluZGluZy5jbGFzcywgIlNPQVBCaW5kaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQmluZGluZ19UcmFuc3BvcnRVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRyYW5zcG9ydFVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEJpbmRpbmdfU3R5bGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInN0eWxlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcEJvZHlFQ2xhc3MsIFNPQVBCb2R5LmNsYXNzLCAiU09BUEJvZHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBCb2R5X1VzZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXNlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQm9keV9OYW1lc3BhY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEJvZHlfRW5jb2RpbmdTdHlsZXMoKSwgdGhpcy5nZXRJU3RyaW5nKCksICJlbmNvZGluZ1N0eWxlcyIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFUmVmZXJlbmNlKGdldFNPQVBCb2R5X1BhcnRzKCksIHRoZVdTRExQYWNrYWdlLmdldFBhcnQoKSwgbnVsbCwgInBhcnRzIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBIZWFkZXJCYXNlRUNsYXNzLCBTT0FQSGVhZGVyQmFzZS5jbGFzcywgIlNPQVBIZWFkZXJCYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQSGVhZGVyQmFzZV9Vc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVzZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEhlYWRlckJhc2VfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBIZWFkZXJCYXNlX0VuY29kaW5nU3R5bGVzKCksIHRoaXMuZ2V0SVN0cmluZygpLCAiZW5jb2RpbmdTdHlsZXMiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RVJlZmVyZW5jZShnZXRTT0FQSGVhZGVyQmFzZV9NZXNzYWdlKCksIHRoZVdTRExQYWNrYWdlLmdldE1lc3NhZ2UoKSwgbnVsbCwgIm1lc3NhZ2UiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFUmVmZXJlbmNlKGdldFNPQVBIZWFkZXJCYXNlX1BhcnQoKSwgdGhlV1NETFBhY2thZ2UuZ2V0UGFydCgpLCBudWxsLCAicGFydCIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBGYXVsdEVDbGFzcywgU09BUEZhdWx0LmNsYXNzLCAiU09BUEZhdWx0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQRmF1bHRfVXNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1c2UiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBGYXVsdF9OYW1lc3BhY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEZhdWx0X0VuY29kaW5nU3R5bGVzKCksIHRoaXMuZ2V0SVN0cmluZygpLCAiZW5jb2RpbmdTdHlsZXMiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcE9wZXJhdGlvbkVDbGFzcywgU09BUE9wZXJhdGlvbi5jbGFzcywgIlNPQVBPcGVyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBPcGVyYXRpb25fU29hcEFjdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic29hcEFjdGlvblVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUE9wZXJhdGlvbl9TdHlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3R5bGUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwQWRkcmVzc0VDbGFzcywgU09BUEFkZHJlc3MuY2xhc3MsICJTT0FQQWRkcmVzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEFkZHJlc3NfTG9jYXRpb25VUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2F0aW9uVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcEhlYWRlckZhdWx0RUNsYXNzLCBTT0FQSGVhZGVyRmF1bHQuY2xhc3MsICJTT0FQSGVhZGVyRmF1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwSGVhZGVyRUNsYXNzLCBTT0FQSGVhZGVyLmNsYXNzLCAiU09BUEhlYWRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVSZWZlcmVuY2UoZ2V0U09BUEhlYWRlcl9IZWFkZXJGYXVsdHMoKSwgdGhpcy5nZXRTT0FQSGVhZGVyRmF1bHQoKSwgbnVsbCwgImhlYWRlckZhdWx0cyIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0gICAgaW5pdEVEYXRhVHlwZShpU3RyaW5nRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJJU3RyaW5nIiwgSVNfU0VSSUFMSVpBQkxFKTsKLQotICAgIC8vIENyZWF0ZSByZXNvdXJjZQotICAgIGNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotICB9Ci19IC8vU09BUFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiZTAzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotICAvKioKLSAgICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgU09BUFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICBpZiAobW9kZWxQYWNrYWdlID09IG51bGwpCi0gICAgewotICAgICAgbW9kZWxQYWNrYWdlID0gU09BUFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0gICAgbmV3IFNPQVBTd2l0Y2goKQotICAgIHsKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBCaW5kaW5nKFNPQVBCaW5kaW5nIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUEJvZHkoU09BUEJvZHkgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEJvZHlBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyQmFzZShTT0FQSGVhZGVyQmFzZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQSGVhZGVyQmFzZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBGYXVsdChTT0FQRmF1bHQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEZhdWx0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQQWRkcmVzc0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBIZWFkZXJGYXVsdChTT0FQSGVhZGVyRmF1bHQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEhlYWRlckZhdWx0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlcihTT0FQSGVhZGVyIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotICAgICAgfQotICAgIH07Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLSAgICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gIHsKLSAgICByZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nIDxlbT5CaW5kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBCaW5kaW5nQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSA8ZW0+Qm9keTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQQm9keUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UgPGVtPkhlYWRlciBCYXNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJCYXNlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQgPGVtPkZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQRmF1bHRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBPcGVyYXRpb25BZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzIDxlbT5BZGRyZXNzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBBZGRyZXNzQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQgPGVtPkhlYWRlciBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckZhdWx0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19IC8vU09BUEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmYzNDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTT0FQQ29uc3RhbnRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTX0VMRU1FTlRfVEFHID0gImFkZHJlc3MiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0VMRU1FTlRfVEFHID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0VMRU1FTlRfVEFHID0gImJvZHkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9FTEVNRU5UX1RBRyA9ICJmYXVsdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9FTEVNRU5UX1RBRyA9ICJoZWFkZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRkFVTFRfRUxFTUVOVF9UQUcgPSAiaGVhZGVyZmF1bHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fRUxFTUVOVF9UQUcgPSAib3BlcmF0aW9uIjsKLQkgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7Ci0gCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfQUNUSU9OX0FUVFJJQlVURSA9InNvYXBBY3Rpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9BVFRSSUJVVEUgPSJzdHlsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0FUVFJJQlVURSA9ImxvY2F0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0FUVFJJQlVURSA9InRyYW5zcG9ydCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9BVFRSSUJVVEUgPSJ1c2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRUUklCVVRFID0ibmFtZXNwYWNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9BVFRSSUJVVEUgPSJuYW1lc3BhY2VVUkkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFJJQlVURSA9Im5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19TVFlMRV9BVFRSSUJVVEUgPSJlbmNvZGluZ1N0eWxlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9BVFRSSUJVVEUgPSJtZXNzYWdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9BVFRSSUJVVEUgPSJwYXJ0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVFNfQVRUUklCVVRFID0icGFydHMiOwotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTNhOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU09BUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBpbXBsZW1lbnRzIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotewotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIGlmIChTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICBpZiAoU09BUENvbnN0YW50cy5BRERSRVNTX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBBZGRyZXNzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTT0FQQ29uc3RhbnRzLkJJTkRJTkdfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEJpbmRpbmcoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNPQVBDb25zdGFudHMuQk9EWV9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQm9keSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU09BUENvbnN0YW50cy5GQVVMVF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBGYXVsdCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU09BUENvbnN0YW50cy5PUEVSQVRJT05fRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQT3BlcmF0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTT0FQQ29uc3RhbnRzLkhFQURFUl9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXIoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNPQVBDb25zdGFudHMuSEVBREVSX0ZBVUxUX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlckZhdWx0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJVbmhhbmRsZWQgbG9jYWxOYW1lOiAiICsgbG9jYWxOYW1lKTsKLSAgICAgICAgcmV0dXJuIFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJVbmhhbmRsZWQgbmFtZXNwYWNlOiAiICsgbmFtZXNwYWNlKTsKLSAgICAgIHJldHVybiBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWFjOGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUFN3aXRjaCB7Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNPQVBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQU3dpdGNoKCkKLSAgewotICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtb2RlbFBhY2thZ2UgPSBTT0FQUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KQotICB7Ci0gICAgRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0gICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotICAgICAgewotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElORzoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQQmluZGluZyhzb2FwQmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBCaW5kaW5nKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWToKLSAgICAgICAgewotICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQQm9keShzb2FwQm9keSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJvZHkpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBCb2R5KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJvZHkpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0U6Ci0gICAgICAgIHsKLSAgICAgICAgICBTT0FQSGVhZGVyQmFzZSBzb2FwSGVhZGVyQmFzZSA9IChTT0FQSGVhZGVyQmFzZSl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlU09BUEhlYWRlckJhc2Uoc29hcEhlYWRlckJhc2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJCYXNlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChzb2FwSGVhZGVyQmFzZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJCYXNlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IChTT0FQRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBGYXVsdChzb2FwRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTjoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IChTT0FQT3BlcmF0aW9uKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQT3BlcmF0aW9uKHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwT3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1M6Ci0gICAgICAgIHsKLSAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcyl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlU09BUEFkZHJlc3Moc29hcEFkZHJlc3MpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChzb2FwQWRkcmVzcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVDoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBIZWFkZXJGYXVsdCBzb2FwSGVhZGVyRmF1bHQgPSAoU09BUEhlYWRlckZhdWx0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyRmF1bHQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyQmFzZShzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUjoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyKHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNPQVBIZWFkZXJCYXNlKHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwSGVhZGVyKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEJpbmRpbmcoU09BUEJpbmRpbmcgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJvZHk8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Qm9keTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEJvZHkoU09BUEJvZHkgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBCYXNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBCYXNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyQmFzZShTT0FQSGVhZGVyQmFzZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBGYXVsdChTT0FQRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRkcmVzczwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZGRyZXNzPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlckZhdWx0KFNPQVBIZWFkZXJGYXVsdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlcjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlcihTT0FQSGVhZGVyIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19IC8vU09BUFN3aXRjaApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU0MzQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XU0RMIE1vZGVsIFNPQVAgQmluZGluZyBFeHRlbnNpb24gQVBJIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+Ci0gICAgICAgIFRoZSBXU0RMIG1vZGVsIEFQSSBhbGxvd3MgY2xpZW50cyB0byB3b3JrIHdpdGggdGhlIFdTREwgMS4xIGRvY3VtZW50cy4KLQkJPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIGxvYWQsIG1vZGlmeSwgYW5kIHNhdmUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9wYWNrYWdlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmNiOTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotCTxoZWFkPgotCQk8bWV0YQotCQkJbmFtZT0icm9vdCIKLQkKLQkJCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQkJPHRpdGxlPldTREwgTW9kZWwgU09BUCBCaW5kaW5nIEV4dGVuc2lvbiBBUEkgT3ZlcnZpZXc8L3RpdGxlPgotCTwvaGVhZD4KLQotCTxib2R5PgotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoZSBXU0RMIG1vZGVsIEFQSSBhbGxvd3MgY2xpZW50cyB0byB3b3JrIHdpdGggdGhlIFdTREwgMS4xIGRvY3VtZW50cy4KLQkJPC9hYnN0cmFjdD4KLQkJPHA+VGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIGxvYWQsIG1vZGlmeSwgYW5kIHNhdmUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L3A+IAotCTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvV1NETC5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL21vZGVsL1dTREwubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNmMjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvV1NETC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAyMyArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0MgotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJVFJVRQotCWdyaWRYICAgICAgCTE2Ci0JZ3JpZFkgICAgICAJMTYKLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250Ci0JICAgIHNpemUgICAgICAgCTEwCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkgICAgY29sb3IgICAgICAJMAotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCXNob3dNZXNzYWdlTnVtIAkxCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUKLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NCIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3OCIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjMiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3IgotCXF1aWR1ICAgICAgCSIzOUUyN0YwODAwNjUiCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCIKLQkJcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSIKLQkJZG9jdW1lbnRhdGlvbiAJCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuCi18Ci18V1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50LgotfAotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuCi18Ci18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkKLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQotfC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETAotfC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLgotfAotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLgotCQkKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiCi0JCQkJcmVzdWx0ICAgICAJIkRlZmluaXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUU5REU5ODAwM0MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRTIwMTcxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ3MjYwMUFDIgotCQkJCXR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQkREOTY0MzAwNEMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjIzNTAwM0UiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2UiCi0JCQlxdWlkICAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMDU1MDFDNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QThEMTAyQkEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4N0MwMUZFIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjFEMjAyMjYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODk3RTIzMDIzNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcuIEFuIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgYmluZGluZydzIHBvcnRUeXBlLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjAwOTIwMkY3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBREU0MDFEQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODlDNENCMDE5OSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJTZXJ2aWNlIgotCQkJcXVpZCAgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NEUwMUI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0OEE0MDE1MSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJQb3J0IgotCQkJcXVpZCAgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDBDQjAwQUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDUwMkM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QTAwMzkxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QjE0OTAzRDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCRERGNTM1MDJDMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIgotCQkJCXF1aWQgICAgICAgCSIzQUY5NTQzQzAwNzMiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjg1QjIxQTAyNzEiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGREI4MDNENCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFGODAzODIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTRGQzIwMTJCIgotCQkJCXJlc3VsdCAgICAgCSJET01Eb2N1bWVudCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTBERTAxRTciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnQiCi0JCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU0NzQwMDRFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uIgotCQkJCXF1aWQgICAgICAgCSI0MDM1MkI3QzAzOTYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODU3MDJGNSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDAwRDAwMEQiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSW1wb3J0IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RUU1ODAzN0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMEQwMzQwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWEiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM3OSIKLQkJCQlyZXN1bHQgICAgIAkiWFNEU2NoZW1hIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0U2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzOTciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAic2NoZW1hIgotCQkJCQl0eXBlICAgICAgIAkiWFNEU2NoZW1hIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUwQTAwMzYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTE0MDIxMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmxlRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQlkb2N1bWVudGF0aW9uIAkiIFdTREwgYWxsb3dzIGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgKHJlZmVycmVkIHRvIGhlcmUgYXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cykgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9pbnQgb2YgZXh0ZW5zaWJpbGl0eS4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUZFM0MwM0Q0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzEyQzAzQ0QiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMTQ3MDI5NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRFbGVtZW50IgotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklucHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTA0MDI1RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIyODAyRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFRTAzMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk91dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudC4gQW4gb3V0cHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QzUwQzAzNUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMzUwMEREIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRjgwMUNEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUUxQzgyMDAyRjIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyM0QwMzE5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMDIwMDJEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBODIwMkQ0IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gaW5wdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMUIwMTEzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1OUIwMDcyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0E0MDIwMyIKLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0SW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0I1MDNBMiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMUVBMDIwRSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTQzMDJBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QjVBNDAyN0UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0Q5MDBGMSIKLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRjEwMzI2IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzIwMjAwQkUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0ZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEEgZmF1bHQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBmYXVsdCB3aXRoIHRoZSBzYW1lIG5hbWUuICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUUwOTM4NjAyQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNzEwMzMzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0MTMwMzdGIgotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0MjEwMTA5IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0IgotCQkJCQl0eXBlICAgICAgIAkiSUZhdWx0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUJGOUUwMTRBIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlFOYW1lIgotCQkJcXVpZCAgICAgICAJIjNBRThFRDIyMDE0MCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUU5hbWUgY2xhc3MuIEEgUU5hbWUgaXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODQ5REE5MDAzRCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJOYW1lc3BhY2UiCi0JCQlxdWlkICAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMjkwMUIxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZWZpeCIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMzIwMjM2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk9wZXJhdGlvblR5cGUiCi0JCQlxdWlkICAgICAgIAkiM0FFQjQ3ODIwMjRGIgotCQkJZG9jdW1lbnRhdGlvbiAJCi18T05FX1dBWT0xCi18UkVRVUVTVF9SRVNQT05TRT0yCi18U09MSUNJVF9SRVNQT05TRT0zCi18Tk9USUZJQ0FUSU9OPTQKLQkJCQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvblR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMzUzMDNFMyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydFR5cGUiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE1QkUwMzMxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0VHlwZSBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QUMxMDFDQSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iCi0JCQkJCXR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkFGMDFBNCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJGNzAzMUEiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBNjMyMDAwRCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU9wZXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTc3NjAwRDEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk9wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNDIwMDY1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0IgotCQkJCQl0eXBlICAgICAgIAkiSUZhdWx0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNTkwMjhGIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM3MTAyQjEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDODEwMUIwIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM5OTAzMUQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyT3JkZXIiCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NEU1MDE4RCIKLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0SW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkM0MDEwNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJFNDAwOTQiCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkYwMDFEMiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODRBNzk5MDEyQiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUlucHV0IgotCQkJcXVpZCAgICAgICAJIjNCODRBN0VFMDAxNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYzMzEwMEVGIgotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzQ3MDI3NyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLklucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgwMDAwMzkiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4MjkwMjdEIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0M0EwMzVEIgotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDQ1MDFDOCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MzkwMUQ1IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4NjEwMzFEIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5GYXVsdCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ2QTAwQkQiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NzUwMTMxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODcxMDIwOCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1lc3NhZ2UiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4QUYwMDRGIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5NZXNzYWdlIG5vbi1NT0YgaW50ZXJmYWNlIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyMjQwMjczIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnQiCi0JCQkJCXR5cGUgICAgICAgCSJJUGFydCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyM0QwMjMzIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNTQwMjVFIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3JkZXJlZFBhcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI2MTAyMEQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydE9yZGVyIgotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5NZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QThCQzAyNjAiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklQYXJ0IgotCQkJcXVpZCAgICAgICAJIjNCODRBOTNGMDFCRSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUGFydCBub24tTU9GIGludGVyZmFjZSIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvbkF0dHJpYnV0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4NDUwMDUyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJ2YWx1ZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJZXhjZXB0aW9ucyAJIldTRExFeGNlcHRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIKLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMDEwMUMzIgotCQkJCXJlc3VsdCAgICAgCSJJSXRlcmF0b3IiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGUiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTJEMDJENSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiUU5hbWUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5QYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTk1MDAyMzEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklTZXJ2aWNlIgotCQkJcXVpZCAgICAgICAJIjNCODRBQjQ5MDI4NyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuU2VydmljZSBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUQ1NjAxRDEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydCIKLQkJCQkJdHlwZSAgICAgICAJIklQb3J0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVEQTIwMDM2IgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVEQjAwMUJDIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5TZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUI1QjAwM0UiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0IgotCQkJcXVpZCAgICAgICAJIjNCODRBQjgwMDMyNiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTFGMzAyQjUiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyNjMwMkYyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCOEMwMDE2IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZyIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUJDNjAyMTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmcgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGMTYwMTUzIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPcGVyYXRpb24iCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGNTAwMDY2IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGQTQwMUM1IgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJBOTAyODQiCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJCRTAxQTgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQkNGMDMwMiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEQzAwMDcyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwQkMwMDQxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdGYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nRmF1bHQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwRDkwMDlEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEZDMDA2MSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzMkQwMDE3IgotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTMzRjAzN0IiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUwOTAwREEiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTFEMDA3RiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nSW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0lucHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUzNDAzNDkiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1NDcwMkE2IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPdXRwdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ091dHB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEQ0IwMjFDIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0lucHV0IgotCQkJcXVpZCAgICAgICAJIjNCODRBREVCMDEwMCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QURGRTAwMEQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNCODRBRTIxMDExMSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ091dHB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTJEMDA1MCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUU0RjAwQkQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNUYwMDJBIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNCODRBRjMyMDNEQiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUY1NjAyOTIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QjEyNDAyQUIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxMzUwM0QxIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjg0QjFEOTAxNDIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkRlZmluaXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg4RjEwMzlEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkSW1wb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk0OTAyNTkiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW1wb3J0RGVmIgotCQkJCQl0eXBlICAgICAgIAkiSUltcG9ydCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NkUwMDVFIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkTmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk4NDAwNEIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4IgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUM1MDA0NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSIKLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5RTQwMUVFIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNlcnZpY2UiCi0JCQkJCXR5cGUgICAgICAgCSJJU2VydmljZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEExNzAzOEMiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTMyMDI4NiIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTQ2MDEzQiIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE1QzAwQjAiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5RkUwMzdDIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE3NTAyRTciCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUltcG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBODMwMTRDIgotCQkJCXJlc3VsdCAgICAgCSJJSW1wb3J0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTlEMDMzRSIKLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBQUYwMjU0IgotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBQzIwM0M0IgotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFFODAwRUQiCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFGODAyNkQiCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMDgwMURBIgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIxNTAzOUIiCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjMyMDEzQSIKLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI0MjAwNzUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ3MiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjkyMDM0MSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QkNEMDA2MCIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QkU3MDE0NCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMxNzAxMDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzNFMDAxRCIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNjIwMTRCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEM3NDAxMTUiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDQkUwMDcxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0RBMDFDNiIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFByZWZpeCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDRkQwMDE3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQyMzAwQTgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4RDNCMDNDRSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVCODAxMkIiCi0JCQkJcmVzdWx0ICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVENzAzQkIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJCXR5cGUgICAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50QmFzZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RkUwMjA4IgotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXREb2N1bWVudEJhc2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENjE4MDMyOCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudEJhc2UiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA1NjAwODAiCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDdFMDA0QyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBCQTAzNTUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlUG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEQ4MDI5QSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRkEwMzA3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NzA2RjAzMUIiCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NzA5NTAwRUUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidHlwZXMiCi0JCQkJCXR5cGUgICAgICAgCSJJVHlwZXMiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkRlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUU3MDJBMSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUltcG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QjIwMjAxMTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkltcG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIyMEMwMkVBIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJTGlzdCIKLQkJCXF1aWQgICAgICAgCSIzQjg1QzBBMjAzQzUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5MaXN0IGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTGlzdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMwQUYwMjk3IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJTWFwIgotCQkJcXVpZCAgICAgICAJIjNCODk2QjAzMDBENCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLk1hcCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLk1hcCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCMTEwMkI1IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJVVJMIgotCQkJcXVpZCAgICAgICAJIjNCODlENTYzMDI3NCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS5uZXQuVVJMIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLm5ldC5VUkwiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTZFMDNFMiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJcXVpZCAgICAgICAJIjNCODlENTkzMDJBNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTlGMDJFOCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiVHlwZXMiCi0JCQlxdWlkICAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgdHlwZXMgZWxlbWVudC4gVGhlIHR5cGVzIGVsZW1lbnQgZW5jbG9zZXMgZGF0YSB0eXBlIGRlZmluaXRpb25zIHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUgZXhjaGFuZ2VkIG1lc3NhZ2VzLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjhCRUIwMTAzMTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NBRENEM0IwMzgwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyIKLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRjM4MDNFNiIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0Y3RTAzMDEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUl0ZXJhdG9yIgotCQkJcXVpZCAgICAgICAJIjNDNDY4N0RBMDE2NyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuSXRlcmF0b3IiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODA4MDBCOSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiV1NETEV4Y2VwdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODk2NTAzMTMiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4Y2VwdGlvbiBjbGFzcy4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0M0Njg5NzQwMzE1IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJVHlwZXMiCi0JCQlxdWlkICAgICAgIAkiM0NBRENCQjIwMDUwIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5UeXBlcyBub24tTU9GIGludGVyZmFjZSIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuVHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDQURDQkYxMDE3MyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQ0IyNEFFQzAxQ0IiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNDQzM2MEQ3MDM5QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjI3RjAwQjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTURvY3VtZW50IgotCQkJcXVpZCAgICAgICAJIjNDRDE1MDJDMDIzQiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkRvY3VtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1MDYwMDE4MiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTWVzc2FnZVJlZmVyZW5jZSIKLQkJCXF1aWQgICAgICAgCSIzRjY3NzFEQjAyREMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y3NjJBNkEwMzA4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0Y2NzgwQTAwMUFCIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNDAxOEMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQzMiCi0JCQkJbGFiZWwgICAgICAJInBvcnRUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZU9wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDRCIKLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRTAwRTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA1NyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDYxIgotCQkJCWxhYmVsICAgICAgCSJlUGFydHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiCi0JCQlxdWlkICAgICAgIAkiM0FENUQzNTIwMTBGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE3NiIKLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE4MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1IgotCQkJcXVpZCAgICAgICAJIjNBRDVEM0UxMDE3OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjI1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMzkiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNTAzOEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGNSIKLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkZGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5NDAwMzkzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydHMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxQyIKLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5QjgwMTFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjREIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCOTAyNjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTciCi0JCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCWxhYmVsICAgICAgCSJlSW1wb3J0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTgiCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTMiCi0JCQlxdWlkICAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkJbGFiZWwgICAgICAJImVUeXBlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMiCi0JCQlxdWlkICAgICAgIAkiM0FENUU2MDMwMUUyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2VzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQzEiCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzEwMTA0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzRBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzU0IgotCQkJCWxhYmVsICAgICAgCSJlUG9ydFR5cGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTciCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzcwMDk1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzcxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzN0IiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5ncyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkiCi0JCQlxdWlkICAgICAgIAkiM0FENUU2N0IwMzExIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDdGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVNlcnZpY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwODkiCi0JCQkJbGFiZWwgICAgICAJImVTZXJ2aWNlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEiCi0JCQlxdWlkICAgICAgIAkiM0FENUZEMTMwMDc5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkJbGFiZWwgICAgICAJImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzIgotCQkJcXVpZCAgICAgICAJIjNBREYyRTY0MDFGNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUxIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0lucHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkU2NTAyNTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1IgotCQkJcXVpZCAgICAgICAJIjNBREYyRUIzMDE2MyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRUI0MDEzQyIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPdXRwdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3IgotCQkJcXVpZCAgICAgICAJIjNBREYyRjk0MDI0RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUlucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOTAiCi0JCQkJbGFiZWwgICAgICAJImVJbnB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkiCi0JCQlxdWlkICAgICAgIAkiM0FERjJGQjgwMkY5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEEiCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMSIKLQkJCXF1aWQgICAgICAgCSIzQURGMzMxNjAxQTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdHMiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4NyIKLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMiIKLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMzIgotCQkJcXVpZCAgICAgICAJIjNBREYzNDAwMDNFNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdGYXVsdHMiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQSIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdGYXVsdHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM1IgotCQkJcXVpZCAgICAgICAJIjNBRTA5MUY0MDJGMyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQUUwOTFGODAxRkUiCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNiIKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzciCi0JCQlxdWlkICAgICAgIAkiM0FFQTNENTUwMDJEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzOCIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNENTYwMzI4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZU5hbWVzcGFjZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMzMiIKLQkJCQlsYWJlbCAgICAgIAkiZU5hbWVzcGFjZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIgotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzkiCi0JCQlxdWlkICAgICAgIAkiM0FFQTNFM0EwMDJEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUU4IgotCQkJCWxhYmVsICAgICAgCSJlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQwIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQzAxRjIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MSIKLQkJCXF1aWQgICAgICAgCSIzQUVBNDEyRjAwMzUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjU1IgotCQkJCWxhYmVsICAgICAgCSJlUGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDIiCi0JCQkJcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQzIgotCQkJcXVpZCAgICAgICAJIjNCODRBRDI0MDBCRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUlucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODMiCi0JCQkJbGFiZWwgICAgICAJImVJbnB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDg0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDUiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFENzkwMEYyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEQiCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ2IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDciCi0JCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMEM0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzI3IgotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ4IgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAzMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDkiCi0JCQlxdWlkICAgICAgIAkiM0I4QjFDMTIwM0IyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAxQyIKLQkJCQlsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUwIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMjYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTEiCi0JCQlxdWlkICAgICAgIAkiM0I4QjFEQ0MwMkU1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlU2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMURDRTAyNzAiCi0JCQkJbGFiZWwgICAgICAJImVTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTIiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU1IgotCQkJcXVpZCAgICAgICAJIjNDNDY4MjkzMDNFNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDEwRSIKLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NiIKLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTE4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU5IgotCQkJcXVpZCAgICAgICAJIjNDQzM2MTQ1MDBGMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjAiCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MTQ2MDIzRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWEiCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MTQ2MDIzRSIKLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSIKLQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NDAxQjEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMEYiCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjIiCi0JCQkJcXVpZCAgICAgICAJIjNGNzRFNzg2MDAyMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MyIKLQkJCXF1aWQgICAgICAgCSIzRjc4OTZBMjAyNkUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY0IgotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNoaWxkcmVuIgotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkMiCi0JCQkJbGFiZWwgICAgICAJImNoaWxkcmVuIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi43IFNlcnZpY2VzIgotCQkJcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyIKLQkJCXRpdGxlICAgICAgCSIyLjcgU2VydmljZXMiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MywgNjYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2MTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA3MTUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcxKQotCQkJCXdpZHRoICAgICAgCTUyMAotCQkJCWhlaWdodCAgICAgCTQwNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiIEAyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODE2LCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQ4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDUzNikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyNzUpCi0JCQkJd2lkdGggICAgICAJMjc4Ci0JCQkJaGVpZ2h0ICAgICAJMjE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSIgQDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJU2VydmljZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCNDkwMjg3IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCAxNDUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3KQotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTI2NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDQzMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCA0ODcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg5KQotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTIxNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCQkJY2xpZW50ICAgICAJQDQKLQkJCQlzdXBwbGllciAgIAlAMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MCwgNDIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDAsIDI5MikpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTI2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDQsIDExNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQ0LCAxMjIzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OSkKLQkJCQl3aWR0aCAgICAgIAk0MTAKLQkJCQloZWlnaHQgICAgIAkyMTQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCWNsaWVudCAgICAgCUA2Ci0JCQkJc3VwcGxpZXIgICAJQDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTU3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMwLCAxMDAyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEA4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3NSwgODQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4OTUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTMwMAotCQkJCWhlaWdodCAgICAgCTE2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0NTAyQzkiCi0JCQkJY2xpZW50ICAgICAJQDgKLQkJCQlzdXBwbGllciAgIAlAMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAxMAotCQkJCWxvY2F0aW9uICAgCSgzMjEsIDkxNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0cyIgQDExCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCQkJbG9jYXRpb24gICAJKC0xNDMsIDY0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTcsIDk0NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxODk3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyIKLQkJCQkJY2xpZW50ICAgICAJQDEwCi0JCQkJCXN1cHBsaWVyICAgCUA4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjEsIDkxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMCwgODgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA4MDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMzLCA5OTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODQ2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEAxNQotCQkJCQlQYXJlbnRfVmlldyAJQDEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQzLCA2NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCA3MDQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5NDEwMzFEIgotCQkJCQljbGllbnQgICAgIAlAMTAKLQkJCQkJc3VwcGxpZXIgICAJQDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzIxLCA5MTYpCi0JCQkJCSAgICAoMjU3LCA5MTYpCi0JCQkJCSAgICAoMjU3LCA2MzUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIxLCA5MTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDYzNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc2MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBAMTgKLQkJCQlsb2NhdGlvbiAgIAkoODg2LCAxMjcwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEAxOQotCQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0ODU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQkJY2xpZW50ICAgICAJQDE4Ci0JCQkJCXN1cHBsaWVyICAgCUA2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEAyMgotCQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3OTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCQljbGllbnQgICAgIAlAMTgKLQkJCQkJc3VwcGxpZXIgICAJQDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODg2LCAxMjcwKQotCQkJCQkgICAgKDgxMiwgMTI3MCkKLQkJCQkJICAgICg4MTIsIDk5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTIsIDk5NikpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNSBCaW5kaW5ncyIKLQkJCXF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiCi0JCQl0aXRsZSAgICAgIAkiMi41IEJpbmRpbmdzIgotCQkJem9vbSAgICAgICAJODUKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIiBAMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDExNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCA2NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTcyKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ3MSkKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkzNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIiBAMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAzNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxMzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDgwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgMTg4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk5Ci0JCQkJICAgIG1heF93aWR0aCAgCTM5NikKLQkJCQl3aWR0aCAgICAgIAk0MTAKLQkJCQloZWlnaHQgICAgIAk1NjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiIEAyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTMzNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdJbnB1dCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIDEyODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiCi0JCQkJd2lkdGggICAgICAJMjc4Ci0JCQkJaGVpZ2h0ICAgICAJMTc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIgQDI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxNjM4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ091dHB1dCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE1ODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiCi0JCQkJd2lkdGggICAgICAJMzEyCi0JCQkJaGVpZ2h0ICAgICAJMTc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IiBAMjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTU4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0ZhdWx0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MiwgMTkwOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIKLQkJCQl3aWR0aCAgICAgIAkyOTAKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjk3LCA1MjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTcsIDU4MCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0MTEpCi0JCQkJd2lkdGggICAgICAJNDMyCi0JCQkJaGVpZ2h0ICAgICAJMjI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDEyODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDE2NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTU4NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDY4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NywgNTg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA2NDQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNDExKQotCQkJCXdpZHRoICAgICAgCTQzMgotCQkJCWhlaWdodCAgICAgCTIyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCWNsaWVudCAgICAgCUAzMgotCQkJCXN1cHBsaWVyICAgCUAyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3OSwgNTc0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzksIDQyOCkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEAzNAotCQkJCWxvY2F0aW9uICAgCSgxMTA0LCA3NDIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTIwMTBGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGUiIEAzNQotCQkJCQlQYXJlbnRfVmlldyAJQDM0Ci0JCQkJCWxvY2F0aW9uICAgCSg2NDAsIDU5OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTY1LCA3ODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkyOTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCQkJCWNsaWVudCAgICAgCUAzNAotCQkJCQlzdXBwbGllciAgIAlAMjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMDQsIDc0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2ODgsIDc0MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjEzLCA3MTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjE5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQKLQkJCQkJbG9jYXRpb24gICAJKDY0MCwgNTk4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNiwgNjk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDk0NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiCi0JCQkJCWNsaWVudCAgICAgCUAzNAotCQkJCQlzdXBwbGllciAgIAlAMzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMDQsIDc0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgNzQyKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBANDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDEwMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MiwgODk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MiwgOTU2KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQzMCkKLQkJCQl3aWR0aCAgICAgIAk0NTAKLQkJCQloZWlnaHQgICAgIAkyNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDQxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDE0MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDc2LCAxMjgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDc2LCAxMzQxKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTMwMykKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDMiIEA0MgotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCAxMzU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRDI0MDBCRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBANDMKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MgotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAxMzE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc1MTQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkJCQljbGllbnQgICAgIAlANDIKLQkJCQkJc3VwcGxpZXIgICAJQDMwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTM1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk0LCAxMzk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODk1NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ0IiBANDYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MgotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODQiCi0JCQkJCWNsaWVudCAgICAgCUA0MgotCQkJCQlzdXBwbGllciAgIAlANDEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODEsIDEzNTkpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBANDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgMTY2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTIsIDE1MzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODEyLCAxNTk3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTMwMykKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDUiIEA0OAotCQkJCWxvY2F0aW9uICAgCSgxNDMyLCAxNjU0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRDc5MDBGMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NDc3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJCQkJY2xpZW50ICAgICAJQDQ4Ci0JCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDE2NTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4MSwgMTY5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkwMjc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDUyCi0JCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEUiCi0JCQkJCWNsaWVudCAgICAgCUA0OAotCQkJCQlzdXBwbGllciAgIAlANDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxNjU0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDEwMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5ODkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTM2NAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERTQwMURDIgotCQkJCWNsaWVudCAgICAgCUA1MwotCQkJCXN1cHBsaWVyICAgCUAyNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2NiwgOTE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjYsIDYzNikpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEA1NQotCQkJCWxvY2F0aW9uICAgCSg0MzMsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTEwMTc5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2IiBANTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIDQ5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDg3NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMjUiCi0JCQkJCWNsaWVudCAgICAgCUA1NQotCQkJCQlzdXBwbGllciAgIAlAMzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDMzLCAxMDIyKQotCQkJCQkgICAgKDI3NiwgMTAyMikKLQkJCQkJICAgICgyNzYsIDgwMikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MzMsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzYsIDgwMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzAsIDg0MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ09wZXJhdGlvbnMiIEA1OQotCQkJCQlQYXJlbnRfVmlldyAJQDU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgNDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMywgOTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjExNjk5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkJCQljbGllbnQgICAgIAlANTUKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MzMsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCA5ODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4NDk1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcwNiwgMTA2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzI3NTY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA2MwotCQkJCWxvY2F0aW9uICAgCSgxNDE4LCAxMDQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVENDI1MDM4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbiIgQDY0Ci0JCQkJCVBhcmVudF9WaWV3IAlANjMKLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDYwMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGNSIKLQkJCQkJY2xpZW50ICAgICAJQDYzCi0JCQkJCXN1cHBsaWVyICAgCUA0MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjMsIDEwNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4OSwgMTAwNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk2NzIxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4IiBANjcKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzMsIDEwNzApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NTQyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGRiIKLQkJCQkJY2xpZW50ICAgICAJQDYzCi0JCQkJCXN1cHBsaWVyICAgCUA1MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNzQsIDEwNDApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBANjkKLQkJCQlsb2NhdGlvbiAgIAkoNzg3LCAxMTkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRTY0MDFGNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdJbnB1dCIgQDcwCi0JCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjksIDExNTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdJbnB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTExOTA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUxIgotCQkJCQljbGllbnQgICAgIAlANjkKLQkJCQkJc3VwcGxpZXIgICAJQDQxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc4NywgMTE5MCkKLQkJCQkJICAgICg2MzYsIDExOTApCi0JCQkJCSAgICAoNjM2LCAxMjcxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYzNiwgMTI3MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDEyMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0MDQ3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQiIEA3MwotCQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODg1LCAxMTQ0KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MiIKLQkJCQkJY2xpZW50ICAgICAJQDY5Ci0JCQkJCXN1cHBsaWVyICAgCUA1MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODcsIDExOTApCi0JCQkJCSAgICAoOTI2LCAxMTkwKQotCQkJCQkgICAgKDkyNiwgMTA5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODcxLCAxMTM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3NTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEA3NgotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMzEyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRUIzMDE2MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPdXRwdXQiIEA3NwotCQkJCQlQYXJlbnRfVmlldyAJQDc2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxMiwgMTQyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMwNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ091dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQ1MDgyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNDIgotCQkJCQljbGllbnQgICAgIAlANzYKLQkJCQkJc3VwcGxpZXIgICAJQDQ3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTUyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NjcsIDE0NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3NDU5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEA4MAotCQkJCQlQYXJlbnRfVmlldyAJQDc2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTgzLCAxMTQwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzRCIKLQkJCQkJY2xpZW50ICAgICAJQDc2Ci0JCQkJCXN1cHBsaWVyICAgCUA1MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDEwOTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzMSwgMTE4NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkwMTY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MjAsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3MiwgMTkwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEA4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjEyLCAxODU5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTkxNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMjc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU3MTAzMzMiCi0JCQkJY2xpZW50ICAgICAJQDg0Ci0JCQkJc3VwcGxpZXIgICAJQDI4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwMywgMjAwNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzUzLCAyMDA3KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzMiIEA4NgotCQkJCWxvY2F0aW9uICAgCSgxMzU2LCAxMzUyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYzNDAwMDNFNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEA4NwotCQkJCQlQYXJlbnRfVmlldyAJQDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgxODgsIDYxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzgyLCAxNzUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzAwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nRmF1bHRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDMxNTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTI2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUEiCi0JCQkJCWNsaWVudCAgICAgCUA4NgotCQkJCQlzdXBwbGllciAgIAlAODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCAxODQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDksIDE3OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTE5NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTYsIDE4MDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxOTI5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM0IiBAOTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NgotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUIiCi0JCQkJCWNsaWVudCAgICAgCUA4NgotCQkJCQlzdXBwbGllciAgIAlANTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM1NiwgMTM1MikKLQkJCQkJICAgICgxMzU2LCAxMjE3KQotCQkJCQkgICAgKDExMTcsIDEyMTcpCi0JCQkJCSAgICAoMTExNywgMTA5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTUyLCAxMTY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcwMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEA5NAotCQkJCWxvY2F0aW9uICAgCSgxNjQwLCAxOTcwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA5MUY0MDJGMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0IiBAOTUKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NAotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzQsIDE5MTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUZhdWx0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzY0MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkUiCi0JCQkJCWNsaWVudCAgICAgCUA5NAotCQkJCQlzdXBwbGllciAgIAlAODMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYzLCAxOTcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MTgsIDIwMTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MjI3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzYiIEA5OAotCQkJCQlQYXJlbnRfVmlldyAJQDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZGIgotCQkJCQljbGllbnQgICAgIAlAOTQKLQkJCQkJc3VwcGxpZXIgICAJQDg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUxNywgMTk3MCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTQzMDJBQiIKLQkJCQljbGllbnQgICAgIAlANDcKLQkJCQlzdXBwbGllciAgIAlAMjcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDMsIDE2NTYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NCwgMTY1NikpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMUIwMTEzIgotCQkJCWNsaWVudCAgICAgCUA0MQotCQkJCXN1cHBsaWVyICAgCUAyNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ2NywgMTM4NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzMxLCAxMzg1KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNCBQb3J0VHlwZXMiCi0JCQlxdWlkICAgICAgIAkiM0FENUQxQzQwMzY2IgotCQkJdGl0bGUgICAgICAJIjIuNCBQb3J0VHlwZXMiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIgotCQkJem9vbSAgICAgICAJODAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIgQDEwMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDIwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0VHlwZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDIzMykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2OTYpCi0JCQkJd2lkdGggICAgICAJNzE4Ci0JCQkJaGVpZ2h0ICAgICAJMTk2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iIEAxMDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklPcGVyYXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxMjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDIzNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDkpCi0JCQkJd2lkdGggICAgICAJODkxCi0JCQkJaGVpZ2h0ICAgICAJMTg4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTQzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUlucHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDEzODcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDk4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyMSkKLQkJCQl3aWR0aCAgICAgIAk2NDQKLQkJCQloZWlnaHQgICAgIAkxOTQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiIEAxMDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU91dHB1dCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTgxOCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYpCi0JCQkJd2lkdGggICAgICAJNjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTk0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiIEAxMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjA3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUZhdWx0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIwMjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMTM3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNSkKLQkJCQl3aWR0aCAgICAgIAk2NDQKLQkJCQloZWlnaHQgICAgIAkxOTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTgsIDY3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OCwgNzMzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOSkKLQkJCQl3aWR0aCAgICAgIAk2OTUKLQkJCQloZWlnaHQgICAgIAkyODEKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDEwNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTc2LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMjUsIDY5MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMyNSwgNzUzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4NCkKLQkJCQl3aWR0aCAgICAgIAk1MjAKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAMTA4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDIwNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAxMDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgMTQ3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODcwLCAxNDIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMTEwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE3OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDE3NDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQl3aWR0aCAgICAgIAkyNzQKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDExMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTQsIDYyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjE0LCA2ODEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ2KQotCQkJCXdpZHRoICAgICAgCTY5NQotCQkJCWhlaWdodCAgICAgCTM1MgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMTIKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgNzk3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODI0MDE4QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbnMiIEAxMTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTIKLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNzQ4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNTk2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQ0QiCi0JCQkJCWNsaWVudCAgICAgCUAxMTIKLQkJCQkJc3VwcGxpZXIgICAJQDExMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwNSwgNzk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NiwgODYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDAzOTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzQsIDkyMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2MjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicG9ydFR5cGUiIEAxMTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTIKLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDMyIKLQkJCQkJY2xpZW50ICAgICAJQDExMgotCQkJCQlzdXBwbGllciAgIAlAMTA2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDc5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4OCwgNzU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTM0ODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDEiIEAxMTkKLQkJCQlsb2NhdGlvbiAgIAkoMjEwNywgNzczKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUE0MTJGMDAzNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcmFtZXRlck9yZGVyaW5nIiBAMTIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5Ci0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ1LCA2NDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODMzMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjU1IgotCQkJCQljbGllbnQgICAgIAlAMTE5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTYsIDc3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzIsIDgyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk2NjEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcxLCA4ODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMwNjIyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQyIiBAMTI0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE5Ci0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjVGIgotCQkJCQljbGllbnQgICAgIAlAMTE5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTksIDc3MykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEiIEAxMjUKLQkJCQlsb2NhdGlvbiAgIAkoMTcwMiwgMTUwNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxNjAxQTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdHMiIEAxMjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUKLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTUsIDE5ODIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUZhdWx0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc4OTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4NyIKLQkJCQkJY2xpZW50ICAgICAJQDEyNQotCQkJCQlzdXBwbGllciAgIAlAMTA4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgMjA0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDQsIDIwMjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0OTU4MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MywgMTk2MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ1Mzc4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzIiIEAxMzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUKLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjEsIDEwNjkpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg4IgotCQkJCQljbGllbnQgICAgIAlAMTI1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMDM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTczNjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3IiBAMTMzCi0JCQkJbG9jYXRpb24gICAJKDExNzgsIDEyMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTQwMjREIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEAxMzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMKLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAxMzQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE5ODIwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5MCIKLQkJCQkJY2xpZW50ICAgICAJQDEzMwotCQkJCQlzdXBwbGllciAgIAlAMTA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzgsIDEyMzQpCi0JCQkJCSAgICAoOTgwLCAxMjM0KQotCQkJCQkgICAgKDk4MCwgMTQxMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAxNDEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0NiwgMTM2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc3NjYwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOCIgQDEzNwotCQkJCQlQYXJlbnRfVmlldyAJQDEzMwotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM2LCAxMDM2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5QSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMwotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzgsIDEyMzQpCi0JCQkJCSAgICAoMTI3NywgMTIzNCkKLQkJCQkJICAgICgxMjc3LCA5NjApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzcsIDk2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExOTcsIDEwNTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjQxMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOSIgQDE0MAotCQkJCWxvY2F0aW9uICAgCSgxNDY4LCAxMzQ1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRkI4MDJGOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDE0MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MAotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MiwgMTY2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3V0cHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDA5MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBBIgotCQkJCQljbGllbnQgICAgIAlAMTQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAxNzMwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU0NiwgMTY3NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNjM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMCIgQDE0NAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MAotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNywgMTAzNykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDAKLQkJCQkJc3VwcGxpZXIgICAJQDExMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDk2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjMsIDEwODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5MDM0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkQ4MDE5RiIKLQkJCQljbGllbnQgICAgIAlAMTA2Ci0JCQkJc3VwcGxpZXIgICAJQDEwMQotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRTIwMTcxIgotCQkJCWNsaWVudCAgICAgCUAxMTEKLQkJCQlzdXBwbGllciAgIAlAMTAyCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFRTAzMUQiCi0JCQkJY2xpZW50ICAgICAJQDEwOQotCQkJCXN1cHBsaWVyICAgCUAxMDMKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkY4MDFDRCIKLQkJCQljbGllbnQgICAgIAlAMTEwCi0JCQkJc3VwcGxpZXIgICAJQDEwNAotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMDIwMDJEIgotCQkJCWNsaWVudCAgICAgCUAxMDgKLQkJCQlzdXBwbGllciAgIAlAMTA1Ci0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjIyNCwgMTQ1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzNywgMTMxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzNywgMTM3MSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpCi0JCQkJd2lkdGggICAgICAJNTkzCi0JCQkJaGVpZ2h0ICAgICAJMzEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiIEAxNTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgMjU0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMjQ2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMjUyNykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTY3MgotCQkJCWhlaWdodCAgICAgCTE4MAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE1NAotCQkJCWxvY2F0aW9uICAgCSgxNTI0LCAyMjc1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxNTMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE1MjQsIDIyNzUpCi0JCQkJICAgICgxNTI0LCAyNDU0KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyM0QwMzE5IgotCQkJCWNsaWVudCAgICAgCUAxMDgKLQkJCQlzdXBwbGllciAgIAlAMTUzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NiwgMjE3NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NiwgMjI3NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMzUwMEREIgotCQkJCWNsaWVudCAgICAgCUAxMTAKLQkJCQlzdXBwbGllciAgIAlAMTUzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM3MSwgMTg1NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3MSwgMjI3NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMjgwMkU3IgotCQkJCWNsaWVudCAgICAgCUAxMDkKLQkJCQlzdXBwbGllciAgIAlAMTUzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgwLCAxNTM0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MSIgQDE1OAotCQkJCWxvY2F0aW9uICAgCSgyMjA2LCAyMjU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNzRFNzg0MDFCMSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAxNTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTgKLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjgsIDE2NzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMjIzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMEYiCi0JCQkJCWNsaWVudCAgICAgCUAxNTgKLQkJCQkJc3VwcGxpZXIgICAJQDE1MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDYsIDE2MTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYwLCAxNjc4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMTYyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTU4Ci0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDIzIgotCQkJCQljbGllbnQgICAgIAlAMTU4Ci0JCQkJCXN1cHBsaWVyICAgCUAxNTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjIwNiwgMjI1OSkKLQkJCQkJICAgICgyMjA2LCAyNTU2KQotCQkJCQkgICAgKDE4NTYsIDI1NTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTYsIDI1NTYpKSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEgRGVmaW5pdGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0FENUU0OEEwMjYyIgotCQkJdGl0bGUgICAgICAJIjIuMSBEZWZpbml0aW9ucyIKLQkJCXpvb20gICAgICAgCTgzCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIgQDE2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDE5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDE2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSURlZmluaXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTExKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMjIwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMCkKLQkJCQl3aWR0aCAgICAgIAk3MDYKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMTY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NiwgODk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQl3aWR0aCAgICAgIAkyOTQKLQkJCQloZWlnaHQgICAgIAkxMjAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDE2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDU0NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTEwLCA2MDQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc4KQotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTE4MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MDAsIDExMDUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MDAsIDExNjQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIyKQotCQkJCXdpZHRoICAgICAgCTQ0MgotCQkJCWhlaWdodCAgICAgCTE4MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxNjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODA4LCAxNDg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk2LCAxNDA5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5NiwgMTQ2OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MjIpCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMTgyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMTY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEyNCwgMTY0OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEyNCwgMTcwOCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MjIpCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMTgyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMTY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCA5OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNwotCQkJCSAgICBtYXhfd2lkdGggIAk1MjEpCi0JCQkJd2lkdGggICAgICAJNTI4Ci0JCQkJaGVpZ2h0ICAgICAJNDI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMTcwCi0JCQkJbG9jYXRpb24gICAJKDEzNTgsIDg2MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMTcxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTcwCi0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgNTM1KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiIKLQkJCQkJY2xpZW50ICAgICAJQDE3MAotCQkJCQlzdXBwbGllciAgIAlAMTY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU4LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAzLCA1MTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NjY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMTc0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTcwCi0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4NiwgOTA5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VUeXBlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc5MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMTcwCi0JCQkJCXN1cHBsaWVyICAgCUAxNjQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM1OCwgODYwKQotCQkJCQkgICAgKDEzNTgsIDk0OCkKLQkJCQkJICAgICgxNjc3LCA5NDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NywgOTQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgOTg3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTI2NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAxNzcKLQkJCQlsb2NhdGlvbiAgIAkoMTYxMiwgNTk1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAxNzgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzcKLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1MTIpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJCQljbGllbnQgICAgIAlAMTc3Ci0JCQkJCXN1cHBsaWVyICAgCUAxNjkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYxMiwgNTk1KQotCQkJCQkgICAgKDE0NjQsIDU5NSkKLQkJCQkJICAgICgxNDY0LCA0NTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2NCwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyNCwgNDk1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTg2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTYwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMTgxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTc3Ci0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5MiwgNTU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODAzMzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJCWNsaWVudCAgICAgCUAxNzcKLQkJCQkJc3VwcGxpZXIgICAJQDE2NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMSwgNTk1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNjUyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDEwMDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzYsIDY0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjI1OTQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzIiBAMTg1Ci0JCQkJbG9jYXRpb24gICAJKDEyNzksIDExMzYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDMwMUUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDE4NgotCQkJCQlQYXJlbnRfVmlldyAJQDE4NQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM4LCA1OTEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEI3IgotCQkJCQljbGllbnQgICAgIAlAMTg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc5LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIwLCA1ODcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwNDk3NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2VzIiBAMTg5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTg1Ci0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDExNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDMxMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQzEiCi0JCQkJCWNsaWVudCAgICAgCUAxODUKLQkJCQkJc3VwcGxpZXIgICAJQDE2NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjc5LCAxMTM2KQotCQkJCQkgICAgKDEyNzksIDEyMDgpCi0JCQkJCSAgICAoMTg5MSwgMTIwOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5MSwgMTIwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDExNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTM0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5NywgMTI0NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NDA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBAMTkzCi0JCQkJbG9jYXRpb24gICAJKDEyMTIsIDExNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzEwMTA0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDE5NAotCQkJCQlQYXJlbnRfVmlldyAJQDE5MwotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgNTk0KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM0QSIKLQkJCQkJY2xpZW50ICAgICAJQDE5MwotCQkJCQlzdXBwbGllciAgIAlAMTY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxMiwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MSwgNjI0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTc5NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZXMiIEAxOTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTMKLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTEsIDE0NTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzIzNjk4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzU0IgotCQkJCQljbGllbnQgICAgIAlAMTkzCi0JCQkJCXN1cHBsaWVyICAgCUAxNjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxMiwgMTE1OSkKLQkJCQkJICAgICgxMjEyLCAxNDkwKQotCQkJCQkgICAgKDE1ODcsIDE0OTApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODcsIDE0OTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTMzLCAxNDUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjU2MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDE1NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTg1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNyIgQDIwMQotCQkJCWxvY2F0aW9uICAgCSgxMTE0LCAxNTg1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjc3MDA5NSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgiIEAyMDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMDEKLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDY4MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzNzEiCi0JCQkJCWNsaWVudCAgICAgCUAyMDEKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTQsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTUsIDc1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NzA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ3MiIEAyMDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMDEKLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTEsIDE2NzQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjYzNDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzN0IiCi0JCQkJCWNsaWVudCAgICAgCUAyMDEKLQkJCQkJc3VwcGxpZXIgICAJQDE2OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTE0LCAxNTg1KQotCQkJCQkgICAgKDExMTQsIDE3MTYpCi0JCQkJCSAgICAoMjExNSwgMTcxNikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgMTcxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTMsIDE2NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NTA3NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxNCwgMTc1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTExMDcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjA5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyOCwgMTk2OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyOCwgMjAyOCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MjIpCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMTgyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjEwCi0JCQkJbG9jYXRpb24gICAJKDEwNjYsIDE1MzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0IwMzExIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIxMQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDY3MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwN0YiCi0JCQkJCWNsaWVudCAgICAgCUAyMTAKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMDksIDc1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzE5Njk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2VydmljZXMiIEAyMTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTAKLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkzLCAyMDI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTZXJ2aWNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkxODI0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJCQljbGllbnQgICAgIAlAMjEwCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA2NiwgMTUzMikKLQkJCQkJICAgICgxMDY2LCAyMDU5KQotCQkJCQkgICAgKDE2MTksIDIwNTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDIwNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU0LCAyMDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDAxOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyMDUxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJCQljbGllbnQgICAgIAlAMTY5Ci0JCQkJc3VwcGxpZXIgICAJQDE2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDI2MykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg1LCAyNjMpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkJCXF1aWQgICAgICAgCSIzQUQ2MEM1MTAxOTIiCi0JCQl0aXRsZSAgICAgIAkiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkJCXpvb20gICAgICAgCTgwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMjE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTQsIDE1MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJMTgyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAMjIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTg4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzQzLCAxNjc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMjMzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMjI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDIyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDczNiwgMTc2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYzLCAxNzA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCXdpZHRoICAgICAgCTM2NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCAxMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkJCXdpZHRoICAgICAgCTgwNAotCQkJCWhlaWdodCAgICAgCTE3MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAMjI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxOTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDE4OTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQl3aWR0aCAgICAgIAkyNzQKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAyMTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NjMsIDIwOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJd2lkdGggICAgICAJMzA4Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTIzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQl3aWR0aCAgICAgIAkyMjIKLQkJCQloZWlnaHQgICAgIAkxNDYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM1LCAxMzU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA1ODApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDksIDY0MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMxKQotCQkJCXdpZHRoICAgICAgCTU2MAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyMzAKLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ4MCwgMTAzOSkKLQkJCQkgICAgKDQ4MCwgODA4KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkJCWNsaWVudCAgICAgCUAyMjAKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2NiwgMTgyNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkJCWNsaWVudCAgICAgCUAyMjYKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NywgMjA3OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NywgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkJCWNsaWVudCAgICAgCUAyMjIKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxOSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIgotCQkJCWNsaWVudCAgICAgCUAyMjUKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTg4LCAxODg3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYwMDkyMDJGNyIKLQkJCQljbGllbnQgICAgIAlAMjIzCi0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc5NywgMTY5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk3LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJY2xpZW50ICAgICAJQDIxOQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwMSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkJCWNsaWVudCAgICAgCUAyMjcKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExLCAxMjIzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQljbGllbnQgICAgIAlAMjI4Ci0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQxNCwgMTM0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEyMDAyNUUiCi0JCQkJY2xpZW50ICAgICAJQDIyMQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI5LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDU4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDY0NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0NjUpCi0JCQkJd2lkdGggICAgICAJNTYzCi0JCQkJaGVpZ2h0ICAgICAJMjM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMjQxCi0JCQkJbG9jYXRpb24gICAJKDExOTEsIDY3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODQ3LCA2MzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCQljbGllbnQgICAgIAlAMjQxCi0JCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODMwLCA2MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzOTY5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI0NQotCQkJCQlQYXJlbnRfVmlldyAJQDI0MQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTUsIDUyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzkwNzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCQljbGllbnQgICAgIAlAMjQxCi0JCQkJCXN1cHBsaWVyICAgCUAyNDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTYsIDYyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYzLCA3NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjQ3OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiIEAyNDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDg0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJXU0RMRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCAxNDUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MykKLQkJCQl3aWR0aCAgICAgIAk3NzQKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjUwCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDQwMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMjQ5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMDA4LCA0MDIpCi0JCQkJICAgICgxMDA4LCAzMTIpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkUzQzAzRDQiCi0JCQkJY2xpZW50ICAgICAJQDIyOQotCQkJCXN1cHBsaWVyICAgCUAyNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTIsIDU2OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDkyLCA0MDIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjUwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJCQljbGllbnQgICAgIAlAMjQwCi0JCQkJc3VwcGxpZXIgICAJQDIyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTUsIDU3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNSwgMjQ2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCQkJY2xpZW50ICAgICAJQDI0MAotCQkJCXN1cHBsaWVyICAgCUAyNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCA1NzEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDE0MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDEzMDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJOTI3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk5NDUKLQkJCQloZWlnaHQgICAgIAkyMzUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFFQzAxQ0IiCi0JCQkJY2xpZW50ICAgICAJQDI1NAotCQkJCXN1cHBsaWVyICAgCUAyNDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjkxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDI1NgotCQkJCWxvY2F0aW9uICAgCSgyNjM5LCAxNzM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjQiIEAyNTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNTYKLQkJCQkJbG9jYXRpb24gICAJKDYwNywgMzQyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5NywgMTM4MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkIiCi0JCQkJCWNsaWVudCAgICAgCUAyNTYKLQkJCQkJc3VwcGxpZXIgICAJQDI1NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyNjM5LCAxNzM0KQotCQkJCQkgICAgKDI4MjQsIDE3MzQpCi0JCQkJCSAgICAoMjgyNCwgMTQyMSkKLQkJCQkJICAgICgyNjY0LCAxNDIxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzksIDE3MzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjY0LCAxNDIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjczMSwgMTQ3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDI2MAotCQkJCQlQYXJlbnRfVmlldyAJQDI1NgotCQkJCQlsb2NhdGlvbiAgIAkoNjA3LCAzNDIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc0LCAxNjU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NoaWxkcmVuIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTg1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTExOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJCQljbGllbnQgICAgIAlAMjU2Ci0JCQkJCXN1cHBsaWVyICAgCUAyNTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjYzOSwgMTczNCkKLQkJCQkJICAgICgyMTkxLCAxNzM0KQotCQkJCQkgICAgKDIxOTEsIDE1MjUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzOSwgMTczNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTEsIDE1MjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjQ1LCAxNTkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyIKLQkJCXF1aWQgICAgICAgCSIzQUU4RUQ3MjAxQkQiCi0JCQl0aXRsZSAgICAgIAkiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCQkJem9vbSAgICAgICAJOTAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAyNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW1wb3J0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAyMzIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNjQ2KQotCQkJCXdpZHRoICAgICAgCTU5OAotCQkJCWhlaWdodCAgICAgCTIxOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMjY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDExMzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgMTA0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTmFtZXNwYWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDEwOTYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAwKQotCQkJCXdpZHRoICAgICAgCTQ3OQotCQkJCWhlaWdodCAgICAgCTIxNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAyNjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgMTE0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTY5NAotCQkJCWhlaWdodCAgICAgCTE3MwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NCwgMjkxKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTUyMSkKLQkJCQl3aWR0aCAgICAgIAk0OTAKLQkJCQloZWlnaHQgICAgIAkzMjAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzciIEAyNjcKLQkJCQlsb2NhdGlvbiAgIAkoMzA5LCA3ODYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTUwMDJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTmFtZXNwYWNlcyIgQDI2OAotCQkJCQlQYXJlbnRfVmlldyAJQDI2NwotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjEsIDk1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTmFtZXNwYWNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk4ODQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMzMiIKLQkJCQkJY2xpZW50ICAgICAJQDI2NwotCQkJCQlzdXBwbGllciAgIAlAMjY0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgMTAyOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0OCwgOTczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Njg3MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjUwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTgyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM4IiBAMjcyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjY3Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OCwgNTkyKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMjgiCi0JCQkJCWNsaWVudCAgICAgCUAyNjcKLQkJCQkJc3VwcGxpZXIgICAJQDI2NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDU0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzOSwgNTgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDQ5NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTcxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDI3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgNzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjU1LCA1ODApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NSwgNjM1KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ3OCkKLQkJCQl3aWR0aCAgICAgIAk0NTIKLQkJCQloZWlnaHQgICAgIAkzMDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTEiIEAyNzYKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NiwgMTAwMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDQzAyRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTY2hlbWEiIEAyNzcKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNzYKLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDEwMTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkyNTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3MCIKLQkJCQkJY2xpZW50ICAgICAJQDI3NgotCQkJCQlzdXBwbGllciAgIAlAMjY1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0ODYsIDEwMDEpCi0JCQkJCSAgICAoMTYzMiwgMTAwMSkKLQkJCQkJICAgICgxNjMyLCAxMTMwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMyLCAxMTMwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2MywgMTAxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkyNTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MiIgQDI4MAotCQkJCQlQYXJlbnRfVmlldyAJQDI3NgotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3QSIKLQkJCQkJY2xpZW50ICAgICAJQDI3NgotCQkJCQlzdXBwbGllciAgIAlAMjc1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM5IiBAMjgxCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDQwMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQTAwMkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQwIiBAMjgyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjgxCi0JCQkJCWxvY2F0aW9uICAgCSg2ODcsIC0xMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA2LCA0ODApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFGMiIKLQkJCQkJY2xpZW50ICAgICAJQDI4MQotCQkJCQlzdXBwbGllciAgIAlAMjc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwODcsIDQwMykKLQkJCQkJICAgICgxMzY0LCA0MDMpCi0JCQkJCSAgICAoMTM2NCwgNTY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjQsIDU2OCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVEZWZpbml0aW9uIiBAMjg0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjgxCi0JCQkJCWxvY2F0aW9uICAgCSg2ODcsIC0xMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDUsIDM2MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3NTMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUU4IgotCQkJCQljbGllbnQgICAgIAlAMjgxCi0JCQkJCXN1cHBsaWVyICAgCUAyNjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNDAzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCA0NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDkxMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDI4NwotCQkJCWxvY2F0aW9uICAgCSg3MzcsIDgyNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMjg4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjg3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjcxLCAxMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTIsIDY0NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJCQljbGllbnQgICAgIAlAMjg3Ci0JCQkJCXN1cHBsaWVyICAgCUAyNjYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzM3LCA4MjYpCi0JCQkJCSAgICAoNTEwLCA4MjYpCi0JCQkJCSAgICAoNTEwLCA1NDQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDU0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ1NywgNTk1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMjkxCi0JCQkJCVBhcmVudF9WaWV3IAlAMjg3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjcxLCAxMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ0LCA3NzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUltcG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5OTE4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCIKLQkJCQkJY2xpZW50ICAgICAJQDI4NwotCQkJCQlzdXBwbGllciAgIAlAMjc1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDYsIDgyNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODAsIDg3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMjExCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTYyLCA5MzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzNzcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMjAwRDAzNDAiCi0JCQkJY2xpZW50ICAgICAJQDI3NQotCQkJCXN1cHBsaWVyICAgCUAyNjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTU1LCA1NjgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDMzMykpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjIgVHlwZXMiCi0JCQlxdWlkICAgICAgIAkiM0I4NUFFNTkwMzdFIgotCQkJdGl0bGUgICAgICAJIjIuMiBUeXBlcyIKLQkJCXpvb20gICAgICAgCTkwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTgxCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDI5NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTIzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoODk1LCAxMTU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAk1MDAKLQkJCQloZWlnaHQgICAgIAkxNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMjk3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNiwgMTUzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTE2MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDI5OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTk2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgMTgyOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgMTkwMCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkzMCkKLQkJCQl3aWR0aCAgICAgIAk1MzUKLQkJCQloZWlnaHQgICAgIAkzMDUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAyOTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCAxMDY3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCXdpZHRoICAgICAgCTQ2NgotCQkJCWhlaWdodCAgICAgCTI1OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NyIgQDMwMAotCQkJCWxvY2F0aW9uICAgCSg3MzUsIDExNzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMEM0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDMwMQotCQkJCQlQYXJlbnRfVmlldyAJQDMwMAotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2NzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzUsIDExMzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTAwNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDMyNyIKLQkJCQkJY2xpZW50ICAgICAJQDMwMAotCQkJCQlzdXBwbGllciAgIAlAMjk2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODYsIDExNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzksIDEyMDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4ODcwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDgiIEAzMDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDAKLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDMzMSIKLQkJCQkJY2xpZW50ICAgICAJQDMwMAotCQkJCQlzdXBwbGllciAgIAlAMjk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODUsIDExNzIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ5IiBAMzA1Ci0JCQkJbG9jYXRpb24gICAJKDUyNywgMTU5MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxMjAzQjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbiIgQDMwNgotCQkJCQlQYXJlbnRfVmlldyAJQDMwNQotCQkJCQlsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY2LCAxNTU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzc1Mzk0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDFDIgotCQkJCQljbGllbnQgICAgIAlAMzA1Ci0JCQkJCXN1cHBsaWVyICAgCUAyOTcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NywgMTU5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNywgMTY0NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU1ODc3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MCIgQDMwOQotCQkJCQlQYXJlbnRfVmlldyAJQDMwNQotCQkJCQlsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAyNiIKLQkJCQkJY2xpZW50ICAgICAJQDMwNQotCQkJCQlzdXBwbGllciAgIAlAMjk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDUyNywgMTU5MikKLQkJCQkJICAgICg0MzcsIDE1OTIpCi0JCQkJCSAgICAoNDM3LCAxMzEzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgMTMxMykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTUiIEAzMTAKLQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAxOTExKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDNDY4MjkzMDNFNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAzMTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTAKLQkJCQkJbG9jYXRpb24gICAJKC0xNCwgMTE5MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzOCwgMTg3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ4NTYwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTBFIgotCQkJCQljbGllbnQgICAgIAlAMzEwCi0JCQkJCXN1cHBsaWVyICAgCUAyOTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE5MTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDMsIDE5NjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTYiIEAzMTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTAKLQkJCQkJbG9jYXRpb24gICAJKC0xNCwgMTE5MSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMTgiCi0JCQkJCWNsaWVudCAgICAgCUAzMTAKLQkJCQkJc3VwcGxpZXIgICAJQDI5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzMjIsIDE5MTEpCi0JCQkJCSAgICAoMjI5LCAxOTExKQotCQkJCQkgICAgKDIyOSwgMTMxMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjksIDEzMTMpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDMxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNTEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQl3aWR0aCAgICAgIAkzODkKLQkJCQloZWlnaHQgICAgIAkyMTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAzMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQl3aWR0aCAgICAgIAkyMjIKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAzMTcKLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCA2MDQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAzMTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTcKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNjQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA3Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VUeXBlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjYxMDE3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMzE3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjA2LCA2MDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDU2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgzODgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDMyMQotCQkJCQlQYXJlbnRfVmlldyAJQDMxNwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzLCAzMTMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJCQljbGllbnQgICAgIAlAMzE3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCA2MDQpCi0JCQkJCSAgICAoMTc0LCA2MDQpCi0JCQkJCSAgICAoMTc0LCAyMjUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDIyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgMjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTc3MjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyIgQDMyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAyMDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklUeXBlcyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNSwgMTUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIgotCQkJCXdpZHRoICAgICAgCTI0OAotCQkJCWhlaWdodCAgICAgCTE2NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDgwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1OSwgNzUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTczOQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyIKLQkJCQl3aWR0aCAgICAgIAk3NTcKLQkJCQloZWlnaHQgICAgIAkxMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMzI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDEyMTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjksIDExMDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk2NzMKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTkiIEAzMjcKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNiwgOTc1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ1MDBGMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjAiIEAzMjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcKLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRCIKLQkJCQkJY2xpZW50ICAgICAJQDMyNwotCQkJCQlzdXBwbGllciAgIAlAMzI1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCA4NTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzc0LCA5MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1NjQ4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAMzMwCi0JCQkJCVBhcmVudF9WaWV3IAlAMzI3Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDYsIDEwMzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDc1NzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNFIgotCQkJCQljbGllbnQgICAgIAlAMzI3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDEwOTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzg4LCAxMDUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTE1MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0QzQjAzODAiCi0JCQkJY2xpZW50ICAgICAJQDMxNQotCQkJCXN1cHBsaWVyICAgCUAzMjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDUsIDUwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzA1LCAzMDcpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAzMzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDIyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAxMzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJCXdpZHRoICAgICAgCTUwMAotCQkJCWhlaWdodCAgICAgCTIxMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQljbGllbnQgICAgIAlAMzE1Ci0JCQkJc3VwcGxpZXIgICAJQDMzNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NCwgNTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTQsIDMzMCkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDMzNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA0NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDM2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJd2lkdGggICAgICAJNjg3Ci0JCQkJaGVpZ2h0ICAgICAJMjE2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMzM3Ci0JCQkJbG9jYXRpb24gICAJKDEyMDYsIDQ5MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMzM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzM3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAzODYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSIKLQkJCQkJY2xpZW50ICAgICAJQDMzNwotCQkJCQlzdXBwbGllciAgIAlAMzM0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMDYsIDQ5MykKLQkJCQkJICAgICgxMDk0LCA0OTMpCi0JCQkJCSAgICAoMTA5NCwgMzMwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDMzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDM3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI4MzI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMzQxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzM3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk2LCA0NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzOTcxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJCQkJY2xpZW50ICAgICAJQDMzNwotCQkJCQlzdXBwbGllciAgIAlAMzM2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgxLCA0OTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE1LCA1NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NDk1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5NiwgMzkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTQ5MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYyN0YwMEI3IgotCQkJCWNsaWVudCAgICAgCUAzMjUKLQkJCQlzdXBwbGllciAgIAlAMzM2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgxMiwgNzQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCA1NzIpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4zIE1lc3NhZ2VzIgotCQkJcXVpZCAgICAgICAJIjNCQ0U4NTNEMDJDOCIKLQkJCXRpdGxlICAgICAgCSIyLjMgTWVzc2FnZXMiCi0JCQl6b29tICAgICAgIAk4NQotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiIEAzNDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCAxMjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklNZXNzYWdlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCA3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIKLQkJCQl3aWR0aCAgICAgIAkzODAKLQkJCQloZWlnaHQgICAgIAkzMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IiBAMzQ3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgMTI0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUGFydCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIgotCQkJCXdpZHRoICAgICAgCTYxNwotCQkJCWhlaWdodCAgICAgCTMyNAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMzQ4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA4MTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDY5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQl3aWR0aCAgICAgIAk0OTIKLQkJCQloZWlnaHQgICAgIAkyNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTk2RDAyRjEiCi0JCQkJY2xpZW50ICAgICAJQDM0OAotCQkJCXN1cHBsaWVyICAgCUAzNDcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzA0LCA2NzgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDQsIDM4NikpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMzUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDY1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCA1MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTc5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTMwKQotCQkJCXdpZHRoICAgICAgCTQzMgotCQkJCWhlaWdodCAgICAgCTMyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM1MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJCQljbGllbnQgICAgIAlAMzUwCi0JCQkJc3VwcGxpZXIgICAJQDM0NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAzNTIKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFydHMiIEAzNTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTIKLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCA4OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTc0NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiCi0JCQkJCWNsaWVudCAgICAgCUAzNTIKLQkJCQkJc3VwcGxpZXIgICAJQDM0OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTgwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDIwMzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMzU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzUyCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyIKLQkJCQkJY2xpZW50ICAgICAJQDM1MgotCQkJCQlzdXBwbGllciAgIAlAMzUwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY4OCwgOTUyKQotCQkJCQkgICAgKDQ0NSwgOTUyKQotCQkJCQkgICAgKDQ0NSwgODE3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDkxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ3NjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkpKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ4c2QiCi0JCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIlhTRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIm9yZy5lY2xpcHNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkieHNkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94c2QvMjAwMi9YU0QiKSkKLQkJcXVpZCAgICAgICAJIjM5QUJEQzZGMDFBQSIKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREFubm90YXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRFMjAzNjYiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXBwbGljYXRpb25JbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFQkYwMkM4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZXJJbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFRUEwMTU3IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RjA1MDFFMiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiRE9NQXR0ciIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCN0RDMDE5MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjEwM0JFIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y1MjAyQjQiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ4RTIwMEVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwM0EwMjIxIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFQjAyQTgiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjdCMDM4NiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlIgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjcyRDczNzAzOEYiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0NGMzAyN0QiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRERCMDNCNyIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWludCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDREUwMDJEOCIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjAyMjAzODIiCi0JCQkJdHlwZSAgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzE5RDkwMzQxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREJvdW5kZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2M0MwMjI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzUyQTAwQ0MiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5RmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjRGMDEzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1NkMwMTUzIgotCQkJCXR5cGUgICAgICAgCSJYU0RDYXJkaW5hbGl0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhCODAyODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJBQTIwMzEwIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVyaXZhdGlvbk1ldGhvZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNkU0MDIwRSIKLQkJCQl0eXBlICAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCIKLQkJCQlpbml0diAgICAgIAkicmVzdHJpY3Rpb24iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNzFEMDI2QSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MzgwMEM1IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQTQyMDJCOCIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNCOEEwM0U2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjYxODAxNEQiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGQjk3MDA2RSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWl4ZWQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzMxQUY1RTAzQTYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTkwM0QyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUREQjUwMUE1IgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW5pbmdGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpYWdub3N0aWMiCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNENEMwRjRDMDFBMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V2ZXJpdHkiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OTFDMDA1RCIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU1RkREMDI4MCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0MzAxNkIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5lIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjA3RTAyMTMiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2x1bW4iCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MTFFMDI5NiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vZGUiCi0JCQkJcXVpZCAgICAgICAJIjNDMDE2QjZCMDIwMCIKLQkJCQl0eXBlICAgICAgIAkiRE9NTm9kZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbm5vdGF0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0RjAxODYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjE3MDAyRSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTY2MDMzOSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmlsbGFibGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkZCNDAyOUYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNDY4MDM2OCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRBMDAzQjkiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNEUwMDAwRSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE0QzAwQjIiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNjgwMUMxIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODlGNjIwM0NGIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMzREQ0IwMDAxOCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERW51bWVyYXRpb25GYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOUQwM0M3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QzY0MDA1NCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Mzc0MDI1MyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhY2V0TmFtZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUZCNDAxRUMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlZmZlY3RpdmVWYWx1ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUFFMzAzQjYiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGZWF0dXJlIgotCQkJcXVpZCAgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4MTAyMEYiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4ODAwQzUiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnN0cmFpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZm9ybSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDJCMDMzRSIKLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjcxQTFCMDE2RiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImdsb2JhbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTAwNzAzNzIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmVhdHVyZVJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTA0NDAxODUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZpeGVkRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5OUUwMEMxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Qzg4MDFCNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkE2MDAyMDEiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qjk5MDAxNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc5RDIwMDhBIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5RTgwMUQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzdCMDM5NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDFDNzAxNDMiCi0JCQkJdHlwZSAgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEQ5MDAzRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QURCMTUwMzZDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREluY2x1ZGUiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDN0QwMjUwIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOERDMDM4MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRExlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc4MDAyREYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzZDMDA0QiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhFeGNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOEUwMzA5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQzMTAzQUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUUyMDFGNyIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTc0MDI3RCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExOTMwMzU0IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhJbmNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCODMwM0I4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heExlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3N0M3MDE0NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I3RDAwRkMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0RBMDBGMyIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5FeGNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTkwMjgxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQyNDAwOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUQxMDM5OCIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUEyMDA4RSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQkUwM0UyIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5JbmNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTIwMzUzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NzhDMDA2NSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNDAwQzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Nzk5MDE1RSIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEE2NDAyNzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tcG9zaXRvciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGMUQwMUNGIgotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wb3NpdG9yIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRTIwMzgxIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI1NTAzODUiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExRjYwMkU4IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lZENvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDAwMTQyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NDcwNDAzMUUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc05hbWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1N0YwMTI3IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidVJJIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTg3MDBFMiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzVVJJIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNUFBMDJBRiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwOTYzMDI1RSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDk0MzAyRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU0RjAyM0MiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5c3RlbUlkZW50aWZpZXIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzJFMDBGMCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lkZW50aWZpZXIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzM0MDM5NyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROdW1lcmljRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjQyMDA3NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1QTMwMDEyIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjU5MDEyQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc0RjYwMkRBIgotCQkJCXR5cGUgICAgICAgCSJYU0RPcmRlcmVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWluT2NjdXJzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOEUwM0IyIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWF4T2NjdXJzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOTkwM0FFIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3ODBCRDkwMDU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhdHRlcm5GYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDQTUwMzhEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qzc5MDMxMSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0QkEwMjNDIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNjgwMDIxNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkFFMjA2MDE3MiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNjQwMjQwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QUE2MDMxQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hIgotCQkJcXVpZCAgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0M0QTAxODIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQzI3ODRFNTAzREQiCi0JCQkJdHlwZSAgICAgICAJIkRPTURvY3VtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NjhFQzAyMjYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5QkZGMDE4MCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUZvcm1EZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNEIwMTAyIgotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIgotCQkJCWluaXR2ICAgICAgCSJ1bnF1YWxpZmllZCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Rm9ybURlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA3ODAwQUMiCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDNEE3MDAzOCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2tEZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY1OUQwMkQ4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIgotCQkJCXF1aWQgICAgICAgCSIzRDIyRDZEODAzNTYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCXF1aWQgICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhFNjAzNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJcXVpZCAgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NoZW1hTG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOUIzMDMzMCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY29wZSIKLQkJCXF1aWQgICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNENjQwMjMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzE1ODAwQTkiCi0JCQkJdHlwZSAgICAgICAJIlhTRFZhcmlldHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NDRGMDE0NiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2NUUwMzVBIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RTaW1wbGVGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWxpZEZhY2V0cyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEFCMEYwMEI2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRlcm0iCi0JCQlxdWlkICAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI0NDAwNjkiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3OUEwMDIwRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I2MTAzMzciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUFCMDIzMiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRjUwMTNBIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FCMTAwNEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg2MjAwNDUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODUwMDIwMSIKLQkJCQl0eXBlICAgICAgIAkiWFNEV2hpdGVTcGFjZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2lsZGNhcmQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMEU5MDE5RSIKLQkJCQl0eXBlICAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZUNvbnN0cmFpbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDRjg2MDIyMyIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2Nlc3NDb250ZW50cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMTJFMDFFNCIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBN0JEQjcwMUY5IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2RDg0RjcwMDkyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDkwMTUwM0RFIgotCQkJCXR5cGUgICAgICAgCSJYU0RYUGF0aFZhcmlldHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCN0JCQkUxMDFCMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01BdHRyIgotCQkJcXVpZCAgICAgICAJIjNCQkY4Qzg5MDFCNiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uQXR0ciIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjhDQjAwMEQ1IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTURvY3VtZW50IgotCQkJcXVpZCAgICAgICAJIjNDMjc4NTBFMDM4MSIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NTFCMDNDNiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNCODE4OTc5MDIwMCIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4MTg5REIwMzc0IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTU5vZGUiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Ob2RlIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjVCRjAwMkQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiVmFsdWUiCi0JCQlxdWlkICAgICAgIAkiM0MwNDBCNUIwMzFGIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuT2JqZWN0IgotCQkJCXF1aWQgICAgICAgCSIzQzA0MEI4RDAzRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0JBN0IwRTgwMUE4IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcHRpb25hbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMTUwMkI3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2hpYml0ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTIyMDJEMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjkwMkYwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDYXJkaW5hbGl0eSIKLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1RDAwOUIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbml0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxREMwMkVEIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvdW50YWJseUluZmluaXRlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFFQzAxNDEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhGaW5hbCIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzJDQTAxQ0IiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRTcwMERBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFQTAxNkEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZEMjAxMTIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvc2l0b3IiCi0JCQlxdWlkICAgICAgIAkiM0I4NjlCNjIwMDM3IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5QkQwMDAwMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaG9pY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0I4MDExRSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXF1ZW5jZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDRTUwMDU3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW50IgotCQkJcXVpZCAgICAgICAJIjNCODY5RTI2MDFBRSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOEUwMjU4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU5OTAyNzEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I4NkE3OUYwM0EyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbXB0eSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3Q0QwMkYwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNpbXBsZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDEwMENFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMzAxQjciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE9ubHkiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0Q3MDJFOSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGVyaXZhdGlvbk1ldGhvZCIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTBCMDAwQ0UiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQzgwMzI5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDQzAxNjIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpYWdub3N0aWNTZXZlcml0eSIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjhBNzAzMkYiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhdGFsIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhDMzAzRDAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXJyb3IiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEU3MDBFMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3YXJuaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFQTAxRkYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5mb3JtYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCRkU3RkMyMDE5QSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QTQwM0RGIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjc5MDA0NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjdGMDFBQyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2ODMwMjBCIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNDUwMDY5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGb3JtIgotCQkJcXVpZCAgICAgICAJIjNCOUY5MTNCMDFFQiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicXVhbGlmaWVkIgotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE2RjAwMjMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5xdWFsaWZpZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MThDMDA3RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I4NkExRTAwMjcyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXkiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEyMDA4NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXlyZWYiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEzMDE0RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlxdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjE2MDM2NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCOTdDNUVBMDAyMyIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW55IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2MDAwMzQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm90IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2MjAwNUYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V0IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2NTAxMTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWQiCi0JCQlxdWlkICAgICAgIAkiM0JDNzcxNTIwMkU0IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWxzZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQTkwMjcxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcnRpYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUJCMDFGRiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0b3RhbCIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQzQwMUIyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQcm9jZXNzQ29udGVudHMiCi0JCQlxdWlkICAgICAgIAkiM0I4RkY4QzcwMjg0IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHJpY3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY4MDA0NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXgiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY2MDM4QiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJza2lwIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhFODAyQkEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4QjAwQjgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjk0MDI5MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjUwMDI5NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlRmluYWwiCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyNUQwMjk1IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MTAyMzAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgzMDEzOCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODgwMjRFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RTAwMzc0IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1OTEwMEFFIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjY0MDIzMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NkQwMjE2IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RWYXJpZXR5IgotCQkJcXVpZCAgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXRvbWljIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBNzAyREYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUQwMTM5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRjAzOUYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2UiCi0JCQlxdWlkICAgICAgIAkiM0JFRUQwRjYwMzQyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVzZXJ2ZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMEYwMTE3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcGxhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI3MDM0RCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2xsYXBzZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjkwMzk2IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aFZhcmlldHkiCi0JCQlxdWlkICAgICAgIAkiM0I4RkZCODkwMzNBIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZWxlY3RvciIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQUMwMTkyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJCMzAyNzgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY1IgotCQkJcXVpZCAgICAgICAJIjNDNjI2RUE3MDEwMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjYiCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY3IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQURDMDJGNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjgiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDIzOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjQyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjkiCi0JCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMDZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzBFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzE4IgotCQkJCWxhYmVsICAgICAgCSJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MSIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU2QjAyQ0IiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDcyIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTciCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MyIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI2QjAxOTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc0IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2RDAzMDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMxMyIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzUiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMDYwMjkxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzciCi0JCQlxdWlkICAgICAgIAkiM0I2OTQwNEUwMDY3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3OCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwNTAwMjlCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDJBNSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc5IgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTlGMDA4NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODAiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2QSIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlVXNlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgxIgotCQkJcXVpZCAgICAgICAJIjNDMjc1RDMyMDIyMCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODIiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBEIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODMiCi0JCQlxdWlkICAgICAgIAkiM0I2ODg3QkYwMTUwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBOCIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg1IgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjVFMDFGOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODYiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNTAiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODciCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1ODUwMTBEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4OCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQiIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg5IgotCQkJcXVpZCAgICAgICAJIjNCNkYxREU5MDE4QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTAiCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM2QyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM4MCIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MSIKLQkJCXF1aWQgICAgICAgCSIzQjkwMDY4ODAxQzIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkyIgotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50QW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2OEEwMTFCIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50QW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkzIgotCQkJcXVpZCAgICAgICAJIjNCNjgzMzM1MDM0MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzMzYwMjhFIgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk1IgotCQkJcXVpZCAgICAgICAJIjNCNkZEREQ3MDExMyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTYiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTciCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3REYwMjRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5OCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5OSIKLQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAwNkUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwMCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzRBIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAxIgotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAyIgotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDdDIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAzIgotCQkJcXVpZCAgICAgICAJIjNCNjg1MUJBMDEyNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA0IgotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA1IgotCQkJcXVpZCAgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIgotCQkJCWxhYmVsICAgICAgCSJjb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDYiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNyIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RDb250YWluZXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDgiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwOSIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMTAzNTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiIKLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTExIgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEyIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyM0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTMiCi0JCQlxdWlkICAgICAgIAkiM0I2ODkxMTQwMUFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNSIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNiIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNDMCIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNyIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExOCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTkiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQxRTYwMjUxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjAiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDJGNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAzMEIiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIxIgotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIyIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjMiCi0JCQlxdWlkICAgICAgIAkiM0M0MkRCREQwMjk3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjQiCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDExRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI1IgotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI2IgotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDRSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNyIKLQkJCXF1aWQgICAgICAgCSIzQjZENTk3MTAyRUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI4IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjkiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI2NTMwMTdBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJzY29wZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RCIKLQkJCQlsYWJlbCAgICAgIAkic2NvcGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzAiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMxIgotCQkJcXVpZCAgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEZlYXR1cmUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzMiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzUiCi0JCQlxdWlkICAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jZWRLZXkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzciCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzgiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzZWxlY3RvciIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM5IgotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQwIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmllbGRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJbGFiZWwgICAgICAJImZpZWxkcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQxIgotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q4MDJGQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQyIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDMiCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDUiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTcwMkM4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDYiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE4MDNFMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDciCi0JCQlxdWlkICAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDgiCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAxQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDI1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDkiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTAiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0aWNsZXMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMiIKLQkJCQlsYWJlbCAgICAgIAkicGFydGljbGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTEiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTUwMDhBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDA5NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMEEwIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUzIgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU0IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXAiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NSIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI0NTAzOTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOUUiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NyIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1OCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1OSIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDcxNTAxMTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MCIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MSIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0M4OTAxMjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MiIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTEwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiCi0JCQkJbGFiZWwgICAgICAJInRlcm0iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYzIgotCQkJcXVpZCAgICAgICAJIjNCNkFERTQyMDA5QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY0IgotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NSIKLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY3IgotCQkJcXVpZCAgICAgICAJIjNCNjg4RTZCMDAzRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY4IgotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2OSIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RDAxQkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MCIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5IgotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcxIgotCQkJcXVpZCAgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcyIgotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzMiCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NSIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAwNDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc3IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRUZGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc4IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzkiCi0JCQlxdWlkICAgICAgIAkiM0JGQzJBMTcwMUVEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODAiCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MSIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUVBNzAyM0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MiIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QiIKLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgzIgotCQkJcXVpZCAgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg0IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODUiCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODYiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNDOCIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg3IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNUFEMDM3NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg4IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0Q29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCIKLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODkiCi0JCQlxdWlkICAgICAgIAkiM0JDOEFFMDIwM0E4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTAiCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA1MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiCi0JCQkJbGFiZWwgICAgICAJImZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkxIgotCQkJcXVpZCAgICAgICAJIjNCNkMzNEI3MDIwOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkyIgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5MyIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NCIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCWxhYmVsICAgICAgCSJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NSIKLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDJBNSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTciCi0JCQlxdWlkICAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTgiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDIyRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5OSIKLQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MTAxNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDEiCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2Q0YwMDg4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDIiCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQlsYWJlbCAgICAgIAkiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDMiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA1IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjExMDI2RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA2IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDIwMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNyIKLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwOCIKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzMyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDkiCi0JCQlxdWlkICAgICAgIAkiM0JFQkRDODcwMjQ3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTAiCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDJGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjExIgotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wb25lbnRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImNvbXBvbmVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxMyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNCIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNyIKLQkJCQlsYWJlbCAgICAgIAkiZGlhZ25vc3RpY3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTUiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTYiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFsbERpYWdub3N0aWNzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJbGFiZWwgICAgICAJImFsbERpYWdub3N0aWNzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNyIKLQkJCXF1aWQgICAgICAgCSIzQzIxRENDNzAwRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxOCIKLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTkiCi0JCQlxdWlkICAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjAiCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIxIgotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIyIgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwRDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjMiCi0JCQlxdWlkICAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcxIgotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjUiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVDRjAwMDVFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjYiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAxRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDI4IgotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNyIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyOCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCWxhYmVsICAgICAgCSJvcmlnaW5hbFZlcnNpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjkiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVFQUIwMDFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzAiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDEwQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1IgotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMxIgotCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMyIgotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIgotCQkJCWxhYmVsICAgICAgCSJpdGVtVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMyIKLQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3MzAxOTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hRm9yU2NoZW1hIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUZCIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWFGb3JTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzUiCi0JCQlxdWlkICAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwM0MiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNyIKLQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzOCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM5IgotCQkJcXVpZCAgICAgICAJIjNDMjhBMEYyMDFBNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJFNSIKLQkJCQlsYWJlbCAgICAgIAkidHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDEiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE2REIwMUU1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0RFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MyIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ1IgotCQkJcXVpZCAgICAgICAJIjNDMjhBNzRCMDE3OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ3IgotCQkJcXVpZCAgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciCi0JCQkJbGFiZWwgICAgICAJImNvbXBsZXhUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ4IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDEyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDkiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwREQiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUxIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUyIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyNzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIgotCQkJCWxhYmVsICAgICAgCSJtaW5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUzIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDhEMDI1MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU0IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU1IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU2IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0Q0IgotCQkJCWxhYmVsICAgICAgCSJtYXhJbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU3IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU4IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIgotCQkJCWxhYmVsICAgICAgCSJtaW5JbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU5IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEIzMDIwNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYwIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTlBIgotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYxIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYyIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjIxIgotCQkJCWxhYmVsICAgICAgCSJtYXhFeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYzIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY0IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIgotCQkJCWxhYmVsICAgICAgCSJsZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY1IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY2IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIndoaXRlU3BhY2VGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA3NSIKLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY3IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY4IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVudW1lcmF0aW9uRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFDIgotCQkJCWxhYmVsICAgICAgCSJlbnVtZXJhdGlvbkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjkiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzAiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQlsYWJlbCAgICAgIAkicGF0dGVybkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDODAyQTciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MiIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUY1IgotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MyIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJudW1lcmljRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDEiCi0JCQkJbGFiZWwgICAgICAJIm51bWVyaWNGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDRjAxOTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NiIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDg1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiIKLQkJCQlsYWJlbCAgICAgIAkibWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NyIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3OCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAyNyIKLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3OSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0Q3IgotCQkJCWxhYmVsICAgICAgCSJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MiIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0IgotCQkJCWxhYmVsICAgICAgCSJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MyIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAwNDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmRlcmVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NiIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJib3VuZGVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOTgiCi0JCQkJbGFiZWwgICAgICAJImJvdW5kZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NyIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NDAxRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4OCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzYwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4RmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjU0RjAxNDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MiIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIxNyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MyIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQTAwQUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMDAzQTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NiIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NyIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5OCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5OSIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMSIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMiIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA2MCIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMyIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNDMyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNSIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MDAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNiIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMENGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNyIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwOCIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTBGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNGYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDExQSIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwOSIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjREMzAyOEUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMCIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkYzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljUGFydGljbGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGRCIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzExIgotCQkJcXVpZCAgICAgICAJIjNENEJCNEQ5MDFGNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzEyIgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyODQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjhFIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTMiCi0JCQlxdWlkICAgICAgIAkiM0Q0QzY4RkYwMUJGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTQiCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4IgotCQkJdGl0bGUgICAgICAJIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAMzYwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCA4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMzYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzYyCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzNjAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDkyOCwgMjI1KQotCQkJCSAgICAoOTI4LCAxMzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDM2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM2NAotCQkJCWxvY2F0aW9uICAgCSgxMjAzLCA3MDYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM2MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwMywgNzA2KQotCQkJCSAgICAoMTIwMywgNjE1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDM2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3MiwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJd2lkdGggICAgICAJNTIyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzY2Ci0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzNjUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ0NCwgNzA5KQotCQkJCSAgICAoNDQ0LCA2MTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzY3Ci0JCQkJbG9jYXRpb24gICAJKDE1NzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzYzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTcyLCA0NjUpCi0JCQkJICAgICgxNTcyLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAzNjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTAsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzNjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTA1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjYyLCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEAzNzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM2LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNzEKLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzNjkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ1MywgMTIwMykKLQkJCQkgICAgKDQ1MywgMTExMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDM3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAMzczCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgODAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzczCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzc0Ci0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDk1MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzczCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxODcyLCA5NTApCi0JCQkJICAgICgxODcyLCA4NTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzc1Ci0JCQkJbG9jYXRpb24gICAJKDE4MSwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzNzIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4MSwgNDY1KQotCQkJCSAgICAoMTgxLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAzNzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzAsIDEyMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDM3NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTA1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEAzNzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjksIDE0NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjU2Ci0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDM3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAzLCAxNDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTU4MQotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMzgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAzODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEwNTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDM4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzgyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA2LCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAzODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTI5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2LCAxMjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMzg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxMjgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEyMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAzODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAsIDE0NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk2OTQKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDM4NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAkzMTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEAzODgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlAMzcwCi0JCQkJc3VwcGxpZXIgICAJQDM2MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTQsIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEAzOTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDgwMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOTEKLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM5MAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTYyLCA5NDcpCi0JCQkJICAgICg5NjIsIDg1NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5MgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDM5MwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE4LCAxMTU0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMTYzNTM0Ci0JCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCWNsaWVudCAgICAgCUAzODMKLQkJCQlzdXBwbGllciAgIAlAMzY1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDksIDcwOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUAzODMKLQkJCQlzdXBwbGllciAgIAlAMzY5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDEyMDMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzcxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAMzg0Ci0JCQkJc3VwcGxpZXIgICAJQDM3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNzUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUAzODIKLQkJCQlzdXBwbGllciAgIAlAMzYzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDAyLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlAMzYzCi0JCQkJc3VwcGxpZXIgICAJQDM2MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjksIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OSwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDM4MAotCQkJCXN1cHBsaWVyICAgCUAzNjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkwLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCWNsaWVudCAgICAgCUAzNjgKLQkJCQlzdXBwbGllciAgIAlAMzY1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNzA5KQotCQkJCWRyYXdTdXBwbGllciAJQDM2NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDM4NQotCQkJCXN1cHBsaWVyICAgCUAzOTAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzIxLCAxMjI1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzIxLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwMQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQwMgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNywgODg2KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMjE1ODEyCi0JCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCWNsaWVudCAgICAgCUAzNzcKLQkJCQlzdXBwbGllciAgIAlAMzYzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwMCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDM2NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDM3NwotCQkJCXN1cHBsaWVyICAgCUAzNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCA5NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAMzY5Ci0JCQkJc3VwcGxpZXIgICAJQDM5MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1MCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAMzcyCi0JCQkJc3VwcGxpZXIgICAJQDM2MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIgotCQkJCWNsaWVudCAgICAgCUAzODgKLQkJCQlzdXBwbGllciAgIAlAMzYwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxMiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEyLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEI4MDI4NiIKLQkJCQljbGllbnQgICAgIAlAMzY1Ci0JCQkJc3VwcGxpZXIgICAJQDM2MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUAzNjEKLQkJCQlzdXBwbGllciAgIAlAMzYwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzUwLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAMzg3Ci0JCQkJc3VwcGxpZXIgICAJQDM2MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3MiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzIsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDEwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUAzNzYKLQkJCQlzdXBwbGllciAgIAlAMzczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MywgMTIyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQotCQkJCWRyYXdTdXBwbGllciAJQDM3NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJY2xpZW50ICAgICAJQDM3OAotCQkJCXN1cHBsaWVyICAgCUAzNjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQljbGllbnQgICAgIAlAMzc5Ci0JCQkJc3VwcGxpZXIgICAJQDM2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDE0MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzEsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDEzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUAzOTAKLQkJCQlzdXBwbGllciAgIAlAMzYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTU5LCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDM2NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDM3MwotCQkJCXN1cHBsaWVyICAgCUAzNjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzIsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUAzODEKLQkJCQlzdXBwbGllciAgIAlAMzkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYyLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjIsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDE3Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NSwgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0MjUzMQotCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCQUEyMDMxMCIKLQkJCQljbGllbnQgICAgIAlAMzg2Ci0JCQkJc3VwcGxpZXIgICAJQDM3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDM3NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDM4NgotCQkJCXN1cHBsaWVyICAgCUAzNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDE0MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMTIwMykKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNzEpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzNzRCMTgxOTAwMjgiCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAk5NgotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQxOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc4NCwgMTYzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjkiIEA0MjEKLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAxNjI3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNjUzMDE3QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NvcGUiIEA0MjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjEKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzcxMjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIgotCQkJCQljbGllbnQgICAgIAlANDIxCi0JCQkJCXN1cHBsaWVyICAgCUA0MTkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MSwgMTYyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTY2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzAiIEA0MjUKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjEKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkUiCi0JCQkJCWNsaWVudCAgICAgCUA0MjEKLQkJCQkJc3VwcGxpZXIgICAJQDQyMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI3LCAxNjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBANDI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAxMjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANDI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYxIiBANDI4Ci0JCQkJbG9jYXRpb24gICAJKDIyMjksIDExMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDODkwMTIyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjIiIEA0MjkKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjgKLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiCi0JCQkJCWNsaWVudCAgICAgCUA0MjgKLQkJCQkJc3VwcGxpZXIgICAJQDQyNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDMwCi0JCQkJCVBhcmVudF9WaWV3IAlANDI4Ci0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTU3LCAxMTIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Rlcm0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDQyOAotCQkJCQlzdXBwbGllciAgIAlANDI2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTE3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzQsIDExMTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExOTQwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEA0MzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDkiIEA0MzUKLQkJCQlsb2NhdGlvbiAgIAkoMjIxOSwgODgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNjA2MDI2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUwIiBANDM2Ci0JCQkJCVBhcmVudF9WaWV3IAlANDM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDQzNQotCQkJCQlzdXBwbGllciAgIAlANDM0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA4MjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0MzcKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MzUKLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTA1LCA4ODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFydGljbGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIyIgotCQkJCQljbGllbnQgICAgIAlANDM1Ci0JCQkJCXN1cHBsaWVyICAgCUA0MjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDkzOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyODEsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzksIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANDQxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDUsIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQ0MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTUiIEA0NDMKLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk2IiBANDQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlANDQzCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJCWNsaWVudCAgICAgCUA0NDMKLQkJCQkJc3VwcGxpZXIgICAJQDQ0MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1OTAsIDExNDApCi0JCQkJCSAgICAoNTQwLCAxMTQwKQotCQkJCQkgICAgKDU0MCwgMTA0NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDAsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA0NDUKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDMKLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMDUzNTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANDQzCi0JCQkJCXN1cHBsaWVyICAgCUA0NDIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTkwLCAxMTQwKQotCQkJCQkgICAgKDY0MSwgMTE0MCkKLQkJCQkJICAgICg2NDEsIDEwNDUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQxLCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg0LCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTIyNDQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQ0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgOTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk3IiBANDQ5Ci0JCQkJbG9jYXRpb24gICAJKDExMTksIDExMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3REYwMjRGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5OCIgQDQ1MAotCQkJCQlQYXJlbnRfVmlldyAJQDQ0OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1NjksIC04KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0UxMDBGRCIKLQkJCQkJY2xpZW50ICAgICAJQDQ0OQotCQkJCQlzdXBwbGllciAgIAlANDQ4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRUeXBlIiBANDUxCi0JCQkJCVBhcmVudF9WaWV3IAlANDQ5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU5LCAxMTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZFIgotCQkJCQljbGllbnQgICAgIAlANDQ5Ci0JCQkJCXN1cHBsaWVyICAgCUA0MzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MywgMTEyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMyIgQDQ1NAotCQkJCWxvY2F0aW9uICAgCSgxNDU1LCA5ODIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkEwMTI2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDQiIEA0NTUKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTQKLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTAiCi0JCQkJCWNsaWVudCAgICAgCUA0NTQKLQkJCQkJc3VwcGxpZXIgICAJQDQ0OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NSwgOTgyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4MCwgOTgyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA0NTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTQKLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDUsIDkyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2Mjg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MSIKLQkJCQkJY2xpZW50ICAgICAJQDQ1NAotCQkJCQlzdXBwbGllciAgIAlANDQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMwLCA5ODIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUwLCAxMDIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDI4NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTkiIEA0NTkKLQkJCQlsb2NhdGlvbiAgIAkoOTIxLCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDA2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAwIiBANDYwCi0JCQkJCVBhcmVudF9WaWV3IAlANDU5Ci0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0OSIKLQkJCQkJY2xpZW50ICAgICAJQDQ1OQotCQkJCQlzdXBwbGllciAgIAlANDQ4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANDYxCi0JCQkJCVBhcmVudF9WaWV3IAlANDU5Ci0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTkzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNEEiCi0JCQkJCWNsaWVudCAgICAgCUA0NTkKLQkJCQkJc3VwcGxpZXIgICAJQDQ0MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMzcxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc5LCAxMjU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODgzNDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANDY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNzY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTIyLCA3MjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQl3aWR0aCAgICAgIAkzOTgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDQ2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTYzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMywgMTU5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDQ2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgNDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODAzLCA0MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MyIgQDQ2NwotCQkJCWxvY2F0aW9uICAgCSgyMjE2LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTQiIEA0NjgKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjcKLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4IgotCQkJCQljbGllbnQgICAgIAlANDY3Ci0JCQkJCXN1cHBsaWVyICAgCUA0NjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA0NjkKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjcKLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA2MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyNjA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDQ2NwotCQkJCQlzdXBwbGllciAgIAlANDM0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU2LCA2MzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzMzY0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA0NzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTksIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MyIgQDQ3MwotCQkJCWxvY2F0aW9uICAgCSgxNjc2LCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4N0JGMDE1MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODQiIEA0NzQKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzMKLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTciCi0JCQkJCWNsaWVudCAgICAgCUA0NzMKLQkJCQkJc3VwcGxpZXIgICAJQDQ3MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEzNzEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDQ3NQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3MwotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NywgMTEwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjI1NzY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBOCIKLQkJCQkJY2xpZW50ICAgICAJQDQ3MwotCQkJCQlzdXBwbGllciAgIAlANDQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTgsIDExMDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3OSIgQDQ3OAotCQkJCWxvY2F0aW9uICAgCSgxNDI5LCAxNDM4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTlGMDA4NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODAiIEA0NzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzgKLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDY5IgotCQkJCQljbGllbnQgICAgIAlANDc4Ci0JCQkJCXN1cHBsaWVyICAgCUA0NzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjEwLCAxNDM4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDQ4MAotCQkJCQlQYXJlbnRfVmlldyAJQDQ3OAotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDE1MDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMyNTk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDZBIgotCQkJCQljbGllbnQgICAgIAlANDc4Ci0JCQkJCXN1cHBsaWVyICAgCUA0NDEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ4LCAxNDM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNywgMTM5MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTYzNTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANDgzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODciIEA0ODQKLQkJCQlsb2NhdGlvbiAgIAkoNzc3LCAxNDI1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTg1MDEwRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODgiIEA0ODUKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODQKLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZBIgotCQkJCQljbGllbnQgICAgIAlANDg0Ci0JCQkJCXN1cHBsaWVyICAgCUA0NDEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NiwgMTQyNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANDg2Ci0JCQkJCVBhcmVudF9WaWV3IAlANDg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAxNTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU5MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZCIgotCQkJCQljbGllbnQgICAgIAlANDg0Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OCwgMTQyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMSwgMTM4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyNDQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDcxIiBANDg5Ci0JCQkJbG9jYXRpb24gICAJKDIzNywgMTIwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2QjAyQ0IiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDcyIiBANDkwCi0JCQkJCVBhcmVudF9WaWV3IAlANDg5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE2IgotCQkJCQljbGllbnQgICAgIAlANDg5Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTM3MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANDkxCi0JCQkJCVBhcmVudF9WaWV3IAlANDg5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODgsIDEyNDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE3IgotCQkJCQljbGllbnQgICAgIAlANDg5Ci0JCQkJCXN1cHBsaWVyICAgCUA0NDIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NSwgMTI0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDQ5NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OCwgNzQzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MyIgQDQ5NQotCQkJCWxvY2F0aW9uICAgCSg3MjgsIDc3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNTAzNDAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk0IiBANDk2Ci0JCQkJCVBhcmVudF9WaWV3IAlANDk1Ci0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhEIgotCQkJCQljbGllbnQgICAgIAlANDk1Ci0JCQkJCXN1cHBsaWVyICAgCUA0NDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzI4LCA3NzUpCi0JCQkJCSAgICAoNzg4LCA3NzUpCi0JCQkJCSAgICAoNzg4LCA5MzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODgsIDkzOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ5NwotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU4LCA4ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4xNDA5NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhFIgotCQkJCQljbGllbnQgICAgIAlANDk1Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcyOCwgNzc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc5LCA3NzUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTAsIDgxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE1MjQzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANTAwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTcsIDQwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzUiIEA1MDEKLQkJCQlsb2NhdGlvbiAgIAkoMTYyOSwgNTc0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEMjlFMDE0RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlZEtleSIgQDUwMgotCQkJCQlQYXJlbnRfVmlldyAJQDUwMQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjEsIDYwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2VkS2V5IgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNzk3Mjk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyQTgwMTY1IgotCQkJCQljbGllbnQgICAgIAlANTAxCi0JCQkJCXN1cHBsaWVyICAgCUA1MDAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYyOSwgNTc0KQotCQkJCQkgICAgKDE1NTUsIDU3NCkKLQkJCQkJICAgICgxNTU1LCA1MDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgNTAxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMiwgNTM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDc2MTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNiIgQDUwNQotCQkJCQlQYXJlbnRfVmlldyAJQDUwMQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNkYiCi0JCQkJCWNsaWVudCAgICAgCUA1MDEKLQkJCQkJc3VwcGxpZXIgICAJQDUwMAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjI5LCA1NzQpCi0JCQkJCSAgICAoMTY4OSwgNTc0KQotCQkJCQkgICAgKDE2ODksIDQ0NCkKLQkJCQkJICAgICgxNjE2LCA0NDQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxNiwgNDQ0KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzkiIEA1MDYKLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgNjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQwIiBANTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTA2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJCWNsaWVudCAgICAgCUA1MDYKLQkJCQkJc3VwcGxpZXIgICAJQDUwMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNTAxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBANTA4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTA2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTksIDY1NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzOTI1MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSIKLQkJCQkJY2xpZW50ICAgICAJQDUwNgotCQkJCQlzdXBwbGllciAgIAlANDY0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUzLCA2NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyOTkwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzciIEA1MTEKLQkJCQlsb2NhdGlvbiAgIAkoMTQxNSwgNjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM4IiBANTEyCi0JCQkJCVBhcmVudF9WaWV3IAlANTExCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQkJY2xpZW50ICAgICAJQDUxMQotCQkJCQlzdXBwbGllciAgIAlANTAwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA1MDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDUxMwotCQkJCQlQYXJlbnRfVmlldyAJQDUxMQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTMsIDY1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDExMjE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk5OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCQljbGllbnQgICAgIAlANTExCi0JCQkJCXN1cHBsaWVyICAgCUA0NjQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODEsIDY1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzkyNTIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDUxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDY4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNTk5Ci0JCQkJaGVpZ2h0ICAgICAJMjA5Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgxIiBANTE3Ci0JCQkJbG9jYXRpb24gICAJKDIzOTUsIDYwNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBNzAyM0UiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4MiIgQDUxOAotCQkJCQlQYXJlbnRfVmlldyAJQDUxNwotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgMTc0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRUE4MDM4QSIKLQkJCQkJY2xpZW50ICAgICAJQDUxNwotCQkJCQlzdXBwbGllciAgIAlANTE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzOTUsIDYwNikKLQkJCQkJICAgICgyMzk1LCA2NSkKLQkJCQkJICAgICgxNjExLCA2NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCA2NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm5vdGF0aW9uRGVjbGFyYXRpb25zIiBANTE5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTE3Ci0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDg5LCAxMDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODk3NzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhCIgotCQkJCQljbGllbnQgICAgIAlANTE3Ci0JCQkJCXN1cHBsaWVyICAgCUA0NjUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM5NSwgNjA2KQotCQkJCQkgICAgKDIzOTUsIDE2MzMpCi0JCQkJCSAgICAoMjA5OCwgMTYzMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk4LCAxNjMzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM0NCwgMTA1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDg3ODI5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NyIgQDUyMgotCQkJCWxvY2F0aW9uICAgCSgxNzcyLCAyNDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFRkYwMjRGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzgiIEA1MjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjIKLQkJCQkJbG9jYXRpb24gICAJKC05NDgsIC0zMjcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVGMDAwMjVBIgotCQkJCQljbGllbnQgICAgIAlANTIyCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDI0OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyIgQDUyNAotCQkJCQlQYXJlbnRfVmlldyAJQDUyMgotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzYsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzU5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNjQiCi0JCQkJCWNsaWVudCAgICAgCUA1MjIKLQkJCQkJc3VwcGxpZXIgICAJQDQ2NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzcyLCAyNDkpCi0JCQkJCSAgICAoMTgzMiwgMjQ5KQotCQkJCQkgICAgKDE4MzIsIDM5NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzcyLCAyNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODMyLCAzOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAzNDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNzg2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzMiIEA1MjcKLQkJCQlsb2NhdGlvbiAgIAkoMjM0NiwgNTE4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTkyMDIxNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc0IiBANTI4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTI3Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3MiwgMTg1NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuNjMwMDcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QiIKLQkJCQkJY2xpZW50ICAgICAJQDUyNwotCQkJCQlzdXBwbGllciAgIAlANTE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNDYsIDUxOCkKLQkJCQkJICAgICgyMzQ2LCAxNDkpCi0JCQkJCSAgICAoMTYxMSwgMTQ5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDE0OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiIEA1MzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjcKLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA4LCAxOTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0OTk0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MzAxOEMiCi0JCQkJCWNsaWVudCAgICAgCUA1MjcKLQkJCQkJc3VwcGxpZXIgICAJQDQ3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQ2LCA1MTgpCi0JCQkJCSAgICAoMjM0NiwgMTQ0MSkKLQkJCQkJICAgICgyMTY2LCAxNDQxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNjYsIDE0NDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjk5LCAxOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zNDg4NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc1IiBANTMzCi0JCQkJbG9jYXRpb24gICAJKDIwMywgMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDA0OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc2IiBANTM0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTMzCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3NCIKLQkJCQkJY2xpZW50ICAgICAJQDUzMwotCQkJCQlzdXBwbGllciAgIAlANTE2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE1OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9ucyIgQDUzNQotCQkJCQlQYXJlbnRfVmlldyAJQDUzMwotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM0OSwgMTk2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQ3NTcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3RSIKLQkJCQkJY2xpZW50ICAgICAJQDUzMwotCQkJCQlzdXBwbGllciAgIAlANDk0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIwMywgMTU5KQotCQkJCQkgICAgKDEwNCwgMTU5KQotCQkJCQkgICAgKDEwNCwgNzg0KQotCQkJCQkgICAgKDE4OSwgNzg0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5LCA3ODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUsIDIwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NzAxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3OSIgQDUzOAotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCAzMjkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMTcwMUVEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODAiIEA1MzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgKLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExQTAyNzMiCi0JCQkJCWNsaWVudCAgICAgCUA1MzgKLQkJCQkJc3VwcGxpZXIgICAJQDUxNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgMjY0KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEA1NDAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgKLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzUsIDMzOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwOTUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3RCIKLQkJCQkJY2xpZW50ICAgICAJQDUzOAotCQkJCQlzdXBwbGllciAgIAlANTAwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAzOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE4LCAzMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEwNzE0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzEiIEA1NDMKLQkJCQlsb2NhdGlvbiAgIAkoNDgsIDMyMCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQTAwQzMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MiIgQDU0NAotCQkJCQlQYXJlbnRfVmlldyAJQDU0MwotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC0yODgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkIwMjdEIgotCQkJCQljbGllbnQgICAgIAlANTQzCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDksIDMyMikKLQkJCQkJICAgICg0OSwgNjgpCi0JCQkJCSAgICAoMTAxMywgNjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDksIDMyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDY4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb25zIiBANTQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTQzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzOCwgMTA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5ODUzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0UiCi0JCQkJCWNsaWVudCAgICAgCUA1NDMKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OSwgMzIyKQotCQkJCQkgICAgKDQ5LCAxNDE1KQotCQkJCQkgICAgKDE3NCwgMTQxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAxNDE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTEsIDEwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5NjcwNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA1NDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgNDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUsIDQxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTUwMQotCQkJCWhlaWdodCAgICAgCTk3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIxIiBANTQ5Ci0JCQkJbG9jYXRpb24gICAJKDQ5OSwgNTg5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlDMDU5MDE5OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIyIiBANTUwCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1RDAxRTMiCi0JCQkJCWNsaWVudCAgICAgCUA1NDkKLQkJCQkJc3VwcGxpZXIgICAJQDU0OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OTksIDU4OSkKLQkJCQkJICAgICg0NTIsIDU4OSkKLQkJCQkJICAgICg0NTIsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTksIDU4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MiwgNDk2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIgQDU1MQotCQkJCQlQYXJlbnRfVmlldyAJQDU0OQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzLCAxMDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MTEsIDU4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJNi41MjA4MzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFRCIKLQkJCQkJY2xpZW50ICAgICAJQDU0OQotCQkJCQlzdXBwbGllciAgIAlANTQ4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5OSwgNTg5KQotCQkJCQkgICAgKDU0NywgNTg5KQotCQkJCQkgICAgKDU0NywgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQ3LCA0OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0OTksIDU1OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNSIgQDU1NAotCQkJCWxvY2F0aW9uICAgCSgyNDEsIDYxMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAwNTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNiIgQDU1NQotCQkJCQlQYXJlbnRfVmlldyAJQDU1NAotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0JGIgotCQkJCQljbGllbnQgICAgIAlANTU0Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDU1NgotCQkJCQlQYXJlbnRfVmlldyAJQDU1NAotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MDgsIDY5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg2NDQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDNDMCIKLQkJCQkJY2xpZW50ICAgICAJQDU1NAotCQkJCQlzdXBwbGllciAgIAlANDk0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNzMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCA2ODUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxMDE2OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTciIEA1NTkKLQkJCQlsb2NhdGlvbiAgIAkoODM3LCA0NjApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTgiIEA1NjAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTkKLQkJCQkJbG9jYXRpb24gICAJKC0xODE5LCAtNjgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCQljbGllbnQgICAgIAlANTU5Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNywgNDYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA0NjApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU2MQotCQkJCQlQYXJlbnRfVmlldyAJQDU1OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgNTI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTE0NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiCi0JCQkJCWNsaWVudCAgICAgCUA1NTkKLQkJCQkJc3VwcGxpZXIgICAJQDUwMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA4LCA0NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDQwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwNDM1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2OSIgQDU2NAotCQkJCWxvY2F0aW9uICAgCSg1NDEsIDI0NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RDAxQkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MCIgQDU2NQotCQkJCQlQYXJlbnRfVmlldyAJQDU2NAotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEUwMTk4IgotCQkJCQljbGllbnQgICAgIAlANTY0Ci0JCQkJCXN1cHBsaWVyICAgCUA1MTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMjQ2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9ucyIgQDU2NgotCQkJCQlQYXJlbnRfVmlldyAJQDU2NAotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDMsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDkzMDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTg5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTkiCi0JCQkJCWNsaWVudCAgICAgCUA1NjQKLQkJCQkJc3VwcGxpZXIgICAJQDU0OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1NDEsIDI0NikKLQkJCQkJICAgICgyMjQsIDI0NikKLQkJCQkJICAgICgyMjQsIDQwMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDEsIDI0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNCwgNDAwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2LCAzMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDY5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjMiIEA1NjkKLQkJCQlsb2NhdGlvbiAgIAkoMzUzLCA2MjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCREQwMjk3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjQiIEA1NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjkKLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDExRSIKLQkJCQkJY2xpZW50ICAgICAJQDU2OQotCQkJCQlzdXBwbGllciAgIAlANTQ4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDM1MywgNjIxKQotCQkJCQkgICAgKDMwNiwgNjIxKQotCQkJCQkgICAgKDMwNiwgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgNjIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA2LCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cCIgQDU3MQotCQkJCQlQYXJlbnRfVmlldyAJQDU2OQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzksIDYzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTQuODA4NTExCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTI4IgotCQkJCQljbGllbnQgICAgIAlANTY5Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzUzLCA2MjEpCi0JCQkJCSAgICAoNDAwLCA2MjEpCi0JCQkJCSAgICAoNDAwLCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDQ5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1MCwgNTgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY5NzY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIgotCQkJcXVpZCAgICAgICAJIjNCNjlFNzg2MDJDNSIKLQkJCXRpdGxlICAgICAgCSIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBANTc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2LCAxMDcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBuYW1lIDogU3RyaW5nIgotCQkJCQkiKyB0YXJnZXROYW1lc3BhY2UgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk1MzQKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA1NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU2NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJNTEyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDU3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNjgsIDE2ODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1MjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTE3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1ODQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJMTE3NwotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBkZXJpdmF0aW9uTWV0aG9kIDogWFNERGVyaXZhdGlvbk1ldGhvZCA9IHJlc3RyaWN0aW9uIgotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRENvbXBsZXhGaW5hbCIKLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIgotCQkJCQkiKyBjb250ZW50VHlwZUNhdGVnb3J5IDogWFNEQ29udGVudFR5cGVDYXRlZ29yeSIKLQkJCQkJIjw8MC4uKj4+ICsgcHJvaGliaXRlZFN1YnN0aXR1dGlvbnMgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpKQotCQkJCXdpZHRoICAgICAgCTExOTIKLQkJCQloZWlnaHQgICAgIAkzMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTc3Ci0JCQkJbG9jYXRpb24gICAJKDQ2MywgMzYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA1NzQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ2MywgMzYyKQotCQkJCSAgICAoNDYzLCAyMjEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA1NzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAxNjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMTU3OSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk2NDYKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANTc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgMzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCA5OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgcmVxdWlyZWQgOiBib29sZWFuIgotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIgotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQotCQkJCXdpZHRoICAgICAgCTU0OAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDU4MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMTkzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4MzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTI4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4OTApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMTI5NAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkgOiBYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJCSI8PDAuLio+PiArIG5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciCi0JCQkJCSIrIHByb2Nlc3NDb250ZW50cyA6IFhTRFByb2Nlc3NDb250ZW50cyIpKQotCQkJCXdpZHRoICAgICAgCTEzMDQKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDU4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE0NDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCAxMzg0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCXdpZHRoICAgICAgCTU5NgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANTgyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA1MTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0OTEpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTU0OAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIgotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQotCQkJCXdpZHRoICAgICAgCTU1NAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1ODMKLQkJCQlsb2NhdGlvbiAgIAkoMjk0LCA2OTcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDU4MgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjk0LCA2OTcpCi0JCQkJICAgICgyOTQsIDYwNSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA1ODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI1NiwgMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTk1LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTU0MAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDU4NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDUxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxOCwgNDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTg2Ci0JCQkJbG9jYXRpb24gICAJKDI2ODQsIDk2MikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANTg1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyNjg0LCA5NjIpCi0JCQkJICAgICgyNjg0LCA1NzYpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9zaXRvciIgQDU4NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxMTE2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb3NpdG9yIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDEwNjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlCNjIwMDM3IgotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW50IiBANTg4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzgsIDQ2OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWludCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODY5RTI2MDFBRSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGVyaXZhdGlvbk1ldGhvZCIgQDU4OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAyMjcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMjEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REZXJpdmF0aW9uTWV0aG9kIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4MCwgMjE2MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTBCMDAwQ0UiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IiBANTkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDE3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgMzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NkExRTAwMjcyIgotCQkJCXdpZHRoICAgICAgCTYyNQotCQkJCWhlaWdodCAgICAgCTMwMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb250ZW50VHlwZUNhdGVnb3J5IiBANTkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MDQsIDIyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIxMTUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMDY1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODZBNzlGMDNBMiIKLQkJCQl3aWR0aCAgICAgIAk1MTQKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDU5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTUxNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTQ2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiCi0JCQkJd2lkdGggICAgICAJMzYyCi0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2Nlc3NDb250ZW50cyIgQDU5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDIyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMjE1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTA2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGOEM3MDI4NCIKLQkJCQl3aWR0aCAgICAgIAk0MzgKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhWYXJpZXR5IiBANTk0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3NjgsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgOTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoVmFyaWV0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGQjg5MDMzQSIKLQkJCQl3aWR0aCAgICAgIAkzODEKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA1OTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAxODcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxNzg4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3MzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxODQ4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBsaXN0IgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgdW5pb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBANTk2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMjAwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTk0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTg5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzJDQTAxQ0IiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDIwMDEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzODIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIiBANTk3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDg1LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDEwNzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1OTEwMEFFIgotCQkJCXdpZHRoICAgICAgCTY0OAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDU5OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDExMTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTA2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDExNzYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHN1YnN0aXR1dGlvbiIKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDU5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2NjQsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIyMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjE2MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVCRTAyNzIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIyNzMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkKLQkJCQl3aWR0aCAgICAgIAk1NTAKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IiBANjAwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMjI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxNTQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUVBMDAyMyIKLQkJCQl3aWR0aCAgICAgIAk2OTYKLQkJCQloZWlnaHQgICAgIAkyOTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANjAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI2NCwgODgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDc0OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCA4MDkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMTM5NgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBuaWxsYWJsZSA6IGJvb2xlYW4iCi0JCQkJCSI8PDAuLio+PiArIGRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJCSI8PDAuLio+PiArIHN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyA6IFhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJMTQwNAotCQkJCWhlaWdodCAgICAgCTI4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlANjAxCi0JCQkJc3VwcGxpZXIgICAJQDU4MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4MSwgNzM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODEsIDY5NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANjAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCA4MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ5MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA2MDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCAxMTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDIwLCAxMTAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjA1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIgotCQkJCWNsaWVudCAgICAgCUA2MDQKLQkJCQlzdXBwbGllciAgIAlANTg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg2MiwgMTA4OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg2MiwgOTYyKQotCQkJCWRyYXdTdXBwbGllciAJQDU4NikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA2MDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMzEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTY4LCAxMjYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzODYKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjA3Ci0JCQkJbG9jYXRpb24gICAJKDIzNzUsIDE0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYwNgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjM3NSwgMTQ2NSkKLQkJCQkgICAgKDIzNzUsIDEzNzUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiCi0JCQkJY2xpZW50ICAgICAJQDYwNgotCQkJCXN1cHBsaWVyICAgCUA1ODUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzY4LCAxMjQ5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzY4LCA5NjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANTg2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlANTc2Ci0JCQkJc3VwcGxpZXIgICAJQDYwNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4MTgsIDE1MTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4MTgsIDE0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlANTc4Ci0JCQkJc3VwcGxpZXIgICAJQDYwNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDYsIDE1MDcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDYsIDE0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDYxMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTgsIDExMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQljbGllbnQgICAgIAlANjExCi0JCQkJc3VwcGxpZXIgICAJQDU4NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMTUsIDEwODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDk2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODYpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA2MTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjEzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDM0LCA0NjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTEzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTExNTAKLQkJCQloZWlnaHQgICAgIAkxNDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJY2xpZW50ICAgICAJQDYxMwotCQkJCXN1cHBsaWVyICAgCUA1NzQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY4LCA0NTYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjgsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA1NzcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA2MTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc4LCA3MDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNTAyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDYxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMjY4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjg0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIgotCQkJCWNsaWVudCAgICAgCUA2MTUKLQkJCQlzdXBwbGllciAgIAlANTc0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI5MCwgNjkxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjkwLCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyIKLQkJCQljbGllbnQgICAgIAlANjAzCi0JCQkJc3VwcGxpZXIgICAJQDU4MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MSwgODAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEsIDY5NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUA1ODIKLQkJCQlzdXBwbGllciAgIAlANTc0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzcyLCA0MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM3MiwgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDU3NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MjAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDU4NQotCQkJCXN1cHBsaWVyICAgCUA1NzQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjg3LCA0NDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2ODcsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA1NzcpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzI2NTAwNUYiCi0JCQl0aXRsZSAgICAgIAkiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIgQDYyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDg5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzIsIDg0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERml4ZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIKLQkJCQl3aWR0aCAgICAgIAkzMzgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANjIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgODk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDQsIDg0NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBANjIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY2LCAxMTEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbnVtZXJhdGlvbkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEA2MjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc3LCAxMTEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYyNQotCQkJCWxvY2F0aW9uICAgCSg3MTgsIDEwNDkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYyMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNzE4LCAxMDQ5KQotCQkJCSAgICAoNzE4LCA5NTkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBANjI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5OSwgODcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDYyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCA5MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODMsIDg3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCXdpZHRoICAgICAgCTM4OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBANjI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMzIsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDcsIDEwNDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJd2lkdGggICAgICAJNDY4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDYyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCAxMTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE5LCAxMDQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJd2lkdGggICAgICAJMzg4Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBANjMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgMTM3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDkxLCAxMzIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCQl3aWR0aCAgICAgIAkzNDgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEA2MzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjA4LCAxNTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MDUsIDE0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCXdpZHRoICAgICAgCTQyNAotCQkJCWhlaWdodCAgICAgCTEzNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MzIKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAxMjYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2MjEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE0NCwgMTI2MikKLQkJCQkgICAgKDE0NCwgOTY0KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBANjMzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDE1NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDcsIDE0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTEzNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEA2MzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTM3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCAxMzIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJd2lkdGggICAgICAJNDk4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBANjM1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTAsIDE2NzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDYzNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxOTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAxODUyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhFeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiIEA2MzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIsIDE2NzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5IgotCQkJCXdpZHRoICAgICAgCTQ0NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDYzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDE5MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNCwgMTg1MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEA2MzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MiwgMjA1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVG90YWxEaWdpdHNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDY0MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE4LCAyMDU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzlEMDNDNyIKLQkJCQljbGllbnQgICAgIAlANjIzCi0JCQkJc3VwcGxpZXIgICAJQDYyMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM5NCwgMTEwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzk0LCAxMDQ5KQotCQkJCWRyYXdTdXBwbGllciAJQDYyNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg2MjAwNDUiCi0JCQkJY2xpZW50ICAgICAJQDYzNAotCQkJCXN1cHBsaWVyICAgCUA2MjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMzA4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBANjQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAxNjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDQTUwMzhEIgotCQkJCWNsaWVudCAgICAgCUA2MjQKLQkJCQlzdXBwbGllciAgIAlANjIyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA0NCwgMTEwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0NCwgMTA0OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3ODAwMkRGIgotCQkJCWNsaWVudCAgICAgCUA2MzAKLQkJCQlzdXBwbGllciAgIAlANjIxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYzLCAxMzA4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjMsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkIiBANjQ2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE0MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEzMjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMjc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTUyMDJFNCIKLQkJCQl3aWR0aCAgICAgIAk0NDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHkiIEA2NDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTY2OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTVEMDA5QiIKLQkJCQl3aWR0aCAgICAgIAk0NDQKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZSIgQDY0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCAyMDMyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2MSwgMTkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQkVFRDBGNjAzNDIiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMjg3Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlZhbHVlIiBANjQ5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMjA5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDYyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJWYWx1ZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjAxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0MwNDBCNUIwMzFGIgotCQkJCXdpZHRoICAgICAgCTYzNgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjYxMDMzNyIKLQkJCQljbGllbnQgICAgIAlANjM5Ci0JCQkJc3VwcGxpZXIgICAJQDYyMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAyMDQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBANjUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAxMzc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzODApCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5MAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpCi0JCQkJd2lkdGggICAgICAJMzA0Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBANjUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTM3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTMyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEzODApCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpCi0JCQkJd2lkdGggICAgICAJMzA2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMjQwMDk4IgotCQkJCWNsaWVudCAgICAgCUA2NTEKLQkJCQlzdXBwbGllciAgIAlANjIxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM1LCAxMzA4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzUsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExRDMxMDNBRCIKLQkJCQljbGllbnQgICAgIAlANjUyCi0JCQkJc3VwcGxpZXIgICAJQDYyMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODEsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjUyMDM1MyIKLQkJCQljbGllbnQgICAgIAlANjM3Ci0JCQkJc3VwcGxpZXIgICAJQDY1MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NSwgMTY2NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg1LCAxNDQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4MzAzQjgiCi0JCQkJY2xpZW50ICAgICAJQDYzNQotCQkJCXN1cHBsaWVyICAgCUA2NTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAwLCAxNjY0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAwLCAxNDQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4RTAzMDkiCi0JCQkJY2xpZW50ICAgICAJQDYzNgotCQkJCXN1cHBsaWVyICAgCUA2NTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjIyLCAxODQwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIyLCAxNDQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNDAwQzAiCi0JCQkJY2xpZW50ICAgICAJQDYzMQotCQkJCXN1cHBsaWVyICAgCUA2MjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDcsIDE0ODUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCN0QwMEZDIgotCQkJCWNsaWVudCAgICAgCUA2MzMKLQkJCQlzdXBwbGllciAgIAlANjIxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM5NywgMTQ4NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM5NywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOTkwMDE2IgotCQkJCWNsaWVudCAgICAgCUA2NDAKLQkJCQlzdXBwbGllciAgIAlANjIxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NSwgMjA0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANjYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAzNjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMzE4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0MDYKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjYyCi0JCQkJbG9jYXRpb24gICAJKDM2NiwgNTIyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDM2NiwgNTIyKQotCQkJCSAgICAoMzY2LCA0MzApKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEA2NjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA2MjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM0LCA1NzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NjQKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA3ODEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY2MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjcyLCA3ODEpCi0JCQkJICAgICgyNzIsIDY4NykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSIKLQkJCQljbGllbnQgICAgIAlANjIyCi0JCQkJc3VwcGxpZXIgICAJQDY2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5NCwgODMzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTQsIDc4MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiIEA2NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCA2MjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNiwgNTczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGdW5kYW1lbnRhbEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IgotCQkJCXdpZHRoICAgICAgCTQ3MAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NjcKLQkJCQlsb2NhdGlvbiAgIAkoNzY4LCA3ODkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY2NgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNzY4LCA3ODkpCi0JCQkJICAgICg3NjgsIDY4NykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjU5MDEyQyIKLQkJCQljbGllbnQgICAgIAlANjI2Ci0JCQkJc3VwcGxpZXIgICAJQDY2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNTAsIDg2MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1MCwgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzYzQzAyMjQiCi0JCQkJY2xpZW50ICAgICAJQDYyNwotCQkJCXN1cHBsaWVyICAgCUA2NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTI1LCA4NjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjUsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjcwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NEYwMTMxIgotCQkJCWNsaWVudCAgICAgCUA2MjgKLQkJCQlzdXBwbGllciAgIAlANjY2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzNywgMTAzNikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzNywgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0MjAwNzQiCi0JCQkJY2xpZW50ICAgICAJQDYyOQotCQkJCXN1cHBsaWVyICAgCUA2NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAxMDM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDY3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0NTYsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCAxMDcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhcmlldHkgOiBYU0RWYXJpZXR5IgotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpCi0JCQkJd2lkdGggICAgICAJNjU2Ci0JCQkJaGVpZ2h0ICAgICAJMjUwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNyIgQDY3MwotCQkJCWxvY2F0aW9uICAgCSg3NzUsIDE3OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3MTAyRUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyOCIgQDY3NAotCQkJCQlQYXJlbnRfVmlldyAJQDY3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwOSwgMjM1KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMTkiCi0JCQkJCWNsaWVudCAgICAgCUA2NzMKLQkJCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzUsIDE3OCkKLQkJCQkJICAgICg1NTAsIDE3OCkKLQkJCQkJICAgICg1NTAsIDMwNikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU1MCwgMzA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2ltcGxlVHlwZURlZmluaXRpb24iIEA2NzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA2NzMKLQkJCQkJbG9jYXRpb24gICAJKC0xMjA5LCAtNDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgzMTMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTA1IgotCQkJCQljbGllbnQgICAgIAlANjczCi0JCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MSwgMjE1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTI1MDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg5IiBANjc5Ci0JCQkJbG9jYXRpb24gICAJKDM2OSwgNzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDIwM0E4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldHMiIEA2ODAKLQkJCQkJUGFyZW50X1ZpZXcgCUA2NzkKLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA0OTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4NjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTg3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNjUiCi0JCQkJCWNsaWVudCAgICAgCUA2NzkKLQkJCQkJc3VwcGxpZXIgICAJQDY2MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNjksIDcyKQotCQkJCQkgICAgKDEwMCwgNzIpCi0JCQkJCSAgICAoMTAwLCA1NjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMCwgNTYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDQ5OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3OTAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTAiIEA2ODMKLQkJCQkJUGFyZW50X1ZpZXcgCUA2NzkKLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjgzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc2LCAzMSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDYwMDUxIgotCQkJCQljbGllbnQgICAgIAlANjc5Ci0JCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2OSwgNzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCA3MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMxIiBANjg1Ci0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDUwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODYKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzgsIDQ0OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk2MAotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzMiIgQDY4NwotCQkJCQlQYXJlbnRfVmlldyAJQDY4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NiwgMzQwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREYiCi0JCQkJCWNsaWVudCAgICAgCUA2ODUKLQkJCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM4LCA1MDgpCi0JCQkJCSAgICAoMTQ4NywgNTA4KQotCQkJCQkgICAgKDE0ODcsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAyODUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpdGVtVHlwZURlZmluaXRpb24iIEA2ODkKLQkJCQkJUGFyZW50X1ZpZXcgCUA2ODUKLQkJCQkJbG9jYXRpb24gICAJKC00NDYsIDI4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDU3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpdGVtVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4yMTE1MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwRTAiCi0JCQkJCWNsaWVudCAgICAgCUA2ODUKLQkJCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM4LCA1MDgpCi0JCQkJCSAgICAoMTU5MCwgNTA4KQotCQkJCQkgICAgKDE1OTAsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCAyODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA0NjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMzk4NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTEiIEA2OTIKLQkJCQlsb2NhdGlvbiAgIAkoMTcyOSwgNTc0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNEI3MDIwOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkyIiBANjkzCi0JCQkJCVBhcmVudF9WaWV3IAlANjkyCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAzNTMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNEJFMDI1OCIKLQkJCQkJY2xpZW50ICAgICAJQDY5MgotCQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3MjksIDU3NCkKLQkJCQkJICAgICgxNjc4LCA1NzQpCi0JCQkJCSAgICAoMTY3OCwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzgsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIgQDY5NQotCQkJCQlQYXJlbnRfVmlldyAJQDY5MgotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgMzUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNjU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjI2OTIzMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNEJFMDI1OSIKLQkJCQkJY2xpZW50ICAgICAJQDY5MgotCQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3MjksIDU3NCkKLQkJCQkJICAgICgxNzgxLCA1NzQpCi0JCQkJCSAgICAoMTc4MSwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3ODEsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzAsIDUyMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzEyMTIxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MyIgQDY5OAotCQkJCWxvY2F0aW9uICAgCSg3NDgsIDI2OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzMjAxREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZ1bmRhbWVudGFsRmFjZXRzIiBANjk5Ci0JCQkJCVBhcmVudF9WaWV3IAlANjk4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIzNiwgNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDMxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQwOTA5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNjM1MDA2MyIKLQkJCQkJY2xpZW50ICAgICAJQDY5OAotCQkJCQlzdXBwbGllciAgIAlANjY2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc0OCwgMjY5KQotCQkJCQkgICAgKDY1OSwgMjY5KQotCQkJCQkgICAgKDY1OSwgNTYxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU5LCA1NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjgsIDM4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM4MDI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTQiIEA3MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA2OTgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTIsIDIyOCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDU5IgotCQkJCQljbGllbnQgICAgIAlANjk4Ci0JCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMjY5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTUiIEA3MDQKLQkJCQlsb2NhdGlvbiAgIAkoMTE3NSwgMzk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk2IiBANzA1Ci0JCQkJCVBhcmVudF9WaWV3IAlANzA0Ci0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAzMTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSIKLQkJCQkJY2xpZW50ICAgICAJQDcwNAotCQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzUsIDM5NikKLQkJCQkJICAgICgxMTM1LCAzOTYpCi0JCQkJCSAgICAoMTEzNSwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzUsIDM5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzUsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDcwNwotCQkJCQlQYXJlbnRfVmlldyAJQDcwNAotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgNDQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjUzMzMzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSIKLQkJCQkJY2xpZW50ICAgICAJQDcwNAotCQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzUsIDM5NikKLQkJCQkJICAgICgxMjE1LCAzOTYpCi0JCQkJCSAgICAoMTIxNSwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzUsIDM5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTUsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzIsIDM1OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5NjE1NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTciIEA3MTAKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDQ2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1NTcyMDE2QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk4IiBANzExCi0JCQkJCVBhcmVudF9WaWV3IAlANzEwCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjY4LCAzMjcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDIyRiIKLQkJCQkJY2xpZW50ICAgICAJQDcxMAotCQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNjAsIDQ0NikKLQkJCQkJICAgICgxMzA5LCA0NDYpCi0JCQkJCSAgICAoMTMwOSwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDksIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIiBANzEzCi0JCQkJCVBhcmVudF9WaWV3IAlANzEwCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjA0LCA1MDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy4wMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyNDMiCi0JCQkJCWNsaWVudCAgICAgCUA3MTAKLQkJCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzYwLCA0NDYpCi0JCQkJCSAgICAoMTQxMiwgNDQ2KQotCQkJCQkgICAgKDE0MTIsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYwLCA0NDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEyLCAyODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzczLCA0MDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MjE0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDcxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDUxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDI4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDM3OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDQ4OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbGlzdCIKLQkJCQkJIisgcmVzdHJpY3Rpb24iCi0JCQkJCSIrIHVuaW9uIikpCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFZhcmlldHkiIEA3MTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE4LCA5MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM3QjAzOTYiCi0JCQkJY2xpZW50ICAgICAJQDY2NgotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTEsIDU2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTkxLCA1MjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjYyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcxOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQljbGllbnQgICAgIAlANjYzCi0JCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3MiwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDUyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzIwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5IgotCQkJCWNsaWVudCAgICAgCUA2NjEKLQkJCQlzdXBwbGllciAgIAlANjQzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY2LCAzMDYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NiwgMjE1KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4ODAxQjQiCi0JCQkJY2xpZW50ICAgICAJQDYyMQotCQkJCXN1cHBsaWVyICAgCUA2NjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcsIDgyOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCA3ODEpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjU5MDI4MSIKLQkJCQljbGllbnQgICAgIAlANjM4Ci0JCQkJc3VwcGxpZXIgICAJQDY1MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MCwgMTg0MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwLCAxNDQ0KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjY5RDY4RDAwRDIiCi0JCQl0aXRsZSAgICAgIAkiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDcyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCXdpZHRoICAgICAgCTM1NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDcyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODIsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDcyNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDE1MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjYsIDE0NjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDcyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDMwNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2MywgMjYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDcyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEzMTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjA2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDcyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNzA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgNjYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANzI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTE0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANzMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA1MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA3MzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2OCwgMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDczMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTAsIDExNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3MzMKLQkJCQlsb2NhdGlvbiAgIAkoMTk5NCwgMTQxMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANzMyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxOTk0LCAxNDEyKQotCQkJCSAgICAoMTk5NCwgMTI3MSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDczNAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlANzI1Ci0JCQkJc3VwcGxpZXIgICAJQDczMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwODQsIDE0NDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwODQsIDE0MTIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzMzKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA3MzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAsIDgyMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDczNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODkyLCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDczNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NCwgMzQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA3MzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDE4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANzM5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc5MiwgMTcxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2NywgMTY3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTY2OQotCQkJCWhlaWdodCAgICAgCTEwMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA3MzkKLQkJCQlzdXBwbGllciAgIAlANzMyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU3MiwgMTY2MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU3MiwgMTQxMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MzMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA3NDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEwMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc4LCA5ODEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANzQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg4LCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIKLQkJCQl3aWR0aCAgICAgIAk0NTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA3NDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE1MzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDcxLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBANzQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQ0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzIsIDY4NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAk3MzgKLQkJCQloZWlnaHQgICAgIAk1NDMKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzMiIEA3NDUKLQkJCQlsb2NhdGlvbiAgIAkoODY1LCAxMzU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDE4MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM0IiBANzQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCA1NTkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzNDIgotCQkJCQljbGllbnQgICAgIAlANzQ1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2NSwgMTM1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY3MSwgMTM1OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDUKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5OCwgMTMyMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuMTE2NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzQ2IgotCQkJCQljbGllbnQgICAgIAlANzQ1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODY1LCAxMzU5KQotCQkJCQkgICAgKDkyNSwgMTM1OSkKLQkJCQkJICAgICg5MjUsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMjc2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDY0MjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU3IiBANzUwCi0JCQkJbG9jYXRpb24gICAJKDcxMywgNzA5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBGMDIxMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU4IiBANzUxCi0JCQkJCVBhcmVudF9WaWV3IAlANzUwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTAwMEM5IgotCQkJCQljbGllbnQgICAgIAlANzUwCi0JCQkJCXN1cHBsaWVyICAgCUA3MjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxMywgNzA5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA3MDkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzUyCi0JCQkJCVBhcmVudF9WaWV3IAlANzUwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDY2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTUyMzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwRDMiCi0JCQkJCWNsaWVudCAgICAgCUA3NTAKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDcwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5NiwgNzUzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTM1NzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUxIiBANzU1Ci0JCQkJbG9jYXRpb24gICAJKDcxOSwgMTE5MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNTAwOEEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MiIgQDc1NgotCQkJCQlQYXJlbnRfVmlldyAJQDc1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwMSwgMzkzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE2MDA5NiIKLQkJCQkJY2xpZW50ICAgICAJQDc1NQotCQkJCQlzdXBwbGllciAgIAlANzI5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDExOTMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzU3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjAsIDExNDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDA2OTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMEEwIgotCQkJCQljbGllbnQgICAgIAlANzU1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgMTE5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNiwgMTI0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA0MTY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExMSIgQDc2MAotCQkJCWxvY2F0aW9uICAgCSg3ODUsIDU1MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQTAwNjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMiIgQDc2MQotCQkJCQlQYXJlbnRfVmlldyAJQDc2MAotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyM0YiCi0JCQkJCWNsaWVudCAgICAgCUA3NjAKLQkJCQkJc3VwcGxpZXIgICAJQDczMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDU1MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjAKLQkJCQkJbG9jYXRpb24gICAJKC0zMzUsIC0yNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzksIDUxNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDcwNzA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEIwMjQ5IgotCQkJCQljbGllbnQgICAgIAlANzYwCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzg1LCA1NTApCi0JCQkJCSAgICAoODg0LCA1NTApCi0JCQkJCSAgICAoODg0LCA2NzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODQsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzNSwgNjEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjk3MzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgzIiBANzY1Ci0JCQkJbG9jYXRpb24gICAJKDExODQsIDQwNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NjAyOTAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NCIgQDc2NgotCQkJCQlQYXJlbnRfVmlldyAJQDc2NQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2NSIKLQkJCQkJY2xpZW50ICAgICAJQDc2NQotCQkJCQlzdXBwbGllciAgIAlANzMxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCAxMzUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDc2NwotCQkJCQlQYXJlbnRfVmlldyAJQDc2NQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNCwgMjI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNjY1NDI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2RiIKLQkJCQkJY2xpZW50ICAgICAJQDc2NQotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4NDM4NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTkiIEA3NzAKLQkJCQlsb2NhdGlvbiAgIAkoMTc1MiwgMTAzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MTAxNTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMCIgQDc3MQotCQkJCQlQYXJlbnRfVmlldyAJQDc3MAotCQkJCQlsb2NhdGlvbiAgIAkoNTM2LCAyMTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTIwMTlGIgotCQkJCQljbGllbnQgICAgIAlANzcwCi0JCQkJCXN1cHBsaWVyICAgCUA3MzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTc1MiwgMTAzNCkKLQkJCQkJICAgICgxODEyLCAxMDM0KQotCQkJCQkgICAgKDE4MTIsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDExNjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzcyCi0JCQkJCVBhcmVudF9WaWV3IAlANzcwCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDMsIDk5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk2MDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxQTkiCi0JCQkJCWNsaWVudCAgICAgCUA3NzAKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDEwMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg0LCAxMDY2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTAzMzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAxIiBANzc1Ci0JCQkJbG9jYXRpb24gICAJKDE4OTYsIDg4MSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZDRjAwODgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMiIgQDc3NgotCQkJCQlQYXJlbnRfVmlldyAJQDc3NQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCA0MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZEMTAxNUQiCi0JCQkJCWNsaWVudCAgICAgCUA3NzUKLQkJCQkJc3VwcGxpZXIgICAJQDczMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxODk2LCA4ODEpCi0JCQkJCSAgICAoMTk1NiwgODgxKQotCQkJCQkgICAgKDE5NTYsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1NiwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRlcml2YXRpb25Bbm5vdGF0aW9uIiBANzc3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzc1Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgODQyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzkwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Rlcml2YXRpb25Bbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTQyMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZEMTAxNjciCi0JCQkJCWNsaWVudCAgICAgCUA3NzUKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgODgxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OSwgOTE0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDUwODUKLQkJCQkJICAgIGhlaWdodCAgICAgCTMzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAzIiBANzgwCi0JCQkJbG9jYXRpb24gICAJKDIwNDAsIDcxNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzMzAyNjQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNCIgQDc4MQotCQkJCQlQYXJlbnRfVmlldyAJQDc4MAotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjg0IgotCQkJCQljbGllbnQgICAgIAlANzgwCi0JCQkJCXN1cHBsaWVyICAgCUA3MzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjA0MCwgNzE1KQotCQkJCQkgICAgKDIxMDAsIDcxNSkKLQkJCQkJICAgICgyMTAwLCAxMTYxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDAsIDExNjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDc4MgotCQkJCQlQYXJlbnRfVmlldyAJQDc4MAotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA2ODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzE5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4RSIKLQkJCQkJY2xpZW50ICAgICAJQDc4MAotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQwLCA3MTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg1LCA3NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwOTMxMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjEiIEA3ODUKLQkJCQlsb2NhdGlvbiAgIAkoNjY4LCA4NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzQwMDRGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjIiIEA3ODYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODUKLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBDQSIKLQkJCQkJY2xpZW50ICAgICAJQDc4NQotCQkJCQlzdXBwbGllciAgIAlANzM1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3MywgODY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4NwotCQkJCQlQYXJlbnRfVmlldyAJQDc4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTQsIDgyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzQxNDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNjAwRDQiCi0JCQkJCWNsaWVudCAgICAgCUA3ODUKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDg2NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMSwgOTAzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODIwNTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI1IiBANzkwCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDE2NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCOTAxQ0QiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNiIgQDc5MQotCQkJCQlQYXJlbnRfVmlldyAJQDc5MAotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDNCIKLQkJCQkJY2xpZW50ICAgICAJQDc5MAotCQkJCQlzdXBwbGllciAgIAlANzM2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NzIsIDE2NykKLQkJCQkJICAgICgxNDcyLCA3MikKLQkJCQkJICAgICgxODgzLCA3MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODgzLCA3MikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3OTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTAKLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDEyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDc2MzA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDRSIKLQkJCQkJY2xpZW50ICAgICAJQDc5MAotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE5LCA2MTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MzU3NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NSIgQDc5NQotCQkJCWxvY2F0aW9uICAgCSg5MjcsIDM1MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNjAyOTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc2IiBANzk2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzk1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MSIKLQkJCQkJY2xpZW50ICAgICAJQDc5NQotCQkJCQlzdXBwbGllciAgIAlANzM3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYyOSwgMzUwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5NwotCQkJCQlQYXJlbnRfVmlldyAJQDc5NQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5MywgLTQ1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMzEwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC44MTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNzAxNzIiCi0JCQkJCWNsaWVudCAgICAgCUA3OTUKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MjcsIDM1MCkKLQkJCQkJICAgICg5ODcsIDM1MCkKLQkJCQkJICAgICg5ODcsIDY3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4NywgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNywgNjEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDMzNDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjciIEA4MDAKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNywgMjIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQURDMDJGNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjgiIEA4MDEKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDAKLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REFERDAyMzgiCi0JCQkJCWNsaWVudCAgICAgCUA4MDAKLQkJCQkJc3VwcGxpZXIgICAJQDczOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCAyMjIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODAyCi0JCQkJCVBhcmVudF9WaWV3IAlAODAwCi0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDAzLCAxODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQwNjI1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDI0MiIKLQkJCQkJY2xpZW50ICAgICAJQDgwMAotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwMjcsIDIyMikKLQkJCQkJICAgICgxMDg3LCAyMjIpCi0JCQkJCSAgICAoMTA4NywgNjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjcsIDIyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDYxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MjU4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MSIgQDgwNQotCQkJCWxvY2F0aW9uICAgCSgxNDk0LCAxNDM4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOTAwNjg4MDFDMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTIiIEA4MDYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDUKLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDgwNQotCQkJCQlzdXBwbGllciAgIAlANzM5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTY2MikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRBbm5vdGF0aW9uIiBAODA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODA1Ci0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTYsIDEzNTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudEFubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzcxMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMUIiCi0JCQkJCWNsaWVudCAgICAgCUA4MDUKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTQsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQzLCAxMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTMwMDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ1IiBAODEwCi0JCQkJbG9jYXRpb24gICAJKDYzNywgMTAyMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNzAyQzgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0NiIgQDgxMQotCQkJCQlQYXJlbnRfVmlldyAJQDgxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4MywgMjIyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE4MDNFMiIKLQkJCQkJY2xpZW50ICAgICAJQDgxMAotCQkJCQlzdXBwbGllciAgIAlANzQxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTEsIDEwMjIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODEyCi0JCQkJCVBhcmVudF9WaWV3IAlAODEwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTAsIDk3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg4ODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxOTAwMDQiCi0JCQkJCWNsaWVudCAgICAgCUA4MTAKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM3LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMDYyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzAwODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjUiIEA4MTUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4MSwgNjA3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUE3MDEwMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjYiIEA4MTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTUKLQkJCQkJbG9jYXRpb24gICAJKDMwMSwgLTIyNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTEiCi0JCQkJCWNsaWVudCAgICAgCUA4MTUKLQkJCQkJc3VwcGxpZXIgICAJQDc0MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTgxLCA2MDcpCi0JCQkJCSAgICAoMTU4MSwgNTQ3KQotCQkJCQkgICAgKDE2NzksIDU0NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCA2MDcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc5LCA1NDcpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDgxNwotCQkJCQlQYXJlbnRfVmlldyAJQDgxNQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2OSwgNDYyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMTk2OTcwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTkwMTkyIgotCQkJCQljbGllbnQgICAgIAlAODE1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODEsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDYyMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTk2OTcwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNSIgQDgyMAotCQkJCWxvY2F0aW9uICAgCSg4NDksIDE0OTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTEwMjZGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDYiIEA4MjEKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjAKLQkJCQkJbG9jYXRpb24gICAJKC0yNzEsIDY5NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMjAxRjkiCi0JCQkJCWNsaWVudCAgICAgCUA4MjAKLQkJCQkJc3VwcGxpZXIgICAJQDc0MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNDk2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgyMgotCQkJCQlQYXJlbnRfVmlldyAJQDgyMAotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQyLCAxNDY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4ODI1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDIwMyIKLQkJCQkJY2xpZW50ICAgICAJQDgyMAotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDg0OSwgMTQ5NikKLQkJCQkJICAgICgxMDYyLCAxNDk2KQotCQkJCQkgICAgKDEwNjIsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2MiwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTUsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjY5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDciIEA4MjUKLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCAxNTY1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUIzMDAwNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA4IiBAODI2Ci0JCQkJCVBhcmVudF9WaWV3IAlAODI1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjQwMzI3IgotCQkJCQljbGllbnQgICAgIAlAODI1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTU2NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODI3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODI1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCAxNTM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDQ5NTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMzIiCi0JCQkJCWNsaWVudCAgICAgCUA4MjUKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE1NjUpCi0JCQkJCSAgICAoMTIwMCwgMTU2NSkKLQkJCQkJICAgICgxMjAwLCAxMjE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDAsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU0LCAxMjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4MzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiCi0JCQkJY2xpZW50ICAgICAJQDcyNgotCQkJCXN1cHBsaWVyICAgCUA3MzYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTg0LCAyNDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5ODQsIDEzNSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODMxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCWNsaWVudCAgICAgCUA3NDIKLQkJCQlzdXBwbGllciAgIAlANzI2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk5NywgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTk3LCAzNTkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNi4gQ29uY3JldGUgQ29tcG9uZW50cyIKLQkJCXF1aWQgICAgICAgCSIzQjZBRDc0RDAzQzQiCi0JCQl0aXRsZSAgICAgIAkiNi4gQ29uY3JldGUgQ29tcG9uZW50cyIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA4MzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEA4MzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTY4LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQl3aWR0aCAgICAgIAk1NDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IiBAODM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIwMCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5OTEsIDYyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAODM1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTU2LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiCi0JCQkJd2lkdGggICAgICAJNDI2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDgzNgotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA1NjEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDgzNQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTM2MCwgNTYxKQotCQkJCSAgICAoMTM2MCwgNDcxKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiIEA4MzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxMTU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbmNsdWRlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIgotCQkJCXdpZHRoICAgICAgCTI1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDgzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDgzOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDUsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA4NDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzc1LCAxMTUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTg2OQotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MyIgQDg0MQotCQkJCWxvY2F0aW9uICAgCSgxMzY4LCAxMjA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M1MDA3RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ0IiBAODQyCi0JCQkJCVBhcmVudF9WaWV3IAlAODQxCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzYwMDZCIgotCQkJCQljbGllbnQgICAgIAlAODQxCi0JCQkJCXN1cHBsaWVyICAgCUA4MzcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDEyMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg0MwotCQkJCQlQYXJlbnRfVmlldyAJQDg0MQotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0NywgMTE1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTQ0MTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkMiCi0JCQkJCWNsaWVudCAgICAgCUA4NDEKLQkJCQkJc3VwcGxpZXIgICAJQDg0MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzQsIDEyMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzAwLCAxMjUzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA3Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE0NzA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MSIgQDg0NgotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q4MDJGQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQyIiBAODQ3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODQ2Ci0JCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIyMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEIiCi0JCQkJCWNsaWVudCAgICAgCUA4NDYKLQkJCQkJc3VwcGxpZXIgICAJQDgzOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTY4LCAxMDIyKQotCQkJCQkgICAgKDExNjgsIDk2MikKLQkJCQkJICAgICgxMjg1LCA5NjIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODUsIDk2MikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDYKLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5MCwgMTA3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDUzNzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDkwMThDIgotCQkJCQljbGllbnQgICAgIAlAODQ2Ci0JCQkJCXN1cHBsaWVyICAgCUA4NDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTY4LCAxMTQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyNywgMTA3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM2OTc1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MyIgQDg1MQotCQkJCWxvY2F0aW9uICAgCSgxNTYzLCAxMzUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFERTQyMDA5QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY0IiBAODUyCi0JCQkJCVBhcmVudF9WaWV3IAlAODUxCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMkZFIgotCQkJCQljbGllbnQgICAgIAlAODUxCi0JCQkJCXN1cHBsaWVyICAgCUA4MzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU2MywgMTM1MykKLQkJCQkJICAgICgxOTQwLCAxMzUzKQotCQkJCQkgICAgKDE5NDAsIDEyNTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NDAsIDEyNTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg1MwotCQkJCQlQYXJlbnRfVmlldyAJQDg1MQotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgMTMyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE2ODA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMzA4IgotCQkJCQljbGllbnQgICAgIAlAODUxCi0JCQkJCXN1cHBsaWVyICAgCUA4NDAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU2MywgMTM1MykKLQkJCQkJICAgICgxMTgxLCAxMzUzKQotCQkJCQkgICAgKDExODEsIDEyNTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODEsIDEyNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTMwLCAxMzI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjEzNDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODU2Ci0JCQkJbG9jYXRpb24gICAJKDI4OCwgNTYxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4MzIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI4OCwgNTYxKQotCQkJCSAgICAoMjg4LCA0NzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA4NTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYwLCA2MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJCXdpZHRoICAgICAgCTQ3NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiIEA4NTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTgsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IgotCQkJCXdpZHRoICAgICAgCTQxNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDg1OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgOTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODU5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NTAsIDkxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAODYwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMCwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiCi0JCQkJY2xpZW50ICAgICAJQDg2MAotCQkJCXN1cHBsaWVyICAgCUA4MzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjEsIDYxNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxLCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyIKLQkJCQljbGllbnQgICAgIAlAODU3Ci0JCQkJc3VwcGxpZXIgICAJQDgzMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU4OSwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODksIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NTYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODYzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCWNsaWVudCAgICAgCUA4MzQKLQkJCQlzdXBwbGllciAgIAlAODM1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAxNiwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDE2LCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODM2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAODY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTkwLCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg2NQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCAxMDg5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4NjQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4MjQsIDEwODkpCi0JCQkJICAgICgxODI0LCA5OTkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEQzAzODEiCi0JCQkJY2xpZW50ICAgICAJQDgzNwotCQkJCXN1cHBsaWVyICAgCUA4NjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY2LCAxMTQ1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY2LCAxMDg5KQotCQkJCWRyYXdTdXBwbGllciAJQDg2NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJY2xpZW50ICAgICAJQDgzOQotCQkJCXN1cHBsaWVyICAgCUA4NjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM0LCAxMTQ1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTM0LCAxMDg5KQotCQkJCWRyYXdTdXBwbGllciAJQDg2NSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAODY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzAsIDYyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCXdpZHRoICAgICAgCTQzOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg2OQotCQkJCWxvY2F0aW9uICAgCSgxNzYyLCA4MTkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg2OAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTc2MiwgODE5KQotCQkJCSAgICAoMTc2MiwgNzI3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCWNsaWVudCAgICAgCUA4MzgKLQkJCQlzdXBwbGllciAgIAlAODY4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNiwgODg5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE2LCA4MTkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg3MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiIKLQkJCQljbGllbnQgICAgIAlAODY4Ci0JCQkJc3VwcGxpZXIgICAJQDgzNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTYsIDYxNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1NiwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDgzNikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA4NzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODczCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDI4OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODcyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMTIwLCAyODkpCi0JCQkJICAgICgxMTIwLCAxOTkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA1IiBAODc0Ci0JCQkJbG9jYXRpb24gICAJKDE0ODUsIDIxNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwODAzQzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRhaW5lciIgQDg3NQotCQkJCQlQYXJlbnRfVmlldyAJQDg3NAotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAyMTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGFpbmVyIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzMxMTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNFIgotCQkJCQljbGllbnQgICAgIAlAODc0Ci0JCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQotCQkJCQkgICAgKDE0ODUsIDE3NikKLQkJCQkJICAgICgxMzc0LCAxNzYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3NCwgMTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzNSwgMjI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDI2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNiIgQDg3OAotCQkJCQlQYXJlbnRfVmlldyAJQDg3NAotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNGIgotCQkJCQljbGllbnQgICAgIAlAODc0Ci0JCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQotCQkJCQkgICAgKDE0ODUsIDI1NCkKLQkJCQkJICAgICgxMzQ1LCAyNTQpCi0JCQkJCSAgICAoMTM0NSwgMTk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNDUsIDE5OSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA3IiBAODc5Ci0JCQkJbG9jYXRpb24gICAJKDc3MywgMjE2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjQ4MDI2MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdENvbnRhaW5lciIgQDg4MAotCQkJCQlQYXJlbnRfVmlldyAJQDg3OQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMjE3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RDb250YWluZXIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjUwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTE2MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg1IgotCQkJCQljbGllbnQgICAgIAlAODc5Ci0JCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzczLCAyMTYpCi0JCQkJCSAgICAoNzczLCAxNzYpCi0JCQkJCSAgICAoODY2LCAxNzYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDgiIEA4ODMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzkKLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg2IgotCQkJCQljbGllbnQgICAgIAlAODc5Ci0JCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzczLCAyMTYpCi0JCQkJCSAgICAoNzczLCAyNTcpCi0JCQkJCSAgICAoODk1LCAyNTcpCi0JCQkJCSAgICAoODk1LCAxOTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTUsIDE5OSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiCi0JCQkJY2xpZW50ICAgICAJQDgzNQotCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY3LCAzNjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjcsIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ4RTIwMEVBIgotCQkJCWNsaWVudCAgICAgCUA4MzMKLQkJCQlzdXBwbGllciAgIAlAODcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUyLCAzNjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MiwgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDg3MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiCi0JCQkJY2xpZW50ICAgICAJQDgzMgotCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTksIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk5LCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODczKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA4ODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiCi0JCQkJY2xpZW50ICAgICAJQDg4NwotCQkJCXN1cHBsaWVyICAgCUA4NjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTYsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNiwgNzI3KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE5IiBAODg5Ci0JCQkJbG9jYXRpb24gICAJKDEzODIsIDE0MjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjAiIEA4OTAKLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODkKLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiCi0JCQkJCWNsaWVudCAgICAgCUA4ODkKLQkJCQkJc3VwcGxpZXIgICAJQDg2NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzgyLCAxNDI1KQotCQkJCQkgICAgKDIxNDcsIDE0MjUpCi0JCQkJCSAgICAoMjE0NywgOTQzKQotCQkJCQkgICAgKDIwNjcsIDk0MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NywgOTQzKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAODkxCi0JCQkJCVBhcmVudF9WaWV3IAlAODg5Ci0JCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAyMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDUsIDEzODkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDY1NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiCi0JCQkJCWNsaWVudCAgICAgCUA4ODkKLQkJCQkJc3VwcGxpZXIgICAJQDg4NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzgyLCAxNDI1KQotCQkJCQkgICAgKDIyNSwgMTQyNSkKLQkJCQkJICAgICgyMjUsIDEyNTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNSwgMTI1NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk2OTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNyIgQDg5NAotCQkJCWxvY2F0aW9uICAgCSgxNTA1LCAxNTAzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQ0M3MDBFQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE4IiBAODk1Ci0JCQkJCVBhcmVudF9WaWV3IAlAODk0Ci0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQyIgotCQkJCQljbGllbnQgICAgIAlAODk0Ci0JCQkJCXN1cHBsaWVyICAgCUA4NjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUwNSwgMTUwMykKLQkJCQkJICAgICgyMTg4LCAxNTAzKQotCQkJCQkgICAgKDIxODgsIDY3NSkKLQkJCQkJICAgICgyMDU5LCA2NzUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTksIDY3NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAODk2Ci0JCQkJCVBhcmVudF9WaWV3IAlAODk0Ci0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDMsIDE0NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMzMzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQkJY2xpZW50ICAgICAJQDg5NAotCQkJCQlzdXBwbGllciAgIAlAODg3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MDUsIDE1MDMpCi0JCQkJCSAgICAoMTEzLCAxNTAzKQotCQkJCQkgICAgKDExMywgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzLCAxMjU1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE0NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NzY4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDkiIEA4OTkKLQkJCQlsb2NhdGlvbiAgIAkoNjYsIDI0NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMTAzNTYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMCIgQDkwMAotCQkJCQlQYXJlbnRfVmlldyAJQDg5OQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQzMzMDMzMSIKLQkJCQkJY2xpZW50ICAgICAJQDg5OQotCQkJCQlzdXBwbGllciAgIAlAODcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY2LCAyNDQpCi0JCQkJCSAgICAoNjYsIDE0NCkKLQkJCQkJICAgICg4NjYsIDE0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NiwgMjQ0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxNDQpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEA5MDEKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTkKLQkJCQkJbG9jYXRpb24gICAJKC05NCwgLTQ0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NSwgOTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTY4MTEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzNCIgotCQkJCQljbGllbnQgICAgIAlAODk5Ci0JCQkJCXN1cHBsaWVyICAgCUA4ODcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NiwgMTE0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNiwgMTg0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTEzCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2NjU5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzgwQkQ5MDA1OSIKLQkJCQljbGllbnQgICAgIAlAODU4Ci0JCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTksIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1OSwgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDg3MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiCi0JCQkJY2xpZW50ICAgICAJQDg0MAotCQkJCXN1cHBsaWVyICAgCUA4MzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MDAsIDExNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDg1NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTA2Ci0JCQkJbG9jYXRpb24gICAJKDEwMTIsIDgzNykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODM0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMDEyLCA4MzcpCi0JCQkJICAgICgxMDEyLCA3MjcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDcKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDgKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzEsIDg3MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4ODE1OAotCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEUyMDM2NiIKLQkJCQljbGllbnQgICAgIAlAODQwCi0JCQkJc3VwcGxpZXIgICAJQDgzNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzcsIDExNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMzcsIDgzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTA5Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTEwCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTAsIDg2NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4MTYzMwotCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEJBMDIzQyIKLQkJCQljbGllbnQgICAgIAlAODU5Ci0JCQkJc3VwcGxpZXIgICAJQDgzNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNSwgOTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDgzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTExCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCWNsaWVudCAgICAgCUA4NjQKLQkJCQlzdXBwbGllciAgIAlAODY4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyOCwgODg5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI4LCA4MTkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY5KSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNy4gQ29uY3JldGUgQXR0cmlidXRlcyIKLQkJCXF1aWQgICAgICAgCSIzQjlGOEY3NjAyQzciCi0JCQl0aXRsZSAgICAgIAkiNy4gQ29uY3JldGUgQXR0cmlidXRlcyIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAOTEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMTQ0MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzOCwgMTM1OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzOCwgMTQxOSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGZvcm0gOiBYU0RGb3JtIgotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk0MzAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERm9ybSIgQDkxMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYwLCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzY1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGb3JtIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTMxNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjlGOTEzQjAxRUIiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAOTE0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCA5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDk3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudCA6IERPTUVsZW1lbnQiKSkKLQkJCQl3aWR0aCAgICAgIAk2NzUKLQkJCQloZWlnaHQgICAgIAkxNDMKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA5MTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAzODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NywgMzMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA5MTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgOTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjc4LCA4OTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJCXdpZHRoICAgICAgCTQ3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDkxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDE0MDgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDEzNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDkxOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NjQsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA1NzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI1NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MTkKLQkJCQlsb2NhdGlvbiAgIAkoODUwLCA1MzcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoODUwLCA1MzcpCi0JCQkJICAgICg4NTAsIDQ0NykpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01FbGVtZW50IiBAOTIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyNDgsIDEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRWxlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNCODE4OTc5MDIwMCIKLQkJCQl3aWR0aCAgICAgIAk3NjkKLQkJCQloZWlnaHQgICAgIAkyMDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTIxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNjQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNTg0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNTEyCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDkyMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDMzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTIzCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjYzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5MTQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDM2OCwgMjYzKQotCQkJCSAgICAoMzY4LCAxNjcpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA5MjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTM0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEyOTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDE0MDcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHN1YnN0aXR1dGlvbiIKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgYWxsIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBAOTI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3MDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNjU4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzY4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyBhbGwiKSkKLQkJCQl3aWR0aCAgICAgIAk1NTAKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA5MjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjEwMCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk3NzgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA5MjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDkyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTQ0LCAyMDE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxOTMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxODgyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQl3aWR0aCAgICAgIAkzODIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTI3OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTMzOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk2MzAKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdXNlIDogWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTY0MAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIgQDkzMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2MzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTQ4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNDk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCQTdCMEU4MDFBOCIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDkzMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjA4LCA5MjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0OTgsIDg4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCQl3aWR0aCAgICAgIAkyMzgKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA5MzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQwLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTk2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2OTEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJOTczCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJOTg0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAOTMzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTA5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDExNTYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODg4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJOTA2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkzNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MjIsIDc3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk5OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTEwMTQKLQkJCQloZWlnaHQgICAgIAk0ODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAOTM1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgOTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNywgOTA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA5MzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA2NTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDYwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDY2MCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA5MzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAxOTQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDIwMDIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJODcwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRENvbXBsZXhGaW5hbCIKLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIisgbWl4ZWQgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODc4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAOTM4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0ODgsIDE2OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDE2NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAOTM4Ci0JCQkJc3VwcGxpZXIgICAJQDkxNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDYsIDE2MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDYsIDE0NzIpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAOTQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyMDgsIDcwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNTk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTkwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTkxOAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlAOTMxCi0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2OTYsIDg2OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NiwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDkzMgotCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDk0LCAxNjE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk0LCAxNTMzKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTQzCi0JCQkJbG9jYXRpb24gICAJKDE0ODcsIDE4NTYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDkzOAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ4NywgMTg1NikKLQkJCQkgICAgKDE0ODcsIDE3NjApKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NQXR0ciIgQDk0NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAwLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDM1MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NQXR0ciIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDMwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JCRjhDODkwMUI2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlAOTM3Ci0JCQkJc3VwcGxpZXIgICAJQDkzOAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzQsIDE5MzApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MzQsIDE4NTYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSIKLQkJCQljbGllbnQgICAgIAlAOTM2Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDU4OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiCi0JCQkJY2xpZW50ICAgICAJQDk0MAotCQkJCXN1cHBsaWVyICAgCUA5MTUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTkwLCA1ODYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA5MjEKLQkJCQlzdXBwbGllciAgIAlAOTIyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyLCA1NzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMiwgNDQ3KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiCi0JCQkJY2xpZW50ICAgICAJQDkyMgotCQkJCXN1cHBsaWVyICAgCUA5MTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAsIDMyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwLCAyNjMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTIzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSIKLQkJCQljbGllbnQgICAgIAlAOTM1Ci0JCQkJc3VwcGxpZXIgICAJQDkyMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMywgODkyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjMsIDcwOCkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCWNsaWVudCAgICAgCUA5MzMKLQkJCQlzdXBwbGllciAgIAlAOTMxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwMCwgMTA4NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMCwgOTg3KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRG9jdW1lbnQiIEA5NTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA5NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRG9jdW1lbnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg1MEUwMzgxIgotCQkJCXdpZHRoICAgICAgCTc3NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQljbGllbnQgICAgIAlAOTE1Ci0JCQkJc3VwcGxpZXIgICAJQDkxNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgMzIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDI2MykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEA5NTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzNTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2NEE1MDExNyIKLQkJCQl3aWR0aCAgICAgIAk2ODYKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiCi0JCQkJY2xpZW50ICAgICAJQDkxOAotCQkJCXN1cHBsaWVyICAgCUA5MTUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTAsIDU2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODUwLCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlAOTI5Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMTI2NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyIKLQkJCQljbGllbnQgICAgIAlAOTE2Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTQsIDg4MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5NCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiCi0JCQkJY2xpZW50ICAgICAJQDkzNAotCQkJCXN1cHBsaWVyICAgCUA5MTgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDc2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCA2ODcpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NTkKLQkJCQlsb2NhdGlvbiAgIAkoMTcwMywgMTI5MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTE2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzAzLCAxMjkwKQotCQkJCSAgICAoMTcwMywgMTAwOCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQljbGllbnQgICAgIAlAOTE3Ci0JCQkJc3VwcGxpZXIgICAJQDkxNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDMsIDEzNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyOTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQljbGllbnQgICAgIAlAOTEyCi0JCQkJc3VwcGxpZXIgICAJQDkxNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEzNDcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDEyOTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlAOTI2Ci0JCQkJc3VwcGxpZXIgICAJQDkzOAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTMsIDIwMjgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTMsIDE4NTYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQzKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QTgwOTcwMjdBIgotCQkJdGl0bGUgICAgICAJIjguIENvbmNyZXRlIENvbnRhaW5tZW50IgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA5NjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjcyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzksIDk0OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5NjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjQwLCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzEsIDUzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDk2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxMywgNzQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCQl3aWR0aCAgICAgIAkyODAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA5NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDUzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJCXdpZHRoICAgICAgCTQzOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NjcKLQkJCQlsb2NhdGlvbiAgIAkoMTk0MywgODY4KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NjYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5NDMsIDg2OCkKLQkJCQkgICAgKDE5NDMsIDYzMSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjUiIEA5NjgKLQkJCQlsb2NhdGlvbiAgIAkoMjEyNSwgNjgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFODI0MDA1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY2IiBAOTY5Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTY4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQUQiCi0JCQkJCWNsaWVudCAgICAgCUA5NjgKLQkJCQkJc3VwcGxpZXIgICAJQDk2NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNzI5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEA5NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NjgKLQkJCQkJbG9jYXRpb24gICAJKDE1NywgMzQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NSwgNjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCQljbGllbnQgICAgIAlAOTY4Ci0JCQkJCXN1cHBsaWVyICAgCUA5NjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDYzMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjcsIDY3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTc1NDM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA5NzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTc0Ci0JCQkJbG9jYXRpb24gICAJKDI3MiwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NzMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI3MiwgNDY1KQotCQkJCSAgICAoMjcyLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA5NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzcyLCAxMTIxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU2OQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1ODcKLQkJCQloZWlnaHQgICAgIAkxMTgKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBAOTc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA1NzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzUyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUzIiBAOTc3Ci0JCQkJbG9jYXRpb24gICAJKDExNzAsIDEzNTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwIiBAOTc4Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTc3Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OSwgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzQwNDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTMzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiCi0JCQkJCWNsaWVudCAgICAgCUA5NzcKLQkJCQkJc3VwcGxpZXIgICAJQDk3NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTcwLCAxMzU2KQotCQkJCQkgICAgKDIwNiwgMTM1NikKLQkJCQkJICAgICgyMDYsIDYzMSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2LCA2MzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1OTE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU0IiBAOTgxCi0JCQkJCVBhcmVudF9WaWV3IAlAOTc3Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI1MjEsIDEzOTgpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOCIKLQkJCQkJY2xpZW50ICAgICAJQDk3NwotCQkJCQlzdXBwbGllciAgIAlAOTc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzAsIDEzNTYpCi0JCQkJCSAgICAoMjczMSwgMTM1NikKLQkJCQkJICAgICgyNzMxLCAxMjI3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzMxLCAxMjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDk4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MCwgMTY5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NyIgQDk4NAotCQkJCWxvY2F0aW9uICAgCSgxMjIsIDExMzYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDgiIEA5ODUKLQkJCQkJUGFyZW50X1ZpZXcgCUA5ODQKLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjYwMDFCIgotCQkJCQljbGllbnQgICAgIAlAOTg0Ci0JCQkJCXN1cHBsaWVyICAgCUA5NzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgNjMxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEA5ODYKLQkJCQkJUGFyZW50X1ZpZXcgCUA5ODQKLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjMsIDE1MTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MDQ5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMjUiCi0JCQkJCWNsaWVudCAgICAgCUA5ODQKLQkJCQkJc3VwcGxpZXIgICAJQDk4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCAxNjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5ODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODExODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAOTg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQkJd2lkdGggICAgICAJNTEzCi0JCQkJaGVpZ2h0ICAgICAJMTAwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU5IiBAOTkwCi0JCQkJbG9jYXRpb24gICAJKDQ3LCA4ODUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MTUwMTE5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjAiIEA5OTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTAKLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQUIiCi0JCQkJCWNsaWVudCAgICAgCUA5OTAKLQkJCQkJc3VwcGxpZXIgICAJQDk4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxNjQxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDk5MgotCQkJCQlQYXJlbnRfVmlldyAJQDk5MAotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyLCAxODkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIxODU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk5NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MUEwM0I1IgotCQkJCQljbGllbnQgICAgIAlAOTkwCi0JCQkJCXN1cHBsaWVyICAgCUA5ODkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTMwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgsIDE5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3ODgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDk5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDg5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MiwgODQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJd2lkdGggICAgICAJMzYzCi0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAOTk2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODkiIEA5OTcKLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgMTAzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFOTAxOEEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkwIiBAOTk4Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTk3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzZDIgotCQkJCQljbGllbnQgICAgIAlAOTk3Ci0JCQkJCXN1cHBsaWVyICAgCUA5OTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAOTk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTk3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzMxNzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIgotCQkJCQljbGllbnQgICAgIAlAOTk3Ci0JCQkJCXN1cHBsaWVyICAgCUA5OTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDEwMzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDAyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTUsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEwMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg1IiBAMTAwNAotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg2IiBAMTAwNQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDQKLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDAzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTEsIDE4NDApCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkKLQkJCQkJICAgICgxMjk0LCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk0LCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDA2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAwNAotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxODA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI2NTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0M4IgotCQkJCQljbGllbnQgICAgIAlAMTAwNAotCQkJCQlzdXBwbGllciAgIAlAMTAwMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzUxLCAxODQwKQotCQkJCQkgICAgKDE0MDksIDE4NDApCi0JCQkJCSAgICAoMTQwOSwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTc1MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MSwgMTgwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcyODQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY5IiBAMTAwOQotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOQotCQkJCQlsb2NhdGlvbiAgIAkoNzc0LCAtMTgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgMTUyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ0OTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEwMDkKLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQ1NDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDcwIiBAMTAxMwotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDkKLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMwRSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMDkKLQkJCQkJc3VwcGxpZXIgICAJQDk5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTAsIDEyMjMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4NyIgQDEwMTUKLQkJCQlsb2NhdGlvbiAgIAkoMTY5MCwgMTY4NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRDAzNzQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0Q29udGVudHMiIEAxMDE2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk1LCAxNzMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZhY2V0Q29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMjA1MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNUFGMDAxMCIKLQkJCQkJY2xpZW50ICAgICAJQDEwMTUKLQkJCQkJc3VwcGxpZXIgICAJQDEwMDIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODQ2LCAxNjg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNjQ0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJOTQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA3MzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4OCIgQDEwMTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjYsIDE2NDMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNUFGMDAwNiIKLQkJCQkJY2xpZW50ICAgICAJQDEwMTUKLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTM0LCAxNjg0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTAyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2MjQsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzODgsIDc0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk0OTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDEwMjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAzMjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTA4LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiCi0JCQkJd2lkdGggICAgICAJNDI2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTAyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU3LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjciIEAxMDI0Ci0JCQkJbG9jYXRpb24gICAJKDk2MywgMzE5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTZCMDAzRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDI1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAyNAotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgMzYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODEwODEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMTEiCi0JCQkJCWNsaWVudCAgICAgCUAxMDI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTksIDMxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNiwgMjkwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTYzOTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2OCIgQDEwMjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI0Ci0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU1LCAzNjEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDEwNyIKLQkJCQkJY2xpZW50ICAgICAJQDEwMjQKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODI4LCAzMTkpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMTAzMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDk5MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzQsIDk0OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAzMQotCQkJCWxvY2F0aW9uICAgCSgyMzIyLCAxNTkzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDMwCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMzIyLCAxNTkzKQotCQkJCSAgICAoMjMyMiwgMTA0NykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMzIKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMzCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NiwgOTA1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDYwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTUKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJGNTAxM0EiCi0JCQkJY2xpZW50ICAgICAJQDEwMzAKLQkJCQlzdXBwbGllciAgIAlAOTY2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE1MCwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTUwLCA4NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTY3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMDM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA1NzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDUzMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTY2MgotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExMyIgQDEwMzUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ5OCwgMTQzMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNDAxQUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTAzNgotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzUKLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDI3LCAxNDcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQzODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMDM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDMwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0OTgsIDE0MzEpCi0JCQkJCSAgICAoMjI4MSwgMTQzMSkKLQkJCQkJICAgICgyMjgxLCAxMDQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjgxLCAxMDQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjA0LCAxMzk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDU0MTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNCIgQDEwMzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDM1Ci0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgODY2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDM0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0OTgsIDE0MzEpCi0JCQkJCSAgICAoMTEzMSwgMTQzMSkKLQkJCQkJICAgICgxMTMxLCA2MzIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzEsIDYzMikpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBAMTA0MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDY1NSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBAMTA0MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgODk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA1LCA4NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE3IiBAMTA0MwotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDczNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBAMTA0NAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDMKLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIwLCA3NDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExMTExMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQzCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgODQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1OTUsIDgwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc1OTI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTgiIEAxMDQ3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA0MwotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDY1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCQljbGllbnQgICAgIAlAMTA0MwotCQkJCQlzdXBwbGllciAgIAlAMTAzNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDYzMikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM3IiBAMTA0OQotCQkJCWxvY2F0aW9uICAgCSg5MDAsIDEwMzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDEwNTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQ5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEzLCAxMDQyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMyODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCQljbGllbnQgICAgIAlAMTA0OQotCQkJCQlzdXBwbGllciAgIAlAMTA0MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDEwNDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTg5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM4IiBAMTA1MwotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkKLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgOTY4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDQyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDk1MSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM5IiBAMTA1NQotCQkJCWxvY2F0aW9uICAgCSg3MDAsIDEwMzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEAxMDU2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDEwMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTQ3OTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTg1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDQxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3MSwgMTA0MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMDc3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDAiIEAxMDU5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTksIDk2OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1IgotCQkJCQljbGllbnQgICAgIAlAMTA1NQotCQkJCQlzdXBwbGllciAgIAlAMTA0MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCA5NTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDEwNjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDE0NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDAsIDEzOTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDYyCi0JCQkJbG9jYXRpb24gICAJKDU1MCwgMTU5MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA2MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNTUwLCAxNTkwKQotCQkJCSAgICAoNTUwLCAxNDk1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDEwNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQwLCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQl3aWR0aCAgICAgIAk1NDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDY0Ci0JCQkJbG9jYXRpb24gICAJKDE0MDYsIDc2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA2MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQwNiwgNzY1KQotCQkJCSAgICAoMTQwNiwgNjMxKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEwNjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5MywgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk1IiBAMTA2NgotCQkJCWxvY2F0aW9uICAgCSgxNjE0LCAxODY4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkZEREQ3MDExMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTYiIEAxMDY3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA2NgotCQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA0NzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RkREREEwMjZCIgotCQkJCQljbGllbnQgICAgIAlAMTA2NgotCQkJCQlzdXBwbGllciAgIAlAMTA2NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjE0LCAxODY4KQotCQkJCQkgICAgKDI1MDAsIDE4NjgpCi0JCQkJCSAgICAoMjUwMCwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjUwMCwgMTc1MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDY4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA2NgotCQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA0NzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NiwgMTc4NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk4NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTg5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNzUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDYxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTQsIDE4NjgpCi0JCQkJCSAgICAoOTg0LCAxODY4KQotCQkJCQkgICAgKDk4NCwgMTQ5NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg0LCAxNDk1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAxODI0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzEyODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAxIiBAMTA3MQotCQkJCWxvY2F0aW9uICAgCSgyOTI3LCAzODcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzYwMzg2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVDb250ZW50cyIgQDEwNzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDcxCi0JCQkJCWxvY2F0aW9uICAgCSgyNDYzLCAtMzc1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNSwgMzU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZUNvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzMwNjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwN0MiCi0JCQkJCWNsaWVudCAgICAgCUAxMDcxCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDI5MjcsIDM4NykKLQkJCQkJICAgICgxNzUwLCAzODcpCi0JCQkJCSAgICAoMTc1MCwgNTIxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDUyMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNCwgNDI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTcyNDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMiIgQDEwNzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDcxCi0JCQkJCWxvY2F0aW9uICAgCSgyNDYzLCAtMzc1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjk0NiwgMTQ0OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDcyIgotCQkJCQljbGllbnQgICAgIAlAMTA3MQotCQkJCQlzdXBwbGllciAgIAlAMTA2NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyOTI3LCAzODcpCi0JCQkJCSAgICAoMjk4NywgMzg3KQotCQkJCQkgICAgKDI5ODcsIDE2NzEpCi0JCQkJCSAgICAoMjkyOCwgMTY3MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTI4LCAxNjcxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMDc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTksIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NyIgQDEwNzgKLQkJCQlsb2NhdGlvbiAgIAkoMTc1MCwgODcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDRFMDA2NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDc5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA3OAotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDAsIDY5MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUxMDM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDJBNSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNzgKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDYzMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNCwgNjk1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzQ0NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc4IiBAMTA4MgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzgKLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzA5LCAxMDY1KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA1MDAyOUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDc4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDc3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA4NzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCAxMTEzKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEwODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNzksIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwOSIgQDEwODUKLQkJCQlsb2NhdGlvbiAgIAkoMTI1MiwgMTg5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4NzAyNDciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMCIgQDEwODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg1Ci0JCQkJCWxvY2F0aW9uICAgCSg3MDgsIDEyODgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMkY5IgotCQkJCQljbGllbnQgICAgIAlAMTA4NQotCQkJCQlzdXBwbGllciAgIAlAMTA2NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjUyLCAxODk2KQotCQkJCQkgICAgKDI2MDMsIDE4OTYpCi0JCQkJCSAgICAoMjYwMywgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMywgMTc1MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDEwODcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg1Ci0JCQkJCWxvY2F0aW9uICAgCSg3MDgsIDEyODgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4MiwgMTg1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM4MTE0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRUJEQzhDMDMwMyIKLQkJCQkJY2xpZW50ICAgICAJQDEwODUKLQkJCQkJc3VwcGxpZXIgICAJQDEwODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI1MiwgMTg5NikKLQkJCQkJICAgICg0MjgsIDE4OTYpCi0JCQkJCSAgICAoNDI4LCAxMjIzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MjgsIDEyMjMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4MiwgMTg2MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTc1MDMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgxIiBAMTA5MAotCQkJCWxvY2F0aW9uICAgCSgxMTk5LCAxMzIxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc1RDMyMDIyMCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODIiIEAxMDkxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5MAotCQkJCQlsb2NhdGlvbiAgIAkoNjU1LCA3MTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEM0MwMTBDIgotCQkJCQljbGllbnQgICAgIAlAMTA5MAotCQkJCQlzdXBwbGllciAgIAlAMTA3NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk5LCAxMzIxKQotCQkJCQkgICAgKDE4OTcsIDEzMjEpCi0JCQkJCSAgICAoMTg5NywgMTIyMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5NywgMTIyMykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDEwOTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkwCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAxMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5NTY5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEM0MwMTBEIgotCQkJCQljbGllbnQgICAgIAlAMTA5MAotCQkJCQlzdXBwbGllciAgIAlAMTA4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk5LCAxMzIxKQotCQkJCQkgICAgKDUwMCwgMTMyMSkKLQkJCQkJICAgICg1MDAsIDEyMjMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUwMCwgMTIyMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODIzMDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUAxMDY1Ci0JCQkJc3VwcGxpZXIgICAJQDEwMzAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjA2LCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjA2LCAxNTkzKQotCQkJCWRyYXdTdXBwbGllciAJQDEwMzEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA5NgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDEwOTcKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDQ5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NjQyOQotCQkJCSAgICBoZWlnaHQgICAgIAk2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCWNsaWVudCAgICAgCUAxMDM0Ci0JCQkJc3VwcGxpZXIgICAJQDk3MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTMsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA5OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlAMTAwMwotCQkJCXN1cHBsaWVyICAgCUAxMDMwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwOSwgMTY0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTU5MykKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDMxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwOTkKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAwCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCAxNTkxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxOQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTgwMzkyCi0JCQkJICAgIGhlaWdodCAgICAgCTM4NQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjU1MDMyQiIKLQkJCQljbGllbnQgICAgIAlAMTAwMwotCQkJCXN1cHBsaWVyICAgCUAxMDYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NCwgMTY0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0NCwgMTU5MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDYyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiCi0JCQkJY2xpZW50ICAgICAJQDk3NgotCQkJCXN1cHBsaWVyICAgCUA5NzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTc0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTAyCi0JCQkJbG9jYXRpb24gICAJKDQzMSwgMjIyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5ODkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQzMSwgMjIyKQotCQkJCSAgICAoNDMxLCAxMzApKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTAzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEwNAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM2MSwgMjI0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTc2NzQ0Ci0JCQkJICAgIGhlaWdodCAgICAgCTg2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNDQwMDY5IgotCQkJCWNsaWVudCAgICAgCUA5NzMKLQkJCQlzdXBwbGllciAgIAlAOTg5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc1LCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NSwgMjIyKQotCQkJCWRyYXdTdXBwbGllciAJQDExMDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExMDUKLQkJCQlsb2NhdGlvbiAgIAkoMTMwOSwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDIyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMzA5LCA0NjUpCi0JCQkJICAgICgxMzA5LCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTA2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEwNwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MSwgNDk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDY0Mjg2Ci0JCQkJICAgIGhlaWdodCAgICAgCTEwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjYwMzM5IgotCQkJCWNsaWVudCAgICAgCUAxMDM0Ci0JCQkJc3VwcGxpZXIgICAJQDEwMjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzEsIDUyMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTMxLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTA4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCWNsaWVudCAgICAgCUA5ODMKLQkJCQlzdXBwbGllciAgIAlAMTA2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1MCwgMTY0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjUwLCAxNTkwKQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEwOQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMTAKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjA1LCA0OTMpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NTgzMzMKLQkJCQkgICAgaGVpZ2h0ICAgICAJOAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTYxMDNCRSIKLQkJCQljbGllbnQgICAgIAlAOTk2Ci0JCQkJc3VwcGxpZXIgICAJQDEwMjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTExCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTExMgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MAotCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkVCMDJBOCIKLQkJCQljbGllbnQgICAgIAlAMTA3NwotCQkJCXN1cHBsaWVyICAgCUA5NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODc4LCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODc4LCA4NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTY3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTMKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE0Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MiwgODA3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODc5MzEwCi0JCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwM0EwMjIxIgotCQkJCWNsaWVudCAgICAgCUAxMDc3Ci0JCQkJc3VwcGxpZXIgICAJQDEwNjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAzLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAzLCA3NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA2NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTE1Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTExNgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTQsIDgwMSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJENzM3MDM4RiIKLQkJCQljbGllbnQgICAgIAlAOTk1Ci0JCQkJc3VwcGxpZXIgICAJQDEwNjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODQsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDY0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJY2xpZW50ICAgICAJQDk2NQotCQkJCXN1cHBsaWVyICAgCUAxMDIxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4NCwgNzYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzc5LCA3NjIpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJY2xpZW50ICAgICAJQDk2NAotCQkJCXN1cHBsaWVyICAgCUAxMDIyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNTIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjM3LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTE5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCWNsaWVudCAgICAgCUAxMDIxCi0JCQkJc3VwcGxpZXIgICAJQDk2NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDcyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCWNsaWVudCAgICAgCUA5NjYKLQkJCQlzdXBwbGllciAgIAlAMTAyMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5NTAsIDUyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1MCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExMDUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMjIKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIxLCA4OTcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTgxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODc3MTkKLQkJCQkgICAgaGVpZ2h0ICAgICAJNzYKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU0RjAyM0MiCi0JCQkJY2xpZW50ICAgICAJQDk2MwotCQkJCXN1cHBsaWVyICAgCUAxMDIyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg5NiwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODk2LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEyNAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMTMsIDkwNCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MDYyMgotCQkJCSAgICBoZWlnaHQgICAgIAk2OAotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkUyMDM4MSIKLQkJCQljbGllbnQgICAgIAlAOTc1Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzODEsIDExMDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzODEsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyNQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMjYKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyODc4LCAyNjkpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDY2NjcKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjYKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI1NTAzODUiCi0JCQkJY2xpZW50ICAgICAJQDk3NQotCQkJCXN1cHBsaWVyICAgCUA5ODkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQzLCAxMTA5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTQzLCAyMjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTI3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCWNsaWVudCAgICAgCUAxMDg0Ci0JCQkJc3VwcGxpZXIgICAJQDk3MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ2MiwgMTExMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDYyLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTc0KSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIgotCQkJcXVpZCAgICAgICAJIjNDMjVFQjdBMDM4QyIKLQkJCXRpdGxlICAgICAgCSI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTEyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExOSIgQDExMjkKLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIwIiBAMTEzMAotCQkJCQlQYXJlbnRfVmlldyAJQDExMjkKLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMkY3IgotCQkJCQljbGllbnQgICAgIAlAMTEyOQotCQkJCQlzdXBwbGllciAgIAlAMTEyOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjgsIDE2OTUpCi0JCQkJCSAgICAoMTc1LCAxNjk1KQotCQkJCQkgICAgKDE3NSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExMzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI5Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMjksIDE3NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDMwQiIKLQkJCQkJY2xpZW50ICAgICAJQDExMjkKLQkJCQkJc3VwcGxpZXIgICAJQDExMjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjI4LCAxNjk1KQotCQkJCQkgICAgKDI4MSwgMTY5NSkKLQkJCQkJICAgICgyODEsIDE1OTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxLCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjksIDE2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExMzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU1IiBAMTEzNgotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTYiIEAxMTM3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEzNgotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg2MCwgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCQljbGllbnQgICAgIAlAMTEzNgotCQkJCQlzdXBwbGllciAgIAlAMTEzNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE2OTgpCi0JCQkJCSAgICAoOTAxLCAxNjk4KQotCQkJCQkgICAgKDkwMSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTEzOQotCQkJCQlQYXJlbnRfVmlldyAJQDExMzYKLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDIwLCAxNzM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM5RSIKLQkJCQkJY2xpZW50ICAgICAJQDExMzYKLQkJCQkJc3VwcGxpZXIgICAJQDExMzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTUyLCAxNjk4KQotCQkJCQkgICAgKDEwMDQsIDE2OTgpCi0JCQkJCSAgICAoMTAwNCwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA0LCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDE2NDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE0MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDIwLCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDExNDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDc1Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDExNDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDQxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NiwgMjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNDA2Ci0JCQkJaGVpZ2h0ICAgICAJMjg3Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOSIgQDExNDUKLQkJCQlsb2NhdGlvbiAgIAkoMTMwMywgNjc5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAMTE0NgotCQkJCQlQYXJlbnRfVmlldyAJQDExNDUKLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAwMzg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCQljbGllbnQgICAgIAlAMTE0NQotCQkJCQlzdXBwbGllciAgIAlAMTE0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzAzLCA2NzkpCi0JCQkJCSAgICAoMTMwMywgNDE5KQotCQkJCQkgICAgKDg0MywgNDE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkwNzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjAiIEAxMTQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE0NQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDExNDUKLQkJCQkJc3VwcGxpZXIgICAJQDExNDIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMwMywgNjc5KQotCQkJCQkgICAgKDEzMDMsIDk5NykKLQkJCQkJICAgICg5MDEsIDk5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDk5NykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE3IiBAMTE1MQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDExNTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTUxCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM4LCA1MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMTkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQkJY2xpZW50ICAgICAJQDExNTEKLQkJCQkJc3VwcGxpZXIgICAJQDExNDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQotCQkJCQkgICAgKDEyMTYsIDUzNCkKLQkJCQkJICAgICg4NDMsIDUzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDUzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTI2LCA1NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMTY0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE4IiBAMTE1NQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTEKLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgNzU2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTUxCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTYsIDY0OSkKLQkJCQkJICAgICgxMjE2LCA3OTcpCi0JCQkJCSAgICAoODc3LCA3OTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA3OTcpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMyIgQDExNTcKLQkJCQlsb2NhdGlvbiAgIAkoNjYyLCA2NDIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMTU4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE1NwotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDY3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjE2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTU3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTQzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNzI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDMwNjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjQiIEAxMTYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE1NwotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjEsIDU3NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcwIgotCQkJCQljbGllbnQgICAgIAlAMTE1NwotCQkJCQlzdXBwbGllciAgIAlAMTE0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDU1OSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI1IiBAMTE2MwotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI2IiBAMTE2NAotCQkJCQlQYXJlbnRfVmlldyAJQDExNjMKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDFFIgotCQkJCQljbGllbnQgICAgIAlAMTE2MwotCQkJCQlzdXBwbGllciAgIAlAMTE0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NSwgMTg4KQotCQkJCQkgICAgKDc1LCAxMjgpCi0JCQkJCSAgICAoNTEwLCAxMjgpCi0JCQkJCSAgICAoNTEwLCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMTY1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VmVyc2lvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMjgiCi0JCQkJCWNsaWVudCAgICAgCUAxMTYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc1LCAxODgpCi0JCQkJCSAgICAoNzUsIDM4MCkKLQkJCQkJICAgICg0MzcsIDM4MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAzODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMzI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI3IiBAMTE2OAotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAxMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEIwMTFCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjgiIEAxMTY5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE2OAotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyMSIKLQkJCQkJY2xpZW50ICAgICAJQDExNjgKLQkJCQkJc3VwcGxpZXIgICAJQDExNDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2NiwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTE3MAotCQkJCQlQYXJlbnRfVmlldyAJQDExNjgKLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2NCwgOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JpZ2luYWxWZXJzaW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCQljbGllbnQgICAgIAlAMTE2OAotCQkJCQlzdXBwbGllciAgIAlAMTE0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAxMzQpCi0JCQkJCSAgICAoMTMyMiwgMTM0KQotCQkJCQkgICAgKDEzMjIsIDMzNCkKLQkJCQkJICAgICg4NDMsIDMzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODEwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjkiIEAxMTczCi0JCQkJbG9jYXRpb24gICAJKDEyNiwgNjU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFRUFCMDAxRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMwIiBAMTE3NAotCQkJCQlQYXJlbnRfVmlldyAJQDExNzMKLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTczCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDUxMywgNjU2KQotCQkJCQkgICAgKDUxMywgNTU5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIgQDExNzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTczCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDM5MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTczCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDY2LCA2NTYpCi0JCQkJCSAgICAoNjYsIDQ3MikKLQkJCQkJICAgICg0MzcsIDQ3MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgNDcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTYsIDUyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY4NDY4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMyIgQDExNzgKLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzQiIEAxMTc5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE3OAotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCQljbGllbnQgICAgIAlAMTE3OAotCQkJCQlzdXBwbGllciAgIAlAMTE0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2NDIsIDEyNikKLQkJCQkJICAgICg1ODgsIDEyNikKLQkJCQkJICAgICg1ODgsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hRm9yU2NoZW1hIiBAMTE4MAotCQkJCQlQYXJlbnRfVmlldyAJQDExNzgKLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYUZvclNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1NTU1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGQiIKLQkJCQkJY2xpZW50ICAgICAJQDExNzgKLQkJCQkJc3VwcGxpZXIgICAJQDExNDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjQyLCAxMjYpCi0JCQkJCSAgICAoNjk3LCAxMjYpCi0JCQkJCSAgICAoNjk3LCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OTcsIDI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAyMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMTg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExODMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDExNDIKLQkJCQlzdXBwbGllciAgIAlAMTE0MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzgsIDg0MykpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTE4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0OTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzMiIEAxMTg1Ci0JCQkJbG9jYXRpb24gICAJKDIzNCwgMTM0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2QjAxOTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc0IiBAMTE4NgotCQkJCQlQYXJlbnRfVmlldyAJQDExODUKLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMwOSIKLQkJCQkJY2xpZW50ICAgICAJQDExODUKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDE4MSwgMTM0MCkKLQkJCQkJICAgICgxODEsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxLCAxMjM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDExODgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMzLCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjg2NzkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMxMyIKLQkJCQkJY2xpZW50ICAgICAJQDExODUKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDI4NywgMTM0MCkKLQkJCQkJICAgICgyODcsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg3LCAxMjM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDEyOTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0Mjk0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDExOTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYwLCAxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDExOTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTI0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDciIEAxMTkzCi0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwOCIgQDExOTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkzCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDEwRiIKLQkJCQkJY2xpZW50ICAgICAJQDExOTMKLQkJCQkJc3VwcGxpZXIgICAJQDExOTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY0ZhY2V0cyIgQDExOTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkzCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNDYxNTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIgotCQkJCQljbGllbnQgICAgIAlAMTE5MwotCQkJCQlzdXBwbGllciAgIAlAMTE5MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMzYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjI1LCAzMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDExOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMTk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgNjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgNTk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwOSIgQDEyMDAKLQkJCQlsb2NhdGlvbiAgIAkoMTUwOCwgNzkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQzMDI4RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEwIiBAMTIwMQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDAKLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA2OTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyMDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDc2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRkQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NTQsIDgyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk1MDYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg1IiBAMTIwNgotCQkJCWxvY2F0aW9uICAgCSg5MTksIDEzNDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNUUwMUY5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NiIgQDEyMDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDQ2IgotCQkJCQljbGllbnQgICAgIAlAMTIwNgotCQkJCQlzdXBwbGllciAgIAlAMTIwNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoODY2LCAxMzQ5KQotCQkJCQkgICAgKDg2NiwgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDEyMzkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyMDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk5MywgMTM5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzc3MzU4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDUwIgotCQkJCQljbGllbnQgICAgIAlAMTIwNgotCQkJCQlzdXBwbGllciAgIAlAMTIwNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoOTczLCAxMzQ5KQotCQkJCQkgICAgKDk3MywgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzMsIDEyMzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMTI5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAxNDkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEyMTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTEiIEAxMjEzCi0JCQkJbG9jYXRpb24gICAJKDIwMjUsIDc5MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREOTAxRjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMiIgQDEyMTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEzCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0IgotCQkJCQljbGllbnQgICAgIAlAMTIxMwotCQkJCQlzdXBwbGllciAgIAlAMTE5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgNjk1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjE1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIxMwotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA4MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjEyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwOTgsIDg0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MTczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMyIgQDEyMTgKLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxNCIgQDEyMTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjE4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE3IgotCQkJCQljbGllbnQgICAgIAlAMTIxOAotCQkJCQlzdXBwbGllciAgIAlAMTIwNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyMjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjE4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzM1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEyMTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyMTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTc1NCwgMTE3OCkKLQkJCQkJICAgICgyMDI4LCAxMTc4KQotCQkJCQkgICAgKDIwMjgsIDk5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM2NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEwLiBEaWFnbm9zdGljcyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNUYwODAzRTIiCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEAxMjIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJCXdpZHRoICAgICAgCTY4NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljU2V2ZXJpdHkiIEAxMjI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDY1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNTQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY4QTcwMzJGIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1OSwgNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODk2LCAxMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDYyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk3MzEKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NCwgNDAyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTQzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTUiIEAxMjI4Ci0JCQkJbG9jYXRpb24gICAJKDE0NCwgMjgzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2NDMxMDM1RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE2IiBAMTIyOQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjgKLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjgKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAxNzYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbGxEaWFnbm9zdGljcyIgQDEyMzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYWxsRGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0ODU5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJCWNsaWVudCAgICAgCUAxMjI4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjI3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjExIiBAMTIzMwotCQkJCWxvY2F0aW9uICAgCSgxMDI4LCA0NDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMjcwM0NEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTIiIEAxMjM0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIzMwotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzMKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcxMywgNDQwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyMzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzOCwgMjMwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBvbmVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwMjgsIDQ0MCkKLQkJCQkJICAgICgxMDg4LCA0NDApCi0JCQkJCSAgICAoMTA4OCwgMTc0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODgsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEzIiBAMTIzOAotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDI4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNCIgQDEyMzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjM4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCQljbGllbnQgICAgIAlAMTIzOAotCQkJCQlzdXBwbGllciAgIAlAMTIyNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDE3NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRpYWdub3N0aWNzIiBAMTI0MAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzgKLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MjYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjciCi0JCQkJCWNsaWVudCAgICAgCUAxMjM4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjI3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDk0NzM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI0MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEMwRjRDMDFBMSIKLQkJCQljbGllbnQgICAgIAlAMTIyNwotCQkJCXN1cHBsaWVyICAgCUAxMjI2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAzOTApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjExLiBTdXBwbGVtZW50YWwiCi0JCQlxdWlkICAgICAgIAkiM0MyODdFNDkwMTlCIgotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI0NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk4NTIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjQ1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDg4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDgyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNzgwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI0NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyNDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM3IiBAMTI0OAotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1hcnlDb21wb25lbnQiIEAxMjQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWFyeUNvbXBvbmVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQwODI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEzIgotCQkJCQljbGllbnQgICAgIAlAMTI0OAotCQkJCQlzdXBwbGllciAgIAlAMTI0NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTcyNjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzOCIgQDEyNTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNDgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEyNTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDY2NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiIKLQkJCQkJIisgY2lyY3VsYXIgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNzgyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTI1NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDEwNzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU5Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyIKLQkJCQkJIisgZWZmZWN0aXZlVmFsdWUgOiBWYWx1ZSIpKQotCQkJCXdpZHRoICAgICAgCTQ1OAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEyNTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA1NjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDYyOCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4MDUKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODIwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMTI1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDI4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAyMTcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBhbGlhc05hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHVSSSA6IFN0cmluZyIKLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciCi0JCQkJCSIrIHFOYW1lIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDcyCi0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTI1OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDM1MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCAyOTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMjU5Ci0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTEwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMjU4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgzMjAsIDUxMCkKLQkJCQkgICAgKDMyMCwgNDIwKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQljbGllbnQgICAgIAlAMTI1NgotCQkJCXN1cHBsaWVyICAgCUAxMjU4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDEyNDQKLQkJCQlzdXBwbGllciAgIAlAMTI1OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg3NywgNzQ4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjU5KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDEyNjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxODA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMSwgMTc2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDU2Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBAMTI2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTc3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNzI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQl3aWR0aCAgICAgIAk0OTMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEAxMjY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE4ODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIgotCQkJCXdpZHRoICAgICAgCTQ5MwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDEyNjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAxOTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MywgMTkxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEAxMjY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzQsIDEzNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDEyNjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2MywgMTIxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCXdpZHRoICAgICAgCTM5NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEAxMjY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCAxMzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDEzNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAkzODAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBAMTI2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTIzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5LCAxMTc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJd2lkdGggICAgICAJNDAwCi0JCQkJaGVpZ2h0ICAgICAJMTMyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBAMTI3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE2MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTM1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1OTUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIgotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDEyNzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyMjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjIzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCXdpZHRoICAgICAgCTQ1NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTI3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDI2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc0LCAyNTcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEAxMjczCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMjEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOTYsIDIwNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDEyNzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgMjA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQl3aWR0aCAgICAgIAk0NTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEAxMjc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAyMjcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDIyMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDEyNzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE1ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTUwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTU2MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA1Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEAxMjc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjQ2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMTEsIDI0MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDEyNzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOSwgMjM5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEAxMjc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDI1NTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEyODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NjcsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMjgxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDEwMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEyODIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTM2NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzUKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk1OTQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ5IiBAMTI4MwotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTI4NAotCQkJCQlQYXJlbnRfVmlldyAJQDEyODMKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTgwLCAxMTczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTMuMjY4MjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEREIgotCQkJCQljbGllbnQgICAgIAlAMTI4MwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDQ2LCAxMjE4KQotCQkJCQkgICAgKDE0ODcsIDEyMTgpCi0JCQkJCSAgICAoMTQ4NywgMTI5MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTI5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTI1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE4NDIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUwIiBAMTI4NwotCQkJCQlQYXJlbnRfVmlldyAJQDEyODMKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBFNyIKLQkJCQkJY2xpZW50ICAgICAJQDEyODMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkKLQkJCQkJICAgICgxNDA1LCAxMjE4KQotCQkJCQkgICAgKDE0MDUsIDEyOTIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDUsIDEyOTIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MyIgQDEyODgKLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NCIgQDEyODkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg4Ci0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDkxIgotCQkJCQljbGllbnQgICAgIAlAMTI4OAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzMzLCAxNTc1KQotCQkJCQkgICAgKDE0ODcsIDE1NzUpCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEZhY2V0IiBAMTI5MAotCQkJCQlQYXJlbnRfVmlldyAJQDEyODgKLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgMTU0MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ2MjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCQljbGllbnQgICAgIAlAMTI4OAotCQkJCQlzdXBwbGllciAgIAlAMTI3MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTE1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTUiIEAxMjkzCi0JCQkJbG9jYXRpb24gICAJKDE1ODcsIDE3OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUIwMzk2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTYiIEAxMjk0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI5MwotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5IgotCQkJCQljbGllbnQgICAgIAlAMTI5MwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTg3LCAxNzkzKQotCQkJCQkgICAgKDE0NDcsIDE3OTMpCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEluY2x1c2l2ZUZhY2V0IiBAMTI5NQotCQkJCQlQYXJlbnRfVmlldyAJQDEyOTMKLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTg0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjkzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjYyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MiwgMTc5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyMCwgMTc1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NyIgQDEyOTgKLQkJCQlsb2NhdGlvbiAgIAkoOTM3LCAxNzg3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU4IiBAMTI5OQotCQkJCQlQYXJlbnRfVmlldyAJQDEyOTgKLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMUY5IgotCQkJCQljbGllbnQgICAgIAlAMTI5OAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MzcsIDE3ODcpCi0JCQkJCSAgICAoOTk3LCAxNzg3KQotCQkJCQkgICAgKDk5NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzMDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjk4Ci0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTIsIDE3NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDIwMyIKLQkJCQkJY2xpZW50ICAgICAJQDEyOTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTc4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAxNzQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM5NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU5IiBAMTMwMwotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjAiIEAxMzA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMwMwotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTMwMwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5ODEsIDE5MzcpCi0JCQkJCSAgICAoMTA0MSwgMTkzNykKLQkJCQkJICAgICgxMDQxLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5FeGNsdXNpdmVGYWNldCIgQDEzMDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzAzCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIzLCAxOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDEyNTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzAzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ2NjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MSIgQDEzMDgKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OSwgMTk1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNjAyOEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MiIgQDEzMDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzA4Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMzA4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NjksIDE5NTMpCi0JCQkJCSAgICAoMTQwMCwgMTk1MykKLQkJCQkJICAgICgxNDAwLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RXhjbHVzaXZlRmFjZXQiIEAxMzEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMwOAotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMDgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY0LCAxOTUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTYxLCAxOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYzIiBAMTMxMwotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMTgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY0IiBAMTMxNAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTMKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMzEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImxlbmd0aEZhY2V0IiBAMTMxNQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTMKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA0LCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2xlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzU0NzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMjIsIDIxODApCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkKLQkJCQkJICAgICgzODcsIDIyNDApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjI0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcxLCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU1OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY3IiBAMTMxOAotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY4IiBAMTMxOQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTgKLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFCIgotCQkJCQljbGllbnQgICAgIAlAMTMxOAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbnVtZXJhdGlvbkZhY2V0cyIgQDEzMjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzE4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NTg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA4NCwgMTk4OSkKLQkJCQkJICAgICgxMDg0LCAyMDQ5KQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MTI5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjkiIEAxMzIzCi0JCQkJbG9jYXRpb24gICAJKDE0NTEsIDIwNzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzAiIEAxMzI0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMyMwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzIzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NTEsIDIwNzQpCi0JCQkJCSAgICAoMTM2MiwgMjA3NCkKLQkJCQkJICAgICgxMzYyLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGF0dGVybkZhY2V0cyIgQDEzMjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzIyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMDc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTcyLCAyMDM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcxIiBAMTMyOAotCQkJCWxvY2F0aW9uICAgCSgxODI3LCAxNDAwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM4MDJBNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcyIiBAMTMyOQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjgKLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFFQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjgKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxNDAwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2FyZGluYWxpdHlGYWNldCIgQDEzMzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg0NywgMTM1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjYXJkaW5hbGl0eUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzE3MzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzI4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjY2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNDI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MSIgQDEzMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQxMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MiIgQDEzMzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMzCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCQljbGllbnQgICAgIAlAMTMzMwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTMzNQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzMKLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwOCwgMjU1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0MTMpCi0JCQkJCSAgICAoMTI2MiwgMjU5NikKLQkJCQkJICAgICgyMDY1LCAyNTk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNTk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTc5LCAyNTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg1IiBAMTMzOAotCQkJCWxvY2F0aW9uICAgCSgxODQxLCAxMzA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEUzMDBEOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg2IiBAMTMzOQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzgKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM4RSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzgKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxMzA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYm91bmRlZEZhY2V0IiBAMTM0MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzgKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMyLCAxMjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2JvdW5kZWRGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzMTc0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM5OCIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTQ3MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY1IiBAMTM0MwotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMTg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY2IiBAMTM0NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDMKLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzNDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQzCi0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzMsIDIyMDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrd2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNzUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIxODYpCi0JCQkJCSAgICAoMTMyOCwgMjI0NikKLQkJCQkJICAgICgyMDkzLCAyMjQ2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMjQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDMzLCAyMjAzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgzIiBAMTM0OAotCQkJCWxvY2F0aW9uICAgCSg2NzQsIDEzOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwMDQ4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODQiIEAxMzQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTM0OAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMzkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JkZXJlZEZhY2V0IiBAMTM1MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDgKLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTgsIDEzNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JkZXJlZEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjE1MzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjY4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM0NjE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3MyIgQDEzNTMKLQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAxMjk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENCMDM5QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc0IiBAMTM1NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTMKLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTI5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDEzNTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY4LCAxMjU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK251bWVyaWNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QxIgotCQkJCQljbGllbnQgICAgIAlAMTM1MwotCQkJCQlzdXBwbGllciAgIAlAMTI2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQwLCAxMjk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDYsIDEyNjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODciIEAxMzU4Ci0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODgiIEAxMzU5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNjAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzU4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2ODksIDE2NjIpCi0JCQkJCSAgICAoMTQ4NywgMTY2MikKLQkJCQkJICAgICgxNDg3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4RmFjZXQiIEAxMzYwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2OSwgMTYyMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMTM1OAotCQkJCQlzdXBwbGllciAgIAlAMTI3MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNTM4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODkiIEAxMzYzCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NEYwMTQ1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTAiIEAxMzY0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCQljbGllbnQgICAgIAlAMTM2MwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxMzY1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDIyODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJCWNsaWVudCAgICAgCUAxMzYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIyNTgpCi0JCQkJCSAgICAoMTMyOCwgMjMyNCkKLQkJCQkJICAgICgyMDkzLCAyMzI0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMzI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA5LCAyMjkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkxIiBAMTM2OAotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzY2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNUM0MDExQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkyIiBAMTM2OQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjgKLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCQljbGllbnQgICAgIAlAMTM2OAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIgQDEzNzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjU3LCAyNDYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heExlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjY5MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMzY4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyOTcsIDIzNjYpCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkKLQkJCQkJICAgICgyMTAyLCAyNDk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA3LCAyNDcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkzIiBAMTM3MwotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk0IiBAMTM3NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzMKLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDEzOCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCIgQDEzNzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzczCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODUzMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzczCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0NDkpCi0JCQkJCSAgICAoMTI2MiwgMjY2OCkKLQkJCQkJICAgICgyMDY1LCAyNjY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY0ODUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk1IiBAMTM3OAotCQkJCWxvY2F0aW9uICAgCSgxNDIyLCAyMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNkIwMDNBNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk2IiBAMTM3OQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzgKLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzgKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQyMiwgMjE1OSkKLQkJCQkJICAgICgxMzYyLCAyMTU5KQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiIEAxMzgwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3OAotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTkwOTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjczCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjE1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjExOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NyIgQDEzODMKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMjA4MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5OCIgQDEzODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgzCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE4NiIKLQkJCQkJY2xpZW50ICAgICAJQDEzODMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIgQDEzODUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgzCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDIxMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4NjE5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTM4MwotCQkJCQlzdXBwbGllciAgIAlAMTI3NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg0LCAyMDgzKQotCQkJCQkgICAgKDEwODQsIDIxNDMpCi0JCQkJCSAgICAoNDg1LCAyMTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIxNDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgMjEwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTMxNzE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMyIgQDEzODgKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNCIgQDEzODkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTM4OAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVMZW5ndGhGYWNldCIgQDEzOTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxNzMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIgotCQkJCQljbGllbnQgICAgIAlAMTM4OAotCQkJCQlzdXBwbGllciAgIAlAMTI3NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTIyLCAyMjQxKQotCQkJCQkgICAgKDExMjIsIDIzMTgpCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4NTY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MSIgQDEzOTMKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAxNTY1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUyIiBAMTM5NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTMKLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIgotCQkJCQljbGllbnQgICAgIAlAMTM5MwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDE1NjUpCi0JCQkJCSAgICAoOTU5LCAxNTY1KQotCQkJCQkgICAgKDk1OSwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5GYWNldCIgQDEzOTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkzCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MzA5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSIKLQkJCQkJY2xpZW50ICAgICAJQDEzOTMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTU2NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAxNTIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA1IiBAMTM5OAotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDE2NTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzAwMURCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDYiIEAxMzk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OAotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBDRiIKLQkJCQkJY2xpZW50ICAgICAJQDEzOTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODE2LCAxNjUwKQotCQkJCQkgICAgKDk1OSwgMTY1MCkKLQkJCQkJICAgICg5NTksIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OAotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjQsIDE2MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQkJY2xpZW50ICAgICAJQDEzOTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTY1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAxNjA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDI3NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc1IiBAMTQwMwotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc2IiBAMTQwNAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDMKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDAzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heExlbmd0aEZhY2V0IiBAMTQwNQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDMKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyMjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIgotCQkJCQljbGllbnQgICAgIAlAMTQwMwotCQkJCQlzdXBwbGllciAgIAlAMTI3NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjk3LCAyMzIxKQotCQkJCQkgICAgKDEyOTcsIDI0MDkpCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc5MjA4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NyIgQDE0MDgKLQkJCQlsb2NhdGlvbiAgIAkoMTE1OSwgMjI3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3OCIgQDE0MDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQwOAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0MTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMjM3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDI3IgotCQkJCQljbGllbnQgICAgIAlAMTQwOAotCQkJCQlzdXBwbGllciAgIAlAMTI3OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTU5LCAyMjczKQotCQkJCQkgICAgKDExNTksIDI0MDkpCi0JCQkJCSAgICAoNDUwLCAyNDA5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0MDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMjM2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMSIgQDE0MTMKLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMjMzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMiIgQDE0MTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCQljbGllbnQgICAgIAlAMTQxMwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIgQDE0MTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NiwgMjQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUyNjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDYwIgotCQkJCQljbGllbnQgICAgIAlAMTQxMwotCQkJCQlzdXBwbGllciAgIAlAMTI3OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk3LCAyMzM0KQotCQkJCQkgICAgKDExOTcsIDI0OTMpCi0JCQkJCSAgICAoNDUwLCAyNDkzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0OTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNywgMjQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE2MDQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5OSIgQDE0MTgKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMCIgQDE0MTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQxOAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IiBAMTQyMAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTgKLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NzAzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyIKLQkJCQkJY2xpZW50ICAgICAJQDE0MTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIzMSwgMjQzOCkKLQkJCQkJICAgICgxMjMxLCAyNjY4KQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxODgxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzkiIEAxNDIzCi0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDIzOTcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwMERFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODAiIEAxNDI0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMwotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0MjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIzCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MywgMjU1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzRDciCi0JCQkJCWNsaWVudCAgICAgCUAxNDIzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMzEsIDIzOTcpCi0JCQkJCSAgICAoMTIzMSwgMjU4NykKLQkJCQkJICAgICg0NTEsIDI1ODcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjU4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM1LCAyNTYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDc2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTksIDU3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNDQ0Ci0JCQkJaGVpZ2h0ICAgICAJNDEzCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0MjkKLQkJCQlsb2NhdGlvbiAgIAkoMTIwOSwgMTA2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTQyOAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwOSwgMTA2NSkKLQkJCQkgICAgKDEyMDksIDk3NCkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzUiIEAxNDMwCi0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxNDMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMAotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NywgMTAzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTg3NjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDNDIgotCQkJCQljbGllbnQgICAgIAlAMTQzMAotCQkJCQlzdXBwbGllciAgIAlAMTQyOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2MTcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM2IiBAMTQzNAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzAKLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzAKLQkJCQkJc3VwcGxpZXIgICAJQDEyODAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDg4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDEiIEAxNDM1Ci0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDg3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZEQjAxRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQzNgotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzUKLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU4LCA3OTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTIwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA5MTkpCi0JCQkJCSAgICAoMTQ1NCwgOTE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDkxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDM2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwOSwgODc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MiIgQDE0MzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA4MjgpCi0JCQkJCSAgICAoMTQ1NCwgODI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDgyOCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQzIiBAMTQ0MAotCQkJCWxvY2F0aW9uICAgCSgxNTM1LCA2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTIwMTA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0NDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQwCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCQljbGllbnQgICAgIAlAMTQ0MAotCQkJCQlzdXBwbGllciAgIAlAMTQyOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM1LCA2ODQpCi0JCQkJCSAgICAoMTUzNSwgNzI4KQotCQkJCQkgICAgKDE0NTQsIDcyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA3MjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDYsIDY4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ0IiBAMTQ0NAotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDAKLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1QiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDAKLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzNSwgNjg0KQotCQkJCQkgICAgKDE1MzUsIDY0MSkKLQkJCQkJICAgICgxNDU0LCA2NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNjQxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDciIEAxNDQ1Ci0JCQkJbG9jYXRpb24gICAJKDYxMywgOTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0NQotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjUsIDk4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wbGV4VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTE3IgotCQkJCQljbGllbnQgICAgIAlAMTQ0NQotCQkJCQlzdXBwbGllciAgIAlAMTI4MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2MTMsIDk0MCkKLQkJCQkJICAgICgyODQsIDk0MCkKLQkJCQkJICAgICgyODQsIDEwMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDEwMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgOTcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0OCIgQDE0NDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTIxIgotCQkJCQljbGllbnQgICAgIAlAMTQ0NQotCQkJCQlzdXBwbGllciAgIAlAMTQyOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEwLCA5NDApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ1MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAMTQyOAotCQkJCXN1cHBsaWVyICAgCUAxMjU4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTEyLCA1MTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDUxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUAxMjgwCi0JCQkJc3VwcGxpZXIgICAJQDE0MjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDE0MjkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NSIgQDE0NTIKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MiwgMTEzMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0QjAxNzgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGUiIEAxNDUzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1MgotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjQ2NzUzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTIKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxMjkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIxLCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDYiIEAxNDU2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1MgotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDUyCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgOTc0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAMTQ1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDMwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDM2MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTUwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGdsb2JhbCA6IGJvb2xlYW4iCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0NTgKLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxNDU3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMjYyLCA1NjgpCi0JCQkJICAgICgyMjYyLCA0NzcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDU5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUAxMjU0Ci0JCQkJc3VwcGxpZXIgICAJQDE0NTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1OTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDU4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzkiIEAxNDYwCi0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGUiIEAxNDYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2MAotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMzEsIDQ5OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYyNjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRTUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDYwCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1NTMsIDQ1MykKLQkJCQkJICAgICgxMjIyLCA0NTMpCi0JCQkJCSAgICAoMTIyMiwgNTYyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMjIsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NSwgNDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTIwMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MCIgQDE0NjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYwCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNDYwCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMSIgQDE0NjUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwOCwgMzUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRGZWF0dXJlIiBAMTQ2NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjUKLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjk0MTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCQljbGllbnQgICAgIAlAMTQ2NQotCQkJCQlzdXBwbGllciAgIAlAMTQ1NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxOTA4LCAzNTMpCi0JCQkJCSAgICAoMTkwOCwgMzg3KQotCQkJCQkgICAgKDE5OTMsIDM4NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk2NjM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzIiIEAxNDY5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2NQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJCWNsaWVudCAgICAgCUAxNDY1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDU3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE5MDgsIDM1MykKLQkJCQkJICAgICgxOTA4LCAzMTkpCi0JCQkJCSAgICAoMTk5MywgMzE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUAxMjU4Ci0JCQkJc3VwcGxpZXIgICAJQDEyNTcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ5NCwgMjg0KQotCQkJCSAgICAoNDk0LCAyNDQpCi0JCQkJICAgICg5OTYsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NiwgMjQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUAxMjQ1Ci0JCQkJc3VwcGxpZXIgICAJQDE0NTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MTgsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDU4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEyODIKLQkJCQlzdXBwbGllciAgIAlAMTQyOAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDEyOTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDEwNjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQyOSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDczCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUAxNDU3Ci0JCQkJc3VwcGxpZXIgICAJQDEyNTcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIxNDcsIDI5MSkKLQkJCQkgICAgKDIxNDcsIDI0NCkKLQkJCQkgICAgKDE0NjgsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAyNDQpKSkpKSkpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDc2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkbCIgQDE0NzQKLQkJCWxvY2F0aW9uICAgCSgyNzIsIDI1NikKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc0Ci0JCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTcyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkid3NkbCIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiM0FERkI4RTUwMjFFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp4c2QiIEAxNDc1Ci0JCQlsb2NhdGlvbiAgIAkoMjcyLCA1NzYpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3NQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDQ5MikKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJInhzZCIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzlBQkRDNkYwMUFBIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NSIKLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDc3IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY2IgotCVByb2NzTkRldnMgCShsaXN0Ci0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCi0JCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjgiCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YUJhc2VTZXQiIDgwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIkFOU0kiCi0JCQkJdmFsdWUgICAgICAJODAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiT3JhY2xlIgotCQkJCXZhbHVlICAgICAgCTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIlNRTFNlcnZlciIKLQkJCQl2YWx1ZSAgICAgIAk4MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJTeWJhc2UiCi0JCQkJdmFsdWUgICAgICAJODAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiV2F0Y29tIgotCQkJCXZhbHVlICAgICAgCTgwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lIgotCQkJdmFsdWUgICAgICAJIlZfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0U3VmZml4IgotCQkJdmFsdWUgICAgICAJIl9WIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkJhc2VWaWV3cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiVkFSQ0hBUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIk51bGxzT0siCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImZyYW1ld29yayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklETEVsZW1lbnQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSURMU3BlY2lmaWNhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIklETFNwZWNTZXQiIDIyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklETFNwZWNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJUeXBlZGVmIgotCQkJCXZhbHVlICAgICAgCTU0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiRW51bWVyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiRXhjZXB0aW9uIgotCQkJCXZhbHVlICAgICAgCTYxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiU3RydWN0IgotCQkJCXZhbHVlICAgICAgCTUxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiVW5pb24iCi0JCQkJdmFsdWUgICAgICAJODEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuc2VydmljZXMvc3JjL3Jvc2Uvd3NkbE1kbC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5zZXJ2aWNlcy9zcmMvcm9zZS93c2RsTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJtXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJzXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIl9JRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCIKLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50IgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTE5MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIgotCQkJCXZhbHVlICAgICAgCTE5MDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQUZURVIiCi0JCQkJdmFsdWUgICAgICAJMTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiCi0JCQkJdmFsdWUgICAgICAJMTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIgotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJST1ciCi0JCQkJdmFsdWUgICAgICAJMTcwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiCi0JCQkJdmFsdWUgICAgICAJMTYwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSI2IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJlcG9zaXRvcnkiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5zZXJ2aWNlcy9zcmMvcm9zZS93c2RsTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuc2VydmljZXMvc3JjL3Jvc2Uvd3NkbE1kbC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJhaXNlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlNDQyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVHlwZUxpYkltcG9ydGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIxOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIyMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSIKLQkJCXZhbHVlICAgICAgCSIwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGUiCi0JCQl2YWx1ZSAgICAgIAkoIkNyZWF0YWJsZVNldCIgMjIxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5pdGlhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVGVybWluYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25DbGFzcyIKLQkJCXZhbHVlICAgICAgCSJDb2xsZWN0aW9uIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJUZXh0IgotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJG9wZXJhdGlvbiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpKQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjciKSkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvY29tLmlibS5ldG9vbHMuV1NETC5jYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL21vZGVsL2NvbS5pYm0uZXRvb2xzLldTREwuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjI3YmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvY29tLmlibS5ldG9vbHMuV1NETC5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw2OTk3ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQyCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzZGwiCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBxdWlkICAgICAgIAkiM0FERkI4RTUwMjFFIgotICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBXU0RMIG1vZGVsIGNvbnRhaW5zIGNsYXNzZXMgZm9yIHRoZSBXZWIgU2VydmljZXMgRGVzY3JpcHRpb24gTGFuZ3VhZ2UgKFdTREwpLgotfAotfFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4KLXwKLXxXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLgotfAotfFRoZSBtb2RlbCBjb250YWlucyB0aGUgZm9sbG93aW5nIGRpYWdyYW1zLCBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBjaGFwdGVycyBpbiB0aGUgV1NETCAxLjEgc3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9OT1RFLXdzZGwtMjAwMTAzMTUpCi18LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUKLXwtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQotfC0gMi4xLjMgRXh0ZW5zaWJpbGl0eSwgc2hvd3MgdGhlIFdTREwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc20KLXwtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwKLXwtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4KLXwKLXxUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4KLSAgICAKLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIgotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzcyAiV1NETEVsZW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1QzZBMzAyREQiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNDRDE1Mjk2MDBDOCIKLQkJICAgIHJlc3VsdCAgICAgCSJEZWZpbml0aW9uIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEVuY2xvc2luZ0RlZmluaXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0NEMTUyQjgwMzQ3IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImRlZmluaXRpb24iCi0JCQkgICAgdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0NFNDQzNjAyQTMiCi0JCSAgICB0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0Y5N0RCRDMwMjA3IgotCQkgICAgdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpCi0JKG9iamVjdCBDbGFzcyAiUG9ydFR5cGUiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDVDOUI3MDE1MCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0JEREYxRTMwMUU1IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJICAgIHF1aWQgICAgICAgCSIzRDE4Q0RFQjAzMTYiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNEMThENEZEMDFCQSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIk9wZXJhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVDODBEMDNDRSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFOURFOTgwMDNDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiCi0JCSAgICB0eXBlICAgICAgIAkiT3BlcmF0aW9uVHlwZSIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0JERDk2NDMwMDRDIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjIzNTAwM0UiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkgICAgcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOEQ1MjAwMTFCIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiTWVzc2FnZSIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQwNTUwMUM0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QThEMTAyQkEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQjQ4N0MwMUZFIgotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCRERGMUQyMDIyNiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOENFNEIwMkIwIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzRDE4RDU0MjAwRjEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJQYXJ0IgotCSAgICBxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwYXJ0IGVsZW1lbnQuIFBhcnRzIGRlc2NyaWJlIHRoZSBsb2dpY2FsIGFic3RyYWN0IGNvbnRlbnQgb2YgYSBtZXNzYWdlLiBFYWNoIHBhcnQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdHlwZSBmcm9tIHNvbWUgdHlwZSBzeXN0ZW0uICIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODRBOTZEMDJGMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTdFMjMwMjM3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0JDRTcwQjcwM0M4IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMDg3MDNEQiIKLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGVOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSIKLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGQTBGMDJGMCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiIKLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjFGNDAxQTMiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkgICAgcXVpZCAgICAgICAJIjNEMThDRTZEMDE1MSIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZ09wZXJhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDYwMDkyMDJGNyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OUM0Q0IwMTk5IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiU2VydmljZSIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUZBMjAwMjVFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIgotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCRERGMjBEMDIwMyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOEQ0ODEwMjIwIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzRDE4RDRDNTAxRTIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJQb3J0IgotCSAgICBxdWlkICAgICAgIAkiM0FENUQ5MTcwMjg2IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MDBDQjAwQUEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODU5NTQ1MDJDOSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkV4dGVuc2liaWxpdHlFbGVtZW50IgotCSAgICBxdWlkICAgICAgIAkiM0FENURCQjYwMkE5IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFdTREwgYWxsb3dzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QjE0OTAzRDAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0FGOTU0M0MwMDczIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50VHlwZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QjIxQTAyNzEiCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkRlZmluaXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QjFGODAzODIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0NEMTRGQzIwMTJCIgotCQkgICAgcmVzdWx0ICAgICAJIkRPTURvY3VtZW50IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50IgotCQkgICAgcXVpZCAgICAgICAJIjNDRDE1MERFMDFFNyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudCIKLQkJCSAgICB0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU0NzQwMDRFIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQwMzUyQjdDMDM5NiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FERDAwRDAwMEQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJJbXBvcnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFRTU4MDM3QSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjIwMEQwMzQwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY3MkMxMDM3OSIKLQkJICAgIHJlc3VsdCAgICAgCSJYU0RTY2hlbWEiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0U2NoZW1hIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY3MkMxMDM5NyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJzY2hlbWEiCi0JCQkgICAgdHlwZSAgICAgICAJIlhTRFNjaGVtYSIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTUwQTAwMzYiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU1MTQwMjExIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJsZUVsZW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JICAgIGRvY3VtZW50YXRpb24gCSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIgotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZCAgICAgICAJIjNCODVDMTQ3MDI5NSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJleHRFbGVtZW50IgotCQkJICAgIHR5cGUgICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIKLQkgICAgYWJzdHJhY3QgICAJVFJVRSkKLQkob2JqZWN0IENsYXNzICJJbnB1dCIKLQkgICAgcXVpZCAgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzUwNDAyNUYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjZGMUZFRTAzMUQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJPdXRwdXQiCi0JICAgIHF1aWQgICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUM1MEMwMzVCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjY3NzIzNTAwREQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjFGRjgwMUNEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkZhdWx0IgotCSAgICBxdWlkICAgICAgIAkiM0FFMDc4QkUwMTA4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjY3NzIzRDAzMTkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjIwMDIwMDJEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0IgotCSAgICBxdWlkICAgICAgIAkiM0FFMDhBODIwMkQ0IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTFCMDExMyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QjU5QjAwNzIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUzQTQwMjAzIgotCQkgICAgcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTNCNTAzQTIiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkgICAgdHlwZSAgICAgICAJIklJbnB1dCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMxRUEwMjBFIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZ091dHB1dCIKLQkgICAgcXVpZCAgICAgICAJIjNBRTA4QThGMDI4QyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUU0MzAyQUIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODVCNUE0MDI3RSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUzRDkwMEYxIgotCQkgICAgcmVzdWx0ICAgICAJIklPdXRwdXQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1M0YxMDMyNiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiCi0JCQkgICAgdHlwZSAgICAgICAJIklPdXRwdXQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCODVDMjAyMDBCRSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkJpbmRpbmdGYXVsdCIKLQkgICAgcXVpZCAgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUU3MTAzMzMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTQxMzAzN0YiCi0JCSAgICByZXN1bHQgICAgIAkiSUZhdWx0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCSAgICB0eXBlICAgICAgIAkiSUZhdWx0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QkY5RTAxNEEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJRTmFtZSIKLQkgICAgcXVpZCAgICAgICAJIjNBRThFRDIyMDE0MCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCODQ5REE5MDAzRCIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIk5hbWVzcGFjZSIKLQkgICAgcXVpZCAgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVBM0QyOTAxQjEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZml4IgotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDMyMDIzNiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIk9wZXJhdGlvblR5cGUiCi0JICAgIHF1aWQgICAgICAgCSIzQUVCNDc4MjAyNEYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfE9ORV9XQVk9MQotfFJFUVVFU1RfUkVTUE9OU0U9MgotfFNPTElDSVRfUkVTUE9OU0U9MwotfE5PVElGSUNBVElPTj00Ci0JICAgIAotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzM1MzAzRTMiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJJUG9ydFR5cGUiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRPcGVyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZBQzEwMUNBIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiIKLQkJCSAgICB0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb25zIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QkY3MDMxQSIKLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBNjMyMDAwRCIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSU9wZXJhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBNzc2MDBEMSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRGYXVsdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkM0MjAwNjUiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiCi0JCQkgICAgdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHRzIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QzcxMDJCMSIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlck9yZGVyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCIKLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkM5OTAzMUQiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyT3JkZXIiCi0JCQkgICAgdHlwZSAgICAgICAJIklMaXN0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjU0RTUwMThEIgotCQkgICAgcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjJDNDAxMDciCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkgICAgdHlwZSAgICAgICAJIklJbnB1dCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjJFNDAwOTQiCi0JCSAgICByZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjYyRjAwMUQyIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCIKLQkJCSAgICB0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBNzk5MDEyQiIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUlucHV0IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEE3RUUwMDE1IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLklucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjMzMTAwRUYiCi0JCSAgICByZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCSAgICB0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLklucHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBODAwMDAzOSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSU91dHB1dCIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY2NDNBMDM1RCIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY2NDQ1MDFDOCIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJICAgIHR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBODM5MDFENSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUZhdWx0IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEE4NjEwMzFEIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjQ2QTAwQkQiCi0JCSAgICByZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjQ3NTAxMzEiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCSAgICB0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBODcxMDIwOCIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSU1lc3NhZ2UiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QThBRjAwNEYiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkUGFydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NzIyNDAyNzMiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFydCIKLQkJCSAgICB0eXBlICAgICAgIAkiSVBhcnQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk3MjNEMDIzMyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJUGFydCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0cyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NzI1NDAyNUUiCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPcmRlcmVkUGFydHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTcyNjEwMjBEIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBhcnRPcmRlciIKLQkJCSAgICB0eXBlICAgICAgIAkiSUxpc3QiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJUGFydCIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBOTNGMDFCRSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0M0Njg4NDUwMDUyIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJ2YWx1ZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIGV4Y2VwdGlvbnMgCSJXU0RMRXhjZXB0aW9uIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIgotCQkgICAgcXVpZCAgICAgICAJIjNDNDY4QTAxMDFDMyIKLQkJICAgIHJlc3VsdCAgICAgCSJJSXRlcmF0b3IiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIgotCQkgICAgcXVpZCAgICAgICAJIjNDNDY4QTJEMDJENSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkgICAgcmVzdWx0ICAgICAJIlFOYW1lIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUGFydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QTk1MDAyMzEiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklTZXJ2aWNlIgotCSAgICBxdWlkICAgICAgIAkiM0I4NEFCNDkwMjg3IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk1RDU2MDFEMSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwb3J0IgotCQkJICAgIHR5cGUgICAgICAgCSJJUG9ydCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVEQjAwMUJDIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIklQb3J0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUI1QjAwM0UiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklQb3J0IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEFCODAwMzI2IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MUYzMDJCNSIKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZyIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUI4QzAwMTYiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklCaW5kaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmcgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nT3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk1RjE2MDE1MyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3BlcmF0aW9uIgotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVGNTAwMDY2IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dE5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb25zIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk1RkE0MDFDNSIKLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTJBOTAyODQiCi0JCSAgICByZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFBvcnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MkJFMDFBOCIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSIKLQkJCSAgICB0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBQkNGMDMwMiIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPcGVyYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QURDMDAwNzIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdGYXVsdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NjBCQzAwNDEiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0ZhdWx0IgotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZ0ZhdWx0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTYwRkMwMDYxIgotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyIKLQkJICAgIHJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldE9wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTMzRjAzN0IiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIgotCQkJICAgIHR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0lucHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NTA5MDBEQSIKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTUxRDAwN0YiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0lucHV0IgotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZ0lucHV0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTUzNDAzNDkiCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ091dHB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTU0NzAyQTYiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ091dHB1dCIKLQkJCSAgICB0eXBlICAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFEQ0IwMjFDIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJQmluZGluZ0lucHV0IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEFERUIwMTAwIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0lucHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBREZFMDAwRCIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPdXRwdXQiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ091dHB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ091dHB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUUyRDAwNTAiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklCaW5kaW5nRmF1bHQiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUU0RjAwQkQiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFFNUYwMDJBIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJET01FbGVtZW50IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEFGMzIwM0RCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5FbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRjU2MDI5MiIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUV4dGVuc2liaWxpdHlFbGVtZW50IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMTM1MDNEMSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSURlZmluaXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QjFEOTAxNDIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRGVmaW5pdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg4RjEwMzlEIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkSW1wb3J0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OTQ5MDI1OSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbXBvcnREZWYiCi0JCQkgICAgdHlwZSAgICAgICAJIklJbXBvcnQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OTZFMDA1RSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJICAgIHR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODk4NDAwNEIiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicHJlZml4IgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5QzUwMDQ1IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJICAgIHR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRTZXJ2aWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OUU0MDFFRSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIgotCQkJICAgIHR5cGUgICAgICAgCSJJU2VydmljZSIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdGYXVsdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEExNzAzOEMiCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nSW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBMzIwMjg2IgotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ091dHB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ09wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEE1QzAwQjAiCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODlGRTAzN0MiCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlRmF1bHQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3IgotCQkgICAgcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbXBvcnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBODMwMTRDIgotCQkgICAgcmVzdWx0ICAgICAJIklJbXBvcnQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBOUQwMzNFIgotCQkgICAgcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPcGVyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBQzIwM0M0IgotCQkgICAgcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QUU4MDBFRCIKLQkJICAgIHJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBhcnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIgotCQkgICAgcmVzdWx0ICAgICAJIklQYXJ0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCMDgwMURBIgotCQkgICAgcmVzdWx0ICAgICAJIklQb3J0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QjE1MDM5QiIKLQkJICAgIHJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlU2VydmljZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiCi0JCSAgICByZXN1bHQgICAgIAkiSVNlcnZpY2UiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEI0MjAwNzUiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5ncyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QkNEMDA2MCIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCRTcwMTQ0IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEMxNzAxMDciCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDNjIwMTRCIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1IgotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDQkUwMDcxIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCSAgICByZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQcmVmaXgiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDRkQwMDE3IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCSAgICByZXN1bHQgICAgIAkiSVNlcnZpY2UiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThEM0IwM0NFIgotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIgotCQkgICAgcmVzdWx0ICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDVENzAzQkIiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkgICAgdHlwZSAgICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50QmFzZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDVGRTAyMDgiCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50QmFzZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDYxODAzMjgiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnRCYXNlIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FERDA1NjAwODAiCi0JCSAgICByZXN1bHQgICAgIAkiSVR5cGVzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVNlcnZpY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0NBREQwN0UwMDRDIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCSAgICByZXN1bHQgICAgIAkiSVNlcnZpY2UiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FERDBCQTAzNTUiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVQb3J0VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FERDBEODAyOUEiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlTWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FERDBGQTAzMDciCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NzA2RjAzMUIiCi0JCSAgICByZXN1bHQgICAgIAkiSVR5cGVzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFR5cGVzIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY3MDk1MDBFRSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJ0eXBlcyIKLQkJCSAgICB0eXBlICAgICAgIAkiSVR5cGVzIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMUU3MDJBMSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUltcG9ydCIKLQkgICAgcXVpZCAgICAgICAJIjNCODRCMjAyMDExOSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkltcG9ydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QjIwQzAyRUEiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklMaXN0IgotCSAgICBxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5MaXN0IGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODVDMEFGMDI5NyIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSU1hcCIKLQkgICAgcXVpZCAgICAgICAJIjNCODk2QjAzMDBENCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZCMTEwMkI1IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJVVJMIgotCSAgICBxdWlkICAgICAgIAkiM0I4OUQ1NjMwMjc0IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLm5ldC5VUkwiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OUQ1NkUwM0UyIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJRXh0ZW5zaW9uUmVnaXN0cnkiCi0JICAgIHF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDU5RjAyRTgiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIlR5cGVzIgotCSAgICBxdWlkICAgICAgIAkiM0I4QkU5QTYwM0E4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FEQ0QzQjAzODAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiCi0JCSAgICBxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0NBRENGMzgwM0U2IgotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkpCi0JKG9iamVjdCBDbGFzcyAiSUl0ZXJhdG9yIgotCSAgICBxdWlkICAgICAgIAkiM0M0Njg3REEwMTY3IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuSXRlcmF0b3IiCi0JCSAgICBxdWlkICAgICAgIAkiM0M0Njg4MDgwMEI5IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJXU0RMRXhjZXB0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0M0Njg5NjUwMzEzIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4Y2VwdGlvbiBjbGFzcy4iCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNDNDY4OTc0MDMxNSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSVR5cGVzIgotCSAgICBxdWlkICAgICAgIAkiM0NBRENCQjIwMDUwIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlR5cGVzIgotCQkgICAgcXVpZCAgICAgICAJIjNDQURDQkYxMDE3MyIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IgotCSAgICBxdWlkICAgICAgIAkiM0NCMjRBQzAwMkFFIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQotCShvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IgotCSAgICBxdWlkICAgICAgIAkiM0NDMzYwRDcwMzlDIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0NDMzYyN0YwMEI3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQotCShvYmplY3QgQ2xhc3MgIkRPTURvY3VtZW50IgotCSAgICBxdWlkICAgICAgIAkiM0NEMTUwMkMwMjNCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0NEMTUwNjAwMTgyIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJNZXNzYWdlUmVmZXJlbmNlIgotCSAgICBxdWlkICAgICAgIAkiM0Y2NzcxREIwMkRDIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y3NjJBNkEwMzA4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2NzgwQTAwMUFCIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQcm90ZWN0ZWQiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVDODI0MDE4QyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicG9ydFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIgotCQkgICAgbGFiZWwgICAgICAJInBvcnRUeXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJlT3BlcmF0aW9ucyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQ0QiCi0JCSAgICBsYWJlbCAgICAgIAkiZU9wZXJhdGlvbnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1Q0VCRTAwRTIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUNFQkYwMDU3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiZVBhcnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVDRUJGMDA2MSIKLQkJICAgIGxhYmVsICAgICAgCSJlUGFydHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIgotCSAgICBxdWlkICAgICAgIAkiM0FENUQzNTIwMTBGIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlUG9ydFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQzNTQwMTc2IgotCQkgICAgbGFiZWwgICAgICAJImVQb3J0VHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0IgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEMzU0MDE4MCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQzRTIwMjI1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiZUJpbmRpbmdPcGVyYXRpb25zIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEM0UyMDIzOSIKLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZ09wZXJhdGlvbnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3IgotCSAgICBxdWlkICAgICAgIAkiM0FENUQ0MjUwMzhBIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVENDI2MDJGNSIKLQkJICAgIGxhYmVsICAgICAgCSJlT3BlcmF0aW9uIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4IgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVENDI2MDJGRiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVQb3J0cyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiCi0JCSAgICBsYWJlbCAgICAgIAkiZVBvcnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxRCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDlCODAxMUYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEOUI5MDI2MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIgotCSAgICBxdWlkICAgICAgIAkiM0FENUU2MDMwMUUyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQjciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJlTWVzc2FnZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkgICAgbGFiZWwgICAgICAJImVNZXNzYWdlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1IgotCSAgICBxdWlkICAgICAgIAkiM0FENUU2NzEwMTA0IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNEEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJlUG9ydFR5cGVzIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJICAgIGxhYmVsICAgICAgCSJlUG9ydFR5cGVzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3IgotCSAgICBxdWlkICAgICAgIAkiM0FENUU2NzcwMDk1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3ODAzNzEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJlQmluZGluZ3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5ncyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5IgotCSAgICBxdWlkICAgICAgIAkiM0FENUU2N0IwMzExIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3RDAwN0YiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJlU2VydmljZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkgICAgbGFiZWwgICAgICAJImVTZXJ2aWNlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIgotCSAgICBxdWlkICAgICAgIAkiM0FENUZEMTMwMDc5IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJICAgIGxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMiIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyIKLQkgICAgcXVpZCAgICAgICAJIjNBREYyRTY0MDFGNSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZUJpbmRpbmdJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkU2NTAyNTEiCi0JCSAgICBsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0IgotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUiCi0JICAgIHF1aWQgICAgICAgCSIzQURGMkVCMzAxNjMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRUI0MDEzQyIKLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZ091dHB1dCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNiIKLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkVCNDAxM0QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3IgotCSAgICBxdWlkICAgICAgIAkiM0FERjJGOTQwMjREIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlSW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIgotCQkgICAgbGFiZWwgICAgICAJImVJbnB1dCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJGOTUwMTlBIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5IgotCSAgICBxdWlkICAgICAgIAkiM0FERjJGQjgwMkY5IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQSIKLQkJICAgIGxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJGQjkwMjBCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxIgotCSAgICBxdWlkICAgICAgIAkiM0FERjMzMTYwMUE0IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlRmF1bHRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBREYzMzE4MDM4NyIKLQkJICAgIGxhYmVsICAgICAgCSJlRmF1bHRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMiIKLQkJICAgIHF1aWQgICAgICAgCSIzQURGMzMxODAzODgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzMiCi0JICAgIHF1aWQgICAgICAgCSIzQURGMzQwMDAzRTUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQSIKLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZ0ZhdWx0cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM0IgotCQkgICAgcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzUiCi0JICAgIHF1aWQgICAgICAgCSIzQUUwOTFGNDAyRjMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVGYXVsdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUUwOTFGODAxRkUiCi0JCSAgICBsYWJlbCAgICAgIAkiZUZhdWx0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM2IgotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzciCi0JICAgIHF1aWQgICAgICAgCSIzQUVBM0Q1NTAwMkQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM4IgotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImVOYW1lc3BhY2VzIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDU2MDMzMiIKLQkJICAgIGxhYmVsICAgICAgCSJlTmFtZXNwYWNlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzkiCi0JICAgIHF1aWQgICAgICAgCSIzQUVBM0UzQTAwMkQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVEZWZpbml0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJICAgIGxhYmVsICAgICAgCSJlRGVmaW5pdGlvbiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQwIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRTNDMDFGMiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDEiCi0JICAgIHF1aWQgICAgICAgCSIzQUVBNDEyRjAwMzUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVQYXJhbWV0ZXJPcmRlcmluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVBNDEzMTAyNTUiCi0JCSAgICBsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDIiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQTQxMzEwMjVGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MyIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBRDI0MDBCRCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZUlucHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRDI1MDA4MyIKLQkJICAgIGxhYmVsICAgICAgCSJlSW5wdXQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFEMjUwMDg0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NSIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBRDc5MDBGMiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEQiCi0JCSAgICBsYWJlbCAgICAgIAkiZU91dHB1dCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDYiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFEN0EwMTRFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDciCi0JICAgIHF1aWQgICAgICAgCSIzQjhCMUJFOTAwQzQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyIKLQkJICAgIGxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ4IgotCQkgICAgcXVpZCAgICAgICAJIjNCOEIxQkU5MDMzMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ5IgotCSAgICBxdWlkICAgICAgIAkiM0I4QjFDMTIwM0IyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlbGVtZW50RGVjbGFyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QjFDMTQwMDFDIgotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMUMxNDAwMjYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MSIKLQkgICAgcXVpZCAgICAgICAJIjNCOEIxRENDMDJFNSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZVNjaGVtYSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMURDRTAyNzAiCi0JCSAgICBsYWJlbCAgICAgIAkiZVNjaGVtYSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkgICAgcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUzIgotCSAgICBxdWlkICAgICAgIAkiM0I4QkVBMjcwMjlGIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJlVHlwZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QkVBMjkwMzZBIgotCQkgICAgbGFiZWwgICAgICAJImVUeXBlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIgotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSIKLQkgICAgcXVpZCAgICAgICAJIjNDNDY4MjkzMDNFNSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZU1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0M0NjgyOTYwMTBFIgotCQkgICAgbGFiZWwgICAgICAJImVNZXNzYWdlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTYiCi0JCSAgICBxdWlkICAgICAgIAkiM0M0NjgyOTYwMTE4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTciCi0JICAgIHF1aWQgICAgICAgCSIzQzg2NERGRjAyRUMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVJbXBvcnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY0REZGMDJFRCIKLQkJICAgIGxhYmVsICAgICAgCSJlSW1wb3J0cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU4IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTkiCi0JICAgIHF1aWQgICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIgotCQkgICAgcXVpZCAgICAgICAJIjNDQzM2MTQ2MDIzRCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJzY2hlbWEiCi0JCSAgICBxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNFIgotCQkgICAgbGFiZWwgICAgICAJInNjaGVtYSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkgICAgcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSIKLQkgICAgcXVpZCAgICAgICAJIjNGNzRFNzg0MDFCMSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZU1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkgICAgbGFiZWwgICAgICAJImVNZXNzYWdlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjIiCi0JCSAgICBxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDIzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjMiCi0JICAgIHF1aWQgICAgICAgCSIzRjc4OTZBMjAyNkUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBhcmVudCIKLQkJICAgIHF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiCi0JCSAgICBsYWJlbCAgICAgIAkicGFyZW50IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJjaGlsZHJlbiIKLQkJICAgIHF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkMiCi0JCSAgICBsYWJlbCAgICAgIAkiY2hpbGRyZW4iCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiCi0JICAgIHF1aWQgICAgICAgCSIzOUFEM0VGNjAxMjciCi0JICAgIHRpdGxlICAgICAgCSIyLjcgU2VydmljZXMiCi0JICAgIHpvb20gICAgICAgCTkwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIiBAMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgODAwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDExNzMsIDY2MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJQmluZGluZyIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoMTE3MywgNjEwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJICAgIHdpZHRoICAgICAgCTUyMAotCQkgICAgaGVpZ2h0ICAgICAJNDA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IiBAMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODE2LCA1MjgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoNjg2LCA0ODEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSVBvcnQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDY4NiwgNDMxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIKLQkJICAgIHdpZHRoICAgICAgCTI3OAotCQkgICAgaGVpZ2h0ICAgICAJMjE4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIiBAMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCAxNjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQlsb2NhdGlvbiAgIAkoMTI2LCA5MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJU2VydmljZSIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQlsb2NhdGlvbiAgIAkoMTI2LCA0MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciCi0JCSAgICB3aWR0aCAgICAgIAkyNDYKLQkJICAgIGhlaWdodCAgICAgCTI2NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBANAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDUyOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQKLQkJCWxvY2F0aW9uICAgCSg0NCwgMzg5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJICAgIHdpZHRoICAgICAgCTQxMAotCQkgICAgaGVpZ2h0ICAgICAJMzAyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NTk1NEUwMUI0IgotCQkgICAgY2xpZW50ICAgICAJQDQKLQkJICAgIHN1cHBsaWVyICAgCUAzCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI0MCwgMzc3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANgotCQkJbG9jYXRpb24gICAJKDEyNDQsIDExMjUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkgICAgd2lkdGggICAgICAJNDEwCi0JCSAgICBoZWlnaHQgICAgIAkzMDIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCSAgICBjbGllbnQgICAgIAlANgotCQkgICAgc3VwcGxpZXIgICAJQDEKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQzMCwgMTExMykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMwLCAxMDAyKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDkxMikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDgKLQkJCWxvY2F0aW9uICAgCSg2NzUsIDg0MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyODIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQb3J0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCSAgICB3aWR0aCAgICAgIAkzMDAKLQkJICAgIGhlaWdodCAgICAgCTE2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODU5NTQ1MDJDOSIKLQkJICAgIGNsaWVudCAgICAgCUA4Ci0JCSAgICBzdXBwbGllciAgIAlAMgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDksIDgyOCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBAMTAKLQkJICAgIGxvY2F0aW9uICAgCSgzNDMsIDkxNikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVQb3J0cyIgQDExCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMAotCQkJICAgIGxvY2F0aW9uICAgCSgtMTIxLCA2NDQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIKLQkJCQlQYXJlbnRfVmlldyAJQDExCi0JCQkJbG9jYXRpb24gICAJKDQxMywgOTQ1KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VQb3J0cyIKLQkJCQlwY3REaXN0ICAgIAkwLjIxODk3OAotCQkJCWhlaWdodCAgICAgCTI5Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5NDEwMzFDIgotCQkJICAgIGNsaWVudCAgICAgCUAxMAotCQkJICAgIHN1cHBsaWVyICAgCUA4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzCi0JCQkJUGFyZW50X1ZpZXcgCUAxMQotCQkJCWxvY2F0aW9uICAgCSg1MzksIDg4MCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC42MDgwMDAKLQkJCQloZWlnaHQgICAgIAkzNwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDk5MCkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjMyODQ2NwotCQkJCWhlaWdodCAgICAgCTc0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEAxNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMSwgNjQ0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJCWxvY2F0aW9uICAgCSgyMTYsIDc0NCkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5NDEwMzFEIgotCQkJICAgIGNsaWVudCAgICAgCUAxMAotCQkJICAgIHN1cHBsaWVyICAgCUA0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDM0MywgOTE2KQotCQkJCSgyNTcsIDkxNikKLQkJCQkoMjU3LCA2NzkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNwotCQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCQlsb2NhdGlvbiAgIAkoMzAxLCA3OTYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42MzcwOTcKLQkJCQloZWlnaHQgICAgIAk0NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxOAotCQkgICAgbG9jYXRpb24gICAJKDg4NiwgMTI3MCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDlCODAxMUYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nIiBAMTkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ci0JCQkgICAgbG9jYXRpb24gICAJKDM4LCA0MjIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAKLQkJCQlQYXJlbnRfVmlldyAJQDE5Ci0JCQkJbG9jYXRpb24gICAJKDExMTIsIDEyMzUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTgwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUJpbmRpbmciCi0JCQkJcGN0RGlzdCAgICAJMC42NDg1NzEKLQkJCQloZWlnaHQgICAgIAkzNgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTgKLQkJCSAgICBzdXBwbGllciAgIAlANgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNSwgMTI3MCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQotCQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCQlsb2NhdGlvbiAgIAkoMTE3MCwgMTMxMykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjgxNDI4NgotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEAyMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDQyMikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMwotCQkJCVBhcmVudF9WaWV3IAlAMjIKLQkJCQlsb2NhdGlvbiAgIAkoODUyLCAxMTA2KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjY4Nzk0MwotCQkJCWhlaWdodCAgICAgCTQwCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJICAgIGNsaWVudCAgICAgCUAxOAotCQkJICAgIHN1cHBsaWVyICAgCUA4Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDg4NiwgMTI3MCkKLQkJCQkoODEyLCAxMjcwKQotCQkJCSg4MTIsIDk5NikpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTIsIDk5NikpKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjUgQmluZGluZ3MiCi0JICAgIHF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiCi0JICAgIHRpdGxlICAgICAgCSIyLjUgQmluZGluZ3MiCi0JICAgIHpvb20gICAgICAgCTg1Ci0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIiBAMjQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMwNCwgMjQwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjQKLQkJCWxvY2F0aW9uICAgCSg3MywgMTE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI0Ci0JCQlsb2NhdGlvbiAgIAkoNzMsIDY0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJICAgIHdpZHRoICAgICAgCTQ4MAotCQkgICAgaGVpZ2h0ICAgICAJMzc2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIiBAMjUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDk3NiwgMzUyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjUKLQkJCWxvY2F0aW9uICAgCSg3ODAsIDEzMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzOTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJbG9jYXRpb24gICAJKDc4MCwgODApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIgotCQkgICAgd2lkdGggICAgICAJNDEwCi0JCSAgICBoZWlnaHQgICAgIAk1NjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDI2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDEzNjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNgotCQkJbG9jYXRpb24gICAJKDYyLCAxMzM0KQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nSW5wdXQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjYKLQkJCWxvY2F0aW9uICAgCSg2MiwgMTI4NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiCi0JCSAgICB3aWR0aCAgICAgIAkyNzgKLQkJICAgIGhlaWdodCAgICAgCTE3NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIgQDI3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDE2NjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNwotCQkJbG9jYXRpb24gICAJKDYxLCAxNjM4KQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nT3V0cHV0IikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI3Ci0JCQlsb2NhdGlvbiAgIAkoNjEsIDE1ODgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIgotCQkgICAgd2lkdGggICAgICAJMzEyCi0JCSAgICBoZWlnaHQgICAgIAkxNzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIgQDI4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDE5ODQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyOAotCQkJbG9jYXRpb24gICAJKDcyLCAxOTU4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjgKLQkJCWxvY2F0aW9uICAgCSg3MiwgMTkwOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiCi0JCSAgICB3aWR0aCAgICAgIAkyOTAKLQkJICAgIGhlaWdodCAgICAgCTE3NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDI5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDYyNCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQlsb2NhdGlvbiAgIAkoMTU2OCwgNDg2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY3MwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCSAgICB3aWR0aCAgICAgIAk2OTEKLQkJICAgIGhlaWdodCAgICAgCTMwMQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDMwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDEzNjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzMAotCQkJbG9jYXRpb24gICAJKDE3NTYsIDEyODMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJICAgIHdpZHRoICAgICAgCTMxNAotCQkgICAgaGVpZ2h0ICAgICAJMTc4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDMxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDE2NjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzMQotCQkJbG9jYXRpb24gICAJKDE3NTYsIDE1ODcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiT3V0cHV0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCSAgICB3aWR0aCAgICAgIAkzMTQKLQkJICAgIGhlaWdodCAgICAgCTE3OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMzIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA0LCA2ODgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzMgotCQkJbG9jYXRpb24gICAJKDk3LCA1MzkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDE0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkgICAgd2lkdGggICAgICAJNDMyCi0JCSAgICBoZWlnaHQgICAgIAkzMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkgICAgY2xpZW50ICAgICAJQDMyCi0JCSAgICBzdXBwbGllciAgIAlAMjQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1MjcpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc5LCA0MjgpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDM0Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTAzOSwgNzQyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMzUyMDEwRiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlIiBAMzUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Ci0JCQkgICAgbG9jYXRpb24gICAJKDU3NSwgNTk4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNQotCQkJCWxvY2F0aW9uICAgCSgxNDQ5LCA3ODEpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjE2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZVBvcnRUeXBlIgotCQkJCXBjdERpc3QgICAgCTAuNzg5MjkyCi0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCQkgICAgY2xpZW50ICAgICAJQDM0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU5LCA3NDIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQlQYXJlbnRfVmlldyAJQDM1Ci0JCQkJbG9jYXRpb24gICAJKDE0OTIsIDcxNikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg3MjE5MwotCQkJCWhlaWdodCAgICAgCTI3Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDM4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNAotCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDU5OCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQotCQkJCVBhcmVudF9WaWV3IAlAMzgKLQkJCQlsb2NhdGlvbiAgIAkoNzc2LCA2OTcpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTEwOAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuNTA5NDQ5Ci0JCQkJaGVpZ2h0ICAgICAJNDYKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiCi0JCQkgICAgY2xpZW50ICAgICAJQDM0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMyCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjAsIDc0MikpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEA0MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODg4LCAxMDI0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDAKLQkJCWxvY2F0aW9uICAgCSgxNjcyLCA4NTEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCSAgICB3aWR0aCAgICAgIAk0NTAKLQkJICAgIGhlaWdodCAgICAgCTM3MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEA0MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDE0MDgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MQotCQkJbG9jYXRpb24gICAJKDQ3NiwgMTI4MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJICAgIHdpZHRoICAgICAgCTMxNAotCQkgICAgaGVpZ2h0ICAgICAJMjc0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDMiIEA0MgotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDEzNTkpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEMjQwMEJEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA0MwotCQkJICAgIFBhcmVudF9WaWV3IAlANDIKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTYsIDI4NykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NAotCQkJCVBhcmVudF9WaWV3IAlANDMKLQkJCQlsb2NhdGlvbiAgIAkoMTYzNywgMTMxNikKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxMzIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlSW5wdXQiCi0JCQkJcGN0RGlzdCAgICAJMC43NzUxNDgKLQkJCQloZWlnaHQgICAgIAk0NAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCODRBRDI1MDA4MyIKLQkJCSAgICBjbGllbnQgICAgIAlANDIKLQkJCSAgICBzdXBwbGllciAgIAlAMzAKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxMzU5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1Ci0JCQkJUGFyZW50X1ZpZXcgCUA0MwotCQkJCWxvY2F0aW9uICAgCSgxNjk0LCAxMzk4KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODg5NTQ2Ci0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NCIgQDQ2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MgotCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCSAgICBjbGllbnQgICAgIAlANDIKLQkJCSAgICBzdXBwbGllciAgIAlANDEKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODEsIDEzNTkpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDQ3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDk2MCwgMTY2NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ3Ci0JCQlsb2NhdGlvbiAgIAkoODEyLCAxNTM5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJICAgIHdpZHRoICAgICAgCTMxNAotCQkgICAgaGVpZ2h0ICAgICAJMjc0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDUiIEA0OAotCQkgICAgbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBANDkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Ci0JCQkgICAgbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MAotCQkJCVBhcmVudF9WaWV3IAlANDkKLQkJCQlsb2NhdGlvbiAgIAkoMTY0NSwgMTYxMikKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlT3V0cHV0IgotCQkJCXBjdERpc3QgICAgCTAuNjc0NzcyCi0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEQiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMxCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MQotCQkJCVBhcmVudF9WaWV3IAlANDkKLQkJCQlsb2NhdGlvbiAgIAkoMTY4MSwgMTY5NykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc5MDI3NAotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDYiIEA1MgotCQkJICAgIFBhcmVudF9WaWV3IAlANDgKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSIKLQkJCSAgICBjbGllbnQgICAgIAlANDgKLQkJCSAgICBzdXBwbGllciAgIAlANDcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxNjU0KSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEA1MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg5OTIsIDEwMDgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1MwotCQkJbG9jYXRpb24gICAJKDgxOSwgOTMxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJICAgIHdpZHRoICAgICAgCTM2NAotCQkgICAgaGVpZ2h0ICAgICAJMTc4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBREU0MDFEQyIKLQkJICAgIGNsaWVudCAgICAgCUA1MwotCQkgICAgc3VwcGxpZXIgICAJQDI1Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk2NiwgOTE5KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk2NiwgNjM2KSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEA1NQotCQkgICAgbG9jYXRpb24gICAJKDQ1NywgMTAyMikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYiIEA1NgotCQkJICAgIFBhcmVudF9WaWV3IAlANTUKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NwotCQkJCVBhcmVudF9WaWV3IAlANTYKLQkJCQlsb2NhdGlvbiAgIAkoMjM1LCA5MjApCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCSAgICBjbGllbnQgICAgIAlANTUKLQkJCSAgICBzdXBwbGllciAgIAlAMzIKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNDU3LCAxMDIyKQotCQkJCSgyNzYsIDEwMjIpCi0JCQkJKDI3NiwgODQ5KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NiwgODQ5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4Ci0JCQkJUGFyZW50X1ZpZXcgCUA1NgotCQkJCWxvY2F0aW9uICAgCSgzMzAsIDg4NCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPcGVyYXRpb25zIiBANTkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Ci0JCQkgICAgbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDUzMSwgOTc3KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTM4NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQlwY3REaXN0ICAgIAkwLjIxMTY5OQotCQkJCWhlaWdodCAgICAgCTQ2Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkJICAgIGNsaWVudCAgICAgCUA1NQotCQkJICAgIHN1cHBsaWVyICAgCUA1MwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEwLCAxMDIyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQotCQkJCWxvY2F0aW9uICAgCSg3NjksIDk4MCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjg4NDk1NgotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjIKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDcxNCwgMTA2NykKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjcyNzU2NAotCQkJCWhlaWdodCAgICAgCTQ1Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBANjMKLQkJICAgIGxvY2F0aW9uICAgCSgxNDE4LCAxMDQwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVENDI1MDM4QSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbiIgQDY0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSgtMzU4LCA0NjQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUKLQkJCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQkJbG9jYXRpb24gICAJKDE1MjAsIDEwNzkpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjI4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZU9wZXJhdGlvbiIKLQkJCQlwY3REaXN0ICAgIAkwLjQyMDYwMQotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkJICAgIHN1cHBsaWVyICAgCUA0MAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjMsIDEwNDApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYKLQkJCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQkJbG9jYXRpb24gICAJKDE1ODksIDEwMDUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42OTY3MjEKLQkJCQloZWlnaHQgICAgIAkzNgotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgiIEA2NwotCQkJICAgIFBhcmVudF9WaWV3IAlANjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NwotCQkJCWxvY2F0aW9uICAgCSgxMjczLCAxMDcwKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjU5NTQyMAotCQkJCWhlaWdodCAgICAgCTMwCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkZGIgotCQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkJICAgIHN1cHBsaWVyICAgCUA1MwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNzQsIDEwNDApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMyIgQDY5Ci0JCSAgICBsb2NhdGlvbiAgIAkoNzg3LCAxMTkwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBREYyRTY0MDFGNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdJbnB1dCIgQDcwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzgxLCA0NTQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEKLQkJCQlQYXJlbnRfVmlldyAJQDcwCi0JCQkJbG9jYXRpb24gICAJKDY2OSwgMTE1MikKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNzYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlQmluZGluZ0lucHV0IgotCQkJCXBjdERpc3QgICAgCTAuNTExOTA1Ci0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTEiCi0JCQkgICAgY2xpZW50ICAgICAJQDY5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQxCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDc4NywgMTE5MCkKLQkJCQkoNjM2LCAxMTkwKQotCQkJCSg2MzYsIDEyNzEpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyCi0JCQkJUGFyZW50X1ZpZXcgCUA3MAotCQkJCWxvY2F0aW9uICAgCSg2ODUsIDEyMjIpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC40NDA0NzYKLQkJCQloZWlnaHQgICAgIAkzMgotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0IiBANzMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY5Ci0JCQkgICAgbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NAotCQkJCVBhcmVudF9WaWV3IAlANzMKLQkJCQlsb2NhdGlvbiAgIAkoODg1LCAxMTQ0KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTIiCi0JCQkgICAgY2xpZW50ICAgICAJQDY5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDc4NywgMTE5MCkKLQkJCQkoOTI2LCAxMTkwKQotCQkJCSg5MjYsIDEwOTcpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI2LCAxMDk3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1Ci0JCQkJUGFyZW50X1ZpZXcgCUA3MwotCQkJCWxvY2F0aW9uICAgCSg4NzEsIDExMzYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44Mzc3NTgKLQkJCQloZWlnaHQgICAgIAk1NgotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEA3NgotCQkgICAgbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ091dHB1dCIgQDc3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NgotCQkJICAgIGxvY2F0aW9uICAgCSgtMTUwLCA1NzgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgKLQkJCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQkJbG9jYXRpb24gICAJKDEwMTIsIDE0MjkpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzA2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUJpbmRpbmdPdXRwdXQiCi0JCQkJcGN0RGlzdCAgICAJMC41NDUwODIKLQkJCQloZWlnaHQgICAgIAkxMwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRUI0MDEzQyIKLQkJCSAgICBjbGllbnQgICAgIAlANzYKLQkJCSAgICBzdXBwbGllciAgIAlANDcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NwotCQkJCWxvY2F0aW9uICAgCSg5NjcsIDE0NzkpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43NzQ1OTAKLQkJCQloZWlnaHQgICAgIAk1OAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2IiBAODAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Ci0JCQkgICAgbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MQotCQkJCVBhcmVudF9WaWV3IAlAODAKLQkJCQlsb2NhdGlvbiAgIAkoOTgzLCAxMTQwKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0QiCi0JCQkgICAgY2xpZW50ICAgICAJQDc2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MgotCQkJCVBhcmVudF9WaWV3IAlAODAKLQkJCQlsb2NhdGlvbiAgIAkoMTAzMSwgMTE4NikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjU5MDE2NAotCQkJCWhlaWdodCAgICAgCTcKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDgzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MjAsIDE5ODQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4MwotCQkJbG9jYXRpb24gICAJKDE3NzIsIDE5MDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmF1bHQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJICAgIHdpZHRoICAgICAgCTMxNAotCQkgICAgaGVpZ2h0ICAgICAJMTc4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDg0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNjAsIDE5ODQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4NAotCQkJbG9jYXRpb24gICAJKDEyMTIsIDE4NTkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCSAgICB3aWR0aCAgICAgIAkzMTQKLQkJICAgIGhlaWdodCAgICAgCTI3NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUU3MTAzMzMiCi0JCSAgICBjbGllbnQgICAgIAlAODQKLQkJICAgIHN1cHBsaWVyICAgCUAyOAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjAzLCAyMDA3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1MywgMjAwNykpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDg2Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTM1NiwgMTM1MikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzQwMDAzRTUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nRmF1bHRzIiBAODcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDg2Ci0JCQkgICAgbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4Ci0JCQkJUGFyZW50X1ZpZXcgCUA4NwotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCAxNzUwKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VCaW5kaW5nRmF1bHRzIgotCQkJCXBjdERpc3QgICAgCTAuODAzMTUwCi0JCQkJaGVpZ2h0ICAgICAJMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUEiCi0JCQkgICAgY2xpZW50ICAgICAJQDg2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDg0Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgMTg0NykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQotCQkJCVBhcmVudF9WaWV3IAlAODcKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOSwgMTc5NykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjg5OTE5NAotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAKLQkJCQlQYXJlbnRfVmlldyAJQDg3Ci0JCQkJbG9jYXRpb24gICAJKDEyNTYsIDE4MDYpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC45MTkyOTEKLQkJCQloZWlnaHQgICAgIAkxMDEKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNCIgQDkxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4NgotCQkJICAgIGxvY2F0aW9uICAgCSgxODgsIDYxNikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MgotCQkJCVBhcmVudF9WaWV3IAlAOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FCIgotCQkJICAgIGNsaWVudCAgICAgCUA4NgotCQkJICAgIHN1cHBsaWVyICAgCUA1MwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMzU2LCAxMzUyKQotCQkJCSgxMzU2LCAxMjE3KQotCQkJCSgxMTE3LCAxMjE3KQotCQkJCSgxMTE3LCAxMDk3KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxMDk3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQotCQkJCWxvY2F0aW9uICAgCSgxMTUyLCAxMTY0KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNjg3MDA4Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM1IiBAOTQKLQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCAxOTcwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA5MUY0MDJGMyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0IiBAOTUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Ci0JCQkgICAgbG9jYXRpb24gICAJKC0zNDQsIDgxOCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NgotCQkJCVBhcmVudF9WaWV3IAlAOTUKLQkJCQlsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlRmF1bHQiCi0JCQkJcGN0RGlzdCAgICAJMC4yNzY0MjMKLQkJCQloZWlnaHQgICAgIAk1NgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCSAgICBjbGllbnQgICAgIAlAOTQKLQkJCSAgICBzdXBwbGllciAgIAlAODMKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYzLCAxOTcwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NQotCQkJCWxvY2F0aW9uICAgCSgxNzE4LCAyMDEyKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNjQyMjc2Ci0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDk4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NAotCQkJICAgIGxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZGIgotCQkJICAgIGNsaWVudCAgICAgCUA5NAotCQkJICAgIHN1cHBsaWVyICAgCUA4NAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTcsIDE5NzApKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkgICAgY2xpZW50ICAgICAJQDQ3Ci0JCSAgICBzdXBwbGllciAgIAlAMjcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODAzLCAxNjU2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2NCwgMTY1NikpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTFCMDExMyIKLQkJICAgIGNsaWVudCAgICAgCUA0MQotCQkgICAgc3VwcGxpZXIgICAJQDI2Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ2NywgMTM4NSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNCBQb3J0VHlwZXMiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiCi0JICAgIHRpdGxlICAgICAgCSIyLjQgUG9ydFR5cGVzIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIgotCSAgICB6b29tICAgICAgIAk4MAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiIEAxMDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgMjA4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAxCi0JCQlsb2NhdGlvbiAgIAkoMTQ2LCAxNzIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNzAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwMQotCQkJbG9jYXRpb24gICAJKDE0NiwgMTIyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIKLQkJICAgIHdpZHRoICAgICAgCTcxOAotCQkgICAgaGVpZ2h0ICAgICAJMTk2Ci0JCSAgICBhbm5vdGF0aW9uIAk4KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iIEAxMDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE1NTIsIDIwOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwMgotCQkJbG9jYXRpb24gICAJKDExMTYsIDE3NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4NzMKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJT3BlcmF0aW9uIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwMgotCQkJbG9jYXRpb24gICAJKDExMTYsIDEyNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODczCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiCi0JCSAgICB3aWR0aCAgICAgIAk4OTEKLQkJICAgIGhlaWdodCAgICAgCTE4OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxMDMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMTQ3MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwMwotCQkJbG9jYXRpb24gICAJKDU1LCAxNDM3KQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYyNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklJbnB1dCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDMKLQkJCWxvY2F0aW9uICAgCSg1NSwgMTM4NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjI2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCSAgICB3aWR0aCAgICAgIAk2NDQKLQkJICAgIGhlaWdodCAgICAgCTE5NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTA0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzODQsIDE3OTIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDQKLQkJCWxvY2F0aW9uICAgCSg1NiwgMTc1NykKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2NTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJT3V0cHV0IikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwNAotCQkJbG9jYXRpb24gICAJKDU2LCAxNzA3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2NTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIKLQkJICAgIHdpZHRoICAgICAgCTY3NAotCQkgICAgaGVpZ2h0ICAgICAJMTk0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDEwNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAyMTEyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA1Ci0JCQlsb2NhdGlvbiAgIAkoNTUsIDIwNzYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjI2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUZhdWx0IikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwNQotCQkJbG9jYXRpb24gICAJKDU1LCAyMDI2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIKLQkJICAgIHdpZHRoICAgICAgCTY0NAotCQkgICAgaGVpZ2h0ICAgICAJMTk2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTA2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDgwMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwNgotCQkJbG9jYXRpb24gICAJKDE1OCwgNjcyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY3NwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCSAgICB3aWR0aCAgICAgIAk2OTUKLQkJICAgIGhlaWdodCAgICAgCTI4MQotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMTA3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTc2LCA4MDApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDcKLQkJCWxvY2F0aW9uICAgCSgyMzI1LCA2OTIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTAyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgd2lkdGggICAgICAJNTIwCi0JCSAgICBoZWlnaHQgICAgIAkyNDAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3MjgsIDIxMTIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDgKLQkJCWxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE2MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkZhdWx0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAxMDkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDkKLQkJCWxvY2F0aW9uICAgCSg4NzAsIDE0MjIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJICAgIHdpZHRoICAgICAgCTM5MAotCQkgICAgaGVpZ2h0ICAgICAJMTI1Ci0JCSAgICBhbm5vdGF0aW9uIAk4KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDExMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM2MCwgMTc5MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExMAotCQkJbG9jYXRpb24gICAJKDEyMzIsIDE3NDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjU2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiT3V0cHV0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCSAgICB3aWR0aCAgICAgIAkyNzQKLQkJICAgIGhlaWdodCAgICAgCTEyNQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEAxMTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE1NTIsIDc4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExMQotCQkJbG9jYXRpb24gICAJKDEyMTQsIDYyMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2NzcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJICAgIHdpZHRoICAgICAgCTY5NQotCQkgICAgaGVpZ2h0ICAgICAJMzUyCi0JCSAgICBhbm5vdGF0aW9uIAk4KQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDExMgotCQkgICAgbG9jYXRpb24gICAJKDEwMjQsIDc5NykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgyNDAxOEMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTEzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTIKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTkyLCAyNjkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQlsb2NhdGlvbiAgIAkoMTA4OCwgNzQ4KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VPcGVyYXRpb25zIgotCQkJCXBjdERpc3QgICAgCTAuMzU5NjQ5Ci0JCQkJaGVpZ2h0ICAgICAJNTAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQ0QiCi0JCQkgICAgY2xpZW50ICAgICAJQDExMgotCQkJICAgIHN1cHBsaWVyICAgCUAxMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDUsIDc5NykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUKLQkJCQlQYXJlbnRfVmlldyAJQDExMwotCQkJCWxvY2F0aW9uICAgCSgxMTc2LCA4NjEpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC44NDAzOTEKLQkJCQloZWlnaHQgICAgIAk2NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNgotCQkJCVBhcmVudF9WaWV3IAlAMTEzCi0JCQkJbG9jYXRpb24gICAJKDEwNzQsIDkyMykKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjI3NjI0MwotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgInBvcnRUeXBlIiBAMTE3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTIKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTkyLCAyNjkpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MjcwMUMzIgotCQkJICAgIGNsaWVudCAgICAgCUAxMTIKLQkJCSAgICBzdXBwbGllciAgIAlAMTA2Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDc5NykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgKLQkJCQlQYXJlbnRfVmlldyAJQDExNwotCQkJCWxvY2F0aW9uICAgCSg4ODgsIDc1NykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc1MzQ4OAotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MSIgQDExOQotCQkgICAgbG9jYXRpb24gICAJKDIxMDcsIDc3MykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUVBNDEyRjAwMzUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVQYXJhbWV0ZXJPcmRlcmluZyIgQDEyMAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5Ci0JCQkgICAgbG9jYXRpb24gICAJKDE4MTksIDEwMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEKLQkJCQlQYXJlbnRfVmlldyAJQDEyMAotCQkJCWxvY2F0aW9uICAgCSgyMTQ1LCA2NDcpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzk2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXBjdERpc3QgICAgCTAuMTgzMzMzCi0JCQkJaGVpZ2h0ICAgICAJMTI3Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjU1IgotCQkJICAgIGNsaWVudCAgICAgCUAxMTkKLQkJCSAgICBzdXBwbGllciAgIAlAMTA3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzE2LCA3NzMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjAKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgODIyKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuNzk2NjEwCi0JCQkJaGVpZ2h0ICAgICAJNDkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMKLQkJCQlQYXJlbnRfVmlldyAJQDEyMAotCQkJCWxvY2F0aW9uICAgCSgyMTcxLCA4ODgpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTY0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC4zMDYyMjAKLQkJCQloZWlnaHQgICAgIAkxMTUKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDEyNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5Ci0JCQkgICAgbG9jYXRpb24gICAJKDE4MTksIDEwMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNUYiCi0JCQkgICAgY2xpZW50ICAgICAJQDExOQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTksIDc3MykpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTI1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTcwMiwgMTUwNCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzMxNjAxQTQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVGYXVsdHMiIEAxMjYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjYKLQkJCQlsb2NhdGlvbiAgIAkoMTgxNSwgMTk4MikKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlRmF1bHRzIgotCQkJCXBjdERpc3QgICAgCTAuODc4OTkyCi0JCQkJaGVpZ2h0ICAgICAJMTEzCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg3IgotCQkJICAgIGNsaWVudCAgICAgCUAxMjUKLQkJCSAgICBzdXBwbGllciAgIAlAMTA4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgMjA0OCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgKLQkJCQlQYXJlbnRfVmlldyAJQDEyNgotCQkJCWxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuOTQ5NTgwCi0JCQkJaGVpZ2h0ICAgICAJNTkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkKLQkJCQlQYXJlbnRfVmlldyAJQDEyNgotCQkJCWxvY2F0aW9uICAgCSgxNTkzLCAxOTYzKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuODQ1Mzc4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzIiIEAxMzAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzAKLQkJCQlsb2NhdGlvbiAgIAkoMTY2MSwgMTA2OSkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg4IgotCQkJICAgIGNsaWVudCAgICAgCUAxMjUKLQkJCSAgICBzdXBwbGllciAgIAlAMTExCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMgotCQkJCVBhcmVudF9WaWV3IAlAMTMwCi0JCQkJbG9jYXRpb24gICAJKDE4MjEsIDEwMzkpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44NTczNjIKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3IiBAMTMzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE3OCwgMTIzNCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkY5NDAyNEQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDEzNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzCi0JCQkgICAgbG9jYXRpb24gICAJKDg5MCwgNTYyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNQotCQkJCVBhcmVudF9WaWV3IAlAMTM0Ci0JCQkJbG9jYXRpb24gICAJKDg3OCwgMTM0MykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxMzIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlSW5wdXQiCi0JCQkJcGN0RGlzdCAgICAJMC44MTk4MjAKLQkJCQloZWlnaHQgICAgIAkxMDMKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMDkKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTE3OCwgMTIzNCkKLQkJCQkoOTgwLCAxMjM0KQotCQkJCSg5ODAsIDE0MTApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYKLQkJCQlQYXJlbnRfVmlldyAJQDEzNAotCQkJCWxvY2F0aW9uICAgCSgxMDQ2LCAxMzY0KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODc3NjYwCi0JCQkJaGVpZ2h0ICAgICAJNjYKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOCIgQDEzNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzCi0JCQkgICAgbG9jYXRpb24gICAJKDg5MCwgNTYyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOAotCQkJCVBhcmVudF9WaWV3IAlAMTM3Ci0JCQkJbG9jYXRpb24gICAJKDEyMzYsIDEwMzYpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRjk1MDE5QSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMzCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMTc4LCAxMjM0KQotCQkJCSgxMjc3LCAxMjM0KQotCQkJCSgxMjc3LCA5NjApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzcsIDk2MCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkKLQkJCQlQYXJlbnRfVmlldyAJQDEzNwotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCAxMDU4KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNzM2NDEzCi0JCQkJaGVpZ2h0ICAgICAJODEKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5IiBAMTQwCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEAxNDEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MAotCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA2NzMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDEKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MiwgMTY2OSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlT3V0cHV0IgotCQkJCXBjdERpc3QgICAgCTAuODQwOTA5Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBBIgotCQkJICAgIGNsaWVudCAgICAgCUAxNDAKLQkJCSAgICBzdXBwbGllciAgIAlAMTEwCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMKLQkJCQlQYXJlbnRfVmlldyAJQDE0MQotCQkJCWxvY2F0aW9uICAgCSgxNTQ2LCAxNjc2KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODYzNjM2Ci0JCQkJaGVpZ2h0ICAgICAJNzgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMCIgQDE0NAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwCi0JCQkgICAgbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUKLQkJCQlQYXJlbnRfVmlldyAJQDE0NAotCQkJCWxvY2F0aW9uICAgCSgxNDI3LCAxMDM3KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEIiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0MAotCQkJICAgIHN1cHBsaWVyICAgCUAxMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNDQKLQkJCQlsb2NhdGlvbiAgIAkoMTUyMywgMTA4MCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY5MDM0MQotCQkJCWhlaWdodCAgICAgCTU1Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYxRkQ4MDE5RiIKLQkJICAgIGNsaWVudCAgICAgCUAxMDYKLQkJICAgIHN1cHBsaWVyICAgCUAxMDEKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYxRkUyMDE3MSIKLQkJICAgIGNsaWVudCAgICAgCUAxMTEKLQkJICAgIHN1cHBsaWVyICAgCUAxMDIKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYxRkVFMDMxRCIKLQkJICAgIGNsaWVudCAgICAgCUAxMDkKLQkJICAgIHN1cHBsaWVyICAgCUAxMDMKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYxRkY4MDFDRCIKLQkJICAgIGNsaWVudCAgICAgCUAxMTAKLQkJICAgIHN1cHBsaWVyICAgCUAxMDQKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJICAgIGNsaWVudCAgICAgCUAxMDgKLQkJICAgIHN1cHBsaWVyICAgCUAxMDUKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE1MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIyNCwgMTQ1NikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1MgotCQkJbG9jYXRpb24gICAJKDE5MzcsIDEzMTIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTc1Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkgICAgd2lkdGggICAgICAJNTkzCi0JCSAgICBoZWlnaHQgICAgIAkzMTIKLQkJICAgIGFubm90YXRpb24gCTgpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIgQDE1MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMjU0NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1MwotCQkJbG9jYXRpb24gICAJKDExOTMsIDI0NjYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjU0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIgotCQkgICAgd2lkdGggICAgICAJNjcyCi0JCSAgICBoZWlnaHQgICAgIAkxODAKLQkJICAgIGFubm90YXRpb24gCTgpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNTQKLQkJICAgIGxvY2F0aW9uICAgCSgxNTI0LCAyMjc1KQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUAxNTMKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDE1MjQsIDIyNzUpCi0JCQkoMTUyNCwgMjQ1NCkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzIzRDAzMTkiCi0JCSAgICBjbGllbnQgICAgIAlAMTA4Ci0JCSAgICBzdXBwbGllciAgIAlAMTUzCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NzYsIDIxNzYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NiwgMjI3NSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDE1NCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcyMzUwMEREIgotCQkgICAgY2xpZW50ICAgICAJQDExMAotCQkgICAgc3VwcGxpZXIgICAJQDE1MwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzcxLCAxODU0KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDIyNzUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNTQpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJICAgIGNsaWVudCAgICAgCUAxMDkKLQkJICAgIHN1cHBsaWVyICAgCUAxNTMKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTgwLCAxNTM0KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMjI3NSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDE1NCkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYxIiBAMTU4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjIwNiwgMjI1OSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjc0RTc4NDAxQjEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMTU5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MAotCQkJCVBhcmVudF9WaWV3IAlAMTU5Ci0JCQkJbG9jYXRpb24gICAJKDIwNjgsIDE2NzApCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjE2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZU1lc3NhZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC45MTIyMzAKLQkJCQloZWlnaHQgICAgIAkxMzkKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMEYiCi0JCQkgICAgY2xpZW50ICAgICAJQDE1OAotCQkJICAgIHN1cHBsaWVyICAgCUAxNTIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MQotCQkJCVBhcmVudF9WaWV3IAlAMTU5Ci0JCQkJbG9jYXRpb24gICAJKDIyNjAsIDE2NzgpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMTYyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGNzRFNzg2MDAyMyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTU4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE1MwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMjA2LCAyMjU5KQotCQkJCSgyMjA2LCAyNTU2KQotCQkJCSgxODU2LCAyNTU2KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU2LCAyNTU2KSkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMSBEZWZpbml0aW9ucyIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVFNDhBMDI2MiIKLQkgICAgdGl0bGUgICAgICAJIjIuMSBEZWZpbml0aW9ucyIKLQkgICAgem9vbSAgICAgICAJODMKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAxNjMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQzMiwgMTkyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTYzCi0JCQlsb2NhdGlvbiAgIAkoODgsIDE2MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2ODgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJRGVmaW5pdGlvbiIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjMKLQkJCWxvY2F0aW9uICAgCSg4OCwgMTExKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2ODgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkJICAgIHdpZHRoICAgICAgCTcwNgotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMTY0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCA5NDQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjQKLQkJCWxvY2F0aW9uICAgCSgxNjg2LCA4OTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjc2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiVHlwZXMiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJICAgIHdpZHRoICAgICAgCTI5NAotCQkgICAgaGVpZ2h0ICAgICAJMTIwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDE2NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE0NCwgNjI0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQlsb2NhdGlvbiAgIAkoMTkxMCwgNTQ1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkltcG9ydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkgICAgd2lkdGggICAgICAJNDg2Ci0JCSAgICBoZWlnaHQgICAgIAkxODIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE2NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjExMiwgMTE4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NgotCQkJbG9jYXRpb24gICAJKDE5MDAsIDEwNTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDI0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkgICAgd2lkdGggICAgICAJNDQyCi0JCSAgICBoZWlnaHQgICAgIAkyODAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxNjcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDE0ODgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjcKLQkJCWxvY2F0aW9uICAgCSgxNTk2LCAxMzYwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQyNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCSAgICB3aWR0aCAgICAgIAk0NDIKLQkJICAgIGhlaWdodCAgICAgCTI4MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMTY4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMzM2LCAxNzI4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY4Ci0JCQlsb2NhdGlvbiAgIAkoMjEyNCwgMTYwMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCSAgICB3aWR0aCAgICAgIAk0NDIKLQkJICAgIGhlaWdodCAgICAgCTI4MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMTY5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDI0MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2OQotCQkJbG9jYXRpb24gICAJKDEwNzMsIDM5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUxMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJICAgIHdpZHRoICAgICAgCTUyOAotCQkgICAgaGVpZ2h0ICAgICAJNDI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAxNzAKLQkJICAgIGxvY2F0aW9uICAgCSgxMzU4LCA4NjApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDE3MQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwCi0JCQkgICAgbG9jYXRpb24gICAJKDYyLCAtMzYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzEKLQkJCQlsb2NhdGlvbiAgIAkoMTMxNywgNTM1KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDE3MAotCQkJICAgIHN1cHBsaWVyICAgCUAxNjkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTgsIDQ1MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzMKLQkJCQlQYXJlbnRfVmlldyAJQDE3MQotCQkJCWxvY2F0aW9uICAgCSgxNDAzLCA1MTEpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44NTY2NDkKLQkJCQloZWlnaHQgICAgIAk0NQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDE3NAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwCi0JCQkgICAgbG9jYXRpb24gICAJKDYyLCAtMzYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNzQKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NiwgOTA5KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VUeXBlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjc3OTA5NwotCQkJCWhlaWdodCAgICAgCTQwCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIgotCQkJICAgIGNsaWVudCAgICAgCUAxNzAKLQkJCSAgICBzdXBwbGllciAgIAlAMTY0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEzNTgsIDg2MCkKLQkJCQkoMTM1OCwgOTQ4KQotCQkJCSgxNjc3LCA5NDgpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NywgOTQ4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NgotCQkJCVBhcmVudF9WaWV3IAlAMTc0Ci0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDk4NykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5MjY1NQotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDE3NwotCQkgICAgbG9jYXRpb24gICAJKDE2MTIsIDU5NSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMTc4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzcKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIsIDIyNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzkKLQkJCQlQYXJlbnRfVmlldyAJQDE3OAotCQkJCWxvY2F0aW9uICAgCSgxNDIzLCA1MTIpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTc3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNjEyLCA1OTUpCi0JCQkJKDE0NjQsIDU5NSkKLQkJCQkoMTQ2NCwgNDUzKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjQsIDQ1MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODAKLQkJCQlQYXJlbnRfVmlldyAJQDE3OAotCQkJCWxvY2F0aW9uICAgCSgxNTI0LCA0OTUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44NTg2NjcKLQkJCQloZWlnaHQgICAgIAk2MAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMTgxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzcKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIsIDIyNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODIKLQkJCQlQYXJlbnRfVmlldyAJQDE4MQotCQkJCWxvY2F0aW9uICAgCSgxNjkyLCA1NTcpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjA0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUltcG9ydHMiCi0JCQkJcGN0RGlzdCAgICAJMC4yODAzMzUKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTc3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE2NQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMSwgNTk1KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MwotCQkJCVBhcmVudF9WaWV3IAlAMTgxCi0JCQkJbG9jYXRpb24gICAJKDE4NTQsIDY1MikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjg0MTAwNAotCQkJCWhlaWdodCAgICAgCTU3Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg0Ci0JCQkJUGFyZW50X1ZpZXcgCUAxODEKLQkJCQlsb2NhdGlvbiAgIAkoMTY3NiwgNjQ2KQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuMjI1OTQxCi0JCQkJaGVpZ2h0ICAgICAJNTEKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzIiBAMTg1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTI3OSwgMTEzNykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTYwMzAxRTIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTg2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxODUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcxLCAyNzMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxODYKLQkJCQlsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQjciCi0JCQkgICAgY2xpZW50ICAgICAJQDE4NQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc5LCA0NTMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxODYKLQkJCQlsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODA0OTc0Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZXMiIEAxODkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzEsIDI3MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTAKLQkJCQlQYXJlbnRfVmlldyAJQDE4OQotCQkJCWxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjY0MzEzNwotCQkJCWhlaWdodCAgICAgCTM4Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJICAgIGNsaWVudCAgICAgCUAxODUKLQkJCSAgICBzdXBwbGllciAgIAlAMTY2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEyNzksIDExMzcpCi0JCQkJKDEyNzksIDEyMDgpCi0JCQkJKDE4OTEsIDEyMDgpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkxCi0JCQkJUGFyZW50X1ZpZXcgCUAxODkKLQkJCQlsb2NhdGlvbiAgIAkoMTgyMSwgMTE3MSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjg5OTM0NgotCQkJCWhlaWdodCAgICAgCTM4Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkyCi0JCQkJUGFyZW50X1ZpZXcgCUAxODkKLQkJCQlsb2NhdGlvbiAgIAkoMTc5NywgMTI0NCkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjg2NDQwNwotCQkJCWhlaWdodCAgICAgCTM2Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDE5MwotCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDExNTkpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU2NzEwMTA0IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDE5NAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTkzCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMjQsIDIxNSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTUKLQkJCQlQYXJlbnRfVmlldyAJQDE5NAotCQkJCWxvY2F0aW9uICAgCSgxMTcxLCA1OTQpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjcyMDM0QSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTkzCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTYKLQkJCQlQYXJlbnRfVmlldyAJQDE5NAotCQkJCWxvY2F0aW9uICAgCSgxMjUxLCA2MjQpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43NTc5NjIKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZXMiIEAxOTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5MwotCQkJICAgIGxvY2F0aW9uICAgCSgtMzI0LCAyMTUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxOTcKLQkJCQlsb2NhdGlvbiAgIAkoMTM5MSwgMTQ1MSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlUG9ydFR5cGVzIgotCQkJCXBjdERpc3QgICAgCTAuNzIzNjk4Ci0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNTQiCi0JCQkgICAgY2xpZW50ICAgICAJQDE5MwotCQkJICAgIHN1cHBsaWVyICAgCUAxNjcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTIxMiwgMTE1OSkKLQkJCQkoMTIxMiwgMTQ5MCkKLQkJCQkoMTU4NywgMTQ5MCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4NywgMTQ5MCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTkKLQkJCQlQYXJlbnRfVmlldyAJQDE5NwotCQkJCWxvY2F0aW9uICAgCSgxNTMzLCAxNDUxKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuOTI1NjExCi0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDAKLQkJCQlQYXJlbnRfVmlldyAJQDE5NwotCQkJCWxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuODk1ODU1Ci0JCQkJaGVpZ2h0ICAgICAJNTAKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3IiBAMjAxCi0JCSAgICBsb2NhdGlvbiAgIAkoMTExNCwgMTU4NSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBAMjAyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMwotCQkJCVBhcmVudF9WaWV3IAlAMjAyCi0JCQkJbG9jYXRpb24gICAJKDEwNzMsIDY4MCkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2NzgwMzcxIgotCQkJICAgIGNsaWVudCAgICAgCUAyMDEKLQkJCSAgICBzdXBwbGllciAgIAlAMTY5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNCwgNDUzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNAotCQkJCVBhcmVudF9WaWV3IAlAMjAyCi0JCQkJbG9jYXRpb24gICAJKDExNTUsIDc1MikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjczNjcwNAotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdzIiBAMjA1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNgotCQkJCVBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJbG9jYXRpb24gICAJKDE4NTEsIDE2NzQpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjA0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUJpbmRpbmdzIgotCQkJCXBjdERpc3QgICAgCTAuNzY2MzQ3Ci0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzN0IiCi0JCQkgICAgY2xpZW50ICAgICAJQDIwMQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjgKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTExNCwgMTU4NSkKLQkJCQkoMTExNCwgMTcxNikKLQkJCQkoMjExNSwgMTcxNikpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgMTcxNikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDcKLQkJCQlQYXJlbnRfVmlldyAJQDIwNQotCQkJCWxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuOTQ1MDc0Ci0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDgKLQkJCQlQYXJlbnRfVmlldyAJQDIwNQotCQkJCWxvY2F0aW9uICAgCSgyMDE0LCAxNzU0KQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuOTExMDcyCi0JCQkJaGVpZ2h0ICAgICAJMzgKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjA5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjA5Ci0JCQlsb2NhdGlvbiAgIAkoMTYyOCwgMTkyMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCSAgICB3aWR0aCAgICAgIAk0NDIKLQkJICAgIGhlaWdodCAgICAgCTI4MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjEwCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA2NiwgMTUzMykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3QjAzMTEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwIiBAMjExCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTAKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTIKLQkJCQlQYXJlbnRfVmlldyAJQDIxMQotCQkJCWxvY2F0aW9uICAgCSgxMDI1LCA2NjkpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJCSAgICBjbGllbnQgICAgIAlAMjEwCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTMKLQkJCQlQYXJlbnRfVmlldyAJQDIxMQotCQkJCWxvY2F0aW9uICAgCSgxMTA5LCA3NTYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43MTk2OTcKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVTZXJ2aWNlcyIgQDIxNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjEwCi0JCQkgICAgbG9jYXRpb24gICAJKC01MjEsIC0xMTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTM5MywgMjAyOCkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlU2VydmljZXMiCi0JCQkJcGN0RGlzdCAgICAJMC43OTE4MjQKLQkJCQloZWlnaHQgICAgIAkzMgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjdEMDA4OSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjEwCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwOQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMDY2LCAxNTMzKQotCQkJCSgxMDY2LCAyMDU5KQotCQkJCSgxNjE5LCAyMDU5KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE5LCAyMDU5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNgotCQkJCVBhcmVudF9WaWV3IAlAMjE0Ci0JCQkJbG9jYXRpb24gICAJKDE1NTQsIDIwMzEpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC45NDAxOTcKLQkJCQloZWlnaHQgICAgIAkyOQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNwotCQkJCVBhcmVudF9WaWV3IAlAMjE0Ci0JCQkJbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC45MjA1MTUKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMTgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjFGODAzODIiCi0JCSAgICBjbGllbnQgICAgIAlAMTY5Ci0JCSAgICBzdXBwbGllciAgIAlAMTYzCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDI2MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODUsIDI2MykpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkgICAgcXVpZCAgICAgICAJIjNBRDYwQzUxMDE5MiIKLQkgICAgdGl0bGUgICAgICAJIjIuMS4zIEV4dGVuc2liaWxpdHkiCi0JICAgIHpvb20gICAgICAgCTgwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAyMTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjE5Ci0JCQlsb2NhdGlvbiAgIAkoNDk0LCAxNTMxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJICAgIHdpZHRoICAgICAgCTE4MgotCQkgICAgaGVpZ2h0ICAgICAJMTMwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAyMjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgMTg4OCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyMAotCQkJbG9jYXRpb24gICAJKDE0ODcsIDE4MzYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUG9ydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMjEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMTcyOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyMQotCQkJbG9jYXRpb24gICAJKDEzNDIsIDE2NzUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkgICAgd2lkdGggICAgICAJMTgyCi0JCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjIyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyMTYsIDIzMzYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMjIKLQkJCWxvY2F0aW9uICAgCSgxMDg4LCAyMjgzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI1NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkgICAgd2lkdGggICAgICAJMjc0Ci0JCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDIyMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg3MzYsIDE3NjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMjMKLQkJCWxvY2F0aW9uICAgCSg1NjMsIDE3MDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQ2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkgICAgd2lkdGggICAgICAJMzY0Ci0JCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjI0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODg4LCAxNjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMjQKLQkJCWxvY2F0aW9uICAgCSgxNDk1LCAxMzYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNzg2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyNAotCQkJbG9jYXRpb24gICAJKDE0OTUsIDg2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3ODYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIKLQkJICAgIHdpZHRoICAgICAgCTgwNAotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDIyNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDE5NTIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMjUKLQkJCWxvY2F0aW9uICAgCSg4MDAsIDE4OTkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjU2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCSAgICB3aWR0aCAgICAgIAkyNzQKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBAMjI2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDIxNDQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMjYKLQkJCWxvY2F0aW9uICAgCSg4NjMsIDIwOTEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjkwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkgICAgd2lkdGggICAgICAJMzA4Ci0JCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDIyNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDEyOTYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMjcKLQkJCWxvY2F0aW9uICAgCSg3NCwgMTIzNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCSAgICB3aWR0aCAgICAgIAkyMjIKLQkJICAgIGhlaWdodCAgICAgCTE0NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDIyOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0MTYsIDE0MDgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMjgKLQkJCWxvY2F0aW9uICAgCSgzMzUsIDEzNTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiVHlwZXMiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDIyOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyOQotCQkJbG9jYXRpb24gICAJKDIwOSwgNTgwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU0MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCSAgICB3aWR0aCAgICAgIAk1NjAKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDIzMAotCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgMTAzOSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMjI5Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSg0ODAsIDEwMzkpCi0JCQkoNDgwLCA4MDgpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkgICAgY2xpZW50ICAgICAJQDIyMAotCQkgICAgc3VwcGxpZXIgICAJQDIyOQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY2LCAxODI0KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjYsIDEwMzkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzMgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODVCNUE0MDI3RSIKLQkJICAgIGNsaWVudCAgICAgCUAyMjYKLQkJICAgIHN1cHBsaWVyICAgCUAyMjkKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA5NywgMjA3OSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk3LCAxMDM5KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzMKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOTM4NjAyQzkiCi0JCSAgICBjbGllbnQgICAgIAlAMjIyCi0JCSAgICBzdXBwbGllciAgIAlAMjI5Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTksIDIyNzEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxOSwgMTAzOSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDIzMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIgotCQkgICAgY2xpZW50ICAgICAJQDIyNQotCQkgICAgc3VwcGxpZXIgICAJQDIyOQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODgsIDE4ODcpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg4LCAxMDM5KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MDA5MjAyRjciCi0JCSAgICBjbGllbnQgICAgIAlAMjIzCi0JCSAgICBzdXBwbGllciAgIAlAMjI5Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc5NywgMTY5NSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTcsIDEwMzkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQTBGMDJGMCIKLQkJICAgIGNsaWVudCAgICAgCUAyMTkKLQkJICAgIHN1cHBsaWVyICAgCUAyMjkKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjAxLCAxNTE5KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwMSwgMTAzOSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDIzMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkgICAgY2xpZW50ICAgICAJQDIyNwotCQkgICAgc3VwcGxpZXIgICAJQDIyOQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTEsIDEyMjMpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExLCAxMDM5KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiCi0JCSAgICBjbGllbnQgICAgIAlAMjI4Ci0JCSAgICBzdXBwbGllciAgIAlAMjI5Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQxNCwgMTM0NCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEwMzkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJICAgIGNsaWVudCAgICAgCUAyMjEKLQkJICAgIHN1cHBsaWVyICAgCUAyMjkKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTY2MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI5LCAxMDM5KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjQwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDY4OCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI0MAotCQkJbG9jYXRpb24gICAJKDE2MzIsIDU4MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1NDUKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkgICAgd2lkdGggICAgICAJNTYzCi0JCSAgICBoZWlnaHQgICAgIAkyMzQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDI0MQotCQkgICAgbG9jYXRpb24gICAJKDExOTEsIDY3MikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjQyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjMsIDU2MCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMKLQkJCQlQYXJlbnRfVmlldyAJQDI0MgotCQkJCWxvY2F0aW9uICAgCSg4NDcsIDYzMSkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJICAgIGNsaWVudCAgICAgCUAyNDEKLQkJCSAgICBzdXBwbGllciAgIAlAMjI5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjAsIDY3MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQKLQkJCQlQYXJlbnRfVmlldyAJQDI0MgotCQkJCWxvY2F0aW9uICAgCSg4MzAsIDYyOCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjgzOTY5NQotCQkJCWhlaWdodCAgICAgCTQ1Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI0NQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQxCi0JCQkgICAgbG9jYXRpb24gICAJKDIzLCA1NjApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNDUKLQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTIyKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcGN0RGlzdCAgICAJMC4zNzkwNzAKLQkJCQloZWlnaHQgICAgIAkxNTEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDI0MQotCQkJICAgIHN1cHBsaWVyICAgCUAyNDAKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDcKLQkJCQlQYXJlbnRfVmlldyAJQDI0NQotCQkJCWxvY2F0aW9uICAgCSgxNDk2LCA2MjcpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC43MDk0MDIKLQkJCQloZWlnaHQgICAgIAk0NgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OAotCQkJCVBhcmVudF9WaWV3IAlAMjQ1Ci0JCQkJbG9jYXRpb24gICAJKDE0NjMsIDc2NCkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjYzMjQ3OQotCQkJCWhlaWdodCAgICAgCTkyCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiIEAyNDkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAwOCwgMTkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlpdGFsaWNzICAgIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjQ5Ci0JCQlsb2NhdGlvbiAgIAkoNjMwLCA4NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3NTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJXU0RMRWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIgotCQkgICAgd2lkdGggICAgICAJNzc0Ci0JCSAgICBoZWlnaHQgICAgIAkyNDAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNTAKLQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCA0MDIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDI0OQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTAwOCwgNDAyKQotCQkJKDEwMDgsIDMxMikpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkUzQzAzRDQiCi0JCSAgICBjbGllbnQgICAgIAlAMjI5Ci0JCSAgICBzdXBwbGllciAgIAlAMjQ5Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ5MiwgNTY4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ5MiwgNDAyKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjUwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTIKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjE0OTAzRDAiCi0JCSAgICBjbGllbnQgICAgIAlAMjQwCi0JCSAgICBzdXBwbGllciAgIAlAMjI0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMTUsIDU3MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE1LCAyNDYpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTMKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCSAgICBjbGllbnQgICAgIAlAMjQwCi0JCSAgICBzdXBwbGllciAgIAlAMjQ5Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDU3MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYyLCA0MDIpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjU0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIwMTYsIDEzNjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNTQKLQkJCWxvY2F0aW9uICAgCSgxNzMxLCAxMzA3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU3MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkgICAgd2lkdGggICAgICAJNTg4Ci0JCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1NQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDQjI0QUVDMDFDQiIKLQkJICAgIGNsaWVudCAgICAgCUAyNTQKLQkJICAgIHN1cHBsaWVyICAgCUAyNDAKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc5NiwgMTI5NSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjMiIEAyNTYKLQkJICAgIGxvY2F0aW9uICAgCSgyMzExLCAxNjg2KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicGFyZW50IiBAMjU3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNTYKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5LCAyOTQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU4Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNTcKLQkJCQlsb2NhdGlvbiAgIAkoMjQyMiwgMTMzMykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwYXJlbnQiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCSAgICBjbGllbnQgICAgIAlAMjU2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI1NAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMzExLCAxNjg2KQotCQkJCSgyNDMyLCAxNjg2KQotCQkJCSgyNDMyLCAxMzc0KQotCQkJCSgyMzEwLCAxMzc0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzEwLCAxMzc0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1OQotCQkJCVBhcmVudF9WaWV3IAlAMjU3Ci0JCQkJbG9jYXRpb24gICAJKDIzNjYsIDE0MjgpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImNoaWxkcmVuIiBAMjYwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNTYKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5LCAyOTQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYxCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQlsb2NhdGlvbiAgIAkoMTg5OSwgMTUzNykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitjaGlsZHJlbiIKLQkJCQlwY3REaXN0ICAgIAkwLjc5ODU2MQotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQyIKLQkJCSAgICBjbGllbnQgICAgIAlAMjU2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI1NAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMzExLCAxNjg2KQotCQkJCSgyMDE2LCAxNjg2KQotCQkJCSgyMDE2LCAxNDI1KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE2LCAxNDI1KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MgotCQkJCVBhcmVudF9WaWV3IAlAMjYwCi0JCQkJbG9jYXRpb24gICAJKDIwNzAsIDE0ODEpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyIKLQkgICAgcXVpZCAgICAgICAJIjNBRThFRDcyMDFCRCIKLQkgICAgdGl0bGUgICAgICAJIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyIKLQkgICAgem9vbSAgICAgICAJOTAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIgQDI2MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzEyLCAyMjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNjMKLQkJCWxvY2F0aW9uICAgCSgxNDIyLCAxNzcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTgwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUltcG9ydCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNjMKLQkJCWxvY2F0aW9uICAgCSgxNDIyLCAxMjcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU4MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkgICAgd2lkdGggICAgICAJNTk4Ci0JCSAgICBoZWlnaHQgICAgIAkyMTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMjY0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQzMiwgMTEzNikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI2NAotCQkJbG9jYXRpb24gICAJKDIwMiwgMTA0MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NjEKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJOYW1lc3BhY2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJICAgIHdpZHRoICAgICAgCTQ3OQotCQkgICAgaGVpZ2h0ICAgICAJMjE1Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMjY1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDEyMTYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNjUKLQkJCWxvY2F0aW9uICAgCSgxMjk0LCAxMTQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY3NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkgICAgd2lkdGggICAgICAJNjk0Ci0JCSAgICBoZWlnaHQgICAgIAkxNzMKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI2NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0MDAsIDM4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI2NgotCQkJbG9jYXRpb24gICAJKDE2NCwgMjM2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJICAgIHdpZHRoICAgICAgCTQ5MAotCQkgICAgaGVpZ2h0ICAgICAJMzIwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzciIEAyNjcKLQkJICAgIGxvY2F0aW9uICAgCSgzMDksIDc4NikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0Q1NTAwMkQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVOYW1lc3BhY2VzIiBAMjY4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNjcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTkxLCAyNTgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjY5Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQlsb2NhdGlvbiAgIAkoNDYxLCA5NTYpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjg4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZU5hbWVzcGFjZXMiCi0JCQkJcGN0RGlzdCAgICAJMC42OTg4NDIKLQkJCQloZWlnaHQgICAgIAkxNTIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMzIiCi0JCQkgICAgY2xpZW50ICAgICAJQDI2NwotCQkJICAgIHN1cHBsaWVyICAgCUAyNjQKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCAxMDI5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MAotCQkJCVBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJbG9jYXRpb24gICAJKDI0OCwgOTczKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuNzY4NzA3Ci0JCQkJaGVpZ2h0ICAgICAJNjIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzEKLQkJCQlQYXJlbnRfVmlldyAJQDI2OAotCQkJCWxvY2F0aW9uICAgCSgyMjgsIDkxMykKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjUyNTA5NwotCQkJCWhlaWdodCAgICAgCTgyCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzgiIEAyNzIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NwotCQkJICAgIGxvY2F0aW9uICAgCSgtOTEsIDI1OCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzMKLQkJCQlQYXJlbnRfVmlldyAJQDI3MgotCQkJCWxvY2F0aW9uICAgCSgyNjgsIDU5MikKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTkyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRDU2MDMyOCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjY3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI2NgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDU0NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzQKLQkJCQlQYXJlbnRfVmlldyAJQDI3MgotCQkJCWxvY2F0aW9uICAgCSgyMzksIDU4MykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg0NDk2MQotCQkJCWhlaWdodCAgICAgCTcxCi0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMjc1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDcyMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI3NQotCQkJbG9jYXRpb24gICAJKDEyNTUsIDU4MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbXBvcnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJICAgIHdpZHRoICAgICAgCTQ1MgotCQkgICAgaGVpZ2h0ICAgICAJMzA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTEiIEAyNzYKLQkJICAgIGxvY2F0aW9uICAgCSgxNDg2LCAxMDAxKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEIxRENDMDJFNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZVNjaGVtYSIgQDI3NwotCQkJICAgIFBhcmVudF9WaWV3IAlAMjc2Ci0JCQkgICAgbG9jYXRpb24gICAJKDUxMCwgLTEwMykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzgKLQkJCQlQYXJlbnRfVmlldyAJQDI3NwotCQkJCWxvY2F0aW9uICAgCSgxNzM3LCAxMDE4KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIwNAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VTY2hlbWEiCi0JCQkJcGN0RGlzdCAgICAJMC41OTI1OTMKLQkJCQloZWlnaHQgICAgIAkxMDUKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMURDRTAyNzAiCi0JCQkgICAgY2xpZW50ICAgICAJQDI3NgotCQkJICAgIHN1cHBsaWVyICAgCUAyNjUKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTQ4NiwgMTAwMSkKLQkJCQkoMTYzMiwgMTAwMSkKLQkJCQkoMTYzMiwgMTEzMCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMiwgMTEzMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzkKLQkJCQlQYXJlbnRfVmlldyAJQDI3NwotCQkJCWxvY2F0aW9uICAgCSgxNTYzLCAxMDE4KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNTkyNTkzCi0JCQkJaGVpZ2h0ICAgICAJNzAKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MiIgQDI4MAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjc2Ci0JCQkgICAgbG9jYXRpb24gICAJKDUxMCwgLTEwMykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCQkgICAgY2xpZW50ICAgICAJQDI3NgotCQkJICAgIHN1cHBsaWVyICAgCUAyNzUKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODYsIDg3MikpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM5IiBAMjgxCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA4NywgNDAzKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRTNBMDAyRCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDAiIEAyODIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MQotCQkJICAgIGxvY2F0aW9uICAgCSg2ODcsIC0xMjUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgzCi0JCQkJUGFyZW50X1ZpZXcgCUAyODIKLQkJCQlsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUYyIgotCQkJICAgIGNsaWVudCAgICAgCUAyODEKLQkJCSAgICBzdXBwbGllciAgIAlAMjc1Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwODcsIDQwMykKLQkJCQkoMTM2NCwgNDAzKQotCQkJCSgxMzY0LCA1NjgpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NCwgNTY4KSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVEZWZpbml0aW9uIiBAMjg0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NQotCQkJCVBhcmVudF9WaWV3IAlAMjg0Ci0JCQkJbG9jYXRpb24gICAJKDgwNSwgMzYzKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIxNgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VEZWZpbml0aW9uIgotCQkJCXBjdERpc3QgICAgCTAuNjM3NTMyCi0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRTgiCi0JCQkgICAgY2xpZW50ICAgICAJQDI4MQotCQkJICAgIHN1cHBsaWVyICAgCUAyNjYKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNDAzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NgotCQkJCVBhcmVudF9WaWV3IAlAMjg0Ci0JCQkJbG9jYXRpb24gICAJKDcyNywgNDU2KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODE0OTEwCi0JCQkJaGVpZ2h0ICAgICAJNTMKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMjg3Ci0JCSAgICBsb2NhdGlvbiAgIAkoNzM3LCA4MjYpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDI4OAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjg3Ci0JCQkgICAgbG9jYXRpb24gICAJKC02NzEsIDEwNikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODkKLQkJCQlQYXJlbnRfVmlldyAJQDI4OAotCQkJCWxvY2F0aW9uICAgCSg1NTIsIDY0NykKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDUwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjg3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI2NgotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg3MzcsIDgyNikKLQkJCQkoNTEwLCA4MjYpCi0JCQkJKDUxMCwgNTQ0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA1NDQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkwCi0JCQkJUGFyZW50X1ZpZXcgCUAyODgKLQkJCQlsb2NhdGlvbiAgIAkoNDU3LCA1OTUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMjkxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MgotCQkJCVBhcmVudF9WaWV3IAlAMjkxCi0JCQkJbG9jYXRpb24gICAJKDExNDQsIDc3MykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlSW1wb3J0cyIKLQkJCQlwY3REaXN0ICAgIAkwLjc5OTE4OQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJICAgIGNsaWVudCAgICAgCUAyODcKLQkJCSAgICBzdXBwbGllciAgIAlAMjc1Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDYsIDgyNikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTMKLQkJCQlQYXJlbnRfVmlldyAJQDI5MQotCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA4NzkpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC44NzIyMTEKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5NAotCQkJCVBhcmVudF9WaWV3IAlAMjkxCi0JCQkJbG9jYXRpb24gICAJKDExNjIsIDkzMykKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjgzNzcyOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOTUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjZGMjAwRDAzNDAiCi0JCSAgICBjbGllbnQgICAgIAlAMjc1Ci0JCSAgICBzdXBwbGllciAgIAlAMjYzCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NTUsIDU2OCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMiBUeXBlcyIKLQkgICAgcXVpZCAgICAgICAJIjNCODVBRTU5MDM3RSIKLQkgICAgdGl0bGUgICAgICAJIjIuMiBUeXBlcyIKLQkgICAgem9vbSAgICAgICAJOTAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAk4MQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAyOTYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMTIzMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI5NgotCQkJbG9jYXRpb24gICAJKDg5NSwgMTE1NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0ODIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkgICAgd2lkdGggICAgICAJNTAwCi0JCSAgICBoZWlnaHQgICAgIAkxNzQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAyOTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMTYwMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI5NwotCQkJbG9jYXRpb24gICAJKDkwNiwgMTUzMSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJICAgIHdpZHRoICAgICAgCTQ3OAotCQkgICAgaGVpZ2h0ICAgICAJMTYyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAyOTgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI4MCwgMTk2OCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI5OAotCQkJbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTE3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkgICAgd2lkdGggICAgICAJNTM1Ci0JCSAgICBoZWlnaHQgICAgIAkzMDUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDI5OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzNTIsIDExODQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyOTkKLQkJCWxvY2F0aW9uICAgCSgxMjgsIDEwNjcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDQ4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgd2lkdGggICAgICAJNDY2Ci0JCSAgICBoZWlnaHQgICAgIAkyNTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NyIgQDMwMAotCQkgICAgbG9jYXRpb24gICAJKDczNSwgMTE3MikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMUJFOTAwQzQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBAMzAxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCA2NzYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAyCi0JCQkJUGFyZW50X1ZpZXcgCUAzMDEKLQkJCQlsb2NhdGlvbiAgIAkoNzc1LCAxMTMzKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI3NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCXBjdERpc3QgICAgCTAuMjY5MDA2Ci0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMjciCi0JCQkgICAgY2xpZW50ICAgICAJQDMwMAotCQkJICAgIHN1cHBsaWVyICAgCUAyOTYKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg4NiwgMTE3MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDMKLQkJCQlQYXJlbnRfVmlldyAJQDMwMQotCQkJCWxvY2F0aW9uICAgCSg4MzksIDEyMDcpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42ODg3MDUKLQkJCQloZWlnaHQgICAgIAkzNQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ4IiBAMzA0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCA2NzYpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkJICAgIGNsaWVudCAgICAgCUAzMDAKLQkJCSAgICBzdXBwbGllciAgIAlAMjk5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODUsIDExNzIpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDMwNQotCQkgICAgbG9jYXRpb24gICAJKDUyNywgMTU5MikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMUMxMjAzQjIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbiIgQDMwNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMzA1Ci0JCQkgICAgbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDcKLQkJCQlQYXJlbnRfVmlldyAJQDMwNgotCQkJCWxvY2F0aW9uICAgCSg2NjYsIDE1NTQpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzcyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXBjdERpc3QgICAgCTAuMzc1Mzk0Ci0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCQkgICAgY2xpZW50ICAgICAJQDMwNQotCQkJICAgIHN1cHBsaWVyICAgCUAyOTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg5NywgMTU5MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDgKLQkJCQlQYXJlbnRfVmlldyAJQDMwNgotCQkJCWxvY2F0aW9uICAgCSg4MDcsIDE2NDUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43NTU4NzcKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUwIiBAMzA5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDUKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQzE0MDAyNiIKLQkJCSAgICBjbGllbnQgICAgIAlAMzA1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI5OQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg1MjcsIDE1OTIpCi0JCQkJKDQzNywgMTU5MikKLQkJCQkoNDM3LCAxMzEzKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgMTMxMykpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU1IiBAMzEwCi0JCSAgICBsb2NhdGlvbiAgIAkoMzIyLCAxOTExKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDNDY4MjkzMDNFNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAzMTEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMAotCQkJICAgIGxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEyCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTEKLQkJCQlsb2NhdGlvbiAgIAkoODM4LCAxODcyKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIxNgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VNZXNzYWdlIgotCQkJCXBjdERpc3QgICAgCTAuNzQ4NTYwCi0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCQkgICAgY2xpZW50ICAgICAJQDMxMAotCQkJICAgIHN1cHBsaWVyICAgCUAyOTgKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE5MTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEzCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTEKLQkJCQlsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NiIgQDMxNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMzEwCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNCwgMTE5MSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMTgiCi0JCQkgICAgY2xpZW50ICAgICAJQDMxMAotCQkJICAgIHN1cHBsaWVyICAgCUAyOTkKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMzIyLCAxOTExKQotCQkJCSgyMjksIDE5MTEpCi0JCQkJKDIyOSwgMTMxMykpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjksIDEzMTMpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAzMTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODAwLCA2MDgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzMTUKLQkJCWxvY2F0aW9uICAgCSg2MTUsIDUxMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNzEKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJUeXBlcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkgICAgd2lkdGggICAgICAJMzg5Ci0JCSAgICBoZWlnaHQgICAgIAkyMTYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDMxNgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDE2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMxNgotCQkJbG9jYXRpb24gICAJKDc0LCAxMDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjA0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgd2lkdGggICAgICAJMjIyCi0JCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDMxNwotCQkgICAgbG9jYXRpb24gICAJKDIzNCwgNjA0KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMzE4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOQotCQkJCVBhcmVudF9WaWV3IAlAMzE4Ci0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjQwKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIwNwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VUeXBlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjY2MTAxNwotCQkJCWhlaWdodCAgICAgCTM2Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIgotCQkJICAgIGNsaWVudCAgICAgCUAzMTcKLQkJCSAgICBzdXBwbGllciAgIAlAMzE1Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMAotCQkJCVBhcmVudF9WaWV3IAlAMzE4Ci0JCQkJbG9jYXRpb24gICAJKDUyNiwgNTY5KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNzgzODgzCi0JCQkJaGVpZ2h0ICAgICAJMzYKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDMyMQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzE3Ci0JCQkgICAgbG9jYXRpb24gICAJKC0xNTAsIDM5NikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjIKLQkJCQlQYXJlbnRfVmlldyAJQDMyMQotCQkJCWxvY2F0aW9uICAgCSgxMzMsIDMxMykKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJICAgIGNsaWVudCAgICAgCUAzMTcKLQkJCSAgICBzdXBwbGllciAgIAlAMzE2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIzNCwgNjA0KQotCQkJCSgxNzQsIDYwNCkKLQkJCQkoMTc0LCAyMjUpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDIyNSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjMKLQkJCQlQYXJlbnRfVmlldyAJQDMyMQotCQkJCWxvY2F0aW9uICAgCSgyMjgsIDI3MSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NzcyOQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIiBAMzI0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDY0MCwgMjI0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzI0Ci0JCQlsb2NhdGlvbiAgIAkoNTI1LCAyMDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjMwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSVR5cGVzIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMyNAotCQkJbG9jYXRpb24gICAJKDUyNSwgMTUzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMzAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJICAgIHdpZHRoICAgICAgCTI0OAotCQkgICAgaGVpZ2h0ICAgICAJMTY2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzI1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3MjgsIDgwMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMyNQotCQkJbG9jYXRpb24gICAJKDEzNTksIDc1MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3MzkKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIgotCQkgICAgd2lkdGggICAgICAJNzU3Ci0JCSAgICBoZWlnaHQgICAgIAkxMTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzMjYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1NiwgMTIxNikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMyNgotCQkJbG9jYXRpb24gICAJKDE1MjksIDExMDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjU1Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCSAgICB3aWR0aCAgICAgIAk2NzMKLQkJICAgIGhlaWdodCAgICAgCTI1MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU5IiBAMzI3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNiwgOTc1KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDQzM2MTQ1MDBGMiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjAiIEAzMjgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNwotCQkJICAgIGxvY2F0aW9uICAgCSgzMDYsIDQ0NykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkgICAgY2xpZW50ICAgICAJQDMyNwotCQkJICAgIHN1cHBsaWVyICAgCUAzMjUKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDg1OSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkKLQkJCQlQYXJlbnRfVmlldyAJQDMyOAotCQkJCWxvY2F0aW9uICAgCSgxNzc0LCA5MDApCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42NTY0ODkKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDMzMAotCQkJICAgIFBhcmVudF9WaWV3IAlAMzI3Ci0JCQkgICAgbG9jYXRpb24gICAJKDMwNiwgNDQ3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMQotCQkJCVBhcmVudF9WaWV3IAlAMzMwCi0JCQkJbG9jYXRpb24gICAJKDIwMDYsIDEwMzMpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTY4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrc2NoZW1hIgotCQkJCXBjdERpc3QgICAgCTAuNTA3NTc2Ci0JCQkJaGVpZ2h0ICAgICAJMTgwCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNFIgotCQkJICAgIGNsaWVudCAgICAgCUAzMjcKLQkJCSAgICBzdXBwbGllciAgIAlAMzI2Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCAxMDkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMgotCQkJCVBhcmVudF9WaWV3IAlAMzMwCi0JCQkJbG9jYXRpb24gICAJKDE3ODgsIDEwNTApCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42NTE1MTUKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzMKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0FEQ0QzQjAzODAiCi0JCSAgICBjbGllbnQgICAgIAlAMzE1Ci0JCSAgICBzdXBwbGllciAgIAlAMzI0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcwNSwgNTAwKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcwNSwgMzA3KSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDMzNAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDU2LCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzMzQKLQkJCWxvY2F0aW9uICAgCSg4MTUsIDEzMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0ODIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkgICAgd2lkdGggICAgICAJNTAwCi0JCSAgICBoZWlnaHQgICAgIAkyMTIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzNQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJICAgIGNsaWVudCAgICAgCUAzMTUKLQkJICAgIHN1cHBsaWVyICAgCUAzMzQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODU0LCA1MDApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzM2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDQ2NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMzNgotCQkJbG9jYXRpb24gICAJKDE0OTAsIDM2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2NjkKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkgICAgd2lkdGggICAgICAJNjg3Ci0JCSAgICBoZWlnaHQgICAgIAkyMTYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDMzNwotCQkgICAgbG9jYXRpb24gICAJKDEyMDYsIDQ5MykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMzM4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMzcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzOQotCQkJCVBhcmVudF9WaWV3IAlAMzM4Ci0JCQkJbG9jYXRpb24gICAJKDExMzYsIDM4NikKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDUwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSIKLQkJCSAgICBjbGllbnQgICAgIAlAMzM3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMzNAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMjA2LCA0OTMpCi0JCQkJKDEwOTQsIDQ5MykKLQkJCQkoMTA5NCwgMzMwKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDMzMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDAKLQkJCQlQYXJlbnRfVmlldyAJQDMzOAotCQkJCWxvY2F0aW9uICAgCSgxMDQyLCAzNzcpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44MjgzMjYKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAzNDEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNwotCQkJICAgIGxvY2F0aW9uICAgCSgtNTg2LCAyMzcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQyCi0JCQkJUGFyZW50X1ZpZXcgCUAzNDEKLQkJCQlsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ0NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcGN0RGlzdCAgICAJLTAuMDM5NzExCi0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDMzNwotCQkJICAgIHN1cHBsaWVyICAgCUAzMzYKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODEsIDQ5MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDMKLQkJCQlQYXJlbnRfVmlldyAJQDM0MQotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA1NDYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC43NjQ5NTcKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0NAotCQkJCVBhcmVudF9WaWV3IAlAMzQxCi0JCQkJbG9jYXRpb24gICAJKDEzOTYsIDM5MikKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjY5NDkxNQotCQkJCWhlaWdodCAgICAgCTEwMgotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0MzNjI3RjAwQjciCi0JCSAgICBjbGllbnQgICAgIAlAMzI1Ci0JCSAgICBzdXBwbGllciAgIAlAMzM2Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4MTIsIDc0MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCA1NzIpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyIKLQkgICAgcXVpZCAgICAgICAJIjNCQ0U4NTNEMDJDOCIKLQkgICAgdGl0bGUgICAgICAJIjIuMyBNZXNzYWdlcyIKLQkgICAgem9vbSAgICAgICAJODUKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiIEAzNDYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgMjI0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzQ2Ci0JCQlsb2NhdGlvbiAgIAkoMjY3LCAxMjIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSU1lc3NhZ2UiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzQ2Ci0JCQlsb2NhdGlvbiAgIAkoMjY3LCA3MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiCi0JCSAgICB3aWR0aCAgICAgIAkzODAKLQkJICAgIGhlaWdodCAgICAgCTMyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCIgQDM0NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMjI0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzQ3Ci0JCQlsb2NhdGlvbiAgIAkoMTAyOSwgMTI0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU5OQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklQYXJ0IikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM0NwotCQkJbG9jYXRpb24gICAJKDEwMjksIDc0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1OTkKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIKLQkJICAgIHdpZHRoICAgICAgCTYxNwotCQkgICAgaGVpZ2h0ICAgICAJMzI0Ci0JCSAgICBhbm5vdGF0aW9uIAk4KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzNDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzQ4Ci0JCQlsb2NhdGlvbiAgIAkoMTA3NSwgNjkwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ3NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhcnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJICAgIHdpZHRoICAgICAgCTQ5MgotCQkgICAgaGVpZ2h0ICAgICAJMjc2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTk2RDAyRjEiCi0JCSAgICBjbGllbnQgICAgIAlAMzQ4Ci0JCSAgICBzdXBwbGllciAgIAlAMzQ3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzMDQsIDY3OCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA0LCAzODYpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzNTAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA2NTYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNTAKLQkJCWxvY2F0aW9uICAgCSgyNDEsIDUwNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICB3aWR0aCAgICAgIAk0MzIKLQkJICAgIGhlaWdodCAgICAgCTMyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzUxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE4RDEwMkJBIgotCQkgICAgY2xpZW50ICAgICAJQDM1MAotCQkgICAgc3VwcGxpZXIgICAJQDM0NgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDUsIDQ5NSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBAMzUyCi0JCSAgICBsb2NhdGlvbiAgIAkoNjg4LCA5NTIpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlUGFydHMiIEAzNTMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MgotCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTQKLQkJCQlQYXJlbnRfVmlldyAJQDM1MwotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDg5NykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlUGFydHMiCi0JCQkJcGN0RGlzdCAgICAJMC42OTc0NTIKLQkJCQloZWlnaHQgICAgIAk1NgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRUJGMDA2MSIKLQkJCSAgICBjbGllbnQgICAgIAlAMzUyCi0JCQkgICAgc3VwcGxpZXIgICAJQDM0OAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU1Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNTMKLQkJCQlsb2NhdGlvbiAgIAkoOTg3LCAxMDA1KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuNzg5ODA5Ci0JCQkJaGVpZ2h0ICAgICAJNTMKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTYKLQkJCQlQYXJlbnRfVmlldyAJQDM1MwotCQkJCWxvY2F0aW9uICAgCSg5NjcsIDEwNjEpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC43NDIwMzgKLQkJCQloZWlnaHQgICAgIAkxMDkKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMzU3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNTIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAzMjgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU4Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNTcKLQkJCQlsb2NhdGlvbiAgIAkoNDA0LCA4OTMpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyIKLQkJCSAgICBjbGllbnQgICAgIAlAMzUyCi0JCQkgICAgc3VwcGxpZXIgICAJQDM1MAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg2ODgsIDk1MikKLQkJCQkoNDQ1LCA5NTIpCi0JCQkJKDQ0NSwgODE3KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNTcKLQkJCQlsb2NhdGlvbiAgIAkoMzkzLCA5MTIpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43NDc2MDQKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkwKSkpKSkpKSkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvd3NkbC5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvd3NkbC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiYzQ0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL21vZGVsL3dzZGwuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0id3NkbCIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93c2RsLzIwMDMvV1NETCIgbnNQcmVmaXg9IndzZGwiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtXU0RMIGRlc2NyaWJlcyBuZXR3b3JrIHNlcnZpY2VzIGFzIHNldHMgb2YgZW5kcG9pbnRzIG9wZXJhdGluZyBvbiBtZXNzYWdlcy4gVGhlIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGFyZSBkZXNjcmliZWQgYWJzdHJhY3RseSwgYW5kIHRoZW4gYm91bmQgdG8gYSBjb25jcmV0ZSBuZXR3b3JrIHByb3RvY29sIGFuZCBtZXNzYWdlIGZvcm1hdCB0byBkZWZpbmUgYW4gZW5kcG9pbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkmI3hEOyYjeEE7LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUmI3hEOyYjeEE7LSAyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmcsIHNob3dzIHRoZSBuYW1lc3BhY2UgYW5kIGltcG9ydCBtZWNoYW5pc20mI3hEOyYjeEE7LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbSYjeEQ7JiN4QTstIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwmI3hEOyYjeEE7LSAyLjMgTWVzc2FnZXMsIDIuNCBQb3J0VHlwZXMsIDIuNSBCaW5kaW5ncyBhbmQgMi43IFNlcnZpY2VzLCBzaG93IHRoZSBtYWpvciBXU0RMIGVsZW1lbnRzIGFuZCB0aGVpciByZWxhdGlvbnMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4iLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEVuY2xvc2luZ0RlZmluaXRpb24iIGVUeXBlPSIjLy9EZWZpbml0aW9uIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldEVuY2xvc2luZ0RlZmluaXRpb24iPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImRlZmluaXRpb24iIGVUeXBlPSIjLy9EZWZpbml0aW9uIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZG9jdW1lbnRhdGlvbkVsZW1lbnQiIGVUeXBlPSIjLy9ET01FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVsZW1lbnQiIGVUeXBlPSIjLy9ET01FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcnRUeXBlIiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQgIy8vSVBvcnRUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJxTmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuZGVmaW5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJveHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVPcGVyYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL09wZXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3BlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQgIy8vSU9wZXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudC4gQSBXU0RMIG9wZXJhdGlvbiBpcyBhbiBhYnN0cmFjdCBkZXNjcmlwdGlvbiBvZiBhbiBhY3Rpb24gc3VwcG9ydGVkIGJ5IGEgc2VydmljZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3R5bGUiIGVUeXBlPSIjLy9PcGVyYXRpb25UeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm94eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUlucHV0IiBlVHlwZT0iIy8vSW5wdXQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVPdXRwdXQiIGVUeXBlPSIjLy9PdXRwdXQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVGYXVsdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRmF1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQYXJhbWV0ZXJPcmRlcmluZyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QYXJ0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2UiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JTWVzc2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bmRlZmluZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3h5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlUGFydHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUGFydCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFydCIgZVN1cGVyVHlwZXM9IiMvL1dTRExFbGVtZW50ICMvL0lQYXJ0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWxlbWVudE5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlTmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InR5cGVEZWZpbml0aW9uIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTRFR5cGVEZWZpbml0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnREZWNsYXJhdGlvbiIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RFbGVtZW50RGVjbGFyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU1lc3NhZ2UiIGVUeXBlPSIjLy9NZXNzYWdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJpbmRpbmciIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JQmluZGluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm94eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBvcnRUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUG9ydFR5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUJpbmRpbmdPcGVyYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0JpbmRpbmdPcGVyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJpbmRpbmdPcGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU9wZXJhdGlvbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL09wZXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZ0lucHV0IiBlVHlwZT0iIy8vQmluZGluZ0lucHV0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZ091dHB1dCIgZVR5cGU9IiMvL0JpbmRpbmdPdXRwdXQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5nRmF1bHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0JpbmRpbmdGYXVsdCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmljZSIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lTZXJ2aWNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJxTmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuZGVmaW5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJveHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQb3J0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qb3J0IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0IiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSVBvcnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydCBlbGVtZW50LiBBIHBvcnQgZGVmaW5lcyBhbiBpbmRpdmlkdWFsIGVuZHBvaW50IGJ5IHNwZWNpZnlpbmcgYSBzaW5nbGUgYWRkcmVzcyBmb3IgYSBiaW5kaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUJpbmRpbmciIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9CaW5kaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuc2liaWxpdHlFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQgIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXF1aXJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWxlbWVudFR5cGUiIGVUeXBlPSIjLy9RTmFtZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXREb2N1bWVudCIgZVR5cGU9IiMvL0RPTURvY3VtZW50Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldERvY3VtZW50Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJkb2N1bWVudCIgZVR5cGU9IiMvL0RPTURvY3VtZW50Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUltcG9ydHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSW1wb3J0IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlVHlwZXMiIGVUeXBlPSIjLy9UeXBlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU1lc3NhZ2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01lc3NhZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQb3J0VHlwZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUG9ydFR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CaW5kaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlU2VydmljZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU2VydmljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU5hbWVzcGFjZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTmFtZXNwYWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbXBvcnQiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JSW1wb3J0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTY2hlbWEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy14c2QvbW9kZWwvWFNELmVjb3JlIy8vWFNEU2NoZW1hIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFNjaGVtYSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTRFNjaGVtYSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvblVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlRGVmaW5pdGlvbiIgZVR5cGU9IiMvL0RlZmluaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVNjaGVtYSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RTY2hlbWEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5zaWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIgZVR5cGU9IiMvL0lMaXN0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJleHRFbGVtZW50IiBlVHlwZT0iIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5wdXQiIGVTdXBlclR5cGVzPSIjLy9NZXNzYWdlUmVmZXJlbmNlICMvL1dTRExFbGVtZW50ICMvL0lJbnB1dCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRwdXQiIGVTdXBlclR5cGVzPSIjLy9NZXNzYWdlUmVmZXJlbmNlICMvL1dTRExFbGVtZW50ICMvL0lPdXRwdXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmF1bHQiIGVTdXBlclR5cGVzPSIjLy9NZXNzYWdlUmVmZXJlbmNlICMvL1dTRExFbGVtZW50ICMvL0lGYXVsdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJpbmRpbmdJbnB1dCIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lCaW5kaW5nSW5wdXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gaW5wdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0SW5wdXQiIGVUeXBlPSIjLy9JSW5wdXQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0SW5wdXQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImlucHV0IiBlVHlwZT0iIy8vSUlucHV0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlSW5wdXQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JbnB1dCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCaW5kaW5nT3V0cHV0IiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSUJpbmRpbmdPdXRwdXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3V0cHV0IiBlVHlwZT0iIy8vSU91dHB1dCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRPdXRwdXQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im91dHB1dCIgZVR5cGU9IiMvL0lPdXRwdXQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVPdXRwdXQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRwdXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmluZGluZ0ZhdWx0IiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSUJpbmRpbmdGYXVsdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmF1bHQiIGVUeXBlPSIjLy9JRmF1bHQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RmF1bHQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImZhdWx0IiBlVHlwZT0iIy8vSUZhdWx0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlRmF1bHQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9GYXVsdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJRTmFtZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPcGVyYXRpb25UeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPTkVfV0FZPTEmI3hEOyYjeEE7UkVRVUVTVF9SRVNQT05TRT0yJiN4RDsmI3hBO1NPTElDSVRfUkVTUE9OU0U9MyYjeEQ7JiN4QTtOT1RJRklDQVRJT049NCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJUG9ydFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLlBvcnRUeXBlIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnRUeXBlIG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRPcGVyYXRpb24iPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPcGVyYXRpb24iIGVUeXBlPSIjLy9JT3BlcmF0aW9uIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW5wdXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ib3V0cHV0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE9wZXJhdGlvbnMiIGVUeXBlPSIjLy9JTGlzdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJT3BlcmF0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5PcGVyYXRpb24iCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRGYXVsdCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZmF1bHQiIGVUeXBlPSIjLy9JRmF1bHQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGYXVsdCIgZVR5cGU9IiMvL0lGYXVsdCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZhdWx0cyIgZVR5cGU9IiMvL0lNYXAiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGFyYW1ldGVyT3JkZXJpbmciIGVUeXBlPSIjLy9JTGlzdCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRQYXJhbWV0ZXJPcmRlcmluZyI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFyYW1ldGVyT3JkZXIiIGVUeXBlPSIjLy9JTGlzdCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldElucHV0IiBlVHlwZT0iIy8vSUlucHV0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldElucHV0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJpbnB1dCIgZVR5cGU9IiMvL0lJbnB1dCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE91dHB1dCIgZVR5cGU9IiMvL0lPdXRwdXQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0T3V0cHV0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvdXRwdXQiIGVUeXBlPSIjLy9JT3V0cHV0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUlucHV0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5JbnB1dCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbnB1dCBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldE1lc3NhZ2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklPdXRwdXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLk91dHB1dCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRNZXNzYWdlIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRmF1bHQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkZhdWx0IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0TWVzc2FnZSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1lc3NhZ2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLk1lc3NhZ2UiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRQYXJ0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJ0IiBlVHlwZT0iIy8vSVBhcnQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJ0IiBlVHlwZT0iIy8vSVBhcnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJ0cyIgZVR5cGU9IiMvL0lNYXAiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3JkZXJlZFBhcnRzIiBlVHlwZT0iIy8vSUxpc3QiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcnRPcmRlciIgZVR5cGU9IiMvL0lMaXN0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVBhcnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLlBhcnQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUGFydCBub24tTU9GIGludGVyZmFjZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiIGVFeGNlcHRpb25zPSIjLy9XU0RMRXhjZXB0aW9uIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiIGVUeXBlPSIjLy9JSXRlcmF0b3IiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIiBlVHlwZT0iIy8vUU5hbWUiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklTZXJ2aWNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5TZXJ2aWNlIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFBvcnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBvcnQiIGVUeXBlPSIjLy9JUG9ydCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBvcnRzIiBlVHlwZT0iIy8vSU1hcCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQb3J0IiBlVHlwZT0iIy8vSVBvcnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJUG9ydCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuUG9ydCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0QmluZGluZyI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUJpbmRpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkJpbmRpbmciCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYmluZGluZ09wZXJhdGlvbiIgZVR5cGU9IiMvL0lCaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZ09wZXJhdGlvbiIgZVR5cGU9IiMvL0lCaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW5wdXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ib3V0cHV0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdPcGVyYXRpb25zIiBlVHlwZT0iIy8vSUxpc3QiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UG9ydFR5cGUiIGVUeXBlPSIjLy9JUG9ydFR5cGUiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0UG9ydFR5cGUiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUJpbmRpbmdPcGVyYXRpb24iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkQmluZGluZ0ZhdWx0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nRmF1bHQiIGVUeXBlPSIjLy9JQmluZGluZ0ZhdWx0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZ0ZhdWx0IiBlVHlwZT0iIy8vSUJpbmRpbmdGYXVsdCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdGYXVsdHMiIGVUeXBlPSIjLy9JTWFwIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0T3BlcmF0aW9uIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvcGVyYXRpb24iIGVUeXBlPSIjLy9JT3BlcmF0aW9uIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZ0lucHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdJbnB1dCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRCaW5kaW5nSW5wdXQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImJpbmRpbmdJbnB1dCIgZVR5cGU9IiMvL0lCaW5kaW5nSW5wdXQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nT3V0cHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdPdXRwdXQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0QmluZGluZ091dHB1dCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYmluZGluZ091dHB1dCIgZVR5cGU9IiMvL0lCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUJpbmRpbmdJbnB1dCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuQmluZGluZ0lucHV0IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUJpbmRpbmdPdXRwdXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ091dHB1dCBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUJpbmRpbmdGYXVsdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuQmluZGluZ0ZhdWx0IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRE9NRWxlbWVudCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy53M2MuZG9tLkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUV4dGVuc2liaWxpdHlFbGVtZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRGVmaW5pdGlvbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuRGVmaW5pdGlvbiIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRCaW5kaW5nIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRJbXBvcnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImltcG9ydERlZiIgZVR5cGU9IiMvL0lJbXBvcnQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRNZXNzYWdlIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGROYW1lc3BhY2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InByZWZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFBvcnRUeXBlIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwb3J0VHlwZSIgZVR5cGU9IiMvL0lQb3J0VHlwZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFNlcnZpY2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InNlcnZpY2UiIGVUeXBlPSIjLy9JU2VydmljZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUJpbmRpbmdGYXVsdCIgZVR5cGU9IiMvL0lCaW5kaW5nRmF1bHQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlQmluZGluZ0lucHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdJbnB1dCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVCaW5kaW5nT3V0cHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdPdXRwdXQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlQmluZGluZ09wZXJhdGlvbiIgZVR5cGU9IiMvL0lCaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUJpbmRpbmciIGVUeXBlPSIjLy9JQmluZGluZyIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVGYXVsdCIgZVR5cGU9IiMvL0lGYXVsdCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVJbXBvcnQiIGVUeXBlPSIjLy9JSW1wb3J0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUlucHV0IiBlVHlwZT0iIy8vSUlucHV0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZU1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVPcGVyYXRpb24iIGVUeXBlPSIjLy9JT3BlcmF0aW9uIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZU91dHB1dCIgZVR5cGU9IiMvL0lPdXRwdXQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlUGFydCIgZVR5cGU9IiMvL0lQYXJ0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZVBvcnQiIGVUeXBlPSIjLy9JUG9ydCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVQb3J0VHlwZSIgZVR5cGU9IiMvL0lQb3J0VHlwZSIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVTZXJ2aWNlIiBlVHlwZT0iIy8vSVNlcnZpY2UiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5ncyIgZVR5cGU9IiMvL0lNYXAiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0SW1wb3J0cyIgZVR5cGU9IiMvL0lNYXAiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0SW1wb3J0cyIgZVR5cGU9IiMvL0lMaXN0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1lc3NhZ2VzIiBlVHlwZT0iIy8vSU1hcCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROYW1lc3BhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InByZWZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE5hbWVzcGFjZXMiIGVUeXBlPSIjLy9JTWFwIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQb3J0VHlwZXMiIGVUeXBlPSIjLy9JTWFwIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFByZWZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZXNwYWNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U2VydmljZSIgZVR5cGU9IiMvL0lTZXJ2aWNlIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTZXJ2aWNlcyIgZVR5cGU9IiMvL0lNYXAiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiIGVUeXBlPSIjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RXh0ZW5zaW9uUmVnaXN0cnkiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImV4dGVuc2lvblJlZ2lzdHJ5IiBlVHlwZT0iIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RG9jdW1lbnRCYXNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldERvY3VtZW50QmFzZVVSSSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZG9jdW1lbnRCYXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlVHlwZXMiIGVUeXBlPSIjLy9JVHlwZXMiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0icmVtb3ZlU2VydmljZSIgZVR5cGU9IiMvL0lTZXJ2aWNlIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJyZW1vdmVCaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InJlbW92ZVBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJyZW1vdmVNZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFR5cGVzIiBlVHlwZT0iIy8vSVR5cGVzIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFR5cGVzIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ0eXBlcyIgZVR5cGU9IiMvL0lUeXBlcyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklJbXBvcnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkltcG9ydCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklMaXN0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJTWFwIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLk1hcCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVVSTCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSTCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLm5ldC5VUkwgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRXh0ZW5zaW9uUmVnaXN0cnkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZXMiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JVHlwZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgdHlwZXMgZWxlbWVudC4gVGhlIHR5cGVzIGVsZW1lbnQgZW5jbG9zZXMgZGF0YSB0eXBlIGRlZmluaXRpb25zIHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUgZXhjaGFuZ2VkIG1lc3NhZ2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTY2hlbWFzIiBlVHlwZT0iIy8vSUxpc3QiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U2NoZW1hcyIgZVR5cGU9IiMvL0lMaXN0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSXRlcmF0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuSXRlcmF0b3IiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV1NETEV4Y2VwdGlvbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4Y2VwdGlvbiBjbGFzcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVR5cGVzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5UeXBlcyIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5UeXBlcyBub24tTU9GIGludGVyZmFjZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkcmVuIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RTY2hlbWEiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRPTURvY3VtZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLnczYy5kb20uRG9jdW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRG9jdW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VSZWZlcmVuY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVNZXNzYWdlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWVzc2FnZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL21vZGVsL3dzZGwuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL21vZGVsL3dzZGwuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjNlMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9tb2RlbC93c2RsLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LndzZGwuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIgbW9kZWxOYW1lPSJXU0RMIiBlZGl0UGx1Z2luQ2xhc3M9IiIgZWRpdG9yUGx1Z2luQ2xhc3M9IiIKLSAgICB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5nZW5tb2RlbCMvL3hzZCI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxXU0RMLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPlZBQkFTRV9QTFVHSU5TX1BBVEg8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXU0RMIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uud3N0IiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJ3c2RsLmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1FOYW1lIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTUVsZW1lbnQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9XU0RMRXhjZXB0aW9uIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRG9jdW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9kb2N1bWVudGF0aW9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9lbGVtZW50Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2dldEVuY2xvc2luZ0RlZmluaXRpb24iLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbi9kZWZpbml0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvZU9wZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9zdHlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lT3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZVBhcmFtZXRlck9yZGVyaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2UvZVBhcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9QYXJ0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC90eXBlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZU1lc3NhZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VQb3J0VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lQmluZGluZ09wZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdGYXVsdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1NlcnZpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vU2VydmljZS9lUG9ydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BvcnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9yZXF1aXJlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9lbGVtZW50VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vbG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VuY29kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VJbXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VUeXBlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lTWVzc2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVBvcnRUeXBlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lQmluZGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VOYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vZ2V0RG9jdW1lbnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudC9kb2N1bWVudCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW1wb3J0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9JbXBvcnQvbG9jYXRpb25VUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9nZXRTY2hlbWEiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudC9leHRFbGVtZW50Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbnB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PdXRwdXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRmF1bHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2VJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvZ2V0SW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQvaW5wdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9lT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dC9vdXRwdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9lRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2dldEZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0L2ZhdWx0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9OYW1lc3BhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9wcmVmaXgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0VHlwZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24vb3BlcmF0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vaW5wdXROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9vdXRwdXROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdC9mYXVsdCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRQYXJhbWV0ZXJPcmRlcmluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nL3BhcmFtZXRlck9yZGVyIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0SW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dC9pbnB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldE91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQvb3V0cHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSW5wdXQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU91dHB1dCI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPdXRwdXQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPdXRwdXQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRmF1bHQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0L3BhcnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0T3JkZXJlZFBhcnRzL3BhcnRPcmRlciIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBhcnQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlL3ZhbHVlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lTZXJ2aWNlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydC9wb3J0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9nZXRCaW5kaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmcvYmluZGluZyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmciPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uL2JpbmRpbmdPcGVyYXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9uYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9pbnB1dE5hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL291dHB1dE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbnMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0UG9ydFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlL3BvcnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vYWRkQmluZGluZ0ZhdWx0L2JpbmRpbmdGYXVsdCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0T3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uL29wZXJhdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nSW5wdXQvYmluZGluZ0lucHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dC9iaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0lucHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nRmF1bHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZy9iaW5kaW5nIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0L2ltcG9ydERlZiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UvcHJlZml4Ii8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL25hbWVzcGFjZVVSSSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUvcG9ydFR5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZS9zZXJ2aWNlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ091dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlSW1wb3J0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUlucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQYXJ0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlU2VydmljZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZ3MiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlL3ByZWZpeCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeC9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEV4dGVuc2lvblJlZ2lzdHJ5Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeS9leHRlbnNpb25SZWdpc3RyeSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXREb2N1bWVudEJhc2VVUkkiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkvZG9jdW1lbnRCYXNlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVR5cGVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlUG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFR5cGVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcy90eXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUltcG9ydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lVUkwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1R5cGVzIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJdGVyYXRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVHlwZXMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC9jaGlsZHJlbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQvc2NoZW1hIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvZU1lc3NhZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2MzlkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZzwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjZ2V0RVBvcnRUeXBlIDxlbT5FUG9ydCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjZ2V0RUJpbmRpbmdPcGVyYXRpb25zIDxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmcoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5CaW5kaW5newotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRRTmFtZShRTmFtZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdfUU5hbWUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUU5hbWUgZ2V0UU5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFFOYW1lKFFOYW1lIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRVbmRlZmluZWQoYm9vbGVhbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdfVW5kZWZpbmVkKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWJvb2xlYW4gaXNVbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUG9ydCBUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVQb3J0VHlwZShQb3J0VHlwZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdfRVBvcnRUeXBlKCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBvcnRUeXBlIGdldEVQb3J0VHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjZ2V0RVBvcnRUeXBlIDxlbT5FUG9ydCBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVQb3J0IFR5cGU8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFUG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RVBvcnRUeXBlKFBvcnRUeXBlIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUJpbmRpbmcgT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb259LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVCaW5kaW5nIE9wZXJhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdfRUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLX0gLy8gQmluZGluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ0ZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYTkxMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nRmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgRmF1bHQ8L2I+PC9lbT4nLgotICogQHNpbmNlIDEuMAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEEgZmF1bHQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBmYXVsdCB3aXRoIHRoZSBzYW1lIG5hbWUuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0I2dldEVGYXVsdCA8ZW0+RUZhdWx0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdGYXVsdCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ0ZhdWx0IGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdGYXVsdF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FRmF1bHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FRmF1bHQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVGYXVsdDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVGYXVsdChGYXVsdCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdGYXVsdF9FRmF1bHQoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRmF1bHQgZ2V0RUZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0I2dldEVGYXVsdCA8ZW0+RUZhdWx0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FRmF1bHQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RUZhdWx0KEZhdWx0IHZhbHVlKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBtZXRob2QgaXMgc2FtZSBhcyBnZXRFRmF1bHQoKSBhbmQgY29tcGF0aWJsZSB3aXRoIHRoZSBKV1NETCBBUEkuCi0gICAqIEBzZWUgI2dldEVGYXVsdCgpCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVGYXVsdDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdCgpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIG1ldGhvZCBpcyBzYW1lIGFzIHNldEVGYXVsdChGYXVsdCkgYW5kIGNvbXBhdGlibGUgd2l0aCB0aGUgSldTREwgQVBJLgotICAgKiBAc2VlICNzZXRFRmF1bHQoRmF1bHQpCi0gICAqIEBwYXJhbSBmYXVsdCB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVGYXVsdDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEZhdWx0KGphdmF4LndzZGwuRmF1bHQgZmF1bHQpOwotCi19IC8vIEJpbmRpbmdGYXVsdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nSW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ0lucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YzY2NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgSW5wdXQ8L2I+PC9lbT4nLgotICogQHNpbmNlIDEuMAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIGlucHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nSW5wdXQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nSW5wdXQjZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0lucHV0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nSW5wdXQgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5CaW5kaW5nSW5wdXR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0lucHV0X05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nSW5wdXQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUlucHV0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RUlucHV0KElucHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0lucHV0X0VJbnB1dCgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlJbnB1dCBnZXRFSW5wdXQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nSW5wdXQjZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUlucHV0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVJbnB1dChJbnB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgbWV0aG9kIGlzIHNhbWUgYXMgZ2V0RUlucHV0KCkgYW5kIGNvbXBhdGlibGUgd2l0aCB0aGUgSldTREwgQVBJLgotICAgKiBAc2VlICNnZXRFSW5wdXQoKQotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FSW5wdXQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAaWdub3JlCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWphdmF4LndzZGwuSW5wdXQgZ2V0SW5wdXQoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBtZXRob2QgaXMgc2FtZSBhcyBzZXRFSW5wdXQoSW5wdXQpIGFuZCBjb21wYXRpYmxlIHdpdGggdGhlIEpXU0RMIEFQSS4KLSAgICogQHNlZSAjc2V0RUlucHV0KElucHV0KQotICAgKiBAcGFyYW0gaW5wdXQgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FSW5wdXQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAaWdub3JlCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRJbnB1dChqYXZheC53c2RsLklucHV0IGlucHV0KTsKLQotfSAvLyBCaW5kaW5nSW5wdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ09wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0N2QwMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBPcGVyYXRpb248L2I+PC9lbT4nLgotICogQHNpbmNlIDEuMAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcuIEFuIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgYmluZGluZydzIHBvcnRUeXBlLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVPcGVyYXRpb24gPGVtPkVPcGVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0lucHV0IDxlbT5FQmluZGluZyBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nT3V0cHV0IDxlbT5FQmluZGluZyBPdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0ZhdWx0cyA8ZW0+RUJpbmRpbmcgRmF1bHRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpbmRpbmdPcGVyYXRpb24gZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPcGVyYXRpb25fTmFtZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVPcGVyYXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FT3BlcmF0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FT3BlcmF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RU9wZXJhdGlvbihPcGVyYXRpb24pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uX0VPcGVyYXRpb24oKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3BlcmF0aW9uIGdldEVPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVPcGVyYXRpb24gPGVtPkVPcGVyYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RU9wZXJhdGlvbihPcGVyYXRpb24gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZyBJbnB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVCaW5kaW5nIElucHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ0lucHV0KCkKLSAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUJpbmRpbmdJbnB1dCBnZXRFQmluZGluZ0lucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0lucHV0IDxlbT5FQmluZGluZyBJbnB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVCaW5kaW5nSW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZyBPdXRwdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FQmluZGluZyBPdXRwdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCkKLSAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUJpbmRpbmdPdXRwdXQgZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nT3V0cHV0IDxlbT5FQmluZGluZyBPdXRwdXQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RUJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVCaW5kaW5nIEZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdGYXVsdH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmcgRmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdGYXVsdHMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVCaW5kaW5nRmF1bHRzKCk7Ci0KLX0gLy8gQmluZGluZ09wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3V0cHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdPdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyMDkwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdPdXRwdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgT3V0cHV0PC9iPjwvZW0+Jy4KLSAqIEBzaW5jZSAxLjAKLSAqIEBpZ25vcmUKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ091dHB1dCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3V0cHV0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nT3V0cHV0IGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuQmluZGluZ091dHB1dHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3V0cHV0X05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3V0cHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FT3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVPdXRwdXQoT3V0cHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ091dHB1dF9FT3V0cHV0KCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU91dHB1dCBnZXRFT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ091dHB1dCNnZXRFT3V0cHV0IDxlbT5FT3V0cHV0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVPdXRwdXQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVPdXRwdXQoT3V0cHV0IHZhbHVlKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBtZXRob2QgaXMgc2FtZSBhcyBnZXRFT3V0cHV0KCkgYW5kIGNvbXBhdGlibGUgd2l0aCB0aGUgSldTREwgQVBJLgotICAgKiBAc2VlICNnZXRFT3V0cHV0KCkKLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JamF2YXgud3NkbC5PdXRwdXQgZ2V0T3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgbWV0aG9kIGlzIHNhbWUgYXMgc2V0RU91dHB1dChPdXRwdXQpIGFuZCBjb21wYXRpYmxlIHdpdGggdGhlIEpXU0RMIEFQSS4KLSAgICogQHNlZSAjc2V0RU91dHB1dChPdXRwdXQpCi0gICAqIEBwYXJhbSBvdXRwdXQgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQGlnbm9yZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0T3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCk7Ci0KLX0gLy8gQmluZGluZ091dHB1dApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9EZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzYjY2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgV1NETCBkb2N1bWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RW5jb2RpbmcgPGVtPkVuY29kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RU1lc3NhZ2VzIDxlbT5FTWVzc2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFUG9ydFR5cGVzIDxlbT5FUG9ydCBUeXBlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVCaW5kaW5ncyA8ZW0+RUJpbmRpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RVNlcnZpY2VzIDxlbT5FU2VydmljZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFTmFtZXNwYWNlcyA8ZW0+RU5hbWVzcGFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFVHlwZXMgPGVtPkVUeXBlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVJbXBvcnRzIDxlbT5FSW1wb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWZpbml0aW9uIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbnsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9Mb2NhdGlvbigpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0UU5hbWUoUU5hbWUpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX1FOYW1lKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLlFOYW1lIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVFOYW1lIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRRTmFtZShRTmFtZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FbmNvZGluZygpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0RW5jb2RpbmcoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldEVuY29kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVuY29kaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVNZXNzYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2V9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVNZXNzYWdlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX0VNZXNzYWdlcygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVNZXNzYWdlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUG9ydCBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FUG9ydCBUeXBlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUG9ydCBUeXBlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRVBvcnRUeXBlcygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFUG9ydFR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVCaW5kaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmd9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVCaW5kaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX0VCaW5kaW5ncygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVCaW5kaW5ncygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FU2VydmljZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5TZXJ2aWNlfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FU2VydmljZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVNlcnZpY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FU2VydmljZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5TZXJ2aWNlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFU2VydmljZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU5hbWVzcGFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2V9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVOYW1lc3BhY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVOYW1lc3BhY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FTmFtZXNwYWNlcygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLk5hbWVzcGFjZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RU5hbWVzcGFjZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVR5cGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFVHlwZXMoVHlwZXMpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX0VUeXBlcygpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlUeXBlcyBnZXRFVHlwZXMoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVUeXBlcyA8ZW0+RVR5cGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVUeXBlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVUeXBlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFVHlwZXMoVHlwZXMgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FSW1wb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUltcG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUltcG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX0VJbXBvcnRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuSW1wb3J0IiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFSW1wb3J0cygpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBSZXR1cm5zIGEgVzNDIERPTSBEb2N1bWVudCBidWlsdCBmcm9tIHRoZSBpbnB1dCBXU0RMIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIFczQyBET00gRG9jdW1lbnQuCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5ET01Eb2N1bWVudCIgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBEb2N1bWVudCBnZXREb2N1bWVudCgpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBTZXRzIGEgVzNDIERPTSBEb2N1bWVudCB0byBiZSB1c2VkIHdoZW4gYnVpbGRpbmcgdXAgYSBET00gRWxlbWVudCB0cmVlIGZvciB0aGUgV1NETCBtb2RlbC4KLSAgICogQHBhcmFtIGRvY3VtZW50IFczQyBET00gRG9jdW1lbnQuCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSJvcmcuZWNsaXBzZS53c2RsLkRPTURvY3VtZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KTsKLQotfSAvLyBEZWZpbml0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0V4dGVuc2liaWxpdHlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0V4dGVuc2liaWxpdHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjY5MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9FeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBXU0RMIGFsbG93cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRFbGVtZW50VHlwZSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFJlcXVpcmVkKGJvb2xlYW4pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudF9SZXF1aXJlZCgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2lzUmVxdWlyZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0RWxlbWVudFR5cGUoUU5hbWUpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudF9FbGVtZW50VHlwZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVFOYW1lIGdldEVsZW1lbnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0RWxlbWVudFR5cGUgPGVtPkVsZW1lbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IFR5cGU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFbGVtZW50VHlwZShRTmFtZSB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5zaWJpbGl0eUVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJsZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0ZTg1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0V4dGVuc2libGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2libGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqICBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmxlRWxlbWVudCNnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIDxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRFeHRlbnNpYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJsZUVsZW1lbnQgZXh0ZW5kcyBXU0RMRWxlbWVudHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJsZUVsZW1lbnRfRUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgbWV0aG9kIGlzIHNhbWUgYXMgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpIGFuZCBjb21wYXRpYmxlIHdpdGggdGhlIEpXU0RMIEFQSS4KLSAgICogQHNlZSAjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVGYXVsdDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZHMgYW4gRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdG8gdGhlICc8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBwYXJhbSBleHRFbGVtZW50IEFuIEV4dGVuc2liaWxpdHlFbGVtZW50IHRvIGJlIGFkZGVkLgotICAgKiBAaWdub3JlCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCk7Ci0KLX0gLy8gRXh0ZW5zaWJsZUVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2ZDI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0ZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZhdWx0PC9iPjwvZW0+Jy4KLSAqIEBzaW5jZSAxLjAKLSAqIEBpZ25vcmUKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRGYXVsdCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmF1bHQgZXh0ZW5kcyBNZXNzYWdlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5GYXVsdHsKLX0gLy8gRmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvSW1wb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0ltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTAxNDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkltcG9ydDwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRFRGVmaW5pdGlvbiA8ZW0+RURlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldEVTY2hlbWEgPGVtPkVTY2hlbWE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0SW1wb3J0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbXBvcnQgZXh0ZW5kcyBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5JbXBvcnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWVzcGFjZVVSSShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRJbXBvcnRfTmFtZXNwYWNlVVJJKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TG9jYXRpb25VUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0SW1wb3J0X0xvY2F0aW9uVVJJKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRMb2NhdGlvblVSSSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldExvY2F0aW9uVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVEZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RURlZmluaXRpb248L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RURlZmluaXRpb24oRGVmaW5pdGlvbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydF9FRGVmaW5pdGlvbigpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlEZWZpbml0aW9uIGdldEVEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldEVEZWZpbml0aW9uIDxlbT5FRGVmaW5pdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FRGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVEZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVEZWZpbml0aW9uKERlZmluaXRpb24gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FU2NoZW1hPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVNjaGVtYTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVNjaGVtYTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVTY2hlbWEoWFNEU2NoZW1hKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0SW1wb3J0X0VTY2hlbWEoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JWFNEU2NoZW1hIGdldEVTY2hlbWEoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0RVNjaGVtYSA8ZW0+RVNjaGVtYTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FU2NoZW1hPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RVNjaGVtYSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFU2NoZW1hKFhTRFNjaGVtYSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgbWV0aG9kIGlzIHNhbWUgYXMgZ2V0RVNjaGVtYSgpLgotICAgKiBAc2VlICNnZXRFU2NoZW1hKCkKLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVNjaGVtYTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFhTRFNjaGVtYSBnZXRTY2hlbWEoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBtZXRob2QgaXMgc2FtZSBhcyBzZXRFU2NoZW1hKFhTRFNjaGVtYSkuCi0gICAqIEBzZWUgI3NldEVTY2hlbWEoWFNEU2NoZW1hKQotICAgKiBAcGFyYW0gc2NoZW1hIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVNjaGVtYTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSk7Ci0KLX0gLy8gSW1wb3J0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0lucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0lucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzQwNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9JbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnB1dDwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldElucHV0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnB1dCBleHRlbmRzIE1lc3NhZ2VSZWZlcmVuY2UsIFdTRExFbGVtZW50LCBqYXZheC53c2RsLklucHV0ewotfSAvLyBJbnB1dApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5MTRkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNnZXRFUGFydHMgPGVtPkVQYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlIGV4dGVuZHMgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuTWVzc2FnZXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0UU5hbWUoUU5hbWUpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlX1FOYW1lKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLlFOYW1lIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVFOYW1lIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRRTmFtZShRTmFtZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuZGVmaW5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VW5kZWZpbmVkKGJvb2xlYW4pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlX1VuZGVmaW5lZCgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlib29sZWFuIGlzVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBhcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVQYXJ0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE1lc3NhZ2VfRVBhcnRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUGFydCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBhcnRzKCk7Ci0KLX0gLy8gTWVzc2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlUmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2VSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjM2I0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgUmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIEBzaW5jZSAxLjAKLSAqIEBpZ25vcmUKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2VSZWZlcmVuY2UjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE1lc3NhZ2VSZWZlcmVuY2UoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VSZWZlcmVuY2UgZXh0ZW5kcyBXU0RMRWxlbWVudHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlUmVmZXJlbmNlX05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RU1lc3NhZ2UoTWVzc2FnZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE1lc3NhZ2VSZWZlcmVuY2VfRU1lc3NhZ2UoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIE1lc3NhZ2UgZ2V0RU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RU1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFTWVzc2FnZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0RU1lc3NhZ2UoTWVzc2FnZSB2YWx1ZSk7Ci0KLX0gLy8gTWVzc2FnZVJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9OYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmFkYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9OYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIEBzaW5jZSAxLjAKLSAqIEBpZ25vcmUKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlI2dldFVSSSA8ZW0+VVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk5hbWVzcGFjZSNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXROYW1lc3BhY2UoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVzcGFjZSBleHRlbmRzIEVPYmplY3R7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVSSShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXROYW1lc3BhY2VfVVJJKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRVUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UjZ2V0VVJJIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0VVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXROYW1lc3BhY2VfUHJlZml4KCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UHJlZml4KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9PcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDExMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcGVyYXRpb248L2I+PC9lbT4nLgotICogQHNpbmNlIDEuMAotICogQGlnbm9yZQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFT3V0cHV0IDxlbT5FT3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFRmF1bHRzIDxlbT5FRmF1bHRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFUGFyYW1ldGVyT3JkZXJpbmcgPGVtPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPcGVyYXRpb24gZXh0ZW5kcyBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5PcGVyYXRpb257Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFN0eWxlKE9wZXJhdGlvblR5cGUpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPcGVyYXRpb25fU3R5bGUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uVHlwZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlPcGVyYXRpb25UeXBlIGdldFN0eWxlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFN0eWxlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFN0eWxlKE9wZXJhdGlvblR5cGUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuZGVmaW5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VW5kZWZpbmVkKGJvb2xlYW4pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPcGVyYXRpb25fVW5kZWZpbmVkKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWJvb2xlYW4gaXNVbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVJbnB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUlucHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RUlucHV0KElucHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VJbnB1dCgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlJbnB1dCBnZXRFSW5wdXQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUlucHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVJbnB1dChJbnB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVPdXRwdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RU91dHB1dChPdXRwdXQpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPcGVyYXRpb25fRU91dHB1dCgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlPdXRwdXQgZ2V0RU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFT3V0cHV0IDxlbT5FT3V0cHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVPdXRwdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVPdXRwdXQoT3V0cHV0IHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLkZhdWx0fS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FRmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVGYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPcGVyYXRpb25fRUZhdWx0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLkZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFRmF1bHRzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0fS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPcGVyYXRpb25fRVBhcmFtZXRlck9yZGVyaW5nKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUGFydCIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKTsKLQotfSAvLyBPcGVyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvT3V0cHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL091dHB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTliNjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvT3V0cHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE91dHB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0cHV0IGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZSwgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuT3V0cHV0ewotfSAvLyBPdXRwdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9QYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwY2UyNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9QYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFydDwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVsZW1lbnROYW1lIDxlbT5FbGVtZW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRUeXBlTmFtZSA8ZW0+VHlwZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0VHlwZURlZmluaXRpb24gPGVtPlR5cGUgRGVmaW5pdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVsZW1lbnREZWNsYXJhdGlvbiA8ZW0+RWxlbWVudCBEZWNsYXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRQYXJ0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYXJ0IGV4dGVuZHMgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuUGFydHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRQYXJ0X05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldEVsZW1lbnROYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9FbGVtZW50TmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRFbGVtZW50TmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0RWxlbWVudE5hbWUgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRFbGVtZW50TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFbGVtZW50TmFtZShRTmFtZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VHlwZU5hbWUoUU5hbWUpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRQYXJ0X1R5cGVOYW1lKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLlFOYW1lIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVFOYW1lIGdldFR5cGVOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRUeXBlTmFtZSA8ZW0+VHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFR5cGVOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFR5cGVOYW1lKFFOYW1lIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBEZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgRGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9UeXBlRGVmaW5pdGlvbigpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgWFNEVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldFR5cGVEZWZpbml0aW9uIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgRGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldFR5cGVEZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgdm9pZCBzZXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQgRGVjbGFyYXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9FbGVtZW50RGVjbGFyYXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVsZW1lbnREZWNsYXJhdGlvbiA8ZW0+RWxlbWVudCBEZWNsYXJhdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBEZWNsYXJhdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RU1lc3NhZ2UoTWVzc2FnZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfRU1lc3NhZ2UoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTWVzc2FnZSBnZXRFTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RU1lc3NhZ2UoTWVzc2FnZSB2YWx1ZSk7Ci0KLX0gLy8gUGFydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Qb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2ZDI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydDwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydCBlbGVtZW50LiBBIHBvcnQgZGVmaW5lcyBhbiBpbmRpdmlkdWFsIGVuZHBvaW50IGJ5IHNwZWNpZnlpbmcgYSBzaW5nbGUgYWRkcmVzcyBmb3IgYSBiaW5kaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydCNnZXRFQmluZGluZyA8ZW0+RUJpbmRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLlBvcnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUJpbmRpbmc8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FQmluZGluZzwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmc8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFQmluZGluZyhCaW5kaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydF9FQmluZGluZygpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nIGdldEVCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydCNnZXRFQmluZGluZyA8ZW0+RUJpbmRpbmc8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmc8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFQmluZGluZyhCaW5kaW5nIHZhbHVlKTsKLQotfSAvLyBQb3J0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDJlZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Qb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IFR5cGU8L2I+PC9lbT4nLgotICogQHNpbmNlIDEuMAotICogQGlnbm9yZQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSNnZXRFT3BlcmF0aW9ucyA8ZW0+RU9wZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGUoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvcnRUeXBlIGV4dGVuZHMgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuUG9ydFR5cGV7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGVfUU5hbWUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUU5hbWUgZ2V0UU5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRRTmFtZShRTmFtZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuZGVmaW5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VW5kZWZpbmVkKGJvb2xlYW4pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRQb3J0VHlwZV9VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbn0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRQb3J0VHlwZV9FT3BlcmF0aW9ucygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKTsKLQotfSAvLyBQb3J0VHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9TZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkMDQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZTwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5TZXJ2aWNlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5TZXJ2aWNlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5TZXJ2aWNlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNnZXRFUG9ydHMgPGVtPkVQb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRTZXJ2aWNlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuU2VydmljZXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0UU5hbWUoUU5hbWUpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRTZXJ2aWNlX1FOYW1lKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLlFOYW1lIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVFOYW1lIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRRTmFtZShRTmFtZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuZGVmaW5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VW5kZWZpbmVkKGJvb2xlYW4pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRTZXJ2aWNlX1VuZGVmaW5lZCgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlib29sZWFuIGlzVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFNlcnZpY2VfRVBvcnRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUG9ydCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBvcnRzKCk7Ci0KLX0gLy8gU2VydmljZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE5YmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nLgotICogQHNpbmNlIDEuMAotICogQGlnbm9yZQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFR5cGVzKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlcyBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLlR5cGVzewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogUmV0dXJucyBhIExpc3Qgb2YgaW5saW5lIFhTRFNjaGVtYSBpbnN0YW5jZXMgaW4gdGhpcyBUeXBlcy4gCi0gICAqIEByZXR1cm4gTGlzdCBvZiBYU0RTY2hlbWEgaW5zdGFuY2VzLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWEKLSAgICogQGlnbm9yZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIHBhcmFtZXRlcnM9IiIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgTGlzdCBnZXRTY2hlbWFzKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFJldHVybnMgYSBMaXN0IG9mIGlubGluZSBYU0RTY2hlbWEgaW5zdGFuY2VzIGluIHRoaXMgVHlwZXMuIFRoZSB0YXJnZXROYW1lc3BhY2Ugb2YKLSAgICogdGhlIHNjaGVtYXMgYXJlIHRoZSBzYW1lIGFzIG5hbWVzcGFjZVVSSSBhcmd1bWVudCB2YWx1ZS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYXMgdG8gYmUgc2VhcmNoZWQgZm9yLgotICAgKiBAcmV0dXJuIExpc3Qgb2YgWFNEU2NoZW1hIGluc3RhbmNlcy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hCi0gICAqIEBpZ25vcmUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgTGlzdCBnZXRTY2hlbWFzKFN0cmluZyBuYW1lc3BhY2VVUkkpOwotCi19IC8vIFR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1MmY3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogQHNpbmNlIDEuMAotICogQGlnbm9yZQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0UGFyZW50IDxlbT5QYXJlbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldENoaWxkcmVuIDxlbT5DaGlsZHJlbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hpbGRyZW48L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnR9LgotICAgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGlsZHJlbjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGlsZHJlbjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudF9DaGlsZHJlbigpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0UGFyZW50Ci0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgb3Bwb3NpdGU9InBhcmVudCIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUxpc3QgZ2V0Q2hpbGRyZW4oKTsKLQotfSAvLyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2MGExNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogQHNpbmNlIDEuMAotICogQGlnbm9yZQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5XU0RMRWxlbWVudCNnZXREb2N1bWVudGF0aW9uRWxlbWVudCA8ZW0+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLldTRExFbGVtZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0V1NETEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExFbGVtZW50IGV4dGVuZHMgRU9iamVjdHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRWxlbWVudCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFdTRExFbGVtZW50X0RvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLkRPTUVsZW1lbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRWxlbWVudCBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLldTRExFbGVtZW50I2dldERvY3VtZW50YXRpb25FbGVtZW50IDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRWxlbWVudCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIFRoaXMgaXMgdGhlIHVuZGVybHlpbmcgRE9NIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9uZW50LCAKLSAgICogaS5lLiwgdGhlIHtAbGluayAjdXBkYXRlRWxlbWVudCgpIHNlcmlhbGl6YXRpb259IG9mIHRoaXMgY29tcG9uZW50LgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0RWxlbWVudChFbGVtZW50KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0V1NETEVsZW1lbnRfRWxlbWVudCgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5ET01FbGVtZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5XU0RMRWxlbWVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IHZhbHVlKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogUmV0dXJucyB0aGUgRGVmaW5pdGlvbiB0aGF0IGNvbnRhaW5zIHRoaXMgV1NETCBlbGVtZW50LgotICAgKiBAcmV0dXJuIHRoZSBEZWZpbml0aW9uIHRoYXQgY29udGFpbnMgdGhpcyBXU0RMIGVsZW1lbnQuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBEZWZpbml0aW9uIGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogU2V0cyB0aGUgZW5jbG9zaW5nIGRlZmluaXRpb24gb2YgdGhpcyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uIHRoZSBEZWZpbml0aW9uIHRoYXQgY29udGFpbnMgdGhpcyBXU0RMIGVsZW1lbnQuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pOwotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoYXQgdGhlIHVuZGVybHlpbmcgRE9NIHtAbGluayAjZ2V0RWxlbWVudCBlbGVtZW50fSBib3RoIGV4aXN0cyBhbmQgaXMgdXAtdG8tZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIG1vZGVsLAotICAgKiBpLmUuLCBpdCBzZXJpYWxpemVzIHRoZSBjb21wb25lbnQgYW5kIG1haW50YWlucyBhbiBhc3NvY2lhdGlvbiB3aXRoIHRoYXQgc2VyaWFsaXphdGlvbi4KLSAgICogQHNlZSAjdXBkYXRlRWxlbWVudChib29sZWFuKQotICAgKiBAc2VlICNnZXRFbGVtZW50Ci0gICAqLwotICB2b2lkIHVwZGF0ZUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogRW5zdXJlcyB0aGF0IHRoZSB1bmRlcmx5aW5nIERPTSB7QGxpbmsgI2dldEVsZW1lbnQgZWxlbWVudH0gYm90aCBleGlzdHMgYW5kIGlzIHVwLXRvLWRhdGUgd2l0aCByZXNwZWN0IHRvIHRoZSBtb2RlbCwKLSAgICogaS5lLiwgaXQgc2VyaWFsaXplcyB0aGUgY29tcG9uZW50IGFuZCBtYWludGFpbnMgYW4gYXNzb2NpYXRpb24gd2l0aCB0aGF0IHNlcmlhbGl6YXRpb24uCi0gICAqIEZvciA8Y29kZT5kZWVwID09IHRydWU8L2NvZGU+LCAKLSAgICogb3Igd2hlbiA8Y29kZT57QGxpbmsgI2dldEVsZW1lbnQgZ2V0RWxlbWVudCgpfSA9PSBudWxsPC9jb2RlPiwgCi0gICAqIHRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyB7QGxpbmsgI3VwZGF0ZUVsZW1lbnQoKX07Ci0gICAqIG90aGVyd2lzZSwgaXQgdXBkYXRlcyBqdXN0IHRoZSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb25lbnQgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0ZS4KLSAgICogQHNlZSAjdXBkYXRlRWxlbWVudCgpCi0gICAqIEBzZWUgI2dldEVsZW1lbnQKLSAgICovCi0gIHZvaWQgdXBkYXRlRWxlbWVudChib29sZWFuIGRlZXApOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiBUaGlzIHJlcHJlc2VudHMgdGhlIGNvbmNyZXRlIGNvbnRhaW5lciBvZiB0aGlzIGNvbXBvbmVudCwgCi0gICAqIGkuZS4sIHRoZSBpbnZlcnNlIG9mIHRoZSBibGFjayBkaWFtb25kIHJlbGF0aW9ucyBpbiB0aGUgVU1MIG1vZGVsLgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgcmVmZXJlbmNlLgotICAgKi8KLSAgV1NETEVsZW1lbnQgZ2V0Q29udGFpbmVyKCk7Ci0gIAotICAvKioKLSAgICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoYW5nZWQ7Ci0gICAqIHRoZSBlbGVtZW50IHNob3VsZCB0eXBpY2FsbHkgYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSByZXR1cm5lZCB7QGxpbmsgI2dldEVsZW1lbnR9LgotICAgKiBJdCBpcyBleHBlY3RlZCB0aGF0IGNsaWVudHMgd2lsbCBub3QgY2FsbCB0aGlzIHRoZW1zZWx2ZXMgCi0gICAqIHNpbmNlIHRoZSBET00gZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZSB1bmRlcmx5aW5nIERPTSB3aWxsIGludm9rZSB0aGVzZSBhdXRvbWF0aWNhbGx5LgotICAgKiBAcGFyYW0gY2hhbmdlZEVsZW1lbnQgdGhlIERPTSBlbGVtZW50IGNoYW5nZWQgZm9yIHRoaXMgaW5zdGFuY2UuCi0gICAqLwotICB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpOwotCi19IC8vIFdTRExFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDRlZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVdTRExGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExGYWN0b3J5SW1wbCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0IFR5cGU8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUG9ydFR5cGUgY3JlYXRlUG9ydFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBhcnQgY3JlYXRlUGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3BlcmF0aW9uIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU2VydmljZSBjcmVhdGVTZXJ2aWNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBvcnQgY3JlYXRlUG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlZmluaXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbXBvcnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUltcG9ydCBjcmVhdGVJbXBvcnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnB1dDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlJbnB1dCBjcmVhdGVJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRwdXQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3V0cHV0IGNyZWF0ZU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUZhdWx0IGNyZWF0ZUZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JQmluZGluZ0ZhdWx0IGNyZWF0ZUJpbmRpbmdGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTmFtZXNwYWNlIGNyZWF0ZU5hbWVzcGFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlR5cGVzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlR5cGVzPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVR5cGVzIGNyZWF0ZVR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoKLSAgICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotCS8vV1NETFBhY2thZ2UgZ2V0V1NETFBhY2thZ2UoKTsKLQotfSAvL1dTRExGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzA0MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuCi0gKiAKLSAqIFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4KLSAqIAotICogV1NETCBkZXNjcmliZXMgdGhlIGZvcm1hdHMgb2YgdGhlIG1lc3NhZ2VzIGV4Y2hhbmdlZCBieSB0aGUgc2VydmljZXMsIGFuZCBzdXBwb3J0cyB0aGUgWE1MIFNjaGVtYXMgc3BlY2lmaWNhdGlvbiBhcyBpdHMgY2Fub25pY2FsIHR5cGUgc3lzdGVtLiBUaGlzIHBhY2thZ2UgdXNlcyBhbiBYTUwgU2NoZW1hIEluZm9zZXQgbW9kZWwgcGFja2FnZSAoc2VlIHRoZSBYU0QgcGFja2FnZSkgdG8gZGVzY3JpYmUgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0cy4KLSAqIAotICogVGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkKLSAqIC0gMi4xIERlZmluaXRpb24sIHNob3dzIHRoZSBXU0RMIGRlZmluaXRpb24gZWxlbWVudCBhbmQgdGhlIFdTREwgZG9jdW1lbnQgc3RydWN0dXJlCi0gKiAtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQotICogLSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQotICogLSAyLjIgVHlwZXMsIHNob3dzIHRoZSB1c2Ugb2YgWE1MIFNjaGVtYSB0eXBlcyBpbiBXU0RMCi0gKiAtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4KLSAqIAotICogVGhlIFdTREwgY2xhc3NlcyBleHRlbmQgdGhlIGphdmF4LndzZGwgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEpTUiAxMTAuIENsYXNzZXMgd2l0aCBpbnRlcmZhY2UgYW5kIGRhdGF0eXBlIHN0ZXJlb3R5cGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVzZSBub24tTU9GIGludGVyZmFjZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlCi17Ci0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgU3RyaW5nIGVOQU1FID0gIndzZGwiOwotCi0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9XU0RMIjsKLQotICAvKioKLSAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJ3c2RsIjsKLQotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFdTRExQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsLmluaXQoKTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuV1NETEVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMRWxlbWVudEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRXU0RMRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBXU0RMX0VMRU1FTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFdTRExfRUxFTUVOVF9fRUxFTUVOVCA9IDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Qb3J0VHlwZUltcGwgPGVtPlBvcnQgVHlwZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuUG9ydFR5cGVJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0UG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFID0gMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFX19FTEVNRU5UID0gV1NETF9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX1FOQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFX19VTkRFRklORUQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fUFJPWFkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX1JFU09VUkNFX1VSSSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX0VPUEVSQVRJT05TID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBvcnQgVHlwZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwgPGVtPk9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuT3BlcmF0aW9uSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBPUEVSQVRJT04gPSAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fU1RZTEUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19OQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19VTkRFRklORUQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fUFJPWFkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX1JFU09VUkNFX1VSSSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJbnB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRUlOUFVUID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU91dHB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRU9VVFBVVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRUZBVUxUUyA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORyA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5NZXNzYWdlSW1wbCA8ZW0+TWVzc2FnZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTWVzc2FnZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE1FU1NBR0UgPSAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fUU5BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19VTkRFRklORUQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfX1BST1hZID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fUkVTT1VSQ0VfVVJJID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19FUEFSVFMgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWVzc2FnZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5QYXJ0SW1wbCA8ZW0+UGFydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuUGFydEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFBBUlQgPSA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19OQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRUxFTUVOVF9OQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fVFlQRV9OQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBEZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fVFlQRV9ERUZJTklUSU9OID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBEZWNsYXJhdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04gPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBBUlRfX0VNRVNTQUdFID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhcnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIDxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkV4dGVuc2libGVFbGVtZW50SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEV4dGVuc2libGVFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCTEVfRUxFTUVOVCA9IDEyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nSW1wbCA8ZW0+QmluZGluZzwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ0ltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEJJTkRJTkcgPSA1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX1FOQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fVU5ERUZJTkVEID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJveHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19QUk9YWSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX1JFU09VUkNFX1VSSSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQb3J0IFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19FUE9SVF9UWVBFID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUJpbmRpbmcgT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsIDxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OID0gNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19OQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUJpbmRpbmcgSW5wdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZyBPdXRwdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUJpbmRpbmcgRmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5TZXJ2aWNlSW1wbCA8ZW0+U2VydmljZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuU2VydmljZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFNFUlZJQ0UgPSA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFNFUlZJQ0VfX1FOQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fVU5ERUZJTkVEID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJveHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19QUk9YWSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFNFUlZJQ0VfX1JFU09VUkNFX1VSSSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fRVBPUlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNlcnZpY2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuUG9ydEltcGwgPGVtPlBvcnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlBvcnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0UG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBQT1JUID0gODsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfX05BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZzwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfX0VCSU5ESU5HID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBvcnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIDxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IDk7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsIDxlbT5EZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTiA9IDEwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fVEFSR0VUX05BTUVTUEFDRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fTE9DQVRJT04gPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX1FOQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FTkNPRElORyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRU1FU1NBR0VTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBvcnQgVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VQT1JUX1RZUEVTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUJpbmRpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FQklORElOR1MgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU2VydmljZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VTRVJWSUNFUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVOYW1lc3BhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FTkFNRVNQQUNFUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FVFlQRVMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSW1wb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRUlNUE9SVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuSW1wb3J0SW1wbCA8ZW0+SW1wb3J0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5JbXBvcnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElNUE9SVCA9IDExOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19OQU1FU1BBQ0VfVVJJID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19MT0NBVElPTl9VUkkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElNUE9SVF9fRURFRklOSVRJT04gPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU2NoZW1hPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19FU0NIRU1BID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkltcG9ydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk1lc3NhZ2VSZWZlcmVuY2VJbXBsIDxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfUkVGRVJFTkNFID0gNDY7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuSW5wdXRJbXBsIDxlbT5JbnB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuSW5wdXRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU5QVVQgPSAxMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElOUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElOUFVUX19FTEVNRU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfX05BTUUgPSBNRVNTQUdFX1JFRkVSRU5DRV9fTkFNRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfX0VNRVNTQUdFID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklucHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElOUFVUX0ZFQVRVUkVfQ09VTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk91dHB1dEltcGwgPGVtPk91dHB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuT3V0cHV0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBPVVRQVVQgPSAxNDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPVVRQVVRfX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPVVRQVVRfX05BTUUgPSBNRVNTQUdFX1JFRkVSRU5DRV9fTkFNRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1VUUFVUX19FTUVTU0FHRSA9IE1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1VUUFVUX0ZFQVRVUkVfQ09VTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkZhdWx0SW1wbCA8ZW0+RmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkZhdWx0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEZBVUxUID0gMTU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBGQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBGQVVMVF9fRUxFTUVOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX19OQU1FID0gTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX19FTUVTU0FHRSA9IE1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5GYXVsdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBGQVVMVF9GRUFUVVJFX0NPVU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nSW5wdXRJbXBsIDxlbT5CaW5kaW5nIElucHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nSW5wdXRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0QmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVQgPSAxNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfX05BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0lOUFVUX19FSU5QVVQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0lOUFVUX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nT3V0cHV0SW1wbCA8ZW0+QmluZGluZyBPdXRwdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdPdXRwdXRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0QmluZGluZ091dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVCA9IDE3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1VUUFVUX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX05BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX0VPVVRQVVQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmluZGluZyBPdXRwdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdGYXVsdEltcGwgPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdGYXVsdEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVCA9IDE4OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9fTkFNRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVGYXVsdDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfRkFVTFRfX0VGQVVMVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfRkFVTFRfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk5hbWVzcGFjZUltcGwgPGVtPk5hbWVzcGFjZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTmFtZXNwYWNlSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE5hbWVzcGFjZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBOQU1FU1BBQ0UgPSAxOTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE5BTUVTUEFDRV9fVVJJID0gMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE5BTUVTUEFDRV9fUFJFRklYID0gMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTkFNRVNQQUNFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuUG9ydFR5cGUgPGVtPklQb3J0IFR5cGU8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnRUeXBlCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SVBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElQT1JUX1RZUEUgPSAyMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JUG9ydCBUeXBlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElQT1JUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5PcGVyYXRpb24gPGVtPklPcGVyYXRpb248L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLk9wZXJhdGlvbgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU9QRVJBVElPTiA9IDIxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklPcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLklucHV0IDxlbT5JSW5wdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLklucHV0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElJTlBVVCA9IDIyOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklJbnB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJSU5QVVRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5PdXRwdXQgPGVtPklPdXRwdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLk91dHB1dAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU9VVFBVVCA9IDIzOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklPdXRwdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU9VVFBVVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkZhdWx0IDxlbT5JRmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkZhdWx0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElGQVVMVCA9IDI0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklGYXVsdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJRkFVTFRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5NZXNzYWdlIDxlbT5JTWVzc2FnZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuTWVzc2FnZQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElNRVNTQUdFID0gMjU7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1lc3NhZ2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1FU1NBR0VfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5QYXJ0IDxlbT5JUGFydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuUGFydAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElQQVJUID0gMjY7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SVBhcnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVBBUlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5TZXJ2aWNlIDxlbT5JU2VydmljZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuU2VydmljZQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElTRVJWSUNFID0gMjc7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SVNlcnZpY2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVNFUlZJQ0VfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0IDxlbT5JUG9ydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuUG9ydAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElQb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElQT1JUID0gMjg7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SVBvcnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVBPUlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nIDxlbT5JQmluZGluZzwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZwotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElCSU5ESU5HID0gMjk7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUJpbmRpbmc8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIDxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJQmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJQklORElOR19PUEVSQVRJT04gPSAzMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0lucHV0IDxlbT5JQmluZGluZyBJbnB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ0lucHV0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUJpbmRpbmdJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJQklORElOR19JTlBVVCA9IDMxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX0lOUFVUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ091dHB1dCA8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfT1VUUFVUID0gMzI7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX09VVFBVVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElCaW5kaW5nRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfRkFVTFQgPSAzMzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JQmluZGluZyBGYXVsdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJQklORElOR19GQVVMVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUVYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IDM0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkRlZmluaXRpb24gPGVtPklEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SURlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSURFRklOSVRJT04gPSAzNTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkltcG9ydCA8ZW0+SUltcG9ydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuSW1wb3J0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUltcG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJSU1QT1JUID0gMzY7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUltcG9ydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJSU1QT1JUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5JTGlzdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUxpc3QoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUxJU1QgPSAzNzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTGlzdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTElTVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZhLnV0aWwuTWFwIDxlbT5JTWFwPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YS51dGlsLk1hcAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElNYXAoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU1BUCA9IDM4OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklNYXA8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1BUF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZhLm5ldC5VUkwgPGVtPklVUkw8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZhLm5ldC5VUkwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJVVJMKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElVUkwgPSAzOTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JVVJMPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElVUkxfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IDxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElFWFRFTlNJT05fUkVHSVNUUlkgPSA0MDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElFWFRFTlNJT05fUkVHSVNUUllfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5UeXBlc0ltcGwgPGVtPlR5cGVzPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5UeXBlc0ltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRUeXBlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBUWVBFUyA9IDQxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVFlQRVNfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFRZUEVTX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VHlwZXM8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVFlQRVNfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZhLnV0aWwuSXRlcmF0b3IgPGVtPklJdGVyYXRvcjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvcgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElJdGVyYXRvcigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJSVRFUkFUT1IgPSA0MjsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSXRlcmF0b3I8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUlURVJBVE9SX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuVHlwZXMgPGVtPklUeXBlczwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuVHlwZXMKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJVHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVRZUEVTID0gNDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SVR5cGVzPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElUWVBFU19GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UID0gNDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBVTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBVTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZHJlbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IDQ1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRSA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5YU0QgU2NoZW1hIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGRhdGEgdHlwZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFFOQU1FID0gNDc7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3BlcmF0aW9uIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLk9wZXJhdGlvblR5cGUKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRPcGVyYXRpb25UeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9UWVBFID0gNDg7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RE9NIEVsZW1lbnQ8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RE9NRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBET01fRUxFTUVOVCA9IDQ5OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkV4Y2VwdGlvbjwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFdTRExFeGNlcHRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgV1NETF9FWENFUFRJT04gPSA1MDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5ET00gRG9jdW1lbnQ8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldERPTURvY3VtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IERPTV9ET0NVTUVOVCA9IDUxOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRXU0RMRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50I2dldERvY3VtZW50YXRpb25FbGVtZW50IDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAc2VlICNnZXRXU0RMRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETEVsZW1lbnRfRG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCNnZXRFbGVtZW50KCkKLSAgICogQHNlZSAjZ2V0V1NETEVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFdTRExFbGVtZW50X0VsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUgPGVtPlBvcnQgVHlwZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3J0IFR5cGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UU5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfUU5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2lzVW5kZWZpbmVkKCkKLSAgICogQHNlZSAjZ2V0UG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFBvcnRUeXBlX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2lzUHJveHkgPGVtPlByb3h5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJveHk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjaXNQcm94eSgpCi0gICAqIEBzZWUgI2dldFBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9Qcm94eSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfUmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2dldEVPcGVyYXRpb25zIDxlbT5FT3BlcmF0aW9uczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RU9wZXJhdGlvbnM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0RU9wZXJhdGlvbnMoKQotICAgKiBAc2VlICNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydFR5cGVfRU9wZXJhdGlvbnMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0eWxlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRTdHlsZSgpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1N0eWxlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRPcGVyYXRpb25fTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNpc1VuZGVmaW5lZCgpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3h5PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNpc1Byb3h5KCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRPcGVyYXRpb25fUHJveHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9SZXNvdXJjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RUlucHV0KCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRPcGVyYXRpb25fRUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFT3V0cHV0KCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRPcGVyYXRpb25fRU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVGYXVsdHMgPGVtPkVGYXVsdHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVGYXVsdHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVGYXVsdHMoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FRmF1bHRzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RVBhcmFtZXRlck9yZGVyaW5nIDxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FUGFyYW1ldGVyT3JkZXJpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldE1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1FOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjaXNVbmRlZmluZWQoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm94eTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2lzUHJveHkoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1Jlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2dldEVQYXJ0cyA8ZW0+RVBhcnRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FUGFydHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNnZXRFUGFydHMoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRNZXNzYWdlX0VQYXJ0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0IDxlbT5QYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0UGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UGFydF9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQYXJ0X0VsZW1lbnROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRUeXBlTmFtZSA8ZW0+VHlwZSBOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZSBOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0VHlwZU5hbWUoKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQYXJ0X1R5cGVOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRUeXBlRGVmaW5pdGlvbiA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0VHlwZURlZmluaXRpb24oKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0UGFydF9FbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVNZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0RU1lc3NhZ2UoKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQYXJ0X0VNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcgPGVtPkJpbmRpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5RTmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldFFOYW1lKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19RTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVuZGVmaW5lZDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2lzVW5kZWZpbmVkKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19VbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2lzUHJveHkgPGVtPlByb3h5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJveHk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNpc1Byb3h5KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19Qcm94eSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldFJlc291cmNlVVJJKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19SZXNvdXJjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0RVBvcnRUeXBlIDxlbT5FUG9ydCBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RVBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldEVQb3J0VHlwZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRVBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldEVCaW5kaW5nT3BlcmF0aW9ucyA8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldEVCaW5kaW5nT3BlcmF0aW9ucygpCi0gICAqIEBzZWUgI2dldEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRUJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24gPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmdPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0TmFtZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldEJpbmRpbmdPcGVyYXRpb25fTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RU9wZXJhdGlvbiA8ZW0+RU9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0lucHV0IDxlbT5FQmluZGluZyBJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdJbnB1dCgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdPdXRwdXQgPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nT3V0cHV0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ091dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0ZhdWx0cyA8ZW0+RUJpbmRpbmcgRmF1bHRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FQmluZGluZyBGYXVsdHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0ZhdWx0cygpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdGYXVsdHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSA8ZW0+U2VydmljZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFNlcnZpY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1FOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjaXNVbmRlZmluZWQoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm94eTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2lzUHJveHkoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1Jlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2dldEVQb3J0cyA8ZW0+RVBvcnRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FUG9ydHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNnZXRFUG9ydHMoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlX0VQb3J0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0IDxlbT5Qb3J0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0UG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydCNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0UG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydF9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydCNnZXRFQmluZGluZyA8ZW0+RUJpbmRpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FQmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0I2dldEVCaW5kaW5nKCkKLSAgICogQHNlZSAjZ2V0UG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydF9FQmluZGluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcXVpcmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2lzUmVxdWlyZWQoKQotICAgKiBAc2VlICNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfUmVxdWlyZWQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRFbGVtZW50VHlwZSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWxlbWVudCBUeXBlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldEVsZW1lbnRUeXBlKCkKLSAgICogQHNlZSAjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldEV4dGVuc2liaWxpdHlFbGVtZW50X0VsZW1lbnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24gPGVtPkRlZmluaXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXREZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9UYXJnZXROYW1lc3BhY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0TG9jYXRpb24oKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX0xvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5RTmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldFFOYW1lKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9RTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RW5jb2RpbmcgPGVtPkVuY29kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5jb2Rpbmc8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFbmNvZGluZygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldERlZmluaXRpb25fRW5jb2RpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RU1lc3NhZ2VzIDxlbT5FTWVzc2FnZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVNZXNzYWdlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVNZXNzYWdlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRU1lc3NhZ2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVQb3J0VHlwZXMgPGVtPkVQb3J0IFR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FUG9ydCBUeXBlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVQb3J0VHlwZXMoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RUJpbmRpbmdzIDxlbT5FQmluZGluZ3M8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVCaW5kaW5nczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVCaW5kaW5ncygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRUJpbmRpbmdzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVTZXJ2aWNlcyA8ZW0+RVNlcnZpY2VzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FU2VydmljZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFU2VydmljZXMoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VTZXJ2aWNlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFTmFtZXNwYWNlcyA8ZW0+RU5hbWVzcGFjZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVOYW1lc3BhY2VzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RU5hbWVzcGFjZXMoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VOYW1lc3BhY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFVHlwZXMgPGVtPkVUeXBlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVUeXBlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVUeXBlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRVR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVJbXBvcnRzIDxlbT5FSW1wb3J0czwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RUltcG9ydHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFSW1wb3J0cygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRUltcG9ydHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0IDxlbT5JbXBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SW1wb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBzZWUgI2dldEltcG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0SW1wb3J0X05hbWVzcGFjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBzZWUgI2dldEltcG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0SW1wb3J0X0xvY2F0aW9uVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldEVEZWZpbml0aW9uIDxlbT5FRGVmaW5pdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVEZWZpbml0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCNnZXRFRGVmaW5pdGlvbigpCi0gICAqIEBzZWUgI2dldEltcG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0SW1wb3J0X0VEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldEVTY2hlbWEgPGVtPkVTY2hlbWE8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FU2NoZW1hPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCNnZXRFU2NoZW1hKCkKLSAgICogQHNlZSAjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRVNjaGVtYSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCA8ZW0+RXh0ZW5zaWJsZSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50I2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCNnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkKLSAgICogQHNlZSAjZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQgPGVtPklucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklucHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRwdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRPdXRwdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQgPGVtPkZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQgPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQjZ2V0TmFtZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ0lucHV0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQjZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0I2dldEVJbnB1dCgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ0lucHV0X0VJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0IDxlbT5CaW5kaW5nIE91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0I2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nT3V0cHV0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0I2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0RU91dHB1dCgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQgPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZyBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmdGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQjZ2V0TmFtZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ0ZhdWx0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0I2dldEVGYXVsdCgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXROYW1lc3BhY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UjZ2V0VVJJIDxlbT5VUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlI2dldFVSSSgpCi0gICAqIEBzZWUgI2dldE5hbWVzcGFjZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0TmFtZXNwYWNlX1VSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZSNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWZpeDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UjZ2V0UHJlZml4KCkKLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXROYW1lc3BhY2VfUHJlZml4KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuUG9ydFR5cGUgPGVtPklQb3J0IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnRUeXBlCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLlBvcnRUeXBlIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElQb3J0VHlwZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLk9wZXJhdGlvbiA8ZW0+SU9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JT3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuT3BlcmF0aW9uCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLk9wZXJhdGlvbiIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuSW5wdXQgPGVtPklJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5JbnB1dAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5JbnB1dCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5PdXRwdXQgPGVtPklPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLk91dHB1dAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5PdXRwdXQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkZhdWx0IDxlbT5JRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUZhdWx0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuRmF1bHQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuRmF1bHQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuTWVzc2FnZSA8ZW0+SU1lc3NhZ2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5NZXNzYWdlCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLk1lc3NhZ2UiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5QYXJ0IDxlbT5JUGFydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JUGFydDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLlBhcnQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuUGFydCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJUGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlNlcnZpY2UgPGVtPklTZXJ2aWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklTZXJ2aWNlPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuU2VydmljZQotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5TZXJ2aWNlIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElTZXJ2aWNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuUG9ydCA8ZW0+SVBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVBvcnQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5Qb3J0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLlBvcnQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SVBvcnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nIDxlbT5JQmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JQmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmcKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZyIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJQmluZGluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUJpbmRpbmdPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgPGVtPklCaW5kaW5nIElucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ0lucHV0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkJpbmRpbmdJbnB1dCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJQmluZGluZ0lucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ091dHB1dCA8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklCaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZ091dHB1dCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJQmluZGluZ091dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZ0ZhdWx0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElCaW5kaW5nRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuRGVmaW5pdGlvbiA8ZW0+SURlZmluaXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SURlZmluaXRpb248L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkRlZmluaXRpb24iIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5JbXBvcnQgPGVtPklJbXBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUltcG9ydDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkltcG9ydAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5JbXBvcnQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUltcG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTGlzdCA8ZW0+SUxpc3Q8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUxpc3Q8L2VtPicuCi0gICAqIEBzZWUgamF2YS51dGlsLkxpc3QKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5MaXN0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5NYXAgPGVtPklNYXA8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1hcDwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLnV0aWwuTWFwCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTWFwIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElNYXAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS5uZXQuVVJMIDxlbT5JVVJMPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklVUkw8L2VtPicuCi0gICAqIEBzZWUgamF2YS5uZXQuVVJMCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm5ldC5VUkwiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SVVSTCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMgPGVtPlR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlR5cGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuSXRlcmF0b3IgPGVtPklJdGVyYXRvcjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSXRlcmF0b3I8L2VtPicuCi0gICAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuSXRlcmF0b3IiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUl0ZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuVHlwZXMgPGVtPklUeXBlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JVHlwZXM8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5UeXBlcwotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5UeXBlcyIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJVHlwZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldENoaWxkcmVuIDxlbT5DaGlsZHJlbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hpbGRyZW48L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldENoaWxkcmVuKCkKLSAgICogQHNlZSAjZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRfQ2hpbGRyZW4oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50I2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2NoZW1hPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50I2dldFNjaGVtYSgpCi0gICAqIEBzZWUgI2dldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZSA8ZW0+TWVzc2FnZSBSZWZlcmVuY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWVzc2FnZSBSZWZlcmVuY2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0TWVzc2FnZVJlZmVyZW5jZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0TWVzc2FnZVJlZmVyZW5jZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FTWVzc2FnZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldEVNZXNzYWdlKCkKLSAgICogQHNlZSAjZ2V0TWVzc2FnZVJlZmVyZW5jZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZVJlZmVyZW5jZV9FTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVEYXRhVHlwZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIDxlbT5PcGVyYXRpb24gVHlwZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+T3BlcmF0aW9uIFR5cGU8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLk9wZXJhdGlvblR5cGUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVEYXRhVHlwZSBnZXRPcGVyYXRpb25UeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcudzNjLmRvbS5FbGVtZW50IDxlbT5ET00gRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RE9NIEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLnczYy5kb20uRWxlbWVudCIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRURhdGFUeXBlIGdldERPTUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiA8ZW0+RXhjZXB0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FeGNlcHRpb248L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLldTRExFeGNlcHRpb24iCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVEYXRhVHlwZSBnZXRXU0RMRXhjZXB0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcudzNjLmRvbS5Eb2N1bWVudCA8ZW0+RE9NIERvY3VtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5ET00gRG9jdW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy53M2MuZG9tLkRvY3VtZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFRGF0YVR5cGUgZ2V0RE9NRG9jdW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgV1NETEZhY3RvcnkgZ2V0V1NETEZhY3RvcnkoKTsKLQotfSAvL1dTRExQYWNrYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzliZjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHkuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHkuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0KLQotLyoqCi0gKiBUaGUgPGI+UGx1Z2luPC9iPiBmb3IgdGhlIG1vZGVsLgotICogVGhlIFdTREwgbW9kZWwgbmVlZHMgdG8gYmUgYWJsZSB0byBydW4gd2l0aGluIGFuIEVjbGlwc2Ugd29ya2JlbmNoLAotICogd2l0aGluIGEgaGVhZGxlc3MgRWNsaXBzZSB3b3Jrc3BhY2UsIG9yIGp1c3Qgc3RhbmQtYWxvbmUgYXMgcGFydCAKLSAqIG9mIHNvbWUgb3RoZXIgYXBwbGljYXRpb24uCi0gKiBUbyBzdXBwb3J0IHRoaXMsIGFsbCBhY2Nlc3MgaXMgZGlyZWN0ZWQgdG8gdGhlIHN0YXRpYyBtZXRob2RzLAotICogd2hpY2ggY2FuIHJlZGlyZWN0IHRoZSBzZXJ2aWNlIGFzIGFwcG9wcmlhdGUgdG8gdGhlIHJ1bnRpbWUuCi0gKiBEdXJpbmcgc3RhbmQtYWxvbmUgaW52b2NhdGlvbiBubyBwbHVnaW4gaW5pdGlhbGl6YXRpb24gdGFrZXMgcGxhY2UuCi0gKiBJbiB0aGlzIGNhc2UgeW91IHdpbGwgbmVlZCB0aGUgcmVzb3VyY2VzIGphciBvbiB0aGUgY2xhc3MgcGF0aC4KLSAqIEBzZWUgI2dldEJhc2VVUkwKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0RMUGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIAotewotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGx1Z2luLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXU0RMUGx1Z2luIElOU1RBTkNFID0gbmV3IFdTRExQbHVnaW4oKTsKLQotICAvKioKLSAgICogVGhlIG9uZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgKi8KLSAgc3RhdGljIFdTRExQbHVnaW5JbXBsZW1lbnRhdGlvbiBwbHVnaW47Ci0gIAotICBwcml2YXRlIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotICAgKi8KLSAgcHJpdmF0ZSBXU0RMUGx1Z2luKCkKLSAgewotICAgIHN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7Ci0gIH0KLQotICAvKgotICAgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGJhc2UgY2xhc3MuCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpCi0gIHsKLSAgICByZXR1cm4gcGx1Z2luOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NETFBsdWdpbkltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpCi0gIHsKLSAgICByZXR1cm4gcGx1Z2luOwotICB9Ci0KLSAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwgaW50ZXJuYWxHZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSA9IG5ldyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwoKTsKLSAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIoZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIHJldHVybiBpbnRlcm5hbEdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KG5hbWVzcGFjZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpCi0gIHsgICAKLSAgICByZXR1cm4gaW50ZXJuYWxHZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEZhY3RvcnkgY3JlYXRlV1NETDRKRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFdTRExGYWN0b3J5SW1wbCgpOyAgIAkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGx1Z2luSW1wbGVtZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBsdWdpbkltcGxlbWVudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDJiN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGx1Z2luSW1wbGVtZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbi5FY2xpcHNlUGx1Z2luOwotCi0vKioKLSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMS4wCi0gKi8KLSAgcHVibGljIGNsYXNzIFdTRExQbHVnaW5JbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4KLSAgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIFdTRExQbHVnaW5JbXBsZW1lbnRhdGlvbigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLQotICAgICAgLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLSAgICAgIC8vCi0gICAgICBXU0RMUGx1Z2luLnBsdWdpbiA9IHRoaXM7Ci0gICAgfQotICB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjU1NGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YU0QgU2NoZW1hIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiBAc2luY2UgMS4wCi0gKiBAaWdub3JlCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50I2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldFNjaGVtYShYU0RTY2hlbWEpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFhTRFNjaGVtYSBnZXRTY2hlbWEoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0U2NoZW1hKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHZhbHVlKTsKLQotfSAvLyBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTJmYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19MT0FESU5HX0VSUk9SID0gIkNMQVNTX0xPQURJTkdfRVJST1IiOwotICAKLSAgcHJvdGVjdGVkIEJ1bmRsZSBidW5kbGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsgIAotICBwcm90ZWN0ZWQgT2JqZWN0IGZhY3Rvcnk7Ci0KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgQnVuZGxlIGJ1bmRsZSkKLSAgewotICAgIHRoaXMuYnVuZGxlID0gYnVuZGxlOwotICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICB9Ci0KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBnZXRFeHRlbnNpYmxpdHlFbGVtZW50RmFjdG9yeSgpCi0gIHsKLSAgICBpZiAoZmFjdG9yeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgZmFjdG9yeSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkpdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZmFjdG9yeSA9IENMQVNTX0xPQURJTkdfRVJST1I7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWN0b3J5ICE9IENMQVNTX0xPQURJTkdfRVJST1IgPyAoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KWZhY3RvcnkgOiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpYmxpdHlFbGVtZW50RmFjdG9yeShFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSkKLSAgewotICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmMwMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5leHRlbnNpYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeQotewotICBwcm90ZWN0ZWQgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAKLSAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBuYW1lc3BhY2UsIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgewotICAgIG1hcC5wdXQobmFtZXNwYWNlLCBkZXNjcmlwdG9yKTsKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSByZXN1bHQgPSBudWxsOwotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yKW1hcC5nZXQobmFtZXNwYWNlKTsKLSAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRlc2NyaXB0b3IuZ2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UsIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IobnVsbCxuYW1lc3BhY2UsbnVsbCk7Ci0gICAgZGVzY3JpcHRvci5zZXRFeHRlbnNpYmxpdHlFbGVtZW50RmFjdG9yeShmYWN0b3J5KTsKLSAgICBtYXAucHV0KG5hbWVzcGFjZSxkZXNjcmlwdG9yKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiZTlhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gV1NETFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTeW1ib2xpY05hbWUoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OQU1FID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsIGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSA9IGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotCUlFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyByZXNvbHZlKFVSTCBwbGF0Zm9ybVVSTCwgU3RyaW5nIHJlbGF0aXZlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHJlc29sdmVkVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZShwbGF0Zm9ybVVSTCk7Ci0gICAgcmV0dXJuIHJlc29sdmVkVVJMLnRvU3RyaW5nKCkgKyByZWxhdGl2ZVBhdGg7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVF9OQU1FKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IoY2xhc3NOYW1lLG5hbWVzcGFjZSxwbHVnaW5CdW5kbGUpOwotICAgICAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LnB1dChuYW1lc3BhY2UsIGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvQmFzZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvQmFzZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjkzNDVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL0Jhc2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VHZW5lcmF0b3IgewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVmTmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlOwotCXByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0JcHJvdGVjdGVkIENvbnRlbnRHZW5lcmF0b3IgY29udGVudEdlbmVyYXRvcjsKLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50R2VuZXJhdG9yKENvbnRlbnRHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCWNvbnRlbnRHZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBDb250ZW50R2VuZXJhdG9yIGdldENvbnRlbnRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiBjb250ZW50R2VuZXJhdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZShib29sZWFuIG92ZXJ3cml0ZSkgewotCQl0aGlzLm92ZXJ3cml0ZSA9IG92ZXJ3cml0ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0T3ZlcndyaXRlKCkgewotCQlyZXR1cm4gb3ZlcndyaXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlZk5hbWUoU3RyaW5nIHJlZk5hbWUpIHsKLQkJdGhpcy5yZWZOYW1lID0gcmVmTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZWZOYW1lKCkgewotCQlyZXR1cm4gcmVmTmFtZTsKLQl9Ci0JCi0JcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGRlZmluaXRpb247Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCWlmIChjb250ZW50R2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50R2VuZXJhdG9yLmdldFByb3RvY29sKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL0JpbmRpbmdHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL0JpbmRpbmdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhNDk5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9CaW5kaW5nR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuZXh0ZW5zaW9uLkNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnk7Ci0KLS8qCi0gKiBDbGFzcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBCaW5kaW5nIGFuZCBpdCdzIGNvbnRlbnQuICBXZSBsb29rIGluIHRoZSByZWdpc3RyeSBmb3IKLSAqIGFwcHJvcHJpYXRlIENvbnRlbnRHZW5lcmF0b3IgY2xhc3NlcyBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgQmluZGluZyBDb250ZW50J3MgbmFtZXNwYWNlLgotICogQWx0ZXJuYXRpdmVseSwgdXNlcnMgY2FuIHBhc3MgaW4gYSBuYW1lc3BhY2UgdGhyb3VnaCB0aGUgY29uc3RydWN0b3IgdG8gc3BlY2lmeSB3aGljaAotICogbmFtZXNwYWNlIHRvIHVzZSB3aGVuIHNlYXJjaGluZyB0aGUgcmVnaXN0cnkuCi0gKiAKLSAqIFRoZSBDb250ZW50R2VuZXJhdG9yIG1heSBhbHNvIGJlIHNldCBtYW51YWxseSBieSBjYWxsaW5nCi0gKiBzZXRDb250ZW50R2VuZXJhdG9yKENvbnRlbnRHZW5lcmF0b3IpLgotICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ0dlbmVyYXRvciBleHRlbmRzIEJhc2VHZW5lcmF0b3IgewotCXByaXZhdGUgV1NETEZhY3RvcnkgZmFjdG9yeSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRTsKLQlwcml2YXRlIEJpbmRpbmcgYmluZGluZzsKLQotCS8qCi0JICogV2hlbiB0aGUgY29uc3RydWN0b3IgaXMgdXNlZCwgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIHJldHJpZXZlIGEgcHJvcGVyCi0JICogQ29udGVudEdlbmVyYXRvciBiYXNlZCBvbiB0aGUgQmluZGluZyBnaXZlbi4gIFRoZSBDb250ZW50R2VuZXJhdG9yIG1heQotCSAqIGJlIHJlcGxhY2VkIGJ5IGNhbGxpbmcgc2V0Q29udGVudEdlbmVyYXRvcihDb250ZW50R2VuZXJhdG9yKS4KLQkgKi8KLQlwdWJsaWMgQmluZGluZ0dlbmVyYXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24sIEJpbmRpbmcgYmluZGluZykgewkKLQkJdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkJdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLQkJY29udGVudEdlbmVyYXRvciA9IGdldENvbnRlbnRHZW5lcmF0b3IoYmluZGluZyk7Ci0JfQotCi0JLyoKLQkgKiBXaGVuIHRoZSBjb25zdHJ1Y3RvciBpcyB1c2VkLCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gcmV0cmlldmUgYSBwcm9wZXIKLQkgKiBDb250ZW50R2VuZXJhdG9yIGJhc2VkIG9uIHRoZSBuYW1lc3BhY2UgZ2l2ZW4uICBUaGUgQ29udGVudEdlbmVyYXRvciBtYXkKLQkgKiBiZSByZXBsYWNlZCBieSBjYWxsaW5nIHNldENvbnRlbnRHZW5lcmF0b3IoQ29udGVudEdlbmVyYXRvcikuCi0JICovCi0JcHVibGljIEJpbmRpbmdHZW5lcmF0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBCaW5kaW5nIGJpbmRpbmcsIFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkJdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLQkJY29udGVudEdlbmVyYXRvciA9IGdldENvbnRlbnRHZW5lcmF0b3IobmFtZXNwYWNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRHZW5lcmF0b3IgZ2V0Q29udGVudEdlbmVyYXRvcihCaW5kaW5nIGJpbmRpbmcpIHsKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiBGaW5kIHRoZSByZWdlaXN0ZXJlZCBDb250ZW50IEdlbmVyYXRvciBmb3IgdGhlIEJpbmRpbmcKLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJLy8gR2V0IEJpbmRpbmdDb250ZW50IG5hbWVzcGFjZQotCQlTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLQkJTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQkJaWYgKGVlTGlzdC5zaXplKCkgPiAwKSB7Ci0JICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZWVMaXN0LmdldCgwKTsJCQkKLQkJCS8vIFRPRE86IFFOYW1lIHFOYW1lID0gZWUuZ2V0RWxlbWVudFR5cGUoKTsgZ28gZ2V0IHRoZSBuYW1lc3BhY2UgaW5zdGVhZD8KLQkgICAgICAgIG5hbWVzcGFjZSA9IGVlLmdldEVsZW1lbnQoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCXJldHVybiBnZXRDb250ZW50R2VuZXJhdG9yKG5hbWVzcGFjZSk7Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29udGVudEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJQ29udGVudEdlbmVyYXRvciBjb250ZW50R2VuID0gbnVsbDsKLQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0JCQlDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsgCi0JCQljb250ZW50R2VuID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEdlbmVyYXRvckNsYXNzRnJvbU5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQl9Ci0JCQotCQlyZXR1cm4gY29udGVudEdlbjsJCQotCX0KLQkKLQlwcml2YXRlIEJpbmRpbmcgY3JlYXRlRW1wdHlCaW5kaW5nKFN0cmluZyBsb2NhbE5hbWUpIHsKLQkgICAgQmluZGluZyBuZXdCaW5kaW5nID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmcoKTsKLQkJbmV3QmluZGluZy5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSxsb2NhbE5hbWUpKTsKLQkJbmV3QmluZGluZy5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotCSAgICBkZWZpbml0aW9uLmFkZEJpbmRpbmcobmV3QmluZGluZyk7Ci0JCQotCQlyZXR1cm4gbmV3QmluZGluZzsKLQl9Ci0KLQkvKgotCSAqIFRPRE86IFNjZW5hcmlvOgotCSAqIDEpb3ZlcndyaXRlID09IGZhbHNlCi0JICogMilCaW5kaW5nT3BlcmF0aW9uIHdpdGggMSBpbnB1dAotCSAqIDMpQ29ycmVzcG9uZGluZyBPcGVyYXRpb24gKHdpdGggc2FtZSBuYW1lKSB3aXRoIDEgaW5wdXQgYW5kIDEgb3V0cHV0Ci0JICogSWYgd2UgZ2VuZXJhdGUgd2l0aCBvdmVyd3JpdGUgPT0gZmFsc2UsIG5vdGhpbmcgaXMgZG9uZS4gIFRodXMsICBhbgotCSAqIG91dHB1dCBpcyBub3QgZ2VuZXJhdGVkIG9uIHRoZSBCaW5kaW5nT3BlcmF0aW9uLiAgVGhpcyBpcyBiZWNhdXNlIHdlCi0JICogc2VhcmNoIGZvciBleGlzdGluZyBFbGVtZW50cyBvbmx5IGF0IHRoZSBsZXZlbCBvZiBCaW5kaW5nT3BlcmF0aW9ucy4KLQkgKiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIEJpbmRpbmdPcGVyYXRpb24gd2l0aCB0aGUgc2FtZQotCSAqIG5hbWUgYXMgb3VyIE9wZXJhdGlvbiwgbGVhdmUgaXQgYWxvbmUuLi4uIGJ1dCBzaW5jZSB0aGVyZSBpcyBhbHJlYWR5Ci0JICogYSBCaW5kaW5nT3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSwgd2UgZG9uJ3QgY3JlYXRlIGEgbmV3IEJpbmRpbmdPcGVyYXRpb24uCi0JICogCi0JICogVGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gaXMgcmVkdWNlIHRoaXMgZ3JhbnVsYXJpdHkgdG8gdGhlIE1lc3NhZ2VSZWZlcmVuY2UKLQkgKiBsZXZlbC4gIFRoZSBjb2RlIGlzIGFsbW9zdCB0aGVyZSBleGNlcHQgZm9yIGhvdyB3ZSBnZW5lcmF0ZSB0aGUgQmluZGluZyBlbGVtZW50Ci0JICogY29udGVudC4gIExvb2sgYXQgQmluZGluZ0dlbnJhdG9yLmdlbmVyYXRlQmluZGluZ09wZXJhdGlvbigpIGFuZAotCSAqIFNPQVBDb250ZW50R2VuZXJhdG9yLmphdmEgYW5kIGl0J3MgY29udGVudCBnZW5lcmF0aW9uIG1ldGhvZAotCSAqIGZvciBhIGdvb2QgcGxhY2UgdG8gc3RhcnQuCi0JICogCi0JICogRm9yIHd0cCBSQzEsIFdlIHNoYWxsIG9ubHkgbG9vayBhdCB0aGUgT3BlcmF0aW9uIGxldmVsIChhcyB3ZSBkbyBpbiB0aGUgcHJldmlvdXMKLQkgKiB2ZXJzaW9uKS4KLQkgKi8KLQlwdWJsaWMgQmluZGluZyBnZW5lcmF0ZUJpbmRpbmcoKSB7Ci0JCXRyeSB7Ci0JCS8vIElmIEJpbmRpbmcgaXMgbnVsbCAoTm8gQmluZGluZyB3YXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yKSwgd2UgY3JlYXRlIGFuIGVtcHR5IEJpbmRpbmcgZmlyc3QuCi0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCWJpbmRpbmcgPSBjcmVhdGVFbXB0eUJpbmRpbmcoZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoZ2V0TmFtZSgpICE9IG51bGwgJiYgIWJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoZ2V0TmFtZSgpKSkgewotCQkJYmluZGluZy5zZXRRTmFtZShuZXcgUU5hbWUoYmluZGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBnZXROYW1lKCkpKTsKLQkJfQotCQlpZiAoZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsKLQkJCVBvcnRUeXBlIHBvcnRUeXBlID0gZ2V0UG9ydFR5cGUoKTsKLQkJCWJpbmRpbmcuc2V0RVBvcnRUeXBlKHBvcnRUeXBlKTsKLQkJCWlmIChwb3J0VHlwZSA9PSBudWxsKSB7Ci0JCQkJLy9UaGUgbW9kZWwgZG9lc24ndCByZWNvbmlsZSB3aXRoIGl0J3MgRWxlbWVudCBwcm9wZXJseSB3aGVuIHdlJ3JlIHNldHRpbmcgYSBudWxsIGZvciBpdCdzIFBvcnRUeXBlCi0JCQkJYmluZGluZy5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKCJ0eXBlIiwgIiIpOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBiaW5kaW5nT3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCk7CQkKLQkJUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotCQkKLQkJaWYgKCFnZXRPdmVyd3JpdGUoKSkgewotCQkJLy8gRG9uJ3QgT3ZlcndyaXRlCi0JCQlpZiAocG9ydFR5cGUgPT0gbnVsbCkgewotCQkJCXJldHVybiBiaW5kaW5nOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkUmVxdWlyZWROYW1lc3BhY2VzKGJpbmRpbmcpOwkJCQkKLQkJCQlMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCk7Ci0JCQkJCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCQkgKiBEZXRlcm1pbmUgd2hpY2ggT3BlcmF0aW9ucyByZXF1aXJlIG5ldyBhIG5ldyBjb3JyZXNwb25kaW5nIEJpbmRpbmdPcGVyYXRpb25zCi0JCQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkJTGlzdCBuZXdCaW5kaW5nT3BzTmVlZGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBvcGVyYXRpb25zLnNpemUoKTsgaW5kZXgrKykgewotCQkJCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5nZXQoaW5kZXgpOwotCQkJCQkKLQkJCQkJYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCQkJCUl0ZXJhdG9yIGJpbmRpbmdPcGVyYXRpb25zSXQgPSBiaW5kaW5nT3BlcmF0aW9ucy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoYmluZGluZ09wZXJhdGlvbnNJdC5oYXNOZXh0KCkpIHsKLQkJCQkJCUJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BlcmF0aW9uc0l0Lm5leHQoKTsKLQkJCQkJCQotCQkJCQkJaWYgKG5hbWVzRXF1YWwoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCksIG9wZXJhdGlvbi5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJZm91bmRNYXRjaCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICghZm91bmRNYXRjaCl7Ci0JCQkJCQluZXdCaW5kaW5nT3BzTmVlZGVkLmFkZChvcGVyYXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5ld0JpbmRpbmdPcHNOZWVkZWQgaXMgdGhlIExpc3Qgb2YgT3BlcmF0aW9ucyBuZWVkaW5nIG5ldyBjb3JyZXNwb25kaW5nCi0JCQkJLy8gQmluZGluZ09wZXJhdGlvbidzCi0JCQkJTGlzdCBuZXdCaW5kaW5nT3BzID0gY3JlYXRlTmV3QmluZGluZ09wZXJhdGlvbnMobmV3QmluZGluZ09wc05lZWRlZCk7Ci0JCQkJCi0JCQkJLy8gR2VuZXJhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcgQmluZGluZ09wZXJhdGlvbidzCi0JCQkJSXRlcmF0b3IgbmV3QmluZGluZ09wc0l0ID0gbmV3QmluZGluZ09wcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChuZXdCaW5kaW5nT3BzSXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUJpbmRpbmdPcGVyYXRpb24gbmV3QmluZGluZ09wID0gKEJpbmRpbmdPcGVyYXRpb24pIG5ld0JpbmRpbmdPcHNJdC5uZXh0KCk7Ci0JCQkJCWdlbmVyYXRlQmluZGluZ09wZXJhdGlvbihuZXdCaW5kaW5nT3ApOwotCQkJCQlnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KG5ld0JpbmRpbmdPcCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlnZW5lcmF0ZUJpbmRpbmdDb250ZW50KGJpbmRpbmcpOwkKLQkJfQotCQllbHNlIHsKLQkJCS8vIE92ZXJ3cml0ZQotCQkJaWYgKHBvcnRUeXBlID09IG51bGwpIHsKLQkJCQkvLyBXZSBuZWVkIHRvIGJsb3cgYXdheSBldmVyeXRoaW5nIHVuZGVyIHRoZSBCaW5kaW5nLiAgTm8gUG9ydFR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmluZGluZwotCQkJCWJpbmRpbmdPcGVyYXRpb25zLmNsZWFyKCk7Ci0JCQkJcmV0dXJuIGJpbmRpbmc7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRSZXF1aXJlZE5hbWVzcGFjZXMoYmluZGluZyk7CQkJCQotCQkJCUxpc3Qgb3BlcmF0aW9ucyA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKTsKLQkJCQkKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQkJICogQ29tcGFyZSB0aGUgT3BlcmF0aW9ucwotCQkJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkJLy8gUmVtb3ZlIGFueSBCaW5kaW5nT3BlcmF0aW9ucyB3aGljaCBhcmUgbm8gbG9uZ2VyIHVzZWQKLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYmluZGluZ09wZXJhdGlvbnMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQkJCUJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BlcmF0aW9ucy5nZXQoaW5kZXgpOwotCQkJCQkKLQkJCQkJYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCQkJCUl0ZXJhdG9yIG9wZXJhdGlvbnNJdCA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKG9wZXJhdGlvbnNJdC5oYXNOZXh0KCkpIHsKLQkJCQkJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zSXQubmV4dCgpOwotCQkJCQkJCi0JCQkJCQlpZiAobmFtZXNFcXVhbChiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgb3BlcmF0aW9uLmdldE5hbWUoKSkpIHsKLQkJCQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCFmb3VuZE1hdGNoKXsKLQkJCQkJCS8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoaXMgQmluZGluZ0ZhdWx0IGZyb20gdGhlIGJpbmRpbmdGYXVsdHMgTGlzdAotCQkJCQkJYmluZGluZ09wZXJhdGlvbnMucmVtb3ZlKGluZGV4KTsKLQkJCQkJCWluZGV4LS07Ci0JCQkJCX0JCQkKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gUmVtb3ZlIGFueSBPcGVyYXRpb25zIHdoaWNoIGFscmVhZHkgZXhpc3RzIGluIGJpbmRpbmdPcGVyYXRpb25zLiAgV2hhdCB3ZQotCQkJCS8vIGhhdmUgbGVmdCBhcmUgdGhlIE9wZXJhdGlvbnMgd2hpY2ggbmVlZHMgbmV3bHkgY3JlYXRlZCBCaW5kaW5nT3BlcmF0aW9ucwotCQkJCUxpc3QgYmluZGluZ09wZXJhdGlvbnNOZWVkZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG9wZXJhdGlvbnMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQkJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldChpbmRleCk7Ci0JCQkJCQotCQkJCQlib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLQkJCQkJSXRlcmF0b3IgYmluZGluZ09wZXJhdGlvbnNJdCA9IGJpbmRpbmdPcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChiaW5kaW5nT3BlcmF0aW9uc0l0Lmhhc05leHQoKSkgewotCQkJCQkJQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPcGVyYXRpb25zSXQubmV4dCgpOwotCQkJCQkJCi0JCQkJCQlpZiAobmFtZXNFcXVhbChiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgb3BlcmF0aW9uLmdldE5hbWUoKSkpIHsKLQkJCQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCFmb3VuZE1hdGNoKXsKLQkJCQkJCS8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoaXMgQmluZGluZ0ZhdWx0IGZyb20gdGhlIGJpbmRpbmdGYXVsdHMgTGlzdAotCQkJCQkJYmluZGluZ09wZXJhdGlvbnNOZWVkZWQuYWRkKG9wZXJhdGlvbik7IC8vIFN0b3JlIHRoZSBhY3R1YWwgT3BlcmF0aW9uCi0JCQkJCX0JCQkKLQkJCQl9CQkKLQkJCQkKLQkJCQkvLyBDcmVhdGUgcmVxdWlyZWQgQmluZGluZ09wZXJhdGlvbnMKLQkJCQljcmVhdGVOZXdCaW5kaW5nT3BlcmF0aW9ucyhiaW5kaW5nT3BlcmF0aW9uc05lZWRlZCk7Ci0KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQkJICogUHJvY2VzcyB0aGUgY29udGVudHMgb2YgdGhlIE9wZXJhdGlvbnMKLQkJCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJCUl0ZXJhdG9yIGJpbmRpbmdPcGVyYXRpb25zSXQgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGJpbmRpbmdPcGVyYXRpb25zSXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWdlbmVyYXRlQmluZGluZ09wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ09wZXJhdGlvbnNJdC5uZXh0KCkpOwotCQkJCX0KLQkJCQkKLQkJCQlnZW5lcmF0ZUJpbmRpbmdDb250ZW50KGJpbmRpbmcpOwotCQkJCQotCQkJCXJldHVybiBiaW5kaW5nOwotCQkJfQkJCQotCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIExpc3QgY3JlYXRlTmV3QmluZGluZ09wZXJhdGlvbnMoTGlzdCBvcGVyYXRpb25zKSB7Ci0JCUxpc3QgbmV3QmluZGluZ09wcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUl0ZXJhdG9yIG5lZWRlZEJpbmRpbmdPcGVyYXRpb25zSXQgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChuZWVkZWRCaW5kaW5nT3BlcmF0aW9uc0l0Lmhhc05leHQoKSkgewotCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG5lZWRlZEJpbmRpbmdPcGVyYXRpb25zSXQubmV4dCgpOwotCQkJQmluZGluZ09wZXJhdGlvbiBuZXdCaW5kaW5nT3BlcmF0aW9uID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0JCQluZXdCaW5kaW5nT3BlcmF0aW9uLnNldEVPcGVyYXRpb24ob3BlcmF0aW9uKTsKLQkJCW5ld0JpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQkJCWJpbmRpbmcuYWRkQmluZGluZ09wZXJhdGlvbihuZXdCaW5kaW5nT3BlcmF0aW9uKTsKLQkJCQotCQkJbmV3QmluZGluZ09wcy5hZGQobmV3QmluZGluZ09wZXJhdGlvbik7Ci0JCX0KLQkJCi0JCXJldHVybiBuZXdCaW5kaW5nT3BzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikgewotCQlCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCk7Ci0JCUJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLQkJTGlzdCBiaW5kaW5nRmF1bHRzID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpOwotCQkKLQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpOwotCQlJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLQkJT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0JCUxpc3QgZmF1bHRzID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKTsKLQotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCSAqIENvbXBhcmUgdGhlIE9wZXJhdGlvbiBuYW1lcwotCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkJCi0JCWlmICghbmFtZXNFcXVhbChiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgb3BlcmF0aW9uLmdldE5hbWUoKSkpIHsKLQkJCWJpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJICogQ29tcGFyZSB0aGUgT3V0cHV0Ci0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCWlmIChvdXRwdXQgPT0gbnVsbCkgewotCQkJYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nT3V0cHV0KG51bGwpOwkJCQotCQl9Ci0JCWVsc2UgewotCQkJLy8gQ3JlYXRlIEJpbmRpbmdPdXRwdXQgaWYgbmVjZXNzYXJ5Ci0JCQlpZiAoYmluZGluZ091dHB1dCA9PSBudWxsKSB7Ci0JCQkJQmluZGluZ091dHB1dCBuZXdCaW5kaW5nT3V0cHV0ID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0JCQkJbmV3QmluZGluZ091dHB1dC5zZXRFT3V0cHV0KG91dHB1dCk7Ci0JCQkJbmV3QmluZGluZ091dHB1dC5zZXROYW1lKG91dHB1dC5nZXROYW1lKCkpOwotCQkJCWJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChuZXdCaW5kaW5nT3V0cHV0KTsJCQkJCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBDb21wYXJlIHRoZSBPdXRwdXQgbmFtZXMKLQkJCQlpZiAoIW5hbWVzRXF1YWwoYmluZGluZ091dHB1dC5nZXROYW1lKCksIG91dHB1dC5nZXROYW1lKCkpKSB7Ci0JCQkJCWJpbmRpbmdPdXRwdXQuc2V0TmFtZShvdXRwdXQuZ2V0TmFtZSgpKTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCWdlbmVyYXRlQmluZGluZ091dHB1dENvbnRlbnQoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpKTsKLQkJCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJICogQ29tcGFyZSB0aGUgSW5wdXQKLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJaWYgKGlucHV0ID09IG51bGwpIHsKLQkJCWJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KG51bGwpOwkJCQotCQl9Ci0JCWVsc2UgewotCQkJLy8gQ3JlYXRlIEJpbmRpbmdJbnB1dCBpZiBuZWNlc3NhcnkKLQkJCWlmIChiaW5kaW5nSW5wdXQgPT0gbnVsbCkgewotCQkJCUJpbmRpbmdJbnB1dCBuZXdCaW5kaW5nSW5wdXQgPSBmYWN0b3J5LmNyZWF0ZUJpbmRpbmdJbnB1dCgpOwotCQkJCW5ld0JpbmRpbmdJbnB1dC5zZXRFSW5wdXQoaW5wdXQpOwotCQkJCW5ld0JpbmRpbmdJbnB1dC5zZXROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JCQkJYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQobmV3QmluZGluZ0lucHV0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIENvbXBhcmUgdGhlIElucHV0IG5hbWVzCi0JCQkJaWYgKCFuYW1lc0VxdWFsKGJpbmRpbmdJbnB1dC5nZXROYW1lKCksIGlucHV0LmdldE5hbWUoKSkpIHsKLQkJCQkJYmluZGluZ0lucHV0LnNldE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpKTsKLQkJCi0JCQotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCSAqIENvbXBhcmUgdGhlIEZhdWx0cwotCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkvLyBSZW1vdmUgYW55IEJpbmRpbmdGYXVsdHMgd2hpY2ggYXJlIG5vIGxvbmdlciB1c2VkCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBiaW5kaW5nRmF1bHRzLnNpemUoKTsgaW5kZXgrKykgewotCQkJQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGJpbmRpbmdGYXVsdHMuZ2V0KGluZGV4KTsKLQkJCQotCQkJYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCQlJdGVyYXRvciBmYXVsdHNJdCA9IGZhdWx0cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGZhdWx0c0l0Lmhhc05leHQoKSkgewotCQkJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBmYXVsdHNJdC5uZXh0KCk7Ci0JCQkJaWYgKG5hbWVzRXF1YWwoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgZmF1bHQuZ2V0TmFtZSgpKSkgewotCQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIWZvdW5kTWF0Y2gpewotCQkJCS8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoaXMgQmluZGluZ0ZhdWx0IGZyb20gdGhlIGJpbmRpbmdGYXVsdHMgTGlzdAotCQkJCWJpbmRpbmdGYXVsdHMucmVtb3ZlKGluZGV4KTsKLQkJCQlpbmRleC0tOwotCQkJfQkJCQotCQl9Ci0JCQotCQkvLyBSZW1vdmUgYW55IEZhdWx0cyB3aGljaCBhbHJlYWR5IGV4aXN0cyBpbiBiaW5kaW5nRmF1bHRzLiAgV2hhdCB3ZQotCQkvLyBoYXZlIGxlZnQgYXJlIHRoZSBGYXVsdHMgd2hpY2ggbmVlZHMgbmV3bHkgY3JlYXRlZCBCaW5kaW5nRmF1bHRzCi0JCUxpc3QgYmluZGluZ0ZhdWx0c05lZWRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGZhdWx0cy5zaXplKCk7IGluZGV4KyspIHsKLQkJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBmYXVsdHMuZ2V0KGluZGV4KTsKLQkJCQotCQkJYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCQlJdGVyYXRvciBiaW5kaW5nRmF1bHRzSXQgPSBiaW5kaW5nRmF1bHRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYmluZGluZ0ZhdWx0c0l0Lmhhc05leHQoKSkgewotCQkJCUJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBiaW5kaW5nRmF1bHRzSXQubmV4dCgpOwotCQkJCWlmIChuYW1lc0VxdWFsKGJpbmRpbmdGYXVsdC5nZXROYW1lKCksIGZhdWx0LmdldE5hbWUoKSkpIHsKLQkJCQkJZm91bmRNYXRjaCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCFmb3VuZE1hdGNoKXsKLQkJCQkvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGlzIEJpbmRpbmdGYXVsdCBmcm9tIHRoZSBiaW5kaW5nRmF1bHRzIExpc3QKLQkJCQliaW5kaW5nRmF1bHRzTmVlZGVkLmFkZChmYXVsdCk7Ci0JCQl9CQkJCi0JCX0JCQotCQkKLQkJLy8gYmluZGluZ0ZhdWx0c05lZWRlZCBjb250YWlucyB0aGUgbmVlZGVkIEJpbmRpbmdGYXVsdCdzIHdlIG5lZWQgdG8gY3JlYXRlCi0JCUl0ZXJhdG9yIG5lZWRlZEJpbmRpbmdGYXVsdHNJdCA9IGJpbmRpbmdGYXVsdHNOZWVkZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG5lZWRlZEJpbmRpbmdGYXVsdHNJdC5oYXNOZXh0KCkpIHsKLQkJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBuZWVkZWRCaW5kaW5nRmF1bHRzSXQubmV4dCgpOwotCQkJQmluZGluZ0ZhdWx0IG5ld0JpbmRpbmdGYXVsdCA9IGZhY3RvcnkuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0JCQluZXdCaW5kaW5nRmF1bHQuc2V0RUZhdWx0KGZhdWx0KTsKLQkJCW5ld0JpbmRpbmdGYXVsdC5zZXROYW1lKGZhdWx0LmdldE5hbWUoKSk7Ci0JCQliaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChuZXdCaW5kaW5nRmF1bHQpOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgdGhlIGNvbnRlbnRzIGZvciBlYWNoIEJpbmRpbmdGYXVsdAotCQlJdGVyYXRvciBmYXVsdENvbnRlbnRJdCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZmF1bHRDb250ZW50SXQuaGFzTmV4dCgpKSB7Ci0JCQlCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgZmF1bHRDb250ZW50SXQubmV4dCgpOwotCQkJZ2VuZXJhdGVCaW5kaW5nRmF1bHRDb250ZW50KGJpbmRpbmdGYXVsdCk7Ci0JCX0KLQkJCi0JCWdlbmVyYXRlQmluZGluZ09wZXJhdGlvbkNvbnRlbnQoYmluZGluZ09wZXJhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBuYW1lc0VxdWFsKFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0JCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCi0JCWlmIChuYW1lMSAhPSBudWxsIF4gbmFtZTIgIT0gbnVsbCkgewotCQkJLy8gb25lIGlzIG51bGwKLQkJCW1hdGNoID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZTEgIT0gbnVsbCAmJiBuYW1lMiAhPSBudWxsKSB7Ci0JCQkvLyBuZWl0aGVyIGlzIG51bGwKLQkJCW1hdGNoID0gbmFtZTEuZXF1YWxzKG5hbWUyKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGJvdGggYXJlIG51bGwKLQkJCW1hdGNoID0gdHJ1ZTsKLQkJfQkJCi0JCQotCQlyZXR1cm4gbWF0Y2g7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChCaW5kaW5nIGJpbmRpbmcpIHsKLQkJaWYgKGNvbnRlbnRHZW5lcmF0b3IgIT0gbnVsbCkgewotCQkJaWYgKGdldE92ZXJ3cml0ZSgpIHx8IGJpbmRpbmcuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGVudEdlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmdDb250ZW50KGJpbmRpbmcsIChQb3J0VHlwZSkgYmluZGluZy5nZXRFUG9ydFR5cGUoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudHMoYmluZGluZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikgewotCQlpZiAoYmluZGluZ09wZXJhdGlvbiAhPSBudWxsICYmIGNvbnRlbnRHZW5lcmF0b3IgIT0gbnVsbCkgewotCQkJY29udGVudEdlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KGJpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50cyhiaW5kaW5nT3BlcmF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJpbmRpbmdJbnB1dENvbnRlbnQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkgewotCQlpZiAoYmluZGluZ0lucHV0ICE9IG51bGwgJiYgY29udGVudEdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQljb250ZW50R2VuZXJhdG9yLmdlbmVyYXRlQmluZGluZ0lucHV0Q29udGVudChiaW5kaW5nSW5wdXQsIGJpbmRpbmdJbnB1dC5nZXRFSW5wdXQoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudHMoYmluZGluZ0lucHV0KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkgewotCQlpZiAoYmluZGluZ091dHB1dCAhPSBudWxsICYmIGNvbnRlbnRHZW5lcmF0b3IgIT0gbnVsbCkgewotCQkJY29udGVudEdlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KGJpbmRpbmdPdXRwdXQsIGJpbmRpbmdPdXRwdXQuZ2V0RU91dHB1dCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50cyhiaW5kaW5nT3V0cHV0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KSB7Ci0JCWlmIChiaW5kaW5nRmF1bHQgIT0gbnVsbCAmJiBjb250ZW50R2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCWNvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nRmF1bHRDb250ZW50KGJpbmRpbmdGYXVsdCwgYmluZGluZ0ZhdWx0LmdldEVGYXVsdCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50cyhiaW5kaW5nRmF1bHQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudHMoRXh0ZW5zaWJsZUVsZW1lbnQgZWUpIHsKLQkJaWYgKGVlICE9IG51bGwpIHsKLQkJCWVlLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotCQl9Ci0JfQotCQotCS8qCi0JICogR2VuZXJhdGUgUG9ydCBDb250ZW50IGZvciBhbGwgUG9ydHMgd2l0aCBhIHJlZmVyZW5jZSB0byB0aGUgQmluZGluZwotCSAqIHdoaWNoIHdhcyBwYXNzZWQgaW4gdGhyb3VnaCB0aGUgY29uc3RydWN0b3IgKG9yIGEgcmVmZXJlbmNlIHRvIHRoZQotCSAqIG5ld2x5IGNyZWF0ZWQgQmluZGluZykuCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVQb3J0Q29udGVudCgpIHsKLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiBjb250ZW50R2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCUxpc3QgcG9ydHNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQotCQkJSXRlcmF0b3Igc2VydmljZXNJdCA9IGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVTZXJ2aWNlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoc2VydmljZXNJdC5oYXNOZXh0KCkpIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZXNJdC5uZXh0KCk7Ci0JCQkJSXRlcmF0b3IgcG9ydHNJdCA9IHNlcnZpY2UuZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAocG9ydHNJdC5oYXNOZXh0KCkpIHsKLQkJCQkJUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRzSXQubmV4dCgpOwotCQkJCQlpZiAoYmluZGluZy5lcXVhbHMocG9ydC5nZXRFQmluZGluZygpKSkgewotCQkJCQkJLy8gRm91bmQgYSBtYXRjaAotCQkJCQkJcG9ydHNUb1VwZGF0ZS5hZGQocG9ydCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUl0ZXJhdG9yIHBvcnRzVG9VcGRhdGVJdCA9IHBvcnRzVG9VcGRhdGUuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChwb3J0c1RvVXBkYXRlSXQuaGFzTmV4dCgpKSB7Ci0JCQkJY29udGVudEdlbmVyYXRvci5nZW5lcmF0ZVBvcnRDb250ZW50KChQb3J0KSBwb3J0c1RvVXBkYXRlSXQubmV4dCgpKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JLyoKLQkgKiBtZXRob2RzIGFkZFJlcXVpcmVkTmFtZXNwYWNlcygpIGFuZCBjb21wdXRlVW5pcXVlUHJlZml4KCkgYXJlIHVzZWQgdG8gYWRkIG5lY2Vzc2FyeQotCSAqIG5hbWVzcGFjZXMgCi0JICogCi0JICogVE9ETzoKLQkgKiBEb2VzIHRoaXMgYmVsb25nIGhlcmU/ICBUaGlzIGlzIGNvcGllZCBmcm9tIHdzZGwudWkuICBDYW4gd2Ugc3luYyB1cCBpbiBzb21lIHdheT8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXF1aXJlZE5hbWVzcGFjZXMoQmluZGluZyBiaW5kaW5nKSB7Ci0JCWlmIChjb250ZW50R2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIG5hbWVzcGFjZU5hbWVzID0gY29udGVudEdlbmVyYXRvci5nZXRSZXF1aXJlZE5hbWVzcGFjZXMoKTsKLQkJCVN0cmluZ1tdIHByZWZlcnJlZFByZWZpeGVzID0gbmV3IFN0cmluZ1tuYW1lc3BhY2VOYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5hbWVzcGFjZU5hbWVzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCXByZWZlcnJlZFByZWZpeGVzW2luZGV4XSA9IGNvbnRlbnRHZW5lcmF0b3IuZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4KG5hbWVzcGFjZU5hbWVzW2luZGV4XSk7CQkJCQotCQkJfQotCQotCQkJTWFwIG1hcCA9IGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldE5hbWVzcGFjZXMoKTsKLQkJCQotCQkgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG5hbWVzcGFjZU5hbWVzW2ldOwotCQkgICAgICAgIGlmICghbWFwLmNvbnRhaW5zVmFsdWUobmFtZXNwYWNlKSkgewotCQkgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChpIDwgcHJlZmVycmVkUHJlZml4ZXMubGVuZ3RoKSA/IHByZWZlcnJlZFByZWZpeGVzW2ldIDogInAwIjsKLQkJICAgICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkocHJlZml4KSkgewotCQkgICAgICAgICAgICBwcmVmaXggPSBjb21wdXRlVW5pcXVlUHJlZml4KCJwIiwgbWFwKTsKLQkJICAgICAgICAgIH0KLQkJCQkgIGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmFkZE5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0JCSAgICAgICAgfQotCQkgICAgICB9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZVVuaXF1ZVByZWZpeChTdHJpbmcgYmFzZSwgTWFwIHRhYmxlKXsKLQkgICAgaW50IGkgPSAwOwotCSAgICBTdHJpbmcgcHJlZml4ID0gYmFzZTsKLQkgICAgd2hpbGUgKHRydWUpIHsKLQkgICAgICBpZiAoIXRhYmxlLmNvbnRhaW5zS2V5KHByZWZpeCkpIHsKLQkgICAgICAgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgICBlbHNlIHsKLQkgICAgICAgIHByZWZpeCA9IGJhc2UgKyBpOwotCSAgICAgICAgaSsrOwotCSAgICAgIH0KLQkgICAgfQotCSAgICByZXR1cm4gcHJlZml4OwotCX0KLQkKLQlwcml2YXRlIFBvcnRUeXBlIGdldFBvcnRUeXBlKCkgewotCQlpZiAoZ2V0UmVmTmFtZSgpLmVxdWFscygiIikpIHsKLQkJCS8vIE1lYW5zIHdlIHNob3VsZCBzZXQgdGhlIFBvcnRUeXBlIHRvIFVuc3BlY2lmaWVkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYgKGdldFJlZk5hbWUoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBwb3J0VHlwZUl0ID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsJCQkKLQotCQkJd2hpbGUgKHBvcnRUeXBlSXQuaGFzTmV4dCgpKSB7Ci0JCQkJUG9ydFR5cGUgcHQgPSAoUG9ydFR5cGUpIHBvcnRUeXBlSXQubmV4dCgpOwotCQkJCUxpc3QgcHJlZml4ZWROYW1lcyA9IGdldFByZWZpeGVkTmFtZXMocHQpOwotCQkJCWlmIChwcmVmaXhlZE5hbWVzLmNvbnRhaW5zKGdldFJlZk5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHB0OwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRQcmVmaXhlZE5hbWVzKFBvcnRUeXBlIHBvcnRUeXBlKSB7Ci0JCUxpc3QgcHJlZml4ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGN1cnJlbnRQb3J0VHlwZU5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQlTdHJpbmcgY3VycmVudE5hbWVzcGFjZSA9IHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQkJTWFwIG5hbWVzcGFjZU1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotCQlJdGVyYXRvciBrZXlzID0gbmFtZXNwYWNlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gbmFtZXNwYWNlTWFwLmdldChrZXkpOwotCi0JCQlpZiAoY3VycmVudE5hbWVzcGFjZS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJLy8gRm91bmQgYSBtYXRjaC4gIEFkZCB0byBvdXIgbGlzdAotCQkJCXByZWZpeGVkTmFtZXMuYWRkKGtleSArICI6IiArIGN1cnJlbnRQb3J0VHlwZU5hbWUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcHJlZml4ZWROYW1lczsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM4NDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRvcgotewkKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREUkVTU19MT0NBVElPTiA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnLyI7IAotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXF1aXJlZE5hbWVzcGFjZXMoKTsKLSAgcHVibGljIFN0cmluZyBnZXRQcmVmZXJyZWROYW1lc3BhY2VQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZSk7Ci0KLSAgLy8gZ2VuZXJhdGVzIHRoZSAnYWRkcmVzcycgZXh0ZW5zaWJsaXR5IGVsZW1lbnQgZm9yIGEgcG9ydAotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvcnRDb250ZW50KFBvcnQgcG9ydCk7Ci0gCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0NvbnRlbnQoQmluZGluZyBiaW5kaW5nLCBQb3J0VHlwZSBwb3J0VHlwZSk7Ci0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ09wZXJhdGlvbkNvbnRlbnQoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBPcGVyYXRpb24gb3BlcmF0aW9uKTsgCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0lucHV0Q29udGVudChCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0LCBJbnB1dCBpbnB1dCk7ICAgIAotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCwgT3V0cHV0IG91dHB1dCk7Ci0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0LCBGYXVsdCBmYXVsdCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvUG9ydEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvUG9ydEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDNhMjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL1BvcnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFBvcnRHZW5lcmF0b3IgZXh0ZW5kcyBCYXNlR2VuZXJhdG9yIHsKLQlwcml2YXRlIFNlcnZpY2Ugc2VydmljZTsKLQkKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgcG9ydCBnZW5lcmF0b3IgZ2l2ZW4gdGhlIHRhcmdldCBzZXJ2aWNlLgotICAgICAqIEBwYXJhbSBzZXJ2aWNlIHRoZSB0YXJnZXQgU2VydmljZSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLQlwdWJsaWMgUG9ydEdlbmVyYXRvcihTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkJZGVmaW5pdGlvbiA9IHNlcnZpY2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHBvcnQgZ2l2ZW4gaXQncyBuYW1lIGFuZCBiaW5kaW5nIG5hbWUuCi0gICAgICogVGhlIHBvcnQgaXMgdGhlbiBhZGRlZCB0byB0aGUgc2VydmljZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgICAqIEByZXR1cm4gdGhlIFBvcnQgaW5zdGFuY2UKLSAgICAgKi8KLQlwdWJsaWMgUG9ydCBnZW5lcmF0ZVBvcnQoKSB7Ci0JICBTdHJpbmcgcG9ydE5hbWUgPSBnZXROYW1lKCk7Ci0JICBTdHJpbmcgYmluZGluZ05hbWUgPSBnZXRSZWZOYW1lKCk7CQkKLQkgIAotCSAgQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZyhiaW5kaW5nTmFtZSk7Ci0JICAKLQkgIFBvcnQgcG9ydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0KCk7Ci0JICBwb3J0LnNldE5hbWUocG9ydE5hbWUpOwotCSAgcG9ydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotCSAgcG9ydC5zZXRCaW5kaW5nKGJpbmRpbmcpOwotCSAgCi0JICBzZXJ2aWNlLmFkZFBvcnQocG9ydCk7Ci0JICAKLQkgIENvbnRlbnRHZW5lcmF0b3IgY29udGVudEdlbmVyYXRvciA9IGdldENvbnRlbnRHZW5lcmF0b3IoKTsgCi0JICAKLQkgIGlmIChjb250ZW50R2VuZXJhdG9yICE9IG51bGwpIHsKLQkJICBhZGRSZXF1aXJlZE5hbWVzcGFjZXMoc2VydmljZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCSAgICAgIGNvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVQb3J0Q29udGVudChwb3J0KTsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIHBvcnQ7Ci0JfQotCQotCS8qCi0JICogbWV0aG9kcyBhZGRSZXF1aXJlZE5hbWVzcGFjZXMoKSBhbmQgY29tcHV0ZVVuaXF1ZVByZWZpeCgpIGFyZSB1c2VkIHRvIGFkZCBuZWNlc3NhcnkKLQkgKiBuYW1lc3BhY2VzIAotCSAqIAotCSAqIFRPRE86Ci0JICogRG9lcyB0aGlzIGJlbG9uZyBoZXJlPyAgVGhpcyBpcyBjb3BpZWQgZnJvbSB3c2RsLnVpLiAgQ2FuIHdlIHN5bmMgdXAgaW4gc29tZSB3YXk/Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVxdWlyZWROYW1lc3BhY2VzKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQlpZiAoY29udGVudEdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBuYW1lc3BhY2VOYW1lcyA9IGNvbnRlbnRHZW5lcmF0b3IuZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCk7Ci0JCQlTdHJpbmdbXSBwcmVmZXJyZWRQcmVmaXhlcyA9IG5ldyBTdHJpbmdbbmFtZXNwYWNlTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lc3BhY2VOYW1lcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQlwcmVmZXJyZWRQcmVmaXhlc1tpbmRleF0gPSBjb250ZW50R2VuZXJhdG9yLmdldFByZWZlcnJlZE5hbWVzcGFjZVByZWZpeChuYW1lc3BhY2VOYW1lc1tpbmRleF0pOwkJCQkKLQkJCX0KLQkKLQkJCU1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQkJCQotCQkgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG5hbWVzcGFjZU5hbWVzW2ldOwotCQkgICAgICAgIGlmICghbWFwLmNvbnRhaW5zVmFsdWUobmFtZXNwYWNlKSkgewotCQkgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChpIDwgcHJlZmVycmVkUHJlZml4ZXMubGVuZ3RoKSA/IHByZWZlcnJlZFByZWZpeGVzW2ldIDogInAwIjsKLQkJICAgICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkocHJlZml4KSkgewotCQkgICAgICAgICAgICBwcmVmaXggPSBjb21wdXRlVW5pcXVlUHJlZml4KCJwIiwgbWFwKTsKLQkJICAgICAgICAgIH0KLQkJCQkgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLQkJICAgICAgICB9Ci0JCSAgICAgIH0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBjb21wdXRlVW5pcXVlUHJlZml4KFN0cmluZyBiYXNlLCBNYXAgdGFibGUpewotCSAgICBpbnQgaSA9IDA7Ci0JICAgIFN0cmluZyBwcmVmaXggPSBiYXNlOwotCSAgICB3aGlsZSAodHJ1ZSkgewotCSAgICAgIGlmICghdGFibGUuY29udGFpbnNLZXkocHJlZml4KSkgewotCSAgICAgICAgYnJlYWs7Ci0JICAgICAgfQotCSAgICAgIGVsc2UgewotCSAgICAgICAgcHJlZml4ID0gYmFzZSArIGk7Ci0JICAgICAgICBpKys7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIHJldHVybiBwcmVmaXg7Ci0JfQotCQotCS8qKgotCSAqIExvY2F0ZXMgYSBiaW5kaW5nIGdpdmVuIGl0cyBwcmVmaXhlZCBuYW1lIChzb21lTlNQcmVmaXg6c29tZUJpbmRpbmdOYW1lKS4KLQkgKiAKLQkgKiBAcGFyYW0gYmluZGluZ05hbWUgdGhlIHFuYW1lIG9mIHRoZSBkZXNpcmVkIGJpbmRpbmcuCi0JICogQHJldHVybiBhIEJpbmRpbmcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBvbmUgaXMgbm90IGZvdW5kLgotCSAqLwotCXByaXZhdGUgQmluZGluZyBnZXRCaW5kaW5nKFN0cmluZyBiaW5kaW5nTmFtZSkgewotICAgICAgTGlzdCBhbGxCaW5kaW5ncyA9IGdldEFsbEJpbmRpbmdzKCk7Ci0gICAgICBJdGVyYXRvciBiaW5kaW5nSXRlcmF0b3IgPSBhbGxCaW5kaW5ncy5pdGVyYXRvcigpOwotCSAgCi0JICB3aGlsZSAoYmluZGluZ0l0ZXJhdG9yLmhhc05leHQoKSkgewotCSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZyliaW5kaW5nSXRlcmF0b3IubmV4dCgpOwotCSAgICAKLQkgICAgTGlzdCBwcmVmaXhlZE5hbWVzID0gZ2V0UHJlZml4ZWROYW1lcyhiaW5kaW5nKTsKLQkgICAgCi0JICAgIGlmIChwcmVmaXhlZE5hbWVzLmNvbnRhaW5zKGJpbmRpbmdOYW1lKSkgewotCSAgICAgIHJldHVybiBiaW5kaW5nOwotCSAgICB9Ci0JICB9Ci0JICAKLQkgIHJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBMb2NhdGVzIGFsbCB0aGUgYmluZGluZ3MgYXZhaWxhYmxlIGluIHRoaXMgZGVmaW5pdGlvbiBhbmQgYWxsIGl0cwotCSAqIGltcG9ydGVkIGRlZmluaXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYSBMaXN0IHdpdGggYWxsIGF2YWlsYWJsZSBiaW5kaW5ncy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBbGxCaW5kaW5ncygpIHsKLQkgIExpc3QgYWxsQmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBMaXN0IGFsbERlZmluaXRpb25zID0gZ2V0QWxsRGVmaW5pdGlvbnMoKTsKLQkgIAotCSAgSXRlcmF0b3IgZGVmc0l0ZXJhdG9yID0gYWxsRGVmaW5pdGlvbnMuaXRlcmF0b3IoKTsKLQkgIAotCSAgd2hpbGUgKGRlZnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGRlZnNJdGVyYXRvci5uZXh0KCk7Ci0JICAgIE1hcCBiaW5kaW5ncyA9IGRlZmluaXRpb24uZ2V0QmluZGluZ3MoKTsKLQkgICAgCi0JICAgIC8vIElTU1VFIEEgcG9zc2libGUgcHJvYmxlbSBoZXJlIGlmIHNvbWVob3cgYSBiaW5kaW5nIGlzIGR1cGxpY2F0ZWQgaW4gb25lIG9mIHRoZSBpbXBvcnRzPwotCSAgICAvLyBJbiB0aGF0IGNhc2Ugd2Ugc2hvdWxkIGl0ZXJhdGUgb3ZlciBhbmQgY2hlY2sgdGhlbSBvbmUgYnkgb25lLgotCSAgICAKLQkgICAgYWxsQmluZGluZ3MuYWRkQWxsKGJpbmRpbmdzLnZhbHVlcygpKTsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIGFsbEJpbmRpbmdzOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0cyB0byBsb2NhdGUgYW5kIGFkZCB0byB0aGUgbGlzdCBhbGwgdGhlIGRlZmluaXRpb25zIGltcG9ydGVkIGJ5IHRoZQotCSAqIGRlZmluaXRpb24gcGFzc2VkIGluLiBSZWN1cnNpdmVseSB0cmllcyB0byBsb2NhdGUgYWxsIGRlZmluaXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBkZWZpbml0aW9uIHRoZSBzdGFydCBEZWZpbml0aW9uLiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBsaXN0IHVzZWQgdG8gY29sbGVjdCBhbGwgdGhlIGltcG9ydGVkIGRlZmluaXRpb25zLiBNdXN0IG5vdCBiZSBudWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTGlzdCBsaXN0KSB7Ci0JICBsaXN0LmFkZChkZWZpbml0aW9uKTsKLQkgIExpc3QgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKTsKLQkgIEl0ZXJhdG9yIGltcG9ydHNJdGVyYXRvciA9IGltcG9ydHMuaXRlcmF0b3IoKTsKLQkgIAotCSAgd2hpbGUgKGltcG9ydHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkgICAgSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpaW1wb3J0c0l0ZXJhdG9yLm5leHQoKTsKLQkgICAgCi0JICAgIFN0cmluZyBpbXBvcnRMb2NhdGlvblVSSSA9IHRoZUltcG9ydC5nZXRMb2NhdGlvblVSSSgpOwotCSAgICBpZiAoaW1wb3J0TG9jYXRpb25VUkkgIT0gbnVsbCAmJiAKLQkgICAgICAgIC8vIElTU1VFIFRoaXMgYXNzdW1wdGlvbiBzZWVtcyBhIGJpdCB3ZWFrLgotICAgICAgICAgICAgaW1wb3J0TG9jYXRpb25VUkkuZW5kc1dpdGgoIndzZGwiKSkgewotCSAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gdGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCk7Ci0JICAgICAgCi0JICAgICAgaWYgKGltcG9ydGVkRGVmaW5pdGlvbiAhPSBudWxsICYmIAotICAgICAgICAgICAgICAhbGlzdC5jb250YWlucyhpbXBvcnRlZERlZmluaXRpb24pKSB7Ci0JICAgICAgICAvLyBSZWN1cnNpdmVseSB0cnkgdG8gbG9jYXRlIGFsbCBkZWZpbml0aW9ucy4KLQotICAgICAgICAgICAgYWRkRGVmaW5pdGlvbihpbXBvcnRlZERlZmluaXRpb24sIGxpc3QpOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0cyB0byBsb2NhdGUgYWxsIGRlZmluaXRpb25zIGltcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGRlZmluaXRpb24gYW5kCi0gICAgICogYWxsIHRoZWlyIGltcG9ydHMgaW4gdHVybi4gCi0JICogCi0JICogQHJldHVybiBhIExpc3Qgd2l0aCBhbGwgZGVmaW5pdGlvbnMgaW1wb3J0ZWQgYnkgdGhlIGN1cnJlbnQgZGVmaW5pdGlvbi4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QWxsRGVmaW5pdGlvbnMoKQotCXsKLQkgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIGFkZERlZmluaXRpb24oZGVmaW5pdGlvbiwgbGlzdCk7Ci0JICByZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldFByZWZpeGVkTmFtZXMoQmluZGluZyBiaW5kaW5nKSB7Ci0JCUxpc3QgcHJlZml4ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGN1cnJlbnRCaW5kaW5nTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJU3RyaW5nIGN1cnJlbnROYW1lc3BhY2UgPSBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQkJTWFwIG5hbWVzcGFjZU1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotCQlJdGVyYXRvciBrZXlzID0gbmFtZXNwYWNlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gbmFtZXNwYWNlTWFwLmdldChrZXkpOwotCQkJCi0JCQlpZiAoY3VycmVudE5hbWVzcGFjZS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJLy8gRm91bmQgYSBtYXRjaC4gIEFkZCB0byBvdXIgbGlzdAotCQkJCXByZWZpeGVkTmFtZXMuYWRkKGtleSArICI6IiArIGN1cnJlbnRCaW5kaW5nTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByZWZpeGVkTmFtZXM7Ci0JfQotCQotCXB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoKSB7Ci0JCXJldHVybiBzZXJ2aWNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL2V4dGVuc2lvbi9Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvZXh0ZW5zaW9uL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODhiZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvZXh0ZW5zaW9uL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuQ29udGVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKgotICogQ2xhc3Mgd2hpY2ggYWN0cyBhcyBhIGNvbnRhaW5lciB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvciB7Ci0JcHJvdGVjdGVkIEJ1bmRsZSBidW5kbGU7Ci0JcHJvdGVjdGVkIENvbnRlbnRHZW5lcmF0b3IgY29udGVudEdlbmVyYXRvcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7Ci0JCi0JcHVibGljIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc1N0cmluZywgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzU3RyaW5nOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0IGdldENvbnRlbnRHZW5lcmF0b3IoKSB7Ci0JCXRyeSB7Ci0JICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkgICAgICAgIGNvbnRlbnRHZW5lcmF0b3IgPSAoQ29udGVudEdlbmVyYXRvcikgdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkgICAgICB9Ci0JICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICAgIH0KLQkJCi0JCXJldHVybiBjb250ZW50R2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvZXh0ZW5zaW9uL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL2V4dGVuc2lvbi9Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDlmOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvZXh0ZW5zaW9uL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkNvbnRlbnRHZW5lcmF0b3I7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeSB7Ci0JcHJvdGVjdGVkIE1hcCBtYXA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlOwotCQotCXB1YmxpYyBzdGF0aWMgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkoKTsKLQkJCQotCQkJLy8gVE9ETy4uLiBkb24ndCByZWFkIHRoZSByZWdpc3RyeSB1bnRpbCBhbiAnZ2V0J29jY3VycwotCQkJLy8KLQkJCUNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBuZXcgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKGluc3RhbmNlKTsgCi0JCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHB1dChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkvLyBDaGVjayBpZiB0aGlzIG5hbWVzcGFjZS9uYW1lIGtleSBpcyBhbHJlYWR5IGluIHRoZSBNYXAKLQkJTGlzdCBmb3VuZEtleSA9IGZpbmRFeGlzdGluZ0tleShuYW1lc3BhY2UsIG5hbWUpOwotCQkKLQkJLy8gRGlkIHdlIGZpbmQgYW4gZXhpc3Rpbmcga2V5IHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlL2tleSBwYWlyaW5nPwotCQlpZiAoZm91bmRLZXkgIT0gbnVsbCkgewotCQkJLy8gU2ltcGx5IGFkZCB0aGUgZGVzY3JpcHRvciB0byB0aGUgbGlzdCBvZiBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkCi0JCQkvLyB3aXRoIHRoaXMgbmFtZXNwYWNlL25hbWUga2V5Ci0JCQlMaXN0IGRlc2NyaXB0b3JMaXN0ID0gKExpc3QpIG1hcC5nZXQoZm91bmRLZXkpOwotCQkJZGVzY3JpcHRvckxpc3QuYWRkKGRlc2NyaXB0b3IpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIE1hcCBmb3IgdGhpcyBuYW1lc3BhY2UvbmFtZSBrZXkKLQkJCUxpc3QgbmV3S2V5ID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJCW5ld0tleS5hZGQobmFtZXNwYWNlKTsKLQkJCW5ld0tleS5hZGQobmFtZSk7Ci0JCQkKLQkJCUxpc3QgbmV3RGVzY3JpcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQluZXdEZXNjcmlwdG9yTGlzdC5hZGQoZGVzY3JpcHRvcik7Ci0JCQkKLQkJCW1hcC5wdXQobmV3S2V5LCBuZXdEZXNjcmlwdG9yTGlzdCk7Ci0JCX0JCQotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdGhlICduYW1lJyBhdHRyaWJ1dGUgZm9yIHRoaXMgZXh0ZW5zaW9uLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJpbmRpbmdFeHRlbnNpb25OYW1lcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSXRlcmF0b3Iga2V5SXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTGlzdCBrZXkgPSBudWxsOwotCQl3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7Ci0JCQlrZXkgPSAoTGlzdCkga2V5SXQubmV4dCgpOwotCQkJbGlzdC5hZGQoa2V5LmdldCgxKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKgotCSAqIFJldHVybiB0aGUgY2xhc3Mgc3BlY2lmaWVkIGZvciB0aGlzIGV4dGVuc2lvbiBiYXNlZCBvbiB0aGUgbmFtZXNwYWNlCi0JICogYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBDb250ZW50R2VuZXJhdG9yIGdldEdlbmVyYXRvckNsYXNzRnJvbU5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCUNvbnRlbnRHZW5lcmF0b3IgZ2VuZXJhdG9yQ2xhc3MgPSBudWxsOwotCQlMaXN0IGtleSA9IGZpbmRFeGlzdGluZ0tleUZyb21OYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJCi0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJTGlzdCBkZXNjcmlwdG9ycyA9IChMaXN0KSBtYXAuZ2V0KGtleSk7Ci0JCQkKLQkJCS8vIEdyYWIgdGhlIGZpcnN0IGRlc2NyaXB0b3IgYXZhaWxhYmxlCi0JCQlpZiAoZGVzY3JpcHRvcnMuc2l6ZSgpID4gMCkgewotCQkJCUNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yIGV4dGVuc2lvbkRlc2NyaXB0b3IgPSAoQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkRlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldCgwKTsKLQkJCQlnZW5lcmF0b3JDbGFzcyA9IChDb250ZW50R2VuZXJhdG9yKSBleHRlbnNpb25EZXNjcmlwdG9yLmdldENvbnRlbnRHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGdlbmVyYXRvckNsYXNzOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBjbGFzcyBzcGVjaWZpZWQgZm9yIHRoaXMgZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBuYW1lCi0JICogYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBDb250ZW50R2VuZXJhdG9yIGdldEdlbmVyYXRvckNsYXNzRnJvbU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJQ29udGVudEdlbmVyYXRvciBnZW5lcmF0b3JDbGFzcyA9IG51bGw7Ci0JCUxpc3Qga2V5ID0gZmluZEV4aXN0aW5nS2V5RnJvbU5hbWUobmFtZSk7Ci0JCQotCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCUxpc3QgZGVzY3JpcHRvcnMgPSAoTGlzdCkgbWFwLmdldChrZXkpOwotCQkJCi0JCQkvLyBHcmFiIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGF2YWlsYWJsZQotCQkJaWYgKGRlc2NyaXB0b3JzLnNpemUoKSA+IDApIHsKLQkJCQlDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvciBleHRlbnNpb25EZXNjcmlwdG9yID0gKENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoMCk7Ci0JCQkJZ2VuZXJhdG9yQ2xhc3MgPSAoQ29udGVudEdlbmVyYXRvcikgZXh0ZW5zaW9uRGVzY3JpcHRvci5nZXRDb250ZW50R2VuZXJhdG9yKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBnZW5lcmF0b3JDbGFzczsKLQl9Ci0JCi0JLy8gVE9ETzogV2UgbmVlZCB0byBjb21tb24gdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzIHVwLi4uLi4uLgotCXByaXZhdGUgTGlzdCBmaW5kRXhpc3RpbmdLZXlGcm9tTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJSXRlcmF0b3Iga2V5SXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTGlzdCBmb3VuZEtleSA9IG51bGw7Ci0JCXdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKLQkJCWZvdW5kS2V5ID0gKExpc3QpIGtleUl0Lm5leHQoKTsKLQkJCWlmIChuYW1lc3BhY2UuZXF1YWxzKGZvdW5kS2V5LmdldCgwKSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvdW5kS2V5ID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBmb3VuZEtleTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGZpbmRFeGlzdGluZ0tleUZyb21OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGtleUl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgZm91bmRLZXkgPSBudWxsOwotCQl3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7Ci0JCQlmb3VuZEtleSA9IChMaXN0KSBrZXlJdC5uZXh0KCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoZm91bmRLZXkuZ2V0KDEpKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJZm91bmRLZXkgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIGZvdW5kS2V5OwotCX0KLQkKLQlwcml2YXRlIExpc3QgZmluZEV4aXN0aW5nS2V5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGtleUl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgZm91bmRLZXkgPSBudWxsOwotCQl3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7Ci0JCQlmb3VuZEtleSA9IChMaXN0KSBrZXlJdC5uZXh0KCk7Ci0JCQlpZiAobmFtZXNwYWNlLmVxdWFscyhmb3VuZEtleS5nZXQoMCkpICYmIG5hbWUuZXF1YWxzKGZvdW5kS2V5LmdldCgxKSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvdW5kS2V5ID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBmb3VuZEtleTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9leHRlbnNpb24vQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9leHRlbnNpb24vQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YzQ0OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvZXh0ZW5zaW9uL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIgewotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gV1NETFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjb250ZW50R2VuZXJhdG9ycyI7Ci0JICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05BTUUgPSAiY29udGVudEdlbmVyYXRvciI7Ci0JICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0JICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0JICBwcm90ZWN0ZWQgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeSBjb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5OwotCi0JICBwdWJsaWMgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkgZ2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5KSB7Ci0JICAgIHRoaXMuY29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeSA9IGdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeTsKLQkgIH0KLQkKLQkKLQkgIC8qKgotCSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCSAgICBpZiAocG9pbnQgIT0gbnVsbCkgewotCSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCi0JICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoVVJMIHBsYXRmb3JtVVJMLCBTdHJpbmcgcmVsYXRpdmVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkgICAgVVJMIHJlc29sdmVkVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZShwbGF0Zm9ybVVSTCk7Ci0JICAgIHJldHVybiByZXNvbHZlZFVSTC50b1N0cmluZygpICsgcmVsYXRpdmVQYXRoOwotCSAgfQotCi0JICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfTkFNRSkpIHsKLQkgICAgICB0cnkgewotCSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgbmFtZSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUVTUEFDRSk7Ci0JCQkKLQkgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgewotCSAgICAgICAgICBCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCSAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCSAgICAgICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yKHBsdWdpbkJ1bmRsZSwgY2xhc3NOYW1lLCBuYW1lc3BhY2UsIG5hbWUpOwotCSAgICAgICAgICBjb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5LnB1dChuYW1lc3BhY2UsIG5hbWUsIGRlc2NyaXB0b3IpOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCSAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nRmF1bHRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0ZhdWx0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODAxMjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBGYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdGYXVsdEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdGYXVsdEltcGwjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nRmF1bHRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQmluZGluZ0ZhdWx0Ci17Ci0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVGYXVsdCgpIDxlbT5FRmF1bHQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBGYXVsdCBlRmF1bHQgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdGYXVsdEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nRmF1bHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEZhdWx0IGdldEVGYXVsdCgpCi0gIHsKLSAgICBpZiAoZUZhdWx0ICE9IG51bGwgJiYgZUZhdWx0LmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgRmF1bHQgb2xkRUZhdWx0ID0gZUZhdWx0OwotICAgICAgZUZhdWx0ID0gKEZhdWx0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllRmF1bHQpOwotICAgICAgaWYgKGVGYXVsdCAhPSBvbGRFRmF1bHQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUZBVUxULCBvbGRFRmF1bHQsIGVGYXVsdCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUZhdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRmF1bHQgYmFzaWNHZXRFRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGVGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUZhdWx0KEZhdWx0IG5ld0VGYXVsdCkKLSAgewotICAgIEZhdWx0IG9sZEVGYXVsdCA9IGVGYXVsdDsKLSAgICBlRmF1bHQgPSBuZXdFRmF1bHQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUZBVUxULCBvbGRFRmF1bHQsIGVGYXVsdCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuRmF1bHQgZ2V0RmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldEVGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmF1bHQoamF2YXgud3NkbC5GYXVsdCBmYXVsdCkKLSAgewotICAgIHNldEVGYXVsdCgoRmF1bHQpIGZhdWx0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUZBVUxUOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVGYXVsdCgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFRmF1bHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQ6Ci0gICAgICAgIHNldEVGYXVsdCgoRmF1bHQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQ6Ci0gICAgICAgIHNldEVGYXVsdCgoRmF1bHQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUZBVUxUOgotICAgICAgICByZXR1cm4gZUZhdWx0ICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkucmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdGYXVsdC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nRmF1bHRfTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuRkFVTFQpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8vIFJlc29sdmUgdGhlIHJlZmVyZW5jZSB0byBGYXVsdAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbi5nZXRFT3BlcmF0aW9uKCk7Ci0gICAgICBTdHJpbmcgZmF1bHROYW1lID0gZ2V0TmFtZSgpOwotICAgICAgCi0gICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwgJiYgZmF1bHROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuRmF1bHQgZmF1bHQgPSBvcGVyYXRpb24uZ2V0RmF1bHQoZmF1bHROYW1lKTsKLQotICAgICAgICBpZiAoZmF1bHQgIT0gZ2V0RmF1bHQoKSkKLSAgICAgICAgewotICAgICAgICAgIHNldEZhdWx0KGZhdWx0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9Ci19IC8vQmluZGluZ0ZhdWx0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlZmIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nSW1wbCNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nSW1wbCNnZXRFUG9ydFR5cGUgPGVtPkVQb3J0IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nSW1wbCNnZXRFQmluZGluZ09wZXJhdGlvbnMgPGVtPkVCaW5kaW5nIE9wZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nSW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJpbmRpbmcKLXsKLSAgLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgYXNzaWduZWQgd2l0aCAxTCB0byBhdm9pZAotICAgKiBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UU5hbWUoKSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFFOYW1lIHFOYW1lID0gUU5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVOREVGSU5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdW5kZWZpbmVkID0gVU5ERUZJTkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9YWV9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJveHkgPSBQUk9YWV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVVSSSA9IFJFU09VUkNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVBvcnRUeXBlKCkgPGVtPkVQb3J0IFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBlUG9ydFR5cGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFQmluZGluZ09wZXJhdGlvbnMoKSA8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZ09wZXJhdGlvbnMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZUJpbmRpbmdPcGVyYXRpb25zID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKLSAgewotICAgIHJldHVybiBxTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgbmV3UU5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRRTmFtZSA9IHFOYW1lOwotICAgIHFOYW1lID0gbmV3UU5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19fUU5BTUUsIG9sZFFOYW1lLCBxTmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZGVmaW5lZCgpCi0gIHsKLSAgICByZXR1cm4gdW5kZWZpbmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiBuZXdVbmRlZmluZWQpCi0gIHsKLSAgICBib29sZWFuIG9sZFVuZGVmaW5lZCA9IHVuZGVmaW5lZDsKLSAgICB1bmRlZmluZWQgPSBuZXdVbmRlZmluZWQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19fVU5ERUZJTkVELCBvbGRVbmRlZmluZWQsIHVuZGVmaW5lZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3h5KCkKLSAgewotICAgIHJldHVybiBwcm94eTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJveHkoYm9vbGVhbiBuZXdQcm94eSkKLSAgewotICAgIGJvb2xlYW4gb2xkUHJveHkgPSBwcm94eTsKLSAgICBwcm94eSA9IG5ld1Byb3h5OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfX1BST1hZLCBvbGRQcm94eSwgcHJveHkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVVJJKFN0cmluZyBuZXdSZXNvdXJjZVVSSSkKLSAgewotICAgIFN0cmluZyBvbGRSZXNvdXJjZVVSSSA9IHJlc291cmNlVVJJOwotICAgIHJlc291cmNlVVJJID0gbmV3UmVzb3VyY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19fUkVTT1VSQ0VfVVJJLCBvbGRSZXNvdXJjZVVSSSwgcmVzb3VyY2VVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFBvcnRUeXBlIGdldEVQb3J0VHlwZSgpCi0gIHsKLSAgICBpZiAoZVBvcnRUeXBlICE9IG51bGwgJiYgZVBvcnRUeXBlLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgUG9ydFR5cGUgb2xkRVBvcnRUeXBlID0gZVBvcnRUeXBlOwotICAgICAgZVBvcnRUeXBlID0gKFBvcnRUeXBlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllUG9ydFR5cGUpOwotICAgICAgaWYgKGVQb3J0VHlwZSAhPSBvbGRFUG9ydFR5cGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuQklORElOR19fRVBPUlRfVFlQRSwgb2xkRVBvcnRUeXBlLCBlUG9ydFR5cGUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVQb3J0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFBvcnRUeXBlIGJhc2ljR2V0RVBvcnRUeXBlKCkKLSAgewotICAgIHJldHVybiBlUG9ydFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVQb3J0VHlwZShQb3J0VHlwZSBuZXdFUG9ydFR5cGUpCi0gIHsKLSAgICBQb3J0VHlwZSBvbGRFUG9ydFR5cGUgPSBlUG9ydFR5cGU7Ci0gICAgZVBvcnRUeXBlID0gbmV3RVBvcnRUeXBlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VQT1JUX1RZUEUsIG9sZEVQb3J0VHlwZSwgZVBvcnRUeXBlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFQmluZGluZ09wZXJhdGlvbnMoKQotICB7Ci0gICAgaWYgKGVCaW5kaW5nT3BlcmF0aW9ucyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVCaW5kaW5nT3BlcmF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5CSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVCaW5kaW5nT3BlcmF0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYW4gb3BlcmF0aW9uIGJpbmRpbmcgdG8gYmluZGluZy4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nT3BlcmF0aW9uKGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5hZGQoYmluZGluZ09wZXJhdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGJpbmRpbmcuIE5vdGUgdGhhdCBvcGVyYXRpb24gbmFtZXMgY2FuCi0gICAqIGJlIG92ZXJsb2FkZWQgd2l0aGluIGEgUG9ydFR5cGUuIEluIGNhc2Ugb2Ygb3ZlcmxvYWRpbmcsIHRoZQotICAgKiBuYW1lcyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcyBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyCi0gICAqIHJlZmluZSB0aGUgc2VhcmNoLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBvcGVyYXRpb24gYmluZGluZy4KLSAgICogQHBhcmFtIGlucHV0TmFtZSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgbWVzc2FnZTsgaWYgdGhpcyBpcyBudWxsCi0gICAqIGl0IHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHBhcmFtIG91dHB1dE5hbWUgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBtZXNzYWdlOyBpZiB0aGlzIGlzIG51bGwKLSAgICogaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBiaW5kaW5nLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgb3BlcmF0aW9uIGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIGdldEJpbmRpbmdPcGVyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBpbnB1dE5hbWUsIFN0cmluZyBvdXRwdXROYW1lKQotICB7Ci0gICAgSXRlcmF0b3Igb3BCaW5kaW5nSXRlcmF0b3IgPSBnZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKG9wQmluZGluZ0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gb3AgPSAoamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uKSBvcEJpbmRpbmdJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIFN0cmluZyBvcE5hbWUgPSBvcC5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKG9wTmFtZSkpCi0gICAgICAgICAgb3AgPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmFtZSAhPSBudWxsIHx8IG9wTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcCAhPSBudWxsICYmIGlucHV0TmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBpbnB1dCA9IG9wLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvcElucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICBpZiAob3BJbnB1dE5hbWUgPT0gbnVsbCB8fCAhb3BJbnB1dE5hbWUuZXF1YWxzKGlucHV0TmFtZSkpCi0gICAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgb3V0cHV0ID0gb3AuZ2V0QmluZGluZ091dHB1dCgpOwotICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgb3BPdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICBpZiAob3BPdXRwdXROYW1lID09IG51bGwgfHwgIW9wT3V0cHV0TmFtZS5lcXVhbHMob3V0cHV0TmFtZSkpCi0gICAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwpCi0gICAgICAgIHJldHVybiBvcDsKLSAgICB9IC8vIGVuZCB3aGlsZQotICAgIHJldHVybiBudWxsOyAvLyBiaW5kaW5nIG9wZXJhdGlvbiBub3QgZm91bmQKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBvcGVyYXRpb24gYmluZGluZ3MgZGVmaW5lZCBoZXJlLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdPcGVyYXRpb25zKCkKLSAgewotICAgIHJldHVybiBnZXRFQmluZGluZ09wZXJhdGlvbnMoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlBvcnRUeXBlIGdldFBvcnRUeXBlKCkKLSAgewotICAgIHJldHVybiBnZXRFUG9ydFR5cGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnRUeXBlKGphdmF4LndzZGwuUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBzZXRFUG9ydFR5cGUoKFBvcnRUeXBlKSBwb3J0VHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1FOQU1FOgotICAgICAgICByZXR1cm4gZ2V0UU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gaXNVbmRlZmluZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUkVTT1VSQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VVUkkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRVBPUlRfVFlQRToKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFUG9ydFR5cGUoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RVBvcnRUeXBlKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlM6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRVBPUlRfVFlQRToKLSAgICAgICAgc2V0RVBvcnRUeXBlKChQb3J0VHlwZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZShRTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoVU5ERUZJTkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoUFJPWFlfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoUkVTT1VSQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFOgotICAgICAgICBzZXRFUG9ydFR5cGUoKFBvcnRUeXBlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlM6Ci0gICAgICAgIGdldEVCaW5kaW5nT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUU5BTUU6Ci0gICAgICAgIHJldHVybiBRTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcU5hbWUgIT0gbnVsbCA6ICFRTkFNRV9FREVGQVVMVC5lcXVhbHMocU5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiB1bmRlZmluZWQgIT0gVU5ERUZJTkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBSRVNPVVJDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVVJJICE9IG51bGwgOiAhUkVTT1VSQ0VfVVJJX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVSSSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VQT1JUX1RZUEU6Ci0gICAgICAgIHJldHVybiBlUG9ydFR5cGUgIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUzoKLSAgICAgICAgcmV0dXJuIGVCaW5kaW5nT3BlcmF0aW9ucyAhPSBudWxsICYmICFlQmluZGluZ09wZXJhdGlvbnMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChxTmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChxTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCB1bmRlZmluZWQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodW5kZWZpbmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHByb3h5OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHByb3h5KTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlc291cmNlVVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0gICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldFFOYW1lKHFuYW1lKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGNvbXBvbmVudDsKLQotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbChiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpKTsKLSAgICBsaXN0LmFkZEFsbChiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1BFUkFUSU9OIDoKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotICAgICAgICBvcGVyYXRpb24uc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICBvcGVyYXRpb24uc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGFkZEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChjb21wb25lbnQsIG1vZGVsT2JqZWN0KTsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0TGlzdChPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGNvbXBvbmVudDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdfUU5hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nX0VQb3J0VHlwZSgpKQotICAgICAgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGdldEVQb3J0VHlwZSgpOwotICAgICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFFOYW1lIHFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5CSU5ESU5HKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCQotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0JCi0gICAgaXRlcmF0b3IgPSBnZXRFQmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoQmluZGluZ09wZXJhdGlvbkltcGwpIG9wZXJhdGlvbikuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIFFOYW1lIHBvcnRUeXBlUU5hbWUgPSBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSwgZWxlbWVudCk7Ci0gICAgICBQb3J0VHlwZSBuZXdQb3J0VHlwZSA9IHBvcnRUeXBlUU5hbWUgIT0gbnVsbCA/IChQb3J0VHlwZSkgZGVmaW5pdGlvbi5nZXRQb3J0VHlwZShwb3J0VHlwZVFOYW1lKSA6IG51bGw7Ci0gICAgICBpZiAobmV3UG9ydFR5cGUgIT0gZ2V0RVBvcnRUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIHNldEVQb3J0VHlwZShuZXdQb3J0VHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLX0gLy9CaW5kaW5nSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbnB1dEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nSW5wdXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWE1MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbnB1dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBJbnB1dDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbnB1dEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbnB1dEltcGwjZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nSW5wdXRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQmluZGluZ0lucHV0Ci17Ci0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVJbnB1dCgpIDxlbT5FSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBJbnB1dCBlSW5wdXQgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdJbnB1dEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIElucHV0IGdldEVJbnB1dCgpCi0gIHsKLSAgICBpZiAoZUlucHV0ICE9IG51bGwgJiYgZUlucHV0LmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgSW5wdXQgb2xkRUlucHV0ID0gZUlucHV0OwotICAgICAgZUlucHV0ID0gKElucHV0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllSW5wdXQpOwotICAgICAgaWYgKGVJbnB1dCAhPSBvbGRFSW5wdXQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUlOUFVULCBvbGRFSW5wdXQsIGVJbnB1dCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUlucHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgSW5wdXQgYmFzaWNHZXRFSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGVJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUlucHV0KElucHV0IG5ld0VJbnB1dCkKLSAgewotICAgIElucHV0IG9sZEVJbnB1dCA9IGVJbnB1dDsKLSAgICBlSW5wdXQgPSBuZXdFSW5wdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUlOUFVULCBvbGRFSW5wdXQsIGVJbnB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuSW5wdXQgZ2V0SW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGdldEVJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoamF2YXgud3NkbC5JbnB1dCBpbnB1dCkKLSAgewotICAgIHNldEVJbnB1dCgoSW5wdXQpIGlucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUlOUFVUOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVJbnB1dCgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFSW5wdXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQ6Ci0gICAgICAgIHNldEVJbnB1dCgoSW5wdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQ6Ci0gICAgICAgIHNldEVJbnB1dCgoSW5wdXQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUlOUFVUOgotICAgICAgICByZXR1cm4gZUlucHV0ICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsaWF0aW9uIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLQlpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0JewotICAgICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICB9Ci0JfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkucmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSAoQmluZGluZ0lucHV0KSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdJbnB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nSW5wdXRfTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuSU5QVVQpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8vIFJlc29sdmUgdGhlIHJlZmVyZW5jZSB0byBJbnB1dAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBib3AgPSAoQmluZGluZ09wZXJhdGlvbilnZXRDb250YWluZXIoKTsKLSAgICAgIE9wZXJhdGlvbiBvcCA9IGJvcC5nZXRFT3BlcmF0aW9uKCk7Ci0gICAgICBpZiAob3AgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0SW5wdXQob3AuZ2V0RUlucHV0KCkpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9Ci19IC8vQmluZGluZ0lucHV0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdPcGVyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ09wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxMDk1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ09wZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIE9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3BlcmF0aW9uSW1wbCNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwjZ2V0RUJpbmRpbmdJbnB1dCA8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3BlcmF0aW9uSW1wbCNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwjZ2V0RUJpbmRpbmdGYXVsdHMgPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdPcGVyYXRpb25JbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQmluZGluZ09wZXJhdGlvbgotewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFT3BlcmF0aW9uKCkgPGVtPkVPcGVyYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uIGVPcGVyYXRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFQmluZGluZ0lucHV0KCkgPGVtPkVCaW5kaW5nIElucHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdJbnB1dCBlQmluZGluZ0lucHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUJpbmRpbmdPdXRwdXQoKSA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZ091dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3V0cHV0IGVCaW5kaW5nT3V0cHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUJpbmRpbmdGYXVsdHMoKSA8ZW0+RUJpbmRpbmcgRmF1bHRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVCaW5kaW5nRmF1bHRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVCaW5kaW5nRmF1bHRzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb24gZ2V0RU9wZXJhdGlvbigpCi0gIHsKLSAgICBpZiAoZU9wZXJhdGlvbiAhPSBudWxsICYmIGVPcGVyYXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBPcGVyYXRpb24gb2xkRU9wZXJhdGlvbiA9IGVPcGVyYXRpb247Ci0gICAgICBlT3BlcmF0aW9uID0gKE9wZXJhdGlvbillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZU9wZXJhdGlvbik7Ci0gICAgICBpZiAoZU9wZXJhdGlvbiAhPSBvbGRFT3BlcmF0aW9uKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OLCBvbGRFT3BlcmF0aW9uLCBlT3BlcmF0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGJhc2ljR2V0RU9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZU9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RU9wZXJhdGlvbihPcGVyYXRpb24gbmV3RU9wZXJhdGlvbikKLSAgewotICAgIE9wZXJhdGlvbiBvbGRFT3BlcmF0aW9uID0gZU9wZXJhdGlvbjsKLSAgICBlT3BlcmF0aW9uID0gbmV3RU9wZXJhdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTiwgb2xkRU9wZXJhdGlvbiwgZU9wZXJhdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0lucHV0IGdldEVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGVCaW5kaW5nSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IG5ld0VCaW5kaW5nSW5wdXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgb2xkRUJpbmRpbmdJbnB1dCA9IGVCaW5kaW5nSW5wdXQ7Ci0gICAgZUJpbmRpbmdJbnB1dCA9IG5ld0VCaW5kaW5nSW5wdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQsIG9sZEVCaW5kaW5nSW5wdXQsIG5ld0VCaW5kaW5nSW5wdXQpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgbmV3RUJpbmRpbmdJbnB1dCkKLSAgewotICAgIGlmIChuZXdFQmluZGluZ0lucHV0ICE9IGVCaW5kaW5nSW5wdXQpCi0gICAgewotICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0gICAgICBpZiAoZUJpbmRpbmdJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZUJpbmRpbmdJbnB1dCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBpZiAobmV3RUJpbmRpbmdJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RUJpbmRpbmdJbnB1dCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRFQmluZGluZ0lucHV0KG5ld0VCaW5kaW5nSW5wdXQsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbmV3RUJpbmRpbmdJbnB1dCwgbmV3RUJpbmRpbmdJbnB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRFQmluZGluZ091dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZUJpbmRpbmdPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgbmV3RUJpbmRpbmdPdXRwdXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0IG9sZEVCaW5kaW5nT3V0cHV0ID0gZUJpbmRpbmdPdXRwdXQ7Ci0gICAgZUJpbmRpbmdPdXRwdXQgPSBuZXdFQmluZGluZ091dHB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG9sZEVCaW5kaW5nT3V0cHV0LCBuZXdFQmluZGluZ091dHB1dCk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG5ld0VCaW5kaW5nT3V0cHV0KQotICB7Ci0gICAgaWYgKG5ld0VCaW5kaW5nT3V0cHV0ICE9IGVCaW5kaW5nT3V0cHV0KQotICAgIHsKLSAgICAgIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotICAgICAgaWYgKGVCaW5kaW5nT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllQmluZGluZ091dHB1dCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VCaW5kaW5nT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFQmluZGluZ091dHB1dCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG51bGwsIG1zZ3MpOwotICAgICAgbXNncyA9IGJhc2ljU2V0RUJpbmRpbmdPdXRwdXQobmV3RUJpbmRpbmdPdXRwdXQsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG5ld0VCaW5kaW5nT3V0cHV0LCBuZXdFQmluZGluZ091dHB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUJpbmRpbmdGYXVsdHMoKQotICB7Ci0gICAgaWYgKGVCaW5kaW5nRmF1bHRzID09IG51bGwpCi0gICAgewotICAgICAgZUJpbmRpbmdGYXVsdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmluZGluZ0ZhdWx0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVCaW5kaW5nRmF1bHRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIGZhdWx0IGJpbmRpbmcuCi0gICAqIEBwYXJhbSBmYXVsdCB0aGUgbmV3IGZhdWx0IGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nRmF1bHQoamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICB7Ci0gICAgZ2V0RUJpbmRpbmdGYXVsdHMoKS5hZGQoKEJpbmRpbmdGYXVsdCliaW5kaW5nRmF1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGZhdWx0IGJpbmRpbmcuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGZhdWx0IGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmF1bHQgYmluZGluZywgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIGZhdWx0IGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgZ2V0QmluZGluZ0ZhdWx0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQmluZGluZ0ZhdWx0IGZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBpZiAobmFtZS5lcXVhbHMoZmF1bHQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGZhdWx0IGJpbmRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiBAcmV0dXJuIG5hbWVzIG9mIGZhdWx0IGJpbmRpbmdzCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRCaW5kaW5nRmF1bHRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGkubmV4dCgpOwotICAgICAgaGFzaE1hcC5wdXQoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgYmluZGluZ0ZhdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5PcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRFT3BlcmF0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb24oamF2YXgud3NkbC5PcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgc2V0RU9wZXJhdGlvbigoT3BlcmF0aW9uKSBvcGVyYXRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZ0lucHV0IGdldEJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUJpbmRpbmdJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFNldCB0aGUgaW5wdXQgb2YgdGhpcyBvcGVyYXRpb24gYmluZGluZy4KLSAgICogQHBhcmFtIGlucHV0IHRoZSBkZXNpcmVkIGlucHV0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ0lucHV0KGphdmF4LndzZGwuQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgewotICAgIHNldEVCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dCkgYmluZGluZ0lucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgZ2V0QmluZGluZ091dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBTZXQgdGhlIG91dHB1dCBvZiB0aGlzIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdPdXRwdXQoamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gIHsKLSAgICBzZXRFQmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dCkgYmluZGluZ091dHB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVCaW5kaW5nSW5wdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVDoKLSAgICAgICAgICByZXR1cm4gYmFzaWNTZXRFQmluZGluZ091dHB1dChudWxsLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUJpbmRpbmdGYXVsdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVPcGVyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU9wZXJhdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ0lucHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ091dHB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICByZXR1cm4gZ2V0RUJpbmRpbmdGYXVsdHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VPUEVSQVRJT046Ci0gICAgICAgIHNldEVPcGVyYXRpb24oKE9wZXJhdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICBzZXRFQmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHNldEVCaW5kaW5nT3V0cHV0KChCaW5kaW5nT3V0cHV0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICBnZXRFQmluZGluZ0ZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVCaW5kaW5nRmF1bHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OOgotICAgICAgICBzZXRFT3BlcmF0aW9uKChPcGVyYXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICBzZXRFQmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVDoKLSAgICAgICAgc2V0RUJpbmRpbmdPdXRwdXQoKEJpbmRpbmdPdXRwdXQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0ZBVUxUUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCAmJiAhZUV4dGVuc2liaWxpdHlFbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTjoKLSAgICAgICAgcmV0dXJuIGVPcGVyYXRpb24gIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdJbnB1dCAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdPdXRwdXQgIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0ZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGVCaW5kaW5nRmF1bHRzICE9IG51bGwgJiYgIWVCaW5kaW5nRmF1bHRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuSU5QVVQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgICAgIGlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIGlucHV0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBzZXRCaW5kaW5nSW5wdXQoaW5wdXQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5PVVRQVVQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nT3V0cHV0IG91dHB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgIG91dHB1dC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICBvdXRwdXQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIHNldEJpbmRpbmdPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRkFVTFQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nRmF1bHQgZmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgICAgIGZhdWx0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIGZhdWx0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBhZGRCaW5kaW5nRmF1bHQoZmF1bHQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEVCaW5kaW5nSW5wdXQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEVCaW5kaW5nT3V0cHV0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgY29tcG9uZW50OwotCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkpOwotICAgIH0KLQotICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkpOwotICAgIH0KLQotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZ09wZXJhdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdPcGVyYXRpb25fTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuT1BFUkFUSU9OKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0JSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQkKLSAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSBnZXRFQmluZGluZ0lucHV0KCk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoQmluZGluZ0lucHV0SW1wbCkgaW5wdXQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIEJpbmRpbmdPdXRwdXQgb3V0cHV0ID0gZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLSAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoQmluZGluZ091dHB1dEltcGwpIG91dHB1dCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgaXRlcmF0b3IgPSBnZXRFQmluZGluZ0ZhdWx0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBCaW5kaW5nRmF1bHQgZmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChCaW5kaW5nRmF1bHRJbXBsKSBmYXVsdCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8vIFJlc29sdmUgdGhlIHJlZmVyZW5jZSB0byBPcGVyYXRpb24KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWdldENvbnRhaW5lcigpOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdJbnB1dCBpbnB1dCA9IGdldEVCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgQmluZGluZ091dHB1dCBvdXRwdXQgPSBnZXRFQmluZGluZ091dHB1dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0ICE9IG51bGwgPyBpbnB1dC5nZXROYW1lKCkgOiBudWxsOwotICAgICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9IG91dHB1dCAhPSBudWxsID8gb3V0cHV0LmdldE5hbWUoKSA6IG51bGw7Ci0KLSAgICAgICAgc2V0T3BlcmF0aW9uKHBvcnRUeXBlLmdldE9wZXJhdGlvbihnZXROYW1lKCksIGlucHV0TmFtZSwgb3V0cHV0TmFtZSkpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9Ci19IC8vQmluZGluZ09wZXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nT3V0cHV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdPdXRwdXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTBkOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdPdXRwdXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBPdXRwdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3V0cHV0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ091dHB1dEltcGwjZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdPdXRwdXRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQmluZGluZ091dHB1dAotewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFT3V0cHV0KCkgPGVtPkVPdXRwdXQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3V0cHV0IGVPdXRwdXQgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdPdXRwdXRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ091dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE91dHB1dCBnZXRFT3V0cHV0KCkKLSAgewotICAgIGlmIChlT3V0cHV0ICE9IG51bGwgJiYgZU91dHB1dC5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIE91dHB1dCBvbGRFT3V0cHV0ID0gZU91dHB1dDsKLSAgICAgIGVPdXRwdXQgPSAoT3V0cHV0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllT3V0cHV0KTsKLSAgICAgIGlmIChlT3V0cHV0ICE9IG9sZEVPdXRwdXQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQsIG9sZEVPdXRwdXQsIGVPdXRwdXQpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgYmFzaWNHZXRFT3V0cHV0KCkKLSAgewotICAgIHJldHVybiBlT3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFT3V0cHV0KE91dHB1dCBuZXdFT3V0cHV0KQotICB7Ci0gICAgT3V0cHV0IG9sZEVPdXRwdXQgPSBlT3V0cHV0OwotICAgIGVPdXRwdXQgPSBuZXdFT3V0cHV0OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FT1VUUFVULCBvbGRFT3V0cHV0LCBlT3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5PdXRwdXQgZ2V0T3V0cHV0KCkKLSAgewotICAgIHJldHVybiBnZXRFT3V0cHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoamF2YXgud3NkbC5PdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgc2V0RU91dHB1dCgoT3V0cHV0KSBvdXRwdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FT1VUUFVUOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVPdXRwdXQoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU91dHB1dCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRU9VVFBVVDoKLSAgICAgICAgc2V0RU91dHB1dCgoT3V0cHV0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FT1VUUFVUOgotICAgICAgICBzZXRFT3V0cHV0KChPdXRwdXQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FT1VUUFVUOgotICAgICAgICByZXR1cm4gZU91dHB1dCAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotCWlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLQl7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICAgIH0KLQl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5yZW1vdmUoaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gKEJpbmRpbmdPdXRwdXQpIGNvbXBvbmVudDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZ091dHB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nT3V0cHV0X05hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLk9VVFBVVCk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLy8gUmVzb2x2ZSB0aGUgcmVmZXJlbmNlIHRvIE91dHB1dAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBib3AgPSAoQmluZGluZ09wZXJhdGlvbilnZXRDb250YWluZXIoKTsKLSAgICAgIE9wZXJhdGlvbiBvcCA9IGJvcC5nZXRFT3BlcmF0aW9uKCk7Ci0gICAgICBpZiAob3AgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0T3V0cHV0KG9wLmdldEVPdXRwdXQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLX0gLy9CaW5kaW5nT3V0cHV0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0RlZmluaXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyYTRmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ldmVudHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uZXZlbnRzLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uZXZlbnRzLkV2ZW50VGFyZ2V0OwotaW1wb3J0IG9yZy53M2MuZG9tLmV2ZW50cy5NdXRhdGlvbkV2ZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVNZXNzYWdlcyA8ZW0+RU1lc3NhZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RVBvcnRUeXBlcyA8ZW0+RVBvcnQgVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFQmluZGluZ3MgPGVtPkVCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVTZXJ2aWNlcyA8ZW0+RVNlcnZpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RU5hbWVzcGFjZXMgPGVtPkVOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RVR5cGVzIDxlbT5FVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFSW1wb3J0cyA8ZW0+RUltcG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZpbml0aW9uSW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERlZmluaXRpb24KLXsKLSAgLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgYXNzaWduZWQgd2l0aCAxTCB0byBhdm9pZAotICAgKiBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb24gPSBMT0NBVElPTl9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nKCkgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbmNvZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmcoKSA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVuY29kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZyA9IEVOQ09ESU5HX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFTWVzc2FnZXMoKSA8ZW0+RU1lc3NhZ2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVNZXNzYWdlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlTWVzc2FnZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUG9ydFR5cGVzKCkgPGVtPkVQb3J0IFR5cGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQb3J0VHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZVBvcnRUeXBlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5ncygpIDxlbT5FQmluZGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVCaW5kaW5ncyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVTZXJ2aWNlcygpIDxlbT5FU2VydmljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVNlcnZpY2VzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVTZXJ2aWNlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVOYW1lc3BhY2VzKCkgPGVtPkVOYW1lc3BhY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVOYW1lc3BhY2VzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVOYW1lc3BhY2VzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVR5cGVzKCkgPGVtPkVUeXBlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVR5cGVzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFR5cGVzIGVUeXBlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVJbXBvcnRzKCkgPGVtPkVJbXBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVJbXBvcnRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVJbXBvcnRzID0gbnVsbDsKLQotICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5OwotICBwcml2YXRlIERvY3VtZW50IGRvY3VtZW50OwotICBwcml2YXRlIEhhc2hNYXAgbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbkltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZpbml0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB0YXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikKLSAgewotICAgIFN0cmluZyBvbGRMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIGxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT04sIG9sZExvY2F0aW9uLCBsb2NhdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuZXdRTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFFOYW1lID0gcU5hbWU7Ci0gICAgcU5hbWUgPSBuZXdRTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKQotICB7Ci0gICAgcmV0dXJuIGVuY29kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgbmV3RW5jb2RpbmcpCi0gIHsKLSAgICBTdHJpbmcgb2xkRW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICBlbmNvZGluZyA9IG5ld0VuY29kaW5nOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HLCBvbGRFbmNvZGluZywgZW5jb2RpbmcpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVNZXNzYWdlcygpCi0gIHsKLSAgICBpZiAoZU1lc3NhZ2VzID09IG51bGwpCi0gICAgewotICAgICAgZU1lc3NhZ2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2UuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VNRVNTQUdFUyk7Ci0gICAgfQotICAgIHJldHVybiBlTWVzc2FnZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFUG9ydFR5cGVzKCkKLSAgewotICAgIGlmIChlUG9ydFR5cGVzID09IG51bGwpCi0gICAgewotICAgICAgZVBvcnRUeXBlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQb3J0VHlwZS5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVMpOwotICAgIH0KLSAgICByZXR1cm4gZVBvcnRUeXBlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVCaW5kaW5ncygpCi0gIHsKLSAgICBpZiAoZUJpbmRpbmdzID09IG51bGwpCi0gICAgewotICAgICAgZUJpbmRpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJpbmRpbmcuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUyk7Ci0gICAgfQotICAgIHJldHVybiBlQmluZGluZ3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFU2VydmljZXMoKQotICB7Ci0gICAgaWYgKGVTZXJ2aWNlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVTZXJ2aWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FU0VSVklDRVMpOwotICAgIH0KLSAgICByZXR1cm4gZVNlcnZpY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEBkZXByZWNhdGVkCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RU5hbWVzcGFjZXMoKQotICB7Ci0gICAgaWYgKGVOYW1lc3BhY2VzID09IG51bGwpCi0gICAgewotICAgICAgZU5hbWVzcGFjZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTmFtZXNwYWNlLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkFNRVNQQUNFUyk7Ci0gICAgfQotICAgIHJldHVybiBlTmFtZXNwYWNlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFR5cGVzIGdldEVUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gZVR5cGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFVHlwZXMoVHlwZXMgbmV3RVR5cGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgVHlwZXMgb2xkRVR5cGVzID0gZVR5cGVzOwotICAgIGVUeXBlcyA9IG5ld0VUeXBlczsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VUWVBFUywgb2xkRVR5cGVzLCBuZXdFVHlwZXMpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RVR5cGVzKFR5cGVzIG5ld0VUeXBlcykKLSAgewotICAgIGlmIChuZXdFVHlwZXMgIT0gZVR5cGVzKQotICAgIHsKLSAgICAgIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotICAgICAgaWYgKGVUeXBlcyAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZVR5cGVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTLCBudWxsLCBtc2dzKTsKLSAgICAgIGlmIChuZXdFVHlwZXMgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VUeXBlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VUWVBFUywgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRFVHlwZXMobmV3RVR5cGVzLCBtc2dzKTsKLSAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVMsIG5ld0VUeXBlcywgbmV3RVR5cGVzKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIHN1cGVyLmVOb3RpZnkobXNnKTsKLSAgICAKLSAgICAvLyBjcy4uIGlmIHdlJ3ZlIGFkZGVkIGEgVHlwZXMgZWxlbWVudCwgYW5kIHRoaXMgZGVmaW5pdGlvbiBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UKLSAgICAvLyB3ZSBuZWVkIHRvIHNldCB0aGUgc2NoZW1hTG9jYXRpb25zIGZvciBhbnkgaW5saW5lIHNjaGVtYUxvY2F0aW9ucy4KLSAgICAvLyBJZiBub3QgeWV0IGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHRoZSBzY2hlbWFMb2NhdGlvbidzIHdpbGwgYmUgc2V0IHZpYSBXU0RMUmVzb3VyY2VJbXBsLmF0dGFjaGVkKEVPYmplY3QgbykKLSAgICAvLwotICAgIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZpbml0aW9uX0VUeXBlcygpICYmCi0gICAgICAgIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKQotICAgIHsKLSAgICAgIGlmIChlUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwgJiYgZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldElubGluZVNjaGVtYUxvY2F0aW9ucyhlUmVzb3VyY2UoKSk7Ci0gICAgICB9ICAgIAotICAgIH0gICAgICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUltcG9ydHMoKQotICB7Ci0gICAgaWYgKGVJbXBvcnRzID09IG51bGwpCi0gICAgewotICAgICAgZUltcG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW1wb3J0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FSU1QT1JUUyk7Ci0gICAgfQotICAgIHJldHVybiBlSW1wb3J0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBiaW5kaW5nIHRvIHRoaXMgV1NETCBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIGJpbmRpbmcgdGhlIGJpbmRpbmcgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nKGphdmF4LndzZGwuQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgZ2V0RUJpbmRpbmdzKCkuYWRkKChCaW5kaW5nKSBiaW5kaW5nKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYW4gaW1wb3J0IHRvIHRoaXMgV1NETCBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIGltcG9ydERlZiB0aGUgaW1wb3J0IHRvIGJlIGFkZGVkCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkSW1wb3J0KGphdmF4LndzZGwuSW1wb3J0IGltcG9ydERlZikKLSAgewotICAgIGdldEVJbXBvcnRzKCkuYWRkKChJbXBvcnQpIGltcG9ydERlZik7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQWRkIGEgbWVzc2FnZSB0byB0aGlzIFdTREwgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGFkZGVkCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIGdldEVNZXNzYWdlcygpLmFkZCgoTWVzc2FnZSltZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGlzIGEgd2F5IHRvIGFkZCBhIG5hbWVzcGFjZSBhc3NvY2lhdGlvbiB0byBhIGRlZmluaXRpb24uCi0gICAqIEl0IGlzIHNpbWlsYXIgdG8gYWRkaW5nIGEgbmFtZXNwYWNlIHByZWZpeCBkZWNsYXJhdGlvbiB0byB0aGUKLSAgICogdG9wIG9mIGEgJmx0O3dzZGw6ZGVmaW5pdGlvbiZndDsgZWxlbWVudC4gVGhpcyBoYXMgbm90aGluZyB0byBkbwotICAgKiB3aXRoIHRoZSAmbHQ7d3NkbDppbXBvcnQmZ3Q7IGVsZW1lbnQ7IHRoZXJlIGFyZSBzZXBhcmF0ZSBtZXRob2RzIGZvcgotICAgKiBkZWFsaW5nIHdpdGggaW5mb3JtYXRpb24gZGVzY3JpYmVkIGJ5ICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudHMuCi0gICAqIFRoZXJlIGlzIGEgZGVmYXVsdCBuYW1lc3BhY2UgYXNzb2NpYXRpb24gKHdoaWNoIGNhbiBiZQotICAgKiBvdmVycmlkZGVuKSBiZXR3ZWVuIHRoZSBudWxsIHByZWZpeCBhbmQKLSAgICogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8uCi0gICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCB0byB1c2UgZm9yIHRoaXMgbmFtZXNwYWNlICh3aGVuCi0gICAqIHJlbmRlcmluZyB0aGlzIGluZm9ybWF0aW9uIGFzIFhNTCkuIFVzZSBudWxsIG9yIGFuIGVtcHR5IHN0cmluZwotICAgKiB0byBkZXNjcmliZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgKGkuZS4geG1sbnM9Ii4uLiIpLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIHRoZSBuYW1lc3BhY2UgVVJJIHRvIGFzc29jaWF0ZSB0aGUgcHJlZml4Ci0gICAqIHdpdGguIElmIHlvdSB1c2UgbnVsbCwgdGhlIG5hbWVzcGFjZSBhc3NvY2lhdGlvbiB3aWxsIGJlIHJlbW92ZWQuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgICBwcmVmaXggPSAiIjsKLQotICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBGaXJzdCwgY2hlY2sgaWYgdGhlcmUgaXMgdGhpcyBuYW1lc3BhY2UgYWxyZWFkeS4KLSAgICAgIFN0cmluZyBleGlzdGluZ1ByZWZpeCA9IGdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgaWYgKGV4aXN0aW5nUHJlZml4ICE9IG51bGwpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcmVmaXggaXMgbm90IGFscmVhZHkgdXNlZCBmb3IgYSBkaWZmZXJlbnQgbmFtZXNwYWNlCi0gICAgICBNYXAgbmFtZXNwYWNlcyA9IGdldE5hbWVzcGFjZXMoKTsKLSAgICAgIFN0cmluZyBleGlzdGluZ05hbWVzcGFjZSA9IChTdHJpbmcpIG5hbWVzcGFjZXMuZ2V0KHByZWZpeCk7Ci0gICAgICBpZiAoZXhpc3RpbmdOYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlcy5wdXQocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAKLSAgICAgICAgLy8gU3VwcG9ydCBmb3IgTmFtZXNwYWNlCi0gICAgICAgIE5hbWVzcGFjZSBlbnMgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTmFtZXNwYWNlKCk7Ci0gICAgICAgIGVucy5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgZW5zLnNldFVSSShuYW1lc3BhY2VVUkkpOwotICAgICAgICBnZXRFTmFtZXNwYWNlcygpLmFkZChlbnMpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBUaGUgcHJlZml4IGlzIHRha2VuIGFscmVhZHkuIE1ha2UgYSB1bmlxdWUgcHJlZml4Ci0gICAgICBpZiAocHJlZml4LmVuZHNXaXRoKCIxIikpCi0gICAgICAgIHByZWZpeCA9IHByZWZpeC5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCgpIC0gMSk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAyOzsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4ICsgaTsKLSAgICAgICAgaWYgKCFuYW1lc3BhY2VzLmNvbnRhaW5zS2V5KG5ld1ByZWZpeCkpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VzLnB1dChuZXdQcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gU3VwcG9ydCBmb3IgTmFtZXNwYWNlCi0gICAgICAgICAgTmFtZXNwYWNlIGVucyA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOYW1lc3BhY2UoKTsKLSAgICAgICAgICBlbnMuc2V0UHJlZml4KHByZWZpeCk7Ci0gICAgICAgICAgZW5zLnNldFVSSShuYW1lc3BhY2VVUkkpOwotICAgICAgICAgIGdldEVOYW1lc3BhY2VzKCkuYWRkKGVucyk7Ci0gICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAvLyBlbmQgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBnZXROYW1lc3BhY2VzKCkucmVtb3ZlKHByZWZpeCk7Ci0gICAgICAKLSAgICAgIC8vIFN1cHBvcnQgZm9yIE5hbWVzcGFjZQotICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5yZW1vdmUocHJlZml4KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQWRkIGEgcG9ydFR5cGUgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gcG9ydFR5cGUgdGhlIHBvcnRUeXBlIHRvIGJlIGFkZGVkCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUG9ydFR5cGUoamF2YXgud3NkbC5Qb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIGdldEVQb3J0VHlwZXMoKS5hZGQoKFBvcnRUeXBlKXBvcnRUeXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBzZXJ2aWNlIHRvIHRoaXMgV1NETCBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIHNlcnZpY2UgdGhlIHNlcnZpY2UgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlKGphdmF4LndzZGwuU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgZ2V0RVNlcnZpY2VzKCkuYWRkKChTZXJ2aWNlKXNlcnZpY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nIGZhdWx0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGJpbmRpbmcgZmF1bHQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0ZhdWx0IGNyZWF0ZUJpbmRpbmdGYXVsdCgpCi0gIHsKLSAgICBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdGYXVsdCgpOwotICAgIHJldHVybiBiaW5kaW5nRmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGJpbmRpbmcgaW5wdXQuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZyBpbnB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nSW5wdXQgY3JlYXRlQmluZGluZ0lucHV0KCkKLSAgewotICAgIGphdmF4LndzZGwuQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgYmluZGluZyBvdXRwdXQuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZyBvdXRwdXQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgQmluZGluZ091dHB1dCBjcmVhdGVCaW5kaW5nT3V0cHV0KCkKLSAgewotICAgIGphdmF4LndzZGwuQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGJpbmRpbmcgb3BlcmF0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGJpbmRpbmcgb3BlcmF0aW9uCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gY3JlYXRlQmluZGluZ09wZXJhdGlvbigpCi0gIHsKLSAgICBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nLgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5CaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKQotICB7Ci0gICAgamF2YXgud3NkbC5CaW5kaW5nIGJpbmRpbmcgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICBiaW5kaW5nLnNldFVuZGVmaW5lZCh0cnVlKTsKLSAgICByZXR1cm4gYmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgZmF1bHQuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgZmF1bHQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgRmF1bHQgY3JlYXRlRmF1bHQoKQotICB7Ci0gICAgamF2YXgud3NkbC5GYXVsdCBmYXVsdCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlRmF1bHQoKTsKLSAgICByZXR1cm4gZmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGltcG9ydC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBpbXBvcnQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5JbXBvcnQgY3JlYXRlSW1wb3J0KCkKLSAgewotICAgIGphdmF4LndzZGwuSW1wb3J0IGltcG9ydERlZiA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlSW1wb3J0KCk7Ci0gICAgcmV0dXJuIGltcG9ydERlZjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgaW5wdXQuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgaW5wdXQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgSW5wdXQgY3JlYXRlSW5wdXQoKQotICB7Ci0gICAgamF2YXgud3NkbC5JbnB1dCBpbnB1dCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlSW5wdXQoKTsKLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgbWVzc2FnZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpCi0gIHsKLSAgICBqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIG1lc3NhZ2Uuc2V0VW5kZWZpbmVkKHRydWUpOwotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgb3BlcmF0aW9uCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKQotICB7Ci0gICAgamF2YXgud3NkbC5PcGVyYXRpb24gb3BlcmF0aW9uID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVPcGVyYXRpb24oKTsKLSAgICBvcGVyYXRpb24uc2V0VW5kZWZpbmVkKHRydWUpOwotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IG91dHB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBvdXRwdXQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgT3V0cHV0IGNyZWF0ZU91dHB1dCgpCi0gIHsKLSAgICBqYXZheC53c2RsLk91dHB1dCBvdXRwdXQgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZU91dHB1dCgpOwotICAgIHJldHVybiBvdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IHBhcnQuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgcGFydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBQYXJ0IGNyZWF0ZVBhcnQoKQotICB7Ci0gICAgamF2YXgud3NkbC5QYXJ0IHBhcnQgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgcG9ydC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBwb3J0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIFBvcnQgY3JlYXRlUG9ydCgpCi0gIHsKLSAgICBqYXZheC53c2RsLlBvcnQgcG9ydCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlUG9ydCgpOwotICAgIHJldHVybiBwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBwb3J0IHR5cGUuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgcG9ydCB0eXBlCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuUG9ydFR5cGUgY3JlYXRlUG9ydFR5cGUoKQotICB7Ci0gICAgamF2YXgud3NkbC5Qb3J0VHlwZSBwb3J0VHlwZSA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICBwb3J0VHlwZS5zZXRVbmRlZmluZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIHBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBzZXJ2aWNlLgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHNlcnZpY2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5TZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoKQotICB7Ci0gICAgamF2YXgud3NkbC5TZXJ2aWNlIHNlcnZpY2UgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBiaW5kaW5nLiBBbHNvIGNoZWNrcyBpbXBvcnRlZCBkb2N1bWVudHMuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZywgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5CaW5kaW5nIGdldEJpbmRpbmcoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5CaW5kaW5nKSByZXNvbHZlV1NETEVsZW1lbnQoV1NETENvbnN0YW50cy5CSU5ESU5HLCBuYW1lLCB0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBiaW5kaW5ncyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRCaW5kaW5ncygpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlTWFwKFdTRExDb25zdGFudHMuQklORElORywgZ2V0RUJpbmRpbmdzKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgKiBHZXQgYSBtYXAgb2YgbGlzdHMgY29udGFpbmluZyBhbGwgdGhlIGltcG9ydHMgZGVmaW5lZCBoZXJlLgotICAgICogVGhlIG1hcCdzIGtleXMgYXJlIHRoZSBuYW1lc3BhY2VVUklzLCBhbmQgdGhlIG1hcCdzIHZhbHVlcwotICAgICogYXJlIGxpc3RzLiBUaGVyZSBpcyBvbmUgbGlzdCBmb3IgZWFjaCBuYW1lc3BhY2VVUkkgZm9yIHdoaWNoCi0gICAgKiBpbXBvcnRzIGhhdmUgYmVlbiBkZWZpbmVkLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0SW1wb3J0cygpCi0gIHsKLSAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIGkubmV4dCgpOwotICAgICAgU3RyaW5nIGtleSA9IHRoZUltcG9ydC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChrZXkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gIiI7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG51bGw7Ci0gICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSAoTGlzdCltYXAuZ2V0KGtleSk7Ci0gICAgICAgIGxpc3QuYWRkKHRoZUltcG9ydCk7IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsaXN0LmFkZCh0aGVJbXBvcnQpOyAgICAgICAKLSAgICAgIH0KLSAgICAgIG1hcC5wdXQoa2V5LGxpc3QpOyAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgbGlzdCBvZiBpbXBvcnRzIGZvciB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZVVSSS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSB0aGUgbmFtZXNwYWNlVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICogZGVzaXJlZCBpbXBvcnRzLgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgY29ycmVzcG9uZGluZyBpbXBvcnRzCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW1wb3J0cyhTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UobmFtZXNwYWNlVVJJLCB0aGVJbXBvcnQuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh0aGVJbXBvcnQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBtZXNzYWdlLiBBbHNvIGNoZWNrcyBpbXBvcnRlZCBkb2N1bWVudHMuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIG1lc3NhZ2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5NZXNzYWdlIGdldE1lc3NhZ2UoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5NZXNzYWdlKSByZXNvbHZlV1NETEVsZW1lbnQoV1NETENvbnN0YW50cy5NRVNTQUdFLCBuYW1lLCB0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlTWFwKFdTRExDb25zdGFudHMuTUVTU0FHRSwgZ2V0RU1lc3NhZ2VzKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgbmFtZXNwYWNlIFVSSSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcmVmaXguIE9yIG51bGwgaWYKLSAgICogdGhlcmUgaXMgbm8gbmFtZXNwYWNlIFVSSSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcmVmaXguIFRoaXMgaXMKLSAgICogdW5yZWxhdGVkIHRvIHRoZSAmbHQ7d3NkbDppbXBvcnQmZ3Q7IGVsZW1lbnQuCi0gICAqIEBzZWUgI2FkZE5hbWVzcGFjZShTdHJpbmcsIFN0cmluZykKLSAgICogQHNlZSAjZ2V0UHJlZml4KFN0cmluZykKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZShTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpIGdldE5hbWVzcGFjZXMoKS5nZXQocHJlZml4KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIG5hbWVzcGFjZSBhc3NvY2lhdGlvbnMgaW4gdGhpcyBkZWZpbml0aW9uLiBUaGUga2V5cyBhcmUKLSAgICogdGhlIHByZWZpeGVzLCBhbmQgdGhlIG5hbWVzcGFjZSBVUklzIGFyZSB0aGUgdmFsdWVzLiBUaGlzIGlzCi0gICAqIHVucmVsYXRlZCB0byB0aGUgJmx0O3dzZGw6aW1wb3J0Jmd0OyBlbGVtZW50LgotICAgKiBAc2VlICNhZGROYW1lc3BhY2UoU3RyaW5nLCBTdHJpbmcpCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXROYW1lc3BhY2VzKCkKLSAgeyAgICAKLSAgICByZXR1cm4gbmFtZXNwYWNlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBwb3J0VHlwZS4gQWxzbyBjaGVja3MgaW1wb3J0ZWQgZG9jdW1lbnRzLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBwb3J0VHlwZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwb3J0VHlwZSwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIHBvcnRUeXBlCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuUG9ydFR5cGUgZ2V0UG9ydFR5cGUoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5Qb3J0VHlwZSkgcmVzb2x2ZVdTRExFbGVtZW50KFdTRExDb25zdGFudHMuUE9SVF9UWVBFLCBuYW1lLCB0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBwb3J0VHlwZXMgZGVmaW5lZCBoZXJlLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0UG9ydFR5cGVzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5QT1JUX1RZUEUsIGdldEVQb3J0VHlwZXMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGEgcHJlZml4IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWVzcGFjZSBVUkkuIE9yIG51bGwgaWYKLSAgICogdGhlcmUgYXJlIG5vIHByZWZpeGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWVzcGFjZSBVUkkuIFRoaXMgaXMKLSAgICogdW5yZWxhdGVkIHRvIHRoZSAmbHQ7d3NkbDppbXBvcnQmZ3Q7IGVsZW1lbnQuCi0gICAqIEBzZWUgI2FkZE5hbWVzcGFjZShTdHJpbmcsIFN0cmluZykKLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlKFN0cmluZykKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBJdGVyYXRvciBlbnRyeUl0ZXJhdG9yID0gZ2V0TmFtZXNwYWNlcygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZW50cnlJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZW50cnlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBTdHJpbmcgYXNzb2NOYW1lc3BhY2VVUkkgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhhc3NvY05hbWVzcGFjZVVSSSkgJiYgcHJlZml4ICE9ICIiKSAvLyBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBzZXJ2aWNlLiBBbHNvIGNoZWNrcyBpbXBvcnRlZCBkb2N1bWVudHMuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHNlcnZpY2UuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgc2VydmljZSwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIHNlcnZpY2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5TZXJ2aWNlIGdldFNlcnZpY2UoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5TZXJ2aWNlKSByZXNvbHZlV1NETEVsZW1lbnQoV1NETENvbnN0YW50cy5TRVJWSUNFLCBuYW1lLCB0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBzZXJ2aWNlcyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRTZXJ2aWNlcygpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlTWFwKFdTRExDb25zdGFudHMuU0VSVklDRSwgZ2V0RVNlcnZpY2VzKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgRXh0ZW5zaW9uUmVnaXN0cnkgZm9yIHRoaXMgRGVmaW5pdGlvbi4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gICAgcmV0dXJuIGV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFNldCB0aGUgRXh0ZW5zaW9uUmVnaXN0cnkgZm9yIHRoaXMgRGVmaW5pdGlvbi4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uUmVnaXN0cnkgPSBleHRlbnNpb25SZWdpc3RyeTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlVVJJKCkKLSAgewotICAgIHJldHVybiBnZXRMb2NhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRCYXNlVVJJKFN0cmluZyBkb2N1bWVudEJhc2UpCi0gIHsKLSAgICBzZXRMb2NhdGlvbihkb2N1bWVudEJhc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuVHlwZXMgY3JlYXRlVHlwZXMoKQotICB7Ci0gICAgamF2YXgud3NkbC5UeXBlcyB0eXBlcyA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlVHlwZXMoKTsKLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5TZXJ2aWNlIHJlbW92ZVNlcnZpY2UoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5TZXJ2aWNlKSBnZXRTZXJ2aWNlcygpLnJlbW92ZShuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmcgcmVtb3ZlQmluZGluZyhRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLkJpbmRpbmcpIGdldEJpbmRpbmdzKCkucmVtb3ZlKG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuUG9ydFR5cGUgcmVtb3ZlUG9ydFR5cGUoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5Qb3J0VHlwZSkgZ2V0UG9ydFR5cGVzKCkucmVtb3ZlKG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSByZW1vdmVNZXNzYWdlKFFOYW1lIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gKGphdmF4LndzZGwuTWVzc2FnZSkgZ2V0TWVzc2FnZXMoKS5yZW1vdmUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5UeXBlcyBnZXRUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RVR5cGVzKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlcyhqYXZheC53c2RsLlR5cGVzIHR5cGVzKQotICB7Ci0gICAgc2V0RVR5cGVzKChUeXBlcykgdHlwZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkKLSAgewotICAgIHJldHVybiBkb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBTZXRzIHRoZSBvd25lciBkb2N1bWVudC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VNRVNTQUdFUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVNZXNzYWdlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFUG9ydFR5cGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FQklORElOR1M6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQmluZGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VTRVJWSUNFUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVTZXJ2aWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5BTUVTUEFDRVM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFTmFtZXNwYWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVUeXBlcyhudWxsLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FSU1QT1JUUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVJbXBvcnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1RBUkdFVF9OQU1FU1BBQ0U6Ci0gICAgICAgIHJldHVybiBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT046Ci0gICAgICAgIHJldHVybiBnZXRMb2NhdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19RTkFNRToKLSAgICAgICAgcmV0dXJuIGdldFFOYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HOgotICAgICAgICByZXR1cm4gZ2V0RW5jb2RpbmcoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICByZXR1cm4gZ2V0RU1lc3NhZ2VzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VQT1JUX1RZUEVTOgotICAgICAgICByZXR1cm4gZ2V0RVBvcnRUeXBlcygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FQklORElOR1M6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ3MoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVNFUlZJQ0VTOgotICAgICAgICByZXR1cm4gZ2V0RVNlcnZpY2VzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQU1FU1BBQ0VTOgotICAgICAgICByZXR1cm4gZ2V0RU5hbWVzcGFjZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTOgotICAgICAgICByZXR1cm4gZ2V0RVR5cGVzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICByZXR1cm4gZ2V0RUltcG9ydHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgc2V0VGFyZ2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0xPQ0FUSU9OOgotICAgICAgICBzZXRMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkNPRElORzoKLSAgICAgICAgc2V0RW5jb2RpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICBnZXRFTWVzc2FnZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFTWVzc2FnZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VQT1JUX1RZUEVTOgotICAgICAgICBnZXRFUG9ydFR5cGVzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBvcnRUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUJJTkRJTkdTOgotICAgICAgICBnZXRFQmluZGluZ3MoKS5jbGVhcigpOwotICAgICAgICBnZXRFQmluZGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VTRVJWSUNFUzoKLSAgICAgICAgZ2V0RVNlcnZpY2VzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVNlcnZpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkFNRVNQQUNFUzoKLSAgICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFTmFtZXNwYWNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTOgotICAgICAgICBzZXRFVHlwZXMoKFR5cGVzKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FSU1QT1JUUzoKLSAgICAgICAgZ2V0RUltcG9ydHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFSW1wb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICBzZXRUYXJnZXROYW1lc3BhY2UoVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT046Ci0gICAgICAgIHNldExvY2F0aW9uKExPQ0FUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoUU5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HOgotICAgICAgICBzZXRFbmNvZGluZyhFTkNPRElOR19FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICBnZXRFTWVzc2FnZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VQT1JUX1RZUEVTOgotICAgICAgICBnZXRFUG9ydFR5cGVzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FQklORElOR1M6Ci0gICAgICAgIGdldEVCaW5kaW5ncygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVNFUlZJQ0VTOgotICAgICAgICBnZXRFU2VydmljZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQU1FU1BBQ0VTOgotICAgICAgICBnZXRFTmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTOgotICAgICAgICBzZXRFVHlwZXMoKFR5cGVzKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICBnZXRFSW1wb3J0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgcmV0dXJuIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZSAhPSBudWxsIDogIVRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0xPQ0FUSU9OOgotICAgICAgICByZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBRTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcU5hbWUgIT0gbnVsbCA6ICFRTkFNRV9FREVGQVVMVC5lcXVhbHMocU5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkNPRElORzoKLSAgICAgICAgcmV0dXJuIEVOQ09ESU5HX0VERUZBVUxUID09IG51bGwgPyBlbmNvZGluZyAhPSBudWxsIDogIUVOQ09ESU5HX0VERUZBVUxULmVxdWFscyhlbmNvZGluZyk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VNRVNTQUdFUzoKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlcyAhPSBudWxsICYmICFlTWVzc2FnZXMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FUE9SVF9UWVBFUzoKLSAgICAgICAgcmV0dXJuIGVQb3J0VHlwZXMgIT0gbnVsbCAmJiAhZVBvcnRUeXBlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgcmV0dXJuIGVCaW5kaW5ncyAhPSBudWxsICYmICFlQmluZGluZ3MuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FU0VSVklDRVM6Ci0gICAgICAgIHJldHVybiBlU2VydmljZXMgIT0gbnVsbCAmJiAhZVNlcnZpY2VzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5BTUVTUEFDRVM6Ci0gICAgICAgIHJldHVybiBlTmFtZXNwYWNlcyAhPSBudWxsICYmICFlTmFtZXNwYWNlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VUWVBFUzoKLSAgICAgICAgcmV0dXJuIGVUeXBlcyAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FSU1QT1JUUzoKLSAgICAgICAgcmV0dXJuIGVJbXBvcnRzICE9IG51bGwgJiYgIWVJbXBvcnRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0TmFtZXNwYWNlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBsb2NhdGlvbjogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChsb2NhdGlvbik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBxTmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChxTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBlbmNvZGluZzogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChlbmNvZGluZyk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIEhhbmQtY29kZWQgbWV0aG9kcwotICAvLwotCi0gIHByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VTZXQgZ2xvYmFsUmVzb3VyY2VTZXQ7Ci0KLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUmVzb3VyY2VTZXQgZ2V0R2xvYmFsUmVzb3VyY2VTZXQoKQotICB7Ci0gICAgaWYgKGdsb2JhbFJlc291cmNlU2V0ID09IG51bGwpCi0gICAgewotICAgICAgZ2xvYmFsUmVzb3VyY2VTZXQgPSBjcmVhdGVSZXNvdXJjZVNldCgpOwotICAgICAgLy9TdHJpbmcgYmFzZVVSTCA9IFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0QmFzZVVSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQmFzZSBVUkwgaXM6ICIgKyBiYXNlVVJMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2xvYmFsUmVzb3VyY2VTZXQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGNyZWF0ZVJlc291cmNlU2V0KCkKLSAgewotICAgIFJlc291cmNlU2V0IHJlc3VsdCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICByZXN1bHQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uKE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uKG5vZGUsIG51bGwpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oTm9kZSBub2RlLCBTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlRGVmaW5pdGlvbihub2RlLGxvY2F0aW9uLHRydWUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gY3JlYXRlRGVmaW5pdGlvbihOb2RlIG5vZGUsIFN0cmluZyBsb2NhdGlvbiwgYm9vbGVhbiB1c2VFeHRlbnNpb25GYWN0b3JpZXMpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikuc2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKHVzZUV4dGVuc2lvbkZhY3Rvcmllcyk7Ci0gICAgZGVmaW5pdGlvbi5zZXRFbGVtZW50KChFbGVtZW50KSBub2RlKTsKLSAgICBkZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShsb2NhdGlvbik7Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLSAgCi0gIHByaXZhdGUgV1NETEVsZW1lbnQgcmVzb2x2ZVdTRExFbGVtZW50KGludCB0eXBlLCBMaXN0IGxpc3QsIFFOYW1lIHFuYW1lKQotICB7Ci0gICAgV1NETEVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgICBRTmFtZSB0aGVRTmFtZSA9IGdldFFOYW1lRm9yV1NETEVsZW1lbnQodHlwZSwgd3NkbEVsZW1lbnQpOwotICAgICAgICBpZiAocW5hbWUuZXF1YWxzKHRoZVFOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHdzZGxFbGVtZW50OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIEhhc2hNYXAgY3JlYXRlTWFwKGludCB0eXBlLCBMaXN0IGxpc3QpCi0gIHsKLSAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgUU5hbWUgdGhlUU5hbWUgPSBnZXRRTmFtZUZvcldTRExFbGVtZW50KHR5cGUsIHdzZGxFbGVtZW50KTsKLSAgICAgIGlmICh0aGVRTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBtYXAucHV0KHRoZVFOYW1lLCB3c2RsRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICBwcml2YXRlIFFOYW1lIGdldFFOYW1lRm9yV1NETEVsZW1lbnQoaW50IHR5cGUsIFdTRExFbGVtZW50IHdzZGxFbGVtZW50KQotICB7Ci0gICAgUU5hbWUgcmVzdWx0ID0gbnVsbDsKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk1FU1NBR0UgOgotICAgICAgICByZXN1bHQgPSAoKE1lc3NhZ2UpIHdzZGxFbGVtZW50KS5nZXRRTmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5QT1JUX1RZUEUgOgotICAgICAgICByZXN1bHQgPSAoKFBvcnRUeXBlKSB3c2RsRWxlbWVudCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuQklORElORyA6Ci0gICAgICAgIHJlc3VsdCA9ICgoQmluZGluZykgd3NkbEVsZW1lbnQpLmdldFFOYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlNFUlZJQ0UgOgotICAgICAgICByZXN1bHQgPSAoKFNlcnZpY2UpIHdzZGxFbGVtZW50KS5nZXRRTmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlc29sdmVzIHRoZSBlbGVtZW50IGRlc2NyaWJlZCBieSB0eXBlIGFuZCBxbmFtZSBpbiB0aGUgY29udGV4dCBvZiB0aGUKLSAgICogZ2l2ZW4gZGVmaW5pdGlvbi4gVGhlIGRlZmluaXRpb24ncyBpbXBvcnRlZCBkZWZpbml0aW9ucyBhcmUgY2hlY2tlZCBhcyB3ZWxsLgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICogQHBhcmFtIHFuYW1lIHRoZSBlbGVtZW50J3MgUU5hbWUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uIHRoZSBjb250ZXh0IGRlZmluaXRpb24uIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIFdTRExFbGVtZW50IG9yIG51bGwgaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFdTRExFbGVtZW50IHJlc29sdmVXU0RMRWxlbWVudChpbnQgdHlwZSwgUU5hbWUgcW5hbWUsIERlZmluaXRpb25JbXBsIGRlZmluaXRpb24pCi0gIHsKLSAgICBpZiAocW5hbWUgPT0gbnVsbCB8fCBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIExpc3QgZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZGVmaW5pdGlvbnMuYWRkKGRlZmluaXRpb24pOwotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IHJlc29sdmVXU0RMRWxlbWVudCh0eXBlLCBxbmFtZSwgZGVmaW5pdGlvbnMsIG5ldyBBcnJheUxpc3QoKSk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvKioKLSAgICogUmVzb2x2ZXMgdGhlIGVsZW1lbnQgZGVzY3JpYmVkIGJ5IHR5cGUgYW5kIHFuYW1lIGluIHRoZSBjb250ZXh0IG9mIHRoZQotICAgKiBnaXZlbiBkZWZpbml0aW9ucy4gVGhlIGRlZmluaXRpb25zIGltcG9ydGVkIGRlZmluaXRpb25zIGFyZSBjaGVja2VkIGFzIHdlbGwuCi0gICAqIAotICAgKiBJTVBPUlRBTlQhIFRoaXMgbWV0aG9kIGlzIHJlY3Vyc2l2ZS4gSXQgY2hlY2tzIHRoZSBkZWZpbml0aW9ucyBhbmQgYWxsIHRoZWlyCi0gICAqIGltcG9ydGVkIGRlZmluaXRpb25zLiBJdCBhbHNvIGlzIGNvZGVkIHN1Y2ggdGhhdCBpdCBhdm9pZHMgYSBjeWNsaWMgaW1wb3J0Ci0gICAqIHNob3VsZCBvbmUgYmUgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZSB0aGUgZWxlbWVudCB0eXBlLgotICAgKiBAcGFyYW0gcW5hbWUgdGhlIGVsZW1lbnQncyBxTmFtZS4KLSAgICogQHBhcmFtIGRlZmluaXRpb25zIHRoZSBjb250ZXh0IGRlZmluaXRpb25zCi0gICAqIEBwYXJhbSB2aXNpdGVkRGVmaW5pdGlvbnMgYSBsaXN0IHdpdGggdGhlIGRlZmluaXRpb25zIGFscmVhZHkgdmlzaXRlZC4KLSAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgV1NETEVsZW1lbnQgb3IgbnVsbCBpZiBvbmUgY2Fubm90IGJlIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgV1NETEVsZW1lbnQgcmVzb2x2ZVdTRExFbGVtZW50KGludCB0eXBlLCBRTmFtZSBxbmFtZSwgTGlzdCBkZWZpbml0aW9ucywgTGlzdCB2aXNpdGVkRGVmaW5pdGlvbnMpCi0gIHsKLSAgICBXU0RMRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIAotICAgIGlmIChkZWZpbml0aW9ucy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBJbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgb2xkIGJlaGF2aW91ciB3aGljaCB1c2VkIHRvIGNoZWNrIHRoZSBkZWZpbml0aW9uCi0gICAgLy8gYW5kIGFsbCBmaXJzdCBsZXZlbCBpbXBvcnRzLCBjaGVjayB0aGUgZW50aXJlIGxpc3Qgb2YgZGVmaW5pdGlvbnMgcGFzc2VkCi0gICAgLy8gaW4gZmlyc3QuCi0gICAgCi0gICAgSXRlcmF0b3IgZGVmaW5pdGlvbnNJdGVyYXRvciA9IGRlZmluaXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgd2hpbGUgKGRlZmluaXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIERlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb25zSXRlcmF0b3IubmV4dCgpOwotCi0gICAgICByZXN1bHQgPSBkZWZpbml0aW9uLnJlc29sdmVXU0RMRWxlbWVudCh0eXBlLCBxbmFtZSk7Ci0gICAgICAKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gUmUtaXRlcmF0ZSBvdmVyIHRoZSBkZWZpbml0aW9ucyBhbmQgcmVjdXJzZSBpbnRvIHRoZWlyIGltcG9ydHMuCi0gICAgCi0gICAgZGVmaW5pdGlvbnNJdGVyYXRvciA9IGRlZmluaXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgd2hpbGUgKGRlZmluaXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIERlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb25zSXRlcmF0b3IubmV4dCgpOwotICAgICAgCi0gICAgICBpZiAodmlzaXRlZERlZmluaXRpb25zLmNvbnRhaW5zKGRlZmluaXRpb24pKQotICAgICAgewotICAgICAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB3ZSBoYXZlIGEgY2FzZSBvZiBjeWNsaWMgaW1wb3J0cy4gU2luY2Ugd2UKLSAgICAgICAgLy8gYWxyZWFkeSBsb29rZWQgaW4gaXQsIHdlIGNhbiBhbmQgc2hvdWxkIHNraXAgaXQuCi0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9ICAgICAgCi0gICAgICAKLSAgICAgIHZpc2l0ZWREZWZpbml0aW9ucy5hZGQoZGVmaW5pdGlvbik7Ci0KLSAgICAgIExpc3QgaW1wb3J0ZWREZWZpbml0aW9ucyA9IGRlZmluaXRpb24uZ2V0SW1wb3J0ZWREZWZpbml0aW9ucyhxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICAgIHJlc3VsdCA9IHJlc29sdmVXU0RMRWxlbWVudCh0eXBlLCBxbmFtZSwgaW1wb3J0ZWREZWZpbml0aW9ucywgdmlzaXRlZERlZmluaXRpb25zKTsKLQotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgV1NETEVsZW1lbnQgcmVzb2x2ZVdTRExFbGVtZW50KGludCB0eXBlLCBRTmFtZSBxbmFtZSkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpCi0gICAgewotICAgICAgc3dpdGNoICh0eXBlKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuTUVTU0FHRToKLSAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZ2V0RU1lc3NhZ2VzKCksIHFuYW1lKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRToKLSAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZ2V0RVBvcnRUeXBlcygpLCBxbmFtZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HOgotICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVXU0RMRWxlbWVudCh0eXBlLCBnZXRFQmluZGluZ3MoKSwgcW5hbWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuU0VSVklDRToKLSAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZ2V0RVNlcnZpY2VzKCksIHFuYW1lKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgLy8KLSAgLy8gUmVjb25jaWxpYXRpb24gbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRWxlbWVudCBvbGRFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmIChvbGRFbGVtZW50IGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpCi0gICAgewotICAgICAgRXZlbnRUYXJnZXQgb2xkRXZlbnRUYXJnZXQgPSAoKEV2ZW50VGFyZ2V0KW9sZEVsZW1lbnQpOwotICAgICAgb2xkRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTm9kZUluc2VydGVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICAgIG9sZEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTU5vZGVSZW1vdmVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICAgIG9sZEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUF0dHJNb2RpZmllZCIsIGdldEV2ZW50TGlzdGVuZXIoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIHN1cGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFdmVudFRhcmdldCkKLSAgICB7Ci0gICAgICBFdmVudFRhcmdldCBldmVudFRhcmdldCA9ICgoRXZlbnRUYXJnZXQpZWxlbWVudCk7Ci0gICAgICBldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJET01Ob2RlSW5zZXJ0ZWQiLCBnZXRFdmVudExpc3RlbmVyKCksIHRydWUpOwotICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTm9kZVJlbW92ZWQiLCBnZXRFdmVudExpc3RlbmVyKCksIHRydWUpOwotICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQXR0ck1vZGlmaWVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgaWYgKGNoYW5nZWRFbGVtZW50ID09IGdldEVsZW1lbnQoKSkKLSAgICB7IAotICAgICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikpCi0gICAgICAgIHNldFRhcmdldE5hbWVzcGFjZShjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIpKTsKLQkgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgICAgc2V0UU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLCBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpOwotICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5jbGVhcigpOwotICAgICAgZ2V0TmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0gICAgICAvL2dldE5hbWVzcGFjZXMoKS5wdXQoIiIsIG51bGwpOwotCi0gICAgICBOYW1lZE5vZGVNYXAgbWFwID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBtYXAuaXRlbShpKTsKLSAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0UHJlZml4KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgbnNQcmVmaXggPSBhdHRyLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0Tm9kZU5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuc1ByZWZpeCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5zUHJlZml4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXROYW1lc3BhY2VzKCkucHV0KG5zUHJlZml4LCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkJJTkRJTkcgOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgICAgICBiaW5kaW5nLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgYmluZGluZy5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBDUzogd2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byB1bnNldCB0aGlzIGVsZW1lbnQgd2hlbiBpdHMgcmVtb3ZlZAotICAgICAgICAgIC8vZGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChjaGlsZCk7ICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLklNUE9SVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbXBvcnQgaSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICAgICAgICBpLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgaS5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRJbXBvcnQoaSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgbWVzc2FnZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHRoaXMpOwotICAgICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYWRkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICAgIHBvcnRUeXBlLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgcG9ydFR5cGUuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuU0VSVklDRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICBzZXJ2aWNlLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgc2VydmljZS5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuVFlQRVMgOgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGdldEVUeXBlcygpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgVHlwZXMgdHlwZXMgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVR5cGVzKCk7Ci0gICAgICAgICAgICB0eXBlcy5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHRoaXMpOwotICAgICAgICAgICAgdHlwZXMuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgICBzZXRFVHlwZXModHlwZXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gZ2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkgPyAKLSAgICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICgoV1NETEZhY3RvcnlJbXBsKVdTRExGYWN0b3J5LmVJTlNUQU5DRSkuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICAgIAkgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbih0aGlzKTsKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBUeXBlcykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgICAgaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbW9kZWxPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24uc2V0RVR5cGVzKG51bGwpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChjb21wb25lbnQsIG1vZGVsT2JqZWN0KTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0TGlzdChPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGNvbXBvbmVudDsKLQotICAgIC8vIHRvZG8uLi4gdXNlIFdTRExTd2l0Y2gKLSAgICAvLwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBJbXBvcnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKSk7Ci0gICAgbGlzdC5hZGQoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHVibGljIERvY3VtZW50IHVwZGF0ZURvY3VtZW50KCkKLSAgewotICAgIGRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKLSAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gIH0KLQotICBwcml2YXRlIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuREVGSU5JVElPTik7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0KLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVJbXBvcnRzKCkpOwotCi0gICAgVHlwZXMgdHlwZXMgPSBnZXRFVHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChUeXBlc0ltcGwpIHR5cGVzKS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVNZXNzYWdlcygpKTsKLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVQb3J0VHlwZXMoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFQmluZGluZ3MoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFU2VydmljZXMoKSk7Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZENoaWxkRWxlbWVudHMoRWxlbWVudCBwYXJlbnQsIExpc3QgYykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgV1NETEVsZW1lbnRJbXBsIHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50SW1wbCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9IHdzZGxFbGVtZW50LmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIC8vIEFkZCBuYW1lc3BhY2UgcHJlZml4IGluZm8KLSAgICAvLyBUQkQgLSBOZWVkIHRvIHJldmlzaXQuCi0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgJiYgdGhlRWxlbWVudCAhPSBudWxsKSAKLSAgICAvLyBXZSBhcmUgdXBkYXRpbmcgdGhlIERlZmluaXRpb24gZWxlbWVudC4KLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldE5hbWVzcGFjZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgIFN0cmluZyB1cmkgPSBudWxsOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgdXJpID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHByZWZpeCAhPSAiIikKLSAgICAgICAgICB0aGVFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhTRENvbnN0YW50cy5YTUxOU19VUklfMjAwMCwgInhtbG5zOiIgKyBwcmVmaXgsIHVyaSk7Ci0gICAgICAgIGVsc2UgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgIC8vIEhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZSwgZS5nLiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgdGhlRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYU0RDb25zdGFudHMuWE1MTlNfVVJJXzIwMDAsICJ4bWxucyIsIHVyaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7ICAgIAotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOyAKLSAgICAKLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy9pZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRW5jb2RpbmcoKSkKLSAgICAgIC8vICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuRU5DT0RJTkdfQVRUUklCVVRFLCBnZXRFbmNvZGluZygpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmaW5pdGlvbl9RTmFtZSgpKQotICAgICAgICBpZiAoZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCkpCi0gICAgICAgIGlmIChnZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFLCBnZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0IGdldEltcG9ydGVkRGVmaW5pdGlvbnMoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEltcG9ydHMobmFtZXNwYWNlKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIGkubmV4dCgpOwotICAgICAgKChJbXBvcnRJbXBsKSB0aGVJbXBvcnQpLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotICAgICAgRGVmaW5pdGlvbiBpbXBvcnRlZERlZmluaXRpb24gPSB0aGVJbXBvcnQuZ2V0RURlZmluaXRpb24oKTsKLSAgICAgIGlmIChpbXBvcnRlZERlZmluaXRpb24gIT0gbnVsbCAmJiBXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UobmFtZXNwYWNlLCBpbXBvcnRlZERlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChpbXBvcnRlZERlZmluaXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvblVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIjIik7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24odXJpLnN1YnN0cmluZygwLCBpbmRleCksIHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnREZWZpbmVkKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIC8vIG5vdGUgdGhlIGdldENvbnRhaW5lcigpIHRlc3QgdG8gZWxpbWluYXRlICdzeW50aGV0aWMnIHR5cGVzCi0gICAgLy8gdGhhdCBhcmUgY3JlYXRlZCBieSB0aGUgWE1MU2NoZW1hIG1vZGVsIHdoZW4gcmVzb2x1dGlvbiBmYWlscyAgIAotICAgIHJldHVybiBjb21wb25lbnQgIT0gbnVsbCAmJiBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLSAgfSAKLSAgCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVzb2x2ZVNjaGVtYShuYW1lc3BhY2UpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgaS5uZXh0KCk7Ci0gICAgICByZXN1bHQgPSBzY2hlbWEucmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICBpZiAoaXNDb21wb25lbnREZWZpbmVkKHJlc3VsdCkpICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7IAotICAgIH0KLSAgICAKLSAgICAvLyBDb3VsZCBub3QgcmVzb2x2ZS4gVHJ5IGFnYWluc3QgYWxsIDxpbXBvcnQ+ZWQgYW5kIGlubGluZWQgc2NoZW1hcy4KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRJbXBvcnRlZE9ySW5saW5lZFNjaGVtYXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpaS5uZXh0KCk7Ci0gICAgICByZXN1bHQgPSBzY2hlbWEucmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICBpZiAoaXNDb21wb25lbnREZWZpbmVkKHJlc3VsdCkpICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7ICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBYU0RUeXBlRGVmaW5pdGlvbiByZXNvbHZlVHlwZURlZmluaXRpb25VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIjIik7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHJlc29sdmVUeXBlRGVmaW5pdGlvbih1cmkuc3Vic3RyaW5nKDAsIGluZGV4KSwgdXJpLnN1YnN0cmluZyhpbmRleCArIDEpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBYU0RUeXBlRGVmaW5pdGlvbiByZXNvbHZlVHlwZURlZmluaXRpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVzb2x2ZVNjaGVtYShuYW1lc3BhY2UpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSlpLm5leHQoKTsKLSAgICAgIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24obmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgaWYgKGlzQ29tcG9uZW50RGVmaW5lZChyZXN1bHQpKSAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OyAgICAgIAotICAgIH0KLSAgICAKLSAgICAvLyBDb3VsZCBub3QgcmVzb2x2ZS4gVHJ5IGFnYWluc3QgYWxsIDxpbXBvcnQ+ZWQgYW5kIGlubGluZWQgc2NoZW1hcy4KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRJbXBvcnRlZE9ySW5saW5lZFNjaGVtYXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpaS5uZXh0KCk7Ci0gICAgICByZXN1bHQgPSBzY2hlbWEucmVzb2x2ZVR5cGVEZWZpbml0aW9uKG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgIGlmIChpc0NvbXBvbmVudERlZmluZWQocmVzdWx0KSkgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsgCi0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7IC8vIEZhaWxlZCB0byByZXNvbHZlLgotICB9Ci0KLSAgLyoqCi0gIAkqIFRoaXMgcmV0dXJucyBzZXQgb2Ygc2NoZW1hcyB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UgYXMgaXQncyB0YXJnZXQgbmFtZXNwYWNlLgotICAJKi8KLSAgcHVibGljIENvbGxlY3Rpb24gcmVzb2x2ZVNjaGVtYShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgaWYgKCIiLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgfQotCi0gICAgaWYgKFhTRENvbnN0YW50cy5pc1NjaGVtYUZvclNjaGVtYU5hbWVzcGFjZShuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEobmFtZXNwYWNlKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRENvbnN0YW50cy5pc1NjaGVtYUluc3RhbmNlTmFtZXNwYWNlKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUluc3RhbmNlKG5hbWVzcGFjZSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGdldEltcG9ydGVkT3JJbmxpbmVkU2NoZW1hcyhuYW1lc3BhY2UpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0SW1wb3J0ZWRPcklubGluZWRTY2hlbWFzKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7Ci0gICAgfQotCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UodGhlSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgICAoKEltcG9ydEltcGwpIHRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGdldEVUeXBlcygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGkubmV4dCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICB7ICAKLSAgICAgICAgICBsaXN0LmFkZChzY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGNvbXBvbmVudCA9IGoubmV4dCgpOwotICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNESW1wb3J0IHRoZUltcG9ydCA9IChYU0RJbXBvcnQpY29tcG9uZW50OwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHModGhlSW1wb3J0LmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKChYU0RJbXBvcnRJbXBsKXRoZUltcG9ydCkuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBpbXBvcnRlZFNjaGVtYSA9IHRoZUltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKGltcG9ydGVkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGltcG9ydGVkU2NoZW1hKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICAgIAotICAgICAgfSAgICAgCi0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0SW1wb3J0ZWRPcklubGluZWRTY2hlbWFzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICAoKEltcG9ydEltcGwpIHRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgbGlzdC5hZGQoc2NoZW1hKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdldEVUeXBlcygpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGRBbGwoZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFdmVudExpc3RlbmVyIGV2ZW50TGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBOb2RlIGRlbGV0aW9uTm9kZTsKLQotICBwdWJsaWMgTm9kZSBnZXREZWxldGlvbk5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGRlbGV0aW9uTm9kZTsKLSAgfQotCi0gIHByb3RlY3RlZCBFdmVudExpc3RlbmVyIGdldEV2ZW50TGlzdGVuZXIoKQotICB7Ci0gICAgaWYgKGV2ZW50TGlzdGVuZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBldmVudExpc3RlbmVyID0gCi0gICAgICAgIG5ldyBFdmVudExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNdXRhdGlvbkV2ZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBNdXRhdGlvbkV2ZW50IG11dGF0aW9uRXZlbnQgPSAoTXV0YXRpb25FdmVudClldmVudDsKLSAgICAgICAgICAgICAgaWYgKG11dGF0aW9uRXZlbnQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpbXV0YXRpb25FdmVudC5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uRXZlbnQuZ2V0QXR0ckNoYW5nZSgpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGxpc3RlbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscygiRE9NTm9kZVJlbW92ZWQiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uTm9kZSA9IChOb2RlKWV2ZW50LmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVsZW1lbnRDb250ZW50c0NoYW5nZWQoKEVsZW1lbnQpbm9kZS5nZXRQYXJlbnROb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGlvbk5vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGxpc3RlbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIHJldHVybiBldmVudExpc3RlbmVyOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChOb2RlIG5vZGUpCi0gIHsKLSAgICAvLyBXZSBjb25zaWRlciBhbGwgcGFyZW50cyBzbyB0aGF0IHRoZXkgY2FuIGhhbmRsZSBvdGhlciBjb250YWluZWQgbm9kZXMgdGhhdCBvdGhlcndpc2UgZG9uJ3QgY29ycmVzcG9uZCB0byBhIGNvbXBvbmVudC4KLSAgICAvLwotICAgIExpc3QgcGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgIHsKLSAgICAgIG5vZGUgPSAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTa2lwIGFoZWFkIHRvIGFuIGVsZW1lbnQuCi0gICAgICAvLwotICAgICAgZm9yIChOb2RlIHNjYW5Ob2RlID0gbm9kZTsgc2Nhbk5vZGUgIT0gbnVsbDsgc2Nhbk5vZGUgPSBzY2FuTm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAoc2Nhbk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIG5vZGUgPSBzY2FuTm9kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAKLSAgICAgIC8vIFNraXAgYmFjayB0byBhbiBlbGVtZW50LgotICAgICAgLy8KLSAgICAgIGZvciAoTm9kZSBzY2FuTm9kZSA9IG5vZGU7IHNjYW5Ob2RlICE9IG51bGw7IHNjYW5Ob2RlID0gc2Nhbk5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChzY2FuTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9IHNjYW5Ob2RlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICAvLyBOYXZpZ2F0ZSBvdXQgdGhyb3VnaCB0aGUgZWxlbWVudHMuCi0gICAgLy8KLSAgICBmb3IgKE5vZGUgcGFyZW50ID0gbm9kZTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpCi0gICAgewotICAgICAgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBwYXJlbnRzLmFkZChwYXJlbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIFdTRExFbGVtZW50IGJlc3RXU0RMRWxlbWVudCA9IGdldEJlc3RXU0RMRWxlbWVudChwYXJlbnRzKTsKLSAgICByZXR1cm4gYmVzdFdTRExFbGVtZW50OwotICB9Ci0gIAotICAvLwotICAvLwotICAvLwotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdHJ1ZTsgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAJdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFVzZUV4dGVuc2lvbkZhY3RvcmllcygpCi0gIHsKLSAgCXJldHVybiB1c2VFeHRlbnNpb25GYWN0b3JpZXM7Ci0gIH0KLSAgCi0gIC8vIFNlZSBCdWcgNTM2NgotICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgZG9jdW1lbnQgPSBudWxsOwotICAgICBlbGVtZW50ID0gbnVsbDsKLSAgICAgZ2V0RVNlcnZpY2VzKCkuY2xlYXIoKTsKLSAgICAgZ2V0RUJpbmRpbmdzKCkuY2xlYXIoKTsKLSAgICAgZ2V0RVBvcnRUeXBlcygpLmNsZWFyKCk7Ci0gICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgIHNldEVUeXBlcyhudWxsKTsKLSAgICAgZ2V0RUltcG9ydHMoKS5jbGVhcigpOwotICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICB9IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbmxpbmVTY2hlbWFMb2NhdGlvbnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICBUeXBlcyB0eXBlcyA9IHRoaXMuZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBqID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGoubmV4dCgpOwotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgIAkvLyBXZSBuZWVkIHRoaXMgdHJ5LWNhdGNoIGJsb2NrIGluIGNhc2Ugd2UgZW5jb3VudGVyIGFuIGV4Y2VwdGlvbiB3aGlsZSBhdHRlbXB0aW5nCi0gICAgICAgIAkvLyB0byByZXNvbHZlIHRoZSBzY2hlbWEuICBJbiB0aGUgY2FzZSBvZiB0aGUgV1NETCBFZGl0b3IsIHdlIGdldCBhCi0gICAgICAgIAkvLyAnY2Fubm90IGNyZWF0ZSBwYXJ0IGV4Y2VwdGlvbicuLi4uLi5TZWUgZWNsaXBzZSBidWd6aWxsYSBidWcgODk4NTUKLSAgICAgICAgCXRyeQotICAgICAgICAJewotICAgICAgICAJCXNjaGVtYS5zZXRTY2hlbWFMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIAl9Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgCi0gICAgfSAgICAgIAotICB9ICAKLSAgCi19IC8vRGVmaW5pdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODQyNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCNnZXRFbGVtZW50VHlwZSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlcXVpcmVkKCkgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1JlcXVpcmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVxdWlyZWQoKSA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUmVxdWlyZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudFR5cGUoKSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgRUxFTUVOVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudFR5cGUoKSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBlbGVtZW50VHlwZSA9IEVMRU1FTlRfVFlQRV9FREVGQVVMVDsKLQotICBwcml2YXRlIEhhc2hNYXAgYmVhblByb3BlcnR5RGVzY3JpcHRvcnM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gbmV3UmVxdWlyZWQpCi0gIHsKLSAgICBib29sZWFuIG9sZFJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgcmVxdWlyZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKGVDbGFzcygpLmdldEVQYWNrYWdlKCkuZ2V0TnNVUkkoKSwgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgbmV3RWxlbWVudFR5cGUpCi0gIHsKLSAgICBRTmFtZSBvbGRFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotICAgIGVsZW1lbnRUeXBlID0gbmV3RWxlbWVudFR5cGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEUsIG9sZEVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHJlcXVpcmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVsZW1lbnRUeXBlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVsZW1lbnRUeXBlKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldFJlcXVpcmVkKCkKLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldFJlcXVpcmVkKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbihpc1JlcXVpcmVkKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50I3NldFJlcXVpcmVkKEJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKQotICB7Ci0gICAgc2V0UmVxdWlyZWQocmVxdWlyZWQuYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciBhIGdpdmVuIGNsYXNzLgotICAgKi8KLSAgcHVibGljIGphdmEudXRpbC5NYXAgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuQ2xhc3MgY2xhenopCi0gIHsKLSAgICAvLyBMb29rdXAgcHJvcGVydGllcyBjYWNoZQotICAgIE1hcCBwcm9wZXJ0aWVzID0gbnVsbDsKLSAgICBpZiAoYmVhblByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkKLSAgICAgIGJlYW5Qcm9wZXJ0eURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBlbHNlCi0gICAgICBwcm9wZXJ0aWVzID0gKE1hcCkgYmVhblByb3BlcnR5RGVzY3JpcHRvcnMuZ2V0KGNsYXp6KTsKLQotICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgewotICAgICAgLy8gSW50cm9zcGVjdCB0aGUgYmVhbgotICAgICAgQXJyYXlMaXN0IGJpbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBCZWFuSW5mbyBiaW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhjbGF6eik7Ci0gICAgICAgIGlmIChiaW5mbyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYmluZm9zLmFkZChiaW5mbyk7Ci0gICAgICAgICAgQmVhbkluZm9bXSBhYmluZm8gPSBiaW5mby5nZXRBZGRpdGlvbmFsQmVhbkluZm8oKTsKLSAgICAgICAgICBpZiAoYWJpbmZvICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBhYmluZm8ubGVuZ3RoOyBiKyspCi0gICAgICAgICAgICAgIGJpbmZvcy5hZGQoYWJpbmZvW2JdKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRCRCAtIGhhbmRsZSBleGNlcHRpb24KLSAgICAgIH0KLQotICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGIgPSBiaW5mb3MuaXRlcmF0b3IoKTsgYi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCZWFuSW5mbyBiaW5mbyA9IChCZWFuSW5mbykgYi5uZXh0KCk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHBkZXNjID0gYmluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocGRlc2MgPT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBwZGVzYy5sZW5ndGg7IHArKykKLSAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwZGVzY1twXS5nZXROYW1lKCksIHBkZXNjW3BdKTsKLSAgICAgIH0KLSAgICAgIGJlYW5Qcm9wZXJ0eURlc2NyaXB0b3JzLnB1dChjbGF6eiwgcHJvcGVydGllcyk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50ID09IG51bGwgJiYgIWlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnQoKTogUHJlc2VydmluZyBvbGQgZWxlbWVudCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci5yZWNvbmNpbGVBdHRyaWJ1dGVzKGNoYW5nZWRFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVJlY29uY2lsaWF0aW9uKHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IEVNRiAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgLy8gVGhpcyBpcyBhbiBvbGQgZWxlbWVudC4KLSAgICB7Ci0gICAgICBuZXdFbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCwgdHJ1ZSk7IAotICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSBkZWZpbml0aW9uLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIChxdWFsaWZpZXIgPT0gbnVsbCA/ICIiIDogcXVhbGlmaWVyICsgIjoiKSArIGdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjZTYxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5zaWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRXh0ZW5zaWJsZUVsZW1lbnRJbXBsI2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJsZUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmxlRWxlbWVudEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbnNpYmxlRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICBpZiAoZUV4dGVuc2liaWxpdHlFbGVtZW50cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMpOwotICAgIH0KLSAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpCi0gIHsKLSAgICBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGQoZXh0RWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvLwotICAvLwotICAvLwotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgaWYgKCFXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCksIFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKSkKLSAgICB7ICAKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkgPyAKLSAgICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICAgKChXU0RMRmFjdG9yeUltcGwpV1NETEZhY3RvcnkuZUlOU1RBTkNFKS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkKLSAgewotICAJLy8gVXNlIGV4dGVuc2lvbiBmYWN0b3JpZXMgYnkgZGVmYXVsdC4KLSAgICByZXR1cm4gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpID09IG51bGwgPyAKLSAgICAgIHRydWUgOiAKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKS5nZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMoKTsKLSAgfQotICAKLX0gLy9FeHRlbnNpYmxlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9GYXVsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9GYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiNDYwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmF1bHRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBGYXVsdAotewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBGYXVsdEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLkZBVUxUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vRmF1bHRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0ltcG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjNTc2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5JbXBvcnRJbXBsI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkltcG9ydEltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkltcG9ydEltcGwjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuSW1wb3J0SW1wbCNnZXRFU2NoZW1hIDxlbT5FU2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0SW1wbCBleHRlbmRzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEltcG9ydAotewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXNvbHZlZDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvblVSSSA9IExPQ0FUSU9OX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RURlZmluaXRpb24oKSA8ZW0+RURlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVEZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZURlZmluaXRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFU2NoZW1hKCkgPGVtPkVTY2hlbWE8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVTY2hlbWEoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGVTY2hlbWEgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEltcG9ydEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBvcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG5hbWVzcGFjZVVSSSA9IG5ld05hbWVzcGFjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgbmV3TG9jYXRpb25VUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTG9jYXRpb25VUkkgPSBsb2NhdGlvblVSSTsKLSAgICBsb2NhdGlvblVSSSA9IG5ld0xvY2F0aW9uVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLklNUE9SVF9fTE9DQVRJT05fVVJJLCBvbGRMb2NhdGlvblVSSSwgbG9jYXRpb25VUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RURlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKGVEZWZpbml0aW9uICE9IG51bGwgJiYgZURlZmluaXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIG9sZEVEZWZpbml0aW9uID0gZURlZmluaXRpb247Ci0gICAgICBlRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllRGVmaW5pdGlvbik7Ci0gICAgICBpZiAoZURlZmluaXRpb24gIT0gb2xkRURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTiwgb2xkRURlZmluaXRpb24sIGVEZWZpbml0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gYmFzaWNHZXRFRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZURlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVEZWZpbml0aW9uKERlZmluaXRpb24gbmV3RURlZmluaXRpb24pCi0gIHsKLSAgICBEZWZpbml0aW9uIG9sZEVEZWZpbml0aW9uID0gZURlZmluaXRpb247Ci0gICAgZURlZmluaXRpb24gPSBuZXdFRGVmaW5pdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX0VERUZJTklUSU9OLCBvbGRFRGVmaW5pdGlvbiwgZURlZmluaXRpb24pKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRFU2NoZW1hKCkKLSAgewotICAgIGlmIChlU2NoZW1hICE9IG51bGwgJiYgZVNjaGVtYS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBvbGRFU2NoZW1hID0gZVNjaGVtYTsKLSAgICAgIGVTY2hlbWEgPSAoWFNEU2NoZW1hKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllU2NoZW1hKTsKLSAgICAgIGlmIChlU2NoZW1hICE9IG9sZEVTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BLCBvbGRFU2NoZW1hLCBlU2NoZW1hKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlU2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGJhc2ljR2V0RVNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gZVNjaGVtYTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RVNjaGVtYShYU0RTY2hlbWEgbmV3RVNjaGVtYSkKLSAgewotICAgIFhTRFNjaGVtYSBvbGRFU2NoZW1hID0gZVNjaGVtYTsKLSAgICBlU2NoZW1hID0gbmV3RVNjaGVtYTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX0VTQ0hFTUEsIG9sZEVTY2hlbWEsIGVTY2hlbWEpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiBnZXRFU2NoZW1hKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHNldEVTY2hlbWEoc2NoZW1hKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uVVJJKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fRURFRklOSVRJT046Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RURlZmluaXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVTY2hlbWEoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RVNjaGVtYSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTE9DQVRJT05fVVJJOgotICAgICAgICBzZXRMb2NhdGlvblVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VERUZJTklUSU9OOgotICAgICAgICBzZXRFRGVmaW5pdGlvbigoRGVmaW5pdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBzZXRFU2NoZW1hKChYU0RTY2hlbWEpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19MT0NBVElPTl9VUkk6Ci0gICAgICAgIHNldExvY2F0aW9uVVJJKExPQ0FUSU9OX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTjoKLSAgICAgICAgc2V0RURlZmluaXRpb24oKERlZmluaXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBzZXRFU2NoZW1hKChYU0RTY2hlbWEpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb25VUkkgIT0gbnVsbCA6ICFMT0NBVElPTl9VUklfRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTjoKLSAgICAgICAgcmV0dXJuIGVEZWZpbml0aW9uICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fRVNDSEVNQToKLSAgICAgICAgcmV0dXJuIGVTY2hlbWEgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZXNwYWNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBsb2NhdGlvblVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChsb2NhdGlvblVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEltcG9ydCNnZXREZWZpbml0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkRlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0RURlZmluaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEltcG9ydCNzZXREZWZpbml0aW9uKERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc2V0RURlZmluaXRpb24oKG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24pIGRlZmluaXRpb24pOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0TmFtZXNwYWNlVVJJKFdTRExDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpKTsKLSAgICBzZXRMb2NhdGlvblVSSShXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgV1NETENvbnN0YW50cy5MT0NBVElPTl9BVFRSSUJVVEUpKTsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGlzIGJvb2xlYW4gdG8gZmFsc2UgYmVjYXVzZSB0aGUgSW1wb3J0IG1heSBwb2ludCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4KLSAgICAvLyBTbyB3ZSBuZWVkIHdlIHNob3VsZCB2aWV3IHRoaXMgaW1wb3J0IGFzIHVucmVzb2x2ZWQuCi0gICAgcmVzb2x2ZWQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEltcG9ydF9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUsIGdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBvcnRfTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLkxPQ0FUSU9OX0FUVFJJQlVURSwgZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuSU1QT1JUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCkKLSAgewotICAgIHJlc29sdmUoZ2V0TmFtZXNwYWNlVVJJKCksIGdldExvY2F0aW9uVVJJKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBpZiAoIXJlc29sdmVkKQotICAgIHsKLSAgICAgIC8vIEtCOiBidWd6aWxsYSAxMTgyOTMKLSAgICAgIC8vIElmIGEgdXNlciBjaGFuZ2VzIDx3c2RsOmltcG9ydD4gZnJvbSBhIFdTREwgZmlsZSB0byBhbiBYTUwgU2NoZW1hIGZpbGUKLSAgICAgIC8vIG9yIHRoZSBvdGhlciB3YXkgYXJvdW5kLCB3ZSBzaG91bGQgc2V0IHRoZSB2YXJpYWJsZSBmb3IgdGhlIGZpcnN0Ci0gICAgICAvLyA8d3NkbDppbXBvcnQ+IHNvdXJjZSB0byBudWxsLiBIZXJlIEkgYW0gc2ltcGx5IHNldHRpbmcgYm90aCB2YXJpYWJsZXMgdG8gbnVsbCwKLSAgICAgIC8vIHdoaWNoIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QuCi0gICAgICBlRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICBlU2NoZW1hID0gbnVsbDsKLSAgICAgICAgCi0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsICYmIGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpOwotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICAgICAgICBpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZUxvY2F0aW9uKGRlZmluaXRpb24sIG5hbWVzcGFjZSwgbG9jYXRpb24pOwotCi0gICAgICAgICAgICBVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShyZXNvbHZlZExvY2F0aW9uKTsKLSAgICAgICAgICAgIFJlc291cmNlIHJlc29sdmVkUmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZFJlc291cmNlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOwotICAgICAgICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEl0IGlzIGdlbmVyYWxseSBub3QgYW4gZXJyb3IgdG8gZmFpbCB0byByZXNvbHZlLgotICAgICAgICAgICAgICAgIC8vIElmIGEgcmVzb3VyY2UgaXMgYWN0dWFsbHkgY3JlYXRlZCwgCi0gICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFwcGVucyBvbmx5IHdoZW4gd2UgY2FuIGNyZWF0ZSBhbiBpbnB1dCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgLy8gdGhlbiBpdCdzIGFuIGVycm9yIGlmIGl0J3Mgbm90IGEgZ29vZCB3c2RsIG9yIHNjaGVtYQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlZFJlc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChyZXNvbHZlZFJlc291cmNlIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVEZWZpbml0aW9uID0gKChXU0RMUmVzb3VyY2VJbXBsKSByZXNvbHZlZFJlc291cmNlKS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAocmVzb2x2ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIFhTRFJlc291cmNlSW1wbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVTY2hlbWEgPSAoKFhTRFJlc291cmNlSW1wbCkgcmVzb2x2ZWRSZXNvdXJjZSkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZURlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTG9jYXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBXU0RMTW9kZWxMb2NhdG9yIGxvY2F0b3IgPSAoV1NETE1vZGVsTG9jYXRvcilFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIoZGVmaW5pdGlvbi5lUmVzb3VyY2UoKSwgV1NETE1vZGVsTG9jYXRvci5jbGFzcyk7Ci0gICAgaWYgKGxvY2F0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBsb2NhdG9yLnJlc29sdmVVUkkoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSwgbmFtZXNwYWNlLCBzY2hlbWFMb2NhdGlvbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUT0RPLi4uIHRoZXJlJ3Mgc29tZSBkZWZhdWx0IHJlc29sdmluZyB3ZSdsbCBuZWVkIHRvIGRvIGhlcmUKLSAgICAgIC8vIHNlZSBYU0RTY2hlbWFEaXJlY3RpdmUKLSAgICAgIFVSSSBiYXNlTG9jYXRpb25VUkkgPSBjcmVhdGVVUkkoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgICBVUkkgbG9jYXRpb25VUkkgPSBVUkkuY3JlYXRlVVJJKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgIHJldHVybiBsb2NhdGlvblVSSS5yZXNvbHZlKGJhc2VMb2NhdGlvblVSSSkudG9TdHJpbmcoKTsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvL1RPRE8uLi4gcHVzaCBkb3duIHRvIEVNRgotICBwcml2YXRlIHN0YXRpYyBVUkkgY3JlYXRlVVJJKFN0cmluZyB1cmlTdHJpbmcpCi0gIHsKLSAgICBpZiAoaGFzUHJvdG9jb2wodXJpU3RyaW5nKSkKLSAgICAgICByZXR1cm4gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOwotICAgIGVsc2UKLSAgICAgICByZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkodXJpU3RyaW5nKTsKLSAgfQotCi0gIC8vVE9ETy4uLiBwdXNoIGRvd24gdG8gRU1GICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNQcm90b2NvbChTdHJpbmcgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOwotICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdCB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEgcHJvdG9jb2wKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLX0gLy9JbXBvcnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW5wdXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW5wdXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWFhN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0lucHV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnB1dDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIElucHV0SW1wbCBleHRlbmRzIE1lc3NhZ2VSZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgSW5wdXQKLXsKLSAgLyoqCi0gICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAqIHNlcmlhbFZlcnNpb25VSUQgaXMgYXNzaWduZWQgd2l0aCAxTCB0byBhdm9pZAotICAgKiBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgSW5wdXRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5wdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoamF2YXgud3NkbC5NZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSkgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIHJldHVybiBlTWVzc2FnZSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5JTlBVVCk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotfSAvL0lucHV0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhY2M2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTWVzc2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5NZXNzYWdlSW1wbCNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5NZXNzYWdlSW1wbCNnZXRFUGFydHMgPGVtPkVQYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWVzc2FnZQotewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUGFydHMoKSA8ZW0+RVBhcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQYXJ0cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlUGFydHMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2VJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuZXdRTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFFOYW1lID0gcU5hbWU7Ci0gICAgcU5hbWUgPSBuZXdRTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQsIG9sZFVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIG5ld1Byb3h5KQotICB7Ci0gICAgYm9vbGVhbiBvbGRQcm94eSA9IHByb3h5OwotICAgIHByb3h5ID0gbmV3UHJveHk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuTUVTU0FHRV9fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RVBhcnRzKCkKLSAgewotICAgIGlmIChlUGFydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlUGFydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFydC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuTUVTU0FHRV9fRVBBUlRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVQYXJ0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBwYXJ0IHRvIHRoaXMgbWVzc2FnZS4KLSAgICogQHBhcmFtIHBhcnQgdGhlIHBhcnQgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQYXJ0KGphdmF4LndzZGwuUGFydCBwYXJ0KQotICB7Ci0gICAgZ2V0RVBhcnRzKCkuYWRkKChQYXJ0KXBhcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIHBhcnQuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBhcnQuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcGFydCwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIHBhcnQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5QYXJ0IGdldFBhcnQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpLm5leHQoKTsKLSAgICAgIGlmIChuYW1lLmVxdWFscyhwYXJ0LmdldE5hbWUoKSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHBhcnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHBhcnRzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFBhcnRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpLm5leHQoKTsKLSAgICAgIGhhc2hNYXAucHV0KHBhcnQuZ2V0TmFtZSgpLCBwYXJ0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRPcmRlcmVkUGFydHMoTGlzdCBwYXJ0T3JkZXIpCi0gIHsKLSAgICBMaXN0IG9yZGVyZWRQYXJ0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAocGFydE9yZGVyID09IG51bGwpCi0gICAgewotICAgICAgb3JkZXJlZFBhcnRzLmFkZEFsbChnZXRFUGFydHMoKSk7Ci0gICAgICByZXR1cm4gb3JkZXJlZFBhcnRzOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIHBhcnROYW1lSXRlcmF0b3IgPSBwYXJ0T3JkZXIuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAocGFydE5hbWVJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIHBhcnROYW1lID0gKFN0cmluZykgcGFydE5hbWVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBqYXZheC53c2RsLlBhcnQgcGFydCA9IGdldFBhcnQocGFydE5hbWUpOwotICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgb3JkZXJlZFBhcnRzLmFkZChwYXJ0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3JkZXJlZFBhcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVQYXJ0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FOgotICAgICAgICByZXR1cm4gZ2V0UU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gaXNVbmRlZmluZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VVUkkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRVBBUlRTOgotICAgICAgICByZXR1cm4gZ2V0RVBhcnRzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFM6Ci0gICAgICAgIGdldEVQYXJ0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVQYXJ0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZShRTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoVU5ERUZJTkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoUFJPWFlfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoUkVTT1VSQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFM6Ci0gICAgICAgIGdldEVQYXJ0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FOgotICAgICAgICByZXR1cm4gUU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHFOYW1lICE9IG51bGwgOiAhUU5BTUVfRURFRkFVTFQuZXF1YWxzKHFOYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUFJPWFk6Ci0gICAgICAgIHJldHVybiBwcm94eSAhPSBQUk9YWV9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICByZXR1cm4gUkVTT1VSQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZVVSSSAhPSBudWxsIDogIVJFU09VUkNFX1VSSV9FREVGQVVMVC5lcXVhbHMocmVzb3VyY2VVUkkpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFM6Ci0gICAgICAgIHJldHVybiBlUGFydHMgIT0gbnVsbCAmJiAhZVBhcnRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAocU5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocU5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgdW5kZWZpbmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVuZGVmaW5lZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBwcm94eTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChwcm94eSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIFN0cmluZyBuYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUgPT0gbnVsbCA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRRTmFtZShxbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuUEFSVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBQYXJ0IHBhcnQgPSAoKFdTRExQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXU0RMUGFja2FnZS5lTlNfVVJJKSkuZ2V0V1NETEZhY3RvcnkoKS5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgICAgcGFydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgICAgcGFydC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBnZXRFUGFydHMoKS5hZGQocGFydCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFBhcnQpCi0gICAgewotICAgICAgbWVzc2FnZS5nZXRFUGFydHMoKS5yZW1vdmUobW9kZWxPYmplY3QpOwotLy8gICAgICBtZXNzYWdlLmdldEVQYXJ0cygpLmNsZWFyKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlX1FOYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuTUVTU0FHRSk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGFydCkKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIG9iajsKLSAgICAgICAgRWxlbWVudCBjaGlsZCA9ICgoUGFydEltcGwpIHBhcnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vTWVzc2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlUmVmZXJlbmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllODRiODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VSZWZlcmVuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VSZWZlcmVuY2VJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5NZXNzYWdlUmVmZXJlbmNlSW1wbCNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXNzYWdlUmVmZXJlbmNlSW1wbCBleHRlbmRzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VSZWZlcmVuY2UKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU1lc3NhZ2UoKSA8ZW0+RU1lc3NhZ2U8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2UgZU1lc3NhZ2UgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2VSZWZlcmVuY2VJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZVJlZmVyZW5jZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE1lc3NhZ2UgZ2V0RU1lc3NhZ2UoKQotICB7Ci0gICAgaWYgKGVNZXNzYWdlICE9IG51bGwgJiYgZU1lc3NhZ2UuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBNZXNzYWdlIG9sZEVNZXNzYWdlID0gZU1lc3NhZ2U7Ci0gICAgICBlTWVzc2FnZSA9IChNZXNzYWdlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllTWVzc2FnZSk7Ci0gICAgICBpZiAoZU1lc3NhZ2UgIT0gb2xkRU1lc3NhZ2UpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFLCBvbGRFTWVzc2FnZSwgZU1lc3NhZ2UpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVNZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZSBiYXNpY0dldEVNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBlTWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RU1lc3NhZ2UoTWVzc2FnZSBuZXdFTWVzc2FnZSkKLSAgewotICAgIE1lc3NhZ2Ugb2xkRU1lc3NhZ2UgPSBlTWVzc2FnZTsKLSAgICBlTWVzc2FnZSA9IG5ld0VNZXNzYWdlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRSwgb2xkRU1lc3NhZ2UsIGVNZXNzYWdlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRToKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0U6Ci0gICAgICAgIHJldHVybiBlTWVzc2FnZSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGlhdGlvbiBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0TmFtZShXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgIm5hbWUiKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlUmVmZXJlbmNlX05hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZVJlZmVyZW5jZShlUmVmZXJlbmNlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsIHx8IGVSZWZlcmVuY2UgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VSZWZlcmVuY2VfRU1lc3NhZ2UoKSkKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0RU1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFFOYW1lIHFOYW1lID0gbWVzc2FnZS5nZXRRTmFtZSgpOwotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGVVUklWYWx1ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFLCBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSArICIjIiArIHFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7ICAgICAgCi0gICAgICBRTmFtZSBtZXNzYWdlUU5hbWUgPSBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFKSwgZWxlbWVudCk7Ci0gICAgICBNZXNzYWdlIG5ld01lc3NhZ2UgPSBtZXNzYWdlUU5hbWUgIT0gbnVsbCA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKSA6IG51bGw7Ci0gICAgICBpZiAobmV3TWVzc2FnZSAhPSBnZXRFTWVzc2FnZSgpKQotICAgICAgewotICAgICAgICBzZXRFTWVzc2FnZShuZXdNZXNzYWdlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL01lc3NhZ2VSZWZlcmVuY2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL05hbWVzcGFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjMjhhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5OYW1lc3BhY2VJbXBsI2dldFVSSSA8ZW0+VVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTmFtZXNwYWNlSW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE5hbWVzcGFjZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSSgpIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSSgpIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UHJlZml4KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UHJlZml4KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgTmFtZXNwYWNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVzcGFjZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIG5ld1VSSSkKLSAgewotICAgIFN0cmluZyBvbGRVUkkgPSB1cmk7Ci0gICAgdXJpID0gbmV3VVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fVVJJLCBvbGRVUkksIHVyaSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkKLSAgewotICAgIFN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0gICAgcHJlZml4ID0gbmV3UHJlZml4OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1VSSToKLSAgICAgICAgcmV0dXJuIGdldFVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1BSRUZJWDoKLSAgICAgICAgcmV0dXJuIGdldFByZWZpeCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19VUkk6Ci0gICAgICAgIHNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1BSRUZJWDoKLSAgICAgICAgc2V0UHJlZml4KChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1VSSToKLSAgICAgICAgc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19QUkVGSVg6Ci0gICAgICAgIHNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19VUkk6Ci0gICAgICAgIHJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19QUkVGSVg6Ci0gICAgICAgIHJldHVybiBQUkVGSVhfRURFRkFVTFQgPT0gbnVsbCA/IHByZWZpeCAhPSBudWxsIDogIVBSRUZJWF9FREVGQVVMVC5lcXVhbHMocHJlZml4KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVyaSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBwcmVmaXg6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLX0gLy9OYW1lc3BhY2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3BlcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL09wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxZDZkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3BlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0RUZhdWx0cyA8ZW0+RUZhdWx0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0RVBhcmFtZXRlck9yZGVyaW5nIDxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uSW1wbCBleHRlbmRzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE9wZXJhdGlvbgotewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0eWxlKCkgPGVtPlN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3BlcmF0aW9uVHlwZSBTVFlMRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0eWxlKCkgPGVtPlN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBPcGVyYXRpb25UeXBlIHN0eWxlID0gU1RZTEVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFSW5wdXQoKSA8ZW0+RUlucHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFSW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgSW5wdXQgZUlucHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU91dHB1dCgpIDxlbT5FT3V0cHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIE91dHB1dCBlT3V0cHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUZhdWx0cygpIDxlbT5FRmF1bHRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVGYXVsdHMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZUZhdWx0cyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVQYXJhbWV0ZXJPcmRlcmluZygpIDxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlUGFyYW1ldGVyT3JkZXJpbmcgPSBudWxsOyAvLyBhIGxpc3Qgb2YgcGFydHMgKEVNRikKLSAgCi0gIHByaXZhdGUgTGlzdCBwYXJhbWV0ZXJPcmRlcmluZyA9IG51bGw7IC8vIGEgbGlzdCBvZiBwYXJ0IG5hbWVzIChXU0RMNEopCi0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE9wZXJhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvblR5cGUgZ2V0U3R5bGUoKQotICB7Ci0gICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICBzdHlsZSA9IGRlZHVjZU9wZXJhdGlvblR5cGUoZ2V0RWxlbWVudCgpKTsKLSAgICAKLSAgICAvLyBUaGUgdmFsdWUgb2Ygc3R5bGUgaXMgdXBkYXRlZCB3aGVuCi0gICAgLy8gMSkgdGhlIFdTREwgaXMgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZSwKLSAgICAvLyAyKSB0aGUgc2V0U3R5bGUoKSBtZXRob2QgaXMgY2FsbGVkLCBhbmQKLSAgICAvLyAzKSB0aGUgY2hpbGRyZW4gb2YgdGhlIE9wZXJhdGlvbiAoRE9NKSBlbGVtZW50IGFyZSBtYW5pcHVsYXRlZC4KLSAgICByZXR1cm4gc3R5bGU7Ci0gIH0KLQotICBwcml2YXRlIE9wZXJhdGlvblR5cGUgZGVkdWNlT3BlcmF0aW9uVHlwZShFbGVtZW50IG9wZXJhdGlvbikKLSAgewotICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgICAgIAotICAJaW50IHN0YXRlID0gMDsKLSAgCWludCBtZXNzYWdlUmVmVHlwZSA9IC0xOwotICAJTm9kZSBjaGlsZCA9IG51bGw7Ci0gIAlOb2RlTGlzdCBjaGlsZHJlbiA9IG9wZXJhdGlvbi5nZXRDaGlsZE5vZGVzKCk7Ci0gIAkKLSAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICAKLSAgICAgIFN0cmluZyBuc1VSSSA9IGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgCi0gICAgICBpZiAoIVdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuc1VSSSkgKQotICAgICAgewotICAgICAgICAvLyBTa2lwIG92ZXIgYW55IG5vbi1XU0RMIGVsZW1lbnRzLiBGb3IgZXhhbXBsZSwgdG8gc3VwcG9ydCBuZXcgV1NETCAKLSAgICAgICAgLy8gdXNlIGNhc2VzIHdlIGhhdmUgdG8gdG9sZXJhdGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBhdCB0aGUgb3BlcmF0aW9uIGxldmVsLgotICAgICAgICAKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIG1lc3NhZ2VSZWZUeXBlID0gV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZSgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMDogLy8gaW5pdGlhbCBzdGF0ZSAgICAgCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuSU5QVVQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDE7IAotICAgICAgICAgIGVsc2UgaWYgKFdTRExDb25zdGFudHMuT1VUUFVUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAyOyAKLSAgICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT04gPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgCXN0YXRlID0gMDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZSA9IC0xOyAvLyBjYW5ub3QgaGFwcGVuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogLy8gb25lLXdheSBvciByZXF1ZXN0LXJlc3BvbnNlCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDExOyAvLyBvbmUtd2F5Ci0gICAgICAgICAgZWxzZSBpZiAoV1NETENvbnN0YW50cy5PVVRQVVQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDM7IC8vIHJlcXVlc3QtcmVzcG9uc2UKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZSA9IC0xOyAvLyBjYW5ub3QgaGFwcGVuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IC8vIG9uZS13YXkKLSAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5GQVVMVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gMTE7IC8vIG9uZS13YXkKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZSA9IC0xOyAvLyBjYW5ub3QgaGFwcGVuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogLy8gc29saWNpdC1yZXNwb25zZSBvciBub3RpZmljYXRpb24KLSAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5JTlBVVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gNDsgLy8gc29saWNpdC1yZXNwb25zZQotICAgICAgICAgIGVsc2UgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDIxOyAvLyBub3RpZmljYXRpb24KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZSA9IC0xOyAvLyBjYW5ub3QgaGFwcGVuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IC8vIG5vdGlmaWNhdGlvbgotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAyMTsgLy8gbm90aWZpY2F0aW9uCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6IC8vIHJlcXVlc3QtcmVzcG9uc2UgCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDM7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6IC8vIHNvbGljaXQtcmVzcG9uc2UKLSAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5GQVVMVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gNDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZSA9IC0xOyAvLyBjYW5ub3QgaGFwcGVuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vIGNhbm5vdCBoYXBwZW4gKC0xKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBPcGVyYXRpb25UeXBlIG9wVHlwZSA9IG51bGw7Ci0gICAgc3dpdGNoIChzdGF0ZSkKLSAgICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICBjYXNlIDExOgotICAgICAgCW9wVHlwZSA9IE9wZXJhdGlvblR5cGUuT05FX1dBWTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICBjYXNlIDIxOgotICAgICAgCW9wVHlwZSA9IE9wZXJhdGlvblR5cGUuTk9USUZJQ0FUSU9OOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzoKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0OgotICAgICAgCW9wVHlwZSA9IE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAvLyBpbnZhbGlkCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gb3BUeXBlOyAgICAKLSAgfQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlKE9wZXJhdGlvblR5cGUgbmV3U3R5bGUpCi0gIHsKLSAgICBPcGVyYXRpb25UeXBlIG9sZFN0eWxlID0gc3R5bGU7Ci0gICAgc3R5bGUgPSBuZXdTdHlsZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZGVmaW5lZCgpCi0gIHsKLSAgICByZXR1cm4gdW5kZWZpbmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiBuZXdVbmRlZmluZWQpCi0gIHsKLSAgICBib29sZWFuIG9sZFVuZGVmaW5lZCA9IHVuZGVmaW5lZDsKLSAgICB1bmRlZmluZWQgPSBuZXdVbmRlZmluZWQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19VTkRFRklORUQsIG9sZFVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIG5ld1Byb3h5KQotICB7Ci0gICAgYm9vbGVhbiBvbGRQcm94eSA9IHByb3h5OwotICAgIHByb3h5ID0gbmV3UHJveHk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19QUk9YWSwgb2xkUHJveHksIHByb3h5KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVVSSShTdHJpbmcgbmV3UmVzb3VyY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkUmVzb3VyY2VVUkkgPSByZXNvdXJjZVVSSTsKLSAgICByZXNvdXJjZVVSSSA9IG5ld1Jlc291cmNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUkVTT1VSQ0VfVVJJLCBvbGRSZXNvdXJjZVVSSSwgcmVzb3VyY2VVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIElucHV0IGdldEVJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZUlucHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFSW5wdXQoSW5wdXQgbmV3RUlucHV0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgSW5wdXQgb2xkRUlucHV0ID0gZUlucHV0OwotICAgIGVJbnB1dCA9IG5ld0VJbnB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUlOUFVULCBvbGRFSW5wdXQsIG5ld0VJbnB1dCk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFSW5wdXQoSW5wdXQgbmV3RUlucHV0KQotICB7Ci0gICAgaWYgKG5ld0VJbnB1dCAhPSBlSW5wdXQpCi0gICAgewotICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0gICAgICBpZiAoZUlucHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllSW5wdXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBpZiAobmV3RUlucHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFSW5wdXQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRFSW5wdXQobmV3RUlucHV0LCBtc2dzKTsKLSAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVCwgbmV3RUlucHV0LCBuZXdFSW5wdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE91dHB1dCBnZXRFT3V0cHV0KCkKLSAgewotICAgIHJldHVybiBlT3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFT3V0cHV0KE91dHB1dCBuZXdFT3V0cHV0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgT3V0cHV0IG9sZEVPdXRwdXQgPSBlT3V0cHV0OwotICAgIGVPdXRwdXQgPSBuZXdFT3V0cHV0OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBvbGRFT3V0cHV0LCBuZXdFT3V0cHV0KTsKLSAgICAgIGlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1zZ3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVPdXRwdXQoT3V0cHV0IG5ld0VPdXRwdXQpCi0gIHsKLSAgICBpZiAobmV3RU91dHB1dCAhPSBlT3V0cHV0KQotICAgIHsKLSAgICAgIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotICAgICAgaWYgKGVPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVPdXRwdXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VPdXRwdXQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQsIG51bGwsIG1zZ3MpOwotICAgICAgbXNncyA9IGJhc2ljU2V0RU91dHB1dChuZXdFT3V0cHV0LCBtc2dzKTsKLSAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQsIG5ld0VPdXRwdXQsIG5ld0VPdXRwdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVGYXVsdHMoKQotICB7Ci0gICAgaWYgKGVGYXVsdHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlRmF1bHRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEZhdWx0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFMpOwotICAgIH0KLSAgICByZXR1cm4gZUZhdWx0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVQYXJhbWV0ZXJPcmRlcmluZygpCi0gIHsKLSAgICBpZiAoZVBhcmFtZXRlck9yZGVyaW5nID09IG51bGwpCi0gICAgewotICAgICAgZVBhcmFtZXRlck9yZGVyaW5nID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChQYXJ0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkcpOwotICAgIH0KLSAgICByZXR1cm4gZVBhcmFtZXRlck9yZGVyaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIGZhdWx0IG1lc3NhZ2UgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAqIG9wZXJhdGlvbi4KLSAgICogQHBhcmFtIGZhdWx0IHRoZSBuZXcgZmF1bHQgbWVzc2FnZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEZhdWx0KGphdmF4LndzZGwuRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBnZXRFRmF1bHRzKCkuYWRkKChGYXVsdClmYXVsdCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgZmF1bHQgbWVzc2FnZS4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgZmF1bHQgbWVzc2FnZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmYXVsdCBtZXNzYWdlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgbWVzc2FnZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkZhdWx0IGdldEZhdWx0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgRmF1bHQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgIGlmIChuYW1lLmVxdWFscyhmYXVsdC5nZXROYW1lKCkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYXVsdDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGFsbCB0aGUgZmF1bHQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3BlcmF0aW9uLgotICAgKiBAcmV0dXJuIG5hbWVzIG9mIGZhdWx0IG1lc3NhZ2VzCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRGYXVsdHMoKQotICB7Ci0gICAgSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgIGhhc2hNYXAucHV0KGZhdWx0LmdldE5hbWUoKSwgZmF1bHQpOwotICAgIH0KLSAgICByZXR1cm4gaGFzaE1hcDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBQYXJ0IG5hbWVzLiBOb3RlIHRoYXQgCi0gICAqIGdldFBhcmFtZXRlckVPcmRlcmluZygpIHJldHVybnMgYSBjb2xsZWN0aW9uIG9mIFBhcnRzLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFBhcmFtZXRlck9yZGVyaW5nKCkKLSAgewotICAgIHBhcmFtZXRlck9yZGVyaW5nID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVQYXJhbWV0ZXJPcmRlcmluZygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotCQlwYXJhbWV0ZXJPcmRlcmluZy5hZGQocGFydC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUQkQgLSBoYW5kbGUgZXhjZXB0aW9uCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwYXJhbWV0ZXJPcmRlcmluZy5pc0VtcHR5KCkgPyBudWxsIDogcGFyYW1ldGVyT3JkZXJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJPcmRlcmluZyhMaXN0IHBhcmFtZXRlck9yZGVyKQotICB7Ci0gICAgcGFyYW1ldGVyT3JkZXJpbmcgPSBwYXJhbWV0ZXJPcmRlcjsKLSAgICBnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKS5jbGVhcigpOwotICAgIGlmIChwYXJhbWV0ZXJPcmRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmFtZXRlck9yZGVyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgLy8gS0I6IFdlIHNob3VsZCBiZSByZXNvbHZpbmcgcGFydHMgYmFzZWQgb24gdGhlIHBhcnQgbmFtZXMgaW4gcGFyYW1ldGVyT3JkZXIuCi0gICAgICAgIFBhcnQgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgIHBhcnQuc2V0TmFtZSgoU3RyaW5nKSBpLm5leHQoKSk7Ci0gICAgICAgIGdldEVQYXJhbWV0ZXJPcmRlcmluZygpLmFkZChwYXJ0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5JbnB1dCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUlucHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChqYXZheC53c2RsLklucHV0IGlucHV0KQotICB7Ci0gICAgc2V0RUlucHV0KChJbnB1dCkgaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuT3V0cHV0IGdldE91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU91dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHNldEVPdXRwdXQoKE91dHB1dCkgb3V0cHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgICByZXR1cm4gYmFzaWNTZXRFSW5wdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVPdXRwdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FRkFVTFRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUZhdWx0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICByZXR1cm4gZ2V0U3R5bGUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgcmV0dXJuIGdldEVJbnB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGdldEVGYXVsdHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HOgotICAgICAgICByZXR1cm4gZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoKE9wZXJhdGlvblR5cGUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICBzZXRFT3V0cHV0KChPdXRwdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUZBVUxUUzoKLSAgICAgICAgZ2V0RUZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVGYXVsdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORzoKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHNldFN0eWxlKFNUWUxFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KFBST1hZX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoUkVTT1VSQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQ6Ci0gICAgICAgIHNldEVPdXRwdXQoKE91dHB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFM6Ci0gICAgICAgIGdldEVGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORzoKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHJldHVybiBTVFlMRV9FREVGQVVMVCA9PSBudWxsID8gc3R5bGUgIT0gbnVsbCA6ICFTVFlMRV9FREVGQVVMVC5lcXVhbHMoc3R5bGUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQ6Ci0gICAgICAgIHJldHVybiBlSW5wdXQgIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICByZXR1cm4gZU91dHB1dCAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFM6Ci0gICAgICAgIHJldHVybiBlRmF1bHRzICE9IG51bGwgJiYgIWVGYXVsdHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkc6Ci0gICAgICAgIHJldHVybiBlUGFyYW1ldGVyT3JkZXJpbmcgIT0gbnVsbCAmJiAhZVBhcmFtZXRlck9yZGVyaW5nLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoc3R5bGU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc3R5bGUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyAKLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLQlpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0JewotICAgICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgCi0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgicGFyYW1ldGVyT3JkZXIiKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFyYW1ldGVyT3JkZXIgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhcmFtZXRlck9yZGVyIik7Ci0gICAgICBpZiAocGFyYW1ldGVyT3JkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gYXJyYXkgPSBwYXJhbWV0ZXJPcmRlci5zcGxpdCgiICIpOwotICAgICAgICBMaXN0IGwgPSBBcnJheXMuYXNMaXN0KGFycmF5KTsKLSAgICAgICAgc2V0UGFyYW1ldGVyT3JkZXJpbmcobCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc3R5bGUgPSBkZWR1Y2VPcGVyYXRpb25UeXBlKGNoYW5nZWRFbGVtZW50KTsKLSAgICBzdXBlci5lbGVtZW50Q2hhbmdlZChjaGFuZ2VkRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBzd2l0Y2ggKFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoY2hpbGQpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5JTlBVVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbnB1dCBpbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgICAgICAgIGlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgaW5wdXQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1VUUFVUIDoKLSAgICAgICAgewotICAgICAgICAgIE91dHB1dCBvdXRwdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgICAgICAgb3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgb3V0cHV0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIHNldE91dHB1dChvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRkFVTFQgOgotICAgICAgICB7Ci0gICAgICAgICAgRmF1bHQgZmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmF1bHQoKTsKLSAgICAgICAgICBmYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgIGZhdWx0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGFkZEZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIElucHV0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5zZXRFSW5wdXQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5zZXRFT3V0cHV0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBjb21wb25lbnQ7Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQob3BlcmF0aW9uLmdldEVJbnB1dCgpKTsKLSAgICB9Ci0KLSAgICBpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotICAgIH0KLQotICAgIGxpc3QuYWRkQWxsKG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE9wZXJhdGlvbl9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRPcGVyYXRpb25fU3R5bGUoKSkKLSAgICAgIHsKLSAgICAgICAgT3BlcmF0aW9uVHlwZSB0YXJnZXRUeXBlID0gZ2V0U3R5bGUoKTsKLSAgICAgICAgT3BlcmF0aW9uVHlwZSBjdXJyZW50VHlwZSA9IGRlZHVjZU9wZXJhdGlvblR5cGUodGhlRWxlbWVudCk7Ci0gICAgICAgIGlmICh0YXJnZXRUeXBlLmVxdWFscyhjdXJyZW50VHlwZSkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBlbHNlIGlmICgodGFyZ2V0VHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKSB8fCB0YXJnZXRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKQotICAgICAgICAgICAgICAgICAgJiYgKGN1cnJlbnRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpIHx8IGN1cnJlbnRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKSkKLSAgICAgICAgCXJlb3JkZXJDaGlsZHJlbigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc3R5bGUgPSBkZWR1Y2VPcGVyYXRpb25UeXBlKHRoZUVsZW1lbnQpOyAvLyBzd2l0Y2ggYmFjay4gbm8gc3VwcG9ydCBmb3IgdGhlIG90aGVyIHR5cGVzCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRPcGVyYXRpb25fRVBhcmFtZXRlck9yZGVyaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIEJ1aWxkIHVwIGEgc3RyaW5nIG9mIGNvbmNhdGVuYXRlZCBwYXJ0IG5hbWVzIChwYXJhbWV0ZXJPcmRlcikgZnJvbSBlUGFyYW1ldGVyT3JkZXJpbmcuCi0JCSAgCi0gICAgICAgIEl0ZXJhdG9yIHBhcnRzID0gZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuaXRlcmF0b3IoKTsKLQkJUGFydCBwYXJ0ID0gbnVsbDsKLQkJU3RyaW5nIHBhcnROYW1lcyA9ICIiOwotICAgICAgICB3aGlsZSAocGFydHMuaGFzTmV4dCgpKQotCQl7Ci0gICAgICAgICAgcGFydCA9IChQYXJ0KXBhcnRzLm5leHQoKTsKLQkJICBwYXJ0TmFtZXMgPSBwYXJ0TmFtZXMgKyBwYXJ0LmdldE5hbWUoKSArICIgIjsKLQkJfQotCQkKLQkJaWYgKChwYXJ0TmFtZXMgPSBwYXJ0TmFtZXMudHJpbSgpKS5sZW5ndGgoKSAhPSAwKQkJCi0JCSAgLy8gVXBkYXRlIHRoZSBlbGVtZW50J3MgYXR0cnVidXRlCi0JCSAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCAicGFyYW1ldGVyT3JkZXIiLCBwYXJ0TmFtZXMpOwotICAgICAgfQotICAgIH0KLSAgICAvLwotICB9Ci0gIAotICAvLyBTd2l0Y2ggPGlucHV0PiBhbmQgPG91dHB1dD4KLSAgcHJpdmF0ZSB2b2lkIHJlb3JkZXJDaGlsZHJlbigpCi0gIHsKLSAgICAvLyBGaW5kIG91dCB0aGUgcG9zaXRpb25zIG9mIDxpbnB1dD4gYW5kIDxvdXRwdXQ+Ci0gICAgTm9kZSBpbnB1dCA9IG51bGw7Ci0gICAgTm9kZSBvdXRwdXQgPSBudWxsOwotICAgIE5vZGUgcmVmZXJlbmNlID0gbnVsbDsKLSAgICBmb3IgKE5vZGUgY3VycmVudD1nZXRFbGVtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpOyBjdXJyZW50IT0gbnVsbDtjdXJyZW50PWN1cnJlbnQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgCWlmIChXU0RMQ29uc3RhbnRzLklOUFVUID09IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoKEVsZW1lbnQpY3VycmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICAgIHsgCi0gICAgICAgICAgICAvLyBjcy4uIGZvciBzYWZldHkgdXNlIGN1cnJlbnQuZ2V0TmV4dFNpYmxpbmcoKSBpbnN0ZWFkIG9mIG5vZGVMaXN0Lml0ZW0oaSsxKSAgICAgICAgICAgIAotICAgICAgICAgICAgcmVmZXJlbmNlID0gY3VycmVudC5nZXROZXh0U2libGluZygpOwotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFdTRExDb25zdGFudHMuT1VUUFVUID09IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoKEVsZW1lbnQpY3VycmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRwdXQgPSBjdXJyZW50OwotICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNzLi4gZm9yIHNhZmV0eSB1c2UgY3VycmVudC5nZXROZXh0U2libGluZygpIGluc3RlYWQgb2Ygbm9kZUxpc3QuaXRlbShpKzEpICAgICAgICAgICAgCi0gICAgICAgICAgICByZWZlcmVuY2UgPSBjdXJyZW50LmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IC8vIGVuZCBmb3IKLSAgICAKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChnZXRTdHlsZSgpLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKQotICAgICAgewotICAgICAgCS8vIGN1cnJlbnQgb3JkZXI6IDxvdXRwdXQ+IDxpbnB1dD4KLSAgICAgICAgc3dpdGNoQ2hpbGRyZW4ocGFyZW50LG91dHB1dCxpbnB1dCxyZWZlcmVuY2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZ2V0U3R5bGUoKS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFKSkKLSAgICAgIHsKLSAgICAgICAgLy8gY3VycmVudCBvcmRlcjogPGlucHV0PiA8b3V0cHV0PgotICAgICAgICBzd2l0Y2hDaGlsZHJlbihwYXJlbnQsaW5wdXQsb3V0cHV0LHJlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc3dpdGNoQ2hpbGRyZW4oTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQxLCBOb2RlIGNoaWxkMiwgTm9kZSBuZXh0T2ZDaGlsZDIpCi0gIHsKLSAgICAvLyBjdXJyZW50IG5vZGUgc2VxdWVuY2U6IDxjaGlsZDE+IDxjaGlsZDI+IDxuZXh0T2ZDaGlsZDI+Ci0gICAgbmljZVJlbW92ZUNoaWxkKHBhcmVudCxjaGlsZDIpOwotICAgIG5pY2VJbnNlcnRCZWZvcmUocGFyZW50LGNoaWxkMixjaGlsZDEpOwotICAgIG5pY2VSZW1vdmVDaGlsZChwYXJlbnQsY2hpbGQxKTsKLSAgICBuaWNlSW5zZXJ0QmVmb3JlKHBhcmVudCxjaGlsZDEsbmV4dE9mQ2hpbGQyKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLk9QRVJBVElPTik7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIElucHV0IGlucHV0ID0gZ2V0RUlucHV0KCk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoSW5wdXRJbXBsKSBpbnB1dCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgT3V0cHV0IG91dHB1dCA9IGdldEVPdXRwdXQoKTsKLSAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoT3V0cHV0SW1wbCkgb3V0cHV0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEVGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEZhdWx0SW1wbCkgZmF1bHQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9IAotICAKLX0gLy9PcGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3V0cHV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL091dHB1dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3ZTdhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3V0cHV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0cHV0SW1wbCBleHRlbmRzIE1lc3NhZ2VSZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgT3V0cHV0Ci17Ci0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIE91dHB1dEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRwdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoamF2YXgud3NkbC5NZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSkgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VNRVNTQUdFOgotICAgICAgICByZXR1cm4gZU1lc3NhZ2UgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuT1VUUFVUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vT3V0cHV0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BhcnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUGFydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwOTg1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUGFydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUGFydEltcGwjZ2V0RWxlbWVudE5hbWUgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBhcnRJbXBsI2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXRUeXBlRGVmaW5pdGlvbiA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUGFydEltcGwjZ2V0RWxlbWVudERlY2xhcmF0aW9uIDxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUGFydEltcGwjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFydEltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBQYXJ0Ci17Ci0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50TmFtZSgpIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVsZW1lbnROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBFTEVNRU5UX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50TmFtZSgpIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVsZW1lbnROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFFOYW1lIGVsZW1lbnROYW1lID0gRUxFTUVOVF9OQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU5hbWUoKSA8ZW0+VHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUeXBlTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgVFlQRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU5hbWUoKSA8ZW0+VHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUeXBlTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSB0eXBlTmFtZSA9IFRZUEVfTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZURlZmluaXRpb24oKSA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUeXBlRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnREZWNsYXJhdGlvbigpIDxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVNZXNzYWdlKCkgPGVtPkVNZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFTWVzc2FnZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlIGVNZXNzYWdlID0gbnVsbDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfUEFSVF9FWFRFTlNJT05TID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvcGFydC1leHRlbnNpb25zLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVTU0FHRSA9ICJtZXNzYWdlIjsKLSAgcHJpdmF0ZSBNYXAgZXh0ZW5zaW9uQXR0cmlidXRlcyA9IG5ldyBFeHRlbnNpb25BdHRyaWJ1dGVNYXAoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBQYXJ0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBBUlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoUU5hbWUgbmV3RWxlbWVudE5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRFbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICAgIGVsZW1lbnROYW1lID0gbmV3RWxlbWVudE5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9OQU1FLCBvbGRFbGVtZW50TmFtZSwgZWxlbWVudE5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiB0eXBlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoUU5hbWUgbmV3VHlwZU5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRUeXBlTmFtZSA9IHR5cGVOYW1lOwotICAgIHR5cGVOYW1lID0gbmV3VHlwZU5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FLCBvbGRUeXBlTmFtZSwgdHlwZU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIHR5cGVEZWZpbml0aW9uLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gb2xkVHlwZURlZmluaXRpb24gPSB0eXBlRGVmaW5pdGlvbjsKLSAgICAgIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCl0eXBlRGVmaW5pdGlvbik7Ci0gICAgICBpZiAodHlwZURlZmluaXRpb24gIT0gb2xkVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OLCBvbGRUeXBlRGVmaW5pdGlvbiwgdHlwZURlZmluaXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVEZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gYmFzaWNHZXRUeXBlRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdHlwZURlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIG5ld1R5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gb2xkVHlwZURlZmluaXRpb24gPSB0eXBlRGVmaW5pdGlvbjsKLSAgICB0eXBlRGVmaW5pdGlvbiA9IG5ld1R5cGVEZWZpbml0aW9uOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTiwgb2xkVHlwZURlZmluaXRpb24sIHR5cGVEZWZpbml0aW9uKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkKLSAgewotICAgIGlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCAmJiBlbGVtZW50RGVjbGFyYXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gb2xkRWxlbWVudERlY2xhcmF0aW9uID0gZWxlbWVudERlY2xhcmF0aW9uOwotICAgICAgZWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgIGlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gb2xkRWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04sIG9sZEVsZW1lbnREZWNsYXJhdGlvbiwgZWxlbWVudERlY2xhcmF0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlbGVtZW50RGVjbGFyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gYmFzaWNHZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnREZWNsYXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBuZXdFbGVtZW50RGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gb2xkRWxlbWVudERlY2xhcmF0aW9uID0gZWxlbWVudERlY2xhcmF0aW9uOwotICAgIGVsZW1lbnREZWNsYXJhdGlvbiA9IG5ld0VsZW1lbnREZWNsYXJhdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX0RFQ0xBUkFUSU9OLCBvbGRFbGVtZW50RGVjbGFyYXRpb24sIGVsZW1lbnREZWNsYXJhdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZSBnZXRFTWVzc2FnZSgpCi0gIHsKLSAgICBpZiAoZU1lc3NhZ2UgIT0gbnVsbCAmJiBlTWVzc2FnZS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIE1lc3NhZ2Ugb2xkRU1lc3NhZ2UgPSBlTWVzc2FnZTsKLSAgICAgIGVNZXNzYWdlID0gKE1lc3NhZ2UpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVNZXNzYWdlKTsKLSAgICAgIGlmIChlTWVzc2FnZSAhPSBvbGRFTWVzc2FnZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRSwgb2xkRU1lc3NhZ2UsIGVNZXNzYWdlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlTWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE1lc3NhZ2UgYmFzaWNHZXRFTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZU1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgbmV3RU1lc3NhZ2UpCi0gIHsKLSAgICBNZXNzYWdlIG9sZEVNZXNzYWdlID0gZU1lc3NhZ2U7Ci0gICAgZU1lc3NhZ2UgPSBuZXdFTWVzc2FnZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRSwgb2xkRU1lc3NhZ2UsIGVNZXNzYWdlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSwgUU5hbWUgdmFsdWUpCi0gIHsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICBpZiAobG9jYWxOYW1lID09IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOwotICAgIGVsc2UKLSAgICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcygpCi0gIHsKLSAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoZXh0ZW5zaW9uQXR0cmlidXRlcyk7Ci0KLSAgICAvLyBBZGp1c3QgbWVzc2FnZU5hbWUgYXR0cmlidXRlCi0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBnZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpIDogbnVsbDsKLSAgICBpZiAobWVzc2FnZU5hbWUgIT0gbnVsbCkKLSAgICAgIG1hcC5wdXQobmV3IFFOYW1lKE5TX1VSSV9QQVJUX0VYVEVOU0lPTlMsIEFUVFJfTUVTU0FHRSksIG1lc3NhZ2VOYW1lKTsKLSAgICBlbHNlCi0gICAgICBtYXAucmVtb3ZlKG5ldyBRTmFtZShOU19VUklfUEFSVF9FWFRFTlNJT05TLCBBVFRSX01FU1NBR0UpKTsKLQotICAgIHJldHVybiBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSkKLSAgewotICAgIGlmIChuYW1lLmVxdWFscyhuZXcgUU5hbWUoTlNfVVJJX1BBUlRfRVhURU5TSU9OUywgQVRUUl9NRVNTQUdFKSkpCi0gICAgICByZXR1cm4gZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBnZXRNZXNzYWdlKCkuZ2V0UU5hbWUoKSA6IG51bGw7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIChRTmFtZSkgZXh0ZW5zaW9uQXR0cmlidXRlcy5nZXQobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGphdmF4LndzZGwuTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpIG1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXRUeXBlTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX0RFRklOSVRJT046Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9ERUNMQVJBVElPTjoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfTkFNRToKLSAgICAgICAgc2V0RWxlbWVudE5hbWUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX05BTUU6Ci0gICAgICAgIHNldFR5cGVOYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OOgotICAgICAgICBzZXRUeXBlRGVmaW5pdGlvbigoWFNEVHlwZURlZmluaXRpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT046Ci0gICAgICAgIHNldEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfTkFNRToKLSAgICAgICAgc2V0RWxlbWVudE5hbWUoRUxFTUVOVF9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX05BTUU6Ci0gICAgICAgIHNldFR5cGVOYW1lKFRZUEVfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OOgotICAgICAgICBzZXRUeXBlRGVmaW5pdGlvbigoWFNEVHlwZURlZmluaXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9ERUNMQVJBVElPTjoKLSAgICAgICAgc2V0RWxlbWVudERlY2xhcmF0aW9uKChYU0RFbGVtZW50RGVjbGFyYXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX05BTUU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnROYW1lICE9IG51bGwgOiAhRUxFTUVOVF9OQU1FX0VERUZBVUxULmVxdWFscyhlbGVtZW50TmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfTkFNRToKLSAgICAgICAgcmV0dXJuIFRZUEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZU5hbWUgIT0gbnVsbCA6ICFUWVBFX05BTUVfRURFRkFVTFQuZXF1YWxzKHR5cGVOYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OOgotICAgICAgICByZXR1cm4gdHlwZURlZmluaXRpb24gIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9ERUNMQVJBVElPTjoKLSAgICAgICAgcmV0dXJuIGVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBlbGVtZW50TmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChlbGVtZW50TmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCB0eXBlTmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh0eXBlTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBNYXAgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uQXR0cmlidXRlczsKLSAgfQotCi0gIGNsYXNzIEV4dGVuc2lvbkF0dHJpYnV0ZU1hcCBleHRlbmRzIEhhc2hNYXAKLSAgewotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHNlcmlhbGl6ZWQuCi0gICAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIEV4dGVuc2lvbkF0dHJpYnV0ZU1hcCgpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsKQotICAgIHsKLSAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpIGtleTsKLSAgICAgIFFOYW1lIHZhbHVlID0gKFFOYW1lKSB2YWw7Ci0gICAgICBTdHJpbmcgbE5hbWUgPSBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgU3RyaW5nIG5TcGFjZSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgIGlmIChOU19VUklfUEFSVF9FWFRFTlNJT05TLmVxdWFscyhuU3BhY2UpICYmIEFUVFJfTUVTU0FHRS5lcXVhbHMobE5hbWUpKQotICAgICAgewotICAgICAgICBqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZVByb3h5ID0gbmV3IE1lc3NhZ2VJbXBsKCk7Ci0gICAgICAgIG1lc3NhZ2VQcm94eS5zZXRRTmFtZSh2YWx1ZSk7Ci0gICAgICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlUHJveHkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHN1cGVyLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZU5TKG51bGwsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZWxlbWVudEF0dHIgPSBXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgV1NETENvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURSk7Ci0gICAgc2V0RWxlbWVudE5hbWUoZWxlbWVudEF0dHIgIT0gbnVsbCA/IGNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIGVsZW1lbnRBdHRyLCBlbGVtZW50LCB0cnVlKSA6IG51bGwpOwotCQkgICAgCi0gICAgU3RyaW5nIHR5cGVBdHRyID0gV1NETENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgIHNldFR5cGVOYW1lKHR5cGVBdHRyICE9IG51bGwgPyBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCB0eXBlQXR0ciwgZWxlbWVudCwgdHJ1ZSkgOiBudWxsKTsKLQotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIC8vc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFydF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLQotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJ0X1R5cGVOYW1lKCkpCi0gICAgICAgIGlmIChnZXRUeXBlTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldFR5cGVOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBnZXRUeXBlTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgCi0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnRfRWxlbWVudE5hbWUoKSkKLSAgICAgICAgaWYgKGdldEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURSwgZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSArICIjIiArIGdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgdHlwZURlZmluaXRpb24uZ2V0VVJJKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsIHx8IGVSZWZlcmVuY2UgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICBpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGVVUklWYWx1ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLkVMRU1FTlRfQVRUUklCVVRFLCBlbGVtZW50RGVjbC5nZXRVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5QQVJUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmV3RWxlbWVudERlY2xhcmF0aW9uID0gcmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50TmFtZSk7Ci0gICAgaWYgKG5ld0VsZW1lbnREZWNsYXJhdGlvbiAhPSBlbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgc2V0RWxlbWVudERlY2xhcmF0aW9uKG5ld0VsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgfQotCi0gICAgWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZURlZmluaXRpb24gPSByZXNvbHZlVHlwZURlZmluaXRpb24odHlwZU5hbWUpOwotICAgIGlmIChuZXdUeXBlRGVmaW5pdGlvbiAhPSB0eXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBzZXRUeXBlRGVmaW5pdGlvbihuZXdUeXBlRGVmaW5pdGlvbik7Ci0gICAgfQotCi0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotCi0gIHByaXZhdGUgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oUU5hbWUgcW5hbWUpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBkZWZpbml0aW9uLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24ocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gcmVzb2x2ZVR5cGVEZWZpbml0aW9uKFFOYW1lIHFuYW1lKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBkZWZpbml0aW9uLnJlc29sdmVUeXBlRGVmaW5pdGlvbihxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IC8vUGFydEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Qb3J0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTgwYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydEltcGwjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBQb3J0Ci17Ci0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nKCkgPGVtPkVCaW5kaW5nPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIGVCaW5kaW5nID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBQb3J0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBPUlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmcgZ2V0RUJpbmRpbmcoKQotICB7Ci0gICAgaWYgKGVCaW5kaW5nICE9IG51bGwgJiYgZUJpbmRpbmcuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBCaW5kaW5nIG9sZEVCaW5kaW5nID0gZUJpbmRpbmc7Ci0gICAgICBlQmluZGluZyA9IChCaW5kaW5nKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllQmluZGluZyk7Ci0gICAgICBpZiAoZUJpbmRpbmcgIT0gb2xkRUJpbmRpbmcpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkcsIG9sZEVCaW5kaW5nLCBlQmluZGluZykpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJpbmRpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nIGJhc2ljR2V0RUJpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGVCaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFQmluZGluZyhCaW5kaW5nIG5ld0VCaW5kaW5nKQotICB7Ci0gICAgQmluZGluZyBvbGRFQmluZGluZyA9IGVCaW5kaW5nOwotICAgIGVCaW5kaW5nID0gbmV3RUJpbmRpbmc7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkcsIG9sZEVCaW5kaW5nLCBlQmluZGluZykpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZyBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRFQmluZGluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QmluZGluZyhqYXZheC53c2RsLkJpbmRpbmcgYmluZGluZykKLSAgewotICAgIHNldEVCaW5kaW5nKChCaW5kaW5nKSBiaW5kaW5nKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkc6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RUJpbmRpbmcoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RUJpbmRpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FQklORElORzoKLSAgICAgICAgc2V0RUJpbmRpbmcoKEJpbmRpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FQklORElORzoKLSAgICAgICAgc2V0RUJpbmRpbmcoKEJpbmRpbmcpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkc6Ci0gICAgICAgIHJldHVybiBlQmluZGluZyAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldE5hbWUoY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5yZW1vdmUoaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgUG9ydCBwb3J0ID0gKFBvcnQpIGNvbXBvbmVudDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwocG9ydC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X05hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZVJlZmVyZW5jZShlUmVmZXJlbmNlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsIHx8IGVSZWZlcmVuY2UgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRfRUJpbmRpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZ2V0RUJpbmRpbmcoKTsKLSAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFFOYW1lIHFOYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGVVUklWYWx1ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLkJJTkRJTkdfQVRUUklCVVRFLCBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSArICIjIiArIHFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLlBPUlQpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIFFOYW1lIGJpbmRpbmdRTmFtZSA9IGNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFdTRExDb25zdGFudHMuQklORElOR19BVFRSSUJVVEUpLCBlbGVtZW50KTsKLSAgICAgIEJpbmRpbmcgbmV3QmluZGluZyA9IChiaW5kaW5nUU5hbWUgIT0gbnVsbCkgPyAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKGJpbmRpbmdRTmFtZSkgOiBudWxsOwotICAgICAgaWYgKG5ld0JpbmRpbmcgIT0gZ2V0RUJpbmRpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0RUJpbmRpbmcobmV3QmluZGluZyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLQotfSAvL1BvcnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydFR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDg5MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydFR5cGVJbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBvcnRUeXBlSW1wbCNnZXRFT3BlcmF0aW9ucyA8ZW0+RU9wZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0VHlwZUltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBQb3J0VHlwZQotewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFT3BlcmF0aW9ucygpIDxlbT5FT3BlcmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFT3BlcmF0aW9ucygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlT3BlcmF0aW9ucyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgUG9ydFR5cGVJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydFR5cGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKLSAgewotICAgIHJldHVybiBxTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgbmV3UU5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRRTmFtZSA9IHFOYW1lOwotICAgIHFOYW1lID0gbmV3UU5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRCwgb2xkVW5kZWZpbmVkLCB1bmRlZmluZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5KGJvb2xlYW4gbmV3UHJveHkpCi0gIHsKLSAgICBib29sZWFuIG9sZFByb3h5ID0gcHJveHk7Ci0gICAgcHJveHkgPSBuZXdQcm94eTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZLCBvbGRQcm94eSwgcHJveHkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVVJJKFN0cmluZyBuZXdSZXNvdXJjZVVSSSkKLSAgewotICAgIFN0cmluZyBvbGRSZXNvdXJjZVVSSSA9IHJlc291cmNlVVJJOwotICAgIHJlc291cmNlVVJJID0gbmV3UmVzb3VyY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKQotICB7Ci0gICAgaWYgKGVPcGVyYXRpb25zID09IG51bGwpCi0gICAgewotICAgICAgZU9wZXJhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3BlcmF0aW9uLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VPUEVSQVRJT05TKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVPcGVyYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhbiBvcGVyYXRpb24gdG8gdGhpcyBwb3J0IHR5cGUuCi0gICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbihqYXZheC53c2RsLk9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBpZiAoIW9wZXJhdGlvbi5pc1VuZGVmaW5lZCgpKQotICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGQob3BlcmF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uIE5vdGUgdGhhdCBvcGVyYXRpb24gbmFtZXMgY2FuCi0gICAqIGJlIG92ZXJsb2FkZWQgd2l0aGluIGEgUG9ydFR5cGUuIEluIGNhc2Ugb2Ygb3ZlcmxvYWRpbmcsIHRoZQotICAgKiBuYW1lcyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcyBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyCi0gICAqIHJlZmluZSB0aGUgc2VhcmNoLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBpbnB1dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiAgICAgICAgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gb3V0cHV0TmFtZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiAgICAgICAgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogICAgICAgICBhbnkgbWF0Y2hpbmcgb3BlcmF0aW9uCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuT3BlcmF0aW9uIGdldE9wZXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGlucHV0TmFtZSwgU3RyaW5nIG91dHB1dE5hbWUpCi0gIHsKLSAgICBJdGVyYXRvciBvcEl0ZXJhdG9yID0gZ2V0T3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKG9wSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGphdmF4LndzZGwuT3BlcmF0aW9uIG9wID0gKGphdmF4LndzZGwuT3BlcmF0aW9uKSBvcEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgU3RyaW5nIG9wTmFtZSA9IG9wLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3BOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghbmFtZS5lcXVhbHMob3BOYW1lKSkKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuYW1lICE9IG51bGwgfHwgb3BOYW1lICE9IG51bGwpCi0gICAgICAgIG9wID0gbnVsbDsKLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgaW5wdXROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuSW5wdXQgaW5wdXQgPSBvcC5nZXRJbnB1dCgpOwotICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvcElucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICBpZiAob3BJbnB1dE5hbWUgPT0gbnVsbCB8fCAhb3BJbnB1dE5hbWUuZXF1YWxzKGlucHV0TmFtZSkpCi0gICAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBqYXZheC53c2RsLk91dHB1dCBvdXRwdXQgPSBvcC5nZXRPdXRwdXQoKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG9wT3V0cHV0TmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsIHx8ICFvcE91dHB1dE5hbWUuZXF1YWxzKG91dHB1dE5hbWUpKQotICAgICAgICAgICAgb3AgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfSAvLyBlbmQgd2hpbGUKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBvcGVyYXRpb25zIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRPcGVyYXRpb25zKCkKLSAgewotICAgIGlmICghaXNVbmRlZmluZWQoKSkKLSAgICAgIHJldHVybiBnZXRFT3BlcmF0aW9ucygpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VPUEVSQVRJT05TOgotICAgICAgICByZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRU9QRVJBVElPTlM6Ci0gICAgICAgIGdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoUU5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoVU5ERUZJTkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKFJFU09VUkNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgcmV0dXJuIGVPcGVyYXRpb25zICE9IG51bGwgJiYgIWVPcGVyYXRpb25zLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAocU5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocU5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgdW5kZWZpbmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVuZGVmaW5lZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBwcm94eTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChwcm94eSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIFN0cmluZyBuYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUgPT0gbnVsbCA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRRTmFtZShxbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1BFUkFUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgb3BlcmF0aW9uLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICBvcGVyYXRpb24uc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGQob3BlcmF0aW9uKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBnZXRMaXN0KGNvbXBvbmVudCwgbW9kZWxPYmplY3QpOwotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTGlzdCBnZXRMaXN0KE9iamVjdCBjb21wb25lbnQsIE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgY29tcG9uZW50OwotCi0gICAgTGlzdCBsaXN0ID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydFR5cGVfUU5hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5QT1JUX1RZUEUpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChPcGVyYXRpb25JbXBsKSBvcGVyYXRpb24pLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vUG9ydFR5cGVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvU2VydmljZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWY5YWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNnZXRFUG9ydHMgPGVtPkVQb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2VydmljZQotewotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogc2VyaWFsVmVyc2lvblVJRCBpcyBhc3NpZ25lZCB3aXRoIDFMIHRvIGF2b2lkCi0gICAqIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUG9ydHMoKSA8ZW0+RVBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQb3J0cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlUG9ydHMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuZXdRTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFFOYW1lID0gcU5hbWU7Ci0gICAgcU5hbWUgPSBuZXdRTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQsIG9sZFVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIG5ld1Byb3h5KQotICB7Ci0gICAgYm9vbGVhbiBvbGRQcm94eSA9IHByb3h5OwotICAgIHByb3h5ID0gbmV3UHJveHk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RVBvcnRzKCkKLSAgewotICAgIGlmIChlUG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlUG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUG9ydC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVQb3J0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBwb3J0IHRvIHRoaXMgc2VydmljZS4KLSAgICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQb3J0KGphdmF4LndzZGwuUG9ydCBwb3J0KQotICB7Ci0gICAgZ2V0RVBvcnRzKCkuYWRkKChQb3J0KXBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHBvcnRzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFBvcnRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBpLm5leHQoKTsKLSAgICAgIGhhc2hNYXAucHV0KHBvcnQuZ2V0TmFtZSgpLCBwb3J0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcG9ydC4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwb3J0LCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcG9ydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlBvcnQgZ2V0UG9ydChTdHJpbmcgbmFtZSkKLSAgewotICAgIFBvcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGkubmV4dCgpOwotICAgICAgaWYgKG5hbWUuZXF1YWxzKHBvcnQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcG9ydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FUE9SVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFUG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFk6Ci0gICAgICAgIHJldHVybiBpc1Byb3h5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FUE9SVFM6Ci0gICAgICAgIHJldHVybiBnZXRFUG9ydHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTOgotICAgICAgICBnZXRFUG9ydHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFUG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VQT1JUUzoKLSAgICAgICAgZ2V0RVBvcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCAhPSBVTkRFRklORURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZOgotICAgICAgICByZXR1cm4gcHJveHkgIT0gUFJPWFlfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTOgotICAgICAgICByZXR1cm4gZVBvcnRzICE9IG51bGwgJiYgIWVQb3J0cy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLSAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lID09IG51bGwgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0UU5hbWUocW5hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlQgOgotICAgICAgICB7Ci0gICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpICgoV1NETFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdTRExQYWNrYWdlLmVOU19VUkkpKS5nZXRXU0RMRmFjdG9yeSgpLmNyZWF0ZVBvcnQoKTsKLSAgICAgICAgICBwb3J0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICBnZXRFUG9ydHMoKS5hZGQocG9ydCk7Ci0gICAgICAgICAgcG9ydC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT04gOgotICAgICAgICB7Ci0gICAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgIHsKLSAgICAgICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlKE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IGdldExpc3QobW9kZWxPYmplY3QpOwotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTGlzdCBnZXRMaXN0KE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEVQb3J0cygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlX1FOYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuU0VSVklDRSk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0JCi0gICAgaXRlcmF0b3IgPSBnZXRFUG9ydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKFBvcnRJbXBsKSBwb3J0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi19IC8vU2VydmljZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9UeXBlc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9UeXBlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYzZGRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvVHlwZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vL2ltcG9ydCBjb20uaWJtLndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFR5cGVzSW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFR5cGVzCi17Ci0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIGFzc2lnbmVkIHdpdGggMUwgdG8gYXZvaWQKLSAgICogY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFR5cGVzSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVzKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRTY2hlbWFzKCkKLSAgewotICAgIExpc3QgYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkZWUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgaWYgKHhzZGVlLmdldFNjaGVtYSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGFycmF5TGlzdC5hZGQoeHNkZWUuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYXJyYXlMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hcyhTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldFNjaGVtYXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGkubmV4dCgpOwotICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsICYmIHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKSB7Ci0gICAgCSAgc2NoZW1hcy5hZGQoc2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS5lcXVhbHMoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgewotICAgICAgICBzY2hlbWFzLmFkZChzY2hlbWEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2NoZW1hczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBzdXBlci5lTm90aWZ5KG1zZyk7Ci0gICAgCi0gICAgLy8gY3MuLiBpZiB3ZSd2ZSBhZGRlZCBhbiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgYW5kIHRoZSBUeXBlcyBvYmplY3QgaXMgYWxyZWFkeSBhdHRhY2hlZCAKLSAgICAvLyB0byBhIHJlc291cmNlIHdlIG5lZWQgdG8gc2V0IHRoZSBzY2hlbWFMb2NhdGlvbiBmb3IgdGhlIGlubGluZSBzY2hlbWEuCi0gICAgLy8gSWYgbm90IHlldCBhdHRhY2hlZCB0byBhIHJlc291cmNlLCB0aGUgc2NoZW1hTG9jYXRpb24ncyB3aWxsIGJlIHNldCB2aWEgV1NETFJlc291cmNlSW1wbC5hdHRhY2hlZChFT2JqZWN0IG8pCi0gICAgLy8gICAgIAotICAgIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbnNpYmxlRWxlbWVudF9FRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgJiYKLSAgICAgICAgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpCi0gICAgewotICAgICAgaWYgKG1zZy5nZXROZXdWYWx1ZSgpIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZWUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKW1zZy5nZXROZXdWYWx1ZSgpOwotICAgICAgICBpZiAoZWUuZ2V0U2NoZW1hKCkgIT0gbnVsbCAmJiBlZS5nZXRTY2hlbWEoKS5lUmVzb3VyY2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgIGVlLmdldFNjaGVtYSgpLnNldFNjaGVtYUxvY2F0aW9uKGVlLmdldFNjaGVtYSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0gIAotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBpZiAoInNjaGVtYSIuZXF1YWxzKGNoaWxkLmdldExvY2FsTmFtZSgpKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkZWUgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgeHNkZWUuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICB4c2RlZS5zZXRFbGVtZW50KGNoaWxkKTsgLy8gY3MgOiB0aGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgdGhlIGlubGluZSBzY2hlbWEgICAgICAgICAgICAgICAKLSAgICAgICAgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoeHNkZWUpOyAgICAgICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gICAgKChEZWZpbml0aW9uSW1wbClnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpLnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpIGNvbXBvbmVudDsKLSAgICBMaXN0IGxpc3QgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgbGlzdC5yZW1vdmUobW9kZWxPYmplY3QpOwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcykgY29tcG9uZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbCh0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuVFlQRVMpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICAvLyBBZGQgY2hpbGRyZW4KLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXdFbGVtZW50OwotCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyID0gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgRWxlbWVudCBlbCA9IG51bGw7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHkgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgZWwgPSBleHRlbnNpYmlsaXR5LmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbCAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgcmVQYXJlbnRlZCA9IChFbGVtZW50KSBkb2N1bWVudC5pbXBvcnROb2RlKGVsLCB0cnVlKTsKLSAgICAgICAgICBleHRlbnNpYmlsaXR5LnNldEVsZW1lbnQocmVQYXJlbnRlZCk7IC8vIHJlcGxhY2Ugd2l0aCB0aGUgbmV3IG9uZQotICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQocmVQYXJlbnRlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCUVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbClleHRlbnNpYmlsaXR5KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICAJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9UeXBlc0ltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmRkZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsI2dldENoaWxkcmVuIDxlbT5DaGlsZHJlbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGlsZHJlbigpIDxlbT5DaGlsZHJlbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDaGlsZHJlbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICAgIHsKLSAgICAgICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19DSElMRFJFTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDaGlsZHJlbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOOgotICAgICAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU46Ci0gICAgICAgICAgICBnZXRDaGlsZHJlbigpLmNsZWFyKCk7Ci0gICAgICAgICAgICBnZXRDaGlsZHJlbigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOOgotICAgICAgICAgICAgZ2V0Q2hpbGRyZW4oKS5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19DSElMRFJFTjoKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmICFjaGlsZHJlbi5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICAgIH0KLQotICAgIC8vIAotICAgIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gICAgLy8KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCAmJiAhaXNSZWNvbmNpbGluZykKLSAgICAgICAgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnQoKTogUHJlc2VydmluZyBvbGQgZWxlbWVudCIpOwotICAgICAgICB9IAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldEVsZW1lbnRHZW4oZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5yZWNvbmNpbGVBdHRyaWJ1dGVzKCkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudCgpIik7Ci0gICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8uLiAgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlIHRoZSBjaGlsZCBzaG91bGQgZ28gaW4gdGhlIGluIGN1cnJlbnQgbGlzdAotICAgICAgICAvLyBzbyB0aGF0IGl0IGRvZXNuJ3QgYWx3YXlzIGVuZCB1cCBnb2luZyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IAotICAgICAgICAvLyAoc2luY2UgYSBuZXcgZWxlbWVudCBtaWdodCBiZSBhZGRlZCBhdCB0aGUgc3RhcnQpCi0gICAgICAgIGdldENoaWxkcmVuKCkuYWRkKGV4dGVuc2liaWxpdHlFbGVtZW50KTsgICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZSh0aGlzLCBpLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICAgIHsKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVlZSA9IChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGNvbXBvbmVudDsKLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICB1ZWUuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gICAgewotICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICAgICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0KLSAgICAgICAgRWxlbWVudCBuZXdFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgLy8gVGhpcyBpcyBhbiBvbGQgZWxlbWVudC4KLSAgICAgICAgewotICAgICAgICAgICAgbmV3RWxlbWVudCA9IChFbGVtZW50KSBkb2N1bWVudC5pbXBvcnROb2RlKGVsZW1lbnQsIHRydWUpOwotICAgICAgICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVyID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCAocXVhbGlmaWVyID09IG51bGwgPyAiIiA6IHF1YWxpZmllciArICI6IikgKyBnZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIGVsZW1lbnQgPSBuZXdFbGVtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIHByb3BlcnRpZXMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICAgIHsKLSAgICAgICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgICAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuTWFwLkVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSAoamF2YS51dGlsLk1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19IC8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODNkMmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5XU0RMRWxlbWVudEltcGwjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLldTRExFbGVtZW50SW1wbCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETEVsZW1lbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXU0RMRWxlbWVudAotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERvY3VtZW50YXRpb25FbGVtZW50KCkgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVsZW1lbnQgRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSA8ZW0+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFbGVtZW50IGRvY3VtZW50YXRpb25FbGVtZW50ID0gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbGVtZW50IEVMRU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50KCkgPGVtPkVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50ID0gRUxFTUVOVF9FREVGQVVMVDsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIHVwZGF0aW5nRE9NID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBFTGlzdCB3c2RsQ29udGVudHM7Ci0KLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGVuY2xvc2luZ0RlZmluaXRpb247Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETEVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50YXRpb25FbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uRWxlbWVudChFbGVtZW50IG5ld0RvY3VtZW50YXRpb25FbGVtZW50KQotICB7Ci0gICAgRWxlbWVudCBvbGREb2N1bWVudGF0aW9uRWxlbWVudCA9IGRvY3VtZW50YXRpb25FbGVtZW50OwotICAgIGRvY3VtZW50YXRpb25FbGVtZW50ID0gbmV3RG9jdW1lbnRhdGlvbkVsZW1lbnQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQsIG9sZERvY3VtZW50YXRpb25FbGVtZW50LCBkb2N1bWVudGF0aW9uRWxlbWVudCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50R2VuKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgewotICAgIEVsZW1lbnQgb2xkRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19FTEVNRU5ULCBvbGRFbGVtZW50LCBlbGVtZW50KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmNsb3NpbmdEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGVuY2xvc2luZ0RlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoZG9jdW1lbnRhdGlvbkVsZW1lbnQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZWxlbWVudDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChlbGVtZW50KTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxhdGlvbiBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIFdTRExDb250ZW50c0VMaXN0IGV4dGVuZHMgRUNvbnRlbnRzRUxpc3QKLSAgewotICAgIFdTRExDb250ZW50c0VMaXN0KEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlW10gZVN0cnVjdHVyYWxGZWF0dXJlcykKLSAgICB7Ci0gICAgICBzdXBlcihlT2JqZWN0LCBlU3RydWN0dXJhbEZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yIG5ld0xpc3RJdGVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlSXRlcmF0b3JJbXBsKGVPYmplY3QsIGVTdHJ1Y3R1cmFsRmVhdHVyZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZWQoRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSkKLSAgICB7Ci0gICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZVN0cnVjdHVyYWxGZWF0dXJlOwotICAgICAgcmV0dXJuICFlUmVmZXJlbmNlLmlzVHJhbnNpZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgYmFzaWNMaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFdTRExDb250ZW50c0VMaXN0KGVPYmplY3QsIGVTdHJ1Y3R1cmFsRmVhdHVyZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBiYXNpY0l0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEZlYXR1cmVJdGVyYXRvckltcGwoZU9iamVjdCwgZVN0cnVjdHVyYWxGZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGZWF0dXJlSXRlcmF0b3JJbXBsIGV4dGVuZHMgRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9ySW1wbAotICAgIHsKLSAgICAgIHB1YmxpYyBGZWF0dXJlSXRlcmF0b3JJbXBsKEVPYmplY3QgZU9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgc3VwZXIoZU9iamVjdCwgKEVTdHJ1Y3R1cmFsRmVhdHVyZVtdKSAoKEJhc2ljRUxpc3QpIGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKSkuZGF0YSgpKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIEZlYXR1cmVJdGVyYXRvckltcGwoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmVbXSBlU3RydWN0dXJhbEZlYXR1cmVzKQotICAgICAgewotICAgICAgICBzdXBlcihlT2JqZWN0LCBlU3RydWN0dXJhbEZlYXR1cmVzKTsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlZChFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlKQotICAgICAgewotICAgICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZVN0cnVjdHVyYWxGZWF0dXJlOwotICAgICAgICByZXR1cm4gIWVSZWZlcmVuY2UuaXNUcmFuc2llbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRUxpc3QgZ2V0V1NETENvbnRlbnRzKCkKLSAgewotICAgIGlmICh3c2RsQ29udGVudHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2RsQ29udGVudHMgPSBuZXcgV1NETENvbnRlbnRzRUxpc3QodGhpcywgKEVTdHJ1Y3R1cmFsRmVhdHVyZVtdKSAoKEJhc2ljRUxpc3QpIGVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKSkuZGF0YSgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gd3NkbENvbnRlbnRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgc2V0RWxlbWVudEdlbihudWxsKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGVudHMgPSBnZXRXU0RMQ29udGVudHMoKS5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgV1NETEVsZW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGNvbnRlbnQgPSAoV1NETEVsZW1lbnRJbXBsKSBvYmo7Ci0gICAgICAgICAgY29udGVudC5zZXRFbGVtZW50KG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRFbGVtZW50R2VuKGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGVOb3RpZmljYXRpb25SZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGludCBldmVudFR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgT2JqZWN0IGZlYXR1cmUgPSBtc2cuZ2V0RmVhdHVyZSgpOwotICAgIE9iamVjdCBvbGRWYWx1ZSA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotICAgIE9iamVjdCBuZXdWYWx1ZSA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCi0gICAgaWYgKGVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkuY29udGFpbnMoZmVhdHVyZSkpCi0gICAgewotICAgICAgRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0gICAgICBpZiAoZVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkgJiYgIWVSZWZlcmVuY2UuaXNUcmFuc2llbnQoKSkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYWRvcHRDb250ZW50KGVSZWZlcmVuY2UsbmV3VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG5ld1ZhbHVlcyA9ICgoQ29sbGVjdGlvbikgbmV3VmFsdWUpLml0ZXJhdG9yKCk7IG5ld1ZhbHVlcy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgbmV3VmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgYWRvcHRDb250ZW50KGVSZWZlcmVuY2UsIHdzZGxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcnBoYW5Db250ZW50KGVSZWZlcmVuY2UsIC8qKFdTRExFbGVtZW50KSovIG9sZFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBvbGRWYWx1ZXMgPSAoKENvbGxlY3Rpb24pIG9sZFZhbHVlKS5pdGVyYXRvcigpOyBvbGRWYWx1ZXMuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgb2xkVmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgb3JwaGFuQ29udGVudChlUmVmZXJlbmNlLCBvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLk1PVkUgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vdmVDb250ZW50KGVSZWZlcmVuY2UsIChXU0RMRWxlbWVudCkgbmV3VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uVU5TRVQgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcnBoYW5Db250ZW50KGVSZWZlcmVuY2UsIG9sZFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhZG9wdENvbnRlbnQoZVJlZmVyZW5jZSwgbmV3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuY29udGFpbnMoZmVhdHVyZSkpCi0gICAgewotICAgICAgRUF0dHJpYnV0ZSBlQXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGZlYXR1cmU7Ci0gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLSAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLk1PVkUgOgotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5TRVQgOgotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBjaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZU5vdGlmeShtc2cpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgb3JwaGFuQ29udGVudChFUmVmZXJlbmNlIGVSZWZlcmVuY2UsIE9iamVjdCBvYmopCi0gIHsKLSAgICBpZiAoIWlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgRWxlbWVudCBwYXJlbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgb2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAJV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpb2JqOwotICAgICAgICBFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gd3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICBuaWNlUmVtb3ZlQ2hpbGQoY29udGVudEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLCBjb250ZW50RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAJOy8vU3lzdGVtLm91dC5wcmludGxuKCJXU0RMRWxlbWVudC5vcnBoYW5Db250ZW50KCksIE9iamVjdCBpczogIiArIG9iaik7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBuaWNlUmVtb3ZlQ2hpbGQoTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGRvbSB3cml0ZWJhY2sgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yY2VOaWNlUmVtb3ZlQ2hpbGQocGFyZW50LCBjaGlsZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGZvcmNlTmljZVJlbW92ZUNoaWxkKE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKQotICB7Ci0gICAgdXBkYXRpbmdET00gPSB0cnVlOwotCi0gICAgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0KLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPyoiKTsKLSAgICBOb2RlIHByZXZpb3VzID0gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgaWYgKHByZXZpb3VzICE9IG51bGwgJiYgcHJldmlvdXMuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLSAgICB7Ci0gICAgICBUZXh0IHRleHQgPSAoVGV4dClwcmV2aW91czsKLSAgICAgIFN0cmluZyBkYXRhID0gdGV4dC5nZXREYXRhKCk7Ci0gICAgICBpbnQgaW5kZXggPSBkYXRhLmxhc3RJbmRleE9mKCdcbicpOwotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBpZiAoaW5kZXggLSAxID4gMCAmJiBkYXRhLmNoYXJBdChpbmRleCAtIDEpID09ICdccicpCi0gICAgICAgIHsKLS8vU3lzdGVtLm91dC5wcmludGxuKCIxKiIpOwotICAgICAgICAgIHRleHQuZGVsZXRlRGF0YShpbmRleCAtIDEsIGRhdGEubGVuZ3RoKCkgLSBpbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotLy9TeXN0ZW0ub3V0LnByaW50bG4oIjIqIik7Ci0gICAgICAgICAgdGV4dC5kZWxldGVEYXRhKGluZGV4LCBkYXRhLmxlbmd0aCgpIC0gaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiTm8gcmV0dXJuIGJlZm9yZSEiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gdGV4dCBub2RlIGJlZm9yZSEiKTsKLSAgICB9Ci0KLQotICAgIGlmICghZG9uZSkKLSAgICB7Ci0gICAgICBmb3IgKE5vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7IG5leHQgIT0gbnVsbDsgbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIFRleHQgdGV4dCA9IChUZXh0KW5leHQ7Ci0gICAgICAgICAgU3RyaW5nIGRhdGEgPSB0ZXh0LmdldERhdGEoKTsKLS8qCi0gICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInh4ICIgKyBkYXRhLmxlbmd0aCgpICsgIjo6ICIpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGgoKTsgKytpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIiArIEludGVnZXIudG9IZXhTdHJpbmcoKGludClkYXRhLmNoYXJBdChpKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSovCi0KLSAgICAgICAgICBpbnQgaW5kZXggPSBkYXRhLmluZGV4T2YoJ1xuJyk7Ci0gICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBkYXRhLmxlbmd0aCgpICYmIGRhdGEuY2hhckF0KGluZGV4ICsgMSkgPT0gJ1xyJykKLSAgICAgICAgICAgIHsKLSAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIjMqIik7Ci0gICAgICAgICAgICAgIHRleHQuZGVsZXRlRGF0YSgwLCBpbmRleCArIDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCI0KiIpOwotICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZURhdGEoMCwgaW5kZXggKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJObyByZXR1cm4gYWZ0ZXIhIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbW92aW5nIGZyb20tLS0tLS0tLVxuICAgICAiICsgcGFyZW50KTsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZpbmctLS0tLS0tLVxuICAgICAiICsgY2hpbGQpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQotICAgIHVwZGF0aW5nRE9NPWZhbHNlOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIG1vdmVDb250ZW50KEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGRvbSB3cml0ZWJhY2sgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm1vdmluZyAiICsgeHNkQ29uY3JldGVDb21wb25lbnQpOwotICAgIE5vZGUgcGFyZW50ID0gZ2V0QWRvcHRpb25QYXJlbnROb2RlKGVSZWZlcmVuY2UpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gd3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3QgY29udGVudHMgPSBnZXRXU0RMQ29udGVudHMoKTsKLSAgICAgICAgaW50IGluZGV4ID0gY29udGVudHMuaW5kZXhPZih3c2RsRWxlbWVudCk7Ci0gICAgICAgIG5pY2VSZW1vdmVDaGlsZChwYXJlbnQsIGNoaWxkKTsKLSAgICAgICAgbmljZUluc2VydEJlZm9yZQotICAgICAgICAgIChwYXJlbnQsIAotICAgICAgICAgICAgY2hpbGQsIAotICAgICAgICAgICAgKytpbmRleCA9PSBjb250ZW50cy5zaXplKCkgPyAgCi0gICAgICAgICAgICAgIG51bGwgOiAKLSAgICAgICAgICAgICAgKChXU0RMRWxlbWVudCljb250ZW50cy5nZXQoaW5kZXgpKS5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgIH0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibW92ZWQgIiArIHhzZENvbmNyZXRlQ29tcG9uZW50KTsKLQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRvcHRDb250ZW50KEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgb2JqZWN0OwotICAgICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICB7Ci0gICAgICAgIGlmICh3c2RsRWxlbWVudC5nZXRFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKSB3c2RsRWxlbWVudCkuZWxlbWVudENoYW5nZWQod3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsICYmIChjaGlsZEVsZW1lbnQgPT0gbnVsbCB8fCBjaGlsZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsICYmIGNoaWxkRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkgIT0gZ2V0RWxlbWVudCgpLmdldE93bmVyRG9jdW1lbnQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3c2RsRWxlbWVudC5zZXRFbGVtZW50KG51bGwpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBoYW5kbGVFbGVtZW50Rm9yQWRvcHQoZVJlZmVyZW5jZSwgd3NkbEVsZW1lbnQpOwotICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKSB3c2RsRWxlbWVudCkudXBkYXRlRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgICgoV1NETEVsZW1lbnRJbXBsKSB3c2RsRWxlbWVudCkuYWRvcHRCeShkZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTmFtZXNwYWNlKQotICAgIHsKLSAgICAgIC8vIEFkZCBhIG5hbWVzcGFjZSBhdHRyaWJ1dGUgdG8gdGhlIERlZmluaXRpb25zIGVsZW1lbnQuCi0gICAgICBOYW1lc3BhY2UgbnMgPSAoTmFtZXNwYWNlKW9iamVjdDsKLSAgICAgIE5vZGUgYWRvcHRpb25QYXJlbnQgPSBnZXRBZG9wdGlvblBhcmVudE5vZGUoZVJlZmVyZW5jZSk7IC8vIERlZmluaXRpb25zIG5vZGUKLSAgICAgIC8vIEtCOiBBc3N1bXB0aW9uIC0gVGhlIHByZWZpeCBpcyB1bmlxdWUgaWYgd2UgYXJlIGhlcmUgKGJ5IHRoZSBEZWZpbml0aW9ucyBtb2RlbCkuIAotCSAgaWYgKGFkb3B0aW9uUGFyZW50ICE9IG51bGwpIHsKLQkJICAoKEVsZW1lbnQpYWRvcHRpb25QYXJlbnQpLnNldEF0dHJpYnV0ZSgieG1sbnM6Iitucy5nZXRQcmVmaXgoKSxucy5nZXRVUkkoKSk7Ci0JICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIE5vZGUgZ2V0QWRvcHRpb25QYXJlbnROb2RlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRGb3JBZG9wdChFUmVmZXJlbmNlIGVSZWZlcmVuY2UsIFdTRExFbGVtZW50IHdzZGxFbGVtZW50KQotICB7IAotICAgIC8vIEVzdGFibGlzaCBET00gcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcAotICAgIAotICAgIE5vZGUgYWRvcHRpb25QYXJlbnQgPSBnZXRBZG9wdGlvblBhcmVudE5vZGUoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSB3c2RsRWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IG51bGw7Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBjb250ZW50cyA9IGdldFdTRExDb250ZW50cygpLml0ZXJhdG9yKCk7IGNvbnRlbnRzLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIGlmIChjb250ZW50cy5uZXh0KCkgPT0gd3NkbEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb250ZW50cy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgbmV4dCA9IGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gKChXU0RMRWxlbWVudCluZXh0KS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICB3aGlsZSAocmVmZXJlbmNlZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTm9kZSBwYXJlbnQgPSByZWZlcmVuY2VkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7IAotICAgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudCA9PSBhZG9wdGlvblBhcmVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgCi0gICAgaWYgKGNoaWxkRWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgICgoV1NETEVsZW1lbnRJbXBsKXdzZGxFbGVtZW50KS5pc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgIGNoaWxkRWxlbWVudCA9ICgoV1NETEVsZW1lbnRJbXBsKXdzZGxFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICAoKFdTRExFbGVtZW50SW1wbCl3c2RsRWxlbWVudCkuaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgICAgaWYgKGNoaWxkRWxlbWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBjcmVhdGVkISAiICsgd3NkbEVsZW1lbnQpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaXNBdHRhY2hlZCA9IGZhbHNlOwotICAgIGZvciAoTm9kZSByb290RG9jdW1lbnQgPSBjaGlsZEVsZW1lbnQ7IHJvb3REb2N1bWVudCAhPSBudWxsOyByb290RG9jdW1lbnQgPSByb290RG9jdW1lbnQuZ2V0UGFyZW50Tm9kZSgpKQotICAgIHsKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLm5vZGVUeXBlKHJvb3REb2N1bWVudCkgPT0gV1NETENvbnN0YW50cy5ERUZJTklUSU9OKQotICAgICAgewotICAgICAgICBpc0F0dGFjaGVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmICghaXNBdHRhY2hlZCkKLSAgICB7Ci0gICAgICBpZiAocmVmZXJlbmNlZEVsZW1lbnQgPT0gbnVsbCAmJiAKLSAgICAgICAgICAhZVJlZmVyZW5jZS5pc01hbnkoKSkKLSAgICB7Ci0gICAgICBmb3IgKE5vZGUgY2hpbGQgPSBhZG9wdGlvblBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICByZWZlcmVuY2VkRWxlbWVudCA9IChFbGVtZW50KWNoaWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICAgLy9yZWZlcmVuY2VkRWxlbWVudCA9IGNvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKGFkb3B0aW9uUGFyZW50LGNoaWxkRWxlbWVudCk7ICAgICAKLSAgICAgIG5pY2VJbnNlcnRCZWZvcmUoYWRvcHRpb25QYXJlbnQsIGNoaWxkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5pY2VJbnNlcnRCZWZvcmUoTm9kZSBwYXJlbnQsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmZXJlbmNlQ2hpbGQpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGRvbSB3cml0ZWJhY2sgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3JjZU5pY2VJbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmZXJlbmNlQ2hpbGQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZm9yY2VOaWNlSW5zZXJ0QmVmb3JlKE5vZGUgcGFyZW50LCBOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZmVyZW5jZUNoaWxkKQotICB7Ci0gICAgdXBkYXRpbmdET00gPSB0cnVlOwotCi0gICAgTE9PUDoKLSAgICBmb3IgKE5vZGUgY2hpbGQgPSByZWZlcmVuY2VDaGlsZCA9PSBudWxsID8gcGFyZW50LmdldExhc3RDaGlsZCgpIDogcmVmZXJlbmNlQ2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IAotICAgICAgICAgY2hpbGQgIT0gbnVsbDsgCi0gICAgICAgICBjaGlsZCA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKLSAgICAgICAgewotICAgICAgICAgIFRleHQgdGV4dCA9IChUZXh0KWNoaWxkOwotICAgICAgICAgIFN0cmluZyBkYXRhID0gdGV4dC5nZXREYXRhKCk7Ci0KLS8qCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieHggIiArIGRhdGEubGVuZ3RoKCkgKyAiOjogIik7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCgpOyArK2kpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKChpbnQpZGF0YS5jaGFyQXQoaSkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0qLwotCi0gICAgICAgICAgaW50IGluZGV4ID0gZGF0YS5sYXN0SW5kZXhPZignXG4nKTsKLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbiBoZXJlIik7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBmb3IgKE5vZGUgYW5jZXN0b3IgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOyAKLSAgICAgICAgICAgICAgICAgYW5jZXN0b3IgIT0gbnVsbCAmJiBhbmNlc3Rvci5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERTsgCi0gICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50Tm9kZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbmRlbnQuYXBwZW5kKCIgICAgIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBkYXRhLmxlbmd0aCgpICYmIGRhdGEuY2hhckF0KGluZGV4ICsgMSkgPT0gJ1xyJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRleHQucmVwbGFjZURhdGEoaW5kZXggKyAxLCBkYXRhLmxlbmd0aCgpIC0gaW5kZXggLSAxLCBpbmRlbnQgKyAiICAgICIpOwotCi0gICAgICAgICAgICAvLyBzZXRDb3JyZWN0SW5kZW50YXRpb24oaW5kZW50LCBuZXdUZXh0KTsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDaGlsZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbmRlbnQuYXBwZW5kKCIgICAgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXh0IG5ld1RleHQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIgKyBpbmRlbnQpOwotLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnNlcnRlZC4uLiIgKyBuZXdUZXh0KTsKLSAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3VGV4dCwgcmVmZXJlbmNlQ2hpbGQpOwotICAgICAgICAgICAgcmVmZXJlbmNlQ2hpbGQgPSBuZXdUZXh0OwotICAgICAgICAgICAgYnJlYWsgTE9PUDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAKLSAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrIExPT1A7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zZXJ0ZWQuLi4iICsgbmV3Q2hpbGQpOwotICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZmVyZW5jZUNoaWxkKTsKLQotICAgIHVwZGF0aW5nRE9NID0gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjb21wdXRlVG9wTGV2ZWxSZWZDaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbm9kZVRvQWRkKQotICB7Ci0gIAlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGEgPSBnZXRQcmVjZWRlbmNlKG5vZGVUb0FkZCk7Ci0gICAgICAJCi0gICAgZm9yIChOb2RlIG5vZGUgPSBwYXJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgIHsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0JCSAgICBpbnQgYiA9IGdldFByZWNlZGVuY2Uobm9kZSk7Ci0JCSAgICBpZiAoYiA+PSBhKQotCQkgICAgewotCQkgICAgICByZXN1bHQgPSAoRWxlbWVudClub2RlOwkKLQkgICAgICAgIGJyZWFrOwkgICAgCi0JCSAgICB9ICAgICAgICAKLSAgICAgIH0gCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSGFzaE1hcCBwcmVjZWRlbmNlTWFwID0gY3JlYXRlUHJlY2VkZW5jZU1hcCgpOwotCi0gIHByaXZhdGUgaW50IGdldFByZWNlZGVuY2UoTm9kZSBub2RlKQotICB7Ci0gIAlpbnQgcmVzdWx0ID0gMjsKLSAgCVN0cmluZyBsb2NhbE5hbWUgPSBub2RlLmdldExvY2FsTmFtZSgpOwotICAJaWYgKGxvY2FsTmFtZSAhPSBudWxsKQotICAJeyAgCQotICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpcHJlY2VkZW5jZU1hcC5nZXQobG9jYWxOYW1lKTsKLSAgICAgIGlmIChpbnRlZ2VyICE9IG51bGwpCi0gICAgICB7ICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGludGVnZXIuaW50VmFsdWUoKTsKLSAgICAgIH0KLSAgCX0KLSAgCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBIYXNoTWFwIGNyZWF0ZVByZWNlZGVuY2VNYXAoKQotCXsKLQkJSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcigxKSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuSU1QT1JUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcigzKSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuVFlQRVNfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDQpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5NRVNTQUdFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig1KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuUE9SVF9UWVBFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig2KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNykpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlNFUlZJQ0VfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDgpKTsKLQkJcmV0dXJuIGhhc2hNYXA7Ci0JfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkb3B0QnkoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBjb21wb25lbnRzID0gZ2V0V1NETENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29tcG9uZW50cy5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBjaGlsZCA9IGNvbXBvbmVudHMubmV4dCgpOwotICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgV1NETEVsZW1lbnRJbXBsKQotICAgICAgewotICAgICAgICAoKFdTRExFbGVtZW50SW1wbCkgY2hpbGQpLmFkb3B0QnkoZGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZ0RPTSgpCi0gIHsKLSAgICByZXR1cm4gdXBkYXRpbmdET007Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgaWYgKCFpc1VwZGF0aW5nRE9NKCkpCi0gICAgewotICAgICAgaWYgKCFpc1JlY29uY2lsaW5nKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjaGFuZ2VGb3IgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICByZWNvbmNpbGUoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgICAgIFdTRExFbGVtZW50IHRoZUNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAodGhlQ29udGFpbmVyICE9IG51bGwgJiYgdGhlQ29udGFpbmVyLmdldEVsZW1lbnQoKSA9PSBjaGFuZ2VkRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKSB0aGVDb250YWluZXIpLmVsZW1lbnRDaGFuZ2VkKGNoYW5nZWRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICA7IC8vU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBpbnRlcm5hbCByZWNvbmNpbGUgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIDsgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIERPTSByZWNvbmNpbGUgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqIFRPRE8uLi4gcmVtb3ZlIHRoaXMgbWV0aG9kIQotICAgKi8KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0V1NETENvbnRlbnRzKCk7Ci0gIH0KLQotICAvKgotICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRFbGVtZW50Rm9yTW9kZWxPYmplY3QoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKEVsZW1lbnQpIG1vZGVsT2JqZWN0OwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoV1NETEVsZW1lbnQpIG1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgKi8KLQotICBwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q29udGVudE5vZGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKE5vZGUgY2hpbGQgPSBjaGFuZ2VkRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZChjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBTb21lIHN1YmNsYXNzZXMgdXNlIHRoaXMgbWV0aG9kCi0gIHByb3RlY3RlZCBRTmFtZSBjcmVhdGVRTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBwcmVmaXhlZE5hbWUpCi0gIHsKLSAgICAvLyBEZWxlZ2F0ZSB0byB0aGUgbmV3IGZvcm0gdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpbiBjYXNlIHNvbWVvbmUKLSAgICAvLyBlbHNlIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgIAotICAgIHJldHVybiBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCBwcmVmaXhlZE5hbWUsIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBRTmFtZSBmcm9tIGEgcHJlZml4ZWQgbmFtZS4gVGFrZXMgaW50byBhY2NvdW50IGxvY2FsbHkgZGVmaW5lZAotICAgKiBuYW1lc3BhY2UgcHJlZml4ZXMuCi0gICAqIAotICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgKiAgICAgICAgICB0aGUgZW5jbG9zaW5nIGRlZmluaXRpb24uIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBwcmVmaXhlZE5hbWUKLSAgICogICAgICAgICAgdGhlIHByZWZpeGVkIG5hbWUgdG8gY29udmVydCB0byBRTmFtZQotICAgKiBAcGFyYW0gZWxlbWVudAotICAgKiAgICAgICAgICB0aGUgZW5jbG9zaW5nIGVsZW1lbnQuIE1heSBiZSBudWxsIGluIHdoaWNoIGNhc2UgdGhlIHByZWZpeCBpcwotICAgKiAgICAgICAgICBvbmx5IGxvb2tlZCB1cCBhbW9uZyB0aGUgb25lcyBkZWZpbmVkIGF0IHRoZSBkZWZpbml0aW9uIGxldmVsLgotICAgKiBAcmV0dXJuIHRoZSBRTmFtZSBlcXVpdmFsZW50IGZvciB0aGUgZ2l2ZW4gcHJlZml4ZWQgbmFtZSwgb3IgbnVsbCBpZiBhCi0gICAqICAgICAgICAgbmFtZXNwYWNlIHByZWZpeCBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UgVVJJIG9yIGlmCi0gICAqICAgICAgICAgdGhlIHByZWZpeGVkIG5hbWUgaXMgbnVsbC4KLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBjcmVhdGVRTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBwcmVmaXhlZE5hbWUsIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgICByZXR1cm4gY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgcHJlZml4ZWROYW1lLCBlbGVtZW50LCBmYWxzZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgUU5hbWUgZnJvbSBhIHByZWZpeGVkIG5hbWUuIFRha2VzIGludG8gYWNjb3VudCBsb2NhbGx5IGRlZmluZWQKLSAgICogbmFtZXNwYWNlIHByZWZpeGVzLiBTZWxlY3RpdmVseSBhbGxvd3MgbnVsbCBuYW1lc3BhY2UgVVJJcy4KLSAgICogCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAqICAgICAgICAgIHRoZSBlbmNsb3NpbmcgZGVmaW5pdGlvbi4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHBhcmFtIHByZWZpeGVkTmFtZQotICAgKiAgICAgICAgICB0aGUgcHJlZml4ZWQgbmFtZSB0byBjb252ZXJ0IHRvIFFOYW1lCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqICAgICAgICAgIHRoZSBlbmNsb3NpbmcgZWxlbWVudC4gTWF5IGJlIG51bGwgaW4gd2hpY2ggY2FzZSB0aGUgcHJlZml4IGlzCi0gICAqICAgICAgICAgIG9ubHkgbG9va2VkIHVwIGFtb25nIHRoZSBvbmVzIGRlZmluZWQgYXQgdGhlIGRlZmluaXRpb24gbGV2ZWwuCi0gICAqIEBwYXJhbSBhbGxvd051bGxOYW1lc3BhY2VVUkkgaWYgdHJ1ZSBhbmQgdGhlIHByZWZpeGVkIG5hbWUgZG9lcyBub3QgaGF2ZSAKLSAgICogICAgICAgICAgYSBwcmVmaXggYSBRTmFtZSBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQgdXNpbmcgCi0gICAqICAgICAgICAgIHtAbGluayBYTUxDb25zdGFudHMjTlVMTF9OU19VUkl9IGZvciB0aGUgbmFtZXNwYWNlIFVSSSAgICAgICAgICAKLSAgICogQHJldHVybiB0aGUgUU5hbWUgZXF1aXZhbGVudCBmb3IgdGhlIGdpdmVuIHByZWZpeGVkIG5hbWUsIG9yIG51bGwgaWYgYQotICAgKiAgICAgICAgIG5hbWVzcGFjZSBwcmVmaXggY2Fubm90IGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIFVSSSBvciBpZgotICAgKiAgICAgICAgIHRoZSBwcmVmaXhlZCBuYW1lIGlzIG51bGwuIAotICAgKi8KLSAgcHJvdGVjdGVkIFFOYW1lIGNyZWF0ZVFOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHByZWZpeGVkTmFtZSwgRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGFsbG93TnVsbE5hbWVzcGFjZVVSSSkKLSAgewotICAgIFFOYW1lIHFuYW1lID0gbnVsbDsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcHJlZml4ZWROYW1lLmluZGV4T2YoIjoiKTsgLy8vLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgcHJlZml4ID0gKGluZGV4ID09IC0xKSA/ICIiIDogcHJlZml4ZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZShwcmVmaXgpOwotICAgICAgCi0gICAgICBpZiAobmFtZXNwYWNlID09IG51bGwgJiYgZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGxvY2FsbHkgZGVmaW5lZCBuYW1lc3BhY2UgcHJlZml4LgotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlVVJJRnJvbVByZWZpeChlbGVtZW50LCBwcmVmaXgpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgfHwgKGFsbG93TnVsbE5hbWVzcGFjZVVSSSAmJiBwcmVmaXgubGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIHByZWZpeCBhbmQgYSBub2RlLCBmaW5kcyB0aGUgbmFtZXNwYWNlIFVSSSBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBwcmVmaXguIFdhbGtzIHRoZSBlbGVtZW50IGNvbnRhaW5tZW50IGhpZXJhcmNoeSB1bnRpbCBpdCBmaW5kcyBvbmUgb3IgaXQKLSAgICogcmVhY2hlcyB0aGUgZG9jdW1lbnQgcm9vdC4KLSAgICogCi0gICAqIEBwYXJhbSBub2RlCi0gICAqICAgICAgICAgIHRoZSBzdGFydGluZyBub2RlCi0gICAqIEBwYXJhbSBwcmVmaXgKLSAgICogICAgICAgICAgdGhlIHByZWZpeCB0byBmaW5kIGFuIHhtbG5zOnByZWZpeD11cmkgZm9yCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UgVVJJIG9yIG51bGwgaWYgbm90IGZvdW5kCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJRnJvbVByZWZpeChOb2RlIG5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBpZiAobm9kZSA9PSBudWxsIHx8IHByZWZpeCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIE5vZGUgY3VycmVudE5vZGUgPSBub2RlOwotCi0gICAgd2hpbGUgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gZ2V0QXR0cmlidXRlTlMoKEVsZW1lbnQpIGN1cnJlbnROb2RlLCBYU0RDb25zdGFudHMuWE1MTlNfVVJJXzIwMDAsIHByZWZpeCk7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXRyaWV2ZXMgYW4gYXR0cmlidXRlJ3MgdmFsdWUuCi0gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBjb250YWluaW5nIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgdGhlIG5hbWVzcGFjZSBVUkkuCi0gICAqIEBwYXJhbSBsb2NhbFBhcnQgdGhlIGxvY2FsIG5hbWUuCi0gICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGlmIHByZXNlbnQsIG9yIG51bGwgaWYgbm90LiAKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOUyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbFBhcnQpCi0gIHsKLSAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBudWxsOwotICAgIEF0dHIgYXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpOwotCi0gICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOwotICB9ICAKLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGRlZXAgfHwgZ2V0RWxlbWVudCgpID09IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlRWxlbWVudCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY2hhbmdlQXR0cmlidXRlKG51bGwpOwotICAgICAgY2hhbmdlUmVmZXJlbmNlKG51bGwpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoKQotICB7Ci0gICAgaWYgKGdldEVsZW1lbnQoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgY3JlYXRlRWxlbWVudCgpOwotICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIGNoYW5nZUF0dHJpYnV0ZShudWxsKTsKLSAgICBjaGFuZ2VSZWZlcmVuY2UobnVsbCk7Ci0KLSAgICBPYmplY3Qgb2JqID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGNvbnRhaW5tZW50cyA9IGVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKS5pdGVyYXRvcigpOyBjb250YWlubWVudHMuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgY29udGFpbm1lbnRzLm5leHQoKTsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gVEJEIC0gVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBhbmQKLSAgICAgICAgLy8gZVJlZmVybmNlIGlzIFhTRFNjaGVtYS4gV2hhdCBkbyB3ZSB3YW50IHRvIGRvIGZvciB1cGRhdGU/Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghZVJlZmVyZW5jZS5pc1RyYW5zaWVudCgpKQotICAgICAgewotICAgICAgICBpZiAoZVJlZmVyZW5jZS5pc01hbnkoKSkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoSXRlcmF0b3Igb2JqZWN0cyA9ICgoQ29sbGVjdGlvbikgZUdldChlUmVmZXJlbmNlKSkuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9iaiA9IG9iamVjdHMubmV4dCgpOwotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpIHx8IG9iaiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBTa2lwIGl0LiBQcm9iYWJseSB0aGlzIGlzIE5hbWVzcGFjZS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIG9iajsKLSAgICAgICAgICAgICAgLy9oYW5kbGVFbGVtZW50Rm9yQWRvcHQoZVJlZmVyZW5jZSwgd3NkbEVsZW1lbnQpOwotICAgICAgICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBlR2V0KGVSZWZlcmVuY2UpOwotICAgICAgICAgIGlmICh3c2RsRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vaGFuZGxlRWxlbWVudEZvckFkb3B0KGVSZWZlcmVuY2UsICB3c2RsRWxlbWVudCk7Ci0gICAgICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IC8vIGVuZCBlbHNlIGlmCi0gICAgfSAvLyBlbmQgZm9yCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExFbGVtZW50X0VsZW1lbnQoKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsICYmICFpc1JlY29uY2lsaW5nKQotICAgICAgewotICAgICAgICBmb3IgKE5vZGUgcm9vdERvY3VtZW50ID0gdGhlRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7IHJvb3REb2N1bWVudCAhPSBudWxsOyByb290RG9jdW1lbnQgPSByb290RG9jdW1lbnQuZ2V0UGFyZW50Tm9kZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJvb3REb2N1bWVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVjb25jaWxlQXR0cmlidXRlcyhnZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlY29uY2lsZShnZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgIHRyYXZlcnNlVG9Sb290Rm9yUGF0Y2hpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpCi0gIHsKLSAgICBpZiAoIWlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgV1NETEVsZW1lbnRJbXBsIGNvbnRhaW5lciA9IChXU0RMRWxlbWVudEltcGwpZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbnRhaW5lci50cmF2ZXJzZVRvUm9vdEZvclBhdGNoaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVjb25jaWxlKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICByZWNvbmNpbGVBdHRyaWJ1dGVzKGNoYW5nZWRFbGVtZW50KTsKLSAgICByZWNvbmNpbGVDb250ZW50cyhjaGFuZ2VkRWxlbWVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZUNvbnRlbnRzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IHJlbWFpbmluZ01vZGVsT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoZ2V0V1NETENvbnRlbnRzKCkpOwotCi0gICAgQ29sbGVjdGlvbiBjb250ZW50Tm9kZXMgPSBnZXRDb250ZW50Tm9kZXMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgRWxlbWVudCB0aGVEb2N1bWVudGF0aW9uRWxlbWVudCA9IG51bGw7Ci0gICAgCi0gICAgLy8gZm9yIGVhY2ggYXBwbGljYWJsZSBjaGlsZCBub2RlIG9mIGNoYW5nZWRFbGVtZW50Ci0gICAgTE9PUCA6IGZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnROb2Rlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIC8vIFNldCBEb2N1bWVudGF0aW9uIGVsZW1lbnQgaWYgZXhpc3RzCi0gICAgICBpZiAoV1NETENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLmVxdWFscyhjaGlsZC5nZXRMb2NhbE5hbWUoKSkgJiYKLSAgICAgICAgICBXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCksIFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKSkKLSAgICAgIHsKLSAgICAgICAgLy8gYXNzdW1lIHRoZSBmaXJzdCAnZG9jdW1lbnRhdGlvbicgZWxlbWVudCBpcyAndGhlJyBkb2N1bWVudGF0aW9uIGVsZW1lbnQKLSAgICAgICAgLy8gJ3RoZXJlIGNhbiBiZSBvbmx5IG9uZSEnCi0gICAgICAgIGlmICh0aGVEb2N1bWVudGF0aW9uRWxlbWVudCA9PSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICB0aGVEb2N1bWVudGF0aW9uRWxlbWVudCA9IGNoaWxkOwotICAgICAgICB9ICAgCi0gICAgICB9IAotICAgICAgLy8gZ28gdGhydSB0aGUgbW9kZWwgb2JqZWN0cyB0byBjb2xsZWN0IG1hdGNoaW5nIG9iamVjdCBmb3IgcmV1c2UKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGVudHMgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgY29udGVudHMuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gKE9iamVjdCkgY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAoKChXU0RMRWxlbWVudCkgbW9kZWxPYmplY3QpLmdldEVsZW1lbnQoKSA9PSBjaGlsZCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRlbnRzLnJlbW92ZSgpOyAvLyByZW1vdmVzIHRoZSAnY2hpbGQnIE5vZGUgZnJvbSB0aGUgcmVtYWluaW5nTW9kZWxPYmplY3RzIGxpc3QKLSAgICAgICAgICBjb250aW51ZSBMT09QOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIGlmIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQgaGFzIGNoYW5nZWQuLi4gdXBkYXRlIGl0Ci0gICAgICAvLwotICAgICAgaWYgKHRoZURvY3VtZW50YXRpb25FbGVtZW50ICE9IGdldERvY3VtZW50YXRpb25FbGVtZW50KCkpCi0gICAgICB7Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KHRoZURvY3VtZW50YXRpb25FbGVtZW50KTsgIAotICAgICAgfSAgCi0gICAgICAKLSAgICAgIC8vIHdlIGhhdmVuJ3QgZm91bmQgYSBtYXRjaGluZyBtb2RlbCBvYmplY3QgZm9yIHRoZSBOb2RlLCBzZSB3ZSBtYXkgbmVlZCB0bwotICAgICAgLy8gY3JlYXRlIGEgbmV3IG1vZGVsIG9iamVjdAotICAgICAgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCwgcmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgICB9Ci0KLSAgICAvLyBub3cgd2UgY2FuIHJlbW92ZSB0aGUgcmVtYWluaW5nIG1vZGVsIG9iamVjdHMKLSAgICBoYW5kbGVSZWNvbmNpbGlhdGlvbihyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotCi0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkKLSAgewotICAgIGlmIChlbmNsb3NpbmdEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICByZXR1cm4gZW5jbG9zaW5nRGVmaW5pdGlvbjsKLQotICAgIC8vIFRCRCAtIFJldmlzaXQKLSAgICAvL0VPYmplY3QgYyA9IGVDb250YWllcigpOyBjICE9IG51bGw7IGMgPSBjLmVDb250YWludGVyKCkpCi0gICAgLy97Ci0KLSAgICBmb3IgKFdTRExFbGVtZW50IGNvbnRhaW5lciA9IHRoaXM7IGNvbnRhaW5lciAhPSBudWxsOyBjb250YWluZXIgPSAoKFdTRExFbGVtZW50SW1wbCkgY29udGFpbmVyKS5nZXRDb250YWluZXIoKSkKLSAgICB7Ci0gICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgZW5jbG9zaW5nRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBjb250YWluZXI7Ci0gICAgICAgIHJldHVybiBlbmNsb3NpbmdEZWZpbml0aW9uOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoKLSAgcHVibGljIERlZmluaXRpb24gZ2V0Um9vdEVuY2xvc2luZ0RlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKGVuY2xvc2luZ0RlZmluaXRpb24gPT0gbnVsbCkKLSAgICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBlUmVzb3VyY2UoKTsKLSAgICAgIExpc3QgY29udGVudHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOwotICAgICAgaWYgKGNvbnRlbnRzLnNpemUoKSA9PSAxIAotICAgICAgICAgICYmIGNvbnRlbnRzLmdldCgwKSBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICAgIGVuY2xvc2luZ0RlZmluaXRpb24gPSAoRGVmaW5pdGlvbiljb250ZW50cy5nZXQoMCk7Ci0gICAgfSAKLSAgICByZXR1cm4gZW5jbG9zaW5nRGVmaW5pdGlvbjsKLSAgfQotICAqLwotCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIGVDb250YWluZXIoKSBpbnN0YW5jZW9mIFdTRExFbGVtZW50ID8gKFdTRExFbGVtZW50KSBlQ29udGFpbmVyKCkgOiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgbmljZVNldEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBkb20gYXR0cmlidXRlIHdyaXRlYmFjayBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSkpCi0gICAgICB7Ci0gICAgICAgIHVwZGF0aW5nRE9NID0gdHJ1ZTsKLSAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLSAgICAgICAgdXBkYXRpbmdET00gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlKSB8fCAhZWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUpLmVxdWFscyh2YWx1ZSkpCi0gICAgewotICAgICAgdXBkYXRpbmdET00gPSB0cnVlOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUsIHZhbHVlKTsKLSAgICAgIHVwZGF0aW5nRE9NID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBuaWNlQ3JlYXRlTmFtZXNwYWNlQXR0cmlidXRlKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBhIHVuaXF1ZSBwcmVmaXggZm9yICJuYW1lc3BhY2UuIgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHVyaUxpc3QpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGRvbSBhdHRyaWJ1dGUgd3JpdGViYWNrIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHVyaUxpc3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotICAgICAgdXBkYXRpbmdET00gPSBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodXJpTGlzdCwgIiAiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpOykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHVyaSA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB1cmk7Ci0gICAgICAgIGludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZigiIyIpOwotICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW5kZXggPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBsb2NhbE5hbWUgPSB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHF1YWxpZmllciA9IFhTRENvbnN0YW50cy5sb29rdXBRdWFsaWZpZXIoZWxlbWVudCwgbmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKHF1YWxpZmllciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcXVhbGlmaWVyID0gbmljZUNyZWF0ZU5hbWVzcGFjZUF0dHJpYnV0ZShuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHFOYW1lID0gcXVhbGlmaWVyID09IG51bGwgfHwgcXVhbGlmaWVyLmxlbmd0aCgpID09IDAgPyBsb2NhbE5hbWUgOiBxdWFsaWZpZXIgKyAiOiIgKyBsb2NhbE5hbWU7Ci0KLSAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZS5hcHBlbmQoJyAnKTsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZS5hcHBlbmQocU5hbWUpOwotICAgICAgfQotCi0gICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlKSB8fCAhZWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUpLmVxdWFscyh2YWx1ZS50b1N0cmluZygpKSkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRpbmdET00gPSB0cnVlOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHVwZGF0aW5nRE9NID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpIC8vIFNob3VsZCBJIG1ha2UgdGhpcyBhYnN0cmFjdD8KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIEVsZW1lbnQgY3JlYXRlRWxlbWVudChpbnQgbm9kZVR5cGUpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICAgIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgdGhpczsKLSAgICBlbHNlCi0gICAgICBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgU3RyaW5nIHdzZGxOYW1lc3BhY2UgPSBXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSTsKLSAgICBTdHJpbmcgcXVhbGlmaWVyID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgod3NkbE5hbWVzcGFjZSk7Ci0KLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMod3NkbE5hbWVzcGFjZSwgKHF1YWxpZmllciA9PSBudWxsID8gIiIgOiBxdWFsaWZpZXIgKyAiOiIpICsgV1NETENvbnN0YW50cy5nZXRFbGVtZW50VGFnKG5vZGVUeXBlKSk7Ci0KLSAgICBpZiAoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwotCi0gICAgaWYgKGdldERvY3VtZW50YXRpb25FbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaW1wb3J0Tm9kZShnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCB0cnVlKSk7Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGRlZXApCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBjb250ZW50cyA9IGdldFdTRExDb250ZW50cygpLml0ZXJhdG9yKCk7IGNvbnRlbnRzLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBjb250ZW50ID0gY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIFdTRExFbGVtZW50SW1wbCBlbGVtZW50ID0gKFdTRExFbGVtZW50SW1wbCkgY29udGVudDsKLSAgICAgICAgICBlbGVtZW50LmlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICAgIGVsZW1lbnQucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLSAgICAgICAgICBlbGVtZW50LmlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldEJlc3RXU0RMRWxlbWVudChMaXN0IGVsZW1lbnRQYXRoKQotICB7Ci0JICBXU0RMRWxlbWVudCByZXN1bHQgPSB0aGlzOwotCSAgZm9yIChJdGVyYXRvciBjb21wb25lbnRzID0gZ2V0V1NETENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29tcG9uZW50cy5oYXNOZXh0KCk7ICkKLQkgIHsKLQkJICBPYmplY3Qgb2JqZWN0ID0gY29tcG9uZW50cy5uZXh0KCk7Ci0JCSAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkgewotCQkJICBXU0RMRWxlbWVudEltcGwgY2hpbGRXU0RMRWxlbWVudCA9IChXU0RMRWxlbWVudEltcGwpIG9iamVjdDsKLQotCQkJICBpZiAoZWxlbWVudFBhdGguY29udGFpbnMoY2hpbGRXU0RMRWxlbWVudC5nZXRFbGVtZW50KCkpKQotCQkJICB7Ci0JCQkJICByZXN1bHQgPSBjaGlsZFdTRExFbGVtZW50OwotCQkJCSAgV1NETEVsZW1lbnQgYmV0dGVyV1NETEVsZW1lbnQgPSBjaGlsZFdTRExFbGVtZW50LmdldEJlc3RXU0RMRWxlbWVudChlbGVtZW50UGF0aCk7Ci0JCQkJICBpZiAoYmV0dGVyV1NETEVsZW1lbnQgIT0gbnVsbCkKLQkJCQkgIHsKLQkJCQkJICByZXN1bHQgPSBiZXR0ZXJXU0RMRWxlbWVudDsKLQkJCQkgIH0KLQotCQkJCSAgaWYgKCFjb25zaWRlckFsbENvbnRhaW5zRm9yQmVzdFdTRExFbGVtZW50KCkpCi0JCQkJICB7Ci0JCQkJCSAgYnJlYWs7Ci0JCQkJICB9Ci0JCQkgIH0KLQkJICB9Ci0JICB9Ci0KLQkgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25zaWRlckFsbENvbnRhaW5zRm9yQmVzdFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50QXR0cmlidXRlc0NoYW5nZWQoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIGlmICghaXNVcGRhdGluZ0RPTSgpKQotICAgIHsKLSAgICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICAgIHsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGNoYW5nZUZvciAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAKLSAgICAgICAgaXNSZWNvbmNpbGluZyA9IHRydWU7Ci0gICAgICAgIHJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgICAgIFdTRExFbGVtZW50SW1wbCB0aGVDb250YWluZXIgPSAoV1NETEVsZW1lbnRJbXBsKWdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAodGhlQ29udGFpbmVyICE9IG51bGwgJiYgdGhlQ29udGFpbmVyLmdldEVsZW1lbnQoKSA9PSBjaGFuZ2VkRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIHRoZUNvbnRhaW5lci5lbGVtZW50QXR0cmlidXRlc0NoYW5nZWQoY2hhbmdlZEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgICAgICB0cmF2ZXJzZVRvUm9vdEZvclBhdGNoaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgaW50ZXJuYWwgcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIERPTSByZWNvbmNpbGUgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbGVtZW50Q29udGVudHNDaGFuZ2VkKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoIWlzVXBkYXRpbmdET00oKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzUmVjb25jaWxpbmcpCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjaGFuZ2VGb3IgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICByZWNvbmNpbGVDb250ZW50cyhjaGFuZ2VkRWxlbWVudCk7Ci0KLSAgICAgICAgV1NETEVsZW1lbnRJbXBsIHRoZUNvbnRhaW5lciA9IChXU0RMRWxlbWVudEltcGwpZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGlmICh0aGVDb250YWluZXIgIT0gbnVsbCAmJiB0aGVDb250YWluZXIuZ2V0RWxlbWVudCgpID09IGNoYW5nZWRFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgdGhlQ29udGFpbmVyLmVsZW1lbnRDb250ZW50c0NoYW5nZWQoY2hhbmdlZEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgICAgICB0cmF2ZXJzZVRvUm9vdEZvclBhdGNoaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgaW50ZXJuYWwgcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIERPTSByZWNvbmNpbGUgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVByZWZpeChOb2RlIG5vZGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBvbGRQcmVmaXgsIFN0cmluZyBuZXdQcmVmaXgpCi0gIHsKLSAgICBpZiAoKG5hbWVzcGFjZSA9PSBudWxsID8gbm9kZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIDogbmFtZXNwYWNlLmVxdWFscyhub2RlLmdldE5hbWVzcGFjZVVSSSgpKSkgJiYKLSAgICAgICAgICAob2xkUHJlZml4ID09IG51bGwgPyBub2RlLmdldFByZWZpeCgpID09IG51bGwgOiBvbGRQcmVmaXguZXF1YWxzKG5vZGUuZ2V0UHJlZml4KCkpKSkKLSAgICB7Ci0gICAgICBub2RlLnNldFByZWZpeChuZXdQcmVmaXgpOwotICAgIH0KLQotICAgIGZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgdXBkYXRlUHJlZml4KGNoaWxkLCBuYW1lc3BhY2UsIG9sZFByZWZpeCwgbmV3UHJlZml4KTsKLSAgICB9Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lc3BhY2UoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLSAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBlbHNlIGlmIChnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0TmFtZXNwYWNlKG5hbWUuc3Vic3RyaW5nKDAsaW5kZXgpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbE5hbWUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLSAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsKLSAgICBpZiAoIGluZGV4ID09IC0xKQotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4KzEpOwotICB9Ci0KLX0gLy9XU0RMRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjZGZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvV1NETEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdTRExGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMRmFjdG9yeUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0gIHsKLSAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRTogcmV0dXJuIGNyZWF0ZVBvcnRUeXBlKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTjogcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFOiByZXR1cm4gY3JlYXRlTWVzc2FnZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUOiByZXR1cm4gY3JlYXRlUGFydCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HOiByZXR1cm4gY3JlYXRlQmluZGluZygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTjogcmV0dXJuIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRTogcmV0dXJuIGNyZWF0ZVNlcnZpY2UoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVDogcmV0dXJuIGNyZWF0ZVBvcnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UOiByZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTjogcmV0dXJuIGNyZWF0ZURlZmluaXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUOiByZXR1cm4gY3JlYXRlSW1wb3J0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUOiByZXR1cm4gY3JlYXRlSW5wdXQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUOiByZXR1cm4gY3JlYXRlT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUOiByZXR1cm4gY3JlYXRlRmF1bHQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVDogcmV0dXJuIGNyZWF0ZUJpbmRpbmdJbnB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVDogcmV0dXJuIGNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVDogcmV0dXJuIGNyZWF0ZUJpbmRpbmdGYXVsdCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0U6IHJldHVybiBjcmVhdGVOYW1lc3BhY2UoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVM6IHJldHVybiBjcmVhdGVUeXBlcygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlFOQU1FOgotICAgICAgICByZXR1cm4gY3JlYXRlUU5hbWVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX1RZUEU6Ci0gICAgICAgIHJldHVybiBjcmVhdGVPcGVyYXRpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRPTV9FTEVNRU5UOgotICAgICAgICByZXR1cm4gY3JlYXRlRE9NRWxlbWVudEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VYQ0VQVElPTjoKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVdTRExFeGNlcHRpb25Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRE9NX0RPQ1VNRU5UOgotICAgICAgICByZXR1cm4gY3JlYXRlRE9NRG9jdW1lbnRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUU5BTUU6Ci0gICAgICAgIHJldHVybiBjb252ZXJ0UU5hbWVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fVFlQRToKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRPcGVyYXRpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRE9NX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBjb252ZXJ0RE9NRWxlbWVudFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRVhDRVBUSU9OOgotICAgICAgICByZXR1cm4gY29udmVydFdTRExFeGNlcHRpb25Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ET01fRE9DVU1FTlQ6Ci0gICAgICAgIHJldHVybiBjb252ZXJ0RE9NRG9jdW1lbnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpCi0gIHsKLSAgICBQb3J0VHlwZUltcGwgcG9ydFR5cGUgPSBuZXcgUG9ydFR5cGVJbXBsKCk7Ci0gICAgcmV0dXJuIHBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpCi0gIHsKLSAgICBPcGVyYXRpb25JbXBsIG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb25JbXBsKCk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpCi0gIHsKLSAgICBNZXNzYWdlSW1wbCBtZXNzYWdlID0gbmV3IE1lc3NhZ2VJbXBsKCk7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBQYXJ0IGNyZWF0ZVBhcnQoKQotICB7Ci0gICAgUGFydEltcGwgcGFydCA9IG5ldyBQYXJ0SW1wbCgpOwotICAgIHJldHVybiBwYXJ0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZyBjcmVhdGVCaW5kaW5nKCkKLSAgewotICAgIEJpbmRpbmdJbXBsIGJpbmRpbmcgPSBuZXcgQmluZGluZ0ltcGwoKTsKLSAgICByZXR1cm4gYmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gY3JlYXRlQmluZGluZ09wZXJhdGlvbigpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uSW1wbCBiaW5kaW5nT3BlcmF0aW9uID0gbmV3IEJpbmRpbmdPcGVyYXRpb25JbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoKQotICB7Ci0gICAgU2VydmljZUltcGwgc2VydmljZSA9IG5ldyBTZXJ2aWNlSW1wbCgpOwotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkKLSAgewotICAgIFBvcnRJbXBsIHBvcnQgPSBuZXcgUG9ydEltcGwoKTsKLSAgICByZXR1cm4gcG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IG5ldyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKTsKLSAgICByZXR1cm4gZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0gICAKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oKQotICB7Ci0gICAgRGVmaW5pdGlvbkltcGwgZGVmaW5pdGlvbiA9IG5ldyBEZWZpbml0aW9uSW1wbCgpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGNyZWF0ZUltcG9ydCgpCi0gIHsKLSAgICBJbXBvcnRJbXBsIGltcG9ydF8gPSBuZXcgSW1wb3J0SW1wbCgpOwotICAgIHJldHVybiBpbXBvcnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgSW5wdXQgY3JlYXRlSW5wdXQoKQotICB7Ci0gICAgSW5wdXRJbXBsIGlucHV0ID0gbmV3IElucHV0SW1wbCgpOwotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE91dHB1dCBjcmVhdGVPdXRwdXQoKQotICB7Ci0gICAgT3V0cHV0SW1wbCBvdXRwdXQgPSBuZXcgT3V0cHV0SW1wbCgpOwotICAgIHJldHVybiBvdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBGYXVsdCBjcmVhdGVGYXVsdCgpCi0gIHsKLSAgICBGYXVsdEltcGwgZmF1bHQgPSBuZXcgRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIGZhdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0lucHV0IGNyZWF0ZUJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXRJbXBsIGJpbmRpbmdJbnB1dCA9IG5ldyBCaW5kaW5nSW5wdXRJbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPdXRwdXQgY3JlYXRlQmluZGluZ091dHB1dCgpCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0SW1wbCBiaW5kaW5nT3V0cHV0ID0gbmV3IEJpbmRpbmdPdXRwdXRJbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCkKLSAgewotICAgIEJpbmRpbmdGYXVsdEltcGwgYmluZGluZ0ZhdWx0ID0gbmV3IEJpbmRpbmdGYXVsdEltcGwoKTsKLSAgICByZXR1cm4gYmluZGluZ0ZhdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTmFtZXNwYWNlIGNyZWF0ZU5hbWVzcGFjZSgpCi0gIHsKLSAgICBOYW1lc3BhY2VJbXBsIG5hbWVzcGFjZSA9IG5ldyBOYW1lc3BhY2VJbXBsKCk7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFR5cGVzIGNyZWF0ZVR5cGVzKCkKLSAgewotICAgIFR5cGVzSW1wbCB0eXBlcyA9IG5ldyBUeXBlc0ltcGwoKTsKLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50ID0gbmV3IFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKTsKLSAgICByZXR1cm4gdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50ID0gbmV3IFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCgpOwotICAgIHJldHVybiB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotICAKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBjcmVhdGVRTmFtZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgewotICAgIHJldHVybiAoUU5hbWUpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY29udmVydFFOYW1lVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb25UeXBlIGNyZWF0ZU9wZXJhdGlvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gKE9wZXJhdGlvblR5cGUpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY29udmVydE9wZXJhdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLSAgewotICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRE9NRWxlbWVudEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgewotICAgIHJldHVybiAoRWxlbWVudClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBjb252ZXJ0RE9NRWxlbWVudFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETEV4Y2VwdGlvbiBjcmVhdGVXU0RMRXhjZXB0aW9uRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgcmV0dXJuIChXU0RMRXhjZXB0aW9uKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRXU0RMRXhjZXB0aW9uVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgewotICAgIHJldHVybiAoRG9jdW1lbnQpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY29udmVydERPTURvY3VtZW50VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMUGFja2FnZSBnZXRXU0RMUGFja2FnZSgpCi0gIHsKLSAgICByZXR1cm4gKFdTRExQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NETFBhY2thZ2UgZ2V0UGFja2FnZSgpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLwotICAvLwotICAvLwotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkobmFtZXNwYWNlKTsKLSAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQotICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBjcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgfQotICAKLSAgLyoKLSAgcHVibGljIHZvaWQgc2V0QWx3YXlzVXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlcHJlY2F0ZWQ6IFdTRExGYWN0b3J5SW1wbC5zZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMiKTsKLSAgfQotICAqLwotfSAvL1dTRExGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGMzMDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdTRExQYWNrYWdlCi17Ci0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcG9ydFR5cGVFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgb3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIG1lc3NhZ2VFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcGFydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBwb3J0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGRlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaW1wb3J0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGV4dGVuc2libGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlucHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIG91dHB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBmYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nSW5wdXRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgYmluZGluZ091dHB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgbmFtZXNwYWNlRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlQb3J0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlJbnB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpT3V0cHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlGYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpTWVzc2FnZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpUGFydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpU2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpUG9ydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ09wZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ0lucHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlCaW5kaW5nT3V0cHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlCaW5kaW5nRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlEZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlJbXBvcnRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaUxpc3RFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaU1hcEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpdXJsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlFeHRlbnNpb25SZWdpc3RyeUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB0eXBlc0VDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpSXRlcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaVR5cGVzRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIHFOYW1lRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIG9wZXJhdGlvblR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgZG9tRWxlbWVudEVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSB3c2RsRXhjZXB0aW9uRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIGRvbURvY3VtZW50RURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotICAgICAqIHBhY2thZ2UgVVJJIHZhbHVlLgotICAgICAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLSAgICAgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotICAgICAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0gICAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlI2VOU19VUkkKLSAgICAgKiBAc2VlICNpbml0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBXU0RMUGFja2FnZUltcGwoKQotICAgIHsKLSAgICAgICAgc3VwZXIoZU5TX1VSSSwgV1NETEZhY3RvcnkuZUlOU1RBTkNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLSAgICAgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotICAgICAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0gICAgICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0gICAgICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotICAgICAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0gICAgICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotICAgICAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotICAgICAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLSAgICAgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotICAgICAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0gICAgICogdGhvc2Ugb2YgYW5vdGhlci4KLSAgICAgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0gICAgICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZU5TX1VSSQotICAgICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV1NETFBhY2thZ2UgaW5pdCgpCi0gICAgewotICAgICAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoV1NETFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotICAgICAgICBXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXU0RMUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXU0RMUGFja2FnZUltcGwoKSk7Ci0KLSAgICAgICAgaXNJbml0ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotICAgICAgICBYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLSAgICAgICAgdGhlV1NETFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICAgICAgdGhlV1NETFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLSAgICAgICAgdGhlV1NETFBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoZVdTRExQYWNrYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETEVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdzZGxFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExFbGVtZW50X0RvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgd3NkbEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMRWxlbWVudF9FbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgd3NkbEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFBvcnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZUVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9RTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBvcnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBvcnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfUmVzb3VyY2VVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwb3J0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRUeXBlX0VPcGVyYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldE9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9TdHlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgb3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1VuZGVmaW5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9SZXNvdXJjZVVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBvcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRPcGVyYXRpb25fRU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FRmF1bHRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgb3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbWVzc2FnZUVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1FOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgbWVzc2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VfVW5kZWZpbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgbWVzc2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUHJveHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBtZXNzYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlX0VQYXJ0cygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFBhcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhcnRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFydF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFBhcnRfRWxlbWVudE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFydF9UeXBlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBhcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnRfRU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBwYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEJpbmRpbmdfUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19VbmRlZmluZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGJpbmRpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1Jlc291cmNlVVJJKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRVBvcnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ09wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ09wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdGYXVsdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VfUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZV9VbmRlZmluZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZV9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1Jlc291cmNlVVJJKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgc2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VfRVBvcnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gcG9ydEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydF9FQmluZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudF9SZXF1aXJlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX0xvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldERlZmluaXRpb25fUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9FbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VNZXNzYWdlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FU2VydmljZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FTmFtZXNwYWNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FVHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FSW1wb3J0cygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEltcG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wb3J0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEltcG9ydF9OYW1lc3BhY2VVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbXBvcnRfTG9jYXRpb25VUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRURlZmluaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRVNjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGltcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2libGVFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBleHRlbnNpYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlucHV0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0T3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmF1bHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRCaW5kaW5nSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdJbnB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nSW5wdXRfTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGJpbmRpbmdJbnB1dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdJbnB1dF9FSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBiaW5kaW5nSW5wdXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEJpbmRpbmdPdXRwdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdPdXRwdXRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ091dHB1dF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ091dHB1dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdPdXRwdXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEJpbmRpbmdGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZ0ZhdWx0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEJpbmRpbmdGYXVsdF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ0ZhdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0TmFtZXNwYWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZXNwYWNlX1VSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG5hbWVzcGFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVzcGFjZV9QcmVmaXgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBuYW1lc3BhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElQb3J0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaVBvcnRUeXBlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaU9wZXJhdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUlucHV0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaU91dHB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUZhdWx0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlNZXNzYWdlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVBhcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlQYXJ0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVNlcnZpY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlTZXJ2aWNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlQb3J0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmdPcGVyYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmdJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUJpbmRpbmdJbnB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpQmluZGluZ091dHB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElCaW5kaW5nRmF1bHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nRmF1bHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElEZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpRGVmaW5pdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElJbXBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlJbXBvcnRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUxpc3RFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJTWFwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpTWFwRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVVSTCgpCi0gICAgewotICAgICAgICByZXR1cm4gaXVybEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElFeHRlbnNpb25SZWdpc3RyeSgpCi0gICAgewotICAgICAgICByZXR1cm4gaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGVzRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUl0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpSXRlcmF0b3JFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJVHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlUeXBlc0VDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudF9DaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VSZWZlcmVuY2VfTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgbWVzc2FnZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0UU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0T3BlcmF0aW9uVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uVHlwZUVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldERPTUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbUVsZW1lbnRFRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXRXU0RMRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3c2RsRXhjZXB0aW9uRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0RE9NRG9jdW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbURvY3VtZW50RURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBXU0RMRmFjdG9yeSBnZXRXU0RMRmFjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gKFdTRExGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgewotICAgICAgICBpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0gICAgICAgIGlzQ3JlYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0gICAgICAgIHdzZGxFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbEVsZW1lbnRFQ2xhc3MsIFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsRWxlbWVudEVDbGFzcywgV1NETF9FTEVNRU5UX19FTEVNRU5UKTsKLQotICAgICAgICBwb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUX1RZUEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0VHlwZUVDbGFzcywgUE9SVF9UWVBFX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0VHlwZUVDbGFzcywgUE9SVF9UWVBFX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX0VPUEVSQVRJT05TKTsKLQotICAgICAgICBvcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1BFUkFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fU1RZTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fVU5ERUZJTkVEKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fUFJPWFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19FSU5QVVQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19FT1VUUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fRUZBVUxUUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uob3BlcmF0aW9uRUNsYXNzLCBPUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkcpOwotCi0gICAgICAgIG1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fUU5BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VFQ2xhc3MsIE1FU1NBR0VfX1VOREVGSU5FRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fUFJPWFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VFQ2xhc3MsIE1FU1NBR0VfX1JFU09VUkNFX1VSSSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fRVBBUlRTKTsKLQotICAgICAgICBwYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUlQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBhcnRFQ2xhc3MsIFBBUlRfX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBhcnRFQ2xhc3MsIFBBUlRfX0VMRU1FTlRfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocGFydEVDbGFzcywgUEFSVF9fVFlQRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShwYXJ0RUNsYXNzLCBQQVJUX19UWVBFX0RFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBhcnRFQ2xhc3MsIFBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBhcnRFQ2xhc3MsIFBBUlRfX0VNRVNTQUdFKTsKLQotICAgICAgICBiaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShiaW5kaW5nRUNsYXNzLCBCSU5ESU5HX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShiaW5kaW5nRUNsYXNzLCBCSU5ESU5HX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX0VQT1JUX1RZUEUpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlMpOwotCi0gICAgICAgIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQklORElOR19PUEVSQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIEJJTkRJTkdfT1BFUkFUSU9OX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ09wZXJhdGlvbkVDbGFzcywgQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTKTsKLQotICAgICAgICBzZXJ2aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRUNsYXNzLCBTRVJWSUNFX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRUNsYXNzLCBTRVJWSUNFX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX0VQT1JUUyk7Ci0KLSAgICAgICAgcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0RUNsYXNzLCBQT1JUX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShwb3J0RUNsYXNzLCBQT1JUX19FQklORElORyk7Ci0KLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhURU5TSUJJTElUWV9FTEVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFKTsKLQotICAgICAgICBkZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0xPQ0FUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19RTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRU5DT0RJTkcpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VJTVBPUlRTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19FVFlQRVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VNRVNTQUdFUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVBPUlRfVFlQRVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VCSU5ESU5HUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVNFUlZJQ0VTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19FTkFNRVNQQUNFUyk7Ci0KLSAgICAgICAgaW1wb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElNUE9SVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoaW1wb3J0RUNsYXNzLCBJTVBPUlRfX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGltcG9ydEVDbGFzcywgSU1QT1JUX19MT0NBVElPTl9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGltcG9ydEVDbGFzcywgSU1QT1JUX19FREVGSU5JVElPTik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoaW1wb3J0RUNsYXNzLCBJTVBPUlRfX0VTQ0hFTUEpOwotCi0gICAgICAgIGV4dGVuc2libGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYVEVOU0lCTEVfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMpOwotCi0gICAgICAgIGlucHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElOUFVUKTsKLQotICAgICAgICBvdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUUFVUKTsKLQotICAgICAgICBmYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGQVVMVCk7Ci0KLSAgICAgICAgYmluZGluZ0lucHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkdfSU5QVVQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdJbnB1dEVDbGFzcywgQklORElOR19JTlBVVF9fTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ0lucHV0RUNsYXNzLCBCSU5ESU5HX0lOUFVUX19FSU5QVVQpOwotCi0gICAgICAgIGJpbmRpbmdPdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQklORElOR19PVVRQVVQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIEJJTkRJTkdfT1VUUFVUX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3V0cHV0RUNsYXNzLCBCSU5ESU5HX09VVFBVVF9fRU9VVFBVVCk7Ci0KLSAgICAgICAgYmluZGluZ0ZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkdfRkFVTFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdGYXVsdEVDbGFzcywgQklORElOR19GQVVMVF9fTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ0ZhdWx0RUNsYXNzLCBCSU5ESU5HX0ZBVUxUX19FRkFVTFQpOwotCi0gICAgICAgIG5hbWVzcGFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG5hbWVzcGFjZUVDbGFzcywgTkFNRVNQQUNFX19VUkkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG5hbWVzcGFjZUVDbGFzcywgTkFNRVNQQUNFX19QUkVGSVgpOwotCi0gICAgICAgIGlQb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJUE9SVF9UWVBFKTsKLQotICAgICAgICBpT3BlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElPUEVSQVRJT04pOwotCi0gICAgICAgIGlJbnB1dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSU5QVVQpOwotCi0gICAgICAgIGlPdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU9VVFBVVCk7Ci0KLSAgICAgICAgaUZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElGQVVMVCk7Ci0KLSAgICAgICAgaU1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1FU1NBR0UpOwotCi0gICAgICAgIGlQYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElQQVJUKTsKLQotICAgICAgICBpU2VydmljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJU0VSVklDRSk7Ci0KLSAgICAgICAgaVBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVBPUlQpOwotCi0gICAgICAgIGlCaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKElCSU5ESU5HKTsKLQotICAgICAgICBpQmluZGluZ09wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQklORElOR19PUEVSQVRJT04pOwotCi0gICAgICAgIGlCaW5kaW5nSW5wdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUJJTkRJTkdfSU5QVVQpOwotCi0gICAgICAgIGlCaW5kaW5nT3V0cHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElCSU5ESU5HX09VVFBVVCk7Ci0KLSAgICAgICAgaUJpbmRpbmdGYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQklORElOR19GQVVMVCk7Ci0KLSAgICAgICAgaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElFWFRFTlNJQklMSVRZX0VMRU1FTlQpOwotCi0gICAgICAgIGlEZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElERUZJTklUSU9OKTsKLQotICAgICAgICBpSW1wb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElJTVBPUlQpOwotCi0gICAgICAgIGlMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElMSVNUKTsKLQotICAgICAgICBpTWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNQVApOwotCi0gICAgICAgIGl1cmxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVVSTCk7Ci0KLSAgICAgICAgaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKElFWFRFTlNJT05fUkVHSVNUUlkpOwotCi0gICAgICAgIHR5cGVzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEVTKTsKLQotICAgICAgICBpSXRlcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUlURVJBVE9SKTsKLQotICAgICAgICBpVHlwZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVRZUEVTKTsKLQotICAgICAgICB1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOKTsKLQotICAgICAgICB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUEpOwotCi0gICAgICAgIG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9SRUZFUkVOQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MsIE1FU1NBR0VfUkVGRVJFTkNFX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlUmVmZXJlbmNlRUNsYXNzLCBNRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0UpOwotCi0gICAgICAgIC8vIENyZWF0ZSBkYXRhIHR5cGVzCi0gICAgICAgIHFOYW1lRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFFOQU1FKTsKLSAgICAgICAgb3BlcmF0aW9uVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShPUEVSQVRJT05fVFlQRSk7Ci0gICAgICAgIGRvbUVsZW1lbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9NX0VMRU1FTlQpOwotICAgICAgICB3c2RsRXhjZXB0aW9uRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFdTRExfRVhDRVBUSU9OKTsKLSAgICAgICAgZG9tRG9jdW1lbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9NX0RPQ1VNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLSAgICAgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0gICAgICAgIHNldE5hbWUoZU5BTUUpOwotICAgICAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLSAgICAgICAgc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotICAgICAgICBYU0RQYWNrYWdlSW1wbCB0aGVYU0RQYWNrYWdlID0gKFhTRFBhY2thZ2VJbXBsKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYU0RQYWNrYWdlLmVOU19VUkkpOwotCi0gICAgICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLSAgICAgICAgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMRWxlbWVudCgpKTsKLSAgICAgICAgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJUG9ydFR5cGUoKSk7Ci0gICAgICAgIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBvcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJT3BlcmF0aW9uKCkpOwotICAgICAgICBtZXNzYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gICAgICAgIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTWVzc2FnZSgpKTsKLSAgICAgICAgcGFydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBwYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SVBhcnQoKSk7Ci0gICAgICAgIGJpbmRpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nKCkpOwotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKSk7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpKTsKLSAgICAgICAgc2VydmljZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2libGVFbGVtZW50KCkpOwotICAgICAgICBzZXJ2aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SVNlcnZpY2UoKSk7Ci0gICAgICAgIHBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElQb3J0KCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICAgICAgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2libGVFbGVtZW50KCkpOwotICAgICAgICBkZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SURlZmluaXRpb24oKSk7Ci0gICAgICAgIGltcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBpbXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSW1wb3J0KCkpOwotICAgICAgICBleHRlbnNpYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBpbnB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1lc3NhZ2VSZWZlcmVuY2UoKSk7Ci0gICAgICAgIGlucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gICAgICAgIGlucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUlucHV0KCkpOwotICAgICAgICBvdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotICAgICAgICBvdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMRWxlbWVudCgpKTsKLSAgICAgICAgb3V0cHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU91dHB1dCgpKTsKLSAgICAgICAgZmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotICAgICAgICBmYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBmYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElGYXVsdCgpKTsKLSAgICAgICAgYmluZGluZ0lucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKSk7Ci0gICAgICAgIGJpbmRpbmdJbnB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nSW5wdXQoKSk7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ091dHB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nT3V0cHV0KCkpOwotICAgICAgICBiaW5kaW5nRmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ0ZhdWx0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUJpbmRpbmdGYXVsdCgpKTsKLSAgICAgICAgdHlwZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgdHlwZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJVHlwZXMoKSk7Ci0gICAgICAgIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgICAgICB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgICAgICBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLSAgICAgICAgaW5pdEVDbGFzcyh3c2RsRWxlbWVudEVDbGFzcywgV1NETEVsZW1lbnQuY2xhc3MsICJXU0RMRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMRWxlbWVudF9Eb2N1bWVudGF0aW9uRWxlbWVudCgpLCB0aGlzLmdldERPTUVsZW1lbnQoKSwgImRvY3VtZW50YXRpb25FbGVtZW50IiwgbnVsbCwgMCwgMSwgV1NETEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTRExFbGVtZW50X0VsZW1lbnQoKSwgdGhpcy5nZXRET01FbGVtZW50KCksICJlbGVtZW50IiwgbnVsbCwgMCwgMSwgV1NETEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbih3c2RsRWxlbWVudEVDbGFzcywgdGhpcy5nZXREZWZpbml0aW9uKCksICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIik7Ci0KLSAgICAgICAgRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24od3NkbEVsZW1lbnRFQ2xhc3MsIG51bGwsICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0RGVmaW5pdGlvbigpLCAiZGVmaW5pdGlvbiIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MocG9ydFR5cGVFQ2xhc3MsIFBvcnRUeXBlLmNsYXNzLCAiUG9ydFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1FOYW1lKCksIHRoaXMuZ2V0UU5hbWUoKSwgInFOYW1lIiwgbnVsbCwgMCwgMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIFBvcnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0VHlwZV9Qcm94eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb3h5IiwgbnVsbCwgMCwgMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1Jlc291cmNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZVVSSSIsIG51bGwsIDAsIDEsIFBvcnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQb3J0VHlwZV9FT3BlcmF0aW9ucygpLCB0aGlzLmdldE9wZXJhdGlvbigpLCBudWxsLCAiZU9wZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhvcGVyYXRpb25FQ2xhc3MsIE9wZXJhdGlvbi5jbGFzcywgIk9wZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0T3BlcmF0aW9uX1N0eWxlKCksIHRoaXMuZ2V0T3BlcmF0aW9uVHlwZSgpLCAic3R5bGUiLCBudWxsLCAwLCAxLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE9wZXJhdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRPcGVyYXRpb25fVW5kZWZpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5kZWZpbmVkIiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRPcGVyYXRpb25fUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0T3BlcmF0aW9uX1Jlc291cmNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZVVSSSIsIG51bGwsIDAsIDEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0T3BlcmF0aW9uX0VJbnB1dCgpLCB0aGlzLmdldElucHV0KCksIG51bGwsICJlSW5wdXQiLCBudWxsLCAwLCAxLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldE9wZXJhdGlvbl9FT3V0cHV0KCksIHRoaXMuZ2V0T3V0cHV0KCksIG51bGwsICJlT3V0cHV0IiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRPcGVyYXRpb25fRUZhdWx0cygpLCB0aGlzLmdldEZhdWx0KCksIG51bGwsICJlRmF1bHRzIiwgbnVsbCwgMCwgLTEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpLCB0aGlzLmdldFBhcnQoKSwgbnVsbCwgImVQYXJhbWV0ZXJPcmRlcmluZyIsIG51bGwsIDAsIC0xLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhtZXNzYWdlRUNsYXNzLCBNZXNzYWdlLmNsYXNzLCAiTWVzc2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9RTmFtZSgpLCB0aGlzLmdldFFOYW1lKCksICJxTmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VfVW5kZWZpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5kZWZpbmVkIiwgbnVsbCwgMCwgMSwgTWVzc2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9Qcm94eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb3h5IiwgbnVsbCwgMCwgMSwgTWVzc2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VVUkkiLCBudWxsLCAwLCAxLCBNZXNzYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlX0VQYXJ0cygpLCB0aGlzLmdldFBhcnQoKSwgbnVsbCwgImVQYXJ0cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MocGFydEVDbGFzcywgUGFydC5jbGFzcywgIlBhcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBhcnRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBhcnRfRWxlbWVudE5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAiZWxlbWVudE5hbWUiLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQYXJ0X1R5cGVOYW1lKCksIHRoaXMuZ2V0UU5hbWUoKSwgInR5cGVOYW1lIiwgbnVsbCwgMCwgMSwgUGFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0UGFydF9UeXBlRGVmaW5pdGlvbigpLCB0aGVYU0RQYWNrYWdlLmdldFhTRFR5cGVEZWZpbml0aW9uKCksIG51bGwsICJ0eXBlRGVmaW5pdGlvbiIsIG51bGwsIDAsIDEsIFBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCksIHRoZVhTRFBhY2thZ2UuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCksIG51bGwsICJlbGVtZW50RGVjbGFyYXRpb24iLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQYXJ0X0VNZXNzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZSgpLCBudWxsLCAiZU1lc3NhZ2UiLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoYmluZGluZ0VDbGFzcywgQmluZGluZy5jbGFzcywgIkJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIEJpbmRpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIEJpbmRpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUmVzb3VyY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVVJJIiwgbnVsbCwgMCwgMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ19FUG9ydFR5cGUoKSwgdGhpcy5nZXRQb3J0VHlwZSgpLCBudWxsLCAiZVBvcnRUeXBlIiwgbnVsbCwgMSwgMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKSwgdGhpcy5nZXRCaW5kaW5nT3BlcmF0aW9uKCksIG51bGwsICJlQmluZGluZ09wZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIEJpbmRpbmdPcGVyYXRpb24uY2xhc3MsICJCaW5kaW5nT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VPcGVyYXRpb24oKSwgdGhpcy5nZXRPcGVyYXRpb24oKSwgbnVsbCwgImVPcGVyYXRpb24iLCBudWxsLCAxLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nSW5wdXQoKSwgdGhpcy5nZXRCaW5kaW5nSW5wdXQoKSwgbnVsbCwgImVCaW5kaW5nSW5wdXQiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCksIHRoaXMuZ2V0QmluZGluZ091dHB1dCgpLCBudWxsLCAiZUJpbmRpbmdPdXRwdXQiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nRmF1bHRzKCksIHRoaXMuZ2V0QmluZGluZ0ZhdWx0KCksIG51bGwsICJlQmluZGluZ0ZhdWx0cyIsIG51bGwsIDAsIC0xLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3Moc2VydmljZUVDbGFzcywgU2VydmljZS5jbGFzcywgIlNlcnZpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIFNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIFNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUmVzb3VyY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVVJJIiwgbnVsbCwgMCwgMSwgU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZV9FUG9ydHMoKSwgdGhpcy5nZXRQb3J0KCksIG51bGwsICJlUG9ydHMiLCBudWxsLCAwLCAtMSwgU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHBvcnRFQ2xhc3MsIFBvcnQuY2xhc3MsICJQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQb3J0X0VCaW5kaW5nKCksIHRoaXMuZ2V0QmluZGluZygpLCBudWxsLCAiZUJpbmRpbmciLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIEV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEV4dGVuc2liaWxpdHlFbGVtZW50X1JlcXVpcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKSwgdGhpcy5nZXRRTmFtZSgpLCAiZWxlbWVudFR5cGUiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZGVmaW5pdGlvbkVDbGFzcywgRGVmaW5pdGlvbi5jbGFzcywgIkRlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXREZWZpbml0aW9uX0xvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvbiIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldERlZmluaXRpb25fUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXREZWZpbml0aW9uX0VuY29kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlbmNvZGluZyIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRUltcG9ydHMoKSwgdGhpcy5nZXRJbXBvcnQoKSwgbnVsbCwgImVJbXBvcnRzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVR5cGVzKCksIHRoaXMuZ2V0VHlwZXMoKSwgbnVsbCwgImVUeXBlcyIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRU1lc3NhZ2VzKCksIHRoaXMuZ2V0TWVzc2FnZSgpLCBudWxsLCAiZU1lc3NhZ2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVBvcnRUeXBlcygpLCB0aGlzLmdldFBvcnRUeXBlKCksIG51bGwsICJlUG9ydFR5cGVzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRUJpbmRpbmdzKCksIHRoaXMuZ2V0QmluZGluZygpLCBudWxsLCAiZUJpbmRpbmdzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVNlcnZpY2VzKCksIHRoaXMuZ2V0U2VydmljZSgpLCBudWxsLCAiZVNlcnZpY2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKSwgdGhpcy5nZXROYW1lc3BhY2UoKSwgbnVsbCwgImVOYW1lc3BhY2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihkZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldERPTURvY3VtZW50KCksICJnZXREb2N1bWVudCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihkZWZpbml0aW9uRUNsYXNzLCBudWxsLCAic2V0RG9jdW1lbnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRET01Eb2N1bWVudCgpLCAiZG9jdW1lbnQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGltcG9ydEVDbGFzcywgSW1wb3J0LmNsYXNzLCAiSW1wb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRJbXBvcnRfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCBJbXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEltcG9ydF9Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCBJbXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEltcG9ydF9FRGVmaW5pdGlvbigpLCB0aGlzLmdldERlZmluaXRpb24oKSwgbnVsbCwgImVEZWZpbml0aW9uIiwgbnVsbCwgMCwgMSwgSW1wb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRJbXBvcnRfRVNjaGVtYSgpLCB0aGVYU0RQYWNrYWdlLmdldFhTRFNjaGVtYSgpLCBudWxsLCAiZVNjaGVtYSIsIG51bGwsIDAsIDEsIEltcG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGltcG9ydEVDbGFzcywgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgImdldFNjaGVtYSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpbXBvcnRFQ2xhc3MsIG51bGwsICJzZXRTY2hlbWEiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgInNjaGVtYSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIEV4dGVuc2libGVFbGVtZW50LmNsYXNzLCAiRXh0ZW5zaWJsZUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0RXh0ZW5zaWJsZUVsZW1lbnRfRUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCksIG51bGwsICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEV4dGVuc2libGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihleHRlbnNpYmxlRWxlbWVudEVDbGFzcywgbnVsbCwgImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUV4dGVuc2liaWxpdHlFbGVtZW50KCksICJleHRFbGVtZW50Iik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpbnB1dEVDbGFzcywgSW5wdXQuY2xhc3MsICJJbnB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKG91dHB1dEVDbGFzcywgT3V0cHV0LmNsYXNzLCAiT3V0cHV0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZmF1bHRFQ2xhc3MsIEZhdWx0LmNsYXNzLCAiRmF1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhiaW5kaW5nSW5wdXRFQ2xhc3MsIEJpbmRpbmdJbnB1dC5jbGFzcywgIkJpbmRpbmdJbnB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QmluZGluZ0lucHV0X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nSW5wdXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEJpbmRpbmdJbnB1dF9FSW5wdXQoKSwgdGhpcy5nZXRJbnB1dCgpLCBudWxsLCAiZUlucHV0IiwgbnVsbCwgMSwgMSwgQmluZGluZ0lucHV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oYmluZGluZ0lucHV0RUNsYXNzLCB0aGlzLmdldElJbnB1dCgpLCAiZ2V0SW5wdXQiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oYmluZGluZ0lucHV0RUNsYXNzLCBudWxsLCAic2V0SW5wdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJSW5wdXQoKSwgImlucHV0Iik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhiaW5kaW5nT3V0cHV0RUNsYXNzLCBCaW5kaW5nT3V0cHV0LmNsYXNzLCAiQmluZGluZ091dHB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QmluZGluZ091dHB1dF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQmluZGluZ091dHB1dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ091dHB1dF9FT3V0cHV0KCksIHRoaXMuZ2V0T3V0cHV0KCksIG51bGwsICJlT3V0cHV0IiwgbnVsbCwgMSwgMSwgQmluZGluZ091dHB1dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIHRoaXMuZ2V0SU91dHB1dCgpLCAiZ2V0T3V0cHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIG51bGwsICJzZXRPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3V0cHV0KCksICJvdXRwdXQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGJpbmRpbmdGYXVsdEVDbGFzcywgQmluZGluZ0ZhdWx0LmNsYXNzLCAiQmluZGluZ0ZhdWx0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nRmF1bHRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEJpbmRpbmdGYXVsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpLCB0aGlzLmdldEZhdWx0KCksIG51bGwsICJlRmF1bHQiLCBudWxsLCAxLCAxLCBCaW5kaW5nRmF1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihiaW5kaW5nRmF1bHRFQ2xhc3MsIHRoaXMuZ2V0SUZhdWx0KCksICJnZXRGYXVsdCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihiaW5kaW5nRmF1bHRFQ2xhc3MsIG51bGwsICJzZXRGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElGYXVsdCgpLCAiZmF1bHQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKG5hbWVzcGFjZUVDbGFzcywgTmFtZXNwYWNlLmNsYXNzLCAiTmFtZXNwYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXROYW1lc3BhY2VfVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJVUkkiLCBudWxsLCAwLCAxLCBOYW1lc3BhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE5hbWVzcGFjZV9QcmVmaXgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByZWZpeCIsIG51bGwsIDAsIDEsIE5hbWVzcGFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlQb3J0VHlwZUVDbGFzcywgamF2YXgud3NkbC5Qb3J0VHlwZS5jbGFzcywgIklQb3J0VHlwZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpUG9ydFR5cGVFQ2xhc3MsIG51bGwsICJhZGRPcGVyYXRpb24iKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3BlcmF0aW9uKCksICJvcGVyYXRpb24iKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVBvcnRUeXBlRUNsYXNzLCB0aGlzLmdldElPcGVyYXRpb24oKSwgImdldE9wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5wdXROYW1lIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvdXRwdXROYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpUG9ydFR5cGVFQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldE9wZXJhdGlvbnMiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlPcGVyYXRpb25FQ2xhc3MsIGphdmF4LndzZGwuT3BlcmF0aW9uLmNsYXNzLCAiSU9wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpT3BlcmF0aW9uRUNsYXNzLCBudWxsLCAiYWRkRmF1bHQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJRmF1bHQoKSwgImZhdWx0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUZhdWx0KCksICJnZXRGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaU9wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRGYXVsdHMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldFBhcmFtZXRlck9yZGVyaW5nIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElMaXN0KCksICJwYXJhbWV0ZXJPcmRlciIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaU9wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJSW5wdXQoKSwgImdldElucHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRJbnB1dCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElJbnB1dCgpLCAiaW5wdXQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SU91dHB1dCgpLCAiZ2V0T3V0cHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3V0cHV0KCksICJvdXRwdXQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlJbnB1dEVDbGFzcywgamF2YXgud3NkbC5JbnB1dC5jbGFzcywgIklJbnB1dCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUlucHV0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlJbnB1dEVDbGFzcywgbnVsbCwgInNldE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU91dHB1dEVDbGFzcywgamF2YXgud3NkbC5PdXRwdXQuY2xhc3MsICJJT3V0cHV0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpT3V0cHV0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPdXRwdXRFQ2xhc3MsIG51bGwsICJzZXRNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SU1lc3NhZ2UoKSwgIm1lc3NhZ2UiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlGYXVsdEVDbGFzcywgamF2YXgud3NkbC5GYXVsdC5jbGFzcywgIklGYXVsdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUZhdWx0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlGYXVsdEVDbGFzcywgbnVsbCwgInNldE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU1lc3NhZ2VFQ2xhc3MsIGphdmF4LndzZGwuTWVzc2FnZS5jbGFzcywgIklNZXNzYWdlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlNZXNzYWdlRUNsYXNzLCBudWxsLCAiYWRkUGFydCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQYXJ0KCksICJwYXJ0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlNZXNzYWdlRUNsYXNzLCB0aGlzLmdldElQYXJ0KCksICJnZXRQYXJ0Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpTWVzc2FnZUVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRQYXJ0cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpTWVzc2FnZUVDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0T3JkZXJlZFBhcnRzIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUxpc3QoKSwgInBhcnRPcmRlciIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaVBhcnRFQ2xhc3MsIGphdmF4LndzZGwuUGFydC5jbGFzcywgIklQYXJ0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlQYXJ0RUNsYXNzLCBudWxsLCAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRRTmFtZSgpLCAidmFsdWUiKTsKLSAgICAgICAgYWRkRUV4Y2VwdGlvbihvcCwgdGhpcy5nZXRXU0RMRXhjZXB0aW9uKCkpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVBhcnRFQ2xhc3MsIHRoaXMuZ2V0SUl0ZXJhdG9yKCksICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpUGFydEVDbGFzcywgdGhpcy5nZXRRTmFtZSgpLCAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlTZXJ2aWNlRUNsYXNzLCBqYXZheC53c2RsLlNlcnZpY2UuY2xhc3MsICJJU2VydmljZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpU2VydmljZUVDbGFzcywgbnVsbCwgImFkZFBvcnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJUG9ydCgpLCAicG9ydCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVNlcnZpY2VFQ2xhc3MsIHRoaXMuZ2V0SU1hcCgpLCAiZ2V0UG9ydHMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVNlcnZpY2VFQ2xhc3MsIHRoaXMuZ2V0SVBvcnQoKSwgImdldFBvcnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlQb3J0RUNsYXNzLCBqYXZheC53c2RsLlBvcnQuY2xhc3MsICJJUG9ydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVBvcnRFQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmcoKSwgImdldEJpbmRpbmciKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVBvcnRFQ2xhc3MsIG51bGwsICJzZXRCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUJpbmRpbmcoKSwgImJpbmRpbmciKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nRUNsYXNzLCBqYXZheC53c2RsLkJpbmRpbmcuY2xhc3MsICJJQmluZGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgbnVsbCwgImFkZEJpbmRpbmdPcGVyYXRpb24iKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpLCAiYmluZGluZ09wZXJhdGlvbiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgdGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpLCAiZ2V0QmluZGluZ09wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5wdXROYW1lIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvdXRwdXROYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0QmluZGluZ09wZXJhdGlvbnMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nRUNsYXNzLCB0aGlzLmdldElQb3J0VHlwZSgpLCAiZ2V0UG9ydFR5cGUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaUJpbmRpbmdFQ2xhc3MsIG51bGwsICJzZXRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQb3J0VHlwZSgpLCAicG9ydFR5cGUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24uY2xhc3MsICJJQmluZGluZ09wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgImFkZEJpbmRpbmdGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElCaW5kaW5nRmF1bHQoKSwgImJpbmRpbmdGYXVsdCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ0ZhdWx0KCksICJnZXRCaW5kaW5nRmF1bHQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldEJpbmRpbmdGYXVsdHMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCB0aGlzLmdldElPcGVyYXRpb24oKSwgImdldE9wZXJhdGlvbiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgInNldE9wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElPcGVyYXRpb24oKSwgIm9wZXJhdGlvbiIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiZ2V0QmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBudWxsLCAic2V0QmluZGluZ0lucHV0Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiYmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiZ2V0QmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgInNldEJpbmRpbmdPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiYmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUJpbmRpbmdJbnB1dEVDbGFzcywgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQuY2xhc3MsICJJQmluZGluZ0lucHV0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpQmluZGluZ091dHB1dEVDbGFzcywgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0LmNsYXNzLCAiSUJpbmRpbmdPdXRwdXQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nRmF1bHRFQ2xhc3MsIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0LmNsYXNzLCAiSUJpbmRpbmdGYXVsdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlEZWZpbml0aW9uRUNsYXNzLCBqYXZheC53c2RsLkRlZmluaXRpb24uY2xhc3MsICJJRGVmaW5pdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZEJpbmRpbmciKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZygpLCAiYmluZGluZyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZEltcG9ydCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElJbXBvcnQoKSwgImltcG9ydERlZiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZE5hbWVzcGFjZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJlZml4Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJhZGRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQb3J0VHlwZSgpLCAicG9ydFR5cGUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJhZGRTZXJ2aWNlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SVNlcnZpY2UoKSwgInNlcnZpY2UiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nRmF1bHQoKSwgImNyZWF0ZUJpbmRpbmdGYXVsdCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiY3JlYXRlQmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiY3JlYXRlQmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdPcGVyYXRpb24oKSwgImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nKCksICJjcmVhdGVCaW5kaW5nIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJRmF1bHQoKSwgImNyZWF0ZUZhdWx0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJSW1wb3J0KCksICJjcmVhdGVJbXBvcnQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElJbnB1dCgpLCAiY3JlYXRlSW5wdXQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJjcmVhdGVNZXNzYWdlIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJT3BlcmF0aW9uKCksICJjcmVhdGVPcGVyYXRpb24iKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElPdXRwdXQoKSwgImNyZWF0ZU91dHB1dCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBhcnQoKSwgImNyZWF0ZVBhcnQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElQb3J0KCksICJjcmVhdGVQb3J0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJUG9ydFR5cGUoKSwgImNyZWF0ZVBvcnRUeXBlIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAiY3JlYXRlU2VydmljZSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZygpLCAiZ2V0QmluZGluZyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRCaW5kaW5ncyIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SU1hcCgpLCAiZ2V0SW1wb3J0cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0SW1wb3J0cyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldE1lc3NhZ2VzIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0TmFtZXNwYWNlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwcmVmaXgiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldE5hbWVzcGFjZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBvcnRUeXBlKCksICJnZXRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRQb3J0VHlwZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRQcmVmaXgiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAiZ2V0U2VydmljZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRTZXJ2aWNlcyIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCksICJnZXRFeHRlbnNpb25SZWdpc3RyeSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgInNldEV4dGVuc2lvblJlZ2lzdHJ5Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCksICJleHRlbnNpb25SZWdpc3RyeSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXREb2N1bWVudEJhc2VVUkkiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJzZXREb2N1bWVudEJhc2VVUkkiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRvY3VtZW50QmFzZSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVR5cGVzKCksICJjcmVhdGVUeXBlcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAicmVtb3ZlU2VydmljZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nKCksICJyZW1vdmVCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBvcnRUeXBlKCksICJyZW1vdmVQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJyZW1vdmVNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElUeXBlcygpLCAiZ2V0VHlwZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJzZXRUeXBlcyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElUeXBlcygpLCAidHlwZXMiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlJbXBvcnRFQ2xhc3MsIGphdmF4LndzZGwuSW1wb3J0LmNsYXNzLCAiSUltcG9ydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUxpc3RFQ2xhc3MsIExpc3QuY2xhc3MsICJJTGlzdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU1hcEVDbGFzcywgTWFwLmNsYXNzLCAiSU1hcCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaXVybEVDbGFzcywgVVJMLmNsYXNzLCAiSVVSTCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzLCBFeHRlbnNpb25SZWdpc3RyeS5jbGFzcywgIklFeHRlbnNpb25SZWdpc3RyeSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3ModHlwZXNFQ2xhc3MsIFR5cGVzLmNsYXNzLCAiVHlwZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbih0eXBlc0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0U2NoZW1hcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbih0eXBlc0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0U2NoZW1hcyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpSXRlcmF0b3JFQ2xhc3MsIEl0ZXJhdG9yLmNsYXNzLCAiSUl0ZXJhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpVHlwZXNFQ2xhc3MsIGphdmF4LndzZGwuVHlwZXMuY2xhc3MsICJJVHlwZXMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRfQ2hpbGRyZW4oKSwgdGhpcy5nZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSwgbnVsbCwgImNoaWxkcmVuIiwgbnVsbCwgMCwgLTEsIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKSwgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgbnVsbCwgInNjaGVtYSIsIG51bGwsIDAsIDEsIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MobWVzc2FnZVJlZmVyZW5jZUVDbGFzcywgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIk1lc3NhZ2VSZWZlcmVuY2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZVJlZmVyZW5jZV9FTWVzc2FnZSgpLCB0aGlzLmdldE1lc3NhZ2UoKSwgbnVsbCwgImVNZXNzYWdlIiwgbnVsbCwgMSwgMSwgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLSAgICAgICAgaW5pdEVEYXRhVHlwZShxTmFtZUVEYXRhVHlwZSwgUU5hbWUuY2xhc3MsICJRTmFtZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUob3BlcmF0aW9uVHlwZUVEYXRhVHlwZSwgT3BlcmF0aW9uVHlwZS5jbGFzcywgIk9wZXJhdGlvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RURhdGFUeXBlKGRvbUVsZW1lbnRFRGF0YVR5cGUsIEVsZW1lbnQuY2xhc3MsICJET01FbGVtZW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVEYXRhVHlwZSh3c2RsRXhjZXB0aW9uRURhdGFUeXBlLCBXU0RMRXhjZXB0aW9uLmNsYXNzLCAiV1NETEV4Y2VwdGlvbiIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUoZG9tRG9jdW1lbnRFRGF0YVR5cGUsIERvY3VtZW50LmNsYXNzLCAiRE9NRG9jdW1lbnQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIC8vIENyZWF0ZSByZXNvdXJjZQotICAgICAgICBjcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLSAgICB9Ci0KLX0gLy9XU0RMUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4NDA5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFNjaGVtYSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTY2hlbWEoWFNEU2NoZW1hIG5ld1NjaGVtYSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIFhTRFNjaGVtYSBvbGRTY2hlbWEgPSBzY2hlbWE7Ci0gICAgc2NoZW1hID0gbmV3U2NoZW1hOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSwgb2xkU2NoZW1hLCBuZXdTY2hlbWEpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBuZXdTY2hlbWEpCi0gIHsKLSAgICBpZiAobmV3U2NoZW1hICE9IHNjaGVtYSkKLSAgICB7Ci0gICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNjaGVtYSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUEsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld1NjaGVtYSAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2NoZW1hKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRTY2hlbWEobmV3U2NoZW1hLCBtc2dzKTsKLSAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BLCBuZXdTY2hlbWEsIG5ld1NjaGVtYSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUE6Ci0gICAgICAgICAgcmV0dXJuIGJhc2ljU2V0U2NoZW1hKG51bGwsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICByZXR1cm4gZ2V0U2NoZW1hKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICBzZXRTY2hlbWEoKFhTRFNjaGVtYSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICBzZXRTY2hlbWEoKFhTRFNjaGVtYSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQToKLSAgICAgICAgcmV0dXJuIHNjaGVtYSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLldTRExFbGVtZW50SW1wbCNyZWNvbmNpbGUob3JnLnczYy5kb20uRWxlbWVudCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZShFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgZWxlbWVudCA9IGNoYW5nZWRFbGVtZW50OyAvLyBUaGlzIGxpbmUgbWF5IG5vdCBuZWVkZWQuICAgIAotICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgbmV3U2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoY2hhbmdlZEVsZW1lbnQpOwotICAgICAgc2V0U2NoZW1hKG5ld1NjaGVtYSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBjcmVhdGVTY2hlbWEoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJzY2hlbWEiKSAmJiBYU0RDb25zdGFudHMuaXNTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgeyAgICAgCi0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hKCk7IAotICAgICAgeHNkU2NoZW1hLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZXR1cm4geHNkU2NoZW1hOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgZWxzZSBpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQgPSBnZXRTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0KLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBpZiAobmV3RWxlbWVudCA9PSBudWxsICYmICFpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIGVsZW1lbnQgPSBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihuZXdFbGVtZW50KTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSxYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHKTsKLQotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgbmV3RWxlbWVudFR5cGUpCi0gIHsKLSAgICAvLyBTaG91bGQgbm90IGRvIGFueXRoaW5nLgotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotICB9Ci0gIAotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAJaWYgKHNjaGVtYSA9PSBudWxsKSAvLyBrYiBOb3RlOiBUaGlzIGNhc2UgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KLSAgCXsgICAgIAotICAJICAvLyBjcyAuLi4gd2h5IGRvIHdlIGRvIHRoaXMgaWYgaXRzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4/Ci0gIAkgIC8vIElzIHRoZXJlIGEgc2NlbmFyaW8gd2hlcmUgdGhpcyBpcyBhIHVzZWZ1bGwgZmFsbGJhY2s/Ci0gIAkgIC8vIFVuZGVyIHdoYXQgY29uZGl0aW9ucyBkb2VzIHRoaXMgY29kZSBnZXQgZXhlY3V0ZWQgKGkuZS4gd2h5IHdvdWxkIHNjaGVtYSA9PSBudWxsKT8KLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgICAgc2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCJ4c2QiKTsKLSAgICAgIHNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly90ZW1wdXJpLm9yZy8iKTsKLSAgICAgIGphdmEudXRpbC5NYXAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dCgiIiwgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0Ci0gICAgICAgIChzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKSxvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgICAgYWRvcHQoc2NoZW1hKTsKLSAgICAgIHNjaGVtYS51cGRhdGVFbGVtZW50KHRydWUpOwotICAgICAgcmV0dXJuIHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJYWRvcHQoc2NoZW1hKTsKLSAgICAgICAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgIGVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgfSAgICAgIAotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotICB9Ci0gCi0gIHByaXZhdGUgdm9pZCBhZG9wdChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLSAgICAKLSAgICBpZiAoeHNkU2NoZW1hLmdldERvY3VtZW50KCkgIT0gbnVsbCkKLSAgICAJeHNkU2NoZW1hLnNldERvY3VtZW50KG51bGwpOwotICAgIAotICAgIHhzZFNjaGVtYS5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0gIH0KLSAgCi0gIC8qCi0gIHByaXZhdGUgRWxlbWVudCBhZG9wdChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBlbGVtZW50OwotCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0gICAgCi0gICAgcmV0dXJuIChFbGVtZW50KWRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCx0cnVlKTsKLSAgfQotICAqLwotICAKLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotCSAgaWYgKGlzUmVjb25jaWxpbmcpCi0JCSAgcmV0dXJuOwotCSAgCi0JICAvLyBUT0RPLi4uIHJldmlzdCB0aGlzIGJsb2NrIG9mIGNvZGUKLQkgIC8vCi0JICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpKQotCSAgewotCQkgIC8vIFdlIGdvdCBhIG5ldyBzY2hlbWEgc28gcmUtcGFyZW50IGl0LgotCQkgIC8vIGNzLi4uIGFyZSB3ZSByZWFsbHkgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGhlcmU/ICB0aGlzIHNlZW1zIHN0cmFuZ2UKLQkJICBpZiAoc2NoZW1hICE9IG51bGwpCi0JCSAgewotCQkJICBpZiAoKHNjaGVtYS5nZXRFbGVtZW50KCkgPT0gbnVsbCAmJiBnZXRFbGVtZW50KCkgPT0gbnVsbCkgfHwKLQkJCQkJICAoc2NoZW1hLmdldEVsZW1lbnQoKSAhPSBnZXRFbGVtZW50KCkpKQotCQkJICB7CQotCQkJCSAgc2NoZW1hLnNldERvY3VtZW50KG51bGwpOwotCQkJCSAgc2NoZW1hLnNldEVsZW1lbnQobnVsbCk7Ci0JCQkJICBhZG9wdChzY2hlbWEpOwotCQkJCSAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQoKTsKLQkJCSAgfSAgCi0JCSAgfQotCSAgfSAgICAKLQkgIGVsc2UgaWYgKGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExFbGVtZW50X0VsZW1lbnQoKSkKLQkgIHsKLQkJICBzZXRTY2hlbWEoY3JlYXRlU2NoZW1hKGVsZW1lbnQpKTsgLy8gZWxlbWVudCBpcyBub3QgbnVsbAotCSAgfSAgICAKLSAgfQotfSAvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmIxODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGo7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0RMRmFjdG9yeUltcGwgZXh0ZW5kcyBXU0RMRmFjdG9yeQotewotICAKLSAgLy9wdWJsaWMgc3RhdGljIFdTRExGYWN0b3J5IG5ld0luc3RhbmNlKCkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgLy97Ci0gIC8vICByZXR1cm4gbmV3IFdTRExGYWN0b3J5SW1wbCgpOwotICAvL30KLSAgCi0gIHB1YmxpYyBXU0RMRmFjdG9yeUltcGwoKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyBEZWZpbml0aW9uIG5ld0RlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBuZXdQb3B1bGF0ZWRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFdTRExSZWFkZXIgbmV3V1NETFJlYWRlcigpCi0gIHsKLSAgICBXU0RMUmVhZGVyIHJlYWRlciA9IG5ldyBXU0RMUmVhZGVySW1wbCgpOwotICAgIHJlYWRlci5zZXRGYWN0b3J5SW1wbE5hbWUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIHJldHVybiByZWFkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMV3JpdGVyIG5ld1dTRExXcml0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMV3JpdGVySW1wbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExSZWFkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExSZWFkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzhkNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMUmVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGo7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMTG9jYXRvcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIFdTRExSZWFkZXJJbXBsIGltcGxlbWVudHMgV1NETFJlYWRlcgotewotICBwcml2YXRlIFN0cmluZyBmYWN0b3J5SW1wbE5hbWU7Ci0gIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnOwotICAKLSAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLSAgewotICAgIHJldHVybiBleHRSZWc7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IGV4dFJlZykKLSAgewotICAgIHRoaXMuZXh0UmVnID0gZXh0UmVnOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJbXBsTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZmFjdG9yeUltcGxOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5SW1wbE5hbWUoU3RyaW5nIGZhY3RvcnlJbXBsTmFtZSkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzLmZhY3RvcnlJbXBsTmFtZSA9IGZhY3RvcnlJbXBsTmFtZTsKLSAgfQotCi0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gIHsgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlYWQgdGhlIFdTREwgZG9jdW1lbnQgYWNjZXNzaWJsZSB2aWEgdGhlIHNwZWNpZmllZAotICAgKiBVUkkgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHdzZGxVUkkgYSBVUkkgKGNhbiBiZSBhIGZpbGVuYW1lIG9yIFVSTCkgcG9pbnRpbmcgdG8gYQotICAgKiBXU0RMIFhNTCBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gcmVhZFdTREwoU3RyaW5nIHdzZGxVUkkpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBVUkkgdXJpOyAgICAKLSAgICBpZiAoaGFzUHJvdG9jb2wod3NkbFVSSSkpCi0gICAgICAgdXJpID0gVVJJLmNyZWF0ZVVSSSh3c2RsVVJJKTsKLSAgICBlbHNlCi0gICAgICAgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkod3NkbFVSSSk7Ci0gIAotICAgIC8vIENyZWF0ZSBhIHJlc291cmNlIHNldCwgY3JlYXRlIGEgd3NkbCByZXNvdXJjZSwgYW5kIGxvYWQgdGhlIG1haW4gd3NkbCBmaWxlIGludG8gaXQuCi0gICAgCi0gIAlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsgIAkKLSAgCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCi0gIAlXU0RMUmVzb3VyY2VJbXBsIHdzZGxNYWluUmVzb3VyY2UgPSAoV1NETFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLndzZGwiKSk7Ci0gIAl3c2RsTWFpblJlc291cmNlLnNldFVSSSh1cmkpOwotICAJCi0gICAgdHJ5Ci0gICAgewotICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbSh1cmkpOwotICAgICAgd3NkbE1haW5SZXNvdXJjZS5sb2FkKGlucHV0U3RyZWFtLCByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpKTsKLSAgICAgIC8vd3NkbE1haW5SZXNvdXJjZS5sb2FkKHJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLklOVkFMSURfV1NETCwiV1NETCBVUkk6ICIrd3NkbFVSSSxlKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gUmV0dXJuIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgbWFpbiByZXNvdXJjZS4KLSAgICByZXR1cm4gd3NkbE1haW5SZXNvdXJjZS5nZXREZWZpbml0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaGFzUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgICAgCi0JCWlmICh1cmkgIT0gbnVsbCkKLQkJewotCQkgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKCI6Iik7Ci0JCSAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdCB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEgcHJvdG9jb2wKLQkJICB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJICB9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLSAgfSAKLSAgCi0gIC8qKgotICAgKiBSZWFkIHRoZSBXU0RMIGRvY3VtZW50IGFjY2Vzc2libGUgdmlhIHRoZSBzcGVjaWZpZWQKLSAgICogVVJJIGludG8gYSBXU0RMIGRlZmluaXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0VVJJIHRoZSBjb250ZXh0IGluIHdoaWNoIHRvIHJlc29sdmUgdGhlCi0gICAqIHdzZGxVUkksIGlmIHRoZSB3c2RsVVJJIGlzIHJlbGF0aXZlLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2gKLSAgICogY2FzZSBpdCB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEBwYXJhbSB3c2RsVVJJIGEgVVJJIChjYW4gYmUgYSBmaWxlbmFtZSBvciBVUkwpIHBvaW50aW5nIHRvIGEKLSAgICogV1NETCBYTUwgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyBjb250ZXh0VVJJLCBTdHJpbmcgd3NkbFVSSSkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uT1RIRVJfRVJST1IsIk5vdCBJbXBsZW1lbnRlZCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIHNwZWNpZmllZCAmbHQ7d3NkbDpkZWZpbml0aW9ucyZndDsgZWxlbWVudCBpbnRvIGEgV1NETAotICAgKiBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gZG9jdW1lbnRCYXNlVVJJIHRoZSBkb2N1bWVudCBiYXNlIFVSSSBvZiB0aGUgV1NETCBkZWZpbml0aW9uCi0gICAqIGRlc2NyaWJlZCBieSB0aGUgZWxlbWVudC4gV2lsbCBiZSBzZXQgYXMgdGhlIGRvY3VtZW50QmFzZVVSSQotICAgKiBvZiB0aGUgcmV0dXJuZWQgRGVmaW5pdGlvbi4gQ2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2UgaXQKLSAgICogd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbnNFbGVtZW50IHRoZSAmbHQ7d3NkbDpkZWZpbml0aW9ucyZndDsgZWxlbWVudAotICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBieSB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyBkb2N1bWVudEJhc2VVUkksIEVsZW1lbnQgZGVmaW5pdGlvbnNFbGVtZW50KQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzcGVjaWZpZWQgV1NETCBkb2N1bWVudCBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gZG9jdW1lbnRCYXNlVVJJIHRoZSBkb2N1bWVudCBiYXNlIFVSSSBvZiB0aGUgV1NETCBkZWZpbml0aW9uCi0gICAqIGRlc2NyaWJlZCBieSB0aGUgZG9jdW1lbnQuIFdpbGwgYmUgc2V0IGFzIHRoZSBkb2N1bWVudEJhc2VVUkkKLSAgICogb2YgdGhlIHJldHVybmVkIERlZmluaXRpb24uIENhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGl0Ci0gICAqIHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCB0aGUgV1NETCBkb2N1bWVudCwgYW4gWE1MIAotICAgKiBkb2N1bWVudCBvYmV5aW5nIHRoZSBXU0RMIHNjaGVtYS4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gcmVhZFdTREwoU3RyaW5nIGRvY3VtZW50QmFzZVVSSSwgRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGEgV1NETCBkb2N1bWVudCBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gZG9jdW1lbnRCYXNlVVJJIHRoZSBkb2N1bWVudCBiYXNlIFVSSSBvZiB0aGUgV1NETCBkZWZpbml0aW9uCi0gICAqIGRlc2NyaWJlZCBieSB0aGUgZG9jdW1lbnQuIFdpbGwgYmUgc2V0IGFzIHRoZSBkb2N1bWVudEJhc2VVUkkKLSAgICogb2YgdGhlIHJldHVybmVkIERlZmluaXRpb24uIENhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGl0Ci0gICAqIHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHBhcmFtIGlucHV0U291cmNlIGFuIElucHV0U291cmNlIHBvaW50aW5nIHRvIHRoZQotICAgKiBXU0RMIGRvY3VtZW50LCBhbiBYTUwgZG9jdW1lbnQgb2JleWluZyB0aGUgV1NETCBzY2hlbWEuCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudCBwb2ludGVkIHRvCi0gICAqIGJ5IHRoZSBJbnB1dFNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyBkb2N1bWVudEJhc2VVUkksIElucHV0U291cmNlIGlucHV0U291cmNlKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFJlc291cmNlSW1wbCB3c2RsTWFpblJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi53c2RsIikpOwotCi0gIAl0cnkKLSAgICB7Ci0gICAgICBpZiAoZG9jdW1lbnRCYXNlVVJJICE9IG51bGwpCi0gICAgICAgIHdzZGxNYWluUmVzb3VyY2Uuc2V0VVJJKGNyZWF0ZVVSSShkb2N1bWVudEJhc2VVUkkpKTsKLSAgICAgIHJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KFdTRExSZXNvdXJjZUltcGwuQ09OVElOVUVfT05fTE9BRF9FUlJPUixuZXcgQm9vbGVhbihmYWxzZSkpOwotICAgICAgd3NkbE1haW5SZXNvdXJjZS5sb2FkKGlucHV0U291cmNlLmdldEJ5dGVTdHJlYW0oKSwgcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5JTlZBTElEX1dTREwsICIiLCBpb2UpOwotICAgIH0KLSAgICAKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsTWFpblJlc291cmNlLmdldERlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgZGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkoZG9jdW1lbnRCYXNlVVJJKTsKLSAgICAKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGEgV1NETCBkb2N1bWVudCBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gbG9jYXRvciBBIFdTRExMb2NhdG9yIG9iamVjdCB1c2VkIHRvIHByb3ZpZGUgSW5wdXRTb3VyY2VzCi0gICAqIHBvaW50aW5nIHRvIHRoZSB3c2RsIGZpbGUuCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gcmVhZFdTREwoV1NETExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uT1RIRVJfRVJST1IsIk5vdCBJbXBsZW1lbnRlZCIpOwotICB9Ci0KLSAgcHJpdmF0ZSBVUkkgY3JlYXRlVVJJKFN0cmluZyB1cmlTdHJpbmcpCi0gIHsKLSAgICBpZiAoaGFzUHJvdG9jb2wodXJpU3RyaW5nKSkKLSAgICAgICByZXR1cm4gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOwotICAgIGVsc2UKLSAgICAgICByZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkodXJpU3RyaW5nKTsKLSAgfSAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMV3JpdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMV3JpdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFmMTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETFdyaXRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETFdyaXRlckltcGwgaW1wbGVtZW50cyBXU0RMV3JpdGVyCi17Ci0gIC8qKgotICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICAgKiA8cD4KLSAgICogVGhlcmUgYXJlIG5vIG1pbmltdW0gZmVhdHVyZXMgdGhhdCBtdXN0IGJlIHN1cHBvcnRlZC4KLSAgICogPHA+Ci0gICAqIEFsbCBmZWF0dXJlIG5hbWVzIG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLCBKYXZhIHBhY2thZ2Ugc3R5bGUuIEFsbAotICAgKiBuYW1lcyBzdGFydGluZyB3aXRoIGphdmF4LndzZGwuIGFyZSByZXNlcnZlZCBmb3IgZmVhdHVyZXMgZGVmaW5lZAotICAgKiBieSB0aGUgSldTREwgc3BlY2lmaWNhdGlvbi4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbXBsZW1lbnRhdGlvbi0KLSAgICogc3BlY2lmaWMgZmVhdHVyZXMgYmUgZnVsbHktcXVhbGlmaWVkIHRvIG1hdGNoIHRoZSBwYWNrYWdlIG5hbWUKLSAgICogb2YgdGhhdCBpbXBsZW1lbnRhdGlvbi4gRm9yIGV4YW1wbGU6IGNvbS5hYmMuZmVhdHVyZU5hbWUKLSAgICoKLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgdG8gYmUgc2V0LgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldCB0aGUgZmVhdHVyZSB0by4KLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZlYXR1cmUgbmFtZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICogQHNlZSAjZ2V0RmVhdHVyZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvIGdldCB0aGUgdmFsdWUgb2YuCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmZWF0dXJlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqIEBzZWUgI3NldEZlYXR1cmUoU3RyaW5nLCBib29sZWFuKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgZG9jdW1lbnQgZ2VuZXJhdGVkIGZyb20gdGhlIHNwZWNpZmllZCBXU0RMIG1vZGVsLgotICAgKi8KLSAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KERlZmluaXRpb24gd3NkbERlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHJldHVybiAoKERlZmluaXRpb25JbXBsKXdzZGxEZWYpLmdldERvY3VtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgdGhlIHNwZWNpZmllZCBXU0RMIGRlZmluaXRpb24gdG8gdGhlIHNwZWNpZmllZCBXcml0ZXIuCi0gICAqCi0gICAqIEBwYXJhbSB3c2RsRGVmIHRoZSBXU0RMIGRlZmluaXRpb24gdG8gYmUgd3JpdHRlbi4KLSAgICogQHBhcmFtIHNpbmsgdGhlIFdyaXRlciB0byB3cml0ZSB0aGUgeG1sIHRvLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGVXU0RMKERlZmluaXRpb24gd3NkbERlZiwgV3JpdGVyIHNpbmspIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOwotICAgICAgCi0gICAgICAvLyBVbmxlc3MgYSB3aWR0aCBpcyBzZXQsIHRoZXJlIHdpbGwgYmUgb25seSBsaW5lIGJyZWFrcyBidXQgbm8gaW5kZW50YXRpb24uCi0gICAgICAvLyBUaGUgSUJNIEpESyBhbmQgdGhlIFN1biBKREsgZG9uJ3QgYWdyZWUgb24gdGhlIHByb3BlcnR5IG5hbWUsCi0gICAgICAvLyBzbyB3ZSBzZXQgdGhlbSBib3RoLgotICAgICAgLy8KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBlbmNvZGluZyk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCl3c2RsRGVmKS5nZXREb2N1bWVudCgpOwotICAgICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgICgoRGVmaW5pdGlvbkltcGwpd3NkbERlZikudXBkYXRlRWxlbWVudCh0cnVlKTsKLSAgICAgICAgZG9jdW1lbnQgPSAoKERlZmluaXRpb25JbXBsKXdzZGxEZWYpLmdldERvY3VtZW50KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChzaW5rKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiRmFpbGVkIHRvIHNhdmUgRGVmaW5pdGlvbnMuIixleGNlcHRpb24pOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBzcGVjaWZpZWQgV1NETCBkZWZpbml0aW9uIHRvIHRoZSBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtLgotICAgKgotICAgKiBAcGFyYW0gd3NkbERlZiB0aGUgV1NETCBkZWZpbml0aW9uIHRvIGJlIHdyaXR0ZW4uCi0gICAqIEBwYXJhbSBzaW5rIHRoZSBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgdGhlIHhtbCB0by4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlV1NETChEZWZpbml0aW9uIHdzZGxEZWYsIE91dHB1dFN0cmVhbSBzaW5rKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0KLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9ICgoRGVmaW5pdGlvbkltcGwpd3NkbERlZikuZVJlc291cmNlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmVzb3VyY2Uuc2F2ZShzaW5rLG51bGwpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJGYWlsZWQgdG8gc2F2ZSBEZWZpbml0aW9ucy4iLGUpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1JlY29uY2lsYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1JlY29uY2lsYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQyYTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9SZWNvbmNpbGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8vIFRPRE8uLi4gd2h5IGRvIHdlIG5lZWQgdGhpcz8KLS8vIAotcHVibGljIGludGVyZmFjZSBSZWNvbmNpbGFibGUgCi17Ci0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KTsKLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpOwotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpOwotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzYyMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFdTRExBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICBpZiAobW9kZWxQYWNrYWdlID09IG51bGwpCi0gICAgewotICAgICAgbW9kZWxQYWNrYWdlID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBXU0RMU3dpdGNoIG1vZGVsU3dpdGNoID0KLSAgICBuZXcgV1NETFN3aXRjaCgpCi0gICAgewotICAgICAgcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0VHlwZShQb3J0VHlwZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVQb3J0VHlwZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU9wZXJhdGlvbihPcGVyYXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlT3BlcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VQYXJ0KFBhcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlUGFydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlKFNlcnZpY2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU2VydmljZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVQb3J0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VEZWZpbml0aW9uKERlZmluaXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUltcG9ydChJbXBvcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSW1wb3J0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJsZUVsZW1lbnQoRXh0ZW5zaWJsZUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRXh0ZW5zaWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJbnB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlT3V0cHV0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRmF1bHRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdJbnB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nT3V0cHV0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nRmF1bHRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VOYW1lc3BhY2UoTmFtZXNwYWNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU5hbWVzcGFjZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlQb3J0VHlwZShqYXZheC53c2RsLlBvcnRUeXBlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlQb3J0VHlwZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlPcGVyYXRpb24oamF2YXgud3NkbC5PcGVyYXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSU9wZXJhdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlJbnB1dChqYXZheC53c2RsLklucHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlJbnB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlPdXRwdXQoamF2YXgud3NkbC5PdXRwdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSU91dHB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlGYXVsdChqYXZheC53c2RsLkZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlNZXNzYWdlKGphdmF4LndzZGwuTWVzc2FnZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJTWVzc2FnZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlQYXJ0KGphdmF4LndzZGwuUGFydCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJUGFydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlTZXJ2aWNlKGphdmF4LndzZGwuU2VydmljZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJU2VydmljZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlQb3J0KGphdmF4LndzZGwuUG9ydCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJUG9ydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nKGphdmF4LndzZGwuQmluZGluZyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJQmluZGluZ0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nT3BlcmF0aW9uKGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nSW5wdXQoamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUJpbmRpbmdJbnB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nT3V0cHV0KGphdmF4LndzZGwuQmluZGluZ091dHB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJQmluZGluZ091dHB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nRmF1bHQoamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUJpbmRpbmdGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSURlZmluaXRpb24oamF2YXgud3NkbC5EZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUltcG9ydChqYXZheC53c2RsLkltcG9ydCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJSW1wb3J0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUxpc3QoTGlzdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJTGlzdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlNYXAoTWFwIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlNYXBBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJVVJMKFVSTCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJVVJMQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlFeHRlbnNpb25SZWdpc3RyeUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVR5cGVzKFR5cGVzIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVzQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUl0ZXJhdG9yKEl0ZXJhdG9yIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlJdGVyYXRvckFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlUeXBlcyhqYXZheC53c2RsLlR5cGVzIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlUeXBlc0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlUmVmZXJlbmNlKE1lc3NhZ2VSZWZlcmVuY2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZVJlZmVyZW5jZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotICAgICAgfQotICAgIH07Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0gICAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkKLSAgewotICAgIHJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotICB9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLldTRExFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUgPGVtPlBvcnQgVHlwZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0VHlwZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiA8ZW0+T3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVPcGVyYXRpb25BZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQgPGVtPlBhcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVQYXJ0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uIDxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5TZXJ2aWNlIDxlbT5TZXJ2aWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQgPGVtPlBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24gPGVtPkRlZmluaXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0IDxlbT5JbXBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUltcG9ydEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2libGVFbGVtZW50IDxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5zaWJsZUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbnB1dCA8ZW0+SW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5wdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0cHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRmF1bHQgPGVtPkZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZhdWx0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0IDxlbT5CaW5kaW5nIElucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nSW5wdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3V0cHV0IDxlbT5CaW5kaW5nIE91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdPdXRwdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQgPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lc3BhY2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0VHlwZSA8ZW0+SVBvcnQgVHlwZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnRUeXBlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlQb3J0VHlwZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLk9wZXJhdGlvbiA8ZW0+SU9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLk9wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuSW5wdXQgPGVtPklJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLklucHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlJbnB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLk91dHB1dCA8ZW0+SU91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLk91dHB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJT3V0cHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuRmF1bHQgPGVtPklGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLk1lc3NhZ2UgPGVtPklNZXNzYWdlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuTWVzc2FnZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJTWVzc2FnZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlBhcnQgPGVtPklQYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuUGFydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJUGFydEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlNlcnZpY2UgPGVtPklTZXJ2aWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuU2VydmljZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlBvcnQgPGVtPklQb3J0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuUG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJUG9ydEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmcgPGVtPklCaW5kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJQmluZGluZ0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgPGVtPklCaW5kaW5nIElucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ0lucHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlCaW5kaW5nSW5wdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IDxlbT5JQmluZGluZyBPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlCaW5kaW5nT3V0cHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IDxlbT5JQmluZGluZyBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJQmluZGluZ0ZhdWx0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuRGVmaW5pdGlvbiA8ZW0+SURlZmluaXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuSW1wb3J0IDxlbT5JSW1wb3J0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuSW1wb3J0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlJbXBvcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLkxpc3QgPGVtPklMaXN0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlMaXN0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5NYXAgPGVtPklNYXA8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YS51dGlsLk1hcAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJTWFwQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubmV0LlVSTCA8ZW0+SVVSTDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZhLm5ldC5VUkwKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVVSTEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlFeHRlbnNpb25SZWdpc3RyeUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlR5cGVzIDxlbT5UeXBlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlcwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlc0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuSXRlcmF0b3IgPGVtPklJdGVyYXRvcjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUl0ZXJhdG9yQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuVHlwZXMgPGVtPklUeXBlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLlR5cGVzCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlUeXBlc0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5YU0QgU2NoZW1hIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2VSZWZlcmVuY2UgPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZVJlZmVyZW5jZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0gLy9XU0RMQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllZjUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETERlZmluaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExEZWZpbml0aW9uRmFjdG9yeSBleHRlbmRzIGNvbS5pYm0ud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5SW1wbAotewotCi0gIHByaXZhdGUgc3RhdGljIFdTRExEZWZpbml0aW9uRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLSAgcHVibGljIFdTRExEZWZpbml0aW9uRmFjdG9yeSgpCi0gIHsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIFdTREwgcGFja2FnZSBpcyBpbml0aWFsaXplZC4KLSAgICBXU0RMUGFja2FnZUltcGwuaW5pdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBEZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuRGVmaW5pdGlvbiBuZXdEZWZpbml0aW9uKCkKLSAgewotICAgIGphdmF4LndzZGwuRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGZhY3RvcnkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5IGdldEluc3RhbmNlKCkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgICAgaW5zdGFuY2UgPSBuZXcgV1NETERlZmluaXRpb25GYWN0b3J5KCk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBXU0RMUmVhZGVyLgotICAgKi8KLSAgcHVibGljIFdTRExSZWFkZXIgbmV3V1NETFJlYWRlcigpCi0gIHsKLSAgICBXU0RMUmVhZGVyIHJlYWRlciA9IG5ldyBXU0RMUmVhZGVySW1wbCgpOwotICAgIHJlYWRlci5zZXRGYWN0b3J5SW1wbE5hbWUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIHJldHVybiByZWFkZXI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExNb2RlbExvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMTW9kZWxMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOWIwYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExNb2RlbExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIGludGVyZmFjZSB1c2VkIGJ5IHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnRJbXBsIHRvIGZpbmQgcmVmZXJlbmNlZCByZXNvdXJjZXMuCi0gKiBXaGVuIHRoZSByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IGEgd3NkbCBpbXBvcnQgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCwgCi0gKiB0aGUgY29udGFpbmluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlfQotICogd2lsbCBiZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsI2dldFJlZ2lzdGVyZWRBZGFwdGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSxPYmplY3QpIGluc3BlY3RlZH0gCi0gKiBmb3IgYW4gYWRhcHRlciB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuCi0gKiBBcyBzdWNoLCB5b3UgY2FuIHJlZ2lzdGVyIGFuIGFkYXB0ZXIgZmFjdG9yeSBsaWtlIHRoaXMgdG8gdGFpbG9yIHRoZSBhbGdvcml0aG0gdXNlZCB0byBsb2NhdGUgdGhlIHJlc291cmNlIDoKLSAqPHByZT4KLSAqICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAqICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkCi0gKiAgICAobmV3IEFkYXB0ZXJGYWN0b3J5SW1wbCgpCi0gKiAgICAgewotICogICAgICAgY2xhc3MgQ3VzdG9tVVJJUmVzb2x2ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFdTRExNb2RlbExvY2F0b3IKLSAqICAgICAgIHsKLSAqICAgICAgICAgcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbik7Ci0gKiAgICAgICAgIHsKLSAqICAgICAgICAgICByZXR1cm4gbnVsbDsgIC8vIEFkZGl0aW9uYWwgbG9naWMuLi4KLSAqICAgICAgICAgfQotICoKLSAqICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAqICAgICAgICAgewotICogICAgICAgICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gKiAgICAgICAgIH0KLSAqICAgICAgIH0KLSAqCi0gKiAgICAgICBwcm90ZWN0ZWQgQ3VzdG9tVVJJUmVzb2x2ZXIgY3VzdG9tVVJJUmVzb2x2ZXIgPSBuZXcgQ3VzdG9tVVJJUmVzb2x2ZXIoKTsKLSAqCi0gKiAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQotICogICAgICAgewotICogICAgICAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzOwotICogICAgICAgfQotICoKLSAqICAgICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpCi0gKiAgICAgICB7Ci0gKiAgICAgICAgIHJldHVybiBjdXN0b21VUklSZXNvbHZlcjsKLSAqICAgICAgIH0KLSAqICAgICB9KTsKLSAqPC9wcmU+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCNnZXRSZWdpc3RlcmVkQWRhcHRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UsT2JqZWN0KQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExNb2RlbExvY2F0b3IKLXsKLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTg2YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbAotewotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpCi0gIHsKLSAgICBSZXNvdXJjZSByZXN1bHQgPSBuZXcgV1NETFJlc291cmNlSW1wbCh1cmkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0gLy9XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjA2NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMU3dpdGNoIHsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXU0RMUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMU3dpdGNoKCkKLSAgewotICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtb2RlbFBhY2thZ2UgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpCi0gIHsKLSAgICBFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLSAgICBpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpCi0gICAgewotICAgICAgc3dpdGNoICh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChwb3J0VHlwZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSVBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT046Ci0gICAgICAgIHsKLSAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbil0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQob3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRToKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG1lc3NhZ2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlUGFydChwYXJ0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChwYXJ0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJUGFydChwYXJ0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmcoYmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJsZUVsZW1lbnQoYmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmcoYmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoYmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT046Ci0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbil0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlQmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJQmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFOgotICAgICAgICB7Ci0gICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJsZUVsZW1lbnQoc2VydmljZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc2VydmljZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVDoKLSAgICAgICAgewotICAgICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VQb3J0KHBvcnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KHBvcnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlQb3J0KHBvcnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHBvcnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVDoKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTjoKLSAgICAgICAgewotICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGRlZmluaXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGRlZmluaXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVDoKLSAgICAgICAgewotICAgICAgICAgIEltcG9ydCBpbXBvcnRfID0gKEltcG9ydCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlSW1wb3J0KGltcG9ydF8pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGltcG9ydF8pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlJbXBvcnQoaW1wb3J0Xyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbnB1dCBpbnB1dCA9IChJbnB1dCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlSW5wdXQoaW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1lc3NhZ2VSZWZlcmVuY2UoaW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSW5wdXQoaW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVDoKLSAgICAgICAgewotICAgICAgICAgIE91dHB1dCBvdXRwdXQgPSAoT3V0cHV0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXNzYWdlUmVmZXJlbmNlKG91dHB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQob3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlRmF1bHQoZmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1lc3NhZ2VSZWZlcmVuY2UoZmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRmF1bHQoZmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gKEJpbmRpbmdJbnB1dCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlQmluZGluZ0lucHV0KGJpbmRpbmdJbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJsZUVsZW1lbnQoYmluZGluZ0lucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJQmluZGluZ0lucHV0KGJpbmRpbmdJbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoYmluZGluZ0lucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVDoKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IChCaW5kaW5nT3V0cHV0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VCaW5kaW5nT3V0cHV0KGJpbmRpbmdPdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmdPdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlCaW5kaW5nT3V0cHV0KGJpbmRpbmdPdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmdPdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlQmluZGluZ0ZhdWx0KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJsZUVsZW1lbnQoYmluZGluZ0ZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJQmluZGluZ0ZhdWx0KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoYmluZGluZ0ZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0U6Ci0gICAgICAgIHsKLSAgICAgICAgICBOYW1lc3BhY2UgbmFtZXNwYWNlID0gKE5hbWVzcGFjZSl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVM6Ci0gICAgICAgIHsKLSAgICAgICAgICBUeXBlcyB0eXBlcyA9IChUeXBlcyl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlVHlwZXModHlwZXMpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KHR5cGVzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJVHlwZXModHlwZXMpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHR5cGVzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVDoKLSAgICAgICAgewotICAgICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCB1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQodW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudCh1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudCh4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IFR5cGU8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBUeXBlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUG9ydFR5cGUoUG9ydFR5cGUgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VPcGVyYXRpb24oT3BlcmF0aW9uIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlKE1lc3NhZ2Ugb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFydDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBhcnQoUGFydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZyhCaW5kaW5nIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlU2VydmljZShTZXJ2aWNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWZpbml0aW9uPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbXBvcnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSW1wb3J0KEltcG9ydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJsZSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2libGVFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlucHV0KElucHV0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRwdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0cHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBPdXRwdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBPdXRwdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VOYW1lc3BhY2UoTmFtZXNwYWNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydCBUeXBlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklQb3J0IFR5cGU8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJUG9ydFR5cGUoamF2YXgud3NkbC5Qb3J0VHlwZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JT3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSU9wZXJhdGlvbihqYXZheC53c2RsLk9wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUlucHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlJbnB1dChqYXZheC53c2RsLklucHV0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JT3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklPdXRwdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJT3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUZhdWx0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUZhdWx0KGphdmF4LndzZGwuRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNZXNzYWdlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSU1lc3NhZ2UoamF2YXgud3NkbC5NZXNzYWdlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUGFydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUGFydDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlQYXJ0KGphdmF4LndzZGwuUGFydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVNlcnZpY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVNlcnZpY2U8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJU2VydmljZShqYXZheC53c2RsLlNlcnZpY2Ugb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklQb3J0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklQb3J0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVBvcnQoamF2YXgud3NkbC5Qb3J0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JQmluZGluZzwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JQmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nKGphdmF4LndzZGwuQmluZGluZyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgT3BlcmF0aW9uPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nT3BlcmF0aW9uKGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ0lucHV0KGphdmF4LndzZGwuQmluZGluZ0lucHV0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JQmluZGluZyBPdXRwdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmdPdXRwdXQoamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JQmluZGluZyBGYXVsdDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JQmluZGluZyBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nRmF1bHQoamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklEZWZpbml0aW9uPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklEZWZpbml0aW9uPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSURlZmluaXRpb24oamF2YXgud3NkbC5EZWZpbml0aW9uIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSW1wb3J0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklJbXBvcnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJSW1wb3J0KGphdmF4LndzZGwuSW1wb3J0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTGlzdDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTGlzdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlMaXN0KExpc3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNYXA8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1hcDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlNYXAoTWFwIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JVVJMPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklVUkw8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJVVJMKFVSTCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlczwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlczwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVR5cGVzKFR5cGVzIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSXRlcmF0b3I8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUl0ZXJhdG9yPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUl0ZXJhdG9yKEl0ZXJhdG9yIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JVHlwZXM8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVR5cGVzPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVR5cGVzKGphdmF4LndzZGwuVHlwZXMgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBSZWZlcmVuY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBSZWZlcmVuY2U8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlUmVmZXJlbmNlKE1lc3NhZ2VSZWZlcmVuY2Ugb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfSAvL1dTRExTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzliMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMVXRpbCBleHRlbmRzIFdTRExDb25zdGFudHMKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBXU0RMVXRpbCBpbnN0YW5jZTsKLSAgLy8gIHByb3RlY3RlZCBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyIG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIgPSBuZXcgTm9kZUFzc29jaWF0aW9uTWFuYWdlcigpOwotCi0gIHByb3RlY3RlZCBIYXNoTWFwIGVsZW1lbnROYW1lVG9UeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICBwdWJsaWMgc3RhdGljIFdTRExVdGlsIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IFdTRExVdGlsKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMVXRpbCgpCi0gIHsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoQklORElOR19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoQklORElORykpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChERUZJTklUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihERUZJTklUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKERPQ1VNRU5UQVRJT04pKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoRkFVTFRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKEZBVUxUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KElNUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoSU1QT1JUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KElOUFVUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihJTlBVVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChNRVNTQUdFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihNRVNTQUdFKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KE9QRVJBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoT1BFUkFUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KE9VVFBVVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoT1VUUFVUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFBBUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBBUlQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoUE9SVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChQT1JUX1RZUEVfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBPUlRfVFlQRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChTRVJWSUNFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihTRVJWSUNFKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFRZUEVTX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihUWVBFUykpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRXU0RMVHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0KLSAgICBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcikgZWxlbWVudE5hbWVUb1R5cGVNYXAuZ2V0KGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgIGlmIChpbnRlZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gaW50ZWdlci5pbnRWYWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0UGFyZW50RWxlbWVudENoYWluKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB3aGlsZSAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKDAsIGVsZW1lbnQpOwotICAgICAgTm9kZSBub2RlID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBlbGVtZW50ID0gKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpID8gKEVsZW1lbnQpIG5vZGUgOiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qCi0gICAgcHVibGljIE9iamVjdCBmaW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KERlZmluaXRpb24gZGVmaW5pdGlvbiwgRWxlbWVudCB0YXJnZXRFbGVtZW50KQotICAgIHsgICAKLSAgICAgIE9iamVjdCBvID0gbm9kZUFzc29jaWF0aW9uTWFuYWdlci5nZXRNb2RlbE9iamVjdEZvck5vZGUoZGVmaW5pdGlvbiwgdGFyZ2V0RWxlbWVudCk7Ci0gICAgICByZXR1cm4gbzsKLSAgICB9Ci0gIAotICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50Rm9yT2JqZWN0KE9iamVjdCBvKQotICAgIHsgICAgICAKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIuZ2V0Tm9kZShvKTsgIAotICAgICAgcmV0dXJuIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSA/IChFbGVtZW50KW5vZGUgOiBudWxsOyAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTm9kZSBnZXROb2RlRm9yT2JqZWN0KE9iamVjdCBvKQotICAgIHsgICAgICAKLSAgICAgIHJldHVybiBub2RlQXNzb2NpYXRpb25NYW5hZ2VyLmdldE5vZGUobyk7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgCi0gICAgcHVibGljIElUeXBlU3lzdGVtUHJvdmlkZXIgZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICB7ICAgICAgCi0gICAgICByZXR1cm4gV1NETFRvRE9NRWxlbWVudFV0aWwuZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKGRlZmluaXRpb24pOyAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAKLSAgCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZVN5c3RlbVByb3ZpZGVyKERlZmluaXRpb24gZGVmaW5pdGlvbiwgSVR5cGVTeXN0ZW1Qcm92aWRlciB0eXBlU3lzdGVtUHJvdmlkZXIpCi0gICAgeyAgICAgIAotICAgICAgV1NETFRvRE9NRWxlbWVudFV0aWwuc2V0VHlwZVN5c3RlbVByb3ZpZGVyKGRlZmluaXRpb24sIHR5cGVTeXN0ZW1Qcm92aWRlcik7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0gICAKLSAgKi8KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGNyZWF0ZVFOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHByZWZpeGVkTmFtZSkKLSAgewotICAgIFFOYW1lIHFuYW1lID0gbnVsbDsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcHJlZml4ZWROYW1lLmluZGV4T2YoIjoiKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoaW5kZXggPT0gLTEpID8gbnVsbCA6IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICBxbmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHFuYW1lOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnROb2RlcyhFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCkKLSAgewotICAgIExpc3QgY2hpbGRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGV4dGVuc2libGVFbGVtZW50LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkTGlzdC5hZGQoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNoaWxkTGlzdDsKLSAgICAvL3JldHVybiBleHRlbnNpYmxlRWxlbWVudC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNGVlODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0b3JJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRvckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NWI0NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRvckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFhTRFNjaGVtYUxvY2F0b3IKLXsKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3IjbG9jYXRlU2NoZW1hKG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWEsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBYU0RTY2hlbWEgbG9jYXRlU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyByYXdTY2hlbWFMb2NhdGlvblVSSSwgU3RyaW5nIHJlc29sdmVkU2NoZW1hTG9jYXRpb25VUkkpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gbnVsbDsKLQotICAgICAgLy8gQnVnemlsbGEgMTIyNjI0OiAgV1NETCBtb2RlbCBkb2VzIG5vdCByZXNvbHZlIDxpbXBvcnQ+IG9mIGlubGluZSBzY2hlbWEgd2l0aCBubyBuYW1lc3BhY2UuCi0gICAgICAvLyBLQjogV2UgYXJlIG5vdCByZXNvbHZpbmcgPGltcG9ydD5lZCBvciA8aW5jbHVkZT5kIHNjaGVtYXMgZnJvbSB0aGUgcm9vdCBpbmxpbmUgc2NoZW1hcy4KLSAgICAgIC8vIEluIG90aGVyIHdvcmRzLCBzaW5jZSB3ZSBhcmUgcmVzb2x2aW5nIG9ubHkgYmV0d2VlbiBtdWx0aXBsZSByb290IGlubGluZSBzY2hlbWFzLAotICAgICAgLy8gZG8gbm90IGF0dGVtcHQgdG8gcmVzb2x2ZSBpZiAicmF3U2NoZW1hTG9jYXRpb25VUkkiIGlzIG5vdCBudWxsLiAKLSAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiByYXdTY2hlbWFMb2NhdGlvblVSSSA9PSBudWxsKQotICAgICAgewotICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotCi0gICAgICAgIGZvciAoRU9iamVjdCBwYXJlbnQgPSB4c2RTY2hlbWEuZUNvbnRhaW5lcigpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgcGFyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCAmJiBkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBvKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS5lcXVhbHMoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hID0gc2NoZW1hOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzb2x2ZWRTY2hlbWE7ICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyMmRlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XU0RMIE1vZGVsIEFQSSBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPgotICAgICAgICBUaGUgV1NETCBtb2RlbCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gd29yayB3aXRoIHRoZSBXU0RMIDEuMSBkb2N1bWVudHMuCi0JCTwvcD4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlRoZSBXU0RMIG1vZGVsIEFQSSBhbGxvd3MgY2xpZW50cyB0byBsb2FkLCBtb2RpZnksIGFuZCBzYXZlIFdTREwgMS4xIGRvY3VtZW50cy4KLQkJPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9wYWNrYWdlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTViYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLQk8aGVhZD4KLQkJPG1ldGEKLQkJCW5hbWU9InJvb3QiCi0JCi0JCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JCTx0aXRsZT5XU0RMIE1vZGVsIEFQSSBPdmVydmlldzwvdGl0bGU+Ci0JPC9oZWFkPgotCi0JPGJvZHk+Ci0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIHdvcmsgd2l0aCB0aGUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L2Fic3RyYWN0PgotCQk8cD5UaGUgV1NETCBtb2RlbCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gbG9hZCwgbW9kaWZ5LCBhbmQgc2F2ZSBXU0RMIDEuMSBkb2N1bWVudHMuCi0JCTwvcD4gCi0JPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjEzNTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDEuMAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci17Ci0gIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhODM1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbDsKLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAxLjAKLSovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5Ci17Ci0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlLCBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhYjgyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgY29uc3RhbnRzIGZvciBXU0RMIGVsZW1lbnQgdGFncyBhbmQgcmVsZXZhbnQgbmFtZXNwYWNlcy4KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdTRExDb25zdGFudHMKLXsKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4iYmluZGluZyI8L2NvZGU+LgotICAgKiBAc2VlICNnZXRFbGVtZW50VGFnKGludCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HID0gMDsKLSAgCi0gIC8qKgotICAgKiBUaGUgZWxlbWVudCB0YWcgaXMgPGNvZGU+ImRlZmluaXRpb25zIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEVsZW1lbnRUYWcoaW50KS4KLSAgICovICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGSU5JVElPTiA9IDE7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJkb2N1bWVudGF0aW9uIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEVsZW1lbnRUYWcoaW50KS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UQVRJT04gPSAyOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4iZmF1bHQiPC9jb2RlPi4KLSAgICogQHNlZSAjZ2V0RWxlbWVudFRhZyhpbnQpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFVTFQgPSAzOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4iaW1wb3J0IjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEVsZW1lbnRUYWcoaW50KS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9SVCA9IDQ7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJpbnB1dCI8L2NvZGU+LgotICAgKiBAc2VlICNnZXRFbGVtZW50VGFnKGludCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlBVVCA9IDU7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJtZXNzYWdlIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEVsZW1lbnRUYWcoaW50KS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0UgPSA2OwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4ib3BlcmF0aW9uIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEVsZW1lbnRUYWcoaW50KS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTiA9IDc7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJvdXRwdXQiPC9jb2RlPi4KLSAgICogQHNlZSAjZ2V0RWxlbWVudFRhZyhpbnQpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUUFVUID0gODsKLSAgCi0gIC8qKgotICAgKiBUaGUgZWxlbWVudCB0YWcgaXMgPGNvZGU+InBhcnQiPC9jb2RlPi4KLSAgICogQHNlZSAjZ2V0RWxlbWVudFRhZyhpbnQpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVCA9IDk7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJwb3J0IjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEVsZW1lbnRUYWcoaW50KS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlQgPSAxMDsKLSAgCi0gIC8qKgotICAgKiBUaGUgZWxlbWVudCB0YWcgaXMgPGNvZGU+InBvcnRUeXBlIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEVsZW1lbnRUYWcoaW50KS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlRfVFlQRSA9IDExOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4ic2VydmljZSI8L2NvZGU+LgotICAgKiBAc2VlICNnZXRFbGVtZW50VGFnKGludCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFID0gMTI7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJ0eXBlcyI8L2NvZGU+LgotICAgKiBAc2VlICNnZXRFbGVtZW50VGFnKGludCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFUyA9IDEzOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4iYmluZGluZyI8L2NvZGU+LgotICAgKiBAc2VlICNub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfRUxFTUVOVF9UQUcgPSAiYmluZGluZyI7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJkZWZpbml0aW9ucyI8L2NvZGU+LgotICAgKiBAc2VlICNub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklOSVRJT05fRUxFTUVOVF9UQUcgPSAiZGVmaW5pdGlvbnMiOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4iZG9jdW1lbnRhdGlvbiI8L2NvZGU+LgotICAgKiBAc2VlICNub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcgPSAiZG9jdW1lbnRhdGlvbiI7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJmYXVsdCI8L2NvZGU+LgotICAgKiBAc2VlICNub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0VMRU1FTlRfVEFHID0gImZhdWx0IjsKLSAgCi0gIC8qKgotICAgKiBUaGUgZWxlbWVudCB0YWcgaXMgPGNvZGU+ImltcG9ydCI8L2NvZGU+LgotICAgKiBAc2VlICNub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FTEVNRU5UX1RBRyA9ICJpbXBvcnQiOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4iaW5wdXQiPC9jb2RlPi4KLSAgICogQHNlZSAjbm9kZVR5cGUoU3RyaW5nIGxvY2FsTmFtZSkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9FTEVNRU5UX1RBRyA9ICJpbnB1dCI7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJtZXNzYWdlIjwvY29kZT4uCi0gICAqIEBzZWUgI25vZGVUeXBlKFN0cmluZyBsb2NhbE5hbWUpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9FTEVNRU5UX1RBRyA9ICJtZXNzYWdlIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgZWxlbWVudCB0YWcgaXMgPGNvZGU+Im9wZXJhdGlvbiI8L2NvZGU+LgotICAgKiBAc2VlICNub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9FTEVNRU5UX1RBRyA9ICJvcGVyYXRpb24iOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4ib3V0cHV0IjwvY29kZT4uCi0gICAqIEBzZWUgI25vZGVUeXBlKFN0cmluZyBsb2NhbE5hbWUpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0VMRU1FTlRfVEFHID0gIm91dHB1dCI7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJwYXJ0IjwvY29kZT4uCi0gICAqIEBzZWUgI25vZGVUeXBlKFN0cmluZyBsb2NhbE5hbWUpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9FTEVNRU5UX1RBRyA9ICJwYXJ0IjsKLSAgCi0gIC8qKgotICAgKiBUaGUgZWxlbWVudCB0YWcgaXMgPGNvZGU+InBvcnQiPC9jb2RlPi4KLSAgICogQHNlZSAjbm9kZVR5cGUoU3RyaW5nIGxvY2FsTmFtZSkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX0VMRU1FTlRfVEFHID0gInBvcnQiOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4icG9ydFR5cGUiPC9jb2RlPi4KLSAgICogQHNlZSAjbm9kZVR5cGUoU3RyaW5nIGxvY2FsTmFtZSkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1RZUEVfRUxFTUVOVF9UQUcgPSAicG9ydFR5cGUiOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRhZyBpcyA8Y29kZT4ic2VydmljZSI8L2NvZGU+LgotICAgKiBAc2VlICNub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRUxFTUVOVF9UQUcgPSAic2VydmljZSI7Ci0gIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdGFnIGlzIDxjb2RlPiJ0eXBlcyI8L2NvZGU+LgotICAgKiBAc2VlICNub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVTX0VMRU1FTlRfVEFHID0gInR5cGVzIjsKLQotICAvLyBjb21tb24KLSAgCi0gIC8qKgotICAgKiBUaGUgYXR0cmlidXRlIGlzIDxjb2RlPiJuYW1lIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEF0dHJpYnV0ZShFbGVtZW50LFN0cmluZykuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgYXR0cmlidXRlIGlzIDxjb2RlPiJtZXNzYWdlIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEF0dHJpYnV0ZShFbGVtZW50LFN0cmluZykuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0FUVFJJQlVURSA9ICJtZXNzYWdlIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgYXR0cmlidXRlIGlzIDxjb2RlPiJiaW5kaW5nIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEF0dHJpYnV0ZShFbGVtZW50LFN0cmluZykuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0FUVFJJQlVURSA9ICJiaW5kaW5nIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgYXR0cmlidXRlIGlzIDxjb2RlPiJ0eXBlIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEF0dHJpYnV0ZShFbGVtZW50LFN0cmluZykuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURSA9ICJ0eXBlIjsKLQotICAvLyBkZWZpbml0aW9ucwotICAKLSAgLyoqCi0gICAqIFRoZSBhdHRyaWJ1dGUgaXMgPGNvZGU+ImVuY29kaW5nIjwvY29kZT4uCi0gICAqIEBzZWUgI2dldEF0dHJpYnV0ZShFbGVtZW50LFN0cmluZykuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTkNPRElOR19BVFRSSUJVVEUgPSAiZW5jb2RpbmciOwotICAKLSAgLyoqCi0gICAqIFRoZSBhdHRyaWJ1dGUgaXMgPGNvZGU+InRhcmdldE5hbWVzcGFjZSI8L2NvZGU+LgotICAgKiBAc2VlICNnZXRBdHRyaWJ1dGUoRWxlbWVudCxTdHJpbmcpLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJ0YXJnZXROYW1lc3BhY2UiOwotCi0gIC8vIGJpbmRpbmcKLSAgCi0gIC8qKgotICAgKiBUaGUgYXR0cmlidXRlIGlzIDxjb2RlPiJyZXNvdXJjZVVSSSI8L2NvZGU+LgotICAgKiBAc2VlICNnZXRBdHRyaWJ1dGUoRWxlbWVudCxTdHJpbmcpLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfVVJJX0FUVFJJQlVURSA9ICJyZXNvdXJjZVVSSSI7Ci0KLSAgLy8gcGFydAotICAKLSAgLyoqCi0gICAqIFRoZSBhdHRyaWJ1dGUgaXMgPGNvZGU+ImVsZW1lbnQiPC9jb2RlPi4KLSAgICogQHNlZSAjZ2V0QXR0cmlidXRlKEVsZW1lbnQsU3RyaW5nKS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVMRU1FTlRfQVRUUklCVVRFID0gImVsZW1lbnQiOwotICAKLSAgLy8gaW1wb3J0Ci0gIAotICAvKioKLSAgICogVGhlIGF0dHJpYnV0ZSBpcyA8Y29kZT4ibG9jYXRpb24iPC9jb2RlPi4KLSAgICogQHNlZSAjZ2V0QXR0cmlidXRlKEVsZW1lbnQsU3RyaW5nKS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExPQ0FUSU9OX0FUVFJJQlVURSA9ICJsb2NhdGlvbiI7IAotICAKLSAgLyoqCi0gICAqIFRoZSBhdHRyaWJ1dGUgaXMgPGNvZGU+Im5hbWVzcGFjZSI8L2NvZGU+LgotICAgKiBAc2VlICNnZXRBdHRyaWJ1dGUoRWxlbWVudCxTdHJpbmcpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJuYW1lc3BhY2UiOyAgCi0KLSAgLyoqCi0gICAqIFRoZSB2YWx1ZSA8Y29kZT4iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7Ci0gIAotICAvKioKLSAgICogVGhlIHZhbHVlIDxjb2RlPiJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI8L2NvZGU+LgotICAgKi8gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIFRoZSB2YWx1ZSA8Y29kZT4iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9GT1JfU0NIRU1BX1VSSV8xOTk5ID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hIjsKLQotICAvKioKLSAgICogVGhlIHZhbHVlIDxjb2RlPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYSI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDBfMTAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiOwotCi0gIC8qKgotICAgKiBUaGUgdmFsdWUgPGNvZGU+Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUxFTUVOVF9UQUdTID0KLSAgICBuZXcgU3RyaW5nW10gewotICAgICAgQklORElOR19FTEVNRU5UX1RBRywKLSAgICAgIERFRklOSVRJT05fRUxFTUVOVF9UQUcsCi0gICAgICBET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgRkFVTFRfRUxFTUVOVF9UQUcsCi0gICAgICBJTVBPUlRfRUxFTUVOVF9UQUcsCi0gICAgICBJTlBVVF9FTEVNRU5UX1RBRywKLSAgICAgIE1FU1NBR0VfRUxFTUVOVF9UQUcsCi0gICAgICBPUEVSQVRJT05fRUxFTUVOVF9UQUcsCi0gICAgICBPVVRQVVRfRUxFTUVOVF9UQUcsCi0gICAgICBQQVJUX0VMRU1FTlRfVEFHLAotICAgICAgUE9SVF9FTEVNRU5UX1RBRywKLSAgICAgIFBPUlRfVFlQRV9FTEVNRU5UX1RBRywKLSAgICAgIFNFUlZJQ0VfRUxFTUVOVF9UQUcsCi0gICAgICBUWVBFU19FTEVNRU5UX1RBRyB9OwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgU3RyaW5nIG5hbWUgb2YgZWxlbWVudCB0YWcgZ2l2ZW4gdGhlIG5vZGVUeXBlLgotICAgKiBAcGFyYW0gbm9kZVR5cGUgYSBjb25zdGFudCBkZWZpbmVkIGluIFdTRExDb25zdGFudHMuCi0gICAqIEByZXR1cm4gZWxlbWVudCB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRFbGVtZW50VGFnKGludCBub2RlVHlwZSkKLSAgewotICAgIHJldHVybiBFTEVNRU5UX1RBR1Nbbm9kZVR5cGVdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBub2RlIHR5cGUgZ2l2ZW4gdGhlIFN0cmluZyBuYW1lIG9mIGVsZW1lbnQgdGFnLgotICAgKiBAcGFyYW0gbG9jYWxOYW1lIHRoZSBsb2NhbCBuYW1lIG9mIGVsZW1lbnQgdGFnLgotICAgKiBAcmV0dXJuIGEgbm9kZSB0eXBlIGRlZmluZWQgaW4gV1NETENvbnN0YW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vZGVUeXBlKFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEVMRU1FTlRfVEFHUy5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyhFTEVNRU5UX1RBR1NbaV0pKQotICAgICAgewotICAgICAgICByZXR1cm4gaTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIG5vZGUgdHlwZSBkZWZpbmVkIGluIFdTRExDb25zdGFudHMgZ2l2ZW4gdGhlIERPTSBub2RlLgotICAgKiBAcGFyYW0gbm9kZSBhIERPTSBub2RlLgotICAgKiBAcmV0dXJuIGEgbm9kZSB0eXBlIGRlZmluZWQgaW4gV1NETENvbnN0YW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vZGVUeXBlKE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiBpc1dTRExOYW1lc3BhY2Uobm9kZS5nZXROYW1lc3BhY2VVUkkoKSkgPyBub2RlVHlwZShub2RlLmdldExvY2FsTmFtZSgpKSA6IC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGlzIHRoZSBXU0RMIG5hbWVzcGFjZSBvciBub3QuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgYSBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGlzIHRoZSBXU0RMIG5hbWVzcGFjZSBvciBub3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXU0RMTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZXR1cm4gV1NETF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBuYW1lc3BhY2UxIGVxdWFscyB0byBuYW1lc3BhY2UyLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlMSBhIG5hbWVzcGFjZS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZTIgYSBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UxIGVxdWFscyB0byBuYW1lc3BhY2UyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmdOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZTEsIFN0cmluZyBuYW1lc3BhY2UyKQotICB7Ci0gICAgcmV0dXJuIChuYW1lc3BhY2UxID09IG51bGwgPyBuYW1lc3BhY2UyID09IG51bGwgOiBuYW1lc3BhY2UxLmVxdWFscyhuYW1lc3BhY2UyKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBhdHRyaWJ1dGUgdmFsdWUgZ2l2ZW4gdGhlIGF0dHJpYnV0ZU5hbWUgaW4gdGhlIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBlbGVtZW50IGEgRE9NIGVsZW1lbnQgdG8gc2VhcmNoIGZvciB0aGUgYXR0cmlidXRlIGZyb20uCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIGFuIGF0dHJpYnV0ZSB0byBmaW5kIGZyb20gdGhlIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYW4gYXR0cmlidXRlIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMRGlhZ25vc3RpYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExEaWFnbm9zdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjAzZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExEaWFnbm9zdGljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogR2VuZXJhdGVkIGJ5IHRoZSBXU0RMIG1vZGVsIHBhcnNpbmcgYW5kIHZhbGlkYXRpb24gbWVjaGFuaXNtcy4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGEgY2FuZGlkYXRlIHRvIGJlY29taW5nIGEgZmlyc3QgY2xhc3MgV1NETCBtb2RlbCBvYmplY3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETERpYWdub3N0aWMgZXh0ZW5kcyBSZXNvdXJjZS5EaWFnbm9zdGljCi17Ci0gIC8qKgotICAgKiBQcm92aWRlcyB0aGlzIGRpYWdub3N0aWMncyBzZXZlcml0eS4KLSAgICogCi0gICAqIEByZXR1cm4gYW4gWFNERGlhZ25vc3RpY1NldmVyaXR5Ci0gICAqLwotICBXU0RMRGlhZ25vc3RpY1NldmVyaXR5IGdldFNldmVyaXR5KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhpcyBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuCi0gICAqIAotICAgKiBAcGFyYW0gc2V2ZXJpdHkKLSAgICogICAgICAgICAgdGhlIG5ldyBkaWFnbm9zdGljIHNldmVyaXR5LgotICAgKi8KLSAgdm9pZCBzZXRTZXZlcml0eShXU0RMRGlhZ25vc3RpY1NldmVyaXR5IHNldmVyaXR5KTsKLSAgCi0gIC8qKgotICAgKiBHZXRzIHRoZSBvcmlnaW5hbCBtZXNzYWdlIGtleS4KLSAgICogCi0gICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgb3JpZ2luYWwgbWVzc2FnZSBrZXkuCi0gICAqLwotICBTdHJpbmcgZ2V0S2V5KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG9yaWdpbmFsIG1lc3NhZ2Uga2V5LgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBtZXNzYWdlIGtleSB2YWx1ZS4KLSAgICovCi0gIHZvaWQgc2V0S2V5KFN0cmluZyB2YWx1ZSk7Ci0gIAotICAvKioKLSAgICogR2V0cyB0aGUgRE9NIE5vZGUgd2hlcmUgdGhlIGVycm9yIG9jY3VycwotICAgKiAKLSAgICogQHJldHVybiBUaGUgRE9NIG5vZGUgd2hlcmUgdGhlIGVycm9yIG9jY3VycwotICAgKi8KLSAgTm9kZSBnZXROb2RlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIERPTSBOb2RlIHdoZXJlIHRoZSBlcnJvciBvY2N1cnMKLSAgICogQHBhcmFtIG5vZGUKLSAgICovCi0gIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpOwotICAKLSAgLyoqCi0gICAqIHJldHVybnMgdGhlIEVsZW1lbnQgd2hlcmUgdGhlIGVycm9yIG9jY3VycwotICAgKiBAcmV0dXJuIC0gT2JqZWN0IG9mIHR5cGUgWFNEQ29uY3JldGVDb21wb25lbnQgaWYgdGhlIGVycm9yCi0gICAqIAkJCWNvbWVzIGZyb20gdGhlIGlubGluZSBzY2hlbWEgb2YgYSB3c2RsIGZpbGUKLSAgICogCQkgLSBvYmplY3Qgb2YgdHlwZSBXU0RMRWxlbWVudCBpZiB0aGUgZXJyb3IgY29tZXMgZnJvbQotICAgKiAJCQlvdGhlciBwYXJ0IG9mIHRoZSB3c2RsIGZpbGUKLSAgICovCi0gIE9iamVjdCBnZXRDb250YWluZXIoKTsKLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBDb250YWluZXIgb2YgdGhlIGVycm9yCi0gICAqIEBwYXJhbSBjb250YWluZXIKLSAgICogCQkJYW4gT2JqZWN0IG9mIGVpdGhlciBYU0RDb25jcmV0ZUNvbXBvbmVudCBvciBXU0RMRWxlbWVudCAKLSAgICovCi0gIHZvaWQgc2V0Q29udGFpbmVyKE9iamVjdCBjb250YWluZXIpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IHdpdGggdGhlIG9yaWdpbmFsIG1lc3NhZ2UgcGFyYW1ldGVycyBhcyBTdHJpbmdzLgotICAgKiBAcmV0dXJuICBhIGxpc3Qgd2l0aCB0aGUgb3JpZ2luYWwgbWVzc2FnZSBwYXJhbWV0ZXJzIGFzIFN0cmluZ3MuCi0gICAqLwotICBFTGlzdCBnZXRTdWJzdGl0dXRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETERpYWdub3N0aWNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETERpYWdub3N0aWNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDYwZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExEaWFnbm9zdGljSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERGlhZ25vc3RpY1NldmVyaXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV1NETERpYWdub3N0aWMgaW50ZXJmYWNlLiBUaGlzIGNsYXNzIGlzIGJhc2VkCi0gKiBvbiBYU0REaWFnbm9zdGljSW1wbAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRGlhZ25vc3RpY0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdTRExEaWFnbm9zdGljCi17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uKCkgPGVtPkNvbHVtbjwvZW0+fScKLSAgICogYXR0cmlidXRlLgotICAgKiAKLSAgICogQHNlZSAjZ2V0Q29sdW1uKCkKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9FREVGQVVMVCA9IDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5lKCkgPGVtPkxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogCi0gICAqIAotICAgKiBAc2VlICNnZXRMaW5lKCkKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExJTkVfRURFRkFVTFQgPSAxOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JwotICAgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiAKLSAgICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2UoKSA8ZW0+TWVzc2FnZTwvZW0+fScKLSAgICogYXR0cmlidXRlLgotICAgKiAKLSAgICogQHNlZSAjZ2V0TWVzc2FnZSgpCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNldmVyaXR5KCkgPGVtPlNldmVyaXR5PC9lbT59JwotICAgKiBhdHRyaWJ1dGUuCi0gICAqIAotICAgKiBAc2VlICNnZXRTZXZlcml0eSgpCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkgU0VWRVJJVFlfRURFRkFVTFQgPSBXU0RMRGlhZ25vc3RpY1NldmVyaXR5LkZBVEFMX0xJVEVSQUw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogCi0gICAqIAotICAgKiBAc2VlICNnZXRDb2x1bW4oKQotICAgKiAKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBpbnQgY29sdW1uID0gQ09MVU1OX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5lKCkgPGVtPkxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogCi0gICAqIAotICAgKiBAc2VlICNnZXRMaW5lKCkKLSAgICovCi0gIHByb3RlY3RlZCBpbnQgbGluZSA9IExJTkVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScKLSAgICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogCi0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb25VUkkgPSBMT0NBVElPTl9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2UoKSA8ZW0+TWVzc2FnZTwvZW0+fScKLSAgICogYXR0cmlidXRlLgotICAgKiAKLSAgICogQHNlZSAjZ2V0TWVzc2FnZSgpCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2UgPSBNRVNTQUdFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXZlcml0eSgpIDxlbT5TZXZlcml0eTwvZW0+fScKLSAgICogYXR0cmlidXRlLgotICAgKiAKLSAgICogQHNlZSAjZ2V0U2V2ZXJpdHkoKQotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkgc2V2ZXJpdHkgPSBTRVZFUklUWV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIG9yaWdpbmFsIG1lc3NhZ2Uga2V5LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBrZXk7Ci0KLSAgLyoqCi0gICAqIFRoZSBvcmlnaW5hbCBtZXNzYWdlIHBhcmFtZXRlcnMuCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3Qgc3Vic3RpdHV0aW9uczsKLQotICAvKioKLSAgICogVGhlIE5vZGUgd2hlcmUgdGhlIGVycm9yIG9jY3VycwotICAgKi8KLSAgcHJvdGVjdGVkIE5vZGUgbm9kZTsKLSAgCi0gIC8qKgotICAgKiBUaGUgV1NETEVsZW1lbnQgb3IgWFNEQ29uY3JldGVDb21wb25lbnQgb2JqZWN0IHdoZXJlIHRoZSBlcnJvciBvY2N1cnMKLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3QgY29udGFpbmVyOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExEaWFnbm9zdGljSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyYXBzIGFuIFhTRCBkaWFnbm9zdGljIGludG8gYSBXU0RMIGRpYWdub3N0aWMuIFVzZWQgdG8gcmVwb3J0IHByb2JsZW1zIGluCi0gICAqIGlubGluZSBzY2hlbWFzLgotICAgKiAKLSAgICogQHBhcmFtIHhzZERpYWdub3N0aWMKLSAgICogICAgICAgICAgdGhlIFhTRCBkaWFnbm9zdGljIG9iamVjdCB0byB3cmFwLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFdTRExEaWFnbm9zdGljSW1wbChYU0REaWFnbm9zdGljIHhzZERpYWdub3N0aWMpCi0gIHsKLSAgICB0aGlzKCk7Ci0gICAgc2V0TWVzc2FnZSh4c2REaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7Ci0gICAgc2V0U2V2ZXJpdHkoZ2V0U2V2ZXJpdHkoeHNkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpKSk7Ci0gICAgc2V0TGluZSh4c2REaWFnbm9zdGljLmdldExpbmUoKSk7Ci0gICAgc2V0Q29sdW1uKHhzZERpYWdub3N0aWMuZ2V0Q29sdW1uKCkpOwotICAgIHNldE5vZGUoeHNkRGlhZ25vc3RpYy5nZXROb2RlKCkpOwotICAgIHNldENvbnRhaW5lcih4c2REaWFnbm9zdGljLmdldENvbnRhaW5lcigpKTsKLSAgICBzZXRMb2NhdGlvbih4c2REaWFnbm9zdGljLmdldExvY2F0aW9uKCkpOwotICAgIHNldEtleSh4c2REaWFnbm9zdGljLmdldEtleSgpKTsKLSAgICBnZXRTdWJzdGl0dXRpb25zKCkuYWRkQWxsKHhzZERpYWdub3N0aWMuZ2V0U3Vic3RpdHV0aW9ucygpKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlJERpYWdub3N0aWMjZ2V0Q29sdW1uKCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkKLSAgewotICAgIHJldHVybiBjb2x1bW47Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSREaWFnbm9zdGljI2dldExpbmUoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lKCkKLSAgewotICAgIHJldHVybiBsaW5lOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UkRGlhZ25vc3RpYyNnZXRMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvblVSSTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlJERpYWdub3N0aWMjZ2V0TWVzc2FnZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIGNvbS5pYm0uY2NsLndzZGwudmFsaWRhdGlvbi5XU0RMRGlhZ25vc3RpYyNnZXRTZXZlcml0eSgpCi0gICAqLwotICBwdWJsaWMgV1NETERpYWdub3N0aWNTZXZlcml0eSBnZXRTZXZlcml0eSgpCi0gIHsKLSAgICByZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgYW4gWFNEIGRpYWdub3N0aWMgc2V2ZXJpdHkgbGV2ZWwgaW50byBhIFdTREwgZGlhZ25vc3RpYyBzZXZlcml0eQotICAgKiBsZXZlbC4KLSAgICogCi0gICAqIEBwYXJhbSB4c2REaWFnbm9zdGljU2V2ZXJpdHkKLSAgICogICAgICAgICAgdGhlIHNvdXJjZSBYU0QgZGlhZ25vc3RpYyBzZXZlcml0eS4KLSAgICogQHJldHVybiB0aGUgZXF1aXZhbGVudCBXU0RMIGRpYWdub3N0aWMgc2V2ZXJpdHkuCi0gICAqLwotICBwcml2YXRlIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoWFNERGlhZ25vc3RpY1NldmVyaXR5IHhzZERpYWdub3N0aWNTZXZlcml0eSkKLSAgewotICAgIHN3aXRjaCAoeHNkRGlhZ25vc3RpY1NldmVyaXR5LmdldFZhbHVlKCkpCi0gICAgewotICAgIGNhc2UgWFNERGlhZ25vc3RpY1NldmVyaXR5LkZBVEFMOgotICAgICAgcmV0dXJuIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkuRkFUQUxfTElURVJBTDsKLSAgICBjYXNlIFhTRERpYWdub3N0aWNTZXZlcml0eS5FUlJPUjoKLSAgICAgIHJldHVybiBXU0RMRGlhZ25vc3RpY1NldmVyaXR5LkVSUk9SX0xJVEVSQUw7Ci0gICAgY2FzZSBYU0REaWFnbm9zdGljU2V2ZXJpdHkuV0FSTklORzoKLSAgICAgIHJldHVybiBXU0RMRGlhZ25vc3RpY1NldmVyaXR5LldBUk5JTkdfTElURVJBTDsKLSAgICBjYXNlIFhTRERpYWdub3N0aWNTZXZlcml0eS5JTkZPUk1BVElPTjoKLSAgICAgIHJldHVybiBXU0RMRGlhZ25vc3RpY1NldmVyaXR5LklORk9STUFUSU9OX0xJVEVSQUw7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gU0VWRVJJVFlfRURFRkFVTFQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjb2x1bW4gYXR0cmlidXRlLgotICAgKiAKLSAgICogQHBhcmFtIG5ld0NvbHVtbgotICAgKiAgICAgICAgICB0aGUgbmV3IGNvbHVtbiB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbHVtbihpbnQgbmV3Q29sdW1uKQotICB7Ci0gICAgY29sdW1uID0gbmV3Q29sdW1uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGluZShpbnQgbmV3TGluZSkKLSAgewotICAgIGxpbmUgPSBuZXdMaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsb2FjdGlvbiBhdHRyaWJ1dGUuCi0gICAqIAotICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICogICAgICAgICAgYSBTdHJpbmcgd2l0aCB0aGUgbmV3IHZhbHVlIGZvciB0aGUgbG9jYXRpb24gYXR0cmlidXRlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBsb2NhdGlvblVSSSA9IGxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgYSBuZXcgdmFsdWUgZm9yIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZS4KLSAgICogCi0gICAqIEBwYXJhbSBuZXdNZXNzYWdlCi0gICAqICAgICAgICAgIGEgU3RyaW5nIHdpdGggdGhlIG5ldyBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSkKLSAgewotICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBjb20uaWJtLmNjbC53c2RsLnZhbGlkYXRpb24uV1NETERpYWdub3N0aWMjc2V0U2V2ZXJpdHkoY29tLmlibS5jY2wud3NkbC52YWxpZGF0aW9uLldTRExEaWFnbm9zdGljU2V2ZXJpdHkpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShXU0RMRGlhZ25vc3RpY1NldmVyaXR5IG5ld1NldmVyaXR5KQotICB7Ci0gICAgc2V2ZXJpdHkgPSBuZXdTZXZlcml0eSA9PSBudWxsID8gU0VWRVJJVFlfRURFRkFVTFQgOiBuZXdTZXZlcml0eTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMRGlhZ25vc3RpYyNnZXRLZXkoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICB7Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExEaWFnbm9zdGljI3NldEtleShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGtleSA9IHZhbHVlOwotICB9Ci0gIAotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMRGlhZ25vc3RpYyNnZXRTdWJzdGl0dXRpb25zKCkKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRTdWJzdGl0dXRpb25zKCkKLSAgewotICAgIGlmIChzdWJzdGl0dXRpb25zID09IG51bGwpCi0gICAgewotICAgICAgc3Vic3RpdHV0aW9ucyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0gICAgfQotICAgIHJldHVybiBzdWJzdGl0dXRpb25zOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMRGlhZ25vc3RpYyNnZXROb2RlKCkKLSAgICovCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoKSAKLSAgewotCXJldHVybiBub2RlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMRGlhZ25vc3RpYyNzZXROb2RlKG9yZy53M2MuZG9tLk5vZGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgCi0gIHsKLQl0aGlzLm5vZGUgPSBub2RlOyAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExEaWFnbm9zdGljI2dldENvbnRhaW5lcigpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldENvbnRhaW5lcigpIHsKLQlyZXR1cm4gY29udGFpbmVyOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMRGlhZ25vc3RpYyNzZXRDb250YWluZXIoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihPYmplY3QgY29udGFpbmVyKSB7Ci0JdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMRGlhZ25vc3RpY1NldmVyaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETERpYWdub3N0aWNTZXZlcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzFmZjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMRGlhZ25vc3RpY1NldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIFdTREwgZGlhZ25vc3RpYyBzZXZlcml0eSBsZXZlbHMgdHlwZSBzYWZlIGVudW1lcmF0aW9uLiBUaGlzIGNsYXNzIGlzIHNpbWlsYXIKLSAqIHRvIFhTRERpYWdub3N0aWNTZXZlcml0eS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETERpYWdub3N0aWNTZXZlcml0eSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotICAvKioKLSAgICogVGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2JsZW0gaXMgcmVhbGx5IGJhZCBhbmQgdGhhdCBmdXJ0aGVyCi0gICAqIHByb2Nlc3NpbmcgaXMgbGlrZWx5IG5vdCBwb3NzaWJsZS4KLSAgICogCi0gICAqIEBzZWUgI0ZBVEFMX0xJVEVSQUwKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBVEFMID0gMDsKLQotICAvKioKLSAgICogVGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2JsZW0gaXMgYmFkIGFuZCB0aGF0IHRoZSBzY2hlbWEgaXMKLSAgICogbGlrZWx5IG5vdCBzdWl0YWJsZSBmb3IgdXNlLgotICAgKiAKLSAgICogQHNlZSAjRVJST1JfTElURVJBTAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAxOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvYmxlbSBpcyBub3QgdG9vIGJhZCBhbmQgdGhhdCB0aGUKLSAgICogZGVmaW5pdGlvbiBpcyBsaWtlbHkgc3VpdGFibGUgZm9yIHVzZS4KLSAgICogCi0gICAqIEBzZWUgI1dBUk5JTkdfTElURVJBTAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9ibGVtIGlzIG9ubHkgcG90ZW50aWFsIGFuZCB0aGF0IHRoZQotICAgKiBkZWZpbml0aW9uIGlzIHZlcnkgbGlrZWx5IHN1aXRhYmxlIGZvciB1c2UuCi0gICAqIAotICAgKiBAc2VlICNJTkZPUk1BVElPTl9MSVRFUkFMCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPUk1BVElPTiA9IDM7Ci0KLSAgLyoqCi0gICAqIFRoZSAnPGVtPjxiPkZhdGFsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLSAgICogCi0gICAqIEBzZWUgI0ZBVEFMCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkgRkFUQUxfTElURVJBTCA9IG5ldyBXU0RMRGlhZ25vc3RpY1NldmVyaXR5KEZBVEFMLCAiZmF0YWwiLCAiZmF0YWwiKTsKLQotICAvKioKLSAgICogVGhlICc8ZW0+PGI+RXJyb3I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotICAgKiAKLSAgICogQHNlZSAjRVJST1IKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV1NETERpYWdub3N0aWNTZXZlcml0eSBFUlJPUl9MSVRFUkFMID0gbmV3IFdTRExEaWFnbm9zdGljU2V2ZXJpdHkoRVJST1IsICJlcnJvciIsICJlcnJvciIpOwotCi0gIC8qKgotICAgKiBUaGUgJzxlbT48Yj5XYXJuaW5nPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLSAgICogCi0gICAqIEBzZWUgI1dBUk5JTkcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV1NETERpYWdub3N0aWNTZXZlcml0eSBXQVJOSU5HX0xJVEVSQUwgPSBuZXcgV1NETERpYWdub3N0aWNTZXZlcml0eShXQVJOSU5HLCAid2FybmluZyIsICJ3YXJuaW5nIik7Ci0KLSAgLyoqCi0gICAqIFRoZSAnPGVtPjxiPkluZm9ybWF0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLSAgICogCi0gICAqIEBzZWUgI0lORk9STUFUSU9OCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkgSU5GT1JNQVRJT05fTElURVJBTCA9IG5ldyBXU0RMRGlhZ25vc3RpY1NldmVyaXR5KElORk9STUFUSU9OLCAiaW5mb3JtYXRpb24iLCAiaW5mb3JtYXRpb24iKTsKLQotICAvKioKLSAgICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRpYWdub3N0aWMgU2V2ZXJpdHk8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV1NETERpYWdub3N0aWNTZXZlcml0eVtdIFZBTFVFU19BUlJBWSA9IG5ldyBXU0RMRGlhZ25vc3RpY1NldmVyaXR5W10geyBGQVRBTF9MSVRFUkFMLCBFUlJPUl9MSVRFUkFMLCBXQVJOSU5HX0xJVEVSQUwsIElORk9STUFUSU9OX0xJVEVSQUwsIH07Ci0KLSAgLyoqCi0gICAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EaWFnbm9zdGljIFNldmVyaXR5PC9iPjwvZW0+JwotICAgKiBlbnVtZXJhdG9ycy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlhZ25vc3RpYyBTZXZlcml0eTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotICAgKiBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NETERpYWdub3N0aWNTZXZlcml0eSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBXU0RMRGlhZ25vc3RpY1NldmVyaXR5IHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgIGlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlhZ25vc3RpYyBTZXZlcml0eTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotICAgKiBzcGVjaWZpZWQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NETERpYWdub3N0aWNTZXZlcml0eSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBXU0RMRGlhZ25vc3RpY1NldmVyaXR5IHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgIGlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5EaWFnbm9zdGljIFNldmVyaXR5PC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0gICAqIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXU0RMRGlhZ25vc3RpY1NldmVyaXR5IGdldChpbnQgdmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKHZhbHVlKQotICAgIHsKLSAgICBjYXNlIEZBVEFMOgotICAgICAgcmV0dXJuIEZBVEFMX0xJVEVSQUw7Ci0gICAgY2FzZSBFUlJPUjoKLSAgICAgIHJldHVybiBFUlJPUl9MSVRFUkFMOwotICAgIGNhc2UgV0FSTklORzoKLSAgICAgIHJldHVybiBXQVJOSU5HX0xJVEVSQUw7Ci0gICAgY2FzZSBJTkZPUk1BVElPTjoKLSAgICAgIHJldHVybiBJTkZPUk1BVElPTl9MSVRFUkFMOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0gICAqLwotICBwcml2YXRlIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0gIHsKLSAgICBzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM2NTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogVGhlIDxiPlNBWCBQYXJzZXI8L2I+IGZvciB0aGUgV1NETCBtb2RlbC4gVGhpcyBjbGFzcycgbWFpbiByZXNwb25zaWJpbGl0eSBpcwotICogdG8gY29tcHV0ZSBsaW5lL2NvbHVtbiBpbmZvcm1hdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGluIHRoZSBzb3VyY2UgWE1MCi0gKiBkb2N1bWVudC4gVGhpcyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYSBtYXAgb2YgZWFjaCBub2RlIHRvIGl0cyB1c2VyIGRhdGEuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogW0lTU1VFXSBNb3N0IG9mIHRoaXMgY2xhc3MnIGltcGxlbWVudGF0aW9uIGlzIGEgY2xvbmUgb2YgWFNEUGFyc2VyLiBUaGVyZSBhcmUKLSAqIHBsYW5zIHRvIHdvcmsgb24gY2xvc2VseSBpbnRlZ3JhdGluZyB0aGlzIGNsYXNzIGFuZCBYU0RQYXJzZXIgdG8gcHJvdmlkZSBmb3IKLSAqIHRoZSBtb3N0IGVmZmljaWVudCBwcm9jZXNzaW5nIG9mIGlubGluZSBzY2hlbWFzLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgTGV4aWNhbEhhbmRsZXIKLXsKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGRhdGEgcGFydCBob2xkaW5nIGVuZCBjb2x1bW4gbG9jYXRpb24gb2YgYW4gZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfQ09MVU1OID0gImVuZENvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIHVzZXIgZGF0YSBwYXJ0IGhvbGRpbmcgZW5kIGxpbmUgbG9jYXRpb24gb2YgYW4gZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfTElORSA9ICJlbmRMaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgdXNlciBkYXRhIHBhcnQgaG9sZGluZyBzdGFydCBjb2x1bW4gbG9jYXRpb24gb2YgYW4gZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9DT0xVTU4gPSAic3RhcnRDb2x1bW4iOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGRhdGEgcGFydCBob2xkaW5nIHN0YXJ0IGxpbmUgbG9jYXRpb24gb2YgYW4gZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9MSU5FID0gInN0YXJ0TGluZSI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogSG9sZHMgcGFpcnMgTm9kZSAtPiBNYXAgd2l0aCB1c2VyIGRhdGEuCi0gICAqIAotICAgKiBAc2VlICNFTkRfQ09MVU1OCi0gICAqIEBzZWUgI0VORF9MSU5FCi0gICAqIEBzZWUgI1NUQVJUX0NPTFVNTgotICAgKiBAc2VlICNTVEFSVF9MSU5FCi0gICAqIAotICAgKiBBIFdlYWtIYXNoTWFwIGlzIHVzZWQgaW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhpcyBtYXAncyBtYWludGVuYW5jZS4gQXMgbm9kZXMKLSAgICogYXJlIGdhcmJhZ2UgY29sbGVjdGVkIHdoZW4gbm90IG5lZWRlZCBhbnltb3JlLCB0aGUgSlZNIHdpbGwgdGFrZSBjYXJlIG9mCi0gICAqIHJlbW92aW5nIGVudHJpZXMgZnJvbSB0aGlzIG1hcC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIHVzZXJEYXRhTWFwID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcCgpKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29sdW1uIGF0IHdoaWNoIHRoZSBnaXZlbiBub2RlIGVuZHMuCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZQotICAgKiAgICAgICAgICB0aGUgbm9kZSB0byBxdWVyeS4KLSAgICogQHJldHVybiB0aGUgY29sdW1uIGF0IHdoaWNoIHRoZSBnaXZlbiBub2RlIGVuZHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRFbmRDb2x1bW4oTm9kZSBub2RlKQotICB7Ci0gICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcikgZ2V0VXNlckRhdGEobm9kZSkuZ2V0KEVORF9DT0xVTU4pOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IDEgOiByZXN1bHQuaW50VmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsaW5lIGF0IHdoaWNoIHRoZSBnaXZlbiBub2RlIGVuZHMuCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZQotICAgKiAgICAgICAgICB0aGUgbm9kZSB0byBxdWVyeS4KLSAgICogQHJldHVybiB0aGUgbGluZSBhdCB3aGljaCB0aGUgZ2l2ZW4gbm9kZSBlbmRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RW5kTGluZShOb2RlIG5vZGUpCi0gIHsKLSAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKSBnZXRVc2VyRGF0YShub2RlKS5nZXQoRU5EX0xJTkUpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IDEgOiByZXN1bHQuaW50VmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gYXQgd2hpY2ggdGhlIGdpdmVuIG5vZGUgc3RhcnRzLgotICAgKiAKLSAgICogQHBhcmFtIG5vZGUKLSAgICogICAgICAgICAgdGhlIG5vZGUgdG8gcXVlcnkuCi0gICAqIEByZXR1cm4gdGhlIGNvbHVtbiBhdCB3aGljaCB0aGUgZ2l2ZW4gbm9kZSBzdGFydHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRTdGFydENvbHVtbihOb2RlIG5vZGUpCi0gIHsKLSAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKSBnZXRVc2VyRGF0YShub2RlKS5nZXQoU1RBUlRfQ09MVU1OKTsKLSAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAxIDogcmVzdWx0LmludFZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGluZSBhdCB3aGljaCB0aGUgZ2l2ZW4gbm9kZSBzdGFydHMuCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZQotICAgKiAgICAgICAgICB0aGUgbm9kZSB0byBxdWVyeS4KLSAgICogQHJldHVybiB0aGUgbGluZSBhdCB3aGljaCB0aGUgZ2l2ZW4gbm9kZSBzdGFydHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRTdGFydExpbmUoTm9kZSBub2RlKQotICB7Ci0gICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcikgZ2V0VXNlckRhdGEobm9kZSkuZ2V0KFNUQVJUX0xJTkUpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IDEgOiByZXN1bHQuaW50VmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1c2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlLiBJZiB0aGUgbm9kZSBoYXMgbm8gdXNlcgotICAgKiBkYXRhLCBhIG5ldyBlbXB0eSBtYXAgaXMgY3JlYXRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBub2RlCi0gICAqICAgICAgICAgIHRoZSBub2RlIHRvIHF1ZXJ5LgotICAgKiBAcmV0dXJuIHRoZSB1c2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBNYXAgZ2V0VXNlckRhdGEoTm9kZSBub2RlKQotICB7Ci0gICAgTWFwIHJlc3VsdCA9IChNYXApIHVzZXJEYXRhTWFwLmdldChub2RlKTsKLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgIHVzZXJEYXRhTWFwLnB1dChub2RlLCByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBjb2x1bW47Ci0gIExpc3QgZGlhZ25vc3RpY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLSAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLSAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaW5TY2hlbWE7Ci0gIHByb3RlY3RlZCBpbnQgbGluZTsKLSAgcHJvdGVjdGVkIExvY2F0b3IgbG9jYXRvcjsKLSAgcHJvdGVjdGVkIFNBWFBhcnNlciBzYXhQYXJzZXI7Ci0gIHByb3RlY3RlZCBTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExQYXJzZXIoKQotICB7Ci0gICAgc2F4UGFyc2VyID0gY3JlYXRlU0FYUGFyc2VyKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjY2hhcmFjdGVycyhjaGFyW10sIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2hhcmFjdGVycywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBUZXh0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3IFN0cmluZyhjaGFyYWN0ZXJzLCBzdGFydCwgbGVuZ3RoKSk7Ci0gICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgc2F2ZUxvY2F0aW9uKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNjb21tZW50KGNoYXJbXSwgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21tZW50KGNoYXJbXSBjaGFyYWN0ZXJzLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIENvbW1lbnQgY29tbWVudE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KG5ldyBTdHJpbmcoY2hhcmFjdGVycywgc3RhcnQsIGxlbmd0aCkpOwotICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgewotICAgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoY29tbWVudE5vZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb21tZW50Tm9kZSk7Ci0gICAgfQotICAgIHNhdmVMb2NhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZW1wdHkgRE9NIERvY3VtZW50LgotICAgKiAKLSAgICogQHJldHVybiBhbiBlbXB0eSBET00gRG9jdW1lbnQgb3IgbnVsbCBpcyBhIEpBWFAgbWlzY29uZmlndXJhdGlvbiBlcnJvcgotICAgKiAgICAgICAgIG9jY3Vycy4KLSAgICovCi0gIHByaXZhdGUgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIFdTRExQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgU0FYUGFyc2VyIGluc3RhbmNlIHVzZWQgZm9yIHBhcnNpbmcgdGhlIHNvdXJjZSBXU0RMIFhNTAotICAgKiBkb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gYSBjb25maWd1cmVkIFNBWFBhcnNlciBpbnN0YW5jZSBvciBudWxsIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCi0gICAqICAgICAgICAgUHJvYmxlbXMgYXJlIHJlcG9ydGVkIHRocm91Z2ggdGhlIGRpYWdub3N0aWNzIGNvbGxlY3Rpb24uCi0gICAqLwotICBwcml2YXRlIFNBWFBhcnNlciBjcmVhdGVTQVhQYXJzZXIoKQotICB7Ci0gICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhQYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgc2F4UGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIHNheFBhcnNlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0KLSAgICAgIHNheFBhcnNlckZhY3Rvcnkuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtTiQKLSAgICAgIHNheFBhcnNlckZhY3Rvcnkuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLCB0cnVlKTsgLy8kTk9OLU5MUy1OJAotICAgICAgc2F4UGFyc2VyRmFjdG9yeS5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtTiQKLQotICAgICAgc2F4UGFyc2VyID0gc2F4UGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQotICAgICAgc2F4UGFyc2VyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCB0aGlzKTsgLy8kTk9OLU5MUy1OJAotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBmYXRhbEVycm9yKGV4Y2VwdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBmYXRhbEVycm9yKGV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNheFBhcnNlcjsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZENEQVRBKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZENEQVRBKCkKLSAgewotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI2VuZERvY3VtZW50KCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkKLSAgewotICAgIGVsZW1lbnQgPSBudWxsOwotICAgIHNhdmVMb2NhdGlvbigpOwotICAgIHRoaXMubG9jYXRvciA9IG51bGw7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmREVEQoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kRFREKCkKLSAgewotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIHNhdmVMb2NhdGlvbigpOwotCi0gICAgTWFwIGV4dGVuZGVkQXR0cmlidXRlcyA9IG51bGw7Ci0KLSAgICBpZiAoaW5TY2hlbWEpCi0gICAgewotICAgICAgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gWFNEUGFyc2VyLmdldFVzZXJEYXRhKGVsZW1lbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gZ2V0VXNlckRhdGEoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgZXh0ZW5kZWRBdHRyaWJ1dGVzLnB1dChFTkRfTElORSwgbmV3IEludGVnZXIobGluZSkpOwotICAgIGV4dGVuZGVkQXR0cmlidXRlcy5wdXQoRU5EX0NPTFVNTiwgbmV3IEludGVnZXIoY29sdW1uKSk7Ci0KLSAgICBpZiAoaXNTY2hlbWFFbGVtZW50KHVyaSwgbG9jYWxOYW1lKSkKLSAgICB7Ci0gICAgICBpblNjaGVtYSA9IGZhbHNlOwotICAgIH0KLQotICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgc3RhY2sucG9wKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmRFbnRpdHkoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKQotICB7Ci0gICAgV1NETERpYWdub3N0aWNJbXBsIGRpYWdub3N0aWMgPSBuZXcgV1NETERpYWdub3N0aWNJbXBsKCk7Ci0gICAgZGlhZ25vc3RpYy5zZXRTZXZlcml0eShXU0RMRGlhZ25vc3RpY1NldmVyaXR5LkVSUk9SX0xJVEVSQUwpOwotICAgIGRpYWdub3N0aWMuc2V0TWVzc2FnZShXU0RMUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0lPRXJyb3JfbWVzc2FnZSIsIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgfSkpOwotICAgIGRpYWdub3N0aWMuc2V0TGluZShleGNlcHRpb24uZ2V0TGluZU51bWJlcigpKTsKLSAgICBkaWFnbm9zdGljLnNldENvbHVtbihleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCkpOwotICAgIGRpYWdub3N0aWNzLmFkZChkaWFnbm9zdGljKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGZhdGFsRXJyb3IoSU9FeGNlcHRpb24gZXhjZXB0aW9uKQotICB7Ci0gICAgV1NETERpYWdub3N0aWNJbXBsIGRpYWdub3N0aWMgPSBuZXcgV1NETERpYWdub3N0aWNJbXBsKCk7Ci0gICAgZGlhZ25vc3RpYy5zZXRTZXZlcml0eShXU0RMRGlhZ25vc3RpY1NldmVyaXR5LkZBVEFMX0xJVEVSQUwpOwotICAgIGRpYWdub3N0aWMuc2V0TWVzc2FnZShXU0RMUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0lPRXJyb3JfbWVzc2FnZSIsIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgfSkpOwotICAgIGRpYWdub3N0aWNzLmFkZChkaWFnbm9zdGljKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGZhdGFsRXJyb3IoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pCi0gIHsKLSAgICBXU0RMRGlhZ25vc3RpY0ltcGwgZGlhZ25vc3RpYyA9IG5ldyBXU0RMRGlhZ25vc3RpY0ltcGwoKTsKLSAgICBkaWFnbm9zdGljLnNldFNldmVyaXR5KFdTRExEaWFnbm9zdGljU2V2ZXJpdHkuRkFUQUxfTElURVJBTCk7Ci0gICAgZGlhZ25vc3RpYy5zZXRNZXNzYWdlKFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUGFyc2VyRXJyb3JfbWVzc2FnZSIsIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgfSkpOwotICAgIGRpYWdub3N0aWNzLmFkZChkaWFnbm9zdGljKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgewotICAgIFdTRExEaWFnbm9zdGljSW1wbCBkaWFnbm9zdGljID0gbmV3IFdTRExEaWFnbm9zdGljSW1wbCgpOwotICAgIGRpYWdub3N0aWMuc2V0U2V2ZXJpdHkoV1NETERpYWdub3N0aWNTZXZlcml0eS5GQVRBTF9MSVRFUkFMKTsKLSAgICBkaWFnbm9zdGljLnNldE1lc3NhZ2UoV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9QYXJzZXJFcnJvcl9tZXNzYWdlIiwgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSB9KSk7Ci0gICAgZGlhZ25vc3RpY3MuYWRkKGRpYWdub3N0aWMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pCi0gIHsKLSAgICBXU0RMRGlhZ25vc3RpY0ltcGwgZGlhZ25vc3RpYyA9IG5ldyBXU0RMRGlhZ25vc3RpY0ltcGwoKTsKLSAgICBkaWFnbm9zdGljLnNldFNldmVyaXR5KFdTRExEaWFnbm9zdGljU2V2ZXJpdHkuRkFUQUxfTElURVJBTCk7Ci0gICAgZGlhZ25vc3RpYy5zZXRNZXNzYWdlKFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUGFyc2VyRXJyb3JfbWVzc2FnZSIsIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgfSkpOwotICAgIGRpYWdub3N0aWMuc2V0TGluZShleGNlcHRpb24uZ2V0TGluZU51bWJlcigpKTsKLSAgICBkaWFnbm9zdGljLnNldENvbHVtbihleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCkpOwotICAgIGRpYWdub3N0aWNzLmFkZChkaWFnbm9zdGljKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyBhIGNvbGxlY3Rpb24gd2l0aCB0aGUgZGlhZ25vc3RpY3MgZ2VuZXJhdGVkIGR1cmluZyBwYXJzaW5nLgotICAgKiAKLSAgICogQHJldHVybiBhIENvbGxlY3Rpb24gb2Yge0BsaW5rIFdTRExEaWFnbm9zdGljfSBvYmplY3RzLgotICAgKi8KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0RGlhZ25vc3RpY3MoKQotICB7Ci0gICAgcmV0dXJuIGRpYWdub3N0aWNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBET00gZG9jdW1lbnQgY3JlYXRlZCBieSBwYXJzaW5nIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIERPTSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiBhbiBlbGVtZW50IGlzIHRoZSByb290IFhNTCBzY2hlbWEgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogICAgICAgICAgdGhlIFVSSSB0byB0ZXN0LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqICAgICAgICAgIHRoZSBlbGVtZW50J3MgbG9jYWwgbmFtZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIHRoZSByb290IFhNTCBzY2hlbWEgZWxlbWVudCwgZmFsc2UKLSAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNTY2hlbWFFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBpZiAodXJpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpICYmIGxvY2FsTmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U291cmNlIGlucHV0U291cmNlKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc2F4UGFyc2VyLnBhcnNlKGlucHV0U291cmNlLCB0aGlzKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBmYXRhbEVycm9yKGV4Y2VwdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIGlmIChkaWFnbm9zdGljcy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIGZhdGFsRXJyb3IoZXhjZXB0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSBYTUwgY29udGVudCByZWFkIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KLSAgICogCi0gICAqIEBwYXJhbSBpbnB1dFN0cmVhbQotICAgKiAgICAgICAgICB0aGUgc291cmNlIGlucHV0IHN0cmVhbS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc2F4UGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSksIHRoaXMpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIGZhdGFsRXJyb3IoZXhjZXB0aW9uKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgaWYgKGRpYWdub3N0aWNzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgZmF0YWxFcnJvcihleGNlcHRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKQotICB7Ci0gICAgTm9kZSBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKLQotICAgIGlmIChzdGFjay5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQocHJvY2Vzc2luZ0luc3RydWN0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQocHJvY2Vzc2luZ0luc3RydWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2U7Ci0gICAgaWYgKCItLy9XM0MvL0RURCBYTUxTQ0hFTUEgMjAwMTAyLy9FTiIuZXF1YWxzSWdub3JlQ2FzZShwdWJsaWNJZCkpCi0gICAgewotICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoWFNEUGx1Z2luLklOU1RBTkNFLmdldEJhc2VVUkwoKSArICJjYWNoZS93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLmR0ZCIpOwotICAgICAgaW5wdXRTb3VyY2Uuc2V0UHVibGljSWQocHVibGljSWQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzeXN0ZW1JZCAhPSBudWxsICYmIHN5c3RlbUlkLnN0YXJ0c1dpdGgoImZpbGU6Ly9idW5kbGVlbnRyeToiKSkKLSAgICB7Ci0gICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShzeXN0ZW1JZC5zdWJzdHJpbmcoNykpOwotICAgICAgaW5wdXRTb3VyY2Uuc2V0UHVibGljSWQocHVibGljSWQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlucHV0U291cmNlID0gc3VwZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgICBpZiAoZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBpbnB1dFNvdXJjZTsKLSAgfQotCi0gIC8qKgotICAgKiBTYXZlcyB0aGUgY3VycmVudCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNhdmVMb2NhdGlvbigpCi0gIHsKLSAgICBsaW5lID0gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgY29sdW1uID0gbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKTsKLQotICAgIC8vIFRoZSBjcmltc29uIHBhcnNlciBzZWVtcyB0byBnaXZlIHBvb3IgY29vZGluYXRlcyBhbmQgaXMgMC1iYXNlZCBmb3IgbGluZQotICAgIC8vIGNvdW50LgotCi0gICAgaWYgKGNvbHVtbiA9PSAtMSkKLSAgICB7Ci0gICAgICBjb2x1bW4gPSAxOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNzZXREb2N1bWVudExvY2F0b3Iob3JnLnhtbC5zYXguTG9jYXRvcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotICAgIHN1cGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0Q0RBVEEoKQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRDREFUQSgpCi0gIHsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNzdGFydERvY3VtZW50KCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKQotICB7Ci0gICAgc2F2ZUxvY2F0aW9uKCk7Ci0gICAgZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudCgpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjc3RhcnREVEQoamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCFpblNjaGVtYSkKLSAgICB7Ci0gICAgICBpblNjaGVtYSA9IGlzU2NoZW1hRWxlbWVudCh1cmksIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgcU5hbWUpOwotCi0gICAgZm9yIChpbnQgaW5kZXggPSAwLCBjb3VudCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHJpYnV0ZVVSSSA9IGF0dHJpYnV0ZXMuZ2V0VVJJKGluZGV4KTsKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVRTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaW5kZXgpOwotICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpbmRleCk7Ci0KLSAgICAgIGlmIChhdHRyaWJ1dGVRTmFtZS5lcXVhbHMoInhtbG5zIikgfHwgYXR0cmlidXRlUU5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVVUkkgPSBYU0RDb25zdGFudHMuWE1MTlNfVVJJXzIwMDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgiIi5lcXVhbHMoYXR0cmlidXRlVVJJKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVVUkkgPSBudWxsOwotICAgICAgfQotCi0gICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZU5TKGF0dHJpYnV0ZVVSSSwgYXR0cmlidXRlUU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhY2suaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGRvY3VtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwotICAgIGVsZW1lbnQgPSBuZXdFbGVtZW50OwotCi0gICAgLy8gTWFrZSBzdXJlIHdlIGxvY2F0aW9uIGF0dHJpYnV0ZXMgZW5kIHVwIGluIHRoZSBYU0RQYXJzZXIncyB1c2VyIGRhdGEgaWYKLSAgICAvLyB3ZSBhcmUgaW5zaWRlIGFuIGlubGluZSBzY2hlbWEuIElmIG5vdCwgdGhleSBzaG91bGQgZ28gaW4gdGhlCi0gICAgLy8gV1NETFBhcnNlcidzIHVzZXIgZGF0YS4KLQotICAgIE1hcCBleHRlbmRlZEF0dHJpYnV0ZXMgPSBudWxsOwotCi0gICAgaWYgKGluU2NoZW1hKQotICAgIHsKLSAgICAgIGV4dGVuZGVkQXR0cmlidXRlcyA9IFhTRFBhcnNlci5nZXRVc2VyRGF0YShlbGVtZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVuZGVkQXR0cmlidXRlcyA9IGdldFVzZXJEYXRhKGVsZW1lbnQpOwotICAgIH0KLSAgICBleHRlbmRlZEF0dHJpYnV0ZXMucHV0KFNUQVJUX0xJTkUsIG5ldyBJbnRlZ2VyKGxpbmUpKTsKLSAgICBleHRlbmRlZEF0dHJpYnV0ZXMucHV0KFNUQVJUX0NPTFVNTiwgbmV3IEludGVnZXIoY29sdW1uKSk7Ci0KLSAgICBzYXZlTG9jYXRpb24oKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0RW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkKLSAgewotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgewotICAgIFdTRExEaWFnbm9zdGljSW1wbCBkaWFnbm9zdGljID0gbmV3IFdTRExEaWFnbm9zdGljSW1wbCgpOwotICAgIGRpYWdub3N0aWMuc2V0U2V2ZXJpdHkoV1NETERpYWdub3N0aWNTZXZlcml0eS5XQVJOSU5HX0xJVEVSQUwpOwotICAgIGRpYWdub3N0aWMuc2V0TWVzc2FnZSgiRE9NOiIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICBkaWFnbm9zdGljLnNldExpbmUoZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSk7Ci0gICAgZGlhZ25vc3RpYy5zZXRDb2x1bW4oZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpKTsKLSAgICBkaWFnbm9zdGljcy5hZGQoZGlhZ25vc3RpYyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2ZTI3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBsb2FkaW5nIG9mIFdTREwgb3IgWFNEIHJlc291cmNlIGZyb20KLSAqIFVSSSdzIHRoYXQgZG9uJ3QgZW5kIHdpdGggLnhzZCBvciAud3NkbCBleHRlbnNpb25zLgotICogCi0gKiBUaGVzZSBVUkkncyBmb2lsIEVNRidzIHN0YW5kYXJkIHJlc291cmNlIGxvYWRpbmcgbWVjaGFuaXNtIHdpY2ggYXNzdW1lcyB0aGF0Ci0gKiBhIHJlc291cmNlIHR5cGUgY2FuIGFsd2F5cyBiZSBkZWR1Y2VkIGZyb20gdGhlIGZpbGUgZXh0ZW5zaW9uLgotICogCi0gKiAgQ29kZSBFeGFtcGxlOgotICogICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gKiAgICBXU0RMUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgV1NETFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UpOwotICogICAgcmVzb3VyY2VTZXQuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkocmVnaXN0cnkpOwotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBpbXBsZW1lbnRzIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLXsKLSAgcHJvdGVjdGVkIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgcGFyZW50OwotCi0gIHB1YmxpYyBXU0RMUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSBwYXJlbnQpCi0gIHsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotCi0gIHB1YmxpYyBNYXAgZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkKLSAgewotICAgIHJldHVybiBwYXJlbnQuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCk7Ci0gIH0KLQotICBwdWJsaWMgTWFwIGdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkKLSAgewotICAgIHJldHVybiBwYXJlbnQuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKTsKLSAgfQotCi0gIHB1YmxpYyBGYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSkKLSAgewotICAgIFN0cmluZyB1cmlTdHJpbmcgPSB1cmkudG9TdHJpbmcoKTsKLQotICAgIEZhY3RvcnkgZmFjdG9yeSA9IHBhcmVudC5nZXRGYWN0b3J5KHVyaSk7Ci0gICAgRmFjdG9yeSBkZWZhdWx0RmFjdG9yeSA9IChGYWN0b3J5KSBJTlNUQU5DRS5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkoREVGQVVMVF9FWFRFTlNJT04pKTsKLQotICAgIC8vIGdpdmUgdGhlIHBhcmVudCB0aGUgZmlyc3QgY3JhY2sgYXQgZ2V0dGluZyB0aGUgZmFjdG9yeQotICAgIC8vIGlmIHRoZSBmYWN0b3J5IGlzIG51bGwgb3IgdGhlIGtub3duICdkZWZhdWx0JyBmYWN0b3J5IHRoZW4gd2UnbGwKLSAgICAvLyB0cnkgdG8gY29tcHV0ZSB0aGUgZmFjdG9yeSBvdXJzZWx2ZXMKLSAgICBpZiAoZmFjdG9yeSA9PSBudWxsIHx8IGZhY3RvcnkgPT0gZGVmYXVsdEZhY3RvcnkpCi0gICAgewotICAgICAgaWYgKHVyaVN0cmluZy5lbmRzV2l0aCgid3NkbCIpIHx8IHVyaVN0cmluZy5lbmRzV2l0aCgiV1NETCIpKQotICAgICAgewotICAgICAgICAvLyBoYW5kbGUgY2FzZXMgbGlrZSAiaHR0cDovL3h4eC9EaXN0YW5jZS5qd3M/d3NkbCIKLSAgICAgICAgLy8gICAgICAgICAgCQotICAgICAgICBmYWN0b3J5ID0gcGFyZW50LmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSSgiKi53c2RsIikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodXJpU3RyaW5nLmVuZHNXaXRoKCJ4c2QiKSB8fCB1cmlTdHJpbmcuZW5kc1dpdGgoIlhTRCIpKQotICAgICAgewotICAgICAgICAvLyBoYW5kbGUgY2FzZXMgbGlrZSAiaHR0cDovL3h4eC9EaXN0YW5jZS5qd3M/eHNkIgotICAgICAgICAvLyAgICAgICAgCQotICAgICAgICBmYWN0b3J5ID0gcGFyZW50LmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSSgiKi54c2QiKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vaWYgKHVyaS5maWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAvLyBoYW5kbGUgY2FzZXMgbGlrZSAiaHR0cDovL3h4eC9leGFtcGxlP2dldFF1b3RlIgotICAgICAgICAvLyAgICAgICAgICAgICAgCQotICAgICAgICAvLyBmaW5hbGx5IHdlIG11c3QgcmVzb3J0IHRvIG9wZW5pbmcgdGhlIHVyaSdzIHN0cmVhbSBhbmQKLSAgICAgICAgLy8gcGVla2luZyBhdCB0aGUgY29udGVudCB0byBkZXRlcm1pbmUgaWYgaXRzIGFuIHhzZCBvciB3c2RsCi0gICAgICAgIC8vICAgICAgICAgCQotICAgICAgICBTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gZ2V0Um9vdEVsZW1lbnROYW1lKHVyaVN0cmluZyk7Ci0gICAgICAgIGlmIChyb290RWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChyb290RWxlbWVudE5hbWUuZXF1YWxzKCJzY2hlbWEiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gcGFyZW50LmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSSgiKi54c2QiKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHJvb3RFbGVtZW50TmFtZS5lcXVhbHMoImRlZmluaXRpb25zIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmFjdG9yeSA9IHBhcmVudC5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkoIioud3NkbCIpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLQotICAvLyB0aGlzIG1ldGhvZCB1c2VzIGEgU0FYIFBhcnNlciB0byBwYXJzZXIgYSBzdHJlYW0gYW5kIGRldGVybWluZSB0aGUgcm9vdCBlbGVtZW50IG5hbWUKLSAgLy8gb2YgYW55IHhtbCBjb250ZW50Ci0gIHByaXZhdGUgU3RyaW5nIGdldFJvb3RFbGVtZW50TmFtZShTdHJpbmcgdXJpKQotICB7Ci0gICAgUm9vdEVsZW1lbnROYW1lQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBSb290RWxlbWVudE5hbWVDb250ZW50SGFuZGxlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOwotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgcmVhZGVyLnBhcnNlKHVyaSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhbmRsZXIucm9vdEVsZW1lbnROYW1lOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSb290RWxlbWVudE5hbWVDb250ZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIHJvb3RFbGVtZW50TmFtZTsKLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIHJvb3RFbGVtZW50TmFtZSA9IGxvY2FsTmFtZTsKLQotICAgICAgLy8gaGVyZSBJIHRocm93IGFuIGV4Y2VwdGlvbiB0byBtYWtlIHRoZSBTQVggUGFyc2VyIHRvIHN0b3AgcGFyc2luZwotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiU0FYUGFyc2VyIGludGVudG9uYWxseSBzdG9wcGVkIik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFJlc291cmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4YmE3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2U8L2I+IGltcGxlbWVudGF0aW9uIGZvciB0aGUgbW9kZWwuCi0gKiBUaGlzIHNwZWNpYWxpemVkIHJlc291cmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGl0J3Mgb3duIHdheSBvZiBtYWtpbmcga2V5cyBhbmQgCi0gKiBocmVmcywgYW5kIGl0J3Mgb3duIHNlcmlhbGl6YXRpb24uIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIGZvciBzdWJjbGFzc2luZyAKLSAqIG91dHNpZGUgb2YgdGhlIG1vZGVsIGltcGxlbWVudGF0aW9uOyBpdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGlzIHdpdGggdGhlIAotICogUmVzb3VyY2UgZnJhbWV3b3JrLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAxLjAKLSAqIEBpZ25vcmUKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUmVzb3VyY2VJbXBsIGV4dGVuZHMgUmVzb3VyY2VJbXBsIAotewotCi0gIHByaXZhdGUgYm9vbGVhbiB1c2VFeHRlbnNpb25GYWN0b3JpZXMgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gY29udGludWVPbkxvYWRFcnJvciA9IHRydWU7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0VYVEVOU0lPTl9GQUNUT1JJRVMgPSAiVVNFX0VYVEVOU0lPTl9GQUNUT1JJRVMiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRJTlVFX09OX0xPQURfRVJST1IgPSAiQ09OVElOVUVfT05fTE9BRF9FUlJPUiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FTkNPRElORyA9ICJXU0RMX0VOQ09ESU5HIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1BST0dSRVNTX01PTklUT1IgPSAiV1NETF9QUk9HUkVTU19NT05JVE9SIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgLyoqCi0gICAqIEFkZCB0aGlzIG9wdGlvbiB3aXRoIGEgdmFsdWUgb2YgQm9vbGVhbi5UUlVFIHRvIHRoZSBvcHRpb25zIG1hcCB3aGVuCi0gICAqIGxvYWRpbmcgYSByZXNvdXJjZSB0byBpbnN0cnVjdCB0aGUgbG9hZGVyIHRvIHRyYWNrIHNvdXJjZSBjb2RlIGxvY2F0aW9uIGZvcgotICAgKiBlYWNoIG5vZGUgaW4gdGhlIHNvdXJjZSBkb2N1bWVudC4KLSAgICogCi0gICAqIEBzZWUgV1NETFBhcnNlciNnZXRVc2VyRGF0YShvcmcudzNjLmRvbS5Ob2RlKQotICAgKiBAc2VlIFdTRExQYXJzZXIjZ2V0U3RhcnRDb2x1bW4ob3JnLnczYy5kb20uTm9kZSkKLSAgICogQHNlZSBXU0RMUGFyc2VyI2dldEVuZENvbHVtbihvcmcudzNjLmRvbS5Ob2RlKQotICAgKiBAc2VlIFdTRExQYXJzZXIjZ2V0U3RhcnRMaW5lKG9yZy53M2MuZG9tLk5vZGUpCi0gICAqIEBzZWUgV1NETFBhcnNlciNnZXRFbmRMaW5lKG9yZy53M2MuZG9tLk5vZGUpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDS19MT0NBVElPTiA9ICJUUkFDS19MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuIAotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIAotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4gCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMUmVzb3VyY2VJbXBsKFVSSSB1cmkpCi0gIHsKLSAgICBzdXBlcih1cmkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvcywgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RGVmaW5pdGlvbigpOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLSAgICAgICAgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSA9PSBudWxsKQotICAgICAgewotICAgICAgICAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICB9Ci0KLSAgICAgIGRvU2VyaWFsaXplKG9zLCBkb2N1bWVudCwgb3B0aW9ucyA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIG9wdGlvbnMuZ2V0KFdTRExfRU5DT0RJTkcpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UncyBEZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29udGVudHMoKS5zaXplKCkgPT0gMSAmJiBnZXRDb250ZW50cygpLmdldCgwKSBpbnN0YW5jZW9mIERlZmluaXRpb24gPyAoRGVmaW5pdGlvbikgZ2V0Q29udGVudHMoKS5nZXQoMCkgOiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1NlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0gICAgICAKLSAgICAgIC8vIFVubGVzcyBhIHdpZHRoIGlzIHNldCwgdGhlcmUgd2lsbCBiZSBvbmx5IGxpbmUgYnJlYWtzIGJ1dCBubyBpbmRlbnRhdGlvbi4KLSAgICAgIC8vIFRoZSBJQk0gSkRLIGFuZCB0aGUgU3VuIEpESyBkb24ndCBhZ3JlZSBvbiB0aGUgcHJvcGVydHkgbmFtZSwKLSAgICAgIC8vIHNvIHdlIHNldCB0aGVtIGJvdGguCi0gICAgICAvLwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiMiIpOwotICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIGVuY29kaW5nKTsKLSAgICAgIH0KLQotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KG91dHB1dFN0cmVhbSkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIFdTRExQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIExvYWRzIGEgbmV3IHtAbGluayBXU0RMUmVzb3VyY2VJbXBsfSBpbnRvIHRoZSByZXNvdXJjZSBzZXQuCi0gICAqIEBwYXJhbSBpbnB1dFNvdXJjZSB0aGUgY29udGVudHMgb2YgdGhlIG5ldyByZXNvdXJjZS4KLSAgICogQHBhcmFtIG9wdGlvbnMgYW55IG9wdGlvbnMgdG8gaW5mbHVlbmNlIGxvYWRpbmcgYmVoYXZpb3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UsIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFRoaXMgcGF0dGVybiBhdm9pZHMgbG9hZGluZyB0aGUgSVByb2dyZXNzTW9uaXRvciBjbGFzcyB3aGVuIHRoZXJlIGlzIG5vIHByb2dyZXNzIG1vbml0b3IuCi0gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHN0YW5kLWFsb25lIGV4ZWN1dGlvbiB0byB3b3JrIGNvcnJlY3RseS4KLSAgICAvLwotICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLSAgICBPYmplY3QgbW9uaXRvciA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLmdldChXU0RMX1BST0dSRVNTX01PTklUT1IpOwotICAgIGlmIChtb25pdG9yICE9IG51bGwpCi0gICAgewotICAgICAgcHJvZ3Jlc3NNb25pdG9yID0gKElQcm9ncmVzc01vbml0b3IpIG1vbml0b3I7Ci0gICAgICBwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUoV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUxvYWRfcHJvZ3Jlc3MiKSk7Ci0gICAgICBwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhnZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBPYmplY3QgYmluZGluZ3MgPSBvcHRpb25zID09IG51bGwgPyBudWxsIDogb3B0aW9ucy5nZXQoVVNFX0VYVEVOU0lPTl9GQUNUT1JJRVMpOwotICAgIGlmIChiaW5kaW5ncyAhPSBudWxsICYmIGJpbmRpbmdzIGluc3RhbmNlb2YgQm9vbGVhbikgCi0gICAgICAvLyB0cnVlIGJ5IGRlZmF1bHQKLSAgICAgIHVzZUV4dGVuc2lvbkZhY3RvcmllcyA9ICgoQm9vbGVhbiliaW5kaW5ncykuYm9vbGVhblZhbHVlKCk7Ci0gCi0gICAgT2JqZWN0IGNvbnRpbnVlT25FcnJvciA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLmdldChDT05USU5VRV9PTl9MT0FEX0VSUk9SKTsKLSAgICBpZiAoY29udGludWVPbkVycm9yICE9IG51bGwgJiYgY29udGludWVPbkVycm9yIGluc3RhbmNlb2YgQm9vbGVhbikgCi0gICAgICAvLyB0cnVlIGJ5IGRlZmF1bHQKLSAgICAJY29udGludWVPbkxvYWRFcnJvciA9ICgoQm9vbGVhbiljb250aW51ZU9uRXJyb3IpLmJvb2xlYW5WYWx1ZSgpOwotICAgIAotICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiB0cmFja0xvY2F0aW9uID0gb3B0aW9ucyAhPSBudWxsICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMob3B0aW9ucy5nZXQoVFJBQ0tfTE9DQVRJT04pKTsgCi0KLSAgICAgIGlmICh0cmFja0xvY2F0aW9uKQotICAgICAgewotICAgICAgICBkb2MgPSBnZXREb2N1bWVudFVzaW5nU0FYKGlucHV0U291cmNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgRE9NIGRvY3VtZW50Ci0gICAgICAgIGRvYyA9IGdldERvY3VtZW50KGlucHV0U291cmNlLCBuZXcgSW50ZXJuYWxFcnJvckhhbmRsZXIoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkb2MgIT0gbnVsbCAmJiBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFmaW5kRGVmaW5pdGlvbihkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNvbnRpbnVlT25Mb2FkRXJyb3IpCi0gICAgICAgICAgICBoYW5kbGVEZWZpbml0aW9uRWxlbWVudChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihXU0RMUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX0VSUk9SX0lOVkFMSURfV1NETCIpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoYW5kbGVEZWZpbml0aW9uRWxlbWVudChudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBpZiAoY29udGludWVPbkxvYWRFcnJvcikKLSAgICAgIHsKLSAgICAgICAgV1NETFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLSAgICAgICAgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAJdGhyb3cgZXhjZXB0aW9uOwotICAgIH0KLQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotCi0gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlbCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBlbCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgai5uZXh0KCk7Ci0gICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGVsLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIHNjaGVtYS5zZXRTY2hlbWFMb2NhdGlvbihnZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIG5ldyB7QGxpbmsgV1NETFJlc291cmNlSW1wbH0gaW50byB0aGUgcmVzb3VyY2Ugc2V0LgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSBvcHRpb25zIGFueSBvcHRpb25zIHRvIGluZmx1ZW5jZSBsb2FkaW5nIGJlaGF2aW9yLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IAotICAgICAgaW5wdXRTdHJlYW0gaW5zdGFuY2VvZiBVUklDb252ZXJ0ZXIuUmVhZGFibGVJbnB1dFN0cmVhbSA/IAotICAgICAgbmV3IElucHV0U291cmNlKCgoVVJJQ29udmVydGVyLlJlYWRhYmxlSW5wdXRTdHJlYW0paW5wdXRTdHJlYW0pLmFzUmVhZGVyKCkpIDoKLSAgICAgIG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSk7Ci0KLSAgICBpZiAoZ2V0VVJJKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgaWQgPSBnZXRVUkkoKS50b1N0cmluZygpOwotICAgICAgaW5wdXRTb3VyY2Uuc2V0UHVibGljSWQoaWQpOwotICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoaWQpOwotICAgIH0KLSAgICBkb0xvYWQoaW5wdXRTb3VyY2UsIG9wdGlvbnMpOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiBVc2UgYSBjdXN0b20gU0FYIHBhcnNlciB0byBhbGxvdyB1cyB0byB0cmFjayB0aGUgc291cmNlIGxvY2F0aW9uIG9mIAotICAgKiBlYWNoIG5vZGUgaW4gdGhlIHNvdXJjZSBYTUwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBpbnB1dFNvdXJjZSB0aGUgcGFyc2luZyBzb3VyY2UuIE11c3Qgbm90IGJlIG51bGwuIAotICAgKiBAcmV0dXJuIHRoZSBET00gZG9jdW1lbnQgY3JlYXRlZCBieSBwYXJzaW5nIHRoZSBpbnB1dCBzdHJlYW0uIAotICAgKi8KLSAgcHJpdmF0ZSBEb2N1bWVudCBnZXREb2N1bWVudFVzaW5nU0FYKElucHV0U291cmNlIGlucHV0U291cmNlKQotICB7Ci0gICAgV1NETFBhcnNlciB3c2RsUGFyc2VyID0gbmV3IFdTRExQYXJzZXIoKTsKLSAgICB3c2RsUGFyc2VyLnBhcnNlKGlucHV0U291cmNlKTsKLSAgICAKLSAgICBDb2xsZWN0aW9uIGVycm9ycyA9IHdzZGxQYXJzZXIuZ2V0RGlhZ25vc3RpY3MoKTsKLSAgICAKLSAgICBpZiAoZXJyb3JzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLSAgICAgIAotICAgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICAgIFdTRExEaWFnbm9zdGljIHdzZGxEaWFnbm9zdGljID0gKFdTRExEaWFnbm9zdGljKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICBzd2l0Y2ggKHdzZGxEaWFnbm9zdGljLmdldFNldmVyaXR5KCkuZ2V0VmFsdWUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkuRkFUQUw6Ci0gICAgICAgICAgICBjYXNlIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkuRVJST1I6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGdldEVycm9ycygpLmFkZCh3c2RsRGlhZ25vc3RpYyk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBXU0RMRGlhZ25vc3RpY1NldmVyaXR5LldBUk5JTkc6Ci0gICAgICAgICAgICBjYXNlIFdTRExEaWFnbm9zdGljU2V2ZXJpdHkuSU5GT1JNQVRJT046Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGdldFdhcm5pbmdzKCkuYWRkKHdzZGxEaWFnbm9zdGljKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgRG9jdW1lbnQgZG9jID0gd3NkbFBhcnNlci5nZXREb2N1bWVudCgpOwotICAgIHJldHVybiBkb2M7Ci0gIH0KLQotICAvKioKLSAgICogQnVpbGRzIGEgZG9jdW1lbnQgdXNpbmcgWGVyY2VzLgotICAgKiBAcGFyYW0gaW5wdXRTb3VyY2UgdGhlIGNvbnRlbnRzIHRvIHBhcnNlLgotICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSBoYW5kbGVkIHVzZWQgYnkgdGhlIHBhcnNlci4KLSAgICogQHJldHVybiBhIGRvY3VtZW50LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgQ2xhc3NMb2FkZXIgcHJldmlvdXNDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoV1NETFJlc291cmNlRmFjdG9yeUltcGwuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gVXNpbmcgYSBkZWZlcnJlZCBET00gZG9jdW1lbnQgaW4gdGhlIFdTREwgbW9kZWwgbWF5IGNhdXNlIGEKLSAgICAgICAgLy8gcGVyZm9ybWFuY2UgcHJvYmxlbSBpbiB0ZXJtcyBvZiBtZW1vcnkgY29uc3VtcHRpb24gaW4gcGFydGljdWxhci4KLSAgICAgICAgLy8gV2UncmUgYXR0ZW1wdGluZyB0byB1c2UgdGhlIGZlYXR1cmUgd2hpY2ggaW5zdHJ1Y3RzIHRoZSBYZXJjZXMgcGFyc2VyCi0gICAgICAgIC8vIHRvIG5vdCB1c2UgZGVmZXJyZWQgRE9NIHRyZWVzLgotICAgICAgICAvLyBUT0RPIENvbnZlcnQgdG8gdXNlIHNldEZlYXR1cmUgd2hlbiBpdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhlIFhlcmNlcwotICAgICAgICAvLyB2ZXJzaW9ucyA8IDIuNy4xIGRvIG5vdCBmdWxseSBzdXBwb3J0IHNldEZlYXR1cmUsIHNvIHdlIGhhdmUgdG8gdXNlCi0gICAgICAgIC8vIHNldEF0dHJpYnV0ZS4KLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9kb20vZGVmZXItbm9kZS1leHBhbnNpb24iLCBCb29sZWFuLkZBTFNFKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBJZ25vcmUsIGFzIHRoZSBjb2RlIHdpbGwgaGF2ZSB0byBydW4gd2l0aCBwYXJzZXJzIG90aGVyIHRoYW4gWGVyY2VzLgotICAgICAgfSAgICAgIAotCi0gICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQotICAgICAgLy8gVEJEIC0gUmV2aXNpdAotICAgICAgLy9FbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IGNyZWF0ZUVudGl0eVJlc29sdmVyKCk7Ci0gICAgICAvL2RvY3VtZW50QnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihlbnRpdHlSZXNvbHZlcik7Ci0KLSAgICAgIGRvY3VtZW50QnVpbGRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKLQotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudEJ1aWxkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgdGhyb3cgbmV3IElPV3JhcHBlZEV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSU9XcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2aW91c0NsYXNzTG9hZGVyKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZmluZERlZmluaXRpb24oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKFdTRExDb25zdGFudHMubm9kZVR5cGUoZWxlbWVudCkgPT0gV1NETENvbnN0YW50cy5ERUZJTklUSU9OKQotICAgIHsKLSAgICAgIGhhbmRsZURlZmluaXRpb25FbGVtZW50KGVsZW1lbnQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgLyoKLSAgICAgIGZvciAoTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZmluZERlZmluaXRpb24oKEVsZW1lbnQpIGNoaWxkKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgKi8KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlZmluaXRpb25FbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikuc2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKHVzZUV4dGVuc2lvbkZhY3Rvcmllcyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkltcGwuY3JlYXRlRGVmaW5pdGlvbgotCSAgICAoZWxlbWVudCxnZXRVUkkoKS50b1N0cmluZygpLHVzZUV4dGVuc2lvbkZhY3Rvcmllcyk7Ci0gICAgfQotICAgIGdldENvbnRlbnRzKCkuYWRkKGRlZmluaXRpb24pOwotICAgIC8vIERvIHdlIG5lZWQgdGhlIG5leHQgbGluZT8KLSAgICAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS5yZWNvbmNpbGVSZWZlcmVuY2VzKHRydWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHNlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGRvY3VtZW50LCBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIGRvU2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZG9jdW1lbnQsIGVuY29kaW5nKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgc2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZWxlbWVudCwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG9TZXJpYWxpemUob3V0cHV0U3RyZWFtLCBlbGVtZW50LCBlbmNvZGluZyk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvU2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOwotICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIGVuY29kaW5nKTsKLSAgICAgIH0KLQotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZWxlbWVudCksIG5ldyBTdHJlYW1SZXN1bHQob3V0cHV0U3RyZWFtKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgV1NETFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAKLSAgcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlcgotICB7Ci0gICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldTREwgUEFSU0UgRVJST1I6ICIgKyBlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV1NETCBQQVJTRSBGQVRBTCBFUlJPUjogIiArIGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXU0RMIFBBUlNFIFdBUk5JTkc6ICIgKyBlKTsKLSAgICB9Ci0gIH0gCi0gIAotICAKLSAgcHVibGljIHZvaWQgYXR0YWNoZWQoRU9iamVjdCBlT2JqZWN0KQotICB7Ci0gICAgc3VwZXIuYXR0YWNoZWQoZU9iamVjdCk7Ci0gICAgIAotICAgIC8vIHdlIG5lZWQgdG8gYXR0YWNoIGEgWFNEU2NoZW1hTG9jYXRvciBpbiBvcmRlciB0byByZXNvbHZlIGlubGluZSBzY2hlbWEgbG9jYXRpb25zCi0gICAgLy8gaWYgdGhlcmUncyBub3QgYWxyZWFkeSBvbmUgYXR0YWNoZWQKLSAgICBYU0RTY2hlbWFMb2NhdG9yIHhzZFNjaGVtYUxvY2F0b3IgPSAoWFNEU2NoZW1hTG9jYXRvcilFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgWFNEU2NoZW1hTG9jYXRvci5jbGFzcyk7Ci0gICAgaWYgKHhzZFNjaGVtYUxvY2F0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRSZXNvdXJjZVNldCgpLmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeSgpKTsgIAotICAgIH0gCi0gICAgCi0gICAgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBEZWZpbml0aW9uSW1wbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBlT2JqZWN0OwotICAgICAgZGVmaW5pdGlvbi5zZXRJbmxpbmVTY2hlbWFMb2NhdGlvbnModGhpcyk7ICAgIAotICAgIH0KLSAgfQotICAvKgotICBwdWJsaWMgdm9pZCBzZXRJbmxpbmVTY2hlbWFMb2NhdGlvbnMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgaW5saW5lIHNjaGVtYXMgbG9jYXRpb24gCi0gICAgVHlwZXMgdHlwZXMgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGVsID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBqLm5leHQoKTsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGVsLmdldFNjaGVtYSgpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIHNjaGVtYS5zZXRTY2hlbWFMb2NhdGlvbihnZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgICAKLSAgICB9ICAgICAgCi0gIH0qLwotfSAvL1dTRExSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0ZWI3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldTREwgTW9kZWwgQVBJIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+Ci0gICAgICAgIFRoZSBXU0RMIG1vZGVsIEFQSSBhbGxvd3MgY2xpZW50cyB0byB3b3JrIHdpdGggdGhlIFdTREwgMS4xIGRvY3VtZW50cy4KLQkJPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0JCVRoZSBXU0RMIG1vZGVsIEFQSSBhbGxvd3MgY2xpZW50cyB0byBsb2FkLCBtb2RpZnksIGFuZCBzYXZlIFdTREwgMS4xIGRvY3VtZW50cy4KLQkJPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL3BhY2thZ2UueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVhMGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLQk8aGVhZD4KLQkJPG1ldGEKLQkJCW5hbWU9InJvb3QiCi0JCi0JCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JCTx0aXRsZT5XU0RMIE1vZGVsIEFQSSBPdmVydmlldzwvdGl0bGU+Ci0JPC9oZWFkPgotCi0JPGJvZHk+Ci0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIHdvcmsgd2l0aCB0aGUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L2Fic3RyYWN0PgotCQk8cD4KLQkJVGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIGxvYWQsIG1vZGlmeSwgYW5kIHNhdmUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L3A+IAotCTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDEwNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkNTFlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotd3NpdWkuamFyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxMTEwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NpLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Y0ZmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jV2VkIE1hciAyOSAwNDowODo1OCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5ZDNjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBNYXIgMjkgMDQ6MDg6NTcgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkwNDBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2kudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlX1BST1ZJREVSX05BTUUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuYWN0aW9uRGVsZWdhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLmljb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC53aXphcmRzO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7IGJ1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtyZXNvbHV0aW9uOj1vcHRpb25hbDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO3Jlc29sdXRpb246PW9wdGlvbmFsO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDEuMS4wKSIsCi0gb3JnLndzZGw0ajtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDEuNS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NTcwZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLW91dHB1dC4uID0gYmluLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGViMTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy93c2lfbG9nZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2ljb25zL3dzaV9sb2dmaWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjExMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2ljb25zL3dzaV9sb2dmaWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMTI3ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0hLS0gQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotX1BMVUdJTl9OQU1FICAgICAgICAgICAgICAgICAgPSBTb2FwIE1vbml0b3IKLV9QUk9WSURFUl9OQU1FICAgICAgICAgICAgICAgID0gRWNsaXBzZS5vcmcKLV9VSV9XU0lfVkFMSURBVE9SICAgICAgICAgICAgID0gV1MtSSBNZXNzYWdlIFZhbGlkYXRvcgotX1VJX0FDVElPTl9WQUxJREFURSAgICAgICAgICAgPSBWYWxpZGF0ZSBXUy1JIExvZyBGaWxlCi1fVUlfV0laQVJEX1ZBTElEQVRFX0xPR19USVRMRSA9IFZhbGlkYXRlIFdTLUkgTWVzc2FnZSBMb2cgRmlsZQotX1VJX0xPR19FRElUT1IgICAgICAgICAgICAgICAgPSBXUy1JIE1lc3NhZ2UgTG9nIFZpZXdlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliMzExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4gCi0KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gUHVycG9zZTogQWRkIHZhbGlkYXRvciBhY3Rpb24gdG8gVENQSVAgbW9uaXRvci4gICAgICAgICAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyI+Ci0gICAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYXJ0aWNsZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbi52aWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJXUy1JIFByb2ZpbGUgVmFsaWRhdG9yIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi92YWxpZGF0ZS5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1dJWkFSRF9WQUxJREFURV9MT0dfVElUTEUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLmFjdGlvbkRlbGVnYXRlcy5WYWxpZGF0ZVdTSVByb2ZpbGVBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJncm91cDEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLmFjdGlvbkRlbGVnYXRlcy5WYWxpZGF0ZVdTSVByb2ZpbGVBY3Rpb25EZWxlZ2F0ZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvdmlld0NvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFB1cnBvc2U6IFRvIHJlZ2lzdGVyIFdTLUkgbWVzc2FnZSB2YWxpZGF0b3IuICAgICAgICAgICAgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UudWkudmlld0FjdGlvbnMgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ3c2lWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSIlX1VJX1dTSV9WQUxJREFUT1IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NpbXNnIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGhlbHBlciAgICAgIAotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuSGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJTWVzc2FnZVZhbGlkYXRvciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS51aS5lZGl0b3JzICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gUHVycG9zZTogU3BlY2lmeSBlZGl0b3IgZm9yIGZpbGUgd2l0aCBleHRlbnNpb24gd3NpbXNnLiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IiVfVUlfTE9HX0VESVRPUiIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9IndzaW1zZyIKLSAgICAgICAgICAgIGljb249Imljb25zL3dzaV9sb2dmaWxlX29iai5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSUxvZ0VkaXRvciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyAgLS0+IAotICAgPCEtLSBQdXJwb3NlOiBTcGVjaWZ5IGZpbGUgYXNzb2NpYXRpb24gZm9yIHdzaW1zZy4gICAgICAgICAgIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+IAotICAgICAgPGZpbGUtYXNzb2NpYXRpb24gCi0gICAgICAgY29udGVudC10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotICAgICAgIGZpbGUtZXh0ZW5zaW9ucz0id3NpbXNnIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEFkZCB2YWxpZGF0ZSBhY3Rpb24gIHRvIC53c2ltc2cgZmlsZSAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2ltc2ciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc29hcC52YWxpZGF0ZS53c2kuYWN0aW9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0FDVElPTl9WQUxJREFURSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuYWN0aW9uRGVsZWdhdGVzLlZhbGlkYXRlV1NJTG9nRmlsZUFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuYWN0aW9uRGVsZWdhdGVzLlZhbGlkYXRlV1NJTG9nRmlsZUFjdGlvbkRlbGVnYXRlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotIDwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxM2ZkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotIAotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgCi17Ci0gICAgLy8tLS0tLS0tLS0tLS0tLS0gVmFsaWRhdGlvbiBXaXphcmQgLS0tLS0tLS0tLS0tLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9XSVpBUkRfVElUTEU7Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLSBWYWxpZGF0aW9uIFdpemFyZCAoV1NETCBwYWdlKSAtLS0tLS0tLS0tLS0tLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BBR0VfRklMRV9TSEVMTF9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfUEFHRV9GSUxFX1RJVExFIDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BBR0VfRklMRV9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BBR0VfU0VMRUNUX1dTRExfRklMRU5BTUVfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BBR0VfU0VMRUNUX1dTRExfRklMRU5BTUVfRVhQTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BBR0VfSU5DTFVERV9XU0RMX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX1BBR0VfSU5DTFVERV9XU0RMX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfUEFHRV9WQUxJRF9XU0RMX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfUEFHRV9XT1JLQkVOQ0hfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfUEFHRV9CUk9XU0VfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfUEFHRV9TRUFSQ0hfVURESV9CVVRUT047Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLSBWYWxpZGF0aW9uIFdpemFyZCAoV1NETCBjb250ZW50IHBhZ2UpIC0tLS0tLS0tLS0tLS0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfQ09OVEVOVF9QQUdFX1NFTEVDVF9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfQ09OVEVOVF9QQUdFX1NFTEVDVF9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfQ09OVEVOVF9QQUdFX0dST1VQX1RFWFRfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlRfUEFHRV9HUk9VUF9URVhUX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9DT05URU5UX1BBR0VfUkFESU9fUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlRfUEFHRV9SQURJT19CSU5ESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfQ09OVEVOVF9QQUdFX1JBRElPX1BPUlRfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlRfUEFHRV9SQURJT19PUEVSQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9DT05URU5UX1BBR0VfUkFESU9fTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlRfUEFHRV9MQUJFTF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExfQ09OVEVOVF9QQUdFX0xBQkVMX05BTUVTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlRfUEFHRV9MQUJFTF9QQVJFTlQ7Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLSBWYWxpZGF0aW9uIFdpemFyZCAoTG9nIHBhZ2UpIC0tLS0tLS0tLS0tLS0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR19QQUdFX1NFTEVDVF9MT0dfRklMRU5BTUVfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0dfUEFHRV9TRUxFQ1RfTE9HX0ZJTEVOQU1FX0VYUEw7Ci0KLQkvLyBBY3Rpb25zCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1dTSV9WQUxJREFUT1I7Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLSBFcnJvcnMgLS0tLS0tLS0tLS0tLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfVU5BQkxFX1RPX1ZBTElEQVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1ZBTElEQVRJT05fRkFJTEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1RIRV9XU0lNU0dfRklMRV9JU19OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfUFJPQkxFTVNfUkVBRElOR19XU0lNU0dfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX0xPR19GSUxFX0VYVEVOU0lPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXQVJOSU5HX1ZBTElEQVRJT05fV0FSTklOR1NfREVURUNURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSTklOR19GSUxFX0FMUkVBRFlfRVhJU1RTOwotCi0JLy8tLS0tLS0tLS0tLS0tLS0gSW5mb3JtYXRpb25hbCBtZXNzYWdlcyAtLS0tLS0tLS0tLS0tLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPX1ZBTElEQVRJT05fU1VDRUVERUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5GT19USEVfV1NJTVNHX0ZJTEVfSVNfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5GT19OT19NRVNTQUdFU19UT19WQUxJREFURTsKLQotICBzdGF0aWMgCi0gIHsKLQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKFdTSVVJUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGIzNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0jIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAqIAotIyAgKiBDb250cmlidXRvcnM6IAotIyAgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotIyAtLS0tLS0tLS0tLS0tLS0gVmFsaWRhdGlvbiBXaXphcmQgLS0tLS0tLS0tLS0tLS0tCi1WQUxJREFUSU9OX1dJWkFSRF9USVRMRSAgICAgICAgICAgICAgICA9IFZhbGlkYXRlIFdTLUkgTWVzc2FnZSBMb2cgRmlsZQotCi0jIC0tLS0tLS0tLS0tLS0tLSBWYWxpZGF0aW9uIFdpemFyZCAoV1NETCBwYWdlKSAtLS0tLS0tLS0tLS0tLS0KLVdTRExfUEFHRV9GSUxFX1NIRUxMX1RFWFQgICAgICAgICAgICAgID0gU2VsZWN0IEZpbGUKLVdTRExfUEFHRV9GSUxFX1RJVExFICAgICAgICAgICAgICAgICAgID0gU2VsZWN0IGEgRmlsZQotV1NETF9QQUdFX0ZJTEVfREVTQ1JJUFRJT04gICAgICAgICAgICAgPSBTZWxlY3QgYSBmaWxlIGZyb20gdGhlIHdvcmtiZW5jaC4KLVdTRExfUEFHRV9TRUxFQ1RfV1NETF9GSUxFTkFNRV9IRUFESU5HID0gSW5jbHVkZSBXU0RMIEZpbGUKLVdTRExfUEFHRV9TRUxFQ1RfV1NETF9GSUxFTkFNRV9FWFBMICAgID0gT3B0aW9uYWxseSBzZWxlY3QgYSBXU0RMIGZpbGUgZm9yIHRoZSBXZWIgc2VydmljZQotV1NETF9QQUdFX0lOQ0xVREVfV1NETF9CVVRUT04gICAgICAgICAgPSBJbmNsdWRlIFdTREwgZG9jdW1lbnQgZm9yIFdlYiBzZXJ2aWNlCi1XU0RMX1BBR0VfSU5DTFVERV9XU0RMX0xBQkVMICAgICAgICAgICA9IEVudGVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudCBmb3IgdGhlIFdlYiBzZXJ2aWNlCi1XU0RMX1BBR0VfVkFMSURfV1NETF9MQUJFTCAgICAgICAgICAgICA9ICpOb3RlOiBZb3UgY2FuIG9ubHkgc2VsZWN0IHRoZSBOZXh0IGJ1dHRvbiBpZiB0aGUgV1NETCBkb2N1bWVudCBpcyB2YWxpZC4KLVdTRExfUEFHRV9XT1JLQkVOQ0hfQlVUVE9OICAgICAgICAgICAgID0gV29ya2JlbmNoLi4uCi1XU0RMX1BBR0VfQlJPV1NFX0JVVFRPTiAgICAgICAgICAgICAgICA9IEJyb3dzZS4uLgotV1NETF9QQUdFX1NFQVJDSF9VRERJX0JVVFRPTiAgICAgICAgICAgPSBTZWFyY2ggVURESS4uLgotCi0jIC0tLS0tLS0tLS0tLS0tLSBWYWxpZGF0aW9uIFdpemFyZCAoV1NETCBjb250ZW50IHBhZ2UpIC0tLS0tLS0tLS0tLS0tLQotV1NETF9DT05URU5UX1BBR0VfU0VMRUNUX0hFQURJTkcgICAgICAgPSBTcGVjaWZ5IHRoZSBXU0RMIGVsZW1lbnQgdG8gYmUgQW5hbHl6ZWQKLVdTRExfQ09OVEVOVF9QQUdFX1NFTEVDVF9FWFBMICAgICAgICAgID0gSW5kaWNhdGUgdGhlIG5hbWUsIHR5cGUsIGFuZCBuYW1lc3BhY2Ugb2YgdGhlIFdTREwgZWxlbWVudCB0byBiZSBhbmFseXplZAotV1NETF9DT05URU5UX1BBR0VfR1JPVVBfVEVYVF9FTEVNRU5UICAgPSBUaGUgV1NETCBlbGVtZW50Ci1XU0RMX0NPTlRFTlRfUEFHRV9HUk9VUF9URVhUX1RZUEUgICAgICA9IHR5cGUKLVdTRExfQ09OVEVOVF9QQUdFX1JBRElPX1BPUlQgICAgICAgICAgID0gcG9ydAotV1NETF9DT05URU5UX1BBR0VfUkFESU9fQklORElORyAgICAgICAgPSBiaW5kaW5nCi1XU0RMX0NPTlRFTlRfUEFHRV9SQURJT19QT1JUX1RZUEUgICAgICA9IHBvcnRUeXBlCi1XU0RMX0NPTlRFTlRfUEFHRV9SQURJT19PUEVSQVRJT04gICAgICA9IG9wZXJhdGlvbgotV1NETF9DT05URU5UX1BBR0VfUkFESU9fTUVTU0FHRSAgICAgICAgPSBtZXNzYWdlCi1XU0RMX0NPTlRFTlRfUEFHRV9MQUJFTF9OQU1FICAgICAgICAgICA9IG5hbWU6Ci1XU0RMX0NPTlRFTlRfUEFHRV9MQUJFTF9OQU1FU1BBQ0UgICAgICA9IG5hbWVzcGFjZToKLVdTRExfQ09OVEVOVF9QQUdFX0xBQkVMX1BBUkVOVCAgICAgICAgID0gcGFyZW50OgotCi0jIC0tLS0tLS0tLS0tLS0tLSBWYWxpZGF0aW9uIFdpemFyZCAoTG9nIHBhZ2UpIC0tLS0tLS0tLS0tLS0tLQotTE9HX1BBR0VfU0VMRUNUX0xPR19GSUxFTkFNRV9IRUFESU5HICAgPSBTcGVjaWZ5IHRoZSBXUy1JIE1lc3NhZ2UgTG9nIEZpbGUgTmFtZQotTE9HX1BBR0VfU0VMRUNUX0xPR19GSUxFTkFNRV9FWFBMICAgICAgPSBTZWxlY3QgYSBmb2xkZXIgYW5kIHNwZWNpZnkgYSBtZXNzYWdlIGxvZyBmaWxlIG5hbWUKLQotIyBBY3Rpb25zCi1BQ1RJT05fV1NJX1ZBTElEQVRPUiAgICAgICAgICAgICAgICAgICA9IFdTLUkgTWVzc2FnZSBWYWxpZGF0b3IKLQotIyAtLS0tLS0tLS0tLS0tLS0gRXJyb3JzIC0tLS0tLS0tLS0tLS0tLQotRVJST1JfVU5BQkxFX1RPX1ZBTElEQVRFICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gVmFsaWRhdGUKLUVSUk9SX1ZBTElEQVRJT05fRkFJTEVEICAgICAgICAgICAgICAgID0gVmFsaWRhdGlvbiBGYWlsZWQKLUVSUk9SX1RIRV9XU0lNU0dfRklMRV9JU19OT1RfVkFMSUQgICAgID0gVGhlIFdTLUkgTWVzc2FnZSBMb2cgZmlsZSBpcyBub3QgdmFsaWQuICBTZWUgdGhlIFByb2JsZW1zIHZpZXcgZm9yIGEgbGlzdCBvZiB0aGUgdmFsaWRhdGlvbiBlcnJvcnMuCi1FUlJPUl9QUk9CTEVNU19SRUFESU5HX1dTSU1TR19GSUxFICAgICA9IFByb2JsZW1zIHJlYWRpbmcgdGhlIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4gIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIGVycm9ycy4KLUVSUk9SX0lOVkFMSURfTE9HX0ZJTEVfRVhURU5TSU9OICAgICAgID0gVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gY2FuIG9ubHkgYmUgIi53c2ltc2ciLgotV0FSTklOR19WQUxJREFUSU9OX1dBUk5JTkdTX0RFVEVDVEVEICAgPSBIb3dldmVyIHdhcm5pbmdzIGhhdmUgYmVlbiBpc3N1ZWQuIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIHRoZSB2YWxpZGF0aW9uIHdhcm5pbmdzLgotV0FSTklOR19GSUxFX0FMUkVBRFlfRVhJU1RTICAgICAgICAgICAgPSBXYXJuaW5nOiBUaGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgd2lsbCBiZSBvdmVyd3JpdHRlbi4gCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEluZm9ybWF0aW9uYWwgbWVzc2FnZXMgLS0tLS0tLS0tLS0tLS0tCi1JTkZPX1ZBTElEQVRJT05fU1VDRUVERUQgICAgICAgICAgICAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1JTkZPX1RIRV9XU0lNU0dfRklMRV9JU19WQUxJRCAgICAgICAgICA9IFRoZSBXUy1JIE1lc3NhZ2UgTG9nIGZpbGUgaXMgdmFsaWQuCi1JTkZPX05PX01FU1NBR0VTX1RPX1ZBTElEQVRFICAgICAgICAgICA9IE5vIE1lc3NhZ2VzIHRvIFZhbGlkYXRlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGIyMGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBHSUYgY29uc3RhbnRzCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9XU0lfTE9HRklMRV9XSVogPSAiYWN0aW9ucy9pY29ucy93c2lfbG9nZmlsZV93aXouZ2lmIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9SZXNvdXJjZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1Jlc291cmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDIyNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1Jlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIFJlc291cmNlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIAotewotICBwcm90ZWN0ZWQgU3RyaW5nW10gZkV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJRmlsZVtdIGZFeGNsdWRlZEZpbGVzOwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBmRXhjbHVkZXM7Ci0JCi0gIHB1YmxpYyBSZXNvdXJjZUZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zLCBDb2xsZWN0aW9uIGV4Y2x1ZGUpIAotICB7Ci0gICAgZkV4dGVuc2lvbnM9IGV4dGVuc2lvbnM7Ci0gICAgZkV4Y2x1ZGVzPSBleGNsdWRlOwotICAgIGZFeGNsdWRlZEZpbGVzID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zLCBJRmlsZVtdIGV4Y2x1ZGVkRmlsZXMsIENvbGxlY3Rpb24gZXhjbHVkZSkgCi0gIHsKLSAgICBmRXh0ZW5zaW9ucz0gZXh0ZW5zaW9uczsKLSAgICBmRXhjbHVkZXM9IGV4Y2x1ZGU7Ci0gICAgZkV4Y2x1ZGVkRmlsZXMgPSBleGNsdWRlZEZpbGVzOwotICB9Ci0JCi0gIHB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQkKLSAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSAKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIAotICAgIHsKLSAgICAgIGlmIChmRXhjbHVkZXMgIT0gbnVsbCAmJiBmRXhjbHVkZXMuY29udGFpbnMoZWxlbWVudCkpIAotICAgICAgewotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBuYW1lPSAoKElGaWxlKWVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICAgIGlmIChmRXhjbHVkZWRGaWxlcyAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaj0gMDsgaiA8IGZFeGNsdWRlZEZpbGVzLmxlbmd0aDsgaisrKSAKLSAgICAgICAgewotICAgICAgICAgIGlmICggKChJRmlsZSllbGVtZW50KS5nZXRMb2NhdGlvbigpLgotICAgICAgICAgICAgICAgdG9TdHJpbmcoKS5jb21wYXJlVG8oKChJRmlsZSlmRXhjbHVkZWRGaWxlc1tqXSkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKSA9PSAwICkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKGZFeHRlbnNpb25zLmxlbmd0aCA9PSAwKSAKLSAgICAgIHsKLSAgICAgICAgLy8gYXNzdW1lIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBmaWx0ZXIgYW55IGZpbGVzIGJhc2VkIG9uIAotICAgICAgICAvLyBleHRlbnNpb24KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIAotICAgICAgewotICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChmRXh0ZW5zaW9uc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSAKLSAgICB7IC8vIElQcm9qZWN0LCBJRm9sZGVyCi0gICAgICB0cnkgCi0gICAgICB7Ci0gICAgICAJSVJlc291cmNlW10gcmVzb3VyY2VzPSAoKElDb250YWluZXIpZWxlbWVudCkubWVtYmVycygpOwotCWZvciAoaW50IGk9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIAotICAgICAgICB7Ci0JICAvLyByZWN1cnNpdmUhCi0JICBpZiAoc2VsZWN0KHZpZXdlciwgcGFyZW50LCByZXNvdXJjZXNbaV0pKSAKLSAgICAgICAgICB7Ci0JICAgIHJldHVybiB0cnVlOwotCSAgfQotCX0KLSAgICAgIH0gCi0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSAKLSAgICAgIHsKLSAgICAgIH0JCQkJCi0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSU1lc3NhZ2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lNZXNzYWdlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZWE0NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSU1lc3NhZ2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0lWYWxpZGF0ZUFjdGlvbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5EZWZhdWx0UmVwb3J0ZXI7Ci0KLS8qKgotICogQSBWYWxpZGF0b3IgdGhhdCBwZXJmb3JtcyB2YWxpZGF0aW9uIG9uIGEgV1MtSSBNZXNzYWdlIExvZyBmaWxlLiAKLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICovCi1wdWJsaWMgY2xhc3MgV1NJTWVzc2FnZVZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIElSZXBvcnRlciByZXBvcnRlcjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NJX01FU1NBR0VfVkFMSURBVE9SX0lEID0gIndzaW1lc3NhZ2V2YWxpZGF0b3IiLmludGVybigpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS5JVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSkKLSAgeyAgCi0gICAgV1NJVmFsaWRhdGVBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgV1NJVmFsaWRhdGVBY3Rpb24oZmlsZSwgZmFsc2UpOwotICAgIHZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcih0aGlzKTsKLSAgICAvL3ZhbGlkYXRlQWN0aW9uLnNldFJlcG9ydGVyKGdldFJlcG9ydGVyKCkpOwotICAgIHZhbGlkYXRlQWN0aW9uLnJ1bigpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudmFsaWRhdGUuSVZhbGlkYXRvciNzZXRSZXBvcnRlcihvcmcuZWNsaXBzZS52YWxpZGF0ZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLSAgCXRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjsKLSAgfQotCi1wdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkKLX0KLQotcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotIHsKLQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWM2OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFdTSVZhbGlkYXRlUGx1Z2luIGlzIGEgcGx1Z2luIHRoYXQgaW50ZWdyYXRlcyB3aXRoIHRoZSBFY2xpcHNlIHBsYXRmb3JtIFVJLiAKLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi0KLXB1YmxpYyBjbGFzcyBXU0lVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLSAgLyoqCi0gICAqIFRoZSBzaW5nbGV0b24uCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFdTSVVJUGx1Z2luIGluc3RhbmNlOyAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2kudWkiOwotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NJVUlQbHVnaW4oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbnN0YW5jZSA9IHRoaXM7Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbi4gKEJhc2VkIG9uIHRoZSBTaW5nbGV0b24gUGF0dGVybikuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTSVVJUGx1Z2luIGdldEluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIHByb3RlY3RlZCBJbWFnZVJlZ2lzdHJ5IGNyZWF0ZUltYWdlUmVnaXN0cnkoKSAKLSAgewotCQlJbWFnZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gc3VwZXIuY3JlYXRlSW1hZ2VSZWdpc3RyeSgpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBSZXNvdXJjZS5WQUxJREFURV9XU0lfTE9HRklMRV9XSVopOwotCQlyZXR1cm4gcmVnaXN0cnk7Ci0gIH0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGFuIGltYWdlIHdpdGggdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlckltYWdlKEltYWdlUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBrZXkpCi0JewotICAJICB0cnkgCi0gIAkgIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTSVVJUGx1Z2luLmNsYXNzLCBrZXkpOwotCQlyZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JICB9IGNhdGNoIChFeGNlcHRpb24gZSkgCi0JICB7Ci0gICAgICB9Ci0JfQotCi0gIC8qKgotICAgKiBDb252aWVuY2UgQVBJLiAgCi0gICAqIEZpbmRzIHRoZSBzcGVjaWZpZWQgaW1hZ2Ugc3RvcmVkIGluIHRoaXMgcGx1Zy1pbidzIGltYWdlIHJlZ2lzdHJ5LgotICAgKiBAcGFyYW0gaWNvbk5hbWU6IHRoZSBuYW1lIG9mIHRoZSBpbWFnZS4KLSAgICogQHJldHVybiB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRSZXNvdXJjZUltYWdlKFN0cmluZyBpY29uTmFtZSkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGljb25OYW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuV1NJVmFsaWRhdGVBY3Rpb247Ci0KLS8qKgotICogQSBzaW1wbGUgaW50ZXJmYWNlIHRvIHRoZSBXUy1JIG1lc3NhZ2UgbG9nIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgV1NJVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBXU0lWYWxpZGF0b3IoKQotCXsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGdpdmVuIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIFRoZSBsb2cgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRmlsZSBmaWxlKQotCXsKLQkJV1NJTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbmV3IFdTSU1lc3NhZ2VWYWxpZGF0b3IoKTsKLQkJV1NJVmFsaWRhdGVBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgV1NJVmFsaWRhdGVBY3Rpb24oZmlsZSwgdHJ1ZSk7Ci0JCXZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcihtZXNzYWdlVmFsaWRhdG9yKTsKLQkJdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBsb2cgZmlsZSB3aXRoIGEgV1NETCBkb2N1bWVudCBzcGVjaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGUgVGhlIGxvZyBmaWxlIHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB3c2RsZmlsZSBUaGUgV1NETCBmaWxlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbi4KLQkgKiBAcGFyYW0gZWxlbWVudG5hbWUgVGhlIFdTREwgZWxlbWVudCB0byB2YWxpZGF0ZS4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIFdTREwgZWxlbWVudCB0byB2YWxpZGF0ZS4KLQkgKiBAcGFyYW0gcGFyZW50bmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0JICovCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGdpdmVuIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIFRoZSBsb2cgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRmlsZSBmaWxlLCBTdHJpbmcgd3NkbGZpbGUsIFN0cmluZyBlbGVtZW50bmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHBhcmVudG5hbWUsIFN0cmluZyB0eXBlKQotCXsKLQkJV1NJTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbmV3IFdTSU1lc3NhZ2VWYWxpZGF0b3IoKTsKLQkJV1NJVmFsaWRhdGVBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgV1NJVmFsaWRhdGVBY3Rpb24oZmlsZSwgdHJ1ZSwgd3NkbGZpbGUsIGVsZW1lbnRuYW1lLCBuYW1lc3BhY2UsIHBhcmVudG5hbWUsIHR5cGUpOwotCQl2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IobWVzc2FnZVZhbGlkYXRvcik7Ci0JCXZhbGlkYXRlQWN0aW9uLnJ1bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL1ZhbGlkYXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9WYWxpZGF0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWZjZWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL1ZhbGlkYXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5sb2dnaW5nLklMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5sb2dnaW5nLkxvZ2dlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzOwotCi0vKioKLSAqIEEgZ2VuZXJhbCB2YWxpZGF0ZSBhY3Rpb24gY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgYnkgdmFsaWRhdG9ycy4gVGhpcyBjbGFzcwotICogcHJvdmlkZXMgbWV0aG9kcyB0byBydW4gdGhlIGFjdGlvbiwgYWRkIG1hcmtlcnMgdG8gYSBmaWxlIGFuZCB3aWxsIGhhbmRsZQotICogc2hvd2luZyBhIGRpYWxvZyB3aXRoIHRoZSByZXN1bHRzIG9mIHZhbGlkYXRpb24gKGlmIHJlcXVlc3RlZCkgYW5kIHByb21wdCB0bwotICogc2F2ZSBkaXJ0eSBmaWxlcyAoaWYgcmVxdWVzdGVkLikKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIC8vIExvY2FsbHkgdXNlZCwgbm9uLVVJIHN0cmluZ3MuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfT1BFTiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yKCI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX0NMT1NFID0gIikiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yIjsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9OQU1FID0gImdyb3VwTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MX05PX1NMQVNIID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vLyI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OVU1CRVJfQVRUUklCVVRFID0gImNvbHVtbk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSA9ICJzcXVpZ2dsZVNlbGVjdGlvblN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSA9ICJzcXVpZ2dsZU5hbWVPclZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2cgPSB0cnVlOwotCi0gIHByb3RlY3RlZCBJRmlsZSBmaWxlID0gbnVsbDsKLQotICBwcm90ZWN0ZWQgSVJlcG9ydGVyIHJlcG9ydGVyOwotCi0gIHByb3RlY3RlZCBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZQotICAgKiAgICAgICAgICBUaGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHNob3dEaWFsb2cKLSAgICogICAgICAgICAgV2hldGhlciBvciBub3QgdG8gc2hvdyBhIGRpYWxvZyB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGVBY3Rpb24oSUZpbGUgZmlsZSwgYm9vbGVhbiBzaG93RGlhbG9nKQotICB7Ci0gICAgdGhpcy5zaG93RGlhbG9nID0gc2hvd0RpYWxvZzsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlCi0gICAqICAgICAgICAgIFRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGUoZmluYWwgSUZpbGUgZmlsZSk7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZSAoVmFsaWRhdGlvbk1lc3NhZ2UgdiwgSU1lc3NhZ2UgbSkKLSAgeyAvLyBUaGlzIG1ldGhvZCBpcyBvdmVyaWRkZW4gYnkgc3ViY2xhc3NlcwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIG1hcmtlcnMgZm9yIHRoZSB2YWxpYXRpb24gbWVzc2FnZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gaUZpbGUKLSAgICogICAgICAgICAgVGhlIHJlc291cmNlIHRvIGNyZWF0ZSB0aGUgbWFya2VycyBvbi4KLSAgICogQHBhcmFtIHZhbG1lc3NhZ2VzCi0gICAqICAgICAgICAgIFRoZSBhcnJheSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlTWFya2VycyhJRmlsZSBpRmlsZSwgVmFsaWRhdGlvbk1lc3NhZ2VbXSB2YWxtZXNzYWdlcykKLSAgewotICAgIGlmICghZmlsZUlzT0soaUZpbGUpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG51bW1lc3NhZ2VzID0gdmFsbWVzc2FnZXMubGVuZ3RoOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtbWVzc2FnZXM7IGkrKykKLSAgICB7Ci0gICAgICBWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IHZhbG1lc3NhZ2VzW2ldOwotICAgICAgU3RyaW5nIHVyaSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFVyaSgpOwotCi0gICAgICBMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkZyYW1ld29ya1NldmVyaXR5KElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyksIHZhbGlkYXRpb25NZXNzYWdlCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSgpLCBpRmlsZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7IAotICAgICAgICBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkZyYW1ld29ya1NldmVyaXR5KElNYXJrZXIuU0VWRVJJVFlfRVJST1IpLCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRNZXNzYWdlKCksIGlGaWxlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgbWVzc2FnZS5zZXRMaW5lTm8odmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TGluZU51bWJlcigpKTsKLSAgICAgIGFkZEluZm9Ub01lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2UsIG1lc3NhZ2UpOwotICAgICAgCi0gICAgICBMaXN0IG5lc3RlZGVycm9ycyA9IHZhbGlkYXRpb25NZXNzYWdlLmdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0gICAgICBpZiAobmVzdGVkZXJyb3JzICE9IG51bGwgJiYgIW5lc3RlZGVycm9ycy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0R3JvdXBOYW1lKFJFRkVSRU5DRURfRklMRV9FUlJPUl9PUEVOICsgdXJpICsgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX0NMT1NFKTsKLSAgICAgIH0KLQotICAgICAgZ2V0T3JDcmVhdGVSZXBvcnRlcigpLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCi0gICAgICAKLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSBpRmlsZS5maW5kTWFya2VycyhudWxsLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0gICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGdyb3VwTmFtZSA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1JPVVBfTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ3JvdXBOYW1lICE9IG51bGwgJiYgZ3JvdXBOYW1lLnN0YXJ0c1dpdGgoUkVGRVJFTkNFRF9GSUxFX0VSUk9SKSkKLSAgICAgICAgewotCi0gICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkRPTkUsIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNsZWFyTWFya2VycyhJRmlsZSBpRmlsZSkKLSAgewotICAgIGlmIChmaWxlSXNPSyhpRmlsZSkpCi0gICAgewotICAgICAgZ2V0T3JDcmVhdGVSZXBvcnRlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKGdldFZhbGlkYXRvcigpLCBpRmlsZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAJdHJ5Ci0gIAl7Ci0gIAkJLy8gQ1MuLi4gYSB0ZW1wb3JhcnkgdGVzdCB0byBhdm9pZCBwZXJmb3JtaW5nIHZhbGlkYXRpb24gaW4gdGhlIGFic2VuY2Ugb2YgeGVyY2VzIAotICAJCS8vCi0gIAkJLy9kdyBDbGFzcyB0aGVDbGFzcyA9IAotICAJCUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VyQ29uZmlndXJhdGlvbiIsIHRydWUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsgLy8kTk9OLU5MUy0xJAotICAJCSAgCQkKLSAgCQlpZiAoZmlsZUlzT0soZmlsZSkpCi0gIAkJewotICAJCQkvLyBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGRpcnR5IGZvciB0aGlzIGZpbGUuIElmIHNvLCBwcm9tcHQgdGhlIHVzZXIgdG8KLSAgCQkJLy8gc2F2ZSBiZWZvcmUgdmFsaWRhdGluZy4KLSAgCQkJaWYoc2hvd0RpYWxvZykKLSAgCQkJewotICAJCQkJY2hlY2tJZkZpbGVEaXJ0eShmaWxlKTsKLSAgCQkJfQotICAJCQl0cnkKLSAgCQkJewotICAJCQkJdmFsaWRhdGUoZmlsZSk7Ci0gIAkJCX0KLSAgCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAJCQl7Ci0gIAkJCQlJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VySW5zdGFuY2UoKTsKLSAgCQkJCWxvZ2dlci5sb2dFcnJvcigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgCQkJCS8vICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgCQkJfQotICAJCX0KLSAgCX0KLSAgCWNhdGNoIChFeGNlcHRpb24gZSkKLSAgCXsJCQotICAJfQotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciB0aGUgZmlsZSBnaXZlbiBpcyBPSyB0byB1c2UuIEEgZmlsZSBpcyBPSyB0byB1c2UgaWYgMS4gSXQgaXMKLSAgICogbm90IG51bGwgMi4gSXQgZXhpc3RzLiAzLiBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBjaGVjay4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIE9LIHRvIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUlzT0soSUZpbGUgZmlsZSkKLSAgewotICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSAmJiBmaWxlLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSBmaWxlIGlzIGRpcnR5LiBBIGZpbGUgaXMgZGlydHkgaWYgdGhlcmUgaXMgYW4gb3BlbiBlZGl0b3IgZm9yCi0gICAqIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgY2hhbmdlcyB0aGF0IGhhdmVuJ3QgYmVlbiBzYXZlZC4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBkaXJ0eS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNoZWNrSWZGaWxlRGlydHkoSUZpbGUgZmlsZSkKLSAgewotICAgIElFZGl0b3JQYXJ0W10gZGlydHlFZGl0b3JzID0gV1NJVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAuZ2V0QWN0aXZlUGFnZSgpLmdldERpcnR5RWRpdG9ycygpOwotICAgIGludCBudW1lZGl0b3JzID0gZGlydHlFZGl0b3JzLmxlbmd0aDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWVkaXRvcnM7IGkrKykKLSAgICB7Ci0gICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBkaXJ0eUVkaXRvcnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotICAgICAgICBpZiAoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLl9VSV9TQVZFX0RJUlRZX0ZJTEVfTUVTU0FHRTsKLSAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfU0FWRV9ESVJUWV9GSUxFX1RJVExFOwotICAgICAgICAgIGlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZGlydHlFZGl0b3JzW2ldLmRvU2F2ZShudWxsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gVGhlcmUgY2FuIG9ubHkgYmUgb25lIG9wZW4gZWRpdG9yL2ZpbGUgc28gd2UgY2FuIGJyZWFrLgotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHJlcG9ydGVyLgotICAgKiAKLSAgICogQHJldHVybiBSZXR1cm5zIGEgSVJlcG9ydGVyCi0gICAqLwotICBwdWJsaWMgSVJlcG9ydGVyIGdldFJlcG9ydGVyKCkKLSAgewotICAgIHJldHVybiByZXBvcnRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZXBvcnRlci4KLSAgICogCi0gICAqIEBwYXJhbSByZXBvcnRlcgotICAgKiAgICAgICAgICBUaGUgcmVwb3J0ZXIgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLSAgICB0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHJldHVybiBSZXR1cm5zIGEgSVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvcgotICAgKiAgICAgICAgICBUaGUgdmFsaWRhdG9yIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKQotICB7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVJlcG9ydGVyIGdldE9yQ3JlYXRlUmVwb3J0ZXIoKQotICB7Ci0gICAgaWYgKHJlcG9ydGVyID09IG51bGwpCi0gICAgeyAKLSAgICAgIHJlcG9ydGVyID0gbmV3IFdvcmtiZW5jaFJlcG9ydGVyKGZpbGUuZ2V0UHJvamVjdCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlcG9ydGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIE9yaWdpbmFsbHkgZnJvbSAqdmFsaWRhdGlvbi5IZWxwZXIKLSAgICogCi0gICAqIEBwYXJhbSBzZXZlcml0eQotICAgKiAgICAgICAgICBUaGUgc2V2ZXJpdHkgZ2l2ZW4uCi0gICAqIEByZXR1cm4gVGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNldmVyaXR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBnZXRWYWxpZGF0aW9uRnJhbWV3b3JrU2V2ZXJpdHkoaW50IHNldmVyaXR5KQotICB7Ci0gICAgc3dpdGNoIChzZXZlcml0eSkgewotICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUjoKLSAgICAgIHJldHVybiBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOgotICAgICAgcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLSAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTzoKLSAgICAgIHJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0gICAgfQotICAgIHJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBPcGVuIGFuIGVycm9yIGRpYWxvZyB3aXRoIHRoZSBnaXZlbiB0aXRsZSBhbmQgbWVzc2FnZS4gU2hvdyB0aGUgcHJvYmxlbXMgdmlldwotICAgKiBpZiBpdCBpcyBub3QgYWxyZWFkeSB2aXNpYmxlLgotICAgKiAKLSAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgZXJyb3IgZGlhbG9nLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBpbiB0aGUgZXJyb3IgZGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb3BlbkVycm9yRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBzaG93UHJvYmxlbXNWaWV3KCk7Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICB9Ci0gIAotICAvKioKLSAgICogT3BlbiBhbiB3YXJuaW5nIGRpYWxvZyB3aXRoIHRoZSBnaXZlbiB0aXRsZSBhbmQgbWVzc2FnZS4gU2hvdyB0aGUgcHJvYmxlbXMgdmlldwotICAgKiBpZiBpdCBpcyBub3QgYWxyZWFkeSB2aXNpYmxlLgotICAgKiAKLSAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgd2FybmluZyBkaWFsb2cuCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGluIHRoZSB3YXJuaW5nIGRpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG9wZW5XYXJuaW5nRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBzaG93UHJvYmxlbXNWaWV3KCk7Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBPcGVuIGEgdmFsaWQgZGlhbG9nIHdpdGggdGhlIGdpdmVuIHRpdGxlIGFuZCBtZXNzYWdlLiAKLSAgICogCi0gICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhlIHZhbGlkIGRpYWxvZy4KLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgaW4gdGhlIHZhbGlkIGRpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG9wZW5WYWxpZERpYWxvZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICB9Ci0gIAotICAvKioKLSAgICogU2hvdyB0aGUgcHJvYmxlbXMgdmlldyBpZiBpdCBpcyBub3QgYWxyZWFkeSB2aXNpYmxlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2hvd1Byb2JsZW1zVmlldygpCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IGR3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZHcuZ2V0QWN0aXZlUGFnZSgpOwotICAgIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgcGFnZS5hY3RpdmF0ZShhY3RpdmVQYXJ0KTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEZvcm1hdCBhIGZpbGUgbmFtZSBpbnRvIGEgY29ycmVjdCBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGUgbmFtZSB0byBmb3JtYXQuCi0gICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBVUkkuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVVSSUZvckZpbGVQYXRoKFN0cmluZyBmaWxlbmFtZSkKLSAgewotICAJaWYoIWZpbGVuYW1lLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTF9OT19TTEFTSCkpCi0gICAgewotICAgICAgd2hpbGUoZmlsZW5hbWUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgfQotICAgICAgZmlsZW5hbWUgPSBGSUxFX1BST1RPQ09MICsgZmlsZW5hbWU7Ci0gICAgfQotICAJcmV0dXJuIGZpbGVuYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogVGhlIHZhbGlkYXRpb24gb3V0Y29tZSBjbGFzcyBob2xkcyB0aGUgcmVzdWx0cyBmcm9tIHZhbGlkYXRpbmcKLSAgICogYSBmaWxlLgotICAgKiAKLSAgICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFZhbGlkYXRpb25PdXRjb21lCi0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NhZ2VzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVmFsaWRhdGlvbk91dGNvbWUoKQotICAgIHsKLSAgICB9Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvV1NJVmFsaWRhdGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL1dTSVZhbGlkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YWFiODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvV1NJVmFsaWRhdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklNZXNzYWdlQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuYW5hbHl6ZXIuTWVzc2FnZUFuYWx5emVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuYW5hbHl6ZXIuV1NJQW5hbHl6ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnJlcG9ydC5Bc3NlcnRpb25FcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQWN0aW9uIGZvciBydW5uaW5nIHRoZSB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFdTSVZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgVmFsaWRhdGVBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotICAKLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsZmlsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudG5hbWUgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcGFyZW50bmFtZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBib29sZWFuIHdzZGxzcGVjaWZpZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhjZXB0aW9uQ2F1Z2h0ID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGYgVGhlIGZpbGUgdG8gdmFsaWRhdGUKLSAgICogQHBhcmFtIHNob3dEaWFsb2cgV2hldGhlciBvciBub3QgdG8gc2hvdyBhIHN0YXR1cyBkaWFsb2cgYWZ0ZXIgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0lWYWxpZGF0ZUFjdGlvbihJRmlsZSBmLCBib29sZWFuIHNob3dEaWFsb2cpCi0gIHsKLSAgCXN1cGVyKGYsIHNob3dEaWFsb2cpOwotICB9Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3Igd2l0aCBXU0RMIGVsZW1lbnQgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIGYgVGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBzaG93RGlhbG9nIFdoZXRoZXIgb3Igbm90IHRvIHNob3cgYSBzdGF0dXMgZGlhbG9nIGFmdGVyIHZhbGlkYXRpb24uCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBXU0RMIGZpbGUgdG8gdXNlIGZvciB2YWxpZGF0aW9uLgotICAgKiBAcGFyYW0gZWxlbWVudG5hbWUgVGhlIG5hbWUgb2YgdGhlIFdTREwgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBXU0RMIGVsZW1lbnQgdG8gdmFsaWRhdGUKLSAgICogQHBhcmFtIHBhcmVudG5hbWUgVGhlIHBhcmVudCBuYW1lIG9mIHRoZSBXU0RMIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqLwotICBwdWJsaWMgV1NJVmFsaWRhdGVBY3Rpb24oSUZpbGUgZiwgYm9vbGVhbiBzaG93RGlhbG9nLCBTdHJpbmcgZmlsZSwgU3RyaW5nIGVsZW1lbnRuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50bmFtZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgCXRoaXMoZiwgc2hvd0RpYWxvZyk7Ci0gIAlpZiAoZmlsZSAhPSBudWxsKQotICAJewotICAJICB3c2RsZmlsZSA9IGZpbGUucmVwbGFjZSgnXFwnLCAnLycpOwotICAJICBpZiAoKCF3c2RsZmlsZS5zdGFydHNXaXRoKFdTSUNvbnN0YW50cy5GSUxFX1BSRUZJWCkpICYmIAotICAJCSAgKCF3c2RsZmlsZS5zdGFydHNXaXRoKFdTSUNvbnN0YW50cy5IVFRQX1BSRUZJWCkpKQotICAgICAgewotICAJICAgIHdzZGxmaWxlID0gV1NJQ29uc3RhbnRzLkZJTEVfUFJPVE9DT0wgKyB3c2RsZmlsZTsgIAotICAJICB9Ci0gIAl9Ci0gIAl0aGlzLmVsZW1lbnRuYW1lID0gZWxlbWVudG5hbWU7Ci0gIAl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgCXRoaXMucGFyZW50bmFtZSA9IHBhcmVudG5hbWU7Ci0gIAl0aGlzLnR5cGUgPSB0eXBlOwotICAJdGhpcy53c2Rsc3BlY2lmaWVkID0gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS5WYWxpZGF0ZUFjdGlvbiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKGZpbmFsIElGaWxlIGZpbGUxKQotICB7Ci0gIAlmaW5hbCBNZXNzYWdlQW5hbHl6ZXIgbWVzc2FnZWFuYWx5emVyOwotICAJCi0gIAlpZih3c2Rsc3BlY2lmaWVkKQotICAJewotICAJICBtZXNzYWdlYW5hbHl6ZXIgPSBuZXcgTWVzc2FnZUFuYWx5emVyKFdTSUNvbnN0YW50cy5GSUxFX1BST1RPQ09MICsgZmlsZTEuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCB3c2RsZmlsZSwgZWxlbWVudG5hbWUsIG5hbWVzcGFjZSwgcGFyZW50bmFtZSwgdHlwZSk7CQotICAJfQotICAJZWxzZQotICAJewkKLSAgCSAgbWVzc2FnZWFuYWx5emVyID0gbmV3IE1lc3NhZ2VBbmFseXplcihXU0lDb25zdGFudHMuRklMRV9QUk9UT0NPTCArIGZpbGUxLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0gIAl9Ci0gIAkKLSAgCUlXb3Jrc3BhY2VSdW5uYWJsZSBvcCA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSAKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICAgICAgeyAgICAgICAgCi0gICAgICAgIGNsZWFyTWFya2VycyhmaWxlMSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgbWVzc2FnZWFuYWx5emVyLnZhbGlkYXRlQ29uZm9ybWFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV1NJQW5hbHl6ZXJFeGNlcHRpb24gYWUpCi0gICAgICAgIHsKLSAgICAgICAgCWV4Y2VwdGlvbkNhdWdodCA9IHRydWU7Ci0gICAgICAgIAlpZiAoYWUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBTQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgICAgCXsKLSAgICAgICAgCSAgY3JlYXRlTWFya2VycyhmaWxlMSwgbmV3IFZhbGlkYXRpb25NZXNzYWdlW117Y3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VGb3JFeGNlcHRpb24oKFNBWFBhcnNlRXhjZXB0aW9uKWFlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTk9STUFMKX0pOwotICAgICAgICAJfQotICAgICAgICAJZWxzZQotICAgICAgICAJewotICAgICAgICAgCSAgY3JlYXRlTWFya2VycyhmaWxlMSwgbmV3IFZhbGlkYXRpb25NZXNzYWdlW117Y3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VGb3JFeGNlcHRpb24oYWUsIFZhbGlkYXRpb25NZXNzYWdlLlNFVl9OT1JNQUwpfSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVNYXJrZXJzKGZpbGUxLCBjb252ZXJ0VmFsaWRhdGlvbk1lc3NhZ2VzKG1lc3NhZ2VhbmFseXplci5nZXRBc3NlcnRpb25XYXJuaW5ncygpLCBWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKSk7Ci0gICAgICAgIGNyZWF0ZU1hcmtlcnMoZmlsZTEsIGNvbnZlcnRWYWxpZGF0aW9uTWVzc2FnZXMobWVzc2FnZWFuYWx5emVyLmdldEFzc2VydGlvbkVycm9ycygpLCBWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTk9STUFMKSk7Ci0gICAgICAgIGZpbGUuc2V0U2Vzc2lvblByb3BlcnR5KFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SX01FU1NBR0VfTUFQX1FVQUxJRklFRF9OQU1FLCBnZXRPckNyZWF0ZVJlcG9ydGVyKCkuZ2V0TWVzc2FnZXMoKSk7Ci0JCX0KLSAgICB9OwotICAgCi0gICAgCi0gICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ob3AsIG51bGwpOwotICAgICBpZiAoc2hvd0RpYWxvZykKLSAgICAgIHsKLSAgICAgICAgaWYgKGV4Y2VwdGlvbkNhdWdodCkKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIAotICAgICAgICAgIAkJTWVzc2FnZXMuRVJST1JfVU5BQkxFX1RPX1ZBTElEQVRFLCAKLSAgICAgICAgICAJCU1lc3NhZ2VzLkVSUk9SX1BST0JMRU1TX1JFQURJTkdfV1NJTVNHX0ZJTEUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2VhbmFseXplci5nZXRBc3NlcnRpb25FcnJvcnMoKS5zaXplKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIAotICAgICAgICAgIAkJTWVzc2FnZXMuRVJST1JfVkFMSURBVElPTl9GQUlMRUQsIAotICAgICAgICAgIAkJTWVzc2FnZXMuRVJST1JfVEhFX1dTSU1TR19GSUxFX0lTX05PVF9WQUxJRCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWVzc2FnZWFuYWx5emVyLmdldEFzc2VydGlvbldhcm5pbmdzKCkuc2l6ZSgpICE9IDApCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLklORk9fVkFMSURBVElPTl9TVUNFRURFRDsKLSAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLldBUk5JTkdfVkFMSURBVElPTl9XQVJOSU5HU19ERVRFQ1RFRDsKLSAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuSU5GT19WQUxJREFUSU9OX1NVQ0VFREVEOwotICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuSU5GT19USEVfV1NJTVNHX0ZJTEVfSVNfVkFMSUQ7Ci0gICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXt9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgZnJvbSB0aGUgZXhjZXB0aW9uIGFuZCBzZXZlcml0eS4KLSAgICogCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IuCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkuCi0gICAqIEByZXR1cm4gQW4gZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCBWYWxpZGF0aW9uTWVzc2FnZSBjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihTQVhQYXJzZUV4Y2VwdGlvbiBlcnJvciwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgU3RyaW5nIHVyaSA9IGVycm9yLmdldFN5c3RlbUlkKCk7Ci0gICAgaWYodXJpID09IG51bGwpCi0gICAgewotICAgICAgdXJpID0gZXJyb3IuZ2V0UHVibGljSWQoKTsKLSAgICB9Ci0gICAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3IuZ2V0TWVzc2FnZSgpLCBlcnJvci5nZXRMaW5lTnVtYmVyKCksIGVycm9yLmdldENvbHVtbk51bWJlcigpLCB1cmkpOwotICAgIHZhbGlkYXRpb25NZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLSAgICByZXR1cm4gdmFsaWRhdGlvbk1lc3NhZ2U7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgZnJvbSB0aGUgZXhjZXB0aW9uIGFuZCBzZXZlcml0eS4KLSAgICogCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IuCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkuCi0gICAqIEByZXR1cm4gQW4gZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCBWYWxpZGF0aW9uTWVzc2FnZSBjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihXU0lBbmFseXplckV4Y2VwdGlvbiBlcnJvciwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3IuZ2V0TWVzc2FnZSgpLCAwLCAwKTsKLSAgICB2YWxpZGF0aW9uTWVzc2FnZS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0gICAgcmV0dXJuIHZhbGlkYXRpb25NZXNzYWdlOwotICB9Ci0gCi0gIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZVtdICBjb252ZXJ0VmFsaWRhdGlvbk1lc3NhZ2VzKExpc3QgbGlzdCwgaW50IG1hcmtlcikKLSAgewotCWlmIChsaXN0ICE9IG51bGwpCi0JewotCSAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkgIFZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2Vbc2l6ZV07Ci0JIAotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEFzc2VydGlvbkVycm9yIGFzc2VydGlvbkVycm9yID0gKEFzc2VydGlvbkVycm9yKSBsaXN0LmdldChpKTsKLQotICAgICAgICBpbnQgbiA9IGFzc2VydGlvbkVycm9yLmdldExpbmUoKTsKLSAgICAgICAgaW50IGMgPSBhc3NlcnRpb25FcnJvci5nZXRDb2x1bW4oKTsKLSAgICAgICAgU3RyaW5nIG0gPSBXU0lDb25zdGFudHMuV1NJX1BSRUZJWCArICIoIiArIGFzc2VydGlvbkVycm9yLmdldEFzc2VydGlvbklEKCkrICIpICIgKyBhc3NlcnRpb25FcnJvci5nZXRFcnJvck1lc3NhZ2UoKTsKLSAgICAgIAotICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKG0sbiwgYyk7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0U2V2ZXJpdHkobWFya2VyKTsKLSAgICAgICAgbWVzc2FnZXNbaV0gPSBtZXNzYWdlOwotICAgICAgfQotICAgICAgcmV0dXJuIG1lc3NhZ2VzOwotICAgIH0KLQlyZXR1cm4gbmV3IFZhbGlkYXRpb25NZXNzYWdlWzBdOwotICB9Ci0KLSAvKioKLSAgcHJvdGVjdGVkIElSZXBvcnRlciBnZXRPckNyZWF0ZVJlcG9ydGVyKCkKLSAgewotICAgIGlmIChyZXBvcnRlciA9PSBudWxsKQotICAgIHsgCi0gICAgICByZXBvcnRlciA9IG5ldyBSZXBvcnRlcigpOwotICAgIH0KLSAgICByZXR1cm4gcmVwb3J0ZXI7Ci0gIH0KLSAgKi8KLSAgLy8gTXkgSW1wbGVtZW50YXRpb24gb2YgSVJlcG9ydGVyCi0gIGNsYXNzIFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIAotICB7Ci0JTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFJlcG9ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZUFjY2VzcyBnZXRNZXNzYWdlQWNjZXNzKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsgLy8gZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4sIE9iamVjdCBvYmplY3QpIHsgLy8gZG8KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5vdAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmVlZAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gdG8KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGltcGxlbWVudAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3Igb3JpZ2luKSB7Ly8gZG8gbm90IG5lZWQgdG8KLQkJCQkJCQkJCQkJCQkJLy8gaW1wbGVtZW50Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgey8vIGRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5vdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuZWVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGltcGxlbWVudAotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3Igb3JpZ2luLCBJTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIAotCXsKLQkJbGlzdC5hZGQobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIAotCXsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL1dTSVZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0lWYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDFhMmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL1dTSVZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgV1NJVmFsaWRhdGlvblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMud3NpdmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV1NJVmFsaWRhdGlvblVJTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV1NJVmFsaWRhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0FWRV9ESVJUWV9GSUxFX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NBVkVfRElSVFlfRklMRV9USVRMRTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2FjdGlvbkRlbGVnYXRlcy9SZXF1ZXN0SGFuZGxlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2FjdGlvbkRlbGVnYXRlcy9SZXF1ZXN0SGFuZGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1ZjYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9hY3Rpb25EZWxlZ2F0ZXMvUmVxdWVzdEhhbmRsZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuYWN0aW9uRGVsZWdhdGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBSZXF1ZXN0SGFuZGxlciBpbnRlcmZhY2Ugd2hpY2ggcmVwcmVzZW50cyBhIFRDUC9JUAotICogcmVxdWVzdCBtYWRlIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4gRWFjaCByZXF1ZXN0IAotICogcmVwcmVzZW50cyBhIHJlcXVlc3QtcmVzcG9uc2UgcGFpciwgd2hlcmUgdGhlIHJlcXVlc3QgaXMgZnJvbSAKLSAqIGNsaWVudCAtPiBzZXJ2ZXIsIGFuZCB0aGUgcmVzcG9uc2UgaXMgZnJvbSBzZXJ2ZXIgLT4gY2xpZW50LgotICogCi0gKiBAYXV0aG9yIGxhdXpvbmQKLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RIYW5kbGVySW1wbCBpbXBsZW1lbnRzIFJlcXVlc3RIYW5kbGVyIAotewotCS8qKgotCSAqIFRoZSBIVFRQIGhlYWRlciBvZiB0aGUgcmVxdWVzdCBwb3J0aW9uIG9mIHRoaXMgcmVxdWVzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlcXVlc3RIZWFkZXI7Ci0JCi0JLyoqCi0JICogVGhlIEhUVFAgaGVhZGVyIG9mIHRoZSByZXNwb25zZSBwb3J0aW9uIG9mIHRoaXMgcmVxdWVzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlc3BvbnNlSGVhZGVyOwotCi0JLyoqCi0JICogVGhlIEhUVFAgYm9keSBvZiB0aGUgcmVxdWVzdCBwb3J0aW9uIG9mIHRoaXMgcmVxdWVzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlcXVlc3RDb250ZW50OwotCi0JLyoqCi0JICogVGhlIEhUVFAgYm9keSBvZiB0aGUgcmVzcG9uc2UgcG9ydGlvbiBvZiB0aGlzIHJlcXVlc3QuCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSByZXNwb25zZUNvbnRlbnQ7Ci0KLQkvKioKLQkgKiBUaGUgdGltZSB0aGlzIHJlcXVlc3Qgd2FzIG1hZGUuCi0JICovCi0JcHJvdGVjdGVkIERhdGUgZGF0ZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogVGhlIGxvY2FsIChjbGllbnQpIHBvcnQuCi0JICovCi0JcHJvdGVjdGVkIGludCBsb2NhbFBvcnQgPSAwOwotCi0JLyoqCi0JICogVGhlIHJlbW90ZSAoc2VydmVyKSBwb3J0LgotCSAqLwotCXByb3RlY3RlZCBpbnQgcmVtb3RlUG9ydCA9IDA7Ci0JCi0JLyoqCi0JICogVGhlIHJlbW90ZSAoc2VydmVyKSBob3N0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVtb3RlSG9zdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgc2VydmVyJ3MgcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuIAotCSAqLwotCXByb3RlY3RlZCBsb25nIHJlc3BvbnNlVGltZSA9IDA7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogQHBhcmFtIHJlcXVlc3QgYSBUQ1AvSVAgcmVxdWVzdAotCSAqLwotCVJlcXVlc3RIYW5kbGVySW1wbChSZXF1ZXN0IHJlcXVlc3QpCi0JewotCSAgaWYgKHJlcXVlc3QgIT0gbnVsbCkKLQkgIHsKLQkJdGhpcy5yZXF1ZXN0SGVhZGVyID0gcmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuVFJBTlNQT1JUKTsKLQkJdGhpcy5yZXF1ZXN0Q29udGVudCA9IHJlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LkNPTlRFTlQpOwotCQl0aGlzLnJlc3BvbnNlSGVhZGVyID0gcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LlRSQU5TUE9SVCk7Ci0JCXRoaXMucmVzcG9uc2VDb250ZW50ID0gcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LkNPTlRFTlQpOwotCQl0aGlzLmRhdGUgPSByZXF1ZXN0LmdldERhdGUoKTsKLQkJdGhpcy5sb2NhbFBvcnQgPSByZXF1ZXN0LmdldExvY2FsUG9ydCgpOwotCQl0aGlzLnJlbW90ZVBvcnQgPSByZXF1ZXN0LmdldFJlbW90ZVBvcnQoKTsKLQkJdGhpcy5yZW1vdGVIb3N0ID0gcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCk7Ci0JCXRoaXMucmVzcG9uc2VUaW1lID0gcmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKTsKLQkgIH0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNnZXRSZXF1ZXN0SGVhZGVyKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFJlcXVlc3RIZWFkZXIoKSAKLQl7Ci0JCXJldHVybiB0aGlzLnJlcXVlc3RIZWFkZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNzZXRSZXF1ZXN0SGVhZGVyKGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0SGVhZGVyKGJ5dGVbXSByZXF1ZXN0SGVhZGVyKSAKLQl7Ci0JCXRoaXMucmVxdWVzdEhlYWRlciA9IHJlcXVlc3RIZWFkZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNnZXRSZXNwb25zZUhlYWRlcigpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRSZXNwb25zZUhlYWRlcigpIAotCXsKLQkJcmV0dXJuIHRoaXMucmVzcG9uc2VIZWFkZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNzZXRSZXNwb25zZUhlYWRlcihieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzcG9uc2VIZWFkZXIoYnl0ZVtdIHJlc3BvbnNlSGVhZGVyKSAKLQl7Ci0JCXRoaXMucmVzcG9uc2VIZWFkZXIgPSByZXNwb25zZUhlYWRlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLlJlcXVlc3RIYW5kbGVyI2dldFJlcXVlc3RDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFJlcXVlc3RDb250ZW50KCkgCi0JewotCQlyZXR1cm4gdGhpcy5yZXF1ZXN0Q29udGVudDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLlJlcXVlc3RIYW5kbGVyI3NldFJlc3BvbnNlQ29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzcG9uc2VDb250ZW50KGJ5dGVbXSByZXNwb25zZUNvbnRlbnQpIAotCXsKLQkJdGhpcy5yZXNwb25zZUNvbnRlbnQgPSByZXNwb25zZUNvbnRlbnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNnZXRSZXNwb25zZUNvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0UmVzcG9uc2VDb250ZW50KCkgCi0JewotCQlyZXR1cm4gdGhpcy5yZXNwb25zZUNvbnRlbnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNzZXRSZXF1ZXN0Q29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWVzdENvbnRlbnQoYnl0ZVtdIHJlcXVlc3RDb250ZW50KSAKLQl7Ci0JCXRoaXMucmVxdWVzdENvbnRlbnQgPSByZXF1ZXN0Q29udGVudDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLlJlcXVlc3RIYW5kbGVyI2dldERhdGUoKQotCSAqLwotCXB1YmxpYyBEYXRlIGdldERhdGUoKSAKLQl7Ci0JCXJldHVybiB0aGlzLmRhdGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNzZXREYXRlKGphdmEudXRpbC5EYXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGUoRGF0ZSBkYXRlKSAKLQl7Ci0JCXRoaXMuZGF0ZSA9IGRhdGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNnZXRMb2NhbFBvcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgCi0JewotCQlyZXR1cm4gdGhpcy5sb2NhbFBvcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNzZXRMb2NhbFBvcnQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsUG9ydChpbnQgbG9jYWxQb3J0KSAKLQl7Ci0JCXRoaXMubG9jYWxQb3J0ID0gbG9jYWxQb3J0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuUmVxdWVzdEhhbmRsZXIjZ2V0UmVtb3RlUG9ydCgpCi0JICovCi0JcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgCi0JewotCQlyZXR1cm4gdGhpcy5yZW1vdGVQb3J0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuUmVxdWVzdEhhbmRsZXIjc2V0UmVtb3RlUG9ydChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlUG9ydChpbnQgcmVtb3RlUG9ydCkgCi0JewotCQl0aGlzLnJlbW90ZVBvcnQgPSByZW1vdGVQb3J0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuUmVxdWVzdEhhbmRsZXIjZ2V0UmVtb3RlSG9zdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgCi0JewotCQlyZXR1cm4gdGhpcy5yZW1vdGVIb3N0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuUmVxdWVzdEhhbmRsZXIjc2V0UmVtb3RlSG9zdChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZUhvc3QoU3RyaW5nIHJlbW90ZUhvc3QpIAotCXsKLQkJdGhpcy5yZW1vdGVIb3N0ID0gcmVtb3RlSG9zdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLlJlcXVlc3RIYW5kbGVyI2dldFJlc3BvbnNlVGltZSgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0UmVzcG9uc2VUaW1lKCkgCi0JewotCQlyZXR1cm4gdGhpcy5yZXNwb25zZVRpbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlciNzZXRSZXNwb25zZVRpbWUobG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNwb25zZVRpbWUobG9uZyByZXNwb25zZVRpbWUpIAotCXsKLQkJdGhpcy5yZXNwb25zZVRpbWUgPSByZXNwb25zZVRpbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvYWN0aW9uRGVsZWdhdGVzL1ZhbGlkYXRlV1NJTG9nRmlsZUFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9hY3Rpb25EZWxlZ2F0ZXMvVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0MTBlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9hY3Rpb25EZWxlZ2F0ZXMvVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuYWN0aW9ucy5hY3Rpb25EZWxlZ2F0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLldTSVZhbGlkYXRlQWN0aW9uOwotCi0KLS8qKgotICogQWN0aW9uIGRlbGVnYXRlIGZvciB2YWxpZGF0aW5nIGEgV1MtSSBsb2cgZmlsZS4KLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgLyoqCi0gICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uCi0gICAqLwotICBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBPYmplY3QgIG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSlvYmo7Ci0gICAgICAgICAgV1NJTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbmV3IFdTSU1lc3NhZ2VWYWxpZGF0b3IoKTsKLSAgICAgICAgICBXU0lWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IG5ldyBXU0lWYWxpZGF0ZUFjdGlvbihmaWxlLCB0cnVlKTsKLSAgICAgICAgICB2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IobWVzc2FnZVZhbGlkYXRvcik7Ci0gICAgICAgICAgdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2FjdGlvbkRlbGVnYXRlcy9WYWxpZGF0ZVdTSVByb2ZpbGVBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvYWN0aW9uRGVsZWdhdGVzL1ZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmFlNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvYWN0aW9uRGVsZWdhdGVzL1ZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLmFjdGlvbkRlbGVnYXRlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5SZXF1ZXN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwud2l6YXJkcy5WYWxpZGF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci0KLS8qKgotICogQWN0aW9uIGRlbGVnYXRlIGZvciB0aGUgV1MtSSB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgV1MtSSBNZXNzYWdlIExvZyBmaWxlbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HX0ZJTEVOQU1FID0gImxvZy53c2ltc2ciOwotCi0gIC8qKgotICAgKiBUaGUgSFRUUCBwcm90b2NvbC4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFAgPSAiaHR0cDovLyI7Ci0gIAotICAKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHRhZyBmb3IgV1NETCBsb2NhdGlvbnMuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBXU0RMID0gIj9XU0RMIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgY3VycmVudCBzZWxlY3Rpb24sIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uLgotICAgKi8KLSAgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgLyoqCi0gICAqIFRoZSBsaXN0IG9mIG1lc3NhZ2VzIGluIHRoZSBmb3JtIG9mIHJlcXVlc3QtcmVzcG9uc2UgcGFpcnMuCi0gICAqLwotICBSZXF1ZXN0W10gcmVxdWVzdFJlc3BvbnNlczsKLQotICAvKioKLSAgICogVGhlIHZpZXcgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhpcyBkZWxlZ2F0ZS4KLSAgICovCi0gIElWaWV3UGFydCB2aWV3OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTSVByb2ZpbGVBY3Rpb25EZWxlZ2F0ZSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KQotICB7Ci0gICAgdGhpcy52aWV3ID0gdmlldzsKLSAgfQotCi0gIC8qKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0gICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpCi0gICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgewotICAgICAgICB2YWxpZGF0ZShwcm9ncmVzc01vbml0b3IpOwotICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgb3BlcmF0aW9uLnJ1bihudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHZhbGlkYXRlIGFjdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmVxdWVzdFJlc3BvbnNlcyA9IE1vbml0b3JVSUNvcmUuZ2V0UmVxdWVzdHMoKTsKLSAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgIGlmICgocmVxdWVzdFJlc3BvbnNlcyAhPSBudWxsKSAmJiAocmVxdWVzdFJlc3BvbnNlcy5sZW5ndGggPiAwKSkKLSAgICAgIHsKLSAgICAgICAgVmFsaWRhdGlvbldpemFyZCB2YWxpZGF0ZVdpemFyZCA9IG5ldyBWYWxpZGF0aW9uV2l6YXJkKERFRkFVTFRfTE9HX0ZJTEVOQU1FKTsKLSAgICAgICAgTGlzdCB3c2RsbG9jcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgIAlmb3IgKGludCBpPTA7IGk8cmVxdWVzdFJlc3BvbnNlcy5sZW5ndGg7IGkrKykKLSAgICAgIAl7Ci0gICAgICAJICBSZXF1ZXN0IHJlcXJlc3AgPSByZXF1ZXN0UmVzcG9uc2VzW2ldOwotICAgICAgCSAgU3RyaW5nIHJlbW90ZWhvc3QgPSByZXFyZXNwLmdldFJlbW90ZUhvc3QoKTsKLSAgICAgIAkgIGludCByZW1vdGVwb3J0ID0gcmVxcmVzcC5nZXRSZW1vdGVQb3J0KCk7Ci0gICAgICAJICBTdHJpbmcgcmVtb3RlbGFiZWwgPSByZXFyZXNwLmdldE5hbWUoKTsKLSAgICAgIAkgIFN0cmluZyBsb2NhdGlvbiA9IEhUVFAgKyByZW1vdGVob3N0ICsgIjoiICsgcmVtb3RlcG9ydCArIHJlbW90ZWxhYmVsICsgV1NETDsKLSAgICAgIAkgIGlmKCF3c2RsbG9jcy5jb250YWlucyhsb2NhdGlvbikpCi0gICAgICAJICB7Ci0gICAgICAJICAgIHdzZGxsb2NzLmFkZChsb2NhdGlvbik7Ci0gICAgICAJICB9Ci0gICAgICAJfQotICAgICAgCi0gICAgICAgIHZhbGlkYXRlV2l6YXJkLnNldFdTRExMb2NhdGlvbnMoKFN0cmluZ1tdKXdzZGxsb2NzLnRvQXJyYXkobmV3IFN0cmluZ1t3c2RsbG9jcy5zaXplKCldKSk7Ci0gICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB2YWxpZGF0ZVdpemFyZCk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQotICAgICAgICBpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQotICAgICAgICBpZiAodmFsaWRhdGVXaXphcmQuaXNWYWxpZCgpICYmIChyZXN1bHQgIT0gb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdy5DQU5DRUwpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQgbm93Ci0gICAgICAgICAgY2hlY2tBbmRDcmVhdGVDb250YWluZXIodmFsaWRhdGVXaXphcmQuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0KLSAgICAgICAgICBJRmlsZSBmaWxlID0gdmFsaWRhdGVXaXphcmQuZ2V0RmlsZSgpOwotICAgICAgICAgIExvZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBMb2dCdWlsZGVyKGZpbGUpOwotICAgICAgICAgIExvZyBsb2cgPSBidWlsZGVyLmJ1aWxkTG9nKGdldFJlcXVlc3RIYW5kbGVycyhyZXF1ZXN0UmVzcG9uc2VzKSk7Ci0KLSAgICAgICAgICBidWlsZGVyLndyaXRlTG9nKGxvZyk7Ci0gICAgICAgICAgZmlsZS5yZWZyZXNoTG9jYWwoMSwgcHJvZ3Jlc3NNb25pdG9yKTsKLSAgICAgICAgCi0gICAgICAgICAgV1NJVmFsaWRhdG9yIG1lc3NhZ2VWYWxpZGF0b3IgPSBuZXcgV1NJVmFsaWRhdG9yKCk7Ci0gICAgICAgICAgaWYodmFsaWRhdGVXaXphcmQuaW5jbHVkZVdTRExGaWxlKCkpCi0gICAgICAgICAgewkKLSAgICAgICAgCVN0cmluZyB3c2RsZmlsZSA9IHZhbGlkYXRlV2l6YXJkLmdldFdTRExGaWxlKCk7Ci0gICAgICAgIAlTdHJpbmcgbmFtZSA9IHZhbGlkYXRlV2l6YXJkLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgIAlTdHJpbmcgbmFtZXNwYWNlID0gdmFsaWRhdGVXaXphcmQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIAlTdHJpbmcgcGFyZW50bmFtZSA9IHZhbGlkYXRlV2l6YXJkLmdldFBhcmVudE5hbWUoKTsKLSAgICAgICAgCVN0cmluZyB0eXBlID0gdmFsaWRhdGVXaXphcmQuZ2V0VHlwZSgpOwotICAgICAgICAJbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZShmaWxlLCB3c2RsZmlsZSwgbmFtZSwgbmFtZXNwYWNlLCBwYXJlbnRuYW1lLCB0eXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsJCi0gICAgICAgIAltZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlKGZpbGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBubyBhdmFpbGFibGUgbWVzc2FnZXMgdG8gdmFsaWRhdGUKLSAgICAJICBTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5BQ1RJT05fV1NJX1ZBTElEQVRPUjsKLSAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLklORk9fTk9fTUVTU0FHRVNfVE9fVkFMSURBVEU7Ci0gICAgCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTGlzdCBnZXRSZXF1ZXN0SGFuZGxlcnMoUmVxdWVzdFtdIHJlcXVlc3RSZXNwb25zZXMpIAotICB7Ci0JTGlzdCByZXF1ZXN0SGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JaW50IHNpemUgPSByZXF1ZXN0UmVzcG9uc2VzLmxlbmd0aDsKLQlmb3IgKGludCBpID0gMDsgaTxzaXplOyBpKyspCi0JewotCSAgUmVxdWVzdCByZXF1ZXN0ID0gcmVxdWVzdFJlc3BvbnNlc1tpXTsKLQkgIFJlcXVlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUmVxdWVzdEhhbmRsZXJJbXBsKHJlcXVlc3QpOwotCSAgcmVxdWVzdEhhbmRsZXJzLmFkZChoYW5kbGVyKTsKLQl9Ci0JcmV0dXJuIHJlcXVlc3RIYW5kbGVyczsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICB9Ci0gCi0gIC8qKgotICAgKiBJZiB0aGUgY29udGFpbmVyIGRvZXNuJ3QgZXhpc3QgZm9yIHRoZSBzZWxlY3RlZCBJRmlsZSwgY3JlYXRlIGl0IG5vdy4KLSAgICogCi0gICAqIEBwYXJhbSBjb250YWluZXJQYXRoIFRoZSBjb250YWluZXIgZm9yIHRoZSBzZWxlY3RlZCBJRmlsZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0FuZENyZWF0ZUNvbnRhaW5lcihJUGF0aCBjb250YWluZXJQYXRoKQotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGNvbnRhaW5lclBhdGgpOwotICAgIAotICAgIC8vIElmIHRoZSBjb250YWluZXIgZG9lc24ndCBleGlzdCBpbiB0aGUgd29ya3NwYWNlLCBjcmVhdGUgaXQuCi0gICAgaWYgKHJlc291cmNlID09IG51bGwpIAotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBDb250YWluZXJHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvbnRhaW5lckdlbmVyYXRvcihjb250YWluZXJQYXRoKTsKLSAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlQ29udGFpbmVyKG51bGwpOwotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2ljb25zL3dzaV9sb2dmaWxlX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9pY29ucy93c2lfbG9nZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M4ZDNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2ljb25zL3dzaV9sb2dmaWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy93c2l2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy93c2l2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Zjc0NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvd3NpdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyBDb25zdGFudHMgZm9yIHN0cmluZ3MgIAotCi0jCi0jIERpcnR5IEZpbGUgRGlhbG9nIFJlbGF0ZWQgTWVzc2FnZXMKLSMKLV9VSV9TQVZFX0RJUlRZX0ZJTEVfTUVTU0FHRSAgICAgICAgID0gQW4gb3BlbiBlZGl0b3IgY29udGFpbnMgY2hhbmdlcyB0byB0aGlzIGZpbGUgdGhhdCBoYXZlIG5vdCBiZWVuIHNhdmVkLiBEbyB5b3Ugd2FudCB0byBzYXZlIHRoZSBmaWxlIGJlZm9yZSBydW5uaW5nIHZhbGlkYXRpb24/IChJZiB5b3UgZG8gbm90IHNhdmUgdGhlIGZpbGUgdGhlIHByZXZpb3VzbHkgc2F2ZWQgdmVyc2lvbiB3aWxsIGJlIHZhbGlkYXRlZC4pCi1fVUlfU0FWRV9ESVJUWV9GSUxFX1RJVExFICAgICAgICAgICA9IFNhdmUgZmlsZT8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzOGI5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvcjsKLQotLyoqCi0gKiBUaGlzIHdpemFyZCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIAotICogV1MtSSBNZXNzYWdlIExvZyBmaWxlIGZvciBwdXJwb3NlcyBvZiB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQKLXsKLSAgLyoqCi0gICAqIFdpemFyZCBwYWdlIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSAKLSAgICogV1MtSSBNZXNzYWdlIExvZyBmaWxlIGZvciBwdXJwb3NlcyBvZiB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFZhbGlkYXRpb25XaXphcmRMb2dQYWdlIGxvZ1BhZ2U7Ci0KLSAgLyoqCi0gICAqIFdpemFyZCBwYWdlIHRvIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgbG9jYXRpb24KLSAgICogb2YgdGhlIFdTREwgZG9jdW1lbnQgZm9yIHRoZSBXZWIgc2VydmljZS4KLSAgICovCi0gIHByb3RlY3RlZCBWYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2Ugd3NkbFBhZ2U7Ci0KLSAgLyoqCi0gICAqIFdpemFyZCBwYWdlIHRvIHNwZWNpZnkgdGhlIG5hbWUsIHR5cGUgYW5kIG5hbWVzcGFjZQotICAgKiBmb3IgdGhlIFdTREwgZWxlbWVudCB0byBhbmFseXplLgotICAgKi8KLSAgcHJvdGVjdGVkIFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2Ugd3NkbENvbnRlbnRQYWdlOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IFdTLUkgTWVzc2FnZSBmaWxlbmFtZSBwYXNzZWQgaW4gdGhlIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZTsKLQotICAvKioKLSAgICogVGhlIHNlbGVjdGVkIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJRmlsZSBmaWxlOwotCi0gIC8qKgotICAgKiBUaGUgY29udGFpbmVyIGhvbGRpbmcgdGhlIHNlbGVjdGVkIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJUGF0aCBjb250YWluZXJGdWxsUGF0aDsKLQotICAvKioKLSAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgc2VsZWN0ZWQgZmlsZSBpcyB2YWxpZC4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50bmFtZTsKLQotICAvKioKLSAgICogVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRuYW1lOwotCi0gIC8qKgotICAgKiBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQotICAvKioKLSAgICogVGhlIFdTREwgZmlsZSB0byB1c2UgZm9yIHZhbGlkYXRpb247Ci0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxmaWxlOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIGEgV1NETCBmaWxlIGlzIGluY2x1ZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRld3NkbGZpbGU7Ci0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGxpc3Qgb2YgV1NETCBsb2NhdGlvbnMgdGhlIHVzZXIgY2FuIGNob29zZSBmcm9tLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIHdzZGxsb2NhdGlvbnMgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZmlsZW5hbWUgRGVmYXVsdCBtZXNzYWdlIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbldpemFyZChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgdGhpcy5zZXRXaW5kb3dUaXRsZShNZXNzYWdlcy5WQUxJREFUSU9OX1dJWkFSRF9USVRMRSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoCi0gICAgICBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NJVUlQbHVnaW4uY2xhc3MsIFJlc291cmNlLlZBTElEQVRFX1dTSV9MT0dGSUxFX1dJWikpOwotICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjYWRkUGFnZXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgbG9nUGFnZSA9IG5ldyBWYWxpZGF0aW9uV2l6YXJkTG9nUGFnZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFJlc291cmNlTmF2aWdhdG9yU2VsZWN0aW9uKCksIGZpbGVuYW1lKTsKLSAgICB3c2RsUGFnZSA9IG5ldyBWYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2UoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRSZXNvdXJjZU5hdmlnYXRvclNlbGVjdGlvbigpKTsKLSAgICB3c2RsQ29udGVudFBhZ2UgPSBuZXcgVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFJlc291cmNlTmF2aWdhdG9yU2VsZWN0aW9uKCkpOwotICAgIGFkZFBhZ2UobG9nUGFnZSk7Ci0gICAgYWRkUGFnZSh3c2RsUGFnZSk7Ci0gICAgYWRkUGFnZSh3c2RsQ29udGVudFBhZ2UpOwotCi0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBUcnVlIGlmIGEgV1NETCBmaWxlIGlzIGluY2x1ZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlV1NETEZpbGUoKQotICB7Ci0gICAgaWYgKCFpc1ZhbGlkKQotICAgIHsKLSAgICAgIHJldHVybiB3c2RsUGFnZS5pbmNsdWRlV1NETEZpbGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluY2x1ZGV3c2RsZmlsZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVsZW1lbnQgbmFtZSB0byB2YWxpZGF0ZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgbmFtZSB0byB2YWxpZGF0ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZXNwYWNlIGZvciB0aGUgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkKLSAgewotICAgIHJldHVybiBwYXJlbnRuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdTRExGaWxlKCkKLSAgewotICAgIGlmICghaXNWYWxpZCkKLSAgICB7Ci0gICAgICByZXR1cm4gd3NkbFBhZ2UuZ2V0V1NETEZpbGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxmaWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0TmV4dFBhZ2Uob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQotICAgKi8KLSAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIGN1cnJlbnRQYWdlKQotICB7Ci0gICAgaWYgKGN1cnJlbnRQYWdlID09IHdzZGxQYWdlKQotICAgIHsKLSAgICAgIGlmICghd3NkbFBhZ2UuaW5jbHVkZVdTRExGaWxlKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgcmVhZGVyLnJlYWRXU0RMKGdldFdTRExGaWxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBXU0RMIGZpbGUgdGhlcmUgaXMgbm8gbmV4dCBwYWdlLgotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXROZXh0UGFnZShjdXJyZW50UGFnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RlZCBmaWxlIGlzIGEgdmFsaWQgV1MtSSBNZXNzYWdlIExvZyBmaWxlbmFtZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2VsZWN0ZWQgZmlsZSBpcyBhIHZhbGlkIFdTLUkgTWVzc2FnZSBMb2cgZmlsZW5hbWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiBpc1ZhbGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIGZpbGUgPSBsb2dQYWdlLmdldEZpbGUoKTsKLSAgICBjb250YWluZXJGdWxsUGF0aCA9IGxvZ1BhZ2UuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLSAgICBpbmNsdWRld3NkbGZpbGUgPSB3c2RsUGFnZS5pbmNsdWRlV1NETEZpbGUoKTsKLSAgICB3c2RsZmlsZSA9IHdzZGxQYWdlLmdldFdTRExGaWxlKCk7Ci0gICAgZWxlbWVudG5hbWUgPSB3c2RsQ29udGVudFBhZ2UuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICBuYW1lc3BhY2UgPSB3c2RsQ29udGVudFBhZ2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgcGFyZW50bmFtZSA9IHdzZGxDb250ZW50UGFnZS5nZXRQYXJlbnROYW1lKCk7Ci0gICAgdHlwZSA9IHdzZGxDb250ZW50UGFnZS5nZXRUeXBlKCk7Ci0gICAgaXNWYWxpZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmlsZSBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgY2hvb3NlIHBhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBmaWxlIHNlbGVjdGVkYnkgdGhlIHVzZXIgaW4gdGhlIGNob29zZSBwYWdlLgotICAgKi8KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSVBhdGggY29udGFpbmluZyB0aGUgc2VsZWN0ZWQgSUZpbGUuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBJUGF0aCBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBJRmlsZS4KLSAgICovCi0gIHB1YmxpYyBJUGF0aCBnZXRDb250YWluZXJGdWxsUGF0aCgpCi0gIHsKLSAgICByZXR1cm4gY29udGFpbmVyRnVsbFBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGluIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3Igdmlldy4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcuCi0gICAqLwotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRSZXNvdXJjZU5hdmlnYXRvclNlbGVjdGlvbigpCi0gIHsKLSAgICBJVmlld1JlZmVyZW5jZSB2aWV3UGFydHNbXSA9Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRWaWV3UmVmZXJlbmNlcygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aWV3UGFydHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHZpZXdQYXJ0c1tpXSBpbnN0YW5jZW9mIFJlc291cmNlTmF2aWdhdG9yKQotICAgICAgewotICAgICAgICByZXR1cm4gKChSZXNvdXJjZU5hdmlnYXRvcikgdmlld1BhcnRzW2ldKS5nZXRWaWV3U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbGlzdCBvZiBXU0RMIGxvY2F0aW9ucyB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGZyb20uCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbGxvY2F0aW9ucyBBIGxpc3Qgb2YgV1NETCBkb2N1bWVudCBsb2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMTG9jYXRpb25zKFN0cmluZ1tdIHdzZGxsb2NhdGlvbnMpIAotICB7Ci0JdGhpcy53c2RsbG9jYXRpb25zID0gd3NkbGxvY2F0aW9uczsKLQkKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBXU0RMIGxvY2F0aW9ucyB0aGUgdXNlciBjYW4gY2hvb3NlIGZyb20uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFdTREwgbG9jYXRpb25zLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFdTRExMb2NhdGlvbnMoKQotICB7Ci0gIAlyZXR1cm4gd3NkbGxvY2F0aW9uczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmRMb2dQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODhjYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIAotICogV1MtSSBNZXNzYWdlIExvZyBmaWxlIGZvciBwdXJwb3NlcyBvZiB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25XaXphcmRMb2dQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZQotewotICAvKioKLSAgICogUmVjb21tZW5kZWQgZXh0ZW5zaW9uIGZvciBhIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTSV9MT0dfRVhURU5TSU9OID0gIndzaW1zZyI7Ci0gCi0gIC8qKgotICAgKiBEZWZhdWx0IFdTLUkgTWVzc2FnZSBmaWxlbmFtZSBwYXNzZWQgaW4gdGhlIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZTsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBzZWxlY3Rpb246IHNlbGVjdGlvbiBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcuCi0gICAqIEBwYXJhbSBmaWxlbmFtZTogZGVmYXVsdCBtZXNzYWdlIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICBzdXBlcigiVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UiLCBzZWxlY3Rpb24pOwotICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICB0aGlzLnNldFRpdGxlKE1lc3NhZ2VzLkxPR19QQUdFX1NFTEVDVF9MT0dfRklMRU5BTUVfSEVBRElORyk7Ci0gICAgdGhpcy5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5MT0dfUEFHRV9TRUxFQ1RfTE9HX0ZJTEVOQU1FX0VYUEwpOwotICB9Ci0KLQotICAvKiogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgc3VwZXIuc2V0RmlsZU5hbWUoZmlsZW5hbWUpOwotICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCBmaWxlLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgc2VsZWN0ZWQgSUZpbGUuICAKLSAgICovCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLSAgewotICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIGZpbGVFeHRlbnNpb24gPSAobmV3IFBhdGgoZmlsZU5hbWUpKS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgCi0gICAgaWYgKGZpbGVFeHRlbnNpb24gPT0gbnVsbCkKLSAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuY29uY2F0KCIuIiArIFdTSV9MT0dfRVhURU5TSU9OKTsKLSAgICAgIAotICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5hcHBlbmQoZmlsZU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgc2VsZWN0ZWQgZmlsZSBpcyBhIHZhbGlkIFdTLUkgTWVzc2FnZSBMb2cgZmlsZW5hbWUuCi0gICAqIAotICAgKiBTaW5jZSB0aGUgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBkb2VzIG5vdCBwcm92aWRlIGFuIGludGVyZmFjZSB0bwotICAgKiBhbGxvdyB0aGUgZmlsZSBzcGVjaWZpZWQgdG8gYWxyZWFkeSBleGlzdCAoaXQgZ2l2ZXMgYW4gZXJyb3IgdGhhdCB0aGUKLSAgICogdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGFuIG5vIHdheSBvZiBhbGxvd2luZyBpdCB0byBwYXNzKSwgYW5kIHdlIHdhbnQKLSAgICogdG8gYWxsb3cgdGhlIGZpbGUgdG8gZXhpc3QsIHNvIHRoYXQgd2UgY2FuIG92ZXJ3cml0ZSBpdCwgd2UgaGF2ZSB0bwotICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCwgYW5kIGRvIHNvbWUgbWFnaWMgdG8gYWxsb3cgdGhpcyBjYXNlIHRvIHBhc3MuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzZWxlY3RlZCBmaWxlIGlzIGEgdmFsaWQgV1MtSSBNZXNzYWdlIExvZyBmaWxlbmFtZS4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UjdmFsaWRhdGVQYWdlKCkKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIAotICB7Ci0gICAgU3RyaW5nIGZpbGVFeHRlbnNpb24gPSAobmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSkpLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICBpZiAoZmlsZUV4dGVuc2lvbiAhPSBudWxsKSAKLSAgICB7Ci0gICAgICBpZiAoZmlsZUV4dGVuc2lvbi5jb21wYXJlVG8oV1NJX0xPR19FWFRFTlNJT04pICE9IDApCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfTE9HX0ZJTEVfRVhURU5TSU9OKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBFc3NlbnRpYWxseSwgd2UgdGFrZSB0aGUgY29udGFpbmVyIGFuZCBjb25jYXQgdGhlIGZpbGUgdG8gaXQsIGFuZAotICAgIC8vIGNoZWNrIGlmIGl0cyBpbiB0aGUgd29ya3NwYWNlLCBpZiBpdCBpcywgdGhlbiBpdCBleGlzdHMgYW5kIHdlIGNhbiAKLSAgICAvLyBwcm9jZWVkLiBPdGhlcndpc2UsIGNvbnRpbnVlIHdpdGggdGhlIGRlZmF1bHQgdmFsaWRhdGluZy4KLSAgICBpZiAoIChnZXRDb250YWluZXJGdWxsUGF0aCgpICE9IG51bGwpICYmIChnZXRDb250YWluZXJGdWxsUGF0aCgpLmlzRW1wdHkoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgJiYgKGdldEZpbGVOYW1lKCkuY29tcGFyZVRvKCIiKSAhPSAwKSkKLSAgICB7Ci0gICAgICBQYXRoIGZ1bGxQYXRoOwotICAgICAgICAgICAgCi0gICAgICBpZiAoZmlsZUV4dGVuc2lvbiAhPSBudWxsKQotICAgICAgICBmdWxsUGF0aCA9IG5ldyBQYXRoKGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGdldEZpbGVOYW1lKCkpOwotICAgICAgZWxzZQotICAgICAgICBmdWxsUGF0aCA9IG5ldyBQYXRoKGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGdldEZpbGVOYW1lKCkgKyAiLiIgKyBXU0lfTE9HX0VYVEVOU0lPTik7Ci0gICAgICAKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmdWxsUGF0aCk7Ci0gICAgICAKLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICBzZXRNZXNzYWdlKE1lc3NhZ2VzLldBUk5JTkdfRklMRV9BTFJFQURZX0VYSVNUUyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2EwNTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIAotICogV1NETCBkb2N1bWVudCBmb3IgdGhlIFdlYiBzZXJ2aWNlLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAicG9ydCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTiA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUVFlQRSA9ICJwb3J0dHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAibWVzc2FnZSI7Ci0gIC8qKgotICAgKiBBY2Nlc3MgdG8gdGhlIGluY2x1ZGVXU0RMIGZsYWcuICAKLSAgICovCi0gIHByb3RlY3RlZCBCdXR0b24gd3NkbFBvcnRCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gd3NkbEJpbmRpbmdCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gd3NkbFBvcnRUeXBlQnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIHdzZGxPcGVyYXRpb25CdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gd3NkbE1lc3NhZ2VCdXR0b247Ci0KLSAgcHJvdGVjdGVkIENvbWJvIG5hbWVDb21ibzsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZXNwYWNlVGV4dDsKLSAgLy9wcm90ZWN0ZWQgQ29tYm8gcGFyZW50Q29tYm87Ci0gIC8vcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBUZXh0IHBhcmVudG5hbWVUZXh0OwotCi0gIHByb3RlY3RlZCBMaXN0IHBvcnRzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3Qgb3BlcmF0aW9ucyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IGJpbmRpbmdzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3QgcG9ydHR5cGVzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3QgbWVzc2FnZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBzZWxlY3Rpb246IHNlbGVjdGlvbiBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlcigiVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZSIpOwotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIHRoaXMuc2V0VGl0bGUoTWVzc2FnZXMuV1NETF9DT05URU5UX1BBR0VfU0VMRUNUX0hFQURJTkcpOwotICAgIHRoaXMuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuV1NETF9DT05URU5UX1BBR0VfU0VMRUNUX0VYUEwpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsd2F5cyByZXR1cm5zIHRydWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpCi0gIHsKLSAgICBpZiAoKChWYWxpZGF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuaW5jbHVkZVdTRExGaWxlKCkpCi0gICAgewotICAgICAgaW50IHNlbGVjdGlvbiA9IG5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgaWYgKHNlbGVjdGlvbiAhPSAtMSAmJiAhbmFtZUNvbWJvLmdldEl0ZW0oc2VsZWN0aW9uKS5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKgotICAgKiBDcmVhdGVzIHRoZSB0b3AgbGV2ZWwgY29udHJvbCBmb3IgdGhpcyBwYWdlIHVuZGVyIHRoZSBnaXZlbiAKLSAgICogcGFyZW50IGNvbXBvc2l0ZS4gSW1wbGVtZW50b3JzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcKLSAgICogdGhhdCB0aGUgY3JlYXRlZCBjb250cm9sIGNhbiBiZSBhY2Nlc3NlZCB2aWEgZ2V0Q29udHJvbCAKLSAgICoKLSAgICogQHBhcmFtIHBhcmVudCAtIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgYmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgYmFzZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgR3JpZERhdGEgZGF0YTsKLQotICAgIC8vIGNyZWF0ZSBhIGdyb3VwCi0gICAgR3JvdXAgd3NkbEVsZW1lbnRHcm91cCA9IG5ldyBHcm91cChiYXNlLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0gICAgd3NkbEVsZW1lbnRHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLldTRExfQ09OVEVOVF9QQUdFX0dST1VQX1RFWFRfRUxFTUVOVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICB3c2RsRWxlbWVudEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICB3c2RsRWxlbWVudEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0gICAgLy8gY3JlYXRlIGEgYmFzZSBwYW5lbCB3aXRoIDIgY29sdW1ucwotICAgIENvbXBvc2l0ZSBiYXNlUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHdzZGxFbGVtZW50R3JvdXAsIFNXVC5OT05FKTsKLSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0gICAgYmFzZVBhbmVsLnNldExheW91dChsYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgYmFzZVBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBjb250ZW50IGZvciBmaXJzdCBjb2x1bW4KLSAgICBjcmVhdGVXU0RMRWxlbWVudFR5cGVDb250ZW50KGJhc2VQYW5lbCk7Ci0KLSAgICAvLyBjb250ZW50IGZvciBzZWNvbmQgY29sdW1uCi0gICAgY3JlYXRlV1NETEVsZW1lbnRDb250ZW50KGJhc2VQYW5lbCk7Ci0KLSAgICBzZXRDb250cm9sKGJhc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGdyb3VwIG9mIHJhZGlvIGJ1dHRvbnMgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBXU0RMIGVsZW1lbnQuCi0gICAqIFRoZSBmaXZlIHRwZXMgYXJlOiBwb3J0LCBiaW5kaW5nLCBwb3J0VHlwZSwgb3BlcmF0aW9uIGFuZCBtZXNzYWdlLgotICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udGFpbmVyLiAKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVdTRExFbGVtZW50VHlwZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBhIGdyb3VwCi0gICAgR3JvdXAgd3NkbFR5cGVHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICB3c2RsVHlwZUdyb3VwLnNldFRleHQoTWVzc2FnZXMuV1NETF9DT05URU5UX1BBR0VfR1JPVVBfVEVYVF9UWVBFKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICB3c2RsVHlwZUdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICB3c2RsVHlwZUdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0gICAgd3NkbFBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKHdzZGxUeXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgd3NkbFBvcnRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5XU0RMX0NPTlRFTlRfUEFHRV9SQURJT19QT1JUKTsKLSAgICB3c2RsUG9ydEJ1dHRvbi5zZXREYXRhKCJ3c2RsUG9ydEJ1dHRvbiIpOwotICAgIHdzZGxQb3J0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICB3c2RsUG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgUG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0gICAgd3NkbEJpbmRpbmdCdXR0b24gPSBuZXcgQnV0dG9uKHdzZGxUeXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgd3NkbEJpbmRpbmdCdXR0b24uc2V0RGF0YSgid3NkbEJpbmRpbmdCdXR0b24iKTsKLSAgICB3c2RsQmluZGluZ0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLldTRExfQ09OVEVOVF9QQUdFX1JBRElPX0JJTkRJTkcpOwotICAgIHdzZGxCaW5kaW5nQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgd3NkbEJpbmRpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJpbmRpbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotICAgIHdzZGxQb3J0VHlwZUJ1dHRvbiA9IG5ldyBCdXR0b24od3NkbFR5cGVHcm91cCwgU1dULlJBRElPKTsKLSAgICB3c2RsUG9ydFR5cGVCdXR0b24uc2V0RGF0YSgid3NkbFBvcnRUeXBlQnV0dG9uIik7Ci0gICAgd3NkbFBvcnRUeXBlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuV1NETF9DT05URU5UX1BBR0VfUkFESU9fUE9SVF9UWVBFKTsKLSAgICB3c2RsUG9ydFR5cGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB3c2RsUG9ydFR5cGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFBvcnRUeXBlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLSAgICB3c2RsT3BlcmF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbih3c2RsVHlwZUdyb3VwLCBTV1QuUkFESU8pOwotICAgIHdzZGxPcGVyYXRpb25CdXR0b24uc2V0RGF0YSgid3NkbE9wZXJhdGlvbkJ1dHRvbiIpOwotICAgIHdzZGxPcGVyYXRpb25CdXR0b24uc2V0VGV4dChNZXNzYWdlcy5XU0RMX0NPTlRFTlRfUEFHRV9SQURJT19PUEVSQVRJT04pOwotICAgIHdzZGxPcGVyYXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB3c2RsT3BlcmF0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBPcGVyYXRpb25CdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotICAgIHdzZGxNZXNzYWdlQnV0dG9uID0gbmV3IEJ1dHRvbih3c2RsVHlwZUdyb3VwLCBTV1QuUkFESU8pOwotICAgIHdzZGxNZXNzYWdlQnV0dG9uLnNldERhdGEoIndzZGxNZXNzYWdlQnV0dG9uIik7Ci0gICAgd3NkbE1lc3NhZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5XU0RMX0NPTlRFTlRfUEFHRV9SQURJT19NRVNTQUdFKTsKLSAgICB3c2RsTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIHdzZGxNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBNZXNzYWdlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgcGFuZWwgdG8gY2FwdHVyZSB0aGUgbmFtZSwgbmFtZXNwYWNlIGFuZCBwYXJlbnQgb2YgYW4KLSAgICogV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udGFpbmVyLiAKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVdTRExFbGVtZW50Q29udGVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIGEgZ3JvdXBpbmcgd2l0aCAyIGNvbHVtbnMsIG9uZSBmb3IgbGFiZWxzIGFuZCB0aGVvdGhlciBmb3IgZmllbGRzCi0gICAgQ29tcG9zaXRlIGZpZWxkQ29sdW1uID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLSAgICBmaWVsZENvbHVtbi5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGZpZWxkQ29sdW1uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBUaGUgV1NETCBlbGVtZW50IG5hbWUgbGFiZWwKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChmaWVsZENvbHVtbiwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuV1NETF9DT05URU5UX1BBR0VfTEFCRUxfTkFNRSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIFRoZSBXU0RMIGVsZW1lbnQgbmFtZSBmaWVsZAotICAgIG5hbWVDb21ibyA9IG5ldyBDb21ibyhmaWVsZENvbHVtbiwgU1dULlJFQURfT05MWSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBuYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBuYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IE5hbWVTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLSAgICAvL25hbWVUZXh0ID0gbmV3IFRleHQoZmllbGRDb2x1bW4sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAvL2RhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAvL2RhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgLy9kYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIC8vZGF0YS53aWR0aEhpbnQgPSA1MDsKLSAgICAvL25hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgLy9uYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgVGV4dEJveExpc3RlbmVyKCkpOwotCi0gICAgLy8gVGhlIFdTREwgZWxlbWVudCBuYW1lc3BhY2UgbGFiZWwKLSAgICBsYWJlbCA9IG5ldyBMYWJlbChmaWVsZENvbHVtbiwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuV1NETF9DT05URU5UX1BBR0VfTEFCRUxfTkFNRVNQQUNFKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gVGhlIFdTREwgZWxlbWVudCBuYW1lc3BhY2UgZmllbGQKLSAgICBuYW1lc3BhY2VUZXh0ID0gbmV3IFRleHQoZmllbGRDb2x1bW4sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEud2lkdGhIaW50ID0gNTA7Ci0gICAgbmFtZXNwYWNlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG5hbWVzcGFjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFRleHRCb3hMaXN0ZW5lcigpKTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIC8vIFRoZSBXU0RMIGVsZW1lbnQgcGFyZW50IGxhYmVsCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoZmllbGRDb2x1bW4sIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLldTRExfQ09OVEVOVF9QQUdFX0xBQkVMX1BBUkVOVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIFRoZSBXU0RMIGVsZW1lbnQgcGFyZW50IGZpZWxkCi0gICAgLy8gICAgcGFyZW50Q29tYm8gPSBuZXcgQ29tYm8oZmllbGRDb2x1bW4sIFNXVC5SRUFEX09OTFkpOwotICAgIC8vICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAvLyAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIC8vICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgLy8gICAgcGFyZW50Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBwYXJlbnRuYW1lVGV4dCA9IG5ldyBUZXh0KGZpZWxkQ29sdW1uLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IDUwOwotICAgIHBhcmVudG5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcGFyZW50bmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFRleHRCb3hMaXN0ZW5lcigpKTsKLSAgICBwYXJlbnRuYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQWx3YXlzIHJldHVybiB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZW50IHdoZW4gZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotICAgKiBAcGFyYW0gZSAtIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0KLSAgLyoqCi0gICAqIEhhbmRsZXMgdGhlIGluY2x1ZGVXU0RMIGNoZWNrYm94LgotICAgKiBTZW50IHdoZW4gc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4gCi0gICAqIEBwYXJhbSBlIC0gYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7fQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVsZW1lbnQgbmFtZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKQotICB7Ci0gICAgaW50IHNlbGVjdGlvbiA9IG5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIGlmKHNlbGVjdGlvbiAhPSAtMSkKLSAgICB7ICAKLSAgICAgIHJldHVybiBuYW1lQ29tYm8uZ2V0SXRlbShzZWxlY3Rpb24pOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKQotICB7Ci0gICAgLy9yZXR1cm4gcGFyZW50Q29tYm8uZ2V0SXRlbShwYXJlbnRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLSAgICByZXR1cm4gcGFyZW50bmFtZVRleHQuZ2V0VGV4dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgaWYgKHdzZGxCaW5kaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIHJldHVybiBCSU5ESU5HOwotICAgIH0KLSAgICBlbHNlIGlmICh3c2RsTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgICByZXR1cm4gTUVTU0FHRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAod3NkbE9wZXJhdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgICByZXR1cm4gT1BFUkFUSU9OOwotICAgIH0KLSAgICBlbHNlIGlmICh3c2RsUG9ydEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgICByZXR1cm4gUE9SVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAod3NkbFBvcnRUeXBlQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIHJldHVybiBQT1JUVFlQRTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50KQotICB7Ci0gICAgaWYgKHBvcnRzID09IG51bGwpCi0gICAgewotICAgICAgcmVzZXRFbGVtZW50cygpOwotICAgIH0KLSAgICBpZiAodHlwZS5lcXVhbHMoUE9SVCkpCi0gICAgewotICAgICAgcG9ydHMuYWRkKG5ldyBXU0RMRWxlbWVudChuYW1lLCBuYW1lc3BhY2UsIHBhcmVudCkpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoT1BFUkFUSU9OKSkKLSAgICB7Ci0gICAgICBvcGVyYXRpb25zLmFkZChuZXcgV1NETEVsZW1lbnQobmFtZSwgbmFtZXNwYWNlLCBwYXJlbnQpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKEJJTkRJTkcpKQotICAgIHsKLSAgICAgIGJpbmRpbmdzLmFkZChuZXcgV1NETEVsZW1lbnQobmFtZSwgbmFtZXNwYWNlLCBwYXJlbnQpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKFBPUlRUWVBFKSkKLSAgICB7Ci0gICAgICBwb3J0dHlwZXMuYWRkKG5ldyBXU0RMRWxlbWVudChuYW1lLCBuYW1lc3BhY2UsIHBhcmVudCkpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoTUVTU0FHRSkpCi0gICAgewotICAgICAgbWVzc2FnZXMuYWRkKG5ldyBXU0RMRWxlbWVudChuYW1lLCBuYW1lc3BhY2UsIHBhcmVudCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0RWxlbWVudHMoKQotICB7Ci0gICAgcG9ydHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgb3BlcmF0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICBiaW5kaW5ncyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwb3J0dHlwZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbmFtZUNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgbmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB2YWx1ZSB0byB0aGUgbGlzdCBib3gKLSAgICovCi0gIGNsYXNzIFdvcmtzcGFjZUJ1dHRvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBsaXN0IGJveAotICAgKi8KLSAgY2xhc3MgQnJvd3NlQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdmFsdWUgdG8gdGhlIGxpc3QgYm94Ci0gICAqLwotICBjbGFzcyBTZWFyY2hVRERJQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLSAgfQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBmaWxlIGZpZWxkLgotICAgKi8KLSAgY2xhc3MgVGV4dEJveExpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIKLSAgewotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gICAgewotICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCi0gICAgfQotCi0gIH0KLSAgcHJpdmF0ZSBjbGFzcyBXU0RMRWxlbWVudAotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50OwotCi0gICAgcHVibGljIFdTRExFbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50KQotICAgIHsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICAgIHsKLSAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgewotICAgIHJlc2V0RWxlbWVudHMoKTsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgIGlmICh2aXNpYmxlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZFbGVtID0gcmVhZGVyLnJlYWRXU0RMKCgoVmFsaWRhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLmdldFdTRExGaWxlKCkpOwotICAgICAgICBRTmFtZSBkZWZRTmFtZSA9IGRlZkVsZW0uZ2V0UU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGRlZm5hbWUgPSAiIjsKLSAgICAgICAgaWYgKGRlZlFOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkZWZuYW1lID0gZGVmUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlZkVsZW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIHBvcnRzCi0gICAgICAgIE1hcCBzZXJ2bWFwID0gZGVmRWxlbS5nZXRTZXJ2aWNlcygpOwotICAgICAgICBpZiAoc2Vydm1hcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBzZXJ2cyA9IHNlcnZtYXAudmFsdWVzKCk7Ci0gICAgICAgICAgaWYgKHNlcnZzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3Igc2Vydkl0ZXIgPSBzZXJ2cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHNlcnZJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIHNlcnZuYW1lID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgICAgICAgIE1hcCBwb3J0bWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgICBpZiAocG9ydG1hcCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBwb3J0cyA9IHBvcnRtYXAudmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgcG9ydEl0ZXIgPSBwb3J0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcnRJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChWYWxpZGF0aW9uV2l6YXJkV1NETENvbnRlbnRQYWdlLlBPUlQsIG5hbWUsIG5hbWVzcGFjZSwgc2Vydm5hbWUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBCaW5kaW5ncwotICAgICAgICBNYXAgYmluZGluZ21hcCA9IGRlZkVsZW0uZ2V0QmluZGluZ3MoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdtYXAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENvbGxlY3Rpb24gYmluZGluZ3MgPSBiaW5kaW5nbWFwLnZhbHVlcygpOwotICAgICAgICAgIGlmIChiaW5kaW5ncyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGJpbmRJdGVyID0gYmluZGluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChiaW5kSXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBiaW5kSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICBhZGRFbGVtZW50KFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuQklORElORywgbmFtZSwgbmFtZXNwYWNlLCBkZWZuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWdpc3RlciB0aGUgUG9ydFR5cGVzIGFuZCBPcGVyYXRpb25zCi0gICAgICAgIE1hcCBwb3J0dHlwZW1hcCA9IGRlZkVsZW0uZ2V0UG9ydFR5cGVzKCk7Ci0gICAgICAgIGlmIChwb3J0dHlwZW1hcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBwb3J0dHlwZXMgPSBwb3J0dHlwZW1hcC52YWx1ZXMoKTsKLSAgICAgICAgICBpZiAocG9ydHR5cGVzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgcG9ydHR5cGVJdGVyID0gcG9ydHR5cGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocG9ydHR5cGVJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydHR5cGUgPSAoUG9ydFR5cGUpIHBvcnR0eXBlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBwb3J0dHlwZW5hbWUgPSBwb3J0dHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICBhZGRFbGVtZW50KFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuUE9SVFRZUEUsIHBvcnR0eXBlbmFtZSwgbmFtZXNwYWNlLCBkZWZuYW1lKTsKLQotICAgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgT3BlcmF0aW9ucwotICAgICAgICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwb3J0dHlwZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgIGlmIChvcGVyYXRpb25zICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBvcGVySXRlciA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAob3Blckl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcGVySXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuT1BFUkFUSU9OLCBuYW1lLCBuYW1lc3BhY2UsIHBvcnR0eXBlbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1hcCBtZXNzYWdlbWFwID0gZGVmRWxlbS5nZXRNZXNzYWdlcygpOwotICAgICAgICBpZiAobWVzc2FnZW1hcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBtZXNzYWdlcyA9IG1lc3NhZ2VtYXAudmFsdWVzKCk7Ci0gICAgICAgICAgaWYgKG1lc3NhZ2VzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgbWVzc0l0ZXIgPSBtZXNzYWdlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG1lc3NJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1lc3NJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgIGFkZEVsZW1lbnQoVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5NRVNTQUdFLCBuYW1lLCBuYW1lc3BhY2UsIGRlZm5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgICBpbnQgbnVtRWxlbXMgPSBwb3J0cy5zaXplKCk7Ci0gICAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgcG9ydHMudG9BcnJheShuZXcgV1NETEVsZW1lbnRbbnVtRWxlbXNdKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZUNvbWJvLmFkZChlbGVtc1tpXS5nZXROYW1lKCksIGkpOwotICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldFBhcmVudE5hbWUoKSk7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd3NkbFBvcnRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB3c2RsQmluZGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB3c2RsTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB3c2RsT3BlcmF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHdzZGxQb3J0VHlwZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUaGUgV1NETCBmaWxlIGlzIG5vdCB2YWxpZC4KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc2V0RWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgfQotCi0gIGNsYXNzIFBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgIH0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgbmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgaW50IG51bUVsZW1zID0gcG9ydHMuc2l6ZSgpOwotICAgICAgV1NETEVsZW1lbnRbXSBlbGVtcyA9IChXU0RMRWxlbWVudFtdKSBwb3J0cy50b0FycmF5KG5ldyBXU0RMRWxlbWVudFtudW1FbGVtc10pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtczsgaSsrKQotICAgICAgewotICAgICAgICBuYW1lQ29tYm8uYWRkKGVsZW1zW2ldLmdldE5hbWUoKSwgaSk7Ci0gICAgICAgIGlmIChpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lQ29tYm8uc2VsZWN0KDApOwotICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXRQYXJlbnROYW1lKCkpOwotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotICBjbGFzcyBCaW5kaW5nQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIG5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIGludCBudW1FbGVtcyA9IGJpbmRpbmdzLnNpemUoKTsKLSAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgYmluZGluZ3MudG9BcnJheShuZXcgV1NETEVsZW1lbnRbbnVtRWxlbXNdKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbmFtZUNvbWJvLmFkZChlbGVtc1tpXS5nZXROYW1lKCksIGkpOwotICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0UGFyZW50TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotCi0gIH0KLSAgY2xhc3MgUG9ydFR5cGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgIH0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgbmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgaW50IG51bUVsZW1zID0gcG9ydHR5cGVzLnNpemUoKTsKLSAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgcG9ydHR5cGVzLnRvQXJyYXkobmV3IFdTRExFbGVtZW50W251bUVsZW1zXSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1zOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG5hbWVDb21iby5hZGQoZWxlbXNbaV0uZ2V0TmFtZSgpLCBpKTsKLSAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldFBhcmVudE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLQotICB9Ci0gIGNsYXNzIE9wZXJhdGlvbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIHdpZGdldFNlbGVjdGVkKGUpOwotCi0gICAgfQotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBuYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoIiIpOwotICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBpbnQgbnVtRWxlbXMgPSBvcGVyYXRpb25zLnNpemUoKTsKLSAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgb3BlcmF0aW9ucy50b0FycmF5KG5ldyBXU0RMRWxlbWVudFtudW1FbGVtc10pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtczsgaSsrKQotICAgICAgewotICAgICAgICBuYW1lQ29tYm8uYWRkKGVsZW1zW2ldLmdldE5hbWUoKSwgaSk7Ci0gICAgICAgIGlmIChpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lQ29tYm8uc2VsZWN0KDApOwotICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXRQYXJlbnROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgfQotICBjbGFzcyBNZXNzYWdlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIG5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIGludCBudW1FbGVtcyA9IG1lc3NhZ2VzLnNpemUoKTsKLSAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgbWVzc2FnZXMudG9BcnJheShuZXcgV1NETEVsZW1lbnRbbnVtRWxlbXNdKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbmFtZUNvbWJvLmFkZChlbGVtc1tpXS5nZXROYW1lKCksIGkpOwotICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0UGFyZW50TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotCi0gIH0KLQotICBjbGFzcyBOYW1lU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGludCBzZWxlY3Rpb24gPSAoKENvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgU3RyaW5nIHR5cGUgPSBnZXRUeXBlKCk7Ci0gICAgICBXU0RMRWxlbWVudCBlbGVtID0gbnVsbDsKLSAgICAgIGlmICh0eXBlLmVxdWFscyhQT1JUKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbSA9IChXU0RMRWxlbWVudCkgcG9ydHMuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhCSU5ESU5HKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbSA9IChXU0RMRWxlbWVudCkgYmluZGluZ3MuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQT1JUVFlQRSkpCi0gICAgICB7Ci0gICAgICAgIGVsZW0gPSAoV1NETEVsZW1lbnQpIHBvcnR0eXBlcy5nZXQoc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKE9QRVJBVElPTikpCi0gICAgICB7Ci0gICAgICAgIGVsZW0gPSAoV1NETEVsZW1lbnQpIG9wZXJhdGlvbnMuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhNRVNTQUdFKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbSA9IChXU0RMRWxlbWVudCkgbWVzc2FnZXMuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlbGVtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dChlbGVtLmdldFBhcmVudE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmRXU0RMUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNTkzMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFdpemFyZCBwYWdlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSAKLSAqIFdTREwgZG9jdW1lbnQgZm9yIHRoZSBXZWIgc2VydmljZS4KLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLQotICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gd3NkbGludmFsaWQgPSBmYWxzZTsKLSAgLyoqCi0gICAqIEFjY2VzcyB0byB0aGUgaW5jbHVkZVdTREwgZmxhZy4gIAotICAgKi8KLSAgcHJvdGVjdGVkIEJ1dHRvbiBpbmNsdWRlV1NETEJ1dHRvbjsKLQotICAvKioKLSAgICogQWNjZXNzIHRvIHRoZSB3c2RsIGRvY3VtZW50IGdyb3VwLgotICAgKi8KLSAgcHJvdGVjdGVkIEdyb3VwIGRvY3VtZW50R3JvdXA7Ci0gIHByb3RlY3RlZCBUZXh0IGRvY3VtZW50TG9jYXRpb25UZXh0OwotICBwcm90ZWN0ZWQgQ29tYm8gZmlsZUZpZWxkOwotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gc2VsZWN0aW9uOiBzZWxlY3Rpb24gaW4gdGhlIFJlc291cmNlIE5hdmlnYXRvciB2aWV3LgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25XaXphcmRXU0RMUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlcigiVmFsaWRhdGlvbldpemFyZFdTRExQYWdlIik7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgdGhpcy5zZXRUaXRsZShNZXNzYWdlcy5XU0RMX1BBR0VfU0VMRUNUX1dTRExfRklMRU5BTUVfSEVBRElORyk7Ci0gICAgdGhpcy5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5XU0RMX1BBR0VfU0VMRUNUX1dTRExfRklMRU5BTUVfRVhQTCk7Ci0gIH0KLQotICAvKioKLSAgICogQWx3YXlzIHJldHVybnMgdHJ1ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIGlmIChpbmNsdWRlV1NETEZpbGUoKSkKLSAgICB7Ci0KLSAgICAgIGlmIChmaWxlRmllbGQuZ2V0VGV4dCgpID09IG51bGwgfHwgZmlsZUZpZWxkLmdldFRleHQoKS5lcXVhbHMoIiIpIHx8IHdzZGxpbnZhbGlkKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoKLSAgICogQ3JlYXRlcyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50Ci0gICAqIGNvbXBvc2l0ZS4gSW1wbGVtZW50b3JzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgY3JlYXRlZAotICAgKiBjb250cm9sIGNhbiBiZSBhY2Nlc3NlZCB2aWEgZ2V0Q29udHJvbAotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudCAtIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgYmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgYmFzZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgR3JpZERhdGEgZGF0YTsKLQotICAgIC8vIGFkZCBpbmNsdWRlV1NETCBmbGFnCi0gICAgaW5jbHVkZVdTRExCdXR0b24gPSBuZXcgQnV0dG9uKGJhc2UsIFNXVC5DSEVDSyk7Ci0gICAgaW5jbHVkZVdTRExCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5XU0RMX1BBR0VfSU5DTFVERV9XU0RMX0JVVFRPTik7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgaW5jbHVkZVdTRExCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpbmNsdWRlV1NETEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBpbmNsdWRlV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0gICAgLy8gY3JlYXRlIGEgV1NETCBkb2N1bWVudCBncm91cAotICAgIGRvY3VtZW50R3JvdXAgPSBuZXcgR3JvdXAoYmFzZSwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZG9jdW1lbnRHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgZG9jdW1lbnRHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBkb2N1bWVudEdyb3VwLnNldFZpc2libGUoZmFsc2UpOwotCi0gICAgY3JlYXRlRG9jdW1lbnRHcm91cENvbnRlbnRzKGRvY3VtZW50R3JvdXApOwotCi0gICAgc2V0Q29udHJvbChiYXNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURvY3VtZW50R3JvdXBDb250ZW50cyhDb21wb3NpdGUgZG9jdW1lbnRHcm91cCkKLSAgewotICAgIC8vcmFkaW8gYnV0dG9ucycgY29udGFpbmVyCi0gICAgQ29tcG9zaXRlIGJhc2VQYW5lbCA9IG5ldyBDb21wb3NpdGUoZG9jdW1lbnRHcm91cCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYmFzZVBhbmVsLnNldExheW91dChsYXlvdXQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgYmFzZVBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBDb21wb3NpdGUgZ3JvdXAxID0gbmV3IENvbXBvc2l0ZShiYXNlUGFuZWwsIFNXVC5OT05FKTsKLSAgICBncm91cDEuc2V0Rm9udChnZXRGb250KCkpOwotICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGdyb3VwMS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncm91cDEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIExhYmVsIGRvY3VtZW50TGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAxLCBTV1QuTEVGVCk7Ci0gICAgZG9jdW1lbnRMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLldTRExfUEFHRV9JTkNMVURFX1dTRExfTEFCRUwpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRvY3VtZW50TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAvKioKLQkgKiBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChiYXNlUGFuZWwsIFNXVC5MRUZUKTsgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCSAqIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7IGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCSAqIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JICovCi0gICAgZmlsZUZpZWxkID0gbmV3IENvbWJvKGdyb3VwMSwgU1dULkRST1BfRE9XTik7Ci0gICAgU3RyaW5nW10gd3NkbGxvY2F0aW9ucyA9ICgoVmFsaWRhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLmdldFdTRExMb2NhdGlvbnMoKTsKLSAgICBpZih3c2RsbG9jYXRpb25zICE9IG51bGwpCi0gICAgewotICAgICAgaW50IG51bWxvY3MgPSB3c2RsbG9jYXRpb25zLmxlbmd0aDsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1sb2NzOyBpKyspCi0gICAgICB7Ci0gICAgICAJZmlsZUZpZWxkLmFkZCh3c2RsbG9jYXRpb25zW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IDMwOwotICAgIGZpbGVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGZpbGVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgRmlsZUZpZWxkTGlzdGVuZXIoKSk7Ci0KLSAgICBMYWJlbCB3c2RsTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAxLCBTV1QuTEVGVCk7Ci0gICAgd3NkbExhYmVsLnNldFRleHQoTWVzc2FnZXMuV1NETF9QQUdFX1ZBTElEX1dTRExfTEFCRUwpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRvY3VtZW50TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIGRvY3VtZW50TG9jYXRpb25UZXh0ID0gbmV3IFRleHQoZG9jdW1lbnRHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIC8vIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAvLyBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIC8vIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgLy8gZGF0YS53aWR0aEhpbnQgPSAzMDsKLSAgICAvLyBkb2N1bWVudExvY2F0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShiYXNlUGFuZWwsIFNXVC5OT05FKTsKLSAgICBncm91cC5zZXRGb250KGdldEZvbnQoKSk7Ci0gICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIEJ1dHRvbiB3b3Jrc3BhY2VCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgd29ya3NwYWNlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuV1NETF9QQUdFX1dPUktCRU5DSF9CVVRUT04pOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHdvcmtzcGFjZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHdvcmtzcGFjZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgV29ya3NwYWNlQnV0dG9uTGlzdGVuZXIoKSk7Ci0KLSAgICBCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLldTRExfUEFHRV9CUk9XU0VfQlVUVE9OKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJyb3dzZUJ1dHRvbkxpc3RlbmVyKCkpOwotCi0gICAgLy8gQnV0dG9uIHNlYXJjaFVERElCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgLy8gc2VhcmNoVURESUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLigiX1VJX1dJWkFSRF9WX1NFQVJDSF9VRERJX0JVVFRPTiIpKTsKLSAgICAvLyBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgLy8gZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAvLyBzZWFyY2hVRERJQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgLy8gc2VhcmNoVURESUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VhcmNoVURESUJ1dHRvbkxpc3RlbmVyKCkpOwotCi0gICAgcmV0dXJuIGRvY3VtZW50R3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlV1NETEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGluY2x1ZGVXU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZUZpZWxkLmdldFRleHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbHdheXMgcmV0dXJuIHRydWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlbnQgd2hlbiBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuCi0gICAqIAotICAgKiBAcGFyYW0gZSAtCi0gICAqICAgICAgICAgICAgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLQotICAvKioKLSAgICogSGFuZGxlcyB0aGUgaW5jbHVkZVdTREwgY2hlY2tib3guIFNlbnQgd2hlbiBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZQotICAgKiBjb250cm9sLgotICAgKiAKLSAgICogQHBhcmFtIGUgLQotICAgKiAgICAgICAgICAgIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBpbmNsdWRlV1NETEJ1dHRvbikKLSAgICB7Ci0gICAgICBpZiAoaW5jbHVkZVdTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50R3JvdXAuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRHcm91cC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXU0RMSW52YWxpZCgpCi0gIHsKLSAgICB3c2RsaW52YWxpZCA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBsaXN0IGJveAotICAgKi8KLSAgY2xhc3MgV29ya3NwYWNlQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBzZWxlY3Rpb24sIGZhbHNlKTsKLSAgICAgIGRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIud3NkbCIgfSk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KE1lc3NhZ2VzLldTRExfUEFHRV9GSUxFX1NIRUxMX1RFWFQpOwotICAgICAgZGlhbG9nLnNldFRpdGxlKE1lc3NhZ2VzLldTRExfUEFHRV9GSUxFX1RJVExFKTsKLSAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLldTRExfUEFHRV9GSUxFX0RFU0NSSVBUSU9OKTsKLSAgICAgIGRpYWxvZy5zZXRUaXRsZUltYWdlKFdTSVVJUGx1Z2luLmdldFJlc291cmNlSW1hZ2UoUmVzb3VyY2UuVkFMSURBVEVfV1NJX0xPR0ZJTEVfV0laKSk7Ci0gICAgICAKLSAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgSUZpbGUgY3VycmVudElGaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLSAgICAgICAgaWYgKGN1cnJlbnRJRmlsZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZmlsZUZpZWxkLmFkZChjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCAwKTsKLSAgICAgICAgICBmaWxlRmllbGQuc2VsZWN0KDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB2YWx1ZSB0byB0aGUgbGlzdCBib3gKLSAgICovCi0gIGNsYXNzIEJyb3dzZUJ1dHRvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIEZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICBkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi53c2RsIiB9KTsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBkaWFsb2cub3BlbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaWxlRmllbGQuYWRkKHNlbGVjdGlvbiwgMCk7Ci0gICAgICAgIGZpbGVGaWVsZC5zZWxlY3QoMCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB2YWx1ZSB0byB0aGUgbGlzdCBib3gKLSAgICovCi0gIC8vIGNsYXNzIFNlYXJjaFVERElCdXR0b25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIC8vIHsKLSAgLy8gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAvLyAge30KLSAgLy8KLSAgLy8gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIC8vICB7Ci0gIC8vICAgIFN0cmluZyB0aXRsZSA9ICJJbmZvcm1hdGlvbiI7Ci0gIC8vICAgIFN0cmluZyBtZXNzYWdlID0gIlRoZSBjaG9zZW4gb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLiI7Ci0gIC8vICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLSAgLy8gIH0KLSAgLy99Ci0KLSAgLyoqCi0gICAqIEFkZCB2YWx1ZSB0byB0aGUgZmlsZSBmaWVsZC4KLSAgICovCi0gIGNsYXNzIEZpbGVGaWVsZExpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIKLSAgewotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gICAgewotICAgICAgd3NkbGludmFsaWQgPSBmYWxzZTsKLSAgICAgIGdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQotICAgIH0KLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZmYTc4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1OGM5ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgU2VydmljZXMgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBXZWIgU2VydmljZXMgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxZjcwNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuNC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5hcGFjaGUuY29tbW9uc19sb2dnaW5nLmZlYXR1cmUiIHZlcnNpb249IjEuMC40Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5hcGFjaGUuamFrYXJ0YV9sb2c0ai5mZWF0dXJlIiB2ZXJzaW9uPSIxLjIuOCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuYXBhY2hlLmF4aXMuZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjEiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuYXBhY2hlLndzaWw0ai5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy51ZGRpNGouZmVhdHVyZSIgdmVyc2lvbj0iMi4wLjMiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcud3NkbDRqLmZlYXR1cmUiIHZlcnNpb249IjEuNC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmFwYWNoZS54ZXJjZXMuZmVhdHVyZSIgdmVyc2lvbj0iMi44LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy4yIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYiIHZlcnNpb249IjIuMiIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UueHNkIiB2ZXJzaW9uPSIyLjIiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2kiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYzY0ZjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdTIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBXUyBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2NjMjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMy5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4YWVhMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTBkYTg1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgU2VydmljZSBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWI0NTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzlkMGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBTZXJ2aWNlIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjY3MWQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJ1aWxkLnhtbAotZmVhdHVyZXMKLXBsdWdpbnMKLW9yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlYmVlNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNlODBiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiMDhmNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBTZXJ2aWNlcyBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciB0aGUgV1NUIFdlYiBzZXJ2aWNlcyB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1Yjg2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjQucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQ1NmU0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWUyMzU0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiMzNhZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODM1NmMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBTZXJ2aWNlcyBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBXZWIgc2VydmljZXMgdGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDViZDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjMucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2kudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwM2E4YjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhNzAwNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIFNlcnZpY2VzIFVJCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V2ViIFNlcnZpY2VzIFVJIHRvb2xzLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjUwMjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuNC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZ2VmIiB2ZXJzaW9uPSIzLjIiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjMjI5Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlLnNvdXJjZSA9IG9yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyOTVkOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdTIFVJIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBXU1QgV1MgVUkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFiMTU4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuNC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGFlYTAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5Nzg3YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBTZXJ2aWNlIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5NTU5Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2E2NTQ1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFNlcnZpY2UgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlZmY1Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LndzX3VzZXJkb2MuZmVhdHVyZV8xLjAuMC5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTY3NWUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmRlZmIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBTZXJ2aWNlcyBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgV2ViIHNlcnZpY2VzIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgyM2JmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNS4zLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjRiNGQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc2M2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi10ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDJlN2NmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZDEwNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIEphbiAzMCAxMDoyOToxNCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcwNDAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjQxOjM5IEVTVCAyMDA2Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNjljZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxODhlZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gdGVzdHMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMS9vcmcvdGVtcHVyaS9BcmVhU2VydmljZS9BcmVhU2VydmljZVByb3h5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTEvb3JnL3RlbXB1cmkvQXJlYVNlcnZpY2UvQXJlYVNlcnZpY2VQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTIzNjU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMS9vcmcvdGVtcHVyaS9BcmVhU2VydmljZS9BcmVhU2VydmljZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1wYWNrYWdlIG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgQXJlYVNlcnZpY2VQcm94eSBpbXBsZW1lbnRzIG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlLkFyZWFTZXJ2aWNlX1BvcnRUeXBlIHsKLSAgcHJpdmF0ZSBTdHJpbmcgX2VuZHBvaW50ID0gbnVsbDsKLSAgcHJpdmF0ZSBvcmcudGVtcHVyaS5BcmVhU2VydmljZS5BcmVhU2VydmljZV9Qb3J0VHlwZSBhcmVhU2VydmljZV9Qb3J0VHlwZSA9IG51bGw7Ci0gIAotICBwdWJsaWMgQXJlYVNlcnZpY2VQcm94eSgpIHsKLSAgICBfaW5pdEFyZWFTZXJ2aWNlUHJveHkoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIF9pbml0QXJlYVNlcnZpY2VQcm94eSgpIHsKLSAgICB0cnkgewotICAgICAgYXJlYVNlcnZpY2VfUG9ydFR5cGUgPSAobmV3IG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlLkFyZWFTZXJ2aWNlX1NlcnZpY2VMb2NhdG9yKCkpLmdldEFyZWFTZXJ2aWNlU09BUCgpOwotICAgICAgaWYgKGFyZWFTZXJ2aWNlX1BvcnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgaWYgKF9lbmRwb2ludCAhPSBudWxsKQotICAgICAgICAgICgoamF2YXgueG1sLnJwYy5TdHViKWFyZWFTZXJ2aWNlX1BvcnRUeXBlKS5fc2V0UHJvcGVydHkoImphdmF4LnhtbC5ycGMuc2VydmljZS5lbmRwb2ludC5hZGRyZXNzIiwgX2VuZHBvaW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIF9lbmRwb2ludCA9IChTdHJpbmcpKChqYXZheC54bWwucnBjLlN0dWIpYXJlYVNlcnZpY2VfUG9ydFR5cGUpLl9nZXRQcm9wZXJ0eSgiamF2YXgueG1sLnJwYy5zZXJ2aWNlLmVuZHBvaW50LmFkZHJlc3MiKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHNlcnZpY2VFeGNlcHRpb24pIHt9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKSB7Ci0gICAgcmV0dXJuIF9lbmRwb2ludDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50KSB7Ci0gICAgX2VuZHBvaW50ID0gZW5kcG9pbnQ7Ci0gICAgaWYgKGFyZWFTZXJ2aWNlX1BvcnRUeXBlICE9IG51bGwpCi0gICAgICAoKGphdmF4LnhtbC5ycGMuU3R1YilhcmVhU2VydmljZV9Qb3J0VHlwZSkuX3NldFByb3BlcnR5KCJqYXZheC54bWwucnBjLnNlcnZpY2UuZW5kcG9pbnQuYWRkcmVzcyIsIF9lbmRwb2ludCk7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBvcmcudGVtcHVyaS5BcmVhU2VydmljZS5BcmVhU2VydmljZV9Qb3J0VHlwZSBnZXRBcmVhU2VydmljZV9Qb3J0VHlwZSgpIHsKLSAgICBpZiAoYXJlYVNlcnZpY2VfUG9ydFR5cGUgPT0gbnVsbCkKLSAgICAgIF9pbml0QXJlYVNlcnZpY2VQcm94eSgpOwotICAgIHJldHVybiBhcmVhU2VydmljZV9Qb3J0VHlwZTsKLSAgfQotICAKLSAgcHVibGljIGZsb2F0IGNhbGN1bGF0ZVJlY3RBcmVhKG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlLkRpbWVuc2lvbnMgcGFyYW1ldGVycykgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbnsKLSAgICBpZiAoYXJlYVNlcnZpY2VfUG9ydFR5cGUgPT0gbnVsbCkKLSAgICAgIF9pbml0QXJlYVNlcnZpY2VQcm94eSgpOwotICAgIHJldHVybiBhcmVhU2VydmljZV9Qb3J0VHlwZS5jYWxjdWxhdGVSZWN0QXJlYShwYXJhbWV0ZXJzKTsKLSAgfQotICAKLSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9kYXRhL2F4aXNTb3VyY2UxL29yZy90ZW1wdXJpL0FyZWFTZXJ2aWNlL0FyZWFTZXJ2aWNlU09BUFN0dWIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMS9vcmcvdGVtcHVyaS9BcmVhU2VydmljZS9BcmVhU2VydmljZVNPQVBTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDhhNDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9kYXRhL2F4aXNTb3VyY2UxL29yZy90ZW1wdXJpL0FyZWFTZXJ2aWNlL0FyZWFTZXJ2aWNlU09BUFN0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioKLSAqIEFyZWFTZXJ2aWNlU09BUFN0dWIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMgMS4yLjEgSnVuIDE0LCAyMDA1ICgwOToxNTo1NyBFRFQpIFdTREwySmF2YSBlbWl0dGVyLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuQXJlYVNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBBcmVhU2VydmljZVNPQVBTdHViIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzLmNsaWVudC5TdHViIGltcGxlbWVudHMgb3JnLnRlbXB1cmkuQXJlYVNlcnZpY2UuQXJlYVNlcnZpY2VfUG9ydFR5cGUgewotICAgIHByaXZhdGUgamF2YS51dGlsLlZlY3RvciBjYWNoZWRTZXJDbGFzc2VzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICBwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgY2FjaGVkU2VyUU5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICBwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgY2FjaGVkU2VyRmFjdG9yaWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICBwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgY2FjaGVkRGVzZXJGYWN0b3JpZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCi0gICAgc3RhdGljIG9yZy5hcGFjaGUuYXhpcy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjIFtdIF9vcGVyYXRpb25zOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgX29wZXJhdGlvbnMgPSBuZXcgb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NbMV07Ci0gICAgICAgIF9pbml0T3BlcmF0aW9uRGVzYzEoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIF9pbml0T3BlcmF0aW9uRGVzYzEoKXsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2Mgb3BlcjsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2MgcGFyYW07Ci0gICAgICAgIG9wZXIgPSBuZXcgb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2MoKTsKLSAgICAgICAgb3Blci5zZXROYW1lKCJDYWxjdWxhdGVSZWN0QXJlYSIpOwotICAgICAgICBwYXJhbSA9IG5ldyBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzYyhuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnL0FyZWFTZXJ2aWNlLyIsICJwYXJhbWV0ZXJzIiksIG9yZy5hcGFjaGUuYXhpcy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjLklOLCBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnL0FyZWFTZXJ2aWNlLyIsICJkaW1lbnNpb25zIiksIG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlLkRpbWVuc2lvbnMuY2xhc3MsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIG9wZXIuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgb3Blci5zZXRSZXR1cm5UeXBlKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJmbG9hdCIpKTsKLSAgICAgICAgb3Blci5zZXRSZXR1cm5DbGFzcyhmbG9hdC5jbGFzcyk7Ci0gICAgICAgIG9wZXIuc2V0UmV0dXJuUU5hbWUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9BcmVhU2VydmljZS8iLCAiYXJlYSIpKTsKLSAgICAgICAgb3Blci5zZXRTdHlsZShvcmcuYXBhY2hlLmF4aXMuY29uc3RhbnRzLlN0eWxlLkRPQ1VNRU5UKTsKLSAgICAgICAgb3Blci5zZXRVc2Uob3JnLmFwYWNoZS5heGlzLmNvbnN0YW50cy5Vc2UuTElURVJBTCk7Ci0gICAgICAgIF9vcGVyYXRpb25zWzBdID0gb3BlcjsKLQotICAgIH0KLQotICAgIHB1YmxpYyBBcmVhU2VydmljZVNPQVBTdHViKCkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpcy5BeGlzRmF1bHQgewotICAgICAgICAgdGhpcyhudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJlYVNlcnZpY2VTT0FQU3R1YihqYXZhLm5ldC5VUkwgZW5kcG9pbnRVUkwsIGphdmF4LnhtbC5ycGMuU2VydmljZSBzZXJ2aWNlKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzLkF4aXNGYXVsdCB7Ci0gICAgICAgICB0aGlzKHNlcnZpY2UpOwotICAgICAgICAgc3VwZXIuY2FjaGVkRW5kcG9pbnQgPSBlbmRwb2ludFVSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJlYVNlcnZpY2VTT0FQU3R1YihqYXZheC54bWwucnBjLlNlcnZpY2Ugc2VydmljZSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpcy5BeGlzRmF1bHQgewotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXJ2aWNlID0gbmV3IG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuU2VydmljZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgKChvcmcuYXBhY2hlLmF4aXMuY2xpZW50LlNlcnZpY2Upc3VwZXIuc2VydmljZSkuc2V0VHlwZU1hcHBpbmdWZXJzaW9uKCIxLjIiKTsKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBjbHM7Ci0gICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lOwotICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZTI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgYmVhbnNmID0gb3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLnNlci5CZWFuU2VyaWFsaXplckZhY3RvcnkuY2xhc3M7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgYmVhbmRmID0gb3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLnNlci5CZWFuRGVzZXJpYWxpemVyRmFjdG9yeS5jbGFzczsKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBlbnVtc2YgPSBvcmcuYXBhY2hlLmF4aXMuZW5jb2Rpbmcuc2VyLkVudW1TZXJpYWxpemVyRmFjdG9yeS5jbGFzczsKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBlbnVtZGYgPSBvcmcuYXBhY2hlLmF4aXMuZW5jb2Rpbmcuc2VyLkVudW1EZXNlcmlhbGl6ZXJGYWN0b3J5LmNsYXNzOwotICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzIGFycmF5c2YgPSBvcmcuYXBhY2hlLmF4aXMuZW5jb2Rpbmcuc2VyLkFycmF5U2VyaWFsaXplckZhY3RvcnkuY2xhc3M7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgYXJyYXlkZiA9IG9yZy5hcGFjaGUuYXhpcy5lbmNvZGluZy5zZXIuQXJyYXlEZXNlcmlhbGl6ZXJGYWN0b3J5LmNsYXNzOwotICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzIHNpbXBsZXNmID0gb3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLnNlci5TaW1wbGVTZXJpYWxpemVyRmFjdG9yeS5jbGFzczsKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBzaW1wbGVkZiA9IG9yZy5hcGFjaGUuYXhpcy5lbmNvZGluZy5zZXIuU2ltcGxlRGVzZXJpYWxpemVyRmFjdG9yeS5jbGFzczsKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBzaW1wbGVsaXN0c2YgPSBvcmcuYXBhY2hlLmF4aXMuZW5jb2Rpbmcuc2VyLlNpbXBsZUxpc3RTZXJpYWxpemVyRmFjdG9yeS5jbGFzczsKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBzaW1wbGVsaXN0ZGYgPSBvcmcuYXBhY2hlLmF4aXMuZW5jb2Rpbmcuc2VyLlNpbXBsZUxpc3REZXNlcmlhbGl6ZXJGYWN0b3J5LmNsYXNzOwotICAgICAgICAgICAgcU5hbWUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnL0FyZWFTZXJ2aWNlLyIsICJkaW1lbnNpb25zIik7Ci0gICAgICAgICAgICBjYWNoZWRTZXJRTmFtZXMuYWRkKHFOYW1lKTsKLSAgICAgICAgICAgIGNscyA9IG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlLkRpbWVuc2lvbnMuY2xhc3M7Ci0gICAgICAgICAgICBjYWNoZWRTZXJDbGFzc2VzLmFkZChjbHMpOwotICAgICAgICAgICAgY2FjaGVkU2VyRmFjdG9yaWVzLmFkZChiZWFuc2YpOwotICAgICAgICAgICAgY2FjaGVkRGVzZXJGYWN0b3JpZXMuYWRkKGJlYW5kZik7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzLmNsaWVudC5DYWxsIGNyZWF0ZUNhbGwoKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuQ2FsbCBfY2FsbCA9IHN1cGVyLl9jcmVhdGVDYWxsKCk7Ci0gICAgICAgICAgICBpZiAoc3VwZXIubWFpbnRhaW5TZXNzaW9uU2V0KSB7Ci0gICAgICAgICAgICAgICAgX2NhbGwuc2V0TWFpbnRhaW5TZXNzaW9uKHN1cGVyLm1haW50YWluU2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3VwZXIuY2FjaGVkVXNlcm5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9jYWxsLnNldFVzZXJuYW1lKHN1cGVyLmNhY2hlZFVzZXJuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdXBlci5jYWNoZWRQYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX2NhbGwuc2V0UGFzc3dvcmQoc3VwZXIuY2FjaGVkUGFzc3dvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1cGVyLmNhY2hlZEVuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfY2FsbC5zZXRUYXJnZXRFbmRwb2ludEFkZHJlc3Moc3VwZXIuY2FjaGVkRW5kcG9pbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1cGVyLmNhY2hlZFRpbWVvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9jYWxsLnNldFRpbWVvdXQoc3VwZXIuY2FjaGVkVGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3VwZXIuY2FjaGVkUG9ydE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9jYWxsLnNldFBvcnROYW1lKHN1cGVyLmNhY2hlZFBvcnROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzID0gc3VwZXIuY2FjaGVkUHJvcGVydGllcy5rZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcga2V5ID0gKGphdmEubGFuZy5TdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBfY2FsbC5zZXRQcm9wZXJ0eShrZXksIHN1cGVyLmNhY2hlZFByb3BlcnRpZXMuZ2V0KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQWxsIHRoZSB0eXBlIG1hcHBpbmcgaW5mb3JtYXRpb24gaXMgcmVnaXN0ZXJlZAotICAgICAgICAgICAgLy8gd2hlbiB0aGUgZmlyc3QgY2FsbCBpcyBtYWRlLgotICAgICAgICAgICAgLy8gVGhlIHR5cGUgbWFwcGluZyBpbmZvcm1hdGlvbiBpcyBhY3R1YWxseSByZWdpc3RlcmVkIGluCi0gICAgICAgICAgICAvLyB0aGUgVHlwZU1hcHBpbmdSZWdpc3RyeSBvZiB0aGUgc2VydmljZSwgd2hpY2gKLSAgICAgICAgICAgIC8vIGlzIHRoZSByZWFzb24gd2h5IHJlZ2lzdHJhdGlvbiBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIGZpcnN0IGNhbGwuCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RDYWxsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBzZXQgZW5jb2Rpbmcgc3R5bGUgYmVmb3JlIHJlZ2lzdGVyaW5nIHNlcmlhbGl6ZXJzCi0gICAgICAgICAgICAgICAgICAgIF9jYWxsLnNldEVuY29kaW5nU3R5bGUobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkU2VyRmFjdG9yaWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgY2xzID0gKGphdmEubGFuZy5DbGFzcykgY2FjaGVkU2VyQ2xhc3Nlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpIGNhY2hlZFNlclFOYW1lcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IHggPSBjYWNoZWRTZXJGYWN0b3JpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBDbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBzZiA9IChqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRTZXJGYWN0b3JpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBkZiA9IChqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWREZXNlckZhY3Rvcmllcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NhbGwucmVnaXN0ZXJUeXBlTWFwcGluZyhjbHMsIHFOYW1lLCBzZiwgZGYsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggaW5zdGFuY2VvZiBqYXZheC54bWwucnBjLmVuY29kaW5nLlNlcmlhbGl6ZXJGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLlNlcmlhbGl6ZXJGYWN0b3J5IHNmID0gKG9yZy5hcGFjaGUuYXhpcy5lbmNvZGluZy5TZXJpYWxpemVyRmFjdG9yeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFNlckZhY3Rvcmllcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLkRlc2VyaWFsaXplckZhY3RvcnkgZGYgPSAob3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLkRlc2VyaWFsaXplckZhY3RvcnkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWREZXNlckZhY3Rvcmllcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NhbGwucmVnaXN0ZXJUeXBlTWFwcGluZyhjbHMsIHFOYW1lLCBzZiwgZGYsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfY2FsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBfdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpcy5BeGlzRmF1bHQoIkZhaWx1cmUgdHJ5aW5nIHRvIGdldCB0aGUgQ2FsbCBvYmplY3QiLCBfdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgY2FsY3VsYXRlUmVjdEFyZWEob3JnLnRlbXB1cmkuQXJlYVNlcnZpY2UuRGltZW5zaW9ucyBwYXJhbWV0ZXJzKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN1cGVyLmNhY2hlZEVuZHBvaW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMuTm9FbmRQb2ludEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuQ2FsbCBfY2FsbCA9IGNyZWF0ZUNhbGwoKTsKLSAgICAgICAgX2NhbGwuc2V0T3BlcmF0aW9uKF9vcGVyYXRpb25zWzBdKTsKLSAgICAgICAgX2NhbGwuc2V0VXNlU09BUEFjdGlvbih0cnVlKTsKLSAgICAgICAgX2NhbGwuc2V0U09BUEFjdGlvblVSSSgiaHR0cDovL3RlbXB1cmkub3JnL0FyZWFTZXJ2aWNlL05ld09wZXJhdGlvbiIpOwotICAgICAgICBfY2FsbC5zZXRFbmNvZGluZ1N0eWxlKG51bGwpOwotICAgICAgICBfY2FsbC5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMuY2xpZW50LkNhbGwuU0VORF9UWVBFX0FUVFIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBfY2FsbC5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMuQXhpc0VuZ2luZS5QUk9QX0RPTVVMVElSRUZTLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgX2NhbGwuc2V0U09BUFZlcnNpb24ob3JnLmFwYWNoZS5heGlzLnNvYXAuU09BUENvbnN0YW50cy5TT0FQMTFfQ09OU1RBTlRTKTsKLSAgICAgICAgX2NhbGwuc2V0T3BlcmF0aW9uTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiIiwgIkNhbGN1bGF0ZVJlY3RBcmVhIikpOwotCi0gICAgICAgIHNldFJlcXVlc3RIZWFkZXJzKF9jYWxsKTsKLSAgICAgICAgc2V0QXR0YWNobWVudHMoX2NhbGwpOwotIHRyeSB7ICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IF9yZXNwID0gX2NhbGwuaW52b2tlKG5ldyBqYXZhLmxhbmcuT2JqZWN0W10ge3BhcmFtZXRlcnN9KTsKLQotICAgICAgICBpZiAoX3Jlc3AgaW5zdGFuY2VvZiBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHRocm93IChqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24pX3Jlc3A7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBleHRyYWN0QXR0YWNobWVudHMoX2NhbGwpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChqYXZhLmxhbmcuRmxvYXQpIF9yZXNwKS5mbG9hdFZhbHVlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIF9leGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChqYXZhLmxhbmcuRmxvYXQpIG9yZy5hcGFjaGUuYXhpcy51dGlscy5KYXZhVXRpbHMuY29udmVydChfcmVzcCwgZmxvYXQuY2xhc3MpKS5mbG9hdFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgfSBjYXRjaCAob3JnLmFwYWNoZS5heGlzLkF4aXNGYXVsdCBheGlzRmF1bHRFeGNlcHRpb24pIHsKLSAgdGhyb3cgYXhpc0ZhdWx0RXhjZXB0aW9uOwotfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9kYXRhL2F4aXNTb3VyY2UxL29yZy90ZW1wdXJpL0FyZWFTZXJ2aWNlL0FyZWFTZXJ2aWNlX1BvcnRUeXBlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTEvb3JnL3RlbXB1cmkvQXJlYVNlcnZpY2UvQXJlYVNlcnZpY2VfUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiN2RjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTEvb3JnL3RlbXB1cmkvQXJlYVNlcnZpY2UvQXJlYVNlcnZpY2VfUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qKgotICogQXJlYVNlcnZpY2VfUG9ydFR5cGUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMgMS4yLjEgSnVuIDE0LCAyMDA1ICgwOToxNTo1NyBFRFQpIFdTREwySmF2YSBlbWl0dGVyLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuQXJlYVNlcnZpY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXJlYVNlcnZpY2VfUG9ydFR5cGUgZXh0ZW5kcyBqYXZhLnJtaS5SZW1vdGUgewotICAgIHB1YmxpYyBmbG9hdCBjYWxjdWxhdGVSZWN0QXJlYShvcmcudGVtcHVyaS5BcmVhU2VydmljZS5EaW1lbnNpb25zIHBhcmFtZXRlcnMpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTEvb3JnL3RlbXB1cmkvQXJlYVNlcnZpY2UvQXJlYVNlcnZpY2VfU2VydmljZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9kYXRhL2F4aXNTb3VyY2UxL29yZy90ZW1wdXJpL0FyZWFTZXJ2aWNlL0FyZWFTZXJ2aWNlX1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxZjY1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTEvb3JnL3RlbXB1cmkvQXJlYVNlcnZpY2UvQXJlYVNlcnZpY2VfU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqCi0gKiBBcmVhU2VydmljZV9TZXJ2aWNlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzIDEuMi4xIEp1biAxNCwgMjAwNSAoMDk6MTU6NTcgRURUKSBXU0RMMkphdmEgZW1pdHRlci4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEFyZWFTZXJ2aWNlX1NlcnZpY2UgZXh0ZW5kcyBqYXZheC54bWwucnBjLlNlcnZpY2UgewotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFyZWFTZXJ2aWNlU09BUEFkZHJlc3MoKTsKLQotICAgIHB1YmxpYyBvcmcudGVtcHVyaS5BcmVhU2VydmljZS5BcmVhU2VydmljZV9Qb3J0VHlwZSBnZXRBcmVhU2VydmljZVNPQVAoKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlLkFyZWFTZXJ2aWNlX1BvcnRUeXBlIGdldEFyZWFTZXJ2aWNlU09BUChqYXZhLm5ldC5VUkwgcG9ydEFkZHJlc3MpIHRocm93cyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTEvb3JnL3RlbXB1cmkvQXJlYVNlcnZpY2UvQXJlYVNlcnZpY2VfU2VydmljZUxvY2F0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMS9vcmcvdGVtcHVyaS9BcmVhU2VydmljZS9BcmVhU2VydmljZV9TZXJ2aWNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2QyMmM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMS9vcmcvdGVtcHVyaS9BcmVhU2VydmljZS9BcmVhU2VydmljZV9TZXJ2aWNlTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKgotICogQXJlYVNlcnZpY2VfU2VydmljZUxvY2F0b3IuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMgMS4yLjEgSnVuIDE0LCAyMDA1ICgwOToxNTo1NyBFRFQpIFdTREwySmF2YSBlbWl0dGVyLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuQXJlYVNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBBcmVhU2VydmljZV9TZXJ2aWNlTG9jYXRvciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuU2VydmljZSBpbXBsZW1lbnRzIG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlLkFyZWFTZXJ2aWNlX1NlcnZpY2UgewotCi0gICAgcHVibGljIEFyZWFTZXJ2aWNlX1NlcnZpY2VMb2NhdG9yKCkgewotICAgIH0KLQotCi0gICAgcHVibGljIEFyZWFTZXJ2aWNlX1NlcnZpY2VMb2NhdG9yKG9yZy5hcGFjaGUuYXhpcy5FbmdpbmVDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBzdXBlcihjb25maWcpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcmVhU2VydmljZV9TZXJ2aWNlTG9jYXRvcihqYXZhLmxhbmcuU3RyaW5nIHdzZGxMb2MsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgc05hbWUpIHRocm93cyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBzdXBlcih3c2RsTG9jLCBzTmFtZSk7Ci0gICAgfQotCi0gICAgLy8gVXNlIHRvIGdldCBhIHByb3h5IGNsYXNzIGZvciBBcmVhU2VydmljZVNPQVAKLSAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgQXJlYVNlcnZpY2VTT0FQX2FkZHJlc3MgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL0FyZWFQcm9qL3NlcnZpY2VzL0FyZWFTZXJ2aWNlU09BUCI7Ci0KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBcmVhU2VydmljZVNPQVBBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gQXJlYVNlcnZpY2VTT0FQX2FkZHJlc3M7Ci0gICAgfQotCi0gICAgLy8gVGhlIFdTREQgc2VydmljZSBuYW1lIGRlZmF1bHRzIHRvIHRoZSBwb3J0IG5hbWUuCi0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIEFyZWFTZXJ2aWNlU09BUFdTRERTZXJ2aWNlTmFtZSA9ICJBcmVhU2VydmljZVNPQVAiOwotCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXJlYVNlcnZpY2VTT0FQV1NERFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gQXJlYVNlcnZpY2VTT0FQV1NERFNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFyZWFTZXJ2aWNlU09BUFdTRERTZXJ2aWNlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgQXJlYVNlcnZpY2VTT0FQV1NERFNlcnZpY2VOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3JnLnRlbXB1cmkuQXJlYVNlcnZpY2UuQXJlYVNlcnZpY2VfUG9ydFR5cGUgZ2V0QXJlYVNlcnZpY2VTT0FQKCkgdGhyb3dzIGphdmF4LnhtbC5ycGMuU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgamF2YS5uZXQuVVJMIGVuZHBvaW50OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZW5kcG9pbnQgPSBuZXcgamF2YS5uZXQuVVJMKEFyZWFTZXJ2aWNlU09BUF9hZGRyZXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldEFyZWFTZXJ2aWNlU09BUChlbmRwb2ludCk7Ci0gICAgfQotCi0gICAgcHVibGljIG9yZy50ZW1wdXJpLkFyZWFTZXJ2aWNlLkFyZWFTZXJ2aWNlX1BvcnRUeXBlIGdldEFyZWFTZXJ2aWNlU09BUChqYXZhLm5ldC5VUkwgcG9ydEFkZHJlc3MpIHRocm93cyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3JnLnRlbXB1cmkuQXJlYVNlcnZpY2UuQXJlYVNlcnZpY2VTT0FQU3R1YiBfc3R1YiA9IG5ldyBvcmcudGVtcHVyaS5BcmVhU2VydmljZS5BcmVhU2VydmljZVNPQVBTdHViKHBvcnRBZGRyZXNzLCB0aGlzKTsKLSAgICAgICAgICAgIF9zdHViLnNldFBvcnROYW1lKGdldEFyZWFTZXJ2aWNlU09BUFdTRERTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBfc3R1YjsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAob3JnLmFwYWNoZS5heGlzLkF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFyZWFTZXJ2aWNlU09BUEVuZHBvaW50QWRkcmVzcyhqYXZhLmxhbmcuU3RyaW5nIGFkZHJlc3MpIHsKLSAgICAgICAgQXJlYVNlcnZpY2VTT0FQX2FkZHJlc3MgPSBhZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciB0aGUgZ2l2ZW4gaW50ZXJmYWNlLCBnZXQgdGhlIHN0dWIgaW1wbGVtZW50YXRpb24uCi0gICAgICogSWYgdGhpcyBzZXJ2aWNlIGhhcyBubyBwb3J0IGZvciB0aGUgZ2l2ZW4gaW50ZXJmYWNlLAotICAgICAqIHRoZW4gU2VydmljZUV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICovCi0gICAgcHVibGljIGphdmEucm1pLlJlbW90ZSBnZXRQb3J0KENsYXNzIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgdGhyb3dzIGphdmF4LnhtbC5ycGMuU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAob3JnLnRlbXB1cmkuQXJlYVNlcnZpY2UuQXJlYVNlcnZpY2VfUG9ydFR5cGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpKSB7Ci0gICAgICAgICAgICAgICAgb3JnLnRlbXB1cmkuQXJlYVNlcnZpY2UuQXJlYVNlcnZpY2VTT0FQU3R1YiBfc3R1YiA9IG5ldyBvcmcudGVtcHVyaS5BcmVhU2VydmljZS5BcmVhU2VydmljZVNPQVBTdHViKG5ldyBqYXZhLm5ldC5VUkwoQXJlYVNlcnZpY2VTT0FQX2FkZHJlc3MpLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBfc3R1Yi5zZXRQb3J0TmFtZShnZXRBcmVhU2VydmljZVNPQVBXU0REU2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHViOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5ycGMuU2VydmljZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gc3R1YiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGludGVyZmFjZTogICIgKyAoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID09IG51bGwgPyAibnVsbCIgOiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2V0TmFtZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHRoZSBnaXZlbiBpbnRlcmZhY2UsIGdldCB0aGUgc3R1YiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiBJZiB0aGlzIHNlcnZpY2UgaGFzIG5vIHBvcnQgZm9yIHRoZSBnaXZlbiBpbnRlcmZhY2UsCi0gICAgICogdGhlbiBTZXJ2aWNlRXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5ybWkuUmVtb3RlIGdldFBvcnQoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwb3J0TmFtZSwgQ2xhc3Mgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQb3J0KHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpbnB1dFBvcnROYW1lID0gcG9ydE5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmICgiQXJlYVNlcnZpY2VTT0FQIi5lcXVhbHMoaW5wdXRQb3J0TmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBcmVhU2VydmljZVNPQVAoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICB7Ci0gICAgICAgICAgICBqYXZhLnJtaS5SZW1vdGUgX3N0dWIgPSBnZXRQb3J0KHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAoKG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuU3R1YikgX3N0dWIpLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBfc3R1YjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9BcmVhU2VydmljZS8iLCAiQXJlYVNlcnZpY2UiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGphdmEudXRpbC5IYXNoU2V0IHBvcnRzID0gbnVsbDsKLQotICAgIHB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgZ2V0UG9ydHMoKSB7Ci0gICAgICAgIGlmIChwb3J0cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwb3J0cyA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwotICAgICAgICAgICAgcG9ydHMuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvQXJlYVNlcnZpY2UvIiwgIkFyZWFTZXJ2aWNlU09BUCIpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgZW5kcG9pbnQgYWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBwb3J0IG5hbWUuCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludEFkZHJlc3MoamF2YS5sYW5nLlN0cmluZyBwb3J0TmFtZSwgamF2YS5sYW5nLlN0cmluZyBhZGRyZXNzKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgCi1pZiAoIkFyZWFTZXJ2aWNlU09BUCIuZXF1YWxzKHBvcnROYW1lKSkgewotICAgICAgICAgICAgc2V0QXJlYVNlcnZpY2VTT0FQRW5kcG9pbnRBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi17IC8vIFVua25vd24gUG9ydCBOYW1lCi0gICAgICAgICAgICB0aHJvdyBuZXcgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uKCIgQ2Fubm90IHNldCBFbmRwb2ludCBBZGRyZXNzIGZvciBVbmtub3duIFBvcnQiICsgcG9ydE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGVuZHBvaW50IGFkZHJlc3MgZm9yIHRoZSBzcGVjaWZpZWQgcG9ydCBuYW1lLgotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRBZGRyZXNzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcG9ydE5hbWUsIGphdmEubGFuZy5TdHJpbmcgYWRkcmVzcykgdGhyb3dzIGphdmF4LnhtbC5ycGMuU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldEVuZHBvaW50QWRkcmVzcyhwb3J0TmFtZS5nZXRMb2NhbFBhcnQoKSwgYWRkcmVzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTEvb3JnL3RlbXB1cmkvQXJlYVNlcnZpY2UvRGltZW5zaW9ucy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9kYXRhL2F4aXNTb3VyY2UxL29yZy90ZW1wdXJpL0FyZWFTZXJ2aWNlL0RpbWVuc2lvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4ZWI1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTEvb3JnL3RlbXB1cmkvQXJlYVNlcnZpY2UvRGltZW5zaW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKgotICogRGltZW5zaW9ucy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpcyAxLjIuMSBKdW4gMTQsIDIwMDUgKDA5OjE1OjU3IEVEVCkgV1NETDJKYXZhIGVtaXR0ZXIuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5BcmVhU2VydmljZTsKLQotcHVibGljIGNsYXNzIERpbWVuc2lvbnMgIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgZmxvYXQgd2lkdGg7Ci0gICAgcHJpdmF0ZSBmbG9hdCBoZWlnaHQ7Ci0KLSAgICBwdWJsaWMgRGltZW5zaW9ucygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGltZW5zaW9ucygKLSAgICAgICAgICAgZmxvYXQgd2lkdGgsCi0gICAgICAgICAgIGZsb2F0IGhlaWdodCkgewotICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgd2lkdGggdmFsdWUgZm9yIHRoaXMgRGltZW5zaW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdpZHRoCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldFdpZHRoKCkgewotICAgICAgICByZXR1cm4gd2lkdGg7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCB2YWx1ZSBmb3IgdGhpcyBEaW1lbnNpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdpZHRoKGZsb2F0IHdpZHRoKSB7Ci0gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhlaWdodCB2YWx1ZSBmb3IgdGhpcyBEaW1lbnNpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gaGVpZ2h0Ci0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldEhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIGhlaWdodDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhlaWdodCB2YWx1ZSBmb3IgdGhpcyBEaW1lbnNpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBoZWlnaHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWlnaHQoZmxvYXQgaGVpZ2h0KSB7Ci0gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIHByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBfX2VxdWFsc0NhbGMgPSBudWxsOwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGltZW5zaW9ucykpIHJldHVybiBmYWxzZTsKLSAgICAgICAgRGltZW5zaW9ucyBvdGhlciA9IChEaW1lbnNpb25zKSBvYmo7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoX19lcXVhbHNDYWxjICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoX19lcXVhbHNDYWxjID09IG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgX19lcXVhbHNDYWxjID0gb2JqOwotICAgICAgICBib29sZWFuIF9lcXVhbHM7Ci0gICAgICAgIF9lcXVhbHMgPSB0cnVlICYmIAotICAgICAgICAgICAgdGhpcy53aWR0aCA9PSBvdGhlci5nZXRXaWR0aCgpICYmCi0gICAgICAgICAgICB0aGlzLmhlaWdodCA9PSBvdGhlci5nZXRIZWlnaHQoKTsKLSAgICAgICAgX19lcXVhbHNDYWxjID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIF9lcXVhbHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9faGFzaENvZGVDYWxjID0gZmFsc2U7Ci0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmIChfX2hhc2hDb2RlQ2FsYykgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgX19oYXNoQ29kZUNhbGMgPSB0cnVlOwotICAgICAgICBpbnQgX2hhc2hDb2RlID0gMTsKLSAgICAgICAgX2hhc2hDb2RlICs9IG5ldyBGbG9hdChnZXRXaWR0aCgpKS5oYXNoQ29kZSgpOwotICAgICAgICBfaGFzaENvZGUgKz0gbmV3IEZsb2F0KGdldEhlaWdodCgpKS5oYXNoQ29kZSgpOwotICAgICAgICBfX2hhc2hDb2RlQ2FsYyA9IGZhbHNlOwotICAgICAgICByZXR1cm4gX2hhc2hDb2RlOwotICAgIH0KLQotICAgIC8vIFR5cGUgbWV0YWRhdGEKLSAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uVHlwZURlc2MgdHlwZURlc2MgPQotICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uLlR5cGVEZXNjKERpbWVuc2lvbnMuY2xhc3MsIHRydWUpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHlwZURlc2Muc2V0WG1sVHlwZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnL0FyZWFTZXJ2aWNlLyIsICJkaW1lbnNpb25zIikpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uRWxlbWVudERlc2MgZWxlbUZpZWxkID0gbmV3IG9yZy5hcGFjaGUuYXhpcy5kZXNjcmlwdGlvbi5FbGVtZW50RGVzYygpOwotICAgICAgICBlbGVtRmllbGQuc2V0RmllbGROYW1lKCJ3aWR0aCIpOwotICAgICAgICBlbGVtRmllbGQuc2V0WG1sTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiIiwgIndpZHRoIikpOwotICAgICAgICBlbGVtRmllbGQuc2V0WG1sVHlwZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiZmxvYXQiKSk7Ci0gICAgICAgIGVsZW1GaWVsZC5zZXROaWxsYWJsZShmYWxzZSk7Ci0gICAgICAgIHR5cGVEZXNjLmFkZEZpZWxkRGVzYyhlbGVtRmllbGQpOwotICAgICAgICBlbGVtRmllbGQgPSBuZXcgb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uLkVsZW1lbnREZXNjKCk7Ci0gICAgICAgIGVsZW1GaWVsZC5zZXRGaWVsZE5hbWUoImhlaWdodCIpOwotICAgICAgICBlbGVtRmllbGQuc2V0WG1sTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiIiwgImhlaWdodCIpKTsKLSAgICAgICAgZWxlbUZpZWxkLnNldFhtbFR5cGUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImZsb2F0IikpOwotICAgICAgICBlbGVtRmllbGQuc2V0TmlsbGFibGUoZmFsc2UpOwotICAgICAgICB0eXBlRGVzYy5hZGRGaWVsZERlc2MoZWxlbUZpZWxkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdHlwZSBtZXRhZGF0YSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuYXhpcy5kZXNjcmlwdGlvbi5UeXBlRGVzYyBnZXRUeXBlRGVzYygpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVEZXNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBDdXN0b20gU2VyaWFsaXplcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLlNlcmlhbGl6ZXIgZ2V0U2VyaWFsaXplcigKLSAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBtZWNoVHlwZSwgCi0gICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBfamF2YVR5cGUsICAKLSAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBfeG1sVHlwZSkgewotICAgICAgICByZXR1cm4gCi0gICAgICAgICAgbmV3ICBvcmcuYXBhY2hlLmF4aXMuZW5jb2Rpbmcuc2VyLkJlYW5TZXJpYWxpemVyKAotICAgICAgICAgICAgX2phdmFUeXBlLCBfeG1sVHlwZSwgdHlwZURlc2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBDdXN0b20gRGVzZXJpYWxpemVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMuZW5jb2RpbmcuRGVzZXJpYWxpemVyIGdldERlc2VyaWFsaXplcigKLSAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBtZWNoVHlwZSwgCi0gICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBfamF2YVR5cGUsICAKLSAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBfeG1sVHlwZSkgewotICAgICAgICByZXR1cm4gCi0gICAgICAgICAgbmV3ICBvcmcuYXBhY2hlLmF4aXMuZW5jb2Rpbmcuc2VyLkJlYW5EZXNlcmlhbGl6ZXIoCi0gICAgICAgICAgICBfamF2YVR5cGUsIF94bWxUeXBlLCB0eXBlRGVzYyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTIvd3RwL0NvbnZlcnRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9kYXRhL2F4aXNTb3VyY2UyL3d0cC9Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5NDkxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTIvd3RwL0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyoqCi0gKiBDb252ZXJ0ZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMgMS4yLjEgSnVuIDE0LCAyMDA1ICgwOToxNTo1NyBFRFQpIFdTREwySmF2YSBlbWl0dGVyLgotICovCi0KLXBhY2thZ2Ugd3RwOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnZlcnRlciBleHRlbmRzIGphdmEucm1pLlJlbW90ZSB7Ci0gICAgcHVibGljIGZsb2F0IGNlbHNpdXNUb0ZhcmVuaGVpdChmbG9hdCBjZWxzaXVzKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwotICAgIHB1YmxpYyBmbG9hdCBmYXJlbmhlaXRUb0NlbHNpdXMoZmxvYXQgZmFyZW5oZWl0KSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9kYXRhL2F4aXNTb3VyY2UyL3d0cC9Db252ZXJ0ZXJQcm94eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9kYXRhL2F4aXNTb3VyY2UyL3d0cC9Db252ZXJ0ZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmYxMDAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMi93dHAvQ29udmVydGVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2Ugd3RwOwotCi1wdWJsaWMgY2xhc3MgQ29udmVydGVyUHJveHkgaW1wbGVtZW50cyB3dHAuQ29udmVydGVyIHsKLSAgcHJpdmF0ZSBTdHJpbmcgX2VuZHBvaW50ID0gbnVsbDsKLSAgcHJpdmF0ZSB3dHAuQ29udmVydGVyIGNvbnZlcnRlciA9IG51bGw7Ci0gIAotICBwdWJsaWMgQ29udmVydGVyUHJveHkoKSB7Ci0gICAgX2luaXRDb252ZXJ0ZXJQcm94eSgpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgX2luaXRDb252ZXJ0ZXJQcm94eSgpIHsKLSAgICB0cnkgewotICAgICAgY29udmVydGVyID0gKG5ldyB3dHAuQ29udmVydGVyU2VydmljZUxvY2F0b3IoKSkuZ2V0Q29udmVydGVyKCk7Ci0gICAgICBpZiAoY29udmVydGVyICE9IG51bGwpIHsKLSAgICAgICAgaWYgKF9lbmRwb2ludCAhPSBudWxsKQotICAgICAgICAgICgoamF2YXgueG1sLnJwYy5TdHViKWNvbnZlcnRlcikuX3NldFByb3BlcnR5KCJqYXZheC54bWwucnBjLnNlcnZpY2UuZW5kcG9pbnQuYWRkcmVzcyIsIF9lbmRwb2ludCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBfZW5kcG9pbnQgPSAoU3RyaW5nKSgoamF2YXgueG1sLnJwYy5TdHViKWNvbnZlcnRlcikuX2dldFByb3BlcnR5KCJqYXZheC54bWwucnBjLnNlcnZpY2UuZW5kcG9pbnQuYWRkcmVzcyIpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGNhdGNoIChqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24gc2VydmljZUV4Y2VwdGlvbikge30KLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludCgpIHsKLSAgICByZXR1cm4gX2VuZHBvaW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnQpIHsKLSAgICBfZW5kcG9pbnQgPSBlbmRwb2ludDsKLSAgICBpZiAoY29udmVydGVyICE9IG51bGwpCi0gICAgICAoKGphdmF4LnhtbC5ycGMuU3R1Yiljb252ZXJ0ZXIpLl9zZXRQcm9wZXJ0eSgiamF2YXgueG1sLnJwYy5zZXJ2aWNlLmVuZHBvaW50LmFkZHJlc3MiLCBfZW5kcG9pbnQpOwotICAgIAotICB9Ci0gIAotICBwdWJsaWMgd3RwLkNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0gICAgaWYgKGNvbnZlcnRlciA9PSBudWxsKQotICAgICAgX2luaXRDb252ZXJ0ZXJQcm94eSgpOwotICAgIHJldHVybiBjb252ZXJ0ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmbG9hdCBjZWxzaXVzVG9GYXJlbmhlaXQoZmxvYXQgY2Vsc2l1cykgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbnsKLSAgICBpZiAoY29udmVydGVyID09IG51bGwpCi0gICAgICBfaW5pdENvbnZlcnRlclByb3h5KCk7Ci0gICAgcmV0dXJuIGNvbnZlcnRlci5jZWxzaXVzVG9GYXJlbmhlaXQoY2Vsc2l1cyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmbG9hdCBmYXJlbmhlaXRUb0NlbHNpdXMoZmxvYXQgZmFyZW5oZWl0KSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uewotICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbCkKLSAgICAgIF9pbml0Q29udmVydGVyUHJveHkoKTsKLSAgICByZXR1cm4gY29udmVydGVyLmZhcmVuaGVpdFRvQ2Vsc2l1cyhmYXJlbmhlaXQpOwotICB9Ci0gIAotICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTIvd3RwL0NvbnZlcnRlclNlcnZpY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMi93dHAvQ29udmVydGVyU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTNkZjdlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMi93dHAvQ29udmVydGVyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqCi0gKiBDb252ZXJ0ZXJTZXJ2aWNlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzIDEuMi4xIEp1biAxNCwgMjAwNSAoMDk6MTU6NTcgRURUKSBXU0RMMkphdmEgZW1pdHRlci4KLSAqLwotCi1wYWNrYWdlIHd0cDsKLQotcHVibGljIGludGVyZmFjZSBDb252ZXJ0ZXJTZXJ2aWNlIGV4dGVuZHMgamF2YXgueG1sLnJwYy5TZXJ2aWNlIHsKLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb252ZXJ0ZXJBZGRyZXNzKCk7Ci0KLSAgICBwdWJsaWMgd3RwLkNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHd0cC5Db252ZXJ0ZXIgZ2V0Q29udmVydGVyKGphdmEubmV0LlVSTCBwb3J0QWRkcmVzcykgdGhyb3dzIGphdmF4LnhtbC5ycGMuU2VydmljZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMi93dHAvQ29udmVydGVyU2VydmljZUxvY2F0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMi93dHAvQ29udmVydGVyU2VydmljZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmYmU2OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTIvd3RwL0NvbnZlcnRlclNlcnZpY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqCi0gKiBDb252ZXJ0ZXJTZXJ2aWNlTG9jYXRvci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpcyAxLjIuMSBKdW4gMTQsIDIwMDUgKDA5OjE1OjU3IEVEVCkgV1NETDJKYXZhIGVtaXR0ZXIuCi0gKi8KLQotcGFja2FnZSB3dHA7Ci0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJTZXJ2aWNlTG9jYXRvciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuU2VydmljZSBpbXBsZW1lbnRzIHd0cC5Db252ZXJ0ZXJTZXJ2aWNlIHsKLQotICAgIHB1YmxpYyBDb252ZXJ0ZXJTZXJ2aWNlTG9jYXRvcigpIHsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBDb252ZXJ0ZXJTZXJ2aWNlTG9jYXRvcihvcmcuYXBhY2hlLmF4aXMuRW5naW5lQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgc3VwZXIoY29uZmlnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udmVydGVyU2VydmljZUxvY2F0b3IoamF2YS5sYW5nLlN0cmluZyB3c2RsTG9jLCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHNOYW1lKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIod3NkbExvYywgc05hbWUpOwotICAgIH0KLQotICAgIC8vIFVzZSB0byBnZXQgYSBwcm94eSBjbGFzcyBmb3IgQ29udmVydGVyCi0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIENvbnZlcnRlcl9hZGRyZXNzID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9Db252ZXJ0ZXJQcm9qL3NlcnZpY2VzL0NvbnZlcnRlciI7Ci0KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb252ZXJ0ZXJBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gQ29udmVydGVyX2FkZHJlc3M7Ci0gICAgfQotCi0gICAgLy8gVGhlIFdTREQgc2VydmljZSBuYW1lIGRlZmF1bHRzIHRvIHRoZSBwb3J0IG5hbWUuCi0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIENvbnZlcnRlcldTRERTZXJ2aWNlTmFtZSA9ICJDb252ZXJ0ZXIiOwotCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udmVydGVyV1NERFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gQ29udmVydGVyV1NERFNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlcldTRERTZXJ2aWNlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgQ29udmVydGVyV1NERFNlcnZpY2VOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgd3RwLkNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICBqYXZhLm5ldC5VUkwgZW5kcG9pbnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlbmRwb2ludCA9IG5ldyBqYXZhLm5ldC5VUkwoQ29udmVydGVyX2FkZHJlc3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5ycGMuU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0Q29udmVydGVyKGVuZHBvaW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgd3RwLkNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoamF2YS5uZXQuVVJMIHBvcnRBZGRyZXNzKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHd0cC5Db252ZXJ0ZXJTb2FwQmluZGluZ1N0dWIgX3N0dWIgPSBuZXcgd3RwLkNvbnZlcnRlclNvYXBCaW5kaW5nU3R1Yihwb3J0QWRkcmVzcywgdGhpcyk7Ci0gICAgICAgICAgICBfc3R1Yi5zZXRQb3J0TmFtZShnZXRDb252ZXJ0ZXJXU0REU2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gX3N0dWI7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKG9yZy5hcGFjaGUuYXhpcy5BeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJFbmRwb2ludEFkZHJlc3MoamF2YS5sYW5nLlN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIENvbnZlcnRlcl9hZGRyZXNzID0gYWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdGhlIGdpdmVuIGludGVyZmFjZSwgZ2V0IHRoZSBzdHViIGltcGxlbWVudGF0aW9uLgotICAgICAqIElmIHRoaXMgc2VydmljZSBoYXMgbm8gcG9ydCBmb3IgdGhlIGdpdmVuIGludGVyZmFjZSwKLSAgICAgKiB0aGVuIFNlcnZpY2VFeGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLnJtaS5SZW1vdGUgZ2V0UG9ydChDbGFzcyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHRocm93cyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHd0cC5Db252ZXJ0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpKSB7Ci0gICAgICAgICAgICAgICAgd3RwLkNvbnZlcnRlclNvYXBCaW5kaW5nU3R1YiBfc3R1YiA9IG5ldyB3dHAuQ29udmVydGVyU29hcEJpbmRpbmdTdHViKG5ldyBqYXZhLm5ldC5VUkwoQ29udmVydGVyX2FkZHJlc3MpLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBfc3R1Yi5zZXRQb3J0TmFtZShnZXRDb252ZXJ0ZXJXU0REU2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHViOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5ycGMuU2VydmljZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gc3R1YiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGludGVyZmFjZTogICIgKyAoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID09IG51bGwgPyAibnVsbCIgOiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2V0TmFtZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHRoZSBnaXZlbiBpbnRlcmZhY2UsIGdldCB0aGUgc3R1YiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiBJZiB0aGlzIHNlcnZpY2UgaGFzIG5vIHBvcnQgZm9yIHRoZSBnaXZlbiBpbnRlcmZhY2UsCi0gICAgICogdGhlbiBTZXJ2aWNlRXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5ybWkuUmVtb3RlIGdldFBvcnQoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwb3J0TmFtZSwgQ2xhc3Mgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQb3J0KHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpbnB1dFBvcnROYW1lID0gcG9ydE5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmICgiQ29udmVydGVyIi5lcXVhbHMoaW5wdXRQb3J0TmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb252ZXJ0ZXIoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICB7Ci0gICAgICAgICAgICBqYXZhLnJtaS5SZW1vdGUgX3N0dWIgPSBnZXRQb3J0KHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAoKG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuU3R1YikgX3N0dWIpLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBfc3R1YjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93dHAiLCAiQ29udmVydGVyU2VydmljZSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgamF2YS51dGlsLkhhc2hTZXQgcG9ydHMgPSBudWxsOwotCi0gICAgcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBnZXRQb3J0cygpIHsKLSAgICAgICAgaWYgKHBvcnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnRzID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KCk7Ci0gICAgICAgICAgICBwb3J0cy5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93dHAiLCAiQ29udmVydGVyIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0cy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBlbmRwb2ludCBhZGRyZXNzIGZvciB0aGUgc3BlY2lmaWVkIHBvcnQgbmFtZS4KLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50QWRkcmVzcyhqYXZhLmxhbmcuU3RyaW5nIHBvcnROYW1lLCBqYXZhLmxhbmcuU3RyaW5nIGFkZHJlc3MpIHRocm93cyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAKLWlmICgiQ29udmVydGVyIi5lcXVhbHMocG9ydE5hbWUpKSB7Ci0gICAgICAgICAgICBzZXRDb252ZXJ0ZXJFbmRwb2ludEFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLXsgLy8gVW5rbm93biBQb3J0IE5hbWUKLSAgICAgICAgICAgIHRocm93IG5ldyBqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24oIiBDYW5ub3Qgc2V0IEVuZHBvaW50IEFkZHJlc3MgZm9yIFVua25vd24gUG9ydCIgKyBwb3J0TmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgZW5kcG9pbnQgYWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBwb3J0IG5hbWUuCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludEFkZHJlc3MoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwb3J0TmFtZSwgamF2YS5sYW5nLlN0cmluZyBhZGRyZXNzKSB0aHJvd3MgamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0RW5kcG9pbnRBZGRyZXNzKHBvcnROYW1lLmdldExvY2FsUGFydCgpLCBhZGRyZXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMi93dHAvQ29udmVydGVyU29hcEJpbmRpbmdTdHViLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL2RhdGEvYXhpc1NvdXJjZTIvd3RwL0NvbnZlcnRlclNvYXBCaW5kaW5nU3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQyYzI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvZGF0YS9heGlzU291cmNlMi93dHAvQ29udmVydGVyU29hcEJpbmRpbmdTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqCi0gKiBDb252ZXJ0ZXJTb2FwQmluZGluZ1N0dWIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMgMS4yLjEgSnVuIDE0LCAyMDA1ICgwOToxNTo1NyBFRFQpIFdTREwySmF2YSBlbWl0dGVyLgotICovCi0KLXBhY2thZ2Ugd3RwOwotCi1wdWJsaWMgY2xhc3MgQ29udmVydGVyU29hcEJpbmRpbmdTdHViIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzLmNsaWVudC5TdHViIGltcGxlbWVudHMgd3RwLkNvbnZlcnRlciB7Ci0gICAgcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGNhY2hlZFNlckNsYXNzZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgIHByaXZhdGUgamF2YS51dGlsLlZlY3RvciBjYWNoZWRTZXJRTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgIHByaXZhdGUgamF2YS51dGlsLlZlY3RvciBjYWNoZWRTZXJGYWN0b3JpZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgIHByaXZhdGUgamF2YS51dGlsLlZlY3RvciBjYWNoZWREZXNlckZhY3RvcmllcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0KLSAgICBzdGF0aWMgb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2MgW10gX29wZXJhdGlvbnM7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBfb3BlcmF0aW9ucyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY1syXTsKLSAgICAgICAgX2luaXRPcGVyYXRpb25EZXNjMSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgX2luaXRPcGVyYXRpb25EZXNjMSgpewotICAgICAgICBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzYyBvcGVyOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzYyBwYXJhbTsKLSAgICAgICAgb3BlciA9IG5ldyBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzYygpOwotICAgICAgICBvcGVyLnNldE5hbWUoImNlbHNpdXNUb0ZhcmVuaGVpdCIpOwotICAgICAgICBwYXJhbSA9IG5ldyBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzYyhuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d0cCIsICJjZWxzaXVzIiksIG9yZy5hcGFjaGUuYXhpcy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjLklOLCBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiZmxvYXQiKSwgZmxvYXQuY2xhc3MsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIG9wZXIuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgb3Blci5zZXRSZXR1cm5UeXBlKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJmbG9hdCIpKTsKLSAgICAgICAgb3Blci5zZXRSZXR1cm5DbGFzcyhmbG9hdC5jbGFzcyk7Ci0gICAgICAgIG9wZXIuc2V0UmV0dXJuUU5hbWUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93dHAiLCAiY2Vsc2l1c1RvRmFyZW5oZWl0UmV0dXJuIikpOwotICAgICAgICBvcGVyLnNldFN0eWxlKG9yZy5hcGFjaGUuYXhpcy5jb25zdGFudHMuU3R5bGUuV1JBUFBFRCk7Ci0gICAgICAgIG9wZXIuc2V0VXNlKG9yZy5hcGFjaGUuYXhpcy5jb25zdGFudHMuVXNlLkxJVEVSQUwpOwotICAgICAgICBfb3BlcmF0aW9uc1swXSA9IG9wZXI7Ci0KLSAgICAgICAgb3BlciA9IG5ldyBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzYygpOwotICAgICAgICBvcGVyLnNldE5hbWUoImZhcmVuaGVpdFRvQ2Vsc2l1cyIpOwotICAgICAgICBwYXJhbSA9IG5ldyBvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzYyhuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d0cCIsICJmYXJlbmhlaXQiKSwgb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2MuSU4sIG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJmbG9hdCIpLCBmbG9hdC5jbGFzcywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgb3Blci5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICBvcGVyLnNldFJldHVyblR5cGUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImZsb2F0IikpOwotICAgICAgICBvcGVyLnNldFJldHVybkNsYXNzKGZsb2F0LmNsYXNzKTsKLSAgICAgICAgb3Blci5zZXRSZXR1cm5RTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d0cCIsICJmYXJlbmhlaXRUb0NlbHNpdXNSZXR1cm4iKSk7Ci0gICAgICAgIG9wZXIuc2V0U3R5bGUob3JnLmFwYWNoZS5heGlzLmNvbnN0YW50cy5TdHlsZS5XUkFQUEVEKTsKLSAgICAgICAgb3Blci5zZXRVc2Uob3JnLmFwYWNoZS5heGlzLmNvbnN0YW50cy5Vc2UuTElURVJBTCk7Ci0gICAgICAgIF9vcGVyYXRpb25zWzFdID0gb3BlcjsKLQotICAgIH0KLQotICAgIHB1YmxpYyBDb252ZXJ0ZXJTb2FwQmluZGluZ1N0dWIoKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzLkF4aXNGYXVsdCB7Ci0gICAgICAgICB0aGlzKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb252ZXJ0ZXJTb2FwQmluZGluZ1N0dWIoamF2YS5uZXQuVVJMIGVuZHBvaW50VVJMLCBqYXZheC54bWwucnBjLlNlcnZpY2Ugc2VydmljZSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpcy5BeGlzRmF1bHQgewotICAgICAgICAgdGhpcyhzZXJ2aWNlKTsKLSAgICAgICAgIHN1cGVyLmNhY2hlZEVuZHBvaW50ID0gZW5kcG9pbnRVUkw7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnZlcnRlclNvYXBCaW5kaW5nU3R1YihqYXZheC54bWwucnBjLlNlcnZpY2Ugc2VydmljZSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpcy5BeGlzRmF1bHQgewotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXJ2aWNlID0gbmV3IG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuU2VydmljZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgKChvcmcuYXBhY2hlLmF4aXMuY2xpZW50LlNlcnZpY2Upc3VwZXIuc2VydmljZSkuc2V0VHlwZU1hcHBpbmdWZXJzaW9uKCIxLjIiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzLmNsaWVudC5DYWxsIGNyZWF0ZUNhbGwoKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuQ2FsbCBfY2FsbCA9IHN1cGVyLl9jcmVhdGVDYWxsKCk7Ci0gICAgICAgICAgICBpZiAoc3VwZXIubWFpbnRhaW5TZXNzaW9uU2V0KSB7Ci0gICAgICAgICAgICAgICAgX2NhbGwuc2V0TWFpbnRhaW5TZXNzaW9uKHN1cGVyLm1haW50YWluU2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3VwZXIuY2FjaGVkVXNlcm5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9jYWxsLnNldFVzZXJuYW1lKHN1cGVyLmNhY2hlZFVzZXJuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdXBlci5jYWNoZWRQYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX2NhbGwuc2V0UGFzc3dvcmQoc3VwZXIuY2FjaGVkUGFzc3dvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1cGVyLmNhY2hlZEVuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfY2FsbC5zZXRUYXJnZXRFbmRwb2ludEFkZHJlc3Moc3VwZXIuY2FjaGVkRW5kcG9pbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1cGVyLmNhY2hlZFRpbWVvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9jYWxsLnNldFRpbWVvdXQoc3VwZXIuY2FjaGVkVGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3VwZXIuY2FjaGVkUG9ydE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9jYWxsLnNldFBvcnROYW1lKHN1cGVyLmNhY2hlZFBvcnROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzID0gc3VwZXIuY2FjaGVkUHJvcGVydGllcy5rZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcga2V5ID0gKGphdmEubGFuZy5TdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBfY2FsbC5zZXRQcm9wZXJ0eShrZXksIHN1cGVyLmNhY2hlZFByb3BlcnRpZXMuZ2V0KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9jYWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIF90KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzLkF4aXNGYXVsdCgiRmFpbHVyZSB0cnlpbmcgdG8gZ2V0IHRoZSBDYWxsIG9iamVjdCIsIF90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBjZWxzaXVzVG9GYXJlbmhlaXQoZmxvYXQgY2Vsc2l1cykgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdXBlci5jYWNoZWRFbmRwb2ludCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzLk5vRW5kUG9pbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMuY2xpZW50LkNhbGwgX2NhbGwgPSBjcmVhdGVDYWxsKCk7Ci0gICAgICAgIF9jYWxsLnNldE9wZXJhdGlvbihfb3BlcmF0aW9uc1swXSk7Ci0gICAgICAgIF9jYWxsLnNldFVzZVNPQVBBY3Rpb24odHJ1ZSk7Ci0gICAgICAgIF9jYWxsLnNldFNPQVBBY3Rpb25VUkkoIiIpOwotICAgICAgICBfY2FsbC5zZXRFbmNvZGluZ1N0eWxlKG51bGwpOwotICAgICAgICBfY2FsbC5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMuY2xpZW50LkNhbGwuU0VORF9UWVBFX0FUVFIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBfY2FsbC5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMuQXhpc0VuZ2luZS5QUk9QX0RPTVVMVElSRUZTLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgX2NhbGwuc2V0U09BUFZlcnNpb24ob3JnLmFwYWNoZS5heGlzLnNvYXAuU09BUENvbnN0YW50cy5TT0FQMTFfQ09OU1RBTlRTKTsKLSAgICAgICAgX2NhbGwuc2V0T3BlcmF0aW9uTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d0cCIsICJjZWxzaXVzVG9GYXJlbmhlaXQiKSk7Ci0KLSAgICAgICAgc2V0UmVxdWVzdEhlYWRlcnMoX2NhbGwpOwotICAgICAgICBzZXRBdHRhY2htZW50cyhfY2FsbCk7Ci0gdHJ5IHsgICAgICAgIGphdmEubGFuZy5PYmplY3QgX3Jlc3AgPSBfY2FsbC5pbnZva2UobmV3IGphdmEubGFuZy5PYmplY3RbXSB7bmV3IGphdmEubGFuZy5GbG9hdChjZWxzaXVzKX0pOwotCi0gICAgICAgIGlmIChfcmVzcCBpbnN0YW5jZW9mIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgdGhyb3cgKGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbilfcmVzcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGV4dHJhY3RBdHRhY2htZW50cyhfY2FsbCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKGphdmEubGFuZy5GbG9hdCkgX3Jlc3ApLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gX2V4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKGphdmEubGFuZy5GbG9hdCkgb3JnLmFwYWNoZS5heGlzLnV0aWxzLkphdmFVdGlscy5jb252ZXJ0KF9yZXNwLCBmbG9hdC5jbGFzcykpLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICB9IGNhdGNoIChvcmcuYXBhY2hlLmF4aXMuQXhpc0ZhdWx0IGF4aXNGYXVsdEV4Y2VwdGlvbikgewotICB0aHJvdyBheGlzRmF1bHRFeGNlcHRpb247Ci19Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGZhcmVuaGVpdFRvQ2Vsc2l1cyhmbG9hdCBmYXJlbmhlaXQpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gewotICAgICAgICBpZiAoc3VwZXIuY2FjaGVkRW5kcG9pbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpcy5Ob0VuZFBvaW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzLmNsaWVudC5DYWxsIF9jYWxsID0gY3JlYXRlQ2FsbCgpOwotICAgICAgICBfY2FsbC5zZXRPcGVyYXRpb24oX29wZXJhdGlvbnNbMV0pOwotICAgICAgICBfY2FsbC5zZXRVc2VTT0FQQWN0aW9uKHRydWUpOwotICAgICAgICBfY2FsbC5zZXRTT0FQQWN0aW9uVVJJKCIiKTsKLSAgICAgICAgX2NhbGwuc2V0RW5jb2RpbmdTdHlsZShudWxsKTsKLSAgICAgICAgX2NhbGwuc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzLmNsaWVudC5DYWxsLlNFTkRfVFlQRV9BVFRSLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgX2NhbGwuc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzLkF4aXNFbmdpbmUuUFJPUF9ET01VTFRJUkVGUywgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgIF9jYWxsLnNldFNPQVBWZXJzaW9uKG9yZy5hcGFjaGUuYXhpcy5zb2FwLlNPQVBDb25zdGFudHMuU09BUDExX0NPTlNUQU5UUyk7Ci0gICAgICAgIF9jYWxsLnNldE9wZXJhdGlvbk5hbWUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93dHAiLCAiZmFyZW5oZWl0VG9DZWxzaXVzIikpOwotCi0gICAgICAgIHNldFJlcXVlc3RIZWFkZXJzKF9jYWxsKTsKLSAgICAgICAgc2V0QXR0YWNobWVudHMoX2NhbGwpOwotIHRyeSB7ICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IF9yZXNwID0gX2NhbGwuaW52b2tlKG5ldyBqYXZhLmxhbmcuT2JqZWN0W10ge25ldyBqYXZhLmxhbmcuRmxvYXQoZmFyZW5oZWl0KX0pOwotCi0gICAgICAgIGlmIChfcmVzcCBpbnN0YW5jZW9mIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgdGhyb3cgKGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbilfcmVzcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGV4dHJhY3RBdHRhY2htZW50cyhfY2FsbCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKGphdmEubGFuZy5GbG9hdCkgX3Jlc3ApLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gX2V4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKGphdmEubGFuZy5GbG9hdCkgb3JnLmFwYWNoZS5heGlzLnV0aWxzLkphdmFVdGlscy5jb252ZXJ0KF9yZXNwLCBmbG9hdC5jbGFzcykpLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICB9IGNhdGNoIChvcmcuYXBhY2hlLmF4aXMuQXhpc0ZhdWx0IGF4aXNGYXVsdEV4Y2VwdGlvbikgewotICB0aHJvdyBheGlzRmF1bHRFeGNlcHRpb247Ci19Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlZjZjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDYwNDI0ICAgMTM4MDYwIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPUpTVCBXZWIgU2VydmljZXMgQXhpcyBDb25zdW1wdGlvbiBDb3JlIFRlc3QKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3Rlc3RzL3VuaXR0ZXN0L0xvY2F0b3JUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3Rlc3RzL3VuaXR0ZXN0L0xvY2F0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdhNjBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vY29yZS90ZXN0cy91bml0dGVzdC9Mb2NhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMzE3ICAgMTI3NDU2IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKiAyMDA2MDcxMSAgIDE0Nzg2MiBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleQotICogMjAwNjA3MTEgICAxNDc4NjQgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMudW5pdHRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy51dGlsLkphdmFGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy51dGlsLlN0ZG91dFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSmF2YUNsaWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyLldlYlNlcnZpY2VGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci0KLXB1YmxpYyBjbGFzcyBMb2NhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSAoKQotCXsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYXRvclRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X0F4aXNDbGllbnRMb2NhdG9yICgpCi0JewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJFR0lOIHRlc3RfQXhpc0NsaWVudExvY2F0b3IiKTsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZ1tdIHByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbXSB7IkphdmExIiwiSmF2YTIiLCJKYXZhMyJ9OwotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0TmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IHg9MDsgeDxwcm9qZWN0TmFtZXMubGVuZ3RoOyB4KyspCi0JCQl7Ci0JCQkJcHJvamVjdHNbeF0gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWVzW3hdKTsKLQkJCX0KLQkJCVV0aWwuaW5pdCgpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gVXRpbC5jcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0TmFtZXNbaV0pOwotCQkJCQlVdGlsLmFkZFJlcXVpcmVkSmFyc1RvSmF2YVByb2plY3QoamF2YVByb2plY3QpOwotCQkJCQlVdGlsLmNvcHlFeGFtcGxlc1RvSmF2YVByb2plY3QoamF2YVByb2plY3QsbmV3IEphdmFGaWx0ZXIoKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSB0KQotCQkJewotCQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJZmFpbCgiRmFpbGVkIHRvIGFjY2VzcyBvciBjcmVhdGUgcHJlcmVxdWlzaXRlIHByb2plY3RzIik7Ci0JCQl9Ci0JCQlXZWJTZXJ2aWNlRmluZGVyIGZpbmRlciA9IFdlYlNlcnZpY2VGaW5kZXIuaW5zdGFuY2UoKTsKLQkJCVN0cmluZ1tdIGNhdGVnb3J5SWRzID0gZmluZGVyLmdldFdlYlNlcnZpY2VDYXRlZ29yeUlkcygpOwotCQkJaW50IG4gPSAtMTsKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBTdGRvdXRQcm9ncmVzc01vbml0b3IoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjYXRlZ29yeUlkcy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGVnb3J5IElEID0gWyIrY2F0ZWdvcnlJZHNbaV0rIl0iKTsKLQkJCQlpZiAoY2F0ZWdvcnlJZHNbaV0uZXF1YWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmxvY2F0b3IuY2F0ZWdvcnkuYXhpcyIpKQotCQkJCXsKLQkJCQkJbiA9IGk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBmaW5kZXIuZ2V0V2ViU2VydmljZUNsaWVudHNCeUNhdGVnb3J5SWQoY2F0ZWdvcnlJZHNbaV0sbW9uaXRvcik7Ci0JCQkJCWFzc2VydEZvdW5kQ2xpZW50cyhpdGVyLDYpOwotCQkJCQlpdGVyID0gZmluZGVyLmdldFdlYlNlcnZpY2VDbGllbnRzQnlDYXRlZ29yeUlkKGNhdGVnb3J5SWRzW2ldLHByb2plY3RzLG1vbml0b3IpOwotCQkJCQlhc3NlcnRGb3VuZENsaWVudHMoaXRlciw2KTsKLQkJCQkJaXRlciA9IGZpbmRlci5nZXRXZWJTZXJ2aWNlQ2xpZW50c0J5Q2F0ZWdvcnlJZChjYXRlZ29yeUlkc1tpXSxuZXcgSVByb2plY3RbXSB7cHJvamVjdHNbMF19LG1vbml0b3IpOwotCQkJCQlhc3NlcnRGb3VuZENsaWVudHMoaXRlciwyKTsKLQkJCQkJaXRlciA9IGZpbmRlci5nZXRXZWJTZXJ2aWNlQ2xpZW50c0J5Q2F0ZWdvcnlJZChjYXRlZ29yeUlkc1tpXSxuZXcgSVByb2plY3RbXSB7cHJvamVjdHNbMV0scHJvamVjdHNbMl19LG1vbml0b3IpOwotCQkJCQlhc3NlcnRGb3VuZENsaWVudHMoaXRlciw0KTsKLQkJCQkJSVByb2plY3Qgbm9TdWNoUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgibm9TdWNoUHJvamVjdCIpOwotCQkJCQlpdGVyID0gZmluZGVyLmdldFdlYlNlcnZpY2VDbGllbnRzQnlDYXRlZ29yeUlkKGNhdGVnb3J5SWRzW2ldLG5ldyBJUHJvamVjdFtdIHtub1N1Y2hQcm9qZWN0fSxtb25pdG9yKTsKLQkJCQkJYXNzZXJ0Rm91bmRDbGllbnRzKGl0ZXIsMCk7Ci0JCQkJfQotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiQXhpcyBsb2NhdG9yIGV4dGVuc2lvbiBtaXNzaW5nLiIsbiA+PSAwKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRU5ERUQgdGVzdF9BeGlzQ2xpZW50TG9jYXRvciIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhc3NlcnRGb3VuZENsaWVudHMgKCBJdGVyYXRvciBpdGVyLCBpbnQgeCApCi0JewotCQlpbnQgcCA9IDA7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkKLQkJewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJYXNzZXJ0VHJ1ZSgiRmluZGVyIHJldHVybmVkIGEgIitvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIiBpbnN0ZWFkIG9mIGEgV2ViU2VydmljZUNsaWVudEluZm8uIixvYmogaW5zdGFuY2VvZiBXZWJTZXJ2aWNlQ2xpZW50SW5mbyk7Ci0JCQlwKys7Ci0JCQlXZWJTZXJ2aWNlQ2xpZW50SW5mbyB3c2NJbmZvID0gKFdlYlNlcnZpY2VDbGllbnRJbmZvKW9iajsKLQkJCVN0cmluZyBwcm94eUNsYXNzVVJMID0gd3NjSW5mby5nZXRJbXBsVVJMKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF4aXMgY2xpZW50IHByb3h5IGNsYXNzID0gWyIrcHJveHlDbGFzc1VSTCsiXSIpOwotCQkJaWYgKHdzY0luZm8gaW5zdGFuY2VvZiBXZWJTZXJ2aWNlSmF2YUNsaWVudEluZm8pCi0JCQl7Ci0JCQkJV2ViU2VydmljZUphdmFDbGllbnRJbmZvIHdzY0pJbmZvID0gKFdlYlNlcnZpY2VKYXZhQ2xpZW50SW5mbyl3c2NJbmZvOwotCQkJCWFzc2VydE5vdE51bGwoIkZvdW5kIGFuIHVuZXhwZWN0ZWQgbnVsbCBJVHlwZSIsd3NjSkluZm8uZ2V0VHlwZSgpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF4aXMgY2xpZW50IHByb3h5IElUeXBlID0gWyIrd3NjSkluZm8uZ2V0VHlwZSgpKyJdIik7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiRm91bmQgIitwKyIgcHJveGllcyBpbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCAiK3grIi4iLHAgPT0geCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3Rlc3RzL3V0aWwvRmlsdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvdGVzdHMvdXRpbC9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2YzA0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvdGVzdHMvdXRpbC9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA3MTEgICAxNDc4NjIgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqIDIwMDYwNzExICAgMTQ3ODY0IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRmlsdGVyCi17Ci0JcHVibGljIGJvb2xlYW4gYWNjZXB0ICggT2JqZWN0IG9iamVjdCApOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3Rlc3RzL3V0aWwvSmF2YUZpbHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3Rlc3RzL3V0aWwvSmF2YUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzYyMDZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vY29yZS90ZXN0cy91dGlsL0phdmFGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA3MTEgICAxNDc4NjIgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqIDIwMDYwNzExICAgMTQ3ODY0IGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdCAoIE9iamVjdCBvYmplY3QgKQotCXsKLQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpLmVuZHNXaXRoKCIuamF2YSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3Rlc3RzL3V0aWwvU3Rkb3V0UHJvZ3Jlc3NNb25pdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvdGVzdHMvdXRpbC9TdGRvdXRQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4OGIxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvdGVzdHMvdXRpbC9TdGRvdXRQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTcgICAxMjc0NTYgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotCi1wdWJsaWMgY2xhc3MgU3Rkb3V0UHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgTnVsbFByb2dyZXNzTW9uaXRvcgotewotCi0JcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKQotCXsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbUHJvZ3Jlc3NdICIrbmFtZSsiLCAiK3RvdGFsV29yaysiIHVuaXQocykgcmVtYWluaW5nKS4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb25lKCkKLQl7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiW1Byb2dyZXNzXSBEb25lLiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbUHJvZ3Jlc3NdICIrbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkKLQl7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiW1Byb2dyZXNzXSAiK25hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykKLQl7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiW1Byb2dyZXNzXSAiK3dvcmsrIiB1bml0KHMpIGNvbXBsZXRlZC4iKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvdGVzdHMvdXRpbC9VdGlsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvdGVzdHMvdXRpbC9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTAyNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3Rlc3RzL3V0aWwvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTcgICAxMjc0NTYgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqIDIwMDYwNzExICAgMTQ3ODYyIGNicmVhbGV5QGNhLmlibS5jb20gLSBDaHJpcyBCcmVhbGV5Ci0gKiAyMDA2MDcxMSAgIDE0Nzg2NCBjYnJlYWxleUBjYS5pYm0uY29tIC0gQ2hyaXMgQnJlYWxleQotICogMjAwNjEyMTEgICAxNjIyODggbWFrYW5kcmVAY2EuaWJtLmNvbSAtIEFuZHJldyBNYWssIHdvcmtzcGFjZSBwYXRocyB3aXRoIHNwYWNlcyBicmVhayBKYXZhIEVkaXRvciBMYXVuY2gKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUVuY29kZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFV0aWwKLXsKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHRlc3RzdWl0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCAoKQotCXsKLQkJU3RyaW5nIHdvcmtzcGFjZU9TUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIldvcmtzcGFjZSA9IFsiK3dvcmtzcGFjZU9TUGF0aCsiXSIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBKYXZhIHByb2plY3QgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIGNyZWF0ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhlIHByb2plY3QgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgY3JlYXRlSmF2YVByb2plY3QgKCBTdHJpbmcgbmFtZSApCi0JdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChuYW1lKTsKLQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKQotCQl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIHByb2plY3QgWyIrbmFtZSsiXSIpOwotCQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JICAgICAgICBkZXNjLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nW10ge0phdmFDb3JlLk5BVFVSRV9JRH0pOwotCSAgICAgICAgSUNvbW1hbmQgY21kID0gZGVzYy5uZXdDb21tYW5kKCk7Ci0JICAgICAgICBjbWQuc2V0QnVpbGRlck5hbWUoSmF2YUNvcmUuQlVJTERFUl9JRCk7Ci0JICAgICAgICBkZXNjLnNldEJ1aWxkU3BlYyhuZXcgSUNvbW1hbmRbXSB7Y21kfSk7Ci0JICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsbnVsbCk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBKYXZhIHByb2plY3QgWyIrbmFtZSsiXSIpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWphdmFQcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCXJldHVybiBqYXZhUHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBBeGlzIGphcnMgYW5kIHRoZSBKUkUgdG8gdGhlIGNsYXNzcGF0aCBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiBAcGFyYW0gamF2YVByb2plY3QgVGhlIHByb2plY3QgdG8gYWRkIGF4aXMuamFyIHRvLgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIElmIHRoZSBqYXIgY291bGQgbm90IGJlIGFkZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZXF1aXJlZEphcnNUb0phdmFQcm9qZWN0ICggSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ICkKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJLy8gR2V0IHRoZSBjdXJyZW50IGNsYXNzcGF0aCBhcyBhIGxpc3QuCi0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdChqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChjbGFzc3BhdGgpKTsKLQkJCi0JCS8vIEFkZCB0aGUgSlJFIHRvIHRoZSBsaXN0LgotCQlJQ2xhc3NwYXRoRW50cnkgY29uID0gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoIm9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIpKTsKLQkJbGlzdC5hZGQoY29uKTsKLQkJCi0JCS8vIEFkZCB0aGUgQXhpcyBqYXJzIHRvIHRoZSBsaXN0LgotCQlTdHJpbmdbXSBqYXJzID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkib3JnLmFwYWNoZS5heGlzIiwiYXhpcy5qYXIiLAotCQkJCSJvcmcuYXBhY2hlLmF4aXMiLCJjb21tb25zLWRpc2NvdmVyeS0wLjIuamFyIiwKLQkJCQkib3JnLmFwYWNoZS5jb21tb25zX2xvZ2dpbmciLCJjb21tb25zLWxvZ2dpbmctMS4wLjQuamFyIiwKLQkJCQkib3JnLmFwYWNoZS5heGlzIiwiamF4cnBjLmphciIsCi0JCQkJIm9yZy5hcGFjaGUuamFrYXJ0YV9sb2c0aiIsImxvZzRqLTEuMi44LmphciIsCi0JCQkJIm9yZy5hcGFjaGUuYXhpcyIsInNhYWouamFyIiwKLQkJCQkib3JnLmFwYWNoZS5heGlzIiwid3NkbDRqLTEuNS4xLmphciIKLQkJfTsKLQkJCi0JCWZvciAoaW50IGk9MDsgaTxqYXJzLmxlbmd0aDsgaSs9MikKLQkJewotCQkJSVBhdGggamFyID0gZ2V0QXhpc1BsdWdpbkphclBhdGgoamFyc1tpXSxqYXJzW2krMV0pOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgamFyIFsiK2phci50b1N0cmluZygpKyJdIik7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgamFyRW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoamFyLG51bGwsbnVsbCk7Ci0JCQlsaXN0LmFkZChqYXJFbnRyeSk7Ci0JCX0KLQkJCi0JCS8vIFVwZGF0ZSB0aGUgY3VycmVudCBjbGFzc3BhdGggZnJvbSB0aGUgbGlzdC4KLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gKElDbGFzc3BhdGhFbnRyeVtdKWxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5WzBdKTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCxudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZXN5c3RlbSBwYXRoIHRvIHRoZSBuYW1lZCBqYXIgaW4gdGhlIEF4aXMgcGx1Z2luLgotCSAqIEByZXR1cm4gVGhlIGZpbGVzeXN0ZW0gcGF0aCB0byB0aGUgbmFtZWQgamFyIGluIHRoZSBBeGlzIHBsdWdpbi4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhlIHBhdGggY291bGQgbm90IGJlIGNvbXB1dGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0QXhpc1BsdWdpbkphclBhdGggKCBTdHJpbmcgcGx1Z2luTmFtZSwgU3RyaW5nIGphck5hbWUgKQotCXRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbk5hbWUpOwotCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwiIiwwLCJVbmFibGUgdG8gbG9jYXRlIHBsdWdpbiBvcmcuYXBhY2hlLmF4aXMiLG51bGwpKTsKLQkJfQotCQlVUkwgYXhpc1VSTCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLG5ldyBQYXRoKCJsaWIvIitqYXJOYW1lKSxudWxsKTsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCBsb2NhbEF4aXNVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoYXhpc1VSTCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJJKFVSSUVuY29kZXIuZW5jb2RlKGxvY2FsQXhpc1VSTC50b1N0cmluZygpLCAiVVRGLTgiKSkpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGZpbGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIiIsMCwiVW5hYmxlIHRvIGVuY29kZSBqYXIgcGF0aCBmb3IgcGx1Z2luIG9yZy5hcGFjaGUuYXhpcyIsdWVlKSk7CQkJCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCIiLDAsIlVuYWJsZSB0byBsb2NhdGUgcGx1Z2luIG9yZy5hcGFjaGUuYXhpcyIsaW9lKSk7Ci0JCX0KLQkJY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1c2UpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwiIiwwLCJVbmFibGUgdG8gbG9jYXRlIHBsdWdpbiBvcmcuYXBhY2hlLmF4aXMiLHVzZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyBleGFtcGxlcyB0byB0aGUgZ2l2ZW4gSmF2YSBwcm9qZWN0LgotCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBUaGUgcHJvamVjdCB0byBjb3B5IHRoZSBleGFtcGxlcyB0by4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weUV4YW1wbGVzVG9KYXZhUHJvamVjdCAoIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgRmlsdGVyIGZpbHRlciApCi0JdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCVN0cmluZyBzb3VyY2VQYXRoID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCWNvcHlFeGFtcGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzIiwiZGF0YS9heGlzU291cmNlMSIsc291cmNlUGF0aCxmaWx0ZXIpOwotCQljb3B5RXhhbXBsZSgib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cyIsImRhdGEvYXhpc1NvdXJjZTIiLHNvdXJjZVBhdGgsZmlsdGVyKTsKLQkJcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsbnVsbCk7Ci0JCXRyeQotCQl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhaXRpbmcgZm9yIGJ1aWxkIHRvIGNvbXBsZXRlIik7Ci0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSB0KQotCQl7Ci0JCQkvL0RvIG5vdGhpbmcuCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVjdXJzaXZlbHkgY29waWVzIGZpbGVzIGZyb20gYSBwbHVnaW4gdG8gdGhlIHdvcmtzcGFjZS4KLQkgKiBAcGFyYW0gc291cmNlUGx1Z2luIFRoZSBwbHVnaW4gdG8gY29weSBmcm9tLgotCSAqIEBwYXJhbSBzb3VyY2VSb290IFRoZSBwbHVnaW4tcmVsYXRlZCBwYXRoIHRvIGNvcHkgZnJvbS4KLQkgKiBAcGFyYW0gdGFyZ2V0V29ya3NwYWNlUGF0aCBUaGUgd29ya3NwYWNlIHBhdGggdG8gY29weSB0by4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weUV4YW1wbGUgKCBTdHJpbmcgc291cmNlUGx1Z2luLCBTdHJpbmcgc291cmNlUm9vdCwgU3RyaW5nIHRhcmdldFdvcmtzcGFjZVBhdGgsIEZpbHRlciBmaWx0ZXIgKQotCXRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHNvdXJjZVBsdWdpbik7Ci0JCWlmIChidW5kbGUgPT0gbnVsbCkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCIiLDAsIlVuYWJsZSB0byBsb2NhdGUgcGx1Z2luICIrc291cmNlUGx1Z2luLG51bGwpKTsKLQkJfQotCQlFbnVtZXJhdGlvbiBlID0gYnVuZGxlLmdldEVudHJ5UGF0aHMoc291cmNlUm9vdCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotCQl7Ci0JCQlTdHJpbmcgcGF0aCA9IGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdW5kbGUgcGF0aCA9IFsiK3BhdGgrIl0iKTsKLQkJCWNvcHlFeGFtcGxlRmlsZShidW5kbGUscGF0aCxuZXcgUGF0aChzb3VyY2VSb290KS5zZWdtZW50Q291bnQoKSx0YXJnZXRXb3Jrc3BhY2VQYXRoLGZpbHRlcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlFeGFtcGxlRmlsZSAoIEJ1bmRsZSBidW5kbGUsIFN0cmluZyBwYXRoLCBpbnQgb2Zmc2V0LCBTdHJpbmcgdGFyZ2V0V29ya3NwYWNlUGF0aCwgRmlsdGVyIGZpbHRlciApCi0JdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlQYXRoIHJlZHVjZWRQYXRoID0gbmV3IFBhdGgocGF0aCkucmVtb3ZlRmlyc3RTZWdtZW50cyhvZmZzZXQpOwotCQlJUGF0aCB0YXJnZXRQYXRoID0gbmV3IFBhdGgodGFyZ2V0V29ya3NwYWNlUGF0aCkuYXBwZW5kKHJlZHVjZWRQYXRoKTsKLQkJaWYgKHBhdGguZW5kc1dpdGgoIi8iKSkKLQkJewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb2xkZXIgPSBbIitwYXRoKyJdIFRhcmdldCA9IFsiK3RhcmdldFBhdGgrIl0iKTsKLQkJCUlGb2xkZXIgZm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIodGFyZ2V0UGF0aCk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkKLQkJCXsKLQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxudWxsKTsKLQkJCX0KLQkJCUVudW1lcmF0aW9uIGUgPSBidW5kbGUuZ2V0RW50cnlQYXRocyhwYXRoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotCQkJewotCQkJCVN0cmluZyBzdWJwYXRoID0gZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJY29weUV4YW1wbGVGaWxlKGJ1bmRsZSxzdWJwYXRoLG9mZnNldCx0YXJnZXRXb3Jrc3BhY2VQYXRoLGZpbHRlcik7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgPSBbIitwYXRoKyJdIFRhcmdldCA9IFsiK3RhcmdldFBhdGgrIl0iKTsKLQkJCWlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQotCQkJewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29waWVkIFsiK3BhdGgrIl0iKTsKLQkJCQlVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KHBhdGgpOwotCQkJCWNvcHlGaWxlKHVybCx0YXJnZXRQYXRoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGUgKCBVUkwgdXJsLCBJUGF0aCB0YXJnZXRQYXRoICkKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh0YXJnZXRQYXRoKTsKLQkJdHJ5Ci0JCXsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQlmaWxlLmNyZWF0ZShzdHJlYW0sdHJ1ZSxudWxsKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIiIsMCwiSU9FeGNlcHRpb24gY29weWluZyBmaWxlIixpb2UpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzQ4MTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLWF4aXNQZXJmbXNyLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODhlMWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1ZmJkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6MzY6NTEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NjNjZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIEphbiAzMCAxMDo0MDo1NCBFU1QgMjAwNgotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjYTNhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAKLUJ1bmRsZS1DbGFzc1BhdGg6IGF4aXNQZXJmbXNyLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLnBsdWdpbi5QZXJmb3JtYW5jZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLAotIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLCAKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVhNmI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGF4aXNQZXJmbXNyLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyID0gYXhpc1BlcmZtc3IuamFyCi1zb3VyY2UuYXhpc1BlcmZtc3IuamFyID0gc3JjLwotb3V0cHV0LmF4aXNQZXJmbXNyLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkODliYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNjA0MjQgICAxMzgwNjAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9SlNUIFdlYiBTZXJ2aWNlcyBQZXJmb3JtYW5jZSBQbHVnLWluCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjY1ZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL2F4aXMvdG9tY2F0L3Y1MC9wZXJmbXNyL1BlcmZtc3JCVUphdmFBeGlzVEM1MC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL3BlcmZtc3IvUGVyZm1zckJVSmF2YUF4aXNUQzUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTM0MGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL3BlcmZtc3IvUGVyZm1zckJVSmF2YUF4aXNUQzUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAuV1NXaXphcmRUb21jYXQ1MFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLnV0aWwuUGVyZm9ybWFuY2VKVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdC5XU0pVbml0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuU2NlbmFyaW9Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlTWV0ZXI7Ci0KLS8qKgotICogQm90dG9tIHVwIHBlcmZvcm1hbmNlIHNjZW5hcmlvIHdpdGggQXhpcyBhbmQgVG9tY2F0IHY1LjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBlcmZtc3JCVUphdmFBeGlzVEM1MCBleHRlbmRzIFdTV2l6YXJkVG9tY2F0NTBUZXN0IHsKLQkvLyBDb25zdGFudHMKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBXU19SVU5USU1FSURfQVhJUyA9ICBXU0pVbml0Q29uc3RhbnRzLldTX1JVTlRJTUVJRF9BWElTOyAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSBXU0pVbml0Q29uc3RhbnRzLkJVX1BST0pFQ1RfTkFNRTsKLSAgICAKLQlwcml2YXRlIElGaWxlIHNvdXJjZUZpbGVfOwotCQotICAvKioKLSAgICogU2V0cyB1cCB0aGUgaW5wdXQgZGF0YTsKLSAgICogLSBjcmVhdGUgcHJvamVjdChzKSwKLSAgICogLSBjb3B5IHJlc291cmNlcyB0byB3b3Jrc3BhY2UgCi0gICAqLwotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQkKLQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotICAgICAgICBJUGF0aCBkZXN0UGF0aCA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKHdlYlByb2plY3QpOwotICAgICAgICBJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGRlc3RQYXRoKTsJCQotCQlKVW5pdFV0aWxzLmNvcHlUZXN0RGF0YSgiQlVKYXZhL3NyYyIsZm9sZGVyLGVudl8sIG51bGwpOwotCQlzb3VyY2VGaWxlXyA9IGZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKCJmb28vRWNoby5qYXZhIikpOwotCQkvLyBFbnN1cmUgdGhhdCBFY2hvLmNsYXNzIGlzIGJ1aWx0IGluOgotCQkvLyA8V2ViIFByb2plY3Q+L1dlYkNvbnRlbnQvV0VCLUlORi9jbGFzc2VzL2Zvby9FY2hvLmNsYXNzCi0JCUpVbml0VXRpbHMuc3luY0J1aWxkUHJvamVjdCh3ZWJQcm9qZWN0LGVudl8sIG51bGwpOwotCQkvL2Fzc2VydFRydWUoSlVuaXRVdGlscy5nZXRDbGFzc2VzRm9sZGVyRm9yV2ViUHJvamVjdChXRUJfUFJPSkVDVF9OQU1FKS5nZXRGaWxlKG5ldyBQYXRoKCJmb28vRWNoby5jbGFzcyIpKS5leGlzdHMoKSk7Ci0JCQotCQkKLQl9Ci0JCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0gICAgICAgIGlmICh3ZWJQcm9qZWN0PT1udWxsIHx8ICF3ZWJQcm9qZWN0LmV4aXN0cygpKXsKLSAgICAgICAgICBjcmVhdGVXZWJNb2R1bGUoUFJPSkVDVF9OQU1FLCBQUk9KRUNUX05BTUUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWJNb2R1bGUoU3RyaW5nIHByb2plY3RObSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIGludCBqMmVlVmVyc2lvbil7Ci0KLSAgICAgICAgQ3JlYXRlTW9kdWxlQ29tbWFuZCBjbWMgPSBuZXcgQ3JlYXRlTW9kdWxlQ29tbWFuZCgpOwotICAgICAgICBjbWMuc2V0SjJlZUxldmVsKG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uKS50b1N0cmluZygpKTsKLSAgICAgICAgY21jLnNldE1vZHVsZU5hbWUoY29tcG9uZW50TmFtZSk7Ci0gICAgICAgIGNtYy5zZXRNb2R1bGVUeXBlKENyZWF0ZU1vZHVsZUNvbW1hbmQuV0VCKTsKLSAgICAgICAgY21jLnNldFByb2plY3ROYW1lKHByb2plY3RObSk7Ci0gICAgICAgIGNtYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoU0VSVkVSVFlQRUlEX1RDNTApOwotICAgICAgICBjbWMuc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJfLmdldElkKCkpOwotICAgICAgICBjbWMuZXhlY3V0ZShudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgY3JlYXRpbmcgV2ViIFByb2plY3QsICIrcHJvamVjdE5tKTsgICAgICAKLSAgICAgICAKLSAgICAgIH0KLQkKLQkKLSAgLyoqCi0gICAqIFNldCB0aGUgcGVyc2lzdGVudCBzZXJ2ZXIgcnVudGltZSBjb250ZXh0IHByZWZlcmVuY2VzCi0gICAqLyAgCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEoyRUVXU1J1bnRpbWVTZXJ2ZXJEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCS8vIFNldCBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciBBeGlzIGFuZCBUb21jYXQgNS4wCi0JCUpVbml0VXRpbHMuc2V0V1NSdW50aW1lU2VydmVyKFdTX1JVTlRJTUVJRF9BWElTLCBTRVJWRVJUWVBFSURfVEM1MCk7CQkKLQl9Ci0JCi0gIC8qKgotICAgKiBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0gICAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRJbml0aWFsU2VsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaW5pdGlhbFNlbGVjdGlvbl8gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3VyY2VGaWxlXyk7Ci0JfQotCQotICAvKioKLSAgICogTGF1bmNoZXMgdGhlIHBvcC11cCBjb21tYW5kIHRvIGluaXRpYXRlIHRoZSBzY2VuYXJpbwotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8gIAotCXB1YmxpYyB2b2lkIHRlc3RCVUphdmFBeGlzVEM1MCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCSAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JICAgIEpVbml0VXRpbHMuZGlzYWJsZVdTSURpYWxvZyh3ZWJQcm9qZWN0KTsKLQotCSAgICBQZXJmb3JtYW5jZSBwZXJmPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JICAgIFBlcmZvcm1hbmNlTWV0ZXIgcGVyZm9ybWFuY2VNZXRlcj0gcGVyZi5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmYuZ2V0RGVmYXVsdFNjZW5hcmlvSWQodGhpcykpOwkgICAgCi0JICAgIHRyeSB7Ci0gICAgCi0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5zdGFydCgpOwotCSAgICAgIFBlcmZvcm1hbmNlSlVuaXRVdGlscy5sYXVuY2hDcmVhdGlvbldpemFyZChTY2VuYXJpb0NvbnN0YW50cy5XSVpBUkRJRF9CT1RUT01fVVAsU2NlbmFyaW9Db25zdGFudHMuT0JKRUNUX0NMQVNTX0lEX0lGSUxFLGluaXRpYWxTZWxlY3Rpb25fKTsKLQkgICAgICBwZXJmb3JtYW5jZU1ldGVyLnN0b3AoKTsKLQotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuY29tbWl0KCk7Ci0JICAgICAgcGVyZi5hc3NlcnRQZXJmb3JtYW5jZShwZXJmb3JtYW5jZU1ldGVyKTsKLQkgICAgfQotCSAgICBmaW5hbGx5IHsKLQkgICAgCWlmIChwZXJmb3JtYW5jZU1ldGVyPT1udWxsKQotCSAgICAJCXBlcmZvcm1hbmNlTWV0ZXIuZGlzcG9zZSgpOwotCSAJfQotCQkKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5PSykKLQkJICB2ZXJpZnlPdXRwdXQoKTsKLQkJZWxzZQotCQkgIHRocm93IG5ldyBFeGNlcHRpb24oc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJCi0JfQotCQotICAvKioKLSAgICogVmVyaWZ5IHRoZSBzY2VuYXJpbyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotCXByaXZhdGUgZmluYWwgdm9pZCB2ZXJpZnlPdXRwdXQoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotICAgICAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7ICAgIAotCQlJRm9sZGVyIHdlYkNvbnRlbnRGb2xkZXIgPSAoSUZvbGRlcilKMkVFVXRpbHMuZ2V0V2ViQ29udGVudENvbnRhaW5lcih3ZWJQcm9qZWN0KTsKLSAgICAKLSAgICAgICAgSUZvbGRlciB3c2RsRm9sZGVyID0gd2ViQ29udGVudEZvbGRlci5nZXRGb2xkZXIoIndzZGwiKTsKLQkJYXNzZXJ0VHJ1ZSh3c2RsRm9sZGVyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSh3c2RsRm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPiAwKTsKLQkJYXNzZXJ0VHJ1ZSh3ZWJDb250ZW50Rm9sZGVyLmdldEZvbGRlcigid3NkbCIpLm1lbWJlcnMoKS5sZW5ndGggPiAwKTsKLSAgICAKLSAgICAgICAgLy9UT0RPIENoZWNrIGlmIHdzZGQgY29udGFpbnMgbmV3IFdlYiBzZXJ2aWNlCi0gICAgICAgIC8vVE9ETyBDaGVjayBpZiBXZWIgc2VyaXZjZSBjYW4gYmUgaW52b2tlZCBieSBhIGNsaWVudAotCX0KLQkKLSAgLyoqCi0gICAqIENsZWFyIHdvcmtzcGFjZSBpZiBuZWNlc3NhcnkKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJLy8gUmVtb3ZlIHRoZSBFQVIgZnJvbSB0aGUgc2VydmVyLgotCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JCS8vSlVuaXRVdGlscy5yZW1vdmVNb2R1bGVGcm9tU2VydmVyKHNlcnZlcl8sd2ViUHJvamVjdCxlbnZfKTsKLQkJCi0JCS8vIERlbGV0ZSB0aGUgV2ViIHByb2plY3QuCi0JCXdlYlByb2plY3QuZGVsZXRlKHRydWUsdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHdlYlByb2plY3QuZXhpc3RzKCkpOwotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL3BlcmZtc3IvUGVyZm1zckNsaWVudEF4aXNUQzUwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9heGlzL3RvbWNhdC92NTAvcGVyZm1zci9QZXJmbXNyQ2xpZW50QXhpc1RDNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmYWUwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9heGlzL3RvbWNhdC92NTAvcGVyZm1zci9QZXJmbXNyQ2xpZW50QXhpc1RDNTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZU1vZHVsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5XU1dpemFyZFRvbWNhdDUwVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UudXRpbC5QZXJmb3JtYW5jZUpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0LldTSlVuaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5TY2VuYXJpb0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VNZXRlcjsKLQotLyoqCi0gKiBDbGllbnQgcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzIGFuZCBUb21jYXQgdjUuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyZm1zckNsaWVudEF4aXNUQzUwIGV4dGVuZHMgV1NXaXphcmRUb21jYXQ1MFRlc3QgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NfUlVOVElNRUlEX0FYSVMgPSBXU0pVbml0Q29uc3RhbnRzLldTX1JVTlRJTUVJRF9BWElTOwotICAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDTElFTlRfUFJPSkVDVF9OQU1FID0gV1NKVW5pdENvbnN0YW50cy5DTElFTlRfUFJPSkVDVF9OQU1FOwotCQotCXByaXZhdGUgSUZpbGUgc291cmNlRmlsZV87Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0gICAgICAgIGlmICghd2ViUHJvamVjdC5leGlzdHMoKSl7Ci0gICAgICAgICAgY3JlYXRlV2ViTW9kdWxlKENMSUVOVF9QUk9KRUNUX05BTUUsIENMSUVOVF9QUk9KRUNUX05BTUUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWJNb2R1bGUoU3RyaW5nIHByb2plY3RObSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIGludCBqMmVlVmVyc2lvbil7Ci0KLSAgICAgICAgQ3JlYXRlTW9kdWxlQ29tbWFuZCBjbWMgPSBuZXcgQ3JlYXRlTW9kdWxlQ29tbWFuZCgpOwotICAgICAgICBjbWMuc2V0SjJlZUxldmVsKG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uKS50b1N0cmluZygpKTsKLSAgICAgICAgY21jLnNldE1vZHVsZU5hbWUoY29tcG9uZW50TmFtZSk7Ci0gICAgICAgIGNtYy5zZXRNb2R1bGVUeXBlKENyZWF0ZU1vZHVsZUNvbW1hbmQuV0VCKTsKLSAgICAgICAgY21jLnNldFByb2plY3ROYW1lKHByb2plY3RObSk7Ci0gICAgICAgIGNtYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoU0VSVkVSVFlQRUlEX1RDNTApOwotICAgICAgICBjbWMuc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJfLmdldElkKCkpOwotICAgICAgICBjbWMuZXhlY3V0ZShudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgfQotICAgICAgCi0JLyoqCi0gICAqIFNldHMgdXAgdGhlIGlucHV0IGRhdGE7Ci0gICAqIC0gY3JlYXRlIHByb2plY3QocyksCi0gICAqIC0gY29weSByZXNvdXJjZXMgdG8gd29ya3NwYWNlIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0gICAgICAgIElGb2xkZXIgZGVzdEZvbGRlciA9IChJRm9sZGVyKUoyRUVVdGlscy5nZXRXZWJDb250ZW50Q29udGFpbmVyKHdlYlByb2plY3QpOwotICAgICAgICBKVW5pdFV0aWxzLmNvcHlUZXN0RGF0YSgiVERKYXZhIixkZXN0Rm9sZGVyLGVudl8sIG51bGwpOwotCQlzb3VyY2VGaWxlXyA9IGRlc3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiRWNoby53c2RsIikpOwkJCi0JCUpVbml0VXRpbHMuc3luY0J1aWxkUHJvamVjdCh3ZWJQcm9qZWN0LGVudl8sIG51bGwpOwotCQkKLQl9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcGVyc2lzdGVudCBzZXJ2ZXIgcnVudGltZSBjb250ZXh0IHByZWZlcmVuY2VzCi0gICAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRKMkVFV1NSdW50aW1lU2VydmVyRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0IGRlZmF1bHQgcHJlZmVyZW5jZXMgZm9yIEF4aXMgYW5kIFRvbWNhdCA1LjAgICAgCi0JCUpVbml0VXRpbHMuc2V0V1NSdW50aW1lU2VydmVyKFdTX1JVTlRJTUVJRF9BWElTLCBTRVJWRVJUWVBFSURfVEM1MCk7Ci0JfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0gICAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRJbml0aWFsU2VsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluaXRpYWxTZWxlY3Rpb25fID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc291cmNlRmlsZV8pOwotCX0KLQotICAvKioKLSAgICogTGF1bmNoZXMgdGhlIHBvcC11cCBjb21tYW5kIHRvIGluaXRpYXRlIHRoZSBzY2VuYXJpbwotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50QXhpc1RDNTAoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewkKLQkgIAlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JICAJCi0JCUpVbml0VXRpbHMuZW5hYmxlUHJveHlHZW5lcmF0aW9uKHRydWUpOwotCQlKVW5pdFV0aWxzLmVuYWJsZU92ZXJ3cml0ZSh0cnVlKTsKLQkJUGVyZm9ybWFuY2UgcGVyZj0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlQZXJmb3JtYW5jZU1ldGVyIHBlcmZvcm1hbmNlTWV0ZXI9IHBlcmYuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihwZXJmLmdldERlZmF1bHRTY2VuYXJpb0lkKHRoaXMpKTsJICAgIAotCSAgICB0cnkgewotICAgIAotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuc3RhcnQoKTsKLQkgICAgICBQZXJmb3JtYW5jZUpVbml0VXRpbHMubGF1bmNoQ3JlYXRpb25XaXphcmQoU2NlbmFyaW9Db25zdGFudHMuV0laQVJESURfQ0xJRU5ULFNjZW5hcmlvQ29uc3RhbnRzLk9CSkVDVF9DTEFTU19JRF9JRklMRSxpbml0aWFsU2VsZWN0aW9uXyk7Ci0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5zdG9wKCk7Ci0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5jb21taXQoKTsKLQkgICAgICBwZXJmLmFzc2VydFBlcmZvcm1hbmNlKHBlcmZvcm1hbmNlTWV0ZXIpOwotCSAgICB9Ci0JICAgIGZpbmFsbHkgewotCSAgICAJaWYgKHBlcmZvcm1hbmNlTWV0ZXI9PW51bGwpCi0JICAgIAkJcGVyZm9ybWFuY2VNZXRlci5kaXNwb3NlKCk7Ci0JIAl9Ci0JICAgIAotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLk9LKSB7Ci0JCSAgdmVyaWZ5T3V0cHV0KCk7Ci0JCX0gZWxzZSB7Ci0JCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0KLQl9Ci0JCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIHNjZW5hcmlvIGNvbXBsZXRlZCBzdWNjZXNmdWxseQotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgdmVyaWZ5T3V0cHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0gICAgCi0gICAgICAgIElQYXRoIGRlc3RQYXRoID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhU291cmNlTG9jYXRpb24od2ViUHJvamVjdCk7Ci0gICAgICAgIElGb2xkZXIgc3JjRm9sZGVyID0gKElGb2xkZXIpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoZGVzdFBhdGgpOwotICAgIAotCQkvL0lGb2xkZXIgc3JjRm9sZGVyID0gSlVuaXRVdGlscy5nZXRTb3VyY2VGb2xkZXJGb3JXZWJQcm9qZWN0KENMSUVOVF9QUk9KRUNUX05BTUUpOwotCQlJRm9sZGVyIGZvbGRlciA9IHNyY0ZvbGRlci5nZXRGb2xkZXIoImZvbyIpOwotCQlhc3NlcnRUcnVlKGZvbGRlci5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoZm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPiAwKTsKLQkJCi0JCS8vVE9ETyBDaGVjayB0aGF0IHRoZSBjbGllbnQgcnVucyAgICAKLQotCX0KLQkKLSAgLyoqCi0gICAqIFJlbW92ZSB3b3Jrc3BhY2UgaWYgbmVjZXNzYXJ5Ci0gICAqLwotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUlucHV0RGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIERlbGV0ZSB0aGUgV2ViIHByb2plY3QuCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0JCXdlYlByb2plY3QuZGVsZXRlKHRydWUsdHJ1ZSwgbnVsbCk7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL3BlcmZtc3IvUGVyZm1zclRESmF2YUF4aXNUQzUwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9heGlzL3RvbWNhdC92NTAvcGVyZm1zci9QZXJmbXNyVERKYXZhQXhpc1RDNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiZjMyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9heGlzL3RvbWNhdC92NTAvcGVyZm1zci9QZXJmbXNyVERKYXZhQXhpc1RDNTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAuV1NXaXphcmRUb21jYXQ1MFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLnV0aWwuUGVyZm9ybWFuY2VKVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdC5XU0pVbml0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuU2NlbmFyaW9Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlTWV0ZXI7Ci0KLS8qKgotICogVG9wIGRvd24gcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzIGFuZCBUb21jYXQgdjUuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyZm1zclRESmF2YUF4aXNUQzUwIGV4dGVuZHMgV1NXaXphcmRUb21jYXQ1MFRlc3QgewotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFdTX1JVTlRJTUVJRF9BWElTID0gV1NKVW5pdENvbnN0YW50cy5XU19SVU5USU1FSURfQVhJUzsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9IFdTSlVuaXRDb25zdGFudHMuVERfUFJPSkVDVF9OQU1FOwotICAKLSAgcHJpdmF0ZSBJRmlsZSBzb3VyY2VGaWxlXzsKLQkKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uewotCSAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JICAgIGlmICghd2ViUHJvamVjdC5leGlzdHMoKSl7Ci0JICAgICAgY3JlYXRlV2ViTW9kdWxlKFBST0pFQ1RfTkFNRSwgUFJPSkVDVF9OQU1FLEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkgICAgfQotCSAgfQotCSAgCi0JICBwcml2YXRlIHZvaWQgY3JlYXRlV2ViTW9kdWxlKFN0cmluZyBwcm9qZWN0Tm0sIFN0cmluZyBjb21wb25lbnROYW1lLCBpbnQgajJlZVZlcnNpb24pewotCi0JICAgIENyZWF0ZU1vZHVsZUNvbW1hbmQgY21jID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLQkgICAgY21jLnNldEoyZWVMZXZlbChuZXcgSW50ZWdlcihqMmVlVmVyc2lvbikudG9TdHJpbmcoKSk7Ci0JICAgIGNtYy5zZXRNb2R1bGVOYW1lKGNvbXBvbmVudE5hbWUpOwotCSAgICBjbWMuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLldFQik7Ci0JICAgIGNtYy5zZXRQcm9qZWN0TmFtZShwcm9qZWN0Tm0pOwotCSAgICBjbWMuc2V0U2VydmVyRmFjdG9yeUlkKFNFUlZFUlRZUEVJRF9UQzUwKTsKLQkgICAgY21jLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVyXy5nZXRJZCgpKTsKLQkgICAgY21jLmV4ZWN1dGUobnVsbCwgbnVsbCApOwotCSAgICAKLQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIGNyZWF0aW5nIFdlYiBQcm9qZWN0LCAiK3Byb2plY3RObSk7ICAgICAgCi0JICAgCi0JICB9ICAKLQkgIAotICAvKioKLSAgICogU2V0cyB1cCB0aGUgaW5wdXQgZGF0YTsKLSAgICogLSBjcmVhdGUgcHJvamVjdChzKSwKLSAgICogLSBjb3B5IHJlc291cmNlcyB0byB3b3Jrc3BhY2UgCi0gICAqLyAgCi0JcHJvdGVjdGVkIHZvaWQgaW5zdGFsbElucHV0RGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsJCQotCQlJRm9sZGVyIGRlc3RGb2xkZXIgPSAoSUZvbGRlcilKMkVFVXRpbHMuZ2V0V2ViQ29udGVudENvbnRhaW5lcih3ZWJQcm9qZWN0KTsKLQkJSlVuaXRVdGlscy5jb3B5VGVzdERhdGEoIlRESmF2YSIsZGVzdEZvbGRlcixlbnZfLCBudWxsKTsKLQkJc291cmNlRmlsZV8gPSBkZXN0Rm9sZGVyLmdldEZpbGUobmV3IFBhdGgoIkVjaG8ud3NkbCIpKTsKLQkJSlVuaXRVdGlscy5zeW5jQnVpbGRQcm9qZWN0KHdlYlByb2plY3QsZW52XywgbnVsbCk7Ci0JfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHBlcnNpc3RlbnQgc2VydmVyIHJ1bnRpbWUgY29udGV4dCBwcmVmZXJlbmNlcwotICAgKi8gIAotCXByb3RlY3RlZCB2b2lkIGluaXRKMkVFV1NSdW50aW1lU2VydmVyRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gU2V0IGRlZmF1bHQgcHJlZmVyZW5jZXMgZm9yIEF4aXMgYW5kIFRvbWNhdCB2NS4wIHNlcnZlcgotCQlKVW5pdFV0aWxzLnNldFdTUnVudGltZVNlcnZlcihXU19SVU5USU1FSURfQVhJUywgU0VSVkVSVFlQRUlEX1RDNTApOwkJCi0JfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0gICAqLyAgCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEluaXRpYWxTZWxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdGlhbFNlbGVjdGlvbl8gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3VyY2VGaWxlXyk7Ci0KLQl9Ci0KLSAgLyoqCi0gICAqIExhdW5jaGVzIHRoZSBwb3AtdXAgY29tbWFuZCB0byBpbml0aWF0ZSB0aGUgc2NlbmFyaW8KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovICAKLQlwdWJsaWMgdm9pZCB0ZXN0VERKYXZhQXhpc1RDNTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkgIAotCSAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlQZXJmb3JtYW5jZSBwZXJmPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCVBlcmZvcm1hbmNlTWV0ZXIgcGVyZm9ybWFuY2VNZXRlcj0gcGVyZi5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmYuZ2V0RGVmYXVsdFNjZW5hcmlvSWQodGhpcykpOwkgICAgCi0JICAgIHRyeSB7Ci0gICAgCi0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5zdGFydCgpOwotCSAgICAgIFBlcmZvcm1hbmNlSlVuaXRVdGlscy5sYXVuY2hDcmVhdGlvbldpemFyZChTY2VuYXJpb0NvbnN0YW50cy5XSVpBUkRJRF9UT1BfRE9XTixTY2VuYXJpb0NvbnN0YW50cy5PQkpFQ1RfQ0xBU1NfSURfSUZJTEUsaW5pdGlhbFNlbGVjdGlvbl8pOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuY29tbWl0KCk7Ci0JICAgICAgcGVyZi5hc3NlcnRQZXJmb3JtYW5jZShwZXJmb3JtYW5jZU1ldGVyKTsKLQkgICAgfQotCSAgICBmaW5hbGx5IHsKLQkgICAgCWlmIChwZXJmb3JtYW5jZU1ldGVyPT1udWxsKQotCSAgICAJCXBlcmZvcm1hbmNlTWV0ZXIuZGlzcG9zZSgpOwotCSAJfQotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLk9LKQotCQkgIHZlcmlmeU91dHB1dCgpOwotCQllbHNlCi0JCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCi0JfQotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIHNjZW5hcmlvIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHZlcmlmeU91dHB1dCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0gICAgICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsgICAgCi0gICAgICAgIElGb2xkZXIgd2ViQ29udGVudEZvbGRlciA9IChJRm9sZGVyKUoyRUVVdGlscy5nZXRXZWJDb250ZW50Q29udGFpbmVyKHdlYlByb2plY3QpOyAgICAKLSAgICAKLQkJCi0JCUlGb2xkZXIgd3NkbEZvbGRlciA9IHdlYkNvbnRlbnRGb2xkZXIuZ2V0Rm9sZGVyKCJ3c2RsIik7Ci0JCWFzc2VydFRydWUod3NkbEZvbGRlci5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUod3NkbEZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID4gMCk7Ci0KLSAgICAgICAgLy9UT0RPIFZlcmlmeSB0aGF0IHdzZGQgY29udGFpbnMgdGhpcyBXZWIgc2VydmljZQotICAgICAgICAvL1RPRE8gVmVyaWZ5IHRoYXQgdGhlIHNlcnZpY2UgY2FuIGJlIGludm9rZWQgYnkgYSBjbGllbnQKLQl9Ci0JCi0gIC8qKgotICAgKiBDbGVhciB3b3Jrc3BhY2UgaWYgcmVxdWlyZWQKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERlbGV0ZSB0aGUgV2ViIHByb2plY3QuCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQkJd2ViUHJvamVjdC5kZWxldGUodHJ1ZSx0cnVlLG51bGwpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbFBlcmZvcm1hbmNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbFBlcmZvcm1hbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwMTAyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9wZXJmb3JtYW5jZS9BbGxQZXJmb3JtYW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zckJVSmF2YUF4aXNUQzUwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyQ2xpZW50QXhpc1RDNTA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JUREphdmFBeGlzVEM1MDsKLQotcHVibGljIGNsYXNzIEFsbFBlcmZvcm1hbmNlVGVzdHMgewotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgCi0gICAgLy8gVE9ETzogQ3JlYXRlIGEgdGVzdCBzdWl0ZSAKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UiKTsKLSAgICAvLyRKVW5pdC1CRUdJTiQKLSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyZm1zckJVSmF2YUF4aXNUQzUwLmNsYXNzKTsKLSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyZm1zclRESmF2YUF4aXNUQzUwLmNsYXNzKTsKLSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyZm1zckNsaWVudEF4aXNUQzUwLmNsYXNzKTsKLSAgICAvLyRKVW5pdC1FTkQkCi0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9wZXJmb3JtYW5jZS9wbHVnaW4vUGVyZm9ybWFuY2VQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL3BsdWdpbi9QZXJmb3JtYW5jZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWY2MDc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL3BsdWdpbi9QZXJmb3JtYW5jZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UucGx1Z2luOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFBlcmZvcm1hbmNlUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUGVyZm9ybWFuY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VQbHVnaW4iKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFBlcmZvcm1hbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL3V0aWwvRWNsaXBzZVBlcmZvcm1hbmNlTG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9wZXJmb3JtYW5jZS91dGlsL0VjbGlwc2VQZXJmb3JtYW5jZUxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhmMWEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL3V0aWwvRWNsaXBzZVBlcmZvcm1hbmNlTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlTWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlUGVyZm9ybWFuY2VMb2cgaW1wbGVtZW50cyBJTG9nIHsKLQotICBwcml2YXRlIGJvb2xlYW4gcnVuU3RhdGUgPSBmYWxzZTsKLSAgUGVyZm9ybWFuY2UgcGVyZiA9IG51bGw7ICAgICAgCi0gIFBlcmZvcm1hbmNlTWV0ZXIgcGVyZm9ybWFuY2VNZXRlcj0gbnVsbDsgIAotICAKLSAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIG9wdGlvbikgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCkgewotICAgIAotICAgIGlmIChtZXRob2QuZXF1YWxzKCJydW5Db21tYW5kIikpIHsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKCFydW5TdGF0ZSkgewotICAgICAgICAgIC8vIGJlZ2luIHBlcmZvcm1hbmNlIHJlY29yZGluZwotICAgICAgICAgIHBlcmYgPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7ICAgICAgCi0gICAgICAgICAgcGVyZm9ybWFuY2VNZXRlciA9IHBlcmYuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcigoKFN0cmluZylvYmplY3QpLnRvU3RyaW5nKCkpOyAgICAgICAgICAKLSAgICAgICAgICBwZXJmb3JtYW5jZU1ldGVyLnN0YXJ0KCk7Ci0gICAgICAgICAgcnVuU3RhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIC8vIGVuZCBwZXJmb3JtYW5jZSByZWNvcmRpbmcKLSAgICAgICAgICBwZXJmb3JtYW5jZU1ldGVyLnN0b3AoKTsKLSAgICAgICAgICBwZXJmb3JtYW5jZU1ldGVyLmNvbW1pdCgpOwotICAgICAgICAgIHBlcmYuYXNzZXJ0UGVyZm9ybWFuY2UocGVyZm9ybWFuY2VNZXRlcik7Ci0gICAgICAgICAgcGVyZm9ybWFuY2VNZXRlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgcnVuU3RhdGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gaGFuZGxlIGV4Y2VwdGlvbgotICAgICAgfSAgICAgICAgCi0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL3V0aWwvUGVyZm9ybWFuY2VKVW5pdFV0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9wZXJmb3JtYW5jZS91dGlsL1BlcmZvcm1hbmNlSlVuaXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODk2ZGM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL3V0aWwvUGVyZm9ybWFuY2VKVW5pdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5EeW5hbWljUG9wdXBKVW5pdFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci0KLQotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlSlVuaXRVdGlscyB7Ci0gIAotCXByaXZhdGUgc3RhdGljIHZvaWQgbGF1bmNoV2l6YXJkKFN0cmluZyBwbHVnaW5OUyxTdHJpbmcgd2l6YXJkSWQsU3RyaW5nIG9iamVjdENsYXNzSWQsSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJSVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpOwotCi0gICAgICAgIER5bmFtaWNQb3B1cEpVbml0V2l6YXJkIHdpemFyZCA9IG5ldyBEeW5hbWljUG9wdXBKVW5pdFdpemFyZChzdGF0dXNIYW5kbGVyKTsKLSAgICAgICAgd2l6YXJkLnNldEluaXRpYWxEYXRhKHdpemFyZElkKTsKLSAgICAgICAgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIG1vbml0b3IgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIHdpemFyZC5ydW5IZWFkTGVzcyhpbml0aWFsU2VsZWN0aW9uLCBtb25pdG9yKTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoQ3JlYXRpb25XaXphcmQoU3RyaW5nIHdpemFyZElkLFN0cmluZyBvYmplY3RDbGFzc0lkLElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCWxhdW5jaFdpemFyZCgib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpIix3aXphcmRJZCxvYmplY3RDbGFzc0lkLGluaXRpYWxTZWxlY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoQ29uc3VtcHRpb25XaXphcmQoU3RyaW5nIHdpemFyZElkLFN0cmluZyBvYmplY3RDbGFzc0lkLElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCWxhdW5jaFdpemFyZCgib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpIix3aXphcmRJZCxvYmplY3RDbGFzc0lkLGluaXRpYWxTZWxlY3Rpb24pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzYjRlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icGVyZm9ybWFuY2UiIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8IS0tIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+IC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQkKLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9InBlcmYtdGVzdHMtZmlsZSIgdmFsdWU9IiR7dGVzdERpcn0vcGVyZm9ybWFuY2UtdGVzdHMueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2UiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vd29ya3NwYWNlX3dzX3BlcmZvcm1hbmNlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1Eb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTA9JHt0ZXN0RGlyfS8ke3RvbWNhdDUwRGlyfSIvPgotICAgICAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlX3N1aXRlIj4KLSAgCQotICAJPCEtLSBJdGVyYXRpb24gMSAtLT4KLSAgCQotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+ICAgIAkKLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JCVUphdmFBeGlzVEM1MCIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPiAgICAgIAotICAgIDwvYW50PgotICAJCi0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4gICAgCQotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zckNsaWVudEF4aXNUQzUwIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+ICAgICAgCi0gICAgPC9hbnQ+Ci0gIAkKLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPiAgICAJCi0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyVERKYXZhQXhpc1RDNTAiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4gICAgICAKLSAgICA8L2FudD4gIAkKLSAgCQotICAJPCEtLSBJdGVyYXRpb24gMiAtLT4KLSAgCQotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+ICAgIAkKLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JCVUphdmFBeGlzVEM1MCIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPiAgICAgIAotICAgIDwvYW50PgotICAJCi0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4gICAgCQotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zckNsaWVudEF4aXNUQzUwIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+ICAgICAgCi0gICAgPC9hbnQ+Ci0gIAkKLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPiAgICAJCi0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyVERKYXZhQXhpc1RDNTAiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4gICAgICAKLSAgICA8L2FudD4gIAkKLQotICAJPCEtLSBJdGVyYXRpb24gMyAtLT4KLSAgCQotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+ICAgIAkKLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JCVUphdmFBeGlzVEM1MCIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPiAgICAgIAotICAgIDwvYW50PgotICAJCi0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4gICAgCQotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zckNsaWVudEF4aXNUQzUwIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+ICAgICAgCi0gICAgPC9hbnQ+Ci0gIAkKLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPiAgICAJCi0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyVERKYXZhQXhpc1RDNTAiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4gICAgICAKLSAgICA8L2FudD4gIAkKLQotICAJPCEtLSBJdGVyYXRpb24gNCAtLT4KLSAgCQotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+ICAgIAkKLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JCVUphdmFBeGlzVEM1MCIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPiAgICAgIAotICAgIDwvYW50PgotICAJCi0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4gICAgCQotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zckNsaWVudEF4aXNUQzUwIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+ICAgICAgCi0gICAgPC9hbnQ+Ci0gIAkKLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPiAgICAJCi0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyVERKYXZhQXhpc1RDNTAiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4gICAgICAKLSAgICA8L2FudD4gIAkKLQotICAJPCEtLSBJdGVyYXRpb24gNSAtLT4KLSAgCQotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+ICAgIAkKLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JCVUphdmFBeGlzVEM1MCIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPiAgICAgIAotICAgIDwvYW50PgotICAJCi0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4gICAgCQotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zckNsaWVudEF4aXNUQzUwIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+ICAgICAgCi0gICAgPC9hbnQ+Ci0gIAkKLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPiAgICAJCi0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyVERKYXZhQXhpc1RDNTAiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4gICAgICAKLSAgICA8L2FudD4gIAkKLSAgCQotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4gIAotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZSIgZGVwZW5kcz0iaW5pdCxwZXJmb3JtYW5jZV9zdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0YjRkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NjNlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi10ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MGQ1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDNkOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjM2OjQxIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWEyYTFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6NDA6NTggRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjA3MjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMQotQnVuZGxlLUNsYXNzUGF0aDogdGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGx1Z2luLlRlc3RzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24sCi0gb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnVpLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLndzdC53cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLAotIG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjRhMDdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZGF0YS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWFkbWUudHh0LFwKLSAgICAgICAgICAgICAgIHRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyID0gdGVzdHMuamFyCi1zb3VyY2UudGVzdHMuamFyID0gdGVzdHMvCi1vdXRwdXQudGVzdHMuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvQlVKYXZhL2NsaWVudC9FY2hvUHJveHlUZXN0LmpzcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9kYXRhL0JVSmF2YS9jbGllbnQvRWNob1Byb3h5VGVzdC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMGUzYjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvQlVKYXZhL2NsaWVudC9FY2hvUHJveHlUZXN0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0iamF2YS5pby4qIiAlPgotPGpzcDp1c2VCZWFuIGlkPSJlY2hvUHJveHkiIGNsYXNzPSJmb28uRWNob1Byb3h5IiBzY29wZT0icmVxdWVzdCIvPgotPGh0bWw+Ci08JUAgaW5jbHVkZSBmaWxlID0gIi9vdXRwdXRGaWxlUGF0aC5qc3BmIiAlPgotPCUKLSAgIC8vIEhUVFAvUE9TVCBwYXJhbWV0ZXI6Ci0gICAvLyB0ZXN0SW5wdXQgLSB0aGUgU3RyaW5nIGFyZ3VtZW50IHRvIGNhbGwgdGhlIHByb3h5IHdpdGguCi0gICBTdHJpbmcgdGVzdElucHV0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInRlc3RJbnB1dCIpOwotICAgCi0gICAvLyBFeGVjdXRlIHRoZSBXZWIgc2VydmljZS4KLSAgIFN0cmluZyByZXN1bHQgPSBlY2hvUHJveHkuZWNob1N0cmluZyh0ZXN0SW5wdXQpOwotICAgCi0gICAvLyBXcml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBvdXRwdXRGaWxlUGF0aC4KLSAgIFByaW50V3JpdGVyIHB3ID0gbnVsbDsKLSAgIHRyeQotICAgewotICAgICBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlUGF0aCkpOwotICAgICBwdy5wcmludChyZXN1bHQpOwotICAgICBwdy5mbHVzaCgpOwotICAgfSAgIAotICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgewotICAgfQotICAgZmluYWxseQotICAgewotICAgICBpZiAocHcgIT0gbnVsbCkKLSAgICAgICBwdy5jbG9zZSgpOwotICAgfQotJT4KLTwvYm9keT4KLTxwPgotdGVzdElucHV0OiA8JT10ZXN0SW5wdXQlPgotPHA+Ci1vdXRwdXRGaWxlUGF0aDogPCU9b3V0cHV0RmlsZVBhdGglPgotPHA+Ci1UaGUgcmVzdWx0IGlzIDwlPXJlc3VsdCU+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvQlVKYXZhL3NyYy9mb28vRWNoby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvQlVKYXZhL3NyYy9mb28vRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg5M2QyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9kYXRhL0JVSmF2YS9zcmMvZm9vL0VjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSBmb287Ci0KLXB1YmxpYyBjbGFzcyBFY2hvCi17Ci0JcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBpbnB1dCkKLQl7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvVERKYXZhL0VjaG8ud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9kYXRhL1RESmF2YS9FY2hvLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZGYzMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvVERKYXZhL0VjaG8ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9mb28iIHhtbG5zOmltcGw9Imh0dHA6Ly9mb28iIHhtbG5zOmludGY9Imh0dHA6Ly9mb28iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6d3NpPSJodHRwOi8vd3MtaS5vcmcvcHJvZmlsZXMvYmFzaWMvMS4xL3hzZCIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gPHdzZGw6dHlwZXM+Ci0gIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZm9vIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmltcGw9Imh0dHA6Ly9mb28iIHhtbG5zOmludGY9Imh0dHA6Ly9mb28iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlucHV0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gIDwvc2NoZW1hPgotIDwvd3NkbDp0eXBlcz4KLQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotCi0gICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImltcGw6ZWNob1N0cmluZ1Jlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0KLSAgIDwvd3NkbDptZXNzYWdlPgotCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ij4KLQotICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJpbXBsOmVjaG9TdHJpbmciIG5hbWU9InBhcmFtZXRlcnMiLz4KLQotICAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkVjaG8iPgotCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6ZWNob1N0cmluZ1JlcXVlc3QiIG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ii8+Ci0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOmVjaG9TdHJpbmdSZXNwb25zZSIgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIi8+Ci0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgIDwvd3NkbDpwb3J0VHlwZT4KLQotICAgPHdzZGw6YmluZGluZyBuYW1lPSJFY2hvU29hcEJpbmRpbmciIHR5cGU9ImltcGw6RWNobyI+Ci0KLSAgICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPgotCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJlY2hvU3RyaW5nUmVxdWVzdCI+Ci0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQotICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgPC93c2RsOmJpbmRpbmc+Ci0KLSAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotCi0gICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9ImltcGw6RWNob1NvYXBCaW5kaW5nIiBuYW1lPSJFY2hvIj4KLQotICAgICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9UZXN0V2ViL3NlcnZpY2VzL0VjaG8iLz4KLQotICAgICAgPC93c2RsOnBvcnQ+Ci0KLSAgIDwvd3NkbDpzZXJ2aWNlPgotCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvZGF0YS9XU1BlcmZQcm9qZWN0cy56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvZGF0YS9XU1BlcmZQcm9qZWN0cy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDgxZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvV1NQZXJmUHJvamVjdHMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvV1NUZXN0UHJvamVjdHMuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvV1NUZXN0UHJvamVjdHMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjJlOWViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9kYXRhL1dTVGVzdFByb2plY3RzLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9kYXRhL3dlYmNsaWVudC9vdXRwdXRGaWxlUGF0aC5qc3BmIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvd2ViY2xpZW50L291dHB1dEZpbGVQYXRoLmpzcGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YTdhZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvd2ViY2xpZW50L291dHB1dEZpbGVQYXRoLmpzcGYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+ICAKLTwlCi0gICBTdHJpbmcgb3V0cHV0RmlsZVBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib3V0cHV0RmlsZVBhdGgiKTsKLSU+ICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTM5NDcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA2MDQyNCAgIDEzODA2MCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotIyAyMDA3MDMyNyAgIDE3MjMzOSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1KYXZhIFdlYiBTZXJ2aWNlcyBUb29scyBUZXN0cwotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLVBPUFVQX1RFU1RfV1NETD1UZXN0IHdpdGggV2ViIFNlcnZpY2VzIEV4cGxvcmVyCi1BQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTj1HZW5lcmF0ZSBKYXZhIGJlYW4gc2tlbGV0b24KLUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZPUdlbmVyYXRlIENsaWVudAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzUzODNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLTwhLS0gTmV3IHBvcHVwIGV4dGVuc3Rpb24gdG8gZW5hYmxlcyAiR2VuZXJhdGUgc2tlbGV0b24iLCAiR2VuZXJhdGUgUHJveHkiIGFuZCAiVGVzdCB3aXRoIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciIgb24gdGhlIAotU2VydmxldExpbmsgb2JqZWN0LiAgVGhpcyBpcyB0aGUgb2JqZWN0IHVuZGVyIHRoZSBKU1ItMTA5IFdlYiBTZXJ2aWNlcyBicmFuY2ggb2YgdGhlIEoyRUUgUHJvamVjdCBFeHBsb3JlcjoKLQotSlNSLTEwOSBXZWIgU2VydmljZXMgCi0gIENsaWVudHMKLSAgU2VydmljZXMKLSAgICAgRWNob1NlcnZpY2UKLSAgICAgICAgSGFuZGxlcnMKLSAgICAgICAgU2VydmljZSBDbGFzc2VzCi0gICAgICAgICAgIFNlcnZpY2VJbXBsOiBlY2hvX0VjaG8gICAgICAgPD09PT0gVGhpcyBpcyB0aGUgU2VydmxldExpbmsKLSAgCi0gIFdoZW4gU2VydmxldExpbmsgaXMgc2VsZWN0ZWQsICJHZW5lcmF0ZSBQcm94eSIgYW5kICJUZXN0IHdpdGggV2ViIFNlcnZpY2VzIEV4cGxvcmVyIiB3b3VsZCBzZWxlY3QgdGhlIGNvcnJlY3QgV1NETCAKLSAgd2hlbiB0aGUgcG9wdXAgaXMgaW5pdGlhbGl6ZWQuCi0gIAotICBOb3RlIHRoYXQgd2l0aCBidWcgMTc5NzUxLCB3ZSdsbCBoYXZlIHRvIGNvbW1lbnQgb3V0IHRoZSBUT0RPIGZvciAxNzk3NTEgaW4gVHlwZVNlbGVjdGlvbkZpbHRlcjIuamF2YSBpbiBvcmRlciAKLSAgZm9yICJHZW5lcmF0ZSBza2VsZXRvbiIgcG9wdXAgb24gU2VydmxldExpbmsgdG8gc2VsZWN0IHRvcC1kb3duIG9uIHRoZSBzZWxlY3RlZCBXU0RMLiAgU2VydmxldExpbmsgd291bGQgZWl0aGVyCi0gIGFsd2F5cyBiZSByZWNvZ25pemVkIGFzIHNlbGVjdGluZyBib3R0b20tdXAgb3Igc2VsZWN0aW5nIHRvcC1kb3duLgotLS0+Ci0JICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICAgIAotICAgICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluayIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluayIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluayIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5XU0RMRmlsZU1lbnUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9URVNUX1dTREwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBvcHVwLlBvcHVwVGVzdFdTREwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wb3B1cC5Qb3B1cFRlc3RXU0RMIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgCi0gICAgICA8L2V4dGVuc2lvbj4KLQotPCEtLSBEZWZpbmVzIHRoZSBXU0N1c3RvbUFkYXB0ZXJGYWN0b3J5IGFzIGV4dGVuc2lvbiB0byB0aGUgYWRhcHRlcnMgZnJhbWV3b3JrIHRvIGFkYXB0IFNlcnZsZXRMaW5rIHRvIElGaWxlIC0tPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICAgPGZhY3RvcnkgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuV1NDdXN0b21BZGFwdGVyRmFjdG9yeSIgCi0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDwvZXh0ZW5zaW9uPgotCi08IS0tIERlZmluZXMgdGhlIFdTQ3VzdG9tQWRhcHRlckZhY3RvcnkgYXMgZXh0ZW5zaW9uIHRvIHRoZSBhZGFwdGVycyBmcmFtZXdvcmsgdG8gYWRhcHQgU2VydmxldExpbmsgdG8gU3RyaW5nIC0tPgotICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgICAgIDxmYWN0b3J5IAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLldTQ3VzdG9tQWRhcHRlckZhY3RvcnkiIAotICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9yZWFkbWUudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjk1NDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGluIGFyZTogCi0KLS1Eb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTA9RTpcXFRvbWNhdFxcVG9tY2F0NS4wCi0KLSwgd2hlcmUgIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIiBpcyB0aGUgaW5zdGFsbCBkaXJlY3Rvcnkgb2YgeW91ciBUb21jYXQgdjUuMCBzZXJ2ZXIuCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTRjNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSA8IS0tIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+IC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MD0ke3Rlc3REaXJ9LyR7dG9tY2F0NTBEaXJ9Ii8+Ci0JCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpzdC13cy1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanN0X3dzX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anN0LXdzLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0LkFsbFdTSlVuaXRUZXN0cyIgLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPiAgICAJCi0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL1dTV2l6YXJkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9XU1dpemFyZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwMTM4My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL1dTV2l6YXJkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzEwNCAgIDExNDgzNSBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdC5XU0pVbml0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NXaXphcmRUZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBXU0pVbml0Q29uc3RhbnRzCi17Ci0JcHJvdGVjdGVkIElFbnZpcm9ubWVudCBlbnZfOwotCXByb3RlY3RlZCBJUnVudGltZSBzZXJ2ZXJSdW50aW1lXzsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXJfOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdFVSTF8gPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyI7Ci0JCi0JLyoqCi0JICogU2V0IHVwIHRoZSB3b3Jrc3BhY2UgZm9yIHRoZSBXZWIgU2VydmljZSBXaXphcmQgSlVuaXQgdGVzdC4gU2V0dXAgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBzdGVwczoKLQkgKiAxKSBPYnRhaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudmlyb25tZW50LgotCSAqIDIpIEluc3RhbGwgdGhlIHNlcnZlciBydW50aW1lLgotCSAqIDMpIEluc3RhbGwgdGhlIGlucHV0IGRhdGEuIFRoaXMgbWF5IGluY2x1ZGUgcHJvamVjdHMsIHNvdXJjZSBmaWxlcyBldGMuCi0JICogNCkgSW5zdGFsbCBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmVyIGlmIHJlcXVpcmVkLiBUaGlzIG1heSBhbHNvIGluY2x1ZGUgY29uZmlndXJhdGlvbiBvZiB0aGUgaW5wdXQgZGF0YSBvbiB0aGUgc2VydmVyLgotCSAqIDUpIEluaXRpYWxpemUgdGhlIEoyRUUsIFdlYiBTZXJ2aWNlIFJ1bnRpbWUgYW5kIFNlcnZlciB0eXBlIGRlZmF1bHRzIGZvciB0aGUgV2ViIFNlcnZpY2Ugd2l6YXJkIHRvIHVzZS4KLQkgKiA2KSBJbml0aWFsaXplIHRoZSBpbml0aWFsIHNlbGVjdGlvbiBvYmplY3QgdG8gc2V0IHRoZSBjb250ZXh0IGZvciB0aGUgV2ViIFNlcnZpY2Ugd2l6YXJkLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQkvLyBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgd2l0aCB0aGUgQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXIgdG8gbWluaW1pemUgVUkgZGlhbG9nIGJsb2Nrcy4KLQkgIAlQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0ICByZXNvdXJjZUNvbnRleHQgPSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCUVjbGlwc2VTdGF0dXNIYW5kbGVyICAgICAgIGhhbmRsZXIgICAgICAgICA9IG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpOwotCQlFY2xpcHNlRW52aXJvbm1lbnQgICAgICAgICBlbnZpcm9ubWVudCAgICAgPSBuZXcgRWNsaXBzZUVudmlyb25tZW50KCBudWxsLCByZXNvdXJjZUNvbnRleHQsIGhhbmRsZXIgKTsKLQkgIAotCQllbnZfID0gZW52aXJvbm1lbnQ7IAotCQlhc3NlcnRUcnVlKGVudl8gIT0gbnVsbCk7Ci0JCQotCQlzZXJ2ZXJfID0gbnVsbDsKLQkJSlVuaXRVdGlscy5oaWRlQWN0aW9uRGlhbG9ncygpOwotCQlpbnN0YWxsU2VydmVyUnVudGltZSgpOwotCQlpbnN0YWxsU2VydmVyKCk7Ci0JCQotCQkvLyB1bnppcCBwcmUtY29uZmlndXJlZCB3b3Jrc3BhY2UgcHJvamVjdHMKLQkJLy9pZiAoIVByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChXU0pVbml0Q29uc3RhbnRzLkJVX1BST0pFQ1RfTkFNRSkuZXhpc3RzKCkpCi0JCQljcmVhdGVQcm9qZWN0cygpOwkJCi0JCQotCQlpbnN0YWxsSW5wdXREYXRhKCk7Ci0JCWluaXRKMkVFV1NSdW50aW1lU2VydmVyRGVmYXVsdHMoKTsKLQkJaW5pdEluaXRpYWxTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5zdGFsbCB0aGUgc2VydmVyIHJ1bnRpbWUuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnN0YWxsU2VydmVyUnVudGltZSgpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogSW5zdGFsbHMgdGhlIGlucHV0IGRhdGEgZnJvbSBhbiBhZ2dyZWdhdG9yLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgZW52aXJvbm1lbnQsIHJ1bnRpbWUKLQkgKiBhbmQgc2VydmVyIGFyZSBjb3JyZWN0bHkgc2V0IG9uIHRoZSBhZ2dyZWdhdGUgc2luY2UgaXRzIGxpZmVjeWNsZSBtZXRob2RzIGFyZSBub3QgbmVjZXNzYXJpbHkKLQkgKiBjYWxsZWQuCi0JICogQHBhcmFtIGVudgotCSAqIEBwYXJhbSBzZXJ2ZXJSdW50aW1lCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbElucHV0RGF0YShJRW52aXJvbm1lbnQgZW52LElSdW50aW1lIHNlcnZlclJ1bnRpbWUsSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCWVudl8gPSBlbnY7Ci0JCXNlcnZlclJ1bnRpbWVfID0gc2VydmVyUnVudGltZTsKLQkJc2VydmVyXyA9IHNlcnZlcjsKLQkJLy9pbnN0YWxsSW5wdXREYXRhKCk7Ci0JfQotCQotCS8vIENyZWF0ZXMgcHJvamVjdHMgZnJvbSB0aGUgcHJvdmlkZWQgWklQIGZpbGUuCi0vLwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlUHJvamVjdHMoKSB7Ci0vLwkJSVBhdGggbG9jYWxaaXBQYXRoID0gZ2V0TG9jYWxQYXRoKCk7Ci0vLwkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBwZXJmX3Byb2plY3ROYW1lcyk7Ci0vLwkJcmV0dXJuIHV0aWwuY3JlYXRlUHJvamVjdHMoKTsKLS8vCX0KLQkKLS8vCXByaXZhdGUgc3RhdGljIElQYXRoIGdldExvY2FsUGF0aCgpIHsKLS8vCQlVUkwgdXJsID0gVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbmQocGVyZl96aXBGaWxlUGF0aCk7Ci0vLwkJdHJ5IHsKLS8vCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotLy8JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotLy8JfQkKLQkKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIG5lY2Vzc2FyeSBwcm9qZWN0cyBmb3IgdGhlIHRlc3RzLiAgVGhpcyBjb3VsZCBiZSBXZWIsIEphdmEsIG9yIG90aGVyIEoyRUUgcHJvamVjdHMuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogSW5zdGFsbCB0aGUgaW5wdXQgZGF0YSBmb3IgdGhlIHRlc3QuIFRoaXMgbWF5IGluY2x1ZGUgcHJvamVjdHMsIHNvdXJjZSBmaWxlcyBldGMuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnN0YWxsSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBJbnN0YWxsIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuIFRoaXMgbWF5IGFsc28gY29uZmlndXJlIGlucHV0IGRhdGEgb24gdGhlIHNlcnZlci4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluc3RhbGxTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIEoyRUUgbGV2ZWwsIFdlYiBTZXJ2aWNlIHJ1bnRpbWUgdHlwZSBhbmQgU2VydmVyIGRlZmF1bHRzIGZvciB0aGUgdGVzdCBjYXNlLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdEoyRUVXU1J1bnRpbWVTZXJ2ZXJEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gd2hpY2ggZHJpdmVzIHRoZSBXZWIgU2VydmljZSB3aXphcmQuIFRoaXMgY291bGQgaW5jbHVkZSBzb3VyY2UgSmF2YSBmaWxlcywKLQkgKiBXU0RMIFVSTHMgYW5kIGV2ZW4gRUpCcy4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRJbml0aWFsU2VsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDbGVhbiB1cCB0aGUgd29ya3NwYWNlLiBDbGVhbnVwIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0JICogMSkgRGVsZXRlIHRoZSBpbnB1dCBkYXRhLiBUaGlzIHNob3VsZCBpbmNsdWRlIHJlbW92YWwgb2YgY29uZmlndXJhdGlvbiBkYXRhIG9uIHRoZSBzZXJ2ZXIgaWYgbmVjZXNzYXJ5LgotCSAqIDIpIFN0b3AgdGhlIHNlcnZlci4KLQkgKiAzKSBEZWxldGUgdGhlIHNlcnZlci4KLQkgKiA0KSBEZWxldGUgdGhlIHNlcnZlciBydW50aW1lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3RvcFNlcnZlcigpOwotCQlkZWxldGVTZXJ2ZXIoKTsKLS8vICAgICAgZGVsZXRlSW5wdXREYXRhKCk7Ci0vLwkJZGVsZXRlU2VydmVyUnVudGltZSgpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGlucHV0IGRhdGEuIFRoaXMgc2hvdWxkIGluY2x1ZGUgcmVtb3ZhbCBvZiBwcm9qZWN0cywgc3JjIGZpbGVzIGV0Yy4gYXMgd2VsbCBhcyByZW1vdmFsIG9mIGFueSBzZXJ2ZXIgY29uZmlndXJlZCBkYXRhLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGVsZXRlSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTdG9wIHRoZSBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZy4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3BTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlpZiAoc2VydmVyXyAhPSBudWxsICYmIHNlcnZlcl8uZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQlzZXJ2ZXJfLnN0b3AodHJ1ZSk7Ci0JCWFzc2VydFRydWUoc2VydmVyXy5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgc2VydmVyLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaWYgKHNlcnZlcl8gIT0gbnVsbCkKLQkJCXNlcnZlcl8uZGVsZXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgc2VydmVyIHJ1bnRpbWUuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVTZXJ2ZXJSdW50aW1lKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaWYgKHNlcnZlclJ1bnRpbWVfICE9IG51bGwpCi0JCQlzZXJ2ZXJSdW50aW1lXy5kZWxldGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBkZWZhdWx0IFVSTCBpbiB0aGUgZm9ybSBvZjogaHR0cDovL2xvY2FsaG9zdDo5MDgwLzxjb250ZXh0Um9vdD4vPHBhdGg+Ci0JICogQHBhcmFtIHBhdGggLSBhIGZpbGUgb3IgVVJMIHJlbGF0aXZlIHBhdGguCi0JICogQHBhcmFtIGNvbnRleHRSb290IC0gdGhlIGNvbnRleHQgcm9vdCBvZiB0aGUgV2ViIG1vZHVsZSBmb3IgdGhpcyBVUkwuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFVSTChTdHJpbmcgcGF0aCxTdHJpbmcgY29udGV4dFJvb3QpCi0JewotCQlTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcihkZWZhdWx0VVJMXyk7Ci0JCXVybC5hcHBlbmQoY29udGV4dFJvb3QpOwotCQl1cmwuYXBwZW5kKCcvJyk7Ci0JCXVybC5hcHBlbmQocGF0aCk7Ci0JCXJldHVybiB1cmwudG9TdHJpbmcoKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL1dTV2l6YXJkVG9tY2F0NTBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL2F4aXMvdG9tY2F0L3Y1MC9XU1dpemFyZFRvbWNhdDUwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2Q3OGMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL1dTV2l6YXJkVG9tY2F0NTBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuV1NXaXphcmRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTV2l6YXJkVG9tY2F0NTBUZXN0IGV4dGVuZHMgV1NXaXphcmRUZXN0IHsKLSAgCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTRVJWRVJfSU5TVEFMTF9QQVRIID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIpOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUlVOVElNRVRZUEVJRF9UQzUwID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0VSVkVSVFlQRUlEX1RDNTAgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiOwotCSAgCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud2FzLnRlc3RzLldTV2l6YXJkVGVzdCNpbnN0YWxsU2VydmVyUnVudGltZSgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsU2VydmVyUnVudGltZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgc2VydmVyUnVudGltZV8gPSBKVW5pdFV0aWxzLmNyZWF0ZVNlcnZlclJ1bnRpbWUoUlVOVElNRVRZUEVJRF9UQzUwLCBTRVJWRVJfSU5TVEFMTF9QQVRIKTsKLSAgfQotCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud2FzLnRlc3RzLldTV2l6YXJkVGVzdCNpbnN0YWxsU2VydmVyKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluc3RhbGxTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgIHNlcnZlcl8gPSBKVW5pdFV0aWxzLmNyZWF0ZVNlcnZlcigiQXBhY2hlIFRvbWNhdCB2NTAiLCBTRVJWRVJUWVBFSURfVEM1MCwgc2VydmVyUnVudGltZV8sIGVudl8sIG51bGwgKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvcGx1Z2luL1Rlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BsdWdpbi9UZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY4MjU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvcGx1Z2luL1Rlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFRlc3RzUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBsdWdpbi5UZXN0c1BsdWdpbiIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQWxsV1NKVW5pdFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L0FsbFdTSlVuaXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjU2ZWYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQWxsV1NKVW5pdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MTA0ICAgMTE0ODM1IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuSlVuaXRVdGlsczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRvIHJ1biBhbGwgdGhlIHVuaXR0ZXN0IHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsV1NKVW5pdFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBXU0pVbml0Q29uc3RhbnRzCi17Ci0gIC8qKgotICAgKiBNZXRob2QgcGFyc2VBcmdzLgotICAgKiAKLSAgICogQHBhcmFtIGFyZ3MKLSAgICovCi0gIHByaXZhdGUgdm9pZCBwYXJzZUFyZ3MoT2JqZWN0IGFyZ3MpCi0gIHsKLSAgICAvLyB0eXBpY2lhbGx5IGFyZ3MgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncywKLSAgICAvLyBub3Qgc3VyZSB3aGVuIGl0IHdvdWxkbid0IGJlLgotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIG5ldyBBbGxXU0pVbml0VGVzdHMoKS5ydW5NYWluKGFyZ3MpOwotICB9Ci0KLSAgCi0gIHB1YmxpYyBPYmplY3QgcnVuTWFpbihPYmplY3QgYXJncykKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFRlc3RSdW5uZXIgdGVzdFJ1bm5lciA9IG51bGw7Ci0KLSAgICAgIHBhcnNlQXJncyhhcmdzKTsKLQotICAgICAgdGVzdFJ1bm5lciA9IG5ldyBUZXN0UnVubmVyKFN5c3RlbS5vdXQpOwotCi0gICAgICBUZXN0IHN1aXRlID0gc3VpdGUoKTsKLSAgICAgIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IHRlc3RSdW5uZXIuZG9SdW4oc3VpdGUsIGZhbHNlKTsKLSAgICAgIHByaW50SGVhZGVyKHRlc3RSZXN1bHQpOyAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIEpVbml0VXRpbHMuZW5hYmxlT3ZlcndyaXRlKHRydWUpOwotICAgIAotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgdGVzdFN1aXRlLmFkZFRlc3QoIENvbXBvbmVudENyZWF0aW9uVGVzdHMuc3VpdGUoKSApOwotICAgIHRlc3RTdWl0ZS5hZGRUZXN0KCBKMkVFVXRpbHNUZXN0cy5zdWl0ZSgpICk7Ci0gICAKLSAgICBTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiKTsKLSAgICBpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICB0ZXN0U3VpdGUuYWRkVGVzdCggU2VydmVyQ3JlYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAgIC8vdGVzdFN1aXRlLmFkZFRlc3QoIEJVSmF2YUF4aXNUQzUwLnN1aXRlKCkgKTsKLSAgICAgIHRlc3RTdWl0ZS5hZGRUZXN0KCBUREphdmFBeGlzVEM1MC5zdWl0ZSgpICk7Ci0gICAgICB0ZXN0U3VpdGUuYWRkVGVzdCggQ2xpZW50QXhpc1RDNTAuc3VpdGUoKSApOwotCi0gICAgfQotICAgIHRlc3RTdWl0ZS5hZGRUZXN0KCBSZXNvdXJjZVV0aWxzVGVzdHMuc3VpdGUoKSApOwotCi0gICAgcmV0dXJuIHRlc3RTdWl0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIGhlYWRlciBvZiB0aGUgcmVwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcmludEhlYWRlcihUZXN0UmVzdWx0IHJlc3VsdCkKLSAgewotICAgIGlmIChyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgU3lzdGVtLm91dC5wcmludCgiT0siKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICgiICsgcmVzdWx0LnJ1bkNvdW50KCkgKyAiIHRlc3RzKSIpOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVMhISEiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgIlRlc3RzIHJ1bjogIgotICAgICAgICAgICsgcmVzdWx0LnJ1bkNvdW50KCkKLSAgICAgICAgICArICIsICBGYWlsdXJlczogIgotICAgICAgICAgICsgcmVzdWx0LmZhaWx1cmVDb3VudCgpCi0gICAgICAgICAgKyAiLCAgRXJyb3JzOiAiCi0gICAgICAgICAgKyByZXN1bHQuZXJyb3JDb3VudCgpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQlVKYXZhQXhpc1RDNTAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQlVKYXZhQXhpc1RDNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3NDZkMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L0JVSmF2YUF4aXNUQzUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEwNCAgIDExNDgzNSBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDcwMjAyICAgMTcyNjE1IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAuV1NXaXphcmRUb21jYXQ1MFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5TY2VuYXJpb0NvbnN0YW50czsKLQotLyoqCi0gKiBCb3R0b20gdXAgcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzIGFuZCBUb21jYXQgdjUuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQlVKYXZhQXhpc1RDNTAgZXh0ZW5kcyBXU1dpemFyZFRvbWNhdDUwVGVzdCB7Ci0JLy8gQ29uc3RhbnRzCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NfUlVOVElNRUlEX0FYSVMgPSAgV1NKVW5pdENvbnN0YW50cy5XU19SVU5USU1FSURfQVhJUzsgCi0JcHJpdmF0ZSBTdHJpbmcgUFJPSkVDVF9OQU1FID0gV1NKVW5pdENvbnN0YW50cy5CVV9QUk9KRUNUX05BTUU7Ci0gICAgCi0JcHJpdmF0ZSBJRmlsZSBzb3VyY2VGaWxlXzsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQlVKYXZhQXhpc1RDNTAuY2xhc3MpOwotCX0KLQkKLSAgLyoqCi0gICAqIFNldHMgdXAgdGhlIGlucHV0IGRhdGE7Ci0gICAqIC0gY3JlYXRlIHByb2plY3QocyksCi0gICAqIC0gY29weSByZXNvdXJjZXMgdG8gd29ya3NwYWNlIAotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgSVBhdGggZGVzdFBhdGggPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbih3ZWJQcm9qZWN0KTsKLSAgICAgICAgSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcilSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShkZXN0UGF0aCk7CQkKLQkJSlVuaXRVdGlscy5jb3B5VGVzdERhdGEoIkJVSmF2YS9zcmMiLGZvbGRlcixlbnZfLCBudWxsKTsKLQkJc291cmNlRmlsZV8gPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiZm9vL0VjaG8uamF2YSIpKTsKLQkJLy8gRW5zdXJlIHRoYXQgRWNoby5jbGFzcyBpcyBidWlsdCBpbjoKLQkJLy8gPFdlYiBQcm9qZWN0Pi9XZWJDb250ZW50L1dFQi1JTkYvY2xhc3Nlcy9mb28vRWNoby5jbGFzcwotCQlKVW5pdFV0aWxzLnN5bmNCdWlsZFByb2plY3Qod2ViUHJvamVjdCxlbnZfLCBudWxsKTsKLQkJLy9hc3NlcnRUcnVlKEpVbml0VXRpbHMuZ2V0Q2xhc3Nlc0ZvbGRlckZvcldlYlByb2plY3QoV0VCX1BST0pFQ1RfTkFNRSkuZ2V0RmlsZShuZXcgUGF0aCgiZm9vL0VjaG8uY2xhc3MiKSkuZXhpc3RzKCkpOwotCQkKLQkJCi0JfQotCQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotICAgICAgICBpZiAod2ViUHJvamVjdD09bnVsbCB8fCAhd2ViUHJvamVjdC5leGlzdHMoKSl7Ci0gICAgICAgICAgY3JlYXRlV2ViTW9kdWxlKFBST0pFQ1RfTkFNRSwgUFJPSkVDVF9OQU1FLEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBwcml2YXRlIHZvaWQgY3JlYXRlV2ViTW9kdWxlKFN0cmluZyBwcm9qZWN0Tm0sIFN0cmluZyBjb21wb25lbnROYW1lLCBpbnQgajJlZVZlcnNpb24pewotCi0gICAgICAgIENyZWF0ZU1vZHVsZUNvbW1hbmQgY21jID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLSAgICAgICAgY21jLnNldEoyZWVMZXZlbChuZXcgSW50ZWdlcihqMmVlVmVyc2lvbikudG9TdHJpbmcoKSk7Ci0gICAgICAgIGNtYy5zZXRNb2R1bGVOYW1lKGNvbXBvbmVudE5hbWUpOwotICAgICAgICBjbWMuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLldFQik7Ci0gICAgICAgIGNtYy5zZXRQcm9qZWN0TmFtZShwcm9qZWN0Tm0pOwotICAgICAgICBjbWMuc2V0U2VydmVyRmFjdG9yeUlkKFNFUlZFUlRZUEVJRF9UQzUwKTsKLSAgICAgICAgY21jLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVyXy5nZXRJZCgpKTsKLSAgICAgICAgY21jLmV4ZWN1dGUobnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIGNyZWF0aW5nIFdlYiBQcm9qZWN0LCAiK3Byb2plY3RObSk7ICAgICAgCi0gICAgICAgCi0gICAgICB9Ci0JCi0JCi0gIC8qKgotICAgKiBTZXQgdGhlIHBlcnNpc3RlbnQgc2VydmVyIHJ1bnRpbWUgY29udGV4dCBwcmVmZXJlbmNlcwotICAgKi8gIAotCXByb3RlY3RlZCB2b2lkIGluaXRKMkVFV1NSdW50aW1lU2VydmVyRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQkvLyBTZXQgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgQXhpcyBhbmQgVG9tY2F0IDUuMAotCQlKVW5pdFV0aWxzLnNldFdTUnVudGltZVNlcnZlcihXU19SVU5USU1FSURfQVhJUywgU0VSVkVSVFlQRUlEX1RDNTApOwkJCi0JfQotCQotICAvKioKLSAgICogU2V0IHRoZSBpbml0aWFsIHNlbGVjdGlvbgotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0SW5pdGlhbFNlbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCWluaXRpYWxTZWxlY3Rpb25fID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc291cmNlRmlsZV8pOwotCX0KLQkKLSAgLyoqCi0gICAqIExhdW5jaGVzIHRoZSBwb3AtdXAgY29tbWFuZCB0byBpbml0aWF0ZSB0aGUgc2NlbmFyaW8KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovICAKLQlwdWJsaWMgdm9pZCB0ZXN0QlVKYXZhQXhpc1RDNTAoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCSAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkgICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCSAgICBKVW5pdFV0aWxzLmRpc2FibGVXU0lEaWFsb2cod2ViUHJvamVjdCk7Ci0JICAgIEpVbml0VXRpbHMuc2V0QlVTY2VuYXJpb0RlZmF1bHRzKCk7Ci0KLQkgICAgc3RhdHVzID0gSlVuaXRVdGlscy5sYXVuY2hDcmVhdGlvbldpemFyZChTY2VuYXJpb0NvbnN0YW50cy5XSVpBUkRJRF9CT1RUT01fVVAsU2NlbmFyaW9Db25zdGFudHMuT0JKRUNUX0NMQVNTX0lEX0lGSUxFLGluaXRpYWxTZWxlY3Rpb25fKTsKLQotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLk9LKQotCQkgIHZlcmlmeU91dHB1dCgpOwotCQllbHNlCi0JCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQkKLQl9Ci0JCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIHNjZW5hcmlvIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHZlcmlmeU91dHB1dCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0gICAgICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsgICAgCi0JCUlGb2xkZXIgd2ViQ29udGVudEZvbGRlciA9IChJRm9sZGVyKUoyRUVVdGlscy5nZXRXZWJDb250ZW50Q29udGFpbmVyKHdlYlByb2plY3QpOwotICAgIAotICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSB3ZWJDb250ZW50Rm9sZGVyLmdldEZvbGRlcigid3NkbCIpOwotCQlhc3NlcnRUcnVlKHdzZGxGb2xkZXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHdzZGxGb2xkZXIubWVtYmVycygpLmxlbmd0aCA+IDApOwotCQlhc3NlcnRUcnVlKHdlYkNvbnRlbnRGb2xkZXIuZ2V0Rm9sZGVyKCJ3c2RsIikubWVtYmVycygpLmxlbmd0aCA+IDApOwotICAgIAotICAgICAgICAvL1RPRE8gQ2hlY2sgaWYgd3NkZCBjb250YWlucyBuZXcgV2ViIHNlcnZpY2UKLSAgICAgICAgLy9UT0RPIENoZWNrIGlmIFdlYiBzZXJpdmNlIGNhbiBiZSBpbnZva2VkIGJ5IGEgY2xpZW50Ci0JfQotCQotICAvKioKLSAgICogQ2xlYXIgd29ya3NwYWNlIGlmIG5lY2Vzc2FyeQotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQkvLyBSZW1vdmUgdGhlIEVBUiBmcm9tIHRoZSBzZXJ2ZXIuCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQkJLy9KVW5pdFV0aWxzLnJlbW92ZU1vZHVsZUZyb21TZXJ2ZXIoc2VydmVyXyx3ZWJQcm9qZWN0LGVudl8pOwotCQkKLQkJLy8gRGVsZXRlIHRoZSBXZWIgcHJvamVjdC4KLQkJd2ViUHJvamVjdC5kZWxldGUodHJ1ZSx0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uod2ViUHJvamVjdC5leGlzdHMoKSk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQ2xpZW50QXhpc1RDNTAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQ2xpZW50QXhpc1RDNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4NjJjZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L0NsaWVudEF4aXNUQzUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MTA0ICAgMTE0ODM1IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAuV1NXaXphcmRUb21jYXQ1MFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5TY2VuYXJpb0NvbnN0YW50czsKLQotLyoqCi0gKiBDbGllbnQgcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzIGFuZCBUb21jYXQgdjUuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50QXhpc1RDNTAgZXh0ZW5kcyBXU1dpemFyZFRvbWNhdDUwVGVzdCB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBXU19SVU5USU1FSURfQVhJUyA9IFdTSlVuaXRDb25zdGFudHMuV1NfUlVOVElNRUlEX0FYSVM7Ci0gIAotCXByaXZhdGUgU3RyaW5nIENMSUVOVF9QUk9KRUNUX05BTUUgPSBXU0pVbml0Q29uc3RhbnRzLkNMSUVOVF9QUk9KRUNUX05BTUU7Ci0JCi0JcHJpdmF0ZSBJRmlsZSBzb3VyY2VGaWxlXzsKLQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDbGllbnRBeGlzVEM1MC5jbGFzcyk7Ci0JfQotCQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChDTElFTlRfUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgaWYgKCF3ZWJQcm9qZWN0LmV4aXN0cygpKXsKLSAgICAgICAgICBjcmVhdGVXZWJNb2R1bGUoQ0xJRU5UX1BST0pFQ1RfTkFNRSwgQ0xJRU5UX1BST0pFQ1RfTkFNRSxKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVdlYk1vZHVsZShTdHJpbmcgcHJvamVjdE5tLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgaW50IGoyZWVWZXJzaW9uKXsKLQotICAgICAgICBDcmVhdGVNb2R1bGVDb21tYW5kIGNtYyA9IG5ldyBDcmVhdGVNb2R1bGVDb21tYW5kKCk7Ci0gICAgICAgIGNtYy5zZXRKMmVlTGV2ZWwobmV3IEludGVnZXIoajJlZVZlcnNpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICBjbWMuc2V0TW9kdWxlTmFtZShjb21wb25lbnROYW1lKTsKLSAgICAgICAgY21jLnNldE1vZHVsZVR5cGUoQ3JlYXRlTW9kdWxlQ29tbWFuZC5XRUIpOwotICAgICAgICBjbWMuc2V0UHJvamVjdE5hbWUocHJvamVjdE5tKTsKLSAgICAgICAgY21jLnNldFNlcnZlckZhY3RvcnlJZChTRVJWRVJUWVBFSURfVEM1MCk7Ci0gICAgICAgIGNtYy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZlcl8uZ2V0SWQoKSk7Ci0gICAgICAgIGNtYy5leGVjdXRlKG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLQkvKioKLSAgICogU2V0cyB1cCB0aGUgaW5wdXQgZGF0YTsKLSAgICogLSBjcmVhdGUgcHJvamVjdChzKSwKLSAgICogLSBjb3B5IHJlc291cmNlcyB0byB3b3Jrc3BhY2UgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zdGFsbElucHV0RGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChDTElFTlRfUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgSUZvbGRlciBkZXN0Rm9sZGVyID0gKElGb2xkZXIpSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRDb250YWluZXIod2ViUHJvamVjdCk7Ci0gICAgICAgIEpVbml0VXRpbHMuY29weVRlc3REYXRhKCJUREphdmEiLGRlc3RGb2xkZXIsZW52XywgbnVsbCk7Ci0JCXNvdXJjZUZpbGVfID0gZGVzdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKCJFY2hvLndzZGwiKSk7CQkKLQkJSlVuaXRVdGlscy5zeW5jQnVpbGRQcm9qZWN0KHdlYlByb2plY3QsZW52XywgbnVsbCk7Ci0JCQotCX0KLQotICAvKioKLSAgICogU2V0IHRoZSBwZXJzaXN0ZW50IHNlcnZlciBydW50aW1lIGNvbnRleHQgcHJlZmVyZW5jZXMKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEoyRUVXU1J1bnRpbWVTZXJ2ZXJEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXQgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgQXhpcyBhbmQgVG9tY2F0IDUuMCAgICAKLQkJSlVuaXRVdGlscy5zZXRXU1J1bnRpbWVTZXJ2ZXIoV1NfUlVOVElNRUlEX0FYSVMsIFNFUlZFUlRZUEVJRF9UQzUwKTsKLQl9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEluaXRpYWxTZWxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdGlhbFNlbGVjdGlvbl8gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3VyY2VGaWxlXyk7Ci0JfQotCi0gIC8qKgotICAgKiBMYXVuY2hlcyB0aGUgcG9wLXVwIGNvbW1hbmQgdG8gaW5pdGlhdGUgdGhlIHNjZW5hcmlvCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotCXB1YmxpYyB2b2lkIHRlc3RDbGllbnRBeGlzVEM1MCgpIHRocm93cyBFeGNlcHRpb24KLQl7CQotCSAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkgIAkKLQkJSlVuaXRVdGlscy5lbmFibGVQcm94eUdlbmVyYXRpb24odHJ1ZSk7Ci0JCUpVbml0VXRpbHMuZW5hYmxlT3ZlcndyaXRlKHRydWUpOwotICAgICAgICAKLQkJc3RhdHVzID0gSlVuaXRVdGlscy5sYXVuY2hDcmVhdGlvbldpemFyZChTY2VuYXJpb0NvbnN0YW50cy5XSVpBUkRJRF9DTElFTlQsU2NlbmFyaW9Db25zdGFudHMuT0JKRUNUX0NMQVNTX0lEX0lGSUxFLGluaXRpYWxTZWxlY3Rpb25fKTsKLQotCSAgICAKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5PSykgewotCQkgIHZlcmlmeU91dHB1dCgpOwotCQl9IGVsc2UgewotCQkgIHRocm93IG5ldyBFeGNlcHRpb24oc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCi0JfQotCQotICAvKioKLSAgICogVmVyaWZ5IHRoZSBzY2VuYXJpbyBjb21wbGV0ZWQgc3VjY2VzZnVsbHkKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHZlcmlmeU91dHB1dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KENMSUVOVF9QUk9KRUNUX05BTUUpOwotICAgIAotICAgICAgICBJUGF0aCBkZXN0UGF0aCA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKHdlYlByb2plY3QpOwotICAgICAgICBJRm9sZGVyIHNyY0ZvbGRlciA9IChJRm9sZGVyKVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGRlc3RQYXRoKTsKLSAgICAKLQkJLy9JRm9sZGVyIHNyY0ZvbGRlciA9IEpVbml0VXRpbHMuZ2V0U291cmNlRm9sZGVyRm9yV2ViUHJvamVjdChDTElFTlRfUFJPSkVDVF9OQU1FKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBzcmNGb2xkZXIuZ2V0Rm9sZGVyKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShmb2xkZXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID4gMCk7Ci0JCQotCQkvL1RPRE8gQ2hlY2sgdGhhdCB0aGUgY2xpZW50IHJ1bnMgICAgCi0KLQl9Ci0JCi0gIC8qKgotICAgKiBSZW1vdmUgd29ya3NwYWNlIGlmIG5lY2Vzc2FyeQotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBEZWxldGUgdGhlIFdlYiBwcm9qZWN0LgotCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KENMSUVOVF9QUk9KRUNUX05BTUUpOwotCQl3ZWJQcm9qZWN0LmRlbGV0ZSh0cnVlLHRydWUsIG51bGwpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQ29tcG9uZW50Q3JlYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9Db21wb25lbnRDcmVhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDMzMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9Db21wb25lbnRDcmVhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MTA0ICAgMTE0ODM1IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdC5hcGl0b29scy5Qcm9qZWN0VW56aXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGx1Z2luLlRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci0KLS8qKgotICogVGVzdHMgdGhlIHZhcmlvdXMgQ29tcG9uZW50IGNyZWF0aW9uIGNvbW1hbmRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRDcmVhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBXU0pVbml0Q29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDb21wb25lbnRDcmVhdGlvblRlc3RzLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFdlYkNvbXBvbmVudENyZWF0aW9uKCl7Ci0KLSAgICAgICAgY3JlYXRlU2VydmVyUnVudGltZSgpOwotICAgICAgICBjcmVhdGVEeW5hbWljV2ViTW9kdWxlKHByb2plY3ROYW1lcyk7Ci0gICAgICAgIC8vY3JlYXRlUHJvamVjdHMoKTsKLSAgICAgICAgLy9jcmVhdGVXZWJNb2R1bGUocHJvamVjdE5hbWUsIHByb2plY3ROYW1lLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0gICAgICAgIC8vY3JlYXRlV2ViTW9kdWxlKHByb2plY3QyTmFtZSwgcHJvamVjdDJOYW1lLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0KLQl9Ci0gIAotCS8vIENyZWF0ZXMgcHJvamVjdHMgZnJvbSB0aGUgcHJvdmlkZWQgWklQIGZpbGUuCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZVByb2plY3RzKCkgewotCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBwcm9qZWN0TmFtZXMpOwotCQlyZXR1cm4gdXRpbC5jcmVhdGVQcm9qZWN0cygpOwotCX0KLQkKLQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldExvY2FsUGF0aCgpIHsKLQkJVVJMIHVybCA9IFRlc3RzUGx1Z2luLmdldERlZmF1bHQoKS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQkKLSAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU2VydmVyUnVudGltZSgpewotICAgICAgCi0gICAgICB0cnkgewotICAgICAgICBKVW5pdFV0aWxzLmNyZWF0ZVNlcnZlclJ1bnRpbWUoUlVOVElNRVRZUEVJRF9UQzUwLCBTRVJWRVJfSU5TVEFMTF9QQVRIKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0gICAgICAKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVEeW5hbWljV2ViTW9kdWxlKFN0cmluZ1tdIHByb2plY3ROYW1lcyl7Ci0gICAgCQotICAgICAgZm9yIChpbnQgaT0wO2k8cHJvamVjdE5hbWVzLmxlbmd0aDtpKyspIHsKLSAgICAJICBDcmVhdGVNb2R1bGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlTW9kdWxlQ29tbWFuZCgpOwotCSAgCSAgY29tbWFuZC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZXNbaV0pOwotCSAgCSAgY29tbWFuZC5zZXRNb2R1bGVOYW1lKHByb2plY3ROYW1lc1tpXSk7CQkJCi0JICAJICBjb21tYW5kLnNldE1vZHVsZVR5cGUoQ3JlYXRlTW9kdWxlQ29tbWFuZC5XRUIpOwotCSAgCSAgY29tbWFuZC5zZXRTZXJ2ZXJGYWN0b3J5SWQoU0VSVkVSVFlQRUlEX1RDNTApOwotCSAgCSAgY29tbWFuZC5zZXRKMmVlTGV2ZWwobmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpLnRvU3RyaW5nKCkpOwotCSAgCSAgY29tbWFuZC5leGVjdXRlKCBudWxsLCBudWxsICkgOwotCi0JICAgICAgSVByb2plY3QgcCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWVzW2ldKTsKLQkgICAgICBhc3NlcnRUcnVlKHAuZXhpc3RzKCkpOwotICAgICAgfQotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgZHRlc3RDcmVhdGVFSkJNb2R1bGUoKXsKLSAgICAgCi0gICAgICBDcmVhdGVNb2R1bGVDb21tYW5kIGNtYyA9IG5ldyBDcmVhdGVNb2R1bGVDb21tYW5kKCk7Ci0gICAgICBjbWMuc2V0SjJlZUxldmVsKG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKS50b1N0cmluZygpKTsKLSAgICAgIGNtYy5zZXRNb2R1bGVOYW1lKGVqYkNvbXBvbmVudE5hbWUpOwotICAgICAgY21jLnNldE1vZHVsZVR5cGUoQ3JlYXRlTW9kdWxlQ29tbWFuZC5FSkIpOwotICAgICAgY21jLnNldFByb2plY3ROYW1lKGVqYlByb2plY3ROYW1lKTsKLSAgICAgIGNtYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoU0VSVkVSVFlQRUlEX1RDNTApOwotICAgICAgY21jLmV4ZWN1dGUobnVsbCwgbnVsbCApOwotICAgICAgCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgY3JlYXRpbmcgRUpCIGNvbXBvbmVudC4iKTsKLSAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGVqYlByb2plY3ROYW1lKTsKLSAgICAgIGFzc2VydFRydWUocC5leGlzdHMoKSk7ICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGR0ZXN0Q3JlYXRlQXBwQ2xpZW50TW9kdWxlKCl7Ci0gICAgICBDcmVhdGVNb2R1bGVDb21tYW5kIGNtYyA9IG5ldyBDcmVhdGVNb2R1bGVDb21tYW5kKCk7Ci0gICAgICBjbWMuc2V0SjJlZUxldmVsKG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKS50b1N0cmluZygpKTsKLSAgICAgIGNtYy5zZXRNb2R1bGVOYW1lKGFwcENsaWVudENvbXBOYW1lKTsKLSAgICAgIGNtYy5zZXRNb2R1bGVUeXBlKENyZWF0ZU1vZHVsZUNvbW1hbmQuQVBQQ0xJRU5UKTsKLSAgICAgIGNtYy5zZXRQcm9qZWN0TmFtZShhcHBDbGllbnRQcm9qZWN0TmFtZSk7Ci0gICAgICBjbWMuc2V0U2VydmVyRmFjdG9yeUlkKFNFUlZFUlRZUEVJRF9UQzUwKTsKLSAgICAgIGNtYy5leGVjdXRlKG51bGwsIG51bGwpOwotICAgICAgCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgY3JlYXRpbmcgQXBwIGNsaWVudCBjb21wb25lbnQuIik7Ci0gICAgICBJUHJvamVjdCBwID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChhcHBDbGllbnRQcm9qZWN0TmFtZSk7Ci0gICAgICBhc3NlcnRUcnVlKHAuZXhpc3RzKCkpOyAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdGVzdENyZWF0ZUVBUk1vZHVsZSgpewotICAgICAgQ3JlYXRlTW9kdWxlQ29tbWFuZCBjbWMgPSBuZXcgQ3JlYXRlTW9kdWxlQ29tbWFuZCgpOwotICAgICAgY21jLnNldEoyZWVMZXZlbChuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkudG9TdHJpbmcoKSk7Ci0gICAgICBjbWMuc2V0TW9kdWxlTmFtZShlYXJDb21wTmFtZSk7Ci0gICAgICBjbWMuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLkVBUik7Ci0gICAgICBjbWMuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgY21jLnNldFNlcnZlckZhY3RvcnlJZChTRVJWRVJUWVBFSURfVEM1MCk7Ci0gICAgICBjbWMuZXhlY3V0ZShudWxsLCBudWxsKTsKLSAgICAgIAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIGNyZWF0aW5nIEVBUiBjb21wb25lbnQuIik7Ci0gICAgICBJUHJvamVjdCBwID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICBhc3NlcnRUcnVlKHAuZXhpc3RzKCkpOyAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L0oyRUVVdGlsc1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L0oyRUVVdGlsc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTc3YTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9KMkVFVXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzEwNCAgIDExNDgzNSBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudW5pdHRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5Bc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3Igc2VuZ3BsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVV0aWxzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIFdTSlVuaXRDb25zdGFudHN7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3QxID0gbnVsbDsKLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3QyID0gbnVsbDsKLSAgICBwcml2YXRlIElQcm9qZWN0IGVqYlByb2plY3QgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGNvbXAxID0gd2ViQ29tcG9uZW50TmFtZTsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkKLQkJLy8gUHJvamVjdCBhbmQgY29tcG9uZW50IG5hbWVzIGluaXRpYWxpemVkIGhlcmUhCi0JCXByb2plY3QxID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0MSk7Ci0JCQotCQlwcm9qZWN0MiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0Mk5hbWUpOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3QyKTsKLSAgICAKLSAgICAgICAgZWpiUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlamJQcm9qZWN0TmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWpiUHJvamVjdCk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCS8vIFRPRE8gQ2xlYXIgdGhlIHdvcmtzcGFjZQotCQkKLQl9Ci0KLQkgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLQkgIHsKLQkgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoSjJFRVV0aWxzVGVzdHMuY2xhc3MpOwotCSAgfQotCSAKLQkgIHB1YmxpYyB2b2lkIHRlc3RDb21wb25lbnRzRXhpc3QoKXsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgQkVHSU46IHRlc3RDb21wb25lbnRFeGlzdHMgLi4uIik7Ci0JCSAgSVZpcnR1YWxDb21wb25lbnQgdmMxID0gSjJFRVV0aWxzLmdldFZpcnR1YWxDb21wb25lbnQocHJvamVjdDEpOwotCQkgIElWaXJ0dWFsQ29tcG9uZW50IHZjMiA9IEoyRUVVdGlscy5nZXRWaXJ0dWFsQ29tcG9uZW50KHByb2plY3QyLmdldE5hbWUoKSk7Ci0JCSAgCi0JCSAgYXNzZXJ0VHJ1ZSh2YzEuZXhpc3RzKCkpOwotCQkgIGFzc2VydFRydWUoSjJFRVV0aWxzLmV4aXN0cyhwcm9qZWN0MSkpOwotCQkgIGFzc2VydFRydWUodmMyLmV4aXN0cygpKTsKLQkJICBhc3NlcnRUcnVlKEoyRUVVdGlscy5leGlzdHMocHJvamVjdDIuZ2V0TmFtZSgpLCBwcm9qZWN0Mk5hbWUpKTsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgRU5EOiB0ZXN0Q29tcG9uZW50RXhpc3RzIC4uLiIpOwotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25HZXR0ZXJNZXRob2RzKCl7Ci0JCSAgCi0JCSAgU3lzdGVtLm91dC5wcmludGxuKCI8IEJFR0lOOiB0ZXN0TG9jYXRpb25HZXR0ZXJNZXRob2RzIC4uLiIpOwotCQkgIElQYXRoIGxvYzEgPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdDEpOwotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViQ29udGVudFBhdGggb2YgcHJvamVjdDEgPSAiK2xvYzEpOwotCQkgIElSZXNvdXJjZSByZXMgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGxvYzEpOwotCQkgIGFzc2VydFRydWUocmVzLmV4aXN0cygpKTsKLQkJICBhc3NlcnRUcnVlKHJlcy50b1N0cmluZygpLmVuZHNXaXRoKCJXZWJDb250ZW50IikpOwotCQkgIAotCQkgIElQYXRoIGxvYzIgPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdDIpOwotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViQ29udGVudFBhdGggb2YgcHJvamVjdDIgPSAiK2xvYzIpOwotCQkgIElSZXNvdXJjZSByZXMyID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZmluZE1lbWJlcihsb2MyKTsKLQkJICBhc3NlcnRUcnVlKHJlczIuZXhpc3RzKCkpOwotCQkgIGFzc2VydFRydWUocmVzMi50b1N0cmluZygpLmVuZHNXaXRoKCJXZWJDb250ZW50IikpOwkJICAKLQkJICAKLQkJICBJUGF0aCBsb2MzID0gSjJFRVV0aWxzLmdldFdlYkluZlBhdGgocHJvamVjdDEpOwotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViLUlORiBwYXRoID0gIitsb2MzKTsKLQkJICBJUmVzb3VyY2UgcmVzMyA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmZpbmRNZW1iZXIobG9jMyk7Ci0JCSAgYXNzZXJ0VHJ1ZShyZXMzLmV4aXN0cygpKTsKLQkJICBhc3NlcnRUcnVlKHJlczMudG9TdHJpbmcoKS5lbmRzV2l0aCgiV0VCLUlORiIpKTsKLQkJICAKLQkJICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50Q29udGFpbmVyKHByb2plY3QyKTsKLQkJICBJUmVzb3VyY2UgcmVzNCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmZpbmRNZW1iZXIoY29udGFpbmVyLmdldEZ1bGxQYXRoKCkpOwotCQkgIGFzc2VydEVxdWFscyhyZXMyLCByZXM0KTsKLQkJICAKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgRU5EOiB0ZXN0TG9jYXRpb25HZXR0ZXJNZXRob2RzIC4uLiIpOwotCQkgIAotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCB0ZXN0SjJFRVZlcnNpb25NZXRob2RzKCl7Ci0JCSAgCi0JCSAgU3lzdGVtLm91dC5wcmludGxuKCI8IEJFR0lOOiB0ZXN0SjJFRVZlcnNpb25NZXRob2RzIC4uLiIpOwotCSAgCQkgIAotCQkgIFN0cmluZyBqMyA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbkFzU3RyaW5nKHByb2plY3QxKTsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIkoyRUVWZXJzaW9uIHAxIGFzIFN0cmluZzogIitqMyk7Ci0JCSAgYXNzZXJ0RXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl80X1RFWFQsIGozKTsKLQkJICAKLQkJICBJVmlydHVhbENvbXBvbmVudCB2YzIgPSBKMkVFVXRpbHMuZ2V0VmlydHVhbENvbXBvbmVudChwcm9qZWN0Mik7Ci0JCSAgaW50IGoyID0gSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHZjMik7Ci0JCSAgU3lzdGVtLm91dC5wcmludGxuKCJKMkVFVmVyc2lvbnMgcDE6ICIrajIpOwkJICAKLQkJICBhc3NlcnRFcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuU0VSVkxFVF8yXzQsIGoyKTsKLQkJICAKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgRU5EOiB0ZXN0SjJFRVZlcnNpb25NZXRob2RzIC4uLiIpOwotCSAgfQotCi0JICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9uZW50R2V0dGVyTWV0aG9kcygpewotCQkgIAotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBCRUdJTjogdGVzdENvbXBvbmVudEdldHRlck1ldGhvZHMgLi4uIik7Ci0JCSAgCi0JCSAgSVZpcnR1YWxDb21wb25lbnRbXSB2Y3MgPSBKMkVFVXRpbHMuZ2V0QWxsQ29tcG9uZW50cygpOwotCQkgIGNoZWNrVmlydHVhbENvbXBvbmVudHNFeGlzdHModmNzKTsKLQkJICAKLQkJICBJVmlydHVhbENvbXBvbmVudFtdIHZjczIgPSBKMkVFVXRpbHMuZ2V0QWxsRUFSQ29tcG9uZW50cygpOwotCQkgIGNoZWNrVmlydHVhbENvbXBvbmVudHNFeGlzdHModmNzMik7Ci0JCSAgCi0JCSAgSVZpcnR1YWxDb21wb25lbnRbXSB2Y3MzID0gSjJFRVV0aWxzLmdldEFsbFdlYkNvbXBvbmVudHMoKTsKLQkJICBjaGVja1ZpcnR1YWxDb21wb25lbnRzRXhpc3RzKHZjczMpOwotCQkgIAotCQkgIElWaXJ0dWFsQ29tcG9uZW50W10gdmNzNCA9IEoyRUVVdGlscy5nZXRXZWJDb21wb25lbnRzKHByb2plY3QxKTsKLQkJICBjaGVja1ZpcnR1YWxDb21wb25lbnRzRXhpc3RzKHZjczQpOwotCQkgIAotCQkgIFN0cmluZ1tdIG5hbWVzID0gSjJFRVV0aWxzLmdldFdlYkNvbXBvbmVudE5hbWVzKHByb2plY3QyKTsKLQkJICBwcmludE5hbWVTdHJpbmdzKG5hbWVzKTsKLQkJICAKLQkJICBTdHJpbmdbXSBuYW1lczIgPSBKMkVFVXRpbHMudG9Db21wb25lbnROYW1lc0FycmF5KEoyRUVVdGlscy5nZXRDb21wb25lbnRzQnlUeXBlKHByb2plY3QxLCBKMkVFVXRpbHMuV0VCIHwgSjJFRVV0aWxzLkVKQikpOwotCQkgIHByaW50TmFtZVN0cmluZ3MobmFtZXMyKTsKLQkJICAKLQkJICBJUHJvamVjdFtdIHByb2plY3RzID0gSjJFRVV0aWxzLmdldEFsbEZsZXhpYmxlUHJvamVjdHMoKTsKLQkJICBmb3IgKGludCBpPTA7aTxwcm9qZWN0cy5sZW5ndGg7aSsrKXsKLQkJCSAgU3lzdGVtLm91dC5wcmludGxuKCJGbGV4IHByb2plY3QgIitpKyIgPSAiK3Byb2plY3RzW2ldKTsKLQkJICB9Ci0JCSAgCi0JCSAgU3lzdGVtLm91dC5wcmludGxuKCI8IEVORDogdGVzdENvbXBvbmVudEdldHRlck1ldGhvZHMgLi4uIik7Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgdm9pZCBjaGVja1ZpcnR1YWxDb21wb25lbnRzRXhpc3RzKElWaXJ0dWFsQ29tcG9uZW50W10gdmNzKXsKLQkJICBmb3IgKGludCBpPTA7IGk8dmNzLmxlbmd0aDtpKyspewotCQkJICBJVmlydHVhbENvbXBvbmVudCB2YyA9IHZjc1tpXTsKLQkJCSAgU3lzdGVtLm91dC5wcmludGxuKCJWQzogUHJvamVjdCA9ICIrdmMuZ2V0UHJvamVjdCgpKyIgTmFtZSA9ICIrdmMuZ2V0TmFtZSgpKTsKLQkJCSAgYXNzZXJ0VHJ1ZSh2Yy5leGlzdHMoKSk7Ci0JCQkgIAotCQkgIH0KLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSB2b2lkIHByaW50TmFtZVN0cmluZ3MoU3RyaW5nW10gbmFtZXMpewotCQkgIGZvciAoaW50IGk9MDtpPG5hbWVzLmxlbmd0aDtpKyspewotCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWUiK2krIiA9ICIrbmFtZXNbaV0pOwotCQkgIH0KLQkgIH0KLQkgIAotICAgICAgcHVibGljIHZvaWQgZHRlc3RBc3NvY2lhdGVDb21wb25lbnRDb21tYW5kKCl7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgQkVHSU46IHRlc3RBc3NvY2lhdGVDb21wb25lbnRDb21tYW5kIC4uLiIpOwotICAgICAgICAKLSAgICAgICAgQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQgYW13ZSA9IG5ldyBBc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZCgpOwotICAgICAgICBhbXdlLnNldEVhcihlYXJDb21wTmFtZSk7Ci0gICAgICAgIGFtd2Uuc2V0RUFSUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGFtd2Uuc2V0TW9kdWxlKGNvbXAxKTsKLSAgICAgICAgYW13ZS5zZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgYW13ZS5leGVjdXRlKG51bGwsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8IEVORDogdGVzdEFzc29jaWF0ZUNvbXBvbmVudENvbW1hbmQgLi4uIik7ICAgICAKLSAgICAgIH0KLSAgICAKLQkgIHB1YmxpYyB2b2lkIGR0ZXN0UmVmZXJlbmNpbmdHZXR0ZXJNZXRob2RzKCl7Ci0JCSAgCi0JCSAgU3lzdGVtLm91dC5wcmludGxuKCI8IEJFR0lOOiB0ZXN0UmVmZXJlbmNpbmdHZXR0ZXJNZXRob2RzIC4uLiIpOwotCQkgIAotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiaXNDb21wb25lbnRBc3NvY2lhdGVkIC4uIik7Ci0JCSAgSjJFRVV0aWxzLmlzQ29tcG9uZW50QXNzb2NpYXRlZChwcm9qZWN0MSwgcHJvamVjdDEpOwotCQkKLQkJICBTdHJpbmdbXSBuYW1lcyA9IEoyRUVVdGlscy50b0NvbXBvbmVudE5hbWVzQXJyYXkoSjJFRVV0aWxzLmdldFJlZmVyZW5jaW5nRUFSQ29tcG9uZW50cyhwcm9qZWN0MSkpOwotCQkgIHByaW50TmFtZVN0cmluZ3MobmFtZXMpOwotCQkgIFN0cmluZ1tdIG5hbWVzMiA9IEoyRUVVdGlscy50b0NvbXBvbmVudE5hbWVzQXJyYXkoSjJFRVV0aWxzLmdldFJlZmVyZW5jaW5nRUFSQ29tcG9uZW50cyhwcm9qZWN0MikpOwotCQkgIHByaW50TmFtZVN0cmluZ3MobmFtZXMyKTsKLQkJICAKLQkJICBTdHJpbmdbXSBuYW1lczMgPSBKMkVFVXRpbHMudG9Db21wb25lbnROYW1lc0FycmF5KEoyRUVVdGlscy5nZXRSZWZlcmVuY2luZ1dlYkNvbXBvbmVudHNGcm9tRUFSKHByb2plY3QxKSk7Ci0JCSAgcHJpbnROYW1lU3RyaW5ncyhuYW1lczMpOwotCQkgIAotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBFTkQ6IHRlc3RSZWZlcmVuY2luZ0dldHRlck1ldGhvZHMgLi4uIik7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIGR0ZXN0SXNDb21wb25lbnRNZXRob2RzKCl7Ci0JCQotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBCRUdJTjogdGVzdElzQ29tcG9uZW50TWV0aG9kcyAuLi4iKTsKLQkJICAKLQkJICAvL2Fzc2VydEZhbHNlKEoyRUVVdGlscy5pc0VKQjIwQ29tcG9uZW50KGVqYlByb2plY3QsIGVqYkNvbXBvbmVudE5hbWUpKTsKLQkJICBhc3NlcnRUcnVlKEoyRUVVdGlscy5pc0VKQjIwQ29tcG9uZW50KGVqYlByb2plY3QpKTsKLQkJICAKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgRU5EOiB0ZXN0SXNDb21wb25lbnRNZXRob2RzIC4uLiIpOwotCSAgfQotCSAgCi0KLQkgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9MYXVuY2hUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L0xhdW5jaFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMyZjZhYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L0xhdW5jaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotCi0vKioKLSAqIE1pbmltYWwgYXBwIHRvIHJ1biBhcyBFY2xpcHNlICJhcHBsaWNhdGlvbiIKLSAqLwotcHVibGljIGNsYXNzIExhdW5jaFRlc3QgaW1wbGVtZW50cyBJUGxhdGZvcm1SdW5uYWJsZQotewotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsYXRmb3JtUnVubmFibGUjcnVuKE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgcnVuKE9iamVjdCBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQotICAgIE9iamVjdCByZXN1bHQgPSBuZXcgQWxsV1NKVW5pdFRlc3RzKCkucnVuTWFpbihhcmdzKTsKLQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgVGhyb3dhYmxlKQotICAgICAgewotICAgICAgICAoKFRocm93YWJsZSkgcmVzdWx0KS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0cyBkaWRuJ3QgcmV0dXJuICdvayciKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1Jlc291cmNlVXRpbHNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9SZXNvdXJjZVV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliOGVmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1Jlc291cmNlVXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3Igc2VsZWN0aXZlIFJlc291cmNlVXRpbHMgbWV0aG9kcy4gIENhbGxzIHdoaWNoIHJldHVybiBhIHNpbXBsZSBTdHJpbmcgb3IgcmVseSBvbiBhIElSZXNvdXJjZQotICogQVBJIG5lZWQgbm90IGJlIHRlc3RlZC4gIFRoZSBmb2N1cyBpcyBtYWlubHkgdG8gZXhlcmNpc2UgQ29tcG9uZW50IGFuZCBGbGV4aWJsZSBwcm9qZWN0IEFQSXMuIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVV0aWxzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIFdTSlVuaXRDb25zdGFudHN7Ci0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXNvdXJjZVV0aWxzVGVzdHMuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9uZW50VHlwZSgpewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBSZXNvdXJjZVV0aWxzLmdldENvbXBvbmVudFR5cGUocHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFLCBjb21wb25lbnRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBvbmVudE9mKCl7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJUGF0aCBkZXN0UGF0aCA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKHByb2plY3QpOwotICAgICAgICBJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGRlc3RQYXRoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dCA9IFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEVjbGlwc2VTdGF0dXNIYW5kbGVyICAgICAgIGhhbmRsZXIgICAgICAgICA9IG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpOwotICAgICAgICAgICAgRWNsaXBzZUVudmlyb25tZW50ICAgICAgICAgZW52ICAgICA9IG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoIG51bGwsIHJlc291cmNlQ29udGV4dCwgaGFuZGxlciApOwotCi0gICAgICAgICAgICBJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUobmV3IFBhdGgoImZvby9FY2hvLmphdmEiKSk7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgSlVuaXRVdGlscy5jb3B5VGVzdERhdGEoIkJVSmF2YS9zcmMiLCBmb2xkZXIsIGVudiwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpewotICAgICAgICAJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJUGF0aCBqYXZhRmlsZVBhdGggPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiZm9vL0VjaG8uamF2YSIpKS5nZXRGdWxsUGF0aCgpOwotICAgICAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YoamF2YUZpbGVQYXRoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2Yy5leGlzdHMoKSk7Ci0gICAgICAgIAotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFTb3VyY2VMb2NhdGlvbigpewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJU3RyaW5nIGphdmFTb3VyY2VMb2MgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbihwcm9qZWN0KS50b1N0cmluZygpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkphdmEgc291cmNlIGxvY2F0aW9uID0gIitqYXZhU291cmNlTG9jKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhU291cmNlTG9jLmVuZHNXaXRoKCJzcmMiKSk7Ci0JCQotCQkvLyBnZXQgYWxsIHRoZSBKYXZhU291cmNlTG9jYXRpb25zIHZpYSB0aGUgVmlydHVhbENvbXBvbmVudAotCQlJVmlydHVhbENvbXBvbmVudCB2YzEgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmMyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50W10gdmNzID0gbmV3IElWaXJ0dWFsQ29tcG9uZW50W117dmMxLCB2YzJ9OwotCQlJUGF0aFtdIHBhdGhzID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHZjcyk7Ci0JCQotCQkvLyB2ZXJpZnkgZmlyc3QgZm9sZGVyIGV4aXN0cwotCQlJUGF0aCBwYXRoMSA9IChJUGF0aClwYXRoc1swXTsKLQkJSVJlc291cmNlIHJlc291cmNlICA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHBhdGgxKTsKLQkJaWYgKHJlc291cmNlLmV4aXN0cygpKXsKLQkJCWFzc2VydEVxdWFscyhJUmVzb3VyY2UuRk9MREVSLCByZXNvdXJjZS5nZXRUeXBlKCkpOwotCQl9Ci0KLQkJLy8gdmVyaWZ5IHNlY29uZCBmb2xkZXIgZXhpc3RzCi0JCUlQYXRoIHBhdGgyID0gKElQYXRoKXBhdGhzWzFdOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UyICA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHBhdGgyKTsKLQkJaWYgKHJlc291cmNlMi5leGlzdHMoKSl7Ci0JCQlhc3NlcnRFcXVhbHMoSVJlc291cmNlLkZPTERFUiwgcmVzb3VyY2UyLmdldFR5cGUoKSk7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0V2ViQ29tcG9uZW50U2VydmVyUm9vdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gUmVzb3VyY2VVdGlscy5nZXRXZWJDb21wb25lbnRTZXJ2ZXJSb290KHByb2plY3QpOwotCQlhc3NlcnRUcnVlKGZvbGRlci5leGlzdHMoKSk7Ci0JCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9TZXJ2ZXJDcmVhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1NlcnZlckNyZWF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2ZDA0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1NlcnZlckNyZWF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzEwNCAgIDExNDgzNSBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudW5pdHRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlU2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyQ3JlYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgV1NKVW5pdENvbnN0YW50c3sKLQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlcnZlckNyZWF0aW9uVGVzdHMuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KCl7Ci0JICAgIHRyeSB7Ci0gICAgICAgICAgYXNzZXJ0Tm90TnVsbChTRVJWRVJfSU5TVEFMTF9QQVRIKTsgICAgICAgICAgCi0JICAgICAgSlVuaXRVdGlscy5jcmVhdGVTZXJ2ZXJSdW50aW1lKFJVTlRJTUVUWVBFSURfVEM1MCwgU0VSVkVSX0lOU1RBTExfUEFUSCk7Ci0JICAgIH0KLQkgICAgY2F0Y2goRXhjZXB0aW9uIGUpewotCSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICAgIH0gCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUb21jYXR2NVNlcnZlcigpewotCQlpbml0KCk7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIFRvbWNhdCB2NSBzZXJ2ZXIuIik7Ci0JCUNyZWF0ZVNlcnZlckNvbW1hbmQgY3NjID0gbmV3IENyZWF0ZVNlcnZlckNvbW1hbmQoKTsKLQkJY3NjLnNldFNlcnZlckZhY3RvcnlpZChTRVJWRVJUWVBFSURfVEM1MCk7Ci0JCWNzYy5leGVjdXRlKG51bGwsIG51bGwgKTsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJU3RyaW5nIGluc3RJZCA9IGNzYy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyIGluc3RhbmNlIElkID0gIitpbnN0SWQpOwotCQlpZiAoaW5zdElkIT1udWxsKXsKLQkJICBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoaW5zdElkKTsKLQkJfQotCQlhc3NlcnROb3ROdWxsKHNlcnZlcik7Ci0JCQotCQl0cnkgewotCQkJc2VydmVyLmRlbGV0ZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKXsKLQkJCW5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigpOwotCQl9Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgY3JlYXRpbmcgVG9tY2F0IHY1IHNlcnZlci4iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlYXR0ZW1wdENyZWF0ZVRvbWNhdHY1U2VydmVyKCl7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQXR0ZW1wdGluZyB0byBjcmVhdGUgMm5kIFRvbWNhdCB2NSBzZXJ2ZXIuIik7Ci0JCUNyZWF0ZVNlcnZlckNvbW1hbmQgY3NjID0gbmV3IENyZWF0ZVNlcnZlckNvbW1hbmQoKTsKLQkJY3NjLnNldFNlcnZlckZhY3RvcnlpZChTRVJWRVJUWVBFSURfVEM1MCk7Ci0JCWNzYy5leGVjdXRlKG51bGwsIG51bGwgKTsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJU3RyaW5nIGluc3RJZCA9IGNzYy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0JCWlmIChpbnN0SWQhPW51bGwpIHsKLQkJICBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoaW5zdElkKTsKLQkJfQotCQlhc3NlcnROb3ROdWxsKHNlcnZlcik7Ci0JCQotCQl0cnkgewotCQkJc2VydmVyLmRlbGV0ZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKXsKLQkJCW5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigpOwotCQl9Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgYXR0ZW1wdGluZyAybmQgVG9tY2F0IHY1IHNlcnZlciBjcmVhdGlvbi4iKTsJCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvVERKYXZhQXhpc1RDNTAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvVERKYXZhQXhpc1RDNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiYmU5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1RESmF2YUF4aXNUQzUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEwNCAgIDExNDgzNSBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDcwMjAyICAgMTcyNjE1IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLldTV2l6YXJkVG9tY2F0NTBUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuU2NlbmFyaW9Db25zdGFudHM7Ci0KLS8qKgotICogVG9wIGRvd24gcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzIGFuZCBUb21jYXQgdjUuMAotICovCi1wdWJsaWMgY2xhc3MgVERKYXZhQXhpc1RDNTAgZXh0ZW5kcyBXU1dpemFyZFRvbWNhdDUwVGVzdCB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NfUlVOVElNRUlEX0FYSVMgPSBXU0pVbml0Q29uc3RhbnRzLldTX1JVTlRJTUVJRF9BWElTOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgUFJPSkVDVF9OQU1FID0gV1NKVW5pdENvbnN0YW50cy5URF9QUk9KRUNUX05BTUU7Ci0gIAotICBwcml2YXRlIElGaWxlIHNvdXJjZUZpbGVfOwotCQotCQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVERKYXZhQXhpc1RDNTAuY2xhc3MpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb257Ci0JICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQkgICAgaWYgKCF3ZWJQcm9qZWN0LmV4aXN0cygpKXsKLQkgICAgICBjcmVhdGVXZWJNb2R1bGUoUFJPSkVDVF9OQU1FLCBQUk9KRUNUX05BTUUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCSAgICB9Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWJNb2R1bGUoU3RyaW5nIHByb2plY3RObSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIGludCBqMmVlVmVyc2lvbil7Ci0KLQkgICAgQ3JlYXRlTW9kdWxlQ29tbWFuZCBjbWMgPSBuZXcgQ3JlYXRlTW9kdWxlQ29tbWFuZCgpOwotCSAgICBjbWMuc2V0SjJlZUxldmVsKG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uKS50b1N0cmluZygpKTsKLQkgICAgY21jLnNldE1vZHVsZU5hbWUoY29tcG9uZW50TmFtZSk7Ci0JICAgIGNtYy5zZXRNb2R1bGVUeXBlKENyZWF0ZU1vZHVsZUNvbW1hbmQuV0VCKTsKLQkgICAgY21jLnNldFByb2plY3ROYW1lKHByb2plY3RObSk7Ci0JICAgIGNtYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoU0VSVkVSVFlQRUlEX1RDNTApOwotCSAgICBjbWMuc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJfLmdldElkKCkpOwotCSAgICBjbWMuZXhlY3V0ZShudWxsLCBudWxsICk7Ci0JICAgIAotCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgY3JlYXRpbmcgV2ViIFByb2plY3QsICIrcHJvamVjdE5tKTsgICAgICAKLQkgICAKLQkgIH0gIAotCSAgCi0gIC8qKgotICAgKiBTZXRzIHVwIHRoZSBpbnB1dCBkYXRhOwotICAgKiAtIGNyZWF0ZSBwcm9qZWN0KHMpLAotICAgKiAtIGNvcHkgcmVzb3VyY2VzIHRvIHdvcmtzcGFjZSAKLSAgICovICAKLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwkJCi0JCUlGb2xkZXIgZGVzdEZvbGRlciA9IChJRm9sZGVyKUoyRUVVdGlscy5nZXRXZWJDb250ZW50Q29udGFpbmVyKHdlYlByb2plY3QpOwotCQlKVW5pdFV0aWxzLmNvcHlUZXN0RGF0YSgiVERKYXZhIixkZXN0Rm9sZGVyLGVudl8sIG51bGwpOwotCQlzb3VyY2VGaWxlXyA9IGRlc3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiRWNoby53c2RsIikpOwotCQlKVW5pdFV0aWxzLnN5bmNCdWlsZFByb2plY3Qod2ViUHJvamVjdCxlbnZfLCBudWxsKTsKLQl9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcGVyc2lzdGVudCBzZXJ2ZXIgcnVudGltZSBjb250ZXh0IHByZWZlcmVuY2VzCi0gICAqLyAgCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEoyRUVXU1J1bnRpbWVTZXJ2ZXJEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTZXQgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgQXhpcyBhbmQgVG9tY2F0IHY1LjAgc2VydmVyCi0JCUpVbml0VXRpbHMuc2V0V1NSdW50aW1lU2VydmVyKFdTX1JVTlRJTUVJRF9BWElTLCBTRVJWRVJUWVBFSURfVEM1MCk7CQkKLQl9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICovICAKLQlwcm90ZWN0ZWQgdm9pZCBpbml0SW5pdGlhbFNlbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlpbml0aWFsU2VsZWN0aW9uXyA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNvdXJjZUZpbGVfKTsKLQotCX0KLQotICAvKioKLSAgICogTGF1bmNoZXMgdGhlIHBvcC11cCBjb21tYW5kIHRvIGluaXRpYXRlIHRoZSBzY2VuYXJpbwotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8gIAotCXB1YmxpYyB2b2lkIHRlc3RUREphdmFBeGlzVEM1MCgpIHRocm93cyBFeGNlcHRpb24gewotCSAgCi0JICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JICBKVW5pdFV0aWxzLnNldFREU2NlbmFyaW9EZWZhdWx0cygpOwotCi0JICBzdGF0dXMgPSBKVW5pdFV0aWxzLmxhdW5jaENyZWF0aW9uV2l6YXJkKFNjZW5hcmlvQ29uc3RhbnRzLldJWkFSRElEX1RPUF9ET1dOLFNjZW5hcmlvQ29uc3RhbnRzLk9CSkVDVF9DTEFTU19JRF9JRklMRSxpbml0aWFsU2VsZWN0aW9uXyk7Ci0JICAKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5PSykKLQkJICB2ZXJpZnlPdXRwdXQoKTsKLQkJZWxzZSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIHNjZW5hcmlvIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHZlcmlmeU91dHB1dCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0gICAgICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsgICAgCi0gICAgICAgIElGb2xkZXIgd2ViQ29udGVudEZvbGRlciA9IChJRm9sZGVyKUoyRUVVdGlscy5nZXRXZWJDb250ZW50Q29udGFpbmVyKHdlYlByb2plY3QpOyAgICAKLSAgICAKLQkJCi0JCUlGb2xkZXIgd3NkbEZvbGRlciA9IHdlYkNvbnRlbnRGb2xkZXIuZ2V0Rm9sZGVyKCJ3c2RsIik7Ci0JCWFzc2VydFRydWUod3NkbEZvbGRlci5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUod3NkbEZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID4gMCk7Ci0KLSAgICAgICAgLy9UT0RPIFZlcmlmeSB0aGF0IHdzZGQgY29udGFpbnMgdGhpcyBXZWIgc2VydmljZQotICAgICAgICAvL1RPRE8gVmVyaWZ5IHRoYXQgdGhlIHNlcnZpY2UgY2FuIGJlIGludm9rZWQgYnkgYSBjbGllbnQKLQl9Ci0JCi0gIC8qKgotICAgKiBDbGVhciB3b3Jrc3BhY2UgaWYgcmVxdWlyZWQKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERlbGV0ZSB0aGUgV2ViIHByb2plY3QuCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQkJd2ViUHJvamVjdC5kZWxldGUodHJ1ZSx0cnVlLG51bGwpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvV1NKVW5pdENvbnN0YW50cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9XU0pVbml0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTI5M2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9XU0pVbml0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgV1NKVW5pdENvbnN0YW50cyB7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZFUl9JTlNUQUxMX1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIik7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUlVOVElNRVRZUEVJRF9UQzUwID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiOwotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgV1NfUlVOVElNRUlEX0FYSVMgPSAib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgU0VSVkVSVFlQRUlEX1RDNTAgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyB3ZWJQcm9qZWN0TmFtZSA9ICJXZWJQcm9qZWN0IjsKLSAgCi0gIC8vIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlIDEKLSAgcHVibGljIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSA9ICJGbGV4UHJvamVjdCI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgd2ViQ29tcG9uZW50TmFtZSA9ICJ3ZWJDb21wb25lbnQiOwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHdlYkNvbXBvbmVudDJOYW1lID0gIndlYkNvbXAyIjsKLQotICAvLyBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZSAyCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgcHJvamVjdDJOYW1lID0gIkZsZXhQcm9qZWN0MiI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgd2ViQ29tcDNOYW1lID0gIndlYkNvbXAzIjsKLSAgcHVibGljIGZpbmFsIFN0cmluZyB3ZWJDb21wNE5hbWUgPSAid2ViQ29tcDQiOwotICAgIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGVqYlByb2plY3ROYW1lID0gIkZsZXhFSkJQcm9qZWN0IjsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBlamJDb21wb25lbnROYW1lID0gImVqYkNvbXBvbmVudCI7Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBhcHBDbGllbnRQcm9qZWN0TmFtZSA9ICJGbGV4QXBwQ2xpZW50UHJvamVjdCI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgYXBwQ2xpZW50Q29tcE5hbWUgPSAiYXBwQ2xpZW50Q29tcG9uZW50IjsgIAotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBlYXJDb21wTmFtZSA9ICJFQVJDb21wb25lbnQiOwotICAKLSAgcHVibGljIGZpbmFsIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgiL2RhdGEvV1NUZXN0UHJvamVjdHMuemlwIik7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW117cHJvamVjdE5hbWUsIHByb2plY3QyTmFtZX07Ci0gIAotICAvLyBwZXJmb3JtYW5jZSBjb25zdGFudHMKLSAgcHVibGljIGZpbmFsIFN0cmluZyBCVV9QUk9KRUNUX05BTUUgPSAiVGVzdFdlYiI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgVERfUFJPSkVDVF9OQU1FID0gIlRlc3RURFByb2plY3QiOwotICBwdWJsaWMgZmluYWwgU3RyaW5nIENMSUVOVF9QUk9KRUNUX05BTUUgPSAiVGVzdFdlYkNsaWVudCI7Ci0gIAotICBwdWJsaWMgZmluYWwgUGF0aCBwZXJmX3ppcEZpbGVQYXRoID0gbmV3IFBhdGgoIi9kYXRhL1dTUGVyZlByb2plY3RzLnppcCIpOwotICBwdWJsaWMgZmluYWwgU3RyaW5nW10gcGVyZl9wcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW117QlVfUFJPSkVDVF9OQU1FLCBURF9QUk9KRUNUX05BTUUsIENMSUVOVF9QUk9KRUNUX05BTUV9OwotIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9XZWJTZXJ2aWNlUnVudGltZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1dlYlNlcnZpY2VSdW50aW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhYzA0Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1dlYlNlcnZpY2VSdW50aW1lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjA1MTggICAxMjcxODkgcnNpbmhhQGNhLmlibS5jb20gLSBSdXBhbSBLdWVobmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5qcmVzLkpSRXNVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGwyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNU3RhbmRpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5GYWNldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5GYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uUmVxdWlyZWRGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5GYWNldE1hdGNoQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotLyoqCi0gKiBXZWJTZXJ2aWNlUnVudGltZVRlc3RzIGNvbnRhaW5zIHRoZSBKVW5pdCB0ZXN0cyB3aGljaCBjb3ZlciBwcm9qZWN0Ci0gKiBjcmVhdGlvbiwgcHJvamVjdCBmaWx0ZXJpbmcsIGFuZCBwcm9qZWN0IHR5cGUgZmlsdGVyaW5nIGZvciB0aGUgQXhpcwotICogV2ViIHNlcnZpY2UgcnVudGltZS4gSW4gb3JkZXIgZm9yIHRoZSB0ZXN0IHRvIHJ1biBzdWNjZXNzZnVsbHk6Ci0gKiA8b2w+Ci0gKiA8bGk+VGhlIEVjbGlwc2UgdGVzdCBlbnZpcm9ubWVudCBtdXN0IGJlIGxhdW5jaGVkIHdpdGggSkRLMS40LjI8L2xpPgotICogPGxpPlRoZSBmb2xsb3dpbmcgVk0gYXJndW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkOgotICogPHVsPgotICogICA8bGk+b3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTU6IHRoZSBpbnN0YWxsIGxvY2F0aW9uIG9mIGEgVG9tY2F0IDUuNSBzZXJ2ZXIsPGJyPiAKLSAqICAgZm9yIGV4YW1wbGUsIHVzZSAtRG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1PWQ6XGpha2FydGEtdG9tY2F0LTUuNS45Ci0gKiAgIDxsaT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MDogdGhlIGluc3RhbGwgbG9jYXRpb24gb2YgYSBUb21jYXQgNS4wIHNlcnZlciw8YnI+Ci0gKiAgIGZvciBleGFtcGxlLCB1c2UgLURvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MD1kOlxqYWthcnRhLXRvbWNhdC01LjAuMjggICAKLSAqICAgPGxpPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxOiB0aGUgaW5zdGFsbCBsb2NhdGlvbiBvZiBhIFRvbWNhdCA0LjEgc2VydmVyLDxicj4KLSAqICAgZm9yIGV4YW1wbGUsIHVzZSAtRG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxPWQ6XGpha2FydGEtdG9tY2F0LTQuMS4yOQotICogICA8bGk+amF2YS4xNS5pbnN0YWxsLnBhdGg6IHRoZSBpbnN0YWxsIGxvY2F0aW9uIG9mIGEgSmF2YSAxLjUgSkRLLDxicj4KLSAqICAgZm9yIGV4YW1wbGUsIHVzZSAtRGphdmEuMTUuaW5zdGFsbC5wYXRoPWQ6XGpkazEuNS4wXzAyCi0gKiA8L3VsPjwvbGk+Ci0gKiA8L29sPgotICogCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSdW50aW1lVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAKLSAgLy9TZXJ2ZXIgaW5zdGFsbCBwYXRocwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBTRVJWRVJfSU5TVEFMTF9QQVRIX1RDNTUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1Iik7ICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VSVkVSX0lOU1RBTExfUEFUSF9UQzUwID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIpOyAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFNFUlZFUl9JTlNUQUxMX1BBVEhfVEM0MSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiKTsKLSAgCi0gIC8vSkRLIDEuNSBpbnN0YWxsIGluZm8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSkFWQTE1X1ZNX0lOU1RBTExfUEFUSCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS4xNS5pbnN0YWxsLnBhdGgiKTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSkFWQTE1X1ZNX0lOU1RBTExfVFlQRSA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBKQVZBMTVfVk1fSU5TVEFMTF9OQU1FID0gIkphdmExNSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEpBVkExNV9WTV9JTlNUQUxMX0pBVkFET0MgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvYXBpLyI7Ci0gIAotICAvL1J1bnRpbWUgdHlwZSBpZHMgYW5zIHNlcnZlciB0eXBlIGlkcwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSVU5USU1FVFlQRUlEX1RDNTUgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFNFUlZFUlRZUEVJRF9UQzU1ID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUlVOVElNRVRZUEVJRF9UQzUwID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBTRVJWRVJUWVBFSURfVEM1MCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJVTlRJTUVUWVBFSURfVEM0MSA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VSVkVSVFlQRUlEX1RDNDEgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiOyAgCi0gIAotICAvL1J1bnRpbWUgaWRzIGZvciBydW50aW1lcyB0aGF0IHdpbGwgYmUgY3JlYXRlZAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSVU5USU1FSURfVEM1NSA9ICJUb21jYXQ1NVJ1bnRpbWUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSVU5USU1FSURfVEM1MCA9ICJUb21jYXQ1MFJ1bnRpbWUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSVU5USU1FSURfVEM0MSA9ICJUb21jYXQ0MVJ1bnRpbWUiOwotICAKLSAgLy9XZWIgc2VydmljZSBydW50aW1lIGV4dGVuc2lvbiBpZHMgZm9yIEF4aXMKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVhJU19SVU5USU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLmF4aXNXZWJTZXJ2aWNlUlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lNUExfSkFWQSA9ICJvcmcuZWNsaXBzZS5qc3Qud3Mud3NJbXBsLmphdmEiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBBWElTX1NFUlZJQ0VfUlVOVElNRSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi5qYXZhIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ0xJRU5UX0lNUExfSkFWQSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEFYSVNfQ0xJRU5UX1JVTlRJTUVfV0VCID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLndlYiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEFYSVNfQ0xJRU5UX1JVTlRJTUVfSkFWQSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5qYXZhIjsKLSAgCi0gIC8vVmFyaW91cyBjb25zdGFudHMgdXNlZCBieSB0aGUgdGVzdCBjYXNlIGZvciBpZGVudGlmeWluZyBzZXJ2aWNlL2NsaWVudCBzaWRlIGFuZCAKLSAgLy9mb3Igc2V0dGluZyBuYW1lcyBvbiBjcmVhdGVkIHByb2plY3RzLgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBTRVJWSUNFX1NJREUgPSAicyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIENMSUVOVF9TSURFID0gImMiOyAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9QUkVGSVggPSAidGMiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUVfU1VGRklYID0gInByb2plY3QiOwotICAKLSAgLy9JUHJvamVjdEZhY2V0VmVyc2lvbnMgdXNlZCBpbiB0aGUgZXhwZWN0ZWQgcmVzdWx0cwotICBwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFdFQjIzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKS5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8zX1RFWFQpOwotICBwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFdFQjI0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKS5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl80X1RFWFQpOwotICBwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkExNCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfSkFWQSkuZ2V0VmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKTsKLSAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBNTAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSUoyRUVNb2R1bGVDb25zdGFudHMuSlNUX0pBVkEpLmdldFZlcnNpb24oIjUuMCIpOwotICBwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFVUSUxJVFkxMCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9NT0RVTEUpLmdldFZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVCk7ICAKLSAgCi0gIHByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgVEVNUExBVEVfV0VCID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoSUoyRUVNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9URU1QTEFURSk7Ci0gIHByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgVEVNUExBVEVfVVRJTElUWSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFRlbXBsYXRlKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX1RFTVBMQVRFKTsKLSAgCi0gIHByaXZhdGUgaW50IG11bHRpcGxlc0ZvclByb2plY3RDcmVhdGlvbjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShXZWJTZXJ2aWNlUnVudGltZVRlc3RzLmNsYXNzKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYXNzZXJ0Tm90TnVsbChTRVJWRVJfSU5TVEFMTF9QQVRIX1RDNTUpOwotICAgICAgYXNzZXJ0Tm90TnVsbChTRVJWRVJfSU5TVEFMTF9QQVRIX1RDNTApOwotICAgICAgYXNzZXJ0Tm90TnVsbChTRVJWRVJfSU5TVEFMTF9QQVRIX1RDNDEpOwotICAgICAgYXNzZXJ0Tm90TnVsbChKQVZBMTVfVk1fSU5TVEFMTF9QQVRIKTsKLSAgICAgIAotICAgICAgLy9DcmVhdGUgYSBzZXJ2ZXIgcnVudGltZTogVG9tY2F0IDQuMSB3aXRoIEpESyAxLjQuMgotICAgICAgY3JlYXRlVG9tY2F0U2VydmVyUnVudGltZShSVU5USU1FSURfVEM0MSwgUlVOVElNRVRZUEVJRF9UQzQxLCBTRVJWRVJfSU5TVEFMTF9QQVRIX1RDNDEpOwotICAgICAgCi0gICAgICAvL0NyZWF0ZSBhIHNlcnZlciBydW50aW1lOiBUb21jYXQgNS4wIHdpdGggSkRLIDEuNC4yCi0gICAgICBjcmVhdGVUb21jYXRTZXJ2ZXJSdW50aW1lKFJVTlRJTUVJRF9UQzUwLCBSVU5USU1FVFlQRUlEX1RDNTAsIFNFUlZFUl9JTlNUQUxMX1BBVEhfVEM1MCk7Ci0gICAgICAKLSAgICAgIC8vQ3JlYXRlIGEgc2VydmVyIHJ1bnRpbWU6IFRvbWNhdCA1LjUgd2l0aCBKREsgMS41Ci0gICAgICBjcmVhdGVUb21jYXRTZXJ2ZXJSdW50aW1lKFJVTlRJTUVJRF9UQzU1LCBSVU5USU1FVFlQRUlEX1RDNTUsIFNFUlZFUl9JTlNUQUxMX1BBVEhfVEM1NSk7Ci0gICAgICAKLSAgICAgIAotICAgICAgCi0gICAgICBTdHJpbmcgbXVsdGlwbGVzID0gU3lzdGVtLmdldFByb3BlcnR5KCJtdWx0aXBsZXMiKTsgLy90aGlzIGlzIGFuIG9wdGlvbmFsIHByb3BlcnkgLSBkZWZhdWx0ZWQgdG8gMQotICAgICAgaWYgKG11bHRpcGxlcyAhPSBudWxsICYmIChJbnRlZ2VyLnBhcnNlSW50KG11bHRpcGxlcykgPiAwKSkKLSAgICAgIHsKLSAgICAgICAgbXVsdGlwbGVzRm9yUHJvamVjdENyZWF0aW9uID0gSW50ZWdlci5wYXJzZUludChtdWx0aXBsZXMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtdWx0aXBsZXNGb3JQcm9qZWN0Q3JlYXRpb24gPSAxOwotICAgICAgfQotICAgICAgCi0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9Ci0gIH0gIAotICAKLSAgcHJpdmF0ZSBJUnVudGltZSBjcmVhdGVUb21jYXRTZXJ2ZXJSdW50aW1lKFN0cmluZyBydW50aW1lSWQsIFN0cmluZyBydW50aW1lVHlwZUlkLCBTdHJpbmcgc2VydmVySW5zdGFsbFBhdGgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIElSdW50aW1lVHlwZSBydCA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKHJ1bnRpbWVUeXBlSWQpOwotICAgIElSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBydC5jcmVhdGVSdW50aW1lKHJ1bnRpbWVJZCwgbnVsbCk7Ci0gICAgd2Muc2V0TG9jYXRpb24obmV3IFBhdGgoc2VydmVySW5zdGFsbFBhdGgpKTsKLSAgICBJUnVudGltZSBydW50aW1lID0gd2Muc2F2ZSh0cnVlLCBudWxsKTsKLSAgICAKLSAgICBpZiAocnVudGltZVR5cGVJZC5lcXVhbHMoUlVOVElNRVRZUEVJRF9UQzU1KSkKLSAgICB7Ci0gICAgICAvL0NyZWF0ZSBhIG5ldyBJVk1JbnN0YWxsCi0gICAgICBJVk1JbnN0YWxsVHlwZSB0eXBlID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZShKQVZBMTVfVk1fSU5TVEFMTF9UWVBFKTsKLSAgICAgIElWTUluc3RhbGwgbmV3Vk0gPSBuZXcgVk1TdGFuZGluKHR5cGUsIGNyZWF0ZVVuaXF1ZUlkKHR5cGUpKTsgCi0gICAgICBuZXdWTS5zZXRJbnN0YWxsTG9jYXRpb24obmV3IEZpbGUoSkFWQTE1X1ZNX0lOU1RBTExfUEFUSCkuZ2V0QWJzb2x1dGVGaWxlKCkpOwotICAgICAgbmV3Vk0uc2V0TmFtZShKQVZBMTVfVk1fSU5TVEFMTF9OQU1FKTsKLSAgICAgIG5ld1ZNLnNldEphdmFkb2NMb2NhdGlvbihuZXcgVVJMKEpBVkExNV9WTV9JTlNUQUxMX0pBVkFET0MpKTsKLSAgICAgIGlmIChuZXdWTSBpbnN0YW5jZW9mIElWTUluc3RhbGwyKQotICAgICAgewotICAgICAgICBJVk1JbnN0YWxsMiBuZXdWTTIgPSAoSVZNSW5zdGFsbDIpIG5ld1ZNOwotICAgICAgICBuZXdWTTIuc2V0Vk1BcmdzKG51bGwpOwotICAgICAgfQotICAgICAgbmV3Vk0uc2V0TGlicmFyeUxvY2F0aW9ucyhudWxsKTsgICAgICAKLQotICAgICAgLy9BZGQgdGhlIG5ldyBJVk1JbnN0YWxsIHRvIHRoZSBtYXN0ZXIgbGlzdC4KLSAgICAgIElWTUluc3RhbGxbXSB2bXMgPSBuZXcgSVZNSW5zdGFsbFtde25ld1ZNfTsKLSAgICAgIC8vVE9ETyBSZXBsYWNlIHVzZSBvZiB0aGUgaW50ZXJuYWwgY2xhc3Mgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmpyZXMuSlJFc1VwZGF0ZXIKLSAgICAgIC8vd2l0aCBzb21ldGhpbmcgcHVibGljLiBOb3Qgc3VyZSBpZiBzb21ldGhpbmcgcHVibGljIGlzIGF2YWlsYWJsZSBhdCB0aGlzIHRpbWUuIE5lZWQgdG8gY2hlY2suCi0gICAgICBKUkVzVXBkYXRlciB1cGRhdGVyID0gbmV3IEpSRXNVcGRhdGVyKCk7Ci0gICAgICBJVk1JbnN0YWxsIGRlZmF1bHRWTSA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgIHVwZGF0ZXIudXBkYXRlSlJFU2V0dGluZ3Modm1zLCBkZWZhdWx0Vk0pOwotICAgICAgCi0gICAgICAvL0dldCB0aGUgbmV3IElWTUluc3RhbGwKLSAgICAgIElWTUluc3RhbGxUeXBlIHZtVHlwZSA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUoSkFWQTE1X1ZNX0lOU1RBTExfVFlQRSk7Ci0gICAgICBJVk1JbnN0YWxsIGphdmExNVZNID0gdm1UeXBlLmZpbmRWTUluc3RhbGxCeU5hbWUoSkFWQTE1X1ZNX0lOU1RBTExfTkFNRSk7Ci0gICAgCi0gICAgICAvL1NldCB0aGUgdG9tY2F0IHJ1bnRpbWUgdG8gdXNlIHRoZSBuZXcgSmF2YSAxNSBKREsuCi0gICAgICBJUnVudGltZVdvcmtpbmdDb3B5IHdjMiA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKLSAgICAgIC8vVE9ETyBSZXBsYWNlIHVzZSBvZiB0aGUgaW50ZXJuYWwgY2xhc3MgCi0gICAgICAvL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weQotICAgICAgLy93aXRoIHNvbWV0aGluZyBwdWJsaWMuIEVuaGFuY2VtZW50IDEyNzg4NCBoYXMgYmVlbiBvcGVuZWQgdG8gcmVxdWVzdCBBUEkKLSAgICAgIC8vZm9yIHRoaXMuCi0gICAgICBJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5IHRjd2MgPSAoSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSl3YzIubG9hZEFkYXB0ZXIoSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICB0Y3djLnNldFZNSW5zdGFsbChqYXZhMTVWTSk7Ci0gICAgICB3YzIuc2F2ZSh0cnVlLCBudWxsKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFNlcnZlckNvcmUuZmluZFJ1bnRpbWUocnVudGltZUlkKTsKLSAgfSAgCi0gIAotICBwcml2YXRlIFN0cmluZyBjcmVhdGVVbmlxdWVJZChJVk1JbnN0YWxsVHlwZSB2bVR5cGUpCi0gIHsKLSAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgIGRvCi0gICAgewotICAgICAgaWQgPSBTdHJpbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgfSB3aGlsZSAodm1UeXBlLmZpbmRWTUluc3RhbGwoaWQpICE9IG51bGwpOwotICAgIHJldHVybiBpZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3RzIHByb2plY3QgY3JlYXRpb24gYW5kIGZpbHRlcmluZyBmb3IgdGhlIEF4aXMgV2ViIHNlcnZpY2UKLSAgICogcnVudGltZS4gVGVzdHMgY292ZXIgYWxsIHZhbGlkIGNvbWJpbmF0aW9ucyBvZiBTZXJ2aWNlUnVudGltZXMsIAotICAgKiBUb21jYXQgc2VydmVycywgYW5kIEoyRUUgcHJvamVjdCB0eXBlcyBhbmQgd2VsbCBhcyBhbGwgdmFsaWQgIAotICAgKiBjb21iaW5hdGlvbnMgb2YgQ2xpZW50UnVudGltZXMsIFRvbWNhdCBzZXJ2ZXJzLCBhbmQgSjJFRSBwcm9qZWN0IHR5cGVzLgotICAgKi8gIAotICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENyZWF0aW9uQW5kRmlsdGVyaW5nKCkKLSAgewotICAgIGluaXQoKTsKLSAgICAKLSAgICBTdHJpbmdbXSB0ZW1wbGF0ZUlkcyA9IG5ldyBTdHJpbmdbXXtJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX1RFTVBMQVRFLAotICAgICAgICBJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX1RFTVBMQVRFLAotICAgICAgICBJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX1RFTVBMQVRFLAotICAgICAgICBJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX1RFTVBMQVRFLAotICAgICAgICBJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX1RFTVBMQVRFLAotICAgICAgICBJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX1RFTVBMQVRFLAotICAgICAgICBJSjJFRU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9URU1QTEFURSwKLSAgICAgICAgSUoyRUVNb2R1bGVDb25zdGFudHMuSlNUX1VUSUxJVFlfVEVNUExBVEUsCi0gICAgICAgIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX1RFTVBMQVRFfTsKLSAgICBTdHJpbmdbXSBzY2VuYXJpb3MgPSBuZXcgU3RyaW5nW117U0VSVklDRV9TSURFLAotICAgICAgICBTRVJWSUNFX1NJREUsCi0gICAgICAgIFNFUlZJQ0VfU0lERSwKLSAgICAgICAgQ0xJRU5UX1NJREUsCi0gICAgICAgIENMSUVOVF9TSURFLAotICAgICAgICBDTElFTlRfU0lERSwKLSAgICAgICAgQ0xJRU5UX1NJREUsCi0gICAgICAgIENMSUVOVF9TSURFLAotICAgICAgICBDTElFTlRfU0lERX07Ci0gICAgU3RyaW5nW10gc2VydmljZUNsaWVudFJ1bnRpbWVJZHMgPSBuZXcgU3RyaW5nW117QVhJU19TRVJWSUNFX1JVTlRJTUUsCi0gICAgICAgIEFYSVNfU0VSVklDRV9SVU5USU1FLAotICAgICAgICBBWElTX1NFUlZJQ0VfUlVOVElNRSwKLSAgICAgICAgQVhJU19DTElFTlRfUlVOVElNRV9XRUIsCi0gICAgICAgIEFYSVNfQ0xJRU5UX1JVTlRJTUVfV0VCLAotICAgICAgICBBWElTX0NMSUVOVF9SVU5USU1FX1dFQiwKLSAgICAgICAgQVhJU19DTElFTlRfUlVOVElNRV9KQVZBLAotICAgICAgICBBWElTX0NMSUVOVF9SVU5USU1FX0pBVkEsCi0gICAgICAgIEFYSVNfQ0xJRU5UX1JVTlRJTUVfSkFWQX07Ci0gICAgU3RyaW5nW10gc2VydmVyVHlwZXMgPSBuZXcgU3RyaW5nW117U0VSVkVSVFlQRUlEX1RDNDEsCi0gICAgICAgIFNFUlZFUlRZUEVJRF9UQzUwLAotICAgICAgICBTRVJWRVJUWVBFSURfVEM1NSwKLSAgICAgICAgU0VSVkVSVFlQRUlEX1RDNDEsCi0gICAgICAgIFNFUlZFUlRZUEVJRF9UQzUwLAotICAgICAgICBTRVJWRVJUWVBFSURfVEM1NSwKLSAgICAgICAgU0VSVkVSVFlQRUlEX1RDNDEsCi0gICAgICAgIFNFUlZFUlRZUEVJRF9UQzUwLAotICAgICAgICBTRVJWRVJUWVBFSURfVEM1NX07Ci0gICAgCi0gICAgCi0gICAgLy9FeHBlY3RlZCBSZXN1bHRzOgotICAgIAotICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uW11bXSBleHBlY3RlZEZhY2V0cyA9IG5ldyBJUHJvamVjdEZhY2V0VmVyc2lvbltdW117IG5ldyBJUHJvamVjdEZhY2V0VmVyc2lvbltde1dFQjIzLCBKQVZBMTR9LAotICAgICAgICBuZXcgSVByb2plY3RGYWNldFZlcnNpb25bXXtXRUIyNCwgSkFWQTE0fSwKLSAgICAgICAgbmV3IElQcm9qZWN0RmFjZXRWZXJzaW9uW117V0VCMjQsIEpBVkE1MH0sCi0gICAgICAgIG5ldyBJUHJvamVjdEZhY2V0VmVyc2lvbltde1dFQjIzLCBKQVZBMTR9LAotICAgICAgICBuZXcgSVByb2plY3RGYWNldFZlcnNpb25bXXtXRUIyNCwgSkFWQTE0fSwKLSAgICAgICAgbmV3IElQcm9qZWN0RmFjZXRWZXJzaW9uW117V0VCMjQsIEpBVkE1MH0sCi0gICAgICAgIG5ldyBJUHJvamVjdEZhY2V0VmVyc2lvbltde1VUSUxJVFkxMCwgSkFWQTE0fSwKLSAgICAgICAgbmV3IElQcm9qZWN0RmFjZXRWZXJzaW9uW117VVRJTElUWTEwLCBKQVZBMTR9LAotICAgICAgICBuZXcgSVByb2plY3RGYWNldFZlcnNpb25bXXtVVElMSVRZMTAsIEpBVkE1MH0sCi0gICAgfTsKLSAgICAKLSAgICBTdHJpbmdbXSBleHBlY3RlZFJ1bnRpbWVzID0gbmV3IFN0cmluZ1tdIHtSVU5USU1FSURfVEM0MSwKLSAgICAgICAgUlVOVElNRUlEX1RDNTAsCi0gICAgICAgIFJVTlRJTUVJRF9UQzU1LAotICAgICAgICBSVU5USU1FSURfVEM0MSwKLSAgICAgICAgUlVOVElNRUlEX1RDNTAsCi0gICAgICAgIFJVTlRJTUVJRF9UQzU1LAotICAgICAgICBSVU5USU1FSURfVEM0MSwKLSAgICAgICAgUlVOVElNRUlEX1RDNTAsCi0gICAgICAgIFJVTlRJTUVJRF9UQzU1ICAgICAgICAKLSAgICB9OwotICAgIAotICAgIFN0cmluZyBiaWdQcmVmaXggPSBQUk9KRUNUX05BTUVfUFJFRklYKyIwIitQUk9KRUNUX05BTUVfU1VGRklYOwotICAgIFN0cmluZ1tdIGV4cGVjdGVkUHJvamVjdHNGb3JBeGlzU2VydmljZSA9IG5ldyBTdHJpbmdbXSB7IGJpZ1ByZWZpeCsiMCIsIAotICAgICAgICBiaWdQcmVmaXgrIjEiLAotICAgICAgICBiaWdQcmVmaXgrIjIiLAotICAgICAgICBiaWdQcmVmaXgrIjMiLAotICAgICAgICBiaWdQcmVmaXgrIjQiLAotICAgICAgICBiaWdQcmVmaXgrIjUiICAgICAgICAKLSAgICB9OwotICAgIAotICAgIFN0cmluZ1tdIGV4cGVjdGVkUHJvamVjdHNGb3JBeGlzQ2xpZW50ID0gbmV3IFN0cmluZ1tdIHsgYmlnUHJlZml4KyIwIiwgCi0gICAgICAgIGJpZ1ByZWZpeCsiMSIsCi0gICAgICAgIGJpZ1ByZWZpeCsiMiIsCi0gICAgICAgIGJpZ1ByZWZpeCsiMyIsCi0gICAgICAgIGJpZ1ByZWZpeCsiNCIsCi0gICAgICAgIGJpZ1ByZWZpeCsiNSIsCi0gICAgICAgIGJpZ1ByZWZpeCsiNiIsCi0gICAgICAgIGJpZ1ByZWZpeCsiNyIsCi0gICAgICAgIGJpZ1ByZWZpeCsiOCIsCi0gICAgfTsKLSAgICAKLSAgICBib29sZWFuW10gZXhwZWN0ZWRCb29sZWFuc0ZvckF4aXNTZXJ2aWNlID0gbmV3IGJvb2xlYW5bXSB7dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX07Ci0gICAgYm9vbGVhbltdIGV4cGVjdGVkQm9vbGVhbnNGb3JBeGlzQ2xpZW50V2ViID0gbmV3IGJvb2xlYW5bXSB7dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX07Ci0gICAgYm9vbGVhbltdIGV4cGVjdGVkQm9vbGVhbnNGb3JBeGlzQ2xpZW50SmF2YSA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWV9OwotICAgIAotICAgIAotICAgIC8vVHVybiBhdXRvLWJ1aWxkIG9mZgotICAgIFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSBuZXcgVmFsaWRhdGlvbk1hbmFnZXIoKTsKLSAgICBtYW5hZ2VyLmRpc2FibGVBdXRvQnVpbGQoKTsKLSAgICAKLSAgICAvL0NyZWF0ZSB0aGUgcHJvamVjdHMKLSAgICBmb3IgKGludCBpPTA7IGk8bXVsdGlwbGVzRm9yUHJvamVjdENyZWF0aW9uOyBpKyspCi0gICAgewotICAgICAgY3JlYXRlUHJvamVjdHModGVtcGxhdGVJZHMsIHNjZW5hcmlvcywgc2VydmljZUNsaWVudFJ1bnRpbWVJZHMsIHNlcnZlclR5cGVzLCBQUk9KRUNUX05BTUVfUFJFRklYK2kpOwotICAgIH0gIAotICAgIAotICAgIC8vUmVzdG9yZSBhdXRvLWJ1aWxkCi0gICAgbWFuYWdlci5yZXN0b3JlQXV0b0J1aWxkKCk7Ci0gICAgCi0gICAgLy9DaGVjayBFeHBlY3RlZCBSZXN1bHRzOgotICAgIAotICAgIC8vQ2hlY2sgZmFjZXRzIGFuZCBydW50aW1lIG9uIHRoZSBmaXJzdCAiMCJ0aCBzZXQgb2YgY3JlYXRlZCBwcm9qZWN0cy4gSWdub3JlIGhpZ2hlciBtdWx0aXBsZXMgc2luY2UgdGhleQotICAgIC8vYXJlIGR1cGxpY2F0ZXMuICAgIAotICAgIGZvciAoaW50IGo9MDsgajxleHBlY3RlZEZhY2V0cy5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBiaWdQcmVmaXgrajsKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgYXNzZXJ0Tm90TnVsbChwcm9qZWN0KTsKLSAgICAgIGFzc2VydFRydWUocHJvamVjdC5leGlzdHMoKSk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZQcm9qZWN0KTsKLQotICAgICAgICAvL0NoZWNrIGZhY2V0cwotICAgICAgICAvL2JlZ2luIGRlYnVnCi0gICAgICAgIEl0ZXJhdG9yIHBmYWNldHMgPSBmUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHBmYWNldHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgIAlJUHJvamVjdEZhY2V0VmVyc2lvbiBwZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24pcGZhY2V0cy5uZXh0KCk7Ci0gICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oImZhY2V0PSIrcGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCkrIiwgdmVyc2lvbj0iK3Bmdi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBrPTA7IGs8ZXhwZWN0ZWRGYWNldHNbal0ubGVuZ3RoOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICBhc3NlcnRUcnVlKGZQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChleHBlY3RlZEZhY2V0c1tqXVtrXSkpOwotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL0NoZWNrIHJ1bnRpbWUKLSAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBmUnVudGltZSA9IGZQcm9qZWN0LmdldFJ1bnRpbWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmUnVudGltZSk7Ci0gICAgICAgIElSdW50aW1lIHNSdW50aW1lID0gRmFjZXRVdGlsLmdldFJ1bnRpbWUoZlJ1bnRpbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNSdW50aW1lKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzUnVudGltZS5nZXRJZCgpLmVxdWFscyhleHBlY3RlZFJ1bnRpbWVzW2pdKSk7Ci0gICAgICAgIAotICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgICAgZmFpbCgpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIAotICAgIC8vQ2hlY2sgdGhhdCBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRQcm9qZWN0c0ZvclNlcnZpY2VUeXBlQW5kUnVudGltZSguLikgcmV0dXJucwotICAgIC8vdGhlIHJpZ2h0IHNldCBvZiBwcm9qZWN0cwotICAgIFN0cmluZyBzZXJ2aWNlVHlwZSA9IFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkgKyAiLyIgKyBTRVJWSUNFX0lNUExfSkFWQTsKLSAgICBTdHJpbmdbXSBwcm9qZWN0c0ZvckF4aXNTZXJ2aWNlID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UHJvamVjdHNGb3JTZXJ2aWNlVHlwZUFuZFJ1bnRpbWUoc2VydmljZVR5cGUsIEFYSVNfUlVOVElNRSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvamVjdHNGb3JBeGlzU2VydmljZS5sZW5ndGgsIHByb2plY3RzRm9yQXhpc1NlcnZpY2UubGVuZ3RoKTsKLSAgICBMaXN0IHByb2plY3RzRm9yQXhpc1NlcnZpY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGk9MDsgaTxwcm9qZWN0c0ZvckF4aXNTZXJ2aWNlLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHByb2plY3RzRm9yQXhpc1NlcnZpY2VMaXN0LmFkZChwcm9qZWN0c0ZvckF4aXNTZXJ2aWNlW2ldKTsgICAgICAKLSAgICB9Ci0gICAgZm9yIChpbnQgaT0wOyBpPGV4cGVjdGVkUHJvamVjdHNGb3JBeGlzU2VydmljZS5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKHByb2plY3RzRm9yQXhpc1NlcnZpY2VMaXN0LmNvbnRhaW5zKGV4cGVjdGVkUHJvamVjdHNGb3JBeGlzU2VydmljZVtpXSkpOwotICAgIH0KLSAgICAKLSAgICAvL0NoZWNrIHRoYXQgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0UHJvamVjdHNGb3JDbGllbnRUeXBlQW5kUnVudGltZSguLikgcmV0dXJucwotICAgIC8vdGhlIHJpZ2h0IHNldCBvZiBwcm9qZWN0cyAgICAKLSAgICBTdHJpbmdbXSBwcm9qZWN0c0ZvckF4aXNDbGllbnQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5nZXRQcm9qZWN0c0ZvckNsaWVudFR5cGVBbmRSdW50aW1lKENMSUVOVF9JTVBMX0pBVkEsIEFYSVNfUlVOVElNRSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvamVjdHNGb3JBeGlzQ2xpZW50Lmxlbmd0aCwgcHJvamVjdHNGb3JBeGlzQ2xpZW50Lmxlbmd0aCk7Ci0gICAgTGlzdCBwcm9qZWN0c0ZvckF4aXNDbGllbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGk9MDsgaTxwcm9qZWN0c0ZvckF4aXNDbGllbnQubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcHJvamVjdHNGb3JBeGlzQ2xpZW50TGlzdC5hZGQocHJvamVjdHNGb3JBeGlzQ2xpZW50W2ldKTsgICAgICAKLSAgICB9Ci0gICAgZm9yIChpbnQgaT0wOyBpPGV4cGVjdGVkUHJvamVjdHNGb3JBeGlzQ2xpZW50Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUocHJvamVjdHNGb3JBeGlzQ2xpZW50TGlzdC5jb250YWlucyhleHBlY3RlZFByb2plY3RzRm9yQXhpc0NsaWVudFtpXSkpOwotICAgIH0gICAgCi0gICAgCi0gICAgLy9DaGVjayB0aGF0IHRoZSBBeGlzIHNlcnZpY2UgYW5kIGNsaWVudCBydW50aW1lcycgcHJvamVjdCBjb21wYXRpYmlsaXR5IGNoZWNraW5nIGlzIHdvcmtpbmcKLSAgICBmb3IgKGludCBpPTA7IGk8ZXhwZWN0ZWRCb29sZWFuc0ZvckF4aXNTZXJ2aWNlLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGJpZ1ByZWZpeCtpOyAgICAgIAotICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQm9vbGVhbnNGb3JBeGlzU2VydmljZVtpXSwgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZG9lc1NlcnZpY2VSdW50aW1lU3VwcG9ydFByb2plY3QoQVhJU19TRVJWSUNFX1JVTlRJTUUsIHByb2plY3ROYW1lKSk7ICAgIAotICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQm9vbGVhbnNGb3JBeGlzQ2xpZW50V2ViW2ldLCBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzMi5kb2VzQ2xpZW50UnVudGltZVN1cHBvcnRQcm9qZWN0KEFYSVNfQ0xJRU5UX1JVTlRJTUVfV0VCLCBwcm9qZWN0TmFtZSkpOwotICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQm9vbGVhbnNGb3JBeGlzQ2xpZW50SmF2YVtpXSwgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZG9lc0NsaWVudFJ1bnRpbWVTdXBwb3J0UHJvamVjdChBWElTX0NMSUVOVF9SVU5USU1FX0pBVkEsIHByb2plY3ROYW1lKSk7Ci0gICAgfSAKLSAgICAKLSAgICAvL1R1cm4gYXV0by1idWlsZCBvZmYKLSAgICBtYW5hZ2VyLmRpc2FibGVBdXRvQnVpbGQoKTsKLSAgICAgICAgCi0gICAgLy9EZWxldGUgdGhlIHByb2plY3RzCi0gICAgZm9yIChpbnQgaT0wOyBpPG11bHRpcGxlc0ZvclByb2plY3RDcmVhdGlvbjsgaSsrKQotICAgIHsKLSAgICAgIGRlbGV0ZVByb2plY3RzKHRlbXBsYXRlSWRzLmxlbmd0aCwgUFJPSkVDVF9OQU1FX1BSRUZJWCtpKTsKLSAgICB9ICAgICAgCi0KLSAgICAvL1Jlc3RvcmUgYXV0by1idWlsZAotICAgIG1hbmFnZXIucmVzdG9yZUF1dG9CdWlsZCgpOyAgICAKLSAgfSAgCi0gIAotICBwcml2YXRlIHZvaWQgZGVsZXRlUHJvamVjdHMoaW50IG4sIFN0cmluZyBuYW1lUHJlZml4KQotICB7Ci0gICAgZm9yIChpbnQgaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IG5hbWVQcmVmaXggKyBQUk9KRUNUX05BTUVfU1VGRklYICsgaTsKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobmFtZSk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgICAgLy9Eb24ndCBmYWlsIHRoZSB0ZXN0IGNhc2UgaWYgcHJvamVjdCBkZWxldGlvbiBmYWlscy4KLSAgICAgIH0KLSAgICB9Ci0gIH0gIAotICAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RzKFN0cmluZ1tdIHRlbXBsYXRlSWRzLCBTdHJpbmdbXSBzY2VuYXJpb3MsIFN0cmluZ1tdIHNlcnZpY2VDbGllbnRSdW50aW1lSWRzLCBTdHJpbmdbXSBzZXJ2ZXJUeXBlcywgU3RyaW5nIG5hbWVQcmVmaXggKQotICB7Ci0gICAgaW50IG4gPSB0ZW1wbGF0ZUlkcy5sZW5ndGg7Ci0gICAgZm9yIChpbnQgaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IG5hbWVQcmVmaXggKyBQUk9KRUNUX05BTUVfU1VGRklYICsgaTsKLSAgICAgIFJlcXVpcmVkRmFjZXRWZXJzaW9uW10gcmZ2cyA9IG51bGw7Ci0gICAgICBpZiAoc2NlbmFyaW9zW2ldLmVxdWFscyhDTElFTlRfU0lERSkpCi0gICAgICB7Ci0KLSAgICAgICAgICByZnZzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0Q2xpZW50UnVudGltZURlc2NyaXB0b3JCeUlkKHNlcnZpY2VDbGllbnRSdW50aW1lSWRzW2ldKS5nZXRSZXF1aXJlZEZhY2V0VmVyc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzY2VuYXJpb3NbaV0uZXF1YWxzKFNFUlZJQ0VfU0lERSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZnZzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdG9yQnlJZChzZXJ2aWNlQ2xpZW50UnVudGltZUlkc1tpXSkuZ2V0UmVxdWlyZWRGYWNldFZlcnNpb25zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmZ2cyA9IG5ldyBSZXF1aXJlZEZhY2V0VmVyc2lvblswXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBDcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQgY29tbWFuZCA9IG5ldyBDcmVhdGVGYWNldGVkUHJvamVjdENvbW1hbmQoKTsKLSAgICAgIGNvbW1hbmQuc2V0UHJvamVjdE5hbWUobmFtZSk7Ci0gICAgICBjb21tYW5kLnNldFRlbXBsYXRlSWQodGVtcGxhdGVJZHNbaV0pOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBjb21tYW5kLnNldFJlcXVpcmVkRmFjZXRWZXJzaW9ucyhyZnZzKTsgICAgICAgICAgIAotICAgICAgY29tbWFuZC5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyVHlwZXNbaV0pOwotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwgKTsgICAgCi0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgewotICAgICAgICBmYWlsKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobmFtZSk7Ci0gICAgICBGYWNldFV0aWxzLmFkZFJlcXVpcmVkRmFjZXRzVG9Qcm9qZWN0KHByb2plY3QsIHJmdnMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgIH0gICAgCi0gIH0gIAotICAKLSAgLyoqCi0gICAqIFRlc3RzIHByb2plY3QgdHlwZSBmaWx0ZXJpbmcgZm9yIHRoZSBBeGlzIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAqIFRlc3RzIGNvdmVyIGFsbCBTZXJ2aWNlUnVudGltZXMgYW5kIENsaWVudFJ1bnRpbWVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFByb2plY3RUeXBlRmlsdGVyaW5nKCkKLSAgeyAgCi0gICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVbXSBleHBlY3RlZFRlbXBsYXRlc0ZvckF4aXNTZXJ2aWNlID0gbmV3IElGYWNldGVkUHJvamVjdFRlbXBsYXRlW10ge1RFTVBMQVRFX1dFQn07Ci0gICAgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVbXSBleHBlY3RlZFRlbXBsYXRlc0ZvckF4aXNDbGllbnRXZWIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVbXSB7VEVNUExBVEVfV0VCfTsKLSAgICBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZVtdIGV4cGVjdGVkVGVtcGxhdGVzRm9yQXhpc0NsaWVudEphdmEgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVbXSB7VEVNUExBVEVfVVRJTElUWX07Ci0gICAgCi0gICAgU2V0IHRlbXBsYXRlc0ZvckF4aXNTZXJ2aWNlID0gRmFjZXRNYXRjaENhY2hlLmdldEluc3RhbmNlKCkuZ2V0VGVtcGxhdGVzRm9yU2VydmljZVJ1bnRpbWUoQVhJU19TRVJWSUNFX1JVTlRJTUUpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFRlbXBsYXRlc0ZvckF4aXNTZXJ2aWNlLmxlbmd0aCx0ZW1wbGF0ZXNGb3JBeGlzU2VydmljZS5zaXplKCkpOwotICAgIGZvciAoaW50IGk9MDsgaTxleHBlY3RlZFRlbXBsYXRlc0ZvckF4aXNTZXJ2aWNlLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUodGVtcGxhdGVzRm9yQXhpc1NlcnZpY2UuY29udGFpbnMoZXhwZWN0ZWRUZW1wbGF0ZXNGb3JBeGlzU2VydmljZVtpXSkpOwotICAgIH0KLSAgICBTZXQgdGVtcGxhdGVzRm9yQXhpc0NsaWVudFdlYiA9IEZhY2V0TWF0Y2hDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFRlbXBsYXRlc0ZvckNsaWVudFJ1bnRpbWUoQVhJU19DTElFTlRfUlVOVElNRV9XRUIpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFRlbXBsYXRlc0ZvckF4aXNDbGllbnRXZWIubGVuZ3RoLCB0ZW1wbGF0ZXNGb3JBeGlzQ2xpZW50V2ViLnNpemUoKSk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGV4cGVjdGVkVGVtcGxhdGVzRm9yQXhpc0NsaWVudFdlYi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKHRlbXBsYXRlc0ZvckF4aXNDbGllbnRXZWIuY29udGFpbnMoZXhwZWN0ZWRUZW1wbGF0ZXNGb3JBeGlzQ2xpZW50V2ViW2ldKSk7Ci0gICAgfSAgICAKLSAgICBTZXQgdGVtcGxhdGVzRm9yQXhpc0NsaWVudEphdmEgPSBGYWNldE1hdGNoQ2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRUZW1wbGF0ZXNGb3JDbGllbnRSdW50aW1lKEFYSVNfQ0xJRU5UX1JVTlRJTUVfSkFWQSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVGVtcGxhdGVzRm9yQXhpc0NsaWVudEphdmEubGVuZ3RoLCB0ZW1wbGF0ZXNGb3JBeGlzQ2xpZW50SmF2YS5zaXplKCkpOwotICAgIGZvciAoaW50IGk9MDsgaTxleHBlY3RlZFRlbXBsYXRlc0ZvckF4aXNDbGllbnRKYXZhLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUodGVtcGxhdGVzRm9yQXhpc0NsaWVudEphdmEuY29udGFpbnMoZXhwZWN0ZWRUZW1wbGF0ZXNGb3JBeGlzQ2xpZW50SmF2YVtpXSkpOwotICAgIH0KLSAgICAKLSAgICAKLSAgfSAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9BY2N1bXVsYXRlU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQxMTI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9BY2N1bXVsYXRlU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEFjY3VtdWxhdGVTdGF0dXNIYW5kbGVyIGltcGxlbWVudHMgSVN0YXR1c0hhbmRsZXIgewotCSAgVmVjdG9yIHN0YXR1c0xpc3RfOwotCSAgCi0JICBwdWJsaWMgQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXIoKQotCSAgewotCSAgICByZXNldFN0YXR1cygpOyAgICAKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiAgUmVzZXRzIHRoZSBzdGF0dXMgc28gdGhhdCBpdCBzdGFydHMgb3V0IGVtcHR5IGFnYWluLiAKLQkgICAqCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlc2V0U3RhdHVzKCkKLQkgIHsKLQkgICAgc3RhdHVzTGlzdF8gPSBuZXcgVmVjdG9yKCk7ICAgICAgCi0JICB9Ci0JICAKLQkgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpCi0JICB7Ci0JICAgIElTdGF0dXMgd29yc3RTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCSAgICAKLQkgICAgLy8gRmluZCB0aGUgd29yc3QgZXJyb3Igc3RhdHVzIGNvZGUKLQkgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHN0YXR1c0xpc3RfLnNpemUoKTsgaW5kZXgrKyApCi0JICAgIHsKLQkgICAgICBJU3RhdHVzIHN0YXR1cyA9IChJU3RhdHVzKXN0YXR1c0xpc3RfLmVsZW1lbnRBdCggaW5kZXggKTsKLQkgICAgICAKLQkgICAgICBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPiB3b3JzdFN0YXR1cy5nZXRTZXZlcml0eSgpICkKLQkgICAgICB7Ci0JICAgICAgICB3b3JzdFN0YXR1cyA9IHN0YXR1czsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBTdGF0dXNVdGlscy5tdWx0aVN0YXR1cyggd29yc3RTdGF0dXMuZ2V0TWVzc2FnZSgpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJU3RhdHVzW10pc3RhdHVzTGlzdF8udG9BcnJheSggbmV3IElTdGF0dXNbMF0gKSApOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pCi0JICAgKi8KLQkgIHB1YmxpYyBDaG9pY2UgcmVwb3J0KElTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzKSAKLQkgIHsKLQkgIAlDaG9pY2UgcmVzdWx0ID0gbnVsbDsKLQkgIAkKLQkgIAkvLyBBbHdheXMgdGFrZSB0aGUgZmlyc3QgY2hvaWNlIGlmIGF2YWlsYWJsZS4KLQkgICAgaWYoIGNob2ljZXMgIT0gbnVsbCAmJiBjaG9pY2VzLmxlbmd0aCA+IDAgKQotCSAgICB7Ci0JICAgIAlyZXN1bHQgPSBjaG9pY2VzWzBdOwotCSAgICB9Ci0JICAgIAotCSAgICBzdGF0dXNMaXN0Xy5hZGQoIHN0YXR1cyApOwotCSAgICAKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzKQotCSAgICovCi0JICBwdWJsaWMgdm9pZCByZXBvcnQoSVN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLQkgIHsKLQkgICAgc3RhdHVzTGlzdF8uYWRkKCBzdGF0dXMgKTsKLQkgIH0KLQkgIAkgCi0JICAvKioKLQkgICAqIEBzZWUgY29tLmlibS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydEVycm9yKGNvbS5pYm0uZW52LmNvbW1vbi5TdGF0dXMpCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKElTdGF0dXMgc3RhdHVzKQotCSAgewotCSAgICBzdGF0dXNMaXN0Xy5hZGQoIHN0YXR1cyApOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIEBzZWUgY29tLmlibS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8oY29tLmlibS5lbnYuY29tbW9uLlN0YXR1cykKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhJU3RhdHVzIHN0YXR1cykKLQkgIHsKLQkgICAgc3RhdHVzTGlzdF8uYWRkKCBzdGF0dXMgKTsKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91dGlsL0R5bmFtaWNQb3B1cEpVbml0V2l6YXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvRHluYW1pY1BvcHVwSlVuaXRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyY2JhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvRHluYW1pY1BvcHVwSlVuaXRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhRmxvd01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIER5bmFtaWNQb3B1cEpVbml0V2l6YXJkIGV4dGVuZHMgRHluYW1pY1BvcHVwV2l6YXJkIHsKLQlwcml2YXRlIElTdGF0dXNIYW5kbGVyIGhhbmRsZXJfOwotICAgIHByaXZhdGUgSUxvZyBsb2dfOwotCXB1YmxpYyBEeW5hbWljUG9wdXBKVW5pdFdpemFyZChJU3RhdHVzSGFuZGxlciBoYW5kbGVyKQotCXsKLQkJaGFuZGxlcl8gPSBoYW5kbGVyOwotCX0KLSAgCi0gICAgcHVibGljIER5bmFtaWNQb3B1cEpVbml0V2l6YXJkKElTdGF0dXNIYW5kbGVyIGhhbmRsZXIsIElMb2cgbG9nKQotICAgIHsKLSAgICAgICAgaGFuZGxlcl8gPSBoYW5kbGVyOwotICAgICAgICBsb2dfID0gbG9nOwotICAgIH0KLSAgICAKLQlwdWJsaWMgdm9pZCBydW5IZWFkTGVzcyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0ICByZXNvdXJjZUNvbnRleHQgPSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCUVjbGlwc2VFbnZpcm9ubWVudCAgICAgICAgIGVudmlyb25tZW50ICAgICA9IG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoIG51bGwsIHJlc291cmNlQ29udGV4dCwgaGFuZGxlcl8gKTsKLQkJaWYgKGxvZ18hPW51bGwpCi0gICAgICAgICAgZW52aXJvbm1lbnQuc2V0TG9nKGxvZ18pOwotICAgIAotCQlEYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbCAgICBkYXRhUmVnaXN0cnlfICAgPSBuZXcgRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwoKTsJICAgIAotCQlEYXRhRmxvd01hbmFnZXIgICAgICAgICAgICBkYXRhTWFuYWdlciAgICAgPSBuZXcgRGF0YUZsb3dNYW5hZ2VyKCBkYXRhUmVnaXN0cnlfLCBlbnZpcm9ubWVudCApOwotCQlTaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlciBtYW5hZ2VyICAgICAgICAgPSBuZXcgU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIoZW52aXJvbm1lbnQsIGRhdGFNYW5hZ2VyKTsKLQkJICAKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICBjb21tYW5kV2lkZ2V0QmluZGluZ18gPSAoQ29tbWFuZFdpZGdldEJpbmRpbmcpd2l6YXJkRWxlbWVudF8uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbiggImNsYXNzIiApOwotCSAgICB9Ci0JICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0JICAgIHsKLQkgICAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JICAgIH0KLQkgICAgCi0JCWNvbW1hbmRXaWRnZXRCaW5kaW5nXy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YVJlZ2lzdHJ5XyApOwotCQkKLQkJQ29tbWFuZEZyYWdtZW50ICAgICAgICAgICAgcm9vdEZyYWdtZW50ICAgID0gZ2V0Um9vdEZyYWdtZW50KCBzZWxlY3Rpb24sIG51bGwgKTsKLQkJbWFuYWdlci5zZXRSb290RnJhZ21lbnQoIHJvb3RGcmFnbWVudCApOwotCQltYW5hZ2VyLnJ1bkZvcndhcmRUb05leHRTdG9wKCBjb250ZXh0ICk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9KVW5pdFV0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvSlVuaXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThjNWE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9KVW5pdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEwNCAgIDExNDgzNSBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDcwMjAyICAgMTcyNjE1IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGx1Z2luLlRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uLldhaXRGb3JBdXRvQnVpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzLkFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgSlVuaXRVdGlscyB7Ci0JLy8gQmVnaW4gU2VydmVyIFV0aWxpdGllcwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgY3JlYXRlU2VydmVyUnVudGltZShTdHJpbmcgcnVudGltZVR5cGVJZCxTdHJpbmcgc2VydmVySW5zdGFsbFBhdGgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCUlSdW50aW1lVHlwZSBydCA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKHJ1bnRpbWVUeXBlSWQpOwotCQlJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gcnQuY3JlYXRlUnVudGltZSgiYVJ1bnRpbWUiLCBudWxsKTsKLQkJd2Muc2V0TG9jYXRpb24obmV3IFBhdGgoc2VydmVySW5zdGFsbFBhdGgpKTsKLQkJCi0JCXJldHVybiB3Yy5zYXZlKHRydWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBjcmVhdGVTZXJ2ZXIoU3RyaW5nIG5hbWUsU3RyaW5nIHNlcnZlclR5cGVJZCxJUnVudGltZSBydW50aW1lLElFbnZpcm9ubWVudCBlbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJUeXBlSWQpOwotICAgICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsgCi0gICAgICBmb3IgKGludCBpPTA7aTxzZXJ2ZXJzLmxlbmd0aDtpKyspewotICAgICAgICBpZihzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFscyhzZXJ2ZXJUeXBlLmdldElkKCkpKXsKLSAgICAgICAgICByZXR1cm4gc2VydmVyc1tpXTsgIAotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXYyA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKHNlcnZlclR5cGVJZCxudWxsLCBtb25pdG9yICk7Ci0JICBzZXJ2ZXJXYy5zZXROYW1lKG5hbWUpOwotCSAgc2VydmVyV2Muc2V0UnVudGltZShydW50aW1lKTsKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gc2VydmVyV2Muc2F2ZUFsbCh0cnVlLCBtb25pdG9yICk7Ci0gICAgICByZXR1cm4gc2VydmVyOwotCX0JCi0JCi0JLyoqCi0JICogY3JlYXRlU2VydmVyIGFuZCBpbnN0YWxsIEpSRSBmb3IgU2VydmVycyByZXF1aXJpbmcgYSBzcGVjaWZpYyBKUkUKLQkgKiBAcGFyYW0gamF2YVJ1bnRpbWVQYXRoIEpSRSBpbnN0YWxsIGxvY2F0aW9uOyBpLmUuIEU6XFxKYXZhMTQxCi0JICogQHBhcmFtIGpyZUlEIEpSRSBpZDsgaS5lLiBqYXZhMTQxCi0JICogQHBhcmFtIG5hbWUgc2VydmVyIG5hbWUKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIHNlcnZlciB0eXBlIGlkCi0JICogQHBhcmFtIHJ1bnRpbWUgSVJ1bnRpbWUKLQkgKiBAcGFyYW0gZW52IElFbnZpcm9ubWVudAotCSAqIEByZXR1cm4gIHNlcnZlciBJU2VydmVyCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBjcmVhdGVTZXJ2ZXIoU3RyaW5nIGphdmFSdW50aW1lUGF0aCwgU3RyaW5nIGpyZUlELCBTdHJpbmcgbmFtZSxTdHJpbmcgc2VydmVyVHlwZUlkLElSdW50aW1lIHJ1bnRpbWUsSUVudmlyb25tZW50IGVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOyAKLSAgICBmb3IgKGludCBpPTA7aTxzZXJ2ZXJzLmxlbmd0aDtpKyspewotICAgICAgaWYoc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoc2VydmVyVHlwZS5nZXRJZCgpKSl7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJzW2ldOyAgCi0gICAgICB9Ci0gICAgfQotCi0JCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXYyA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKHNlcnZlclR5cGVJZCxudWxsLCBtb25pdG9yICk7Ci0JCXNlcnZlcldjLnNldE5hbWUobmFtZSk7Ci0JCXNlcnZlcldjLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCQotCQlJU2VydmVyIHNlcnZlciA9IHNlcnZlcldjLnNhdmVBbGwodHJ1ZSwgbW9uaXRvciApOwotCQkKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0U2VydmVyKElTZXJ2ZXIgc2VydmVyLElFbnZpcm9ubWVudCBlbnYpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElTZXJ2ZXIgY3VycmVudFNlcnZlciA9IHNlcnZlcjsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkgIGN1cnJlbnRTZXJ2ZXIuc3RhcnQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG1vbml0b3IgKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHdyYXBwZXIgPSBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl3cmFwcGVyLnNldFN0YWNrVHJhY2UoZS5nZXRTdGFja1RyYWNlKCkpOwotCQkJCQl0aHJvdyB3cmFwcGVyOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSxmYWxzZSxydW5uYWJsZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVFQVJGcm9tU2VydmVyKElTZXJ2ZXIgc2VydmVyLElQcm9qZWN0IGVhclByb2plY3QsSUVudmlyb25tZW50IGVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaW50IG51bWJlck9mTW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCkubGVuZ3RoOwotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCXsKLSAgICAgIGZpbmFsIElNb2R1bGUgZWFyUHJvamVjdE1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKGVhclByb2plY3QpOwotICAgICAgZmluYWwgSU1vZHVsZVtdIG1vZHVsZXMgPSB7ZWFyUHJvamVjdE1vZHVsZX07Ci0JCQluZXcgU2VydmVyVXRpbHMoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmVyLGVhclByb2plY3RNb2R1bGUsZmFsc2UsIG1vbml0b3IgKTsKLQkJICAJZmluYWwgSVNlcnZlciBjdXJyZW50U2VydmVyID0gc2VydmVyOwotCQkgIAlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLQkJCXsKLQkJICAJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCQkJCXsKLQkJICAJCSAgCWZvciAoaW50IGk9MDtpPDEwMDA7aSsrKQotCQkgIAkJICAJewotCQkgIAkJICAJCWludCBtb2R1bGVTdGF0ZSA9IGN1cnJlbnRTZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlcyk7Ci0JCSAgCQkgIAkJaWYgKG1vZHVsZVN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fCBtb2R1bGVTdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkgIAkJICAJCXsKLQkJICAJCSAgCQkgIHRyeQotCQkgIAkJCQkgIHsKLQkJICAJCSAgCQkgICAgVGhyZWFkLnNsZWVwKDMwMCk7Ci0JCSAgCQkJCSAgfQotCQkgIAkJICAJCSAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCSAgCQkJCSAgewotCQkgIAkJICAJCSAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkgIAkJCQkgIH0KLQkJICAJCSAgCQl9Ci0JCSAgCQkgIAkJZWxzZQotCQkgIAkJICAJCQlicmVhazsKLQkJICAJCSAgCX0gIAkJCSAgCQkJCi0JCQkJfSAgCQkKLQkJCX07Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLGZhbHNlLHJ1bm5hYmxlKTsKLQkJCXJldHVybiAoc2VydmVyLmdldE1vZHVsZXMoKS5sZW5ndGggPT0gKG51bWJlck9mTW9kdWxlcy0xKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlTW9kdWxlRnJvbVNlcnZlcihJU2VydmVyIHNlcnZlciwgSVByb2plY3Qgd2ViUHJvamVjdCwgSUVudmlyb25tZW50IGVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAKLQkgIGludCBudW1iZXJPZk1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpLmxlbmd0aDsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQl7Ci0gICAgICBmaW5hbCBJTW9kdWxlIHdlYlByb2plY3RNb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZSh3ZWJQcm9qZWN0KTsKLSAgICAgIGZpbmFsIElNb2R1bGVbXSBtb2R1bGVzID0ge3dlYlByb2plY3RNb2R1bGV9OwotCi0JCQluZXcgU2VydmVyVXRpbHMoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmVyLHdlYlByb2plY3RNb2R1bGUsZmFsc2UsIG1vbml0b3IgKTsKLQkJICAJZmluYWwgSVNlcnZlciBjdXJyZW50U2VydmVyID0gc2VydmVyOwotCQkgIAlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLQkJCXsKLQkJICAJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCQkJCXsKLQkJICAJCSAgCWZvciAoaW50IGk9MDtpPDEwMDA7aSsrKQotCQkgIAkJICAJewotCQkgIAkJICAJCWludCBtb2R1bGVTdGF0ZSA9IGN1cnJlbnRTZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlcyk7Ci0JCSAgCQkgIAkJaWYgKG1vZHVsZVN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fCBtb2R1bGVTdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkgIAkJICAJCXsKLQkJICAJCSAgCQkgIHRyeQotCQkgIAkJCQkgIHsKLQkJICAJCSAgCQkgICAgVGhyZWFkLnNsZWVwKDMwMCk7Ci0JCSAgCQkJCSAgfQotCQkgIAkJICAJCSAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCSAgCQkJCSAgewotCQkgIAkJICAJCSAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkgIAkJCQkgIH0KLQkJICAJCSAgCQl9Ci0JCSAgCQkgIAkJZWxzZQotCQkgIAkJICAJCQlicmVhazsKLQkJICAJCSAgCX0gIAkJCSAgCQkJCi0JCQkJfSAgCQkKLQkJCX07Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLGZhbHNlLHJ1bm5hYmxlKTsKLQkJCS8vVGhyZWFkLnNsZWVwKDYwMDApOwotCQkJcmV0dXJuIChzZXJ2ZXIuZ2V0TW9kdWxlcygpLmxlbmd0aCA9PSAobnVtYmVyT2ZNb2R1bGVzLTEpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vIEJlZ2luOiBHZW5lcmFsIEVjbGlwc2UgVXRpbGl0aWVzCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHN5bmNCdWlsZFByb2plY3QoSVByb2plY3QgcHJvamVjdCxJRW52aXJvbm1lbnQgZW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbW9uaXRvciApOwotCQlXYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZCBjbWQgPSBuZXcgV2FpdEZvckF1dG9CdWlsZENvbW1hbmQoKTsKLSAgICBjbWQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotCQljbWQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlUZXN0RmlsZXMoU3RyaW5nIHBhdGhTdHJpbmcsaW50IHJvb3RTZWdtZW50TGVuZ3RoLElGb2xkZXIgZGVzdEZvbGRlcixJRW52aXJvbm1lbnQgZW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlFbnVtZXJhdGlvbiBlID0gVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5UGF0aHMocGF0aFN0cmluZyk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotCQl7Ci0JCQlTdHJpbmcgZmlsZVBhdGggPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChmaWxlUGF0aC5lbmRzV2l0aCgiLyIpKQotCQkJCWNvcHlUZXN0RmlsZXMoZmlsZVBhdGgscm9vdFNlZ21lbnRMZW5ndGgsZGVzdEZvbGRlcixlbnYsIG1vbml0b3IgKTsKLQkJCWVsc2UKLQkJCXsKLQkJCQlJUGF0aCBmaWxlSVBhdGggPSBuZXcgUGF0aChmaWxlUGF0aCk7Ci0JCQkJRmlsZVJlc291cmNlVXRpbHMuY29weUZpbGUoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwKLQkJCQkJCSAgICAgICAgICAgICAgICAgICBUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCksCi0JCQkJCQkJCQkJICAgZmlsZUlQYXRoLnJlbW92ZUxhc3RTZWdtZW50cyhmaWxlSVBhdGguc2VnbWVudENvdW50KCktcm9vdFNlZ21lbnRMZW5ndGgpLCAvLyAvZGF0YS88c3ViZGlyPgotCQkJCQkJCQkJCSAgIChuZXcgUGF0aChmaWxlUGF0aCkpLnJlbW92ZUZpcnN0U2VnbWVudHMocm9vdFNlZ21lbnRMZW5ndGgpLCAvLyBmaWxlcyBhZnRlciAvZGF0YS88c3ViZGlyPgotCQkJCQkJCQkJCSAgIGRlc3RGb2xkZXIuZ2V0RnVsbFBhdGgoKSwKLQkJCQkJCQkJCQkgICBtb25pdG9yLAotCQkJCQkJCQkJCSAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VGVzdERhdGEoU3RyaW5nIGRhdGFTdWJkaXJlY3RvcnksSUZvbGRlciBkZXN0Rm9sZGVyLElFbnZpcm9ubWVudCBlbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBwYXRoU3RyaW5nID0gIi9kYXRhLyIrZGF0YVN1YmRpcmVjdG9yeTsKLQkJY29weVRlc3RGaWxlcyhwYXRoU3RyaW5nLG5ldyBQYXRoKHBhdGhTdHJpbmcpLnNlZ21lbnRDb3VudCgpLGRlc3RGb2xkZXIsZW52LCBtb25pdG9yKTsKLQkJCi0JfQotCQotCS8vIEJlZ2luOiBXZWIgU2VydmljZXMgVXRpbGl0aWVzCi0JcHVibGljIHN0YXRpYyB2b2lkIGhpZGVBY3Rpb25EaWFsb2dzKCkKLQl7Ci0JCVBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBhY3Rpb25EaWFsb2dzQ3R4ID0gUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCUFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlW10gYWN0aW9uRGlhbG9nUHJlZnMgID0gYWN0aW9uRGlhbG9nc0N0eC5nZXREaWFsb2dzKCk7Ci0JCWZvciAoaW50IGk9MDtpPGFjdGlvbkRpYWxvZ1ByZWZzLmxlbmd0aDtpKyspCi0JCQlhY3Rpb25EaWFsb2dzQ3R4LnNldEFjdGlvbkRpYWxvZ0VuYWJsZWQoYWN0aW9uRGlhbG9nUHJlZnNbaV0uZ2V0SWQoKSx0cnVlKTsJCQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVQcm94eUdlbmVyYXRpb24oYm9vbGVhbiBlbmFibGUpCi0JewotCQlTY2VuYXJpb0NvbnRleHQgY3R4ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotCQlib29sZWFuIHByZXZpb3VzU2V0dGluZyA9IGN0eC5nZXRHZW5lcmF0ZVByb3h5KCk7Ci0JCWN0eC5zZXRHZW5lcmF0ZVByb3h5KGVuYWJsZSk7Ci0JCXJldHVybiBwcmV2aW91c1NldHRpbmc7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVPdmVyd3JpdGUoYm9vbGVhbiBlbmFibGUpCi0JewotCQlSZXNvdXJjZUNvbnRleHQgY3R4ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpOwotCQlib29sZWFuIHByZXZpb3VzU2V0dGluZyA9IGN0eC5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpOwotCQljdHguc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKGVuYWJsZSk7Ci0JCXJldHVybiBwcmV2aW91c1NldHRpbmc7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlV1NJRGlhbG9nKElQcm9qZWN0IHByb2plY3QpewotCSAgCi0JICBQZXJzaXN0ZW50V1NJQ29udGV4dCBjdHggPSBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpOwotCSAgY3R4LnVwZGF0ZVByb2plY3RXU0lDb21wbGlhbmNlcyhwcm9qZWN0LCBQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSSk7Ci0JICAKLQkgIFBlcnNpc3RlbnRXU0lDb250ZXh0IGN0eDIgPSBXU1BsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCk7Ci0JICBjdHgyLnVwZGF0ZVByb2plY3RXU0lDb21wbGlhbmNlcyhwcm9qZWN0LCBQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSSk7Ci0JICAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFdTUnVudGltZVNlcnZlcihTdHJpbmcgd3NSdW50aW1lSWQsU3RyaW5nIHNlcnZlclR5cGVJZCkKLQl7Ci0JCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBzZXJ2ZXJSdW50aW1lQ3R4ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotCQlzZXJ2ZXJSdW50aW1lQ3R4LnNldFJ1bnRpbWVJZCh3c1J1bnRpbWVJZCk7Ci0JCXNlcnZlclJ1bnRpbWVDdHguc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlclR5cGVJZCk7CQkKLQl9Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGxhdW5jaFdpemFyZChTdHJpbmcgcGx1Z2luTlMsU3RyaW5nIHdpemFyZElkLFN0cmluZyBvYmplY3RDbGFzc0lkLElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCUlTdGF0dXNIYW5kbGVyIHN0YXR1c0hhbmRsZXIgPSBuZXcgRWNsaXBzZVN0YXR1c0hhbmRsZXIoKTsKLQotICAgICAgICBEeW5hbWljUG9wdXBKVW5pdFdpemFyZCB3aXphcmQgPSBuZXcgRHluYW1pY1BvcHVwSlVuaXRXaXphcmQoc3RhdHVzSGFuZGxlcik7Ci0gICAgICAgIHdpemFyZC5zZXRJbml0aWFsRGF0YSh3aXphcmRJZCk7Ci0gICAgICAgIFByb2dyZXNzTW9uaXRvckRpYWxvZyBtb25pdG9yID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAJd2l6YXJkLnJ1bkhlYWRMZXNzKGluaXRpYWxTZWxlY3Rpb24sIG1vbml0b3IpOwotICAgICAgICB9IAotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgCXJldHVybiBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgbGF1bmNoQ3JlYXRpb25XaXphcmQoU3RyaW5nIHdpemFyZElkLFN0cmluZyBvYmplY3RDbGFzc0lkLElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBsYXVuY2hXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSIsd2l6YXJkSWQsb2JqZWN0Q2xhc3NJZCxpbml0aWFsU2VsZWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGxhdW5jaENvbnN1bXB0aW9uV2l6YXJkKFN0cmluZyB3aXphcmRJZCxTdHJpbmcgb2JqZWN0Q2xhc3NJZCxJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gbGF1bmNoV2l6YXJkKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkiLHdpemFyZElkLG9iamVjdENsYXNzSWQsaW5pdGlhbFNlbGVjdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVXZWJNb2R1bGUoU3RyaW5nIHdlYlByb2plY3ROYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIGoyZWVWZXJzaW9uLCBJRW52aXJvbm1lbnQgZW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKXsKLQotCSAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCSAgdHJ5ewotCSAgICBDcmVhdGVNb2R1bGVDb21tYW5kIGNyZWF0ZVdlYiA9IG5ldyBDcmVhdGVNb2R1bGVDb21tYW5kKCk7Ci0JICAgIGNyZWF0ZVdlYi5zZXRQcm9qZWN0TmFtZSh3ZWJQcm9qZWN0TmFtZSk7Ci0gICAgICAgIGNyZWF0ZVdlYi5zZXRNb2R1bGVOYW1lKG1vZHVsZU5hbWUpOwotICAgICAgICBjcmVhdGVXZWIuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLldFQik7Ci0JICAgIGNyZWF0ZVdlYi5zZXRKMmVlTGV2ZWwoajJlZVZlcnNpb24pOwotCSAgICBjcmVhdGVXZWIuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgICBjcmVhdGVXZWIuc2V0RW52aXJvbm1lbnQoIGVudiApOwotCSAgICByZXR1cm4gY3JlYXRlV2ViLmV4ZWN1dGUoIG1vbml0b3IsIG51bGwgKTsKLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JICAgIHN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKCBlICk7Ci0JICB9Ci0JICByZXR1cm4gc3RhdHVzOwotCSAgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCVVNjZW5hcmlvRGVmYXVsdHMoKXsKLQkJU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0R2VuZXJhdGVXZWJTZXJ2aWNlKFNjZW5hcmlvQ29udGV4dC5XU19BU1NFTUJMRSk7Ci0JCQotCQljb250ZXh0LnNldEdlbmVyYXRlUHJveHkoZmFsc2UpOwotCQljb250ZXh0LnNldEluc3RhbGxXZWJTZXJ2aWNlKGZhbHNlKTsKLQkJY29udGV4dC5zZXRTdGFydFdlYlNlcnZpY2UoZmFsc2UpOwotCQljb250ZXh0LnNldFRlc3RXZWJTZXJ2aWNlKGZhbHNlKTsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRURFNjZW5hcmlvRGVmYXVsdHMoKXsKLQkJU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0R2VuZXJhdGVXZWJTZXJ2aWNlKFNjZW5hcmlvQ29udGV4dC5XU19BU1NFTUJMRSk7Ci0JCQotCQljb250ZXh0LnNldEdlbmVyYXRlUHJveHkoZmFsc2UpOwotCQljb250ZXh0LnNldEluc3RhbGxXZWJTZXJ2aWNlKGZhbHNlKTsKLQkJY29udGV4dC5zZXRTdGFydFdlYlNlcnZpY2UoZmFsc2UpOwotCQljb250ZXh0LnNldFRlc3RXZWJTZXJ2aWNlKGZhbHNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91dGlsL1NjZW5hcmlvQ29uc3RhbnRzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvU2NlbmFyaW9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1ZmEzOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvU2NlbmFyaW9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTY2VuYXJpb0NvbnN0YW50cyB7Ci0JLy8gQm90dG9tIHVwIEphdmEgb3IgRUpCIHRvIFdlYiBTZXJ2aWNlIHdpemFyZCBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRJRF9CT1RUT01fVVAgPSAib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiOwotCQotCS8vIFRvcCBkb3duIFdTREwgdG8gU2tlbGV0b24gV2ViIFNlcnZpY2Ugd2l6YXJkIElELgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRElEX1RPUF9ET1dOID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIjsKLQkKLQkvLyBXZWIgU2VydmljZSBjbGllbnQgd2l6YXJkIElELgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRElEX0NMSUVOVCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiOwkKLQkKLQkvLyBPYmplY3QgY2xhc3MgZm9yOgotCS8vIDEpIEphdmEgc291cmNlIChib3R0b20tdXApCi0JLy8gMikgV1NETCBvciBXU0lMICh0b3AtZG93biBvciBjbGllbnQpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9DTEFTU19JRF9JRklMRSA9ICJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI7Ci0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvciBKYXZhIGNvbXBpbGF0aW9uIHVuaXRzIChpLmUuIEphdmEgY2xhc3NlcyBzZWxlY3RlZCBpbiB0aGUgSmF2YSBwZXJzcGVjdGl2ZSkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0NMQVNTX0lEX0NPTVBJTEFUSU9OVU5JVCA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQiOwotCQotCS8vIE9iamVjdCBjbGFzcyBmb3IgYSBzZXJ2aWNlIHNlbGVjdGVkIGluIHRoZSBKMkVFIHBlcnNwZWN0aXZlICh0b3AtZG93biBvciBjbGllbnQpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9DTEFTU19JRF9TRVJWSUNFSU1QTCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlIjsKLQkKLQkvLyBPYmplY3QgY2xhc3MgZm9yIGEgV1NETFJlc291cmNlSW1wbCAodG9wLWRvd24gb3IgY2xpZW50KS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfV1NETFNFUlZJQ0VJTVBMID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlSW1wbCI7Ci0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvciBhIFNlcnZpY2VSZWYgKHRvcC1kb3duIG9yIGNsaWVudCkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0NMQVNTX0lEX1NFUlZJQ0VSRUYgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIjsKLQkKLQkvLyBPYmplY3QgY2xhc3MgZm9yIGEgU2VydmljZUltcGxCZWFuIChib3R0b20tdXApLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9DTEFTU19JRF9TRVJWSUNFSU1QTEJFQU4gPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiI7Ci0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvciBhIEJlYW5MaW5rIChib3R0b20tdXApLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9DTEFTU19JRF9CRUFOTElOSyA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbmsiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9XU0N1c3RvbUFkYXB0ZXJGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvV1NDdXN0b21BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWI4NGVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9XU0N1c3RvbUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMzI3ICAgMTcyMzM5IGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci0KLS8qKgotICogVGhlIFdTQ3VzdG9tQWRhcHRlckZhY3RvcnkgaXMgYW4gQWRhcHRlckZhY3Rvcnkgc2ltaWxhciB0byBvbmUgYW4gYWRvcHRlciB3b3VsZCBwcm92aWRlIHRvIGFkYXB0IGEgY3VzdG9tIG9iamVjdCAKLSAqIHRvIGEgV1NETCB1cmkgdGhhdCB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZHMgYW5kIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIgd291bGQgdGFrZSBhcyBpbnB1dC4gIFRoZSBTZXJ2bGV0IExpbmssIAotICogcmVwcmVzZW50aW5nIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHVuZGVyIHRoZSBKU1ItMTA5IFdlYiBzZXJ2aWNlcyBicmFuY2ggb2YgdGhlIEoyRUUgUHJvamVjdCBFeHBsb3JlciwgaXMgCi0gKiB1c2VkIGFzIHRoZSAiY3VzdG9tIG9iamVjdCIgaW4gdGhpcyB0ZXN0LgotICoKLSAqLwotcHVibGljIGNsYXNzIFdTQ3VzdG9tQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSB0eXBlcyA9IHsKLQkJSUZpbGUuY2xhc3MsIFN0cmluZy5jbGFzcwotCX07Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXRMaW5rICYmICgoYWRhcHRlclR5cGUgPT0gSUZpbGUuY2xhc3MgKSB8fCAoYWRhcHRlclR5cGUgPT0gU3RyaW5nLmNsYXNzKSkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZ2V0QWRhcHRlciBvbiAiK2FkYXB0YWJsZU9iamVjdC50b1N0cmluZygpKTsKLQkJCVNlcnZsZXRMaW5rIGJlYW5MaW5rID0gKFNlcnZsZXRMaW5rKSBhZGFwdGFibGVPYmplY3Q7Ci0KLQkJCUlGaWxlIHdzZGxGaWxlID0gZ2V0V1NETEZpbGUoYmVhbkxpbmspOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3c2RsRmlsZSA9ICIrd3NkbEZpbGUpOwotCQkJaWYgKGFkYXB0ZXJUeXBlID09IElGaWxlLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIHdzZGxGaWxlOwotCQkJfSBlbHNlIAotCQkJCWlmIChhZGFwdGVyVHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKLQkJCQkJVVJJIHdzZGxVcmkgPSB3c2RsRmlsZS5nZXRMb2NhdGlvblVSSSgpOwotCQkJCQlTdHJpbmcgd3NkbEZpbGVTdHJpbmcgPSBudWxsOwotCQkJCQlpZiAod3NkbFVyaSAhPSBudWxsKSB7Ci0JCQkJCQl3c2RsRmlsZVN0cmluZyA9IHdzZGxVcmkudG9TdHJpbmcoKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigid3NkbEZpbGVTdHJpbmcgPSAiK3dzZGxGaWxlU3RyaW5nKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gd3NkbEZpbGVTdHJpbmc7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIHR5cGVzOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYmVhbiBUaGUgU2VydmljZUltcGxCZWFuCi0JICogQHJldHVybiBUaGUgSUZpbGUgcmVwcmVzZW50aW5nIHRoZSBXU0RMIGZpbGUgZm9yIHRoaXMgU2VydmljZUltcGxCZWFuLgotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0V1NETEZpbGUoU2VydmljZUltcGxCZWFuIGJlYW4pIHsKLQkJICBFT2JqZWN0IGVPYmplY3QgPSBiZWFuLmVDb250YWluZXIoKTsKLQkJICBpZiAoZU9iamVjdCA9PSBudWxsKQotCQkJICByZXR1cm4gbnVsbDsKLQkgICAgICAgICAgCi0JCSAgZU9iamVjdCA9IGVPYmplY3QuZUNvbnRhaW5lcigpOwotCSAgICAgIAotCQkgIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uKSB7Ci0JCQkgIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c2QgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSBlT2JqZWN0OwotCQkJICAKLQkJCSAgSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh3c2QpOyAgICAJICAKLQkgICAgCSAgCi0JCQkgIElQYXRoIHBhdGggPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7ICAgIAkgCi0JCQkgIHBhdGggPSBwYXRoLmFwcGVuZCh3c2QuZ2V0V3NkbEZpbGUoKSk7IAotCQkJICByZXR1cm4gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0RmlsZShwYXRoKTsgCSAgCi0JCQkgICAgICAJICAgIAotCQkgIH0KLQkJICByZXR1cm4gbnVsbDsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICogQHBhcmFtIGxpbmsgVGhlIFNlcnZsZXRMaW5rCi0JICogQHJldHVybiBUaGUgSUZpbGUgcmVwcmVzZW50aW5nIHRoZSBXU0RMIGZpbGUgZm9yIHRoaXMgU2VydmxldExpbmsKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldFdTRExGaWxlKFNlcnZsZXRMaW5rIGxpbmspIHsKLQkJICBFT2JqZWN0IGVPYmplY3QgPSBsaW5rLmVDb250YWluZXIoKTsKLQkJICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbikKLQkJCSAgcmV0dXJuIGdldFdTRExGaWxlKChTZXJ2aWNlSW1wbEJlYW4pIGVPYmplY3QpOwotCQkgIHJldHVybiBudWxsOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjRiNGQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc2M2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXRlc3RzLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWYyYmNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53cy50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkMTA0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6Mjk6MTQgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllODdhOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jTW9uIEFwciAyNCAxMDoyNzo1NCBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxNWM0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cy5wbHVnaW4uVGVzdHNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC53cywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cy5kYXRhLAotIG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cy5wbHVnaW4sCi0gb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLnVuaXR0ZXN0LAotIG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cy51dGlsCi1CdW5kbGUtQ2xhc3NQYXRoOiB0ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjRhMDdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZGF0YS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWFkbWUudHh0LFwKLSAgICAgICAgICAgICAgIHRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyID0gdGVzdHMuamFyCi1zb3VyY2UudGVzdHMuamFyID0gdGVzdHMvCi1vdXRwdXQudGVzdHMuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL2RhdGEvbG9jYXRvci90ZXN0LndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvZGF0YS9sb2NhdG9yL3Rlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkMzFjYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvZGF0YS9sb2NhdG9yL3Rlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9BcmVhU2VydmljZS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJBcmVhU2VydmljZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvQXJlYVNlcnZpY2UvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvQXJlYVNlcnZpY2UvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcmVhIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJ0bnM6ZGltZW5zaW9ucyIvPgotICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaW1lbnNpb25zIj4KLSAgICAgIAk8eHNkOnNlcXVlbmNlPgotICAgICAgCQk8eHNkOmVsZW1lbnQgbmFtZT0id2lkdGgiIHR5cGU9InhzZDpmbG9hdCI+PC94c2Q6ZWxlbWVudD4KLSAgICAgIAkJPHhzZDplbGVtZW50IG5hbWU9ImhlaWdodCIgdHlwZT0ieHNkOmZsb2F0Ij48L3hzZDplbGVtZW50PgotICAgICAgCTwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8L3hzZDpzY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJDYWxjdWxhdGVSZWN0QXJlYVJlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczphcmVhIiBuYW1lPSJhcmVhIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9IkNhbGN1bGF0ZVJlY3RBcmVhUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6cGFyYW1ldGVycyIgbmFtZT0icGFyYW1ldGVycyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQXJlYVNlcnZpY2UiPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDYWxjdWxhdGVSZWN0QXJlYSI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6Q2FsY3VsYXRlUmVjdEFyZWFSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOkNhbGN1bGF0ZVJlY3RBcmVhUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQXJlYVNlcnZpY2VTT0FQIiB0eXBlPSJ0bnM6QXJlYVNlcnZpY2UiPgotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDYWxjdWxhdGVSZWN0QXJlYSI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0FyZWFTZXJ2aWNlL05ld09wZXJhdGlvbiIvPgotICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFyZWFTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpBcmVhU2VydmljZVNPQVAiIG5hbWU9IkFyZWFTZXJ2aWNlU09BUCI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmciLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzNlYzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDYwNDI0ICAgMTM4MDYwIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdTVCBXZWIgU2VydmljZXMgVGVzdAotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzdlNDhhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotICAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvcmVhZG1lLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRlMDM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1DdXJyZW50bHkgbm8gYXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbi4gIFNlZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMgZm9yIGFkZGluZwotYXJndW1lbnRzIHdoZW4gcnVubmluZyB0ZXN0IHN1aXRlIChpLmUuIHNlcnZlciBpbnN0YWxsIGxvY2F0aW9uLi4uKQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkxYWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gPCEtLSA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0gIDwhLS0gY29tbWVudGVkIGZvciBub3cgdW50aWwgc3VjaCBhIHRpbWUgYXMgd2UgbmVlZCB0byBjYWxsIGEgc2VydmVyIGZvciB3c3QgdGVzdHMgLS0+Ci0gIDwhLS08cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwPSR7dGVzdERpcn0vJHt0b21jYXQ1MERpcn0iLz4gLS0+Ci0JCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9IndzdC13cy1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vd3N0X3dzX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke3dzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d3N0LXdzLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLnVuaXR0ZXN0LkFsbFdTSlVuaXRUZXN0cyIgLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci08IS0tICAgCSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4gICAgCS0tPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy9kYXRhL0xvY2F0b3JXb3Jrc3BhY2VTZXR1cC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy9kYXRhL0xvY2F0b3JXb3Jrc3BhY2VTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU1ZmE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvZGF0YS9Mb2NhdG9yV29ya3NwYWNlU2V0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cy5kYXRhOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MudGVzdHMucGx1Z2luLlRlc3RzUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3Igam9hbgotICogIFNldHMgdXAgbG9jYXRvciB0ZXN0IGRhdGEgLSB1c2VzIHNhbWUgZGF0YSBmaWxlIGJ1dCByZW5hbWVzIGl0IGZvciBlYWNoIHVzZQotICogIFdvcmtzcGFjZSBzdHJ1Y3R1cmUgY3JlYXRlZCBsb29rcyBsaWtlIHRoaXM6Ci0gKiAgCi0gKiAgcm9vdAotICogIC0tcHJvamVjdDEKLSAqICAgIHwtLS0tZm9sZGVyMQotICogICAgICAgICB8LS0tLS1mb2xkZXIyCi0gKiAgICAgICAgICAgICAgIHwtLS0tLS1vbmUud3NkbAotICogICAgICAgICB8LS0tLS10d28ud3NkbAotICogICAgfC0tLS1mb2xkZXIzCi0gKiAgICAgICAgIHwtLS0tLXRocmVlLndzZGwKLSAqICAgICAgICAgfC0tLS0tZm91ci53c2RsIAotICogIC0tcHJvamVjdDIKLSAqICAgIHwtLS0tZml2ZS53c2RsCi0gKiAgICB8LS0tLWZvbGRlcjQKLSAqICAgIHwtLS0tZm9sZGVyNQotICogICAgICAgICB8LS0tLS1zaXgud3NkbAotICogIC0tcHJvamVjdDMKLSAqICAgIHwtLS0tb25lLnhtbAotICovCi0KLXB1YmxpYyBjbGFzcyBMb2NhdG9yV29ya3NwYWNlU2V0dXAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1QxX05BTUUgPSAiUHJvamVjdDEiOwotCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgRk9MREVSMV9OQU1FID0gIkZvbGRlcjEiOyAgLy9jb250YWlucyBXU0RMIGZpbGUgYW5kIG9uZSBmb2xkZXIgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBGT0xERVIyX05BTUUgPSAiRm9sZGVyMiI7ICAvL25lc3RlZCBpbiBmb2xkZXIgMSBhbmQgY29udGFpbnMgV1NETCBmaWxlCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBGT0xERVIzX05BTUUgPSAiRm9sZGVyMyI7ICAvL2NvbnRhaW5zIHR3byBXU0RMIGZpbGVzCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUMl9OQU1FID0gIlByb2plY3QyIjsgLy9jb250YWlucyBXU0RMIGZpbGUgYW5kIHR3byBmb2xkZXJzCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBGT0xERVI0X05BTUUgPSAiRm9sZGVyNCI7ICAvL2NvbnRhaW5zIG5vIFdTREwKLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZPTERFUjVfTkFNRSA9ICJGb2xkZXI1IjsgIC8vY29udGFpbnMgb25lIFdTREwgZmlsZQotCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVDNfTkFNRSA9ICJQcm9qZWN0MyI7ICAvL2NvbnRhaW5zIG5vIFdTREwgZmlsZXMgYnV0IG9uZSBYTUwgZmlsZQotCSAgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMRklMRV9PTkUgPSAib25lLndzZGwiOwotCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETEZJTEVfVFdPID0gInR3by53c2RsIjsKLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExGSUxFX1RIUkVFID0gInRocmVlLndzZGwiOwotCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETEZJTEVfRk9VUiA9ICJmb3VyLndzZGwiOwotCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETEZJTEVfRklWRSA9ICJmaXZlLndzZGwiOwotCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETEZJTEVfU0lYID0gInNpeC53c2RsIjsKLQkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEZJTEVfT05FID0gIm9uZS5YTUwiOwotCSAgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBBQ1RVQUxfVEVTVEZJTEVQQVRIID0gImRhdGEvbG9jYXRvci90ZXN0LndzZGwiOwotCSAgCSAgCi0JICBwcml2YXRlIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCSAgCi0JICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotCSAgewotCSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShMb2NhdG9yV29ya3NwYWNlU2V0dXAuY2xhc3MsICJMb2NhdG9yV29ya3NwYWNlU2V0dXAiKTsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIHZvaWQgY2xvc2VJbnRybygpCi0JICB7Ci0JICAgIElJbnRyb01hbmFnZXIgaW50cm9NYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRJbnRyb01hbmFnZXIoKTsKLQkgICAgSUludHJvUGFydCBpbnRyb1BhcnQgPSBpbnRyb01hbmFnZXIuZ2V0SW50cm8oKTsKLQkgICAgaWYgKGludHJvUGFydCAhPSBudWxsKQotCSAgICAgIGludHJvTWFuYWdlci5jbG9zZUludHJvKGludHJvUGFydCk7Ci0JICB9Ci0KLQkgIHByb3RlY3RlZCBJUHJvamVjdCBjcmVhdGVTaW1wbGVQcm9qZWN0KFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAgewotCSAgICBJUHJvamVjdCBzaW1wbGVQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KG5hbWUpOwotCSAgICBzaW1wbGVQcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkgICAgc2ltcGxlUHJvamVjdC5vcGVuKG51bGwpOwotCSAgICByZXR1cm4gc2ltcGxlUHJvamVjdDsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIElGb2xkZXIgY3JlYXRlRm9sZGVyKElDb250YWluZXIgcGFyZW50LCBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgIHsKLQkJSUZvbGRlciBmb2xkZXIxID0gcGFyZW50LmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0gICAgICAgIGZvbGRlcjEuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKLQkgICAgcmV0dXJuIGZvbGRlcjE7Ci0JICB9Ci0KLQkgIAotCSAgcHJvdGVjdGVkIHZvaWQgY29weUZpbGUoSUNvbnRhaW5lciBwcm9qZWN0LCBTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JICB7Ci0JCSAgCi0JICAgIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUobmV3IFBhdGgoZGVzdCkpOwotCSAgICBmaWxlLmNyZWF0ZShUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoc291cmNlKS5vcGVuU3RyZWFtKCksIHRydWUsIG51bGwpOwotCSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIHZvaWQgam9pbkF1dG9CdWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICB7Ci0JICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSB0cnVlOwotCSAgICB3aGlsZSAoaW50ZXJydXB0ZWQpCi0JICAgIHsKLQkgICAgICB0cnkKLQkgICAgICB7Ci0JICAgICAgICBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCSAgICAgICAgaW50ZXJydXB0ZWQgPSBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JICAgICAgewotCSAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCi0JICBwdWJsaWMgdm9pZCB0ZXN0U2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0JICB7Ci0JCSAgdHJ5ewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBsb2NhdG9yIGRhdGEgc2V0dXAgc3RhcnRpbmciKTsKLQkgICAgY2xvc2VJbnRybygpOwotCi0JICAgIElQcm9qZWN0IHByb2plY3QxID0gY3JlYXRlU2ltcGxlUHJvamVjdChQUk9KRUNUMV9OQU1FKTsKLQkgICAgSUZvbGRlciBmb2xkZXIxID0gY3JlYXRlRm9sZGVyKHByb2plY3QxLCBGT0xERVIxX05BTUUpOwotCSAgICBjb3B5RmlsZShmb2xkZXIxLCBBQ1RVQUxfVEVTVEZJTEVQQVRILCBXU0RMRklMRV9UV08pOwotCSAgICBJRm9sZGVyIGZvbGRlcjIgPSBjcmVhdGVGb2xkZXIoZm9sZGVyMSwgRk9MREVSMl9OQU1FKTsKLQkgICAgY29weUZpbGUoZm9sZGVyMiwgQUNUVUFMX1RFU1RGSUxFUEFUSCwgV1NETEZJTEVfT05FKTsKLQkgICAgSUZvbGRlciBmb2xkZXIzID0gY3JlYXRlRm9sZGVyKHByb2plY3QxLCBGT0xERVIzX05BTUUpOwotCSAgICBjb3B5RmlsZShmb2xkZXIzLCBBQ1RVQUxfVEVTVEZJTEVQQVRILCBXU0RMRklMRV9USFJFRSk7Ci0JICAgIGNvcHlGaWxlKGZvbGRlcjMsIEFDVFVBTF9URVNURklMRVBBVEgsIFdTRExGSUxFX0ZPVVIpOwotCSAgICAKLQkgICAgSVByb2plY3QgcHJvamVjdDIgPSBjcmVhdGVTaW1wbGVQcm9qZWN0KFBST0pFQ1QyX05BTUUpOwotCSAgICBjb3B5RmlsZShwcm9qZWN0MiwgQUNUVUFMX1RFU1RGSUxFUEFUSCwgV1NETEZJTEVfRklWRSk7Ci0JICAgIGNyZWF0ZUZvbGRlcihwcm9qZWN0MiwgRk9MREVSNF9OQU1FKTsgIC8vZm9sZGVyIHdpdGggbm8gY29udGVudAotCSAgICBJRm9sZGVyIGZvbGRlcjUgPSBjcmVhdGVGb2xkZXIocHJvamVjdDIsIEZPTERFUjVfTkFNRSk7Ci0JICAgIGNvcHlGaWxlKGZvbGRlcjUsIEFDVFVBTF9URVNURklMRVBBVEgsIFdTRExGSUxFX1NJWCk7Ci0JICAgIElQcm9qZWN0IHByb2plY3QzID0gY3JlYXRlU2ltcGxlUHJvamVjdChQUk9KRUNUM19OQU1FKTsKLQkgICAgY29weUZpbGUocHJvamVjdDMsIEFDVFVBTF9URVNURklMRVBBVEgsIFhNTEZJTEVfT05FKTsKLQkJICB9Ci0JCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkgIHsKLQkJCSAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJICB9Ci0JIAotCQkvL2NvZGUgdG8gY2hlY2sgd29ya3NwYWNlIHNldCB1cCAtIGRlYnVnCi0JCS8qRGF0YVJlc291cmNlVmlzaXRvciB2aXNpdG9yID0gbmV3IERhdGFSZXNvdXJjZVZpc2l0b3IoKTsKLQkgICAgcm9vdC5hY2NlcHQodmlzaXRvcik7Ci0JICAgIHZpc2l0b3IudmlzaXQocm9vdCk7Ki8KLQkgICAgCi0JICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIGxvY2F0b3IgZGF0YSBzZXR1cCBjb21wbGV0ZSIpOwotCSAgfQotCQotCXByb3RlY3RlZCBjbGFzcyBEYXRhUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlVmlzaXRvcgotCXsKLSAgICAJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCQlpZiAoKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHx8IChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpKQotICAgIAkJewotICAgIAkJICBTeXN0ZW0ub3V0LnByaW50bG4oInZpc2l0aW5nICIgKyByZXNvdXJjZS5nZXROYW1lKCkpOyAgICAJCSAgCi0gICAgCQl9Ci0gICAgCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgIAkJewotICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgZmlsZSAiICsgcmVzb3VyY2UuZ2V0TmFtZSgpKTsgICAgCQkJCi0gICAgCQl9Ci0gICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvcGx1Z2luL1Rlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3BsdWdpbi9UZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTU2YjY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvcGx1Z2luL1Rlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cy5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBUZXN0c1BsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3RzUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L0FsbFdTSlVuaXRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91bml0dGVzdC9BbGxXU0pVbml0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiYWY5Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L0FsbFdTSlVuaXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MudGVzdHMudW5pdHRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MudGVzdHMuZGF0YS5Mb2NhdG9yV29ya3NwYWNlU2V0dXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRvIHJ1biBhbGwgdGhlIHVuaXR0ZXN0IHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsV1NKVW5pdFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgLyoqCi0gICAqIE1ldGhvZCBwYXJzZUFyZ3MuCi0gICAqIAotICAgKiBAcGFyYW0gYXJncwotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlQXJncyhPYmplY3QgYXJncykKLSAgewotICAgIC8vIHR5cGljaWFsbHkgYXJncyBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLAotICAgIC8vIG5vdCBzdXJlIHdoZW4gaXQgd291bGRuJ3QgYmUuCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgbmV3IEFsbFdTSlVuaXRUZXN0cygpLnJ1bk1haW4oYXJncyk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHJ1bk1haW4oT2JqZWN0IGFyZ3MpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUZXN0UnVubmVyIHRlc3RSdW5uZXIgPSBudWxsOwotCi0gICAgICBwYXJzZUFyZ3MoYXJncyk7Ci0KLSAgICAgIHRlc3RSdW5uZXIgPSBuZXcgVGVzdFJ1bm5lcihTeXN0ZW0ub3V0KTsKLSAKLQotICAgICAgVGVzdCBzdWl0ZSA9IHN1aXRlKCk7Ci0gICAgICBUZXN0UmVzdWx0IHRlc3RSZXN1bHQgPSB0ZXN0UnVubmVyLmRvUnVuKHN1aXRlLCBmYWxzZSk7Ci0gICAgICBwcmludEhlYWRlcih0ZXN0UmVzdWx0KTsgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotIC8vYWRkIHVuaXQgdGVzdHMgdG8gc3VpdGUgaGVyZS4uLgotICAgIHRlc3RTdWl0ZS5hZGRUZXN0KCBMb2NhdG9yV29ya3NwYWNlU2V0dXAuc3VpdGUoKSk7Ci0gICAgdGVzdFN1aXRlLmFkZFRlc3QoIFdlYlNlcnZpY2VGaW5kZXJUZXN0cy5zdWl0ZSgpKTsKLSAgICByZXR1cm4gdGVzdFN1aXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50cyB0aGUgaGVhZGVyIG9mIHRoZSByZXBvcnQKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByaW50SGVhZGVyKFRlc3RSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgaWYgKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50KCJPSyIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgKCIgKyByZXN1bHQucnVuQ291bnQoKSArICIgdGVzdHMpIik7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFUyEhISIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAiVGVzdHMgcnVuOiAiCi0gICAgICAgICAgKyByZXN1bHQucnVuQ291bnQoKQotICAgICAgICAgICsgIiwgIEZhaWx1cmVzOiAiCi0gICAgICAgICAgKyByZXN1bHQuZmFpbHVyZUNvdW50KCkKLSAgICAgICAgICArICIsICBFcnJvcnM6ICIKLSAgICAgICAgICArIHJlc3VsdC5lcnJvckNvdW50KCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91bml0dGVzdC9MYXVuY2hUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L0xhdW5jaFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2ZWZlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L0xhdW5jaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLnVuaXR0ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotCi0vKioKLSAqIE1pbmltYWwgYXBwIHRvIHJ1biBhcyBFY2xpcHNlICJhcHBsaWNhdGlvbiIKLSAqLwotcHVibGljIGNsYXNzIExhdW5jaFRlc3QgaW1wbGVtZW50cyBJUGxhdGZvcm1SdW5uYWJsZQotewotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsYXRmb3JtUnVubmFibGUjcnVuKE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgcnVuKE9iamVjdCBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQotICAgIE9iamVjdCByZXN1bHQgPSBuZXcgQWxsV1NKVW5pdFRlc3RzKCkucnVuTWFpbihhcmdzKTsKLQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgVGhyb3dhYmxlKQotICAgICAgewotICAgICAgICAoKFRocm93YWJsZSkgcmVzdWx0KS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0cyBkaWRuJ3QgcmV0dXJuICdvayciKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L1JlZ2lzdHJ5VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvdW5pdHRlc3QvUmVnaXN0cnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTVlM2YwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvdW5pdHRlc3QvUmVnaXN0cnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLnVuaXR0ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5Lk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC5yZWdpc3RyeS5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnJlZ2lzdHJ5LlJlZ2lzdHJ5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnRheG9ub215LkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb2RlbC52MTAudGF4b25vbXkuVGF4b25vbXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC50YXhvbm9teS5UYXhvbm9teUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVGF4b25vbWllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9kZWwudjEwLnVkZGlyZWdpc3RyeS5VRERJUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vZGVsLnYxMC51ZGRpcmVnaXN0cnkuVURESVJlZ2lzdHJ5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuSVJlZ2lzdHJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucmVnaXN0cnkuUmVnaXN0cnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5yZWdpc3RyeS5VRERJUmVnaXN0cnlTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgUmVnaXN0cnlUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlICgpCi0JewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyeVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFRheG9ub215IG1vZGVsIGFuZCBwYXNzZXMgaXQgdG8KLQkgKiA8Y29kZT5SZWdpc3RyeVNlcnZpY2Uuc2F2ZVRheG9ub215KCk8L2NvZGU+Ci0JICogd2hlcmUgdGhlIG1vZGVsIGlzIHBlcnNpc3RlZCB0byBhIHBsYXRmb3JtCi0JICogc3BlY2lmaWVkIHRlbXBvcmFyeSBmaWxlc3lzdGVtIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUmVnaXN0cnlTZXJ2aWNlX3NhdmVUYXhvbm9teSAoKQotCXsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTVEFSVElORyB0ZXN0X1JlZ2lzdHJ5U2VydmljZV9zYXZlVGF4b25vbXkiKTsKLQkJdHJ5Ci0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgUmVnaXN0cnlTZXJ2aWNlIGFuZCBUYXhvbm9teSIpOwotCQkJUmVnaXN0cnlTZXJ2aWNlIHJlZ2lzdHJ5U2VydmljZSA9IFJlZ2lzdHJ5U2VydmljZS5pbnN0YW5jZSgpOwkJCQotCQkJVGF4b25vbXkgdGF4b25vbXkgPSByZWdpc3RyeVNlcnZpY2UubmV3VGF4b25vbXkoKTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZGluZyBhIHNpbXBsZSBUYXhvbm9teSBtb2RlbCIpOwotCQkJdGF4b25vbXkuc2V0SWQoIm15LnRheG9ub215Iik7Ci0JCQl0YXhvbm9teS5zZXROYW1lKCJNeSBUYXhvbm9teSIpOwotCQkJRUxpc3QgbGlzdCA9IHRheG9ub215LmdldENhdGVnb3J5KCk7Ci0JCQlDYXRlZ29yeSBjYXRlZ29yeTEgPSBUYXhvbm9teUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhdGVnb3J5KCk7Ci0JCQljYXRlZ29yeTEuc2V0TmFtZSgiTXkgZmlyc3QgY2F0ZWdvcnkiKTsKLQkJCWNhdGVnb3J5MS5zZXRDb2RlKCIxIik7Ci0JCQlDYXRlZ29yeSBjYXRlZ29yeTIgPSBUYXhvbm9teUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhdGVnb3J5KCk7Ci0JCQljYXRlZ29yeTIuc2V0TmFtZSgiTXkgc2Vjb25kIGNhdGVnb3J5Iik7Ci0JCQljYXRlZ29yeTIuc2V0Q29kZSgiMiIpOwotCQkJQ2F0ZWdvcnkgY2F0ZWdvcnkzID0gVGF4b25vbXlGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXRlZ29yeSgpOwotCQkJY2F0ZWdvcnkzLnNldE5hbWUoIk15IHRoaXJkIGNhdGVnb3J5Iik7Ci0JCQljYXRlZ29yeTMuc2V0Q29kZSgiMi4xIik7Ci0JCQljYXRlZ29yeTIuZ2V0Q2F0ZWdvcnkoKS5hZGQoY2F0ZWdvcnkzKTsKLQkJCWxpc3QuYWRkKGNhdGVnb3J5MSk7Ci0JCQlsaXN0LmFkZChjYXRlZ29yeTIpOwotCi0JCQlGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0YXhvbm9teS4iLCIueG1sIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNhdmluZyB0aGUgVGF4b25vbXkgbW9kZWwgdG8gIitmaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0JCQlyZWdpc3RyeVNlcnZpY2Uuc2F2ZVRheG9ub215KGZpbGUudG9VUkwoKSx0YXhvbm9teSk7Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpCi0JCXsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgVGhyb3dhYmxlIFsiK2V4Yy5nZXRNZXNzYWdlKCkrIl0iKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRklOSVNIRUQgdGVzdF9SZWdpc3RyeVNlcnZpY2Vfc2F2ZVRheG9ub215XG4iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgVURESSBSZWdpc3RyeSBtb2RlbCBhbmQgcGFzc2VzIGl0IHRvCi0JICogPGNvZGU+UmVnaXN0cnlTZXJ2aWNlLnNhdmVSZWdpc3RyeSgpPC9jb2RlPgotCSAqIHdoZXJlIHRoZSBtb2RlbCBpcyBwZXJzaXN0ZWQgdG8gYSBwbGF0Zm9ybQotCSAqIHNwZWNpZmllZCB0ZW1wb3JhcnkgZmlsZXN5c3RlbSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1JlZ2lzdHJ5U2VydmljZV9zYXZlUmVnaXN0cnkgKCkKLQl7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU1RBUlRJTkcgdGVzdF9SZWdpc3RyeVNlcnZpY2Vfc2F2ZVJlZ2lzdHJ5Iik7Ci0JCXRyeQotCQl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIFJlZ2lzdHJ5U2VydmljZSwgVURESVJlZ2lzdHJ5U2VydmljZSBhbmQgUmVnaXN0cnkiKTsKLQkJCVJlZ2lzdHJ5U2VydmljZSByZWdpc3RyeVNlcnZpY2UgPSBSZWdpc3RyeVNlcnZpY2UuaW5zdGFuY2UoKTsKLQkJCVVERElSZWdpc3RyeVNlcnZpY2UgdWRkaVJlZ2lzdHJ5U2VydmljZSA9IFVERElSZWdpc3RyeVNlcnZpY2UuaW5zdGFuY2UoKTsJCQkKLQkJCVVERElSZWdpc3RyeSB1ZGRpUmVnaXN0cnkgPSB1ZGRpUmVnaXN0cnlTZXJ2aWNlLm5ld1VERElSZWdpc3RyeSgpOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkaW5nIGEgc2ltcGxlIFJlZ2lzdHJ5IG1vZGVsIik7Ci0JCQl1ZGRpUmVnaXN0cnkuc2V0SWQoIm15LnJlZ2lzdHJ5Iik7Ci0JCQl1ZGRpUmVnaXN0cnkuc2V0VmVyc2lvbigiMi4wIik7Ci0JCQl1ZGRpUmVnaXN0cnkuc2V0RGlzY292ZXJ5VVJMKCJodHRwOi8vc29tZS5kaXNjb3ZlcnkudXJsIik7Ci0JCQl1ZGRpUmVnaXN0cnkuc2V0UHVibGljYXRpb25VUkwoImh0dHA6Ly9zb21lLnB1YmxpY2F0aW9uLnVybCIpOwotCQkJdWRkaVJlZ2lzdHJ5LnNldERlZmF1bHRMb2dpbigiaG9ja2V5ZmFuYXRpYyIpOwotCQkJTmFtZSBuYW1lID0gUmVnaXN0cnlGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOYW1lKCk7Ci0JCQluYW1lLnNldFZhbHVlKCJNeSBSZWdpc3RyeSIpOwotCQkJdWRkaVJlZ2lzdHJ5LmdldE5hbWUoKS5hZGQobmFtZSk7Ci0JCQlUYXhvbm9teSB0YXhvbm9teVJlZiA9IHJlZ2lzdHJ5U2VydmljZS5uZXdUYXhvbm9teSgpOwotCQkJdGF4b25vbXlSZWYuc2V0UmVmKCJteS50YXhvbm9teSIpOwotCQkJVGF4b25vbWllcyB0ID0gdWRkaVJlZ2lzdHJ5LmdldFRheG9ub21pZXMoKTsKLQkJCWlmICh0ID09IG51bGwpCi0JCQl7Ci0JCQkJdCA9IFVERElSZWdpc3RyeUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRheG9ub21pZXMoKTsKLQkJCQl1ZGRpUmVnaXN0cnkuc2V0VGF4b25vbWllcyh0KTsKLQkJCX0KLQkJCUVMaXN0IGUgPSB0LmdldFRheG9ub215KCk7Ci0JCQllLmFkZCh0YXhvbm9teVJlZik7Ci0KLQkJCUZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInJlZ2lzdHJ5LiIsIi54bWwiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2F2aW5nIHRoZSBSZWdpc3RyeSBtb2RlbCB0byAiK2ZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCXJlZ2lzdHJ5U2VydmljZS5zYXZlUmVnaXN0cnkoZmlsZS50b1VSTCgpLHVkZGlSZWdpc3RyeSk7Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpCi0JCXsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgVGhyb3dhYmxlIFsiK2V4Yy5nZXRNZXNzYWdlKCkrIl0iKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRklOSVNIRUQgdGVzdF9SZWdpc3RyeVNlcnZpY2Vfc2F2ZVJlZ2lzdHJ5XG4iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgVURESSBSZWdpc3RyeSBtb2RlbCBhbmQgYSBuZXcgVGF4b25vbXkKLQkgKiBtb2RlbCwgYXNzb2NpYXRlcyB0aGUgbGF0dGVyIHdpdGggdGhlIGZvcm1lciwgYW5kCi0JICogZHJpdmVzIDxjb2RlPklSZWdpc3RyeU1hbmFnZXIuc2F2ZVJlZ2lzdHJ5KCk8L2NvZGU+Ci0JICogdG8gc2F2ZSB0aGUgbW9kZWxzIGFuZCB0aGUgaW5kZXggZG9jdW1lbnQgdG8gdGhlCi0JICogcHJlZmVycmVkIGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9SZWdpc3RyeU1hbmFnZXJfc2F2ZVJlZ2lzdHJ5KCkKLQl7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU1RBUlRJTkcgdGVzdF9SZWdpc3RyeU1hbmFnZXJfc2F2ZVJlZ2lzdHJ5Iik7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIFJlZ2lzdHJ5U2VydmljZSBhbmQgR2V0dGluZyBSZWdpc3RyeU1hbmFnZXIiKTsJCi0JCQlSZWdpc3RyeVNlcnZpY2UgcmVnaXN0cnlTZXJ2aWNlID0gUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk7CQotCQkJSVJlZ2lzdHJ5TWFuYWdlciByZWdNYW5hZ2VyID0gcmVnaXN0cnlTZXJ2aWNlLmdldERlZmF1bHRSZWdpc3RyeU1hbmFnZXIoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IGluZGV4IGlzICIgKyByZWdNYW5hZ2VyLmdldFVSTCgpKTsKLQotCQkJLy9idWlsZCB0aGUgaG9ja2V5IHRheG9ub215Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkaW5nIHRoZSBob2NrZXkgVGF4b25vbXkgbW9kZWwiKTsKLQkJCVRheG9ub215IGhvY2tleVRheG9ub215ID0gcmVnaXN0cnlTZXJ2aWNlLm5ld1RheG9ub215KCk7Ci0JCQlob2NrZXlUYXhvbm9teS5zZXRJZCgiaG9ja2V5LnRheG9ub215Iik7Ci0JCQlob2NrZXlUYXhvbm9teS5zZXROYW1lKCJob2NrZXkgVGF4b25vbXkiKTsKLQkJCUVMaXN0IGxpc3QgPSBob2NrZXlUYXhvbm9teS5nZXRDYXRlZ29yeSgpOwotCQkJQ2F0ZWdvcnkgY2F0ZWdvcnkxID0gVGF4b25vbXlGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXRlZ29yeSgpOwotCQkJQ2F0ZWdvcnkgY2F0ZWdvcnk0ID0gVGF4b25vbXlGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXRlZ29yeSgpOwotCQkJY2F0ZWdvcnk0LnNldE5hbWUoIlBybyIpOwotCQkJY2F0ZWdvcnk0LnNldENvZGUoIjQiKTsKLQkJCUNhdGVnb3J5IGNhdGVnb3J5NSA9IFRheG9ub215RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2F0ZWdvcnkoKTsKLQkJCWNhdGVnb3J5NS5zZXROYW1lKCJBSEwiKTsKLQkJCWNhdGVnb3J5NS5zZXRDb2RlKCI0LjEiKTsKLQkJCUNhdGVnb3J5IGNhdGVnb3J5NiA9IFRheG9ub215RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2F0ZWdvcnkoKTsKLQkJCWNhdGVnb3J5Ni5zZXROYW1lKCJOSEwiKTsKLQkJCWNhdGVnb3J5Ni5zZXRDb2RlKCI0LjIiKTsKLQkJCWNhdGVnb3J5MS5zZXROYW1lKCJKdW5pb3IiKTsKLQkJCWNhdGVnb3J5MS5zZXRDb2RlKCIxIik7Ci0JCQlDYXRlZ29yeSBjYXRlZ29yeTIgPSBUYXhvbm9teUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhdGVnb3J5KCk7Ci0JCQljYXRlZ29yeTIuc2V0TmFtZSgiTWlkZ2V0Iik7Ci0JCQljYXRlZ29yeTIuc2V0Q29kZSgiMiIpOwotCQkJQ2F0ZWdvcnkgY2F0ZWdvcnkzID0gVGF4b25vbXlGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXRlZ29yeSgpOwotCQkJY2F0ZWdvcnkzLnNldE5hbWUoIkJhbnRhbSIpOwotCQkJY2F0ZWdvcnkzLnNldENvZGUoIjMiKTsKLQkJCWNhdGVnb3J5NC5nZXRDYXRlZ29yeSgpLmFkZChjYXRlZ29yeTUpOwotCQkJY2F0ZWdvcnk0LmdldENhdGVnb3J5KCkuYWRkKGNhdGVnb3J5Nik7Ci0JCQlsaXN0LmFkZChjYXRlZ29yeTEpOwotCQkJbGlzdC5hZGQoY2F0ZWdvcnkyKTsKLQkJCWxpc3QuYWRkKGNhdGVnb3J5Myk7Ci0JCQlsaXN0LmFkZChjYXRlZ29yeTQpOwotCQkJCi0JCQkvL3NhdmUgdGhlIGhvY2tleSB0YXhvbm9teQotCQkJVGF4b25vbXkgaG9ja2V5VGF4b25vbXlSZWYgPSByZWdNYW5hZ2VyLnNhdmVUYXhvbm9teShob2NrZXlUYXhvbm9teSk7Ci0KLQkJCS8vbWFrZSB0aGUgaG9ja2V5IHJlZ2lzdHJ5Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkaW5nIHRoZSBob2NrZXkgUmVnaXN0cnkgbW9kZWwiKTsKLQkJCVVERElSZWdpc3RyeVNlcnZpY2UgdWRkaVJlZ2lzdHJ5U2VydmljZSA9IFVERElSZWdpc3RyeVNlcnZpY2UuaW5zdGFuY2UoKTsJCQkKLQkJCVVERElSZWdpc3RyeSB1ZGRpUmVnaXN0cnkgPSB1ZGRpUmVnaXN0cnlTZXJ2aWNlLm5ld1VERElSZWdpc3RyeSgpOwotCQkJdWRkaVJlZ2lzdHJ5LnNldElkKCJob2NrZXkucmVnaXN0cnkiKTsKLQkJCXVkZGlSZWdpc3RyeS5zZXRWZXJzaW9uKCIyLjAiKTsKLQkJCXVkZGlSZWdpc3RyeS5zZXREZWZhdWx0TG9naW4oImhvY2tleWZhbmF0aWMiKTsKLQkJCXVkZGlSZWdpc3RyeS5zZXREaXNjb3ZlcnlVUkwoImh0dHA6Ly9zb21lLmRpc2NvdmVyeS51cmwiKTsKLQkJCXVkZGlSZWdpc3RyeS5zZXRQdWJsaWNhdGlvblVSTCgiaHR0cDovL3NvbWUucHVibGljYXRpb24udXJsIik7Ci0JCQlOYW1lIG5hbWUgPSBSZWdpc3RyeUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5hbWUoKTsKLQkJCW5hbWUuc2V0VmFsdWUoIkhvY2tleSBSZWdpc3RyeSIpOwotCQkJdWRkaVJlZ2lzdHJ5LmdldE5hbWUoKS5hZGQobmFtZSk7Ci0KLQkJCS8vIEFkZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSB0YXhvbm9teSAoc2F2ZWQgYWJvdmUpIHRvIHRoZSByZWdpc3RyeS4gIAotCQkJdWRkaVJlZ2lzdHJ5U2VydmljZS5hZGRUYXhvbm9teSh1ZGRpUmVnaXN0cnksaG9ja2V5VGF4b25vbXlSZWYpOwotCi0JCQkvKgotCQkJVURESVRheG9ub215RmluZGVyIFVJVEZpbmRlciA9IG5ldyBVRERJVGF4b25vbXlGaW5kZXIoKTsKLQkJCXJlZ01hbmFnZXIuYWRkVGF4b25vbXlGaW5kZXIodWRkaVJlZ2lzdHJ5LmdldENsYXNzKCkuZ2V0TmFtZSgpLFVJVEZpbmRlcik7Ci0JCQkqLwotCQkJLy8gU2F2ZSB0aGUgdGhpbmcuCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNhdmluZyB0aGUgaG9ja2V5IFJlZ2lzdHJ5IG1vZGVsIik7Ci0JCQlyZWdNYW5hZ2VyLnNhdmVSZWdpc3RyeSh1ZGRpUmVnaXN0cnkpOwotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgZXhjKQotCQl7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIFRocm93YWJsZSBbIitleGMuZ2V0TWVzc2FnZSgpKyJdIik7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZJTklTSEVEIHRlc3RfUmVnaXN0cnlNYW5hZ2VyX3NhdmVSZWdpc3RyeVxuIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVnaXN0cnkgYW5kIHRheG9ub215IGluIHRoZSBpbmRleCBjcmVhdGVkIGluCi0JICogdGVzdF9SZWdpc3RyeU1hbmFnZXJfc2F2ZVJlZ2lzdHJ5LCB0aGVuIGFzc2VydHMgdGhhdCB0aGUKLQkgKiBjb250ZW50IG9mIHRoZSBtb2RlbCBpcyB3aGF0IHdlIGV4cGVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1JlZ2lzdHJ5TWFuYWdlcl9sb2FkUmVnaXN0cnkoKQotCXsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTVEFSVElORyB0ZXN0X1JlZ2lzdHJ5TWFuYWdlcl9sb2FkUmVnaXN0cnkiKTsKLQkJdHJ5IHsKLQkJCS8vIFNldHVwCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIFJlZ2lzdHJ5U2VydmljZSBhbmQgR2V0dGluZyBSZWdpc3RyeU1hbmFnZXIiKTsJCi0JCQlSZWdpc3RyeVNlcnZpY2UgcmVnaXN0cnlTZXJ2aWNlID0gUmVnaXN0cnlTZXJ2aWNlLmluc3RhbmNlKCk7CQotCQkJSVJlZ2lzdHJ5TWFuYWdlciByZWdNYW5hZ2VyID0gcmVnaXN0cnlTZXJ2aWNlLmdldERlZmF1bHRSZWdpc3RyeU1hbmFnZXIoKTsKLQkJCQotCQkJLy8gR2V0IHRoZSBvbmUgcmVnaXN0cnkgVVJJIHdlIGV4cGVjdCwgYW5kIGxvYWQgdGhlIHJlZ2lzdHJ5LgotCQkJU3RyaW5nW10gcmVnaXN0cmllcyA9IHJlZ01hbmFnZXIuZ2V0UmVnaXN0cnlVUklzKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJlZ2lzdHJpZXMgIityZWdpc3RyaWVzLmxlbmd0aCxyZWdpc3RyaWVzLmxlbmd0aCwxKTsKLQkJCVN0cmluZyB1cmkgPSByZWdpc3RyaWVzWzBdOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIHJlZ2lzdHJ5ICIgKyB1cmkpOwotCQkJUmVnaXN0cnkgcmVnaXN0cnkgPSByZWdNYW5hZ2VyLmxvYWRSZWdpc3RyeSh1cmkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCByZWdpc3RyeSAiICsgcmVnaXN0cnkuZ2V0SWQoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkRpZCBub3QgZmluZCBob2NrZXkgcmVnaXN0cnkiLCJob2NrZXkucmVnaXN0cnkiLHJlZ2lzdHJ5LmdldElkKCkpOwotCQkJCi0JCQkvLyBJdCdzIHN1cHBvc2VkIHRvIGJlIGEgVURESSByZWdpc3RyeS4gVmVyaWZ5IGl0IGFuZCBjaGVjayBpdHMgdmFsdWVzLgotCQkJYXNzZXJ0VHJ1ZSgiUmVnaXN0cnkgaXMgbm90IGEgVURESVJlZ2lzdHJ5IiwocmVnaXN0cnkgaW5zdGFuY2VvZiBVRERJUmVnaXN0cnkpKTsKLQkJCVVERElSZWdpc3RyeSB1ZGRpUmVnaXN0cnkgPSAoVURESVJlZ2lzdHJ5KXJlZ2lzdHJ5OwotCQkJYXNzZXJ0RXF1YWxzKHVkZGlSZWdpc3RyeS5nZXRWZXJzaW9uKCksIjIuMCIpOwotCQkJYXNzZXJ0RXF1YWxzKHVkZGlSZWdpc3RyeS5nZXREZWZhdWx0TG9naW4oKSwiaG9ja2V5ZmFuYXRpYyIpOwotCQkJYXNzZXJ0RXF1YWxzKHVkZGlSZWdpc3RyeS5nZXREaXNjb3ZlcnlVUkwoKSwiaHR0cDovL3NvbWUuZGlzY292ZXJ5LnVybCIpOwotCQkJYXNzZXJ0RXF1YWxzKHVkZGlSZWdpc3RyeS5nZXRQdWJsaWNhdGlvblVSTCgpLCJodHRwOi8vc29tZS5wdWJsaWNhdGlvbi51cmwiKTsKLQkJCQotCQkJLy8gTG9hZCB0aGUgdGF4b25vbWllcyB1c2VkIHRoZSBVRERJIHJlZ2lzdHJ5LgotCQkJVURESVJlZ2lzdHJ5U2VydmljZSB1ZGRpUmVnaXN0cnlTZXJ2aWNlID0gVURESVJlZ2lzdHJ5U2VydmljZS5pbnN0YW5jZSgpOwotCQkJVGF4b25vbXlbXSB0YXhvbm9taWVzID0gcmVnTWFuYWdlci5sb2FkVGF4b25vbWllcyh1ZGRpUmVnaXN0cnlTZXJ2aWNlLmdldFRheG9ub215VVJJcyh1ZGRpUmVnaXN0cnkpKTsKLQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgdGF4b25vbWllcyAiK3RheG9ub21pZXMubGVuZ3RoLHRheG9ub21pZXMubGVuZ3RoLDEpOwotCQkJVGF4b25vbXkgdGF4b25vbXkgPSB0YXhvbm9taWVzWzBdOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCB0YXhvbm9teSAiICsgdGF4b25vbXkuZ2V0SWQoKSk7Ci0JCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEaWQgbm90IGZpbmQgaG9ja2V5IHRheG9ub215IiwiaG9ja2V5LnRheG9ub215Iix0YXhvbm9teS5nZXRJZCgpKTsKLQkJCQotCQkJLy8gRHVtcCBvdXQgdGhlIHZhbHVlcyAobm8gYXNzZXJ0aW9ucyBoZXJlKS4KLQkJCUVMaXN0IGNMaXN0ID0gdGF4b25vbXkuZ2V0Q2F0ZWdvcnkoKTsKLQkJCWZvcihpbnQgaSA9IDA7aTxjTGlzdC5zaXplKCk7aSsrKXsKLQkJCQlDYXRlZ29yeSBjYXRlZ29yeSA9IChDYXRlZ29yeSljTGlzdC5nZXQoaSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBjYXRlZ29yeSAiICsgY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQkJCQlFTGlzdCBjMkxpc3QgPSBjYXRlZ29yeS5nZXRDYXRlZ29yeSgpOwotCQkJCWZvcihpbnQgaiA9IDA7ajxjMkxpc3Quc2l6ZSgpO2orKyl7Ci0JCQkJCUNhdGVnb3J5IGlDYXRlZ29yeSA9IChDYXRlZ29yeSljMkxpc3QuZ2V0KGopOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIHN1YmNhdGVnb3J5ICIgKyBpQ2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9CQkJCQkKLQkJfQotCQljYXRjaChUaHJvd2FibGUgdCkKLQkJewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWZhaWwoIlVuZXhwZWN0ZWQgVGhyb3dhYmxlIFsiK3QuZ2V0TWVzc2FnZSgpKyJdIik7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZJTklTSEVEIHRlc3RfUmVnaXN0cnlNYW5hZ2VyX2xvYWRSZWdpc3RyeVxuIik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L1Jlc291cmNlVXRpbHNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91bml0dGVzdC9SZXNvdXJjZVV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0ZDA4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L1Jlc291cmNlVXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MudGVzdHMudW5pdHRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNlbmdwbAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgV1NKVW5pdENvbnN0YW50c3sKLQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFJlc291cmNlVXRpbHNUZXN0cy5jbGFzcyk7Ci0JfQotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91bml0dGVzdC9XU0pVbml0Q29uc3RhbnRzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L1dTSlVuaXRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlNWZmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3VuaXR0ZXN0L1dTSlVuaXRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLnVuaXR0ZXN0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgV1NKVW5pdENvbnN0YW50cyB7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZFUl9JTlNUQUxMX1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIik7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUlVOVElNRVRZUEVJRF9UQzUwID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiOwotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgV1NfUlVOVElNRUlEX0FYSVMgPSAib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgU0VSVkVSVFlQRUlEX1RDNTAgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyB3ZWJQcm9qZWN0TmFtZSA9ICJXUCI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgd2ViUHJvamVjdDJOYW1lID0gIldQMiI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgd2ViQ29tcG9uZW50TmFtZSA9ICJ3ZWJDb21wb25lbnQiOwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHdlYkNvbXBvbmVudDJOYW1lID0gIndlYkNvbXAyIjsKLSAgcHVibGljIGZpbmFsIFN0cmluZyB3ZWJDb21wM05hbWUgPSAid2ViQ29tcDMiOwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHdlYkNvbXA0TmFtZSA9ICJ3ZWJDb21wNCI7Ci0gIAotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBlamJQcm9qZWN0TmFtZSA9ICJFSkJQcm9qZWN0IjsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBlamJDb21wb25lbnROYW1lID0gImVqYkNvbXBvbmVudCI7Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBhcHBDbGllbnRQcm9qZWN0TmFtZSA9ICJBcHBDbGllbnRQcm9qZWN0IjsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBhcHBDbGllbnRDb21wTmFtZSA9ICJhcHBDbGllbnRDb21wb25lbnQiOyAgCi0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGVhckNvbXBOYW1lID0gIkVBUkNvbXBvbmVudCI7Ci0gIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91bml0dGVzdC9XZWJTZXJ2aWNlRmluZGVyVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvdW5pdHRlc3QvV2ViU2VydmljZUZpbmRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMWYxOTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91bml0dGVzdC9XZWJTZXJ2aWNlRmluZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAzMTcgICAxMjc0NTYgY2JyZWFsZXlAY2EuaWJtLmNvbSAtIENocmlzIEJyZWFsZXkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyLldlYlNlcnZpY2VGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUluZm87Ci0KLS8qKgotICogQGF1dGhvciBqb2FuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRmluZGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIFdTSlVuaXRDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFdlYlNlcnZpY2VGaW5kZXJUZXN0cy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RXU0ZpbmRlcigpewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0aW5nIHdlYiBzZXJ2aWNlIGZpbmRlciIpOwotCQlXZWJTZXJ2aWNlRmluZGVyIHdzZiA9IFdlYlNlcnZpY2VGaW5kZXIuaW5zdGFuY2UoKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYXR0ZW1wdGluZyB0byBsb2NhdGUgYWxsIHdlYiBzZXJ2aWNlcyBpbiB3b3Jrc3BhY2UiKTsKLQkJSXRlcmF0b3Igd3NJdGVyYXRvciA9IHdzZi5nZXRXZWJTZXJ2aWNlcyhudWxsKTsKLQkJd2hpbGUgKHdzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlXZWJTZXJ2aWNlSW5mbyB3c0luZm8gPSAoV2ViU2VydmljZUluZm8pIHdzSXRlcmF0b3IubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3ZWJTZXJ2aWNlIFVSTDogIiArIHdzSW5mby5nZXRXc2RsVVJMKCkpOwotCQl9Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZpbmlzaGVkIGZpbmRpbmcgYWxsIHdlYnNlcnZpY2VzIik7Ci0JCSAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvdXRpbC9BY2N1bXVsYXRlU3RhdHVzSGFuZGxlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91dGlsL0FjY3VtdWxhdGVTdGF0dXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTI0ZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91dGlsL0FjY3VtdWxhdGVTdGF0dXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy50ZXN0cy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBJU3RhdHVzSGFuZGxlciB7Ci0JICBWZWN0b3Igc3RhdHVzTGlzdF87Ci0JICAKLQkgIHB1YmxpYyBBY2N1bXVsYXRlU3RhdHVzSGFuZGxlcigpCi0JICB7Ci0JICAgIHJlc2V0U3RhdHVzKCk7ICAgIAotCSAgfQotCSAgCi0JICAvKioKLQkgICAqICBSZXNldHMgdGhlIHN0YXR1cyBzbyB0aGF0IGl0IHN0YXJ0cyBvdXQgZW1wdHkgYWdhaW4uIAotCSAgICoKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcmVzZXRTdGF0dXMoKQotCSAgewotCSAgICBzdGF0dXNMaXN0XyA9IG5ldyBWZWN0b3IoKTsgICAgICAKLQkgIH0KLQkgIAotCSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkKLQkgIHsKLQkgICAgSVN0YXR1cyB3b3JzdFN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JICAgIAotCSAgICAvLyBGaW5kIHRoZSB3b3JzdCBlcnJvciBzdGF0dXMgY29kZQotCSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgc3RhdHVzTGlzdF8uc2l6ZSgpOyBpbmRleCsrICkKLQkgICAgewotCSAgICAgIElTdGF0dXMgc3RhdHVzID0gKElTdGF0dXMpc3RhdHVzTGlzdF8uZWxlbWVudEF0KCBpbmRleCApOwotCSAgICAgIAotCSAgICAgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA+IHdvcnN0U3RhdHVzLmdldFNldmVyaXR5KCkgKQotCSAgICAgIHsKLQkgICAgICAgIHdvcnN0U3RhdHVzID0gc3RhdHVzOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIFN0YXR1c1V0aWxzLm11bHRpU3RhdHVzKCB3b3JzdFN0YXR1cy5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0YXR1c1tdKXN0YXR1c0xpc3RfLnRvQXJyYXkoIG5ldyBTdGF0dXNbMF0gKSApOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pCi0JICAgKi8KLQkgIHB1YmxpYyBDaG9pY2UgcmVwb3J0KElTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzKSAKLQkgIHsKLQkgIAlDaG9pY2UgcmVzdWx0ID0gbnVsbDsKLQkgIAkKLQkgIAkvLyBBbHdheXMgdGFrZSB0aGUgZmlyc3QgY2hvaWNlIGlmIGF2YWlsYWJsZS4KLQkgICAgaWYoIGNob2ljZXMgIT0gbnVsbCAmJiBjaG9pY2VzLmxlbmd0aCA+IDAgKQotCSAgICB7Ci0JICAgIAlyZXN1bHQgPSBjaG9pY2VzWzBdOwotCSAgICB9Ci0JICAgIAotCSAgICBzdGF0dXNMaXN0Xy5hZGQoIHN0YXR1cyApOwotCSAgICAKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzKQotCSAgICovCi0JICBwdWJsaWMgdm9pZCByZXBvcnQoSVN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLQkgIHsKLQkgICAgc3RhdHVzTGlzdF8uYWRkKCBzdGF0dXMgKTsKLQkgIH0KLQkgIAkgCi0JICAvKioKLQkgICAqIEBzZWUgY29tLmlibS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydEVycm9yKGNvbS5pYm0uZW52LmNvbW1vbi5TdGF0dXMpCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKElTdGF0dXMgc3RhdHVzKQotCSAgewotCSAgICBzdGF0dXNMaXN0Xy5hZGQoIHN0YXR1cyApOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIEBzZWUgY29tLmlibS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8oY29tLmlibS5lbnYuY29tbW9uLlN0YXR1cykKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhJU3RhdHVzIHN0YXR1cykKLQkgIHsKLQkgICAgc3RhdHVzTGlzdF8uYWRkKCBzdGF0dXMgKTsKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91dGlsL0R5bmFtaWNQb3B1cEpVbml0V2l6YXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3V0aWwvRHluYW1pY1BvcHVwSlVuaXRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlZWE1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3V0aWwvRHluYW1pY1BvcHVwSlVuaXRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhRmxvd01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgRHluYW1pY1BvcHVwSlVuaXRXaXphcmQgZXh0ZW5kcyBEeW5hbWljUG9wdXBXaXphcmQgewotCXByaXZhdGUgSVN0YXR1c0hhbmRsZXIgaGFuZGxlcl87Ci0JcHVibGljIER5bmFtaWNQb3B1cEpVbml0V2l6YXJkKElTdGF0dXNIYW5kbGVyIGhhbmRsZXIpCi0JewotCQloYW5kbGVyXyA9IGhhbmRsZXI7Ci0JfQotCXB1YmxpYyB2b2lkIHJ1bkhlYWRMZXNzKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbixJUnVubmFibGVDb250ZXh0IGNvbnRleHQpIHsKLQkJQ29tbWFuZEZyYWdtZW50ICAgICAgICAgICAgcm9vdEZyYWdtZW50ICAgID0gZ2V0Um9vdEZyYWdtZW50KCBzZWxlY3Rpb24sIG51bGwgKTsKLQkJUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCAgcmVzb3VyY2VDb250ZXh0ID0gUGVyc2lzdGVudFJlc291cmNlQ29udGV4dC5nZXRJbnN0YW5jZSgpOwotCQlFY2xpcHNlRW52aXJvbm1lbnQgICAgICAgICBlbnZpcm9ubWVudCAgICAgPSBuZXcgRWNsaXBzZUVudmlyb25tZW50KCBudWxsLCByZXNvdXJjZUNvbnRleHQsIGhhbmRsZXJfICk7Ci0JCSAgICAKLQkJRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwgICAgZGF0YVJlZ2lzdHJ5XyAgID0gbmV3IERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsKCk7CSAgICAKLQkJRGF0YUZsb3dNYW5hZ2VyICAgICAgICAgICAgZGF0YU1hbmFnZXIgICAgID0gbmV3IERhdGFGbG93TWFuYWdlciggZGF0YVJlZ2lzdHJ5XywgZW52aXJvbm1lbnQgKTsKLQkJU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIgbWFuYWdlciAgICAgICAgID0gbmV3IFNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyKGVudmlyb25tZW50LCBkYXRhTWFuYWdlcik7Ci0JCSAgCi0JCWNvbW1hbmRXaWRnZXRCaW5kaW5nXy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YVJlZ2lzdHJ5XyApOwotCQltYW5hZ2VyLnNldFJvb3RGcmFnbWVudCggcm9vdEZyYWdtZW50ICk7Ci0JCW1hbmFnZXIucnVuRm9yd2FyZFRvTmV4dFN0b3AoIGNvbnRleHQgKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91dGlsL0pVbml0VXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvdXRpbC9KVW5pdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZGJlN2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL3dzdC93cy90ZXN0cy91dGlsL0pVbml0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uV2FpdEZvckF1dG9CdWlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnRlc3RzLnBsdWdpbi5UZXN0c1BsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgSlVuaXRVdGlscyB7Ci0JCi0JLy8gQmVnaW46IEdlbmVyYWwgRWNsaXBzZSBVdGlsaXRpZXMKLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0J1aWxkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LElFbnZpcm9ubWVudCBlbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELG51bGwpOwotCQlXYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZCBjbWQgPSBuZXcgV2FpdEZvckF1dG9CdWlsZENvbW1hbmQoKTsKLSAgICBjbWQuc2V0RW52aXJvbm1lbnQoIGVudiApOwotCQljbWQuZXhlY3V0ZSggbW9uaXRvciwgbnVsbCApOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlUZXN0RmlsZXMoU3RyaW5nIHBhdGhTdHJpbmcsaW50IHJvb3RTZWdtZW50TGVuZ3RoLElGb2xkZXIgZGVzdEZvbGRlcixJRW52aXJvbm1lbnQgZW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlFbnVtZXJhdGlvbiBlID0gVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5UGF0aHMocGF0aFN0cmluZyk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotCQl7Ci0JCQlTdHJpbmcgZmlsZVBhdGggPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChmaWxlUGF0aC5lbmRzV2l0aCgiLyIpKQotCQkJCWNvcHlUZXN0RmlsZXMoZmlsZVBhdGgscm9vdFNlZ21lbnRMZW5ndGgsZGVzdEZvbGRlcixlbnYsIG1vbml0b3IgKTsKLQkJCWVsc2UKLQkJCXsgCi0JCQkJSVBhdGggZmlsZUlQYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotCQkJCUZpbGVSZXNvdXJjZVV0aWxzLmNvcHlGaWxlKG5ldyBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQoKSwKLQkJCQkJCSAgICAgICAgICAgICAgICAgICBUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCksCi0JCQkJCQkJCQkJICAgZmlsZUlQYXRoLnJlbW92ZUxhc3RTZWdtZW50cyhmaWxlSVBhdGguc2VnbWVudENvdW50KCktcm9vdFNlZ21lbnRMZW5ndGgpLCAvLyAvZGF0YS88c3ViZGlyPgotCQkJCQkJCQkJCSAgIChuZXcgUGF0aChmaWxlUGF0aCkpLnJlbW92ZUZpcnN0U2VnbWVudHMocm9vdFNlZ21lbnRMZW5ndGgpLCAvLyBmaWxlcyBhZnRlciAvZGF0YS88c3ViZGlyPgotCQkJCQkJCQkJCSAgIGRlc3RGb2xkZXIuZ2V0RnVsbFBhdGgoKSwKLQkJCQkJCQkJCQkgICBtb25pdG9yLAotCQkJCQkJCQkJCSAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VGVzdERhdGEoU3RyaW5nIGRhdGFTdWJkaXJlY3RvcnksSUZvbGRlciBkZXN0Rm9sZGVyLElFbnZpcm9ubWVudCBlbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBwYXRoU3RyaW5nID0gIi9kYXRhLyIrZGF0YVN1YmRpcmVjdG9yeTsKLQkJY29weVRlc3RGaWxlcyhwYXRoU3RyaW5nLG5ldyBQYXRoKHBhdGhTdHJpbmcpLnNlZ21lbnRDb3VudCgpLGRlc3RGb2xkZXIsZW52LCBtb25pdG9yICk7Ci0JCQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L3dzL3Rlc3RzL3V0aWwvU2NlbmFyaW9Db25zdGFudHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvdXRpbC9TY2VuYXJpb0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTg5NGI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS93c3Qvd3MvdGVzdHMvdXRpbC9TY2VuYXJpb0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MudGVzdHMudXRpbDsKLQotcHVibGljIGNsYXNzIFNjZW5hcmlvQ29uc3RhbnRzIHsKLQkvLyBCb3R0b20gdXAgSmF2YSBvciBFSkIgdG8gV2ViIFNlcnZpY2Ugd2l6YXJkIElELgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRElEX0JPVFRPTV9VUCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIjsKLQkKLQkvLyBUb3AgZG93biBXU0RMIHRvIFNrZWxldG9uIFdlYiBTZXJ2aWNlIHdpemFyZCBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRJRF9UT1BfRE9XTiA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI7Ci0JCi0JLy8gV2ViIFNlcnZpY2UgY2xpZW50IHdpemFyZCBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRJRF9DTElFTlQgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIjsJCi0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvcjoKLQkvLyAxKSBKYXZhIHNvdXJjZSAoYm90dG9tLXVwKQotCS8vIDIpIFdTREwgb3IgV1NJTCAodG9wLWRvd24gb3IgY2xpZW50KS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfSUZJTEUgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiOwotCQotCS8vIE9iamVjdCBjbGFzcyBmb3IgSmF2YSBjb21waWxhdGlvbiB1bml0cyAoaS5lLiBKYXZhIGNsYXNzZXMgc2VsZWN0ZWQgaW4gdGhlIEphdmEgcGVyc3BlY3RpdmUpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9DTEFTU19JRF9DT01QSUxBVElPTlVOSVQgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0IjsKLQkKLQkvLyBPYmplY3QgY2xhc3MgZm9yIGEgc2VydmljZSBzZWxlY3RlZCBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSAodG9wLWRvd24gb3IgY2xpZW50KS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfU0VSVklDRUlNUEwgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSI7Ci0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvciBhIFdTRExSZXNvdXJjZUltcGwgKHRvcC1kb3duIG9yIGNsaWVudCkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0NMQVNTX0lEX1dTRExTRVJWSUNFSU1QTCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUltcGwiOwotCQotCS8vIE9iamVjdCBjbGFzcyBmb3IgYSBTZXJ2aWNlUmVmICh0b3AtZG93biBvciBjbGllbnQpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9DTEFTU19JRF9TRVJWSUNFUkVGID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiI7Ci0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvciBhIFNlcnZpY2VJbXBsQmVhbiAoYm90dG9tLXVwKS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfU0VSVklDRUlNUExCRUFOID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4iOwotCQotCS8vIE9iamVjdCBjbGFzcyBmb3IgYSBCZWFuTGluayAoYm90dG9tLXVwKS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfQkVBTkxJTksgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUyNDljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd3NkbC50ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTNhNzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDNjMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIEFwciAxNSAwMjo0MjoyMyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmZDc0Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFdTREwgSlVuaXQgVGVzdAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMQotQnVuZGxlLUNsYXNzUGF0aDogd3NkbC50ZXN0cy5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLldTRExUZXN0c1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UueHNkLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5qdW5pdCwKLSBvcmcud3NkbDRqLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIsCi0gb3JnLmFwYWNoZS54ZXJjZXMKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIwOTFkOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHdzZGwudGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHNhbXBsZXMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2Uud3NkbC50ZXN0cy5qYXIgPSBzcmMvCi1qYXZhY1dhcm5pbmdzLndzZGwudGVzdHMuamFyPS1kaXNjb3VyYWdlZApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjY1ZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9CaW5kaW5nRmF1bHRSZWNvbmNpbGlhdGlvbi9CaW5kaW5nRmF1bHRTYW1wbGUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvQmluZGluZ0ZhdWx0UmVjb25jaWxpYXRpb24vQmluZGluZ0ZhdWx0U2FtcGxlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmNhMDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9CaW5kaW5nRmF1bHRSZWNvbmNpbGlhdGlvbi9CaW5kaW5nRmF1bHRTYW1wbGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvQmluZGluZ0ZhdWx0U2FtcGxlLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JbmFtZT0iQmluZGluZ0ZhdWx0U2FtcGxlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvQmluZGluZ0ZhdWx0U2FtcGxlLyI+DQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0JpbmRpbmdGYXVsdFNhbXBsZS8iDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wZXJhdGlvbjEiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW4iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uMVJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im91dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb24xRmF1bHQiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uMiI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQ0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbiIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb24yUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50Pg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wZXJhdGlvbjJGYXVsdDEiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uMkZhdWx0MSIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb24yRmF1bHQyIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wZXJhdGlvbjJGYXVsdDIiIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvbjFSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk9wZXJhdGlvbjEiIG5hbWU9InBhcmFtZXRlcnMiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvbjFSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpPcGVyYXRpb24xUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvbjFGYXVsdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9IkZhdWx0IiBlbGVtZW50PSJ0bnM6T3BlcmF0aW9uMUZhdWx0IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb24yUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpPcGVyYXRpb24yIj48L3dzZGw6cGFydD4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uMlJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOk9wZXJhdGlvbjJSZXNwb25zZSI+PC93c2RsOnBhcnQ+DQotCTwvd3NkbDptZXNzYWdlPg0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvbjJGYXVsdDEiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6T3BlcmF0aW9uMkZhdWx0MSI+PC93c2RsOnBhcnQ+DQotCTwvd3NkbDptZXNzYWdlPg0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvbjJGYXVsdDIiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6T3BlcmF0aW9uMkZhdWx0MiI+PC93c2RsOnBhcnQ+DQotCTwvd3NkbDptZXNzYWdlPg0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJTYW1wbGVQb3J0Ij4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24xIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uMVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb24xUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbjIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb24yUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvbjJSZXNwb25zZSIgLz4NCi0JCQk8d3NkbDpmYXVsdCBuYW1lPSJPcGVyYXRpb24yRmF1bHQxIiBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uMkZhdWx0MSIgLz4NCi0JCQk8d3NkbDpmYXVsdCBuYW1lPSJPcGVyYXRpb24yRmF1bHQyIiBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uMkZhdWx0MiIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCTwvd3NkbDpwb3J0VHlwZT4NCi0JPHdzZGw6YmluZGluZyBuYW1lPSJTYW1wbGVQb3J0U09BUEJpbmRpbmciIHR5cGU9InRuczpTYW1wbGVQb3J0Ij4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24xIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9CaW5kaW5nRmF1bHRTYW1wbGUvT3BlcmF0aW9uMSIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCQk8d3NkbDpmYXVsdCBuYW1lPSJPcGVyYXRpb24xRmF1bHQiPg0KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJPcGVyYXRpb24xRmF1bHQiIC8+DQotCQkJPC93c2RsOmZhdWx0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24yIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9CaW5kaW5nRmF1bHRTYW1wbGUvT3BlcmF0aW9uMiIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCQk8d3NkbDpmYXVsdCBuYW1lPSJPcGVyYXRpb24yRmF1bHQxIj4NCi0JCQkJPHNvYXA6ZmF1bHQgdXNlPSJsaXRlcmFsIiBuYW1lPSJPcGVyYXRpb24yRmF1bHQxIiAvPg0KLQkJCTwvd3NkbDpmYXVsdD4NCi0JCQk8d3NkbDpmYXVsdCBuYW1lPSJPcGVyYXRpb24yRmF1bHQyIj4NCi0JCQkJPHNvYXA6ZmF1bHQgdXNlPSJsaXRlcmFsIiBuYW1lPSJPcGVyYXRpb24yRmF1bHQyIiAvPg0KLQkJCTwvd3NkbDpmYXVsdD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCTwvd3NkbDpiaW5kaW5nPg0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IlNhbXBsZVNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6U2FtcGxlUG9ydFNPQVBCaW5kaW5nIiBuYW1lPSJTYW1wbGVQb3J0Ij4NCi0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnLyIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9CaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb24vQmluZGluZ09wZXJhdGlvblJlY29uY2lsaWF0aW9uLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0JpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvbi9CaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb24ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzMDI2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0JpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvbi9CaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb24ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQl4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvQmluZGluZ09wZXJhdGlvblJlY29uY2lsaWF0aW9uLyIKLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCW5hbWU9IkJpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvbiIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvQmluZGluZ09wZXJhdGlvblJlY29uY2lsaWF0aW9uLyI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvQmluZGluZ09wZXJhdGlvblJlY29uY2lsaWF0aW9uLyIKLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im91dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCQk8L3hzZDpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uIiBuYW1lPSJwYXJhbWV0ZXJzIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0MiI+Ci0JCTx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvbiIgbmFtZT0icGFyYW1ldGVycyIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UyIj4KLQkJPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QzIj4KLQkJPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uIiBuYW1lPSJwYXJhbWV0ZXJzIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZTMiPgotCQk8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkJpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvbiI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uMiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdDIiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlMiIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbjMiPgotCQkJPHdzZGw6aW5wdXQgbmFtZT0iSW5wdXQzIiBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdDMiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbmFtZT0iT3V0cHV0MyIgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlMyIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkJpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvblNPQVAiCi0JCXR5cGU9InRuczpCaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb24iPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbgotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvQmluZGluZ09wZXJhdGlvblJlY29uY2lsaWF0aW9uL05ld09wZXJhdGlvbiIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbjIiPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9CaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb24vTmV3T3BlcmF0aW9uMiIgLz4KLQkJCTx3c2RsOmlucHV0IG5hbWU9IklucHV0MiI+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQgbmFtZT0iT3V0cHV0MiI+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uMyI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0JpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvbi9OZXdPcGVyYXRpb24zIiAvPgotCQkJPHdzZGw6aW5wdXQgbmFtZT0iSW5wdXQzIj4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJPdXRwdXQzIj4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOmJpbmRpbmc+Ci0JPHdzZGw6c2VydmljZSBuYW1lPSJCaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb24iPgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpCaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb25TT0FQIgotCQkJbmFtZT0iQmluZGluZ09wZXJhdGlvblJlY29uY2lsaWF0aW9uU09BUCI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnLyIgLz4KLQkJPC93c2RsOnBvcnQ+Ci0JPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0R1cGxpY2F0ZVNBWEV4Y2VwdGlvbi9TQVhFeGNlcHRpb24ud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvRHVwbGljYXRlU0FYRXhjZXB0aW9uL1NBWEV4Y2VwdGlvbi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Y0MzFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvRHVwbGljYXRlU0FYRXhjZXB0aW9uL1NBWEV4Y2VwdGlvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMKLQl4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvTmFtZXNwYWNlUHJlZml4Tm90Qm91bmQvIgotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JbmFtZT0iTmFtZXNwYWNlUHJlZml4Tm90Qm91bmQiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL05hbWVzcGFjZVByZWZpeE5vdEJvdW5kLyI+Ci0JPHVuZGVmaW5lZDp0ZXN0IC8+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0xvYWRzTmFtZWxlc3NEZWZpbml0aW9uL01pc3NpbmdOYW1lLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0xvYWRzTmFtZWxlc3NEZWZpbml0aW9uL01pc3NpbmdOYW1lLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGM5OTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9Mb2Fkc05hbWVsZXNzRGVmaW5pdGlvbi9NaXNzaW5nTmFtZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9Mb2Fkc05hbWVsZXNzRGVmaW5pdGlvbi9XaXRoTmFtZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9Mb2Fkc05hbWVsZXNzRGVmaW5pdGlvbi9XaXRoTmFtZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA5YjUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvTG9hZHNOYW1lbGVzc0RlZmluaXRpb24vV2l0aE5hbWUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgbmFtZT0iV1NETEZpbGUiPg0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0xvY2FsTmFtZXNwYWNlL0xvY2FsTmFtZXNwYWNlLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0xvY2FsTmFtZXNwYWNlL0xvY2FsTmFtZXNwYWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MjliMjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9Mb2NhbE5hbWVzcGFjZS9Mb2NhbE5hbWVzcGFjZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvU2ltcGxlLyINCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlNpbXBsZSINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvU2ltcGxlLyI+DQotDQotCTx3c2RsOnR5cGVzPg0KLQ0KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9TaW1wbGUvIj4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uSW5wdXQiPg0KLQ0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlMSINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlMiINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb25PdXRwdXQiPg0KLQ0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlMSINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlMiINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ibXlPcGVyYXRpb25SZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9Im15T3BlcmF0aW9uUmVzcG9uc2UiDQotCQkJZWxlbWVudD0idG5zOk9wZXJhdGlvbk91dHB1dCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ibXlPcGVyYXRpb25SZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgeG1sbnM6cGFydHRucz0iaHR0cDovL3RlbXB1cmkub3JnL1NpbXBsZS8iDQotCQkJbmFtZT0ibXlPcGVyYXRpb25SZXF1ZXN0IiBlbGVtZW50PSJwYXJ0dG5zOk9wZXJhdGlvbklucHV0IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iTXlQb3J0VHlwZSI+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ibXlPcGVyYXRpb24iPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpteU9wZXJhdGlvblJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpteU9wZXJhdGlvblJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JPC93c2RsOnBvcnRUeXBlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9OdWxsTmFtZXNwYWNlVVJJL0NvbmZpcm1hdGlvbi54c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL051bGxOYW1lc3BhY2VVUkkvQ29uZmlybWF0aW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0MDg3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL051bGxOYW1lc3BhY2VVUkkvQ29uZmlybWF0aW9uLnhzZAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvTnVsbE5hbWVzcGFjZVVSSS9Db250YWN0SW5mby54c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL051bGxOYW1lc3BhY2VVUkkvQ29udGFjdEluZm8ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdkOGFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvTnVsbE5hbWVzcGFjZVVSSS9Db250YWN0SW5mby54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0NvbnRhY3RJbmZvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0JPHhzZDplbGVtZW50IG5hbWU9InBob25lTnVtYmVyIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9ImFyZWFDb2RlIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiIC8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFkZHJlc3NUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iY2l0eSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9OdWxsTmFtZXNwYWNlVVJJL0NvbnRhY3RJbmZvU2VydmljZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9OdWxsTmFtZXNwYWNlVVJJL0NvbnRhY3RJbmZvU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTA5YzU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvTnVsbE5hbWVzcGFjZVVSSS9Db250YWN0SW5mb1NlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyBuYW1lPSJDb250YWN0SW5mb1NlcnZpY2UiCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl4bWxuczpjb250YWN0PSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0NvbnRhY3RJbmZvIgotCXhtbG5zOnRucz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9Db250YWN0SW5mb1NlcnZpY2UiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0NvbnRhY3RJbmZvU2VydmljZSI+Ci0KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9Db250YWN0SW5mb1NlcnZpY2UiCi0JCQl4bWxuczpjb250YWN0PSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0NvbnRhY3RJbmZvIgotCQkJeG1sbnM6dG5zPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0NvbnRhY3RJbmZvU2VydmljZSIKLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCQkJPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0NvbnRhY3RJbmZvIgotCQkJCXNjaGVtYUxvY2F0aW9uPSJDb250YWN0SW5mby54c2QiIC8+Ci0JCQk8eHNkOmltcG9ydCBzY2hlbWFMb2NhdGlvbj0iQ29uZmlybWF0aW9uLnhzZCIgLz4KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idXBkYXRlUGhvbmVOdW1iZXJSZXF1ZXN0TXNnIj4KLQkJPHdzZGw6cGFydCBlbGVtZW50PSJjb250YWN0OnBob25lTnVtYmVyIiBuYW1lPSJpbnB1dDEiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ1cGRhdGVQaG9uZU51bWJlclJlc3BvbnNlTXNnIj4KLQkJPHdzZGw6cGFydCBlbGVtZW50PSJDb25maXJtYXRpb24iIG5hbWU9Im91dHB1dDEiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ1cGRhdGVBZGRyZXNzUmVxdWVzdE1zZyI+Ci0JCTx3c2RsOnBhcnQgdHlwZT0iY29udGFjdDphZGRyZXNzVHlwZSIgbmFtZT0iaW5wdXQyIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idXBkYXRlQWRkcmVzc1Jlc3BvbnNlTXNnIj4KLQkJPHdzZGw6cGFydCB0eXBlPSJDb25maXJtYXRpb25UeXBlIiBuYW1lPSJvdXRwdXQyIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0idGVzdFBvcnRUeXBlIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InVwZGF0ZVBob25lTnVtYmVyIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp1cGRhdGVQaG9uZU51bWJlclJlcXVlc3RNc2ciIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnVwZGF0ZVBob25lTnVtYmVyUmVzcG9uc2VNc2ciIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGVBZGRyZXNzIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp1cGRhdGVBZGRyZXNzUmVxdWVzdE1zZyIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dXBkYXRlQWRkcmVzc1Jlc3BvbnNlTXNnIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL09wZXJhdGlvblN0eWxlL09wZXJhdGlvblN0eWxlVGVzdC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9PcGVyYXRpb25TdHlsZS9PcGVyYXRpb25TdHlsZVRlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2YWVjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL09wZXJhdGlvblN0eWxlL09wZXJhdGlvblN0eWxlVGVzdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6dG5zPSJodHRwOi8vZXhhbXBsZS5vcmciDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIG5hbWU9Ik9wZXJhdGlvblN0eWxlVGVzdCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZXhhbXBsZS5vcmciPg0KLQ0KLQk8amF4d3M6YmluZGluZ3MgeG1sbnM6amF4d3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheHdzIj4NCi0JCTxqYXh3czplbmFibGVXcmFwcGVyU3R5bGU+dHJ1ZTwvamF4d3M6ZW5hYmxlV3JhcHBlclN0eWxlPg0KLQkJPGpheHdzOmVuYWJsZUFzeW5jTWFwcGluZz5mYWxzZTwvamF4d3M6ZW5hYmxlQXN5bmNNYXBwaW5nPg0KLQk8L2pheHdzOmJpbmRpbmdzPg0KLQ0KLQk8dHlwZXM+DQotCQk8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9leGFtcGxlLm9yZyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgeG1sbnM6dG5zPSJodHRwOi8vZXhhbXBsZS5vcmciPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJxdW90ZVJlcXVlc3QiIHR5cGU9InRuczpxdW90ZVJlcXVlc3RUeXBlIiAvPg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVvdGVSZXF1ZXN0VHlwZSI+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic3RvY2tTeW1ib2wiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb25EYXRlIiB0eXBlPSJ4c2Q6ZGF0ZSIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InF1b3RlUmVzcG9uc2UiIHR5cGU9InRuczpxdW90ZVJlc3BvbnNlVHlwZSIgLz4NCi0NCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1b3RlUmVzcG9uc2VUeXBlIj4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmRvdWJsZSIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InF1b3RlRXJyb3IiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvdHlwZXM+DQotDQotCTxtZXNzYWdlIG5hbWU9IlF1b3RlIj4NCi0JCTxwYXJ0IG5hbWU9InBhcmFtcyIgZWxlbWVudD0idG5zOnF1b3RlUmVxdWVzdCIgLz4NCi0JPC9tZXNzYWdlPg0KLQ0KLQk8bWVzc2FnZSBuYW1lPSJRdW90ZVJlc3BvbnNlIj4NCi0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOnF1b3RlUmVzcG9uc2UiIC8+DQotCTwvbWVzc2FnZT4NCi0NCi0JPG1lc3NhZ2UgbmFtZT0iUXVvdGVFcnJvciI+DQotCQk8cGFydCBuYW1lPSJlcnJvciIgZWxlbWVudD0idG5zOnF1b3RlRXJyb3IiIC8+DQotCTwvbWVzc2FnZT4NCi0NCi0JPHBvcnRUeXBlIG5hbWU9IlF1b3RlUG9ydFR5cGUiPg0KLQ0KLQkJPGpheHdzOmJpbmRpbmdzIHhtbG5zOmpheHdzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXh3cyI+DQotCQkJPGpheHdzOmNsYXNzIG5hbWU9IlF1b3RlUHJvdmlkZXJJbXBsIiAvPg0KLQkJCTxqYXh3czplbmFibGVXcmFwcGVyU3R5bGU+dHJ1ZTwvamF4d3M6ZW5hYmxlV3JhcHBlclN0eWxlPg0KLQkJCTxqYXh3czplbmFibGVBc3luY01hcHBpbmc+ZmFsc2U8L2pheHdzOmVuYWJsZUFzeW5jTWFwcGluZz4NCi0JCTwvamF4d3M6YmluZGluZ3M+DQotDQotCQk8b3BlcmF0aW9uIG5hbWU9IkdldFF1b3RlIj4NCi0NCi0JCQk8amF4d3M6YmluZGluZ3MgeG1sbnM6amF4d3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheHdzIg0KLQkJCQl4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotCQkJCTxqYXh3czptZXRob2QgbmFtZT0iZ2V0UXVvdGUiIC8+DQotCQkJCTxqYXh3czpwYXJhbWV0ZXIgcGFydD0id3NkbDpkZWZpbml0aW9ucy93c2RsOm1lc3NhZ2VbQG5hbWU9J1F1b3RlJ10vd3NkbDpwYXJ0W0BuYW1lPSdwYXJhbXMnXSINCi0JCQkJCWNoaWxkRWxlbWVudE5hbWU9InRuczpzdG9ja1N5bWJvbCIgbmFtZT0ic3ltYm9sIiAvPg0KLQkJCQk8amF4d3M6cGFyYW1ldGVyIHBhcnQ9IndzZGw6ZGVmaW5pdGlvbnMvd3NkbDptZXNzYWdlW0BuYW1lPSdRdW90ZSddL3dzZGw6cGFydFtAbmFtZT0ncGFyYW1zJ10iDQotCQkJCQljaGlsZEVsZW1lbnROYW1lPSJ0bnM6dHJhbnNhY3Rpb25EYXRlIiBuYW1lPSJkYXRlIiAvPg0KLQkJCQk8amF4d3M6ZW5hYmxlV3JhcHBlclN0eWxlPnRydWU8L2pheHdzOmVuYWJsZVdyYXBwZXJTdHlsZT4NCi0JCQkJPGpheHdzOmVuYWJsZUFzeW5jTWFwcGluZz5mYWxzZTwvamF4d3M6ZW5hYmxlQXN5bmNNYXBwaW5nPg0KLQkJCTwvamF4d3M6YmluZGluZ3M+DQotDQotCQkJPGlucHV0IG1lc3NhZ2U9InRuczpRdW90ZSIgLz4NCi0NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpRdW90ZVJlc3BvbnNlIiAvPg0KLQ0KLQkJCTxmYXVsdCBuYW1lPSJRdW90ZUVycm9yIiBtZXNzYWdlPSJ0bnM6UXVvdGVFcnJvciI+DQotDQotCQkJCTxqYXh3czpiaW5kaW5ncyB4bWxuczpqYXh3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4d3MiPg0KLQkJCQkJPGpheHdzOmNsYXNzIG5hbWU9IlF1b3RlRXhjZXB0aW9uIiAvPg0KLQkJCQk8L2pheHdzOmJpbmRpbmdzPg0KLQ0KLQkJCTwvZmF1bHQ+DQotCQk8L29wZXJhdGlvbj4NCi0JPC9wb3J0VHlwZT4NCi0NCi0JPGJpbmRpbmcgbmFtZT0iUXVvdGVCaW5kaW5nIiB0eXBlPSJ0bnM6UXVvdGVQb3J0VHlwZSI+DQotDQotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotDQotCQk8b3BlcmF0aW9uIG5hbWU9IkdldFF1b3RlIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iUXVvdGVFcnJvciI+DQotCQkJCTxzb2FwOmZhdWx0IG5hbWU9IlF1b3RlRXJyb3IiIHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2ZhdWx0Pg0KLQkJPC9vcGVyYXRpb24+DQotDQotCTwvYmluZGluZz4NCi0NCi0JPHNlcnZpY2UgbmFtZT0iUXVvdGVTZXJ2aWNlIj4NCi0NCi0JCTxqYXh3czpiaW5kaW5ncyB4bWxuczpqYXh3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4d3MiPg0KLQkJCTxqYXh3czpjbGFzcyBuYW1lPSJRdW90YXRpb25TZXJ2aWNlIiAvPg0KLQkJPC9qYXh3czpiaW5kaW5ncz4NCi0NCi0JCTxwb3J0IG5hbWU9IlF1b3RlUG9ydCIgYmluZGluZz0idG5zOlF1b3RlQmluZGluZyI+DQotDQotCQkJPGpheHdzOmJpbmRpbmdzIHhtbG5zOmpheHdzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXh3cyI+DQotCQkJCTxqYXh3czptZXRob2QgbmFtZT0iZ2V0UXVvdGF0aW9uU2VydmljZSIgLz4NCi0JCQk8L2pheHdzOmJpbmRpbmdzPg0KLQ0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9xdW90ZSIgLz4NCi0NCi0JCTwvcG9ydD4NCi0NCi0JPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9UeXBlQW5kRWxlbWVudFJlc29sdXRpb24vVGVzdC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9UeXBlQW5kRWxlbWVudFJlc29sdXRpb24vVGVzdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRlODhkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvVHlwZUFuZEVsZW1lbnRSZXNvbHV0aW9uL1Rlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGRlZmluaXRpb25zIG5hbWU9IlRlc3RTZXJ2aWNlIg0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0Lm9yZy9TZXJ2aWNlLyINCi0JeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly90ZXN0Lm9yZy9TZXJ2aWNlLyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JeG1sbnM6dGVzdD0iaHR0cDovL3Rlc3Qub3JnLyI+DQotCTx0eXBlcz4NCi0JCTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0JCQk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3Rlc3Qub3JnLyINCi0JCQkJc2NoZW1hTG9jYXRpb249IlRlc3QxLnhzZCIgLz4NCi0JCTwveHM6c2NoZW1hPg0KLQkJPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQkJCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVzdC5vcmcvIg0KLQkJCQlzY2hlbWFMb2NhdGlvbj0iVGVzdDIueHNkIiAvPg0KLQkJPC94czpzY2hlbWE+DQotCTwvdHlwZXM+DQotCTxtZXNzYWdlIG5hbWU9InRlc3RSZXF1ZXN0Ij4NCi0JCTxwYXJ0IG5hbWU9InJlcXVlc3RQYXJ0IiB0eXBlPSJ0ZXN0Ok15VHlwZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJ0ZXN0UmVzcG9uc2UiPg0KLQkJPHBhcnQgbmFtZT0icmVzcG9uc2VQYXJ0IiBlbGVtZW50PSJ0ZXN0Ok15RWxlbWVudCIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8cG9ydFR5cGUgbmFtZT0iVGVzdFBvcnQiPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJ0ZXN0T3BlcmF0aW9uIj4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOnRlc3RSZXF1ZXN0IiBuYW1lPSJ0ZXN0UmVxdWVzdCIgLz4NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczp0ZXN0UmVzcG9uc2UiIG5hbWU9InRlc3RSZXNwb25zZSIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQ0KLQk8L3BvcnRUeXBlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9UeXBlQW5kRWxlbWVudFJlc29sdXRpb24vVGVzdDEueHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9UeXBlQW5kRWxlbWVudFJlc29sdXRpb24vVGVzdDEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmMzNmFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvVHlwZUFuZEVsZW1lbnRSZXNvbHV0aW9uL1Rlc3QxLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdC5vcmcvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly90ZXN0Lm9yZy8iPg0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvVHlwZUFuZEVsZW1lbnRSZXNvbHV0aW9uL1Rlc3QyLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvVHlwZUFuZEVsZW1lbnRSZXNvbHV0aW9uL1Rlc3QyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MWExOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL1R5cGVBbmRFbGVtZW50UmVzb2x1dGlvbi9UZXN0Mi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0Lm9yZy8iDQotCXhtbG5zOnRucz0iaHR0cDovL3Rlc3Qub3JnLyI+DQotCQ0KLQk8ZWxlbWVudCBuYW1lPSJNeUVsZW1lbnQiIHR5cGU9InN0cmluZyI+PC9lbGVtZW50Pg0KLQ0KLQk8c2ltcGxlVHlwZSBuYW1lPSJNeVR5cGUiPg0KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+PC9yZXN0cmljdGlvbj4NCi0JPC9zaW1wbGVUeXBlPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvV1NETEVsZW1lbnRSZXNvbHV0aW9uL2ZpcnN0bGV2ZWwud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvV1NETEVsZW1lbnRSZXNvbHV0aW9uL2ZpcnN0bGV2ZWwud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiOGRjMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL1dTRExFbGVtZW50UmVzb2x1dGlvbi9maXJzdGxldmVsLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6dG5zPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iPg0KLSAgICA8aW1wb3J0IGxvY2F0aW9uPSJzZWNvbmRsZXZlbC53c2RsIiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iLz4NCi0JPG1lc3NhZ2UgbmFtZT0idGVzdElOUFVUbWVzc2FnZSI+DQotCQk8cGFydCBuYW1lPSJ0ZXN0SU5wYXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotCTwvbWVzc2FnZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvV1NETEVsZW1lbnRSZXNvbHV0aW9uL21haW4ud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvV1NETEVsZW1lbnRSZXNvbHV0aW9uL21haW4ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhNDJhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL1dTRExFbGVtZW50UmVzb2x1dGlvbi9tYWluLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLQl4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIA0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iPg0KLSAgICANCi0gICAgPGltcG9ydCBsb2NhdGlvbj0iZmlyc3RsZXZlbC53c2RsIiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iLz4NCi0gICAgDQotICAgIDxwb3J0VHlwZSBuYW1lPSJUZXN0UG9ydFR5cGUiPg0KLQ0KLSAgICAJPG9wZXJhdGlvbiBuYW1lPSJUZXN0T3BlcmF0aW9uIj4NCi0NCi0gICAgCQk8IS0tIFRoaXMgaXMgbG9jYXRlZCBpbiB0aGUgZmlyc3QgbGV2ZWwgaW1wb3J0IC0tPg0KLQ0KLSAgICAJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6dGVzdElOUFVUbWVzc2FnZSIvPg0KLQ0KLSAgICAJCTwhLS0gVGhpcyBpcyBsb2NhdGVkIGluIHRoZSBzZWNvbmQgbGV2ZWwgaW1wb3J0IC0tPg0KLQ0KLSAgICAJCTxvdXRwdXQgbWVzc2FnZT0idG5zOnRlc3RPVVRQVVRtZXNzYWdlIi8+DQotDQotICAgIAk8L29wZXJhdGlvbj4NCi0NCi0gICAgPC9wb3J0VHlwZT4NCi0gICAgDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL1dTRExFbGVtZW50UmVzb2x1dGlvbi9zZWNvbmRsZXZlbC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9XU0RMRWxlbWVudFJlc29sdXRpb24vc2Vjb25kbGV2ZWwud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyZWZkOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL1dTRExFbGVtZW50UmVzb2x1dGlvbi9zZWNvbmRsZXZlbC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZGVmaW5pdGlvbnMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0JeG1sbnM6dG5zPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiANCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+DQotDQotCTwhLS0gSGVyZSB0byBmb3JjZSBhIGN5Y2xpYyBpbXBvcnQgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIGRvZXMgbm90IGdvIGludG8gYW4gaW5maW5pdGUgcmVjdXJzaW9uLiAtLT4NCi0JDQotICAgIDxpbXBvcnQgbG9jYXRpb249Im1haW4ud3NkbCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIi8+DQotDQotCTxtZXNzYWdlIG5hbWU9InRlc3RPVVRQVVRtZXNzYWdlIj4NCi0JCTxwYXJ0IG5hbWU9InRlc3RPVVRwYXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotCTwvbWVzc2FnZT4NCi0NCi0JPCEtLSBEdXBsaWNhdGVkIGhlcmUgdG8gYWxsb3cgdGVzdGluZyB0aGUgaW1wb3J0cyB0cmVlIHRyYXZlcnNhbCBvcmRlci4NCi0JVGhpcyBtZXNzYWdlIHdpbGwgYmUgIm1hc2tlZCIgYnkgdGhlIG9uZSBkZWNsYXJlZCBpbiB0aGUgZmlyc3RsZXZlbC53c2RsIC0tPg0KLQ0KLQk8bWVzc2FnZSBuYW1lPSJ0ZXN0SU5QVVRtZXNzYWdlIj4NCi0JCTxwYXJ0IG5hbWU9InRlc3RJTnBhcnQiIHR5cGU9InhzZDppbnQiLz4NCi0JPC9tZXNzYWdlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9Mb2FkU3RvcmVDb21wYXJlLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0xvYWRTdG9yZUNvbXBhcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5MmU4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0xvYWRTdG9yZUNvbXBhcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSoud3NkbC5vdXQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvTG9hZFN0b3JlQ29tcGFyZS9JbXBvcnRlZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9Mb2FkU3RvcmVDb21wYXJlL0ltcG9ydGVkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTgyZmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9Mb2FkU3RvcmVDb21wYXJlL0ltcG9ydGVkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgbmFtZT0iSW1wb3J0ZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9JbXBvcnRlZC8iIHhtbG5zOnRucz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9JbXBvcnRlZC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0ltcG9ydGVkLyI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiIGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXF1ZXN0Ii8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJJbXBvcnRlZCI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJJbXBvcnRlZFNPQVAiIHR5cGU9InRuczpJbXBvcnRlZCI+Ci0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9JbXBvcnRlZC9OZXdPcGVyYXRpb24iLz4KLSAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgcGFydHM9IiBOZXdPcGVyYXRpb25SZXF1ZXN0Ii8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBwYXJ0cz0iIE5ld09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkltcG9ydGVkIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkltcG9ydGVkU09BUCIgYmluZGluZz0idG5zOkltcG9ydGVkU09BUCI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnLyIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvTG9hZFN0b3JlQ29tcGFyZS9Mb2FkQW5kUHJpbnRUZXN0LndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0xvYWRTdG9yZUNvbXBhcmUvTG9hZEFuZFByaW50VGVzdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJiMjczLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvTG9hZFN0b3JlQ29tcGFyZS9Mb2FkQW5kUHJpbnRUZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvTG9hZEFuZFByaW50VGVzdC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJMb2FkQW5kUHJpbnRUZXN0IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9Mb2FkQW5kUHJpbnRUZXN0LyIgeG1sbnM6d3NkbDE9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvSW1wb3J0ZWQvIj4KLSAgPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9JbXBvcnRlZC8iIGxvY2F0aW9uPSJJbXBvcnRlZC53c2RsIj48L3dzZGw6aW1wb3J0PgotICA8d3NkbDp0eXBlcz4KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9Mb2FkQW5kUHJpbnRUZXN0LyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uTmV3RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCIgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25OZXdGYXVsdCI+Ci0gIAk8d3NkbDpwYXJ0IG5hbWU9Ik5ld09wZXJhdGlvbk5ld0ZhdWx0IgotICAJCWVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25OZXdGYXVsdCI+Ci0gIAk8L3dzZGw6cGFydD4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkxvYWRBbmRQcmludFRlc3QiPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9Ik5ld0ZhdWx0IiBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uTmV3RmF1bHQiPjwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iTG9hZEFuZFByaW50VGVzdFNPQVAiIHR5cGU9InRuczpMb2FkQW5kUHJpbnRUZXN0Ij4KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvTG9hZEFuZFByaW50VGVzdC9OZXdPcGVyYXRpb24iLz4KLSAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9Ik5ld0ZhdWx0Ij48L3dzZGw6ZmF1bHQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iTG9hZEFuZFByaW50VGVzdCI+Ci0gICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6TG9hZEFuZFByaW50VGVzdFNPQVAiIG5hbWU9IkxvYWRBbmRQcmludFRlc3RTT0FQIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZyIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9BbGxUZXN0Q2FzZXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9BbGxUZXN0Q2FzZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MWJiMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvQWxsVGVzdENhc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdENhc2VzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQotICBwdWJsaWMgQWxsVGVzdENhc2VzKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICAvLyBCdWcgMTIzNTQ3IC0gY29tbWVudCBvdXQgdGhpcyB0ZXN0IGZvciBub3cuCi0gICAgLy8gc3VpdGUuYWRkVGVzdChJbmxpbmVTY2hlbWFUZXN0LnN1aXRlKCkpOyAgCi0gICAgc3VpdGUuYWRkVGVzdChMb2FkQW5kU2VyaWFsaXphdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgc3VpdGUuYWRkVGVzdChTZW1hbnRpY1Rlc3Quc3VpdGUoKSk7Ci0gICAgc3VpdGUuYWRkVGVzdChXU0RMR2VuZXJhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgc3VpdGUuYWRkVGVzdChXU0RMNEpBUElUZXN0LnN1aXRlKCkpOwotICAgIHN1aXRlLmFkZFRlc3QoV1NETEVNRkFQSVRlc3Quc3VpdGUoKSk7Ci0gICAgc3VpdGUuYWRkVGVzdChVdGlsVGVzdC5zdWl0ZSgpKTsKLSAgICBzdWl0ZS5hZGRUZXN0KEJ1Z0ZpeGVzVGVzdC5zdWl0ZSgpKTsKLSAgICBzdWl0ZS5hZGRUZXN0KExvY2F0aW9uVHJhY2tpbmdUZXN0LnN1aXRlKCkpOwotICAgIAotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvQnVnRml4ZXNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvQnVnRml4ZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZThkMDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0J1Z0ZpeGVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsLk1JTUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvbkxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIENvbnRhaW5zIHVuaXQgdGVzdHMgZm9yIHJlcG9ydGVkIGJ1Z3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWdGaXhlc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwcml2YXRlIFN0cmluZyBQTFVHSU5fQUJTT0xVVEVfUEFUSCA9IFdTRExUZXN0c1BsdWdpbi5nZXRJbnN0YWxsVVJMKCk7Ci0KLSAgcHVibGljIEJ1Z0ZpeGVzVGVzdChTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLSAgICBzdWl0ZS5hZGRUZXN0KG5ldyBCdWdGaXhlc1Rlc3QoIlR5cGVBbmRFbGVtZW50UmVzb2x1dGlvbiIpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRlc3RUeXBlQW5kRWxlbWVudFJlc29sdXRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgc3VpdGUuYWRkVGVzdChuZXcgQnVnRml4ZXNUZXN0KCJNSU1FR2V0VHlwZU5hbWUiKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0ZXN0UmV0dXJuc1Byb3BlclFOYW1lRm9yTUlNRUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICBzdWl0ZS5hZGRUZXN0KG5ldyBCdWdGaXhlc1Rlc3QoIkltcG9ydHNFbGVtZW50T3JkZXIiKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpCi0gICAgICB7Ci0gICAgICAgIHRlc3RQbGFjZXNJbXBvcnRzQWZ0ZXJUaGVEZWZpbml0aW9uRWxlbWVudCgpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgc3VpdGUuYWRkVGVzdChuZXcgQnVnRml4ZXNUZXN0KCJSZXNvbHZlV1NETEVsZW1lbnQiKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpCi0gICAgICB7Ci0gICAgICAgIHRlc3RSZXNvbHZlc0VsZW1lbnRJbkltcG9ydHMoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHN1aXRlLmFkZFRlc3QobmV3IEJ1Z0ZpeGVzVGVzdCgiUGFydHNTZXJpYWxpemF0aW9uIikgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKQotICAgICAgewotICAgICAgICB0ZXN0U2VyaWFsaXplc1BhcnRzSW5TT0FQQm9keSgpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgc3VpdGUuYWRkVGVzdChuZXcgQnVnRml4ZXNUZXN0KCJJbXBvcnRzU2VyaWFsaXphdGlvbiIpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkKLSAgICAgIHsKLSAgICAgICAgdGVzdFNlcmlhbGl6ZXNJbXBvcnRzQmVmb3JlVHlwZXMoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHN1aXRlLmFkZFRlc3QobmV3IEJ1Z0ZpeGVzVGVzdCgiTG9jYWxOYW1lc3BhY2VQcmVmaXhlcyIpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkKLSAgICAgIHsKLSAgICAgICAgdGVzdFN1cHBvcnRzTG9jYWxOYW1lc3BhY2VQcmVmaXhlcygpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgc3VpdGUuYWRkVGVzdChuZXcgQnVnRml4ZXNUZXN0KCJPcGVyYXRpb25FeHRlbnNpb25FbGVtZW50cyIpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkKLSAgICAgIHsKLSAgICAgICAgdGVzdFRvbGxlcmF0ZXNFeHRlbnNpb25FbGVtZW50c0Zvck9wZXJhdGlvbigpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgc3VpdGUuYWRkVGVzdChuZXcgQnVnRml4ZXNUZXN0KCJSZWNvbmNpbGVzQmluZGluZ0ZhdWx0cyIpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkKLSAgICAgIHsKLSAgICAgICAgdGVzdFJlY29uY2lsZXNCaW5kaW5nRmF1bHRzKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBzdWl0ZS5hZGRUZXN0KG5ldyBCdWdGaXhlc1Rlc3QoIkR1cGxpY2F0ZVNBWEVycm9yRGlhZ25vc3RpY3MiKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpCi0gICAgICB7Ci0gICAgICAgIHRlc3RBdm9pZER1cGxpY2F0ZVNBWEV4Y2VwdGlvbkRpYWdub3N0aWNzKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBzdWl0ZS5hZGRUZXN0KG5ldyBCdWdGaXhlc1Rlc3QoIkJpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvbiIpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkKLSAgICAgIHsKLSAgICAgICAgdGVzdEJpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvbigpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgc3VpdGUuYWRkVGVzdChuZXcgQnVnRml4ZXNUZXN0KCJBbGxvd051bGxOYW1lc3BhY2VVUkkiKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpCi0gICAgICB7Ci0gICAgICAgIHRlc3RBbGxvd051bGxOYW1lc3BhY2VVUkkoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLQotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOyAvLyROT04tTkxTLTEkCi0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIC8vIFNpbGVuY2VzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgotICAgIHBrZy5lQ2xhc3MoKTsKLQotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsgLy8kTk9OLU5MUy0xJAotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgLy8gU2lsZW5jZXMgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCi0gICAgeHNkcGtnLmVDbGFzcygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzMzEwCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VHlwZUFuZEVsZW1lbnRSZXNvbHV0aW9uKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IERlZmluaXRpb25Mb2FkZXIubG9hZChQTFVHSU5fQUJTT0xVVEVfUEFUSCArICJzYW1wbGVzL0J1Z0ZpeGVzL1R5cGVBbmRFbGVtZW50UmVzb2x1dGlvbi9UZXN0LndzZGwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAvLyBUaGVyZSBhcmUgdHdvIGlubGluZSBzY2hlbWFzLCBlYWNoIGltcG9ydGluZyBhbiBleHRlcm5hbCBzY2hlbWEuCi0gICAgICAvLyBUaGUgZmlyc3Qgc2NoZW1hIGlzIGVtcHR5IGFuZCB1c2VkIGp1c3QgdG8gc2hvdyB0aGUgdHlwZSByZXNvbHV0aW9uCi0gICAgICAvLyBtZWNoYW5pc20ncyBmYXVsdC4KLSAgICAgIC8vIFRoZSBzY2hlbWEgY29udGFpbmluZyB0aGUgdHlwZSBhbmQgZWxlbWVudCBkZWNsYXJhdGlvbiB3ZSdyZSBpbnRlcmVzdGVkCi0gICAgICAvLyBpbiBpcyB0aGUgc2Vjb25kIHNjaGVtYSBpbiB0aGUgY29sbGVjdGlvbi4KLQotICAgICAgWFNEU2NoZW1hIGlubGluZVNjaGVtYSA9IChYU0RTY2hlbWEpIGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLmdldCgxKTsKLQotICAgICAgLy8gVGhlIGZpcnN0IGFuZCBvbmx5IGNvbXBvbmVudCBpbiB0aGlzIHNjaGVtYSBpcyBhbiBpbXBvcnQuCi0KLSAgICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSAoWFNESW1wb3J0KSBpbmxpbmVTY2hlbWEuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0KLSAgICAgIC8vIFRoZSBpbXBvcnRlZCBzY2hlbWEgd2FzIHJlc29sdmVkIHdoZW4gdGhlIHJlc291cmNlIHdhcyBsb2FkZWQuCi0gICAgICAvLyBUaGlzIGlzIHRoZSBzY2hlbWEgY29udGFpbmluZyBvdXIgdHlwZS9lbGVtZW50LgotCi0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkSW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7Ci0KLSAgICAgIC8vIE5vdyBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHJlc29sdmVkIHR5cGUvZWxlbWVudCBmb3IgdGhlIG1lc3NhZ2VzIGluCi0gICAgICAvLyB0aGUgV1NETCBkb2N1bWVudAotICAgICAgLy8gYXJlIHRoZSBvbmVzIGluIHRoZSBzY2hlbWEgYW5kIG5vdCBzb21lIGJvZ3VzIG9uZXMuCi0KLSAgICAgIEl0ZXJhdG9yIG1lc3NhZ2VzSXRlcmF0b3IgPSBkZWZpbml0aW9uLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgIHdoaWxlIChtZXNzYWdlc0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1lc3NhZ2VzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJ0ZXN0UmVxdWVzdCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZSBrbm93IHRoZXJlIGlzIG9ubHkgb25lIHBhcnQgaW4gdGhlIG1lc3NhZ2UgYW5kIGl0IHJlZmVycyB0byBhCi0gICAgICAgICAgLy8gdHlwZS4gTWFrZSBzdXJlIHRoZSB0eXBlIGNhbiBiZSByZXNvbHZlZC4KLQotICAgICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBtZXNzYWdlLmdldEVQYXJ0cygpLmdldCgwKTsKLSAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiBteVR5cGUgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKHNjaGVtYSwgbXlUeXBlLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFscygidGVzdFJlc3BvbnNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIC8vIFdlIGtub3cgdGhlcmUgaXMgb25seSBvbmUgcGFydCBpbiB0aGUgbWVzc2FnZSBhbmQgaXQgcmVmZXJzIHRvIGFuCi0gICAgICAgICAgLy8gZWxlbWVudC4KLQotICAgICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBtZXNzYWdlLmdldEVQYXJ0cygpLmdldCgwKTsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbXlFbGVtZW50ID0gcGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoc2NoZW1hLCBteUVsZW1lbnQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzOTUzCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuc1Byb3BlclFOYW1lRm9yTUlNRUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICBNSU1FRmFjdG9yeSBmYWN0b3J5ID0gTUlNRVBhY2thZ2UuZUlOU1RBTkNFLmdldE1JTUVGYWN0b3J5KCk7Ci0KLSAgICBNSU1FQ29udGVudCBjb250ZW50ID0gZmFjdG9yeS5jcmVhdGVNSU1FQ29udGVudCgpOwotICAgIFFOYW1lIGNvbnRlbnRFbGVtZW50VHlwZSA9IGNvbnRlbnQuZ2V0RWxlbWVudFR5cGUoKTsKLSAgICBhc3NlcnRFcXVhbHMoTUlNRUNvbnN0YW50cy5NSU1FX05BTUVTUEFDRV9VUkksIGNvbnRlbnRFbGVtZW50VHlwZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKE1JTUVDb25zdGFudHMuQ09OVEVOVF9FTEVNRU5UX1RBRywgY29udGVudEVsZW1lbnRUeXBlLmdldExvY2FsUGFydCgpKTsKLQotICAgIE1JTUVNaW1lWG1sIG1pbWVYbWwgPSBmYWN0b3J5LmNyZWF0ZU1JTUVNaW1lWG1sKCk7Ci0gICAgUU5hbWUgbWltZVhtbEVsZW1lbnRUeXBlID0gbWltZVhtbC5nZXRFbGVtZW50VHlwZSgpOwotICAgIGFzc2VydEVxdWFscyhNSU1FQ29uc3RhbnRzLk1JTUVfTkFNRVNQQUNFX1VSSSwgbWltZVhtbEVsZW1lbnRUeXBlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoTUlNRUNvbnN0YW50cy5NSU1FX1hNTF9FTEVNRU5UX1RBRywgbWltZVhtbEVsZW1lbnRUeXBlLmdldExvY2FsUGFydCgpKTsKLQotICAgIE1JTUVNdWx0aXBhcnRSZWxhdGVkIG11bHRpcGFydFJlbGF0ZWQgPSBmYWN0b3J5LmNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkKCk7Ci0gICAgUU5hbWUgbXVsdGlwYXJ0UmVsYXRlZEVsZW1lbnRUeXBlID0gbXVsdGlwYXJ0UmVsYXRlZC5nZXRFbGVtZW50VHlwZSgpOwotICAgIGFzc2VydEVxdWFscyhNSU1FQ29uc3RhbnRzLk1JTUVfTkFNRVNQQUNFX1VSSSwgbXVsdGlwYXJ0UmVsYXRlZEVsZW1lbnRUeXBlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoTUlNRUNvbnN0YW50cy5NVUxUSVBBUlRfUkVMQVRFRF9FTEVNRU5UX1RBRywgbXVsdGlwYXJ0UmVsYXRlZEVsZW1lbnRUeXBlLmdldExvY2FsUGFydCgpKTsKLQotICAgIE1JTUVQYXJ0IHBhcnQgPSBmYWN0b3J5LmNyZWF0ZU1JTUVQYXJ0KCk7Ci0gICAgUU5hbWUgcGFydEVsZW1lbnRUeXBlID0gcGFydC5nZXRFbGVtZW50VHlwZSgpOwotICAgIGFzc2VydEVxdWFscyhNSU1FQ29uc3RhbnRzLk1JTUVfTkFNRVNQQUNFX1VSSSwgcGFydEVsZW1lbnRUeXBlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoTUlNRUNvbnN0YW50cy5QQVJUX0VMRU1FTlRfVEFHLCBwYXJ0RWxlbWVudFR5cGUuZ2V0TG9jYWxQYXJ0KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MDQwCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UGxhY2VzSW1wb3J0c0FmdGVyVGhlRGVmaW5pdGlvbkVsZW1lbnQoKQotICB7Ci0gICAgV1NETEZhY3RvcnkgZmFjdG9yeSA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMRmFjdG9yeSgpOwotCi0gICAgU3RyaW5nIG5hbWVzcGFjZSA9ICJ0ZXN0TmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZmFjdG9yeS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgZGVmaW5pdGlvbi5zZXRRTmFtZShuZXcgUU5hbWUobmFtZXNwYWNlLCAidGVzdERlZmluaXRpb24iKSk7IC8vJE5PTi1OTFMtMSQgIAotICAgIGRlZmluaXRpb24udXBkYXRlRWxlbWVudCgpOwotCi0gICAgU2VydmljZSBzZXJ2aWNlID0gZmFjdG9yeS5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgc2VydmljZS5zZXRRTmFtZShuZXcgUU5hbWUobmFtZXNwYWNlLCAidGVzdFNlcnZpY2UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkZWZpbml0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0KLSAgICBJbXBvcnQgd3NkbEltcG9ydCA9IGZhY3RvcnkuY3JlYXRlSW1wb3J0KCk7Ci0gICAgZGVmaW5pdGlvbi5hZGRJbXBvcnQod3NkbEltcG9ydCk7Ci0KLSAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gZGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IHNlcnZpY2UuZ2V0RWxlbWVudCgpOwotICAgIEVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IHdzZGxJbXBvcnQuZ2V0RWxlbWVudCgpOwotCi0gICAgTm9kZUxpc3QgZGVmaW5pdGlvbkVsZW1lbnRDaGlsZHJlbiA9IGRlZmluaXRpb25FbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQotICAgIE5vZGUgZmlyc3RDaGlsZCA9IGRlZmluaXRpb25FbGVtZW50Q2hpbGRyZW4uaXRlbSgwKTsKLQotICAgIGFzc2VydFNhbWUoaW1wb3J0RWxlbWVudCwgZmlyc3RDaGlsZCk7Ci0KLSAgICBOb2RlIHNlY29uZENoaWxkID0gZGVmaW5pdGlvbkVsZW1lbnRDaGlsZHJlbi5pdGVtKDEpOwotCi0gICAgYXNzZXJ0U2FtZShzZXJ2aWNlRWxlbWVudCwgc2Vjb25kQ2hpbGQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM3ODY2Ci0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZXNFbGVtZW50SW5JbXBvcnRzKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IERlZmluaXRpb25Mb2FkZXIubG9hZChQTFVHSU5fQUJTT0xVVEVfUEFUSCArICJzYW1wbGVzL0J1Z0ZpeGVzL1dTRExFbGVtZW50UmVzb2x1dGlvbi9tYWluLndzZGwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIC8vIFRoaXMgdGVzdCBhdHRlbXB0cyB0byBsb2NhdGUgYSBtZXNzYWdlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IGxldmVsCi0gICAgICAvLyBpbXBvcnQuCi0KLSAgICAgIFFOYW1lIGZpcnN0TGV2ZWxNZXNzYWdlUU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCAidGVzdElOUFVUbWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBqYXZheC53c2RsLk1lc3NhZ2UgZmlyc3RMZXZlbE1lc3NhZ2UgPSBkZWZpbml0aW9uLmdldE1lc3NhZ2UoZmlyc3RMZXZlbE1lc3NhZ2VRTmFtZSk7Ci0KLSAgICAgIGFzc2VydE5vdE51bGwoZmlyc3RMZXZlbE1lc3NhZ2UpOwotCi0gICAgICAvLyBUaGlzIHRlc3QgYXR0ZW1wdHMgdG8gbG9jYXRlIGEgbWVzc2FnZSBsb2NhdGVkIGluIHRoZSBzZWNvbmQgbGV2ZWwKLSAgICAgIC8vIGltcG9ydC4KLQotICAgICAgUU5hbWUgc2Vjb25kTGV2ZWxNZXNzYWdlUU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCAidGVzdE9VVFBVVG1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgamF2YXgud3NkbC5NZXNzYWdlIHNlY29uZExldmVsTWVzc2FnZSA9IGRlZmluaXRpb24uZ2V0TWVzc2FnZShzZWNvbmRMZXZlbE1lc3NhZ2VRTmFtZSk7Ci0KLSAgICAgIGFzc2VydE5vdE51bGwoc2Vjb25kTGV2ZWxNZXNzYWdlKTsKLQotICAgICAgLy8gVGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCB3ZSBkbyBhIGJyZWFkdGggZmlyc3QgdHJhdmVyc2FsIHRvIGtlZXAgdGhpbmdzCi0gICAgICAvLyB3b3JraW5nIGFwcHJveGltYXRpdmVseSBhcyB0aGUgb2xkIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZWQgdG8gY2hlY2sKLSAgICAgIC8vIG9ubHkgdGhlIGRlZmluaXRpb24gYW5kIGl0cyBmaXJzdCBsZXZlbCBpbXBvcnRzLiBUaGUgZmlyc3QgbWVzc2FnZSBpcwotICAgICAgLy8gZGVmaW5lZCBpbiBmaXJzdGxldmVsLndzZGwgYXMgd2VsbCBhcyBzZWNvbmRsZXZlbC53c2RsIGJ1dCB0aGUKLSAgICAgIC8vIGFsZ29yaXRobSBzaG91bGQgZmluZCB0aGUgb25lIGluIGZpcnN0bGV2ZWwud3NkbC4KLQotICAgICAgSW1wb3J0IGZpcnN0TGV2ZWxJbXBvcnQgPSAoSW1wb3J0KSBkZWZpbml0aW9uLmdldEltcG9ydHModGFyZ2V0TmFtZXNwYWNlKS5nZXQoMCk7Ci0gICAgICBEZWZpbml0aW9uIGZpcnN0TGV2ZWxEZWZpbml0aW9uID0gZmlyc3RMZXZlbEltcG9ydC5nZXRFRGVmaW5pdGlvbigpOwotCi0gICAgICBhc3NlcnRFcXVhbHMoZmlyc3RMZXZlbERlZmluaXRpb24sICgoTWVzc2FnZSkgZmlyc3RMZXZlbE1lc3NhZ2UpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNzk5MAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZXNQYXJ0c0luU09BUEJvZHkoKQotICB7Ci0gICAgLy8gQnVpbGQgYW4gaW4tbWVtb3J5IFdTREwgZGVmaW5pdGlvbi4KLQotICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETEZhY3RvcnkoKTsKLQotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAidGVzdE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGZhY3RvcnkuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgIGRlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgZGVmaW5pdGlvbi5zZXRRTmFtZShuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCAidGVzdERlZmluaXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgidG5zIiwgdGFyZ2V0TmFtZXNwYWNlKTsgLy8kTk9OLU5MUy0xJAotICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJ4c2QiLCBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOyAvLyROT04tTkxTLTEkCi0gICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoInNvYXAiLCBTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgIFFOYW1lIG1lc3NhZ2VRTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsICJ0ZXN0TWVzc2FnZSIpOwotICAgIG1lc3NhZ2Uuc2V0UU5hbWUobWVzc2FnZVFOYW1lKTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0KLSAgICBQYXJ0IHBhcnQxID0gZmFjdG9yeS5jcmVhdGVQYXJ0KCk7Ci0gICAgU3RyaW5nIHBhcnQxTmFtZSA9ICJwYXJ0MSI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcGFydDEuc2V0TmFtZShwYXJ0MU5hbWUpOwotICAgIHBhcnQxLnNldFR5cGVOYW1lKG5ldyBRTmFtZShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBtZXNzYWdlLmFkZFBhcnQocGFydDEpOwotCi0gICAgUGFydCBwYXJ0MiA9IGZhY3RvcnkuY3JlYXRlUGFydCgpOwotICAgIFN0cmluZyBwYXJ0Mk5hbWUgPSAicGFydDIiOyAvLyROT04tTkxTLTEkIAotICAgIHBhcnQyLnNldE5hbWUocGFydDJOYW1lKTsKLSAgICBwYXJ0Mi5zZXRUeXBlTmFtZShuZXcgUU5hbWUoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIikpOyAvLyROT04tTkxTLTEkCi0gICAgbWVzc2FnZS5hZGRQYXJ0KHBhcnQyKTsKLQotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gZmFjdG9yeS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsICJ0ZXN0UG9ydCIpOyAvLyROT04tTkxTLTEkCi0gICAgcG9ydFR5cGUuc2V0UU5hbWUocG9ydFFOYW1lKTsKLSAgICBkZWZpbml0aW9uLmFkZFBvcnRUeXBlKHBvcnRUeXBlKTsKLQotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBmYWN0b3J5LmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gInRlc3RPcGVyYXRpb24iOyAvLyROT04tTkxTLTEkIAotICAgIG9wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbk5hbWUpOwotICAgIHBvcnRUeXBlLmFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwotCi0gICAgSW5wdXQgaW5wdXQgPSBmYWN0b3J5LmNyZWF0ZUlucHV0KCk7Ci0gICAgaW5wdXQuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICBvcGVyYXRpb24uc2V0SW5wdXQoaW5wdXQpOwotCi0gICAgQmluZGluZyBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgUU5hbWUgYmluZGluZ1FOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgInRlc3RCaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKLSAgICBiaW5kaW5nLnNldFFOYW1lKGJpbmRpbmdRTmFtZSk7Ci0gICAgYmluZGluZy5zZXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgZGVmaW5pdGlvbi5hZGRCaW5kaW5nKGJpbmRpbmcpOwotCi0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICBiaW5kaW5nLmFkZEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEJpbmRpbmdJbnB1dChiaW5kaW5nSW5wdXQpOwotCi0gICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEZhY3RvcnkoKTsKLSAgICBTT0FQQm9keSBzb2FwQm9keSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgYmluZGluZ0lucHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCb2R5KTsKLQotICAgIGRlZmluaXRpb24udXBkYXRlRWxlbWVudCgpOwotCi0gICAgLy8gVGVzdCB0aGUgIm5vIHBhcnRzIiBzY2VuYXJpby4gSW4gdGhpcyBjYXNlIHRoZSBwYXJ0cyBhdHRyaWJ1dGUgc2hvdWxkIG5vdAotICAgIC8vIGJlIHByZXNlbnQuCi0KLSAgICBFbGVtZW50IHNvYXBCb2R5RWxlbWVudCA9IHNvYXBCb2R5LmdldEVsZW1lbnQoKTsKLSAgICBBdHRyIHBhcnRzQXR0cmlidXRlTm9kZSA9IHNvYXBCb2R5RWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFNPQVBDb25zdGFudHMuUEFSVFNfQVRUUklCVVRFKTsKLSAgICBhc3NlcnROdWxsKHBhcnRzQXR0cmlidXRlTm9kZSk7Ci0KLSAgICAvLyBUZXN0IHRoZSBzY2VuYXJpbyB3aGVuIHRoZSBib2R5IHNwZWNpZmllcyBvbmUgcGFydC4gSW4gdGhpcyBjYXNlIHRoZQotICAgIC8vIHBhcnRzIGF0dHJpYnV0ZQotICAgIC8vIHNob3VsZCBiZSBwcmVzZW50IGFuZCBsb29rIGxpa2UgdGhpcyBwYXJ0cz0icGFydDEiCi0KLSAgICBMaXN0IHBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBhcnRzLmFkZChwYXJ0MSk7Ci0gICAgc29hcEJvZHkuc2V0UGFydHMocGFydHMpOwotCi0gICAgc29hcEJvZHkudXBkYXRlRWxlbWVudCgpOwotCi0gICAgc29hcEJvZHlFbGVtZW50ID0gc29hcEJvZHkuZ2V0RWxlbWVudCgpOwotICAgIFN0cmluZyBwYXJ0c0F0dHJpYnV0ZVZhbHVlID0gc29hcEJvZHlFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLlBBUlRTX0FUVFJJQlVURSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHBhcnQxTmFtZSwgcGFydHNBdHRyaWJ1dGVWYWx1ZSk7Ci0KLSAgICAvLyBUZXN0IHRoZSBzY2VuYXJpbyB3aGVuIHRoZSBib2R5IHNwZWNpZmllcyB0d28gcGFydHMuIEluIHRoaXMgY2FzZSB0aGUKLSAgICAvLyBwYXJ0cyBhdHRyaWJ1dGUKLSAgICAvLyBzaG91bGQgYmUgcHJlc2VudCBhbmQgbG9vayBsaWtlIHRoaXMgcGFydHM9InBhcnQxIHBhcnQyIgotCi0gICAgcGFydHMuYWRkKHBhcnQyKTsKLSAgICBzb2FwQm9keS5zZXRQYXJ0cyhwYXJ0cyk7Ci0KLSAgICBzb2FwQm9keS51cGRhdGVFbGVtZW50KCk7Ci0KLSAgICBzb2FwQm9keUVsZW1lbnQgPSBzb2FwQm9keS5nZXRFbGVtZW50KCk7Ci0gICAgcGFydHNBdHRyaWJ1dGVWYWx1ZSA9IHNvYXBCb2R5RWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5QQVJUU19BVFRSSUJVVEUpOwotICAgIGFzc2VydEVxdWFscyhwYXJ0MU5hbWUgKyAiICIgKyBwYXJ0Mk5hbWUsIHBhcnRzQXR0cmlidXRlVmFsdWUpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAvKioKLSAgICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzgwMzMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVzSW1wb3J0c0JlZm9yZVR5cGVzKCkKLSAgewotICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETEZhY3RvcnkoKTsKLQotICAgIFN0cmluZyBuYW1lc3BhY2UgPSAidGVzdE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGZhY3RvcnkuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgIGRlZmluaXRpb24uc2V0UU5hbWUobmV3IFFOYW1lKG5hbWVzcGFjZSwgInRlc3REZWZpbml0aW9uIikpOyAvLyROT04tTkxTLTEkICAKLSAgICBkZWZpbml0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLQotICAgIFR5cGVzIHR5cGVzID0gZmFjdG9yeS5jcmVhdGVUeXBlcygpOwotICAgIGRlZmluaXRpb24uc2V0VHlwZXModHlwZXMpOwotCi0gICAgSW1wb3J0IHdzZGxJbXBvcnQgPSBmYWN0b3J5LmNyZWF0ZUltcG9ydCgpOwotICAgIGRlZmluaXRpb24uYWRkSW1wb3J0KHdzZGxJbXBvcnQpOwotCi0gICAgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IGRlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotICAgIEVsZW1lbnQgdHlwZXNFbGVtZW50ID0gdHlwZXMuZ2V0RWxlbWVudCgpOwotICAgIEVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IHdzZGxJbXBvcnQuZ2V0RWxlbWVudCgpOwotCi0gICAgTm9kZUxpc3QgZGVmaW5pdGlvbkVsZW1lbnRDaGlsZHJlbiA9IGRlZmluaXRpb25FbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQotICAgIE5vZGUgZmlyc3RDaGlsZCA9IGRlZmluaXRpb25FbGVtZW50Q2hpbGRyZW4uaXRlbSgwKTsKLQotICAgIGFzc2VydFNhbWUoaW1wb3J0RWxlbWVudCwgZmlyc3RDaGlsZCk7Ci0KLSAgICBOb2RlIHNlY29uZENoaWxkID0gZGVmaW5pdGlvbkVsZW1lbnRDaGlsZHJlbi5pdGVtKDEpOwotCi0gICAgYXNzZXJ0U2FtZSh0eXBlc0VsZW1lbnQsIHNlY29uZENoaWxkKTsKLQotICAgIC8vIEJsb3cgYXdheSB0aGUgYmFja2luZyBET00uCi0KLSAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQobnVsbCk7Ci0gICAgZGVmaW5pdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0KLSAgICBkZWZpbml0aW9uRWxlbWVudCA9IGRlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotICAgIHR5cGVzRWxlbWVudCA9IHR5cGVzLmdldEVsZW1lbnQoKTsKLSAgICBpbXBvcnRFbGVtZW50ID0gd3NkbEltcG9ydC5nZXRFbGVtZW50KCk7Ci0KLSAgICBkZWZpbml0aW9uRWxlbWVudENoaWxkcmVuID0gZGVmaW5pdGlvbkVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgZmlyc3RDaGlsZCA9IGRlZmluaXRpb25FbGVtZW50Q2hpbGRyZW4uaXRlbSgwKTsKLQotICAgIGFzc2VydFNhbWUoaW1wb3J0RWxlbWVudCwgZmlyc3RDaGlsZCk7Ci0KLSAgICBzZWNvbmRDaGlsZCA9IGRlZmluaXRpb25FbGVtZW50Q2hpbGRyZW4uaXRlbSgxKTsKLQotICAgIGFzc2VydFNhbWUodHlwZXNFbGVtZW50LCBzZWNvbmRDaGlsZCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDU1MwotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFN1cHBvcnRzTG9jYWxOYW1lc3BhY2VQcmVmaXhlcygpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgZGVmaW5pdGlvbiA9IERlZmluaXRpb25Mb2FkZXIubG9hZChQTFVHSU5fQUJTT0xVVEVfUEFUSCArICJzYW1wbGVzL0J1Z0ZpeGVzL0xvY2FsTmFtZXNwYWNlL0xvY2FsTmFtZXNwYWNlLndzZGwiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9TaW1wbGUvIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIENoZWNrIHRoYXQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UncyBwYXJ0IGVsZW1lbnQgaXMgcmVzb2x2ZWQgT0suCi0KLSAgICBRTmFtZSByZXNwb25zZU1lc3NhZ2VRTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsICJteU9wZXJhdGlvblJlc3BvbnNlIik7IC8vLy8kTk9OLU5MUy0xJAotICAgIGphdmF4LndzZGwuTWVzc2FnZSByZXNwb25zZU1lc3NhZ2UgPSBkZWZpbml0aW9uLmdldE1lc3NhZ2UocmVzcG9uc2VNZXNzYWdlUU5hbWUpOwotCi0gICAgUGFydCByZXNwb25zZVBhcnQgPSAoUGFydCkgcmVzcG9uc2VNZXNzYWdlLmdldFBhcnQoIm15T3BlcmF0aW9uUmVzcG9uc2UiKTsgLy8vLyROT04tTkxTLTEkCi0KLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzcG9uc2VFbGVtZW50RGVjbGFyYXRpb24gPSByZXNwb25zZVBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlRWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlRWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRhaW5lcigpKTsKLQotICAgIC8vIENoZWNrIHRoYXQgdGhlIHJlcXVlc3QgbWVzc2FnZSdzIHBhcnQgZWxlbWVudCBpcyByZXNvbHZlZCBPSy4KLSAgICAvLyBUaGlzIHBhcnQgZGVmaW5lcyBhIGxvY2FsIG5hbWVzcGFjZSBwcmVmaXgKLQotICAgIFFOYW1lIHJlcXVlc3RNZXNzYWdlUU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCAibXlPcGVyYXRpb25SZXF1ZXN0Iik7IC8vLy8kTk9OLU5MUy0xJAotICAgIGphdmF4LndzZGwuTWVzc2FnZSByZXF1ZXN0TWVzc2FnZSA9IGRlZmluaXRpb24uZ2V0TWVzc2FnZShyZXF1ZXN0TWVzc2FnZVFOYW1lKTsKLQotICAgIFBhcnQgcmVxdWVzdFBhcnQgPSAoUGFydCkgcmVxdWVzdE1lc3NhZ2UuZ2V0UGFydCgibXlPcGVyYXRpb25SZXF1ZXN0Iik7IC8vLy8kTk9OLU5MUy0xJAotCi0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlcXVlc3RFbGVtZW50RGVjbGFyYXRpb24gPSByZXF1ZXN0UGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIGFzc2VydE5vdE51bGwocmVxdWVzdEVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgCi0gICAgLy8gTm93IHRvIG1ha2Ugc3VyZSB0aGUgRE9NIGlzIHJlY29uY2lsZWQgcHJvcGVybHkgYW5kIHVzZXMgdGhlIGxvY2FsIG5hbWVzcGFjZSBwcmVmaXgsIAotICAgIC8vIGxldCdzIHRyeSB0byBjaGFuZ2UgdGhlIHBhcnQncyBlbGVtZW50IGRlY2xhcmF0aW9uLiBXZSdsbCB1c2UgdGhlIHJlc3BvbnNlIHBhcnQgZWxlbWVudAotICAgIC8vIGp1c3QgYmVjYXVzZSBpdCBpcyBjb252ZW5pZW50LgotICAgIAotICAgIHJlcXVlc3RQYXJ0LnNldEVsZW1lbnREZWNsYXJhdGlvbihyZXNwb25zZUVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgCi0gICAgRWxlbWVudCBwYXJ0RWxlbWVudCA9IHJlcXVlc3RQYXJ0LmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgZWxlbWVudEF0dHJpYnV0ZVZhbHVlID0gcGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlKFdTRExDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEUpOwotICAgIAotICAgIGFzc2VydEVxdWFscyhlbGVtZW50QXR0cmlidXRlVmFsdWUsICJwYXJ0dG5zOiIgKyByZXNwb25zZUVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCkpOwotICB9Ci0gIAotICAvKioKLSAgICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcxMDcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RUb2xsZXJhdGVzRXh0ZW5zaW9uRWxlbWVudHNGb3JPcGVyYXRpb24oKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoUExVR0lOX0FCU09MVVRFX1BBVEggKyAic2FtcGxlcy9CdWdGaXhlcy9PcGVyYXRpb25TdHlsZS9PcGVyYXRpb25TdHlsZVRlc3Qud3NkbCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICAKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkuZ2V0KDApOwotICAgIEVMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpOwotICAgIAotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldCgwKTsKLSAgICBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHMoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFLCBvcGVyYXRpb25UeXBlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY0NTY1Ci0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UmVjb25jaWxlc0JpbmRpbmdGYXVsdHMoKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoUExVR0lOX0FCU09MVVRFX1BBVEggKyAic2FtcGxlcy9CdWdGaXhlcy9CaW5kaW5nRmF1bHRSZWNvbmNpbGlhdGlvbi9CaW5kaW5nRmF1bHRTYW1wbGUud3NkbCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIC8vIFRlc3QgdGhlIGFibm9ybWFsIGNhc2Ugd2hlbiB0aGUgYmluZGluZyBvcGVyYXRpb24gdHJpZXMgdG8gYmluZCBhIGZhdWx0Ci0gICAgLy8gYnV0IHRoZSBmYXVsdCBpcyBtaXNzaW5nIGluIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbi4gSW4gdGhpcyBjYXNlIHRoZQotICAgIC8vIGZhdWx0IG9idGFpbmVkIGZyb20gdGhlIGJpbmRpbmcgb3BlcmF0aW9uJ3MgZmF1bHQgc2hvdWxkIGJlIG51bGwuCi0KLSAgICBMaXN0IGJpbmRpbmdzID0gZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKTsKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ3MuZ2V0KDApOwotICAgIExpc3QgYmluZGluZ09wZXJhdGlvbnMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPcGVyYXRpb25zLmdldCgwKTsKLSAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHQoIk9wZXJhdGlvbjFGYXVsdCIpOyAvLyROT04tTkxTLTEkCi0gICAgRmF1bHQgZmF1bHQgPSBiaW5kaW5nRmF1bHQuZ2V0RUZhdWx0KCk7Ci0gICAgYXNzZXJ0TnVsbChmYXVsdCk7Ci0KLSAgICAvLyBUZXN0IHRoZSBub3JtYWwgY2FzZSB3aGVuIHRoZSBvcGVyYXRpb24gYW5kIGJpbmRpbmcgb3BlcmF0aW9uIGFyZSBpbgotICAgIC8vIHN5bmNoLiBJbiB0aGlzIGNhc2UgdGhlIGZhdWx0IGRlZmluZWQgaW4gdGhlIG9wZXJhdGlvbiBzaG91bGQgbWF0Y2gKLSAgICAvLyB0aGUgb25lIG9idGFpbmVkIGZyb20gdGhlIGJpbmRpbmcgb3BlcmF0aW9uJ3MgZmF1bHQuCi0KLSAgICBMaXN0IHBvcnRUeXBlcyA9IGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpOwotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBwb3J0VHlwZXMuZ2V0KDApOwotICAgIEVMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpOwotCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDEpOwotICAgIGphdmF4LndzZGwuRmF1bHQgZXhwZWN0ZWRGYXVsdDEgPSBvcGVyYXRpb24uZ2V0RmF1bHQoIk9wZXJhdGlvbjJGYXVsdDEiKTsgLy8kTk9OLU5MUy0xJAotICAgIGphdmF4LndzZGwuRmF1bHQgZXhwZWN0ZWRGYXVsdDIgPSBvcGVyYXRpb24uZ2V0RmF1bHQoIk9wZXJhdGlvbjJGYXVsdDIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uMiA9IChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BlcmF0aW9ucy5nZXQoMSk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIGZhdWx0IG9idGFpbmVkIGZyb20gdGhlIGJpbmRpbmcgZmF1bHQgaXMgbm90IG51bGwgYW5kCi0gICAgLy8gbWF0Y2hlcyB0aGUgb25lIGluIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbi4KLSAgICAKLSAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0MSA9IChCaW5kaW5nRmF1bHQpIGJpbmRpbmdPcGVyYXRpb24yLmdldEJpbmRpbmdGYXVsdCgiT3BlcmF0aW9uMkZhdWx0MSIpOyAvLyROT04tTkxTLTEkCi0gICAgamF2YXgud3NkbC5GYXVsdCBhY3R1YWxGYXVsdDEgPSBiaW5kaW5nRmF1bHQxLmdldEVGYXVsdCgpOwotICAgIGFzc2VydE5vdE51bGwoYWN0dWFsRmF1bHQxKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGYXVsdDEsIGFjdHVhbEZhdWx0MSk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIGZhdWx0IG9idGFpbmVkIGZyb20gdGhlIGJpbmRpbmcgZmF1bHQgaXMgbm90IG51bGwgYW5kCi0gICAgLy8gbWF0Y2hlcyB0aGUgb25lIGluIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbi4KLQotICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQyID0gKEJpbmRpbmdGYXVsdCkgYmluZGluZ09wZXJhdGlvbjIuZ2V0QmluZGluZ0ZhdWx0KCJPcGVyYXRpb24yRmF1bHQyIik7IC8vJE5PTi1OTFMtMSQKLSAgICBqYXZheC53c2RsLkZhdWx0IGFjdHVhbEZhdWx0MiA9IGJpbmRpbmdGYXVsdDIuZ2V0RUZhdWx0KCk7Ci0gICAgYXNzZXJ0Tm90TnVsbChhY3R1YWxGYXVsdDIpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZhdWx0MiwgYWN0dWFsRmF1bHQyKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTA1OQotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEF2b2lkRHVwbGljYXRlU0FYRXhjZXB0aW9uRGlhZ25vc3RpY3MoKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIE1ha2Ugc3VyZSB3ZSB0cmFjayBsb2NhdGlvbiB0byBhbGxvdyB0aGUgV1NETFBhcnNlciB0byBraWNrIGluLgotCi0gICAgICBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKFBMVUdJTl9BQlNPTFVURV9QQVRIICsgInNhbXBsZXMvQnVnRml4ZXMvRHVwbGljYXRlU0FYRXhjZXB0aW9uL1NBWEV4Y2VwdGlvbi53c2RsIiwgdHJ1ZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIAotICAgIFJlc291cmNlIHJlc291cmNlID0gZGVmaW5pdGlvbi5lUmVzb3VyY2UoKTsKLSAgICBFTGlzdCBlcnJvcnMgPSByZXNvdXJjZS5nZXRFcnJvcnMoKTsKLSAgICBpbnQgZXhwZWN0ZWRTaXplID0gMTsKLSAgICBpbnQgYWN0dWFsU2l6ZSA9IGVycm9ycy5zaXplKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2l6ZSwgYWN0dWFsU2l6ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI1NzYKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RCaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb24oKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoUExVR0lOX0FCU09MVVRFX1BBVEggKyAic2FtcGxlcy9CdWdGaXhlcy9CaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb24vQmluZGluZ09wZXJhdGlvblJlY29uY2lsaWF0aW9uLndzZGwiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvQmluZGluZ09wZXJhdGlvblJlY29uY2lsaWF0aW9uLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBRTmFtZSBwb3J0VHlwZVFOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgIkJpbmRpbmdPcGVyYXRpb25SZWNvbmNpbGlhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgamF2YXgud3NkbC5Qb3J0VHlwZSBwb3J0VHlwZSA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGUocG9ydFR5cGVRTmFtZSk7Ci0KLSAgICBTdHJpbmcgaW5wdXQzTmFtZSA9ICJJbnB1dDMiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIG91dHB1dDNOYW1lID0gIk91dHB1dDMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBDaGVjayB0aGF0IHRoZSBmaXJzdCBvcGVyYXRpb24gLSB3aGljaCBoYXMgbm8gbmFtZWQgaW5wdXQvb3V0cHV0IGlzIGJlaW5nCi0gICAgLy8gZm91bmQuCi0KLSAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9ICJOZXdPcGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgamF2YXgud3NkbC5PcGVyYXRpb24gb3BlcmF0aW9uMSA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbihvcGVyYXRpb25OYW1lLCBudWxsLCBudWxsKTsKLQotICAgIFFOYW1lIGJpbmRpbmdRTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsICJCaW5kaW5nT3BlcmF0aW9uUmVjb25jaWxpYXRpb25TT0FQIik7IC8vJE5PTi1OTFMtMSQKLSAgICBqYXZheC53c2RsLkJpbmRpbmcgYmluZGluZyA9IGRlZmluaXRpb24uZ2V0QmluZGluZyhiaW5kaW5nUU5hbWUpOwotCi0gICAgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24xID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUsIG51bGwsIG51bGwpOwotICAgIGphdmF4LndzZGwuT3BlcmF0aW9uIGFjdHVhbE9wZXJhdGlvbjEgPSBiaW5kaW5nT3BlcmF0aW9uMS5nZXRPcGVyYXRpb24oKTsKLQotICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24xLCBhY3R1YWxPcGVyYXRpb24xKTsKLQotICAgIC8vIFRoZSBzZWNvbmQgb3BlcmF0aW9uIC0gd2hpY2ggaGFzIG5vIG5hbWVkIGlucHV0L291dHB1dCBpcyBiZWluZyBmb3VuZAotICAgIC8vIHNob3VsZCBub3QgYmUgcmVjb25jaWxlZCBiZWNhdXNlIHRoZSBiaW5kaW5nIHNwZWNpZmllcyB0aGUgaW5wdXQgYW5kCi0gICAgLy8gb3V0cHV0LgotCi0gICAgU3RyaW5nIGlucHV0Mk5hbWUgPSAiSW5wdXQyIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBvdXRwdXQyTmFtZSA9ICJPdXRwdXQyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgU3RyaW5nIG9wZXJhdGlvbjJOYW1lID0gIk5ld09wZXJhdGlvbjIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjIgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uMk5hbWUsIGlucHV0Mk5hbWUsIG91dHB1dDJOYW1lKTsKLSAgICBqYXZheC53c2RsLk9wZXJhdGlvbiBhY3R1YWxPcGVyYXRpb24yID0gYmluZGluZ09wZXJhdGlvbjIuZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobnVsbCwgYWN0dWFsT3BlcmF0aW9uMik7Ci0KLSAgICAvLyBUaGUgdGhpcmQgb3BlcmF0aW9uIHNwZWNpZmllcyBhbiBpbnB1dCBhbmQgb3V0cHV0IG5hbWUsIGFuZCB0aGUgYmluZGluZwotICAgIC8vIG9wZXJhdGlvbiB3aWxsIHJlY29uY2lsZSBmaW5lIGJlY2F1c2UgdGhlIGl0IGFsc28gc3BlY2lmaWVzIHRoZSBwcm9wZXIKLSAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IG5hbWUuCi0KLSAgICBTdHJpbmcgb3BlcmF0aW9uM05hbWUgPSAiTmV3T3BlcmF0aW9uMyI7IC8vJE5PTi1OTFMtMSQKLSAgICBqYXZheC53c2RsLk9wZXJhdGlvbiBvcGVyYXRpb24zID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvbjNOYW1lLCBpbnB1dDNOYW1lLCBvdXRwdXQzTmFtZSk7Ci0KLSAgICBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uM05hbWUsIGlucHV0M05hbWUsIG91dHB1dDNOYW1lKTsKLSAgICBqYXZheC53c2RsLk9wZXJhdGlvbiBhY3R1YWxPcGVyYXRpb24zID0gYmluZGluZ09wZXJhdGlvbjMuZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uMywgYWN0dWFsT3BlcmF0aW9uMyk7Ci0gIH0KLQotICAvKioKLSAgICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzg1NTUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBbGxvd051bGxOYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoUExVR0lOX0FCU09MVVRFX1BBVEggKyAic2FtcGxlcy9CdWdGaXhlcy9OdWxsTmFtZXNwYWNlVVJJL0NvbnRhY3RJbmZvU2VydmljZS53c2RsIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0NvbnRhY3RJbmZvU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGZvciB0aGUgb3V0cHV0IG1lc3NhZ2UgcGFydCBpcyBzcGVjaWZpZWQgaW4gYQotICAgIC8vIHNjaGVtYSB3aXRoIG5vIHRhcmdldCBuYW1lc3BhY2UuIEl0IHNob3VsZCByZXNvbHZlIGZpbmUgYW5kIGhhdmUgYSBudWxsCi0gICAgLy8gbmFtZXNwYWNlIFVSSS4KLSAgICAKLSAgICBRTmFtZSBvdXRwdXQxUU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCAidXBkYXRlUGhvbmVOdW1iZXJSZXNwb25zZU1zZyIpOyAvLyROT04tTkxTLTEkCi0gICAgTWVzc2FnZSBvdXRwdXQxTWVzc2FnZSA9IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2Uob3V0cHV0MVFOYW1lKTsKLSAgICBhc3NlcnROb3ROdWxsKG91dHB1dDFNZXNzYWdlKTsKLQotICAgIFBhcnQgcGFydDEgPSAoUGFydCkgb3V0cHV0MU1lc3NhZ2UuZ2V0UGFydCgib3V0cHV0MSIpOyAvLyROT04tTkxTLTEkCi0gICAgYXNzZXJ0Tm90TnVsbChwYXJ0MSk7Ci0KLSAgICBRTmFtZSBvdXRwdXQyRWxlbWVudE5hbWUgPSBwYXJ0MS5nZXRFbGVtZW50TmFtZSgpOwotICAgIGFzc2VydE5vdE51bGwob3V0cHV0MkVsZW1lbnROYW1lKTsKLSAgICBhc3NlcnRFcXVhbHMoWE1MQ29uc3RhbnRzLk5VTExfTlNfVVJJLCBvdXRwdXQyRWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIAotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBvdXRwdXQyRWxlbWVudERlY2xhcmF0aW9uID0gcGFydDEuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgYXNzZXJ0Tm90TnVsbChvdXRwdXQyRWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICBhc3NlcnROb3ROdWxsKG91dHB1dDJFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpOwotICAgIGFzc2VydE51bGwob3V0cHV0MkVsZW1lbnREZWNsYXJhdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0KLSAgICAvLyBUaGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgb3V0cHV0IG1lc3NhZ2UgcGFydCBpcyBzcGVjaWZpZWQgaW4gYQotICAgIC8vIHNjaGVtYSB3aXRoIG5vIHRhcmdldCBuYW1lc3BhY2UuIEl0IHNob3VsZCByZXNvbHZlIGZpbmUgYW5kIGhhdmUgYSBudWxsCi0gICAgLy8gbmFtZXNwYWNlIFVSSS4KLSAgICAKLSAgICBRTmFtZSBvdXRwdXQyUU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCAidXBkYXRlQWRkcmVzc1Jlc3BvbnNlTXNnIik7IC8vJE5PTi1OTFMtMSQKLSAgICBNZXNzYWdlIG91dHB1dDJNZXNzYWdlID0gKE1lc3NhZ2UpIGRlZmluaXRpb24uZ2V0TWVzc2FnZShvdXRwdXQyUU5hbWUpOwotICAgIGFzc2VydE5vdE51bGwob3V0cHV0Mk1lc3NhZ2UpOwotICAgIAotICAgIFBhcnQgcGFydDIgPSAoUGFydCkgb3V0cHV0Mk1lc3NhZ2UuZ2V0UGFydCgib3V0cHV0MiIpOyAvLyROT04tTkxTLTEkCi0gICAgYXNzZXJ0Tm90TnVsbChwYXJ0MSk7Ci0KLSAgICBRTmFtZSBvdXRwdXQyVHlwZU5hbWUgPSBwYXJ0Mi5nZXRUeXBlTmFtZSgpOwotICAgIGFzc2VydE5vdE51bGwob3V0cHV0MlR5cGVOYW1lKTsKLSAgICBhc3NlcnRFcXVhbHMoWE1MQ29uc3RhbnRzLk5VTExfTlNfVVJJLCBvdXRwdXQyVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIAotICAgIFhTRFR5cGVEZWZpbml0aW9uIG91dHB1dDJUeXBlRGVmaW5pdGlvbiA9IHBhcnQyLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgYXNzZXJ0Tm90TnVsbChvdXRwdXQyVHlwZURlZmluaXRpb24pOwotICAgIGFzc2VydE5vdE51bGwob3V0cHV0MlR5cGVEZWZpbml0aW9uLmdldENvbnRhaW5lcigpKTsKLSAgICBhc3NlcnROdWxsKG91dHB1dDJUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvSW5saW5lU2NoZW1hVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0lubGluZVNjaGVtYVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkMmRiNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvSW5saW5lU2NoZW1hVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIElubGluZVNjaGVtYVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgUExVR0lOX0FCU09MVVRFX1BBVEggPSBXU0RMVGVzdHNQbHVnaW4uZ2V0SW5zdGFsbFVSTCgpOwotCSAgCi0gIHB1YmxpYyBJbmxpbmVTY2hlbWFUZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIAotICB7Ci0gICAgLy9qdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oSW5saW5lU2NoZW1hVGVzdC5jbGFzcyk7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgSW5saW5lU2NoZW1hVGVzdCgiSW5saW5lU2NoZW1hIikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotCSAgICAgICAgIHRlc3RJbmxpbmVTY2hlbWEoKTsKLQkgICAgICAgfQotCSAgICAgfQotCSAgICk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBJbmxpbmVTY2hlbWFUZXN0KCJJbmxpbmVTY2hlbWFXaXRoV1NETDRKIikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RJbmxpbmVTY2hlbWFXaXRoV1NETDRKKCk7Ci0gICAgICAgICAgIH0KLQkgICAgIH0KLQkgICApOwotICAgIAotCSAgcmV0dXJuIHN1aXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdElubGluZVNjaGVtYSgpIAotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKFBMVUdJTl9BQlNPTFVURV9QQVRIICsic2FtcGxlcy9Mb2FkU3RvcmVDb21wYXJlL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgICAgdHJhdmVyc2VEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SW5saW5lU2NoZW1hV2l0aFdTREw0SigpIAotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbG9hZERlZmluaXRpb25Gb3JXU0RMNEooIi4vc2FtcGxlcy9Mb2FkU3RvcmVDb21wYXJlL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgICAgdHJhdmVyc2VEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdHJhdmVyc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGVmaW5pdGlvbik7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlciA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJbXBvcnQgbXlJbXBvcnQgPSAoSW1wb3J0KWl0ZXIubmV4dCgpOwotICAgICAgLy90cmF2ZXJzZUltcG9ydChteUltcG9ydCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvLyBHZXQgSW5saW5lIFNjaGVtYQotICAgIFR5cGVzIHR5cGVzID0gKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKWRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiPHR5cGVzPiBpcyBudWxsIix0eXBlcyk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCI8dHlwZXM+IGRvZXMgbm90IGhhdmUgaW5saW5lIDxzY2hlbWE+cyIsaXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdHJhdmVyc2VTY2hlbWEoc2NoZW1hKTsKLSAgICAgIH0KLSAgICB9ICAJCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZUltcG9ydChJbXBvcnQgbXlJbXBvcnQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIERlZmluaXRpb24gZGVmID0gbXlJbXBvcnQuZ2V0RURlZmluaXRpb24oKTsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24oZGVmKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlU2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbnVsbDsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm8gPGVsZW1lbnQ+cyBhcmUgZm91bmQiLGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGVsZW1lbnREZWNsID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgIGlmIChlbGVtZW50RGVjbC5nZXROYW1lKCkuZXF1YWxzKCJOZXdPcGVyYXRpb25SZXNwb25zZSIpKQotICAgICAgCXRyYXZlcnNlRWxlbWVudERlY2woZWxlbWVudERlY2wpOwotICAgICAgZWxzZSBpZiAoZWxlbWVudERlY2wuZ2V0TmFtZSgpLmVxdWFscygiTmV3T3BlcmF0aW9uUmVxdWVzdCIpKQotICAgICAgICB0cmF2ZXJzZUVsZW1lbnREZWNsKGVsZW1lbnREZWNsKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdHJhdmVyc2VFbGVtZW50RGVjbChYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZWxlbWVudERlY2wuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPGVsZW1lbnQ+IGRvZXMgbm90IGhhdmUgPHNpbXBsZVR5cGU+Iix0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pOwotICAgIGlmICh0eXBlLmdldENvbXBsZXhUeXBlKCkgPT0gbnVsbCkgLy8gc2ltcGxlIHR5cGUKLSAgICAgIHJldHVybjsgLy8gVEJEIC0gQ3VycmVudGx5IHRoaXMgYWx3YXlzIHJldHVybnMgYXQgdGhpcyBwb2ludC4KLSAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgY29udGVudCA9IHR5cGUuZ2V0Q29tcGxleFR5cGUoKS5nZXRDb250ZW50KCk7ICAgCi0gICAgdHJhdmVyc2VNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKWNvbnRlbnQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdHJhdmVyc2VNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9IG51bGw7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZUNvbnRlbnQgPSAoKFhTRFBhcnRpY2xlKWl0ZXJhdG9yLm5leHQoKSkuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCkuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB0cmF2ZXJzZUVsZW1lbnREZWNsKCgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0cmF2ZXJzZUVsZW1lbnREZWNsKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFydGljbGVDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBsb2FkRGVmaW5pdGlvbihTdHJpbmcgd3NkbEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIERlZmluaXRpb25Mb2FkZXIubG9hZCh3c2RsRmlsZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBsb2FkRGVmaW5pdGlvbkZvcldTREw0SihTdHJpbmcgd3NkbEZpbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFdTRExSZWFkZXIgcmVhZGVyID0gKG5ldyBXU0RMRmFjdG9yeUltcGwoKSkubmV3V1NETFJlYWRlcigpOwotICAgIElQbHVnaW5EZXNjcmlwdG9yIHBkID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpOwotICAgIFVSTCB1cmwgPSBwZC5nZXRJbnN0YWxsVVJMKCk7Ci0gICAgdXJsID0gbmV3IFVSTCh1cmwsd3NkbEZpbGUpOwotICAgIFN0cmluZyBzID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldEZpbGUoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAob3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbilyZWFkZXIucmVhZFdTREwocyxuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShzKSkpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2FkQW5kU2VyaWFsaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2FkQW5kU2VyaWFsaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiYTE0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuWE1MRGlmZjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkQW5kU2VyaWFsaXphdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoteyAKLSAgewkgICAgCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotCSAgICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsgCi0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIFBMVUdJTl9BQlNPTFVURV9QQVRIID0gV1NETFRlc3RzUGx1Z2luLmdldEluc3RhbGxVUkwoKTsKLSAgcHJpdmF0ZSBTdHJpbmcgVEVTVF9EQVRBX0RJUjsKLSAgCi0gIC8vc3RhdGljIHByaXZhdGUgRmlsZVtdIHdzZGxzOwotICBwcml2YXRlIFZlY3RvciB3c2RsRmlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIHN0YXRpYyBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0JCi0gIC8qKgotICAgKiBFeGVjdXRlcyBhIHN0YW5kLWFsb25lIHRlc3QuCi0gICAqIEBwYXJhbSBvYmplY3RzIGFuIGFycmF5IG9mIFN0cmluZ3MgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgKiBAc2VlICNydW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIAotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0gIAotICBwdWJsaWMgTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgKG5ldyBMb2FkQW5kU2VyaWFsaXphdGlvblRlc3QoIkxvYWRBbmRTdG9yZSIpIAotICAgICAgewotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXN0TG9hZEFuZFN0b3JlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIHN1aXRlLmFkZFRlc3QgLy8gd3RwIGJ1ZyA3OTMyNgotICAgIChuZXcgTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0KCJDb21wYXJlIikgCi0gICAgICB7Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgewotICAgICAgICAgIHRlc3RDb21wYXJlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIHJldHVybiBzdWl0ZTsKLSAgfSAKLQotICAvKioKLSAgICogTG9hZCBmcm9tIHRoZSBXU0RMIGRlZmluaXRpb25zIGZpbGUgYW5kIHN0b3JlIGJhY2sgdG8gYSBkaWZmZXJlbnQgZmlsZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RMb2FkQW5kU3RvcmUoKQotICB7Ci0JU3RyaW5nIFRFU1RfREFUQV9ESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3REYXRhRGlyIik7Ci0JLy9Bc3NlcnQuYXNzZXJ0Tm90TnVsbCh0ZXN0RGF0YURpcik7Ci0JRmlsZSBkaXIgPSBudWxsOwotCWlmIChURVNUX0RBVEFfRElSICE9IG51bGwpCi0JCWRpciA9IG5ldyBGaWxlKFRFU1RfREFUQV9ESVIpOwotCWVsc2UJCi0JCS8vIEtCOiBpZiB5b3UgYXJlIGhlcmUsIGZpeCB0ZXh0LnhtbAotICAgICAgICBkaXIgPSBuZXcgRmlsZShQTFVHSU5fQUJTT0xVVEVfUEFUSCArICJzYW1wbGVzL0xvYWRTdG9yZUNvbXBhcmUiKTsgLy8gZmFsbGJhY2sKLQkKLSAgICBpZiAoZGlyLmV4aXN0cygpICYmIGRpci5pc0RpcmVjdG9yeSgpKQotICAgIHsKLSAgICAgIGxpc3REYXRhRmlsZXMoZGlyKTsKLQotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICBGaWxlIG15RmlsZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbEZpbGVzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgbXlGaWxlID0gKEZpbGUpd3NkbEZpbGVzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXlGaWxlLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgbG9hZChteUZpbGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgcHJpbnQobXlGaWxlLnRvU3RyaW5nKCkgKyAiLm91dCIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICBmYWlsKGRpci50b1N0cmluZygpKTsKLQotICB9Ci0gIAotCXByaXZhdGUgdm9pZCBsaXN0RGF0YUZpbGVzKEZpbGUgc3JjKSAgCi0JewotCQlpZiAoIXNyYy5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuOyAvLyBBc3NlcnRpb24gZmFpbGVkCi0JCQotCQlmaWx0ZXJXU0RMRmlsZXMoc3JjKTsgLy8gQWRkIFdTREwgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKLQkJCi0JCUZpbGVbXSBjaGlsZHJlbiA9IHNyYy5saXN0RmlsZXMoKTsKLQkJRmlsZSBteUZpbGU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIAotCQl7Ci0JCQlteUZpbGUgPSBjaGlsZHJlbltpXTsJCQkKLQkJCWlmIChteUZpbGUuaXNEaXJlY3RvcnkoKSkgCi0JCQl7Ci0JCQkJaWYgKCJDVlMiLmVxdWFscyhteUZpbGUuZ2V0TmFtZSgpKSkKLQkJCQkgIGNvbnRpbnVlOwotCQkJCQotCQkJCWxpc3REYXRhRmlsZXMobXlGaWxlKTsgLy8gVmlzaXQgc3ViLWRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5Ci0JCQl9IAotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaWx0ZXJXU0RMRmlsZXMoRmlsZSBkaXIpCi0JewotCQlGaWxlW10gd3NkbHMgPSBkaXIubGlzdEZpbGVzCi0JICAgICAgKAotCSAgICAgICAgbmV3IEZpbGVGaWx0ZXIoKQotCSAgICAgICAgewotCSAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIHJldHVybiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoIi53c2RsIik7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICApOwotCQkKLQkJZm9yIChpbnQgaj0wOyBqPHdzZGxzLmxlbmd0aDsgaisrKQotCQl7Ci0JCQl3c2RsRmlsZXMuYWRkKHdzZGxzW2pdKTsKLQkJfQotCX0KLSAgCi0gIC8qCi0gICAqIExvYWQgZnJvbSB0aGUgV1NETCBkZWZpbml0aW9ucyBmaWxlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvYWQoU3RyaW5nIGZpbGVuYW1lKQotICB7CQotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoZmlsZW5hbWUpOwotCSAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGVmaW5pdGlvbik7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZWZpbml0aW9uLmVSZXNvdXJjZSgpIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCk7Ci0JICAKLSAgICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbFJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpZGVmaW5pdGlvbi5lUmVzb3VyY2UoKTsKLQkgIEFzc2VydC5hc3NlcnROb3ROdWxsKHdzZGxSZXNvdXJjZSk7Ci0KLQkgIEVsZW1lbnQgZWxlbWVudCA9IGRlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCSAgCi0gICAgICBXU0RMUmVzb3VyY2VJbXBsLnNlcmlhbGl6ZShTeXN0ZW0ub3V0LCBlbGVtZW50KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIH0gIAotICB9Ci0gIAotICAvKgotICAgKiBTdG9yZSB0aGUgV1NETCBkZWZpbml0aW9ucyB0byBhIGZpbGUuCi0gICAqLyAgCi0gIHByaXZhdGUgdm9pZCBwcmludChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBUaGlzIHJlbW92ZXMgdGhlIGFzc29jaWF0ZWQgRE9NIGVsZW1lbnQsIGNyZWF0ZXMgYSBuZXcgYXNzb2NpYXRlZCBET00gZWxlbWVudCwgYW5kIHRoZW4gcHJpbnRzIGl0LgotICAgICAgLy8gVGhpcyBpcyBhIGdvb2QgdGVzdCBmb3IgaG93IHdlbGwgc2VyaWFsaXphdGlvbiB3b3JrcyBmb3IgYSBtb2RlbCBjcmVhdGVkICJib3R0b20gdXAiLgotICAgICAgLy8KLSAgICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnQobnVsbCk7Ci0gICAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQobnVsbCk7Ci0gICAgICAoKERlZmluaXRpb25JbXBsKWRlZmluaXRpb24pLnVwZGF0ZUVsZW1lbnQoKTsKLQotCSAgRGVmaW5pdGlvbkxvYWRlci5zdG9yZShkZWZpbml0aW9uLGZpbGVuYW1lKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIH0gICAKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbXBhcmUgdGhlIG91dHB1dCBXU0RMIGZpbGUgdG8gdGhlIG9yaWdpbmFsLgotICAgKi8gIAotICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpCi0gIHsKLSAgICBYTUxEaWZmIHhtbGRpZmYgPSBuZXcgWE1MRGlmZigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgbXlGaWxlID0gbnVsbDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbEZpbGVzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgIAlteUZpbGUgPSAoRmlsZSl3c2RsRmlsZXMuZWxlbWVudEF0KGkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh4bWxkaWZmLmRpZmYobXlGaWxlLnRvU3RyaW5nKCksbXlGaWxlLnRvU3RyaW5nKCkgKyAiLm91dCIpKTsgCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0gICAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2NhdGlvblRyYWNraW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0xvY2F0aW9uVHJhY2tpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTRlZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0xvY2F0aW9uVHJhY2tpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVGVzdCBjbGFzcyB1c2VkIHRvIHZhbGlkYXRlIHRoZSBXU0RMIG1vZGVsIHNvdXJjZSBsb2NhdGlvbiB0cmFja2luZwotICogbWVjaGFuaXNtLgotICovCi1wdWJsaWMgY2xhc3MgTG9jYXRpb25UcmFja2luZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgc3VpdGUuYWRkVGVzdChuZXcgTG9jYXRpb25UcmFja2luZ1Rlc3QoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKQotICAgICAgewotICAgICAgICB0ZXN0VHJhY2tzTG9jYXRpb24oKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgdGhlIGxvY2F0aW9uIHRyYWNraW5nIG1lY2hhbmlzbSBwcm92aWRlZCBieSB0aGUgV1NETCBtb2RlbCByZXNvdXJjZQotICAgKiBsb2FkZXIuCi0gICAqIAotICAgKiBAc2VlIFdTRExSZXNvdXJjZUltcGwKLSAgICogQHNlZSBXU0RMUGFyc2VyCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2tzTG9jYXRpb24oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIGZpbGVOYW1lID0gV1NETFRlc3RzUGx1Z2luLmdldEluc3RhbGxVUkwoKSArICIvc2FtcGxlcy9Mb2FkU3RvcmVDb21wYXJlL0xvYWRBbmRQcmludFRlc3Qud3NkbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IERlZmluaXRpb25Mb2FkZXIubG9hZChmaWxlTmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChkZWZpbml0aW9uKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRlZmluaXRpb24uZVJlc291cmNlKCkgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKTsKLQotICAgICAgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IGRlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKDEsIFdTRExQYXJzZXIuZ2V0U3RhcnRMaW5lKGRlZmluaXRpb25FbGVtZW50KSk7Ci0KLSAgICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICAgIEVsZW1lbnQgdHlwZXNFbGVtZW50ID0gdHlwZXMuZ2V0RWxlbWVudCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKDQsIFdTRExQYXJzZXIuZ2V0U3RhcnRMaW5lKHR5cGVzRWxlbWVudCkpOwotCi0gICAgICBMaXN0IHR5cGVzRXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCi0gICAgICBhc3NlcnRFcXVhbHMoMSwgdHlwZXNFeHRlbnNpYmlsaXR5RWxlbWVudHMuc2l6ZSgpKTsKLQotICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgc2NoZW1hRXh0ZW5zaW9uID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSB0eXBlc0V4dGVuc2liaWxpdHlFbGVtZW50cy5nZXQoMCk7Ci0KLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFFeHRlbnNpb24uZ2V0U2NoZW1hKCk7Ci0KLSAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0KLSAgICAgIGFzc2VydEVxdWFscyg1LCBYU0RQYXJzZXIuZ2V0U3RhcnRMaW5lKHNjaGVtYUVsZW1lbnQpKTsKLQotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlcXVlc3RFbGVtZW50RGVjbGFyYXRpb24gPSBzY2hlbWEucmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbigiTmV3T3BlcmF0aW9uUmVxdWVzdCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIEVsZW1lbnQgcmVxdWVzdEVsZW1lbnQgPSByZXF1ZXN0RWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnQoKTsKLQotICAgICAgYXNzZXJ0RXF1YWxzKDcsIFhTRFBhcnNlci5nZXRTdGFydExpbmUocmVxdWVzdEVsZW1lbnQpKTsKLQotICAgICAgTGlzdCBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZXMuc2l6ZSgpKTsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlcy5nZXQoMCk7Ci0KLSAgICAgIEVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBzZXJ2aWNlLmdldEVsZW1lbnQoKTsKLSAgICAgIGFzc2VydEVxdWFscyg0MiwgV1NETFBhcnNlci5nZXRTdGFydExpbmUoc2VydmljZUVsZW1lbnQpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL015UmVzb2x2ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9NeVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjY2FhNGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL015UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotcHVibGljIGNsYXNzIE15UmVzb2x2ZXIgaW1wbGVtZW50cyBFbnRpdHlSZXNvbHZlcgotewotICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIGlmIChzeXN0ZW1JZC5lcXVhbHMoImh0dHA6Ly93d3cubXlob3N0LmNvbS90b2RheSIpKQotICAgIHsKLSAgICAgIC8vIHJldHVybiBhIHNwZWNpYWwgaW5wdXQgc291cmNlCi0gICAgICAvL015UmVhZGVyIHJlYWRlciA9IG5ldyBNeVJlYWRlcigpOwotICAgICAgLy9yZXR1cm4gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0gICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKHN5c3RlbUlkKTsgLy8gVEJECi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyB1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3VyCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9QYXJzZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvUGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzRkOTg1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9QYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgUGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIAotICBwdWJsaWMgUGFyc2VyVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBQYXJzZXJUZXN0KCJQYXJzZXIiKSAKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVzdFBhcnNlcigpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICAKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXIoKSAKLSAgewotICAgIEVudGl0eVJlc29sdmVyIG15UmVzb2x2ZXIgPSBuZXcgTXlSZXNvbHZlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgiLi9zYW1wbGVzL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIG15QnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgIG15QnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihteVJlc29sdmVyKTsKLSAgICAgIERvY3VtZW50IGRvYyA9IG15QnVpbGRlci5wYXJzZShpcyk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRG9jdW1lbnQgaXMgbnVsbCIsZG9jKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9SZWZhY3RvcmluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9SZWZhY3RvcmluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMjk2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvUmVmYWN0b3JpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFJlZmFjdG9yaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHB1YmxpYyBSZWZhY3RvcmluZ1Rlc3QoKQotICB7Ci0gICAgLy9pbml0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZWZhY3RvcmluZ1Rlc3QoU3RyaW5nIG5hbWUpIAotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBSZWZhY3RvcmluZ1Rlc3QoIlJlZmFjdG9yaW5nIikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RSZWZhY3RvcmluZygpOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgKTsKLSAgICAKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWZhY3RvcmluZygpIAotICB7Ci0gICAgdHJ5Ci0gICAgewotCSAgLy8gQmVmb3JlIHJ1bm5pbmcgdGhpcyB0ZXN0LCBtb2RpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgV1NETCBmaWxlCi0gICAgICBnZW5lcmF0ZVdTREwoIlJlZmFjdG9yaW5nVGVzdC53c2RsIik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIudGVhckRvd24oKTsKLSAgfQotCi0gIC8vIGRlZmVjdCA2NTk0Ci0gIHB1YmxpYyB2b2lkIHJlbmFtZU9wZXJhdGlvbihPcGVyYXRpb24gb3ApCi0gIHsKLQlJbnB1dCBpbnB1dCA9IG9wLmdldEVJbnB1dCgpOwotCUFzc2VydC5hc3NlcnROb3ROdWxsKGlucHV0KTsKLQlNZXNzYWdlIG1lc3NhZ2UgPSBpbnB1dC5nZXRFTWVzc2FnZSgpOwotCUFzc2VydC5hc3NlcnROb3ROdWxsKG1lc3NhZ2UpOwotCQotCW9wLnNldE5hbWUoIlJlbmFtZWQiICsgb3AuZ2V0TmFtZSgpKTsKLQlRTmFtZSBuZXdRTmFtZSA9IG5ldyBRTmFtZShtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIlJlbmFtZWQiICsgbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQltZXNzYWdlLnNldFFOYW1lKG5ld1FOYW1lKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVXU0RMKFN0cmluZyBvdXRwdXRGaWxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKG91dHB1dEZpbGUpKTsKLSAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCi0gICAgLy8gQ3JlYXRlIGEgRGVmaW5pdGlvbiAtIFRlbXBlcmF0dXJlCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICBkZWZpbml0aW9uLnNldFFOYW1lKG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSwiVGVtcGFyYXR1cmUiKSk7Ci0gICAgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0gICAgCi0gICAgLy8gVGFyZ2V0IG5hbWVzcGFjZSAtIGh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tCi0gICAgZGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tIik7Ci0gICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoInRucyIsICJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbSIpOwotICAgIAotICAgIC8vIE90aGVyIG5hbWVzcGFjZXMgLSB3c2RsLCBzb2FwLCB4c2QKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgid3NkbCIsIFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgieHNkIiwgV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoInNvYXAiLCBTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAvLwotICAgIC8vIExldCdzIHN0YXJ0IGJ1aWxkaW5nIHR3byBtZXNzYWdlcwotICAgIC8vCi0gICAgCi0gICAgLy8gQ3JlYXRlIGEgUGFydCAtIFppcENvZGUKLSAgICBQYXJ0IHBhcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFydCgpOwotICAgIHBhcnQuc2V0TmFtZSgiWmlwQ29kZSIpOwotICAgIHBhcnQuc2V0VHlwZU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsInN0cmluZyIpKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBNZXNzYWdlIC0gR2V0VGVtcGVyYXR1cmVJbnB1dAotICAgIE1lc3NhZ2UgaW5wdXRNZXNzYWdlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBpbnB1dE1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksICJHZXRUZW1wYXJhdHVyZUlucHV0IikpOwotICAgIGlucHV0TWVzc2FnZS5hZGRQYXJ0KHBhcnQpOwotICAgIGRlZmluaXRpb24uYWRkTWVzc2FnZShpbnB1dE1lc3NhZ2UpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIFBhcnQgLSBUZW1wZXJhdHVyZQotICAgIHBhcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFydCgpOwotICAgIHBhcnQuc2V0TmFtZSgiVGVtcGVyYXR1cmUiKTsKLSAgICBwYXJ0LnNldFR5cGVOYW1lKG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCJmbG9hdCIpKTsKLQotICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2UgLSBHZXRUZW1wZXJhdHVyZU91dHB1dAotICAgIE1lc3NhZ2Ugb3V0cHV0TWVzc2FnZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgb3V0cHV0TWVzc2FnZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgIkdldFRlbXBhcmF0dXJlT3V0cHV0IikpOwotICAgIG91dHB1dE1lc3NhZ2UuYWRkUGFydChwYXJ0KTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2Uob3V0cHV0TWVzc2FnZSk7Ci0gICAgCi0gICAgLy8KLSAgICAvLyBOZXh0LCBidWlsZCBhIFBvcnRUeXBlCi0gICAgLy8KLSAgICAKLSAgICAvLyBDcmVhdGUgYW4gSW5wdXQgLSBHZXRUZW1wZXJhdHVyZUlucHV0Ci0gICAgSW5wdXQgaW5wdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5wdXQoKTsKLSAgICBpbnB1dC5zZXRNZXNzYWdlKGlucHV0TWVzc2FnZSk7Ci0KLSAgICAvLyBDcmVhdGUgYW4gT3V0cHV0IC0gR2V0VGVtcGVyYXR1cmVPdXRwdXQKLSAgICBPdXRwdXQgb3V0cHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dHB1dCgpOwotICAgIG91dHB1dC5zZXRNZXNzYWdlKG91dHB1dE1lc3NhZ2UpOwotICAgCi0gICAgLy8gQ3JlYXRlIGFuIE9wZXJhdGlvbiAtIEdldFRlbXBlcmF0dXJlRm9yWmlwQ29kZQotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgb3BlcmF0aW9uLnNldE5hbWUoIkdldFRlbXBlcmF0dXJlRm9yWmlwQ29kZSIpOwotICAgIG9wZXJhdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0gICAgb3BlcmF0aW9uLnNldE91dHB1dChvdXRwdXQpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIFBvcnRUeXBlCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICBwb3J0VHlwZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwiR2V0VGVtcGFyYXR1cmVJbmZvU09BUCIpKTsKLSAgICBwb3J0VHlwZS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZFBvcnRUeXBlKHBvcnRUeXBlKTsKLQkKLQkvLwotCS8vIENyZWF0ZSB0aGUgc2Vjb25kIHNldCBvcCBPcGVyYXRpb25zCi0JLy8KLQkKLSAgICAvLyBDcmVhdGUgYSBQYXJ0Ci0gICAgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgcGFydC5zZXROYW1lKCJQYXJ0MiIpOwotICAgIHBhcnQuc2V0VHlwZU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsInN0cmluZyIpKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBNZXNzYWdlCi0gICAgTWVzc2FnZSBpbnB1dE1lc3NhZ2UyID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBpbnB1dE1lc3NhZ2UyLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCAiSW5wdXRNZXNzYWdlMiIpKTsKLSAgICBpbnB1dE1lc3NhZ2UyLmFkZFBhcnQocGFydCk7Ci0gICAgZGVmaW5pdGlvbi5hZGRNZXNzYWdlKGlucHV0TWVzc2FnZTIpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIFBhcnQKLSAgICBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICBwYXJ0LnNldE5hbWUoIlBhcnQzIik7Ci0gICAgcGFydC5zZXRUeXBlTmFtZShuZXcgUU5hbWUoV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwiZmxvYXQiKSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBNZXNzYWdlIC0gR2V0VGVtcGVyYXR1cmVPdXRwdXQKLSAgICBNZXNzYWdlIG91dHB1dE1lc3NhZ2UyID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBvdXRwdXRNZXNzYWdlMi5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgIk91dHB1dE1lc3NhZ2UyIikpOwotICAgIG91dHB1dE1lc3NhZ2UyLmFkZFBhcnQocGFydCk7Ci0gICAgZGVmaW5pdGlvbi5hZGRNZXNzYWdlKG91dHB1dE1lc3NhZ2UyKTsJCi0JCi0gICAgLy8gQ3JlYXRlIGFuIElucHV0Ci0gICAgSW5wdXQgaW5wdXQyID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlucHV0KCk7Ci0gICAgaW5wdXQyLnNldE1lc3NhZ2UoaW5wdXRNZXNzYWdlMik7Ci0KLSAgICAvLyBDcmVhdGUgYW4gT3V0cHV0IC0gR2V0VGVtcGVyYXR1cmVPdXRwdXQKLSAgICBPdXRwdXQgb3V0cHV0MiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRwdXQoKTsKLSAgICBvdXRwdXQyLnNldE1lc3NhZ2Uob3V0cHV0TWVzc2FnZTIpOwotICAgCi0gICAgLy8gQ3JlYXRlIGFuIE9wZXJhdGlvbiAtIEdldFRlbXBlcmF0dXJlRm9yWmlwQ29kZQotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24yID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbjIuc2V0TmFtZSgiT3BlcmF0aW9uMiIpOwotICAgIG9wZXJhdGlvbjIuc2V0SW5wdXQoaW5wdXQyKTsKLSAgICBvcGVyYXRpb24yLnNldE91dHB1dChvdXRwdXQyKTsJCi0JCi0JcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotICAgICAKLQlyZW5hbWVPcGVyYXRpb24ob3BlcmF0aW9uKTsKLQlyZW5hbWVPcGVyYXRpb24ob3BlcmF0aW9uMik7Ci0JCi0gICAgcmVzb3VyY2Uuc2F2ZShudWxsKTsKLSAKLSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvU2VtYW50aWNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvU2VtYW50aWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODUyYTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1NlbWFudGljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIFNlbWFudGljVGVzdCBleHRlbmRzIERlZmluaXRpb25WaXNpdG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIFBMVUdJTl9BQlNPTFVURV9QQVRIID0gV1NETFRlc3RzUGx1Z2luLmdldEluc3RhbGxVUkwoKTsgCi0gIC8vcHJpdmF0ZSBTdHJpbmcgd3NkbE5hbWVzcGFjZVByZWZpeDsKLSAgLy9wcml2YXRlIFN0cmluZyB4c2ROYW1lc3BhY2VQcmVmaXg7Ci0gIAotICB7Ci0gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHBsdWdpbi54bWwKLSAgICAvLwotICAgIC8vICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5lbWYuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgLy8gICAgIDxwYXJzZXIgdHlwZT0id3NkbCIgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIvPgotICAgIC8vICAgPC9leHRlbnNpb24+Ci0gICAgLy8KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFNlbWFudGljVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAqLwotICBwdWJsaWMgU2VtYW50aWNUZXN0KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGRlZmluaXRpb24pOwotICB9Ci0vKiAgCi0gIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBTb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwieWVzIik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywiVVRGLTgiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCI0Iik7Ci0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGRvbVNvdXJjZSxuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY3JlYXRlRG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBjcmVhdGVXU0RMRWxlbWVudChTdHJpbmcgbmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbCIsbmFtZSk7Ci0gICAgaWYgKHdzZGxOYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQuc2V0UHJlZml4KHdzZGxOYW1lc3BhY2VQcmVmaXgpOwotICAgIAotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gKi8gCi0gIHByaXZhdGUgdm9pZCB2aXNpdERvY3VtZW50YXRpb24oRWxlbWVudCBkb2NFbGVtZW50KQotICB7Ci0gICAgaWYgKGRvY0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwcmludGxuKCJkb2N1bWVudGF0aW9uOiAiICsgZG9jRWxlbWVudCk7IC8vIFRCRCAtIHNlcmlhbGl6ZSBkb2NFbGVtZW50Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBwcmludGxuKFN0cmluZyBzKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHMpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBkZWZpbml0aW9ucy4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgUU5hbWUgcW5hbWUgPSBkZWYuZ2V0UU5hbWUoKTsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBwcmludGxuKCJ0YXJnZXROYW1lc3BhY2U6ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldE5hbWVzcGFjZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIHByaW50bG4oIm5hbWVzcGFjZSBwcmVmaXg6ICIgKyBwcmVmaXggKyAiLCBuYW1lc3BhY2UgVVJJOiAiICsgbmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBkZWZpbml0aW9ucy4uLiIpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEltcG9ydChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGltcG9ydC4uLiIpOwotICAgIC8vIERldGVybWluZSBpZiB3ZSA8aW1wb3J0PiBhIHNjaGVtYS4KLSAgICBpZiAoaW1wb3J0aW5nU2NoZW1hKHdzZGxJbXBvcnQpKQotICAgIHsKLSAgICAgIHByaW50bG4oIjxpbXBvcnQ+aW5nIFhNTCBTY2hlbWEiKTsKLSAgICAgIAotICAgICAgLy8gIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbSIgc2NoZW1hTG9jYXRpb249ICJiYXIueHNkIi8+Ci0gICAgICBwcmludGxuKCJuYW1lc3BhY2U6ICIgKyB3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIHByaW50bG4oInNjaGVtYUxvY2F0aW9uOiAiICsgd3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgIHZpc2l0RG9jdW1lbnRhdGlvbih3c2RsSW1wb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAgIAotICAgIH0KLSAgCWVsc2UKLSAgICB7Ci0gICAgICBwcmludGxuKCI8aW1wb3J0PmluZyBXU0RMIik7Ci0gICAgICB2aXNpdERvY3VtZW50YXRpb24od3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICB9Ci0gICAgcHJpbnRsbigiTGVhdmluZyBpbXBvcnQuLi4iKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGltcG9ydGluZ1NjaGVtYShJbXBvcnQgbXlJbXBvcnQpCi0gIHsKLSAgICBpZiAobXlJbXBvcnQuZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpIC8vIGl0IGlzIFdTREwgaW1wb3J0Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFR5cGVzKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcykKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIHR5cGVzLi4uIik7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVzLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBwcmludGxuKCJpbi1saW5lIHNjaGVtYTogIiArIHNjaGVtYSk7Ci0gICAgfSAgIAotICAgIHByaW50bG4oIkxlYXZpbmcgdHlwZXMuLi4iKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0UGFydChvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIHBhcnQuLi4iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBwb3J0VHlwZS4uLiIpOwotICAJdmlzaXREb2N1bWVudGF0aW9uKHBvcnRUeXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAJCi0gICAgUU5hbWUgcW5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAKLSAgICBzdXBlci52aXNpdFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIHBvcnRUeXBlLi4uIik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBvcGVyYXRpb24uLi4iKTsKLSAgICB2aXNpdERvY3VtZW50YXRpb24ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotCQotICAgIFN0cmluZyBuYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG5hbWUpOwotCi0gICAgT3BlcmF0aW9uVHlwZSBvcFR5cGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIGRldGVybWluaW5nIE9wZXJhdGlvbiBUeXBlIixvcFR5cGUpOwotICAgIAotICAgIGlmIChPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZTogIiArICJpbi1vdXQiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAib3V0LWluIik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04gPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAib3V0LW9ubHkiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLk9ORV9XQVkgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAiaW4tb25seSIpOwotICAgIAotICAgIHN1cGVyLnZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBvcGVyYXRpb24uLi4iKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRJbnB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBpbnB1dC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgbmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG5hbWUpOwotICAgIAotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZXNvbHZlIHRoZSBtZXNzYWdlIixtZXNzYWdlKTsKLSAgICAKLSAgICBwcmludGxuKCJMZWF2aW5nIGlucHV0Li4uIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBnZXRQYXJ0RWxlbWVudChNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VSZWYuZ2V0RU1lc3NhZ2UoKS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIC8vIFRCRCAtIGZvciBub3csIHRha2UgdGhlIGZpcnN0IHBhcnQuCi0gICAgUGFydCBwYXJ0ID0gKFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgIEVsZW1lbnQgcGFydEVsZW1lbnQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICByZXR1cm4gcGFydEVsZW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdE91dHB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgb3V0cHV0Li4uIik7Ci0gICAgdmlzaXREb2N1bWVudGF0aW9uKG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgbmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBuYW1lKTsKLSAgICAKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlc29sdmUgdGhlIG1lc3NhZ2UiLG1lc3NhZ2UpOwotICAgIAotICAgIHByaW50bG4oIkxlYXZpbmcgb3V0cHV0Li4uIik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEZhdWx0KG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGZhdWx0Li4uIik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBmYXVsdC4uLiIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRCaW5kaW5nKG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZy4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFFOYW1lIHFuYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZXNvbHZlIHRoZSBwb3J0VHlwZSIscG9ydFR5cGUpOwotCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKCI8c29hcEJvZHk+IGlzIG1pc3NpbmciLHNvYXBCb2R5VmlzaXRlZCk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoIjxzb2FwQmluZGluZz4gaXMgbWlzc2luZyIsc29hcEJpbmRpbmdWaXNpdGVkKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPHNvYXBPcGVyYXRpb24+IGlzIG1pc3NpbmciLHNvYXBPcGVyYXRpb25WaXNpdGVkKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGJpbmRpbmcgb3BlcmF0aW9uLi4uIik7Ci0gICAgdmlzaXREb2N1bWVudGF0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVzb2x2ZSB0aGUgb3BlcmF0aW9uIixvcGVyYXRpb24pOwotICAgIAotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICBwcmludGxuKCJuYW1lOiAiICsgb3BlcmF0aW9uTmFtZSk7Ci0gICAgfQotIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgb3BlcmF0aW9uLi4uIik7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBpbnB1dC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgaW5wdXROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotICAgIGlmIChpbnB1dE5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBpbnB1dE5hbWUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgaW5wdXQuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBvdXRwdXQuLi4iKTsKLSAgICB2aXNpdERvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFN0cmluZyBvdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICBpZiAob3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG91dHB1dE5hbWUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgYmluZGluZyBvdXRwdXQuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBmYXVsdC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBFbGVtZW50IGZhdWx0RWxlbWVudCA9IGZhdWx0LmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotICAgIGlmIChmYXVsdE5hbWUgIT0gbnVsbCkKLSAgICAgIGZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGZhdWx0TmFtZSk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOyAKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgZmF1bHQuLi4iKTsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgc2VydmljZS4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihzZXJ2aWNlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFFOYW1lIHFuYW1lID0gc2VydmljZS5nZXRRTmFtZSgpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJWYWxpZGF0aW9uIEVycm9yOiBzZXJ2aWNlIGlzIG1pc3NpbmcgdGhlIG5hbWUgYXR0cmlidXRlIixxbmFtZSk7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgICBwcmludGxuKCJuYW1lOiAiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIAotICAgIHN1cGVyLnZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIHNlcnZpY2UuLi4iKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRQb3J0KG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgcG9ydC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFN0cmluZyBuYW1lID0gcG9ydC5nZXROYW1lKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIlZhbGlkYXRpb24gRXJyb3I6IHBvcnQgaXMgbWlzc2luZyB0aGUgbmFtZSBhdHRyaWJ1dGUiLHBvcnQpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcmludGxuKCJuYW1lOiAiICsgcG9ydC5nZXROYW1lKCkpOwotICAgIAotICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlc29sdmUgdGhlIGJpbmRpbmciLGJpbmRpbmcpOwotICAgIAotICAgIHN1cGVyLnZpc2l0UG9ydChwb3J0KTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPHNvYXBBZGRyZXNzPiBpcyBtaXNzaW5nIixzb2FwQWRkcmVzc1Zpc2l0ZWQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgcG9ydC4uLiIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudC4uLiIpOwotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgdmlzaXRTT0FQQm9keSgoU09BUEJvZHkpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICB2aXNpdFNPQVBCaW5kaW5nKChTT0FQQmluZGluZylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgIHZpc2l0U09BUEFkZHJlc3MoKFNPQVBBZGRyZXNzKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB2aXNpdFNPQVBPcGVyYXRpb24oKFNPQVBPcGVyYXRpb24pZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgZXh0ZW5zaWJpbGl0eSBlbGVtZW50Li4uIik7Ci0gIH0KLSAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcE9wZXJhdGlvblZpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24pCi0gIHsKLSAgICBzb2FwT3BlcmF0aW9uVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUE9wZXJhdGlvbi4uLiIpOwotICAgIHByaW50bG4oInNvYXBBY3Rpb246ICIgKyBzb2FwT3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQT3BlcmF0aW9uLi4uIik7Ci0gIH0KLSAgCi0gIC8vTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBCb2R5VmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQm9keShTT0FQQm9keSBzb2FwQm9keSkKLSAgewotICAgIHNvYXBCb2R5VmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEJvZHkuLi4iKTsKLSAgICBwcmludGxuKCJ1c2U6ICIgKyBzb2FwQm9keS5nZXRVc2UoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQm9keS4uLiIpOwotICB9Ci0gIAotICAvL05lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQmluZGluZ1Zpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEJpbmRpbmcoU09BUEJpbmRpbmcgc29hcEJpbmRpbmcpCi0gIHsKLSAgICBzb2FwQmluZGluZ1Zpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBCaW5kaW5nLi4uIik7Ci0gICAgcHJpbnRsbigic3R5bGU6ICIgKyBzb2FwQmluZGluZy5nZXRTdHlsZSgpKTsKLSAgICBwcmludGxuKCJ0cmFuc3BvcnQ6ICIgKyBzb2FwQmluZGluZy5nZXRUcmFuc3BvcnRVUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQmluZGluZy4uLiIpOyAgCi0gIH0KLSAKLSAgLy8gTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBBZGRyZXNzVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcykKLSAgewotICAgIHNvYXBBZGRyZXNzVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEFkZHJlc3MuLi4iKTsKLSAgICBwcmludGxuKCJsb2NhdGlvbjogIiArIHNvYXBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUEFkZHJlc3MuLi4iKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgU2VtYW50aWNUZXN0KCJNb2RlbFNlbWFudGljVGVzdCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TW9kZWxTZW1hbnRpYygpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFNlbWFudGljKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKFBMVUdJTl9BQlNPTFVURV9QQVRIICsgInNhbXBsZXMvTG9hZFN0b3JlQ29tcGFyZS9Mb2FkQW5kUHJpbnRUZXN0LndzZGwiLHRydWUpOwotICAgICAgU2VtYW50aWNUZXN0IHRlc3QgPSBuZXcgU2VtYW50aWNUZXN0KGRlZik7Ci0gICAgICB0ZXN0LnZpc2l0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbChlLnRvU3RyaW5nKCkpOwotICAgIH0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9VdGlsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1V0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNzYxOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1V0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCSAgcHJpdmF0ZSBTdHJpbmcgUExVR0lOX0FCU09MVVRFX1BBVEggPSBXU0RMVGVzdHNQbHVnaW4uZ2V0SW5zdGFsbFVSTCgpOwotCSAgCi0JICBwdWJsaWMgVXRpbFRlc3QoU3RyaW5nIG5hbWUpIAotCSAgewotCSAgICBzdXBlcihuYW1lKTsKLQkgIH0KLQkKLQkgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIAotCSAgewotCSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JICB9Ci0KLQkgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotCSAgewotCSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JICAgIAotCSAgICBzdWl0ZS5hZGRUZXN0Ci0JICAgICAgKG5ldyBVdGlsVGVzdCgiV1NETENvbnN0YW50cyIpIAotCSAgICAgICAgIHsKLQkgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLQkgICAgICAgICAgIHsKLQkJCQkgdGVzdENvbnN0YW50cygpOwotCSAgICAgICAgICAgfQotCSAgICAgICAgIH0KLQkgICAgICAgKTsKLQkgICAgCi0JICAgIHN1aXRlLmFkZFRlc3QKLQkgICAgICAobmV3IFV0aWxUZXN0KCJXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIpIAotCSAgICAgICAgewotCSAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0JICAgICAgICAgIHsKLQkgICAgICAgICAgICB0ZXN0V1NETFJlc291cmNlRmFjdG9yeUltcGwoKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICk7Ci0JCQotCSAgICBzdWl0ZS5hZGRUZXN0Ci0JICAgICAgKG5ldyBVdGlsVGVzdCgiV1NETFJlc291cmNlSW1wbCIpIAotCSAgICAgICAgewotCSAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0JICAgICAgICAgIHsKLQkgICAgICAgICAgICB0ZXN0V1NETFJlc291cmNlSW1wbCgpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgKTsKLQkgICAgc3VpdGUuYWRkVGVzdAotCSAgICAgIChuZXcgVXRpbFRlc3QoIkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSIpIAotCSAgICAgICAgewotCSAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0JICAgICAgICAgIHsKLQkgICAgICAgICAgICB0ZXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KCk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICApOwotCSAgICBzdWl0ZS5hZGRUZXN0Ci0JICAgICAgKG5ldyBVdGlsVGVzdCgiRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkiKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgdGVzdEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICApOwotCQkKLQotCQkKLQkgICAgcmV0dXJuIHN1aXRlOwotCSAgfQotCSAgCi0JICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0JICB7Ci0JICAgIHN1cGVyLnNldFVwKCk7Ci0JICAgIAotCSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkgICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotCSAgICAKLQkgICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0JICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkgICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsgCi0JICB9Ci0KLQkgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLQkgIHsKLQkgICAgc3VwZXIudGVhckRvd24oKTsKLQkgIH0gIAotCSAgCi0JICBzdGF0aWMgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotCSAgCi0JICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RhbnRzKCkKLQkgIHsKLSAgICAgICAgdHJ5Ci0JCXsKLQkJICBpbnQgdHlwZSA9IFdTRExDb25zdGFudHMubm9kZVR5cGUoV1NETENvbnN0YW50cy5QT1JUX0VMRU1FTlRfVEFHKTsKLQkJICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm9kZSB0eXBlIGlzIG5vdCB0aGF0IG9mIHBvcnQiLCB0eXBlID09IDEwKTsKLQkJICAKLQkgICAgICBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKFBMVUdJTl9BQlNPTFVURV9QQVRIICsgInNhbXBsZXMvTG9hZFN0b3JlQ29tcGFyZS9Mb2FkQW5kUHJpbnRUZXN0LndzZGwiKTsKLQkgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZWZpbml0aW9uLmVSZXNvdXJjZSgpIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCk7Ci0KLQkJICBpbnQgZGVmaW5pdGlvbk5vZGVUeXBlID0gV1NETENvbnN0YW50cy5ub2RlVHlwZShkZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0JCSAgQXNzZXJ0LmFzc2VydFRydWUoIk5vZGUgdHlwZSBpcyBub3QgdGhhdCBvZiBkZWZpbml0aW9uIiwgZGVmaW5pdGlvbk5vZGVUeXBlID09IDEpOwotCQkgIAotCQkgIGJvb2xlYW4gaXNXU0RMTmFtZXNwYWNlID0gV1NETENvbnN0YW50cy5pc1dTRExOYW1lc3BhY2UoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCSAgQXNzZXJ0LmFzc2VydEZhbHNlKCJUaGlzIHNob3VsZCBub3QgYmUgdGhlIFdTREwgTmFtZXNwYWNlIiwgaXNXU0RMTmFtZXNwYWNlKTsKLQkJICAKLQkJICBib29sZWFuIGlzTWF0Y2hpbmcgPSBXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UoImh0dHA6Ly93d3cuZXhhbXBsZS5vcmciLCAiaHR0cDovL3d3dy5leGFtcGxlLm9yZyIpOyAgCi0JCSAgQXNzZXJ0LmFzc2VydFRydWUoImlzTWF0Y2hpbmdOYW1lc3BhY2UgaXMgaW5jb3JyZWN0IiwgaXNNYXRjaGluZyk7Ci0JCSAgCi0JCSAgU3RyaW5nIGF0dHIgPSBXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShkZWZpbml0aW9uLmdldEVsZW1lbnQoKSwgIm5hbWUiKTsKLQkJICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiZ2V0QXR0cmlidXRlIGlzIGluY29ycmVjdCIsIGF0dHIuZXF1YWxzKCJMb2FkQW5kUHJpbnRUZXN0IikpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkgICAgewotCSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JICB9Ci0gIAotCSAgcHVibGljIHZvaWQgdGVzdFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkKLQkgIHsKLQkgICAgdHJ5Ci0JICAgIHsKLQkJICBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5SW1wbCA9IG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpOwotCQkgIFJlc291cmNlIHJlc291cmNlID0gZmFjdG9yeUltcGwuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZUZpbGVVUkkoIi4vc2FtcGxlcy9jcmVhdGVSZXNvdXJjZVRlc3Qud3NkbCIpKTsKLSAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUmVzb3VyY2UgaXMgbm90IG9mIHR5cGUgV1NETFJlc291cmNlSW1wbCIsIHJlc291cmNlIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgICB7Ci0JICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JICAgIH0gICAKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgdGVzdFdTRExSZXNvdXJjZUltcGwoKQotCSAgewotCSAgICB0cnkKLQkJewotCQkgIFdTRExSZXNvdXJjZUltcGwgcmVzb3VyY2VJbXBsID0gbmV3IFdTRExSZXNvdXJjZUltcGwoVVJJLmNyZWF0ZUZpbGVVUkkoIi4vc2FtcGxlcy9jcmVhdGVSZXNvdXJjZVRlc3Qud3NkbCIpKTsKLSAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUmVzb3VyY2UgaXMgbm90IG9mIHR5cGUgV1NETFJlc291cmNlSW1wbCIsIHJlc291cmNlSW1wbCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpOwotCQkgIAotCSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoUExVR0lOX0FCU09MVVRFX1BBVEggKyAic2FtcGxlcy9Mb2FkU3RvcmVDb21wYXJlL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotCSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRlZmluaXRpb24uZVJlc291cmNlKCkgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKTsKLQkJICBFbGVtZW50IGVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLQkJICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLQotCSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0JICAgICAgewotICAgICAgICAgIFdTRExSZXNvdXJjZUltcGwuc2VyaWFsaXplKFN5c3RlbS5vdXQsIGVsZW1lbnQsIG51bGwpOwotCSAgICAgIH0KLQkJICAKLQkJICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJICB7Ci0gICAgICAgIFdTRExSZXNvdXJjZUltcGwuc2VyaWFsaXplKFN5c3RlbS5vdXQsIGRvY3VtZW50LCBudWxsKTsKLQkJICB9Ci0JCSAgCi0JCSAgdHJ5Ci0JCSAgewotCQkgICAgcmVzb3VyY2VJbXBsLmF0dGFjaGVkKGRlZmluaXRpb24pOwotCQkgIH0KLQkJICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCSAgewotCi0JCSAgfQotCSAgCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCSAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gICAKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSgpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JCSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJKTsKLQkJICAgIGlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gZmFjdG9yeS5jcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSwgU09BUENvbnN0YW50cy5IRUFERVJfRUxFTUVOVF9UQUcpOwotICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvYmxlbSBjcmVhdGluZyBTT0FQIGV4dGVuc2liaWxpdHkgZWxlbWVudCIsIGVlIGluc3RhbmNlb2YgU09BUEhlYWRlcik7Ci0JCQl9Ci0JICAgIH0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCSAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gICAKLQkgIH0KLQkgIAotCSAgY2xhc3MgVGVzdEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLQkgIHsKLQkJU3RyaW5nIG5zLCBuYW1lOwotCQkKLQkJcHVibGljIFRlc3RFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbnMsIFN0cmluZyBuYW1lKQotCQl7Ci0JCSAgc3VwZXIoKTsKLQkJICB0aGlzLm5zID0gbnM7Ci0JCSAgdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0JCXsKLQkJICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLQkJICB7Ci0JCQllbGVtZW50VHlwZSA9IG5ldyBRTmFtZShucywgbmFtZSk7Ci0JCSAgfQotCSAgICAgIHJldHVybiBlbGVtZW50VHlwZTsKLQkJfQotCSAgfQotCSAgCi0JICBjbGFzcyBXU0RMVGVzdEZhY3RvcnkgaW1wbGVtZW50cyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLQkgIHsKLQkJcHVibGljIFdTRExUZXN0RmFjdG9yeSgpCi0JCXsKLQkJfQotCQkJCSAgCi0JCXB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotCQl7Ci0JCSAgcmV0dXJuIG5ldyBUZXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotCQl9Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7CQotCQkgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LnJlZ2lzdGVyRmFjdG9yeSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIiwgbmV3IFdTRExUZXN0RmFjdG9yeSgpKTsKLQkJCQotCQkJRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBXU0RMUGx1Z2luLklOU1RBTkNFLmdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIik7Ci0JCQlFeHRlbnNpYmlsaXR5RWxlbWVudCBlZSA9IGZhY3RvcnkuY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIsICJUZXN0RWxlbWVudCIpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIjEuIFByb2JsZW0gY3JlYXRpbmcgY3VzdG9tIFRlc3QgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IiwgZWUgaW5zdGFuY2VvZiBUZXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIjIuIFByb2JsZW0gY3JlYXRpbmcgY3VzdG9tIFRlc3QgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IiwgZWUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoIlRlc3RFbGVtZW50IikpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIjMuIFByb2JsZW0gY3JlYXRpbmcgY3VzdG9tIFRlc3QgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IiwgZWUuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpKTsKLQkJCQotCSAgICB9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9ICAgCi0JICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMNEpBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETDRKQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGRhOGZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMNEpBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuV1NETDRKRGVmaW5pdGlvblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMNEpBUElUZXN0IGV4dGVuZHMgV1NETDRKRGVmaW5pdGlvblZpc2l0b3IKLXsKLSAgcHJpdmF0ZSBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETFBsdWdpbi5JTlNUQU5DRS5jcmVhdGVXU0RMNEpGYWN0b3J5KCk7IAotICBwcml2YXRlIERlZmluaXRpb24gbmV3RGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBNZXNzYWdlIGN1cnJlbnRNZXNzYWdlOwotICBwcml2YXRlIFNlcnZpY2UgY3VycmVudFNlcnZpY2U7Ci0gIHByaXZhdGUgUG9ydFR5cGUgY3VycmVudFBvcnRUeXBlOwotICBwcml2YXRlIE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uOwotICBwcml2YXRlIEJpbmRpbmcgY3VycmVudEJpbmRpbmc7Ci0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBjdXJyZW50QmluZGluZ09wZXJhdGlvbjsKLSAgIAotICB7Ci0gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHBsdWdpbi54bWwKLSAgICAvLwotICAgIC8vICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5lbWYuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgLy8gICAgIDxwYXJzZXIgdHlwZT0id3NkbCIgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIvPgotICAgIC8vICAgPC9leHRlbnNpb24+Ci0gICAgLy8KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFdTREw0SkFQSVRlc3QoU3RyaW5nIG5hbWUpIAotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgKi8KLSAgcHVibGljIFdTREw0SkFQSVRlc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIoZGVmaW5pdGlvbik7Ci0gIH0KLS8qICAKLSAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCJ5ZXMiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCJVVEYtOCIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsIjQiKTsKLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZG9tU291cmNlLG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZVdTRExFbGVtZW50KFN0cmluZyBuYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsIixuYW1lKTsKLSAgICBpZiAod3NkbE5hbWVzcGFjZVByZWZpeCAhPSBudWxsKQotICAgICAgZWxlbWVudC5zZXRQcmVmaXgod3NkbE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAqLyAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0RG9jdW1lbnRhdGlvbihFbGVtZW50IGRvY0VsZW1lbnQpCi0gIHsKLSAgICBpZiAoZG9jRWxlbWVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIC8vcHJpbnRsbigiZG9jdW1lbnRhdGlvbjogIiArIGRvY0VsZW1lbnQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcHJpbnRsbihTdHJpbmcgcykKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgbmV3RGVmaW5pdGlvbiA9IGZhY3RvcnkubmV3RGVmaW5pdGlvbigpOwotICAgIG5ld0RlZmluaXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZGVmLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBuZXdEZWZpbml0aW9uLnNldFFOYW1lKGRlZi5nZXRRTmFtZSgpKTsgICAgCi0gICAgbmV3RGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICBuZXdEZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldE5hbWVzcGFjZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIG5ld0RlZmluaXRpb24uYWRkTmFtZXNwYWNlKHByZWZpeCxuYW1lc3BhY2UpOwotICAgIH0KLSAgICAKLSAgICBzdXBlci52aXNpdERlZmluaXRpb24oZGVmKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRJbXBvcnQoSW1wb3J0IHdzZGxJbXBvcnQpCi0gIHsKLSAgICBJbXBvcnQgbXlJbXBvcnQgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZUltcG9ydCgpOwotICAgIG5ld0RlZmluaXRpb24uYWRkSW1wb3J0KG15SW1wb3J0KTsKLSAgICAKLSAgICAvLyBlLmcuIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbSIgc2NoZW1hTG9jYXRpb249ICJiYXIueHNkIi8+Ci0gICAgbXlJbXBvcnQuc2V0TmFtZXNwYWNlVVJJKHdzZGxJbXBvcnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIG15SW1wb3J0LnNldExvY2F0aW9uVVJJKHdzZGxJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgbXlJbXBvcnQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQod3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBteUltcG9ydC5zZXREZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFR5cGVzKFR5cGVzIHR5cGVzKQotICB7Ci0gICAgVHlwZXMgbXlUeXBlcyA9IG5ld0RlZmluaXRpb24uY3JlYXRlVHlwZXMoKTsKLSAgICBteVR5cGVzLnNldERvY3VtZW50YXRpb25FbGVtZW50KHR5cGVzLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAvKgotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGVlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG15VHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZWUpOwotICAgIH0qLwotICAgIG5ld0RlZmluaXRpb24uc2V0VHlwZXMobXlUeXBlcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KQotICB7Ci0gICAgUGFydCBteVBhcnQgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZVBhcnQoKTsKLSAgICBteVBhcnQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQocGFydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBteVBhcnQuc2V0TmFtZShwYXJ0LmdldE5hbWUoKSk7Ci0gICAgbXlQYXJ0LnNldEVsZW1lbnROYW1lKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgbXlQYXJ0LnNldFR5cGVOYW1lKHBhcnQuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFFOYW1lIGtleSA9IG51bGw7Ci0gICAgUU5hbWUgdmFsdWUgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAga2V5ID0gKFFOYW1lKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZhbHVlID0gKFFOYW1lKXBhcnQuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKGtleSk7Ci0gICAgICBteVBhcnQuc2V0RXh0ZW5zaW9uQXR0cmlidXRlKGtleSx2YWx1ZSk7Ci0gICAgfQotICAgIGN1cnJlbnRNZXNzYWdlLmFkZFBhcnQobXlQYXJ0KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIGN1cnJlbnRNZXNzYWdlID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgc3VwZXIudmlzaXRNZXNzYWdlKG1lc3NhZ2UpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgY3VycmVudFBvcnRUeXBlID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVQb3J0VHlwZSgpOwotICAgIGN1cnJlbnRQb3J0VHlwZS5zZXREb2N1bWVudGF0aW9uRWxlbWVudChwb3J0VHlwZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBjdXJyZW50UG9ydFR5cGUuc2V0UU5hbWUocG9ydFR5cGUuZ2V0UU5hbWUoKSk7Ci0gICAgY3VycmVudFBvcnRUeXBlLnNldFVuZGVmaW5lZChwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKTsKLSAgICBuZXdEZWZpbml0aW9uLmFkZFBvcnRUeXBlKGN1cnJlbnRQb3J0VHlwZSk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBjdXJyZW50T3BlcmF0aW9uID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVPcGVyYXRpb24oKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldE5hbWUob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRTdHlsZShvcGVyYXRpb24uZ2V0U3R5bGUoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRVbmRlZmluZWQob3BlcmF0aW9uLmlzVW5kZWZpbmVkKCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0UGFyYW1ldGVyT3JkZXJpbmcob3BlcmF0aW9uLmdldFBhcmFtZXRlck9yZGVyaW5nKCkpOwotICAgIGN1cnJlbnRQb3J0VHlwZS5hZGRPcGVyYXRpb24oY3VycmVudE9wZXJhdGlvbik7Ci0gICAKLSAgICBzdXBlci52aXNpdE9wZXJhdGlvbihvcGVyYXRpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KQotICB7Ci0gICAgSW5wdXQgbXlJbnB1dCA9IG5ld0RlZmluaXRpb24uY3JlYXRlSW5wdXQoKTsKLSAgICBteUlucHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGlucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBteUlucHV0LnNldE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLSAgICBteUlucHV0LnNldE1lc3NhZ2UoaW5wdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldElucHV0KG15SW5wdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIE91dHB1dCBteU91dHB1dCA9IG5ld0RlZmluaXRpb24uY3JlYXRlT3V0cHV0KCk7Ci0gICAgbXlPdXRwdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15T3V0cHV0LnNldE5hbWUob3V0cHV0LmdldE5hbWUoKSk7Ci0gICAgbXlPdXRwdXQuc2V0TWVzc2FnZShvdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldE91dHB1dChteU91dHB1dCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KQotICB7Ci0gICAgRmF1bHQgbXlGYXVsdCA9IG5ld0RlZmluaXRpb24uY3JlYXRlRmF1bHQoKTsKLSAgICBteUZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15RmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotICAgIG15RmF1bHQuc2V0TWVzc2FnZShmYXVsdC5nZXRNZXNzYWdlKCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uYWRkRmF1bHQobXlGYXVsdCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgY3VycmVudEJpbmRpbmcgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICBuZXdEZWZpbml0aW9uLmFkZEJpbmRpbmcoY3VycmVudEJpbmRpbmcpOwotICAgIAotICAgIGN1cnJlbnRCaW5kaW5nLnNldERvY3VtZW50YXRpb25FbGVtZW50KGJpbmRpbmcuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgIAotICAgIGN1cnJlbnRCaW5kaW5nLnNldFFOYW1lKGJpbmRpbmcuZ2V0UU5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmcuc2V0UG9ydFR5cGUoYmluZGluZy5nZXRQb3J0VHlwZSgpKTsKLSAgICBjdXJyZW50QmluZGluZy5zZXRVbmRlZmluZWQoYmluZGluZy5pc1VuZGVmaW5lZCgpKTsKLQotICAgIHN1cGVyLnZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoYmluZGluZ09wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmcuYWRkQmluZGluZ09wZXJhdGlvbihjdXJyZW50QmluZGluZ09wZXJhdGlvbik7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBpbnB1dCkKLSAgewotICAgIEJpbmRpbmdJbnB1dCBteUlucHV0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBteUlucHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGlucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBteUlucHV0LnNldE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQobXlJbnB1dCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nSW5wdXQoaW5wdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0IG15T3V0cHV0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgbXlPdXRwdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15T3V0cHV0LnNldE5hbWUob3V0cHV0LmdldE5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChteU91dHB1dCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3V0cHV0KG91dHB1dCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBmYXVsdCkKLSAgewotICAgIEJpbmRpbmdGYXVsdCBteUZhdWx0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICBteUZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15RmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChteUZhdWx0KTsKLSAgICAKLSAgICBzdXBlci52aXNpdEJpbmRpbmdGYXVsdChmYXVsdCk7IAotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBjdXJyZW50U2VydmljZSA9IG5ld0RlZmluaXRpb24uY3JlYXRlU2VydmljZSgpOwotICAgIGN1cnJlbnRTZXJ2aWNlLnNldERvY3VtZW50YXRpb25FbGVtZW50KHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgCi0gICAgY3VycmVudFNlcnZpY2Uuc2V0UU5hbWUoc2VydmljZS5nZXRRTmFtZSgpKTsKLSAgICBuZXdEZWZpbml0aW9uLmFkZFNlcnZpY2UoY3VycmVudFNlcnZpY2UpOwotICAgIAotICAgIHN1cGVyLnZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIFBvcnQgbXlQb3J0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVQb3J0KCk7Ci0gICAgbXlQb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgbXlQb3J0LnNldE5hbWUocG9ydC5nZXROYW1lKCkpOwotICAgIG15UG9ydC5zZXRCaW5kaW5nKHBvcnQuZ2V0QmluZGluZygpKTsKLSAgICBjdXJyZW50U2VydmljZS5hZGRQb3J0KG15UG9ydCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRQb3J0KHBvcnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgdmlzaXRTT0FQQm9keSgoU09BUEJvZHkpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICB2aXNpdFNPQVBCaW5kaW5nKChTT0FQQmluZGluZylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgIHZpc2l0U09BUEFkZHJlc3MoKFNPQVBBZGRyZXNzKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB2aXNpdFNPQVBPcGVyYXRpb24oKFNPQVBPcGVyYXRpb24pZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICB9Ci0gCi0gIC8vIE5lZWQgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBPcGVyYXRpb25WaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uKQotICB7Ci0gICAgc29hcE9wZXJhdGlvblZpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBPcGVyYXRpb24uLi4iKTsKLSAgICBwcmludGxuKCJzb2FwQWN0aW9uOiAiICsgc29hcE9wZXJhdGlvbi5nZXRTb2FwQWN0aW9uVVJJKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUE9wZXJhdGlvbi4uLiIpOwotICB9Ci0gIAotICAvL05lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQm9keVZpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEJvZHkoU09BUEJvZHkgc29hcEJvZHkpCi0gIHsKLSAgICBzb2FwQm9keVZpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBCb2R5Li4uIik7Ci0gICAgcHJpbnRsbigidXNlOiAiICsgc29hcEJvZHkuZ2V0VXNlKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUEJvZHkuLi4iKTsKLSAgfQotICAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcEJpbmRpbmdWaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBCaW5kaW5nKFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nKQotICB7Ci0gICAgc29hcEJpbmRpbmdWaXNpdGVkID0gdHJ1ZTsKLSAgICBwcmludGxuKCJWaXNpdGluZyBTT0FQQmluZGluZy4uLiIpOwotICAgIHByaW50bG4oInN0eWxlOiAiICsgc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSk7Ci0gICAgcHJpbnRsbigidHJhbnNwb3J0OiAiICsgc29hcEJpbmRpbmcuZ2V0VHJhbnNwb3J0VVJJKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUEJpbmRpbmcuLi4iKTsgIAotICB9Ci0gCi0gIC8vIE5lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQWRkcmVzc1Zpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEFkZHJlc3MoU09BUEFkZHJlc3Mgc29hcEFkZHJlc3MpCi0gIHsKLSAgICBzb2FwQWRkcmVzc1Zpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBBZGRyZXNzLi4uIik7Ci0gICAgcHJpbnRsbigibG9jYXRpb246ICIgKyBzb2FwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIFNPQVBBZGRyZXNzLi4uIik7IAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IFdTREw0SkFQSVRlc3QoIk1vZGVsU2VtYW50aWNUZXN0IikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RNb2RlbFNlbWFudGljKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICApOwotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1vZGVsU2VtYW50aWMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBsb2FkRGVmaW5pdGlvbkZvcldTREw0SigiLi9zYW1wbGVzL0xvYWRTdG9yZUNvbXBhcmUvTG9hZEFuZFByaW50VGVzdC53c2RsIik7Ci0gICAgICBXU0RMNEpBUElUZXN0IHRlc3QgPSBuZXcgV1NETDRKQVBJVGVzdChkZWYpOwotICAgICAgdGVzdC52aXNpdCgpOwotICAgICAgc2VyaWFsaXplKHRlc3QubmV3RGVmaW5pdGlvbiwiLi9zYW1wbGVzL0Nsb25lZExvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIEFzc2VydC5mYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShEZWZpbml0aW9uIGRlZiwgU3RyaW5nIGNsb25lZEZpbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFdTRExXcml0ZXIgd3JpdGVyID0gZmFjdG9yeS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgSVBsdWdpbkRlc2NyaXB0b3IgcGQgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIik7Ci0gICAgVVJMIHVybCA9IHBkLmdldEluc3RhbGxVUkwoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbih1cmwudG9TdHJpbmcoKSk7Ci0gICAgdXJsID0gbmV3IFVSTCh1cmwsY2xvbmVkRmlsZSk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odXJsLnRvU3RyaW5nKCkpOwotICAgIC8vU3RyaW5nIHMgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0RmlsZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKFBsYXRmb3JtLmdldEluc3RhbmNlTG9jYXRpb24oKS5nZXRVUkwoKS50b1N0cmluZygpKTsKLSAgICAvL1N0cmluZyBzID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0gICAgLy93cml0ZXIud3JpdGVXU0RMKGRlZixuZXcgRmlsZU91dHB1dFN0cmVhbShzKSk7Ci0gIH0gIAotICAKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGxvYWREZWZpbml0aW9uRm9yV1NETDRKKFN0cmluZyB3c2RsRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7ICAgIAotICAgIFdTRExSZWFkZXIgcmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgSVBsdWdpbkRlc2NyaXB0b3IgcGQgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIik7Ci0gICAgVVJMIHVybCA9IHBkLmdldEluc3RhbGxVUkwoKTsKLSAgICB1cmwgPSBuZXcgVVJMKHVybCx3c2RsRmlsZSk7Ci0gICAgU3RyaW5nIHMgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0RmlsZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJsb2FkaW5nICIgKyBzKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSByZWFkZXIucmVhZFdTREwocyxuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShzKSkpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9ICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMRU1GQVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1dTRExFTUZBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MTQ2NmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1dTRExFTUZBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvbkxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIFdTRExFTUZBUElUZXN0IGV4dGVuZHMgRGVmaW5pdGlvblZpc2l0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgUExVR0lOX0FCU09MVVRFX1BBVEggPSBXU0RMVGVzdHNQbHVnaW4uZ2V0SW5zdGFsbFVSTCgpOwotICBwcml2YXRlIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0U7Ci0gIAotICBEZWZpbml0aW9uIG5ld0RlZmluaXRpb247Ci0gIHByaXZhdGUgTWVzc2FnZSBjdXJyZW50TWVzc2FnZTsKLSAgcHJpdmF0ZSBTZXJ2aWNlIGN1cnJlbnRTZXJ2aWNlOwotICBwcml2YXRlIFBvcnRUeXBlIGN1cnJlbnRQb3J0VHlwZTsKLSAgcHJpdmF0ZSBPcGVyYXRpb24gY3VycmVudE9wZXJhdGlvbjsKLSAgcHJpdmF0ZSBCaW5kaW5nIGN1cnJlbnRCaW5kaW5nOwotICBwcml2YXRlIEJpbmRpbmdPcGVyYXRpb24gY3VycmVudEJpbmRpbmdPcGVyYXRpb247Ci0gIHByaXZhdGUgRXh0ZW5zaWJsZUVsZW1lbnQgY3VycmVudEV4dGVuc2libGVFbGVtZW50OwotICAgCi0gIHsKLSAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgcGx1Z2luLnhtbAotICAgIC8vCi0gICAgLy8gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLmVtZi5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAvLyAgICAgPHBhcnNlciB0eXBlPSJ3c2RsIiBjbGFzcz0iY29tLmlibS5ldG9vbHMud3NkbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsIi8+Ci0gICAgLy8gICA8L2V4dGVuc2lvbj4KLSAgICAvLwotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLSAgCi0gIC8vIEFkZGVkIGZvciBKVW5pdAotICBwdWJsaWMgV1NETEVNRkFQSVRlc3QoU3RyaW5nIG5hbWUpIAotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgKi8KLSAgcHVibGljIFdTRExFTUZBUElUZXN0KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGRlZmluaXRpb24pOwotICB9Ci0vKiAgCi0gIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBTb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwieWVzIik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywiVVRGLTgiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCI0Iik7Ci0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGRvbVNvdXJjZSxuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY3JlYXRlRG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBjcmVhdGVXU0RMRWxlbWVudChTdHJpbmcgbmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbCIsbmFtZSk7Ci0gICAgaWYgKHdzZGxOYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQuc2V0UHJlZml4KHdzZGxOYW1lc3BhY2VQcmVmaXgpOwotICAgIAotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gKi8gCi0gIHByaXZhdGUgdm9pZCB2aXNpdERvY3VtZW50YXRpb24oRWxlbWVudCBkb2NFbGVtZW50KQotICB7Ci0gICAgaWYgKGRvY0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwcmludGxuKCJkb2N1bWVudGF0aW9uOiAiICsgZG9jRWxlbWVudCk7IC8vIFRCRCAtIHNlcmlhbGl6ZSBkb2NFbGVtZW50Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBwcmludGxuKFN0cmluZyBzKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHMpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICAvLyBVc2UgV1NETEVsZW1lbnQgdG8gaW5jcmVhc2UgdGhlIEFQSSBjb3ZlcmFnZSBpbiB0aGUgcmVwb3J0cwotICAgIFdTRExFbGVtZW50IHJvb3QgPSBmYWN0b3J5LmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICBuZXdEZWZpbml0aW9uID0gKERlZmluaXRpb24pcm9vdDsKLSAgICAKLSAgICByb290LnNldERvY3VtZW50YXRpb25FbGVtZW50KGRlZi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICByb290LmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgcm9vdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICAgIHJvb3QuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIHJvb3QuZ2V0Q29udGFpbmVyKCk7Ci0gICAgCi0gICAgbmV3RGVmaW5pdGlvbi5zZXRRTmFtZShkZWYuZ2V0UU5hbWUoKSk7ICAgIAotICAgIG5ld0RlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgbmV3RGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkoZGVmLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICBuZXdEZWZpbml0aW9uLnNldExvY2F0aW9uKGRlZi5nZXRMb2NhdGlvbigpKTsKLSAgICBuZXdEZWZpbml0aW9uLnNldEVuY29kaW5nKGRlZi5nZXRFbmNvZGluZygpKTsKLSAgICAKLSAgICAvLyBnZXRFTmFtZXNwYWNlcyBkb2VzIG5vdCB3b3JrLgotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldEVOYW1lc3BhY2VzKCkuaXRlcmF0b3IoKTsKLSAgICBOYW1lc3BhY2UgbnMgPSBudWxsOyAgIAotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyB1cmkgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgbnMgPSBmYWN0b3J5LmNyZWF0ZU5hbWVzcGFjZSgpOwotICAgICAgcHJlZml4ID0gKChOYW1lc3BhY2UpaXRlcmF0b3IubmV4dCgpKS5nZXRQcmVmaXgoKTsKLSAgICAgIHVyaSA9ICgoTmFtZXNwYWNlKWl0ZXJhdG9yLm5leHQoKSkuZ2V0VVJJKCk7Ci0gICAgICBucy5zZXRVUkkodXJpKTsKLSAgICAgIG5zLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgbmV3RGVmaW5pdGlvbi5nZXRFTmFtZXNwYWNlcygpLmFkZChucyk7Ci0gICAgfQotICAgIAotICAgIGl0ZXJhdG9yID0gZGVmLmdldE5hbWVzcGFjZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIHByZWZpeCA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0KLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHByZWZpeCA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotICAgICAgbmFtZXNwYWNlID0gZGVmLmdldE5hbWVzcGFjZShwcmVmaXgpOwotICAgICAgbmV3RGVmaW5pdGlvbi5hZGROYW1lc3BhY2UocHJlZml4LG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIC8vbmV3RGVmaW5pdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gICAgCi0gICAgY3VycmVudEV4dGVuc2libGVFbGVtZW50ID0gZGVmOwotICAgIHN1cGVyLnZpc2l0RGVmaW5pdGlvbihkZWYpOwotICAgIAotICAgIHJvb3Quc2V0RWxlbWVudChudWxsKTsKLSAgICByb290LnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgcm9vdC5nZXRFbGVtZW50KCk7Ci0gICAgcm9vdC5zZXRFbGVtZW50KG51bGwpOwotICAgIHJvb3QudXBkYXRlRWxlbWVudCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCkKLSAgewotICAgIEltcG9ydCBteUltcG9ydCA9IGZhY3RvcnkuY3JlYXRlSW1wb3J0KCk7Ci0gICAgbmV3RGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLmFkZChteUltcG9ydCk7Ci0gICAgCi0gICAgLy8gZS5nLiA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2Zvby5jb20iIHNjaGVtYUxvY2F0aW9uPSAiYmFyLnhzZCIvPgotICAgIG15SW1wb3J0LnNldE5hbWVzcGFjZVVSSSh3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBteUltcG9ydC5zZXRMb2NhdGlvblVSSSh3c2RsSW1wb3J0LmdldExvY2F0aW9uVVJJKCkpOwotICAgIG15SW1wb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHdzZGxJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgbXlJbXBvcnQuc2V0RURlZmluaXRpb24od3NkbEltcG9ydC5nZXRFRGVmaW5pdGlvbigpKTsKLSAgICBteUltcG9ydC5zZXRFU2NoZW1hKHdzZGxJbXBvcnQuZ2V0RVNjaGVtYSgpKTsKLSAgICBteUltcG9ydC5zZXRTY2hlbWEod3NkbEltcG9ydC5nZXRTY2hlbWEoKSk7Ci0gICAgbXlJbXBvcnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcykKLSAgewotICAgIFR5cGVzIG15VHlwZXMgPSBmYWN0b3J5LmNyZWF0ZVR5cGVzKCk7Ci0gICAgbXlUeXBlcy5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0eXBlcy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gbnVsbDsKLSAgICB0eXBlcy5nZXRTY2hlbWFzKCJodHRwOi8vdGVtcHVyaS5vcmcvTG9hZEFuZFByaW50VGVzdC8iKTsKLSAgICAKLSAgICBjdXJyZW50RXh0ZW5zaWJsZUVsZW1lbnQgPSBteVR5cGVzOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChlZSk7Ci0gICAgfQotICAgIAotICAgIG15VHlwZXMuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgICBuZXdEZWZpbml0aW9uLmdldEVUeXBlcygpOwotICAgIG5ld0RlZmluaXRpb24uc2V0RVR5cGVzKG15VHlwZXMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIFBhcnQgbXlQYXJ0ID0gZmFjdG9yeS5jcmVhdGVQYXJ0KCk7Ci0gICAgbXlQYXJ0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHBhcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgbXlQYXJ0LnNldE5hbWUocGFydC5nZXROYW1lKCkpOwotICAgIG15UGFydC5zZXRFbGVtZW50TmFtZShwYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgIG15UGFydC5zZXRUeXBlTmFtZShwYXJ0LmdldFR5cGVOYW1lKCkpOwotICAgIG15UGFydC5zZXRFTWVzc2FnZShwYXJ0LmdldEVNZXNzYWdlKCkpOwotICAgIG15UGFydC5zZXRFbGVtZW50RGVjbGFyYXRpb24ocGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgbXlQYXJ0LnNldFR5cGVEZWZpbml0aW9uKHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFFOYW1lIGtleSA9IG51bGw7Ci0gICAgUU5hbWUgdmFsdWUgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAga2V5ID0gKFFOYW1lKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZhbHVlID0gKFFOYW1lKXBhcnQuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKGtleSk7Ci0gICAgICBteVBhcnQuc2V0RXh0ZW5zaW9uQXR0cmlidXRlKGtleSx2YWx1ZSk7Ci0gICAgfQotICAgIGN1cnJlbnRNZXNzYWdlLnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgY3VycmVudE1lc3NhZ2UuYWRkUGFydChteVBhcnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIGN1cnJlbnRQb3J0VHlwZSA9IGZhY3RvcnkuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICBjdXJyZW50UG9ydFR5cGUuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQocG9ydFR5cGUuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgY3VycmVudFBvcnRUeXBlLnNldFFOYW1lKHBvcnRUeXBlLmdldFFOYW1lKCkpOwotICAgIGN1cnJlbnRQb3J0VHlwZS5zZXRVbmRlZmluZWQocG9ydFR5cGUuaXNVbmRlZmluZWQoKSk7Ci0gICAgCi0gICAgY3VycmVudFBvcnRUeXBlLnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgbmV3RGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkuYWRkKGN1cnJlbnRQb3J0VHlwZSk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBjdXJyZW50T3BlcmF0aW9uID0gZmFjdG9yeS5jcmVhdGVPcGVyYXRpb24oKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldE5hbWUob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRTdHlsZShvcGVyYXRpb24uZ2V0U3R5bGUoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRVbmRlZmluZWQob3BlcmF0aW9uLmlzVW5kZWZpbmVkKCkpOwotICAgIG9wZXJhdGlvbi5nZXRFUGFyYW1ldGVyT3JkZXJpbmcoKTsgLy8gVEJECi0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICAgIGN1cnJlbnRQb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLmFkZChjdXJyZW50T3BlcmF0aW9uKTsKLSAgIAotICAgIHN1cGVyLnZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIk9wZXJhdGlvbiBUeXBlIGlzOiAiICsgb3BlcmF0aW9uLmdldFN0eWxlKCkpOwotICAgIC8vb3BlcmF0aW9uLnNldFN0eWxlKE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIk9wZXJhdGlvbiBUeXBlIGlzOiAiICsgb3BlcmF0aW9uLmdldFN0eWxlKCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgY3VycmVudE1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBjdXJyZW50TWVzc2FnZS5zZXRRTmFtZShtZXNzYWdlLmdldFFOYW1lKCkpOwotICAgIGN1cnJlbnRNZXNzYWdlLnNldFVuZGVmaW5lZChtZXNzYWdlLmlzVW5kZWZpbmVkKCkpOwotICAgIG5ld0RlZmluaXRpb24uYWRkTWVzc2FnZShjdXJyZW50TWVzc2FnZSk7Ci0KLSAgICBzdXBlci52aXNpdE1lc3NhZ2UobWVzc2FnZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBNZXNzYWdlUmVmZXJlbmNlIG15SW5wdXQgPSBmYWN0b3J5LmNyZWF0ZUlucHV0KCk7Ci0gICAgbXlJbnB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAgCi0gICAgbXlJbnB1dC5zZXROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gICAgbXlJbnB1dC5nZXROYW1lKCk7Ci0gICAgbXlJbnB1dC5zZXRFTWVzc2FnZShpbnB1dC5nZXRFTWVzc2FnZSgpKTsKLSAgICBteUlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRFSW5wdXQoKElucHV0KW15SW5wdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIE91dHB1dCBteU91dHB1dCA9IGZhY3RvcnkuY3JlYXRlT3V0cHV0KCk7Ci0gICAgbXlPdXRwdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15T3V0cHV0LnNldE5hbWUob3V0cHV0LmdldE5hbWUoKSk7Ci0gICAgbXlPdXRwdXQuc2V0RU1lc3NhZ2Uob3V0cHV0LmdldEVNZXNzYWdlKCkpOwotICAgIG15T3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRFT3V0cHV0KG15T3V0cHV0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBGYXVsdCBteUZhdWx0ID0gZmFjdG9yeS5jcmVhdGVGYXVsdCgpOwotICAgIG15RmF1bHQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZmF1bHQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgCi0gICAgbXlGYXVsdC5zZXROYW1lKGZhdWx0LmdldE5hbWUoKSk7Ci0gICAgbXlGYXVsdC5zZXRFTWVzc2FnZShmYXVsdC5nZXRFTWVzc2FnZSgpKTsKLSAgICBteUZhdWx0LnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuYWRkKG15RmF1bHQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgbmV3RGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKS5hZGQoY3VycmVudEJpbmRpbmcpOwotICAgIAotICAgIGN1cnJlbnRCaW5kaW5nLnNldERvY3VtZW50YXRpb25FbGVtZW50KGJpbmRpbmcuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgIAotICAgIGN1cnJlbnRCaW5kaW5nLnNldFFOYW1lKGJpbmRpbmcuZ2V0UU5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmcuc2V0RVBvcnRUeXBlKGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldFVuZGVmaW5lZChiaW5kaW5nLmlzVW5kZWZpbmVkKCkpOwotCi0gICAgY3VycmVudEV4dGVuc2libGVFbGVtZW50ID0gY3VycmVudEJpbmRpbmc7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24gPSBmYWN0b3J5LmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChiaW5kaW5nT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldEVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRFT3BlcmF0aW9uKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldE5hbWUoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuYWRkKGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAKLSAgICBjdXJyZW50RXh0ZW5zaWJsZUVsZW1lbnQgPSBjdXJyZW50QmluZGluZ09wZXJhdGlvbjsKLSAgICBzdXBlci52aXNpdEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgIAotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBpbnB1dCkKLSAgewotICAgIEJpbmRpbmdJbnB1dCBteUlucHV0ID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBteUlucHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGlucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBteUlucHV0LnNldE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLSAgICBteUlucHV0LnNldElucHV0KGlucHV0LmdldElucHV0KCkpOwotICAgIG15SW5wdXQuc2V0RUlucHV0KGlucHV0LmdldEVJbnB1dCgpKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRFQmluZGluZ0lucHV0KG15SW5wdXQpOwotIAotICAgIGN1cnJlbnRFeHRlbnNpYmxlRWxlbWVudCA9IG15SW5wdXQ7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nSW5wdXQoaW5wdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0IG15T3V0cHV0ID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgbXlPdXRwdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15T3V0cHV0LnNldE5hbWUob3V0cHV0LmdldE5hbWUoKSk7Ci0gICAgbXlPdXRwdXQuc2V0T3V0cHV0KG91dHB1dC5nZXRPdXRwdXQoKSk7Ci0gICAgbXlPdXRwdXQuc2V0RU91dHB1dChvdXRwdXQuZ2V0RU91dHB1dCgpKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRFQmluZGluZ091dHB1dChteU91dHB1dCk7Ci0gICAgCi0gICAgY3VycmVudEV4dGVuc2libGVFbGVtZW50ID0gbXlPdXRwdXQ7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3V0cHV0KG91dHB1dCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBmYXVsdCkKLSAgewotICAgIEJpbmRpbmdGYXVsdCBteUZhdWx0ID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICBteUZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15RmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotICAgIG15RmF1bHQuc2V0RUZhdWx0KGZhdWx0LmdldEVGYXVsdCgpKTsKLSAgICBteUZhdWx0LnNldEZhdWx0KGZhdWx0LmdldEZhdWx0KCkpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkuYWRkKG15RmF1bHQpOwotICAgIAotICAgIGN1cnJlbnRFeHRlbnNpYmxlRWxlbWVudCA9IG15RmF1bHQ7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBjdXJyZW50U2VydmljZSA9IGZhY3RvcnkuY3JlYXRlU2VydmljZSgpOwotICAgIGN1cnJlbnRTZXJ2aWNlLnNldERvY3VtZW50YXRpb25FbGVtZW50KHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgCi0gICAgY3VycmVudFNlcnZpY2Uuc2V0UU5hbWUoc2VydmljZS5nZXRRTmFtZSgpKTsKLSAgICBjdXJyZW50U2VydmljZS5zZXRVbmRlZmluZWQoc2VydmljZS5pc1VuZGVmaW5lZCgpKTsKLSAgICAKLSAgICBuZXdEZWZpbml0aW9uLmdldEVTZXJ2aWNlcygpLmFkZChjdXJyZW50U2VydmljZSk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRTZXJ2aWNlKHNlcnZpY2UpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgUG9ydCBteVBvcnQgPSBmYWN0b3J5LmNyZWF0ZVBvcnQoKTsKLSAgICBteVBvcnQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQocG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBteVBvcnQuc2V0TmFtZShwb3J0LmdldE5hbWUoKSk7Ci0gICAgbXlQb3J0LnNldEVCaW5kaW5nKHBvcnQuZ2V0RUJpbmRpbmcoKSk7Ci0gICAgCi0gICAgY3VycmVudFNlcnZpY2UuZ2V0RVBvcnRzKCkuYWRkKG15UG9ydCk7Ci0gICAgCi0gICAgY3VycmVudEV4dGVuc2libGVFbGVtZW50ID0gbXlQb3J0OwotICAgIHN1cGVyLnZpc2l0UG9ydChwb3J0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJsZUVsZW1lbnQgb3duZXIsIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50KQotICB7Ci0gICAgLy8gVG8gbW92ZSB1cCB0aGUgQVBJIHRlc3QgY292ZXJhZ2UKLSAgICBvd25lci5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgb3duZXIuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgZmFjdG9yeS5jcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIFdTRExQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0gICAgV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKTsKLSAgICAKLSAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gIHsKLSAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCB4c2VlID0gbnVsbDsKLSAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdWVlID0gbnVsbDsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBteUVFID0gbnVsbDsKLSAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBteUVFID0gZmFjdG9yeS5jcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgeHNlZSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudClteUVFOwotICAgICAgeHNlZS5zZXRTY2hlbWEoKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudClleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0U2NoZW1hKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbXlFRSA9IGZhY3RvcnkuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICB1ZWUgPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KW15RUU7Ci0gICAgICB1ZWUuZ2V0Q2hpbGRyZW4oKTsgLy8gVEJECi0gICAgfQotICAgIG15RUUuc2V0RWxlbWVudFR5cGUoZXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSk7Ci0gICAgbXlFRS5zZXRSZXF1aXJlZChleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRSZXF1aXJlZCgpKTsKLSAgICBteUVFLnNldFJlcXVpcmVkKGV4dGVuc2liaWxpdHlFbGVtZW50LmlzUmVxdWlyZWQoKSk7Ci0gICAgaWYgKGN1cnJlbnRFeHRlbnNpYmxlRWxlbWVudCAhPSBudWxsKQotICAgICAgY3VycmVudEV4dGVuc2libGVFbGVtZW50LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KG15RUUpOwotICAgIAotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgdmlzaXRTT0FQQm9keSgoU09BUEJvZHkpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICB2aXNpdFNPQVBCaW5kaW5nKChTT0FQQmluZGluZylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgIHZpc2l0U09BUEFkZHJlc3MoKFNPQVBBZGRyZXNzKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB2aXNpdFNPQVBPcGVyYXRpb24oKFNPQVBPcGVyYXRpb24pZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEZhdWx0KQotICAgICAgdmlzaXRTT0FQRmF1bHQoKFNPQVBGYXVsdClleHRlbnNpYmlsaXR5RWxlbWVudCk7ICAKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpCi0gICAgICB2aXNpdFNPQVBIZWFkZXIoKFNPQVBIZWFkZXIpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEhlYWRlckZhdWx0KQotICAgICAgdmlzaXRTT0FQSGVhZGVyRmF1bHQoKFNPQVBIZWFkZXJGYXVsdClleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gIH0KLQotIAotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQRmF1bHQoU09BUEZhdWx0IHNvYXBGYXVsdCkKLSAgewotICAgIFNPQVBGYXVsdCBteVNvYXBGYXVsdCA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQRmF1bHQoKTsKLSAgICBteVNvYXBGYXVsdC5zZXRFbmNvZGluZ1N0eWxlcyhzb2FwRmF1bHQuZ2V0RW5jb2RpbmdTdHlsZXMoKSk7Ci0gICAgbXlTb2FwRmF1bHQuc2V0TmFtZShzb2FwRmF1bHQuZ2V0TmFtZSgpKTsKLSAgICBteVNvYXBGYXVsdC5zZXROYW1lc3BhY2VVUkkoc29hcEZhdWx0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBteVNvYXBGYXVsdC5zZXRVc2Uoc29hcEZhdWx0LmdldFVzZSgpKTsKLSAgfSAKLSAgCi0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBIZWFkZXIoU09BUEhlYWRlciBzb2FwSGVhZGVyKQotICB7Ci0gICAgLy8gVXNlIFNPQVBIZWFkZXJCYXNlIHRvIGluY3JlYXNlIHRoZSBBUEkgY292ZXJhZ2UgdmFsdWVzIGluIHRoZSByZXBvcnRzCi0gICAgCi0gICAgU09BUEhlYWRlckJhc2UgeW91clNvYXBIZWFkZXIgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlckJhc2UoKTsKLSAgICB5b3VyU29hcEhlYWRlci5nZXRFbmNvZGluZ1N0eWxlcygpOwotICAgIAotICAgIFNPQVBIZWFkZXJCYXNlIG15U29hcEhlYWRlciA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyKCk7Ci0gICAgbXlTb2FwSGVhZGVyLnNldE1lc3NhZ2Uoc29hcEhlYWRlci5nZXRNZXNzYWdlKCkpOwotICAgIG15U29hcEhlYWRlci5nZXRNZXNzYWdlKCk7Ci0gICAgbXlTb2FwSGVhZGVyLnNldFBhcnQoc29hcEhlYWRlci5nZXRQYXJ0KCkpOwotICAgIG15U29hcEhlYWRlci5nZXRQYXJ0KCk7Ci0gICAgbXlTb2FwSGVhZGVyLnNldE5hbWVzcGFjZVVSSShzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBteVNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgbXlTb2FwSGVhZGVyLnNldFVzZShzb2FwSGVhZGVyLmdldFVzZSgpKTsKLSAgICBteVNvYXBIZWFkZXIuZ2V0VXNlKCk7Ci0gICAgKChTT0FQSGVhZGVyKXNvYXBIZWFkZXIpLmdldEhlYWRlckZhdWx0cygpOyAvLyBUQkQKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEhlYWRlckZhdWx0KFNPQVBIZWFkZXJGYXVsdCBzb2FwSGVhZGVyRmF1bHQpCi0gIHsKLSAgICBTT0FQSGVhZGVyRmF1bHQgbXlTb2FwSGVhZGVyRmF1bHQgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlckZhdWx0KCk7Ci0gICAgbXlTb2FwSGVhZGVyRmF1bHQuc2V0TWVzc2FnZShzb2FwSGVhZGVyRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICBteVNvYXBIZWFkZXJGYXVsdC5zZXRQYXJ0KHNvYXBIZWFkZXJGYXVsdC5nZXRQYXJ0KCkpOwotICAgIG15U29hcEhlYWRlckZhdWx0LnNldE5hbWVzcGFjZVVSSShzb2FwSGVhZGVyRmF1bHQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIG15U29hcEhlYWRlckZhdWx0LnNldFVzZShzb2FwSGVhZGVyRmF1bHQuZ2V0VXNlKCkpOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gc29hcE9wZXJhdGlvblZpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24pCi0gIHsKLSAgICBzb2FwT3BlcmF0aW9uVmlzaXRlZCA9IHRydWU7Ci0gICAgU09BUE9wZXJhdGlvbiBteVNvYXBPcGVyYXRpb24gPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUE9wZXJhdGlvbigpOwotICAgIG15U29hcE9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uVVJJKHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpKTsKLSAgICBteVNvYXBPcGVyYXRpb24uc2V0U3R5bGUoc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpKTsKLSAgfQotICAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcEJvZHlWaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBCb2R5KFNPQVBCb2R5IHNvYXBCb2R5KQotICB7Ci0gICAgc29hcEJvZHlWaXNpdGVkID0gdHJ1ZTsKLSAgICBTT0FQQm9keSBteVNvYXBCb2R5ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgbXlTb2FwQm9keS5zZXRFbmNvZGluZ1N0eWxlcyhzb2FwQm9keS5nZXRFbmNvZGluZ1N0eWxlcygpKTsKLSAgICBteVNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSShzb2FwQm9keS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgbXlTb2FwQm9keS5zZXRQYXJ0cyhzb2FwQm9keS5nZXRQYXJ0cygpKTsKLSAgICBteVNvYXBCb2R5LnNldFVzZShzb2FwQm9keS5nZXRVc2UoKSk7Ci0gIH0KLSAgCi0gIC8vTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBCaW5kaW5nVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQmluZGluZyhTT0FQQmluZGluZyBzb2FwQmluZGluZykKLSAgewotICAgIHNvYXBCaW5kaW5nVmlzaXRlZCA9IHRydWU7Ci0gICAgU09BUEJpbmRpbmcgbXlTb2FwQmluZGluZyA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQmluZGluZygpOwotICAgIG15U29hcEJpbmRpbmcuc2V0U3R5bGUoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSk7Ci0gICAgbXlTb2FwQmluZGluZy5zZXRUcmFuc3BvcnRVUkkoc29hcEJpbmRpbmcuZ2V0VHJhbnNwb3J0VVJJKCkpOyAKLSAgfQotIAotICAvLyBOZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcEFkZHJlc3NWaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBBZGRyZXNzKFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzKQotICB7Ci0gICAgc29hcEFkZHJlc3NWaXNpdGVkID0gdHJ1ZTsKLSAgICBTT0FQQWRkcmVzcyBteVNvYXBBZGRyZXNzID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBBZGRyZXNzKCk7Ci0gICAgbXlTb2FwQWRkcmVzcy5zZXRMb2NhdGlvblVSSShzb2FwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgV1NETEVNRkFQSVRlc3QoIk1vZGVsU2VtYW50aWNUZXN0IikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RNb2RlbFNlbWFudGljKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICApOwotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1vZGVsU2VtYW50aWMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoUExVR0lOX0FCU09MVVRFX1BBVEggKyJzYW1wbGVzL0xvYWRTdG9yZUNvbXBhcmUvTG9hZEFuZFByaW50VGVzdC53c2RsIix0cnVlKTsKLSAgICAgIFdTRExFTUZBUElUZXN0IHRlc3QgPSBuZXcgV1NETEVNRkFQSVRlc3QoZGVmKTsKLSAgICAgIHRlc3QudmlzaXQoKTsgICAgICAKLSAgICAgIHNlcmlhbGl6ZSh0ZXN0Lm5ld0RlZmluaXRpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIEFzc2VydC5mYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgfSAgICAgCi0gIH0gCi0gIAotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKERlZmluaXRpb24gZGVmKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUmVzb3VyY2VJbXBsIHdzZGxNYWluUmVzb3VyY2UgPSAoV1NETFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLndzZGwiKSk7Ci0gICAgd3NkbE1haW5SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkZWYpOwotCi0gICAgSVdvcmtzcGFjZVJvb3QgbXlXb3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBJUHJvamVjdCBteVdlYlByb2plY3QgPSBteVdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCgib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMiKTsKLSAgICBpZiAoIW15V2ViUHJvamVjdC5leGlzdHMoKSkKLSAgICAgIG15V2ViUHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgCi0gICAgU3RyaW5nIGJhc2VEaXIgPSBteVdlYlByb2plY3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotICAgIAotICAgIERlZmluaXRpb25Mb2FkZXIuc3RvcmUoZGVmLGJhc2VEaXIgKyAiL0Nsb25lZExvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETEdlbmVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETEdlbmVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjVhNzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1dTRExHZW5lcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEJvZHlJbXBsOwotCi1wdWJsaWMgY2xhc3MgV1NETEdlbmVyYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHVibGljIFdTRExHZW5lcmF0aW9uVGVzdCgpCi0gIHsKLSAgICBpbml0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMR2VuZXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIAotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBXU0RMR2VuZXJhdGlvblRlc3QoIlNhbXBsZVdTRExHZW5lcmF0aW9uIikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RTYW1wbGVXU0RMR2VuZXJhdGlvbigpOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgKTsKLSAgICAKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RTYW1wbGVXU0RMR2VuZXJhdGlvbigpIAotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2VuZXJhdGVUZW1wZXJhdHVyZVNlcnZpY2UoIi4vVGVtcGVyYXR1cmVTZXJ2aWNlLndzZGwiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVRlbXBlcmF0dXJlU2VydmljZShTdHJpbmcgb3V0cHV0RmlsZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlRmlsZVVSSShvdXRwdXRGaWxlKSk7Ci0gICAgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQotICAgIC8vIENyZWF0ZSBhIERlZmluaXRpb24gLSBUZW1wZXJhdHVyZQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgZGVmaW5pdGlvbi5zZXRRTmFtZShuZXcgUU5hbWUoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkksIlRlbXBhcmF0dXJlIikpOwotICAgIHJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRlZmluaXRpb24pOwotICAgIAotICAgIC8vIFRhcmdldCBuYW1lc3BhY2UgLSBodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbQotICAgIGRlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKCJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbSIpOwotICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJ0bnMiLCAiaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20iKTsKLSAgICAKLSAgICAvLyBPdGhlciBuYW1lc3BhY2VzIC0gd3NkbCwgc29hcCwgeHNkCi0gICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoIndzZGwiLCBXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0gICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoInhzZCIsIFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgIGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpLnB1dCgic29hcCIsIFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJKTsKLQotICAgIC8vCi0gICAgLy8gTGV0J3Mgc3RhcnQgYnVpbGRpbmcgdHdvIG1lc3NhZ2VzCi0gICAgLy8KLSAgICAKLSAgICAvLyBDcmVhdGUgYSBQYXJ0IC0gWmlwQ29kZQotICAgIFBhcnQgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgcGFydC5zZXROYW1lKCJaaXBDb2RlIik7Ci0gICAgcGFydC5zZXRUeXBlTmFtZShuZXcgUU5hbWUoV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwic3RyaW5nIikpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2UgLSBHZXRUZW1wZXJhdHVyZUlucHV0Ci0gICAgTWVzc2FnZSBpbnB1dE1lc3NhZ2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIGlucHV0TWVzc2FnZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgIkdldFRlbXBhcmF0dXJlSW5wdXQiKSk7Ci0gICAgaW5wdXRNZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gICAgZGVmaW5pdGlvbi5hZGRNZXNzYWdlKGlucHV0TWVzc2FnZSk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgUGFydCAtIFRlbXBlcmF0dXJlCi0gICAgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgcGFydC5zZXROYW1lKCJUZW1wZXJhdHVyZSIpOwotICAgIHBhcnQuc2V0VHlwZU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsImZsb2F0IikpOwotCi0gICAgLy8gQ3JlYXRlIGEgTWVzc2FnZSAtIEdldFRlbXBlcmF0dXJlT3V0cHV0Ci0gICAgTWVzc2FnZSBvdXRwdXRNZXNzYWdlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBvdXRwdXRNZXNzYWdlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCAiR2V0VGVtcGFyYXR1cmVPdXRwdXQiKSk7Ci0gICAgb3V0cHV0TWVzc2FnZS5hZGRQYXJ0KHBhcnQpOwotICAgIGRlZmluaXRpb24uYWRkTWVzc2FnZShvdXRwdXRNZXNzYWdlKTsKLSAgICAKLSAgICAvLwotICAgIC8vIE5leHQsIGJ1aWxkIGEgUG9ydFR5cGUKLSAgICAvLwotICAgIAotICAgIC8vIENyZWF0ZSBhbiBJbnB1dCAtIEdldFRlbXBlcmF0dXJlSW5wdXQKLSAgICBJbnB1dCBpbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgIGlucHV0LnNldE1lc3NhZ2UoaW5wdXRNZXNzYWdlKTsKLQotICAgIC8vIENyZWF0ZSBhbiBPdXRwdXQgLSBHZXRUZW1wZXJhdHVyZU91dHB1dAotICAgIE91dHB1dCBvdXRwdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgb3V0cHV0LnNldE1lc3NhZ2Uob3V0cHV0TWVzc2FnZSk7Ci0gICAKLSAgICAvLyBDcmVhdGUgYW4gT3BlcmF0aW9uIC0gR2V0VGVtcGVyYXR1cmVGb3JaaXBDb2RlCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcGVyYXRpb24oKTsKLSAgICBvcGVyYXRpb24uc2V0TmFtZSgiR2V0VGVtcGVyYXR1cmVGb3JaaXBDb2RlIik7Ci0gICAgb3BlcmF0aW9uLnNldElucHV0KGlucHV0KTsKLSAgICBvcGVyYXRpb24uc2V0T3V0cHV0KG91dHB1dCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgUG9ydFR5cGUKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIHBvcnRUeXBlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCJHZXRUZW1wYXJhdHVyZUluZm9TT0FQIikpOwotICAgIHBvcnRUeXBlLmFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgIAotICAgIC8vCi0gICAgLy8gTm93LCBsZXQncyB3b3JrIG9uIEJpbmRpbmcKLSAgICAvLwotICAgIAotICAgIC8vIENyZWF0ZSBhIEJpbmRpbmcgLSBHZXRUZW1wZXJhdHVyZUluZm9TT0FQCi0gICAgQmluZGluZyBiaW5kaW5nID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICBiaW5kaW5nLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCAiR2V0VGVtcGFyYXR1cmVJbmZvU09BUCIpKTsKLSAgICBiaW5kaW5nLnNldFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICBkZWZpbml0aW9uLmFkZEJpbmRpbmcoYmluZGluZyk7Ci0KLSAgICAvLyBDcmVhdGUgYSBTT0FQIEJpbmRpbmcKLSAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQmluZGluZygpOwotICAgIHNvYXBCaW5kaW5nLnNldFN0eWxlKCJycGMiKTsKLSAgICBzb2FwQmluZGluZy5zZXRUcmFuc3BvcnRVUkkoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIpOwotICAgIGJpbmRpbmcuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJpbmRpbmcpOwotCi0gICAgLy8gQ3JlYXRlIGEgQmluZGluZyBPcGVyYXRpb24KLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0TmFtZSgiR2V0VGVtcGVyYXR1cmVGb3JaaXBDb2RlIik7Ci0gICAgYmluZGluZy5hZGRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotCi0gICAgLy8gQ3JlYXRlIGEgU09BUCBPcGVyYXRpb24KLSAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUE9wZXJhdGlvbigpOwotICAgIHNvYXBPcGVyYXRpb24uc2V0U29hcEFjdGlvblVSSSgiaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20vR2V0VGVtcGVyYXR1cmVGb3JaaXBDb2RlIik7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwT3BlcmF0aW9uKTsgICAgCi0KLSAgICAvLyBDcmVhdGUgYSBTT0FQIEJvZHkKLSAgICBTT0FQQm9keSBzb2FwQm9keSA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQm9keSgpOwotICAgIHNvYXBCb2R5LnNldFVzZSgiZW5jb2RlZCIpOwotICAgIHNvYXBCb2R5LmdldEVuY29kaW5nU3R5bGVzKCkuYWRkKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgIHNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSSgiaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20vIik7Ci0gICAgCi0gICAgLy8gQWRkIGEgcGFydCAoVGVtcGVyYXR1cmUpIHRvIHRoZSBTT0FQIGJvZHkgKEJ1Z3ppbGxhIDEwODE3NikKLSAgICBqYXZhLnV0aWwuVmVjdG9yIHYgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgIHYuYWRkKHBhcnQpOwotICAgIHNvYXBCb2R5LnNldFBhcnRzKHYpOwotICAgICgoU09BUEJvZHlJbXBsKXNvYXBCb2R5KS51cGRhdGVFbGVtZW50KCk7Ci0KLSAgICAvLyBDcmVhdGUgYSBCaW5kaW5nIElucHV0Ci0gICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBiaW5kaW5nSW5wdXQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJvZHkpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KGJpbmRpbmdJbnB1dCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgU09BUCBCb2R5Ci0gICAgc29hcEJvZHkgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEJvZHkoKTsKLSAgICBzb2FwQm9keS5zZXRVc2UoImVuY29kZWQiKTsKLSAgICBzb2FwQm9keS5nZXRFbmNvZGluZ1N0eWxlcygpLmFkZCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICBzb2FwQm9keS5zZXROYW1lc3BhY2VVUkkoImh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tLyIpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIEJpbmRpbmcgT3V0cHV0Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3VwdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ091dHB1dCgpOwotICAgIGJpbmRpbmdPdXB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQm9keSk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nT3V0cHV0KGJpbmRpbmdPdXB1dCk7Ci0gICAgCi0gICAgLy8KLSAgICAvLyBGaW5hbGx5LCB3ZSBhcmUgYnVpbGRpbmcgYSBTZXJ2aWNlCi0gICAgLy8KLQotICAgIC8vIENyZWF0ZSBhIFNPQVAgQWRkcmVzcwotICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBBZGRyZXNzKCk7Ci0gICAgc29hcEFkZHJlc3Muc2V0TG9jYXRpb25VUkkoImh0dHA6Ly90b2RvLXNvbWUtYWRkcmVzcy8iKTsKLQotICAgIC8vIENyZWF0ZSBhIFBvcnQgLSBHZXRUZW1wZXJhdHVyZUluZm9TT0FQCi0gICAgUG9ydCBwb3J0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnQoKTsKLSAgICBwb3J0LnNldE5hbWUoIkdldFRlbXBlcmF0dXJlSW5mb1NPQVAiKTsKLSAgICBwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgcG9ydC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQWRkcmVzcyk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgU2VydmljZSAtIFRlbXBlcmF0dXJlU2VydmljZQotICAgIFNlcnZpY2Ugc2VydmljZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgc2VydmljZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwiVGVtcGVyYXR1cmVTZXJ2aWNlIikpOwotICAgIHNlcnZpY2UuYWRkUG9ydChwb3J0KTsKLSAgICBkZWZpbml0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgCi0gICAgLy8KLSAgICAvLyBQaGV3LCB3ZSBhcmUgZG9uZS4gTGV0J3Mgc2VyaWFsaXplIGl0LgotICAgIC8vCi0gICAgCi0gICAgcmVzb3VyY2Uuc2F2ZShudWxsKTsKLSAKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0KCkKLSAgewotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiNWY0Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETFRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdTRExUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdTRExUZXN0c1BsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkgIHByaXZhdGUgc3RhdGljIEJ1bmRsZSBwbHVnaW5CdW5kbGUgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1NETFRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW5CdW5kbGUgPSBjb250ZXh0LmdldEJ1bmRsZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJcGx1Z2luQnVuZGxlID0gY29udGV4dC5nZXRCdW5kbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0RMVGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFdTRExUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMuV1NETFRlc3RzUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQkKLSAgLyoqCi0gICAqIEdldCB0aGUgaW5zdGFsbCBVUkwgb2YgdGhpcyBwbHVnaW4uCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIHVybCBvZiB0aGlzIHBsdWdpbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5zdGFsbFVSTCgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShwbHVnaW5CdW5kbGUuZ2V0RW50cnkoIi8iKSkuZ2V0RmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9EZWZpbml0aW9uTG9hZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9EZWZpbml0aW9uTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYmVkNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvbkxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVmaW5pdGlvbkxvYWRlcgotewotICB7Ci0gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHBsdWdpbi54bWwKLSAgICAvLwotICAgIC8vICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5lbWYuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgLy8gICAgIDxwYXJzZXIgdHlwZT0id3NkbCIgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIvPgotICAgIC8vICAgPC9leHRlbnNpb24+Ci0gICAgLy8KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBvbmx5LgotICAgKi8KLSAgcHJpdmF0ZSBEZWZpbml0aW9uTG9hZGVyKCkKLSAgewotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBEZWZpbml0aW9uIGxvYWQoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBsb2FkKGZpbGVuYW1lLGZhbHNlKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgRGVmaW5pdGlvbiBsb2FkKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiB1c2VFeHRlbnNpb25GYWN0b3JpZXMpICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBsb2FkKGZpbGVuYW1lLCB1c2VFeHRlbnNpb25GYWN0b3JpZXMsIGZhbHNlKTsKLSAgfQotICAgICAgCi0gIHN0YXRpYyBwdWJsaWMgRGVmaW5pdGlvbiBsb2FkKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiB1c2VFeHRlbnNpb25GYWN0b3JpZXMsIGJvb2xlYW4gdHJhY2tMb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBmaWxlbmFtZSBpcyBhbiBhYnNvbHV0ZSBwYXRoCi0KLSAgICBVUkkgdXJpID0gbnVsbDsKLSAgICB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShmaWxlbmFtZSk7Ci0gIAotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFdTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgCi0gICAgV1NETFJlc291cmNlSW1wbCB3c2RsTWFpblJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi53c2RsIikpOwotICAgIHdzZGxNYWluUmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0gICAgamF2YS51dGlsLk1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgbWFwLnB1dChXU0RMUmVzb3VyY2VJbXBsLkNPTlRJTlVFX09OX0xPQURfRVJST1IsQm9vbGVhbi52YWx1ZU9mKHRydWUpKTsKLSAgICBtYXAucHV0KFdTRExSZXNvdXJjZUltcGwuVVNFX0VYVEVOU0lPTl9GQUNUT1JJRVMsQm9vbGVhbi52YWx1ZU9mKHVzZUV4dGVuc2lvbkZhY3RvcmllcykpOwotICAgIG1hcC5wdXQoV1NETFJlc291cmNlSW1wbC5UUkFDS19MT0NBVElPTixCb29sZWFuLnZhbHVlT2YodHJhY2tMb2NhdGlvbikpOwotICAgIHdzZGxNYWluUmVzb3VyY2UubG9hZChtYXApOwotICAKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgcmVzb3VyY2VzID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgcmVzb3VyY2VzLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCByZXNvdXJjZSA9IHJlc291cmNlcy5uZXh0KCk7Ci0gICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKQotICAgICAgewotICAgICAgICBXU0RMUmVzb3VyY2VJbXBsIHdzZGxSZXNvdXJjZSA9IChXU0RMUmVzb3VyY2VJbXBsKXJlc291cmNlOwotICAgICAgICBkZWZpbml0aW9uID0gd3NkbFJlc291cmNlLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGRlZmluaXRpb247Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyB2b2lkIHN0b3JlKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIGZpbGVuYW1lIGlzIGFuIGFic29sdXRlIHBhdGgKLQkgIAotICAgIFJlc291cmNlIHJlc291cmNlID0gZGVmaW5pdGlvbi5lUmVzb3VyY2UoKTsKLSAgICByZXNvdXJjZS5zZXRVUkkoVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZW5hbWUpKTsKLSAgICByZXNvdXJjZS5zYXZlKG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9EZWZpbml0aW9uVmlzaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvblZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxMzlhNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9EZWZpbml0aW9uVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZpbml0aW9uVmlzaXRvciBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIAotICAvKioKLSAgICogVXNlIERlZmluaXRpb25WaXNpdG9yKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICovCi0gIHByaXZhdGUgRGVmaW5pdGlvblZpc2l0b3IoKQotICB7Ci0gIH0KLSAgCi0gIC8vIEFkZGVkIGZvciBKVW5pdAotICBwdWJsaWMgRGVmaW5pdGlvblZpc2l0b3IoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb25WaXNpdG9yKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIH0KLQotICAvLyBtYWluIGVudHJ5Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KCkKLSAgewotICAgIHZpc2l0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWYuZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEltcG9ydCgoSW1wb3J0KWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgVHlwZXMgdHlwZXMgPSBkZWYuZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICB2aXNpdFR5cGVzKHR5cGVzKTsKLQotICAgIGl0ZXJhdG9yID0gZGVmLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0TWVzc2FnZSgoTWVzc2FnZSlpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gZGVmLmdldEVQb3J0VHlwZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFBvcnRUeXBlKChQb3J0VHlwZSlpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRCaW5kaW5nKChCaW5kaW5nKWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0RVNlcnZpY2VzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRTZXJ2aWNlKChTZXJ2aWNlKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChkZWYsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgfQotICAKLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRJbXBvcnQoSW1wb3J0IHdzZGxJbXBvcnQpOwotICAKLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcyk7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFBhcnQoKFBhcnQpaXRlcmF0b3IubmV4dCgpKTsgCi0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KTsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRPcGVyYXRpb24oKE9wZXJhdGlvbilpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgdmlzaXRJbnB1dCgoSW5wdXQpaW5wdXQpOyAgCi0gICAgCi0gICAgT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgdmlzaXRPdXRwdXQoKE91dHB1dClvdXRwdXQpOyAKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRGYXVsdCgoRmF1bHQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KTsKLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpOwotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGJpbmRpbmcuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoYmluZGluZywoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgQmluZGluZ0lucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKTsKLSAgICB2aXNpdEJpbmRpbmdJbnB1dCgoQmluZGluZ0lucHV0KWlucHV0KTsgIAotICAgIAotICAgIEJpbmRpbmdPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgdmlzaXRCaW5kaW5nT3V0cHV0KChCaW5kaW5nT3V0cHV0KW91dHB1dCk7IAotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRCaW5kaW5nRmF1bHQoKEJpbmRpbmdGYXVsdClpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gb3BlcmF0aW9uLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KG9wZXJhdGlvbiwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLQotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBpbnB1dCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5wdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoaW5wdXQsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG91dHB1dCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3V0cHV0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KG91dHB1dCwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBmYXVsdC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChmYXVsdCwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRQb3J0KChQb3J0KWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoc2VydmljZSwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChwb3J0LChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgIChFeHRlbnNpYmxlRWxlbWVudCBvd25lciwKLSAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMNEpEZWZpbml0aW9uVmlzaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETDRKRGVmaW5pdGlvblZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3ZmEyZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMNEpEZWZpbml0aW9uVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTREw0SkRlZmluaXRpb25WaXNpdG9yIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgCi0gIC8qKgotICAgKiBVc2UgRGVmaW5pdGlvblZpc2l0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgKi8KLSAgcHJpdmF0ZSBXU0RMNEpEZWZpbml0aW9uVmlzaXRvcigpCi0gIHsKLSAgfQotICAKLSAgLy8gQWRkZWQgZm9yIEpVbml0Ci0gIHB1YmxpYyBXU0RMNEpEZWZpbml0aW9uVmlzaXRvcihTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgV1NETDRKRGVmaW5pdGlvblZpc2l0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8vIG1haW4gZW50cnkKLSAgcHVibGljIHZvaWQgdmlzaXQoKQotICB7Ci0gICAgdmlzaXREZWZpbml0aW9uKGRlZmluaXRpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBqYXZhLnV0aWwuTWFwIGltcG9ydHMgPSBkZWYuZ2V0SW1wb3J0cygpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW1wb3J0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIEltcG9ydCBteUltcG9ydCA9IG51bGw7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBteUltcG9ydCA9IChJbXBvcnQpKChqYXZhLnV0aWwuQXJyYXlMaXN0KWltcG9ydHMuZ2V0KGl0ZXJhdG9yLm5leHQoKSkpLmdldCgwKTsKLSAgICAgIHZpc2l0SW1wb3J0KG15SW1wb3J0KTsKLSAgICB9Ci0gICAgCi0gICAgVHlwZXMgdHlwZXMgPSBkZWYuZ2V0VHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgIHZpc2l0VHlwZXModHlwZXMpOwotCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0TWVzc2FnZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdE1lc3NhZ2UoKE1lc3NhZ2UpaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBpdGVyYXRvciA9IGRlZi5nZXRQb3J0VHlwZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFBvcnRUeXBlKChQb3J0VHlwZSlpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0QmluZGluZ3MoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEJpbmRpbmcoKEJpbmRpbmcpaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBpdGVyYXRvciA9IGRlZi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0U2VydmljZSgoU2VydmljZSlpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLQotICB9Ci0gIAotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCk7Ci0gIAotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdFR5cGVzKFR5cGVzIHR5cGVzKTsKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXNzYWdlLmdldFBhcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRQYXJ0KChQYXJ0KWl0ZXJhdG9yLm5leHQoKSk7IAotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCk7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRPcGVyYXRpb24oKE9wZXJhdGlvbilpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0SW5wdXQoKTsKLSAgICB2aXNpdElucHV0KChJbnB1dClpbnB1dCk7ICAKLSAgICAKLSAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldE91dHB1dCgpOwotICAgIHZpc2l0T3V0cHV0KChPdXRwdXQpb3V0cHV0KTsgCi0KLSAgICBqYXZhLnV0aWwuTWFwIGZhdWx0cyA9IG9wZXJhdGlvbi5nZXRGYXVsdHMoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZhdWx0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIEZhdWx0IGZhdWx0ID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGZhdWx0ID0gKEZhdWx0KWZhdWx0cy5nZXQoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgIHZpc2l0RmF1bHQoZmF1bHQpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KTsKLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpOwotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEJpbmRpbmdPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpKTsKLQotICAgIGl0ZXJhdG9yID0gYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgdmlzaXRCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dClpbnB1dCk7ICAKLSAgICAKLSAgICBCaW5kaW5nT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gICAgdmlzaXRCaW5kaW5nT3V0cHV0KChCaW5kaW5nT3V0cHV0KW91dHB1dCk7IAotIAotICAgIGphdmEudXRpbC5NYXAgYmluZGluZ0ZhdWx0cyA9IG9wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRzKCk7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBiaW5kaW5nRmF1bHRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IG51bGw7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KWJpbmRpbmdGYXVsdHMuZ2V0KGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICB2aXNpdEJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgIH0KLSAgICAKLSAgICBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotCi0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG91dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZhdWx0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRQb3J0KChQb3J0KWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTRExDb252ZXJ0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTRExDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0NzI1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgV1NETENvbnZlcnRlciBleHRlbmRzIERlZmluaXRpb25WaXNpdG9yCi17Ci0gIHByaXZhdGUgRG9jdW1lbnQgZG9jOwotICBwcml2YXRlIEVsZW1lbnQgZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50VHlwZXM7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50U2VydmljZTsKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRFbmRwb2ludDsKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRJbnRlcmZhY2U7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50T3BlcmF0aW9uOwotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRCaW5kaW5nOwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEJpbmRpbmdPcGVyYXRpb247Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50QmluZGluZ0lucHV0OwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEJpbmRpbmdPdXRwdXQ7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50QmluZGluZ0ZhdWx0OwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbE5hbWVzcGFjZVByZWZpeDsKLSAgcHJpdmF0ZSBTdHJpbmcgeHNkTmFtZXNwYWNlUHJlZml4OwotICAKLSAgewotICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBwbHVnaW4ueG1sCi0gICAgLy8KLSAgICAvLyAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2UuZW1mLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIC8vICAgICA8cGFyc2VyIHR5cGU9IndzZGwiIGNsYXNzPSJjb20uaWJtLmV0b29scy53c2RsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGwiLz4KLSAgICAvLyAgIDwvZXh0ZW5zaW9uPgotICAgIC8vCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotICAKLSAgLy8gQWRkZWQgZm9yIEpVbml0Ci0gIHB1YmxpYyBXU0RMQ29udmVydGVyKFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGRlZmluaXRpb24KLSAgICovCi0gIHB1YmxpYyBXU0RMQ29udmVydGVyKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGRlZmluaXRpb24pOwotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGUyMChTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGNyZWF0ZURvY3VtZW50KCk7Ci0gICAgdmlzaXQoKTsKLSAgICBzZXJpYWxpemUoZmlsZW5hbWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsInllcyIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIlVURi04Iik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwiNCIpOwotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShkb21Tb3VyY2UsbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIGRvYyA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotICB9Ci0gIAotICBwcml2YXRlIEVsZW1lbnQgY3JlYXRlV1NETEVsZW1lbnQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwiLG5hbWUpOwotICAgIGlmICh3c2RsTmFtZXNwYWNlUHJlZml4ICE9IG51bGwpCi0gICAgICBlbGVtZW50LnNldFByZWZpeCh3c2RsTmFtZXNwYWNlUHJlZml4KTsKLSAgICAKLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEb2N1bWVudGF0aW9uKEVsZW1lbnQgZG9jRWxlbWVudCwgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBpZiAoZG9jRWxlbWVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgRWxlbWVudCBhZG9wdGVkRG9jRWxlbWVudCA9IChFbGVtZW50KWRvYy5pbXBvcnROb2RlKGRvY0VsZW1lbnQsdHJ1ZSk7Ci0gICAgcGFyZW50LmFwcGVuZENoaWxkKGFkb3B0ZWREb2NFbGVtZW50KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgZGVzY3JpcHRpb24gPSBjcmVhdGVXU0RMRWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxkZXNjcmlwdGlvbik7Ci0gICAgCi0gICAgLy8gVEJEIC0gRGV0ZXJtaW5lIGxhdGVyIGlmIHdlIHdhbnQgdG8gY29udmVydCB0aGUgZG9jdW1lbnQgdG8gdXNlIFNPQVAgMS4yLgotICAgIC8vIEhvd2V2ZXIgYWRkaW5nIHRoZXNlIHR3byBuYW1lc3BhY2VzIG1heSBub3QgYmUgaGFybWZ1bC4KLSAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInhtbG5zOnNvYXBlbnYiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcCIpOwotICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6d3NvYXAiLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3NvYXAxMiIpOwotCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGRlZi5nZXROYW1lc3BhY2VzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAvKgotCXhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotCQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiovCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIAotICAgICAgaWYgKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAJaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSAvLyBtZWFudCB0byBiZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgCSAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbCIpOwotICAgICAgCWVsc2UKLSAgICAgIAl7Ci0gICAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwiKTsKLSAgICAgICAgICB3c2RsTmFtZXNwYWNlUHJlZml4ID0gcHJlZml4OwotICAgICAgICAgIGRlc2NyaXB0aW9uLnNldFByZWZpeCh3c2RsTmFtZXNwYWNlUHJlZml4KTsKLSAgICAgIAl9Ci0gICAgICAJY29udGludWU7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIFNPQVAgMS4yCi0gICAgICBpZiAoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgCS8vIFNPQVAgMS4yCi0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3AiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgMi4wIGJpbmRpbmcgZm9yIFNPQVAgMS4yCi0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6d3NvYXAiLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3NvYXAxMiIpOwotICAgICAgCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgCi0gICAgICAvL2lmICgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgLy8gIGNvbnRpbnVlOwotICAgICAgCi0gICAgICBpZiAoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgeHNkTmFtZXNwYWNlUHJlZml4ID0gcHJlZml4OyAvLyBXZSB3aWxsIHVzZSB0aGlzIGluIHZpc2l0SW1wb3J0KCkuCi0gICAgICAKLSAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkgLy8gbWVhbnQgdG8gYmUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxucyIgKyBwcmVmaXgsbmFtZXNwYWNlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIAotICAgIGRvYy5hcHBlbmRDaGlsZChkZXNjcmlwdGlvbik7Ci0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gICAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0SW1wb3J0KG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB3c2RsSW1wb3J0KQotICB7Ci0gICAgLy8gRGV0ZXJtaW5lIGlmIHdlIDxpbXBvcnQ+IGEgc2NoZW1hLgotICAgIGlmIChpbXBvcnRpbmdTY2hlbWEod3NkbEltcG9ydCkpCi0gICAgewotICAgICAgY3VycmVudFR5cGVzID0gY3JlYXRlV1NETEVsZW1lbnQoInR5cGVzIik7Ci0gICAgICBkZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChjdXJyZW50VHlwZXMpOwotICAgICAgCi0gICAgICAvLyAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9mb28uY29tIiBzY2hlbWFMb2NhdGlvbj0gImJhci54c2QiLz4KLSAgICAgIEVsZW1lbnQgc2NoZW1hSW1wb3J0ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCJpbXBvcnQiKTsKLSAgICAgIGlmICh4c2ROYW1lc3BhY2VQcmVmaXggPT0gbnVsbCkgLy8gbmVlZCB0byBhZGQgb25lCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6eHMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICB4c2ROYW1lc3BhY2VQcmVmaXggPSAieHMiOwotICAgICAgICBzY2hlbWFJbXBvcnQuc2V0UHJlZml4KHhzZE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghIiIuZXF1YWxzKHhzZE5hbWVzcGFjZVByZWZpeCkpIC8vIGl0IGlzIG5vdCBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgCXNjaGVtYUltcG9ydC5zZXRQcmVmaXgoeHNkTmFtZXNwYWNlUHJlZml4KTsKLSAgICAgIAotICAgICAgc2NoZW1hSW1wb3J0LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIix3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIHNjaGVtYUltcG9ydC5zZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIix3c2RsSW1wb3J0LmdldExvY2F0aW9uVVJJKCkpOwotICAgICAgcHJvY2Vzc0RvY3VtZW50YXRpb24od3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLHNjaGVtYUltcG9ydCk7Ci0gICAgICBjdXJyZW50VHlwZXMuYXBwZW5kQ2hpbGQoc2NoZW1hSW1wb3J0KTsKLSAgICB9Ci0gIAllbHNlCi0gICAgewotICAgICAgRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gd3NkbEltcG9ydC5nZXRFbGVtZW50KCk7Ci0gICAgICBFbGVtZW50IGFkb3B0ZWRJbXBvcnRFbGVtZW50ID0gKEVsZW1lbnQpZG9jLmltcG9ydE5vZGUoaW1wb3J0RWxlbWVudCx0cnVlKTsKLSAgICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHdzZGxJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxhZG9wdGVkSW1wb3J0RWxlbWVudCk7Ci0gICAgICBkZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChhZG9wdGVkSW1wb3J0RWxlbWVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaW1wb3J0aW5nU2NoZW1hKEltcG9ydCBteUltcG9ydCkKLSAgewotICAgIGlmIChteUltcG9ydC5nZXREZWZpbml0aW9uKCkgIT0gbnVsbCkgLy8gaXQgaXMgV1NETCBpbXBvcnQKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0VHlwZXMob3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFR5cGVzKFR5cGVzIHR5cGVzKQotICB7Ci0gIAkvLyBjdXJyZW50VHlwZXMgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGluIHZpc2l0SW1wb3J0KCkuCi0gICAgaWYgKGN1cnJlbnRUeXBlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRUeXBlcyA9IGNyZWF0ZVdTRExFbGVtZW50KCJ0eXBlcyIpOwotICAgICAgcHJvY2Vzc0RvY3VtZW50YXRpb24odHlwZXMuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50VHlwZXMpOwotICAgICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudFR5cGVzKTsKLSAgICB9Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gbnVsbDsKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgIEVsZW1lbnQgYWRvcHRlZFNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBzY2hlbWEudXBkYXRlRWxlbWVudCgpOwotICAgICAgc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICBhZG9wdGVkU2NoZW1hRWxlbWVudCA9IChFbGVtZW50KWRvYy5pbXBvcnROb2RlKHNjaGVtYUVsZW1lbnQsdHJ1ZSk7Ci0gICAgICBjdXJyZW50VHlwZXMuYXBwZW5kQ2hpbGQoYWRvcHRlZFNjaGVtYUVsZW1lbnQpOwotICAgIH0gICAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFBhcnQob3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UGFydChQYXJ0IHBhcnQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgY3VycmVudEludGVyZmFjZSA9IGNyZWF0ZVdTRExFbGVtZW50KCJpbnRlcmZhY2UiKTsKLSAgCXByb2Nlc3NEb2N1bWVudGF0aW9uKHBvcnRUeXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEludGVyZmFjZSk7Ci0gIAkKLSAgICBFbGVtZW50IHBvcnRUeXBlRWxlbWVudCA9IHBvcnRUeXBlLmdldEVsZW1lbnQoKTsKLSAgICBpZiAocG9ydFR5cGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibmFtZSIpKQotICAgICAgY3VycmVudEludGVyZmFjZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLHBvcnRUeXBlRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgCi0gICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEludGVyZmFjZSk7Ci0gICAgc3VwZXIudmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBjdXJyZW50T3BlcmF0aW9uID0gY3JlYXRlV1NETEVsZW1lbnQoIm9wZXJhdGlvbiIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRPcGVyYXRpb24pOwotCQotICAgIEVsZW1lbnQgb3BlcmF0aW9uRWxlbWVudCA9IG9wZXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKG9wZXJhdGlvbkVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50T3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgibmFtZSIsb3BlcmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0KLSAgICBPcGVyYXRpb25UeXBlIG9wVHlwZSA9IG9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgIGlmIChPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgY3VycmVudE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoInBhdHRlcm4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwvaW4tb3V0Iik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFID09IG9wVHlwZSkKLSAgICAgICAgY3VycmVudE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoInBhdHRlcm4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwvb3V0LWluIik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04gPT0gb3BUeXBlKQotICAgICAgICBjdXJyZW50T3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgicGF0dGVybiIsImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDMvd3NkbC9vdXQtb25seSIpOwotICAgIGVsc2UgaWYgKE9wZXJhdGlvblR5cGUuT05FX1dBWSA9PSBvcFR5cGUpCi0gICAgICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0QXR0cmlidXRlKCJwYXR0ZXJuIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wMy93c2RsL2luLW9ubHkiKTsKLSAgICAKLSAgICBjdXJyZW50SW50ZXJmYWNlLmFwcGVuZENoaWxkKGN1cnJlbnRPcGVyYXRpb24pOwotICAgIHN1cGVyLnZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0SW5wdXQob3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KQotICB7Ci0gICAgRWxlbWVudCBjdXJyZW50SW5wdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgiaW5wdXQiKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRJbnB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBpbnB1dC5nZXRFbGVtZW50KCk7Ci0gICAgCi0gICAgaWYgKGlucHV0RWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRJbnB1dC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2VMYWJlbCIsaW5wdXRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICAKLSAgICBFbGVtZW50IHBhcnRFbGVtZW50ID0gZ2V0UGFydEVsZW1lbnQoaW5wdXQpOwotICAgIGlmIChwYXJ0RWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIGN1cnJlbnRJbnB1dC5zZXRBdHRyaWJ1dGUoImVsZW1lbnQiLHBhcnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpKTsKLSAgICAvLyBUQkQgLSB3aGF0IGlmIHRoZSBwYXJ0IHVzZXMgInR5cGUiPwotICAgIAotICAgIGN1cnJlbnRPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudElucHV0KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGdldFBhcnRFbGVtZW50KE1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZikKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gVEJEIC0gZm9yIG5vdywgdGFrZSB0aGUgZmlyc3QgcGFydC4KLSAgICBQYXJ0IHBhcnQgPSAoUGFydClpdGVyYXRvci5uZXh0KCk7Ci0gICAgRWxlbWVudCBwYXJ0RWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudCgpOwotICAgIHJldHVybiBwYXJ0RWxlbWVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0T3V0cHV0KG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBFbGVtZW50IGN1cnJlbnRPdXRwdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgib3V0cHV0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudE91dHB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBvdXRwdXRFbGVtZW50ID0gb3V0cHV0LmdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBpZiAob3V0cHV0RWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRPdXRwdXQuc2V0QXR0cmlidXRlKCJtZXNzYWdlTGFiZWwiLG91dHB1dEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIAotICAgIEVsZW1lbnQgcGFydEVsZW1lbnQgPSBnZXRQYXJ0RWxlbWVudChvdXRwdXQpOwotICAgIGlmIChwYXJ0RWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIGN1cnJlbnRPdXRwdXQuc2V0QXR0cmlidXRlKCJlbGVtZW50IixwYXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImVsZW1lbnQiKSk7Ci0gICAgLy8gVEJEIC0gd2hhdCBpZiB0aGUgcGFydCB1c2VzICJ0eXBlIj8KLSAgICAKLSAgICBjdXJyZW50T3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRPdXRwdXQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRGYXVsdChvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0QmluZGluZyhvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nID0gY3JlYXRlV1NETEVsZW1lbnQoImJpbmRpbmciKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmcpOwotICAgIAotICAgIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBiaW5kaW5nLmdldEVsZW1lbnQoKTsKLSAgICBpZiAoYmluZGluZ0VsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50QmluZGluZy5zZXRBdHRyaWJ1dGUoIm5hbWUiLGJpbmRpbmdFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBpZiAoYmluZGluZ0VsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgICBjdXJyZW50QmluZGluZy5zZXRBdHRyaWJ1dGUoImludGVyZmFjZSIsYmluZGluZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpOwotICAgIAotICAgIC8vIFRCRCAtIGlzIHRoZSBuZXh0IGxpbmUgZml4ZWQgZm9yIFNPQVA/Ci0gICAgY3VycmVudEJpbmRpbmcuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL3NvYXAxMiIpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldEF0dHJpYnV0ZSgid3NvYXA6cHJvdG9jb2wiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUCIpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldEF0dHJpYnV0ZSgid3NvYXA6bWVwRGVmYXVsdCIsImh0dHA6Ly93d3cudzMub3JnLjIwMDMvMDUvc29hcC9tZXAvcmVxdWVzdC1yZXNwb25zZSIpOwotCi0gICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmcpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24gPSBjcmVhdGVXU0RMRWxlbWVudCgib3BlcmF0aW9uIik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdPcGVyYXRpb24pOwotICAgIAotICAgIEVsZW1lbnQgb3BlcmF0aW9uRWxlbWVudCA9IG9wZXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpLmdldE5hbWUoKTsKLSAKLSAgICAvLyBEZXRlcm1pbmUgcHJlZml4Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmIChkZWYgIT0gbnVsbCkKLSAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBwcmVmaXggPSBkZWYuZ2V0UHJlZml4KHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgCi0gICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgICAgcHJlZml4ID0gIiI7Ci0gICAgZWxzZQotICAgICAgcHJlZml4ICs9ICI6IjsKLSAgICAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgicmVmIixwcmVmaXggKyBvcGVyYXRpb25OYW1lKTsKLSAgICAKLSAgICBjdXJyZW50QmluZGluZy5hcHBlbmRDaGlsZChjdXJyZW50QmluZGluZ09wZXJhdGlvbik7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdJbnB1dCA9IGNyZWF0ZVdTRExFbGVtZW50KCJpbnB1dCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKGlucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdJbnB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBpbnB1dC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICBpZiAoaW5wdXROYW1lICE9IG51bGwpCi0gICAgICBpbnB1dEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIixpbnB1dE5hbWUpOwotICAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRCaW5kaW5nSW5wdXQpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdPdXRwdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgib3V0cHV0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdPdXRwdXQpOwotICAgIAotICAgIEVsZW1lbnQgb3V0cHV0RWxlbWVudCA9IG91dHB1dC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIG91dHB1dE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotICAgIGlmIChvdXRwdXROYW1lICE9IG51bGwpCi0gICAgICBvdXRwdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsb3V0cHV0TmFtZSk7Ci0gICAgCi0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmdPdXRwdXQpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBjdXJyZW50QmluZGluZ0ZhdWx0ID0gY3JlYXRlV1NETEVsZW1lbnQoImZhdWx0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24oZmF1bHQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50QmluZGluZ0ZhdWx0KTsKLSAgICAKLSAgICBFbGVtZW50IGZhdWx0RWxlbWVudCA9IGZhdWx0LmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotICAgIGlmIChmYXVsdE5hbWUgIT0gbnVsbCkKLSAgICAgIGZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGZhdWx0TmFtZSk7Ci0gICAgCi0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmdGYXVsdCk7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOyAKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgY3VycmVudFNlcnZpY2UgPSBjcmVhdGVXU0RMRWxlbWVudCgic2VydmljZSIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50U2VydmljZSk7Ci0gICAgCi0gICAgRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IHNlcnZpY2UuZ2V0RWxlbWVudCgpOwotICAgIGlmIChzZXJ2aWNlRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRTZXJ2aWNlLnNldEF0dHJpYnV0ZSgibmFtZSIsc2VydmljZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIAotICAgIGRlc2NyaXB0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRTZXJ2aWNlKTsKLSAgICBzdXBlci52aXNpdFNlcnZpY2Uoc2VydmljZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0UG9ydChvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIGN1cnJlbnRFbmRwb2ludCA9IGNyZWF0ZVdTRExFbGVtZW50KCJlbmRwb2ludCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50RW5kcG9pbnQpOwotICAgIAotICAgIEVsZW1lbnQgcG9ydEVsZW1lbnQgPSBwb3J0LmdldEVsZW1lbnQoKTsKLSAgICBpZiAocG9ydEVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50RW5kcG9pbnQuc2V0QXR0cmlidXRlKCJuYW1lIixwb3J0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgaWYgKHBvcnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiYmluZGluZyIpKQotICAgICAgY3VycmVudEVuZHBvaW50LnNldEF0dHJpYnV0ZSgiYmluZGluZyIscG9ydEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJiaW5kaW5nIikpOwotICAgIAotICAgIC8vIEFkZCBpbnRlcmZhY2UgdG8gY3VycmVudCBzZXJ2aWNlCi0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgIGlmIChiaW5kaW5nICE9IG51bGwpIC8vIGJpbmRpbmcgY291bGQgbm90IGJlIHJlc29sdmVkCi0gICAgewotICAgICAgRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IGJpbmRpbmcuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGJpbmRpbmdFbGVtZW50Lmhhc0F0dHJpYnV0ZSgidHlwZSIpKQotICAgICAgICBjdXJyZW50U2VydmljZS5zZXRBdHRyaWJ1dGUoImludGVyZmFjZSIsYmluZGluZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpOwotICAgIH0KLSAgIAotICAgIGN1cnJlbnRTZXJ2aWNlLmFwcGVuZENoaWxkKGN1cnJlbnRFbmRwb2ludCk7Ci0gICAgc3VwZXIudmlzaXRQb3J0KHBvcnQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIC8vIFRCRCAtIEl0IGlzIG5vdCBqdXN0IFNPQVAgYmluZGluZwotICAgIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuUG9ydEltcGwpCi0gICAgewotICAgICAgRWxlbWVudCBzb2FwRWxlbWVudCA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChzb2FwRWxlbWVudC5oYXNBdHRyaWJ1dGUoImxvY2F0aW9uIikpCi0gICAgICAgIGN1cnJlbnRFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImFkZHJlc3MiLHNvYXBFbGVtZW50LmdldEF0dHJpYnV0ZSgibG9jYXRpb24iKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBFbGVtZW50IGFkb3B0ZWRET01FbGVtZW50ID0gKEVsZW1lbnQpZG9jLmltcG9ydE5vZGUoZG9tRWxlbWVudCx0cnVlKTsKLSAgICAgIAotICAgICAgaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbCkKLSAgICAgICAgZGVzY3JpcHRpb24uaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGRlc2NyaXB0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGwpCi0gICAgICAgIGN1cnJlbnRTZXJ2aWNlLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50U2VydmljZS5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlBvcnRUeXBlSW1wbCkKLSAgICAgIAljdXJyZW50SW50ZXJmYWNlLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50SW50ZXJmYWNlLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuT3BlcmF0aW9uSW1wbCkKLSAgICAgIAljdXJyZW50T3BlcmF0aW9uLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50T3BlcmF0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0ltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmcuaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmdPcGVyYXRpb24uaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0lucHV0SW1wbCkKLSAgICAgIAljdXJyZW50QmluZGluZ0lucHV0Lmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZ0lucHV0LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ091dHB1dEltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmdPdXRwdXQuaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nT3V0cHV0LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCkKLSAgICAgIAljdXJyZW50QmluZGluZ0ZhdWx0Lmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZ0ZhdWx0LmdldEZpcnN0Q2hpbGQoKSk7Ci0KLSAgICB9Ci0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBXU0RMQ29udmVydGVyKCJDb252ZXJ0IikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RDb252ZXJ0KCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICApOwotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdENvbnZlcnQoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoImQ6L2VjbGlwc2UzMDEvZWNsaXBzZS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvUFRBVGltZURpc3RyaWJ1dGlvbi53c2RsIik7Ci0gICAgICBXU0RMQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBXU0RMQ29udmVydGVyKGRlZik7Ci0gICAgICBjb252ZXJ0ZXIuZ2VuZXJhdGUyMCgiZDovZWNsaXBzZTMwMS9lY2xpcHNlL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9QVEFUaW1lRGlzdHJpYnV0aW9uMjAud3NkbCIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIC8qCi0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoYXJnc1swXSk7Ci0gICAgICBXU0RMQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBXU0RMQ29udmVydGVyKGRlZik7Ci0gICAgICBjb252ZXJ0ZXIuZ2VuZXJhdGUyMCgidGVzdDIwLndzZGwiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfSovCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzViM2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExNb2RlbExvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgcHJvdGVjdGVkIEN1c3RvbVdTRExNb2RlbExvY2F0b3IgY3VzdG9tV1NETE1vZGVsTG9jYXRvciA9IG5ldyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yKCk7Ci0gIAotICBjbGFzcyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBXU0RMTW9kZWxMb2NhdG9yCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIHJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2UsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGN1c3RvbVdTRExNb2RlbExvY2F0b3I7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YTUxEaWZmLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YTUxEaWZmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwN2EzMzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvWE1MRGlmZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgWE1MRGlmZgotewotICBwcml2YXRlIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBESUZGX0VMRU1FTlRfTk9ERV9PTkxZID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBkaWZmKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIGRpZmYoZmlsZTEsZmlsZTIsZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBkaWZmKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyLCBib29sZWFuIGVsZW1lbnRPbmx5KSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRG9jdW1lbnQgZG9jMSA9IGdldERvY3VtZW50KGZpbGUxKTsKLSAgICBEb2N1bWVudCBkb2MyID0gZ2V0RG9jdW1lbnQoZmlsZTIpOwotICAJRElGRl9FTEVNRU5UX05PREVfT05MWSA9IGVsZW1lbnRPbmx5OwotICAgIHJldHVybiBkaWZmKGRvYzEsZG9jMik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGRpZmYoRG9jdW1lbnQgZG9jMSwgRG9jdW1lbnQgZG9jMikKLSAgewotICAgIEVsZW1lbnQgcm9vdDEgPSBkb2MxLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIEVsZW1lbnQgcm9vdDIgPSBkb2MyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIHJldHVybiBjb21wYXJlTm9kZXMocm9vdDEscm9vdDIpOwotICB9Ci0gIAotICBwcml2YXRlIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyB1cmkpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKHVyaSk7Ci0gICAgcmV0dXJuIGRvYzsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVOb2RlcyhOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKQotICB7Ci0gIAlpZiAoRElGRl9FTEVNRU5UX05PREVfT05MWSkKLSAgCXsKLSAgICAgIC8vIENvbXBhcmUgb25seSBlbGVtZW50IG5vZGVzIGluIHRoZSBjaGlsZHJlbi4KLSAgICAgIGZpbHRlck5vbkVsZW1lbnROb2Rlcyhub2RlMSk7Ci0gICAgICBmaWx0ZXJOb25FbGVtZW50Tm9kZXMobm9kZTIpOwotICAJfQotICAJCi0gICAgaWYgKG5vZGUxLmdldE5vZGVUeXBlKCkgIT0gbm9kZTIuZ2V0Tm9kZVR5cGUoKQotICAgICAgICB8fCBub2RlMS5nZXROb2RlTmFtZSgpICE9IG5vZGUyLmdldE5vZGVOYW1lKCkpCi0gICAgewotICAgICAgcHJpbnRsbigiTm9kZSB0eXBlIG9yIG5vZGUgbmFtZSBpcyBkaWZmZXJlbnQ6Iik7Ci0gICAgICBwcmludGxuKCJOb2RlIDE6ICIgKyBub2RlMS5nZXROb2RlTmFtZSgpKTsKLSAgICAgIHByaW50bG4oIk5vZGUgMjogIiArIG5vZGUyLmdldE5vZGVOYW1lKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWNvbXBhcmVBdHRyaWJ1dGVzKG5vZGUxLG5vZGUyKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBOb2RlTGlzdCBub2RlTGlzdDEgPSBub2RlMS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QyID0gbm9kZTIuZ2V0Q2hpbGROb2RlcygpOwotICAgIGlmIChub2RlTGlzdDEuZ2V0TGVuZ3RoKCkgIT0gbm9kZUxpc3QyLmdldExlbmd0aCgpKQotICAgIHsKLSAgICAgIHByaW50bG4oIlRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaXMgZGlmZmVyZW50OiIpOwotICAgICAgLy9wcmludGxuKCJOb2RlIDE6ICIgKyBub2RlTGlzdDEuZ2V0TGVuZ3RoKCkpOwotICAgICAgLy9wcmludGxuKCJOb2RlIDI6ICIgKyBub2RlTGlzdDIuZ2V0TGVuZ3RoKCkpOwotICAgICAgcHJpbnRsbigiTm9kZSAxOiAiICsgbm9kZTEuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICBwcmludGxuKCJOb2RlIDI6ICIgKyBub2RlMi5nZXROb2RlTmFtZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIGludCBsZW5ndGggPSBub2RlTGlzdDEuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGNvbXBhcmVOb2Rlcyhub2RlTGlzdDEuaXRlbShpKSxub2RlTGlzdDIuaXRlbShpKSk7Ci0gICAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgCXJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZmlsdGVyTm9uRWxlbWVudE5vZGVzKE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGUgZmlyc3RDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChmaXJzdENoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgewotICAgICAgbm9kZS5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTsKLSAgICAgIGZpcnN0Q2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICB9Ci0gICAgCi0gICAgTm9kZSBzaWJsaW5nID0gZmlyc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotICAgIE5vZGUgZGVsZXRlTWUgPSBudWxsOwotICAgIHdoaWxlIChzaWJsaW5nICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgIAlkZWxldGVNZSA9IHNpYmxpbmc7Ci0gICAgICAJc2libGluZyA9IHNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChkZWxldGVNZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlQXR0cmlidXRlcyhOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKQotICB7Ci0gICAgTmFtZWROb2RlTWFwIG5vZGVNYXAxID0gbm9kZTEuZ2V0QXR0cmlidXRlcygpOwotICAgIE5hbWVkTm9kZU1hcCBub2RlTWFwMiA9IG5vZGUyLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAKLSAgICBpZiAobm9kZU1hcDEgPT0gbnVsbCB8fCBub2RlTWFwMiA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmIChub2RlTWFwMSA9PSBudWxsICYmIG5vZGVNYXAyID09IG51bGwpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChub2RlTWFwMS5nZXRMZW5ndGgoKSAhPSBub2RlTWFwMi5nZXRMZW5ndGgoKSkKLSAgICB7Ci0gICAgCXByaW50bG4oIlRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBpcyBkaWZmZXJlbnQ6Iik7Ci0gICAgICAgIHByaW50bG4oIk5vZGUgMTogIiArIG5vZGUxLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBwcmludGxuKCJOb2RlIDI6ICIgKyBub2RlMi5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBOb2RlIGF0dHJOb2RlMSA9IG51bGw7Ci0gICAgTm9kZSBhdHRyTm9kZTIgPSBudWxsOwotICAgIGludCBsZW5ndGggPSBub2RlTWFwMS5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgYXR0ck5vZGUxID0gbm9kZU1hcDEuaXRlbShpKTsKLSAgICAgIGF0dHJOb2RlMiA9IG5vZGVNYXAyLmdldE5hbWVkSXRlbShhdHRyTm9kZTEuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICBpZiAoYXR0ck5vZGUyID09IG51bGwpCi0gICAgICB7Ci0gICAgCXByaW50bG4oIlRoZSBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kIGluIE5vZGUgMjogIiArIGF0dHJOb2RlMS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgcHJpbnRsbigiTm9kZSAxOiAiICsgbm9kZTEuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIHByaW50bG4oIk5vZGUgMjogIiArIG5vZGUyLmdldE5vZGVOYW1lKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghYXR0ck5vZGUxLmdldE5vZGVWYWx1ZSgpLmVxdWFscyhhdHRyTm9kZTIuZ2V0Tm9kZVZhbHVlKCkpKQotICAgICAgewotICAgIAlwcmludGxuKCJUaGUgYXR0cmlidXRlIHZhbHVlcyBhcmUgZGlmZmVyZW50OiIpOwotICAgICAgICBwcmludGxuKCJOb2RlIDE6ICIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIiwiICsgYXR0ck5vZGUxLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgcHJpbnRsbigiTm9kZSAyOiAiICsgbm9kZTIuZ2V0Tm9kZU5hbWUoKSArICIsIiArIGF0dHJOb2RlMi5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIAlyZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHByaW50KFN0cmluZyBzKQotICB7Ci0gICAgb3V0LnByaW50KHMpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcHJpbnRsbihTdHJpbmcgcykKLSAgewotICAgIG91dC5wcmludGxuKHMpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJiYTg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQzODdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcgotewotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVNjaGVtYUxvY2F0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7ICAgICAgCi0gICAgICByZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCBzY2hlbWFMb2NhdGlvblVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlN2VkOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iIC8+IC0tPgotCQkKLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JCi0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIiAvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0JPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLip4bWwiIC8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLQkJPHByb3BlcnR5IG5hbWU9IndzdC1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vd3N0X2ZvbGRlciIvPgotCQk8ZGVsZXRlIGRpcj0iJHt3c3QtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICAJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAJCTxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d3N0LWZvbGRlcn0iLz4KLSAgICAgIAkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIAkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLkFsbFRlc3RDYXNlcyIgLz4KLSAgIAkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0JPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCQk8IS0tPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiIC8+LS0+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0JPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotCTx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotCQk8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy4qeG1sIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIiAvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK